ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IGNjZDRmOWYuLmQwODgwMDggMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMjU5OCw2ICsyNTk4LDkgQEAKIFM6IFByYWd1ZSA4CiBTOiAxODIgMDAgQ3plY2ggUmVwdWJsaWMKIAorTjogUmljayBQYXluZQorRDogUkZDMjM4NSBTdXBwb3J0IGZvciBUQ1AKKwogTjogQmFyYWsgQS4gUGVhcmxtdXR0ZXIKIEU6IGJhcEBjcy51bm0uZWR1CiBXOiBodHRwOi8vd3d3LmNzLnVubS5lZHUvfmJhcC8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IDAyNDU3ZWMuLmYwOGNhOTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtMTA0LDggKzEwNCw2IEBACiAJLSByZXF1ZXN0X2Zpcm13YXJlKCkgaG90cGx1ZyBpbnRlcmZhY2UgaW5mby4KIGZsb3BweS50eHQKIAktIG5vdGVzIGFuZCBkcml2ZXIgb3B0aW9ucyBmb3IgdGhlIGZsb3BweSBkaXNrIGRyaXZlci4KLWZ0YXBlLnR4dAotCS0gbm90ZXMgYWJvdXQgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIuCiBoYXllcy1lc3AudHh0CiAJLSBpbmZvIG9uIHVzaW5nIHRoZSBIYXllcyBFU1Agc2VyaWFsIGRyaXZlci4KIGhpZ2h1aWQudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMgYi9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKaW5kZXggYWJlZTdmNS4uNzNhODYxNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCisrKyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwpAQCAtMjAxLDcgKzIwMSw3IEBACiAtLS0tCiB1ZGV2IGlzIGEgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGZvciBwb3B1bGF0aW5nIC9kZXYgZHluYW1pY2FsbHkgd2l0aAogb25seSBlbnRyaWVzIGZvciBkZXZpY2VzIGFjdHVhbGx5IHByZXNlbnQuICB1ZGV2IHJlcGxhY2VzIHRoZSBiYXNpYwotZnVuY3Rpb25hbGl0eSBvZiBkZXZmcywgd2hpbGUgYWxsb3dpbmcgcGVyc2lzdGFudCBkZXZpY2UgbmFtaW5nIGZvcgorZnVuY3Rpb25hbGl0eSBvZiBkZXZmcywgd2hpbGUgYWxsb3dpbmcgcGVyc2lzdGVudCBkZXZpY2UgbmFtaW5nIGZvcgogZGV2aWNlcy4KIAogRlVTRQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKaW5kZXggMmZmYjBkNi4uMDU0MzE2MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CkBAIC00ODksNyArNDg5LDcgQEAKIGZsYWdzIGNhbiBiZSBvcidkIHRvZ2V0aGVyIGFuZCBhcmUKIAogRE1BX01FTU9SWV9NQVAgLSByZXF1ZXN0IHRoYXQgdGhlIG1lbW9yeSByZXR1cm5lZCBmcm9tCi1kbWFfYWxsb2NfY29oZXJlbnQoKSBiZSBkaXJlY3RseSB3cml0ZWFibGUuCitkbWFfYWxsb2NfY29oZXJlbnQoKSBiZSBkaXJlY3RseSB3cml0YWJsZS4KIAogRE1BX01FTU9SWV9JTyAtIHJlcXVlc3QgdGhhdCB0aGUgbWVtb3J5IHJldHVybmVkIGZyb20KIGRtYV9hbGxvY19jb2hlcmVudCgpIGJlIGFkZHJlc3NhYmxlIHVzaW5nIHJlYWQvd3JpdGUvbWVtY3B5X3RvaW8gZXRjLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtSVNBLUxQQy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1JU0EtTFBDLnR4dAppbmRleCA3MDVmNmJlLi5lNzY3ODA1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1JU0EtTFBDLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1JU0EtTFBDLnR4dApAQCAtMTEwLDcgKzExMCw3IEBACiAKIE9uY2UgdGhlIERNQSB0cmFuc2ZlciBpcyBmaW5pc2hlZCAob3IgdGltZWQgb3V0KSB5b3Ugc2hvdWxkIGRpc2FibGUKIHRoZSBjaGFubmVsIGFnYWluLiBZb3Ugc2hvdWxkIGFsc28gY2hlY2sgZ2V0X2RtYV9yZXNpZHVlKCkgdG8gbWFrZQotc3VyZSB0aGF0IGFsbCBkYXRhIGhhcyBiZWVuIHRyYW5zZmVyZWQuCitzdXJlIHRoYXQgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nX3VzYl9kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nX3VzYl9kcml2ZXIudG1wbAppbmRleCAwN2NkMzRjLi5kNDE4OGQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZ191c2JfZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmdfdXNiX2RyaXZlci50bXBsCkBAIC0zNDUsOCArMzQ1LDcgQEAKICAgICAgICAgdXNiX2J1ZmZlcl9mcmVlIChkZXYtPnVkZXYsIGRldi0+YnVsa19vdXRfc2l6ZSwKICAgICAgICAgICAgIGRldi0+YnVsa19vdXRfYnVmZmVyLAogICAgICAgICAgICAgZGV2LT53cml0ZV91cmItPnRyYW5zZmVyX2RtYSk7Ci0gICAgaWYgKGRldi0+d3JpdGVfdXJiICE9IE5VTEwpCi0gICAgICAgIHVzYl9mcmVlX3VyYiAoZGV2LT53cml0ZV91cmIpOworICAgIHVzYl9mcmVlX3VyYiAoZGV2LT53cml0ZV91cmIpOwogICAgIGtmcmVlIChkZXYpOwogfQogICA8L3Byb2dyYW1saXN0aW5nPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0CmluZGV4IDVjMzQ5MTAuLmQzODkzODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQKQEAgLTIxOSw3ICsyMTksNyBAQAogTm90ZSB0aGF0IHRoZSBwcmUtYXNzaWduZWQgSU9BUElDIGRldi0+aXJxIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGRldmljZQogb3BlcmF0ZXMgaW4gUElOLUlSUSBhc3NlcnRpb24gbW9kZS4gSW4gTVNJLVggbW9kZSwgYW55IGF0dGVtcHQgYXQKIHVzaW5nIGRldi0+aXJxIGJ5IHRoZSBkZXZpY2UgZHJpdmVyIHRvIHJlcXVlc3QgZm9yIGludGVycnVwdCBzZXJ2aWNlCi1tYXkgcmVzdWx0IHVucHJlZGljdGFiZSBiZWhhdmlvci4KK21heSByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4KIAogRm9yIGVhY2ggTVNJLVggdmVjdG9yIGdyYW50ZWQsIGEgZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZwogb3RoZXIgZnVuY3Rpb25zIGxpa2UgcmVxdWVzdF9pcnEoKSwgZW5hYmxlX2lycSgpLCBldGMuIHRvIGVuYWJsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL3Rhc2tzdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLnR4dAppbmRleCA5MmViZjI5Li5mZjA2YjczIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLnR4dApAQCAtOTYsOSArOTYsOSBAQAogYSBwaWQvdGdpZCB3aWxsIGJlIGZvbGxvd2VkIGJ5IHNvbWUgc3RhdHMuCiAKIGIpIFRBU0tTVEFUU19UWVBFX1BJRC9UR0lEOiBhdHRyaWJ1dGUgd2hvc2UgcGF5bG9hZCBpcyB0aGUgcGlkL3RnaWQgd2hvc2Ugc3RhdHMKLWlzIGJlaW5nIHJldHVybmVkLgorYXJlIGJlaW5nIHJldHVybmVkLgogCi1jKSBUQVNLU1RBVFNfVFlQRV9TVEFUUzogYXR0cmlidXRlIHdpdGggYSBzdHJ1Y3QgdGFza3N0c2F0cyBhcyBwYXlsb2FkLiBUaGUKK2MpIFRBU0tTVEFUU19UWVBFX1NUQVRTOiBhdHRyaWJ1dGUgd2l0aCBhIHN0cnVjdCB0YXNrc3RhdHMgYXMgcGF5bG9hZC4gVGhlCiBzYW1lIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHBlci1waWQgYW5kIHBlci10Z2lkIHN0YXRzLgogCiAzLiBOZXcgbWVzc2FnZSBzZW50IGJ5IGtlcm5lbCB3aGVuZXZlciBhIHRhc2sgZXhpdHMuIFRoZSBwYXlsb2FkIGNvbnNpc3RzIG9mIGEKQEAgLTEyMiwxMiArMTIyLDEyIEBACiAKIEhvd2V2ZXIsIG1haW50YWluaW5nIHBlci1wcm9jZXNzLCBpbiBhZGRpdGlvbiB0byBwZXItdGFzayBzdGF0cywgd2l0aGluIHRoZQoga2VybmVsIGhhcyBzcGFjZSBhbmQgdGltZSBvdmVyaGVhZHMuIFRvIGFkZHJlc3MgdGhpcywgdGhlIHRhc2tzdGF0cyBjb2RlCi1hY2N1bWFsYXRlcyBlYWNoIGV4aXRpbmcgdGFzaydzIHN0YXRpc3RpY3MgaW50byBhIHByb2Nlc3Mtd2lkZSBkYXRhIHN0cnVjdHVyZS4KLVdoZW4gdGhlIGxhc3QgdGFzayBvZiBhIHByb2Nlc3MgZXhpdHMsIHRoZSBwcm9jZXNzIGxldmVsIGRhdGEgYWNjdW1hbGF0ZWQgYWxzbworYWNjdW11bGF0ZXMgZWFjaCBleGl0aW5nIHRhc2sncyBzdGF0aXN0aWNzIGludG8gYSBwcm9jZXNzLXdpZGUgZGF0YSBzdHJ1Y3R1cmUuCitXaGVuIHRoZSBsYXN0IHRhc2sgb2YgYSBwcm9jZXNzIGV4aXRzLCB0aGUgcHJvY2VzcyBsZXZlbCBkYXRhIGFjY3VtdWxhdGVkIGFsc28KIGdldHMgc2VudCB0byB1c2Vyc3BhY2UgKGFsb25nIHdpdGggdGhlIHBlci10YXNrIGRhdGEpLgogCiBXaGVuIGEgdXNlciBxdWVyaWVzIHRvIGdldCBwZXItdGdpZCBkYXRhLCB0aGUgc3VtIG9mIGFsbCBvdGhlciBsaXZlIHRocmVhZHMgaW4KLXRoZSBncm91cCBpcyBhZGRlZCB1cCBhbmQgYWRkZWQgdG8gdGhlIGFjY3VtYWxhdGVkIHRvdGFsIGZvciBwcmV2aW91c2x5IGV4aXRlZAordGhlIGdyb3VwIGlzIGFkZGVkIHVwIGFuZCBhZGRlZCB0byB0aGUgYWNjdW11bGF0ZWQgdG90YWwgZm9yIHByZXZpb3VzbHkgZXhpdGVkCiB0aHJlYWRzIG9mIHRoZSBzYW1lIHRocmVhZCBncm91cC4KIAogRXh0ZW5kaW5nIHRhc2tzdGF0cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CmluZGV4IDM0YmY4ZjYuLmM2YzlhOWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKQEAgLTE4Myw3ICsxODMsNyBAQAogbW9kaWZpZWQgdG8gYWNjb21wbGlzaCBhIGRpcmVjdCBwYWdlIC0+IGJ1cyB0cmFuc2xhdGlvbiwgd2l0aG91dCByZXF1aXJpbmcKIGEgdmlydHVhbCBhZGRyZXNzIG1hcHBpbmcgKHVubGlrZSB0aGUgZWFybGllciBzY2hlbWUgb2YgdmlydHVhbCBhZGRyZXNzCiAtPiBidXMgdHJhbnNsYXRpb24pLiBTbyB0aGlzIHdvcmtzIHVuaWZvcm1seSBmb3IgaGlnaC1tZW1vcnkgcGFnZXMgKHdoaWNoCi1kbyBub3QgaGF2ZSBhIGNvcnJlcG9uZGluZyBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIHNwYWNlIG1hcHBpbmcpIGFuZAorZG8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgbWFwcGluZykgYW5kCiBsb3ctbWVtb3J5IHBhZ2VzLgogCiBOb3RlOiBQbGVhc2UgcmVmZXIgdG8gRE1BLW1hcHBpbmcudHh0IGZvciBhIGRpc2N1c3Npb24gb24gUENJIGhpZ2ggbWVtIERNQQpAQCAtMzkxLDcgKzM5MSw3IEBACiBvbiB0byB0aGUgZ2VuZXJpYyBibG9jayBsYXllciwgb25seSB0byBiZSBtZXJnZWQgYnkgdGhlIGkvbyBzY2hlZHVsZXIKIHdoZW4gdGhlIHVuZGVybHlpbmcgZGV2aWNlIHdhcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSBpL28gaW4gb25lIHNob3QuCiBBbHNvLCB1c2luZyB0aGUgYnVmZmVyIGhlYWQgYXMgYW4gaS9vIHN0cnVjdHVyZSBmb3IgaS9vcyB0aGF0IGRpZG4ndCBvcmlnaW5hdGUKLWZyb20gdGhlIGJ1ZmZlciBjYWNoZSB1bmVjZXNzYXJpbHkgYWRkZWQgdG8gdGhlIHdlaWdodCBvZiB0aGUgZGVzY3JpcHRvcnMKK2Zyb20gdGhlIGJ1ZmZlciBjYWNoZSB1bm5lY2Vzc2FyaWx5IGFkZGVkIHRvIHRoZSB3ZWlnaHQgb2YgdGhlIGRlc2NyaXB0b3JzCiB3aGljaCB3ZXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzdWNoIGNodW5rLgogCiBUaGUgZm9sbG93aW5nIHdlcmUgc29tZSBvZiB0aGUgZ29hbHMgYW5kIGV4cGVjdGF0aW9ucyBjb25zaWRlcmVkIGluIHRoZQpAQCAtNDAzLDE0ICs0MDMsMTQgQEAKICAgICBmb3IgcmF3IGkvby4KIGlpLiBBYmlsaXR5IHRvIHJlcHJlc2VudCBoaWdoLW1lbW9yeSBidWZmZXJzICh3aGljaCBkbyBub3QgaGF2ZSBhIHZpcnR1YWwKICAgICBhZGRyZXNzIG1hcHBpbmcgaW4ga2VybmVsIGFkZHJlc3Mgc3BhY2UpLgotaWlpLkFiaWxpdHkgdG8gcmVwcmVzZW50IGxhcmdlIGkvb3Mgdy9vIHVuZWNlc3NhcmlseSBicmVha2luZyB0aGVtIHVwIChpLmUKK2lpaS5BYmlsaXR5IHRvIHJlcHJlc2VudCBsYXJnZSBpL29zIHcvbyB1bm5lY2Vzc2FyaWx5IGJyZWFraW5nIHRoZW0gdXAgKGkuZQogICAgIGdyZWF0ZXIgdGhhbiBQQUdFX1NJWkUgY2h1bmtzIGluIG9uZSBzaG90KQogaXYuIEF0IHRoZSBzYW1lIHRpbWUsIGFiaWxpdHkgdG8gcmV0YWluIGluZGVwZW5kZW50IGlkZW50aXR5IG9mIGkvb3MgZnJvbQogICAgIGRpZmZlcmVudCBzb3VyY2VzIG9yIGkvbyB1bml0cyByZXF1aXJpbmcgaW5kaXZpZHVhbCBjb21wbGV0aW9uIChlLmcuIGZvcgogICAgIGxhdGVuY3kgcmVhc29ucykKIHYuICBBYmlsaXR5IHRvIHJlcHJlc2VudCBhbiBpL28gaW52b2x2aW5nIG11bHRpcGxlIHBoeXNpY2FsIG1lbW9yeSBzZWdtZW50cwogICAgIChpbmNsdWRpbmcgbm9uLXBhZ2UgYWxpZ25lZCBwYWdlIGZyYWdtZW50cywgYXMgc3BlY2lmaWVkIHZpYSByZWFkdi93cml0ZXYpCi0gICAgd2l0aG91dCB1bmVjZXNzYXJpbHkgYnJlYWtpbmcgaXQgdXAsIGlmIHRoZSB1bmRlcmx5aW5nIGRldmljZSBpcyBjYXBhYmxlIG9mCisgICAgd2l0aG91dCB1bm5lY2Vzc2FyaWx5IGJyZWFraW5nIGl0IHVwLCBpZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgaXMgY2FwYWJsZSBvZgogICAgIGhhbmRsaW5nIGl0LgogdmkuIFByZWZlcmFibHkgc2hvdWxkIGJlIGJhc2VkIG9uIGEgbWVtb3J5IGRlc2NyaXB0b3Igc3RydWN0dXJlIHRoYXQgY2FuIGJlCiAgICAgcGFzc2VkIGFyb3VuZCBkaWZmZXJlbnQgdHlwZXMgb2Ygc3Vic3lzdGVtcyBvciBsYXllcnMsIG1heWJlIGV2ZW4KQEAgLTEwMTMsNyArMTAxMyw3IEBACiBpLiBCaW5hcnkgdHJlZQogQVMgYW5kIGRlYWRsaW5lIGkvbyBzY2hlZHVsZXJzIHVzZSByZWQgYmxhY2sgYmluYXJ5IHRyZWVzIGZvciBkaXNrIHBvc2l0aW9uCiBzb3J0aW5nIGFuZCBzZWFyY2hpbmcsIGFuZCBhIGZpZm8gbGlua2VkIGxpc3QgZm9yIHRpbWUtYmFzZWQgc2VhcmNoaW5nLiBUaGlzCi1naXZlcyBnb29kIHNjYWxhYmlsaXR5IGFuZCBnb29kIGF2YWlsYWJsaWxpdHkgb2YgaW5mb3JtYXRpb24uIFJlcXVlc3RzIGFyZQorZ2l2ZXMgZ29vZCBzY2FsYWJpbGl0eSBhbmQgZ29vZCBhdmFpbGFiaWxpdHkgb2YgaW5mb3JtYXRpb24uIFJlcXVlc3RzIGFyZQogYWxtb3N0IGFsd2F5cyBkaXNwYXRjaGVkIGluIGRpc2sgc29ydCBvcmRlciwgc28gYSBjYWNoZSBpcyBrZXB0IG9mIHRoZSBuZXh0CiByZXF1ZXN0IGluIHNvcnQgb3JkZXIgdG8gcHJldmVudCBiaW5hcnkgdHJlZSBsb29rdXBzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtbmZvcmNlMi50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtbmZvcmNlMi50eHQKaW5kZXggOTE4ODMzNy4uYmFiY2UxMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLW5mb3JjZTIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1uZm9yY2UyLnR4dApAQCAtMSw3ICsxLDcgQEAKIAotVGhlIGNwdWZyZXEtbmZvcmNlMiBkcml2ZXIgY2hhbmdlcyB0aGUgRlNCIG9uIG5WaWRpYSBuRm9yY2UyIHBsYXR0Zm9ybXMuCitUaGUgY3B1ZnJlcS1uZm9yY2UyIGRyaXZlciBjaGFuZ2VzIHRoZSBGU0Igb24gblZpZGlhIG5Gb3JjZTIgcGxhdGZvcm1zLgogCi1UaGlzIHdvcmtzIGJldHRlciB0aGFuIG9uIG90aGVyIHBsYXR0Zm9ybXMsIGJlY2F1c2UgdGhlIEZTQiBvZiB0aGUgQ1BVCitUaGlzIHdvcmtzIGJldHRlciB0aGFuIG9uIG90aGVyIHBsYXRmb3JtcywgYmVjYXVzZSB0aGUgRlNCIG9mIHRoZSBDUFUKIGNhbiBiZSBjb250cm9sbGVkIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgUENJL0FHUCBjbG9jay4KIAogVGhlIG1vZHVsZSBoYXMgdHdvIG9wdGlvbnM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWhvdHBsdWcudHh0CmluZGV4IDQ4NjhjMzQuLmNjNjBkMjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1LWhvdHBsdWcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWhvdHBsdWcudHh0CkBAIC01NCw4ICs1NCw4IEBACiAKIGlhNjQgYW5kIHg4Nl82NCB1c2UgdGhlIG51bWJlciBvZiBkaXNhYmxlZCBsb2NhbCBhcGljcyBpbiBBQ1BJIHRhYmxlcyBNQURUCiB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwb3RlbnRpYWxseSBob3QtcGx1Z2dhYmxlIGNwdXMuIFRoZSBpbXBsZW1lbnRhdGlvbgotc2hvdWxkIG9ubHkgcmVseSBvbiB0aGlzIHRvIGNvdW50IHRoZSAjb2YgY3B1cywgYnV0ICpNVVNUKiBub3QgcmVseSBvbiB0aGUKLWFwaWNpZCB2YWx1ZXMgaW4gdGhvc2UgdGFibGVzIGZvciBkaXNhYmxlZCBhcGljcy4gSW4gdGhlIGV2ZW50IEJJT1MgZG9lc250CitzaG91bGQgb25seSByZWx5IG9uIHRoaXMgdG8gY291bnQgdGhlICMgb2YgY3B1cywgYnV0ICpNVVNUKiBub3QgcmVseSBvbiB0aGUKK2FwaWNpZCB2YWx1ZXMgaW4gdGhvc2UgdGFibGVzIGZvciBkaXNhYmxlZCBhcGljcy4gSW4gdGhlIGV2ZW50IEJJT1MgZG9lc24ndAogbWFyayBzdWNoIGhvdC1wbHVnZ2FibGUgY3B1cyBhcyBkaXNhYmxlZCBlbnRyaWVzLCBvbmUgY291bGQgdXNlIHRoaXMKIHBhcmFtZXRlciAiYWRkaXRpb25hbF9jcHVzPXgiIHRvIHJlcHJlc2VudCB0aG9zZSBjcHVzIGluIHRoZSBjcHVfcG9zc2libGVfbWFwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAppbmRleCAyOGM0Zjc5Li43MDY5MGYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKQEAgLTkyLDcgKzkyLDcgQEAKIAkJICA3ID0gL2Rldi9mdWxsCQlSZXR1cm5zIEVOT1NQQyBvbiB3cml0ZQogCQkgIDggPSAvZGV2L3JhbmRvbQlOb25kZXRlcm1pbmlzdGljIHJhbmRvbSBudW1iZXIgZ2VuLgogCQkgIDkgPSAvZGV2L3VyYW5kb20JRmFzdGVyLCBsZXNzIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbi4KLQkJIDEwID0gL2Rldi9haW8JCUFzeW5jcm9ub3VzIEkvTyBub3RpZmljYXRpb24gaW50ZXJmYWNlCisJCSAxMCA9IC9kZXYvYWlvCQlBc3luY2hyb25vdXMgSS9PIG5vdGlmaWNhdGlvbiBpbnRlcmZhY2UKIAkJIDExID0gL2Rldi9rbXNnCQlXcml0ZXMgdG8gdGhpcyBjb21lIG91dCBhcyBwcmludGsncwogICAxIGJsb2NrCVJBTSBkaXNrCiAJCSAgMCA9IC9kZXYvcmFtMAkJRmlyc3QgUkFNIGRpc2sKQEAgLTEwOTMsNyArMTA5Myw3IEBACiAKICA1NSBjaGFyCURTUDU2MDAxIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvcgogCQkgIDAgPSAvZGV2L2RzcDU2awlGaXJzdCBEU1A1NjAwMQotIDU1IGJsb2NrCU15bGV4IERBQzk2MCBQQ0kgUkFJRCBjb250cm9sbGVyOyBlaWd0aCBjb250cm9sbGVyCisgNTUgYmxvY2sJTXlsZXggREFDOTYwIFBDSSBSQUlEIGNvbnRyb2xsZXI7IGVpZ2h0aCBjb250cm9sbGVyCiAJCSAgMCA9IC9kZXYvcmQvYzdkMAlGaXJzdCBkaXNrLCB3aG9sZSBkaXNrCiAJCSAgOCA9IC9kZXYvcmQvYzdkMQlTZWNvbmQgZGlzaywgd2hvbGUgZGlzawogCQkgICAgLi4uCkBAIC0xNDU2LDcgKzE0NTYsNyBAQAogCQkgIDEgPSAvZGV2L2N1bTEJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlNMQogCQkgICAgLi4uCiAKLSA3OSBibG9jawlDb21wYXEgSW50ZWxsaWdlbnQgRHJpdmUgQXJyYXksIGVpZ3RoIGNvbnRyb2xsZXIKKyA3OSBibG9jawlDb21wYXEgSW50ZWxsaWdlbnQgRHJpdmUgQXJyYXksIGVpZ2h0aCBjb250cm9sbGVyCiAJCSAgMCA9IC9kZXYvaWRhL2M3ZDAJRmlyc3QgbG9naWNhbCBkcml2ZSB3aG9sZSBkaXNrCiAJCSAxNiA9IC9kZXYvaWRhL2M3ZDEJU2Vjb25kIGxvZ2ljYWwgZHJpdmUgd2hvbGUgZGlzawogCQkgICAgLi4uCkBAIC0xOTAwLDcgKzE5MDAsNyBAQAogCQkgIDEgPSAvZGV2L2F2MQkJU2Vjb25kIEEvViBjYXJkCiAJCSAgICAuLi4KIAotMTExIGJsb2NrCUNvbXBhcSBOZXh0IEdlbmVyYXRpb24gRHJpdmUgQXJyYXksIGVpZ3RoIGNvbnRyb2xsZXIKKzExMSBibG9jawlDb21wYXEgTmV4dCBHZW5lcmF0aW9uIERyaXZlIEFycmF5LCBlaWdodGggY29udHJvbGxlcgogCQkgIDAgPSAvZGV2L2NjaXNzL2M3ZDAJRmlyc3QgbG9naWNhbCBkcml2ZSwgd2hvbGUgZGlzawogCQkgMTYgPSAvZGV2L2NjaXNzL2M3ZDEJU2Vjb25kIGxvZ2ljYWwgZHJpdmUsIHdob2xlIGRpc2sKIAkJICAgIC4uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcGxhdGZvcm0udHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcGxhdGZvcm0udHh0CmluZGV4IDVlZWUzZTAuLjlmMGJjM2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BsYXRmb3JtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9wbGF0Zm9ybS50eHQKQEAgLTEsOTkgKzEsMTMxIEBACiBQbGF0Zm9ybSBEZXZpY2VzIGFuZCBEcml2ZXJzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitTZWUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPiBmb3IgdGhlIGRyaXZlciBtb2RlbCBpbnRlcmZhY2UgdG8gdGhlCitwbGF0Zm9ybSBidXM6ICBwbGF0Zm9ybV9kZXZpY2UsIGFuZCBwbGF0Zm9ybV9kcml2ZXIuICBUaGlzIHBzZXVkby1idXMKK2lzIHVzZWQgdG8gY29ubmVjdCBkZXZpY2VzIG9uIGJ1c3NlcyB3aXRoIG1pbmltYWwgaW5mcmFzdHJ1Y3R1cmUsCitsaWtlIHRob3NlIHVzZWQgdG8gaW50ZWdyYXRlIHBlcmlwaGVyYWxzIG9uIG1hbnkgc3lzdGVtLW9uLWNoaXAKK3Byb2Nlc3NvcnMsIG9yIHNvbWUgImxlZ2FjeSIgUEMgaW50ZXJjb25uZWN0czsgYXMgb3Bwb3NlZCB0byBsYXJnZQorZm9ybWFsbHkgc3BlY2lmaWVkIG9uZXMgbGlrZSBQQ0kgb3IgVVNCLgorCiAKIFBsYXRmb3JtIGRldmljZXMKIH5+fn5+fn5+fn5+fn5+fn4KIFBsYXRmb3JtIGRldmljZXMgYXJlIGRldmljZXMgdGhhdCB0eXBpY2FsbHkgYXBwZWFyIGFzIGF1dG9ub21vdXMKIGVudGl0aWVzIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5jbHVkZXMgbGVnYWN5IHBvcnQtYmFzZWQgZGV2aWNlcyBhbmQKLWhvc3QgYnJpZGdlcyB0byBwZXJpcGhlcmFsIGJ1c2VzLiAKK2hvc3QgYnJpZGdlcyB0byBwZXJpcGhlcmFsIGJ1c2VzLCBhbmQgbW9zdCBjb250cm9sbGVycyBpbnRlZ3JhdGVkCitpbnRvIHN5c3RlbS1vbi1jaGlwIHBsYXRmb3Jtcy4gIFdoYXQgdGhleSB1c3VhbGx5IGhhdmUgaW4gY29tbW9uCitpcyBkaXJlY3QgYWRkcmVzc2luZyBmcm9tIGEgQ1BVIGJ1cy4gIFJhcmVseSwgYSBwbGF0Zm9ybV9kZXZpY2Ugd2lsbAorYmUgY29ubmVjdGVkIHRocm91Z2ggYSBzZWdtZW50IG9mIHNvbWUgb3RoZXIga2luZCBvZiBidXM7IGJ1dCBpdHMKK3JlZ2lzdGVycyB3aWxsIHN0aWxsIGJlIGRpcmVjdGx5IGFkZHJlc3NpYmxlLgorCitQbGF0Zm9ybSBkZXZpY2VzIGFyZSBnaXZlbiBhIG5hbWUsIHVzZWQgaW4gZHJpdmVyIGJpbmRpbmcsIGFuZCBhCitsaXN0IG9mIHJlc291cmNlcyBzdWNoIGFzIGFkZHJlc3NlcyBhbmQgSVJRcy4KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1MzIJCWlkOworCXN0cnVjdCBkZXZpY2UJZGV2OworCXUzMgkJbnVtX3Jlc291cmNlczsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlc291cmNlOworfTsKIAogCiBQbGF0Zm9ybSBkcml2ZXJzCiB+fn5+fn5+fn5+fn5+fn5+Ci1Ecml2ZXJzIGZvciBwbGF0Zm9ybSBkZXZpY2VzIGFyZSB0eXBpY2FsbHkgdmVyeSBzaW1wbGUgYW5kCi11bnN0cnVjdHVyZWQuIEVpdGhlciB0aGUgZGV2aWNlIHdhcyBwcmVzZW50IGF0IGEgcGFydGljdWxhciBJL08gcG9ydAotYW5kIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCwgb3IgaXQgd2FzIG5vdC4gVGhlcmUgd2FzIG5vIHBvc3NpYmlsaXR5Ci1vZiBob3RwbHVnZ2luZyBvciBhbHRlcm5hdGl2ZSBkaXNjb3ZlcnkgYmVzaWRlcyBwcm9iaW5nIGF0IGEgc3BlY2lmaWMKLUkvTyBhZGRyZXNzIGFuZCBleHBlY3RpbmcgYSBzcGVjaWZpYyByZXNwb25zZS4KK1BsYXRmb3JtIGRyaXZlcnMgZm9sbG93IHRoZSBzdGFuZGFyZCBkcml2ZXIgbW9kZWwgY29udmVudGlvbiwgd2hlcmUKK2Rpc2NvdmVyeS9lbnVtZXJhdGlvbiBpcyBoYW5kbGVkIG91dHNpZGUgdGhlIGRyaXZlcnMsIGFuZCBkcml2ZXJzCitwcm92aWRlIHByb2JlKCkgYW5kIHJlbW92ZSgpIG1ldGhvZHMuICBUaGV5IHN1cHBvcnQgcG93ZXIgbWFuYWdlbWVudAorYW5kIHNodXRkb3duIG5vdGlmaWNhdGlvbnMgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb25zLgorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpzdXNwZW5kX2xhdGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKK307CisKK05vdGUgdGhhdCBwcm9iZSgpIHNob3VsZCBnZW5lcmFsIHZlcmlmeSB0aGF0IHRoZSBzcGVjaWZpZWQgZGV2aWNlIGhhcmR3YXJlCithY3R1YWxseSBleGlzdHM7IHNvbWV0aW1lcyBwbGF0Zm9ybSBzZXR1cCBjb2RlIGNhbid0IGJlIHN1cmUuICBUaGUgcHJvYmluZworY2FuIHVzZSBkZXZpY2UgcmVzb3VyY2VzLCBpbmNsdWRpbmcgY2xvY2tzLCBhbmQgZGV2aWNlIHBsYXRmb3JtX2RhdGEuCisKK1BsYXRmb3JtIGRyaXZlcnMgcmVnaXN0ZXIgdGhlbXNlbHZlcyB0aGUgbm9ybWFsIHdheToKKworCWludCBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqZHJ2KTsKKworT3IsIGluIGNvbW1vbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBkZXZpY2UgaXMga25vd24gbm90IHRvIGJlIGhvdC1wbHVnZ2FibGUsCit0aGUgcHJvYmUoKSByb3V0aW5lIGNhbiBsaXZlIGluIGFuIGluaXQgc2VjdGlvbiB0byByZWR1Y2UgdGhlIGRyaXZlcidzCitydW50aW1lIG1lbW9yeSBmb290cHJpbnQ6CisKKwlpbnQgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRydiwKKwkJCSAgaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKikpCiAKIAotT3RoZXIgQXJjaGl0ZWN0dXJlcywgTW9kZXJuIEZpcm13YXJlLCBhbmQgbmV3IFBsYXRmb3Jtcwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotVGhlc2UgZGV2aWNlcyBhcmUgbm90IGFsd2F5cyBhdCB0aGUgbGVnYWN5IEkvTyBwb3J0cy4gVGhpcyBpcyB0cnVlIG9uCi1vdGhlciBhcmNoaXRlY3R1cmVzIGFuZCBvbiBzb21lIG1vZGVybiBhcmNoaXRlY3R1cmVzLiBJbiBtb3N0IGNhc2VzLAotdGhlIGRyaXZlcnMgYXJlIG1vZGlmaWVkIHRvIGRpc2NvdmVyIHRoZSBkZXZpY2VzIGF0IG90aGVyIHdlbGwta25vd24KLXBvcnRzIGZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIEhvd2V2ZXIsIHRoZSBmaXJtd2FyZSBpbiB0aGVzZSBzeXN0ZW1zCi1kb2VzIHVzdWFsbHkga25vdyB3aGVyZSBleGFjdGx5IHRoZXNlIGRldmljZXMgcmVzaWRlLCBhbmQgaW4gc29tZQotY2FzZXMsIGl0J3MgdGhlIG9ubHkgd2F5IG9mIGRpc2NvdmVyaW5nIHRoZW0uIAorRGV2aWNlIEVudW1lcmF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn4KK0FzIGEgcnVsZSwgcGxhdGZvcm0gc3BlY2lmaWMgKGFuZCBvZnRlbiBib2FyZC1zcGVjaWZpYykgc2V0dXAgY29kZSB3aWwKK3JlZ2lzdGVyIHBsYXRmb3JtIGRldmljZXM6CisKKwlpbnQgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisJaW50IHBsYXRmb3JtX2FkZF9kZXZpY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipwZGV2cywgaW50IG5kZXYpOworCitUaGUgZ2VuZXJhbCBydWxlIGlzIHRvIHJlZ2lzdGVyIG9ubHkgdGhvc2UgZGV2aWNlcyB0aGF0IGFjdHVhbGx5IGV4aXN0LAorYnV0IGluIHNvbWUgY2FzZXMgZXh0cmEgZGV2aWNlcyBtaWdodCBiZSByZWdpc3RlcmVkLiAgRm9yIGV4YW1wbGUsIGEga2VybmVsCittaWdodCBiZSBjb25maWd1cmVkIHRvIHdvcmsgd2l0aCBhbiBleHRlcm5hbCBuZXR3b3JrIGFkYXB0ZXIgdGhhdCBtaWdodCBub3QKK2JlIHBvcHVsYXRlZCBvbiBhbGwgYm9hcmRzLCBvciBsaWtld2lzZSB0byB3b3JrIHdpdGggYW4gaW50ZWdyYXRlZCBjb250cm9sbGVyCit0aGF0IHNvbWUgYm9hcmRzIG1pZ2h0IG5vdCBob29rIHVwIHRvIGFueSBwZXJpcGhlcmFscy4KKworSW4gc29tZSBjYXNlcywgYm9vdCBmaXJtd2FyZSB3aWxsIGV4cG9ydCB0YWJsZXMgZGVzY3JpYmluZyB0aGUgZGV2aWNlcwordGhhdCBhcmUgcG9wdWxhdGVkIG9uIGEgZ2l2ZW4gYm9hcmQuICAgV2l0aG91dCBzdWNoIHRhYmxlcywgb2Z0ZW4gdGhlCitvbmx5IHdheSBmb3Igc3lzdGVtIHNldHVwIGNvZGUgdG8gc2V0IHVwIHRoZSBjb3JyZWN0IGRldmljZXMgaXMgdG8gYnVpbGQKK2Ega2VybmVsIGZvciBhIHNwZWNpZmljIHRhcmdldCBib2FyZC4gIFN1Y2ggYm9hcmQtc3BlY2lmaWMga2VybmVscyBhcmUKK2NvbW1vbiB3aXRoIGVtYmVkZGVkIGFuZCBjdXN0b20gc3lzdGVtcyBkZXZlbG9wbWVudC4KKworSW4gbWFueSBjYXNlcywgdGhlIG1lbW9yeSBhbmQgSVJRIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYXRmb3JtCitkZXZpY2UgYXJlIG5vdCBlbm91Z2ggdG8gbGV0IHRoZSBkZXZpY2UncyBkcml2ZXIgd29yay4gIEJvYXJkIHNldHVwIGNvZGUKK3dpbGwgb2Z0ZW4gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBkZXZpY2UncyBwbGF0Zm9ybV9kYXRhCitmaWVsZCB0byBob2xkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0VtYmVkZGVkIHN5c3RlbXMgZnJlcXVlbnRseSBuZWVkIG9uZSBvciBtb3JlIGNsb2NrcyBmb3IgcGxhdGZvcm0gZGV2aWNlcywKK3doaWNoIGFyZSBub3JtYWxseSBrZXB0IG9mZiB1bnRpbCB0aGV5J3JlIGFjdGl2ZWx5IG5lZWRlZCAodG8gc2F2ZSBwb3dlcikuCitTeXN0ZW0gc2V0dXAgYWxzbyBhc3NvY2lhdGVzIHRob3NlIGNsb2NrcyB3aXRoIHRoZSBkZXZpY2UsIHNvIHRoYXQgdGhhdAorY2FsbHMgdG8gY2xrX2dldCgmcGRldi0+ZGV2LCBjbG9ja19uYW1lKSByZXR1cm4gdGhlbSBhcyBuZWVkZWQuCiAKIAotVGhlIFBsYXRmb3JtIEJ1cwotfn5+fn5+fn5+fn5+fn5+fgotQSBwbGF0Zm9ybSBidXMgaGFzIGJlZW4gY3JlYXRlZCB0byBkZWFsIHdpdGggdGhlc2UgaXNzdWVzLiBGaXJzdCBhbmQKLWZvcmVtb3N0LCBpdCBncm91cHMgYWxsIHRoZSBsZWdhY3kgZGV2aWNlcyB1bmRlciBhIGNvbW1vbiBidXMsIGFuZAotZ2l2ZXMgdGhlbSBhIGNvbW1vbiBwYXJlbnQgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAKK0RldmljZSBOYW1pbmcgYW5kIERyaXZlciBCaW5kaW5nCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhlIHBsYXRmb3JtX2RldmljZS5kZXYuYnVzX2lkIGlzIHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGRldmljZXMuCitJdCdzIGJ1aWx0IGZyb20gdHdvIGNvbXBvbmVudHM6CiAKLUJ1dCwgYmVzaWRlcyB0aGUgb3JnYW5pemF0aW9uYWwgYmVuZWZpdHMsIHRoZSBwbGF0Zm9ybSBidXMgY2FuIGFsc28KLWFjY29tbW9kYXRlIGZpcm13YXJlLWJhc2VkIGVudW1lcmF0aW9uLiAKKyAgICAqIHBsYXRmb3JtX2RldmljZS5uYW1lIC4uLiB3aGljaCBpcyBhbHNvIHVzZWQgdG8gZm9yIGRyaXZlciBtYXRjaGluZy4KIAorICAgICogcGxhdGZvcm1fZGV2aWNlLmlkIC4uLiB0aGUgZGV2aWNlIGluc3RhbmNlIG51bWJlciwgb3IgZWxzZSAiLTEiCisgICAgICB0byBpbmRpY2F0ZSB0aGVyZSdzIG9ubHkgb25lLgogCi1EZXZpY2UgRGlzY292ZXJ5Ci1+fn5+fn5+fn5+fn5+fn5+Ci1UaGUgcGxhdGZvcm0gYnVzIGhhcyBubyBjb25jZXB0IG9mIHByb2JpbmcgZm9yIGRldmljZXMuIERldmljZXMKLWRpc2NvdmVyeSBpcyBsZWZ0IHVwIHRvIGVpdGhlciB0aGUgbGVnYWN5IGRyaXZlcnMgb3IgdGhlCi1maXJtd2FyZS4gVGhlc2UgZW50aXRpZXMgYXJlIGV4cGVjdGVkIHRvIG5vdGlmeSB0aGUgcGxhdGZvcm0gb2YKLWRldmljZXMgdGhhdCBpdCBkaXNjb3ZlcnMgdmlhIHRoZSBidXMncyBhZGQoKSBjYWxsYmFjazoKK1RoZXNlIGFyZSBjYXRlbmF0ZWQsIHNvIG5hbWUvaWQgInNlcmlhbCIvMCBpbmRpY2F0ZXMgYnVzX2lkICJzZXJpYWwuMCIsIGFuZAorInNlcmlhbC8zIiBpbmRpY2F0ZXMgYnVzX2lkICJzZXJpYWwuMyI7IGJvdGggd291bGQgdXNlIHRoZSBwbGF0Zm9ybV9kcml2ZXIKK25hbWVkICJzZXJpYWwiLiAgV2hpbGUgIm15X3J0YyIvLTEgd291bGQgYmUgYnVzX2lkICJteV9ydGMiIChubyBpbnN0YW5jZSBpZCkKK2FuZCB1c2UgdGhlIHBsYXRmb3JtX2RyaXZlciBjYWxsZWQgIm15X3J0YyIuCiAKLQlwbGF0Zm9ybV9idXMuYWRkKHBhcmVudCxidXNfaWQpLgorRHJpdmVyIGJpbmRpbmcgaXMgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGRyaXZlciBjb3JlLCBpbnZva2luZworZHJpdmVyIHByb2JlKCkgYWZ0ZXIgZmluZGluZyBhIG1hdGNoIGJldHdlZW4gZGV2aWNlIGFuZCBkcml2ZXIuICBJZiB0aGUKK3Byb2JlKCkgc3VjY2VlZHMsIHRoZSBkcml2ZXIgYW5kIGRldmljZSBhcmUgYm91bmQgYXMgdXN1YWwuICBUaGVyZSBhcmUKK3RocmVlIGRpZmZlcmVudCB3YXlzIHRvIGZpbmQgc3VjaCBhIG1hdGNoOgogCisgICAgLSBXaGVuZXZlciBhIGRldmljZSBpcyByZWdpc3RlcmVkLCB0aGUgZHJpdmVycyBmb3IgdGhhdCBidXMgYXJlCisgICAgICBjaGVja2VkIGZvciBtYXRjaGVzLiAgUGxhdGZvcm0gZGV2aWNlcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCB2ZXJ5CisgICAgICBlYXJseSBkdXJpbmcgc3lzdGVtIGJvb3QuCiAKLUJ1cyBJRHMKLX5+fn5+fn4KLUJ1cyBJRHMgYXJlIHRoZSBjYW5vbmljYWwgbmFtZXMgZm9yIHRoZSBkZXZpY2VzLiBUaGVyZSBpcyBubyBnbG9iYWxseQotc3RhbmRhcmQgYWRkcmVzc2luZyBtZWNoYW5pc20gZm9yIGxlZ2FjeSBkZXZpY2VzLiBJbiB0aGUgSUEtMzIgd29ybGQsCi13ZSBoYXZlIFBucCBJRHMgdG8gdXNlLCBhcyB3ZWxsIGFzIHRoZSBsZWdhY3kgSS9PIHBvcnRzLiBIb3dldmVyLAotbmVpdGhlciB0ZWxsIHdoYXQgdGhlIGRldmljZSByZWFsbHkgaXMgb3IgaGF2ZSBhbnkgbWVhbmluZyBvbiBvdGhlcgotcGxhdGZvcm1zLiAKKyAgICAtIFdoZW4gYSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB1c2luZyBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoKSwgYWxsCisgICAgICB1bmJvdW5kIGRldmljZXMgb24gdGhhdCBidXMgYXJlIGNoZWNrZWQgZm9yIG1hdGNoZXMuICBEcml2ZXJzCisgICAgICB1c3VhbGx5IHJlZ2lzdGVyIGxhdGVyIGR1cmluZyBib290aW5nLCBvciBieSBtb2R1bGUgbG9hZGluZy4KIAotU2luY2UgYm90aCBQblAgSURzIGFuZCB0aGUgbGVnYWN5IEkvTyBwb3J0cyAoYW5kIG90aGVyIHN0YW5kYXJkIEkvTwotcG9ydHMgZm9yIHNwZWNpZmljIGRldmljZXMpIGhhdmUgYSAxOjEgbWFwcGluZywgd2UgbWFwIHRoZQotcGxhdGZvcm0tc3BlY2lmaWMgbmFtZSBvciBpZGVudGlmaWVyIHRvIGEgZ2VuZXJpYyBuYW1lIChhdCBsZWFzdAotd2l0aGluIHRoZSBzY29wZSBvZiB0aGUga2VybmVsKS4KLQotRm9yIGV4YW1wbGUsIGEgc2VyaWFsIGRyaXZlciBtaWdodCBmaW5kIGEgZGV2aWNlIGF0IEkvTyAweDNmOC4gVGhlCi1BQ1BJIGZpcm13YXJlIG1pZ2h0IGFsc28gZGlzY292ZXIgYSBkZXZpY2Ugd2l0aCBQblAgSUQgKF9ISUQpCi1QTlAwNTAxLiBCb3RoIGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZGV2aWNlIGFuZCBzaG91bGQgYmUgbWFwcGVkIHRvIHRoZQotY2Fub25pY2FsIG5hbWUgJ3NlcmlhbCcuIAotCi1UaGUgYnVzX2lkIGZpZWxkIHNob3VsZCBiZSBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGNhbm9uaWNhbCBuYW1lIGFuZAotdGhlIGluc3RhbmNlIG9mIHRoYXQgdHlwZSBvZiBkZXZpY2UuIEZvciBleGFtcGxlLCB0aGUgZGV2aWNlIGF0IEkvTwotcG9ydCAweDNmOCBzaG91bGQgaGF2ZSBhIGJ1c19pZCBvZiAic2VyaWFsMCIuIFRoaXMgcGxhY2VzIHRoZQotcmVzcG9uc2liaWxpdHkgb2YgZW51bWVyYXRpbmcgZGV2aWNlcyBvZiBhIHBhcnRpY3VsYXIgdHlwZSB1cCB0byB0aGUKLWRpc2NvdmVyeSBtZWNoYW5pc20uIEJ1dCwgdGhleSBhcmUgdGhlIGVudGl0eSB0aGF0IHNob3VsZCBrbm93IGJlc3QKLShhcyBvcHBvc2VkIHRvIHRoZSBwbGF0Zm9ybSBidXMgZHJpdmVyKS4KLQotCi1Ecml2ZXJzIAotfn5+fn5+fgotRHJpdmVycyBmb3IgcGxhdGZvcm0gZGV2aWNlcyBzaG91bGQgaGF2ZSBhIG5hbWUgdGhhdCBpcyB0aGUgc2FtZSBhcwotdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBkZXZpY2VzIHRoZXkgc3VwcG9ydC4gVGhpcyBhbGxvd3MgdGhlCi1wbGF0Zm9ybSBidXMgZHJpdmVyIHRvIGRvIHNpbXBsZSBtYXRjaGluZyB3aXRoIHRoZSBiYXNpYyBkYXRhCi1zdHJ1Y3R1cmVzIHRvIGRldGVybWluZSBpZiBhIGRyaXZlciBzdXBwb3J0cyBhIGNlcnRhaW4gZGV2aWNlLiAKLQotRm9yIGV4YW1wbGUsIGEgbGVnYWN5IHNlcmlhbCBkcml2ZXIgc2hvdWxkIGhhdmUgYSBuYW1lIG9mICdzZXJpYWwnIGFuZAotcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIHBsYXRmb3JtIGJ1cy4gCi0KLQotRHJpdmVyIEJpbmRpbmcKLX5+fn5+fn5+fn5+fn5+Ci1MZWdhY3kgZHJpdmVycyBhc3N1bWUgdGhleSBhcmUgYm91bmQgdG8gdGhlIGRldmljZSBvbmNlIHRoZXkgc3RhcnQgdXAKLWFuZCBwcm9iZSBhbiBJL08gcG9ydC4gRGl2b3JjaW5nIHRoZW0gZnJvbSB0aGlzIHdpbGwgYmUgYSBkaWZmaWN1bHQKLXByb2Nlc3MuIEhvd2V2ZXIsIHRoYXQgc2hvdWxkbid0IHByZXZlbnQgdXMgZnJvbSBpbXBsZW1lbnRpbmcKLWZpcm13YXJlLWJhc2VkIGVudW1lcmF0aW9uLiAKLQotVGhlIGZpcm13YXJlIHNob3VsZCBub3RpZnkgdGhlIHBsYXRmb3JtIGJ1cyBhYm91dCBkZXZpY2VzIGJlZm9yZSB0aGUKLWxlZ2FjeSBkcml2ZXJzIGhhdmUgaGFkIGEgY2hhbmNlIHRvIGxvYWQuIE9uY2UgdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCwKLXRoZXkgZHJpdmVyIG1vZGVsIGNvcmUgd2lsbCBhdHRlbXB0IHRvIGJpbmQgdGhlIGRyaXZlciB0byBhbnkKLXByZXZpb3VzbHktZGlzY292ZXJlZCBkZXZpY2VzLiBPbmNlIHRoYXQgaGFzIGhhcHBlbmVkLCBpdCB3aWxsIGJlIGZyZWUKLXRvIGRpc2NvdmVyIGFueSBvdGhlciBkZXZpY2VzIGl0IHBsZWFzZXMuCisgICAgLSBSZWdpc3RlcmluZyBhIGRyaXZlciB1c2luZyBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoKSB3b3JrcyBqdXN0IGxpa2UKKyAgICAgIHVzaW5nIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigpLCBleGNlcHQgdGhhdCB0aGUgdGhlIGRyaXZlciB3b24ndAorICAgICAgYmUgcHJvYmVkIGxhdGVyIGlmIGFub3RoZXIgZGV2aWNlIHJlZ2lzdGVycy4gIChXaGljaCBpcyBPSywgc2luY2UKKyAgICAgIHRoaXMgaW50ZXJmYWNlIGlzIG9ubHkgZm9yIHVzZSB3aXRoIG5vbi1ob3RwbHVnZ2FibGUgZGV2aWNlcy4pCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BvcnRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcG9ydGluZy50eHQKaW5kZXggOThiMjMzYy4uOTJkODZmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcG9ydGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcG9ydGluZy50eHQKQEAgLTkyLDcgKzkyLDcgQEAKIGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCB0aGUgZGV2aWNlIGhhcyB0byBvdGhlciBlbnRpdGllcy4gCiAKIAotLSBFbWJlZGQgYSBzdHJ1Y3QgZGV2aWNlIGluIHRoZSBidXMtc3BlY2lmaWMgZGV2aWNlIHR5cGUuIAorLSBFbWJlZCBhIHN0cnVjdCBkZXZpY2UgaW4gdGhlIGJ1cy1zcGVjaWZpYyBkZXZpY2UgdHlwZS4gCiAKIAogc3RydWN0IHBjaV9kZXYgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0CmluZGV4IDUzMTIzOWIuLjJlY2Q4MzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHZiL2NpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQKQEAgLTcxLDcgKzcxLDcgQEAKIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyB0byBtYW5hZ2UgdGhlIHJlc3QuIEZvcgogdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgaXQgd291bGQgYmUgYXMgc2ltcGxlIGFzIHNlbmRpbmcvcmVjZWl2aW5nIGFuCiBhcnJheSB0by9mcm9tIHRoZSBDSSBpb2N0bHMgYXMgZGVmaW5lZCBpbiB0aGUgTGludXggRFZCIEFQSS4gTm8gY2hhbmdlcwotaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEFQSSB0byBhY2NvbW9kYXRlIHRoaXMgZmVhdHVyZS4KK2hhdmUgYmVlbiBtYWRlIGluIHRoZSBBUEkgdG8gYWNjb21tb2RhdGUgdGhpcyBmZWF0dXJlLgogCiAKICogV2h5IHRoZSBuZWVkIGZvciBhbm90aGVyIENJIGludGVyZmFjZSA/CkBAIC0xMDIsNyArMTAyLDcgQEAKIGltcGxlbWVudGVkIGJ5IG1vc3QgYXBwbGljYXRpb25zLiBIZW5jZSB0aGlzIGFyZWEgaXMgcmV2aXNpdGVkLgogCiBUaGlzIENJIGludGVyZmFjZSBpcyBxdWl0ZSBkaWZmZXJlbnQgaW4gdGhlIGNhc2UgdGhhdCBpdCB0cmllcyB0bwotYWNjb21vZGF0ZSBhbGwgb3RoZXIgQ0kgYmFzZWQgZGV2aWNlcywgdGhhdCBmYWxsIGludG8gdGhlIG90aGVyIGNhdGVnb3JpZXMKK2FjY29tbW9kYXRlIGFsbCBvdGhlciBDSSBiYXNlZCBkZXZpY2VzLCB0aGF0IGZhbGwgaW50byB0aGUgb3RoZXIgY2F0ZWdvcmllcy4KIAogVGhpcyBtZWFucyB0aGF0IHRoaXMgQ0kgaW50ZXJmYWNlIGhhbmRsZXMgdGhlIEVONTAyMjEgc3R5bGUgdGFncyBpbiB0aGUKIEFwcGxpY2F0aW9uIGxheWVyIG9ubHkgYW5kIG5vIHNlc3Npb24gbWFuYWdlbWVudCBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9laXNhLnR4dCBiL0RvY3VtZW50YXRpb24vZWlzYS50eHQKaW5kZXggNmEwOTllZC4uNjBlMzYxYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9laXNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Vpc2EudHh0CkBAIC02Miw3ICs2Miw3IEBACiBidXNfYmFzZV9hZGRyIDogc2xvdCAwIGFkZHJlc3Mgb24gdGhpcyBidXMKIHNsb3RzCSAgICAgIDogbWF4IHNsb3QgbnVtYmVyIHRvIHByb2JlCiBmb3JjZV9wcm9iZSAgIDogUHJvYmUgZXZlbiB3aGVuIHNsb3QgMCBpcyBlbXB0eSAobm8gRUlTQSBtYWluYm9hcmQpCi1kbWFfbWFzayAgICAgIDogRGVmYXVsdCBETUEgbWFzay4gVXN1YWx5IHRoZSBicmlkZ2UgZGV2aWNlIGRtYV9tYXNrLgorZG1hX21hc2sgICAgICA6IERlZmF1bHQgRE1BIG1hc2suIFVzdWFsbHkgdGhlIGJyaWRnZSBkZXZpY2UgZG1hX21hc2suCiBidXNfbnIJICAgICAgOiB1bmlxdWUgYnVzIGlkLCBzZXQgYnkgZWlzYV9yb290X3JlZ2lzdGVyCiAKICoqIERyaXZlciA6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZDUyYzRhYS4uMjI2ZWNmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtNzAsMTggKzcwLDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CWlwX3F1ZXVlIGFuZCBpcDZfcXVldWUgKG9sZCBpcHY0LW9ubHkgYW5kIGlwdjYtb25seSBuZXRmaWx0ZXIgcXVldWUpCi1XaGVuOglEZWNlbWJlciAyMDA1Ci1XaHk6CVRoaXMgaW50ZXJmYWNlIGhhcyBiZWVuIG9ic29sZXRlZCBieSB0aGUgbmV3IGxheWVyMy1pbmRlcGVuZGVudAotCSJuZm5ldGxpbmtfcXVldWUiLiAgVGhlIEtlcm5lbCBpbnRlcmZhY2UgaXMgY29tcGF0aWJsZSwgc28gdGhlIG9sZAotCWlwWzZddGFibGVzICJRVUVVRSIgdGFyZ2V0cyBzdGlsbCB3b3JrIGFuZCB3aWxsIHRyYW5zcGFyZW50bHkgaGFuZGxlCi0JYWxsIHBhY2tldHMgaW50byBuZm5ldGxpbmsgcXVldWUgbnVtYmVyIDAuICBVc2Vyc3BhY2UgdXNlcnMgd2lsbCBoYXZlCi0JdG8gbGluayBhZ2FpbnN0IEFQSS1jb21wYXRpYmxlIGxpYnJhcnkgb24gdG9wIG9mIGxpYm5mbmV0bGlua19xdWV1ZSAKLQlpbnN0ZWFkIG9mIHRoZSBjdXJyZW50ICdsaWJpcHEnLgotV2hvOglIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CXJlbW92ZSBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpCiBXaGVuOglBdWd1c3QgMjAwNgogRmlsZXM6CWFyY2gvKi9rZXJuZWwvKl9rc3ltcy5jCkBAIC0yMjcsMjEgKzIxNSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglmcmFtZSBkaXZlcnRlcgotV2hlbjoJTm92ZW1iZXIgMjAwNgotV2h5OglUaGUgZnJhbWUgZGl2ZXJ0ZXIgaXMgaW5jbHVkZWQgaW4gbW9zdCBkaXN0cmlidXRpb24ga2VybmVscywgYnV0IGlzCi0JYnJva2VuLiBJdCBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIG1hbnkgdGhpbmdzOgotCS0gSVBWNgotCS0gbm9uLWxpbmVhciBza2IncwotCS0gbmV0d29yayBkZXZpY2UgUkNVIG9uIHJlbW92YWwKLQktIGlucHV0IGZyYW1lcyBub3QgY29ycmVjdGx5IGNoZWNrZWQgZm9yIHByb3RvY29sIGVycm9ycwotCUl0IGFsc28gYWRkcyBhbGxvY2F0aW9uIG92ZXJoZWFkIGV2ZW4gaWYgbm90IGVuYWJsZWQuCi0JSXQgaXMgbm90IGNsZWFyIGlmIGFueW9uZSBpcyBzdGlsbCB1c2luZyBpdC4KLVdobzoJU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KIFdoYXQ6CVBIWVNERVZQQVRILCBQSFlTREVWQlVTLCBQSFlTREVWRFJJVkVSIGluIHRoZSB1ZXZlbnQgZW52aXJvbm1lbnQKIFdoZW46CU9jdG9iZXIgMjAwOAogV2h5OglUaGUgc3RhY2tpbmcgb2YgY2xhc3MgZGV2aWNlcyBtYWtlcyB0aGVzZSB2YWx1ZXMgbWlzbGVhZGluZyBhbmQKQEAgLTI2MSwxMCArMjM0LDExIEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglmdGFwZQotV2hlbjoJMi42LjIwCi1XaHk6CU9ycGhhbmVkIGZvciBhZ2VzLiAgU01QIGJ1Z3MgbG9uZyB1bmZpeGVkLiAgRmV3IHVzZXJzIGxlZnQKLQlpbiB0aGUgd29ybGQuCi1XaG86CUplZmYgR2FyemlrIDxqZWZmQGdhcnppay5vcmc+CitXaGF0OglJUHY0IG9ubHkgY29ubmVjdGlvbiB0cmFja2luZy9OQVQvaGVscGVycworV2hlbjoJMi42LjIyCitXaHk6CVRoZSBuZXcgbGF5ZXIgMyBpbmRlcGVuZGFudCBjb25uZWN0aW9uIHRyYWNraW5nIHJlcGxhY2VzIHRoZSBvbGQKKwlJUHY0IG9ubHkgdmVyc2lvbi4gQWZ0ZXIgc29tZSBzdGFiaWxpemF0aW9uIG9mIHRoZSBuZXcgY29kZSB0aGUKKwlvbGQgb25lIHdpbGwgYmUgcmVtb3ZlZC4KK1dobzoJUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWRmcy50eHQKaW5kZXggMDYwYWJiMC4uOWU4ODExZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZGZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2FkZnMudHh0CkBAIC0zLDcgKzMsNyBAQAogCiAgIHVpZD1ubm4JQWxsIGZpbGVzIGluIHRoZSBwYXJ0aXRpb24gd2lsbCBiZSBvd25lZCBieQogCQl1c2VyIGlkIG5ubi4gIERlZmF1bHQgMCAocm9vdCkuCi0gIGdpZD1ubm4JQWxsIGZpbGVzIGluIHRoZSBwYXJ0aXRpb24gd2lsbGJlIGluIGdyb3VwCisgIGdpZD1ubm4JQWxsIGZpbGVzIGluIHRoZSBwYXJ0aXRpb24gd2lsbCBiZSBpbiBncm91cAogCQlubm4uICBEZWZhdWx0IDAgKHJvb3QpLgogICBvd25tYXNrPW5ubglUaGUgcGVybWlzc2lvbiBtYXNrIGZvciBBREZTICdvd25lcicgcGVybWlzc2lvbnMKIAkJd2lsbCBiZSBubm4uICBEZWZhdWx0IDA3MDAuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CmluZGV4IGMzYTdhZmIuLmIzNGNkYjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CkBAIC0yMDksNyArMjA5LDcgQEAKIAogW3N0cnVjdCBjb25maWdfZ3JvdXBdCiAKLUEgY29uZmlnX2l0ZW0gY2Fubm90IGxpdmUgaW4gYSB2YWNjdW0uICBUaGUgb25seSB3YXkgb25lIGNhbiBiZSBjcmVhdGVkCitBIGNvbmZpZ19pdGVtIGNhbm5vdCBsaXZlIGluIGEgdmFjdXVtLiAgVGhlIG9ubHkgd2F5IG9uZSBjYW4gYmUgY3JlYXRlZAogaXMgdmlhIG1rZGlyKDIpIG9uIGEgY29uZmlnX2dyb3VwLiAgVGhpcyB3aWxsIHRyaWdnZXIgY3JlYXRpb24gb2YgYQogY2hpbGQgaXRlbS4KIApAQCAtMjc1LDcgKzI3NSw3IEBACiAKIFtzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtXQogCi1BIHN1YnN5c3RlbSBtdXN0IHJlZ2lzdGVyIGl0c2VsZiwgdXN1c2FsbHkgYXQgbW9kdWxlX2luaXQgdGltZS4gIFRoaXMKK0Egc3Vic3lzdGVtIG11c3QgcmVnaXN0ZXIgaXRzZWxmLCB1c3VhbGx5IGF0IG1vZHVsZV9pbml0IHRpbWUuICBUaGlzCiB0ZWxscyBjb25maWdmcyB0byBtYWtlIHRoZSBzdWJzeXN0ZW0gYXBwZWFyIGluIHRoZSBmaWxlIHRyZWUuCiAKIAlzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0CmluZGV4IGE1ODRmMDUuLjNkNzQ0NzcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlLnR4dApAQCAtMTExLDcgKzExMSw3IEBACiAKICAnd2FpdGluZycKIAotICBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHRyYW5zZmVyZWQgdG8KKyAgVGhlIG51bWJlciBvZiByZXF1ZXN0cyB3aGljaCBhcmUgd2FpdGluZyB0byBiZSB0cmFuc2ZlcnJlZCB0bwogICB1c2Vyc3BhY2Ugb3IgYmVpbmcgcHJvY2Vzc2VkIGJ5IHRoZSBmaWxlc3lzdGVtIGRhZW1vbi4gIElmIHRoZXJlIGlzCiAgIG5vIGZpbGVzeXN0ZW0gYWN0aXZpdHkgYW5kICd3YWl0aW5nJyBpcyBub24temVybywgdGhlbiB0aGUKICAgZmlsZXN5c3RlbSBpcyBodW5nIG9yIGRlYWRsb2NrZWQuCkBAIC0xMzYsNyArMTM2LDcgQEAKIAogICAyKSBJZiB0aGUgcmVxdWVzdCBpcyBub3QgeWV0IHNlbnQgdG8gdXNlcnNwYWNlIEFORCB0aGUgc2lnbmFsIGlzIG5vdAogICAgICBmYXRhbCwgdGhlbiBhbiAnaW50ZXJydXB0ZWQnIGZsYWcgaXMgc2V0IGZvciB0aGUgcmVxdWVzdC4gIFdoZW4KLSAgICAgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRyYW5zZmVyZWQgdG8gdXNlcnNwYWNlIGFuZAorICAgICB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgdG8gdXNlcnNwYWNlIGFuZAogICAgICB0aGlzIGZsYWcgaXMgc2V0LCBhbiBJTlRFUlJVUFQgcmVxdWVzdCBpcyBxdWV1ZWQuCiAKICAgMykgSWYgdGhlIHJlcXVlc3QgaXMgYWxyZWFkeSBzZW50IHRvIHVzZXJzcGFjZSwgdGhlbiBhbiBJTlRFUlJVUFQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaHBmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2hwZnMudHh0CmluZGV4IDMzZGMzNjAuLjM4YWJhMDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaHBmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9ocGZzLnR4dApAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgIEZpeGVkIHJhY2UtY29uZGl0aW9uIGluIGJ1ZmZlciBjb2RlIC0gaXQgaXMgaW4gYWxsIGZpbGVzeXN0ZW1zIGluIExpbnV4OwogICAgICAgICB3aGVuIHJlYWRpbmcgZGV2aWNlIChjYXQgL2Rldi9oZGEpIHdoaWxlIGNyZWF0aW5nIGZpbGVzIG9uIGl0LCBmaWxlcwogICAgICAgICBjb3VsZCBiZSBkYW1hZ2VkCi0yLjAyIFdvcmFyb3VuZCBmb3IgYnVnIGluIGJyZWFkYSBpbiBMaW51eC4gYnJlYWRhIGNvdWxkIGNhdXNlIGFjY2Vzc2VzIGJleW9uZAorMi4wMiBXb3JrYXJvdW5kIGZvciBidWcgaW4gYnJlYWRhIGluIExpbnV4LiBicmVhZGEgY291bGQgY2F1c2UgYWNjZXNzZXMgYmV5b25kCiAgICAgICAgIGVuZCBvZiBwYXJ0aXRpb24KIDIuMDMgQ2hhciwgYmxvY2sgZGV2aWNlcyBhbmQgcGlwZXMgYXJlIGNvcnJlY3RseSBjcmVhdGVkCiAgICAgIEZpeGVkIG5vbi1jcmFzaGluZyByYWNlIGluIHVubGluayAoQWxleGFuZGVyIFZpcm8pCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dAppbmRleCAzNWYxMDViLi4xM2JhNjQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKQEAgLTMzNyw3ICszMzcsNyBAQAogdGhpcyAobm90ZSBhbGwgdmFsdWVzIGFyZSBpbiA1MTItYnl0ZSBzZWN0b3JzKToKIAogLS0tIGN1dCBoZXJlIC0tLQotIyBPZnMgU2l6ZSAgIFJhaWQgICBMb2cgIE51bWJlciBSZWdpb24gU2hvdWxkIE51bWJlciBTb3VyY2UgIFN0YXJ0IFRhZ2V0ICBTdGFydAorIyBPZnMgU2l6ZSAgIFJhaWQgICBMb2cgIE51bWJlciBSZWdpb24gU2hvdWxkIE51bWJlciBTb3VyY2UgIFN0YXJ0IFRhcmdldCBTdGFydAogIyBpbiAgb2YgdGhlIHR5cGUgICB0eXBlIG9mIGxvZyBzaXplICAgc3luYz8gIG9mICAgICBEZXZpY2UgIGluICAgIERldmljZSBpbgogIyB2b2wgdm9sdW1lCQkgcGFyYW1zCQkgICAgIG1pcnJvcnMJICAgICBEZXZpY2UJICBEZXZpY2UKIDAgICAgMjA1NjMyMCBtaXJyb3IgY29yZSAyCTE2ICAgICBub3N5bmMgMgkgICAvZGV2L2hkYTEgMCAgIC9kZXYvaGRiMSAwCkBAIC01OTksNyArNTk5LDcgQEAKIAktIE1ham9yIGJ1ZyBmaXhlcyBmb3IgcmVhZGluZyBmaWxlcyBhbmQgdm9sdW1lcyBpbiBjb3JuZXIgY2FzZXMgd2hpY2gKIAkgIHdlcmUgYmVpbmcgaGl0IGJ5IFdpbmRvd3MgMmsvWFAgdXNlcnMuCiAyLjEuMjoKLQktIE1ham9yIGJ1ZyBmaXhlcyBhbGV2aWF0aW5nIHRoZSBoYW5ncyBpbiBzdGF0ZnMgZXhwZXJpZW5jZWQgYnkgc29tZQorCS0gTWFqb3IgYnVnIGZpeGVzIGFsbGV2aWF0aW5nIHRoZSBoYW5ncyBpbiBzdGF0ZnMgZXhwZXJpZW5jZWQgYnkgc29tZQogCSAgdXNlcnMuCiAyLjEuMToKIAktIFVwZGF0ZSBoYW5kbGluZyBvZiBjb21wcmVzc2VkIGZpbGVzIHNvIHBlb3BsZSBubyBsb25nZXIgZ2V0IHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vY2ZzMi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dAppbmRleCA0Mzg5YzY4Li5hZjZkZWZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dApAQCAtMzAsNyArMzAsNyBAQAogRmVhdHVyZXMgd2hpY2ggT0NGUzIgZG9lcyBub3Qgc3VwcG9ydCB5ZXQ6CiAJLSBzcGFyc2UgZmlsZXMKIAktIGV4dGVuZGVkIGF0dHJpYnV0ZXMKLQktIHNoYXJlZCB3cml0ZWFibGUgbW1hcAorCS0gc2hhcmVkIHdyaXRhYmxlIG1tYXAKIAktIGxvb3BiYWNrIGlzIHN1cHBvcnRlZCwgYnV0IGRhdGEgd3JpdHRlbiB3aWxsIG5vdAogCSAgYmUgY2x1c3RlciBjb2hlcmVudC4KIAktIHF1b3RhcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggMzM1NWU2OS4uNzJhZjVkZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xMjIwLDkgKzEyMjAsOSBAQAogeW91IHByb2JhYmx5IHNob3VsZCBpbmNyZWFzZSB0aGUgbG93ZXJfem9uZV9wcm90ZWN0aW9uIHNldHRpbmcuCiAKIFRoZSB1bml0cyBvZiB0aGlzIHR1bmFibGUgYXJlIGZhaXJseSB2YWd1ZS4gIEl0IGlzIGFwcHJveGltYXRlbHkgZXF1YWwKLXRvICJtZWdhYnl0ZXMiLiAgU28gc2V0dGluZyBsb3dlcl96b25lX3Byb3RlY3Rpb249MTAwIHdpbGwgcHJvdGVjdCBhcm91bmQgMTAwCit0byAibWVnYWJ5dGVzLCIgc28gc2V0dGluZyBsb3dlcl96b25lX3Byb3RlY3Rpb249MTAwIHdpbGwgcHJvdGVjdCBhcm91bmQgMTAwCiBtZWdhYnl0ZXMgb2YgdGhlIGxvd21lbSB6b25lIGZyb20gdXNlciBhbGxvY2F0aW9ucy4gIEl0IHdpbGwgYWxzbyBtYWtlCi10aG9zZSAxMDAgbWVnYWJ5dGVzIHVuYXZhbGlhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb25zIGFuZCBieQordGhvc2UgMTAwIG1lZ2FieXRlcyB1bmF2YWlsYWJsZSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyBhbmQgYnkKIHBhZ2VjYWNoZSwgc28gdGhlcmUgaXMgYSBjb3N0LgogCiBUaGUgZWZmZWN0cyBvZiB0aGlzIHR1bmFibGUgbWF5IGJlIG9ic2VydmVkIGJ5IG1vbml0b3JpbmcKQEAgLTE1MzgsMTAgKzE1MzgsMTAgQEAKIHRjcF9lY24KIC0tLS0tLS0KIAotVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIEVDTiBiaXQgaW4gdGhlIElQdjQgaGVhZGVycywgdGhpcyBpcyBhIG5ldworVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIEVDTiBiaXQgaW4gdGhlIElQdjQgaGVhZGVycy4gVGhpcyBpcyBhIG5ldwogZmVhdHVyZSBhYm91dCBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiwgYnV0IHNvbWUgcm91dGVycyBhbmQgZmlyZXdhbGxzCi1ibG9jayB0cmFmaWMgdGhhdCBoYXMgdGhpcyBiaXQgc2V0LCBzbyBpdCBjb3VsZCBiZSBuZWNlc3NhcnkgdG8gZWNobyAwIHRvCi0vcHJvYy9zeXMvbmV0L2lwdjQvdGNwX2VjbiwgaWYgeW91IHdhbnQgdG8gdGFsayB0byB0aGlzIHNpdGVzLiBGb3IgbW9yZSBpbmZvCitibG9jayB0cmFmZmljIHRoYXQgaGFzIHRoaXMgYml0IHNldCwgc28gaXQgY291bGQgYmUgbmVjZXNzYXJ5IHRvIGVjaG8gMCB0bworL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9lY24gaWYgeW91IHdhbnQgdG8gdGFsayB0byB0aGVzZSBzaXRlcy4gRm9yIG1vcmUgaW5mbwogeW91IGNvdWxkIHJlYWQgUkZDMjQ4MS4KIAogdGNwX3JldHJhbnNfY29sbGFwc2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3B1ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcHVmcy50eHQKaW5kZXggOTgyNjQ1YS4uMTM0M2QxMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcHVmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcHVmcy50eHQKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgL3NpZ25hbDIKICAgICAgICBUaGUgdHdvIHNpZ25hbCBub3RpZmljYXRpb24gY2hhbm5lbHMgb2YgYW4gU1BVLiAgVGhlc2UgIGFyZSAgcmVhZC13cml0ZQogICAgICAgIGZpbGVzICB0aGF0ICBvcGVyYXRlICBvbiAgYSAzMiBiaXQgd29yZC4gIFdyaXRpbmcgdG8gb25lIG9mIHRoZXNlIGZpbGVzCi0gICAgICAgdHJpZ2dlcnMgYW4gaW50ZXJydXB0IG9uIHRoZSBTUFUuIFRoZSAgdmFsdWUgIHdyaXR0aW5nICB0byAgdGhlICBzaWduYWwKKyAgICAgICB0cmlnZ2VycyBhbiBpbnRlcnJ1cHQgb24gdGhlIFNQVS4gIFRoZSAgdmFsdWUgIHdyaXR0ZW4gIHRvICB0aGUgIHNpZ25hbAogICAgICAgIGZpbGVzIGNhbiBiZSByZWFkIGZyb20gdGhlIFNQVSB0aHJvdWdoIGEgY2hhbm5lbCByZWFkIG9yIGZyb20gaG9zdCB1c2VyCiAgICAgICAgc3BhY2UgdGhyb3VnaCB0aGUgZmlsZS4gIEFmdGVyIHRoZSB2YWx1ZSBoYXMgYmVlbiByZWFkIGJ5IHRoZSAgU1BVLCAgaXQKICAgICAgICBpcyAgcmVzZXQgIHRvIHplcm8uICBUaGUgcG9zc2libGUgb3BlcmF0aW9ucyBvbiBhbiBvcGVuIHNpZ25hbDEgb3Igc2lnLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mdGFwZS50eHQgYi9Eb2N1bWVudGF0aW9uL2Z0YXBlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4YmIzMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Z0YXBlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi1JbnRybwotPT09PT0KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBzb21lIGlzc3VlcyBpbnZvbHZlZCB3aGVuIHVzaW5nIHRoZSAiZnRhcGUiCi1mbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyIHRoYXQgY29tZXMgd2l0aCB0aGUgTGludXgga2VybmVsLgotCi1mdGFwZSBoYXMgYSBob21lIHBhZ2UgYXQKLQotaHR0cDovL2Z0YXBlLmRvdC1oZWluZS5kZS8KLQotd2hpY2ggY29udGFpbnMgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBmdGFwZS4gUGxlYXNlIGNyb3NzIGNoZWNrCi10aGlzIFdXVyBhZGRyZXNzIGFnYWluc3QgdGhlIGFkZHJlc3MgZ2l2ZW4gKGlmIGFueSkgaW4gdGhlIE1BSU5UQUlORVJTCi1maWxlIGxvY2F0ZWQgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UKLXRyZWUuCi0KLU5PVEU6IFRoaXMgaXMgYW4gdW5tYWludGFpbmVkIHNldCBvZiBkcml2ZXJzLCBhbmQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gd29yay4KLUlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0YWtpbmcgb3ZlciBtYWludGVuYW5jZSwgY29udGFjdCBDbGF1cy1KdXN0dXMgSGVpbmUKLTxjaEBkb3QtaGVpbmUuZGU+LCB0aGUgZm9ybWVyIG1haW50YWluZXIuCi0KLUNvbnRlbnRzCi09PT09PT09PQotCi1BIG1pbnVzIDE6IEZ0YXBlIGRvY3VtZW50YXRpb24KLQotQS4gQ2hhbmdlcwotICAgMS4gR29hbAotICAgMi4gSS9PIEJsb2NrIFNpemUKLSAgIDMuIFdyaXRlIEFjY2VzcyB3aGVuIG5vdCBhdCBFT0QgKEVuZCBPZiBEYXRhKSBvciBCT1QgKEJlZ2luIE9mIFRhcGUpCi0gICA0LiBGb3JtYXR0aW5nCi0gICA1LiBJbnRlcmNoYW5naW5nIGNhcnRyaWRnZXMgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcwotCi1CLiBEZWJ1Z2dpbmcgT3V0cHV0Ci0gICAxLiBJbnRyb2R1Y3Rpb24KLSAgIDIuIFR1bmluZyB0aGUgZGVidWdnaW5nIG91dHB1dAotCi1DLiBCb290IGFuZCBsb2FkIHRpbWUgY29uZmlndXJhdGlvbgotICAgMS4gU2V0dGluZyBib290IHRpbWUgcGFyYW1ldGVycwotICAgMi4gTW9kdWxlIGxvYWQgdGltZSBwYXJhbWV0ZXJzCi0gICAzLiBGdGFwZSBib290LSBhbmQgbG9hZCB0aW1lIG9wdGlvbnMKLSAgIDQuIEV4YW1wbGUga2VybmVsIHBhcmFtZXRlciBzZXR0aW5nCi0gICA1LiBFeGFtcGxlIG1vZHVsZSBwYXJhbWV0ZXIgc2V0dGluZwotCi1ELiBTdXBwb3J0IGFuZCBjb250YWN0cwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUEgbWludXMgMS4gRnRhcGUgZG9jdW1lbnRhdGlvbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVVubHVja2lseSwgdGhlIGZ0YXBlLUhPV1RPIGlzIG91dCBvZiBkYXRlLiBUaGlzIHJlYWxseSBuZWVkcyB0byBiZQotY2hhbmdlZC4gVXAgdG8gZGF0ZSBkb2N1bWVudGF0aW9uIGFzIHdlbGwgYXMgcmVjZW50IGRldmVsb3BtZW50Ci12ZXJzaW9ucyBvZiBmdGFwZSBhbmQgdXNlZnVsIGxpbmtzIHRvIHJlbGF0ZWQgdG9waWNzIGNhbiBiZSBmb3VuZCBhdAotdGhlIGZ0YXBlIGhvbWUgcGFnZSBhdAotCi1odHRwOi8vZnRhcGUuZG90LWhlaW5lLmRlLwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUEuIENoYW5nZXMKLT09PT09PT09PT0KLQotMS4gR29hbAotICAgfn5+fgotICAgVGhlIGdvYWwgb2YgYWxsIHRoYXQgaW5jb21wYXRpYmlsaXRpZXMgd2FzIHRvIGdpdmUgZnRhcGUgYW4gaW50ZXJmYWNlCi0gICB0aGF0IHJlc2VtYmxlcyB0aGUgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IFNDU0kgdGFwZSBkcml2ZXMgYXMgY2xvc2UKLSAgIGFzIHBvc3NpYmxlLiBUaHVzIGFueSBVbml4IGJhY2t1cCBwcm9ncmFtIHRoYXQgaXMga25vd24gdG8gd29yawotICAgd2l0aCBTQ1NJIHRhcGUgZHJpdmVzIHNob3VsZCBhbHNvIHdvcmsuCi0KLSAgIFRoZSBjb25jZXB0IG9mIGEgZml4ZWQgYmxvY2sgc2l6ZSBmb3IgcmVhZC93cml0ZSB0cmFuc2ZlcnMgaXMKLSAgIHJhdGhlciB1bnJlbGF0ZWQgdG8gdGhpcyBTQ1NJIHRhcGUgY29tcGF0aWJpbGl0eSBhdCB0aGUgZmlsZSBzeXN0ZW0KLSAgIGludGVyZmFjZSBsZXZlbC4gSXQgZGV2ZWxvcGVkIG91dCBvZiBhIGZlYXR1cmUgb2YgemZ0YXBlLCBhCi0gICBibG9jayB3aXNlIHVzZXIgdHJhbnNwYXJlbnQgb24tdGhlLWZseSBjb21wcmVzc2lvbi4gVGhhdCBjb21wcmVzc2lvbgotICAgc3VwcG9ydCB3aWxsIG5vdCBiZSBkcm9wcGVkIGluIGZ1dHVyZSByZWxlYXNlcyBmb3IgY29tcGF0aWJpbGl0eQotICAgcmVhc29ucyB3aXRoIHByZXZpb3VzIHJlbGVhc2VzIG9mIHpmdGFwZS4KLQotMi4gSS9PIEJsb2NrIFNpemUKLSAgIH5+fn5+fn5+fn5+fn5+Ci0gICBUaGUgYmxvY2sgc2l6ZSBkZWZhdWx0cyB0byAxMGsgd2hpY2ggaXMgdGhlIGRlZmF1bHQgYmxvY2sgc2l6ZSBvZgotICAgR05VIHRhci4KLQotICAgVGhlIGJsb2NrIHNpemUgY2FuIGJlIHR1bmVkIGVpdGhlciBkdXJpbmcga2VybmVsIGNvbmZpZ3VyYXRpb24gb3IKLSAgIGF0IHJ1bnRpbWUgd2l0aCB0aGUgTVRJT0NUT1AgaW9jdGwgdXNpbmcgdGhlIE1UU0VUQkxLIG9wZXJhdGlvbgotICAgKGkuZS4gZG8gIm10IC1mIC9kZXYvcWZ0MCIgc2V0YmxrICNCTEtTWikuIEEgYmxvY2sgc2l6ZSBvZiAwCi0gICBzd2l0Y2hlcyB0byB2YXJpYWJsZSBibG9jayBzaXplIG1vZGUgaS5lLiAibXQgc2V0YmxrIDAiIHN3aXRjaGVzCi0gICBvZmYgdGhlIGJsb2NrIHNpemUgcmVzdHJpY3Rpb24uIEhvd2V2ZXIsIHRoaXMgZGlzYWJsZXMgemZ0YXBlJ3MKLSAgIGJ1aWx0IGluIG9uLXRoZS1mbHkgY29tcHJlc3Npb24gd2hpY2ggZG9lc24ndCB3b3JrIHdpdGggdmFyaWFibGUKLSAgIGJsb2NrIHNpemUgbW9kZS4KLQotICAgVGhlIEJMS1NaIHBhcmFtZXRlciBtdXN0IGJlIGdpdmVuIGFzIGEgYnl0ZSBjb3VudCBhbmQgbXVzdCBiZSBhCi0gICBtdWx0aXBsZSBvZiAzMmsgb3IgMCwgaS5lLiB1c2UgIm10IHNldGJsayAzMjc2OCIgdG8gc3dpdGNoIHRvIGEKLSAgIGJsb2NrIHNpemUgb2YgMzJrLgotCi0gICBUaGUgdHlwaWNhbCBzeW1wdG9tIG9mIGEgYmxvY2sgc2l6ZSBtaXNtYXRjaCBpcyBhbiAiaW52YWxpZAotICAgYXJndW1lbnQiIGVycm9yIG1lc3NhZ2UuCi0KLTMuIFdyaXRlIEFjY2VzcyB3aGVuIG5vdCBhdCBFT0QgKEVuZCBPZiBEYXRhKSBvciBCT1QgKEJlZ2luIE9mIFRhcGUpCi0gICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgemZ0YXBlICh0aGUgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIG9mIGZ0YXBlLTMueCkgZGVuaWVzIHdyaXRlIGFjY2VzcwotICAgdG8gdGhlIHRhcGUgY2FydHJpZGdlIHdoZW4gaXQgaXNuJ3QgcG9zaXRpb25lZCBlaXRoZXIgYXQgQk9UIG9yCi0gICBFT0QuCi0KLTQuIEZvcm1hdHRpbmcKLSAgIH5+fn5+fn5+fn4KLSAgIGZ0YXBlIERPRVMgc3VwcG9ydCBmb3JtYXR0aW5nIG9mIGZsb3BweSB0YXBlIGNhcnRyaWRnZXMuIFlvdSBuZWVkIHRoZQotICAgYGZ0Zm9ybWF0JyBwcm9ncmFtIHRoYXQgaXMgc2hpcHBlZCB3aXRoIHRoZSBtb2R1bGVzIHZlcnNpb24gb2YgZnRhcGUuCi0gICBQbGVhc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBmdGFwZSBmcm9tCi0KLSAgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgva2VybmVsL3RhcGVzCi0KLSAgIG9yIGZyb20gdGhlIGZ0YXBlIGhvbWUgcGFnZSBhdAotCi0gICBodHRwOi8vZnRhcGUuZG90LWhlaW5lLmRlLwotCi0gICBgZnRmb3JtYXQnIGlzIGNvbnRhaW5lZCBpbiB0aGUgYC4vY29udHJpYi8nIHN1YmRpcmVjdG9yeSBvZiB0aGF0Ci0gICBzZXBhcmF0ZSBmdGFwZSBwYWNrYWdlLgotCi01LiBJbnRlcmNoYW5naW5nIGNhcnRyaWRnZXMgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcwotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotICAgVGhlIGludGVybmFsIGVtdWxhdGlvbiBvZiBVbml4IHRhcGUgZGV2aWNlIGZpbGUgbWFya3MgaGFzIGNoYW5nZWQKLSAgIGNvbXBsZXRlbHkuIGZ0YXBlIG5vdyB1c2VzIHRoZSB2b2x1bWUgdGFibGUgc2VnbWVudCBhcyBzcGVjaWZpZWQKLSAgIGJ5IHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwLzExMyBzdGFuZGFyZHMgdG8gZW11bGF0ZSBmaWxlIG1hcmtzLiBBcwotICAgYSBjb25zZXF1ZW5jZSB0aGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQgdG8gaW50ZXJjaGFuZ2UgY2FydHJpZGdlcwotICAgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KLQotICAgVG8gYmUgbW9yZSBwcmVjaXNlOiBmdGFwZSB3aWxsIGRldGVjdCB2b2x1bWVzIHdyaXR0ZW4gYnkgb3RoZXIgT1MncwotICAgcHJvZ3JhbXMgYW5kIG90aGVyIE9TJ3MgcHJvZ3JhbXMgd2lsbCBkZXRlY3Qgdm9sdW1lcyB3cml0dGVuIGJ5Ci0gICBmdGFwZS4KLQotICAgSG93ZXZlciwgaXQgaXNuJ3QgcG9zc2libGUgdG8gZXh0cmFjdCB0aGUgZGF0YSBkdW1wZWQgdG8gdGhlIHRhcGUKLSAgIGJ5IHNvbWUgTVNET1MgcHJvZ3JhbSB3aXRoIGZ0YXBlLiBUaGlzIGV4Y2VlZHMgdGhlIHNjb3BlIG9mIGEKLSAgIGtlcm5lbCBkZXZpY2UgZHJpdmVyLiBJZiB5b3UgbmVlZCBzdWNoIGZ1bmN0aW9uYWxpdHksIHRoZW4gZ28gYWhlYWQKLSAgIGFuZCB3cml0ZSBhIHVzZXIgc3BhY2UgdXRpbGl0eSB0aGF0IGlzIGFibGUgdG8gZG8gdGhhdC4gZnRhcGUgYWxyZWFkeQotICAgcHJvdmlkZXMgYWxsIGtlcm5lbCBsZXZlbCBzdXBwb3J0IG5lY2Vzc2FyeSB0byBkbyB0aGF0LgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUIuIERlYnVnZ2luZyBPdXRwdXQKLSAgID09PT09PT09PT09PT09PT0KLQotMS4gSW50cm9kdWN0aW9uCi0gICB+fn5+fn5+fn5+fn4KLSAgIFRoZSBmdGFwZSBkcml2ZXIgY2FuIGJlIHZlcnkgbm9pc3kgaW4gdGhhdCBpcyBjYW4gcHJpbnQgbG90cyBvZgotICAgZGVidWdnaW5nIG1lc3NhZ2VzIHRvIHRoZSBrZXJuZWwgbG9nIGZpbGVzIGFuZCB0aGUgc3lzdGVtIGNvbnNvbGUuCi0gICBXaGlsZSB0aGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGl0IG1pZ2h0IGJlIGFubm95aW5nIGR1cmluZwotICAgbm9ybWFsIHVzZSBhbmQgZW5sYXJnZXMgdGhlIHNpemUgb2YgdGhlIGRyaXZlciBieSBzZXZlcmFsIGtpbG9ieXRlcy4KLQotICAgVG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgeW91IGNhbiB0cmltIHRoZSBtYXhpbWFsIGFtb3VudCBvZgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBkdXJpbmcga2VybmVsIGNvbmZpZ3VyYXRpb24uIFBsZWFzZQotICAgcmVmZXIgdG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIHNjcmlwdCBhbmQgaXRzIG9uLWxpbmUgaGVscAotICAgZnVuY3Rpb25hbGl0eS4KLQotICAgVGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IG1hcHMgdG8gdGhlICJ0cmFjaW5nIiBib290IHRpbWUKLSAgIG9wdGlvbiBhbmQgdGhlICJmdF90cmFjaW5nIiBtb2R1bGVzIG9wdGlvbiBhcyBmb2xsb3dzOgotCi0gICAwICAgICAgICAgICAgICBidWdzCi0gICAxICAgICAgICAgICAgICArIGVycm9ycyAod2l0aCBjYWxsLXN0YWNrIGR1bXApCi0gICAyICAgICAgICAgICAgICArIHdhcm5pbmdzCi0gICAzICAgICAgICAgICAgICArIGluZm9ybWF0aW9uCi0gICA0ICAgICAgICAgICAgICArIG1vcmUgaW5mb3JtYXRpb24KLSAgIDUgICAgICAgICAgICAgICsgcHJvZ3JhbSBmbG93Ci0gICA2ICAgICAgICAgICAgICArIGZkYy9kbWEgaW5mbwotICAgNyAgICAgICAgICAgICAgKyBkYXRhIGZsb3cKLSAgIDggICAgICAgICAgICAgICsgZXZlcnl0aGluZyBlbHNlCi0KLTIuIFR1bmluZyB0aGUgZGVidWdnaW5nIG91dHB1dAotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICBUbyByZWR1Y2UgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IHByaW50ZWQgdG8gdGhlIHN5c3RlbQotICAgY29uc29sZSB5b3UgY2FuCi0KLSAgIGkpICB0cmltIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGF0IHJ1bi10aW1lIHdpdGgKLQotICAgICAgIG10IC1mIC9kZXYvbnFmdDAgc2V0ZGVuc2l0eSAjREJHTFZMCi0KLSAgICAgICB3aGVyZSAiI0RCR0xWTCIgaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5Ci0KLSAgIGlpKSB0cmltIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGF0IG1vZHVsZSBsb2FkIHRpbWUgd2l0aAotCi0gICAgICAgbW9kcHJvYmUgZnRhcGUgZnRfdHJhY2luZz0jREJHTFZMCi0KLSAgICAgICBPZiBjb3Vyc2UsIHRoaXMgYXBwbGllcyBvbmx5IGlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgZnRhcGUgdG8gYmUKLSAgICAgICBjb21waWxlZCBhcyBhIG1vZHVsZS4KLQotICAgaWlpKSB0cmltIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGR1cmluZyBzeXN0ZW0gYm9vdCB0aW1lLiBBZGQgdGhlCi0gICAgICAgZm9sbG93aW5nIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgotCi0gICAgICAgZnRhcGU9I0RCR0xWTCx0cmFjaW5nCi0KLSAgICAgICBQbGVhc2UgcmVmZXIgYWxzbyB0byB0aGUgbmV4dCBzZWN0aW9uIGlmIHlvdSBkb24ndCBrbm93IGhvdyB0bwotICAgICAgIHNldCBib290IHRpbWUgcGFyYW1ldGVycy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1DLiBCb290IGFuZCBsb2FkIHRpbWUgY29uZmlndXJhdGlvbgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotMS4gU2V0dGluZyBib290IHRpbWUgcGFyYW1ldGVycwotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAKLSAgIEFzc3VtaW5nIHRoYXQgeW91IHVzZSBsaWxvLCB0aGUgTEkpbnV4IExPKWFkZXIsIGJvb3QgdGltZSBrZXJuZWwKLSAgIHBhcmFtZXRlcnMgY2FuIGJlIHNldCBieSBhZGRpbmcgYSBsaW5lCi0KLSAgIGFwcGVuZCBzb21lX2tlcm5lbF9ib290X3RpbWVfcGFyYW1ldGVyCi0KLSAgIHRvIGAvZXRjL2xpbG8uY29uZicgb3IgYXQgcmVhbCBib290IHRpbWUgYnkgdHlwaW5nIGluIHRoZSBvcHRpb25zCi0gICBhdCB0aGUgcHJvbXB0IHByb3ZpZGVkIGJ5IExJTE8uIEkgY2FuJ3QgZ2l2ZSB5b3UgYWR2aWNlIG9uIGhvdyB0bwotICAgc3BlY2lmeSB0aG9zZSBwYXJhbWV0ZXJzIHdpdGggb3RoZXIgbG9hZGVycyBhcyBJIGRvbid0IHVzZSB0aGVtLgotCi0gICBGb3IgZnRhcGUsIGVhY2ggInNvbWVfa2VybmVsX2Jvb3RfdGltZV9wYXJhbWV0ZXIiIGxvb2tzIGxpa2UKLSAgICJmdGFwZT12YWx1ZSxvcHRpb24iLiBBcyBhbiBleGFtcGxlLCB0aGUgZGVidWdnaW5nIG91dHB1dCBjYW4gYmUKLSAgIGluY3JlYXNlZCB3aXRoCi0KLSAgIGZ0YXBlPTQsdHJhY2luZwotCi0gICBOT1RFOiB0aGUgdmFsdWUgcHJlY2VkZXMgdGhlIG9wdGlvbiBuYW1lLgotCi0yLiBNb2R1bGUgbG9hZCB0aW1lIHBhcmFtZXRlcnMKLSAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgTW9kdWxlIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgZGlyZWN0bHkgd2hlbiBpbnZva2luZwotICAgdGhlIHByb2dyYW0gJ21vZHByb2JlJyBhdCB0aGUgc2hlbGwgcHJvbXB0OgotCi0gICBtb2Rwcm9iZSBmdGFwZSBmdF90cmFjaW5nPTQKLQotICAgb3IgYnkgZWRpdGluZyB0aGUgZmlsZSBgL2V0Yy9tb2Rwcm9iZS5jb25mJyBpbiB3aGljaCBjYXNlIHRoZXkgdGFrZQotICAgZWZmZWN0IGVhY2ggdGltZSB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkIHdpdGggYG1vZHByb2JlJyAocGxlYXNlCi0gICByZWZlciB0byB0aGUgcmVzcGVjdGl2ZSBtYW51YWwgcGFnZXMpLiBUaHVzLCB5b3Ugc2hvdWxkIGFkZCBhIGxpbmUKLQotICAgb3B0aW9ucyBmdGFwZSBmdF90cmFjaW5nPTQKLQotICAgdG8gYC9ldGMvbW9kcHJvYmUuY29uZmAgaWYgeW91IGludGVuZCB0byBpbmNyZWFzZSB0aGUgZGVidWdnaW5nCi0gICBvdXRwdXQgb2YgdGhlIGRyaXZlci4KLQotCi0zLiBGdGFwZSBib290LSBhbmQgbG9hZCB0aW1lIG9wdGlvbnMKLSAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0gICBpLiAgIENvbnRyb2xsaW5nIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dAotICAgICAgICBEQkdMVkwgaGFzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOC4KLQotICAgICAgICBtb2R1bGUgICAgICAgICAgICAgICAgIHwgIGtlcm5lbCBjb21tYW5kIGxpbmUKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBmdF90cmFjaW5nPURCR0xWTCAgICAgIHwgIGZ0YXBlPURCR0xWTCx0cmFjaW5nCi0KLSAgIGlpLiAgSGFyZHdhcmUgc2V0dXAKLQlCQVNFIGlzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBmbG9wcHkgZGlzayBjb250cm9sbGVyLAotICAgICAgICBJUlEgYW5kIERNQSBnaXZlIGl0cyBpbnRlcnJ1cHQgYW5kIERNQSBjaGFubmVsLCByZXNwZWN0aXZlbHkuCi0gICAgICAgIEJPT0wgaXMgYW4gaW50ZWdlciwgIjAiIG1lYW5zICJubyI7IGFueSBvdGhlciB2YWx1ZSBtZWFucwotCSJ5ZXMiLiBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGFueXRoaW5nIGlmIGNvbm5lY3RpbmcgeW91ciB0YXBlCi0gICAgICAgIGRyaXZlIHRvIHRoZSBzdGFuZGFyZCBmbG9wcHkgZGlzayBjb250cm9sbGVyLiBBbGwgb2YgdGhlc2UKLQl2YWx1ZXMgaGF2ZSByZWFzb25hYmxlIGRlZmF1bHRzLiBUaGUgZGVmYXVsdHMgY2FuIGJlIG1vZGlmaWVkCi0JZHVyaW5nIGtlcm5lbCBjb25maWd1cmF0aW9uLCBpLmUuIHdoaWxlIHJ1bm5pbmcgIm1ha2UgY29uZmlnIiwKLQkibWFrZSBtZW51Y29uZmlnIiBvciAibWFrZSB4Y29uZmlnIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeQotCW9mIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIHRyZWUuIFBsZWFzZSByZWZlciBhbHNvIHRvIHRoZSBvbgotCWxpbmUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCBkdXJpbmcgdGhhdCBrZXJuZWwgY29uZmlndXJhdGlvbgotCXByb2Nlc3MuCi0KLQlmdF9wcm9iZV9mYzEwIGlzIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlIGlmIHlvdSB3aXNoIGZvciBmdGFwZSB0bwotCXByb2JlIGZvciBhIENvbG9yYWRvIEZDLTEwIG9yIEZDLTIwIGNvbnRyb2xsZXIuCi0KLQlmdF9tYWNoMiBpcyBzZXQgdG8gYSBub24temVybyB2YWx1ZSBpZiB5b3Ugd2lzaCBmb3IgZnRhcGUgdG8gcHJvYmUKLQlmb3IgYSBNb3VudGFpbiBNQUNILTIgY29udHJvbGxlci4KLQotICAgICAgICBtb2R1bGUgICAgICAgICAgICAgICAgIHwgIGtlcm5lbCBjb21tYW5kIGxpbmUKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBmdF9mZGNfYmFzZT1CQVNFICAgICAgIHwgIGZ0YXBlPUJBU0UsaW9wb3J0Ci0gICAgICAgIGZ0X2ZkY19pcnE9SVJRICAgICAgICAgfCAgZnRhcGU9SVJRLGlycQotICAgICAgICBmdF9mZGNfZG1hPURNQSAgICAgICAgIHwgIGZ0YXBlPURNQSxkbWEKLSAgICAgICAgZnRfcHJvYmVfZmMxMD1CT09MICAgICB8ICBmdGFwZT1CT09MLGZjMTAKLSAgICAgICAgZnRfbWFjaDI9Qk9PTCAgICAgICAgICB8ICBmdGFwZT1CT09MLG1hY2gyCi0gICAgICAgIGZ0X2ZkY190aHJlc2hvbGQ9VEhSICAgfCAgZnRhcGU9VEhSLHRocmVzaG9sZAotICAgICAgICBmdF9mZGNfcmF0ZV9saW1pdD1SQVRFIHwgIGZ0YXBlPVJBVEUsZGF0YXJhdGUKLQotNC4gRXhhbXBsZSBrZXJuZWwgcGFyYW1ldGVyIHNldHRpbmcKLSAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IAotICAgVG8gY29uZmlndXJlIGZ0YXBlIHRvIHByb2JlIGZvciBhIENvbG9yYWRvIEZDLTEwL0ZDLTIwIGNvbnRyb2xsZXIKLSAgIGFuZCB0byBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIGRlYnVnZ2luZyBvdXRwdXQgYSBsaXR0bGUgYml0LCBhZGQKLSAgIHRoZSBmb2xsb3dpbmcgbGluZSB0byBgL2V0Yy9saWxvLmNvbmYnOgotCi0gICBhcHBlbmQgZnRhcGU9MSxmYzEwIGZ0YXBlPTQsdHJhY2luZwotCi01LiBFeGFtcGxlIG1vZHVsZSBwYXJhbWV0ZXIgc2V0dGluZwotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgIFRvIGRvIHRoZSBzYW1lLCBidXQgd2l0aCBmdGFwZSBjb21waWxlZCBhcyBhIGxvYWRhYmxlIGtlcm5lbAotICAgbW9kdWxlLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGAvZXRjL21vZHByb2JlLmNvbmYnOgotCi0gICBvcHRpb25zIGZ0YXBlIGZ0X3Byb2JlX2ZjMTA9MSBmdF90cmFjaW5nPTQKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1ELiBTdXBwb3J0IGFuZCBjb250YWN0cwotICAgPT09PT09PT09PT09PT09PT09PT0KLQotICAgRnRhcGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGVyZSBpcwotICAgYWJzb2x1dGVseSBubyB3YXJyYW50eSBmb3IgdGhpcyBzb2Z0d2FyZS4gSG93ZXZlciwgeW91IGNhbiByZWFjaAotICAgdGhlIGN1cnJlbnQgbWFpbnRhaW5lciBvZiB0aGUgZnRhcGUgcGFja2FnZSB1bmRlciB0aGUgZW1haWwgYWRkcmVzcwotICAgZ2l2ZW4gaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgd2hpY2ggaXMgbG9jYXRlZCBpbiB0aGUgdG9wIGxldmVsCi0gICBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UgdHJlZS4gVGhlcmUgeW91J2xsIGZpbmQgYWxzbwotICAgdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCB0byB1c2UgYXMgYSBkaXNjdXNzaW9uIGZvcnVtIGFuZCB0aGUgd2ViCi0gICBwYWdlIHRvIHF1ZXJ5IGZvciB0aGUgbW9zdCByZWNlbnQgZG9jdW1lbnRhdGlvbiwgcmVsYXRlZCB3b3JrIGFuZAotICAgZGV2ZWxvcG1lbnQgdmVyc2lvbnMgb2YgZnRhcGUuCi0KLSAgIENoYW5nZWxvZzoKLSAgID09PT09PT09PT0KLQotfjE5OTY6CQlPcmlnaW5hbCBEb2N1bWVudAotCi0xMC0yNC0yMDA0OglHZW5lcmFsIGNsZWFudXAgYW5kIHVwZGF0aW5nLCBub3RpbmcgYWRkaXRpb25hbCBtb2R1bGUgb3B0aW9ucy4KLQkJSmFtZXMgTmVsc29uIDxqYW1lczQ3NjVAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mdWppdHN1L2Zydi9nZGJzdHViLnR4dCBiL0RvY3VtZW50YXRpb24vZnVqaXRzdS9mcnYvZ2Ric3R1Yi50eHQKaW5kZXggNmNlNWFhOS4uOTMwNGZiMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mdWppdHN1L2Zydi9nZGJzdHViLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Z1aml0c3UvZnJ2L2dkYnN0dWIudHh0CkBAIC01OSw3ICs1OSw3IEBACiBUaGVuIGJ1aWxkIGFzIHVzdWFsLCBkb3dubG9hZCB0byB0aGUgYm9hcmQgYW5kIGV4ZWN1dGUuIE5vdGUgdGhhdCBpZgogIkltbWVkaWF0ZSBhY3RpdmF0aW9uIiB3YXMgc2VsZWN0ZWQsIHRoZW4gdGhlIGtlcm5lbCB3aWxsIHdhaXQgZm9yIEdEQiB0bwogYXR0YWNoLiBJZiBub3QsIHRoZW4gdGhlIGtlcm5lbCB3aWxsIGJvb3QgaW1tZWRpYXRlbHkgYW5kIEdEQiB3aWxsIGhhdmUgdG8KLWludGVydXB0IGl0IG9yIHdhaXQgZm9yIGFuIGV4Y2VwdGlvbiB0byBvY2N1ciBpZiBiZWZvcmUgZG9pbmcgYW55dGhpbmcgd2l0aAoraW50ZXJydXB0IGl0IG9yIHdhaXQgZm9yIGFuIGV4Y2VwdGlvbiB0byBvY2N1ciBiZWZvcmUgZG9pbmcgYW55dGhpbmcgd2l0aAogdGhlIGtlcm5lbC4KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Z1aml0c3UvZnJ2L2tlcm5lbC1BQkkudHh0IGIvRG9jdW1lbnRhdGlvbi9mdWppdHN1L2Zydi9rZXJuZWwtQUJJLnR4dAppbmRleCA4YjBhNWZjLi5hYWExY2VjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Z1aml0c3UvZnJ2L2tlcm5lbC1BQkkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZnVqaXRzdS9mcnYva2VybmVsLUFCSS50eHQKQEAgLTE1Niw3ICsxNTYsNyBAQAogYWxtb3N0IGNvbXBsZXRlbHkgc2VsZi1jb250YWluZWQuIFRoZSBvbmx5IGV4dGVybmFsIGNvZGUgdXNlZCBpcyB0aGUKIHNwcmludGYgZmFtaWx5IG9mIGZ1bmN0aW9ucy4KIAotRnV0aGVybW9yZSwgYnJlYWsuUyBpcyBzbyBjb21wbGljYXRlZCBiZWNhdXNlIHNpbmdsZS1zdGVwIG1vZGUgZG9lcyBub3QKK0Z1cnRoZXJtb3JlLCBicmVhay5TIGlzIHNvIGNvbXBsaWNhdGVkIGJlY2F1c2Ugc2luZ2xlLXN0ZXAgbW9kZSBkb2VzIG5vdAogc3dpdGNoIG9mZiBvbiBlbnRyeSB0byBhbiBleGNlcHRpb24uIFRoYXQgbWVhbnMgdW5sZXNzIG1hbnVhbGx5IGRpc2FibGVkLAogc2luZ2xlLXN0ZXBwaW5nIHdpbGwgYmxpdGhlbHkgZ28gb24gc3RlcHBpbmcgaW50byB0aGluZ3MgbGlrZSBpbnRlcnJ1cHRzLgogU2VlIGdkYnN0dWIudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9pZGUudHh0CmluZGV4IDBiZjM4YmEuLjc4NmMzYTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaWRlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lkZS50eHQKQEAgLTM5MCw1ICszOTAsNSBAQAogV2VkIEFwciAxNyAyMjo1Mjo0NCBDRVNUIDIwMDIgZWRpdGVkIGJ5IE1hcmNpbiBEYWxlY2tpLCB0aGUgY3VycmVudAogbWFpbnRhaW5lci4KIAotV2VkIEF1ZyAyMCAyMjozMToyOSBDRVNUIDIwMDMgdXBkYXRlZCBpZGUgYm9vdCB1cHRpb25zIHRvIGN1cnJlbnQgaWRlLmMKK1dlZCBBdWcgMjAgMjI6MzE6MjkgQ0VTVCAyMDAzIHVwZGF0ZWQgaWRlIGJvb3Qgb3B0aW9ucyB0byBjdXJyZW50IGlkZS5jCiBjb21tZW50cyBhdCAyLjYuMC10ZXN0NCB0aW1lLiBNYWNpZWogU29sdHlzaWFrIDxzb2x0QGRucy50b3hpY2ZpbG1zLnR2PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9hbWlqb3kudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9hbWlqb3kudHh0CmluZGV4IDRmMGU4OWQuLjdkYzRmMTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvYW1pam95LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2FtaWpveS50eHQKQEAgLTkxLDggKzkxLDggQEAKICAgICAgICAgIHwgICAxICAgIHwgTTBIUSAgICAgfCBKT1kwREFUIEhvcml6b250YWwgQ2xvY2sgKHF1YWRyYXR1cmUpICAgfAogICAgICAgICAgfCAgIDIgICAgfCBNMFYgICAgICB8IEpPWTBEQVQgVmVydGljYWwgQ2xvY2sgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICB8ICAgMyAgICB8IE0wVlEgICAgIHwgSk9ZMERBVCBWZXJ0aWNhbCBDbG9jayAgKHF1YWRyYXR1cmUpICAgIHwKLSAgICAgICAgIHwgICA0ICAgIHwgTTFWICAgICAgfCBKT1kxREFUIEhvcml6b250YWxsIENsb2NrICAgICAgICAgICAgICAgfAotICAgICAgICAgfCAgIDUgICAgfCBNMVZRICAgICB8IEpPWTFEQVQgSG9yaXpvbnRhbGwgQ2xvY2sgKHF1YWRyYXR1cmUpICB8CisgICAgICAgICB8ICAgNCAgICB8IE0xViAgICAgIHwgSk9ZMURBVCBIb3Jpem9udGFsIENsb2NrICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIHwgICA1ICAgIHwgTTFWUSAgICAgfCBKT1kxREFUIEhvcml6b250YWwgQ2xvY2sgKHF1YWRyYXR1cmUpICAgfAogICAgICAgICAgfCAgIDYgICAgfCBNMVYgICAgICB8IEpPWTFEQVQgVmVydGljYWwgQ2xvY2sgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICB8ICAgNyAgICB8IE0xVlEgICAgIHwgSk9ZMURBVCBWZXJ0aWNhbCBDbG9jayAocXVhZHJhdHVyZSkgICAgIHwKICAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9hdGFyaWtiZC50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2F0YXJpa2JkLnR4dAppbmRleCAxZTdlNTg1Li42NjhmNGQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L2F0YXJpa2JkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2F0YXJpa2JkLnR4dApAQCAtMTAzLDcgKzEwMyw3IEBACiAKIDUuMSBKb3lzdGljayBFdmVudCBSZXBvcnRpbmcKIAotSW4gdGhpcyBtb2RlLCB0aGUgaWtiZCBnZW5lcmF0ZXMgYSByZWNvcmQgd2hldmVyIHRoZSBqb3lzdGljayBwb3NpdGlvbiBpcworSW4gdGhpcyBtb2RlLCB0aGUgaWtiZCBnZW5lcmF0ZXMgYSByZWNvcmQgd2hlbmV2ZXIgdGhlIGpveXN0aWNrIHBvc2l0aW9uIGlzCiBjaGFuZ2VkIChpLmUuIGZvciBlYWNoIG9wZW5pbmcgb3IgY2xvc2luZyBvZiBhIGpveXN0aWNrIHN3aXRjaCBvciB0cmlnZ2VyKS4KIAogVGhlIGpveXN0aWNrIGV2ZW50IHJlY29yZCBpcyB0d28gYnl0ZXMgb2YgdGhlIGZvcm06CkBAIC0yNzcsOCArMjc3LDggQEAKIDkuNyBTRVQgTU9VU0UgU0NBTEUKIAogICAgIDB4MEMKLSAgICBYICAgICAgICAgICAgICAgICAgIDsgaG9yaXpvbnRhbCBtb3VzZSB0aWNrcyBwZXIgaW50ZXJuZWwgWAotICAgIFkgICAgICAgICAgICAgICAgICAgOyB2ZXJ0aWNhbCBtb3VzZSB0aWNrcyBwZXIgaW50ZXJuZWwgWQorICAgIFggICAgICAgICAgICAgICAgICAgOyBob3Jpem9udGFsIG1vdXNlIHRpY2tzIHBlciBpbnRlcm5hbCBYCisgICAgWSAgICAgICAgICAgICAgICAgICA7IHZlcnRpY2FsIG1vdXNlIHRpY2tzIHBlciBpbnRlcm5hbCBZCiAKIFRoaXMgY29tbWFuZCBzZXRzIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBBQlNPTFVURSBNT1VTRSBQT1NJVElPTklORyBtb2RlLgogSW4gdGhpcyBtb2RlLCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb3VzZSBwaGFzZSBjaGFuZ2VzICgnY2xpY2tzJykgbXVzdApAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgMHgwRgogCiBUaGlzIGNvbW1hbmQgbWFrZXMgdGhlIG9yaWdpbiBvZiB0aGUgWSBheGlzIHRvIGJlIGF0IHRoZSBib3R0b20gb2YgdGhlCi1sb2dpY2FsIGNvb3JkaW5hdGUgc3lzdGVtIGludGVybmVsIHRvIHRoZSBpa2JkIGZvciBhbGwgcmVsYXRpdmUgb3IgYWJzb2x1dGUKK2xvZ2ljYWwgY29vcmRpbmF0ZSBzeXN0ZW0gaW50ZXJuYWwgdG8gdGhlIGlrYmQgZm9yIGFsbCByZWxhdGl2ZSBvciBhYnNvbHV0ZQogbW91c2UgbW90aW9uLiBUaGlzIGNhdXNlcyBtb3VzZSBtb3Rpb24gdG93YXJkIHRoZSB1c2VyIHRvIGJlIG5lZ2F0aXZlIGluIHNpZ24KIGFuZCBhd2F5IGZyb20gdGhlIHVzZXIgdG8gYmUgcG9zaXRpdmUuCiAKQEAgLTU5Nyw4ICs1OTcsOCBAQAogCiAxMC4gU0NBTiBDT0RFUwogCi1UaGUga2V5IHNjYW4gY29kZXMgcmV0dXJuIGJ5IHRoZSBpa2JkIGFyZSBjaG9zZW4gdG8gc2ltcGxpZnkgdGhlCi1pbXBsZW1lbnRhaW9uIG9mIEdTWC4KK1RoZSBrZXkgc2NhbiBjb2RlcyByZXR1cm5lZCBieSB0aGUgaWtiZCBhcmUgY2hvc2VuIHRvIHNpbXBsaWZ5IHRoZQoraW1wbGVtZW50YXRpb24gb2YgR1NYLgogCiBHU1ggU3RhbmRhcmQgS2V5Ym9hcmQgTWFwcGluZy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC95ZWFsaW5rLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQveWVhbGluay50eHQKaW5kZXggMGE4Yzk3ZS4uNTM2MGU0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC95ZWFsaW5rLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3llYWxpbmsudHh0CkBAIC0xMzQsNyArMTM0LDcgQEAKICAgODg4ODg4ODg4ODg4CiAgIExpbnV4IFJvY2tzIQogCi1Xcml0aW5nIHRvIC9zeXMvLi4vbGluZVggd2lsbCBzZXQgdGhlIGNvcmVzcG9uZGluZyBMQ0QgbGluZS4KK1dyaXRpbmcgdG8gL3N5cy8uLi9saW5lWCB3aWxsIHNldCB0aGUgY29ycmVzcG9uZGluZyBMQ0QgbGluZS4KICAtIEV4Y2VzcyBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkLgogIC0gSWYgbGVzcyBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoYW4gYWxsb3dlZCwgdGhlIHJlbWFpbmluZyBkaWdpdHMgYXJlCiAgICB1bmNoYW5nZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2Nkcm9tLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CmluZGV4IDhlYzMyY2MuLjYyZDRhZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CkBAIC03MzUsNyArNzM1LDcgQEAKIAkgICAgT2ssIHRoaXMgaXMgd2hlcmUgcHJvYmxlbXMgc3RhcnQuICBUaGUgY3VycmVudCBpbnRlcmZhY2UgZm9yCiAJICAgIHRoZSBDRFJPTV9ESVNDX1NUQVRVUyBpb2N0bCBpcyBmbGF3ZWQuICBJdCBtYWtlcyB0aGUgZmFsc2UKIAkgICAgYXNzdW1wdGlvbiB0aGF0IENEcyBhcmUgYWxsIENEU19EQVRBXzEgb3IgYWxsIENEU19BVURJTywgZXRjLgotCSAgICBVbmZvcnR1bmF0bHksIHdoaWxlIHRoaXMgaXMgb2Z0ZW4gdGhlIGNhc2UsIGl0IGlzIGFsc28KKwkgICAgVW5mb3J0dW5hdGVseSwgd2hpbGUgdGhpcyBpcyBvZnRlbiB0aGUgY2FzZSwgaXQgaXMgYWxzbwogCSAgICB2ZXJ5IGNvbW1vbiBmb3IgQ0RzIHRvIGhhdmUgc29tZSB0cmFja3Mgd2l0aCBkYXRhLCBhbmQgc29tZQogCSAgICB0cmFja3Mgd2l0aCBhdWRpby4JSnVzdCBiZWNhdXNlIEkgZmVlbCBsaWtlIGl0LCBJIGRlY2xhcmUKIAkgICAgdGhlIGZvbGxvd2luZyB0byBiZSB0aGUgYmVzdCB3YXkgdG8gY29wZS4gIElmIHRoZSBDRCBoYXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CmluZGV4IDUwZjRlZGQuLjRiM2Q2NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dApAQCAtMjI3LDkgKzIyNyw5IEBACiAJYmUgaW5jbHVkZWQgaW4gYSBsaWJyYXJ5LCBsaWIuYS4KIAlBbGwgb2JqZWN0cyBsaXN0ZWQgd2l0aCBsaWIteSBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUKIAlsaWJyYXJ5IGZvciB0aGF0IGRpcmVjdG9yeS4KLQlPYmplY3RzIHRoYXQgYXJlIGxpc3RlZCBpbiBvYmoteSBhbmQgYWRkaXRpb25hbHkgbGlzdGVkIGluCi0JbGliLXkgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnksIHNpbmNlIHRoZXkgd2lsbCBhbnl3YXkKLQliZSBhY2Nlc3NpYmxlLgorCU9iamVjdHMgdGhhdCBhcmUgbGlzdGVkIGluIG9iai15IGFuZCBhZGRpdGlvbmFsbHkgbGlzdGVkIGluCisJbGliLXkgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnksIHNpbmNlIHRoZXkgd2lsbAorCWJlIGFjY2Vzc2libGUgYW55d2F5LgogCUZvciBjb25zaXN0ZW5jeSwgb2JqZWN0cyBsaXN0ZWQgaW4gbGliLW0gd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWIuYS4KIAogCU5vdGUgdGhhdCB0aGUgc2FtZSBrYnVpbGQgbWFrZWZpbGUgbWF5IGxpc3QgZmlsZXMgdG8gYmUgYnVpbHQtaW4KQEAgLTUzNSw3ICs1MzUsNyBAQAogCUhvc3QgcHJvZ3JhbXMgY2FuIGJlIG1hZGUgdXAgYmFzZWQgb24gY29tcG9zaXRlIG9iamVjdHMuCiAJVGhlIHN5bnRheCB1c2VkIHRvIGRlZmluZSBjb21wb3NpdGUgb2JqZWN0cyBmb3IgaG9zdCBwcm9ncmFtcyBpcwogCXNpbWlsYXIgdG8gdGhlIHN5bnRheCB1c2VkIGZvciBrZXJuZWwgb2JqZWN0cy4KLQkkKDxleGVjdXRlYWJsZT4tb2JqcykgbGlzdHMgYWxsIG9iamVjdHMgdXNlZCB0byBsaW5rIHRoZSBmaW5hbAorCSQoPGV4ZWN1dGFibGU+LW9ianMpIGxpc3RzIGFsbCBvYmplY3RzIHVzZWQgdG8gbGluayB0aGUgZmluYWwKIAlleGVjdXRhYmxlLgogCiAJRXhhbXBsZToKQEAgLTEwMjIsNyArMTAyMiw3IEBACiAJSW4gdGhpcyBleGFtcGxlLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHRhcmdldHMsIHJlcXVpcmluZyBkaWZmZXJlbnQKIAlvcHRpb25zIHRvIHRoZSBsaW5rZXIuIFRoZSBsaW5rZXIgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZQogCUxERkxBR1NfJEAgc3ludGF4IC0gb25lIGZvciBlYWNoIHBvdGVudGlhbCB0YXJnZXQuCi0JJCh0YXJnZXRzKSBhcmUgYXNzaW5nZWQgYWxsIHBvdGVudGlhbCB0YXJnZXRzLCBieSB3aGljaCBrYnVpbGQga25vd3MKKwkkKHRhcmdldHMpIGFyZSBhc3NpZ25lZCBhbGwgcG90ZW50aWFsIHRhcmdldHMsIGJ5IHdoaWNoIGtidWlsZCBrbm93cwogCXRoZSB0YXJnZXRzIGFuZCB3aWxsOgogCQkxKSBjaGVjayBmb3IgY29tbWFuZGxpbmUgY2hhbmdlcwogCQkyKSBkZWxldGUgdGFyZ2V0IGR1cmluZyBtYWtlIGNsZWFuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDk5MTNmMDYuLjJlMTg5OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC01NTcsOSArNTU3LDYgQEAKIAlmbG9wcHk9CQlbSFddCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9mbG9wcHkudHh0LgogCi0JZnRhcGU9CQlbSFddIEZsb3BweSBUYXBlIHN1YnN5c3RlbSBkZWJ1Z2dpbmcgb3B0aW9ucy4KLQkJCVNlZSBEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dC4KLQogCWdhbWVjb24ubWFwWzJ8M109CiAJCQlbSFcsSk9ZXSBNdWx0aXN5c3RlbSBqb3lzdGljayBhbmQgTkVTL1NORVMvUFNYIHBhZAogCQkJc3VwcG9ydCB2aWEgcGFyYWxsZWwgcG9ydCAodXAgdG8gNSBkZXZpY2VzIHBlciBwb3J0KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dCBiL0RvY3VtZW50YXRpb24va2V5cy50eHQKaW5kZXggM2RhNTg2Yi4uNjBjNjY1ZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dApAQCAtMzA0LDcgKzMwNCw3IEBACiAJUglSZXZva2VkCiAJRAlEZWFkCiAJUQlDb250cmlidXRlcyB0byB1c2VyJ3MgcXVvdGEKLQlVCVVuZGVyIGNvbnRydWN0aW9uIGJ5IGNhbGxiYWNrIHRvIHVzZXJzcGFjZQorCVUJVW5kZXIgY29uc3RydWN0aW9uIGJ5IGNhbGxiYWNrIHRvIHVzZXJzcGFjZQogCU4JTmVnYXRpdmUga2V5CiAKICAgICAgVGhpcyBmaWxlIG11c3QgYmUgZW5hYmxlZCBhdCBrZXJuZWwgY29uZmlndXJhdGlvbiB0aW1lIGFzIGl0IGFsbG93cyBhbnlvbmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGFwdG9wLW1vZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKaW5kZXggYzQ4NzE4Ni4uNmY2MzllMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKQEAgLTEyMSw3ICsxMjEsNyBAQAogTUFYX0FHRToKIAogTWF4aW11bSB0aW1lLCBpbiBzZWNvbmRzLCBvZiBoYXJkIGRyaXZlIHNwaW5kb3duIHRpbWUgdGhhdCB5b3UgYXJlCi1jb25mb3J0YWJsZSB3aXRoLiBXb3JzdCBjYXNlLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgdGhpcworY29tZm9ydGFibGUgd2l0aC4gV29yc3QgY2FzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlIHRoaXMKIGFtb3VudCBvZiB3b3JrIGlmIHlvdXIgYmF0dGVyeSBmYWlscyB3aGlsZSB5b3UncmUgaW4gbGFwdG9wIG1vZGUuCiAKIE1JTklNVU1fQkFUVEVSWV9NSU5VVEVTOgpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tQ09ORklHIEZJTEUgQkVHSU4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE1heGltdW0gdGltZSwgaW4gc2Vjb25kcywgb2YgaGFyZCBkcml2ZSBzcGluZG93biB0aW1lIHRoYXQgeW91IGFyZQotIyBjb25mb3J0YWJsZSB3aXRoLiBXb3JzdCBjYXNlLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgdGhpcworIyBjb21mb3J0YWJsZSB3aXRoLiBXb3JzdCBjYXNlLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgdGhpcwogIyBhbW91bnQgb2Ygd29yayBpZiB5b3VyIGJhdHRlcnkgZmFpbHMgeW91IHdoaWxlIGluIGxhcHRvcCBtb2RlLgogI01BWF9BR0U9NjAwCiAKQEAgLTM1MCw3ICszNTAsNyBAQAogIyBzZXQgZGVmYXVsdHMgaW5zdGVhZDoKIAogIyBNYXhpbXVtIHRpbWUsIGluIHNlY29uZHMsIG9mIGhhcmQgZHJpdmUgc3BpbmRvd24gdGltZSB0aGF0IHlvdSBhcmUKLSMgY29uZm9ydGFibGUgd2l0aC4gV29yc3QgY2FzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlIHRoaXMKKyMgY29tZm9ydGFibGUgd2l0aC4gV29yc3QgY2FzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlIHRoaXMKICMgYW1vdW50IG9mIHdvcmsgaWYgeW91ciBiYXR0ZXJ5IGZhaWxzIHlvdSB3aGlsZSBpbiBsYXB0b3AgbW9kZS4KIE1BWF9BR0U9JHtNQVhfQUdFOi0nNjAwJ30KIApAQCAtNjk5LDcgKzY5OSw3IEBACiBEYXggS2Vsc29uIHN1Ym1pdHRlZCB0aGlzIHNvIHRoYXQgdGhlIEFDUEkgYWNwaWQgZGFlbW9uIHdpbGwKIGtpY2sgb2ZmIHRoZSBsYXB0b3BfbW9kZSBzY3JpcHQgYW5kIHJ1biBoZHBhcm0uIFRoZSBwYXJ0IHRoYXQKIGF1dG9tYXRpY2FsbHkgZGlzYWJsZXMgbGFwdG9wIG1vZGUgd2hlbiB0aGUgYmF0dGVyeSBpcyBsb3cgd2FzCi13cml0ZW4gYnkgSmFuIFRvcGluc2tpLgord3JpdHRlbiBieSBKYW4gVG9waW5za2kuCiAKIC0tLS0tLS0tLS0tLS0tLS0tL2V0Yy9hY3BpL2V2ZW50cy9hY19hZGFwdGVyIEJFR0lOLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBldmVudD1hY19hZGFwdGVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKaW5kZXggNzc1MTcwNC4uNTg0MDhkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtMjEyLDcgKzIxMiw3IEBACiAKIAlTVE9SRSAqWCA9IGMsIGQgPSBMT0FEICpYCiAKLSAgICAgKExvYWRzIGFuZCBzdG9yZXMgb3ZlcmxhcCBpZiB0aGV5IGFyZSB0YXJnZXR0ZWQgYXQgb3ZlcmxhcHBpbmcgcGllY2VzIG9mCisgICAgIChMb2FkcyBhbmQgc3RvcmVzIG92ZXJsYXAgaWYgdGhleSBhcmUgdGFyZ2V0ZWQgYXQgb3ZlcmxhcHBpbmcgcGllY2VzIG9mCiAgICAgIG1lbW9yeSkuCiAKIEFuZCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIHRoYXQgX211c3RfIG9yIF9tdXN0X25vdF8gYmUgYXNzdW1lZDoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dAppbmRleCA5M2FmM2U4Li5mYjhkYzY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0CkBAIC05NSw4ICs5NSw4IEBACiAJCU1vdmUgYWxsIHRvIGRldi0+cG9sbCgpCiAKIEMpIEFiaWxpdHkgdG8gZGV0ZWN0IG5ldyB3b3JrIGNvcnJlY3RseS4KLU5BUEkgd29ya3MgYnkgc2h1dHRpbmcgZG93biBldmVudCBpbnRlcnJ1cHRzIHdoZW4gdGhlcmVzIHdvcmsgYW5kCi10dXJuaW5nIHRoZW0gb24gd2hlbiB0aGVyZXMgbm9uZS4gCitOQVBJIHdvcmtzIGJ5IHNodXR0aW5nIGRvd24gZXZlbnQgaW50ZXJydXB0cyB3aGVuIHRoZXJlJ3Mgd29yayBhbmQKK3R1cm5pbmcgdGhlbSBvbiB3aGVuIHRoZXJlJ3Mgbm9uZS4gCiBOZXcgcGFja2V0cyBtaWdodCBzaG93IHVwIGluIHRoZSBzbWFsbCB3aW5kb3cgd2hpbGUgaW50ZXJydXB0cyB3ZXJlIGJlaW5nIAogcmUtZW5hYmxlZCAocmVmZXIgdG8gYXBwZW5kaXggMikuICBBIHBhY2tldCBtaWdodCBzbmVhayBpbiBkdXJpbmcgdGhlIHBlcmlvZCAKIHdlIGFyZSBlbmFibGluZyBpbnRlcnJ1cHRzLiBXZSBvbmx5IGdldCB0byBrbm93IGFib3V0IHN1Y2ggYSBwYWNrZXQgd2hlbiB0aGUgCkBAIC0xMTQsNyArMTE0LDcgQEAKIG9ubHkgb25lIENQVSBjYW4gcGljayB0aGUgaW5pdGlhbCBpbnRlcnJ1cHQgYW5kIGhlbmNlIHRoZSBpbml0aWFsCiBuZXRpZl9yeF9zY2hlZHVsZShkZXYpOwogLSBUaGUgY29yZSBsYXllciBpbnZva2VzIGRldmljZXMgdG8gc2VuZCBwYWNrZXRzIGluIGEgcm91bmQgcm9iaW4gZm9ybWF0LgotVGhpcyBpbXBsaWVzIHJlY2VpdmUgaXMgdG90YWx5IGxvY2tsZXNzIGJlY2F1c2Ugb2YgdGhlIGd1YXJhbnRlZSBvbmx5IHRoYXQgCitUaGlzIGltcGxpZXMgcmVjZWl2ZSBpcyB0b3RhbGx5IGxvY2tsZXNzIGJlY2F1c2Ugb2YgdGhlIGd1YXJhbnRlZSB0aGF0IG9ubHkgCiBvbmUgQ1BVIGlzIGV4ZWN1dGluZyBpdC4KIC0gIGNvbnRlbnRpb24gY2FuIG9ubHkgYmUgdGhlIHJlc3VsdCBvZiBzb21lIG90aGVyIENQVSBhY2Nlc3NpbmcgdGhlIHJ4CiByaW5nLiBUaGlzIGhhcHBlbnMgb25seSBpbiBjbG9zZSgpIGFuZCBzdXNwZW5kKCkgKHdoZW4gdGhlc2UgbWV0aG9kcwpAQCAtNTEwLDcgKzUxMCw3IEBACiAJCQlhbiBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKIAl9Ci0JLyogZG9uZSEgYXQgbGVhc3QgdGhhdHMgd2hhdCBpdCBsb29rcyBsaWtlIDstPgorCS8qIGRvbmUhIGF0IGxlYXN0IHRoYXQncyB3aGF0IGl0IGxvb2tzIGxpa2UgOy0+CiAJaWYgbmV3IHBhY2tldHMgY2FtZSBpbiBhZnRlciBvdXIgbGFzdCBjaGVjayBvbiBzdGF0dXMgYml0cwogCXRoZXknbGwgYmUgY2F1Z2h0IGJ5IHRoZSB3aGlsZSBjaGVjayBhbmQgd2UgZ28gYmFjayBhbmQgY2xlYXIgdGhlbSAKIAlzaW5jZSB3ZSBoYXZlbnQgZXhjZWVkZWQgb3VyIHF1b3RhICovCkBAIC01MzUsMTEgKzUzNSwxMSBAQAogICAgICAgICAqIDEuIGl0IGNhbiByYWNlIHdpdGggZGlzYWJsaW5nIGlycXMgaW4gaXJxIGhhbmRsZXIgKHdoaWNoIGFyZSBkb25lIHRvIAogCSogc2NoZWR1bGUgcG9sbHMpCiAgICAgICAgICogMi4gaXQgY2FuIHJhY2Ugd2l0aCBkaXMvZW5hYmxpbmcgaXJxcyBpbiBvdGhlciBwb2xsIHRocmVhZHMKLSAgICAgICAgKiAzLiBpZiBhbiBpcnEgcmFpc2VkIGFmdGVyIHRoZSBiZWdpbmluZyBvZiB0aGUgb3V0ZXIgIGJlZ2lubmluZyAKLSAgICAgICAgKiBsb29wKG1hcmtlZCBpbiB0aGUgY29kZSBhYm92ZSksIGl0IHdpbGwgYmUgaW1tZWRpYXRlbHkKKyAgICAgICAgKiAzLiBpZiBhbiBpcnEgcmFpc2VkIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dGVyIGJlZ2lubmluZyAKKyAgICAgICAgKiBsb29wIChtYXJrZWQgaW4gdGhlIGNvZGUgYWJvdmUpLCBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5CiAgICAgICAgICogdHJpZ2dlcmVkIGhlcmUuCiAgICAgICAgICoKLSAgICAgICAgKiBTdW1tYXJpemluZzogdGhlIGxvZ2ljIG1heSByZXN1bHRzIGluIHNvbWUgcmVkdW5kYW50IGlycXMgYm90aAorICAgICAgICAqIFN1bW1hcml6aW5nOiB0aGUgbG9naWMgbWF5IHJlc3VsdCBpbiBzb21lIHJlZHVuZGFudCBpcnFzIGJvdGgKICAgICAgICAgKiBkdWUgdG8gcmFjZXMgaW4gbWFza2luZyBhbmQgZHVlIHRvIHRvbyBsYXRlIGFja2luZyBvZiBhbHJlYWR5CiAgICAgICAgICogcHJvY2Vzc2VkIGlycXMuIFRoZSBnb29kIG5ld3M6IG5vIGV2ZW50cyBhcmUgZXZlciBsb3N0LgogICAgICAgICAqLwpAQCAtNjAxLDcgKzYwMSw3IEBACiAJCiA1KSBkZXYtPmNsb3NlKCkgYW5kIGRldi0+c3VzcGVuZCgpIGlzc3VlcwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgZHJpdmVyIHdyaXR0ZXIgbmVlZG50IHdvcnJ5IGFib3V0IHRoaXMuIFRoZSB0b3AgbmV0IGxheWVyIHRha2VzCitUaGUgZHJpdmVyIHdyaXRlciBuZWVkbid0IHdvcnJ5IGFib3V0IHRoaXM7IHRoZSB0b3AgbmV0IGxheWVyIHRha2VzCiBjYXJlIG9mIGl0LgogCiA2KSBBZGRpbmcgbmV3IFN0YXRzIHRvIC9wcm9jIApAQCAtNjIyLDkgKzYyMiw5IEBACiBwYWNrZXRzIGZhc3QgZW5vdWdoIGkuZSBzZW5kIGEgcGF1c2Ugb25seSB3aGVuIHlvdSBydW4gb3V0IG9mIHJ4IGJ1ZmZlcnMuCiBOb3RlIEZDIGluIGl0c2VsZiBpcyBhIGdvb2Qgc29sdXRpb24gYnV0IHdlIGhhdmUgZm91bmQgaXQgdG8gbm90IGJlCiBtdWNoIG9mIGEgY29tbW9kaXR5IGZlYXR1cmUgKGJvdGggaW4gTklDcyBhbmQgc3dpdGNoZXMpIGFuZCBoZW5jZSBmYWxscwotdW5kZXIgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdXNpbmcgTklDIGJhc2VkIG1pdGlnYXRpb24uIEFsc28gZXhwZXJpbWVudHMKLWluZGljYXRlIHRoYXQgaXRzIG11Y2ggaGFyZGVyIHRvIHJlc29sdmUgdGhlIHJlc291cmNlIGFsbG9jYXRpb24KLWlzc3VlIChha2EgbGF6eSByZWNlaXZpbmcgdGhhdCBOQVBJIG9mZmVycykgYW5kIGhlbmNlIHF1YW50aWZ5IGl0cyB1c2VmdWxsbmVzcwordW5kZXIgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdXNpbmcgTklDIGJhc2VkIG1pdGlnYXRpb24uIEFsc28sIGV4cGVyaW1lbnRzCitpbmRpY2F0ZSB0aGF0IGl0J3MgbXVjaCBoYXJkZXIgdG8gcmVzb2x2ZSB0aGUgcmVzb3VyY2UgYWxsb2NhdGlvbgoraXNzdWUgKGFrYSBsYXp5IHJlY2VpdmluZyB0aGF0IE5BUEkgb2ZmZXJzKSBhbmQgaGVuY2UgcXVhbnRpZnkgaXRzIHVzZWZ1bG5lc3MKIHByb3ZlZCBoYXJkZXIuIEluIGFueSBjYXNlLCBGQyB3b3JrcyBldmVuIGJldHRlciB3aXRoIE5BUEkgYnV0IGlzIG5vdAogbmVjZXNzYXJ5LgogCkBAIC02NzgsMTAgKzY3OCwxMCBAQAogQ1NSNSBiaXQgb2YgaW50ZXJlc3QgaXMgb25seSB0aGUgcnggc3RhdHVzLiAKIElmIHlvdSBsb29rIGF0IHRoZSBsYXN0IGlmIHN0YXRlbWVudDogCiB5b3UganVzdCBmaW5pc2hlZCBncmFiYmluZyBhbGwgdGhlIHBhY2tldHMgZnJvbSB0aGUgcnggcmluZyAuLiB5b3UgY2hlY2sgaWYKLXN0YXR1cyBiaXQgc2F5cyB0aGVyZXMgbW9yZSBwYWNrZXRzIGp1c3QgaW4gLi4uIGl0IHNheXMgbm9uZTsgeW91IHRoZW4KK3N0YXR1cyBiaXQgc2F5cyB0aGVyZSBhcmUgbW9yZSBwYWNrZXRzIGp1c3QgaW4gLi4uIGl0IHNheXMgbm9uZTsgeW91IHRoZW4KIGVuYWJsZSByeCBpbnRlcnJ1cHRzIGFnYWluOyBpZiBhIG5ldyBwYWNrZXQganVzdCBjYW1lIGluIGR1cmluZyB0aGlzIGNoZWNrLAogd2UgYXJlIGNvdW50aW5nIHRoYXQgQ1NSNSB3aWxsIGJlIHNldCBpbiB0aGF0IHNtYWxsIHdpbmRvdyBvZiBvcHBvcnR1bml0eQotYW5kIHRoYXQgYnkgcmUtZW5hYmxpbmcgaW50ZXJydXB0cywgd2Ugd291bGQgYWN0dWFsbHkgdHJpZ2VyIGFuIGludGVycnVwdAorYW5kIHRoYXQgYnkgcmUtZW5hYmxpbmcgaW50ZXJydXB0cywgd2Ugd291bGQgYWN0dWFsbHkgdHJpZ2dlciBhbiBpbnRlcnJ1cHQKIHRvIHJlZ2lzdGVyIHRoZSBuZXcgcGFja2V0IGZvciBwcm9jZXNzaW5nLgogCiBbVGhlIGFib3ZlIGRlc2NyaXB0aW9uIG5heSBiZSB2ZXJ5IHZlcmJvc2UsIGlmIHlvdSBoYXZlIGJldHRlciB3b3JkaW5nIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NzODl4MC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAppbmRleCA2NDg5NjQ3Li42Mzg3ZDNkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dApAQCAtMjQ4LDcgKzI0OCw3IEBACiAgICB3aXRoIGRldmljZSBwcm9iaW5nLiAgVG8gYXZvaWQgdGhpcyBiZWhhdmlvdXIsIGFkZCBvbmUKICAgIHRvIHRoZSBgaW89JyBtb2R1bGUgcGFyYW1ldGVyLiAgVGhpcyBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZQogICAgdGhlIEkvTyBhZGRyZXNzLCBidXQgaXQgaXMgYSBmbGFnIHRvIHRlbGwgdGhlIGRyaXZlcgotICAgdG9wYXJ0aWFsbHkgaW5pdGlhbGlzZSB0aGUgaGFyZHdhcmUgYmVmb3JlIHRyeWluZyB0bworICAgdG8gcGFydGlhbGx5IGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIGJlZm9yZSB0cnlpbmcgdG8KICAgIGlkZW50aWZ5IHRoZSBjYXJkLiAgVGhpcyBjb3VsZCBiZSBkYW5nZXJvdXMgaWYgeW91IGFyZQogICAgbm90IHN1cmUgdGhhdCB0aGVyZSBpcyBhIGNzODl4MCBjYXJkIGF0IHRoZSBwcm92aWRlZCBhZGRyZXNzLgogCkBAIC02MjAsOCArNjIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAgICAgIE1vdXNlIChQUy8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogTWVtb3J5IEFkZHJlc3MgIERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgTWF0aCBDb3Byb2Nlc3NvcgogLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgMTQgICAgICAgSGFyZCBEaXNrIGNvbnRyb2xsZXIKLUEwMDAtQkZGRglFR0EgR3JhcGhpY3MgQWRwYXRlcgotQTAwMC1DN0ZGCVZHQSBHcmFwaGljcyBBZHBhdGVyCitBMDAwLUJGRkYJRUdBIEdyYXBoaWNzIEFkYXB0ZXIKK0EwMDAtQzdGRglWR0EgR3JhcGhpY3MgQWRhcHRlcgogQjAwMC1CRkZGCU1vbm8gR3JhcGhpY3MgQWRhcHRlcgogQjgwMC1CRkZGCUNvbG9yIEdyYXBoaWNzIEFkYXB0ZXIKIEUwMDAtRkZGRglBVCBCSU9TCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQKaW5kZXggNzQ1NjNiMy4uZGRhMTU4OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kY2NwLnR4dApAQCAtMTksMjEgKzE5LDE3IEBACiAKIEl0IGhhcyBhIGJhc2UgcHJvdG9jb2wgYW5kIHBsdWdnYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgSURzIChDQ0lEcykuCiAKLUl0IGlzIGF0IGRyYWZ0IFJGQyBzdGF0dXMgYW5kIHRoZSBob21lcGFnZSBmb3IgRENDUCBhcyBhIHByb3RvY29sIGlzIGF0OgotCWh0dHA6Ly93d3cuaWNpci5vcmcva29obGVyL2RjcC8KK0l0IGlzIGF0IGV4cGVyaW1lbnRhbCBSRkMgc3RhdHVzIGFuZCB0aGUgaG9tZXBhZ2UgZm9yIERDQ1AgYXMgYSBwcm90b2NvbCBpcyBhdDoKKwlodHRwOi8vd3d3LnJlYWQuY3MudWNsYS5lZHUvZGNjcC8KIAogTWlzc2luZyBmZWF0dXJlcwogPT09PT09PT09PT09PT09PQogCiBUaGUgRENDUCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhbGwgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluCi10aGUgZHJhZnQgUkZDLgordGhlIFJGQy4KIAotSW4gcGFydGljdWxhciB0aGUgZm9sbG93aW5nIGFyZSBtaXNzaW5nOgotLSBDQ0lEMiBzdXBwb3J0Ci0tIGZlYXR1cmUgbmVnb3RpYXRpb24KLQotV2hlbiB0ZXN0aW5nIGFnYWluc3Qgb3RoZXIgaW1wbGVtZW50YXRpb25zIGl0IGFwcGVhcnMgdGhhdCBlbGFwc2VkIHRpbWUKLW9wdGlvbnMgYXJlIG5vdCBjb2RlZCBjb21wbGlhbnQgdG8gdGhlIHNwZWNpZmljYXRpb24uCitUaGUga25vd24gYnVncyBhcmUgYXQ6CisJaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvVE9ETyNEQ0NQCiAKIFNvY2tldCBvcHRpb25zCiA9PT09PT09PT09PT09PQpAQCAtNDcsMTIgKzQzLDcwIEBACiBpcyBwcmVzZW50KS4gQ29ubmVjdGluZyBzb2NrZXRzIHNldCBhdCBtb3N0IG9uZSBzZXJ2aWNlIG9wdGlvbjsgZm9yCiBsaXN0ZW5pbmcgc29ja2V0cywgbXVsdGlwbGUgc2VydmljZSBjb2RlcyBjYW4gYmUgc3BlY2lmaWVkLgogCitEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPViBhbmQgRENDUF9TT0NLT1BUX1JFQ1ZfQ1NDT1YgYXJlIHVzZWQgZm9yIHNldHRpbmcgdGhlCitwYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlIChSRkMgNDM0MCwgc2VjLiA5LjIpLiBUaGUgZGVmYXVsdCBpcyB0aGF0IGNoZWNrc3VtcworYWx3YXlzIGNvdmVyIHRoZSBlbnRpcmUgcGFja2V0IGFuZCB0aGF0IG9ubHkgZnVsbHkgY292ZXJlZCBhcHBsaWNhdGlvbiBkYXRhIGlzCithY2NlcHRlZCBieSB0aGUgcmVjZWl2ZXIuIEhlbmNlLCB3aGVuIHVzaW5nIHRoaXMgZmVhdHVyZSBvbiB0aGUgc2VuZGVyLCBpdCBtdXN0CitiZSBlbmFibGVkIGF0IHRoZSByZWNlaXZlciwgdG9vIHdpdGggc3VpdGFibGUgY2hvaWNlIG9mIENzQ292LgorCitEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPViBzZXRzIHRoZSBzZW5kZXIgY2hlY2tzdW0gY292ZXJhZ2UuIFZhbHVlcyBpbiB0aGUKKwlyYW5nZSAwLi4xNSBhcmUgYWNjZXB0YWJsZS4gVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAwIChmdWxsIGNvdmVyYWdlKSwKKwl2YWx1ZXMgYmV0d2VlbiAxLi4xNSBpbmRpY2F0ZSBwYXJ0aWFsIGNvdmVyYWdlLgorRENDUF9TT0NLT1BUX1NFTkRfQ1NDT1YgaXMgZm9yIHRoZSByZWNlaXZlciBhbmQgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmc6IGl0CisJc2V0cyBhIHRocmVzaG9sZCwgd2hlcmUgYWdhaW4gdmFsdWVzIDAuLjE1IGFyZSBhY2NlcHRhYmxlLiBUaGUgZGVmYXVsdAorCW9mIDAgbWVhbnMgdGhhdCBhbGwgcGFja2V0cyB3aXRoIGEgcGFydGlhbCBjb3ZlcmFnZSB3aWxsIGJlIGRpc2NhcmRlZC4KKwlWYWx1ZXMgaW4gdGhlIHJhbmdlIDEuLjE1IGluZGljYXRlIHRoYXQgcGFja2V0cyB3aXRoIG1pbmltYWxseSBzdWNoIGEKKwljb3ZlcmFnZSB2YWx1ZSBhcmUgYWxzbyBhY2NlcHRhYmxlLiBUaGUgaGlnaGVyIHRoZSBudW1iZXIsIHRoZSBtb3JlCisJcmVzdHJpY3RpdmUgdGhpcyBzZXR0aW5nIChzZWUgW1JGQyA0MzQwLCBzZWMuIDkuMi4xXSkuCisKK1N5c2N0bCB2YXJpYWJsZXMKKz09PT09PT09PT09PT09PT0KK1NldmVyYWwgRENDUCBkZWZhdWx0IHBhcmFtZXRlcnMgY2FuIGJlIG1hbmFnZWQgYnkgdGhlIGZvbGxvd2luZyBzeXNjdGxzCisoc3lzY3RsIG5ldC5kY2NwLmRlZmF1bHQgb3IgL3Byb2Mvc3lzL25ldC9kY2NwL2RlZmF1bHQpOgorCityZXF1ZXN0X3JldHJpZXMKKwlUaGUgbnVtYmVyIG9mIGFjdGl2ZSBjb25uZWN0aW9uIGluaXRpYXRpb24gcmV0cmllcyAodGhlIG51bWJlciBvZgorCVJlcXVlc3RzIG1pbnVzIG9uZSkgYmVmb3JlIHRpbWluZyBvdXQuIEluIGFkZGl0aW9uLCBpdCBhbHNvIGdvdmVybnMKKwl0aGUgYmVoYXZpb3VyIG9mIHRoZSBvdGhlciwgcGFzc2l2ZSBzaWRlOiB0aGlzIHZhcmlhYmxlIGFsc28gc2V0cworCXRoZSBudW1iZXIgb2YgdGltZXMgRENDUCByZXBlYXRzIHNlbmRpbmcgYSBSZXNwb25zZSB3aGVuIHRoZSBpbml0aWFsCisJaGFuZHNoYWtlIGRvZXMgbm90IHByb2dyZXNzIGZyb20gUkVTUE9ORCB0byBPUEVOIChpLmUuIHdoZW4gbm8gQWNrCisJaXMgcmVjZWl2ZWQgYWZ0ZXIgdGhlIGluaXRpYWwgUmVxdWVzdCkuICBUaGlzIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyCisJdGhhbiAwLCBzdWdnZXN0ZWQgaXMgbGVzcyB0aGFuIDEwLiBBbmFsb2d1ZSBvZiB0Y3Bfc3luX3JldHJpZXMuCisKK3JldHJpZXMxCisJSG93IG9mdGVuIGEgRENDUCBSZXNwb25zZSBpcyByZXRyYW5zbWl0dGVkIHVudGlsIHRoZSBsaXN0ZW5pbmcgRENDUAorCXNpZGUgY29uc2lkZXJzIGl0cyBjb25uZWN0aW5nIHBlZXIgZGVhZC4gQW5hbG9ndWUgb2YgdGNwX3JldHJpZXMxLgorCityZXRyaWVzMgorCVRoZSBudW1iZXIgb2YgdGltZXMgYSBnZW5lcmFsIERDQ1AgcGFja2V0IGlzIHJldHJhbnNtaXR0ZWQuIFRoaXMgaGFzCisJaW1wb3J0YW5jZSBmb3IgcmV0cmFuc21pdHRlZCBhY2tub3dsZWRnbWVudHMgYW5kIGZlYXR1cmUgbmVnb3RpYXRpb24sCisJZGF0YSBwYWNrZXRzIGFyZSBuZXZlciByZXRyYW5zbWl0dGVkLiBBbmFsb2d1ZSBvZiB0Y3BfcmV0cmllczIuCisKK3NlbmRfbmRwID0gMQorCVdoZXRoZXIgb3Igbm90IHRvIHNlbmQgTkRQIGNvdW50IG9wdGlvbnMgKHNlYy4gNy43LjIpLgorCitzZW5kX2Fja3ZlYyA9IDEKKwlXaGV0aGVyIG9yIG5vdCB0byBzZW5kIEFjayBWZWN0b3Igb3B0aW9ucyAoc2VjLiAxMS41KS4KKworYWNrX3JhdGlvID0gMgorCVRoZSBkZWZhdWx0IEFjayBSYXRpbyAoc2VjLiAxMS4zKSB0byB1c2UuCisKK3R4X2NjaWQgPSAyCisJRGVmYXVsdCBDQ0lEIGZvciB0aGUgc2VuZGVyLXJlY2VpdmVyIGhhbGYtY29ubmVjdGlvbi4KKworcnhfY2NpZCA9IDIKKwlEZWZhdWx0IENDSUQgZm9yIHRoZSByZWNlaXZlci1zZW5kZXIgaGFsZi1jb25uZWN0aW9uLgorCitzZXFfd2luZG93ID0gMTAwCisJVGhlIGluaXRpYWwgc2VxdWVuY2Ugd2luZG93IChzZWMuIDcuNS4yKS4KKwordHhfcWxlbiA9IDUKKwlUaGUgc2l6ZSBvZiB0aGUgdHJhbnNtaXQgYnVmZmVyIGluIHBhY2tldHMuIEEgdmFsdWUgb2YgMCBjb3JyZXNwb25kcworCXRvIGFuIHVuYm91bmRlZCB0cmFuc21pdCBidWZmZXIuCisKIE5vdGVzCiA9PT09PQogCi1TRUxpbnV4IGRvZXMgbm90IHlldCBoYXZlIHN1cHBvcnQgZm9yIERDQ1AuIFlvdSB3aWxsIG5lZWQgdG8gdHVybiBpdCBvZmYgb3IKLWVsc2UgeW91IHdpbGwgZ2V0IEVBQ0NFUy4KLQotRENDUCBkb2VzIG5vdCB0cmF2ZWwgdGhyb3VnaCBOQVQgc3VjY2Vzc2Z1bGx5IGF0IHByZXNlbnQuIFRoaXMgaXMgYmVjYXVzZQotdGhlIGNoZWNrc3VtIGNvdmVycyB0aGUgcHN1ZWRvLWhlYWRlciBhcyBwZXIgVENQIGFuZCBVRFAuIEl0IHNob3VsZCBiZQotcmVsYXRpdmVseSB0cml2aWFsIHRvIGFkZCBMaW51eCBOQVQgc3VwcG9ydCBmb3IgRENDUC4KK0RDQ1AgZG9lcyBub3QgdHJhdmVsIHRocm91Z2ggTkFUIHN1Y2Nlc3NmdWxseSBhdCBwcmVzZW50IG9uIG1hbnkgYm94ZXMuIFRoaXMgaXMKK2JlY2F1c2UgdGhlIGNoZWNrc3VtIGNvdmVycyB0aGUgcHN1ZWRvLWhlYWRlciBhcyBwZXIgVENQIGFuZCBVRFAuIExpbnV4IE5BVAorc3VwcG9ydCBmb3IgRENDUCBoYXMgYmVlbiBhZGRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9lMTAwMC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZTEwMDAudHh0CmluZGV4IDVjMGE1Y2MuLjYxYjE3MWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9lMTAwMC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAwLnR4dApAQCAtMSw3ICsxLDcgQEAKIExpbnV4KiBCYXNlIERyaXZlciBmb3IgdGhlIEludGVsKFIpIFBSTy8xMDAwIEZhbWlseSBvZiBBZGFwdGVycwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLU5vdmVtYmVyIDE1LCAyMDA1CitTZXB0ZW1iZXIgMjYsIDIwMDYKIAogCiBDb250ZW50cwpAQCAtOSw2ICs5LDcgQEAKIAogLSBJbiBUaGlzIFJlbGVhc2UKIC0gSWRlbnRpZnlpbmcgWW91ciBBZGFwdGVyCistIEJ1aWxkaW5nIGFuZCBJbnN0YWxsYXRpb24KIC0gQ29tbWFuZCBMaW5lIFBhcmFtZXRlcnMKIC0gU3BlZWQgYW5kIER1cGxleCBDb25maWd1cmF0aW9uCiAtIEFkZGl0aW9uYWwgQ29uZmlndXJhdGlvbnMKQEAgLTQxLDYgKzQyLDkgQEAKIEluc3RydWN0aW9ucyBvbiB1cGRhdGluZyBldGh0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgc2VjdGlvbiAiQWRkaXRpb25hbAogQ29uZmlndXJhdGlvbnMiIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCiAKK05PVEU6IFRoZSBJbnRlbChSKSA4MjU2MnYgMTAvMTAwIE5ldHdvcmsgQ29ubmVjdGlvbiBvbmx5IHByb3ZpZGVzIDEwLzEwMAorc3VwcG9ydC4KKwogCiBJZGVudGlmeWluZyBZb3VyIEFkYXB0ZXIKID09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTEsMjggKzU1LDI3IEBACiAgICAgaHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL3N1cHBvcnQvbmV0d29yay9hZGFwdGVyL3BybzEwMC8yMTM5Ny5odG0KIAogRm9yIHRoZSBsYXRlc3QgSW50ZWwgbmV0d29yayBkcml2ZXJzIGZvciBMaW51eCwgcmVmZXIgdG8gdGhlIGZvbGxvd2luZwotd2Vic2l0ZS4gSW4gdGhlIHNlYXJjaCBmaWVsZCwgZW50ZXIgeW91ciBhZGFwdGVyIG5hbWUgb3IgdHlwZSwgb3IgdXNlIHRoZQord2Vic2l0ZS4gIEluIHRoZSBzZWFyY2ggZmllbGQsIGVudGVyIHlvdXIgYWRhcHRlciBuYW1lIG9yIHR5cGUsIG9yIHVzZSB0aGUKIG5ldHdvcmtpbmcgbGluayBvbiB0aGUgbGVmdCB0byBzZWFyY2ggZm9yIHlvdXIgYWRhcHRlcjoKIAogICAgIGh0dHA6Ly9kb3dubG9hZGZpbmRlci5pbnRlbC5jb20vc2NyaXB0cy1kZi9zdXBwb3J0X2ludGVsLmFzcAogCiAKLUNvbW1hbmQgTGluZSBQYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09CitDb21tYW5kIExpbmUgUGFyYW1ldGVycworPT09PT09PT09PT09PT09PT09PT09PT0KIAogSWYgdGhlIGRyaXZlciBpcyBidWlsdCBhcyBhIG1vZHVsZSwgdGhlICBmb2xsb3dpbmcgb3B0aW9uYWwgcGFyYW1ldGVycwotYXJlIHVzZWQgYnkgZW50ZXJpbmcgdGhlbSBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIG1vZHByb2JlIG9yIGluc21vZAotY29tbWFuZCB1c2luZyB0aGlzIHN5bnRheDoKK2FyZSB1c2VkIGJ5IGVudGVyaW5nIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIHRoZSBtb2Rwcm9iZSBjb21tYW5kCit1c2luZyB0aGlzIHN5bnRheDoKIAogICAgICBtb2Rwcm9iZSBlMTAwMCBbPG9wdGlvbj49PFZBTDE+LDxWQUwyPiwuLi5dCiAKLSAgICAgaW5zbW9kIGUxMDAwIFs8b3B0aW9uPj08VkFMMT4sPFZBTDI+LC4uLl0KLQogRm9yIGV4YW1wbGUsIHdpdGggdHdvIFBSTy8xMDAwIFBDSSBhZGFwdGVycywgZW50ZXJpbmc6CiAKLSAgICAgaW5zbW9kIGUxMDAwIFR4RGVzY3JpcHRvcnM9ODAsMTI4CisgICAgIG1vZHByb2JlIGUxMDAwIFR4RGVzY3JpcHRvcnM9ODAsMTI4CiAKLWxvYWRzIHRoZSBlMTAwMCBkcml2ZXIgd2l0aCA4MCBUWCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpcnN0IGFkYXB0ZXIgYW5kIDEyOAotVFggZGVzY3JpcHRvcnMgZm9yIHRoZSBzZWNvbmQgYWRhcHRlci4KK2xvYWRzIHRoZSBlMTAwMCBkcml2ZXIgd2l0aCA4MCBUWCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpcnN0IGFkYXB0ZXIgYW5kCisxMjggVFggZGVzY3JpcHRvcnMgZm9yIHRoZSBzZWNvbmQgYWRhcHRlci4KIAogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggcGFyYW1ldGVyIGlzIGdlbmVyYWxseSB0aGUgcmVjb21tZW5kZWQgc2V0dGluZywKIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQuCkBAIC04Nyw3ICs5MCw3IEBACiAgICAgICAgIGh0dHA6Ly93d3cuaW50ZWwuY29tL2Rlc2lnbi9uZXR3b3JrL2FwcGxub3RzL2FwNDUwLmh0bQogCiAgICAgICAgIEEgZGVzY3JpcHRvciBkZXNjcmliZXMgYSBkYXRhIGJ1ZmZlciBhbmQgYXR0cmlidXRlcyByZWxhdGVkIHRvCi0gICAgICAgIHRoZSBkYXRhIGJ1ZmZlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhY2Nlc3NlZCBieSB0aGUgaGFyZHdhcmUuCisgICAgICAgIHRoZSBkYXRhIGJ1ZmZlci4gIFRoaXMgaW5mb3JtYXRpb24gaXMgYWNjZXNzZWQgYnkgdGhlIGhhcmR3YXJlLgogCiAKIEF1dG9OZWcKQEAgLTk2LDkgKzk5LDkgQEAKIFZhbGlkIFJhbmdlOiAgIDB4MDEtMHgwRiwgMHgyMC0weDJGCiBEZWZhdWx0IFZhbHVlOiAweDJGCiAKLVRoaXMgcGFyYW1ldGVyIGlzIGEgYml0IG1hc2sgdGhhdCBzcGVjaWZpZXMgd2hpY2ggc3BlZWQgYW5kIGR1cGxleAotc2V0dGluZ3MgdGhlIGJvYXJkIGFkdmVydGlzZXMuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCwgdGhlIFNwZWVkCi1hbmQgRHVwbGV4IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgc3BlY2lmaWVkLgorVGhpcyBwYXJhbWV0ZXIgaXMgYSBiaXQtbWFzayB0aGF0IHNwZWNpZmllcyB0aGUgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncworYWR2ZXJ0aXNlZCBieSB0aGUgYWRhcHRlci4gIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCwgdGhlIFNwZWVkIGFuZAorRHVwbGV4IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgc3BlY2lmaWVkLgogCiBOT1RFOiAgUmVmZXIgdG8gdGhlIFNwZWVkIGFuZCBEdXBsZXggc2VjdGlvbiBvZiB0aGlzIHJlYWRtZSBmb3IgbW9yZQogICAgICAgIGluZm9ybWF0aW9uIG9uIHRoZSBBdXRvTmVnIHBhcmFtZXRlci4KQEAgLTExMCwxNCArMTEzLDE1IEBACiBWYWxpZCBSYW5nZTogICAwLTIgKDA9YXV0by1uZWdvdGlhdGUsIDE9aGFsZiwgMj1mdWxsKQogRGVmYXVsdCBWYWx1ZTogMAogCi1EZWZpbmVzIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggZGF0YSBpcyBhbGxvd2VkIHRvIGZsb3cuIENhbiBiZSBlaXRoZXIKLW9uZSBvciB0d28tZGlyZWN0aW9uYWwuIElmIGJvdGggRHVwbGV4IGFuZCB0aGUgbGluayBwYXJ0bmVyIGFyZSBzZXQgdG8KLWF1dG8tbmVnb3RpYXRlLCB0aGUgYm9hcmQgYXV0by1kZXRlY3RzIHRoZSBjb3JyZWN0IGR1cGxleC4gSWYgdGhlIGxpbmsKLXBhcnRuZXIgaXMgZm9yY2VkIChlaXRoZXIgZnVsbCBvciBoYWxmKSwgRHVwbGV4IGRlZmF1bHRzIHRvIGhhbGYtZHVwbGV4LgorVGhpcyBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggZGF0YSBpcyBhbGxvd2VkIHRvIGZsb3cuICBDYW4gYmUKK2VpdGhlciBvbmUgb3IgdHdvLWRpcmVjdGlvbmFsLiAgSWYgYm90aCBEdXBsZXggYW5kIHRoZSBsaW5rIHBhcnRuZXIgYXJlCitzZXQgdG8gYXV0by1uZWdvdGlhdGUsIHRoZSBib2FyZCBhdXRvLWRldGVjdHMgdGhlIGNvcnJlY3QgZHVwbGV4LiAgSWYgdGhlCitsaW5rIHBhcnRuZXIgaXMgZm9yY2VkIChlaXRoZXIgZnVsbCBvciBoYWxmKSwgRHVwbGV4IGRlZmF1bHRzIHRvIGhhbGYtCitkdXBsZXguCiAKIAogRmxvd0NvbnRyb2wKLS0tLS0tLS0tLS0KKy0tLS0tLS0tLS0tCiBWYWxpZCBSYW5nZTogICAwLTMgKDA9bm9uZSwgMT1SeCBvbmx5LCAyPVR4IG9ubHksIDM9UngmVHgpCiBEZWZhdWx0IFZhbHVlOiBSZWFkcyBmbG93IGNvbnRyb2wgc2V0dGluZ3MgZnJvbSB0aGUgRUVQUk9NCiAKQEAgLTEyNyw1NyArMTMxLDEwNyBAQAogCiBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vdCBzdXBwb3J0ZWQgb24gSW50ZWwgODI1NDIsIDgyNTQzIG9yIDgyNTQ0LWJhc2VkIGFkYXB0ZXJzKQotVmFsaWQgUmFuZ2U6ICAgMTAwLTEwMDAwMCAoMD1vZmYsIDE9ZHluYW1pYykKLURlZmF1bHQgVmFsdWU6IDgwMDAKKyhub3Qgc3VwcG9ydGVkIG9uIEludGVsKFIpIDgyNTQyLCA4MjU0MyBvciA4MjU0NC1iYXNlZCBhZGFwdGVycykKK1ZhbGlkIFJhbmdlOiAgIDAsMSwzLDEwMC0xMDAwMDAgKDA9b2ZmLCAxPWR5bmFtaWMsIDM9ZHluYW1pYyBjb25zZXJ2YXRpdmUpCitEZWZhdWx0IFZhbHVlOiAzCiAKLVRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgc2Vjb25kIHRoZQotY29udHJvbGxlciBnZW5lcmF0ZXMuIEludGVycnVwdFRocm90dGxlUmF0ZSBpcyBhbm90aGVyIHNldHRpbmcgdXNlZCBpbgotaW50ZXJydXB0IG1vZGVyYXRpb24uIER5bmFtaWMgbW9kZSB1c2VzIGEgaGV1cmlzdGljIGFsZ29yaXRobSB0byBhZGp1c3QKLUludGVycnVwdFRocm90dGxlUmF0ZSBiYXNlZCBvbiB0aGUgY3VycmVudCB0cmFmZmljIGxvYWQuCitUaGUgZHJpdmVyIGNhbiBsaW1pdCB0aGUgYW1vdW50IG9mIGludGVycnVwdHMgcGVyIHNlY29uZCB0aGF0IHRoZSBhZGFwdGVyCit3aWxsIGdlbmVyYXRlIGZvciBpbmNvbWluZyBwYWNrZXRzLiBJdCBkb2VzIHRoaXMgYnkgd3JpdGluZyBhIHZhbHVlIHRvIHRoZSAKK2FkYXB0ZXIgdGhhdCBpcyBiYXNlZCBvbiB0aGUgbWF4aW11bSBhbW91bnQgb2YgaW50ZXJydXB0cyB0aGF0IHRoZSBhZGFwdGVyIAord2lsbCBnZW5lcmF0ZSBwZXIgc2Vjb25kLgorCitTZXR0aW5nIEludGVycnVwdFRocm90dGxlUmF0ZSB0byBhIHZhbHVlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMTAwCit3aWxsIHByb2dyYW0gdGhlIGFkYXB0ZXIgdG8gc2VuZCBvdXQgYSBtYXhpbXVtIG9mIHRoYXQgbWFueSBpbnRlcnJ1cHRzCitwZXIgc2Vjb25kLCBldmVuIGlmIG1vcmUgcGFja2V0cyBoYXZlIGNvbWUgaW4uIFRoaXMgcmVkdWNlcyBpbnRlcnJ1cHQKK2xvYWQgb24gdGhlIHN5c3RlbSBhbmQgY2FuIGxvd2VyIENQVSB1dGlsaXphdGlvbiB1bmRlciBoZWF2eSBsb2FkLAorYnV0IHdpbGwgaW5jcmVhc2UgbGF0ZW5jeSBhcyBwYWNrZXRzIGFyZSBub3QgcHJvY2Vzc2VkIGFzIHF1aWNrbHkuCisKK1RoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgZHJpdmVyIHByZXZpb3VzbHkgYXNzdW1lZCBhIHN0YXRpYyAKK0ludGVycnVwdFRocm90dGxlUmF0ZSB2YWx1ZSBvZiA4MDAwLCBwcm92aWRpbmcgYSBnb29kIGZhbGxiYWNrIHZhbHVlIGZvciAKK2FsbCB0cmFmZmljIHR5cGVzLGJ1dCBsYWNraW5nIGluIHNtYWxsIHBhY2tldCBwZXJmb3JtYW5jZSBhbmQgbGF0ZW5jeS4gCitUaGUgaGFyZHdhcmUgY2FuIGhhbmRsZSBtYW55IG1vcmUgc21hbGwgcGFja2V0cyBwZXIgc2Vjb25kIGhvd2V2ZXIsIGFuZCAKK2ZvciB0aGlzIHJlYXNvbiBhbiBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBhbGdvcml0aG0gd2FzIGltcGxlbWVudGVkLgorCitTaW5jZSA3LjMueCwgdGhlIGRyaXZlciBoYXMgdHdvIGFkYXB0aXZlIG1vZGVzIChzZXR0aW5nIDEgb3IgMykgaW4gd2hpY2gKK2l0IGR5bmFtaWNhbGx5IGFkanVzdHMgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSB2YWx1ZSBiYXNlZCBvbiB0aGUgdHJhZmZpYyAKK3RoYXQgaXQgcmVjZWl2ZXMuIEFmdGVyIGRldGVybWluaW5nIHRoZSB0eXBlIG9mIGluY29taW5nIHRyYWZmaWMgaW4gdGhlIGxhc3QKK3RpbWVmcmFtZSwgaXQgd2lsbCBhZGp1c3QgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSAKK2ZvciB0aGF0IHRyYWZmaWMuCisKK1RoZSBhbGdvcml0aG0gY2xhc3NpZmllcyB0aGUgaW5jb21pbmcgdHJhZmZpYyBldmVyeSBpbnRlcnZhbCBpbnRvCitjbGFzc2VzLiAgT25jZSB0aGUgY2xhc3MgaXMgZGV0ZXJtaW5lZCwgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSB2YWx1ZSBpcyAKK2FkanVzdGVkIHRvIHN1aXQgdGhhdCB0cmFmZmljIHR5cGUgdGhlIGJlc3QuIFRoZXJlIGFyZSB0aHJlZSBjbGFzc2VzIGRlZmluZWQ6IAorIkJ1bGsgdHJhZmZpYyIsIGZvciBsYXJnZSBhbW91bnRzIG9mIHBhY2tldHMgb2Ygbm9ybWFsIHNpemU7ICJMb3cgbGF0ZW5jeSIsCitmb3Igc21hbGwgYW1vdW50cyBvZiB0cmFmZmljIGFuZC9vciBhIHNpZ25pZmljYW50IHBlcmNlbnRhZ2Ugb2Ygc21hbGwKK3BhY2tldHM7IGFuZCAiTG93ZXN0IGxhdGVuY3kiLCBmb3IgYWxtb3N0IGNvbXBsZXRlbHkgc21hbGwgcGFja2V0cyBvciAKK21pbmltYWwgdHJhZmZpYy4KKworSW4gZHluYW1pYyBjb25zZXJ2YXRpdmUgbW9kZSwgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSB2YWx1ZSBpcyBzZXQgdG8gNDAwMCAKK2ZvciB0cmFmZmljIHRoYXQgZmFsbHMgaW4gY2xhc3MgIkJ1bGsgdHJhZmZpYyIuIElmIHRyYWZmaWMgZmFsbHMgaW4gdGhlICJMb3cgCitsYXRlbmN5IiBvciAiTG93ZXN0IGxhdGVuY3kiIGNsYXNzLCB0aGUgSW50ZXJydXB0VGhyb3R0bGVSYXRlIGlzIGluY3JlYXNlZCAKK3N0ZXB3aXNlIHRvIDIwMDAwLiBUaGlzIGRlZmF1bHQgbW9kZSBpcyBzdWl0YWJsZSBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuCisKK0ZvciBzaXR1YXRpb25zIHdoZXJlIGxvdyBsYXRlbmN5IGlzIHZpdGFsIHN1Y2ggYXMgY2x1c3RlciBvcgorZ3JpZCBjb21wdXRpbmcsIHRoZSBhbGdvcml0aG0gY2FuIHJlZHVjZSBsYXRlbmN5IGV2ZW4gbW9yZSB3aGVuCitJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgaXMgc2V0IHRvIG1vZGUgMS4gSW4gdGhpcyBtb2RlLCB3aGljaCBvcGVyYXRlcwordGhlIHNhbWUgYXMgbW9kZSAzLCB0aGUgSW50ZXJydXB0VGhyb3R0bGVSYXRlIHdpbGwgYmUgaW5jcmVhc2VkIHN0ZXB3aXNlIHRvIAorNzAwMDAgZm9yIHRyYWZmaWMgaW4gY2xhc3MgIkxvd2VzdCBsYXRlbmN5Ii4KKworU2V0dGluZyBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdG8gMCB0dXJucyBvZmYgYW55IGludGVycnVwdCBtb2RlcmF0aW9uCithbmQgbWF5IGltcHJvdmUgc21hbGwgcGFja2V0IGxhdGVuY3ksIGJ1dCBpcyBnZW5lcmFsbHkgbm90IHN1aXRhYmxlCitmb3IgYnVsayB0aHJvdWdocHV0IHRyYWZmaWMuCiAKIE5PVEU6ICBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBUeEFic0ludERlbGF5IGFuZAotICAgICAgIFJ4QWJzSW50RGVsYXkgcGFyYW1ldGVycy4gSW4gb3RoZXIgd29yZHMsIG1pbmltaXppbmcgdGhlIHJlY2VpdmUKKyAgICAgICBSeEFic0ludERlbGF5IHBhcmFtZXRlcnMuICBJbiBvdGhlciB3b3JkcywgbWluaW1pemluZyB0aGUgcmVjZWl2ZQogICAgICAgIGFuZC9vciB0cmFuc21pdCBhYnNvbHV0ZSBkZWxheXMgZG9lcyBub3QgZm9yY2UgdGhlIGNvbnRyb2xsZXIgdG8KICAgICAgICBnZW5lcmF0ZSBtb3JlIGludGVycnVwdHMgdGhhbiB3aGF0IHRoZSBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZQogICAgICAgIGFsbG93cy4KIAotQ0FVVElPTjogIElmIHlvdSBhcmUgdXNpbmcgdGhlIEludGVsIFBSTy8xMDAwIENUIE5ldHdvcmsgQ29ubmVjdGlvbgorQ0FVVElPTjogIElmIHlvdSBhcmUgdXNpbmcgdGhlIEludGVsKFIpIFBSTy8xMDAwIENUIE5ldHdvcmsgQ29ubmVjdGlvbgogICAgICAgICAgIChjb250cm9sbGVyIDgyNTQ3KSwgc2V0dGluZyBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdG8gYSB2YWx1ZQogICAgICAgICAgIGdyZWF0ZXIgdGhhbiA3NSwwMDAsIG1heSBoYW5nIChzdG9wIHRyYW5zbWl0dGluZykgYWRhcHRlcnMKLSAgICAgICAgICB1bmRlciBjZXJ0YWluIG5ldHdvcmsgY29uZGl0aW9ucy4gSWYgdGhpcyBvY2N1cnMgYSBORVRERVYKLSAgICAgICAgICBXQVRDSERPRyBtZXNzYWdlIGlzIGxvZ2dlZCBpbiB0aGUgc3lzdGVtIGV2ZW50IGxvZy4gSW4KKyAgICAgICAgICB1bmRlciBjZXJ0YWluIG5ldHdvcmsgY29uZGl0aW9ucy4gIElmIHRoaXMgb2NjdXJzIGEgTkVUREVWCisgICAgICAgICAgV0FUQ0hET0cgbWVzc2FnZSBpcyBsb2dnZWQgaW4gdGhlIHN5c3RlbSBldmVudCBsb2cuICBJbgogICAgICAgICAgIGFkZGl0aW9uLCB0aGUgY29udHJvbGxlciBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0LCByZXN0b3JpbmcKLSAgICAgICAgICB0aGUgbmV0d29yayBjb25uZWN0aW9uLiBUbyBlbGltaW5hdGUgdGhlIHBvdGVudGlhbCBmb3IgdGhlCisgICAgICAgICAgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4gIFRvIGVsaW1pbmF0ZSB0aGUgcG90ZW50aWFsIGZvciB0aGUKICAgICAgICAgICBoYW5nLCBlbnN1cmUgdGhhdCBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgaXMgc2V0IG5vIGdyZWF0ZXIKICAgICAgICAgICB0aGFuIDc1LDAwMCBhbmQgaXMgbm90IHNldCB0byAwLgogCiBOT1RFOiAgV2hlbiBlMTAwMCBpcyBsb2FkZWQgd2l0aCBkZWZhdWx0IHNldHRpbmdzIGFuZCBtdWx0aXBsZSBhZGFwdGVycwogICAgICAgIGFyZSBpbiB1c2Ugc2ltdWx0YW5lb3VzbHksIHRoZSBDUFUgdXRpbGl6YXRpb24gbWF5IGluY3JlYXNlIG5vbi0KLSAgICAgICBsaW5lYXJseS4gSW4gb3JkZXIgdG8gbGltaXQgdGhlIENQVSB1dGlsaXphdGlvbiB3aXRob3V0IGltcGFjdGluZworICAgICAgIGxpbmVhcmx5LiAgSW4gb3JkZXIgdG8gbGltaXQgdGhlIENQVSB1dGlsaXphdGlvbiB3aXRob3V0IGltcGFjdGluZwogICAgICAgIHRoZSBvdmVyYWxsIHRocm91Z2hwdXQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBsb2FkIHRoZSBkcml2ZXIgYXMKICAgICAgICBmb2xsb3dzOgogCi0gICAgICAgICAgIGluc21vZCBlMTAwMC5vIEludGVycnVwdFRocm90dGxlUmF0ZT0zMDAwLDMwMDAsMzAwMAorICAgICAgICAgICBtb2Rwcm9iZSBlMTAwMCBJbnRlcnJ1cHRUaHJvdHRsZVJhdGU9MzAwMCwzMDAwLDMwMDAKIAogICAgICAgIFRoaXMgc2V0cyB0aGUgSW50ZXJydXB0VGhyb3R0bGVSYXRlIHRvIDMwMDAgaW50ZXJydXB0cy9zZWMgZm9yCi0gICAgICAgdGhlIGZpcnN0LCBzZWNvbmQsIGFuZCB0aGlyZCBpbnN0YW5jZXMgb2YgdGhlIGRyaXZlci4gVGhlIHJhbmdlCisgICAgICAgdGhlIGZpcnN0LCBzZWNvbmQsIGFuZCB0aGlyZCBpbnN0YW5jZXMgb2YgdGhlIGRyaXZlci4gIFRoZSByYW5nZQogICAgICAgIG9mIDIwMDAgdG8gMzAwMCBpbnRlcnJ1cHRzIHBlciBzZWNvbmQgd29ya3Mgb24gYSBtYWpvcml0eSBvZgogICAgICAgIHN5c3RlbXMgYW5kIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludCwgYnV0IHRoZSBvcHRpbWFsIHZhbHVlIHdpbGwKLSAgICAgICBiZSBwbGF0Zm9ybS1zcGVjaWZpYy4gSWYgQ1BVIHV0aWxpemF0aW9uIGlzIG5vdCBhIGNvbmNlcm4sIHVzZQorICAgICAgIGJlIHBsYXRmb3JtLXNwZWNpZmljLiAgSWYgQ1BVIHV0aWxpemF0aW9uIGlzIG5vdCBhIGNvbmNlcm4sIHVzZQogICAgICAgIFJYX1BPTExJTkcgKE5BUEkpIGFuZCBkZWZhdWx0IGRyaXZlciBzZXR0aW5ncy4KIAogCisKIFJ4RGVzY3JpcHRvcnMKIC0tLS0tLS0tLS0tLS0KIFZhbGlkIFJhbmdlOiAgIDgwLTI1NiBmb3IgODI1NDIgYW5kIDgyNTQzLWJhc2VkIGFkYXB0ZXJzCiAgICAgICAgICAgICAgICA4MC00MDk2IGZvciBhbGwgb3RoZXIgc3VwcG9ydGVkIGFkYXB0ZXJzCiBEZWZhdWx0IFZhbHVlOiAyNTYKIAotVGhpcyB2YWx1ZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIGFsbG9jYXRlZCBieSB0aGUKLWRyaXZlci4gSW5jcmVhc2luZyB0aGlzIHZhbHVlIGFsbG93cyB0aGUgZHJpdmVyIHRvIGJ1ZmZlciBtb3JlIGluY29taW5nCi1wYWNrZXRzLiAgRWFjaCBkZXNjcmlwdG9yIGlzIDE2IGJ5dGVzLiAgQSByZWNlaXZlIGJ1ZmZlciBpcyBhbHNvCi1hbGxvY2F0ZWQgZm9yIGVhY2ggZGVzY3JpcHRvciBhbmQgaXMgMjA0OC4KK1RoaXMgdmFsdWUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgYWxsb2NhdGVkCitieSB0aGUgZHJpdmVyLiAgSW5jcmVhc2luZyB0aGlzIHZhbHVlIGFsbG93cyB0aGUgZHJpdmVyIHRvIGJ1ZmZlciBtb3JlCitpbmNvbWluZyBwYWNrZXRzLCBhdCB0aGUgZXhwZW5zZSBvZiBpbmNyZWFzZWQgc3lzdGVtIG1lbW9yeSB1dGlsaXphdGlvbi4KKworRWFjaCBkZXNjcmlwdG9yIGlzIDE2IGJ5dGVzLiAgQSByZWNlaXZlIGJ1ZmZlciBpcyBhbHNvIGFsbG9jYXRlZCBmb3IgZWFjaAorZGVzY3JpcHRvciBhbmQgY2FuIGJlIGVpdGhlciAyMDQ4LCA0MDk2LCA4MTkyLCBvciAxNjM4NCBieXRlcywgZGVwZW5kaW5nIAorb24gdGhlIE1UVSBzZXR0aW5nLiBUaGUgbWF4aW11bSBNVFUgc2l6ZSBpcyAxNjExMC4KKworTk9URTogIE1UVSBkZXNpZ25hdGVzIHRoZSBmcmFtZSBzaXplLiAgSXQgb25seSBuZWVkcyB0byBiZSBzZXQgZm9yIEp1bWJvIAorICAgICAgIEZyYW1lcy4gIERlcGVuZGluZyBvbiB0aGUgYXZhaWxhYmxlIHN5c3RlbSByZXNvdXJjZXMsIHRoZSByZXF1ZXN0IAorICAgICAgIGZvciBhIGhpZ2hlciBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyBtYXkgYmUgZGVuaWVkLiAgSW4gdGhpcyAKKyAgICAgICBjYXNlLCB1c2UgYSBsb3dlciBudW1iZXIuCiAKIAogUnhJbnREZWxheQpAQCAtMTg3LDE3ICsyNDEsMTcgQEAKIAogVGhpcyB2YWx1ZSBkZWxheXMgdGhlIGdlbmVyYXRpb24gb2YgcmVjZWl2ZSBpbnRlcnJ1cHRzIGluIHVuaXRzIG9mIDEuMDI0CiBtaWNyb3NlY29uZHMuICBSZWNlaXZlIGludGVycnVwdCByZWR1Y3Rpb24gY2FuIGltcHJvdmUgQ1BVIGVmZmljaWVuY3kgaWYKLXByb3Blcmx5IHR1bmVkIGZvciBzcGVjaWZpYyBuZXR3b3JrIHRyYWZmaWMuIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSBhZGRzCitwcm9wZXJseSB0dW5lZCBmb3Igc3BlY2lmaWMgbmV0d29yayB0cmFmZmljLiAgSW5jcmVhc2luZyB0aGlzIHZhbHVlIGFkZHMKIGV4dHJhIGxhdGVuY3kgdG8gZnJhbWUgcmVjZXB0aW9uIGFuZCBjYW4gZW5kIHVwIGRlY3JlYXNpbmcgdGhlIHRocm91Z2hwdXQKLW9mIFRDUCB0cmFmZmljLiBJZiB0aGUgc3lzdGVtIGlzIHJlcG9ydGluZyBkcm9wcGVkIHJlY2VpdmVzLCB0aGlzIHZhbHVlCitvZiBUQ1AgdHJhZmZpYy4gIElmIHRoZSBzeXN0ZW0gaXMgcmVwb3J0aW5nIGRyb3BwZWQgcmVjZWl2ZXMsIHRoaXMgdmFsdWUKIG1heSBiZSBzZXQgdG9vIGhpZ2gsIGNhdXNpbmcgdGhlIGRyaXZlciB0byBydW4gb3V0IG9mIGF2YWlsYWJsZSByZWNlaXZlCiBkZXNjcmlwdG9ycy4KIAogQ0FVVElPTjogIFdoZW4gc2V0dGluZyBSeEludERlbGF5IHRvIGEgdmFsdWUgb3RoZXIgdGhhbiAwLCBhZGFwdGVycyBtYXkKLSAgICAgICAgICBoYW5nIChzdG9wIHRyYW5zbWl0dGluZykgdW5kZXIgY2VydGFpbiBuZXR3b3JrIGNvbmRpdGlvbnMuIElmCisgICAgICAgICAgaGFuZyAoc3RvcCB0cmFuc21pdHRpbmcpIHVuZGVyIGNlcnRhaW4gbmV0d29yayBjb25kaXRpb25zLiAgSWYKICAgICAgICAgICB0aGlzIG9jY3VycyBhIE5FVERFViBXQVRDSERPRyBtZXNzYWdlIGlzIGxvZ2dlZCBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgZXZlbnQgbG9nLiBJbiBhZGRpdGlvbiwgdGhlIGNvbnRyb2xsZXIgaXMgYXV0b21hdGljYWxseSByZXNldCwKLSAgICAgICAgICByZXN0b3JpbmcgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4gVG8gZWxpbWluYXRlIHRoZSBwb3RlbnRpYWwKKyAgICAgICAgICBldmVudCBsb2cuICBJbiBhZGRpdGlvbiwgdGhlIGNvbnRyb2xsZXIgaXMgYXV0b21hdGljYWxseSByZXNldCwKKyAgICAgICAgICByZXN0b3JpbmcgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4gIFRvIGVsaW1pbmF0ZSB0aGUgcG90ZW50aWFsCiAgICAgICAgICAgZm9yIHRoZSBoYW5nIGVuc3VyZSB0aGF0IFJ4SW50RGVsYXkgaXMgc2V0IHRvIDAuCiAKIApAQCAtMjA4LDcgKzI2Miw3IEBACiBEZWZhdWx0IFZhbHVlOiAxMjgKIAogVGhpcyB2YWx1ZSwgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzLCBsaW1pdHMgdGhlIGRlbGF5IGluIHdoaWNoIGEKLXJlY2VpdmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4gVXNlZnVsIG9ubHkgaWYgUnhJbnREZWxheSBpcyBub24temVybywKK3JlY2VpdmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4gIFVzZWZ1bCBvbmx5IGlmIFJ4SW50RGVsYXkgaXMgbm9uLXplcm8sCiB0aGlzIHZhbHVlIGVuc3VyZXMgdGhhdCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGFmdGVyIHRoZSBpbml0aWFsCiBwYWNrZXQgaXMgcmVjZWl2ZWQgd2l0aGluIHRoZSBzZXQgYW1vdW50IG9mIHRpbWUuICBQcm9wZXIgdHVuaW5nLAogYWxvbmcgd2l0aCBSeEludERlbGF5LCBtYXkgaW1wcm92ZSB0cmFmZmljIHRocm91Z2hwdXQgaW4gc3BlY2lmaWMgbmV0d29yawpAQCAtMjIyLDkgKzI3Niw5IEBACiBEZWZhdWx0IFZhbHVlOiAgMCAoYXV0by1uZWdvdGlhdGUgYXQgYWxsIHN1cHBvcnRlZCBzcGVlZHMpCiAKIFNwZWVkIGZvcmNlcyB0aGUgbGluZSBzcGVlZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIG1lZ2FiaXRzIHBlciBzZWNvbmQKLShNYnBzKS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8gMCBhbmQgdGhlIGxpbmsKKyhNYnBzKS4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvIDAgYW5kIHRoZSBsaW5rCiBwYXJ0bmVyIGlzIHNldCB0byBhdXRvLW5lZ290aWF0ZSwgdGhlIGJvYXJkIHdpbGwgYXV0by1kZXRlY3QgdGhlIGNvcnJlY3QKLXNwZWVkLiBEdXBsZXggc2hvdWxkIGFsc28gYmUgc2V0IHdoZW4gU3BlZWQgaXMgc2V0IHRvIGVpdGhlciAxMCBvciAxMDAuCitzcGVlZC4gIER1cGxleCBzaG91bGQgYWxzbyBiZSBzZXQgd2hlbiBTcGVlZCBpcyBzZXQgdG8gZWl0aGVyIDEwIG9yIDEwMC4KIAogCiBUeERlc2NyaXB0b3JzCkBAIC0yMzQsNyArMjg4LDcgQEAKIERlZmF1bHQgVmFsdWU6IDI1NgogCiBUaGlzIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIuCi1JbmNyZWFzaW5nIHRoaXMgdmFsdWUgYWxsb3dzIHRoZSBkcml2ZXIgdG8gcXVldWUgbW9yZSB0cmFuc21pdHMuIEVhY2gKK0luY3JlYXNpbmcgdGhpcyB2YWx1ZSBhbGxvd3MgdGhlIGRyaXZlciB0byBxdWV1ZSBtb3JlIHRyYW5zbWl0cy4gIEVhY2gKIGRlc2NyaXB0b3IgaXMgMTYgYnl0ZXMuCiAKIE5PVEU6ICBEZXBlbmRpbmcgb24gdGhlIGF2YWlsYWJsZSBzeXN0ZW0gcmVzb3VyY2VzLCB0aGUgcmVxdWVzdCBmb3IgYQpAQCAtMjQ4LDggKzMwMiw4IEBACiBEZWZhdWx0IFZhbHVlOiA2NAogCiBUaGlzIHZhbHVlIGRlbGF5cyB0aGUgZ2VuZXJhdGlvbiBvZiB0cmFuc21pdCBpbnRlcnJ1cHRzIGluIHVuaXRzIG9mCi0xLjAyNCBtaWNyb3NlY29uZHMuIFRyYW5zbWl0IGludGVycnVwdCByZWR1Y3Rpb24gY2FuIGltcHJvdmUgQ1BVCi1lZmZpY2llbmN5IGlmIHByb3Blcmx5IHR1bmVkIGZvciBzcGVjaWZpYyBuZXR3b3JrIHRyYWZmaWMuIElmIHRoZQorMS4wMjQgbWljcm9zZWNvbmRzLiAgVHJhbnNtaXQgaW50ZXJydXB0IHJlZHVjdGlvbiBjYW4gaW1wcm92ZSBDUFUKK2VmZmljaWVuY3kgaWYgcHJvcGVybHkgdHVuZWQgZm9yIHNwZWNpZmljIG5ldHdvcmsgdHJhZmZpYy4gIElmIHRoZQogc3lzdGVtIGlzIHJlcG9ydGluZyBkcm9wcGVkIHRyYW5zbWl0cywgdGhpcyB2YWx1ZSBtYXkgYmUgc2V0IHRvbyBoaWdoCiBjYXVzaW5nIHRoZSBkcml2ZXIgdG8gcnVuIG91dCBvZiBhdmFpbGFibGUgdHJhbnNtaXQgZGVzY3JpcHRvcnMuCiAKQEAgLTI2MSw3ICszMTUsNyBAQAogRGVmYXVsdCBWYWx1ZTogNjQKIAogVGhpcyB2YWx1ZSwgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzLCBsaW1pdHMgdGhlIGRlbGF5IGluIHdoaWNoIGEKLXRyYW5zbWl0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQuIFVzZWZ1bCBvbmx5IGlmIFR4SW50RGVsYXkgaXMgbm9uLXplcm8sCit0cmFuc21pdCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkLiAgVXNlZnVsIG9ubHkgaWYgVHhJbnREZWxheSBpcyBub24temVybywKIHRoaXMgdmFsdWUgZW5zdXJlcyB0aGF0IGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIGluaXRpYWwKIHBhY2tldCBpcyBzZW50IG9uIHRoZSB3aXJlIHdpdGhpbiB0aGUgc2V0IGFtb3VudCBvZiB0aW1lLiAgUHJvcGVyIHR1bmluZywKIGFsb25nIHdpdGggVHhJbnREZWxheSwgbWF5IGltcHJvdmUgdHJhZmZpYyB0aHJvdWdocHV0IGluIHNwZWNpZmljCkBAIC0yODgsMTUgKzM0MiwxNSBAQAogCiBGb3IgY29wcGVyLWJhc2VkIGJvYXJkcywgdGhlIGtleXdvcmRzIGludGVyYWN0IGFzIGZvbGxvd3M6CiAKLSAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIGlzIGF1dG8tbmVnb3RpYXRlLiBUaGUgYm9hcmQgYWR2ZXJ0aXNlcyBhbGwKKyAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIGlzIGF1dG8tbmVnb3RpYXRlLiAgVGhlIGJvYXJkIGFkdmVydGlzZXMgYWxsCiAgIHN1cHBvcnRlZCBzcGVlZCBhbmQgZHVwbGV4IGNvbWJpbmF0aW9ucywgYW5kIGl0IGxpbmtzIGF0IHRoZSBoaWdoZXN0CiAgIGNvbW1vbiBzcGVlZCBhbmQgZHVwbGV4IG1vZGUgSUYgdGhlIGxpbmsgcGFydG5lciBpcyBzZXQgdG8gYXV0by1uZWdvdGlhdGUuCiAKICAgSWYgU3BlZWQgPSAxMDAwLCBsaW1pdGVkIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCBhbmQgb25seSAxMDAwIE1icHMKICAgaXMgYWR2ZXJ0aXNlZCAoVGhlIDEwMDBCYXNlVCBzcGVjIHJlcXVpcmVzIGF1dG8tbmVnb3RpYXRpb24uKQogCi0gIElmIFNwZWVkID0gMTAgb3IgMTAwLCB0aGVuIGJvdGggU3BlZWQgYW5kIER1cGxleCBzaG91bGQgYmUgc2V0LiBBdXRvLQotICBuZWdvdGlhdGlvbiBpcyBkaXNhYmxlZCwgYW5kIHRoZSBBdXRvTmVnIHBhcmFtZXRlciBpcyBpZ25vcmVkLiBQYXJ0bmVyCisgIElmIFNwZWVkID0gMTAgb3IgMTAwLCB0aGVuIGJvdGggU3BlZWQgYW5kIER1cGxleCBzaG91bGQgYmUgc2V0LiAgQXV0by0KKyAgbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQsIGFuZCB0aGUgQXV0b05lZyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gIFBhcnRuZXIKICAgU0hPVUxEIGFsc28gYmUgZm9yY2VkLgogCiBUaGUgQXV0b05lZyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIG1vcmUgY29udHJvbCBpcyByZXF1aXJlZCBvdmVyIHRoZQpAQCAtMzA0LDcgKzM1OCw3IEBACiBzcGVlZCBhbmQgZHVwbGV4IGNvbWJpbmF0aW9ucyBhcmUgYWR2ZXJ0aXNlZCBkdXJpbmcgdGhlIGF1dG8tbmVnb3RpYXRpb24KIHByb2Nlc3MuCiAKLVRoZSBwYXJhbWV0ZXIgbWF5IGJlIHNwZWNpZmllZCBhcyBlaXRoZXIgYSBkZWNpbWFsIG9yIGhleGlkZWNpbWFsIHZhbHVlIGFzCitUaGUgcGFyYW1ldGVyIG1heSBiZSBzcGVjaWZpZWQgYXMgZWl0aGVyIGEgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCB2YWx1ZSBhcwogZGV0ZXJtaW5lZCBieSB0aGUgYml0bWFwIGJlbG93LgogCiBCaXQgcG9zaXRpb24gICA3ICAgICAgNiAgICAgIDUgICAgICAgNCAgICAgICAzICAgICAgMiAgICAgIDEgICAgICAgMApAQCAtMzM3LDIwICszOTEsMTkgQEAKIAogICBDb25maWd1cmluZyB0aGUgRHJpdmVyIG9uIERpZmZlcmVudCBEaXN0cmlidXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogICBDb25maWd1cmluZyBhIG5ldHdvcmsgZHJpdmVyIHRvIGxvYWQgcHJvcGVybHkgd2hlbiB0aGUgc3lzdGVtIGlzIHN0YXJ0ZWQKLSAgaXMgZGlzdHJpYnV0aW9uIGRlcGVuZGVudC4gVHlwaWNhbGx5LCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIGludm9sdmVzCisgIGlzIGRpc3RyaWJ1dGlvbiBkZXBlbmRlbnQuICBUeXBpY2FsbHksIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MgaW52b2x2ZXMKICAgYWRkaW5nIGFuIGFsaWFzIGxpbmUgdG8gL2V0Yy9tb2R1bGVzLmNvbmYgb3IgL2V0Yy9tb2Rwcm9iZS5jb25mIGFzIHdlbGwKLSAgYXMgZWRpdGluZyBvdGhlciBzeXN0ZW0gc3RhcnR1cCBzY3JpcHRzIGFuZC9vciBjb25maWd1cmF0aW9uIGZpbGVzLiBNYW55CisgIGFzIGVkaXRpbmcgb3RoZXIgc3lzdGVtIHN0YXJ0dXAgc2NyaXB0cyBhbmQvb3IgY29uZmlndXJhdGlvbiBmaWxlcy4gIE1hbnkKICAgcG9wdWxhciBMaW51eCBkaXN0cmlidXRpb25zIHNoaXAgd2l0aCB0b29scyB0byBtYWtlIHRoZXNlIGNoYW5nZXMgZm9yIHlvdS4KICAgVG8gbGVhcm4gdGhlIHByb3BlciB3YXkgdG8gY29uZmlndXJlIGEgbmV0d29yayBkZXZpY2UgZm9yIHlvdXIgc3lzdGVtLAotICByZWZlciB0byB5b3VyIGRpc3RyaWJ1dGlvbiBkb2N1bWVudGF0aW9uLiBJZiBkdXJpbmcgdGhpcyBwcm9jZXNzIHlvdSBhcmUKKyAgcmVmZXIgdG8geW91ciBkaXN0cmlidXRpb24gZG9jdW1lbnRhdGlvbi4gIElmIGR1cmluZyB0aGlzIHByb2Nlc3MgeW91IGFyZQogICBhc2tlZCBmb3IgdGhlIGRyaXZlciBvciBtb2R1bGUgbmFtZSwgdGhlIG5hbWUgZm9yIHRoZSBMaW51eCBCYXNlIERyaXZlcgotICBmb3IgdGhlIEludGVsIFBSTy8xMDAwIEZhbWlseSBvZiBBZGFwdGVycyBpcyBlMTAwMC4KKyAgZm9yIHRoZSBJbnRlbChSKSBQUk8vMTAwMCBGYW1pbHkgb2YgQWRhcHRlcnMgaXMgZTEwMDAuCiAKICAgQXMgYW4gZXhhbXBsZSwgaWYgeW91IGluc3RhbGwgdGhlIGUxMDAwIGRyaXZlciBmb3IgdHdvIFBSTy8xMDAwIGFkYXB0ZXJzCiAgIChldGgwIGFuZCBldGgxKSBhbmQgc2V0IHRoZSBzcGVlZCBhbmQgZHVwbGV4IHRvIDEwZnVsbCBhbmQgMTAwaGFsZiwgYWRkCi0gIHRoZSBmb2xsb3dpbmcgdG8gbW9kdWxlcy5jb25mIG9yIG1vZHByb2JlLmNvbmY6CisgIHRoZSBmb2xsb3dpbmcgdG8gbW9kdWxlcy5jb25mIG9yIG9yIG1vZHByb2JlLmNvbmY6CiAKICAgICAgICBhbGlhcyBldGgwIGUxMDAwCiAgICAgICAgYWxpYXMgZXRoMSBlMTAwMApAQCAtMzU4LDkgKzQxMSw4IEBACiAKICAgVmlld2luZyBMaW5rIE1lc3NhZ2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiAgIExpbmsgbWVzc2FnZXMgd2lsbCBub3QgYmUgZGlzcGxheWVkIHRvIHRoZSBjb25zb2xlIGlmIHRoZSBkaXN0cmlidXRpb24gaXMKLSAgcmVzdHJpY3Rpbmcgc3lzdGVtIG1lc3NhZ2VzLiBJbiBvcmRlciB0byBzZWUgbmV0d29yayBkcml2ZXIgbGluayBtZXNzYWdlcworICByZXN0cmljdGluZyBzeXN0ZW0gbWVzc2FnZXMuICBJbiBvcmRlciB0byBzZWUgbmV0d29yayBkcml2ZXIgbGluayBtZXNzYWdlcwogICBvbiB5b3VyIGNvbnNvbGUsIHNldCBkbWVzZyB0byBlaWdodCBieSBlbnRlcmluZyB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgZG1lc2cgLW4gOApAQCAtMzY5LDExICs0MjEsOSBAQAogCiAgIEp1bWJvIEZyYW1lcwogICAtLS0tLS0tLS0tLS0KLQotICBUaGUgZHJpdmVyIHN1cHBvcnRzIEp1bWJvIEZyYW1lcyBmb3IgYWxsIGFkYXB0ZXJzIGV4Y2VwdCA4MjU0MiBhbmQKLSAgODI1NzMtYmFzZWQgYWRhcHRlcnMuIEp1bWJvIEZyYW1lcyBzdXBwb3J0IGlzIGVuYWJsZWQgYnkgY2hhbmdpbmcgdGhlCi0gIE1UVSB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0IG9mIDE1MDAuIFVzZSB0aGUgaWZjb25maWcgY29tbWFuZAotICB0byBpbmNyZWFzZSB0aGUgTVRVIHNpemUuIEZvciBleGFtcGxlOgorICBKdW1ibyBGcmFtZXMgc3VwcG9ydCBpcyBlbmFibGVkIGJ5IGNoYW5naW5nIHRoZSBNVFUgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbgorICB0aGUgZGVmYXVsdCBvZiAxNTAwLiAgVXNlIHRoZSBpZmNvbmZpZyBjb21tYW5kIHRvIGluY3JlYXNlIHRoZSBNVFUgc2l6ZS4KKyAgRm9yIGV4YW1wbGU6CiAKICAgICAgICBpZmNvbmZpZyBldGg8eD4gbXR1IDkwMDAgdXAKIApAQCAtMzkwLDI2ICs0NDAsNDkgQEAKIAogICAtIFRvIGVuYWJsZSBKdW1ibyBGcmFtZXMsIGluY3JlYXNlIHRoZSBNVFUgc2l6ZSBvbiB0aGUgaW50ZXJmYWNlIGJleW9uZAogICAgIDE1MDAuCi0gIC0gVGhlIG1heGltdW0gTVRVIHNldHRpbmcgZm9yIEp1bWJvIEZyYW1lcyBpcyAxNjExMC4gVGhpcyB2YWx1ZSBjb2luY2lkZXMKKworICAtIFRoZSBtYXhpbXVtIE1UVSBzZXR0aW5nIGZvciBKdW1ibyBGcmFtZXMgaXMgMTYxMTAuICBUaGlzIHZhbHVlIGNvaW5jaWRlcwogICAgIHdpdGggdGhlIG1heGltdW0gSnVtYm8gRnJhbWVzIHNpemUgb2YgMTYxMjguCisKICAgLSBVc2luZyBKdW1ibyBGcmFtZXMgYXQgMTAgb3IgMTAwIE1icHMgbWF5IHJlc3VsdCBpbiBwb29yIHBlcmZvcm1hbmNlIG9yCiAgICAgbG9zcyBvZiBsaW5rLgorCiAgIC0gU29tZSBJbnRlbCBnaWdhYml0IGFkYXB0ZXJzIHRoYXQgc3VwcG9ydCBKdW1ibyBGcmFtZXMgaGF2ZSBhIGZyYW1lIHNpemUKICAgICBsaW1pdCBvZiA5MjM4IGJ5dGVzLCB3aXRoIGEgY29ycmVzcG9uZGluZyBNVFUgc2l6ZSBsaW1pdCBvZiA5MjE2IGJ5dGVzLgotICAgIFRoZSBhZGFwdGVycyB3aXRoIHRoaXMgbGltaXRhdGlvbiBhcmUgYmFzZWQgb24gdGhlIEludGVsIDgyNTcxRUIgYW5kCi0gICAgODI1NzJFSSBjb250cm9sbGVycywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGVzZSBwcm9kdWN0IG5hbWVzOgotICAgICBJbnRlbK4gUFJPLzEwMDAgUFQgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCi0gICAgIEludGVsriBQUk8vMTAwMCBQRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLSAgICAgSW50ZWyuIFBSTy8xMDAwIFBUIFNlcnZlciBBZGFwdGVyCi0gICAgIEludGVsriBQUk8vMTAwMCBQVCBEZXNrdG9wIEFkYXB0ZXIKLSAgICAgSW50ZWyuIFBSTy8xMDAwIFBGIFNlcnZlciBBZGFwdGVyCisgICAgVGhlIGFkYXB0ZXJzIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwoUikgODI1NzFFQiwKKyAgICA4MjU3MkVJLCA4MjU3M0wgYW5kIDgwMDAzRVMyTEFOIGNvbnRyb2xsZXIuICBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZQorICAgIGZvbGxvd2luZyBwcm9kdWN0IG5hbWVzOgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQVCBTZXJ2ZXIgQWRhcHRlcgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQVCBEZXNrdG9wIEFkYXB0ZXIKKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUFQgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBUIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQVCBEdWFsIFBvcnQgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBGIFNlcnZlciBBZGFwdGVyCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBGIE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUEIgU2VydmVyIENvbm5lY3Rpb24KKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUEwgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIFBSTy8xMDAwIEVCIE5ldHdvcmsgQ29ubmVjdGlvbiB3aXRoIEkvTyBBY2NlbGVyYXRpb24KKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgRUIgQmFja3BsYW5lIENvbm5lY3Rpb24gd2l0aCBJL08gQWNjZWxlcmF0aW9uCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBUIFF1YWQgUG9ydCBTZXJ2ZXIgQWRhcHRlcgogCi0gIC0gVGhlIEludGVsIFBSTy8xMDAwIFBNIE5ldHdvcmsgQ29ubmVjdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGp1bWJvIGZyYW1lcy4KKyAgLSBBZGFwdGVycyBiYXNlZCBvbiB0aGUgSW50ZWwoUikgODI1NDIgYW5kIDgyNTczVi9FIGNvbnRyb2xsZXIgZG8gbm90CisgICAgc3VwcG9ydCBKdW1ibyBGcmFtZXMuIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZyBwcm9kdWN0IG5hbWVzOgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBHaWdhYml0IFNlcnZlciBBZGFwdGVyCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBNIE5ldHdvcmsgQ29ubmVjdGlvbgorCisgIC0gVGhlIGZvbGxvd2luZyBhZGFwdGVycyBkbyBub3Qgc3VwcG9ydCBKdW1ibyBGcmFtZXM6CisgICAgIEludGVsKFIpIDgyNTYyViAxMC8xMDAgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIDgyNTY2RE0gR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KKyAgICAgSW50ZWwoUikgODI1NjZEQyBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSA4MjU2Nk1NIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIDgyNTY2TUMgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KKyAgICAgSW50ZWwoUikgODI1NjJHVCAxMC8xMDAgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIDgyNTYyRyAxMC8xMDAgTmV0d29yayBDb25uZWN0aW9uCiAKIAogICBFdGh0b29sCiAgIC0tLS0tLS0KLQogICBUaGUgZHJpdmVyIHV0aWxpemVzIHRoZSBldGh0b29sIGludGVyZmFjZSBmb3IgZHJpdmVyIGNvbmZpZ3VyYXRpb24gYW5kCiAgIGRpYWdub3N0aWNzLCBhcyB3ZWxsIGFzIGRpc3BsYXlpbmcgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24uICBFdGh0b29sCiAgIHZlcnNpb24gMS42IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkuCkBAIC00MTcsMTUgKzQ5MCwxNCBAQAogICBUaGUgbGF0ZXN0IHJlbGVhc2Ugb2YgZXRodG9vbCBjYW4gYmUgZm91bmQgZnJvbQogICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2drZXJuZWwuCiAKLSAgTk9URTogRXRodG9vbCAxLjYgb25seSBzdXBwb3J0cyBhIGxpbWl0ZWQgc2V0IG9mIGV0aHRvb2wgb3B0aW9ucy4gU3VwcG9ydAorICBOT1RFOiBFdGh0b29sIDEuNiBvbmx5IHN1cHBvcnRzIGEgbGltaXRlZCBzZXQgb2YgZXRodG9vbCBvcHRpb25zLiAgU3VwcG9ydAogICBmb3IgYSBtb3JlIGNvbXBsZXRlIGV0aHRvb2wgZmVhdHVyZSBzZXQgY2FuIGJlIGVuYWJsZWQgYnkgdXBncmFkaW5nCiAgIGV0aHRvb2wgdG8gZXRodG9vbC0xLjguMS4KIAogICBFbmFibGluZyBXYWtlIG9uIExBTiogKFdvTCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgV29MIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgRXRodG9vbCogdXRpbGl0eS4gRXRodG9vbCBpcyBpbmNsdWRlZCB3aXRoCi0gIGFsbCB2ZXJzaW9ucyBvZiBSZWQgSGF0IGFmdGVyIFJlZCBIYXQgNy4yLiBGb3Igb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucywKKyAgV29MIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgRXRodG9vbCogdXRpbGl0eS4gIEV0aHRvb2wgaXMgaW5jbHVkZWQgd2l0aAorICBhbGwgdmVyc2lvbnMgb2YgUmVkIEhhdCBhZnRlciBSZWQgSGF0IDcuMi4gIEZvciBvdGhlciBMaW51eCBkaXN0cmlidXRpb25zLAogICBkb3dubG9hZCBhbmQgaW5zdGFsbCBFdGh0b29sIGZyb20gdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgogICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2drZXJuZWwuCiAKQEAgLTQzNiwxMSArNTA4LDE3IEBACiAgIEZvciB0aGlzIGRyaXZlciB2ZXJzaW9uLCBpbiBvcmRlciB0byBlbmFibGUgV29MLCB0aGUgZTEwMDAgZHJpdmVyIG11c3QgYmUKICAgbG9hZGVkIHdoZW4gc2h1dHRpbmcgZG93biBvciByZWJvb3RpbmcgdGhlIHN5c3RlbS4KIAorICBXYWtlIE9uIExBTiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBwb3J0IEEgZm9yIHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKKyAgSW50ZWwoUikgUFJPLzEwMDAgUFQgRHVhbCBQb3J0IE5ldHdvcmsgQ29ubmVjdGlvbgorICBJbnRlbChSKSBQUk8vMTAwMCBQVCBEdWFsIFBvcnQgU2VydmVyIENvbm5lY3Rpb24KKyAgSW50ZWwoUikgUFJPLzEwMDAgUFQgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCisgIEludGVsKFIpIFBSTy8xMDAwIFBGIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgorICBJbnRlbChSKSBQUk8vMTAwMCBQVCBRdWFkIFBvcnQgU2VydmVyIEFkYXB0ZXIgCisKICAgTkFQSQogICAtLS0tCi0KLSAgTkFQSSAoUnggcG9sbGluZyBtb2RlKSBpcyBzdXBwb3J0ZWQgaW4gdGhlIGUxMDAwIGRyaXZlci4gTkFQSSBpcyBlbmFibGVkCi0gIG9yIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBrZXJuZWwuIFRvIG92ZXJyaWRlCisgIE5BUEkgKFJ4IHBvbGxpbmcgbW9kZSkgaXMgc3VwcG9ydGVkIGluIHRoZSBlMTAwMCBkcml2ZXIuICBOQVBJIGlzIGVuYWJsZWQKKyAgb3IgZGlzYWJsZWQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGtlcm5lbC4gIFRvIG92ZXJyaWRlCiAgIHRoZSBkZWZhdWx0LCB1c2UgdGhlIGZvbGxvd2luZyBjb21waWxlLXRpbWUgZmxhZ3MuCiAKICAgVG8gZW5hYmxlIE5BUEksIGNvbXBpbGUgdGhlIGRyaXZlciBtb2R1bGUsIHBhc3NpbmcgaW4gYSBjb25maWd1cmF0aW9uIG9wdGlvbjoKQEAgLTQ1Nyw4OCArNTM1LDEwNSBAQAogS25vd24gSXNzdWVzCiA9PT09PT09PT09PT0KIAotICBKdW1ibyBGcmFtZXMgU3lzdGVtIFJlcXVpcmVtZW50Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Ryb3BwZWQgUmVjZWl2ZSBQYWNrZXRzIG9uIEhhbGYtZHVwbGV4IDEwLzEwMCBOZXR3b3JrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJZiB5b3UgaGF2ZSBhbiBJbnRlbCBQQ0kgRXhwcmVzcyBhZGFwdGVyIHJ1bm5pbmcgYXQgMTBtYnBzIG9yIDEwMG1icHMsIGhhbGYtCitkdXBsZXgsIHlvdSBtYXkgb2JzZXJ2ZSBvY2Nhc2lvbmFsIGRyb3BwZWQgcmVjZWl2ZSBwYWNrZXRzLiAgVGhlcmUgYXJlIG5vCit3b3JrYXJvdW5kcyBmb3IgdGhpcyBwcm9ibGVtIGluIHRoaXMgbmV0d29yayBjb25maWd1cmF0aW9uLiAgVGhlIG5ldHdvcmsgbXVzdAorYmUgdXBkYXRlZCB0byBvcGVyYXRlIGluIGZ1bGwtZHVwbGV4LCBhbmQvb3IgMTAwMG1icHMgb25seS4KIAotICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcyBoYXZlIGJlZW4gb2JzZXJ2ZWQgb24gTGludXggc3lzdGVtcyB3aXRoIDY0IE1CCi0gIG9mIFJBTSBvciBsZXNzIHRoYXQgYXJlIHJ1bm5pbmcgSnVtYm8gRnJhbWVzLiBJZiB5b3UgYXJlIHVzaW5nIEp1bWJvCi0gIEZyYW1lcywgeW91ciBzeXN0ZW0gbWF5IHJlcXVpcmUgbW9yZSB0aGFuIHRoZSBhZHZlcnRpc2VkIG1pbmltdW0KLSAgcmVxdWlyZW1lbnQgb2YgNjQgTUIgb2Ygc3lzdGVtIG1lbW9yeS4KK0p1bWJvIEZyYW1lcyBTeXN0ZW0gUmVxdWlyZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzIGhhdmUgYmVlbiBvYnNlcnZlZCBvbiBMaW51eCBzeXN0ZW1zIHdpdGggNjQgTUIKK29mIFJBTSBvciBsZXNzIHRoYXQgYXJlIHJ1bm5pbmcgSnVtYm8gRnJhbWVzLiAgSWYgeW91IGFyZSB1c2luZyBKdW1ibworRnJhbWVzLCB5b3VyIHN5c3RlbSBtYXkgcmVxdWlyZSBtb3JlIHRoYW4gdGhlIGFkdmVydGlzZWQgbWluaW11bQorcmVxdWlyZW1lbnQgb2YgNjQgTUIgb2Ygc3lzdGVtIG1lbW9yeS4KIAotICBQZXJmb3JtYW5jZSBEZWdyYWRhdGlvbiB3aXRoIEp1bWJvIEZyYW1lcwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUGVyZm9ybWFuY2UgRGVncmFkYXRpb24gd2l0aCBKdW1ibyBGcmFtZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEZWdyYWRhdGlvbiBpbiB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIG1heSBiZSBvYnNlcnZlZCBpbiBzb21lIEp1bWJvIGZyYW1lcworZW52aXJvbm1lbnRzLiAgSWYgdGhpcyBpcyBvYnNlcnZlZCwgaW5jcmVhc2luZyB0aGUgYXBwbGljYXRpb24ncyBzb2NrZXQKK2J1ZmZlciBzaXplIGFuZC9vciBpbmNyZWFzaW5nIHRoZSAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwXyptZW0gZW50cnkgdmFsdWVzCittYXkgaGVscC4gIFNlZSB0aGUgc3BlY2lmaWMgYXBwbGljYXRpb24gbWFudWFsIGFuZAorL3Vzci9zcmMvbGludXgqL0RvY3VtZW50YXRpb24vCituZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgZm9yIG1vcmUgZGV0YWlscy4KIAotICBEZWdyYWRhdGlvbiBpbiB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIG1heSBiZSBvYnNlcnZlZCBpbiBzb21lIEp1bWJvIGZyYW1lcwotICBlbnZpcm9ubWVudHMuIElmIHRoaXMgaXMgb2JzZXJ2ZWQsIGluY3JlYXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc29ja2V0Ci0gIGJ1ZmZlciBzaXplIGFuZC9vciBpbmNyZWFzaW5nIHRoZSAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwXyptZW0gZW50cnkgdmFsdWVzCi0gIG1heSBoZWxwLiBTZWUgdGhlIHNwZWNpZmljIGFwcGxpY2F0aW9uIG1hbnVhbCBhbmQKLSAgL3Vzci9zcmMvbGludXgqL0RvY3VtZW50YXRpb24vCi0gIG5ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorSnVtYm8gRnJhbWVzIG9uIEZvdW5kcnkgQmlnSXJvbiA4MDAwIHN3aXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlcmUgaXMgYSBrbm93biBpc3N1ZSB1c2luZyBKdW1ibyBmcmFtZXMgd2hlbiBjb25uZWN0ZWQgdG8gYSBGb3VuZHJ5CitCaWdJcm9uIDgwMDAgc3dpdGNoLiAgVGhpcyBpcyBhIDNyZCBwYXJ0eSBsaW1pdGF0aW9uLiAgSWYgeW91IGV4cGVyaWVuY2UKK2xvc3Mgb2YgcGFja2V0cywgbG93ZXIgdGhlIE1UVSBzaXplLgogCi0gIEp1bWJvIGZyYW1lcyBvbiBGb3VuZHJ5IEJpZ0lyb24gODAwMCBzd2l0Y2gKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBUaGVyZSBpcyBhIGtub3duIGlzc3VlIHVzaW5nIEp1bWJvIGZyYW1lcyB3aGVuIGNvbm5lY3RlZCB0byBhIEZvdW5kcnkKLSAgQmlnSXJvbiA4MDAwIHN3aXRjaC4gVGhpcyBpcyBhIDNyZCBwYXJ0eSBsaW1pdGF0aW9uLiBJZiB5b3UgZXhwZXJpZW5jZQotICBsb3NzIG9mIHBhY2tldHMsIGxvd2VyIHRoZSBNVFUgc2l6ZS4KK0FsbG9jYXRpbmcgUnggQnVmZmVycyB3aGVuIFVzaW5nIEp1bWJvIEZyYW1lcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWxsb2NhdGluZyBSeCBidWZmZXJzIHdoZW4gdXNpbmcgSnVtYm8gRnJhbWVzIG9uIDIuNi54IGtlcm5lbHMgbWF5IGZhaWwgaWYgCit0aGUgYXZhaWxhYmxlIG1lbW9yeSBpcyBoZWF2aWx5IGZyYWdtZW50ZWQuIFRoaXMgaXNzdWUgbWF5IGJlIHNlZW4gd2l0aCBQQ0ktWCAKK2FkYXB0ZXJzIG9yIHdpdGggcGFja2V0IHNwbGl0IGRpc2FibGVkLiBUaGlzIGNhbiBiZSByZWR1Y2VkIG9yIGVsaW1pbmF0ZWQgCitieSBjaGFuZ2luZyB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkgZm9yIHJlY2VpdmUgYnVmZmVyIGFsbG9jYXRpb24sIGJ5CitpbmNyZWFzaW5nIC9wcm9jL3N5cy92bS9taW5fZnJlZV9rYnl0ZXMuIAogCi0gIE11bHRpcGxlIEludGVyZmFjZXMgb24gU2FtZSBFdGhlcm5ldCBCcm9hZGNhc3QgTmV0d29yawotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK011bHRpcGxlIEludGVyZmFjZXMgb24gU2FtZSBFdGhlcm5ldCBCcm9hZGNhc3QgTmV0d29yaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEdWUgdG8gdGhlIGRlZmF1bHQgQVJQIGJlaGF2aW9yIG9uIExpbnV4LCBpdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZQorb25lIHN5c3RlbSBvbiB0d28gSVAgbmV0d29ya3MgaW4gdGhlIHNhbWUgRXRoZXJuZXQgYnJvYWRjYXN0IGRvbWFpbgorKG5vbi1wYXJ0aXRpb25lZCBzd2l0Y2gpIGJlaGF2ZSBhcyBleHBlY3RlZC4gIEFsbCBFdGhlcm5ldCBpbnRlcmZhY2VzCit3aWxsIHJlc3BvbmQgdG8gSVAgdHJhZmZpYyBmb3IgYW55IElQIGFkZHJlc3MgYXNzaWduZWQgdG8gdGhlIHN5c3RlbS4KK1RoaXMgcmVzdWx0cyBpbiB1bmJhbGFuY2VkIHJlY2VpdmUgdHJhZmZpYy4KIAotICBEdWUgdG8gdGhlIGRlZmF1bHQgQVJQIGJlaGF2aW9yIG9uIExpbnV4LCBpdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZQotICBvbmUgc3lzdGVtIG9uIHR3byBJUCBuZXR3b3JrcyBpbiB0aGUgc2FtZSBFdGhlcm5ldCBicm9hZGNhc3QgZG9tYWluCi0gIChub24tcGFydGl0aW9uZWQgc3dpdGNoKSBiZWhhdmUgYXMgZXhwZWN0ZWQuIEFsbCBFdGhlcm5ldCBpbnRlcmZhY2VzCi0gIHdpbGwgcmVzcG9uZCB0byBJUCB0cmFmZmljIGZvciBhbnkgSVAgYWRkcmVzcyBhc3NpZ25lZCB0byB0aGUgc3lzdGVtLgotICBUaGlzIHJlc3VsdHMgaW4gdW5iYWxhbmNlZCByZWNlaXZlIHRyYWZmaWMuCitJZiB5b3UgaGF2ZSBtdWx0aXBsZSBpbnRlcmZhY2VzIGluIGEgc2VydmVyLCBlaXRoZXIgdHVybiBvbiBBUlAKK2ZpbHRlcmluZyBieSBlbnRlcmluZzoKIAotICBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBpbnRlcmZhY2VzIGluIGEgc2VydmVyLCBlaXRoZXIgdHVybiBvbiBBUlAKLSAgZmlsdGVyaW5nIGJ5IGVudGVyaW5nOgorICAgIGVjaG8gMSA+IC9wcm9jL3N5cy9uZXQvaXB2NC9jb25mL2FsbC9hcnBfZmlsdGVyCisodGhpcyBvbmx5IHdvcmtzIGlmIHlvdXIga2VybmVsJ3MgdmVyc2lvbiBpcyBoaWdoZXIgdGhhbiAyLjQuNSksCiAKLSAgICAgIGVjaG8gMSA+IC9wcm9jL3N5cy9uZXQvaXB2NC9jb25mL2FsbC9hcnBfZmlsdGVyCi0gICh0aGlzIG9ubHkgd29ya3MgaWYgeW91ciBrZXJuZWwncyB2ZXJzaW9uIGlzIGhpZ2hlciB0aGFuIDIuNC41KSwKK05PVEU6IFRoaXMgc2V0dGluZyBpcyBub3Qgc2F2ZWQgYWNyb3NzIHJlYm9vdHMuICBUaGUgY29uZmlndXJhdGlvbgorY2hhbmdlIGNhbiBiZSBtYWRlIHBlcm1hbmVudCBieSBhZGRpbmcgdGhlIGxpbmU6CisgICAgbmV0LmlwdjQuY29uZi5hbGwuYXJwX2ZpbHRlciA9IDEKK3RvIHRoZSBmaWxlIC9ldGMvc3lzY3RsLmNvbmYKIAotICBOT1RFOiBUaGlzIHNldHRpbmcgaXMgbm90IHNhdmVkIGFjcm9zcyByZWJvb3RzLiBUaGUgY29uZmlndXJhdGlvbgotICBjaGFuZ2UgY2FuIGJlIG1hZGUgcGVybWFuZW50IGJ5IGFkZGluZyB0aGUgbGluZToKLSAgICAgIG5ldC5pcHY0LmNvbmYuYWxsLmFycF9maWx0ZXIgPSAxCi0gIHRvIHRoZSBmaWxlIC9ldGMvc3lzY3RsLmNvbmYKKyAgICAgIG9yLAogCi0gICAgICAgIG9yLAoraW5zdGFsbCB0aGUgaW50ZXJmYWNlcyBpbiBzZXBhcmF0ZSBicm9hZGNhc3QgZG9tYWlucyAoZWl0aGVyIGluCitkaWZmZXJlbnQgc3dpdGNoZXMgb3IgaW4gYSBzd2l0Y2ggcGFydGl0aW9uZWQgdG8gVkxBTnMpLgogCi0gIGluc3RhbGwgdGhlIGludGVyZmFjZXMgaW4gc2VwYXJhdGUgYnJvYWRjYXN0IGRvbWFpbnMgKGVpdGhlciBpbgotICBkaWZmZXJlbnQgc3dpdGNoZXMgb3IgaW4gYSBzd2l0Y2ggcGFydGl0aW9uZWQgdG8gVkxBTnMpLgorODI1NDEvODI1NDcgY2FuJ3QgbGluayBvciBhcmUgc2xvdyB0byBsaW5rIHdpdGggc29tZSBsaW5rIHBhcnRuZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlcmUgaXMgYSBrbm93biBjb21wYXRpYmlsaXR5IGlzc3VlIHdpdGggODI1NDEvODI1NDcgYW5kIHNvbWUKK2xvdy1lbmQgc3dpdGNoZXMgd2hlcmUgdGhlIGxpbmsgd2lsbCBub3QgYmUgZXN0YWJsaXNoZWQsIG9yIHdpbGwKK2JlIHNsb3cgdG8gZXN0YWJsaXNoLiAgSW4gcGFydGljdWxhciwgdGhlc2Ugc3dpdGNoZXMgYXJlIGtub3duIHRvCitiZSBpbmNvbXBhdGlibGUgd2l0aCA4MjU0MS84MjU0NzoKIAotICA4MjU0MS84MjU0NyBjYW4ndCBsaW5rIG9yIGFyZSBzbG93IHRvIGxpbmsgd2l0aCBzb21lIGxpbmsgcGFydG5lcnMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQbGFuZXggRlhHLTA4VEUKKyAgICBJLU8gRGF0YSBFVEctU0g4CiAKLSAgVGhlcmUgaXMgYSBrbm93biBjb21wYXRpYmlsaXR5IGlzc3VlIHdpdGggODI1NDEvODI1NDcgYW5kIHNvbWUKLSAgbG93LWVuZCBzd2l0Y2hlcyB3aGVyZSB0aGUgbGluayB3aWxsIG5vdCBiZSBlc3RhYmxpc2hlZCwgb3Igd2lsbAotICBiZSBzbG93IHRvIGVzdGFibGlzaC4gIEluIHBhcnRpY3VsYXIsIHRoZXNlIHN3aXRjaGVzIGFyZSBrbm93biB0bwotICBiZSBpbmNvbXBhdGlibGUgd2l0aCA4MjU0MS84MjU0NzoKK1RvIHdvcmthcm91bmQgdGhpcyBpc3N1ZSwgdGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQgd2l0aCBhbiBvdmVycmlkZQorb2YgdGhlIFBIWSdzIG1hc3Rlci9zbGF2ZSBzZXR0aW5nLiAgRm9yY2luZyBtYXN0ZXIgb3IgZm9yY2luZyBzbGF2ZQorbW9kZSB3aWxsIGltcHJvdmUgdGltZS10by1saW5rLgogCi0gICAgICBQbGFuZXggRlhHLTA4VEUKLSAgICAgIEktTyBEYXRhIEVURy1TSDgKKyAgICAjIG1ha2UgQ0ZMQUdTX0VYVFJBPS1ERTEwMDBfTUFTVEVSX1NMQVZFPTxuPgogCi0gIFRvIHdvcmthcm91bmQgdGhpcyBpc3N1ZSwgdGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQgd2l0aCBhbiBvdmVycmlkZQotICBvZiB0aGUgUEhZJ3MgbWFzdGVyL3NsYXZlIHNldHRpbmcuICBGb3JjaW5nIG1hc3RlciBvciBmb3JjaW5nIHNsYXZlCi0gIG1vZGUgd2lsbCBpbXByb3ZlIHRpbWUtdG8tbGluay4KK1doZXJlIDxuPiBpczoKIAotICAgICAgIyBtYWtlIEVYVFJBX0NGTEFHUz0tREUxMDAwX01BU1RFUl9TTEFWRT08bj4KKyAgICAwID0gSGFyZHdhcmUgZGVmYXVsdAorICAgIDEgPSBNYXN0ZXIgbW9kZQorICAgIDIgPSBTbGF2ZSBtb2RlCisgICAgMyA9IEF1dG8gbWFzdGVyL3NsYXZlCiAKLSAgV2hlcmUgPG4+IGlzOgorRGlzYWJsZSByeCBmbG93IGNvbnRyb2wgd2l0aCBldGh0b29sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luIG9yZGVyIHRvIGRpc2FibGUgcmVjZWl2ZSBmbG93IGNvbnRyb2wgdXNpbmcgZXRodG9vbCwgeW91IG11c3QgdHVybgorb2ZmIGF1dG8tbmVnb3RpYXRpb24gb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lLgogCi0gICAgICAwID0gSGFyZHdhcmUgZGVmYXVsdAotICAgICAgMSA9IE1hc3RlciBtb2RlCi0gICAgICAyID0gU2xhdmUgbW9kZQotICAgICAgMyA9IEF1dG8gbWFzdGVyL3NsYXZlCitGb3IgZXhhbXBsZToKIAotICBEaXNhYmxlIHJ4IGZsb3cgY29udHJvbCB3aXRoIGV0aHRvb2wKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBldGh0b29sIC1BIGV0aD8gYXV0b25lZyBvZmYgcnggb2ZmCiAKLSAgSW4gb3JkZXIgdG8gZGlzYWJsZSByZWNlaXZlIGZsb3cgY29udHJvbCB1c2luZyBldGh0b29sLCB5b3UgbXVzdCB0dXJuCi0gIG9mZiBhdXRvLW5lZ290aWF0aW9uIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZS4KLQotICBGb3IgZXhhbXBsZToKLQotICAgICBldGh0b29sIC1BIGV0aD8gYXV0b25lZyBvZmYgcnggb2ZmCitVbnBsdWdnaW5nIG5ldHdvcmsgY2FibGUgd2hpbGUgZXRodG9vbCAtcCBpcyBydW5uaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbiBrZXJuZWwgdmVyc2lvbnMgMi41LjUwIGFuZCBsYXRlciAoaW5jbHVkaW5nIDIuNiBrZXJuZWwpLCB1bnBsdWdnaW5nCit0aGUgbmV0d29yayBjYWJsZSB3aGlsZSBldGh0b29sIC1wIGlzIHJ1bm5pbmcgd2lsbCBjYXVzZSB0aGUgc3lzdGVtIHRvCitiZWNvbWUgdW5yZXNwb25zaXZlIHRvIGtleWJvYXJkIGNvbW1hbmRzLCBleGNlcHQgZm9yIGNvbnRyb2wtYWx0LWRlbGV0ZS4KK1Jlc3RhcnRpbmcgdGhlIHN5c3RlbSBhcHBlYXJzIHRvIGJlIHRoZSBvbmx5IHJlbWVkeS4KIAogCiBTdXBwb3J0CkBAIC01NDgsMjQgKzY0MywxMCBAQAogCiAgICAgaHR0cDovL3N1cHBvcnQuaW50ZWwuY29tCiAKLSAgICBvciB0aGUgSW50ZWwgV2lyZWQgTmV0d29ya2luZyBwcm9qZWN0IGhvc3RlZCBieSBTb3VyY2Vmb3JnZSBhdDoKK29yIHRoZSBJbnRlbCBXaXJlZCBOZXR3b3JraW5nIHByb2plY3QgaG9zdGVkIGJ5IFNvdXJjZWZvcmdlIGF0OgogCiAgICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lMTAwMAogCiBJZiBhbiBpc3N1ZSBpcyBpZGVudGlmaWVkIHdpdGggdGhlIHJlbGVhc2VkIHNvdXJjZSBjb2RlIG9uIHRoZSBzdXBwb3J0ZWQKIGtlcm5lbCB3aXRoIGEgc3VwcG9ydGVkIGFkYXB0ZXIsIGVtYWlsIHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiByZWxhdGVkCi10byB0aGUgaXNzdWUgdG8gZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci0KLQotTGljZW5zZQotPT09PT09PQotCi1UaGlzIHNvZnR3YXJlIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBhZ3JlZW1lbnQKLWJldHdlZW4geW91ICgnTGljZW5zZWUnKSBhbmQgSW50ZWwuIERvIG5vdCB1c2Ugb3IgbG9hZCB0aGlzIHNvZnR3YXJlIG9yIGFueQotYXNzb2NpYXRlZCBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSwgdGhlICdTb2Z0d2FyZScpIHVudGlsIHlvdSBoYXZlIGNhcmVmdWxseQotcmVhZCB0aGUgZnVsbCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZmlsZSBDT1BZSU5HIGxvY2F0ZWQgaW4gdGhpcyBzb2Z0d2FyZQotcGFja2FnZS4gQnkgbG9hZGluZyBvciB1c2luZyB0aGUgU29mdHdhcmUsIHlvdSBhZ3JlZSB0byB0aGUgdGVybXMgb2YgdGhpcwotQWdyZWVtZW50LiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBkbyBub3QKLWluc3RhbGwgb3IgdXNlIHRoZSBTb2Z0d2FyZS4KLQotKiBPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCit0byB0aGUgaXNzdWUgdG8gZTEwMDAtZGV2ZWxAbGlzdHMuc2YubmV0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IGZkM2MwYzAuLmEwZjY4NDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CkBAIC0xMDEsNiArMTAxLDExIEBACiAKIFRDUCB2YXJpYWJsZXM6IAogCitzb21heGNvbm4gLSBJTlRFR0VSCisJTGltaXQgb2Ygc29ja2V0IGxpc3RlbigpIGJhY2tsb2csIGtub3duIGluIHVzZXJzcGFjZSBhcyBTT01BWENPTk4uCisJRGVmYXVsdHMgdG8gMTI4LiAgU2VlIGFsc28gdGNwX21heF9zeW5fYmFja2xvZyBmb3IgYWRkaXRpb25hbCB0dW5pbmcKKwlmb3IgVENQIHNvY2tldHMuCisKIHRjcF9hYmMgLSBJTlRFR0VSCiAJQ29udHJvbHMgQXBwcm9wcmlhdGUgQnl0ZSBDb3VudCAoQUJDKSBkZWZpbmVkIGluIFJGQzM0NjUuCiAJQUJDIGlzIGEgd2F5IG9mIGluY3JlYXNpbmcgY29uZ2VzdGlvbiB3aW5kb3cgKGN3bmQpIG1vcmUgc2xvd2x5CkBAIC0xMTIsMTUgKzExNyw2OCBAQAogCQkgIG9mIHR3byBzZWdtZW50cyB0byBjb21wZW5zYXRlIGZvciBkZWxheWVkIGFja25vd2xlZGdtZW50cy4KIAlEZWZhdWx0OiAwIChvZmYpCiAKLXRjcF9zeW5fcmV0cmllcyAtIElOVEVHRVIKLQlOdW1iZXIgb2YgdGltZXMgaW5pdGlhbCBTWU5zIGZvciBhbiBhY3RpdmUgVENQIGNvbm5lY3Rpb24gYXR0ZW1wdAotCXdpbGwgYmUgcmV0cmFuc21pdHRlZC4gU2hvdWxkIG5vdCBiZSBoaWdoZXIgdGhhbiAyNTUuIERlZmF1bHQgdmFsdWUKLQlpcyA1LCB3aGljaCBjb3JyZXNwb25kcyB0byB+MTgwc2Vjb25kcy4KK3RjcF9hYm9ydF9vbl9vdmVyZmxvdyAtIEJPT0xFQU4KKwlJZiBsaXN0ZW5pbmcgc2VydmljZSBpcyB0b28gc2xvdyB0byBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zLAorCXJlc2V0IHRoZW0uIERlZmF1bHQgc3RhdGUgaXMgRkFMU0UuIEl0IG1lYW5zIHRoYXQgaWYgb3ZlcmZsb3cKKwlvY2N1cnJlZCBkdWUgdG8gYSBidXJzdCwgY29ubmVjdGlvbiB3aWxsIHJlY292ZXIuIEVuYWJsZSB0aGlzCisJb3B0aW9uIF9vbmx5XyBpZiB5b3UgYXJlIHJlYWxseSBzdXJlIHRoYXQgbGlzdGVuaW5nIGRhZW1vbgorCWNhbm5vdCBiZSB0dW5lZCB0byBhY2NlcHQgY29ubmVjdGlvbnMgZmFzdGVyLiBFbmFibGluZyB0aGlzCisJb3B0aW9uIGNhbiBoYXJtIGNsaWVudHMgb2YgeW91ciBzZXJ2ZXIuCiAKLXRjcF9zeW5hY2tfcmV0cmllcyAtIElOVEVHRVIKLQlOdW1iZXIgb2YgdGltZXMgU1lOQUNLcyBmb3IgYSBwYXNzaXZlIFRDUCBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbAotCWJlIHJldHJhbnNtaXR0ZWQuIFNob3VsZCBub3QgYmUgaGlnaGVyIHRoYW4gMjU1LiBEZWZhdWx0IHZhbHVlCi0JaXMgNSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gfjE4MHNlY29uZHMuCit0Y3BfYWR2X3dpbl9zY2FsZSAtIElOVEVHRVIKKwlDb3VudCBidWZmZXJpbmcgb3ZlcmhlYWQgYXMgYnl0ZXMvMl50Y3BfYWR2X3dpbl9zY2FsZQorCShpZiB0Y3BfYWR2X3dpbl9zY2FsZSA+IDApIG9yIGJ5dGVzLWJ5dGVzLzJeKC10Y3BfYWR2X3dpbl9zY2FsZSksCisJaWYgaXQgaXMgPD0gMC4KKwlEZWZhdWx0OiAyCisKK3RjcF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCAtIFNUUklORworCVNob3cvc2V0IHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgY2hvaWNlcyBhdmFpbGFibGUgdG8gbm9uLXByaXZpbGVnZWQKKwlwcm9jZXNzZXMuIFRoZSBsaXN0IGlzIGEgc3Vic2V0IG9mIHRob3NlIGxpc3RlZCBpbgorCXRjcF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sLgorCURlZmF1bHQgaXMgInJlbm8iIGFuZCB0aGUgZGVmYXVsdCBzZXR0aW5nICh0Y3BfY29uZ2VzdGlvbl9jb250cm9sKS4KKwordGNwX2FwcF93aW4gLSBJTlRFR0VSCisJUmVzZXJ2ZSBtYXgod2luZG93LzJedGNwX2FwcF93aW4sIG1zcykgb2Ygd2luZG93IGZvciBhcHBsaWNhdGlvbgorCWJ1ZmZlci4gVmFsdWUgMCBpcyBzcGVjaWFsLCBpdCBtZWFucyB0aGF0IG5vdGhpbmcgaXMgcmVzZXJ2ZWQuCisJRGVmYXVsdDogMzEKKwordGNwX2F2YWlsYWJsZV9jb25nZXN0aW9uX2NvbnRyb2wgLSBTVFJJTkcKKwlTaG93cyB0aGUgYXZhaWxhYmxlIGNvbmdlc3Rpb24gY29udHJvbCBjaG9pY2VzIHRoYXQgYXJlIHJlZ2lzdGVyZWQuCisJTW9yZSBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyBtYXkgYmUgYXZhaWxhYmxlIGFzIG1vZHVsZXMsCisJYnV0IG5vdCBsb2FkZWQuCisKK3RjcF9jb25nZXN0aW9uX2NvbnRyb2wgLSBTVFJJTkcKKwlTZXQgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gdG8gYmUgdXNlZCBmb3IgbmV3CisJY29ubmVjdGlvbnMuIFRoZSBhbGdvcml0aG0gInJlbm8iIGlzIGFsd2F5cyBhdmFpbGFibGUsIGJ1dAorCWFkZGl0aW9uYWwgY2hvaWNlcyBtYXkgYmUgYXZhaWxhYmxlIGJhc2VkIG9uIGtlcm5lbCBjb25maWd1cmF0aW9uLgorCURlZmF1bHQgaXMgc2V0IGFzIHBhcnQgb2Yga2VybmVsIGNvbmZpZ3VyYXRpb24uCisKK3RjcF9kc2FjayAtIEJPT0xFQU4KKwlBbGxvd3MgVENQIHRvIHNlbmQgImR1cGxpY2F0ZSIgU0FDS3MuCisKK3RjcF9lY24gLSBCT09MRUFOCisJRW5hYmxlIEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uIGluIFRDUC4KKwordGNwX2ZhY2sgLSBCT09MRUFOCisJRW5hYmxlIEZBQ0sgY29uZ2VzdGlvbiBhdm9pZGFuY2UgYW5kIGZhc3QgcmV0cmFuc21pc3Npb24uCisJVGhlIHZhbHVlIGlzIG5vdCB1c2VkLCBpZiB0Y3Bfc2FjayBpcyBub3QgZW5hYmxlZC4KKwordGNwX2Zpbl90aW1lb3V0IC0gSU5URUdFUgorCVRpbWUgdG8gaG9sZCBzb2NrZXQgaW4gc3RhdGUgRklOLVdBSVQtMiwgaWYgaXQgd2FzIGNsb3NlZAorCWJ5IG91ciBzaWRlLiBQZWVyIGNhbiBiZSBicm9rZW4gYW5kIG5ldmVyIGNsb3NlIGl0cyBzaWRlLAorCW9yIGV2ZW4gZGllZCB1bmV4cGVjdGVkbHkuIERlZmF1bHQgdmFsdWUgaXMgNjBzZWMuCisJVXN1YWwgdmFsdWUgdXNlZCBpbiAyLjIgd2FzIDE4MCBzZWNvbmRzLCB5b3UgbWF5IHJlc3RvcmUKKwlpdCwgYnV0IHJlbWVtYmVyIHRoYXQgaWYgeW91ciBtYWNoaW5lIGlzIGV2ZW4gdW5kZXJsb2FkZWQgV0VCIHNlcnZlciwKKwl5b3UgcmlzayB0byBvdmVyZmxvdyBtZW1vcnkgd2l0aCBraWxvdG9ucyBvZiBkZWFkIHNvY2tldHMsCisJRklOLVdBSVQtMiBzb2NrZXRzIGFyZSBsZXNzIGRhbmdlcm91cyB0aGFuIEZJTi1XQUlULTEsCisJYmVjYXVzZSB0aGV5IGVhdCBtYXhpbXVtIDEuNUsgb2YgbWVtb3J5LCBidXQgdGhleSB0ZW5kCisJdG8gbGl2ZSBsb25nZXIuCUNmLiB0Y3BfbWF4X29ycGhhbnMuCisKK3RjcF9mcnRvIC0gQk9PTEVBTgorCUVuYWJsZXMgRi1SVE8sIGFuIGVuaGFuY2VkIHJlY292ZXJ5IGFsZ29yaXRobSBmb3IgVENQIHJldHJhbnNtaXNzaW9uCisJdGltZW91dHMuICBJdCBpcyBwYXJ0aWN1bGFybHkgYmVuZWZpY2lhbCBpbiB3aXJlbGVzcyBlbnZpcm9ubWVudHMKKwl3aGVyZSBwYWNrZXQgbG9zcyBpcyB0eXBpY2FsbHkgZHVlIHRvIHJhbmRvbSByYWRpbyBpbnRlcmZlcmVuY2UKKwlyYXRoZXIgdGhhbiBpbnRlcm1lZGlhdGUgcm91dGVyIGNvbmdlc3Rpb24uCiAKIHRjcF9rZWVwYWxpdmVfdGltZSAtIElOVEVHRVIKIAlIb3cgb2Z0ZW4gVENQIHNlbmRzIG91dCBrZWVwYWxpdmUgbWVzc2FnZXMgd2hlbiBrZWVwYWxpdmUgaXMgZW5hYmxlZC4KQEAgLTEzNiw1NCArMTk0LDEzIEBACiAJYWZ0ZXIgcHJvYmVzIHN0YXJ0ZWQuIERlZmF1bHQgdmFsdWU6IDc1c2VjIGkuZS4gY29ubmVjdGlvbgogCXdpbGwgYmUgYWJvcnRlZCBhZnRlciB+MTEgbWludXRlcyBvZiByZXRyaWVzLgogCi10Y3BfcmV0cmllczEgLSBJTlRFR0VSCi0JSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgYmVmb3JlIGRlY2lkaW5nIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nCi0JYW5kIGl0IGlzIG5lY2Vzc2FyeSB0byByZXBvcnQgdGhpcyBzdXNwaWNpb24gdG8gbmV0d29yayBsYXllci4KLQlNaW5pbWFsIFJGQyB2YWx1ZSBpcyAzLCBpdCBpcyBkZWZhdWx0LCB3aGljaCBjb3JyZXNwb25kcwotCXRvIH4zc2VjLThtaW4gZGVwZW5kaW5nIG9uIFJUTy4KLQotdGNwX3JldHJpZXMyIC0gSU5URUdFUgotCUhvdyBtYXkgdGltZXMgdG8gcmV0cnkgYmVmb3JlIGtpbGxpbmcgYWxpdmUgVENQIGNvbm5lY3Rpb24uCi0JUkZDMTEyMiBzYXlzIHRoYXQgdGhlIGxpbWl0IHNob3VsZCBiZSBsb25nZXIgdGhhbiAxMDAgc2VjLgotCUl0IGlzIHRvbyBzbWFsbCBudW1iZXIuCURlZmF1bHQgdmFsdWUgMTUgY29ycmVzcG9uZHMgdG8gfjEzLTMwbWluCi0JZGVwZW5kaW5nIG9uIFJUTy4KLQotdGNwX29ycGhhbl9yZXRyaWVzIC0gSU5URUdFUgotCUhvdyBtYXkgdGltZXMgdG8gcmV0cnkgYmVmb3JlIGtpbGxpbmcgVENQIGNvbm5lY3Rpb24sIGNsb3NlZAotCWJ5IG91ciBzaWRlLiBEZWZhdWx0IHZhbHVlIDcgY29ycmVzcG9uZHMgdG8gfjUwc2VjLTE2bWluCi0JZGVwZW5kaW5nIG9uIFJUTy4gSWYgeW91IG1hY2hpbmUgaXMgbG9hZGVkIFdFQiBzZXJ2ZXIsCi0JeW91IHNob3VsZCB0aGluayBhYm91dCBsb3dlcmluZyB0aGlzIHZhbHVlLCBzdWNoIHNvY2tldHMKLQltYXkgY29uc3VtZSBzaWduaWZpY2FudCByZXNvdXJjZXMuIENmLiB0Y3BfbWF4X29ycGhhbnMuCi0KLXRjcF9maW5fdGltZW91dCAtIElOVEVHRVIKLQlUaW1lIHRvIGhvbGQgc29ja2V0IGluIHN0YXRlIEZJTi1XQUlULTIsIGlmIGl0IHdhcyBjbG9zZWQKLQlieSBvdXIgc2lkZS4gUGVlciBjYW4gYmUgYnJva2VuIGFuZCBuZXZlciBjbG9zZSBpdHMgc2lkZSwKLQlvciBldmVuIGRpZWQgdW5leHBlY3RlZGx5LiBEZWZhdWx0IHZhbHVlIGlzIDYwc2VjLgotCVVzdWFsIHZhbHVlIHVzZWQgaW4gMi4yIHdhcyAxODAgc2Vjb25kcywgeW91IG1heSByZXN0b3JlCi0JaXQsIGJ1dCByZW1lbWJlciB0aGF0IGlmIHlvdXIgbWFjaGluZSBpcyBldmVuIHVuZGVybG9hZGVkIFdFQiBzZXJ2ZXIsCi0JeW91IHJpc2sgdG8gb3ZlcmZsb3cgbWVtb3J5IHdpdGgga2lsb3RvbnMgb2YgZGVhZCBzb2NrZXRzLAotCUZJTi1XQUlULTIgc29ja2V0cyBhcmUgbGVzcyBkYW5nZXJvdXMgdGhhbiBGSU4tV0FJVC0xLAotCWJlY2F1c2UgdGhleSBlYXQgbWF4aW11bSAxLjVLIG9mIG1lbW9yeSwgYnV0IHRoZXkgdGVuZAotCXRvIGxpdmUgbG9uZ2VyLglDZi4gdGNwX21heF9vcnBoYW5zLgotCi10Y3BfbWF4X3R3X2J1Y2tldHMgLSBJTlRFR0VSCi0JTWF4aW1hbCBudW1iZXIgb2YgdGltZXdhaXQgc29ja2V0cyBoZWxkIGJ5IHN5c3RlbSBzaW11bHRhbmVvdXNseS4KLQlJZiB0aGlzIG51bWJlciBpcyBleGNlZWRlZCB0aW1lLXdhaXQgc29ja2V0IGlzIGltbWVkaWF0ZWx5IGRlc3Ryb3llZAotCWFuZCB3YXJuaW5nIGlzIHByaW50ZWQuIFRoaXMgbGltaXQgZXhpc3RzIG9ubHkgdG8gcHJldmVudAotCXNpbXBsZSBEb1MgYXR0YWNrcywgeW91IF9tdXN0XyBub3QgbG93ZXIgdGhlIGxpbWl0IGFydGlmaWNpYWxseSwKLQlidXQgcmF0aGVyIGluY3JlYXNlIGl0IChwcm9iYWJseSwgYWZ0ZXIgaW5jcmVhc2luZyBpbnN0YWxsZWQgbWVtb3J5KSwKLQlpZiBuZXR3b3JrIGNvbmRpdGlvbnMgcmVxdWlyZSBtb3JlIHRoYW4gZGVmYXVsdCB2YWx1ZS4KLQotdGNwX3R3X3JlY3ljbGUgLSBCT09MRUFOCi0JRW5hYmxlIGZhc3QgcmVjeWNsaW5nIFRJTUUtV0FJVCBzb2NrZXRzLiBEZWZhdWx0IHZhbHVlIGlzIDAuCi0JSXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYWR2aWNlL3JlcXVlc3Qgb2YgdGVjaG5pY2FsCi0JZXhwZXJ0cy4KLQotdGNwX3R3X3JldXNlIC0gQk9PTEVBTgotCUFsbG93IHRvIHJldXNlIFRJTUUtV0FJVCBzb2NrZXRzIGZvciBuZXcgY29ubmVjdGlvbnMgd2hlbiBpdCBpcwotCXNhZmUgZnJvbSBwcm90b2NvbCB2aWV3cG9pbnQuIERlZmF1bHQgdmFsdWUgaXMgMC4KLQlJdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2l0aG91dCBhZHZpY2UvcmVxdWVzdCBvZiB0ZWNobmljYWwKLQlleHBlcnRzLgordGNwX2xvd19sYXRlbmN5IC0gQk9PTEVBTgorCUlmIHNldCwgdGhlIFRDUCBzdGFjayBtYWtlcyBkZWNpc2lvbnMgdGhhdCBwcmVmZXIgbG93ZXIKKwlsYXRlbmN5IGFzIG9wcG9zZWQgdG8gaGlnaGVyIHRocm91Z2hwdXQuICBCeSBkZWZhdWx0LCB0aGlzCisJb3B0aW9uIGlzIG5vdCBzZXQgbWVhbmluZyB0aGF0IGhpZ2hlciB0aHJvdWdocHV0IGlzIHByZWZlcnJlZC4KKwlBbiBleGFtcGxlIG9mIGFuIGFwcGxpY2F0aW9uIHdoZXJlIHRoaXMgZGVmYXVsdCBzaG91bGQgYmUKKwljaGFuZ2VkIHdvdWxkIGJlIGEgQmVvd3VsZiBjb21wdXRlIGNsdXN0ZXIuCisJRGVmYXVsdDogMAogCiB0Y3BfbWF4X29ycGhhbnMgLSBJTlRFR0VSCiAJTWF4aW1hbCBudW1iZXIgb2YgVENQIHNvY2tldHMgbm90IGF0dGFjaGVkIHRvIGFueSB1c2VyIGZpbGUgaGFuZGxlLApAQCAtMTk3LDQxICsyMTQsNiBAQAogCW1vcmUgYWdncmVzc2l2ZWx5LiBMZXQgbWUgdG8gcmVtaW5kIGFnYWluOiBlYWNoIG9ycGhhbiBlYXRzCiAJdXAgdG8gfjY0SyBvZiB1bnN3YXBwYWJsZSBtZW1vcnkuCiAKLXRjcF9hYm9ydF9vbl9vdmVyZmxvdyAtIEJPT0xFQU4KLQlJZiBsaXN0ZW5pbmcgc2VydmljZSBpcyB0b28gc2xvdyB0byBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zLAotCXJlc2V0IHRoZW0uIERlZmF1bHQgc3RhdGUgaXMgRkFMU0UuIEl0IG1lYW5zIHRoYXQgaWYgb3ZlcmZsb3cKLQlvY2N1cnJlZCBkdWUgdG8gYSBidXJzdCwgY29ubmVjdGlvbiB3aWxsIHJlY292ZXIuIEVuYWJsZSB0aGlzCi0Jb3B0aW9uIF9vbmx5XyBpZiB5b3UgYXJlIHJlYWxseSBzdXJlIHRoYXQgbGlzdGVuaW5nIGRhZW1vbgotCWNhbm5vdCBiZSB0dW5lZCB0byBhY2NlcHQgY29ubmVjdGlvbnMgZmFzdGVyLiBFbmFibGluZyB0aGlzCi0Jb3B0aW9uIGNhbiBoYXJtIGNsaWVudHMgb2YgeW91ciBzZXJ2ZXIuCi0KLXRjcF9zeW5jb29raWVzIC0gQk9PTEVBTgotCU9ubHkgdmFsaWQgd2hlbiB0aGUga2VybmVsIHdhcyBjb21waWxlZCB3aXRoIENPTkZJR19TWU5DT09LSUVTCi0JU2VuZCBvdXQgc3luY29va2llcyB3aGVuIHRoZSBzeW4gYmFja2xvZyBxdWV1ZSBvZiBhIHNvY2tldCAKLQlvdmVyZmxvd3MuIFRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IHRoZSBjb21tb24gJ3N5biBmbG9vZCBhdHRhY2snCi0JRGVmYXVsdDogRkFMU0UKLQotCU5vdGUsIHRoYXQgc3luY29va2llcyBpcyBmYWxsYmFjayBmYWNpbGl0eS4KLQlJdCBNVVNUIE5PVCBiZSB1c2VkIHRvIGhlbHAgaGlnaGx5IGxvYWRlZCBzZXJ2ZXJzIHRvIHN0YW5kCi0JYWdhaW5zdCBsZWdhbCBjb25uZWN0aW9uIHJhdGUuIElmIHlvdSBzZWUgc3luZmxvb2Qgd2FybmluZ3MKLQlpbiB5b3VyIGxvZ3MsIGJ1dCBpbnZlc3RpZ2F0aW9uCXNob3dzIHRoYXQgdGhleSBvY2N1cgotCWJlY2F1c2Ugb2Ygb3ZlcmxvYWQgd2l0aCBsZWdhbCBjb25uZWN0aW9ucywgeW91IHNob3VsZCB0dW5lCi0JYW5vdGhlciBwYXJhbWV0ZXJzIHVudGlsIHRoaXMgd2FybmluZyBkaXNhcHBlYXIuCi0JU2VlOiB0Y3BfbWF4X3N5bl9iYWNrbG9nLCB0Y3Bfc3luYWNrX3JldHJpZXMsIHRjcF9hYm9ydF9vbl9vdmVyZmxvdy4KLQotCXN5bmNvb2tpZXMgc2VyaW91c2x5IHZpb2xhdGUgVENQIHByb3RvY29sLCBkbyBub3QgYWxsb3cKLQl0byB1c2UgVENQIGV4dGVuc2lvbnMsIGNhbiByZXN1bHQgaW4gc2VyaW91cyBkZWdyYWRhdGlvbgotCW9mIHNvbWUgc2VydmljZXMgKGYuZS4gU01UUCByZWxheWluZyksIHZpc2libGUgbm90IGJ5IHlvdSwKLQlidXQgeW91ciBjbGllbnRzIGFuZCByZWxheXMsIGNvbnRhY3RpbmcgeW91LiBXaGlsZSB5b3Ugc2VlCi0Jc3luZmxvb2Qgd2FybmluZ3MgaW4gbG9ncyBub3QgYmVpbmcgcmVhbGx5IGZsb29kZWQsIHlvdXIgc2VydmVyCi0JaXMgc2VyaW91c2x5IG1pc2NvbmZpZ3VyZWQuCi0KLXRjcF9zdGR1cmcgLSBCT09MRUFOCi0JVXNlIHRoZSBIb3N0IHJlcXVpcmVtZW50cyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVENQIHVyZyBwb2ludGVyIGZpZWxkLgotCU1vc3QgaG9zdHMgdXNlIHRoZSBvbGRlciBCU0QgaW50ZXJwcmV0YXRpb24sIHNvIGlmIHlvdSB0dXJuIHRoaXMgb24KLQlMaW51eCBtaWdodCBub3QgY29tbXVuaWNhdGUgY29ycmVjdGx5IHdpdGggdGhlbS4JCi0JRGVmYXVsdDogRkFMU0UgCi0JCiB0Y3BfbWF4X3N5bl9iYWNrbG9nIC0gSU5URUdFUgogCU1heGltYWwgbnVtYmVyIG9mIHJlbWVtYmVyZWQgY29ubmVjdGlvbiByZXF1ZXN0cywgd2hpY2ggYXJlCiAJc3RpbGwgZGlkIG5vdCByZWNlaXZlIGFuIGFja25vd2xlZGdtZW50IGZyb20gY29ubmVjdGluZyBjbGllbnQuCkBAIC0yMzksMjQgKzIyMSwzNCBAQAogCWFuZCAxMjggZm9yIGxvdyBtZW1vcnkgbWFjaGluZXMuIElmIHNlcnZlciBzdWZmZXJzIG9mIG92ZXJsb2FkLAogCXRyeSB0byBpbmNyZWFzZSB0aGlzIG51bWJlci4KIAotdGNwX3dpbmRvd19zY2FsaW5nIC0gQk9PTEVBTgotCUVuYWJsZSB3aW5kb3cgc2NhbGluZyBhcyBkZWZpbmVkIGluIFJGQzEzMjMuCit0Y3BfbWF4X3R3X2J1Y2tldHMgLSBJTlRFR0VSCisJTWF4aW1hbCBudW1iZXIgb2YgdGltZXdhaXQgc29ja2V0cyBoZWxkIGJ5IHN5c3RlbSBzaW11bHRhbmVvdXNseS4KKwlJZiB0aGlzIG51bWJlciBpcyBleGNlZWRlZCB0aW1lLXdhaXQgc29ja2V0IGlzIGltbWVkaWF0ZWx5IGRlc3Ryb3llZAorCWFuZCB3YXJuaW5nIGlzIHByaW50ZWQuIFRoaXMgbGltaXQgZXhpc3RzIG9ubHkgdG8gcHJldmVudAorCXNpbXBsZSBEb1MgYXR0YWNrcywgeW91IF9tdXN0XyBub3QgbG93ZXIgdGhlIGxpbWl0IGFydGlmaWNpYWxseSwKKwlidXQgcmF0aGVyIGluY3JlYXNlIGl0IChwcm9iYWJseSwgYWZ0ZXIgaW5jcmVhc2luZyBpbnN0YWxsZWQgbWVtb3J5KSwKKwlpZiBuZXR3b3JrIGNvbmRpdGlvbnMgcmVxdWlyZSBtb3JlIHRoYW4gZGVmYXVsdCB2YWx1ZS4KIAotdGNwX3RpbWVzdGFtcHMgLSBCT09MRUFOCi0JRW5hYmxlIHRpbWVzdGFtcHMgYXMgZGVmaW5lZCBpbiBSRkMxMzIzLgordGNwX21lbSAtIHZlY3RvciBvZiAzIElOVEVHRVJzOiBtaW4sIHByZXNzdXJlLCBtYXgKKwltaW46IGJlbG93IHRoaXMgbnVtYmVyIG9mIHBhZ2VzIFRDUCBpcyBub3QgYm90aGVyZWQgYWJvdXQgaXRzCisJbWVtb3J5IGFwcGV0aXRlLgogCi10Y3Bfc2FjayAtIEJPT0xFQU4KLQlFbmFibGUgc2VsZWN0IGFja25vd2xlZGdtZW50cyAoU0FDS1MpLgorCXByZXNzdXJlOiB3aGVuIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5IFRDUCBleGNlZWRzIHRoaXMgbnVtYmVyCisJb2YgcGFnZXMsIFRDUCBtb2RlcmF0ZXMgaXRzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgZW50ZXJzIG1lbW9yeQorCXByZXNzdXJlIG1vZGUsIHdoaWNoIGlzIGV4aXRlZCB3aGVuIG1lbW9yeSBjb25zdW1wdGlvbiBmYWxscworCXVuZGVyICJtaW4iLgogCi10Y3BfZmFjayAtIEJPT0xFQU4KLQlFbmFibGUgRkFDSyBjb25nZXN0aW9uIGF2b2lkYW5jZSBhbmQgZmFzdCByZXRyYW5zbWlzc2lvbi4KLQlUaGUgdmFsdWUgaXMgbm90IHVzZWQsIGlmIHRjcF9zYWNrIGlzIG5vdCBlbmFibGVkLgorCW1heDogbnVtYmVyIG9mIHBhZ2VzIGFsbG93ZWQgZm9yIHF1ZXVlaW5nIGJ5IGFsbCBUQ1Agc29ja2V0cy4KIAotdGNwX2RzYWNrIC0gQk9PTEVBTgotCUFsbG93cyBUQ1AgdG8gc2VuZCAiZHVwbGljYXRlIiBTQUNLcy4KKwlEZWZhdWx0cyBhcmUgY2FsY3VsYXRlZCBhdCBib290IHRpbWUgZnJvbSBhbW91bnQgb2YgYXZhaWxhYmxlCisJbWVtb3J5LgogCi10Y3BfZWNuIC0gQk9PTEVBTgotCUVuYWJsZSBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiBpbiBUQ1AuCit0Y3Bfb3JwaGFuX3JldHJpZXMgLSBJTlRFR0VSCisJSG93IG1heSB0aW1lcyB0byByZXRyeSBiZWZvcmUga2lsbGluZyBUQ1AgY29ubmVjdGlvbiwgY2xvc2VkCisJYnkgb3VyIHNpZGUuIERlZmF1bHQgdmFsdWUgNyBjb3JyZXNwb25kcyB0byB+NTBzZWMtMTZtaW4KKwlkZXBlbmRpbmcgb24gUlRPLiBJZiB5b3UgbWFjaGluZSBpcyBsb2FkZWQgV0VCIHNlcnZlciwKKwl5b3Ugc2hvdWxkIHRoaW5rIGFib3V0IGxvd2VyaW5nIHRoaXMgdmFsdWUsIHN1Y2ggc29ja2V0cworCW1heSBjb25zdW1lIHNpZ25pZmljYW50IHJlc291cmNlcy4gQ2YuIHRjcF9tYXhfb3JwaGFucy4KIAogdGNwX3Jlb3JkZXJpbmcgLSBJTlRFR0VSCiAJTWF4aW1hbCByZW9yZGVyaW5nIG9mIHBhY2tldHMgaW4gYSBUQ1Agc3RyZWFtLgpAQCAtMjY3LDIwICsyNTksMjMgQEAKIAlPbiByZXRyYW5zbWl0IHRyeSB0byBzZW5kIGJpZ2dlciBwYWNrZXRzIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4KIAljZXJ0YWluIFRDUCBzdGFja3MuCiAKLXRjcF93bWVtIC0gdmVjdG9yIG9mIDMgSU5URUdFUnM6IG1pbiwgZGVmYXVsdCwgbWF4Ci0JbWluOiBBbW91bnQgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBzZW5kIGJ1ZmZlcnMgZm9yIFRDUCBzb2NrZXQuCi0JRWFjaCBUQ1Agc29ja2V0IGhhcyByaWdodHMgdG8gdXNlIGl0IGR1ZSB0byBmYWN0IG9mIGl0cyBiaXJ0aC4KLQlEZWZhdWx0OiA0SwordGNwX3JldHJpZXMxIC0gSU5URUdFUgorCUhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGJlZm9yZSBkZWNpZGluZyB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZworCWFuZCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVwb3J0IHRoaXMgc3VzcGljaW9uIHRvIG5ldHdvcmsgbGF5ZXIuCisJTWluaW1hbCBSRkMgdmFsdWUgaXMgMywgaXQgaXMgZGVmYXVsdCwgd2hpY2ggY29ycmVzcG9uZHMKKwl0byB+M3NlYy04bWluIGRlcGVuZGluZyBvbiBSVE8uCiAKLQlkZWZhdWx0OiBBbW91bnQgb2YgbWVtb3J5IGFsbG93ZWQgZm9yIHNlbmQgYnVmZmVycyBmb3IgVENQIHNvY2tldAotCWJ5IGRlZmF1bHQuIFRoaXMgdmFsdWUgb3ZlcnJpZGVzIG5ldC5jb3JlLndtZW1fZGVmYXVsdCB1c2VkCi0JYnkgb3RoZXIgcHJvdG9jb2xzLCBpdCBpcyB1c3VhbGx5IGxvd2VyIHRoYW4gbmV0LmNvcmUud21lbV9kZWZhdWx0LgotCURlZmF1bHQ6IDE2SwordGNwX3JldHJpZXMyIC0gSU5URUdFUgorCUhvdyBtYXkgdGltZXMgdG8gcmV0cnkgYmVmb3JlIGtpbGxpbmcgYWxpdmUgVENQIGNvbm5lY3Rpb24uCisJUkZDMTEyMiBzYXlzIHRoYXQgdGhlIGxpbWl0IHNob3VsZCBiZSBsb25nZXIgdGhhbiAxMDAgc2VjLgorCUl0IGlzIHRvbyBzbWFsbCBudW1iZXIuCURlZmF1bHQgdmFsdWUgMTUgY29ycmVzcG9uZHMgdG8gfjEzLTMwbWluCisJZGVwZW5kaW5nIG9uIFJUTy4KIAotCW1heDogTWF4aW1hbCBhbW91bnQgb2YgbWVtb3J5IGFsbG93ZWQgZm9yIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQKLQlzZW5kIGJ1ZmZlcnMgZm9yIFRDUCBzb2NrZXQuIFRoaXMgdmFsdWUgZG9lcyBub3Qgb3ZlcnJpZGUKLQluZXQuY29yZS53bWVtX21heCwgInN0YXRpYyIgc2VsZWN0aW9uIHZpYSBTT19TTkRCVUYgZG9lcyBub3QgdXNlIHRoaXMuCi0JRGVmYXVsdDogMTI4SwordGNwX3JmYzEzMzcgLSBCT09MRUFOCisJSWYgc2V0LCB0aGUgVENQIHN0YWNrIGJlaGF2ZXMgY29uZm9ybWluZyB0byBSRkMxMzM3LiBJZiB1bnNldCwKKwl3ZSBhcmUgbm90IGNvbmZvcm1pbmcgdG8gUkZDLCBidXQgcHJldmVudCBUQ1AgVElNRV9XQUlUCisJYXNzYXNzaW5hdGlvbi4KKwlEZWZhdWx0OiAwCiAKIHRjcF9ybWVtIC0gdmVjdG9yIG9mIDMgSU5URUdFUnM6IG1pbiwgZGVmYXVsdCwgbWF4CiAJbWluOiBNaW5pbWFsIHNpemUgb2YgcmVjZWl2ZSBidWZmZXIgdXNlZCBieSBUQ1Agc29ja2V0cy4KQEAgLTI5OSw3NCArMjk0LDggQEAKIAluZXQuY29yZS5ybWVtX21heCwgInN0YXRpYyIgc2VsZWN0aW9uIHZpYSBTT19SQ1ZCVUYgZG9lcyBub3QgdXNlIHRoaXMuCiAJRGVmYXVsdDogODczODAqMiBieXRlcy4KIAotdGNwX21lbSAtIHZlY3RvciBvZiAzIElOVEVHRVJzOiBtaW4sIHByZXNzdXJlLCBtYXgKLQltaW46IGJlbG93IHRoaXMgbnVtYmVyIG9mIHBhZ2VzIFRDUCBpcyBub3QgYm90aGVyZWQgYWJvdXQgaXRzCi0JbWVtb3J5IGFwcGV0aXRlLgotCi0JcHJlc3N1cmU6IHdoZW4gYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgYnkgVENQIGV4Y2VlZHMgdGhpcyBudW1iZXIKLQlvZiBwYWdlcywgVENQIG1vZGVyYXRlcyBpdHMgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBlbnRlcnMgbWVtb3J5Ci0JcHJlc3N1cmUgbW9kZSwgd2hpY2ggaXMgZXhpdGVkIHdoZW4gbWVtb3J5IGNvbnN1bXB0aW9uIGZhbGxzCi0JdW5kZXIgIm1pbiIuCi0KLQltYXg6IG51bWJlciBvZiBwYWdlcyBhbGxvd2VkIGZvciBxdWV1ZWluZyBieSBhbGwgVENQIHNvY2tldHMuCi0KLQlEZWZhdWx0cyBhcmUgY2FsY3VsYXRlZCBhdCBib290IHRpbWUgZnJvbSBhbW91bnQgb2YgYXZhaWxhYmxlCi0JbWVtb3J5LgotCi10Y3BfYXBwX3dpbiAtIElOVEVHRVIKLQlSZXNlcnZlIG1heCh3aW5kb3cvMl50Y3BfYXBwX3dpbiwgbXNzKSBvZiB3aW5kb3cgZm9yIGFwcGxpY2F0aW9uCi0JYnVmZmVyLiBWYWx1ZSAwIGlzIHNwZWNpYWwsIGl0IG1lYW5zIHRoYXQgbm90aGluZyBpcyByZXNlcnZlZC4KLQlEZWZhdWx0OiAzMQotCi10Y3BfYWR2X3dpbl9zY2FsZSAtIElOVEVHRVIKLQlDb3VudCBidWZmZXJpbmcgb3ZlcmhlYWQgYXMgYnl0ZXMvMl50Y3BfYWR2X3dpbl9zY2FsZQotCShpZiB0Y3BfYWR2X3dpbl9zY2FsZSA+IDApIG9yIGJ5dGVzLWJ5dGVzLzJeKC10Y3BfYWR2X3dpbl9zY2FsZSksCi0JaWYgaXQgaXMgPD0gMC4KLQlEZWZhdWx0OiAyCi0KLXRjcF9yZmMxMzM3IC0gQk9PTEVBTgotCUlmIHNldCwgdGhlIFRDUCBzdGFjayBiZWhhdmVzIGNvbmZvcm1pbmcgdG8gUkZDMTMzNy4gSWYgdW5zZXQsCi0Jd2UgYXJlIG5vdCBjb25mb3JtaW5nIHRvIFJGQywgYnV0IHByZXZlbnQgVENQIFRJTUVfV0FJVAotCWFzc2Fzc2luYXRpb24uICAgCi0JRGVmYXVsdDogMAotCi10Y3BfbG93X2xhdGVuY3kgLSBCT09MRUFOCi0JSWYgc2V0LCB0aGUgVENQIHN0YWNrIG1ha2VzIGRlY2lzaW9ucyB0aGF0IHByZWZlciBsb3dlcgotCWxhdGVuY3kgYXMgb3Bwb3NlZCB0byBoaWdoZXIgdGhyb3VnaHB1dC4gIEJ5IGRlZmF1bHQsIHRoaXMKLQlvcHRpb24gaXMgbm90IHNldCBtZWFuaW5nIHRoYXQgaGlnaGVyIHRocm91Z2hwdXQgaXMgcHJlZmVycmVkLgotCUFuIGV4YW1wbGUgb2YgYW4gYXBwbGljYXRpb24gd2hlcmUgdGhpcyBkZWZhdWx0IHNob3VsZCBiZQotCWNoYW5nZWQgd291bGQgYmUgYSBCZW93dWxmIGNvbXB1dGUgY2x1c3Rlci4KLQlEZWZhdWx0OiAwCi0KLXRjcF90c29fd2luX2Rpdmlzb3IgLSBJTlRFR0VSCi0gICAgICAgVGhpcyBhbGxvd3MgY29udHJvbCBvdmVyIHdoYXQgcGVyY2VudGFnZSBvZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cKLSAgICAgICBjYW4gYmUgY29uc3VtZWQgYnkgYSBzaW5nbGUgVFNPIGZyYW1lLgotICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoaXMgcGFyYW1ldGVyIGlzIGEgY2hvaWNlIGJldHdlZW4gYnVyc3RpbmVzcyBhbmQKLSAgICAgICBidWlsZGluZyBsYXJnZXIgVFNPIGZyYW1lcy4KLSAgICAgICBEZWZhdWx0OiAzCi0KLXRjcF9mcnRvIC0gQk9PTEVBTgotCUVuYWJsZXMgRi1SVE8sIGFuIGVuaGFuY2VkIHJlY292ZXJ5IGFsZ29yaXRobSBmb3IgVENQIHJldHJhbnNtaXNzaW9uCi0JdGltZW91dHMuICBJdCBpcyBwYXJ0aWN1bGFybHkgYmVuZWZpY2lhbCBpbiB3aXJlbGVzcyBlbnZpcm9ubWVudHMKLQl3aGVyZSBwYWNrZXQgbG9zcyBpcyB0eXBpY2FsbHkgZHVlIHRvIHJhbmRvbSByYWRpbyBpbnRlcmZlcmVuY2UKLQlyYXRoZXIgdGhhbiBpbnRlcm1lZGlhdGUgcm91dGVyIGNvbmdlc3Rpb24uCi0KLXRjcF9jb25nZXN0aW9uX2NvbnRyb2wgLSBTVFJJTkcKLQlTZXQgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gdG8gYmUgdXNlZCBmb3IgbmV3Ci0JY29ubmVjdGlvbnMuIFRoZSBhbGdvcml0aG0gInJlbm8iIGlzIGFsd2F5cyBhdmFpbGFibGUsIGJ1dAotCWFkZGl0aW9uYWwgY2hvaWNlcyBtYXkgYmUgYXZhaWxhYmxlIGJhc2VkIG9uIGtlcm5lbCBjb25maWd1cmF0aW9uLgotCi1zb21heGNvbm4gLSBJTlRFR0VSCi0JTGltaXQgb2Ygc29ja2V0IGxpc3RlbigpIGJhY2tsb2csIGtub3duIGluIHVzZXJzcGFjZSBhcyBTT01BWENPTk4uCi0JRGVmYXVsdHMgdG8gMTI4LiAgU2VlIGFsc28gdGNwX21heF9zeW5fYmFja2xvZyBmb3IgYWRkaXRpb25hbCB0dW5pbmcKLQlmb3IgVENQIHNvY2tldHMuCi0KLXRjcF93b3JrYXJvdW5kX3NpZ25lZF93aW5kb3dzIC0gQk9PTEVBTgotCUlmIHNldCwgYXNzdW1lIG5vIHJlY2VpcHQgb2YgYSB3aW5kb3cgc2NhbGluZyBvcHRpb24gbWVhbnMgdGhlCi0JcmVtb3RlIFRDUCBpcyBicm9rZW4gYW5kIHRyZWF0cyB0aGUgd2luZG93IGFzIGEgc2lnbmVkIHF1YW50aXR5LgotCUlmIHVuc2V0LCBhc3N1bWUgdGhlIHJlbW90ZSBUQ1AgaXMgbm90IGJyb2tlbiBldmVuIGlmIHdlIGRvCi0Jbm90IHJlY2VpdmUgYSB3aW5kb3cgc2NhbGluZyBvcHRpb24gZnJvbSB0aGVtLgotCURlZmF1bHQ6IDAKK3RjcF9zYWNrIC0gQk9PTEVBTgorCUVuYWJsZSBzZWxlY3QgYWNrbm93bGVkZ21lbnRzIChTQUNLUykuCiAKIHRjcF9zbG93X3N0YXJ0X2FmdGVyX2lkbGUgLSBCT09MRUFOCiAJSWYgc2V0LCBwcm92aWRlIFJGQzI4NjEgYmVoYXZpb3IgYW5kIHRpbWUgb3V0IHRoZSBjb25nZXN0aW9uCkBAIC0zNzUsNiArMzA0LDg5IEBACiAJYmUgdGltZWQgb3V0IGFmdGVyIGFuIGlkbGUgcGVyaW9kLgogCURlZmF1bHQ6IDEKIAordGNwX3N0ZHVyZyAtIEJPT0xFQU4KKwlVc2UgdGhlIEhvc3QgcmVxdWlyZW1lbnRzIGludGVycHJldGF0aW9uIG9mIHRoZSBUQ1AgdXJnIHBvaW50ZXIgZmllbGQuCisJTW9zdCBob3N0cyB1c2UgdGhlIG9sZGVyIEJTRCBpbnRlcnByZXRhdGlvbiwgc28gaWYgeW91IHR1cm4gdGhpcyBvbgorCUxpbnV4IG1pZ2h0IG5vdCBjb21tdW5pY2F0ZSBjb3JyZWN0bHkgd2l0aCB0aGVtLgorCURlZmF1bHQ6IEZBTFNFCisKK3RjcF9zeW5hY2tfcmV0cmllcyAtIElOVEVHRVIKKwlOdW1iZXIgb2YgdGltZXMgU1lOQUNLcyBmb3IgYSBwYXNzaXZlIFRDUCBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbAorCWJlIHJldHJhbnNtaXR0ZWQuIFNob3VsZCBub3QgYmUgaGlnaGVyIHRoYW4gMjU1LiBEZWZhdWx0IHZhbHVlCisJaXMgNSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gfjE4MHNlY29uZHMuCisKK3RjcF9zeW5jb29raWVzIC0gQk9PTEVBTgorCU9ubHkgdmFsaWQgd2hlbiB0aGUga2VybmVsIHdhcyBjb21waWxlZCB3aXRoIENPTkZJR19TWU5DT09LSUVTCisJU2VuZCBvdXQgc3luY29va2llcyB3aGVuIHRoZSBzeW4gYmFja2xvZyBxdWV1ZSBvZiBhIHNvY2tldAorCW92ZXJmbG93cy4gVGhpcyBpcyB0byBwcmV2ZW50IGFnYWluc3QgdGhlIGNvbW1vbiAnc3luIGZsb29kIGF0dGFjaycKKwlEZWZhdWx0OiBGQUxTRQorCisJTm90ZSwgdGhhdCBzeW5jb29raWVzIGlzIGZhbGxiYWNrIGZhY2lsaXR5LgorCUl0IE1VU1QgTk9UIGJlIHVzZWQgdG8gaGVscCBoaWdobHkgbG9hZGVkIHNlcnZlcnMgdG8gc3RhbmQKKwlhZ2FpbnN0IGxlZ2FsIGNvbm5lY3Rpb24gcmF0ZS4gSWYgeW91IHNlZSBzeW5mbG9vZCB3YXJuaW5ncworCWluIHlvdXIgbG9ncywgYnV0IGludmVzdGlnYXRpb24Jc2hvd3MgdGhhdCB0aGV5IG9jY3VyCisJYmVjYXVzZSBvZiBvdmVybG9hZCB3aXRoIGxlZ2FsIGNvbm5lY3Rpb25zLCB5b3Ugc2hvdWxkIHR1bmUKKwlhbm90aGVyIHBhcmFtZXRlcnMgdW50aWwgdGhpcyB3YXJuaW5nIGRpc2FwcGVhci4KKwlTZWU6IHRjcF9tYXhfc3luX2JhY2tsb2csIHRjcF9zeW5hY2tfcmV0cmllcywgdGNwX2Fib3J0X29uX292ZXJmbG93LgorCisJc3luY29va2llcyBzZXJpb3VzbHkgdmlvbGF0ZSBUQ1AgcHJvdG9jb2wsIGRvIG5vdCBhbGxvdworCXRvIHVzZSBUQ1AgZXh0ZW5zaW9ucywgY2FuIHJlc3VsdCBpbiBzZXJpb3VzIGRlZ3JhZGF0aW9uCisJb2Ygc29tZSBzZXJ2aWNlcyAoZi5lLiBTTVRQIHJlbGF5aW5nKSwgdmlzaWJsZSBub3QgYnkgeW91LAorCWJ1dCB5b3VyIGNsaWVudHMgYW5kIHJlbGF5cywgY29udGFjdGluZyB5b3UuIFdoaWxlIHlvdSBzZWUKKwlzeW5mbG9vZCB3YXJuaW5ncyBpbiBsb2dzIG5vdCBiZWluZyByZWFsbHkgZmxvb2RlZCwgeW91ciBzZXJ2ZXIKKwlpcyBzZXJpb3VzbHkgbWlzY29uZmlndXJlZC4KKwordGNwX3N5bl9yZXRyaWVzIC0gSU5URUdFUgorCU51bWJlciBvZiB0aW1lcyBpbml0aWFsIFNZTnMgZm9yIGFuIGFjdGl2ZSBUQ1AgY29ubmVjdGlvbiBhdHRlbXB0CisJd2lsbCBiZSByZXRyYW5zbWl0dGVkLiBTaG91bGQgbm90IGJlIGhpZ2hlciB0aGFuIDI1NS4gRGVmYXVsdCB2YWx1ZQorCWlzIDUsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIH4xODBzZWNvbmRzLgorCit0Y3BfdGltZXN0YW1wcyAtIEJPT0xFQU4KKwlFbmFibGUgdGltZXN0YW1wcyBhcyBkZWZpbmVkIGluIFJGQzEzMjMuCisKK3RjcF90c29fd2luX2Rpdmlzb3IgLSBJTlRFR0VSCisJVGhpcyBhbGxvd3MgY29udHJvbCBvdmVyIHdoYXQgcGVyY2VudGFnZSBvZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cKKwljYW4gYmUgY29uc3VtZWQgYnkgYSBzaW5nbGUgVFNPIGZyYW1lLgorCVRoZSBzZXR0aW5nIG9mIHRoaXMgcGFyYW1ldGVyIGlzIGEgY2hvaWNlIGJldHdlZW4gYnVyc3RpbmVzcyBhbmQKKwlidWlsZGluZyBsYXJnZXIgVFNPIGZyYW1lcy4KKwlEZWZhdWx0OiAzCisKK3RjcF90d19yZWN5Y2xlIC0gQk9PTEVBTgorCUVuYWJsZSBmYXN0IHJlY3ljbGluZyBUSU1FLVdBSVQgc29ja2V0cy4gRGVmYXVsdCB2YWx1ZSBpcyAwLgorCUl0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGFkdmljZS9yZXF1ZXN0IG9mIHRlY2huaWNhbAorCWV4cGVydHMuCisKK3RjcF90d19yZXVzZSAtIEJPT0xFQU4KKwlBbGxvdyB0byByZXVzZSBUSU1FLVdBSVQgc29ja2V0cyBmb3IgbmV3IGNvbm5lY3Rpb25zIHdoZW4gaXQgaXMKKwlzYWZlIGZyb20gcHJvdG9jb2wgdmlld3BvaW50LiBEZWZhdWx0IHZhbHVlIGlzIDAuCisJSXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYWR2aWNlL3JlcXVlc3Qgb2YgdGVjaG5pY2FsCisJZXhwZXJ0cy4KKwordGNwX3dpbmRvd19zY2FsaW5nIC0gQk9PTEVBTgorCUVuYWJsZSB3aW5kb3cgc2NhbGluZyBhcyBkZWZpbmVkIGluIFJGQzEzMjMuCisKK3RjcF93bWVtIC0gdmVjdG9yIG9mIDMgSU5URUdFUnM6IG1pbiwgZGVmYXVsdCwgbWF4CisJbWluOiBBbW91bnQgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBzZW5kIGJ1ZmZlcnMgZm9yIFRDUCBzb2NrZXQuCisJRWFjaCBUQ1Agc29ja2V0IGhhcyByaWdodHMgdG8gdXNlIGl0IGR1ZSB0byBmYWN0IG9mIGl0cyBiaXJ0aC4KKwlEZWZhdWx0OiA0SworCisJZGVmYXVsdDogQW1vdW50IG9mIG1lbW9yeSBhbGxvd2VkIGZvciBzZW5kIGJ1ZmZlcnMgZm9yIFRDUCBzb2NrZXQKKwlieSBkZWZhdWx0LiBUaGlzIHZhbHVlIG92ZXJyaWRlcyBuZXQuY29yZS53bWVtX2RlZmF1bHQgdXNlZAorCWJ5IG90aGVyIHByb3RvY29scywgaXQgaXMgdXN1YWxseSBsb3dlciB0aGFuIG5ldC5jb3JlLndtZW1fZGVmYXVsdC4KKwlEZWZhdWx0OiAxNksKKworCW1heDogTWF4aW1hbCBhbW91bnQgb2YgbWVtb3J5IGFsbG93ZWQgZm9yIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQKKwlzZW5kIGJ1ZmZlcnMgZm9yIFRDUCBzb2NrZXQuIFRoaXMgdmFsdWUgZG9lcyBub3Qgb3ZlcnJpZGUKKwluZXQuY29yZS53bWVtX21heCwgInN0YXRpYyIgc2VsZWN0aW9uIHZpYSBTT19TTkRCVUYgZG9lcyBub3QgdXNlIHRoaXMuCisJRGVmYXVsdDogMTI4SworCit0Y3Bfd29ya2Fyb3VuZF9zaWduZWRfd2luZG93cyAtIEJPT0xFQU4KKwlJZiBzZXQsIGFzc3VtZSBubyByZWNlaXB0IG9mIGEgd2luZG93IHNjYWxpbmcgb3B0aW9uIG1lYW5zIHRoZQorCXJlbW90ZSBUQ1AgaXMgYnJva2VuIGFuZCB0cmVhdHMgdGhlIHdpbmRvdyBhcyBhIHNpZ25lZCBxdWFudGl0eS4KKwlJZiB1bnNldCwgYXNzdW1lIHRoZSByZW1vdGUgVENQIGlzIG5vdCBicm9rZW4gZXZlbiBpZiB3ZSBkbworCW5vdCByZWNlaXZlIGEgd2luZG93IHNjYWxpbmcgb3B0aW9uIGZyb20gdGhlbS4KKwlEZWZhdWx0OiAwCisKIENJUFNPdjQgVmFyaWFibGVzOgogCiBjaXBzb19jYWNoZV9lbmFibGUgLSBCT09MRUFOCkBAIC05NzQsNCArOTg2LDMgQEAKIHNsb3RfdGltZW91dCBGSVhNRQogd2Fybl9ub3JlcGx5X3RpbWUgRklYTUUKIAotJElkOiBpcC1zeXNjdGwudHh0LHYgMS4yMCAyMDAxLzEyLzEzIDA5OjAwOjE4IGRhdmVtIEV4cCAkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcGhhc2UudHh0CmluZGV4IDQ5MzIwM2EuLjU1ZWFjNGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcGhhc2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcGhhc2UudHh0CkBAIC04MSw3ICs4MSw3IEBACiAgICAgMU0uIFRoZSBSQU0gc2l6ZSBkZWNpZGVzIHRoZSBudW1iZXIgb2YgYnVmZmVycyBhbmQgYnVmZmVyIHNpemUuIFRoZSBkZWZhdWx0IAogICAgIHNpemUgYW5kIG51bWJlciBvZiBidWZmZXJzIGFyZSBzZXQgYXMgZm9sbG93aW5nOiAKIAotICAgICAgICAgIFRvdG9sICAgIFJ4IFJBTSAgIFR4IFJBTSAgIFJ4IEJ1ZiAgIFR4IEJ1ZiAgIFJ4IGJ1ZiAgIFR4IGJ1ZgorICAgICAgICAgIFRvdGFsICAgIFJ4IFJBTSAgIFR4IFJBTSAgIFJ4IEJ1ZiAgIFR4IEJ1ZiAgIFJ4IGJ1ZiAgIFR4IGJ1ZgogICAgICAgICAgUkFNIHNpemUgICBzaXplICAgICBzaXplICAgICBzaXplICAgICBzaXplICAgICAgY250ICAgICAgY250CiAgICAgICAgICAtLS0tLS0tLSAgLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tCiAgICAgICAgICAgIDEyOEsgICAgICA2NEsgICAgICA2NEsgICAgICAxMEsgICAgICAxMEsgICAgICAgNiAgICAgICAgNgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKaW5kZXggMTJhMDA4YS4uNWEyMzJkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0CkBAIC0yODQsNyArMjg0LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSWYgeW91IGNoZWNrIHRoZSBzb3VyY2UgY29kZSB5b3Ugd2lsbCBzZWUgdGhhdCB3aGF0IEkgZHJhdyBoZXJlIGFzIGEgZnJhbWUKLWlzIG5vdCBvbmx5IHRoZSBsaW5rIGxldmVsIGZyYW1lLiBBdCB0aGUgYmVnaW5pbmcgb2YgZWFjaCBmcmFtZSB0aGVyZSBpcyBhIAoraXMgbm90IG9ubHkgdGhlIGxpbmsgbGV2ZWwgZnJhbWUuIEF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmcmFtZSB0aGVyZSBpcyBhIAogaGVhZGVyIGNhbGxlZCBzdHJ1Y3QgdHBhY2tldF9oZHIgdXNlZCBpbiBQQUNLRVRfTU1BUCB0byBob2xkIGxpbmsgbGV2ZWwncyBmcmFtZQogbWV0YSBpbmZvcm1hdGlvbiBsaWtlIHRpbWVzdGFtcC4gU28gd2hhdCB3ZSBkcmF3IGhlcmUgYSBmcmFtZSBpdCdzIHJlYWxseSAKIHRoZSBmb2xsb3dpbmcgKGZyb20gaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaCk6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9waHkudHh0CmluZGV4IDI5Y2NhZTQuLjBiYzk1ZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9waHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9waHkudHh0CkBAIC0xLDcgKzEsNyBAQAogCiAtLS0tLS0tCiBQSFkgQWJzdHJhY3Rpb24gTGF5ZXIKLShVcGRhdGVkIDIwMDUtMDctMjEpCisoVXBkYXRlZCAyMDA2LTExLTMwKQogCiBQdXJwb3NlCiAKQEAgLTk3LDExICs5NywxMiBAQAogIAogIE5leHQsIHlvdSBuZWVkIHRvIGtub3cgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBQSFkgY29ubmVjdGVkIHRvIHRoaXMgZGV2aWNlLiAKICBUaGUgbmFtZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UsICJwaHkwOjAiLCB3aGVyZSB0aGUgZmlyc3QgbnVtYmVyIGlzIHRoZQotIGJ1cyBpZCwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIFBIWSdzIGFkZHJlc3Mgb24gdGhhdCBidXMuCisgYnVzIGlkLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgUEhZJ3MgYWRkcmVzcyBvbiB0aGF0IGJ1cy4gIFR5cGljYWxseSwKKyB0aGUgYnVzIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgaXRzIElEIHVuaXF1ZS4KICAKICBOb3csIHRvIGNvbm5lY3QsIGp1c3QgY2FsbCB0aGlzIGZ1bmN0aW9uOgogIAotICAgcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlfbmFtZSwgJmFkanVzdF9saW5rLCBmbGFncyk7CisgICBwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeV9uYW1lLCAmYWRqdXN0X2xpbmssIGZsYWdzLCBpbnRlcmZhY2UpOwogCiAgcGh5ZGV2IGlzIGEgcG9pbnRlciB0byB0aGUgcGh5X2RldmljZSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgUEhZLiAgSWYKICBwaHlfY29ubmVjdCBpcyBzdWNjZXNzZnVsLCBpdCB3aWxsIHJldHVybiB0aGUgcG9pbnRlci4gIGRldiwgaGVyZSwgaXMgdGhlCkBAIC0xMTUsNiArMTE2LDEwIEBACiAgVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHN5c3RlbSBoYXMgcHV0IGhhcmR3YXJlIHJlc3RyaWN0aW9ucyBvbgogIHRoZSBQSFkvY29udHJvbGxlciwgb2Ygd2hpY2ggdGhlIFBIWSBuZWVkcyB0byBiZSBhd2FyZS4KIAorIGludGVyZmFjZSBpcyBhIHUzMiB3aGljaCBzcGVjaWZpZXMgdGhlIGNvbm5lY3Rpb24gdHlwZSB1c2VkCisgYmV0d2VlbiB0aGUgY29udHJvbGxlciBhbmQgdGhlIFBIWS4gIEV4YW1wbGVzIGFyZSBHTUlJLCBNSUksCisgUkdNSUksIGFuZCBTR01JSS4gIEZvciBhIGZ1bGwgbGlzdCwgc2VlIGluY2x1ZGUvbGludXgvcGh5LmgKKwogIE5vdyBqdXN0IG1ha2Ugc3VyZSB0aGF0IHBoeWRldi0+c3VwcG9ydGVkIGFuZCBwaHlkZXYtPmFkdmVydGlzaW5nIGhhdmUgYW55CiAgdmFsdWVzIHBydW5lZCBmcm9tIHRoZW0gd2hpY2ggZG9uJ3QgbWFrZSBzZW5zZSBmb3IgeW91ciBjb250cm9sbGVyIChhIDEwLzEwMAogIGNvbnRyb2xsZXIgbWF5IGJlIGNvbm5lY3RlZCB0byBhIGdpZ2FiaXQgY2FwYWJsZSBQSFksIHNvIHlvdSB3b3VsZCBuZWVkIHRvCkBAIC0xOTEsNyArMTk2LDcgQEAKICAgIHN0YXJ0LCBvciBkaXNhYmxlcyB0aGVuIGZyZWVzIHRoZW0gZm9yIHN0b3AuCiAKICBzdHJ1Y3QgcGh5X2RldmljZSAqIHBoeV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcGh5X2lkLAotCQkgdTMyIGZsYWdzKTsKKwkJIHUzMiBmbGFncywgcGh5X2ludGVyZmFjZV90IGludGVyZmFjZSk7CiAKICAgIEF0dGFjaGVzIGEgbmV0d29yayBkZXZpY2UgdG8gYSBwYXJ0aWN1bGFyIFBIWSwgYmluZGluZyB0aGUgUEhZIHRvIGEgZ2VuZXJpYwogICAgZHJpdmVyIGlmIG5vbmUgd2FzIGZvdW5kIGR1cmluZyBidXMgaW5pdGlhbGl6YXRpb24uICBQYXNzZXMgaW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BrdGdlbi50eHQKaW5kZXggYzhlZWUyMy4uYzZjZjRhMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BrdGdlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BrdGdlbi50eHQKQEAgLTYzLDggKzYzLDggQEAKIFJlc3VsdDogT0s6IDEzMTAxMTQyKGMxMjIyMDc0MStkODgwNDAxKSB1c2VjLCAxMDAwMDAwMCAoNjBieXRlLDBmcmFncykKICAgNzYzMjkycHBzIDM5ME1iL3NlYyAoMzkwODA1NTA0YnBzKSBlcnJvcnM6IDM5NjY0CiAKLUNvbmZndXJpbmcgdGhyZWFkcyBhbmQgZGV2aWNlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDb25maWd1cmluZyB0aHJlYWRzIGFuZCBkZXZpY2VzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogVGhpcyBpcyBkb25lIHZpYSB0aGUgL3Byb2MgaW50ZXJmYWNlIGVhc2llc3QgZG9uZSB2aWEgcGdzZXQgaW4gdGhlIHNjcmlwdHMKIAogRXhhbXBsZXM6CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCQkJIHRoZXJlIG11c3QgYmUgbm8gc3BhY2VzIGJldHdlZW4gdGhlCiAJCQkJCSBhcmd1bWVudHMuIExlYWRpbmcgemVyb3MgYXJlIHJlcXVpcmVkLgogCQkJCQkgRG8gbm90IHNldCB0aGUgYm90dG9tIG9mIHN0YWNrIGJpdCwKLQkJCQkJIHRoYXRzIGRvbmUgYXV0b21hdGljYWxseS4gSWYgeW91IGRvCisJCQkJCSB0aGF0J3MgZG9uZSBhdXRvbWF0aWNhbGx5LiBJZiB5b3UgZG8KIAkJCQkJIHNldCB0aGUgYm90dG9tIG9mIHN0YWNrIGJpdCwgdGhhdAogCQkJCQkgaW5kaWNhdGVzIHRoYXQgeW91IHdhbnQgdG8gcmFuZG9tbHkKIAkJCQkJIGdlbmVyYXRlIHRoYXQgYWRkcmVzcyBhbmQgdGhlIGZsYWcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wcm9jX25ldF90Y3AudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Byb2NfbmV0X3RjcC50eHQKaW5kZXggNTljYjkxNS4uNWUyMWY3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Byb2NfbmV0X3RjcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Byb2NfbmV0X3RjcC50eHQKQEAgLTI1LDcgKzI1LDcgQEAKIAogICAgMTAwMCAgICAgICAgMCA1NDE2NTc4NSA0IGNkMWU2MDQwIDI1IDQgMjcgMyAtMQogICAgIHwgICAgICAgICAgfCAgICB8ICAgICB8ICAgIHwgICAgIHwgIHwgfCAgfCB8LS0+IHNsb3cgc3RhcnQgc2l6ZSB0aHJlc2hvbGQsIAotICAgIHwgICAgICAgICAgfCAgICB8ICAgICB8ICAgIHwgICAgIHwgIHwgfCAgfCAgICAgIG9yIC0xIGlmIHRoZSB0cmVzaG9sZAorICAgIHwgICAgICAgICAgfCAgICB8ICAgICB8ICAgIHwgICAgIHwgIHwgfCAgfCAgICAgIG9yIC0xIGlmIHRoZSB0aHJlc2hvbGQKICAgICB8ICAgICAgICAgIHwgICAgfCAgICAgfCAgICB8ICAgICB8ICB8IHwgIHwgICAgICBpcyA+PSAweEZGRkYKICAgICB8ICAgICAgICAgIHwgICAgfCAgICAgfCAgICB8ICAgICB8ICB8IHwgIHwtLS0tPiBzZW5kaW5nIGNvbmdlc3Rpb24gd2luZG93CiAgICAgfCAgICAgICAgICB8ICAgIHwgICAgIHwgICAgfCAgICAgfCAgfCB8LS0tLS0tLT4gKGFjay5xdWljazw8MSl8YWNrLnBpbmdwb25nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2s5OGxpbi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2s5OGxpbi50eHQKaW5kZXggNGUxY2M3NC4uODU5MGE5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NrOThsaW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zazk4bGluLnR4dApAQCAtMzQ2LDcgKzM0Niw3IEBACiAgICAgICBkZXBlbmRpbmcgb24gdGhlIGxvYWQgb2YgdGhlIHN5c3RlbS4gSWYgdGhlIGRyaXZlciBkZXRlY3RzIHRoYXQgdGhlCiAgICAgICBzeXN0ZW0gbG9hZCBpcyB0b28gaGlnaCwgdGhlIGRyaXZlciB0cmllcyB0byBzaGllbGQgdGhlIHN5c3RlbSBhZ2FpbnN0IAogICAgICAgdG9vIG11Y2ggbmV0d29yayBsb2FkIGJ5IGVuYWJsaW5nIGludGVycnVwdCBtb2RlcmF0aW9uLiBJZiAtIGF0IGEgbGF0ZXIKLSAgICAgIHRpbWUgLSB0aGUgQ1BVIHV0aWxpemF0b24gZGVjcmVhc2VzIGFnYWluIChvciBpZiB0aGUgbmV0d29yayBsb2FkIGlzIAorICAgICAgdGltZSAtIHRoZSBDUFUgdXRpbGl6YXRpb24gZGVjcmVhc2VzIGFnYWluIChvciBpZiB0aGUgbmV0d29yayBsb2FkIGlzIAogICAgICAgbmVnbGlnaWJsZSkgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KIAogSW50ZXJydXB0IG1vZGVyYXRpb24gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZHJpdmVyIGhhcyB0byBoYW5kbGUgb25lIG9yIG1vcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zbGljZWNvbS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2xpY2Vjb20udHh0CmluZGV4IDJmMDRjOTIuLjMyZDNiOTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zbGljZWNvbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NsaWNlY29tLnR4dApAQCAtMTI2LDcgKzEyNiw3IEBACiAKIFRob3VnaCB0aGUgb3B0aW9ucyBiZWxvdyBhcmUgdG8gYmUgc2V0IG9uIGEgc2luZ2xlIGludGVyZmFjZSwgdGhleSBhcHBseSB0byB0aGUKIHdob2xlIGJvYXJkLiBUaGUgcmVzdHJpY3Rpb24sIHRvIHVzZSB0aGVtIG9uICdVUCcgaW50ZXJmYWNlcywgaXMgYmVjYXVzZSB0aGUgCi1jb21tYW5kIHNlcXVlbmNlIGJlbG93IGNvdWxkIGxlYWQgdG8gdW5wcmVkaWNhYmxlIHJlc3VsdHMuCitjb21tYW5kIHNlcXVlbmNlIGJlbG93IGNvdWxkIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHRzLgogCiAJIyBlY2hvIDAgICAgICAgID5ib2FyZG51bQogCSMgZWNobyBpbnRlcm5hbCA+Y2xvY2tfc291cmNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdWRwbGl0ZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdWRwbGl0ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2ZjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy91ZHBsaXRlLnR4dApAQCAtMCwwICsxLDI4MSBAQAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICBUaGUgVURQLUxpdGUgcHJvdG9jb2wgKFJGQyAzODI4KQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisgIFVEUC1MaXRlIGlzIGEgU3RhbmRhcmRzLVRyYWNrIElFVEYgdHJhbnNwb3J0IHByb3RvY29sIHdob3NlIGNoYXJhY3RlcmlzdGljCisgIGlzIGEgdmFyaWFibGUtbGVuZ3RoIGNoZWNrc3VtLiBUaGlzIGhhcyBhZHZhbnRhZ2VzIGZvciB0cmFuc3BvcnQgb2YgbXVsdGltZWRpYQorICAodmlkZW8sIFZvSVApIG92ZXIgd2lyZWxlc3MgbmV0d29ya3MsIGFzIHBhcnRseSBkYW1hZ2VkIHBhY2tldHMgY2FuIHN0aWxsIGJlCisgIGZlZCBpbnRvIHRoZSBjb2RlYyBpbnN0ZWFkIG9mIGJlaW5nIGRpc2NhcmRlZCBkdWUgdG8gYSBmYWlsZWQgY2hlY2tzdW0gdGVzdC4KKworICBUaGlzIGZpbGUgYnJpZWZseSBkZXNjcmliZXMgdGhlIGV4aXN0aW5nIGtlcm5lbCBzdXBwb3J0IGFuZCB0aGUgc29ja2V0IEFQSS4KKyAgRm9yIGluLWRlcHRoIGluZm9ybWF0aW9uLCB5b3UgY2FuIGNvbnN1bHQ6CisKKyAgIG8gVGhlIFVEUC1MaXRlIEhvbWVwYWdlOiBodHRwOi8vd3d3LmVyZy5hYmRuLmFjLnVrL3VzZXJzL2dlcnJpdC91ZHAtbGl0ZS8KKyAgICAgICBGb20gaGVyZSB5b3UgY2FuIGFsc28gZG93bmxvYWQgc29tZSBleGFtcGxlIGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlLgorCisgICBvIFRoZSBVRFAtTGl0ZSBIT1dUTyBvbgorICAgICAgIGh0dHA6Ly93d3cuZXJnLmFiZG4uYWMudWsvdXNlcnMvZ2Vycml0L3VkcC1saXRlL2ZpbGVzL1VEUC1MaXRlLUhPV1RPLnR4dAorCisgICBvIFRoZSBXaXJlc2hhcmsgVURQLUxpdGUgV2lLaSAod2l0aCBjYXB0dXJlIGZpbGVzKToKKyAgICAgICBodHRwOi8vd2lraS53aXJlc2hhcmsub3JnL0xpZ2h0d2VpZ2h0X1VzZXJfRGF0YWdyYW1fUHJvdG9jb2wKKworICAgbyBUaGUgUHJvdG9jb2wgU3BlYywgUkZDIDM4MjgsIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM4MjgudHh0CisKKworICBJKSBBUFBMSUNBVElPTlMKKworICBTZXZlcmFsIGFwcGxpY2F0aW9ucyBoYXZlIGJlZW4gcG9ydGVkIHN1Y2Nlc3NmdWxseSB0byBVRFAtTGl0ZS4gRXRoZXJlYWwKKyAgKG5vdyBjYWxsZWQgd2lyZXNoYXJrKSBoYXMgVURQLUxpdGV2NC92NiBzdXBwb3J0IGJ5IGRlZmF1bHQuIFRoZSB0YXJiYWxsIG9uCisKKyAgIGh0dHA6Ly93d3cuZXJnLmFiZG4uYWMudWsvdXNlcnMvZ2Vycml0L3VkcC1saXRlL2ZpbGVzL3VkcGxpdGVfbGludXgudGFyLmd6CisKKyAgaGFzIHNvdXJjZSBjb2RlIGZvciBzZXZlcmFsIHY0L3Y2IGNsaWVudC1zZXJ2ZXIgYW5kIG5ldHdvcmsgdGVzdGluZyBleGFtcGxlcy4KKworICBQb3J0aW5nIGFwcGxpY2F0aW9ucyB0byBVRFAtTGl0ZSBpcyBzdHJhaWdodGZvcndhcmQ6IG9ubHkgc29ja2V0IGxldmVsIGFuZAorICBJUFBST1RPIG5lZWQgdG8gYmUgY2hhbmdlZDsgc2VuZGVycyBhZGRpdGlvbmFsbHkgc2V0IHRoZSBjaGVja3N1bSBjb3ZlcmFnZQorICBsZW5ndGggKGRlZmF1bHQgPSBoZWFkZXIgbGVuZ3RoID0gOCkuIERldGFpbHMgYXJlIGluIHRoZSBuZXh0IHNlY3Rpb24uCisKKworICBJSSkgUFJPR1JBTU1JTkcgQVBJCisKKyAgVURQLUxpdGUgcHJvdmlkZXMgYSBjb25uZWN0aW9ubGVzcywgdW5yZWxpYWJsZSBkYXRhZ3JhbSBzZXJ2aWNlIGFuZCBoZW5jZQorICB1c2VzIHRoZSBzYW1lIHNvY2tldCB0eXBlIGFzIFVEUC4gSW4gZmFjdCwgcG9ydGluZyBmcm9tIFVEUCB0byBVRFAtTGl0ZSBpcworICB2ZXJ5IGVhc3k6IHNpbXBseSBhZGQgYElQUFJPVE9fVURQTElURScgYXMgdGhlIGxhc3QgYXJndW1lbnQgb2YgdGhlIHNvY2tldCgyKQorICBjYWxsIHNvIHRoYXQgdGhlIHN0YXRlbWVudCBsb29rcyBsaWtlOgorCisgICAgICBzID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQTElURSk7CisKKyAgICAgICAgICAgICAgICAgICAgICBvciwgcmVzcGVjdGl2ZWx5LAorCisgICAgICBzID0gc29ja2V0KFBGX0lORVQ2LCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUExJVEUpOworCisgIFdpdGgganVzdCB0aGUgYWJvdmUgY2hhbmdlIHlvdSBhcmUgYWJsZSB0byBydW4gVURQLUxpdGUgc2VydmljZXMgb3IgY29ubmVjdAorICB0byBVRFAtTGl0ZSBzZXJ2ZXJzLiBUaGUga2VybmVsIHdpbGwgYXNzdW1lIHRoYXQgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbgorICB1c2luZyBwYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlIGFuZCBzbyBlbXVsYXRlIFVEUCBtb2RlIChmdWxsIGNvdmVyYWdlKS4KKworICBUbyBtYWtlIHVzZSBvZiB0aGUgcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSBmYWNpbGl0aWVzIHJlcXVpcmVzIHNldHRpbmcgYQorICBzaW5nbGUgc29ja2V0IG9wdGlvbiwgd2hpY2ggdGFrZXMgYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBjb3ZlcmFnZSBsZW5ndGg6CisKKyAgICAqIFNlbmRlciBjaGVja3N1bSBjb3ZlcmFnZTogVURQTElURV9TRU5EX0NTQ09WCisKKyAgICAgIEZvciBleGFtcGxlLAorCisgICAgICAgIGludCB2YWwgPSAyMDsKKyAgICAgICAgc2V0c29ja29wdChzLCBTT0xfVURQTElURSwgVURQTElURV9TRU5EX0NTQ09WLCAmdmFsLCBzaXplb2YoaW50KSk7CisKKyAgICAgIHNldHMgdGhlIGNoZWNrc3VtIGNvdmVyYWdlIGxlbmd0aCB0byAyMCBieXRlcyAoMTJiIGRhdGEgKyA4YiBoZWFkZXIpLgorICAgICAgT2YgZWFjaCBwYWNrZXQgb25seSB0aGUgZmlyc3QgMjAgYnl0ZXMgKHBsdXMgdGhlIHBzZXVkby1oZWFkZXIpIHdpbGwgYmUKKyAgICAgIGNoZWNrc3VtbWVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgUlRQIGFwcGxpY2F0aW9ucyB3aGljaCBoYXZlIGEgMTItYnl0ZQorICAgICAgYmFzZSBoZWFkZXIuCisKKworICAgICogUmVjZWl2ZXIgY2hlY2tzdW0gY292ZXJhZ2U6IFVEUExJVEVfUkVDVl9DU0NPVgorCisgICAgICBUaGlzIG9wdGlvbiBpcyB0aGUgcmVjZWl2ZXItc2lkZSBhbmFsb2d1ZS4gSXQgaXMgdHJ1bHkgb3B0aW9uYWwsIGkuZS4gbm90CisgICAgICByZXF1aXJlZCB0byBlbmFibGUgdHJhZmZpYyB3aXRoIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UuIEl0cyBmdW5jdGlvbiBpcworICAgICAgdGhhdCBvZiBhIHRyYWZmaWMgZmlsdGVyOiB3aGVuIGVuYWJsZWQsIGl0IGluc3RydWN0cyB0aGUga2VybmVsIHRvIGRyb3AKKyAgICAgIGFsbCBwYWNrZXRzIHdoaWNoIGhhdmUgYSBjb3ZlcmFnZSBfbGVzc18gdGhhbiB0aGlzIHZhbHVlLiBGb3IgZXhhbXBsZSwgaWYKKyAgICAgIFJUUCBhbmQgVURQIGhlYWRlcnMgYXJlIHRvIGJlIHByb3RlY3RlZCwgYSByZWNlaXZlciBjYW4gZW5mb3JjZSB0aGF0IG9ubHkKKyAgICAgIHBhY2tldHMgd2l0aCBhIG1pbmltdW0gY292ZXJhZ2Ugb2YgMjAgYXJlIGFkbWl0dGVkOgorCisgICAgICAgIGludCBtaW4gPSAyMDsKKyAgICAgICAgc2V0c29ja29wdChzLCBTT0xfVURQTElURSwgVURQTElURV9SRUNWX0NTQ09WLCAmbWluLCBzaXplb2YoaW50KSk7CisKKyAgVGhlIGNhbGxzIHRvIGdldHNvY2tvcHQoMikgYXJlIGFuYWxvZ291cy4gQmVpbmcgYW4gZXh0ZW5zaW9uIGFuZCBub3QgYSBzdGFuZC0KKyAgYWxvbmUgcHJvdG9jb2wsIGFsbCBzb2NrZXQgb3B0aW9ucyBrbm93biBmcm9tIFVEUCBjYW4gYmUgdXNlZCBpbiBleGFjdGx5IHRoZQorICBzYW1lIG1hbm5lciBhcyBiZWZvcmUsIGUuZy4gVURQX0NPUksgb3IgVURQX0VOQ0FQLgorCisgIEEgZGV0YWlsZWQgZGlzY3Vzc2lvbiBvZiBVRFAtTGl0ZSBjaGVja3N1bSBjb3ZlcmFnZSBvcHRpb25zIGlzIGluIHNlY3Rpb24gSVYuCisKKworICBJSUkpIEhFQURFUiBGSUxFUworCisgIFRoZSBzb2NrZXQgQVBJIHJlcXVpcmVzIHN1cHBvcnQgdGhyb3VnaCBoZWFkZXIgZmlsZXMgaW4gL3Vzci9pbmNsdWRlOgorCisgICAgKiAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCisgICAgICAgIHRvIGRlZmluZSBJUFBST1RPX1VEUExJVEUKKworICAgICogL3Vzci9pbmNsdWRlL25ldGluZXQvdWRwbGl0ZS5oCisgICAgICAgIGZvciBVRFAtTGl0ZSBoZWFkZXIgZmllbGRzIGFuZCBwcm90b2NvbCBjb25zdGFudHMKKworICBGb3IgdGVzdGluZyBwdXJwb3NlcywgdGhlIGZvbGxvd2luZyBjYW4gc2VydmUgYXMgYSBgbWluaScgaGVhZGVyIGZpbGU6CisKKyAgICAjZGVmaW5lIElQUFJPVE9fVURQTElURSAgICAgICAxMzYKKyAgICAjZGVmaW5lIFNPTF9VRFBMSVRFICAgICAgICAgICAxMzYKKyAgICAjZGVmaW5lIFVEUExJVEVfU0VORF9DU0NPViAgICAgMTAKKyAgICAjZGVmaW5lIFVEUExJVEVfUkVDVl9DU0NPViAgICAgMTEKKworICBSZWFkeS1tYWRlIGhlYWRlciBmaWxlcyBmb3IgdmFyaW91cyBkaXN0cm9zIGFyZSBpbiB0aGUgVURQLUxpdGUgdGFyYmFsbC4KKworCisgIElWKSBLRVJORUwgQkVIQVZJT1VSIFdJVEggUkVHQVJEIFRPIFRIRSBWQVJJT1VTIFNPQ0tFVCBPUFRJT05TCisKKyAgVG8gZW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcywgdGhlIGxvZyBsZXZlbCBuZWVkIHRvIGJlIHNldCB0byA4LCBhcyBtb3N0CisgIG1lc3NhZ2VzIHVzZSB0aGUgS0VSTl9ERUJVRyBsZXZlbCAoNykuCisKKyAgMSkgU2VuZGVyIFNvY2tldCBPcHRpb25zCisKKyAgSWYgdGhlIHNlbmRlciBzcGVjaWZpZXMgYSB2YWx1ZSBvZiAwIGFzIGNvdmVyYWdlIGxlbmd0aCwgdGhlIG1vZHVsZQorICBhc3N1bWVzIGZ1bGwgY292ZXJhZ2UsIHRyYW5zbWl0cyBhIHBhY2tldCB3aXRoIGNvdmVyYWdlIGxlbmd0aCBvZiAwCisgIGFuZCBhY2NvcmRpbmcgY2hlY2tzdW0uICBJZiB0aGUgc2VuZGVyIHNwZWNpZmllcyBhIGNvdmVyYWdlIDwgOCBhbmQKKyAgZGlmZmVyZW50IGZyb20gMCwgdGhlIGtlcm5lbCBhc3N1bWVzIDggYXMgZGVmYXVsdCB2YWx1ZS4gIEZpbmFsbHksCisgIGlmIHRoZSBzcGVjaWZpZWQgY292ZXJhZ2UgbGVuZ3RoIGV4Y2VlZHMgdGhlIHBhY2tldCBsZW5ndGgsIHRoZSBwYWNrZXQKKyAgbGVuZ3RoIGlzIHVzZWQgaW5zdGVhZCBhcyBjb3ZlcmFnZSBsZW5ndGguCisKKyAgMikgUmVjZWl2ZXIgU29ja2V0IE9wdGlvbnMKKworICBUaGUgcmVjZWl2ZXIgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBjb3ZlcmFnZSBsZW5ndGggaXQKKyAgaXMgd2lsbGluZyB0byBhY2NlcHQuICBBIHZhbHVlIG9mIDAgaGVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVjZWl2ZXIKKyAgYWx3YXlzIHdhbnRzIHRoZSB3aG9sZSBvZiB0aGUgcGFja2V0IGNvdmVyZWQuIEluIHRoaXMgY2FzZSwgYWxsCisgIHBhcnRpYWxseSBjb3ZlcmVkIHBhY2tldHMgYXJlIGRyb3BwZWQgYW5kIGFuIGVycm9yIGlzIGxvZ2dlZC4KKworICBJdCBpcyBub3QgcG9zc2libGUgdG8gc3BlY2lmeSBpbGxlZ2FsIHZhbHVlcyAoPDAgYW5kIDw4KTsgaW4gdGhlc2UKKyAgY2FzZXMgdGhlIGRlZmF1bHQgb2YgOCBpcyBhc3N1bWVkLgorCisgIEFsbCBwYWNrZXRzIGFycml2aW5nIHdpdGggYSBjb3ZlcmFnZSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZAorICB0aHJlc2hvbGQgYXJlIGRpc2NhcmRlZCwgdGhlc2UgZXZlbnRzIGFyZSBhbHNvIGxvZ2dlZC4KKworICAzKSBEaXNhYmxpbmcgdGhlIENoZWNrc3VtIENvbXB1dGF0aW9uCisKKyAgT24gYm90aCBzZW5kZXIgYW5kIHJlY2VpdmVyLCBjaGVja3N1bW1pbmcgd2lsbCBhbHdheXMgYmUgcGVyZm9ybWVkCisgIGFuZCBjYW4gbm90IGJlIGRpc2FibGVkIHVzaW5nIFNPX05PX0NIRUNLLiBUaHVzCisKKyAgICAgICAgc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX05PX0NIRUNLLCAgLi4uICk7CisKKyAgd2lsbCBhbHdheXMgd2lsbCBiZSBpZ25vcmVkLCB3aGlsZSB0aGUgdmFsdWUgb2YKKworICAgICAgICBnZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fTk9fQ0hFQ0ssICZ2YWx1ZSwgLi4uKTsKKworICBpcyBtZWFuaW5nbGVzcyAoYXMgaW4gVENQKS4gUGFja2V0cyB3aXRoIGEgemVybyBjaGVja3N1bSBmaWVsZCBhcmUKKyAgaWxsZWdhbCAoY2YuIFJGQyAzODI4LCBzZWMuIDMuMSkgd2lsbCBiZSBzaWxlbnRseSBkaXNjYXJkZWQuCisKKyAgNCkgRnJhZ21lbnRhdGlvbgorCisgIFRoZSBjaGVja3N1bSBjb21wdXRhdGlvbiByZXNwZWN0cyBib3RoIGJ1ZmZlcnNpemUgYW5kIE1UVS4gVGhlIHNpemUKKyAgb2YgVURQLUxpdGUgcGFja2V0cyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzaXplIG9mIHRoZSBzZW5kIGJ1ZmZlci4gVGhlCisgIG1pbmltdW0gc2l6ZSBvZiB0aGUgc2VuZCBidWZmZXIgaXMgMjA0OCAoZGVmaW5lZCBhcyBTT0NLX01JTl9TTkRCVUYKKyAgaW4gaW5jbHVkZS9uZXQvc29jay5oKSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgY29uZmlndXJhYmxlIGFzCisgIG5ldC5jb3JlLndtZW1fZGVmYXVsdCBvciB2aWEgc2V0dGluZyB0aGUgU09fU05EQlVGIHNvY2tldCg3KQorICBvcHRpb24uIFRoZSBtYXhpbXVtIHVwcGVyIGJvdW5kIGZvciB0aGUgc2VuZCBidWZmZXIgaXMgZGV0ZXJtaW5lZAorICBieSBuZXQuY29yZS53bWVtX21heC4KKworICBHaXZlbiBhIHBheWxvYWQgc2l6ZSBsYXJnZXIgdGhhbiB0aGUgc2VuZCBidWZmZXIgc2l6ZSwgVURQLUxpdGUgd2lsbAorICBzcGxpdCB0aGUgcGF5bG9hZCBpbnRvIHNldmVyYWwgaW5kaXZpZHVhbCBwYWNrZXRzLCBmaWxsaW5nIHVwIHRoZQorICBzZW5kIGJ1ZmZlciBzaXplIGluIGVhY2ggY2FzZS4KKworICBUaGUgcHJlY2lzZSB2YWx1ZSBhbHNvIGRlcGVuZHMgb24gdGhlIGludGVyZmFjZSBNVFUuIFRoZSBpbnRlcmZhY2UgTVRVLAorICBpbiB0dXJuLCBtYXkgdHJpZ2dlciBJUCBmcmFnbWVudGF0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBnZW5lcmF0ZWQKKyAgVURQLUxpdGUgcGFja2V0IGlzIHNwbGl0IGludG8gc2V2ZXJhbCBJUCBwYWNrZXRzLCBvZiB3aGljaCBvbmx5IHRoZQorICBmaXJzdCBvbmUgY29udGFpbnMgdGhlIEw0IGhlYWRlci4KKworICBUaGUgc2VuZCBidWZmZXIgc2l6ZSBoYXMgaW1wbGljYXRpb25zIG9uIHRoZSBjaGVja3N1bSBjb3ZlcmFnZSBsZW5ndGguCisgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworICBQYXlsb2FkOiAxNTM2IGJ5dGVzICAgICAgICAgIFNlbmQgQnVmZmVyOiAgICAgMTAyNCBieXRlcworICBNVFU6ICAgICAxNTAwIGJ5dGVzICAgICAgICAgIENvdmVyYWdlIExlbmd0aDogIDg1NiBieXRlcworCisgIFVEUC1MaXRlIHdpbGwgc2hpcCB0aGUgMTUzNiBieXRlcyBpbiB0d28gc2VwYXJhdGUgcGFja2V0czoKKworICBQYWNrZXQgMTogMTAyNCBwYXlsb2FkICsgOCBieXRlIGhlYWRlciArIDIwIGJ5dGUgSVAgaGVhZGVyID0gMTA1MiBieXRlcworICBQYWNrZXQgMjogIDUxMiBwYXlsb2FkICsgOCBieXRlIGhlYWRlciArIDIwIGJ5dGUgSVAgaGVhZGVyID0gIDU0MCBieXRlcworCisgIFRoZSBjb3ZlcmFnZSBwYWNrZXQgY292ZXJzIHRoZSBVRFAtTGl0ZSBoZWFkZXIgYW5kIDg0OCBieXRlcyBvZiB0aGUKKyAgcGF5bG9hZCBpbiB0aGUgZmlyc3QgcGFja2V0LCB0aGUgc2Vjb25kIHBhY2tldCBpcyBmdWxseSBjb3ZlcmVkLiBOb3RlCisgIHRoYXQgZm9yIHRoZSBzZWNvbmQgcGFja2V0LCB0aGUgY292ZXJhZ2UgbGVuZ3RoIGV4Y2VlZHMgdGhlIHBhY2tldAorICBsZW5ndGguIFRoZSBrZXJuZWwgYWx3YXlzIHJlLWFkanVzdHMgdGhlIGNvdmVyYWdlIGxlbmd0aCB0byB0aGUgcGFja2V0CisgIGxlbmd0aCBpbiBzdWNoIGNhc2VzLgorCisgIEFzIGFuIGV4YW1wbGUgb2Ygd2hhdCBoYXBwZW5zIHdoZW4gb25lIFVEUC1MaXRlIHBhY2tldCBpcyBzcGxpdCBpbnRvCisgIHNldmVyYWwgdGlueSBmcmFnbWVudHMsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KKworICBQYXlsb2FkOiAxMDI0IGJ5dGVzICAgICAgICAgICAgU2VuZCBidWZmZXIgc2l6ZTogMTAyNCBieXRlcworICBNVFU6ICAgICAgMzAwIGJ5dGVzICAgICAgICAgICAgQ292ZXJhZ2UgbGVuZ3RoOiAgIDU3NSBieXRlcworCisgICstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICB8OHwgICAgMjcyICAgIHwgICAgICAyODAgICAgIHwgICAgIDI4MCAgICAgIHwgICAgIDI4MCAgICAgIHwKKyAgKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAyODAgICAgICAgICAgICA1NjAgICAgICAgICAgICA4NDAgICAgICAgICAgIDEwMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgKioqKipjaGVja3N1bSBjb3ZlcmFnZSoqKioqKioqKioqKioKKworICBUaGUgVURQLUxpdGUgbW9kdWxlIGdlbmVyYXRlcyBvbmUgMTAzMiBieXRlIHBhY2tldCAoMTAyNCArIDggYnl0ZQorICBoZWFkZXIpLiBBY2NvcmRpbmcgdG8gdGhlIGludGVyZmFjZSBNVFUsIHRoZXNlIGFyZSBzcGxpdCBpbnRvIDQgSVAKKyAgcGFja2V0cyAoMjgwIGJ5dGUgSVAgcGF5bG9hZCArIDIwIGJ5dGUgSVAgaGVhZGVyKS4gVGhlIGtlcm5lbCBtb2R1bGUKKyAgc3VtcyB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSBmaXJzdCB0d28gcGFja2V0cywgcGx1cyAxNSBieXRlcyBvZgorICB0aGUgbGFzdCBwYWNrZXQgYmVmb3JlIHJlbGVhc2luZyB0aGUgZnJhZ21lbnRzIHRvIHRoZSBJUCBtb2R1bGUuCisKKyAgVG8gc2VlIHRoZSBhbmFsb2dvdXMgY2FzZSBmb3IgSVB2NiBmcmFnbWVudGF0aW9uLCBjb25zaWRlciBhIGxpbmsKKyAgTVRVIG9mIDEyODAgYnl0ZXMgYW5kIGEgd3JpdGUgYnVmZmVyIG9mIDMzNTYgYnl0ZXMuIElmIHRoZSBjaGVja3N1bQorICBjb3ZlcmFnZSBpcyBsZXNzIHRoYW4gMTIzMiBieXRlcyAoTVRVIG1pbnVzIElQdjYvZnJhZ21lbnQgaGVhZGVyCisgIGxlbmd0aHMpLCBvbmx5IHRoZSBmaXJzdCBmcmFnbWVudCBuZWVkcyB0byBiZSBjb25zaWRlcmVkLiBXaGVuIHVzaW5nCisgIGxhcmdlciBjaGVja3N1bSBjb3ZlcmFnZSBsZW5ndGhzLCBlYWNoIGVsaWdpYmxlIGZyYWdtZW50IG5lZWRzIHRvIGJlCisgIGNoZWNrc3VtbWVkLiBTdXBwb3NlIHdlIGhhdmUgYSBjaGVja3N1bSBjb3ZlcmFnZSBvZiAzMDYyLiBUaGUgYnVmZmVyCisgIG9mIDMzNTYgYnl0ZXMgd2lsbCBiZSBzcGxpdCBpbnRvIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnRzOgorCisgICAgRnJhZ21lbnQgMTogMTI4MCBieXRlcyBjYXJyeWluZyAgMTIzMiBieXRlcyBvZiBVRFAtTGl0ZSBkYXRhCisgICAgRnJhZ21lbnQgMjogMTI4MCBieXRlcyBjYXJyeWluZyAgMTIzMiBieXRlcyBvZiBVRFAtTGl0ZSBkYXRhCisgICAgRnJhZ21lbnQgMzogIDk0OCBieXRlcyBjYXJyeWluZyAgIDkwMCBieXRlcyBvZiBVRFAtTGl0ZSBkYXRhCisKKyAgVGhlIGZpcnN0IHR3byBmcmFnbWVudHMgaGF2ZSB0byBiZSBjaGVja3N1bW1lZCBpbiBmdWxsLCBvZiB0aGUgbGFzdAorICBmcmFnbWVudCBvbmx5IDU5OCAoPSAzMDYyIC0gMioxMjMyKSBieXRlcyBhcmUgY2hlY2tzdW1tZWQuCisKKyAgV2hpbGUgaXQgaXMgaW1wb3J0YW50IHRoYXQgc3VjaCBjYXNlcyBhcmUgZGVhbHQgd2l0aCBjb3JyZWN0bHksIHRoZXkKKyAgYXJlIChhbm5veWluZ2x5KSByYXJlOiBVRFAtTGl0ZSBpcyBkZXNpZ25lZCBmb3Igb3B0aW1pc2luZyBtdWx0aW1lZGlhCisgIHBlcmZvcm1hbmNlIG92ZXIgd2lyZWxlc3MgKG9yIGdlbmVyYWxseSBub2lzeSkgbGlua3MgYW5kIHRodXMgc21hbGxlcgorICBjb3ZlcmFnZSBsZW5naHRzIGFyZSBsaWtlbHkgdG8gYmUgZXhwZWN0ZWQuCisKKworICBWKSBVRFAtTElURSBSVU5USU1FIFNUQVRJU1RJQ1MgQU5EIFRIRUlSIE1FQU5JTkcKKworICBFeGNlcHRpb25hbCBhbmQgZXJyb3IgY29uZGl0aW9ucyBhcmUgbG9nZ2VkIHRvIHN5c2xvZyBhdCB0aGUgS0VSTl9ERUJVRworICBsZXZlbC4gIExpdmUgc3RhdGlzdGljcyBhYm91dCBVRFAtTGl0ZSBhcmUgYXZhaWxhYmxlIGluIC9wcm9jL25ldC9zbm1wCisgIGFuZCBjYW4gKHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgbmV0c3RhdCkgYmUgdmlld2VkIHVzaW5nCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzdGF0IC1zdnUKKworICBUaGlzIGRpc3BsYXlzIFVEUC1MaXRlIHN0YXRpc3RpY3MgdmFyaWFibGVzLCB3aG9zZSBtZWFuaW5nIGlzIGFzIGZvbGxvd3MuCisKKyAgIEluRGF0YWdyYW1zOiAgICAgVG90YWwgbnVtYmVyIG9mIHJlY2VpdmVkIGRhdGFncmFtcy4KKworICAgTm9Qb3J0czogICAgICAgICBOdW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCB0byBhbiB1bmtub3duIHBvcnQuCisgICAgICAgICAgICAgICAgICAgIFRoZXNlIGNhc2VzIGFyZSBjb3VudGVkIHNlcGFyYXRlbHkgKG5vdCBhcyBJbkVycm9ycykuCisKKyAgIEluRXJyb3JzOiAgICAgICAgTnVtYmVyIG9mIGVycm9uZW91cyBVRFAtTGl0ZSBwYWNrZXRzLiBFcnJvcnMgaW5jbHVkZToKKyAgICAgICAgICAgICAgICAgICAgICAqIGludGVybmFsIHNvY2tldCBxdWV1ZSByZWNlaXZlIGVycm9ycworICAgICAgICAgICAgICAgICAgICAgICogcGFja2V0IHRvbyBzaG9ydCAobGVzcyB0aGFuIDggYnl0ZXMgb3Igc3RhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZSBsZW5ndGggZXhjZWVkcyByZWNlaXZlZCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgKiB4ZnJtNF9wb2xpY3lfY2hlY2soKSByZXR1cm5lZCB3aXRoIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgKiBhcHBsaWNhdGlvbiBoYXMgc3BlY2lmaWVkIGxhcmdlciBtaW4uIGNvdmVyYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggdGhhbiB0aGF0IG9mIGluY29taW5nIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICogY2hlY2tzdW0gY292ZXJhZ2UgdmlvbGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAqIGJhZCBjaGVja3N1bQorCisgICBPdXREYXRhZ3JhbXM6ICAgIFRvdGFsIG51bWJlciBvZiBzZW50IGRhdGFncmFtcy4KKworICAgVGhlc2Ugc3RhdGlzdGljcyBkZXJpdmUgZnJvbSB0aGUgVURQIE1JQiAoUkZDIDIwMTMpLgorCisKKyAgVkkpIElQVEFCTEVTCisKKyAgVGhlcmUgaXMgcGFja2V0IG1hdGNoIHN1cHBvcnQgZm9yIFVEUC1MaXRlIGFzIHdlbGwgYXMgc3VwcG9ydCBmb3IgdGhlIExPRyB0YXJnZXQuCisgIElmIHlvdSBjb3B5IGFuZCBwYXN0ZSB0aGUgZm9sbG93aW5nIGxpbmUgaW50byAvZXRjL3Byb3Rjb2xzLAorCisgIHVkcGxpdGUgMTM2ICAgICBVRFAtTGl0ZSAgICAgICAgIyBVRFAtTGl0ZSBbUkZDIDM4MjhdCisKKyAgdGhlbgorICAgICAgICAgICAgICBpcHRhYmxlcyAtQSBJTlBVVCAtcCB1ZHBsaXRlIC1qIExPRworCisgIHdpbGwgcHJvZHVjZSBsb2dnaW5nIG91dHB1dCB0byBzeXNsb2cuIERyb3BwaW5nIGFuZCByZWplY3RpbmcgcGFja2V0cyBhbHNvIHdvcmtzLgorCisKKyAgVklJKSBNQUlOVEFJTkVSIEFERFJFU1MKKworICBUaGUgVURQLUxpdGUgcGF0Y2ggd2FzIGRldmVsb3BlZCBhdAorICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIEFiZXJkZWVuCisgICAgICAgICAgICAgICAgICAgIEVsZWN0cm9uaWNzIFJlc2VhcmNoIEdyb3VwCisgICAgICAgICAgICAgICAgICAgIERlcGFydG1lbnQgb2YgRW5naW5lZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgRnJhc2VyIE5vYmxlIEJ1aWxkaW5nCisgICAgICAgICAgICAgICAgICAgIEFiZXJkZWVuIEFCMjQgM1VFOyBVSworICBUaGUgY3VycmVudCBtYWludGFpbmVyIGlzIEdlcnJpdCBSZW5rZXIsIDxnZXJyaXRAZXJnLmFiZG4uYWMudWs+LiBJbml0aWFsCisgIGNvZGUgd2FzIGRldmVsb3BlZCBieSBXaWxsaWFtICBTdGFuaXNsYXVzLCA8d2lsbGlhbUBlcmcuYWJkbi5hYy51az4uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQKaW5kZXggMGNmNjU0MS4uNjUzOTc4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dApAQCAtNDEyLDcgKzQxMiw3IEBACiAKIGJldGEzLTIuMS40IEp1bCAyMDAwCQlvIFgyNSBNX0JJVCBQcm9ibGVtIGZpeC4KIAkJCQlvIEFkZGVkIHRoZSBNdWx0aS1Qb3J0IFBQUAotCQkJCSAgVXBkYXRlZCB1dGlsaXRlcyBmb3IgdGhlIE11bHRpLVBvcnQgUFBQLgorCQkJCSAgVXBkYXRlZCB1dGlsaXRpZXMgZm9yIHRoZSBNdWx0aS1Qb3J0IFBQUC4KIAogMi4xLjQJQXV0IDIwMDAKIAkJCQlvIEluIFgyNUFQSToKQEAgLTQ0NCwxMyArNDQ0LDEzIEBACiAJCQkJCQogCQkJCW8gQ3BpcGVtb24KIAkJCQkJLSBBZGRlZCBzZXQgRlQxIGNvbW1hbmRzIHRvIHRoZSBjcGlwZW1vbi4gVGh1cyBDU1UvRFNVCi0JCQkJCSAgY29uZmlndXJhaXRvbiBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIGNwaXBlbW9uLgorCQkJCQkgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBjcGlwZW1vbi4KIAkJCQkJICBBbGwgc3lzdGVtcyB0aGF0IGNhbm5vdCBydW4gY2ZnZnQxIEdVSSB1dGlsaXR5IHNob3VsZAogCQkJCQkgIHVzZSBjcGlwZW1vbiB0byBjb25maWd1cmUgdGhlIG9uIGJvYXJkIENTVS9EU1UuCiAKIAogCQkJCW8gS2V5Ym9hcmQgTGVkIE1vbml0b3IvRGVidWdnZXIKLQkJCQkJLSBBIG5ldyB1dGlsdHkgL3Vzci9zYmluL3dwa2JkbW9uIHVzZXMga2V5Ym9hcmQgbGVkcworCQkJCQktIEEgbmV3IHV0aWxpdHkgL3Vzci9zYmluL3dwa2JkbW9uIHVzZXMga2V5Ym9hcmQgbGVkcwogCQkJCQkgIHRvIGNvbnZleSBvcGVyYXRpb25hbCBzdGF0aXN0aWMgaW5mb3JtYXRpb24gb2YgdGhlIAogCQkJCQkgIFNhbmdvbWEgV0FOUElQRSBjYXJkcy4KIAkJCQkJTlVNX0xPQ0sgICAgPSBMaW5lIFN0YXRlICAoT249Y29ubmVjdGVkLCAgICBPZmY9ZGlzY29ubmVjdGVkKQpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJCQkJCS0gQXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRldmljZXMgYXJlIGR5bmFtaWNhbGx5IGxvYWRlZCAKIAkJCQkJICBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIFNhbmdvbWEgY2FyZHMgZm91bmQuCiAKLQkJCQkJICBOb3RlOiBUaGUga2VybmVsIGNvbmZpZ3VyYWl0b24gb3B0aW9uIAorCQkJCQkgIE5vdGU6IFRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb24gCiAJCQkJCQlDT05GSUdfV0FOUElQRV9DQVJEUyBoYXMgYmVlbiB0YWtlbiBvdXQuCiAJCQkJCQogCQkJCW8gRml4ZWQgdGhlIEZyYW1lIFJlbGF5IGFuZCBDaGRsYyBuZXR3b3JrIGludGVyZmFjZXMgc28gdGhleSBhcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy94ZnJtX3N5bmMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3hmcm1fc3luYy50eHQKaW5kZXggOGJlNjI2Zi4uZDdhYWM5ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3hmcm1fc3luYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3hmcm1fc3luYy50eHQKQEAgLTQ3LDEwICs0NywxMyBAQAogCiAgICBzdHJ1Y3QgeGZybV9hZXZlbnRfaWQgewogICAgICAgICAgICAgIHN0cnVjdCB4ZnJtX3VzZXJzYV9pZCAgICAgICAgICAgc2FfaWQ7CisgICAgICAgICAgICAgeGZybV9hZGRyZXNzX3QgICAgICAgICAgICAgICAgICBzYWRkcjsKICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxaWQ7CiAgICB9OwogCi14ZnJtX3VzZXJzYV9pZCBpbiB0aGlzIG1lc3NhZ2UgbGF5b3V0IGlkZW50aWZpZXMgdGhlIFNBLgorVGhlIHVuaXF1ZSBTQSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBjb21iaW5hdGlvbiBvZiB4ZnJtX3VzZXJzYV9pZCwKK3JlcWlkIGFuZCBzYWRkci4KIAogZmxhZ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgZGlmZmVyZW50IHRoaW5ncy4gVGhlIHBvc3NpYmxlCiBmbGFncyBhcmU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BucC50eHQgYi9Eb2N1bWVudGF0aW9uL3BucC50eHQKaW5kZXggOWZmOTY2Yi4uMjgwMzdhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wbnAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG5wLnR4dApAQCAtMTg0LDcgKzE4NCw3IEBACiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjaGFyYWN0ZXIgJ1gnIGNhbiBiZSB1c2VkIGFzIGEgd2lsZCBjYXJkIGluIHRoZSBmdW5jdGlvbgogcG9ydGlvbiAobGFzdCBmb3VyIGNoYXJhY3RlcnMpLgogZXg6Ci0JLyogVW5rb3duIFBuUCBtb2RlbXMgKi8KKwkvKiBVbmtub3duIFBuUCBtb2RlbXMgKi8KIAl7CSJQTlBDWFhYIiwJCVVOS05PV05fREVWCX0sCiAKIFN1cHBvcnRlZCBQblAgY2FyZCBJRHMgY2FuIG9wdGlvbmFsbHkgYmUgZGVmaW5lZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvcGNpLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcGNpLnR4dAppbmRleCAyNGVkZjI1Li5jNzUwZjlmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3BjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9wY2kudHh0CkBAIC0xNTMsNyArMTUzLDcgQEAKIAlldmVudHMsIHdoaWNoIGlzIGltcGxpY2l0IGlmIGl0IGRvZXNuJ3QgZXZlbiBzdXBwb3J0IGl0IGluIHRoZSBmaXJzdAogCXBsYWNlKS4KIAotCU5vdGUgdGhhdCB0aGUgUE1DIFJlZ2lzdGVyIGluIHRoZSBkZXZpY2UncyBQTSBDYXBhYmlsdGllcyBoYXMgYSBiaXRtYXNrCisJTm90ZSB0aGF0IHRoZSBQTUMgUmVnaXN0ZXIgaW4gdGhlIGRldmljZSdzIFBNIENhcGFiaWxpdGllcyBoYXMgYSBiaXRtYXNrCiAJb2YgdGhlIHN0YXRlcyBpdCBzdXBwb3J0cyBnZW5lcmF0aW5nIFBNRSMgZnJvbS4gRDNob3QgaXMgYml0IDMgYW5kCiAJRDNjb2xkIGlzIGJpdCA0LiBTbywgd2hpbGUgYSB2YWx1ZSBvZiA0IGFzIHRoZSBzdGF0ZSBtYXkgbm90IHNlZW0KIAlzZW1hbnRpY2FsbHkgY29ycmVjdCwgaXQgaXMuIApAQCAtMjY4LDcgKzI2OCw3IEBACiBzb21lIG5vbi1zdGFuZGFyZCB3YXkgb2YgZ2VuZXJhdGluZyBhIHdha2UgZXZlbnQgb24gc2xlZXAuKQogCiBCaXRzIDE1OjExIG9mIHRoZSBQTUMgKFBvd2VyIE1nbXQgQ2FwYWJpbGl0aWVzKSBSZWdpc3RlciBpbiBhIGRldmljZSdzCi1QTSBDYXBhYmlsdGllcyBkZXNjcmliZSB3aGF0IHBvd2VyIHN0YXRlcyB0aGUgZGV2aWNlIHN1cHBvcnRzIGdlbmVyYXRpbmcgYSAKK1BNIENhcGFiaWxpdGllcyBkZXNjcmliZSB3aGF0IHBvd2VyIHN0YXRlcyB0aGUgZGV2aWNlIHN1cHBvcnRzIGdlbmVyYXRpbmcgYSAKIHdha2UgZXZlbnQgZnJvbToKIAogKy0tLS0tLS0tLS0tLS0tLS0tLSsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dAppbmRleCAzZTVlNWQzLi4wOTMxYTMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N0YXRlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0CkBAIC02Miw3ICs2Miw3IEBACiBpbmNvbnZlbmllbmNlLCB0aGlzIG1ldGhvZCByZXF1aXJlcyBtaW5pbWFsIHdvcmsgYnkgdGhlIGtlcm5lbCwgc2luY2UKIHRoZSBmaXJtd2FyZSB3aWxsIGFsc28gaGFuZGxlIHJlc3RvcmluZyBtZW1vcnkgY29udGVudHMgb24gcmVzdW1lLiAKIAotSWYgdGhlIGtlcm5lbCBpcyByZXNwb25zaWJsZSBmb3IgcGVyc2lzdGFudGx5IHNhdmluZyBzdGF0ZSwgYSBtZWNoYW5pc20gCitJZiB0aGUga2VybmVsIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJzaXN0ZW50bHkgc2F2aW5nIHN0YXRlLCBhIG1lY2hhbmlzbQogY2FsbGVkICdzd3N1c3AnIChTd2FwIFN1c3BlbmQpIGlzIHVzZWQgdG8gd3JpdGUgbWVtb3J5IGNvbnRlbnRzIHRvCiBmcmVlIHN3YXAgc3BhY2UuIHN3c3VzcCBoYXMgc29tZSByZXN0cmljdGl2ZSByZXF1aXJlbWVudHMsIGJ1dCBzaG91bGQKIHdvcmsgaW4gbW9zdCBjYXNlcy4gU29tZSwgYWxiZWl0IG91dGRhdGVkLCBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IDllYTIyMDguLmU2MzVlNmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiBJZiB0aGUgdGhyZWFkIGlzIG5lZWRlZCBmb3Igd3JpdGluZyB0aGUgaW1hZ2UgdG8gc3RvcmFnZSwgeW91IHNob3VsZAogaW5zdGVhZCBzZXQgdGhlIFBGX05PRlJFRVpFIHByb2Nlc3MgZmxhZyB3aGVuIGNyZWF0aW5nIHRoZSB0aHJlYWQgKGFuZAotYmUgdmVyeSBjYXJlZnVsbCkuCitiZSB2ZXJ5IGNhcmVmdWwpLgogCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iLCAic2h1dGRvd24iIGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dAppbmRleCAyN2I0NTdjLi5iM2JkMzY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dApAQCAtNiw2ICs2LDggQEAKICAgICBJQk0gQ29ycC4KIChjKSAyMDA1IEJlY2t5IEJydWNlIDxiZWNreS5icnVjZSBhdCBmcmVlc2NhbGUuY29tPiwKICAgICBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgRlNMIFNPQyBhbmQgMzItYml0IGFkZGl0aW9ucworKGMpIDIwMDYgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICAgIEZsYXNoIGNoaXAgbm9kZSBkZWZpbml0aW9uCiAKICAgIE1heSAxOCwgMjAwNTogUmV2IDAuMSAtIEluaXRpYWwgZHJhZnQsIG5vIGNoYXB0ZXIgSUlJIHlldC4KIApAQCAtMzMsMTMgKzM1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBDaGFuZ2UgdmVyc2lvbiAxNiBmb3JtYXQgdG8gYWx3YXlzIGFsaWduCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBkYXRhIHRvIDQgYnl0ZXMuIFNpbmNlIHRva2VucyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgYWxpZ25lZCwgdGhhdCBtZWFucyBubyBzcGVjaWZpYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgYWxpZ25lbWVudCBiZXR3ZWVuIHByb3BlcnR5IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGFsaWdubWVudCBiZXR3ZWVuIHByb3BlcnR5IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcm9wZXJ0eSBkYXRhLiBUaGUgb2xkIHN0eWxlIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgd291bGQgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2ltcGxlIiBpbnNlcnRpb24gb2YgcHJvcGVydGllcyB1c2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3ZlICh0aGFua3MgTWlsdG9uIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWNpbmcpLiBVcGRhdGVkIGtlcm5lbCBwYXRjaCBhcyB3ZWxsCi0JCQkgLSBDb3JyZWN0IGEgZmV3IG1vcmUgYWxpZ25lbWVudCBjb25zdHJhaW50cworCQkJIC0gQ29ycmVjdCBhIGZldyBtb3JlIGFsaWdubWVudCBjb25zdHJhaW50cwogCQkJIC0gQWRkIGEgY2hhcHRlciBhYm91dCB0aGUgZGV2aWNlLXRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgdGV4dHVyYWwgcmVwcmVzZW50YXRpb24gb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmVlIHRoYXQgY2FuIGJlICJjb21waWxlZCIgYnkgZHRjLgpAQCAtODU0LDcgKzg1Niw3IEBACiAgICAgICBjb25zb2xlIGRldmljZSBpZiBhbnkuIFR5cGljYWxseSwgaWYgeW91IGhhdmUgc2VyaWFsIGRldmljZXMgb24KICAgICAgIHlvdXIgYm9hcmQsIHlvdSBtYXkgd2FudCB0byBwdXQgdGhlIGZ1bGwgcGF0aCB0byB0aGUgb25lIHNldCBhcwogICAgICAgdGhlIGRlZmF1bHQgY29uc29sZSBpbiB0aGUgZmlybXdhcmUgaGVyZSwgZm9yIHRoZSBrZXJuZWwgdG8gcGljawotICAgICAgaXQgdXAgYXMgaXQncyBvd24gZGVmYXVsdCBjb25zb2xlLiBJZiB5b3UgbG9vayBhdCB0aGUgZnVuY2l0b24KKyAgICAgIGl0IHVwIGFzIGl0cyBvd24gZGVmYXVsdCBjb25zb2xlLiBJZiB5b3UgbG9vayBhdCB0aGUgZnVuY3Rpb24KICAgICAgIHNldF9wcmVmZXJyZWRfY29uc29sZSgpIGluIGFyY2gvcHBjNjQva2VybmVsL3NldHVwLmMsIHlvdSdsbCBzZWUKICAgICAgIHRoYXQgdGhlIGtlcm5lbCB0cmllcyB0byBmaW5kIG91dCB0aGUgZGVmYXVsdCBjb25zb2xlIGFuZCBoYXMKICAgICAgIGtub3dsZWRnZSBvZiB2YXJpb3VzIHR5cGVzIGxpa2UgODI1MCBzZXJpYWwgcG9ydHMuIFlvdSBtYXkgd2FudApAQCAtMTEyNCw3ICsxMTI2LDcgQEAKIAktIGludGVycnVwdC1wYXJlbnQgOiBjb250YWlucyB0aGUgcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0CiAgICAgICAgICAgY29udHJvbGxlciB3aGljaCBoYW5kbGVzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCiAJLSBpbnRlcnJ1cHRzIDogYSBsaXN0IG9mIHR1cGxlcyByZXByZXNlbnRpbmcgdGhlIGludGVycnVwdAotICAgICAgICAgIG51bWJlciBhbmQgdGhlIGludGVycnVwdCBzZW5zZSBhbmQgbGV2ZWwgZm9yIGVhY2ggaW50ZXJ1cHQKKyAgICAgICAgICBudW1iZXIgYW5kIHRoZSBpbnRlcnJ1cHQgc2Vuc2UgYW5kIGxldmVsIGZvciBlYWNoIGludGVycnVwdAogICAgICAgICAgIGZvciB0aGlzIGRldmljZS4KIAogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IHRoZSBrZXJuZWwgdG8gYnVpbGQgdGhlIGludGVycnVwdCB0YWJsZQpAQCAtMTY5Myw2ICsxNjk1LDQzIEBACiAJCX07CiAJfTsKIAorICAgIGcpIEZsYXNoIGNoaXAgbm9kZXMKKworICAgIEZsYXNoIGNoaXBzIChNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzKSBhcmUgb2Z0ZW4gdXNlZCBmb3Igc29saWQgc3RhdGUKKyAgICBmaWxlIHN5c3RlbXMgb24gZW1iZWRkZWQgZGV2aWNlcy4KKworICAgIFJlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgICAgLSBkZXZpY2VfdHlwZSA6IGhhcyB0byBiZSAicm9tIgorICAgICAtIGNvbXBhdGlibGUgOiBTaG91bGQgc3BlY2lmeSB3aGF0IHRoaXMgUk9NIGRldmljZSBpcyBjb21wYXRpYmxlIHdpdGgKKyAgICAgICAoaS5lLiAib25lbmFuZCIpLiBDdXJyZW50bHksIHRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gYmUgImRpcmVjdC1tYXBwZWQiCisgICAgICAgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBNVEQgcGh5c21hcCBtYXBwaW5nIGRyaXZlcikuCisgICAgIC0gcmVncyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgKG9yIG1lbW9yeSBtYXBwaW5nKSBmb3IKKyAgICAgICB0aGUgZGV2aWNlLgorCisgICAgUmVjb21tZW5kZWQgcHJvcGVydGllcyA6CisKKyAgICAgLSBiYW5rLXdpZHRoIDogV2lkdGggb2YgdGhlIGZsYXNoIGRhdGEgYnVzIGluIGJ5dGVzLiBSZXF1aXJlZAorICAgICAgIGZvciB0aGUgTk9SIGZsYXNoZXMgKGNvbXBhdGlibGUgPT0gImRpcmVjdC1tYXBwZWQiIGFuZCBvdGhlcnMpIE9OTFkuCisgICAgIC0gcGFydGl0aW9ucyA6IFNldmVyYWwgcGFpcnMgb2YgMzItYml0IHZhbHVlcyB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMKKyAgICAgICBwYXJ0aXRpb24ncyBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBhbmQgdGhlIHNlY29uZCBvbmUgaXMKKyAgICAgICBwYXJ0aXRpb24gc2l6ZSBpbiBieXRlcyB3aXRoIExTQiB1c2VkIHRvIHNpZ25pZnkgYSByZWFkIG9ubHkKKyAgICAgICBwYXJ0aXRpdG9uIChzbywgdGhlIHBhcml0aW9uIHNpemUgc2hvdWxkIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlcikuCisgICAgIC0gcGFydGl0aW9uLW5hbWVzIDogVGhlIGxpc3Qgb2YgY29uY2F0ZW5hdGVkIHplcm8gdGVybWluYXRlZCBzdHJpbmdzCisgICAgICAgcmVwcmVzZW50aW5nIHRoZSBwYXJ0aXRpb24gbmFtZXMuCisKKyAgIEV4YW1wbGU6CisKKyAJZmxhc2hAZmYwMDAwMDAgeworIAkJZGV2aWNlX3R5cGUgPSAicm9tIjsKKyAJCWNvbXBhdGlibGUgPSAiZGlyZWN0LW1hcHBlZCI7CisgCQlyZWdzID0gPGZmMDAwMDAwIDAxMDAwMDAwPjsKKyAJCWJhbmstd2lkdGggPSA8ND47CisgCQlwYXJ0aXRpb25zID0gPDAwMDAwMDAwIDAwZjgwMDAwCisgCQkJICAgICAgMDBmODAwMDAgMDAwODAwMDE+OworIAkJcGFydGl0aW9uLW5hbWVzID0gImZzXDBmaXJtd2FyZSI7CisgCX07CisKICAgIE1vcmUgZGV2aWNlcyB3aWxsIGJlIGRlZmluZWQgYXMgdGhpcyBzcGVjIG1hdHVyZXMuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL21wYzUyeHgtZGV2aWNlLXRyZWUtYmluZGluZ3MudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL21wYzUyeHgtZGV2aWNlLXRyZWUtYmluZGluZ3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzdkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvbXBjNTJ4eC1kZXZpY2UtdHJlZS1iaW5kaW5ncy50eHQKQEAgLTAsMCArMSwxODkgQEAKK01QQzUyeHggRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGMpIDIwMDYgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkCitHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseSBhdCBzZWNyZXRsYWIuY2E+CisKK0kgLSBJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PT09PT0KK0JvYXJkcyBzdXBwb3J0ZWQgYnkgdGhlIGFyY2gvcG93ZXJwYyBhcmNoaXRlY3R1cmUgcmVxdWlyZSBkZXZpY2UgdHJlZSBiZQorcGFzc2VkIGJ5IHRoZSBib290IGxvYWRlciB0byB0aGUga2VybmVsIGF0IGJvb3QgdGltZS4gIFRoZSBkZXZpY2UgdHJlZQorZGVzY3JpYmVzIHdoYXQgZGV2aWNlcyBhcmUgcHJlc2VudCBvbiB0aGUgYm9hcmQgYW5kIGhvdyB0aGV5IGFyZQorY29ubmVjdGVkLiAgVGhlIGRldmljZSB0cmVlIGNhbiBlaXRoZXIgYmUgcGFzc2VkIGFzIGEgYmluYXJ5IGJsb2IgKGFzCitkZXNjcmliZWQgaW4gRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQpLCBvciBwYXNzZWQKK2J5IE9wZW4gRmlybWFyZSAoSUVFRSAxMjc1KSBjb21wYXRpYmxlIGZpcm13YXJlIHVzaW5nIGFuIE9GIGNvbXBhdGlibGUKK2NsaWVudCBpbnRlcmZhY2UgQVBJLgorCitUaGlzIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBkZXZpY2UtdHJlZSBmb3IgbXBjNTJ4eAorYmFzZWQgYm9hcmRzLiAgVGhlc2UgcmVxdWlyZW1lbnRzIGFyZSBhYm92ZSBhbmQgYmV5b25kIHRoZSBkZXRhaWxzCitzcGVjaWZpZWQgaW4gZWl0aGVyIHRoZSBPcGVuRmlybXdhcmUgc3BlYyBvciBib290aW5nLXdpdGhvdXQtb2YudHh0CisKK0FsbCBuZXcgbXBjNTJ4eC1iYXNlZCBib2FyZHMgYXJlIGV4cGVjdGVkIHRvIG1hdGNoIHRoaXMgZG9jdW1lbnQuICBJbgorY2FzZXMgd2hlcmUgdGhpcyBkb2N1bWVudCBpcyBub3Qgc3VmZmljaWVudCB0byBzdXBwb3J0IGEgbmV3IGJvYXJkIHBvcnQsCit0aGlzIGRvY3VtZW50IHNob3VsZCBiZSB1cGRhdGVkIGFzIHBhcnQgb2YgYWRkaW5nIHRoZSBuZXcgYm9hcmQgc3VwcG9ydC4KKworSUkgLSBQaGlsb3NvcGh5Cis9PT09PT09PT09PT09PT0KK1RoZSBjb3JlIG9mIHRoaXMgZG9jdW1lbnQgaXMgbmFtaW5nIGNvbnZlbnRpb24uICBUaGUgd2hvbGUgcG9pbnQgb2YKK2RlZmluaW5nIHRoaXMgY29udmVudGlvbiBpcyB0byByZWR1Y2Ugb3IgZWxpbWluYXRlIHRoZSBudW1iZXIgb2YKK3NwZWNpYWwgY2FzZXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBhIDUyeHggYm9hcmQuICBJZiBhbGwgNTJ4eCBib2FyZHMKK2ZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uLCB0aGVuIGdlbmVyaWMgNTJ4eCBzdXBwb3J0IGNvZGUgd2lsbCB3b3JrCityYXRoZXIgdGhhbiBjb2Rpbmcgc3BlY2lhbCBjYXNlcyBmb3IgZWFjaCBuZXcgYm9hcmQuCisKK1RoaXMgc2VjdGlvbiB0cmllcyB0byBjYXB0dXJlIHRoZSB0aG91Z2h0IHByb2Nlc3MgYmVoaW5kIHdoeSB0aGUgbmFtaW5nCitjb252ZW50aW9uIGlzIHdoYXQgaXQgaXMuCisKKzEuIE5vZGUgbmFtZXMKKy0tLS0tLS0tLS0tLS0KK1RoZXJlIGlzIHN0cm9uZyBjb252ZW50aW9uL3JlcXVpcmVtZW50cyBhbHJlYWR5IGVzdGFibGlzaGVkIGZvciBjaGlsZHJlbgorb2YgdGhlIHJvb3Qgbm9kZS4gICdjcHVzJyBkZXNjcmliZXMgdGhlIHByb2Nlc3NvciBjb3JlcywgJ21lbW9yeScKK2Rlc2NyaWJlcyBtZW1vcnksIGFuZCAnY2hvc2VuJyBwcm92aWRlcyBib290IGNvbmZpZ3VyYXRpb24uICBPdGhlciBub2RlcworYXJlIGFkZGVkIHRvIGRlc2NyaWJlIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlIHByb2Nlc3NvciBsb2NhbCBidXMuCitGb2xsb3dpbmcgY29udmVudGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIHdpdGggb3RoZXIgc3lzdGVtLW9uLWNoaXAKK3Byb2Nlc3NvcnMsIE1QQzUyeHggYm9hcmRzIG11c3QgaGF2ZSBhbiAnc29jNTIwMCcgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZQorcm9vdCBub2RlLgorCitUaGUgc29jNTIwMCBub2RlIGhvbGRzIGNoaWxkIG5vZGVzIGZvciBhbGwgb24gY2hpcCBkZXZpY2VzLiAgQ2hpbGQgbm9kZXMKK2FyZSB0eXBpY2FsbHkgbmFtZWQgYWZ0ZXIgdGhlIGNvbmZpZ3VyZWQgZnVuY3Rpb24uICBpZS4gdGhlIEZFQyBub2RlIGlzCituYW1lZCAnZXRoZXJuZXQnLCBhbmQgYSBQU0MgaW4gdWFydCBtb2RlIGlzIG5hbWVkICdzZXJpYWwnLgorCisyLiBkZXZpY2VfdHlwZSBwcm9wZXJ0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NpbWlsYXIgdG8gdGhlIG5vZGUgbmFtZSBjb252ZW50aW9uIGFib3ZlOyB0aGUgZGV2aWNlX3R5cGUgcmVmbGVjdHMgdGhlCitjb25maWd1cmVkIGZ1bmN0aW9uIG9mIGEgZGV2aWNlLiAgaWUuICdzZXJpYWwnIGZvciBhIHVhcnQgYW5kICdzcGknIGZvcgorYW4gc3BpIGNvbnRyb2xsZXIuICBIb3dldmVyLCB3aGlsZSBub2RlIG5hbWVzICpzaG91bGQqIHJlZmxlY3QgdGhlCitjb25maWd1cmVkIGZ1bmN0aW9uLCBkZXZpY2VfdHlwZSAqbXVzdCogbWF0Y2ggdGhlIGNvbmZpZ3VyZWQgZnVuY3Rpb24KK2V4YWN0bHkuCisKKzMuIGNvbXBhdGlibGUgcHJvcGVydHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NpbmNlIGRldmljZV90eXBlIGlzbid0IGVub3VnaCB0byBtYXRjaCBkZXZpY2VzIHRvIGRyaXZlcnMsIHRoZXJlIGFsc28KK25lZWRzIHRvIGJlIGEgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBjb21wYXRpYmxlIHByb3BlcnR5LiAgQ29tcGF0aWJsZQoraXMgYW4gbGlzdCBvZiBkZXZpY2UgZGVzY3JpcHRpb25zIHNvcnRlZCBmcm9tIHNwZWNpZmljIHRvIGdlbmVyaWMuICBGb3IKK3RoZSBtcGM1Mnh4LCB0aGUgcmVxdWlyZWQgZm9ybWF0IGZvciBlYWNoIGNvbXBhdGlibGUgdmFsdWUgaXMKKzxjaGlwPi08ZGV2aWNlPlstPG1vZGU+XS4gIEF0IHRoZSBtaW5pbXVtLCB0aGUgbGlzdCBzaGFsbCBjb250YWluIHR3bworaXRlbXM7IHRoZSBmaXJzdCBzcGVjaWZ5aW5nIHRoZSBleGFjdCBjaGlwLCBhbmQgdGhlIHNlY29uZCBzcGVjaWZ5aW5nCittcGM1Mnh4IGZvciB0aGUgY2hpcC4KKworaWUuIGV0aGVybmV0IG9uIG1wYzUyMDBiOiBjb21wYXRpYmxlID0gIm1wYzUyMDBiLWV0aGVybmV0XDBtcGM1Mnh4LWV0aGVybmV0IgorCitUaGUgaWRlYSBoZXJlIGlzIHRoYXQgbW9zdCBkcml2ZXJzIHdpbGwgbWF0Y2ggdG8gdGhlIG1vc3QgZ2VuZXJpYyBmaWVsZAoraW4gdGhlIGNvbXBhdGlibGUgbGlzdCAobXBjNTJ4eC0qKSwgYnV0IGNhbiBhbHNvIHRlc3QgdGhlIG1vcmUgc3BlY2lmaWMKK2ZpZWxkIGZvciBlbmFibGluZyBidWcgZml4ZXMgb3IgZXh0cmEgZmVhdHVyZXMuCisKK01vZGFsIGRldmljZXMsIGxpa2UgUFNDcywgYWxzbyBhcHBlbmQgdGhlIGNvbmZpZ3VyZWQgZnVuY3Rpb24gdG8gdGhlCitlbmQgb2YgdGhlIGNvbXBhdGlibGUgZmllbGQuICBpZS4gQSBQU0MgaW4gaTJzIG1vZGUgd291bGQgc3BlY2lmeQorIm1wYzUyeHgtcHNjLWkycyIsIG5vdCAibXBjNTJ4eC1pMnMiLiAgVGhpcyBjb252ZW50aW9uIGlzIGNob3NlbiB0bworYXZvaWQgbmFtaW5nIGNvbmZsaWN0cyB3aXRoIG5vbi1wc2MgZGV2aWNlcyBwcm92aWRpbmcgdGhlIHNhbWUKK2Z1bmN0aW9uLiAgRm9yIGV4YW1wbGUsICJtcGM1Mnh4LXNwaSIgYW5kICJtcGM1Mnh4LXBzYy1zcGkiIGRlc2NyaWJlCit0aGUgbXBjNTIwMCBzaW1wbGUgc3BpIGRldmljZSBhbmQgYSBQU0Mgc3BpIG1vZGUgcmVzcGVjdGl2ZWx5LgorCitJZiB0aGUgc29jIGRldmljZSBpcyBtb3JlIGdlbmVyaWMgYW5kIHByZXNlbnQgb24gb3RoZXIgU09DcywgdGhlCitjb21wYXRpYmxlIHByb3BlcnR5IGNhbiBzcGVjaWZ5IHRoZSBtb3JlIGdlbmVyaWMgZGV2aWNlIHR5cGUgYWxzby4KKworaWUuIG1zY2FuOiBjb21wYXRpYmxlID0gIm1wYzUyMDAtbXNjYW5cMG1wYzUyeHgtbXNjYW5cMGZzbCxtc2NhbiI7CisKK0F0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIGV4YWN0IGNoaXAgbWF5IGJlIGVpdGhlciAnbXBjNTIwMCcgb3IKKydtcGM1MjAwYicuCisKK0RldmljZSBkcml2ZXJzIHNob3VsZCBhbHdheXMgdHJ5IHRvIG1hdGNoIGFzIGdlbmVyaWNhbGx5IGFzIHBvc3NpYmxlLgorCitJSUkgLSBTdHJ1Y3R1cmUKKz09PT09PT09PT09PT09PQorVGhlIGRldmljZSB0cmVlIGZvciBhbiBtcGM1Mnh4IGJvYXJkIGZvbGxvd3MgdGhlIHN0cnVjdHVyZSBkZWZpbmVkIGluCitib290aW5nLXdpdGhvdXQtb2YudHh0IHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG5vdGVzOgorCiswKSB0aGUgcm9vdCBub2RlCistLS0tLS0tLS0tLS0tLS0tCitUeXBpY2FsIHJvb3QgZGVzY3JpcHRpb24gbm9kZTsgc2VlIGJvb3Rpbmctd2l0aG91dC1vZgorCisxKSBUaGUgY3B1cyBub2RlCistLS0tLS0tLS0tLS0tLS0tCitUaGUgY3B1cyBub2RlIGZvbGxvd3MgdGhlIGJhc2ljIGxheW91dCBkZXNjcmliZWQgaW4gYm9vdGluZy13aXRob3V0LW9mLgorVGhlIGJ1cy1mcmVxdWVuY3kgcHJvcGVydHkgaG9sZHMgdGhlIFhMQiBidXMgZnJlcXVlbmN5CitUaGUgY2xvY2stZnJlcXVlbmN5IHByb3BlcnR5IGhvbGRzIHRoZSBjb3JlIGZyZXF1ZW5jeQorCisyKSBUaGUgbWVtb3J5IG5vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLQorVHlwaWNhbCBtZW1vcnkgZGVzY3JpcHRpb24gbm9kZTsgc2VlIGJvb3Rpbmctd2l0aG91dC1vZi4KKworMykgVGhlIHNvYzUyMDAgbm9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBub2RlIGRlc2NyaWJlcyB0aGUgb24gY2hpcCBTT0MgcGVyaXBoZXJhbHMuICBFdmVyeSBtcGM1Mnh4IGJhc2VkCitib2FyZCB3aWxsIGhhdmUgdGhpcyBub2RlLCBhbmQgYXMgc3VjaCB0aGVyZSBpcyBhIGNvbW1vbiBuYW1pbmcKK2NvbnZlbnRpb24gZm9yIFNPQyBkZXZpY2VzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorbmFtZQkJCXR5cGUJCWRlc2NyaXB0aW9uCistLS0tCQkJLS0tLQkJLS0tLS0tLS0tLS0KK2RldmljZV90eXBlCQlzdHJpbmcJCW11c3QgYmUgInNvYyIKK3JhbmdlcwkJCWludAkJc2hvdWxkIGJlIDwwIGJhc2VhZGRyIGJhc2VhZGRyKzEwMDAwPgorcmVnCQkJaW50CQltdXN0IGJlIDxiYXNlYWRkciAxMDAwMD4KKworUmVjb21tZW5kZWQgcHJvcGVydGllczoKK25hbWUJCQl0eXBlCQlkZXNjcmlwdGlvbgorLS0tLQkJCS0tLS0JCS0tLS0tLS0tLS0tCitjb21wYXRpYmxlCQlzdHJpbmcJCXNob3VsZCBiZSAiPGNoaXA+LXNvY1wwbXBjNTJ4eC1zb2MiCisJCQkJCWllLiAibXBjNTIwMGItc29jXDBtcGM1Mnh4LXNvYyIKKyNpbnRlcnJ1cHQtY2VsbHMJaW50CQltdXN0IGJlIDwzPi4gIElmIGl0IGlzIG5vdCBkZWZpbmVkCisJCQkJCWhlcmUgdGhlbiBpdCBtdXN0IGJlIGRlZmluZWQgaW4gZXZlcnkKKwkJCQkJc29jIGRldmljZSBub2RlLgorYnVzLWZyZXF1ZW5jeQkJaW50CQlJUEIgYnVzIGZyZXF1ZW5jeSBpbiBIWi4gIENsb2NrIHJhdGUKKwkJCQkJdXNlZCBieSBtb3N0IG9mIHRoZSBzb2MgZGV2aWNlcy4KKwkJCQkJRGVmaW5pbmcgaXQgaGVyZSBhdm9pZHMgbmVlZGluZyBpdAorCQkJCQlhZGRlZCB0byBldmVyeSBkZXZpY2Ugbm9kZS4KKworNCkgc29jNTIwMCBjaGlsZCBub2RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQW55IG9uIGNoaXAgU09DIGRldmljZXMgYXZhaWxhYmxlIHRvIExpbnV4IG11c3QgYXBwZWFyIGFzIHNvYzUyMDAgY2hpbGQgbm9kZXMuCisKK05vdGU6IGluIHRoZSB0YWJsZXMgYmVsb3csICcqJyBtYXRjaGVzIGFsbCA8Y2hpcD4gdmFsdWVzLiAgaWUuCisqLXBpYyB3b3VsZCB0cmFuc2xhdGUgdG8gIm1wYzUyMDAtcGljXDBtcGM1Mnh4LXBpYyIKKworUmVxdWlyZWQgc29jNTIwMCBjaGlsZCBub2RlczoKK25hbWUJCWRldmljZV90eXBlCQljb21wYXRpYmxlCURlc2NyaXB0aW9uCistLS0tCQktLS0tLS0tLS0tLQkJLS0tLS0tLS0tLQktLS0tLS0tLS0tLQorY2RtQDxhZGRyPgljZG0JCQkqLWNtZAkJQ2xvY2sgRGlzdHJpYnV0aW9uCitwaWNAPGFkZHI+CWludGVycnVwdC1jb250cm9sbGVyCSotcGljCQluZWVkIGFuIGludGVycnVwdAorCQkJCQkJCWNvbnRyb2xsZXIgdG8gYm9vdAorYmVzdGNvbW1APGFkZHI+CWRtYS1jb250cm9sbGVyCQkqLWJlc3Rjb21tCTUyeHggcGljIGFsc28gcmVxdWlyZXMKKwkJCQkJCQl0aGUgYmVzdGNvbW0gZGV2aWNlCisKK1JlY29tbWVuZGVkIHNvYzUyMDAgY2hpbGQgbm9kZXM7IHBvcHVsYXRlIGFzIG5lZWRlZCBmb3IgeW91ciBib2FyZAorbmFtZQkJZGV2aWNlX3R5cGUJY29tcGF0aWJsZQlEZXNjcmlwdGlvbgorLS0tLQkJLS0tLS0tLS0tLS0JLS0tLS0tLS0tLQktLS0tLS0tLS0tLQorZ3B0QDxhZGRyPglncHQJCSotZ3B0CQlHZW5lcmFsIHB1cnBvc2UgdGltZXJzCitydGNAPGFkZHI+CXJ0YwkJKi1ydGMJCVJlYWwgdGltZSBjbG9jaworbXNjYW5APGFkZHI+CW1zY2FuCQkqLW1zY2FuCQlDQU4gYnVzIGNvbnRyb2xsZXIKK3BjaUA8YWRkcj4JcGNpCQkqLXBjaQkJUENJIGJyaWRnZQorc2VyaWFsQDxhZGRyPglzZXJpYWwJCSotcHNjLXVhcnQJUFNDIGluIHNlcmlhbCBtb2RlCitpMnNAPGFkZHI+CWkycwkJKi1wc2MtaTJzCVBTQyBpbiBpMnMgbW9kZQorYWM5N0A8YWRkcj4JYWM5NwkJKi1wc2MtYWM5NwlQU0MgaW4gYWM5NyBtb2RlCitzcGlAPGFkZHI+CXNwaQkJKi1wc2Mtc3BpCVBTQyBpbiBzcGkgbW9kZQoraXJkYUA8YWRkcj4JaXJkYQkJKi1wc2MtaXJkYQlQU0MgaW4gSXJEQSBtb2RlCitzcGlAPGFkZHI+CXNwaQkJKi1zcGkJCU1QQzUyeHggc3BpIGRldmljZQorZXRoZXJuZXRAPGFkZHI+CW5ldHdvcmsJCSotZmVjCQlNUEM1Mnh4IGV0aGVybmV0IGRldmljZQorYXRhQDxhZGRyPglhdGEJCSotYXRhCQlJREUgQVRBIGludGVyZmFjZQoraTJjQDxhZGRyPglpMmMJCSotaTJjCQlJMkMgY29udHJvbGxlcgordXNiQDxhZGRyPgl1c2Itb2hjaS1iZQkqLW9oY2ksb2hjaS1iZQlVU0IgY29udHJvbGxlcgoreGxiQDxhZGRyPgl4bGIJCSoteGxiCQlYTEIgYXJicml0cmF0b3IKKworSVYgLSBFeHRyYSBOb3RlcworPT09PT09PT09PT09PT09PQorCisxLiBJbnRlcnJ1cHQgbWFwcGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBtcGM1Mnh4IHBpYyBkcml2ZXIgc3BsaXRzIGhhcmR3YXJlIElSUSBudW1iZXJzIGludG8gdHdvIGxldmVscy4gIFRoZQorc3BsaXQgcmVmbGVjdHMgdGhlIGxheW91dCBvZiB0aGUgUElDIGhhcmR3YXJlIGl0c2VsZiwgd2hpY2ggZ3JvdXBzCitpbnRlcnJ1cHRzIGludG8gb25lIG9mIHRocmVlIGdyb3VwczsgQ1JJVCwgTUFJTiBvciBQRVJQLiAgQWxzbywgdGhlCitCZXN0Y29tbSBkbWEgZW5naW5lIGhhcyBpdCdzIG93biBzZXQgb2YgaW50ZXJydXB0IHNvdXJjZXMgd2hpY2ggYXJlCitjYXNjYWRlZCBvZmYgb2YgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgMCwgd2hpY2ggdGhlIGRyaXZlciBpbnRlcnByZXRzIGFzIGEKK2ZvdXJ0aCBncm91cCwgU0RNQS4KKworVGhlIGludGVycnVwdHMgcHJvcGVydHkgZm9yIGRldmljZSBub2RlcyB1c2luZyB0aGUgbXBjNTJ4eCBwaWMgY29uc2lzdHMKK29mIHRocmVlIGNlbGxzOyA8TDEgTDIgbGV2ZWw+CisKKyAgICBMMSA6PSBbQ1JJVD0wLCBNQUlOPTEsIFBFUlA9MiwgU0RNQT0zXQorICAgIEwyIDo9IGludGVycnVwdCBudW1iZXI7IGRpcmVjdGx5IG1hcHBlZCBmcm9tIHRoZSB2YWx1ZSBpbiB0aGUKKyAgICAgICAgICAiSUNUTCBQZXJTdGF0LCBNYWluU3RhdCwgQ3JpdFN0YXQgRW5jb2RlZCBSZWdpc3RlciIKKyAgICBsZXZlbCA6PSBbTEVWRUxfSElHSD0wLCBFREdFX1JJU0lORz0xLCBFREdFX0ZBTExJTkc9MiwgTEVWRUxfTE9XPTNdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JvYnVzdC1mdXRleC1BQkkudHh0IGIvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXgtQUJJLnR4dAppbmRleCA4NTI5YTE3Li41MzVmNjlmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3JvYnVzdC1mdXRleC1BQkkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcm9idXN0LWZ1dGV4LUFCSS50eHQKQEAgLTE3MCw3ICsxNzAsNyBAQAogIDEpIHRoZSAnaGVhZCcgcG9pbnRlciBvciBhbiBzdWJzZXF1ZW50IGxpbmtlZCBsaXN0IHBvaW50ZXIKICAgICBpcyBub3QgYSB2YWxpZCBhZGRyZXNzIG9mIGEgdXNlciBzcGFjZSB3b3JkCiAgMikgdGhlIGNhbGN1bGF0ZWQgbG9jYXRpb24gb2YgdGhlICdsb2NrIHdvcmQnIChhZGRyZXNzIHBsdXMKLSAgICAnb2Zmc2V0JykgaXMgbm90IHRoZSB2YWx1ZCBhZGRyZXNzIG9mIGEgMzIgYml0IHVzZXIgc3BhY2UKKyAgICAnb2Zmc2V0JykgaXMgbm90IHRoZSB2YWxpZCBhZGRyZXNzIG9mIGEgMzIgYml0IHVzZXIgc3BhY2UKICAgICB3b3JkCiAgMykgaWYgdGhlIGxpc3QgY29udGFpbnMgbW9yZSB0aGFuIDEgbWlsbGlvbiAoc3ViamVjdCB0bwogICAgIGZ1dHVyZSBrZXJuZWwgY29uZmlndXJhdGlvbiBjaGFuZ2VzKSBlbGVtZW50cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcm9idXN0LWZ1dGV4ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXhlcy50eHQKaW5kZXggNzZlODA2NC4uMGE5NDQ2YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXhlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXhlcy50eHQKQEAgLTE4MSw3ICsxODEsNyBAQAogU28gdGhlcmUgaXMgdmlydHVhbGx5IHplcm8gb3ZlcmhlYWQgZm9yIHRhc2tzIG5vdCB1c2luZyByb2J1c3QgZnV0ZXhlcywKIGFuZCBldmVuIGZvciByb2J1c3QgZnV0ZXggdXNlcnMsIHRoZXJlIGlzIG9ubHkgb25lIGV4dHJhIHN5c2NhbGwgcGVyCiB0aHJlYWQgbGlmZXRpbWUsIGFuZCB0aGUgY2xlYW51cCBvcGVyYXRpb24sIGlmIGl0IGhhcHBlbnMsIGlzIGZhc3QgYW5kCi1zdHJhaWdodGZvcndhcmQuIFRoZSBrZXJuZWwgZG9lc250IGhhdmUgYW55IGludGVybmFsIGRpc3RpbmN0aW9uIGJldHdlZW4KK3N0cmFpZ2h0Zm9yd2FyZC4gVGhlIGtlcm5lbCBkb2Vzbid0IGhhdmUgYW55IGludGVybmFsIGRpc3RpbmN0aW9uIGJldHdlZW4KIHJvYnVzdCBhbmQgbm9ybWFsIGZ1dGV4ZXMuCiAKIElmIGEgZnV0ZXggaXMgZm91bmQgdG8gYmUgaGVsZCBhdCBleGl0IHRpbWUsIHRoZSBrZXJuZWwgc2V0cyB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcnRjLnR4dCBiL0RvY3VtZW50YXRpb24vcnRjLnR4dAppbmRleCAyYTU4Zjk4Li43Y2YxZWM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CkBAIC0xLDEyICsxLDQ5IEBACiAKLQlSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIGZvciBMaW51eAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUmVhbCBUaW1lIENsb2NrIChSVEMpIERyaXZlcnMgZm9yIExpbnV4CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1doZW4gTGludXggZGV2ZWxvcGVycyB0YWxrIGFib3V0IGEgIlJlYWwgVGltZSBDbG9jayIsIHRoZXkgdXN1YWxseSBtZWFuCitzb21ldGhpbmcgdGhhdCB0cmFja3Mgd2FsbCBjbG9jayB0aW1lIGFuZCBpcyBiYXR0ZXJ5IGJhY2tlZCBzbyB0aGF0IGl0Cit3b3JrcyBldmVuIHdpdGggc3lzdGVtIHBvd2VyIG9mZi4gIFN1Y2ggY2xvY2tzIHdpbGwgbm9ybWFsbHkgbm90IHRyYWNrCit0aGUgbG9jYWwgdGltZSB6b25lIG9yIGRheWxpZ2h0IHNhdmluZ3MgdGltZSAtLSB1bmxlc3MgdGhleSBkdWFsIGJvb3QKK3dpdGggTVMtV2luZG93cyAtLSBidXQgd2lsbCBpbnN0ZWFkIGJlIHNldCB0byBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZQorKFVUQywgZm9ybWVybHkgIkdyZWVud2ljaCBNZWFuIFRpbWUiKS4KKworVGhlIG5ld2VzdCBub24tUEMgaGFyZHdhcmUgdGVuZHMgdG8ganVzdCBjb3VudCBzZWNvbmRzLCBsaWtlIHRoZSB0aW1lKDIpCitzeXN0ZW0gY2FsbCByZXBvcnRzLCBidXQgUlRDcyBhbHNvIHZlcnkgY29tbW9ubHkgcmVwcmVzZW50IHRpbWUgdXNpbmcKK3RoZSBHcmVnb3JpYW4gY2FsZW5kYXIgYW5kIDI0IGhvdXIgdGltZSwgYXMgcmVwb3J0ZWQgYnkgZ210aW1lKDMpLgorCitMaW51eCBoYXMgdHdvIGxhcmdlbHktY29tcGF0aWJsZSB1c2Vyc3BhY2UgUlRDIEFQSSBmYW1pbGllcyB5b3UgbWF5CituZWVkIHRvIGtub3cgYWJvdXQ6CisKKyAgICAqCS9kZXYvcnRjIC4uLiBpcyB0aGUgUlRDIHByb3ZpZGVkIGJ5IFBDIGNvbXBhdGlibGUgc3lzdGVtcywKKwlzbyBpdCdzIG5vdCB2ZXJ5IHBvcnRhYmxlIHRvIG5vbi14ODYgc3lzdGVtcy4KKworICAgICoJL2Rldi9ydGMwLCAvZGV2L3J0YzEgLi4uIGFyZSBwYXJ0IG9mIGEgZnJhbWV3b3JrIHRoYXQncworCXN1cHBvcnRlZCBieSBhIHdpZGUgdmFyaWV0eSBvZiBSVEMgY2hpcHMgb24gYWxsIHN5c3RlbXMuCisKK1Byb2dyYW1tZXJzIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBQQy9BVCBmdW5jdGlvbmFsaXR5IGlzIG5vdAorYWx3YXlzIGF2YWlsYWJsZSwgYW5kIHNvbWUgc3lzdGVtcyBjYW4gZG8gbXVjaCBtb3JlLiAgVGhhdCBpcywgdGhlCitSVENzIHVzZSB0aGUgc2FtZSBBUEkgdG8gbWFrZSByZXF1ZXN0cyBpbiBib3RoIFJUQyBmcmFtZXdvcmtzICh1c2luZworZGlmZmVyZW50IGZpbGVuYW1lcyBvZiBjb3Vyc2UpLCBidXQgdGhlIGhhcmR3YXJlIG1heSBub3Qgb2ZmZXIgdGhlCitzYW1lIGZ1bmN0aW9uYWxpdHkuICBGb3IgZXhhbXBsZSwgbm90IGV2ZXJ5IFJUQyBpcyBob29rZWQgdXAgdG8gYW4KK0lSUSwgc28gdGhleSBjYW4ndCBhbGwgaXNzdWUgYWxhcm1zOyBhbmQgd2hlcmUgc3RhbmRhcmQgUEMgUlRDcyBjYW4KK29ubHkgaXNzdWUgYW4gYWxhcm0gdXAgdG8gMjQgaG91cnMgaW4gdGhlIGZ1dHVyZSwgb3RoZXIgaGFyZHdhcmUgbWF5CitiZSBhYmxlIHRvIHNjaGVkdWxlIG9uZSBhbnkgdGltZSBpbiB0aGUgdXBjb21pbmcgY2VudHVyeS4KKworCisJT2xkIFBDL0FULUNvbXBhdGlibGUgZHJpdmVyOiAgL2Rldi9ydGMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBbGwgUENzIChldmVuIEFscGhhIG1hY2hpbmVzKSBoYXZlIGEgUmVhbCBUaW1lIENsb2NrIGJ1aWx0IGludG8gdGhlbS4KIFVzdWFsbHkgdGhleSBhcmUgYnVpbHQgaW50byB0aGUgY2hpcHNldCBvZiB0aGUgY29tcHV0ZXIsIGJ1dCBzb21lIG1heQogYWN0dWFsbHkgaGF2ZSBhIE1vdG9yb2xhIE1DMTQ2ODE4IChvciBjbG9uZSkgb24gdGhlIGJvYXJkLiBUaGlzIGlzIHRoZQogY2xvY2sgdGhhdCBrZWVwcyB0aGUgZGF0ZSBhbmQgdGltZSB3aGlsZSB5b3VyIGNvbXB1dGVyIGlzIHR1cm5lZCBvZmYuCiAKK0FDUEkgaGFzIHN0YW5kYXJkaXplZCB0aGF0IE1DMTQ2ODE4IGZ1bmN0aW9uYWxpdHksIGFuZCBleHRlbmRlZCBpdCBpbgorYSBmZXcgd2F5cyAoZW5hYmxpbmcgbG9uZ2VyIGFsYXJtIHBlcmlvZHMsIGFuZCB3YWtlLWZyb20taGliZXJuYXRlKS4KK1RoYXQgZnVuY3Rpb25hbGl0eSBpcyBOT1QgZXhwb3NlZCBpbiB0aGUgb2xkIGRyaXZlci4KKwogSG93ZXZlciBpdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGdlbmVyYXRlIHNpZ25hbHMgZnJvbSBhIHNsb3cgMkh6IHRvIGEKIHJlbGF0aXZlbHkgZmFzdCA4MTkySHosIGluIGluY3JlbWVudHMgb2YgcG93ZXJzIG9mIHR3by4gVGhlc2Ugc2lnbmFscwogYXJlIHJlcG9ydGVkIGJ5IGludGVycnVwdCBudW1iZXIgOC4gKE9oISBTbyAqdGhhdCogaXMgd2hhdCBJUlEgOCBpcwpAQCAtNjMsMjIzICsxMDAsMzMxIEBACiBwZXJoYXBzIG1vcmUgdXNlZnVsIHRvIGluY2x1ZGUgYSBzbWFsbCB0ZXN0IHByb2dyYW0gdGhhdCBkZW1vbnN0cmF0ZXMKIGhvdyB0byB1c2UgdGhlbSwgYW5kIGRlbW9uc3RyYXRlcyB0aGUgZmVhdHVyZXMgb2YgdGhlIGRyaXZlci4gVGhpcyBpcwogcHJvYmFibHkgYSBsb3QgbW9yZSB1c2VmdWwgdG8gcGVvcGxlIGludGVyZXN0ZWQgaW4gd3JpdGluZyBhcHBsaWNhdGlvbnMKLXRoYXQgd2lsbCBiZSB1c2luZyB0aGlzIGRyaXZlci4KK3RoYXQgd2lsbCBiZSB1c2luZyB0aGlzIGRyaXZlci4gIFNlZSB0aGUgY29kZSBhdCB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuCiAKLQkJCQkJCVBhdWwgR29ydG1ha2VyCisoVGhlIG9yaWdpbmFsIC9kZXYvcnRjIGRyaXZlciB3YXMgd3JpdHRlbiBieSBQYXVsIEdvcnRtYWtlci4pCisKKworCU5ldyBwb3J0YWJsZSAiUlRDIENsYXNzIiBkcml2ZXJzOiAgL2Rldi9ydGNOCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVjYXVzZSBMaW51eCBzdXBwb3J0cyBtYW55IG5vbi1BQ1BJIGFuZCBub24tUEMgcGxhdGZvcm1zLCBzb21lIG9mIHdoaWNoCitoYXZlIG1vcmUgdGhhbiBvbmUgUlRDIHN0eWxlIGNsb2NrLCBpdCBuZWVkZWQgYSBtb3JlIHBvcnRhYmxlIHNvbHV0aW9uCit0aGFuIGV4cGVjdGluZyBhIHNpbmdsZSBiYXR0ZXJ5LWJhY2tlZCBNQzE0NjgxOCBjbG9uZSBvbiBldmVyeSBzeXN0ZW0uCitBY2NvcmRpbmdseSwgYSBuZXcgIlJUQyBDbGFzcyIgZnJhbWV3b3JrIGhhcyBiZWVuIGRlZmluZWQuICBJdCBvZmZlcnMKK3RocmVlIGRpZmZlcmVudCB1c2Vyc3BhY2UgaW50ZXJmYWNlczoKKworICAgICoJL2Rldi9ydGNOIC4uLiBtdWNoIHRoZSBzYW1lIGFzIHRoZSBvbGRlciAvZGV2L3J0YyBpbnRlcmZhY2UKKworICAgICoJL3N5cy9jbGFzcy9ydGMvcnRjTiAuLi4gc3lzZnMgYXR0cmlidXRlcyBzdXBwb3J0IHJlYWRvbmx5CisJYWNjZXNzIHRvIHNvbWUgUlRDIGF0dHJpYnV0ZXMuCisKKyAgICAqCS9wcm9jL2RyaXZlci9ydGMgLi4uIHRoZSBmaXJzdCBSVEMgKHJ0YzApIG1heSBleHBvc2UgaXRzZWxmCisJdXNpbmcgYSBwcm9jZnMgaW50ZXJmYWNlLiAgTW9yZSBpbmZvcm1hdGlvbiBpcyAoY3VycmVudGx5KSBzaG93bgorCWhlcmUgdGhhbiB0aHJvdWdoIHN5c2ZzLgorCitUaGUgUlRDIENsYXNzIGZyYW1ld29yayBzdXBwb3J0cyBhIHdpZGUgdmFyaWV0eSBvZiBSVENzLCByYW5naW5nIGZyb20gdGhvc2UKK2ludGVncmF0ZWQgaW50byBlbWJlZGRhYmxlIHN5c3RlbS1vbi1jaGlwIChTT0MpIHByb2Nlc3NvcnMgdG8gZGlzY3JldGUgY2hpcHMKK3VzaW5nIEkyQywgU1BJLCBvciBzb21lIG90aGVyIGJ1cyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBob3N0IENQVS4gIFRoZXJlJ3MKK2V2ZW4gc3VwcG9ydCBmb3IgUEMtc3R5bGUgUlRDcyAuLi4gaW5jbHVkaW5nIHRoZSBmZWF0dXJlcyBleHBvc2VkIG9uIG5ld2VyIFBDcwordGhyb3VnaCBBQ1BJLgorCitUaGUgbmV3IGZyYW1ld29yayBhbHNvIHJlbW92ZXMgdGhlICJvbmUgUlRDIHBlciBzeXN0ZW0iIHJlc3RyaWN0aW9uLiAgRm9yCitleGFtcGxlLCBtYXliZSB0aGUgbG93LXBvd2VyIGJhdHRlcnktYmFja2VkIFJUQyBpcyBhIGRpc2NyZXRlIEkyQyBjaGlwLCBidXQKK2EgaGlnaCBmdW5jdGlvbmFsaXR5IFJUQyBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIFNPQy4gIFRoYXQgc3lzdGVtIG1pZ2h0IHJlYWQKK3RoZSBzeXN0ZW0gY2xvY2sgZnJvbSB0aGUgZGlzY3JldGUgUlRDLCBidXQgdXNlIHRoZSBpbnRlZ3JhdGVkIG9uZSBmb3IgYWxsCitvdGhlciB0YXNrcywgYmVjYXVzZSBvZiBpdHMgZ3JlYXRlciBmdW5jdGlvbmFsaXR5LgorCitUaGUgaW9jdGwoKSBjYWxscyBzdXBwb3J0ZWQgYnkgL2Rldi9ydGMgYXJlIGFsc28gc3VwcG9ydGVkIGJ5IHRoZSBSVEMgY2xhc3MKK2ZyYW1ld29yay4gIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGNoaXBzIGFuZCBzeXN0ZW1zIGFyZSBub3Qgc3RhbmRhcmRpemVkLAorc29tZSBQQy9BVCBmdW5jdGlvbmFsaXR5IG1pZ2h0IG5vdCBiZSBwcm92aWRlZC4gIEFuZCBpbiB0aGUgc2FtZSB3YXksIHNvbWUKK25ld2VyIGZlYXR1cmVzIC0tIGluY2x1ZGluZyB0aG9zZSBlbmFibGVkIGJ5IEFDUEkgLS0gYXJlIGV4cG9zZWQgYnkgdGhlCitSVEMgY2xhc3MgZnJhbWV3b3JrLCBidXQgY2FuJ3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBvbGRlciBkcml2ZXIuCisKKyAgICAqCVJUQ19SRF9USU1FLCBSVENfU0VUX1RJTUUgLi4uIGV2ZXJ5IFJUQyBzdXBwb3J0cyBhdCBsZWFzdCByZWFkaW5nCisJdGltZSwgcmV0dXJuaW5nIHRoZSByZXN1bHQgYXMgYSBHcmVnb3JpYW4gY2FsZW5kYXIgZGF0ZSBhbmQgMjQgaG91cgorCXdhbGwgY2xvY2sgdGltZS4gIFRvIGJlIG1vc3QgdXNlZnVsLCB0aGlzIHRpbWUgbWF5IGFsc28gYmUgdXBkYXRlZC4KKworICAgICoJUlRDX0FJRV9PTiwgUlRDX0FJRV9PRkYsIFJUQ19BTE1fU0VULCBSVENfQUxNX1JFQUQgLi4uIHdoZW4gdGhlIFJUQworCWlzIGNvbm5lY3RlZCB0byBhbiBJUlEgbGluZSwgaXQgY2FuIG9mdGVuIGlzc3VlIGFuIGFsYXJtIElSUSB1cCB0bworCTI0IGhvdXJzIGluIHRoZSBmdXR1cmUuCisKKyAgICAqCVJUQ19XS0FMTV9TRVQsIFJUQ19XS0FMTV9SRUFEIC4uLiBSVENzIHRoYXQgY2FuIGlzc3VlIGFsYXJtcyBiZXlvbmQKKwl0aGUgbmV4dCAyNCBob3VycyB1c2UgYSBzbGlnaHRseSBtb3JlIHBvd2VyZnVsIEFQSSwgd2hpY2ggc3VwcG9ydHMKKwlzZXR0aW5nIHRoZSBsb25nZXIgYWxhcm0gdGltZSBhbmQgZW5hYmxpbmcgaXRzIElSUSB1c2luZyBhIHNpbmdsZQorCXJlcXVlc3QgKHVzaW5nIHRoZSBzYW1lIG1vZGVsIGFzIEVGSSBmaXJtd2FyZSkuCisKKyAgICAqCVJUQ19VSUVfT04sIFJUQ19VSUVfT0ZGIC4uLiBpZiB0aGUgUlRDIG9mZmVycyBJUlFzLCBpdCBwcm9iYWJseQorCWFsc28gb2ZmZXJzIHVwZGF0ZSBJUlFzIHdoZW5ldmVyIHRoZSAic2Vjb25kcyIgY291bnRlciBjaGFuZ2VzLgorCUlmIG5lZWRlZCwgdGhlIFJUQyBmcmFtZXdvcmsgY2FuIGVtdWxhdGUgdGhpcyBtZWNoYW5pc20uCisKKyAgICAqCVJUQ19QSUVfT04sIFJUQ19QSUVfT0ZGLCBSVENfSVJRUF9TRVQsIFJUQ19JUlFQX1JFQUQgLi4uIGFub3RoZXIKKwlmZWF0dXJlIG9mdGVuIGFjY2Vzc2libGUgd2l0aCBhbiBJUlEgbGluZSBpcyBhIHBlcmlvZGljIElSUSwgaXNzdWVkCisJYXQgc2V0dGFibGUgZnJlcXVlbmNpZXMgKHVzdWFsbHkgMl5OIEh6KS4KKworSW4gbWFueSBjYXNlcywgdGhlIFJUQyBhbGFybSBjYW4gYmUgYSBzeXN0ZW0gd2FrZSBldmVudCwgdXNlZCB0byBmb3JjZQorTGludXggb3V0IG9mIGEgbG93IHBvd2VyIHNsZWVwIHN0YXRlIChvciBoaWJlcm5hdGlvbikgYmFjayB0byBhIGZ1bGx5CitvcGVyYXRpb25hbCBzdGF0ZS4gIEZvciBleGFtcGxlLCBhIHN5c3RlbSBjb3VsZCBlbnRlciBhIGRlZXAgcG93ZXIgc2F2aW5nCitzdGF0ZSB1bnRpbCBpdCdzIHRpbWUgdG8gZXhlY3V0ZSBzb21lIHNjaGVkdWxlZCB0YXNrcy4KKwogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLSA4PCAtLS0tLS0tLS0tLS0tLS0tIDg8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qCi0gKglSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIFRlc3QvRXhhbXBsZSBQcm9ncmFtCisgKiAgICAgIFJlYWwgVGltZSBDbG9jayBEcml2ZXIgVGVzdC9FeGFtcGxlIFByb2dyYW0KICAqCi0gKglDb21waWxlIHdpdGg6Ci0gKgkJZ2NjIC1zIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgcnRjdGVzdC5jIC1vIHJ0Y3Rlc3QKKyAqICAgICAgQ29tcGlsZSB3aXRoOgorICoJCSAgICAgZ2NjIC1zIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgcnRjdGVzdC5jIC1vIHJ0Y3Rlc3QKICAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTYsIFBhdWwgR29ydG1ha2VyLgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIFBhdWwgR29ydG1ha2VyLgogICoKLSAqCVJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotICoJaW5jbHVkZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqICAgICAgUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCisgKiAgICAgIGluY2x1ZGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCiAgKgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogCi1pbnQgbWFpbih2b2lkKSB7CiAKLWludCBpLCBmZCwgcmV0dmFsLCBpcnFjb3VudCA9IDA7Ci11bnNpZ25lZCBsb25nIHRtcCwgZGF0YTsKLXN0cnVjdCBydGNfdGltZSBydGNfdG07CisvKgorICogVGhpcyBleHBlY3RzIHRoZSBuZXcgUlRDIGNsYXNzIGRyaXZlciBmcmFtZXdvcmssIHdvcmtpbmcgd2l0aAorICogY2xvY2tzIHRoYXQgd2lsbCBvZnRlbiBub3QgYmUgY2xvbmVzIG9mIHdoYXQgdGhlIFBDLUFUIGhhZC4KKyAqIFVzZSB0aGUgY29tbWFuZCBsaW5lIHRvIHNwZWNpZnkgYW5vdGhlciBSVEMgaWYgeW91IG5lZWQgb25lLgorICovCitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X3J0Y1tdID0gIi9kZXYvcnRjMCI7CiAKLWZkID0gb3BlbiAoIi9kZXYvcnRjIiwgT19SRE9OTFkpOwogCi1pZiAoZmQgPT0gIC0xKSB7Ci0JcGVycm9yKCIvZGV2L3J0YyIpOwotCWV4aXQoZXJybm8pOwotfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCBmZCwgcmV0dmFsLCBpcnFjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXAsIGRhdGE7CisJc3RydWN0IHJ0Y190aW1lIHJ0Y190bTsKKwljb25zdCBjaGFyICpydGMgPSBkZWZhdWx0X3J0YzsKIAotZnByaW50ZihzdGRlcnIsICJcblx0XHRcdFJUQyBEcml2ZXIgVGVzdCBFeGFtcGxlLlxuXG4iKTsKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCXJ0YyA9IGFyZ3ZbMV07CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAxOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAgcnRjdGVzdCBbcnRjZGV2XVxuIik7CisJCXJldHVybiAxOworCX0KIAotLyogVHVybiBvbiB1cGRhdGUgaW50ZXJydXB0cyAob25lIHBlciBzZWNvbmQpICovCi1yZXR2YWwgPSBpb2N0bChmZCwgUlRDX1VJRV9PTiwgMCk7Ci1pZiAocmV0dmFsID09IC0xKSB7Ci0JcGVycm9yKCJpb2N0bCIpOwotCWV4aXQoZXJybm8pOwotfQorCWZkID0gb3BlbihydGMsIE9fUkRPTkxZKTsKIAotZnByaW50ZihzdGRlcnIsICJDb3VudGluZyA1IHVwZGF0ZSAoMS9zZWMpIGludGVycnVwdHMgZnJvbSByZWFkaW5nIC9kZXYvcnRjOiIpOwotZmZsdXNoKHN0ZGVycik7Ci1mb3IgKGk9MTsgaTw2OyBpKyspIHsKLQkvKiBUaGlzIHJlYWQgd2lsbCBibG9jayAqLwotCXJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJcGVycm9yKCJyZWFkIik7CisJaWYgKGZkID09ICAtMSkgeworCQlwZXJyb3IocnRjKTsKIAkJZXhpdChlcnJubyk7CiAJfQotCWZwcmludGYoc3RkZXJyLCAiICVkIixpKTsKLQlmZmx1c2goc3RkZXJyKTsKLQlpcnFjb3VudCsrOwotfQogCi1mcHJpbnRmKHN0ZGVyciwgIlxuQWdhaW4sIGZyb20gdXNpbmcgc2VsZWN0KDIpIG9uIC9kZXYvcnRjOiIpOwotZmZsdXNoKHN0ZGVycik7Ci1mb3IgKGk9MTsgaTw2OyBpKyspIHsKLQlzdHJ1Y3QgdGltZXZhbCB0diA9IHs1LCAwfTsJLyogNSBzZWNvbmQgdGltZW91dCBvbiBzZWxlY3QgKi8KLQlmZF9zZXQgcmVhZGZkczsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdFx0UlRDIERyaXZlciBUZXN0IEV4YW1wbGUuXG5cbiIpOwogCi0JRkRfWkVSTygmcmVhZGZkcyk7Ci0JRkRfU0VUKGZkLCAmcmVhZGZkcyk7Ci0JLyogVGhlIHNlbGVjdCB3aWxsIHdhaXQgdW50aWwgYW4gUlRDIGludGVycnVwdCBoYXBwZW5zLiAqLwotCXJldHZhbCA9IHNlbGVjdChmZCsxLCAmcmVhZGZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwkvKiBUdXJuIG9uIHVwZGF0ZSBpbnRlcnJ1cHRzIChvbmUgcGVyIHNlY29uZCkgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1VJRV9PTiwgMCk7CiAJaWYgKHJldHZhbCA9PSAtMSkgewotCQlwZXJyb3IoInNlbGVjdCIpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0JLyogVGhpcyByZWFkIHdvbid0IGJsb2NrIHVubGlrZSB0aGUgc2VsZWN0LWxlc3MgY2FzZSBhYm92ZS4gKi8KLQlyZXR2YWwgPSByZWFkKGZkLCAmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlpZiAocmV0dmFsID09IC0xKSB7Ci0JCXBlcnJvcigicmVhZCIpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICIgJWQiLGkpOwotCWZmbHVzaChzdGRlcnIpOwotCWlycWNvdW50Kys7Ci19Ci0KLS8qIFR1cm4gb2ZmIHVwZGF0ZSBpbnRlcnJ1cHRzICovCi1yZXR2YWwgPSBpb2N0bChmZCwgUlRDX1VJRV9PRkYsIDApOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KLQotLyogUmVhZCB0aGUgUlRDIHRpbWUvZGF0ZSAqLwotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19SRF9USU1FLCAmcnRjX3RtKTsKLWlmIChyZXR2YWwgPT0gLTEpIHsKLQlwZXJyb3IoImlvY3RsIik7Ci0JZXhpdChlcnJubyk7Ci19Ci0KLWZwcmludGYoc3RkZXJyLCAiXG5cbkN1cnJlbnQgUlRDIGRhdGUvdGltZSBpcyAlZC0lZC0lZCwgJTAyZDolMDJkOiUwMmQuXG4iLAotCXJ0Y190bS50bV9tZGF5LCBydGNfdG0udG1fbW9uICsgMSwgcnRjX3RtLnRtX3llYXIgKyAxOTAwLAotCXJ0Y190bS50bV9ob3VyLCBydGNfdG0udG1fbWluLCBydGNfdG0udG1fc2VjKTsKLQotLyogU2V0IHRoZSBhbGFybSB0byA1IHNlYyBpbiB0aGUgZnV0dXJlLCBhbmQgY2hlY2sgZm9yIHJvbGxvdmVyICovCi1ydGNfdG0udG1fc2VjICs9IDU7Ci1pZiAocnRjX3RtLnRtX3NlYyA+PSA2MCkgewotCXJ0Y190bS50bV9zZWMgJT0gNjA7Ci0JcnRjX3RtLnRtX21pbisrOwotfQotaWYgIChydGNfdG0udG1fbWluID09IDYwKSB7Ci0JcnRjX3RtLnRtX21pbiA9IDA7Ci0JcnRjX3RtLnRtX2hvdXIrKzsKLX0KLWlmICAocnRjX3RtLnRtX2hvdXIgPT0gMjQpCi0JcnRjX3RtLnRtX2hvdXIgPSAwOwotCi1yZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FMTV9TRVQsICZydGNfdG0pOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KLQotLyogUmVhZCB0aGUgY3VycmVudCBhbGFybSBzZXR0aW5ncyAqLwotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BTE1fUkVBRCwgJnJ0Y190bSk7Ci1pZiAocmV0dmFsID09IC0xKSB7Ci0JcGVycm9yKCJpb2N0bCIpOwotCWV4aXQoZXJybm8pOwotfQotCi1mcHJpbnRmKHN0ZGVyciwgIkFsYXJtIHRpbWUgbm93IHNldCB0byAlMDJkOiUwMmQ6JTAyZC5cbiIsCi0JcnRjX3RtLnRtX2hvdXIsIHJ0Y190bS50bV9taW4sIHJ0Y190bS50bV9zZWMpOwotCi0vKiBFbmFibGUgYWxhcm0gaW50ZXJydXB0cyAqLwotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BSUVfT04sIDApOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KLQotZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIDUgc2Vjb25kcyBmb3IgYWxhcm0uLi4iKTsKLWZmbHVzaChzdGRlcnIpOwotLyogVGhpcyBibG9ja3MgdW50aWwgdGhlIGFsYXJtIHJpbmcgY2F1c2VzIGFuIGludGVycnVwdCAqLwotcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci1pZiAocmV0dmFsID09IC0xKSB7Ci0JcGVycm9yKCJyZWFkIik7Ci0JZXhpdChlcnJubyk7Ci19Ci1pcnFjb3VudCsrOwotZnByaW50ZihzdGRlcnIsICIgb2theS4gQWxhcm0gcmFuZy5cbiIpOwotCi0vKiBEaXNhYmxlIGFsYXJtIGludGVycnVwdHMgKi8KLXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUlFX09GRiwgMCk7Ci1pZiAocmV0dmFsID09IC0xKSB7Ci0JcGVycm9yKCJpb2N0bCIpOwotCWV4aXQoZXJybm8pOwotfQotCi0vKiBSZWFkIHBlcmlvZGljIElSUSByYXRlICovCi1yZXR2YWwgPSBpb2N0bChmZCwgUlRDX0lSUVBfUkVBRCwgJnRtcCk7Ci1pZiAocmV0dmFsID09IC0xKSB7Ci0JcGVycm9yKCJpb2N0bCIpOwotCWV4aXQoZXJybm8pOwotfQotZnByaW50ZihzdGRlcnIsICJcblBlcmlvZGljIElSUSByYXRlIHdhcyAlbGRIei5cbiIsIHRtcCk7Ci0KLWZwcmludGYoc3RkZXJyLCAiQ291bnRpbmcgMjAgaW50ZXJydXB0cyBhdDoiKTsKLWZmbHVzaChzdGRlcnIpOwotCi0vKiBUaGUgZnJlcXVlbmNpZXMgMTI4SHosIDI1Nkh6LCAuLi4gODE5Mkh6IGFyZSBvbmx5IGFsbG93ZWQgZm9yIHJvb3QuICovCi1mb3IgKHRtcD0yOyB0bXA8PTY0OyB0bXAqPTIpIHsKLQotCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfSVJRUF9TRVQsIHRtcCk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiXG4uLi5VcGRhdGUgSVJRcyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCQlnb3RvIHRlc3RfUkVBRDsKKwkJfQogCQlwZXJyb3IoImlvY3RsIik7CiAJCWV4aXQoZXJybm8pOwogCX0KIAotCWZwcmludGYoc3RkZXJyLCAiXG4lbGRIejpcdCIsIHRtcCk7CisJZnByaW50ZihzdGRlcnIsICJDb3VudGluZyA1IHVwZGF0ZSAoMS9zZWMpIGludGVycnVwdHMgZnJvbSByZWFkaW5nICVzOiIsCisJCQlydGMpOwogCWZmbHVzaChzdGRlcnIpOwotCi0JLyogRW5hYmxlIHBlcmlvZGljIGludGVycnVwdHMgKi8KLQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1BJRV9PTiwgMCk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgewotCQlwZXJyb3IoImlvY3RsIik7Ci0JCWV4aXQoZXJybm8pOwotCX0KLQotCWZvciAoaT0xOyBpPDIxOyBpKyspIHsKLQkJLyogVGhpcyBibG9ja3MgKi8KKwlmb3IgKGk9MTsgaTw2OyBpKyspIHsKKwkJLyogVGhpcyByZWFkIHdpbGwgYmxvY2sgKi8KIAkJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAJCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJCXBlcnJvcigicmVhZCIpOwotCQkJZXhpdChlcnJubyk7CisJCSAgICAgICAgcGVycm9yKCJyZWFkIik7CisJCSAgICAgICAgZXhpdChlcnJubyk7CiAJCX0KIAkJZnByaW50ZihzdGRlcnIsICIgJWQiLGkpOwogCQlmZmx1c2goc3RkZXJyKTsKIAkJaXJxY291bnQrKzsKIAl9CiAKLQkvKiBEaXNhYmxlIHBlcmlvZGljIGludGVycnVwdHMgKi8KLQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1BJRV9PRkYsIDApOworCWZwcmludGYoc3RkZXJyLCAiXG5BZ2FpbiwgZnJvbSB1c2luZyBzZWxlY3QoMikgb24gL2Rldi9ydGM6Iik7CisJZmZsdXNoKHN0ZGVycik7CisJZm9yIChpPTE7IGk8NjsgaSsrKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2ID0gezUsIDB9OyAgICAgLyogNSBzZWNvbmQgdGltZW91dCBvbiBzZWxlY3QgKi8KKwkJZmRfc2V0IHJlYWRmZHM7CisKKwkJRkRfWkVSTygmcmVhZGZkcyk7CisJCUZEX1NFVChmZCwgJnJlYWRmZHMpOworCQkvKiBUaGUgc2VsZWN0IHdpbGwgd2FpdCB1bnRpbCBhbiBSVEMgaW50ZXJydXB0IGhhcHBlbnMuICovCisJCXJldHZhbCA9IHNlbGVjdChmZCsxLCAmcmVhZGZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwkJaWYgKHJldHZhbCA9PSAtMSkgeworCQkgICAgICAgIHBlcnJvcigic2VsZWN0Iik7CisJCSAgICAgICAgZXhpdChlcnJubyk7CisJCX0KKwkJLyogVGhpcyByZWFkIHdvbid0IGJsb2NrIHVubGlrZSB0aGUgc2VsZWN0LWxlc3MgY2FzZSBhYm92ZS4gKi8KKwkJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJICAgICAgICBwZXJyb3IoInJlYWQiKTsKKwkJICAgICAgICBleGl0KGVycm5vKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIiAlZCIsaSk7CisJCWZmbHVzaChzdGRlcnIpOworCQlpcnFjb3VudCsrOworCX0KKworCS8qIFR1cm4gb2ZmIHVwZGF0ZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19VSUVfT0ZGLCAwKTsKIAlpZiAocmV0dmFsID09IC0xKSB7CiAJCXBlcnJvcigiaW9jdGwiKTsKIAkJZXhpdChlcnJubyk7CiAJfQorCit0ZXN0X1JFQUQ6CisJLyogUmVhZCB0aGUgUlRDIHRpbWUvZGF0ZSAqLworCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUkRfVElNRSwgJnJ0Y190bSk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQlwZXJyb3IoImlvY3RsIik7CisJCWV4aXQoZXJybm8pOworCX0KKworCWZwcmludGYoc3RkZXJyLCAiXG5cbkN1cnJlbnQgUlRDIGRhdGUvdGltZSBpcyAlZC0lZC0lZCwgJTAyZDolMDJkOiUwMmQuXG4iLAorCQlydGNfdG0udG1fbWRheSwgcnRjX3RtLnRtX21vbiArIDEsIHJ0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJcnRjX3RtLnRtX2hvdXIsIHJ0Y190bS50bV9taW4sIHJ0Y190bS50bV9zZWMpOworCisJLyogU2V0IHRoZSBhbGFybSB0byA1IHNlYyBpbiB0aGUgZnV0dXJlLCBhbmQgY2hlY2sgZm9yIHJvbGxvdmVyICovCisJcnRjX3RtLnRtX3NlYyArPSA1OworCWlmIChydGNfdG0udG1fc2VjID49IDYwKSB7CisJCXJ0Y190bS50bV9zZWMgJT0gNjA7CisJCXJ0Y190bS50bV9taW4rKzsKKwl9CisJaWYgIChydGNfdG0udG1fbWluID09IDYwKSB7CisJCXJ0Y190bS50bV9taW4gPSAwOworCQlydGNfdG0udG1faG91cisrOworCX0KKwlpZiAgKHJ0Y190bS50bV9ob3VyID09IDI0KQorCQlydGNfdG0udG1faG91ciA9IDA7CisKKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FMTV9TRVQsICZydGNfdG0pOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVOT1RUWSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlxuLi4uQWxhcm0gSVJRcyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCQlnb3RvIHRlc3RfUElFOworCQl9CisJCXBlcnJvcigiaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCisJLyogUmVhZCB0aGUgY3VycmVudCBhbGFybSBzZXR0aW5ncyAqLworCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUxNX1JFQUQsICZydGNfdG0pOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJcGVycm9yKCJpb2N0bCIpOworCQlleGl0KGVycm5vKTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIkFsYXJtIHRpbWUgbm93IHNldCB0byAlMDJkOiUwMmQ6JTAyZC5cbiIsCisJCXJ0Y190bS50bV9ob3VyLCBydGNfdG0udG1fbWluLCBydGNfdG0udG1fc2VjKTsKKworCS8qIEVuYWJsZSBhbGFybSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BSUVfT04sIDApOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJcGVycm9yKCJpb2N0bCIpOworCQlleGl0KGVycm5vKTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgNSBzZWNvbmRzIGZvciBhbGFybS4uLiIpOworCWZmbHVzaChzdGRlcnIpOworCS8qIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBhbGFybSByaW5nIGNhdXNlcyBhbiBpbnRlcnJ1cHQgKi8KKwlyZXR2YWwgPSByZWFkKGZkLCAmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigicmVhZCIpOworCQlleGl0KGVycm5vKTsKKwl9CisJaXJxY291bnQrKzsKKwlmcHJpbnRmKHN0ZGVyciwgIiBva2F5LiBBbGFybSByYW5nLlxuIik7CisKKwkvKiBEaXNhYmxlIGFsYXJtIGludGVycnVwdHMgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FJRV9PRkYsIDApOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJcGVycm9yKCJpb2N0bCIpOworCQlleGl0KGVycm5vKTsKKwl9CisKK3Rlc3RfUElFOgorCS8qIFJlYWQgcGVyaW9kaWMgSVJRIHJhdGUgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0lSUVBfUkVBRCwgJnRtcCk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQkvKiBub3QgYWxsIFJUQ3Mgc3VwcG9ydCBwZXJpb2RpYyBJUlFzICovCisJCWlmIChlcnJubyA9PSBFTk9UVFkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXG5ObyBwZXJpb2RpYyBJUlEgc3VwcG9ydFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwZXJyb3IoImlvY3RsIik7CisJCWV4aXQoZXJybm8pOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgIlxuUGVyaW9kaWMgSVJRIHJhdGUgaXMgJWxkSHouXG4iLCB0bXApOworCisJZnByaW50ZihzdGRlcnIsICJDb3VudGluZyAyMCBpbnRlcnJ1cHRzIGF0OiIpOworCWZmbHVzaChzdGRlcnIpOworCisJLyogVGhlIGZyZXF1ZW5jaWVzIDEyOEh6LCAyNTZIeiwgLi4uIDgxOTJIeiBhcmUgb25seSBhbGxvd2VkIGZvciByb290LiAqLworCWZvciAodG1wPTI7IHRtcDw9NjQ7IHRtcCo9MikgeworCisJCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfSVJRUF9TRVQsIHRtcCk7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJCS8qIG5vdCBhbGwgUlRDcyBjYW4gY2hhbmdlIHRoZWlyIHBlcmlvZGljIElSUSByYXRlICovCisJCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJcbi4uLlBlcmlvZGljIElSUSByYXRlIGlzIGZpeGVkXG4iKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCSAgICAgICAgcGVycm9yKCJpb2N0bCIpOworCQkgICAgICAgIGV4aXQoZXJybm8pOworCQl9CisKKwkJZnByaW50ZihzdGRlcnIsICJcbiVsZEh6Olx0IiwgdG1wKTsKKwkJZmZsdXNoKHN0ZGVycik7CisKKwkJLyogRW5hYmxlIHBlcmlvZGljIGludGVycnVwdHMgKi8KKwkJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19QSUVfT04sIDApOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCSAgICAgICAgcGVycm9yKCJpb2N0bCIpOworCQkgICAgICAgIGV4aXQoZXJybm8pOworCQl9CisKKwkJZm9yIChpPTE7IGk8MjE7IGkrKykgeworCQkgICAgICAgIC8qIFRoaXMgYmxvY2tzICovCisJCSAgICAgICAgcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCSAgICAgICAgaWYgKHJldHZhbCA9PSAtMSkgeworCQkJCSAgICAgICBwZXJyb3IoInJlYWQiKTsKKwkJCQkgICAgICAgZXhpdChlcnJubyk7CisJCSAgICAgICAgfQorCQkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICVkIixpKTsKKwkJICAgICAgICBmZmx1c2goc3RkZXJyKTsKKwkJICAgICAgICBpcnFjb3VudCsrOworCQl9CisKKwkJLyogRGlzYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCisJCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUElFX09GRiwgMCk7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJICAgICAgICBwZXJyb3IoImlvY3RsIik7CisJCSAgICAgICAgZXhpdChlcnJubyk7CisJCX0KKwl9CisKK2RvbmU6CisJZnByaW50ZihzdGRlcnIsICJcblxuXHRcdFx0ICoqKiBUZXN0IGNvbXBsZXRlICoqKlxuIik7CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKIH0KLQotZnByaW50ZihzdGRlcnIsICJcblxuXHRcdFx0ICoqKiBUZXN0IGNvbXBsZXRlICoqKlxuIik7Ci1mcHJpbnRmKHN0ZGVyciwgIlxuVHlwaW5nIFwiY2F0IC9wcm9jL2ludGVycnVwdHNcIiB3aWxsIHNob3cgJWQgbW9yZSBldmVudHMgb24gSVJRIDguXG5cbiIsCi0JCQkJCQkJCSBpcnFjb3VudCk7Ci0KLWNsb3NlKGZkKTsKLXJldHVybiAwOwotCi19IC8qIGVuZCBtYWluICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvQ29tbW9uSU8gYi9Eb2N1bWVudGF0aW9uL3MzOTAvQ29tbW9uSU8KaW5kZXggZDY4NGE2YS4uMjJmODJmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL0NvbW1vbklPCisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9Db21tb25JTwpAQCAtNzQsNyArNzQsNyBAQAogCiAgIE5vdGU6IFdoaWxlIGFscmVhZHkga25vd24gZGV2aWNlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0byBiZQogICAgICAgICBpZ25vcmVkLCB0aGVyZSB3aWxsIGJlIG5vIGVmZmVjdCBvbiB0aGVuLiBIb3dldmVyLCBpZiBzdWNoIGEgZGV2aWNlCi0gICAgICAgIGRpc2FwcGVhcnMgYW5kIHRoZW4gcmVhcHBlYXJlcywgaXQgd2lsbCB0aGVuIGJlIGlnbm9yZWQuCisJZGlzYXBwZWFycyBhbmQgdGhlbiByZWFwcGVhcnMsIGl0IHdpbGwgdGhlbiBiZSBpZ25vcmVkLgogCiAgIEZvciBleGFtcGxlLAogCSJlY2hvIGFkZCAwLjAuYTAwMC0wLjAuYWNjYywgMC4wLmFmMDAtMC4wLmFmZmYgPiAvcHJvYy9jaW9faWdub3JlIgpAQCAtODIsNyArODIsNyBAQAogICBkZXZpY2VzLgogCiAgIFRoZSBkZXZpY2VzIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGJ5IGJ1cyBpZCAoMC4wLmFiY2QpIG9yLCBmb3IgMi40IGJhY2t3YXJkCi0gIGNvbXBhdGliaWx0eSwgYnkgdGhlIGRldmljZSBudW1iZXIgaW4gaGV4YWRlY2ltYWwgKDB4YWJjZCBvciBhYmNkKS4KKyAgY29tcGF0aWJpbGl0eSwgYnkgdGhlIGRldmljZSBudW1iZXIgaW4gaGV4YWRlY2ltYWwgKDB4YWJjZCBvciBhYmNkKS4KIAogCiAqIC9wcm9jL3MzOTBkYmYvY2lvXyovIChTLzM5MCBkZWJ1ZyBmZWF0dXJlKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dAppbmRleCA0ZGQyNWVlLi4zZjlkZGJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dApAQCAtNyw3ICs3LDcgQEAKIAogT3ZlcnZpZXcgb2YgRG9jdW1lbnQ6CiA9PT09PT09PT09PT09PT09PT09PT0KLVRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gZ2l2ZSBhbiBnb29kIG92ZXJ2aWV3IG9mIGhvdyB0byBkZWJ1ZyAKK1RoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gZ2l2ZSBhIGdvb2Qgb3ZlcnZpZXcgb2YgaG93IHRvIGRlYnVnCiBMaW51eCBmb3Igcy8zOTAgJiB6L0FyY2hpdGVjdHVyZS4gSXQgaXNuJ3QgaW50ZW5kZWQgYXMgYSBjb21wbGV0ZSByZWZlcmVuY2UgJiBub3QgYQogdHV0b3JpYWwgb24gdGhlIGZ1bmRhbWVudGFscyBvZiBDICYgYXNzZW1ibHkuIEl0IGRvZXNuJ3QgZ28gaW50bwogMzkwIElPIGluIGFueSBkZXRhaWwuIEl0IGlzIGludGVuZGVkIHRvIGNvbXBsZW1lbnQgdGhlIGRvY3VtZW50cyBpbiB0aGUKQEAgLTMwMCw3ICszMDAsNyBAQAogYnV0IG9ubHkgbWVzcyB3aXRoIDIgc2VnbWVudCBpbmRpY2VzIGVhY2ggdGltZSB3ZSBtZXNzIHdpdGgKIGEgUE1ELgogCi0zKSBBcyB6L0FyY2hpdGVjdHVyZSBzdXBwb3J0cyB1cHRvIGEgbWFzc2l2ZSA1LWxldmVsIHBhZ2UgdGFibGUgbG9va3VwIHdlIAorMykgQXMgei9BcmNoaXRlY3R1cmUgc3VwcG9ydHMgdXAgdG8gYSBtYXNzaXZlIDUtbGV2ZWwgcGFnZSB0YWJsZSBsb29rdXAgd2UKIGNhbiBvbmx5IHVzZSAzIGN1cnJlbnRseSBvbiBMaW51eCAoIGFzIHRoaXMgaXMgYWxsIHRoZSBnZW5lcmljIGtlcm5lbAogY3VycmVudGx5IHN1cHBvcnRzICkgaG93ZXZlciB0aGlzIG1heSBjaGFuZ2UgaW4gZnV0dXJlCiB0aGlzIGFsbG93cyB1cyB0byBhY2Nlc3MgKCBhY2NvcmRpbmcgdG8gbXkgc3VtcyApCkBAIC01MDIsNyArNTAyLDcgQEAKIC0tLS0tLQogMSkgVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCByZWdpc3RlcnMgd2hpY2ggYXJlIHVzZWQKIGJ5IHRoZSBjYWxsZWUgYXJlIHNhdmVkLCBlLmcuIHRoZSBjb21waWxlciBpcyBwZXJmZWN0bHkKLWNhcGlibGUgb2YgdXNpbmcgcjExIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuIGEgZnJhbWUgYQorY2FwYWJsZSBvZiB1c2luZyByMTEgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gYSBmcmFtZSBhCiBmcmFtZSBwb2ludGVyIGlmIGEgZnJhbWUgcG9pbnRlciBpcyBub3QgbmVlZGVkLgogMikgSW4gZnVuY3Rpb25zIHdpdGggdmFyaWFibGUgYXJndW1lbnRzIGUuZy4gcHJpbnRmIHRoZSBjYWxsaW5nIHByb2NlZHVyZSAKIGlzIGlkZW50aWNhbCB0byBvbmUgd2l0aG91dCB2YXJpYWJsZSBhcmd1bWVudHMgJiB0aGUgc2FtZSBudW1iZXIgb2YgCkBAIC04NDYsNyArODQ2LDcgQEAKIGluc3RlYWQgaWYgdGhlIGNvZGUgaXNuJ3QgY29tcGlsZWQgLWcsIGFzIGl0IGlzIG11Y2ggZmFzdGVyOgogb2JqZHVtcCAtLWRpc2Fzc2VtYmxlLWFsbCAtLXN5bXMgdm1saW51eCA+IHZtbGludXgubHN0ICAKIAotQXMgaGFyZCBkcml2ZSBzcGFjZSBpcyB2YWx1YmxlIG1vc3Qgb2YgdXMgdXNlIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2guCitBcyBoYXJkIGRyaXZlIHNwYWNlIGlzIHZhbHVhYmxlIG1vc3Qgb2YgdXMgdXNlIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2guCiAxKSBMb29rIGF0IHRoZSBlbWl0dGVkIHBzdyBvbiB0aGUgY29uc29sZSB0byBmaW5kIHRoZSBjcmFzaCBhZGRyZXNzIGluIHRoZSBrZXJuZWwuCiAyKSBMb29rIGF0IHRoZSBmaWxlIFN5c3RlbS5tYXAgKCBpbiB0aGUgbGludXggZGlyZWN0b3J5ICkgcHJvZHVjZWQgd2hlbiBidWlsZGluZyAKIHRoZSBrZXJuZWwgdG8gZmluZCB0aGUgY2xvc2VzdCBhZGRyZXNzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBQU1cgdG8gZmluZCB0aGUKQEAgLTkwMiw3ICs5MDIsNyBAQAogdG8gYSBmaWxlICYgb24gdGhlIHNjcmVlbi4KIAogUS4gV2hhdCB1c2UgaXMgaXQgPwotQS4gWW91IGNhbiB1c2VkIGl0IHRvIGZpbmQgb3V0IHdoYXQgZmlsZXMgYSBwYXJ0aWN1bGFyIHByb2dyYW0gb3BlbnMuCitBLiBZb3UgY2FuIHVzZSBpdCB0byBmaW5kIG91dCB3aGF0IGZpbGVzIGEgcGFydGljdWxhciBwcm9ncmFtIG9wZW5zLgogCiAKIApAQCAtOTExLDcgKzkxMSw3IEBACiBJZiB5b3Ugd2FudGVkIHRvIGtub3cgZG9lcyBwaW5nIHdvcmsgYnV0IGRpZG4ndCBoYXZlIHRoZSBzb3VyY2UgCiBzdHJhY2UgcGluZyAtYyAxIDEyNy4wLjAuMSAgCiAmIHRoZW4gbG9vayBhdCB0aGUgbWFuIHBhZ2VzIGZvciBlYWNoIG9mIHRoZSBzeXNjYWxscyBiZWxvdywKLSggSW4gZmFjdCB0aGlzIGlzIHNvbWV0aW1lcyBlYXNpZXIgdGhhbiBsb29raW5nIGF0IHNvbWUgc3BhZ2V0dGkKKyggSW4gZmFjdCB0aGlzIGlzIHNvbWV0aW1lcyBlYXNpZXIgdGhhbiBsb29raW5nIGF0IHNvbWUgc3BhZ2hldHRpCiBzb3VyY2Ugd2hpY2ggY29uZGl0aW9uYWxseSBjb21waWxlcyBmb3Igc2V2ZXJhbCBhcmNoaXRlY3R1cmVzICkuCiBOb3QgZXZlcnl0aGluZyB0aGF0IGl0IHRocm93cyBvdXQgbmVlZHMgdG8gbWFrZSBzZW5zZSBpbW1lZGlhdGVseS4KIApAQCAtMTAzNyw3ICsxMDM3LDcgQEAKIAogUGVyZm9ybWFuY2UgRGVidWdnaW5nCiA9PT09PT09PT09PT09PT09PT09PT0KLWdjYyBpcyBjYXBpYmxlIG9mIGNvbXBpbGluZyBpbiBwcm9maWxpbmcgY29kZSBqdXN0IGFkZCB0aGUgLXAgb3B0aW9uCitnY2MgaXMgY2FwYWJsZSBvZiBjb21waWxpbmcgaW4gcHJvZmlsaW5nIGNvZGUganVzdCBhZGQgdGhlIC1wIG9wdGlvbgogdG8gdGhlIENGTEFHUywgdGhpcyBvYnZpb3VzbHkgYWZmZWN0cyBwcm9ncmFtIHNpemUgJiBwZXJmb3JtYW5jZS4KIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIGdwcm9mIGdudSBwcm9maWxpbmcgdG9vbCBvciB0aGUKIGdjb3YgdGhlIGdudSBjb2RlIGNvdmVyYWdlIHRvb2wgKCBjb2RlIGNvdmVyYWdlIGlzIGEgbWVhbnMgb2YgdGVzdGluZwpAQCAtMTQxOSw3ICsxNDE5LDcgQEAKIFRvIGlzc3VlIGEgY29tbWFuZCB0byBhIHBhcnRpY3VsYXIgY3B1IHRyeSBjcHUgPGNwdSBudW1iZXI+IGUuZy4KIENQVSAwMSBUUiBJIFIgMjAwMC4zMDAwCiBJZiB5b3UgYXJlIHJ1bm5pbmcgb24gYSBndWVzdCB3aXRoIHNldmVyYWwgY3B1cyAmIHlvdSBoYXZlIGEgSU8gcmVsYXRlZCBwcm9ibGVtCi0mIGNhbm5vdCBmb2xsb3cgdGhlIGZsb3cgb2YgY29kZSBidXQgeW91IGtub3cgaXQgaXNudCBzbXAgcmVsYXRlZC4KKyYgY2Fubm90IGZvbGxvdyB0aGUgZmxvdyBvZiBjb2RlIGJ1dCB5b3Uga25vdyBpdCBpc24ndCBzbXAgcmVsYXRlZC4KIGZyb20gdGhlIGJhc2ggcHJvbXB0IGlzc3VlCiBzaHV0ZG93biAtaCBub3cgb3IgaGFsdC4KIGRvIGEgUSBDUFVTIHRvIGZpbmQgb3V0IGhvdyBtYW55IGNwdXMgeW91IGhhdmUKQEAgLTE2MDIsNyArMTYwMiw3IEBACiBvdXIgM3JkIHJldHVybiBhZGRyZXNzIGlzIDgwMDEwODVBCiAKIGFzIHRoZSAwNEI1MjAwMiBsb29rcyBzdXNwaWNpb3VzbHkgbGlrZSBydWJiaXNoIGl0IGlzIGZhaXIgdG8gYXNzdW1lIHRoYXQgdGhlIGtlcm5lbCBlbnRyeSByb3V0aW5lcwotZm9yIHRoZSBzYWtlIG9mIG9wdGltaXNhdGlvbiBkb250IHNldCB1cCBhIGJhY2tjaGFpbi4KK2ZvciB0aGUgc2FrZSBvZiBvcHRpbWlzYXRpb24gZG9uJ3Qgc2V0IHVwIGEgYmFja2NoYWluLgogCiBub3cgbG9vayBhdCBTeXN0ZW0ubWFwIHRvIHNlZSBpZiB0aGUgYWRkcmVzc2VzIG1ha2UgYW55IHNlbnNlLgogCkBAIC0xNjM4LDExICsxNjM4LDExIEBACiAKIFVubGlrZSBvdGhlciBidXMgYXJjaGl0ZWN0dXJlcyBtb2Rlcm4gMzkwIHN5c3RlbXMgZG8gdGhlaXIgSU8gdXNpbmcgbW9zdGx5CiBmaWJyZSBvcHRpY3MgJiBkZXZpY2VzIHN1Y2ggYXMgdGFwZXMgJiBkaXNrcyBjYW4gYmUgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbCBtYWluZnJhbWVzLAotYWxzbyBTMzkwIGNhbiBzdXBwb3J0IHVwdG8gNjU1MzYgZGV2aWNlcyB3aGlsZSBhIGhpZ2ggZW5kIFBDIGJhc2VkIHN5c3RlbSBtaWdodCBiZSBjaG9raW5nIAorYWxzbyBTMzkwIGNhbiBzdXBwb3J0IHVwIHRvIDY1NTM2IGRldmljZXMgd2hpbGUgYSBoaWdoIGVuZCBQQyBiYXNlZCBzeXN0ZW0gbWlnaHQgYmUgY2hva2luZwogd2l0aCBhcm91bmQgNjQuIEhlcmUgaXMgc29tZSBvZiB0aGUgY29tbW9uIElPIHRlcm1pbm9sb2d5CiAKIFN1YmNoYW5uZWw6Ci1UaGlzIGlzIHRoZSBsb2dpY2FsIG51bWJlciBtb3N0IElPIGNvbW1hbmRzIHVzZSB0byB0YWxrIHRvIGFuIElPIGRldmljZSB0aGVyZSBjYW4gYmUgdXB0bworVGhpcyBpcyB0aGUgbG9naWNhbCBudW1iZXIgbW9zdCBJTyBjb21tYW5kcyB1c2UgdG8gdGFsayB0byBhbiBJTyBkZXZpY2UgdGhlcmUgY2FuIGJlIHVwIHRvCiAweDEwMDAwICg2NTUzNikgb2YgdGhlc2UgaW4gYSBjb25maWd1cmF0aW9uIHR5cGljYWxseSB0aGVyZSBpcyBhIGZldyBodW5kcmVkLiBVbmRlciBWTQogZm9yIHNpbXBsaWNpdHkgdGhleSBhcmUgYWxsb2NhdGVkIGNvbnRpZ3VvdXNseSwgaG93ZXZlciBvbiB0aGUgbmF0aXZlIGhhcmR3YXJlIHRoZXkgYXJlIG5vdAogdGhleSB0eXBpY2FsbHkgc3RheSBjb25zaXN0ZW50IGJldHdlZW4gYm9vdHMgcHJvdmlkZWQgbm8gbmV3IGhhcmR3YXJlIGlzIGluc2VydGVkIG9yIHJlbW92ZWQuCkBAIC0xNjUxLDcgKzE2NTEsNyBAQAogVEVTVCBTVUJDSEFOTkVMICkgd2UgdXNlIHRoaXMgYXMgdGhlIElEIG9mIHRoZSBkZXZpY2Ugd2Ugd2lzaCB0byB0YWxrIHRvLCB0aGUgbW9zdAogaW1wb3J0YW50IG9mIHRoZXNlIGluc3RydWN0aW9ucyBhcmUgU1RBUlQgU1VCQ0hBTk5FTCAoIHRvIHN0YXJ0IElPICksIFRFU1QgU1VCQ0hBTk5FTCAoIHRvIGNoZWNrCiB3aGV0aGVyIHRoZSBJTyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICksICYgSEFMVCBTVUJDSEFOTkVMICggdG8ga2lsbCBJTyApLCBhIHN1YmNoYW5uZWwKLWNhbiBoYXZlIHVwIHRvIDggY2hhbm5lbCBwYXRocyB0byBhIGRldmljZSB0aGlzIG9mZmVycyByZWR1bmFuY3kgaWYgb25lIGlzIG5vdCBhdmFpbGFibGUuCitjYW4gaGF2ZSB1cCB0byA4IGNoYW5uZWwgcGF0aHMgdG8gYSBkZXZpY2UgdGhpcyBvZmZlcnMgcmVkdW5kYW5jeSBpZiBvbmUgaXMgbm90IGF2YWlsYWJsZS4KIAogCiBEZXZpY2UgTnVtYmVyOgpAQCAtMTY1OSw3ICsxNjU5LDcgQEAKIGFsc28gdGhleSBhcmUgbWFkZSB1cCBvZiBhIENIUElEICggQ2hhbm5lbCBQYXRoIElELCB0aGUgbW9zdCBzaWduaWZpY2FudCA4IGJpdHMgKSAKICYgYW5vdGhlciBsc2IgOCBiaXRzLiBUaGVzZSByZW1haW4gc3RhdGljIGV2ZW4gaWYgbW9yZSBkZXZpY2VzIGFyZSBpbnNlcnRlZCBvciByZW1vdmVkCiBmcm9tIHRoZSBoYXJkd2FyZSwgdGhlcmUgaXMgYSAxIHRvIDEgbWFwcGluZyBiZXR3ZWVuIFN1YmNoYW5uZWxzICYgRGV2aWNlIE51bWJlcnMgcHJvdmlkZWQKLWRldmljZXMgYXJlbnQgaW5zZXJ0ZWQgb3IgcmVtb3ZlZC4KK2RldmljZXMgYXJlbid0IGluc2VydGVkIG9yIHJlbW92ZWQuCiAKIENoYW5uZWwgQ29udHJvbCBXb3JkczoKIENDV1MgYXJlIGxpbmtlZCBsaXN0cyBvZiBpbnN0cnVjdGlvbnMgaW5pdGlhbGx5IHBvaW50ZWQgdG8gYnkgYW4gb3BlcmF0aW9uIHJlcXVlc3QgYmxvY2sgKE9SQiksCkBAIC0xNjc0LDcgKzE2NzQsNyBAQAogZnJvbSB3aGljaCB5b3UgcmVjZWl2ZSBhbiBJbnRlcnJ1cHRpb24gcmVzcG9uc2UgYmxvY2sgKElSQikuIElmIHlvdSBnZXQgY2hhbm5lbCAmIGRldmljZSBlbmQgCiBzdGF0dXMgaW4gdGhlIElSQiB3aXRob3V0IGNoYW5uZWwgY2hlY2tzIGV0Yy4geW91ciBJTyBwcm9iYWJseSB3ZW50IG9rYXkuIElmIHlvdSBkaWRuJ3QgeW91CiBwcm9iYWJseSBuZWVkIGEgZG9jdG9yIHRvIGV4YW1pbmUgdGhlIElSQiAmIGV4dGVuZGVkIHN0YXR1cyB3b3JkIGV0Yy4KLUlmIGFuIGVycm9yIG9jY3VycywgbW9yZSBzb3BoaXN0b2NhdGVkIGNvbnRyb2wgdW5pdHMgaGF2ZSBhIGZhY2l0aXR5IGtub3duIGFzCitJZiBhbiBlcnJvciBvY2N1cnMsIG1vcmUgc29waGlzdGljYXRlZCBjb250cm9sIHVuaXRzIGhhdmUgYSBmYWNpbGl0eSBrbm93biBhcwogY29uY3VycmVudCBzZW5zZSB0aGlzIG1lYW5zIHRoYXQgaWYgYW4gZXJyb3Igb2NjdXJzIEV4dGVuZGVkIHNlbnNlIGluZm9ybWF0aW9uIHdpbGwKIGJlIHByZXNlbnRlZCBpbiB0aGUgRXh0ZW5kZWQgc3RhdHVzIHdvcmQgaW4gdGhlIElSQiBpZiBub3QgeW91IGhhdmUgdG8gaXNzdWUgYQogc3Vic2VxdWVudCBTRU5TRSBDQ1cgY29tbWFuZCBhZnRlciB0aGUgdGVzdCBzdWJjaGFubmVsLiAKQEAgLTE3NDksNyArMTc0OSw3IEBACiBUaGlzIGJ5dGUgd2lkZSBQYXJhbGxlbCBjaGFubmVsIHBhdGgvYnVzIGhhcyBwYXJpdHkgJiBkYXRhIG9uIHRoZSAiQnVzIiBjYWJsZSAKICYgY29udHJvbCBsaW5lcyBvbiB0aGUgIlRhZyIgY2FibGUuIFRoZXNlIGNhbiBvcGVyYXRlIGluIGJ5dGUgbXVsdGlwbGV4IG1vZGUgZm9yCiBzaGFyaW5nIGJldHdlZW4gc2V2ZXJhbCBzbG93IGRldmljZXMgb3IgYnVyc3QgbW9kZSAmIG1vbm9wb2xpemUgdGhlIGNoYW5uZWwgZm9yIHRoZQotd2hvbGUgYnVyc3QuIFVwdG8gMjU2IGRldmljZXMgY2FuIGJlIGFkZHJlc3NlZCAgb24gb25lIG9mIHRoZXNlIGNhYmxlcy4gVGhlc2UgY2FibGVzIGFyZQord2hvbGUgYnVyc3QuIFVwIHRvIDI1NiBkZXZpY2VzIGNhbiBiZSBhZGRyZXNzZWQgIG9uIG9uZSBvZiB0aGVzZSBjYWJsZXMuIFRoZXNlIGNhYmxlcyBhcmUKIGFib3V0IG9uZSBpbmNoIGluIGRpYW1ldGVyLiBUaGUgbWF4aW11bSB1bmV4dGVuZGVkIGxlbmd0aCBzdXBwb3J0ZWQgYnkgdGhlc2UgY2FibGVzIGlzCiAxMjUgTWV0ZXJzIGJ1dCB0aGlzIGNhbiBiZSBleHRlbmRlZCB1cCB0byAya20gd2l0aCBhIGZpYnJlIG9wdGljIGNoYW5uZWwgZXh0ZW5kZWQgCiBzdWNoIGFzIGEgMzA0NC4gVGhlIG1heGltdW0gYnVyc3Qgc3BlZWQgc3VwcG9ydGVkIGlzIDQuNSBtZWdhYnl0ZXMgcGVyIHNlY29uZCBob3dldmVyCkBAIC0xNzU5LDcgKzE3NTksNyBAQAogCiBFU0NPTiBpZiBmaWJyZSBvcHRpYyBpdCBpcyBhbHNvIGNhbGxlZCBGSUNPTiAKIFdhcyBpbnRyb2R1Y2VkIGJ5IElCTSBpbiAxOTkwLiBIYXMgMiBmaWJyZSBvcHRpYyBjYWJsZXMgJiB1c2VzIGVpdGhlciBsZWRzIG9yIGxhc2VycwotZm9yIGNvbW11bmljYXRpb24gYXQgYSBzaWduYWxpbmcgcmF0ZSBvZiB1cHRvIDIwMCBtZWdhYml0cy9zZWMuIEFzIDEwYml0cyBhcmUgdHJhbnNmZXJyZWQKK2ZvciBjb21tdW5pY2F0aW9uIGF0IGEgc2lnbmFsaW5nIHJhdGUgb2YgdXAgdG8gMjAwIG1lZ2FiaXRzL3NlYy4gQXMgMTBiaXRzIGFyZSB0cmFuc2ZlcnJlZAogZm9yIGV2ZXJ5IDggYml0cyBpbmZvIHRoaXMgZHJvcHMgdG8gMTYwIG1lZ2FiaXRzL3NlYyAmIHRvIDE4LjYgTWVnYWJ5dGVzL3NlYyBvbmNlCiBjb250cm9sIGluZm8gJiBDUkMgYXJlIGFkZGVkLiBFU0NPTiBvbmx5IG9wZXJhdGVzIGluIGJ1cnN0IG1vZGUuCiAgCkBAIC0xNzY3LDcgKzE3NjcsNyBAQAoga25vd24gYXMgWERGICggZXh0ZW5kZWQgZGlzdGFuY2UgZmFjaWxpdHkgKS4gVGhpcyBjYW4gYmUgZnVydGhlciBleHRlbmRlZCBieSB1c2luZyBhbgogRVNDT04gZGlyZWN0b3Igd2hpY2ggdHJpcGxlcyB0aGUgYWJvdmUgbWVudGlvbmVkIHJhbmdlcy4gVW5saWtlIEJ1cyAmIFRhZyBhcyBFU0NPTiBpcwogc2VyaWFsIGl0IHVzZXMgYSBwYWNrZXQgc3dpdGNoaW5nIGFyY2hpdGVjdHVyZSB0aGUgc3RhbmRhcmQgQnVzICYgVGFnIGNvbnRyb2wgcHJvdG9jb2wKLWlzIGhvd2V2ZXIgcHJlc2VudCB3aXRoaW4gdGhlIHBhY2tldHMuIFVwdG8gMjU2IGRldmljZXMgY2FuIGJlIGF0dGFjaGVkIHRvIGVhY2ggY29udHJvbCAKK2lzIGhvd2V2ZXIgcHJlc2VudCB3aXRoaW4gdGhlIHBhY2tldHMuIFVwIHRvIDI1NiBkZXZpY2VzIGNhbiBiZSBhdHRhY2hlZCB0byBlYWNoIGNvbnRyb2wKIHVuaXQgdGhhdCB1c2VzIG9uZSBvZiB0aGVzZSBpbnRlcmZhY2VzLgogCiBDb21tb24gMzkwIERldmljZXMgaW5jbHVkZToKQEAgLTIwNTAsNyArMjA1MCw3IEBACiAKIGRpcmVjdG9yeToKIEFkZHMgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIHNvdXJjZSBpZiBnZGIgY2Fubm90IGZpbmQgdGhlIHNvdXJjZS4KLShub3RlIGl0IGlzIGEgYml0IHNlbnNpdGl0aXZlIGFib3V0IHNsYXNoZXMpIAorKG5vdGUgaXQgaXMgYSBiaXQgc2Vuc2l0aXZlIGFib3V0IHNsYXNoZXMpCiBlLmcuIFRvIGFkZCB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSB0byB0aGUgc2VhcmNocGF0aCBkbwogZGlyZWN0b3J5IC8vCiAKQEAgLTIxNTIsNyArMjE1Miw3IEBACiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgogVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBpbiB0aGF0IGEgY3VzdG9tZXIgY2FuIG1haWwgYSBjb3JlIGR1bXAgdG8gYSB0ZWNobmljYWwgc3VwcG9ydCBkZXBhcnRtZW50CiAmIHRoZSB0ZWNobmljYWwgc3VwcG9ydCBkZXBhcnRtZW50IGNhbiByZWNvbnN0cnVjdCB3aGF0IGhhcHBlbmVkLgotUHJvdmlkZWQgdGhlIGhhdmUgYW4gaWRlbnRpY2FsIGNvcHkgb2YgdGhpcyBwcm9ncmFtIHdpdGggZGVidWdnaW5nIHN5bWJvbHMgY29tcGlsZWQgaW4gJiAKK1Byb3ZpZGVkIHRoZXkgaGF2ZSBhbiBpZGVudGljYWwgY29weSBvZiB0aGlzIHByb2dyYW0gd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scyBjb21waWxlZCBpbiAmCiB0aGUgc291cmNlIGJhc2Ugb2YgdGhpcyBidWlsZCBpcyBhdmFpbGFibGUuCiBJbiBzaG9ydCBpdCBpcyBmYXIgbW9yZSB1c2VmdWwgdGhhbiBzb21ldGhpbmcgbGlrZSBhIGNyYXNoIGxvZyBjb3VsZCBldmVyIGhvcGUgdG8gYmUuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQKaW5kZXggMzJhOTZjYy4uMDVhMmI0ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQKQEAgLTk4LDcgKzk4LDcgQEAKIExpbnV4LzM5MCBjb21tb24gZGV2aWNlIHN1cHBvcnQgKENEUykgcHJvdmlkZXMgdG8gYWxsb3cgZm9yIGRldmljZSBzcGVjaWZpYwogZHJpdmVyIGltcGxlbWVudGF0aW9ucyBvbiB0aGUgSUJNIEVTQS8zOTAgaGFyZHdhcmUgcGxhdGZvcm0uIFRob3NlIGludGVyZmFjZXMKIGludGVuZCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGJ5IGV2ZXJ5IGRldmljZSBkcml2ZXIKLWltcGxlbWVudGFpb24gdG8gYWxsb3cgdG8gZHJpdmUgYSBzcGVjaWZpYyBoYXJkd2FyZSBkZXZpY2Ugb24gdGhlIEVTQS8zOTAKK2ltcGxlbWVudGF0aW9uIHRvIGFsbG93IHRvIGRyaXZlIGEgc3BlY2lmaWMgaGFyZHdhcmUgZGV2aWNlIG9uIHRoZSBFU0EvMzkwCiBwbGF0Zm9ybS4gU29tZSBvZiB0aGUgaW50ZXJmYWNlIHJvdXRpbmVzIGFyZSBzcGVjaWZpYyB0byBMaW51eC8zOTAgYW5kIHNvbWUKIG9mIHRoZW0gY2FuIGJlIGZvdW5kIG9uIG90aGVyIExpbnV4IHBsYXRmb3JtcyBpbXBsZW1lbnRhdGlvbnMgdG9vLgogTWlzY2VsbGFuZW91cyBmdW5jdGlvbiBwcm90b3R5cGVzLCBkYXRhIGRlY2xhcmF0aW9ucywgYW5kIG1hY3JvIGRlZmluaXRpb25zCkBAIC0xMTQsNyArMTE0LDcgQEAKIHByb3ZpZGVzIGEgdW5pZmllZCB2aWV3IG9mIHRoZSBkZXZpY2VzIHBoeXNpY2FsbHkgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbXMuCiBUaG91Z2ggdGhlIEVTQS8zOTAgaGFyZHdhcmUgcGxhdGZvcm0ga25vd3MgYWJvdXQgYSBodWdlIHZhcmlldHkgb2YgZGlmZmVyZW50CiBwZXJpcGhlcmFsIGF0dGFjaG1lbnRzIGxpa2UgZGlzayBkZXZpY2VzIChha2EuIERBU0RzKSwgdGFwZXMsIGNvbW11bmljYXRpb24KLWNvbnRyb2xsZXJzLCBldGMuIHRoZXkgY2FuIGFsbCBieSBhY2Nlc3NlZCBieSBhIHdlbGwgZGVmaW5lZCBhY2Nlc3MgbWV0aG9kIGFuZAorY29udHJvbGxlcnMsIGV0Yy4gdGhleSBjYW4gYWxsIGJlIGFjY2Vzc2VkIGJ5IGEgd2VsbCBkZWZpbmVkIGFjY2VzcyBtZXRob2QgYW5kCiB0aGV5IGFyZSBwcmVzZW50aW5nIEkvTyBjb21wbGV0aW9uIGEgdW5pZmllZCB3YXkgOiBJL08gaW50ZXJydXB0aW9ucy4gRXZlcnkKIHNpbmdsZSBkZXZpY2UgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCB0byB0aGUgc3lzdGVtIGJ5IGEgc28gY2FsbGVkIHN1YmNoYW5uZWwsCiB3aGVyZSB0aGUgRVNBLzM5MCBhcmNoaXRlY3R1cmUgYWxsb3dzIGZvciA2NGsgZGV2aWNlcyBiZSBhdHRhY2hlZC4KQEAgLTMzOCw3ICszMzgsNyBAQAogVGhlIGNjd19kZXZpY2Vfc3RhcnQoKSBmdW5jdGlvbiByZXR1cm5zIDoKIAogICAgICAgMCAtIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvciByZXF1ZXN0IHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQKLS1FQlVTWSAgLSBUaGUgZGV2aWNlIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIGEgcHJldmlvdXMgSS9PIHJlcXVlc3QsIG9yIHRoZXIgaXMKKy1FQlVTWQktIFRoZSBkZXZpY2UgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBwcmV2aW91cyBJL08gcmVxdWVzdCwgb3IgdGhlcmUgaXMKICAgICAgICAgICBhIHN0YXR1cyBwZW5kaW5nIGF0IHRoZSBkZXZpY2UuCiAtRU5PREVWIC0gY2RldiBpcyBpbnZhbGlkLCB0aGUgZGV2aWNlIGlzIG5vdCBvcGVyYXRpb25hbCBvciB0aGUgY2N3X2RldmljZSBpcwogICAgICAgICAgIG5vdCBvbmxpbmUuCkBAIC0zNjEsNyArMzYxLDcgQEAKIC1FSU86ICAgICAgIHRoZSBjb21tb24gSS9PIGxheWVyIHRlcm1pbmF0ZWQgdGhlIHJlcXVlc3QgZHVlIHRvIGFuIGVycm9yIHN0YXRlCiAKIElmIHRoZSBjb25jdXJyZW50IHNlbnNlIGZsYWcgaW4gdGhlIGV4dGVuZGVkIHN0YXR1cyB3b3JkIGluIHRoZSBpcmIgaXMgc2V0LCB0aGUKLWZpZWxkIGlyYi0+c2Nzdy5jb3VudCBkZXNjcmliZXMgdGhlIG51bWVyIG9mIGRldmljZSBzcGVjaWZpYyBzZW5zZSBieXRlcworZmllbGQgaXJiLT5zY3N3LmNvdW50IGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIGRldmljZSBzcGVjaWZpYyBzZW5zZSBieXRlcwogYXZhaWxhYmxlIGluIHRoZSBleHRlbmRlZCBjb250cm9sIHdvcmQgaXJiLT5zY3N3LmVjd1swXS4gTm8gZGV2aWNlIHNlbnNpbmcgYnkKIHRoZSBkZXZpY2UgZHJpdmVyIGl0c2VsZiBpcyByZXF1aXJlZC4KIApAQCAtNDEwLDcgKzQxMCw3IEBACiAKIFRoZSBkZXZpY2UgZHJpdmVyIGlzIGFsbG93ZWQgdG8gaXNzdWUgdGhlIG5leHQgY2N3X2RldmljZV9zdGFydCgpIGNhbGwgZnJvbQogd2l0aGluIGl0cyBpbnRlcnJ1cHQgaGFuZGxlciBhbHJlYWR5LiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gc2NoZWR1bGUgYQotYm90dG9tLWhhbGYsIHVubGVzcyBhbiBub24gZGV0ZXJtaW5pc3RpY2FsbHkgbG9uZyBydW5uaW5nIGVycm9yIHJlY292ZXJ5IHByb2NlZHVyZQorYm90dG9tLWhhbGYsIHVubGVzcyBhIG5vbiBkZXRlcm1pbmlzdGljYWxseSBsb25nIHJ1bm5pbmcgZXJyb3IgcmVjb3ZlcnkgcHJvY2VkdXJlCiBvciBzaW1pbGFyIG5lZWRzIHRvIGJlIHNjaGVkdWxlZC4gRHVyaW5nIEkvTyBwcm9jZXNzaW5nIHRoZSBMaW51eC8zOTAgZ2VuZXJpYwogSS9PIGRldmljZSBkcml2ZXIgc3VwcG9ydCBoYXMgYWxyZWFkeSBvYnRhaW5lZCB0aGUgSVJRIGxvY2ssIGkuZS4gdGhlIGhhbmRsZXIKIG11c3Qgbm90IHRyeSB0byBvYnRhaW4gaXQgYWdhaW4gd2hlbiBjYWxsaW5nIGNjd19kZXZpY2Vfc3RhcnQoKSBvciB3ZSBlbmQgaW4gYQpAQCAtNDMxLDcgKzQzMSw3IEBACiBjYXNlIGFsbCBJL08gaW50ZXJydXB0aW9ucyBhcmUgcHJlc2VudGVkIHRvIHRoZSBkZXZpY2UgZHJpdmVyIHVudGlsIGZpbmFsCiBzdGF0dXMgaXMgcmVjb2duaXplZC4KIAotSWYgYSBkZXZpY2UgaXMgYWJsZSB0byByZWNvdmVyIGZyb20gYXN5bmNocm9ub3NseSBwcmVzZW50ZWQgSS9PIGVycm9ycywgaXQgY2FuCitJZiBhIGRldmljZSBpcyBhYmxlIHRvIHJlY292ZXIgZnJvbSBhc3luY2hyb25vdXNseSBwcmVzZW50ZWQgSS9PIGVycm9ycywgaXQgY2FuCiBwZXJmb3JtIG92ZXJsYXBwaW5nIEkvTyB1c2luZyB0aGUgRE9JT19FQVJMWV9OT1RJRklDQVRJT04gZmxhZy4gV2hpbGUgc29tZQogZGV2aWNlcyBhbHdheXMgcmVwb3J0IGNoYW5uZWwtZW5kIGFuZCBkZXZpY2UtZW5kIHRvZ2V0aGVyLCB3aXRoIGEgc2luZ2xlCiBpbnRlcnJ1cHQsIG90aGVycyBwcmVzZW50IHByaW1hcnkgc3RhdHVzIChjaGFubmVsLWVuZCkgd2hlbiB0aGUgY2hhbm5lbCBpcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2NyeXB0by9jcnlwdG8tQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9jcnlwdG8vY3J5cHRvLUFQSS50eHQKaW5kZXggMjlkZWU3OS4uNzFhZTZjYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL2NyeXB0by9jcnlwdG8tQVBJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY3J5cHRvL2NyeXB0by1BUEkudHh0CkBAIC0xNyw4ICsxNyw4IEBACiAyLiBQcm9iaW5nIGZvciBhdmFpbGFiaWxpdHkgb2YgTVNBCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIEtlcm5lbHMgd2l0aCB0aGUgejk5MCBjcnlwdG8gaW1wbGVtZW50YXRpb25zIGJvdGgKLW9uIG1hY2hpbmVzIHdpdGggTVNBIGF2YWlsYWJsZSBhbiBvbiB0aG9zZSB3aXRob3V0IE1TQSAocHJlIHo5OTAgb3Igejk5MAotd2l0aG91dCBNU0EpLiBUaGVyZWZvcmUgYSBzaW1wbGUgcHJvYmluZyBtZWNoYW5pc21zIGhhcyBiZWVuIGltcGxlbWVudGVkOgorb24gbWFjaGluZXMgd2l0aCBNU0EgYXZhaWxhYmxlIGFuZCBvbiB0aG9zZSB3aXRob3V0IE1TQSAocHJlIHo5OTAgb3Igejk5MAord2l0aG91dCBNU0EpLiBUaGVyZWZvcmUgYSBzaW1wbGUgcHJvYmluZyBtZWNoYW5pc20gaGFzIGJlZW4gaW1wbGVtZW50ZWQ6CiBJbiB0aGUgaW5pdCBmdW5jdGlvbiBvZiBlYWNoIGNyeXB0byBtb2R1bGUgdGhlIGF2YWlsYWJpbGl0eSBvZiBNU0EgYW5kIG9mIHRoZQogcmVzcGVjdGl2ZSBjcnlwdG8gYWxnb3JpdGhtIGluIHBhcnRpY3VsYXIgd2lsbCBiZSB0ZXN0ZWQuIElmIHRoZSBhbGdvcml0aG0gaXMKIGF2YWlsYWJsZSB0aGUgbW9kdWxlIHdpbGwgbG9hZCBhbmQgcmVnaXN0ZXIgaXRzIGFsZ29yaXRobSB3aXRoIHRoZSBjcnlwdG8gQVBJLgpAQCAtMjYsNyArMjYsNyBAQAogSWYgdGhlIHJlc3BlY3RpdmUgY3J5cHRvIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgaW5pdCBmdW5jdGlvbiB3aWxsCiByZXR1cm4gLUVOT1NZUy4gSW4gdGhhdCBjYXNlIGEgZmFsbGJhY2sgdG8gdGhlIHN0YW5kYXJkIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCiBvZiB0aGUgY3J5cHRvIGFsZ29yaXRobSBtdXN0IGJlIHRha2VuICggLT4gdGhlIHN0YW5kYXJkIGNyeXB0byBtb2R1bGVzIGFyZQotYWxzbyBidWlsZCB3aGVuIGNvbXBpbGluZyB0aGUga2VybmVsKS4KK2Fsc28gYnVpbHQgd2hlbiBjb21waWxpbmcgdGhlIGtlcm5lbCkuCiAKIAogMy4gRW5zdXJpbmcgejk5MCBjcnlwdG8gbW9kdWxlIHByZWZlcmVuY2UKQEAgLTc1LDggKzc1LDggQEAKIAogLSBTSEExIERpZ2VzdCBBbGdvcml0aG0gW3NoYTEgLT4gc2hhMV96OTkwXQogLSBERVMgRW5jcnlwdC9EZWNyeXB0IEFsZ29yaXRobSAoNjRiaXQga2V5KSBbZGVzIC0+IGRlc196OTkwXQotLSBUcmlwcGxlIERFUyBFbmNyeXB0L0RlY3J5cHQgQWxnb3JpdGhtICgxMjhiaXQga2V5KSBbZGVzM19lZGUxMjggLT4gZGVzX3o5OTBdCi0tIFRyaXBwbGUgREVTIEVuY3J5cHQvRGVjcnlwdCBBbGdvcml0aG0gKDE5MmJpdCBrZXkpIFtkZXMzX2VkZSAtPiBkZXNfejk5MF0KKy0gVHJpcGxlIERFUyBFbmNyeXB0L0RlY3J5cHQgQWxnb3JpdGhtICgxMjhiaXQga2V5KSBbZGVzM19lZGUxMjggLT4gZGVzX3o5OTBdCistIFRyaXBsZSBERVMgRW5jcnlwdC9EZWNyeXB0IEFsZ29yaXRobSAoMTkyYml0IGtleSkgW2RlczNfZWRlIC0+IGRlc196OTkwXQogCiBJbiBvcmRlciB0byBsb2FkLCBmb3IgZXhhbXBsZSwgdGhlIHNoYTFfejk5MCBtb2R1bGUgd2hlbiB0aGUgc2hhMSBhbGdvcml0aG0gaXMKIHJlcXVlc3RlZCAoc2VlIDMuMi4pIGFkZCAnYWxpYXMgc2hhMSBzaGExX3o5OTAnIHRvIC9ldGMvbW9kcHJvYmUuY29uZi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAppbmRleCAwMDAyMzBjLi4wZWI3YzU4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CkBAIC0zNiw3ICszNiw3IEBACiB0aGF0IHRoZSByZWNvcmRzIHdoaWNoIGRlc2NyaWJlIHRoZSBvcmlnaW4gb2YgdGhlIGV4Y2VwdGlvbiBhcmUgbm90CiBvdmVyd3JpdHRlbiB3aGVuIGEgd3JhcCBhcm91bmQgZm9yIHRoZSBjdXJyZW50IGFyZWEgb2NjdXJzLgogCi1UaGUgZGVidWcgYXJlYXMgaXRzZWx2ZSBhcmUgYWxzbyBvcmRlcmVkIGluIGZvcm0gb2YgYSByaW5nIGJ1ZmZlci4gCitUaGUgZGVidWcgYXJlYXMgdGhlbXNlbHZlcyBhcmUgYWxzbyBvcmRlcmVkIGluIGZvcm0gb2YgYSByaW5nIGJ1ZmZlci4KIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgbGFzdCBkZWJ1ZyBhcmVhLCB0aGUgZm9sbG93aW5nIGRlYnVnIAogZW50cmllcyBhcmUgdGhlbiB3cml0dGVuIGFnYWluIGluIHRoZSB2ZXJ5IGZpcnN0IGFyZWEuCiAKQEAgLTU1LDcgKzU1LDcgQEAKIHRoZSBkZWJ1Z2ZzLWZpbGVzeXN0ZW0uIFVuZGVyIHRoZSB0b3BsZXZlbCBkaXJlY3RvcnkgInMzOTBkYmYiIHRoZXJlIGlzCiBhIGRpcmVjdG9yeSBmb3IgZWFjaCByZWdpc3RlcmVkIGNvbXBvbmVudCwgd2hpY2ggaXMgbmFtZWQgbGlrZSB0aGUKIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50LiBUaGUgZGVidWdmcyBub3JtYWxseSBzaG91bGQgYmUgbW91bnRlZCB0bwotL3N5cy9rZXJuZWwvZGVidWcgdGhlcmVmb3JlIHRoZSBkZWJ1ZyBmZWF0dXJlIGNhbiBiZSBhY2Nlc3NlZCB1bnRlcgorL3N5cy9rZXJuZWwvZGVidWcgdGhlcmVmb3JlIHRoZSBkZWJ1ZyBmZWF0dXJlIGNhbiBiZSBhY2Nlc3NlZCB1bmRlcgogL3N5cy9rZXJuZWwvZGVidWcvczM5MGRiZi4KIAogVGhlIGNvbnRlbnQgb2YgdGhlIGRpcmVjdG9yaWVzIGFyZSBmaWxlcyB3aGljaCByZXByZXNlbnQgZGlmZmVyZW50IHZpZXdzCkBAIC04NywxMSArODcsMTEgQEAKIGdsb2JhbGx5LiBUaGUgZmlyc3QgcG9zc2liaWxpdHkgaXMgdG8gdXNlIHRoZSAiZGVidWdfYWN0aXZlIiBzeXNjdGwuIElmCiBzZXQgdG8gMSB0aGUgZGVidWcgZmVhdHVyZSBpcyBydW5uaW5nLiBJZiAiZGVidWdfYWN0aXZlIiBpcyBzZXQgdG8gMCB0aGUKIGRlYnVnIGZlYXR1cmUgaXMgdHVybmVkIG9mZi4KLVRoZSBzZWNvbmQgdHJpZ2dlciB3aGljaCBzdG9wcyB0aGUgZGVidWcgZmVhdHVyZSBpcyBhbiBrZXJuZWwgb29wcy4KK1RoZSBzZWNvbmQgdHJpZ2dlciB3aGljaCBzdG9wcyB0aGUgZGVidWcgZmVhdHVyZSBpcyBhIGtlcm5lbCBvb3BzLgogVGhhdCBwcmV2ZW50cyB0aGUgZGVidWcgZmVhdHVyZSBmcm9tIG92ZXJ3cml0aW5nIGRlYnVnIGluZm9ybWF0aW9uIHRoYXQKIGhhcHBlbmVkIGJlZm9yZSB0aGUgb29wcy4gQWZ0ZXIgYW4gb29wcyB5b3UgY2FuIHJlYWN0aXZhdGUgdGhlIGRlYnVnIGZlYXR1cmUKIGJ5IHBpcGluZyAxIHRvIC9wcm9jL3N5cy9zMzkwZGJmL2RlYnVnX2FjdGl2ZS4gTmV2ZXJ0aGVsZXNzLCBpdHMgbm90Ci1zdWdnZXN0ZWQgdG8gdXNlIGFuIG9vcHNlZCBrZXJuZWwgaW4gYW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4KK3N1Z2dlc3RlZCB0byB1c2UgYW4gb29wc2VkIGtlcm5lbCBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuCiBJZiB5b3Ugd2FudCB0byBkaXNhbGxvdyB0aGUgZGVhY3RpdmF0aW9uIG9mIHRoZSBkZWJ1ZyBmZWF0dXJlLCB5b3UgY2FuIHVzZQogdGhlICJkZWJ1Z19zdG9wcGFibGUiIHN5c2N0bC4gSWYgeW91IHNldCAiZGVidWdfc3RvcHBhYmxlIiB0byAwIHRoZSBkZWJ1ZwogZmVhdHVyZSBjYW5ub3QgYmUgc3RvcHBlZC4gSWYgdGhlIGRlYnVnIGZlYXR1cmUgaXMgYWxyZWFkeSBzdG9wcGVkLCBpdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzc5eHgudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzc5eHgudHh0CmluZGV4IDkwNGQ0OWUuLjZhYTlhODkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9haWM3OXh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljNzl4eC50eHQKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAtIENvcnJlY3QgYSByZWZlcmVuY2UgdG8gZnJlZSdlZCBtZW1vcnkgZHVyaW5nIGNvbnRyb2xsZXIKICAgICAgICAgICBzaHV0ZG93bi4KICAgICAgICAgLSBSZXNldCB0aGUgYnVzIG9uIGFuIFNFLT5MVkQgY2hhbmdlLiAgVGhpcyBpcyByZXF1aXJlZAotICAgICAgICAgIHRvIHJlc2V0IG91ciB0cmFuc2NpZXZlcnMuCisgICAgICAgICAgdG8gcmVzZXQgb3VyIHRyYW5zY2VpdmVycy4KIAogICAgMS4zLjUgKE1hcmNoIDI0dGgsIDIwMDMpCiAgICAgICAgIC0gRml4IGEgZmV3IHJlZ2lzdGVyIHdpbmRvdyBtb2RlIGJ1Z3MuCkBAIC0xNjksNyArMTY5LDcgQEAKICAgIDEuMy4wIChKYW51YXJ5IDIxc3QsIDIwMDMpCiAgICAgICAgIC0gRnVsbCByZWdyZXNzaW9uIHRlc3RpbmcgZm9yIGFsbCBVMzIwIHByb2R1Y3RzIGNvbXBsZXRlZC4KICAgICAgICAgLSBBZGRlZCBhYm9ydCBhbmQgdGFyZ2V0L2x1biByZXNldCBlcnJvciByZWNvdmVyeSBoYW5kbGVyIGFuZAotICAgICAgICAgIGludGVycnVwdCBjb2FsZXNzaW5nLgorICAgICAgICAgIGludGVycnVwdCBjb2FsZXNjaW5nLgogCiAgICAxLjIuMCAoTm92ZW1iZXIgMTR0aCwgMjAwMikKICAgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBEb21haW4gVmFsaWRhdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHhfb2xkLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4X29sZC50eHQKaW5kZXggYzkyZjQ0Ny4uMDU2NjdlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHhfb2xkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eF9vbGQudHh0CkBAIC0yNTYsNyArMjU2LDcgQEAKIAkgICAgICBFbi9EaXNhYmxlIEhpZ2ggQnl0ZSBMVkQgVGVybWluYXRpb24KIAogCVRoZSB1cHBlciAyIGJpdHMgdGhhdCBkZWFsIHdpdGggTFZEIHRlcm1pbmF0aW9uIG9ubHkgYXBwbHkgdG8gVWx0cmEyCi0JY29udHJvbGxlcnMuICBGdXRoZXJtb3JlLCBkdWUgdG8gdGhlIGN1cnJlbnQgVWx0cmEyIGNvbnRyb2xsZXIKKwljb250cm9sbGVycy4gIEZ1cnRoZXJtb3JlLCBkdWUgdG8gdGhlIGN1cnJlbnQgVWx0cmEyIGNvbnRyb2xsZXIKIAlkZXNpZ25zLCB0aGVzZSBiaXRzIGFyZSB0aWVkIHRvZ2V0aGVyIHN1Y2ggdGhhdCBzZXR0aW5nIGVpdGhlciBiaXQKIAllbmFibGVzIGJvdGggbG93IGFuZCBoaWdoIGJ5dGUgTFZEIHRlcm1pbmF0aW9uLiAgSXQgaXMgbm90IHBvc3NpYmxlCiAJdG8gb25seSBzZXQgaGlnaCBvciBsb3cgYnl0ZSBMVkQgdGVybWluYXRpb24gaW4gdGhpcyBtYW5uZXIuICBUaGlzIGlzCkBAIC00MzYsNyArNDM2LDcgQEAKICAgICB0aGUgY29tbWFzIHRvIHBlcmlvZHMsIGluc21vZCB3b24ndCBpbnRlcnByZXQgdGhpcyBhcyBtb3JlIHRoYW4gb25lCiAgICAgc3RyaW5nIGFuZCB3cml0ZSBqdW5rIGludG8gb3VyIGJpbmFyeSBpbWFnZS4gIEkgY29uc2lkZXIgaXQgYSBidWcgaW4KICAgICB0aGUgaW5zbW9kIHByb2dyYW0gdGhhdCBldmVuIGlmIHlvdSB3cmFwIHlvdXIgc3RyaW5nIGluIHF1b3RlcyAocXVvdGVzCi0gICAgdGhhdCBwYXNzIHRoZSBzaGVsbCBtaW5kIHlvdSBhbmQgdGhhdCBpbnNtb2Qgc2VlcykgaXQgc3RpbGwgdHJlYXRlcworICAgIHRoYXQgcGFzcyB0aGUgc2hlbGwgbWluZCB5b3UgYW5kIHRoYXQgaW5zbW9kIHNlZXMpIGl0IHN0aWxsIHRyZWF0cwogICAgIGEgY29tbWEgaW5zaWRlIG9mIHRob3NlIHF1b3RlcyBhcyBzdGFydGluZyBhIG5ldyB2YXJpYWJsZSwgcmVzdWx0aW5nCiAgICAgaW4gbWVtb3J5IHNjcmliYmxlcyBpZiB5b3UgZG9uJ3Qgc3dpdGNoIHRoZSBjb21tYXMgdG8gcGVyaW9kcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2libW1jYS50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dAppbmRleCAzNWY2YjhlLi45NzA3OTQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dApAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgICBUaGlzIG5lZWRzIHRoZSBSRC1CaXQgdG8gYmUgZGlzYWJsZWQgb24gSU1fT1RIRVJfU0NTSV9DTURfQ01EIHdoaWNoIAogICAgICAgYWxsb3dzIGRhdGEgdG8gYmUgd3JpdHRlbiBmcm9tIHRoZSBzeXN0ZW0gdG8gdGhlIGRldmljZS4gSXQgaXMgYQogICAgICAgbmVjZXNzYXJ5IHN0ZXAgdG8gYmUgYWxsb3dlZCB0byBzZXQgYmxvY2tzaXplIG9mIFNDU0ktdGFwZS1kcml2ZXMgYW5kIAotICAgICAgdGhlIHRhcGUtc3BlZWQsIHdoaXRob3V0IGNvbmZ1c2luZyB0aGUgU0NTSS1TdWJzeXN0ZW0uCisgICAgICB0aGUgdGFwZS1zcGVlZCwgd2l0aG91dCBjb25mdXNpbmcgdGhlIFNDU0ktU3Vic3lzdGVtLgogICAgMikgVGhlIHJlY29nbml0aW9uIG9mIGEgdGFwZSBpcyBpbmNsdWRlZCBpbiB0aGUgY2hlY2tfZGV2aWNlcyByb3V0aW5lLgogICAgICAgVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIGZvciBUWVBFX1RBUEUsIHRoYXQgaXMgYWxyZWFkeSBkZWZpbmVkIGluCiAgICAgICB0aGUga2VybmVsLXNjc2ktZW52aXJvbm1lbnQuIFRoZSBtYXJrdXAgb2YgYSB0YXBlIGlzIGRvbmUgaW4gdGhlIApAQCAtNzEwLDggKzcxMCw4IEBACiAgICAgICBvZiB0cm91YmxlcyB3aXRoIHNvbWUgY29udHJvbGxlcnMgYW5kIGFmdGVyIEkgd2FudGVkIHRvIGFwcGx5IHNvbWUKICAgICAgIGV4dGVuc2lvbnMsIGl0IGp1bXBlZCBvdXQgaW4gdGhlIHNhbWUgc2l0dWF0aW9uLCBvbiBteSB3L2NhY2hlLCBhcyBsaWtlIAogICAgICAgb24gRC4gV2VpbmVoYWxscycgTW9kZWwgNTYsIGhhdmluZyBpbnRlZ3JhdGVkIFNDU0kuIFRoaXMgZ2F2ZSBtZSB0aGUgCi0gICAgICBkZXNjaXNzaXZlIGhpbnQgdG8gbW92ZSB0aGUgY29kZS1wYXJ0IG91dCBhbmQgZGVjbGFyZSBpdCBnbG9iYWwuIE5vdywKLSAgICAgIGl0IHNlZW1zIHRvIHdvcmsgYnkgZmFyIG11Y2ggYmV0dGVyIGFuIG1vcmUgc3RhYmxlLiBMZXQgdXMgc2VlLCB3aGF0CisgICAgICBkZWNpc2l2ZSBoaW50IHRvIG1vdmUgdGhlIGNvZGUtcGFydCBvdXQgYW5kIGRlY2xhcmUgaXQgZ2xvYmFsLiBOb3cKKyAgICAgIGl0IHNlZW1zIHRvIHdvcmsgZmFyIGJldHRlciBhbmQgbW9yZSBzdGFibGUuIExldCB1cyBzZWUgd2hhdAogICAgICAgdGhlIHdvcmxkIHRoaW5rcyBvZiBpdC4uLgogICAgMykgQnkgdGhlIHdheSwgb25seSBTb255IERBVC1kcml2ZXMgc2VlbSB0byBzaG93IGRlbnNpdHkgY29kZSAweDEzLiBBCiAgICAgICB0ZXN0IHdpdGggYSBIUCBkcml2ZSBnYXZlIHJpZ2h0IHJlc3VsdHMsIHNvIHRoZSBwcm9ibGVtIGlzIHZlbmRvci0KQEAgLTgyMiwxMCArODIyLDEwIEBACiAgICBBIGxvbmcgcGVyaW9kIG9mIGNvbGxlY3RpbmcgYnVncmVwb3J0cyBmcm9tIGFsbCBjb3JuZXJzIG9mIHRoZSB3b3JsZAogICAgbm93IGxlYWQgdG8gdGhlIGZvbGxvd2luZyBjb3JyZWN0aW9ucyB0byB0aGUgY29kZToKICAgIDEpIFNDU0ktMiBGL1cgc3VwcG9ydCBjcmFzaGVkIHdpdGggYSBDT01NQU5EIEVSUk9SLiBUaGUgcmVhc29uIGZvciB0aGlzIAotICAgICAgd2FzLCB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGRpc2JhbGUgRmFzdC1TQ1NJIGZvciB0aGUgZXh0ZXJuYWwgYnVzLgotICAgICAgVGhlIGZlYXR1cmUtY29udHJvbCBjb21tYW5kLCB3aGVyZSB0aGlzIGNyYXNoIGFwcGVhcmVkIHJlZ3VsYXJseSB0cmllZAorICAgICAgd2FzIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSBGYXN0LVNDU0kgZm9yIHRoZSBleHRlcm5hbCBidXMuCisgICAgICBUaGUgZmVhdHVyZS1jb250cm9sIGNvbW1hbmQsIHdoZXJlIHRoaXMgY3Jhc2ggYXBwZWFyZWQgcmVndWxhcmx5LCB0cmllZAogICAgICAgdG8gc2V0IHRoZSBtYXhpbXVtIHNwZWVkIG9mIDEwTUh6IHN5bmNocm9ub3VzIHRyYW5zZmVyIHNwZWVkIGFuZCB0aGF0Ci0gICAgICByZXBvcnRzIGEgQ09NTUFORCBFUlJPUiwgaWYgZXh0ZXJuYWwgYnVzIEZhc3QtU0NTSSBpcyBkaXNhYmxlZC4gTm93LAorICAgICAgcmVwb3J0cyBhIENPTU1BTkQgRVJST1IgaWYgZXh0ZXJuYWwgYnVzIEZhc3QtU0NTSSBpcyBkaXNhYmxlZC4gTm93LAogICAgICAgdGhlIGZlYXR1cmUtY29tbWFuZCBwcm9iZXMgZG93biBmcm9tIG1heGltdW0gc3BlZWQgdW50aWwgdGhlIGFkYXB0ZXIgCiAgICAgICBzdG9wcyB0byBjb21wbGFpbiwgd2hpY2ggaXMgYXQgdGhlIHNhbWUgdGltZSB0aGUgbWF4aW11bSBwb3NzaWJsZQogICAgICAgc3BlZWQgc2VsZWN0ZWQgaW4gdGhlIHJlZmVyZW5jZSBwcm9ncmFtLiBTbywgRi9XIGV4dGVybmFsIGNhbiBydW4gYXQKQEAgLTkyMCw3ICs5MjAsNyBAQAogICAgICAgY29tcGxldGVkIGluIHN1Y2ggYSB3YXksIHRoYXQgdGhleSBhcmUgbm93IGNvbXBsZXRlbHkgY29uZm9ybSB0byB0aGUKICAgICAgIGRlbWFuZHMgaW4gdGhlIHRlY2huaWNhbCBkZXNjcmlwdGlvbiBvZiBJQk0uIE1haW4gY2FuZGlkYXRlcyB3ZXJlIHRoZQogICAgICAgREVWSUNFX0lOUVVJUlksIFJFUVVFU1RfU0VOU0UgYW5kIERFVklDRV9DQVBBQ0lUWSBjb21tYW5kcy4gVGhleSBtdXN0Ci0gICAgICBiZSB0cmFuZmVycmVkIGJ5IGJ5cGFzc2luZyB0aGUgaW50ZXJuYWwgY29tbWFuZCBidWZmZXIgb2YgdGhlIGFkYXB0ZXIKKyAgICAgIGJlIHRyYW5zZmVycmVkIGJ5IGJ5cGFzc2luZyB0aGUgaW50ZXJuYWwgY29tbWFuZCBidWZmZXIgb2YgdGhlIGFkYXB0ZXIKICAgICAgIG9yIGVsc2UgdGhlIHJlc3BvbnNlIGNhbiBiZSBhIHJhbmRvbSByZXN1bHQuIEdFVF9QT1NfSU5GTyB3b3VsZCBiZSBtb3JlCiAgICAgICBzYWZlIGluIHVzYWdlLCBpZiBvbmUgY291bGQgdXNlIHRoZSBTVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCwgYnV0IHRoaXMKICAgICAgIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSB0ZWNobmljYWwgcmVmZXJlbmNlcyBvZiBJQk0uIChTb3JyeSwgZm9sa3MsIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2luMjAwMC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dAppbmRleCA4MGYxMDQwLi5jM2UyYTkwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dApAQCAtMjQsNyArMjQsNyBAQAogVVBEQVRFIE5FV1M6IHZlcnNpb24gMS4zMSAtIDYgSnVsIDk3CiAKICAgIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGluY29ycmVjdCBTQ1NJIHN0YXR1cyBieXRlcyB0byBiZQotICAgcmV0dXJuZWQgZnJvbSBjb21tYW5kcyBzZW50IHRvIExVTidzIGdyZWF0ZXIgdGhhbiAwLiBUaGlzCisgICByZXR1cm5lZCBmcm9tIGNvbW1hbmRzIHNlbnQgdG8gTFVOcyBncmVhdGVyIHRoYW4gMC4gVGhpcwogICAgbWVhbnMgdGhhdCBDRFJPTSBjaGFuZ2VycyB3b3JrIG5vdyEgRml4ZWQgYSBidWcgaW4gdGhlCiAgICBoYW5kbGluZyBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlLgogICAgQWxzbyBwdXQgYWxsIHRoZSBoZWFkZXIgZGF0YSBpbiBpbjIwMDAuaCB3aGVyZSBpdCBiZWxvbmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2xpYnNhcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvbGlic2FzLnR4dAppbmRleCA5ZTIwNzhiLi5hYTU0ZjU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvbGlic2FzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvbGlic2FzLnR4dApAQCAtMzkzLDcgKzM5Myw3IEBACiAJdGFza19wcm90byAtLSBfb25lXyBvZiBlbnVtIHNhc19wcm90bwogCXNjYXR0ZXIgLS0gcG9pbnRlciB0byBzY2F0dGVyIGdhdGhlciBsaXN0IGFycmF5CiAJbnVtX3NjYXR0ZXIgLS0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHNjYXR0ZXIKLQl0b3RhbF94ZmVyX2xlbiAtLSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgdG8gYmUgdHJhbnNmZXJlZAorCXRvdGFsX3hmZXJfbGVuIC0tIHRvdGFsIG51bWJlciBvZiBieXRlcyBleHBlY3RlZCB0byBiZSB0cmFuc2ZlcnJlZAogCWRhdGFfZGlyIC0tIFBDSV9ETUFfLi4uCiAJdGFza19kb25lIC0tIGNhbGxiYWNrIHdoZW4gdGhlIHRhc2sgaGFzIGZpbmlzaGVkIGV4ZWN1dGlvbgogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9uY3I1M2M4eHgudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQKaW5kZXggNThhZDhkYi4uY2FmMTBiMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAgICAgICAgICAgZnRwOi8vZnRwLnN5bWJpb3MuY29tLwogCi1Vc2VmdWxsIFNDU0kgdG9vbHMgd3JpdHRlbiBieSBFcmljIFlvdW5nZGFsZSBhcmUgYXZhaWxhYmxlIGF0IHRzeC0xMToKK1VzZWZ1bCBTQ1NJIHRvb2xzIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgYXJlIGF2YWlsYWJsZSBhdCB0c3gtMTE6CiAKICAgICAgICAgICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvc2NzaS9zY3NpaW5mby1YLlkudGFyLmd6CiAgICAgICAgICAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL3Njc2kvc2NzaWRldi1YLlkudGFyLmd6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1jaGFuZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLWNoYW5nZXIudHh0CmluZGV4IGQ3NGJiZDIuLjAzMjM5OWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLWNoYW5nZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLWNoYW5nZXIudHh0CkBAIC04OCw3ICs4OCw3IEBACiBkZXZpY2UgWyB0cnkgImRtZXNnIiBpZiB5b3UgZG9uJ3Qgc2VlIGFueXRoaW5nIF0gYW5kIHNob3VsZCBzaG93IHVwIGluCiAvcHJvYy9kZXZpY2VzLiBJZiBub3QuLi4uICBzb21lIGNoYW5nZXJzIHVzZSBJRCA/IC8gTFVOIDAgZm9yIHRoZQogZGV2aWNlIGFuZCBJRCA/IC8gTFVOIDEgZm9yIHRoZSByb2JvdCBtZWNoYW5pc20uIEJ1dCBMaW51eCBkb2VzICpub3QqCi1sb29rIGZvciBMVU4ncyBvdGhlciB0aGFuIDAgYXMgZGVmYXVsdCwgYmVjYXVjZSB0aGVyZSBhcmUgdG8gbWFueQorbG9vayBmb3IgTFVOcyBvdGhlciB0aGFuIDAgYXMgZGVmYXVsdCwgYmVjYXVzZSB0aGVyZSBhcmUgdG9vIG1hbnkKIGJyb2tlbiBkZXZpY2VzLiBTbyB5b3UgY2FuIHRyeToKIAogICAxKSBlY2hvICJzY3NpIGFkZC1zaW5nbGUtZGV2aWNlIDAgMCBJRCAxIiA+IC9wcm9jL3Njc2kvc2NzaQpAQCAtMTA3LDcgKzEwNyw3IEBACiBzdHJpbmdzIHRoZW4uCiAKIFlvdSBjYW4gZGlzcGxheSB0aGVzZSBtZXNzYWdlcyB3aXRoIHRoZSBkbWVzZyBjb21tYW5kIChvciBjaGVjayB0aGUKLWxvZ2ZpbGVzKS4gIElmIHlvdSBlbWFpbCBtZSBzb21lIHF1ZXN0aW9uIGJlY2F1Y2Ugb2YgYSBwcm9ibGVtIHdpdGggdGhlCitsb2dmaWxlcykuICBJZiB5b3UgZW1haWwgbWUgc29tZSBxdWVzdGlvbiBiZWNhdXNlIG9mIGEgcHJvYmxlbSB3aXRoIHRoZQogZHJpdmVyLCBwbGVhc2UgaW5jbHVkZSB0aGVzZSBtZXNzYWdlcy4KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9laC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9laC50eHQKaW5kZXggYjk2NGVlZi4uN2FjYmViYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZWgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2VoLnR4dApAQCAtNzUsNyArNzUsNyBAQAogCiAgLSBvdGhlcndpc2UKIAlzY3NpX2VoX3NjbWRfYWRkKHNjbWQsIDApIGlzIGludm9rZWQgZm9yIHRoZSBjb21tYW5kLiAgU2VlCi0JWzEtM10gZm9yIGRldGFpbHMgb2YgdGhpcyBmdW5jaXRvbi4KKwlbMS0zXSBmb3IgZGV0YWlscyBvZiB0aGlzIGZ1bmN0aW9uLgogCiAKIFsxLTItMl0gQ29tcGxldGluZyBhIHNjbWQgdy8gdGltZW91dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zdC50eHQKaW5kZXggNWZmNjViMS4uM2MxMjQyMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc3QudHh0CkBAIC0yNjEsNyArMjYxLDcgQEAKIHVzZWQgaW5zdGVhZCBvZiB0aGUgZXF1YWwgbWFyay4gVGhlIGRlZmluaXRpb24gaXMgcHJlcGVuZGVkIGJ5IHRoZQogc3RyaW5nIHN0PS4gSGVyZSBpcyBhbiBleGFtcGxlOgogCi0Jc3Q9YnVmZmVyX2ticzo2NCx3cml0ZV90aHJlaG9sZF9rYnM6NjAKKwlzdD1idWZmZXJfa2JzOjY0LHdyaXRlX3RocmVzaG9sZF9rYnM6NjAKIAogVGhlIGZvbGxvd2luZyBzeW50YXggdXNlZCBieSB0aGUgb2xkIGtlcm5lbCB2ZXJzaW9ucyBpcyBhbHNvIHN1cHBvcnRlZDoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N5bTUzYzh4eF8yLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zeW01M2M4eHhfMi50eHQKaW5kZXggMjZjOGEwOC4uMmMxNzQ1YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N5bTUzYzh4eF8yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc3ltNTNjOHh4XzIudHh0CkBAIC02MDksNyArNjA5LDcgQEAKIGJlIHN1cmUgSSB3aWxsIHJlY2VpdmUgaXQuICBPYnZpb3VzbHksIGEgYnVnIGluIHRoZSBkcml2ZXIgY29kZSBpcwogcG9zc2libGUuCiAKLSAgTXkgY3lycmVudCBlbWFpbCBhZGRyZXNzOiBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAgTXkgY3VycmVudCBlbWFpbCBhZGRyZXNzOiBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KIAogQWxsb3dpbmcgZGlzY29ubmVjdGlvbnMgaXMgaW1wb3J0YW50IGlmIHlvdSB1c2Ugc2V2ZXJhbCBkZXZpY2VzIG9uCiB5b3VyIFNDU0kgYnVzIGJ1dCBvZnRlbiBjYXVzZXMgcHJvYmxlbXMgd2l0aCBidWdneSBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zaGFyZWRzdWJ0cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vc2hhcmVkc3VidHJlZS50eHQKaW5kZXggMmQ4ZjQwMy4uY2NmMWNlYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zaGFyZWRzdWJ0cmVlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NoYXJlZHN1YnRyZWUudHh0CkBAIC05NDIsMTMgKzk0MiwxMyBAQAogCS0+bW50X3NsYXZlCiAJLT5tbnRfbWFzdGVyCiAKLQktPm1udF9zaGFyZSBsaW5rcyB0b2dhdGhlciBhbGwgdGhlIG1vdW50IHRvL2Zyb20gd2hpY2ggdGhpcyB2ZnNtb3VudAorCS0+bW50X3NoYXJlIGxpbmtzIHRvZ2V0aGVyIGFsbCB0aGUgbW91bnQgdG8vZnJvbSB3aGljaCB0aGlzIHZmc21vdW50CiAJCXNlbmQvcmVjZWl2ZXMgcHJvcGFnYXRpb24gZXZlbnRzLgogCiAJLT5tbnRfc2xhdmVfbGlzdCBsaW5rcyBhbGwgdGhlIG1vdW50cyB0byB3aGljaCB0aGlzIHZmc21vdW50IHByb3BhZ2F0ZXMKIAkJdG8uCiAKLQktPm1udF9zbGF2ZSBsaW5rcyB0b2dhdGhlciBhbGwgdGhlIHNsYXZlcyB0aGF0IGl0cyBtYXN0ZXIgdmZzbW91bnQKKwktPm1udF9zbGF2ZSBsaW5rcyB0b2dldGhlciBhbGwgdGhlIHNsYXZlcyB0aGF0IGl0cyBtYXN0ZXIgdmZzbW91bnQKIAkJcHJvcGFnYXRlcyB0by4KIAogCS0+bW50X21hc3RlciBwb2ludHMgdG8gdGhlIG1hc3RlciB2ZnNtb3VudCBmcm9tIHdoaWNoIHRoaXMgdmZzbW91bnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggMzQ3MmQ5Yy4uOWZlZjIxMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTk1NSw3ICs5NTUsNyBAQAogCQkgIGRteDZmaXJlLCBkc3AyNCwgZHNwMjRfdmFsdWUsIGRzcDI0XzcxLCBlejgsCiAJCSAgcGhhc2U4OCwgbWVkaWFzdGF0aW9uCiAgICAgb21uaQktIE9tbmkgSS9PIHN1cHBvcnQgZm9yIE1pZGlNYW4gTS1BdWRpbyBEZWx0YTQ0LzY2Ci0gICAgY3M4NDI3X3RpbWVvdXQgLSByZXNldCB0aW1lb3V0IGZvciB0aGUgQ1M4NDI3IGNoaXAgKFMvUERJRiB0cmFuc2NpZXZlcikKKyAgICBjczg0MjdfdGltZW91dCAtIHJlc2V0IHRpbWVvdXQgZm9yIHRoZSBDUzg0MjcgY2hpcCAoUy9QRElGIHRyYW5zY2VpdmVyKQogICAgICAgICAgICAgICAgICAgICAgaW4gbXNlYyByZXNvbHV0aW9uLCBkZWZhdWx0IHZhbHVlIGlzIDUwMCAoMC41IHNlYykKIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGNhcmRzIGFuZCBhdXRvcHJvYmUuIE5vdGU6IFRoZSBjb25zdW1lciBwYXJ0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQXVkaWd5LW1peGVyLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BdWRpZ3ktbWl4ZXIudHh0CmluZGV4IDUxMzJmZDkuLjdmMTBkYzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BdWRpZ3ktbWl4ZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BdWRpZ3ktbWl4ZXIudHh0CkBAIC02LDcgKzYsNyBAQAogCiBUaGUgRU1VMTBLMiBjaGlwcyBoYXZlIGEgRFNQIHBhcnQgd2hpY2ggY2FuIGJlIHByb2dyYW1tZWQgdG8gc3VwcG9ydCAKIHZhcmlvdXMgd2F5cyBvZiBzYW1wbGUgcHJvY2Vzc2luZywgd2hpY2ggaXMgZGVzY3JpYmVkIGhlcmUuCi0oVGhpcyBhY3RpY2xlIGRvZXMgbm90IGRlYWwgd2l0aCB0aGUgb3ZlcmFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSAKKyhUaGlzIGFydGljbGUgZG9lcyBub3QgZGVhbCB3aXRoIHRoZSBvdmVyYWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIAogRU1VMTBLMiBjaGlwcy4gU2VlIHRoZSBtYW51YWxzIHNlY3Rpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4pCiAKIFRoZSBBTFNBIGRyaXZlciBwcm9ncmFtcyB0aGlzIHBvcnRpb24gb2YgY2hpcCBieSBkZWZhdWx0IGNvZGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9TQi1MaXZlLW1peGVyLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9TQi1MaXZlLW1peGVyLnR4dAppbmRleCA2NTFhZGFmLi5mNTYzOWQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvU0ItTGl2ZS1taXhlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL1NCLUxpdmUtbWl4ZXIudHh0CkBAIC01LDcgKzUsNyBAQAogCiBUaGUgRU1VMTBLMSBjaGlwcyBoYXZlIGEgRFNQIHBhcnQgd2hpY2ggY2FuIGJlIHByb2dyYW1tZWQgdG8gc3VwcG9ydAogdmFyaW91cyB3YXlzIG9mIHNhbXBsZSBwcm9jZXNzaW5nLCB3aGljaCBpcyBkZXNjcmliZWQgaGVyZS4KLShUaGlzIGFjdGljbGUgZG9lcyBub3QgZGVhbCB3aXRoIHRoZSBvdmVyYWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIAorKFRoaXMgYXJ0aWNsZSBkb2VzIG5vdCBkZWFsIHdpdGggdGhlIG92ZXJhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgCiBFTVUxMEsxIGNoaXBzLiBTZWUgdGhlIG1hbnVhbHMgc2VjdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLikKIAogVGhlIEFMU0EgZHJpdmVyIHByb2dyYW1zIHRoaXMgcG9ydGlvbiBvZiBjaGlwIGJ5IGRlZmF1bHQgY29kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKaW5kZXggMDJhNDgxMi4uYzgxNWM1MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CkBAIC01MCw3ICs1MCw3IEBACiAgICBDb250YWN0IHRoZSBrZXJuZWwgc2VjdXJpdHkgdGVhbSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgcHJvY2VkdXJlLgogCiAKLVJldmlldyBjb21taXR0ZToKK1JldmlldyBjb21taXR0ZWU6CiAKICAtIFRoaXMgaXMgbWFkZSB1cCBvZiBhIG51bWJlciBvZiBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gaGF2ZSB2b2x1bnRlZXJlZCBmb3IKICAgIHRoaXMgdGFzaywgYW5kIGEgZmV3IHRoYXQgaGF2ZW4ndC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dAppbmRleCA1YzNhNTE5Li5hYTk4NmEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9mcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvZnMudHh0CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlyZWFkYWJsZSBieSByb290IG9ubHkuIFRoaXMgYWxsb3dzIHRoZSBlbmQgdXNlciB0byByZW1vdmUKIAlzdWNoIGEgZHVtcCBidXQgbm90IGFjY2VzcyBpdCBkaXJlY3RseS4gRm9yIHNlY3VyaXR5IHJlYXNvbnMKIAljb3JlIGR1bXBzIGluIHRoaXMgbW9kZSB3aWxsIG5vdCBvdmVyd3JpdGUgb25lIGFub3RoZXIgb3IKLQlvdGhlciBmaWxlcy4gVGhpcyBtb2RlIGlzIGFwcHJvcHJpYXRlIHdoZW4gYWRtaW5zdHJhdG9ycyBhcmUKKwlvdGhlciBmaWxlcy4gVGhpcyBtb2RlIGlzIGFwcHJvcHJpYXRlIHdoZW4gYWRtaW5pc3RyYXRvcnMgYXJlCiAJYXR0ZW1wdGluZyB0byBkZWJ1ZyBwcm9ibGVtcyBpbiBhIG5vcm1hbCBlbnZpcm9ubWVudC4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCAyMGQwZDc5Li5lOTZhMzQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0xMjksNyArMTI5LDcgQEAKIAogem9uZV9yZWNsYWltX21vZGU6CiAKLVpvbmVfcmVjbGFpbV9tb2RlIGFsbG93cyB0byBzZXQgbW9yZSBvciBsZXNzIGFncmVzc2l2ZSBhcHByb2FjaGVzIHRvCitab25lX3JlY2xhaW1fbW9kZSBhbGxvd3Mgc29tZW9uZSB0byBzZXQgbW9yZSBvciBsZXNzIGFnZ3Jlc3NpdmUgYXBwcm9hY2hlcyB0bwogcmVjbGFpbSBtZW1vcnkgd2hlbiBhIHpvbmUgcnVucyBvdXQgb2YgbWVtb3J5LiBJZiBpdCBpcyBzZXQgdG8gemVybyB0aGVuIG5vCiB6b25lIHJlY2xhaW0gb2NjdXJzLiBBbGxvY2F0aW9ucyB3aWxsIGJlIHNhdGlzZmllZCBmcm9tIG90aGVyIHpvbmVzIC8gbm9kZXMKIGluIHRoZSBzeXN0ZW0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CmluZGV4IGI2MDU5MGUuLjYyODAxM2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogCiAKIAotICBNYWtpbmcgaXQgd29ybGQtd3JpdGVhYmxlIGxvb2tzIGJhZCwgYnV0IGl0IHNlZW1zIG5vdCB0byBiZQorICBNYWtpbmcgaXQgd29ybGQtd3JpdGFibGUgbG9va3MgYmFkLCBidXQgaXQgc2VlbXMgbm90IHRvIGJlCiAgIGV4cGxvaXRhYmxlIGFzIGEgc2VjdXJpdHkgaG9sZS4gIEhvd2V2ZXIsIGl0IGRvZXMgYWxsb3cgYW55b25lIHRvIGNyZS0KICAgYXRlIHVzZWxlc3MgdGFwIGRldmljZXMgKHVzZWxlc3MgYmVjYXVzZSB0aGV5IGNhbid0IGNvbmZpZ3VyZSB0aGVtKSwKICAgd2hpY2ggaXMgYSBET1MgYXR0YWNrLiAgQSBzb21ld2hhdCBtb3JlIHNlY3VyZSBhbHRlcm5hdGl2ZSB3b3VsZCB0byBiZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvaGlkZGV2LnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL2hpZGRldi50eHQKaW5kZXggNmE3OTA3NS4uNmU4YzlmMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvaGlkZGV2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9oaWRkZXYudHh0CkBAIC04LDcgKzgsNyBAQAogZXhhbXBsZXMgZm9yIHRoaXMgYXJlIHBvd2VyIGRldmljZXMgKGVzcGVjaWFsbHkgdW5pbnRlcnJ1cHRhYmxlIHBvd2VyCiBzdXBwbGllcykgYW5kIG1vbml0b3IgY29udHJvbCBvbiBoaWdoZXIgZW5kIG1vbml0b3JzLgogCi1UbyBzdXBwb3J0IHRoZXNlIGRpc3Bhcml0ZSByZXF1aXJlbWVudHMsIHRoZSBMaW51eCBVU0Igc3lzdGVtIHByb3ZpZGVzCitUbyBzdXBwb3J0IHRoZXNlIGRpc3BhcmF0ZSByZXF1aXJlbWVudHMsIHRoZSBMaW51eCBVU0Igc3lzdGVtIHByb3ZpZGVzCiBISUQgZXZlbnRzIHRvIHR3byBzZXBhcmF0ZSBpbnRlcmZhY2VzOgogKiB0aGUgaW5wdXQgc3Vic3lzdGVtLCB3aGljaCBjb252ZXJ0cyBISUQgZXZlbnRzIGludG8gbm9ybWFsIGlucHV0CiBkZXZpY2UgaW50ZXJmYWNlcyAoc3VjaCBhcyBrZXlib2FyZCwgbW91c2UgYW5kIGpveXN0aWNrKSBhbmQgYQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvcmlvLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3Jpby50eHQKaW5kZXggYWIyMWRiNC4uYWVlNzE1YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvcmlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9yaW8udHh0CkBAIC0yNCwxMCArMjQsMTAgQEAKIGluY29uc2VxdWVudGlhbC4KIAogSXQgc2VlbXMgdGhhdCB0aGUgUmlvIGhhcyBhIHByb2JsZW0gd2hlbiBzZW5kaW5nIC5tcDMgd2l0aCBsb3cgYmF0dGVyaWVzLgotSSBzdWdnZXN0IHdoZW4gdGhlIGJhdHRlcmllcyBhcmUgbG93IGFuZCB3YW50IHRvIHRyYW5zZmVyIHN0dWZmIHRoYXQgeW91CitJIHN1Z2dlc3Qgd2hlbiB0aGUgYmF0dGVyaWVzIGFyZSBsb3cgYW5kIHlvdSB3YW50IHRvIHRyYW5zZmVyIHN0dWZmIHRoYXQgeW91CiByZXBsYWNlIGl0IHdpdGggYSBmcmVzaCBvbmUuIEluIG15IGNhc2UsIHdoYXQgaGFwcGVuZWQgaXMgSSBsb3N0IHR3byAxNmtiCiBibG9ja3MgKHRoZXkgYXJlIG5vIGxvbmdlciB1c2FibGUgdG8gc3RvcmUgaW5mb3JtYXRpb24gdG8gaXQpLiBCdXQgSSBkb24ndAota25vdyBpZiB0aGF0cyBub3JtYWwgb3Igbm90LiBJdCBjb3VsZCBzaW1wbHkgYmUgYSBwcm9ibGVtIHdpdGggdGhlIGZsYXNoIAora25vdyBpZiB0aGF0J3Mgbm9ybWFsIG9yIG5vdDsgaXQgY291bGQgc2ltcGx5IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBmbGFzaCAKIG1lbW9yeS4KIAogSW4gYW4gZXh0cmVtZSBjYXNlLCBJIGxlZnQgbXkgUmlvIHBsYXlpbmcgb3Zlcm5pZ2h0IGFuZCB0aGUgYmF0dGVyaWVzIHdvcmUgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CmluZGV4IDUwNDM2ZTEuLmQ2MWY2ZTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CkBAIC0xNzUsNyArMTc1LDcgQEAKICAgCiAgIEN1cnJlbnQgc3RhdHVzOgogICAgIFRoZSBVU0EtMThYLCBVU0EtMjhYLCBVU0EtMTksIFVTQS0xOVcgYW5kIFVTQS00OVcgYXJlIHN1cHBvcnRlZCBhbmQKLSAgICBoYXZlIGJlZW4gcHJldHR5IHRocm91Z2hseSB0ZXN0ZWQgYXQgdmFyaW91cyBiYXVkIHJhdGVzIHdpdGggOC1OLTEKKyAgICBoYXZlIGJlZW4gcHJldHR5IHRob3JvdWdobHkgdGVzdGVkIGF0IHZhcmlvdXMgYmF1ZCByYXRlcyB3aXRoIDgtTi0xCiAgICAgY2hhcmFjdGVyIHNldHRpbmdzLiAgT3RoZXIgY2hhcmFjdGVyIGxlbmd0aHMgYW5kIHBhcml0eSBzZXR1cHMgYXJlCiAgICAgcHJlc2VudGx5IHVudGVzdGVkLgogCkBAIC0yNTMsNyArMjUzLDcgQEAKIAl0b2dldGhlciB3aXRob3V0IGhhY2tpbmcgdGhlIGFkYXB0ZXIgdG8gc2V0IHRoZSBsaW5lIGhpZ2guCiAKIAlUaGUgZHJpdmVyIGlzIHNtcCBzYWZlLiAgUGVyZm9ybWFuY2Ugd2l0aCB0aGUgZHJpdmVyIGlzIHJhdGhlciBsb3cgd2hlbiB1c2luZwotCWl0IGZvciB0cmFuc2ZlcmluZyBmaWxlcy4gIFRoaXMgaXMgYmVpbmcgd29ya2VkIG9uLCBidXQgSSB3b3VsZCBiZSB3aWxsaW5nIHRvCisJaXQgZm9yIHRyYW5zZmVycmluZyBmaWxlcy4gIFRoaXMgaXMgYmVpbmcgd29ya2VkIG9uLCBidXQgSSB3b3VsZCBiZSB3aWxsaW5nIHRvCiAJYWNjZXB0IHBhdGNoZXMuICBBbiB1cmIgcXVldWUgb3IgcGFja2V0IGJ1ZmZlciB3b3VsZCBsaWtlbHkgZml0IHRoZSBiaWxsIGhlcmUuCiAKIAlJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBwcm9ibGVtcywgcGF0Y2hlcywgZmVhdHVyZSByZXF1ZXN0cywgZXRjLiB5b3UgY2FuCkBAIC0yOTcsNyArMjk3LDcgQEAKICAgICAgIFBhcml0eSAgICAgICBOLEUsTyxNLFMKICAgICAgIEhhbmRzaGFrZSAgICBOb25lLCBTb2Z0d2FyZSAoWE9OL1hPRkYpLCBIYXJkd2FyZSAoQ1RTUlRTLENUU0RUUikqCiAgICAgICBCcmVhayAgICAgICAgU2V0IGFuZCBjbGVhcgotICAgICAgTGluZSBjb250cmwgIElucHV0L091dHB1dCBxdWVyeSBhbmQgY29udHJvbCAqKgorICAgICAgTGluZSBjb250cm9sIElucHV0L091dHB1dCBxdWVyeSBhbmQgY29udHJvbCAqKgogCiAgICAgICAqICBIYXJkd2FyZSBpbnB1dCBmbG93IGNvbnRyb2wgaXMgb25seSBlbmFibGVkIGZvciBmaXJtd2FyZQogICAgICAgICAgbGV2ZWxzIGFib3ZlIDIuMDYuICBSZWFkIHNvdXJjZSBjb2RlIGNvbW1lbnRzIGRlc2NyaWJpbmcgQmVsa2luCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgIGF1dG9tYXRpYyBoYXJkd2FyZSBmbG93IGNvbnRyb2wuCiAKICAgVE8gRE8gTGlzdDoKLSAgICAtLSBBZGQgdHJ1ZSBtb2RlbSBjb250b2wgbGluZSBxdWVyeSBjYXBhYmlsaXR5LiAgQ3VycmVudGx5IHRyYWNrcyB0aGUKKyAgICAtLSBBZGQgdHJ1ZSBtb2RlbSBjb250cm9sIGxpbmUgcXVlcnkgY2FwYWJpbGl0eS4gIEN1cnJlbnRseSB0cmFja3MgdGhlCiAgICAgICAgc3RhdGVzIHJlcG9ydGVkIGJ5IHRoZSBpbnRlcnJ1cHQgYW5kIHRoZSBzdGF0ZXMgcmVxdWVzdGVkLgogICAgIC0tIEFkZCBlcnJvciByZXBvcnRpbmcgYmFjayB0byBhcHBsaWNhdGlvbiBmb3IgVUFSVCBlcnJvciBjb25kaXRpb25zLgogICAgIC0tIEFkZCBzdXBwb3J0IGZvciBmbHVzaCBpb2N0bHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQKaW5kZXggN2U4YWU4My4uOGQxNmY2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctYXBpLnR4dApAQCAtMjE0LDcgKzIxNCw3IEBACiAKIEZpbmFsbHkgdGhlIFNFVE9QVElPTlMgaW9jdGwgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBzb21lIGFzcGVjdHMgb2YKIHRoZSBjYXJkcyBvcGVyYXRpb247IHJpZ2h0IG5vdyB0aGUgcGN3ZCBkcml2ZXIgaXMgdGhlIG9ubHkgb25lCi1zdXBwb3J0aW5nIHRoaXNzIGlvY3RsLgorc3VwcG9ydGluZyB0aGlzIGlvY3RsLgogCiAgICAgaW50IG9wdGlvbnMgPSAwOwogICAgIGlvY3RsKGZkLCBXRElPQ19TRVRPUFRJT05TLCBvcHRpb25zKTsKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYTU1MDhmOS4uNWRmZjI2OCAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTE1NSwxNiArMTU1LDE2IEBACiBTOglNYWludGFpbmVkCiAKIDlQIEZJTEUgU1lTVEVNCi1QOiAgICAgIEVyaWMgVmFuIEhlbnNiZXJnZW4KLU06ICAgICAgZXJpY3ZoQGdtYWlsLmNvbQotUDogICAgICBSb24gTWlubmljaAotTTogICAgICBybWlubmljaEBsYW5sLmdvdgotUDogICAgICBMYXRjaGVzYXIgSW9ua292Ci1NOiAgICAgIGx1Y2hvQGlvbmtvdi5uZXQKLUw6ICAgICAgdjlmcy1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOiAgICAgIGh0dHA6Ly92OWZzLnNmLm5ldAotVDogICAgICBnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZXJpY3ZoL3Y5ZnMuZ2l0Ci1TOiAgICAgIE1haW50YWluZWQKK1A6CUVyaWMgVmFuIEhlbnNiZXJnZW4KK006CWVyaWN2aEBnbWFpbC5jb20KK1A6CVJvbiBNaW5uaWNoCitNOglybWlubmljaEBsYW5sLmdvdgorUDoJTGF0Y2hlc2FyIElvbmtvdgorTToJbHVjaG9AaW9ua292Lm5ldAorTDoJdjlmcy1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOglodHRwOi8vdjlmcy5zZi5uZXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9lcmljdmgvdjlmcy5naXQKK1M6CU1haW50YWluZWQKIAogQTIyMzIgU0VSSUFMIEJPQVJEIERSSVZFUgogUDoJRW52ZXIgSGFhc2UKQEAgLTI5MCw4ICsyOTAsOCBAQAogUzoJTWFpbnRhaW5lZCBmb3IgMi40OyBQQ0kgc3VwcG9ydCBmb3IgMi42LgogCiBBTUQgR0VPREUgUFJPQ0VTU09SL0NISVBTRVQgU1VQUE9SVAotUDogICAgICBKb3JkYW4gQ3JvdXNlCi1NOiAgICAgIGluZm8tbGludXhAZ2VvZGUuYW1kLmNvbQorUDoJSm9yZGFuIENyb3VzZQorTToJaW5mby1saW51eEBnZW9kZS5hbWQuY29tCiBMOglpbmZvLWxpbnV4QGdlb2RlLmFtZC5jb20KIFc6CWh0dHA6Ly93d3cuYW1kLmNvbS91cy1lbi9Db25uZWN0aXZpdHlTb2x1dGlvbnMvVGVjaG5pY2FsUmVzb3VyY2VzLzAsLDUwXzIzMzRfMjQ1Ml8xMTM2MywwMC5odG1sCiBTOglTdXBwb3J0ZWQKQEAgLTM1Myw2ICszNTMsMTIgQEAKIE06CXJwdXJkaWVAcnBzeXMubmV0CiBTOglNYWludGFpbmVkCiAKK0FSTS9IUCBKT1JOQURBIDdYWCBNQUNISU5FIFNVUFBPUlQKK1A6ICAgICAgS3Jpc3RvZmZlciBFcmljc29uCitNOiAgICAgIGtyaXN0b2ZmZXJfZTFAaG90bWFpbC5jb20KK1c6ICAgICAgd3d3LmpsaW1lLmNvbQorUzogICAgICBNYWludGFpbmVkCisKIEFSTS9UT1NBIE1BQ0hJTkUgU1VQUE9SVAogUDoJRGlyayBPcGZlcgogTToJZGlya0BvcGZlci1vbmxpbmUuZGUKQEAgLTQyNiw2ICs0MzIsMTMgQEAKIFc6CWh0dHA6Ly9saW51eC1hdG0uc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKK0FUTUVMIE1BQ0IgRVRIRVJORVQgRFJJVkVSCitQOglBdG1lbCBBVlIzMiBTdXBwb3J0IFRlYW0KK006CWF2cjMyQGF0bWVsLmNvbQorUDoJSGFhdmFyZCBTa2lubmVtb2VuCitNOgloc2tpbm5lbW9lbkBhdG1lbC5jb20KK1M6CVN1cHBvcnRlZAorCiBBVE1FTCBXSVJFTEVTUyBEUklWRVIKIFA6CVNpbW9uIEtlbGxleQogTToJc2ltb25AdGhla2VsbGV5cy5vcmcudWsKQEAgLTU5NSwxMyArNjA4LDEzIEBACiBTOglNYWludGFpbmVkCiAKIEJPTkRJTkcgRFJJVkVSCi1QOiAgIENoYWQgVGluZGVsCi1NOiAgIGN0aW5kZWxAdXNlcnMuc291cmNlZm9yZ2UubmV0Ci1QOiAgIEpheSBWb3NidXJnaAotTTogICBmdWJhckB1cy5pYm0uY29tCi1MOiAgIGJvbmRpbmctZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOiAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9uZGluZy8KLVM6ICAgU3VwcG9ydGVkCitQOglDaGFkIFRpbmRlbAorTToJY3RpbmRlbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKK1A6CUpheSBWb3NidXJnaAorTToJZnViYXJAdXMuaWJtLmNvbQorTDoJYm9uZGluZy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9uZGluZy8KK1M6CVN1cHBvcnRlZAogCiBCUk9BREJBTkQgUFJPQ0VTU09SIEFSQ0hJVEVDVFVSRQogUDoJQXJuZCBCZXJnbWFubgpAQCAtNzM4LDggKzc1MSw4IEBACiBTOglTdXBwb3J0ZWQKIAogQ1JBTUZTIEZJTEVTWVNURU0KLVc6ICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2NyYW1mcy8KLVM6ICAgICBPcnBoYW4KK1c6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY3JhbWZzLworUzoJT3JwaGFuCiAKIENSSVMgUE9SVAogUDoJTWlrYWVsIFN0YXJ2aWsKQEAgLTEwNDgsMTEgKzEwNjEsMTEgQEAKIFM6CU1haW50YWluZWQKIAogRU1VTEVYIExQRkMgRkMgU0NTSSBEUklWRVIKLVA6ICAgICAgSmFtZXMgU21hcnQKLU06ICAgICAgamFtZXMuc21hcnRAZW11bGV4LmNvbQotTDogICAgICBsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotVzogICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xwZmN4eHh4Ci1TOiAgICAgIFN1cHBvcnRlZAorUDoJSmFtZXMgU21hcnQKK006CWphbWVzLnNtYXJ0QGVtdWxleC5jb20KK0w6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xwZmN4eHh4CitTOglTdXBwb3J0ZWQKIAogRVBTT04gMTM1NSBGUkFNRUJVRkZFUiBEUklWRVIKIFA6CUNocmlzdG9waGVyIEhvb3ZlcgpAQCAtMTE1MywxMSArMTE2Niw2IEBACiBNOglkaG93ZWxsc0ByZWRoYXQuY29tCiBTOglNYWludGFpbmVkCiAKLUZUQVBFL1FJQy0xMTcKLUw6CWxpbnV4LXRhcGVAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Z0YXBlCi1TOglPcnBoYW4KLQogRlVTRTogRklMRVNZU1RFTSBJTiBVU0VSU1BBQ0UKIFA6CU1pa2xvcyBTemVyZWRpCiBNOgltaWtsb3NAc3plcmVkaS5odQpAQCAtMTQ4OSwxNiArMTQ5NywxNiBAQAogUzoJTWFpbnRhaW5lZAogCiBJTlRFTCBGUkFNRUJVRkZFUiBEUklWRVIgKGV4Y2x1ZGluZyA4MTAgYW5kIDgxNSkKLVA6ICAgICAgU3lsdmFpbiBNZXllcgotTTogICAgICBzeWx2YWluLm1leWVyQHdvcmxkb25saW5lLmZyCi1MOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotUzogICAgICBNYWludGFpbmVkCitQOglTeWx2YWluIE1leWVyCitNOglzeWx2YWluLm1leWVyQHdvcmxkb25saW5lLmZyCitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1M6CU1haW50YWluZWQKIAogSU5URUwgODEwLzgxNSBGUkFNRUJVRkZFUiBEUklWRVIKLVA6ICAgICAgQW50b25pbm8gRGFwbGFzCi1NOiAgICAgIGFkYXBsYXNAcG9sLm5ldAotTDogICAgICBsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLVM6ICAgICAgTWFpbnRhaW5lZAorUDoJQW50b25pbm8gRGFwbGFzCitNOglhZGFwbGFzQHBvbC5uZXQKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzoJTWFpbnRhaW5lZAogCiBJTlRFTCBBUElDL0lPQVBJQywgTE9XTEVWRUwgWDg2IFNNUCBTVVBQT1JUCiBQOglJbmdvIE1vbG5hcgpAQCAtMTgyNCwxMSArMTgzMiwxMSBAQAogUzoJTWFpbnRhaW5lZAogCiBMSU5VWCBGT1IgUE9XRVJQQyBFTUJFRERFRCBQUEM4M1hYIEFORCBQUEM4NVhYCi1QOiAgICAgS3VtYXIgR2FsYQotTTogICAgIGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmcKLVc6ICAgICBodHRwOi8vd3d3LnBlbmd1aW5wcGMub3JnLwotTDogICAgIGxpbnV4cHBjLWVtYmVkZGVkQG96bGFicy5vcmcKLVM6ICAgICBNYWludGFpbmVkCitQOglLdW1hciBHYWxhCitNOglnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnCitXOglodHRwOi8vd3d3LnBlbmd1aW5wcGMub3JnLworTDoJbGludXhwcGMtZW1iZWRkZWRAb3psYWJzLm9yZworUzoJTWFpbnRhaW5lZAogCiBMSU5VWCBGT1IgUE9XRVJQQyBQQSBTRU1JIFBXUkZJQ0lFTlQKIFA6CU9sb2YgSm9oYW5zc29uCkBAIC0xOTI3LDEwICsxOTM1LDEwIEBACiBTOiAJU3VwcG9ydGVkCiAKIE1BTi1QQUdFUzogTUFOVUFMIFBBR0VTIEZPUiBMSU5VWCAtLSBTZWN0aW9ucyAyLCAzLCA0LCA1LCBhbmQgNwotUDogTWljaGFlbCBLZXJyaXNrCi1NOiBtdGstbWFucGFnZXNAZ214Lm5ldAotVzogZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2RvY3MvbWFucGFnZXMKLVM6IE1haW50YWluZWQKK1A6CU1pY2hhZWwgS2VycmlzaworTToJbXRrLW1hbnBhZ2VzQGdteC5uZXQKK1c6CWZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9kb2NzL21hbnBhZ2VzCitTOglNYWludGFpbmVkCiAKIE1BUlZFTEwgTVY2NDNYWCBFVEhFUk5FVCBEUklWRVIKIFA6CURhbGUgRmFybnN3b3J0aApAQCAtMTk0NywxMSArMTk1NSwxMSBAQAogUzoJTWFpbnRhaW5lZAogCiBNRUdBUkFJRCBTQ1NJIERSSVZFUlMKLVA6ICAgICBOZWVsYSBTeWFtIEtvbGxpCi1NOiAgICAgTmVlbGEuS29sbGlAZW5nZW5pby5jb20KLVM6ICAgICBsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotVzogICAgIGh0dHA6Ly9tZWdhcmFpZC5sc2lsb2dpYy5jb20KLVM6ICAgICBNYWludGFpbmVkCitQOglOZWVsYSBTeWFtIEtvbGxpCitNOglOZWVsYS5Lb2xsaUBlbmdlbmlvLmNvbQorUzoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly9tZWdhcmFpZC5sc2lsb2dpYy5jb20KK1M6CU1haW50YWluZWQKIAogTUVNT1JZIE1BTkFHRU1FTlQKIEw6CWxpbnV4LW1tQGt2YWNrLm9yZwpAQCAtMjEyNiw2ICsyMTM0LDEzIEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2xpbnZpbGxlL3dpcmVsZXNzLTIuNi5naXQKIFM6CU1haW50YWluZWQKIAorTkVUWEVOICgxLzEwKSBHYkUgU1VQUE9SVAorUDoJQW1pdCBTLiBLYWxlCitNOglhbWl0a2FsZUBuZXR4ZW4uY29tCitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vd3d3Lm5ldHhlbi5jb20KK1M6CVN1cHBvcnRlZAorCiBJUFZTCiBQOglXZW5zb25nIFpoYW5nCiBNOgl3ZW5zb25nQGxpbnV4LXZzLm9yZwpAQCAtMjE4MCwxMCArMjE5NSwxMCBAQAogUzoJTWFpbnRhaW5lZAogCiBOVklESUEgKHJpdmFmYiBhbmQgbnZpZGlhZmIpIEZSQU1FQlVGRkVSIERSSVZFUgotUDogICAgICBBbnRvbmlubyBEYXBsYXMKLU06ICAgICAgYWRhcGxhc0Bwb2wubmV0Ci1MOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotUzogICAgICBNYWludGFpbmVkCitQOglBbnRvbmlubyBEYXBsYXMKK006CWFkYXBsYXNAcG9sLm5ldAorTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitTOglNYWludGFpbmVkCiAKIE9QRU5DT1JFUyBJMkMgQlVTIERSSVZFUgogUDoJUGV0ZXIgS29yc2dhYXJkCkBAIC0yNDIzLDYgKzI0MzgsMTMgQEAKIFc6CWh0dHA6Ly93d3cucG5kLXBjLmRlbW9uLmNvLnVrL3Byb21pc2UvCiBTOglNYWludGFpbmVkCiAKK1BTMyBQTEFURk9STSBTVVBQT1JUCitQOglHZW9mZiBMZXZhbmQKK006CWdlb2ZmcmV5LmxldmFuZEBhbS5zb255LmNvbQorTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKK0w6CWNiZS1vc3MtZGV2QG96bGFicy5vcmcKK1M6CVN1cHBvcnRlZAorCiBQVlJVU0IyIFZJREVPNExJTlVYIERSSVZFUgogUDoJTWlrZSBJc2VseQogTToJaXNlbHlAcG9ib3guY29tCkBAIC0yNTMzLDEwICsyNTU1LDEwIEBACiBTOglPcnBoYW4KIAogUzMgU0FWQUdFIEZSQU1FQlVGRkVSIERSSVZFUgotUDogICAgICBBbnRvbmlubyBEYXBsYXMKLU06ICAgICAgYWRhcGxhc0Bwb2wubmV0Ci1MOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotUzogICAgICBNYWludGFpbmVkCitQOglBbnRvbmlubyBEYXBsYXMKK006CWFkYXBsYXNAcG9sLm5ldAorTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitTOglNYWludGFpbmVkCiAKIFMzOTAKIFA6CU1hcnRpbiBTY2h3aWRlZnNreQpAQCAtMjYxNywxMCArMjYzOSwxMCBAQAogUzoJTWFpbnRhaW5lZAogCiBTQ1RQIFBST1RPQ09MCi1QOiBTcmlkaGFyIFNhbXVkcmFsYQotTTogc3JpQHVzLmlibS5jb20KLUw6IGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotUzogU3VwcG9ydGVkCitQOglTcmlkaGFyIFNhbXVkcmFsYQorTToJc3JpQHVzLmlibS5jb20KK0w6CWxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzoJU3VwcG9ydGVkCiAKIFNDeDIwMCBDUFUgU1VQUE9SVAogUDoJSmltIENyb21pZQpAQCAtMjc4OCw5ICsyODEwLDkgQEAKIFM6CU1haW50YWluZWQKIAogVGVsZWNvbSBDbG9jayBEcml2ZXIgZm9yIE1DUEwwMDEwCi1QOiBNYXJrIEdyb3NzCi1NOiBtYXJrLmdyb3NzQGludGVsLmNvbQotUzogU3VwcG9ydGVkCitQOglNYXJrIEdyb3NzCitNOgltYXJrLmdyb3NzQGludGVsLmNvbQorUzoJU3VwcG9ydGVkCiAKIFRFTlNJTElDQSBYVEVOU0EgUE9SVCAoeHRlbnNhKToKIFA6CUNocmlzIFphbmtlbApAQCAtMjkzNyw5ICsyOTU5LDkgQEAKIFM6CU1haW50YWluZWQKIAogVEkgUEFSQUxMRUwgTElOSyBDQUJMRSBEUklWRVIKLVA6ICAgICBSb21haW4gTGlldmluCi1NOiAgICAgcm9tc0BscGcudGljYWxjLm9yZwotUzogICAgIE1haW50YWluZWQKK1A6CVJvbWFpbiBMaWV2aW4KK006CXJvbXNAbHBnLnRpY2FsYy5vcmcKK1M6CU1haW50YWluZWQKIAogVElQQyBORVRXT1JLIExBWUVSCiBQOglQZXIgTGlkZW4KQEAgLTI5ODksMTIgKzMwMTEsMTIgQEAKIFM6CU1haW50YWluZWQKIAogVFJJVklBTCBQQVRDSEVTCi1QOiAgICAgIEFkcmlhbiBCdW5rCi1NOiAgICAgIHRyaXZpYWxAa2VybmVsLm9yZwotTDogICAgICBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1XOiAgICAgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9idW5rL3RyaXZpYWwvCi1UOiAgICAgIGdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYnVuay90cml2aWFsLmdpdAotUzogICAgICBNYWludGFpbmVkCitQOglBZHJpYW4gQnVuaworTToJdHJpdmlhbEBrZXJuZWwub3JnCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvYnVuay90cml2aWFsLworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9idW5rL3RyaXZpYWwuZ2l0CitTOglNYWludGFpbmVkCiAKIFRNUzM4MCBUT0tFTi1SSU5HIE5FVFdPUksgRFJJVkVSCiBQOglBZGFtIEZyaXR6bGVyCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDk1OGZhZDYuLmFlZjk2MjUgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2CiBTVUJMRVZFTCA9IDE5Ci1FWFRSQVZFUlNJT04gPS1yYzYKK0VYVFJBVkVSU0lPTiA9CiBOQU1FPUF2YXN0ISBBIGJpbGdlIHJhdCEKIAogIyAqRE9DVU1FTlRBVElPTioKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCmluZGV4IDg5MDQ0ZTYuLmFiMzc2MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYwpAQCAtNDEsMjggKzQxLDI1IEBACiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQuCiAgKi8KLXVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCSAgIF9fd3N1bSBzdW0pCiB7Ci0JcmV0dXJuIH5mcm9tNjR0bzE2KHNhZGRyICsgZGFkZHIgKyBzdW0gKwotCQkoKHVuc2lnbmVkIGxvbmcpIG50b2hzKGxlbikgPDwgMTYpICsKLQkJKCh1bnNpZ25lZCBsb25nKSBwcm90byA8PCA4KSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmZyb202NHRvMTYoCisJCShfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCShfX2ZvcmNlIHU2NClzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KSk7CiB9CiAKLXVuc2lnbmVkIGludCBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkgICBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCi0JcmVzdWx0ID0gKHNhZGRyICsgZGFkZHIgKyBzdW0gKwotCQkgICgodW5zaWduZWQgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkgICgodW5zaWduZWQgbG9uZykgcHJvdG8gPDwgOCkpOworCXJlc3VsdCA9IChfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCSAoX19mb3JjZSB1NjQpc3VtICsgKChsZW4gKyBwcm90bykgPDwgOCk7CiAKIAkvKiBGb2xkIGRvd24gdG8gMzItYml0cyBzbyB3ZSBkb24ndCBsb3NlIGluIHRoZSB0eXBlZGVmLWxlc3MgCiAJICAgbmV0d29yayBzdGFjay4gICovCkBAIC03MCw3ICs2Nyw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJLyogMzMgdG8gMzIgKi8KIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZikgKyAocmVzdWx0ID4+IDMyKTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQogCiAvKgpAQCAtMTQ2LDkgKzE0Myw5IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwgdW5zaWduZWQgaW50IGlobCkKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKLQlyZXR1cm4gfmRvX2NzdW0oaXBoLGlobCo0KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShpcGgsaWhsKjQpOwogfQogCiAvKgpAQCAtMTYzLDE1ICsxNjAsMTUgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IGRvX2NzdW0oYnVmZiwgbGVuKTsKIAogCS8qIGFkZCBpbiBvbGQgc3VtLCBhbmQgY2FycnkuLiAqLwotCXJlc3VsdCArPSBzdW07CisJcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilzdW07CiAJLyogMzIrYyBiaXRzIC0+IDMyIGJpdHMgKi8KIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZikgKyAocmVzdWx0ID4+IDMyKTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CkBAIC0xODAsNyArMTc3LDcgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi11bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewotCXJldHVybiB+ZnJvbTY0dG8xNihkb19jc3VtKGJ1ZmYsbGVuKSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmZyb202NHRvMTYoZG9fY3N1bShidWZmLGxlbikpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYyBiL2FyY2gvYWxwaGEvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKaW5kZXggYTM3OTQ4Zi4uNGNhNzVjNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYworKysgYi9hcmNoL2FscGhhL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCkBAIC0zMjksMTEgKzMyOSwxMSBAQAogCXJldHVybiBjaGVja3N1bTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludAotZG9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycnApCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sCisJCQkgICAgICAgX193c3VtIHN1bSwgaW50ICplcnJwKQogewotCXVuc2lnbmVkIGxvbmcgY2hlY2tzdW0gPSAodW5zaWduZWQpIHN1bTsKKwl1bnNpZ25lZCBsb25nIGNoZWNrc3VtID0gKF9fZm9yY2UgdTMyKSBzdW07CiAJdW5zaWduZWQgbG9uZyBzb2ZmID0gNyAmICh1bnNpZ25lZCBsb25nKSBzcmM7CiAJdW5zaWduZWQgbG9uZyBkb2ZmID0gNyAmICh1bnNpZ25lZCBsb25nKSBkc3Q7CiAKQEAgLTM2NywyNSArMzY3LDEyIEBACiAJCX0KIAkJY2hlY2tzdW0gPSBmcm9tNjR0bzE2IChjaGVja3N1bSk7CiAJfQotCXJldHVybiBjaGVja3N1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKWNoZWNrc3VtOwogfQogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkgICAgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJwKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIGxlbikpIHsKLQkJKmVycnAgPSAtRUZBVUxUOwotCQltZW1zZXQoZHN0LCAwLCBsZW4pOwotCQlyZXR1cm4gc3VtOwotCX0KLQotCXJldHVybiBkb19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoc3JjLCBkc3QsIGxlbiwgc3VtLCBlcnJwKTsKLX0KLQotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCSAgdW5zaWduZWQgaW50IHN1bSkKLXsKLQlyZXR1cm4gZG9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcigoX19mb3JjZSBjb25zdCB2b2lkIF9fdXNlciAqKXNyYywKKwkJCWRzdCwgbGVuLCBzdW0sIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggYWRiMDVkZS4uY2UwMGM1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC04NzksNiArODc5LDggQEAKIAogc291cmNlICJkcml2ZXJzL3Njc2kvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2F0YS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbWQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Fzc2FiZXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hc3NhYmV0X2RlZmNvbmZpZwppbmRleCAwODljOWQ1Li5iMWNkMzMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2Fzc2FiZXRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXNzYWJldF9kZWZjb25maWcKQEAgLTE4NCw2ICsxODQsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jZXJmY3ViZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZwppbmRleCBmODFhNjAwLi4wOWI3YWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZwpAQCAtMTk0LDYgKzE5NCw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUE0gaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NvcmdpX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnCmluZGV4IDNjMzQ2MWUuLmM0MWMwNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnCkBAIC0yMDgsNiArMjA4LDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKIENPTkZJR19BUE09eQogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2gzNjAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCmluZGV4IDdhMGRhMGIuLjhmOTg2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCkBAIC0xOTQsNiArMTk0LDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2ludGVncmF0b3JfZGVmY29uZmlnCmluZGV4IGQxYmE3ZmQuLjY5MmFiNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pbnRlZ3JhdG9yX2RlZmNvbmZpZwpAQCAtMTkwLDYgKzE5MCw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUE0gaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9qb3JuYWRhNzIwX2RlZmNvbmZpZwppbmRleCBhZDEwNDhkLi44MGE2ZmQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcKQEAgLTE4Miw2ICsxODIsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9sYXJ0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbGFydF9kZWZjb25maWcKaW5kZXggYzNhOTMyOC4uYTFjYzM0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9sYXJ0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2xhcnRfZGVmY29uZmlnCkBAIC0xODAsNiArMTgwLDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKIENPTkZJR19BUE09bQogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL25lcG9uc2V0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmVwb25zZXRfZGVmY29uZmlnCmluZGV4IDNkMzUyNTUuLmRmODE2OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbmVwb25zZXRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmVwb25zZXRfZGVmY29uZmlnCkBAIC0xOTAsNiArMTkwLDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKIENPTkZJR19BUE09eQogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3NpbXBhZF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3NpbXBhZF9kZWZjb25maWcKaW5kZXggMmU1YTYxNi4uMTQwMDU2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zaW1wYWRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2ltcGFkX2RlZmNvbmZpZwpAQCAtMTgwLDYgKzE4MCw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiBDT05GSUdfQVBNPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zcGl0el9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3NwaXR6X2RlZmNvbmZpZwppbmRleCBkMWFjZTNhLi5iZDAzMjM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3NwaXR6X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3NwaXR6X2RlZmNvbmZpZwpAQCAtMjA3LDYgKzIwNyw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiBDT05GSUdfQVBNPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IGEwN2QyMDIuLjA3MGJjYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTQ1MSw2ICs0NTEsNyBAQAogCXJldHVybiBzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUoZnVuYywgaW5mbywgcmV0cnksIHdhaXQsCiAJCQkJCWNwdV9vbmxpbmVfbWFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNtcF9jYWxsX2Z1bmN0aW9uKTsKIAogdm9pZCBzaG93X2lwaV9saXN0KHN0cnVjdCBzZXFfZmlsZSAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pby5jIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2lvLmMKaW5kZXggYzY0OGJmYi4uZGIzOGFmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2lvLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpfX2lzYW1lbV9jb252ZXJ0X2FkZHIodm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgX19pb21lbSAqX19pc2FtZW1fY29udmVydF9hZGRyKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl1MzIgcmV0LCBhID0gKHUzMiBfX2ZvcmNlKSBhZGRyOwogCkBAIC02Myw3ICs2Myw3IEBACiAvKgogICogcmVhZFtid2xdIGFuZCB3cml0ZVtid2xdCiAgKi8KLXU4IF9fcmVhZGIodm9pZCBfX2lvbWVtICphZGRyKQordTggX19yZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJdm9pZCBfX2lvbWVtICphID0gX19pc2FtZW1fY29udmVydF9hZGRyKGFkZHIpOwogCXUzMiByZXQ7CkBAIC03NSw3ICs3NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdTE2IF9fcmVhZHcodm9pZCBfX2lvbWVtICphZGRyKQordTE2IF9fcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXZvaWQgX19pb21lbSAqYSA9IF9faXNhbWVtX2NvbnZlcnRfYWRkcihhZGRyKTsKIApAQCAtODUsNyArODUsNyBAQAogCXJldHVybiBfX3Jhd19yZWFkdyhhKTsKIH0KIAotdTMyIF9fcmVhZGwodm9pZCBfX2lvbWVtICphZGRyKQordTMyIF9fcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXZvaWQgX19pb21lbSAqYSA9IF9faXNhbWVtX2NvbnZlcnRfYWRkcihhZGRyKTsKIAl1MzIgcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcKaW5kZXggNTdmMjNiNC4uZTMxNmJkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgICAgICBpbnRvIHRoZSBrZXJuZWwgYW5kIHdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIHJlYWRbYndsXS93cml0ZVtid2xdCiAgICAgICAgICAgICAgbWFjcm9zLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGR1ZSB0byBzcGVlZCBidXQgaXQKICAgICAgICAgICAgICBsaW1pdHMgdGhlIHN5c3RlbSB0byBqdXN0IDY0TUIgb2YgUENJIG1lbW9yeS4gVGhpcyBjYW4gYmUgCi0gICAgICAgICAgICAgcHJvYmxhbWF0aWMgaWYgdXNpbmcgdmlkZW8gY2FyZHMgYW5kIG90aGVyIG1lbW9yeS1oZWF2eSBkZXZpY2VzLgorICAgICAgICAgICAgIHByb2JsZW1hdGljIGlmIHVzaW5nIHZpZGVvIGNhcmRzIGFuZCBvdGhlciBtZW1vcnktaGVhdnkgZGV2aWNlcy4KICAgICAgICAgICAKICAgICAgICAgICAyKSBJZiA+IDY0TUIgb2YgbWVtb3J5IHNwYWNlIGlzIHJlcXVpcmVkLCB0aGUgSVhQNHh4IGNhbiBiZSAKIAkgICAgIGNvbmZpZ3VyZWQgdG8gdXNlIGluZGlyZWN0IHJlZ2lzdGVycyB0byBhY2Nlc3MgUENJIFRoaXMgYWxsb3dzIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZwppbmRleCAxNDdiMDE5Li42ZjRjNmExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIFNoYXJwIEtFVjdBNDAwIGRldmVsb3BtZW50CiAJICBib2FyZC4gIFRoaXMgaGFyZHdhcmUgaXMgZGlzY29udGludWVkLCBzbyBJJ2QgYmUgdmVyeQotCSAgc3VwcmlzZWQgaWYgeW91IHdhbnRlZCB0aGlzIG9wdGlvbi4KKwkgIHN1cnByaXNlZCBpZiB5b3Ugd2FudGVkIHRoaXMgb3B0aW9uLgogCiBjb25maWcgTUFDSF9MUEQ3QTQwMAogCWJvb2wgIkxQRDdBNDAwIENhcmQgRW5naW5lIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwppbmRleCA2Mzk2NWM3Li45YWEyNmI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwpAQCAtOTEsNyArOTEsNyBAQAogY29uZmlnIE1BQ0hfUzNDMjQxMwogCWJvb2wKIAloZWxwCi0JICBJbnRlcm5hbCBub2RlIGZvciBTM0MyNDEzIHZlcmlzb24gb2YgU01ESzI0MTMsIHNvIHRoYXQKKwkgIEludGVybmFsIG5vZGUgZm9yIFMzQzI0MTMgdmVyc2lvbiBvZiBTTURLMjQxMywgc28gdGhhdAogCSAgbWFjaGluZV9pc19zM2MyNDEzKCkgd2lsbCB3b3JrIHdoZW4gTUFDSF9TTURLMjQxMyBpcwogCSAgc2VsZWN0ZWQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vS2NvbmZpZyBiL2FyY2gvYXJtL21tL0tjb25maWcKaW5kZXggYzBiZmI4Mi4uYjA5YTE5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vS2NvbmZpZworKysgYi9hcmNoL2FybS9tbS9LY29uZmlnCkBAIC0xOTcsNyArMTk3LDcgQEAKIAlzZWxlY3QgQ1BVX0NQMTVfTVBVCiAJaGVscAogCSAgQVJNOTQwVCBpcyBhIG1lbWJlciBvZiB0aGUgQVJNOVRETUkgZmFtaWx5IG9mIGdlbmVyYWwtCi0JICBwdXJwb3NlIG1pY3JvcHJvY2Vzc29ycyB3aXRoIE1QVSBhbmQgc2VwZXJhdGUgNEtCCisJICBwdXJwb3NlIG1pY3JvcHJvY2Vzc29ycyB3aXRoIE1QVSBhbmQgc2VwYXJhdGUgNEtCCiAJICBpbnN0cnVjdGlvbiBhbmQgNEtCIGRhdGEgY2FzZXMsIGVhY2ggd2l0aCBhIDQtd29yZCBsaW5lCiAJICBsZW5ndGguCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYyBiL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYwppbmRleCA1MGU2YjZiLi5iNzk3MjE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMKKysrIGIvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCkBAIC00NzYsNiArNDc2LDkgQEAKIAogLyoKICAqIE1ha2UgYW4gYXJlYSBjb25zaXN0ZW50IGZvciBkZXZpY2VzLgorICogTm90ZTogRHJpdmVycyBzaG91bGQgTk9UIHVzZSB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCBhcyBpdCB3aWxsIGJyZWFrCisgKiBwbGF0Zm9ybXMgd2l0aCBDT05GSUdfRE1BQk9VTkNFLgorICogVXNlIHRoZSBkcml2ZXIgRE1BIHN1cHBvcnQgLSBzZWUgZG1hLW1hcHBpbmcuaCAoZG1hX3N5bmNfKikKICAqLwogdm9pZCBjb25zaXN0ZW50X3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcgYi9hcmNoL2NyaXMvYXJjaC12MTAvS2NvbmZpZwppbmRleCA0NGViMWI5Li5jN2VhOWVmIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvS2NvbmZpZwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YxMAogCWRlZmF1bHQgIjk1YTYiCiAJaGVscAotCSAgV2FpdHN0YXRlcyBmb3IgU1JBTSwgRmxhc2ggYW5kIHBlcmlwaGVyaWFscyAobm90IERSQU0pLiAgOTVmOCBpcyBhCisJICBXYWl0c3RhdGVzIGZvciBTUkFNLCBGbGFzaCBhbmQgcGVyaXBoZXJhbHMgKG5vdCBEUkFNKS4gIDk1ZjggaXMgYQogCSAgZ29vZCBjaG9pY2UgZm9yIG1vc3QgQXhpcyBwcm9kdWN0cy4uLgogCiBjb25maWcgRVRSQVhfREVGX1JfQlVTX0NPTkZJRwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvS2NvbmZpZyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL0tjb25maWcKaW5kZXggNzM0ZDVmMy4uZTdlNzI0YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvS2NvbmZpZwpAQCAtODM5LDcgKzgzOSw3IEBACiAJZGVmYXVsdCAiMCIKIAloZWxwCiAJICBUaGlzIGNvbnRyb2xzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSB0cmlja2xlIGNoYXJnZSByZWdpc3Rlci4KLQkgIDAgPSBkaXNhYmxlZCAodXNlIHRoaXMgaWYgeW91IGFyZSB1bnN1cmUgb3IgaGF2ZSBhIG5vbiByZWNoYXJnYWJsZSBiYXR0ZXJ5KQorCSAgMCA9IGRpc2FibGVkICh1c2UgdGhpcyBpZiB5b3UgYXJlIHVuc3VyZSBvciBoYXZlIGEgbm9uIHJlY2hhcmdlYWJsZSBiYXR0ZXJ5KQogCSAgT3RoZXJ3aXNlIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGNhbiBiZSBPUjplZCB0b2dldGhlciB0byBjb250cm9sIHRoZQogCSAgY2hhcmdlIGN1cnJlbnQ6CiAJICAxID0gMmtvaG0sIDIgPSA0a29obSwgMyA9IDRrb2htCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9lZXByb20uYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2VlcHJvbS5jCmluZGV4IDZlMWYxOTEuLjI4NGViZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2VlcHJvbS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2VlcHJvbS5jCkBAIC0xLDcgKzEsNyBAQAogLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICohCi0qISAgSW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIGkyYyBjb21wYXRpYmxlIGVlcHJvbXMgdG8gcnVuIHVuZGVyIGxpbnV4LgotKiEgIFN1cHBvcnRzIDJrLCA4ayg/KSBhbmQgMTZrLiBVc2VzIGFkYXB0aXZlIHRpbWluZyBhZGp1c3RlbnRzIGJ5CisqISAgSW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIGkyYyBjb21wYXRpYmxlIGVlcHJvbXMgdG8gcnVuIHVuZGVyIExpbnV4LgorKiEgIFN1cHBvcnRzIDJrLCA4ayg/KSBhbmQgMTZrLiBVc2VzIGFkYXB0aXZlIHRpbWluZyBhZGp1c3RtZW50cyBieQogKiEgIEpvaGFuLkFkb2xmc3NvbkBheGlzLmNvbQogKiEKICohICBQcm9iaW5nIHJlc3VsdHM6CkBAIC01MSw3ICs1MSw3IEBACiAqISAgUmV2aXNpb24gMS44ICAyMDAxLzA2LzE1IDEzOjI0OjI5ICBqb25hc2hnCiAqISAgKiBBZGRlZCB2ZXJpZmljYXRpb24gb2YgcG9pbnRlcnMgZnJvbSB1c2Vyc3BhY2UgaW4gcmVhZCBhbmQgd3JpdGUuCiAqISAgKiBNYWRlIGJ1c3kgY291bnRlciB2b2xhdGlsZS4KLSohICAqIEFkZGVkIGRlZmluZSBmb3IgaW5pdGFsIHdyaXRlIGRlbGF5LgorKiEgICogQWRkZWQgZGVmaW5lIGZvciBpbml0aWFsIHdyaXRlIGRlbGF5LgogKiEgICogUmVtb3ZlZCB3YXJuaW5ncyBieSB1c2luZyBsb2ZmX3QgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLgogKiEKICohICBSZXZpc2lvbiAxLjcgIDIwMDEvMDYvMTQgMTU6MjY6NTQgIGpvbmFzaGcKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2kyYy5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMKaW5kZXggNjExNDU5Ni4uMDkyYzcyNCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICohIFVwZGF0ZSBQb3J0IEIgcmVnaXN0ZXIgYW5kIHNoYWRvdyBldmVuIHdoZW4gcnVubmluZyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQKICohICAgdG8gYXZvaWQgZ2xpdGNoZXMgd2hlbiByZWFkaW5nIGJpdHMKICohIE5ldmVyIHNldCBkaXJlY3Rpb24gdG8gb3V0IGluIGkyY19pbmJ5dGUKLSohIFJlbW92ZWQgaW5jb3JyZWN0IGNsb2NrIHRvZ2xpbmcgYXQgZW5kIG9mIGkyY19pbmJ5dGUKKyohIFJlbW92ZWQgaW5jb3JyZWN0IGNsb2NrIHRvZ2dsaW5nIGF0IGVuZCBvZiBpMmNfaW5ieXRlCiAqIQogKiEgUmV2aXNpb24gMS44ICAyMDAyLzA4LzEzIDA2OjMxOjUzICBzdGFydmlrCiAqISBNYWRlIFNEQSBhbmQgU0NMIGxpbmUgY29uZmlndXJhYmxlCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2tnZGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jCmluZGV4IDM0NTI4ZGEuLjA3NjI4YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jCkBAIC0zMyw3ICszMyw3IEBACiAqIQogKiEgUmV2aXNpb24gMS4yICAyMDAyLzExLzE5IDE0OjM1OjI0ICBzdGFydmlrCiAqISBDaGFuZ2VzIGZyb20gbGludXggMi40Ci0qISBDaGFuZ2VkIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXggdG8gdGhlIGN1cnJlbnRseSBwcmVmZXJlZCBub3RhdGlvbgorKiEgQ2hhbmdlZCBzdHJ1Y3QgaW5pdGlhbGl6ZXIgc3ludGF4IHRvIHRoZSBjdXJyZW50bHkgcHJlZmVycmVkIG5vdGF0aW9uCiAqIQogKiEgUmV2aXNpb24gMS4xICAyMDAxLzEyLzE3IDEzOjU5OjI3ICBiam9ybncKICohIEluaXRpYWwgcmV2aXNpb24KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvb2xkX2NoZWNrc3VtLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAvbGliL29sZF9jaGVja3N1bS5jCmluZGV4IDIyYTZmMGEuLjQ5NzYzNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvb2xkX2NoZWNrc3VtLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9vbGRfY2hlY2tzdW0uYwpAQCAtNDcsMzkgKzQ3LDQxIEBACiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KIAotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqcCwgaW50IGxlbiwgX193c3VtIF9fc3VtKQogewotICAvKgotICAgKiBFeHBlcmltZW50cyB3aXRoIGV0aGVybmV0IGFuZCBzbGlwIGNvbm5lY3Rpb25zIHNob3cgdGhhdCBidWZmCi0gICAqIGlzIGFsaWduZWQgb24gZWl0aGVyIGEgMi1ieXRlIG9yIDQtYnl0ZSBib3VuZGFyeS4KLSAgICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZE1hcmtlciA9IGJ1ZmYgKyBsZW47Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hcmtlciA9IGVuZE1hcmtlciAtIChsZW4gJSAxNik7CisJdTMyIHN1bSA9IChfX2ZvcmNlIHUzMilfX3N1bTsKKwljb25zdCB1MTYgKmJ1ZmYgPSBwOworCS8qCisJKiBFeHBlcmltZW50cyB3aXRoIGV0aGVybmV0IGFuZCBzbGlwIGNvbm5lY3Rpb25zIHNob3cgdGhhdCBidWZmCisJKiBpcyBhbGlnbmVkIG9uIGVpdGhlciBhIDItYnl0ZSBvciA0LWJ5dGUgYm91bmRhcnkuCisJKi8KKwljb25zdCB2b2lkICplbmRNYXJrZXIgPSBwICsgbGVuOworCWNvbnN0IHZvaWQgKm1hcmtlciA9IGVuZE1hcmtlciAtIChsZW4gJSAxNik7CiAjaWYgMAotICBpZigoaW50KWJ1ZmYgJiAweDMpCi0gICAgcHJpbnRrKCJ1bmFsaWduZWQgYnVmZiAlcFxuIiwgYnVmZik7Ci0gIF9fZGVsYXkoOTAwKTsgLyogZXh0cmEgZGVsYXkgb2YgOTAgdXMgdG8gdGVzdCBwZXJmb3JtYW5jZSBoaXQgKi8KKwlpZigoaW50KWJ1ZmYgJiAweDMpCisJCXByaW50aygidW5hbGlnbmVkIGJ1ZmYgJXBcbiIsIGJ1ZmYpOworCV9fZGVsYXkoOTAwKTsgLyogZXh0cmEgZGVsYXkgb2YgOTAgdXMgdG8gdGVzdCBwZXJmb3JtYW5jZSBoaXQgKi8KICNlbmRpZgotICBCSVRPTjsKLSAgd2hpbGUgKGJ1ZmYgPCBtYXJrZXIpIHsKLSAgICBzdW0gKz0gKigodW5zaWduZWQgc2hvcnQgKilidWZmKSsrOwotICAgIHN1bSArPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWJ1ZmYpKys7Ci0gICAgc3VtICs9ICooKHVuc2lnbmVkIHNob3J0ICopYnVmZikrKzsKLSAgICBzdW0gKz0gKigodW5zaWduZWQgc2hvcnQgKilidWZmKSsrOwotICAgIHN1bSArPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWJ1ZmYpKys7Ci0gICAgc3VtICs9ICooKHVuc2lnbmVkIHNob3J0ICopYnVmZikrKzsKLSAgICBzdW0gKz0gKigodW5zaWduZWQgc2hvcnQgKilidWZmKSsrOwotICAgIHN1bSArPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWJ1ZmYpKys7Ci0gIH0KLSAgbWFya2VyID0gZW5kTWFya2VyIC0gKGxlbiAlIDIpOwotICB3aGlsZShidWZmIDwgbWFya2VyKSB7Ci0gICAgc3VtICs9ICooKHVuc2lnbmVkIHNob3J0ICopYnVmZikrKzsKLSAgfQotICBpZihlbmRNYXJrZXIgLSBidWZmID4gMCkgewotICAgIHN1bSArPSAqYnVmZjsgICAgICAgICAgICAgICAgIC8qIGFkZCBleHRyYSBieXRlIHNlcGVyYXRlbHkgKi8KLSAgfQotICBCSVRPRkY7Ci0gIHJldHVybihzdW0pOworCUJJVE9OOworCXdoaWxlIChidWZmIDwgbWFya2VyKSB7CisJCXN1bSArPSAqYnVmZisrOworCQlzdW0gKz0gKmJ1ZmYrKzsKKwkJc3VtICs9ICpidWZmKys7CisJCXN1bSArPSAqYnVmZisrOworCQlzdW0gKz0gKmJ1ZmYrKzsKKwkJc3VtICs9ICpidWZmKys7CisJCXN1bSArPSAqYnVmZisrOworCQlzdW0gKz0gKmJ1ZmYrKzsKKwl9CisJbWFya2VyID0gZW5kTWFya2VyIC0gKGxlbiAlIDIpOworCXdoaWxlIChidWZmIDwgbWFya2VyKQorCQlzdW0gKz0gKmJ1ZmYrKzsKKworCWlmIChlbmRNYXJrZXIgPiBidWZmKQorCQlzdW0gKz0gKihjb25zdCB1OCAqKWJ1ZmY7CS8qIGFkZCBleHRyYSBieXRlIHNlcGVyYXRlbHkgKi8KKworCUJJVE9GRjsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXN1bTsKIH0KIAogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvS2NvbmZpZyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL0tjb25maWcKaW5kZXggYTMzMDk3Zi4uZjY0NjI0ZiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9LY29uZmlnCkBAIC04OCw3ICs4OCw3IEBACiAJaGVscAogCSAgRW5hYmxlcyB0aGUgRE1BNyBpbnB1dCBjaGFubmVsIGZvciBzZXIwICh0dHlTMCkuCiAJICBJZiB5b3UgZG8gbm90IGVuYWJsZSBETUEsIGFuIGludGVycnVwdCBmb3IgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZQotCSAgdXNlZCB3aGVuIHJlY2VpdmVpbmcgZGF0YS4KKwkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KIAkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKIAkgIHNvbWV0aGluZyBlbHNlLgogCkBAIC0xNTcsNyArMTU3LDcgQEAKIAloZWxwCiAJICBFbmFibGVzIHRoZSBETUE1IGlucHV0IGNoYW5uZWwgZm9yIHNlcjEgKHR0eVMxKS4KIAkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gcmVjZWl2ZWluZyBkYXRhLgorCSAgdXNlZCB3aGVuIHJlY2VpdmluZyBkYXRhLgogCSAgTm9ybWFsbHkgeW91IHdhbnQgdGhpcyBvbiwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgogCSAgc29tZXRoaW5nIGVsc2UuCiAKQEAgLTIyOCw3ICsyMjgsNyBAQAogCWhlbHAKIAkgIEVuYWJsZXMgdGhlIERNQTMgaW5wdXQgY2hhbm5lbCBmb3Igc2VyMiAodHR5UzIpLgogCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKLQkgIHVzZWQgd2hlbiByZWNlaXZlaW5nIGRhdGEuCisJICB1c2VkIHdoZW4gcmVjZWl2aW5nIGRhdGEuCiAJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCiAJICBzb21ldGhpbmcgZWxzZS4KIApAQCAtMjk3LDcgKzI5Nyw3IEBACiAJaGVscAogCSAgRW5hYmxlcyB0aGUgRE1BOSBpbnB1dCBjaGFubmVsIGZvciBzZXIzICh0dHlTMykuCiAJICBJZiB5b3UgZG8gbm90IGVuYWJsZSBETUEsIGFuIGludGVycnVwdCBmb3IgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZQotCSAgdXNlZCB3aGVuIHJlY2VpdmVpbmcgZGF0YS4KKwkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KIAkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKIAkgIHNvbWV0aGluZyBlbHNlLgogCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9saWIvY2hlY2tzdW0uYyBiL2FyY2gvZnJ2L2xpYi9jaGVja3N1bS5jCmluZGV4IDIwZTdkZmMuLjQ0ZTE2ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvZnJ2L2xpYi9jaGVja3N1bS5jCkBAIC0zMiw3ICszMiw2IEBACiAgICBvZiB0aGUgYXNzZW1ibHkgaGFzIHRvIGdvLiAqLwogCiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZnJvbTMydG8xNih1bnNpZ25lZCBsb25nIHgpCkBAIC0xMDUsMTUgKzEwNCwxNSBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOwotCWlmIChzdW0gPiByZXN1bHQpCisJcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilzdW07CisJaWYgKChfX2ZvcmNlIHUzMilzdW0gPiByZXN1bHQpCiAJCXJlc3VsdCArPSAxOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKQEAgLTEyMiw5ICsxMjEsOSBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7Ci0JcmV0dXJuIH5kb19jc3VtKGJ1ZmYsIGxlbik7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oYnVmZiwgbGVuKTsKIH0KIAogRVhQT1JUX1NZTUJPTChpcF9jb21wdXRlX2NzdW0pOwpAQCAtMTMyLDkgKzEzMSw5IEBACiAvKgogICogY29weSBmcm9tIGZzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwKLQkJCSAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpCiB7CiAJaW50IHJlbTsKIApAQCAtMTU3LDExICsxNTYsMTEgQEAKIC8qCiAgKiBjb3B5IGZyb20gZHMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weShjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKIH0KIAotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weSk7CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvaDgzMDBfa3N5bXMuYyBiL2FyY2gvaDgzMDAva2VybmVsL2g4MzAwX2tzeW1zLmMKaW5kZXggOWI0YmUwNS4uZDFiMTUyNiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvaDgzMDBfa3N5bXMuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9oODMwMF9rc3ltcy5jCkBAIC0zOSw3ICszOSw3IEBACiBFWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKIAogLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5KTsKK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayk7CiAKIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGV5J3JlIG5vdCBjYWxsZWQKICAgIGV4cGxpY2l0bHkgKHRoZSBDIGNvbXBpbGVyIGdlbmVyYXRlcyB0aGVtKS4gIEZvcnR1bmF0ZWx5LApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaDgzMDAvbGliL2NoZWNrc3VtLmMKaW5kZXggNWFhNjg4ZC4uYmRjNWIwMyAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2g4MzAwL2xpYi9jaGVja3N1bS5jCkBAIC05Niw5ICs5Niw5IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwgdW5zaWduZWQgaW50IGlobCkKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKLQlyZXR1cm4gfmRvX2NzdW0oaXBoLGlobCo0KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShpcGgsaWhsKjQpOwogfQogCiAvKgpAQCAtMTEzLDE1ICsxMTMsMTkgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKKy8qCisgKiBFZ2Fkcy4uLiAgVGhhdCB0aGluZyBhcHBhcmVudGx5IGFzc3VtZXMgdGhhdCAqYWxsKiBjaGVja3N1bXMgaXQgZXZlciBzZWVzIHdpbGwKKyAqIGJlIGZvbGRlZC4gIFZlcnkgbGlrZWx5IGEgYnVnLgorICovCitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IGRvX2NzdW0oYnVmZiwgbGVuKTsKIAogCS8qIGFkZCBpbiBvbGQgc3VtLCBhbmQgY2FycnkuLiAqLwotCXJlc3VsdCArPSBzdW07CisJcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilzdW07CiAJLyogMTYrYyBiaXRzIC0+IDE2IGJpdHMgKi8KIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmKSArIChyZXN1bHQgPj4gMTYpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKQEAgLTEzMCwyMCArMTM0LDIxIEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKLQlyZXR1cm4gfmRvX2NzdW0oYnVmZixsZW4pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGJ1ZmYsbGVuKTsKIH0KIAogLyoKICAqIGNvcHkgZnJvbSBmcyB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJICAgIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpCiB7CiAJaWYgKGNzdW1fZXJyKSAqY3N1bV9lcnIgPSAwOwotCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwltZW1jcHkoZHN0LCAoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKQEAgLTE1MSw4ICsxNTYsOCBAQAogICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weShjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IGQxMmZiOTcuLmM4Zjk2Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAvKgogICogUGFyc2UgSW50ZXJydXB0IFNvdXJjZSBPdmVycmlkZSBmb3IgdGhlIEFDUEkgU0NJCiAgKi8KLXN0YXRpYyB2b2lkIGFjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgYnVzX2lycSwgdTMyIGdzaSwgdTE2IHBvbGFyaXR5LCB1MTYgdHJpZ2dlcikKK3N0YXRpYyB2b2lkIGFjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQogewogCWlmICh0cmlnZ2VyID09IDApCS8qIGNvbXBhdGlibGUgU0NJIHRyaWdnZXIgaXMgbGV2ZWwgKi8KIAkJdHJpZ2dlciA9IDM7CkBAIC0zNTMsMTMgKzM1MywxMyBAQAogCSAqIElmIEdTSSBpcyA8IDE2LCB0aGlzIHdpbGwgdXBkYXRlIGl0cyBmbGFncywKIAkgKiBlbHNlIGl0IHdpbGwgY3JlYXRlIGEgbmV3IG1wX2lycXNbXSBlbnRyeS4KIAkgKi8KLQltcF9vdmVycmlkZV9sZWdhY3lfaXJxKGJ1c19pcnEsIHBvbGFyaXR5LCB0cmlnZ2VyLCBnc2kpOworCW1wX292ZXJyaWRlX2xlZ2FjeV9pcnEoZ3NpLCBwb2xhcml0eSwgdHJpZ2dlciwgZ3NpKTsKIAogCS8qCiAJICogc3Rhc2ggb3Zlci1yaWRlIHRvIGluZGljYXRlIHdlJ3ZlIGJlZW4gaGVyZQogCSAqIGFuZCBmb3IgbGF0ZXIgdXBkYXRlIG9mIGFjcGlfZmFkdAogCSAqLwotCWFjcGlfc2NpX292ZXJyaWRlX2dzaSA9IGJ1c19pcnE7CisJYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpID0gZ3NpOwogCXJldHVybjsKIH0KIApAQCAtMzc3LDcgKzM3Nyw3IEBACiAJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CiAKIAlpZiAoaW50c3JjLT5idXNfaXJxID09IGFjcGlfZmFkdC5zY2lfaW50KSB7Ci0JCWFjcGlfc2NpX2lvYXBpY19zZXR1cChpbnRzcmMtPmJ1c19pcnEsIGludHNyYy0+Z2xvYmFsX2lycSwKKwkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGludHNyYy0+Z2xvYmFsX2lycSwKIAkJCQkgICAgICBpbnRzcmMtPmZsYWdzLnBvbGFyaXR5LAogCQkJCSAgICAgIGludHNyYy0+ZmxhZ3MudHJpZ2dlcik7CiAJCXJldHVybiAwOwpAQCAtODgwLDcgKzg4MCw3IEBACiAJICogcHJldGVuZCB3ZSBnb3Qgb25lIHNvIHdlIGNhbiBzZXQgdGhlIFNDSSBmbGFncy4KIAkgKi8KIAlpZiAoIWFjcGlfc2NpX292ZXJyaWRlX2dzaSkKLQkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGFjcGlfZmFkdC5zY2lfaW50LCBhY3BpX2ZhZHQuc2NpX2ludCwgMCwgMCk7CisJCWFjcGlfc2NpX2lvYXBpY19zZXR1cChhY3BpX2ZhZHQuc2NpX2ludCwgMCwgMCk7CiAKIAkvKiBGaWxsIGluIGlkZW50aXR5IGxlZ2FjeSBtYXBpbmdzIHdoZXJlIG5vIG92ZXJyaWRlICovCiAJbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwppbmRleCAyMDU2M2U1Li40NjY0YjU1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCmluZGV4IDU4M2MyMzguLjUzNWY5NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKaW5kZXggMmQ4NzAzYi4uYmFkOGI0NCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL3RoZXJtX3Rocm90Lmg+CiAKIC8qIEhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiByZXBvcnRpbmcgdGhlcm1hbCBldmVudHMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1aWQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1aWQuYwppbmRleCBmZGU4YmVhLi5hYjBjMzI3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdWlkLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jCkBAIC0xNTYsMTQgKzE1NiwxNCBAQAogCS5vcGVuID0gY3B1aWRfb3BlbiwKIH07CiAKLXN0YXRpYyBpbnQgY3B1aWRfY2xhc3NfZGV2aWNlX2NyZWF0ZShpbnQgaSkKK3N0YXRpYyBpbnQgY3B1aWRfZGV2aWNlX2NyZWF0ZShpbnQgaSkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisJc3RydWN0IGRldmljZSAqZGV2OwogCi0JY2xhc3NfZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShjcHVpZF9jbGFzcywgTlVMTCwgTUtERVYoQ1BVSURfTUFKT1IsIGkpLCBOVUxMLCAiY3B1JWQiLGkpOwotCWlmIChJU19FUlIoY2xhc3NfZXJyKSkKLQkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCWRldiA9IGRldmljZV9jcmVhdGUoY3B1aWRfY2xhc3MsIE5VTEwsIE1LREVWKENQVUlEX01BSk9SLCBpKSwgImNwdSVkIixpKTsKKwlpZiAoSVNfRVJSKGRldikpCisJCWVyciA9IFBUUl9FUlIoZGV2KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNzQsMTAgKzE3NCwxMCBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9PTkxJTkU6Ci0JCWNwdWlkX2NsYXNzX2RldmljZV9jcmVhdGUoY3B1KTsKKwkJY3B1aWRfZGV2aWNlX2NyZWF0ZShjcHUpOwogCQlicmVhazsKIAljYXNlIENQVV9ERUFEOgotCQljbGFzc19kZXZpY2VfZGVzdHJveShjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCQlkZXZpY2VfZGVzdHJveShjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQlnb3RvIG91dF9jaHJkZXY7CiAJfQogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQllcnIgPSBjcHVpZF9jbGFzc19kZXZpY2VfY3JlYXRlKGkpOworCQllcnIgPSBjcHVpZF9kZXZpY2VfY3JlYXRlKGkpOwogCQlpZiAoZXJyICE9IDApIAogCQkJZ290byBvdXRfY2xhc3M7CiAJfQpAQCAtMjE4LDcgKzIxOCw3IEBACiBvdXRfY2xhc3M6CiAJaSA9IDA7CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KGNwdWlkX2NsYXNzLCBNS0RFVihDUFVJRF9NQUpPUiwgaSkpOworCQlkZXZpY2VfZGVzdHJveShjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGkpKTsKIAl9CiAJY2xhc3NfZGVzdHJveShjcHVpZF9jbGFzcyk7CiBvdXRfY2hyZGV2OgpAQCAtMjMyLDcgKzIzMiw3IEBACiAJaW50IGNwdSA9IDA7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koY3B1aWRfY2xhc3MsIE1LREVWKENQVUlEX01BSk9SLCBjcHUpKTsKKwkJZGV2aWNlX2Rlc3Ryb3koY3B1aWRfY2xhc3MsIE1LREVWKENQVUlEX01BSk9SLCBjcHUpKTsKIAljbGFzc19kZXN0cm95KGNwdWlkX2NsYXNzKTsKIAl1bnJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIpOwogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKaW5kZXggZDUzNWNkYi4uYTc3M2Y3NyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYworKysgYi9hcmNoL2kzODYva2VybmVsL21zci5jCkBAIC0yMzksMTQgKzIzOSwxNCBAQAogCS5vcGVuID0gbXNyX29wZW4sCiB9OwogCi1zdGF0aWMgaW50IG1zcl9jbGFzc19kZXZpY2VfY3JlYXRlKGludCBpKQorc3RhdGljIGludCBtc3JfZGV2aWNlX2NyZWF0ZShpbnQgaSkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisJc3RydWN0IGRldmljZSAqZGV2OwogCi0JY2xhc3NfZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShtc3JfY2xhc3MsIE5VTEwsIE1LREVWKE1TUl9NQUpPUiwgaSksIE5VTEwsICJtc3IlZCIsaSk7Ci0JaWYgKElTX0VSUihjbGFzc19lcnIpKSAKLQkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCWRldiA9IGRldmljZV9jcmVhdGUobXNyX2NsYXNzLCBOVUxMLCBNS0RFVihNU1JfTUFKT1IsIGkpLCAibXNyJWQiLGkpOworCWlmIChJU19FUlIoZGV2KSkKKwkJZXJyID0gUFRSX0VSUihkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI1OCwxMCArMjU4LDEwIEBACiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX09OTElORToKLQkJbXNyX2NsYXNzX2RldmljZV9jcmVhdGUoY3B1KTsKKwkJbXNyX2RldmljZV9jcmVhdGUoY3B1KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3kobXNyX2NsYXNzLCBNS0RFVihNU1JfTUFKT1IsIGNwdSkpOworCQlkZXZpY2VfZGVzdHJveShtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgY3B1KSk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gTk9USUZZX09LOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJCWdvdG8gb3V0X2NocmRldjsKIAl9CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCWVyciA9IG1zcl9jbGFzc19kZXZpY2VfY3JlYXRlKGkpOworCQllcnIgPSBtc3JfZGV2aWNlX2NyZWF0ZShpKTsKIAkJaWYgKGVyciAhPSAwKQogCQkJZ290byBvdXRfY2xhc3M7CiAJfQpAQCAtMzAyLDcgKzMwMiw3IEBACiBvdXRfY2xhc3M6CiAJaSA9IDA7CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQljbGFzc19kZXZpY2VfZGVzdHJveShtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgaSkpOworCQlkZXZpY2VfZGVzdHJveShtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgaSkpOwogCWNsYXNzX2Rlc3Ryb3kobXNyX2NsYXNzKTsKIG91dF9jaHJkZXY6CiAJdW5yZWdpc3Rlcl9jaHJkZXYoTVNSX01BSk9SLCAiY3B1L21zciIpOwpAQCAtMzE0LDcgKzMxNCw3IEBACiB7CiAJaW50IGNwdSA9IDA7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCWNsYXNzX2RldmljZV9kZXN0cm95KG1zcl9jbGFzcywgTUtERVYoTVNSX01BSk9SLCBjcHUpKTsKKwkJZGV2aWNlX2Rlc3Ryb3kobXNyX2NsYXNzLCBNS0RFVihNU1JfTUFKT1IsIGNwdSkpOwogCWNsYXNzX2Rlc3Ryb3kobXNyX2NsYXNzKTsKIAl1bnJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIik7CiAJdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1zcl9jbGFzc19jcHVfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL2kzODYva2VybmVsL3BjaS1kbWEuYwppbmRleCAyNWZlNjY4Li41YzhjNmVmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL2kzODYva2VybmVsL3BjaS1kbWEuYwpAQCAtNzUsNyArNzUsNyBAQAogaW50IGRtYV9kZWNsYXJlX2NvaGVyZW50X21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCiAJCQkJZG1hX2FkZHJfdCBkZXZpY2VfYWRkciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQl2b2lkIF9faW9tZW0gKm1lbV9iYXNlOworCXZvaWQgX19pb21lbSAqbWVtX2Jhc2UgPSBOVUxMOwogCWludCBwYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKIAlpbnQgYml0bWFwX3NpemUgPSAocGFnZXMgKyAzMSkvMzI7CiAKQEAgLTExNCw2ICsxMTQsOCBAQAogIGZyZWUxX291dDoKIAlrZnJlZShkZXYtPmRtYV9tZW0tPmJpdG1hcCk7CiAgb3V0OgorCWlmIChtZW1fYmFzZSkKKwkJaW91bm1hcChtZW1fYmFzZSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRtYV9kZWNsYXJlX2NvaGVyZW50X21lbW9yeSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2NvbW1vbi5jIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwppbmRleCBjZGZjZjk3Li41M2NhNmU4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKQEAgLTIwLDcgKzIwLDcgQEAKIHVuc2lnbmVkIGludCBwY2lfcHJvYmUgPSBQQ0lfUFJPQkVfQklPUyB8IFBDSV9QUk9CRV9DT05GMSB8IFBDSV9QUk9CRV9DT05GMiB8CiAJCQkJUENJX1BST0JFX01NQ09ORjsKIAotaW50IHBjaV9iZl9zb3J0Oworc3RhdGljIGludCBwY2lfYmZfc29ydDsKIGludCBwY2lfcm91dGVpcnE7CiBpbnQgcGNpYmlvc19sYXN0X2J1cyA9IC0xOwogdW5zaWduZWQgbG9uZyBwaXJxX3RhYmxlX2FkZHI7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2ZpeHVwLmMgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKaW5kZXggYzE5NDlmZi4uY2RlMTE3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9maXh1cC5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvZml4dXAuYwpAQCAtNzQsNTIgKzc0LDYgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX05DUiwgUENJX0RFVklDRV9JRF9OQ1JfNTNDODEwLCBwY2lfZml4dXBfbmNyNTNjODEwKTsKIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9pZGVfYmFzZXMoc3RydWN0IHBjaV9kZXYgKmQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFBDSSBJREUgY29udHJvbGxlcnMgdXNlIG5vbi1zdGFuZGFyZCBJL08gcG9ydCBkZWNvZGluZywgcmVzcGVjdCBpdC4KLQkgKi8KLQlpZiAoKGQtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKLQkJcmV0dXJuOwotCURCRygiUENJOiBJREUgYmFzZSBhZGRyZXNzIGZpeHVwIGZvciAlc1xuIiwgcGNpX25hbWUoZCkpOwotCWZvcihpPTA7IGk8NDsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkLT5yZXNvdXJjZVtpXTsKLQkJaWYgKChyLT5zdGFydCAmIH4weDgwKSA9PSAweDM3NCkgewotCQkJci0+c3RhcnQgfD0gMjsKLQkJCXItPmVuZCA9IHItPnN0YXJ0OwotCQl9Ci0JfQotfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9maXh1cF9pZGVfYmFzZXMpOwotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgIHBjaV9maXh1cF9pZGVfdHJhc2goc3RydWN0IHBjaV9kZXYgKmQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFJ1bnMgdGhlIGZpeHVwIG9ubHkgZm9yIHRoZSBmaXJzdCBJREUgY29udHJvbGxlcgotCSAqIChTaGFpIEZ1bHRoZWltIC0gc2hhaUBmdGNvbi5jb20pCi0JICovCi0Jc3RhdGljIGludCBjYWxsZWQgPSAwOwotCWlmIChjYWxsZWQpCi0JCXJldHVybjsKLQljYWxsZWQgPSAxOwotCi0JLyoKLQkgKiBUaGVyZSBleGlzdCBQQ0kgSURFIGNvbnRyb2xsZXJzIHdoaWNoIGhhdmUgdXR0ZXIgZ2FyYmFnZQotCSAqIGluIGZpcnN0IGZvdXIgYmFzZSByZWdpc3RlcnMuIElnbm9yZSB0aGF0LgotCSAqLwotCURCRygiUENJOiBJREUgYmFzZSBhZGRyZXNzIHRyYXNoIGNsZWFyZWQgZm9yICVzXG4iLCBwY2lfbmFtZShkKSk7Ci0JZm9yKGk9MDsgaTw0OyBpKyspCi0JCWQtPnJlc291cmNlW2ldLnN0YXJ0ID0gZC0+cmVzb3VyY2VbaV0uZW5kID0gZC0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOwotfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTUxMywgcGNpX2ZpeHVwX2lkZV90cmFzaCk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwLCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTEsIHBjaV9maXh1cF9pZGVfdHJhc2gpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl85LCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKLQogc3RhdGljIHZvaWQgX19kZXZpbml0ICBwY2lfZml4dXBfbGF0ZW5jeShzdHJ1Y3QgcGNpX2RldiAqZCkKIHsKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMgYi9hcmNoL2kzODYvcGNpL2kzODYuYwppbmRleCA5ODU4MDI5Li40MzAwNWYwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2kzODYuYworKysgYi9hcmNoL2kzODYvcGNpL2kzODYuYwpAQCAtMTA0LDE2ICsxMDQsMjQgQEAKIAkvKiBEZXB0aC1GaXJzdCBTZWFyY2ggb24gYnVzIHRyZWUgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgYnVzX2xpc3QsIG5vZGUpIHsKIAkJaWYgKChkZXYgPSBidXMtPnNlbGYpKSB7Ci0JCQlmb3IgKGlkeCA9IFBDSV9CUklER0VfUkVTT1VSQ0VTOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwkJCWZvciAoaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7CisJCQkgICAgaWR4IDwgUENJX05VTV9SRVNPVVJDRVM7IGlkeCsrKSB7CiAJCQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CiAJCQkJaWYgKCFyLT5mbGFncykKIAkJCQkJY29udGludWU7CiAJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKLQkJCQlpZiAoIXItPnN0YXJ0IHx8ICFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSByZWdpb24gJWQgb2YgYnJpZGdlICVzXG4iLCBpZHgsIHBjaV9uYW1lKGRldikpOwotCQkJCQkvKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcmVnaW9uLgotCQkJCQkgICBJbnZhbGlkYXRlIHRoZSByZXNvdXJjZSB0byBwcmV2ZW50IGNoaWxkCi0JCQkJCSAgIHJlc291cmNlIGFsbG9jYXRpb25zIGluIHRoaXMgcmFuZ2UuICovCisJCQkJaWYgKCFyLT5zdGFydCB8fCAhcHIgfHwKKwkJCQkgICAgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgYWxsb2NhdGUgIgorCQkJCQkJInJlc291cmNlIHJlZ2lvbiAlZCAiCisJCQkJCQkib2YgYnJpZGdlICVzXG4iLAorCQkJCQkJaWR4LCBwY2lfbmFtZShkZXYpKTsKKwkJCQkJLyoKKwkJCQkJICogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHJlZ2lvbi4KKwkJCQkJICogSW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgdG8gcHJldmVudAorCQkJCQkgKiBjaGlsZCByZXNvdXJjZSBhbGxvY2F0aW9ucyBpbiB0aGlzCisJCQkJCSAqIHJhbmdlLgorCQkJCQkgKi8KIAkJCQkJci0+ZmxhZ3MgPSAwOwogCQkJCX0KIAkJCX0KQEAgLTEzMSw3ICsxMzksNyBAQAogCiAJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOwotCQlmb3IoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBQQ0lfUk9NX1JFU09VUkNFOyBpZHgrKykgewogCQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CiAJCQlpZiAoci0+cGFyZW50KQkJLyogQWxyZWFkeSBhbGxvY2F0ZWQgKi8KIAkJCQljb250aW51ZTsKQEAgLTE0MiwxMSArMTUwLDE1IEBACiAJCQllbHNlCiAJCQkJZGlzYWJsZWQgPSAhKGNvbW1hbmQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpOwogCQkJaWYgKHBhc3MgPT0gZGlzYWJsZWQpIHsKLQkJCQlEQkcoIlBDSTogUmVzb3VyY2UgJTA4bHgtJTA4bHggKGY9JWx4LCBkPSVkLCBwPSVkKVxuIiwKKwkJCQlEQkcoIlBDSTogUmVzb3VyY2UgJTA4bHgtJTA4bHggIgorCQkJCSAgICAiKGY9JWx4LCBkPSVkLCBwPSVkKVxuIiwKIAkJCQkgICAgci0+c3RhcnQsIHItPmVuZCwgci0+ZmxhZ3MsIGRpc2FibGVkLCBwYXNzKTsKIAkJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOwogCQkJCWlmICghcHIgfHwgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICVkIG9mIGRldmljZSAlc1xuIiwgaWR4LCBwY2lfbmFtZShkZXYpKTsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSAiCisJCQkJCQkicmVzb3VyY2UgcmVnaW9uICVkICIKKwkJCQkJCSJvZiBkZXZpY2UgJXNcbiIsCisJCQkJCQlpZHgsIHBjaV9uYW1lKGRldikpOwogCQkJCQkvKiBXZSdsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyBsYXRlciAqLwogCQkJCQlyLT5lbmQgLT0gci0+c3RhcnQ7CiAJCQkJCXItPnN0YXJ0ID0gMDsKQEAgLTE1NiwxMiArMTY4LDE2IEBACiAJCWlmICghcGFzcykgewogCQkJciA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOwogCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fRU5BQkxFKSB7Ci0JCQkJLyogVHVybiB0aGUgUk9NIG9mZiwgbGVhdmUgdGhlIHJlc291cmNlIHJlZ2lvbiwgYnV0IGtlZXAgaXQgdW5yZWdpc3RlcmVkLiAqLworCQkJCS8qIFR1cm4gdGhlIFJPTSBvZmYsIGxlYXZlIHRoZSByZXNvdXJjZSByZWdpb24sCisJCQkJICogYnV0IGtlZXAgaXQgdW5yZWdpc3RlcmVkLiAqLwogCQkJCXUzMiByZWc7Ci0JCQkJREJHKCJQQ0k6IFN3aXRjaGluZyBvZmYgUk9NIG9mICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJCQlEQkcoIlBDSTogU3dpdGNoaW5nIG9mZiBST00gb2YgJXNcbiIsCisJCQkJCXBjaV9uYW1lKGRldikpOwogCQkJCXItPmZsYWdzICY9IH5JT1JFU09VUkNFX1JPTV9FTkFCTEU7Ci0JCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZGV2LT5yb21fYmFzZV9yZWcsICZyZWcpOwotCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBkZXYtPnJvbV9iYXNlX3JlZywgcmVnICYgflBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsCisJCQkJCQlkZXYtPnJvbV9iYXNlX3JlZywgJnJlZyk7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGRldi0+cm9tX2Jhc2VfcmVnLAorCQkJCQkJcmVnICYgflBDSV9ST01fQUREUkVTU19FTkFCTEUpOwogCQkJfQogCQl9CiAJfQpAQCAtMTczLDkgKzE4OSwxMSBAQAogCXN0cnVjdCByZXNvdXJjZSAqciwgKnByOwogCiAJaWYgKCEocGNpX3Byb2JlICYgUENJX0FTU0lHTl9ST01TKSkgewotCQkvKiBUcnkgdG8gdXNlIEJJT1Mgc2V0dGluZ3MgZm9yIFJPTXMsIG90aGVyd2lzZSBsZXQKLQkJICAgcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpIGFsbG9jYXRlIHRoZSBuZXcKLQkJICAgYWRkcmVzc2VzLiAqLworCQkvKgorCQkgKiBUcnkgdG8gdXNlIEJJT1Mgc2V0dGluZ3MgZm9yIFJPTXMsIG90aGVyd2lzZSBsZXQKKwkJICogcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpIGFsbG9jYXRlIHRoZSBuZXcKKwkJICogYWRkcmVzc2VzLgorCQkgKi8KIAkJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJCXIgPSAmZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKIAkJCWlmICghci0+ZmxhZ3MgfHwgIXItPnN0YXJ0KQpAQCAtMjE1LDkgKzIzMyw5IEBACiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKIAlvbGRfY21kID0gY21kOwotCWZvcihpZHggPSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgewogCQkvKiBPbmx5IHNldCB1cCB0aGUgcmVxdWVzdGVkIHN0dWZmICovCi0JCWlmICghKG1hc2sgJiAoMTw8aWR4KSkpCisJCWlmICghKG1hc2sgJiAoMSA8PCBpZHgpKSkKIAkJCWNvbnRpbnVlOwogCiAJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwpAQCAtMjI3LDcgKzI0NSw5IEBACiAJCQkJKCEoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXItPnN0YXJ0ICYmIHItPmVuZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIGJlY2F1c2Ugb2YgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwgcGNpX25hbWUoZGV2KSk7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgIgorCQkJCSJiZWNhdXNlIG9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsCisJCQkJcGNpX25hbWUoZGV2KSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQpAQCAtMjM2LDcgKzI1Niw4IEBACiAJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwogCX0KIAlpZiAoY21kICE9IG9sZF9jbWQpIHsKLQkJcHJpbnRrKCJQQ0k6IEVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwgcGNpX25hbWUoZGV2KSwgb2xkX2NtZCwgY21kKTsKKwkJcHJpbnRrKCJQQ0k6IEVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwKKwkJCXBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI1OCw3ICsyNzksOCBAQAogCQlsYXQgPSBwY2liaW9zX21heF9sYXRlbmN5OwogCWVsc2UKIAkJcmV0dXJuOwotCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFNldHRpbmcgbGF0ZW5jeSB0aW1lciBvZiBkZXZpY2UgJXMgdG8gJWRcbiIsIHBjaV9uYW1lKGRldiksIGxhdCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogU2V0dGluZyBsYXRlbmN5IHRpbWVyIG9mIGRldmljZSAlcyB0byAlZFxuIiwKKwkJcGNpX25hbWUoZGV2KSwgbGF0KTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pcnEuYyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKaW5kZXggNjkxNjM5OS4uZTY1NTUxYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9pcnEuYworKysgYi9hcmNoL2kzODYvcGNpL2lycS5jCkBAIC01NDMsNiArNTQzLDEyIEBACiAJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzI6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzM6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQ6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzM6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzQ6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzU6CiAJCQlyLT5uYW1lID0gIlBJSVgvSUNIIjsKIAkJCXItPmdldCA9IHBpcnFfcGlpeF9nZXQ7CiAJCQlyLT5zZXQgPSBwaXJxX3BpaXhfc2V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKaW5kZXggZGI4ZTFmYy4uMTQ2OTFjZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYworKysgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCkBAIC03NSw3ICs3NSw3IEBACiAqKiBJZiBhIGRldmljZSBwcmVmZXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIGEgdmFsaWQgcGRpciBlbnRyeSwgaXQgd2lsbCBjYXVzZQogKiogYSBoYXJkIGZhaWx1cmUsIGllLiBNQ0EuICBWZXJzaW9uIDMuMCBhbmQgbGF0ZXIgb2YgdGhlIHp4MSBMQkEgc2hvdWxkCiAqKiBkaXNjb25uZWN0IG9uIDRrIGJvdW5kYXJpZXMgYW5kIHByZXZlbnQgc3VjaCBpc3N1ZXMuICBJZiB0aGUgZGV2aWNlIGlzCi0qKiBwYXJ0aWN1bGFybHkgYWdyZXNzaXZlLCB0aGlzIG9wdGlvbiB3aWxsIGtlZXAgdGhlIGVudGlyZSBwZGlyIHZhbGlkIHN1Y2gKKyoqIHBhcnRpY3VsYXJseSBhZ2dyZXNzaXZlLCB0aGlzIG9wdGlvbiB3aWxsIGtlZXAgdGhlIGVudGlyZSBwZGlyIHZhbGlkIHN1Y2gKICoqIHRoYXQgcHJlZmV0Y2hpbmcgd2lsbCBoaXQgYSB2YWxpZCBhZGRyZXNzLiAgVGhpcyBjb3VsZCBzZXZlcmVseSBpbXBhY3QKICoqIGVycm9yIGNvbnRhaW5tZW50LCBhbmQgaXMgdGhlcmVmb3JlIG9mZiBieSBkZWZhdWx0LiAgVGhlIHBhZ2UgdGhhdCBpcwogKiogdXNlZCBmb3Igc3BpbGwtb3ZlciBpcyBwb2lzb25lZCwgc28gdGhhdCBzaG91bGQgaGVscCBkZWJ1Z2dpbmcgc29tZXdoYXQuCkBAIC0yNTgsMTAgKzI1OCwxMCBAQAogCiAvKgogKiogRE1BX0NIVU5LX1NJWkUgaXMgdXNlZCBieSB0aGUgU0NTSSBtaWQtbGF5ZXIgdG8gYnJlYWsgdXAKLSoqIChvciByYXRoZXIgbm90IG1lcmdlKSBETUEncyBpbnRvIG1hbmFnYWJsZSBjaHVua3MuCisqKiAob3IgcmF0aGVyIG5vdCBtZXJnZSkgRE1BcyBpbnRvIG1hbmFnZWFibGUgY2h1bmtzLgogKiogT24gcGFyaXNjLCB0aGlzIGlzIG1vcmUgb2YgdGhlIHNvZnR3YXJlL3R1bmluZyBjb25zdHJhaW50Ci0qKiByYXRoZXIgdGhhbiB0aGUgSFcuIEkvTyBNTVUgYWxsb2NhdGlvbiBhbG9nb3JpdGhtcyBjYW4gYmUKLSoqIGZhc3RlciB3aXRoIHNtYWxsZXIgc2l6ZSBpcyAodG8gc29tZSBkZWdyZWUpLgorKiogcmF0aGVyIHRoYW4gdGhlIEhXLiBJL08gTU1VIGFsbG9jYXRpb24gYWxnb3JpdGhtcyBjYW4gYmUKKyoqIGZhc3RlciB3aXRoIHNtYWxsZXIgc2l6ZXMgKHRvIHNvbWUgZGVncmVlKS4KICovCiAjZGVmaW5lIERNQV9DSFVOS19TSVpFICAoQklUU19QRVJfTE9ORyppb3ZwX3NpemUpCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYwppbmRleCBiZWIxMTcyLi40NDExZDliIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCkBAIC0zMywzMiArMzMsMzIgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZC4KICAqLwotdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyAodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK19fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljIChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKLQlyZXR1cm4gfmZyb202NHRvMTYoc2FkZHIgKyBkYWRkciArIHN1bSArICgodW5zaWduZWQgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkJICAgKCh1bnNpZ25lZCBsb25nKSBwcm90byA8PCA4KSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmZyb202NHRvMTYoCisJCShfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCShfX2ZvcmNlIHU2NClzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbWFnaWMpOwogCi11bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCAodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZCAoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCi0JcmVzdWx0ID0gKHNhZGRyICsgZGFkZHIgKyBzdW0gKwotCQkgICgodW5zaWduZWQgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkgICgodW5zaWduZWQgbG9uZykgcHJvdG8gPDwgOCkpOworCXJlc3VsdCA9IChfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCSAoX19mb3JjZSB1NjQpc3VtICsgKChsZW4gKyBwcm90bykgPDwgOCk7CiAKIAkvKiBGb2xkIGRvd24gdG8gMzItYml0cyBzbyB3ZSBkb24ndCBsb3NlIGluIHRoZSB0eXBlZGVmLWxlc3MgbmV0d29yayBzdGFjay4gICovCiAJLyogNjQgdG8gMzMgKi8KIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZikgKyAocmVzdWx0ID4+IDMyKTsKIAkvKiAzMyB0byAzMiAqLwogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgbG9uZyk7CkBAIC03NSwxNiArNzUsMTUgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewotCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOworCXU2NCByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOworCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOwogCS8qIDMyK2MgYml0cyAtPiAzMiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpAQCAtOTMsMTAgKzkyLDkgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi11bnNpZ25lZCBzaG9ydAotaXBfY29tcHV0ZV9jc3VtICh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtIChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewotCXJldHVybiB+ZG9fY3N1bShidWZmLGxlbik7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oYnVmZixsZW4pOwogfQogCiBFWFBPUlRfU1lNQk9MKGlwX2NvbXB1dGVfY3N1bSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMgYi9hcmNoL2lhNjQvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKaW5kZXggMzY4NjZlOC4uNTAzZGZlNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCisrKyBiL2FyY2gvaWE2NC9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwpAQCAtMTA0LDkgKzEwNCw5IEBACiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqLCBsb25nKTsKIAotc3RhdGljIHVuc2lnbmVkIGludAotZG9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJaW50IGxlbiwgdW5zaWduZWQgaW50IHBzdW0sIGludCAqZXJycCkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQlpbnQgbGVuLCBfX3dzdW0gcHN1bSwgaW50ICplcnJwKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCkBAIC0xMjIsMzAgKzEyMiwxNyBAQAogCXJlc3VsdCA9IGRvX2NzdW0oZHN0LCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHBzdW07CisJcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilwc3VtOwogCS8qIDMyK2MgYml0cyAtPiAzMiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJwKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIGxlbikpIHsKLQkJKmVycnAgPSAtRUZBVUxUOwotCQltZW1zZXQoZHN0LCAwLCBsZW4pOwotCQlyZXR1cm4gc3VtOwotCX0KLQotCXJldHVybiBkb19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoc3JjLCBkc3QsIGxlbiwgc3VtLCBlcnJwKTsKLX0KLQotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKLXsKLQlyZXR1cm4gZG9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcigoX19mb3JjZSBjb25zdCB2b2lkIF9fdXNlciAqKXNyYywKKwkJCQkJICAgZHN0LCBsZW4sIHN1bSwgTlVMTCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL3BjaS5jIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwppbmRleCBiMzBiZTdjLi5mNGVkZmJmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTQ2OSwxMCArNDY5LDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlwY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhkZXYsIDAsIFBDSV9CUklER0VfUkVTT1VSQ0VTKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyk7CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2JyaWRnZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTQ5Myw2ICs0OTQsNyBAQAogCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmItPmRldmljZXMsIGJ1c19saXN0KQogCQlwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoZGV2KTsKKwlwbGF0Zm9ybV9wY2lfZml4dXBfYnVzKGIpOwogCiAJcmV0dXJuOwogfQpAQCAtNzM4LDc1ICs3NDAsNDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBJdCdzIGRlZmluZWQgaW4gZHJpdmVycy9wY2kvcGNpLmMgKi8KK2V4dGVybiB1OCBwY2lfY2FjaGVfbGluZV9zaXplOworCiAvKioKLSAqIHBjaV9jYWNoZWxpbmVfc2l6ZSAtIGRldGVybWluZSBjYWNoZWxpbmUgc2l6ZSBmb3IgUENJIGRldmljZXMKLSAqIEBkZXY6IHZvaWQKKyAqIHNldF9wY2lfY2FjaGVsaW5lX3NpemUgLSBkZXRlcm1pbmUgY2FjaGVsaW5lIHNpemUgZm9yIFBDSSBkZXZpY2VzCiAgKgogICogV2Ugd2FudCB0byB1c2UgdGhlIGxpbmUtc2l6ZSBvZiB0aGUgb3V0ZXItbW9zdCBjYWNoZS4gIFdlIGFzc3VtZQogICogdGhhdCB0aGlzIGxpbmUtc2l6ZSBpcyB0aGUgc2FtZSBmb3IgYWxsIENQVXMuCiAgKgogICogQ29kZSBtb3N0bHkgdGFrZW4gZnJvbSBhcmNoL2lhNjQva2VybmVsL3BhbGluZm8uYzpjYWNoZV9pbmZvKCkuCi0gKgotICogUkVUVVJOUzogQW4gYXBwcm9wcmlhdGUgLUVSUk5PIGVycm9yIHZhbHVlIG9uIGVyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1wY2lfY2FjaGVsaW5lX3NpemUgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3BjaV9jYWNoZWxpbmVfc2l6ZSh2b2lkKQogewogCXU2NCBsZXZlbHMsIHVuaXF1ZV9jYWNoZXM7CiAJczY0IHN0YXR1czsKIAlwYWxfY2FjaGVfY29uZmlnX2luZm9fdCBjY2k7Ci0Jc3RhdGljIHU4IGNhY2hlbGluZV9zaXplOwotCi0JaWYgKGNhY2hlbGluZV9zaXplKQotCQlyZXR1cm4gY2FjaGVsaW5lX3NpemU7CiAKIAlzdGF0dXMgPSBpYTY0X3BhbF9jYWNoZV9zdW1tYXJ5KCZsZXZlbHMsICZ1bmlxdWVfY2FjaGVzKTsKIAlpZiAoc3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaWE2NF9wYWxfY2FjaGVfc3VtbWFyeSgpIGZhaWxlZCAoc3RhdHVzPSVsZClcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JCXJldHVybiBTTVBfQ0FDSEVfQllURVM7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlhNjRfcGFsX2NhY2hlX3N1bW1hcnkoKSBmYWlsZWQgIgorCQkJIihzdGF0dXM9JWxkKVxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlyZXR1cm47CiAJfQogCi0Jc3RhdHVzID0gaWE2NF9wYWxfY2FjaGVfY29uZmlnX2luZm8obGV2ZWxzIC0gMSwgLyogY2FjaGVfdHlwZSAoZGF0YV9vcl91bmlmaWVkKT0gKi8gMiwKLQkJCQkJICAgICZjY2kpOworCXN0YXR1cyA9IGlhNjRfcGFsX2NhY2hlX2NvbmZpZ19pbmZvKGxldmVscyAtIDEsCisJCQkJLyogY2FjaGVfdHlwZSAoZGF0YV9vcl91bmlmaWVkKT0gKi8gMiwgJmNjaSk7CiAJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGlhNjRfcGFsX2NhY2hlX2NvbmZpZ19pbmZvKCkgZmFpbGVkIChzdGF0dXM9JWxkKVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLQkJcmV0dXJuIFNNUF9DQUNIRV9CWVRFUzsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaWE2NF9wYWxfY2FjaGVfY29uZmlnX2luZm8oKSBmYWlsZWQgIgorCQkJIihzdGF0dXM9JWxkKVxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlyZXR1cm47CiAJfQotCWNhY2hlbGluZV9zaXplID0gMSA8PCBjY2kucGNjaV9saW5lX3NpemU7Ci0JcmV0dXJuIGNhY2hlbGluZV9zaXplOworCXBjaV9jYWNoZV9saW5lX3NpemUgPSAoMSA8PCBjY2kucGNjaV9saW5lX3NpemUpIC8gNDsKIH0KIAotLyoqCi0gKiBwY2liaW9zX3ByZXBfbXdpIC0gaGVscGVyIGZ1bmN0aW9uIGZvciBkcml2ZXJzL3BjaS9wY2kuYzpwY2lfc2V0X213aSgpCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZSBmb3Igd2hpY2ggTVdJIGlzIGVuYWJsZWQKLSAqCi0gKiBGb3IgaWE2NCwgd2UgY2FuIGdldCB0aGUgY2FjaGVsaW5lIHNpemVzIGZyb20gUEFMLgotICoKLSAqIFJFVFVSTlM6IEFuIGFwcHJvcHJpYXRlIC1FUlJOTyBlcnJvciB2YWx1ZSBvbiBlcm9yLCBvciB6ZXJvIGZvciBzdWNjZXNzLgotICovCi1pbnQKLXBjaWJpb3NfcHJlcF9td2kgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGRlc2lyZWRfbGluZXNpemUsIGN1cnJlbnRfbGluZXNpemU7Ci0JaW50IHJjID0gMDsKLQl1OCBwY2lfbGluZXNpemU7Ci0KLQlkZXNpcmVkX2xpbmVzaXplID0gcGNpX2NhY2hlbGluZV9zaXplKCk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZwY2lfbGluZXNpemUpOwotCWN1cnJlbnRfbGluZXNpemUgPSA0ICogcGNpX2xpbmVzaXplOwotCWlmIChkZXNpcmVkX2xpbmVzaXplICE9IGN1cnJlbnRfbGluZXNpemUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBzbG90ICVzIGhhcyBpbmNvcnJlY3QgUENJIGNhY2hlIGxpbmUgc2l6ZSBvZiAlbHUgYnl0ZXMsIiwKLQkJICAgICAgIHBjaV9uYW1lKGRldiksIGN1cnJlbnRfbGluZXNpemUpOwotCQlpZiAoY3VycmVudF9saW5lc2l6ZSA+IGRlc2lyZWRfbGluZXNpemUpIHsKLQkJCXByaW50aygiIGV4cGVjdGVkICVsdSBieXRlcyBpbnN0ZWFkXG4iLCBkZXNpcmVkX2xpbmVzaXplKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCXByaW50aygiIGNvcnJlY3RpbmcgdG8gJWx1XG4iLCBkZXNpcmVkX2xpbmVzaXplKTsKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIGRlc2lyZWRfbGluZXNpemUgLyA0KTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7CisJc2V0X3BjaV9jYWNoZWxpbmVfc2l6ZSgpOworCXJldHVybiAwOwogfQorCitzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQvc24va2VybmVsL01ha2VmaWxlCmluZGV4IDJkNzhmMzQuLjBhNTkzNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCwxMyArNCwxNCBAQAogIyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAjIGZvciBtb3JlIGRldGFpbHMuCiAjCi0jIENvcHlyaWdodCAoQykgMTk5OSwyMDAxLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDEtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogCiBDUFBGTEFHUyArPSAtSSQoc3JjdHJlZSkvYXJjaC9pYTY0L3NuL2luY2x1ZGUKIAogb2JqLXkJCQkJKz0gc2V0dXAubyBidGUubyBidGVfZXJyb3IubyBpcnEubyBtY2EubyBpZGxlLm8gXAotCQkJCSAgIGh1YmVycm9yLm8gaW9faW5pdC5vIGlvbXYubyBrbGNvbmZsaWIubyBwaW9fcGh5cy5vIFwKKwkJCQkgICBodWJlcnJvci5vIGlvX2FjcGlfaW5pdC5vIGlvX2NvbW1vbi5vIFwKKwkJCQkgICBpb19pbml0Lm8gaW9tdi5vIGtsY29uZmxpYi5vIHBpb19waHlzLm8gXAogCQkJCSAgIHNuMi8KIG9iai0kKENPTkZJR19JQTY0X0dFTkVSSUMpICAgICAgKz0gbWFjaHZlYy5vCiBvYmotJChDT05GSUdfU0dJX1RJT0NYKQkJKz0gdGlvY3gubwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkN2YyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworCisvKgorICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIHdpbGwgb25seSBiZSBleGVjdXRlZCB3aGVuIHJ1bm5pbmcgd2l0aAorICogYSBQUk9NIHRoYXQgaGFzIEFDUEkgSU8gc3VwcG9ydC4gKGkuZS4sIFNOX0FDUElfQkFTRV9TVVBQT1JUKCkgPT0gMSkKKyAqLworCisKKy8qCisgKiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhlIFVVSUQgdGhlIFBST00gdXNlcworICogKGlvL2FjcGkvZGVmYmxrLmMpIHdoZW4gYnVpbGRpbmcgYSB2ZW5kb3IgZGVzY3JpcHRvci4KKyAqLworc3RydWN0IGFjcGlfdmVuZG9yX3V1aWQgc25fdXVpZCA9IHsKKwkuc3VidHlwZSA9IDAsCisJLmRhdGEJPSB7IDB4MmMsIDB4YzYsIDB4YTYsIDB4ZmUsIDB4OWMsIDB4NDQsIDB4ZGEsIDB4MTEsCisJCSAgICAweGEyLCAweDdjLCAweDA4LCAweDAwLCAweDY5LCAweDEzLCAweGVhLCAweDUxIH0sCit9OworCisvKgorICogUGVyZm9ybSB0aGUgZWFybHkgSU8gaW5pdCBpbiBQUk9NLgorICovCitzdGF0aWMgczY0CitzYWxfaW9pZl9pbml0KHU2NCAqcmVzdWx0KQoreworCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgaXNydiA9IHswLDAsMCwwfTsKKworCVNBTF9DQUxMX05PTE9DSyhpc3J2LAorCQkJU05fU0FMX0lPSUZfSU5JVCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisJKnJlc3VsdCA9IGlzcnYudjA7CisJcmV0dXJuIGlzcnYuc3RhdHVzOworfQorCisvKgorICogc25faHViZGV2X2FkZCAtIFRoZSAnYWRkJyBmdW5jdGlvbiBvZiB0aGUgYWNwaV9zbl9odWJkZXZfZHJpdmVyLgorICoJCSAgIENhbGxlZCBmb3IgZXZlcnkgIlNHSUhVQiIgb3IgIlNHSVRJTyIgZGV2aWNlIGRlZmluZWQKKyAqCQkgICBpbiB0aGUgQUNQSSBuYW1lc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0Citzbl9odWJkZXZfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdTY0IGFkZHI7CisJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXY7CisJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfcHRyOworCWludCBpOworCXU2NCBuYXNpZDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7CisJaW50IHJldCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcl90eXBlZCAqdmVuZG9yOworCWV4dGVybiB2b2lkIHNuX2NvbW1vbl9odWJkZXZfaW5pdChzdHJ1Y3QgaHViZGV2X2luZm8gKik7CisKKwlzdGF0dXMgPSBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkJCSAgJnNuX3V1aWQsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJzbl9odWJkZXZfYWRkOiBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoKSBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgIHN0YXR1cyk7CisJCXJldHVybiAxOworCX0KKworCXJlc291cmNlID0gYnVmZmVyLnBvaW50ZXI7CisJdmVuZG9yID0gJnJlc291cmNlLT5kYXRhLnZlbmRvcl90eXBlZDsKKwlpZiAoKHZlbmRvci0+Ynl0ZV9sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX3V1aWQpKSAhPQorCSAgICBzaXplb2Yoc3RydWN0IGh1YmRldl9pbmZvICopKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInNuX2h1YmRldl9hZGQ6IEludmFsaWQgdmVuZG9yIGRhdGEgbGVuZ3RoOiAlZFxuIiwKKwkJICAgICAgICB2ZW5kb3ItPmJ5dGVfbGVuZ3RoKTsKKwkJcmV0ID0gMTsKKwkJZ290byBleGl0OworCX0KKworCW1lbWNweSgmYWRkciwgdmVuZG9yLT5ieXRlX2RhdGEsIHNpemVvZihzdHJ1Y3QgaHViZGV2X2luZm8gKikpOworCWh1YmRldl9wdHIgPSBfX3ZhKChzdHJ1Y3QgaHViZGV2X2luZm8gKikgYWRkcik7CisKKwluYXNpZCA9IGh1YmRldl9wdHItPmhkaV9uYXNpZDsKKwlpID0gbmFzaWRfdG9fY25vZGVpZChuYXNpZCk7CisJaHViZGV2ID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGkpLT5wZGluZm8pOworCSpodWJkZXYgPSAqaHViZGV2X3B0cjsKKwlzbl9jb21tb25faHViZGV2X2luaXQoaHViZGV2KTsKKworZXhpdDoKKwlrZnJlZShidWZmZXIucG9pbnRlcik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNuX2dldF9idXNzb2Z0X3B0cigpIC0gVGhlIHBjaWJ1c19idXNzb2Z0IHBvaW50ZXIgaXMgZm91bmQgaW4KKyAqCQkJICB0aGUgQUNQSSBWZW5kb3IgcmVzb3VyY2UgZm9yIHRoaXMgYnVzLgorICovCitzdGF0aWMgc3RydWN0IHBjaWJ1c19idXNzb2Z0ICoKK3NuX2dldF9idXNzb2Z0X3B0cihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXU2NCBhZGRyOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0X3B0cjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcl90eXBlZCAqdmVuZG9yOworCisKKwloYW5kbGUgPSBQQ0lfQ09OVFJPTExFUihidXMpLT5hY3BpX2hhbmRsZTsKKwlzdGF0dXMgPSBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJCQkgICZzbl91dWlkLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJnZXRfYWNwaV9wY2lidXNfcHRyOiAiCisJCSAgICAgICAiZ2V0X2FjcGlfYnVzc29mdF9pbmZvKCkgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHN0YXR1cyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXNvdXJjZSA9IGJ1ZmZlci5wb2ludGVyOworCXZlbmRvciA9ICZyZXNvdXJjZS0+ZGF0YS52ZW5kb3JfdHlwZWQ7CisKKwlpZiAoKHZlbmRvci0+Ynl0ZV9sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX3V1aWQpKSAhPQorCSAgICAgc2l6ZW9mKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJnZXRfYWNwaV9idXNzb2Z0X3B0cjogSW52YWxpZCB2ZW5kb3IgZGF0YSAiCisJCSAgICAgICAibGVuZ3RoICVkXG4iLCB2ZW5kb3ItPmJ5dGVfbGVuZ3RoKTsKKwkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KCZhZGRyLCB2ZW5kb3ItPmJ5dGVfZGF0YSwgc2l6ZW9mKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKSk7CisJcHJvbV9idXNzb2Z0X3B0ciA9IF9fdmEoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKSBhZGRyKTsKKwlrZnJlZShidWZmZXIucG9pbnRlcik7CisKKwlyZXR1cm4gcHJvbV9idXNzb2Z0X3B0cjsKK30KKworLyoKKyAqIHNuX2FjcGlfYnVzX2ZpeHVwCisgKi8KK3ZvaWQKK3NuX2FjcGlfYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0X3B0cjsKKwlleHRlcm4gdm9pZCBzbl9jb21tb25fYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICosCisJCQkJCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqKTsKKworCWlmICghYnVzLT5wYXJlbnQpIHsJLyogSWYgcm9vdCBidXMgKi8KKwkJcHJvbV9idXNzb2Z0X3B0ciA9IHNuX2dldF9idXNzb2Z0X3B0cihidXMpOworCQlpZiAocHJvbV9idXNzb2Z0X3B0ciA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic25fcGNpX2ZpeHVwX2J1czogMHglMDR4OjB4JTAyeCBVbmFibGUgdG8gIgorCQkJICAgICAgICJvYnRhaW4gcHJvbV9idXNzb2Z0X3B0clxuIiwKKwkJCSAgICAgICBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyKTsKKwkJCXJldHVybjsKKwkJfQorCQlzbl9jb21tb25fYnVzX2ZpeHVwKGJ1cywgcHJvbV9idXNzb2Z0X3B0cik7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkocGNpX2RldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJc25fcGNpX2ZpeHVwX3Nsb3QocGNpX2Rldik7CisJfQorfQorCisvKgorICogc25fYWNwaV9zbG90X2ZpeHVwIC0gUGVyZm9ybSBhbnkgU04gc3BlY2lmaWMgc2xvdCBmaXh1cC4KKyAqCQkJQXQgcHJlc2VudCB0aGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKKyAqCQkJYW55IGdlbmVyaWMgd2F5IHRvIGhhbmRsZSBhIFJPTSBpbWFnZQorICoJCQl0aGF0IGhhcyBiZWVuIHNoYWRvd2VkIGJ5IHRoZSBQUk9NLCBzbworICoJCQl3ZSBwYXNzIGEgcG9pbnRlciB0byBpdAl3aXRoaW4gdGhlCisgKgkJCXBjaWRldl9pbmZvIHN0cnVjdHVyZS4KKyAqLworCit2b2lkCitzbl9hY3BpX3Nsb3RfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbykKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJc2l6ZV90IHNpemU7CisKKwlpZiAocGNpZGV2X2luZm8tPnBkaV9waW9fbWFwcGVkX2FkZHJbUENJX1JPTV9SRVNPVVJDRV0pIHsKKwkJLyoKKwkJICogQSB2YWxpZCBST00gaW1hZ2UgZXhpc3RzIGFuZCBoYXMgYmVlbiBzaGFkb3dlZCBieSB0aGUKKwkJICogUFJPTS4gU2V0dXAgdGhlIHBjaV9kZXYgUk9NIHJlc291cmNlIHRvIHBvaW50IHRvCisJCSAqIHRoZSBzaGFkb3dlZCBjb3B5LgorCQkgKi8KKwkJc2l6ZSA9IGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZW5kIC0KKwkJCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0OworCQlhZGRyID0KKwkJICAgICBpb3JlbWFwKHBjaWRldl9pbmZvLT5wZGlfcGlvX21hcHBlZF9hZGRyW1BDSV9ST01fUkVTT1VSQ0VdLAorCQkJICAgICBzaXplKTsKKwkJZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOworCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmVuZCA9CisJCQkJCQkodW5zaWduZWQgbG9uZykgYWRkciArIHNpemU7CisJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fQklPU19DT1BZOworCX0KK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3NuX2h1YmRldl9kcml2ZXIgPSB7CisJLm5hbWUgPSAiU0dJIEhVQkRFViBEcml2ZXIiLAorCS5pZHMgPSAiU0dJSFVCLFNHSVRJTyIsCisJLm9wcyA9IHsKKwkJLmFkZCA9IHNuX2h1YmRldl9hZGQsCisJCX0sCit9OworCisKKy8qCisgKiBzbl9pb19hY3BpX2luaXQgLSBQUk9NIGhhcyBBQ1BJIHN1cHBvcnQgZm9yIElPLCBkZWZpbmluZyBhdCBhIG1pbmltdW0gdGhlCisgKgkJICAgICBub2RlcyBhbmQgcm9vdCBidXNlcyBpbiB0aGUgRFNEVC4gQXMgYSByZXN1bHQsIGJ1cyBzY2FubmluZworICoJCSAgICAgd2lsbCBiZSBpbml0aWF0ZWQgYnkgdGhlIExpbnV4IEFDUEkgY29kZS4KKyAqLworCit2b2lkIF9faW5pdAorc25faW9fYWNwaV9pbml0KHZvaWQpCit7CisJdTY0IHJlc3VsdDsKKwlzNjQgc3RhdHVzOworCisJYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3NuX2h1YmRldl9kcml2ZXIpOworCXN0YXR1cyA9IHNhbF9pb2lmX2luaXQoJnJlc3VsdCk7CisJaWYgKHN0YXR1cyB8fCByZXN1bHQpCisJCXBhbmljKCJzYWxfaW9pZl9pbml0IGZhaWxlZDogWyVseF0gJXNcbiIsCisJCSAgICAgIHN0YXR1cywgaWE2NF9zYWxfc3RyZXJyb3Ioc3RhdHVzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGRkOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYwpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fZmVhdHVyZV9zZXRzLmg+CisjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgorI2luY2x1ZGUgPGFzbS9zbi9pby5oPgorI2luY2x1ZGUgPGFzbS9zbi9sMS5oPgorI2luY2x1ZGUgPGFzbS9zbi9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3NpbXVsYXRvci5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vdGlvY2FfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhc20vc24vdGlvY2VfcHJvdmlkZXIuaD4KKyNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKKyNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbjIvc25faHdwZXJmLmg+CisjaW5jbHVkZSA8YXNtL3NuL2FjcGkuaD4KKworZXh0ZXJuIHZvaWQgc25faW5pdF9jcGVpX3RpbWVyKHZvaWQpOworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfc25fcHJvY2ZzKHZvaWQpOworZXh0ZXJuIHZvaWQgc25fYWNwaV9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKik7CitleHRlcm4gdm9pZCBzbl9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKik7CitleHRlcm4gdm9pZCBzbl9hY3BpX3Nsb3RfZml4dXAoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHBjaWRldl9pbmZvICopOworZXh0ZXJuIHZvaWQgc25fbW9yZV9zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCBwY2lkZXZfaW5mbyAqKTsKK2V4dGVybiB2b2lkIHNuX2xlZ2FjeV9wY2lfd2luZG93X2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLCB1NjQsIHU2NCk7CitleHRlcm4gdm9pZCBzbl9pb19hY3BpX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzbl9pb19pbml0KHZvaWQpOworCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNuX3N5c2RhdGFfbGlzdDsKKworLyogc3lzZGF0YSBsaXN0IHN0cnVjdCAqLworc3RydWN0IHN5c2RhdGFfZWwgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdm9pZCAqc3lzZGF0YTsKK307CisKK2ludCBzbl9pb2lmX2luaXRlZDsJCS8qIFNOIEkvTyBpbmZyYXN0cnVjdHVyZSBpbml0aWFsaXplZD8gKi8KKworc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciAqc25fcGNpX3Byb3ZpZGVyW1BDSUlPX0FTSUNfTUFYX1RZUEVTXTsJLyogaW5kZXhlZCBieSBhc2ljIHR5cGUgKi8KKworLyoKKyAqIEhvb2tzIGFuZCBzdHJ1Y3QgZm9yIHVuc3VwcG9ydGVkIHBjaSBwcm92aWRlcnMKKyAqLworCitzdGF0aWMgZG1hX2FkZHJfdAorc25fZGVmYXVsdF9wY2lfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHR5cGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzbl9kZWZhdWx0X3BjaV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZG1hX2FkZHJfdCBhZGRyLCBpbnQgZGlyZWN0aW9uKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgKgorc25fZGVmYXVsdF9wY2lfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqc29mdCwgc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciBzbl9wY2lfZGVmYXVsdF9wcm92aWRlciA9IHsKKwkuZG1hX21hcCA9IHNuX2RlZmF1bHRfcGNpX21hcCwKKwkuZG1hX21hcF9jb25zaXN0ZW50ID0gc25fZGVmYXVsdF9wY2lfbWFwLAorCS5kbWFfdW5tYXAgPSBzbl9kZWZhdWx0X3BjaV91bm1hcCwKKwkuYnVzX2ZpeHVwID0gc25fZGVmYXVsdF9wY2lfYnVzX2ZpeHVwLAorfTsKKworLyoKKyAqIFJldHJpZXZlIHRoZSBETUEgRmx1c2ggTGlzdCBnaXZlbiBuYXNpZCwgd2lkZ2V0LCBhbmQgZGV2aWNlLgorICogVGhpcyBsaXN0IGlzIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIFdBUiAtIEZsdXNoIERNQSBkYXRhIG9uIFBJTyBSZWFkcy4KKyAqLworc3RhdGljIGlubGluZSB1NjQKK3NhbF9nZXRfZGV2aWNlX2RtYWZsdXNoX2xpc3QodTY0IG5hc2lkLCB1NjQgd2lkZ2V0X251bSwgdTY0IGRldmljZV9udW0sCisJCQkgICAgIHU2NCBhZGRyZXNzKQoreworCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOworCXJldF9zdHVmZi5zdGF0dXMgPSAwOworCXJldF9zdHVmZi52MCA9IDA7CisKKwlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAorCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNULAorCQkJKHU2NCkgbmFzaWQsICh1NjQpIHdpZGdldF9udW0sCisJCQkodTY0KSBkZXZpY2VfbnVtLCAodTY0KSBhZGRyZXNzLCAwLCAwLCAwKTsKKwlyZXR1cm4gcmV0X3N0dWZmLnN0YXR1czsKK30KKworLyoKKyAqIFJldHJpZXZlIHRoZSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIGdpdmVuIHRoZSBidXMgYW5kIGRldmljZXxmdW5jdGlvbiBudW1iZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0CitzYWxfZ2V0X3BjaWRldl9pbmZvKHU2NCBzZWdtZW50LCB1NjQgYnVzX251bWJlciwgdTY0IGRldmZuLCB1NjQgcGNpX2RldiwKKwkJICAgIHU2NCBzbl9pcnFfaW5mbykKK3sKKwlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKKwlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKKwlyZXRfc3R1ZmYudjAgPSAwOworCisJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwKKwkJCSh1NjQpIFNOX1NBTF9JT0lGX0dFVF9QQ0lERVZfSU5GTywKKwkJCSh1NjQpIHNlZ21lbnQsICh1NjQpIGJ1c19udW1iZXIsICh1NjQpIGRldmZuLAorCQkJKHU2NCkgcGNpX2RldiwKKwkJCXNuX2lycV9pbmZvLCAwLCAwKTsKKwlyZXR1cm4gcmV0X3N0dWZmLnYwOworfQorCisvKgorICogc25fcGNpZGV2X2luZm9fZ2V0KCkgLSBSZXRyaWV2ZSB0aGUgcGNpZGV2X2luZm8gc3RydWN0IGZvciB0aGUgc3BlY2lmaWVkCisgKgkJCSAgZGV2aWNlLgorICovCitpbmxpbmUgc3RydWN0IHBjaWRldl9pbmZvICoKK3NuX3BjaWRldl9pbmZvX2dldChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwY2lkZXYsCisJCQkgICAgJihTTl9QTEFURk9STV9EQVRBKGRldiktPnBjaWRldl9pbmZvKSwgcGRpX2xpc3QpIHsKKwkJaWYgKHBjaWRldi0+cGRpX2xpbnV4X3BjaWRldiA9PSBkZXYpCisJCQlyZXR1cm4gcGNpZGV2OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogT2xkZXIgUFJPTSBmbHVzaCBXQVIKKyAqCisgKiAwMS8xNi8wNiAtLSBUaGlzIHdhciB3aWxsIGJlIGluIHBsYWNlIHVudGlsIGEgbmV3IG9mZmljaWFsIFBST00gaXMgcmVsZWFzZWQuCisgKiBBZGRpdGlvbmFsbHkgbm90ZSB0aGF0IHRoZSBzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX3dhciBhbHNvIGhhcyB0byBiZQorICogcmVtb3ZlZCBmcm9tIGFyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCisgKi8KK3N0YXRpYyB1OCB3YXJfaW1wbGVtZW50ZWQgPSAwOworCitzdGF0aWMgczY0IHNuX2RldmljZV9maXh1cF93YXIodTY0IG5hc2lkLCB1NjQgd2lkZ2V0LCBpbnQgZGV2aWNlLAorCQkJICAgICAgIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgKndhcl9saXN0OworCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyICpkZXZfZW50cnk7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBpc3J2ID0gezAsMCwwLDB9OworCisJaWYgKCF3YXJfaW1wbGVtZW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUFJPTSB2ZXJzaW9uIDwgNC41MCAtLSBpbXBsZW1lbnRpbmcgb2xkICIKKwkJICAgICAgICJQUk9NIGZsdXNoIFdBUlxuIik7CisJCXdhcl9pbXBsZW1lbnRlZCA9IDE7CisJfQorCisJd2FyX2xpc3QgPSBremFsbG9jKERFVl9QRVJfV0lER0VUICogc2l6ZW9mKCp3YXJfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghd2FyX2xpc3QpCisJCUJVRygpOworCisJU0FMX0NBTExfTk9MT0NLKGlzcnYsIFNOX1NBTF9JT0lGX0dFVF9XSURHRVRfRE1BRkxVU0hfTElTVCwKKwkJCW5hc2lkLCB3aWRnZXQsIF9fcGEod2FyX2xpc3QpLCAwLCAwLCAwICwwKTsKKwlpZiAoaXNydi5zdGF0dXMpCisJCXBhbmljKCJzbl9kZXZpY2VfZml4dXBfd2FyIGZhaWxlZDogJXNcbiIsCisJCSAgICAgIGlhNjRfc2FsX3N0cmVycm9yKGlzcnYuc3RhdHVzKSk7CisKKwlkZXZfZW50cnkgPSB3YXJfbGlzdCArIGRldmljZTsKKwltZW1jcHkoY29tbW9uLGRldl9lbnRyeSwgc2l6ZW9mKCpjb21tb24pKTsKKwlrZnJlZSh3YXJfbGlzdCk7CisKKwlyZXR1cm4gaXNydi5zdGF0dXM7Cit9CisKKy8qCisgKiBzbl9jb21tb25faHViZGV2X2luaXQoKSAtIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgSFVCIGRhdGEKKyAqCQkJICAgICBzdHJ1Y3R1cmUgZm9yIGVhY2ggbm9kZSBpbiB0aGUgc3lzdGVtLgorICovCit2b2lkIF9faW5pdAorc25fY29tbW9uX2h1YmRldl9pbml0KHN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2KQoreworCisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKmRldl9lbnRyeTsKKwlzNjQgc3RhdHVzOworCWludCB3aWRnZXQsIGRldmljZSwgc2l6ZTsKKworCS8qIEF0dGFjaCB0aGUgZXJyb3IgaW50ZXJydXB0IGhhbmRsZXJzICovCisJaWYgKGh1YmRldi0+aGRpX25hc2lkICYgMSkJLyogSWYgVElPICovCisJCWljZV9lcnJvcl9pbml0KGh1YmRldik7CisJZWxzZQorCQlodWJfZXJyb3JfaW5pdChodWJkZXYpOworCisJZm9yICh3aWRnZXQgPSAwOyB3aWRnZXQgPD0gSFVCX1dJREdFVF9JRF9NQVg7IHdpZGdldCsrKQorCQlodWJkZXYtPmhkaV94d2lkZ2V0X2luZm9bd2lkZ2V0XS54d2lfaHViaW5mbyA9IGh1YmRldjsKKworCWlmICghaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCkKKwkJcmV0dXJuOworCisJc2l6ZSA9IChIVUJfV0lER0VUX0lEX01BWCArIDEpICoKKwkJc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICopOworCWh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3AgPQorCQlremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCkKKwkJQlVHKCk7CisKKwlmb3IgKHdpZGdldCA9IDA7IHdpZGdldCA8PSBIVUJfV0lER0VUX0lEX01BWDsgd2lkZ2V0KyspIHsKKwkJc2l6ZSA9IERFVl9QRVJfV0lER0VUICoKKwkJCXNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCk7CisJCXNuX2ZsdXNoX2RldmljZV9rZXJuZWwgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXNuX2ZsdXNoX2RldmljZV9rZXJuZWwpCisJCQlCVUcoKTsKKworCQlkZXZfZW50cnkgPSBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCQlmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IERFVl9QRVJfV0lER0VUOworCQkgICAgIGRldmljZSsrLCBkZXZfZW50cnkrKykgeworCQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbik7CisJCQlkZXZfZW50cnktPmNvbW1vbiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRldl9lbnRyeS0+Y29tbW9uKQorCQkJCUJVRygpOworCQkJaWYgKHNuX3Byb21fZmVhdHVyZV9hdmFpbGFibGUoUFJGX0RFVklDRV9GTFVTSF9MSVNUKSkKKwkJCQlzdGF0dXMgPSBzYWxfZ2V0X2RldmljZV9kbWFmbHVzaF9saXN0KAorCQkJCQkgICAgIGh1YmRldi0+aGRpX25hc2lkLCB3aWRnZXQsIGRldmljZSwKKwkJCQkJICAgICAodTY0KShkZXZfZW50cnktPmNvbW1vbikpOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IHNuX2RldmljZV9maXh1cF93YXIoaHViZGV2LT5oZGlfbmFzaWQsCisJCQkJCQkJICAgICB3aWRnZXQsIGRldmljZSwKKwkJCQkJCQkgICAgIGRldl9lbnRyeS0+Y29tbW9uKTsKKwkJCWlmIChzdGF0dXMgIT0gU0FMUkVUX09LKQorCQkJCXBhbmljKCJTQUwgY2FsbCBmYWlsZWQ6ICVzXG4iLAorCQkJCSAgICAgIGlhNjRfc2FsX3N0cmVycm9yKHN0YXR1cykpOworCisJCQlzcGluX2xvY2tfaW5pdCgmZGV2X2VudHJ5LT5zZmRsX2ZsdXNoX2xvY2spOworCQl9CisKKwkJaWYgKHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpCisJCQlodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wW3dpZGdldF0gPQorCQkJCQkJCSBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCX0KK30KKwordm9pZCBzbl9wY2lfdW5maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldiA9IFNOX1BDSURFVl9JTkZPKGRldiktPmhvc3RfcGNpX2RldjsKKworCXNuX2lycV91bmZpeHVwKGRldik7CisJcGNpX2Rldl9wdXQoaG9zdF9wY2lfZGV2KTsKKwlwY2lfZGV2X3B1dChkZXYpOworfQorCisvKgorICogc25fcGNpX2ZpeHVwX3Nsb3QoKSAtIFRoaXMgcm91dGluZSBzZXRzIHVwIGEgc2xvdCdzIHJlc291cmNlcyBjb25zaXN0ZW50CisgKgkJCSB3aXRoIHRoZSBMaW51eCBQQ0kgYWJzdHJhY3Rpb24gbGF5ZXIuIFJlc291cmNlcworICoJCQkgYWNxdWlyZWQgZnJvbSBvdXIgUENJIHByb3ZpZGVyIGluY2x1ZGUgUElPIG1hcHMKKyAqCQkJIHRvIEJBUiBzcGFjZSBhbmQgaW50ZXJydXB0IG9iamVjdHMuCisgKi8KK3ZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgc2VnbWVudCA9IHBjaV9kb21haW5fbnIoZGV2LT5idXMpOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqYnM7CisgCXN0cnVjdCBwY2lfYnVzICpob3N0X3BjaV9idXM7CisgCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXY7CisJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbzsKKyAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKyAJdW5zaWduZWQgaW50IGJ1c19ubywgZGV2Zm47CisKKwlwY2lfZGV2X2dldChkZXYpOyAvKiBmb3IgdGhlIHN5c2RhdGEgcG9pbnRlciAqLworCXBjaWRldl9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaWRldl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2lkZXZfaW5mbykKKwkJQlVHKCk7CQkvKiBDYW5ub3QgYWZmb3JkIHRvIHJ1biBvdXQgb2YgbWVtb3J5ICovCisKKwlzbl9pcnFfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc25faXJxX2luZm8pCisJCUJVRygpOwkJLyogQ2Fubm90IGFmZm9yZCB0byBydW4gb3V0IG9mIG1lbW9yeSAqLworCisJLyogQ2FsbCB0byByZXRyaWV2ZSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIG5lZWRlZCBieSBrZXJuZWwuICovCisJc3RhdHVzID0gc2FsX2dldF9wY2lkZXZfaW5mbygodTY0KSBzZWdtZW50LCAodTY0KSBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCSAgICAgZGV2LT5kZXZmbiwKKwkJCQkgICAgICh1NjQpIF9fcGEocGNpZGV2X2luZm8pLAorCQkJCSAgICAgKHU2NCkgX19wYShzbl9pcnFfaW5mbykpOworCWlmIChzdGF0dXMpCisJCUJVRygpOyAvKiBDYW5ub3QgZ2V0IHBsYXRmb3JtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKworCS8qIEFkZCBwY2lkZXZfaW5mbyB0byBsaXN0IGluIHBjaV9jb250cm9sbGVyLnBsYXRmb3JtX2RhdGEgKi8KKwlsaXN0X2FkZF90YWlsKCZwY2lkZXZfaW5mby0+cGRpX2xpc3QsCisJCSAgICAgICYoU05fUExBVEZPUk1fREFUQShkZXYtPmJ1cyktPnBjaWRldl9pbmZvKSk7CisKKwlpZiAoU05fQUNQSV9CQVNFX1NVUFBPUlQoKSkKKwkJc25fYWNwaV9zbG90X2ZpeHVwKGRldiwgcGNpZGV2X2luZm8pOworCWVsc2UKKwkJc25fbW9yZV9zbG90X2ZpeHVwKGRldiwgcGNpZGV2X2luZm8pOworCS8qCisJICogVXNpbmcgdGhlIFBST01zIHZhbHVlcyBmb3IgdGhlIFBDSSBob3N0IGJ1cywgZ2V0IHRoZSBMaW51eAorIAkgKiBQQ0kgaG9zdF9wY2lfZGV2IHN0cnVjdCBhbmQgc2V0IHVwIGhvc3QgYnVzIGxpbmthZ2VzCisgCSAqLworCisJYnVzX25vID0gKHBjaWRldl9pbmZvLT5wZGlfc2xvdF9ob3N0X2hhbmRsZSA+PiAzMikgJiAweGZmOworCWRldmZuID0gcGNpZGV2X2luZm8tPnBkaV9zbG90X2hvc3RfaGFuZGxlICYgMHhmZmZmZmZmZjsKKyAJaG9zdF9wY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHNlZ21lbnQsIGJ1c19ubyk7CisgCWhvc3RfcGNpX2RldiA9IHBjaV9nZXRfc2xvdChob3N0X3BjaV9idXMsIGRldmZuKTsKKworCXBjaWRldl9pbmZvLT5ob3N0X3BjaV9kZXYgPSBob3N0X3BjaV9kZXY7CisJcGNpZGV2X2luZm8tPnBkaV9saW51eF9wY2lkZXYgPSBkZXY7CisJcGNpZGV2X2luZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvID0gU05fUENJREVWX0lORk8oaG9zdF9wY2lfZGV2KTsKKwlicyA9IFNOX1BDSUJVU19CVVNTT0ZUKGRldi0+YnVzKTsKKwlwY2lkZXZfaW5mby0+cGRpX3BjaWJ1c19pbmZvID0gYnM7CisKKwlpZiAoYnMgJiYgYnMtPmJzX2FzaWNfdHlwZSA8IFBDSUlPX0FTSUNfTUFYX1RZUEVTKSB7CisJCVNOX1BDSURFVl9CVVNQUk9WSURFUihkZXYpID0gc25fcGNpX3Byb3ZpZGVyW2JzLT5ic19hc2ljX3R5cGVdOworCX0gZWxzZSB7CisJCVNOX1BDSURFVl9CVVNQUk9WSURFUihkZXYpID0gJnNuX3BjaV9kZWZhdWx0X3Byb3ZpZGVyOworCX0KKworCS8qIE9ubHkgc2V0IHVwIElSUSBzdHVmZiBpZiB0aGlzIGRldmljZSBoYXMgYSBob3N0IGJ1cyBjb250ZXh0ICovCisJaWYgKGJzICYmIHNuX2lycV9pbmZvLT5pcnFfaXJxKSB7CisJCXBjaWRldl9pbmZvLT5wZGlfc25faXJxX2luZm8gPSBzbl9pcnFfaW5mbzsKKwkJZGV2LT5pcnEgPSBwY2lkZXZfaW5mby0+cGRpX3NuX2lycV9pbmZvLT5pcnFfaXJxOworCQlzbl9pcnFfZml4dXAoZGV2LCBzbl9pcnFfaW5mbyk7CisJfSBlbHNlIHsKKwkJcGNpZGV2X2luZm8tPnBkaV9zbl9pcnFfaW5mbyA9IE5VTEw7CisJCWtmcmVlKHNuX2lycV9pbmZvKTsKKwl9Cit9CisKKy8qCisgKiBzbl9jb21tb25fYnVzX2ZpeHVwIC0gUGVyZm9ybSBwbGF0Zm9ybSBzcGVjaWZpYyBidXMgZml4dXAuCisgKgkJCSBFeGVjdXRlIHRoZSBBU0lDIHNwZWNpZmljIGZpeHVwIHJvdXRpbmUKKyAqCQkJIGZvciB0aGlzIGJ1cy4KKyAqLwordm9pZAorc25fY29tbW9uX2J1c19maXh1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkgICAgc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyKQoreworCWludCBjbm9kZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CisJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKKwlpbnQgbmFzaWQ7CisJdm9pZCAqcHJvdmlkZXJfc29mdDsKKwlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKKwlzdHJ1Y3Qgc25fcGxhdGZvcm1fZGF0YSAqc25fcGxhdGZvcm1fZGF0YTsKKworCWNvbnRyb2xsZXIgPSBQQ0lfQ09OVFJPTExFUihidXMpOworCS8qCisJICogUGVyLXByb3ZpZGVyIGZpeHVwLiAgQ29waWVzIHRoZSBidXMgc29mdCBzdHJ1Y3R1cmUgZnJvbSBwcm9tCisJICogdG8gbG9jYWwgYXJlYSBhbmQgbGlua3MgU05fUENJQlVTX0JVU1NPRlQoKS4KKwkgKi8KKworCWlmIChwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGUgPj0gUENJSU9fQVNJQ19NQVhfVFlQRVMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic25fY29tbW9uX2J1c19maXh1cDogVW5zdXBwb3J0ZWQgYXNpYyB0eXBlLCAlZCIsCisJCSAgICAgICBwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSA9PSBQQ0lJT19BU0lDX1RZUEVfUFBCKQorCQlyZXR1cm47CS8qIG5vIGZ1cnRoZXIgZml4dXAgbmVjZXNzYXJ5ICovCisKKwlwcm92aWRlciA9IHNuX3BjaV9wcm92aWRlcltwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGVdOworCWlmIChwcm92aWRlciA9PSBOVUxMKQorCQlwYW5pYygic25fY29tbW9uX2J1c19maXh1cDogTm8gcHJvdmlkZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBhc2ljIHR5cGUsICVkIiwKKwkJICAgICAgcHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlKTsKKworCWlmIChwcm92aWRlci0+YnVzX2ZpeHVwKQorCQlwcm92aWRlcl9zb2Z0ID0gKCpwcm92aWRlci0+YnVzX2ZpeHVwKSAocHJvbV9idXNzb2Z0X3B0ciwKKwkJCQkgY29udHJvbGxlcik7CisJZWxzZQorCQlwcm92aWRlcl9zb2Z0ID0gTlVMTDsKKworCS8qCisJICogR2VuZXJpYyBidXMgZml4dXAgZ29lcyBoZXJlLiAgRG9uJ3QgcmVmZXJlbmNlIHByb21fYnVzc29mdF9wdHIKKwkgKiBhZnRlciB0aGlzIHBvaW50LgorCSAqLworCWNvbnRyb2xsZXItPnBsYXRmb3JtX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25fcGxhdGZvcm1fZGF0YSksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YSA9PSBOVUxMKQorCQlCVUcoKTsKKwlzbl9wbGF0Zm9ybV9kYXRhID0KKwkJCShzdHJ1Y3Qgc25fcGxhdGZvcm1fZGF0YSAqKSBjb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOworCXNuX3BsYXRmb3JtX2RhdGEtPnByb3ZpZGVyX3NvZnQgPSBwcm92aWRlcl9zb2Z0OworCUlOSVRfTElTVF9IRUFEKCYoKHN0cnVjdCBzbl9wbGF0Zm9ybV9kYXRhICopCisJCQkgY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YSktPnBjaWRldl9pbmZvKTsKKwluYXNpZCA9IE5BU0lEX0dFVChTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic19iYXNlKTsKKwljbm9kZSA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOworCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKKwlTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic194d2lkZ2V0X2luZm8gPQorCSAgICAmKGh1YmRldl9pbmZvLT5oZGlfeHdpZGdldF9pbmZvW1NOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX3hpZF0pOworCisJLyoKKwkgKiBJZiB0aGUgbm9kZSBpbmZvcm1hdGlvbiB3ZSBvYnRhaW5lZCBkdXJpbmcgdGhlIGZpeHVwIHBoYXNlIGlzCisJICogaW52YWxpZCB0aGVuIHNldCBjb250cm9sbGVyLT5ub2RlIHRvIC0xICh1bmRldGVybWluZWQpCisJICovCisJaWYgKGNvbnRyb2xsZXItPm5vZGUgPj0gbnVtX29ubGluZV9ub2RlcygpKSB7CisJCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqYiA9IFNOX1BDSUJVU19CVVNTT0ZUKGJ1cyk7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2aWNlIEFTSUM9JXUgWElEPSV1IFBCVVNOVU09JXUiCisJCSAgICAgICAiTF9JTz0lbHggTF9NRU09JWx4IEJBU0U9JWx4XG4iLAorCQkgICAgICAgYi0+YnNfYXNpY190eXBlLCBiLT5ic194aWQsIGItPmJzX3BlcnNpc3RfYnVzbnVtLAorCQkgICAgICAgYi0+YnNfbGVnYWN5X2lvLCBiLT5ic19sZWdhY3lfbWVtLCBiLT5ic19iYXNlKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib24gbm9kZSAlZCBidXQgb25seSAlZCBub2RlcyBvbmxpbmUuIgorCQkgICAgICAgIkFzc29jaWF0aW9uIHNldCB0byB1bmRldGVybWluZWQuXG4iLAorCQkgICAgICAgY29udHJvbGxlci0+bm9kZSwgbnVtX29ubGluZV9ub2RlcygpKTsKKwkJY29udHJvbGxlci0+bm9kZSA9IC0xOworCX0KK30KKwordm9pZCBzbl9idXNfc3RvcmVfc3lzZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OworCisJZWxlbWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGVtZW50KSB7CisJCWRldl9kYmcoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnkhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWVsZW1lbnQtPnN5c2RhdGEgPSBTTl9QQ0lERVZfSU5GTyhkZXYpOworCWxpc3RfYWRkKCZlbGVtZW50LT5lbnRyeSwgJnNuX3N5c2RhdGFfbGlzdCk7Cit9CisKK3ZvaWQgc25fYnVzX2ZyZWVfc3lzZGF0YSh2b2lkKQoreworCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICpzYWZlOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHNhZmUsICZzbl9zeXNkYXRhX2xpc3QpIHsKKwkJZWxlbWVudCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHN5c2RhdGFfZWwsIGVudHJ5KTsKKwkJbGlzdF9kZWwoJmVsZW1lbnQtPmVudHJ5KTsKKwkJbGlzdF9kZWwoJigoKHN0cnVjdCBwY2lkZXZfaW5mbyAqKQorCQkJICAgICAoZWxlbWVudC0+c3lzZGF0YSkpLT5wZGlfbGlzdCkpOworCQlrZnJlZShlbGVtZW50LT5zeXNkYXRhKTsKKwkJa2ZyZWUoZWxlbWVudCk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIGh1YmRldl9pbml0X25vZGUoKSAtIENyZWF0ZXMgdGhlIEhVQiBkYXRhIHN0cnVjdHVyZSBhbmQgbGluayB0aGVtIHRvIGl0J3MKKyAqCQkJb3duIE5PREUgc3BlY2lmaWMgZGF0YSBhcmVhLgorICovCit2b2lkIGh1YmRldl9pbml0X25vZGUobm9kZXBkYV90ICogbnBkYSwgY25vZGVpZF90IG5vZGUpCit7CisJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKKwlpbnQgc2l6ZTsKKwlwZ19kYXRhX3QgKnBnOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHViZGV2X2luZm8pOworCisJaWYgKG5vZGUgPj0gbnVtX29ubGluZV9ub2RlcygpKQkvKiBIZWFkbGVzcy9tZW1sZXNzIElPIG5vZGVzICovCisJCXBnID0gTk9ERV9EQVRBKDApOworCWVsc2UKKwkJcGcgPSBOT0RFX0RBVEEobm9kZSk7CisKKwlodWJkZXZfaW5mbyA9IChzdHJ1Y3QgaHViZGV2X2luZm8gKilhbGxvY19ib290bWVtX25vZGUocGcsIHNpemUpOworCisJbnBkYS0+cGRpbmZvID0gKHZvaWQgKilodWJkZXZfaW5mbzsKK30KKworZ2VvaWRfdAorY25vZGVpZF9nZXRfZ2VvaWQoY25vZGVpZF90IGNub2RlKQoreworCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2OworCisJaHViZGV2ID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKKwlyZXR1cm4gaHViZGV2LT5oZGlfZ2VvaWQ7Cit9CisKK3ZvaWQgc25fZ2VuZXJhdGVfcGF0aChzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgY2hhciAqYWRkcmVzcykKK3sKKwluYXNpZF90IG5hc2lkOworCWNub2RlaWRfdCBjbm9kZTsKKwlnZW9pZF90IGdlb2lkOworCW1vZHVsZWlkX3QgbW9kdWxlaWQ7CisJdTE2IGJyaWNrdHlwZTsKKworCW5hc2lkID0gTkFTSURfR0VUKFNOX1BDSUJVU19CVVNTT0ZUKHBjaV9idXMpLT5ic19iYXNlKTsKKwljbm9kZSA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOworCWdlb2lkID0gY25vZGVpZF9nZXRfZ2VvaWQoY25vZGUpOworCW1vZHVsZWlkID0gZ2VvX21vZHVsZShnZW9pZCk7CisKKwlzcHJpbnRmKGFkZHJlc3MsICJtb2R1bGVfJWMlYyVjJWMlLjJkIiwKKwkJJzAnK1JBQ0tfR0VUX0NMQVNTKE1PRFVMRV9HRVRfUkFDSyhtb2R1bGVpZCkpLAorCQknMCcrUkFDS19HRVRfR1JPVVAoTU9EVUxFX0dFVF9SQUNLKG1vZHVsZWlkKSksCisJCScwJytSQUNLX0dFVF9OVU0oTU9EVUxFX0dFVF9SQUNLKG1vZHVsZWlkKSksCisJCU1PRFVMRV9HRVRfQlRDSEFSKG1vZHVsZWlkKSwgTU9EVUxFX0dFVF9CUE9TKG1vZHVsZWlkKSk7CisKKwkvKiBUb2xsaG91c2UgcmVxdWlyZXMgc2xvdCBpZCB0byBiZSBkaXNwbGF5ZWQgKi8KKwlicmlja3R5cGUgPSBNT0RVTEVfR0VUX0JUWVBFKG1vZHVsZWlkKTsKKwlpZiAoKGJyaWNrdHlwZSA9PSBMMV9CUklDS1RZUEVfMTkxMDEwKSB8fAorCSAgICAoYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV8xOTMyKSkKKwkJCXNwcmludGYoYWRkcmVzcywgIiVzXiVkIiwgYWRkcmVzcywgZ2VvX3Nsb3QoZ2VvaWQpKTsKK30KKworLyoKKyAqIHNuX3BjaV9maXh1cF9idXMoKSAtIFBlcmZvcm0gU04gc3BlY2lmaWMgc2V0dXAgb2Ygc29mdHdhcmUgc3RydWN0cworICoJCQkocGNpYnVzX2J1c3NvZnQsIHBjaWRldl9pbmZvKSBhbmQgaGFyZHdhcmUKKyAqCQkJcmVnaXN0ZXJzLCBmb3IgdGhlIHNwZWNpZmllZCBidXMgYW5kIGRldmljZXMgdW5kZXIgaXQuCisgKi8KK3ZvaWQgX19kZXZpbml0Citzbl9wY2lfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisKKwlpZiAoU05fQUNQSV9CQVNFX1NVUFBPUlQoKSkKKwkJc25fYWNwaV9idXNfZml4dXAoYnVzKTsKKwllbHNlCisJCXNuX2J1c19maXh1cChidXMpOworfQorCisvKgorICogc25faW9fZWFybHlfaW5pdCAtIFBlcmZvcm0gZWFybHkgSU8gKGFuZCBzb21lIG5vbi1JTykgaW5pdGlhbGl6YXRpb24uCisgKgkJICAgICAgSW4gcGFydGljdWxhciwgc2V0dXAgdGhlIHNuX3BjaV9wcm92aWRlcltdIGFycmF5LgorICoJCSAgICAgIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byBhbnkgYnVzIHNjYW5uaW5nCisgKgkJICAgICAgKGFjcGlfc2Nhbl9pbml0KCkpIGluIHRoZSBBQ1BJIGNhc2UsIGFzIHRoZSBTTgorICoJCSAgICAgIGJ1cyBmaXh1cCBjb2RlIHdpbGwgcmVmZXJlbmNlIHRoZSBhcnJheS4KKyAqLworc3RhdGljIGludCBfX2luaXQKK3NuX2lvX2Vhcmx5X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikgfHwgSVNfUlVOTklOR19PTl9GQUtFX1BST00oKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIHByaW1lIHNuX3BjaV9wcm92aWRlcltdLiAgSW5kaXZpZGlhbCBwcm92aWRlciBpbml0IHJvdXRpbmVzIHdpbGwKKwkgKiBvdmVycmlkZSB0aGVpciByZXNwZWN0aXZlIGRlZmF1bHQgZW50cmllcy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBQQ0lJT19BU0lDX01BWF9UWVBFUzsgaSsrKQorCQlzbl9wY2lfcHJvdmlkZXJbaV0gPSAmc25fcGNpX2RlZmF1bHRfcHJvdmlkZXI7CisKKwlwY2licl9pbml0X3Byb3ZpZGVyKCk7CisJdGlvY2FfaW5pdF9wcm92aWRlcigpOworCXRpb2NlX2luaXRfcHJvdmlkZXIoKTsKKworCS8qCisJICogVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgYm91bmNlIGxpbWl0IGNoZWNrcyBpbiB0aGUgYmxrIGxheWVyCisJICovCisJaWE2NF9tYXhfaW9tbXVfbWVyZ2VfbWFzayA9IH5QQUdFX01BU0s7CisKKwlzbl9pcnFfbGhfaW5pdCgpOworCUlOSVRfTElTVF9IRUFEKCZzbl9zeXNkYXRhX2xpc3QpOworCXNuX2luaXRfY3BlaV90aW1lcigpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlyZWdpc3Rlcl9zbl9wcm9jZnMoKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSSAgRFNEVCBPRU0gUmV2IDB4JXhcbiIsCisJICAgICAgIGFjcGlfZ2JsX0RTRFQtPm9lbV9yZXZpc2lvbik7CisJaWYgKFNOX0FDUElfQkFTRV9TVVBQT1JUKCkpCisJCXNuX2lvX2FjcGlfaW5pdCgpOworCWVsc2UKKwkJc25faW9faW5pdCgpOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHNuX2lvX2Vhcmx5X2luaXQpOworCisvKgorICogc25faW9fbGF0ZV9pbml0KCkgLSBQZXJmb3JtIGFueSBmaW5hbCBwbGF0Zm9ybSBzcGVjaWZpYyBJTyBpbml0aWFsaXphdGlvbi4KKyAqLworCitpbnQgX19pbml0Citzbl9pb19sYXRlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqYnVzc29mdDsKKwljbm9kZWlkX3QgY25vZGU7CisJbmFzaWRfdCBuYXNpZDsKKwljbm9kZWlkX3QgbmVhcl9jbm9kZTsKKworCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikgfHwgSVNfUlVOTklOR19PTl9GQUtFX1BST00oKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNldHVwIGNsb3Nlc3Qgbm9kZSBpbiBwY2lfY29udHJvbGxlci0+bm9kZSBmb3IKKwkgKiBQSUMsIFRJT0NQLCBUSU9DRSAoVElPQ0EgZG9lcyBpdCBkdXJpbmcgYnVzIGZpeHVwIHVzaW5nCisJICogaW5mbyBmcm9tIHRoZSBQUk9NKS4KKwkgKi8KKwlidXMgPSBOVUxMOworCXdoaWxlICgoYnVzID0gcGNpX2ZpbmRfbmV4dF9idXMoYnVzKSkgIT0gTlVMTCkgeworCQlidXNzb2Z0ID0gU05fUENJQlVTX0JVU1NPRlQoYnVzKTsKKwkJbmFzaWQgPSBOQVNJRF9HRVQoYnVzc29mdC0+YnNfYmFzZSk7CisJCWNub2RlID0gbmFzaWRfdG9fY25vZGVpZChuYXNpZCk7CisJCWlmICgoYnVzc29mdC0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DUCkgfHwKKwkJICAgIChidXNzb2Z0LT5ic19hc2ljX3R5cGUgPT0gUENJSU9fQVNJQ19UWVBFX1RJT0NFKSkgeworCQkJLyogVElPIFBDSSBCcmlkZ2U6IGZpbmQgbmVhcmVzdCBub2RlIHdpdGggQ1BVcyAqLworCQkJaW50IGUgPSBzbl9od3BlcmZfZ2V0X25lYXJlc3Rfbm9kZShjbm9kZSwgTlVMTCwKKwkJCQkJCQkgICAmbmVhcl9jbm9kZSk7CisJCQlpZiAoZSA8IDApIHsKKwkJCQluZWFyX2Nub2RlID0gKGNub2RlaWRfdCktMTsgLyogdXNlIGFueSBub2RlICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNpYnJfYnVzX2ZpeHVwOiBmYWlsZWQgIgorCQkJCSAgICAgICAidG8gZmluZCBuZWFyIG5vZGUgd2l0aCBDUFVzIHRvIFRJTyAiCisJCQkJICAgICAgICJub2RlICVkLCBlcnI9JWRcbiIsIGNub2RlLCBlKTsKKwkJCX0KKwkJCVBDSV9DT05UUk9MTEVSKGJ1cyktPm5vZGUgPSBuZWFyX2Nub2RlOworCQl9IGVsc2UgaWYgKGJ1c3NvZnQtPmJzX2FzaWNfdHlwZSA9PSBQQ0lJT19BU0lDX1RZUEVfUElDKSB7CisJCQlQQ0lfQ09OVFJPTExFUihidXMpLT5ub2RlID0gY25vZGU7CisJCX0KKwl9CisKKwlzbl9pb2lmX2luaXRlZCA9IDE7CS8qIFNOIEkvTyBpbmZyYXN0cnVjdHVyZSBub3cgaW5pdGlhbGl6ZWQgKi8KKworCXJldHVybiAwOworfQorCitmc19pbml0Y2FsbChzbl9pb19sYXRlX2luaXQpOworCitFWFBPUlRfU1lNQk9MKHNuX3BjaV9maXh1cF9zbG90KTsKK0VYUE9SVF9TWU1CT0woc25fcGNpX3VuZml4dXBfc2xvdCk7CitFWFBPUlRfU1lNQk9MKHNuX2J1c19zdG9yZV9zeXNkYXRhKTsKK0VYUE9SVF9TWU1CT0woc25fYnVzX2ZyZWVfc3lzZGF0YSk7CitFWFBPUlRfU1lNQk9MKHNuX2dlbmVyYXRlX3BhdGgpOworCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCmluZGV4IGRjMDlhNmEuLjlhZDg0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCkBAIC0zLDEwMyArMywyOCBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMjAwMC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NuX2ZlYXR1cmVfc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9zbi9nZW8uaD4KICNpbmNsdWRlIDxhc20vc24vaW8uaD4KLSNpbmNsdWRlIDxhc20vc24vbDEuaD4KICNpbmNsdWRlIDxhc20vc24vbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NuL2ludHIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NpbXVsYXRvci5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KLSNpbmNsdWRlIDxhc20vc24vdGlvY2FfcHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxhc20vc24vdGlvY2VfcHJvdmlkZXIuaD4KICNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCiAKLQotZXh0ZXJuIHZvaWQgc25faW5pdF9jcGVpX3RpbWVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfc25fcHJvY2ZzKHZvaWQpOwotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzbl9zeXNkYXRhX2xpc3Q7Ci0KLS8qIHN5c2RhdGEgbGlzdCBzdHJ1Y3QgKi8KLXN0cnVjdCBzeXNkYXRhX2VsIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OwotCXZvaWQgKnN5c2RhdGE7Ci19OwotCi1zdHJ1Y3Qgc2xhYl9pbmZvIHsKLQlzdHJ1Y3QgaHViZGV2X2luZm8gaHViZGV2OwotfTsKLQotc3RydWN0IGJyaWNrIHsKLQltb2R1bGVpZF90IGlkOwkJLyogTW9kdWxlIElEIG9mIHRoaXMgbW9kdWxlICAgICAgICAqLwotCXN0cnVjdCBzbGFiX2luZm8gc2xhYl9pbmZvW01BWF9TTEFCUyArIDFdOwotfTsKLQotaW50IHNuX2lvaWZfaW5pdGVkOwkJLyogU04gSS9PIGluZnJhc3RydWN0dXJlIGluaXRpYWxpemVkPyAqLwotCi1zdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpzbl9wY2lfcHJvdmlkZXJbUENJSU9fQVNJQ19NQVhfVFlQRVNdOwkvKiBpbmRleGVkIGJ5IGFzaWMgdHlwZSAqLworLyoKKyAqIFRoZSBjb2RlIGluIHRoaXMgZmlsZSB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgd2hlbiBydW5uaW5nIHdpdGgKKyAqIGEgUFJPTSB0aGF0IGRvZXMgX25vdF8gaGF2ZSBiYXNlIEFDUEkgSU8gc3VwcG9ydC4KKyAqIChpLmUuLCBTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpID09IDApCisgKi8KIAogc3RhdGljIGludCBtYXhfc2VnbWVudF9udW1iZXI7CQkgLyogRGVmYXVsdCBoaWdoZXN0IHNlZ21lbnQgbnVtYmVyICovCiBzdGF0aWMgaW50IG1heF9wY2lidXNfbnVtYmVyID0gMjU1OwkvKiBEZWZhdWx0IGhpZ2hlc3QgcGNpIGJ1cyBudW1iZXIgKi8KIAotLyoKLSAqIEhvb2tzIGFuZCBzdHJ1Y3QgZm9yIHVuc3VwcG9ydGVkIHBjaSBwcm92aWRlcnMKLSAqLwotCi1zdGF0aWMgZG1hX2FkZHJfdAotc25fZGVmYXVsdF9wY2lfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHR5cGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zbl9kZWZhdWx0X3BjaV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZG1hX2FkZHJfdCBhZGRyLCBpbnQgZGlyZWN0aW9uKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgKgotc25fZGVmYXVsdF9wY2lfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqc29mdCwgc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyKQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciBzbl9wY2lfZGVmYXVsdF9wcm92aWRlciA9IHsKLQkuZG1hX21hcCA9IHNuX2RlZmF1bHRfcGNpX21hcCwKLQkuZG1hX21hcF9jb25zaXN0ZW50ID0gc25fZGVmYXVsdF9wY2lfbWFwLAotCS5kbWFfdW5tYXAgPSBzbl9kZWZhdWx0X3BjaV91bm1hcCwKLQkuYnVzX2ZpeHVwID0gc25fZGVmYXVsdF9wY2lfYnVzX2ZpeHVwLAotfTsKLQotLyoKLSAqIFJldHJpZXZlIHRoZSBETUEgRmx1c2ggTGlzdCBnaXZlbiBuYXNpZCwgd2lkZ2V0LCBhbmQgZGV2aWNlLgotICogVGhpcyBsaXN0IGlzIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIFdBUiAtIEZsdXNoIERNQSBkYXRhIG9uIFBJTyBSZWFkcy4KLSAqLwotc3RhdGljIGlubGluZSB1NjQKLXNhbF9nZXRfZGV2aWNlX2RtYWZsdXNoX2xpc3QodTY0IG5hc2lkLCB1NjQgd2lkZ2V0X251bSwgdTY0IGRldmljZV9udW0sCi0JCQkgICAgIHU2NCBhZGRyZXNzKQotewotCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwotCXJldF9zdHVmZi5zdGF0dXMgPSAwOwotCXJldF9zdHVmZi52MCA9IDA7Ci0KLQlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAotCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNULAotCQkJKHU2NCkgbmFzaWQsICh1NjQpIHdpZGdldF9udW0sCi0JCQkodTY0KSBkZXZpY2VfbnVtLCAodTY0KSBhZGRyZXNzLCAwLCAwLCAwKTsKLQlyZXR1cm4gcmV0X3N0dWZmLnN0YXR1czsKLX0KIAogLyoKICAqIFJldHJpZXZlIHRoZSBodWIgZGV2aWNlIGluZm8gc3RydWN0dXJlIGZvciB0aGUgZ2l2ZW4gbmFzaWQuCkBAIC0xMzEsOTMgKzU2LDIwIEBACiAJcmV0dXJuIHJldF9zdHVmZi52MDsKIH0KIAotLyoKLSAqIFJldHJpZXZlIHRoZSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIGdpdmVuIHRoZSBidXMgYW5kIGRldmljZXxmdW5jdGlvbiBudW1iZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTY0Ci1zYWxfZ2V0X3BjaWRldl9pbmZvKHU2NCBzZWdtZW50LCB1NjQgYnVzX251bWJlciwgdTY0IGRldmZuLCB1NjQgcGNpX2RldiwKLQkJICAgIHU2NCBzbl9pcnFfaW5mbykKLXsKLQlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKLQlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKLQlyZXRfc3R1ZmYudjAgPSAwOwotCi0JU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwKLQkJCSh1NjQpIFNOX1NBTF9JT0lGX0dFVF9QQ0lERVZfSU5GTywKLQkJCSh1NjQpIHNlZ21lbnQsICh1NjQpIGJ1c19udW1iZXIsICh1NjQpIGRldmZuLAotCQkJKHU2NCkgcGNpX2RldiwKLQkJCXNuX2lycV9pbmZvLCAwLCAwKTsKLQlyZXR1cm4gcmV0X3N0dWZmLnYwOwotfQogCiAvKgotICogc25fcGNpZGV2X2luZm9fZ2V0KCkgLSBSZXRyaWV2ZSB0aGUgcGNpZGV2X2luZm8gc3RydWN0IGZvciB0aGUgc3BlY2lmaWVkCi0gKgkJCSAgZGV2aWNlLgotICovCi1pbmxpbmUgc3RydWN0IHBjaWRldl9pbmZvICoKLXNuX3BjaWRldl9pbmZvX2dldChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwY2lkZXYsCi0JCQkgICAgJihTTl9QQ0lfQ09OVFJPTExFUihkZXYpLT5wY2lkZXZfaW5mbyksIHBkaV9saXN0KSB7Ci0JCWlmIChwY2lkZXYtPnBkaV9saW51eF9wY2lkZXYgPT0gZGV2KSB7Ci0JCQlyZXR1cm4gcGNpZGV2OwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0vKiBPbGRlciBQUk9NIGZsdXNoIFdBUgotICoKLSAqIDAxLzE2LzA2IC0tIFRoaXMgd2FyIHdpbGwgYmUgaW4gcGxhY2UgdW50aWwgYSBuZXcgb2ZmaWNpYWwgUFJPTSBpcyByZWxlYXNlZC4KLSAqIEFkZGl0aW9uYWxseSBub3RlIHRoYXQgdGhlIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyIGFsc28gaGFzIHRvIGJlCi0gKiByZW1vdmVkIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmgKLSAqLwotc3RhdGljIHU4IHdhcl9pbXBsZW1lbnRlZCA9IDA7Ci0KLXN0YXRpYyBzNjQgc25fZGV2aWNlX2ZpeHVwX3dhcih1NjQgbmFzaWQsIHU2NCB3aWRnZXQsIGludCBkZXZpY2UsCi0JCQkgICAgICAgc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbikKLXsKLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX3dhciAqd2FyX2xpc3Q7Ci0Jc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgKmRldl9lbnRyeTsKLQlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIGlzcnYgPSB7MCwwLDAsMH07Ci0KLQlpZiAoIXdhcl9pbXBsZW1lbnRlZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQUk9NIHZlcnNpb24gPCA0LjUwIC0tIGltcGxlbWVudGluZyBvbGQgIgotCQkgICAgICAgIlBST00gZmx1c2ggV0FSXG4iKTsKLQkJd2FyX2ltcGxlbWVudGVkID0gMTsKLQl9Ci0KLQl3YXJfbGlzdCA9IGt6YWxsb2MoREVWX1BFUl9XSURHRVQgKiBzaXplb2YoKndhcl9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3YXJfbGlzdCkKLQkJQlVHKCk7Ci0KLQlTQUxfQ0FMTF9OT0xPQ0soaXNydiwgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNULAotCQkJbmFzaWQsIHdpZGdldCwgX19wYSh3YXJfbGlzdCksIDAsIDAsIDAgLDApOwotCWlmIChpc3J2LnN0YXR1cykKLQkJcGFuaWMoInNuX2RldmljZV9maXh1cF93YXIgZmFpbGVkOiAlc1xuIiwKLQkJICAgICAgaWE2NF9zYWxfc3RyZXJyb3IoaXNydi5zdGF0dXMpKTsKLQotCWRldl9lbnRyeSA9IHdhcl9saXN0ICsgZGV2aWNlOwotCW1lbWNweShjb21tb24sZGV2X2VudHJ5LCBzaXplb2YoKmNvbW1vbikpOwotCWtmcmVlKHdhcl9saXN0KTsKLQotCXJldHVybiBpc3J2LnN0YXR1czsKLX0KLQotLyoKLSAqIHNuX2ZpeHVwX2lvbm9kZXMoKSAtIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgSFVCIGRhdGEgc3RyY3V0dXJlIGZvcgotICoJZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0uCisgKiBzbl9maXh1cF9pb25vZGVzKCkgLSBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEhVQiBkYXRhIHN0cnVjdHVyZSBmb3IKKyAqCQkJZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gaXMgb25seQorICoJCQlleGVjdXRlZCB3aGVuIHJ1bm5pbmcgd2l0aCBhIG5vbi1BQ1BJIGNhcGFibGUgUFJPTS4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IHNuX2ZpeHVwX2lvbm9kZXModm9pZCkKIHsKLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqc25fZmx1c2hfZGV2aWNlX2tlcm5lbDsKLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqZGV2X2VudHJ5OworCiAJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXY7CiAJdTY0IHN0YXR1czsKIAl1NjQgbmFzaWQ7Ci0JaW50IGksIHdpZGdldCwgZGV2aWNlLCBzaXplOworCWludCBpOworCWV4dGVybiB2b2lkIHNuX2NvbW1vbl9odWJkZXZfaW5pdChzdHJ1Y3QgaHViZGV2X2luZm8gKik7CiAKIAkvKgogCSAqIEdldCBTR0kgU3BlY2lmaWMgSFVCIGNoaXBzZXQgaW5mb3JtYXRpb24uCkBAIC0yNDAsNzAgKzkyLDQ3IEBACiAJCQltYXhfc2VnbWVudF9udW1iZXIgPSBodWJkZXYtPm1heF9zZWdtZW50X251bWJlcjsKIAkJCW1heF9wY2lidXNfbnVtYmVyID0gaHViZGV2LT5tYXhfcGNpYnVzX251bWJlcjsKIAkJfQotCi0JCS8qIEF0dGFjaCB0aGUgZXJyb3IgaW50ZXJydXB0IGhhbmRsZXJzICovCi0JCWlmIChuYXNpZCAmIDEpCi0JCQlpY2VfZXJyb3JfaW5pdChodWJkZXYpOwotCQllbHNlCi0JCQlodWJfZXJyb3JfaW5pdChodWJkZXYpOwotCi0JCWZvciAod2lkZ2V0ID0gMDsgd2lkZ2V0IDw9IEhVQl9XSURHRVRfSURfTUFYOyB3aWRnZXQrKykKLQkJCWh1YmRldi0+aGRpX3h3aWRnZXRfaW5mb1t3aWRnZXRdLnh3aV9odWJpbmZvID0gaHViZGV2OwotCi0JCWlmICghaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCkKLQkJCWNvbnRpbnVlOwotCi0JCXNpemUgPSAoSFVCX1dJREdFVF9JRF9NQVggKyAxKSAqCi0JCQlzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKik7Ci0JCWh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3AgPQotCQkJa3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wKQotCQkJQlVHKCk7Ci0KLQkJZm9yICh3aWRnZXQgPSAwOyB3aWRnZXQgPD0gSFVCX1dJREdFVF9JRF9NQVg7IHdpZGdldCsrKSB7Ci0JCQlzaXplID0gREVWX1BFUl9XSURHRVQgKgotCQkJCXNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCk7Ci0JCQlzbl9mbHVzaF9kZXZpY2Vfa2VybmVsID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKLQkJCQlCVUcoKTsKLQotCQkJZGV2X2VudHJ5ID0gc25fZmx1c2hfZGV2aWNlX2tlcm5lbDsKLQkJCWZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgREVWX1BFUl9XSURHRVQ7Ci0JCQkgICAgIGRldmljZSsrLGRldl9lbnRyeSsrKSB7Ci0JCQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbik7Ci0JCQkJZGV2X2VudHJ5LT5jb21tb24gPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCQkJCWlmICghZGV2X2VudHJ5LT5jb21tb24pCi0JCQkJCUJVRygpOwotCi0JCQkJaWYgKHNuX3Byb21fZmVhdHVyZV9hdmFpbGFibGUoCi0JCQkJCQkgICAgICAgUFJGX0RFVklDRV9GTFVTSF9MSVNUKSkKLQkJCQkJc3RhdHVzID0gc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdCgKLQkJCQkJCSAgICAgbmFzaWQsIHdpZGdldCwgZGV2aWNlLAotCQkJCQkJICAgICAodTY0KShkZXZfZW50cnktPmNvbW1vbikpOwotCQkJCWVsc2UKLQkJCQkJc3RhdHVzID0gc25fZGV2aWNlX2ZpeHVwX3dhcihuYXNpZCwKLQkJCQkJCSAgICAgd2lkZ2V0LCBkZXZpY2UsCi0JCQkJCQkgICAgIGRldl9lbnRyeS0+Y29tbW9uKTsKLQkJCQlpZiAoc3RhdHVzICE9IFNBTFJFVF9PSykKLQkJCQkJcGFuaWMoIlNBTCBjYWxsIGZhaWxlZDogJXNcbiIsCi0JCQkJCSAgICAgIGlhNjRfc2FsX3N0cmVycm9yKHN0YXR1cykpOwotCi0JCQkJc3Bpbl9sb2NrX2luaXQoJmRldl9lbnRyeS0+c2ZkbF9mbHVzaF9sb2NrKTsKLQkJCX0KLQotCQkJaWYgKHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpCi0JCQkJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcFt3aWRnZXRdID0KLQkJCQkJCSAgICAgICBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOwotCSAgICAgICAgfQorCQlzbl9jb21tb25faHViZGV2X2luaXQoaHViZGV2KTsKIAl9CiB9CiAKIC8qCisgKiBzbl9wY2lfbGVnYWN5X3dpbmRvd19maXh1cCAtIENyZWF0ZSBQQ0kgY29udHJvbGxlciB3aW5kb3dzIGZvcgorICoJCQkJbGVnYWN5IElPIGFuZCBNRU0gc3BhY2UuIFRoaXMgbmVlZHMgdG8KKyAqCQkJCWJlIGRvbmUgaGVyZSwgYXMgdGhlIFBST00gZG9lcyBub3QgaGF2ZQorICoJCQkJQUNQSSBzdXBwb3J0IGRlZmluaW5nIHRoZSByb290IGJ1c2VzCisgKgkJCQlhbmQgdGhlaXIgcmVzb3VyY2VzIChfQ1JTKSwKKyAqLworc3RhdGljIHZvaWQKK3NuX2xlZ2FjeV9wY2lfd2luZG93X2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlciwKKwkJCSAgIHU2NCBsZWdhY3lfaW8sIHU2NCBsZWdhY3lfbWVtKQoreworCQljb250cm9sbGVyLT53aW5kb3cgPSBrY2FsbG9jKDIsIHNpemVvZihzdHJ1Y3QgcGNpX3dpbmRvdyksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChjb250cm9sbGVyLT53aW5kb3cgPT0gTlVMTCkKKwkJCUJVRygpOworCQljb250cm9sbGVyLT53aW5kb3dbMF0ub2Zmc2V0ID0gbGVnYWN5X2lvOworCQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2UubmFtZSA9ICJsZWdhY3lfaW8iOworCQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2Uuc3RhcnQgPSBsZWdhY3lfaW87CisJCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5lbmQgPQorCSAgICAJCQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2Uuc3RhcnQgKyAweGZmZmY7CisJCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5wYXJlbnQgPSAmaW9wb3J0X3Jlc291cmNlOworCQljb250cm9sbGVyLT53aW5kb3dbMV0ub2Zmc2V0ID0gbGVnYWN5X21lbTsKKwkJY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLm5hbWUgPSAibGVnYWN5X21lbSI7CisJCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQljb250cm9sbGVyLT53aW5kb3dbMV0ucmVzb3VyY2Uuc3RhcnQgPSBsZWdhY3lfbWVtOworCQljb250cm9sbGVyLT53aW5kb3dbMV0ucmVzb3VyY2UuZW5kID0KKwkgICAgCSAgICAgICBjb250cm9sbGVyLT53aW5kb3dbMV0ucmVzb3VyY2Uuc3RhcnQgKyAoMTAyNCAqIDEwMjQpIC0gMTsKKwkJY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLnBhcmVudCA9ICZpb21lbV9yZXNvdXJjZTsKKwkJY29udHJvbGxlci0+d2luZG93cyA9IDI7Cit9CisKKy8qCiAgKiBzbl9wY2lfd2luZG93X2ZpeHVwKCkgLSBDcmVhdGUgYSBwY2lfd2luZG93IGZvciBlYWNoIGRldmljZSByZXNvdXJjZS4KLSAqCQkJICAgVW50aWwgQUNQSSBzdXBwb3J0IGlzIGFkZGVkLCB3ZSBuZWVkIHRoaXMgY29kZQotICoJCQkgICB0byBzZXR1cCBwY2lfd2luZG93cyBmb3IgdXNlIGJ5Ci0gKgkJCSAgIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKCksCi0gKgkJCSAgIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKCksIGV0Yy4KKyAqCQkJICAgSXQgd2lsbCBzZXR1cCBwY2lfd2luZG93cyBmb3IgdXNlIGJ5CisgKgkJCSAgIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKCksIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKCksCisgKgkJCSAgIGV0Yy4KICAqLwogc3RhdGljIHZvaWQKIHNuX3BjaV93aW5kb3dfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGNvdW50LApAQCAtMzQyLDYwICsxNzEsMjIgQEAKIAljb250cm9sbGVyLT53aW5kb3cgPSBuZXdfd2luZG93OwogfQogCi12b2lkIHNuX3BjaV91bmZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2lfZGV2ID0gU05fUENJREVWX0lORk8oZGV2KS0+aG9zdF9wY2lfZGV2OwotCi0Jc25faXJxX3VuZml4dXAoZGV2KTsKLQlwY2lfZGV2X3B1dChob3N0X3BjaV9kZXYpOwotCXBjaV9kZXZfcHV0KGRldik7Ci19Ci0KIC8qCi0gKiBzbl9wY2lfZml4dXBfc2xvdCgpIC0gVGhpcyByb3V0aW5lIHNldHMgdXAgYSBzbG90J3MgcmVzb3VyY2VzCi0gKiBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4gIFJlc291cmNlcyBhY3F1aXJlZAotICogZnJvbSBvdXIgUENJIHByb3ZpZGVyIGluY2x1ZGUgUElPIG1hcHMgdG8gQkFSIHNwYWNlIGFuZCBpbnRlcnJ1cHQKLSAqIG9iamVjdHMuCisgKiBzbl9tb3JlX3Nsb3RfZml4dXAoKSAtIFdlIGFyZSBub3QgcnVubmluZyB3aXRoIGFuIEFDUEkgY2FwYWJsZSBQUk9NLAorICoJCQkgIGFuZCBuZWVkIHRvIGNvbnZlcnQgdGhlIHBjaV9kZXYtPnJlc291cmNlCisgKgkJCSAgJ3N0YXJ0JyBhbmQgJ2VuZCcgYWRkcmVzc2VzIHRvIG1hcHBlZCBhZGRyZXNzZXMsCisgKgkJCSAgYW5kIHNldHVwIHRoZSBwY2lfY29udHJvbGxlci0+d2luZG93IGFycmF5IGVudHJpZXMuCiAgKi8KLXZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQKK3NuX21vcmVfc2xvdF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvKQogewogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJaW50IGlkeDsKLQlpbnQgc2VnbWVudCA9IHBjaV9kb21haW5fbnIoZGV2LT5idXMpOwotCWludCBzdGF0dXMgPSAwOwotCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqYnM7Ci0gCXN0cnVjdCBwY2lfYnVzICpob3N0X3BjaV9idXM7Ci0gCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXY7Ci0Jc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbzsKIAlzNjQgcGNpX2FkZHJzW1BDSV9ST01fUkVTT1VSQ0UgKyAxXTsKLSAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKLSAJdW5zaWduZWQgbG9uZyBzaXplOwotIAl1bnNpZ25lZCBpbnQgYnVzX25vLCBkZXZmbjsKLQotCXBjaV9kZXZfZ2V0KGRldik7IC8qIGZvciB0aGUgc3lzZGF0YSBwb2ludGVyICovCi0JcGNpZGV2X2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjaWRldl9pbmZvKQotCQlCVUcoKTsJCS8qIENhbm5vdCBhZmZvcmQgdG8gcnVuIG91dCBvZiBtZW1vcnkgKi8KLQotCXNuX2lycV9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzbl9pcnFfaW5mbykKLQkJQlVHKCk7CQkvKiBDYW5ub3QgYWZmb3JkIHRvIHJ1biBvdXQgb2YgbWVtb3J5ICovCi0KLQkvKiBDYWxsIHRvIHJldHJpZXZlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IGtlcm5lbC4gKi8KLQlzdGF0dXMgPSBzYWxfZ2V0X3BjaWRldl9pbmZvKCh1NjQpIHNlZ21lbnQsICh1NjQpIGRldi0+YnVzLT5udW1iZXIsIAotCQkJCSAgICAgZGV2LT5kZXZmbiwKLQkJCQkgICAgICh1NjQpIF9fcGEocGNpZGV2X2luZm8pLAotCQkJCSAgICAgKHU2NCkgX19wYShzbl9pcnFfaW5mbykpOwotCWlmIChzdGF0dXMpCi0JCUJVRygpOyAvKiBDYW5ub3QgZ2V0IHBsYXRmb3JtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gKi8KLQotCS8qIEFkZCBwY2lkZXZfaW5mbyB0byBsaXN0IGluIHNuX3BjaV9jb250cm9sbGVyIHN0cnVjdCAqLwotCWxpc3RfYWRkX3RhaWwoJnBjaWRldl9pbmZvLT5wZGlfbGlzdCwKLQkJICAgICAgJihTTl9QQ0lfQ09OVFJPTExFUihkZXYtPmJ1cyktPnBjaWRldl9pbmZvKSk7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBlbmQsIHNpemUsIHN0YXJ0OwogCiAJLyogQ29weSBvdmVyIFBJTyBNYXBwZWQgQWRkcmVzc2VzICovCiAJZm9yIChpZHggPSAwOyBpZHggPD0gUENJX1JPTV9SRVNPVVJDRTsgaWR4KyspIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBhZGRyOwogCiAJCWlmICghcGNpZGV2X2luZm8tPnBkaV9waW9fbWFwcGVkX2FkZHJbaWR4XSkgewogCQkJcGNpX2FkZHJzW2lkeF0gPSAtMTsKQEAgLTQxOSw2MCArMjEwLDI4IEBACiAJCQlkZXYtPnJlc291cmNlW2lkeF0ucGFyZW50ID0gJmlvcG9ydF9yZXNvdXJjZTsKIAkJZWxzZQogCQkJZGV2LT5yZXNvdXJjZVtpZHhdLnBhcmVudCA9ICZpb21lbV9yZXNvdXJjZTsKKwkJLyogSWYgUk9NLCBtYXJrIGFzIHNoYWRvd2VkIGluIFBST00gKi8KKwkJaWYgKGlkeCA9PSBQQ0lfUk9NX1JFU09VUkNFKQorCQkJZGV2LT5yZXNvdXJjZVtpZHhdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX0JJT1NfQ09QWTsKIAl9CiAJLyogQ3JlYXRlIGEgcGNpX3dpbmRvdyBpbiB0aGUgcGNpX2NvbnRyb2xsZXIgc3RydWN0IGZvcgogCSAqIGVhY2ggZGV2aWNlIHJlc291cmNlLgogCSAqLwogCWlmIChjb3VudCA+IDApCiAJCXNuX3BjaV93aW5kb3dfZml4dXAoZGV2LCBjb3VudCwgcGNpX2FkZHJzKTsKLQotCS8qCi0JICogVXNpbmcgdGhlIFBST01zIHZhbHVlcyBmb3IgdGhlIFBDSSBob3N0IGJ1cywgZ2V0IHRoZSBMaW51eAotIAkgKiBQQ0kgaG9zdF9wY2lfZGV2IHN0cnVjdCBhbmQgc2V0IHVwIGhvc3QgYnVzIGxpbmthZ2VzCi0gCSAqLwotCi0JYnVzX25vID0gKHBjaWRldl9pbmZvLT5wZGlfc2xvdF9ob3N0X2hhbmRsZSA+PiAzMikgJiAweGZmOwotCWRldmZuID0gcGNpZGV2X2luZm8tPnBkaV9zbG90X2hvc3RfaGFuZGxlICYgMHhmZmZmZmZmZjsKLSAJaG9zdF9wY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHNlZ21lbnQsIGJ1c19ubyk7Ci0gCWhvc3RfcGNpX2RldiA9IHBjaV9nZXRfc2xvdChob3N0X3BjaV9idXMsIGRldmZuKTsKLQotCXBjaWRldl9pbmZvLT5ob3N0X3BjaV9kZXYgPSBob3N0X3BjaV9kZXY7Ci0JcGNpZGV2X2luZm8tPnBkaV9saW51eF9wY2lkZXYgPSBkZXY7Ci0JcGNpZGV2X2luZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvID0gU05fUENJREVWX0lORk8oaG9zdF9wY2lfZGV2KTsKLQlicyA9IFNOX1BDSUJVU19CVVNTT0ZUKGRldi0+YnVzKTsKLQlwY2lkZXZfaW5mby0+cGRpX3BjaWJ1c19pbmZvID0gYnM7Ci0KLQlpZiAoYnMgJiYgYnMtPmJzX2FzaWNfdHlwZSA8IFBDSUlPX0FTSUNfTUFYX1RZUEVTKSB7Ci0JCVNOX1BDSURFVl9CVVNQUk9WSURFUihkZXYpID0gc25fcGNpX3Byb3ZpZGVyW2JzLT5ic19hc2ljX3R5cGVdOwotCX0gZWxzZSB7Ci0JCVNOX1BDSURFVl9CVVNQUk9WSURFUihkZXYpID0gJnNuX3BjaV9kZWZhdWx0X3Byb3ZpZGVyOwotCX0KLQotCS8qIE9ubHkgc2V0IHVwIElSUSBzdHVmZiBpZiB0aGlzIGRldmljZSBoYXMgYSBob3N0IGJ1cyBjb250ZXh0ICovCi0JaWYgKGJzICYmIHNuX2lycV9pbmZvLT5pcnFfaXJxKSB7Ci0JCXBjaWRldl9pbmZvLT5wZGlfc25faXJxX2luZm8gPSBzbl9pcnFfaW5mbzsKLQkJZGV2LT5pcnEgPSBwY2lkZXZfaW5mby0+cGRpX3NuX2lycV9pbmZvLT5pcnFfaXJxOwotCQlzbl9pcnFfZml4dXAoZGV2LCBzbl9pcnFfaW5mbyk7Ci0JfSBlbHNlIHsKLQkJcGNpZGV2X2luZm8tPnBkaV9zbl9pcnFfaW5mbyA9IE5VTEw7Ci0JCWtmcmVlKHNuX2lycV9pbmZvKTsKLQl9CiB9CiAKIC8qCiAgKiBzbl9wY2lfY29udHJvbGxlcl9maXh1cCgpIC0gVGhpcyByb3V0aW5lIHNldHMgdXAgYSBidXMncyByZXNvdXJjZXMKLSAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgTGludXggUENJIGFic3RyYWN0aW9uIGxheWVyLgorICoJCQkgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBMaW51eCBQQ0kgYWJzdHJhY3Rpb24gbGF5ZXIuCiAgKi8KLXZvaWQgc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoaW50IHNlZ21lbnQsIGludCBidXNudW0sIHN0cnVjdCBwY2lfYnVzICpidXMpCitzdGF0aWMgdm9pZAorc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoaW50IHNlZ21lbnQsIGludCBidXNudW0sIHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0JaW50IHN0YXR1czsKLQlpbnQgbmFzaWQsIGNub2RlOworCXM2NCBzdGF0dXMgPSAwOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlcjsKLQlzdHJ1Y3Qgc25fcGNpX2NvbnRyb2xsZXIgKnNuX2NvbnRyb2xsZXI7CiAJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyOwotCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87Ci0Jdm9pZCAqcHJvdmlkZXJfc29mdDsKLQlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKKwogCiAgCXN0YXR1cyA9IHNhbF9nZXRfcGNpYnVzX2luZm8oKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzbnVtLAogIAkJCQkgICAgICh1NjQpIGlhNjRfdHBhKCZwcm9tX2J1c3NvZnRfcHRyKSk7CkBAIC00ODAsMjYxICsyMzksNzcgQEAKIAkJcmV0dXJuOwkJLypidXMgIyBkb2VzIG5vdCBleGlzdCAqLwogCXByb21fYnVzc29mdF9wdHIgPSBfX3ZhKHByb21fYnVzc29mdF9wdHIpOwogCi0JLyogQWxsb2NhdGUgYSBzbl9wY2lfY29udHJvbGxlciwgd2hpY2ggaGFzIGEgcGNpX2NvbnRyb2xsZXIgc3RydWN0Ci0JICogYXMgdGhlIGZpcnN0IG1lbWJlci4KLQkgKi8KLQlzbl9jb250cm9sbGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuX3BjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzbl9jb250cm9sbGVyKQorCWNvbnRyb2xsZXIgPSBremFsbG9jKHNpemVvZigqY29udHJvbGxlciksIEdGUF9LRVJORUwpOworCWlmICghY29udHJvbGxlcikKIAkJQlVHKCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNuX2NvbnRyb2xsZXItPnBjaWRldl9pbmZvKTsKLQljb250cm9sbGVyID0gJnNuX2NvbnRyb2xsZXItPnBjaV9jb250cm9sbGVyOwogCWNvbnRyb2xsZXItPnNlZ21lbnQgPSBzZWdtZW50OwogCi0JaWYgKGJ1cyA9PSBOVUxMKSB7Ci0gCQlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKLSAJCWlmIChidXMgPT0gTlVMTCkKLSAJCQlnb3RvIGVycm9yX3JldHVybjsgLyogZXJyb3IsIG9yIGJ1cyBhbHJlYWR5IHNjYW5uZWQgKi8KLSAJCWJ1cy0+c3lzZGF0YSA9IE5VTEw7Ci0JfQotCi0JaWYgKGJ1cy0+c3lzZGF0YSkKLQkJZ290byBlcnJvcl9yZXR1cm47IC8qIHN5c2RhdGEgYWxyZWFkeSBhbGxvYydkICovCi0KIAkvKgotCSAqIFBlci1wcm92aWRlciBmaXh1cC4gIENvcGllcyB0aGUgY29udGVudHMgZnJvbSBwcm9tIHRvIGxvY2FsCi0JICogYXJlYSBhbmQgbGlua3MgU05fUENJQlVTX0JVU1NPRlQoKS4KKwkgKiBUZW1wb3JhcmlseSBzYXZlIHRoZSBwcm9tX2J1c3NvZnRfcHRyIGZvciB1c2UgYnkgc25fYnVzX2ZpeHVwKCkuCisJICogKHBsYXRmb3JtX2RhdGEgd2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlciBpbiBzbl9jb21tb25fYnVzX2ZpeHVwKCkpCiAJICovCisJY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YSA9IHByb21fYnVzc29mdF9wdHI7CiAKLQlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID49IFBDSUlPX0FTSUNfTUFYX1RZUEVTKQotCQlnb3RvIGVycm9yX3JldHVybjsgLyogdW5zdXBwb3J0ZWQgYXNpYyB0eXBlICovCi0KLQlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9QUEIpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiBubyBmdXJ0aGVyIGZpeHVwIG5lY2Vzc2FyeSAqLwotCi0JcHJvdmlkZXIgPSBzbl9wY2lfcHJvdmlkZXJbcHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlXTsKLQlpZiAocHJvdmlkZXIgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47IC8qIG5vIHByb3ZpZGVyIHJlZ2lzdGVyZCBmb3IgdGhpcyBhc2ljICovCisJYnVzID0gcGNpX3NjYW5fYnVzKGJ1c251bSwgJnBjaV9yb290X29wcywgY29udHJvbGxlcik7CisgCWlmIChidXMgPT0gTlVMTCkKKyAJCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiBlcnJvciwgb3IgYnVzIGFscmVhZHkgc2Nhbm5lZCAqLwogCiAJYnVzLT5zeXNkYXRhID0gY29udHJvbGxlcjsKLQlpZiAocHJvdmlkZXItPmJ1c19maXh1cCkKLQkJcHJvdmlkZXJfc29mdCA9ICgqcHJvdmlkZXItPmJ1c19maXh1cCkgKHByb21fYnVzc29mdF9wdHIsIGNvbnRyb2xsZXIpOwotCWVsc2UKLQkJcHJvdmlkZXJfc29mdCA9IE5VTEw7CiAKLQlpZiAocHJvdmlkZXJfc29mdCA9PSBOVUxMKSB7Ci0JCS8qIGZpeHVwIGZhaWxlZCBvciBub3QgYXBwbGljYWJsZSAqLwotCQlidXMtPnN5c2RhdGEgPSBOVUxMOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLQkvKgotCSAqIFNldHVwIHBjaV93aW5kb3dzIGZvciBsZWdhY3kgSU8gYW5kIE1FTSBzcGFjZS4KLQkgKiAoVGVtcG9yYXJ5IHVudGlsIEFDUEkgc3VwcG9ydCBpcyBpbiBwbGFjZS4pCi0JICovCi0JY29udHJvbGxlci0+d2luZG93ID0ga2NhbGxvYygyLCBzaXplb2Yoc3RydWN0IHBjaV93aW5kb3cpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY29udHJvbGxlci0+d2luZG93ID09IE5VTEwpCi0JCUJVRygpOwotCWNvbnRyb2xsZXItPndpbmRvd1swXS5vZmZzZXQgPSBwcm9tX2J1c3NvZnRfcHRyLT5ic19sZWdhY3lfaW87Ci0JY29udHJvbGxlci0+d2luZG93WzBdLnJlc291cmNlLm5hbWUgPSAibGVnYWN5X2lvIjsKLQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5zdGFydCA9IHByb21fYnVzc29mdF9wdHItPmJzX2xlZ2FjeV9pbzsKLQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2UuZW5kID0KLQkgICAgY29udHJvbGxlci0+d2luZG93WzBdLnJlc291cmNlLnN0YXJ0ICsgMHhmZmZmOwotCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5wYXJlbnQgPSAmaW9wb3J0X3Jlc291cmNlOwotCWNvbnRyb2xsZXItPndpbmRvd1sxXS5vZmZzZXQgPSBwcm9tX2J1c3NvZnRfcHRyLT5ic19sZWdhY3lfbWVtOwotCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5uYW1lID0gImxlZ2FjeV9tZW0iOwotCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwotCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5zdGFydCA9IHByb21fYnVzc29mdF9wdHItPmJzX2xlZ2FjeV9tZW07Ci0JY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLmVuZCA9Ci0JICAgIGNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5zdGFydCArICgxMDI0ICogMTAyNCkgLSAxOwotCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5wYXJlbnQgPSAmaW9tZW1fcmVzb3VyY2U7Ci0JY29udHJvbGxlci0+d2luZG93cyA9IDI7Ci0KLQkvKgotCSAqIEdlbmVyaWMgYnVzIGZpeHVwIGdvZXMgaGVyZS4gIERvbid0IHJlZmVyZW5jZSBwcm9tX2J1c3NvZnRfcHRyCi0JICogYWZ0ZXIgdGhpcyBwb2ludC4KLQkgKi8KLQotCVBDSV9DT05UUk9MTEVSKGJ1cyktPnBsYXRmb3JtX2RhdGEgPSBwcm92aWRlcl9zb2Z0OwotCW5hc2lkID0gTkFTSURfR0VUKFNOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX2Jhc2UpOwotCWNub2RlID0gbmFzaWRfdG9fY25vZGVpZChuYXNpZCk7Ci0JaHViZGV2X2luZm8gPSAoc3RydWN0IGh1YmRldl9pbmZvICopKE5PREVQREEoY25vZGUpLT5wZGluZm8pOwotCVNOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX3h3aWRnZXRfaW5mbyA9Ci0JICAgICYoaHViZGV2X2luZm8tPmhkaV94d2lkZ2V0X2luZm9bU05fUENJQlVTX0JVU1NPRlQoYnVzKS0+YnNfeGlkXSk7Ci0KLQkvKgotCSAqIElmIHRoZSBub2RlIGluZm9ybWF0aW9uIHdlIG9idGFpbmVkIGR1cmluZyB0aGUgZml4dXAgcGhhc2UgaXMgaW52YWxpZAotCSAqIHRoZW4gc2V0IGNvbnRyb2xsZXItPm5vZGUgdG8gLTEgKHVuZGV0ZXJtaW5lZCkKLQkgKi8KLQlpZiAoY29udHJvbGxlci0+bm9kZSA+PSBudW1fb25saW5lX25vZGVzKCkpIHsKLQkJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiID0gU05fUENJQlVTX0JVU1NPRlQoYnVzKTsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZXZpY2UgQVNJQz0ldSBYSUQ9JXUgUEJVU05VTT0ldSIKLQkJCQkgICAgIkxfSU89JWx4IExfTUVNPSVseCBCQVNFPSVseFxuIiwKLQkJCWItPmJzX2FzaWNfdHlwZSwgYi0+YnNfeGlkLCBiLT5ic19wZXJzaXN0X2J1c251bSwKLQkJCWItPmJzX2xlZ2FjeV9pbywgYi0+YnNfbGVnYWN5X21lbSwgYi0+YnNfYmFzZSk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm9uIG5vZGUgJWQgYnV0IG9ubHkgJWQgbm9kZXMgb25saW5lLiIKLQkJCSJBc3NvY2lhdGlvbiBzZXQgdG8gdW5kZXRlcm1pbmVkLlxuIiwKLQkJCWNvbnRyb2xsZXItPm5vZGUsIG51bV9vbmxpbmVfbm9kZXMoKSk7Ci0JCWNvbnRyb2xsZXItPm5vZGUgPSAtMTsKLQl9CiAJcmV0dXJuOwogCiBlcnJvcl9yZXR1cm46CiAKLQlrZnJlZShzbl9jb250cm9sbGVyKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgc25fYnVzX3N0b3JlX3N5c2RhdGEoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3Qgc3lzZGF0YV9lbCAqZWxlbWVudDsKLQotCWVsZW1lbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzZGF0YV9lbCksIEdGUF9LRVJORUwpOwotCWlmICghZWxlbWVudCkgewotCQlkZXZfZGJnKGRldiwgIiVzOiBvdXQgb2YgbWVtb3J5IVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KLQllbGVtZW50LT5zeXNkYXRhID0gU05fUENJREVWX0lORk8oZGV2KTsKLQlsaXN0X2FkZCgmZWxlbWVudC0+ZW50cnksICZzbl9zeXNkYXRhX2xpc3QpOwotfQotCi12b2lkIHNuX2J1c19mcmVlX3N5c2RhdGEodm9pZCkKLXsKLQlzdHJ1Y3Qgc3lzZGF0YV9lbCAqZWxlbWVudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqc2FmZTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCBzYWZlLCAmc25fc3lzZGF0YV9saXN0KSB7Ci0JCWVsZW1lbnQgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzeXNkYXRhX2VsLCBlbnRyeSk7Ci0JCWxpc3RfZGVsKCZlbGVtZW50LT5lbnRyeSk7Ci0JCWxpc3RfZGVsKCYoKChzdHJ1Y3QgcGNpZGV2X2luZm8gKikKLQkJCSAgICAgKGVsZW1lbnQtPnN5c2RhdGEpKS0+cGRpX2xpc3QpKTsKLQkJa2ZyZWUoZWxlbWVudC0+c3lzZGF0YSk7Ci0JCWtmcmVlKGVsZW1lbnQpOwotCX0KKwlrZnJlZShjb250cm9sbGVyKTsKIAlyZXR1cm47CiB9CiAKIC8qCi0gKiBVZ2x5IGhhY2sgdG8gZ2V0IFBDSSBzZXR1cCB1bnRpbCB3ZSBoYXZlIGEgcHJvcGVyIEFDUEkgbmFtZXNwYWNlLgorICogc25fYnVzX2ZpeHVwCisgKi8KK3ZvaWQKK3NuX2J1c19maXh1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdF9wdHI7CisJZXh0ZXJuIHZvaWQgc25fY29tbW9uX2J1c19maXh1cChzdHJ1Y3QgcGNpX2J1cyAqLAorCQkJCQlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKik7CisKKworCWlmICghYnVzLT5wYXJlbnQpIHsgIC8qIElmIHJvb3QgYnVzICovCisJCXByb21fYnVzc29mdF9wdHIgPSBQQ0lfQ09OVFJPTExFUihidXMpLT5wbGF0Zm9ybV9kYXRhOworCQlpZiAocHJvbV9idXNzb2Z0X3B0ciA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic25fYnVzX2ZpeHVwOiAweCUwNHg6MHglMDJ4IFVuYWJsZSB0byAiCisJCQkgICAgICAgIm9idGFpbiBwcm9tX2J1c3NvZnRfcHRyXG4iLAorCQkJICAgICAgIHBjaV9kb21haW5fbnIoYnVzKSwgYnVzLT5udW1iZXIpOworCQkJcmV0dXJuOworCQl9CisJCXNuX2NvbW1vbl9idXNfZml4dXAoYnVzLCBwcm9tX2J1c3NvZnRfcHRyKTsKKwkJc25fbGVnYWN5X3BjaV93aW5kb3dfZml4dXAoUENJX0NPTlRST0xMRVIoYnVzKSwKKwkJCQkJICAgcHJvbV9idXNzb2Z0X3B0ci0+YnNfbGVnYWN5X2lvLAorCQkJCQkgICBwcm9tX2J1c3NvZnRfcHRyLT5ic19sZWdhY3lfbWVtKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaV9kZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisgICAgICAgICAgICAgICAgc25fcGNpX2ZpeHVwX3Nsb3QocGNpX2Rldik7CisgICAgICAgIH0KKworfQorCisvKgorICogc25faW9faW5pdCAtIFBST00gZG9lcyBub3QgaGF2ZSBBQ1BJIHN1cHBvcnQgdG8gZGVmaW5lIG5vZGVzIG9yIHJvb3QgYnVzZXMsCisgKgkJc28gd2UgbmVlZCB0byBkbyB0aGluZ3MgdGhlIGhhcmQgd2F5LCBpbmNsdWRpbmcgaW5pdGlhdGluZyB0aGUKKyAqCQlidXMgc2Nhbm5pbmcgb3Vyc2VsdmVzLgogICovCiAKLSNkZWZpbmUgUENJX0JVU0VTX1RPX1NDQU4gMjU2Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNuX3BjaV9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBzbl9pb19pbml0KHZvaWQpCiB7CiAJaW50IGksIGo7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwogCi0JaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSB8fCBJU19SVU5OSU5HX09OX0ZBS0VfUFJPTSgpKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogcHJpbWUgc25fcGNpX3Byb3ZpZGVyW10uICBJbmRpdmlkaWFsIHByb3ZpZGVyIGluaXQgcm91dGluZXMgd2lsbAotCSAqIG92ZXJyaWRlIHRoZWlyIHJlc3BlY3RpdmUgZGVmYXVsdCBlbnRyaWVzLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IFBDSUlPX0FTSUNfTUFYX1RZUEVTOyBpKyspCi0JCXNuX3BjaV9wcm92aWRlcltpXSA9ICZzbl9wY2lfZGVmYXVsdF9wcm92aWRlcjsKLQotCXBjaWJyX2luaXRfcHJvdmlkZXIoKTsKLQl0aW9jYV9pbml0X3Byb3ZpZGVyKCk7Ci0JdGlvY2VfaW5pdF9wcm92aWRlcigpOwotCi0JLyoKLQkgKiBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBib3VuY2UgbGltaXQgY2hlY2tzIGluIHRoZSBibGsgbGF5ZXIKLQkgKi8KLQlpYTY0X21heF9pb21tdV9tZXJnZV9tYXNrID0gflBBR0VfTUFTSzsKIAlzbl9maXh1cF9pb25vZGVzKCk7Ci0Jc25faXJxX2xoX2luaXQoKTsKLQlJTklUX0xJU1RfSEVBRCgmc25fc3lzZGF0YV9saXN0KTsKLQlzbl9pbml0X2NwZWlfdGltZXIoKTsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcmVnaXN0ZXJfc25fcHJvY2ZzKCk7Ci0jZW5kaWYKIAogCS8qIGJ1c3NlcyBhcmUgbm90IGtub3duIHlldCAuLi4gKi8KIAlmb3IgKGkgPSAwOyBpIDw9IG1heF9zZWdtZW50X251bWJlcjsgaSsrKQogCQlmb3IgKGogPSAwOyBqIDw9IG1heF9wY2lidXNfbnVtYmVyOyBqKyspCiAJCQlzbl9wY2lfY29udHJvbGxlcl9maXh1cChpLCBqLCBOVUxMKTsKLQotCS8qCi0JICogR2VuZXJpYyBMaW51eCBQQ0kgTGF5ZXIgaGFzIGNyZWF0ZWQgdGhlIHBjaV9idXMgYW5kIHBjaV9kZXYgCi0JICogc3RydWN0dXJlcyAtIHRpbWUgZm9yIHVzIHRvIGFkZCBvdXIgU04gUExhdGZvcm0gc3BlY2lmaWMgCi0JICogaW5mb3JtYXRpb24uCi0JICovCi0KLQl3aGlsZSAoKHBjaV9kZXYgPQotCQlwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgIT0gTlVMTCkKLQkJc25fcGNpX2ZpeHVwX3Nsb3QocGNpX2Rldik7Ci0KLQlzbl9pb2lmX2luaXRlZCA9IDE7CS8qIHNuIEkvTyBpbmZyYXN0cnVjdHVyZSBub3cgaW5pdGlhbGl6ZWQgKi8KLQotCXJldHVybiAwOwogfQotCi0vKgotICogaHViZGV2X2luaXRfbm9kZSgpIC0gQ3JlYXRlcyB0aGUgSFVCIGRhdGEgc3RydWN0dXJlIGFuZCBsaW5rIHRoZW0gdG8gaXQncyAKLSAqCW93biBOT0RFIHNwZWNpZmljIGRhdGEgYXJlYS4KLSAqLwotdm9pZCBodWJkZXZfaW5pdF9ub2RlKG5vZGVwZGFfdCAqIG5wZGEsIGNub2RlaWRfdCBub2RlKQotewotCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87Ci0JaW50IHNpemU7Ci0JcGdfZGF0YV90ICpwZzsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGh1YmRldl9pbmZvKTsKLQotCWlmIChub2RlID49IG51bV9vbmxpbmVfbm9kZXMoKSkJLyogSGVhZGxlc3MvbWVtbGVzcyBJTyBub2RlcyAqLwotCQlwZyA9IE5PREVfREFUQSgwKTsKLQllbHNlCi0JCXBnID0gTk9ERV9EQVRBKG5vZGUpOwotCi0JaHViZGV2X2luZm8gPSAoc3RydWN0IGh1YmRldl9pbmZvICopYWxsb2NfYm9vdG1lbV9ub2RlKHBnLCBzaXplKTsKLQotCW5wZGEtPnBkaW5mbyA9ICh2b2lkICopaHViZGV2X2luZm87Ci19Ci0KLWdlb2lkX3QKLWNub2RlaWRfZ2V0X2dlb2lkKGNub2RlaWRfdCBjbm9kZSkKLXsKLQlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldjsKLQotCWh1YmRldiA9IChzdHJ1Y3QgaHViZGV2X2luZm8gKikoTk9ERVBEQShjbm9kZSktPnBkaW5mbyk7Ci0JcmV0dXJuIGh1YmRldi0+aGRpX2dlb2lkOwotfQotCi12b2lkIHNuX2dlbmVyYXRlX3BhdGgoc3RydWN0IHBjaV9idXMgKnBjaV9idXMsIGNoYXIgKmFkZHJlc3MpCi17Ci0JbmFzaWRfdCBuYXNpZDsKLQljbm9kZWlkX3QgY25vZGU7Ci0JZ2VvaWRfdCBnZW9pZDsKLQltb2R1bGVpZF90IG1vZHVsZWlkOwotCXUxNiBicmlja3R5cGU7Ci0KLQluYXNpZCA9IE5BU0lEX0dFVChTTl9QQ0lCVVNfQlVTU09GVChwY2lfYnVzKS0+YnNfYmFzZSk7Ci0JY25vZGUgPSBuYXNpZF90b19jbm9kZWlkKG5hc2lkKTsKLQlnZW9pZCA9IGNub2RlaWRfZ2V0X2dlb2lkKGNub2RlKTsKLQltb2R1bGVpZCA9IGdlb19tb2R1bGUoZ2VvaWQpOwotCi0Jc3ByaW50ZihhZGRyZXNzLCAibW9kdWxlXyVjJWMlYyVjJS4yZCIsCi0JCScwJytSQUNLX0dFVF9DTEFTUyhNT0RVTEVfR0VUX1JBQ0sobW9kdWxlaWQpKSwKLQkJJzAnK1JBQ0tfR0VUX0dST1VQKE1PRFVMRV9HRVRfUkFDSyhtb2R1bGVpZCkpLAotCQknMCcrUkFDS19HRVRfTlVNKE1PRFVMRV9HRVRfUkFDSyhtb2R1bGVpZCkpLAotCQlNT0RVTEVfR0VUX0JUQ0hBUihtb2R1bGVpZCksIE1PRFVMRV9HRVRfQlBPUyhtb2R1bGVpZCkpOwotCi0JLyogVG9sbGhvdXNlIHJlcXVpcmVzIHNsb3QgaWQgdG8gYmUgZGlzcGxheWVkICovCi0JYnJpY2t0eXBlID0gTU9EVUxFX0dFVF9CVFlQRShtb2R1bGVpZCk7Ci0JaWYgKChicmlja3R5cGUgPT0gTDFfQlJJQ0tUWVBFXzE5MTAxMCkgfHwKLQkgICAgKGJyaWNrdHlwZSA9PSBMMV9CUklDS1RZUEVfMTkzMikpCi0JCQlzcHJpbnRmKGFkZHJlc3MsICIlc14lZCIsIGFkZHJlc3MsIGdlb19zbG90KGdlb2lkKSk7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChzbl9wY2lfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKHNuX3BjaV9maXh1cF9zbG90KTsKLUVYUE9SVF9TWU1CT0woc25fcGNpX3VuZml4dXBfc2xvdCk7Ci1FWFBPUlRfU1lNQk9MKHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKTsKLUVYUE9SVF9TWU1CT0woc25fYnVzX3N0b3JlX3N5c2RhdGEpOwotRVhQT1JUX1NZTUJPTChzbl9idXNfZnJlZV9zeXNkYXRhKTsKLUVYUE9SVF9TWU1CT0woc25fZ2VuZXJhdGVfcGF0aCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvbXYuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9tdi5jCmluZGV4IDdjZTNjZGEuLjRhYTRmMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9tdi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9tdi5jCkBAIC0zLDEwICszLDExIEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAzLCAyMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS92Z2EuaD4KQEAgLTE1LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vc24vcGRhLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX2NwdWlkLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CisjaW5jbHVkZSA8YXNtL3NuL2FjcGkuaD4KIAogI2RlZmluZSBJU19MRUdBQ1lfVkdBX0lPUE9SVChwKSBcCiAJKCgocCkgPj0gMHgzYjAgJiYgKHApIDw9IDB4M2JiKSB8fCAoKHApID49IDB4M2MwICYmIChwKSA8PSAweDNkZikpCkBAIC0zMSwxMSArMzMsMTQgQEAKIHsKIAlpZiAoIUlTX1JVTk5JTkdfT05fU0lNVUxBVE9SKCkpIHsKIAkJaWYgKElTX0xFR0FDWV9WR0FfSU9QT1JUKHBvcnQpKQotCQkJcG9ydCArPSB2Z2FfY29uc29sZV9pb2Jhc2U7CisJCQlyZXR1cm4gKF9faWE2NF9ta19pb19hZGRyKHBvcnQpKTsKIAkJLyogT24gc24yLCBsZWdhY3kgSS9PIHBvcnRzIGRvbid0IHBvaW50IGF0IGFueXRoaW5nICovCiAJCWlmIChwb3J0IDwgKDY0ICogMTAyNCkpCiAJCQlyZXR1cm4gTlVMTDsKLQkJcmV0dXJuICgodm9pZCAqKShwb3J0IHwgX19JQTY0X1VOQ0FDSEVEX09GRlNFVCkpOworCQlpZiAoU05fQUNQSV9CQVNFX1NVUFBPUlQoKSkKKwkJCXJldHVybiAoX19pYTY0X21rX2lvX2FkZHIocG9ydCkpOworCQllbHNlCisJCQlyZXR1cm4gKCh2b2lkICopKHBvcnQgfCBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUKSk7CiAJfSBlbHNlIHsKIAkJLyogYnV0IHRoZSBzaW11bGF0b3IgdXNlcyB0aGVtLi4uICovCiAJCXVuc2lnbmVkIGxvbmcgYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwppbmRleCA3YTJkODI0Li4xZDAwOWY5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCkBAIC0zODgsNiArMzg4LDE0IEBACiAJaWE2NF9zbl9wbGF0X3NldF9lcnJvcl9oYW5kbGluZ19mZWF0dXJlcygpOwkvLyBvYnNvbGV0ZQogCWlhNjRfc25fc2V0X29zX2ZlYXR1cmUoT1NGX01DQV9TTFZfVE9fT1NfSU5JVF9TTFYpOwogCWlhNjRfc25fc2V0X29zX2ZlYXR1cmUoT1NGX0ZFQVRfTE9HX1NCRVMpOworCS8qCisJICogTm90ZTogVGhlIGNhbGxzIHRvIG5vdGlmeSB0aGUgUFJPTSBvZiBBQ1BJIGFuZCBQQ0kgU2VnbWVudAorCSAqCSBzdXBwb3J0IG11c3QgYmUgZG9uZSBwcmlvciB0byBhY3BpX2xvYWRfdGFibGVzKCksIGFzCisJICoJIGFuIEFDUEkgY2FwYWJsZSBQUk9NIHdpbGwgcmVidWlsZCB0aGUgRFNEVCBhcyByZXN1bHQKKwkgKgkgb2YgdGhlIGNhbGwuCisJICovCisJaWE2NF9zbl9zZXRfb3NfZmVhdHVyZShPU0ZfUENJU0VHTUVOVF9FTkFCTEUpOworCWlhNjRfc25fc2V0X29zX2ZlYXR1cmUoT1NGX0FDUElfRU5BQkxFKTsKIAogCiAjaWYgZGVmaW5lZChDT05GSUdfVlQpICYmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQpAQCAtNDEzLDYgKzQyMSwxNiBAQAogCWlmICghIHZnYV9jb25zb2xlX21lbWJhc2UpCiAJCXNuX3NjYW5fcGNkcCgpOwogCisJLyoKKwkgKglTZXR1cCBsZWdhY3kgSU8gc3BhY2UuCisJICoJdmdhX2NvbnNvbGVfaW9iYXNlIG1hcHMgdG8gUENJIElPIFNwYWNlIGFkZHJlc3MgMCBvbiB0aGUKKwkgKiAJYnVzIGNvbnRhaW5pbmcgdGhlIFZHQSBjb25zb2xlLgorCSAqLworCWlmICh2Z2FfY29uc29sZV9pb2Jhc2UpIHsKKwkJaW9fc3BhY2VbMF0ubW1pb19iYXNlID0gdmdhX2NvbnNvbGVfaW9iYXNlOworCQlpb19zcGFjZVswXS5zcGFyc2UgPSAwOworCX0KKwogCWlmICh2Z2FfY29uc29sZV9tZW1iYXNlKSB7CiAJCS8qIHVzYWJsZSB2Z2EgLi4uIG1ha2UgdHR5MCB0aGUgcHJlZmVycmVkIGRlZmF1bHQgY29uc29sZSAqLwogCQlpZiAoIXN0cnN0cigqY21kbGluZV9wLCAiY29uc29sZT0iKSkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwppbmRleCBmZWFmMWE2Li40OTMzODBiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCkBAIC01NTIsNyArNTUyLDcgQEAKIAlidXNfdW5yZWdpc3RlcigmdGlvY3hfYnVzX3R5cGUpOwogfQogCi1zdWJzeXNfaW5pdGNhbGwodGlvY3hfaW5pdCk7Citmc19pbml0Y2FsbCh0aW9jeF9pbml0KTsKIG1vZHVsZV9leGl0KHRpb2N4X2V4aXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKaW5kZXggMjdkZDdkZi4uNjg0NmRjOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIDIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTEwOSw3ICsxMDksNiBAQAogcGNpYnJfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCiB7CiAJaW50IG5hc2lkLCBjbm9kZSwgajsKLQljbm9kZWlkX3QgbmVhcl9jbm9kZTsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldl9pbmZvOwogCXN0cnVjdCBwY2lidXNfaW5mbyAqc29mdDsKIAlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqc25fZmx1c2hfZGV2aWNlX2tlcm5lbDsKQEAgLTE4NiwyMCArMTg1LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKHByb21fYnVzc29mdC0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DUCkgewotCQkvKiBUSU8gUENJIEJyaWRnZTogZmluZCBuZWFyZXN0IG5vZGUgd2l0aCBDUFVzICovCi0JCWludCBlID0gc25faHdwZXJmX2dldF9uZWFyZXN0X25vZGUoY25vZGUsIE5VTEwsICZuZWFyX2Nub2RlKTsKLQotCQlpZiAoZSA8IDApIHsKLQkJCW5lYXJfY25vZGUgPSAoY25vZGVpZF90KS0xOyAvKiB1c2UgYW55IG5vZGUgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaWJyX2J1c19maXh1cDogZmFpbGVkIHRvIGZpbmQgIgotCQkJCSJuZWFyIG5vZGUgd2l0aCBDUFVzIHRvIFRJTyBub2RlICVkLCBlcnI9JWRcbiIsCi0JCQkJY25vZGUsIGUpOwotCQl9Ci0JCWNvbnRyb2xsZXItPm5vZGUgPSBuZWFyX2Nub2RlOwotCX0KLQllbHNlCi0JCWNvbnRyb2xsZXItPm5vZGUgPSBjbm9kZTsKIAlyZXR1cm4gc29mdDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jCmluZGV4IDQ2ZTE2ZGMuLjM1Zjg1NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NlX3Byb3ZpZGVyLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3Rpb2NlX3Byb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NuMi9zbl9od3BlcmYuaD4KIAogLyoKICAqIDEvMjYvMjAwNgpAQCAtOTkwLDggKzk4OSw2IEBACiBzdGF0aWMgdm9pZCAqCiB0aW9jZV9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnQsIHN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlcikKIHsKLQlpbnQgbXlfbmFzaWQ7Ci0JY25vZGVpZF90IG15X2Nub2RlLCBtZW1fY25vZGU7CiAJc3RydWN0IHRpb2NlX2NvbW1vbiAqdGlvY2VfY29tbW9uOwogCXN0cnVjdCB0aW9jZV9rZXJuZWwgKnRpb2NlX2tlcm47CiAJc3RydWN0IHRpb2NlIF9faW9tZW0gKnRpb2NlX21tcjsKQEAgLTEwMzUsMjEgKzEwMzIsNiBAQAogCQkgICAgICAgdGlvY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfcGVyc2lzdF9zZWdtZW50LAogCQkgICAgICAgdGlvY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfcGVyc2lzdF9idXNudW0pOwogCi0JLyoKLQkgKiBpZGVudGlmeSBjbG9zZXN0IG5hc2lkIGZvciBtZW1vcnkgYWxsb2NhdGlvbnMKLQkgKi8KLQotCW15X25hc2lkID0gTkFTSURfR0VUKHRpb2NlX2NvbW1vbi0+Y2VfcGNpYnVzLmJzX2Jhc2UpOwotCW15X2Nub2RlID0gbmFzaWRfdG9fY25vZGVpZChteV9uYXNpZCk7Ci0KLQlpZiAoc25faHdwZXJmX2dldF9uZWFyZXN0X25vZGUobXlfY25vZGUsICZtZW1fY25vZGUsIE5VTEwpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0aW9jZV9idXNfZml4dXA6IGZhaWxlZCB0byBmaW5kICIKLQkJICAgICAgICJjbG9zZXN0IG5vZGUgd2l0aCBNRU0gdG8gVElPIG5vZGUgJWRcbiIsIG15X2Nub2RlKTsKLQkJbWVtX2Nub2RlID0gKGNub2RlaWRfdCktMTsgLyogdXNlIGFueSBub2RlICovCi0JfQotCi0JY29udHJvbGxlci0+bm9kZSA9IG1lbV9jbm9kZTsKLQogCXJldHVybiB0aW9jZV9jb21tb247CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYyBiL2FyY2gvbTMyci9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwppbmRleCAzZDVmMDYxLi41NTk2ZjNkIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKKysrIGIvYXJjaC9tMzJyL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCkBAIC0yNyw5ICsyNyw4IEBACiAvKgogICogQ29weSB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJc3VtID0gY3N1bV9wYXJ0aWFsKHNyYywgbGVuLCBzdW0pOwogCW1lbWNweShkc3QsIHNyYywgbGVuKTsKQEAgLTQyLDEwICs0MSw5IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKaW5kZXggY2IxM2M2ZS4uYWVkM2JlMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYwpAQCAtMzksOCArMzksNyBAQAogICogY29tcHV0ZXMgYSBwYXJ0aWFsIGNoZWNrc3VtLCBlLmcuIGZvciBUQ1AvVURQIGZyYWdtZW50cwogICovCiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsIChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKIAkgIC8qCkBAIC0xMzMsOSArMTMyLDkgQEAKICAqIGNvcHkgZnJvbSB1c2VyIHNwYWNlIHdoaWxlIGNoZWNrc3VtbWluZywgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcuCiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJICAgIGludCBsZW4sIGludCBzdW0sIGludCAqY3N1bV9lcnIpCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICpjc3VtX2VycikKIHsKIAkvKgogCSAqIEdDQyBkb2Vzbid0IGxpa2UgbW9yZSB0aGFuIDEwIG9wZXJhbmRzIGZvciB0aGUgYXNtCkBAIC0zMjUsOCArMzI0LDggQEAKICAqIGNvcHkgZnJvbSBrZXJuZWwgc3BhY2Ugd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwogCV9fYXNtX18oIm1vdmVsICUyLCU0XG5cdCIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L0tjb25maWcgYi9hcmNoL202OGtub21tdS9LY29uZmlnCmluZGV4IDZkOTIwZDQuLmFhNzBkZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L0tjb25maWcKKysrIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwpAQCAtMTczLDcgKzE3Myw3IEBACiAJICBPbiBtYW55IFNvQyBzdHlsZSBDUFVzIHRoZSBtYXN0ZXIgQ1BVIGNsb2NrIGlzIGFsc28gdXNlZCB0byBkcml2ZSAKIAkgIG9uLWNoaXAgcGVyaXBoZXJhbHMuIFRoZSBjbG9jayB0aGF0IGlzIGRpc3RyaWJ1dGVkIHRvIHRoZXNlCiAJICBwZXJpcGhlcmFscyBpcyBzb21ldGltZXMgYSBmaXhlZCByYXRpbyBvZiB0aGUgbWFzdGVyIGNsb2NrCi0JICBmcmVxdWVuY3kuIElmIHNvIHRoZW4gc2V0IHRoaXMgdG8gdGhlIGRpdmlkZXIgcmF0aW9uIG9mIHRoZQorCSAgZnJlcXVlbmN5LiBJZiBzbyB0aGVuIHNldCB0aGlzIHRvIHRoZSBkaXZpZGVyIHJhdGlvIG9mIHRoZQogCSAgbWFzdGVyIGNsb2NrIHRvIHRoZSBwZXJpcGhlcmFsIGNsb2NrLiBJZiBub3Qgc3VyZSB0aGVuIHNlbGVjdCAxLgogCiBjb25maWcgT0xETUFTSwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJICBTdXBwb3J0IGZvciB0aGUgUGFsbSBQaWxvdCAxMDAwLzUwMDAsIFBlcnNvbmFsL1BybyBhbmQgUGFsbUlJSS4KIAogY29uZmlnIFhDT1BJTE9UX0JVR1MKLQlib29sICIgIChYKUNvcGlsb3Qgc3VwcG9ydCIKKwlib29sICIoWClDb3BpbG90IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQSUxPVDMKIAloZWxwCiAJICBTdXBwb3J0IHRoZSBidWdzIG9mIFhjb3BpbG90LgpAQCAtMjE2LDIwICsyMTYsMjAgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSBEcmFnZW5FbmdpbmUgSUkgYm9hcmQuCiAKIGNvbmZpZyBESVJFQ1RfSU9fQUNDRVNTCi0JYm9vbCAiICBBbGxvdyB1c2VyIHRvIGFjY2VzcyBJTyBkaXJlY3RseSIKKwlib29sICJBbGxvdyB1c2VyIHRvIGFjY2VzcyBJTyBkaXJlY3RseSIKIAlkZXBlbmRzIG9uIChVQ1NJTU0gfHwgVUNESU1NIHx8IERSQUdFTjIpCiAJaGVscAogCSAgRGlzYWJsZSB0aGUgQ1BVIGludGVybmFsIHJlZ2lzdGVycyBwcm90ZWN0aW9uIGluIHVzZXIgbW9kZSwKICAgICAgICAgICB0byBhbGxvdyBhIHVzZXIgYXBwbGljYXRpb24gdG8gcmVhZC93cml0ZSB0aGVtLgogCiBjb25maWcgSU5JVF9MQ0QKLQlib29sICIgIEluaXRpYWxpemUgTENEIgorCWJvb2wgIkluaXRpYWxpemUgTENEIgogCWRlcGVuZHMgb24gKFVDU0lNTSB8fCBVQ0RJTU0gfHwgRFJBR0VOMikKIAloZWxwCiAJICBJbml0aWFsaXplIHRoZSBMQ0QgY29udHJvbGxlciBvZiB0aGUgNjh4MzI4IHByb2Nlc3Nvci4KIAogY29uZmlnIE1FTU9SWV9SRVNFUlZFCi0JaW50ICIgIE1lbW9yeSByZXNlcnZhdGlvbiAoTWlCKSIKKwlpbnQgIk1lbW9yeSByZXNlcnZhdGlvbiAoTWlCKSIKIAlkZXBlbmRzIG9uIChVQ1NJTU0gfHwgVUNESU1NKQogCWhlbHAKIAkgIFJlc2VydmUgY2VydGFpbiBtZW1vcnkgcmVnaW9ucyBvbiA2OHgzMjggYmFzZWQgYm9hcmRzLgpAQCAtNDA5LDcgKzQwOSw3IEBACiAJICBTdXBwb3J0IGZvciB0aGUgTmV0YnVybmVyIE1PRC01MjcyIGJvYXJkLgogCiBjb25maWcgUk9NRlNfRlJPTV9ST00KLQlib29sICIgIFJPTUZTIGltYWdlIG5vdCBSQU0gcmVzaWRlbnQiCisJYm9vbCAiUk9NRlMgaW1hZ2Ugbm90IFJBTSByZXNpZGVudCIKIAlkZXBlbmRzIG9uIChORVR0ZWwgfHwgU05BUEdFQVIpCiAJaGVscAogCSAgVGhlIFJPTWZzIGZpbGVzeXN0ZW0gd2lsbCBzdGF5IHJlc2lkZW50IGluIHRoZSBGTEFTSC9ST00sIG5vdCBiZQpAQCAtNTY1LDcgKzU2NSw3IEBACiAJZGVwZW5kcyBvbiBST00KIAloZWxwCiAJICBUaGlzIGlzIGFsbW9zdCBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGJhc2Ugb2YgdGhlIFJPTS4gU2luY2Ugb24gYWxsCi0JICA2ODAwMCB0eXBlIHZhcmllbnRzIHRoZSB2ZWN0b3JzIGFyZSBhdCB0aGUgYmFzZSBvZiB0aGUgYm9vdCBkZXZpY2UKKwkgIDY4MDAwIHR5cGUgdmFyaWFudHMgdGhlIHZlY3RvcnMgYXJlIGF0IHRoZSBiYXNlIG9mIHRoZSBib290IGRldmljZQogCSAgb24gc3lzdGVtIHN0YXJ0dXAuCiAKIGNvbmZpZyBST01WRUNTSVpFCkBAIC01NzQsNyArNTc0LDcgQEAKIAlkZXBlbmRzIG9uIFJPTQogCWhlbHAKIAkgIERlZmluZSB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yIHJlZ2lvbiBpbiBST00uIEZvciBtb3N0IDY4MDAwCi0JICB2YXJpZW50cyB0aGlzIHdvdWxkIGJlIDB4NDAwIGJ5dGVzIGluIHNpemUuIFNldCB0byAwIGlmIHlvdSBkbworCSAgdmFyaWFudHMgdGhpcyB3b3VsZCBiZSAweDQwMCBieXRlcyBpbiBzaXplLiBTZXQgdG8gMCBpZiB5b3UgZG8KIAkgIG5vdCB3YW50IGEgdmVjdG9yIHJlZ2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIFJPTS4KIAogY29uZmlnIFJPTVNUQVJUCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvbTY4a19rc3ltcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL202OGtfa3N5bXMuYwppbmRleCAxZTYyMTUwLi4yNTMyN2M5IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9tNjhrX2tzeW1zLmMKQEAgLTM4LDcgKzM4LDcgQEAKIEVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CiAKIC8qIE5ldHdvcmtpbmcgaGVscGVyIHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weSk7CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwogCiAvKiBUaGUgZm9sbG93aW5nIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhleSdyZSBub3QgY2FsbGVkCiAgICBleHBsaWNpdGx5ICh0aGUgQyBjb21waWxlciBnZW5lcmF0ZXMgdGhlbSkuICBGb3J0dW5hdGVseSwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGMxOGE4MzMuLjk0MTk1NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJdW5zaWduZWQgY2hhcgkqdHA7CiAJaW50CQlpOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcgIlxuQ1VSUkVOVCBQUk9DRVNTOlxuXG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiXG4iIEtFUk5fRU1FUkcgIkNVUlJFTlQgUFJPQ0VTUzpcbiIgS0VSTl9FTUVSRyAiXG4iKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiQ09NTT0lcyBQSUQ9JWRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CiAKIAlpZiAoY3VycmVudC0+bW0pIHsKQEAgLTMwMSw3ICszMDEsOCBAQAogCQkJKGludCkgY3VycmVudC0+bW0tPmVuZF9kYXRhLAogCQkJKGludCkgY3VycmVudC0+bW0tPmVuZF9kYXRhLAogCQkJKGludCkgY3VycmVudC0+bW0tPmJyayk7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJVU0VSLVNUQUNLPSUwOHggIEtFUk5FTC1TVEFDSz0lMDh4XG5cbiIsCisJCXByaW50ayhLRVJOX0VNRVJHICJVU0VSLVNUQUNLPSUwOHggS0VSTkVMLVNUQUNLPSUwOHhcbiIKKwkJCUtFUk5fRU1FUkcgIlxuIiwKIAkJCShpbnQpIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjaywKIAkJCShpbnQpKCgodW5zaWduZWQgbG9uZykgY3VycmVudCkgKyBUSFJFQURfU0laRSkpOwogCX0KQEAgLTMxMiwzNiArMzEzLDM1IEBACiAJCWZwLT5kMCwgZnAtPmQxLCBmcC0+ZDIsIGZwLT5kMyk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgImQ0OiAlMDhseCAgICBkNTogJTA4bHggICAgYTA6ICUwOGx4ICAgIGExOiAlMDhseFxuIiwKIAkJZnAtPmQ0LCBmcC0+ZDUsIGZwLT5hMCwgZnAtPmExKTsKLQlwcmludGsoS0VSTl9FTUVSRyAiXG5VU1A6ICUwOHggICBUUkFQRlJBTUU6ICUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIHJkdXNwKCksCi0JCSh1bnNpZ25lZCBpbnQpIGZwKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiXG4iIEtFUk5fRU1FUkcgIlVTUDogJTA4eCAgIFRSQVBGUkFNRTogJTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludCkgcmR1c3AoKSwgKHVuc2lnbmVkIGludCkgZnApOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcgIlxuQ09ERToiKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiXG4iIEtFUk5fRU1FUkcgIkNPREU6Iik7CiAJdHAgPSAoKHVuc2lnbmVkIGNoYXIgKikgZnAtPnBjKSAtIDB4MjA7CiAJZm9yIChzcCA9ICh1bnNpZ25lZCBsb25nICopIHRwLCBpID0gMDsgKGkgPCAweDQwKTsgIGkgKz0gNCkgewogCQlpZiAoKGkgJSAweDEwKSA9PSAwKQotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIlxuJTA4eDogIiwgKGludCkgKHRwICsgaSkpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiJTA4eCAiLCAoaW50KSAqc3ArKyk7CisJCQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICIlMDh4OiAiLCAoaW50KSAodHAgKyBpKSk7CisJCXByaW50aygiJTA4eCAiLCAoaW50KSAqc3ArKyk7CiAJfQotCXByaW50ayhLRVJOX0VNRVJHICJcbiIpOworCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIlxuIik7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiXG5LRVJORUwgU1RBQ0s6Iik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIktFUk5FTCBTVEFDSzoiKTsKIAl0cCA9ICgodW5zaWduZWQgY2hhciAqKSBmcCkgLSAweDQwOwogCWZvciAoc3AgPSAodW5zaWduZWQgbG9uZyAqKSB0cCwgaSA9IDA7IChpIDwgMHhjMCk7IGkgKz0gNCkgewogCQlpZiAoKGkgJSAweDEwKSA9PSAwKQotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIlxuJTA4eDogIiwgKGludCkgKHRwICsgaSkpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiJTA4eCAiLCAoaW50KSAqc3ArKyk7CisJCQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICIlMDh4OiAiLCAoaW50KSAodHAgKyBpKSk7CisJCXByaW50aygiJTA4eCAiLCAoaW50KSAqc3ArKyk7CiAJfQotCXByaW50ayhLRVJOX0VNRVJHICJcbiIpOwotCXByaW50ayhLRVJOX0VNRVJHICJcbiIpOworCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIlxuIik7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiXG5VU0VSIFNUQUNLOiIpOworCXByaW50ayhLRVJOX0VNRVJHICJVU0VSIFNUQUNLOiIpOwogCXRwID0gKHVuc2lnbmVkIGNoYXIgKikgKHJkdXNwKCkgLSAweDEwKTsKIAlmb3IgKHNwID0gKHVuc2lnbmVkIGxvbmcgKikgdHAsIGkgPSAwOyAoaSA8IDB4ODApOyBpICs9IDQpIHsKIAkJaWYgKChpICUgMHgxMCkgPT0gMCkKLQkJCXByaW50ayhLRVJOX0VNRVJHICJcbiUwOHg6ICIsIChpbnQpICh0cCArIGkpKTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIiUwOHggIiwgKGludCkgKnNwKyspOworCQkJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiJTA4eDogIiwgKGludCkgKHRwICsgaSkpOworCQlwcmludGsoIiUwOHggIiwgKGludCkgKnNwKyspOwogCX0KLQlwcmludGsoS0VSTl9FTUVSRyAiXG5cbiIpOworCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIlxuIik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCmluZGV4IDdiMjE5NTkuLjljZjJlNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCkBAIC0zNiwxMCArMzYsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNlbmRpZgogCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydDsKIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2VuZDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c19tNjhrLmMKaW5kZXggYzM0OTRiOC4uMzI2NWIyZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c19tNjhrLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c19tNjhrLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogYXNtbGlua2FnZSBpbnQgc3lzX2lwYyAodWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsCiAJCQlpbnQgdGhpcmQsIHZvaWQgKnB0ciwgbG9uZyBmaWZ0aCkKIHsKLQlpbnQgdmVyc2lvbjsKKwlpbnQgdmVyc2lvbiwgcmV0OwogCiAJdmVyc2lvbiA9IGNhbGwgPj4gMTY7IC8qIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KIAljYWxsICY9IDB4ZmZmZjsKQEAgLTE5MCw2ICsxOTAsMjcgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CisJaWYgKGNhbGwgPD0gU0hNQ1RMKQorCQlzd2l0Y2ggKGNhbGwpIHsKKwkJY2FzZSBTSE1BVDoKKwkJCXN3aXRjaCAodmVyc2lvbikgeworCQkJZGVmYXVsdDogeworCQkJCXVsb25nIHJhZGRyOworCQkJCXJldCA9IGRvX3NobWF0IChmaXJzdCwgcHRyLCBzZWNvbmQsICZyYWRkcik7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlyZXR1cm4gcHV0X3VzZXIgKHJhZGRyLCAodWxvbmcgX191c2VyICopIHRoaXJkKTsKKwkJCX0KKwkJCX0KKwkJY2FzZSBTSE1EVDoKKwkJCXJldHVybiBzeXNfc2htZHQgKHB0cik7CisJCWNhc2UgU0hNR0VUOgorCQkJcmV0dXJuIHN5c19zaG1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKKwkJY2FzZSBTSE1DVEw6CisJCQlyZXR1cm4gc3lzX3NobWN0bCAoZmlyc3QsIHNlY29uZCwgcHRyKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PU1lTOworCQl9CiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKaW5kZXggMTc2NDlkMi4uOTEyOWIzYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKQEAgLTEyNywxMSArMTI3LDEyIEBACiAJCWlmIChzdGFjayArIDEgPiBlbmRzdGFjaykKIAkJCWJyZWFrOwogCQlpZiAoaSAlIDggPT0gMCkKLQkJCXByaW50ayhLRVJOX0VNRVJHICJcbiAgICAgICAiKTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIiAlMDhseCIsICpzdGFjaysrKTsKKwkJCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIiAgICAgICAiKTsKKwkJcHJpbnRrKCIgJTA4bHgiLCAqc3RhY2srKyk7CiAJfQorCXByaW50aygiXG4iKTsKIAotCXByaW50ayhLRVJOX0VNRVJHICJcbkNhbGwgVHJhY2U6Iik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIkNhbGwgVHJhY2U6Iik7CiAJaSA9IDA7CiAJd2hpbGUgKHN0YWNrICsgMSA8PSBlbmRzdGFjaykgewogCQlhZGRyID0gKnN0YWNrKys7CkBAIC0xNDYsMTIgKzE0NywxMiBAQAogCQlpZiAoKChhZGRyID49ICh1bnNpZ25lZCBsb25nKSAmX3N0YXJ0KSAmJgogCQkgICAgIChhZGRyIDw9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0KSkpIHsKIAkJCWlmIChpICUgNCA9PSAwKQotCQkJCXByaW50ayhLRVJOX0VNRVJHICJcbiAgICAgICAiKTsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIgWzwlMDhseD5dIiwgYWRkcik7CisJCQkJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiICAgICAgICIpOworCQkJcHJpbnRrKCIgWzwlMDhseD5dIiwgYWRkcik7CiAJCQlpKys7CiAJCX0KIAl9Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIlxuIik7CisJcHJpbnRrKCJcbiIpOwogfQogCiB2b2lkIGJhZF9zdXBlcl90cmFwKHN0cnVjdCBmcmFtZSAqZnApCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9saWIvY2hlY2tzdW0uYyBiL2FyY2gvbTY4a25vbW11L2xpYi9jaGVja3N1bS5jCmluZGV4IDdiZWM2ZmQuLjI2OWQ4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvbTY4a25vbW11L2xpYi9jaGVja3N1bS5jCkBAIC05Niw5ICs5Niw5IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwgdW5zaWduZWQgaW50IGlobCkKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKLQlyZXR1cm4gfmRvX2NzdW0oaXBoLGlobCo0KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShpcGgsaWhsKjQpOwogfQogCiAvKgpAQCAtMTEzLDE1ICsxMTMsMTUgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHN1bTsKLQlpZiAoc3VtID4gcmVzdWx0KQorCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOworCWlmICgoX19mb3JjZSB1MzIpc3VtID4gcmVzdWx0KQogCQlyZXN1bHQgKz0gMTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CkBAIC0xMzAsMjEgKzEzMCwyMSBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7Ci0JcmV0dXJuIH5kb19jc3VtKGJ1ZmYsbGVuKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShidWZmLGxlbik7CiB9CiAKIC8qCiAgKiBjb3B5IGZyb20gZnMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpCiB7CiAJaWYgKGNzdW1fZXJyKSAqY3N1bV9lcnIgPSAwOwotCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwltZW1jcHkoZHN0LCAoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKQEAgLTE1Miw4ICsxNTIsOCBAQAogICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9oZWFkLlMKaW5kZXggZjJlZGI2NC4uYjlhYTBjYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9oZWFkLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9oZWFkLlMKQEAgLTY0LDYgKzY0LDI2IEBACiAJbmVnbAklZDAJCQkvKiBuZWdhdGUgYml0cyAqLwogLmVuZG0KIAorI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyMHgpCisubWFjcm8gR0VUX01FTV9TSVpFCisJY2xybAklZDAKKwltb3ZlbAlNQ0ZfTUJBUitNQ0ZTSU1fU0RDUzAsICVkMiAvKiBHZXQgU0RSQU0gY2hpcCBzZWxlY3QgMCBjb25maWcgKi8KKwlhbmRsCSMweDFmLCAlZDIJCS8qIEdldCBvbmx5IHRoZSBjaGlwIHNlbGVjdCBzaXplICovCisJYmVxCTNmCQkJLyogQ2hlY2sgaWYgaXQgaXMgZW5hYmxlZCAqLworCWFkZHFsCSMxLCAlZDIJCQkvKiBGb3JtIGV4cG9uZW50ICovCisJbW92ZXFsCSMxLCAlZDAKKwlsc2xsCSVkMiwgJWQwCQkvKiAyIF4gZXhwb25lbnQgKi8KKzM6CisJbW92ZWwJTUNGX01CQVIrTUNGU0lNX1NEQ1MxLCAlZDIgLyogR2V0IFNEUkFNIGNoaXAgc2VsZWN0IDEgY29uZmlnICovCisJYW5kbAkjMHgxZiwgJWQyCQkvKiBHZXQgb25seSB0aGUgY2hpcCBzZWxlY3Qgc2l6ZSAqLworCWJlcQk0ZgkJCS8qIENoZWNrIGlmIGl0IGlzIGVuYWJsZWQgKi8KKwlhZGRxbAkjMSwgJWQyCQkJLyogRm9ybSBleHBvbmVudCAqLworCW1vdmVxbAkjMSwgJWQxCisJbHNsbAklZDIsICVkMQkJLyogMiBeIGV4cG9uZW50ICovCisJYWRkbAklZDEsICVkMAkJLyogVG90YWwgc2l6ZSBvZiBTRFJBTSBpbiBkMCAqLworNDoKKy5lbmRtCisKICNlbHNlCiAjZXJyb3IgIkVSUk9SOiBJIGRvbid0IGtub3cgaG93IHRvIHByb2JlIHlvdXIgYm9hcmRzIG1lbW9yeSBzaXplPyIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvaGVhZC1yYW0uUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2hlYWQtcmFtLlMKaW5kZXggMmVhNTE0Ny4uMmVmMDYyNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvaGVhZC1yYW0uUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9oZWFkLXJhbS5TCkBAIC0yNSw2ICsyNSw3IEBACiAuZ2xvYmFsIF9wZXJpcGhfYmFzZQogCiAjZGVmaW5lCVJBTUVORCAgICAgICAgICAgICAgICAgICAgICAoQ09ORklHX1JBTUJBU0UgKyBDT05GSUdfUkFNU0laRSkKKyNkZWZpbmUJUk9NRU5EICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfUk9NQkFTRSArIENPTkZJR19ST01TSVpFKQogCiAjZGVmaW5lIFJFR0IgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKICNkZWZpbmUgUEVQQVIgICAgICAgICAgICAgICAgICAgICAgIChfZHByYmFzZSArIFJFR0IgKyAweDAwMTYpCkBAIC0xNzUsNyArMTc2LDcgQEAKIAltb3ZlLmwJJWQwLCBCUjAKIAogY29uZmlndXJlX2NoaXBfc2VsZWN0XzE6Ci0JbW92ZS5sCSNfX3JvbV9lbmQsICVkMAorCW1vdmUubAkjUk9NRU5ELCAlZDAKIAlzdWJpLmwJI19fcm9tX3N0YXJ0LCAlZDAKIAlzdWJxLmwJIzB4MDEsICVkMAogCWVvcmkubAkjU0lNX09SX01BU0ssICVkMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCAxNDQzMDI0Li40ZDY0OTYwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTYsNiArMTYsNyBAQAogCWJvb2wgIjRHIFN5c3RlbXMgTVRYLTEgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKIAlzZWxlY3QgU09DX0FVMTUwMAogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KQEAgLTMyLDYgKzMzLDcgQEAKIAlzZWxlY3QgU09DX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCkBAIC00MSw2ICs0Myw3IEBACiAJc2VsZWN0IFNPQ19BVTExMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgpAQCAtNTAsNiArNTMsNyBAQAogCXNlbGVjdCBTT0NfQVUxNTAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAKQEAgLTU5LDYgKzYzLDcgQEAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCkBAIC02Nyw2ICs3Miw3IEBACiAJc2VsZWN0IFNPQ19BVTEyMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIApAQCAtNzUsNiArODEsNyBAQAogCXNlbGVjdCBTT0NfQVUxMDAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAKQEAgLTkxLDYgKzk4LDcgQEAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgpAQCAtMTAxLDYgKzEwOSw3IEBACiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIApAQCAtMjY2LDggKzI3NSw4IEBACiAJc2VsZWN0IEJPT1RfRUxGMzIKIAlzZWxlY3QgSEFWRV9TVERfUENfU0VSSUFMX1BPUlQKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgR0VORVJJQ19JU0FfRE1BCisJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBNSVBTX0JPQVJEU19HRU4KQEAgLTUzNCw3ICs1NDMsNyBAQAogCXNlbGVjdCBIV19IQVNfRUlTQQogCXNlbGVjdCBJUDIyX0NQVV9TQ0FDSEUKIAlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBOT19JU0EgaWYgSVNBCisJc2VsZWN0IEdFTkVSSUNfSVNBX0RNQV9TVVBQT1JUX0JST0tFTgogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IFNZU19IQVNfQ1BVX1I0WDAwCiAJc2VsZWN0IFNZU19IQVNfQ1BVX1I1MDAwCkBAIC03NjYsNiArNzc1LDIzIEBACiAKIGVuZGNob2ljZQogCitjb25maWcgS0VYRUMKKyAJYm9vbCAiS2V4ZWMgc3lzdGVtIGNhbGwgKEVYUEVSSU1FTlRBTCkiCisgCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisgCWhlbHAKKyAJICBrZXhlYyBpcyBhIHN5c3RlbSBjYWxsIHRoYXQgaW1wbGVtZW50cyB0aGUgYWJpbGl0eSB0byBzaHV0ZG93biB5b3VyCisgCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKKyAJICBidXQgaXQgaXMgaW5kZXBlZGVudCBvZiB0aGUgc3lzdGVtIGZpcm13YXJlLiAgIEFuZCBsaWtlIGEgcmVib290CisgCSAgeW91IGNhbiBzdGFydCBhbnkga2VybmVsIHdpdGggaXQsIG5vdCBqdXN0IExpbnV4LgorCisgCSAgVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgc2ltaWxpYXJpdHkgdG8gdGhlIGV4ZWMgc3lzdGVtIGNhbGwuCisKKyAJICBJdCBpcyBhbiBvbmdvaW5nIHByb2Nlc3MgdG8gYmUgY2VydGFpbiB0aGUgaGFyZHdhcmUgaW4gYSBtYWNoaW5lCisgCSAgaXMgcHJvcGVybHkgc2h1dGRvd24sIHNvIGRvIG5vdCBiZSBzdXJwcmlzZWQgaWYgdGhpcyBjb2RlIGRvZXMgbm90CisgCSAgaW5pdGlhbGx5IHdvcmsgZm9yIHlvdS4gIEl0IG1heSBoZWxwIHRvIGVuYWJsZSBkZXZpY2UgaG90cGx1Z2dpbmcKKyAJICBzdXBwb3J0LiAgQXMgb2YgdGhpcyB3cml0aW5nIHRoZSBleGFjdCBoYXJkd2FyZSBpbnRlcmZhY2UgaXMKKyAJICBzdHJvbmdseSBpbiBmbHV4LCBzbyBubyBnb29kIHJlY29tbWVuZGF0aW9uIGNhbiBiZSBtYWRlLgorCiBzb3VyY2UgImFyY2gvbWlwcy9kZGI1eHh4L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2phenovS2NvbmZpZyIKQEAgLTg2NCw4ICs4OTAsMTEgQEAKIGNvbmZpZyBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCiAJYm9vbAogCitjb25maWcgR0VORVJJQ19JU0FfRE1BX1NVUFBPUlRfQlJPS0VOCisJYm9vbAorCiAjCi0jIEVuZGlhbmVzcyBzZWxlY3Rpb24uICBTdWZmaWVudGx5IG9ic2N1cmUgc28gbWFueSB1c2VycyBkb24ndCBrbm93IHdoYXQgdG8KKyMgRW5kaWFuZXNzIHNlbGVjdGlvbi4gIFN1ZmZpY2llbnRseSBvYnNjdXJlIHNvIG1hbnkgdXNlcnMgZG9uJ3Qga25vdyB3aGF0IHRvCiAjIGFuc3dlcixzbyB3ZSB0cnkgaGFyZCB0byBsaW1pdCB0aGUgYXZhaWxhYmxlIGNob2ljZXMuICBBbHNvIHRoZSB1c2Ugb2YgYQogIyBjaG9pY2Ugc3RhdGVtZW50IHNob3VsZCBiZSBtb3JlIG9idmlvdXMgdG8gdGhlIHVzZXIuCiAjCkBAIC04NzQsNyArOTAzLDcgQEAKIAloZWxwCiAJICBTb21lIE1JUFMgbWFjaGluZXMgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGVpdGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbgogCSAgYnl0ZSBvcmRlci4gVGhlc2UgbW9kZXMgcmVxdWlyZSBkaWZmZXJlbnQga2VybmVscyBhbmQgYSBkaWZmZXJlbnQKLQkgIExpbnV4IGRpc3RyaWJ1dGlvbi4gIEluIGdlbmVyYWwgdGhlcmUgaXMgb25lIHByZWZlcmVkIGJ5dGVvcmRlciBmb3IgYQorCSAgTGludXggZGlzdHJpYnV0aW9uLiAgSW4gZ2VuZXJhbCB0aGVyZSBpcyBvbmUgcHJlZmVycmVkIGJ5dGVvcmRlciBmb3IgYQogCSAgcGFydGljdWxhciBzeXN0ZW0gYnV0IHNvbWUgc3lzdGVtcyBhcmUganVzdCBhcyBjb21tb25seSB1c2VkIGluIHRoZQogCSAgb25lIG9yIHRoZSBvdGhlciBlbmRpYW5lc3MuCiAKQEAgLTEyNDgsNiArMTI3Nyw3IEBACiAJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfSElHSE1FTQorCXNlbGVjdCBXRUFLX09SREVSSU5HCiAKIGNvbmZpZyBDUFVfU0IxCiAJYm9vbCAiU0IxIgpAQCAtMTI1Niw2ICsxMjg2LDcgQEAKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJc2VsZWN0IENQVV9TVVBQT1JUU19ISUdITUVNCisJc2VsZWN0IFdFQUtfT1JERVJJTkcKIAogZW5kY2hvaWNlCiAKQEAgLTEzMTYsNiArMTM0Nyw4IEBACiBjb25maWcgU1lTX0hBU19DUFVfU0IxCiAJYm9vbAogCitjb25maWcgV0VBS19PUkRFUklORworCWJvb2wKIGVuZG1lbnUKIAogIwpAQCAtMTgzNSwxMyArMTg2OCwxMSBAQAogY29uZmlnIElTQQogCWJvb2wKIAotY29uZmlnIE5PX0lTQQotCWJvb2wKLQogY29uZmlnIEVJU0EKIAlib29sICJFSVNBIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIV19IQVNfRUlTQQogCXNlbGVjdCBJU0EKKwlzZWxlY3QgR0VORVJJQ19JU0FfRE1BCiAJLS0taGVscC0tLQogCSAgVGhlIEV4dGVuZGVkIEluZHVzdHJ5IFN0YW5kYXJkIEFyY2hpdGVjdHVyZSAoRUlTQSkgYnVzIHdhcwogCSAgZGV2ZWxvcGVkIGFzIGFuIG9wZW4gYWx0ZXJuYXRpdmUgdG8gdGhlIElCTSBNaWNyb0NoYW5uZWwgYnVzLgpAQCAtMTkyMiw2ICsxOTUzLDExIEBACiAJZGVwZW5kcyBvbiBNSVBTMzJfQ09NUEFUCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBTWVNWSVBDX0NPTVBBVAorCWJvb2wKKwlkZXBlbmRzIG9uIENPTVBBVCAmJiBTWVNWSVBDCisJZGVmYXVsdCB5CisKIGNvbmZpZyBNSVBTMzJfTzMyCiAJYm9vbCAiS2VybmVsIHN1cHBvcnQgZm9yIG8zMiBiaW5hcmllcyIKIAlkZXBlbmRzIG9uIE1JUFMzMl9DT01QQVQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCBkNTgwZDQ2Li42NDFhYTMwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC02Myw5ICs2Myw3IEBACiBpZmRlZiBDT05GSUdfQlVJTERfRUxGNjQKIGNmbGFncy15CQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tZXhwbGljaXQtcmVsb2NzKQogZWxzZQotIyAtbXN5bTMyIGNhbiBub3QgYmUgdXNlZCBmb3IgbW9kdWxlcyBzaW5jZSB0aGV5IGFyZSBsb2FkZWQgaW50byBYS1NFRwotQ0ZMQUdTX01PRFVMRQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLWV4cGxpY2l0LXJlbG9jcykKLUNGTEFHU19LRVJORUwJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1zeW0zMikKK2NmbGFncy15CQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tc3ltMzIpCiBlbmRpZgogZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9pcnEuYwppbmRleCAyYWJlMTMyLi45Y2Y3YjY3MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vaXJxLmMKQEAgLTcwLDcgKzcwLDYgQEAKIGV4dGVybiB2b2lkIG1pcHNfdGltZXJfaW50ZXJydXB0KHZvaWQpOwogCiBzdGF0aWMgdm9pZCBzZXR1cF9sb2NhbF9pcnEodW5zaWduZWQgaW50IGlycSwgaW50IHR5cGUsIGludCBpbnRfcmVxKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBlbmRfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpOwogc3RhdGljIGlubGluZSB2b2lkIG1hc2tfYW5kX2Fja19sZXZlbF9pcnEodW5zaWduZWQgaW50IGlycV9ucik7CiBzdGF0aWMgaW5saW5lIHZvaWQgbWFza19hbmRfYWNrX3Jpc2VfZWRnZV9pcnEodW5zaWduZWQgaW50IGlycV9ucik7CkBAIC04NCwyMCArODMsNiBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhpcnFfbG9jayk7CiAKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCWxvY2FsX2VuYWJsZV9pcnEoaXJxX25yKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQlsb2NhbF9kaXNhYmxlX2lycShpcnFfbnIpOwotCXJldHVybjsKLX0KLQotCiBpbmxpbmUgdm9pZCBsb2NhbF9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7CiAJaWYgKGlycV9uciA+IEFVMTAwMF9MQVNUX0lOVEMwX0lOVCkgewpAQCAtMjQ5LDQxICsyMzQsMzcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCByaXNlX2VkZ2VfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkF1MTAwMCBSaXNlIEVkZ2UiLAotCS5zdGFydHVwID0gc3RhcnR1cF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faXJxLAotCS5lbmFibGUgPSBsb2NhbF9lbmFibGVfaXJxLAotCS5kaXNhYmxlID0gbG9jYWxfZGlzYWJsZV9pcnEsCiAJLmFjayA9IG1hc2tfYW5kX2Fja19yaXNlX2VkZ2VfaXJxLAorCS5tYXNrID0gbG9jYWxfZGlzYWJsZV9pcnEsCisJLm1hc2tfYWNrID0gbWFza19hbmRfYWNrX3Jpc2VfZWRnZV9pcnEsCisJLnVubWFzayA9IGxvY2FsX2VuYWJsZV9pcnEsCiAJLmVuZCA9IGVuZF9pcnEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGZhbGxfZWRnZV9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiQXUxMDAwIEZhbGwgRWRnZSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pcnEsCi0JLmVuYWJsZSA9IGxvY2FsX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUgPSBsb2NhbF9kaXNhYmxlX2lycSwKIAkuYWNrID0gbWFza19hbmRfYWNrX2ZhbGxfZWRnZV9pcnEsCisJLm1hc2sgPSBsb2NhbF9kaXNhYmxlX2lycSwKKwkubWFza19hY2sgPSBtYXNrX2FuZF9hY2tfZmFsbF9lZGdlX2lycSwKKwkudW5tYXNrID0gbG9jYWxfZW5hYmxlX2lycSwKIAkuZW5kID0gZW5kX2lycSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZWl0aGVyX2VkZ2VfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkF1MTAwMCBSaXNlIG9yIEZhbGwgRWRnZSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pcnEsCi0JLmVuYWJsZSA9IGxvY2FsX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUgPSBsb2NhbF9kaXNhYmxlX2lycSwKIAkuYWNrID0gbWFza19hbmRfYWNrX2VpdGhlcl9lZGdlX2lycSwKKwkubWFzayA9IGxvY2FsX2Rpc2FibGVfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfYW5kX2Fja19laXRoZXJfZWRnZV9pcnEsCisJLnVubWFzayA9IGxvY2FsX2VuYWJsZV9pcnEsCiAJLmVuZCA9IGVuZF9pcnEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGxldmVsX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJBdTEwMDAgTGV2ZWwiLAotCS5zdGFydHVwID0gc3RhcnR1cF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faXJxLAotCS5lbmFibGUgPSBsb2NhbF9lbmFibGVfaXJxLAotCS5kaXNhYmxlID0gbG9jYWxfZGlzYWJsZV9pcnEsCiAJLmFjayA9IG1hc2tfYW5kX2Fja19sZXZlbF9pcnEsCisJLm1hc2sgPSBsb2NhbF9kaXNhYmxlX2lycSwKKwkubWFza19hY2sgPSBtYXNrX2FuZF9hY2tfbGV2ZWxfaXJxLAorCS51bm1hc2sgPSBsb2NhbF9lbmFibGVfaXJxLAogCS5lbmQgPSBlbmRfaXJxLAogfTsKIApAQCAtMzI4LDMxICszMDksMzEgQEAKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcyQ0xSKTsKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcxQ0xSKTsKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcwU0VUKTsKLQkJCQlpcnFfZGVzY1tpcnFfbnJdLmNoaXAgPSAmcmlzZV9lZGdlX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZyaXNlX2VkZ2VfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9GQUxMX0VER0U6IC8qIDA6MTowICovCiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMkNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMVNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMENMUik7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmZhbGxfZWRnZV9pcnFfdHlwZTsKKwkJCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmZmFsbF9lZGdlX2lycV90eXBlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSU5UQ19JTlRfUklTRV9BTkRfRkFMTF9FREdFOiAvKiAwOjE6MSAqLwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzJDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzFTRVQpOwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzBTRVQpOwotCQkJCWlycV9kZXNjW2lycV9ucl0uY2hpcCA9ICZlaXRoZXJfZWRnZV9pcnFfdHlwZTsKKwkJCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmZWl0aGVyX2VkZ2VfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9ISUdIX0xFVkVMOiAvKiAxOjA6MSAqLwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzJTRVQpOwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzFDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzBTRVQpOwotCQkJCWlycV9kZXNjW2lycV9ucl0uY2hpcCA9ICZsZXZlbF9pcnFfdHlwZTsKKwkJCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmbGV2ZWxfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9MT1dfTEVWRUw6IC8qIDE6MTowICovCiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMlNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMVNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMENMUik7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmxldmVsX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZsZXZlbF9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0RJU0FCTEVEOiAvKiAwOjA6MCAqLwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzBDTFIpOwpAQCAtMzgwLDMxICszNjEsMzEgQEAKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMkNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzFDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcwU0VUKTsKLQkJCQlpcnFfZGVzY1tpcnFfbnJdLmNoaXAgPSAmcmlzZV9lZGdlX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZyaXNlX2VkZ2VfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9GQUxMX0VER0U6IC8qIDA6MTowICovCiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzJDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcxU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMENMUik7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmZhbGxfZWRnZV9pcnFfdHlwZTsKKwkJCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmZmFsbF9lZGdlX2lycV90eXBlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSU5UQ19JTlRfUklTRV9BTkRfRkFMTF9FREdFOiAvKiAwOjE6MSAqLwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcyQ0xSKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMVNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzBTRVQpOwotCQkJCWlycV9kZXNjW2lycV9ucl0uY2hpcCA9ICZlaXRoZXJfZWRnZV9pcnFfdHlwZTsKKwkJCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmZWl0aGVyX2VkZ2VfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9ISUdIX0xFVkVMOiAvKiAxOjA6MSAqLwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcyU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMUNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzBTRVQpOwotCQkJCWlycV9kZXNjW2lycV9ucl0uY2hpcCA9ICZsZXZlbF9pcnFfdHlwZTsKKwkJCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmbGV2ZWxfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9MT1dfTEVWRUw6IC8qIDE6MTowICovCiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzJTRVQpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcxU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMENMUik7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmxldmVsX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZsZXZlbF9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0RJU0FCTEVEOiAvKiAwOjA6MCAqLwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcwQ0xSKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYXUxMDAwL3BiMTIwMC9ib2FyZF9zZXR1cC5jCmluZGV4IDhiOTUzYjkuLjA0MzMwMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9wYjEyMDAvYm9hcmRfc2V0dXAuYwpAQCAtNTUsNyArNTUsNyBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIF9ib2FyZF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkCSgqYm9hcmRfaW5pdF9pcnEpKHZvaWQpOworZXh0ZXJuIHZvaWQgKCpib2FyZF9pbml0X2lycSkodm9pZCk7CiAKIHZvaWQgYm9hcmRfcmVzZXQgKHZvaWQpCiB7CkBAIC0xNTEsMTEgKzE1MSw3IEBACiAjZW5kaWYKIAogCS8qIFNldHVwIFBiMTIwMCBFeHRlcm5hbCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLwotCXsKLQkJZXh0ZXJuIHZvaWQgKCpib2FyZF9pbml0X2lycSkodm9pZCk7Ci0JCWV4dGVybiB2b2lkIF9ib2FyZF9pbml0X2lycSh2b2lkKTsKLQkJYm9hcmRfaW5pdF9pcnEgPSBfYm9hcmRfaW5pdF9pcnE7Ci0JfQorCWJvYXJkX2luaXRfaXJxID0gX2JvYXJkX2luaXRfaXJxOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMgYi9hcmNoL21pcHMvY29iYWx0L2lycS5jCmluZGV4IDgyZTU2OWQuLjRjNDZmMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9pcnEuYwpAQCAtNDUsMjUgKzQ1LDIyIEBACiB7CiAJdW5zaWduZWQgaW50IG1hc2ssIHBlbmRpbmcsIGRldmZuOwogCi0JbWFzayA9IEdBTElMRU9fSU5MKEdUX0lOVFJNQVNLX09GUyk7Ci0JcGVuZGluZyA9IEdBTElMRU9fSU5MKEdUX0lOVFJDQVVTRV9PRlMpICYgbWFzazsKKwltYXNrID0gR1RfUkVBRChHVF9JTlRSTUFTS19PRlMpOworCXBlbmRpbmcgPSBHVF9SRUFEKEdUX0lOVFJDQVVTRV9PRlMpICYgbWFzazsKIAotCWlmIChwZW5kaW5nICYgR0FMSUxFT19JTlRSX1QwRVhQKSB7Ci0KLQkJR0FMSUxFT19PVVRMKH5HQUxJTEVPX0lOVFJfVDBFWFAsIEdUX0lOVFJDQVVTRV9PRlMpOworCWlmIChwZW5kaW5nICYgR1RfSU5UUl9UMEVYUF9NU0spIHsKKwkJR1RfV1JJVEUoR1RfSU5UUkNBVVNFX09GUywgfkdUX0lOVFJfVDBFWFBfTVNLKTsKIAkJZG9fSVJRKENPQkFMVF9HQUxJTEVPX0lSUSk7Ci0KLQl9IGVsc2UgaWYgKHBlbmRpbmcgJiBHQUxJTEVPX0lOVFJfUkVUUllfQ1RSKSB7Ci0KLQkJZGV2Zm4gPSBHQUxJTEVPX0lOTChHVF9QQ0kwX0NGR0FERFJfT0ZTKSA+PiA4OwotCQlHQUxJTEVPX09VVEwofkdBTElMRU9fSU5UUl9SRVRSWV9DVFIsIEdUX0lOVFJDQVVTRV9PRlMpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJHYWxpbGVvOiBQQ0kgcmV0cnkgY291bnQgZXhjZWVkZWQgKCUwMnguJXUpXG4iLAotCQkJUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOwotCisJfSBlbHNlIGlmIChwZW5kaW5nICYgR1RfSU5UUl9SRVRSWUNUUjBfTVNLKSB7CisJCWRldmZuID0gR1RfUkVBRChHVF9QQ0kwX0NGR0FERFJfT0ZTKSA+PiA4OworCQlHVF9XUklURShHVF9JTlRSQ0FVU0VfT0ZTLCB+R1RfSU5UUl9SRVRSWUNUUjBfTVNLKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkdhbGlsZW86IFBDSSByZXRyeSBjb3VudCBleGNlZWRlZCAoJTAyeC4ldSlcbiIsCisJCSAgICAgICBQQ0lfU0xPVChkZXZmbiksIFBDSV9GVU5DKGRldmZuKSk7CiAJfSBlbHNlIHsKLQotCQlHQUxJTEVPX09VVEwobWFzayAmIH5wZW5kaW5nLCBHVF9JTlRSTUFTS19PRlMpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJHYWxpbGVvOiBtYXNraW5nIHVuZXhwZWN0ZWQgaW50ZXJydXB0ICUwOHhcbiIsIHBlbmRpbmcpOworCQlHVF9XUklURShHVF9JTlRSTUFTS19PRlMsIG1hc2sgJiB+cGVuZGluZyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHYWxpbGVvOiBtYXNraW5nIHVuZXhwZWN0ZWQgaW50ZXJydXB0ICUwOHhcbiIsIHBlbmRpbmcpOwogCX0KIH0KIApAQCAtMTA0LDcgKzEwMSw3IEBACiAJICogTWFzayBhbGwgR2FsaWxlbyBpbnRlcnJ1cHRzLiBUaGUgR2FsaWxlbwogCSAqIGhhbmRsZXIgaXMgc2V0IGluIGNvYmFsdF90aW1lcl9zZXR1cCgpCiAJICovCi0JR0FMSUxFT19PVVRMKDAsIEdUX0lOVFJNQVNLX09GUyk7CisJR1RfV1JJVEUoR1RfSU5UUk1BU0tfT0ZTLCAwKTsKIAogCWluaXRfaTgyNTlfaXJxcygpOwkJCQkvKiAgMCAuLi4gMTUgKi8KIAltaXBzX2NwdV9pcnFfaW5pdChDT0JBTFRfQ1BVX0lSUSk7CQkvKiAxNiAuLi4gMjMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYyBiL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYwppbmRleCBiZjlkYzcyLi5lOGYwZjIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9zZXR1cC5jCkBAIC01MSwyMyArNTEsMjMgQEAKIHZvaWQgX19pbml0IHBsYXRfdGltZXJfc2V0dXAoc3RydWN0IGlycWFjdGlvbiAqaXJxKQogewogCS8qIExvYWQgdGltZXIgdmFsdWUgZm9yIEhaIChUQ0xLIGlzIDUwTUh6KSAqLwotCUdBTElMRU9fT1VUTCg1MCoxMDAwKjEwMDAgLyBIWiwgR1RfVEMwX09GUyk7CisJR1RfV1JJVEUoR1RfVEMwX09GUywgNTAqMTAwMCoxMDAwIC8gSFopOwogCiAJLyogRW5hYmxlIHRpbWVyICovCi0JR0FMSUxFT19PVVRMKEdBTElMRU9fRU5UQzAgfCBHQUxJTEVPX1NFTFRDMCwgR1RfVENfQ09OVFJPTF9PRlMpOworCUdUX1dSSVRFKEdUX1RDX0NPTlRST0xfT0ZTLCBHVF9UQ19DT05UUk9MX0VOVEMwX01TSyB8IEdUX1RDX0NPTlRST0xfU0VMVEMwX01TSyk7CiAKIAkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgKi8KIAlzZXR1cF9pcnEoQ09CQUxUX0dBTElMRU9fSVJRLCBpcnEpOwogCiAJLyogRW5hYmxlIGludGVycnVwdCAqLwotCUdBTElMRU9fT1VUTChHQUxJTEVPX0lOVFJfVDBFWFAgfCBHQUxJTEVPX0lOTChHVF9JTlRSTUFTS19PRlMpLCBHVF9JTlRSTUFTS19PRlMpOworCUdUX1dSSVRFKEdUX0lOVFJNQVNLX09GUywgR1RfSU5UUl9UMEVYUF9NU0sgfCBHVF9SRUFEKEdUX0lOVFJNQVNLX09GUykpOwogfQogCiBleHRlcm4gc3RydWN0IHBjaV9vcHMgZ3Q2NDExMV9wY2lfb3BzOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvYmFsdF9tZW1fcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gR1Q2NDExMV9NRU1fQkFTRSwKLQkuZW5kCT0gR1Q2NDExMV9NRU1fRU5ELAorCS5zdGFydAk9IEdUX0RFRl9QQ0kwX01FTTBfQkFTRSwKKwkuZW5kCT0gR1RfREVGX1BDSTBfTUVNMF9CQVNFICsgR1RfREVGX1BDSTBfTUVNMF9TSVpFIC0gMSwKIAkubmFtZQk9ICJQQ0kgbWVtb3J5IiwKIAkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQogfTsKQEAgLTExNSw3ICsxMTUsNyBAQAogCS5tZW1fcmVzb3VyY2UJPSAmY29iYWx0X21lbV9yZXNvdXJjZSwKIAkubWVtX29mZnNldAk9IDAsCiAJLmlvX3Jlc291cmNlCT0gJmNvYmFsdF9pb19yZXNvdXJjZSwKLQkuaW9fb2Zmc2V0CT0gMCAtIEdUNjQxMTFfSU9fQkFTRQorCS5pb19vZmZzZXQJPSAwIC0gR1RfREVGX1BDSTBfSU9fQkFTRSwKIH07CiAKIHZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlfbWFjaGluZV9oYWx0ID0gY29iYWx0X21hY2hpbmVfaGFsdDsKIAlwbV9wb3dlcl9vZmYgPSBjb2JhbHRfbWFjaGluZV9wb3dlcl9vZmY7CiAKLSAgICAgICAgc2V0X2lvX3BvcnRfYmFzZShDS1NFRzFBRERSKEdUNjQxMTFfSU9fQkFTRSkpOworCXNldF9pb19wb3J0X2Jhc2UoQ0tTRUcxQUREUihHVF9ERUZfUENJMF9JT19CQVNFKSk7CiAKIAkvKiBJL08gcG9ydCByZXNvdXJjZSBtdXN0IGluY2x1ZGUgVUFSVCBhbmQgTENEL2J1dHRvbnMgKi8KIAlpb3BvcnRfcmVzb3VyY2UuZW5kID0gMHgwZmZmZmZmZjsKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAgICAgICAgIC8qIFJlYWQgdGhlIGNvYmFsdCBpZCByZWdpc3RlciBvdXQgb2YgdGhlIFBDSSBjb25maWcgc3BhY2UgKi8KICAgICAgICAgUENJX0NGR19TRVQoZGV2Zm4sIChWSUFfQ09CQUxUX0JSRF9JRF9SRUcgJiB+MHgzKSk7Ci0gICAgICAgIGNvYmFsdF9ib2FyZF9pZCA9IEdBTElMRU9fSU5MKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworICAgICAgICBjb2JhbHRfYm9hcmRfaWQgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwogICAgICAgICBjb2JhbHRfYm9hcmRfaWQgPj49ICgoVklBX0NPQkFMVF9CUkRfSURfUkVHICYgMykgKiA4KTsKICAgICAgICAgY29iYWx0X2JvYXJkX2lkID0gVklBX0NPQkFMVF9CUkRfUkVHX3RvX0lEKGNvYmFsdF9ib2FyZF9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvaXJxXzU0NzcuYyBiL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvaXJxXzU0NzcuYwppbmRleCBiYTUyNzA1YTIuLjk2MjQ5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvaXJxXzU0NzcuYworKysgYi9hcmNoL21pcHMvZGRiNXh4eC9kZGI1NDc3L2lycV81NDc3LmMKQEAgLTUzLDE0ICs1Myw2IEBACiAJbGxfdnJjNTQ3N19pcnFfZGlzYWJsZShpcnEgLSB2cmM1NDc3X2lycV9iYXNlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB2cmM1NDc3X2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdnJjNTQ3N19pcnFfZW5hYmxlKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUJdnJjNTQ3N19pcnFfc2h1dGRvd24JdnJjNTQ3N19pcnFfZGlzYWJsZQotCiBzdGF0aWMgdm9pZAogdnJjNTQ3N19pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCiB7CkBAIC05MSwxMSArODMsMTAgQEAKIAogc3RydWN0IGlycV9jaGlwIHZyYzU0NzdfaXJxX2NvbnRyb2xsZXIgPSB7CiAJLnR5cGVuYW1lID0gInZyYzU0NzdfaXJxIiwKLQkuc3RhcnR1cCA9IHZyYzU0NzdfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gdnJjNTQ3N19pcnFfc2h1dGRvd24sCi0JLmVuYWJsZSA9IHZyYzU0NzdfaXJxX2VuYWJsZSwKLQkuZGlzYWJsZSA9IHZyYzU0NzdfaXJxX2Rpc2FibGUsCiAJLmFjayA9IHZyYzU0NzdfaXJxX2FjaywKKwkubWFzayA9IHZyYzU0NzdfaXJxX2Rpc2FibGUsCisJLm1hc2tfYWNrID0gdnJjNTQ3N19pcnFfYWNrLAorCS51bm1hc2sgPSB2cmM1NDc3X2lycV9lbmFibGUsCiAJLmVuZCA9IHZyYzU0NzdfaXJxX2VuZAogfTsKIApAQCAtMTAzLDEyICs5NCw4IEBACiB7CiAJdTMyIGk7CiAKLQlmb3IgKGk9IGlycV9iYXNlOyBpPCBpcnFfYmFzZSsgTlVNXzU0NzdfSVJROyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmdnJjNTQ3N19pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpPSBpcnFfYmFzZTsgaTwgaXJxX2Jhc2UrIE5VTV81NDc3X0lSUTsgaSsrKQorCQlzZXRfaXJxX2NoaXAoaSwgJnZyYzU0NzdfaXJxX2NvbnRyb2xsZXIpOwogCiAJdnJjNTQ3N19pcnFfYmFzZSA9IGlycV9iYXNlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9lY2MtYmVyci5jIGIvYXJjaC9taXBzL2RlYy9lY2MtYmVyci5jCmluZGV4IDNlMzc0ZDAuLmM4NDMwYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvZWNjLWJlcnIuYworKysgYi9hcmNoL21pcHMvZGVjL2VjYy1iZXJyLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KQEAgLTIzMSwxMyArMjMwLDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGVjX2tuMDJfYmVfaW5pdCh2b2lkKQogewogCXZvbGF0aWxlIHUzMiAqY3NyID0gKHZvaWQgKilDS1NFRzFBRERSKEtOMDJfU0xPVF9CQVNFICsgS04wMl9DU1IpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlrbjB4X2VycmFkZHIgPSAodm9pZCAqKUNLU0VHMUFERFIoS04wMl9TTE9UX0JBU0UgKyBLTjAyX0VSUkFERFIpOwogCWtuMHhfY2hrc3luID0gKHZvaWQgKilDS1NFRzFBRERSKEtOMDJfU0xPVF9CQVNFICsgS04wMl9DSEtTWU4pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtuMDJfbG9jaywgZmxhZ3MpOwotCiAJLyogUHJlc2V0IHdyaXRlLW9ubHkgYml0cyBvZiB0aGUgQ29udHJvbCBSZWdpc3RlciBjYWNoZS4gKi8KIAljYWNoZWRfa24wMl9jc3IgPSAqY3NyIHwgS04wMl9DU1JfTEVEUzsKIApAQCAtMjQ3LDggKzI0Myw2IEBACiAJY2FjaGVkX2tuMDJfY3NyIHw9IEtOMDJfQ1NSX0NPUlJFQ1Q7CiAJKmNzciA9IGNhY2hlZF9rbjAyX2NzcjsKIAlpb2IoKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtuMDJfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGVjX2tuMDNfYmVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TIGIvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCmluZGV4IDMxZGQ0N2QuLmIyNTFlZjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUworKysgYi9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQlMT05HX0wJczAsIFRJX1JFR1MoJDI4KQogCQlMT05HX1MJc3AsIFRJX1JFR1MoJDI4KQogCQlQVFJfTEEJcmEsIHJldF9mcm9tX2lycQotCQlqCWRvX0lSUQorCQlqCWRlY19pcnFfZGlzcGF0Y2gKIAkJIG5vcAogCiAjaWZkZWYgQ09ORklHXzMyQklUCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVjL2lvYXNpYy1pcnEuYyBiL2FyY2gvbWlwcy9kZWMvaW9hc2ljLWlycS5jCmluZGV4IDQxY2QyYTkuLjI2OWIyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvaW9hc2ljLWlycS5jCisrKyBiL2FyY2gvbWlwcy9kZWMvaW9hc2ljLWlycS5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2RlYy9pb2FzaWMuaD4KQEAgLTIxLDggKzIwLDYgQEAKICNpbmNsdWRlIDxhc20vZGVjL2lvYXNpY19pbnRzLmg+CiAKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhpb2FzaWNfbG9jayk7Ci0KIHN0YXRpYyBpbnQgaW9hc2ljX2lycV9iYXNlOwogCiAKQEAgLTUyLDY1ICs0OSwzMSBAQAogCWlvYXNpY193cml0ZShJT19SRUdfU0lSLCBzaXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2lvYXNpY19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXNpY19sb2NrLCBmbGFncyk7Ci0JdW5tYXNrX2lvYXNpY19pcnEoaXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FzaWNfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9pb2FzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FzaWNfbG9jaywgZmxhZ3MpOwotCW1hc2tfaW9hc2ljX2lycShpcnEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXNpY19sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc3RhcnR1cF9pb2FzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2lvYXNpY19pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBzaHV0ZG93bl9pb2FzaWNfaXJxIGRpc2FibGVfaW9hc2ljX2lycQotCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNrX2lvYXNpY19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzcGluX2xvY2soJmlvYXNpY19sb2NrKTsKIAltYXNrX2lvYXNpY19pcnEoaXJxKTsKLQlzcGluX3VubG9jaygmaW9hc2ljX2xvY2spOwogCWZhc3RfaW9iKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmRfaW9hc2ljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9pb2FzaWNfaXJxKGlycSk7CisJCXVubWFza19pb2FzaWNfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW9hc2ljX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJJTy1BU0lDIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaW9hc2ljX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pb2FzaWNfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaW9hc2ljX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfaW9hc2ljX2lycSwKIAkuYWNrID0gYWNrX2lvYXNpY19pcnEsCisJLm1hc2sgPSBtYXNrX2lvYXNpY19pcnEsCisJLm1hc2tfYWNrID0gYWNrX2lvYXNpY19pcnEsCisJLnVubWFzayA9IHVubWFza19pb2FzaWNfaXJxLAogCS5lbmQgPSBlbmRfaW9hc2ljX2lycSwKIH07CiAKIAotI2RlZmluZSBzdGFydHVwX2lvYXNpY19kbWFfaXJxIHN0YXJ0dXBfaW9hc2ljX2lycQorI2RlZmluZSB1bm1hc2tfaW9hc2ljX2RtYV9pcnEgdW5tYXNrX2lvYXNpY19pcnEKIAotI2RlZmluZSBzaHV0ZG93bl9pb2FzaWNfZG1hX2lycSBzaHV0ZG93bl9pb2FzaWNfaXJxCi0KLSNkZWZpbmUgZW5hYmxlX2lvYXNpY19kbWFfaXJxIGVuYWJsZV9pb2FzaWNfaXJxCi0KLSNkZWZpbmUgZGlzYWJsZV9pb2FzaWNfZG1hX2lycSBkaXNhYmxlX2lvYXNpY19pcnEKKyNkZWZpbmUgbWFza19pb2FzaWNfZG1hX2lycSBtYXNrX2lvYXNpY19pcnEKIAogI2RlZmluZSBhY2tfaW9hc2ljX2RtYV9pcnEgYWNrX2lvYXNpY19pcnEKIApAQCAtMTIzLDExICs4NiwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlvYXNpY19kbWFfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIklPLUFTSUMtRE1BIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaW9hc2ljX2RtYV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faW9hc2ljX2RtYV9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9pb2FzaWNfZG1hX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfaW9hc2ljX2RtYV9pcnEsCiAJLmFjayA9IGFja19pb2FzaWNfZG1hX2lycSwKKwkubWFzayA9IG1hc2tfaW9hc2ljX2RtYV9pcnEsCisJLm1hc2tfYWNrID0gYWNrX2lvYXNpY19kbWFfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfaW9hc2ljX2RtYV9pcnEsCiAJLmVuZCA9IGVuZF9pb2FzaWNfZG1hX2lycSwKIH07CiAKQEAgLTE0MCwxOCArMTAyLDEyIEBACiAJaW9hc2ljX3dyaXRlKElPX1JFR19TSU1SLCAwKTsKIAlmYXN0X2lvYigpOwogCi0JZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyBJT19JTlJfRE1BOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmaW9hc2ljX2lycV90eXBlOwotCX0KLQlmb3IgKDsgaSA8IGJhc2UgKyBJT19JUlFfTElORVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZpb2FzaWNfZG1hX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIElPX0lOUl9ETUE7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZpb2FzaWNfaXJxX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlmb3IgKDsgaSA8IGJhc2UgKyBJT19JUlFfTElORVM7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZpb2FzaWNfZG1hX2lycV90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlpb2FzaWNfaXJxX2Jhc2UgPSBiYXNlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9rbjAyLWlycS5jIGIvYXJjaC9taXBzL2RlYy9rbjAyLWlycS5jCmluZGV4IDA0YTM2N2EuLjVhOWJlNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMva24wMi1pcnEuYworKysgYi9hcmNoL21pcHMvZGVjL2tuMDItaXJxLmMKQEAgLTE0LDcgKzE0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vZGVjL2tuMDIuaD4KQEAgLTI5LDcgKzI4LDYgQEAKICAqIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUgLS0gaXQgaGFzIHRvIGJlIGluaXRpYWxpemVkLgogICovCiB1MzIgY2FjaGVkX2tuMDJfY3NyOwotREVGSU5FX1NQSU5MT0NLKGtuMDJfbG9jayk7CiAKIAogc3RhdGljIGludCBrbjAyX2lycV9iYXNlOwpAQCAtNTMsNTQgKzUxLDI0IEBACiAJKmNzciA9IGNhY2hlZF9rbjAyX2NzcjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9rbjAyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgma24wMl9sb2NrLCBmbGFncyk7Ci0JdW5tYXNrX2tuMDJfaXJxKGlycSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma24wMl9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2tuMDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZrbjAyX2xvY2ssIGZsYWdzKTsKLQltYXNrX2tuMDJfaXJxKGlycSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma24wMl9sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2tuMDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2tuMDJfaXJxKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgc2h1dGRvd25fa24wMl9pcnEgZGlzYWJsZV9rbjAyX2lycQotCiBzdGF0aWMgdm9pZCBhY2tfa24wMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzcGluX2xvY2soJmtuMDJfbG9jayk7CiAJbWFza19rbjAyX2lycShpcnEpOwotCXNwaW5fdW5sb2NrKCZrbjAyX2xvY2spOwogCWlvYigpOwogfQogCiBzdGF0aWMgdm9pZCBlbmRfa24wMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQotCQllbmFibGVfa24wMl9pcnEoaXJxKTsKKwkJdW5tYXNrX2tuMDJfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAga24wMl9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiS04wMi1DU1IiLAotCS5zdGFydHVwID0gc3RhcnR1cF9rbjAyX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9rbjAyX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2tuMDJfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9rbjAyX2lycSwKIAkuYWNrID0gYWNrX2tuMDJfaXJxLAorCS5tYXNrID0gbWFza19rbjAyX2lycSwKKwkubWFza19hY2sgPSBhY2tfa24wMl9pcnEsCisJLnVubWFzayA9IHVubWFza19rbjAyX2lycSwKIAkuZW5kID0gZW5kX2tuMDJfaXJxLAogfTsKIApAQCAtMTA5LDIyICs3NywxNSBAQAogewogCXZvbGF0aWxlIHUzMiAqY3NyID0gKHZvbGF0aWxlIHUzMiAqKUNLU0VHMUFERFIoS04wMl9TTE9UX0JBU0UgKwogCQkJCQkJICAgICAgIEtOMDJfQ1NSKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCiAJLyogTWFzayBpbnRlcnJ1cHRzLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZrbjAyX2xvY2ssIGZsYWdzKTsKIAljYWNoZWRfa24wMl9jc3IgJj0gfktOMDJfQ1NSX0lPSU5URU47CiAJKmNzciA9IGNhY2hlZF9rbjAyX2NzcjsKIAlpb2IoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbjAyX2xvY2ssIGZsYWdzKTsKIAotCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgS04wMl9JUlFfTElORVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZrbjAyX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIEtOMDJfSVJRX0xJTkVTOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAma24wMl9pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlrbjAyX2lycV9iYXNlID0gYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvc2V0dXAuYyBiL2FyY2gvbWlwcy9kZWMvc2V0dXAuYwppbmRleCA2Yjc0ODFlLi5kMzQwMzJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2RlYy9zZXR1cC5jCkBAIC03NjEsMyArNzYxLDkgQEAKIAlpZiAoZGVjX2ludGVycnVwdFtERUNfSVJRX0hBTFRdID49IDApCiAJCXNldHVwX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfSEFMVF0sICZoYWx0aXJxKTsKIH0KKworYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgZGVjX2lycV9kaXNwYXRjaCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRvX0lSUShpcnEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy90aW1lLmMgYi9hcmNoL21pcHMvZGVjL3RpbWUuYwppbmRleCA2OWU0MjRlLi44YjdlMGMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3RpbWUuYworKysgYi9hcmNoL21pcHMvZGVjL3RpbWUuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJQ01PU19SRUFEKFJUQ19SRUdfQyk7CQkJLyogQWNrIHRoZSBSVEMgaW50ZXJydXB0LiAgKi8KIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBkZWNfaW9hc2ljX2hwdF9yZWFkKHZvaWQpCitzdGF0aWMgY3ljbGVfdCBkZWNfaW9hc2ljX2hwdF9yZWFkKHZvaWQpCiB7CiAJLyoKIAkgKiBUaGUgZnJlZS1ydW5uaW5nIGNvdW50ZXIgaXMgMzItYml0IHdoaWNoIGlzIGdvb2QgZm9yIGFib3V0CkBAIC0xNzEsNyArMTcxLDcgQEAKIAogCWlmICghY3B1X2hhc19jb3VudGVyICYmIElPQVNJQykKIAkJLyogRm9yIHByZS1SNGsgc3lzdGVtcyB3ZSB1c2UgdGhlIEkvTyBBU0lDJ3MgY291bnRlci4gICovCi0JCW1pcHNfaHB0X3JlYWQgPSBkZWNfaW9hc2ljX2hwdF9yZWFkOworCQljbG9ja3NvdXJjZV9taXBzLnJlYWQgPSBkZWNfaW9hc2ljX2hwdF9yZWFkOwogCiAJLyogU2V0IHVwIHRoZSByYXRlIG9mIHBlcmlvZGljIERTMTI4NyBpbnRlcnJ1cHRzLiAgKi8KIAlDTU9TX1dSSVRFKFJUQ19SRUZfQ0xDS18zMktIWiB8ICgxNiAtIF9fZmZzKEhaKSksIFJUQ19SRUdfQSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZW1tYTJyaC9jb21tb24vaXJxX2VtbWEycmguYyBiL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9pcnFfZW1tYTJyaC5jCmluZGV4IDE5N2VkNGMuLjU5Yjk4MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9pcnFfZW1tYTJyaC5jCisrKyBiL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9pcnFfZW1tYTJyaC5jCkBAIC01NiwyMiArNTYsNiBAQAogCWxsX2VtbWEycmhfaXJxX2Rpc2FibGUoaXJxIC0gZW1tYTJyaF9pcnFfYmFzZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW1tYTJyaF9pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVtbWEycmhfaXJxX2VuYWJsZShpcnEpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lCWVtbWEycmhfaXJxX3NodXRkb3duCWVtbWEycmhfaXJxX2Rpc2FibGUKLQotc3RhdGljIHZvaWQgZW1tYTJyaF9pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JLyogZGlzYWJsZSBpbnRlcnJ1cHQgLSBzb21lIGhhbmRsZXIgd2lsbCByZS1lbmFibGUgdGhlIGlycQotCSAqIGFuZCBpZiB0aGUgaW50ZXJydXB0IGlzIGxldmVsZWQsIHdlIHdpbGwgaGF2ZSBpbmZpbml0ZSBsb29wCi0JICovCi0JbGxfZW1tYTJyaF9pcnFfZGlzYWJsZShpcnEgLSBlbW1hMnJoX2lycV9iYXNlKTsKLX0KLQogc3RhdGljIHZvaWQgZW1tYTJyaF9pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKQEAgLTgwLDI1ICs2NCwyMCBAQAogCiBzdHJ1Y3QgaXJxX2NoaXAgZW1tYTJyaF9pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAiZW1tYTJyaF9pcnEiLAotCS5zdGFydHVwID0gZW1tYTJyaF9pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBlbW1hMnJoX2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gZW1tYTJyaF9pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gZW1tYTJyaF9pcnFfZGlzYWJsZSwKLQkuYWNrID0gZW1tYTJyaF9pcnFfYWNrLAorCS5hY2sgPSBlbW1hMnJoX2lycV9kaXNhYmxlLAorCS5tYXNrID0gZW1tYTJyaF9pcnFfZGlzYWJsZSwKKwkubWFza19hY2sgPSBlbW1hMnJoX2lycV9kaXNhYmxlLAorCS51bm1hc2sgPSBlbW1hMnJoX2lycV9lbmFibGUsCiAJLmVuZCA9IGVtbWEycmhfaXJxX2VuZCwKLQkuc2V0X2FmZmluaXR5ID0gTlVMTAkvKiBubyBhZmZpbml0eSBzdHVmZiBmb3IgVVAgKi8KIH07CiAKIHZvaWQgZW1tYTJyaF9pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpCiB7CiAJdTMyIGk7CiAKLQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgTlVNX0VNTUEyUkhfSVJROyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmZW1tYTJyaF9pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfYmFzZSArIE5VTV9FTU1BMlJIX0lSUTsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmVtbWEycmhfaXJxX2NvbnRyb2xsZXIsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCWVtbWEycmhfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hMnJoL21hcmtlaW5zL2lycV9tYXJrZWlucy5jIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKaW5kZXggMGIzNmViMC4uM2FjNGU0MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKKysrIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKQEAgLTQ4LDE5ICs0OCw2IEBACiAJbGxfZW1tYTJyaF9zd19pcnFfZGlzYWJsZShpcnEgLSBlbW1hMnJoX3N3X2lycV9iYXNlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBlbW1hMnJoX3N3X2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW1tYTJyaF9zd19pcnFfZW5hYmxlKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgZW1tYTJyaF9zd19pcnFfc2h1dGRvd24gZW1tYTJyaF9zd19pcnFfZGlzYWJsZQotCi1zdGF0aWMgdm9pZCBlbW1hMnJoX3N3X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlsbF9lbW1hMnJoX3N3X2lycV9kaXNhYmxlKGlycSAtIGVtbWEycmhfc3dfaXJxX2Jhc2UpOwotfQotCiBzdGF0aWMgdm9pZCBlbW1hMnJoX3N3X2lycV9lbmQodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQpAQCAtNjksMjUgKzU2LDIwIEBACiAKIHN0cnVjdCBpcnFfY2hpcCBlbW1hMnJoX3N3X2lycV9jb250cm9sbGVyID0gewogCS50eXBlbmFtZSA9ICJlbW1hMnJoX3N3X2lycSIsCi0JLnN0YXJ0dXAgPSBlbW1hMnJoX3N3X2lycV9zdGFydHVwLAotCS5zaHV0ZG93biA9IGVtbWEycmhfc3dfaXJxX3NodXRkb3duLAotCS5lbmFibGUgPSBlbW1hMnJoX3N3X2lycV9lbmFibGUsCi0JLmRpc2FibGUgPSBlbW1hMnJoX3N3X2lycV9kaXNhYmxlLAotCS5hY2sgPSBlbW1hMnJoX3N3X2lycV9hY2ssCisJLmFjayA9IGVtbWEycmhfc3dfaXJxX2Rpc2FibGUsCisJLm1hc2sgPSBlbW1hMnJoX3N3X2lycV9kaXNhYmxlLAorCS5tYXNrX2FjayA9IGVtbWEycmhfc3dfaXJxX2Rpc2FibGUsCisJLnVubWFzayA9IGVtbWEycmhfc3dfaXJxX2VuYWJsZSwKIAkuZW5kID0gZW1tYTJyaF9zd19pcnFfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMLAogfTsKIAogdm9pZCBlbW1hMnJoX3N3X2lycV9pbml0KHUzMiBpcnFfYmFzZSkKIHsKIAl1MzIgaTsKIAotCWZvciAoaSA9IGlycV9iYXNlOyBpIDwgaXJxX2Jhc2UgKyBOVU1fRU1NQTJSSF9JUlFfU1c7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMjsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZlbW1hMnJoX3N3X2lycV9jb250cm9sbGVyOwotCX0KKwlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgTlVNX0VNTUEyUkhfSVJRX1NXOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmZW1tYTJyaF9zd19pcnFfY29udHJvbGxlciwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJZW1tYTJyaF9zd19pcnFfYmFzZSA9IGlycV9iYXNlOwogfQpAQCAtMTI2LDE0ICsxMDgsNiBAQAogCWxsX2VtbWEycmhfZ3Bpb19pcnFfZGlzYWJsZShpcnEgLSBlbW1hMnJoX2dwaW9faXJxX2Jhc2UpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGVtbWEycmhfZ3Bpb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVtbWEycmhfZ3Bpb19pcnFfZW5hYmxlKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgZW1tYTJyaF9ncGlvX2lycV9zaHV0ZG93biBlbW1hMnJoX2dwaW9faXJxX2Rpc2FibGUKLQogc3RhdGljIHZvaWQgZW1tYTJyaF9ncGlvX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKIAlpcnEgLT0gZW1tYTJyaF9ncGlvX2lycV9iYXNlOwpAQCAtMTQ5LDI1ICsxMjMsMTkgQEAKIAogc3RydWN0IGlycV9jaGlwIGVtbWEycmhfZ3Bpb19pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAiZW1tYTJyaF9ncGlvX2lycSIsCi0JLnN0YXJ0dXAgPSBlbW1hMnJoX2dwaW9faXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gZW1tYTJyaF9ncGlvX2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gZW1tYTJyaF9ncGlvX2lycV9lbmFibGUsCi0JLmRpc2FibGUgPSBlbW1hMnJoX2dwaW9faXJxX2Rpc2FibGUsCiAJLmFjayA9IGVtbWEycmhfZ3Bpb19pcnFfYWNrLAorCS5tYXNrID0gZW1tYTJyaF9ncGlvX2lycV9kaXNhYmxlLAorCS5tYXNrX2FjayA9IGVtbWEycmhfZ3Bpb19pcnFfYWNrLAorCS51bm1hc2sgPSBlbW1hMnJoX2dwaW9faXJxX2VuYWJsZSwKIAkuZW5kID0gZW1tYTJyaF9ncGlvX2lycV9lbmQsCi0JLnNldF9hZmZpbml0eSA9IE5VTEwsCiB9OwogCiB2b2lkIGVtbWEycmhfZ3Bpb19pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpCiB7CiAJdTMyIGk7CiAKLQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgTlVNX0VNTUEyUkhfSVJRX0dQSU87IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMjsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZlbW1hMnJoX2dwaW9faXJxX2NvbnRyb2xsZXI7Ci0JfQorCWZvciAoaSA9IGlycV9iYXNlOyBpIDwgaXJxX2Jhc2UgKyBOVU1fRU1NQTJSSF9JUlFfR1BJTzsgaSsrKQorCQlzZXRfaXJxX2NoaXAoaSwgJmVtbWEycmhfZ3Bpb19pcnFfY29udHJvbGxlcik7CiAKIAllbW1hMnJoX2dwaW9faXJxX2Jhc2UgPSBpcnFfYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvaXJxLmMgYi9hcmNoL21pcHMvZ3Q2NDEyMC9ldjY0MTIwL2lycS5jCmluZGV4IGVkNGQ4MmIuLmIzZTU3OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvaXJxLmMKKysrIGIvYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9pcnEuYwpAQCAtNjYsMzggKzY2LDIxIEBACiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfZXY2NDEyMF9pcnEodW5zaWduZWQgaW50IGlycV9ucikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWlmIChpcnFfbnIgPj0gOCkgewkvLyBBbGwgUENJIGludGVycnVwdHMgYXJlIG9uIGxpbmUgNSBvciAyCiAJCWNsZWFyX2MwX3N0YXR1cyg5IDw8IDEwKTsKIAl9IGVsc2UgewogCQljbGVhcl9jMF9zdGF0dXMoMSA8PCAoaXJxX25yICsgOCkpOwogCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9ldjY0MTIwX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKGlycV9uciA+PSA4KQkvLyBBbGwgUENJIGludGVycnVwdHMgYXJlIG9uIGxpbmUgNSBvciAyCiAJCXNldF9jMF9zdGF0dXMoOSA8PCAxMCk7CiAJZWxzZQogCQlzZXRfYzBfc3RhdHVzKDEgPDwgKGlycV9uciArIDgpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9ldjY0MTIwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9ldjY0MTIwX2lycShpcnEpOwotCXJldHVybiAwOwkJLyogTmV2ZXIgYW55dGhpbmcgcGVuZGluZyAgKi8KLX0KLQotI2RlZmluZSBzaHV0ZG93bl9ldjY0MTIwX2lycSAgICAgZGlzYWJsZV9ldjY0MTIwX2lycQotI2RlZmluZSBtYXNrX2FuZF9hY2tfZXY2NDEyMF9pcnEgZGlzYWJsZV9ldjY0MTIwX2lycQotCiBzdGF0aWMgdm9pZCBlbmRfZXY2NDEyMF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKQEAgLTEwNiwxMyArODksMTEgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBldjY0MTIwX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJFVjY0MTIwIiwKLQkuc3RhcnR1cAk9IHN0YXJ0dXBfZXY2NDEyMF9pcnEsCi0JLnNodXRkb3duCT0gc2h1dGRvd25fZXY2NDEyMF9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfZXY2NDEyMF9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX2V2NjQxMjBfaXJxLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX2V2NjQxMjBfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9ldjY0MTIwX2lycSwKKwkubWFzawkJPSBkaXNhYmxlX2V2NjQxMjBfaXJxLAorCS5tYXNrX2Fjawk9IGRpc2FibGVfZXY2NDEyMF9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfZXY2NDEyMF9pcnEsCiAJLmVuZAkJPSBlbmRfZXY2NDEyMF9pcnEsCi0JLnNldF9hZmZpbml0eQk9IE5VTEwKIH07CiAKIHZvaWQgZ3Q2NDEyMF9pcnFfc2V0dXAodm9pZCkKQEAgLTEyMiw4ICsxMDMsNiBAQAogCSAqLwogCWNsZWFyX2MwX3N0YXR1cyhTVDBfSU0pOwogCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQogCS8qCiAJICogRW5hYmxlIHRpbWVyLiAgT3RoZXIgaW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQgYXMgdGhleSBhcmUKIAkgKiByZWdpc3RlcmVkLgpAQCAtMTMzLDE2ICsxMTIsNSBAQAogCiB2b2lkIF9faW5pdCBhcmNoX2luaXRfaXJxKHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQkvKiAgTGV0J3MgaW5pdGlhbGl6ZSBvdXIgSVJRIGRlc2NyaXB0b3JzICAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gMDsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZub19pcnFfY2hpcDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAwOwotCQlzcGluX2xvY2tfaW5pdCgmaXJxX2Rlc2NbaV0ubG9jayk7Ci0JfQotCiAJZ3Q2NDEyMF9pcnFfc2V0dXAoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qYXp6L2lycS5jIGIvYXJjaC9taXBzL2phenovaXJxLmMKaW5kZXggZDViZDZiMy4uNWM0ZjUwYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2phenovaXJxLmMKKysrIGIvYXJjaC9taXBzL2phenovaXJxLmMKQEAgLTI4LDE0ICsyOCw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcjQwMzBfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfcjQwMzBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX3I0MDMwX2lycShpcnEpOwotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLSNkZWZpbmUgc2h1dGRvd25fcjQwMzBfaXJxCWRpc2FibGVfcjQwMzBfaXJxCi0KIHZvaWQgZGlzYWJsZV9yNDAzMF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IH4oMSA8PCAoaXJxIC0gSkFaWl9QQVJBTExFTF9JUlEpKTsKQEAgLTQ3LDggKzM5LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyNDAzMF9sb2NrLCBmbGFncyk7CiB9CiAKLSNkZWZpbmUgbWFza19hbmRfYWNrX3I0MDMwX2lycSBkaXNhYmxlX3I0MDMwX2lycQotCiBzdGF0aWMgdm9pZCBlbmRfcjQwMzBfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCkBAIC01NywxMSArNDcsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCByNDAzMF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiUjQwMzAiLAotCS5zdGFydHVwID0gc3RhcnR1cF9yNDAzMF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fcjQwMzBfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfcjQwMzBfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9yNDAzMF9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19yNDAzMF9pcnEsCisJLmFjayA9IGRpc2FibGVfcjQwMzBfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9yNDAzMF9pcnEsCisJLm1hc2tfYWNrID0gZGlzYWJsZV9yNDAzMF9pcnEsCisJLnVubWFzayA9IGVuYWJsZV9yNDAzMF9pcnEsCiAJLmVuZCA9IGVuZF9yNDAzMF9pcnEsCiB9OwogCkBAIC02OSwxMiArNTgsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gSkFaWl9QQVJBTExFTF9JUlE7IGkgPD0gSkFaWl9USU1FUl9JUlE7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgICAgID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gICAgID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggICAgICA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgICAgPSAmcjQwMzBfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IEpBWlpfUEFSQUxMRUxfSVJROyBpIDw9IEpBWlpfVElNRVJfSVJROyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmcjQwMzBfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJcjQwMzBfd3JpdGVfcmVnMTYoSkFaWl9JT19JUlFfRU5BQkxFLCAwKTsKIAlyNDAzMF9yZWFkX3JlZzE2KEpBWlpfSU9fSVJRX1NPVVJDRSk7CQkvKiBjbGVhciBwZW5kaW5nIElSUXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pcnEuYyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pcnEuYwppbmRleCBkZTRhMjM4Li4zZGE0OWM1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2lycS5jCkBAIC05MCwxNyArOTAsNiBAQAogc3RhdGljIHZvaWQgam1yMzkyN19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxX25yKTsKIHN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxX25yKTsKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhqbXIzOTI3X2lycV9sb2NrKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBqbXIzOTI3X2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jam1yMzkyN19pcnFfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZQlqbXIzOTI3X2lycV9zaHV0ZG93bglqbXIzOTI3X2lycV9kaXNhYmxlCi0KIHN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmIChpcnEgPT0gSk1SMzkyN19JUlFfSVJDX1RNUjApCkBAIC0xMTgsOSArMTA3LDcgQEAKIHN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycV9ucikKIHsKIAlzdHJ1Y3QgdGJfaXJxX3NwYWNlKiBzcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmptcjM5MjdfaXJxX2xvY2ssIGZsYWdzKTsKIAlmb3IgKHNwID0gdGJfaXJxX3NwYWNlczsgc3A7IHNwID0gc3AtPm5leHQpIHsKIAkJaWYgKHNwLT5zdGFydF9pcnFubyA8PSBpcnFfbnIgJiYKIAkJICAgIGlycV9uciA8IHNwLT5zdGFydF9pcnFubyArIHNwLT5ucl9pcnFzKSB7CkBAIC0xMzAsMTUgKzExNywxMiBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmam1yMzkyN19pcnFfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycV9ucikKIHsKIAlzdHJ1Y3QgdGJfaXJxX3NwYWNlKiBzcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmptcjM5MjdfaXJxX2xvY2ssIGZsYWdzKTsKIAlmb3IgKHNwID0gdGJfaXJxX3NwYWNlczsgc3A7IHNwID0gc3AtPm5leHQpIHsKIAkJaWYgKHNwLT5zdGFydF9pcnFubyA8PSBpcnFfbnIgJiYKIAkJICAgIGlycV9uciA8IHNwLT5zdGFydF9pcnFubyArIHNwLT5ucl9pcnFzKSB7CkBAIC0xNDgsNyArMTMyLDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmptcjM5MjdfaXJxX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTQ1NywxMSArNDQwLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgam1yMzkyN19pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAiam1yMzkyN19pcnEiLAotCS5zdGFydHVwID0gam1yMzkyN19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBqbXIzOTI3X2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gam1yMzkyN19pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gam1yMzkyN19pcnFfZGlzYWJsZSwKIAkuYWNrID0gam1yMzkyN19pcnFfYWNrLAorCS5tYXNrID0gam1yMzkyN19pcnFfZGlzYWJsZSwKKwkubWFza19hY2sgPSBqbXIzOTI3X2lycV9hY2ssCisJLnVubWFzayA9IGptcjM5MjdfaXJxX2VuYWJsZSwKIAkuZW5kID0gam1yMzkyN19pcnFfZW5kLAogfTsKIApAQCAtNDY5LDEyICs0NTEsOCBAQAogewogCXUzMiBpOwogCi0JZm9yIChpPSBpcnFfYmFzZTsgaTwgaXJxX2Jhc2UgKyBKTVIzOTI3X05SX0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JT0M7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZqbXIzOTI3X2lycV9jb250cm9sbGVyOwotCX0KKwlmb3IgKGk9IGlycV9iYXNlOyBpPCBpcnFfYmFzZSArIEpNUjM5MjdfTlJfSVJRX0lSQyArIEpNUjM5MjdfTlJfSVJRX0lPQzsgaSsrKQorCQlzZXRfaXJxX2NoaXAoaSwgJmptcjM5MjdfaXJxX2NvbnRyb2xsZXIpOwogCiAJam1yMzkyN19pcnFfYmFzZSA9IGlycV9iYXNlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvc2V0dXAuYwppbmRleCAxNmU1ZGZlLi4xMzhmMjVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvc2V0dXAuYworKysgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvc2V0dXAuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJd2hpbGUgKDEpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGptcjM5MjdfaHB0X3JlYWQodm9pZCkKK3N0YXRpYyBjeWNsZV90IGptcjM5MjdfaHB0X3JlYWQodm9pZCkKIHsKIAkvKiBXZSBhc3N1bWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgeHRpbWVfbG9jayBoZWxkLiAqLwogCXJldHVybiBqaWZmaWVzICogKEpNUjM5MjdfVElNRVJfQ0xLIC8gSFopICsgam1yMzkyN190bXJwdHItPnRycjsKQEAgLTE4Miw3ICsxODIsNyBAQAogI2VuZGlmCiBzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN190aW1lX2luaXQodm9pZCkKIHsKLQltaXBzX2hwdF9yZWFkID0gam1yMzkyN19ocHRfcmVhZDsKKwljbG9ja3NvdXJjZV9taXBzLnJlYWQgPSBqbXIzOTI3X2hwdF9yZWFkOwogCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IEpNUjM5MjdfVElNRVJfQ0xLOwogI2lmZGVmIFVTRV9SVENfRFMxNzQyCiAJaWYgKGptcjM5MjdfaGF2ZV9udnJhbSgpKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQppbmRleCBjZDljZWM5Li5iYmJiOGQ3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiAKIG9iai15CQkrPSBjcHUtcHJvYmUubyBicmFuY2gubyBlbnRyeS5vIGdlbmV4Lm8gaXJxLm8gcHJvY2Vzcy5vIFwKIAkJICAgcHRyYWNlLm8gcmVzZXQubyBzZW1hcGhvcmUubyBzZXR1cC5vIHNpZ25hbC5vIHN5c2NhbGwubyBcCi0JCSAgIHRpbWUubyB0cmFwcy5vIHVuYWxpZ25lZC5vCisJCSAgIHRpbWUubyB0b3BvbG9neS5vIHRyYXBzLm8gdW5hbGlnbmVkLm8KIAogYmluZm10X2lyaXgtb2Jqcwk6PSBpcml4ZWxmLm8gaXJpeGludi5vIGlyaXhpb2N0bC5vIGlyaXhzaWcubwlcCiAJCQkgICBpcml4NXN5cy5vIHN5c2lyaXgubwpAQCAtNDUsNyArNDUsNiBAQAogb2JqLSQoQ09ORklHX01JUFNfVlBFX0xPQURFUikJKz0gdnBlLm8KIG9iai0kKENPTkZJR19NSVBTX1ZQRV9BUFNQX0FQSSkJKz0gcnRseC5vCiAKLW9iai0kKENPTkZJR19OT19JU0EpCQkrPSBkbWEtbm8taXNhLm8KIG9iai0kKENPTkZJR19JODI1OSkJCSs9IGk4MjU5Lm8KIG9iai0kKENPTkZJR19JUlFfQ1BVKQkJKz0gaXJxX2NwdS5vCiBvYmotJChDT05GSUdfSVJRX0NQVV9STTdLKQkrPSBpcnEtcm03MDAwLm8KQEAgLTY3LDYgKzY2LDggQEAKIAogb2JqLSQoQ09ORklHX0k4MjUzKQkJKz0gaTgyNTMubwogCitvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8KKwogQ0ZMQUdTX2NwdS1idWdzNjQubwk9ICQoc2hlbGwgaWYgJChDQykgJChDRkxBR1MpIC1XYSwtbWRhZGRpIC1jIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICItREhBVkVfQVNfU0VUX0RBRERJIjsgZmkpCiAKIEVYVFJBX0FGTEFHUyA6PSAkKENGTEFHUykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCmluZGV4IDg0ODVhZjMuLjQ0MjgzOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwpAQCAtMTEwLDkgKzExMCw4IEBACiB7CiAJc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOwogCi0JcHJpbnRrKCJDaGVja2luZyBmb3IgJ3dhaXQnIGluc3RydWN0aW9uLi4uICIpOwogCWlmIChub3dhaXQpIHsKLQkJcHJpbnRrICgiIGRpc2FibGVkLlxuIik7CisJCXByaW50aygiV2FpdCBpbnN0cnVjdGlvbiBkaXNhYmxlZC5cbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjAsMTEgKzExOSw5IEBACiAJY2FzZSBDUFVfUjMwODE6CiAJY2FzZSBDUFVfUjMwODFFOgogCQljcHVfd2FpdCA9IHIzMDgxX3dhaXQ7Ci0JCXByaW50aygiIGF2YWlsYWJsZS5cbiIpOwogCQlicmVhazsKIAljYXNlIENQVV9UWDM5Mjc6CiAJCWNwdV93YWl0ID0gcjM5eHhfd2FpdDsKLQkJcHJpbnRrKCIgYXZhaWxhYmxlLlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX1I0MjAwOgogLyoJY2FzZSBDUFVfUjQzMDA6ICovCkBAIC0xNDYsMzMgKzE0MywyMyBAQAogCWNhc2UgQ1BVXzc0SzoKICAJY2FzZSBDUFVfUFI0NDUwOgogCQljcHVfd2FpdCA9IHI0a193YWl0OwotCQlwcmludGsoIiBhdmFpbGFibGUuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfVFg0OVhYOgogCQljcHVfd2FpdCA9IHI0a193YWl0X2lycW9mZjsKLQkJcHJpbnRrKCIgYXZhaWxhYmxlLlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0FVMTAwMDoKIAljYXNlIENQVV9BVTExMDA6CiAJY2FzZSBDUFVfQVUxNTAwOgogCWNhc2UgQ1BVX0FVMTU1MDoKIAljYXNlIENQVV9BVTEyMDA6Ci0JCWlmIChhbGxvd19hdTFrX3dhaXQpIHsKKwkJaWYgKGFsbG93X2F1MWtfd2FpdCkKIAkJCWNwdV93YWl0ID0gYXUxa193YWl0OwotCQkJcHJpbnRrKCIgYXZhaWxhYmxlLlxuIik7Ci0JCX0gZWxzZQotCQkJcHJpbnRrKCIgdW5hdmFpbGFibGUuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfUk05MDAwOgotCQlpZiAoKGMtPnByb2Nlc3Nvcl9pZCAmIDB4MDBmZikgPj0gMHg0MCkgeworCQlpZiAoKGMtPnByb2Nlc3Nvcl9pZCAmIDB4MDBmZikgPj0gMHg0MCkKIAkJCWNwdV93YWl0ID0gcjRrX3dhaXQ7Ci0JCQlwcmludGsoIiBhdmFpbGFibGUuXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50aygiIHVuYXZhaWxhYmxlLlxuIik7Ci0JCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCIgdW5hdmFpbGFibGUuXG4iKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9kbWEtbm8taXNhLmMgYi9hcmNoL21pcHMva2VybmVsL2RtYS1uby1pc2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmOGIwNy4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMva2VybmVsL2RtYS1uby1pc2EuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgUmFsZiBCYWVjaGxlCi0gKgotICogRHVtbXkgSVNBIERNQSBmdW5jdGlvbnMgZm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIElTQSBidXQgc2hhcmUgZHJpdmVycwotICogd2l0aCBJU0Egc3VjaCBhcyBsZWdhY3kgZnJlZSBQQ0kuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLURFRklORV9TUElOTE9DSyhkbWFfc3Bpbl9sb2NrKTsKLQotaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBkbWFuciwgY29uc3QgY2hhciAqIGRldmljZV9pZCkKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCi17Ci19Ci0KLUVYUE9SVF9TWU1CT0woZG1hX3NwaW5fbG9jayk7Ci1FWFBPUlRfU1lNQk9MKHJlcXVlc3RfZG1hKTsKLUVYUE9SVF9TWU1CT0woZnJlZV9kbWEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCmluZGV4IDViYWNhMTYuLmFhY2Q0YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUworKysgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAjZGVmaW5lIFBBTklDX1BJQyhtc2cpCQkJCQlcCiAJCS5zZXQgcHVzaDsJCQkJXApAQCAtMzc4LDYgKzM3OSw2OCBAQAogCUJVSUxEX0hBTkRMRVIgZHNwIGRzcCBzdGkgc2lsZW50CQkvKiAjMjYgKi8KIAlCVUlMRF9IQU5ETEVSIHJlc2VydmVkIHJlc2VydmVkIHN0aSB2ZXJib3NlCS8qIG90aGVycyAqLwogCisJLmFsaWduCTUKKwlMRUFGKGhhbmRsZV9yaV9yZGh3cl92aXZ0KQorI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwlQQU5JQ19QSUMoImhhbmRsZV9yaV9yZGh3cl92aXZ0IGNhbGxlZCIpCisjZWxzZQorCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS5zZXQJbm9yZW9yZGVyCisJLyogY2hlY2sgaWYgVExCIGNvbnRhaW5zIGEgZW50cnkgZm9yIEVQQyAqLworCU1GQzAJazEsIENQMF9FTlRSWUhJCisJYW5kaQlrMSwgMHhmZgkvKiBBU0lEX01BU0sgKi8KKwlNRkMwCWswLCBDUDBfRVBDCisJUFRSX1NSTAlrMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfU0xMCWswLCBQQUdFX1NISUZUICsgMQorCW9yCWsxLCBrMAorCU1UQzAJazEsIENQMF9FTlRSWUhJCisJbXRjMF90bGJ3X2hhemFyZAorCXRsYnAKKwl0bGJfcHJvYmVfaGF6YXJkCisJbWZjMAlrMSwgQ1AwX0lOREVYCisJLnNldAlwb3AKKwlibHR6CWsxLCBoYW5kbGVfcmkJLyogc2xvdyBwYXRoICovCisJLyogZmFsbCB0aHJ1ICovCisjZW5kaWYKKwlFTkQoaGFuZGxlX3JpX3JkaHdyX3ZpdnQpCisKKwlMRUFGKGhhbmRsZV9yaV9yZGh3cikKKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwkuc2V0CW5vcmVvcmRlcgorCS8qIDB4N2MwM2U4M2I6IHJkaHdyIHYxLCQyOSAqLworCU1GQzAJazEsIENQMF9FUEMKKwlsdWkJazAsIDB4N2MwMworCWx3CWsxLCAoazEpCisJb3JpCWswLCAweGU4M2IKKwkuc2V0CXJlb3JkZXIKKwlibmUJazAsIGsxLCBoYW5kbGVfcmkJLyogaWYgbm90IG91cnMgKi8KKwkvKiBUaGUgaW5zbiBpcyByZGh3ci4gIE5vIG5lZWQgdG8gY2hlY2sgQ0FVU0UuQkQgaGVyZS4gKi8KKwlnZXRfc2F2ZWRfc3AJLyogazEgOj0gY3VycmVudF90aHJlYWRfaW5mbyAqLworCS5zZXQJbm9yZW9yZGVyCisJTUZDMAlrMCwgQ1AwX0VQQworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9SMzAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1RYMzlYWCkKKwlvcmkJazEsIF9USFJFQURfTUFTSworCXhvcmkJazEsIF9USFJFQURfTUFTSworCUxPTkdfTAl2MSwgVElfVFBfVkFMVUUoazEpCisJTE9OR19BRERJVQlrMCwgNAorCWpyCWswCisJIHJmZQorI2Vsc2UKKwlMT05HX0FERElVCWswLCA0CQkvKiBzdGFsbCBvbiAkazAgKi8KKwlNVEMwCWswLCBDUDBfRVBDCisJLyogSSBob3BlIHRocmVlIGluc3RydWN0aW9ucyBiZXR3ZWVuIE1UQzAgYW5kIEVSRVQgYXJlIGVub3VnaC4uLiAqLworCW9yaQlrMSwgX1RIUkVBRF9NQVNLCisJeG9yaQlrMSwgX1RIUkVBRF9NQVNLCisJTE9OR19MCXYxLCBUSV9UUF9WQUxVRShrMSkKKwkuc2V0CW1pcHMzCisJZXJldAorCS5zZXQJbWlwczAKKyNlbmRpZgorCS5zZXQJcG9wCisJRU5EKGhhbmRsZV9yaV9yZGh3cikKKwogI2lmZGVmIENPTkZJR182NEJJVAogLyogQSB0ZW1wb3Jhcnkgb3ZlcmZsb3cgaGFuZGxlciB1c2VkIGJ5IGNoZWNrX2RhZGRpKCkuICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKaW5kZXggZGRjMWI3MS4uYTJlMDk1YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMKQEAgLTI1MCw2ICsyNTAsOSBAQAogCSAqLwogCXBhZ2UJc3dhcHBlcl9wZ19kaXIsIF9QR0RfT1JERVIKICNpZmRlZiBDT05GSUdfNjRCSVQKKyNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVTKSAmJiAhZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpCisJcGFnZQltb2R1bGVfcGdfZGlyLCBfUEdEX09SREVSCisjZW5kaWYKIAlwYWdlCWludmFsaWRfcG1kX3RhYmxlLCBfUE1EX09SREVSCiAjZW5kaWYKIAlwYWdlCWludmFsaWRfcHRlX3RhYmxlLCBfUFRFX09SREVSCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMgYi9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKaW5kZXggNDhlMzQxOC4uMjUyNmMwYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwpAQCAtNDAsMjEgKzQwLDEwIEBACiAJCWVuYWJsZV84MjU5QV9pcnEoaXJxKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl84MjU5QV9pcnEJZGlzYWJsZV84MjU5QV9pcnEKLQogdm9pZCBtYXNrX2FuZF9hY2tfODI1OUEodW5zaWduZWQgaW50KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV84MjU5QV9pcnEoaXJxKTsKLQotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlBX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJYVC1QSUMiLAotCS5zdGFydHVwID0gc3RhcnR1cF84MjU5QV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fODI1OUFfaXJxLAogCS5lbmFibGUgPSBlbmFibGVfODI1OUFfaXJxLAogCS5kaXNhYmxlID0gZGlzYWJsZV84MjU5QV9pcnEsCiAJLmFjayA9IG1hc2tfYW5kX2Fja184MjU5QSwKQEAgLTEyMCw3ICsxMDksNyBAQAogdm9pZCBtYWtlXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWlycV9kZXNjW2lycV0uY2hpcCA9ICZpODI1OUFfaXJxX3R5cGU7CisJc2V0X2lycV9jaGlwKGlycSwgJmk4MjU5QV9pcnFfdHlwZSk7CiAJZW5hYmxlX2lycShpcnEpOwogfQogCkBAIC0zMjMsMTIgKzMxMiw4IEBACiAKIAlpbml0XzgyNTlBKDApOwogCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmaTgyNTlBX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJc2V0X2lycV9jaGlwKGksICZpODI1OUFfaXJxX3R5cGUpOwogCiAJc2V0dXBfaXJxKDIsICZpcnEyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS1tc2MwMS5jCmluZGV4IDY1MGE4MGMuLmJjYWFkNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYwpAQCAtNDUsMzEgKzQ1LDYgQEAKIH0KIAogLyoKLSAqIEVuYWJsZXMgdGhlIElSUSBvbiBTT0MtaXQKLSAqLwotc3RhdGljIHZvaWQgZW5hYmxlX21zY19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfbXNjX2lycShpcnEpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgSVJRIG9uIFNPQy1pdAotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbXNjX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVubWFza19tc2NfaXJxKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlcyB0aGUgSVJRIG9uIFNPQy1pdAotICovCi1zdGF0aWMgdm9pZCBkaXNhYmxlX21zY19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX21zY19pcnEoaXJxKTsKLX0KLQotLyoKICAqIE1hc2tzIGFuZCBBQ0tzIGFuIElSUQogICovCiBzdGF0aWMgdm9pZCBsZXZlbF9tYXNrX2FuZF9hY2tfbXNjX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTM2LDI1ICsxMTEsMjMgQEAKIAkJICAgIChpcnE8PE1TQzAxX0lDX1JBTVdfQUREUl9TSEYpIHwgKHNldDw8TVNDMDFfSUNfUkFNV19EQVRBX1NIRikpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX21zY19pcnEJZGlzYWJsZV9tc2NfaXJxCi0KIHN0cnVjdCBpcnFfY2hpcCBtc2NfbGV2ZWxpcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiU09DLWl0LUxldmVsIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfbXNjX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9tc2NfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfbXNjX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfbXNjX2lycSwKIAkuYWNrID0gbGV2ZWxfbWFza19hbmRfYWNrX21zY19pcnEsCisJLm1hc2sgPSBtYXNrX21zY19pcnEsCisJLm1hc2tfYWNrID0gbGV2ZWxfbWFza19hbmRfYWNrX21zY19pcnEsCisJLnVubWFzayA9IHVubWFza19tc2NfaXJxLAorCS5lb2kgPSB1bm1hc2tfbXNjX2lycSwKIAkuZW5kID0gZW5kX21zY19pcnEsCiB9OwogCiBzdHJ1Y3QgaXJxX2NoaXAgbXNjX2VkZ2VpcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiU09DLWl0LUVkZ2UiLAotCS5zdGFydHVwID1zdGFydHVwX21zY19pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fbXNjX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX21zY19pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX21zY19pcnEsCiAJLmFjayA9IGVkZ2VfbWFza19hbmRfYWNrX21zY19pcnEsCisJLm1hc2sgPSBtYXNrX21zY19pcnEsCisJLm1hc2tfYWNrID0gZWRnZV9tYXNrX2FuZF9hY2tfbXNjX2lycSwKKwkudW5tYXNrID0gdW5tYXNrX21zY19pcnEsCisJLmVvaSA9IHVubWFza19tc2NfaXJxLAogCS5lbmQgPSBlbmRfbXNjX2lycSwKIH07CiAKQEAgLTE3NSwxNCArMTQ4LDE0IEBACiAKIAkJc3dpdGNoIChpbXAtPmltX3R5cGUpIHsKIAkJY2FzZSBNU0MwMV9JUlFfRURHRToKLQkJCWlycV9kZXNjW2Jhc2Urbl0uY2hpcCA9ICZtc2NfZWRnZWlycV90eXBlOworCQkJc2V0X2lycV9jaGlwKGJhc2UrbiwgJm1zY19lZGdlaXJxX3R5cGUpOwogCQkJaWYgKGNwdV9oYXNfdmVpYykKIAkJCQlNU0NJQ19XUklURShNU0MwMV9JQ19TVVArbio4LCBNU0MwMV9JQ19TVVBfRURHRV9CSVQpOwogCQkJZWxzZQogCQkJCU1TQ0lDX1dSSVRFKE1TQzAxX0lDX1NVUCtuKjgsIE1TQzAxX0lDX1NVUF9FREdFX0JJVCB8IGltcC0+aW1fbHZsKTsKIAkJCWJyZWFrOwogCQljYXNlIE1TQzAxX0lSUV9MRVZFTDoKLQkJCWlycV9kZXNjW2Jhc2Urbl0uY2hpcCA9ICZtc2NfbGV2ZWxpcnFfdHlwZTsKKwkJCXNldF9pcnFfY2hpcChiYXNlK24sICZtc2NfbGV2ZWxpcnFfdHlwZSk7CiAJCQlpZiAoY3B1X2hhc192ZWljKQogCQkJCU1TQ0lDX1dSSVRFKE1TQzAxX0lDX1NVUCtuKjgsIDApOwogCQkJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXY2NDM0eC5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXY2NDM0eC5jCmluZGV4IDM3ZDEwNjIuLjZjZmIzMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW12NjQzNHguYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1tdjY0MzR4LmMKQEAgLTY3LDM5ICs2Nyw2IEBACiB9CiAKIC8qCi0gKiBFbmFibGVzIHRoZSBJUlEgb24gTWFydmVsbCBDaGlwCi0gKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV9tdjY0MzQwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVubWFza19tdjY0MzQwX2lycShpcnEpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgSVJRIG9uIE1hcnZlbGwgQ2hpcAotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbXY2NDM0MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfbXY2NDM0MF9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERpc2FibGVzIHRoZSBJUlEgb24gTWFydmVsbCBDaGlwCi0gKi8KLXN0YXRpYyB2b2lkIGRpc2FibGVfbXY2NDM0MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX212NjQzNDBfaXJxKGlycSk7Ci19Ci0KLS8qCi0gKiBNYXNrcyBhbmQgQUNLcyBhbiBJUlEKLSAqLwotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX212NjQzNDBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza19tdjY0MzQwX2lycShpcnEpOwotfQotCi0vKgogICogRW5kIElSUSBwcm9jZXNzaW5nCiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9tdjY0MzQwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTMzLDE1ICsxMDAsMTIgQEAKIAkJZG9fSVJRKGxzMWJpdDMyKGlycV9zcmNfaGlnaCkgKyBpcnFfYmFzZSArIDMyKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9tdjY0MzQwX2lycQlkaXNhYmxlX212NjQzNDBfaXJxCi0KIHN0cnVjdCBpcnFfY2hpcCBtdjY0MzQwX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJNVi02NDM0MCIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX212NjQzNDBfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX212NjQzNDBfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfbXY2NDM0MF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX212NjQzNDBfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfbXY2NDM0MF9pcnEsCisJLmFjayA9IG1hc2tfbXY2NDM0MF9pcnEsCisJLm1hc2sgPSBtYXNrX212NjQzNDBfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfbXY2NDM0MF9pcnEsCisJLnVubWFzayA9IHVubWFza19tdjY0MzQwX2lycSwKIAkuZW5kID0gZW5kX212NjQzNDBfaXJxLAogfTsKIApAQCAtMTQ5LDEzICsxMTMsOSBAQAogewogCWludCBpOwogCi0JLyogUmVzZXQgaXJxIGhhbmRsZXJzIHBvaW50ZXJzIHRvIE5VTEwgKi8KLQlmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIDY0OyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDI7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmbXY2NDM0MF9pcnFfdHlwZTsKLQl9CisJZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA2NDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJm12NjQzNDBfaXJxX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCWlycV9iYXNlID0gYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLXJtNzAwMC5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtcm03MDAwLmMKaW5kZXggNmI1NGM3MS4uZGRjYzJhNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtcm03MDAwLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtcm03MDAwLmMKQEAgLTI5LDQyICsyOSw2IEBACiAJY2xlYXJfYzBfaW50Y29udHJvbCgweDEwMCA8PCAoaXJxIC0gaXJxX2Jhc2UpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJtN2tfY3B1X2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXVubWFza19ybTdrX2lycShpcnEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcm03a19jcHVfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW1hc2tfcm03a19pcnEoaXJxKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcm03a19jcHVfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlybTdrX2NwdV9pcnFfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZQlybTdrX2NwdV9pcnFfc2h1dGRvd24Jcm03a19jcHVfaXJxX2Rpc2FibGUKLQotLyoKLSAqIFdoaWxlIHdlIGFjayB0aGUgaW50ZXJydXB0IGludGVycnVwdHMgYXJlIGRpc2FibGVkIGFuZCB0aHVzIHdlIGRvbid0IG5lZWQKLSAqIHRvIGRlYWwgd2l0aCBjb25jdXJyZW5jeSBpc3N1ZXMuICBTYW1lIGZvciBybTdrX2NwdV9pcnFfZW5kLgotICovCi1zdGF0aWMgdm9pZCBybTdrX2NwdV9pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza19ybTdrX2lycShpcnEpOwotfQotCiBzdGF0aWMgdm9pZCBybTdrX2NwdV9pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKQEAgLTczLDExICszNywxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHJtN2tfaXJxX2NvbnRyb2xsZXIgPSB7CiAJLnR5cGVuYW1lID0gIlJNNzAwMCIsCi0JLnN0YXJ0dXAgPSBybTdrX2NwdV9pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBybTdrX2NwdV9pcnFfc2h1dGRvd24sCi0JLmVuYWJsZSA9IHJtN2tfY3B1X2lycV9lbmFibGUsCi0JLmRpc2FibGUgPSBybTdrX2NwdV9pcnFfZGlzYWJsZSwKLQkuYWNrID0gcm03a19jcHVfaXJxX2FjaywKKwkuYWNrID0gbWFza19ybTdrX2lycSwKKwkubWFzayA9IG1hc2tfcm03a19pcnEsCisJLm1hc2tfYWNrID0gbWFza19ybTdrX2lycSwKKwkudW5tYXNrID0gdW5tYXNrX3JtN2tfaXJxLAogCS5lbmQgPSBybTdrX2NwdV9pcnFfZW5kLAogfTsKIApAQCAtODcsMTIgKzUwLDkgQEAKIAogCWNsZWFyX2MwX2ludGNvbnRyb2woMHgwMDAwMGYwMCk7CQkvKiBNYXNrIGFsbCAqLwogCi0JZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA0OyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmcm03a19pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA0OyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmcm03a19pcnFfY29udHJvbGxlciwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJaXJxX2Jhc2UgPSBiYXNlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtcm05MDAwLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS1ybTkwMDAuYwppbmRleCA2MmYwMTFiLi5iYTY0NDBjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS1ybTkwMDAuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1ybTkwMDAuYwpAQCAtNDgsMTUgKzQ4LDYgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcm05a19jcHVfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlybTlrX2NwdV9pcnFfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZQlybTlrX2NwdV9pcnFfc2h1dGRvd24Jcm05a19jcHVfaXJxX2Rpc2FibGUKLQogLyoKICAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgaW50ZXJydXB0cyBhcmUgZ2xvYmFsIG9uIGFsbCBwcm9jZXNzb3JzLgogICovCkBAIC04OSwxNiArODAsNiBAQAogCW9uX2VhY2hfY3B1KGxvY2FsX3JtOWtfcGVyZmNvdW50ZXJfaXJxX3NodXRkb3duLCAodm9pZCAqKSBpcnEsIDAsIDEpOwogfQogCi0KLS8qCi0gKiBXaGlsZSB3ZSBhY2sgdGhlIGludGVycnVwdCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgdGh1cyB3ZSBkb24ndCBuZWVkCi0gKiB0byBkZWFsIHdpdGggY29uY3VycmVuY3kgaXNzdWVzLiAgU2FtZSBmb3Igcm05a19jcHVfaXJxX2VuZC4KLSAqLwotc3RhdGljIHZvaWQgcm05a19jcHVfaXJxX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1hc2tfcm05a19pcnEoaXJxKTsKLX0KLQogc3RhdGljIHZvaWQgcm05a19jcHVfaXJxX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpCkBAIC0xMDcsMTEgKzg4LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcm05a19pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAiUk05MDAwIiwKLQkuc3RhcnR1cCA9IHJtOWtfY3B1X2lycV9zdGFydHVwLAotCS5zaHV0ZG93biA9IHJtOWtfY3B1X2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gcm05a19jcHVfaXJxX2VuYWJsZSwKLQkuZGlzYWJsZSA9IHJtOWtfY3B1X2lycV9kaXNhYmxlLAotCS5hY2sgPSBybTlrX2NwdV9pcnFfYWNrLAorCS5hY2sgPSBtYXNrX3JtOWtfaXJxLAorCS5tYXNrID0gbWFza19ybTlrX2lycSwKKwkubWFza19hY2sgPSBtYXNrX3JtOWtfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfcm05a19pcnEsCiAJLmVuZCA9IHJtOWtfY3B1X2lycV9lbmQsCiB9OwogCkBAIC0xMTksOSArOTksMTAgQEAKIAkudHlwZW5hbWUgPSAiUk05MDAwIiwKIAkuc3RhcnR1cCA9IHJtOWtfcGVyZmNvdW50ZXJfaXJxX3N0YXJ0dXAsCiAJLnNodXRkb3duID0gcm05a19wZXJmY291bnRlcl9pcnFfc2h1dGRvd24sCi0JLmVuYWJsZSA9IHJtOWtfY3B1X2lycV9lbmFibGUsCi0JLmRpc2FibGUgPSBybTlrX2NwdV9pcnFfZGlzYWJsZSwKLQkuYWNrID0gcm05a19jcHVfaXJxX2FjaywKKwkuYWNrID0gbWFza19ybTlrX2lycSwKKwkubWFzayA9IG1hc2tfcm05a19pcnEsCisJLm1hc2tfYWNrID0gbWFza19ybTlrX2lycSwKKwkudW5tYXNrID0gdW5tYXNrX3JtOWtfaXJxLAogCS5lbmQgPSBybTlrX2NwdV9pcnFfZW5kLAogfTsKIApAQCAtMTM1LDE1ICsxMTYsMTMgQEAKIAogCWNsZWFyX2MwX2ludGNvbnRyb2woMHgwMDAwZjAwMCk7CQkvKiBNYXNrIGFsbCAqLwogCi0JZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA0OyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmcm05a19pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA0OyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmcm05a19pcnFfY29udHJvbGxlciwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJcm05MDAwX3BlcmZjb3VudF9pcnEgPSBiYXNlICsgMTsKLQlpcnFfZGVzY1tybTkwMDBfcGVyZmNvdW50X2lycV0uY2hpcCA9ICZybTlrX3BlcmZjb3VudGVyX2lycTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIocm05MDAwX3BlcmZjb3VudF9pcnEsICZybTlrX3BlcmZjb3VudGVyX2lycSwKKwkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlpcnFfYmFzZSA9IGJhc2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEuYwppbmRleCA5YjBlNDlkLi5iMzM5Nzk4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKQEAgLTg4LDI1ICs4OCw2IEBACiB1bnNpZ25lZCBsb25nIGlycV9od21hc2tbTlJfSVJRU107CiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwogCi0jdW5kZWYgZG9fSVJRCi0KLS8qCi0gKiBkb19JUlEgaGFuZGxlcyBhbGwgbm9ybWFsIGRldmljZSBJUlEncyAodGhlIHNwZWNpYWwKLSAqIFNNUCBjcm9zcy1DUFUgaW50ZXJydXB0cyBoYXZlIHRoZWlyIG93biBzcGVjaWZpYwotICogaGFuZGxlcnMpLgotICovCi1hc21saW5rYWdlIHVuc2lnbmVkIGludCBkb19JUlEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpcnFfZW50ZXIoKTsKLQotCV9fRE9fSVJRX1NNVENfSE9PSygpOwotCV9fZG9fSVJRKGlycSk7Ci0KLQlpcnFfZXhpdCgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KIC8qCiAgKiBHZW5lcmljLCBjb250cm9sbGVyLWluZGVwZW5kZW50IGZ1bmN0aW9uczoKICAqLwpAQCAtMTcyLDE5ICsxNTMsNiBAQAogCiB2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gID0gTlVMTDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggICA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmbm9faXJxX2NoaXA7Ci0JCXNwaW5fbG9ja19pbml0KCZpcnFfZGVzY1tpXS5sb2NrKTsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCWlycV9od21hc2tbaV0gPSAwOwotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQl9Ci0KIAlhcmNoX2luaXRfaXJxKCk7CiAKICNpZmRlZiBDT05GSUdfS0dEQgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnFfY3B1LmMgYi9hcmNoL21pcHMva2VybmVsL2lycV9jcHUuYwppbmRleCA5YmIyMWM3Li5iZTVhYzIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycV9jcHUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycV9jcHUuYwpAQCAtNTAsNDQgKzUwLDYgQEAKIAlpcnFfZGlzYWJsZV9oYXphcmQoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1pcHNfY3B1X2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXVubWFza19taXBzX2lycShpcnEpOwotCWJhY2tfdG9fYmFja19jMF9oYXphcmQoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNfY3B1X2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQltYXNrX21pcHNfaXJxKGlycSk7Ci0JYmFja190b19iYWNrX2MwX2hhemFyZCgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtaXBzX2NwdV9pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1pcHNfY3B1X2lycV9lbmFibGUoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lCW1pcHNfY3B1X2lycV9zaHV0ZG93bgkJbWlwc19jcHVfaXJxX2Rpc2FibGUKLQotLyoKLSAqIFdoaWxlIHdlIGFjayB0aGUgaW50ZXJydXB0IGludGVycnVwdHMgYXJlIGRpc2FibGVkIGFuZCB0aHVzIHdlIGRvbid0IG5lZWQKLSAqIHRvIGRlYWwgd2l0aCBjb25jdXJyZW5jeSBpc3N1ZXMuICBTYW1lIGZvciBtaXBzX2NwdV9pcnFfZW5kLgotICovCi1zdGF0aWMgdm9pZCBtaXBzX2NwdV9pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza19taXBzX2lycShpcnEpOwotfQotCiBzdGF0aWMgdm9pZCBtaXBzX2NwdV9pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKQEAgLTk2LDExICs1OCwxMSBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1pcHNfY3B1X2lycV9jb250cm9sbGVyID0gewogCS50eXBlbmFtZQk9ICJNSVBTIiwKLQkuc3RhcnR1cAk9IG1pcHNfY3B1X2lycV9zdGFydHVwLAotCS5zaHV0ZG93bgk9IG1pcHNfY3B1X2lycV9zaHV0ZG93biwKLQkuZW5hYmxlCQk9IG1pcHNfY3B1X2lycV9lbmFibGUsCi0JLmRpc2FibGUJPSBtaXBzX2NwdV9pcnFfZGlzYWJsZSwKLQkuYWNrCQk9IG1pcHNfY3B1X2lycV9hY2ssCisJLmFjawkJPSBtYXNrX21pcHNfaXJxLAorCS5tYXNrCQk9IG1hc2tfbWlwc19pcnEsCisJLm1hc2tfYWNrCT0gbWFza19taXBzX2lycSwKKwkudW5tYXNrCQk9IHVubWFza19taXBzX2lycSwKKwkuZW9pCQk9IHVubWFza19taXBzX2lycSwKIAkuZW5kCQk9IG1pcHNfY3B1X2lycV9lbmQsCiB9OwogCkBAIC0xMTAsOCArNzIsNiBAQAogCiAjZGVmaW5lIHVubWFza19taXBzX210X2lycQl1bm1hc2tfbWlwc19pcnEKICNkZWZpbmUgbWFza19taXBzX210X2lycQltYXNrX21pcHNfaXJxCi0jZGVmaW5lIG1pcHNfbXRfY3B1X2lycV9lbmFibGUJbWlwc19jcHVfaXJxX2VuYWJsZQotI2RlZmluZSBtaXBzX210X2NwdV9pcnFfZGlzYWJsZQltaXBzX2NwdV9pcnFfZGlzYWJsZQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1pcHNfbXRfY3B1X2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCiB7CkBAIC0xMTksMTMgKzc5LDExIEBACiAKIAljbGVhcl9jMF9jYXVzZSgweDEwMCA8PCAoaXJxIC0gbWlwc19jcHVfaXJxX2Jhc2UpKTsKIAlldnBlKHZwZmxhZ3MpOwotCW1pcHNfbXRfY3B1X2lycV9lbmFibGUoaXJxKTsKKwl1bm1hc2tfbWlwc19tdF9pcnEoaXJxKTsKIAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lCW1pcHNfbXRfY3B1X2lycV9zaHV0ZG93bgltaXBzX210X2NwdV9pcnFfZGlzYWJsZQotCiAvKgogICogV2hpbGUgd2UgYWNrIHRoZSBpbnRlcnJ1cHQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZAogICogdG8gZGVhbCB3aXRoIGNvbmN1cnJlbmN5IGlzc3Vlcy4gIFNhbWUgZm9yIG1pcHNfY3B1X2lycV9lbmQuCkBAIC0xNDMsMTAgKzEwMSwxMSBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtaXBzX210X2NwdV9pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUJPSAiTUlQUyIsCiAJLnN0YXJ0dXAJPSBtaXBzX210X2NwdV9pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSBtaXBzX210X2NwdV9pcnFfc2h1dGRvd24sCi0JLmVuYWJsZQkJPSBtaXBzX210X2NwdV9pcnFfZW5hYmxlLAotCS5kaXNhYmxlCT0gbWlwc19tdF9jcHVfaXJxX2Rpc2FibGUsCiAJLmFjawkJPSBtaXBzX210X2NwdV9pcnFfYWNrLAorCS5tYXNrCQk9IG1hc2tfbWlwc19tdF9pcnEsCisJLm1hc2tfYWNrCT0gbWlwc19tdF9jcHVfaXJxX2FjaywKKwkudW5tYXNrCQk9IHVubWFza19taXBzX210X2lycSwKKwkuZW9pCQk9IHVubWFza19taXBzX210X2lycSwKIAkuZW5kCQk9IG1pcHNfbXRfY3B1X2lycV9lbmQsCiB9OwogCkBAIC0xNjMsMTkgKzEyMiwxMiBAQAogCSAqIGxlYXZlIHRoZW0gdW5pbml0aWFsaXplZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KIAkgKi8KIAlpZiAoY3B1X2hhc19taXBzbXQpCi0JCWZvciAoaSA9IGlycV9iYXNlOyBpIDwgaXJxX2Jhc2UgKyAyOyBpKyspIHsKLQkJCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7Ci0JCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCQlpcnFfZGVzY1tpXS5jaGlwID0gJm1pcHNfbXRfY3B1X2lycV9jb250cm9sbGVyOwotCQl9CisJCWZvciAoaSA9IGlycV9iYXNlOyBpIDwgaXJxX2Jhc2UgKyAyOyBpKyspCisJCQlzZXRfaXJxX2NoaXAoaSwgJm1pcHNfbXRfY3B1X2lycV9jb250cm9sbGVyKTsKIAotCWZvciAoaSA9IGlycV9iYXNlICsgMjsgaSA8IGlycV9iYXNlICsgODsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJm1pcHNfY3B1X2lycV9jb250cm9sbGVyOwotCX0KKwlmb3IgKGkgPSBpcnFfYmFzZSArIDI7IGkgPCBpcnFfYmFzZSArIDg7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZtaXBzX2NwdV9pcnFfY29udHJvbGxlciwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJbWlwc19jcHVfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKaW5kZXggN2EzZWJiZS4uYjA2MWM5YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKQEAgLTM4Miw1MzEgKzM4Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IG1zZ2J1ZjMyIHsgczMyIG10eXBlOyBjaGFyIG10ZXh0WzFdOyB9OwotCi1zdHJ1Y3QgaXBjX3Blcm0zMgotewotCWtleV90ICAgIAkgIGtleTsKLSAgICAgICAgX19jb21wYXRfdWlkX3QgIHVpZDsKLSAgICAgICAgX19jb21wYXRfZ2lkX3QgIGdpZDsKLSAgICAgICAgX19jb21wYXRfdWlkX3QgIGN1aWQ7Ci0gICAgICAgIF9fY29tcGF0X2dpZF90ICBjZ2lkOwotICAgICAgICBjb21wYXRfbW9kZV90CW1vZGU7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICBzZXE7Ci19OwotCi1zdHJ1Y3QgaXBjNjRfcGVybTMyIHsKLQlrZXlfdCBrZXk7Ci0JX19jb21wYXRfdWlkX3QgdWlkOwotCV9fY29tcGF0X2dpZF90IGdpZDsKLQlfX2NvbXBhdF91aWRfdCBjdWlkOwotCV9fY29tcGF0X2dpZF90IGNnaWQ7Ci0JY29tcGF0X21vZGVfdAltb2RlOwotCXVuc2lnbmVkIHNob3J0CXNlcTsKLQl1bnNpZ25lZCBzaG9ydCBfX3BhZDE7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkMTsKLQl1bnNpZ25lZCBpbnQgX191bnVzZWQyOwotfTsKLQotc3RydWN0IHNlbWlkX2RzMzIgewotICAgICAgICBzdHJ1Y3QgaXBjX3Blcm0zMiBzZW1fcGVybTsgICAgICAgICAgICAgICAvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIHNlbV9vdGltZTsgICAgICAgICAgICAgIC8qIGxhc3Qgc2Vtb3AgdGltZSAqLwotICAgICAgICBjb21wYXRfdGltZV90ICAgc2VtX2N0aW1lOyAgICAgICAgICAgICAgLyogbGFzdCBjaGFuZ2UgdGltZSAqLwotICAgICAgICB1MzIgc2VtX2Jhc2U7ICAgICAgICAgICAgICAvKiBwdHIgdG8gZmlyc3Qgc2VtYXBob3JlIGluIGFycmF5ICovCi0gICAgICAgIHUzMiBzZW1fcGVuZGluZzsgICAgICAgICAgLyogcGVuZGluZyBvcGVyYXRpb25zIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgICB1MzIgc2VtX3BlbmRpbmdfbGFzdDsgICAgLyogbGFzdCBwZW5kaW5nIG9wZXJhdGlvbiAqLwotICAgICAgICB1MzIgdW5kbzsgICAgICAgICAgICAgICAgICAvKiB1bmRvIHJlcXVlc3RzIG9uIHRoaXMgYXJyYXkgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNlbV9uc2VtczsgICAgICAgICAgICAgIC8qIG5vLiBvZiBzZW1hcGhvcmVzIGluIGFycmF5ICovCi19OwotCi1zdHJ1Y3Qgc2VtaWQ2NF9kczMyIHsKLQlzdHJ1Y3QgaXBjNjRfcGVybTMyCXNlbV9wZXJtOwotCWNvbXBhdF90aW1lX3QJc2VtX290aW1lOwotCWNvbXBhdF90aW1lX3QJc2VtX2N0aW1lOwotCXVuc2lnbmVkIGludAkJc2VtX25zZW1zOwotCXVuc2lnbmVkIGludAkJX191bnVzZWQxOwotCXVuc2lnbmVkIGludAkJX191bnVzZWQyOwotfTsKLQotc3RydWN0IG1zcWlkX2RzMzIKLXsKLSAgICAgICAgc3RydWN0IGlwY19wZXJtMzIgbXNnX3Blcm07Ci0gICAgICAgIHUzMiBtc2dfZmlyc3Q7Ci0gICAgICAgIHUzMiBtc2dfbGFzdDsKLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIG1zZ19zdGltZTsKLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIG1zZ19ydGltZTsKLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIG1zZ19jdGltZTsKLSAgICAgICAgdTMyIHd3YWl0OwotICAgICAgICB1MzIgcndhaXQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IG1zZ19jYnl0ZXM7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IG1zZ19xbnVtOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBtc2dfcWJ5dGVzOwotICAgICAgICBjb21wYXRfaXBjX3BpZF90IG1zZ19sc3BpZDsKLSAgICAgICAgY29tcGF0X2lwY19waWRfdCBtc2dfbHJwaWQ7Ci19OwotCi1zdHJ1Y3QgbXNxaWQ2NF9kczMyIHsKLQlzdHJ1Y3QgaXBjNjRfcGVybTMyIG1zZ19wZXJtOwotCWNvbXBhdF90aW1lX3QgbXNnX3N0aW1lOwotCXVuc2lnbmVkIGludCBfX3VudXNlZDE7Ci0JY29tcGF0X3RpbWVfdCBtc2dfcnRpbWU7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkMjsKLQljb21wYXRfdGltZV90IG1zZ19jdGltZTsKLQl1bnNpZ25lZCBpbnQgX191bnVzZWQzOwotCXVuc2lnbmVkIGludCBtc2dfY2J5dGVzOwotCXVuc2lnbmVkIGludCBtc2dfcW51bTsKLQl1bnNpZ25lZCBpbnQgbXNnX3FieXRlczsKLQljb21wYXRfcGlkX3QgbXNnX2xzcGlkOwotCWNvbXBhdF9waWRfdCBtc2dfbHJwaWQ7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkNDsKLQl1bnNpZ25lZCBpbnQgX191bnVzZWQ1OwotfTsKLQotc3RydWN0IHNobWlkX2RzMzIgewotICAgICAgICBzdHJ1Y3QgaXBjX3Blcm0zMiAgICAgICBzaG1fcGVybTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2htX3NlZ3N6OwotICAgICAgICBjb21wYXRfdGltZV90CQlzaG1fYXRpbWU7Ci0gICAgICAgIGNvbXBhdF90aW1lX3QJCXNobV9kdGltZTsKLSAgICAgICAgY29tcGF0X3RpbWVfdAkJc2htX2N0aW1lOwotICAgICAgICBjb21wYXRfaXBjX3BpZF90ICAgIHNobV9jcGlkOwotICAgICAgICBjb21wYXRfaXBjX3BpZF90ICAgIHNobV9scGlkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBzaG1fbmF0dGNoOwotfTsKLQotc3RydWN0IHNobWlkNjRfZHMzMiB7Ci0Jc3RydWN0IGlwYzY0X3Blcm0zMglzaG1fcGVybTsKLQljb21wYXRfc2l6ZV90CQlzaG1fc2Vnc3o7Ci0JY29tcGF0X3RpbWVfdAkJc2htX2F0aW1lOwotCWNvbXBhdF90aW1lX3QJCXNobV9kdGltZTsKLQljb21wYXRfdGltZV90IHNobV9jdGltZTsKLQljb21wYXRfcGlkX3Qgc2htX2NwaWQ7Ci0JY29tcGF0X3BpZF90IHNobV9scGlkOwotCXVuc2lnbmVkIGludCBzaG1fbmF0dGNoOwotCXVuc2lnbmVkIGludCBfX3VudXNlZDE7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkMjsKLX07Ci0KLXN0cnVjdCBpcGNfa2x1ZGdlMzIgewotCXUzMiBtc2dwOwotCXMzMiBtc2d0eXA7Ci19OwotCi1zdGF0aWMgaW50Ci1kb19zeXMzMl9zZW1jdGwoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHZvaWQgX191c2VyICp1cHRyKQotewotCXVuaW9uIHNlbXVuIGZvdXJ0aDsKLQl1MzIgcGFkOwotCWludCBlcnIsIGVycjI7Ci0Jc3RydWN0IHNlbWlkNjRfZHMgczsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwotCi0JaWYgKCF1cHRyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllcnIgPSAtRUZBVUxUOwotCWlmIChnZXRfdXNlciAocGFkLCAodTMyIF9fdXNlciAqKXVwdHIpKQotCQlyZXR1cm4gZXJyOwotCWlmICgodGhpcmQgJiB+SVBDXzY0KSA9PSBTRVRWQUwpCi0JCWZvdXJ0aC52YWwgPSAoaW50KXBhZDsKLQllbHNlCi0JCWZvdXJ0aC5fX3BhZCA9ICh2b2lkIF9fdXNlciAqKUEocGFkKTsKLQlzd2l0Y2ggKHRoaXJkICYgfklQQ182NCkgewotCWNhc2UgSVBDX0lORk86Ci0JY2FzZSBJUENfUk1JRDoKLQljYXNlIElQQ19TRVQ6Ci0JY2FzZSBTRU1fSU5GTzoKLQljYXNlIEdFVFZBTDoKLQljYXNlIEdFVFBJRDoKLQljYXNlIEdFVE5DTlQ6Ci0JY2FzZSBHRVRaQ05UOgotCWNhc2UgR0VUQUxMOgotCWNhc2UgU0VUVkFMOgotCWNhc2UgU0VUQUxMOgotCQllcnIgPSBzeXNfc2VtY3RsIChmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm91cnRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQQ19TVEFUOgotCWNhc2UgU0VNX1NUQVQ6Ci0JCWZvdXJ0aC5fX3BhZCA9IChzdHJ1Y3Qgc2VtaWQ2NF9kcyBfX3VzZXIgKikmczsKLQkJb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCQllcnIgPSBzeXNfc2VtY3RsKGZpcnN0LCBzZWNvbmQsIHRoaXJkIHwgSVBDXzY0LCBmb3VydGgpOwotCQlzZXRfZnMob2xkX2ZzKTsKLQotCQlpZiAodGhpcmQgJiBJUENfNjQpIHsKLQkJCXN0cnVjdCBzZW1pZDY0X2RzMzIgX191c2VyICp1c3A2NCA9IChzdHJ1Y3Qgc2VtaWQ2NF9kczMyIF9fdXNlciAqKSBBKHBhZCk7Ci0KLQkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXNwNjQsIHNpemVvZigqdXNwNjQpKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllcnIyID0gX19wdXRfdXNlcihzLnNlbV9wZXJtLmtleSwgJnVzcDY0LT5zZW1fcGVybS5rZXkpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHMuc2VtX3Blcm0udWlkLCAmdXNwNjQtPnNlbV9wZXJtLnVpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIocy5zZW1fcGVybS5naWQsICZ1c3A2NC0+c2VtX3Blcm0uZ2lkKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzLnNlbV9wZXJtLmN1aWQsICZ1c3A2NC0+c2VtX3Blcm0uY3VpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIocy5zZW1fcGVybS5jZ2lkLCAmdXNwNjQtPnNlbV9wZXJtLmNnaWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHMuc2VtX3Blcm0ubW9kZSwgJnVzcDY0LT5zZW1fcGVybS5tb2RlKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzLnNlbV9wZXJtLnNlcSwgJnVzcDY0LT5zZW1fcGVybS5zZXEpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHMuc2VtX290aW1lLCAmdXNwNjQtPnNlbV9vdGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIocy5zZW1fY3RpbWUsICZ1c3A2NC0+c2VtX2N0aW1lKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzLnNlbV9uc2VtcywgJnVzcDY0LT5zZW1fbnNlbXMpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IHNlbWlkX2RzMzIgX191c2VyICp1c3AzMiA9IChzdHJ1Y3Qgc2VtaWRfZHMzMiBfX3VzZXIgKikgQShwYWQpOwotCi0JCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVzcDMyLCBzaXplb2YoKnVzcDMyKSkpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyMiA9IF9fcHV0X3VzZXIocy5zZW1fcGVybS5rZXksICZ1c3AzMi0+c2VtX3Blcm0ua2V5KTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzLnNlbV9wZXJtLnVpZCwgJnVzcDMyLT5zZW1fcGVybS51aWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHMuc2VtX3Blcm0uZ2lkLCAmdXNwMzItPnNlbV9wZXJtLmdpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIocy5zZW1fcGVybS5jdWlkLCAmdXNwMzItPnNlbV9wZXJtLmN1aWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHMuc2VtX3Blcm0uY2dpZCwgJnVzcDMyLT5zZW1fcGVybS5jZ2lkKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzLnNlbV9wZXJtLm1vZGUsICZ1c3AzMi0+c2VtX3Blcm0ubW9kZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIocy5zZW1fcGVybS5zZXEsICZ1c3AzMi0+c2VtX3Blcm0uc2VxKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzLnNlbV9vdGltZSwgJnVzcDMyLT5zZW1fb3RpbWUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHMuc2VtX2N0aW1lLCAmdXNwMzItPnNlbV9jdGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIocy5zZW1fbnNlbXMsICZ1c3AzMi0+c2VtX25zZW1zKTsKLQkJfQotCQlpZiAoZXJyMikKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyID0gLSBFSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX3N5czMyX21zZ3NuZCAoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHZvaWQgX191c2VyICp1cHRyKQotewotCXN0cnVjdCBtc2didWYzMiBfX3VzZXIgKnVwID0gKHN0cnVjdCBtc2didWYzMiBfX3VzZXIgKil1cHRyOwotCXN0cnVjdCBtc2didWYgKnA7Ci0JbW1fc2VnbWVudF90IG9sZF9mczsKLQlpbnQgZXJyOwotCi0JaWYgKHNlY29uZCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXAgPSBrbWFsbG9jIChzZWNvbmQgKyBzaXplb2YgKHN0cnVjdCBtc2didWYpCi0JCQkJICAgICsgNCwgR0ZQX1VTRVIpOwotCWlmICghcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZXJyID0gZ2V0X3VzZXIgKHAtPm10eXBlLCAmdXAtPm10eXBlKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQllcnIgfD0gX19jb3B5X2Zyb21fdXNlciAocC0+bXRleHQsICZ1cC0+bXRleHQsIHNlY29uZCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0Jb2xkX2ZzID0gZ2V0X2ZzICgpOwotCXNldF9mcyAoS0VSTkVMX0RTKTsKLQllcnIgPSBzeXNfbXNnc25kIChmaXJzdCwgKHN0cnVjdCBtc2didWYgX191c2VyICopcCwgc2Vjb25kLCB0aGlyZCk7Ci0Jc2V0X2ZzIChvbGRfZnMpOwotb3V0OgotCWtmcmVlIChwKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX3N5czMyX21zZ3JjdiAoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgbXNndHlwLCBpbnQgdGhpcmQsCi0JCSBpbnQgdmVyc2lvbiwgdm9pZCBfX3VzZXIgKnVwdHIpCi17Ci0Jc3RydWN0IG1zZ2J1ZjMyIF9fdXNlciAqdXA7Ci0Jc3RydWN0IG1zZ2J1ZiAqcDsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwotCWludCBlcnI7Ci0KLQlpZiAoIXZlcnNpb24pIHsKLQkJc3RydWN0IGlwY19rbHVkZ2UzMiBfX3VzZXIgKnVpcGNrID0gKHN0cnVjdCBpcGNfa2x1ZGdlMzIgX191c2VyICopdXB0cjsKLQkJc3RydWN0IGlwY19rbHVkZ2UzMiBpcGNrOwotCi0JCWVyciA9IC1FSU5WQUw7Ci0JCWlmICghdXB0cikKLQkJCWdvdG8gb3V0OwotCQllcnIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIgKCZpcGNrLCB1aXBjaywgc2l6ZW9mIChzdHJ1Y3QgaXBjX2tsdWRnZTMyKSkpCi0JCQlnb3RvIG91dDsKLQkJdXB0ciA9ICh2b2lkIF9fdXNlciAqKUFBKGlwY2subXNncCk7Ci0JCW1zZ3R5cCA9IGlwY2subXNndHlwOwotCX0KLQotCWlmIChzZWNvbmQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllcnIgPSAtRU5PTUVNOwotCXAgPSBrbWFsbG9jIChzZWNvbmQgKyBzaXplb2YgKHN0cnVjdCBtc2didWYpICsgNCwgR0ZQX1VTRVIpOwotCWlmICghcCkKLQkJZ290byBvdXQ7Ci0Jb2xkX2ZzID0gZ2V0X2ZzICgpOwotCXNldF9mcyAoS0VSTkVMX0RTKTsKLQllcnIgPSBzeXNfbXNncmN2IChmaXJzdCwgKHN0cnVjdCBtc2didWYgX191c2VyICopcCwgc2Vjb25kICsgNCwgbXNndHlwLCB0aGlyZCk7Ci0Jc2V0X2ZzIChvbGRfZnMpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGZyZWVfdGhlbl9vdXQ7Ci0JdXAgPSAoc3RydWN0IG1zZ2J1ZjMyIF9fdXNlciAqKXVwdHI7Ci0JaWYgKHB1dF91c2VyIChwLT5tdHlwZSwgJnVwLT5tdHlwZSkgfHwKLQkgICAgX19jb3B5X3RvX3VzZXIgKCZ1cC0+bXRleHQsIHAtPm10ZXh0LCBlcnIpKQotCQllcnIgPSAtRUZBVUxUOwotZnJlZV90aGVuX291dDoKLQlrZnJlZSAocCk7Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludAotZG9fc3lzMzJfbXNnY3RsIChpbnQgZmlyc3QsIGludCBzZWNvbmQsIHZvaWQgX191c2VyICp1cHRyKQotewotCWludCBlcnIgPSAtRUlOVkFMLCBlcnIyOwotCXN0cnVjdCBtc3FpZDY0X2RzIG07Ci0Jc3RydWN0IG1zcWlkX2RzMzIgX191c2VyICp1cDMyID0gKHN0cnVjdCBtc3FpZF9kczMyIF9fdXNlciAqKXVwdHI7Ci0Jc3RydWN0IG1zcWlkNjRfZHMzMiBfX3VzZXIgKnVwNjQgPSAoc3RydWN0IG1zcWlkNjRfZHMzMiBfX3VzZXIgKil1cHRyOwotCW1tX3NlZ21lbnRfdCBvbGRfZnM7Ci0KLQlzd2l0Y2ggKHNlY29uZCAmIH5JUENfNjQpIHsKLQljYXNlIElQQ19JTkZPOgotCWNhc2UgSVBDX1JNSUQ6Ci0JY2FzZSBNU0dfSU5GTzoKLQkJZXJyID0gc3lzX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKil1cHRyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQQ19TRVQ6Ci0JCWlmIChzZWNvbmQgJiBJUENfNjQpIHsKLQkJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cDY0LCBzaXplb2YoKnVwNjQpKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllcnIgPSBfX2dldF91c2VyKG0ubXNnX3Blcm0udWlkLCAmdXA2NC0+bXNnX3Blcm0udWlkKTsKLQkJCWVyciB8PSBfX2dldF91c2VyKG0ubXNnX3Blcm0uZ2lkLCAmdXA2NC0+bXNnX3Blcm0uZ2lkKTsKLQkJCWVyciB8PSBfX2dldF91c2VyKG0ubXNnX3Blcm0ubW9kZSwgJnVwNjQtPm1zZ19wZXJtLm1vZGUpOwotCQkJZXJyIHw9IF9fZ2V0X3VzZXIobS5tc2dfcWJ5dGVzLCAmdXA2NC0+bXNnX3FieXRlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAzMiwgc2l6ZW9mKCp1cDMyKSkpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyID0gX19nZXRfdXNlcihtLm1zZ19wZXJtLnVpZCwgJnVwMzItPm1zZ19wZXJtLnVpZCk7Ci0JCQllcnIgfD0gX19nZXRfdXNlcihtLm1zZ19wZXJtLmdpZCwgJnVwMzItPm1zZ19wZXJtLmdpZCk7Ci0JCQllcnIgfD0gX19nZXRfdXNlcihtLm1zZ19wZXJtLm1vZGUsICZ1cDMyLT5tc2dfcGVybS5tb2RlKTsKLQkJCWVyciB8PSBfX2dldF91c2VyKG0ubXNnX3FieXRlcywgJnVwMzItPm1zZ19xYnl0ZXMpOwotCQl9Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQkJb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCQllcnIgPSBzeXNfbXNnY3RsKGZpcnN0LCBzZWNvbmQgfCBJUENfNjQsIChzdHJ1Y3QgbXNxaWRfZHMgX191c2VyICopJm0pOwotCQlzZXRfZnMob2xkX2ZzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQQ19TVEFUOgotCWNhc2UgTVNHX1NUQVQ6Ci0JCW9sZF9mcyA9IGdldF9mcygpOwotCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkJZXJyID0gc3lzX21zZ2N0bChmaXJzdCwgc2Vjb25kIHwgSVBDXzY0LCAoc3RydWN0IG1zcWlkX2RzIF9fdXNlciAqKSZtKTsKLQkJc2V0X2ZzKG9sZF9mcyk7Ci0JCWlmIChzZWNvbmQgJiBJUENfNjQpIHsKLQkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXA2NCwgc2l6ZW9mKCp1cDY0KSkpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyMiA9IF9fcHV0X3VzZXIobS5tc2dfcGVybS5rZXksICZ1cDY0LT5tc2dfcGVybS5rZXkpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3Blcm0udWlkLCAmdXA2NC0+bXNnX3Blcm0udWlkKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19wZXJtLmdpZCwgJnVwNjQtPm1zZ19wZXJtLmdpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcGVybS5jdWlkLCAmdXA2NC0+bXNnX3Blcm0uY3VpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcGVybS5jZ2lkLCAmdXA2NC0+bXNnX3Blcm0uY2dpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcGVybS5tb2RlLCAmdXA2NC0+bXNnX3Blcm0ubW9kZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcGVybS5zZXEsICZ1cDY0LT5tc2dfcGVybS5zZXEpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3N0aW1lLCAmdXA2NC0+bXNnX3N0aW1lKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19ydGltZSwgJnVwNjQtPm1zZ19ydGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfY3RpbWUsICZ1cDY0LT5tc2dfY3RpbWUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX2NieXRlcywgJnVwNjQtPm1zZ19jYnl0ZXMpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3FudW0sICZ1cDY0LT5tc2dfcW51bSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcWJ5dGVzLCAmdXA2NC0+bXNnX3FieXRlcyk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfbHNwaWQsICZ1cDY0LT5tc2dfbHNwaWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX2xycGlkLCAmdXA2NC0+bXNnX2xycGlkKTsKLQkJCWlmIChlcnIyKQotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwMzIsIHNpemVvZigqdXAzMikpKSB7Ci0JCQkJZXJyID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVycjIgPSBfX3B1dF91c2VyKG0ubXNnX3Blcm0ua2V5LCAmdXAzMi0+bXNnX3Blcm0ua2V5KTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19wZXJtLnVpZCwgJnVwMzItPm1zZ19wZXJtLnVpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcGVybS5naWQsICZ1cDMyLT5tc2dfcGVybS5naWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3Blcm0uY3VpZCwgJnVwMzItPm1zZ19wZXJtLmN1aWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3Blcm0uY2dpZCwgJnVwMzItPm1zZ19wZXJtLmNnaWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3Blcm0ubW9kZSwgJnVwMzItPm1zZ19wZXJtLm1vZGUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3Blcm0uc2VxLCAmdXAzMi0+bXNnX3Blcm0uc2VxKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19zdGltZSwgJnVwMzItPm1zZ19zdGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIobS5tc2dfcnRpbWUsICZ1cDMyLT5tc2dfcnRpbWUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX2N0aW1lLCAmdXAzMi0+bXNnX2N0aW1lKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19jYnl0ZXMsICZ1cDMyLT5tc2dfY2J5dGVzKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19xbnVtLCAmdXAzMi0+bXNnX3FudW0pOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX3FieXRlcywgJnVwMzItPm1zZ19xYnl0ZXMpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKG0ubXNnX2xzcGlkLCAmdXAzMi0+bXNnX2xzcGlkKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihtLm1zZ19scnBpZCwgJnVwMzItPm1zZ19scnBpZCk7Ci0JCQlpZiAoZXJyMikKLQkJCQllcnIgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX3N5czMyX3NobWF0IChpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwgaW50IHZlcnNpb24sIHZvaWQgX191c2VyICp1cHRyKQotewotCXVuc2lnbmVkIGxvbmcgcmFkZHI7Ci0JdTMyIF9fdXNlciAqdWFkZHIgPSAodTMyIF9fdXNlciAqKUEoKHUzMil0aGlyZCk7Ci0JaW50IGVyciA9IC1FSU5WQUw7Ci0KLQlpZiAodmVyc2lvbiA9PSAxKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGRvX3NobWF0IChmaXJzdCwgdXB0ciwgc2Vjb25kLCAmcmFkZHIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gcHV0X3VzZXIgKHJhZGRyLCB1YWRkcik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RydWN0IHNobV9pbmZvMzIgewotCWludCB1c2VkX2lkczsKLQl1MzIgc2htX3RvdCwgc2htX3Jzcywgc2htX3N3cDsKLQl1MzIgc3dhcF9hdHRlbXB0cywgc3dhcF9zdWNjZXNzZXM7Ci19OwotCi1zdGF0aWMgaW50Ci1kb19zeXMzMl9zaG1jdGwgKGludCBmaXJzdCwgaW50IHNlY29uZCwgdm9pZCBfX3VzZXIgKnVwdHIpCi17Ci0Jc3RydWN0IHNobWlkNjRfZHMzMiBfX3VzZXIgKnVwNjQgPSAoc3RydWN0IHNobWlkNjRfZHMzMiBfX3VzZXIgKil1cHRyOwotCXN0cnVjdCBzaG1pZF9kczMyIF9fdXNlciAqdXAzMiA9IChzdHJ1Y3Qgc2htaWRfZHMzMiBfX3VzZXIgKil1cHRyOwotCXN0cnVjdCBzaG1faW5mbzMyIF9fdXNlciAqdWlwID0gKHN0cnVjdCBzaG1faW5mbzMyIF9fdXNlciAqKXVwdHI7Ci0JaW50IGVyciA9IC1FRkFVTFQsIGVycjI7Ci0Jc3RydWN0IHNobWlkNjRfZHMgczY0OwotCW1tX3NlZ21lbnRfdCBvbGRfZnM7Ci0Jc3RydWN0IHNobV9pbmZvIHNpOwotCXN0cnVjdCBzaG1pZF9kcyBzOwotCi0Jc3dpdGNoIChzZWNvbmQgJiB+SVBDXzY0KSB7Ci0JY2FzZSBJUENfSU5GTzoKLQkJc2Vjb25kID0gSVBDX0lORk87IC8qIFNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB0cmFuc2xhdGUgaXQgKi8KLQljYXNlIElQQ19STUlEOgotCWNhc2UgU0hNX0xPQ0s6Ci0JY2FzZSBTSE1fVU5MT0NLOgotCQllcnIgPSBzeXNfc2htY3RsKGZpcnN0LCBzZWNvbmQsIChzdHJ1Y3Qgc2htaWRfZHMgX191c2VyICopdXB0cik7Ci0JCWJyZWFrOwotCWNhc2UgSVBDX1NFVDoKLQkJaWYgKHNlY29uZCAmIElQQ182NCkgewotCQkJZXJyID0gZ2V0X3VzZXIocy5zaG1fcGVybS51aWQsICZ1cDY0LT5zaG1fcGVybS51aWQpOwotCQkJZXJyIHw9IGdldF91c2VyKHMuc2htX3Blcm0uZ2lkLCAmdXA2NC0+c2htX3Blcm0uZ2lkKTsKLQkJCWVyciB8PSBnZXRfdXNlcihzLnNobV9wZXJtLm1vZGUsICZ1cDY0LT5zaG1fcGVybS5tb2RlKTsKLQkJfSBlbHNlIHsKLQkJCWVyciA9IGdldF91c2VyKHMuc2htX3Blcm0udWlkLCAmdXAzMi0+c2htX3Blcm0udWlkKTsKLQkJCWVyciB8PSBnZXRfdXNlcihzLnNobV9wZXJtLmdpZCwgJnVwMzItPnNobV9wZXJtLmdpZCk7Ci0JCQllcnIgfD0gZ2V0X3VzZXIocy5zaG1fcGVybS5tb2RlLCAmdXAzMi0+c2htX3Blcm0ubW9kZSk7Ci0JCX0KLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCQlvbGRfZnMgPSBnZXRfZnMoKTsKLQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JCWVyciA9IHN5c19zaG1jdGwoZmlyc3QsIHNlY29uZCAmIH5JUENfNjQsIChzdHJ1Y3Qgc2htaWRfZHMgX191c2VyICopJnMpOwotCQlzZXRfZnMob2xkX2ZzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQQ19TVEFUOgotCWNhc2UgU0hNX1NUQVQ6Ci0JCW9sZF9mcyA9IGdldF9mcygpOwotCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkJZXJyID0gc3lzX3NobWN0bChmaXJzdCwgc2Vjb25kIHwgSVBDXzY0LCAodm9pZCBfX3VzZXIgKikgJnM2NCk7Ci0JCXNldF9mcyhvbGRfZnMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoc2Vjb25kICYgSVBDXzY0KSB7Ci0JCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwNjQsIHNpemVvZigqdXA2NCkpKSB7Ci0JCQkJZXJyID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVycjIgPSBfX3B1dF91c2VyKHM2NC5zaG1fcGVybS5rZXksICZ1cDY0LT5zaG1fcGVybS5rZXkpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fcGVybS51aWQsICZ1cDY0LT5zaG1fcGVybS51aWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fcGVybS5naWQsICZ1cDY0LT5zaG1fcGVybS5naWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fcGVybS5jdWlkLCAmdXA2NC0+c2htX3Blcm0uY3VpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9wZXJtLmNnaWQsICZ1cDY0LT5zaG1fcGVybS5jZ2lkKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzNjQuc2htX3Blcm0ubW9kZSwgJnVwNjQtPnNobV9wZXJtLm1vZGUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fcGVybS5zZXEsICZ1cDY0LT5zaG1fcGVybS5zZXEpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fYXRpbWUsICZ1cDY0LT5zaG1fYXRpbWUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fZHRpbWUsICZ1cDY0LT5zaG1fZHRpbWUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fY3RpbWUsICZ1cDY0LT5zaG1fY3RpbWUpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fc2Vnc3osICZ1cDY0LT5zaG1fc2Vnc3opOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fbmF0dGNoLCAmdXA2NC0+c2htX25hdHRjaCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9jcGlkLCAmdXA2NC0+c2htX2NwaWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fbHBpZCwgJnVwNjQtPnNobV9scGlkKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAzMiwgc2l6ZW9mKCp1cDMyKSkpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyMiA9IF9fcHV0X3VzZXIoczY0LnNobV9wZXJtLmtleSwgJnVwMzItPnNobV9wZXJtLmtleSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9wZXJtLnVpZCwgJnVwMzItPnNobV9wZXJtLnVpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9wZXJtLmdpZCwgJnVwMzItPnNobV9wZXJtLmdpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9wZXJtLmN1aWQsICZ1cDMyLT5zaG1fcGVybS5jdWlkKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzNjQuc2htX3Blcm0uY2dpZCwgJnVwMzItPnNobV9wZXJtLmNnaWQpOwotCQkJZXJyMiB8PSBfX3B1dF91c2VyKHM2NC5zaG1fcGVybS5tb2RlLCAmdXAzMi0+c2htX3Blcm0ubW9kZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9wZXJtLnNlcSwgJnVwMzItPnNobV9wZXJtLnNlcSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9hdGltZSwgJnVwMzItPnNobV9hdGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9kdGltZSwgJnVwMzItPnNobV9kdGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9jdGltZSwgJnVwMzItPnNobV9jdGltZSk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9zZWdzeiwgJnVwMzItPnNobV9zZWdzeik7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9uYXR0Y2gsICZ1cDMyLT5zaG1fbmF0dGNoKTsKLQkJCWVycjIgfD0gX19wdXRfdXNlcihzNjQuc2htX2NwaWQsICZ1cDMyLT5zaG1fY3BpZCk7Ci0JCQllcnIyIHw9IF9fcHV0X3VzZXIoczY0LnNobV9scGlkLCAmdXAzMi0+c2htX2xwaWQpOwotCQl9Ci0JCWlmIChlcnIyKQotCQkJZXJyID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNITV9JTkZPOgotCQlvbGRfZnMgPSBnZXRfZnMoKTsKLQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JCWVyciA9IHN5c19zaG1jdGwoZmlyc3QsIHNlY29uZCwgKHZvaWQgX191c2VyICopJnNpKTsKLQkJc2V0X2ZzKG9sZF9mcyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJYnJlYWs7Ci0JCWVycjIgPSBwdXRfdXNlcihzaS51c2VkX2lkcywgJnVpcC0+dXNlZF9pZHMpOwotCQllcnIyIHw9IF9fcHV0X3VzZXIoc2kuc2htX3RvdCwgJnVpcC0+c2htX3RvdCk7Ci0JCWVycjIgfD0gX19wdXRfdXNlcihzaS5zaG1fcnNzLCAmdWlwLT5zaG1fcnNzKTsKLQkJZXJyMiB8PSBfX3B1dF91c2VyKHNpLnNobV9zd3AsICZ1aXAtPnNobV9zd3ApOwotCQllcnIyIHw9IF9fcHV0X3VzZXIoc2kuc3dhcF9hdHRlbXB0cywgJnVpcC0+c3dhcF9hdHRlbXB0cyk7Ci0JCWVycjIgfD0gX19wdXRfdXNlciAoc2kuc3dhcF9zdWNjZXNzZXMsICZ1aXAtPnN3YXBfc3VjY2Vzc2VzKTsKLQkJaWYgKGVycjIpCi0JCQllcnIgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc3lzMzJfc2VtdGltZWRvcChpbnQgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICp0c2VtcywgaW50IG5zZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0MzIpCi17Ci0Jc3RydWN0IGNvbXBhdF90aW1lc3BlYyB0MzI7Ci0Jc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdDY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp0NjQpKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdDMyLCB0aW1lb3V0MzIsIHNpemVvZih0MzIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAocHV0X3VzZXIodDMyLnR2X3NlYywgJnQ2NC0+dHZfc2VjKSB8fAotCSAgICBwdXRfdXNlcih0MzIudHZfbnNlYywgJnQ2NC0+dHZfbnNlYykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIHN5c19zZW10aW1lZG9wKHNlbWlkLCB0c2VtcywgbnNlbXMsIHQ2NCk7Ci19Ci0KIGFzbWxpbmthZ2UgbG9uZwogc3lzMzJfaXBjICh1MzIgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHUzMiBwdHIsIHUzMiBmaWZ0aCkKIHsKQEAgLTkxOCw0OCArMzkzLDQzIEBACiAJc3dpdGNoIChjYWxsKSB7CiAJY2FzZSBTRU1PUDoKIAkJLyogc3RydWN0IHNlbWJ1ZiBpcyB0aGUgc2FtZSBvbiAzMiBhbmQgNjRiaXQgOikpICovCi0JCWVyciA9IHN5c19zZW10aW1lZG9wIChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopQUEocHRyKSwgc2Vjb25kLAotCQkgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJCWVyciA9IHN5c19zZW10aW1lZG9wKGZpcnN0LCBjb21wYXRfcHRyKHB0ciksIHNlY29uZCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgU0VNVElNRURPUDoKLQkJZXJyID0gc3lzMzJfc2VtdGltZWRvcCAoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqKUFBKHB0ciksIHNlY29uZCwKLQkJICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqKUFBKGZpZnRoKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfc2VtdGltZWRvcChmaXJzdCwgY29tcGF0X3B0cihwdHIpLCBzZWNvbmQsCisJCQkJCSAgICBjb21wYXRfcHRyKGZpZnRoKSk7CiAJCWJyZWFrOwogCWNhc2UgU0VNR0VUOgotCQllcnIgPSBzeXNfc2VtZ2V0IChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7CisJCWVyciA9IHN5c19zZW1nZXQoZmlyc3QsIHNlY29uZCwgdGhpcmQpOwogCQlicmVhazsKIAljYXNlIFNFTUNUTDoKLQkJZXJyID0gZG9fc3lzMzJfc2VtY3RsIChmaXJzdCwgc2Vjb25kLCB0aGlyZCwKLQkJCQkgICAgICAgKHZvaWQgX191c2VyICopQUEocHRyKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfc2VtY3RsKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBjb21wYXRfcHRyKHB0cikpOwogCQlicmVhazsKLQogCWNhc2UgTVNHU05EOgotCQllcnIgPSBkb19zeXMzMl9tc2dzbmQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkLAotCQkJCSAgICAgICAodm9pZCBfX3VzZXIgKilBQShwdHIpKTsKKwkJZXJyID0gY29tcGF0X3N5c19tc2dzbmQoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGNvbXBhdF9wdHIocHRyKSk7CiAJCWJyZWFrOwogCWNhc2UgTVNHUkNWOgotCQllcnIgPSBkb19zeXMzMl9tc2dyY3YgKGZpcnN0LCBzZWNvbmQsIGZpZnRoLCB0aGlyZCwKLQkJCQkgICAgICAgdmVyc2lvbiwgKHZvaWQgX191c2VyICopQUEocHRyKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfbXNncmN2KGZpcnN0LCBzZWNvbmQsIGZpZnRoLCB0aGlyZCwKKwkJCQkJdmVyc2lvbiwgY29tcGF0X3B0cihwdHIpKTsKIAkJYnJlYWs7CiAJY2FzZSBNU0dHRVQ6Ci0JCWVyciA9IHN5c19tc2dnZXQgKChrZXlfdCkgZmlyc3QsIHNlY29uZCk7CisJCWVyciA9IHN5c19tc2dnZXQoKGtleV90KSBmaXJzdCwgc2Vjb25kKTsKIAkJYnJlYWs7CiAJY2FzZSBNU0dDVEw6Ci0JCWVyciA9IGRvX3N5czMyX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgKHZvaWQgX191c2VyICopQUEocHRyKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfbXNnY3RsKGZpcnN0LCBzZWNvbmQsIGNvbXBhdF9wdHIocHRyKSk7CiAJCWJyZWFrOwotCiAJY2FzZSBTSE1BVDoKLQkJZXJyID0gZG9fc3lzMzJfc2htYXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkLAotCQkJCSAgICAgIHZlcnNpb24sICh2b2lkIF9fdXNlciAqKUFBKHB0cikpOworCQllcnIgPSBjb21wYXRfc3lzX3NobWF0KGZpcnN0LCBzZWNvbmQsIHRoaXJkLCB2ZXJzaW9uLAorCQkJCSAgICAgICBjb21wYXRfcHRyKHB0cikpOwogCQlicmVhazsKIAljYXNlIFNITURUOgotCQllcnIgPSBzeXNfc2htZHQgKChjaGFyIF9fdXNlciAqKUEocHRyKSk7CisJCWVyciA9IHN5c19zaG1kdChjb21wYXRfcHRyKHB0cikpOwogCQlicmVhazsKIAljYXNlIFNITUdFVDoKLQkJZXJyID0gc3lzX3NobWdldCAoZmlyc3QsICh1bnNpZ25lZClzZWNvbmQsIHRoaXJkKTsKKwkJZXJyID0gc3lzX3NobWdldChmaXJzdCwgKHVuc2lnbmVkKXNlY29uZCwgdGhpcmQpOwogCQlicmVhazsKIAljYXNlIFNITUNUTDoKLQkJZXJyID0gZG9fc3lzMzJfc2htY3RsIChmaXJzdCwgc2Vjb25kLCAodm9pZCBfX3VzZXIgKilBQShwdHIpKTsKKwkJZXJyID0gY29tcGF0X3N5c19zaG1jdGwoZmlyc3QsIHNlY29uZCwgY29tcGF0X3B0cihwdHIpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTk2OSwxOCArNDM5LDE2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NobWF0KGludCBzaG1pZCwgY2hhciBfX3VzZXIgKnNobWFkZHIsCi0JCQkgIGludCBzaG1mbGcsIGludDMyX3QgX191c2VyICphZGRyKQorI2lmZGVmIENPTkZJR19NSVBTMzJfTjMyCithc21saW5rYWdlIGxvbmcgc3lzbjMyX3NlbWN0bChpbnQgc2VtaWQsIGludCBzZW1udW0sIGludCBjbWQsIHVuaW9uIHNlbXVuIGFyZykKIHsKLQl1bnNpZ25lZCBsb25nIHJhZGRyOwotCWludCBlcnI7Ci0KLQllcnIgPSBkb19zaG1hdChzaG1pZCwgc2htYWRkciwgc2htZmxnLCAmcmFkZHIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gcHV0X3VzZXIocmFkZHIsIGFkZHIpOworCS8qIGNvbXBhdF9zeXNfc2VtY3RsIGV4cGVjdHMgYSBwb2ludGVyIHRvIHVuaW9uIHNlbXVuICovCisJdTMyIF9fdXNlciAqdXB0ciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZih1MzIpKTsKKwlpZiAocHV0X3VzZXIocHRyX3RvX2NvbXBhdChhcmcuX19wYWQpLCB1cHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGNvbXBhdF9zeXNfc2VtY3RsKHNlbWlkLCBzZW1udW0sIGNtZCwgdXB0cik7CiB9CisjZW5kaWYKIAogc3RydWN0IHN5c2N0bF9hcmdzMzIKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhZDc1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBtYWNoaW5lX2tleGVjLmMgZm9yIGtleGVjCisgKiBDcmVhdGVkIGJ5IDxuc2NoaWNoYW5AY29ycC5mcmVlLmZyPiBvbiBUaHUgT2N0IDEyIDE1OjE1OjA2IDIwMDYKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitjb25zdCBleHRlcm4gdW5zaWduZWQgY2hhciByZWxvY2F0ZV9uZXdfa2VybmVsW107Citjb25zdCBleHRlcm4gdW5zaWduZWQgaW50IHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcga2V4ZWNfc3RhcnRfYWRkcmVzczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGtleGVjX2luZGlyZWN0aW9uX3BhZ2U7CisKK2ludAorbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmtpbWFnZSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbWFjaGluZV9rZXhlY19jbGVhbnVwKHN0cnVjdCBraW1hZ2UgKmtpbWFnZSkKK3sKK30KKwordm9pZAorbWFjaGluZV9zaHV0ZG93bih2b2lkKQoreworfQorCit2b2lkCittYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCit2b2lkCittYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXVuc2lnbmVkIGxvbmcgcmVib290X2NvZGVfYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgZW50cnk7CisJdW5zaWduZWQgbG9uZyAqcHRyOworCisJcmVib290X2NvZGVfYnVmZmVyID0KKwkgICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOworCisJa2V4ZWNfc3RhcnRfYWRkcmVzcyA9IGltYWdlLT5zdGFydDsKKwlrZXhlY19pbmRpcmVjdGlvbl9wYWdlID0gcGh5c190b192aXJ0KGltYWdlLT5oZWFkICYgUEFHRV9NQVNLKTsKKworCW1lbWNweSgodm9pZCopcmVib290X2NvZGVfYnVmZmVyLCByZWxvY2F0ZV9uZXdfa2VybmVsLAorCSAgICAgICByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUpOworCisJLyoKKwkgKiBUaGUgZ2VuZXJpYyBrZXhlYyBjb2RlIGJ1aWxkcyBhIHBhZ2UgbGlzdCB3aXRoIHBoeXNpY2FsCisJICogYWRkcmVzc2VzLiB0aGV5IGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIHRocm91Z2ggS1NFRzAgKG9yCisJICogQ0tTRUcwIG9yIFhQSFlTIGlmIG9uIDY0Yml0IHN5c3RlbSksIGhlbmNlIHRoZQorCSAqIHB5c190b192aXJ0KCkgY2FsbC4KKwkgKi8KKwlmb3IgKHB0ciA9ICZpbWFnZS0+aGVhZDsgKGVudHJ5ID0gKnB0cikgJiYgIShlbnRyeSAmSU5EX0RPTkUpOworCSAgICAgcHRyID0gKGVudHJ5ICYgSU5EX0lORElSRUNUSU9OKSA/CisJICAgICAgIHBoeXNfdG9fdmlydChlbnRyeSAmIFBBR0VfTUFTSykgOiBwdHIgKyAxKSB7CisJCWlmICgqcHRyICYgSU5EX1NPVVJDRSB8fCAqcHRyICYgSU5EX0lORElSRUNUSU9OIHx8CisJCSAgICAqcHRyICYgSU5EX0RFU1RJTkFUSU9OKQorCQkJKnB0ciA9IHBoeXNfdG9fdmlydCgqcHRyKTsKKwl9CisKKwkvKgorCSAqIHdlIGRvIG5vdCB3YW50IHRvIGJlIGJvdGhlcmVkLgorCSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwlmbHVzaF9pY2FjaGVfcmFuZ2UocmVib290X2NvZGVfYnVmZmVyLAorCQkJICAgcmVib290X2NvZGVfYnVmZmVyICsgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUpOworCisJcHJpbnRrKCJXaWxsIGNhbGwgbmV3IGtlcm5lbCBhdCAlMDh4XG4iLCBpbWFnZS0+c3RhcnQpOworCXByaW50aygiQnllIC4uLlxuIik7CisJZmx1c2hfY2FjaGVfYWxsKCk7CisJKCh2b2lkICgqKSh2b2lkKSlyZWJvb3RfY29kZV9idWZmZXIpKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYwppbmRleCBkN2JmMDIxLi5jYjA4MDE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CS8qIE1PRFVMRV9TVEFSVCAqLwogCiBzdHJ1Y3QgbWlwc19oaTE2IHsKIAlzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OwpAQCAtNDMsOSArNDQsMjMgQEAKIAogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKKyNpZmRlZiBNT0RVTEVfU1RBUlQKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJaWYgKCFzaXplKQorCQlyZXR1cm4gTlVMTDsKKworCWFyZWEgPSBfX2dldF92bV9hcmVhKHNpemUsIFZNX0FMTE9DLCBNT0RVTEVfU1RBUlQsIE1PRFVMRV9FTkQpOworCWlmICghYXJlYSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gX192bWFsbG9jX2FyZWEoYXJlYSwgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwpOworI2Vsc2UKIAlpZiAoc2l6ZSA9PSAwKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gdm1hbGxvYyhzaXplKTsKKyNlbmRpZgogfQogCiAvKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gvbWlwcy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmMGQwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiByZWxvY2F0ZV9rZXJuZWwuUyBmb3Iga2V4ZWMKKyAqIENyZWF0ZWQgYnkgPG5zY2hpY2hhbkBjb3JwLmZyZWUuZnI+IG9uIFRodSBPY3QgMTIgMTc6NDk6NTcgMjAwNgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgorI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorCisJLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWwKK3JlbG9jYXRlX25ld19rZXJuZWw6CisKKwlQVFJfTAlzMCwga2V4ZWNfaW5kaXJlY3Rpb25fcGFnZQorCVBUUl9MCXMxLCBrZXhlY19zdGFydF9hZGRyZXNzCisKK3Byb2Nlc3NfZW50cnk6CisJUFRSX0wJczIsIChzMCkKKwlQVFJfQURECXMwLCBzMCwgU1pSRUcKKworCS8qIGRlc3RpbmF0aW9uIHBhZ2UgKi8KKwlhbmQJczMsIHMyLCAweDEKKwliZXEJczMsIHplcm8sIDFmCisJYW5kCXM0LCBzMiwgfjB4MQkvKiBzdG9yZSBkZXN0aW5hdGlvbiBhZGRyIGluIHM0ICovCisJbW92ZQlhMCwgczQKKwliCXByb2Nlc3NfZW50cnkKKworMToKKwkvKiBpbmRpcmVjdGlvbiBwYWdlLCB1cGRhdGUgczAgICovCisJYW5kCXMzLCBzMiwgMHgyCisJYmVxCXMzLCB6ZXJvLCAxZgorCWFuZAlzMCwgczIsIH4weDIKKwliCXByb2Nlc3NfZW50cnkKKworMToKKwkvKiBkb25lIHBhZ2UgKi8KKwlhbmQJczMsIHMyLCAweDQKKwliZXEJczMsIHplcm8sIDFmCisJYglkb25lCisxOgorCS8qIHNvdXJjZSBwYWdlICovCisJYW5kCXMzLCBzMiwgMHg4CisJYmVxCXMzLCB6ZXJvLCBwcm9jZXNzX2VudHJ5CisJYW5kCXMyLCBzMiwgfjB4OAorCWxpCXM2LCAoMSA8PCBQQUdFX1NISUZUKSAvIFNaUkVHCisKK2NvcHlfd29yZDoKKwkvKiBjb3B5IHBhZ2Ugd29yZCBieSB3b3JkICovCisJUkVHX0wJczUsIChzMikKKwlSRUdfUwlzNSwgKHM0KQorCUlOVF9BREQJczQsIHM0LCBTWlJFRworCUlOVF9BREQJczIsIHMyLCBTWlJFRworCUlOVF9TVUIJczYsIHM2LCAxCisJYmVxCXM2LCB6ZXJvLCBwcm9jZXNzX2VudHJ5CisJYgljb3B5X3dvcmQKKwliCXByb2Nlc3NfZW50cnkKKworZG9uZToKKwkvKiBqdW1wIHRvIGtleGVjX3N0YXJ0X2FkZHJlc3MgKi8KKwlqCXMxCisKKwkuZ2xvYmwga2V4ZWNfc3RhcnRfYWRkcmVzcwora2V4ZWNfc3RhcnRfYWRkcmVzczoKKwkubG9uZwkweDAKKworCS5nbG9ibCBrZXhlY19pbmRpcmVjdGlvbl9wYWdlCitrZXhlY19pbmRpcmVjdGlvbl9wYWdlOgorCS5sb25nCTB4MAorCityZWxvY2F0ZV9uZXdfa2VybmVsX2VuZDoKKworCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUKK3JlbG9jYXRlX25ld19rZXJuZWxfc2l6ZToKKwkubG9uZyByZWxvY2F0ZV9uZXdfa2VybmVsX2VuZCAtIHJlbG9jYXRlX25ld19rZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwppbmRleCBhOTVmMzdkLi43YzBiMzkzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCkBAIC02NTMsNyArNjUzLDcgQEAKIAlzeXMJc3lzX21vdmVfcGFnZXMJCTYKIAlzeXMJc3lzX3NldF9yb2J1c3RfbGlzdAkyCiAJc3lzCXN5c19nZXRfcm9idXN0X2xpc3QJMwkvKiA0MzEwICovCi0Jc3lzCXN5c19uaV9zeXNjYWxsCQkwCisJc3lzCXN5c19rZXhlY19sb2FkCQk0CiAJc3lzCXN5c19nZXRjcHUJCTMKIAlzeXMJc3lzX2Vwb2xsX3B3YWl0CQk2CiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKaW5kZXggOGZiMGY2MC4uZTU2OWI4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKQEAgLTQ2OCw2ICs0NjgsNiBAQAogCVBUUglzeXNfbW92ZV9wYWdlcwogCVBUUglzeXNfc2V0X3JvYnVzdF9saXN0CiAJUFRSCXN5c19nZXRfcm9idXN0X2xpc3QKLQlQVFIJc3lzX25pX3N5c2NhbGwJCQkvKiA1MjcwICovCisJUFRSCXN5c19rZXhlY19sb2FkCQkJLyogNTI3MCAqLwogCVBUUglzeXNfZ2V0Y3B1CiAJUFRSCXN5c19lcG9sbF9wd2FpdApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCmluZGV4IDBkYTVjYTIuLjM0NTY3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKQEAgLTE0OSw4ICsxNDksOCBAQAogCVBUUglzeXNfbWluY29yZQogCVBUUglzeXNfbWFkdmlzZQogCVBUUglzeXNfc2htZ2V0Ci0JUFRSCXN5czMyX3NobWF0Ci0JUFRSCXN5c19zaG1jdGwJCQkvKiA2MDMwICovCisJUFRSCXN5c19zaG1hdAorCVBUUgljb21wYXRfc3lzX3NobWN0bAkJCS8qIDYwMzAgKi8KIAlQVFIJc3lzX2R1cAogCVBUUglzeXNfZHVwMgogCVBUUglzeXNfcGF1c2UKQEAgLTE4NCwxMiArMTg0LDEyIEBACiAJUFRSCXN5czMyX25ld3VuYW1lCiAJUFRSCXN5c19zZW1nZXQKIAlQVFIJc3lzX3NlbW9wCi0JUFRSCXN5c19zZW1jdGwKKwlQVFIJc3lzbjMyX3NlbWN0bAogCVBUUglzeXNfc2htZHQJCQkvKiA2MDY1ICovCiAJUFRSCXN5c19tc2dnZXQKLQlQVFIJc3lzX21zZ3NuZAotCVBUUglzeXNfbXNncmN2Ci0JUFRSCXN5c19tc2djdGwKKwlQVFIJY29tcGF0X3N5c19tc2dzbmQKKwlQVFIJY29tcGF0X3N5c19tc2dyY3YKKwlQVFIJY29tcGF0X3N5c19tc2djdGwKIAlQVFIJY29tcGF0X3N5c19mY250bAkJLyogNjA3MCAqLwogCVBUUglzeXNfZmxvY2sKIAlQVFIJc3lzX2ZzeW5jCkBAIC0zMzUsNyArMzM1LDcgQEAKIAlQVFIJY29tcGF0X3N5c19mY250bDY0CiAJUFRSCXN5c19zZXRfdGlkX2FkZHJlc3MKIAlQVFIJc3lzX3Jlc3RhcnRfc3lzY2FsbAotCVBUUglzeXNfc2VtdGltZWRvcAkJCS8qIDYyMTUgKi8KKwlQVFIJY29tcGF0X3N5c19zZW10aW1lZG9wCQkJLyogNjIxNSAqLwogCVBUUglzeXNfZmFkdmlzZTY0XzY0CiAJUFRSCWNvbXBhdF9zeXNfc3RhdGZzNjQKIAlQVFIJY29tcGF0X3N5c19mc3RhdGZzNjQKQEAgLTM5NCw2ICszOTQsNiBAQAogCVBUUglzeXNfbW92ZV9wYWdlcwogCVBUUgljb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdAogCVBUUgljb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdAotCVBUUglzeXNfbmlfc3lzY2FsbAorCVBUUgljb21wYXRfc3lzX2tleGVjX2xvYWQKIAlQVFIJc3lzX2dldGNwdQogCVBUUglzeXNfZXBvbGxfcHdhaXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwppbmRleCBiOWQwMGNhLi5lOTEzNzljIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCkBAIC01MTYsNyArNTE2LDcgQEAKIAlQVFIJY29tcGF0X3N5c19tb3ZlX3BhZ2VzCiAJUFRSCWNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0CiAJUFRSCWNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0CS8qIDQzMTAgKi8KLQlQVFIJc3lzX25pX3N5c2NhbGwKKwlQVFIJY29tcGF0X3N5c19rZXhlY19sb2FkCiAJUFRSCXN5c19nZXRjcHUKIAlQVFIJc3lzX2Vwb2xsX3B3YWl0CiAJLnNpemUJc3lzX2NhbGxfdGFibGUsLi1zeXNfY2FsbF90YWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCmluZGV4IDhmNmU4OTYuLjg5NDQwYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKQEAgLTE0NSwxMyArMTQ1LDEyIEBACiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IG1lbXBhcnNlKHAsICZwKTsKIAogI2lmZGVmIENPTkZJR182NEJJVAotCS8qIEhBQ0s6IEd1ZXNzIGlmIHRoZSBzaWduIGV4dGVuc2lvbiB3YXMgZm9yZ290dGVuICovCi0JaWYgKHN0YXJ0ID4gMHgwMDAwMDAwMDgwMDAwMDAwICYmIHN0YXJ0IDwgMHgwMDAwMDAwMGZmZmZmZmZmKQotCQlzdGFydCB8PSAweGZmZmZmZmZmMDAwMDAwMDBVTDsKKwkvKiBHdWVzcyBpZiB0aGUgc2lnbiBleHRlbnNpb24gd2FzIGZvcmdvdHRlbiBieSBib290bG9hZGVyICovCisJaWYgKHN0YXJ0IDwgWEtQSFlTKQorCQlzdGFydCA9IChpbnQpc3RhcnQ7CiAjZW5kaWYKIAlpbml0cmRfc3RhcnQgPSBzdGFydDsKIAlpbml0cmRfZW5kICs9IHN0YXJ0OwotCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgicmRfc3RhcnQiLCByZF9zdGFydF9lYXJseSk7CkBAIC0xNTksNDEgKzE1OCw2NCBAQAogc3RhdGljIGludCBfX2luaXQgcmRfc2l6ZV9lYXJseShjaGFyICpwKQogewogCWluaXRyZF9lbmQgKz0gbWVtcGFyc2UocCwgJnApOwotCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgicmRfc2l6ZSIsIHJkX3NpemVfZWFybHkpOwogCisvKiBpdCByZXR1cm5zIHRoZSBuZXh0IGZyZWUgcGZuIGFmdGVyIGluaXRyZCAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGluaXRfaW5pdHJkKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXAsIGVuZCwgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGVuZDsKIAl1MzIgKmluaXRyZF9oZWFkZXI7CiAKLQlST09UX0RFViA9IFJvb3RfUkFNMDsKLQogCS8qCiAJICogQm9hcmQgc3BlY2lmaWMgY29kZSBvciBjb21tYW5kIGxpbmUgcGFyc2VyIHNob3VsZCBoYXZlCiAJICogYWxyZWFkeSBzZXQgdXAgaW5pdHJkX3N0YXJ0IGFuZCBpbml0cmRfZW5kLiBJbiB0aGVzZSBjYXNlcwogCSAqIHBlcmZvbSBzYW5pdHkgY2hlY2tzIGFuZCB1c2UgdGhlbSBpZiBhbGwgbG9va3MgZ29vZC4KIAkgKi8KLQlzaXplID0gaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydDsKLQlpZiAoaW5pdHJkX2VuZCA9PSAwIHx8IHNpemUgPT0gMCkgewotCQlpbml0cmRfc3RhcnQgPSAwOwotCQlpbml0cmRfZW5kID0gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIGluaXRyZF9lbmQ7CisJaWYgKGluaXRyZF9zdGFydCAmJiBpbml0cmRfZW5kID4gaW5pdHJkX3N0YXJ0KQorCQlnb3RvIHNhbml0aXplOwogCi0JZW5kID0gKHVuc2lnbmVkIGxvbmcpJl9lbmQ7Ci0JdG1wID0gUEFHRV9BTElHTihlbmQpIC0gc2l6ZW9mKHUzMikgKiAyOwotCWlmICh0bXAgPCBlbmQpCi0JCXRtcCArPSBQQUdFX1NJWkU7CisJLyoKKwkgKiBTZWUgaWYgaW5pdHJkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBrZXJuZWwgaW1hZ2UgYnkKKwkgKiBhcmNoL21pcHMvYm9vdC9hZGRpbml0cmQuYy4gSW4gdGhhdCBjYXNlIGEgaGVhZGVyIGlzCisJICogcHJlcGVuZGVkIHRvIGluaXRyZCBhbmQgaXMgbWFkZSB1cCBieSA4IGJ5dGVzLiBUaGUgZmlzcnQKKwkgKiB3b3JkIGlzIGEgbWFnaWMgbnVtYmVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgc2l6ZSBvZgorCSAqIGluaXRyZC4gIEluaXRyZCBzdGFydCBtdXN0IGJlIHBhZ2UgYWxpZ25lZCBpbiBhbnkgY2FzZXMuCisJICovCisJaW5pdHJkX2hlYWRlciA9IF9fdmEoUEFHRV9BTElHTihfX3BhX3N5bWJvbCgmX2VuZCkgKyA4KSkgLSA4OworCWlmIChpbml0cmRfaGVhZGVyWzBdICE9IDB4NDk0RTUyNDQpCisJCWdvdG8gZGlzYWJsZTsKKwlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZykoaW5pdHJkX2hlYWRlciArIDIpOworCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBpbml0cmRfaGVhZGVyWzFdOwogCi0JaW5pdHJkX2hlYWRlciA9ICh1MzIgKil0bXA7Ci0JaWYgKGluaXRyZF9oZWFkZXJbMF0gPT0gMHg0OTRFNTI0NCkgewotCQlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZykmaW5pdHJkX2hlYWRlclsyXTsKLQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIGluaXRyZF9oZWFkZXJbMV07CitzYW5pdGl6ZToKKwlpZiAoaW5pdHJkX3N0YXJ0ICYgflBBR0VfTUFTSykgeworCQlwcmludGsoS0VSTl9FUlIgImluaXRyZCBzdGFydCBtdXN0IGJlIHBhZ2UgYWxpZ25lZFxuIik7CisJCWdvdG8gZGlzYWJsZTsKIAl9Ci0JcmV0dXJuIGluaXRyZF9lbmQ7CisJaWYgKGluaXRyZF9zdGFydCA8IFBBR0VfT0ZGU0VUKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW5pdHJkIHN0YXJ0IDwgUEFHRV9PRkZTRVRcbiIpOworCQlnb3RvIGRpc2FibGU7CisJfQorCisJLyoKKwkgKiBTYW5pdGl6ZSBpbml0cmQgYWRkcmVzc2VzLiBGb3IgZXhhbXBsZSBmaXJtd2FyZQorCSAqIGNhbid0IGd1ZXNzIGlmIHRoZXkgbmVlZCB0byBwYXNzIHRoZW0gdGhyb3VnaAorCSAqIDY0LWJpdHMgdmFsdWVzIGlmIHRoZSBrZXJuZWwgaGFzIGJlZW4gYnVpbHQgaW4gcHVyZQorCSAqIDMyLWJpdC4gV2UgbmVlZCBhbHNvIHRvIHN3aXRjaCBmcm9tIEtTRUcwIHRvIFhLUEhZUworCSAqIGFkZHJlc3NlcyBub3csIHNvIHRoZSBjb2RlIGNhbiBub3cgc2FmZWx5IHVzZSBfX3BhKCkuCisJICovCisJZW5kID0gX19wYShpbml0cmRfZW5kKTsKKwlpbml0cmRfZW5kID0gKHVuc2lnbmVkIGxvbmcpX192YShlbmQpOworCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoX19wYShpbml0cmRfc3RhcnQpKTsKKworCVJPT1RfREVWID0gUm9vdF9SQU0wOworCXJldHVybiBQRk5fVVAoZW5kKTsKK2Rpc2FibGU6CisJaW5pdHJkX3N0YXJ0ID0gMDsKKwlpbml0cmRfZW5kID0gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGZpbmFsaXplX2luaXRyZCh2b2lkKQpAQCAtMjA0LDEyICsyMjYsMTIgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdHJkIG5vdCBmb3VuZCBvciBlbXB0eSIpOwogCQlnb3RvIGRpc2FibGU7CiAJfQotCWlmIChDUEhZU0FERFIoaW5pdHJkX2VuZCkgPiBQRk5fUEhZUyhtYXhfbG93X3BmbikpIHsKKwlpZiAoX19wYShpbml0cmRfZW5kKSA+IFBGTl9QSFlTKG1heF9sb3dfcGZuKSkgewogCQlwcmludGsoIkluaXRyZCBleHRlbmRzIGJleW9uZCBlbmQgb2YgbWVtb3J5Iik7CiAJCWdvdG8gZGlzYWJsZTsKIAl9CiAKLQlyZXNlcnZlX2Jvb3RtZW0oQ1BIWVNBRERSKGluaXRyZF9zdGFydCksIHNpemUpOworCXJlc2VydmVfYm9vdG1lbShfX3BhKGluaXRyZF9zdGFydCksIHNpemUpOwogCWluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7CiAKIAlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsIHJhbWRpc2sgYXQ6IDB4JWx4ICglbHUgYnl0ZXMpXG4iLApAQCAtMjU5LDggKzI4MSw3IEBACiAJICogbm90IHNlbGVjdGVkLiBPbmNlIHRoYXQgZG9uZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBsb3cgYm91bmQKIAkgKiBvZiB1c2FibGUgbWVtb3J5LgogCSAqLwotCXJlc2VydmVkX2VuZCA9IGluaXRfaW5pdHJkKCk7Ci0JcmVzZXJ2ZWRfZW5kID0gUEZOX1VQKENQSFlTQUREUihtYXgocmVzZXJ2ZWRfZW5kLCAodW5zaWduZWQgbG9uZykmX2VuZCkpKTsKKwlyZXNlcnZlZF9lbmQgPSBtYXgoaW5pdF9pbml0cmQoKSwgUEZOX1VQKF9fcGFfc3ltYm9sKCZfZW5kKSkpOwogCiAJLyoKIAkgKiBGaW5kIHRoZSBoaWdoZXN0IHBhZ2UgZnJhbWUgbnVtYmVyIHdlIGhhdmUgYXZhaWxhYmxlLgpAQCAtNDMyLDEwICs0NTMsMTAgQEAKIAlpZiAoVU5DQUNfQkFTRSAhPSBJT19CQVNFKQogCQlyZXR1cm47CiAKLQljb2RlX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKCZfdGV4dCk7Ci0JY29kZV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoJl9ldGV4dCkgLSAxOwotCWRhdGFfcmVzb3VyY2Uuc3RhcnQgPSB2aXJ0X3RvX3BoeXMoJl9ldGV4dCk7Ci0JZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoJl9lZGF0YSkgLSAxOworCWNvZGVfcmVzb3VyY2Uuc3RhcnQgPSBfX3BhX3N5bWJvbCgmX3RleHQpOworCWNvZGVfcmVzb3VyY2UuZW5kID0gX19wYV9zeW1ib2woJl9ldGV4dCkgLSAxOworCWRhdGFfcmVzb3VyY2Uuc3RhcnQgPSBfX3BhX3N5bWJvbCgmX2V0ZXh0KTsKKwlkYXRhX3Jlc291cmNlLmVuZCA9IF9fcGFfc3ltYm9sKCZfZWRhdGEpIC0gMTsKIAogCS8qCiAJICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgUkFNLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWxfbjMyLmMgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbF9uMzIuYwppbmRleCA0NzdjNTMzLi5hNjdjMTg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbF9uMzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbF9uMzIuYwpAQCAtMTcsNyArMTcsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKaW5kZXggMmFjMTlhNmMuLjFlZTY4OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYwpAQCAtMjc4LDcgKzI3OCw5IEBACiAKIAkvKiBuZWVkIHRvIG1hcmsgSVBJJ3MgYXMgSVJRX1BFUl9DUFUgKi8KIAlpcnFfZGVzY1tjcHVfaXBpX3Jlc2NoZWRfaXJxXS5zdGF0dXMgfD0gSVJRX1BFUl9DUFU7CisJc2V0X2lycV9oYW5kbGVyKGNwdV9pcGlfcmVzY2hlZF9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKIAlpcnFfZGVzY1tjcHVfaXBpX2NhbGxfaXJxXS5zdGF0dXMgfD0gSVJRX1BFUl9DUFU7CisJc2V0X2lycV9oYW5kbGVyKGNwdV9pcGlfY2FsbF9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCmluZGV4IGRiODA5NTcuLmYyYTg3MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAKIAlzcGluX2xvY2soJnNtcF9jYWxsX2xvY2spOwogCWNhbGxfZGF0YSA9ICZkYXRhOwotCW1iKCk7CisJc21wX21iKCk7CiAKIAkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgQ1BVcyBhbmQgd2FpdCBmb3IgdGhlbSB0byByZXNwb25kICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQpAQCAtMjA0LDcgKzIwNCw3IEBACiAJICogTm90aWZ5IGluaXRpYXRpbmcgQ1BVIHRoYXQgSSd2ZSBncmFiYmVkIHRoZSBkYXRhIGFuZCBhbQogCSAqIGFib3V0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLgogCSAqLwotCW1iKCk7CisJc21wX21iKCk7CiAJYXRvbWljX2luYygmY2FsbF9kYXRhLT5zdGFydGVkKTsKIAogCS8qCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlpcnFfZXhpdCgpOwogCiAJaWYgKHdhaXQpIHsKLQkJbWIoKTsKKwkJc21wX21iKCk7CiAJCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+ZmluaXNoZWQpOwogCX0KIH0KQEAgLTQ2MywyOCArNDYzLDUgQEAKIAlzbXBfb25fZWFjaF90bGIoZmx1c2hfdGxiX29uZV9pcGksICh2b2lkICopIHZhZGRyKTsKIH0KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKLQotc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQotewotCWludCBpLCByZXQ7Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCi0JCXJlZ2lzdGVyX29uZV9ub2RlKGkpOwotI2VuZGlmIC8qIENPTkZJR19OVU1BICovCi0KLQlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7Ci0JCXJldCA9IHJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGV2aWNlcywgaSksIGkpOwotCQlpZiAocmV0KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9wb2xvZ3lfaW5pdDogcmVnaXN0ZXJfY3B1ICVkICIKLQkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGksIHJldCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKLQogRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9vbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMgYi9hcmNoL21pcHMva2VybmVsL3NtdGMuYwppbmRleCAzYjc4Y2FmLi44MDJmZWJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtdGMuYwpAQCAtMTAwOSw2ICsxMDA5LDcgQEAKIAlzZXR1cF9pcnFfc210YyhjcHVfaXBpX2lycSwgJmlycV9pcGksICgweDEwMCA8PCBNSVBTX0NQVV9JUElfSVJRKSk7CiAKIAlpcnFfZGVzY1tjcHVfaXBpX2lycV0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOworCXNldF9pcnFfaGFuZGxlcihjcHVfaXBpX2lycSwgaGFuZGxlX3BlcmNwdV9pcnEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwppbmRleCBlNTM1Zjg2Li4xMWFhYjZkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwpAQCAtMTEsNyArMTEsNiBAQAogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTgzLDE3ICs4MiwxMSBAQAogLyoKICAqIE51bGwgaGlnaCBwcmVjaXNpb24gdGltZXIgZnVuY3Rpb25zIGZvciBzeXN0ZW1zIGxhY2tpbmcgb25lLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG51bGxfaHB0X3JlYWQodm9pZCkKK3N0YXRpYyBjeWNsZV90IG51bGxfaHB0X3JlYWQodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG51bGxfaHB0X2luaXQodm9pZCkKLXsKLQkvKiBub3RoaW5nICovCi19Ci0KLQogLyoKICAqIFRpbWVyIGFjayBmb3IgYW4gUjRrLWNvbXBhdGlibGUgdGltZXIgb2YgYSBrbm93biBmcmVxdWVuY3kuCiAgKi8KQEAgLTExOCw3ICsxMTEsNyBAQAogLyoKICAqIEhpZ2ggcHJlY2lzaW9uIHRpbWVyIGZ1bmN0aW9ucyBmb3IgYSBSNGstY29tcGF0aWJsZSB0aW1lci4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjMF9ocHRfcmVhZCh2b2lkKQorc3RhdGljIGN5Y2xlX3QgYzBfaHB0X3JlYWQodm9pZCkKIHsKIAlyZXR1cm4gcmVhZF9jMF9jb3VudCgpOwogfQpAQCAtMTMyLDkgKzEyNSw2IEBACiAKIGludCAoKm1pcHNfdGltZXJfc3RhdGUpKHZvaWQpOwogdm9pZCAoKm1pcHNfdGltZXJfYWNrKSh2b2lkKTsKLXVuc2lnbmVkIGludCAoKm1pcHNfaHB0X3JlYWQpKHZvaWQpOwotdm9pZCAoKm1pcHNfaHB0X2luaXQpKHZvaWQpIF9faW5pdGRhdGEgPSBudWxsX2hwdF9pbml0OwotdW5zaWduZWQgaW50IG1pcHNfaHB0X21hc2sgPSAweGZmZmZmZmZmOwogCiAvKiBsYXN0IHRpbWUgd2hlbiB4dGltZSBhbmQgcnRjIGFyZSBzeW5jJ2VkIHVwICovCiBzdGF0aWMgbG9uZyBsYXN0X3J0Y191cGRhdGU7CkBAIC0yNzYsOCArMjY2LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgY2FsaWJyYXRlX2hwdCh2b2lkKQogewotCXU2NCBmcmVxdWVuY3k7Ci0JdTMyIGhwdF9zdGFydCwgaHB0X2VuZCwgaHB0X2NvdW50LCBoejsKKwljeWNsZV90IGZyZXF1ZW5jeSwgaHB0X3N0YXJ0LCBocHRfZW5kLCBocHRfY291bnQsIGh6OwogCiAJY29uc3QgaW50IGxvb3BzID0gSFogLyAxMDsKIAlpbnQgbG9nXzJfbG9vcHMgPSAwOwpAQCAtMzAzLDI4ICsyOTIsMjMgQEAKIAkgKiBkdXJpbmcgdGhlIGNhbGN1bGF0ZWQgbnVtYmVyIG9mIHBlcmlvZHMgYmV0d2VlbiB0aW1lcgogCSAqIGludGVycnVwdHMuCiAJICovCi0JaHB0X3N0YXJ0ID0gbWlwc19ocHRfcmVhZCgpOworCWhwdF9zdGFydCA9IGNsb2Nrc291cmNlX21pcHMucmVhZCgpOwogCWRvIHsKIAkJd2hpbGUgKG1pcHNfdGltZXJfc3RhdGUoKSk7CiAJCXdoaWxlICghbWlwc190aW1lcl9zdGF0ZSgpKTsKIAl9IHdoaWxlICgtLWkpOwotCWhwdF9lbmQgPSBtaXBzX2hwdF9yZWFkKCk7CisJaHB0X2VuZCA9IGNsb2Nrc291cmNlX21pcHMucmVhZCgpOwogCi0JaHB0X2NvdW50ID0gKGhwdF9lbmQgLSBocHRfc3RhcnQpICYgbWlwc19ocHRfbWFzazsKKwlocHRfY291bnQgPSAoaHB0X2VuZCAtIGhwdF9zdGFydCkgJiBjbG9ja3NvdXJjZV9taXBzLm1hc2s7CiAJaHogPSBIWjsKLQlmcmVxdWVuY3kgPSAodTY0KWhwdF9jb3VudCAqICh1NjQpaHo7CisJZnJlcXVlbmN5ID0gaHB0X2NvdW50ICogaHo7CiAKIAlyZXR1cm4gZnJlcXVlbmN5ID4+IGxvZ18yX2xvb3BzOwogfQogCi1zdGF0aWMgY3ljbGVfdCByZWFkX21pcHNfaHB0KHZvaWQpCi17Ci0JcmV0dXJuIChjeWNsZV90KW1pcHNfaHB0X3JlYWQoKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9taXBzID0geworc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX21pcHMgPSB7CiAJLm5hbWUJCT0gIk1JUFMiLAotCS5yZWFkCQk9IHJlYWRfbWlwc19ocHQsCisJLm1hc2sJCT0gMHhmZmZmZmZmZiwKIAkuaXNfY29udGludW91cwk9IDEsCiB9OwogCkBAIC0zMzMsNyArMzE3LDcgQEAKIAl1NjQgdGVtcDsKIAl1MzIgc2hpZnQ7CiAKLQlpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSB8fCBtaXBzX2hwdF9yZWFkID09IG51bGxfaHB0X3JlYWQpCisJaWYgKCFtaXBzX2hwdF9mcmVxdWVuY3kgfHwgY2xvY2tzb3VyY2VfbWlwcy5yZWFkID09IG51bGxfaHB0X3JlYWQpCiAJCXJldHVybjsKIAogCS8qIENhbGNsYXRlIGEgc29tZXdoYXQgcmVhc29uYWJsZSByYXRpbmcgdmFsdWUgKi8KQEAgLTM0Nyw3ICszMzEsNiBAQAogCX0KIAljbG9ja3NvdXJjZV9taXBzLnNoaWZ0ID0gc2hpZnQ7CiAJY2xvY2tzb3VyY2VfbWlwcy5tdWx0ID0gKHUzMil0ZW1wOwotCWNsb2Nrc291cmNlX21pcHMubWFzayA9IG1pcHNfaHB0X21hc2s7CiAKIAljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbWlwcyk7CiB9CkBAIC0zNjcsMzIgKzM1MCwzNiBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgIC14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKIAogCS8qIENob29zZSBhcHByb3ByaWF0ZSBoaWdoIHByZWNpc2lvbiB0aW1lciByb3V0aW5lcy4gICovCi0JaWYgKCFjcHVfaGFzX2NvdW50ZXIgJiYgIW1pcHNfaHB0X3JlYWQpCisJaWYgKCFjcHVfaGFzX2NvdW50ZXIgJiYgIWNsb2Nrc291cmNlX21pcHMucmVhZCkKIAkJLyogTm8gaGlnaCBwcmVjaXNpb24gdGltZXIgLS0gc29ycnkuICAqLwotCQltaXBzX2hwdF9yZWFkID0gbnVsbF9ocHRfcmVhZDsKKwkJY2xvY2tzb3VyY2VfbWlwcy5yZWFkID0gbnVsbF9ocHRfcmVhZDsKIAllbHNlIGlmICghbWlwc19ocHRfZnJlcXVlbmN5ICYmICFtaXBzX3RpbWVyX3N0YXRlKSB7CiAJCS8qIEEgaGlnaCBwcmVjaXNpb24gdGltZXIgb2YgdW5rbm93biBmcmVxdWVuY3kuICAqLwotCQlpZiAoIW1pcHNfaHB0X3JlYWQpCisJCWlmICghY2xvY2tzb3VyY2VfbWlwcy5yZWFkKQogCQkJLyogTm8gZXh0ZXJuYWwgaGlnaCBwcmVjaXNpb24gdGltZXIgLS0gdXNlIFI0ay4gICovCi0JCQltaXBzX2hwdF9yZWFkID0gYzBfaHB0X3JlYWQ7CisJCQljbG9ja3NvdXJjZV9taXBzLnJlYWQgPSBjMF9ocHRfcmVhZDsKIAl9IGVsc2UgewogCQkvKiBXZSBrbm93IGNvdW50ZXIgZnJlcXVlbmN5LiAgT3Igd2UgY2FuIGdldCBpdC4gICovCi0JCWlmICghbWlwc19ocHRfcmVhZCkgeworCQlpZiAoIWNsb2Nrc291cmNlX21pcHMucmVhZCkgewogCQkJLyogTm8gZXh0ZXJuYWwgaGlnaCBwcmVjaXNpb24gdGltZXIgLS0gdXNlIFI0ay4gICovCi0JCQltaXBzX2hwdF9yZWFkID0gYzBfaHB0X3JlYWQ7CisJCQljbG9ja3NvdXJjZV9taXBzLnJlYWQgPSBjMF9ocHRfcmVhZDsKIAogCQkJaWYgKCFtaXBzX3RpbWVyX3N0YXRlKSB7CiAJCQkJLyogTm8gZXh0ZXJuYWwgdGltZXIgaW50ZXJydXB0IC0tIHVzZSBSNGsuICAqLwotCQkJCW1pcHNfaHB0X2luaXQgPSBjMF9ocHRfdGltZXJfaW5pdDsKIAkJCQltaXBzX3RpbWVyX2FjayA9IGMwX3RpbWVyX2FjazsKKwkJCQkvKiBDYWxjdWxhdGUgY2FjaGUgcGFyYW1ldGVycy4gICovCisJCQkJY3ljbGVzX3Blcl9qaWZmeSA9CisJCQkJCShtaXBzX2hwdF9mcmVxdWVuY3kgKyBIWiAvIDIpIC8gSFo7CisJCQkJLyoKKwkJCQkgKiBUaGlzIHNldHMgdXAgdGhlIGhpZ2ggcHJlY2lzaW9uCisJCQkJICogdGltZXIgZm9yIHRoZSBmaXJzdCBpbnRlcnJ1cHQuCisJCQkJICovCisJCQkJYzBfaHB0X3RpbWVyX2luaXQoKTsKIAkJCX0KIAkJfQogCQlpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSkKIAkJCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IGNhbGlicmF0ZV9ocHQoKTsKIAotCQkvKiBDYWxjdWxhdGUgY2FjaGUgcGFyYW1ldGVycy4gICovCi0JCWN5Y2xlc19wZXJfamlmZnkgPSAobWlwc19ocHRfZnJlcXVlbmN5ICsgSFogLyAyKSAvIEhaOwotCiAJCS8qIFJlcG9ydCB0aGUgaGlnaCBwcmVjaXNpb24gdGltZXIgcmF0ZSBmb3IgYSByZWZlcmVuY2UuICAqLwogCQlwcmludGsoIlVzaW5nICV1LiUwM3UgTUh6IGhpZ2ggcHJlY2lzaW9uIHRpbWVyLlxuIiwKIAkJICAgICAgICgobWlwc19ocHRfZnJlcXVlbmN5ICsgNTAwKSAvIDEwMDApIC8gMTAwMCwKQEAgLTQwMyw5ICszOTAsNiBAQAogCQkvKiBObyB0aW1lciBpbnRlcnJ1cHQgYWNrIChlLmcuIGk4MjU0KS4gICovCiAJCW1pcHNfdGltZXJfYWNrID0gbnVsbF90aW1lcl9hY2s7CiAKLQkvKiBUaGlzIHNldHMgdXAgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIGZvciB0aGUgZmlyc3QgaW50ZXJydXB0LiAgKi8KLQltaXBzX2hwdF9pbml0KCk7Ci0KIAkvKgogCSAqIENhbGwgYm9hcmQgc3BlY2lmaWMgdGltZXIgaW50ZXJydXB0IHNldHVwLgogCSAqCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL21pcHMva2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwZTQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMCwwICsxLDI5IEBACisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKKworc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisKKyNpZmRlZiBDT05GSUdfTlVNQQorCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCisJCXJlZ2lzdGVyX29uZV9ub2RlKGkpOworI2VuZGlmIC8qIENPTkZJR19OVU1BICovCisKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7CisJCXJldCA9IHJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGV2aWNlcywgaSksIGkpOworCQlpZiAocmV0KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9wb2xvZ3lfaW5pdDogcmVnaXN0ZXJfY3B1ICVkICIKKwkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGksIHJldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCA5ZmRhMWI4Li4yYTkzMmNhZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwpAQCAtNTQsNiArNTQsOCBAQAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfc3lzKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfYnAodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9yaSh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX3JpX3JkaHdyX3ZpdnQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9yaV9yZGh3cih2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX2NwdSh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX292KHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfdHIodm9pZCk7CkBAIC0zOTcsMTkgKzM5OSw2IEBACiAJZm9yY2Vfc2lnKFNJR0JVUywgY3VycmVudCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9pbnNuX29wY29kZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50ICpvcGNvZGUpCi17Ci0JdW5zaWduZWQgaW50IF9fdXNlciAqZXBjOwotCi0JZXBjID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKikgcmVncy0+Y3AwX2VwYyArCi0JICAgICAgKChyZWdzLT5jcDBfY2F1c2UgJiBDQVVTRUZfQkQpICE9IDApOwotCWlmICghZ2V0X3VzZXIoKm9wY29kZSwgZXBjKSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7Ci0JcmV0dXJuIDE7Ci19Ci0KIC8qCiAgKiBsbC9zYyBlbXVsYXRpb24KICAqLwpAQCAtNTQ0LDggKzUzMyw4IEBACiB7CiAJdW5zaWduZWQgaW50IG9wY29kZTsKIAotCWlmICh1bmxpa2VseShnZXRfaW5zbl9vcGNvZGUocmVncywgJm9wY29kZSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoZ2V0X3VzZXIob3Bjb2RlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBleGNlcHRpb25fZXBjKHJlZ3MpKSkKKwkJZ290byBvdXRfc2lnc2VndjsKIAogCWlmICgob3Bjb2RlICYgT1BDT0RFKSA9PSBMTCkgewogCQlzaW11bGF0ZV9sbChyZWdzLCBvcGNvZGUpOwpAQCAtNTU3LDYgKzU0NiwxMCBAQAogCX0KIAogCXJldHVybiAtRUZBVUxUOwkJCS8qIFN0cmFuZ2UgdGhpbmdzIGdvaW5nIG9uIC4uLiAqLworCitvdXRfc2lnc2VndjoKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIC8qCkBAIC01NjksOCArNTYyLDggQEAKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhjdXJyZW50KTsKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlOwogCi0JaWYgKHVubGlrZWx5KGdldF9pbnNuX29wY29kZShyZWdzLCAmb3Bjb2RlKSkpCi0JCXJldHVybiAtRUZBVUxUOworCWlmIChnZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGV4Y2VwdGlvbl9lcGMocmVncykpKQorCQlnb3RvIG91dF9zaWdzZWd2OwogCiAJaWYgKHVubGlrZWx5KGNvbXB1dGVfcmV0dXJuX2VwYyhyZWdzKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNTg5LDYgKzU4MiwxMCBAQAogCiAJLyogTm90IG91cnMuICAqLwogCXJldHVybiAtRUZBVUxUOworCitvdXRfc2lnc2VndjoKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19vdihzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTY3MiwxMCArNjY5LDggQEAKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlLCBiY29kZTsKIAlzaWdpbmZvX3QgaW5mbzsKIAotCWRpZV9pZl9rZXJuZWwoIkJyZWFrIGluc3RydWN0aW9uIGluIGtlcm5lbCBjb2RlIiwgcmVncyk7Ci0KLQlpZiAoZ2V0X2luc25fb3Bjb2RlKHJlZ3MsICZvcGNvZGUpKQotCQlyZXR1cm47CisJaWYgKGdldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZXhjZXB0aW9uX2VwYyhyZWdzKSkpCisJCWdvdG8gb3V0X3NpZ3NlZ3Y7CiAKIAkvKgogCSAqIFRoZXJlIGlzIHRoZSBhbmNpZW50IGJ1ZyBpbiB0aGUgTUlQUyBhc3NlbWJsZXJzIHRoYXQgdGhlIGJyZWFrCkBAIC02OTYsNiArNjkxLDcgQEAKIAlzd2l0Y2ggKGJjb2RlKSB7CiAJY2FzZSBCUktfT1ZFUkZMT1cgPDwgMTA6CiAJY2FzZSBCUktfRElWWkVSTyA8PCAxMDoKKwkJZGllX2lmX2tlcm5lbCgiQnJlYWsgaW5zdHJ1Y3Rpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzKTsKIAkJaWYgKGJjb2RlID09IChCUktfRElWWkVSTyA8PCAxMCkpCiAJCQlpbmZvLnNpX2NvZGUgPSBGUEVfSU5URElWOwogCQllbHNlCkBAIC03MDUsOSArNzAxLDE2IEBACiAJCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKSByZWdzLT5jcDBfZXBjOwogCQlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCBjdXJyZW50KTsKIAkJYnJlYWs7CisJY2FzZSBCUktfQlVHOgorCQlkaWUoIktlcm5lbCBidWcgZGV0ZWN0ZWQiLCByZWdzKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJZGllX2lmX2tlcm5lbCgiQnJlYWsgaW5zdHJ1Y3Rpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzKTsKIAkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwogCX0KKworb3V0X3NpZ3NlZ3Y6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fdHIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC03MTUsMTAgKzcxOCw4IEBACiAJdW5zaWduZWQgaW50IG9wY29kZSwgdGNvZGUgPSAwOwogCXNpZ2luZm9fdCBpbmZvOwogCi0JZGllX2lmX2tlcm5lbCgiVHJhcCBpbnN0cnVjdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MpOwotCi0JaWYgKGdldF9pbnNuX29wY29kZShyZWdzLCAmb3Bjb2RlKSkKLQkJcmV0dXJuOworCWlmIChnZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGV4Y2VwdGlvbl9lcGMocmVncykpKQorCQlnb3RvIG91dF9zaWdzZWd2OwogCiAJLyogSW1tZWRpYXRlIHZlcnNpb25zIGRvbid0IHByb3ZpZGUgYSBjb2RlLiAgKi8KIAlpZiAoIShvcGNvZGUgJiBPUENPREUpKQpAQCAtNzMzLDYgKzczNCw3IEBACiAJc3dpdGNoICh0Y29kZSkgewogCWNhc2UgQlJLX09WRVJGTE9XOgogCWNhc2UgQlJLX0RJVlpFUk86CisJCWRpZV9pZl9rZXJuZWwoIlRyYXAgaW5zdHJ1Y3Rpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzKTsKIAkJaWYgKHRjb2RlID09IEJSS19ESVZaRVJPKQogCQkJaW5mby5zaV9jb2RlID0gRlBFX0lOVERJVjsKIAkJZWxzZQpAQCAtNzQyLDkgKzc0NCwxNiBAQAogCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKikgcmVncy0+Y3AwX2VwYzsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgY3VycmVudCk7CiAJCWJyZWFrOworCWNhc2UgQlJLX0JVRzoKKwkJZGllKCJLZXJuZWwgYnVnIGRldGVjdGVkIiwgcmVncyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWRpZV9pZl9rZXJuZWwoIlRyYXAgaW5zdHJ1Y3Rpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzKTsKIAkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwogCX0KKworb3V0X3NpZ3NlZ3Y6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fcmkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0xNDIzLDYgKzE0MzIsMTUgQEAKIAltZW1jcHkoKHZvaWQgKikodW5jYWNoZWRfZWJhc2UgKyBvZmZzZXQpLCBhZGRyLCBzaXplKTsKIH0KIAorc3RhdGljIGludCBfX2luaXRkYXRhIHJkaHdyX25vb3B0Oworc3RhdGljIGludCBfX2luaXQgc2V0X3JkaHdyX25vb3B0KGNoYXIgKnN0cikKK3sKKwlyZGh3cl9ub29wdCA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJkaHdyX25vb3B0Iiwgc2V0X3JkaHdyX25vb3B0KTsKKwogdm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCiB7CiAJZXh0ZXJuIGNoYXIgZXhjZXB0X3ZlYzNfZ2VuZXJpYywgZXhjZXB0X3ZlYzNfcjQwMDA7CkBAIC0xNTAyLDcgKzE1MjAsOSBAQAogCiAJc2V0X2V4Y2VwdF92ZWN0b3IoOCwgaGFuZGxlX3N5cyk7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoOSwgaGFuZGxlX2JwKTsKLQlzZXRfZXhjZXB0X3ZlY3RvcigxMCwgaGFuZGxlX3JpKTsKKwlzZXRfZXhjZXB0X3ZlY3RvcigxMCwgcmRod3Jfbm9vcHQgPyBoYW5kbGVfcmkgOgorCQkJICAoY3B1X2hhc192dGFnX2ljYWNoZSA/CisJCQkgICBoYW5kbGVfcmlfcmRod3Jfdml2dCA6IGhhbmRsZV9yaV9yZGh3cikpOwogCXNldF9leGNlcHRfdmVjdG9yKDExLCBoYW5kbGVfY3B1KTsKIAlzZXRfZXhjZXB0X3ZlY3RvcigxMiwgaGFuZGxlX292KTsKIAlzZXRfZXhjZXB0X3ZlY3RvcigxMywgaGFuZGxlX3RyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9pbnRlcnJ1cHQuYyBiL2FyY2gvbWlwcy9sYXNhdC9pbnRlcnJ1cHQuYwppbmRleCBhMTQ0YTAwLi40YTg0YTdiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L2ludGVycnVwdC5jCkBAIC0zNiwzMyArMzYsMTQgQEAKIAogdm9pZCBkaXNhYmxlX2xhc2F0X2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJKmxhc2F0X2ludF9tYXNrICY9IH4oMSA8PCBpcnFfbnIpIDw8IGxhc2F0X2ludF9tYXNrX3NoaWZ0OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogdm9pZCBlbmFibGVfbGFzYXRfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkqbGFzYXRfaW50X21hc2sgfD0gKDEgPDwgaXJxX25yKSA8PCBsYXNhdF9pbnRfbWFza19zaGlmdDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sYXNhdF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbGFzYXRfaXJxKGlycSk7Ci0KLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX2xhc2F0X2lycQlkaXNhYmxlX2xhc2F0X2lycQotCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19sYXNhdF9pcnEgZGlzYWJsZV9sYXNhdF9pcnEKLQogc3RhdGljIHZvaWQgZW5kX2xhc2F0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQpAQCAtNzEsMTEgKzUyLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbGFzYXRfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkxhc2F0IiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfbGFzYXRfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2xhc2F0X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2xhc2F0X2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfbGFzYXRfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfbGFzYXRfaXJxLAorCS5hY2sgPSBkaXNhYmxlX2xhc2F0X2lycSwKKwkubWFzayA9IGRpc2FibGVfbGFzYXRfaXJxLAorCS5tYXNrX2FjayA9IGRpc2FibGVfbGFzYXRfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfbGFzYXRfaXJxLAogCS5lbmQgPSBlbmRfbGFzYXRfaXJxLAogfTsKIApAQCAtMTUyLDEwICsxMzIsNiBAQAogCQlwYW5pYygiYXJjaF9pbml0X2lycTogbWlwc19tYWNodHlwZSBpbmNvcnJlY3QiKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDw9IExBU0FUSU5UX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cwk9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uCT0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGgJPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwCT0gJmxhc2F0X2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSAwOyBpIDw9IExBU0FUSU5UX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmxhc2F0X2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItMzIvTWFrZWZpbGUgYi9hcmNoL21pcHMvbGliLTMyL01ha2VmaWxlCmluZGV4IGFkMjg1NzguLmRjZDRkMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWItMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2xpYi0zMi9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIE1JUFMtc3BlY2lmaWMgbGlicmFyeSBmaWxlcy4uCiAjCiAKLWxpYi15CSs9IGNzdW1fcGFydGlhbC5vIG1lbXNldC5vIHdhdGNoLm8KK2xpYi15CSs9IG1lbXNldC5vIHdhdGNoLm8KIAogb2JqLSQoQ09ORklHX0NQVV9NSVBTMzIpCSs9IGR1bXBfdGxiLm8KIG9iai0kKENPTkZJR19DUFVfTUlQUzY0KQkrPSBkdW1wX3RsYi5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliLTMyL2NzdW1fcGFydGlhbC5TIGIvYXJjaC9taXBzL2xpYi0zMi9jc3VtX3BhcnRpYWwuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyNTdkYi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbGliLTMyL2NzdW1fcGFydGlhbC5TCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggUmFsZiBCYWVjaGxlCi0gKi8KLSNpbmNsdWRlIDxhc20vYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgotCi0jZGVmaW5lIEFEREMoc3VtLHJlZykJCQlcCi0JYWRkdQlzdW0sIHJlZzsJCVwKLQlzbHR1CXYxLCBzdW0sIHJlZzsJCVwKLQlhZGR1CXN1bSwgdjEKLQotI2RlZmluZSBDU1VNX0JJR0NIVU5LKHNyYywgb2Zmc2V0LCBzdW0sIHQwLCB0MSwgdDIsIHQzKSBcCi0JbHcJdDAsIChvZmZzZXQgKyAweDAwKShzcmMpOyBcCi0JbHcJdDEsIChvZmZzZXQgKyAweDA0KShzcmMpOyBcCi0JbHcJdDIsIChvZmZzZXQgKyAweDA4KShzcmMpOyBcCi0JbHcJdDMsIChvZmZzZXQgKyAweDBjKShzcmMpOyBcCi0JQUREQyhzdW0sIHQwKTsgICAgICAgICAgICAgICAgICAgIFwKLQlBRERDKHN1bSwgdDEpOyAgICAgICAgICAgICAgICAgICAgXAotCUFEREMoc3VtLCB0Mik7ICAgICAgICAgICAgICAgICAgICBcCi0JQUREQyhzdW0sIHQzKTsgICAgICAgICAgICAgICAgICAgIFwKLQlsdwl0MCwgKG9mZnNldCArIDB4MTApKHNyYyk7IFwKLQlsdwl0MSwgKG9mZnNldCArIDB4MTQpKHNyYyk7IFwKLQlsdwl0MiwgKG9mZnNldCArIDB4MTgpKHNyYyk7IFwKLQlsdwl0MywgKG9mZnNldCArIDB4MWMpKHNyYyk7IFwKLQlBRERDKHN1bSwgdDApOyAgICAgICAgICAgICAgICAgICAgXAotCUFEREMoc3VtLCB0MSk7ICAgICAgICAgICAgICAgICAgICBcCi0JQUREQyhzdW0sIHQyKTsgICAgICAgICAgICAgICAgICAgIFwKLQlBRERDKHN1bSwgdDMpOyAgICAgICAgICAgICAgICAgICAgXAotCi0vKgotICogYTA6IHNvdXJjZSBhZGRyZXNzCi0gKiBhMTogbGVuZ3RoIG9mIHRoZSBhcmVhIHRvIGNoZWNrc3VtCi0gKiBhMjogcGFydGlhbCBjaGVja3N1bQotICovCi0KLSNkZWZpbmUgc3JjIGEwCi0jZGVmaW5lIGRlc3QgYTEKLSNkZWZpbmUgc3VtIHYwCi0KLQkudGV4dAotCS5zZXQJbm9yZW9yZGVyCi0KLS8qIHVua25vd24gc3JjIGFsaWdubWVudCBhbmQgPCA4IGJ5dGVzIHRvIGdvICAqLwotc21hbGxfY3N1bWNweToKLQltb3ZlCWExLCB0MgotCi0JYW5kaQl0MCwgYTEsIDQKLQliZXF6CXQwLCAxZgotCSBhbmRpCXQwLCBhMSwgMgotCi0JLyogU3RpbGwgYSBmdWxsIHdvcmQgdG8gZ28gICovCi0JdWx3CXQxLCAoc3JjKQotCWFkZGl1CXNyYywgNAotCUFEREMoc3VtLCB0MSkKLQotMToJbW92ZQl0MSwgemVybwotCWJlcXoJdDAsIDFmCi0JIGFuZGkJdDAsIGExLCAxCi0KLQkvKiBTdGlsbCBhIGhhbGZ3b3JkIHRvIGdvICAqLwotCXVsaHUJdDEsIChzcmMpCi0JYWRkaXUJc3JjLCAyCi0KLTE6CWJlcXoJdDAsIDFmCi0JIHNsbAl0MSwgdDEsIDE2Ci0KLQlsYnUJdDIsIChzcmMpCi0JIG5vcAotCi0jaWZkZWYgX19NSVBTRUJfXwotCXNsbAl0MiwgdDIsIDgKLSNlbmRpZgotCW9yCXQxLCB0MgotCi0xOglBRERDKHN1bSwgdDEpCi0KLQkvKiBmb2xkIGNoZWNrc3VtICovCi0Jc2xsCXYxLCBzdW0sIDE2Ci0JYWRkdQlzdW0sIHYxCi0Jc2x0dQl2MSwgc3VtLCB2MQotCXNybAlzdW0sIHN1bSwgMTYKLQlhZGR1CXN1bSwgdjEKLQotCS8qIG9kZCBidWZmZXIgYWxpZ25tZW50PyAqLwotCWJlcXoJdDcsIDFmCi0JIG5vcAotCXNsbAl2MSwgc3VtLCA4Ci0Jc3JsCXN1bSwgc3VtLCA4Ci0Jb3IJc3VtLCB2MQotCWFuZGkJc3VtLCAweGZmZmYKLTE6Ci0JLnNldAlyZW9yZGVyCi0JLyogQWRkIHRoZSBwYXNzZWQgcGFydGlhbCBjc3VtLiAgKi8KLQlBRERDKHN1bSwgYTIpCi0JanIJcmEKLQkuc2V0CW5vcmVvcmRlcgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkuYWxpZ24JNQotTEVBRihjc3VtX3BhcnRpYWwpCi0JbW92ZQlzdW0sIHplcm8KLQltb3ZlCXQ3LCB6ZXJvCi0KLQlzbHRpdQl0OCwgYTEsIDB4OAotCWJuZXoJdDgsIHNtYWxsX2NzdW1jcHkJCS8qIDwgOCBieXRlcyB0byBjb3B5ICovCi0JIG1vdmUJdDIsIGExCi0KLQliZXF6CWExLCBvdXQKLQkgYW5kaQl0Nywgc3JjLCAweDEJCQkvKiBvZGQgYnVmZmVyPyAqLwotCi1od29yZF9hbGlnbjoKLQliZXF6CXQ3LCB3b3JkX2FsaWduCi0JIGFuZGkJdDgsIHNyYywgMHgyCi0KLQlsYnUJdDAsIChzcmMpCi0Jc3VidQlhMSwgYTEsIDB4MQotI2lmZGVmIF9fTUlQU0VMX18KLQlzbGwJdDAsIHQwLCA4Ci0jZW5kaWYKLQlBRERDKHN1bSwgdDApCi0JYWRkdQlzcmMsIHNyYywgMHgxCi0JYW5kaQl0OCwgc3JjLCAweDIKLQotd29yZF9hbGlnbjoKLQliZXF6CXQ4LCBkd29yZF9hbGlnbgotCSBzbHRpdQl0OCwgYTEsIDU2Ci0KLQlsaHUJdDAsIChzcmMpCi0Jc3VidQlhMSwgYTEsIDB4MgotCUFEREMoc3VtLCB0MCkKLQlzbHRpdQl0OCwgYTEsIDU2Ci0JYWRkdQlzcmMsIHNyYywgMHgyCi0KLWR3b3JkX2FsaWduOgotCWJuZXoJdDgsIGRvX2VuZF93b3JkcwotCSBtb3ZlCXQ4LCBhMQotCi0JYW5kaQl0OCwgc3JjLCAweDQKLQliZXF6CXQ4LCBxd29yZF9hbGlnbgotCSBhbmRpCXQ4LCBzcmMsIDB4OAotCi0JbHcJdDAsIDB4MDAoc3JjKQotCXN1YnUJYTEsIGExLCAweDQKLQlBRERDKHN1bSwgdDApCi0JYWRkdQlzcmMsIHNyYywgMHg0Ci0JYW5kaQl0OCwgc3JjLCAweDgKLQotcXdvcmRfYWxpZ246Ci0JYmVxegl0OCwgb3dvcmRfYWxpZ24KLQkgYW5kaQl0OCwgc3JjLCAweDEwCi0KLQlsdwl0MCwgMHgwMChzcmMpCi0JbHcJdDEsIDB4MDQoc3JjKQotCXN1YnUJYTEsIGExLCAweDgKLQlBRERDKHN1bSwgdDApCi0JQUREQyhzdW0sIHQxKQotCWFkZHUJc3JjLCBzcmMsIDB4OAotCWFuZGkJdDgsIHNyYywgMHgxMAotCi1vd29yZF9hbGlnbjoKLQliZXF6CXQ4LCBiZWdpbl9tb3ZlbWVudAotCSBzcmwJdDgsIGExLCAweDcKLQotCWx3CXQzLCAweDA4KHNyYykKLQlsdwl0NCwgMHgwYyhzcmMpCi0JbHcJdDAsIDB4MDAoc3JjKQotCWx3CXQxLCAweDA0KHNyYykKLQlBRERDKHN1bSwgdDMpCi0JQUREQyhzdW0sIHQ0KQotCUFEREMoc3VtLCB0MCkKLQlBRERDKHN1bSwgdDEpCi0Jc3VidQlhMSwgYTEsIDB4MTAKLQlhZGR1CXNyYywgc3JjLCAweDEwCi0Jc3JsCXQ4LCBhMSwgMHg3Ci0KLWJlZ2luX21vdmVtZW50OgotCWJlcXoJdDgsIDFmCi0JIGFuZGkJdDIsIGExLCAweDQwCi0KLW1vdmVfMTI4Ynl0ZXM6Ci0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MjAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4NDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4NjAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0Jc3VidQl0OCwgdDgsIDB4MDEKLQlibmV6CXQ4LCBtb3ZlXzEyOGJ5dGVzCi0JIGFkZHUJc3JjLCBzcmMsIDB4ODAKLQotMToKLQliZXF6CXQyLCAxZgotCSBhbmRpCXQyLCBhMSwgMHgyMAotCi1tb3ZlXzY0Ynl0ZXM6Ci0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MjAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0JYWRkdQlzcmMsIHNyYywgMHg0MAotCi0xOgotCWJlcXoJdDIsIGRvX2VuZF93b3JkcwotCSBhbmRpCXQ4LCBhMSwgMHgxYwotCi1tb3ZlXzMyYnl0ZXM6Ci0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCi0JYW5kaQl0OCwgYTEsIDB4MWMKLQlhZGR1CXNyYywgc3JjLCAweDIwCi0KLWRvX2VuZF93b3JkczoKLQliZXF6CXQ4LCBtYXliZV9lbmRfY3J1ZnQKLQkgc3JsCXQ4LCB0OCwgMHgyCi0KLWVuZF93b3JkczoKLQlsdwl0MCwgKHNyYykKLQlzdWJ1CXQ4LCB0OCwgMHgxCi0JQUREQyhzdW0sIHQwKQotCWJuZXoJdDgsIGVuZF93b3JkcwotCSBhZGR1CXNyYywgc3JjLCAweDQKLQotbWF5YmVfZW5kX2NydWZ0OgotCWFuZGkJdDIsIGExLCAweDMKLQotc21hbGxfbWVtY3B5OgotIGogc21hbGxfY3N1bWNweTsgbW92ZSBhMSwgdDIKLQliZXF6CXQyLCBvdXQKLQkgbW92ZQlhMSwgdDIKLQotZW5kX2J5dGVzOgotCWxiCXQwLCAoc3JjKQotCXN1YnUJYTEsIGExLCAweDEKLQlibmV6CWEyLCBlbmRfYnl0ZXMKLQkgYWRkdQlzcmMsIHNyYywgMHgxCi0KLW91dDoKLQlqcglyYQotCSBtb3ZlCXYwLCBzdW0KLQlFTkQoY3N1bV9wYXJ0aWFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi02NC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9saWItNjQvTWFrZWZpbGUKaW5kZXggYWQyODU3OC4uZGNkNGQyZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi02NC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbGliLTY0L01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgTUlQUy1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KICMKIAotbGliLXkJKz0gY3N1bV9wYXJ0aWFsLm8gbWVtc2V0Lm8gd2F0Y2gubworbGliLXkJKz0gbWVtc2V0Lm8gd2F0Y2gubwogCiBvYmotJChDT05GSUdfQ1BVX01JUFMzMikJKz0gZHVtcF90bGIubwogb2JqLSQoQ09ORklHX0NQVV9NSVBTNjQpCSs9IGR1bXBfdGxiLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItNjQvY3N1bV9wYXJ0aWFsLlMgYi9hcmNoL21pcHMvbGliLTY0L2NzdW1fcGFydGlhbC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFiYTY2Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9saWItNjQvY3N1bV9wYXJ0aWFsLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFF1aWNrJ24nZGlydHkgSVAgY2hlY2tzdW0gLi4uCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqLwotI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vcmVnZGVmLmg+Ci0KLSNkZWZpbmUgQUREQyhzdW0scmVnKQkJCQkJCVwKLQlhZGR1CXN1bSwgcmVnOwkJCQkJXAotCXNsdHUJdjEsIHN1bSwgcmVnOwkJCQkJXAotCWFkZHUJc3VtLCB2MQotCi0jZGVmaW5lIENTVU1fQklHQ0hVTksoc3JjLCBvZmZzZXQsIHN1bSwgdDAsIHQxLCB0MiwgdDMpCQlcCi0JbHcJdDAsIChvZmZzZXQgKyAweDAwKShzcmMpOwkJCVwKLQlsdwl0MSwgKG9mZnNldCArIDB4MDQpKHNyYyk7CQkJXAotCWx3CXQyLCAob2Zmc2V0ICsgMHgwOCkoc3JjKTsgCQkJXAotCWx3CXQzLCAob2Zmc2V0ICsgMHgwYykoc3JjKTsgCQkJXAotCUFEREMoc3VtLCB0MCk7CQkJCQkJXAotCUFEREMoc3VtLCB0MSk7CQkJCQkJXAotCUFEREMoc3VtLCB0Mik7CQkJCQkJXAotCUFEREMoc3VtLCB0Myk7CQkJCQkJXAotCWx3CXQwLCAob2Zmc2V0ICsgMHgxMCkoc3JjKTsJCQlcCi0JbHcJdDEsIChvZmZzZXQgKyAweDE0KShzcmMpOwkJCVwKLQlsdwl0MiwgKG9mZnNldCArIDB4MTgpKHNyYyk7CQkJXAotCWx3CXQzLCAob2Zmc2V0ICsgMHgxYykoc3JjKTsJCQlcCi0JQUREQyhzdW0sIHQwKTsJCQkJCQlcCi0JQUREQyhzdW0sIHQxKTsJCQkJCQlcCi0JQUREQyhzdW0sIHQyKTsJCQkJCQlcCi0JQUREQyhzdW0sIHQzKTsJCQkJCQlcCi0KLS8qCi0gKiBhMDogc291cmNlIGFkZHJlc3MKLSAqIGExOiBsZW5ndGggb2YgdGhlIGFyZWEgdG8gY2hlY2tzdW0KLSAqIGEyOiBwYXJ0aWFsIGNoZWNrc3VtCi0gKi8KLQotI2RlZmluZSBzcmMgYTAKLSNkZWZpbmUgc3VtIHYwCi0KLQkudGV4dAotCS5zZXQJbm9yZW9yZGVyCi0KLS8qIHVua25vd24gc3JjIGFsaWdubWVudCBhbmQgPCA4IGJ5dGVzIHRvIGdvICAqLwotc21hbGxfY3N1bWNweToKLQltb3ZlCWExLCB0YTIKLQotCWFuZGkJdGEwLCBhMSwgNAotCWJlcXoJdGEwLCAxZgotCSBhbmRpCXRhMCwgYTEsIDIKLQotCS8qIFN0aWxsIGEgZnVsbCB3b3JkIHRvIGdvICAqLwotCXVsdwl0YTEsIChzcmMpCi0JZGFkZGl1CXNyYywgNAotCUFEREMoc3VtLCB0YTEpCi0KLTE6CW1vdmUJdGExLCB6ZXJvCi0JYmVxegl0YTAsIDFmCi0JIGFuZGkJdGEwLCBhMSwgMQotCi0JLyogU3RpbGwgYSBoYWxmd29yZCB0byBnbyAgKi8KLQl1bGh1CXRhMSwgKHNyYykKLQlkYWRkaXUJc3JjLCAyCi0KLTE6CWJlcXoJdGEwLCAxZgotCSBzbGwJdGExLCB0YTEsIDE2Ci0KLQlsYnUJdGEyLCAoc3JjKQotCSBub3AKLQotI2lmZGVmIF9fTUlQU0VCX18KLQlzbGwJdGEyLCB0YTIsIDgKLSNlbmRpZgotCW9yCXRhMSwgdGEyCi0KLTE6CUFEREMoc3VtLCB0YTEpCi0KLQkvKiBmb2xkIGNoZWNrc3VtICovCi0Jc2xsCXYxLCBzdW0sIDE2Ci0JYWRkdQlzdW0sIHYxCi0Jc2x0dQl2MSwgc3VtLCB2MQotCXNybAlzdW0sIHN1bSwgMTYKLQlhZGR1CXN1bSwgdjEKLQotCS8qIG9kZCBidWZmZXIgYWxpZ25tZW50PyAqLwotCWJlcXoJdDMsIDFmCi0JIG5vcAotCXNsbAl2MSwgc3VtLCA4Ci0Jc3JsCXN1bSwgc3VtLCA4Ci0Jb3IJc3VtLCB2MQotCWFuZGkJc3VtLCAweGZmZmYKLTE6Ci0JLnNldAlyZW9yZGVyCi0JLyogQWRkIHRoZSBwYXNzZWQgcGFydGlhbCBjc3VtLiAgKi8KLQlBRERDKHN1bSwgYTIpCi0JanIJcmEKLQkuc2V0CW5vcmVvcmRlcgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkuYWxpZ24JNQotTEVBRihjc3VtX3BhcnRpYWwpCi0JbW92ZQlzdW0sIHplcm8KLQltb3ZlCXQzLCB6ZXJvCi0KLQlzbHRpdQl0OCwgYTEsIDB4OAotCWJuZXoJdDgsIHNtYWxsX2NzdW1jcHkJCS8qIDwgOCBieXRlcyB0byBjb3B5ICovCi0JIG1vdmUJdGEyLCBhMQotCi0JYmVxeglhMSwgb3V0Ci0JIGFuZGkJdDMsIHNyYywgMHgxCQkJLyogb2RkIGJ1ZmZlcj8gKi8KLQotaHdvcmRfYWxpZ246Ci0JYmVxegl0Mywgd29yZF9hbGlnbgotCSBhbmRpCXQ4LCBzcmMsIDB4MgotCi0JbGJ1CXRhMCwgKHNyYykKLQlkc3VidQlhMSwgYTEsIDB4MQotI2lmZGVmIF9fTUlQU0VMX18KLQlzbGwJdGEwLCB0YTAsIDgKLSNlbmRpZgotCUFEREMoc3VtLCB0YTApCi0JZGFkZHUJc3JjLCBzcmMsIDB4MQotCWFuZGkJdDgsIHNyYywgMHgyCi0KLXdvcmRfYWxpZ246Ci0JYmVxegl0OCwgZHdvcmRfYWxpZ24KLQkgc2x0aXUJdDgsIGExLCA1NgotCi0JbGh1CXRhMCwgKHNyYykKLQlkc3VidQlhMSwgYTEsIDB4MgotCUFEREMoc3VtLCB0YTApCi0Jc2x0aXUJdDgsIGExLCA1NgotCWRhZGR1CXNyYywgc3JjLCAweDIKLQotZHdvcmRfYWxpZ246Ci0JYm5legl0OCwgZG9fZW5kX3dvcmRzCi0JIG1vdmUJdDgsIGExCi0KLQlhbmRpCXQ4LCBzcmMsIDB4NAotCWJlcXoJdDgsIHF3b3JkX2FsaWduCi0JIGFuZGkJdDgsIHNyYywgMHg4Ci0KLQlsdwl0YTAsIDB4MDAoc3JjKQotCWRzdWJ1CWExLCBhMSwgMHg0Ci0JQUREQyhzdW0sIHRhMCkKLQlkYWRkdQlzcmMsIHNyYywgMHg0Ci0JYW5kaQl0OCwgc3JjLCAweDgKLQotcXdvcmRfYWxpZ246Ci0JYmVxegl0OCwgb3dvcmRfYWxpZ24KLQkgYW5kaQl0OCwgc3JjLCAweDEwCi0KLQlsdwl0YTAsIDB4MDAoc3JjKQotCWx3CXRhMSwgMHgwNChzcmMpCi0JZHN1YnUJYTEsIGExLCAweDgKLQlBRERDKHN1bSwgdGEwKQotCUFEREMoc3VtLCB0YTEpCi0JZGFkZHUJc3JjLCBzcmMsIDB4OAotCWFuZGkJdDgsIHNyYywgMHgxMAotCi1vd29yZF9hbGlnbjoKLQliZXF6CXQ4LCBiZWdpbl9tb3ZlbWVudAotCSBkc3JsCXQ4LCBhMSwgMHg3Ci0KLQlsdwl0YTMsIDB4MDgoc3JjKQotCWx3CXQwLCAweDBjKHNyYykKLQlsdwl0YTAsIDB4MDAoc3JjKQotCWx3CXRhMSwgMHgwNChzcmMpCi0JQUREQyhzdW0sIHRhMykKLQlBRERDKHN1bSwgdDApCi0JQUREQyhzdW0sIHRhMCkKLQlBRERDKHN1bSwgdGExKQotCWRzdWJ1CWExLCBhMSwgMHgxMAotCWRhZGR1CXNyYywgc3JjLCAweDEwCi0JZHNybAl0OCwgYTEsIDB4NwotCi1iZWdpbl9tb3ZlbWVudDoKLQliZXF6CXQ4LCAxZgotCSBhbmRpCXRhMiwgYTEsIDB4NDAKLQotbW92ZV8xMjhieXRlczoKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgyMCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHg0MCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHg2MCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlkc3VidQl0OCwgdDgsIDB4MDEKLQlibmV6CXQ4LCBtb3ZlXzEyOGJ5dGVzCi0JIGRhZGR1CXNyYywgc3JjLCAweDgwCi0KLTE6Ci0JYmVxegl0YTIsIDFmCi0JIGFuZGkJdGEyLCBhMSwgMHgyMAotCi1tb3ZlXzY0Ynl0ZXM6Ci0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgdGEwLCB0YTEsIHRhMywgdDApCi0JQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MjAsIHN1bSwgdGEwLCB0YTEsIHRhMywgdDApCi0JZGFkZHUJc3JjLCBzcmMsIDB4NDAKLQotMToKLQliZXF6CXRhMiwgZG9fZW5kX3dvcmRzCi0JIGFuZGkJdDgsIGExLCAweDFjCi0KLW1vdmVfMzJieXRlczoKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlhbmRpCXQ4LCBhMSwgMHgxYwotCWRhZGR1CXNyYywgc3JjLCAweDIwCi0KLWRvX2VuZF93b3JkczoKLQliZXF6CXQ4LCBtYXliZV9lbmRfY3J1ZnQKLQkgZHNybAl0OCwgdDgsIDB4MgotCi1lbmRfd29yZHM6Ci0JbHcJdGEwLCAoc3JjKQotCWRzdWJ1CXQ4LCB0OCwgMHgxCi0JQUREQyhzdW0sIHRhMCkKLQlibmV6CXQ4LCBlbmRfd29yZHMKLQkgZGFkZHUJc3JjLCBzcmMsIDB4NAotCi1tYXliZV9lbmRfY3J1ZnQ6Ci0JYW5kaQl0YTIsIGExLCAweDMKLQotc21hbGxfbWVtY3B5OgotIGogc21hbGxfY3N1bWNweTsgbW92ZSBhMSwgdGEyCQkvKiBYWFggPz8/ICovCi0JYmVxegl0Miwgb3V0Ci0JIG1vdmUJYTEsIHRhMgotCi1lbmRfYnl0ZXM6Ci0JbGIJdGEwLCAoc3JjKQotCWRzdWJ1CWExLCBhMSwgMHgxCi0JYm5leglhMiwgZW5kX2J5dGVzCi0JIGRhZGR1CXNyYywgc3JjLCAweDEKLQotb3V0OgotCWpyCXJhCi0JIG1vdmUJdjAsIHN1bQotCUVORChjc3VtX3BhcnRpYWwpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL01ha2VmaWxlIGIvYXJjaC9taXBzL2xpYi9NYWtlZmlsZQppbmRleCBiMjI1NTQzLi44ODhiNjFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9saWIvTWFrZWZpbGUKQEAgLTIsOCArMiw4IEBACiAjIE1ha2VmaWxlIGZvciBNSVBTLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgogIwogCi1saWIteQkrPSBjc3VtX3BhcnRpYWxfY29weS5vIG1lbWNweS5vIHByb21saWIubyBzdHJsZW5fdXNlci5vIHN0cm5jcHlfdXNlci5vIFwKLQkgICBzdHJubGVuX3VzZXIubyB1bmNhY2hlZC5vCitsaWIteQkrPSBjc3VtX3BhcnRpYWwubyBjc3VtX3BhcnRpYWxfY29weS5vIG1lbWNweS5vIHByb21saWIubyBcCisJICAgc3RybGVuX3VzZXIubyBzdHJuY3B5X3VzZXIubyBzdHJubGVuX3VzZXIubyB1bmNhY2hlZC5vCiAKIG9iai15CSs9IGlvbWFwLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWwuUyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MTFkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBRdWljayduJ2RpcnR5IElQIGNoZWNrc3VtIC4uLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKi8KKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIFQwCXRhMAorI2RlZmluZSBUMQl0YTEKKyNkZWZpbmUgVDIJdGEyCisjZGVmaW5lIFQzCXRhMworI2RlZmluZSBUNAl0MAorI2RlZmluZSBUNwl0MworI2Vsc2UKKyNkZWZpbmUgVDAJdDAKKyNkZWZpbmUgVDEJdDEKKyNkZWZpbmUgVDIJdDIKKyNkZWZpbmUgVDMJdDMKKyNkZWZpbmUgVDQJdDQKKyNkZWZpbmUgVDcJdDcKKyNlbmRpZgorCisjZGVmaW5lIEFEREMoc3VtLHJlZykJCQkJCQlcCisJYWRkdQlzdW0sIHJlZzsJCQkJCVwKKwlzbHR1CXYxLCBzdW0sIHJlZzsJCQkJCVwKKwlhZGR1CXN1bSwgdjEKKworI2RlZmluZSBDU1VNX0JJR0NIVU5LKHNyYywgb2Zmc2V0LCBzdW0sIF90MCwgX3QxLCBfdDIsIF90MykJXAorCWx3CV90MCwgKG9mZnNldCArIDB4MDApKHNyYyk7CQkJXAorCWx3CV90MSwgKG9mZnNldCArIDB4MDQpKHNyYyk7CQkJXAorCWx3CV90MiwgKG9mZnNldCArIDB4MDgpKHNyYyk7IAkJCVwKKwlsdwlfdDMsIChvZmZzZXQgKyAweDBjKShzcmMpOyAJCQlcCisJQUREQyhzdW0sIF90MCk7CQkJCQkJXAorCUFEREMoc3VtLCBfdDEpOwkJCQkJCVwKKwlBRERDKHN1bSwgX3QyKTsJCQkJCQlcCisJQUREQyhzdW0sIF90Myk7CQkJCQkJXAorCWx3CV90MCwgKG9mZnNldCArIDB4MTApKHNyYyk7CQkJXAorCWx3CV90MSwgKG9mZnNldCArIDB4MTQpKHNyYyk7CQkJXAorCWx3CV90MiwgKG9mZnNldCArIDB4MTgpKHNyYyk7CQkJXAorCWx3CV90MywgKG9mZnNldCArIDB4MWMpKHNyYyk7CQkJXAorCUFEREMoc3VtLCBfdDApOwkJCQkJCVwKKwlBRERDKHN1bSwgX3QxKTsJCQkJCQlcCisJQUREQyhzdW0sIF90Mik7CQkJCQkJXAorCUFEREMoc3VtLCBfdDMpOwkJCQkJCVwKKworLyoKKyAqIGEwOiBzb3VyY2UgYWRkcmVzcworICogYTE6IGxlbmd0aCBvZiB0aGUgYXJlYSB0byBjaGVja3N1bQorICogYTI6IHBhcnRpYWwgY2hlY2tzdW0KKyAqLworCisjZGVmaW5lIHNyYyBhMAorI2RlZmluZSBzdW0gdjAKKworCS50ZXh0CisJLnNldAlub3Jlb3JkZXIKKworLyogdW5rbm93biBzcmMgYWxpZ25tZW50IGFuZCA8IDggYnl0ZXMgdG8gZ28gICovCitzbWFsbF9jc3VtY3B5OgorCW1vdmUJYTEsIFQyCisKKwlhbmRpCVQwLCBhMSwgNAorCWJlcXoJVDAsIDFmCisJIGFuZGkJVDAsIGExLCAyCisKKwkvKiBTdGlsbCBhIGZ1bGwgd29yZCB0byBnbyAgKi8KKwl1bHcJVDEsIChzcmMpCisJUFRSX0FERElVCXNyYywgNAorCUFEREMoc3VtLCBUMSkKKworMToJbW92ZQlUMSwgemVybworCWJlcXoJVDAsIDFmCisJIGFuZGkJVDAsIGExLCAxCisKKwkvKiBTdGlsbCBhIGhhbGZ3b3JkIHRvIGdvICAqLworCXVsaHUJVDEsIChzcmMpCisJUFRSX0FERElVCXNyYywgMgorCisxOgliZXF6CVQwLCAxZgorCSBzbGwJVDEsIFQxLCAxNgorCisJbGJ1CVQyLCAoc3JjKQorCSBub3AKKworI2lmZGVmIF9fTUlQU0VCX18KKwlzbGwJVDIsIFQyLCA4CisjZW5kaWYKKwlvcglUMSwgVDIKKworMToJQUREQyhzdW0sIFQxKQorCisJLyogZm9sZCBjaGVja3N1bSAqLworCXNsbAl2MSwgc3VtLCAxNgorCWFkZHUJc3VtLCB2MQorCXNsdHUJdjEsIHN1bSwgdjEKKwlzcmwJc3VtLCBzdW0sIDE2CisJYWRkdQlzdW0sIHYxCisKKwkvKiBvZGQgYnVmZmVyIGFsaWdubWVudD8gKi8KKwliZXF6CVQ3LCAxZgorCSBub3AKKwlzbGwJdjEsIHN1bSwgOAorCXNybAlzdW0sIHN1bSwgOAorCW9yCXN1bSwgdjEKKwlhbmRpCXN1bSwgMHhmZmZmCisxOgorCS5zZXQJcmVvcmRlcgorCS8qIEFkZCB0aGUgcGFzc2VkIHBhcnRpYWwgY3N1bS4gICovCisJQUREQyhzdW0sIGEyKQorCWpyCXJhCisJLnNldAlub3Jlb3JkZXIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLmFsaWduCTUKK0xFQUYoY3N1bV9wYXJ0aWFsKQorCW1vdmUJc3VtLCB6ZXJvCisJbW92ZQlUNywgemVybworCisJc2x0aXUJdDgsIGExLCAweDgKKwlibmV6CXQ4LCBzbWFsbF9jc3VtY3B5CQkvKiA8IDggYnl0ZXMgdG8gY29weSAqLworCSBtb3ZlCVQyLCBhMQorCisJYmVxeglhMSwgb3V0CisJIGFuZGkJVDcsIHNyYywgMHgxCQkJLyogb2RkIGJ1ZmZlcj8gKi8KKworaHdvcmRfYWxpZ246CisJYmVxeglUNywgd29yZF9hbGlnbgorCSBhbmRpCXQ4LCBzcmMsIDB4MgorCisJbGJ1CVQwLCAoc3JjKQorCUxPTkdfU1VCVQlhMSwgYTEsIDB4MQorI2lmZGVmIF9fTUlQU0VMX18KKwlzbGwJVDAsIFQwLCA4CisjZW5kaWYKKwlBRERDKHN1bSwgVDApCisJUFRSX0FERFUJc3JjLCBzcmMsIDB4MQorCWFuZGkJdDgsIHNyYywgMHgyCisKK3dvcmRfYWxpZ246CisJYmVxegl0OCwgZHdvcmRfYWxpZ24KKwkgc2x0aXUJdDgsIGExLCA1NgorCisJbGh1CVQwLCAoc3JjKQorCUxPTkdfU1VCVQlhMSwgYTEsIDB4MgorCUFEREMoc3VtLCBUMCkKKwlzbHRpdQl0OCwgYTEsIDU2CisJUFRSX0FERFUJc3JjLCBzcmMsIDB4MgorCitkd29yZF9hbGlnbjoKKwlibmV6CXQ4LCBkb19lbmRfd29yZHMKKwkgbW92ZQl0OCwgYTEKKworCWFuZGkJdDgsIHNyYywgMHg0CisJYmVxegl0OCwgcXdvcmRfYWxpZ24KKwkgYW5kaQl0OCwgc3JjLCAweDgKKworCWx3CVQwLCAweDAwKHNyYykKKwlMT05HX1NVQlUJYTEsIGExLCAweDQKKwlBRERDKHN1bSwgVDApCisJUFRSX0FERFUJc3JjLCBzcmMsIDB4NAorCWFuZGkJdDgsIHNyYywgMHg4CisKK3F3b3JkX2FsaWduOgorCWJlcXoJdDgsIG93b3JkX2FsaWduCisJIGFuZGkJdDgsIHNyYywgMHgxMAorCisJbHcJVDAsIDB4MDAoc3JjKQorCWx3CVQxLCAweDA0KHNyYykKKwlMT05HX1NVQlUJYTEsIGExLCAweDgKKwlBRERDKHN1bSwgVDApCisJQUREQyhzdW0sIFQxKQorCVBUUl9BRERVCXNyYywgc3JjLCAweDgKKwlhbmRpCXQ4LCBzcmMsIDB4MTAKKworb3dvcmRfYWxpZ246CisJYmVxegl0OCwgYmVnaW5fbW92ZW1lbnQKKwkgTE9OR19TUkwJdDgsIGExLCAweDcKKworCWx3CVQzLCAweDA4KHNyYykKKwlsdwlUNCwgMHgwYyhzcmMpCisJbHcJVDAsIDB4MDAoc3JjKQorCWx3CVQxLCAweDA0KHNyYykKKwlBRERDKHN1bSwgVDMpCisJQUREQyhzdW0sIFQ0KQorCUFEREMoc3VtLCBUMCkKKwlBRERDKHN1bSwgVDEpCisJTE9OR19TVUJVCWExLCBhMSwgMHgxMAorCVBUUl9BRERVCXNyYywgc3JjLCAweDEwCisJTE9OR19TUkwJdDgsIGExLCAweDcKKworYmVnaW5fbW92ZW1lbnQ6CisJYmVxegl0OCwgMWYKKwkgYW5kaQlUMiwgYTEsIDB4NDAKKworbW92ZV8xMjhieXRlczoKKwlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCBUMCwgVDEsIFQzLCBUNCkKKwlDU1VNX0JJR0NIVU5LKHNyYywgMHgyMCwgc3VtLCBUMCwgVDEsIFQzLCBUNCkKKwlDU1VNX0JJR0NIVU5LKHNyYywgMHg0MCwgc3VtLCBUMCwgVDEsIFQzLCBUNCkKKwlDU1VNX0JJR0NIVU5LKHNyYywgMHg2MCwgc3VtLCBUMCwgVDEsIFQzLCBUNCkKKwlMT05HX1NVQlUJdDgsIHQ4LCAweDAxCisJYm5legl0OCwgbW92ZV8xMjhieXRlcworCSBQVFJfQUREVQlzcmMsIHNyYywgMHg4MAorCisxOgorCWJlcXoJVDIsIDFmCisJIGFuZGkJVDIsIGExLCAweDIwCisKK21vdmVfNjRieXRlczoKKwlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCBUMCwgVDEsIFQzLCBUNCkKKwlDU1VNX0JJR0NIVU5LKHNyYywgMHgyMCwgc3VtLCBUMCwgVDEsIFQzLCBUNCkKKwlQVFJfQUREVQlzcmMsIHNyYywgMHg0MAorCisxOgorCWJlcXoJVDIsIGRvX2VuZF93b3JkcworCSBhbmRpCXQ4LCBhMSwgMHgxYworCittb3ZlXzMyYnl0ZXM6CisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgVDAsIFQxLCBUMywgVDQpCisJYW5kaQl0OCwgYTEsIDB4MWMKKwlQVFJfQUREVQlzcmMsIHNyYywgMHgyMAorCitkb19lbmRfd29yZHM6CisJYmVxegl0OCwgbWF5YmVfZW5kX2NydWZ0CisJIExPTkdfU1JMCXQ4LCB0OCwgMHgyCisKK2VuZF93b3JkczoKKwlsdwlUMCwgKHNyYykKKwlMT05HX1NVQlUJdDgsIHQ4LCAweDEKKwlBRERDKHN1bSwgVDApCisJYm5legl0OCwgZW5kX3dvcmRzCisJIFBUUl9BRERVCXNyYywgc3JjLCAweDQKKworbWF5YmVfZW5kX2NydWZ0OgorCWFuZGkJVDIsIGExLCAweDMKKworc21hbGxfbWVtY3B5OgorIGogc21hbGxfY3N1bWNweTsgbW92ZSBhMSwgVDIJCS8qIFhYWCA/Pz8gKi8KKwliZXF6CXQyLCBvdXQKKwkgbW92ZQlhMSwgVDIKKworZW5kX2J5dGVzOgorCWxiCVQwLCAoc3JjKQorCUxPTkdfU1VCVQlhMSwgYTEsIDB4MQorCWJuZXoJYTIsIGVuZF9ieXRlcworCSBQVFJfQUREVQlzcmMsIHNyYywgMHgxCisKK291dDoKKwlqcglyYQorCSBtb3ZlCXYwLCBzdW0KKwlFTkQoY3N1bV9wYXJ0aWFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jIGIvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCmluZGV4IDZlOWYzNjYuLjE3MjBmMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYworKysgYi9hcmNoL21pcHMvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKQEAgLTE2LDggKzE2LDggQEAKIC8qCiAgKiBjb3B5IHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQl1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsCisJdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCS8qCiAJICogSXQncyAyOjMwIGFtIGFuZCBJIGRvbid0IGZlZWwgbGlrZSBkb2luZyBpdCByZWFsIC4uLgpAQCAtMzMsOCArMzMsOCBAQAogICogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgogICogdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorCXZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvYXRsYXMvYXRsYXNfaW50LmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvYXRsYXMvYXRsYXNfaW50LmMKaW5kZXggYmU2MjRiOC4uNDNkYmE2YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX2ludC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19pbnQuYwpAQCAtNjIsMTYgKzYyLDYgQEAKIAlpb2IoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2F0bGFzX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9hdGxhc19pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX2F0bGFzX2lycQlkaXNhYmxlX2F0bGFzX2lycQotCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19hdGxhc19pcnEgZGlzYWJsZV9hdGxhc19pcnEKLQogc3RhdGljIHZvaWQgZW5kX2F0bGFzX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQpAQCAtODAsMTEgKzcwLDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXRsYXNfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkF0bGFzIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfYXRsYXNfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2F0bGFzX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2F0bGFzX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfYXRsYXNfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfYXRsYXNfaXJxLAorCS5hY2sgPSBkaXNhYmxlX2F0bGFzX2lycSwKKwkubWFzayA9IGRpc2FibGVfYXRsYXNfaXJxLAorCS5tYXNrX2FjayA9IGRpc2FibGVfYXRsYXNfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfYXRsYXNfaXJxLAorCS5lb2kgPSBlbmFibGVfYXRsYXNfaXJxLAogCS5lbmQgPSBlbmRfYXRsYXNfaXJxLAogfTsKIApAQCAtMjE3LDEzICsyMDcsOCBAQAogCSAqLwogCWF0bGFzX2h3MF9pY3JlZ3MtPmludHJzdGVuID0gMHhmZmZmZmZmZjsKIAotCWZvciAoaSA9IEFUTEFTX0lOVF9CQVNFOyBpIDw9IEFUTEFTX0lOVF9FTkQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMJPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbgk9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoCT0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcAk9ICZhdGxhc19pcnFfdHlwZTsKLQkJc3Bpbl9sb2NrX2luaXQoJmlycV9kZXNjW2ldLmxvY2spOwotCX0KKwlmb3IgKGkgPSBBVExBU19JTlRfQkFTRTsgaSA8PSBBVExBU19JTlRfRU5EOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmYXRsYXNfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBhdGxhc2lycSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYwppbmRleCBkODE3YzYwLi5lNDYwNGM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jCkBAIC0yODgsNiArMjg4LDcgQEAKIAkgICBUaGUgZWZmZWN0IGlzIHRoYXQgdGhlIGludCByZW1haW5zIGRpc2FibGVkIG9uIHRoZSBzZWNvbmQgY3B1LgogCSAgIE1hcmsgdGhlIGludGVycnVwdCB3aXRoIElSUV9QRVJfQ1BVIHRvIGF2b2lkIGFueSBjb25mdXNpb24gKi8KIAlpcnFfZGVzY1ttaXBzX2NwdV90aW1lcl9pcnFdLnN0YXR1cyB8PSBJUlFfUEVSX0NQVTsKKwlzZXRfaXJxX2hhbmRsZXIobWlwc19jcHVfdGltZXJfaXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CiAjZW5kaWYKIAogICAgICAgICAvKiB0byBnZW5lcmF0ZSB0aGUgZmlyc3QgdGltZXIgaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfc2V0dXAuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCmluZGV4IGFiNDYwZjguLjI4MmYzZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAkJCQlCT05JVE9fUENJTUVNQkFTRUNGRyB8PQogCQkJCQkoQk9OSVRPX1BDSU1FTUJBU0VDRkdfTUVNQkFTRTBfQ0FDSEVEIHwKIAkJCQkJIEJPTklUT19QQ0lNRU1CQVNFQ0ZHX01FTUJBU0UxX0NBQ0hFRCk7Ci0JCQkJcHJpbnRrKCJEaXNhYmxlZCBCb25pdG8gSU9CQyBjb2hlcmVuY3lcbiIpOworCQkJCXByaW50aygiRW5hYmxlZCBCb25pdG8gSU9CQyBjb2hlcmVuY3lcbiIpOwogCQkJfQogCQl9CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3RpbWUuYwppbmRleCAyNGE0ZWQwLi4zMDcxMWQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL3NpbV90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL3NpbS9zaW1fdGltZS5jCkBAIC0zLDYgKzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KIAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTEwLDI0ICsxMywxNCBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotI2luY2x1ZGUgPGFzbS9jcHUuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYzE0NjgxOC10aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21zYzAxX2ljLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9zaW1pbnQuaD4KLSNpbmNsdWRlIDxhc20vbWMxNDY4MTgtdGltZS5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogCiB1bnNpZ25lZCBsb25nIGNwdV9raHo7CkBAIC0yMDMsNyArMTk2LDggQEAKIAkgICBvbiBzZXBlcmF0ZSBjcHUncyB0aGUgZmlyc3Qgb25lIHRyaWVzIHRvIGhhbmRsZSB0aGUgc2Vjb25kIGludGVycnVwdC4KIAkgICBUaGUgZWZmZWN0IGlzIHRoYXQgdGhlIGludCByZW1haW5zIGRpc2FibGVkIG9uIHRoZSBzZWNvbmQgY3B1LgogCSAgIE1hcmsgdGhlIGludGVycnVwdCB3aXRoIElSUV9QRVJfQ1BVIHRvIGF2b2lkIGFueSBjb25mdXNpb24gKi8KLQlpcnFfZGVzY1ttaXBzX2NwdV90aW1lcl9pcnFdLnN0YXR1cyB8PSBJUlFfUEVSX0NQVTsKKwlpcnFfZGVzY1ttaXBzX2NwdV90aW1lcl9pcnFdLmZsYWdzIHw9IElSUV9QRVJfQ1BVOworCXNldF9pcnFfaGFuZGxlcihtaXBzX2NwdV90aW1lcl9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKICNlbmRpZgogCiAJLyogdG8gZ2VuZXJhdGUgdGhlIGZpcnN0IHRpbWVyIGludGVycnVwdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjRrLmMgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwppbmRleCBjYzg5NWRhLi5kZjA0YTMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwpAQCAtMzIzLDcgKzMyMyw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfcjRrX2ZsdXNoX2NhY2hlX2FsbCh2b2lkICogYXJncykKIHsKIAlyNGtfYmxhc3RfZGNhY2hlKCk7Ci0JcjRrX2JsYXN0X2ljYWNoZSgpOwogfQogCiBzdGF0aWMgdm9pZCByNGtfZmx1c2hfY2FjaGVfYWxsKHZvaWQpCkBAIC0zNTksMjEgKzM1OCwxOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX3I0a19mbHVzaF9jYWNoZV9yYW5nZSh2b2lkICogYXJncykKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IGFyZ3M7Ci0JaW50IGV4ZWM7CiAKIAlpZiAoIShjcHVfY29udGV4dChzbXBfcHJvY2Vzc29yX2lkKCksIHZtYS0+dm1fbW0pKSkKIAkJcmV0dXJuOwogCi0JZXhlYyA9IHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDOwotCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMgfHwgZXhlYykKLQkJcjRrX2JsYXN0X2RjYWNoZSgpOwotCWlmIChleGVjKQotCQlyNGtfYmxhc3RfaWNhY2hlKCk7CisJcjRrX2JsYXN0X2RjYWNoZSgpOwogfQogCiBzdGF0aWMgdm9pZCByNGtfZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CisJaWYgKCFjcHVfaGFzX2RjX2FsaWFzZXMpCisJCXJldHVybjsKKwogCXI0a19vbl9lYWNoX2NwdShsb2NhbF9yNGtfZmx1c2hfY2FjaGVfcmFuZ2UsIHZtYSwgMSwgMSk7CiB9CiAKQEAgLTM4NCwxOCArMzgxLDIxIEBACiAJaWYgKCFjcHVfY29udGV4dChzbXBfcHJvY2Vzc29yX2lkKCksIG1tKSkKIAkJcmV0dXJuOwogCi0JcjRrX2JsYXN0X2RjYWNoZSgpOwotCXI0a19ibGFzdF9pY2FjaGUoKTsKLQogCS8qCiAJICogS2x1ZGdlIGFsZXJ0LiAgRm9yIG9ic2N1cmUgcmVhc29ucyBSNDAwMFNDIGFuZCBSNDQwMFNDIGdvIG51dHMgaWYgd2UKIAkgKiBvbmx5IGZsdXNoIHRoZSBwcmltYXJ5IGNhY2hlcyBidXQgUjEwMDAwIGFuZCBSMTIwMDAgYmVoYXZlIHNhbmUgLi4uCisJICogUjQwMDBTQyBhbmQgUjQ0MDBTQyBpbmRleGVkIFMtY2FjaGUgb3BzIGFsc28gaW52YWxpZGF0ZSBwcmltYXJ5CisJICogY2FjaGVzLCBzbyB3ZSBjYW4gYmFpbCBvdXQgZWFybHkuCiAJICovCiAJaWYgKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfUjQwMDBTQyB8fAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1I0MDAwTUMgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9SNDQwMFNDIHx8Ci0JICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfUjQ0MDBNQykKKwkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9SNDQwME1DKSB7CiAJCXI0a19ibGFzdF9zY2FjaGUoKTsKKwkJcmV0dXJuOworCX0KKworCXI0a19ibGFzdF9kY2FjaGUoKTsKIH0KIAogc3RhdGljIHZvaWQgcjRrX2ZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2Mtc2IxLmMgYi9hcmNoL21pcHMvbW0vYy1zYjEuYwppbmRleCBkMGRkYjRhLi4zYThhZmQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1zYjEuYworKysgYi9hcmNoL21pcHMvbW0vYy1zYjEuYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgpAQCAtMjQyLDYgKzI0MywyNSBAQAogCV9fYXR0cmlidXRlX18oKGFsaWFzKCJsb2NhbF9zYjFfZmx1c2hfY2FjaGVfcGFnZSIpKSk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIHNiMV9mbHVzaF9jYWNoZV9kYXRhX3BhZ2VfaXBpKHZvaWQgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9ICh1bnNpZ25lZCBsb25nKWluZm87CisKKwlfX3NiMV93cml0ZWJhY2tfaW52X2RjYWNoZV9yYW5nZShzdGFydCwgc3RhcnQgKyBQQUdFX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBzYjFfZmx1c2hfY2FjaGVfZGF0YV9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpZiAoaW5fYXRvbWljKCkpCisJCV9fc2IxX3dyaXRlYmFja19pbnZfZGNhY2hlX3JhbmdlKGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUpOworCWVsc2UKKwkJb25fZWFjaF9jcHUoc2IxX2ZsdXNoX2NhY2hlX2RhdGFfcGFnZV9pcGksICh2b2lkICopIGFkZHIsIDEsIDEpOworfQorI2Vsc2UKK3ZvaWQgc2IxX2ZsdXNoX2NhY2hlX2RhdGFfcGFnZSh1bnNpZ25lZCBsb25nKQorCV9fYXR0cmlidXRlX18oKGFsaWFzKCJsb2NhbF9zYjFfZmx1c2hfY2FjaGVfZGF0YV9wYWdlIikpKTsKKyNlbmRpZgogCiAvKgogICogSW52YWxpZGF0ZSBhbGwgY2FjaGVzIG9uIHRoaXMgQ1BVCkBAIC00ODEsNyArNTAxLDcgQEAKIAogCWZsdXNoX2NhY2hlX3NpZ3RyYW1wID0gc2IxX2ZsdXNoX2NhY2hlX3NpZ3RyYW1wOwogCWxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSA9ICh2b2lkICopIHNiMV9ub3A7Ci0JZmx1c2hfZGF0YV9jYWNoZV9wYWdlID0gKHZvaWQgKikgc2IxX25vcDsKKwlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UgPSBzYjFfZmx1c2hfY2FjaGVfZGF0YV9wYWdlOwogCiAJLyogRnVsbCBmbHVzaCAqLwogCV9fZmx1c2hfY2FjaGVfYWxsID0gc2IxX19fZmx1c2hfY2FjaGVfYWxsOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2ZhdWx0LmMgYi9hcmNoL21pcHMvbW0vZmF1bHQuYwppbmRleCA4NDIzZDg1Li42ZjkwZTdlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vZmF1bHQuYworKysgYi9hcmNoL21pcHMvbW0vZmF1bHQuYwpAQCAtNjAsNiArNjAsMTAgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkoYWRkcmVzcyA+PSBWTUFMTE9DX1NUQVJUICYmIGFkZHJlc3MgPD0gVk1BTExPQ19FTkQpKQogCQlnb3RvIHZtYWxsb2NfZmF1bHQ7CisjaWZkZWYgTU9EVUxFX1NUQVJUCisJaWYgKHVubGlrZWx5KGFkZHJlc3MgPj0gTU9EVUxFX1NUQVJUICYmIGFkZHJlc3MgPCBNT0RVTEVfRU5EKSkKKwkJZ290byB2bWFsbG9jX2ZhdWx0OworI2VuZGlmCiAKIAkvKgogCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCBvciBoYXZlIG5vIHVzZXIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9pbml0LmMgYi9hcmNoL21pcHMvbW0vaW5pdC5jCmluZGV4IDJkZTRkM2MuLjllMjliYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9pbml0LmMKKysrIGIvYXJjaC9taXBzL21tL2luaXQuYwpAQCAtOTAsOSArOTAsOSBAQAogCWlmICghZW1wdHlfemVyb19wYWdlKQogCQlwYW5pYygiT2ggYm95LCB0aGF0IGVhcmx5IG91dCBvZiBtZW1vcnk/Iik7CiAKLQlwYWdlID0gdmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSk7CisJcGFnZSA9IHZpcnRfdG9fcGFnZSgodm9pZCAqKWVtcHR5X3plcm9fcGFnZSk7CiAJc3BsaXRfcGFnZShwYWdlLCBvcmRlcik7Ci0Jd2hpbGUgKHBhZ2UgPCB2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlICsgKFBBR0VfU0laRSA8PCBvcmRlcikpKSB7CisJd2hpbGUgKHBhZ2UgPCB2aXJ0X3RvX3BhZ2UoKHZvaWQgKikoZW1wdHlfemVyb19wYWdlICsgKFBBR0VfU0laRSA8PCBvcmRlcikpKSkgewogCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CiAJCXBhZ2UrKzsKIAl9CkBAIC00NDMsMTUgKzQ0MywxOCBAQAogfQogI2VuZGlmIC8qICFDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwogCi12b2lkIGZyZWVfaW5pdF9wYWdlcyhjaGFyICp3aGF0LCB1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCkKK3N0YXRpYyB2b2lkIGZyZWVfaW5pdF9wYWdlcyhjaGFyICp3aGF0LCB1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBwZm47CiAKLQlmb3IgKGFkZHIgPSBiZWdpbjsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUpIHsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKLQkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShhZGRyKSk7Ci0JCW1lbXNldCgodm9pZCAqKWFkZHIsIDB4Y2MsIFBBR0VfU0laRSk7Ci0JCWZyZWVfcGFnZShhZGRyKTsKKwlmb3IgKHBmbiA9IFBGTl9VUChiZWdpbik7IHBmbiA8IFBGTl9ET1dOKGVuZCk7IHBmbisrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwkJdm9pZCAqYWRkciA9IHBoeXNfdG9fdmlydChQRk5fUEhZUyhwZm4pKTsKKworCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCQltZW1zZXQoYWRkciwgUE9JU09OX0ZSRUVfSU5JVE1FTSwgUEFHRV9TSVpFKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQogCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgJXM6ICVsZGsgZnJlZWRcbiIsIHdoYXQsIChlbmQgLSBiZWdpbikgPj4gMTApOwpAQCAtNDYwLDEyICs0NjMsOSBAQAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogdm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCi0JLyogU3dpdGNoIGZyb20gS1NFRzAgdG8gWEtQSFlTIGFkZHJlc3NlcyAqLwotCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KENQSFlTQUREUihzdGFydCkpOwotCWVuZCA9ICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChDUEhZU0FERFIoZW5kKSk7Ci0jZW5kaWYKLQlmcmVlX2luaXRfcGFnZXMoImluaXRyZCBtZW1vcnkiLCBzdGFydCwgZW5kKTsKKwlmcmVlX2luaXRfcGFnZXMoImluaXRyZCBtZW1vcnkiLAorCQkJdmlydF90b19waHlzKCh2b2lkICopc3RhcnQpLAorCQkJdmlydF90b19waHlzKCh2b2lkICopZW5kKSk7CiB9CiAjZW5kaWYKIApAQCAtNDczLDE3ICs0NzMsMTMgQEAKIAogdm9pZCBmcmVlX2luaXRtZW0odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIGZyZWVkOworCXVuc2lnbmVkIGxvbmcgZnJlZWQ7CiAKIAlmcmVlZCA9IHByb21fZnJlZV9wcm9tX21lbW9yeSgpOwogCWlmIChmcmVlZCkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyBmaXJtd2FyZSBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsZnJlZWQpOwogCi0Jc3RhcnQgPSAodW5zaWduZWQgbG9uZykoJl9faW5pdF9iZWdpbik7Ci0JZW5kID0gKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKTsKLSNpZmRlZiBDT05GSUdfNjRCSVQKLQlzdGFydCA9IFBBR0VfT0ZGU0VUIHwgQ1BIWVNBRERSKHN0YXJ0KTsKLQllbmQgPSBQQUdFX09GRlNFVCB8IENQSFlTQUREUihlbmQpOwotI2VuZGlmCi0JZnJlZV9pbml0X3BhZ2VzKCJ1bnVzZWQga2VybmVsIG1lbW9yeSIsIHN0YXJ0LCBlbmQpOworCWZyZWVfaW5pdF9wYWdlcygidW51c2VkIGtlcm5lbCBtZW1vcnkiLAorCQkJX19wYV9zeW1ib2woJl9faW5pdF9iZWdpbiksCisJCQlfX3BhX3N5bWJvbCgmX19pbml0X2VuZCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3BndGFibGUtNjQuYyBiL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLTY0LmMKaW5kZXggOGQ2MDBkMy4uYzQ2ZWI2NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3BndGFibGUtNjQuYworKysgYi9hcmNoL21pcHMvbW0vcGd0YWJsZS02NC5jCkBAIC01OCw2ICs1OCw5IEBACiAKIAkvKiBJbml0aWFsaXplIHRoZSBlbnRpcmUgcGdkLiAgKi8KIAlwZ2RfaW5pdCgodW5zaWduZWQgbG9uZylzd2FwcGVyX3BnX2Rpcik7CisjaWZkZWYgTU9EVUxFX1NUQVJUCisJcGdkX2luaXQoKHVuc2lnbmVkIGxvbmcpbW9kdWxlX3BnX2Rpcik7CisjZW5kaWYKIAlwbWRfaW5pdCgodW5zaWduZWQgbG9uZylpbnZhbGlkX3BtZF90YWJsZSwgKHVuc2lnbmVkIGxvbmcpaW52YWxpZF9wdGVfdGFibGUpOwogCiAJcGdkX2Jhc2UgPSBzd2FwcGVyX3BnX2RpcjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGJleC5jIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKaW5kZXggZmVjMzE4YS4uNDkyYzUxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYmV4LmMKKysrIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKQEAgLTQyMyw2ICs0MjMsOSBAQAogCWxhYmVsX2ludmFsaWQsCiAJbGFiZWxfc2Vjb25kX3BhcnQsCiAJbGFiZWxfbGVhdmUsCisjaWZkZWYgTU9EVUxFX1NUQVJUCisJbGFiZWxfbW9kdWxlX2FsbG9jLAorI2VuZGlmCiAJbGFiZWxfdm1hbGxvYywKIAlsYWJlbF92bWFsbG9jX2RvbmUsCiAJbGFiZWxfdGxid19oYXphcmQsCkBAIC00NTUsNiArNDU4LDkgQEAKIAogTF9MQShfc2Vjb25kX3BhcnQpCiBMX0xBKF9sZWF2ZSkKKyNpZmRlZiBNT0RVTEVfU1RBUlQKK0xfTEEoX21vZHVsZV9hbGxvYykKKyNlbmRpZgogTF9MQShfdm1hbGxvYykKIExfTEEoX3ZtYWxsb2NfZG9uZSkKIExfTEEoX3RsYndfaGF6YXJkKQpAQCAtNjg2LDYgKzY5MiwxMyBAQAogCWlfYmdlemwocCwgcmVnLCAwKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpCitpbF9iZ2V6KHUzMiAqKnAsIHN0cnVjdCByZWxvYyAqKnIsIHVuc2lnbmVkIGludCByZWcsIGVudW0gbGFiZWxfaWQgbCkKK3sKKwlyX21pcHNfcGMxNihyLCAqcCwgbCk7CisJaV9iZ2V6KHAsIHJlZywgMCk7Cit9CisKIC8qIFRoZSBvbmx5IGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYWxsb3dlZCBpbiBUTEIgaGFuZGxlcnMuICovCiAjZGVmaW5lIEswCQkyNgogI2RlZmluZSBLMQkJMjcKQEAgLTk3MCw3ICs5ODMsMTEgQEAKIAkgKiBUaGUgdm1hbGxvYyBoYW5kbGluZyBpcyBub3QgaW4gdGhlIGhvdHBhdGguCiAJICovCiAJaV9kbWZjMChwLCB0bXAsIEMwX0JBRFZBRERSKTsKKyNpZmRlZiBNT0RVTEVfU1RBUlQKKwlpbF9ibHR6KHAsIHIsIHRtcCwgbGFiZWxfbW9kdWxlX2FsbG9jKTsKKyNlbHNlCiAJaWxfYmx0eihwLCByLCB0bXAsIGxhYmVsX3ZtYWxsb2MpOworI2VuZGlmCiAJLyogTm8gaV9ub3AgbmVlZGVkIGhlcmUsIHNpbmNlIHRoZSBuZXh0IGluc24gZG9lc24ndCB0b3VjaCBUTVAuICovCiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0xMDIzLDggKzEwNDAsNDYgQEAKIHsKIAlsb25nIHN3cGQgPSAobG9uZylzd2FwcGVyX3BnX2RpcjsKIAorI2lmZGVmIE1PRFVMRV9TVEFSVAorCWxvbmcgbW9kZCA9IChsb25nKW1vZHVsZV9wZ19kaXI7CisKKwlsX21vZHVsZV9hbGxvYyhsLCAqcCk7CisJLyoKKwkgKiBBc3N1bXB0aW9uOgorCSAqIFZNQUxMT0NfU1RBUlQgPj0gMHhjMDAwMDAwMDAwMDAwMDAwVUwKKwkgKiBNT0RVTEVfU1RBUlQgPj0gMHhlMDAwMDAwMDAwMDAwMDAwVUwKKwkgKi8KKwlpX1NMTChwLCBwdHIsIGJ2YWRkciwgMik7CisJaWxfYmdleihwLCByLCBwdHIsIGxhYmVsX3ZtYWxsb2MpOworCisJaWYgKGluX2NvbXBhdF9zcGFjZV9wKE1PRFVMRV9TVEFSVCkgJiYgIXJlbF9sbyhNT0RVTEVfU1RBUlQpKSB7CisJCWlfbHVpKHAsIHB0ciwgcmVsX2hpKE1PRFVMRV9TVEFSVCkpOyAvKiBkZWxheSBzbG90ICovCisJfSBlbHNlIHsKKwkJLyogdW5saWtlbHkgY29uZmlndXJhdGlvbiAqLworCQlpX25vcChwKTsgLyogZGVsYXkgc2xvdCAqLworCQlpX0xBKHAsIHB0ciwgTU9EVUxFX1NUQVJUKTsKKwl9CisJaV9kc3VidShwLCBidmFkZHIsIGJ2YWRkciwgcHRyKTsKKworCWlmIChpbl9jb21wYXRfc3BhY2VfcChtb2RkKSAmJiAhcmVsX2xvKG1vZGQpKSB7CisJCWlsX2IocCwgciwgbGFiZWxfdm1hbGxvY19kb25lKTsKKwkJaV9sdWkocCwgcHRyLCByZWxfaGkobW9kZCkpOworCX0gZWxzZSB7CisJCWlfTEFfbW9zdGx5KHAsIHB0ciwgbW9kZCk7CisJCWlsX2IocCwgciwgbGFiZWxfdm1hbGxvY19kb25lKTsKKwkJaV9kYWRkaXUocCwgcHRyLCBwdHIsIHJlbF9sbyhtb2RkKSk7CisJfQorCisJbF92bWFsbG9jKGwsICpwKTsKKwlpZiAoaW5fY29tcGF0X3NwYWNlX3AoTU9EVUxFX1NUQVJUKSAmJiAhcmVsX2xvKE1PRFVMRV9TVEFSVCkgJiYKKwkgICAgTU9EVUxFX1NUQVJUIDw8IDMyID09IFZNQUxMT0NfU1RBUlQpCisJCWlfZHNsbDMyKHAsIHB0ciwgcHRyLCAwKTsJLyogdHlwaWNhbCBjYXNlICovCisJZWxzZQorCQlpX0xBKHAsIHB0ciwgVk1BTExPQ19TVEFSVCk7CisjZWxzZQogCWxfdm1hbGxvYyhsLCAqcCk7CiAJaV9MQShwLCBwdHIsIFZNQUxMT0NfU1RBUlQpOworI2VuZGlmCiAJaV9kc3VidShwLCBidmFkZHIsIGJ2YWRkciwgcHRyKTsKIAogCWlmIChpbl9jb21wYXRfc3BhY2VfcChzd3BkKSAmJiAhcmVsX2xvKHN3cGQpKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvY3BjaS1pcnEuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9jcGNpLWlycS5jCmluZGV4IDQ3ZTNmYTMuLmU1YTRhMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9jcGNpLWlycS5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9jcGNpLWlycS5jCkBAIC02NiwzOSArNjYsNiBAQAogfQogCiAvKgotICogRW5hYmxlcyB0aGUgSVJRIGluIHRoZSBGUEdBCi0gKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV9jcGNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVubWFza19jcGNpX2lycShpcnEpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgSVJRIGluIHRoZSBGUEdBCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9jcGNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVubWFza19jcGNpX2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGlzYWJsZXMgdGhlIElSUSBpbiB0aGUgRlBHQQotICovCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2NwY2lfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza19jcGNpX2lycShpcnEpOwotfQotCi0vKgotICogTWFza3MgYW5kIEFDS3MgYW4gSVJRCi0gKi8KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19jcGNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1hc2tfY3BjaV9pcnEoaXJxKTsKLX0KLQotLyoKICAqIEVuZCBJUlEgcHJvY2Vzc2luZwogICovCiBzdGF0aWMgdm9pZCBlbmRfY3BjaV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTEyNSwxNSArOTIsMTIgQEAKIAlkb19JUlEobHMxYml0OChpcnFfc3JjKSArIENQQ0lfSVJRX0JBU0UpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX2NwY2lfaXJxCWRpc2FibGVfY3BjaV9pcnEKLQogc3RydWN0IGlycV9jaGlwIGNwY2lfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkNQQ0kvRlBHQSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2NwY2lfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2NwY2lfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfY3BjaV9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX2NwY2lfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfY3BjaV9pcnEsCisJLmFjayA9IG1hc2tfY3BjaV9pcnEsCisJLm1hc2sgPSBtYXNrX2NwY2lfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfY3BjaV9pcnEsCisJLnVubWFzayA9IHVubWFza19jcGNpX2lycSwKIAkuZW5kID0gZW5kX2NwY2lfaXJxLAogfTsKIApAQCAtMTQxLDExICsxMDUsNiBAQAogewogCWludCBpOwogCi0JLyogUmVzZXQgaXJxIGhhbmRsZXJzIHBvaW50ZXJzIHRvIE5VTEwgKi8KLQlmb3IgKGkgPSBDUENJX0lSUV9CQVNFOyBpIDwgKENQQ0lfSVJRX0JBU0UgKyA4KTsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAyOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmNwY2lfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IENQQ0lfSVJRX0JBU0U7IGkgPCAoQ1BDSV9JUlFfQkFTRSArIDgpOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmY3BjaV9pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvdWFydC1pcnEuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy91YXJ0LWlycS5jCmluZGV4IDUxMDI1N2QuLjAwMjlmMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy91YXJ0LWlycS5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy91YXJ0LWlycS5jCkBAIC02MCwzOSArNjAsNiBAQAogfQogCiAvKgotICogRW5hYmxlcyB0aGUgSVJRIGluIHRoZSBGUEdBCi0gKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV91YXJ0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVubWFza191YXJ0X2lycShpcnEpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgSVJRIGluIHRoZSBGUEdBCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF91YXJ0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVubWFza191YXJ0X2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGlzYWJsZXMgdGhlIElSUSBpbiB0aGUgRlBHQQotICovCi1zdGF0aWMgdm9pZCBkaXNhYmxlX3VhcnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza191YXJ0X2lycShpcnEpOwotfQotCi0vKgotICogTWFza3MgYW5kIEFDS3MgYW4gSVJRCi0gKi8KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja191YXJ0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1hc2tfdWFydF9pcnEoaXJxKTsKLX0KLQotLyoKICAqIEVuZCBJUlEgcHJvY2Vzc2luZwogICovCiBzdGF0aWMgdm9pZCBlbmRfdWFydF9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTExOCwyOCArODUsMTcgQEAKIAlkb19JUlEobHMxYml0OChpcnFfc3JjKSArIDc0KTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl91YXJ0X2lycQlkaXNhYmxlX3VhcnRfaXJxCi0KIHN0cnVjdCBpcnFfY2hpcCB1YXJ0X2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJVQVJUL0ZQR0EiLAotCS5zdGFydHVwID0gc3RhcnR1cF91YXJ0X2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl91YXJ0X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3VhcnRfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV91YXJ0X2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX3VhcnRfaXJxLAorCS5hY2sgPSBtYXNrX3VhcnRfaXJxLAorCS5tYXNrID0gbWFza191YXJ0X2lycSwKKwkubWFza19hY2sgPSBtYXNrX3VhcnRfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfdWFydF9pcnEsCiAJLmVuZCA9IGVuZF91YXJ0X2lycSwKIH07CiAKIHZvaWQgdWFydF9pcnFfaW5pdCh2b2lkKQogewotCS8qIFJlc2V0IGlycSBoYW5kbGVycyBwb2ludGVycyB0byBOVUxMICovCi0JaXJxX2Rlc2NbODBdLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQlpcnFfZGVzY1s4MF0uYWN0aW9uID0gMDsKLQlpcnFfZGVzY1s4MF0uZGVwdGggPSAyOwotCWlycV9kZXNjWzgwXS5jaGlwID0gJnVhcnRfaXJxX3R5cGU7Ci0KLQlpcnFfZGVzY1s4MV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCWlycV9kZXNjWzgxXS5hY3Rpb24gPSAwOwotCWlycV9kZXNjWzgxXS5kZXB0aCA9IDI7Ci0JaXJxX2Rlc2NbODFdLmNoaXAgPSAmdWFydF9pcnFfdHlwZTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoODAsICZ1YXJ0X2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoODEsICZ1YXJ0X2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCAwYTUwYWFkLi5iZjNiZTZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL01ha2VmaWxlCkBAIC0xMiw1ICsxMiw2IEBACiAKIG9wcm9maWxlLSQoQ09ORklHX0NQVV9NSVBTMzIpCQkrPSBvcF9tb2RlbF9taXBzeHgubwogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX01JUFM2NCkJCSs9IG9wX21vZGVsX21pcHN4eC5vCitvcHJvZmlsZS0kKENPTkZJR19DUFVfUjEwMDAwKQkJKz0gb3BfbW9kZWxfbWlwc3h4Lm8KIG9wcm9maWxlLSQoQ09ORklHX0NQVV9TQjEpCQkrPSBvcF9tb2RlbF9taXBzeHgubwogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1JNOTAwMCkJCSs9IG9wX21vZGVsX3JtOTAwMC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggNjVlYjU1NC4uNGUwYTkwYjM5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCkBAIC04Myw2ICs4Myw5IEBACiAJY2FzZSBDUFVfNzRLOgogCWNhc2UgQ1BVX1NCMToKIAljYXNlIENQVV9TQjFBOgorCWNhc2UgQ1BVX1IxMDAwMDoKKwljYXNlIENQVV9SMTIwMDA6CisJY2FzZSBDUFVfUjE0MDAwOgogCQlsbW9kZWwgPSAmb3BfbW9kZWxfbWlwc3h4X29wczsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwppbmRleCAxZmIyNDBjLi40NTVkNzZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIE1fUEVSRkNUTF9TVVBFUlZJU09SCQkoMVVMICAgICAgPDwgIDIpCiAjZGVmaW5lIE1fUEVSRkNUTF9VU0VSCQkJKDFVTCAgICAgIDw8ICAzKQogI2RlZmluZSBNX1BFUkZDVExfSU5URVJSVVBUX0VOQUJMRQkoMVVMICAgICAgPDwgIDQpCi0jZGVmaW5lIE1fUEVSRkNUTF9FVkVOVChldmVudCkJCSgoZXZlbnQpICA8PCA1KQorI2RlZmluZSBNX1BFUkZDVExfRVZFTlQoZXZlbnQpCQkoKChldmVudCkgJiAweDNmKSAgPDwgNSkKICNkZWZpbmUgTV9QRVJGQ1RMX1ZQRUlEKHZwZSkJCSgodnBlKSAgICA8PCAxNikKICNkZWZpbmUgTV9QRVJGQ1RMX01UX0VOKGZpbHRlcikJCSgoZmlsdGVyKSA8PCAyMCkKICNkZWZpbmUgICAgTV9UQ19FTl9BTEwJCQlNX1BFUkZDVExfTVRfRU4oMCkKQEAgLTIxOCwxMyArMjE4LDIzIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IG5fY291bnRlcnModm9pZCkKIHsKLQlpbnQgY291bnRlcnMgPSBfX25fY291bnRlcnMoKTsKKwlpbnQgY291bnRlcnM7CisKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSkgeworCWNhc2UgQ1BVX1IxMDAwMDoKKwkJY291bnRlcnMgPSAyOworCisJY2FzZSBDUFVfUjEyMDAwOgorCWNhc2UgQ1BVX1IxNDAwMDoKKwkJY291bnRlcnMgPSA0OworCisJZGVmYXVsdDoKKwkJY291bnRlcnMgPSBfX25fY291bnRlcnMoKTsKKwl9CiAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKLQlpZiAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV8zNEspCi0JCXJldHVybiBjb3VudGVycyA+PiAxOworCWNvdW50ZXJzID4+IDE7CiAjZW5kaWYKLQogCXJldHVybiBjb3VudGVyczsKIH0KIApAQCAtMjg0LDYgKzI5NCwxOCBAQAogCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvNUsiOwogCQlicmVhazsKIAorCWNhc2UgQ1BVX1IxMDAwMDoKKwkJaWYgKChjdXJyZW50X2NwdV9kYXRhLnByb2Nlc3Nvcl9pZCAmIDB4ZmYpID09IDB4MjApCisJCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvcjEwMDAwLXYyLngiOworCQllbHNlCisJCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvcjEwMDAwIjsKKwkJYnJlYWs7CisKKwljYXNlIENQVV9SMTIwMDA6CisJY2FzZSBDUFVfUjE0MDAwOgorCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvcjEyMDAwIjsKKwkJYnJlYWs7CisKIAljYXNlIENQVV9TQjE6CiAJY2FzZSBDUFVfU0IxQToKIAkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzL3NiMSI7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWNvYmFsdC5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1jb2JhbHQuYwppbmRleCA3NWEwMWU3Li43ZDVmNmJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWNvYmFsdC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtY29iYWx0LmMKQEAgLTk0LDIyICs5NCwyMSBAQAogI2lmIDAKIAlpZiAoZ2FsaWxlb19pZCA+PSAweDEwKSB7CiAJCS8qIE5ldyBHYWxpbGVvLCBhc3N1bWVzIFBDSSBzdG9wIGxpbmUgdG8gVklBIGlzIGNvbm5lY3RlZC4gKi8KLQkJR0FMSUxFT19PVVRMKDB4NDAyMCwgR1RfUENJMF9UT1JfT0ZTKTsKKwkJR1RfV1JJVEUoR1RfUENJMF9UT1JfT0ZTLCAweDQwMjApOwogCX0gZWxzZSBpZiAoZ2FsaWxlb19pZCA9PSAweDEgfHwgZ2FsaWxlb19pZCA9PSAweDIpCiAjZW5kaWYKIAl7CiAJCXNpZ25lZCBpbnQgdGltZW87CiAJCS8qIFhYWCBXRSBNVVNUIERPIFRISVMgRUxTRSBHQUxJTEVPIExPQ0tTIFVQISAtRGF2ZU0gKi8KLQkJdGltZW8gPSBHQUxJTEVPX0lOTChHVF9QQ0kwX1RPUl9PRlMpOworCQl0aW1lbyA9IEdUX1JFQUQoR1RfUENJMF9UT1JfT0ZTKTsKIAkJLyogT2xkIEdhbGlsZW8sIGFzc3VtZXMgUENJIFNUT1AgbGluZSB0byBWSUEgaXMgZGlzY29ubmVjdGVkLiAqLwotCQlHQUxJTEVPX09VVEwoCisJCUdUX1dSSVRFKEdUX1BDSTBfVE9SX09GUywKIAkJCSgweGZmIDw8IDE2KSB8CQkvKiByZXRyeSBjb3VudCAqLwogCQkJKDB4ZmYgPDwgOCkgfAkJLyogdGltZW91dCAxICAgKi8KLQkJCTB4ZmYsCQkJLyogdGltZW91dCAwICAgKi8KLQkJCUdUX1BDSTBfVE9SX09GUyk7CisJCQkweGZmKTsJCQkvKiB0aW1lb3V0IDAgICAqLwogCiAJCS8qIGVuYWJsZSBQQ0kgcmV0cnkgZXhjZWVkZWQgaW50ZXJydXB0ICovCi0JCUdBTElMRU9fT1VUTChHQUxJTEVPX0lOVFJfUkVUUllfQ1RSIHwgR0FMSUxFT19JTkwoR1RfSU5UUk1BU0tfT0ZTKSwgR1RfSU5UUk1BU0tfT0ZTKTsKKwkJR1RfV1JJVEUoR1RfSU5UUk1BU0tfT0ZTLCBHVF9JTlRSX1JFVFJZQ1RSMF9NU0sgfCBHVF9SRUFEKEdUX0lOVFJNQVNLX09GUykpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NDExMS5jIGIvYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NDExMS5jCmluZGV4IDEzZGU0NTkuLmVjZDM5OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMTEuYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1ndDY0MTExLmMKQEAgLTM4LDE4ICszOCwxOCBAQAogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgNDoKIAkJUENJX0NGR19TRVQoZGV2Zm4sIHdoZXJlKTsKLQkJKnZhbCA9IEdBTElMRU9fSU5MKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworCQkqdmFsID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIAogCWNhc2UgMjoKIAkJUENJX0NGR19TRVQoZGV2Zm4sICh3aGVyZSAmIH4weDMpKTsKLQkJKnZhbCA9IEdBTElMRU9fSU5MKEdUX1BDSTBfQ0ZHREFUQV9PRlMpCisJCSp2YWwgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpCiAJCSAgICA+PiAoKHdoZXJlICYgMykgKiA4KTsKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIAogCWNhc2UgMToKIAkJUENJX0NGR19TRVQoZGV2Zm4sICh3aGVyZSAmIH4weDMpKTsKLQkJKnZhbCA9IEdBTElMRU9fSU5MKEdUX1BDSTBfQ0ZHREFUQV9PRlMpCisJCSp2YWwgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpCiAJCSAgICA+PiAoKHdoZXJlICYgMykgKiA4KTsKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIAl9CkBAIC02OCwyNSArNjgsMjUgQEAKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDQ6CiAJCVBDSV9DRkdfU0VUKGRldmZuLCB3aGVyZSk7Ci0JCUdBTElMRU9fT1VUTCh2YWwsIEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworCQlHVF9XUklURShHVF9QQ0kwX0NGR0RBVEFfT0ZTLCB2YWwpOwogCiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiAKIAljYXNlIDI6CiAJCVBDSV9DRkdfU0VUKGRldmZuLCAod2hlcmUgJiB+MHgzKSk7Ci0JCXRtcCA9IEdBTElMRU9fSU5MKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworCQl0bXAgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwogCQl0bXAgJj0gfigweGZmZmYgPDwgKCh3aGVyZSAmIDB4MykgKiA4KSk7CiAJCXRtcCB8PSAodmFsIDw8ICgod2hlcmUgJiAweDMpICogOCkpOwotCQlHQUxJTEVPX09VVEwodG1wLCBHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKKwkJR1RfV1JJVEUoR1RfUENJMF9DRkdEQVRBX09GUywgdG1wKTsKIAogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogCiAJY2FzZSAxOgogCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQl0bXAgPSBHQUxJTEVPX0lOTChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKKwkJdG1wID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKIAkJdG1wICY9IH4oMHhmZiA8PCAoKHdoZXJlICYgMHgzKSAqIDgpKTsKIAkJdG1wIHw9ICh2YWwgPDwgKCh3aGVyZSAmIDB4MykgKiA4KSk7Ci0JCUdBTElMRU9fT1VUTCh0bXAsIEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworCQlHVF9XUklURShHVF9QQ0kwX0NGR0RBVEFfT0ZTLCB0bXApOwogCiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9jb21tb24vaW50LmMgYi9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi9pbnQuYwppbmRleCA3MTA2MTE2Li4wZGMyMzkzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi9pbnQuYworKysgYi9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi9pbnQuYwpAQCAtMzgsOCArMzgsNiBAQAogI2luY2x1ZGUgPGludC5oPgogI2luY2x1ZGUgPHVhcnQuaD4KIAotc3RhdGljIERFRklORV9TUElOTE9DSyhpcnFfbG9jayk7Ci0KIC8qIGRlZmF1bHQgcHJpbyBmb3IgaW50ZXJydXB0cyAqLwogLyogZmlyc3Qgb25lIGlzIGEgbm8tbm8gc28gdGhlcmVmb3JlIGFsd2F5cyBwcmlvIDAgKGRpc2FibGVkKSAqLwogc3RhdGljIGNoYXIgZ2ljX3ByaW9bUE5YODU1MF9JTlRfR0lDX1RPVElOVF0gPSB7CkBAIC0xNDksMzggKzE0Nyw2IEBACiAJfQogfQogCi0jZGVmaW5lIHBueDg1NTBfZGlzYWJsZSBwbng4NTUwX2Fjawotc3RhdGljIHZvaWQgcG54ODU1MF9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9sb2NrLCBmbGFncyk7Ci0JbWFza19pcnEoaXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfbG9jaywgZmxhZ3MpOwotfQotCi0jZGVmaW5lIHBueDg1NTBfZW5hYmxlIHBueDg1NTBfdW5tYXNrCi1zdGF0aWMgdm9pZCBwbng4NTUwX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2xvY2ssIGZsYWdzKTsKLQl1bm1hc2tfaXJxKGlycSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXBueDg1NTBfdW5tYXNrKGlycV9ucik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXBueDg1NTBfYWNrKGlycV9ucik7Ci0JcmV0dXJuOwotfQotCiBpbnQgcG54ODU1MF9zZXRfZ2ljX3ByaW9yaXR5KGludCBpcnEsIGludCBwcmlvcml0eSkKIHsKIAlpbnQgZ2ljX2lycSA9IGlycS1QTlg4NTUwX0lOVF9HSUNfTUlOOwpAQCAtMTkyLDI2ICsxNTgsMTkgQEAKIAlyZXR1cm4gcHJldl9wcmlvcml0eTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1hc2tfYW5kX2Fja19sZXZlbF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlwbng4NTUwX2Rpc2FibGUoaXJxKTsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyB2b2lkIGVuZF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkgewotCQlwbng4NTUwX2VuYWJsZShpcnEpOworCQl1bm1hc2tfaXJxKGlycSk7CiAJfQogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGxldmVsX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9CSJQTlggTGV2ZWwgSVJRIiwKLQkuc3RhcnR1cCA9CXN0YXJ0dXBfaXJxLAotCS5zaHV0ZG93biA9CXNodXRkb3duX2lycSwKLQkuZW5hYmxlID0JcG54ODU1MF9lbmFibGUsCi0JLmRpc2FibGUgPQlwbng4NTUwX2Rpc2FibGUsCi0JLmFjayA9CQltYXNrX2FuZF9hY2tfbGV2ZWxfaXJxLAorCS5hY2sgPQkJbWFza19pcnEsCisJLm1hc2sgPQkJbWFza19pcnEsCisJLm1hc2tfYWNrID0JbWFza19pcnEsCisJLnVubWFzayA9CXVubWFza19pcnEsCiAJLmVuZCA9CQllbmRfaXJxLAogfTsKIApAQCAtMjMzLDggKzE5Miw4IEBACiAJaW50IGNvbmZpZ1BSOwogCiAJZm9yIChpID0gMDsgaSA8IFBOWDg1NTBfSU5UX0NQMF9UT1RJTlQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmxldmVsX2lycV90eXBlOwotCQlwbng4NTUwX2FjayhpKTsJLyogbWFzayB0aGUgaXJxIGp1c3QgaW4gY2FzZSAgKi8KKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZsZXZlbF9pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CisJCW1hc2tfaXJxKGkpOwkvKiBtYXNrIHRoZSBpcnEganVzdCBpbiBjYXNlICAqLwogCX0KIAogCS8qIGluaXQgb2YgR0lDL0lQQyBpbnRlcnJ1cHRzICovCkBAIC0yNzAsNyArMjI5LDcgQEAKIAkJLyogbWFzay9wcmlvcml0eSBpcyBzdGlsbCAwIHNvIHdlIHdpbGwgbm90IGdldCBhbnkKIAkJICogaW50ZXJydXB0cyB1bnRpbCBpdCBpcyB1bm1hc2tlZCAqLwogCi0JCWlycV9kZXNjW2ldLmNoaXAgPSAmbGV2ZWxfaXJxX3R5cGU7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmbGV2ZWxfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogCX0KIAogCS8qIFByaW9yaXR5IGxldmVsIDAgKi8KQEAgLTI3OSwyMCArMjM4LDIxIEBACiAJLyogU2V0IGludCB2ZWN0b3IgdGFibGUgYWRkcmVzcyAqLwogCVBOWDg1NTBfR0lDX1ZFQ1RPUl8wID0gUE5YODU1MF9HSUNfVkVDVE9SXzEgPSAwOwogCi0JaXJxX2Rlc2NbTUlQU19DUFVfR0lDX0lSUV0uY2hpcCA9ICZsZXZlbF9pcnFfdHlwZTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoTUlQU19DUFVfR0lDX0lSUSwgJmxldmVsX2lycV90eXBlLAorCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAlzZXR1cF9pcnEoTUlQU19DUFVfR0lDX0lSUSwgJmdpY19hY3Rpb24pOwogCiAJLyogaW5pdCBvZiBUaW1lciBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gUE5YODU1MF9JTlRfVElNRVJfTUlOOyBpIDw9IFBOWDg1NTBfSU5UX1RJTUVSX01BWDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmbGV2ZWxfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IFBOWDg1NTBfSU5UX1RJTUVSX01JTjsgaSA8PSBQTlg4NTUwX0lOVF9USU1FUl9NQVg7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZsZXZlbF9pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CiAKIAkvKiBTdG9wIFRpbWVyIDEtMyAqLwogCWNvbmZpZ1BSID0gcmVhZF9jMF9jb25maWc3KCk7CiAJY29uZmlnUFIgfD0gMHgwMDAwMDAzODsKIAl3cml0ZV9jMF9jb25maWc3KGNvbmZpZ1BSKTsKIAotCWlycV9kZXNjW01JUFNfQ1BVX1RJTUVSX0lSUV0uY2hpcCA9ICZsZXZlbF9pcnFfdHlwZTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoTUlQU19DUFVfVElNRVJfSVJRLCAmbGV2ZWxfaXJxX3R5cGUsCisJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCXNldHVwX2lycShNSVBTX0NQVV9USU1FUl9JUlEsICZ0aW1lcl9hY3Rpb24pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9zbXAuYyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jCmluZGV4IDNjYzA0MzYuLjMwNTQ5MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jCkBAIC05OSw4ICs5OSw2IEBACiAgKi8KIHZvaWQgcHJvbV9pbml0X3NlY29uZGFyeSh2b2lkKQogewotCW1pcHNfaHB0X2luaXQoKTsKLQogCXNldF9jMF9zdGF0dXMoU1QwX0NPIHwgU1QwX0lFIHwgU1QwX0lNKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItZWlzYS5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItZWlzYS5jCmluZGV4IDBkMThlZDQuLmExYTlhZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWVpc2EuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1laXNhLmMKQEAgLTk1LDE2ICs5NSwxMSBAQAogCiBzdGF0aWMgdm9pZCBlbmFibGVfZWlzYTFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBtYXNrOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCiAJbWFzayA9IGluYihFSVNBX0lOVDFfTUFTSyk7CiAJbWFzayAmPSB+KCh1OCkgKDEgPDwgaXJxKSk7CiAJb3V0YihtYXNrLCBFSVNBX0lOVDFfTUFTSyk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9laXNhMV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTEzMCw4ICsxMjUsNiBAQAogCW91dGIobWFzaywgRUlTQV9JTlQxX01BU0spOwogfQogCi0jZGVmaW5lIHNodXRkb3duX2Vpc2ExX2lycQlkaXNhYmxlX2Vpc2ExX2lycQotCiBzdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfZWlzYTFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJZGlzYWJsZV9laXNhMV9pcnEoaXJxKTsKQEAgLTE0OCwyNSArMTQxLDIwIEBACiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMjJfZWlzYTFfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIklQMjIgRUlTQSIsCiAJLnN0YXJ0dXAJPSBzdGFydHVwX2Vpc2ExX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9laXNhMV9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfZWlzYTFfaXJxLAotCS5kaXNhYmxlCT0gZGlzYWJsZV9laXNhMV9pcnEsCiAJLmFjawkJPSBtYXNrX2FuZF9hY2tfZWlzYTFfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfZWlzYTFfaXJxLAorCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja19laXNhMV9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfZWlzYTFfaXJxLAogCS5lbmQJCT0gZW5kX2Vpc2ExX2lycSwKIH07CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9laXNhMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IG1hc2s7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAltYXNrID0gaW5iKEVJU0FfSU5UMl9NQVNLKTsKIAltYXNrICY9IH4oKHU4KSAoMSA8PCAoaXJxIC0gOCkpKTsKIAlvdXRiKG1hc2ssIEVJU0FfSU5UMl9NQVNLKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2Vpc2EyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTkyLDggKzE4MCw2IEBACiAJb3V0YihtYXNrLCBFSVNBX0lOVDJfTUFTSyk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fZWlzYTJfaXJxCWRpc2FibGVfZWlzYTJfaXJxCi0KIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19laXNhMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlkaXNhYmxlX2Vpc2EyX2lycShpcnEpOwpAQCAtMjEwLDEwICsxOTYsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXAyMl9laXNhMl9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiSVAyMiBFSVNBIiwKIAkuc3RhcnR1cAk9IHN0YXJ0dXBfZWlzYTJfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2Vpc2EyX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9laXNhMl9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX2Vpc2EyX2lycSwKIAkuYWNrCQk9IG1hc2tfYW5kX2Fja19laXNhMl9pcnEsCisJLm1hc2sJCT0gZGlzYWJsZV9laXNhMl9pcnEsCisJLm1hc2tfYWNrCT0gbWFza19hbmRfYWNrX2Vpc2EyX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9laXNhMl9pcnEsCiAJLmVuZAkJPSBlbmRfZWlzYTJfaXJxLAogfTsKIApAQCAtMjc1LDEzICsyNjEsMTAgQEAKIAlvdXRiKDAsIEVJU0FfRE1BMl9XUklURV9TSU5HTEUpOwogCiAJZm9yIChpID0gU0dJTlRfRUlTQTsgaSA8IChTR0lOVF9FSVNBICsgRUlTQV9NQVhfSVJRKTsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwogCQlpZiAoaSA8IChTR0lOVF9FSVNBICsgOCkpCi0JCQlpcnFfZGVzY1tpXS5jaGlwID0gJmlwMjJfZWlzYTFfaXJxX3R5cGU7CisJCQlzZXRfaXJxX2NoaXAoaSwgJmlwMjJfZWlzYTFfaXJxX3R5cGUpOwogCQllbHNlCi0JCQlpcnFfZGVzY1tpXS5jaGlwID0gJmlwMjJfZWlzYTJfaXJxX3R5cGU7CisJCQlzZXRfaXJxX2NoaXAoaSwgJmlwMjJfZWlzYTJfaXJxX3R5cGUpOwogCX0KIAogCS8qIENhbm5vdCB1c2UgcmVxdWVzdF9pcnEgYmVjYXVzZSBvZiBrbWFsbG9jIG5vdCBiZWluZyByZWFkeSBhdCBzdWNoCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1pbnQuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCmluZGV4IGFmNTE4ODkuLmM3YjEzODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCkBAIC00MCwzNCArNDAsMTcgQEAKIAogc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsMF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCS8qIGRvbid0IGFsbG93IG1hcHBhYmxlIGludGVycnVwdCB0byBiZSBlbmFibGVkIGZyb20gc2V0dXBfaXJxLAogCSAqIHdlIGhhdmUgb3VyIG93biB3YXkgdG8gZG8gc28gKi8KIAlpZiAoaXJxICE9IFNHSV9NQVBfMF9JUlEpCiAJCXNnaW50LT5pbWFzazAgfD0gKDEgPDwgKGlycSAtIFNHSU5UX0xPQ0FMMCkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2xvY2FsMF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbG9jYWwwX2lycShpcnEpOwotCXJldHVybiAwOwkJLyogTmV2ZXIgYW55dGhpbmcgcGVuZGluZyAgKi8KIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9sb2NhbDBfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+aW1hc2swICY9IH4oMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwwKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX2xvY2FsMF9pcnEJZGlzYWJsZV9sb2NhbDBfaXJxCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19sb2NhbDBfaXJxCWRpc2FibGVfbG9jYWwwX2lycQotCiBzdGF0aWMgdm9pZCBlbmRfbG9jYWwwX2lycSAodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKQEAgLTc2LDQ0ICs1OSwyNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMjJfbG9jYWwwX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJJUDIyIGxvY2FsIDAiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9sb2NhbDBfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2xvY2FsMF9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfbG9jYWwwX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbG9jYWwwX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19sb2NhbDBfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9sb2NhbDBfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfbG9jYWwwX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2xvY2FsMF9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfbG9jYWwwX2lycSwKIAkuZW5kCQk9IGVuZF9sb2NhbDBfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsMV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCS8qIGRvbid0IGFsbG93IG1hcHBhYmxlIGludGVycnVwdCB0byBiZSBlbmFibGVkIGZyb20gc2V0dXBfaXJxLAogCSAqIHdlIGhhdmUgb3VyIG93biB3YXkgdG8gZG8gc28gKi8KIAlpZiAoaXJxICE9IFNHSV9NQVBfMV9JUlEpCiAJCXNnaW50LT5pbWFzazEgfD0gKDEgPDwgKGlycSAtIFNHSU5UX0xPQ0FMMSkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2xvY2FsMV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbG9jYWwxX2lycShpcnEpOwotCXJldHVybiAwOwkJLyogTmV2ZXIgYW55dGhpbmcgcGVuZGluZyAgKi8KIH0KIAogdm9pZCBkaXNhYmxlX2xvY2FsMV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXNnaW50LT5pbWFzazEgJj0gfigxIDw8IChpcnEgLSBTR0lOVF9MT0NBTDEpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fbG9jYWwxX2lycQlkaXNhYmxlX2xvY2FsMV9pcnEKLSNkZWZpbmUgbWFza19hbmRfYWNrX2xvY2FsMV9pcnEJZGlzYWJsZV9sb2NhbDFfaXJxCi0KIHN0YXRpYyB2b2lkIGVuZF9sb2NhbDFfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQpAQCAtMTIyLDQ0ICs4NywyNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMjJfbG9jYWwxX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJJUDIyIGxvY2FsIDEiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9sb2NhbDFfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2xvY2FsMV9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfbG9jYWwxX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbG9jYWwxX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19sb2NhbDFfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9sb2NhbDFfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfbG9jYWwxX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2xvY2FsMV9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfbG9jYWwxX2lycSwKIAkuZW5kCQk9IGVuZF9sb2NhbDFfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXNnaW50LT5pbWFzazAgfD0gKDEgPDwgKFNHSV9NQVBfMF9JUlEgLSBTR0lOVF9MT0NBTDApKTsKIAlzZ2ludC0+Y21laW1hc2swIHw9ICgxIDw8IChpcnEgLSBTR0lOVF9MT0NBTDIpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sb2NhbDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2xvY2FsMl9pcnEoaXJxKTsKLQlyZXR1cm4gMDsJCS8qIE5ldmVyIGFueXRoaW5nIHBlbmRpbmcgICovCiB9CiAKIHZvaWQgZGlzYWJsZV9sb2NhbDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+Y21laW1hc2swICY9IH4oMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwyKSk7CiAJaWYgKCFzZ2ludC0+Y21laW1hc2swKQogCQlzZ2ludC0+aW1hc2swICY9IH4oMSA8PCAoU0dJX01BUF8wX0lSUSAtIFNHSU5UX0xPQ0FMMCkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9sb2NhbDJfaXJxIGRpc2FibGVfbG9jYWwyX2lycQotI2RlZmluZSBtYXNrX2FuZF9hY2tfbG9jYWwyX2lycQlkaXNhYmxlX2xvY2FsMl9pcnEKLQogc3RhdGljIHZvaWQgZW5kX2xvY2FsMl9pcnEgKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCkBAIC0xNjgsNDQgKzExNSwyNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMjJfbG9jYWwyX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJJUDIyIGxvY2FsIDIiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9sb2NhbDJfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2xvY2FsMl9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfbG9jYWwyX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbG9jYWwyX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19sb2NhbDJfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9sb2NhbDJfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfbG9jYWwyX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2xvY2FsMl9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfbG9jYWwyX2lycSwKIAkuZW5kCQk9IGVuZF9sb2NhbDJfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsM19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXNnaW50LT5pbWFzazEgfD0gKDEgPDwgKFNHSV9NQVBfMV9JUlEgLSBTR0lOVF9MT0NBTDEpKTsKIAlzZ2ludC0+Y21laW1hc2sxIHw9ICgxIDw8IChpcnEgLSBTR0lOVF9MT0NBTDMpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sb2NhbDNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2xvY2FsM19pcnEoaXJxKTsKLQlyZXR1cm4gMDsJCS8qIE5ldmVyIGFueXRoaW5nIHBlbmRpbmcgICovCiB9CiAKIHZvaWQgZGlzYWJsZV9sb2NhbDNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+Y21laW1hc2sxICY9IH4oMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwzKSk7CiAJaWYgKCFzZ2ludC0+Y21laW1hc2sxKQogCQlzZ2ludC0+aW1hc2sxICY9IH4oMSA8PCAoU0dJX01BUF8xX0lSUSAtIFNHSU5UX0xPQ0FMMSkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9sb2NhbDNfaXJxIGRpc2FibGVfbG9jYWwzX2lycQotI2RlZmluZSBtYXNrX2FuZF9hY2tfbG9jYWwzX2lycQlkaXNhYmxlX2xvY2FsM19pcnEKLQogc3RhdGljIHZvaWQgZW5kX2xvY2FsM19pcnEgKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCkBAIC0yMTQsMTEgKzE0MywxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMjJfbG9jYWwzX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJJUDIyIGxvY2FsIDMiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9sb2NhbDNfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2xvY2FsM19pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfbG9jYWwzX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbG9jYWwzX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19sb2NhbDNfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9sb2NhbDNfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfbG9jYWwzX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2xvY2FsM19pcnEsCisJLnVubWFzawkJPSBlbmFibGVfbG9jYWwzX2lycSwKIAkuZW5kCQk9IGVuZF9sb2NhbDNfaXJxLAogfTsKIApAQCAtNDMwLDEwICszNTgsNyBAQAogCQllbHNlCiAJCQloYW5kbGVyCQk9ICZpcDIyX2xvY2FsM19pcnFfdHlwZTsKIAotCQlpcnFfZGVzY1tpXS5zdGF0dXMJPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbgk9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoCT0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcAk9IGhhbmRsZXI7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCBoYW5kbGVyLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAl9CiAKIAkvKiB2ZWN0b3IgaGFuZGxlci4gdGhpcyByZWdpc3RlciB0aGUgSVJRIGFzIG5vbi1zaGFyYWJsZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYwppbmRleCAyNzBlY2QzLi41Zjg4MzViIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYwpAQCAtMzMyLDExICszMzIsNiBAQAogCWludHJfZGlzY29ubmVjdF9sZXZlbChjcHUsIHN3bGV2ZWwpOwogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfYnJpZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfYnJpZGdlX2lycShpcnEpOwotfQotCiBzdGF0aWMgdm9pZCBlbmRfYnJpZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpICYmCkBAIC0zNDgsMTggKzM0MywxNiBAQAogCS50eXBlbmFtZQk9ICJicmlkZ2UiLAogCS5zdGFydHVwCT0gc3RhcnR1cF9icmlkZ2VfaXJxLAogCS5zaHV0ZG93bgk9IHNodXRkb3duX2JyaWRnZV9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfYnJpZGdlX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfYnJpZGdlX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19icmlkZ2VfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9icmlkZ2VfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfYnJpZGdlX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2JyaWRnZV9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfYnJpZGdlX2lycSwKIAkuZW5kCQk9IGVuZF9icmlkZ2VfaXJxLAogfTsKIAogdm9pZCBfX2RldmluaXQgcmVnaXN0ZXJfYnJpZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWlycV9kZXNjW2lycV0uc3RhdHVzCT0gSVJRX0RJU0FCTEVEOwotCWlycV9kZXNjW2lycV0uYWN0aW9uCT0gMDsKLQlpcnFfZGVzY1tpcnFdLmRlcHRoCT0gMTsKLQlpcnFfZGVzY1tpcnFdLmNoaXAJPSAmYnJpZGdlX2lycV90eXBlOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZicmlkZ2VfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogfQogCiBpbnQgX19kZXZpbml0IHJlcXVlc3RfYnJpZGdlX2lycShzdHJ1Y3QgYnJpZGdlX2NvbnRyb2xsZXIgKmJjKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKaW5kZXggNWU4MmEyNi4uN2QzNjE3MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCkBAIC0xNzIsMTUgKzE3Miw2IEBACiAgICAgICAgIHJldHVybiBta3RpbWUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbiwgc2VjKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3J0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9ydF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLX0KLQogc3RhdGljIHZvaWQgZW5hYmxlX3J0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogfQpAQCAtMTg5LDIxICsxODAsMTcgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX3J0KHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KIHN0YXRpYyB2b2lkIGVuZF9ydF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBydF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiU04gSFVCIFJUIHRpbWVyIiwKLQkuc3RhcnR1cAk9IHN0YXJ0dXBfcnRfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX3J0X2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9ydF9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX3J0X2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19ydCwKKwkuYWNrCQk9IGRpc2FibGVfcnRfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfcnRfaXJxLAorCS5tYXNrX2Fjawk9IGRpc2FibGVfcnRfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3J0X2lycSwKKwkuZW9pCQk9IGVuYWJsZV9ydF9pcnEsCiAJLmVuZAkJPSBlbmRfcnRfaXJxLAogfTsKIApAQCAtMjIxLDEwICsyMDgsNyBAQAogCWlmIChpcnFubyA8IDApCiAJCXBhbmljKCJDYW4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aW1lciBpbnRlcnJ1cHQiKTsKIAotCWlycV9kZXNjW2lycW5vXS5zdGF0dXMJPSBJUlFfRElTQUJMRUQ7Ci0JaXJxX2Rlc2NbaXJxbm9dLmFjdGlvbgk9IE5VTEw7Ci0JaXJxX2Rlc2NbaXJxbm9dLmRlcHRoCT0gMTsKLQlpcnFfZGVzY1tpcnFub10uY2hpcAk9ICZydF9pcnFfdHlwZTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxbm8sICZydF9pcnFfdHlwZSwgaGFuZGxlX3BlcmNwdV9pcnEpOwogCiAJLyogb3Zlci13cml0ZSB0aGUgaGFuZGxlciwgd2UgdXNlIG91ciBvd24gd2F5ICovCiAJaXJxLT5oYW5kbGVyID0gbm9fYWN0aW9uOwpAQCAtMjM5LDE0ICsyMjMsMTQgQEAKIAlzZXR1cF9pcnEoaXJxbm8sICZydF9pcnFhY3Rpb24pOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwMjdfaHB0X3JlYWQodm9pZCkKK3N0YXRpYyBjeWNsZV90IGlwMjdfaHB0X3JlYWQodm9pZCkKIHsKIAlyZXR1cm4gUkVNT1RFX0hVQl9MKGNwdXRvbmFzaWQoMCksIFBJX1JUX0NPVU5UKTsKIH0KIAogdm9pZCBfX2luaXQgaXAyN190aW1lX2luaXQodm9pZCkKIHsKLQltaXBzX2hwdF9yZWFkID0gaXAyN19ocHRfcmVhZDsKKwljbG9ja3NvdXJjZV9taXBzLnJlYWQgPSBpcDI3X2hwdF9yZWFkOwogCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IENZQ0xFU19QRVJfU0VDOwogCXh0aW1lLnR2X3NlYyA9IGdldF9tNDh0MzVfdGltZSgpOwogCXh0aW1lLnR2X25zZWMgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItaXJxLmMgYi9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1pcnEuYwppbmRleCBjOWFjYWRkLi5hZTA2Mzg2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1pcnEuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1pcnEuYwpAQCAtMTEzLDEyICsxMTMsNiBAQAogICogaXMgcXVpdGUgZGlmZmVyZW50IGFueXdheS4KICAqLwogCi0vKgotICogSVJRIHNwaW5sb2NrIC0gUmFsZiBzYXlzIG5vdCB0byBkaXNhYmxlIENQVSBpbnRlcnJ1cHRzLAotICogYW5kIEkgdGhpbmsgaGUga25vd3MgYmV0dGVyLgotICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlwMzJfaXJxX2xvY2spOwotCiAvKiBTb21lIGluaXRpYWwgaW50ZXJydXB0cyB0byBzZXQgdXAgKi8KIGV4dGVybiBpcnFyZXR1cm5fdCBjcmltZV9tZW1lcnJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIGlycXJldHVybl90IGNyaW1lX2NwdWVycl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CkBAIC0xMzgsMTIgKzEzMiw2IEBACiAJc2V0X2MwX3N0YXR1cyhTVEFUVVNGX0lQNyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9jcHVfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2NwdV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZGlzYWJsZV9jcHVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJY2xlYXJfYzBfc3RhdHVzKFNUQVRVU0ZfSVA3KTsKQEAgLTE1NSwxNiArMTQzLDEyIEBACiAJCWVuYWJsZV9jcHVfaXJxIChpcnEpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX2NwdV9pcnEgZGlzYWJsZV9jcHVfaXJxCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19jcHVfaXJxIGRpc2FibGVfY3B1X2lycQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMzJfY3B1X2ludGVycnVwdCA9IHsKIAkudHlwZW5hbWUgPSAiSVAzMiBDUFUiLAotCS5zdGFydHVwID0gc3RhcnR1cF9jcHVfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2NwdV9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9jcHVfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9jcHVfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfY3B1X2lycSwKKwkuYWNrID0gZGlzYWJsZV9jcHVfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9jcHVfaXJxLAorCS5tYXNrX2FjayA9IGRpc2FibGVfY3B1X2lycSwKKwkudW5tYXNrID0gZW5hYmxlX2NwdV9pcnEsCiAJLmVuZCA9IGVuZF9jcHVfaXJxLAogfTsKIApAQCAtMTc3LDQ1ICsxNjEsMjcgQEAKIAogc3RhdGljIHZvaWQgZW5hYmxlX2NyaW1lX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCWNyaW1lX21hc2sgfD0gMSA8PCAoaXJxIC0gMSk7CiAJY3JpbWUtPmltYXNrID0gY3JpbWVfbWFzazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9jcmltZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfY3JpbWVfaXJxKGlycSk7Ci0JcmV0dXJuIDA7IC8qIFRoaXMgaXMgcHJvYmFibHkgbm90IHJpZ2h0OyB3ZSBjb3VsZCBoYXZlIHBlbmRpbmcgaXJxcyAqLwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2NyaW1lX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCWNyaW1lX21hc2sgJj0gfigxIDw8IChpcnEgLSAxKSk7CiAJY3JpbWUtPmltYXNrID0gY3JpbWVfbWFzazsKIAlmbHVzaF9jcmltZV9idXMoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19jcmltZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyogRWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0cyBtdXN0IGJlIGNsZWFyZWQuICovCiAJaWYgKChpcnEgPj0gQ1JJTUVfR0JFMF9JUlEgJiYgaXJxIDw9IENSSU1FX0dCRTNfSVJRKQogCSAgICB8fCAoaXJxID49IENSSU1FX1JFX0VNUFRZX0VfSVJRICYmIGlycSA8PSBDUklNRV9SRV9JRExFX0VfSVJRKQogCSAgICB8fCAoaXJxID49IENSSU1FX1NPRlQwX0lSUSAmJiBpcnEgPD0gQ1JJTUVfU09GVDJfSVJRKSkgewogCSAgICAgICAgdWludDY0X3QgY3JpbWVfaW50OwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCQljcmltZV9pbnQgPSBjcmltZS0+aGFyZF9pbnQ7CiAJCWNyaW1lX2ludCAmPSB+KDEgPDwgKGlycSAtIDEpKTsKIAkJY3JpbWUtPmhhcmRfaW50ID0gY3JpbWVfaW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJfQogCWRpc2FibGVfY3JpbWVfaXJxKGlycSk7CiB9CkBAIC0yMjYsMTUgKzE5MiwxMiBAQAogCQllbmFibGVfY3JpbWVfaXJxKGlycSk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fY3JpbWVfaXJxIGRpc2FibGVfY3JpbWVfaXJxCi0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXAzMl9jcmltZV9pbnRlcnJ1cHQgPSB7CiAJLnR5cGVuYW1lID0gIklQMzIgQ1JJTUUiLAotCS5zdGFydHVwID0gc3RhcnR1cF9jcmltZV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fY3JpbWVfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfY3JpbWVfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9jcmltZV9pcnEsCiAJLmFjayA9IG1hc2tfYW5kX2Fja19jcmltZV9pcnEsCisJLm1hc2sgPSBkaXNhYmxlX2NyaW1lX2lycSwKKwkubWFza19hY2sgPSBtYXNrX2FuZF9hY2tfY3JpbWVfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfY3JpbWVfaXJxLAogCS5lbmQgPSBlbmRfY3JpbWVfaXJxLAogfTsKIApAQCAtMjQ4LDM0ICsyMTEsMjAgQEAKIAogc3RhdGljIHZvaWQgZW5hYmxlX21hY2VwY2lfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJbWFjZXBjaV9tYXNrIHw9IE1BQ0VQQ0lfQ09OVFJPTF9JTlQoaXJxIC0gOSk7CiAJbWFjZS0+cGNpLmNvbnRyb2wgPSBtYWNlcGNpX21hc2s7CiAJY3JpbWVfbWFzayB8PSAxIDw8IChpcnEgLSAxKTsKIAljcmltZS0+aW1hc2sgPSBjcmltZV9tYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX21hY2VwY2lfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gIAllbmFibGVfbWFjZXBjaV9pcnEgKGlycSk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWFjZXBjaV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAljcmltZV9tYXNrICY9IH4oMSA8PCAoaXJxIC0gMSkpOwogCWNyaW1lLT5pbWFzayA9IGNyaW1lX21hc2s7CiAJZmx1c2hfY3JpbWVfYnVzKCk7CiAJbWFjZXBjaV9tYXNrICY9IH5NQUNFUENJX0NPTlRST0xfSU5UKGlycSAtIDkpOwogCW1hY2UtPnBjaS5jb250cm9sID0gbWFjZXBjaV9tYXNrOwogCWZsdXNoX21hY2VfYnVzKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBlbmRfbWFjZXBjaV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTI4NCwxNiArMjMzLDEyIEBACiAJCWVuYWJsZV9tYWNlcGNpX2lycShpcnEpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX21hY2VwY2lfaXJxIGRpc2FibGVfbWFjZXBjaV9pcnEKLSNkZWZpbmUgbWFza19hbmRfYWNrX21hY2VwY2lfaXJxIGRpc2FibGVfbWFjZXBjaV9pcnEKLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcDMyX21hY2VwY2lfaW50ZXJydXB0ID0gewogCS50eXBlbmFtZSA9ICJJUDMyIE1BQ0UgUENJIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfbWFjZXBjaV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fbWFjZXBjaV9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9tYWNlcGNpX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfbWFjZXBjaV9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19tYWNlcGNpX2lycSwKKwkuYWNrID0gZGlzYWJsZV9tYWNlcGNpX2lycSwKKwkubWFzayA9IGRpc2FibGVfbWFjZXBjaV9pcnEsCisJLm1hc2tfYWNrID0gZGlzYWJsZV9tYWNlcGNpX2lycSwKKwkudW5tYXNrID0gZW5hYmxlX21hY2VwY2lfaXJxLAogCS5lbmQgPSBlbmRfbWFjZXBjaV9pcnEsCiB9OwogCkBAIC0zMzksNyArMjg0LDYgQEAKIHN0YXRpYyB2b2lkIGVuYWJsZV9tYWNlaXNhX2lycSAodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgY3JpbWVfaW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJREJHICgibWFjZWlzYSBlbmFibGU6ICV1XG4iLCBpcnEpOwogCkBAIC0zNTUsMjYgKzI5OSwxNiBAQAogCQlicmVhazsKIAl9CiAJREJHICgiY3JpbWVfaW50ICUwOHggZW5hYmxlZFxuIiwgY3JpbWVfaW50KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCWNyaW1lX21hc2sgfD0gY3JpbWVfaW50OwogCWNyaW1lLT5pbWFzayA9IGNyaW1lX21hc2s7CiAJbWFjZWlzYV9tYXNrIHw9IDEgPDwgKGlycSAtIDMzKTsKIAltYWNlLT5wZXJpZi5jdHJsLmltYXNrID0gbWFjZWlzYV9tYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX21hY2Vpc2FfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX21hY2Vpc2FfaXJxKGlycSk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWFjZWlzYV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgY3JpbWVfaW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAltYWNlaXNhX21hc2sgJj0gfigxIDw8IChpcnEgLSAzMykpOwogICAgICAgICBpZighKG1hY2Vpc2FfbWFzayAmIE1BQ0VJU0FfQVVESU9fSU5UKSkKIAkJY3JpbWVfaW50IHw9IE1BQ0VfQVVESU9fSU5UOwpAQCAtMzg3LDIzICszMjEsMjAgQEAKIAlmbHVzaF9jcmltZV9idXMoKTsKIAltYWNlLT5wZXJpZi5jdHJsLmltYXNrID0gbWFjZWlzYV9tYXNrOwogCWZsdXNoX21hY2VfYnVzKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfbWFjZWlzYV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIG1hY2VfaW50LCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1hY2VfaW50OwogCiAJc3dpdGNoIChpcnEpIHsKIAljYXNlIE1BQ0VJU0FfUEFSQUxMRUxfSVJROgogCWNhc2UgTUFDRUlTQV9TRVJJQUwxX1RETUFQUl9JUlE6CiAJY2FzZSBNQUNFSVNBX1NFUklBTDJfVERNQVBSX0lSUToKIAkJLyogZWRnZSB0cmlnZ2VyZWQgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAkJbWFjZV9pbnQgPSBtYWNlLT5wZXJpZi5jdHJsLmlzdGF0OwogCQltYWNlX2ludCAmPSB+KDEgPDwgKGlycSAtIDMzKSk7CiAJCW1hY2UtPnBlcmlmLmN0cmwuaXN0YXQgPSBtYWNlX2ludDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCQlicmVhazsKIAl9CiAJZGlzYWJsZV9tYWNlaXNhX2lycShpcnEpOwpAQCAtNDE1LDE1ICszNDYsMTIgQEAKIAkJZW5hYmxlX21hY2Vpc2FfaXJxKGlycSk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fbWFjZWlzYV9pcnEgZGlzYWJsZV9tYWNlaXNhX2lycQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMzJfbWFjZWlzYV9pbnRlcnJ1cHQgPSB7CiAJLnR5cGVuYW1lID0gIklQMzIgTUFDRSBJU0EiLAotCS5zdGFydHVwID0gc3RhcnR1cF9tYWNlaXNhX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9tYWNlaXNhX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX21hY2Vpc2FfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9tYWNlaXNhX2lycSwKIAkuYWNrID0gbWFza19hbmRfYWNrX21hY2Vpc2FfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9tYWNlaXNhX2lycSwKKwkubWFza19hY2sgPSBtYXNrX2FuZF9hY2tfbWFjZWlzYV9pcnEsCisJLnVubWFzayA9IGVuYWJsZV9tYWNlaXNhX2lycSwKIAkuZW5kID0gZW5kX21hY2Vpc2FfaXJxLAogfTsKIApAQCAtNDMzLDI5ICszNjEsMTUgQEAKIAogc3RhdGljIHZvaWQgZW5hYmxlX21hY2VfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJY3JpbWVfbWFzayB8PSAxIDw8IChpcnEgLSAxKTsKIAljcmltZS0+aW1hc2sgPSBjcmltZV9tYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX21hY2VfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX21hY2VfaXJxKGlycSk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWFjZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAljcmltZV9tYXNrICY9IH4oMSA8PCAoaXJxIC0gMSkpOwogCWNyaW1lLT5pbWFzayA9IGNyaW1lX21hc2s7CiAJZmx1c2hfY3JpbWVfYnVzKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBlbmRfbWFjZV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTQ2NCwxNiArMzc4LDEyIEBACiAJCWVuYWJsZV9tYWNlX2lycShpcnEpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX21hY2VfaXJxIGRpc2FibGVfbWFjZV9pcnEKLSNkZWZpbmUgbWFza19hbmRfYWNrX21hY2VfaXJxIGRpc2FibGVfbWFjZV9pcnEKLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcDMyX21hY2VfaW50ZXJydXB0ID0gewogCS50eXBlbmFtZSA9ICJJUDMyIE1BQ0UiLAotCS5zdGFydHVwID0gc3RhcnR1cF9tYWNlX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9tYWNlX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX21hY2VfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9tYWNlX2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX21hY2VfaXJxLAorCS5hY2sgPSBkaXNhYmxlX21hY2VfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9tYWNlX2lycSwKKwkubWFza19hY2sgPSBkaXNhYmxlX21hY2VfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfbWFjZV9pcnEsCiAJLmVuZCA9IGVuZF9tYWNlX2lycSwKIH07CiAKQEAgLTU4NiwxMCArNDk2LDcgQEAKIAkJZWxzZQogCQkJY29udHJvbGxlciA9ICZpcDMyX21hY2Vpc2FfaW50ZXJydXB0OwogCi0JCWlycV9kZXNjW2lycV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpcnFdLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2lycV0uZGVwdGggPSAwOwotCQlpcnFfZGVzY1tpcnFdLmNoaXAgPSBjb250cm9sbGVyOworCQlzZXRfaXJxX2NoaXAoaXJxLCBjb250cm9sbGVyKTsKIAl9CiAJc2V0dXBfaXJxKENSSU1FX01FTUVSUl9JUlEsICZtZW1lcnJfaXJxKTsKIAlzZXR1cF9pcnEoQ1JJTUVfQ1BVRVJSX0lSUSwgJmNwdWVycl9pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCmluZGV4IDhiMWY0MTQuLjJlOGY2YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKQEAgLTQ1LDExICs0NSw5IEBACiAgKi8KIAogCi0jZGVmaW5lIHNodXRkb3duX2JjbTE0ODBfaXJxCWRpc2FibGVfYmNtMTQ4MF9pcnEKIHN0YXRpYyB2b2lkIGVuZF9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGVuYWJsZV9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGRpc2FibGVfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBhY2tfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgYmNtMTQ4MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spOwpAQCAtODUsMTEgKzgzLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmNtMTQ4MF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiQkNNMTQ4MC1JTVIiLAotCS5zdGFydHVwID0gc3RhcnR1cF9iY20xNDgwX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9iY20xNDgwX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2JjbTE0ODBfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9iY20xNDgwX2lycSwKIAkuYWNrID0gYWNrX2JjbTE0ODBfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9iY20xNDgwX2lycSwKKwkubWFza19hY2sgPSBhY2tfYmNtMTQ4MF9pcnEsCisJLnVubWFzayA9IGVuYWJsZV9iY20xNDgwX2lycSwKIAkuZW5kID0gZW5kX2JjbTE0ODBfaXJxLAogI2lmZGVmIENPTkZJR19TTVAKIAkuc2V0X2FmZmluaXR5ID0gYmNtMTQ4MF9zZXRfYWZmaW5pdHkKQEAgLTE4OCwxNCArMTg1LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQliY20xNDgwX3VubWFza19pcnEoYmNtMTQ4MF9pcnFfb3duZXJbaXJxXSwgaXJxKTsKLQotCXJldHVybiAwOwkJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0KIHN0YXRpYyB2b2lkIGRpc2FibGVfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAliY20xNDgwX21hc2tfaXJxKGJjbTE0ODBfaXJxX293bmVyW2lycV0sIGlycSk7CkBAIC0yNzAsMTYgKzI1OSw5IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQlpZiAoaSA8IEJDTTE0ODBfTlJfSVJRUykgewotCQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZiY20xNDgwX2lycV90eXBlOwotCQkJYmNtMTQ4MF9pcnFfb3duZXJbaV0gPSAwOwotCQl9IGVsc2UgewotCQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZub19pcnFfY2hpcDsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCBCQ00xNDgwX05SX0lSUVM7IGkrKykgeworCQlzZXRfaXJxX2NoaXAoaSwgJmJjbTE0ODBfaXJxX3R5cGUpOworCQliY20xNDgwX2lycV9vd25lcltpXSA9IDA7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvdGltZS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3RpbWUuYwppbmRleCBlMTM2YmRlLi42ZjNmNzFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC90aW1lLmMKQEAgLTk0LDggKzk0LDYgQEAKIAkgKi8KIH0KIAotI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+Ci0KIHZvaWQgYmNtMTQ4MF90aW1lcl9pbnRlcnJ1cHQodm9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtMTE5LDcgKzExNyw3IEBACiAJfQogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGJjbTE0ODBfaHB0X3JlYWQodm9pZCkKK3N0YXRpYyBjeWNsZV90IGJjbTE0ODBfaHB0X3JlYWQodm9pZCkKIHsKIAkvKiBXZSBhc3N1bWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgeHRpbWVfbG9jayBoZWxkLiAqLwogCXVuc2lnbmVkIGxvbmcgY291bnQgPQpAQCAtMTI5LDYgKzEyNyw2IEBACiAKIHZvaWQgX19pbml0IGJjbTE0ODBfaHB0X3NldHVwKHZvaWQpCiB7Ci0JbWlwc19ocHRfcmVhZCA9IGJjbTE0ODBfaHB0X3JlYWQ7CisJY2xvY2tzb3VyY2VfbWlwcy5yZWFkID0gYmNtMTQ4MF9ocHRfcmVhZDsKIAltaXBzX2hwdF9mcmVxdWVuY3kgPSBCQ00xNDgwX0hQVF9WQUxVRTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKaW5kZXggZDVkMjY3Ny4uODJjZTc1MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKQEAgLTQ0LDExICs0NCw5IEBACiAgKi8KIAogCi0jZGVmaW5lIHNodXRkb3duX3NiMTI1MF9pcnEJZGlzYWJsZV9zYjEyNTBfaXJxCiBzdGF0aWMgdm9pZCBlbmRfc2IxMjUwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGVuYWJsZV9zYjEyNTBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgZGlzYWJsZV9zYjEyNTBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBhY2tfc2IxMjUwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBzYjEyNTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKTsKQEAgLTcwLDExICs2OCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNiMTI1MF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiU0IxMjUwLUlNUiIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3NiMTI1MF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fc2IxMjUwX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3NiMTI1MF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3NiMTI1MF9pcnEsCiAJLmFjayA9IGFja19zYjEyNTBfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9zYjEyNTBfaXJxLAorCS5tYXNrX2FjayA9IGFja19zYjEyNTBfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfc2IxMjUwX2lycSwKIAkuZW5kID0gZW5kX3NiMTI1MF9pcnEsCiAjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBzYjEyNTBfc2V0X2FmZmluaXR5CkBAIC0xNjMsMTQgKzE2MCw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzYjEyNTBfdW5tYXNrX2lycShzYjEyNTBfaXJxX293bmVyW2lycV0sIGlycSk7Ci0KLQlyZXR1cm4gMDsJCS8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzYjEyNTBfbWFza19pcnEoc2IxMjUwX2lycV9vd25lcltpcnFdLCBpcnEpOwpAQCAtMjM5LDE2ICsyMjgsOSBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaWYgKGkgPCBTQjEyNTBfTlJfSVJRUykgewotCQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZzYjEyNTBfaXJxX3R5cGU7Ci0JCQlzYjEyNTBfaXJxX293bmVyW2ldID0gMDsKLQkJfSBlbHNlIHsKLQkJCWlycV9kZXNjW2ldLmNoaXAgPSAmbm9faXJxX2NoaXA7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgU0IxMjUwX05SX0lSUVM7IGkrKykgeworCQlzZXRfaXJxX2NoaXAoaSwgJnNiMTI1MF9pcnFfdHlwZSk7CisJCXNiMTI1MF9pcnFfb3duZXJbaV0gPSAwOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvdGltZS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvdGltZS5jCmluZGV4IGJjYjc0ZjIuLjJlZmZmZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3RpbWUuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC90aW1lLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAogZXh0ZXJuIGludCBzYjEyNTBfc3RlYWxfaXJxKGludCBpcnEpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHNiMTI1MF9ocHRfcmVhZCh2b2lkKTsKK3N0YXRpYyBjeWNsZV90IHNiMTI1MF9ocHRfcmVhZCh2b2lkKTsKIAogdm9pZCBfX2luaXQgc2IxMjUwX2hwdF9zZXR1cCh2b2lkKQogewpAQCAtNjYsOCArNjYsOCBAQAogCQkJICAgICBJT0FERFIoQV9TQ0RfVElNRVJfUkVHSVNURVIoU0IxMjUwX0hQVF9OVU0sIFJfU0NEX1RJTUVSX0NGRykpKTsKIAogCQltaXBzX2hwdF9mcmVxdWVuY3kgPSBWX1NDRF9USU1FUl9GUkVROwotCQltaXBzX2hwdF9yZWFkID0gc2IxMjUwX2hwdF9yZWFkOwotCQltaXBzX2hwdF9tYXNrID0gTV9TQ0RfVElNRVJfSU5JVDsKKwkJY2xvY2tzb3VyY2VfbWlwcy5yZWFkID0gc2IxMjUwX2hwdF9yZWFkOworCQljbG9ja3NvdXJjZV9taXBzLm1hc2sgPSBNX1NDRF9USU1FUl9JTklUOwogCX0KIH0KIApAQCAtMTQzLDcgKzE0Myw3IEBACiAgKiBUaGUgSFBUIGlzIGZyZWUgcnVubmluZyBmcm9tIFNCMTI1MF9IUFRfVkFMVUUgZG93biB0byAwIHRoZW4gc3RhcnRzIG92ZXIKICAqIGFnYWluLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNiMTI1MF9ocHRfcmVhZCh2b2lkKQorc3RhdGljIGN5Y2xlX3Qgc2IxMjUwX2hwdF9yZWFkKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3NldHVwLmMgYi9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3NldHVwLmMKaW5kZXggYWMzNDJmNS4uZGVmYTFmMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYwpAQCAtNDMsNyArNDMsNyBAQAogI2VsaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NCMTI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTExMlgpCiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgogI2Vsc2UKLSNlcnJvciBpbnZhbGlkIFNpQnl0ZSBib2FyZCBjb25maWd1YXRpb24KKyNlcnJvciBpbnZhbGlkIFNpQnl0ZSBib2FyZCBjb25maWd1cmF0aW9uCiAjZW5kaWYKICNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9nZW5idXMuaD4KICNpbmNsdWRlIDxhc20vc2lieXRlL2JvYXJkLmg+CkBAIC01Myw3ICs1Myw3IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfU0IxMjUwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMTEyWCkKIGV4dGVybiB2b2lkIHNiMTI1MF9zZXR1cCh2b2lkKTsKICNlbHNlCi0jZXJyb3IgaW52YWxpZCBTaUJ5dGUgYm9hcmQgY29uZmlndWF0aW9uCisjZXJyb3IgaW52YWxpZCBTaUJ5dGUgYm9hcmQgY29uZmlndXJhdGlvbgogI2VuZGlmCiAKIGV4dGVybiBpbnQgeGljb3JfcHJvYmUodm9pZCk7CkBAIC05MCw3ICs5MCw3IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfU0IxMjUwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMTEyWCkKIAlzYjEyNTBfdGltZV9pbml0KCk7CiAjZWxzZQotI2Vycm9yIGludmFsaWQgU2lCeXRlIGJvYXJkIGNvbmZpZ3VhdGlvbgorI2Vycm9yIGludmFsaWQgU2lCeXRlIGJvYXJkIGNvbmZpZ3VyYXRpb24KICNlbmRpZgogfQogCkBAIC0xMTEsNyArMTExLDcgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX1NJQllURV9TQjEyNTApIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xMTJYKQogCXNiMTI1MF9zZXR1cCgpOwogI2Vsc2UKLSNlcnJvciBpbnZhbGlkIFNpQnl0ZSBib2FyZCBjb25maWd1YXRpb24KKyNlcnJvciBpbnZhbGlkIFNpQnl0ZSBib2FyZCBjb25maWd1cmF0aW9uCiAjZW5kaWYKIAogCXBhbmljX3RpbWVvdXQgPSA1OyAgLyogRm9yIGRlYnVnLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zbmkvaXJxLmMgYi9hcmNoL21pcHMvc25pL2lycS5jCmluZGV4IDQ4ZmI3NGEuLjg1MTFiY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zbmkvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NuaS9pcnEuYwpAQCAtMTEsNDQgKzExLDI1IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zbmkuaD4KIAotREVGSU5FX1NQSU5MT0NLKHBjaWFzaWNfbG9jayk7Ci0KIHN0YXRpYyB2b2lkIGVuYWJsZV9wY2lhc2ljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoaXJxIC0gUENJTVRfSVJRX0lOVDIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpYXNpY19sb2NrLCBmbGFncyk7CiAJKih2b2xhdGlsZSB1OCAqKSBQQ0lNVF9JUlFTRUwgfD0gbWFzazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lhc2ljX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3BjaWFzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX3BjaWFzaWNfaXJxKGlycSk7Ci0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotI2RlZmluZSBzaHV0ZG93bl9wY2lhc2ljX2lycQlkaXNhYmxlX3BjaWFzaWNfaXJxCi0KIHZvaWQgZGlzYWJsZV9wY2lhc2ljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gfigxIDw8IChpcnEgLSBQQ0lNVF9JUlFfSU5UMikpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpYXNpY19sb2NrLCBmbGFncyk7CiAJKih2b2xhdGlsZSB1OCAqKSBQQ0lNVF9JUlFTRUwgJj0gbWFzazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lhc2ljX2xvY2ssIGZsYWdzKTsKIH0KIAotI2RlZmluZSBtYXNrX2FuZF9hY2tfcGNpYXNpY19pcnEgZGlzYWJsZV9wY2lhc2ljX2lycQotCiBzdGF0aWMgdm9pZCBlbmRfcGNpYXNpY19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKQEAgLTU3LDExICszOCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBjaWFzaWNfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkFTSUMtUENJIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfcGNpYXNpY19pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fcGNpYXNpY19pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9wY2lhc2ljX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfcGNpYXNpY19pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19wY2lhc2ljX2lycSwKKwkuYWNrID0gZGlzYWJsZV9wY2lhc2ljX2lycSwKKwkubWFzayA9IGRpc2FibGVfcGNpYXNpY19pcnEsCisJLm1hc2tfYWNrID0gZGlzYWJsZV9wY2lhc2ljX2lycSwKKwkudW5tYXNrID0gZW5hYmxlX3BjaWFzaWNfaXJxLAogCS5lbmQgPSBlbmRfcGNpYXNpY19pcnEsCiB9OwogCkBAIC0xNzgsMTIgKzE1OCw4IEBACiAKIHZvaWQgX19pbml0IGluaXRfcGNpYXNpYyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpYXNpY19sb2NrLCBmbGFncyk7CiAJKiAodm9sYXRpbGUgdTggKikgUENJTVRfSVJRU0VMID0KIAkJSVRfRUlTQSB8IElUX0lOVEEgfCBJVF9JTlRCIHwgSVRfSU5UQyB8IElUX0lOVEQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpYXNpY19sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0xOTksMTIgKzE3NSw4IEBACiAJaW5pdF9wY2lhc2ljKCk7CiAKIAkvKiBBY3R1YWxseSB3ZSd2ZSBnb3QgbW9yZSBpbnRlcnJ1cHRzIHRvIGhhbmRsZSAuLi4gICovCi0JZm9yIChpID0gUENJTVRfSVJRX0lOVDI7IGkgPD0gUENJTVRfSVJRX0VUSEVSTkVUOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzICAgICA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uICAgICA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoICAgICAgPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwICAgID0gJnBjaWFzaWNfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IFBDSU1UX0lSUV9JTlQyOyBpIDw9IFBDSU1UX0lSUV9FVEhFUk5FVDsgaSsrKQorCQlzZXRfaXJxX2NoaXAoaSwgJnBjaWFzaWNfaXJxX3R5cGUpOwogCiAJY2hhbmdlX2MwX3N0YXR1cyhTVDBfSU0sIElFX0lSUTF8SUVfSVJRMnxJRV9JUlEzfElFX0lSUTQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X2lycS5jIGIvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X2lycS5jCmluZGV4IDgyNjZhODguLjIxODczZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19pcnEuYworKysgYi9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5MjdfaXJxLmMKQEAgLTY0LDE5ICs2NCwxMyBAQAogI2RlZmluZSBUWDQ5MjdfSVJRX05FU1Q0ICAgICAgICggMSA8PCAgOSApCiAKICNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfSU5JVCAgICAgKCAxIDw8IDEwICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfU1RBUlRVUCAgKCAxIDw8IDExICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfU0hVVERPV04gKCAxIDw8IDEyICkKICNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfRU5BQkxFICAgKCAxIDw8IDEzICkKICNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfRElTQUJMRSAgKCAxIDw8IDE0ICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfTUFTSyAgICAgKCAxIDw8IDE1ICkKICNkZWZpbmUgVFg0OTI3X0lSUV9DUDBfRU5ESVJRICAgKCAxIDw8IDE2ICkKIAogI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19JTklUICAgICAoIDEgPDwgMjAgKQotI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19TVEFSVFVQICAoIDEgPDwgMjEgKQotI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19TSFVURE9XTiAoIDEgPDwgMjIgKQogI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19FTkFCTEUgICAoIDEgPDwgMjMgKQogI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19ESVNBQkxFICAoIDEgPDwgMjQgKQotI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19NQVNLICAgICAoIDEgPDwgMjUgKQogI2RlZmluZSBUWDQ5MjdfSVJRX1BJQ19FTkRJUlEgICAoIDEgPDwgMjYgKQogCiAjZGVmaW5lIFRYNDkyN19JUlFfQUxMICAgICAgICAgMHhmZmZmZmZmZgpAQCAtODcsMTggKzgxLDEyIEBACiAJCQkJCSAgfCBUWDQ5MjdfSVJRX0lORk8KIAkJCQkJICB8IFRYNDkyN19JUlFfV0FSTiB8IFRYNDkyN19JUlFfRVJPUgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfQ1AwX0lOSVQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX0NQMF9TVEFSVFVQCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9DUDBfU0hVVERPV04KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX0NQMF9FTkFCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX0NQMF9ESVNBQkxFCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9DUDBfTUFTSwogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfQ1AwX0VORElSUQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfUElDX0lOSVQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX1BJQ19TVEFSVFVQCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9QSUNfU0hVVERPV04KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX1BJQ19FTkFCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX1BJQ19ESVNBQkxFCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9QSUNfTUFTSwogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfUElDX0VORElSUQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfSU5JVAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfTkVTVDEKQEAgLTEyNCw0OSArMTEyLDM2IEBACiAgKiBGb3J3YWQgZGVmaW5pdGlvbnMgZm9yIGFsbCBwaWMncwogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHg0OTI3X2lycV9jcDBfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9jcDBfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9jcDBfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX2VuZCh1bnNpZ25lZCBpbnQgaXJxKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCB0eDQ5MjdfaXJxX3BpY19zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX3BpY19lbmFibGUodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX3BpY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfZW5kKHVuc2lnbmVkIGludCBpcnEpOwogCiAvKgogICogS2VybmVsIHN0cnVjdHMgZm9yIGFsbCBwaWMncwogICovCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodHg0OTI3X2NwMF9sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodHg0OTI3X3BpY19sb2NrKTsKLQogI2RlZmluZSBUWDQ5MjdfQ1AwX05BTUUgIlRYNDkyNy1DUDAiCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHR4NDkyN19pcnFfY3AwX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gVFg0OTI3X0NQMF9OQU1FLAotCS5zdGFydHVwCT0gdHg0OTI3X2lycV9jcDBfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSB0eDQ5MjdfaXJxX2NwMF9zaHV0ZG93biwKLQkuZW5hYmxlCQk9IHR4NDkyN19pcnFfY3AwX2VuYWJsZSwKLQkuZGlzYWJsZQk9IHR4NDkyN19pcnFfY3AwX2Rpc2FibGUsCi0JLmFjawkJPSB0eDQ5MjdfaXJxX2NwMF9tYXNrX2FuZF9hY2ssCisJLmFjawkJPSB0eDQ5MjdfaXJxX2NwMF9kaXNhYmxlLAorCS5tYXNrCQk9IHR4NDkyN19pcnFfY3AwX2Rpc2FibGUsCisJLm1hc2tfYWNrCT0gdHg0OTI3X2lycV9jcDBfZGlzYWJsZSwKKwkudW5tYXNrCQk9IHR4NDkyN19pcnFfY3AwX2VuYWJsZSwKIAkuZW5kCQk9IHR4NDkyN19pcnFfY3AwX2VuZCwKLQkuc2V0X2FmZmluaXR5CT0gTlVMTAogfTsKIAogI2RlZmluZSBUWDQ5MjdfUElDX05BTUUgIlRYNDkyNy1QSUMiCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHR4NDkyN19pcnFfcGljX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gVFg0OTI3X1BJQ19OQU1FLAotCS5zdGFydHVwCT0gdHg0OTI3X2lycV9waWNfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSB0eDQ5MjdfaXJxX3BpY19zaHV0ZG93biwKLQkuZW5hYmxlCQk9IHR4NDkyN19pcnFfcGljX2VuYWJsZSwKLQkuZGlzYWJsZQk9IHR4NDkyN19pcnFfcGljX2Rpc2FibGUsCi0JLmFjawkJPSB0eDQ5MjdfaXJxX3BpY19tYXNrX2FuZF9hY2ssCisJLmFjawkJPSB0eDQ5MjdfaXJxX3BpY19kaXNhYmxlLAorCS5tYXNrCQk9IHR4NDkyN19pcnFfcGljX2Rpc2FibGUsCisJLm1hc2tfYWNrCT0gdHg0OTI3X2lycV9waWNfZGlzYWJsZSwKKwkudW5tYXNrCQk9IHR4NDkyN19pcnFfcGljX2VuYWJsZSwKIAkuZW5kCQk9IHR4NDkyN19pcnFfcGljX2VuZCwKLQkuc2V0X2FmZmluaXR5CT0gTlVMTAogfTsKIAogI2RlZmluZSBUWDQ5MjdfUElDX0FDVElPTihzKSB7IG5vX2FjdGlvbiwgMCwgQ1BVX01BU0tfTk9ORSwgcywgTlVMTCwgTlVMTCB9CkBAIC0yMTEsOCArMTg2LDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgdHg0OTI3X2lycV9jcDBfaW5pdCh2b2lkKQpAQCAtMjIyLDcxICsxOTUsMjMgQEAKIAlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfSU5JVCwgImJlZz0lZCBlbmQ9JWRcbiIsCiAJCQkgICBUWDQ5MjdfSVJRX0NQMF9CRUcsIFRYNDkyN19JUlFfQ1AwX0VORCk7CiAKLQlmb3IgKGkgPSBUWDQ5MjdfSVJRX0NQMF9CRUc7IGkgPD0gVFg0OTI3X0lSUV9DUDBfRU5EOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmdHg0OTI3X2lycV9jcDBfdHlwZTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHg0OTI3X2lycV9jcDBfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX0NQMF9TVEFSVFVQLCAiaXJxPSVkIFxuIiwgaXJxKTsKLQotCXR4NDkyN19pcnFfY3AwX2VuYWJsZShpcnEpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI3X2lycV9jcDBfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfU0hVVERPV04sICJpcnE9JWQgXG4iLCBpcnEpOwotCi0JdHg0OTI3X2lycV9jcDBfZGlzYWJsZShpcnEpOwotCi0JcmV0dXJuOworCWZvciAoaSA9IFRYNDkyN19JUlFfQ1AwX0JFRzsgaSA8PSBUWDQ5MjdfSVJRX0NQMF9FTkQ7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0eDQ5MjdfaXJxX2NwMF90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiB9CiAKIHN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfRU5BQkxFLCAiaXJxPSVkIFxuIiwgaXJxKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0eDQ5MjdfY3AwX2xvY2ssIGZsYWdzKTsKLQogCXR4NDkyN19pcnFfY3AwX21vZGlmeShDQ1AwX1NUQVRVUywgMCwgdHg0OTI3X2lycV9jcDBfbWFzayhpcnEpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkyN19jcDBfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX0NQMF9ESVNBQkxFLCAiaXJxPSVkIFxuIiwgaXJxKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0eDQ5MjdfY3AwX2xvY2ssIGZsYWdzKTsKLQogCXR4NDkyN19pcnFfY3AwX21vZGlmeShDQ1AwX1NUQVRVUywgdHg0OTI3X2lycV9jcDBfbWFzayhpcnEpLCAwKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkyN19jcDBfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9tYXNrX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfTUFTSywgImlycT0lZCBcbiIsIGlycSk7Ci0KLQl0eDQ5MjdfaXJxX2NwMF9kaXNhYmxlKGlycSk7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMjk2LDggKzIyMSw2IEBACiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkgewogCQl0eDQ5MjdfaXJxX2NwMF9lbmFibGUoaXJxKTsKIAl9Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC00MTgsOTQgKzM0MSwzOSBAQAogCXZhbCAmPSAofmNscl9iaXRzKTsKIAl2YWwgfD0gKHNldF9iaXRzKTsKIAlUWDQ5MjdfV1IocGljX3JlZywgdmFsKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHR4NDkyN19pcnFfcGljX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCiAJVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfUElDX0lOSVQsICJiZWc9JWQgZW5kPSVkXG4iLAogCQkJICAgVFg0OTI3X0lSUV9QSUNfQkVHLCBUWDQ5MjdfSVJRX1BJQ19FTkQpOwogCi0JZm9yIChpID0gVFg0OTI3X0lSUV9QSUNfQkVHOyBpIDw9IFRYNDkyN19JUlFfUElDX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAyOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnR4NDkyN19pcnFfcGljX3R5cGU7Ci0JfQorCWZvciAoaSA9IFRYNDkyN19JUlFfUElDX0JFRzsgaSA8PSBUWDQ5MjdfSVJRX1BJQ19FTkQ7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0eDQ5MjdfaXJxX3BpY190eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlzZXR1cF9pcnEoVFg0OTI3X0lSUV9ORVNUX1BJQ19PTl9DUDAsICZ0eDQ5MjdfaXJxX3BpY19hY3Rpb24pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkyN19waWNfbG9jaywgZmxhZ3MpOwotCiAJVFg0OTI3X1dSKDB4ZmYxZmY2NDAsIDB4Nik7CS8qIGlycSBsZXZlbCBtYXNrIC0tIG9ubHkgYWNjZXB0IGhpZ2h0ZXN0ICovCiAJVFg0OTI3X1dSKDB4ZmYxZmY2MDAsIFRYNDkyN19SRCgweGZmMWZmNjAwKSB8IDB4MSk7CS8qIGlycSBlbmFibGUgKi8KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkyN19waWNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHR4NDkyN19pcnFfcGljX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9QSUNfU1RBUlRVUCwgImlycT0lZFxuIiwgaXJxKTsKLQotCXR4NDkyN19pcnFfcGljX2VuYWJsZShpcnEpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9QSUNfU0hVVERPV04sICJpcnE9JWRcbiIsIGlycSk7Ci0KLQl0eDQ5MjdfaXJxX3BpY19kaXNhYmxlKGlycSk7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHR4NDkyN19pcnFfcGljX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9QSUNfRU5BQkxFLCAiaXJxPSVkXG4iLCBpcnEpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkyN19waWNfbG9jaywgZmxhZ3MpOwotCiAJdHg0OTI3X2lycV9waWNfbW9kaWZ5KHR4NDkyN19pcnFfcGljX2FkZHIoaXJxKSwgMCwKIAkJCSAgICAgIHR4NDkyN19pcnFfcGljX21hc2soaXJxKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MjdfcGljX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9QSUNfRElTQUJMRSwgImlycT0lZFxuIiwgaXJxKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0eDQ5MjdfcGljX2xvY2ssIGZsYWdzKTsKLQogCXR4NDkyN19pcnFfcGljX21vZGlmeSh0eDQ5MjdfaXJxX3BpY19hZGRyKGlycSksCiAJCQkgICAgICB0eDQ5MjdfaXJxX3BpY19tYXNrKGlycSksIDApOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHg0OTI3X3BpY19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfcGljX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX1BJQ19NQVNLLCAiaXJxPSVkXG4iLCBpcnEpOwotCi0JdHg0OTI3X2lycV9waWNfZGlzYWJsZShpcnEpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX3BpY19lbmQodW5zaWduZWQgaW50IGlycSkKQEAgLTUxNSw4ICszODMsNiBAQAogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpIHsKIAkJdHg0OTI3X2lycV9waWNfZW5hYmxlKGlycSk7CiAJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtNTMzLDggKzM5OSw2IEBACiAJdHg0OTI3X2lycV9waWNfaW5pdCgpOwogCiAJVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfSU5JVCwgIitcbiIpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IHR4NDkyN19pcnFfbmVzdGVkKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvdG9zaGliYV9yYnR4NDkyN19pcnEuYyBiL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X2lycS5jCmluZGV4IDBjM2MzZjYuLjM0Y2RiMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X2lycS5jCisrKyBiL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X2lycS5jCkBAIC0xNTEsMTYgKzE1MSwxMSBAQAogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9FUk9SICAgICAgICAgICggMSA8PCAgMiApCiAKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0lOSVQgICAgICAoIDEgPDwgMTAgKQotI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfU1RBUlRVUCAgICggMSA8PCAxMSApCi0jZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TSFVURE9XTiAgKCAxIDw8IDEyICkKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VOQUJMRSAgICAoIDEgPDwgMTMgKQogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRElTQUJMRSAgICggMSA8PCAxNCApCi0jZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19NQVNLICAgICAgKCAxIDw8IDE1ICkKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORElSUSAgICAoIDEgPDwgMTYgKQogCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9JTklUICAgICAgKCAxIDw8IDIwICkKLSNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NUQVJUVVAgICAoIDEgPDwgMjEgKQotI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfU0hVVERPV04gICggMSA8PCAyMiApCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkFCTEUgICAgKCAxIDw8IDIzICkKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0RJU0FCTEUgICAoIDEgPDwgMjQgKQogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfTUFTSyAgICAgICggMSA8PCAyNSApCkBAIC0xNzUsMTUgKzE3MCwxMCBAQAogICAgIChUT1NISUJBX1JCVFg0OTI3X0lSUV9OT05FIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSU5GTyB8CiAgICAgIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX1dBUk4gfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9FUk9SCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19JTklUCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TVEFSVFVQCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TSFVURE9XTgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5BQkxFCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19ESVNBQkxFCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19NQVNLCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkRJUlEKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0lOSVQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NUQVJUVVAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NIVVRET1dOCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkFCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0RJU0FCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX01BU0sKQEAgLTIzMSwzNSArMjIxLDI1IEBACiBleHRlcm4gdm9pZCBtYXNrX2FuZF9hY2tfODI1OUEodW5zaWduZWQgaW50IGlycSk7CiAjZW5kaWYKIAotc3RhdGljIHVuc2lnbmVkIGludCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2Nfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19lbmFibGUodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19tYXNrX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5kKHVuc2lnbmVkIGludCBpcnEpOwogCiAjaWZkZWYgQ09ORklHX1RPU0hJQkFfRlBDSUIwCi1zdGF0aWMgdW5zaWduZWQgaW50IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9lbmQodW5zaWduZWQgaW50IGlycSk7CiAjZW5kaWYKIAotc3RhdGljIERFRklORV9TUElOTE9DSyh0b3NoaWJhX3JidHg0OTI3X2lvY19sb2NrKTsKLQotCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSU9DX05BTUUgIlJCVFg0OTI3LUlPQyIKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gVE9TSElCQV9SQlRYNDkyN19JT0NfTkFNRSwKLQkuc3RhcnR1cCA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19zdGFydHVwLAotCS5zaHV0ZG93biA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19zaHV0ZG93biwKLQkuZW5hYmxlID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2VuYWJsZSwKLQkuZGlzYWJsZSA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19kaXNhYmxlLAotCS5hY2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfbWFza19hbmRfYWNrLAorCS5hY2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZGlzYWJsZSwKKwkubWFzayA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19kaXNhYmxlLAorCS5tYXNrX2FjayA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19kaXNhYmxlLAorCS51bm1hc2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5hYmxlLAogCS5lbmQgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMCiB9OwogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lPQ19JTlRSX0VOQUIgMHhiYzAwMjAwMAogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lPQ19JTlRSX1NUQVQgMHhiYzAwMjAwNgpAQCAtMjY5LDEzICsyNDksMTEgQEAKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JU0FfTkFNRSAiUkJUWDQ5MjctSVNBIgogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSBUT1NISUJBX1JCVFg0OTI3X0lTQV9OQU1FLAotCS5zdGFydHVwID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX3NodXRkb3duLAotCS5lbmFibGUgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZW5hYmxlLAotCS5kaXNhYmxlID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2Rpc2FibGUsCiAJLmFjayA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9tYXNrX2FuZF9hY2ssCisJLm1hc2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZGlzYWJsZSwKKwkubWFza19hY2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfbWFza19hbmRfYWNrLAorCS51bm1hc2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZW5hYmxlLAogCS5lbmQgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMCiB9OwogI2VuZGlmCiAKQEAgLTM2Myw1OCArMzQxLDE2IEBACiAJCQkJICAgICBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5EKTsKIAogCWZvciAoaSA9IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19CRUc7Ci0JICAgICBpIDw9IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMzsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZ0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfdHlwZTsKLQl9CisJICAgICBpIDw9IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkQ7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfdHlwZSwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJc2V0dXBfaXJxKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX05FU1RfSU9DX09OX1BJQywKIAkJICAmdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2FjdGlvbik7Ci0KLQlyZXR1cm47CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TVEFSVFVQLAotCQkJCSAgICAgImlycT0lZFxuIiwgaXJxKTsKLQotCWlmIChpcnEgPCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfQkVHCi0JICAgIHx8IGlycSA+IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkQpIHsKLQkJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9FUk9SLAotCQkJCQkgICAgICJiYWQgaXJxPSVkXG4iLCBpcnEpOwotCQlwYW5pYygiXG4iKTsKLQl9Ci0KLQl0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLXN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQotewotCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX1NIVVRET1dOLAotCQkJCSAgICAgImlycT0lZFxuIiwgaXJxKTsKLQotCWlmIChpcnEgPCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfQkVHCi0JICAgIHx8IGlycSA+IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkQpIHsKLQkJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9FUk9SLAotCQkJCQkgICAgICJiYWQgaXJxPSVkXG4iLCBpcnEpOwotCQlwYW5pYygiXG4iKTsKLQl9Ci0KLQl0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZGlzYWJsZShpcnEpOwotCi0JcmV0dXJuOwotfQotCi0KIHN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19lbmFibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgdjsKIAogCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VOQUJMRSwKQEAgLTQyNywyMSArMzYzLDE0IEBACiAJCXBhbmljKCJcbiIpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0b3NoaWJhX3JidHg0OTI3X2lvY19sb2NrLCBmbGFncyk7Ci0KIAl2ID0gVFg0OTI3X1JEMDgoVE9TSElCQV9SQlRYNDkyN19JT0NfSU5UUl9FTkFCKTsKIAl2IHw9ICgxIDw8IChpcnEgLSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfQkVHKSk7CiAJVE9TSElCQV9SQlRYNDkyN19XUjA4KFRPU0hJQkFfUkJUWDQ5MjdfSU9DX0lOVFJfRU5BQiwgdik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0b3NoaWJhX3JidHg0OTI3X2lvY19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47CiB9CiAKIAogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgdjsKIAogCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0RJU0FCTEUsCkBAIC00NTQsMzYgKzM4MywxMSBAQAogCQlwYW5pYygiXG4iKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdG9zaGliYV9yYnR4NDkyN19pb2NfbG9jaywgZmxhZ3MpOwotCiAJdiA9IFRYNDkyN19SRDA4KFRPU0hJQkFfUkJUWDQ5MjdfSU9DX0lOVFJfRU5BQik7CiAJdiAmPSB+KDEgPDwgKGlycSAtIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19CRUcpKTsKIAlUT1NISUJBX1JCVFg0OTI3X1dSMDgoVE9TSElCQV9SQlRYNDkyN19JT0NfSU5UUl9FTkFCLCB2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRvc2hpYmFfcmJ0eDQ5MjdfaW9jX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKIH0KIAotCi1zdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfTUFTSywKLQkJCQkgICAgICJpcnE9JWRcbiIsIGlycSk7Ci0KLQlpZiAoaXJxIDwgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0JFRwotCSAgICB8fCBpcnEgPiBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5EKSB7Ci0JCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfRVJPUiwKLQkJCQkJICAgICAiYmFkIGlycT0lZFxuIiwgaXJxKTsKLQkJcGFuaWMoIlxuIik7Ci0JfQotCi0JdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2Rpc2FibGUoaXJxKTsKLQotCXJldHVybjsKLX0KLQotCiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5kKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5ESVJRLApAQCAtNDk5LDggKzQwMyw2IEBACiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkgewogCQl0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5hYmxlKGlycSk7CiAJfQotCi0JcmV0dXJuOwogfQogCiAKQEAgLTUyMCwxMyArNDIyLDggQEAKIAkJCQkgICAgIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkQpOwogCiAJZm9yIChpID0gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0JFRzsKLQkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPQotCQkgICAgKChpIDwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX01JRCkgPyAoNCkgOiAoNSkpOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV90eXBlOwotCX0KKwkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXAoaSwgJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV90eXBlKTsKIAogCXNldHVwX2lycShUT1NISUJBX1JCVFg0OTI3X0lSUV9ORVNUX0lTQV9PTl9JT0MsCiAJCSAgJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9tYXN0ZXIpOwpAQCAtNTM2LDQ4ICs0MzMsNiBAQAogCS8qIG1ha2Ugc3VyZSB3ZSBhcmUgbG9va2luZyBhdCBJUlIgKG5vdCBJU1IpICovCiAJb3V0YigweDBBLCAweDIwKTsKIAlvdXRiKDB4MEEsIDB4QTApOwotCi0JcmV0dXJuOwotfQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19UT1NISUJBX0ZQQ0lCMAotc3RhdGljIHVuc2lnbmVkIGludCB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2Ffc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NUQVJUVVAsCi0JCQkJICAgICAiaXJxPSVkXG4iLCBpcnEpOwotCi0JaWYgKGlycSA8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9CRUcKLQkgICAgfHwgaXJxID4gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORCkgewotCQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IsCi0JCQkJCSAgICAgImJhZCBpcnE9JWRcbiIsIGlycSk7Ci0JCXBhbmljKCJcbiIpOwotCX0KLQotCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9lbmFibGUoaXJxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX1RPU0hJQkFfRlBDSUIwCi1zdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2Ffc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9TSFVURE9XTiwKLQkJCQkgICAgICJpcnE9JWRcbiIsIGlycSk7Ci0KLQlpZiAoaXJxIDwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0JFRwotCSAgICB8fCBpcnEgPiBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfRU5EKSB7Ci0JCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfRVJPUiwKLQkJCQkJICAgICAiYmFkIGlycT0lZFxuIiwgaXJxKTsKLQkJcGFuaWMoIlxuIik7Ci0JfQotCi0JdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2Rpc2FibGUoaXJxKTsKLQotCXJldHVybjsKIH0KICNlbmRpZgogCkBAIC01OTYsOCArNDUxLDYgQEAKIAl9CiAKIAllbmFibGVfODI1OUFfaXJxKGlycSk7Ci0KLQlyZXR1cm47CiB9CiAjZW5kaWYKIApAQCAtNjE2LDggKzQ2OSw2IEBACiAJfQogCiAJZGlzYWJsZV84MjU5QV9pcnEoaXJxKTsKLQotCXJldHVybjsKIH0KICNlbmRpZgogCkBAIC02MzYsOCArNDg3LDYgQEAKIAl9CiAKIAltYXNrX2FuZF9hY2tfODI1OUEoaXJxKTsKLQotCXJldHVybjsKIH0KICNlbmRpZgogCkBAIC02NTgsOCArNTA3LDYgQEAKIAlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKSB7CiAJCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9lbmFibGUoaXJxKTsKIAl9Ci0KLQlyZXR1cm47CiB9CiAjZW5kaWYKIApAQCAtNjY4LDggKzUxNSw2IEBACiB7CiAJZXh0ZXJuIHZvaWQgdHg0OTI3X2lycV9pbml0KHZvaWQpOwogCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQogCXR4NDkyN19pcnFfaW5pdCgpOwogCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19pbml0KCk7CiAjaWZkZWYgQ09ORklHX1RPU0hJQkFfRlBDSUIwCkBAIC02ODEsOCArNTI2LDYgQEAKICNlbmRpZgogCiAJd2JmbHVzaCgpOwotCi0JcmV0dXJuOwogfQogCiB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2R1bXAoY2hhciAqa2V5KQpAQCAtNzE1LDcgKzU1OCw2IEBACiAJCX0KIAl9CiAjZW5kaWYKLQlyZXR1cm47CiB9CiAKIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfZHVtcF9waWNzKGNoYXIgKnMpCkBAIC03ODAsNiArNjIyLDQgQEAKIAkJCQkgICAgIGxldmVsNV9zKTsKIAlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lORk8sICJbJXNdXG4iLAogCQkJCSAgICAgcyk7Ci0KLQlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy90eDQ5MzgvY29tbW9uL2lycS5jCmluZGV4IDc3ZmUyNDUuLjQyZTEyNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MzgvY29tbW9uL2lycS5jCisrKyBiL2FyY2gvbWlwcy90eDQ5MzgvY29tbW9uL2lycS5jCkBAIC0zNyw0OCArMzcsMzYgQEAKIC8qIEZvcndhZCBkZWZpbml0aW9ucyBmb3IgYWxsIHBpYydzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHg0OTM4X2lycV9jcDBfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfY3AwX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTM4X2lycV9jcDBfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTM4X2lycV9jcDBfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfY3AwX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfY3AwX2VuZCh1bnNpZ25lZCBpbnQgaXJxKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCB0eDQ5MzhfaXJxX3BpY19zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdHg0OTM4X2lycV9waWNfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0eDQ5MzhfaXJxX3BpY19lbmFibGUodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0eDQ5MzhfaXJxX3BpY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdHg0OTM4X2lycV9waWNfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTM4X2lycV9waWNfZW5kKHVuc2lnbmVkIGludCBpcnEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEtlcm5lbCBzdHJ1Y3RzIGZvciBhbGwgcGljJ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ERUZJTkVfU1BJTkxPQ0sodHg0OTM4X2NwMF9sb2NrKTsKLURFRklORV9TUElOTE9DSyh0eDQ5MzhfcGljX2xvY2spOwogCiAjZGVmaW5lIFRYNDkzOF9DUDBfTkFNRSAiVFg0OTM4LUNQMCIKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdHg0OTM4X2lycV9jcDBfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSBUWDQ5MzhfQ1AwX05BTUUsCi0JLnN0YXJ0dXAgPSB0eDQ5MzhfaXJxX2NwMF9zdGFydHVwLAotCS5zaHV0ZG93biA9IHR4NDkzOF9pcnFfY3AwX3NodXRkb3duLAotCS5lbmFibGUgPSB0eDQ5MzhfaXJxX2NwMF9lbmFibGUsCi0JLmRpc2FibGUgPSB0eDQ5MzhfaXJxX2NwMF9kaXNhYmxlLAotCS5hY2sgPSB0eDQ5MzhfaXJxX2NwMF9tYXNrX2FuZF9hY2ssCisJLmFjayA9IHR4NDkzOF9pcnFfY3AwX2Rpc2FibGUsCisJLm1hc2sgPSB0eDQ5MzhfaXJxX2NwMF9kaXNhYmxlLAorCS5tYXNrX2FjayA9IHR4NDkzOF9pcnFfY3AwX2Rpc2FibGUsCisJLnVubWFzayA9IHR4NDkzOF9pcnFfY3AwX2VuYWJsZSwKIAkuZW5kID0gdHg0OTM4X2lycV9jcDBfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMCiB9OwogCiAjZGVmaW5lIFRYNDkzOF9QSUNfTkFNRSAiVFg0OTM4LVBJQyIKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdHg0OTM4X2lycV9waWNfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSBUWDQ5MzhfUElDX05BTUUsCi0JLnN0YXJ0dXAgPSB0eDQ5MzhfaXJxX3BpY19zdGFydHVwLAotCS5zaHV0ZG93biA9IHR4NDkzOF9pcnFfcGljX3NodXRkb3duLAotCS5lbmFibGUgPSB0eDQ5MzhfaXJxX3BpY19lbmFibGUsCi0JLmRpc2FibGUgPSB0eDQ5MzhfaXJxX3BpY19kaXNhYmxlLAotCS5hY2sgPSB0eDQ5MzhfaXJxX3BpY19tYXNrX2FuZF9hY2ssCisJLmFjayA9IHR4NDkzOF9pcnFfcGljX2Rpc2FibGUsCisJLm1hc2sgPSB0eDQ5MzhfaXJxX3BpY19kaXNhYmxlLAorCS5tYXNrX2FjayA9IHR4NDkzOF9pcnFfcGljX2Rpc2FibGUsCisJLnVubWFzayA9IHR4NDkzOF9pcnFfcGljX2VuYWJsZSwKIAkuZW5kID0gdHg0OTM4X2lycV9waWNfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0eDQ5MzhfaXJxX3BpY19hY3Rpb24gPSB7CkBAIC05OSw1NiArODcsMjEgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IFRYNDkzOF9JUlFfQ1AwX0JFRzsgaSA8PSBUWDQ5MzhfSVJRX0NQMF9FTkQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZ0eDQ5MzhfaXJxX2NwMF90eXBlOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdHg0OTM4X2lycV9jcDBfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXR4NDkzOF9pcnFfY3AwX2VuYWJsZShpcnEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi10eDQ5MzhfaXJxX2NwMF9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQotewotCXR4NDkzOF9pcnFfY3AwX2Rpc2FibGUoaXJxKTsKKwlmb3IgKGkgPSBUWDQ5MzhfSVJRX0NQMF9CRUc7IGkgPD0gVFg0OTM4X0lSUV9DUDBfRU5EOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmdHg0OTM4X2lycV9jcDBfdHlwZSwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogfQogCiBzdGF0aWMgdm9pZAogdHg0OTM4X2lycV9jcDBfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0eDQ5MzhfY3AwX2xvY2ssIGZsYWdzKTsKLQogCXNldF9jMF9zdGF0dXModHg0OTM4X2lycV9jcDBfbWFzayhpcnEpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkzOF9jcDBfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogdHg0OTM4X2lycV9jcDBfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTM4X2NwMF9sb2NrLCBmbGFncyk7Ci0KIAljbGVhcl9jMF9zdGF0dXModHg0OTM4X2lycV9jcDBfbWFzayhpcnEpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkzOF9jcDBfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotdHg0OTM4X2lycV9jcDBfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdHg0OTM4X2lycV9jcDBfZGlzYWJsZShpcnEpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjkwLDcwICsyNDMsMzAgQEAKIHN0YXRpYyB2b2lkIF9faW5pdAogdHg0OTM4X2lycV9waWNfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSBUWDQ5MzhfSVJRX1BJQ19CRUc7IGkgPD0gVFg0OTM4X0lSUV9QSUNfRU5EOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDI7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmdHg0OTM4X2lycV9waWNfdHlwZTsKLQl9CisJZm9yIChpID0gVFg0OTM4X0lSUV9QSUNfQkVHOyBpIDw9IFRYNDkzOF9JUlFfUElDX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnR4NDkzOF9pcnFfcGljX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXNldHVwX2lycShUWDQ5MzhfSVJRX05FU1RfUElDX09OX0NQMCwgJnR4NDkzOF9pcnFfcGljX2FjdGlvbik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTM4X3BpY19sb2NrLCBmbGFncyk7Ci0KIAlUWDQ5MzhfV1IoMHhmZjFmZjY0MCwgMHg2KTsJLyogaXJxIGxldmVsIG1hc2sgLS0gb25seSBhY2NlcHQgaGlnaHRlc3QgKi8KIAlUWDQ5MzhfV1IoMHhmZjFmZjYwMCwgVFg0OTM4X1JEKDB4ZmYxZmY2MDApIHwgMHgxKTsJLyogaXJxIGVuYWJsZSAqLwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHg0OTM4X3BpY19sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXR4NDkzOF9pcnFfcGljX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQl0eDQ5MzhfaXJxX3BpY19lbmFibGUoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotdHg0OTM4X2lycV9waWNfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQl0eDQ5MzhfaXJxX3BpY19kaXNhYmxlKGlycSk7CiB9CiAKIHN0YXRpYyB2b2lkCiB0eDQ5MzhfaXJxX3BpY19lbmFibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkzOF9waWNfbG9jaywgZmxhZ3MpOwotCiAJdHg0OTM4X2lycV9waWNfbW9kaWZ5KHR4NDkzOF9pcnFfcGljX2FkZHIoaXJxKSwgMCwKIAkJCSAgICAgIHR4NDkzOF9pcnFfcGljX21hc2soaXJxKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MzhfcGljX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKIHR4NDkzOF9pcnFfcGljX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkzOF9waWNfbG9jaywgZmxhZ3MpOwotCiAJdHg0OTM4X2lycV9waWNfbW9kaWZ5KHR4NDkzOF9pcnFfcGljX2FkZHIoaXJxKSwKIAkJCSAgICAgIHR4NDkzOF9pcnFfcGljX21hc2soaXJxKSwgMCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MzhfcGljX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLXR4NDkzOF9pcnFfcGljX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCXR4NDkzOF9pcnFfcGljX2Rpc2FibGUoaXJxKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MzgvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9zZXR1cC5jCmluZGV4IGY0MTVhMWYuLmRjODdkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MzgvY29tbW9uL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3R4NDkzOC9jb21tb24vc2V0dXAuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3R4NDkzOC9yYnR4NDkzOC5oPgogCiBleHRlcm4gdm9pZCB0b3NoaWJhX3JidHg0OTM4X3NldHVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L2lycS5jIGIvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L2lycS5jCmluZGV4IDEwMmU0NzMuLjhjODdhMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MzgvdG9zaGliYV9yYnR4NDkzOC9pcnEuYworKysgYi9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5MzgvaXJxLmMKQEAgLTg3LDI1ICs4NywxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxhc20vdHg0OTM4L3JidHg0OTM4Lmg+CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2Nfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuZCh1bnNpZ25lZCBpbnQgaXJxKTsKIAotREVGSU5FX1NQSU5MT0NLKHRvc2hpYmFfcmJ0eDQ5MzhfaW9jX2xvY2spOwotCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MzhfSU9DX05BTUUgIlJCVFg0OTM4LUlPQyIKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gVE9TSElCQV9SQlRYNDkzOF9JT0NfTkFNRSwKLQkuc3RhcnR1cCA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19zdGFydHVwLAotCS5zaHV0ZG93biA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19zaHV0ZG93biwKLQkuZW5hYmxlID0gdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuYWJsZSwKLQkuZGlzYWJsZSA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlLAotCS5hY2sgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfbWFza19hbmRfYWNrLAorCS5hY2sgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZGlzYWJsZSwKKwkubWFzayA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlLAorCS5tYXNrX2FjayA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlLAorCS51bm1hc2sgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZW5hYmxlLAogCS5lbmQgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMCiB9OwogCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MzhfSU9DX0lOVFJfRU5BQiAweGI3ZjAyMDAwCkBAIC0xNDIsNjkgKzEzNSwzNiBAQAogCWludCBpOwogCiAJZm9yIChpID0gVE9TSElCQV9SQlRYNDkzOF9JUlFfSU9DX0JFRzsKLQkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkzOF9JUlFfSU9DX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAzOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY190eXBlOwotCX0KKwkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkzOF9JUlFfSU9DX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY190eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlzZXR1cF9pcnEoUkJUWDQ5MzhfSVJRX0lPQ0lOVCwKIAkJICAmdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2FjdGlvbik7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuYWJsZShpcnEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi10b3NoaWJhX3JidHg0OTM4X2lycV9pb2Nfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQl0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZGlzYWJsZShpcnEpOwotfQotCiBzdGF0aWMgdm9pZAogdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhciB2OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRvc2hpYmFfcmJ0eDQ5MzhfaW9jX2xvY2ssIGZsYWdzKTsKLQogCXYgPSBUWDQ5MzhfUkQwOChUT1NISUJBX1JCVFg0OTM4X0lPQ19JTlRSX0VOQUIpOwogCXYgfD0gKDEgPDwgKGlycSAtIFRPU0hJQkFfUkJUWDQ5MzhfSVJRX0lPQ19CRUcpKTsKIAlUWDQ5MzhfV1IwOChUT1NISUJBX1JCVFg0OTM4X0lPQ19JTlRSX0VOQUIsIHYpOwogCW1taW93YigpOwogCVRYNDkzOF9SRDA4KFRPU0hJQkFfUkJUWDQ5MzhfSU9DX0lOVFJfRU5BQik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0b3NoaWJhX3JidHg0OTM4X2lvY19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCiB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhciB2OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRvc2hpYmFfcmJ0eDQ5MzhfaW9jX2xvY2ssIGZsYWdzKTsKLQogCXYgPSBUWDQ5MzhfUkQwOChUT1NISUJBX1JCVFg0OTM4X0lPQ19JTlRSX0VOQUIpOwogCXYgJj0gfigxIDw8IChpcnEgLSBUT1NISUJBX1JCVFg0OTM4X0lSUV9JT0NfQkVHKSk7CiAJVFg0OTM4X1dSMDgoVE9TSElCQV9SQlRYNDkzOF9JT0NfSU5UUl9FTkFCLCB2KTsKIAltbWlvd2IoKTsKIAlUWDQ5MzhfUkQwOChUT1NISUJBX1JCVFg0OTM4X0lPQ19JTlRSX0VOQUIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG9zaGliYV9yYnR4NDkzOF9pb2NfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCXRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlKGlycSk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pY3UuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCmluZGV4IGMyMTVjMGQuLjU0YjkyYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCkBAIC00MTcsMTQgKzQxNyw3IEBACiAKIEVYUE9SVF9TWU1CT0wodnI0MXh4X2Rpc2FibGVfYmN1aW50KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3N5c2ludDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWN1MV9zZXQoTVNZU0lOVDFSRUcsIDEgPDwgU1lTSU5UMV9JUlFfVE9fUElOKGlycSkpOwotCi0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotc3RhdGljIHZvaWQgc2h1dGRvd25fc3lzaW50MV9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGRpc2FibGVfc3lzaW50MV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpY3UxX2NsZWFyKE1TWVNJTlQxUkVHLCAxIDw8IFNZU0lOVDFfSVJRX1RPX1BJTihpcnEpKTsKIH0KQEAgLTQzNCw5ICs0MjcsNiBAQAogCWljdTFfc2V0KE1TWVNJTlQxUkVHLCAxIDw8IFNZU0lOVDFfSVJRX1RPX1BJTihpcnEpKTsKIH0KIAotI2RlZmluZSBkaXNhYmxlX3N5c2ludDFfaXJxCXNodXRkb3duX3N5c2ludDFfaXJxCi0jZGVmaW5lIGFja19zeXNpbnQxX2lycQkJc2h1dGRvd25fc3lzaW50MV9pcnEKLQogc3RhdGljIHZvaWQgZW5kX3N5c2ludDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKQEAgLTQ0NSwyMiArNDM1LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3lzaW50MV9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiU1lTSU5UMSIsCi0JLnN0YXJ0dXAJPSBzdGFydHVwX3N5c2ludDFfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX3N5c2ludDFfaXJxLAotCS5lbmFibGUJCT0gZW5hYmxlX3N5c2ludDFfaXJxLAotCS5kaXNhYmxlCT0gZGlzYWJsZV9zeXNpbnQxX2lycSwKLQkuYWNrCQk9IGFja19zeXNpbnQxX2lycSwKKwkuYWNrCQk9IGRpc2FibGVfc3lzaW50MV9pcnEsCisJLm1hc2sJCT0gZGlzYWJsZV9zeXNpbnQxX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX3N5c2ludDFfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3N5c2ludDFfaXJxLAogCS5lbmQJCT0gZW5kX3N5c2ludDFfaXJxLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3N5c2ludDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWN1Ml9zZXQoTVNZU0lOVDJSRUcsIDEgPDwgU1lTSU5UMl9JUlFfVE9fUElOKGlycSkpOwotCi0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotc3RhdGljIHZvaWQgc2h1dGRvd25fc3lzaW50Ml9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGRpc2FibGVfc3lzaW50Ml9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpY3UyX2NsZWFyKE1TWVNJTlQyUkVHLCAxIDw8IFNZU0lOVDJfSVJRX1RPX1BJTihpcnEpKTsKIH0KQEAgLTQ3MCw5ICs0NTIsNiBAQAogCWljdTJfc2V0KE1TWVNJTlQyUkVHLCAxIDw8IFNZU0lOVDJfSVJRX1RPX1BJTihpcnEpKTsKIH0KIAotI2RlZmluZSBkaXNhYmxlX3N5c2ludDJfaXJxCXNodXRkb3duX3N5c2ludDJfaXJxCi0jZGVmaW5lIGFja19zeXNpbnQyX2lycQkJc2h1dGRvd25fc3lzaW50Ml9pcnEKLQogc3RhdGljIHZvaWQgZW5kX3N5c2ludDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKQEAgLTQ4MSwxMSArNDYwLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3lzaW50Ml9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiU1lTSU5UMiIsCi0JLnN0YXJ0dXAJPSBzdGFydHVwX3N5c2ludDJfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX3N5c2ludDJfaXJxLAotCS5lbmFibGUJCT0gZW5hYmxlX3N5c2ludDJfaXJxLAotCS5kaXNhYmxlCT0gZGlzYWJsZV9zeXNpbnQyX2lycSwKLQkuYWNrCQk9IGFja19zeXNpbnQyX2lycSwKKwkuYWNrCQk9IGRpc2FibGVfc3lzaW50Ml9pcnEsCisJLm1hc2sJCT0gZGlzYWJsZV9zeXNpbnQyX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX3N5c2ludDJfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3N5c2ludDJfaXJxLAogCS5lbmQJCT0gZW5kX3N5c2ludDJfaXJxLAogfTsKIApAQCAtNzIzLDEwICs3MDEsMTIgQEAKIAlpY3UyX3dyaXRlKE1HSVVJTlRIUkVHLCAweGZmZmYpOwogCiAJZm9yIChpID0gU1lTSU5UMV9JUlFfQkFTRTsgaSA8PSBTWVNJTlQxX0lSUV9MQVNUOyBpKyspCi0JCWlycV9kZXNjW2ldLmNoaXAgPSAmc3lzaW50MV9pcnFfdHlwZTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZzeXNpbnQxX2lycV90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlmb3IgKGkgPSBTWVNJTlQyX0lSUV9CQVNFOyBpIDw9IFNZU0lOVDJfSVJRX0xBU1Q7IGkrKykKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZzeXNpbnQyX2lycV90eXBlOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnN5c2ludDJfaXJxX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCWNhc2NhZGVfaXJxKElOVDBfSVJRLCBpY3VfZ2V0X2lycSk7CiAJY2FzY2FkZV9pcnEoSU5UMV9JUlEsIGljdV9nZXRfaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvbmVjLWNtYnZyNDEzMy9pcnEuYyBiL2FyY2gvbWlwcy92cjQxeHgvbmVjLWNtYnZyNDEzMy9pcnEuYwppbmRleCAyNDgzNDg3Li5hMDM5YmI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L25lYy1jbWJ2cjQxMzMvaXJxLmMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9uZWMtY21idnI0MTMzL2lycS5jCkBAIC0zMCwxNyArMzAsNiBAQAogCiBleHRlcm4gaW50IHZyNDEzM19yb2NraG9wcGVyOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaTgyNTlfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlXzgyNTlBX2lycShpcnEgLSBJODI1OV9JUlFfQkFTRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX2k4MjU5X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfODI1OUFfaXJxKGlycSAtIEk4MjU5X0lSUV9CQVNFKTsKLX0KLQogc3RhdGljIHZvaWQgZW5hYmxlX2k4MjU5X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWVuYWJsZV84MjU5QV9pcnEoaXJxIC0gSTgyNTlfSVJRX0JBU0UpOwpAQCAtNjQsMTEgKzUzLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lICAgICAgID0gIlhULVBJQyIsCi0JLnN0YXJ0dXAgICAgICAgID0gc3RhcnR1cF9pODI1OV9pcnEsCi0JLnNodXRkb3duICAgICAgID0gc2h1dGRvd25faTgyNTlfaXJxLAotCS5lbmFibGUgICAgICAgICA9IGVuYWJsZV9pODI1OV9pcnEsCi0JLmRpc2FibGUgICAgICAgID0gZGlzYWJsZV9pODI1OV9pcnEsCiAJLmFjayAgICAgICAgICAgID0gYWNrX2k4MjU5X2lycSwKKwkubWFzawkJPSBkaXNhYmxlX2k4MjU5X2lycSwKKwkubWFza19hY2sJPSBhY2tfaTgyNTlfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX2k4MjU5X2lycSwKIAkuZW5kICAgICAgICAgICAgPSBlbmRfaTgyNTlfaXJxLAogfTsKIApAQCAtMTA0LDcgKzkyLDcgQEAKIAl9CiAKIAlmb3IgKGkgPSBJODI1OV9JUlFfQkFTRTsgaSA8PSBJODI1OV9JUlFfTEFTVDsgaSsrKQotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmk4MjU5X2lycV90eXBlOworCQlzZXRfaXJxX2NoaXAoaSwgJmk4MjU5X2lycV90eXBlKTsKIAogCXNldHVwX2lycShJODI1OV9TTEFWRV9JUlEsICZpODI1OV9zbGF2ZV9jYXNjYWRlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2NoZWNrc3VtLmMgYi9hcmNoL3BhcmlzYy9saWIvY2hlY2tzdW0uYwppbmRleCA4YTFlMDgwLi40NjI2OTZkIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL3BhcmlzYy9saWIvY2hlY2tzdW0uYwpAQCAtMTAxLDExICsxMDEsMTQgQEAKIC8qCiAgKiBjb21wdXRlcyBhIHBhcnRpYWwgY2hlY2tzdW0sIGUuZy4gZm9yIFRDUC9VRFAgZnJhZ21lbnRzCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKKy8qCisgKiB3aHkgYm90aGVyIGZvbGRpbmc/CisgKi8KK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwogCWFkZGMocmVzdWx0LCBzdW0pOwotCXJldHVybiBmcm9tMzJ0bzE2KHJlc3VsdCk7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlmcm9tMzJ0bzE2KHJlc3VsdCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKQEAgLTExMyw4ICsxMTYsOCBAQAogLyoKICAqIGNvcHkgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAkvKgogCSAqIEl0J3MgMjozMCBhbSBhbmQgSSBkb24ndCBmZWVsIGxpa2UgZG9pbmcgaXQgcmVhbCAuLi4KQEAgLTEzMSw5ICsxMzQsOSBAQAogICogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgogICogdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywKLQkJCQkJdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJCQl1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsCisJCQkJCXZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkJX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvLmdpdGlnbm9yZSBiL2FyY2gvcG93ZXJwYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTg2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitpbmNsdWRlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDA2NzNkYmUuLjI5MWM5NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlkZWZhdWx0IDZ4eAogCiBjb25maWcgQ0xBU1NJQzMyCi0JYm9vbCAiNnh4Lzd4eC83NHh4IgorCWJvb2wgIjUyeHgvNnh4Lzd4eC83NHh4IgogCXNlbGVjdCBQUENfRlBVCiAJc2VsZWN0IDZ4eAogCWhlbHAKQEAgLTEyMSwxNiArMTIxLDE4IEBACiAJICB2ZXJzaW9ucyAoODIxLCA4MjMsIDg1MCwgODU1LCA4NjAsIDUyeHgsIDgyeHgsIDgzeHgpLCB0aGUgQU1DQwogCSAgZW1iZWRkZWQgdmVyc2lvbnMgKDQwMyBhbmQgNDA1KSBhbmQgdGhlIGhpZ2ggZW5kIDY0IGJpdCBQb3dlcgogCSAgcHJvY2Vzc29ycyAoUE9XRVIgMywgUE9XRVI0LCBhbmQgSUJNIFBQQzk3MCBhbHNvIGtub3duIGFzIEc1KS4KKworCSAgVGhpcyBvcHRpb24gaXMgdGhlIGNhdGNoLWFsbCBmb3IgNnh4IHR5cGVzLCBpbmNsdWRpbmcgc29tZSBvZiB0aGUKKwkgIGVtYmVkZGVkIHZlcnNpb25zLiAgVW5sZXNzIHRoZXJlIGlzIHNlZSBhbiBvcHRpb24gZm9yIHRoZSBzcGVjaWZpYworCSAgY2hpcCBmYW1pbHkgeW91IGFyZSB1c2luZywgeW91IHdhbnQgdGhpcyBvcHRpb24uCiAJICAKLQkgIFVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBvbmUgb2YgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcgotCSAgc3lzdGVtcywgNjQgYml0IElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgorCSAgWW91IGRvIG5vdCB3YW50IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSA2NCBiaXQKKwkgIElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgorCSAgCisJICBJZiB1bnN1cmUsIHNlbGVjdCB0aGlzIG9wdGlvbgorCSAgCiAJICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBydW5zIGluIDMyLWJpdCBtb2RlIGV2ZW4gb24gNjQtYml0IGNoaXBzLgogCi1jb25maWcgUFBDXzUyeHgKLQlib29sICJGcmVlc2NhbGUgNTJ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IFBQQ19GUFUKLQkKIGNvbmZpZyBQUENfODJ4eAogCWJvb2wgIkZyZWVzY2FsZSA4Mnh4IgogCXNlbGVjdCA2eHgKQEAgLTE2MCw5ICsxNjIsMTEgQEAKIAogY29uZmlnIDQweAogCWJvb2wgIkFNQ0MgNDB4IgorCXNlbGVjdCBQUENfRENSX05BVElWRQogCiBjb25maWcgNDR4CiAJYm9vbCAiQU1DQyA0NHgiCisJc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCiAKIGNvbmZpZyA4eHgKIAlib29sICJGcmVlc2NhbGUgOHh4IgpAQCAtMjA4LDYgKzIxMiwyNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgUFBDNjQKIAorY29uZmlnIFBQQ19EQ1JfTkFUSVZFCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0RDUl9NTUlPCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0RDUgorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ19EQ1JfTkFUSVZFIHx8IFBQQ19EQ1JfTU1JTworCWRlZmF1bHQgeQorCitjb25maWcgUFBDX09GX1BMQVRGT1JNX1BDSQorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQzY0ICMgbm90IHN1cHBvcnRlZCBvbiAzMiBiaXRzIHlldAorCWRlZmF1bHQgbgorCiBjb25maWcgQk9PS0UKIAlib29sCiAJZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKQEAgLTIyNyw2ICsyNDksNyBAQAogY29uZmlnIFBIWVNfNjRCSVQKIAlib29sICdMYXJnZSBwaHlzaWNhbCBhZGRyZXNzIHN1cHBvcnQnIGlmIEU1MDAKIAlkZXBlbmRzIG9uIDQ0eCB8fCBFNTAwCisJc2VsZWN0IFJFU09VUkNFU182NEJJVAogCWRlZmF1bHQgeSBpZiA0NHgKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciBsYXJnZXIgdGhhbiAzMi1iaXQgcGh5c2ljYWwKQEAgLTM2OSwxMSArMzkyLDEzIEBACiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IFJUQVNfRVJST1JfTE9HR0lORwogCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBQUENfTkFUSVZFCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBQUENfSVNFUklFUwogCWJvb2wgIklCTSBMZWdhY3kgaVNlcmllcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0CisJc2VsZWN0IFBQQ19JTkRJUkVDVF9JTwogCiBjb25maWcgUFBDX0NIUlAKIAlib29sICJDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtIChDSFJQKSBiYXNlZCBtYWNoaW5lcyIKQEAgLTM4NCwxNCArNDA5LDM1IEBACiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IFBQQ19NUEMxMDYKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX05BVElWRQogCWRlZmF1bHQgeQogCitjb25maWcgUFBDX01QQzUyeHgKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfRUZJS0EKKwlib29sICJiUGxhbiBFZmlrYSA1azIuIE1QQzUyMDBCIGJhc2VkIGNvbXB1dGVyIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgUFBDX1JUQVMKKwlzZWxlY3QgUlRBU19QUk9DCisJc2VsZWN0IFBQQ19NUEM1Mnh4CisJc2VsZWN0IFBQQ19OQVRJVkUKKwlkZWZhdWx0IHkKKworY29uZmlnIFBQQ19MSVRFNTIwMAorCWJvb2wgIkZyZWVzY2FsZSBMaXRlNTIwMCBFdmFsIEJvYXJkIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgUFBDX01QQzUyeHgKKwlkZWZhdWx0IG4KKwogY29uZmlnIFBQQ19QTUFDCiAJYm9vbCAiQXBwbGUgUG93ZXJNYWMgYmFzZWQgbWFjaGluZXMiCiAJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STQogCXNlbGVjdCBNUElDCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kgaWYgUFBDMzIKIAlzZWxlY3QgUFBDX01QQzEwNiBpZiBQUEMzMgorCXNlbGVjdCBQUENfTkFUSVZFCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBQUENfUE1BQzY0CkBAIC00MTEsNiArNDU3LDcgQEAKIAlzZWxlY3QgUFBDX0k4MjU5CiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX05BVElWRQogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX01BUExFCkBAIC00MjIsMTAgKzQ2OSwxMSBAQAogCXNlbGVjdCBHRU5FUklDX1RCU1lOQwogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfOTcwX05BUAorCXNlbGVjdCBQUENfTkFUSVZFCiAJZGVmYXVsdCBuCiAJaGVscAogICAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcGxlIDk3MEZYIEV2YWx1YXRpb24gQm9hcmQuCi0JICBGb3IgbW9yZSBpbmZvcm1hdGlvbnMsIHJlZmVyIHRvIDxodHRwOi8vd3d3Ljk3MGV2YWwuY29tPgorCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIDxodHRwOi8vd3d3Ljk3MGV2YWwuY29tPgogCiBjb25maWcgUFBDX1BBU0VNSQogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKQEAgLTQzNCw2ICs0ODIsNyBAQAogCXNlbGVjdCBNUElDCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IEdFTkVSSUNfVEJTWU5DCisJc2VsZWN0IFBQQ19OQVRJVkUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFBBIFNlbWkncyBQV1JmaWNpZW50IGxpbmUKIAkgIG9mIFNvQyBwcm9jZXNzb3JzLCBpbmNsdWRpbmcgUEE2VC0xNjgyTQpAQCAtNDQ1LDYgKzQ5NCwxMSBAQAogY29uZmlnIFBQQ19DRUxMX05BVElWRQogCWJvb2wKIAlzZWxlY3QgUFBDX0NFTEwKKwlzZWxlY3QgUFBDX0RDUl9NTUlPCisJc2VsZWN0IFBQQ19PRl9QTEFURk9STV9QQ0kKKwlzZWxlY3QgUFBDX0lORElSRUNUX0lPCisJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgTVBJQwogCWRlZmF1bHQgbgogCiBjb25maWcgUFBDX0lCTV9DRUxMX0JMQURFCkBAIC00NTYsNiArNTEwLDIyIEBACiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFVEQkdfUlRBU19DT05TT0xFCiAKK2NvbmZpZyBQUENfUFMzCisJYm9vbCAiU29ueSBQUzMiCisJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAorCXNlbGVjdCBQUENfQ0VMTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFNvbnkgUFMzIGdhbWUgY29uc29sZQorCSAgYW5kIG90aGVyIHBsYXRmb3JtcyB1c2luZyB0aGUgUFMzIGh5cGVydmlzb3IuCisKK2NvbmZpZyBQUENfTkFUSVZFCisJYm9vbAorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0KKwloZWxwCisJICBTdXBwb3J0IGZvciBydW5uaW5nIG5hdGl2ZWx5IG9uIHRoZSBoYXJkd2FyZSwgaS5lLiB3aXRob3V0CisJICBhIGh5cGVydmlzb3IuIFRoaXMgb3B0aW9uIGlzIG5vdCB1c2VyLXNlbGVjdGFibGUgYnV0IHNob3VsZAorCSAgYmUgc2VsZWN0ZWQgYnkgYWxsIHBsYXRmb3JtcyB0aGF0IG5lZWQgaXQuCisKIGNvbmZpZyBVREJHX1JUQVNfQ09OU09MRQogCWJvb2wgIlJUQVMgYmFzZWQgZGVidWcgY29uc29sZSIKIAlkZXBlbmRzIG9uIFBQQ19SVEFTCkBAIC01MTcsNiArNTg3LDE1IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgUFBDX0lORElSRUNUX0lPCisJYm9vbAorCXNlbGVjdCBHRU5FUklDX0lPTUFQCisJZGVmYXVsdCBuCisKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisJYm9vbAorCWRlZmF1bHQgbgorCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCiBjb25maWcgQ1BVX0ZSRVFfUE1BQwpAQCAtNTk0LDEyICs2NzMsNiBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KIAotY29uZmlnIFBQQ19UT0RDCi0JZGVwZW5kcyBvbiBFTUJFRERFRDZ4eAotCWJvb2wgIkdlbmVyaWMgVGltZS1vZi1kYXkgQ2xvY2sgKFRPREMpIHN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIG1hbnkgVE9EQy9SVEMgY2hpcHMuCi0KIGVuZG1lbnUKIAogc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwpAQCAtNjEwLDYgKzY4Myw3IEBACiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKK3NvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCiAKIG1lbnUgIktlcm5lbCBvcHRpb25zIgogCkBAIC03OTAsNyArODY0LDYgQEAKIAogY29uZmlnIENNRExJTkVfQk9PTAogCWJvb2wgIkRlZmF1bHQgYm9vdGxvYWRlciBrZXJuZWwgYXJndW1lbnRzIgotCWRlcGVuZHMgb24gIVBQQ19JU0VSSUVTCiAKIGNvbmZpZyBDTURMSU5FCiAJc3RyaW5nICJJbml0aWFsIGtlcm5lbCBjb21tYW5kIHN0cmluZyIKQEAgLTg4MCw3ICs5NTMsNyBAQAogCiBjb25maWcgUENJCiAJYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IFBQQ184NXh4IHx8IFBQQ184Nnh4IFwKLQkJfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIFBQQ19JU0VSSUVTKSB8fCBNUEM3NDQ4SFBDMgorCQl8fCBQUENfTVBDNTJ4eCB8fCAoRU1CRURERUQgJiYgUFBDX0lTRVJJRVMpIHx8IE1QQzc0NDhIUEMyIHx8IFBQQ19QUzMKIAlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICFQUENfODN4eCBcCiAJCSYmICFQUENfODV4eCAmJiAhUFBDXzg2eHgKIAlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHggJiYgQVBVUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwppbmRleCA1YWQxNDliLi5mMGU1MWVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwpAQCAtNzcsNyArNzcsNyBAQAogCiBjb25maWcgWE1PTgogCWJvb2wgIkluY2x1ZGUgeG1vbiBrZXJuZWwgZGVidWdnZXIiCi0JZGVwZW5kcyBvbiBERUJVR0dFUiAmJiAhUFBDX0lTRVJJRVMKKwlkZXBlbmRzIG9uIERFQlVHR0VSCiAJaGVscAogCSAgSW5jbHVkZSBpbi1rZXJuZWwgaG9va3MgZm9yIHRoZSB4bW9uIGtlcm5lbCBtb25pdG9yL2RlYnVnZ2VyLgogCSAgVW5sZXNzIHlvdSBhcmUgaW50ZW5kaW5nIHRvIGRlYnVnIHRoZSBrZXJuZWwsIHNheSBOIGhlcmUuCkBAIC05OCw2ICs5OCwxNSBAQAogCSAgeG1vbiBpcyBub3JtYWxseSBkaXNhYmxlZCB1bmxlc3MgYm9vdGVkIHdpdGggJ3htb249b24nLgogCSAgVXNlICd4bW9uPW9mZicgdG8gZGlzYWJsZSB4bW9uIGluaXQgZHVyaW5nIHJ1bnRpbWUuCiAKK2NvbmZpZyBYTU9OX0RJU0FTU0VNQkxZCisJYm9vbCAiSW5jbHVkZSBkaXNhc3NlbWJseSBzdXBwb3J0IGluIHhtb24iCisJZGVwZW5kcyBvbiBYTU9OCisJZGVmYXVsdCB5CisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBkaXNhc3NlbWJsaW5nIGluIHhtb24uIFlvdSBwcm9iYWJseSB3YW50CisJICB0byBzYXkgWSBoZXJlLCB1bmxlc3MgeW91J3JlIGJ1aWxkaW5nIGZvciBhIG1lbW9yeS1jb25zdHJhaW5lZAorCSAgc3lzdGVtLgorCiBjb25maWcgSVJRU1RBQ0tTCiAJYm9vbCAiVXNlIHNlcGFyYXRlIGtlcm5lbCBzdGFja3Mgd2hlbiBwcm9jZXNzaW5nIGludGVycnVwdHMiCiAJZGVwZW5kcyBvbiBQUEM2NApAQCAtMTE2LDcgKzEyNSw3IEBACiAKIGNvbmZpZyBCT09UWF9URVhUCiAJYm9vbCAiU3VwcG9ydCBmb3IgZWFybHkgYm9vdCB0ZXh0IGNvbnNvbGUgKEJvb3RYIG9yIE9wZW5GaXJtd2FyZSBvbmx5KSIKLQlkZXBlbmRzIFBQQ19PRiAmJiAhUFBDX0lTRVJJRVMKKwlkZXBlbmRzIFBQQ19PRgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc2VlIHByb2dyZXNzIG1lc3NhZ2VzIGZyb20gdGhlIGJvb3QgZmlybXdhcmUgaW4gdGV4dAogCSAgbW9kZS4gUmVxdWlyZXMgZWl0aGVyIEJvb3RYIG9yIE9wZW4gRmlybXdhcmUuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZQppbmRleCA0NWM5YWQyLi4wNzM0YjJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUKQEAgLTEsMTkgKzEsMzIgQEAKIGFkZG5vdGUKK2VtcHR5LmMKK2hhY2stY29mZgogaW5mYmxvY2suYwogaW5mYmxvY2suaAogaW5mY29kZXMuYwogaW5mY29kZXMuaAogaW5mZmFzdC5jCiBpbmZmYXN0LmgKK2luZmZpeGVkLmgKIGluZmxhdGUuYworaW5mbGF0ZS5oCiBpbmZ0cmVlcy5jCiBpbmZ0cmVlcy5oCiBpbmZ1dGlsLmMKIGluZnV0aWwuaAoga2VybmVsLXZtbGludXguc3RyaXAuYwoga2VybmVsLXZtbGludXguc3RyaXAuZ3oKK21rdHJlZQogdUltYWdlCiB6SW1hZ2UKK3pJbWFnZS5jaHJwCit6SW1hZ2UuY29mZgorekltYWdlLmNvZmYubGRzCit6SW1hZ2UubGRzCit6SW1hZ2UubWlib290Cit6SW1hZ2UucG1hYworekltYWdlLnBzZXJpZXMKK3pJbWFnZS5zYW5kcG9pbnQKIHpJbWFnZS52bW9kZQogemNvbmYuaAogemxpYi5oCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IDRiMmJlNjEuLjM0M2RiY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC00MCw3ICs0MCw4IEBACiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYikgbWFpbi5vKTogJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJsaW51eGhlYWRlcikpIFwKIAkJJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJoZWFkZXIpKQogCi1zcmMtd2xpYiA6PSBzdHJpbmcuUyBzdGRpby5jIG1haW4uYyBkaXY2NC5TICQoemxpYikKK3NyYy13bGliIDo9IHN0cmluZy5TIHN0ZGlvLmMgbWFpbi5jIGZsYXRkZXZ0cmVlLmMgZmxhdGRldnRyZWVfbWlzYy5jIFwKKwkJbnMxNjU1MC5jIHNlcmlhbC5jIHNpbXBsZV9hbGxvYy5jIGRpdjY0LlMgdXRpbC5TICQoemxpYikKIHNyYy1wbGF0IDo9IG9mLmMKIHNyYy1ib290IDo9IGNydDAuUyAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCiAKQEAgLTc0LDcgKzc1LDcgQEAKIAlAY3AgJDwgJEAKIAogY2xlYW4tZmlsZXMgOj0gJCh6bGliKSAkKHpsaWJoZWFkZXIpICQoemxpYmxpbnV4aGVhZGVyKSBcCi0JCSQob2JqKS9lbXB0eS5jCisJCWVtcHR5LmMgekltYWdlIHpJbWFnZS5jb2ZmLmxkcyB6SW1hZ2UubGRzIHpJbWFnZS5zYW5kcG9pbnQKIAogcXVpZXRfY21kX2Jvb3RjYyA9IEJPT1RDQyAgJEAKICAgICAgIGNtZF9ib290Y2MgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVENGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTkzLDEzICs5NCwxMyBAQAogJChvYmopL3dyYXBwZXIuYTogJChvYmotd2xpYikKIAkkKGNhbGwgY21kLGJvb3RhcikKIAotaG9zdHByb2dzLXkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrIGhhY2stY29mZgoraG9zdHByb2dzLXkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrIGhhY2stY29mZiBta3RyZWUKIAogZXh0cmEteQkJOj0gJChvYmopL2NydDAubyAkKG9iaikvd3JhcHBlci5hICQob2JqLXBsYXQpICQob2JqKS9lbXB0eS5vIFwKIAkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcwogCiB3cmFwcGVyCQk6PSQoc3JjdHJlZSkvJChzcmMpL3dyYXBwZXIKLXdyYXBwZXJiaXRzCTo9ICQoZXh0cmEteSkgJChhZGRwcmVmaXggJChvYmopLyxhZGRub3RlIGhhY2stY29mZikKK3dyYXBwZXJiaXRzCTo9ICQoZXh0cmEteSkgJChhZGRwcmVmaXggJChvYmopLyxhZGRub3RlIGhhY2stY29mZiBta3RyZWUpCiAKICMjIyMjIyMjIyMjIyMKICMgQml0cyBmb3IgYnVpbGRpbmcgdmFyaW91cyBmbGF2b3VycyBvZiB6SW1hZ2UKQEAgLTE0OCwxMyArMTQ5LDE4IEBACiAkKG9iaikvekltYWdlLmluaXRyZC5taWJvb3Q6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgY21kLHdyYXBfaW5pdHJkLG1pYm9vdCkKIAorJChvYmopL3pJbWFnZS5wczM6IHZtbGludXgKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAorCiAkKG9iaikvdUltYWdlOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGNtZCx3cmFwLHVib290KQogCiBpbWFnZS0kKENPTkZJR19QUENfUFNFUklFUykJCSs9IHpJbWFnZS5wc2VyaWVzCiBpbWFnZS0kKENPTkZJR19QUENfTUFQTEUpCQkrPSB6SW1hZ2UucHNlcmllcwogaW1hZ2UtJChDT05GSUdfUFBDX0lCTV9DRUxMX0JMQURFKQkrPSB6SW1hZ2UucHNlcmllcworaW1hZ2UtJChDT05GSUdfUFBDX1BTMykJCQkrPSB6SW1hZ2UucHMzCiBpbWFnZS0kKENPTkZJR19QUENfQ0hSUCkJCSs9IHpJbWFnZS5jaHJwCitpbWFnZS0kKENPTkZJR19QUENfRUZJS0EpCQkrPSB6SW1hZ2UuY2hycAogaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpCQkrPSB6SW1hZ2UucG1hYwogaW1hZ2UtJChDT05GSUdfREVGQVVMVF9VSU1BR0UpCQkrPSB1SW1hZ2UKIApAQCAtMTc2LDMgKzE4Miw0IEBACiAKIGNsZWFuLWZpbGVzICs9ICQoYWRkcHJlZml4ICQob2JqdHJlZSkvLCAkKG9iai1ib290KSB2bWxpbnV4LnN0cmlwLmd6KQogY2xlYW4tZmlsZXMgKz0gJChhZGRwcmVmaXggJChvYmp0cmVlKS8sICQob2JqLWJvb3QpIHZtbGludXguYmluLmd6KQorY2xlYW4tZmlsZXMgKz0gJChpbWFnZS0pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmIwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIERldmljZSBUcmVlIFNvdWNlIGZvciBCdWZmYWxvIEt1cm9ib3hIRworICoKKyAqIENob29zZSBDT05GSUdfTElOS1NUQVRJT04gdG8gYnVpbGQgYSBrZXJuZWwgZm9yIEt1cm9ib3hIRywgb3IgdXNlCisgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGxpbmtzdGF0aW9uX2RlZmNvbmZpZy4KKyAqCisgKiBCYXNlZCBvbiBzYW5kcG9pbnQuZHRzCisgKgorICogMjAwNiAoYykgRy4gTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorCitYWFhYIGFkZCBmbGFzaCBwYXJ0cywgcnRjLCA/PworCitidWlsZCB3aXRoOiAiZHRjIC1mIC1JIGR0cyAtTyBkdGIgLW8ga3Vyb2JveEhHLmR0YiAtViAxNiBrdXJvYm94SEcuZHRzIgorCisKKyAqLworCisvIHsKKwlsaW51eCxwaGFuZGxlID0gPDEwMDA+OworCW1vZGVsID0gIkt1cm9ib3hIRyI7CisJY29tcGF0aWJsZSA9ICJsaW5rc3RhdGlvbiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwljcHVzIHsKKwkJbGludXgscGhhbmRsZSA9IDwyMDAwPjsKKwkJI2NwdXMgPSA8MT47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLDYwM2UgeyAvKiBSZWFsbHkgODI0MSAqLworCQkJbGludXgscGhhbmRsZSA9IDwyMTAwPjsKKwkJCWxpbnV4LGJvb3QtY3B1OworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDxmZGFkNjgwPjsJLyogRml4ZWQgYnkgYm9vdHdyYXBwZXIgKi8KKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwxRjA0MDAwPjsgLyogRml4ZWQgYnkgYm9vdHdyYXBwZXIgKi8KKwkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvKiBGcm9tIGJvb3Rsb2FkZXIgKi8KKwkJCS8qIEZvbGxvd2luZyByZXF1aXJlZCBieSBkdGMgYnV0IG5vdCB1c2VkICovCisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDA+OworCQkJaS1jYWNoZS1zaXplID0gPDQwMDA+OworCQkJZC1jYWNoZS1zaXplID0gPDQwMDA+OworCQl9OworCX07CisKKwltZW1vcnkgeworCQlsaW51eCxwaGFuZGxlID0gPDMwMDA+OworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MDAwMDAwMDAgMDgwMDAwMDA+OworCX07CisKKwlzb2MxMHggeyAvKiBBRkFJQ1QgbmVlZCB0byBtYWtlIHNvYyBmb3IgODI0NSdzIHVhcnRzIHRvIGJlIGRlZmluZWQgKi8KKwkJbGludXgscGhhbmRsZSA9IDw0MDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gIm1wYzEweCI7CisJCXN0b3JlLWdhdGhlcmluZyA9IDwwPjsgLyogMCA9PSBvZmYsICEwID09IG9uICovCisJCXJlZyA9IDw4MDAwMDAwMCAwMDEwMDAwMD47CisJCXJhbmdlcyA9IDw4MDAwMDAwMCA4MDAwMDAwMCA3MDAwMDAwMAkvKiBwY2kgbWVtIHNwYWNlICovCisJCQkgIGZjMDAwMDAwIGZjMDAwMDAwIDAwMTAwMDAwCS8qIEVVTUIgKi8KKwkJCSAgZmUwMDAwMDAgZmUwMDAwMDAgMDBjMDAwMDAJLyogcGNpIGkvbyBzcGFjZSAqLworCQkJICBmZWMwMDAwMCBmZWMwMDAwMCAwMDMwMDAwMAkvKiBwY2kgY2ZnIHJlZ3MgKi8KKwkJCSAgZmVmMDAwMDAgZmVmMDAwMDAgMDAxMDAwMDA+OwkvKiBwY2kgaWFjayAqLworCisJCWkyY0A4MDAwMzAwMCB7CisJCQlsaW51eCxwaGFuZGxlID0gPDQzMDA+OworCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8ODAwMDMwMDAgMTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDUgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDQ0MDA+OworCQl9OworCisJCXNlcmlhbEA4MDAwNDUwMCB7CisJCQlsaW51eCxwaGFuZGxlID0gPDQ1MTE+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8ODAwMDQ1MDAgOD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8N2MwNDRhOD47CisJCQljdXJyZW50LXNwZWVkID0gPDI1ODA+OworCQkJaW50ZXJydXB0cyA9IDw5IDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw0NDAwPjsKKwkJfTsKKworCQlzZXJpYWxAODAwMDQ2MDAgeworCQkJbGludXgscGhhbmRsZSA9IDw0NTEyPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDgwMDA0NjAwIDg+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDdjMDQ0YTg+OworCQkJY3VycmVudC1zcGVlZCA9IDxlMTAwPjsKKwkJCWludGVycnVwdHMgPSA8YSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NDQwMD47CisJCX07CisKKwkJcGljQDgwMDQwMDAwIHsKKwkJCWxpbnV4LHBoYW5kbGUgPSA8NDQwMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlyZWcgPSA8ODAwNDAwMDAgNDAwMDA+OworCQkJYnVpbHQtaW47CisJCX07CisKKwkJcGNpQGZlYzAwMDAwIHsKKwkJCWxpbnV4LHBoYW5kbGUgPSA8NDUwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQljb21wYXRpYmxlID0gIm1wYzEweC1wY2kiOworCQkJcmVnID0gPGZlYzAwMDAwIDQwMDAwMD47CisJCQlyYW5nZXMgPSA8MDEwMDAwMDAgMCAgICAgICAgMCBmZTAwMDAwMCAwIDAwYzAwMDAwCisJCQkJICAwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgNzAwMDAwMDA+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDdmMjgxNTU+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw0NDAwPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgxMSAtIElSUTAgRVRIICovCisJCQkJNTgwMCAwIDAgMSA0NDAwIDAgMQorCQkJCTU4MDAgMCAwIDIgNDQwMCAxIDEKKwkJCQk1ODAwIDAgMCAzIDQ0MDAgMiAxCisJCQkJNTgwMCAwIDAgNCA0NDAwIDMgMQorCQkJCS8qIElEU0VMIDB4MTIgLSBJUlExIElERTAgKi8KKwkJCQk2MDAwIDAgMCAxIDQ0MDAgMSAxCisJCQkJNjAwMCAwIDAgMiA0NDAwIDIgMQorCQkJCTYwMDAgMCAwIDMgNDQwMCAzIDEKKwkJCQk2MDAwIDAgMCA0IDQ0MDAgMCAxCisJCQkJLyogSURTRUwgMHgxNCAtIElSUTMgVVNCMi4wICovCisJCQkJNzAwMCAwIDAgMSA0NDAwIDMgMQorCQkJCTcwMDAgMCAwIDIgNDQwMCAzIDEKKwkJCQk3MDAwIDAgMCAzIDQ0MDAgMyAxCisJCQkJNzAwMCAwIDAgNCA0NDAwIDMgMQorCQkJPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzBkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDAuZHRzCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogTGl0ZTUyMDAgYm9hcmQgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMDYgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyB7CisJbW9kZWwgPSAiTGl0ZTUyMDAiOworCWNvbXBhdGlibGUgPSAibGl0ZTUyMDBcMGxpdGU1Mnh4XDBtcGM1MjAwXDBtcGM1Mnh4IjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjY3B1cyA9IDwxPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsNTIwMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlkLWNhY2hlLXNpemUgPSA8NDAwMD47CQkvLyBMMSwgMTZLCisJCQlpLWNhY2hlLXNpemUgPSA8NDAwMD47CQkvLyBMMSwgMTZLCisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCQkzMi1iaXQ7CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwwMDAwMDAwMCAwNDAwMDAwMD47CS8vIDY0TUIKKwl9OworCisJc29jNTIwMEBmMDAwMDAwMCB7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCXJhbmdlcyA9IDwwIGYwMDAwMDAwIGYwMDEwMDAwPjsKKwkJcmVnID0gPGYwMDAwMDAwIDAwMDEwMDAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCisJCWNkbUAyMDAgeworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLWNkbVwwbXBjNTJ4eC1jZG0iOworCQkJcmVnID0gPDIwMCAzOD47CisJCX07CisKKwkJcGljQDUwMCB7CisJCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOworCQkJbGludXgscGhhbmRsZSA9IDw1MDA+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBpY1wwbXBjNTJ4eC1waWMiOworCQkJcmVnID0gPDUwMCA4MD47CisJCQlidWlsdC1pbjsKKwkJfTsKKworCQlncHRANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDYwMCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDYxMCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgYSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjIwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDYyMCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgYiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDYzMCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgYyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDY0MCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgZCAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjUwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDY1MCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgZSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDY2MCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgZiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDY3MCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJcnRjQDgwMCB7CS8vIFJlYWwgdGltZSBjbG9jaworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLXJ0Y1wwbXBjNTJ4eC1ydGMiOworCQkJZGV2aWNlX3R5cGUgPSAicnRjIjsKKwkJCXJlZyA9IDw4MDAgMTAwPjsKKwkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCW1zY2FuQDkwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJtc2NhbiI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtbXNjYW5cMG1wYzUyeHgtbXNjYW4iOworCQkJaW50ZXJydXB0cyA9IDwyIDExIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQkJcmVnID0gPDkwMCA4MD47CisJCX07CisKKwkJbXNjYW5AOTgwIHsKKwkJCWRldmljZV90eXBlID0gIm1zY2FuIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMC1tc2NhblwwbXBjNTJ4eC1tc2NhbiI7CisJCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCQlyZWcgPSA8OTgwIDgwPjsKKwkJfTsKKworCQlncGlvQGIwMCB7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3Bpb1wwbXBjNTJ4eC1ncGlvIjsKKwkJCXJlZyA9IDxiMDAgNDA+OworCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJZ3Bpby13a3VwQGIwMCB7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtZ3Bpby13a3VwXDBtcGM1Mnh4LWdwaW8td2t1cCI7CisJCQlyZWcgPSA8YzAwIDQwPjsKKwkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCXBjaUAwZDAwIHsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMC1wY2lcMG1wYzUyeHgtcGNpIjsKKwkJCXJlZyA9IDxkMDAgMTAwPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8YzAwMCAwIDAgMSA1MDAgMCAwIDMKKwkJCSAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMiA1MDAgMCAwIDMKKwkJCSAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMyA1MDAgMCAwIDMKKwkJCSAgICAgICAgICAgICAgICAgYzAwMCAwIDAgNCA1MDAgMCAwIDM+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCisJCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgYSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIDA+OworCQkJcmFuZ2VzID0gPDQyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAorCQkJICAgICAgICAgIDAyMDAwMDAwIDAgYTAwMDAwMDAgYTAwMDAwMDAgMCAxMDAwMDAwMAorCQkJICAgICAgICAgIDAxMDAwMDAwIDAgMDAwMDAwMDAgYjAwMDAwMDAgMCAwMTAwMDAwMD47CisJCX07CisKKwkJc3BpQGYwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJzcGkiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLXNwaVwwbXBjNTJ4eC1zcGkiOworCQkJcmVnID0gPGYwMCAyMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgZCAwIDIgZSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQl1c2JAMTAwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJ1c2Itb2hjaS1iZSI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtb2hjaVwwbXBjNTJ4eC1vaGNpXDBvaGNpLWJlIjsKKwkJCXJlZyA9IDwxMDAwIGZmPjsKKwkJCWludGVycnVwdHMgPSA8MiA2IDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWJlc3Rjb21tQDEyMDAgeworCQkJZGV2aWNlX3R5cGUgPSAiZG1hLWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLWJlc3Rjb21tXDBtcGM1Mnh4LWJlc3Rjb21tIjsKKwkJCXJlZyA9IDwxMjAwIDgwPjsKKwkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKKwkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKKwkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIGEgMCAgMyBiIDAKKwkJCSAgICAgICAgICAgICAgMyBjIDAgIDMgZCAwICAzIGUgMCAgMyBmIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCXhsYkAxZjAwIHsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMC14bGJcMG1wYzUyeHgteGxiIjsKKwkJCXJlZyA9IDwxZjAwIDEwMD47CisJCX07CisKKwkJc2VyaWFsQDIwMDAgewkJLy8gUFNDMQorCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMC1wc2MtdWFydFwwbXBjNTJ4eC1wc2MtdWFydCI7CisJCQlwb3J0LW51bWJlciA9IDwwPjsgIC8vIExvZ2ljYWwgcG9ydCBhc3NpZ25tZW50CisJCQlyZWcgPSA8MjAwMCAxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJLy8gUFNDMiBpbiBzcGkgbW9kZSBleGFtcGxlCisJCXNwaUAyMjAwIHsJCS8vIFBTQzIKKwkJCWRldmljZV90eXBlID0gInNwaSI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtcHNjLXNwaVwwbXBjNTJ4eC1wc2Mtc3BpIjsKKwkJCXJlZyA9IDwyMjAwIDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQkvLyBQU0MzIGluIENPREVDIG1vZGUgZXhhbXBsZQorCQlpMnNAMjQwMCB7CQkvLyBQU0MzCisJCQlkZXZpY2VfdHlwZSA9ICJpMnMiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBzYy1pMnNcMG1wYzUyeHgtcHNjLWkycyI7CisJCQlyZWcgPSA8MjQwMCAxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDMgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJLy8gUFNDNCB1bmNvbmZpZ3VyZWQKKwkJLy9zZXJpYWxAMjYwMCB7CQkvLyBQU0M0CisJCS8vCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCS8vCWNvbXBhdGlibGUgPSAibXBjNTIwMC1wc2MtdWFydFwwbXBjNTJ4eC1wc2MtdWFydCI7CisJCS8vCXJlZyA9IDwyNjAwIDEwMD47CisJCS8vCWludGVycnVwdHMgPSA8MiBiIDA+OworCQkvLwlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCS8vfTsKKworCQkvLyBQU0M1IHVuY29uZmlndXJlZAorCQkvL3NlcmlhbEAyODAwIHsJCS8vIFBTQzUKKwkJLy8JZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJLy8JY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBzYy11YXJ0XDBtcGM1Mnh4LXBzYy11YXJ0IjsKKwkJLy8JcmVnID0gPDI4MDAgMTAwPjsKKwkJLy8JaW50ZXJydXB0cyA9IDwyIGMgMD47CisJCS8vCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJLy99OworCisJCS8vIFBTQzYgaW4gQUM5NyBtb2RlIGV4YW1wbGUKKwkJYWM5N0AyYzAwIHsJCS8vIFBTQzYKKwkJCWRldmljZV90eXBlID0gImFjOTciOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBzYy1hYzk3XDBtcGM1Mnh4LXBzYy1hYzk3IjsKKwkJCXJlZyA9IDwyYzAwIDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlldGhlcm5ldEAzMDAwIHsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLWZlY1wwbXBjNTJ4eC1mZWMiOworCQkJcmVnID0gPDMwMDAgODAwPjsKKwkJCW1hYy1hZGRyZXNzID0gWyAwMiAwMyAwNCAwNSAwNiAwNyBdOyAvLyBCYWQhCisJCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlhdGFAM2EwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJhdGEiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLWF0YVwwbXBjNTJ4eC1hdGEiOworCQkJcmVnID0gPDNhMDAgMTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiA3IDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWkyY0AzZDAwIHsKKwkJCWRldmljZV90eXBlID0gImkyYyI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtaTJjXDBtcGM1Mnh4LWkyYyI7CisJCQlyZWcgPSA8M2QwMCA0MD47CisJCQlpbnRlcnJ1cHRzID0gPDIgZiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlpMmNAM2Q0MCB7CisJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwLWkyY1wwbXBjNTJ4eC1pMmMiOworCQkJcmVnID0gPDNkNDAgNDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEwIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCQlzcmFtQDgwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAic3JhbSI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDAtc3JhbVwwbXBjNTJ4eC1zcmFtXDBzcmFtIjsKKwkJCXJlZyA9IDw4MDAwIDQwMDA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWNiNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBMaXRlNTIwMEIgYm9hcmQgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMDYgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyB7CisJbW9kZWwgPSAiTGl0ZTUyMDBiIjsKKwljb21wYXRpYmxlID0gImxpdGU1MjAwYlwwbGl0ZTUyeHhcMG1wYzUyMDBiXDBtcGM1Mnh4IjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjY3B1cyA9IDwxPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsNTIwMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlkLWNhY2hlLXNpemUgPSA8NDAwMD47CQkvLyBMMSwgMTZLCisJCQlpLWNhY2hlLXNpemUgPSA8NDAwMD47CQkvLyBMMSwgMTZLCisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCQkzMi1iaXQ7CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwwMDAwMDAwMCAxMDAwMDAwMD47CS8vIDI1Nk1CCisJfTsKKworCXNvYzUyMDBAZjAwMDAwMDAgeworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQlyYW5nZXMgPSA8MCBmMDAwMDAwMCBmMDAxMDAwMD47CisJCXJlZyA9IDxmMDAwMDAwMCAwMDAxMDAwMD47CisJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKworCQljZG1AMjAwIHsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItY2RtXDBtcGM1Mnh4LWNkbSI7CisJCQlyZWcgPSA8MjAwIDM4PjsKKwkJfTsKKworCQlwaWNANTAwIHsKKwkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7CisJCQlsaW51eCxwaGFuZGxlID0gPDUwMD47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXBpY1wwbXBjNTJ4eC1waWMiOworCQkJcmVnID0gPDUwMCA4MD47CisJCQlidWlsdC1pbjsKKwkJfTsKKworCQlncHRANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLWdwdFwwbXBjNTJ4eC1ncHQiOworCQkJZGV2aWNlX3R5cGUgPSAiZ3B0IjsKKwkJCXJlZyA9IDw2MDAgMTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJZ3B0QDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1ncHRcMG1wYzUyeHgtZ3B0IjsKKwkJCWRldmljZV90eXBlID0gImdwdCI7CisJCQlyZWcgPSA8NjEwIDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSBhIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWdwdEA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDYyMCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgYiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLWdwdFwwbXBjNTJ4eC1ncHQiOworCQkJZGV2aWNlX3R5cGUgPSAiZ3B0IjsKKwkJCXJlZyA9IDw2MzAgMTA+OworCQkJaW50ZXJydXB0cyA9IDwxIGMgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJZ3B0QDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1ncHRcMG1wYzUyeHgtZ3B0IjsKKwkJCWRldmljZV90eXBlID0gImdwdCI7CisJCQlyZWcgPSA8NjQwIDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSBkIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWdwdEA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItZ3B0XDBtcGM1Mnh4LWdwdCI7CisJCQlkZXZpY2VfdHlwZSA9ICJncHQiOworCQkJcmVnID0gPDY1MCAxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgZSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlncHRANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLWdwdFwwbXBjNTJ4eC1ncHQiOworCQkJZGV2aWNlX3R5cGUgPSAiZ3B0IjsKKwkJCXJlZyA9IDw2NjAgMTA+OworCQkJaW50ZXJydXB0cyA9IDwxIGYgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJZ3B0QDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1ncHRcMG1wYzUyeHgtZ3B0IjsKKwkJCWRldmljZV90eXBlID0gImdwdCI7CisJCQlyZWcgPSA8NjcwIDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXJ0Y1wwbXBjNTJ4eC1ydGMiOworCQkJZGV2aWNlX3R5cGUgPSAicnRjIjsKKwkJCXJlZyA9IDw4MDAgMTAwPjsKKwkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCW1zY2FuQDkwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJtc2NhbiI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLW1zY2FuXDBtcGM1Mnh4LW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MiAxMSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJCXJlZyA9IDw5MDAgODA+OworCQl9OworCisJCW1zY2FuQDk4MCB7CisJCQlkZXZpY2VfdHlwZSA9ICJtc2NhbiI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLW1zY2FuXDBtcGM1Mnh4LW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJCXJlZyA9IDw5ODAgODA+OworCQl9OworCisJCWdwaW9AYjAwIHsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItZ3Bpb1wwbXBjNTJ4eC1ncGlvIjsKKwkJCXJlZyA9IDxiMDAgNDA+OworCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJZ3Bpby13a3VwQGIwMCB7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLWdwaW8td2t1cFwwbXBjNTJ4eC1ncGlvLXdrdXAiOworCQkJcmVnID0gPGMwMCA0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlwY2lAMGQwMCB7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXBjaVwwbXBjNTJ4eC1wY2kiOworCQkJcmVnID0gPGQwMCAxMDA+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDxjMDAwIDAgMCAxIDUwMCAwIDAgMyAvLyAxc3Qgc2xvdAorCQkJICAgICAgICAgICAgICAgICBjMDAwIDAgMCAyIDUwMCAxIDEgMworCQkJICAgICAgICAgICAgICAgICBjMDAwIDAgMCAzIDUwMCAxIDIgMworCQkJICAgICAgICAgICAgICAgICBjMDAwIDAgMCA0IDUwMCAxIDMgMworCisJCQkgICAgICAgICAgICAgICAgIGM4MDAgMCAwIDEgNTAwIDEgMSAzIC8vIDJuZCBzbG90CisJCQkgICAgICAgICAgICAgICAgIGM4MDAgMCAwIDIgNTAwIDEgMiAzCisJCQkgICAgICAgICAgICAgICAgIGM4MDAgMCAwIDMgNTAwIDEgMyAzCisJCQkgICAgICAgICAgICAgICAgIGM4MDAgMCAwIDQgNTAwIDAgMCAzPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgorCQkJaW50ZXJydXB0cyA9IDwyIDggMCAyIDkgMCAyIGEgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCQlidXMtcmFuZ2UgPSA8MCAwPjsKKwkJCXJhbmdlcyA9IDw0MjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKKwkJCSAgICAgICAgICAwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMTAwMDAwMDAKKwkJCSAgICAgICAgICAwMTAwMDAwMCAwIDAwMDAwMDAwIGIwMDAwMDAwIDAgMDEwMDAwMDA+OworCQl9OworCisJCXNwaUBmMDAgeworCQkJZGV2aWNlX3R5cGUgPSAic3BpIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItc3BpXDBtcGM1Mnh4LXNwaSI7CisJCQlyZWcgPSA8ZjAwIDIwPjsKKwkJCWludGVycnVwdHMgPSA8MiBkIDAgMiBlIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCXVzYkAxMDAwIHsKKwkJCWRldmljZV90eXBlID0gInVzYi1vaGNpLWJlIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItb2hjaVwwbXBjNTJ4eC1vaGNpXDBvaGNpLWJlIjsKKwkJCXJlZyA9IDwxMDAwIGZmPjsKKwkJCWludGVycnVwdHMgPSA8MiA2IDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWJlc3Rjb21tQDEyMDAgeworCQkJZGV2aWNlX3R5cGUgPSAiZG1hLWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1iZXN0Y29tbVwwbXBjNTJ4eC1iZXN0Y29tbSI7CisJCQlyZWcgPSA8MTIwMCA4MD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCisJCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCisJCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyBhIDAgIDMgYiAwCisJCQkgICAgICAgICAgICAgIDMgYyAwICAzIGQgMCAgMyBlIDAgIDMgZiAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQl4bGJAMWYwMCB7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXhsYlwwbXBjNTJ4eC14bGIiOworCQkJcmVnID0gPDFmMDAgMTAwPjsKKwkJfTsKKworCQlzZXJpYWxAMjAwMCB7CQkvLyBQU0MxCisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1wc2MtdWFydFwwbXBjNTJ4eC1wc2MtdWFydCI7CisJCQlwb3J0LW51bWJlciA9IDwwPjsgIC8vIExvZ2ljYWwgcG9ydCBhc3NpZ25tZW50CisJCQlyZWcgPSA8MjAwMCAxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJLy8gUFNDMiBpbiBzcGkgbW9kZSBleGFtcGxlCisJCXNwaUAyMjAwIHsJCS8vIFBTQzIKKwkJCWRldmljZV90eXBlID0gInNwaSI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXBzYy1zcGlcMG1wYzUyeHgtcHNjLXNwaSI7CisJCQlyZWcgPSA8MjIwMCAxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDIgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCX07CisKKwkJLy8gUFNDMyBpbiBDT0RFQyBtb2RlIGV4YW1wbGUKKwkJaTJzQDI0MDAgewkJLy8gUFNDMworCQkJZGV2aWNlX3R5cGUgPSAiaTJzIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItcHNjLWkyc1wwbXBjNTJ4eC1wc2MtaTJzIjsKKwkJCXJlZyA9IDwyNDAwIDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQkvLyBQU0M0IHVuY29uZmlndXJlZAorCQkvL3NlcmlhbEAyNjAwIHsJCS8vIFBTQzQKKwkJLy8JZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJLy8JY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1wc2MtdWFydFwwbXBjNTJ4eC1wc2MtdWFydCI7CisJCS8vCXJlZyA9IDwyNjAwIDEwMD47CisJCS8vCWludGVycnVwdHMgPSA8MiBiIDA+OworCQkvLwlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCS8vfTsKKworCQkvLyBQU0M1IHVuY29uZmlndXJlZAorCQkvL3NlcmlhbEAyODAwIHsJCS8vIFBTQzUKKwkJLy8JZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJLy8JY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1wc2MtdWFydFwwbXBjNTJ4eC1wc2MtdWFydCI7CisJCS8vCXJlZyA9IDwyODAwIDEwMD47CisJCS8vCWludGVycnVwdHMgPSA8MiBjIDA+OworCQkvLwlpbnRlcnJ1cHQtcGFyZW50ID0gPDUwMD47CisJCS8vfTsKKworCQkvLyBQU0M2IGluIEFDOTcgbW9kZSBleGFtcGxlCisJCWFjOTdAMmMwMCB7CQkvLyBQU0M2CisJCQlkZXZpY2VfdHlwZSA9ICJhYzk3IjsKKwkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItcHNjLWFjOTdcMG1wYzUyeHgtcHNjLWFjOTciOworCQkJcmVnID0gPDJjMDAgMTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiA0IDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWV0aGVybmV0QDMwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLWZlY1wwbXBjNTJ4eC1mZWMiOworCQkJcmVnID0gPDMwMDAgODAwPjsKKwkJCW1hYy1hZGRyZXNzID0gWyAwMiAwMyAwNCAwNSAwNiAwNyBdOyAvLyBCYWQhCisJCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlhdGFAM2EwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJhdGEiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1hdGFcMG1wYzUyeHgtYXRhIjsKKwkJCXJlZyA9IDwzYTAwIDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8NTAwPjsKKwkJfTsKKworCQlpMmNAM2QwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOworCQkJY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1pMmNcMG1wYzUyeHgtaTJjIjsKKwkJCXJlZyA9IDwzZDAwIDQwPjsKKwkJCWludGVycnVwdHMgPSA8MiBmIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCisJCWkyY0AzZDQwIHsKKwkJCWRldmljZV90eXBlID0gImkyYyI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLWkyY1wwbXBjNTJ4eC1pMmMiOworCQkJcmVnID0gPDNkNDAgNDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEwIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDw1MDA+OworCQl9OworCQlzcmFtQDgwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAic3JhbSI7CisJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXNyYW1cMG1wYzUyeHgtc3JhbVwwc3JhbSI7CisJCQlyZWcgPSA8ODAwMCA0MDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCmluZGV4IGQ3Yjk4NWUuLmM0ZDk1NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwpAQCAtMTYxLDI5ICsxNjEsNDEgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDgwMCAwIDAgMSA3NDAwIDI0IDAKLQkJCQkwODAwIDAgMCAyIDc0MDAgMjUgMAotCQkJCTA4MDAgMCAwIDMgNzQwMCAyNiAwCi0JCQkJMDgwMCAwIDAgNCA3NDAwIDI3IDAKKwkJCQkwODAwIDAgMCAxIDExODAgMjQgMAorCQkJCTA4MDAgMCAwIDIgMTE4MCAyNSAwCisJCQkJMDgwMCAwIDAgMyAxMTgwIDI2IDAKKwkJCQkwODAwIDAgMCA0IDExODAgMjcgMAogCiAJCQkJLyogSURTRUwgMHgxMiAqLwotCQkJCTEwMDAgMCAwIDEgNzQwMCAyNSAwCi0JCQkJMTAwMCAwIDAgMiA3NDAwIDI2IDAKLQkJCQkxMDAwIDAgMCAzIDc0MDAgMjcgMAotCQkJCTEwMDAgMCAwIDQgNzQwMCAyNCAwCisJCQkJMTAwMCAwIDAgMSAxMTgwIDI1IDAKKwkJCQkxMDAwIDAgMCAyIDExODAgMjYgMAorCQkJCTEwMDAgMCAwIDMgMTE4MCAyNyAwCisJCQkJMTAwMCAwIDAgNCAxMTgwIDI0IDAKIAogCQkJCS8qIElEU0VMIDB4MTMgKi8KLQkJCQkxODAwIDAgMCAxIDc0MDAgMjYgMAotCQkJCTE4MDAgMCAwIDIgNzQwMCAyNyAwCi0JCQkJMTgwMCAwIDAgMyA3NDAwIDI0IDAKLQkJCQkxODAwIDAgMCA0IDc0MDAgMjUgMAorCQkJCTE4MDAgMCAwIDEgMTE4MCAyNiAwCisJCQkJMTgwMCAwIDAgMiAxMTgwIDI3IDAKKwkJCQkxODAwIDAgMCAzIDExODAgMjQgMAorCQkJCTE4MDAgMCAwIDQgMTE4MCAyNSAwCiAKIAkJCQkvKiBJRFNFTCAweDE0ICovCi0JCQkJMjAwMCAwIDAgMSA3NDAwIDI3IDAKLQkJCQkyMDAwIDAgMCAyIDc0MDAgMjQgMAotCQkJCTIwMDAgMCAwIDMgNzQwMCAyNSAwCi0JCQkJMjAwMCAwIDAgNCA3NDAwIDI2IDAKKwkJCQkyMDAwIDAgMCAxIDExODAgMjcgMAorCQkJCTIwMDAgMCAwIDIgMTE4MCAyNCAwCisJCQkJMjAwMCAwIDAgMyAxMTgwIDI1IDAKKwkJCQkyMDAwIDAgMCA0IDExODAgMjYgMAogCQkJCT47CisJCQlyb3V0ZXJAMTE4MCB7CisJCQkJbGludXgscGhhbmRsZSA9IDwxMTgwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJZGV2aWNlX3R5cGUgPSAicGljLXJvdXRlciI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQlidWlsdC1pbjsKKwkJCQliaWctZW5kaWFuOworCQkJCWludGVycnVwdHMgPSA8MTcgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDw3NDAwPjsKKwkJCX07CiAJCX07CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWUuYyBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2YzE5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlLmMKQEAgLTAsMCArMSw4ODAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQ29weXJpZ2h0IFBhbnRlbGlzIEFudG9uaW91IDIwMDYKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uIDIwMDYKKyAqCisgKiBBdXRob3JzOiBQYW50ZWxpcyBBbnRvbmlvdSA8cGFudGVsaXNAZW1iZWRkZWRhbGxleS5jb20+CisgKgkgICAgSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPgorICoJICAgIE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgorICoJICAgIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJmbGF0ZGV2dHJlZS5oIgorI2luY2x1ZGUgImZsYXRkZXZ0cmVlX2Vudi5oIgorCisjZGVmaW5lIF9BTElHTih4LCBhbCkJKCgoeCkgKyAoYWwpIC0gMSkgJiB+KChhbCkgLSAxKSkKKworLyogUm91dGluZXMgZm9yIGtlZXBpbmcgbm9kZSBwdHJzIHJldHVybmVkIGJ5IGZ0X2ZpbmRfZGV2aWNlIGN1cnJlbnQgKi8KKy8qIEZpcnN0IGVudHJ5IG5vdCB1c2VkIGIvYyBpdCB3b3VsZCByZXR1cm4gMCBhbmQgYmUgdGFrZW4gYXMgTlVMTC9lcnJvciAqLworc3RhdGljIHZvaWQgKmZ0X25vZGVfYWRkKHN0cnVjdCBmdF9jeHQgKmN4dCwgY2hhciAqbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBjeHQtPm5vZGVzX3VzZWQ7IGkrKykJLyogYWxyZWFkeSB0aGVyZT8gKi8KKwkJaWYgKGN4dC0+bm9kZV90YmxbaV0gPT0gbm9kZSkKKwkJCXJldHVybiAodm9pZCAqKWk7CisKKwlpZiAoY3h0LT5ub2Rlc191c2VkIDwgY3h0LT5ub2RlX21heCkgeworCQljeHQtPm5vZGVfdGJsW2N4dC0+bm9kZXNfdXNlZF0gPSBub2RlOworCQlyZXR1cm4gKHZvaWQgKiljeHQtPm5vZGVzX3VzZWQrKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmZ0X25vZGVfcGgybm9kZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGkgPSAodW5zaWduZWQgaW50KXBoYW5kbGU7CisKKwlpZiAoaSA8IGN4dC0+bm9kZXNfdXNlZCkKKwkJcmV0dXJuIGN4dC0+bm9kZV90YmxbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZ0X25vZGVfdXBkYXRlX2JlZm9yZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNoYXIgKmFkZHIsIGludCBzaGlmdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChzaGlmdCA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAxOyBpIDwgY3h0LT5ub2Rlc191c2VkOyBpKyspCisJCWlmIChjeHQtPm5vZGVfdGJsW2ldIDwgYWRkcikKKwkJCWN4dC0+bm9kZV90YmxbaV0gKz0gc2hpZnQ7Cit9CisKK3N0YXRpYyB2b2lkIGZ0X25vZGVfdXBkYXRlX2FmdGVyKHN0cnVjdCBmdF9jeHQgKmN4dCwgY2hhciAqYWRkciwgaW50IHNoaWZ0KQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHNoaWZ0ID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDE7IGkgPCBjeHQtPm5vZGVzX3VzZWQ7IGkrKykKKwkJaWYgKGN4dC0+bm9kZV90YmxbaV0gPj0gYWRkcikKKwkJCWN4dC0+bm9kZV90YmxbaV0gKz0gc2hpZnQ7Cit9CisKKy8qIFN0cnVjdCB1c2VkIHRvIHJldHVybiBpbmZvIGZyb20gZnRfbmV4dCgpICovCitzdHJ1Y3QgZnRfYXRvbSB7CisJdTMyIHRhZzsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKmRhdGE7CisJdTMyIHNpemU7Cit9OworCisvKiBTZXQgcHRycyB0byBjdXJyZW50IG9uZSdzIGluZm87IHJldHVybiBhZGRyIG9mIG5leHQgb25lICovCitzdGF0aWMgY2hhciAqZnRfbmV4dChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNoYXIgKnAsIHN0cnVjdCBmdF9hdG9tICpyZXQpCit7CisJdTMyIHN6OworCisJaWYgKHAgPj0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCArIGN4dC0+cmduW0ZUX1NUUlVDVF0uc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQtPnRhZyA9IGJlMzJfdG9fY3B1KCoodTMyICopIHApOworCXAgKz0gNDsKKworCXN3aXRjaCAocmV0LT50YWcpIHsJLyogVGFnICovCisJY2FzZSBPRl9EVF9CRUdJTl9OT0RFOgorCQlyZXQtPm5hbWUgPSBwOworCQlyZXQtPmRhdGEgPSAodm9pZCAqKShwIC0gNCk7CS8qIHN0YXJ0IG9mIG5vZGUgKi8KKwkJcCArPSBfQUxJR04oc3RybGVuKHApICsgMSwgNCk7CisJCWJyZWFrOworCWNhc2UgT0ZfRFRfUFJPUDoKKwkJcmV0LT5zaXplID0gc3ogPSBiZTMyX3RvX2NwdSgqKHUzMiAqKSBwKTsKKwkJcmV0LT5uYW1lID0gY3h0LT5zdHJfYW5jaG9yICsgYmUzMl90b19jcHUoKih1MzIgKikgKHAgKyA0KSk7CisJCXJldC0+ZGF0YSA9ICh2b2lkICopKHAgKyA4KTsKKwkJcCArPSA4ICsgX0FMSUdOKHN6LCA0KTsKKwkJYnJlYWs7CisJY2FzZSBPRl9EVF9FTkRfTk9ERToKKwljYXNlIE9GX0RUX05PUDoKKwkJYnJlYWs7CisJY2FzZSBPRl9EVF9FTkQ6CisJZGVmYXVsdDoKKwkJcCA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBwOworfQorCisjZGVmaW5lIEhEUl9TSVpFCV9BTElHTihzaXplb2Yoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyKSwgOCkKKyNkZWZpbmUgRVhQQU5EX0lOQ1IJMTAyNAkvKiBhbGxvYyB0aGlzIG11Y2ggZXh0cmEgd2hlbiBleHBhbmRpbmcgKi8KKworLyogU2VlIGlmIHRoZSByZWdpb25zIGFyZSBpbiB0aGUgc3RhbmRhcmQgb3JkZXIgYW5kIG5vbi1vdmVybGFwcGluZyAqLworc3RhdGljIGludCBmdF9vcmRlcmVkKHN0cnVjdCBmdF9jeHQgKmN4dCkKK3sKKwljaGFyICpwID0gKGNoYXIgKiljeHQtPmJwaCArIEhEUl9TSVpFOworCWVudW0gZnRfcmduX2lkIHI7CisKKwlmb3IgKHIgPSBGVF9SU1ZNQVA7IHIgPD0gRlRfU1RSSU5HUzsgKytyKSB7CisJCWlmIChwID4gY3h0LT5yZ25bcl0uc3RhcnQpCisJCQlyZXR1cm4gMDsKKwkJcCA9IGN4dC0+cmduW3JdLnN0YXJ0ICsgY3h0LT5yZ25bcl0uc2l6ZTsKKwl9CisJcmV0dXJuIHAgPD0gKGNoYXIgKiljeHQtPmJwaCArIGN4dC0+bWF4X3NpemU7Cit9CisKKy8qIENvcHkgdGhlIHRyZWUgdG8gYSBuZXdseS1hbGxvY2F0ZWQgcmVnaW9uIGFuZCBwdXQgdGhpbmdzIGluIG9yZGVyICovCitzdGF0aWMgaW50IGZ0X3Jlb3JkZXIoc3RydWN0IGZ0X2N4dCAqY3h0LCBpbnQgbmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgdG90OworCWVudW0gZnRfcmduX2lkIHI7CisJY2hhciAqcCwgKnBlbmQ7CisJaW50IHN0cm9mZjsKKworCXRvdCA9IEhEUl9TSVpFICsgRVhQQU5EX0lOQ1I7CisJZm9yIChyID0gRlRfUlNWTUFQOyByIDw9IEZUX1NUUklOR1M7ICsrcikKKwkJdG90ICs9IGN4dC0+cmduW3JdLnNpemU7CisJaWYgKG5leHRyYSA+IDApCisJCXRvdCArPSBuZXh0cmE7CisJdG90ID0gX0FMSUdOKHRvdCwgOCk7CisKKwlpZiAoIWN4dC0+cmVhbGxvYykKKwkJcmV0dXJuIDA7CisJcCA9IGN4dC0+cmVhbGxvYyhOVUxMLCB0b3QpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkocCwgY3h0LT5icGgsIHNpemVvZihzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIpKTsKKwkvKiBvZmZzZXRzIGdldCBmaXhlZCB1cCBsYXRlciAqLworCisJY3h0LT5icGggPSAoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICopcDsKKwljeHQtPm1heF9zaXplID0gdG90OworCXBlbmQgPSBwICsgdG90OworCXAgKz0gSERSX1NJWkU7CisKKwltZW1jcHkocCwgY3h0LT5yZ25bRlRfUlNWTUFQXS5zdGFydCwgY3h0LT5yZ25bRlRfUlNWTUFQXS5zaXplKTsKKwljeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ID0gcDsKKwlwICs9IGN4dC0+cmduW0ZUX1JTVk1BUF0uc2l6ZTsKKworCW1lbWNweShwLCBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0LCBjeHQtPnJnbltGVF9TVFJVQ1RdLnNpemUpOworCWZ0X25vZGVfdXBkYXRlX2FmdGVyKGN4dCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwKKwkJCXAgLSBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0KTsKKwljeHQtPnAgKz0gcCAtIGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7CisJY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCA9IHA7CisKKwlwID0gcGVuZCAtIGN4dC0+cmduW0ZUX1NUUklOR1NdLnNpemU7CisJbWVtY3B5KHAsIGN4dC0+cmduW0ZUX1NUUklOR1NdLnN0YXJ0LCBjeHQtPnJnbltGVF9TVFJJTkdTXS5zaXplKTsKKwlzdHJvZmYgPSBjeHQtPnN0cl9hbmNob3IgLSBjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydDsKKwljeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydCA9IHA7CisJY3h0LT5zdHJfYW5jaG9yID0gcCArIHN0cm9mZjsKKworCWN4dC0+aXNvcmRlcmVkID0gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpwcmV2X2VuZChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGVudW0gZnRfcmduX2lkIHIpCit7CisJaWYgKHIgPiBGVF9SU1ZNQVApCisJCXJldHVybiBjeHQtPnJnbltyIC0gMV0uc3RhcnQgKyBjeHQtPnJnbltyIC0gMV0uc2l6ZTsKKwlyZXR1cm4gKGNoYXIgKiljeHQtPmJwaCArIEhEUl9TSVpFOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKm5leHRfc3RhcnQoc3RydWN0IGZ0X2N4dCAqY3h0LCBlbnVtIGZ0X3Jnbl9pZCByKQoreworCWlmIChyIDwgRlRfU1RSSU5HUykKKwkJcmV0dXJuIGN4dC0+cmduW3IgKyAxXS5zdGFydDsKKwlyZXR1cm4gKGNoYXIgKiljeHQtPmJwaCArIGN4dC0+bWF4X3NpemU7Cit9CisKKy8qCisgKiBTZWUgaWYgd2UgY2FuIGV4cGFuZCByZWdpb24gcmduIGJ5IG5leHRyYSBieXRlcyBieSB1c2luZyB1cAorICogZnJlZSBzcGFjZSBhZnRlciBvciBiZWZvcmUgdGhlIHJlZ2lvbi4KKyAqLworc3RhdGljIGludCBmdF9zaHVmZmxlKHN0cnVjdCBmdF9jeHQgKmN4dCwgY2hhciAqKnBwLCBlbnVtIGZ0X3Jnbl9pZCByZ24sCisJCWludCBuZXh0cmEpCit7CisJY2hhciAqcCA9ICpwcDsKKwljaGFyICpyZ25fc3RhcnQsICpyZ25fZW5kOworCisJcmduX3N0YXJ0ID0gY3h0LT5yZ25bcmduXS5zdGFydDsKKwlyZ25fZW5kID0gcmduX3N0YXJ0ICsgY3h0LT5yZ25bcmduXS5zaXplOworCWlmIChuZXh0cmEgPD0gMCB8fCByZ25fZW5kICsgbmV4dHJhIDw9IG5leHRfc3RhcnQoY3h0LCByZ24pKSB7CisJCS8qIG1vdmUgZm9sbG93aW5nIHN0dWZmICovCisJCWlmIChwIDwgcmduX2VuZCkgeworCQkJaWYgKG5leHRyYSA8IDApCisJCQkJbWVtbW92ZShwLCBwIC0gbmV4dHJhLCByZ25fZW5kIC0gcCArIG5leHRyYSk7CisJCQllbHNlCisJCQkJbWVtbW92ZShwICsgbmV4dHJhLCBwLCByZ25fZW5kIC0gcCk7CisJCQlpZiAocmduID09IEZUX1NUUlVDVCkKKwkJCQlmdF9ub2RlX3VwZGF0ZV9hZnRlcihjeHQsIHAsIG5leHRyYSk7CisJCX0KKwkJY3h0LT5yZ25bcmduXS5zaXplICs9IG5leHRyYTsKKwkJaWYgKHJnbiA9PSBGVF9TVFJJTkdTKQorCQkJLyogYXNzdW1lcyBzdHJpbmdzIG9ubHkgYWRkZWQgYXQgYmVnaW5uaW5nICovCisJCQljeHQtPnN0cl9hbmNob3IgKz0gbmV4dHJhOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHByZXZfZW5kKGN4dCwgcmduKSA8PSByZ25fc3RhcnQgLSBuZXh0cmEpIHsKKwkJLyogbW92ZSBwcmVjZWRpbmcgc3R1ZmYgKi8KKwkJaWYgKHAgPiByZ25fc3RhcnQpIHsKKwkJCW1lbW1vdmUocmduX3N0YXJ0IC0gbmV4dHJhLCByZ25fc3RhcnQsIHAgLSByZ25fc3RhcnQpOworCQkJaWYgKHJnbiA9PSBGVF9TVFJVQ1QpCisJCQkJZnRfbm9kZV91cGRhdGVfYmVmb3JlKGN4dCwgcCwgLW5leHRyYSk7CisJCX0KKwkJKnAgLT0gbmV4dHJhOworCQljeHQtPnJnbltyZ25dLnN0YXJ0IC09IG5leHRyYTsKKwkJY3h0LT5yZ25bcmduXS5zaXplICs9IG5leHRyYTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0X21ha2Vfc3BhY2Uoc3RydWN0IGZ0X2N4dCAqY3h0LCBjaGFyICoqcHAsIGVudW0gZnRfcmduX2lkIHJnbiwKKwkJCSBpbnQgbmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgc3NpemUsIHRvdDsKKwljaGFyICpzdHIsICpuZXh0OworCWVudW0gZnRfcmduX2lkIHI7CisKKwlpZiAoIWN4dC0+aXNvcmRlcmVkICYmICFmdF9yZW9yZGVyKGN4dCwgbmV4dHJhKSkKKwkJcmV0dXJuIDA7CisJaWYgKGZ0X3NodWZmbGUoY3h0LCBwcCwgcmduLCBuZXh0cmEpKQorCQlyZXR1cm4gMTsKKworCS8qIFNlZSBpZiB0aGVyZSBpcyBzcGFjZSBhZnRlciB0aGUgc3RyaW5ncyBzZWN0aW9uICovCisJc3NpemUgPSBjeHQtPnJnbltGVF9TVFJJTkdTXS5zaXplOworCWlmIChjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydCArIHNzaXplCisJCQk8IChjaGFyICopY3h0LT5icGggKyBjeHQtPm1heF9zaXplKSB7CisJCS8qIG1vdmUgc3RyaW5ncyB1cCBhcyBmYXIgYXMgcG9zc2libGUgKi8KKwkJc3RyID0gKGNoYXIgKiljeHQtPmJwaCArIGN4dC0+bWF4X3NpemUgLSBzc2l6ZTsKKwkJY3h0LT5zdHJfYW5jaG9yICs9IHN0ciAtIGN4dC0+cmduW0ZUX1NUUklOR1NdLnN0YXJ0OworCQltZW1tb3ZlKHN0ciwgY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQsIHNzaXplKTsKKwkJY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQgPSBzdHI7CisJCS8qIGVub3VnaCBzcGFjZSBub3c/ICovCisJCWlmIChyZ24gPj0gRlRfU1RSVUNUICYmIGZ0X3NodWZmbGUoY3h0LCBwcCwgcmduLCBuZXh0cmEpKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogaG93IG11Y2ggdG90YWwgZnJlZSBzcGFjZSBpcyB0aGVyZSBmb2xsb3dpbmcgdGhpcyByZWdpb24/ICovCisJdG90ID0gMDsKKwlmb3IgKHIgPSByZ247IHIgPCBGVF9TVFJJTkdTOyArK3IpIHsKKwkJY2hhciAqcl9lbmQgPSBjeHQtPnJnbltyXS5zdGFydCArIGN4dC0+cmduW3JdLnNpemU7CisJCXRvdCArPSBuZXh0X3N0YXJ0KGN4dCwgcmduKSAtIHJfZW5kOworCX0KKworCS8qIGNhc3QgaXMgdG8gc2h1dCBnY2MgdXA7IHdlIGtub3cgbmV4dHJhID49IDAgKi8KKwlpZiAodG90IDwgKHVuc2lnbmVkIGludCluZXh0cmEpIHsKKwkJLyogaGF2ZSB0byByZWFsbG9jYXRlICovCisJCWNoYXIgKm5ld3AsICpuZXdfc3RhcnQ7CisJCWludCBzaGlmdDsKKworCQlpZiAoIWN4dC0+cmVhbGxvYykKKwkJCXJldHVybiAwOworCQlzaXplID0gX0FMSUdOKGN4dC0+bWF4X3NpemUgKyAobmV4dHJhIC0gdG90KSArIEVYUEFORF9JTkNSLCA4KTsKKwkJbmV3cCA9IGN4dC0+cmVhbGxvYyhjeHQtPmJwaCwgc2l6ZSk7CisJCWlmICghbmV3cCkKKwkJCXJldHVybiAwOworCQljeHQtPm1heF9zaXplID0gc2l6ZTsKKwkJc2hpZnQgPSBuZXdwIC0gKGNoYXIgKiljeHQtPmJwaDsKKworCQlpZiAoc2hpZnQpIHsgLyogcmVhbGxvYyBjYW4gcmV0dXJuIHNhbWUgYWRkciAqLworCQkJY3h0LT5icGggPSAoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICopbmV3cDsKKwkJCWZ0X25vZGVfdXBkYXRlX2FmdGVyKGN4dCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwKKwkJCQkJc2hpZnQpOworCQkJZm9yIChyID0gRlRfUlNWTUFQOyByIDw9IEZUX1NUUklOR1M7ICsrcikgeworCQkJCW5ld19zdGFydCA9IGN4dC0+cmduW3JdLnN0YXJ0ICsgc2hpZnQ7CisJCQkJY3h0LT5yZ25bcl0uc3RhcnQgPSBuZXdfc3RhcnQ7CisJCQl9CisJCQkqcHAgKz0gc2hpZnQ7CisJCQljeHQtPnN0cl9hbmNob3IgKz0gc2hpZnQ7CisJCX0KKworCQkvKiBtb3ZlIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCAqLworCQlzdHIgPSBuZXdwICsgc2l6ZSAtIHNzaXplOworCQljeHQtPnN0cl9hbmNob3IgKz0gc3RyIC0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQ7CisJCW1lbW1vdmUoc3RyLCBjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydCwgc3NpemUpOworCQljeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydCA9IHN0cjsKKworCQlpZiAoZnRfc2h1ZmZsZShjeHQsIHBwLCByZ24sIG5leHRyYSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBtdXN0IGJlIEZUX1JTVk1BUCBhbmQgd2UgbmVlZCB0byBtb3ZlIEZUX1NUUlVDVCB1cCAqLworCWlmIChyZ24gPT0gRlRfUlNWTUFQKSB7CisJCW5leHQgPSBjeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ICsgY3h0LT5yZ25bRlRfUlNWTUFQXS5zaXplCisJCQkrIG5leHRyYTsKKwkJc3NpemUgPSBjeHQtPnJnbltGVF9TVFJVQ1RdLnNpemU7CisJCWlmIChuZXh0ICsgc3NpemUgPj0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQpCisJCQlyZXR1cm4gMDsJLyogImNhbid0IGhhcHBlbiIgKi8KKwkJbWVtbW92ZShuZXh0LCBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0LCBzc2l6ZSk7CisJCWZ0X25vZGVfdXBkYXRlX2FmdGVyKGN4dCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwgbmV4dHJhKTsKKwkJY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCA9IG5leHQ7CisKKwkJaWYgKGZ0X3NodWZmbGUoY3h0LCBwcCwgcmduLCBuZXh0cmEpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7CQkvKiAiY2FuJ3QgaGFwcGVuIiAqLworfQorCitzdGF0aWMgdm9pZCBmdF9wdXRfd29yZChzdHJ1Y3QgZnRfY3h0ICpjeHQsIHUzMiB2KQoreworCSoodTMyICopIGN4dC0+cCA9IGNwdV90b19iZTMyKHYpOworCWN4dC0+cCArPSA0OworfQorCitzdGF0aWMgdm9pZCBmdF9wdXRfYmluKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHN6KQoreworCXVuc2lnbmVkIGxvbmcgc3phID0gX0FMSUdOKHN6LCA0KTsKKworCS8qIHplcm8gb3V0IHRoZSBhbGlnbm1lbnQgZ2FwIGlmIG5lY2Vzc2FyeSAqLworCWlmIChzeiA8IHN6YSkKKwkJKih1MzIgKikgKGN4dC0+cCArIHN6YSAtIDQpID0gMDsKKworCS8qIGNvcHkgaW4gdGhlIGRhdGEgKi8KKwltZW1jcHkoY3h0LT5wLCBkYXRhLCBzeik7CisKKwljeHQtPnAgKz0gc3phOworfQorCitpbnQgZnRfYmVnaW5fbm9kZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBubGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IDggKyBfQUxJR04obmxlbiwgNCk7CisKKwlpZiAoIWZ0X21ha2Vfc3BhY2UoY3h0LCAmY3h0LT5wLCBGVF9TVFJVQ1QsIGxlbikpCisJCXJldHVybiAtMTsKKwlmdF9wdXRfd29yZChjeHQsIE9GX0RUX0JFR0lOX05PREUpOworCWZ0X3B1dF9iaW4oY3h0LCBuYW1lLCBzdHJsZW4obmFtZSkgKyAxKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmdF9lbmRfbm9kZShzdHJ1Y3QgZnRfY3h0ICpjeHQpCit7CisJZnRfcHV0X3dvcmQoY3h0LCBPRl9EVF9FTkRfTk9ERSk7Cit9CisKK3ZvaWQgZnRfbm9wKHN0cnVjdCBmdF9jeHQgKmN4dCkKK3sKKwlpZiAoZnRfbWFrZV9zcGFjZShjeHQsICZjeHQtPnAsIEZUX1NUUlVDVCwgNCkpCisJCWZ0X3B1dF93b3JkKGN4dCwgT0ZfRFRfTk9QKTsKK30KKworI2RlZmluZSBOT19TVFJJTkcJMHg3ZmZmZmZmZgorCitzdGF0aWMgaW50IGxvb2t1cF9zdHJpbmcoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKnAsICplbmQ7CisKKwlwID0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQ7CisJZW5kID0gcCArIGN4dC0+cmduW0ZUX1NUUklOR1NdLnNpemU7CisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJaWYgKHN0cmNtcChwLCAoY2hhciAqKW5hbWUpID09IDApCisJCQlyZXR1cm4gcCAtIGN4dC0+c3RyX2FuY2hvcjsKKwkJcCArPSBzdHJsZW4ocCkgKyAxOworCX0KKworCXJldHVybiBOT19TVFJJTkc7Cit9CisKKy8qIGxvb2t1cCBzdHJpbmcgYW5kIGluc2VydCBpZiBub3QgZm91bmQgKi8KK3N0YXRpYyBpbnQgbWFwX3N0cmluZyhzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IG9mZjsKKwljaGFyICpwOworCisJb2ZmID0gbG9va3VwX3N0cmluZyhjeHQsIG5hbWUpOworCWlmIChvZmYgIT0gTk9fU1RSSU5HKQorCQlyZXR1cm4gb2ZmOworCXAgPSBjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydDsKKwlpZiAoIWZ0X21ha2Vfc3BhY2UoY3h0LCAmcCwgRlRfU1RSSU5HUywgc3RybGVuKG5hbWUpICsgMSkpCisJCXJldHVybiBOT19TVFJJTkc7CisJc3RyY3B5KHAsIG5hbWUpOworCXJldHVybiBwIC0gY3h0LT5zdHJfYW5jaG9yOworfQorCitpbnQgZnRfcHJvcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmRhdGEsCisJCXVuc2lnbmVkIGludCBzeikKK3sKKwlpbnQgb2ZmLCBsZW47CisKKwlvZmYgPSBsb29rdXBfc3RyaW5nKGN4dCwgbmFtZSk7CisJaWYgKG9mZiA9PSBOT19TVFJJTkcpCisJCXJldHVybiAtMTsKKworCWxlbiA9IDEyICsgX0FMSUdOKHN6LCA0KTsKKwlpZiAoIWZ0X21ha2Vfc3BhY2UoY3h0LCAmY3h0LT5wLCBGVF9TVFJVQ1QsIGxlbikpCisJCXJldHVybiAtMTsKKworCWZ0X3B1dF93b3JkKGN4dCwgT0ZfRFRfUFJPUCk7CisJZnRfcHV0X3dvcmQoY3h0LCBzeik7CisJZnRfcHV0X3dvcmQoY3h0LCBvZmYpOworCWZ0X3B1dF9iaW4oY3h0LCBkYXRhLCBzeik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmdF9wcm9wX3N0cihzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gZnRfcHJvcChjeHQsIG5hbWUsIHN0ciwgc3RybGVuKHN0cikgKyAxKTsKK30KKworaW50IGZ0X3Byb3BfaW50KHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1MzIgdiA9IGNwdV90b19iZTMyKCh1MzIpIHZhbCk7CisKKwlyZXR1cm4gZnRfcHJvcChjeHQsIG5hbWUsICZ2LCA0KTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSByZXNlcnZlZCBtYXAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJzdm1hcF9zaXplKHN0cnVjdCBmdF9jeHQgKmN4dCkKK3sKKwlzdHJ1Y3QgZnRfcmVzZXJ2ZSAqcmVzOworCisJcmVzID0gKHN0cnVjdCBmdF9yZXNlcnZlICopY3h0LT5yZ25bRlRfUlNWTUFQXS5zdGFydDsKKwl3aGlsZSAocmVzLT5zdGFydCB8fCByZXMtPmxlbikKKwkJKytyZXM7CisJcmV0dXJuIChjaGFyICopKHJlcyArIDEpIC0gY3h0LT5yZ25bRlRfUlNWTUFQXS5zdGFydDsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgcmVnaW9uIGJ5IHN0ZXBwaW5nIHRocm91Z2ggaXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0cnVjdF9zaXplKHN0cnVjdCBmdF9jeHQgKmN4dCkKK3sKKwljaGFyICpwID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydDsKKwljaGFyICpuZXh0OworCXN0cnVjdCBmdF9hdG9tIGF0b207CisKKwkvKiBtYWtlIGNoZWNrIGluIGZ0X25leHQgaGFwcHkgKi8KKwlpZiAoY3h0LT5yZ25bRlRfU1RSVUNUXS5zaXplID09IDApCisJCWN4dC0+cmduW0ZUX1NUUlVDVF0uc2l6ZSA9IDB4ZmZmZmZmZmZ1bCAtICh1bnNpZ25lZCBsb25nKXA7CisKKwl3aGlsZSAoKG5leHQgPSBmdF9uZXh0KGN4dCwgcCwgJmF0b20pKSAhPSBOVUxMKQorCQlwID0gbmV4dDsKKwlyZXR1cm4gcCArIDQgLSBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0OworfQorCisvKiBhZGQgYGFkaicgb24gdG8gYWxsIHN0cmluZyBvZmZzZXQgdmFsdWVzIGluIHRoZSBzdHJ1Y3QgYXJlYSAqLworc3RhdGljIHZvaWQgYWRqdXN0X3N0cmluZ19vZmZzZXRzKHN0cnVjdCBmdF9jeHQgKmN4dCwgaW50IGFkaikKK3sKKwljaGFyICpwID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydDsKKwljaGFyICpuZXh0OworCXN0cnVjdCBmdF9hdG9tIGF0b207CisJaW50IG9mZjsKKworCXdoaWxlICgobmV4dCA9IGZ0X25leHQoY3h0LCBwLCAmYXRvbSkpICE9IE5VTEwpIHsKKwkJaWYgKGF0b20udGFnID09IE9GX0RUX1BST1ApIHsKKwkJCW9mZiA9IGJlMzJfdG9fY3B1KCoodTMyICopIChwICsgOCkpOworCQkJKih1MzIgKikgKHAgKyA4KSA9IGNwdV90b19iZTMyKG9mZiArIGFkaik7CisJCX0KKwkJcCA9IG5leHQ7CisJfQorfQorCisvKiBzdGFydCBjb25zdHJ1Y3Rpb24gb2YgdGhlIGZsYXQgT0YgdHJlZSBmcm9tIHNjcmF0Y2ggKi8KK3ZvaWQgZnRfYmVnaW4oc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICpibG9iLCB1bnNpZ25lZCBpbnQgbWF4X3NpemUsCisJCXZvaWQgKigqcmVhbGxvY19mbikgKHZvaWQgKiwgdW5zaWduZWQgbG9uZykpCit7CisJc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpicGggPSBibG9iOworCWNoYXIgKnA7CisJc3RydWN0IGZ0X3Jlc2VydmUgKnByZXM7CisKKwkvKiBjbGVhciB0aGUgY3h0ICovCisJbWVtc2V0KGN4dCwgMCwgc2l6ZW9mKCpjeHQpKTsKKworCWN4dC0+YnBoID0gYnBoOworCWN4dC0+bWF4X3NpemUgPSBtYXhfc2l6ZTsKKwljeHQtPnJlYWxsb2MgPSByZWFsbG9jX2ZuOworCWN4dC0+aXNvcmRlcmVkID0gMTsKKworCS8qIHplcm8gZXZlcnl0aGluZyBpbiB0aGUgaGVhZGVyIGFyZWEgKi8KKwltZW1zZXQoYnBoLCAwLCBzaXplb2YoKmJwaCkpOworCisJYnBoLT5tYWdpYyA9IGNwdV90b19iZTMyKE9GX0RUX0hFQURFUik7CisJYnBoLT52ZXJzaW9uID0gY3B1X3RvX2JlMzIoMHgxMCk7CisJYnBoLT5sYXN0X2NvbXBfdmVyc2lvbiA9IGNwdV90b19iZTMyKDB4MTApOworCisJLyogc3RhcnQgcG9pbnRlcnMgKi8KKwljeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ID0gcCA9IGJsb2IgKyBIRFJfU0laRTsKKwljeHQtPnJnbltGVF9SU1ZNQVBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ0X3Jlc2VydmUpOworCXByZXMgPSAoc3RydWN0IGZ0X3Jlc2VydmUgKilwOworCWN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQgPSBwICs9IHNpemVvZihzdHJ1Y3QgZnRfcmVzZXJ2ZSk7CisJY3h0LT5yZ25bRlRfU1RSVUNUXS5zaXplID0gNDsKKwljeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydCA9IGJsb2IgKyBtYXhfc2l6ZTsKKwljeHQtPnJnbltGVF9TVFJJTkdTXS5zaXplID0gMDsKKworCS8qIGluaXQgcnN2bWFwIGFuZCBzdHJ1Y3QgKi8KKwlwcmVzLT5zdGFydCA9IDA7CisJcHJlcy0+bGVuID0gMDsKKwkqKHUzMiAqKSBwID0gY3B1X3RvX2JlMzIoT0ZfRFRfRU5EKTsKKworCWN4dC0+c3RyX2FuY2hvciA9IGJsb2I7Cit9CisKKy8qIG9wZW4gdXAgYW4gZXhpc3RpbmcgYmxvYiB0byBiZSBleGFtaW5lZCBvciBtb2RpZmllZCAqLworaW50IGZ0X29wZW4oc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICpibG9iLCB1bnNpZ25lZCBpbnQgbWF4X3NpemUsCisJCXVuc2lnbmVkIGludCBtYXhfZmluZF9kZXZpY2UsCisJCXZvaWQgKigqcmVhbGxvY19mbikgKHZvaWQgKiwgdW5zaWduZWQgbG9uZykpCit7CisJc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpicGggPSBibG9iOworCisJLyogY2FuJ3QgY29wZSB3aXRoIHZlcnNpb24gPCAxNiAqLworCWlmIChiZTMyX3RvX2NwdShicGgtPnZlcnNpb24pIDwgMTYpCisJCXJldHVybiAtMTsKKworCS8qIGNsZWFyIHRoZSBjeHQgKi8KKwltZW1zZXQoY3h0LCAwLCBzaXplb2YoKmN4dCkpOworCisJLyogYWxsb2Mgbm9kZV90YmwgdG8gdHJhY2sgbm9kZSBwdHJzIHJldHVybmVkIGJ5IGZ0X2ZpbmRfZGV2aWNlICovCisJKyttYXhfZmluZF9kZXZpY2U7CisJY3h0LT5ub2RlX3RibCA9IHJlYWxsb2NfZm4oTlVMTCwgbWF4X2ZpbmRfZGV2aWNlICogc2l6ZW9mKGNoYXIgKikpOworCWlmICghY3h0LT5ub2RlX3RibCkKKwkJcmV0dXJuIC0xOworCW1lbXNldChjeHQtPm5vZGVfdGJsLCAwLCBtYXhfZmluZF9kZXZpY2UgKiBzaXplb2YoY2hhciAqKSk7CisJY3h0LT5ub2RlX21heCA9IG1heF9maW5kX2RldmljZTsKKwljeHQtPm5vZGVzX3VzZWQgPSAxOwkvKiBkb24ndCB1c2UgaWR4IDAgYi9jIGxvb2tzIGxpa2UgTlVMTCAqLworCisJY3h0LT5icGggPSBicGg7CisJY3h0LT5tYXhfc2l6ZSA9IG1heF9zaXplOworCWN4dC0+cmVhbGxvYyA9IHJlYWxsb2NfZm47CisKKwljeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ID0gYmxvYiArIGJlMzJfdG9fY3B1KGJwaC0+b2ZmX21lbV9yc3ZtYXApOworCWN4dC0+cmduW0ZUX1JTVk1BUF0uc2l6ZSA9IHJzdm1hcF9zaXplKGN4dCk7CisJY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCA9IGJsb2IgKyBiZTMyX3RvX2NwdShicGgtPm9mZl9kdF9zdHJ1Y3QpOworCWN4dC0+cmduW0ZUX1NUUlVDVF0uc2l6ZSA9IHN0cnVjdF9zaXplKGN4dCk7CisJY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQgPSBibG9iICsgYmUzMl90b19jcHUoYnBoLT5vZmZfZHRfc3RyaW5ncyk7CisJY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZSA9IGJlMzJfdG9fY3B1KGJwaC0+ZHRfc3RyaW5nc19zaXplKTsKKwkvKiBMZWF2ZSBhcyAnMCcgdG8gZm9yY2UgZmlyc3QgZnRfbWFrZV9zcGFjZSBjYWxsIHRvIGRvIGEgZnRfcmVvcmRlcgorCSAqIGFuZCBtb3ZlIGR0IHRvIGFuIGFyZWEgYWxsb2NhdGVkIGJ5IHJlYWxsb2MuCisJY3h0LT5pc29yZGVyZWQgPSBmdF9vcmRlcmVkKGN4dCk7CisJKi8KKworCWN4dC0+cCA9IGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7CisJY3h0LT5zdHJfYW5jaG9yID0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWRkIGEgcmVzZXJ2ZXIgcGh5c2ljYWwgYXJlYSB0byB0aGUgcnN2bWFwICovCitpbnQgZnRfYWRkX3Jzdm1hcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIHU2NCBwaHlzYWRkciwgdTY0IHNpemUpCit7CisJY2hhciAqcDsKKwlzdHJ1Y3QgZnRfcmVzZXJ2ZSAqcHJlczsKKworCXAgPSBjeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ICsgY3h0LT5yZ25bRlRfUlNWTUFQXS5zaXplCisJCS0gc2l6ZW9mKHN0cnVjdCBmdF9yZXNlcnZlKTsKKwlpZiAoIWZ0X21ha2Vfc3BhY2UoY3h0LCAmcCwgRlRfUlNWTUFQLCBzaXplb2Yoc3RydWN0IGZ0X3Jlc2VydmUpKSkKKwkJcmV0dXJuIC0xOworCisJcHJlcyA9IChzdHJ1Y3QgZnRfcmVzZXJ2ZSAqKXA7CisJcHJlcy0+c3RhcnQgPSBjcHVfdG9fYmU2NChwaHlzYWRkcik7CisJcHJlcy0+bGVuID0gY3B1X3RvX2JlNjQoc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmdF9iZWdpbl90cmVlKHN0cnVjdCBmdF9jeHQgKmN4dCkKK3sKKwljeHQtPnAgPSBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0OworfQorCit2b2lkIGZ0X2VuZF90cmVlKHN0cnVjdCBmdF9jeHQgKmN4dCkKK3sKKwlzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJwaCA9IGN4dC0+YnBoOworCWNoYXIgKnAsICpvbGRzdHIsICpzdHIsICplbmRwOworCXVuc2lnbmVkIGxvbmcgc3NpemU7CisJaW50IGFkajsKKworCWlmICghY3h0LT5pc29yZGVyZWQpCisJCXJldHVybjsJCS8qIHdlIGhhdmVuJ3QgdG91Y2hlZCBhbnl0aGluZyAqLworCisJLyogYWRqdXN0IHN0cmluZyBvZmZzZXRzICovCisJb2xkc3RyID0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQ7CisJYWRqID0gY3h0LT5zdHJfYW5jaG9yIC0gb2xkc3RyOworCWlmIChhZGopCisJCWFkanVzdF9zdHJpbmdfb2Zmc2V0cyhjeHQsIGFkaik7CisKKwkvKiBtYWtlIHN0cmluZ3MgZW5kIG9uIDgtYnl0ZSBib3VuZGFyeSAqLworCXNzaXplID0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZTsKKwllbmRwID0gKGNoYXIgKilfQUxJR04oKHVuc2lnbmVkIGxvbmcpY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydAorCQkJKyBjeHQtPnJnbltGVF9TVFJVQ1RdLnNpemUgKyBzc2l6ZSwgOCk7CisJc3RyID0gZW5kcCAtIHNzaXplOworCisJLyogbW92ZSBzdHJpbmdzIGRvd24gdG8gZW5kIG9mIHN0cnVjdHMgKi8KKwltZW1tb3ZlKHN0ciwgb2xkc3RyLCBzc2l6ZSk7CisJY3h0LT5zdHJfYW5jaG9yID0gc3RyOworCWN4dC0+cmduW0ZUX1NUUklOR1NdLnN0YXJ0ID0gc3RyOworCisJLyogZmlsbCBpbiBoZWFkZXIgZmllbGRzICovCisJcCA9IChjaGFyICopYnBoOworCWJwaC0+dG90YWxzaXplID0gY3B1X3RvX2JlMzIoZW5kcCAtIHApOworCWJwaC0+b2ZmX21lbV9yc3ZtYXAgPSBjcHVfdG9fYmUzMihjeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0IC0gcCk7CisJYnBoLT5vZmZfZHRfc3RydWN0ID0gY3B1X3RvX2JlMzIoY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCAtIHApOworCWJwaC0+b2ZmX2R0X3N0cmluZ3MgPSBjcHVfdG9fYmUzMihjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydCAtIHApOworCWJwaC0+ZHRfc3RyaW5nc19zaXplID0gY3B1X3RvX2JlMzIoc3NpemUpOworfQorCit2b2lkICpmdF9maW5kX2RldmljZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKnNyY2hfcGF0aCkKK3sKKwljaGFyICpub2RlOworCisJLyogcmVxdWlyZSBhYnNvbHV0ZSBwYXRoICovCisJaWYgKHNyY2hfcGF0aFswXSAhPSAnLycpCisJCXJldHVybiBOVUxMOworCW5vZGUgPSBmdF9maW5kX2Rlc2NlbmRlbnQoY3h0LCBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0LCBzcmNoX3BhdGgpOworCXJldHVybiBmdF9ub2RlX2FkZChjeHQsIG5vZGUpOworfQorCit2b2lkICpmdF9maW5kX2Rlc2NlbmRlbnQoc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICp0b3AsIGNvbnN0IGNoYXIgKnNyY2hfcGF0aCkKK3sKKwlzdHJ1Y3QgZnRfYXRvbSBhdG9tOworCWNoYXIgKnA7CisJY29uc3QgY2hhciAqY3AsICpxOworCWludCBjbDsKKwlpbnQgZGVwdGggPSAtMTsKKwlpbnQgZG1hdGNoID0gMDsKKwljb25zdCBjaGFyICpwYXRoX2NvbXBbRlRfTUFYX0RFUFRIXTsKKworCWNwID0gc3JjaF9wYXRoOworCWNsID0gMDsKKwlwID0gdG9wOworCisJd2hpbGUgKChwID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGF0b20udGFnKSB7CisJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKKwkJCSsrZGVwdGg7CisJCQlpZiAoZGVwdGggIT0gZG1hdGNoKQorCQkJCWJyZWFrOworCQkJY3h0LT5nZW5lYWxvZ3lbZGVwdGhdID0gYXRvbS5kYXRhOworCQkJY3h0LT5nZW5lYWxvZ3lbZGVwdGggKyAxXSA9IE5VTEw7CisJCQlpZiAoZGVwdGggJiYgIShzdHJuY21wKGF0b20ubmFtZSwgY3AsIGNsKSA9PSAwCisJCQkJCSYmIChhdG9tLm5hbWVbY2xdID09ICcvJworCQkJCQkJfHwgYXRvbS5uYW1lW2NsXSA9PSAnXDAnCisJCQkJCQl8fCBhdG9tLm5hbWVbY2xdID09ICdAJykpKQorCQkJCWJyZWFrOworCQkJcGF0aF9jb21wW2RtYXRjaF0gPSBjcDsKKwkJCS8qIGl0IG1hdGNoZXMgc28gZmFyLCBhZHZhbmNlIHRvIG5leHQgcGF0aCBjb21wb25lbnQgKi8KKwkJCWNwICs9IGNsOworCQkJLyogc2tpcCBzbGFzaGVzICovCisJCQl3aGlsZSAoKmNwID09ICcvJykKKwkJCQkrK2NwOworCQkJLyogd2UncmUgZG9uZSBpZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworCQkJaWYgKCpjcCA9PSAwKQorCQkJCXJldHVybiBhdG9tLmRhdGE7CisJCQkvKiBsb29rIGZvciBlbmQgb2YgdGhpcyBjb21wb25lbnQgKi8KKwkJCXEgPSBzdHJjaHIoY3AsICcvJyk7CisJCQlpZiAocSkKKwkJCQljbCA9IHEgLSBjcDsKKwkJCWVsc2UKKwkJCQljbCA9IHN0cmxlbihjcCk7CisJCQkrK2RtYXRjaDsKKwkJCWJyZWFrOworCQljYXNlIE9GX0RUX0VORF9OT0RFOgorCQkJaWYgKGRlcHRoID09IDApCisJCQkJcmV0dXJuIE5VTEw7CisJCQlpZiAoZG1hdGNoID4gZGVwdGgpIHsKKwkJCQktLWRtYXRjaDsKKwkJCQljbCA9IGNwIC0gcGF0aF9jb21wW2RtYXRjaF0gLSAxOworCQkJCWNwID0gcGF0aF9jb21wW2RtYXRjaF07CisJCQkJd2hpbGUgKGNsID4gMCAmJiBjcFtjbCAtIDFdID09ICcvJykKKwkJCQkJLS1jbDsKKwkJCX0KKwkJCS0tZGVwdGg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCAqZnRfZ2V0X3BhcmVudChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBoYW5kbGUpCit7CisJdm9pZCAqbm9kZTsKKwlpbnQgZDsKKwlzdHJ1Y3QgZnRfYXRvbSBhdG9tOworCWNoYXIgKnA7CisKKwlub2RlID0gZnRfbm9kZV9waDJub2RlKGN4dCwgcGhhbmRsZSk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGQgPSAwOyBjeHQtPmdlbmVhbG9neVtkXSAhPSBOVUxMOyArK2QpCisJCWlmIChjeHQtPmdlbmVhbG9neVtkXSA9PSBub2RlKQorCQkJcmV0dXJuIGN4dC0+Z2VuZWFsb2d5W2QgPiAwID8gZCAtIDEgOiAwXTsKKworCS8qIGhhdmUgdG8gZG8gaXQgdGhlIGhhcmQgd2F5Li4uICovCisJcCA9IGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7CisJZCA9IDA7CisJd2hpbGUgKChwID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGF0b20udGFnKSB7CisJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKKwkJCWN4dC0+Z2VuZWFsb2d5W2RdID0gYXRvbS5kYXRhOworCQkJaWYgKG5vZGUgPT0gYXRvbS5kYXRhKSB7CisJCQkJLyogZm91bmQgaXQgKi8KKwkJCQljeHQtPmdlbmVhbG9neVtkICsgMV0gPSBOVUxMOworCQkJCXJldHVybiBkID4gMCA/IGN4dC0+Z2VuZWFsb2d5W2QgLSAxXSA6IG5vZGU7CisJCQl9CisJCQkrK2Q7CisJCQlicmVhazsKKwkJY2FzZSBPRl9EVF9FTkRfTk9ERToKKwkJCS0tZDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgZnRfZ2V0X3Byb3Aoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJdm9pZCAqYnVmLCBjb25zdCB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBmdF9hdG9tIGF0b207CisJdm9pZCAqbm9kZTsKKwljaGFyICpwOworCWludCBkZXB0aDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCW5vZGUgPSBmdF9ub2RlX3BoMm5vZGUoY3h0LCBwaGFuZGxlKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlkZXB0aCA9IDA7CisJcCA9IChjaGFyICopbm9kZTsKKworCXdoaWxlICgocCA9IGZ0X25leHQoY3h0LCBwLCAmYXRvbSkpICE9IE5VTEwpIHsKKwkJc3dpdGNoIChhdG9tLnRhZykgeworCQljYXNlIE9GX0RUX0JFR0lOX05PREU6CisJCQkrK2RlcHRoOworCQkJYnJlYWs7CisJCWNhc2UgT0ZfRFRfUFJPUDoKKwkJCWlmICgoZGVwdGggIT0gMSkgfHwgc3RyY21wKGF0b20ubmFtZSwgcHJvcG5hbWUpKQorCQkJCWJyZWFrOworCQkJc2l6ZSA9IG1pbihhdG9tLnNpemUsIGJ1Zmxlbik7CisJCQltZW1jcHkoYnVmLCBhdG9tLmRhdGEsIHNpemUpOworCQkJcmV0dXJuIGF0b20uc2l6ZTsKKwkJY2FzZSBPRl9EVF9FTkRfTk9ERToKKwkJCWlmICgtLWRlcHRoIDw9IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworaW50IGZ0X3NldF9wcm9wKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCWNvbnN0IHZvaWQgKmJ1ZiwgY29uc3QgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgZnRfYXRvbSBhdG9tOworCXZvaWQgKm5vZGU7CisJY2hhciAqcCwgKm5leHQ7CisJaW50IG5leHRyYSwgZGVwdGg7CisKKwlub2RlID0gZnRfbm9kZV9waDJub2RlKGN4dCwgcGhhbmRsZSk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZGVwdGggPSAwOworCXAgPSBub2RlOworCisJd2hpbGUgKChuZXh0ID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGF0b20udGFnKSB7CisJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKKwkJCSsrZGVwdGg7CisJCQlicmVhazsKKwkJY2FzZSBPRl9EVF9FTkRfTk9ERToKKwkJCWlmICgtLWRlcHRoID4gMCkKKwkJCQlicmVhazsKKwkJCS8qIGhhdmVuJ3QgZm91bmQgdGhlIHByb3BlcnR5LCBpbnNlcnQgaGVyZSAqLworCQkJY3h0LT5wID0gcDsKKwkJCXJldHVybiBmdF9wcm9wKGN4dCwgcHJvcG5hbWUsIGJ1ZiwgYnVmbGVuKTsKKwkJY2FzZSBPRl9EVF9QUk9QOgorCQkJaWYgKChkZXB0aCAhPSAxKSB8fCBzdHJjbXAoYXRvbS5uYW1lLCBwcm9wbmFtZSkpCisJCQkJYnJlYWs7CisJCQkvKiBmb3VuZCBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3ZlcndyaXRlIGl0ICovCisJCQluZXh0cmEgPSBfQUxJR04oYnVmbGVuLCA0KSAtIF9BTElHTihhdG9tLnNpemUsIDQpOworCQkJY3h0LT5wID0gYXRvbS5kYXRhOworCQkJaWYgKG5leHRyYSAmJiAhZnRfbWFrZV9zcGFjZShjeHQsICZjeHQtPnAsIEZUX1NUUlVDVCwKKwkJCQkJCW5leHRyYSkpCisJCQkJcmV0dXJuIC0xOworCQkJKih1MzIgKikgKGN4dC0+cCAtIDgpID0gY3B1X3RvX2JlMzIoYnVmbGVuKTsKKwkJCWZ0X3B1dF9iaW4oY3h0LCBidWYsIGJ1Zmxlbik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwID0gbmV4dDsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgZnRfZGVsX3Byb3Aoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlzdHJ1Y3QgZnRfYXRvbSBhdG9tOworCXZvaWQgKm5vZGU7CisJY2hhciAqcCwgKm5leHQ7CisJaW50IHNpemU7CisKKwlub2RlID0gZnRfbm9kZV9waDJub2RlKGN4dCwgcGhhbmRsZSk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcCA9IG5vZGU7CisJd2hpbGUgKChuZXh0ID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGF0b20udGFnKSB7CisJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKKwkJY2FzZSBPRl9EVF9FTkRfTk9ERToKKwkJCXJldHVybiAtMTsKKwkJY2FzZSBPRl9EVF9QUk9QOgorCQkJaWYgKHN0cmNtcChhdG9tLm5hbWUsIHByb3BuYW1lKSkKKwkJCQlicmVhazsKKwkJCS8qIGZvdW5kIHRoZSBwcm9wZXJ0eSwgcmVtb3ZlIGl0ICovCisJCQlzaXplID0gMTIgKyAtX0FMSUdOKGF0b20uc2l6ZSwgNCk7CisJCQljeHQtPnAgPSBwOworCQkJaWYgKCFmdF9tYWtlX3NwYWNlKGN4dCwgJmN4dC0+cCwgRlRfU1RSVUNULCAtc2l6ZSkpCisJCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcCA9IG5leHQ7CisJfQorCXJldHVybiAtMTsKK30KKwordm9pZCAqZnRfY3JlYXRlX25vZGUoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGZ0X2F0b20gYXRvbTsKKwljaGFyICpwLCAqbmV4dDsKKwlpbnQgZGVwdGggPSAwOworCisJcCA9IGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7CisJd2hpbGUgKChuZXh0ID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGF0b20udGFnKSB7CisJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKKwkJCSsrZGVwdGg7CisJCQlpZiAoZGVwdGggPT0gMSAmJiBzdHJjbXAoYXRvbS5uYW1lLCBwYXRoKSA9PSAwKQorCQkJCS8qIGR1cGxpY2F0ZSBub2RlIHBhdGgsIHJldHVybiBlcnJvciAqLworCQkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgT0ZfRFRfRU5EX05PREU6CisJCQktLWRlcHRoOworCQkJaWYgKGRlcHRoID4gMCkKKwkJCQlicmVhazsKKwkJCS8qIGVuZCBvZiBub2RlLCBpbnNlcnQgaGVyZSAqLworCQkJY3h0LT5wID0gcDsKKwkJCWZ0X2JlZ2luX25vZGUoY3h0LCBwYXRoKTsKKwkJCWZ0X2VuZF9ub2RlKGN4dCk7CisJCQlyZXR1cm4gcDsKKwkJfQorCQlwID0gbmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZS5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWUuaAppbmRleCA3NjFjOGRjLi5iOWNkOWY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgRkxBVERFVlRSRUVfSAogI2RlZmluZSBGTEFUREVWVFJFRV9ICiAKLSNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImZsYXRkZXZ0cmVlX2Vudi5oIgogCiAvKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgKi8KICNkZWZpbmUgT0ZfRFRfSEVBREVSICAgICAgICAgICAgMHhkMDBkZmVlZCAgICAgIC8qIG1hcmtlciAqLwpAQCAtNDMsNCArNDMsNjQgQEAKIAl1MzIgZHRfc3RyaW5nc19zaXplOyAgICAvKiBzaXplIG9mIHRoZSBEVCBzdHJpbmdzIGJsb2NrICovCiB9OwogCitzdHJ1Y3QgZnRfcmVzZXJ2ZSB7CisJdTY0IHN0YXJ0OworCXU2NCBsZW47Cit9OworCitzdHJ1Y3QgZnRfcmVnaW9uIHsKKwljaGFyICpzdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9OworCitlbnVtIGZ0X3Jnbl9pZCB7CisJRlRfUlNWTUFQLAorCUZUX1NUUlVDVCwKKwlGVF9TVFJJTkdTLAorCUZUX05fUkVHSU9OCit9OworCisjZGVmaW5lIEZUX01BWF9ERVBUSAk1MAorCitzdHJ1Y3QgZnRfY3h0IHsKKwlzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJwaDsKKwlpbnQgbWF4X3NpemU7ICAgICAgICAgICAvKiBtYXhpbXVtIHNpemUgb2YgdHJlZSAqLworCWludCBpc29yZGVyZWQ7CQkvKiBldmVyeXRoaW5nIGluIHN0YW5kYXJkIG9yZGVyICovCisJdm9pZCAqKCpyZWFsbG9jKSh2b2lkICosIHVuc2lnbmVkIGxvbmcpOworCWNoYXIgKnN0cl9hbmNob3I7CisJY2hhciAqcDsJCS8qIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50IGluIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgZnRfcmVnaW9uIHJnbltGVF9OX1JFR0lPTl07CisJdm9pZCAqZ2VuZWFsb2d5W0ZUX01BWF9ERVBUSCsxXTsKKwljaGFyICoqbm9kZV90Ymw7CisJdW5zaWduZWQgaW50IG5vZGVfbWF4OworCXVuc2lnbmVkIGludCBub2Rlc191c2VkOworfTsKKworaW50IGZ0X2JlZ2luX25vZGUoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgZnRfZW5kX25vZGUoc3RydWN0IGZ0X2N4dCAqY3h0KTsKKwordm9pZCBmdF9iZWdpbl90cmVlKHN0cnVjdCBmdF9jeHQgKmN4dCk7Cit2b2lkIGZ0X2VuZF90cmVlKHN0cnVjdCBmdF9jeHQgKmN4dCk7CisKK3ZvaWQgZnRfbm9wKHN0cnVjdCBmdF9jeHQgKmN4dCk7CitpbnQgZnRfcHJvcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzeik7CitpbnQgZnRfcHJvcF9zdHIoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdHIpOworaW50IGZ0X3Byb3BfaW50KHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIGZ0X2JlZ2luKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqYmxvYiwgdW5zaWduZWQgaW50IG1heF9zaXplLAorCSAgICAgIHZvaWQgKigqcmVhbGxvY19mbikodm9pZCAqLCB1bnNpZ25lZCBsb25nKSk7CitpbnQgZnRfb3BlbihzdHJ1Y3QgZnRfY3h0ICpjeHQsIHZvaWQgKmJsb2IsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSwKKwkJdW5zaWduZWQgaW50IG1heF9maW5kX2RldmljZSwKKwkJdm9pZCAqKCpyZWFsbG9jX2ZuKSh2b2lkICosIHVuc2lnbmVkIGxvbmcpKTsKK2ludCBmdF9hZGRfcnN2bWFwKHN0cnVjdCBmdF9jeHQgKmN4dCwgdTY0IHBoeXNhZGRyLCB1NjQgc2l6ZSk7CisKK3ZvaWQgZnRfZHVtcF9ibG9iKGNvbnN0IHZvaWQgKmJwaHApOwordm9pZCBmdF9tZXJnZV9ibG9iKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqYmxvYik7Cit2b2lkICpmdF9maW5kX2RldmljZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKnNyY2hfcGF0aCk7Cit2b2lkICpmdF9maW5kX2Rlc2NlbmRlbnQoc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICp0b3AsIGNvbnN0IGNoYXIgKnNyY2hfcGF0aCk7CitpbnQgZnRfZ2V0X3Byb3Aoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJdm9pZCAqYnVmLCBjb25zdCB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2ludCBmdF9zZXRfcHJvcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQljb25zdCB2b2lkICpidWYsIGNvbnN0IHVuc2lnbmVkIGludCBidWZsZW4pOworCiAjZW5kaWYgLyogRkxBVERFVlRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWVfZW52LmggYi9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZV9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2JjMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWVfZW52LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBhZGRzIHRoZSBoZWFkZXIgZmlsZSBnbHVlIHNvIHRoYXQgdGhlIHNoYXJlZCBmaWxlcworICogZmxhdGRldmljZXRyZWUuW2NoXSBjYW4gY29tcGlsZSBhbmQgd29yayBpbiB0aGUgcG93ZXJwYyBib290d3JhcHBlci4KKyAqCisgKiBzdHJuY21wICYgc3RyY2hyIGNvcGllZCBmcm9tIDxmaWxlOmxpYi9zdHJpbmdzLmM+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogTWFpbnRhaW5lZCBieTogTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CisgKi8KKyNpZm5kZWYgX1BQQ19CT09UX0ZMQVRERVZUUkVFX0VOVl9IXworI2RlZmluZSBfUFBDX0JPT1RfRkxBVERFVlRSRUVfRU5WX0hfCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAib3BzLmgiCisKKyNkZWZpbmUgYmUxNl90b19jcHUoeCkJCSh4KQorI2RlZmluZSBjcHVfdG9fYmUxNih4KQkJKHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpCQkoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzIoeCkJCSh4KQorI2RlZmluZSBiZTY0X3RvX2NwdSh4KQkJKHgpCisjZGVmaW5lIGNwdV90b19iZTY0KHgpCQkoeCkKKworc3RhdGljIGlubGluZSBpbnQgc3RybmNtcChjb25zdCBjaGFyICpjcywgY29uc3QgY2hhciAqY3QsIHNpemVfdCBjb3VudCkKK3sKKwlzaWduZWQgY2hhciBfX3JlcyA9IDA7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJaWYgKChfX3JlcyA9ICpjcyAtICpjdCsrKSAhPSAwIHx8ICEqY3MrKykKKwkJCWJyZWFrOworCQljb3VudC0tOworCX0KKwlyZXR1cm4gX19yZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqc3RyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCWZvciAoOyAqcyAhPSAoY2hhciljOyArK3MpCisJCWlmICgqcyA9PSAnXDAnKQorCQkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIChjaGFyICopczsKK30KKworI2VuZGlmIC8qIF9QUENfQk9PVF9GTEFUREVWVFJFRV9FTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlX21pc2MuYyBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlX21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGRhMzhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWVfbWlzYy5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBUaGlzIGZpbGUgZG9lcyB0aGUgbmVjZXNzYXJ5IGludGVyZmFjZSBtYXBwaW5nIGJldHdlZW4gdGhlIGJvb3R3cmFwcGVyCisgKiBkZXZpY2UgdHJlZSBvcGVyYXRpb25zIGFuZCB0aGUgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHNoYXJlZCBzb3VyY2UKKyAqIGZpbGVzIGZsYXRkZXZpY2V0cmVlLltjaF0uCisgKgorICogQXV0aG9yOiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA2IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJmbGF0ZGV2dHJlZS5oIgorI2luY2x1ZGUgIm9wcy5oIgorCitzdGF0aWMgc3RydWN0IGZ0X2N4dCBjeHQ7CisKK3N0YXRpYyB2b2lkICpmdF9maW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGZ0X2ZpbmRfZGV2aWNlKCZjeHQsIG5hbWUpOworfQorCitzdGF0aWMgaW50IGZ0X2dldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqcHJvcG5hbWUsIHZvaWQgKmJ1ZiwKKwkJY29uc3QgaW50IGJ1ZmxlbikKK3sKKwlyZXR1cm4gZnRfZ2V0X3Byb3AoJmN4dCwgcGhhbmRsZSwgcHJvcG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KKworc3RhdGljIGludCBmdF9zZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQljb25zdCB2b2lkICpidWYsIGNvbnN0IGludCBidWZsZW4pCit7CisJcmV0dXJuIGZ0X3NldF9wcm9wKCZjeHQsIHBoYW5kbGUsIHByb3BuYW1lLCBidWYsIGJ1Zmxlbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZ0X2ZpbmFsaXplKHZvaWQpCit7CisJZnRfZW5kX3RyZWUoJmN4dCk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWN4dC5icGg7Cit9CisKK2ludCBmdF9pbml0KHZvaWQgKmR0X2Jsb2IsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSwgdW5zaWduZWQgaW50IG1heF9maW5kX2RldmljZSkKK3sKKwlkdF9vcHMuZmluZGRldmljZSA9IGZ0X2ZpbmRkZXZpY2U7CisJZHRfb3BzLmdldHByb3AgPSBmdF9nZXRwcm9wOworCWR0X29wcy5zZXRwcm9wID0gZnRfc2V0cHJvcDsKKwlkdF9vcHMuZmluYWxpemUgPSBmdF9maW5hbGl6ZTsKKworCXJldHVybiBmdF9vcGVuKCZjeHQsIGR0X2Jsb2IsIG1heF9zaXplLCBtYXhfZmluZF9kZXZpY2UsCisJCQlwbGF0Zm9ybV9vcHMucmVhbGxvYyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9pby5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjk3NGVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvaW8uaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9JT19ICisjZGVmaW5lIF9fSU9fSAorLyoKKyAqIExvdy1sZXZlbCBJL08gcm91dGluZXMuCisgKgorICogQ29waWVkIGZyb20gPGZpbGU6aW5jbHVkZS9hc20tcG93ZXJwYy9pby5oPiAod2hpY2ggaGFzIG5vIGNvcHlyaWdodCkKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5fOChjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCWludCByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGJ6JVUxJVgxICUwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKKwkJCSAgICAgOiAiPXIiIChyZXQpIDogIm0iICgqYWRkcikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRfOCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICphZGRyLCBpbnQgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdGIlVTAlWDAgJTEsJTA7IHN5bmMiCisJCQkgICAgIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbl9sZTMyKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkICphZGRyKQoreworCXVuc2lnbmVkIHJldDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsd2JyeCAlMCwwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKKwkJCSAgICAgOiAiPXIiIChyZXQpIDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW5fYmUzMihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCAqYWRkcikKK3sKKwl1bnNpZ25lZCByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibHd6JVUxJVgxICUwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKKwkJCSAgICAgOiAiPXIiIChyZXQpIDogIm0iICgqYWRkcikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRfbGUzMih2b2xhdGlsZSB1bnNpZ25lZCAqYWRkciwgaW50IHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R3YnJ4ICUxLDAsJTI7IHN5bmMiIDogIj1tIiAoKmFkZHIpCisJCQkgICAgIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG91dF9iZTMyKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyLCBpbnQgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHclVTAlWDAgJTEsJTA7IHN5bmMiCisJCQkgICAgIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpKTsKK30KKworI2VuZGlmIC8qIF9JT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKaW5kZXggZDcxOWJiOS4uNmY2YjUwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwpAQCAtMjcsNiArMjcsOCBAQAogZXh0ZXJuIGNoYXIgX3ZtbGludXhfZW5kW107CiBleHRlcm4gY2hhciBfaW5pdHJkX3N0YXJ0W107CiBleHRlcm4gY2hhciBfaW5pdHJkX2VuZFtdOworZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdOworZXh0ZXJuIGNoYXIgX2R0Yl9lbmRbXTsKIAogc3RydWN0IGFkZHJfcmFuZ2UgewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTE2Nyw3ICsxNjksNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBwcmVwX2tlcm5lbCh1bnNpZ25lZCBsb25nICphMSwgdW5zaWduZWQgbG9uZyAqYTIpCitzdGF0aWMgdm9pZCBwcmVwX2tlcm5lbCh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyKQogewogCWludCBsZW47CiAKQEAgLTIwMywxMSArMjA1LDE0IEBACiAJfQogCiAJLyoKLQkgKiBOb3cgd2UgdHJ5IHRvIGFsbG9jIG1lbW9yeSBmb3IgdGhlIGluaXRyZCAoYW5kIGNvcHkgaXQgdGhlcmUpCisJICogTm93IGZpbmQgdGhlIGluaXRyZAorCSAqCisJICogRmlyc3Qgc2VlIGlmIHdlIGhhdmUgYW4gaW1hZ2UgYXR0YWNoZWQgdG8gdXMuICBJZiBzbworCSAqIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgYW5kIGNvcHkgaXQgdGhlcmUuCiAJICovCiAJaW5pdHJkLnNpemUgPSAodW5zaWduZWQgbG9uZykoX2luaXRyZF9lbmQgLSBfaW5pdHJkX3N0YXJ0KTsKIAlpbml0cmQubWVtc2l6ZSA9IGluaXRyZC5zaXplOwotCWlmICggaW5pdHJkLnNpemUgPiAwICkgeworCWlmIChpbml0cmQuc2l6ZSA+IDApIHsKIAkJcHJpbnRmKCJBbGxvY2F0aW5nIDB4JWx4IGJ5dGVzIGZvciBpbml0cmQgLi4uXG5cciIsCiAJCSAgICAgICBpbml0cmQuc2l6ZSk7CiAJCWluaXRyZC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKCh1MzIpaW5pdHJkLnNpemUpOwpAQCAtMjE2LDggKzIyMSw2IEBACiAJCQkJCSJyYW1kaXNrICFcblxyIik7CiAJCQlleGl0KCk7CiAJCX0KLQkJKmExID0gaW5pdHJkLmFkZHI7Ci0JCSphMiA9IGluaXRyZC5zaXplOwogCQlwcmludGYoImluaXRpYWwgcmFtZGlzayBtb3ZpbmcgMHglbHggPC0gMHglbHggIgogCQkJIigweCVseCBieXRlcylcblxyIiwgaW5pdHJkLmFkZHIsCiAJCQkodW5zaWduZWQgbG9uZylfaW5pdHJkX3N0YXJ0LCBpbml0cmQuc2l6ZSk7CkBAIC0yMjUsNiArMjI4LDEyIEBACiAJCQlpbml0cmQuc2l6ZSk7CiAJCXByaW50ZigiaW5pdHJkIGhlYWQ6IDB4JWx4XG5cciIsCiAJCQkJKigodW5zaWduZWQgbG9uZyAqKWluaXRyZC5hZGRyKSk7CisJfSBlbHNlIGlmIChhMiAhPSAwKSB7CisJCS8qIE90aGVyd2lzZSwgc2VlIGlmIHlhYm9vdCBvciBhbm90aGVyIGxvYWRlciBnYXZlIHVzIGFuIGluaXRyZCAqLworCQlpbml0cmQuYWRkciA9IGExOworCQlpbml0cmQubWVtc2l6ZSA9IGluaXRyZC5zaXplID0gYTI7CisJCXByaW50ZigiVXNpbmcgbG9hZGVyIHN1cHBsaWVkIGluaXRyZCBhdCAweCVseCAoMHglbHggYnl0ZXMpXG5cciIsCisJCSAgICAgICBpbml0cmQuYWRkciwgaW5pdHJkLnNpemUpOwogCX0KIAogCS8qIEV2ZW50dWFsbHkgZ3VuemlwIHRoZSBrZXJuZWwgKi8KQEAgLTI1MCwxMCArMjU5LDYgQEAKIAlmbHVzaF9jYWNoZSgodm9pZCAqKXZtbGludXguYWRkciwgdm1saW51eC5zaXplKTsKIH0KIAotdm9pZCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIGZ0X2luaXQodm9pZCAqZHRfYmxvYikKLXsKLX0KLQogLyogQSBidWZmZXIgdGhhdCBtYXkgYmUgZWRpdGVkIGJ5IHRvb2xzIG9wZXJhdGluZyBvbiBhIHpJbWFnZSBiaW5hcnkgc28gYXMgdG8KICAqIGVkaXQgdGhlIGNvbW1hbmQgbGluZSBwYXNzZWQgdG8gdm1saW51eCAoYnkgc2V0dGluZyAvY2hvc2VuL2Jvb3RhcmdzKS4KICAqIFRoZSBidWZmZXIgaXMgcHV0IGluIGl0J3Mgb3duIHNlY3Rpb24gc28gdGhhdCB0b29scyBtYXkgbG9jYXRlIGl0IGVhc2llci4KQEAgLTI4NSwzNiArMjkwLDIyIEBACiAJCXNldHByb3AoZGV2cCwgImJvb3RhcmdzIiwgYnVmLCBzdHJsZW4oYnVmKSArIDEpOwogfQogCi0vKiBTZWN0aW9uIHdoZXJlIGZ0IGNhbiBiZSB0YWNrZWQgb24gYWZ0ZXIgekltYWdlIGlzIGJ1aWx0ICovCi11bmlvbiBibG9ic3BhY2UgewotCXN0cnVjdCBib290X3BhcmFtX2hlYWRlciBoZHI7Ci0JY2hhciBzcGFjZVs4KjEwMjRdOwotfSBkdF9ibG9iIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCJfX2J1aWx0aW5fZnQiKSkpOwotCiBzdHJ1Y3QgcGxhdGZvcm1fb3BzIHBsYXRmb3JtX29wczsKIHN0cnVjdCBkdF9vcHMgZHRfb3BzOwogc3RydWN0IGNvbnNvbGVfb3BzIGNvbnNvbGVfb3BzOwogCiB2b2lkIHN0YXJ0KHVuc2lnbmVkIGxvbmcgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIHZvaWQgKnByb21wdHIsIHZvaWQgKnNwKQogewotCWludCBoYXZlX2R0ID0gMDsKIAlrZXJuZWxfZW50cnlfdCBrZW50cnk7CiAJY2hhciBjbWRsaW5lW0NPTU1BTkRfTElORV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZ0X2FkZHIgPSAwOwogCiAJbWVtc2V0KF9fYnNzX3N0YXJ0LCAwLCBfZW5kIC0gX19ic3Nfc3RhcnQpOwogCW1lbXNldCgmcGxhdGZvcm1fb3BzLCAwLCBzaXplb2YocGxhdGZvcm1fb3BzKSk7CiAJbWVtc2V0KCZkdF9vcHMsIDAsIHNpemVvZihkdF9vcHMpKTsKIAltZW1zZXQoJmNvbnNvbGVfb3BzLCAwLCBzaXplb2YoY29uc29sZV9vcHMpKTsKIAotCS8qIE92ZXJyaWRlIHRoZSBkdF9vcHMgYW5kIGRldmljZSB0cmVlIGlmIHRoZXJlIHdhcyBhbiBmbGF0IGRldgotCSAqIHRyZWUgYXR0YWNoZWQgdG8gdGhlIHpJbWFnZS4KLQkgKi8KLQlpZiAoZHRfYmxvYi5oZHIubWFnaWMgPT0gT0ZfRFRfSEVBREVSKSB7Ci0JCWhhdmVfZHQgPSAxOwotCQlmdF9pbml0KCZkdF9ibG9iKTsKLQl9Ci0KLQlpZiAocGxhdGZvcm1faW5pdChwcm9tcHRyKSkKKwlpZiAocGxhdGZvcm1faW5pdChwcm9tcHRyLCBfZHRiX3N0YXJ0LCBfZHRiX2VuZCkpCiAJCWV4aXQoKTsKIAlpZiAoY29uc29sZV9vcHMub3BlbiAmJiAoY29uc29sZV9vcHMub3BlbigpIDwgMCkpCiAJCWV4aXQoKTsKQEAgLTMyNCw3ICszMTUsNyBAQAogCXByaW50ZigiXG5ccnpJbWFnZSBzdGFydGluZzogbG9hZGVkIGF0IDB4JXAgKHNwOiAweCVwKVxuXHIiLAogCSAgICAgICBfc3RhcnQsIHNwKTsKIAotCXByZXBfa2VybmVsKCZhMSwgJmEyKTsKKwlwcmVwX2tlcm5lbChhMSwgYTIpOwogCiAJLyogSWYgY21kbGluZSBjYW1lIGZyb20gemltYWdlIHdyYXBwZXIgb3IgaWYgd2UgY2FuIGVkaXQgdGhlIG9uZQogCSAqIGluIHRoZSBkdCwgcHJpbnQgaXQgb3V0IGFuZCBlZGl0IGl0LCBpZiBwb3NzaWJsZS4KQEAgLTMzOCwxNSArMzI5LDIzIEBACiAJCXNldF9jbWRsaW5lKGNtZGxpbmUpOwogCX0KIAorCXByaW50ZigiRmluYWxpemluZyBkZXZpY2UgdHJlZS4uLiIpOworCWlmIChkdF9vcHMuZmluYWxpemUpCisJCWZ0X2FkZHIgPSBkdF9vcHMuZmluYWxpemUoKTsKKwlpZiAoZnRfYWRkcikKKwkJcHJpbnRmKCIgZmxhdCB0cmVlIGF0IDB4JWx4XG5cciIsIGZ0X2FkZHIpOworCWVsc2UKKwkJcHJpbnRmKCIgdXNpbmcgT0YgdHJlZSAocHJvbXB0cj0lcClcblxyIiwgcHJvbXB0cik7CisKIAlpZiAoY29uc29sZV9vcHMuY2xvc2UpCiAJCWNvbnNvbGVfb3BzLmNsb3NlKCk7CiAKIAlrZW50cnkgPSAoa2VybmVsX2VudHJ5X3QpIHZtbGludXguYWRkcjsKLQlpZiAoaGF2ZV9kdCkKLQkJa2VudHJ5KGR0X29wcy5mdF9hZGRyKCksIDAsIE5VTEwpOworCWlmIChmdF9hZGRyKQorCQlrZW50cnkoZnRfYWRkciwgMCwgTlVMTCk7CiAJZWxzZQogCQkvKiBYWFggaW5pdHJkIGFkZHIvc2l6ZSBzaG91bGQgYmUgcGFzc2VkIGluIHByb3BlcnRpZXMgKi8KLQkJa2VudHJ5KGExLCBhMiwgcHJvbXB0cik7CisJCWtlbnRyeShpbml0cmQuYWRkciwgaW5pdHJkLnNpemUsIHByb21wdHIpOwogCiAJLyogY29uc29sZSBjbG9zZWQgc28gcHJpbnRmIGJlbG93IG1heSBub3Qgd29yayAqLwogCXByaW50ZigiRXJyb3I6IExpbnV4IGtlcm5lbCByZXR1cm5lZCB0byB6SW1hZ2UgYm9vdCB3cmFwcGVyIVxuXHIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L21rdHJlZS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWt0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiODkyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L21rdHJlZS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTWFrZXMgYSB0cmVlIGJvb3RhYmxlIGltYWdlIGZvciBJQk0gRXZhbHVhdGlvbiBib2FyZHMuCisgKiBCYXNpY2FsbHksIGp1c3QgdGFrZSBhIHpJbWFnZSwgc2tpcCB0aGUgRUxGIGhlYWRlciwgYW5kIHN0dWZmCisgKiBhIDMyIGJ5dGUgaGVhZGVyIG9uIHRoZSBmcm9udC4KKyAqCisgKiBXZSB1c2UgaHRvbmwsIHdoaWNoIGlzIGEgbmV0d29yayBtYWNybywgdG8gbWFrZSBzdXJlIHdlJ3JlIGRvaW5nCisgKiBUaGUgUmlnaHQgVGhpbmcgb24gYW4gTEUgbWFjaGluZS4gIEl0J3Mgbm9uLW9idmlvdXMsIGJ1dCBpdCBzaG91bGQKKyAqIHdvcmsgb24gYW55dGhpbmcgQlNEJ2lzaC4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2lmZGVmIF9fc3VuX18KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKiBUaGlzIGdldHMgdGFja2VkIG9uIHRoZSBmcm9udCBvZiB0aGUgaW1hZ2UuICBUaGVyZSBhcmUgYWxzbyBhIGZldworICogYnl0ZXMgYWxsb2NhdGVkIGFmdGVyIHRoZSBfc3RhcnQgbGFiZWwgdXNlZCBieSB0aGUgYm9vdCByb20gKHNlZQorICogaGVhZC5TIGZvciBkZXRhaWxzKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYm9vdF9ibG9jayB7CisJdWludDMyX3QgYmJfbWFnaWM7CQkvKiAweDAwNTI1MDRGICovCisJdWludDMyX3QgYmJfZGVzdDsJCS8qIFRhcmdldCBhZGRyZXNzIG9mIHRoZSBpbWFnZSAqLworCXVpbnQzMl90IGJiX251bV81MTJibG9ja3M7CS8qIFNpemUsIHJvdW5kZWQtdXAsIGluIDUxMiBieXRlIGJsa3MgKi8KKwl1aW50MzJfdCBiYl9kZWJ1Z19mbGFnOwkvKiBSdW4gZGVidWdnZXIgb3IgaW1hZ2UgYWZ0ZXIgbG9hZCAqLworCXVpbnQzMl90IGJiX2VudHJ5X3BvaW50OwkvKiBUaGUgaW1hZ2UgYWRkcmVzcyB0byBzdGFydCAqLworCXVpbnQzMl90IGJiX2NoZWNrc3VtOwkvKiAzMiBiaXQgY2hlY2tzdW0gaW5jbHVkaW5nIGhlYWRlciAqLworCXVpbnQzMl90IHJlc2VydmVkWzJdOworfSBib290X2Jsb2NrX3Q7CisKKyNkZWZpbmUgSU1HQkxLCTUxMgorY2hhcgl0bXBidWZbSU1HQkxLXTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQJaW5fZmQsIG91dF9mZDsKKwlpbnQJbmJsa3MsIGk7CisJdWludAlja3N1bSwgKmNwOworCXN0cnVjdAlzdGF0CXN0OworCWJvb3RfYmxvY2tfdAlidDsKKworCWlmIChhcmdjIDwgMykgeworCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyA8ekltYWdlLWZpbGU+IDxib290LWltYWdlPiBbZW50cnktcG9pbnRdXG4iLGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmIChzdGF0KGFyZ3ZbMV0sICZzdCkgPCAwKSB7CisJCXBlcnJvcigic3RhdCIpOworCQlleGl0KDIpOworCX0KKworCW5ibGtzID0gKHN0LnN0X3NpemUgKyBJTUdCTEspIC8gSU1HQkxLOworCisJYnQuYmJfbWFnaWMgPSBodG9ubCgweDAwNTI1MDRGKTsKKworCS8qIElmIHdlIGhhdmUgdGhlIG9wdGlvbmFsIGVudHJ5IHBvaW50IHBhcmFtZXRlciwgdXNlIGl0ICovCisJaWYgKGFyZ2MgPT0gNCkKKwkJYnQuYmJfZGVzdCA9IGJ0LmJiX2VudHJ5X3BvaW50ID0gaHRvbmwoc3RydG91bChhcmd2WzNdLCBOVUxMLCAwKSk7CisJZWxzZQorCQlidC5iYl9kZXN0ID0gYnQuYmJfZW50cnlfcG9pbnQgPSBodG9ubCgweDUwMDAwMCk7CisKKwkvKiBXZSBrbm93IHRoZXNlIGZyb20gdGhlIGxpbmtlciBjb21tYW5kLgorCSAqIC4uLmFuZCB0aGVuIG1vdmUgaXQgdXAgaW50byBtZW1vcnkgYSBsaXR0bGUgbW9yZSBzbyB0aGUKKwkgKiByZWxvY2F0aW9uIGNhbiBoYXBwZW4uCisJICovCisJYnQuYmJfbnVtXzUxMmJsb2NrcyA9IGh0b25sKG5ibGtzKTsKKwlidC5iYl9kZWJ1Z19mbGFnID0gMDsKKworCWJ0LmJiX2NoZWNrc3VtID0gMDsKKworCS8qIFRvIGJlIG5lYXQgYW5kIHRpZHkgOi0pLgorCSovCisJYnQucmVzZXJ2ZWRbMF0gPSAwOworCWJ0LnJlc2VydmVkWzFdID0gMDsKKworCWlmICgoaW5fZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRPTkxZKSkgPCAwKSB7CisJCXBlcnJvcigiekltYWdlIG9wZW4iKTsKKwkJZXhpdCgzKTsKKwl9CisKKwlpZiAoKG91dF9mZCA9IG9wZW4oYXJndlsyXSwgKE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DKSwgMDY2NikpIDwgMCkgeworCQlwZXJyb3IoImJvb3RmaWxlIG9wZW4iKTsKKwkJZXhpdCgzKTsKKwl9CisKKwlja3N1bSA9IDA7CisJY3AgPSAodm9pZCAqKSZidDsKKwlmb3IgKGk9MDsgaTxzaXplb2YoYnQpL3NpemVvZih1aW50KTsgaSsrKQorCQlja3N1bSArPSAqY3ArKzsKKworCS8qIEFzc3VtZSB6SW1hZ2UgaXMgYW4gRUxGIGZpbGUsIGFuZCBza2lwIHRoZSA2NEsgaGVhZGVyLgorCSovCisJaWYgKHJlYWQoaW5fZmQsIHRtcGJ1ZiwgSU1HQkxLKSAhPSBJTUdCTEspIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBpcyB0b28gc21hbGwgdG8gYmUgYW4gRUxGIGltYWdlXG4iLAorCQkJCWFyZ3ZbMV0pOworCQlleGl0KDQpOworCX0KKworCWlmICgoKih1aW50ICopdG1wYnVmKSAhPSBodG9ubCgweDdmNDU0YzQ2KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGlzIG5vdCBhbiBFTEYgaW1hZ2VcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDQpOworCX0KKworCWlmIChsc2Vlayhpbl9mZCwgKDY0ICogMTAyNCksIFNFRUtfU0VUKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBmYWlsZWQgdG8gc2VlayBpbiBFTEYgaW1hZ2VcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDQpOworCX0KKworCW5ibGtzIC09ICg2NCAqIDEwMjQpIC8gSU1HQkxLOworCisJLyogQW5kIGF3YXkgd2UgZ28uLi4uLi4KKwkqLworCWlmICh3cml0ZShvdXRfZmQsICZidCwgc2l6ZW9mKGJ0KSkgIT0gc2l6ZW9mKGJ0KSkgeworCQlwZXJyb3IoImJvb3QtaW1hZ2Ugd3JpdGUiKTsKKwkJZXhpdCg1KTsKKwl9CisKKwl3aGlsZSAobmJsa3MtLSA+IDApIHsKKwkJaWYgKHJlYWQoaW5fZmQsIHRtcGJ1ZiwgSU1HQkxLKSA8IDApIHsKKwkJCXBlcnJvcigiekltYWdlIHJlYWQiKTsKKwkJCWV4aXQoNSk7CisJCX0KKwkJY3AgPSAodWludCAqKXRtcGJ1ZjsKKwkJZm9yIChpPTA7IGk8c2l6ZW9mKHRtcGJ1Zikvc2l6ZW9mKHVpbnQpOyBpKyspCisJCQlja3N1bSArPSAqY3ArKzsKKwkJaWYgKHdyaXRlKG91dF9mZCwgdG1wYnVmLCBzaXplb2YodG1wYnVmKSkgIT0gc2l6ZW9mKHRtcGJ1ZikpIHsKKwkJCXBlcnJvcigiYm9vdC1pbWFnZSB3cml0ZSIpOworCQkJZXhpdCg1KTsKKwkJfQorCX0KKworCS8qIHJld3JpdGUgdGhlIGhlYWRlciB3aXRoIHRoZSBjb21wdXRlZCBjaGVja3N1bS4KKwkqLworCWJ0LmJiX2NoZWNrc3VtID0gaHRvbmwoY2tzdW0pOworCWlmIChsc2VlayhvdXRfZmQsIDAsIFNFRUtfU0VUKSA8IDApIHsKKwkJcGVycm9yKCJyZXdyaXRlIHNlZWsiKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHdyaXRlKG91dF9mZCwgJmJ0LCBzaXplb2YoYnQpKSAhPSBzaXplb2YoYnQpKSB7CisJCXBlcnJvcigiYm9vdC1pbWFnZSByZXdyaXRlIik7CisJCWV4aXQoMSk7CisJfQorCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L25zMTY1NTAuYyBiL2FyY2gvcG93ZXJwYy9ib290L25zMTY1NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZlNzJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbnMxNjU1MC5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiAxNjU1MCBzZXJpYWwgY29uc29sZSBzdXBwb3J0LgorICoKKyAqIE9yaWdpbmFsIGNvcGllZCBmcm9tIDxmaWxlOmFyY2gvcHBjL2Jvb3QvY29tbW9uL25zMTY1NTAuYz4KKyAqICh3aGljaCBoYWQgbm8gY29weXJpZ2h0KQorICogTW9kaWZpY2F0aW9uczogMjAwNiAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIE1vZGlmaWVkIGJ5OiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJpby5oIgorI2luY2x1ZGUgIm9wcy5oIgorCisjZGVmaW5lIFVBUlRfRExMCTAJLyogT3V0OiBEaXZpc29yIExhdGNoIExvdyAqLworI2RlZmluZSBVQVJUX0RMTQkxCS8qIE91dDogRGl2aXNvciBMYXRjaCBIaWdoICovCisjZGVmaW5lIFVBUlRfRkNSCTIJLyogT3V0OiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9MQ1IJMwkvKiBPdXQ6IExpbmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX01DUgk0CS8qIE91dDogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0xTUgk1CS8qIEluOiAgTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9MU1JfVEhSRQkweDIwCS8qIFRyYW5zbWl0LWhvbGQtcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgVUFSVF9MU1JfRFIJMHgwMQkvKiBSZWNlaXZlciBkYXRhIHJlYWR5ICovCisjZGVmaW5lIFVBUlRfTVNSCTYJLyogSW46ICBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9TQ1IJNwkvKiBJL086IFNjcmF0Y2ggUmVnaXN0ZXIgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnJlZ19iYXNlOworc3RhdGljIHUzMiByZWdfc2hpZnQ7CisKK3N0YXRpYyBpbnQgbnMxNjU1MF9vcGVuKHZvaWQpCit7CisJb3V0XzgocmVnX2Jhc2UgKyAoVUFSVF9GQ1IgPDwgcmVnX3NoaWZ0KSwgMHgwNik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5zMTY1NTBfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCit7CisJd2hpbGUgKChpbl84KHJlZ19iYXNlICsgKFVBUlRfTFNSIDw8IHJlZ19zaGlmdCkpICYgVUFSVF9MU1JfVEhSRSkgPT0gMCk7CisJb3V0XzgocmVnX2Jhc2UsIGMpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBuczE2NTUwX2dldGModm9pZCkKK3sKKwl3aGlsZSAoKGluXzgocmVnX2Jhc2UgKyAoVUFSVF9MU1IgPDwgcmVnX3NoaWZ0KSkgJiBVQVJUX0xTUl9EUikgPT0gMCk7CisJcmV0dXJuIGluXzgocmVnX2Jhc2UpOworfQorCitzdGF0aWMgdTggbnMxNjU1MF90c3RjKHZvaWQpCit7CisJcmV0dXJuICgoaW5fOChyZWdfYmFzZSArIChVQVJUX0xTUiA8PCByZWdfc2hpZnQpKSAmIFVBUlRfTFNSX0RSKSAhPSAwKTsKK30KKworaW50IG5zMTY1NTBfY29uc29sZV9pbml0KHZvaWQgKmRldnAsIHN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhICpzY2RwKQoreworCWludCBuOworCisJbiA9IGdldHByb3AoZGV2cCwgInZpcnR1YWwtcmVnIiwgJnJlZ19iYXNlLCBzaXplb2YocmVnX2Jhc2UpKTsKKwlpZiAobiAhPSBzaXplb2YocmVnX2Jhc2UpKQorCQlyZXR1cm4gLTE7CisKKwluID0gZ2V0cHJvcChkZXZwLCAicmVnLXNoaWZ0IiwgJnJlZ19zaGlmdCwgc2l6ZW9mKHJlZ19zaGlmdCkpOworCWlmIChuICE9IHNpemVvZihyZWdfc2hpZnQpKQorCQlyZWdfc2hpZnQgPSAwOworCisJc2NkcC0+b3BlbiA9IG5zMTY1NTBfb3BlbjsKKwlzY2RwLT5wdXRjID0gbnMxNjU1MF9wdXRjOworCXNjZHAtPmdldGMgPSBuczE2NTUwX2dldGM7CisJc2NkcC0+dHN0YyA9IG5zMTY1NTBfdHN0YzsKKwlzY2RwLT5jbG9zZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29mLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCmluZGV4IDNhNzE4NDUuLjAxODJmMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29mLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYwpAQCAtMjU2LDI0ICsyNTYsMTggQEAKIAljYWxsX3Byb20oIndyaXRlIiwgMywgMSwgb2Zfc3Rkb3V0X2hhbmRsZSwgYnVmLCBsZW4pOwogfQogCi1pbnQgcGxhdGZvcm1faW5pdCh2b2lkICpwcm9tcHRyKQoraW50IHBsYXRmb3JtX2luaXQodm9pZCAqcHJvbXB0ciwgY2hhciAqZHRfYmxvYl9zdGFydCwgY2hhciAqZHRfYmxvYl9lbmQpCiB7Ci0JcGxhdGZvcm1fb3BzLmZpeHVwcyA9IE5VTEw7CiAJcGxhdGZvcm1fb3BzLmltYWdlX2hkciA9IG9mX2ltYWdlX2hkcjsKIAlwbGF0Zm9ybV9vcHMubWFsbG9jID0gb2ZfdHJ5X2NsYWltOwotCXBsYXRmb3JtX29wcy5mcmVlID0gTlVMTDsKIAlwbGF0Zm9ybV9vcHMuZXhpdCA9IG9mX2V4aXQ7CiAKIAlkdF9vcHMuZmluZGRldmljZSA9IG9mX2ZpbmRkZXZpY2U7CiAJZHRfb3BzLmdldHByb3AgPSBvZl9nZXRwcm9wOwogCWR0X29wcy5zZXRwcm9wID0gb2Zfc2V0cHJvcDsKLQlkdF9vcHMudHJhbnNsYXRlX2FkZHIgPSBOVUxMOwogCiAJY29uc29sZV9vcHMub3BlbiA9IG9mX2NvbnNvbGVfb3BlbjsKIAljb25zb2xlX29wcy53cml0ZSA9IG9mX2NvbnNvbGVfd3JpdGU7Ci0JY29uc29sZV9vcHMuZWRpdF9jbWRsaW5lID0gTlVMTDsKLQljb25zb2xlX29wcy5jbG9zZSA9IE5VTEw7Ci0JY29uc29sZV9vcHMuZGF0YSA9IE5VTEw7CiAKIAlwcm9tID0gKGludCAoKikodm9pZCAqKSlwcm9tcHRyOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaAppbmRleCAxMzVlYjRiLi44YWJiNjUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaApAQCAtMjIsNyArMjIsOCBAQAogCXZvaWQJKCpmaXh1cHMpKHZvaWQpOwogCXZvaWQJKCppbWFnZV9oZHIpKGNvbnN0IHZvaWQgKik7CiAJdm9pZCAqCSgqbWFsbG9jKSh1MzIgc2l6ZSk7Ci0Jdm9pZAkoKmZyZWUpKHZvaWQgKnB0ciwgdTMyIHNpemUpOworCXZvaWQJKCpmcmVlKSh2b2lkICpwdHIpOworCXZvaWQgKgkoKnJlYWxsb2MpKHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAl2b2lkCSgqZXhpdCkodm9pZCk7CiB9OwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9vcHMgcGxhdGZvcm1fb3BzOwpAQCAtMzAsMTMgKzMxLDExIEBACiAvKiBEZXZpY2UgVHJlZSBvcGVyYXRpb25zICovCiBzdHJ1Y3QgZHRfb3BzIHsKIAl2b2lkICoJKCpmaW5kZGV2aWNlKShjb25zdCBjaGFyICpuYW1lKTsKLQlpbnQJKCpnZXRwcm9wKShjb25zdCB2b2lkICpub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJaW50CSgqZ2V0cHJvcCkoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmLAogCQkJY29uc3QgaW50IGJ1Zmxlbik7Ci0JaW50CSgqc2V0cHJvcCkoY29uc3Qgdm9pZCAqbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwlpbnQJKCpzZXRwcm9wKShjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLAogCQkJY29uc3Qgdm9pZCAqYnVmLCBjb25zdCBpbnQgYnVmbGVuKTsKLQl1NjQJKCp0cmFuc2xhdGVfYWRkcikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdTMyICppbl9hZGRyLAotCQkJY29uc3QgdTMyIGFkZHJfbGVuKTsKLQl1bnNpZ25lZCBsb25nICgqZnRfYWRkcikodm9pZCk7CisJdW5zaWduZWQgbG9uZyAoKmZpbmFsaXplKSh2b2lkKTsKIH07CiBleHRlcm4gc3RydWN0IGR0X29wcyBkdF9vcHM7CiAKQEAgLTU5LDEwICs1OCwxMyBAQAogCXZvaWQJCSgqY2xvc2UpKHZvaWQpOwogfTsKIAotZXh0ZXJuIGludCBwbGF0Zm9ybV9pbml0KHZvaWQgKnByb21wdHIpOwotZXh0ZXJuIHZvaWQgc2ltcGxlX2FsbG9jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBmdF9pbml0KHZvaWQgKmR0X2Jsb2IpOwotZXh0ZXJuIGludCBzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpOworaW50IHBsYXRmb3JtX2luaXQodm9pZCAqcHJvbXB0ciwgY2hhciAqZHRfYmxvYl9zdGFydCwgY2hhciAqZHRfYmxvYl9lbmQpOworaW50IGZ0X2luaXQodm9pZCAqZHRfYmxvYiwgdW5zaWduZWQgaW50IG1heF9zaXplLCB1bnNpZ25lZCBpbnQgbWF4X2ZpbmRfZGV2aWNlKTsKK2ludCBzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpOworaW50IG5zMTY1NTBfY29uc29sZV9pbml0KHZvaWQgKmRldnAsIHN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhICpzY2RwKTsKK3ZvaWQgKnNpbXBsZV9hbGxvY19pbml0KGNoYXIgKmJhc2UsIHUzMiBoZWFwX3NpemUsIHUzMiBncmFudWxhcml0eSwKKwkJdTMyIG1heF9hbGxvY3MpOworCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQogewpAQCAtODQsMTAgKzg2LDEwIEBACiAJcmV0dXJuIChwbGF0Zm9ybV9vcHMubWFsbG9jKSA/IHBsYXRmb3JtX29wcy5tYWxsb2Moc2l6ZSkgOiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZSh2b2lkICpwdHIsIHUzMiBzaXplKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWUodm9pZCAqcHRyKQogewogCWlmIChwbGF0Zm9ybV9vcHMuZnJlZSkKLQkJcGxhdGZvcm1fb3BzLmZyZWUocHRyLCBzaXplKTsKKwkJcGxhdGZvcm1fb3BzLmZyZWUocHRyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGV4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogR2VuZXJpYyBzZXJpYWwgY29uc29sZSBzdXBwb3J0CisgKgorICogQXV0aG9yOiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiBDb2RlIGluIHNlcmlhbF9lZGl0X2NtZGxpbmUoKSBjb3BpZWQgZnJvbSA8ZmlsZTphcmNoL3BwYy9ib290L3NpbXBsZS9taXNjLmM+CisgKiBhbmQgd2FzIHdyaXR0ZW4gYnkgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4uCisgKgorICogMjAwMSwyMDA2IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJvcHMuaCIKKworZXh0ZXJuIHZvaWQgdWRlbGF5KGxvbmcgZGVsYXkpOworCitzdGF0aWMgaW50IHNlcmlhbF9vcGVuKHZvaWQpCit7CisJc3RydWN0IHNlcmlhbF9jb25zb2xlX2RhdGEgKnNjZHAgPSBjb25zb2xlX29wcy5kYXRhOworCXJldHVybiBzY2RwLT5vcGVuKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbF93cml0ZShjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHNlcmlhbF9jb25zb2xlX2RhdGEgKnNjZHAgPSBjb25zb2xlX29wcy5kYXRhOworCisJd2hpbGUgKCpidWYgIT0gJ1wwJykKKwkJc2NkcC0+cHV0YygqYnVmKyspOworfQorCitzdGF0aWMgdm9pZCBzZXJpYWxfZWRpdF9jbWRsaW5lKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgdGltZXIgPSAwLCBjb3VudDsKKwljaGFyIGNoLCAqY3A7CisJc3RydWN0IHNlcmlhbF9jb25zb2xlX2RhdGEgKnNjZHAgPSBjb25zb2xlX29wcy5kYXRhOworCisJY3AgPSBidWY7CisJY291bnQgPSBzdHJsZW4oYnVmKTsKKwljcCA9ICZidWZbY291bnRdOworCWNvdW50Kys7CisKKwl3aGlsZSAodGltZXIrKyA8IDUqMTAwMCkgeworCQlpZiAoc2NkcC0+dHN0YygpKSB7CisJCQl3aGlsZSAoKChjaCA9IHNjZHAtPmdldGMoKSkgIT0gJ1xuJykgJiYgKGNoICE9ICdccicpKSB7CisJCQkJLyogVGVzdCBmb3IgYmFja3NwYWNlL2RlbGV0ZSAqLworCQkJCWlmICgoY2ggPT0gJ1xiJykgfHwgKGNoID09ICdcMTc3JykpIHsKKwkJCQkJaWYgKGNwICE9IGJ1ZikgeworCQkJCQkJY3AtLTsKKwkJCQkJCWNvdW50LS07CisJCQkJCQlwcmludGYoIlxiIFxiIik7CisJCQkJCX0KKwkJCQkvKiBUZXN0IGZvciBeeC9edSAoYW5kIHdpcGUgdGhlIGxpbmUpICovCisJCQkJfSBlbHNlIGlmICgoY2ggPT0gJ1wwMzAnKSB8fCAoY2ggPT0gJ1wwMjUnKSkgeworCQkJCQl3aGlsZSAoY3AgIT0gYnVmKSB7CisJCQkJCQljcC0tOworCQkJCQkJY291bnQtLTsKKwkJCQkJCXByaW50ZigiXGIgXGIiKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoY291bnQgPCBsZW4pIHsKKwkJCQkJCSpjcCsrID0gY2g7CisJCQkJCQljb3VudCsrOworCQkJCQkJc2NkcC0+cHV0YyhjaCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7ICAvKiBFeGl0ICd0aW1lcicgbG9vcCAqLworCQl9CisJCXVkZWxheSgxMDAwKTsgIC8qIDEgbXNlYyAqLworCX0KKwkqY3AgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXJpYWxfY2xvc2Uodm9pZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2NvbnNvbGVfZGF0YSAqc2NkcCA9IGNvbnNvbGVfb3BzLmRhdGE7CisKKwlpZiAoc2NkcC0+Y2xvc2UpCisJCXNjZHAtPmNsb3NlKCk7Cit9CisKK3N0YXRpYyB2b2lkICpzZXJpYWxfZ2V0X3N0ZG91dF9kZXZwKHZvaWQpCit7CisJdm9pZCAqZGV2cDsKKwljaGFyIGRldnR5cGVbTUFYX1BST1BfTEVOXTsKKwljaGFyIHBhdGhbTUFYX1BBVEhfTEVOXTsKKworCWRldnAgPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7CisJaWYgKGRldnAgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0OworCisJaWYgKGdldHByb3AoZGV2cCwgImxpbnV4LHN0ZG91dC1wYXRoIiwgcGF0aCwgTUFYX1BBVEhfTEVOKSA+IDApIHsKKwkJZGV2cCA9IGZpbmRkZXZpY2UocGF0aCk7CisJCWlmIChkZXZwID09IE5VTEwpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJaWYgKChnZXRwcm9wKGRldnAsICJkZXZpY2VfdHlwZSIsIGRldnR5cGUsIHNpemVvZihkZXZ0eXBlKSkgPiAwKQorCQkJCSYmICFzdHJjbXAoZGV2dHlwZSwgInNlcmlhbCIpKQorCQkJcmV0dXJuIGRldnA7CisJfQorZXJyX291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhIHNlcmlhbF9jZDsKKworLyogTm9kZSdzICJjb21wYXRpYmxlIiBwcm9wZXJ0eSBkZXRlcm1pbmVzIHdoaWNoIHNlcmlhbCBkcml2ZXIgdG8gdXNlICovCitpbnQgc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXZvaWQgKmRldnA7CisJaW50IHJjID0gLTE7CisJY2hhciBjb21wYXRbTUFYX1BST1BfTEVOXTsKKworCWRldnAgPSBzZXJpYWxfZ2V0X3N0ZG91dF9kZXZwKCk7CisJaWYgKGRldnAgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0OworCisJaWYgKGdldHByb3AoZGV2cCwgImNvbXBhdGlibGUiLCBjb21wYXQsIHNpemVvZihjb21wYXQpKSA8IDApCisJCWdvdG8gZXJyX291dDsKKworCWlmICghc3RyY21wKGNvbXBhdCwgIm5zMTY1NTAiKSkKKwkJcmMgPSBuczE2NTUwX2NvbnNvbGVfaW5pdChkZXZwLCAmc2VyaWFsX2NkKTsKKworCS8qIEFkZCBvdGhlciBzZXJpYWwgY29uc29sZSBkcml2ZXIgY2FsbHMgaGVyZSAqLworCisJaWYgKCFyYykgeworCQljb25zb2xlX29wcy5vcGVuID0gc2VyaWFsX29wZW47CisJCWNvbnNvbGVfb3BzLndyaXRlID0gc2VyaWFsX3dyaXRlOworCQljb25zb2xlX29wcy5lZGl0X2NtZGxpbmUgPSBzZXJpYWxfZWRpdF9jbWRsaW5lOworCQljb25zb2xlX29wcy5jbG9zZSA9IHNlcmlhbF9jbG9zZTsKKwkJY29uc29sZV9vcHMuZGF0YSA9ICZzZXJpYWxfY2Q7CisKKwkJcmV0dXJuIDA7CisJfQorZXJyX291dDoKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zaW1wbGVfYWxsb2MuYyBiL2FyY2gvcG93ZXJwYy9ib290L3NpbXBsZV9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTNhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zaW1wbGVfYWxsb2MuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIEltcGxlbWVudCBwcmltaXRpdmUgcmVhbGxvYygzKSBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEF1dGhvcjogTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CisgKgorICogMjAwNiAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAib3BzLmgiCisKKyNkZWZpbmUJRU5UUllfQkVFTl9VU0VECTB4MDEKKyNkZWZpbmUJRU5UUllfSU5fVVNFCTB4MDIKKworc3RhdGljIHN0cnVjdCBhbGxvY19pbmZvIHsKKwl1MzIJZmxhZ3M7CisJdTMyCWJhc2U7CisJdTMyCXNpemU7Cit9ICphbGxvY190Ymw7CisKK3N0YXRpYyB1MzIgdGJsX2VudHJpZXM7CitzdGF0aWMgdTMyIGFsbG9jX21pbjsKK3N0YXRpYyB1MzIgbmV4dF9iYXNlOworc3RhdGljIHUzMiBzcGFjZV9sZWZ0OworCisvKgorICogRmlyc3QgdGltZSBhbiBlbnRyeSBpcyB1c2VkLCBpdHMgYmFzZSBhbmQgc2l6ZSBhcmUgc2V0LgorICogQW4gZW50cnkgY2FuIGJlIGZyZWVkIGFuZCByZS1tYWxsb2MnZCBidXQgaXRzIGJhc2UgJiBzaXplIGRvbid0IGNoYW5nZS4KKyAqIFNob3VsZCBiZSBzbWFydCBlbm91Z2ggZm9yIG5lZWRzIG9mIGJvb3R3cmFwcGVyLgorICovCitzdGF0aWMgdm9pZCAqc2ltcGxlX21hbGxvYyh1MzIgc2l6ZSkKK3sKKwl1MzIgaTsKKwlzdHJ1Y3QgYWxsb2NfaW5mbyAqcCA9IGFsbG9jX3RibDsKKworCWlmIChzaXplID09IDApCisJCWdvdG8gZXJyX291dDsKKworCXNpemUgPSBfQUxJR05fVVAoc2l6ZSwgYWxsb2NfbWluKTsKKworCWZvciAoaT0wOyBpPHRibF9lbnRyaWVzOyBpKyssIHArKykKKwkJaWYgKCEocC0+ZmxhZ3MgJiBFTlRSWV9CRUVOX1VTRUQpKSB7IC8qIG5ldmVyIGJlZW4gdXNlZCAqLworCQkJaWYgKHNpemUgPD0gc3BhY2VfbGVmdCkgeworCQkJCXAtPmJhc2UgPSBuZXh0X2Jhc2U7CisJCQkJcC0+c2l6ZSA9IHNpemU7CisJCQkJcC0+ZmxhZ3MgPSBFTlRSWV9CRUVOX1VTRUQgfCBFTlRSWV9JTl9VU0U7CisJCQkJbmV4dF9iYXNlICs9IHNpemU7CisJCQkJc3BhY2VfbGVmdCAtPSBzaXplOworCQkJCXJldHVybiAodm9pZCAqKXAtPmJhc2U7CisJCQl9CisJCQlnb3RvIGVycl9vdXQ7IC8qIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCAqLworCQl9CisJCS8qIHJldXNlIGFuIGVudHJ5IGtlZXBpbmcgc2FtZSBiYXNlICYgc2l6ZSAqLworCQllbHNlIGlmICghKHAtPmZsYWdzICYgRU5UUllfSU5fVVNFKSAmJiAoc2l6ZSA8PSBwLT5zaXplKSkgeworCQkJcC0+ZmxhZ3MgfD0gRU5UUllfSU5fVVNFOworCQkJcmV0dXJuICh2b2lkICopcC0+YmFzZTsKKwkJfQorZXJyX291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhbGxvY19pbmZvICpzaW1wbGVfZmluZF9lbnRyeSh2b2lkICpwdHIpCit7CisJdTMyIGk7CisJc3RydWN0IGFsbG9jX2luZm8gKnAgPSBhbGxvY190Ymw7CisKKwlmb3IgKGk9MDsgaTx0YmxfZW50cmllczsgaSsrLHArKykgeworCQlpZiAoIShwLT5mbGFncyAmIEVOVFJZX0JFRU5fVVNFRCkpCisJCQlicmVhazsKKwkJaWYgKChwLT5mbGFncyAmIEVOVFJZX0lOX1VTRSkgJiYgKHAtPmJhc2UgPT0gKHUzMilwdHIpKQorCQkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzaW1wbGVfZnJlZSh2b2lkICpwdHIpCit7CisJc3RydWN0IGFsbG9jX2luZm8gKnAgPSBzaW1wbGVfZmluZF9lbnRyeShwdHIpOworCisJaWYgKHAgIT0gTlVMTCkKKwkJcC0+ZmxhZ3MgJj0gfkVOVFJZX0lOX1VTRTsKK30KKworLyoKKyAqIENoYW5nZSBzaXplIG9mIGFyZWEgcG9pbnRlZCB0byBieSAncHRyJyB0byAnc2l6ZScuCisgKiBJZiAncHRyJyBpcyBOVUxMLCB0aGVuIGl0cyBhIG1hbGxvYygpLiAgSWYgJ3NpemUnIGlzIDAsIHRoZW4gaXRzIGEgZnJlZSgpLgorICogJ3B0cicgbXVzdCBiZSBOVUxMIG9yIGEgcG9pbnRlciB0byBhIG5vbi1mcmVlZCBhcmVhIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKKyAqIHNpbXBsZV9yZWFsbG9jKCkgb3Igc2ltcGxlX21hbGxvYygpLgorICovCitzdGF0aWMgdm9pZCAqc2ltcGxlX3JlYWxsb2Modm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFsbG9jX2luZm8gKnA7CisJdm9pZCAqbmV3OworCisJaWYgKHNpemUgPT0gMCkgeworCQlzaW1wbGVfZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAocHRyID09IE5VTEwpCisJCXJldHVybiBzaW1wbGVfbWFsbG9jKHNpemUpOworCisJcCA9IHNpbXBsZV9maW5kX2VudHJ5KHB0cik7CisJaWYgKHAgPT0gTlVMTCkgLyogcHRyIG5vdCBmcm9tIHNpbXBsZV9tYWxsb2Mvc2ltcGxlX3JlYWxsb2MgKi8KKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNpemUgPD0gcC0+c2l6ZSkgLyogZml0cyBpbiBjdXJyZW50IGJsb2NrICovCisJCXJldHVybiBwdHI7CisKKwluZXcgPSBzaW1wbGVfbWFsbG9jKHNpemUpOworCW1lbWNweShuZXcsIHB0ciwgcC0+c2l6ZSk7CisJc2ltcGxlX2ZyZWUocHRyKTsKKwlyZXR1cm4gbmV3OworfQorCisvKgorICogUmV0dXJucyBhZGRyIG9mIGZpcnN0IGJ5dGUgYWZ0ZXIgaGVhcCBzbyBjYWxsZXIgY2FuIHNlZSBpZiBpdCB0b29rCisgKiB0b28gbXVjaCBzcGFjZS4gIElmIHNvLCBjaGFuZ2UgYXJncyAmIHRyeSBhZ2Fpbi4KKyAqLwordm9pZCAqc2ltcGxlX2FsbG9jX2luaXQoY2hhciAqYmFzZSwgdTMyIGhlYXBfc2l6ZSwgdTMyIGdyYW51bGFyaXR5LAorCQl1MzIgbWF4X2FsbG9jcykKK3sKKwl1MzIgaGVhcF9iYXNlLCB0Ymxfc2l6ZTsKKworCWhlYXBfc2l6ZSA9IF9BTElHTl9VUChoZWFwX3NpemUsIGdyYW51bGFyaXR5KTsKKwlhbGxvY19taW4gPSBncmFudWxhcml0eTsKKwl0YmxfZW50cmllcyA9IG1heF9hbGxvY3M7CisKKwl0Ymxfc2l6ZSA9IHRibF9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBhbGxvY19pbmZvKTsKKworCWFsbG9jX3RibCA9IChzdHJ1Y3QgYWxsb2NfaW5mbyAqKV9BTElHTl9VUCgodW5zaWduZWQgbG9uZyliYXNlLCA4KTsKKwltZW1zZXQoYWxsb2NfdGJsLCAwLCB0Ymxfc2l6ZSk7CisKKwloZWFwX2Jhc2UgPSBfQUxJR05fVVAoKHUzMilhbGxvY190YmwgKyB0Ymxfc2l6ZSwgYWxsb2NfbWluKTsKKworCW5leHRfYmFzZSA9IGhlYXBfYmFzZTsKKwlzcGFjZV9sZWZ0ID0gaGVhcF9zaXplOworCisJcGxhdGZvcm1fb3BzLm1hbGxvYyA9IHNpbXBsZV9tYWxsb2M7CisJcGxhdGZvcm1fb3BzLmZyZWUgPSBzaW1wbGVfZnJlZTsKKwlwbGF0Zm9ybV9vcHMucmVhbGxvYyA9IHNpbXBsZV9yZWFsbG9jOworCisJcmV0dXJuICh2b2lkICopKGhlYXBfYmFzZSArIGhlYXBfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYwppbmRleCA2ZDVmNjM4Li4wYTlmZWViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAJbiA9IHZzcHJpbnRmKHNwcmludF9idWYsIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwotCWNvbnNvbGVfb3BzLndyaXRlKHNwcmludF9idWYsIG4pOworCWlmIChjb25zb2xlX29wcy53cml0ZSkKKwkJY29uc29sZV9vcHMud3JpdGUoc3ByaW50X2J1Ziwgbik7CiAJcmV0dXJuIG47CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC91dGlsLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC91dGlsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZGRmYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3V0aWwuUwpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29waWVkIGZyb20gPGZpbGU6YXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlM+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgbG93LWxldmVsIGZ1bmN0aW9ucy4KKyAqICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIExhcmdlbHkgcmV3cml0dGVuIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpCisgKiBhbmQgUGF1bCBNYWNrZXJyYXMuCisgKgorICoga2V4ZWMgYml0czoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEVyaWMgQmllZGVybWFuICA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgorICogR2FtZUN1YmUvcHBjMzIgcG9ydCBDb3B5cmlnaHQgKEMpIDIwMDQgQWxiZXJ0IEhlcnJhbnoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgInBwY19hc20uaCIKKworI2RlZmluZSBTUFJOX1BWUiAgICAgICAgMHgxMUYgICAvKiBQcm9jZXNzb3IgVmVyc2lvbiBSZWdpc3RlciAqLworCisJLnRleHQKKworLyogdWRlbGF5IChvbiBub24tNjAxIHByb2Nlc3NvcnMpIG5lZWRzIHRvIGtub3cgdGhlIHBlcmlvZCBvZiB0aGUKKyAqIHRpbWViYXNlIGluIG5hbm9zZWNvbmRzLiAgVGhpcyB1c2VkIHRvIGJlIGhhcmRjb2RlZCB0byBiZSA2MG5zCisgKiAocGVyaW9kIG9mIDY2TUh6LzQpLiAgTm93IGEgdmFyaWFibGUgaXMgdXNlZCB0aGF0IGlzIGluaXRpYWxpemVkIHRvCisgKiA2MCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGNhbiBiZSBvdmVycmlkZGVuIGFzIG5lY2Vzc2FyeQorICogd2l0aCBjb2RlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKiAgICBleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lYmFzZV9wZXJpb2RfbnM7CisgKiAgICB0aW1lYmFzZV9wZXJpb2RfbnMgPSAxMDAwMDAwMDAwIC8gYmQtPmJpX3RiZnJlcTsKKyAqLworCS5kYXRhCisJLmdsb2JsIHRpbWViYXNlX3BlcmlvZF9ucwordGltZWJhc2VfcGVyaW9kX25zOgorCS5sb25nCTYwCisKKwkudGV4dAorLyoKKyAqIERlbGF5IGZvciBhIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqLworCS5nbG9ibAl1ZGVsYXkKK3VkZWxheToKKwltZnNwcglyNCxTUFJOX1BWUgorCXNyd2kJcjQscjQsMTYKKwljbXB3aQkwLHI0LDEJCS8qIDYwMSA/ICovCisJYm5lCS51ZGVsYXlfbm90XzYwMQorMDA6CWxpCXIwLDg2CS8qIEluc3RydWN0aW9ucyAvIG1pY3Jvc2Vjb25kPyAqLworCW10Y3RyCXIwCisxMDoJYWRkaQlyMCxyMCwwIC8qIE5PUCAqLworCWJkbnoJMTBiCisJc3ViaWMuCXIzLHIzLDEKKwlibmUJMDBiCisJYmxyCisKKy51ZGVsYXlfbm90XzYwMToKKwltdWxsaQlyNCxyMywxMDAwCS8qIG5hbm9zZWNvbmRzICovCisJLyogIENoYW5nZSByNCB0byBiZSB0aGUgbnVtYmVyIG9mIHRpY2tzIHVzaW5nOgorCSAqCShuYW5vc2Vjb25kcyArICh0aW1lYmFzZV9wZXJpb2RfbnMgLSAxICkpIC8gdGltZWJhc2VfcGVyaW9kX25zCisJICogIHRpbWViYXNlX3BlcmlvZF9ucyBkZWZhdWx0cyB0byA2MCAoMTYuNk1IeikgKi8KKwltZmxyCXI1CisJYmwJMGYKKzA6CW1mbHIJcjYKKwltdGxyCXI1CisJbGlzCXI1LDBiQGhhCisJYWRkaQlyNSxyNSwwYkBsCisJc3ViZglyNSxyNSxyNgkvKiBJbiBjYXNlIHdlJ3JlIHJlbG9jYXRlZCAqLworCWFkZGlzCXI1LHI1LHRpbWViYXNlX3BlcmlvZF9uc0BoYQorCWx3eglyNSx0aW1lYmFzZV9wZXJpb2RfbnNAbChyNSkKKwlhZGQJcjQscjQscjUKKwlhZGRpCXI0LHI0LC0xCisJZGl2dwlyNCxyNCxyNQkvKiBCVVMgdGlja3MgKi8KKzE6CW1mdGJ1CXI1CisJbWZ0YglyNgorCW1mdGJ1CXI3CisJY21wdwkwLHI1LHI3CisJYm5lCTFiCQkvKiBHZXQgW3N5bmNlZF0gYmFzZSB0aW1lICovCisJYWRkYwlyOSxyNixyNAkvKiBDb21wdXRlIGVuZCB0aW1lICovCisJYWRkemUJcjgscjUKKzI6CW1mdGJ1CXI1CisJY21wdwkwLHI1LHI4CisJYmx0CTJiCisJYmd0CTNmCisJbWZ0YglyNgorCWNtcHcJMCxyNixyOQorCWJsdAkyYgorMzoJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCBiNWZiMWZlLi4wMjRlNGQ0IDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTE4NCw2ICsxODQsOSBAQAogCiBpZiBbIC1uICIkZHRiIiBdOyB0aGVuCiAgICAgYWRkc2VjICR0bXAgIiRkdGIiIC5rZXJuZWw6ZHRiCisgICAgaWYgWyAtbiAiJGR0cyIgXTsgdGhlbgorCXJtICRkdGIKKyAgICBmaQogZmkKIAogaWYgWyAiJHBsYXRmb3JtIiAhPSAibWlib290IiBdOyB0aGVuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UuY29mZi5sZHMuUyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TCmluZGV4IDA1ZjMyMzguLmEzNjA5MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TCkBAIC0yMSw2ICsyMSwxMCBAQAogICAgICooLmdvdDIpCiAgICAgX19nb3QyX2VuZCA9IC47CiAKKyAgICBfZHRiX3N0YXJ0ID0gLjsKKyAgICAqKC5rZXJuZWw6ZHRiKQorICAgIF9kdGJfZW5kID0gLjsKKwogICAgIF92bWxpbnV4X3N0YXJ0ID0gIC47CiAgICAgKigua2VybmVsOnZtbGludXguc3RyaXApCiAgICAgX3ZtbGludXhfZW5kID0gIC47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCmluZGV4IDBhYmEwNmQuLmE5OGM5ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4Ci0jIFdlZCBPY3QgIDQgMTU6MzA6NTAgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjNgorIyBXZWQgTm92IDIyIDE1OjMzOjA0IDIwMDYKICMKIENPTkZJR19QUEM2ND15CiBDT05GSUdfNjRCSVQ9eQpAQCAtMzIsNiArMzIsMTAgQEAKIENPTkZJR19QT1dFUjM9eQogQ09ORklHX1BPV0VSND15CiBDT05GSUdfUFBDX0ZQVT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0RDUl9NTUlPPXkKK0NPTkZJR19QUENfRENSPXkKK0NPTkZJR19QUENfT0ZfUExBVEZPUk1fUENJPXkKIENPTkZJR19BTFRJVkVDPXkKIENPTkZJR19QUENfU1REX01NVT15CiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORz15CkBAIC02Nyw3ICs3MSw3IEBACiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTEzMSw2ICsxMzUsNyBAQAogQ09ORklHX1BQQ19DRUxMX05BVElWRT15CiBDT05GSUdfUFBDX0lCTV9DRUxMX0JMQURFPXkKIENPTkZJR19VREJHX1JUQVNfQ09OU09MRT15CitDT05GSUdfUFBDX1BTMz15CiAjIENPTkZJR19VM19EQVJUIGlzIG5vdCBzZXQKIENPTkZJR19QUENfUlRBUz15CiAjIENPTkZJR19SVEFTX0VSUk9SX0xPR0dJTkcgaXMgbm90IHNldApAQCAtMTM5LDkgKzE0NCwyMyBAQAogQ09ORklHX01NSU9fTlZSQU09eQogIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfOTcwX05BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0lORElSRUNUX0lPPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorQ09ORklHX0NQVV9GUkVRX0RFQlVHPXkKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkU9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD15CitDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT15CisjIENPTkZJR19DUFVfRlJFUV9QTUFDNjQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfTVBJQyBpcyBub3Qgc2V0CitDT05GSUdfTVBJQz15CiAKICMKICMgQ2VsbCBCcm9hZGJhbmQgRW5naW5lIG9wdGlvbnMKQEAgLTE0OSw2ICsxNjgsMTUgQEAKIENPTkZJR19TUFVfRlM9bQogQ09ORklHX1NQVV9CQVNFPXkKIENPTkZJR19DQkVfUkFTPXkKK0NPTkZJR19DQkVfVEhFUk09bQorQ09ORklHX0NCRV9DUFVGUkVRPW0KKworIworIyBQUzMgUGxhdGZvcm0gT3B0aW9ucworIworQ09ORklHX1BTM19IVEFCX1NJWkU9MjAKKyMgQ09ORklHX1BTM19EWU5BTUlDX0RNQSBpcyBub3Qgc2V0CitDT05GSUdfUFMzX1VTRV9MUEFSX0FERFI9eQogCiAjCiAjIEtlcm5lbCBvcHRpb25zCkBAIC0xNjYsMTMgKzE5NCwxNCBAQAogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9OQogIyBDT05GSUdfSU9NTVVfVk1FUkdFIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15Ci1DT05GSUdfS0VYRUM9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CiBDT05GSUdfSVJRX0FMTF9DUFVTPXkKIENPTkZJR19OVU1BPXkKIENPTkZJR19OT0RFU19TSElGVD00CiBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKICMgQ09ORklHX0ZMQVRNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTE4OSw2ICsyMTgsNyBAQAogQ09ORklHX01JR1JBVElPTj15CiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUPXkKIENPTkZJR19BUkNIX01FTU9SWV9QUk9CRT15CitDT05GSUdfTk9ERVNfU1BBTl9PVEhFUl9OT0RFUz15CiBDT05GSUdfUFBDXzY0S19QQUdFUz15CiBDT05GSUdfU0NIRURfU01UPXkKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQpAQCAtMjA3LDcgKzIzNyw2IEBACiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfRE9NQUlOUz15CiBDT05GSUdfUENJRVBPUlRCVVM9eQotIyBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKQEAgLTI4MCw3ICszMDksNiBAQAogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfU0lUIGlzIG5vdCBzZXQKIENPTkZJR19JUFY2X1RVTk5FTD1tCi0jIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSPXkKQEAgLTExMDcsNyArMTEzNSw4IEBACiAjCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CiAjCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTExNDIsNiArMTE3MSw3IEBACiBDT05GSUdfREVCVUdHRVI9eQogQ09ORklHX1hNT049eQogQ09ORklHX1hNT05fREVGQVVMVD15CitDT05GSUdfWE1PTl9ESVNBU1NFTUJMWT15CiBDT05GSUdfSVJRU1RBQ0tTPXkKICMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTExNTksNyArMTE4OSw3IEBACiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCiBDT05GSUdfQ1JZUFRPX0hBU0g9eQotIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fSE1BQz15CiAjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpbmtzdGF0aW9uX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpbmtzdGF0aW9uX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZkMjEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGlua3N0YXRpb25fZGVmY29uZmlnCkBAIC0wLDAgKzEsMTU4MyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjNAorIyBXZWQgTm92IDE1IDIwOjM2OjMwIDIwMDYKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKK0NPTkZJR19QUEMzMj15CitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19QUENfVURCR18xNjU1MD15CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKK0NPTkZJR19DTEFTU0lDMzI9eQorIyBDT05GSUdfUFBDXzUyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzg2eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfNnh4PXkKK0NPTkZJR19QUENfRlBVPXkKKyMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19BTFRJVkVDIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIta3Vyb2JveEhHIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfU0xBQj15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworIyBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVENnh4PXkKKyMgQ09ORklHX0FQVVMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOTcwX05BUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19JT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19UQVUgaXMgbm90IHNldAorIyBDT05GSUdfS0FUQU5BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTExPVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUENJNjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSUE1DMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRVNUTlVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQUlVDRSBpcyBub3Qgc2V0CisjIENPTkZJR19IRFBVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWNjQyNjAgaXMgbm90IHNldAorIyBDT05GSUdfTE9QRUMgaXMgbm90IHNldAorIyBDT05GSUdfTVZNRTUxMDAgaXMgbm90IHNldAorIyBDT05GSUdfUFBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJQTUM3NTAgaXMgbm90IHNldAorIyBDT05GSUdfUFJQTUM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0FORFBPSU5UIGlzIG5vdCBzZXQKK0NPTkZJR19MSU5LU1RBVElPTj15CisjIENPTkZJR19NUEM3NDQ4SFBDMiBpcyBub3Qgc2V0CisjIENPTkZJR19SQURTVE9ORV9QUEM3RCBpcyBub3Qgc2V0CisjIENPTkZJR19QQUw0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTUlOSSBpcyBub3Qgc2V0CisjIENPTkZJR19FU1Q4MjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NCQzgyeHggaXMgbm90IHNldAorIyBDT05GSUdfU0JTODI2MCBpcyBub3Qgc2V0CisjIENPTkZJR19SUFg4MjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTgyNjAgaXMgbm90IHNldAorIyBDT05GSUdfQURTODI3MiBpcyBub3Qgc2V0CisjIENPTkZJR19QUTJGQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJVEU1MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWNjQzNjAgaXMgbm90IHNldAorQ09ORklHX1BQQ19HRU41NTA9eQorQ09ORklHX01QQzEwWF9CUklER0U9eQorQ09ORklHX01QQzEwWF9PUEVOUElDPXkKKyMgQ09ORklHX01QQzEwWF9TVE9SRV9HQVRIRVJJTkcgaXMgbm90IHNldAorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorQ09ORklHX01QSUM9eQorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8xMDA9eQorIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX0RFVklDRVRSRUU9eQorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfRlNMX1NPQz15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfRE9NQUlOUz15CisjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKworIworIyBJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUQUJMRVM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1kgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFAgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUyBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfSVBfTkZfQ09OTlRSQUNLPW0KKyMgQ09ORklHX0lQX05GX0NUX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUksgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DVF9QUk9UT19TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9GVFA9bQorQ09ORklHX0lQX05GX0lSQz1tCisjIENPTkZJR19JUF9ORl9ORVRCSU9TX05TIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9URlRQPW0KKyMgQ09ORklHX0lQX05GX0FNQU5EQSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9QUFRQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0gzMjMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfU0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9JUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfTUFUQ0hfSVBSQU5HRT1tCisjIENPTkZJR19JUF9ORl9NQVRDSF9UT1MgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfUkVDRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0VDTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9UVEwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfT1dORVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfSEFTSExJTUlUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9OQVQ9bQorQ09ORklHX0lQX05GX05BVF9ORUVERUQ9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQorQ09ORklHX0lQX05GX1RBUkdFVF9TQU1FPW0KKyMgQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9OQVRfSVJDPW0KK0NPTkZJR19JUF9ORl9OQVRfRlRQPW0KK0NPTkZJR19JUF9ORl9OQVRfVEZUUD1tCitDT05GSUdfSVBfTkZfTUFOR0xFPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVE9TPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVFRMPW0KK0NPTkZJR19JUF9ORl9SQVc9bQorQ09ORklHX0lQX05GX0FSUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KK0NPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfSUVFRTgwMjExPW0KK0NPTkZJR19JRUVFODAyMTFfREVCVUc9eQorQ09ORklHX0lFRUU4MDIxMV9DUllQVF9XRVA9bQorQ09ORklHX0lFRUU4MDIxMV9DUllQVF9DQ01QPW0KK0NPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUD1tCitDT05GSUdfSUVFRTgwMjExX1NPRlRNQUM9bQorQ09ORklHX0lFRUU4MDIxMV9TT0ZUTUFDX0RFQlVHPXkKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfSkVERUNQUk9CRT15CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9OT1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorIyBDT05GSUdfTVREX0NGSV9JMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhmZmMwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDQwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0xCisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCitDT05GSUdfQVRBPXkKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9TSUw2ODA9eQorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU0FTIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKK0NPTkZJR19UVU49bQorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CitDT05GSUdfUjgxNjk9eQorIyBDT05GSUdfUjgxNjlfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCitDT05GSUdfTkVUX1JBRElPPXkKKyMgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgaXMgbm90IHNldAorCisjCisjIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCisjCisjIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BSVJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFUk1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJpc20gR1QvRHVldHRlIDgwMi4xMShhL2IvZykgUENJL0NhcmRidXMgc3VwcG9ydAorIworIyBDT05GSUdfUFJJU001NCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkQxMjAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CisjIENPTkZJR19CQ000M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pEMTIxMVJXIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfV0lSRUxFU1M9eQorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRDT05TT0xFPXkKK0NPTkZJR19ORVRQT0xMPXkKKyMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj1tCisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NSVNDPXkKK0NPTkZJR19JTlBVVF9VSU5QVVQ9bQorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19FRVBST009bQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRklSTVdBUkVfRURJRD15CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfVVNCX0VIQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworQ09ORklHX1VTQl9TRVJJQUw9eQorQ09ORklHX1VTQl9TRVJJQUxfQ09OU09MRT15CisjIENPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9BSVJDQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0FJUlBSSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQVJLMzExNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0JFTEtJTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1dISVRFSEVBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0RJR0lfQUNDRUxFUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NQMjEwMSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZUFJFU1NfTTggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FTVBFRyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9GVERJX1NJTz15CisjIENPTkZJR19VU0JfU0VSSUFMX0ZVTlNPRlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9WSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQQVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUFcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LTFNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1M3NzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9TNzg0MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX05BVk1BTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0hQNFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TQUZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKKyMKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorCisjCisjIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfRFJWX1JTNUMzNzI9eQorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIERNQSBFbmdpbmUgc3VwcG9ydAorIworIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIENsaWVudHMKKyMKKworIworIyBETUEgRGV2aWNlcworIworCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz1tCitDT05GSUdfSk9MSUVUPXkKK0NPTkZJR19aSVNPRlM9eQorQ09ORklHX1pJU09GU19GUz1tCitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VREZfTkxTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPW0KK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCitDT05GSUdfTlRGU19GUz1tCisjIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1YzX0FDTD15CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD1tCitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9bQorQ09ORklHX05GU19BQ0xfU1VQUE9SVD15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPW0KK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorQ09ORklHX0xJQkNSQzMyQz1tCitDT05GSUdfWkxJQl9JTkZMQVRFPW0KK0NPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX1BMSVNUPXkKKworIworIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAorIworQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9bQorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKK0NPTkZJR19GT1JDRURfSU5MSU5JTkc9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDQ9bQorQ09ORklHX0NSWVBUT19NRDU9eQorQ09ORklHX0NSWVBUT19TSEExPW0KKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCitDT05GSUdfQ1JZUFRPX0NCQz15CitDT05GSUdfQ1JZUFRPX0RFUz15CitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSD1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPW0KK0NPTkZJR19DUllQVE9fU0VSUEVOVD1tCitDT05GSUdfQ1JZUFRPX0FFUz1tCisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BUkM0PW0KKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQorQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX0NSQzMyQz1tCisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpdGU1MjAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpdGU1MjAwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc2NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGl0ZTUyMDBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTMxIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmM2CisjIE1vbiBOb3YgMjcgMTE6MDg6MjAgMjAwNgorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorIyBDT05GSUdfUFBDX1VEQkdfMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAorQ09ORklHX0FVRElUX0FSQ0g9eQorIyBDT05GSUdfREVGQVVMVF9VSU1BR0UgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCitDT05GSUdfQ0xBU1NJQzMyPXkKKyMgQ09ORklHX1BQQ181Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184M3h4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Nnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAorQ09ORklHXzZ4eD15CitDT05GSUdfUFBDX0ZQVT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfQUxUSVZFQyBpcyBub3Qgc2V0CitDT05GSUdfUFBDX1NURF9NTVU9eQorQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfU0xBQj15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCitDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQorIyBDT05GSUdfRU1CRURERUQ2eHggaXMgbm90IHNldAorIyBDT05GSUdfQVBVUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX01QQzUyeHg9eQorIyBDT05GSUdfUFBDX0VGSUtBIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTElURTUyMDA9eQorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOTcwX05BUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19JT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19UQVUgaXMgbm90IHNldAorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSU5ESVJFQ1RfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj1tCisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zMjc2OAorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKKyMgQ09ORklHX0JMS19ERVZfU0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorQ09ORklHX1BBVEFfTVBDNTJ4eD15CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU0FTIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVjY0M1hYX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9NUEM1Mnh4PXkKK0NPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFX0JBVUQ9OTYwMAorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKKyMKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfUExJU1Q9eQorCisjCisjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR0dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CRElfU1dJVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKaW5kZXggYmUxMWRmNy4uMWMwMDk2NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwpAQCAtMTM4Niw4ICsxMzg2LDggQEAKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0FVVE9GU19GUz15Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz1tCiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkODg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKQEAgLTAsMCArMSw4MzcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzYKKyMgVHVlIE5vdiAyMSAxOTozODo1MyAyMDA2CisjCitDT05GSUdfUFBDNjQ9eQorQ09ORklHXzY0QklUPXkKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19DT01QQVQ9eQorQ09ORklHX1NZU1ZJUENfQ09NUEFUPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorIyBDT05GSUdfUFBDX1VEQkdfMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAorQ09ORklHX0FVRElUX0FSQ0g9eQorIyBDT05GSUdfREVGQVVMVF9VSU1BR0UgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR19QT1dFUjRfT05MWSBpcyBub3Qgc2V0CitDT05GSUdfUE9XRVIzPXkKK0NPTkZJR19QT1dFUjQ9eQorQ09ORklHX1BQQ19GUFU9eQorIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19PRl9QTEFURk9STV9QQ0kgaXMgbm90IHNldAorQ09ORklHX0FMVElWRUM9eQorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MgorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfU1RPUF9NQUNISU5FPXkKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCitDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQorIyBDT05GSUdfRU1CRURERUQ2eHggaXMgbm90IHNldAorIyBDT05GSUdfQVBVUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUFNFUklFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSVNFUklFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTUFQTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BBU0VNSSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0NFTEw9eQorIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JQk1fQ0VMTF9CTEFERSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX1BTMz15CisjIENPTkZJR19VM19EQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOTcwX05BUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19JT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NUElDIGlzIG5vdCBzZXQKKworIworIyBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgb3B0aW9ucworIworQ09ORklHX1NQVV9GUz15CitDT05GSUdfU1BVX0JBU0U9eQorIyBDT05GSUdfQ0JFX1JBUyBpcyBub3Qgc2V0CisKKyMKKyMgUFMzIFBsYXRmb3JtIE9wdGlvbnMKKyMKK0NPTkZJR19QUzNfSFRBQl9TSVpFPTIwCitDT05GSUdfUFMzX0RZTkFNSUNfRE1BPXkKK0NPTkZJR19QUzNfVVNFX0xQQVJfQUREUj15CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfQktMIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfTUlTQz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj05CisjIENPTkZJR19JT01NVV9WTUVSR0UgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfSVJRX0FMTF9DUFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05VTUEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKK0NPTkZJR19TUEFSU0VNRU09eQorQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX0VYVFJFTUU9eQorQ09ORklHX01FTU9SWV9IT1RQTFVHPXkKK0NPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0U9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKK0NPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQorQ09ORklHX0FSQ0hfTUVNT1JZX1BST0JFPXkKK0NPTkZJR19QUENfNjRLX1BBR0VTPXkKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgcncgaXA9ZGhjcCIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwMDAwMDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKKyMgQ09ORklHX0JMS19ERVZfU0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCisjIENPTkZJR19BVEEgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19XSU5ERkFSTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKKyMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfR0VOX1JUQz15CisjIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIERNQSBFbmdpbmUgc3VwcG9ydAorIworIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIENsaWVudHMKKyMKKworIworIyBETUEgRGV2aWNlcworIworCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CisKKyMKKyMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUD15CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTElTVD15CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFTVEFDS1M9eQorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0VBUkxZX0RFQlVHPXkKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19QQU5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19NQVBMRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfSVNFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggN2FmMjNjNC4uNGZlNTNkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0xNywxMSArMTcsMTEgQEAKIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gYmluZm10X2VsZjMyLm8gc3lzX3BwYzMyLm8gXAogCQkJCSAgIHNpZ25hbF82NC5vIHB0cmFjZTMyLm8gXAogCQkJCSAgIHBhY2EubyBjcHVfc2V0dXBfcHBjOTcwLm8gXAotCQkJCSAgIGZpcm13YXJlLm8gc3lzZnMubworCQkJCSAgIGZpcm13YXJlLm8gc3lzZnMubyBudnJhbV82NC5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSB2ZHNvNjQvCiBvYmotJChDT05GSUdfQUxUSVZFQykJCSs9IHZlY2VtdS5vIHZlY3Rvci5vCiBvYmotJChDT05GSUdfUFBDXzk3MF9OQVApCSs9IGlkbGVfcG93ZXI0Lm8KLW9iai0kKENPTkZJR19QUENfT0YpCQkrPSBvZl9kZXZpY2UubyBwcm9tX3BhcnNlLm8KK29iai0kKENPTkZJR19QUENfT0YpCQkrPSBvZl9kZXZpY2UubyBvZl9wbGF0Zm9ybS5vIHByb21fcGFyc2UubwogcHJvY2ZzLSQoQ09ORklHX1BQQzY0KQkJOj0gcHJvY19wcGM2NC5vCiBvYmotJChDT05GSUdfUFJPQ19GUykJCSs9ICQocHJvY2ZzLXkpCiBydGFzcGNpLSQoQ09ORklHX1BQQzY0KQkJOj0gcnRhc19wY2kubwpAQCAtMzIsNyArMzIsNiBAQAogb2JqLSQoQ09ORklHX0lCTVZJTykJCSs9IHZpby5vCiBvYmotJChDT05GSUdfSUJNRUJVUykgICAgICAgICAgICs9IGlibWVidXMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfVEJTWU5DKQkrPSBzbXAtdGJzeW5jLm8KLW9iajY0LSQoQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNKSArPSBudnJhbV82NC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfNnh4KQkJKz0gaWRsZV82eHgubyBsMmNyXzZ4eC5vIGNwdV9zZXR1cF82eHgubwogb2JqLSQoQ09ORklHX1RBVSkJCSs9IHRhdV82eHgubwpAQCAtNTksMTEgKzU4LDExIEBACiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCiBvYmotJChDT05GSUdfUFBDX1VEQkdfMTY1NTApCSs9IGxlZ2FjeV9zZXJpYWwubyB1ZGJnXzE2NTUwLm8KKwogbW9kdWxlLSQoQ09ORklHX1BQQzY0KQkJKz0gbW9kdWxlXzY0Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gJChtb2R1bGUteSkKIAotcGNpNjQtJChDT05GSUdfUFBDNjQpCQkrPSBwY2lfNjQubyBwY2lfZG4ubyBwY2lfaW9tbXUubyBcCi0JCQkJICAgcGNpX2RpcmVjdF9pb21tdS5vIGlvbWFwLm8KK3BjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8KIHBjaTMyLSQoQ09ORklHX1BQQzMyKQkJOj0gcGNpXzMyLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSAkKHBjaTY0LXkpICQocGNpMzIteSkKIGtleGVjLSQoQ09ORklHX1BQQzY0KQkJOj0gbWFjaGluZV9rZXhlY182NC5vCkBAIC03Miw4ICs3MSwxMiBAQAogb2JqLSQoQ09ORklHX0FVRElUKQkJKz0gYXVkaXQubwogb2JqNjQtJChDT05GSUdfQVVESVQpCQkrPSBjb21wYXRfYXVkaXQubwogCitpZm5lcSAoJChDT05GSUdfUFBDX0lORElSRUNUX0lPKSx5KQorb2JqLXkJCQkJKz0gaW9tYXAubworZW5kaWYKKwogaWZlcSAoJChDT05GSUdfUFBDX0lTRVJJRVMpLHkpCi0kKG9iaikvaGVhZF82NC5vOiAkKG9iaikvbHBhcm1hcC5zCitleHRyYS15ICs9IGxwYXJtYXAucwogQUZMQUdTX2hlYWRfNjQubyArPSAtSSQob2JqKQogZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGQwNmYzNzguLmU5NjUyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTExOCw3ICsxMTgsOCBAQAogCURFRklORShQQUNBU1RBQlJSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHN0YWJfcnIpKTsKIAlERUZJTkUoUEFDQVIxLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNhdmVkX3IxKSk7CiAJREVGSU5FKFBBQ0FUT0MsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwga2VybmVsX3RvYykpOwotCURFRklORShQQUNBUFJPQ0VOQUJMRUQsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgcHJvY19lbmFibGVkKSk7CisJREVGSU5FKFBBQ0FTT0ZUSVJRRU4sIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc29mdF9lbmFibGVkKSk7CisJREVGSU5FKFBBQ0FIQVJESVJRRU4sIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgaGFyZF9lbmFibGVkKSk7CiAJREVGSU5FKFBBQ0FTTEJDQUNIRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzbGJfY2FjaGUpKTsKIAlERUZJTkUoUEFDQVNMQkNBQ0hFUFRSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNsYl9jYWNoZV9wdHIpKTsKIAlERUZJTkUoUEFDQUNPTlRFWFRJRCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBjb250ZXh0LmlkKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3BwYzk3MC5TCmluZGV4IDY1MjU5NDguLmJmMTE4YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3BwYzk3MC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3BwYzk3MC5TCkBAIC04Myw2ICs4MywyMiBAQAogCXJsZGltaQlyMCxyMTEsNTIsOAkJLyogc2V0IE5BUCBhbmQgRFBNICovCiAJbGkJcjExLDAKIAlybGRpbWkJcjAscjExLDMyLDMxCQkvKiBjbGVhciBFTl9BVFROICovCisJYglsb2FkX2hpZHMJCS8qIEp1bXAgdG8gc2hhcmVkIGNvZGUgKi8KKworCitfR0xPQkFMKF9fc2V0dXBfY3B1X3BwYzk3ME1QKQorCS8qIERvIG5vdGhpbmcgaWYgbm90IHJ1bm5pbmcgaW4gSFYgbW9kZSAqLworCW1mbXNyCXIwCisJcmxkaWNsLglyMCxyMCw0LDYzCisJYmVxbHIKKworCW1mc3ByCXIwLFNQUk5fSElEMAorCWxpCXIxMSwweDE1CQkvKiBjbGVhciBET1pFIGFuZCBTTEVFUCAqLworCXJsZGltaQlyMCxyMTEsNTIsNgkJLyogc2V0IERFRVBOQVAsIE5BUCBhbmQgRFBNICovCisJbGkJcjExLDAKKwlybGRpbWkJcjAscjExLDMyLDMxCQkvKiBjbGVhciBFTl9BVFROICovCisKK2xvYWRfaGlkczoKIAltdHNwcglTUFJOX0hJRDAscjAKIAltZnNwcglyMCxTUFJOX0hJRDAKIAltZnNwcglyMCxTUFJOX0hJRDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCBiZmQ0OTllLi45ZDE2MTRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC00Miw2ICs0Miw3IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAjaWZkZWYgQ09ORklHX1BQQzY0CiBleHRlcm4gdm9pZCBfX3NldHVwX2NwdV9wcGM5NzAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7CitleHRlcm4gdm9pZCBfX3NldHVwX2NwdV9wcGM5NzBNUCh1bnNpZ25lZCBsb25nIG9mZnNldCwgc3RydWN0IGNwdV9zcGVjKiBzcGVjKTsKIGV4dGVybiB2b2lkIF9fcmVzdG9yZV9jcHVfcHBjOTcwKHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCkBAIC0yMjIsOSArMjIzLDkgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gOCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwTVAsCiAJCS5jcHVfcmVzdG9yZQkJPSBfX3Jlc3RvcmVfY3B1X3BwYzk3MCwKLQkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC85NzBNUCIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCiAJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKIAl9LApAQCAtMjc2LDEwICsyNzcsNDUgQEAKIAkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBNTUNSQV9TSVBSLAogCQkucGxhdGZvcm0JCT0gInBvd2VyNSsiLAogCX0sCisJewkvKiBQT1dFUjYgaW4gUDUrIG1vZGU7IDIuMDQtY29tcGxpYW50IHByb2Nlc3NvciAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKKwkJLnB2cl92YWx1ZQkJPSAweDBmMDAwMDAxLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSNSsiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjYiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IFBPV0VSNl9NTUNSQV9TSUhWLAorCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IFBPV0VSNl9NTUNSQV9TSVBSLAorCQkub3Byb2ZpbGVfbW1jcmFfY2xlYXIJPSBQT1dFUjZfTU1DUkFfVEhSTSB8CisJCQlQT1dFUjZfTU1DUkFfT1RIRVIsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI1KyIsCisJfSwKIAl7CS8qIFBvd2VyNiAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwM2UwMDAwLAotCQkuY3B1X25hbWUJCT0gIlBPV0VSNiIsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI2IChyYXcpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QT1dFUjYsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BPV0VSNiB8CisJCQlQUENfRkVBVFVSRV9QT1dFUjZfRVhULAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA2LAorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI2IiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLm9wcm9maWxlX21tY3JhX3NpaHYJPSBQT1dFUjZfTU1DUkFfU0lIViwKKwkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBQT1dFUjZfTU1DUkFfU0lQUiwKKwkJLm9wcm9maWxlX21tY3JhX2NsZWFyCT0gUE9XRVI2X01NQ1JBX1RIUk0gfAorCQkJUE9XRVI2X01NQ1JBX09USEVSLAorCQkucGxhdGZvcm0JCT0gInBvd2VyNngiLAorCX0sCisJewkvKiAyLjA1LWNvbXBsaWFudCBwcm9jZXNzb3IsIGkuZS4gUG93ZXI2ICJhcmNoaXRlY3RlZCIgbW9kZSAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKKwkJLnB2cl92YWx1ZQkJPSAweDBmMDAwMDAyLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSNiAoYXJjaGl0ZWN0ZWQpIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QT1dFUjYsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BPV0VSNiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCkBAIC0zMDMsNiArMzM5LDkgQEAKIAkJCVBQQ19GRUFUVVJFX1NNVCwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gNCwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L2NlbGwtYmUiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfQ0VMTCwKIAkJLnBsYXRmb3JtCQk9ICJwcGMtY2VsbC1iZSIsCiAJfSwKIAl7CS8qIFBBIFNlbWkgUEE2VCAqLwpAQCAtODAxLDYgKzg0MCwxNyBAQAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKIAkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCisJewkvKiBlMzAwYzMgb24gODN4eCAgKi8KKwkJLnB2cl9tYXNrCQk9IDB4N2ZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDg1MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJlMzAwYzMiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0UzMDAsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuaWNhY2hlX2JzaXplCQk9IDMyLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAorCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoLCB3ZSBhc3N1bWUgc3BsaXQgSS9EIGNhY2hlICYgVEIgKG5vbi02MDEpLi4uICovCiAJCS5wdnJfbWFzawkJPSAweDAwMDAwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwMDAwMDAsCkBAIC0xMTY5LDE5ICsxMjE5LDE1IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiB9OwogCi1zdHJ1Y3QgY3B1X3NwZWMgKmlkZW50aWZ5X2NwdSh1bnNpZ25lZCBsb25nIG9mZnNldCkKK3N0cnVjdCBjcHVfc3BlYyAqaWRlbnRpZnlfY3B1KHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHZyKQogewogCXN0cnVjdCBjcHVfc3BlYyAqcyA9IGNwdV9zcGVjczsKIAlzdHJ1Y3QgY3B1X3NwZWMgKipjdXIgPSAmY3VyX2NwdV9zcGVjOwotCXVuc2lnbmVkIGludCBwdnIgPSBtZnNwcihTUFJOX1BWUik7CiAJaW50IGk7CiAKIAlzID0gUFRSUkVMT0Mocyk7CiAJY3VyID0gUFRSUkVMT0MoY3VyKTsKIAotCWlmICgqY3VyICE9IE5VTEwpCi0JCXJldHVybiBQVFJSRUxPQygqY3VyKTsKLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNwdV9zcGVjcyk7IGkrKyxzKyspCiAJCWlmICgocHZyICYgcy0+cHZyX21hc2spID09IHMtPnB2cl92YWx1ZSkgewogCQkJKmN1ciA9IGNwdV9zcGVjcyArIGk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKaW5kZXggMWFmNDFmNy4uODliMDNjOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYwpAQCAtMTExLDcgKzExMSw3IEBACiAJaWYgKCFjcHVfb25saW5lKGNwdSkpCiAJCXJldHVybjsKIAotCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJaGFyZF9pcnFfZGlzYWJsZSgpOwogCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1c19pbl9jcmFzaCkpCiAJCWNyYXNoX3NhdmVfdGhpc19jcHUocmVncywgY3B1KTsKIAljcHVfc2V0KGNwdSwgY3B1c19pbl9jcmFzaCk7CkBAIC0yODksNyArMjg5LDcgQEAKIAkgKiBhbiBTTVAgc3lzdGVtLgogCSAqIFRoZSBrZXJuZWwgaXMgYnJva2VuIHNvIGRpc2FibGUgaW50ZXJydXB0cy4KIAkgKi8KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWhhcmRfaXJxX2Rpc2FibGUoKTsKIAogCWZvcl9lYWNoX2lycShpcnEpIHsKIAkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWFfNjQuYwppbmRleCA2YzE2OGY2Li43YjBlNzU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hXzY0LmMKQEAgLTEsMTUxICsxLDE5NCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycG9yYXRpb24KICAqCi0gKiBJbXBsZW1lbnRzIHRoZSBnZW5lcmljIGRldmljZSBkbWEgQVBJIGZvciBwcGM2NC4gSGFuZGxlcwotICogdGhlIHBjaSBhbmQgdmlvIGJ1c3NlcworICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRE1BIG1hcHBpbmcgY2FsbGJhY2tzIGZvcgorICogZGlyZWN0bHkgbWFwcGVkIGJ1c3NlcyBhbmQgYnVzc2VzIHVzaW5nIHRoZSBpb21tdSBpbmZyYXN0cnVjdHVyZQogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotLyogSW5jbHVkZSB0aGUgYnVzc2VzIHdlIHN1cHBvcnQgKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vdmlvLmg+Ci0jaW5jbHVkZSA8YXNtL2libWVidXMuaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpnZXRfZG1hX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCisvKgorICogR2VuZXJpYyBpb21tdSBpbXBsZW1lbnRhdGlvbgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkZXZpY2VfdG9fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX1BDSQotCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKQotCQlyZXR1cm4gJnBjaV9kbWFfb3BzOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lCTVZJTwotCWlmIChkZXYtPmJ1cyA9PSAmdmlvX2J1c190eXBlKQotCQlyZXR1cm4gJnZpb19kbWFfb3BzOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lCTUVCVVMKLQlpZiAoZGV2LT5idXMgPT0gJmlibWVidXNfYnVzX3R5cGUpCi0JCXJldHVybiAmaWJtZWJ1c19kbWFfb3BzOwotI2VuZGlmCi0JcmV0dXJuIE5VTEw7CisJaWYgKGRldi0+ZG1hX21hc2sgJiYgKmRldi0+ZG1hX21hc2spCisJCXJldHVybiAqZGV2LT5kbWFfbWFzazsKKwkvKiBBc3N1bWUgZGV2aWNlcyB3aXRob3V0IG1hc2sgY2FuIHRha2UgMzIgYml0IGFkZHJlc3NlcyAqLworCXJldHVybiAweGZmZmZmZmZmdWw7CiB9CiAKLWludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCisKKy8qIEFsbG9jYXRlcyBhIGNvbnRpZ3VvdXMgcmVhbCBidWZmZXIgYW5kIGNyZWF0ZXMgbWFwcGluZ3Mgb3ZlciBpdC4KKyAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZCBzZXRzIGRtYV9oYW5kbGUKKyAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCisgKi8KK3N0YXRpYyB2b2lkICpkbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwotCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCXJldHVybiBkbWFfb3BzLT5kbWFfc3VwcG9ydGVkKGRldiwgbWFzayk7CisJcmV0dXJuIGlvbW11X2FsbG9jX2NvaGVyZW50KGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNpemUsIGRtYV9oYW5kbGUsCisJCQkJICAgIGRldmljZV90b19tYXNrKGRldiksIGZsYWcsCisJCQkJICAgIGRldi0+YXJjaGRhdGEubnVtYV9ub2RlKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX3N1cHBvcnRlZCk7CiAKLWludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCitzdGF0aWMgdm9pZCBkbWFfaW9tbXVfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKLQkJcmV0dXJuIHBjaV9zZXRfZG1hX21hc2sodG9fcGNpX2RldihkZXYpLCBkbWFfbWFzayk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSUJNVklPCi0JaWYgKGRldi0+YnVzID09ICZ2aW9fYnVzX3R5cGUpCi0JCXJldHVybiAtRUlPOwotI2VuZGlmIC8qIENPTkZJR19JQk1WSU8gKi8KLSNpZmRlZiBDT05GSUdfSUJNRUJVUwotCWlmIChkZXYtPmJ1cyA9PSAmaWJtZWJ1c19idXNfdHlwZSkKLQkJcmV0dXJuIC1FSU87Ci0jZW5kaWYKLQlCVUcoKTsKLQlyZXR1cm4gMDsKKwlpb21tdV9mcmVlX2NvaGVyZW50KGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX3NldF9tYXNrKTsKIAotdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCisvKiBDcmVhdGVzIFRDRXMgZm9yIGEgdXNlciBwcm92aWRlZCBidWZmZXIuICBUaGUgdXNlciBidWZmZXIgbXVzdCBiZQorICogY29udGlndW91cyByZWFsIGtlcm5lbCBzdG9yYWdlIChub3Qgdm1hbGxvYykuICBUaGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisgKiBwYXNzZWQgaGVyZSBpcyB0aGUga2VybmVsICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHRoZSBidWZmZXIuICBUaGUgYnVmZmVyCisgKiBuZWVkIG5vdCBiZSBwYWdlIGFsaWduZWQsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIHdpbGwgcG9pbnQgdG8gdGhlIHNhbWUKKyAqIGJ5dGUgd2l0aGluIHRoZSBwYWdlIGFzIHZhZGRyLgorICovCitzdGF0aWMgZG1hX2FkZHJfdCBkbWFfaW9tbXVfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwotCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCXJldHVybiBkbWFfb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsIGZsYWcpOworCXJldHVybiBpb21tdV9tYXBfc2luZ2xlKGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHZhZGRyLCBzaXplLAorCQkJICAgICAgICBkZXZpY2VfdG9fbWFzayhkZXYpLCBkaXJlY3Rpb24pOwogfQotRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfY29oZXJlbnQpOwogCi12b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAotCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUpCisKK3N0YXRpYyB2b2lkIGRtYV9pb21tdV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJICAgc2l6ZV90IHNpemUsCisJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwotCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCWRtYV9vcHMtPmZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7CisJaW9tbXVfdW5tYXBfc2luZ2xlKGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIGRtYV9oYW5kbGUsIHNpemUsIGRpcmVjdGlvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKIAotZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNwdV9hZGRyLCBzaXplX3Qgc2l6ZSwKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQorCitzdGF0aWMgaW50IGRtYV9pb21tdV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJCSAgICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7Ci0KLQlCVUdfT04oIWRtYV9vcHMpOwotCi0JcmV0dXJuIGRtYV9vcHMtPm1hcF9zaW5nbGUoZGV2LCBjcHVfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlyZXR1cm4gaW9tbXVfbWFwX3NnKGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNnbGlzdCwgbmVsZW1zLAorCQkJICAgIGRldmljZV90b19tYXNrKGRldiksIGRpcmVjdGlvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2luZ2xlKTsKIAotdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3N0YXRpYyB2b2lkIGRtYV9pb21tdV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7Ci0KLQlCVUdfT04oIWRtYV9vcHMpOwotCi0JZG1hX29wcy0+dW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJaW9tbXVfdW5tYXBfc2coZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgc2dsaXN0LCBuZWxlbXMsIGRpcmVjdGlvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9zaW5nbGUpOwogCi1kbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAotCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKKy8qIFdlIHN1cHBvcnQgRE1BIHRvL2Zyb20gYW55IG1lbW9yeSBwYWdlIHZpYSB0aGUgaW9tbXUgKi8KK3N0YXRpYyBpbnQgZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKIHsKLQlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+YXJjaGRhdGEuZG1hX2RhdGE7CiAKLQlCVUdfT04oIWRtYV9vcHMpOwotCi0JcmV0dXJuIGRtYV9vcHMtPm1hcF9zaW5nbGUoZGV2LCBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsIHNpemUsCi0JCQlkaXJlY3Rpb24pOworCWlmICghdGJsIHx8IHRibC0+aXRfb2Zmc2V0ID4gbWFzaykgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiV2FybmluZzogSU9NTVUgb2Zmc2V0IHRvbyBiaWcgZm9yIGRldmljZSBtYXNrXG4iKTsKKwkJaWYgKHRibCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAibWFzazogMHglMDhseCwgdGFibGUgb2Zmc2V0OiAweCUwOGx4XG4iLAorCQkJCW1hc2ssIHRibC0+aXRfb2Zmc2V0KTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFzazogMHglMDhseCwgdGFibGUgdW5hdmFpbGFibGVcbiIsCisJCQkJbWFzayk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX21hcF9wYWdlKTsKIAotdm9pZCBkbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsIHNpemVfdCBzaXplLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9pb21tdV9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50CT0gZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50CT0gZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zaW5nbGUJPSBkbWFfaW9tbXVfbWFwX3NpbmdsZSwKKwkudW5tYXBfc2luZ2xlCT0gZG1hX2lvbW11X3VubWFwX3NpbmdsZSwKKwkubWFwX3NnCQk9IGRtYV9pb21tdV9tYXBfc2csCisJLnVubWFwX3NnCT0gZG1hX2lvbW11X3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkCT0gZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQsCit9OworRVhQT1JUX1NZTUJPTChkbWFfaW9tbXVfb3BzKTsKKworLyoKKyAqIEdlbmVyaWMgZGlyZWN0IERNQSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYSBnbG9iYWwgb2Zmc2V0IHRoYXQgY2FuIGJlIGFwcGxpZWQgaWYKKyAqIHRoZSBhZGRyZXNzIGF0IHdoaWNoIG1lbW9yeSBpcyB2aXNpYmxlIHRvIGRldmljZXMgaXMgbm90IDAuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZG1hX2RpcmVjdF9vZmZzZXQ7CisKK3N0YXRpYyB2b2lkICpkbWFfZGlyZWN0X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCiB7Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdm9pZCAqcmV0OworCWludCBub2RlID0gZGV2LT5hcmNoZGF0YS5udW1hX25vZGU7CiAKLQlCVUdfT04oIWRtYV9vcHMpOworCS8qIFRPRE86IE1heWJlIHVzZSB0aGUgbnVtYSBub2RlIGhlcmUgdG9vID8gKi8KKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBmbGFnLCBnZXRfb3JkZXIoc2l6ZSkpOworCWlmIChwYWdlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwltZW1zZXQocmV0LCAwLCBzaXplKTsKKwkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYWJzKHJldCkgfCBkbWFfZGlyZWN0X29mZnNldDsKIAotCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyZXNzLCBzaXplLCBkaXJlY3Rpb24pOworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9wYWdlKTsKIAotaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3N0YXRpYyB2b2lkIGRtYV9kaXJlY3RfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKLQotCUJVR19PTighZG1hX29wcyk7Ci0KLQlyZXR1cm4gZG1hX29wcy0+bWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2cpOwogCi12b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuaHdlbnRyaWVzLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgZG1hX2FkZHJfdCBkbWFfZGlyZWN0X21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsCisJCQkJCXNpemVfdCBzaXplLAorCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7Ci0KLQlCVUdfT04oIWRtYV9vcHMpOwotCi0JZG1hX29wcy0+dW5tYXBfc2coZGV2LCBzZywgbmh3ZW50cmllcywgZGlyZWN0aW9uKTsKKwlyZXR1cm4gdmlydF90b19hYnMocHRyKSB8IGRtYV9kaXJlY3Rfb2Zmc2V0OwogfQotRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2cpOworCitzdGF0aWMgdm9pZCBkbWFfZGlyZWN0X3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkJICAgIHNpemVfdCBzaXplLAorCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2RpcmVjdF9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CisJCXNnLT5kbWFfYWRkcmVzcyA9IChwYWdlX3RvX3BoeXMoc2ctPnBhZ2UpICsgc2ctPm9mZnNldCkgfAorCQkJZG1hX2RpcmVjdF9vZmZzZXQ7CisJCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gbmVudHM7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kaXJlY3RfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworfQorCitzdGF0aWMgaW50IGRtYV9kaXJlY3RfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCS8qIENvdWxkIGJlIGltcHJvdmVkIHRvIGNoZWNrIGZvciBtZW1vcnkgdGhvdWdoIGl0IGJldHRlciBiZQorCSAqIGRvbmUgdmlhIHNvbWUgZ2xvYmFsIHNvIHBsYXRmb3JtcyBjYW4gc2V0IHRoZSBsaW1pdCBpbiBjYXNlCisJICogdGhleSBoYXZlIGxpbWl0ZWQgRE1BIHdpbmRvd3MKKwkgKi8KKwlyZXR1cm4gbWFzayA+PSBETUFfMzJCSVRfTUFTSzsKK30KKworc3RydWN0IGRtYV9tYXBwaW5nX29wcyBkbWFfZGlyZWN0X29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQJPSBkbWFfZGlyZWN0X2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50CT0gZG1hX2RpcmVjdF9mcmVlX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlCT0gZG1hX2RpcmVjdF9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUJPSBkbWFfZGlyZWN0X3VubWFwX3NpbmdsZSwKKwkubWFwX3NnCQk9IGRtYV9kaXJlY3RfbWFwX3NnLAorCS51bm1hcF9zZwk9IGRtYV9kaXJlY3RfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQJPSBkbWFfZGlyZWN0X2RtYV9zdXBwb3J0ZWQsCit9OworRVhQT1JUX1NZTUJPTChkbWFfZGlyZWN0X29wcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggNzQ4ZTc0Zi4uMWEzZDRkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwpAQCAtODcsMTUgKzg3LDE5IEBACiAJYWRkaQlyOSxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWxkCXIxMSxleGNlcHRpb25fbWFya2VyQHRvYyhyMikKIAlzdGQJcjExLC0xNihyOSkJCS8qICJyZWdzaGVyZSIgbWFya2VyICovCisJbGkJcjEwLDEKKwlzdGIJcjEwLFBBQ0FTT0ZUSVJRRU4ocjEzKQorCXN0YglyMTAsUEFDQUhBUkRJUlFFTihyMTMpCisJc3RkCXIxMCxTT0ZURShyMSkKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIEJFR0lOX0ZXX0ZUUl9TRUNUSU9OCiAJLyogSGFjayBmb3IgaGFuZGxpbmcgaW50ZXJydXB0cyB3aGVuIHNvZnQtZW5hYmxpbmcgb24gaVNlcmllcyAqLwogCWNtcGRpCWNyMSxyMCwweDU1NTUJCS8qIHN5c2NhbGwgMHg1NTU1ICovCiAJYW5kaS4JcjEwLHIxMixNU1JfUFIJCS8qIGZyb20ga2VybmVsICovCiAJY3JhbmQJNCpjcjArZXEsNCpjcjErZXEsNCpjcjArZXEKLQliZXEJaGFyZHdhcmVfaW50ZXJydXB0X2VudHJ5Ci0JbGJ6CXIxMCxQQUNBUFJPQ0VOQUJMRUQocjEzKQotCXN0ZAlyMTAsU09GVEUocjEpCisJYm5lCTJmCisJYgloYXJkd2FyZV9pbnRlcnJ1cHRfZW50cnkKKzI6CiBFTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKQogI2VuZGlmCiAJbWZtc3IJcjExCkBAIC00NjAsOSArNDY0LDkgQEAKICNlbmRpZgogCiByZXN0b3JlOgorCWxkCXI1LFNPRlRFKHIxKQogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogQkVHSU5fRldfRlRSX1NFQ1RJT04KLQlsZAlyNSxTT0ZURShyMSkKIAljbXBkaQkwLHI1LDAKIAliZXEJNGYKIAkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzIChpU2VyaWVzKSAqLwpAQCAtNDcyLDIxICs0NzYsMjUgQEAKIAliZXErCTRmCQkJLyogc2tpcCBkb19JUlEgaWYgbm8gaW50ZXJydXB0cyAqLwogCiAJbGkJcjMsMAotCXN0YglyMyxQQUNBUFJPQ0VOQUJMRUQocjEzKQkvKiBlbnN1cmUgd2UgYXJlIHNvZnQtZGlzYWJsZWQgKi8KKwlzdGIJcjMsUEFDQVNPRlRJUlFFTihyMTMpCS8qIGVuc3VyZSB3ZSBhcmUgc29mdC1kaXNhYmxlZCAqLwogCW9yaQlyMTAscjEwLE1TUl9FRQogCW10bXNyZAlyMTAJCQkvKiBoYXJkLWVuYWJsZSBhZ2FpbiAqLwogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlibAkuZG9fSVJRCiAJYgkucmV0X2Zyb21fZXhjZXB0X2xpdGUJCS8qIGxvb3AgYmFjayBhbmQgaGFuZGxlIG1vcmUgKi8KLQotNDoJc3RiCXI1LFBBQ0FQUk9DRU5BQkxFRChyMTMpCis0OgogRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKICNlbmRpZgorCXN0YglyNSxQQUNBU09GVElSUUVOKHIxMykKIAogCWxkCXIzLF9NU1IocjEpCiAJYW5kaS4JcjAscjMsTVNSX1JJCiAJYmVxLQl1bnJlY292X3Jlc3RvcmUKIAorCS8qIGV4dHJhY3QgRUUgYml0IGFuZCB1c2UgaXQgdG8gcmVzdG9yZSBwYWNhLT5oYXJkX2VuYWJsZWQgKi8KKwlybGRpY2wJcjQscjMsNDksNjMJCS8qIHIwID0gKHIzID4+IDE1KSAmIDEgKi8KKwlzdGIJcjQsUEFDQUhBUkRJUlFFTihyMTMpCisKIAlhbmRpLglyMCxyMyxNU1JfUFIKIAogCS8qCkBAIC01MzgsMjUgKzU0NiwxNSBAQAogCS8qIENoZWNrIHRoYXQgcHJlZW1wdF9jb3VudCgpID09IDAgYW5kIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKi8KIAlsd3oJcjgsVElfUFJFRU1QVChyOSkKIAljbXB3aQljcjEscjgsMAotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotQkVHSU5fRldfRlRSX1NFQ1RJT04KIAlsZAlyMCxTT0ZURShyMSkKIAljbXBkaQlyMCwwCi1FTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKQotI2VuZGlmCi1CRUdJTl9GV19GVFJfU0VDVElPTgotCWFuZGkuCXIwLHIzLE1TUl9FRQotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUykKIAljcmFuZGMJZXEsY3IxKjQrZXEsZXEKIAlibmUJcmVzdG9yZQogCS8qIGhlcmUgd2UgYXJlIHByZWVtcHRpbmcgdGhlIGN1cnJlbnQgdGFzayAqLwogMToKLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLUJFR0lOX0ZXX0ZUUl9TRUNUSU9OCiAJbGkJcjAsMQotCXN0YglyMCxQQUNBUFJPQ0VOQUJMRUQocjEzKQotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKLSNlbmRpZgorCXN0YglyMCxQQUNBU09GVElSUUVOKHIxMykKKwlzdGIJcjAsUEFDQUhBUkRJUlFFTihyMTMpCiAJb3JpCXIxMCxyMTAsTVNSX0VFCiAJbXRtc3JkCXIxMCwxCQkvKiByZWVuYWJsZSBpbnRlcnJ1cHRzICovCiAJYmwJLnByZWVtcHRfc2NoZWR1bGUKQEAgLTYzOSw4ICs2MzcsNyBAQAogCS8qIFRoZXJlIGlzIG5vIHdheSBpdCBpcyBhY2NlcHRhYmxlIHRvIGdldCBoZXJlIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLAogCSAqIGNoZWNrIGl0IHdpdGggdGhlIGFzbSBlcXVpdmFsZW50IG9mIFdBUk5fT04KIAkgKi8KLQltZm1zcglyNgotCWFuZGkuCXIwLHI2LE1TUl9FRQorCWxieglyMCxQQUNBU09GVElSUUVOKHIxMykKIDE6CXRkbmVpCXIwLDAKIC5zZWN0aW9uIF9fYnVnX3RhYmxlLCJhIgogCS5sbG9uZwkxYixfX0xJTkVfXyArIDB4MTAwMDAwMCwgMWYsIDJmCkBAIC02NDksNyArNjQ2LDEzIEBACiAxOgkuYXNjaXoJX19GSUxFX18KIDI6CS5hc2NpeiAiZW50ZXJfcnRhcyIKIC5wcmV2aW91cwotCQorCisJLyogSGFyZC1kaXNhYmxlIGludGVycnVwdHMgKi8KKwltZm1zcglyNgorCXJsZGljbAlyNyxyNiw0OCwxCisJcm90bGRpCXI3LHI3LDE2CisJbXRtc3JkCXI3LDEKKwogCS8qIFVuZm9ydHVuYXRlbHksIHRoZSBzdGFjayBwb2ludGVyIGFuZCB0aGUgTVNSIGFyZSBhbHNvIGNsb2JiZXJlZCwKIAkgKiBzbyB0aGV5IGFyZSBzYXZlZCBpbiB0aGUgUEFDQSB3aGljaCBhbGxvd3MgdXMgdG8gcmVzdG9yZQogCSAqIG91ciBvcmlnaW5hbCBzdGF0ZSBhZnRlciBSVEFTIHJldHVybnMuCkBAIC03MzUsOCArNzM4LDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUENfUlRBUyAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCi0KIF9HTE9CQUwoZW50ZXJfcHJvbSkKIAltZmxyCXIwCiAJc3RkCXIwLDE2KHIxKQpAQCAtODIxLDUgKzgyMiwzIEBACiAJbGQJcjAsMTYocjEpCiAJbXRsciAgICByMAogICAgICAgICBibHIKLQkKLSNlbmRpZgkvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggZTcyMDcyOS4uNzFiMWZlNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTM1LDkgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KIAotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogI2RlZmluZSBET19TT0ZUX0RJU0FCTEUKLSNlbmRpZgogCiAvKgogICogV2UgbGF5b3V0IHBoeXNpY2FsIG1lbW9yeSBhcyBmb2xsb3dzOgpAQCAtNzQsMTMgKzcyLDExIEBACiAJLnRleHQKIAkuZ2xvYmwgIF9zdGV4dAogX3N0ZXh0OgotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogX0dMT0JBTChfX3N0YXJ0KQogCS8qIE5PUCB0aGlzIG91dCB1bmNvbmRpdGlvbmFsbHkgKi8KIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYgkuX19zdGFydF9pbml0aWFsaXphdGlvbl9tdWx0aXBsYXRmb3JtCiBFTkRfRlRSX1NFQ1RJT04oMCwgMSkKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KIAogCS8qIENhdGNoIGJyYW5jaCB0byAwIGluIHJlYWwgbW9kZSAqLwogCXRyYXAKQEAgLTMwOCw3ICszMDQsOSBAQAogCXN0ZAlyOSxfTElOSyhyMSk7CQkJCQkJICAgXAogCW1mY3RyCXIxMDsJCQkvKiBzYXZlIENUUiBpbiBzdGFja2ZyYW1lCSovIFwKIAlzdGQJcjEwLF9DVFIocjEpOwkJCQkJCSAgIFwKKwlsYnoJcjEwLFBBQ0FTT0ZUSVJRRU4ocjEzKTsJCQkJICAgXAogCW1mc3ByCXIxMSxTUFJOX1hFUjsJCS8qIHNhdmUgWEVSIGluIHN0YWNrZnJhbWUJKi8gXAorCXN0ZAlyMTAsU09GVEUocjEpOwkJCQkJCSAgIFwKIAlzdGQJcjExLF9YRVIocjEpOwkJCQkJCSAgIFwKIAlsaQlyOSwobikrMTsJCQkJCQkgICBcCiAJc3RkCXI5LF9UUkFQKHIxKTsJCS8qIHNldCB0cmFwIG51bWJlcgkJKi8gXApAQCAtMzQzLDYgKzM0MSwzNCBAQAogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbikKIAogCisjZGVmaW5lIE1BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKG4sIGxhYmVsKQkJCQlcCisJLiA9IG47CQkJCQkJCQlcCisJLmdsb2JsIGxhYmVsIyNfcFNlcmllczsJCQkJCQlcCitsYWJlbCMjX3BTZXJpZXM6CQkJCQkJCVwKKwlITVRfTUVESVVNOwkJCQkJCQlcCisJbXRzcHIJU1BSTl9TUFJHMSxyMTM7CQkvKiBzYXZlIHIxMyAqLwkJCVwKKwltZnNwcglyMTMsU1BSTl9TUFJHMzsJCS8qIGdldCBwYWNhIGFkZHJlc3MgaW50byByMTMgKi8JXAorCXN0ZAlyOSxQQUNBX0VYR0VOK0VYX1I5KHIxMyk7CS8qIHNhdmUgcjksIHIxMCAqLwlcCisJc3RkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpOwkJCQlcCisJbGJ6CXIxMCxQQUNBU09GVElSUUVOKHIxMyk7CQkJCQlcCisJbWZjcglyOTsJCQkJCQkJXAorCWNtcHdpCXIxMCwwOwkJCQkJCQlcCisJYmVxCW1hc2tlZF9pbnRlcnJ1cHQ7CQkJCQlcCisJbWZzcHIJcjEwLFNQUk5fU1BSRzE7CQkJCQkJXAorCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9SMTMocjEzKTsJCQkJXAorCXN0ZAlyMTEsUEFDQV9FWEdFTitFWF9SMTEocjEzKTsJCQkJXAorCXN0ZAlyMTIsUEFDQV9FWEdFTitFWF9SMTIocjEzKTsJCQkJXAorCWNscnJkaQlyMTIscjEzLDMyOwkJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAorCW1mbXNyCXIxMDsJCQkJCQkJXAorCW1mc3ByCXIxMSxTUFJOX1NSUjA7CQkvKiBzYXZlIFNSUjAgKi8JCQlcCisJTE9BRF9IQU5ETEVSKHIxMixsYWJlbCMjX2NvbW1vbikJCQkJXAorCW9yaQlyMTAscjEwLE1TUl9JUnxNU1JfRFJ8TVNSX1JJOwkJCQlcCisJbXRzcHIJU1BSTl9TUlIwLHIxMjsJCQkJCQlcCisJbWZzcHIJcjEyLFNQUk5fU1JSMTsJCS8qIGFuZCBTUlIxICovCQkJXAorCW10c3ByCVNQUk5fU1JSMSxyMTA7CQkJCQkJXAorCXJmaWQ7CQkJCQkJCQlcCisJYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCisKICNkZWZpbmUgU1REX0VYQ0VQVElPTl9JU0VSSUVTKG4sIGxhYmVsLCBhcmVhKQkJXAogCS5nbG9ibCBsYWJlbCMjX2lTZXJpZXM7CQkJCVwKIGxhYmVsIyNfaVNlcmllczoJCQkJCVwKQEAgLTM1OCw0MCArMzg0LDMyIEBACiAJSE1UX01FRElVTTsJCQkJCQkJXAogCW10c3ByCVNQUk5fU1BSRzEscjEzOwkJLyogc2F2ZSByMTMgKi8JCQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzEoUEFDQV9FWEdFTik7CQkJCVwKLQlsYnoJcjEwLFBBQ0FQUk9DRU5BQkxFRChyMTMpOwkJCQlcCisJbGJ6CXIxMCxQQUNBU09GVElSUUVOKHIxMyk7CQkJCQlcCiAJY21wd2kJMCxyMTAsMDsJCQkJCQlcCiAJYmVxLQlsYWJlbCMjX2lTZXJpZXNfbWFza2VkOwkJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18yOwkJCQkJXAogCWIJbGFiZWwjI19jb21tb247CQkJCQkJXAogCi0jaWZkZWYgRE9fU09GVF9ESVNBQkxFCisjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAjZGVmaW5lIERJU0FCTEVfSU5UUwkJCQlcCi1CRUdJTl9GV19GVFJfU0VDVElPTjsJCQkJXAotCWxieglyMTAsUEFDQVBST0NFTkFCTEVEKHIxMyk7CVwKIAlsaQlyMTEsMDsJCQkJXAotCXN0ZAlyMTAsU09GVEUocjEpOwkJCVwKKwlzdGIJcjExLFBBQ0FTT0ZUSVJRRU4ocjEzKTsJCVwKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OOwkJCQlcCisJc3RiCXIxMSxQQUNBSEFSRElSUUVOKHIxMyk7CQlcCitFTkRfRldfRlRSX1NFQ1RJT05fSUZDTFIoRldfRkVBVFVSRV9JU0VSSUVTKTsJXAorQkVHSU5fRldfRlRSX1NFQ1RJT047CQkJCVwKIAltZm1zcglyMTA7CQkJCVwKLQlzdGIJcjExLFBBQ0FQUk9DRU5BQkxFRChyMTMpOwlcCiAJb3JpCXIxMCxyMTAsTVNSX0VFOwkJCVwKIAltdG1zcmQJcjEwLDE7CQkJCVwKIEVORF9GV19GVFJfU0VDVElPTl9JRlNFVChGV19GRUFUVVJFX0lTRVJJRVMpCiAKLSNkZWZpbmUgRU5BQkxFX0lOVFMJCQkJXAotQkVHSU5fRldfRlRSX1NFQ1RJT047CQkJCVwKLQlsYnoJcjEwLFBBQ0FQUk9DRU5BQkxFRChyMTMpOwlcCi0JbWZtc3IJcjExOwkJCQlcCi0Jc3RkCXIxMCxTT0ZURShyMSk7CQkJXAotCW9yaQlyMTEscjExLE1TUl9FRTsJCQlcCi1FTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKTsJXAotQkVHSU5fRldfRlRSX1NFQ1RJT047CQkJCVwKLQlsZAlyMTIsX01TUihyMSk7CQkJXAotCW1mbXNyCXIxMTsJCQkJXAotCXJsd2ltaQlyMTEscjEyLDAsTVNSX0VFOwkJXAotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUyk7CVwKLQltdG1zcmQJcjExLDEKKyNlbHNlCisjZGVmaW5lIERJU0FCTEVfSU5UUwkJCQlcCisJbGkJcjExLDA7CQkJCVwKKwlzdGIJcjExLFBBQ0FTT0ZUSVJRRU4ocjEzKTsJCVwKKwlzdGIJcjExLFBBQ0FIQVJESVJRRU4ocjEzKQogCi0jZWxzZQkvKiBoYXJkIGVuYWJsZS9kaXNhYmxlIGludGVycnVwdHMgKi8KLSNkZWZpbmUgRElTQUJMRV9JTlRTCisjZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCiAKICNkZWZpbmUgRU5BQkxFX0lOVFMJCQkJXAogCWxkCXIxMixfTVNSKHIxKTsJCQlcCkBAIC0zOTksOCArNDE3LDYgQEAKIAlybHdpbWkJcjExLHIxMiwwLE1TUl9FRTsJCVwKIAltdG1zcmQJcjExLDEKIAotI2VuZGlmCi0KICNkZWZpbmUgU1REX0VYQ0VQVElPTl9DT01NT04odHJhcCwgbGFiZWwsIGhkbHIpCQlcCiAJLmFsaWduCTc7CQkJCQlcCiAJLmdsb2JsIGxhYmVsIyNfY29tbW9uOwkJCQlcCkBAIC01NDEsMTEgKzU1NywxMSBAQAogCW1mc3ByCXIxMixTUFJOX1NSUjEJCS8qIGFuZCBTUlIxICovCiAJYgkuc2xiX21pc3NfcmVhbG1vZGUJLyogUmVsLiBicmFuY2ggd29ya3MgaW4gcmVhbCBtb2RlICovCiAKLQlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHg1MDAsIGhhcmR3YXJlX2ludGVycnVwdCkKKwlNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDUwMCwgaGFyZHdhcmVfaW50ZXJydXB0KQogCVNURF9FWENFUFRJT05fUFNFUklFUygweDYwMCwgYWxpZ25tZW50KQogCVNURF9FWENFUFRJT05fUFNFUklFUygweDcwMCwgcHJvZ3JhbV9jaGVjaykKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHg4MDAsIGZwX3VuYXZhaWxhYmxlKQotCVNURF9FWENFUFRJT05fUFNFUklFUygweDkwMCwgZGVjcmVtZW50ZXIpCisJTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVMoMHg5MDAsIGRlY3JlbWVudGVyKQogCVNURF9FWENFUFRJT05fUFNFUklFUygweGEwMCwgdHJhcF8wYSkKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHhiMDAsIHRyYXBfMGIpCiAKQEAgLTU5Nyw3ICs2MTMsMjQgQEAKIC8qKiogcFNlcmllcyBpbnRlcnJ1cHQgc3VwcG9ydCAqKiovCiAKIAkvKiBtb3ZlZCBmcm9tIDB4ZjAwICovCi0JU1REX0VYQ0VQVElPTl9QU0VSSUVTKC4sIHBlcmZvcm1hbmNlX21vbml0b3IpCisJTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVMoLiwgcGVyZm9ybWFuY2VfbW9uaXRvcikKKworLyoKKyAqIEFuIGludGVycnVwdCBjYW1lIGluIHdoaWxlIHNvZnQtZGlzYWJsZWQ7IGNsZWFyIEVFIGluIFNSUjEsCisgKiBjbGVhciBwYWNhLT5oYXJkX2VuYWJsZWQgYW5kIHJldHVybi4KKyAqLworbWFza2VkX2ludGVycnVwdDoKKwlzdGIJcjEwLFBBQ0FIQVJESVJRRU4ocjEzKQorCW10Y3JmCTB4ODAscjkKKwlsZAlyOSxQQUNBX0VYR0VOK0VYX1I5KHIxMykKKwltZnNwcglyMTAsU1BSTl9TUlIxCisJcmxkaWNsCXIxMCxyMTAsNDgsMQkJLyogY2xlYXIgTVNSX0VFICovCisJcm90bGRpCXIxMCxyMTAsMTYKKwltdHNwcglTUFJOX1NSUjEscjEwCisJbGQJcjEwLFBBQ0FfRVhHRU4rRVhfUjEwKHIxMykKKwltZnNwcglyMTMsU1BSTl9TUFJHMQorCXJmaWQKKwliCS4KIAogCS5hbGlnbgk3CiBkb19zdGFiX2JvbHRlZF9wU2VyaWVzOgpAQCAtNzkyLDcgKzgyNSw3IEBACiAKIAljbXB3aQkwLHIyMywwCiAJYmVxCWlTZXJpZXNfc2Vjb25kYXJ5X3NtcF9sb29wCS8qIExvb3AgdW50aWwgdG9sZCB0byBnbyAqLwotCWJuZQkuX19zZWNvbmRhcnlfc3RhcnQJCS8qIExvb3AgdW50aWwgdG9sZCB0byBnbyAqLworCWJuZQlfX3NlY29uZGFyeV9zdGFydAkJLyogTG9vcCB1bnRpbCB0b2xkIHRvIGdvICovCiBpU2VyaWVzX3NlY29uZGFyeV9zbXBfbG9vcDoKIAkvKiBMZXQgdGhlIEh5cGVydmlzb3Iga25vdyB3ZSBhcmUgYWxpdmUgKi8KIAkvKiA4MDAyIGlzIGEgY2FsbCB0byBIdkNhbGxDZmc6OmdldExwcywgYSBoYXJtbGVzcyBIeXBlcnZpc29yIGZ1bmN0aW9uICovCkBAIC04MTMsNyArODQ2LDYgQEAKIAliCTFiCQkJLyogSWYgU01QIG5vdCBjb25maWd1cmVkLCBzZWNvbmRhcmllcwogCQkJCQkgKiBsb29wIGZvcmV2ZXIgKi8KIAotCS5nbG9ibCBkZWNyZW1lbnRlcl9pU2VyaWVzX21hc2tlZAogZGVjcmVtZW50ZXJfaVNlcmllc19tYXNrZWQ6CiAJLyogV2UgbWF5IG5vdCBoYXZlIGEgdmFsaWQgVE9DIHBvaW50ZXIgaW4gaGVyZS4gKi8KIAlsaQlyMTEsMQpAQCAtODI0LDcgKzg1Niw2IEBACiAJbXRzcHIJU1BSTl9ERUMscjEyCiAJLyogZmFsbCB0aHJvdWdoICovCiAKLQkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X2lTZXJpZXNfbWFza2VkCiBoYXJkd2FyZV9pbnRlcnJ1cHRfaVNlcmllc19tYXNrZWQ6CiAJbXRjcmYJMHg4MCxyOQkJLyogUmVzdG9yZSByZWdzICovCiAJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQpAQCAtOTI2LDEwICs5NTcsMTggQEAKICAqIGFueSB0YXNrIG9yIHNlbnQgYW55IHRhc2sgYSBzaWduYWwsIHlvdSBzaG91bGQgdXNlCiAgKiByZXRfZnJvbV9leGNlcHQgb3IgcmV0X2Zyb21fZXhjZXB0X2xpdGUgaW5zdGVhZCBvZiB0aGlzLgogICovCitmYXN0X2V4Y19yZXR1cm5faXJxOgkJCS8qIHJlc3RvcmVzIGlycSBzdGF0ZSB0b28gKi8KKwlsZAlyMyxTT0ZURShyMSkKKwlsZAlyMTIsX01TUihyMSkKKwlzdGIJcjMsUEFDQVNPRlRJUlFFTihyMTMpCS8qIHJlc3RvcmUgcGFjYS0+c29mdF9lbmFibGVkICovCisJcmxkaWNsCXI0LHIxMiw0OSw2MwkJLyogZ2V0IE1TUl9FRSB0byBMU0IgKi8KKwlzdGIJcjQsUEFDQUhBUkRJUlFFTihyMTMpCS8qIHJlc3RvcmUgcGFjYS0+aGFyZF9lbmFibGVkICovCisJYgkxZgorCiAJLmdsb2JsCWZhc3RfZXhjZXB0aW9uX3JldHVybgogZmFzdF9leGNlcHRpb25fcmV0dXJuOgogCWxkCXIxMixfTVNSKHIxKQotCWxkCXIxMSxfTklQKHIxKQorMToJbGQJcjExLF9OSVAocjEpCiAJYW5kaS4JcjMscjEyLE1TUl9SSQkJLyogY2hlY2sgaWYgUkkgaXMgc2V0ICovCiAJYmVxLQl1bnJlY292X2ZlcgogCkBAIC05NTIsNyArOTkxLDggQEAKIAlSRVNUXzhHUFJTKDIsIHIxKQogCiAJbWZtc3IJcjEwCi0JY2xycmRpCXIxMCxyMTAsMgkJLyogY2xlYXIgUkkgKExFIGlzIDAgYWxyZWFkeSkgKi8KKwlybGRpY2wJcjEwLHIxMCw0OCwxCQkvKiBjbGVhciBFRSAqLworCXJsZGljcglyMTAscjEwLDE2LDYxCQkvKiBjbGVhciBSSSAoTEUgaXMgMCBhbHJlYWR5KSAqLwogCW10bXNyZAlyMTAsMQogCiAJbXRzcHIJU1BSTl9TUlIxLHIxMgpAQCAtMTMyNiw2ICsxMzY2LDE2IEBACiAJICogaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkuCiAJICovCiAJYmVxCTEzZgorRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKKyNlbmRpZgorQkVHSU5fRldfRlRSX1NFQ1RJT04KKwkvKgorCSAqIEhlcmUgd2UgaGF2ZSBpbnRlcnJ1cHRzIGhhcmQtZGlzYWJsZWQsIHNvIGl0IGlzIHN1ZmZpY2llbnQKKwkgKiB0byByZXN0b3JlIHBhY2EtPntzb2Z0LGhhcmR9X2VuYWJsZSBhbmQgZ2V0IG91dC4KKwkgKi8KKwliZXEJZmFzdF9leGNfcmV0dXJuX2lycQkvKiBSZXR1cm4gZnJvbSBleGNlcHRpb24gb24gc3VjY2VzcyAqLworRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUykKKwogCS8qIEZvciBhIGhhc2ggZmFpbHVyZSwgd2UgZG9uJ3QgYm90aGVyIHJlLWVuYWJsaW5nIGludGVycnVwdHMgKi8KIAlibGUtCTEyZgogCkBAIC0xMzM3LDE0ICsxMzg3LDYgQEAKIAlsZAlyMyxTT0ZURShyMSkKIAlibAkubG9jYWxfaXJxX3Jlc3RvcmUKIAliCTExZgotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKLSNlbmRpZgotQkVHSU5fRldfRlRSX1NFQ1RJT04KLQliZXEJZmFzdF9leGNlcHRpb25fcmV0dXJuICAgLyogUmV0dXJuIGZyb20gZXhjZXB0aW9uIG9uIHN1Y2Nlc3MgKi8KLQlibGUtCTEyZgkJCS8qIEZhaWx1cmUgcmV0dXJuIGZyb20gaGFzaF9wYWdlICovCi0KLQkvKiBmYWxsIHRocm91Z2ggKi8KLUVORF9GV19GVFJfU0VDVElPTl9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpCiAKIC8qIEhlcmUgd2UgaGF2ZSBhIHBhZ2UgZmF1bHQgdGhhdCBoYXNoX3BhZ2UgY2FuJ3QgaGFuZGxlLiAqLwogaGFuZGxlX3BhZ2VfZmF1bHQ6CkBAIC0xMzYyLDYgKzE0MDQsOCBAQAogCWJsCS5iYWRfcGFnZV9mYXVsdAogCWIJLnJldF9mcm9tX2V4Y2VwdAogCisxMzoJYgkucmV0X2Zyb21fZXhjZXB0X2xpdGUKKwogLyogV2UgaGF2ZSBhIHBhZ2UgZmF1bHQgdGhhdCBoYXNoX3BhZ2UgY291bGQgaGFuZGxlIGJ1dCBIViByZWZ1c2VkCiAgKiB0aGUgUFRFIGluc2VydGlvbgogICovCkBAIC0xMzcxLDggKzE0MTUsNiBAQAogCWJsCS5sb3dfaGFzaF9mYXVsdAogCWIJLnJldF9mcm9tX2V4Y2VwdAogCi0xMzoJYgkucmV0X2Zyb21fZXhjZXB0X2xpdGUKLQogCS8qIGhlcmUgd2UgaGF2ZSBhIHNlZ21lbnQgbWlzcyAqLwogZG9fc3RlX2FsbG9jOgogCWJsCS5zdGVfYWxsb2NhdGUJCS8qIHRyeSB0byBpbnNlcnQgc3RhYiBlbnRyeSAqLwpAQCAtMTU2MCw3ICsxNjAyLDcgQEAKIAlsZAlyMSxQQUNBRU1FUkdTUChyMTMpCiAJc3ViaQlyMSxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCi0JYgkuX19zZWNvbmRhcnlfc3RhcnQKKwliCV9fc2Vjb25kYXJ5X3N0YXJ0CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwpAQCAtMTU5NSw3ICsxNjM3LDYgQEAKIAliCS5zdGFydF9oZXJlX2NvbW1vbgogI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCiAKIF9TVEFUSUMoX19tbXVfb2ZmKQogCW1mbXNyCXIzCkBAIC0xNjIxLDEzICsxNjYyLDExIEBACiAgKgogICovCiBfR0xPQkFMKF9fc3RhcnRfaW5pdGlhbGl6YXRpb25fbXVsdGlwbGF0Zm9ybSkKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIAkvKgogCSAqIEFyZSB3ZSBib290ZWQgZnJvbSBhIFBST00gT2YtdHlwZSBjbGllbnQtaW50ZXJmYWNlID8KIAkgKi8KIAljbXBsZGkJY3IwLHI1LDAKIAlibmUJLl9fYm9vdF9mcm9tX3Byb20JCS8qIHllcyAtPiBwcm9tICovCi0jZW5kaWYKIAogCS8qIFNhdmUgcGFyYW1ldGVycyAqLwogCW1yCXIzMSxyMwpAQCAtMTY1Niw3ICsxNjk1LDYgQEAKIAlibAkuX19tbXVfb2ZmCiAJYgkuX19hZnRlcl9wcm9tX3N0YXJ0CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIF9TVEFUSUMoX19ib290X2Zyb21fcHJvbSkKIAkvKiBTYXZlIHBhcmFtZXRlcnMgKi8KIAltcglyMzEscjMKQEAgLTE2OTYsNyArMTczNCw2IEBACiAJYmwJLnByb21faW5pdAogCS8qIFdlIG5ldmVyIHJldHVybiAqLwogCXRyYXAKLSNlbmRpZgogCiAvKgogICogQXQgdGhpcyBwb2ludCwgcjMgY29udGFpbnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2UgYXJlIHJ1bm5pbmcgYXQsCkBAIC0xNzUyLDggKzE3ODksNiBAQAogCWJsCS5jb3B5X2FuZF9mbHVzaAkJLyogY29weSB0aGUgcmVzdCAqLwogCWIJLnN0YXJ0X2hlcmVfbXVsdGlwbGF0Zm9ybQogCi0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCi0KIC8qCiAgKiBDb3B5IHJvdXRpbmUgdXNlZCB0byBjb3B5IHRoZSBrZXJuZWwgdG8gc3RhcnQgYXQgcGh5c2ljYWwgYWRkcmVzcyAwCiAgKiBhbmQgZmx1c2ggYW5kIGludmFsaWRhdGUgdGhlIGNhY2hlcyBhcyBuZWVkZWQuCkBAIC0xODM2LDcgKzE4NzEsNyBAQAogCWxkCXIxLFBBQ0FFTUVSR1NQKHIxMykKIAlzdWJpCXIxLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAKLQliCS5fX3NlY29uZGFyeV9zdGFydAorCWIJX19zZWNvbmRhcnlfc3RhcnQKIAogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCkBAIC0xODUzLDcgKzE4ODgsNyBAQAogICogICByMTMgICA9IHBhY2EgdmlydHVhbCBhZGRyZXNzCiAgKiAgIFNQUkczID0gcGFjYSB2aXJ0dWFsIGFkZHJlc3MKICAqLwotX0dMT0JBTChfX3NlY29uZGFyeV9zdGFydCkKK19fc2Vjb25kYXJ5X3N0YXJ0OgogCS8qIFNldCB0aHJlYWQgcHJpb3JpdHkgdG8gTUVESVVNICovCiAJSE1UX01FRElVTQogCkBAIC0xODc3LDExICsxOTEyLDE2IEBACiAJLyogZW5hYmxlIE1NVSBhbmQganVtcCB0byBzdGFydF9zZWNvbmRhcnkgKi8KIAlMT0FEX1JFR19BRERSKHIzLCAuc3RhcnRfc2Vjb25kYXJ5X3Byb2xvZykKIAlMT0FEX1JFR19JTU1FRElBVEUocjQsIE1TUl9LRVJORUwpCi0jaWZkZWYgRE9fU09GVF9ESVNBQkxFCisjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiBCRUdJTl9GV19GVFJfU0VDVElPTgogCW9yaQlyNCxyNCxNU1JfRUUKIEVORF9GV19GVFJfU0VDVElPTl9JRlNFVChGV19GRUFUVVJFX0lTRVJJRVMpCiAjZW5kaWYKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OCisJc3RiCXI3LFBBQ0FTT0ZUSVJRRU4ocjEzKQorCXN0YglyNyxQQUNBSEFSRElSUUVOKHIxMykKK0VORF9GV19GVFJfU0VDVElPTl9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpCisKIAltdHNwcglTUFJOX1NSUjAscjMKIAltdHNwcglTUFJOX1NSUjEscjQKIAlyZmlkCkBAIC0xOTEzLDcgKzE5NTMsNiBAQAogCWlzeW5jCiAJYmxyCiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIC8qCiAgKiBUaGlzIGlzIHdoZXJlIHRoZSBtYWluIGtlcm5lbCBjb2RlIHN0YXJ0cy4KICAqLwpAQCAtMTk3Nyw3ICsyMDE2LDYgQEAKIAltdHNwcglTUFJOX1NSUjEscjQKIAlyZmlkCiAJYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCi0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCiAJCiAJLyogVGhpcyBpcyB3aGVyZSBhbGwgcGxhdGZvcm1zIGNvbnZlcmdlIGV4ZWN1dGlvbiAqLwogX1NUQVRJQyhzdGFydF9oZXJlX2NvbW1vbikKQEAgLTIwMDUsMTUgKzIwNDMsMTggQEAKIAogCS8qIExvYWQgdXAgdGhlIGtlcm5lbCBjb250ZXh0ICovCiA1OgotI2lmZGVmIERPX1NPRlRfRElTQUJMRQotQkVHSU5fRldfRlRSX1NFQ1RJT04KIAlsaQlyNSwwCi0Jc3RiCXI1LFBBQ0FQUk9DRU5BQkxFRChyMTMpCS8qIFNvZnQgRGlzYWJsZWQgKi8KKwlzdGIJcjUsUEFDQVNPRlRJUlFFTihyMTMpCS8qIFNvZnQgRGlzYWJsZWQgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OCiAJbWZtc3IJcjUKIAlvcmkJcjUscjUsTVNSX0VFCQkvKiBIYXJkIEVuYWJsZWQgKi8KIAltdG1zcmQJcjUKIEVORF9GV19GVFJfU0VDVElPTl9JRlNFVChGV19GRUFUVVJFX0lTRVJJRVMpCiAjZW5kaWYKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OCisJc3RiCXI1LFBBQ0FIQVJESVJRRU4ocjEzKQorRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUykKIAogCWJsIC5zdGFydF9rZXJuZWwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwppbmRleCAzOWRiN2EzLi44MmJkMmYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgaWJtZWJ1c19kbWFfb3BzID0geworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgaWJtZWJ1c19kbWFfb3BzID0gewogCS5hbGxvY19jb2hlcmVudCA9IGlibWVidXNfYWxsb2NfY29oZXJlbnQsCiAJLmZyZWVfY29oZXJlbnQgID0gaWJtZWJ1c19mcmVlX2NvaGVyZW50LAogCS5tYXBfc2luZ2xlICAgICA9IGlibWVidXNfbWFwX3NpbmdsZSwKQEAgLTE3Niw2ICsxNzYsMTAgQEAKIAlkZXYtPm9mZGV2LmRldi5idXMgICAgID0gJmlibWVidXNfYnVzX3R5cGU7CiAJZGV2LT5vZmRldi5kZXYucmVsZWFzZSA9IGlibWVidXNfZGV2X3JlbGVhc2U7CiAKKwlkZXYtPm9mZGV2LmRldi5hcmNoZGF0YS5vZl9ub2RlID0gZGV2LT5vZmRldi5ub2RlOworCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmaWJtZWJ1c19kbWFfb3BzOworCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IG9mX25vZGVfdG9fbmlkKGRldi0+b2ZkZXYubm9kZSk7CisKIAkvKiBBbiBpYm1lYnVzZGV2IGlzIGJhc2VkIG9uIGEgb2ZfZGV2aWNlLiBXZSBoYXZlIHRvIGNoYW5nZSB0aGUKIAkgKiBidXMgdHlwZSB0byB1c2Ugb3VyIG93biBETUEgbWFwcGluZyBvcGVyYXRpb25zLiAKIAkgKi8gICAgICAgCkBAIC0yMTAsMTEgKzIxNCwxMCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtZWJ1c19kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtZWJ1c19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBpYm1lYnVzX2RldikpOwogCiAJZGV2LT5vZmRldi5ub2RlID0gb2Zfbm9kZV9nZXQoZG4pOwogICAgICAgIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYwppbmRleCA0MTgwYzM5Li44OTk0YWYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYwpAQCAtMzksNiArMzksMTMgQEAKICNkZWZpbmUgY3B1X3Nob3VsZF9kaWUoKQkwCiAjZW5kaWYKIAorc3RhdGljIGludCBfX2luaXQgcG93ZXJzYXZlX29mZihjaGFyICphcmcpCit7CisJcHBjX21kLnBvd2VyX3NhdmUgPSBOVUxMOworCXJldHVybiAwOworfQorX19zZXR1cCgicG93ZXJzYXZlPW9mZiIsIHBvd2Vyc2F2ZV9vZmYpOworCiAvKgogICogVGhlIGJvZHkgb2YgdGhlIGlkbGUgdGFzay4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCmluZGV4IDMwZGU4MWQuLmJhMzE5NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMKQEAgLTMwLDYgKzMwLDEzIEBACiAJYmVxbHIKIAogCS8qIEdvIHRvIE5BUCBub3cgKi8KKwltZm1zcglyNworCXJsZGljbAlyMCxyNyw0OCwxCisJcm90bGRpCXIwLHIwLDE2CisJbXRtc3JkCXIwLDEJCQkvKiBoYXJkLWRpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXIwLDEKKwlzdGIJcjAsUEFDQVNPRlRJUlFFTihyMTMpCS8qIHdlJ2xsIGhhcmQtZW5hYmxlIHNob3J0bHkgKi8KKwlzdGIJcjAsUEFDQUhBUkRJUlFFTihyMTMpCiBCRUdJTl9GVFJfU0VDVElPTgogCURTU0FMTAogCXN5bmMKQEAgLTM4LDcgKzQ1LDYgQEAKIAlsZAlyOCxUSV9MT0NBTF9GTEFHUyhyOSkJLyogc2V0IG5hcHBpbmcgYml0ICovCiAJb3JpCXI4LHI4LF9UTEZfTkFQUElORwkvKiBzbyB3aGVuIHdlIHRha2UgYW4gZXhjZXB0aW9uICovCiAJc3RkCXI4LFRJX0xPQ0FMX0ZMQUdTKHI5KQkvKiBpdCB3aWxsIHJldHVybiB0byBvdXIgY2FsbGVyICovCi0JbWZtc3IJcjcKIAlvcmkJcjcscjcsTVNSX0VFCiAJb3JpcwlyNyxyNyxNU1JfUE9XQGgKIDE6CXN5bmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYwppbmRleCBlOTgxODA2Li4zNGFlMTE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCkBAIC0yNSwxMyArMjUsMTEgQEAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAKLXZvaWQgX2luc2Iodm9sYXRpbGUgdTggX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KQordm9pZCBfaW5zYihjb25zdCB2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCiB7CiAJdTggKnRidWYgPSBidWY7CiAJdTggdG1wOwogCi0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCiAJaWYgKHVubGlrZWx5KGNvdW50IDw9IDApKQogCQlyZXR1cm47CiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CkBAIC00OCw4ICs0Niw2IEBACiB7CiAJY29uc3QgdTggKnRidWYgPSBidWY7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTYwLDEzICs1NiwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChfb3V0c2IpOwogCi12b2lkIF9pbnN3X25zKHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCit2b2lkIF9pbnN3X25zKGNvbnN0IHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCiB7CiAJdTE2ICp0YnVmID0gYnVmOwogCXUxNiB0bXA7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTgzLDggKzc3LDYgQEAKIHsKIAljb25zdCB1MTYgKnRidWYgPSBidWY7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTk1LDEzICs4NywxMSBAQAogfQogRVhQT1JUX1NZTUJPTChfb3V0c3dfbnMpOwogCi12b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCit2b2lkIF9pbnNsX25zKGNvbnN0IHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCiB7CiAJdTMyICp0YnVmID0gYnVmOwogCXUzMiB0bXA7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTExOCw4ICsxMDgsNiBAQAogewogCWNvbnN0IHUzMiAqdGJ1ZiA9IGJ1ZjsKIAotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQogCWlmICh1bmxpa2VseShjb3VudCA8PSAwKSkKIAkJcmV0dXJuOwogCWFzbSB2b2xhdGlsZSgic3luYyIpOwpAQCAtMTI5LDMgKzExNyw5MCBAQAogCWFzbSB2b2xhdGlsZSgic3luYyIpOwogfQogRVhQT1JUX1NZTUJPTChfb3V0c2xfbnMpOworCisjZGVmaW5lIElPX0NIRUNLX0FMSUdOKHYsYSkgKCgoKHVuc2lnbmVkIGxvbmcpKHYpKSAmICgoYSkgLSAxKSkgPT0gMCkKKwordm9pZCBfbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl2b2lkICpwID0gKHZvaWQgX19mb3JjZSAqKWFkZHI7CisJdTMyIGxjID0gYzsKKwlsYyB8PSBsYyA8PCA4OworCWxjIHw9IGxjIDw8IDE2OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJd2hpbGUobiAmJiAhSU9fQ0hFQ0tfQUxJR04ocCwgNCkpIHsKKwkJKigodm9sYXRpbGUgdTggKilwKSA9IGM7CisJCXArKzsKKwkJbi0tOworCX0KKwl3aGlsZShuID49IDQpIHsKKwkJKigodm9sYXRpbGUgdTMyICopcCkgPSBsYzsKKwkJcCArPSA0OworCQluIC09IDQ7CisJfQorCXdoaWxlKG4pIHsKKwkJKigodm9sYXRpbGUgdTggKilwKSA9IGM7CisJCXArKzsKKwkJbi0tOworCX0KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKK30KK0VYUE9SVF9TWU1CT0woX21lbXNldF9pbyk7CisKK3ZvaWQgX21lbWNweV9mcm9taW8odm9pZCAqZGVzdCwgY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzcmMsCisJCSAgICB1bnNpZ25lZCBsb25nIG4pCit7CisJdm9pZCAqdnNyYyA9ICh2b2lkIF9fZm9yY2UgKikgc3JjOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJd2hpbGUobiAmJiAoIUlPX0NIRUNLX0FMSUdOKHZzcmMsIDQpIHx8ICFJT19DSEVDS19BTElHTihkZXN0LCA0KSkpIHsKKwkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwkJdnNyYysrOworCQlkZXN0Kys7CisJCW4tLTsKKwl9CisJd2hpbGUobiA+IDQpIHsKKwkJKigodTMyICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1MzIgKil2c3JjKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOworCQl2c3JjICs9IDQ7CisJCWRlc3QgKz0gNDsKKwkJbiAtPSA0OworCX0KKwl3aGlsZShuKSB7CisJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJCXZzcmMrKzsKKwkJZGVzdCsrOworCQluLS07CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOworfQorRVhQT1JUX1NZTUJPTChfbWVtY3B5X2Zyb21pbyk7CisKK3ZvaWQgX21lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdm9pZCAqdmRlc3QgPSAodm9pZCBfX2ZvcmNlICopIGRlc3Q7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwl3aGlsZShuICYmICghSU9fQ0hFQ0tfQUxJR04odmRlc3QsIDQpIHx8ICFJT19DSEVDS19BTElHTihzcmMsIDQpKSkgeworCQkqKCh2b2xhdGlsZSB1OCAqKXZkZXN0KSA9ICooKHU4ICopc3JjKTsKKwkJc3JjKys7CisJCXZkZXN0Kys7CisJCW4tLTsKKwl9CisJd2hpbGUobiA+IDQpIHsKKwkJKigodm9sYXRpbGUgdTMyICopdmRlc3QpID0gKigodm9sYXRpbGUgdTMyICopc3JjKTsKKwkJc3JjICs9IDQ7CisJCXZkZXN0ICs9IDQ7CisJCW4tPTQ7CisJfQorCXdoaWxlKG4pIHsKKwkJKigodm9sYXRpbGUgdTggKil2ZGVzdCkgPSAqKCh1OCAqKXNyYyk7CisJCXNyYysrOworCQl2ZGVzdCsrOworCQluLS07CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOworfQorRVhQT1JUX1NZTUJPTChfbWVtY3B5X3RvaW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jCmluZGV4IGExM2E5M2QuLmM2ODExMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXJldHVybiAodm9pZCBfX2lvbWVtICopIChwb3J0K3BjaV9pb19iYXNlKTsKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAocG9ydCArIF9JT19CQVNFKTsKIH0KIAogdm9pZCBpb3BvcnRfdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCmluZGV4IGJhNmI3MjUuLjk1ZWRhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKQEAgLTI1OCw5ICsyNTgsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih0YmwtPml0X2xvY2spLCBmbGFncyk7CiB9CiAKLWludCBpb21tdV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsCi0JCXVuc2lnbmVkIGxvbmcgbWFzaywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoraW50IGlvbW11X21hcF9zZyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCSBpbnQgbmVsZW1zLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJZG1hX2FkZHJfdCBkbWFfbmV4dCA9IDAsIGRtYV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCA1ZTM3YmYxLi4wYmQ4Yzc2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTY0LDggKzY0LDkgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUworI2lmZGVmIENPTkZJR19QUEM2NAogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjZW5kaWYKIAogaW50IF9faXJxX29mZnNldF92YWx1ZTsKQEAgLTk1LDYgKzk2LDc0IEBACiBFWFBPUlRfU1lNQk9MKGlycV9kZXNjKTsKIAogaW50IGRpc3RyaWJ1dGVfaXJxcyA9IDE7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfaGFyZF9lbmFibGVkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBlbmFibGVkOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxieiAlMCwlMSgxMykiCisJOiAiPXIiIChlbmFibGVkKSA6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBoYXJkX2VuYWJsZWQpKSk7CisKKwlyZXR1cm4gZW5hYmxlZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zb2Z0X2VuYWJsZWQodW5zaWduZWQgbG9uZyBlbmFibGUpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YiAlMCwlMSgxMykiCisJOiA6ICJyIiAoZW5hYmxlKSwgImkiIChvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNvZnRfZW5hYmxlZCkpKTsKK30KKwordm9pZCBsb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGVuKQoreworCS8qCisJICogZ2V0X3BhY2EoKS0+c29mdF9lbmFibGVkID0gZW47CisJICogSXMgaXQgZXZlciB2YWxpZCB0byB1c2UgbG9jYWxfaXJxX3Jlc3RvcmUoMCkgd2hlbiBzb2Z0X2VuYWJsZWQgaXMgMT8KKwkgKiBUaGF0IHdhcyBhbGxvd2VkIGJlZm9yZSwgYW5kIGluIHN1Y2ggYSBjYXNlIHdlIGRvIG5lZWQgdG8gdGFrZSBjYXJlCisJICogdGhhdCBnY2Mgd2lsbCBzZXQgc29mdF9lbmFibGVkIGRpcmVjdGx5IHZpYSByMTMsIG5vdCBjaG9vc2UgdG8gdXNlCisJICogYW4gaW50ZXJtZWRpYXRlIHJlZ2lzdGVyLCBsZXN0IHdlJ3JlIHByZWVtcHRlZCB0byBhIGRpZmZlcmVudCBjcHUuCisJICovCisJc2V0X3NvZnRfZW5hYmxlZChlbik7CisJaWYgKCFlbikKKwkJcmV0dXJuOworCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpIHsKKwkJLyoKKwkJICogRG8gd2UgbmVlZCB0byBkaXNhYmxlIHByZWVtcHRpb24gaGVyZT8gIE5vdCByZWFsbHk6IGluIHRoZQorCQkgKiB1bmxpa2VseSBldmVudCB0aGF0IHdlJ3JlIHByZWVtcHRlZCB0byBhIGRpZmZlcmVudCBjcHUgaW4KKwkJICogYmV0d2VlbiBnZXR0aW5nIHIxMywgbG9hZGluZyBpdHMgbHBwYWNhX3B0ciwgYW5kIGxvYWRpbmcKKwkJICogaXRzIGFueV9pbnQsIHdlIG1pZ2h0IGNhbGwgaXNlcmllc19oYW5kbGVfaW50ZXJydXB0cyB3aXRob3V0CisJCSAqIGFuIGludGVycnVwdCBwZW5kaW5nIG9uIHRoZSBuZXcgY3B1LCBidXQgdGhhdCdzIG5vIGRpc2FzdGVyLAorCQkgKiBpcyBpdD8gIEFuZCB0aGUgYnVzaW5lc3Mgb2YgcHJlZW1wdGluZyB1cyBvZmYgdGhlIG9sZCBjcHUKKwkJICogd291bGQgaXRzZWxmIGludm9sdmUgYSBsb2NhbF9pcnFfcmVzdG9yZSB3aGljaCBoYW5kbGVzIHRoZQorCQkgKiBpbnRlcnJ1cHQgdG8gdGhhdCBjcHUuCisJCSAqCisJCSAqIEJ1dCB1c2UgImxvY2FsX3BhY2EtPmxwcGFjYV9wdHIiIGluc3RlYWQgb2YgImdldF9scHBhY2EoKSIKKwkJICogdG8gYXZvaWQgYW55IHByZWVtcHRpb24gY2hlY2tpbmcgYWRkZWQgaW50byBnZXRfcGFjYSgpLgorCQkgKi8KKwkJaWYgKGxvY2FsX3BhY2EtPmxwcGFjYV9wdHItPmludF9kd29yZC5hbnlfaW50KQorCQkJaXNlcmllc19oYW5kbGVfaW50ZXJydXB0cygpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBpZiAoZ2V0X3BhY2EoKS0+aGFyZF9lbmFibGVkKSByZXR1cm47CisJICogQnV0IGFnYWluIHdlIG5lZWQgdG8gdGFrZSBjYXJlIHRoYXQgZ2NjIGdldHMgaGFyZF9lbmFibGVkIGRpcmVjdGx5CisJICogdmlhIHIxMywgbm90IGNob29zZSB0byB1c2UgYW4gaW50ZXJtZWRpYXRlIHJlZ2lzdGVyLCBsZXN0IHdlJ3JlCisJICogcHJlZW1wdGVkIHRvIGEgZGlmZmVyZW50IGNwdSBpbiBiZXR3ZWVuIHRoZSB0d28gaW5zdHJ1Y3Rpb25zLgorCSAqLworCWlmIChnZXRfaGFyZF9lbmFibGVkKCkpCisJCXJldHVybjsKKworCS8qCisJICogTmVlZCB0byBoYXJkLWVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUuICBTaW5jZSBjdXJyZW50bHkgZGlzYWJsZWQsCisJICogbm8gbmVlZCB0byB0YWtlIGZ1cnRoZXIgYXNtIHByZWNhdXRpb25zIGFnYWluc3QgcHJlZW1wdGlvbjsgYnV0CisJICogdXNlIGxvY2FsX3BhY2EgaW5zdGVhZCBvZiBnZXRfcGFjYSgpIHRvIGF2b2lkIHByZWVtcHRpb24gY2hlY2tpbmcuCisJICovCisJbG9jYWxfcGFjYS0+aGFyZF9lbmFibGVkID0gZW47CisJaWYgKChpbnQpbWZzcHIoU1BSTl9ERUMpIDwgMCkKKwkJbXRzcHIoU1BSTl9ERUMsIDEpOworCWhhcmRfaXJxX2VuYWJsZSgpOworfQogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiBpbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKQEAgLTI0Niw3ICszMTUsOCBAQAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlpZiAoZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50KSB7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykgJiYKKwkJCWdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCkgewogCQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOwogCQkvKiBTaWduYWwgYSBmYWtlIGRlY3JlbWVudGVyIGludGVycnVwdCAqLwogCQl0aW1lcl9pbnRlcnJ1cHQocmVncyk7CkBAIC02MjYsMTAgKzY5NiwxNCBAQAogCiB2b2lkIGlycV9kaXNwb3NlX21hcHBpbmcodW5zaWduZWQgaW50IHZpcnEpCiB7Ci0Jc3RydWN0IGlycV9ob3N0ICpob3N0ID0gaXJxX21hcFt2aXJxXS5ob3N0OworCXN0cnVjdCBpcnFfaG9zdCAqaG9zdDsKIAlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICh2aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuOworCisJaG9zdCA9IGlycV9tYXBbdmlycV0uaG9zdDsKIAlXQVJOX09OIChob3N0ID09IE5VTEwpOwogCWlmIChob3N0ID09IE5VTEwpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCmluZGV4IDM5N2M4M2UuLjhhMDY3MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYwpAQCAtOSw2ICs5LDM0IEBACiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogCiAvKioKKyAqIG9mX21hdGNoX25vZGUgLSBUZWxsIGlmIGFuIGRldmljZV9ub2RlIGhhcyBhIG1hdGNoaW5nIG9mX21hdGNoIHN0cnVjdHVyZQorICogQGlkczogYXJyYXkgb2Ygb2YgZGV2aWNlIG1hdGNoIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCisgKiBAbm9kZTogdGhlIG9mIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIExvdyBsZXZlbCB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgZGV2aWNlIG1hdGNoaW5nLgorICovCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9ub2RlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJCSBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJd2hpbGUgKG1hdGNoZXMtPm5hbWVbMF0gfHwgbWF0Y2hlcy0+dHlwZVswXSB8fCBtYXRjaGVzLT5jb21wYXRpYmxlWzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT5uYW1lWzBdKQorCQkJbWF0Y2ggJj0gbm9kZS0+bmFtZQorCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+bmFtZSwgbm9kZS0+bmFtZSk7CisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQorCQkJbWF0Y2ggJj0gbm9kZS0+dHlwZQorCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgbm9kZS0+dHlwZSk7CisJCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlWzBdKQorCQkJbWF0Y2ggJj0gZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwKKwkJCQkJCSAgICAgIG1hdGNoZXMtPmNvbXBhdGlibGUpOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbWF0Y2hlczsKKwkJbWF0Y2hlcysrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCiAgKiBvZl9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGFuIG9mX2RldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcKICAqIG9mX21hdGNoIHN0cnVjdHVyZQogICogQGlkczogYXJyYXkgb2Ygb2YgZGV2aWNlIG1hdGNoIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCkBAIC0yMiwzNCArNTAsNyBAQAogewogCWlmICghZGV2LT5ub2RlKQogCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAobWF0Y2hlcy0+bmFtZVswXSB8fCBtYXRjaGVzLT50eXBlWzBdIHx8IG1hdGNoZXMtPmNvbXBhdGlibGVbMF0pIHsKLQkJaW50IG1hdGNoID0gMTsKLQkJaWYgKG1hdGNoZXMtPm5hbWVbMF0pCi0JCQltYXRjaCAmPSBkZXYtPm5vZGUtPm5hbWUKLQkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPm5hbWUsIGRldi0+bm9kZS0+bmFtZSk7Ci0JCWlmIChtYXRjaGVzLT50eXBlWzBdKQotCQkJbWF0Y2ggJj0gZGV2LT5ub2RlLT50eXBlCi0JCQkJJiYgIXN0cmNtcChtYXRjaGVzLT50eXBlLCBkZXYtPm5vZGUtPnR5cGUpOwotCQlpZiAobWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkKLQkJCW1hdGNoICY9IGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+bm9kZSwKLQkJCQltYXRjaGVzLT5jb21wYXRpYmxlKTsKLQkJaWYgKG1hdGNoKQotCQkJcmV0dXJuIG1hdGNoZXM7Ci0JCW1hdGNoZXMrKzsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIG9mX2RydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKLQotCWlmICghbWF0Y2hlcykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gb2ZfbWF0Y2hfZGV2aWNlKG1hdGNoZXMsIG9mX2RldikgIT0gTlVMTDsKKwlyZXR1cm4gb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBkZXYtPm5vZGUpOwogfQogCiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXZfZ2V0KHN0cnVjdCBvZl9kZXZpY2UgKmRldikKQEAgLTcxLDk2ICs3Miw4IEBACiAJCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKIH0KIAotCi1zdGF0aWMgaW50IG9mX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycm9yID0gLUVOT0RFVjsKLQlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnY7Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2OwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCi0JZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQotCWlmICghZHJ2LT5wcm9iZSkKLQkJcmV0dXJuIGVycm9yOwotCi0Jb2ZfZGV2X2dldChvZl9kZXYpOwotCi0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZHJ2LT5tYXRjaF90YWJsZSwgb2ZfZGV2KTsKLQlpZiAobWF0Y2gpCi0JCWVycm9yID0gZHJ2LT5wcm9iZShvZl9kZXYsIG1hdGNoKTsKLQlpZiAoZXJyb3IpCi0JCW9mX2Rldl9wdXQob2ZfZGV2KTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBvZl9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIGRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKG9mX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwotCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWludCBlcnJvciA9IDA7Ci0KLQlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zdXNwZW5kKQotCQllcnJvciA9IGRydi0+c3VzcGVuZChvZl9kZXYsIHN0YXRlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQotewotCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpbnQgZXJyb3IgPSAwOwotCi0JaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lKQotCQllcnJvciA9IGRydi0+cmVzdW1lKG9mX2Rldik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgPSB7Ci0gICAgICAgLm5hbWUJPSAib2ZfcGxhdGZvcm0iLAotICAgICAgIC5tYXRjaAk9IG9mX3BsYXRmb3JtX2J1c19tYXRjaCwKLSAgICAgICAucHJvYmUJPSBvZl9kZXZpY2VfcHJvYmUsCi0gICAgICAgLnJlbW92ZQk9IG9mX2RldmljZV9yZW1vdmUsCi0gICAgICAgLnN1c3BlbmQJPSBvZl9kZXZpY2Vfc3VzcGVuZCwKLSAgICAgICAucmVzdW1lCT0gb2ZfZGV2aWNlX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9mX2J1c19kcml2ZXJfaW5pdCh2b2lkKQotewotCXJldHVybiBidXNfcmVnaXN0ZXIoJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwob2ZfYnVzX2RyaXZlcl9pbml0KTsKLQotaW50IG9mX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpCi17Ci0JLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwotCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7Ci0JZHJ2LT5kcml2ZXIuYnVzID0gJm9mX3BsYXRmb3JtX2J1c190eXBlOwotCi0JLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCi0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotfQotCi12b2lkIG9mX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydikKLXsKLQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGRldl9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgZGV2X3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldjsKIApAQCAtMjA4LDQxICsxMjEsMTEgQEAKIAlkZXZpY2VfdW5yZWdpc3Rlcigmb2ZkZXYtPmRldik7CiB9CiAKLXN0cnVjdCBvZl9kZXZpY2UqIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKLQkJCQkJICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7Ci0KLQlkZXYtPm5vZGUgPSBvZl9ub2RlX2dldChucCk7Ci0JZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmRtYV9tYXNrOwotCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKLQlkZXYtPmRldi5idXMgPSAmb2ZfcGxhdGZvcm1fYnVzX3R5cGU7Ci0JZGV2LT5kZXYucmVsZWFzZSA9IG9mX3JlbGVhc2VfZGV2OwotCi0Jc3RybGNweShkZXYtPmRldi5idXNfaWQsIGJ1c19pZCwgQlVTX0lEX1NJWkUpOwotCi0JaWYgKG9mX2RldmljZV9yZWdpc3RlcihkZXYpICE9IDApIHsKLQkJa2ZyZWUoZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGRldjsKLX0KLQorRVhQT1JUX1NZTUJPTChvZl9tYXRjaF9ub2RlKTsKIEVYUE9SVF9TWU1CT0wob2ZfbWF0Y2hfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fYnVzX3R5cGUpOwotRVhQT1JUX1NZTUJPTChvZl9yZWdpc3Rlcl9kcml2ZXIpOwotRVhQT1JUX1NZTUJPTChvZl91bnJlZ2lzdGVyX2RyaXZlcik7CiBFWFBPUlRfU1lNQk9MKG9mX2RldmljZV9yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKG9mX2RldmljZV91bnJlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0wob2ZfZGV2X2dldCk7CiBFWFBPUlRfU1lNQk9MKG9mX2Rldl9wdXQpOwotRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKTsKIEVYUE9SVF9TWU1CT0wob2ZfcmVsZWFzZV9kZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTg5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKgkJCSA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogICAgYW5kCQkgQXJuZCBCZXJnbWFubiwgSUJNIENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworCisvKgorICogVGhlIGxpc3Qgb2YgT0YgSURzIGJlbG93IGlzIHVzZWQgZm9yIG1hdGNoaW5nIGJ1cyB0eXBlcyBpbiB0aGUKKyAqIHN5c3RlbSB3aG9zZSBkZXZpY2VzIGFyZSB0byBiZSBleHBvc2VkIGFzIG9mX3BsYXRmb3JtX2RldmljZXMuCisgKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsaXN0IHZhbGlkIGZvciBtb3N0IHBsYXRmb3Jtcy4gVGhpcyBmaWxlIHByb3ZpZGVzCisgKiBmdW5jdGlvbnMgd2hvIGNhbiB0YWtlIGFuIGV4cGxpY2l0IGxpc3QgaWYgbmVjZXNzYXJ5IHRob3VnaAorICoKKyAqIFRoZSBzZWFyY2ggaXMgYWx3YXlzIHBlcmZvcm1lZCByZWN1cnNpdmVseSBsb29raW5nIGZvciBjaGlsZHJlbiBvZgorICogdGhlIHByb3ZpZGVkIGRldmljZV9ub2RlIGFuZCByZWN1cnNpdmVseSBpZiBzdWNoIGEgY2hpbGRyZW4gbWF0Y2hlcworICogYSBidXMgdHlwZSBpbiB0aGUgbGlzdAorICovCisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2RlZmF1bHRfYnVzX2lkc1tdID0geworCXsgLnR5cGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCisJeyAudHlwZSA9ICJzcGlkZXIiLCB9LAorCXsgLnR5cGUgPSAiYXhvbiIsIH0sCisJeyAudHlwZSA9ICJwbGI1IiwgfSwKKwl7IC50eXBlID0gInBsYjQiLCB9LAorCXsgLnR5cGUgPSAib3BiIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyBhdG9taWNfdCBidXNfbm9fcmVnX21hZ2ljOworCisvKgorICoKKyAqIE9GIHBsYXRmb3JtIGRldmljZSB0eXBlIGRlZmluaXRpb24gJiBiYXNlIGluZnJhc3RydWN0dXJlCisgKgorICovCisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIG9mX2RydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKKworCWlmICghbWF0Y2hlcykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gb2ZfbWF0Y2hfZGV2aWNlKG1hdGNoZXMsIG9mX2RldikgIT0gTlVMTDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnJvciA9IC1FTk9ERVY7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2OworCXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKworCWRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CisJb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisKKwlpZiAoIWRydi0+cHJvYmUpCisJCXJldHVybiBlcnJvcjsKKworCW9mX2Rldl9nZXQob2ZfZGV2KTsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRydi0+bWF0Y2hfdGFibGUsIG9mX2Rldik7CisJaWYgKG1hdGNoKQorCQllcnJvciA9IGRydi0+cHJvYmUob2ZfZGV2LCBtYXRjaCk7CisJaWYgKGVycm9yKQorCQlvZl9kZXZfcHV0KG9mX2Rldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOworCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVtb3ZlKQorCQlkcnYtPnJlbW92ZShvZl9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKKwkJZXJyb3IgPSBkcnYtPnN1c3BlbmQob2ZfZGV2LCBzdGF0ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX2RldmljZV9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIGRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaW50IGVycm9yID0gMDsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnJlc3VtZSkKKwkJZXJyb3IgPSBkcnYtPnJlc3VtZShvZl9kZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGJ1c190eXBlIG9mX3BsYXRmb3JtX2J1c190eXBlID0geworICAgICAgIC5uYW1lCT0gIm9mX3BsYXRmb3JtIiwKKyAgICAgICAubWF0Y2gJPSBvZl9wbGF0Zm9ybV9idXNfbWF0Y2gsCisgICAgICAgLnByb2JlCT0gb2ZfcGxhdGZvcm1fZGV2aWNlX3Byb2JlLAorICAgICAgIC5yZW1vdmUJPSBvZl9wbGF0Zm9ybV9kZXZpY2VfcmVtb3ZlLAorICAgICAgIC5zdXNwZW5kCT0gb2ZfcGxhdGZvcm1fZGV2aWNlX3N1c3BlbmQsCisgICAgICAgLnJlc3VtZQk9IG9mX3BsYXRmb3JtX2RldmljZV9yZXN1bWUsCit9OworRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IG9mX2J1c19kcml2ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwob2ZfYnVzX2RyaXZlcl9pbml0KTsKKworaW50IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpCit7CisJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLworCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CisJZHJ2LT5kcml2ZXIuYnVzID0gJm9mX3BsYXRmb3JtX2J1c190eXBlOworCisJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIpOworCit2b2lkIG9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIG9mX3BsYXRmb3JtX21ha2VfYnVzX2lkKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBkZXYtPm5vZGU7CisJY2hhciAqbmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwljb25zdCB1MzIgKnJlZzsKKwl1NjQgYWRkcjsKKwlsb25nIG1hZ2ljOworCisJLyoKKwkgKiBJZiBpdCdzIGEgRENSIGJhc2VkIGRldmljZSwgdXNlICdkJyBmb3IgbmF0aXZlIERDUnMKKwkgKiBhbmQgJ0QnIGZvciBNTUlPIERDUnMuCisJICovCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgImRjci1yZWciLCBOVUxMKTsKKwlpZiAocmVnKSB7CisjaWZkZWYgQ09ORklHX1BQQ19EQ1JfTkFUSVZFCisJCXNucHJpbnRmKG5hbWUsIEJVU19JRF9TSVpFLCAiZCV4LiVzIiwKKwkJCSAqcmVnLCBub2RlLT5uYW1lKTsKKyNlbHNlIC8qIENPTkZJR19QUENfRENSX05BVElWRSAqLworCQlhZGRyID0gb2ZfdHJhbnNsYXRlX2Rjcl9hZGRyZXNzKG5vZGUsICpyZWcsIE5VTEwpOworCQlpZiAoYWRkciAhPSBPRl9CQURfQUREUikgeworCQkJc25wcmludGYobmFtZSwgQlVTX0lEX1NJWkUsCisJCQkJICJEJWxseC4lcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkciwKKwkJCQkgbm9kZS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiAhQ09ORklHX1BQQ19EQ1JfTkFUSVZFICovCisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfRENSICovCisKKwkvKgorCSAqIEZvciBNTUlPLCBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwkgKi8KKwlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCWlmIChyZWcpIHsKKwkJYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5vZGUsIHJlZyk7CisJCWlmIChhZGRyICE9IE9GX0JBRF9BRERSKSB7CisJCQlzbnByaW50ZihuYW1lLCBCVVNfSURfU0laRSwKKwkJCQkgIiVsbHguJXMiLCAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIsCisJCQkJIG5vZGUtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBObyBCdXNJRCwgdXNlIHRoZSBub2RlIG5hbWUgYW5kIGFkZCBhIGdsb2JhbGx5IGluY3JlbWVudGVkCisJICogY291bnRlciAoYW5kIHByYXkuLi4pCisJICovCisJbWFnaWMgPSBhdG9taWNfYWRkX3JldHVybigxLCAmYnVzX25vX3JlZ19tYWdpYyk7CisJc25wcmludGYobmFtZSwgQlVTX0lEX1NJWkUsICIlcy4lZCIsIG5vZGUtPm5hbWUsIG1hZ2ljIC0gMSk7Cit9CisKK3N0cnVjdCBvZl9kZXZpY2UqIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKKwkJCQkJICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKwlkZXYtPm5vZGUgPSBvZl9ub2RlX2dldChucCk7CisJZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKKwlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmRtYV9tYXNrOworCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwlkZXYtPmRldi5idXMgPSAmb2ZfcGxhdGZvcm1fYnVzX3R5cGU7CisJZGV2LT5kZXYucmVsZWFzZSA9IG9mX3JlbGVhc2VfZGV2OworCWRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUgPSBucDsKKwlkZXYtPmRldi5hcmNoZGF0YS5udW1hX25vZGUgPSBvZl9ub2RlX3RvX25pZChucCk7CisKKwkvKiBXZSBkbyBub3QgZmlsbCB0aGUgRE1BIG9wcyBmb3IgcGxhdGZvcm0gZGV2aWNlcyBieSBkZWZhdWx0LgorCSAqIFRoaXMgaXMgY3VycmVudGx5IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcGxhdGZvcm0gY29kZQorCSAqIHRvIGRvIHN1Y2gsIHBvc3NpYmx5IHVzaW5nIGEgZGV2aWNlIG5vdGlmaWVyCisJICovCisKKwlpZiAoYnVzX2lkKQorCQlzdHJsY3B5KGRldi0+ZGV2LmJ1c19pZCwgYnVzX2lkLCBCVVNfSURfU0laRSk7CisJZWxzZQorCQlvZl9wbGF0Zm9ybV9tYWtlX2J1c19pZChkZXYpOworCisJaWYgKG9mX2RldmljZV9yZWdpc3RlcihkZXYpICE9IDApIHsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRldjsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSk7CisKKworCisvKioKKyAqIG9mX3BsYXRmb3JtX2J1c19jcmVhdGUgLSBDcmVhdGUgYW4gT0YgZGV2aWNlIGZvciBhIGJ1cyBub2RlIGFuZCBhbGwgaXRzCisgKiBjaGlsZHJlbi4gT3B0aW9uYWxseSByZWN1cnNpdmVseSBpbnN0YW5jaWF0ZSBtYXRjaGluZyBidXNzZXMuCisgKiBAYnVzOiBkZXZpY2Ugbm9kZSBvZiB0aGUgYnVzIHRvIGluc3RhbmNpYXRlCisgKiBAbWF0Y2hlczogbWF0Y2ggdGFibGUsIE5VTEwgdG8gdXNlIHRoZSBkZWZhdWx0LCBPRl9OT19ERUVQX1BST0JFIHRvCisgKiBkaXNhbGxvdyByZWN1cnNpdmUgY3JlYXRpb24gb2YgY2hpbGQgYnVzc2VzCisgKi8KK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1cywKKwkJCQkgIHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CisJaW50IHJjID0gMDsKKworCWZvciAoY2hpbGQgPSBOVUxMOyAoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChidXMsIGNoaWxkKSk7ICkgeworCQlwcl9kZWJ1ZygiICAgY3JlYXRlIGNoaWxkOiAlc1xuIiwgY2hpbGQtPmZ1bGxfbmFtZSk7CisJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoY2hpbGQsIE5VTEwsIHBhcmVudCk7CisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCXJjID0gLUVOT01FTTsKKwkJZWxzZSBpZiAoIW9mX21hdGNoX25vZGUobWF0Y2hlcywgY2hpbGQpKQorCQkJY29udGludWU7CisJCWlmIChyYyA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiICAgYW5kIHN1YiBidXNzZXNcbiIpOworCQkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNoaWxkLCBtYXRjaGVzLCAmZGV2LT5kZXYpOworCQl9IGlmIChyYykgeworCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG9mX3BsYXRmb3JtX2J1c19wcm9iZSAtIFByb2JlIHRoZSBkZXZpY2UtdHJlZSBmb3IgcGxhdGZvcm0gYnVzc2VzCisgKiBAcm9vdDogcGFyZW50IG9mIHRoZSBmaXJzdCBsZXZlbCB0byBwcm9iZSBvciBOVUxMIGZvciB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICogQG1hdGNoZXM6IG1hdGNoIHRhYmxlLCBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdAorICogQHBhcmVudDogcGFyZW50IHRvIGhvb2sgZGV2aWNlcyBmcm9tLCBOVUxMIGZvciB0b3BsZXZlbAorICoKKyAqIE5vdGUgdGhhdCBjaGlsZHJlbiBvZiB0aGUgcHJvdmlkZWQgcm9vdCBhcmUgbm90IGluc3RhbmNpYXRlZCBhcyBkZXZpY2VzCisgKiB1bmxlc3MgdGhlIHNwZWNpZmllZCByb290IGl0c2VsZiBtYXRjaGVzIHRoZSBidXMgbGlzdCBhbmQgaXMgbm90IE5VTEwuCisgKi8KKworaW50IG9mX3BsYXRmb3JtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QsCisJCQkgIHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdCBvZl9kZXZpY2UgKmRldjsKKwlpbnQgcmMgPSAwOworCisJaWYgKG1hdGNoZXMgPT0gTlVMTCkKKwkJbWF0Y2hlcyA9IG9mX2RlZmF1bHRfYnVzX2lkczsKKwlpZiAobWF0Y2hlcyA9PSBPRl9OT19ERUVQX1BST0JFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocm9vdCA9PSBOVUxMKQorCQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwllbHNlCisJCW9mX25vZGVfZ2V0KHJvb3QpOworCisJcHJfZGVidWcoIm9mX3BsYXRmb3JtX2J1c19wcm9iZSgpXG4iKTsKKwlwcl9kZWJ1ZygiIHN0YXJ0aW5nIGF0OiAlc1xuIiwgcm9vdC0+ZnVsbF9uYW1lKTsKKworCS8qIERvIGEgc2VsZiBjaGVjayBvZiBidXMgdHlwZSwgaWYgdGhlcmUncyBhIG1hdGNoLCBjcmVhdGUKKwkgKiBjaGlsZHJlbgorCSAqLworCWlmIChvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIHJvb3QpKSB7CisJCXByX2RlYnVnKCIgcm9vdCBtYXRjaCwgY3JlYXRlIGFsbCBzdWIgZGV2aWNlc1xuIik7CisJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUocm9vdCwgTlVMTCwgcGFyZW50KTsKKwkJaWYgKGRldiA9PSBOVUxMKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJcHJfZGVidWcoIiBjcmVhdGUgYWxsIHN1YiBidXNzZXNcbiIpOworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUocm9vdCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKKwkJZ290byBiYWlsOworCX0KKwlmb3IgKGNoaWxkID0gTlVMTDsgKGNoaWxkID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgY2hpbGQpKTsgKSB7CisJCWlmICghb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBjaGlsZCkpCisJCQljb250aW51ZTsKKworCQlwcl9kZWJ1ZygiICBtYXRjaDogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOworCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNoaWxkLCBOVUxMLCBwYXJlbnQpOworCQlpZiAoZGV2ID09IE5VTEwpCisJCQlyYyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShjaGlsZCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKKwkJaWYgKHJjKSB7CisJCQlvZl9ub2RlX3B1dChjaGlsZCk7CisJCQlicmVhazsKKwkJfQorCX0KKyBiYWlsOgorCW9mX25vZGVfcHV0KHJvb3QpOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fYnVzX3Byb2JlKTsKKworc3RhdGljIGludCBvZl9kZXZfbm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHRvX29mX2RldmljZShkZXYpLT5ub2RlID09IGRhdGE7Cit9CisKK3N0cnVjdCBvZl9kZXZpY2UgKm9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJm9mX3BsYXRmb3JtX2J1c190eXBlLAorCQkJICAgICAgTlVMTCwgbnAsIG9mX2Rldl9ub2RlX21hdGNoKTsKKwlpZiAoZGV2KQorCQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUpOworCitzdGF0aWMgaW50IG9mX2Rldl9waGFuZGxlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlwaGFuZGxlICpwaCA9IGRhdGE7CisJcmV0dXJuIHRvX29mX2RldmljZShkZXYpLT5ub2RlLT5saW51eF9waGFuZGxlID09ICpwaDsKK30KKworc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZShwaGFuZGxlIHBoKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldiA9IGJ1c19maW5kX2RldmljZSgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsCisJCQkgICAgICBOVUxMLCAmcGgsIG9mX2Rldl9waGFuZGxlX21hdGNoKTsKKwlpZiAoZGV2KQorCQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X3BoYW5kbGUpOworCisKKyNpZmRlZiBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSQorCisvKiBUaGUgcHJvYmluZyBvZiBQQ0kgY29udHJvbGxlcnMgZnJvbSBvZl9wbGF0Zm9ybSBpcyBjdXJyZW50bHkKKyAqIDY0IGJpdHMgb25seSwgbW9zdGx5IGR1ZSB0byBncmF0dWl0b3VzIGRpZmZlcmVuY2VzIGJldHdlZW4KKyAqIHRoZSAzMiBhbmQgNjQgYml0cyBQQ0kgY29kZSBvbiBQb3dlclBDIGFuZCB0aGUgMzIgYml0cyBvbmUKKyAqIGxhY2tpbmcgc29tZSBiaXRzIG5lZWRlZCBoZXJlLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9mX3BjaV9waGJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOworCisJLyogQ2hlY2sgaWYgd2UgY2FuIGRvIHRoYXQgLi4uICovCisJaWYgKHBwY19tZC5wY2lfc2V0dXBfcGhiID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyB1cCBQQ0kgYnVzICVzXG4iLCBkZXYtPm5vZGUtPmZ1bGxfbmFtZSk7CisKKwkvKiBBbGxvYyBhbmQgc2V0dXAgUEhCIGRhdGEgc3RydWN0dXJlICovCisJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldi0+bm9kZSk7CisJaWYgKCFwaGIpCisJCXJldHVybiAtRU5PREVWOworCisJLyogU2V0dXAgcGFyZW50IGluIHN5c2ZzICovCisJcGhiLT5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwkvKiBTZXR1cCB0aGUgUEhCIHVzaW5nIGFyY2ggcHJvdmlkZWQgY2FsbGJhY2sgKi8KKwlpZiAocHBjX21kLnBjaV9zZXR1cF9waGIocGhiKSkgeworCQlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihwaGIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBQcm9jZXNzICJyYW5nZXMiIHByb3BlcnR5ICovCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRldi0+bm9kZSwgMCk7CisKKwkvKiBTZXR1cCBJTyBzcGFjZS4KKwkgKiBUaGlzIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgZm9yIElTQSBJT3MsIHNvbWV0aGluZyBuZWVkcyB0byBiZSBkb25lCisJICogYWJvdXQgaXQgaWYgd2UgZXZlciBnZW5lcmFsaXplIHRoYXQgd2F5IG9mIHByb2JpbmcgUENJIGJyaWdkZXMKKwkgKi8KKwlwY2lfc2V0dXBfcGhiX2lvX2R5bmFtaWMocGhiLCAwKTsKKworCS8qIEluaXQgcGNpX2RuIGRhdGEgc3RydWN0dXJlcyAqLworCXBjaV9kZXZzX3BoYl9pbml0X2R5bmFtaWMocGhiKTsKKworCS8qIFJlZ2lzdGVyIGRldmljZXMgd2l0aCBFRUggKi8KKyNpZmRlZiBDT05GSUdfRUVICisJaWYgKGRldi0+bm9kZS0+Y2hpbGQpCisJCWVlaF9hZGRfZGV2aWNlX3RyZWVfZWFybHkoZGV2LT5ub2RlKTsKKyNlbmRpZiAvKiBDT05GSUdfRUVIICovCisKKwkvKiBTY2FuIHRoZSBidXMgKi8KKwlzY2FuX3BoYihwaGIpOworCisJLyogQ2xhaW0gcmVzb3VyY2VzLiBUaGlzIG1pZ2h0IG5lZWQgc29tZSByZXdvcmsgYXMgd2VsbCBkZXBlbmRpbmcKKwkgKiB3ZXRoZXIgd2UgYXJlIGRvaW5nIHByb2JlLW9ubHkgb3Igbm90LCBsaWtlIGFzc2lnbmluZyB1bmFzc2lnbmVkCisJICogcmVzb3VyY2VzIGV0Yy4uLgorCSAqLworCXBjaWJpb3NfY2xhaW1fb25lX2J1cyhwaGItPmJ1cyk7CisKKwkvKiBGaW5pc2ggRUVIIHNldHVwICovCisjaWZkZWYgQ09ORklHX0VFSAorCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShwaGItPmJ1cyk7CisjZW5kaWYKKworCS8qIEFkZCBwcm9iZWQgUENJIGRldmljZXMgdG8gdGhlIGRldmljZSBtb2RlbCAqLworCXBjaV9idXNfYWRkX2RldmljZXMocGhiLT5idXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3BjaV9waGJfaWRzW10gPSB7CisJeyAudHlwZSA9ICJwY2kiLCB9LAorCXsgLnR5cGUgPSAicGNpeCIsIH0sCisJeyAudHlwZSA9ICJwY2llIiwgfSwKKwl7IC50eXBlID0gInBjaWV4IiwgfSwKKwl7IC50eXBlID0gImh0IiwgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgb2ZfcGNpX3BoYl9kcml2ZXIgPSB7CisgICAgICAgLm5hbWUgPSAib2YtcGNpIiwKKyAgICAgICAubWF0Y2hfdGFibGUgPSBvZl9wY2lfcGhiX2lkcywKKyAgICAgICAucHJvYmUgPSBvZl9wY2lfcGhiX3Byb2JlLAorICAgICAgIC5kcml2ZXIgPSB7CisJICAgICAgIC5tdWx0aXRocmVhZF9wcm9iZSA9IDEsCisgICAgICAgfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IG9mX3BjaV9waGJfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm9mX3BjaV9waGJfZHJpdmVyKTsKK30KKworZGV2aWNlX2luaXRjYWxsKG9mX3BjaV9waGJfaW5pdCk7CisKKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggMGQ5ZmY3Mi4uMmY1NGNkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtOTksNyArMTAwLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAocmVzLT5lbmQgPT0gMHhmZmZmZmZmZikgewogCQkJREJHKCJQQ0k6JXMgUmVzb3VyY2UgJWQgWyUwMTZsbHgtJTAxNmxseF0gaXMgdW5hc3NpZ25lZFxuIiwKLQkJCSAgICBwY2lfbmFtZShkZXYpLCBpLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCQkgICAgcGNpX25hbWUoZGV2KSwgaSwgKHU2NClyZXMtPnN0YXJ0LCAodTY0KXJlcy0+ZW5kKTsKIAkJCXJlcy0+ZW5kIC09IHJlcy0+c3RhcnQ7CiAJCQlyZXMtPnN0YXJ0ID0gMDsKIAkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKQEAgLTExNSwxMSArMTE2LDkgQEAKIAkJaWYgKG9mZnNldCAhPSAwKSB7CiAJCQlyZXMtPnN0YXJ0ICs9IG9mZnNldDsKIAkJCXJlcy0+ZW5kICs9IG9mZnNldDsKLSNpZmRlZiBERUJVRwotCQkJcHJpbnRrKCJGaXh1cCByZXMgJWQgKCVseCkgb2YgZGV2ICVzOiAlbGx4IC0+ICVsbHhcbiIsCi0JCQkgICAgICAgaSwgcmVzLT5mbGFncywgcGNpX25hbWUoZGV2KSwKLQkJCSAgICAgICByZXMtPnN0YXJ0IC0gb2Zmc2V0LCByZXMtPnN0YXJ0KTsKLSNlbmRpZgorCQkJREJHKCJGaXh1cCByZXMgJWQgKCVseCkgb2YgZGV2ICVzOiAlbGx4IC0+ICVsbHhcbiIsCisJCQkgICAgaSwgcmVzLT5mbGFncywgcGNpX25hbWUoZGV2KSwKKwkJCSAgICAodTY0KXJlcy0+c3RhcnQgLSBvZmZzZXQsICh1NjQpcmVzLT5zdGFydCk7CiAJCX0KIAl9CiAKQEAgLTI1NSw3ICsyNTQsNyBAQAogCQkJfQogCiAJCQlEQkcoIlBDSTogYnJpZGdlIHJzcmMgJWxseC4uJWxseCAoJWx4KSwgcGFyZW50ICVwXG4iLAotCQkJCXJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzLCBwcik7CisJCQkgICAgKHU2NClyZXMtPnN0YXJ0LCAodTY0KXJlcy0+ZW5kLCByZXMtPmZsYWdzLCBwcik7CiAJCQlpZiAocHIpIHsKIAkJCQlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcmVzKSA9PSAwKQogCQkJCQljb250aW51ZTsKQEAgLTMwNiw3ICszMDUsNyBAQAogCWZvciAocCA9IHJlcy0+Y2hpbGQ7IHAgIT0gTlVMTDsgcCA9IHAtPnNpYmxpbmcpIHsKIAkJcC0+cGFyZW50ID0gcmVzOwogCQlEQkcoS0VSTl9JTkZPICJQQ0k6IHJlcGFyZW50ZWQgJXMgWyVsbHguLiVsbHhdIHVuZGVyICVzXG4iLAotCQkgICAgcC0+bmFtZSwgcC0+c3RhcnQsIHAtPmVuZCwgcmVzLT5uYW1lKTsKKwkJICAgIHAtPm5hbWUsICh1NjQpcC0+c3RhcnQsICh1NjQpcC0+ZW5kLCByZXMtPm5hbWUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM2Miw3ICszNjEsNyBAQAogCX0KIAlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcmVzKSkgewogCQlEQkcoS0VSTl9FUlIgIlBDSTogaHVoPyBjb3VsZG4ndCBtb3ZlIHRvICVsbHguLiVsbHhcbiIsCi0JCSAgICByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCSAgICAodTY0KXJlcy0+c3RhcnQsICh1NjQpcmVzLT5lbmQpOwogCQlyZXR1cm4gLTE7CQkvKiAiY2FuJ3QgaGFwcGVuIiAqLwogCX0KIAl1cGRhdGVfYnJpZGdlX2Jhc2UoYnVzLCBpKTsKQEAgLTQ4MCwxNCArNDc5LDE0IEBACiAJc3RydWN0IHJlc291cmNlICpwciwgKnIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCiAJREJHKCJQQ0k6JXM6IFJlc291cmNlICVkOiAlMDE2bGx4LSUwMTZsbHggKGY9JWx4KVxuIiwKLQkgICAgcGNpX25hbWUoZGV2KSwgaWR4LCByLT5zdGFydCwgci0+ZW5kLCByLT5mbGFncyk7CisJICAgIHBjaV9uYW1lKGRldiksIGlkeCwgKHU2NClyLT5zdGFydCwgKHU2NClyLT5lbmQsIHItPmZsYWdzKTsKIAlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOwogCWlmICghcHIgfHwgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICVkIgogCQkgICAgICAgIiBvZiBkZXZpY2UgJXNcbiIsIGlkeCwgcGNpX25hbWUoZGV2KSk7CiAJCWlmIChwcikKIAkJCURCRygiUENJOiAgcGFyZW50IGlzICVwOiAlMDE2bGx4LSUwMTZsbHggKGY9JWx4KVxuIiwKLQkJCSAgICBwciwgcHItPnN0YXJ0LCBwci0+ZW5kLCBwci0+ZmxhZ3MpOworCQkJICAgIHByLCAodTY0KXByLT5zdGFydCwgKHU2NClwci0+ZW5kLCBwci0+ZmxhZ3MpOwogCQkvKiBXZSdsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyBsYXRlciAqLwogCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQlyLT5lbmQgLT0gci0+c3RhcnQ7CkBAIC05NjAsNyArOTU5LDcgQEAKIAkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwogCQkJcmVzLT5zdGFydCA9IHJhbmdlc1syXTsKIAkJCURCRygiUENJOiBJTyAweCVsbHggLT4gMHglbGx4XG4iLAotCQkJCSAgICByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpOworCQkJICAgICh1NjQpcmVzLT5zdGFydCwgKHU2NClyZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoJCS8qIG1lbW9yeSBzcGFjZSAqLwogCQkJbWVtbm8gPSAwOwpAQCAtOTgyLDcgKzk4MSw3IEBACiAJCQkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9QUkVGRVRDSDsKIAkJCQlyZXMtPnN0YXJ0ID0gcmFuZ2VzW25hKzJdOwogCQkJCURCRygiUENJOiBNRU1bJWRdIDB4JWxseCAtPiAweCVsbHhcbiIsIG1lbW5vLAotCQkJCQkgICAgcmVzLT5zdGFydCwgcmVzLT5zdGFydCArIHNpemUgLSAxKTsKKwkJCQkgICAgKHU2NClyZXMtPnN0YXJ0LCAodTY0KXJlcy0+c3RhcnQgKyBzaXplIC0gMSk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMTI2OCw3ICsxMjY3LDEwIEBACiAJCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKIAkJCWhvc2UtPmZpcnN0X2J1c25vID0gbmV4dF9idXNubzsKIAkJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7Ci0JCWJ1cyA9IHBjaV9zY2FuX2J1cyhob3NlLT5maXJzdF9idXNubywgaG9zZS0+b3BzLCBob3NlKTsKKwkJYnVzID0gcGNpX3NjYW5fYnVzX3BhcmVudGVkKGhvc2UtPnBhcmVudCwgaG9zZS0+Zmlyc3RfYnVzbm8sCisJCQkJCSAgICBob3NlLT5vcHMsIGhvc2UpOworCQlpZiAoYnVzKQorCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogCQlob3NlLT5sYXN0X2J1c25vID0gYnVzLT5zdWJvcmRpbmF0ZTsKIAkJaWYgKHBjaV9hc3NpZ25fYWxsX2J1c2VzIHx8IG5leHRfYnVzbm8gPD0gaG9zZS0+bGFzdF9idXNubykKIAkJCW5leHRfYnVzbm8gPSBob3NlLT5sYXN0X2J1c25vICsgcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldDsKQEAgLTEyODIsMTAgKzEyODQsNiBAQAogCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcyAmJiBoYXZlX29mKQogCQlwY2liaW9zX21ha2VfT0ZfYnVzX21hcCgpOwogCi0JLyogRG8gbWFjaGluZSBkZXBlbmRlbnQgUENJIGludGVycnVwdCByb3V0aW5nICovCi0JaWYgKHBwY19tZC5wY2lfc3dpenpsZSAmJiBwcGNfbWQucGNpX21hcF9pcnEpCi0JCXBjaV9maXh1cF9pcnFzKHBwY19tZC5wY2lfc3dpenpsZSwgcHBjX21kLnBjaV9tYXBfaXJxKTsKLQogCS8qIENhbGwgbWFjaGluZSBkZXBlbmRlbnQgZml4dXAgKi8KIAlpZiAocHBjX21kLnBjaWJpb3NfZml4dXApCiAJCXBwY19tZC5wY2liaW9zX2ZpeHVwKCk7CkBAIC0xMzA4LDI1ICsxMzA2LDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLXVuc2lnbmVkIGNoYXIgX19pbml0Ci1jb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyICpwaW5wKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRldi0+c3lzZGF0YTsKLQotCWlmIChkZXYtPmJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKSB7Ci0JCXU4IHBpbiA9ICpwaW5wOwotCQlkbyB7Ci0JCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKLQkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCi0JCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQkJfSB3aGlsZSAoZGV2LT5idXMtPnNlbGYpOwotCQkqcGlucCA9IHBpbjsKLQotCQkvKiBUaGUgc2xvdCBpcyB0aGUgaWRzZWwgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLwotCX0KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKiBkZXYsIHN0cnVjdCByZXNvdXJjZSAqIHJlcywKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQogewpAQCAtMTMzOCw2ICsxMzE3LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGlvX29mZnNldDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCWludCBpOwogCiAJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gaXNhX2lvX2Jhc2U7CkBAIC0xMzkwLDggKzEzNzAsMTYgQEAKIAkJfQogCX0KIAorCS8qIFBsYXRmb3JtIHNwZWNpZmljIGJ1cyBmaXh1cHMgKi8KIAlpZiAocHBjX21kLnBjaWJpb3NfZml4dXBfYnVzKQogCQlwcGNfbWQucGNpYmlvc19maXh1cF9idXMoYnVzKTsKKworCS8qIFJlYWQgZGVmYXVsdCBJUlFzIGFuZCBmaXh1cCBpZiBuZWNlc3NhcnkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKKwkJaWYgKHBwY19tZC5wY2lfaXJxX2ZpeHVwKQorCQkJcHBjX21kLnBjaV9pcnFfZml4dXAoZGV2KTsKKwl9CiB9CiAKIGNoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKQEAgLTE1NzEsNyArMTU1OSw3IEBACiAJCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CiAJCXJlc19iaXQgPSBJT1JFU09VUkNFX01FTTsKIAl9IGVsc2UgewotCQlpb19vZmZzZXQgPSBob3NlLT5pb19iYXNlX3ZpcnQgLSBfX19JT19CQVNFOworCQlpb19vZmZzZXQgPSBob3NlLT5pb19iYXNlX3ZpcnQgLSAodm9pZCBfX2lvbWVtICopX0lPX0JBU0U7CiAJCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OwogCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKIAl9CkBAIC0xODI2LDcgKzE4MTQsOCBAQAogCQlyZXR1cm47CiAKIAlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSBfX19JT19CQVNFIC0gaG9zZS0+aW9fYmFzZV92aXJ0ICsgaG9zZS0+aW9fYmFzZV9waHlzOworCQlvZmZzZXQgPSAodm9pZCBfX2lvbWVtICopX0lPX0JBU0UgLSBob3NlLT5pb19iYXNlX3ZpcnQKKwkJCSsgaG9zZS0+aW9fYmFzZV9waHlzOwogCiAJKnN0YXJ0ID0gcnNyYy0+c3RhcnQgKyBvZmZzZXQ7CiAJKmVuZCA9IHJzcmMtPmVuZCArIG9mZnNldDsKQEAgLTE4NDUsMzUgKzE4MzQsNiBAQAogCXJlcy0+Y2hpbGQgPSBOVUxMOwogfQogCi12b2lkIF9faW9tZW0gKnBjaV9pb21hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heCkKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmFyKTsKLQl1bnNpZ25lZCBsb25nIGxlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBiYXIpOwotCi0JaWYgKCFsZW4pCi0JCXJldHVybiBOVUxMOwotCWlmIChtYXggJiYgbGVuID4gbWF4KQotCQlsZW4gPSBtYXg7Ci0JaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJcmV0dXJuIGlvcG9ydF9tYXAoc3RhcnQsIGxlbik7Ci0JaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCS8qIE5vdCBjaGVja2luZyBJT1JFU09VUkNFX0NBQ0hFQUJMRSBiZWNhdXNlIFBQQyBkb2VzCi0JCSAqIG5vdCBjdXJyZW50bHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBpb3JlbWFwIGFuZAotCQkgKiBpb3JlbWFwX25vY2FjaGUuCi0JCSAqLwotCQlyZXR1cm4gaW9yZW1hcChzdGFydCwgbGVuKTsKLQkvKiBXaGF0PyAqLwotCXJldHVybiBOVUxMOwotfQotCi12b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQkvKiBOb3RoaW5nIHRvIGRvICovCi19Ci1FWFBPUlRfU1lNQk9MKHBjaV9pb21hcCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9pb3VubWFwKTsKLQogdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UgPSBob3NlX2hlYWQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwppbmRleCA5YmFlOGE1Li42ZmE5YTBhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKQEAgLTQyLDExICs0Miw5IEBACiB1bnNpZ25lZCBsb25nIHBjaV9wcm9iZV9vbmx5ID0gMTsKIGludCBwY2lfYXNzaWduX2FsbF9idXNlcyA9IDA7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIHN0YXRpYyB2b2lkIGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkIGRvX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHN0YXRpYyB2b2lkIHBoYnNfcmVtYXBfaW8odm9pZCk7Ci0jZW5kaWYKIAogLyogcGNpX2lvX2Jhc2UgLS0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHdoaWNoIGlvIGJhcnMgYXJlIG9mZnNldHMuCiAgKiBUaGlzIGlzIHRoZSBsb3dlc3QgSS9PIGJhc2UgYWRkcmVzcyAoc28gYmFyIHZhbHVlcyBhcmUgYWx3YXlzIHBvc2l0aXZlKSwKQEAgLTYzLDcgKzYxLDcgQEAKIAogTElTVF9IRUFEKGhvc2VfbGlzdCk7CiAKLXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcGNpX2RtYV9vcHM7CitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpwY2lfZG1hX29wczsKIEVYUE9SVF9TWU1CT0wocGNpX2RtYV9vcHMpOwogCiBpbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KQEAgLTIxMiw2ICsyMTAsMTAgQEAKIAogdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKIHsKKwlzcGluX2xvY2soJmhvc2Vfc3BpbmxvY2spOworCWxpc3RfZGVsKCZwaGItPmxpc3Rfbm9kZSk7CisJc3Bpbl91bmxvY2soJmhvc2Vfc3BpbmxvY2spOworCiAJaWYgKHBoYi0+aXNfZHluYW1pYykKIAkJa2ZyZWUocGhiKTsKIH0KQEAgLTI1MSw3ICsyNTMsNiBAQAogCQlwY2liaW9zX2NsYWltX29uZV9idXMoYik7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIHN0YXRpYyB1MzIgZ2V0X2ludF9wcm9wKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBkZWYpCiB7CiAJY29uc3QgdTMyICpwcm9wOwpAQCAtMzI5LDcgKzMzMCw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAljb25zdCBjaGFyICp0eXBlOwogCi0JZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAl0eXBlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJkZXZpY2VfdHlwZSIsIE5VTEwpOwpAQCAtMzM4LDcgKzMzOSw2IEBACiAKIAlEQkcoIiAgICBjcmVhdGUgZGV2aWNlLCBkZXZmbjogJXgsIHR5cGU6ICVzXG4iLCBkZXZmbiwgdHlwZSk7CiAKLQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHBjaV9kZXYpKTsKIAlkZXYtPmJ1cyA9IGJ1czsKIAlkZXYtPnN5c2RhdGEgPSBub2RlOwogCWRldi0+ZGV2LnBhcmVudCA9IGJ1cy0+YnJpZGdlOwpAQCAtNTA2LDcgKzUwNiw2IEBACiAJCXBjaV9zY2FuX2NoaWxkX2J1cyhidXMpOwogfQogRVhQT1JUX1NZTUJPTChvZl9zY2FuX3BjaV9icmlkZ2UpOwotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwogCiB2b2lkIF9fZGV2aW5pdCBzY2FuX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CkBAIC01MTcsNyArNTE2LDcgQEAKIAogCURCRygiU2Nhbm5pbmcgUEhCICVzXG4iLCBub2RlID8gbm9kZS0+ZnVsbF9uYW1lIDogIjxOTyBOQU1FPiIpOwogCi0JYnVzID0gcGNpX2NyZWF0ZV9idXMoTlVMTCwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPm9wcywgbm9kZSk7CisJYnVzID0gcGNpX2NyZWF0ZV9idXMoaG9zZS0+cGFyZW50LCBob3NlLT5maXJzdF9idXNubywgaG9zZS0+b3BzLCBub2RlKTsKIAlpZiAoYnVzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gY3JlYXRlIGJ1cyBmb3IgUENJIGRvbWFpbiAlMDR4XG4iLAogCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlcik7CkBAIC01NDAsNyArNTM5LDcgQEAKIAl9CiAKIAltb2RlID0gUENJX1BST0JFX05PUk1BTDsKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KKwogCWlmIChub2RlICYmIHBwY19tZC5wY2lfcHJvYmVfbW9kZSkKIAkJbW9kZSA9IHBwY19tZC5wY2lfcHJvYmVfbW9kZShidXMpOwogCURCRygiICAgIHByb2JlIG1vZGU6ICVkXG4iLCBtb2RlKTsKQEAgLTU0OCw3ICs1NDcsNyBAQAogCQlidXMtPnN1Ym9yZGluYXRlID0gaG9zZS0+bGFzdF9idXNubzsKIAkJb2Zfc2Nhbl9idXMobm9kZSwgYnVzKTsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisKIAlpZiAobW9kZSA9PSBQQ0lfUFJPQkVfTk9STUFMKQogCQlob3NlLT5sYXN0X2J1c25vID0gYnVzLT5zdWJvcmRpbmF0ZSA9IHBjaV9zY2FuX2NoaWxkX2J1cyhidXMpOwogfQpAQCAtNTkyLDExICs1OTEsOSBAQAogCWlmIChwcGM2NF9pc2FicmlkZ2VfZGV2ICE9IE5VTEwpCiAJCXByaW50ayhLRVJOX0RFQlVHICJJU0EgYnJpZGdlIGF0ICVzXG4iLCBwY2lfbmFtZShwcGM2NF9pc2FicmlkZ2VfZGV2KSk7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIAlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCiAJCS8qIG1hcCBpbiBQQ0kgSS9PIHNwYWNlICovCiAJCXBoYnNfcmVtYXBfaW8oKTsKLSNlbmRpZgogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgZG9uZVxuIik7CiAKQEAgLTg3Myw4ICs4NzAsNiBAQAogCWRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2c3BlYyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLQogI2RlZmluZSBJU0FfU1BBQ0VfTUFTSyAweDEKICNkZWZpbmUgSVNBX1NQQUNFX0lPIDB4MQogCkBAIC05NzUsMTEgKzk3MCw3IEBACiAJCXJlcyA9IE5VTEw7CiAJCXBjaV9zcGFjZSA9IHJhbmdlc1swXTsKIAkJcGNpX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcpcmFuZ2VzWzFdIDw8IDMyKSB8IHJhbmdlc1syXTsKLQotCQljcHVfcGh5c19hZGRyID0gcmFuZ2VzWzNdOwotCQlpZiAobmEgPj0gMikKLQkJCWNwdV9waHlzX2FkZHIgPSAoY3B1X3BoeXNfYWRkciA8PCAzMikgfCByYW5nZXNbNF07Ci0KKwkJY3B1X3BoeXNfYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgJnJhbmdlc1szXSk7CiAJCXNpemUgPSAoKHVuc2lnbmVkIGxvbmcpcmFuZ2VzW25hKzNdIDw8IDMyKSB8IHJhbmdlc1tuYSs0XTsKIAkJcmFuZ2VzICs9IG5wOwogCQlpZiAoc2l6ZSA9PSAwKQpAQCAtMTE0NSw3ICsxMTM2LDcgQEAKIAkKIAlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQogCQlyZXR1cm4gMTsKLQlpZiAoaW91bm1hcF9leHBsaWNpdCgodm9pZCBfX2lvbWVtICopIHN0YXJ0X3ZpcnQsIHNpemUpKQorCWlmIChfX2lvdW5tYXBfZXhwbGljaXQoKHZvaWQgX19pb21lbSAqKSBzdGFydF92aXJ0LCBzaXplKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTEyMTMsMjMgKzEyMDQsNTIgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKTsKIAordm9pZCBfX2RldmluaXQgcGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRldl9hcmNoZGF0YSAqc2QgPSAmZGV2LT5kZXYuYXJjaGRhdGE7CisKKwlzZC0+b2Zfbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCisJREJHKCJQQ0kgZGV2aWNlICVzIE9GIG5vZGU6ICVzXG4iLCBwY2lfbmFtZShkZXYpLAorCSAgICBzZC0+b2Zfbm9kZSA/IHNkLT5vZl9ub2RlLT5mdWxsX25hbWUgOiAiPG5vbmU+Iik7CisKKwlzZC0+ZG1hX29wcyA9IHBjaV9kbWFfb3BzOworI2lmZGVmIENPTkZJR19OVU1BCisJc2QtPm51bWFfbm9kZSA9IHBjaWJ1c190b19ub2RlKGRldi0+YnVzKTsKKyNlbHNlCisJc2QtPm51bWFfbm9kZSA9IC0xOworI2VuZGlmCisJaWYgKHBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCkKKwkJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwKGRldik7Cit9CitFWFBPUlRfU1lNQk9MKHBjaWJpb3Nfc2V0dXBfbmV3X2RldmljZSk7CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBkb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCi0JcHBjX21kLmlvbW11X2J1c19zZXR1cChidXMpOworCWlmIChwcGNfbWQucGNpX2RtYV9idXNfc2V0dXApCisJCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cChidXMpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQotCQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwKGRldik7CisJCXBjaWJpb3Nfc2V0dXBfbmV3X2RldmljZShkZXYpOwogCi0JaWYgKHBwY19tZC5pcnFfYnVzX3NldHVwKQotCQlwcGNfbWQuaXJxX2J1c19zZXR1cChidXMpOworCS8qIFJlYWQgZGVmYXVsdCBJUlFzIGFuZCBmaXh1cCBpZiBuZWNlc3NhcnkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKKwkJaWYgKHBwY19tZC5wY2lfaXJxX2ZpeHVwKQorCQkJcHBjX21kLnBjaV9pcnFfZml4dXAoZGV2KTsKKwl9CiB9CiAKIHZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGJ1cy0+c2VsZjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKKworCURCRygicGNpYmlvc19maXh1cF9idXMoJXMpXG4iLCBucCA/IG5wLT5mdWxsX25hbWUgOiAiPD8/Pz4iKTsKIAogCWlmIChkZXYgJiYgcGNpX3Byb2JlX29ubHkgJiYKIAkgICAgKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKQEAgLTEzNDMsOCArMTM2Myw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KLQogdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kaXJlY3RfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RpcmVjdF9pb21tdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNlMDgyLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RpcmVjdF9pb21tdS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIFN1cHBvcnQgZm9yIERNQSBmcm9tIFBDSSBkZXZpY2VzIHRvIG1haW4gbWVtb3J5IG9uCi0gKiBtYWNoaW5lcyB3aXRob3V0IGFuIGlvbW11IG9yIHdpdGggZGlyZWN0bHkgYWRkcmVzc2FibGUKLSAqIFJBTSAodHlwaWNhbGx5IGEgcG1hYyB3aXRoIDJHYiBvZiBSQU0gb3IgbGVzcykKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQmVuamFtaW4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KLQotc3RhdGljIHZvaWQgKnBjaV9kaXJlY3RfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCi17Ci0Jdm9pZCAqcmV0OwotCi0JcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIGdldF9vcmRlcihzaXplKSk7Ci0JaWYgKHJldCAhPSBOVUxMKSB7Ci0JCW1lbXNldChyZXQsIDAsIHNpemUpOwotCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYWJzKHJldCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaV9kaXJlY3RfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKLX0KLQotc3RhdGljIGRtYV9hZGRyX3QgcGNpX2RpcmVjdF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuIHZpcnRfdG9fYWJzKHB0cik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaV9kaXJlY3RfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAotCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotfQotCi1zdGF0aWMgaW50IHBjaV9kaXJlY3RfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7Ci0JCXNnLT5kbWFfYWRkcmVzcyA9IHBhZ2VfdG9fcGh5cyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0OwotCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7Ci0JfQotCi0JcmV0dXJuIG5lbnRzOwotfQotCi1zdGF0aWMgdm9pZCBwY2lfZGlyZWN0X3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLX0KLQotc3RhdGljIGludCBwY2lfZGlyZWN0X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKLXsKLQlyZXR1cm4gbWFzayA8IDB4MTAwMDAwMDAwdWxsOwotfQotCi1zdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyBwY2lfZGlyZWN0X29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQgPSBwY2lfZGlyZWN0X2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50ID0gcGNpX2RpcmVjdF9mcmVlX2NvaGVyZW50LAotCS5tYXBfc2luZ2xlID0gcGNpX2RpcmVjdF9tYXBfc2luZ2xlLAotCS51bm1hcF9zaW5nbGUgPSBwY2lfZGlyZWN0X3VubWFwX3NpbmdsZSwKLQkubWFwX3NnID0gcGNpX2RpcmVjdF9tYXBfc2csCi0JLnVubWFwX3NnID0gcGNpX2RpcmVjdF91bm1hcF9zZywKLQkuZG1hX3N1cHBvcnRlZCA9IHBjaV9kaXJlY3RfZG1hX3N1cHBvcnRlZCwKLX07Ci0KLXZvaWQgX19pbml0IHBjaV9kaXJlY3RfaW9tbXVfaW5pdCh2b2lkKQotewotCXBjaV9kbWFfb3BzID0gcGNpX2RpcmVjdF9vcHM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfaW9tbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OGIyNS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9pb21tdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWlrZSBDb3JyaWdhbiAmIERhdmUgRW5nZWJyZXRzZW4sIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIFJld3JpdGUsIGNsZWFudXAsIG5ldyBhbGxvY2F0aW9uIHNjaGVtZXM6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgT2xvZiBKb2hhbnNzb24sIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIER5bmFtaWMgRE1BIG1hcHBpbmcgc3VwcG9ydCwgcGxhdGZvcm0taW5kZXBlbmRlbnQgcGFydHMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2lvbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+Ci0KLS8qCi0gKiBXZSBjYW4gdXNlIC0+c3lzZGF0YSBkaXJlY3RseSBhbmQgYXZvaWQgdGhlIGV4dHJhIHdvcmsgaW4KLSAqIHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSBzaW5jZSAtPnN5c2RhdGEgd2lsbCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKLSAqIGluIHRoZSBpb21tdSBpbml0IGNvZGUgZm9yIGFsbCBkZXZpY2VzLgotICovCi0jZGVmaW5lIFBDSV9HRVRfRE4oZGV2KSAoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSgoZGV2KS0+c3lzZGF0YSkpCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlvbW11X3RhYmxlICpkZXZpY2VfdG9fdGFibGUoc3RydWN0IGRldmljZSAqaHdkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0KLQlpZiAoIWh3ZGV2KSB7Ci0JCXBkZXYgPSBwcGM2NF9pc2FicmlkZ2VfZGV2OwotCQlpZiAoIXBkZXYpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UKLQkJcGRldiA9IHRvX3BjaV9kZXYoaHdkZXYpOwotCi0JcmV0dXJuIFBDSV9ETihQQ0lfR0VUX0ROKHBkZXYpKS0+aW9tbXVfdGFibGU7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRldmljZV90b19tYXNrKHN0cnVjdCBkZXZpY2UgKmh3ZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCi0JaWYgKCFod2RldikgewotCQlwZGV2ID0gcHBjNjRfaXNhYnJpZGdlX2RldjsKLQkJaWYgKCFwZGV2KSAvKiBUaGlzIGlzIHRoZSBiZXN0IGd1ZXNzIHdlIGNhbiBkbyAqLwotCQkJcmV0dXJuIDB4ZmZmZmZmZmZ1bDsKLQl9IGVsc2UKLQkJcGRldiA9IHRvX3BjaV9kZXYoaHdkZXYpOwotCi0JaWYgKHBkZXYtPmRtYV9tYXNrKQotCQlyZXR1cm4gcGRldi0+ZG1hX21hc2s7Ci0KLQkvKiBBc3N1bWUgZGV2aWNlcyB3aXRob3V0IG1hc2sgY2FuIHRha2UgMzIgYml0IGFkZHJlc3NlcyAqLwotCXJldHVybiAweGZmZmZmZmZmdWw7Ci19Ci0KLQotLyogQWxsb2NhdGVzIGEgY29udGlndW91cyByZWFsIGJ1ZmZlciBhbmQgY3JlYXRlcyBtYXBwaW5ncyBvdmVyIGl0LgotICogUmV0dXJucyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYW5kIHNldHMgZG1hX2hhbmRsZQotICogdG8gdGhlIGRtYSBhZGRyZXNzIChtYXBwaW5nKSBvZiB0aGUgZmlyc3QgcGFnZS4KLSAqLwotc3RhdGljIHZvaWQgKnBjaV9pb21tdV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQotewotCXJldHVybiBpb21tdV9hbGxvY19jb2hlcmVudChkZXZpY2VfdG9fdGFibGUoaHdkZXYpLCBzaXplLCBkbWFfaGFuZGxlLAotCQkJZGV2aWNlX3RvX21hc2soaHdkZXYpLCBmbGFnLAotCQkJcGNpYnVzX3RvX25vZGUodG9fcGNpX2Rldihod2RldiktPmJ1cykpOwotfQotCi1zdGF0aWMgdm9pZCBwY2lfaW9tbXVfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKLXsKLQlpb21tdV9mcmVlX2NvaGVyZW50KGRldmljZV90b190YWJsZShod2RldiksIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKLX0KLQotLyogQ3JlYXRlcyBUQ0VzIGZvciBhIHVzZXIgcHJvdmlkZWQgYnVmZmVyLiAgVGhlIHVzZXIgYnVmZmVyIG11c3QgYmUgCi0gKiBjb250aWd1b3VzIHJlYWwga2VybmVsIHN0b3JhZ2UgKG5vdCB2bWFsbG9jKS4gIFRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIKLSAqIHBhc3NlZCBoZXJlIGlzIHRoZSBrZXJuZWwgKHZpcnR1YWwpIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlci4gIFRoZSBidWZmZXIKLSAqIG5lZWQgbm90IGJlIHBhZ2UgYWxpZ25lZCwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgd2lsbCBwb2ludCB0byB0aGUgc2FtZQotICogYnl0ZSB3aXRoaW4gdGhlIHBhZ2UgYXMgdmFkZHIuCi0gKi8KLXN0YXRpYyBkbWFfYWRkcl90IHBjaV9pb21tdV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICp2YWRkciwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlyZXR1cm4gaW9tbXVfbWFwX3NpbmdsZShkZXZpY2VfdG9fdGFibGUoaHdkZXYpLCB2YWRkciwgc2l6ZSwKLQkJCSAgICAgICAgZGV2aWNlX3RvX21hc2soaHdkZXYpLCBkaXJlY3Rpb24pOwotfQotCi0KLXN0YXRpYyB2b2lkIHBjaV9pb21tdV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlpb21tdV91bm1hcF9zaW5nbGUoZGV2aWNlX3RvX3RhYmxlKGh3ZGV2KSwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uKTsKLX0KLQotCi1zdGF0aWMgaW50IHBjaV9pb21tdV9tYXBfc2coc3RydWN0IGRldmljZSAqcGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCWludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlyZXR1cm4gaW9tbXVfbWFwX3NnKHBkZXYsIGRldmljZV90b190YWJsZShwZGV2KSwgc2dsaXN0LAotCQkJbmVsZW1zLCBkZXZpY2VfdG9fbWFzayhwZGV2KSwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQgcGNpX2lvbW11X3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JaW9tbXVfdW5tYXBfc2coZGV2aWNlX3RvX3RhYmxlKHBkZXYpLCBzZ2xpc3QsIG5lbGVtcywgZGlyZWN0aW9uKTsKLX0KLQotLyogV2Ugc3VwcG9ydCBETUEgdG8vZnJvbSBhbnkgbWVtb3J5IHBhZ2UgdmlhIHRoZSBpb21tdSAqLwotc3RhdGljIGludCBwY2lfaW9tbXVfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQotewotCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsID0gZGV2aWNlX3RvX3RhYmxlKGRldik7Ci0KLQlpZiAoIXRibCB8fCB0YmwtPml0X29mZnNldCA+IG1hc2spIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiV2FybmluZzogSU9NTVUgdGFibGUgb2Zmc2V0IHRvbyBiaWcgZm9yIGRldmljZSBtYXNrXG4iKTsKLQkJaWYgKHRibCkKLQkJCXByaW50ayhLRVJOX0lORk8gIm1hc2s6IDB4JTA4bHgsIHRhYmxlIG9mZnNldDogMHglMDhseFxuIiwKLQkJCQltYXNrLCB0YmwtPml0X29mZnNldCk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIm1hc2s6IDB4JTA4bHgsIHRhYmxlIHVuYXZhaWxhYmxlXG4iLAotCQkJCW1hc2spOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KLXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcGNpX2lvbW11X29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQgPSBwY2lfaW9tbXVfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgPSBwY2lfaW9tbXVfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NpbmdsZSA9IHBjaV9pb21tdV9tYXBfc2luZ2xlLAotCS51bm1hcF9zaW5nbGUgPSBwY2lfaW9tbXVfdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cgPSBwY2lfaW9tbXVfbWFwX3NnLAotCS51bm1hcF9zZyA9IHBjaV9pb21tdV91bm1hcF9zZywKLQkuZG1hX3N1cHBvcnRlZCA9IHBjaV9pb21tdV9kbWFfc3VwcG9ydGVkLAotfTsKLQotdm9pZCBwY2lfaW9tbXVfaW5pdCh2b2lkKQotewotCXBjaV9kbWFfb3BzID0gcGNpX2lvbW11X29wczsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IDgwNzE5M2EuLjkxNzlmMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNDksNiArNDksMTAgQEAKICNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQzY0CitFWFBPUlRfU1lNQk9MKGxvY2FsX2lycV9yZXN0b3JlKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BQQzMyCiBleHRlcm4gdm9pZCB0cmFuc2Zlcl90b19oYW5kbGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggYmRiNDEyZC4uYzE4ZGJlNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTUzOCwzNSArNTM4LDMxIEBACiAJe0NQVV9GVFJfUkVBTF9MRSwgUFBDX0ZFQVRVUkVfVFJVRV9MRSwgNSwgMCwgMH0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfY3B1X3BhX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgbm9kZSkKK3N0YXRpYyB2b2lkIF9faW5pdCBzY2FuX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgbm9kZSwgdW5zaWduZWQgY2hhciAqZnRycywKKwkJCQkgdW5zaWduZWQgbG9uZyB0YWJsZWxlbiwKKwkJCQkgc3RydWN0IGlibV9wYV9mZWF0dXJlICpmcCwKKwkJCQkgdW5zaWduZWQgbG9uZyBmdF9zaXplKQogewotCXVuc2lnbmVkIGNoYXIgKnBhX2Z0cnM7Ci0JdW5zaWduZWQgbG9uZyBsZW4sIHRhYmxlbGVuLCBpLCBiaXQ7Ci0KLQlwYV9mdHJzID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLHBhLWZlYXR1cmVzIiwgJnRhYmxlbGVuKTsKLQlpZiAocGFfZnRycyA9PSBOVUxMKQotCQlyZXR1cm47CisJdW5zaWduZWQgbG9uZyBpLCBsZW4sIGJpdDsKIAogCS8qIGZpbmQgZGVzY3JpcHRvciB3aXRoIHR5cGUgPT0gMCAqLwogCWZvciAoOzspIHsKIAkJaWYgKHRhYmxlbGVuIDwgMykKIAkJCXJldHVybjsKLQkJbGVuID0gMiArIHBhX2Z0cnNbMF07CisJCWxlbiA9IDIgKyBmdHJzWzBdOwogCQlpZiAodGFibGVsZW4gPCBsZW4pCiAJCQlyZXR1cm47CQkvKiBkZXNjcmlwdG9yIDAgbm90IGZvdW5kICovCi0JCWlmIChwYV9mdHJzWzFdID09IDApCisJCWlmIChmdHJzWzFdID09IDApCiAJCQlicmVhazsKIAkJdGFibGVsZW4gLT0gbGVuOwotCQlwYV9mdHJzICs9IGxlbjsKKwkJZnRycyArPSBsZW47CiAJfQogCiAJLyogbG9vcCBvdmVyIGJpdHMgd2Uga25vdyBhYm91dCAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlibV9wYV9mZWF0dXJlcyk7ICsraSkgewotCQlzdHJ1Y3QgaWJtX3BhX2ZlYXR1cmUgKmZwID0gJmlibV9wYV9mZWF0dXJlc1tpXTsKLQotCQlpZiAoZnAtPnBhYnl0ZSA+PSBwYV9mdHJzWzBdKQorCWZvciAoaSA9IDA7IGkgPCBmdF9zaXplOyArK2ksICsrZnApIHsKKwkJaWYgKGZwLT5wYWJ5dGUgPj0gZnRyc1swXSkKIAkJCWNvbnRpbnVlOwotCQliaXQgPSAocGFfZnRyc1syICsgZnAtPnBhYnl0ZV0gPj4gKDcgLSBmcC0+cGFiaXQpKSAmIDE7CisJCWJpdCA9IChmdHJzWzIgKyBmcC0+cGFieXRlXSA+PiAoNyAtIGZwLT5wYWJpdCkpICYgMTsKIAkJaWYgKGJpdCBeIGZwLT5pbnZlcnQpIHsKIAkJCWN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzIHw9IGZwLT5jcHVfZmVhdHVyZXM7CiAJCQljdXJfY3B1X3NwZWMtPmNwdV91c2VyX2ZlYXR1cmVzIHw9IGZwLT5jcHVfdXNlcl9mdHJzOwpAQCAtNTc3LDE2ICs1NzMsNTkgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja19jcHVfcGFfZmVhdHVyZXModW5zaWduZWQgbG9uZyBub2RlKQoreworCXVuc2lnbmVkIGNoYXIgKnBhX2Z0cnM7CisJdW5zaWduZWQgbG9uZyB0YWJsZWxlbjsKKworCXBhX2Z0cnMgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJpYm0scGEtZmVhdHVyZXMiLCAmdGFibGVsZW4pOworCWlmIChwYV9mdHJzID09IE5VTEwpCisJCXJldHVybjsKKworCXNjYW5fZmVhdHVyZXMobm9kZSwgcGFfZnRycywgdGFibGVsZW4sCisJCSAgICAgIGlibV9wYV9mZWF0dXJlcywgQVJSQVlfU0laRShpYm1fcGFfZmVhdHVyZXMpKTsKK30KKworc3RhdGljIHN0cnVjdCBmZWF0dXJlX3Byb3BlcnR5IHsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBtaW5fdmFsdWU7CisJdW5zaWduZWQgbG9uZyBjcHVfZmVhdHVyZTsKKwl1bnNpZ25lZCBsb25nIGNwdV91c2VyX2Z0cjsKK30gZmVhdHVyZV9wcm9wZXJ0aWVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCXsiYWx0aXZlYyIsIDAsIENQVV9GVFJfQUxUSVZFQywgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUN9LAorCXsiaWJtLHZteCIsIDEsIENQVV9GVFJfQUxUSVZFQywgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUN9LAorI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisJeyJpYm0sZGZwIiwgMSwgMCwgUFBDX0ZFQVRVUkVfSEFTX0RGUH0sCisJeyJpYm0scHVyciIsIDEsIENQVV9GVFJfUFVSUiwgMH0sCisJeyJpYm0sc3B1cnIiLCAxLCBDUFVfRlRSX1NQVVJSLCAwfSwKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja19jcHVfZmVhdHVyZV9wcm9wZXJ0aWVzKHVuc2lnbmVkIGxvbmcgbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJc3RydWN0IGZlYXR1cmVfcHJvcGVydHkgKmZwID0gZmVhdHVyZV9wcm9wZXJ0aWVzOworCWNvbnN0IHUzMiAqcHJvcDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZlYXR1cmVfcHJvcGVydGllcyk7ICsraSwgKytmcCkgeworCQlwcm9wID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCBmcC0+bmFtZSwgTlVMTCk7CisJCWlmIChwcm9wICYmICpwcm9wID49IGZwLT5taW5fdmFsdWUpIHsKKwkJCWN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzIHw9IGZwLT5jcHVfZmVhdHVyZTsKKwkJCWN1cl9jcHVfc3BlYy0+Y3B1X3VzZXJfZmVhdHVyZXMgfD0gZnAtPmNwdV91c2VyX2Z0cjsKKwkJfQorCX0KK30KKwogc3RhdGljIGludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX2NwdXModW5zaWduZWQgbG9uZyBub2RlLAogCQkJCQkgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsCiAJCQkJCSAgdm9pZCAqZGF0YSkKIHsKIAlzdGF0aWMgaW50IGxvZ2ljYWxfY3B1aWQgPSAwOwogCWNoYXIgKnR5cGUgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJkZXZpY2VfdHlwZSIsIE5VTEwpOwotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JdTMyICpwcm9wOwotI2VuZGlmCi0JdTMyICppbnRzZXJ2OworCWNvbnN0IHUzMiAqcHJvcDsKKwljb25zdCB1MzIgKmludHNlcnY7CiAJaW50IGksIG50aHJlYWRzOwogCXVuc2lnbmVkIGxvbmcgbGVuOwogCWludCBmb3VuZCA9IDA7CkBAIC02NDMsMjQgKzY4MiwyNyBAQAogCQkJaW50c2VydltpXSk7CiAJCWJvb3RfY3B1aWQgPSBsb2dpY2FsX2NwdWlkOwogCQlzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGJvb3RfY3B1aWQsIGludHNlcnZbaV0pOworCisJCS8qCisJCSAqIFBBUFIgZGVmaW5lcyAibG9naWNhbCIgUFZSIHZhbHVlcyBmb3IgY3B1cyB0aGF0CisJCSAqIG1lZXQgdmFyaW91cyBsZXZlbHMgb2YgdGhlIGFyY2hpdGVjdHVyZToKKwkJICogMHgwZjAwMDAwMQlBcmNoaXRlY3R1cmUgdmVyc2lvbiAyLjA0CisJCSAqIDB4MGYwMDAwMDIJQXJjaGl0ZWN0dXJlIHZlcnNpb24gMi4wNQorCQkgKiBJZiB0aGUgY3B1LXZlcnNpb24gcHJvcGVydHkgaW4gdGhlIGNwdSBub2RlIGNvbnRhaW5zCisJCSAqIHN1Y2ggYSB2YWx1ZSwgd2UgY2FsbCBpZGVudGlmeV9jcHUgYWdhaW4gd2l0aCB0aGUKKwkJICogbG9naWNhbCBQVlIgdmFsdWUgaW4gb3JkZXIgdG8gdXNlIHRoZSBjcHUgZmVhdHVyZQorCQkgKiBiaXRzIGFwcHJvcHJpYXRlIGZvciB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsLgorCQkgKgorCQkgKiBBIFBPV0VSNiBwYXJ0aXRpb24gaW4gIlBPV0VSNiBhcmNoaXRlY3RlZCIgbW9kZQorCQkgKiB1c2VzIHRoZSAweDBmMDAwMDAyIFBWUiB2YWx1ZTsgaW4gUE9XRVI1KyBtb2RlCisJCSAqIGl0IHVzZXMgMHgwZjAwMDAwMS4KKwkJICovCisJCXByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJjcHUtdmVyc2lvbiIsIE5VTEwpOworCQlpZiAocHJvcCAmJiAoKnByb3AgJiAweGZmMDAwMDAwKSA9PSAweDBmMDAwMDAwKQorCQkJaWRlbnRpZnlfY3B1KDAsICpwcm9wKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBWTVggYW5kIGV2ZW50dWFsbHkgdXBkYXRlIENQVSBmZWF0dXJlcyAqLwotCXByb3AgPSAodTMyICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLHZteCIsIE5VTEwpOwotCWlmIChwcm9wICYmICgqcHJvcCkgPiAwKSB7Ci0JCWN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzIHw9IENQVV9GVFJfQUxUSVZFQzsKLQkJY3VyX2NwdV9zcGVjLT5jcHVfdXNlcl9mZWF0dXJlcyB8PSBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQzsKLQl9Ci0KLQkvKiBTYW1lIGdvZXMgZm9yIEFwcGxlJ3MgImFsdGl2ZWMiIHByb3BlcnR5ICovCi0JcHJvcCA9ICh1MzIgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJhbHRpdmVjIiwgTlVMTCk7Ci0JaWYgKHByb3ApIHsKLQkJY3VyX2NwdV9zcGVjLT5jcHVfZmVhdHVyZXMgfD0gQ1BVX0ZUUl9BTFRJVkVDOwotCQljdXJfY3B1X3NwZWMtPmNwdV91c2VyX2ZlYXR1cmVzIHw9IFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwotCisJY2hlY2tfY3B1X2ZlYXR1cmVfcHJvcGVydGllcyhub2RlKTsKIAljaGVja19jcHVfcGFfZmVhdHVyZXMobm9kZSk7CiAKICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKQEAgLTE2NzQsNiArMTcxNiw3IEBACiAJfQogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfY3B1X25vZGUpOwogCiAjaWZkZWYgREVCVUcKIHN0YXRpYyBzdHJ1Y3QgZGVidWdmc19ibG9iX3dyYXBwZXIgZmxhdF9kdF9ibG9iOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggYjkxNzYxNjMuLjQ2Y2YzMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtMTczLDggKzE3Myw4IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHByb21faW5pdHJkX3N0YXJ0LCBwcm9tX2luaXRyZF9lbmQ7CiAKICNpZmRlZiBDT05GSUdfUFBDNjQKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpb21tdV9mb3JjZV9vbjsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBwcGM2NF9pb21tdV9vZmY7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgcHJvbV9pb21tdV9mb3JjZV9vbjsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwcm9tX2lvbW11X29mZjsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcHJvbV90Y2VfYWxsb2Nfc3RhcnQ7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHByb21fdGNlX2FsbG9jX2VuZDsKICNlbmRpZgpAQCAtNTgyLDkgKzU4Miw5IEBACiAJCXdoaWxlICgqb3B0ICYmICpvcHQgPT0gJyAnKQogCQkJb3B0Kys7CiAJCWlmICghc3RybmNtcChvcHQsIFJFTE9DKCJvZmYiKSwgMykpCi0JCQlSRUxPQyhwcGM2NF9pb21tdV9vZmYpID0gMTsKKwkJCVJFTE9DKHByb21faW9tbXVfb2ZmKSA9IDE7CiAJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgUkVMT0MoImZvcmNlIiksIDUpKQotCQkJUkVMT0MoaW9tbXVfZm9yY2Vfb24pID0gMTsKKwkJCVJFTE9DKHByb21faW9tbXVfZm9yY2Vfb24pID0gMTsKIAl9CiAjZW5kaWYKIH0KQEAgLTYyNyw2ICs2MjcsNyBAQAogLyogT3B0aW9uIHZlY3RvciAzOiBwcm9jZXNzb3Igb3B0aW9ucyBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgT1YzX0ZQCQkJMHg4MAkvKiBmbG9hdGluZyBwb2ludCAqLwogI2RlZmluZSBPVjNfVk1YCQkJMHg0MAkvKiBWTVgvQWx0aXZlYyAqLworI2RlZmluZSBPVjNfREZQCQkJMHgyMAkvKiBkZWNpbWFsIEZQICovCiAKIC8qIE9wdGlvbiB2ZWN0b3IgNTogUEFQUi9PRiBvcHRpb25zIHN1cHBvcnRlZCAqLwogI2RlZmluZSBPVjVfTFBBUgkJMHg4MAkvKiBsb2dpY2FsIHBhcnRpdGlvbmluZyBzdXBwb3J0ZWQgKi8KQEAgLTY0Miw2ICs2NDMsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaWJtX2FyY2hpdGVjdHVyZV92ZWNbXSA9IHsKIAlXKDB4ZmZmZTAwMDApLCBXKDB4MDAzYTAwMDApLAkvKiBQT1dFUjUvUE9XRVI1KyAqLwogCVcoMHhmZmZmMDAwMCksIFcoMHgwMDNlMDAwMCksCS8qIFBPV0VSNiAqLworCVcoMHhmZmZmZmZmZiksIFcoMHgwZjAwMDAwMiksCS8qIGFsbCAyLjA1LWNvbXBsaWFudCAqLwogCVcoMHhmZmZmZmZmZSksIFcoMHgwZjAwMDAwMSksCS8qIGFsbCAyLjA0LWNvbXBsaWFudCBhbmQgZWFybGllciAqLwogCTUgLSAxLAkJCQkvKiA1IG9wdGlvbiB2ZWN0b3JzICovCiAKQEAgLTY2OCw3ICs2NzAsNyBAQAogCS8qIG9wdGlvbiB2ZWN0b3IgMzogcHJvY2Vzc29yIG9wdGlvbnMgc3VwcG9ydGVkICovCiAJMyAtIDIsCQkJCS8qIGxlbmd0aCAqLwogCTAsCQkJCS8qIGRvbid0IGlnbm9yZSwgZG9uJ3QgaGFsdCAqLwotCU9WM19GUCB8IE9WM19WTVgsCisJT1YzX0ZQIHwgT1YzX1ZNWCB8IE9WM19ERlAsCiAKIAkvKiBvcHRpb24gdmVjdG9yIDQ6IElCTSBQQVBSIGltcGxlbWVudGF0aW9uICovCiAJMiAtIDIsCQkJCS8qIGxlbmd0aCAqLwpAQCAtMTE2Nyw3ICsxMTY5LDcgQEAKIAl1NjQgbG9jYWxfYWxsb2NfdG9wLCBsb2NhbF9hbGxvY19ib3R0b207CiAJdTY0IGk7CiAKLQlpZiAoUkVMT0MocHBjNjRfaW9tbXVfb2ZmKSkKKwlpZiAoUkVMT0MocHJvbV9pb21tdV9vZmYpKQogCQlyZXR1cm47CiAKIAlwcm9tX2RlYnVnKCJzdGFydGluZyBwcm9tX2luaXRpYWxpemVfdGNlX3RhYmxlXG4iKTsKQEAgLTIyODMsMTEgKzIyODUsMTEgQEAKIAkgKiBGaWxsIGluIHNvbWUgaW5mb3MgZm9yIHVzZSBieSB0aGUga2VybmVsIGxhdGVyIG9uCiAJICovCiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0JaWYgKFJFTE9DKHBwYzY0X2lvbW11X29mZikpCisJaWYgKFJFTE9DKHByb21faW9tbXVfb2ZmKSkKIAkJcHJvbV9zZXRwcm9wKF9wcm9tLT5jaG9zZW4sICIvY2hvc2VuIiwgImxpbnV4LGlvbW11LW9mZiIsCiAJCQkgICAgIE5VTEwsIDApOwogCi0JaWYgKFJFTE9DKGlvbW11X2ZvcmNlX29uKSkKKwlpZiAoUkVMT0MocHJvbV9pb21tdV9mb3JjZV9vbikpCiAJCXByb21fc2V0cHJvcChfcHJvbS0+Y2hvc2VuLCAiL2Nob3NlbiIsICJsaW51eCxpb21tdS1mb3JjZS1vbiIsCiAJCQkgICAgIE5VTEwsIDApOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCmluZGV4IDYwM2RmZjMuLjBkZmJlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0yNSw2ICsyNSwxMiBAQAogI2RlZmluZSBPRl9DSEVDS19DT1VOVFMobmEsIG5zKQkoKG5hKSA+IDAgJiYgKG5hKSA8PSBPRl9NQVhfQUREUl9DRUxMUyAmJiBcCiAJCQkobnMpID4gMCkKIAorc3RhdGljIHN0cnVjdCBvZl9idXMgKm9mX21hdGNoX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK3N0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAorCQljb25zdCB1MzIgKmFkZHJwLCB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQlzdHJ1Y3QgcmVzb3VyY2UgKnIpOworCisKIC8qIERlYnVnIHV0aWxpdHkgKi8KICNpZmRlZiBERUJVRwogc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHUzMiAqYWRkciwgaW50IG5hKQpAQCAtMTAxLDYgKzEwNyw3IEBACiB9CiAKIAorI2lmZGVmIENPTkZJR19QQ0kKIC8qCiAgKiBQQ0kgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3IKICAqLwpAQCAtMTUzLDE1ICsxNjAsMTU2IEBACiAJc3dpdGNoKCh3ID4+IDI0KSAmIDB4MDMpIHsKIAljYXNlIDB4MDE6CiAJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87CisJCWJyZWFrOwogCWNhc2UgMHgwMjogLyogMzIgYml0cyAqLwogCWNhc2UgMHgwMzogLyogNjQgYml0cyAqLwogCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKKwkJYnJlYWs7CiAJfQogCWlmICh3ICYgMHg0MDAwMDAwMCkKIAkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9QUkVGRVRDSDsKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKK2NvbnN0IHUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLCB1NjQgKnNpemUsCisJCQl1bnNpZ25lZCBpbnQgKmZsYWdzKQoreworCWNvbnN0IHUzMiAqcHJvcDsKKwl1bnNpZ25lZCBpbnQgcHNpemU7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CisJc3RydWN0IG9mX2J1cyAqYnVzOworCWludCBvbmVzaXplLCBpLCBuYSwgbnM7CisKKwkvKiBHZXQgcGFyZW50ICYgbWF0Y2ggYnVzIHR5cGUgKi8KKwlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlidXMgPSBvZl9tYXRjaF9idXMocGFyZW50KTsKKwlpZiAoc3RyY21wKGJ1cy0+bmFtZSwgInBjaSIpKSB7CisJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJCXJldHVybiBOVUxMOworCX0KKwlidXMtPmNvdW50X2NlbGxzKGRldiwgJm5hLCAmbnMpOworCW9mX25vZGVfcHV0KHBhcmVudCk7CisJaWYgKCFPRl9DSEVDS19DT1VOVFMobmEsIG5zKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBHZXQgInJlZyIgb3IgImFzc2lnbmVkLWFkZHJlc3NlcyIgcHJvcGVydHkgKi8KKwlwcm9wID0gZ2V0X3Byb3BlcnR5KGRldiwgYnVzLT5hZGRyZXNzZXMsICZwc2l6ZSk7CisJaWYgKHByb3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcHNpemUgLz0gNDsKKworCW9uZXNpemUgPSBuYSArIG5zOworCWZvciAoaSA9IDA7IHBzaXplID49IG9uZXNpemU7IHBzaXplIC09IG9uZXNpemUsIHByb3AgKz0gb25lc2l6ZSwgaSsrKQorCQlpZiAoKHByb3BbMF0gJiAweGZmKSA9PSAoKGJhcl9ubyAqIDQpICsgUENJX0JBU0VfQUREUkVTU18wKSkgeworCQkJaWYgKHNpemUpCisJCQkJKnNpemUgPSBvZl9yZWFkX251bWJlcihwcm9wICsgbmEsIG5zKTsKKwkJCWlmIChmbGFncykKKwkJCQkqZmxhZ3MgPSBidXMtPmdldF9mbGFncyhwcm9wKTsKKwkJCXJldHVybiBwcm9wOworCQl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldF9wY2lfYWRkcmVzcyk7CisKK2ludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJY29uc3QgdTMyCSphZGRycDsKKwl1NjQJCXNpemU7CisJdW5zaWduZWQgaW50CWZsYWdzOworCisJYWRkcnAgPSBvZl9nZXRfcGNpX2FkZHJlc3MoZGV2LCBiYXIsICZzaXplLCAmZmxhZ3MpOworCWlmIChhZGRycCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgYWRkcnAsIHNpemUsIGZsYWdzLCByKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKTsKKworc3RhdGljIHU4IG9mX2lycV9wY2lfc3dpenpsZSh1OCBzbG90LCB1OCBwaW4pCit7CisJcmV0dXJuICgoKHBpbiAtIDEpICsgc2xvdCkgJSA0KSArIDE7Cit9CisKK2ludCBvZl9pcnFfbWFwX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG9mX2lycSAqb3V0X2lycSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCAqcHBub2RlOworCXN0cnVjdCBwY2lfZGV2ICpwcGRldjsKKwl1MzIgbHNwZWM7CisJdTMyIGxhZGRyWzNdOworCXU4IHBpbjsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgZGV2aWNlIG5vZGUsIGlmIHllcywgZmFsbGJhY2sgdG8gc3RhbmRhcmQgT0YKKwkgKiBwYXJzaW5nCisJICovCisJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJaWYgKGRuKQorCQlyZXR1cm4gb2ZfaXJxX21hcF9vbmUoZG4sIDAsIG91dF9pcnEpOworCisJLyogT2ssIHdlIGRvbid0LCB0aW1lIHRvIGhhdmUgZnVuLiBMZXQncyBzdGFydCBieSBidWlsZGluZyB1cCBhbgorCSAqIGludGVycnVwdCBzcGVjLiAgd2UgYXNzdW1lICNpbnRlcnJ1cHQtY2VsbHMgaXMgMSwgd2hpY2ggaXMgc3RhbmRhcmQKKwkgKiBmb3IgUENJLiBJZiB5b3UgZG8gZGlmZmVyZW50LCB0aGVuIGRvbid0IHVzZSB0aGF0IHJvdXRpbmUuCisJICovCisJcmMgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJaWYgKHJjICE9IDApCisJCXJldHVybiByYzsKKwkvKiBObyBwaW4sIGV4aXQgKi8KKwlpZiAocGluID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogTm93IHdlIHdhbGsgdXAgdGhlIFBDSSB0cmVlICovCisJbHNwZWMgPSBwaW47CisJZm9yICg7OykgeworCQkvKiBHZXQgdGhlIHBjaV9kZXYgb2Ygb3VyIHBhcmVudCAqLworCQlwcGRldiA9IHBkZXYtPmJ1cy0+c2VsZjsKKworCQkvKiBPdWNoLCBpdCdzIGEgaG9zdCBicmlkZ2UuLi4gKi8KKwkJaWYgKHBwZGV2ID09IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwkJCXBwbm9kZSA9IHBjaV9idXNfdG9fT0Zfbm9kZShwZGV2LT5idXMpOworI2Vsc2UKKwkJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zdDsKKwkJCWhvc3QgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKKwkJCXBwbm9kZSA9IGhvc3QgPyBob3N0LT5hcmNoX2RhdGEgOiBOVUxMOworI2VuZGlmCisJCQkvKiBObyBub2RlIGZvciBob3N0IGJyaWRnZSA/IGdpdmUgdXAgKi8KKwkJCWlmIChwcG5vZGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQkvKiBXZSBmb3VuZCBhIFAyUCBicmlkZ2UsIGNoZWNrIGlmIGl0IGhhcyBhIG5vZGUgKi8KKwkJCXBwbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwcGRldik7CisKKwkJLyogT2ssIHdlIGhhdmUgZm91bmQgYSBwYXJlbnQgd2l0aCBhIGRldmljZS1ub2RlLCBoYW5kIG92ZXIgdG8KKwkJICogdGhlIE9GIHBhcnNpbmcgY29kZS4KKwkJICogV2UgYnVpbGQgYSB1bml0IGFkZHJlc3MgZnJvbSB0aGUgbGludXggZGV2aWNlIHRvIGJlIHVzZWQgZm9yCisJCSAqIHJlc29sdXRpb24uIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGxpbnV4IGJ1cyBudW1iZXIgd2hpY2ggbWF5CisJCSAqIG5vdCBtYXRjaCB5b3VyIGZpcm13YXJlIGJ1cyBudW1iZXJpbmcuCisJCSAqIEZvcnR1bmF0ZWx5LCBpbiBtb3N0IGNhc2VzLCBpbnRlcnJ1cHQtbWFwLW1hc2sgZG9lc24ndCBpbmNsdWRlCisJCSAqIHRoZSBidXMgbnVtYmVyIGFzIHBhcnQgb2YgdGhlIG1hdGNoaW5nLgorCQkgKiBZb3Ugc2hvdWxkIHN0aWxsIGJlIGNhcmVmdWwgYWJvdXQgdGhhdCB0aG91Z2ggaWYgeW91IGludGVuZAorCQkgKiB0byByZWx5IG9uIHRoaXMgZnVuY3Rpb24gKHlvdSBzaGlwICBhIGZpcm13YXJlIHRoYXQgZG9lc24ndAorCQkgKiBjcmVhdGUgZGV2aWNlIG5vZGVzIGZvciBhbGwgUENJIGRldmljZXMpLgorCQkgKi8KKwkJaWYgKHBwbm9kZSkKKwkJCWJyZWFrOworCisJCS8qIFdlIGNhbiBvbmx5IGdldCBoZXJlIGlmIHdlIGhpdCBhIFAyUCBicmlkZ2Ugd2l0aCBubyBub2RlLAorCQkgKiBsZXQncyBkbyBzdGFuZGFyZCBzd2l6emxpbmcgYW5kIHRyeSBhZ2FpbgorCQkgKi8KKwkJbHNwZWMgPSBvZl9pcnFfcGNpX3N3aXp6bGUoUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBsc3BlYyk7CisJCXBkZXYgPSBwcGRldjsKKwl9CisKKwlsYWRkclswXSA9IChwZGV2LT5idXMtPm51bWJlciA8PCAxNikKKwkJfCAocGRldi0+ZGV2Zm4gPDwgOCk7CisJbGFkZHJbMV0gID0gbGFkZHJbMl0gPSAwOworCXJldHVybiBvZl9pcnFfbWFwX3JhdyhwcG5vZGUsICZsc3BlYywgMSwgbGFkZHIsIG91dF9pcnEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfaXJxX21hcF9wY2kpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwogLyoKICAqIElTQSBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcgogICovCkBAIC0yMjMsNiArMzcxLDcgQEAKICAqLwogCiBzdGF0aWMgc3RydWN0IG9mX2J1cyBvZl9idXNzZXNbXSA9IHsKKyNpZmRlZiBDT05GSUdfUENJCiAJLyogUENJICovCiAJewogCQkubmFtZSA9ICJwY2kiLApAQCAtMjMzLDYgKzM4Miw3IEBACiAJCS50cmFuc2xhdGUgPSBvZl9idXNfcGNpX3RyYW5zbGF0ZSwKIAkJLmdldF9mbGFncyA9IG9mX2J1c19wY2lfZ2V0X2ZsYWdzLAogCX0sCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCS8qIElTQSAqLwogCXsKIAkJLm5hbWUgPSAiaXNhIiwKQEAgLTQ0NSw0OCArNTk1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZ2V0X2FkZHJlc3MpOwogCi1jb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywgdTY0ICpzaXplLAotCQkJdW5zaWduZWQgaW50ICpmbGFncykKLXsKLQljb25zdCB1MzIgKnByb3A7Ci0JdW5zaWduZWQgaW50IHBzaXplOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwotCXN0cnVjdCBvZl9idXMgKmJ1czsKLQlpbnQgb25lc2l6ZSwgaSwgbmEsIG5zOwotCi0JLyogR2V0IHBhcmVudCAmIG1hdGNoIGJ1cyB0eXBlICovCi0JcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7Ci0JaWYgKHN0cmNtcChidXMtPm5hbWUsICJwY2kiKSkgewotCQlvZl9ub2RlX3B1dChwYXJlbnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVzLT5jb3VudF9jZWxscyhkZXYsICZuYSwgJm5zKTsKLQlvZl9ub2RlX3B1dChwYXJlbnQpOwotCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpCi0JCXJldHVybiBOVUxMOwotCi0JLyogR2V0ICJyZWciIG9yICJhc3NpZ25lZC1hZGRyZXNzZXMiIHByb3BlcnR5ICovCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShkZXYsIGJ1cy0+YWRkcmVzc2VzLCAmcHNpemUpOwotCWlmIChwcm9wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXBzaXplIC89IDQ7Ci0KLQlvbmVzaXplID0gbmEgKyBuczsKLQlmb3IgKGkgPSAwOyBwc2l6ZSA+PSBvbmVzaXplOyBwc2l6ZSAtPSBvbmVzaXplLCBwcm9wICs9IG9uZXNpemUsIGkrKykKLQkJaWYgKChwcm9wWzBdICYgMHhmZikgPT0gKChiYXJfbm8gKiA0KSArIFBDSV9CQVNFX0FERFJFU1NfMCkpIHsKLQkJCWlmIChzaXplKQotCQkJCSpzaXplID0gb2ZfcmVhZF9udW1iZXIocHJvcCArIG5hLCBucyk7Ci0JCQlpZiAoZmxhZ3MpCi0JCQkJKmZsYWdzID0gYnVzLT5nZXRfZmxhZ3MocHJvcCk7Ci0JCQlyZXR1cm4gcHJvcDsKLQkJfQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChvZl9nZXRfcGNpX2FkZHJlc3MpOwotCiBzdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICphZGRycCwKIAkJCQkgICAgdTY0IHNpemUsIHVuc2lnbmVkIGludCBmbGFncywKIAkJCQkgICAgc3RydWN0IHJlc291cmNlICpyKQpAQCAtNTI5LDIwICs2MzcsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwob2ZfYWRkcmVzc190b19yZXNvdXJjZSk7CiAKLWludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCi17Ci0JY29uc3QgdTMyCSphZGRycDsKLQl1NjQJCXNpemU7Ci0JdW5zaWduZWQgaW50CWZsYWdzOwotCi0JYWRkcnAgPSBvZl9nZXRfcGNpX2FkZHJlc3MoZGV2LCBiYXIsICZzaXplLCAmZmxhZ3MpOwotCWlmIChhZGRycCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgYWRkcnAsIHNpemUsIGZsYWdzLCByKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKTsKLQogdm9pZCBvZl9wYXJzZV9kbWFfd2luZG93KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGNvbnN0IHZvaWQgKmRtYV93aW5kb3dfcHJvcCwKIAkJdW5zaWduZWQgbG9uZyAqYnVzbm8sIHVuc2lnbmVkIGxvbmcgKnBoeXMsIHVuc2lnbmVkIGxvbmcgKnNpemUpCiB7CkBAIC04OTgsODcgKzk5MiwzIEBACiAJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfb25lKTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyB1OCBvZl9pcnFfcGNpX3N3aXp6bGUodTggc2xvdCwgdTggcGluKQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCi1pbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcHBkZXY7Ci0JdTMyIGxzcGVjOwotCXUzMiBsYWRkclszXTsKLQl1OCBwaW47Ci0JaW50IHJjOwotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGRldmljZSBub2RlLCBpZiB5ZXMsIGZhbGxiYWNrIHRvIHN0YW5kYXJkIE9GCi0JICogcGFyc2luZwotCSAqLwotCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwotCWlmIChkbikKLQkJcmV0dXJuIG9mX2lycV9tYXBfb25lKGRuLCAwLCBvdXRfaXJxKTsKLQotCS8qIE9rLCB3ZSBkb24ndCwgdGltZSB0byBoYXZlIGZ1bi4gTGV0J3Mgc3RhcnQgYnkgYnVpbGRpbmcgdXAgYW4KLQkgKiBpbnRlcnJ1cHQgc3BlYy4gIHdlIGFzc3VtZSAjaW50ZXJydXB0LWNlbGxzIGlzIDEsIHdoaWNoIGlzIHN0YW5kYXJkCi0JICogZm9yIFBDSS4gSWYgeW91IGRvIGRpZmZlcmVudCwgdGhlbiBkb24ndCB1c2UgdGhhdCByb3V0aW5lLgotCSAqLwotCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0JLyogTm8gcGluLCBleGl0ICovCi0JaWYgKHBpbiA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIE5vdyB3ZSB3YWxrIHVwIHRoZSBQQ0kgdHJlZSAqLwotCWxzcGVjID0gcGluOwotCWZvciAoOzspIHsKLQkJLyogR2V0IHRoZSBwY2lfZGV2IG9mIG91ciBwYXJlbnQgKi8KLQkJcHBkZXYgPSBwZGV2LT5idXMtPnNlbGY7Ci0KLQkJLyogT3VjaCwgaXQncyBhIGhvc3QgYnJpZGdlLi4uICovCi0JCWlmIChwcGRldiA9PSBOVUxMKSB7Ci0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JCQlwcG5vZGUgPSBwY2lfYnVzX3RvX09GX25vZGUocGRldi0+YnVzKTsKLSNlbHNlCi0JCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc3Q7Ci0JCQlob3N0ID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7Ci0JCQlwcG5vZGUgPSBob3N0ID8gaG9zdC0+YXJjaF9kYXRhIDogTlVMTDsKLSNlbmRpZgotCQkJLyogTm8gbm9kZSBmb3IgaG9zdCBicmlkZ2UgPyBnaXZlIHVwICovCi0JCQlpZiAocHBub2RlID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZQotCQkJLyogV2UgZm91bmQgYSBQMlAgYnJpZGdlLCBjaGVjayBpZiBpdCBoYXMgYSBub2RlICovCi0JCQlwcG5vZGUgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocHBkZXYpOwotCi0JCS8qIE9rLCB3ZSBoYXZlIGZvdW5kIGEgcGFyZW50IHdpdGggYSBkZXZpY2Utbm9kZSwgaGFuZCBvdmVyIHRvCi0JCSAqIHRoZSBPRiBwYXJzaW5nIGNvZGUuCi0JCSAqIFdlIGJ1aWxkIGEgdW5pdCBhZGRyZXNzIGZyb20gdGhlIGxpbnV4IGRldmljZSB0byBiZSB1c2VkIGZvcgotCQkgKiByZXNvbHV0aW9uLiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBsaW51eCBidXMgbnVtYmVyIHdoaWNoIG1heQotCQkgKiBub3QgbWF0Y2ggeW91ciBmaXJtd2FyZSBidXMgbnVtYmVyaW5nLgotCQkgKiBGb3J0dW5hdGVseSwgaW4gbW9zdCBjYXNlcywgaW50ZXJydXB0LW1hcC1tYXNrIGRvZXNuJ3QgaW5jbHVkZQotCQkgKiB0aGUgYnVzIG51bWJlciBhcyBwYXJ0IG9mIHRoZSBtYXRjaGluZy4KLQkJICogWW91IHNob3VsZCBzdGlsbCBiZSBjYXJlZnVsIGFib3V0IHRoYXQgdGhvdWdoIGlmIHlvdSBpbnRlbmQKLQkJICogdG8gcmVseSBvbiB0aGlzIGZ1bmN0aW9uICh5b3Ugc2hpcCAgYSBmaXJtd2FyZSB0aGF0IGRvZXNuJ3QKLQkJICogY3JlYXRlIGRldmljZSBub2RlcyBmb3IgYWxsIFBDSSBkZXZpY2VzKS4KLQkJICovCi0JCWlmIChwcG5vZGUpCi0JCQlicmVhazsKLQotCQkvKiBXZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSBoaXQgYSBQMlAgYnJpZGdlIHdpdGggbm8gbm9kZSwKLQkJICogbGV0J3MgZG8gc3RhbmRhcmQgc3dpenpsaW5nIGFuZCB0cnkgYWdhaW4KLQkJICovCi0JCWxzcGVjID0gb2ZfaXJxX3BjaV9zd2l6emxlKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgbHNwZWMpOwotCQlwZGV2ID0gcHBkZXY7Ci0JfQotCi0JbGFkZHJbMF0gPSAocGRldi0+YnVzLT5udW1iZXIgPDwgMTYpCi0JCXwgKHBkZXYtPmRldmZuIDw8IDgpOwotCWxhZGRyWzFdICA9IGxhZGRyWzJdID0gMDsKLQlyZXR1cm4gb2ZfaXJxX21hcF9yYXcocHBub2RlLCAmbHNwZWMsIDEsIGxhZGRyLCBvdXRfaXJxKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfcGNpKTsKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCmluZGV4IDZlZjgwZDQuLjM4N2VkMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCkBAIC04MTAsOSArODEwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyogVGhpcyB2ZXJzaW9uIGNhbid0IHRha2UgdGhlIHNwaW5sb2NrLCBiZWNhdXNlIGl0IG5ldmVyIHJldHVybnMgKi8KLQotc3RydWN0IHJ0YXNfYXJncyBydGFzX3N0b3Bfc2VsZl9hcmdzID0geworc3RhdGljIHN0cnVjdCBydGFzX2FyZ3MgcnRhc19zdG9wX3NlbGZfYXJncyA9IHsKIAkvKiBUaGUgdG9rZW4gaXMgaW5pdGlhbGl6ZWQgZm9yIHJlYWwgaW4gc2V0dXBfc3lzdGVtKCkgKi8KIAkudG9rZW4gPSBSVEFTX1VOS05PV05fU0VSVklDRSwKIAkubmFyZ3MgPSAwLApAQCAtODM0LDYgKzgzNCw3IEBACiAKIAlwYW5pYygiQWxhcywgSSBzdXJ2aXZlZC5cbiIpOwogfQorI2VuZGlmCiAKIC8qCiAgKiBDYWxsIGVhcmx5IGR1cmluZyBib290LCBiZWZvcmUgbWVtIGluaXQgb3IgYm9vdG1lbSwgdG8gcmV0cmlldmUgdGhlIFJUQVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKaW5kZXggNmY2ZmM5Ny4uYjk1NjFkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKQEAgLTY4MSwxNCArNjgxLDEyIEBACiAJaW50ICpzdGF0dXM7CiAJaW50IHRva2VuOwogCi0JZHAtPmRhdGEgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlkcC0+ZGF0YSA9IGt6YWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOwogCWlmIChkcC0+ZGF0YSA9PSBOVUxMKSB7CiAJCXJlbW92ZV9mbGFzaF9wZGUoZHApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQoZHAtPmRhdGEsIDAsIGJ1Zl9zaXplKTsKLQogCS8qCiAJICogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3RhdHVzIGludCBpcyB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZQogCSAqIHN0cnVjdCAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwppbmRleCBiNGEwZGU3Li5hY2U5ZjRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KICNpbmNsdWRlIDxhc20vbXBpYy5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2VlaC5oPgogCiAvKiBSVEFTIHRva2VucyAqLwogc3RhdGljIGludCByZWFkX3BjaV9jb25maWc7CkBAIC0yMzEsMzIgKzIzMiwxMyBAQAogCiB1bnNpZ25lZCBsb25nIF9fZGV2aW5pdCBnZXRfcGhiX2J1aWQgKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGhiKQogewotCWludCBhZGRyX2NlbGxzOwotCWNvbnN0IHVuc2lnbmVkIGludCAqYnVpZF92YWxzOwotCXVuc2lnbmVkIGludCBsZW47Ci0JdW5zaWduZWQgbG9uZyBidWlkOworCXN0cnVjdCByZXNvdXJjZSByOwogCi0JaWYgKGlibV9yZWFkX3BjaV9jb25maWcgPT0gLTEpIHJldHVybiAwOwotCi0JLyogUEhCJ3Mgd2lsbCBhbHdheXMgYmUgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSwKLQkgKiBvciBzbyBpdCBpcyBwcm9taXNlZCBieSB0aGUgY3VycmVudCBmaXJtd2FyZS4gKi8KLQlpZiAocGhiLT5wYXJlbnQgPT0gTlVMTCkKKwlpZiAoaWJtX3JlYWRfcGNpX2NvbmZpZyA9PSAtMSkKIAkJcmV0dXJuIDA7Ci0JaWYgKHBoYi0+cGFyZW50LT5wYXJlbnQpCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGhiLCAwLCAmcikpCiAJCXJldHVybiAwOwotCi0JYnVpZF92YWxzID0gZ2V0X3Byb3BlcnR5KHBoYiwgInJlZyIsICZsZW4pOwotCWlmIChidWlkX3ZhbHMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlhZGRyX2NlbGxzID0gcHJvbV9uX2FkZHJfY2VsbHMocGhiKTsKLQlpZiAoYWRkcl9jZWxscyA9PSAxKSB7Ci0JCWJ1aWQgPSAodW5zaWduZWQgbG9uZykgYnVpZF92YWxzWzBdOwotCX0gZWxzZSB7Ci0JCWJ1aWQgPSAoKCh1bnNpZ25lZCBsb25nKWJ1aWRfdmFsc1swXSkgPDwgMzJVTCkgfAotCQkJKCgodW5zaWduZWQgbG9uZylidWlkX3ZhbHNbMV0pICYgMHhmZmZmZmZmZik7Ci0JfQotCXJldHVybiBidWlkOworCXJldHVybiByLnN0YXJ0OwogfQogCiBzdGF0aWMgaW50IHBoYl9zZXRfYnVzX3JhbmdlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKQEAgLTI3Niw4ICsyNTgsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fZGV2aW5pdCBzZXR1cF9waGIoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQoraW50IF9fZGV2aW5pdCBydGFzX3NldHVwX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiA9IHBoYi0+YXJjaF9kYXRhOworCiAJaWYgKGlzX3B5dGhvbihkZXYpKQogCQlweXRob25fY291bnRlcm1lYXN1cmVzKGRldik7CiAKQEAgLTMwOSw3ICsyOTMsNyBAQAogCQlwaGIgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIobm9kZSk7CiAJCWlmICghcGhiKQogCQkJY29udGludWU7Ci0JCXNldHVwX3BoYihub2RlLCBwaGIpOworCQlydGFzX3NldHVwX3BoYihwaGIpOwogCQlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgbm9kZSwgMCk7CiAJCXBjaV9zZXR1cF9waGJfaW8ocGhiLCBpbmRleCA9PSAwKTsKIAkJaW5kZXgrKzsKQEAgLTM4MSw3ICszNjUsNiBAQAogCQl9CiAJfQogCi0JbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKIAlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihwaGIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKaW5kZXggYTRjMjk2NC4uNjFjNjVkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtNjMsMTAgKzYzLDYgQEAKIAogaW50IGhhdmVfb2YgPSAxOwogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCi1kZXZfdCBib290X2RldjsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KLQogI2lmZGVmIENPTkZJR19WR0FfQ09OU09MRQogdW5zaWduZWQgbG9uZyB2Z2Fjb25fcmVtYXBfYmFzZTsKICNlbmRpZgpAQCAtMTAxLDcgKzk3LDcgQEAKIAkgKiBJZGVudGlmeSB0aGUgQ1BVIHR5cGUgYW5kIGZpeCB1cCBjb2RlIHNlY3Rpb25zCiAJICogdGhhdCBkZXBlbmQgb24gd2hpY2ggY3B1IHdlIGhhdmUuCiAJICovCi0Jc3BlYyA9IGlkZW50aWZ5X2NwdShvZmZzZXQpOworCXNwZWMgPSBpZGVudGlmeV9jcHUob2Zmc2V0LCBtZnNwcihTUFJOX1BWUikpOwogCiAJZG9fZmVhdHVyZV9maXh1cHMoc3BlYy0+Y3B1X2ZlYXR1cmVzLAogCQkJICBQVFJSRUxPQygmX19zdGFydF9fX2Z0cl9maXh1cCksCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggMTYyNzg5Ni4uMzczM2RlMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9rZHVtcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CkBAIC03MSw3ICs3Miw2IEBACiAKIGludCBoYXZlX29mID0gMTsKIGludCBib290X2NwdWlkID0gMDsKLWRldl90IGJvb3RfZGV2OwogdTY0IHBwYzY0X3BmdF9zaXplOwogCiAvKiBQaWNrIGRlZmF1bHRzIHNpbmNlIHdlIG1pZ2h0IHdhbnQgdG8gcGF0Y2ggaW5zdHJ1Y3Rpb25zCkBAIC0xNzEsNyArMTcxLDcgQEAKIHZvaWQgX19pbml0IGVhcmx5X3NldHVwKHVuc2lnbmVkIGxvbmcgZHRfcHRyKQogewogCS8qIElkZW50aWZ5IENQVSB0eXBlICovCi0JaWRlbnRpZnlfY3B1KDApOworCWlkZW50aWZ5X2NwdSgwLCBtZnNwcihTUFJOX1BWUikpOwogCiAJLyogQXNzdW1lIHdlJ3JlIG9uIGNwdSAwIGZvciBub3cuIERvbid0IHdyaXRlIHRvIHRoZSBwYWNhIHlldCEgKi8KIAlzZXR1cF9wYWNhKDApOwpAQCAtMjI2LDggKzIyNiw4IEBACiB7CiAJc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCk7CiAKLQkvKiBNYXJrIGVuYWJsZWQgaW4gUEFDQSAqLwotCWxwYWNhLT5wcm9jX2VuYWJsZWQgPSAwOworCS8qIE1hcmsgaW50ZXJydXB0cyBlbmFibGVkIGluIFBBQ0EgKi8KKwlscGFjYS0+c29mdF9lbmFibGVkID0gMDsKIAogCS8qIEluaXRpYWxpemUgaGFzaCB0YWJsZSBmb3IgdGhhdCBDUFUgKi8KIAlodGFiX2luaXRpYWxpemVfc2Vjb25kYXJ5KCk7CkBAIC0zOTIsNyArMzkyLDggQEAKIAkgKiBzZXR0aW5nIHVwIHRoZSBoYXNoIHRhYmxlIHBvaW50ZXJzLiBJdCBhbHNvIHNldHMgdXAgc29tZSBpbnRlcnJ1cHQtbWFwcGluZwogCSAqIHJlbGF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCBieSBmaW5pc2hfZGV2aWNlX3RyZWUoKQogCSAqLwotCXBwY19tZC5pbml0X2Vhcmx5KCk7CisJaWYgKHBwY19tZC5pbml0X2Vhcmx5KQorCQlwcGNfbWQuaW5pdF9lYXJseSgpOwogCiAgCS8qCiAJICogV2UgY2FuIGRpc2NvdmVyIHNlcmlhbCBwb3J0cyBub3cgc2luY2UgdGhlIGFib3ZlIGRpZCBzZXR1cCB0aGUKQEAgLTU5OCwzICs1OTksMTAgQEAKIAl9CiB9CiAjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1BQQ19JTkRJUkVDVF9JTworc3RydWN0IHBwY19wY2lfaW8gcHBjX3BjaV9pbzsKK0VYUE9SVF9TWU1CT0wocHBjX3BjaV9pbyk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19JTkRJUkVDVF9JTyAqLworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC10YnN5bmMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLXRic3luYy5jCmluZGV4IGRlNTljNmMuLmJjODkyZTY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC10YnN5bmMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC10YnN5bmMuYwpAQCAtNzgsNyArNzgsNyBAQAogewogCWludCBpLCBzY29yZT0wOwogCXU2NCB0YjsKLQlsb25nIG1hcms7CisJdTY0IG1hcms7CiAKIAl0YnN5bmMtPmNtZCA9IGNtZDsKIApAQCAtMTE2LDggKzExNiw3IEBACiAJcHJpbnRrKCJTeW5jaHJvbml6aW5nIHRpbWViYXNlXG4iKTsKIAogCS8qIGlmIHRoaXMgZmFpbHMgdGhlbiB0aGlzIGtlcm5lbCB3b24ndCB3b3JrIGFueXdheS4uLiAqLwotCXRic3luYyA9IGttYWxsb2MoIHNpemVvZigqdGJzeW5jKSwgR0ZQX0tFUk5FTCApOwotCW1lbXNldCggdGJzeW5jLCAwLCBzaXplb2YoKnRic3luYykgKTsKKwl0YnN5bmMgPSBremFsbG9jKCBzaXplb2YoKnRic3luYyksIEdGUF9LRVJORUwgKTsKIAltYigpOwogCXJ1bm5pbmcgPSAxOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCAzNWM2MzA5Li45YjI4YzIzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTY1LDYgKzY1LDcgQEAKIAogRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CiBFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfc2libGluZ19tYXApOwogCiAvKiBTTVAgb3BlcmF0aW9ucyBmb3IgdGhpcyBtYWNoaW5lICovCiBzdHJ1Y3Qgc21wX29wc190ICpzbXBfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKaW5kZXggZDE1YzMzZS4uMDNhMmEyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogCiAvKiByZWFkZGlyICYgZ2V0ZGVudHMgKi8KICNkZWZpbmUgTkFNRV9PRkZTRVQoZGUpICgoaW50KSAoKGRlKS0+ZF9uYW1lIC0gKGNoYXIgX191c2VyICopIChkZSkpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCmluZGV4IGQ0NWExNjguLjIyMTIzYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKQEAgLTIwMCwxMCArMjAwLDkgQEAKIAlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CiAJc3RydWN0IHN5c19kZXZpY2UgKnMgPSAmYy0+c3lzZGV2OwogCi0jaWZuZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQorCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSAmJgorCQkJY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKIAkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3NtdF9zbm9vemVfZGVsYXkpOwotI2VuZGlmCiAKIAkvKiBQTUMgc3R1ZmYgKi8KIApAQCAtMjQyLDEwICsyNDEsOSBAQAogCiAJQlVHX09OKGMtPm5vX2NvbnRyb2wpOwogCi0jaWZuZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQorCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSAmJgorCQkJY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKIAkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3NtdF9zbm9vemVfZGVsYXkpOwotI2VuZGlmCiAKIAkvKiBQTUMgc3R1ZmYgKi8KIApAQCAtMjk5LDYgKzI5Nyw3MiBAQAogCS5ub3RpZmllcl9jYWxsCT0gc3lzZnNfY3B1X25vdGlmeSwKIH07CiAKK3N0YXRpYyBERUZJTkVfTVVURVgoY3B1X211dGV4KTsKKworaW50IGNwdV9hZGRfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaW50IGNwdTsKKworCW11dGV4X2xvY2soJmNwdV9tdXRleCk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN5c2Rldl9jcmVhdGVfZmlsZShnZXRfY3B1X3N5c2RldihjcHUpLCBhdHRyKTsKKwl9CisKKwltdXRleF91bmxvY2soJmNwdV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfYWRkX3N5c2Rldl9hdHRyKTsKKworaW50IGNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnMpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCisJbXV0ZXhfbG9jaygmY3B1X211dGV4KTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3lzZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwkJc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNkZXYtPmtvYmosIGF0dHJzKTsKKwl9CisKKwltdXRleF91bmxvY2soJmNwdV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfYWRkX3N5c2Rldl9hdHRyX2dyb3VwKTsKKworCit2b2lkIGNwdV9yZW1vdmVfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaW50IGNwdTsKKworCW11dGV4X2xvY2soJmNwdV9tdXRleCk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN5c2Rldl9yZW1vdmVfZmlsZShnZXRfY3B1X3N5c2RldihjcHUpLCBhdHRyKTsKKwl9CisKKwltdXRleF91bmxvY2soJmNwdV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfcmVtb3ZlX3N5c2Rldl9hdHRyKTsKKwordm9pZCBjcHVfcmVtb3ZlX3N5c2Rldl9hdHRyX2dyb3VwKHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJzKQoreworCWludCBjcHU7CisJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKKworCW11dGV4X2xvY2soJmNwdV9tdXRleCk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN5c2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzZGV2LT5rb2JqLCBhdHRycyk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjcHVfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cCk7CisKKwogLyogTlVNQSBzdHVmZiAqLwogCiAjaWZkZWYgQ09ORklHX05VTUEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggNDZhMjRkZS4uZjZmMGM2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTYzMSw3ICs2MzEsOCBAQAogCWNhbGN1bGF0ZV9zdGVhbF90aW1lKCk7CiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOwogI2VuZGlmCiAKIAl3aGlsZSAoKHRpY2tzID0gdGJfdGlja3Nfc2luY2UocGVyX2NwdShsYXN0X2ppZmZ5LCBjcHUpKSkKQEAgLTY3NCw3ICs2NzUsNyBAQAogCXNldF9kZWMobmV4dF9kZWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykgJiYgaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKIAkJcHJvY2Vzc19odmxwZXZlbnRzKCk7CiAjZW5kaWYKIApAQCAtNzc0LDcgKzc3NSw3IEBACiAJICogc2V0dGltZW9mZGF5IHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uCiAJICovCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWYgKGZpcnN0X3NldHRpbWVvZmRheSkgeworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpICYmIGZpcnN0X3NldHRpbWVvZmRheSkgewogCQlpU2VyaWVzX3RiX3JlY2FsKCk7CiAJCWZpcnN0X3NldHRpbWVvZmRheSA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IGM2NmI0NzcuLjBkNGUyMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTUzLDEwICs1Myw2IEBACiAjZW5kaWYKICNpbmNsdWRlIDxhc20va2V4ZWMuaD4KIAotI2lmZGVmIENPTkZJR19QUEM2NAkvKiBYWFggKi8KLSNkZWZpbmUgX0lPX0JBU0UJcGNpX2lvX2Jhc2UKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0RFQlVHR0VSCiBpbnQgKCpfX2RlYnVnZ2VyKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBpbnQgKCpfX2RlYnVnZ2VyX2lwaSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwpAQCAtMjQxLDcgKzIzNyw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2lvX2FjY2VzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpCisjaWZkZWYgQ09ORklHX1BQQzMyCiAJdW5zaWduZWQgbG9uZyBtc3IgPSByZWdzLT5tc3I7CiAJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZW50cnk7CiAJdW5zaWduZWQgaW50ICpuaXAgPSAodW5zaWduZWQgaW50ICopcmVncy0+bmlwOwpAQCAtMjc0LDcgKzI3MCw3IEBACiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgJiYgQ09ORklHX1BQQzMyICovCisjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IGVkMDA3ODcuLmE4MGY4ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtODEsMTUgKzgxLDE1IEBACiAJCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKIAotCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsCi0JCQkJImlibSxteS1kbWEtd2luZG93IiwgTlVMTCk7CisJCWRtYV93aW5kb3cgPSBnZXRfcHJvcGVydHkoZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwKKwkJCQkJICAiaWJtLG15LWRtYS13aW5kb3ciLCBOVUxMKTsKIAkJaWYgKCFkbWFfd2luZG93KQogCQkJcmV0dXJuIE5VTEw7CiAKIAkJdGJsID0ga21hbGxvYyhzaXplb2YoKnRibCksIEdGUF9LRVJORUwpOwogCi0JCW9mX3BhcnNlX2RtYV93aW5kb3coZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgZG1hX3dpbmRvdywKLQkJCQkmdGJsLT5pdF9pbmRleCwgJm9mZnNldCwgJnNpemUpOworCQlvZl9wYXJzZV9kbWFfd2luZG93KGRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUsIGRtYV93aW5kb3csCisJCQkJICAgICZ0YmwtPml0X2luZGV4LCAmb2Zmc2V0LCAmc2l6ZSk7CiAKIAkJLyogVENFIHRhYmxlIHNpemUgLSBtZWFzdXJlZCBpbiB0Y2UgZW50cmllcyAqLwogCQl0YmwtPml0X3NpemUgPSBzaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CkBAIC0xMTcsNyArMTE3LDggQEAKIHsKIAl3aGlsZSAoaWRzLT50eXBlWzBdICE9ICdcMCcpIHsKIAkJaWYgKChzdHJuY21wKGRldi0+dHlwZSwgaWRzLT50eXBlLCBzdHJsZW4oaWRzLT50eXBlKSkgPT0gMCkgJiYKLQkJICAgIGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIGlkcy0+Y29tcGF0KSkKKwkJICAgIGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUsCisJCQkJCSBpZHMtPmNvbXBhdCkpCiAJCQlyZXR1cm4gaWRzOwogCQlpZHMrKzsKIAl9CkBAIC0xOTgsOSArMTk5LDkgQEAKIC8qIHZpb19kZXYgcmVmY291bnQgaGl0IDAgKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlmIChkZXYtPnBsYXRmb3JtX2RhdGEpIHsKLQkJLyogWFhYIGZyZWUgVENFIHRhYmxlICovCi0JCW9mX25vZGVfcHV0KGRldi0+cGxhdGZvcm1fZGF0YSk7CisJaWYgKGRldi0+YXJjaGRhdGEub2Zfbm9kZSkgeworCQkvKiBYWFggc2hvdWxkIGZyZWUgVENFIHRhYmxlICovCisJCW9mX25vZGVfcHV0KGRldi0+YXJjaGRhdGEub2Zfbm9kZSk7CiAJfQogCWtmcmVlKHRvX3Zpb19kZXYoZGV2KSk7CiB9CkBAIC0yMTAsNyArMjExLDcgQEAKICAqIEBvZl9ub2RlOglUaGUgT0Ygbm9kZSBmb3IgdGhpcyBkZXZpY2UuCiAgKgogICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSB2aW9fZGV2IHN0cnVjdHVyZSBmcm9tIHRoZSBkYXRhIGluCi0gKiBvZl9ub2RlIChkZXYucGxhdGZvcm1fZGF0YSkgYW5kIGFkZHMgaXQgdG8gdGhlIGxpc3Qgb2YgdmlydHVhbCBkZXZpY2VzLgorICogb2Zfbm9kZSBhbmQgYWRkcyBpdCB0byB0aGUgbGlzdCBvZiB2aXJ0dWFsIGRldmljZXMuCiAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCB2aW9fZGV2IG9yIE5VTEwgaWYgbm9kZSBoYXMKICAqIE5VTEwgZGV2aWNlX3R5cGUgb3IgY29tcGF0aWJsZSBmaWVsZHMuCiAgKi8KQEAgLTI0MCw4ICsyNDEsNiBAQAogCWlmICh2aW9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQl2aW9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gb2Zfbm9kZV9nZXQob2Zfbm9kZSk7Ci0KIAl2aW9kZXYtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9mX25vZGUsIDApOwogCiAJc25wcmludGYodmlvZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiV4IiwgKnVuaXRfYWRkcmVzcyk7CkBAIC0yNTQsNyArMjUzLDEwIEBACiAJCWlmICh1bml0X2FkZHJlc3MgIT0gTlVMTCkKIAkJCXZpb2Rldi0+dW5pdF9hZGRyZXNzID0gKnVuaXRfYWRkcmVzczsKIAl9Ci0JdmlvZGV2LT5pb21tdV90YWJsZSA9IHZpb19idWlsZF9pb21tdV90YWJsZSh2aW9kZXYpOworCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUgPSBvZl9ub2RlX2dldChvZl9ub2RlKTsKKwl2aW9kZXYtPmRldi5hcmNoZGF0YS5kbWFfb3BzID0gJmRtYV9pb21tdV9vcHM7CisJdmlvZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSB2aW9fYnVpbGRfaW9tbXVfdGFibGUodmlvZGV2KTsKKwl2aW9kZXYtPmRldi5hcmNoZGF0YS5udW1hX25vZGUgPSBvZl9ub2RlX3RvX25pZChvZl9ub2RlKTsKIAogCS8qIGluaXQgZ2VuZXJpYyAnc3RydWN0IGRldmljZScgZmllbGRzOiAqLwogCXZpb2Rldi0+ZGV2LnBhcmVudCA9ICZ2aW9fYnVzX2RldmljZS5kZXY7CkBAIC0yODUsMTAgKzI4NywxMSBAQAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7CiAJCWlvbW11X3Zpb19pbml0KCk7Ci0JCXZpb19idXNfZGV2aWNlLmlvbW11X3RhYmxlID0gJnZpb19pb21tdV90YWJsZTsKKwkJdmlvX2J1c19kZXZpY2UuZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmZG1hX2lvbW11X29wczsKKwkJdmlvX2J1c19kZXZpY2UuZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gJnZpb19pb21tdV90YWJsZTsKIAkJaVNlcmllc192aW9fZGV2ID0gJnZpb19idXNfZGV2aWNlLmRldjsKIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAogCWVyciA9IGJ1c19yZWdpc3RlcigmdmlvX2J1c190eXBlKTsKIAlpZiAoZXJyKSB7CkBAIC0zMzYsNyArMzM5LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGRldnNwZWNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IGRldi0+YXJjaGRhdGEub2Zfbm9kZTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBvZl9ub2RlID8gb2Zfbm9kZS0+ZnVsbF9uYW1lIDogIm5vbmUiKTsKIH0KQEAgLTM1Myw2MiArMzU2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wodmlvX3VucmVnaXN0ZXJfZGV2aWNlKTsKIAotc3RhdGljIGRtYV9hZGRyX3QgdmlvX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwKLQkJCSAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlyZXR1cm4gaW9tbXVfbWFwX3NpbmdsZSh0b192aW9fZGV2KGRldiktPmlvbW11X3RhYmxlLCB2YWRkciwgc2l6ZSwKLQkJCX4wdWwsIGRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpb191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCSAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JaW9tbXVfdW5tYXBfc2luZ2xlKHRvX3Zpb19kZXYoZGV2KS0+aW9tbXVfdGFibGUsIGRtYV9oYW5kbGUsIHNpemUsCi0JCQlkaXJlY3Rpb24pOwotfQotCi1zdGF0aWMgaW50IHZpb19tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCXJldHVybiBpb21tdV9tYXBfc2coZGV2LCB0b192aW9fZGV2KGRldiktPmlvbW11X3RhYmxlLCBzZ2xpc3QsCi0JCQluZWxlbXMsIH4wdWwsIGRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpb191bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JaW9tbXVfdW5tYXBfc2codG9fdmlvX2RldihkZXYpLT5pb21tdV90YWJsZSwgc2dsaXN0LCBuZWxlbXMsIGRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkICp2aW9fYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCi17Ci0JcmV0dXJuIGlvbW11X2FsbG9jX2NvaGVyZW50KHRvX3Zpb19kZXYoZGV2KS0+aW9tbXVfdGFibGUsIHNpemUsCi0JCQlkbWFfaGFuZGxlLCB+MHVsLCBmbGFnLCAtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpb19mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKLXsKLQlpb21tdV9mcmVlX2NvaGVyZW50KHRvX3Zpb19kZXYoZGV2KS0+aW9tbXVfdGFibGUsIHNpemUsIHZhZGRyLAotCQkJZG1hX2hhbmRsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlvX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RydWN0IGRtYV9tYXBwaW5nX29wcyB2aW9fZG1hX29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQgPSB2aW9fYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgPSB2aW9fZnJlZV9jb2hlcmVudCwKLQkubWFwX3NpbmdsZSA9IHZpb19tYXBfc2luZ2xlLAotCS51bm1hcF9zaW5nbGUgPSB2aW9fdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cgPSB2aW9fbWFwX3NnLAotCS51bm1hcF9zZyA9IHZpb191bm1hcF9zZywKLQkuZG1hX3N1cHBvcnRlZCA9IHZpb19kbWFfc3VwcG9ydGVkLAotfTsKLQogc3RhdGljIGludCB2aW9fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAljb25zdCBzdHJ1Y3QgdmlvX2RldiAqdmlvX2RldiA9IHRvX3Zpb19kZXYoZGV2KTsKQEAgLTQyMiwxMyArMzY5LDE0IEBACiAJCQljaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKIHsKIAljb25zdCBzdHJ1Y3QgdmlvX2RldiAqdmlvX2RldiA9IHRvX3Zpb19kZXYoZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAJY29uc3QgY2hhciAqY3A7CiAJaW50IGxlbmd0aDsKIAogCWlmICghbnVtX2VudnApCiAJCXJldHVybiAtRU5PTUVNOwogCisJZG4gPSBkZXYtPmFyY2hkYXRhLm9mX25vZGU7CiAJaWYgKCFkbikKIAkJcmV0dXJuIC1FTk9ERVY7CiAJY3AgPSBnZXRfcHJvcGVydHkoZG4sICJjb21wYXRpYmxlIiwgJmxlbmd0aCk7CkBAIC00NjUsNyArNDEzLDcgQEAKICovCiBjb25zdCB2b2lkICp2aW9fZ2V0X2F0dHJpYnV0ZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwgY2hhciAqd2hpY2gsIGludCAqbGVuZ3RoKQogewotCXJldHVybiBnZXRfcHJvcGVydHkodmRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIHdoaWNoLCBsZW5ndGgpOworCXJldHVybiBnZXRfcHJvcGVydHkodmRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUsIHdoaWNoLCBsZW5ndGgpOwogfQogRVhQT1JUX1NZTUJPTCh2aW9fZ2V0X2F0dHJpYnV0ZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQppbmRleCA5MzQ0MWU3Li4zOGE4MTk2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIAogb2JqLXkJCQkJOj0gZmF1bHQubyBtZW0ubyBsbWIubwogb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gaW5pdF8zMi5vIHBndGFibGVfMzIubyBtbXVfY29udGV4dF8zMi5vCi1oYXNoLSQoQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNKSA6PSBoYXNoX25hdGl2ZV82NC5vCitoYXNoLSQoQ09ORklHX1BQQ19OQVRJVkUpCTo9IGhhc2hfbmF0aXZlXzY0Lm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IGluaXRfNjQubyBwZ3RhYmxlXzY0Lm8gbW11X2NvbnRleHRfNjQubyBcCiAJCQkJICAgaGFzaF91dGlsc182NC5vIGhhc2hfbG93XzY0Lm8gdGxiXzY0Lm8gXAogCQkJCSAgIHNsYl9sb3cubyBzbGIubyBzdGFiLm8gbW1hcC5vIGltYWxsb2MubyBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCmluZGV4IGU4ZmE1MDYuLjAzYWViM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCkBAIC00MjYsMTggKzQyNiwyMSBAQAogCiAJLyoga2VybmVsIGhhcyBhY2Nlc3NlZCBhIGJhZCBhcmVhICovCiAKLQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QgZm9yICIpOwogCXN3aXRjaCAocmVncy0+dHJhcCkgewotCQljYXNlIDB4MzAwOgotCQljYXNlIDB4MzgwOgotCQkJcHJpbnRrKCJkYXRhIGF0IGFkZHJlc3MgMHglMDhseFxuIiwgcmVncy0+ZGFyKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4NDAwOgotCQljYXNlIDB4NDgwOgotCQkJcHJpbnRrKCJpbnN0cnVjdGlvbiBmZXRjaFxuIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygidW5rbm93biBmYXVsdFxuIik7CisJY2FzZSAweDMwMDoKKwljYXNlIDB4MzgwOgorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QgZm9yICIKKwkJCSJkYXRhIGF0IGFkZHJlc3MgMHglMDhseFxuIiwgcmVncy0+ZGFyKTsKKwkJYnJlYWs7CisJY2FzZSAweDQwMDoKKwljYXNlIDB4NDgwOgorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QgZm9yICIKKwkJCSJpbnN0cnVjdGlvbiBmZXRjaFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCBmb3IgIgorCQkJInVua25vd24gZmF1bHRcbiIpOworCQlicmVhazsKIAl9CiAJcHJpbnRrKEtFUk5fQUxFUlQgIkZhdWx0aW5nIGluc3RydWN0aW9uIGFkZHJlc3M6IDB4JTA4bHhcbiIsCiAJCXJlZ3MtPm5pcCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCmluZGV4IGM5MGYxMjQuLjZmMTAxNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAljbGVhcl9iaXQoSFBURV9MT0NLX0JJVCwgd29yZCk7CiB9CiAKLWxvbmcgbmF0aXZlX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwgdW5zaWduZWQgbG9uZyB2YSwKK3N0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsIHVuc2lnbmVkIGxvbmcgdmEsCiAJCQl1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHJmbGFncywKIAkJCXVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCAxOTE1NjYxLi5jMGQyYTY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCSAqIE5vdCBpbiB0aGUgZGV2aWNlLXRyZWUsIGxldCdzIGZhbGxiYWNrIG9uIGtub3duIHNpemUKIAkgKiBsaXN0IGZvciAxNk0gY2FwYWJsZSBHUCAmIEdSCiAJICovCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSXzE2TV9QQUdFKSAmJiAhbWFjaGluZV9pcyhpc2VyaWVzKSkKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfMTZNX1BBR0UpKQogCQltZW1jcHkobW11X3BzaXplX2RlZnMsIG1tdV9wc2l6ZV9kZWZhdWx0c19ncCwKIAkJICAgICAgIHNpemVvZihtbXVfcHNpemVfZGVmYXVsdHNfZ3ApKTsKICBmb3VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCmluZGV4IDNmZjM3NDYuLjlhMTc4NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJCS8qIEdGUF9BVE9NSUMgdG8gYXZvaWQgbWlnaHRfc2xlZXAgd2FybmluZ3MgZHVyaW5nIGJvb3QgKi8KIAkJa2NvcmVfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtjb3JlX2xpc3QpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFrY29yZV9tZW0pCi0JCQlwYW5pYygibWVtX2luaXQ6IGttYWxsb2MgZmFpbGVkXG4iKTsKKwkJCXBhbmljKCIlczoga21hbGxvYyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAkJa2NsaXN0X2FkZChrY29yZV9tZW0sIF9fdmEoYmFzZSksIHNpemUpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCmluZGV4IDhmY2FjYjAuLjE4OTFkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwpAQCAtMTQxLDMxICsxNDEsMjEgQEAKIAlfX2ZyZWVfcGFnZShwdGVwYWdlKTsKIH0KIAotI2lmbmRlZiBDT05GSUdfUEhZU182NEJJVAogdm9pZCBfX2lvbWVtICoKIGlvcmVtYXAocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAoYWRkciwgc2l6ZSwgX1BBR0VfTk9fQ0FDSEUpOwogfQotI2Vsc2UgLyogQ09ORklHX1BIWVNfNjRCSVQgKi8KLXZvaWQgX19pb21lbSAqCi1pb3JlbWFwNjQodW5zaWduZWQgbG9uZyBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gX19pb3JlbWFwKGFkZHIsIHNpemUsIF9QQUdFX05PX0NBQ0hFKTsKLX0KLUVYUE9SVF9TWU1CT0woaW9yZW1hcDY0KTsKLQotdm9pZCBfX2lvbWVtICoKLWlvcmVtYXAocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXBoeXNfYWRkcl90IGFkZHI2NCA9IGZpeHVwX2JpZ3BoeXNfYWRkcihhZGRyLCBzaXplKTsKLQotCXJldHVybiBpb3JlbWFwNjQoYWRkcjY0LCBzaXplKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUEhZU182NEJJVCAqLwogRVhQT1JUX1NZTUJPTChpb3JlbWFwKTsKIAogdm9pZCBfX2lvbWVtICoKK2lvcmVtYXBfZmxhZ3MocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBfX2lvcmVtYXAoYWRkciwgc2l6ZSwgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpb3JlbWFwX2ZsYWdzKTsKKwordm9pZCBfX2lvbWVtICoKIF9faW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyB2LCBpOwpAQCAtMjY0LDIwICsyNTQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIAotdm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IGxlbikKLXsKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAocG9ydCArIF9JT19CQVNFKTsKLX0KLQotdm9pZCBpb3BvcnRfdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQotewotCS8qIE5vdGhpbmcgdG8gZG8gKi8KLX0KLUVYUE9SVF9TWU1CT0woaW9wb3J0X21hcCk7Ci1FWFBPUlRfU1lNQk9MKGlvcG9ydF91bm1hcCk7Ci0KLWludAotbWFwX3BhZ2UodW5zaWduZWQgbG9uZyB2YSwgcGh5c19hZGRyX3QgcGEsIGludCBmbGFncykKK2ludCBtYXBfcGFnZSh1bnNpZ25lZCBsb25nIHZhLCBwaHlzX2FkZHJfdCBwYSwgaW50IGZsYWdzKQogewogCXBtZF90ICpwZDsKIAlwdGVfdCAqcGc7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwppbmRleCBhYzY0ZjRhLi4xNmU0ZWUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfY29tKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwYSwKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfY29tKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgcGEsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CkBAIC0xMjksMjIgKzEyOSwxMiBAQAogCXJldHVybiAodm9pZCBfX2lvbWVtICopIChlYSArIChhZGRyICYgflBBR0VfTUFTSykpOwogfQogCi0KLXZvaWQgX19pb21lbSAqCi1pb3JlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBfX2lvcmVtYXAoYWRkciwgc2l6ZSwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLX0KLQotdm9pZCBfX2lvbWVtICogX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAordm9pZCBfX2lvbWVtICogX19pb3JlbWFwKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgcGEsIGVhOwogCXZvaWQgX19pb21lbSAqcmV0OwogCi0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCXJldHVybiAodm9pZCBfX2lvbWVtICopYWRkcjsKLQogCS8qCiAJICogQ2hvb3NlIGFuIGFkZHJlc3MgdG8gbWFwIGl0IHRvLgogCSAqIE9uY2UgdGhlIGltYWxsb2Mgc3lzdGVtIGlzIHJ1bm5pbmcsIHdlIHVzZSBpdC4KQEAgLTE3OCw5ICsxNjgsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCisKK3ZvaWQgX19pb21lbSAqIGlvcmVtYXAocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7CisKKwlpZiAocHBjX21kLmlvcmVtYXApCisJCXJldHVybiBwcGNfbWQuaW9yZW1hcChhZGRyLCBzaXplLCBmbGFncyk7CisJcmV0dXJuIF9faW9yZW1hcChhZGRyLCBzaXplLCBmbGFncyk7Cit9CisKK3ZvaWQgX19pb21lbSAqIGlvcmVtYXBfZmxhZ3MocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmIChwcGNfbWQuaW9yZW1hcCkKKwkJcmV0dXJuIHBwY19tZC5pb3JlbWFwKGFkZHIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gX19pb3JlbWFwKGFkZHIsIHNpemUsIGZsYWdzKTsKK30KKworCiAjZGVmaW5lIElTX1BBR0VfQUxJR05FRChfdmFsKSAoKF92YWwpID09ICgoX3ZhbCkgJiBQQUdFX01BU0spKQogCi1pbnQgX19pb3JlbWFwX2V4cGxpY2l0KHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgZWEsCitpbnQgX19pb3JlbWFwX2V4cGxpY2l0KHBoeXNfYWRkcl90IHBhLCB1bnNpZ25lZCBsb25nIGVhLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CkBAIC0yMzUsMTMgKzI0NCwxMCBAQAogICoKICAqIFhYWAl3aGF0IGFib3V0IGNhbGxzIGJlZm9yZSBtZW1faW5pdF9kb25lIChpZSBweXRob25fY291bnRlcm1lYXN1cmVzKCkpCiAgKi8KLXZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnRva2VuKQordm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKIHsKIAl2b2lkICphZGRyOwogCi0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCXJldHVybjsKLQogCWlmICghbWVtX2luaXRfZG9uZSkKIAkJcmV0dXJuOwogCQpAQCAtMjUwLDYgKzI1NiwxNCBAQAogCWltX2ZyZWUoYWRkcik7CiB9CiAKK3ZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnRva2VuKQoreworCWlmIChwcGNfbWQuaW91bm1hcCkKKwkJcHBjX21kLmlvdW5tYXAodG9rZW4pOworCWVsc2UKKwkJX19pb3VubWFwKHRva2VuKTsKK30KKwogc3RhdGljIGludCBpb3VubWFwX3N1YnNldF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CkBAIC0yNjgsNyArMjgyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGlvdW5tYXBfZXhwbGljaXQodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoraW50IF9faW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC0zMDMsOCArMzE3LDEwIEBACiB9CiAKIEVYUE9SVF9TWU1CT0woaW9yZW1hcCk7CitFWFBPUlRfU1lNQk9MKGlvcmVtYXBfZmxhZ3MpOwogRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKK0VYUE9SVF9TWU1CT0woX19pb3VubWFwKTsKIAogdm9pZCBfX2lvbWVtICogcmVzZXJ2ZV9waGJfaW9zcGFjZSh1bnNpZ25lZCBsb25nIHNpemUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xiLmMgYi9hcmNoL3Bvd2VycGMvbW0vc2xiLmMKaW5kZXggZDM3MzM5MS4uMjI0ZTk2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3NsYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKICNpZmRlZiBERUJVRwpAQCAtMTkzLDYgKzE5NCw3IEBACiB2b2lkIHNsYl9pbml0aWFsaXplKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBsaW5lYXJfbGxwLCB2bWFsbG9jX2xscCwgaW9fbGxwOworCXVuc2lnbmVkIGxvbmcgbGZsYWdzLCB2ZmxhZ3M7CiAJc3RhdGljIGludCBzbGJfZW5jb2RpbmdfaW5pdGVkOwogCWV4dGVybiB1bnNpZ25lZCBpbnQgKnNsYl9taXNzX2tlcm5lbF9sb2FkX2xpbmVhcjsKIAlleHRlcm4gdW5zaWduZWQgaW50ICpzbGJfbWlzc19rZXJuZWxfbG9hZF9pbzsKQEAgLTIyNSwxMSArMjI3LDEyIEBACiAjZW5kaWYKIAl9CiAKKwlnZXRfcGFjYSgpLT5zdGFiX3JyID0gU0xCX05VTV9CT0xURUQ7CisKIAkvKiBPbiBpU2VyaWVzIHRoZSBib2x0ZWQgZW50cmllcyBoYXZlIGFscmVhZHkgYmVlbiBzZXQgdXAgYnkKIAkgKiB0aGUgaHlwZXJ2aXNvciBmcm9tIHRoZSBscGFyTWFwIGRhdGEgaW4gaGVhZC5TICovCi0jaWZuZGVmIENPTkZJR19QUENfSVNFUklFUwotIHsKLQl1bnNpZ25lZCBsb25nIGxmbGFncywgdmZsYWdzOworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm47CiAKIAlsZmxhZ3MgPSBTTEJfVlNJRF9LRVJORUwgfCBsaW5lYXJfbGxwOwogCXZmbGFncyA9IFNMQl9WU0lEX0tFUk5FTCB8IHZtYWxsb2NfbGxwOwpAQCAtMjQ3LDggKzI1MCw0IEBACiAJICogZWxzZXdoZXJlLCB3ZSdsbCBjYWxsIF9zd2l0Y2goKSB3aGljaCB3aWxsIGJvbHQgaW4gdGhlIG5ldwogCSAqIG9uZS4gKi8KIAlhc20gdm9sYXRpbGUoImlzeW5jIjo6OiJtZW1vcnkiKTsKLSB9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCi0KLQlnZXRfcGFjYSgpLT5zdGFiX3JyID0gU0xCX05VTV9CT0xURUQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKaW5kZXggMGI1ZGY5Yy4uNGNjZWYyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMTEsNiArMTEsNyBAQAogCQl0aW1lcl9pbnQubyApCiAKIG9wcm9maWxlLXkgOj0gJChEUklWRVJfT0JKUykgY29tbW9uLm8gYmFja3RyYWNlLm8KK29wcm9maWxlLSQoQ09ORklHX1BQQ19DRUxMX05BVElWRSkgKz0gb3BfbW9kZWxfY2VsbC5vCiBvcHJvZmlsZS0kKENPTkZJR19QUEM2NCkgKz0gb3BfbW9kZWxfcnM2NC5vIG9wX21vZGVsX3Bvd2VyNC5vCiBvcHJvZmlsZS0kKENPTkZJR19GU0xfQk9PS0UpICs9IG9wX21vZGVsX2ZzbF9ib29rZS5vCiBvcHJvZmlsZS0kKENPTkZJR182eHgpICs9IG9wX21vZGVsXzc0NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDYzYmJlZjMuLmI2ZDgyMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTY5LDcgKzY5LDEwIEBACiAKIHN0YXRpYyBpbnQgb3BfcG93ZXJwY19zdGFydCh2b2lkKQogewotCW9uX2VhY2hfY3B1KG9wX3Bvd2VycGNfY3B1X3N0YXJ0LCBOVUxMLCAwLCAxKTsKKwlpZiAobW9kZWwtPmdsb2JhbF9zdGFydCkKKwkJbW9kZWwtPmdsb2JhbF9zdGFydChjdHIpOworCWlmIChtb2RlbC0+c3RhcnQpCisJCW9uX2VhY2hfY3B1KG9wX3Bvd2VycGNfY3B1X3N0YXJ0LCBOVUxMLCAwLCAxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODAsNyArODMsMTAgQEAKIAogc3RhdGljIHZvaWQgb3BfcG93ZXJwY19zdG9wKHZvaWQpCiB7Ci0Jb25fZWFjaF9jcHUob3BfcG93ZXJwY19jcHVfc3RvcCwgTlVMTCwgMCwgMSk7CisJaWYgKG1vZGVsLT5zdG9wKQorCQlvbl9lYWNoX2NwdShvcF9wb3dlcnBjX2NwdV9zdG9wLCBOVUxMLCAwLCAxKTsKKyAgICAgICAgaWYgKG1vZGVsLT5nbG9iYWxfc3RvcCkKKyAgICAgICAgICAgICAgICBtb2RlbC0+Z2xvYmFsX3N0b3AoKTsKIH0KIAogc3RhdGljIGludCBvcF9wb3dlcnBjX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KQpAQCAtMTQxLDYgKzE0NywxMSBAQAogCiAJc3dpdGNoIChjdXJfY3B1X3NwZWMtPm9wcm9maWxlX3R5cGUpIHsKICNpZmRlZiBDT05GSUdfUFBDNjQKKyNpZmRlZiBDT05GSUdfUFBDX0NFTExfTkFUSVZFCisJCWNhc2UgUFBDX09QUk9GSUxFX0NFTEw6CisJCQltb2RlbCA9ICZvcF9tb2RlbF9jZWxsOworCQkJYnJlYWs7CisjZW5kaWYKIAkJY2FzZSBQUENfT1BST0ZJTEVfUlM2NDoKIAkJCW1vZGVsID0gJm9wX21vZGVsX3JzNjQ7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjE1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCkBAIC0wLDAgKzEsNzI0IEBACisvKgorICogQ2VsbCBCcm9hZGJhbmQgRW5naW5lIE9Qcm9maWxlIFN1cHBvcnQKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2CisgKgorICogQXV0aG9yOiBEYXZpZCBFcmIgKGRqZXJiQHVzLmlibS5jb20pCisgKiBNb2RpZmljYXRpb25zOgorICogICAgICAgICBDYXJsIExvdmUgPGNhcmxsQHVzLmlibS5jb20+CisgKiAgICAgICAgIE1heW5hcmQgSm9obnNvbiA8bWF5bmFyZGpAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vY2VsbC1wbXUuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL3J0YXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICIuLi9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuaCIKKworI2RlZmluZSBQUFVfQ1lDTEVTX0VWRU5UX05VTSAxCS8qICBldmVudCBudW1iZXIgZm9yIENZQ0xFUyAqLworI2RlZmluZSBDQkVfQ09VTlRfQUxMX0NZQ0xFUyAweDQyODAwMDAwCS8qIFBQVSBjeWNsZSBldmVudCBzcGVjaWZpZXIgKi8KKworI2RlZmluZSBOVU1fVEhSRUFEUyAyCisjZGVmaW5lIFZJUlRfQ05UUl9TV19USU1FX05TIDEwMDAwMDAwMAkvLyAwLjUgc2Vjb25kcworCitzdHJ1Y3QgcG1jX2NudHJsX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgdmNudHI7CisJdW5zaWduZWQgbG9uZyBldm50czsKKwl1bnNpZ25lZCBsb25nIG1hc2tzOworCXVuc2lnbmVkIGxvbmcgZW5hYmxlZDsKK307CisKKy8qCisgKiBpYm0sY2JlLXBlcmZ0b29scyBydGFzIHBhcmFtZXRlcnMKKyAqLworCitzdHJ1Y3QgcG1fc2lnbmFsIHsKKwl1MTYgY3B1OwkJLyogUHJvY2Vzc29yIHRvIG1vZGlmeSAqLworCXUxNiBzdWJfdW5pdDsJCS8qIGh3IHN1YnVuaXQgdGhpcyBhcHBsaWVzIHRvIChpZiBhcHBsaWNhYmxlKSAqLworCXUxNiBzaWduYWxfZ3JvdXA7CS8qIFNpZ25hbCBHcm91cCB0byBFbmFibGUvRGlzYWJsZSAqLworCXU4IGJ1c193b3JkOwkJLyogRW5hYmxlL0Rpc2FibGUgb24gdGhpcyBUcmFjZS9UcmlnZ2VyL0V2ZW50CisJCQkJICogQnVzIFdvcmQocykgKGJpdG1hc2spCisJCQkJICovCisJdTggYml0OwkJCS8qIFRyaWdnZXIvRXZlbnQgYml0IChpZiBhcHBsaWNhYmxlKSAqLworfTsKKworLyoKKyAqIHJ0YXMgY2FsbCBhcmd1bWVudHMKKyAqLworZW51bSB7CisJU1VCRlVOQ19SRVNFVCA9IDEsCisJU1VCRlVOQ19BQ1RJVkFURSA9IDIsCisJU1VCRlVOQ19ERUFDVElWQVRFID0gMywKKworCVBBU1NUSFJVX0lHTk9SRSA9IDAsCisJUEFTU1RIUlVfRU5BQkxFID0gMSwKKwlQQVNTVEhSVV9ESVNBQkxFID0gMiwKK307CisKK3N0cnVjdCBwbV9jbnRybCB7CisJdTE2IGVuYWJsZTsKKwl1MTYgc3RvcF9hdF9tYXg7CisJdTE2IHRyYWNlX21vZGU7CisJdTE2IGZyZWV6ZTsKKwl1MTYgY291bnRfbW9kZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMiBncm91cF9jb250cm9sOworCXUzMiBkZWJ1Z19idXNfY29udHJvbDsKKwlzdHJ1Y3QgcG1fY250cmwgcG1fY250cmw7CisJdTMyIHBtMDdfY250cmxbTlJfUEhZU19DVFJTXTsKK30gcG1fcmVnczsKKworCisjZGVmaW5lIEdFVF9TVUJfVU5JVCh4KSAoKHggJiAweDAwMDBmMDAwKSA+PiAxMikKKyNkZWZpbmUgR0VUX0JVU19XT1JEKHgpICgoeCAmIDB4MDAwMDAwZjApID4+IDQpCisjZGVmaW5lIEdFVF9CVVNfVFlQRSh4KSAoKHggJiAweDAwMDAwMzAwKSA+PiA4KQorI2RlZmluZSBHRVRfUE9MQVJJVFkoeCkgKCh4ICYgMHgwMDAwMDAwMikgPj4gMSkKKyNkZWZpbmUgR0VUX0NPVU5UX0NZQ0xFUyh4KSAoeCAmIDB4MDAwMDAwMDEpCisjZGVmaW5lIEdFVF9JTlBVVF9DT05UUk9MKHgpICgoeCAmIDB4MDAwMDAwMDQpID4+IDIpCisKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmdbTlJfUEhZU19DVFJTXSwgcG1jX3ZhbHVlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcG1jX2NudHJsX2RhdGEgcG1jX2NudHJsW05VTV9USFJFQURTXVtOUl9QSFlTX0NUUlNdOworCisvKiBJbnRlcnBldGF0aW9uIG9mIGhkd190aHJlYWQ6CisgKiAwIC0gZXZlbiB2aXJ0dWFsIGNwdXMgMCwgMiwgNCwuLi4KKyAqIDEgLSBvZGQgdmlydHVhbCBjcHVzIDEsIDMsIDUsIC4uLgorICovCitzdGF0aWMgdTMyIGhkd190aHJlYWQ7CisKK3N0YXRpYyB1MzIgdmlydF9jbnRyX2ludGVyX21hc2s7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXJfdmlydF9jbnRyOworCisvKiBwbV9zaWduYWwgbmVlZHMgdG8gYmUgZ2xvYmFsIHNpbmNlIGl0IGlzIGluaXRpYWxpemVkIGluCisgKiBjZWxsX3JlZ19zZXR1cCBhdCB0aGUgdGltZSB3aGVuIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAqIGlzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBwbV9zaWduYWwgcG1fc2lnbmFsW05SX1BIWVNfQ1RSU107CitzdGF0aWMgaW50IHBtX3J0YXNfdG9rZW47CisKK3N0YXRpYyB1MzIgcmVzZXRfdmFsdWVbTlJfUEhZU19DVFJTXTsKK3N0YXRpYyBpbnQgbnVtX2NvdW50ZXJzOworc3RhdGljIGludCBvcHJvZmlsZV9ydW5uaW5nOworc3RhdGljIHNwaW5sb2NrX3QgdmlydF9jbnRyX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKK3N0YXRpYyB1MzIgY3RyX2VuYWJsZWQ7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRyYWNlX2J1c1s0XTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlucHV0X2J1c1syXTsKKworLyoKKyAqIEZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludAorcnRhc19pYm1fY2JlX3BlcmZ0b29scyhpbnQgc3ViZnVuYywgaW50IHBhc3N0aHJ1LAorCQkgICAgICAgdm9pZCAqYWRkcmVzcywgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJdTY0IHBhZGRyID0gX19wYShhZGRyZXNzKTsKKworCXJldHVybiBydGFzX2NhbGwocG1fcnRhc190b2tlbiwgNSwgMSwgTlVMTCwgc3ViZnVuYywgcGFzc3RocnUsCisJCQkgcGFkZHIgPj4gMzIsIHBhZGRyICYgMHhmZmZmZmZmZiwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgcG1fcnRhc19yZXNldF9zaWduYWxzKHUzMiBub2RlKQoreworCWludCByZXQ7CisJc3RydWN0IHBtX3NpZ25hbCBwbV9zaWduYWxfbG9jYWw7CisKKwkvKiAgVGhlIGRlYnVnIGJ1cyBpcyBiZWluZyBzZXQgdG8gdGhlIHBhc3N0aHJ1IGRpc2FibGUgc3RhdGUuCisJICogIEhvd2V2ZXIsIHRoZSBGVyBzdGlsbCBleHBlY3RzIGF0bGVhc3Qgb25lIGxlZ2FsIHNpZ25hbCByb3V0aW5nCisJICogIGVudHJ5IG9yIGl0IHdpbGwgcmV0dXJuIGFuIGVycm9yIG9uIHRoZSBhcmd1bWVudHMuICBJZiB3ZSBkb24ndAorCSAqICBzdXBwbHkgYSB2YWxpZCBlbnRyeSwgd2UgbXVzdCBpZ25vcmUgYWxsIHJldHVybiB2YWx1ZXMuICBJZ25vcmluZworCSAqICBhbGwgcmV0dXJuIHZhbHVlcyBtZWFucyB3ZSBtaWdodCBtaXNzIGFuIGVycm9yIHdlIHNob3VsZCBiZQorCSAqICBjb25jZXJuZWQgYWJvdXQuCisJICovCisKKwkvKiAgZncgZXhwZWN0cyBwaHlzaWNhbCBjcHUgIy4gKi8KKwlwbV9zaWduYWxfbG9jYWwuY3B1ID0gbm9kZTsKKwlwbV9zaWduYWxfbG9jYWwuc2lnbmFsX2dyb3VwID0gMjE7CisJcG1fc2lnbmFsX2xvY2FsLmJ1c193b3JkID0gMTsKKwlwbV9zaWduYWxfbG9jYWwuc3ViX3VuaXQgPSAwOworCXBtX3NpZ25hbF9sb2NhbC5iaXQgPSAwOworCisJcmV0ID0gcnRhc19pYm1fY2JlX3BlcmZ0b29scyhTVUJGVU5DX1JFU0VULCBQQVNTVEhSVV9ESVNBQkxFLAorCQkJCSAgICAgJnBtX3NpZ25hbF9sb2NhbCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcG1fc2lnbmFsKSk7CisKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnRhcyByZXR1cm5lZDogJWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtX3J0YXNfYWN0aXZhdGVfc2lnbmFscyh1MzIgbm9kZSwgdTMyIGNvdW50KQoreworCWludCByZXQ7CisJaW50IGo7CisJc3RydWN0IHBtX3NpZ25hbCBwbV9zaWduYWxfbG9jYWxbTlJfUEhZU19DVFJTXTsKKworCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCS8qIGZ3IGV4cGVjdHMgcGh5c2ljYWwgY3B1ICMgKi8KKwkJcG1fc2lnbmFsX2xvY2FsW2pdLmNwdSA9IG5vZGU7CisJCXBtX3NpZ25hbF9sb2NhbFtqXS5zaWduYWxfZ3JvdXAgPSBwbV9zaWduYWxbal0uc2lnbmFsX2dyb3VwOworCQlwbV9zaWduYWxfbG9jYWxbal0uYnVzX3dvcmQgPSBwbV9zaWduYWxbal0uYnVzX3dvcmQ7CisJCXBtX3NpZ25hbF9sb2NhbFtqXS5zdWJfdW5pdCA9IHBtX3NpZ25hbFtqXS5zdWJfdW5pdDsKKwkJcG1fc2lnbmFsX2xvY2FsW2pdLmJpdCA9IHBtX3NpZ25hbFtqXS5iaXQ7CisJfQorCisJcmV0ID0gcnRhc19pYm1fY2JlX3BlcmZ0b29scyhTVUJGVU5DX0FDVElWQVRFLCBQQVNTVEhSVV9FTkFCTEUsCisJCQkJICAgICBwbV9zaWduYWxfbG9jYWwsCisJCQkJICAgICBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcG1fc2lnbmFsKSk7CisKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnRhcyByZXR1cm5lZDogJWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKKy8qCisgKiBQTSBTaWduYWwgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIHNldF9wbV9ldmVudCh1MzIgY3RyLCBpbnQgZXZlbnQsIHUzMiB1bml0X21hc2spCit7CisJc3RydWN0IHBtX3NpZ25hbCAqcDsKKwl1MzIgc2lnbmFsX2JpdDsKKwl1MzIgYnVzX3dvcmQsIGJ1c190eXBlLCBjb3VudF9jeWNsZXMsIHBvbGFyaXR5LCBpbnB1dF9jb250cm9sOworCWludCBqLCBpOworCisJaWYgKGV2ZW50ID09IFBQVV9DWUNMRVNfRVZFTlRfTlVNKSB7CisJCS8qIFNwZWNpYWwgRXZlbnQ6IENvdW50IGFsbCBjcHUgY3ljbGVzICovCisJCXBtX3JlZ3MucG0wN19jbnRybFtjdHJdID0gQ0JFX0NPVU5UX0FMTF9DWUNMRVM7CisJCXAgPSAmKHBtX3NpZ25hbFtjdHJdKTsKKwkJcC0+c2lnbmFsX2dyb3VwID0gMjE7CisJCXAtPmJ1c193b3JkID0gMTsKKwkJcC0+c3ViX3VuaXQgPSAwOworCQlwLT5iaXQgPSAwOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlwbV9yZWdzLnBtMDdfY250cmxbY3RyXSA9IDA7CisJfQorCisJYnVzX3dvcmQgPSBHRVRfQlVTX1dPUkQodW5pdF9tYXNrKTsKKwlidXNfdHlwZSA9IEdFVF9CVVNfVFlQRSh1bml0X21hc2spOworCWNvdW50X2N5Y2xlcyA9IEdFVF9DT1VOVF9DWUNMRVModW5pdF9tYXNrKTsKKwlwb2xhcml0eSA9IEdFVF9QT0xBUklUWSh1bml0X21hc2spOworCWlucHV0X2NvbnRyb2wgPSBHRVRfSU5QVVRfQ09OVFJPTCh1bml0X21hc2spOworCXNpZ25hbF9iaXQgPSAoZXZlbnQgJSAxMDApOworCisJcCA9ICYocG1fc2lnbmFsW2N0cl0pOworCisJcC0+c2lnbmFsX2dyb3VwID0gZXZlbnQgLyAxMDA7CisJcC0+YnVzX3dvcmQgPSBidXNfd29yZDsKKwlwLT5zdWJfdW5pdCA9IHVuaXRfbWFzayAmIDB4MDAwMGYwMDA7CisKKwlwbV9yZWdzLnBtMDdfY250cmxbY3RyXSA9IDA7CisJcG1fcmVncy5wbTA3X2NudHJsW2N0cl0gfD0gUE0wN19DVFJfQ09VTlRfQ1lDTEVTKGNvdW50X2N5Y2xlcyk7CisJcG1fcmVncy5wbTA3X2NudHJsW2N0cl0gfD0gUE0wN19DVFJfUE9MQVJJVFkocG9sYXJpdHkpOworCXBtX3JlZ3MucG0wN19jbnRybFtjdHJdIHw9IFBNMDdfQ1RSX0lOUFVUX0NPTlRST0woaW5wdXRfY29udHJvbCk7CisKKwlpZiAoaW5wdXRfY29udHJvbCA9PSAwKSB7CisJCWlmIChzaWduYWxfYml0ID4gMzEpIHsKKwkJCXNpZ25hbF9iaXQgLT0gMzI7CisJCQlpZiAoYnVzX3dvcmQgPT0gMHgzKQorCQkJCWJ1c193b3JkID0gMHgyOworCQkJZWxzZSBpZiAoYnVzX3dvcmQgPT0gMHhjKQorCQkJCWJ1c193b3JkID0gMHg4OworCQl9CisKKwkJaWYgKChidXNfdHlwZSA9PSAwKSAmJiBwLT5zaWduYWxfZ3JvdXAgPj0gNjApCisJCQlidXNfdHlwZSA9IDI7CisJCWlmICgoYnVzX3R5cGUgPT0gMSkgJiYgcC0+c2lnbmFsX2dyb3VwID49IDUwKQorCQkJYnVzX3R5cGUgPSAwOworCisJCXBtX3JlZ3MucG0wN19jbnRybFtjdHJdIHw9IFBNMDdfQ1RSX0lOUFVUX01VWChzaWduYWxfYml0KTsKKwl9IGVsc2UgeworCQlwbV9yZWdzLnBtMDdfY250cmxbY3RyXSA9IDA7CisJCXAtPmJpdCA9IHNpZ25hbF9iaXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoYnVzX3dvcmQgJiAoMSA8PCBpKSkgeworCQkJcG1fcmVncy5kZWJ1Z19idXNfY29udHJvbCB8PQorCQkJICAgIChidXNfdHlwZSA8PCAoMzEgLSAoMiAqIGkpICsgMSkpOworCisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJaWYgKGlucHV0X2J1c1tqXSA9PSAweGZmKSB7CisJCQkJCWlucHV0X2J1c1tqXSA9IGk7CisJCQkJCXBtX3JlZ3MuZ3JvdXBfY29udHJvbCB8PQorCQkJCQkgICAgKGkgPDwgKDMxIC0gaSkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CitvdXQ6CisJOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9wbV9jbnRybChpbnQgY3B1LCBzdHJ1Y3QgcG1fY250cmwgKnBtX2NudHJsKQoreworCS8qIE9wcm9maWxlIHdpbGwgdXNlIDMyIGJpdCBjb3VudGVycywgc2V0IGJpdHMgNzoxMCB0byAwICovCisJdTMyIHZhbCA9IDA7CisJaWYgKHBtX2NudHJsLT5lbmFibGUgPT0gMSkKKwkJdmFsIHw9IENCRV9QTV9FTkFCTEVfUEVSRl9NT047CisKKwlpZiAocG1fY250cmwtPnN0b3BfYXRfbWF4ID09IDEpCisJCXZhbCB8PSBDQkVfUE1fU1RPUF9BVF9NQVg7CisKKwlpZiAocG1fY250cmwtPnRyYWNlX21vZGUgPT0gMSkKKwkJdmFsIHw9IENCRV9QTV9UUkFDRV9NT0RFX1NFVChwbV9jbnRybC0+dHJhY2VfbW9kZSk7CisKKwlpZiAocG1fY250cmwtPmZyZWV6ZSA9PSAxKQorCQl2YWwgfD0gQ0JFX1BNX0ZSRUVaRV9BTExfQ1RSUzsKKworCS8qIFJvdXRpbmUgc2V0X2NvdW50X21vZGUgbXVzdCBiZSBjYWxsZWQgcHJldmlvdXNseSB0byBzZXQKKwkgKiB0aGUgY291bnQgbW9kZSBiYXNlZCBvbiB0aGUgdXNlciBzZWxlY3Rpb24gb2YgdXNlciBhbmQga2VybmVsLgorCSAqLworCXZhbCB8PSBDQkVfUE1fQ09VTlRfTU9ERV9TRVQocG1fY250cmwtPmNvdW50X21vZGUpOworCWNiZV93cml0ZV9wbShjcHUsIHBtX2NvbnRyb2wsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X2NvdW50X21vZGUodTMyIGtlcm5lbCwgdTMyIHVzZXIsIHN0cnVjdCBwbV9jbnRybCAqcG1fY250cmwpCit7CisJLyogVGhlIHVzZXIgbXVzdCBzcGVjaWZ5IHVzZXIgYW5kIGtlcm5lbCBpZiB0aGV5IHdhbnQgdGhlbS4gSWYKKwkgKiAgbmVpdGhlciBpcyBzcGVjaWZpZWQsIE9Qcm9maWxlIHdpbGwgY291bnQgaW4gaHlwZXJ2aXNvciBtb2RlCisJICovCisJaWYgKGtlcm5lbCkgeworCQlpZiAodXNlcikKKwkJCXBtX2NudHJsLT5jb3VudF9tb2RlID0gQ0JFX0NPVU5UX0FMTF9NT0RFUzsKKwkJZWxzZQorCQkJcG1fY250cmwtPmNvdW50X21vZGUgPSBDQkVfQ09VTlRfU1VQRVJWSVNPUl9NT0RFOworCX0gZWxzZSB7CisJCWlmICh1c2VyKQorCQkJcG1fY250cmwtPmNvdW50X21vZGUgPSBDQkVfQ09VTlRfUFJPQkxFTV9NT0RFOworCQllbHNlCisJCQlwbV9jbnRybC0+Y291bnRfbW9kZSA9IENCRV9DT1VOVF9IWVBFUlZJU09SX01PREU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2N0cih1MzIgY3B1LCB1MzIgY3RyLCB1MzIgKiBwbTA3X2NudHJsKQoreworCisJcG0wN19jbnRybFtjdHJdIHw9IFBNMDdfQ1RSX0VOQUJMRSgxKTsKKwljYmVfd3JpdGVfcG0wN19jb250cm9sKGNwdSwgY3RyLCBwbTA3X2NudHJsW2N0cl0pOworfQorCisvKgorICogT3Byb2ZpbGUgaXMgZXhwZWN0ZWQgdG8gY29sbGVjdCBkYXRhIG9uIGFsbCBDUFVzIHNpbXVsdGFuZW91c2x5LgorICogSG93ZXZlciwgdGhlcmUgaXMgb25lIHNldCBvZiBwZXJmb3JtYW5jZSBjb3VudGVycyBwZXIgbm9kZS4gIFRoZXJlIGFyZQorICogdHdvIGhhcmR3YXJlIHRocmVhZHMgb3IgdmlydHVhbCBDUFVzIG9uIGVhY2ggbm9kZS4gIEhlbmNlLCBPUHJvZmlsZSBtdXN0CisgKiBtdWx0aXBsZXggaW4gdGltZSB0aGUgcGVyZm9ybWFuY2UgY291bnRlciBjb2xsZWN0aW9uIG9uIHRoZSB0d28gdmlydHVhbAorICogQ1BVcy4gIFRoZSBtdWx0aXBsZXhpbmcgb2YgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGlzIGRvbmUgYnkgdGhpcworICogdmlydHVhbCBjb3VudGVyIHJvdXRpbmUuCisgKgorICogVGhlIHBtY192YWx1ZXMgdXNlZCBiZWxvdyBpcyBkZWZpbmVkIGFzICdwZXItY3B1JyBidXQgaXRzIHVzZSBpcworICogbW9yZSBha2luIHRvICdwZXItbm9kZScuICBXZSBuZWVkIHRvIHN0b3JlIHR3byBzZXRzIG9mIGNvdW50ZXIKKyAqIHZhbHVlcyBwZXIgbm9kZSAtLSBvbmUgZm9yIHRoZSBwcmV2aW91cyBydW4gYW5kIG9uZSBmb3IgdGhlIG5leHQuCisgKiBUaGUgcGVyLWNwdVtOUl9QSFlTX0NUUlNdIGdpdmVzIHVzIHRoZSBzdG9yYWdlIHdlIG5lZWQuICBFYWNoIG9kZC9ldmVuCisgKiBwYWlyIG9mIHBlci1jcHUgYXJyYXlzIGlzIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHByZXZpb3VzIGFuZCBuZXh0CisgKiBwbWMgdmFsdWVzIGZvciBhIGdpdmVuIG5vZGUuCisgKiBOT1RFOiBXZSB1c2UgdGhlIHBlci1jcHUgdmFyaWFibGUgdG8gaW1wcm92ZSBjYWNoZSBwZXJmb3JtYW5jZS4KKyAqLworc3RhdGljIHZvaWQgY2VsbF92aXJ0dWFsX2NudHIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIFRoaXMgcm91dGluZSB3aWxsIGFsdGVybmF0ZSBsb2FkaW5nIHRoZSB2aXJ0dWFsIGNvdW50ZXJzIGZvcgorCSAqIHZpcnR1YWwgQ1BVcworCSAqLworCWludCBpLCBwcmV2X2hkd190aHJlYWQsIG5leHRfaGR3X3RocmVhZDsKKwl1MzIgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJydXB0X2hhbmRlciBhbmQKKwkgKiB0aGUgdmlydCBjb3VudGVyIGFyZSBub3QgYm90aCBwbGF5aW5nIHdpdGgKKwkgKiB0aGUgY291bnRlcnMgb24gdGhlIHNhbWUgbm9kZS4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXJ0X2NudHJfbG9jaywgZmxhZ3MpOworCisJcHJldl9oZHdfdGhyZWFkID0gaGR3X3RocmVhZDsKKworCS8qIHN3aXRjaCB0aGUgY3B1IGhhbmRsaW5nIHRoZSBpbnRlcnJ1cHRzICovCisJaGR3X3RocmVhZCA9IDEgXiBoZHdfdGhyZWFkOworCW5leHRfaGR3X3RocmVhZCA9IGhkd190aHJlYWQ7CisKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgb25seSBvbmNlIHBlciBlYWNoIG5vZGUsIGJ1dAorCSAqIHdlIG5lZWQgY3B1ICMsIG5vdCBub2RlICMsIHRvIHBhc3MgdG8gdGhlIGNiZV94eHggZnVuY3Rpb25zLgorCSAqLworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmIChjYmVfZ2V0X2h3X3RocmVhZF9pZChjcHUpKQorCQkJY29udGludWU7CisKKwkJLyogc3RvcCBjb3VudGVycywgc2F2ZSBjb3VudGVyIHZhbHVlcywgcmVzdG9yZSBjb3VudHMKKwkJICogZm9yIHByZXZpb3VzIHRocmVhZAorCQkgKi8KKwkJY2JlX2Rpc2FibGVfcG0oY3B1KTsKKwkJY2JlX2Rpc2FibGVfcG1faW50ZXJydXB0cyhjcHUpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyBpKyspIHsKKwkJCXBlcl9jcHUocG1jX3ZhbHVlcywgY3B1ICsgcHJldl9oZHdfdGhyZWFkKVtpXQorCQkJICAgID0gY2JlX3JlYWRfY3RyKGNwdSwgaSk7CisKKwkJCWlmIChwZXJfY3B1KHBtY192YWx1ZXMsIGNwdSArIG5leHRfaGR3X3RocmVhZClbaV0KKwkJCSAgICA9PSAweEZGRkZGRkZGKQorCQkJCS8qIElmIHRoZSBjbnRyIHZhbHVlIGlzIDB4ZmZmZmZmZmYsIHdlIG11c3QKKwkJCQkgKiByZXNldCB0aGF0IHRvIDB4ZmZmZmZmZjAgd2hlbiB0aGUgY3VycmVudAorCQkJCSAqIHRocmVhZCBpcyByZXN0YXJ0ZWQuICBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBuZXcKKwkJCQkgKiBpbnRlcnJ1cHQgYW5kIG1ha2Ugc3VyZSB0aGF0IHdlIG5ldmVyIHJlc3RvcmUKKwkJCQkgKiB0aGUgY291bnRlcnMgdG8gdGhlIG1heCB2YWx1ZS4gIElmIHRoZSBjb3VudGVycworCQkJCSAqIHdlcmUgcmVzdG9yZWQgdG8gdGhlIG1heCB2YWx1ZSwgdGhleSBkbyBub3QKKwkJCQkgKiBpbmNyZW1lbnQgYW5kIG5vIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4gIEhlbmNlCisJCQkJICogbm8gbW9yZSBzYW1wbGVzIHdpbGwgYmUgY29sbGVjdGVkIG9uIHRoYXQgY3B1LgorCQkJCSAqLworCQkJCWNiZV93cml0ZV9jdHIoY3B1LCBpLCAweEZGRkZGRkYwKTsKKwkJCWVsc2UKKwkJCQljYmVfd3JpdGVfY3RyKGNwdSwgaSwKKwkJCQkJICAgICAgcGVyX2NwdShwbWNfdmFsdWVzLAorCQkJCQkJICAgICAgY3B1ICsKKwkJCQkJCSAgICAgIG5leHRfaGR3X3RocmVhZClbaV0pOworCQl9CisKKwkJLyogU3dpdGNoIHRvIHRoZSBvdGhlciB0aHJlYWQuIENoYW5nZSB0aGUgaW50ZXJydXB0CisJCSAqIGFuZCBjb250cm9sIHJlZ3MgdG8gYmUgc2NoZWR1bGVkIG9uIHRoZSBDUFUKKwkJICogY29ycmVzcG9uZGluZyB0byB0aGUgdGhyZWFkIHRvIGV4ZWN1dGUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyBpKyspIHsKKwkJCWlmIChwbWNfY250cmxbbmV4dF9oZHdfdGhyZWFkXVtpXS5lbmFibGVkKSB7CisJCQkJLyogVGhlcmUgYXJlIHNvbWUgcGVyIHRocmVhZCBldmVudHMuCisJCQkJICogTXVzdCBkbyB0aGUgc2V0IGV2ZW50LCBlbmFibGVfY250cgorCQkJCSAqIGZvciBlYWNoIGNwdS4KKwkJCQkgKi8KKwkJCQlzZXRfcG1fZXZlbnQoaSwKKwkJCQkgICAgIHBtY19jbnRybFtuZXh0X2hkd190aHJlYWRdW2ldLmV2bnRzLAorCQkJCSAgICAgcG1jX2NudHJsW25leHRfaGR3X3RocmVhZF1baV0ubWFza3MpOworCQkJCWVuYWJsZV9jdHIoY3B1LCBpLAorCQkJCQkgICBwbV9yZWdzLnBtMDdfY250cmwpOworCQkJfSBlbHNlIHsKKwkJCQljYmVfd3JpdGVfcG0wN19jb250cm9sKGNwdSwgaSwgMCk7CisJCQl9CisJCX0KKworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgQ1BVIHRocmVhZCB0aGF0IGlzIHN0YXJ0aW5nICovCisJCWNiZV9lbmFibGVfcG1faW50ZXJydXB0cyhjcHUsIG5leHRfaGR3X3RocmVhZCwKKwkJCQkJIHZpcnRfY250cl9pbnRlcl9tYXNrKTsKKwkJY2JlX2VuYWJsZV9wbShjcHUpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpcnRfY250cl9sb2NrLCBmbGFncyk7CisKKwltb2RfdGltZXIoJnRpbWVyX3ZpcnRfY250ciwgamlmZmllcyArIEhaIC8gMTApOworfQorCitzdGF0aWMgdm9pZCBzdGFydF92aXJ0X2NudHJzKHZvaWQpCit7CisJaW5pdF90aW1lcigmdGltZXJfdmlydF9jbnRyKTsKKwl0aW1lcl92aXJ0X2NudHIuZnVuY3Rpb24gPSBjZWxsX3ZpcnR1YWxfY250cjsKKwl0aW1lcl92aXJ0X2NudHIuZGF0YSA9IDBVTDsKKwl0aW1lcl92aXJ0X2NudHIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDEwOworCWFkZF90aW1lcigmdGltZXJfdmlydF9jbnRyKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgYWxsIGNwdXMgY29tYmluZWQgKi8KK3N0YXRpYyB2b2lkCitjZWxsX3JlZ19zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0ciwKKwkgICAgICAgc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywgaW50IG51bV9jdHJzKQoreworCWludCBpLCBqLCBjcHU7CisKKwlwbV9ydGFzX3Rva2VuID0gcnRhc190b2tlbigiaWJtLGNiZS1wZXJmdG9vbHMiKTsKKwlpZiAocG1fcnRhc190b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlRBU19VTktOT1dOX1NFUlZJQ0VcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwludW1fY291bnRlcnMgPSBudW1fY3RyczsKKworCXBtX3JlZ3MuZ3JvdXBfY29udHJvbCA9IDA7CisJcG1fcmVncy5kZWJ1Z19idXNfY29udHJvbCA9IDA7CisKKwkvKiBzZXR1cCB0aGUgcG1fY29udHJvbCByZWdpc3RlciAqLworCW1lbXNldCgmcG1fcmVncy5wbV9jbnRybCwgMCwgc2l6ZW9mKHN0cnVjdCBwbV9jbnRybCkpOworCXBtX3JlZ3MucG1fY250cmwuc3RvcF9hdF9tYXggPSAxOworCXBtX3JlZ3MucG1fY250cmwudHJhY2VfbW9kZSA9IDA7CisJcG1fcmVncy5wbV9jbnRybC5mcmVlemUgPSAxOworCisJc2V0X2NvdW50X21vZGUoc3lzLT5lbmFibGVfa2VybmVsLCBzeXMtPmVuYWJsZV91c2VyLAorCQkgICAgICAgJnBtX3JlZ3MucG1fY250cmwpOworCisJLyogU2V0dXAgdGhlIHRocmVhZCAwIGV2ZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fY3RyczsgKytpKSB7CisKKwkJcG1jX2NudHJsWzBdW2ldLmV2bnRzID0gY3RyW2ldLmV2ZW50OworCQlwbWNfY250cmxbMF1baV0ubWFza3MgPSBjdHJbaV0udW5pdF9tYXNrOworCQlwbWNfY250cmxbMF1baV0uZW5hYmxlZCA9IGN0cltpXS5lbmFibGVkOworCQlwbWNfY250cmxbMF1baV0udmNudHIgPSBpOworCisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKQorCQkJcGVyX2NwdShwbWNfdmFsdWVzLCBqKVtpXSA9IDA7CisJfQorCisJLyogU2V0dXAgdGhlIHRocmVhZCAxIGV2ZW50cywgbWFwIHRoZSB0aHJlYWQgMCBldmVudCB0byB0aGUKKwkgKiBlcXVpdmFsZW50IHRocmVhZCAxIGV2ZW50LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fY3RyczsgKytpKSB7CisJCWlmICgoY3RyW2ldLmV2ZW50ID49IDIxMDApICYmIChjdHJbaV0uZXZlbnQgPD0gMjExMSkpCisJCQlwbWNfY250cmxbMV1baV0uZXZudHMgPSBjdHJbaV0uZXZlbnQgKyAxOTsKKwkJZWxzZSBpZiAoY3RyW2ldLmV2ZW50ID09IDIyMDMpCisJCQlwbWNfY250cmxbMV1baV0uZXZudHMgPSBjdHJbaV0uZXZlbnQ7CisJCWVsc2UgaWYgKChjdHJbaV0uZXZlbnQgPj0gMjIwMCkgJiYgKGN0cltpXS5ldmVudCA8PSAyMjE1KSkKKwkJCXBtY19jbnRybFsxXVtpXS5ldm50cyA9IGN0cltpXS5ldmVudCArIDE2OworCQllbHNlCisJCQlwbWNfY250cmxbMV1baV0uZXZudHMgPSBjdHJbaV0uZXZlbnQ7CisKKwkJcG1jX2NudHJsWzFdW2ldLm1hc2tzID0gY3RyW2ldLnVuaXRfbWFzazsKKwkJcG1jX2NudHJsWzFdW2ldLmVuYWJsZWQgPSBjdHJbaV0uZW5hYmxlZDsKKwkJcG1jX2NudHJsWzFdW2ldLnZjbnRyID0gaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQl0cmFjZV9idXNbaV0gPSAweGZmOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJaW5wdXRfYnVzW2ldID0gMHhmZjsKKworCS8qIE91ciBjb3VudGVycyBjb3VudCB1cCwgYW5kICJjb3VudCIgcmVmZXJzIHRvCisJICogaG93IG11Y2ggYmVmb3JlIHRoZSBuZXh0IGludGVycnVwdCwgYW5kIHdlIGludGVycnVwdAorCSAqIG9uIG92ZXJmbG93LiAgU28gd2UgY2FsY3VsYXRlIHRoZSBzdGFydGluZyB2YWx1ZQorCSAqIHdoaWNoIHdpbGwgZ2l2ZSB1cyAiY291bnQiIHVudGlsIG92ZXJmbG93LgorCSAqIFRoZW4gd2Ugc2V0IHRoZSBldmVudHMgb24gdGhlIGVuYWJsZWQgY291bnRlcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCS8qIHN0YXJ0IHdpdGggdmlydHVhbCBjb3VudGVyIHNldCAwICovCisJCWlmIChwbWNfY250cmxbMF1baV0uZW5hYmxlZCkgeworCQkJLyogVXNpbmcgMzJiaXQgY291bnRlcnMsIHJlc2V0IG1heCAtIGNvdW50ICovCisJCQlyZXNldF92YWx1ZVtpXSA9IDB4RkZGRkZGRkYgLSBjdHJbaV0uY291bnQ7CisJCQlzZXRfcG1fZXZlbnQoaSwKKwkJCQkgICAgIHBtY19jbnRybFswXVtpXS5ldm50cywKKwkJCQkgICAgIHBtY19jbnRybFswXVtpXS5tYXNrcyk7CisKKwkJCS8qIGdsb2JhbCwgdXNlZCBieSBjZWxsX2NwdV9zZXR1cCAqLworCQkJY3RyX2VuYWJsZWQgfD0gKDEgPDwgaSk7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIHRoZSBwcmV2aW91cyBjb3VudHMgZm9yIHRoZSB2aXJ0dWFsIGNudHJzICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCQkJcGVyX2NwdShwbWNfdmFsdWVzLCBjcHUpW2ldID0gcmVzZXRfdmFsdWVbaV07CisJCX0KK291dDoKKwk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggY3B1ICovCitzdGF0aWMgdm9pZCBjZWxsX2NwdV9zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmNudHIpCit7CisJdTMyIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1MzIgbnVtX2VuYWJsZWQgPSAwOworCWludCBpOworCisJLyogVGhlcmUgaXMgb25lIHBlcmZvcm1hbmNlIG1vbml0b3IgcGVyIHByb2Nlc3NvciBjaGlwIChpLmUuIG5vZGUpLAorCSAqIHNvIHdlIG9ubHkgbmVlZCB0byBwZXJmb3JtIHRoaXMgZnVuY3Rpb24gb25jZSBwZXIgbm9kZS4KKwkgKi8KKwlpZiAoY2JlX2dldF9od190aHJlYWRfaWQoY3B1KSkKKwkJZ290byBvdXQ7CisKKwlpZiAocG1fcnRhc190b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlRBU19VTktOT1dOX1NFUlZJQ0VcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTdG9wIGFsbCBjb3VudGVycyAqLworCWNiZV9kaXNhYmxlX3BtKGNwdSk7CisJY2JlX2Rpc2FibGVfcG1faW50ZXJydXB0cyhjcHUpOworCisJY2JlX3dyaXRlX3BtKGNwdSwgcG1faW50ZXJ2YWwsIDApOworCWNiZV93cml0ZV9wbShjcHUsIHBtX3N0YXJ0X3N0b3AsIDApOworCWNiZV93cml0ZV9wbShjcHUsIGdyb3VwX2NvbnRyb2wsIHBtX3JlZ3MuZ3JvdXBfY29udHJvbCk7CisJY2JlX3dyaXRlX3BtKGNwdSwgZGVidWdfYnVzX2NvbnRyb2wsIHBtX3JlZ3MuZGVidWdfYnVzX2NvbnRyb2wpOworCXdyaXRlX3BtX2NudHJsKGNwdSwgJnBtX3JlZ3MucG1fY250cmwpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCWlmIChjdHJfZW5hYmxlZCAmICgxIDw8IGkpKSB7CisJCQlwbV9zaWduYWxbbnVtX2VuYWJsZWRdLmNwdSA9IGNiZV9jcHVfdG9fbm9kZShjcHUpOworCQkJbnVtX2VuYWJsZWQrKzsKKwkJfQorCX0KKworCXBtX3J0YXNfYWN0aXZhdGVfc2lnbmFscyhjYmVfY3B1X3RvX25vZGUoY3B1KSwgbnVtX2VuYWJsZWQpOworb3V0OgorCTsKK30KKworc3RhdGljIHZvaWQgY2VsbF9nbG9iYWxfc3RhcnQoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCit7CisJdTMyIGNwdTsKKwl1MzIgaW50ZXJydXB0X21hc2sgPSAwOworCXUzMiBpOworCisJLyogVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIG9uY2UgZm9yIHRoZSBzeXN0ZW0uCisJICogVGhlcmUgaXMgb25lIHBlcmZvcm1hbmNlIG1vbml0b3IgcGVyIG5vZGUsIHNvIHdlCisJICogb25seSBuZWVkIHRvIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBvbmNlIHBlciBub2RlLgorCSAqLworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmIChjYmVfZ2V0X2h3X3RocmVhZF9pZChjcHUpKQorCQkJY29udGludWU7CisKKwkJaW50ZXJydXB0X21hc2sgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCQkJaWYgKGN0cl9lbmFibGVkICYgKDEgPDwgaSkpIHsKKwkJCQljYmVfd3JpdGVfY3RyKGNwdSwgaSwgcmVzZXRfdmFsdWVbaV0pOworCQkJCWVuYWJsZV9jdHIoY3B1LCBpLCBwbV9yZWdzLnBtMDdfY250cmwpOworCQkJCWludGVycnVwdF9tYXNrIHw9CisJCQkJICAgIENCRV9QTV9DVFJfT1ZFUkZMT1dfSU5UUihpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRGlzYWJsZSBjb3VudGVyICovCisJCQkJY2JlX3dyaXRlX3BtMDdfY29udHJvbChjcHUsIGksIDApOworCQkJfQorCQl9CisKKwkJY2JlX2NsZWFyX3BtX2ludGVycnVwdHMoY3B1KTsKKwkJY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSwgaGR3X3RocmVhZCwgaW50ZXJydXB0X21hc2spOworCQljYmVfZW5hYmxlX3BtKGNwdSk7CisJfQorCisJdmlydF9jbnRyX2ludGVyX21hc2sgPSBpbnRlcnJ1cHRfbWFzazsKKwlvcHJvZmlsZV9ydW5uaW5nID0gMTsKKwlzbXBfd21iKCk7CisKKwkvKiBOT1RFOiBzdGFydF92aXJ0X2NudHJzIHdpbGwgcmVzdWx0IGluIGNlbGxfdmlydHVhbF9jbnRyKCkgYmVpbmcKKwkgKiBleGVjdXRlZCB3aGljaCBtYW5pcHVsYXRlcyB0aGUgUE1VLiAgV2Ugc3RhcnQgdGhlICJ2aXJ0dWFsIGNvdW50ZXIiCisJICogaGVyZSBzbyB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgUE1VIGluCisJICogdGhlIGFib3ZlIGZvci1sb29wLgorCSAqLworCXN0YXJ0X3ZpcnRfY250cnMoKTsKK30KKworc3RhdGljIHZvaWQgY2VsbF9nbG9iYWxfc3RvcCh2b2lkKQoreworCWludCBjcHU7CisKKwkvKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgdGhlIHN5c3RlbS4KKwkgKiBUaGVyZSBpcyBvbmUgcGVyZm9ybWFuY2UgbW9uaXRvciBwZXIgbm9kZSwgc28gd2UKKwkgKiBvbmx5IG5lZWQgdG8gcGVyZm9ybSB0aGlzIGZ1bmN0aW9uIG9uY2UgcGVyIG5vZGUuCisJICovCisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyX3ZpcnRfY250cik7CisJb3Byb2ZpbGVfcnVubmluZyA9IDA7CisJc21wX3dtYigpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCisJCQljb250aW51ZTsKKworCQljYmVfc3luY19pcnEoY2JlX2NwdV90b19ub2RlKGNwdSkpOworCQkvKiBTdG9wIHRoZSBjb3VudGVycyAqLworCQljYmVfZGlzYWJsZV9wbShjcHUpOworCisJCS8qIERlYWN0aXZhdGUgdGhlIHNpZ25hbHMgKi8KKwkJcG1fcnRhc19yZXNldF9zaWduYWxzKGNiZV9jcHVfdG9fbm9kZShjcHUpKTsKKworCQkvKiBEZWFjdGl2YXRlIGludGVycnVwdHMgKi8KKwkJY2JlX2Rpc2FibGVfcG1faW50ZXJydXB0cyhjcHUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NlbGxfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCit7CisJdTMyIGNwdTsKKwl1NjQgcGM7CisJaW50IGlzX2tlcm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1MzIgaW50ZXJydXB0X21hc2s7CisJaW50IGk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZSB2aXJ0IGNvdW50ZXIKKwkgKiByb3V0aW5lIGFyZSBub3QgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLiBTZWUgdGhlCisJICogY2VsbF92aXJ0dWFsX2NudHIoKSByb3V0aW5lIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXJ0X2NudHJfbG9jaywgZmxhZ3MpOworCisJLyogTmVlZCB0byBkaXNhYmxlIGFuZCByZWVuYWJsZSB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMKKwkgKiB0byBnZXQgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZnJvbSB0aGUgaGFyZHdhcmUuICBUaGlzCisJICogaXMgaGFyZHdhcmUgc3BlY2lmaWMuCisJICovCisKKwljYmVfZGlzYWJsZV9wbShjcHUpOworCisJaW50ZXJydXB0X21hc2sgPSBjYmVfY2xlYXJfcG1faW50ZXJydXB0cyhjcHUpOworCisJLyogSWYgdGhlIGludGVycnVwdCBtYXNrIGhhcyBiZWVuIGNsZWFyZWQsIHRoZW4gdGhlIHZpcnQgY250cgorCSAqIGhhcyBjbGVhcmVkIHRoZSBpbnRlcnJ1cHQuICBXaGVuIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQKKwkgKiB0aGUgaW50ZXJydXB0IGlzIHJlc3RvcmVkLCB0aGUgZGF0YSBjb3VudCB3aWxsIGJlIHJlc3RvcmVkIHRvCisJICogMHhmZmZmZmYwIHRvIGNhdXNlIHRoZSBpbnRlcnJ1cHQgdG8gYmUgcmVnZW5lcmF0ZWQuCisJICovCisKKwlpZiAoKG9wcm9maWxlX3J1bm5pbmcgPT0gMSkgJiYgKGludGVycnVwdF9tYXNrICE9IDApKSB7CisJCXBjID0gcmVncy0+bmlwOworCQlpc19rZXJuZWwgPSBpc19rZXJuZWxfYWRkcihwYyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCQlpZiAoKGludGVycnVwdF9tYXNrICYgQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKGkpKQorCQkJICAgICYmIGN0cltpXS5lbmFibGVkKSB7CisJCQkJb3Byb2ZpbGVfYWRkX3BjKHBjLCBpc19rZXJuZWwsIGkpOworCQkJCWNiZV93cml0ZV9jdHIoY3B1LCBpLCByZXNldF92YWx1ZVtpXSk7CisJCQl9CisJCX0KKworCQkvKiBUaGUgY291bnRlcnMgd2VyZSBmcm96ZW4gYnkgdGhlIGludGVycnVwdC4KKwkJICogUmVlbmFibGUgdGhlIGludGVycnVwdCBhbmQgcmVzdGFydCB0aGUgY291bnRlcnMuCisJCSAqIElmIHRoZXJlIHdhcyBhIHJhY2UgYmV0d2VlbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYW5kCisJCSAqIHRoZSB2aXJ0dWFsIGNvdW50ZXIgcm91dGluZS4gIFRoZSB2aXJ1dGFsIGNvdW50ZXIKKwkJICogcm91dGluZSBtYXkgaGF2ZSBjbGVhcmVkIHRoZSBpbnRlcnJ1cHRzLiAgSGVuY2UgbXVzdAorCQkgKiB1c2UgdGhlIHZpcnRfY250cl9pbnRlcl9tYXNrIHRvIHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0cy4KKwkJICovCisJCWNiZV9lbmFibGVfcG1faW50ZXJydXB0cyhjcHUsIGhkd190aHJlYWQsCisJCQkJCSB2aXJ0X2NudHJfaW50ZXJfbWFzayk7CisKKwkJLyogVGhlIHdyaXRlcyB0byB0aGUgdmFyaW91cyBwZXJmb3JtYW5jZSBjb3VudGVycyBvbmx5IHdyaXRlcworCQkgKiB0byBhIGxhdGNoLiAgVGhlIG5ldyB2YWx1ZXMgKGludGVycnVwdCBzZXR0aW5nIGJpdHMsIHJlc2V0CisJCSAqIGNvdW50ZXIgdmFsdWUgZXRjLikgYXJlIG5vdCBjb3BpZWQgdG8gdGhlIGFjdHVhbCByZWdpc3RlcnMKKwkJICogdW50aWwgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgaXMgZW5hYmxlZC4gIEluIG9yZGVyIHRvIGdldAorCQkgKiB0aGlzIHRvIHdvcmsgYXMgZGVzaXJlZCwgdGhlIHBlcm1vcm1hbmNlIG1vbml0b3IgbmVlZHMgdG8KKwkJICogYmUgZGlzYWJsZWQgd2hpbGUgd3JpdHRpbmcgdG8gdGhlIGxhdGNoZXMuICBUaGlzIGlzIGEKKwkJICogSFcgZGVzaWduIGlzc3VlLgorCQkgKi8KKwkJY2JlX2VuYWJsZV9wbShjcHUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aXJ0X2NudHJfbG9jaywgZmxhZ3MpOworfQorCitzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9jZWxsID0geworCS5yZWdfc2V0dXAgPSBjZWxsX3JlZ19zZXR1cCwKKwkuY3B1X3NldHVwID0gY2VsbF9jcHVfc2V0dXAsCisJLmdsb2JhbF9zdGFydCA9IGNlbGxfZ2xvYmFsX3N0YXJ0LAorCS5nbG9iYWxfc3RvcCA9IGNlbGxfZ2xvYmFsX3N0b3AsCisJLmhhbmRsZV9pbnRlcnJ1cHQgPSBjZWxsX2hhbmRsZV9pbnRlcnJ1cHQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjE4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciA1Mnh4IGJhc2VkIGJvYXJkcworIworaWZlcSAoJChDT05GSUdfUFBDX01FUkdFKSx5KQorb2JqLXkJCQkJKz0gbXBjNTJ4eF9waWMubyBtcGM1Mnh4X2NvbW1vbi5vCitlbmRpZgorCitvYmotJChDT05GSUdfUFBDX0VGSUtBKQkJKz0gZWZpa2Etc2V0dXAubyBlZmlrYS1wY2kubworb2JqLSQoQ09ORklHX1BQQ19MSVRFNTIwMCkJKz0gbGl0ZTUyMDAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLXBjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTA1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EtcGNpLmMKQEAgLTAsMCArMSwxMTkgQEAKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorCisjaW5jbHVkZSAiZWZpa2EuaCIKKworI2lmZGVmIENPTkZJR19QQ0kKKy8qCisgKiBBY2Nlc3MgZnVuY3Rpb25zIGZvciBQQ0kgY29uZmlnIHNwYWNlIHVzaW5nIFJUQVMgY2FsbHMuCisgKi8KK3N0YXRpYyBpbnQgcnRhc19yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCisJCQkgICAgaW50IGxlbiwgdTMyICogdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKKwkgICAgfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQorCSAgICB8IChob3NlLT5pbmRleCA8PCAyNCk7CisJaW50IHJldCA9IC0xOworCWludCBydmFsOworCisJcnZhbCA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJyZWFkLXBjaS1jb25maWciKSwgMiwgMiwgJnJldCwgYWRkciwgbGVuKTsKKwkqdmFsID0gcmV0OworCXJldHVybiBydmFsID8gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EIDogUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHJ0YXNfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgaW50IG9mZnNldCwgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCisJICAgIHwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKKwkgICAgfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCWludCBydmFsOworCisJcnZhbCA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJ3cml0ZS1wY2ktY29uZmlnIiksIDMsIDEsIE5VTEwsCisJCQkgYWRkciwgbGVuLCB2YWwpOworCXJldHVybiBydmFsID8gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EIDogUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgcnRhc19wY2lfb3BzID0geworCXJ0YXNfcmVhZF9jb25maWcsCisJcnRhc193cml0ZV9jb25maWcKK307CisKK3ZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpCit7CisJY29uc3QgaW50ICpidXNfcmFuZ2U7CisJaW50IGxlbjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpY3RybDsKKworCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWlmIChyb290ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBFRklLQV9QTEFURk9STV9OQU1FCisJCSAgICAgICAiOiBVbmFibGUgdG8gZmluZCB0aGUgcm9vdCBub2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAocGNpY3RybCA9IE5VTEw7OykgeworCQlwY2ljdHJsID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgcGNpY3RybCk7CisJCWlmICgocGNpY3RybCA9PSBOVUxMKSB8fCAoc3RyY21wKHBjaWN0cmwtPm5hbWUsICJwY2kiKSA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCW9mX25vZGVfcHV0KHJvb3QpOworCisJaWYgKHBjaWN0cmwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIEVGSUtBX1BMQVRGT1JNX05BTUUKKwkJICAgICAgICI6IFVuYWJsZSB0byBmaW5kIHRoZSBQQ0kgYnJpZGdlIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJYnVzX3JhbmdlID0gZ2V0X3Byb3BlcnR5KHBjaWN0cmwsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRUZJS0FfUExBVEZPUk1fTkFNRQorCQkgICAgICAgIjogQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXNcbiIsIHBjaWN0cmwtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYnVzX3JhbmdlWzFdID09IGJ1c19yYW5nZVswXSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBFRklLQV9QTEFURk9STV9OQU1FICI6IFBDSSBidXMgJWQiLAorCQkgICAgICAgYnVzX3JhbmdlWzBdKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gRUZJS0FfUExBVEZPUk1fTkFNRSAiOiBQQ0kgYnVzZXMgJWQuLiVkIiwKKwkJICAgICAgIGJ1c19yYW5nZVswXSwgYnVzX3JhbmdlWzFdKTsKKwlwcmludGsoIiBjb250cm9sbGVkIGJ5ICVzXG4iLCBwY2ljdHJsLT5mdWxsX25hbWUpOworCXByaW50aygiXG4iKTsKKworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlpZiAoIWhvc2UpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBFRklLQV9QTEFURk9STV9OQU1FCisJCSAgICAgICAiOiBDYW4ndCBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yICVzXG4iLAorCQkgICAgICAgcGNpY3RybC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWhvc2UtPmFyY2hfZGF0YSA9IG9mX25vZGVfZ2V0KHBjaWN0cmwpOworCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlWzBdOworCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2VbMV07CisJaG9zZS0+b3BzID0gJnJ0YXNfcGNpX29wczsKKworCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgcGNpY3RybCwgMCk7Cit9CisKKyNlbHNlCit2b2lkIF9faW5pdCBlZmlrYV9wY2lzZXR1cCh2b2lkKQore30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLXNldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2Etc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBjOTgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLXNldHVwLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKgorICogRWZpa2EgNUsyIHBsYXRmb3JtIHNldHVwCisgKiBTb21lIGNvZGUgcmVhbGx5IGluc3BpcmVkIGZyb20gdGhlIGxpdGU1MjAwYiBwbGF0Zm9ybS4KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDA2IGJwbGFuIEdtYkgKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c3JlbGVhc2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3J0YXMuaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KKworI2luY2x1ZGUgImVmaWthLmgiCisKK3N0YXRpYyB2b2lkIGVmaWthX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290OworCWNvbnN0IGNoYXIgKnJldmlzaW9uID0gTlVMTDsKKwljb25zdCBjaGFyICpjb2RlZ2VuZGVzY3JpcHRpb24gPSBOVUxMOworCWNvbnN0IGNoYXIgKmNvZGVnZW52ZW5kb3IgPSBOVUxMOworCisJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJaWYgKHJvb3QpIHsKKwkJcmV2aXNpb24gPSBnZXRfcHJvcGVydHkocm9vdCwgInJldmlzaW9uIiwgTlVMTCk7CisJCWNvZGVnZW5kZXNjcmlwdGlvbiA9CisJCSAgICBnZXRfcHJvcGVydHkocm9vdCwgIkNPREVHRU4sZGVzY3JpcHRpb24iLCBOVUxMKTsKKwkJY29kZWdlbnZlbmRvciA9IGdldF9wcm9wZXJ0eShyb290LCAiQ09ERUdFTix2ZW5kb3IiLCBOVUxMKTsKKworCQlvZl9ub2RlX3B1dChyb290KTsKKwl9CisKKwlpZiAoY29kZWdlbmRlc2NyaXB0aW9uKQorCQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogJXNcbiIsIGNvZGVnZW5kZXNjcmlwdGlvbik7CisJZWxzZQorCQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogRWZpa2FcbiIpOworCisJaWYgKHJldmlzaW9uKQorCQlzZXFfcHJpbnRmKG0sICJyZXZpc2lvblx0OiAlc1xuIiwgcmV2aXNpb24pOworCisJaWYgKGNvZGVnZW52ZW5kb3IpCisJCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6ICVzXG4iLCBjb2RlZ2VudmVuZG9yKTsKKworCW9mX25vZGVfcHV0KHJvb3QpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZWZpa2Ffc2V0dXBfYXJjaCh2b2lkKQoreworCXJ0YXNfaW5pdGlhbGl6ZSgpOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKKworCWlmIChpbml0cmRfc3RhcnQpCisJCVJPT1RfREVWID0gUm9vdF9SQU0wOworCWVsc2UKKyNlbmRpZgorCQlST09UX0RFViA9IFJvb3RfU0RBMjsJLyogc2RhMiAoc2RhMSBpcyBmb3IgdGhlIGtlcm5lbCkgKi8KKworCWVmaWthX3BjaXNldHVwKCk7CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIkxpbnV4L1BQQyAiIFVUU19SRUxFQVNFICIgcnVubnVuZyBvbiBFZmlrYSA7LSlcbiIsIDB4MCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlZmlrYV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNucCA9IE5VTEw7CisJY29uc3QgdTMyICpiYXNlOworCisJLyogRmluZCBldmVyeSBjaGlsZCBvZiB0aGUgU09DIG5vZGUgYW5kIGFkZCBpdCB0byBvZl9wbGF0Zm9ybSAqLworCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImJ1aWx0aW4iKTsKKwlpZiAobnApIHsKKwkJY2hhciBuYW1lW0JVU19JRF9TSVpFXTsKKwkJd2hpbGUgKChjbnAgPSBvZl9nZXRfbmV4dF9jaGlsZChucCwgY25wKSkpIHsKKwkJCXN0cmNweShuYW1lLCBjbnAtPm5hbWUpOworCisJCQliYXNlID0gZ2V0X3Byb3BlcnR5KGNucCwgInJlZyIsIE5VTEwpOworCQkJaWYgKGJhc2UgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJc25wcmludGYobmFtZStzdHJsZW4obmFtZSksIEJVU19JRF9TSVpFLCAiQCV4IiwgKmJhc2UpOworCQkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShjbnAsIG5hbWUsIE5VTEwpOworCisJCQlwcmludGsoS0VSTl9JTkZPIEVGSUtBX1BMQVRGT1JNX05BTUUiIDogQWRkZWQgJXMgKHR5cGUgJyVzJyBhdCAnJXMnKSB0byB0aGUga25vd24gZGV2aWNlc1xuIiwgbmFtZSwgY25wLT50eXBlLCBjbnAtPmZ1bGxfbmFtZSk7CisJCX0KKwl9CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIiAgSGF2ZSBmdW4gd2l0aCB5b3VyIEVmaWthISAgICAiLCAweDc3NzcpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZmlrYV9wcm9iZSh2b2lkKQoreworCWNoYXIgKm1vZGVsID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChvZl9nZXRfZmxhdF9kdF9yb290KCksCisJCQkJCSAgIm1vZGVsIiwgTlVMTCk7CisKKwlpZiAobW9kZWwgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cmNtcChtb2RlbCwgIkVGSUtBNUsyIikpCisJCXJldHVybiAwOworCisJSVNBX0RNQV9USFJFU0hPTEQgPSB+MEw7CisJRE1BX01PREVfUkVBRCA9IDB4NDQ7CisJRE1BX01PREVfV1JJVEUgPSAweDQ4OworCisJcmV0dXJuIDE7Cit9CisKK2RlZmluZV9tYWNoaW5lKGVmaWthKQoreworCS5uYW1lID0gRUZJS0FfUExBVEZPUk1fTkFNRSwKKwkucHJvYmUgPSBlZmlrYV9wcm9iZSwKKwkuc2V0dXBfYXJjaCA9IGVmaWthX3NldHVwX2FyY2gsCisJLmluaXQgPSBlZmlrYV9pbml0LAorCS5zaG93X2NwdWluZm8gPSBlZmlrYV9zaG93X2NwdWluZm8sCisJLmluaXRfSVJRID0gbXBjNTJ4eF9pbml0X2lycSwKKwkuZ2V0X2lycSA9IG1wYzUyeHhfZ2V0X2lycSwKKwkucmVzdGFydCA9IHJ0YXNfcmVzdGFydCwKKwkucG93ZXJfb2ZmID0gcnRhc19wb3dlcl9vZmYsCisJLmhhbHQgPSBydGFzX2hhbHQsCisJLnNldF9ydGNfdGltZSA9IHJ0YXNfc2V0X3J0Y190aW1lLAorCS5nZXRfcnRjX3RpbWUgPSBydGFzX2dldF9ydGNfdGltZSwKKwkucHJvZ3Jlc3MgPSBydGFzX3Byb2dyZXNzLAorCS5nZXRfYm9vdF90aW1lID0gcnRhc19nZXRfYm9vdF90aW1lLAorCS5jYWxpYnJhdGVfZGVjciA9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLnBoeXNfbWVtX2FjY2Vzc19wcm90ID0gcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwNjBmZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBFZmlrYSA1SzIgcGxhdGZvcm0gc2V0dXAgLSBIZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBicGxhbiBHbWJICisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfUE9XRVJQQ19FRklLQV9fCisjZGVmaW5lIF9fQVJDSF9QT1dFUlBDX0VGSUtBX18KKworI2RlZmluZSBFRklLQV9QTEFURk9STV9OQU1FICJFZmlrYSIKKworZXh0ZXJuIHZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3NWMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogRnJlZXNjYWxlIExpdGU1MjAwIGJvYXJkIHN1cHBvcnQKKyAqCisgKiBXcml0dGVuIGJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisgKgorICogQ29weXJpZ2h0IChDKSBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIEZyZWVzY2FsZSBTZW1pY29uZHV0b3IsIEluYy4gMjAwNi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pcGljLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgPGFzbS9xZS5oPgorI2luY2x1ZGUgPGFzbS9xZV9pYy5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQorICoKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQKK2xpdGU1Mnh4X3NldHVwX2NwdSh2b2lkKQoreworCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqZ3BpbzsKKwl1MzIgcG9ydF9jb25maWc7CisKKwkvKiBNYXAgem9uZXMgKi8KKwlncGlvID0gbXBjNTJ4eF9maW5kX2FuZF9tYXAoIm1wYzUyeHgtZ3BpbyIpOworCWlmICghZ3BpbykgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogIgorCQkJIkVycm9yIHdoaWxlIG1hcHBpbmcgR1BJTyByZWdpc3RlciBmb3IgcG9ydCBjb25maWcuICIKKwkJCSJFeHBlY3Qgc29tZSBhYm5vcm1hbCBiZWhhdmlvclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogU2V0IHBvcnQgY29uZmlnICovCisJcG9ydF9jb25maWcgPSBpbl9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZyk7CisKKwlwb3J0X2NvbmZpZyAmPSB+MHgwMDgwMDAwMDsJLyogNDhNaHogaW50ZXJuYWwsIHBpbiBpcyBHUElPCSovCisKKwlwb3J0X2NvbmZpZyAmPSB+MHgwMDAwNzAwMDsJLyogVVNCIHBvcnQgOiBEaWZmZXJlbnRpYWwgbW9kZQkqLworCXBvcnRfY29uZmlnIHw9ICAweDAwMDAxMDAwOwkvKiAgICAgICAgICAgIFVTQiAxIG9ubHkJKi8KKworCXBvcnRfY29uZmlnICY9IH4weDAzMDAwMDAwOwkvKiBBVEEgQ1MgaXMgb24gY3NiXzQvNQkJKi8KKwlwb3J0X2NvbmZpZyB8PSAgMHgwMTAwMDAwMDsKKworCXByX2RlYnVnKCJwb3J0X2NvbmZpZzogb2xkOiV4IG5ldzoleFxuIiwKKwkgICAgICAgICBpbl9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZyksIHBvcnRfY29uZmlnKTsKKwlvdXRfYmUzMigmZ3Bpby0+cG9ydF9jb25maWcsIHBvcnRfY29uZmlnKTsKKworCS8qIFVubWFwIHpvbmUgKi8KK2Vycm9yOgorCWlvdW5tYXAoZ3Bpbyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsaXRlNTJ4eF9zZXR1cF9hcmNoKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygibGl0ZTUyeHhfc2V0dXBfYXJjaCgpIiwgMCk7CisKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKKwlpZiAobnApIHsKKwkJdW5zaWduZWQgaW50ICpmcCA9CisJCSAgICAoaW50ICopZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCWlmIChmcCAhPSAwKQorCQkJbG9vcHNfcGVyX2ppZmZ5ID0gKmZwIC8gSFo7CisJCWVsc2UKKwkJCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwIC8gSFo7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKwkvKiBDUFUgJiBQb3J0IG11eCBzZXR1cCAqLworCW1wYzUyeHhfc2V0dXBfY3B1KCk7CS8qIEdlbmVyaWMgKi8KKwlsaXRlNTJ4eF9zZXR1cF9jcHUoKTsJLyogUGxhdG9ybSBzcGVjaWZpYyAqLworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKGluaXRyZF9zdGFydCkKKwkJUk9PVF9ERVYgPSBSb290X1JBTTA7CisJZWxzZQorI2VuZGlmCisjaWZkZWYgIENPTkZJR19ST09UX05GUworCQlST09UX0RFViA9IFJvb3RfTkZTOworI2Vsc2UKKwkJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKKworfQorCit2b2lkIGxpdGU1Mnh4X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc3RydWN0IGRldmljZV9ub2RlKiBucCA9IG9mX2ZpbmRfYWxsX25vZGVzKE5VTEwpOworCWNvbnN0IGNoYXIgKm1vZGVsID0gTlVMTDsKKworCWlmIChucCkKKwkJbW9kZWwgPSBnZXRfcHJvcGVydHkobnAsICJtb2RlbCIsIE5VTEwpOworCisJc2VxX3ByaW50ZihtLCAidmVuZG9yXHRcdDoJRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOworCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0Ogklc1xuIiwgbW9kZWwgPyBtb2RlbCA6ICJ1bmtub3duIik7CisKKwlvZl9ub2RlX3B1dChucCk7Cit9CisKKy8qCisgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKKyAqLworc3RhdGljIGludCBfX2luaXQgbGl0ZTUyeHhfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG5vZGUgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisJY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJtb2RlbCIsIE5VTEwpOworCisJaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgImxpdGU1Mnh4IikpCisJCXJldHVybiAwOworCXByX2RlYnVnKCIlcyBib2FyZCB3LyBtcGM1Mnh4IGZvdW5kXG4iLCBtb2RlbCA/IG1vZGVsIDogInVua25vd24iKTsKKworCXJldHVybiAxOworfQorCitkZWZpbmVfbWFjaGluZShsaXRlNTJ4eCkgeworCS5uYW1lIAkJPSAibGl0ZTUyeHgiLAorCS5wcm9iZSAJCT0gbGl0ZTUyeHhfcHJvYmUsCisJLnNldHVwX2FyY2ggCT0gbGl0ZTUyeHhfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEgCT0gbXBjNTJ4eF9pbml0X2lycSwKKwkuZ2V0X2lycSAJPSBtcGM1Mnh4X2dldF9pcnEsCisJLnNob3dfY3B1aW5mbwk9IGxpdGU1Mnh4X3Nob3dfY3B1aW5mbywKKwkuY2FsaWJyYXRlX2RlY3IJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzMWZmNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgRnJlZXNjYWxlIE1QQzUyeHguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgorCisKK3ZvaWQgX19pb21lbSAqCittcGM1Mnh4X2ZpbmRfYW5kX21hcChjb25zdCBjaGFyICpjb21wYXRpYmxlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZuOworCWNvbnN0IHUzMiAqcmVnYWRkcl9wOworCXU2NCByZWdhZGRyNjQsIHNpemU2NDsKKworCW9mbiA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsIGNvbXBhdGlibGUpOworCWlmICghb2ZuKQorCQlyZXR1cm4gTlVMTDsKKworCXJlZ2FkZHJfcCA9IG9mX2dldF9hZGRyZXNzKG9mbiwgMCwgJnNpemU2NCwgTlVMTCk7CisJaWYgKCFyZWdhZGRyX3ApIHsKKwkJb2Zfbm9kZV9wdXQob2ZuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmVnYWRkcjY0ID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Mob2ZuLCByZWdhZGRyX3ApOworCisJb2Zfbm9kZV9wdXQob2ZuKTsKKworCXJldHVybiBpb3JlbWFwKCh1MzIpcmVnYWRkcjY0LCAodTMyKXNpemU2NCk7Cit9CitFWFBPUlRfU1lNQk9MKG1wYzUyeHhfZmluZF9hbmRfbWFwKTsKKworCisvKioKKyAqIAltcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEgLSBGaW5kIHRoZSBJUEIgYnVzIGZyZXF1ZW5jeSBmb3IgYSBkZXZpY2UKKyAqIAlAbm9kZToJZGV2aWNlIG5vZGUKKyAqCisgKiAJUmV0dXJucyBJUEIgYnVzIGZyZXF1ZW5jeSwgb3IgMCBpZiB0aGUgYnVzIGZyZXF1ZW5jeSBjYW5ub3QgYmUgZm91bmQuCisgKi8KK3Vuc2lnbmVkIGludAorbXBjNTJ4eF9maW5kX2lwYl9mcmVxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHVuc2lnbmVkIGludCAqcF9pcGJfZnJlcSA9IE5VTEw7CisKKwlvZl9ub2RlX2dldChub2RlKTsKKwl3aGlsZSAobm9kZSkgeworCQlwX2lwYl9mcmVxID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtZnJlcXVlbmN5IiwgTlVMTCk7CisJCWlmIChwX2lwYl9mcmVxKQorCQkJYnJlYWs7CisKKwkJbnAgPSBvZl9nZXRfcGFyZW50KG5vZGUpOworCQlvZl9ub2RlX3B1dChub2RlKTsKKwkJbm9kZSA9IG5wOworCX0KKwlpZiAobm9kZSkKKwkJb2Zfbm9kZV9wdXQobm9kZSk7CisKKwlyZXR1cm4gcF9pcGJfZnJlcSA/ICpwX2lwYl9mcmVxIDogMDsKK30KK0VYUE9SVF9TWU1CT0wobXBjNTJ4eF9maW5kX2lwYl9mcmVxKTsKKworCit2b2lkIF9faW5pdAorbXBjNTJ4eF9zZXR1cF9jcHUodm9pZCkKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9jZG0gIF9faW9tZW0gKmNkbTsKKwlzdHJ1Y3QgbXBjNTJ4eF94bGIgIF9faW9tZW0gKnhsYjsKKworCS8qIE1hcCB6b25lcyAqLworCWNkbSA9IG1wYzUyeHhfZmluZF9hbmRfbWFwKCJtcGM1Mnh4LWNkbSIpOworCXhsYiA9IG1wYzUyeHhfZmluZF9hbmRfbWFwKCJtcGM1Mnh4LXhsYiIpOworCisJaWYgKCFjZG0gfHwgIXhsYikgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogIgorCQkJIkVycm9yIHdoaWxlIG1hcHBpbmcgQ0RNL1hMQiBkdXJpbmcgbXBjNTJ4eF9zZXR1cF9jcHUuICIKKwkJCSJFeHBlY3Qgc29tZSBhYm5vcm1hbCBiZWhhdmlvclxuIik7CisJCWdvdG8gdW5tYXBfcmVnczsKKwl9CisKKwkvKiBVc2UgaW50ZXJuYWwgNDggTWh6ICovCisJb3V0XzgoJmNkbS0+ZXh0XzQ4bWh6X2VuLCAweDAwKTsKKwlvdXRfOCgmY2RtLT5mZF9lbmFibGUsIDB4MDEpOworCWlmIChpbl9iZTMyKCZjZG0tPnJzdGNmZykgJiAweDQwKQkvKiBBc3N1bWVzIDMzTWh6IGNsb2NrICovCisJCW91dF9iZTE2KCZjZG0tPmZkX2NvdW50ZXJzLCAweDAwMDEpOworCWVsc2UKKwkJb3V0X2JlMTYoJmNkbS0+ZmRfY291bnRlcnMsIDB4NTU1NSk7CisKKwkvKiBDb25maWd1cmUgdGhlIFhMQiBBcmJpdGVyIHByaW9yaXRpZXMgKi8KKwlvdXRfYmUzMigmeGxiLT5tYXN0ZXJfcHJpX2VuYWJsZSwgMHhmZik7CisJb3V0X2JlMzIoJnhsYi0+bWFzdGVyX3ByaW9yaXR5LCAweDExMTExMTExKTsKKworCS8qIERpc2FibGUgWExCIHBpcGVsaW5pbmcgKi8KKwkvKiAoY2ZyIGVycmF0ZSAyOTIuIFdlIGNvdWxkIGRvIHRoaXMgb25seSBqdXN0IGJlZm9yZSBBVEEgUElPCisJICAgIHRyYW5zYWN0aW9uIGFuZCByZS1lbmFibGUgaXQgYWZ0ZXJ3YXJkcyAuLi4pICovCisJb3V0X2JlMzIoJnhsYi0+Y29uZmlnLCBpbl9iZTMyKCZ4bGItPmNvbmZpZykgfCBNUEM1Mnh4X1hMQl9DRkdfUExESVMpOworCisJLyogVW5tYXAgem9uZXMgKi8KK3VubWFwX3JlZ3M6CisJaWYgKGNkbSkgaW91bm1hcChjZG0pOworCWlmICh4bGIpIGlvdW5tYXAoeGxiKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK21wYzUyeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCit7CisJLyogRmluZCBldmVyeSBjaGlsZCBvZiB0aGUgU09DIG5vZGUgYW5kIGFkZCBpdCB0byBvZl9wbGF0Zm9ybSAqLworCXJldHVybiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK2RldmljZV9pbml0Y2FsbChtcGM1Mnh4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTFhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqCisgKiBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgZnVuY3Rpb25zIGZvciB0aGUgRnJlZXNjYWxlIE1QQzUyeHguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJwbGFuIEdtYkgKKyAqCisgKiBCYXNlZCBvbiB0aGUgY29kZSBmcm9tIHRoZSAyLjQga2VybmVsIGJ5CisgKiBEYWxlIEZhcm5zd29ydGggPGRmYXJuc3dvcnRoQG12aXN0YS5jb20+IGFuZCBLZW50IEJvcmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgorI2luY2x1ZGUgIm1wYzUyeHhfcGljLmgiCisKKy8qCisgKgorKi8KKworc3RhdGljIHN0cnVjdCBtcGM1Mnh4X2ludHIgX19pb21lbSAqaW50cjsKK3N0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9zZG1hIF9faW9tZW0gKnNkbWE7CitzdGF0aWMgc3RydWN0IGlycV9ob3N0ICptcGM1Mnh4X2lycWhvc3QgPSBOVUxMOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBtcGM1Mnh4X21hcF9zZW5zZXNbNF0gPSB7CisJSVJRX1RZUEVfTEVWRUxfSElHSCwKKwlJUlFfVFlQRV9FREdFX1JJU0lORywKKwlJUlFfVFlQRV9FREdFX0ZBTExJTkcsCisJSVJRX1RZUEVfTEVWRUxfTE9XLAorfTsKKworLyoKKyAqCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW9fYmVfc2V0Yml0KHUzMiBfX2lvbWVtICphZGRyLCBpbnQgYml0bm8pCit7CisJb3V0X2JlMzIoYWRkciwgaW5fYmUzMihhZGRyKSB8ICgxIDw8IGJpdG5vKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb19iZV9jbHJiaXQodTMyIF9faW9tZW0gKmFkZHIsIGludCBiaXRubykKK3sKKwlvdXRfYmUzMihhZGRyLCBpbl9iZTMyKGFkZHIpICYgfigxIDw8IGJpdG5vKSk7Cit9CisKKy8qCisgKiBJUlFbMC0zXSBpbnRlcnJ1cHQgaXJxX2NoaXAKKyovCisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfZXh0aXJxX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IGlycTsKKwlpbnQgbDJpcnE7CisKKwlpcnEgPSBpcnFfbWFwW3ZpcnFdLmh3aXJxOworCWwyaXJxID0gKGlycSAmIE1QQzUyeHhfSVJRX0wyX01BU0spID4+IE1QQzUyeHhfSVJRX0wyX09GRlNFVDsKKworCXByX2RlYnVnKCIlczogaXJxPSV4LiBsMj0lZFxuIiwgX19mdW5jX18sIGlycSwgbDJpcnEpOworCisJaW9fYmVfY2xyYml0KCZpbnRyLT5jdHJsLCAxMSAtIGwyaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9leHRpcnFfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX3NldGJpdCgmaW50ci0+Y3RybCwgMTEgLSBsMmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfZXh0aXJxX2Fjayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9zZXRiaXQoJmludHItPmN0cmwsIDI3LWwyaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM1Mnh4X2V4dGlycV9pcnFjaGlwID0geworCS50eXBlbmFtZSA9ICIgTVBDNTJ4eCBJUlFbMC0zXSAiLAorCS5tYXNrID0gbXBjNTJ4eF9leHRpcnFfbWFzaywKKwkudW5tYXNrID0gbXBjNTJ4eF9leHRpcnFfdW5tYXNrLAorCS5hY2sgPSBtcGM1Mnh4X2V4dGlycV9hY2ssCit9OworCisvKgorICogTWFpbiBpbnRlcnJ1cHQgaXJxX2NoaXAKKyovCisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfbWFpbl9tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX3NldGJpdCgmaW50ci0+bWFpbl9tYXNrLCAxNSAtIGwyaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9tYWluX3VubWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9jbHJiaXQoJmludHItPm1haW5fbWFzaywgMTUgLSBsMmlycSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjNTJ4eF9tYWluX2lycWNoaXAgPSB7CisJLnR5cGVuYW1lID0gIk1QQzUyeHggTWFpbiIsCisJLm1hc2sgPSBtcGM1Mnh4X21haW5fbWFzaywKKwkubWFza19hY2sgPSBtcGM1Mnh4X21haW5fbWFzaywKKwkudW5tYXNrID0gbXBjNTJ4eF9tYWluX3VubWFzaywKK307CisKKy8qCisgKiBQZXJpcGhlcmFscyBpbnRlcnJ1cHQgaXJxX2NoaXAKKyovCisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfcGVyaXBoX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IGlycTsKKwlpbnQgbDJpcnE7CisKKwlpcnEgPSBpcnFfbWFwW3ZpcnFdLmh3aXJxOworCWwyaXJxID0gKGlycSAmIE1QQzUyeHhfSVJRX0wyX01BU0spID4+IE1QQzUyeHhfSVJRX0wyX09GRlNFVDsKKworCXByX2RlYnVnKCIlczogaXJxPSV4LiBsMj0lZFxuIiwgX19mdW5jX18sIGlycSwgbDJpcnEpOworCisJaW9fYmVfc2V0Yml0KCZpbnRyLT5wZXJfbWFzaywgMzEgLSBsMmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfcGVyaXBoX3VubWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9jbHJiaXQoJmludHItPnBlcl9tYXNrLCAzMSAtIGwyaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM1Mnh4X3BlcmlwaF9pcnFjaGlwID0geworCS50eXBlbmFtZSA9ICJNUEM1Mnh4IFBlcmlwaGVyYWxzIiwKKwkubWFzayA9IG1wYzUyeHhfcGVyaXBoX21hc2ssCisJLm1hc2tfYWNrID0gbXBjNTJ4eF9wZXJpcGhfbWFzaywKKwkudW5tYXNrID0gbXBjNTJ4eF9wZXJpcGhfdW5tYXNrLAorfTsKKworLyoKKyAqIFNETUEgaW50ZXJydXB0IGlycV9jaGlwCisqLworCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3NkbWFfbWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9zZXRiaXQoJnNkbWEtPkludE1hc2ssIGwyaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9zZG1hX3VubWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9jbHJiaXQoJnNkbWEtPkludE1hc2ssIGwyaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9zZG1hX2Fjayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlvdXRfYmUzMigmc2RtYS0+SW50UGVuZCwgMSA8PCBsMmlycSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjNTJ4eF9zZG1hX2lycWNoaXAgPSB7CisJLnR5cGVuYW1lID0gIk1QQzUyeHggU0RNQSIsCisJLm1hc2sgPSBtcGM1Mnh4X3NkbWFfbWFzaywKKwkudW5tYXNrID0gbXBjNTJ4eF9zZG1hX3VubWFzaywKKwkuYWNrID0gbXBjNTJ4eF9zZG1hX2FjaywKK307CisKKy8qCisgKiBpcnFfaG9zdAorKi8KKworc3RhdGljIGludCBtcGM1Mnh4X2lycWhvc3RfbWF0Y2goc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJcHJfZGVidWcoIiVzOiBub2RlPSVwXG4iLCBfX2Z1bmNfXywgbm9kZSk7CisJcmV0dXJuIG1wYzUyeHhfaXJxaG9zdC0+aG9zdF9kYXRhID09IG5vZGU7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9pcnFob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKKwkJCQkgdTMyICogaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkJIGlycV9od19udW1iZXJfdCAqIG91dF9od2lycSwKKwkJCQkgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCit7CisJaW50IGludHJ2ZWN0X2wxOworCWludCBpbnRydmVjdF9sMjsKKwlpbnQgaW50cnZlY3RfdHlwZTsKKwlpbnQgaW50cnZlY3RfbGludXg7CisKKwlpZiAoaW50c2l6ZSAhPSAzKQorCQlyZXR1cm4gLTE7CisKKwlpbnRydmVjdF9sMSA9IChpbnQpaW50c3BlY1swXTsKKwlpbnRydmVjdF9sMiA9IChpbnQpaW50c3BlY1sxXTsKKwlpbnRydmVjdF90eXBlID0gKGludClpbnRzcGVjWzJdOworCisJaW50cnZlY3RfbGludXggPQorCSAgICAoaW50cnZlY3RfbDEgPDwgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUKSAmIE1QQzUyeHhfSVJRX0wxX01BU0s7CisJaW50cnZlY3RfbGludXggfD0KKwkgICAgKGludHJ2ZWN0X2wyIDw8IE1QQzUyeHhfSVJRX0wyX09GRlNFVCkgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLOworCisJcHJfZGVidWcoInJldHVybiAleCwgbDE9JWQsIGwyPSVkXG4iLCBpbnRydmVjdF9saW51eCwgaW50cnZlY3RfbDEsCisJCSBpbnRydmVjdF9sMik7CisKKwkqb3V0X2h3aXJxID0gaW50cnZlY3RfbGludXg7CisJKm91dF9mbGFncyA9IG1wYzUyeHhfbWFwX3NlbnNlc1tpbnRydmVjdF90eXBlXTsKKworCXJldHVybiAwOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGNvcnJlY3QgSVJRIHR5cGUgb3V0CisgKiBvZiB0aGUgTVBDIHJlZ3MKKyAqIE9ubHkgZXh0ZXJuYWxzIElSUXMgbmVlZHMgdGhpcworKi8KK3N0YXRpYyBpbnQgbXBjNTJ4eF9pcnF4X2dldHR5cGUoaW50IGlycSkKK3sKKwlpbnQgdHlwZTsKKwl1MzIgY3RybF9yZWc7CisKKwljdHJsX3JlZyA9IGluX2JlMzIoJmludHItPmN0cmwpOworCXR5cGUgPSAoY3RybF9yZWcgPj4gKDIyIC0gaXJxICogMikpICYgMHgzOworCisJcmV0dXJuIG1wYzUyeHhfbWFwX3NlbnNlc1t0eXBlXTsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X2lycWhvc3RfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCisJCQkgICAgICAgaXJxX2h3X251bWJlcl90IGlycSkKK3sKKwlpbnQgbDFpcnE7CisJaW50IGwyaXJxOworCXN0cnVjdCBpcnFfY2hpcCAqZ29vZF9pcnFjaGlwOworCXZvaWQgKmdvb2RfaGFuZGxlOworCWludCB0eXBlOworCisJbDFpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDFfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUOworCWwyaXJxID0gKGlycSAmIE1QQzUyeHhfSVJRX0wyX01BU0spID4+IE1QQzUyeHhfSVJRX0wyX09GRlNFVDsKKworCS8qCisJICogTW9zdCBvZiBvdXJzIElSUXMgd2lsbCBiZSBsZXZlbCBsb3cKKwkgKiBPbmx5IGV4dGVybmFsIElSUXMgb24gc29tZSBwbGF0Zm9ybSBtYXkgYmUgb3RoZXJzCisJICovCisJdHlwZSA9IElSUV9UWVBFX0xFVkVMX0xPVzsKKworCXN3aXRjaCAobDFpcnEpIHsKKwljYXNlIE1QQzUyeHhfSVJRX0wxX0NSSVQ6CisJCXByX2RlYnVnKCIlczogQ3JpdGljYWwuIGwyPSV4XG4iLCBfX2Z1bmNfXywgbDJpcnEpOworCisJCUJVR19PTihsMmlycSAhPSAwKTsKKworCQl0eXBlID0gbXBjNTJ4eF9pcnF4X2dldHR5cGUobDJpcnEpOworCQlnb29kX2lycWNoaXAgPSAmbXBjNTJ4eF9leHRpcnFfaXJxY2hpcDsKKwkJYnJlYWs7CisKKwljYXNlIE1QQzUyeHhfSVJRX0wxX01BSU46CisJCXByX2RlYnVnKCIlczogTWFpbiBJUlFbMS0zXSBsMj0leFxuIiwgX19mdW5jX18sIGwyaXJxKTsKKworCQlpZiAoKGwyaXJxID49IDEpICYmIChsMmlycSA8PSAzKSkgeworCQkJdHlwZSA9IG1wYzUyeHhfaXJxeF9nZXR0eXBlKGwyaXJxKTsKKwkJCWdvb2RfaXJxY2hpcCA9ICZtcGM1Mnh4X2V4dGlycV9pcnFjaGlwOworCQl9IGVsc2UgeworCQkJZ29vZF9pcnFjaGlwID0gJm1wYzUyeHhfbWFpbl9pcnFjaGlwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNUEM1Mnh4X0lSUV9MMV9QRVJQOgorCQlwcl9kZWJ1ZygiJXM6IFBlcmlwaGVyYWxzLiBsMj0leFxuIiwgX19mdW5jX18sIGwyaXJxKTsKKwkJZ29vZF9pcnFjaGlwID0gJm1wYzUyeHhfcGVyaXBoX2lycWNoaXA7CisJCWJyZWFrOworCisJY2FzZSBNUEM1Mnh4X0lSUV9MMV9TRE1BOgorCQlwcl9kZWJ1ZygiJXM6IFNETUEuIGwyPSV4XG4iLCBfX2Z1bmNfXywgbDJpcnEpOworCQlnb29kX2lycWNoaXAgPSAmbXBjNTJ4eF9zZG1hX2lycWNoaXA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiBFcnJvciwgdW5rbm93biBMMSBJUlEgKDB4JXgpXG4iLCBfX2Z1bmNfXywgbDFpcnEpOworCQlwcmludGsoS0VSTl9FUlIgIlVua25vdyBJUlEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJZ29vZF9oYW5kbGUgPSBoYW5kbGVfZWRnZV9pcnE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvb2RfaGFuZGxlID0gaGFuZGxlX2xldmVsX2lycTsKKwl9CisKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgZ29vZF9pcnFjaGlwLCBnb29kX2hhbmRsZSk7CisKKwlwcl9kZWJ1ZygiJXM6IHZpcnE9JXgsIGh3PSV4LiB0eXBlPSV4XG4iLCBfX2Z1bmNfXywgdmlycSwKKwkJIChpbnQpaXJxLCB0eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9ob3N0X29wcyBtcGM1Mnh4X2lycWhvc3Rfb3BzID0geworCS5tYXRjaCA9IG1wYzUyeHhfaXJxaG9zdF9tYXRjaCwKKwkueGxhdGUgPSBtcGM1Mnh4X2lycWhvc3RfeGxhdGUsCisJLm1hcCA9IG1wYzUyeHhfaXJxaG9zdF9tYXAsCit9OworCisvKgorICogaW5pdCAocHVibGljKQorKi8KKwordm9pZCBfX2luaXQgbXBjNTJ4eF9pbml0X2lycSh2b2lkKQoreworCXUzMiBpbnRyX2N0cmw7CisJc3RydWN0IGRldmljZV9ub2RlICpwaWNub2RlOworCisJLyogUmVtYXAgdGhlIG5lY2Vzc2FyeSB6b25lcyAqLworCXBpY25vZGUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAibXBjNTJ4eC1waWMiKTsKKworCWludHIgPSBtcGM1Mnh4X2ZpbmRfYW5kX21hcCgibXBjNTJ4eC1waWMiKTsKKwlpZiAoIWludHIpCisJCXBhbmljKF9fRklMRV9fCSI6IGZpbmRfYW5kX21hcCBmYWlsZWQgb24gJ21wYzUyeHgtcGljJy4gIgorCQkJCSJDaGVjayBub2RlICEiKTsKKworCXNkbWEgPSBtcGM1Mnh4X2ZpbmRfYW5kX21hcCgibXBjNTJ4eC1iZXN0Y29tbSIpOworCWlmICghc2RtYSkKKwkJcGFuaWMoX19GSUxFX18JIjogZmluZF9hbmRfbWFwIGZhaWxlZCBvbiAnbXBjNTJ4eC1iZXN0Y29tbScuICIKKwkJCQkiQ2hlY2sgbm9kZSAhIik7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwlvdXRfYmUzMigmc2RtYS0+SW50UGVuZCwgMHhmZmZmZmZmZik7CS8qIDEgbWVhbnMgY2xlYXIgcGVuZGluZyAqLworCW91dF9iZTMyKCZzZG1hLT5JbnRNYXNrLCAweGZmZmZmZmZmKTsJLyogMSBtZWFucyBkaXNhYmxlZCAqLworCW91dF9iZTMyKCZpbnRyLT5wZXJfbWFzaywgMHg3ZmZmZmMwMCk7CS8qIDEgbWVhbnMgZGlzYWJsZWQgKi8KKwlvdXRfYmUzMigmaW50ci0+bWFpbl9tYXNrLCAweDAwMDEwZmZmKTsJLyogMSBtZWFucyBkaXNhYmxlZCAqLworCWludHJfY3RybCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCWludHJfY3RybCAmPSAweDAwZmYwMDAwOwkvKiBLZWVwcyBJUlFbMC0zXSBjb25maWcgKi8KKwlpbnRyX2N0cmwgfD0JMHgwZjAwMDAwMCB8CS8qIGNsZWFyIElSUSAwLTMgKi8KKwkJCTB4MDAwMDEwMDAgfAkvKiBNRUUgbWFzdGVyIGV4dGVybmFsIGVuYWJsZSAqLworCQkJMHgwMDAwMDAwMCB8CS8qIDAgbWVhbnMgZGlzYWJsZSBJUlEgMC0zICovCisJCQkweDAwMDAwMDAxOwkvKiBDRWIgcm91dGUgY3JpdGljYWwgbm9ybWFsbHkgKi8KKwlvdXRfYmUzMigmaW50ci0+Y3RybCwgaW50cl9jdHJsKTsKKworCS8qIFplcm8gYSBidW5jaCBvZiB0aGUgcHJpb3JpdHkgc2V0dGluZ3MuICovCisJb3V0X2JlMzIoJmludHItPnBlcl9wcmkxLCAwKTsKKwlvdXRfYmUzMigmaW50ci0+cGVyX3ByaTIsIDApOworCW91dF9iZTMyKCZpbnRyLT5wZXJfcHJpMywgMCk7CisJb3V0X2JlMzIoJmludHItPm1haW5fcHJpMSwgMCk7CisJb3V0X2JlMzIoJmludHItPm1haW5fcHJpMiwgMCk7CisKKwkvKgorCSAqIEFzIGxhc3Qgc3RlcCwgYWRkIGFuIGlycSBob3N0IHRvIHRyYW5zbGF0ZSB0aGUgcmVhbAorCSAqIGh3IGlycSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgb2Z3IHRvIGxpbnV4IHZpcnEKKwkgKi8KKworCW1wYzUyeHhfaXJxaG9zdCA9IGlycV9hbGxvY19ob3N0KElSUV9IT1NUX01BUF9MSU5FQVIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBDNTJ4eF9JUlFfSElHSFRFU1RIV0lSUSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXBjNTJ4eF9pcnFob3N0X29wcywgLTEpOworCisJaWYgKCFtcGM1Mnh4X2lycWhvc3QpCisJCXBhbmljKF9fRklMRV9fICI6IENhbm5vdCBhbGxvY2F0ZSB0aGUgSVJRIGhvc3RcbiIpOworCisJbXBjNTJ4eF9pcnFob3N0LT5ob3N0X2RhdGEgPSBwaWNub2RlOworCXByaW50ayhLRVJOX0lORk8gIk1QQzUyeHggUElDIGlzIHVwIGFuZCBydW5uaW5nIVxuIik7Cit9CisKKy8qCisgKiBnZXRfaXJxIChwdWJsaWMpCisqLwordW5zaWduZWQgaW50IG1wYzUyeHhfZ2V0X2lycSh2b2lkKQoreworCXUzMiBzdGF0dXM7CisJaW50IGlycSA9IE5PX0lSUV9JR05PUkU7CisKKwlzdGF0dXMgPSBpbl9iZTMyKCZpbnRyLT5lbmNfc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgMHgwMDAwMDQwMCkgewkvKiBjcml0aWNhbCAqLworCQlpcnEgPSAoc3RhdHVzID4+IDgpICYgMHgzOworCQlpZiAoaXJxID09IDIpCS8qIGhpZ2ggcHJpb3JpdHkgcGVyaXBoZXJhbCAqLworCQkJZ290byBwZXJpcGhlcmFsOworCQlpcnEgfD0JKE1QQzUyeHhfSVJRX0wxX0NSSVQgPDwgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUKSAmCisJCQlNUEM1Mnh4X0lSUV9MMV9NQVNLOworCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwMDIwMDAwMCkgewkvKiBtYWluICovCisJCWlycSA9IChzdGF0dXMgPj4gMTYpICYgMHgxZjsKKwkJaWYgKGlycSA9PSA0KQkvKiBsb3cgcHJpb3JpdHkgcGVyaXBoZXJhbCAqLworCQkJZ290byBwZXJpcGhlcmFsOworCQlpcnEgfD0JKE1QQzUyeHhfSVJRX0wxX01BSU4gPDwgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUKSAmCisJCQlNUEM1Mnh4X0lSUV9MMV9NQVNLOworCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgyMDAwMDAwMCkgewkvKiBwZXJpcGhlcmFsICovCisJICAgICAgcGVyaXBoZXJhbDoKKwkJaXJxID0gKHN0YXR1cyA+PiAyNCkgJiAweDFmOworCQlpZiAoaXJxID09IDApIHsJLyogYmVzdGNvbW0gKi8KKwkJCXN0YXR1cyA9IGluX2JlMzIoJnNkbWEtPkludFBlbmQpOworCQkJaXJxID0gZmZzKHN0YXR1cykgLSAxOworCQkJaXJxIHw9CShNUEM1Mnh4X0lSUV9MMV9TRE1BIDw8IE1QQzUyeHhfSVJRX0wxX09GRlNFVCkgJgorCQkJCU1QQzUyeHhfSVJRX0wxX01BU0s7CisJCX0gZWxzZSB7CisJCQlpcnEgfD0JKE1QQzUyeHhfSVJRX0wxX1BFUlAgPDwgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUKSAmCisJCQkJTVBDNTJ4eF9JUlFfTDFfTUFTSzsKKwkJfQorCX0KKworCXByX2RlYnVnKCIlczogaXJxPSV4LiB2aXJxPSVkXG4iLCBfX2Z1bmNfXywgaXJxLAorCQkgaXJxX2xpbmVhcl9yZXZtYXAobXBjNTJ4eF9pcnFob3N0LCBpcnEpKTsKKworCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChtcGM1Mnh4X2lycWhvc3QsIGlycSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjZiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIEZyZWVzY2FsZSBNUEM1Mnh4IEludGVycnVwdCBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fUE9XRVJQQ19TWVNERVZfTVBDNTJ4eF9QSUNfSF9fCisjZGVmaW5lIF9fUE9XRVJQQ19TWVNERVZfTVBDNTJ4eF9QSUNfSF9fCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworCisvKiBIVyBJUlEgbWFwcGluZyAqLworI2RlZmluZSBNUEM1Mnh4X0lSUV9MMV9DUklUCSgwKQorI2RlZmluZSBNUEM1Mnh4X0lSUV9MMV9NQUlOCSgxKQorI2RlZmluZSBNUEM1Mnh4X0lSUV9MMV9QRVJQCSgyKQorI2RlZmluZSBNUEM1Mnh4X0lSUV9MMV9TRE1BCSgzKQorCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wxX09GRlNFVCAgICg2KQorI2RlZmluZSBNUEM1Mnh4X0lSUV9MMV9NQVNLICAgICAoMHgwMGMwKQorCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wyX09GRlNFVCAgICgwKQorI2RlZmluZSBNUEM1Mnh4X0lSUV9MMl9NQVNLICAgICAoMHgwMDNmKQorCisjZGVmaW5lIE1QQzUyeHhfSVJRX0hJR0hURVNUSFdJUlEgKDB4ZDApCisKKworLyogSW50ZXJydXB0IGNvbnRyb2xsZXIgUmVnaXN0ZXIgc2V0ICovCitzdHJ1Y3QgbXBjNTJ4eF9pbnRyIHsKKwl1MzIgcGVyX21hc2s7CQkvKiBJTlRSICsgMHgwMCAqLworCXUzMiBwZXJfcHJpMTsJCS8qIElOVFIgKyAweDA0ICovCisJdTMyIHBlcl9wcmkyOwkJLyogSU5UUiArIDB4MDggKi8KKwl1MzIgcGVyX3ByaTM7CQkvKiBJTlRSICsgMHgwYyAqLworCXUzMiBjdHJsOwkJLyogSU5UUiArIDB4MTAgKi8KKwl1MzIgbWFpbl9tYXNrOwkJLyogSU5UUiArIDB4MTQgKi8KKwl1MzIgbWFpbl9wcmkxOwkJLyogSU5UUiArIDB4MTggKi8KKwl1MzIgbWFpbl9wcmkyOwkJLyogSU5UUiArIDB4MWMgKi8KKwl1MzIgcmVzZXJ2ZWQxOwkJLyogSU5UUiArIDB4MjAgKi8KKwl1MzIgZW5jX3N0YXR1czsJCS8qIElOVFIgKyAweDI0ICovCisJdTMyIGNyaXRfc3RhdHVzOwkvKiBJTlRSICsgMHgyOCAqLworCXUzMiBtYWluX3N0YXR1czsJLyogSU5UUiArIDB4MmMgKi8KKwl1MzIgcGVyX3N0YXR1czsJCS8qIElOVFIgKyAweDMwICovCisJdTMyIHJlc2VydmVkMjsJCS8qIElOVFIgKyAweDM0ICovCisJdTMyIHBlcl9lcnJvcjsJCS8qIElOVFIgKyAweDM4ICovCit9OworCisjZW5kaWYgLyogX19QT1dFUlBDX1NZU0RFVl9NUEM1Mnh4X1BJQ19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYwppbmRleCBiYjlhY2JiLi5lYTg4MGYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYwpAQCAtNTE1LDE2ICs1MTUsNiBAQAogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgdm9pZAotX19pbml0IG1wYzgyeHhfcGNpYmlvc19maXh1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLQl9Ci19Ci0KIHZvaWQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgbGVuOwpAQCAtNTk3LDkgKzU4Nyw2IEBACiAJCWFkZF9icmlkZ2UobnApOwogCiAJb2Zfbm9kZV9wdXQobnApOwotCXBwY19tZC5wY2lfbWFwX2lycSA9IE5VTEw7Ci0JcHBjX21kLnBjaWJpb3NfZml4dXAgPSBtcGM4Mnh4X3BjaWJpb3NfZml4dXA7Ci0JcHBjX21kLnBjaWJpb3NfZml4dXBfYnVzID0gTlVMTDsKICNlbmRpZgogCiAjaWZkZWYgIENPTkZJR19ST09UX05GUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwppbmRleCA3ZWRiNmI0Li5lZGNkNWI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwpAQCAtMjEsNyArMjEsNyBAQAogCSAgQmUgYXdhcmUgdGhhdCBQQ0kgYnVzZXMgY2FuIG9ubHkgZnVuY3Rpb24gd2hlbiBTWVMgYm9hcmQgaXMgcGx1Z2dlZAogCSAgaW50byB0aGUgUElCIChQbGF0Zm9ybSBJTyBCb2FyZCkgYm9hcmQgZnJvbSBGcmVlc2NhbGUgd2hpY2ggcHJvdmlkZQogCSAgMyBQQ0kgc2xvdHMuICBUaGUgUElCcyBQQ0kgaW5pdGlhbGl6YXRpb24gaXMgdGhlIGJvb3Rsb2FkZXIncwotCSAgcmVzcG9uc2libGlsdHkuCisJICByZXNwb25zaWJpbGl0eS4KIAogY29uZmlnIE1QQzgzNHhfSVRYCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzgzNHggSVRYIgpAQCAtMzAsNyArMzAsNyBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDIDgzNHggSVRYIGV2YWx1YXRpb24gYm9hcmQuCiAKIAkgIEJlIGF3YXJlIHRoYXQgUENJIGluaXRpYWxpemF0aW9uIGlzIHRoZSBib290bG9hZGVyJ3MKLQkgIHJlc3BvbnNpYmxpbHR5LgorCSAgcmVzcG9uc2liaWxpdHkuCiAKIGNvbmZpZyBNUEM4MzYwRV9QQgogCWJvb2wgIkZyZWVzY2FsZSBNUEM4MzYwRSBQQiIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKaW5kZXggYTQzYWM3MS4uZjU4Yzk3OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKQEAgLTk3LDggKzk3LDYgQEAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQogCQlhZGRfYnJpZGdlKG5wKTsKLQotCXBwY19tZC5wY2lfc3dpenpsZSA9IGNvbW1vbl9zd2l6emxlOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKaW5kZXggZTJiY2FhZi4uMzE0YzQyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKQEAgLTExOCw3ICsxMTgsNCBAQAogCS50aW1lX2luaXQJCT0gbXBjODN4eF90aW1lX2luaXQsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCiAJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCi0jaWZkZWYgQ09ORklHX1BDSQotCS5wY2liaW9zX2ZpeHVwCQk9IG1wYzgzeHhfcGNpYmlvc19maXh1cCwKLSNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggNjc3MTk2MS4uODBiNzM1YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC0xMzcsNyArMTM3LDQgQEAKIAkudGltZV9pbml0CQk9IG1wYzgzeHhfdGltZV9pbml0LAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAotI2lmZGVmIENPTkZJR19QQ0kKLQkucGNpYmlvc19maXh1cAkJPSBtcGM4M3h4X3BjaWJpb3NfZml4dXAsCi0jZW5kaWYKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzYwZV9wYi5jCmluZGV4IDFhNTIzYzguLjdiZmQ0N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzYwZV9wYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzYwZV9wYi5jCkBAIC0xMDIsOCArMTAyLDYgQEAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQogCQlhZGRfYnJpZGdlKG5wKTsKLQotCXBwY19tZC5wY2lfc3dpenpsZSA9IGNvbW1vbl9zd2l6emxlOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCmluZGV4IDJjODJiY2EuLjAxY2FlMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApAQCAtMTEsNyArMTEsNiBAQAogCiBleHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwogZXh0ZXJuIGludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbik7Ci1leHRlcm4gdm9pZCBtcGM4M3h4X3BjaWJpb3NfZml4dXAodm9pZCk7CiBleHRlcm4gdm9pZCBtcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKaW5kZXggNDU1N2FjNS4uOWMzNjUwNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwpAQCAtNDUsMTUgKzQ1LDYgQEAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi12b2lkIF9faW5pdCBtcGM4M3h4X3BjaWJpb3NfZml4dXAodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQotCS8qIG1hcCBhbGwgdGhlIFBDSSBpcnFzICovCi0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7Ci19Ci0KIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKaW5kZXggMjZjNWU4MjIuLjNlNjJmY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYwpAQCAtMjEsMTEgKzIxLDMgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWFib3J0KCk7CiB9Ci0KLS8qIEZvciBub3cgdGhpcyBpcyBhIHBhc3MgdGhyb3VnaCAqLwotcGh5c19hZGRyX3QgZml4dXBfYmlncGh5c19hZGRyKHBoeXNfYWRkcl90IGFkZHIsIHBoeXNfYWRkcl90IHNpemUpCi17Ci0JcmV0dXJuIGFkZHI7Ci19OwotCi1FWFBPUlRfU1lNQk9MKGZpeHVwX2JpZ3BoeXNfYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCmluZGV4IGQzZTY2OWQuLmJkYTJlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCkBAIC01MywxNSArNTMsNiBAQAogCWVsc2UKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KLQotdm9pZCBfX2luaXQKLW1wYzg1eHhfcGNpYmlvc19maXh1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7Ci19CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiAjaWZkZWYgQ09ORklHX0NQTTIKQEAgLTI1Myw4ICsyNDQsNiBAQAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCiAJCWFkZF9icmlkZ2UobnApOwotCi0JcHBjX21kLnBjaWJpb3NfZml4dXAgPSBtcGM4NXh4X3BjaWJpb3NfZml4dXA7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCmluZGV4IDFhMWMyMjYuLmY0ZGQ1ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKQEAgLTM5OCwxNSArMzk4LDYgQEAKIH0KIAogCi12b2lkIF9faW5pdCBtcGM4Nnh4X2hwY25fcGNpYmlvc19maXh1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7Ci19Ci0KLQogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCkBAIC00NjEsNyArNDUyLDYgQEAKIAkuc2V0dXBfYXJjaAkJPSBtcGM4Nnh4X2hwY25fc2V0dXBfYXJjaCwKIAkuaW5pdF9JUlEJCT0gbXBjODZ4eF9ocGNuX2luaXRfaXJxLAogCS5zaG93X2NwdWluZm8JCT0gbXBjODZ4eF9ocGNuX3Nob3dfY3B1aW5mbywKLQkucGNpYmlvc19maXh1cAkJPSBtcGM4Nnh4X2hwY25fcGNpYmlvc19maXh1cCwKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gbXBjODZ4eF9yZXN0YXJ0LAogCS50aW1lX2luaXQJCT0gbXBjODZ4eF90aW1lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQppbmRleCBlNThmYTk1Li40NGQ5NWVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKQEAgLTcsMTIgKzcsMTQgQEAKIGVuZGlmCiBvYmotJChDT05GSUdfUFBDX0NIUlApCQkrPSBjaHJwLwogb2JqLSQoQ09ORklHXzR4eCkJCSs9IDR4eC8KK29iai0kKENPTkZJR19QUENfTVBDNTJ4eCkJKz0gNTJ4eC8KIG9iai0kKENPTkZJR19QUENfODN4eCkJCSs9IDgzeHgvCiBvYmotJChDT05GSUdfUFBDXzg1eHgpCQkrPSA4NXh4Lwogb2JqLSQoQ09ORklHX1BQQ184Nnh4KQkJKz0gODZ4eC8KIG9iai0kKENPTkZJR19QUENfUFNFUklFUykJKz0gcHNlcmllcy8KIG9iai0kKENPTkZJR19QUENfSVNFUklFUykJKz0gaXNlcmllcy8KIG9iai0kKENPTkZJR19QUENfTUFQTEUpCQkrPSBtYXBsZS8KLW9iai0kKENPTkZJR19QUENfUEFTRU1JKQkJKz0gcGFzZW1pLworb2JqLSQoQ09ORklHX1BQQ19QQVNFTUkpCSs9IHBhc2VtaS8KIG9iai0kKENPTkZJR19QUENfQ0VMTCkJCSs9IGNlbGwvCitvYmotJChDT05GSUdfUFBDX1BTMykJCSs9IHBzMy8KIG9iai0kKENPTkZJR19FTUJFRERFRDZ4eCkJKz0gZW1iZWRkZWQ2eHgvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCmluZGV4IDNlNDMwYjQuLjA2YTg1YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCkBAIC0yMCw0ICsyMCwxOCBAQAogCWJvb2wgIlJBUyBmZWF0dXJlcyBmb3IgYmFyZSBtZXRhbCBDZWxsIEJFIgogCWRlZmF1bHQgeQogCitjb25maWcgQ0JFX1RIRVJNCisJdHJpc3RhdGUgIkNCRSB0aGVybWFsIHN1cHBvcnQiCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBDQkVfUkFTCisKK2NvbmZpZyBDQkVfQ1BVRlJFUQorCXRyaXN0YXRlICJDQkUgZnJlcXVlbmN5IHNjYWxpbmciCisJZGVwZW5kcyBvbiBDQkVfUkFTICYmIENQVV9GUkVRCisJZGVmYXVsdCBtCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBjcHVmcmVxIGRyaXZlciBmb3IgQ2VsbCBCRSBwcm9jZXNzb3JzLgorCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKwkgIElmIHlvdSBkb24ndCBoYXZlIHN1Y2ggcHJvY2Vzc29yLCBzYXkgTgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvTWFrZWZpbGUKaW5kZXggYzg5Y2RkNi4uZjkwZTgzMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9NYWtlZmlsZQpAQCAtMSw3ICsxLDExIEBACiBvYmotJChDT05GSUdfUFBDX0NFTExfTkFUSVZFKQkJKz0gaW50ZXJydXB0Lm8gaW9tbXUubyBzZXR1cC5vIFwKLQkJCQkJICAgY2JlX3JlZ3MubyBzcGlkZXItcGljLm8gcGVydmFzaXZlLm8KKwkJCQkJICAgY2JlX3JlZ3MubyBzcGlkZXItcGljLm8gXAorCQkJCQkgICBwZXJ2YXNpdmUubyBwbXUubyBpby13b3JrYXJvdW5kcy5vCiBvYmotJChDT05GSUdfQ0JFX1JBUykJCQkrPSByYXMubwogCitvYmotJChDT05GSUdfQ0JFX1RIRVJNKQkJCSs9IGNiZV90aGVybWFsLm8KK29iai0kKENPTkZJR19DQkVfQ1BVRlJFUSkJCSs9IGNiZV9jcHVmcmVxLm8KKwogaWZlcSAoJChDT05GSUdfU01QKSx5KQogb2JqLSQoQ09ORklHX1BQQ19DRUxMX05BVElWRSkJCSs9IHNtcC5vCiBlbmRpZgpAQCAtMTEsNSArMTUsNiBAQAogc3B1LXByaXYxLSQoQ09ORklHX1BQQ19DRUxMX05BVElWRSkJKz0gc3B1X3ByaXYxX21taW8ubwogCiBvYmotJChDT05GSUdfU1BVX0JBU0UpCQkJKz0gc3B1X2NhbGxiYWNrcy5vIHNwdV9iYXNlLm8gXAorCQkJCQkgICBzcHVfY29yZWR1bXAubyBcCiAJCQkJCSAgICQoc3B1ZnMtbW9kdWxhci1tKSBcCiAJCQkJCSAgICQoc3B1LXByaXYxLXkpIHNwdWZzLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg1MGZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBjcHVmcmVxIGRyaXZlciBmb3IgdGhlIGNlbGwgcHJvY2Vzc29yCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCAyMDA1CisgKgorICogQXV0aG9yOiBDaHJpc3RpYW4gS3JhZmZ0IDxrcmFmZnRAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKworI2luY2x1ZGUgImNiZV9yZWdzLmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoY2JlX3N3aXRjaF9tdXRleCk7CisKKworLyogdGhlIENCRSBzdXBwb3J0cyBhbiA4IHN0ZXAgZnJlcXVlbmN5IHNjYWxpbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgY2JlX2ZyZXFzW10gPSB7CisJezEsCTB9LAorCXsyLAkwfSwKKwl7MywJMH0sCisJezQsCTB9LAorCXs1LAkwfSwKKwl7NiwJMH0sCisJezgsCTB9LAorCXsxMCwJMH0sCisJezAsCUNQVUZSRVFfVEFCTEVfRU5EfSwKK307CisKKy8qIHRvIHdyaXRlIHRvIE1JQyByZWdpc3RlciAqLworc3RhdGljIHU2NCBNSUNfU2xvd19GYXN0X1RpbWVyX3RhYmxlW10gPSB7CisJWzAgLi4uIDddID0gMHgwMDdmYzAwMDAwMDAwMDAwdWxsLAorfTsKKworLyogbW9yZSB2YWx1ZXMgZm9yIHRoZSBNSUMgKi8KK3N0YXRpYyB1NjQgTUlDX1Nsb3dfTmV4dF9UaW1lcl90YWJsZVtdID0geworCTB4MDAwMDI0MDAwMDAwMDAwMHVsbCwKKwkweDAwMDAyNjgwMDAwMDAwMDB1bGwsCisJMHgwMDAwMjlDMDAwMDAwMDAwdWxsLAorCTB4MDAwMDJEMDAwMDAwMDAwMHVsbCwKKwkweDAwMDAzMDAwMDAwMDAwMDB1bGwsCisJMHgwMDAwMzM0MDAwMDAwMDAwdWxsLAorCTB4MDAwMDM5QzAwMDAwMDAwMHVsbCwKKwkweDAwMDAzRkMwMDAwMDAwMDB1bGwsCit9OworCisvKgorICogaGFyZHdhcmUgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBnZXRfcG1vZGUoaW50IGNwdSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CisKKwlwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKGNwdSk7CisJcmV0ID0gaW5fYmU2NCgmcG1kX3JlZ3MtPnBtc3IpICYgMHgwNzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3Btb2RlKGludCBjcHUsIHVuc2lnbmVkIGludCBwbW9kZSkKK3sKKwlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnBtZF9yZWdzOworCXN0cnVjdCBjYmVfbWljX3RtX3JlZ3MgX19pb21lbSAqbWljX3RtX3JlZ3M7CisJdTY0IGZsYWdzOworCXU2NCB2YWx1ZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCW1pY190bV9yZWdzID0gY2JlX2dldF9jcHVfbWljX3RtX3JlZ3MoY3B1KTsKKwlwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKGNwdSk7CisKKwlwcl9kZWJ1ZygicG0gcmVnaXN0ZXIgaXMgbWFwcGVkIGF0ICVwXG4iLCAmcG1kX3JlZ3MtPnBtY3IpOworCXByX2RlYnVnKCJtaWMgcmVnaXN0ZXIgaXMgbWFwcGVkIGF0ICVwXG4iLCAmbWljX3RtX3JlZ3MtPnNsb3dfZmFzdF90aW1lcl8wKTsKKworCW91dF9iZTY0KCZtaWNfdG1fcmVncy0+c2xvd19mYXN0X3RpbWVyXzAsIE1JQ19TbG93X0Zhc3RfVGltZXJfdGFibGVbcG1vZGVdKTsKKwlvdXRfYmU2NCgmbWljX3RtX3JlZ3MtPnNsb3dfZmFzdF90aW1lcl8xLCBNSUNfU2xvd19GYXN0X1RpbWVyX3RhYmxlW3Btb2RlXSk7CisKKwlvdXRfYmU2NCgmbWljX3RtX3JlZ3MtPnNsb3dfbmV4dF90aW1lcl8wLCBNSUNfU2xvd19OZXh0X1RpbWVyX3RhYmxlW3Btb2RlXSk7CisJb3V0X2JlNjQoJm1pY190bV9yZWdzLT5zbG93X25leHRfdGltZXJfMSwgTUlDX1Nsb3dfTmV4dF9UaW1lcl90YWJsZVtwbW9kZV0pOworCisJdmFsdWUgPSBpbl9iZTY0KCZwbWRfcmVncy0+cG1jcik7CisJLyogc2V0IGJpdHMgdG8gemVybyAqLworCXZhbHVlICY9IDB4RkZGRkZGRkZGRkZGRkZGOHVsbDsKKwkvKiBzZXQgYml0cyB0byBuZXh0IHBtb2RlICovCisJdmFsdWUgfD0gcG1vZGU7CisKKwlvdXRfYmU2NCgmcG1kX3JlZ3MtPnBtY3IsIHZhbHVlKTsKKworCS8qIHdhaXQgdW50aWwgbmV3IHBtb2RlIGFwcGVhcnMgaW4gc3RhdHVzIHJlZ2lzdGVyICovCisJdmFsdWUgPSBpbl9iZTY0KCZwbWRfcmVncy0+cG1zcikgJiAweDA3OworCXdoaWxlKHZhbHVlICE9IHBtb2RlKSB7CisJCWNwdV9yZWxheCgpOworCQl2YWx1ZSA9IGluX2JlNjQoJnBtZF9yZWdzLT5wbXNyKSAmIDB4MDc7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjcHVmcmVxIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgY2JlX2NwdWZyZXFfY3B1X2luaXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXUzMiAqbWF4X2ZyZXE7CisJaW50IGksIGN1cl9wbW9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKKworCWNwdSA9IG9mX2dldF9jcHVfbm9kZShwb2xpY3ktPmNwdSwgTlVMTCk7CisKKwlpZighY3B1KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByX2RlYnVnKCJpbml0IGNwdWZyZXEgb24gQ1BVICVkXG4iLCBwb2xpY3ktPmNwdSk7CisKKwltYXhfZnJlcSA9ICh1MzIqKSBnZXRfcHJvcGVydHkoY3B1LCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisKKwlpZighbWF4X2ZyZXEpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gd2UgbmVlZCB0aGUgZnJlcSBpbiBrSHoKKwkqbWF4X2ZyZXEgLz0gMTAwMDsKKworCXByX2RlYnVnKCJtYXggY2xvY2stZnJlcXVlbmN5IGlzIGF0ICV1IGtIelxuIiwgKm1heF9mcmVxKTsKKwlwcl9kZWJ1ZygiaW5pdGlhbGl6aW5nIGZyZXF1ZW5jeSB0YWJsZVxuIik7CisKKwkvLyBpbml0aWFsaXplIGZyZXF1ZW5jeSB0YWJsZQorCWZvciAoaT0wOyBjYmVfZnJlcXNbaV0uZnJlcXVlbmN5IT1DUFVGUkVRX1RBQkxFX0VORDsgaSsrKSB7CisJCWNiZV9mcmVxc1tpXS5mcmVxdWVuY3kgPSAqbWF4X2ZyZXEgLyBjYmVfZnJlcXNbaV0uaW5kZXg7CisJCXByX2RlYnVnKCIlZDogJWRcbiIsIGksIGNiZV9mcmVxc1tpXS5mcmVxdWVuY3kpOworCX0KKworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJLyogaWYgREVCVUcgaXMgZW5hYmxlZCBzZXRfcG1vZGUoKSBtZWFzdXJlcyB0aGUgY29ycmVjdCBsYXRlbmN5IG9mIGEgdHJhbnNpdGlvbiAqLworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAyNTAwMDsKKworCWN1cl9wbW9kZSA9IGdldF9wbW9kZShwb2xpY3ktPmNwdSk7CisJcHJfZGVidWcoImN1cnJlbnQgcG1vZGUgaXMgYXQgJWRcbiIsY3VyX3Btb2RlKTsKKworCXBvbGljeS0+Y3VyID0gY2JlX2ZyZXFzW2N1cl9wbW9kZV0uZnJlcXVlbmN5OworCisjaWZkZWYgQ09ORklHX1NNUAorCXBvbGljeS0+Y3B1cyA9IGNwdV9zaWJsaW5nX21hcFtwb2xpY3ktPmNwdV07CisjZW5kaWYKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyIChjYmVfZnJlcXMsIHBvbGljeS0+Y3B1KTsKKworCS8qIHRoaXMgZW5zdXJlcyB0aGF0IHBvbGljeS0+Y3B1aW5mb19taW4gYW5kIHBvbGljeS0+Y3B1aW5mb19tYXggYXJlIHNldCBjb3JyZWN0bHkgKi8KKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyAocG9saWN5LCBjYmVfZnJlcXMpOworfQorCitzdGF0aWMgaW50IGNiZV9jcHVmcmVxX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYmVfY3B1ZnJlcV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIGNiZV9mcmVxcyk7Cit9CisKKworc3RhdGljIGludCBjYmVfY3B1ZnJlcV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJaW50IHJjOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCWludCBjYmVfcG1vZGVfbmV3OworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwKKwkJCQkgICAgICAgY2JlX2ZyZXFzLAorCQkJCSAgICAgICB0YXJnZXRfZnJlcSwKKwkJCQkgICAgICAgcmVsYXRpb24sCisJCQkJICAgICAgICZjYmVfcG1vZGVfbmV3KTsKKworCWZyZXFzLm9sZCA9IHBvbGljeS0+Y3VyOworCWZyZXFzLm5ldyA9IGNiZV9mcmVxc1tjYmVfcG1vZGVfbmV3XS5mcmVxdWVuY3k7CisJZnJlcXMuY3B1ID0gcG9saWN5LT5jcHU7CisKKwltdXRleF9sb2NrICgmY2JlX3N3aXRjaF9tdXRleCk7CisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCXByX2RlYnVnKCJzZXR0aW5nIGZyZXF1ZW5jeSBmb3IgY3B1ICVkIHRvICVkIGtIeiwgMS8lZCBvZiBtYXggZnJlcXVlbmN5XG4iLAorCQkgcG9saWN5LT5jcHUsCisJCSBjYmVfZnJlcXNbY2JlX3Btb2RlX25ld10uZnJlcXVlbmN5LAorCQkgY2JlX2ZyZXFzW2NiZV9wbW9kZV9uZXddLmluZGV4KTsKKworCXJjID0gc2V0X3Btb2RlKHBvbGljeS0+Y3B1LCBjYmVfcG1vZGVfbmV3KTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwltdXRleF91bmxvY2soJmNiZV9zd2l0Y2hfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGNiZV9jcHVmcmVxX2RyaXZlciA9IHsKKwkudmVyaWZ5CQk9IGNiZV9jcHVmcmVxX3ZlcmlmeSwKKwkudGFyZ2V0CQk9IGNiZV9jcHVmcmVxX3RhcmdldCwKKwkuaW5pdAkJPSBjYmVfY3B1ZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBjYmVfY3B1ZnJlcV9jcHVfZXhpdCwKKwkubmFtZQkJPSAiY2JlLWNwdWZyZXEiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmxhZ3MJCT0gQ1BVRlJFUV9DT05TVF9MT09QUywKK307CisKKy8qCisgKiBtb2R1bGUgaW5pdCBhbmQgZGVzdG95CisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2JlX2NwdWZyZXFfaW5pdCh2b2lkKQoreworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmY2JlX2NwdWZyZXFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNiZV9jcHVmcmVxX2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZjYmVfY3B1ZnJlcV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjYmVfY3B1ZnJlcV9pbml0KTsKK21vZHVsZV9leGl0KGNiZV9jcHVmcmVxX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gS3JhZmZ0IDxrcmFmZnRAZGUuaWJtLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKaW5kZXggMmYxOTRiYS4uOWEwZWU2MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTE2LDggKzE3LDYgQEAKIAogI2luY2x1ZGUgImNiZV9yZWdzLmgiCiAKLSNkZWZpbmUgTUFYX0NCRQkJMgotCiAvKgogICogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzICJjcHUiIG5vZGVzLiBXZSBidWlsZCBvdXIgb3duIG1hcHBpbmcKICAqIGFycmF5IG9mIGNwdSBudW1iZXJzIHRvIGNwdSBub2RlcyBsb2NhbGx5IGZvciBub3cgdG8gYWxsb3cgaW50ZXJydXB0CkBAIC0zMCw2ICsyOSw4IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZTsKIAlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnBtZF9yZWdzOwogCXN0cnVjdCBjYmVfaWljX3JlZ3MgX19pb21lbSAqaWljX3JlZ3M7CisJc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtICptaWNfdG1fcmVnczsKKwlzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyBwbWRfc2hhZG93X3JlZ3M7CiB9IGNiZV9yZWdzX21hcHNbTUFYX0NCRV07CiBzdGF0aWMgaW50IGNiZV9yZWdzX21hcF9jb3VudDsKIApAQCAtNDIsNiArNDMsMTkgQEAKIHN0YXRpYyBzdHJ1Y3QgY2JlX3JlZ3NfbWFwICpjYmVfZmluZF9tYXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRtcF9ucDsKKworCWlmIChzdHJjYXNlY21wKG5wLT50eXBlLCAic3BlIikgPT0gMCkgeworCQlpZiAobnAtPmRhdGEgPT0gTlVMTCkgeworCQkJLyogd2FsayB1cCBwYXRoIHVudGlsIGNwdSBub2RlIHdhcyBmb3VuZCAqLworCQkJdG1wX25wID0gbnAtPnBhcmVudDsKKwkJCXdoaWxlICh0bXBfbnAgIT0gTlVMTCAmJiBzdHJjYXNlY21wKHRtcF9ucC0+dHlwZSwgImNwdSIpICE9IDApCisJCQkJdG1wX25wID0gdG1wX25wLT5wYXJlbnQ7CisKKwkJCW5wLT5kYXRhID0gY2JlX2ZpbmRfbWFwKHRtcF9ucCk7CisJCX0KKwkJcmV0dXJuIG5wLT5kYXRhOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBjYmVfcmVnc19tYXBfY291bnQ7IGkrKykKIAkJaWYgKGNiZV9yZWdzX21hcHNbaV0uY3B1X25vZGUgPT0gbnApCkBAIC01Niw2ICs3MCw3IEBACiAJCXJldHVybiBOVUxMOwogCXJldHVybiBtYXAtPnBtZF9yZWdzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2dldF9wbWRfcmVncyk7CiAKIHN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqY2JlX2dldF9jcHVfcG1kX3JlZ3MoaW50IGNwdSkKIHsKQEAgLTY0LDcgKzc5LDIzIEBACiAJCXJldHVybiBOVUxMOwogCXJldHVybiBtYXAtPnBtZF9yZWdzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2dldF9jcHVfcG1kX3JlZ3MpOwogCitzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqY2JlX2dldF9wbWRfc2hhZG93X3JlZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICptYXAgPSBjYmVfZmluZF9tYXAobnApOworCWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZtYXAtPnBtZF9zaGFkb3dfcmVnczsKK30KKworc3RydWN0IGNiZV9wbWRfc2hhZG93X3JlZ3MgKmNiZV9nZXRfY3B1X3BtZF9zaGFkb3dfcmVncyhpbnQgY3B1KQoreworCXN0cnVjdCBjYmVfcmVnc19tYXAgKm1hcCA9IGNiZV90aHJlYWRfbWFwW2NwdV0ucmVnczsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmbWFwLT5wbWRfc2hhZG93X3JlZ3M7Cit9CiAKIHN0cnVjdCBjYmVfaWljX3JlZ3MgX19pb21lbSAqY2JlX2dldF9paWNfcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewpAQCAtNzMsNiArMTA0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIG1hcC0+aWljX3JlZ3M7CiB9CisKIHN0cnVjdCBjYmVfaWljX3JlZ3MgX19pb21lbSAqY2JlX2dldF9jcHVfaWljX3JlZ3MoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICptYXAgPSBjYmVfdGhyZWFkX21hcFtjcHVdLnJlZ3M7CkBAIC04MSw2ICsxMTMsMzYgQEAKIAlyZXR1cm4gbWFwLT5paWNfcmVnczsKIH0KIAorc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtICpjYmVfZ2V0X21pY190bV9yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwID0gY2JlX2ZpbmRfbWFwKG5wKTsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXAtPm1pY190bV9yZWdzOworfQorCitzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X21pY190bV9yZWdzKGludCBjcHUpCit7CisJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwID0gY2JlX3RocmVhZF9tYXBbY3B1XS5yZWdzOworCWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1hcC0+bWljX3RtX3JlZ3M7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZ2V0X2NwdV9taWNfdG1fcmVncyk7CisKKy8qIEZJWE1FCisgKiBUaGlzIGlzIGxpdHRsZSBtb3JlIHRoYW4gYSBzdHViIGF0IHRoZSBtb21lbnQuICBJdCBzaG91bGQgYmUKKyAqIGZsZXNoZWQgb3V0IHNvIHRoYXQgaXQgd29ya3MgZm9yIGJvdGggU01UIGFuZCBub24tU01ULCBubworICogbWF0dGVyIGlmIHRoZSBwYXNzZWQgY3B1IGlzIG9kZCBvciBldmVuLgorICogRm9yIFNNVCBlbmFibGVkLCByZXR1cm5zIDAgZm9yIGV2ZW4tbnVtYmVyZWQgY3B1OyBvdGhlcndpc2UgMS4KKyAqIEZvciBTTVQgZGlzYWJsZWQsIHJldHVybnMgMCBmb3IgYWxsIGNwdXMuCisgKi8KK3UzMiBjYmVfZ2V0X2h3X3RocmVhZF9pZChpbnQgY3B1KQoreworCXJldHVybiAoY3B1ICYgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZ2V0X2h3X3RocmVhZF9pZCk7CisKIHZvaWQgX19pbml0IGNiZV9yZWdzX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTExOSw2ICsxODEsMTEgQEAKIAkJcHJvcCA9IGdldF9wcm9wZXJ0eShjcHUsICJpaWMiLCBOVUxMKTsKIAkJaWYgKHByb3AgIT0gTlVMTCkKIAkJCW1hcC0+aWljX3JlZ3MgPSBpb3JlbWFwKHByb3AtPmFkZHJlc3MsIHByb3AtPmxlbik7CisKKwkJcHJvcCA9IChzdHJ1Y3QgYWRkcmVzc19wcm9wICopZ2V0X3Byb3BlcnR5KGNwdSwgIm1pYy10bSIsCisJCQkJCQkJICAgTlVMTCk7CisJCWlmIChwcm9wICE9IE5VTEwpCisJCQltYXAtPm1pY190bV9yZWdzID0gaW9yZW1hcChwcm9wLT5hZGRyZXNzLCBwcm9wLT5sZW4pOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaAppbmRleCBlNzZlNGE2Li40NDBhN2VjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaApAQCAtNCwxMiArNCwxOSBAQAogICogVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGhvbGQgdGhlIHZhcmlvdXMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIENCRQogICogb24tY2hpcCBzeXN0ZW0gZGV2aWNlcyAobWVtb3J5IGNvbnRyb2xsZXIsIElPIGNvbnRyb2xsZXIsIGV0Yy4uLikKICAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLDIwMDYKKyAqCisgKiBBdXRob3JzOiBNYXhpbWlubyBBZ3VpbGFyIChtYWd1aWxhckB1cy5pYm0uY29tKQorICogICAgICAgICAgRGF2aWQgSi4gRXJiIChkamVyYkB1cy5pYm0uY29tKQorICoKICAqIChjKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4sIElCTSBDb3JwLgogICovCiAKICNpZm5kZWYgQ0JFX1JFR1NfSAogI2RlZmluZSBDQkVfUkVHU19ICiAKKyNpbmNsdWRlIDxhc20vY2VsbC1wbXUuaD4KKwogLyoKICAqCiAgKiBTb21lIEhJRCByZWdpc3RlciBkZWZpbml0aW9ucwpAQCAtMjIsNiArMjksNyBAQAogI2RlZmluZSBISUQwX0NCRV9USEVSTV9JTlRfRU4JMHgwMDAwMDAwNDAwMDAwMDAwdWwKICNkZWZpbmUgSElEMF9DQkVfU1lTRVJSX0lOVF9FTgkweDAwMDAwMDAyMDAwMDAwMDB1bAogCisjZGVmaW5lIE1BWF9DQkUJCTIKIAogLyoKICAqCkBAIC0yOSw1MSArMzcsMTI0IEBACiAgKgogICovCiAKK3VuaW9uIHNwZV9yZWcgeworCXU2NCB2YWw7CisJdTggc3BlWzhdOworfTsKKwordW5pb24gcHBlX3NwZV9yZWcgeworCXU2NCB2YWw7CisJc3RydWN0IHsKKwkJdTMyIHBwZTsKKwkJdTMyIHNwZTsKKwl9OworfTsKKworCiBzdHJ1Y3QgY2JlX3BtZF9yZWdzIHsKLQl1OCBwYWRfMHgwMDAwXzB4MDgwMFsweDA4MDAgLSAweDAwMDBdOwkJCS8qIDB4MDAwMCAqLworCS8qIERlYnVnIEJ1cyBDb250cm9sICovCisJdTY0CXBhZF8weDAwMDA7CQkJCQkvKiAweDAwMDAgKi8KKworCXU2NAlncm91cF9jb250cm9sOwkJCQkJLyogMHgwMDA4ICovCisKKwl1OAlwYWRfMHgwMDEwXzB4MDBhOCBbMHgwMGE4IC0gMHgwMDEwXTsJCS8qIDB4MDAxMCAqLworCisJdTY0CWRlYnVnX2J1c19jb250cm9sOwkJCQkvKiAweDAwYTggKi8KKworCXU4CXBhZF8weDAwYjBfMHgwMTAwIFsweDAxMDAgLSAweDAwYjBdOwkJLyogMHgwMGIwICovCisKKwl1NjQJdHJhY2VfYXV4X2RhdGE7CQkJCQkvKiAweDAxMDAgKi8KKwl1NjQJdHJhY2VfYnVmZmVyXzBfNjM7CQkJCS8qIDB4MDEwOCAqLworCXU2NAl0cmFjZV9idWZmZXJfNjRfMTI3OwkJCQkvKiAweDAxMTAgKi8KKwl1NjQJdHJhY2VfYWRkcmVzczsJCQkJCS8qIDB4MDExOCAqLworCXU2NAlleHRfdHJfdGltZXI7CQkJCQkvKiAweDAxMjAgKi8KKworCXU4CXBhZF8weDAxMjhfMHgwNDAwIFsweDA0MDAgLSAweDAxMjhdOwkJLyogMHgwMTI4ICovCisKKwkvKiBQZXJmb3JtYW5jZSBNb25pdG9yICovCisJdTY0CXBtX3N0YXR1czsJCQkJCS8qIDB4MDQwMCAqLworCXU2NAlwbV9jb250cm9sOwkJCQkJLyogMHgwNDA4ICovCisJdTY0CXBtX2ludGVydmFsOwkJCQkJLyogMHgwNDEwICovCisJdTY0CXBtX2N0cls0XTsJCQkJCS8qIDB4MDQxOCAqLworCXU2NAlwbV9zdGFydF9zdG9wOwkJCQkJLyogMHgwNDM4ICovCisJdTY0CXBtMDdfY29udHJvbFs4XTsJCQkJLyogMHgwNDQwICovCisKKwl1OAlwYWRfMHgwNDgwXzB4MDgwMCBbMHgwODAwIC0gMHgwNDgwXTsJCS8qIDB4MDQ4MCAqLwogCiAJLyogVGhlcm1hbCBTZW5zb3IgUmVnaXN0ZXJzICovCi0JdTY0ICB0c19jdHNyMTsJCQkJCQkvKiAweDA4MDAgKi8KLQl1NjQgIHRzX2N0c3IyOwkJCQkJCS8qIDB4MDgwOCAqLwotCXU2NCAgdHNfbXRzcjE7CQkJCQkJLyogMHgwODEwICovCi0JdTY0ICB0c19tdHNyMjsJCQkJCQkvKiAweDA4MTggKi8KLQl1NjQgIHRzX2l0cjE7CQkJCQkJLyogMHgwODIwICovCi0JdTY0ICB0c19pdHIyOwkJCQkJCS8qIDB4MDgyOCAqLwotCXU2NCAgdHNfZ2l0cjsJCQkJCQkvKiAweDA4MzAgKi8KLQl1NjQgIHRzX2lzcjsJCQkJCQkvKiAweDA4MzggKi8KLQl1NjQgIHRzX2ltcjsJCQkJCQkvKiAweDA4NDAgKi8KLQl1NjQgIHRtX2NyMTsJCQkJCQkvKiAweDA4NDggKi8KLQl1NjQgIHRtX2NyMjsJCQkJCQkvKiAweDA4NTAgKi8KLQl1NjQgIHRtX3NpbXI7CQkJCQkJLyogMHgwODU4ICovCi0JdTY0ICB0bV90cHI7CQkJCQkJLyogMHgwODYwICovCi0JdTY0ICB0bV9zdHIxOwkJCQkJCS8qIDB4MDg2OCAqLwotCXU2NCAgdG1fc3RyMjsJCQkJCQkvKiAweDA4NzAgKi8KLQl1NjQgIHRtX3RzcjsJCQkJCQkvKiAweDA4NzggKi8KKwl1bmlvbglzcGVfcmVnCXRzX2N0c3IxOwkJCQkvKiAweDA4MDAgKi8KKwl1NjQJdHNfY3RzcjI7CQkJCQkvKiAweDA4MDggKi8KKwl1bmlvbglzcGVfcmVnCXRzX210c3IxOwkJCQkvKiAweDA4MTAgKi8KKwl1NjQJdHNfbXRzcjI7CQkJCQkvKiAweDA4MTggKi8KKwl1bmlvbglzcGVfcmVnCXRzX2l0cjE7CQkJCS8qIDB4MDgyMCAqLworCXU2NAl0c19pdHIyOwkJCQkJLyogMHgwODI4ICovCisJdTY0CXRzX2dpdHI7CQkJCQkvKiAweDA4MzAgKi8KKwl1NjQJdHNfaXNyOwkJCQkJCS8qIDB4MDgzOCAqLworCXU2NAl0c19pbXI7CQkJCQkJLyogMHgwODQwICovCisJdW5pb24Jc3BlX3JlZwl0bV9jcjE7CQkJCQkvKiAweDA4NDggKi8KKwl1NjQJdG1fY3IyOwkJCQkJCS8qIDB4MDg1MCAqLworCXU2NAl0bV9zaW1yOwkJCQkJLyogMHgwODU4ICovCisJdW5pb24JcHBlX3NwZV9yZWcgdG1fdHByOwkJCQkvKiAweDA4NjAgKi8KKwl1bmlvbglzcGVfcmVnCXRtX3N0cjE7CQkJCS8qIDB4MDg2OCAqLworCXU2NAl0bV9zdHIyOwkJCQkJLyogMHgwODcwICovCisJdW5pb24JcHBlX3NwZV9yZWcgdG1fdHNyOwkJCQkvKiAweDA4NzggKi8KIAogCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KLQl1NjQgIHBtX2NvbnRyb2w7CQkJCQkvKiAweDA4ODAgKi8KLSNkZWZpbmUgQ0JFX1BNRF9QQVVTRV9aRVJPX0NPTlRST0wJCTB4MTAwMDAKLQl1NjQgIHBtX3N0YXR1czsJCQkJCQkvKiAweDA4ODggKi8KKwl1NjQJcG1jcjsJCQkJCQkvKiAweDA4ODAgKi8KKyNkZWZpbmUgQ0JFX1BNRF9QQVVTRV9aRVJPX0NPTlRST0wJMHgxMDAwMAorCXU2NAlwbXNyOwkJCQkJCS8qIDB4MDg4OCAqLwogCiAJLyogVGltZSBCYXNlIFJlZ2lzdGVyICovCi0JdTY0ICB0YnI7CQkJCQkJLyogMHgwODkwICovCisJdTY0CXRicjsJCQkJCQkvKiAweDA4OTAgKi8KIAotCXU4ICAgcGFkXzB4MDg5OF8weDBjMDAgWzB4MGMwMCAtIDB4MDg5OF07CQkvKiAweDA4OTggKi8KKwl1OAlwYWRfMHgwODk4XzB4MGMwMCBbMHgwYzAwIC0gMHgwODk4XTsJCS8qIDB4MDg5OCAqLwogCiAJLyogRmF1bHQgSXNvbGF0aW9uIFJlZ2lzdGVycyAqLwotCXU2NCAgY2hlY2tzdG9wX2ZpcjsJCQkJCS8qIDB4MGMwMCAqLwotCXU2NCAgcmVjb3ZlcmFibGVfZmlyOwotCXU2NCAgc3BlY19hdHRfbWNoa19maXI7Ci0JdTY0ICBmaXJfbW9kZV9yZWc7Ci0JdTY0ICBmaXJfZW5hYmxlX21hc2s7CisJdTY0CWNoZWNrc3RvcF9maXI7CQkJCQkvKiAweDBjMDAgKi8KKwl1NjQJcmVjb3ZlcmFibGVfZmlyOwkJCQkvKiAweDBjMDggKi8KKwl1NjQJc3BlY19hdHRfbWNoa19maXI7CQkJCS8qIDB4MGMxMCAqLworCXU2NAlmaXJfbW9kZV9yZWc7CQkJCQkvKiAweDBjMTggKi8KKwl1NjQJZmlyX2VuYWJsZV9tYXNrOwkJCQkvKiAweDBjMjAgKi8KIAotCXU4ICAgcGFkXzB4MGMyOF8weDEwMDAgWzB4MTAwMCAtIDB4MGMyOF07CQkvKiAweDBjMjggKi8KKwl1OAlwYWRfMHgwYzI4XzB4MTAwMCBbMHgxMDAwIC0gMHgwYzI4XTsJCS8qIDB4MGMyOCAqLwogfTsKIAogZXh0ZXJuIHN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqY2JlX2dldF9wbWRfcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIGV4dGVybiBzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X3BtZF9yZWdzKGludCBjcHUpOwogCiAvKgorICogUE1VIHNoYWRvdyByZWdpc3RlcnMKKyAqCisgKiBNYW55IG9mIHRoZSByZWdpc3RlcnMgaW4gdGhlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgdW5pdCBhcmUgd3JpdGUtb25seSwKKyAqIHNvIHdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2Ygd2hhdCB3ZSB3cml0ZSB0byB0aG9zZSByZWdpc3RlcnMuCisgKgorICogVGhlIGFjdHVhbCBkYXRhIGNvdW50ZXJzIGFyZSByZWFkL3dyaXRlLiBIb3dldmVyLCB3cml0aW5nIHRvIHRoZSBjb3VudGVycworICogb25seSB0YWtlcyBlZmZlY3QgaWYgdGhlIFBNVSBpcyBlbmFibGVkLiBPdGhlcndpc2UgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbgorICogYSBoYXJkd2FyZSBsYXRjaCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoZSBQTVUgaXMgZW5hYmxlZC4gU28gd2Ugc2F2ZSBhIGNvcHkKKyAqIG9mIHRoZSBjb3VudGVyIHZhbHVlcyBpZiB3ZSBuZWVkIHRvIHJlYWQgdGhlbSBiYWNrIHdoaWxlIHRoZSBQTVUgaXMKKyAqIGRpc2FibGVkLiBUaGUgY291bnRlcl92YWx1ZV9pbl9sYXRjaCBmaWVsZCBpcyBhIGJpdG1hcCBpbmRpY2F0aW5nIHdoaWNoCisgKiBjb3VudGVycyBjdXJyZW50bHkgaGF2ZSBhIHZhbHVlIHdhaXRpbmcgdG8gYmUgd3JpdHRlbi4KKyAqLworCitzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyB7CisJdTMyIGdyb3VwX2NvbnRyb2w7CisJdTMyIGRlYnVnX2J1c19jb250cm9sOworCXUzMiB0cmFjZV9hZGRyZXNzOworCXUzMiBleHRfdHJfdGltZXI7CisJdTMyIHBtX3N0YXR1czsKKwl1MzIgcG1fY29udHJvbDsKKwl1MzIgcG1faW50ZXJ2YWw7CisJdTMyIHBtX3N0YXJ0X3N0b3A7CisJdTMyIHBtMDdfY29udHJvbFtOUl9DVFJTXTsKKworCXUzMiBwbV9jdHJbTlJfUEhZU19DVFJTXTsKKwl1MzIgY291bnRlcl92YWx1ZV9pbl9sYXRjaDsKK307CisKK2V4dGVybiBzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqY2JlX2dldF9wbWRfc2hhZG93X3JlZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gc3RydWN0IGNiZV9wbWRfc2hhZG93X3JlZ3MgKmNiZV9nZXRfY3B1X3BtZF9zaGFkb3dfcmVncyhpbnQgY3B1KTsKKworLyoKICAqCiAgKiBJSUMgdW5pdCByZWdpc3RlciBkZWZpbml0aW9ucwogICoKQEAgLTEwMiwxOCArMTgzLDI4IEBACiAKIAkvKiBJSUMgaW50ZXJydXB0IHJlZ2lzdGVycyAqLwogCXN0cnVjdAljYmVfaWljX3RocmVhZF9yZWdzIHRocmVhZFsyXTsJCQkvKiAweDA0MDAgKi8KLQl1NjQgICAgIGlpY19pcjsJCQkJCQkvKiAweDA0NDAgKi8KLQl1NjQgICAgIGlpY19pczsJCQkJCQkvKiAweDA0NDggKi8KKworCXU2NAlpaWNfaXI7CQkJCQkJLyogMHgwNDQwICovCisjZGVmaW5lIENCRV9JSUNfSVJfUFJJTyh4KSAgICAgICgoKHgpICYgMHhmKSA8PCAxMikKKyNkZWZpbmUgQ0JFX0lJQ19JUl9ERVNUX05PREUoeCkgKCgoeCkgJiAweGYpIDw8IDQpCisjZGVmaW5lIENCRV9JSUNfSVJfREVTVF9VTklUKHgpICgoeCkgJiAweGYpCisjZGVmaW5lIENCRV9JSUNfSVJfSU9DXzAgICAgICAgIDB4MAorI2RlZmluZSBDQkVfSUlDX0lSX0lPQ18xUyAgICAgICAweGIKKyNkZWZpbmUgQ0JFX0lJQ19JUl9QVF8wICAgICAgICAgMHhlCisjZGVmaW5lIENCRV9JSUNfSVJfUFRfMSAgICAgICAgIDB4ZgorCisJdTY0CWlpY19pczsJCQkJCQkvKiAweDA0NDggKi8KKyNkZWZpbmUgQ0JFX0lJQ19JU19QTUkJCTB4MgogCiAJdTgJcGFkXzB4MDQ1MF8weDA1MDBbMHgwNTAwIC0gMHgwNDUwXTsJCS8qIDB4MDQ1MCAqLwogCiAJLyogSU9DIEZJUiAqLwogCXU2NAlpb2NfZmlyX3Jlc2V0OwkJCQkJLyogMHgwNTAwICovCi0JdTY0CWlvY19maXJfc2V0OwotCXU2NAlpb2NfY2hlY2tzdG9wX2VuYWJsZTsKLQl1NjQJaW9jX2Zpcl9lcnJvcl9tYXNrOwotCXU2NAlpb2Nfc3lzZXJyX2VuYWJsZTsKLQl1NjQJaW9jX2ZpcjsKKwl1NjQJaW9jX2Zpcl9zZXQ7CQkJCQkvKiAweDA1MDggKi8KKwl1NjQJaW9jX2NoZWNrc3RvcF9lbmFibGU7CQkJCS8qIDB4MDUxMCAqLworCXU2NAlpb2NfZmlyX2Vycm9yX21hc2s7CQkJCS8qIDB4MDUxOCAqLworCXU2NAlpb2Nfc3lzZXJyX2VuYWJsZTsJCQkJLyogMHgwNTIwICovCisJdTY0CWlvY19maXI7CQkJCQkvKiAweDA1MjggKi8KIAogCXU4CXBhZF8weDA1MzBfMHgxMDAwWzB4MTAwMCAtIDB4MDUzMF07CQkvKiAweDA1MzAgKi8KIH07CkBAIC0xMjIsNiArMjEzLDQ4IEBACiBleHRlcm4gc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2NwdV9paWNfcmVncyhpbnQgY3B1KTsKIAogCitzdHJ1Y3QgY2JlX21pY190bV9yZWdzIHsKKwl1OAlwYWRfMHgwMDAwXzB4MDA0MFsweDAwNDAgLSAweDAwMDBdOwkJLyogMHgwMDAwICovCisKKwl1NjQJbWljX2N0bF9jbmZnMjsJCQkJCS8qIDB4MDA0MCAqLworI2RlZmluZSBDQkVfTUlDX0VOQUJMRV9BVVhfVFJDCQkweDgwMDAwMDAwMDAwMDAwMDBMTAorI2RlZmluZSBDQkVfTUlDX0RJU0FCTEVfUFdSX1NBVl8yCTB4MDIwMDAwMDAwMDAwMDAwMExMCisjZGVmaW5lIENCRV9NSUNfRElTQUJMRV9BVVhfVFJDX1dSQVAJMHgwMTAwMDAwMDAwMDAwMDAwTEwKKyNkZWZpbmUgQ0JFX01JQ19FTkFCTEVfQVVYX1RSQ19JTlQJMHgwMDgwMDAwMDAwMDAwMDAwTEwKKworCXU2NAlwYWRfMHgwMDQ4OwkJCQkJLyogMHgwMDQ4ICovCisKKwl1NjQJbWljX2F1eF90cmNfYmFzZTsJCQkJLyogMHgwMDUwICovCisJdTY0CW1pY19hdXhfdHJjX21heF9hZGRyOwkJCQkvKiAweDAwNTggKi8KKwl1NjQJbWljX2F1eF90cmNfY3VyX2FkZHI7CQkJCS8qIDB4MDA2MCAqLworCXU2NAltaWNfYXV4X3RyY19ncmZfYWRkcjsJCQkJLyogMHgwMDY4ICovCisJdTY0CW1pY19hdXhfdHJjX2dyZl9kYXRhOwkJCQkvKiAweDAwNzAgKi8KKworCXU2NAlwYWRfMHgwMDc4OwkJCQkJLyogMHgwMDc4ICovCisKKwl1NjQJbWljX2N0bF9jbmZnXzA7CQkJCQkvKiAweDAwODAgKi8KKyNkZWZpbmUgQ0JFX01JQ19ESVNBQkxFX1BXUl9TQVZfMAkweDgwMDAwMDAwMDAwMDAwMDBMTAorCisJdTY0CXBhZF8weDAwODg7CQkJCQkvKiAweDAwODggKi8KKworCXU2NAlzbG93X2Zhc3RfdGltZXJfMDsJCQkJLyogMHgwMDkwICovCisJdTY0CXNsb3dfbmV4dF90aW1lcl8wOwkJCQkvKiAweDAwOTggKi8KKworCXU4CXBhZF8weDAwYTBfMHgwMWMwWzB4MDFjMCAtIDB4MGEwXTsJCS8qIDB4MDBhMCAqLworCisJdTY0CW1pY19jdGxfY25mZ18xOwkJCQkJLyogMHgwMWMwICovCisjZGVmaW5lIENCRV9NSUNfRElTQUJMRV9QV1JfU0FWXzEJMHg4MDAwMDAwMDAwMDAwMDAwTEwKKwl1NjQJcGFkXzB4MDFjODsJCQkJCS8qIDB4MDFjOCAqLworCisJdTY0CXNsb3dfZmFzdF90aW1lcl8xOwkJCQkvKiAweDAxZDAgKi8KKwl1NjQJc2xvd19uZXh0X3RpbWVyXzE7CQkJCS8qIDB4MDFkOCAqLworCisJdTgJcGFkXzB4MDFlMF8weDEwMDBbMHgxMDAwIC0gMHgwMWUwXTsJCS8qIDB4MDFlMCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBjYmVfbWljX3RtX3JlZ3MgX19pb21lbSAqY2JlX2dldF9taWNfdG1fcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X21pY190bV9yZWdzKGludCBjcHUpOworCiAvKiBJbml0IHRoaXMgbW9kdWxlIGVhcmx5ICovCiBleHRlcm4gdm9pZCBjYmVfcmVnc19pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3RoZXJtYWwuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfdGhlcm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmEwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3RoZXJtYWwuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIHRoZXJtYWwgc3VwcG9ydCBmb3IgdGhlIGNlbGwgcHJvY2Vzc29yCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCAyMDA1CisgKgorICogQXV0aG9yOiBDaHJpc3RpYW4gS3JhZmZ0IDxrcmFmZnRAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpbmNsdWRlICJjYmVfcmVncy5oIgorI2luY2x1ZGUgInNwdV9wcml2MV9tbWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKmdldF9wbWRfcmVncyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQoreworCXN0cnVjdCBzcHUgKnNwdTsKKworCXNwdSA9IGNvbnRhaW5lcl9vZihzeXNkZXYsIHN0cnVjdCBzcHUsIHN5c2Rldik7CisKKwlyZXR1cm4gY2JlX2dldF9wbWRfcmVncyhzcHVfZGV2bm9kZShzcHUpKTsKK30KKworLyogcmV0dXJucyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3B1IGluIGEgZ2l2ZW4gcmVnaXN0ZXIgKi8KK3N0YXRpYyB1OCBzcHVfcmVhZF9yZWdpc3Rlcl92YWx1ZShzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCB1bmlvbiBzcGVfcmVnIF9faW9tZW0gKnJlZykKK3sKKwl1bnNpZ25lZCBpbnQgKmlkOworCXVuaW9uIHNwZV9yZWcgdmFsdWU7CisJc3RydWN0IHNwdSAqc3B1OworCisJLyogZ2V0dGluZyB0aGUgaWQgZnJvbSB0aGUgcmVnIGF0dHJpYnV0ZSB3aWxsIG5vdCB3b3JrIG9uIGZ1dHVyZSBkZXZpY2UtdHJlZSBsYXlvdXRzCisJICogaW4gZnV0dXJlIHdlIHNob3VsZCBzdG9yZSB0aGUgaWQgdG8gdGhlIHNwdSBzdHJ1Y3QgYW5kIHVzZSBpdCBoZXJlICovCisJc3B1ID0gY29udGFpbmVyX29mKHN5c2Rldiwgc3RydWN0IHNwdSwgc3lzZGV2KTsKKwlpZCA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoc3B1X2Rldm5vZGUoc3B1KSwgInJlZyIsIE5VTEwpOworCXZhbHVlLnZhbCA9IGluX2JlNjQoJnJlZy0+dmFsKTsKKworCXJldHVybiB2YWx1ZS5zcGVbKmlkXTsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1X3Nob3dfdGVtcChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCit7CisJaW50IHZhbHVlOworCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CisKKwlwbWRfcmVncyA9IGdldF9wbWRfcmVncyhzeXNkZXYpOworCisJdmFsdWUgPSBzcHVfcmVhZF9yZWdpc3Rlcl92YWx1ZShzeXNkZXYsICZwbWRfcmVncy0+dHNfY3RzcjEpOworCS8qIGNsZWFyIGFsbCBvdGhlciBiaXRzICovCisJdmFsdWUgJj0gMHgzRjsKKwkvKiB0ZW1wIGlzIHN0b3JlZCBpbiBzdGVwcyBvZiAyIGRlZ3JlZXMgKi8KKwl2YWx1ZSAqPSAyOworCS8qIGJhc2UgdGVtcCBpcyA2NSBkZWdyZWVzICovCisJdmFsdWUgKz0gNjU7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGludCkgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBwcGVfc2hvd190ZW1wKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZiwgaW50IHBvcykKK3sKKwlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnBtZF9yZWdzOworCXU2NCB2YWx1ZTsKKworCXBtZF9yZWdzID0gY2JlX2dldF9jcHVfcG1kX3JlZ3Moc3lzZGV2LT5pZCk7CisJdmFsdWUgPSBpbl9iZTY0KCZwbWRfcmVncy0+dHNfY3RzcjIpOworCisJLyogYWNjZXNzIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgKi8KKwl2YWx1ZSA+Pj0gcG9zOworCS8qIGNsZWFyIGFsbCBvdGhlciBiaXRzICovCisJdmFsdWUgJj0gMHgzRjsKKwkvKiB0ZW1wIGlzIHN0b3JlZCBpbiBzdGVwcyBvZiAyIGRlZ3JlZXMgKi8KKwl2YWx1ZSAqPSAyOworCS8qIGJhc2UgdGVtcCBpcyA2NSBkZWdyZWVzICovCisJdmFsdWUgKz0gNjU7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGludCkgdmFsdWUpOworfQorCisKKy8qIHNob3dzIHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgRFRTIG9uIHRoZSBQUEUsCisgKiBsb2NhdGVkIG5lYXIgdGhlIGxpbmVhciB0aGVybWFsIHNlbnNvciAqLworc3RhdGljIHNzaXplX3QgcHBlX3Nob3dfdGVtcDAoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmKQoreworCXJldHVybiBwcGVfc2hvd190ZW1wKHN5c2RldiwgYnVmLCAzMik7Cit9CisKKy8qIHNob3dzIHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgc2Vjb25kIERUUyBvbiB0aGUgUFBFICovCitzdGF0aWMgc3NpemVfdCBwcGVfc2hvd190ZW1wMShzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHBwZV9zaG93X3RlbXAoc3lzZGV2LCBidWYsIDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgYXR0cl9zcHVfdGVtcGVyYXR1cmUgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAidGVtcGVyYXR1cmUiLCAubW9kZSA9IDA0MDAgfSwKKwkuc2hvdyA9IHNwdV9zaG93X3RlbXAsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3B1X2F0dHJpYnV0ZXNbXSA9IHsKKwkmYXR0cl9zcHVfdGVtcGVyYXR1cmUuYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNwdV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUJPSAidGhlcm1hbCIsCisJLmF0dHJzCT0gc3B1X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgYXR0cl9wcGVfdGVtcGVyYXR1cmUwID0geworCS5hdHRyID0gey5uYW1lID0gInRlbXBlcmF0dXJlMCIsIC5tb2RlID0gMDQwMCB9LAorCS5zaG93ID0gcHBlX3Nob3dfdGVtcDAsCit9OworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgYXR0cl9wcGVfdGVtcGVyYXR1cmUxID0geworCS5hdHRyID0gey5uYW1lID0gInRlbXBlcmF0dXJlMSIsIC5tb2RlID0gMDQwMCB9LAorCS5zaG93ID0gcHBlX3Nob3dfdGVtcDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcHBlX2F0dHJpYnV0ZXNbXSA9IHsKKwkmYXR0cl9wcGVfdGVtcGVyYXR1cmUwLmF0dHIsCisJJmF0dHJfcHBlX3RlbXBlcmF0dXJlMS5hdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcHBlX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZQk9ICJ0aGVybWFsIiwKKwkuYXR0cnMJPSBwcGVfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBpbml0aWFsaXplIHRocm90dGxpbmcgd2l0aCBkZWZhdWx0IHZhbHVlcworICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9kZWZhdWx0X3ZhbHVlcyh2b2lkKQoreworCWludCBjcHU7CisJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCXVuaW9uIHBwZV9zcGVfcmVnIHRwcjsKKwl1bmlvbiBzcGVfcmVnIHN0cjE7CisJdTY0IHN0cjI7CisJdW5pb24gc3BlX3JlZyBjcjE7CisJdTY0IGNyMjsKKworCS8qIFRQUiBkZWZhdWx0cyAqLworCS8qIHBwZQorCSAqCTFGIC0gbm8gZnVsbCBzdG9wCisJICoJMDggLSBkeW5hbWljIHRocm90dGxpbmcgc3RhcnRzIGlmIG92ZXIgODAgZGVncmVlcworCSAqCTAzIC0gZHluYW1pYyB0aHJvdHRsaW5nIGNlYXNlcyBpZiBiZWxvdyA3MCBkZWdyZWVzICovCisJdHByLnBwZSA9IDB4MUYwODAzOworCS8qIHNwZQorCSAqCTEwIC0gZnVsbCBzdG9wcGVkIHdoZW4gb3ZlciA5NiBkZWdyZWVzCisJICoJMDggLSBkeW5hbWljIHRocm90dGxpbmcgc3RhcnRzIGlmIG92ZXIgODAgZGVncmVlcworCSAqCTAzIC0gZHluYW1pYyB0aHJvdHRsaW5nIGNlYXNlcyBpZiBiZWxvdyA3MCBkZWdyZWVzCisJICovCisJdHByLnNwZSA9IDB4MTAwODAzOworCisJLyogU1RSIGRlZmF1bHRzICovCisJLyogc3RyMQorCSAqCTEwIC0gc3RvcCAxNiBvZiAzMiBjeWNsZXMKKwkgKi8KKwlzdHIxLnZhbCA9IDB4MTAxMDEwMTAxMDEwMTAxMHVsbDsKKwkvKiBzdHIyCisJICoJMTAgLSBzdG9wIDE2IG9mIDMyIGN5Y2xlcworCSAqLworCXN0cjIgPSAweDEwOworCisJLyogQ1IgZGVmYXVsdHMgKi8KKwkvKiBjcjEKKwkgKgk0IC0gbm9ybWFsIG9wZXJhdGlvbgorCSAqLworCWNyMS52YWwgPSAweDA0MDQwNDA0MDQwNDA0MDR1bGw7CisJLyogY3IyCisJICoJNCAtIG5vcm1hbCBvcGVyYXRpb24KKwkgKi8KKwljcjIgPSAweDA0OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1IChjcHUpIHsKKwkJcHJfZGVidWcoInByb2Nlc3NpbmcgY3B1ICVkXG4iLCBjcHUpOworCQlzeXNkZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOworCQlwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKHN5c2Rldi0+aWQpOworCisJCW91dF9iZTY0KCZwbWRfcmVncy0+dG1fc3RyMiwgc3RyMik7CisJCW91dF9iZTY0KCZwbWRfcmVncy0+dG1fc3RyMS52YWwsIHN0cjEudmFsKTsKKwkJb3V0X2JlNjQoJnBtZF9yZWdzLT50bV90cHIudmFsLCB0cHIudmFsKTsKKwkJb3V0X2JlNjQoJnBtZF9yZWdzLT50bV9jcjEudmFsLCBjcjEudmFsKTsKKwkJb3V0X2JlNjQoJnBtZF9yZWdzLT50bV9jcjIsIGNyMik7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHRoZXJtYWxfaW5pdCh2b2lkKQoreworCWluaXRfZGVmYXVsdF92YWx1ZXMoKTsKKworCXNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoJnNwdV9hdHRyaWJ1dGVfZ3JvdXApOworCWNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoJnBwZV9hdHRyaWJ1dGVfZ3JvdXApOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh0aGVybWFsX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdGhlcm1hbF9leGl0KHZvaWQpCit7CisJc3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cCgmc3B1X2F0dHJpYnV0ZV9ncm91cCk7CisJY3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cCgmcHBlX2F0dHJpYnV0ZV9ncm91cCk7Cit9Cittb2R1bGVfZXhpdCh0aGVybWFsX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gS3JhZmZ0IDxrcmFmZnRAZGUuaWJtLmNvbT4iKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IGE5MTRjMTIuLjY2NjZkMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTM5NiwzICszOTYsMTkgQEAKIAkvKiBFbmFibGUgb24gY3VycmVudCBDUFUgKi8KIAlpaWNfc2V0dXBfY3B1KCk7CiB9CisKK3ZvaWQgaWljX3NldF9pbnRlcnJ1cHRfcm91dGluZyhpbnQgY3B1LCBpbnQgdGhyZWFkLCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICppaWNfcmVncyA9IGNiZV9nZXRfY3B1X2lpY19yZWdzKGNwdSk7CisJdTY0IGlpY19pciA9IDA7CisJaW50IG5vZGUgPSBjcHUgPj4gMTsKKworCS8qIFNldCB3aGljaCBub2RlIGFuZCB0aHJlYWQgd2lsbCBoYW5kbGUgdGhlIG5leHQgaW50ZXJydXB0ICovCisJaWljX2lyIHw9IENCRV9JSUNfSVJfUFJJTyhwcmlvcml0eSkgfAorCQkgIENCRV9JSUNfSVJfREVTVF9OT0RFKG5vZGUpOworCWlmICh0aHJlYWQgPT0gMCkKKwkJaWljX2lyIHw9IENCRV9JSUNfSVJfREVTVF9VTklUKENCRV9JSUNfSVJfUFRfMCk7CisJZWxzZQorCQlpaWNfaXIgfD0gQ0JFX0lJQ19JUl9ERVNUX1VOSVQoQ0JFX0lJQ19JUl9QVF8xKTsKKwlvdXRfYmU2NCgmaWljX3JlZ3MtPmlpY19pciwgaWljX2lyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuaAppbmRleCA5YmExZDNjLi45NDJkYzM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5oCkBAIC04Myw1ICs4Myw3IEBACiAKIGV4dGVybiB2b2lkIHNwaWRlcl9pbml0X0lSUSh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgaWljX3NldF9pbnRlcnJ1cHRfcm91dGluZyhpbnQgY3B1LCBpbnQgdGhyZWFkLCBpbnQgcHJpb3JpdHkpOworCiAjZW5kaWYKICNlbmRpZiAvKiBBU01fQ0VMTF9QSUNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODBkNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCQkgICAgICAgSUJNLCBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKworCisjZGVmaW5lIFNQSURFUl9QQ0lfUkVHX0JBU0UJCTB4ZDAwMAorI2RlZmluZSBTUElERVJfUENJX1ZDSV9DTlRMX1NUQVQJMHgwMTEwCisjZGVmaW5lIFNQSURFUl9QQ0lfRFVNTVlfUkVBRAkJMHgwODEwCisjZGVmaW5lIFNQSURFUl9QQ0lfRFVNTVlfUkVBRF9CQVNFCTB4MDgxNAorCisvKiBVbmRlZmluZSB0aGF0IHRvIHJlLWVuYWJsZSBib2d1cyBwcmVmZXRjaAorICoKKyAqIFdpdGhvdXQgdGhhdCB3b3JrYXJvdW5kLCB0aGUgY2hpcCB3aWxsIGRvIGJvZ3VzIHByZWZldGNoIHBhc3QKKyAqIHBhZ2UgYm91bmRhcnkgZnJvbSBzeXN0ZW0gbWVtb3J5LiBUaGlzIHNldHRpbmcgd2lsbCBkaXNhYmxlIHRoYXQsCisgKiB0aG91Z2ggdGhlIGRvY3VtZW50YXRpb24gaXMgdW5jbGVhciBhcyB0byB0aGUgY29uc2VxdWVuY2VzIG9mIGRvaW5nCisgKiBzbywgZWl0aGVyIHB1cmVseSBwZXJmb3JtYW5jZXMsIG9yIHBvc3NpYmxlIG1pc2JlaGF2aW91ci4uLiBJdCdzIG5vdAorICogY2xlYXIgd2V0aGVyIHRoZSBjaGlwIGNhbiBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzIGF0IGFsbCB3aXRob3V0CisgKiBwcmVmZXRjaGluZyBlbmFibGVkLgorICoKKyAqIEZvciBub3csIHRoaW5ncyBhcHBlYXIgdG8gYmUgYmVoYXZpbmcgcHJvcGVybHkgd2l0aCB0aGF0IHByZWZldGNoaW5nCisgKiBkaXNhYmxlZCBhbmQgSURFLCBwb3NzaWJseSBiZWNhdXNlIElERSBpc24ndCBkb2luZyBhbnkgdW5hbGlnbmVkCisgKiBhY2Nlc3MuCisgKi8KKyNkZWZpbmUgU1BJREVSX0RJU0FCTEVfUFJFRkVUQ0gKKworI2RlZmluZSBNQVhfU1BJREVSUwkyCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpZGVyX3BjaV9idXMgeworCXZvaWQgX19pb21lbQkqcmVnczsKKwl1bnNpZ25lZCBsb25nCW1taW9fc3RhcnQ7CisJdW5zaWduZWQgbG9uZwltbWlvX2VuZDsKKwl1bnNpZ25lZCBsb25nCXBpb192c3RhcnQ7CisJdW5zaWduZWQgbG9uZwlwaW9fdmVuZDsKK30gc3BpZGVyX3BjaV9idXNzZXNbTUFYX1NQSURFUlNdOworc3RhdGljIGludCBzcGlkZXJfcGNpX2NvdW50OworCitzdGF0aWMgc3RydWN0IHNwaWRlcl9wY2lfYnVzICpzcGlkZXJfcGNpX2ZpbmQodW5zaWduZWQgbG9uZyB2YWRkciwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzcGlkZXJfcGNpX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHNwaWRlcl9wY2lfYnVzICpidXMgPSAmc3BpZGVyX3BjaV9idXNzZXNbaV07CisJCWlmIChwYWRkciAmJiBwYWRkciA+PSBidXMtPm1taW9fc3RhcnQgJiYgcGFkZHIgPCBidXMtPm1taW9fZW5kKQorCQkJcmV0dXJuIGJ1czsKKwkJaWYgKHZhZGRyICYmIHZhZGRyID49IGJ1cy0+cGlvX3ZzdGFydCAmJiB2YWRkciA8IGJ1cy0+cGlvX3ZlbmQpCisJCQlyZXR1cm4gYnVzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3BpZGVyX2lvX2ZsdXNoKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX3BjaV9idXMgKmJ1czsKKwlpbnQgdG9rZW47CisKKwkvKiBHZXQgcGxhdGZvcm0gdG9rZW4gKHNldCBieSBpb3JlbWFwKSBmcm9tIGFkZHJlc3MgKi8KKwl0b2tlbiA9IFBDSV9HRVRfQUREUl9UT0tFTihhZGRyKTsKKworCS8qIEZhc3QgcGF0aCBpZiB3ZSBoYXZlIGEgbm9uLTAgdG9rZW4sIGl0IGluZGljYXRlcyB3aGljaCBidXMgd2UKKwkgKiBhcmUgb24uCisJICoKKwkgKiBJZiB0aGUgdG9rZW4gaXMgMCwgdGhhdCBtZWFucyBlaXRoZXIgdGhlIHRoZSBpb3JlbWFwIHdhcyBkb25lCisJICogYmVmb3JlIHdlIGluaXRpYWxpemVkIHRoaXMgbGF5ZXIsIG9yIGl0J3MgYSBQSU8gb3BlcmF0aW9uLiBXZQorCSAqIGZhbGxiYWNrIHRvIGEgbG93IHBhdGggaW4gdGhpcyBjYXNlLiBIb3BlZnVsbHksIGludGVybmFsIGRldmljZXMKKwkgKiB3aGljaCBhcmUgaW9yZW1hcCdlZCBlYXJseSBzaG91bGQgdXNlIGluX1hYL291dF9YWCBmdW5jdGlvbnMKKwkgKiBpbnN0ZWFkIG9mIHRoZSBQQ0kgb25lcyBhbmQgdGh1cyBub3Qgc3VmZmVyIGZyb20gdGhlIHNsb3dkb3duLgorCSAqCisJICogQWxzbyBub3RlIHRoYXQgY3VycmVudGx5LCB0aGUgd29ya2Fyb3VuZCB3aWxsIG5vdCB3b3JrIGZvciBhcmVhcworCSAqIHRoYXQgYXJlIG5vdCBtYXBwZWQgd2l0aCBQVEVzIChib2x0ZWQgaW4gdGhlIGhhc2ggdGFibGUpLiBUaGlzCisJICogaXMgdGhlIGNhc2UgZm9yIGlvcmVtYXBzIGRvbmUgdmVyeSBlYXJseSBhdCBib290IChiZWZvcmUKKwkgKiBtZW1faW5pdF9kb25lKSBhbmQgaW5jbHVkZXMgdGhlIG1hcHBpbmcgb2YgdGhlIElTQSBJTyBzcGFjZS4KKwkgKgorCSAqIEZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBhZmZlY3RlZCBkZXZpY2VzIGlzIGV4cGVjdGVkIHRvIGRvIERNQQorCSAqIGFuZCB0aHVzIHRoZXJlIHNob3VsZCBiZSBubyBwcm9ibGVtIGluIHByYWN0aWNlLgorCSAqCisJICogSW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZXMsIHdlIG9ubHkgZG8gdGhlIFBURSBzZWFyY2ggZm9yCisJICogYWRkcmVzc2VzIGZhbGxpbmcgaW4gdGhlIFBIQiBJTyBzcGFjZSBhcmVhLiBUaGF0IG1lYW5zIGl0IHdpbGwKKwkgKiBub3Qgd29yayBmb3IgaG90cGx1ZydlZCBQSEJzIGJ1dCB0aG9zZSBkb24ndCBleGlzdCB3aXRoIFNwaWRlci4KKwkgKi8KKwlpZiAodG9rZW4gJiYgdG9rZW4gPD0gc3BpZGVyX3BjaV9jb3VudCkKKwkJYnVzID0gJnNwaWRlcl9wY2lfYnVzc2VzW3Rva2VuIC0gMV07CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHBhZGRyOworCQlwdGVfdCAqcHRlcDsKKworCQkvKiBGaXh1cCBwaHlzaWNhbCBhZGRyZXNzICovCisJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpUENJX0ZJWF9BRERSKGFkZHIpOworCisJCS8qIENoZWNrIGlmIGl0J3MgaW4gYWxsb3dlZCByYW5nZSBmb3IgIFBJTyAqLworCQlpZiAodmFkZHIgPCBQSEJTX0lPX0JBU0UgfHwgdmFkZHIgPj0gSU1BTExPQ19CQVNFKQorCQkJcmV0dXJuOworCisJCS8qIFRyeSB0byBmaW5kIGEgUFRFLiBJZiBub3QsIGNsZWFyIHRoZSBwYWRkciwgd2UnbGwgZG8KKwkJICogYSB2YWRkciBvbmx5IGxvb2t1cCAoUElPIG9ubHkpCisJCSAqLworCQlwdGVwID0gZmluZF9saW51eF9wdGUoaW5pdF9tbS5wZ2QsIHZhZGRyKTsKKwkJaWYgKHB0ZXAgPT0gTlVMTCkKKwkJCXBhZGRyID0gMDsKKwkJZWxzZQorCQkJcGFkZHIgPSBwdGVfcGZuKCpwdGVwKSA8PCBQQUdFX1NISUZUOworCisJCWJ1cyA9IHNwaWRlcl9wY2lfZmluZCh2YWRkciwgcGFkZHIpOworCQlpZiAoYnVzID09IE5VTEwpCisJCQlyZXR1cm47CisJfQorCisJLyogTm93IGRvIHRoZSB3b3JrYXJvdW5kCisJICovCisJKHZvaWQpaW5fYmUzMihidXMtPnJlZ3MgKyBTUElERVJfUENJX0RVTU1ZX1JFQUQpOworfQorCitzdGF0aWMgdTggc3BpZGVyX3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1OCB2YWwgPSBfX2RvX3JlYWRiKGFkZHIpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTE2IHNwaWRlcl9yZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTE2IHZhbCA9IF9fZG9fcmVhZHcoYWRkcik7CisJc3BpZGVyX2lvX2ZsdXNoKGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1MzIgc3BpZGVyX3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgdmFsID0gX19kb19yZWFkbChhZGRyKTsKKwlzcGlkZXJfaW9fZmx1c2goYWRkcik7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHU2NCBzcGlkZXJfcmVhZHEoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXU2NCB2YWwgPSBfX2RvX3JlYWRxKGFkZHIpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTE2IHNwaWRlcl9yZWFkd19iZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTE2IHZhbCA9IF9fZG9fcmVhZHdfYmUoYWRkcik7CisJc3BpZGVyX2lvX2ZsdXNoKGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1MzIgc3BpZGVyX3JlYWRsX2JlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgdmFsID0gX19kb19yZWFkbF9iZShhZGRyKTsKKwlzcGlkZXJfaW9fZmx1c2goYWRkcik7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHU2NCBzcGlkZXJfcmVhZHFfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXU2NCB2YWwgPSBfX2RvX3JlYWRxX2JlKGFkZHIpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBzcGlkZXJfcmVhZHNiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLAorCQkJICB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCV9fZG9fcmVhZHNiKGFkZHIsIGJ1ZiwgY291bnQpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKK30KKworc3RhdGljIHZvaWQgc3BpZGVyX3JlYWRzdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlfX2RvX3JlYWRzdyhhZGRyLCBidWYsIGNvdW50KTsKKwlzcGlkZXJfaW9fZmx1c2goYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHNwaWRlcl9yZWFkc2woY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsCisJCQkgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJX19kb19yZWFkc2woYWRkciwgYnVmLCBjb3VudCk7CisJc3BpZGVyX2lvX2ZsdXNoKGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBzcGlkZXJfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKKwkJCQkgdW5zaWduZWQgbG9uZyBuKQoreworCV9fZG9fbWVtY3B5X2Zyb21pbyhkZXN0LCBzcmMsIG4pOworCXNwaWRlcl9pb19mbHVzaChzcmMpOworfQorCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBzcGlkZXJfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHNwaWRlcl9wY2lfYnVzICpidXM7CisJdm9pZCBfX2lvbWVtICpyZXMgPSBfX2lvcmVtYXAoYWRkciwgc2l6ZSwgZmxhZ3MpOworCWludCBidXNubzsKKworCXByX2RlYnVnKCJzcGlkZXJfaW9yZW1hcCgweCVseCwgMHglbHgsIDB4JWx4KSAtPiAweCVwXG4iLAorCQkgYWRkciwgc2l6ZSwgZmxhZ3MsIHJlcyk7CisKKwlidXMgPSBzcGlkZXJfcGNpX2ZpbmQoMCwgYWRkcik7CisJaWYgKGJ1cyAhPSBOVUxMKSB7CisJCWJ1c25vID0gYnVzIC0gc3BpZGVyX3BjaV9idXNzZXM7CisJCXByX2RlYnVnKCIgZm91bmQgYnVzICVkLCBzZXR0aW5nIHRva2VuXG4iLCBidXNubyk7CisJCVBDSV9TRVRfQUREUl9UT0tFTihyZXMsIGJ1c25vICsgMSk7CisJfQorCXByX2RlYnVnKCIgcmVzdWx0PTB4JXBcbiIsIHJlcyk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3BpZGVyX3BjaV9zZXR1cF9jaGlwKHN0cnVjdCBzcGlkZXJfcGNpX2J1cyAqYnVzKQoreworI2lmZGVmIFNQSURFUl9ESVNBQkxFX1BSRUZFVENICisJdTMyIHZhbCA9IGluX2JlMzIoYnVzLT5yZWdzICsgU1BJREVSX1BDSV9WQ0lfQ05UTF9TVEFUKTsKKwlwcl9kZWJ1ZygiIFBWQ0lfQ29udHJvbF9TdGF0dXMgd2FzIDB4JTA4eFxuIiwgdmFsKTsKKwlvdXRfYmUzMihidXMtPnJlZ3MgKyBTUElERVJfUENJX1ZDSV9DTlRMX1NUQVQsIHZhbCB8IDB4OCk7CisjZW5kaWYKKworCS8qIENvbmZpZ3VyZSB0aGUgZHVtbXkgYWRkcmVzcyBmb3IgdGhlIHdvcmthcm91bmQgKi8KKwlvdXRfYmUzMihidXMtPnJlZ3MgKyBTUElERVJfUENJX0RVTU1ZX1JFQURfQkFTRSwgMHg4MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzcGlkZXJfcGNpX2FkZF9vbmUoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCit7CisJc3RydWN0IHNwaWRlcl9wY2lfYnVzICpidXMgPSAmc3BpZGVyX3BjaV9idXNzZXNbc3BpZGVyX3BjaV9jb3VudF07CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBoYi0+YXJjaF9kYXRhOworCXN0cnVjdCByZXNvdXJjZSByc3JjOworCXZvaWQgX19pb21lbSAqcmVnczsKKworCWlmIChzcGlkZXJfcGNpX2NvdW50ID49IE1BWF9TUElERVJTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgc3BpZGVyIGJyaWRnZXMsIHdvcmthcm91bmRzIgorCQkgICAgICAgIiBkaXNhYmxlZCBmb3IgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSByZWdpc3RlcnMgZm9yIHRoZSBiZWFzdCAqLworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IHJlZ2lzdGVycyBmb3Igc3BpZGVyICVzIgorCQkgICAgICAgIiB3b3JrYXJvdW5kcyBkaXNhYmxlZFxuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYXNrIG91dCBzb21lIHVzZWxlc3MgYml0cyBpbiB0aGVyZSB0byBnZXQgdG8gdGhlIGJhc2Ugb2YgdGhlCisJICogc3BpZGVyIGNoaXAKKwkgKi8KKwlyc3JjLnN0YXJ0ICY9IH4weGZmZmZmZmZmdWw7CisKKwkvKiBNYXAgdGhlbSAqLworCXJlZ3MgPSBpb3JlbWFwKHJzcmMuc3RhcnQgKyBTUElERVJfUENJX1JFR19CQVNFLCAweDEwMDApOworCWlmIChyZWdzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIHJlZ2lzdGVycyBmb3Igc3BpZGVyICVzIgorCQkgICAgICAgIiB3b3JrYXJvdW5kcyBkaXNhYmxlZFxuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGlkZXJfcGNpX2NvdW50Kys7CisKKwkvKiBXZSBhc3N1bWUgc3BpZGVycyBvbmx5IGhhdmUgb25lIE1NSU8gcmVzb3VyY2UgKi8KKwlidXMtPm1taW9fc3RhcnQgPSBwaGItPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQ7CisJYnVzLT5tbWlvX2VuZCA9IHBoYi0+bWVtX3Jlc291cmNlc1swXS5lbmQgKyAxOworCisJYnVzLT5waW9fdnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGhiLT5pb19iYXNlX3ZpcnQ7CisJYnVzLT5waW9fdmVuZCA9IGJ1cy0+cGlvX3ZzdGFydCArIHBoYi0+cGNpX2lvX3NpemU7CisKKwlidXMtPnJlZ3MgPSByZWdzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBTcGlkZXIgTU1JTyB3b3JrYXJvdW5kIGZvciAlc1xuIixucC0+ZnVsbF9uYW1lKTsKKworCXByX2RlYnVnKCIgbW1pbyAoUCkgPSAweCUwMTZseC4uMHglMDE2bHhcbiIsCisJCSBidXMtPm1taW9fc3RhcnQsIGJ1cy0+bW1pb19lbmQpOworCXByX2RlYnVnKCIgIHBpbyAoVikgPSAweCUwMTZseC4uMHglMDE2bHhcbiIsCisJCSBidXMtPnBpb192c3RhcnQsIGJ1cy0+cGlvX3ZlbmQpOworCXByX2RlYnVnKCIgcmVncyAoUCkgPSAweCUwMTZseCAoVikgPSAweCVwXG4iLAorCQkgcnNyYy5zdGFydCArIFNQSURFUl9QQ0lfUkVHX0JBU0UsIGJ1cy0+cmVncyk7CisKKwlzcGlkZXJfcGNpX3NldHVwX2NoaXAoYnVzKTsKK30KKworc3RhdGljIHN0cnVjdCBwcGNfcGNpX2lvIF9faW5pdGRhdGEgc3BpZGVyX3BjaV9pbyA9IHsKKwkucmVhZGIgPSBzcGlkZXJfcmVhZGIsCisJLnJlYWR3ID0gc3BpZGVyX3JlYWR3LAorCS5yZWFkbCA9IHNwaWRlcl9yZWFkbCwKKwkucmVhZHEgPSBzcGlkZXJfcmVhZHEsCisJLnJlYWR3X2JlID0gc3BpZGVyX3JlYWR3X2JlLAorCS5yZWFkbF9iZSA9IHNwaWRlcl9yZWFkbF9iZSwKKwkucmVhZHFfYmUgPSBzcGlkZXJfcmVhZHFfYmUsCisJLnJlYWRzYiA9IHNwaWRlcl9yZWFkc2IsCisJLnJlYWRzdyA9IHNwaWRlcl9yZWFkc3csCisJLnJlYWRzbCA9IHNwaWRlcl9yZWFkc2wsCisJLm1lbWNweV9mcm9taW8gPSBzcGlkZXJfbWVtY3B5X2Zyb21pbywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaWRlcl9wY2lfd29ya2Fyb3VuZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CisKKwlpZiAoIW1hY2hpbmVfaXMoY2VsbCkpCisJCXJldHVybiAwOworCisJLyogRmluZCBzcGlkZXIgYnJpZGdlcy4gV2UgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIGFsbCBwcm9iZWQKKwkgKiBpbiBzZXR1cF9hcmNoKCkuIElmIHRoYXQgd2FzIHRvIGNoYW5nZSwgd2Ugd291bGQgbmVlZCB0bworCSAqIHVwZGF0ZSB0aGlzIGNvZGUgdG8gY29wZSB3aXRoIGR5bmFtaWNhbGx5IGFkZGVkIGJ1c3NlcworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGhiLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBoYi0+YXJjaF9kYXRhOworCQljb25zdCBjaGFyICptb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisKKwkJLyogSWYgbm8gbW9kZWwgcHJvcGVydHkgb3IgbmFtZSBpc24ndCBleGFjdGx5ICJwY2kiLCBza2lwICovCisJCWlmIChtb2RlbCA9PSBOVUxMIHx8IHN0cmNtcChucC0+bmFtZSwgInBjaSIpKQorCQkJY29udGludWU7CisJCS8qIElmIG1vZGVsIGlzIG5vdCAiU3BpZGVyIiwgc2tpcCAqLworCQlpZiAoc3RyY21wKG1vZGVsLCAiU3BpZGVyIikpCisJCQljb250aW51ZTsKKwkJc3BpZGVyX3BjaV9hZGRfb25lKHBoYik7CisJfQorCisJLyogTm8gU3BpZGVyIFBDSSBmb3VuZCwgZXhpdCAqLworCWlmIChzcGlkZXJfcGNpX2NvdW50ID09IDApCisJCXJldHVybiAwOworCisJLyogU2V0dXAgSU8gY2FsbGJhY2tzLiBXZSBvbmx5IHNldHVwIE1NSU8gcmVhZHMuIFBJTyByZWFkcyB3aWxsCisJICogZmFsbGJhY2sgdG8gTU1JTyByZWFkcyAodGhvdWdoIHdpdGhvdXQgYSB0b2tlbiwgdGh1cyBzbG93ZXIpCisJICovCisJcHBjX3BjaV9pbyA9IHNwaWRlcl9wY2lfaW87CisKKwkvKiBTZXR1cCBpb3JlbWFwIGNhbGxiYWNrICovCisJcHBjX21kLmlvcmVtYXAgPSBzcGlkZXJfaW9yZW1hcDsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChzcGlkZXJfcGNpX3dvcmthcm91bmRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IGFjYTRjM2QuLmI0MzQ2NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC0xLDUxNCArMSw3NDcgQEAKIC8qCiAgKiBJT01NVSBpbXBsZW1lbnRhdGlvbiBmb3IgQ2VsbCBCcm9hZGJhbmQgUHJvY2Vzc29yIEFyY2hpdGVjdHVyZQotICogV2UganVzdCBlc3RhYmxpc2ggYSBsaW5lYXIgbWFwcGluZyBhdCBib290IGJ5IHNldHRpbmcgYWxsIHRoZQotICogSU9QVCBjYWNoZSBlbnRyaWVzIGluIHRoZSBDUFUuCi0gKiBUaGUgbWFwcGluZyBmdW5jdGlvbnMgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBwY2lfZGlyZWN0X2lvbW11LCAKLSAqIGV4Y2VwdCBmb3IgdGhlIGhhbmRsaW5nIG9mIHRoZSBoaWdoIG9yZGVyIGJpdCB0aGF0IGlzIHJlcXVpcmVkCi0gKiBieSB0aGUgU3BpZGVyIGJyaWRnZS4gVGhlc2Ugc2hvdWxkIGJlIHNwbGl0IGludG8gYSBzZXBhcmF0ZQotICogZmlsZSBhdCB0aGUgcG9pbnQgd2hlcmUgd2UgZ2V0IGEgZGlmZmVyZW50IGJyaWRnZSBjaGlwLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKLSAqCQkJIEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+CisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2CiAgKgotICogQmFzZWQgb24gbGluZWFyIG1hcHBpbmcKLSAqIENvcHlyaWdodCAoQykgMjAwMyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKiBBdXRob3I6IEplcmVteSBLZXJyIDxqa0BvemxhYnMub3JnPgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCi0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2lvbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbG1iLmg+CiAKLSNpbmNsdWRlICJpb21tdS5oIgorI2luY2x1ZGUgImNiZV9yZWdzLmgiCisjaW5jbHVkZSAiaW50ZXJydXB0LmgiCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAKLWdldF9pb3B0X2VudHJ5KHVuc2lnbmVkIGxvbmcgcmVhbF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGlvaWQsCi0JCQkgdW5zaWduZWQgbG9uZyBwcm90KQotewotCXJldHVybiAocHJvdCAmIElPUFRfUFJPVF9NQVNLKQotCSAgICAgfCAoSU9QVF9DT0hFUkVOVCkKLQkgICAgIHwgKElPUFRfT1JERVJfVkMpCi0JICAgICB8IChyZWFsX2FkZHJlc3MgJiBJT1BUX1JQTl9NQVNLKQotCSAgICAgfCAoaW9pZCAmIElPUFRfSU9JRF9NQVNLKTsKLX0KKy8qIERlZmluZSBDRUxMX0lPTU1VX1JFQUxfVU5NQVAgdG8gYWN0dWFsbHkgdW5tYXAgbm9uLXVzZWQgcGFnZXMKKyAqIGluc3RlYWQgb2YgbGVhdmluZyB0aGVtIG1hcHBlZCB0byBzb21lIGR1bW15IHBhZ2UuIFRoaXMgY2FuIGJlCisgKiBlbmFibGVkIG9uY2UgdGhlIGFwcHJvcHJpYXRlIHdvcmthcm91bmRzIGZvciBzcGlkZXIgYnVncyBoYXZlCisgKiBiZWVuIGVuYWJsZWQKKyAqLworI2RlZmluZSBDRUxMX0lPTU1VX1JFQUxfVU5NQVAKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgdmFsOwotfSBpb3N0ZTsKKy8qIERlZmluZSBDRUxMX0lPTU1VX1NUUklDVF9QUk9URUNUSU9OIHRvIGVuZm9yY2UgcHJvdGVjdGlvbiBvZgorICogSU8gUFRFcyBiYXNlZCBvbiB0aGUgdHJhbnNmZXIgZGlyZWN0aW9uLiBUaGF0IGNhbiBiZSBlbmFibGVkCisgKiBvbmNlIHNwaWRlci1uZXQgaGFzIGJlZW4gZml4ZWQgdG8gcGFzcyB0aGUgY29ycmVjdCBkaXJlY3Rpb24KKyAqIHRvIHRoZSBETUEgbWFwcGluZyBmdW5jdGlvbnMKKyAqLworI2RlZmluZSBDRUxMX0lPTU1VX1NUUklDVF9QUk9URUNUSU9OCiAKLXN0YXRpYyBpbmxpbmUgaW9zdGUKLW1rX2lvc3RlKHVuc2lnbmVkIGxvbmcgdmFsKQotewotCWlvc3RlIGlvc3RlID0geyAudmFsID0gdmFsLCB9OwotCXJldHVybiBpb3N0ZTsKLX0KIAotc3RhdGljIGlubGluZSBpb3N0ZQotZ2V0X2lvc3RfZW50cnkodW5zaWduZWQgbG9uZyBpb3B0X2Jhc2UsIHVuc2lnbmVkIGxvbmcgaW9fYWRkcmVzcywgdW5zaWduZWQgcGFnZV9zaXplKQotewotCXVuc2lnbmVkIGxvbmcgcHM7Ci0JdW5zaWduZWQgbG9uZyBpb3N0ZXA7Ci0JdW5zaWduZWQgbG9uZyBubnB0OwotCXVuc2lnbmVkIGxvbmcgc2hpZnQ7CisjZGVmaW5lIE5SX0lPTU1VUwkJCTIKIAotCXN3aXRjaCAocGFnZV9zaXplKSB7Ci0JY2FzZSAweDEwMDAwMDA6Ci0JCXBzID0gSU9TVF9QU18xNk07Ci0JCW5ucHQgPSAwOyAgLyogb25lIHBhZ2UgcGVyIHNlZ21lbnQgKi8KLQkJc2hpZnQgPSA1OyAvKiBzZWdtZW50IGhhcyAxNiBpb3B0IGVudHJpZXMgKi8KLQkJYnJlYWs7CisvKiBJT0MgbW1hcCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU9DX1JlZ19TaXplCQkJMHgyMDAwCiAKLQljYXNlIDB4MTAwMDAwOgotCQlwcyA9IElPU1RfUFNfMU07Ci0JCW5ucHQgPSAwOyAgLyogb25lIHBhZ2UgcGVyIHNlZ21lbnQgKi8KLQkJc2hpZnQgPSAxOyAvKiBzZWdtZW50IGhhcyAyNTYgaW9wdCBlbnRyaWVzICovCi0JCWJyZWFrOworI2RlZmluZSBJT0NfSU9QVF9DYWNoZUludmQJCTB4OTA4CisjZGVmaW5lIElPQ19JT1BUX0NhY2hlSW52ZF9ORV9NYXNrCTB4ZmZlMDAwMDAwMDAwMDAwMHVsCisjZGVmaW5lIElPQ19JT1BUX0NhY2hlSW52ZF9JT1BURV9NYXNrCTB4MDAwMDAzZmZmZmZmZmZmOHVsCisjZGVmaW5lIElPQ19JT1BUX0NhY2hlSW52ZF9CdXN5CQkweDAwMDAwMDAwMDAwMDAwMDF1bAogCi0JY2FzZSAweDEwMDAwOgotCQlwcyA9IElPU1RfUFNfNjRLOwotCQlubnB0ID0gMHgwNzsgLyogOCBwYWdlcyBwZXIgaW8gcGFnZSB0YWJsZSAqLwotCQlzaGlmdCA9IDA7ICAgLyogYWxsIGVudHJpZXMgYXJlIHVzZWQgKi8KLQkJYnJlYWs7CisjZGVmaW5lIElPQ19JT1NUX09yaWdpbgkJCTB4OTE4CisjZGVmaW5lIElPQ19JT1NUX09yaWdpbl9FCQkweDgwMDAwMDAwMDAwMDAwMDB1bAorI2RlZmluZSBJT0NfSU9TVF9PcmlnaW5fSFcJCTB4MDAwMDAwMDAwMDAwMDgwMHVsCisjZGVmaW5lIElPQ19JT1NUX09yaWdpbl9ITAkJMHgwMDAwMDAwMDAwMDAwNDAwdWwKIAotCWNhc2UgMHgxMDAwOgotCQlwcyA9IElPU1RfUFNfNEs7Ci0JCW5ucHQgPSAweDdmOyAvKiAxMjggcGFnZXMgcGVyIGlvIHBhZ2UgdGFibGUgKi8KLQkJc2hpZnQgPSAwOyAgIC8qIGFsbCBlbnRyaWVzIGFyZSB1c2VkICovCi0JCWJyZWFrOworI2RlZmluZSBJT0NfSU9fRXhjcFN0YXQJCQkweDkyMAorI2RlZmluZSBJT0NfSU9fRXhjcFN0YXRfVgkJMHg4MDAwMDAwMDAwMDAwMDAwdWwKKyNkZWZpbmUgSU9DX0lPX0V4Y3BTdGF0X1NQRl9NYXNrCTB4NjAwMDAwMDAwMDAwMDAwMHVsCisjZGVmaW5lIElPQ19JT19FeGNwU3RhdF9TUEZfUwkJMHg2MDAwMDAwMDAwMDAwMDAwdWwKKyNkZWZpbmUgSU9DX0lPX0V4Y3BTdGF0X1NQRl9QCQkweDQwMDAwMDAwMDAwMDAwMDB1bAorI2RlZmluZSBJT0NfSU9fRXhjcFN0YXRfQUREUl9NYXNrCTB4MDAwMDAwMDdmZmZmZjAwMHVsCisjZGVmaW5lIElPQ19JT19FeGNwU3RhdF9SV19NYXNrCQkweDAwMDAwMDAwMDAwMDA4MDB1bAorI2RlZmluZSBJT0NfSU9fRXhjcFN0YXRfSU9JRF9NYXNrCTB4MDAwMDAwMDAwMDAwMDdmZnVsCiAKLQlkZWZhdWx0OiAvKiBub3QgYSBrbm93biBjb21waWxlIHRpbWUgY29uc3RhbnQgKi8KLQkJewotCQkJLyogQlVJTERfQlVHX09OKCkgaXMgbm90IHVzYWJsZSBoZXJlICovCi0JCQlleHRlcm4gdm9pZCBfX2dldF9pb3N0X2VudHJ5X2JhZF9wYWdlX3NpemUodm9pZCk7Ci0JCQlfX2dldF9pb3N0X2VudHJ5X2JhZF9wYWdlX3NpemUoKTsKLQkJfQotCQlicmVhazsKLQl9CisjZGVmaW5lIElPQ19JT19FeGNwTWFzawkJCTB4OTI4CisjZGVmaW5lIElPQ19JT19FeGNwTWFza19TRkUJCTB4NDAwMDAwMDAwMDAwMDAwMHVsCisjZGVmaW5lIElPQ19JT19FeGNwTWFza19QRkUJCTB4MjAwMDAwMDAwMDAwMDAwMHVsCiAKLQlpb3N0ZXAgPSBpb3B0X2Jhc2UgKwotCQkJIC8qIG5lZWQgOCBieXRlcyBwZXIgaW9wdGUgKi8KLQkJCSgoKGlvX2FkZHJlc3MgLyBwYWdlX3NpemUgKiA4KQotCQkJIC8qIGFsaWduIGlvIHBhZ2UgdGFibGVzIG9uIDRrIHBhZ2UgYm91bmRhcmllcyAqLwotCQkJCSA8PCBzaGlmdCkgCi0JCQkgLyogbm5wdCsxIHBhZ2VzIGdvIGludG8gZWFjaCBpb3B0ICovCi0JCQkJICYgfihubnB0IDw8IDEyKSk7CisjZGVmaW5lIElPQ19JT0NtZF9PZmZzZXQJCTB4MTAwMAogCi0Jbm5wdCsrOyAvKiB0aGlzIHNlZW1zIHRvIHdvcmssIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBub3QgY2xlYXIKLQkJICAgYWJvdXQgd2V0aGVyIHdlIHB1dCBubnB0IG9yIG5ucHQtMSBpbnRvIHRoZSBpb3N0ZSBiaXRzLgotCQkgICBJbiB0aGVvcnksIHRoaXMgY2FuJ3Qgd29yayBmb3IgNGsgcGFnZXMuICovCi0JcmV0dXJuIG1rX2lvc3RlKElPU1RfVkFMSURfTUFTSwotCQkJfCAoaW9zdGVwICYgSU9TVF9QVF9CQVNFX01BU0spCi0JCQl8ICgobm5wdCA8PCA1KSAmIElPU1RfTk5QVF9NQVNLKQotCQkJfCAocHMgJiBJT1NUX1BTX01BU0spKTsKLX0KKyNkZWZpbmUgSU9DX0lPQ21kX0NmZwkJCTB4YzAwCisjZGVmaW5lIElPQ19JT0NtZF9DZmdfVEUJCTB4MDAwMDgwMDAwMDAwMDAwMHVsCiAKLS8qIGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgYW4gaW8gcHRlICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWdldF9pb3B0ZXAoaW9zdGUgaW9zdF9lbnRyeSwgdW5zaWduZWQgbG9uZyBpb19hZGRyZXNzKQotewotCXVuc2lnbmVkIGxvbmcgaW9wdF9iYXNlOwotCXVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwotCXVuc2lnbmVkIGxvbmcgcGFnZV9udW1iZXI7Ci0JdW5zaWduZWQgbG9uZyBpb3B0X29mZnNldDsKIAotCWlvcHRfYmFzZSA9IGlvc3RfZW50cnkudmFsICYgSU9TVF9QVF9CQVNFX01BU0s7Ci0JcGFnZV9zaXplID0gaW9zdF9lbnRyeS52YWwgJiBJT1NUX1BTX01BU0s7CisvKiBTZWdtZW50IHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgSU9TVEVfVgkJCTB4ODAwMDAwMDAwMDAwMDAwMHVsIC8qIHZhbGlkICovCisjZGVmaW5lIElPU1RFX0gJCQkweDQwMDAwMDAwMDAwMDAwMDB1bCAvKiBjYWNoZSBoaW50ICovCisjZGVmaW5lIElPU1RFX1BUX0Jhc2VfUlBOX01hc2sgIDB4M2ZmZmZmZmZmZmZmZjAwMHVsIC8qIGJhc2UgUlBOIG9mIElPUFQgKi8KKyNkZWZpbmUgSU9TVEVfTlBQVF9NYXNrCQkweDAwMDAwMDAwMDAwMDBmZTB1bCAvKiBuby4gcGFnZXMgaW4gSU9QVCAqLworI2RlZmluZSBJT1NURV9QU19NYXNrCQkweDAwMDAwMDAwMDAwMDAwMDd1bCAvKiBwYWdlIHNpemUgKi8KKyNkZWZpbmUgSU9TVEVfUFNfNEsJCTB4MDAwMDAwMDAwMDAwMDAwMXVsIC8qICAgLSA0a0IgICovCisjZGVmaW5lIElPU1RFX1BTXzY0SwkJMHgwMDAwMDAwMDAwMDAwMDAzdWwgLyogICAtIDY0a0IgKi8KKyNkZWZpbmUgSU9TVEVfUFNfMU0JCTB4MDAwMDAwMDAwMDAwMDAwNXVsIC8qICAgLSAxTUIgICovCisjZGVmaW5lIElPU1RFX1BTXzE2TQkJMHgwMDAwMDAwMDAwMDAwMDA3dWwgLyogICAtIDE2TUIgKi8KIAotCS8qIGRlY29kZSBwYWdlIHNpemUgdG8gY29tcHV0ZSBwYWdlIG51bWJlciAqLwotCXBhZ2VfbnVtYmVyID0gKGlvX2FkZHJlc3MgJiAweDBmZmZmZmZmKSA+PiAoMTAgKyAyICogcGFnZV9zaXplKTsKLQkvKiBwYWdlIG51bWJlciBpcyBhbiBvZmZzZXQgaW50byB0aGUgaW8gcGFnZSB0YWJsZSAqLwotCWlvcHRfb2Zmc2V0ID0gKHBhZ2VfbnVtYmVyIDw8IDMpICYgMHg3ZmZmOHVsOwotCXJldHVybiBpb3B0X2Jhc2UgKyBpb3B0X29mZnNldDsKLX0KKy8qIFBhZ2UgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBJT1BURV9QUF9XCQkweDgwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiB3cml0ZSAqLworI2RlZmluZSBJT1BURV9QUF9SCQkweDQwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiByZWFkICovCisjZGVmaW5lIElPUFRFX00JCQkweDIwMDAwMDAwMDAwMDAwMDB1bCAvKiBjb2hlcmVuY3kgcmVxdWlyZWQgKi8KKyNkZWZpbmUgSU9QVEVfU09fUgkJMHgxMDAwMDAwMDAwMDAwMDAwdWwgLyogb3JkZXJpbmc6IHdyaXRlcyAqLworI2RlZmluZSBJT1BURV9TT19SVyAgICAgICAgICAgICAweDE4MDAwMDAwMDAwMDAwMDB1bCAvKiBvcmRlcmluZzogciAmIHcgKi8KKyNkZWZpbmUgSU9QVEVfUlBOX01hc2sJCTB4MDdmZmZmZmZmZmZmZjAwMHVsIC8qIFJQTiAqLworI2RlZmluZSBJT1BURV9ICQkJMHgwMDAwMDAwMDAwMDAwODAwdWwgLyogY2FjaGUgaGludCAqLworI2RlZmluZSBJT1BURV9JT0lEX01hc2sJCTB4MDAwMDAwMDAwMDAwMDdmZnVsIC8qIGlvaWQgKi8KIAotLyogY29tcHV0ZSB0aGUgdGFnIGZpZWxkIG9mIHRoZSBpb3B0IGNhY2hlIGVudHJ5ICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWdldF9pb2NfdGFnKGlvc3RlIGlvc3RfZW50cnksIHVuc2lnbmVkIGxvbmcgaW9fYWRkcmVzcykKLXsKLQl1bnNpZ25lZCBsb25nIGlvcHRlID0gZ2V0X2lvcHRlcChpb3N0X2VudHJ5LCBpb19hZGRyZXNzKTsKIAotCXJldHVybiBJT1BUX1ZBTElEX01BU0sKLQkgICAgIHwgKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDBmZjh1bCkgPj4gMykKLQkgICAgIHwgKChpb3B0ZSAmIDB4MDAwMDAwM2ZmZmZmYzAwMDB1bCkgPj4gOSk7Ci19CisvKiBJT01NVSBzaXppbmcgKi8KKyNkZWZpbmUgSU9fU0VHTUVOVF9TSElGVAkyOAorI2RlZmluZSBJT19QQUdFTk9fQklUUwkJKElPX1NFR01FTlRfU0hJRlQgLSBJT01NVV9QQUdFX1NISUZUKQogCi0vKiBjb21wdXRlIHRoZSBoYXNoZWQgNiBiaXQgaW5kZXggZm9yIHRoZSA0LXdheSBhc3NvY2lhdGl2ZSBwdGUgY2FjaGUgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotZ2V0X2lvY19oYXNoKGlvc3RlIGlvc3RfZW50cnksIHVuc2lnbmVkIGxvbmcgaW9fYWRkcmVzcykKLXsKLQl1bnNpZ25lZCBsb25nIGlvcHRlID0gZ2V0X2lvcHRlcChpb3N0X2VudHJ5LCBpb19hZGRyZXNzKTsKKy8qIFRoZSBoaWdoIGJpdCBuZWVkcyB0byBiZSBzZXQgb24gZXZlcnkgRE1BIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1BJREVSX0RNQV9PRkZTRVQJMHg4MDAwMDAwMHVsCiAKLQlyZXR1cm4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDAxZjh1bCkgPj4gMykKLQkgICAgIF4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMjAwMDB1bCkgPj4gMTcpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDEwMDAwdWwpID4+IDE1KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwODAwMHVsKSA+PiAxMykKLQkgICAgIF4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDQwMDB1bCkgPj4gMTEpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAyMDAwdWwpID4+IDkpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAxMDAwdWwpID4+IDcpOwotfQotCi0vKiBzYW1lIGFzIGFib3ZlLCBidXQgcHJldGVuZCB0aGF0IHdlIGhhdmUgYSBzaW1wbGVyIDEtd2F5IGFzc29jaWF0aXZlCi0gICBwdGUgY2FjaGUgd2l0aCBhbiA4IGJpdCBpbmRleCAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1nZXRfaW9jX2hhc2hfMXdheShpb3N0ZSBpb3N0X2VudHJ5LCB1bnNpZ25lZCBsb25nIGlvX2FkZHJlc3MpCi17Ci0JdW5zaWduZWQgbG9uZyBpb3B0ZSA9IGdldF9pb3B0ZXAoaW9zdF9lbnRyeSwgaW9fYWRkcmVzcyk7Ci0KLQlyZXR1cm4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDAxZjh1bCkgPj4gMykKLQkgICAgIF4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMjAwMDB1bCkgPj4gMTcpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDEwMDAwdWwpID4+IDE1KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwODAwMHVsKSA+PiAxMykKLQkgICAgIF4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDQwMDB1bCkgPj4gMTEpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAyMDAwdWwpID4+IDkpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAxMDAwdWwpID4+IDcpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDBjMDAwdWwpID4+IDgpOwotfQotCi1zdGF0aWMgaW5saW5lIGlvc3RlCi1nZXRfaW9zdF9jYWNoZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0JdW5zaWduZWQgbG9uZyBfX2lvbWVtICpwID0gKGJhc2UgKyBJT0NfU1RfQ0FDSEVfRElSKTsKLQlyZXR1cm4gbWtfaW9zdGUoaW5fYmU2NCgmcFtpbmRleF0pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfaW9zdF9jYWNoZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGxvbmcgaW5kZXgsIGlvc3RlIHN0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnAgPSAoYmFzZSArIElPQ19TVF9DQUNIRV9ESVIpOwotCXByX2RlYnVnKCJpb3N0ZSAlMDJseCB3YXMgJTAxNmx4LCBzdG9yZSAlMDE2bHgiLCBpbmRleCwKLQkJCWdldF9pb3N0X2NhY2hlKGJhc2UsIGluZGV4KS52YWwsIHN0ZS52YWwpOwotCW91dF9iZTY0KCZwW2luZGV4XSwgc3RlLnZhbCk7Ci0JcHJfZGVidWcoIiBub3cgJTAxNmx4XG4iLCBnZXRfaW9zdF9jYWNoZShiYXNlLCBpbmRleCkudmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1nZXRfaW9wdF9jYWNoZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKnRhZykKLXsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnRhZ3MgPSAodm9pZCAqKShiYXNlICsgSU9DX1BUX0NBQ0hFX0RJUik7Ci0JdW5zaWduZWQgbG9uZyBfX2lvbWVtICpwID0gKHZvaWQgKikoYmFzZSArIElPQ19QVF9DQUNIRV9SRUcpOwkKLQotCSp0YWcgPSB0YWdzW2luZGV4XTsKLQlybWIoKTsKLQlyZXR1cm4gKnA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X2lvcHRfY2FjaGUodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nIGluZGV4LAotCQkgdW5zaWduZWQgbG9uZyB0YWcsIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqdGFncyA9IGJhc2UgKyBJT0NfUFRfQ0FDSEVfRElSOwotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcCA9IGJhc2UgKyBJT0NfUFRfQ0FDSEVfUkVHOwotCi0Jb3V0X2JlNjQocCwgdmFsKTsKLQlvdXRfYmU2NCgmdGFnc1tpbmRleF0sIHRhZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X2lvc3Rfb3JpZ2luKHZvaWQgX19pb21lbSAqYmFzZSkKLXsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnAgPSBiYXNlICsgSU9DX1NUX09SSUdJTjsKLQl1bnNpZ25lZCBsb25nIG9yaWdpbiA9IElPU1RPX0VOQUJMRSB8IElPU1RPX1NXOwotCi0JcHJfZGVidWcoImlvc3Rfb3JpZ2luICUwMTZseCwgbm93ICUwMTZseFxuIiwgaW5fYmU2NChwKSwgb3JpZ2luKTsKLQlvdXRfYmU2NChwLCBvcmlnaW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9pb2NtZF9jb25maWcodm9pZCBfX2lvbWVtICpiYXNlKQotewotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcCA9IGJhc2UgKyAweGMwMDsKLQl1bnNpZ25lZCBsb25nIGNvbmY7Ci0KLQljb25mID0gaW5fYmU2NChwKTsKLQlwcl9kZWJ1ZygiaW9zdF9jb25mICUwMTZseCwgbm93ICUwMTZseFxuIiwgY29uZiwgY29uZiB8IElPQ01EX0NPTkZfVEUpOwotCW91dF9iZTY0KHAsIGNvbmYgfCBJT0NNRF9DT05GX1RFKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX21hcHBpbmcodm9pZCBfX2lvbWVtICpiYXNlLCB2b2lkIF9faW9tZW0gKm1taW9fYmFzZSkKLXsKLQlzZXRfaW9jbWRfY29uZmlnKGJhc2UpOwotCXNldF9pb3N0X29yaWdpbihtbWlvX2Jhc2UpOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2RldiAqZCkgeyB9Ci1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2J1cyAqYikgeyB9Ci0KLXN0cnVjdCBjZWxsX2lvbW11IHsKLQl1bnNpZ25lZCBsb25nIGJhc2U7Ci0JdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICptYXBwZWRfYmFzZTsKLQl2b2lkIF9faW9tZW0gKm1hcHBlZF9tbWlvX2Jhc2U7CitzdHJ1Y3QgaW9tbXVfd2luZG93IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGNiZV9pb21tdSAqaW9tbXU7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgcHRlX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgaW9pZDsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgdGFibGU7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNlbGxfaW9tbXUgY2VsbF9pb21tdXNbTlJfQ1BVU107CisjZGVmaW5lIE5BTUVTSVpFIDgKK3N0cnVjdCBjYmVfaW9tbXUgeworCWludCBuaWQ7CisJY2hhciBuYW1lW05BTUVTSVpFXTsKKwl2b2lkIF9faW9tZW0gKnhsYXRlX3JlZ3M7CisJdm9pZCBfX2lvbWVtICpjbWRfcmVnczsKKwl1bnNpZ25lZCBsb25nICpzdGFiOworCXVuc2lnbmVkIGxvbmcgKnB0YWI7CisJdm9pZCAqcGFkX3BhZ2U7CisJc3RydWN0IGxpc3RfaGVhZCB3aW5kb3dzOworfTsKIAotLyogaW5pdGlhbGl6ZSB0aGUgaW9tbXUgdG8gc3VwcG9ydCBhIHNpbXBsZSBsaW5lYXIgbWFwcGluZwotICogZm9yIGVhY2ggRE1BIHdpbmRvdyB1c2VkIGJ5IGFueSBkZXZpY2UuIEZvciBub3csIHdlCi0gKiBoYXBwZW4gdG8ga25vdyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIERNQSB3aW5kb3cgaW4gdXNlLAotICogc3RhcnRpbmcgYXQgaW9wdF9waHlzX29mZnNldC4gKi8KLXN0YXRpYyB2b2lkIGNlbGxfZG9fbWFwX2lvbW11KHN0cnVjdCBjZWxsX2lvbW11ICppb21tdSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBpb2lkLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBtYXBfc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG1hcF9zaXplKQorLyogU3RhdGljIGFycmF5IG9mIGlvbW11cywgb25lIHBlciBub2RlCisgKiAgIGVhY2ggY29udGFpbnMgYSBsaXN0IG9mIHdpbmRvd3MsIGtleWVkIGZyb20gZG1hX3dpbmRvdyBwcm9wZXJ0eQorICogICAtIG9uIGJ1cyBzZXR1cCwgbG9vayBmb3IgYSBtYXRjaGluZyB3aW5kb3csIG9yIGNyZWF0ZSBvbmUKKyAqICAgLSBvbiBkZXYgc2V0dXAsIGFzc2lnbiBpb21tdV90YWJsZSBwdHIKKyAqLworc3RhdGljIHN0cnVjdCBjYmVfaW9tbXUgaW9tbXVzW05SX0lPTU1VU107CitzdGF0aWMgaW50IGNiZV9ucl9pb21tdXM7CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfdGNlX2NhY2hlKHN0cnVjdCBjYmVfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nICpwdGUsCisJCWxvbmcgbl9wdGVzKQogewotCXVuc2lnbmVkIGxvbmcgaW9fYWRkcmVzcywgcmVhbF9hZGRyZXNzOwotCXZvaWQgX19pb21lbSAqaW9jX2Jhc2UsICppb2NfbW1pb19iYXNlOwotCWlvc3RlIGlvc3RlOwotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyAqcmVnLCB2YWw7CisJbG9uZyBuOwogCi0JLyogd2UgcHJldGVuZCB0aGUgaW8gcGFnZSB0YWJsZSB3YXMgYXQgYSB2ZXJ5IGhpZ2ggYWRkcmVzcyAqLwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZmFrZV9pb3B0ID0gMHgxMDAwMDAwMDAwMHVsOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgaW9fcGFnZV9zaXplID0gMHgxMDAwMDAwOyAvKiB1c2UgMTZNIHBhZ2VzICovCi0JY29uc3QgdW5zaWduZWQgbG9uZyBpb19zZWdtZW50X3NpemUgPSAweDEwMDAwMDAwOyAvKiAyNTZNICovCisJcmVnID0gaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9QVF9DYWNoZUludmQ7CiAKLQlpb2NfYmFzZSA9IGlvbW11LT5tYXBwZWRfYmFzZTsKLQlpb2NfbW1pb19iYXNlID0gaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2U7CisJd2hpbGUgKG5fcHRlcyA+IDApIHsKKwkJLyogd2UgY2FuIGludmFsaWRhdGUgdXAgdG8gMSA8PCAxMSBQVEVzIGF0IG9uY2UgKi8KKwkJbiA9IG1pbihuX3B0ZXMsIDFsIDw8IDExKTsKKwkJdmFsID0gKCgobiAvKi0gMSovKSA8PCA1MykgJiBJT0NfSU9QVF9DYWNoZUludmRfTkVfTWFzaykKKwkJCXwgKF9fcGEocHRlKSAmIElPQ19JT1BUX0NhY2hlSW52ZF9JT1BURV9NYXNrKQorCQkgICAgICAgIHwgSU9DX0lPUFRfQ2FjaGVJbnZkX0J1c3k7CiAKLQlmb3IgKHJlYWxfYWRkcmVzcyA9IDAsIGlvX2FkZHJlc3MgPSBtYXBfc3RhcnQ7Ci0JICAgICBpb19hZGRyZXNzIDw9IG1hcF9zdGFydCArIG1hcF9zaXplOwotCSAgICAgcmVhbF9hZGRyZXNzICs9IGlvX3BhZ2Vfc2l6ZSwgaW9fYWRkcmVzcyArPSBpb19wYWdlX3NpemUpIHsKLQkJaW9zdGUgPSBnZXRfaW9zdF9lbnRyeShmYWtlX2lvcHQsIGlvX2FkZHJlc3MsIGlvX3BhZ2Vfc2l6ZSk7Ci0JCWlmICgocmVhbF9hZGRyZXNzICUgaW9fc2VnbWVudF9zaXplKSA9PSAwKSAvKiBzZWdtZW50IHN0YXJ0ICovCi0JCQlzZXRfaW9zdF9jYWNoZShpb2NfbW1pb19iYXNlLAotCQkJCSAgICAgICBpb19hZGRyZXNzID4+IDI4LCBpb3N0ZSk7Ci0JCWluZGV4ID0gZ2V0X2lvY19oYXNoXzF3YXkoaW9zdGUsIGlvX2FkZHJlc3MpOwotCQlwcl9kZWJ1ZygiYWRkciAlMDhseCwgaW5kZXggJTAybHgsIGlvc3RlICUwMTZseFxuIiwKLQkJCQkJIGlvX2FkZHJlc3MsIGluZGV4LCBpb3N0ZS52YWwpOwotCQlzZXRfaW9wdF9jYWNoZShpb2NfbW1pb19iYXNlLAotCQkJZ2V0X2lvY19oYXNoXzF3YXkoaW9zdGUsIGlvX2FkZHJlc3MpLAotCQkJZ2V0X2lvY190YWcoaW9zdGUsIGlvX2FkZHJlc3MpLAotCQkJZ2V0X2lvcHRfZW50cnkocmVhbF9hZGRyZXNzLCBpb2lkLCBJT1BUX1BST1RfUlcpKTsKKwkJb3V0X2JlNjQocmVnLCB2YWwpOworCQl3aGlsZSAoaW5fYmU2NChyZWcpICYgSU9DX0lPUFRfQ2FjaGVJbnZkX0J1c3kpCisJCQk7CisKKwkJbl9wdGVzIC09IG47CisJCXB0ZSArPSBuOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfZGV2bm9kZV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKmQpCitzdGF0aWMgdm9pZCB0Y2VfYnVpbGRfY2VsbChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgbG9uZyBucGFnZXMsCisJCXVuc2lnbmVkIGxvbmcgdWFkZHIsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nICppb19wdGUsIGJhc2VfcHRlOworCXN0cnVjdCBpb21tdV93aW5kb3cgKndpbmRvdyA9CisJCWNvbnRhaW5lcl9vZih0YmwsIHN0cnVjdCBpb21tdV93aW5kb3csIHRhYmxlKTsKKworCS8qIGltcGxlbWVudGluZyBwcm9wZXIgcHJvdGVjdGlvbiBjYXVzZXMgcHJvYmxlbXMgd2l0aCB0aGUgc3BpZGVybmV0CisJICogZHJpdmVyIC0gY2hlY2sgbWFwcGluZyBkaXJlY3Rpb25zIGxhdGVyLCBidXQgYWxsb3cgcmVhZCAmIHdyaXRlIGJ5CisJICogZGVmYXVsdCBmb3Igbm93LiovCisjaWZkZWYgQ0VMTF9JT01NVV9TVFJJQ1RfUFJPVEVDVElPTgorCS8qIHRvIGF2b2lkIHJlZmVyZW5jaW5nIGEgZ2xvYmFsLCB3ZSB1c2UgYSB0cmljayBoZXJlIHRvIHNldHVwIHRoZQorCSAqIHByb3RlY3Rpb24gYml0LiAicHJvdCIgaXMgc2V0dXAgdG8gYmUgMyBmaWVsZHMgb2YgNCBiaXRzIGFwcHJlbmRlZAorCSAqIHRvZ2V0aGVyIGZvciBlYWNoIG9mIHRoZSAzIHN1cHBvcnRlZCBkaXJlY3Rpb24gdmFsdWVzLiBJdCBpcyB0aGVuCisJICogc2hpZnRlZCBsZWZ0IHNvIHRoYXQgdGhlIGZpZWxkcyBtYXRjaGluZyB0aGUgZGVzaXJlZCBkaXJlY3Rpb24KKwkgKiBsYW5kcyBvbiB0aGUgYXBwcm9wcmlhdGUgYml0cywgYW5kIG90aGVyIGJpdHMgYXJlIG1hc2tlZCBvdXQuCisJICovCisJY29uc3QgdW5zaWduZWQgbG9uZyBwcm90ID0gMHhjNDg7CisJYmFzZV9wdGUgPQorCQkoKHByb3QgPDwgKDUyICsgNCAqIGRpcmVjdGlvbikpICYgKElPUFRFX1BQX1cgfCBJT1BURV9QUF9SKSkKKwkJfCBJT1BURV9NIHwgSU9QVEVfU09fUlcgfCAod2luZG93LT5pb2lkICYgSU9QVEVfSU9JRF9NYXNrKTsKKyNlbHNlCisJYmFzZV9wdGUgPSBJT1BURV9QUF9XIHwgSU9QVEVfUFBfUiB8IElPUFRFX00gfCBJT1BURV9TT19SVyB8CisJCSh3aW5kb3ctPmlvaWQgJiBJT1BURV9JT0lEX01hc2spOworI2VuZGlmCisKKwlpb19wdGUgPSAodW5zaWduZWQgbG9uZyAqKXRibC0+aXRfYmFzZSArIChpbmRleCAtIHdpbmRvdy0+cHRlX29mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIHVhZGRyICs9IElPTU1VX1BBR0VfU0laRSkKKwkJaW9fcHRlW2ldID0gYmFzZV9wdGUgfCAoX19wYSh1YWRkcikgJiBJT1BURV9SUE5fTWFzayk7CisKKwltYigpOworCisJaW52YWxpZGF0ZV90Y2VfY2FjaGUod2luZG93LT5pb21tdSwgaW9fcHRlLCBucGFnZXMpOworCisJcHJfZGVidWcoInRjZV9idWlsZF9jZWxsKGluZGV4PSVseCxuPSVseCxkaXI9JWQsYmFzZV9wdGU9JWx4KVxuIiwKKwkJIGluZGV4LCBucGFnZXMsIGRpcmVjdGlvbiwgYmFzZV9wdGUpOworfQorCitzdGF0aWMgdm9pZCB0Y2VfZnJlZV9jZWxsKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcykKK3sKKworCWludCBpOworCXVuc2lnbmVkIGxvbmcgKmlvX3B0ZSwgcHRlOworCXN0cnVjdCBpb21tdV93aW5kb3cgKndpbmRvdyA9CisJCWNvbnRhaW5lcl9vZih0YmwsIHN0cnVjdCBpb21tdV93aW5kb3csIHRhYmxlKTsKKworCXByX2RlYnVnKCJ0Y2VfZnJlZV9jZWxsKGluZGV4PSVseCxuPSVseClcbiIsIGluZGV4LCBucGFnZXMpOworCisjaWZkZWYgQ0VMTF9JT01NVV9SRUFMX1VOTUFQCisJcHRlID0gMDsKKyNlbHNlCisJLyogc3BpZGVyIGJyaWRnZSBkb2VzIFBDSSByZWFkcyBhZnRlciBmcmVlaW5nIC0gaW5zZXJ0IGEgbWFwcGluZworCSAqIHRvIGEgc2NyYXRjaCBwYWdlIGluc3RlYWQgb2YgYW4gaW52YWxpZCBlbnRyeSAqLworCXB0ZSA9IElPUFRFX1BQX1IgfCBJT1BURV9NIHwgSU9QVEVfU09fUlcgfCBfX3BhKHdpbmRvdy0+aW9tbXUtPnBhZF9wYWdlKQorCQl8ICh3aW5kb3ctPmlvaWQgJiBJT1BURV9JT0lEX01hc2spOworI2VuZGlmCisKKwlpb19wdGUgPSAodW5zaWduZWQgbG9uZyAqKXRibC0+aXRfYmFzZSArIChpbmRleCAtIHdpbmRvdy0+cHRlX29mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspCisJCWlvX3B0ZVtpXSA9IHB0ZTsKKworCW1iKCk7CisKKwlpbnZhbGlkYXRlX3RjZV9jYWNoZSh3aW5kb3ctPmlvbW11LCBpb19wdGUsIG5wYWdlcyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpb2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBzdGF0OworCXN0cnVjdCBjYmVfaW9tbXUgKmlvbW11ID0gZGF0YTsKKworCXN0YXQgPSBpbl9iZTY0KGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPX0V4Y3BTdGF0KTsKKworCS8qIE1pZ2h0IHdhbnQgdG8gcmF0ZSBsaW1pdCBpdCAqLworCXByaW50ayhLRVJOX0VSUiAiaW9tbXU6IERNQSBleGNlcHRpb24gMHglMDE2bHhcbiIsIHN0YXQpOworCXByaW50ayhLRVJOX0VSUiAiICBWPSVkLCBTUEY9WyVjJWNdLCBSVz0lcywgSU9JRD0weCUwNHhcbiIsCisJICAgICAgICEhKHN0YXQgJiBJT0NfSU9fRXhjcFN0YXRfViksCisJICAgICAgIChzdGF0ICYgSU9DX0lPX0V4Y3BTdGF0X1NQRl9TKSA/ICdTJyA6ICcgJywKKwkgICAgICAgKHN0YXQgJiBJT0NfSU9fRXhjcFN0YXRfU1BGX1ApID8gJ1AnIDogJyAnLAorCSAgICAgICAoc3RhdCAmIElPQ19JT19FeGNwU3RhdF9SV19NYXNrKSA/ICJSZWFkIiA6ICJXcml0ZSIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpKHN0YXQgJiBJT0NfSU9fRXhjcFN0YXRfSU9JRF9NYXNrKSk7CisJcHJpbnRrKEtFUk5fRVJSICIgIHBhZ2U9MHglMDE2bHhcbiIsCisJICAgICAgIHN0YXQgJiBJT0NfSU9fRXhjcFN0YXRfQUREUl9NYXNrKTsKKworCS8qIGNsZWFyIGludGVycnVwdCAqLworCXN0YXQgJj0gfklPQ19JT19FeGNwU3RhdF9WOworCW91dF9iZTY0KGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPX0V4Y3BTdGF0LCBzdGF0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBjZWxsX2lvbW11X2ZpbmRfaW9jKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgKmJhc2UpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKKworCSpiYXNlID0gMDsKKworCS8qIEZpcnN0IGxvb2sgZm9yIG5ldyBzdHlsZSAvYmUgbm9kZXMgKi8KKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUobnAsICJpb2MiKSB7CisJCWlmIChvZl9ub2RlX3RvX25pZChucCkgIT0gbmlkKQorCQkJY29udGludWU7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaW9tbXU6IGNhbid0IGdldCBhZGRyZXNzIGZvciAlc1xuIiwKKwkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpiYXNlID0gci5zdGFydDsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPaywgbGV0J3MgdHJ5IHRoZSBvbGQgd2F5ICovCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiY3B1IikgeworCQljb25zdCB1bnNpZ25lZCBpbnQgKm5pZHA7CisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRtcDsKKworCQluaWRwID0gZ2V0X3Byb3BlcnR5KG5wLCAibm9kZS1pZCIsIE5VTEwpOworCQlpZiAobmlkcCAmJiAqbmlkcCA9PSBuaWQpIHsKKwkJCXRtcCA9IGdldF9wcm9wZXJ0eShucCwgImlvYy10cmFuc2xhdGlvbiIsIE5VTEwpOworCQkJaWYgKHRtcCkgeworCQkJCSpiYXNlID0gKnRtcDsKKwkJCQlvZl9ub2RlX3B1dChucCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgY2VsbF9pb21tdV9zZXR1cF9oYXJkd2FyZShzdHJ1Y3QgY2JlX2lvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCByZXQsIGk7CisJdW5zaWduZWQgbG9uZyByZWcsIHNlZ21lbnRzLCBwYWdlc19wZXJfc2VnbWVudCwgcHRhYl9zaXplLCBuX3B0ZV9wYWdlczsKKwl1bnNpZ25lZCBsb25nIHhsYXRlX2Jhc2U7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlpZiAoY2VsbF9pb21tdV9maW5kX2lvYyhpb21tdS0+bmlkLCAmeGxhdGVfYmFzZSkpCisJCXBhbmljKCIlczogbWlzc2luZyBJT0MgcmVnaXN0ZXIgbWFwcGluZ3MgZm9yIG5vZGUgJWRcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgaW9tbXUtPm5pZCk7CisKKwlpb21tdS0+eGxhdGVfcmVncyA9IGlvcmVtYXAoeGxhdGVfYmFzZSwgSU9DX1JlZ19TaXplKTsKKwlpb21tdS0+Y21kX3JlZ3MgPSBpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT0NtZF9PZmZzZXQ7CisKKwlzZWdtZW50cyA9IHNpemUgPj4gSU9fU0VHTUVOVF9TSElGVDsKKwlwYWdlc19wZXJfc2VnbWVudCA9IDF1bGwgPDwgSU9fUEFHRU5PX0JJVFM7CisKKwlwcl9kZWJ1ZygiJXM6IGlvbW11WyVkXTogc2VnbWVudHM6ICVsdSwgcGFnZXMgcGVyIHNlZ21lbnQ6ICVsdVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgaW9tbXUtPm5pZCwgc2VnbWVudHMsIHBhZ2VzX3Blcl9zZWdtZW50KTsKKworCS8qIHNldCB1cCB0aGUgc2VnbWVudCB0YWJsZSAqLworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKGlvbW11LT5uaWQsIEdGUF9LRVJORUwsIDApOworCUJVR19PTighcGFnZSk7CisJaW9tbXUtPnN0YWIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJY2xlYXJfcGFnZShpb21tdS0+c3RhYik7CisKKwkvKiAuLi4gYW5kIHRoZSBwYWdlIHRhYmxlcy4gU2luY2UgdGhlc2UgYXJlIGNvbnRpZ3VvdXMsIHdlIGNhbiB0cmVhdAorCSAqIHRoZSBwYWdlIHRhYmxlcyBhcyBvbmUgYXJyYXkgb2YgcHRlcywgbGlrZSBwU2VyaWVzIGRvZXMuCisJICovCisJcHRhYl9zaXplID0gc2VnbWVudHMgKiBwYWdlc19wZXJfc2VnbWVudCAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlwcl9kZWJ1ZygiJXM6IGlvbW11WyVkXTogcHRhYl9zaXplOiAlbHUsIG9yZGVyOiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJaW9tbXUtPm5pZCwgcHRhYl9zaXplLCBnZXRfb3JkZXIocHRhYl9zaXplKSk7CisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUoaW9tbXUtPm5pZCwgR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHB0YWJfc2l6ZSkpOworCUJVR19PTighcGFnZSk7CisKKwlpb21tdS0+cHRhYiA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwltZW1zZXQoaW9tbXUtPnB0YWIsIDAsIHB0YWJfc2l6ZSk7CisKKwkvKiBhbGxvY2F0ZSBhIGJvZ3VzIHBhZ2UgZm9yIHRoZSBlbmQgb2YgZWFjaCBtYXBwaW5nICovCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUoaW9tbXUtPm5pZCwgR0ZQX0tFUk5FTCwgMCk7CisJQlVHX09OKCFwYWdlKTsKKwlpb21tdS0+cGFkX3BhZ2UgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJY2xlYXJfcGFnZShpb21tdS0+cGFkX3BhZ2UpOworCisJLyogbnVtYmVyIG9mIHBhZ2VzIG5lZWRlZCBmb3IgYSBwYWdlIHRhYmxlICovCisJbl9wdGVfcGFnZXMgPSAocGFnZXNfcGVyX3NlZ21lbnQgKgorCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSA+PiBJT01NVV9QQUdFX1NISUZUOworCisJcHJfZGVidWcoIiVzOiBpb21tdVslZF06IHN0YWIgYXQgJXAsIHB0YWIgYXQgJXAsIG5fcHRlX3BhZ2VzOiAlbHVcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGlvbW11LT5uaWQsIGlvbW11LT5zdGFiLCBpb21tdS0+cHRhYiwKKwkJCW5fcHRlX3BhZ2VzKTsKKworCS8qIGluaXRpYWxpc2UgdGhlIFNURXMgKi8KKwlyZWcgPSBJT1NURV9WIHwgKChuX3B0ZV9wYWdlcyAtIDEpIDw8IDUpOworCisJaWYgKElPTU1VX1BBR0VfU0laRSA9PSAweDEwMDApCisJCXJlZyB8PSBJT1NURV9QU180SzsKKwllbHNlIGlmIChJT01NVV9QQUdFX1NJWkUgPT0gMHgxMDAwMCkKKwkJcmVnIHw9IElPU1RFX1BTXzY0SzsKKwllbHNlIHsKKwkJZXh0ZXJuIHZvaWQgX191bmtub3duX3BhZ2Vfc2l6ZV9lcnJvcih2b2lkKTsKKwkJX191bmtub3duX3BhZ2Vfc2l6ZV9lcnJvcigpOworCX0KKworCXByX2RlYnVnKCJTZXR0aW5nIHVwIElPTU1VIHN0YWI6XG4iKTsKKwlmb3IgKGkgPSAwOyBpICogKDF1bCA8PCBJT19TRUdNRU5UX1NISUZUKSA8IHNpemU7IGkrKykgeworCQlpb21tdS0+c3RhYltpXSA9IHJlZyB8CisJCQkoX19wYShpb21tdS0+cHRhYikgKyBuX3B0ZV9wYWdlcyAqIElPTU1VX1BBR0VfU0laRSAqIGkpOworCQlwcl9kZWJ1ZygiXHRbJWRdIDB4JTAxNmx4XG4iLCBpLCBpb21tdS0+c3RhYltpXSk7CisJfQorCisJLyogZW5zdXJlIHRoYXQgdGhlIFNURXMgaGF2ZSB1cGRhdGVkICovCisJbWIoKTsKKworCS8qIHNldHVwIGludGVycnVwdHMgZm9yIHRoZSBpb21tdS4gKi8KKwlyZWcgPSBpbl9iZTY0KGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPX0V4Y3BTdGF0KTsKKwlvdXRfYmU2NChpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT19FeGNwU3RhdCwKKwkJCXJlZyAmIH5JT0NfSU9fRXhjcFN0YXRfVik7CisJb3V0X2JlNjQoaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9fRXhjcE1hc2ssCisJCQlJT0NfSU9fRXhjcE1hc2tfUEZFIHwgSU9DX0lPX0V4Y3BNYXNrX1NGRSk7CisKKwl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsCisJCQlJSUNfSVJRX0lPRVhfQVRJIHwgKGlvbW11LT5uaWQgPDwgSUlDX0lSUV9OT0RFX1NISUZUKSk7CisJQlVHX09OKHZpcnEgPT0gTk9fSVJRKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKHZpcnEsIGlvY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQlpb21tdS0+bmFtZSwgaW9tbXUpOworCUJVR19PTihyZXQpOworCisJLyogc2V0IHRoZSBJT0Mgc2VnbWVudCB0YWJsZSBvcmlnaW4gcmVnaXN0ZXIgKGFuZCB0dXJuIG9uIHRoZSBpb21tdSkgKi8KKwlyZWcgPSBJT0NfSU9TVF9PcmlnaW5fRSB8IF9fcGEoaW9tbXUtPnN0YWIpIHwgSU9DX0lPU1RfT3JpZ2luX0hXOworCW91dF9iZTY0KGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPU1RfT3JpZ2luLCByZWcpOworCWluX2JlNjQoaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9TVF9PcmlnaW4pOworCisJLyogdHVybiBvbiBJTyB0cmFuc2xhdGlvbiAqLworCXJlZyA9IGluX2JlNjQoaW9tbXUtPmNtZF9yZWdzICsgSU9DX0lPQ21kX0NmZykgfCBJT0NfSU9DbWRfQ2ZnX1RFOworCW91dF9iZTY0KGlvbW11LT5jbWRfcmVncyArIElPQ19JT0NtZF9DZmcsIHJlZyk7Cit9CisKKyNpZiAwLyogVW51c2VkIGZvciBub3cgKi8KK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfd2luZG93ICpmaW5kX3dpbmRvdyhzdHJ1Y3QgY2JlX2lvbW11ICppb21tdSwKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgaW9tbXVfd2luZG93ICp3aW5kb3c7CisKKwkvKiB0b2RvOiBjaGVjayBmb3Igb3ZlcmxhcHBpbmcgKGJ1dCBub3QgZXF1YWwpIHdpbmRvd3MpICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdpbmRvdywgJihpb21tdS0+d2luZG93cyksIGxpc3QpIHsKKwkJaWYgKHdpbmRvdy0+b2Zmc2V0ID09IG9mZnNldCAmJiB3aW5kb3ctPnNpemUgPT0gc2l6ZSkKKwkJCXJldHVybiB3aW5kb3c7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpb21tdV93aW5kb3cgKiBfX2luaXQKK2NlbGxfaW9tbXVfc2V0dXBfd2luZG93KHN0cnVjdCBjYmVfaW9tbXUgKmlvbW11LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCXVuc2lnbmVkIGxvbmcgcHRlX29mZnNldCkKK3sKKwlzdHJ1Y3QgaW9tbXVfd2luZG93ICp3aW5kb3c7CiAJY29uc3QgdW5zaWduZWQgaW50ICppb2lkOwotCXVuc2lnbmVkIGxvbmcgbWFwX3N0YXJ0LCBtYXBfc2l6ZSwgdG9rZW47Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqZG1hX3dpbmRvdzsKLQlzdHJ1Y3QgY2VsbF9pb21tdSAqaW9tbXU7CiAKLQlpb2lkID0gZ2V0X3Byb3BlcnR5KGQsICJpb2lkIiwgTlVMTCk7Ci0JaWYgKCFpb2lkKQotCQlwcl9kZWJ1ZygiTm8gaW9pZCBlbnRyeSBmb3VuZCAhXG4iKTsKKwlpb2lkID0gZ2V0X3Byb3BlcnR5KG5wLCAiaW9pZCIsIE5VTEwpOworCWlmIChpb2lkID09IE5VTEwpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvbW11OiBtaXNzaW5nIGlvaWQgZm9yICVzIHVzaW5nIDBcbiIsCisJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKIAotCWRtYV93aW5kb3cgPSBnZXRfcHJvcGVydHkoZCwgImlibSxkbWEtd2luZG93IiwgTlVMTCk7Ci0JaWYgKCFkbWFfd2luZG93KQotCQlwcl9kZWJ1ZygiTm8gaWJtLGRtYS13aW5kb3cgZW50cnkgZm91bmQgIVxuIik7CisJd2luZG93ID0ga21hbGxvY19ub2RlKHNpemVvZigqd2luZG93KSwgR0ZQX0tFUk5FTCwgaW9tbXUtPm5pZCk7CisJQlVHX09OKHdpbmRvdyA9PSBOVUxMKTsKIAotCW1hcF9zdGFydCA9IGRtYV93aW5kb3dbMV07Ci0JbWFwX3NpemUgPSBkbWFfd2luZG93WzJdOwotCXRva2VuID0gZG1hX3dpbmRvd1swXSA+PiAzMjsKKwl3aW5kb3ctPm9mZnNldCA9IG9mZnNldDsKKwl3aW5kb3ctPnNpemUgPSBzaXplOworCXdpbmRvdy0+aW9pZCA9IGlvaWQgPyAqaW9pZCA6IDA7CisJd2luZG93LT5pb21tdSA9IGlvbW11OworCXdpbmRvdy0+cHRlX29mZnNldCA9IHB0ZV9vZmZzZXQ7CiAKLQlpb21tdSA9ICZjZWxsX2lvbW11c1t0b2tlbl07CisJd2luZG93LT50YWJsZS5pdF9ibG9ja3NpemUgPSAxNjsKKwl3aW5kb3ctPnRhYmxlLml0X2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb21tdS0+cHRhYjsKKwl3aW5kb3ctPnRhYmxlLml0X2luZGV4ID0gaW9tbXUtPm5pZDsKKwl3aW5kb3ctPnRhYmxlLml0X29mZnNldCA9IChvZmZzZXQgPj4gSU9NTVVfUEFHRV9TSElGVCkgKworCQl3aW5kb3ctPnB0ZV9vZmZzZXQ7CisJd2luZG93LT50YWJsZS5pdF9zaXplID0gc2l6ZSA+PiBJT01NVV9QQUdFX1NISUZUOwogCi0JY2VsbF9kb19tYXBfaW9tbXUoaW9tbXUsICppb2lkLCBtYXBfc3RhcnQsIG1hcF9zaXplKTsKKwlpb21tdV9pbml0X3RhYmxlKCZ3aW5kb3ctPnRhYmxlLCBpb21tdS0+bmlkKTsKKworCXByX2RlYnVnKCJcdGlvaWQgICAgICAlZFxuIiwgd2luZG93LT5pb2lkKTsKKwlwcl9kZWJ1ZygiXHRibG9ja3NpemUgJWxkXG4iLCB3aW5kb3ctPnRhYmxlLml0X2Jsb2Nrc2l6ZSk7CisJcHJfZGVidWcoIlx0YmFzZSAgICAgIDB4JTAxNmx4XG4iLCB3aW5kb3ctPnRhYmxlLml0X2Jhc2UpOworCXByX2RlYnVnKCJcdG9mZnNldCAgICAweCVseFxuIiwgd2luZG93LT50YWJsZS5pdF9vZmZzZXQpOworCXByX2RlYnVnKCJcdHNpemUgICAgICAlbGRcbiIsIHdpbmRvdy0+dGFibGUuaXRfc2l6ZSk7CisKKwlsaXN0X2FkZCgmd2luZG93LT5saXN0LCAmaW9tbXUtPndpbmRvd3MpOworCisJaWYgKG9mZnNldCAhPSAwKQorCQlyZXR1cm4gd2luZG93OworCisJLyogV2UgbmVlZCB0byBtYXAgYW5kIHJlc2VydmUgdGhlIGZpcnN0IElPTU1VIHBhZ2Ugc2luY2UgaXQncyB1c2VkCisJICogYnkgdGhlIHNwaWRlciB3b3JrYXJvdW5kLiBJbiB0aGVvcnksIHdlIG9ubHkgbmVlZCB0byBkbyB0aGF0IHdoZW4KKwkgKiBydW5uaW5nIG9uIHNwaWRlciBidXQgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyLgorCSAqCisJICogVGhpcyBjb2RlIGFsc28gYXNzdW1lcyB0aGF0IHdlIGhhdmUgYSB3aW5kb3cgdGhhdCBzdGFydHMgYXQgMCwKKwkgKiB3aGljaCBpcyB0aGUgY2FzZSBvbiBhbGwgc3BpZGVyIGJhc2VkIGJsYWRlcy4KKwkgKi8KKwlfX3NldF9iaXQoMCwgd2luZG93LT50YWJsZS5pdF9tYXApOworCXRjZV9idWlsZF9jZWxsKCZ3aW5kb3ctPnRhYmxlLCB3aW5kb3ctPnRhYmxlLml0X29mZnNldCwgMSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWlvbW11LT5wYWRfcGFnZSwgRE1BX1RPX0RFVklDRSk7CisJd2luZG93LT50YWJsZS5pdF9oaW50ID0gd2luZG93LT50YWJsZS5pdF9ibG9ja3NpemU7CisKKwlyZXR1cm4gd2luZG93OwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmIpCitzdGF0aWMgc3RydWN0IGNiZV9pb21tdSAqY2VsbF9pb21tdV9mb3Jfbm9kZShpbnQgbmlkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZCA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKiliLT5zeXNkYXRhOwotCWlvbW11X2Rldm5vZGVfc2V0dXAoZCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2JlX25yX2lvbW11czsgaSsrKQorCQlpZiAoaW9tbXVzW2ldLm5pZCA9PSBuaWQpCisJCQlyZXR1cm4gJmlvbW11c1tpXTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotCi1zdGF0aWMgaW50IGNlbGxfbWFwX2lvbW11X2hhcmRjb2RlZChpbnQgbnVtX25vZGVzKQorc3RhdGljIHZvaWQgY2VsbF9kbWFfZGV2X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgY2VsbF9pb21tdSAqaW9tbXUgPSBOVUxMOworCXN0cnVjdCBpb21tdV93aW5kb3cgKndpbmRvdzsKKwlzdHJ1Y3QgY2JlX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgZGV2X2FyY2hkYXRhICphcmNoZGF0YSA9ICZkZXYtPmFyY2hkYXRhOwogCi0JcHJfZGVidWcoIiVzKCVkKTogVXNpbmcgaGFyZGNvZGVkIGRlZmF1bHRzXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwkvKiBJZiB3ZSBydW4gd2l0aG91dCBpb21tdSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLworCWlmIChwY2lfZG1hX29wcyA9PSAmZG1hX2RpcmVjdF9vcHMpCisJCXJldHVybjsKIAotCS8qIG5vZGUgMCAqLwotCWlvbW11ID0gJmNlbGxfaW9tbXVzWzBdOwotCWlvbW11LT5tYXBwZWRfYmFzZSA9IGlvcmVtYXAoMHgyMDAwMDUxMTAwMHVsLCAweDEwMDApOwotCWlvbW11LT5tYXBwZWRfbW1pb19iYXNlID0gaW9yZW1hcCgweDIwMDAwNTEwMDAwdWwsIDB4MTAwMCk7CisJLyogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBmaXJzdCB3aW5kb3cgYXZhaWxhYmxlIGluIHRoYXQKKwkgKiBub2RlJ3MgaW9tbXUuIFdlIC1taWdodC0gZG8gc29tZXRoaW5nIHNtYXJ0ZXIgbGF0ZXIgdGhvdWdoIGl0IG1heQorCSAqIG5ldmVyIGJlIG5lY2Vzc2FyeQorCSAqLworCWlvbW11ID0gY2VsbF9pb21tdV9mb3Jfbm9kZShhcmNoZGF0YS0+bnVtYV9ub2RlKTsKKwlpZiAoaW9tbXUgPT0gTlVMTCB8fCBsaXN0X2VtcHR5KCZpb21tdS0+d2luZG93cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpb21tdTogbWlzc2luZyBpb21tdSBmb3IgJXMgKG5vZGUgJWQpXG4iLAorCQkgICAgICAgYXJjaGRhdGEtPm9mX25vZGUgPyBhcmNoZGF0YS0+b2Zfbm9kZS0+ZnVsbF9uYW1lIDogIj8iLAorCQkgICAgICAgYXJjaGRhdGEtPm51bWFfbm9kZSk7CisJCXJldHVybjsKKwl9CisJd2luZG93ID0gbGlzdF9lbnRyeShpb21tdS0+d2luZG93cy5uZXh0LCBzdHJ1Y3QgaW9tbXVfd2luZG93LCBsaXN0KTsKIAotCWVuYWJsZV9tYXBwaW5nKGlvbW11LT5tYXBwZWRfYmFzZSwgaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2UpOworCWFyY2hkYXRhLT5kbWFfZGF0YSA9ICZ3aW5kb3ctPnRhYmxlOworfQogCi0JY2VsbF9kb19tYXBfaW9tbXUoaW9tbXUsIDB4MDQ4YSwKLQkJCSAgMHgyMDAwMDAwMHVsLDB4MjAwMDAwMDB1bCk7CitzdGF0aWMgdm9pZCBjZWxsX3BjaV9kbWFfZGV2X3NldHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY2VsbF9kbWFfZGV2X3NldHVwKCZkZXYtPmRldik7Cit9CiAKLQlpZiAobnVtX25vZGVzIDwgMikKK3N0YXRpYyBpbnQgY2VsbF9vZl9idXNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCisJLyogV2UgYXJlIG9ubHkgaW50ZXJldGVkIGluIGRldmljZSBhZGRpdGlvbiAqLworCWlmIChhY3Rpb24gIT0gQlVTX05PVElGWV9BRERfREVWSUNFKQogCQlyZXR1cm4gMDsKIAotCS8qIG5vZGUgMSAqLwotCWlvbW11ID0gJmNlbGxfaW9tbXVzWzFdOwotCWlvbW11LT5tYXBwZWRfYmFzZSA9IGlvcmVtYXAoMHgzMDAwMDUxMTAwMHVsLCAweDEwMDApOwotCWlvbW11LT5tYXBwZWRfbW1pb19iYXNlID0gaW9yZW1hcCgweDMwMDAwNTEwMDAwdWwsIDB4MTAwMCk7CisJLyogV2UgdXNlIHRoZSBQQ0kgRE1BIG9wcyAqLworCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IHBjaV9kbWFfb3BzOwogCi0JZW5hYmxlX21hcHBpbmcoaW9tbXUtPm1hcHBlZF9iYXNlLCBpb21tdS0+bWFwcGVkX21taW9fYmFzZSk7Ci0KLQljZWxsX2RvX21hcF9pb21tdShpb21tdSwgMHgwNDhhLAotCQkJICAweDIwMDAwMDAwLDB4MjAwMDAwMDB1bCk7CisJY2VsbF9kbWFfZGV2X3NldHVwKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGNlbGxfbWFwX2lvbW11KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9ub2RlcyA9IDA7Ci0JY29uc3QgdW5zaWduZWQgaW50ICpub2RlX2lkOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJhc2UsICptbWlvX2Jhc2U7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQlzdHJ1Y3QgY2VsbF9pb21tdSAqaW9tbXUgPSBOVUxMOwotCi0JLyogZGV0ZXJtaW5lIG51bWJlciBvZiBub2RlcyAoPWlvbW11cykgKi8KLQlwcl9kZWJ1ZygiJXMoJWQpOiBkZXRlcm1pbmluZyBudW1iZXIgb2Ygbm9kZXMuLi4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQlmb3IoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7Ci0JICAgIGRuOwotCSAgICBkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCAiY3B1IikpIHsKLQkJbm9kZV9pZCA9IGdldF9wcm9wZXJ0eShkbiwgIm5vZGUtaWQiLCBOVUxMKTsKLQotCQlpZiAobnVtX25vZGVzIDwgKm5vZGVfaWQpCi0JCQludW1fbm9kZXMgPSAqbm9kZV9pZDsKLQkJfQotCi0JbnVtX25vZGVzKys7Ci0JcHJfZGVidWcoIiVpIGZvdW5kLlxuIiwgbnVtX25vZGVzKTsKLQotCS8qIG1hcCB0aGUgaW9tbXUgcmVnaXN0ZXJzIGZvciBlYWNoIG5vZGUgKi8KLQlwcl9kZWJ1ZygiJXMoJWQpOiBMb29waW5nIHRocm91Z2ggbm9kZXNcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCWZvcihkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKLQkgICAgZG47Ci0JICAgIGRuID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoZG4sICJjcHUiKSkgewotCi0JCW5vZGVfaWQgPSBnZXRfcHJvcGVydHkoZG4sICJub2RlLWlkIiwgTlVMTCk7Ci0JCWJhc2UgPSBnZXRfcHJvcGVydHkoZG4sICJpb2MtY2FjaGUiLCBOVUxMKTsKLQkJbW1pb19iYXNlID0gZ2V0X3Byb3BlcnR5KGRuLCAiaW9jLXRyYW5zbGF0aW9uIiwgTlVMTCk7Ci0KLQkJaWYgKCFiYXNlIHx8ICFtbWlvX2Jhc2UgfHwgIW5vZGVfaWQpCi0JCQlyZXR1cm4gY2VsbF9tYXBfaW9tbXVfaGFyZGNvZGVkKG51bV9ub2Rlcyk7Ci0KLQkJaW9tbXUgPSAmY2VsbF9pb21tdXNbKm5vZGVfaWRdOwotCQlpb21tdS0+YmFzZSA9ICpiYXNlOwotCQlpb21tdS0+bW1pb19iYXNlID0gKm1taW9fYmFzZTsKLQotCQlpb21tdS0+bWFwcGVkX2Jhc2UgPSBpb3JlbWFwKCpiYXNlLCAweDEwMDApOwotCQlpb21tdS0+bWFwcGVkX21taW9fYmFzZSA9IGlvcmVtYXAoKm1taW9fYmFzZSwgMHgxMDAwKTsKLQotCQllbmFibGVfbWFwcGluZyhpb21tdS0+bWFwcGVkX2Jhc2UsCi0JCQkgICAgICAgaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2UpOwotCi0JCS8qIGV2ZXJ5dGhpbmcgZWxzZSB3aWxsIGJlIGRvbmUgaW4gaW9tbXVfYnVzX3NldHVwICovCi0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICpjZWxsX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCi17Ci0Jdm9pZCAqcmV0OwotCi0JcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIGdldF9vcmRlcihzaXplKSk7Ci0JaWYgKHJldCAhPSBOVUxMKSB7Ci0JCW1lbXNldChyZXQsIDAsIHNpemUpOwotCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYWJzKHJldCkgfCBDRUxMX0RNQV9WQUxJRDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY2VsbF9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKLXsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwotfQotCi1zdGF0aWMgZG1hX2FkZHJfdCBjZWxsX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlyZXR1cm4gdmlydF90b19hYnMocHRyKSB8IENFTExfRE1BX1ZBTElEOwotfQotCi1zdGF0aWMgdm9pZCBjZWxsX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLX0KLQotc3RhdGljIGludCBjZWxsX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewotCQlzZy0+ZG1hX2FkZHJlc3MgPSAocGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQpCi0JCQkJCXwgQ0VMTF9ETUFfVkFMSUQ7Ci0JCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKLQl9Ci0KLQlyZXR1cm4gbmVudHM7Ci19Ci0KLXN0YXRpYyB2b2lkIGNlbGxfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotfQotCi1zdGF0aWMgaW50IGNlbGxfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQotewotCXJldHVybiBtYXNrIDwgMHgxMDAwMDAwMDB1bGw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGNlbGxfaW9tbXVfb3BzID0gewotCS5hbGxvY19jb2hlcmVudCA9IGNlbGxfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgPSBjZWxsX2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zaW5nbGUgPSBjZWxsX21hcF9zaW5nbGUsCi0JLnVubWFwX3NpbmdsZSA9IGNlbGxfdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cgPSBjZWxsX21hcF9zZywKLQkudW5tYXBfc2cgPSBjZWxsX3VubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkID0gY2VsbF9kbWFfc3VwcG9ydGVkLAorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjZWxsX29mX2J1c19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNlbGxfb2ZfYnVzX25vdGlmeQogfTsKIAotdm9pZCBjZWxsX2luaXRfaW9tbXUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNlbGxfaW9tbXVfZ2V0X3dpbmRvdyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUpCiB7Ci0JaW50IHNldHVwX2J1cyA9IDA7CisJY29uc3Qgdm9pZCAqZG1hX3dpbmRvdzsKKwl1bnNpZ25lZCBsb25nIGluZGV4OwogCi0JaWYgKG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvbWFtYm8iKSkgewotCQlwcl9pbmZvKCJOb3QgdXNpbmcgaW9tbXUgb24gc3lzdGVtc2ltXG4iKTsKLQl9IGVsc2UgewotCi0JCWlmICghKG9mX2Nob3NlbiAmJgotCQkgICAgICBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCkpKQotCQkJc2V0dXBfYnVzID0gY2VsbF9tYXBfaW9tbXUoKTsKLQotCQlpZiAoc2V0dXBfYnVzKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IElPTU1VIG1hcHBpbmcgYWN0aXZhdGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9udWxsOwotCQkJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cDsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogSU9NTVUgbWFwcGluZyBhY3RpdmF0ZWQsICIKLQkJCQkgIm5vIGRldmljZSBhY3Rpb24gbmVjZXNzYXJ5XG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJLyogRGlyZWN0IEkvTywgSU9NTVUgb2ZmICovCi0JCQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7Ci0JCQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX251bGw7Ci0JCX0KKwkvKiBVc2UgaWJtLGRtYS13aW5kb3cgaWYgYXZhaWxhYmxlLCBlbHNlLCBoYXJkIGNvZGUgISAqLworCWRtYV93aW5kb3cgPSBnZXRfcHJvcGVydHkobnAsICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpOworCWlmIChkbWFfd2luZG93ID09IE5VTEwpIHsKKwkJKmJhc2UgPSAwOworCQkqc2l6ZSA9IDB4ODAwMDAwMDB1OworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlwY2lfZG1hX29wcyA9IGNlbGxfaW9tbXVfb3BzOworCW9mX3BhcnNlX2RtYV93aW5kb3cobnAsIGRtYV93aW5kb3csICZpbmRleCwgYmFzZSwgc2l6ZSk7CisJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjZWxsX2lvbW11X2luaXRfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBjYmVfaW9tbXUgKmlvbW11OworCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKKwlpbnQgbmlkLCBpOworCisJLyogR2V0IG5vZGUgSUQgKi8KKwluaWQgPSBvZl9ub2RlX3RvX25pZChucCk7CisJaWYgKG5pZCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpb21tdTogZmFpbGVkIHRvIGdldCBub2RlIGZvciAlc1xuIiwKKwkJICAgICAgIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCXByX2RlYnVnKCJpb21tdTogc2V0dGluZyB1cCBpb21tdSBmb3Igbm9kZSAlZCAoJXMpXG4iLAorCQkgbmlkLCBucC0+ZnVsbF9uYW1lKTsKKworCS8qIFhYWCB0b2RvOiBJZiB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSB3aW5kb3dzIG9uIHRoZSBzYW1lIElPTU1VLCB3aGljaAorCSAqIGlzbid0IHRoZSBjYXNlIHRvZGF5LCB3ZSBwcm9iYWJseSB3YW50IGhlcmUgdG8gY2hlY2sgd2V0aGVyIHRoZQorCSAqIGlvbW11IGZvciB0aGF0IG5vZGUgaXMgYWxyZWFkeSBzZXR1cC4KKwkgKiBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBpc3N1ZSB3aXRoIGdldHRpbmcgdGhlIHNpemUgcmlnaHQgc28gbGV0J3MKKwkgKiBpZ25vcmUgdGhhdCBmb3Igbm93LiBXZSBtaWdodCB3YW50IHRvIGNvbXBsZXRlbHkgZ2V0IHJpZCBvZiB0aGUKKwkgKiBtdWx0aXBsZSB3aW5kb3cgc3VwcG9ydCBzaW5jZSB0aGUgY2VsbCBpb21tdSBzdXBwb3J0cyBwZXItcGFnZSBpb2lkcworCSAqLworCisJaWYgKGNiZV9ucl9pb21tdXMgPj0gTlJfSU9NTVVTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW9tbXU6IHRvbyBtYW55IElPTU1VcyBkZXRlY3RlZCAhICglcylcbiIsCisJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluaXQgYmFzZSBmaWVsZHMgKi8KKwlpID0gY2JlX25yX2lvbW11cysrOworCWlvbW11ID0gJmlvbW11c1tpXTsKKwlpb21tdS0+c3RhYiA9IDA7CisJaW9tbXUtPm5pZCA9IG5pZDsKKwlzbnByaW50Zihpb21tdS0+bmFtZSwgc2l6ZW9mKGlvbW11LT5uYW1lKSwgImlvbW11JWQiLCBpKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9tbXUtPndpbmRvd3MpOworCisJLyogT2J0YWluIGEgd2luZG93IGZvciBpdCAqLworCWNlbGxfaW9tbXVfZ2V0X3dpbmRvdyhucCwgJmJhc2UsICZzaXplKTsKKworCXByX2RlYnVnKCJcdHRyYW5zbGF0aW5nIHdpbmRvdyAweCVseC4uLjB4JWx4XG4iLAorCQkgYmFzZSwgYmFzZSArIHNpemUgLSAxKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCisJY2VsbF9pb21tdV9zZXR1cF9oYXJkd2FyZShpb21tdSwgc2l6ZSk7CisKKwkvKiBTZXR1cCB0aGUgaW9tbXVfdGFibGUgKi8KKwljZWxsX2lvbW11X3NldHVwX3dpbmRvdyhpb21tdSwgbnAsIGJhc2UsIHNpemUsCisJCQkJb2Zmc2V0ID4+IElPTU1VX1BBR0VfU0hJRlQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY2VsbF9kaXNhYmxlX2lvbW11cyh2b2lkKQoreworCWludCBub2RlOworCXVuc2lnbmVkIGxvbmcgYmFzZSwgdmFsOworCXZvaWQgX19pb21lbSAqeHJlZ3MsICpjcmVnczsKKworCS8qIE1ha2Ugc3VyZSBJT0MgdHJhbnNsYXRpb24gaXMgZGlzYWJsZWQgb24gYWxsIG5vZGVzICovCisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgeworCQlpZiAoY2VsbF9pb21tdV9maW5kX2lvYyhub2RlLCAmYmFzZSkpCisJCQljb250aW51ZTsKKwkJeHJlZ3MgPSBpb3JlbWFwKGJhc2UsIElPQ19SZWdfU2l6ZSk7CisJCWlmICh4cmVncyA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWNyZWdzID0geHJlZ3MgKyBJT0NfSU9DbWRfT2Zmc2V0OworCisJCXByX2RlYnVnKCJpb21tdTogY2xlYW5pbmcgdXAgaW9tbXUgb24gbm9kZSAlZFxuIiwgbm9kZSk7CisKKwkJb3V0X2JlNjQoeHJlZ3MgKyBJT0NfSU9TVF9PcmlnaW4sIDApOworCQkodm9pZClpbl9iZTY0KHhyZWdzICsgSU9DX0lPU1RfT3JpZ2luKTsKKwkJdmFsID0gaW5fYmU2NChjcmVncyArIElPQ19JT0NtZF9DZmcpOworCQl2YWwgJj0gfklPQ19JT0NtZF9DZmdfVEU7CisJCW91dF9iZTY0KGNyZWdzICsgSU9DX0lPQ21kX0NmZywgdmFsKTsKKwkJKHZvaWQpaW5fYmU2NChjcmVncyArIElPQ19JT0NtZF9DZmcpOworCisJCWlvdW5tYXAoeHJlZ3MpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgY2VsbF9pb21tdV9pbml0X2Rpc2FibGVkKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gMCwgc2l6ZTsKKworCS8qIFdoZW4gbm8gaW9tbXUgaXMgcHJlc2VudCwgd2UgdXNlIGRpcmVjdCBETUEgb3BzICovCisJcGNpX2RtYV9vcHMgPSAmZG1hX2RpcmVjdF9vcHM7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgYWxsIElPQyB0cmFuc2xhdGlvbiBpcyB0dXJuZWQgb2ZmICovCisJY2VsbF9kaXNhYmxlX2lvbW11cygpOworCisJLyogSWYgd2UgaGF2ZSBubyBBeG9uLCB3ZSBzZXQgdXAgdGhlIHNwaWRlciBETUEgbWFnaWMgb2Zmc2V0ICovCisJaWYgKG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJheG9uIikgPT0gTlVMTCkKKwkJZG1hX2RpcmVjdF9vZmZzZXQgPSBTUElERVJfRE1BX09GRlNFVDsKKworCS8qIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSB3aGVyZSB0aGUgbWVtb3J5IGlzIG1hcHBlZAorCSAqIGluIFBDSSBzcGFjZS4gV2UgYXNzdW1lIHRoYXQgYWxsIGJ1c3NlcyB1c2UgdGhlIHNhbWUgZG1hCisJICogd2luZG93IHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSBzbyBmYXIgb24gQ2VsbCwgdGh1cyB3ZQorCSAqIHBpY2sgdXAgdGhlIGZpcnN0IHBjaS1pbnRlcm5hbCBub2RlIHdlIGNhbiBmaW5kIGFuZCBjaGVjaworCSAqIHRoZSBETUEgd2luZG93IGZyb20gdGhlcmUuCisJICovCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAiYXhvbiIpIHsKKwkJaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCB8fCBucC0+cGFyZW50LT5wYXJlbnQgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2VsbF9pb21tdV9nZXRfd2luZG93KG5wLCAmYmFzZSwgJnNpemUpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKG5wID09IE5VTEwpIHsKKwkJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAicGNpLWludGVybmFsIikgeworCQkJaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCB8fCBucC0+cGFyZW50LT5wYXJlbnQgIT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjZWxsX2lvbW11X2dldF93aW5kb3cobnAsICZiYXNlLCAmc2l6ZSkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlvZl9ub2RlX3B1dChucCk7CisKKwkvKiBJZiB3ZSBmb3VuZCBhIERNQSB3aW5kb3csIHdlIGNoZWNrIGlmIGl0J3MgYmlnIGVub3VnaCB0byBlbmNsb3NlCisJICogYWxsIG9mIHBoeXNpY2FsIG1lbW9yeS4gSWYgbm90LCB3ZSBmb3JjZSBlbmFibGUgSU9NTVUKKwkgKi8KKwlpZiAobnAgJiYgc2l6ZSA8IGxtYl9lbmRfb2ZfRFJBTSgpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvbW11OiBmb3JjZS1lbmFibGVkLCBkbWEgd2luZG93IgorCQkgICAgICAgIiAoJWxkTUIpIHNtYWxsZXIgdGhhbiB0b3RhbCBtZW1vcnkgKCVsZE1CKVxuIiwKKwkJICAgICAgIHNpemUgPj4gMjAsIGxtYl9lbmRfb2ZfRFJBTSgpID4+IDIwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG1hX2RpcmVjdF9vZmZzZXQgKz0gYmFzZTsKKworCXByaW50aygiaW9tbXU6IGRpc2FibGVkLCBkaXJlY3QgRE1BIG9mZnNldCBpcyAweCVseFxuIiwKKwkgICAgICAgZG1hX2RpcmVjdF9vZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNlbGxfaW9tbXVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAoIW1hY2hpbmVfaXMoY2VsbCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogSWYgSU9NTVUgaXMgZGlzYWJsZWQgb3Igd2UgaGF2ZSBsaXR0bGUgZW5vdWdoIFJBTSB0byBub3QgbmVlZAorCSAqIHRvIGVuYWJsZSBpdCwgd2Ugc2V0dXAgYSBkaXJlY3QgbWFwcGluZy4KKwkgKgorCSAqIE5vdGU6IHNob3VsZCB3ZSBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgSU9NTVUgYWN0dWFsbHkgZGlzYWJsZWQgPworCSAqLworCWlmIChpb21tdV9pc19vZmYgfHwKKwkgICAgKCFpb21tdV9mb3JjZV9vbiAmJiBsbWJfZW5kX29mX0RSQU0oKSA8PSAweDgwMDAwMDAwdWxsKSkKKwkJaWYgKGNlbGxfaW9tbXVfaW5pdF9kaXNhYmxlZCgpID09IDApCisJCQlnb3RvIGJhaWw7CisKKwkvKiBTZXR1cCB2YXJpb3VzIHBwY19tZC4gY2FsbGJhY2tzICovCisJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gY2VsbF9wY2lfZG1hX2Rldl9zZXR1cDsKKwlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX2NlbGw7CisJcHBjX21kLnRjZV9mcmVlID0gdGNlX2ZyZWVfY2VsbDsKKworCS8qIENyZWF0ZSBhbiBpb21tdSBmb3IgZWFjaCAvYXhvbiBub2RlLiAgKi8KKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUobnAsICJheG9uIikgeworCQlpZiAobnAtPnBhcmVudCA9PSBOVUxMIHx8IG5wLT5wYXJlbnQtPnBhcmVudCAhPSBOVUxMKQorCQkJY29udGludWU7CisJCWNlbGxfaW9tbXVfaW5pdF9vbmUobnAsIDApOworCX0KKworCS8qIENyZWF0ZSBhbiBpb21tdSBmb3IgZWFjaCB0b3BsZXZlbCAvcGNpLWludGVybmFsIG5vZGUgZm9yCisJICogb2xkIGhhcmR3YXJlL2Zpcm13YXJlCisJICovCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAicGNpLWludGVybmFsIikgeworCQlpZiAobnAtPnBhcmVudCA9PSBOVUxMIHx8IG5wLT5wYXJlbnQtPnBhcmVudCAhPSBOVUxMKQorCQkJY29udGludWU7CisJCWNlbGxfaW9tbXVfaW5pdF9vbmUobnAsIFNQSURFUl9ETUFfT0ZGU0VUKTsKKwl9CisKKwkvKiBTZXR1cCBkZWZhdWx0IFBDSSBpb21tdSBvcHMgKi8KKwlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOworCisgYmFpbDoKKwkvKiBSZWdpc3RlciBjYWxsYmFja3Mgb24gT0YgcGxhdGZvcm0gZGV2aWNlIGFkZGl0aW9uL3JlbW92YWwKKwkgKiB0byBoYW5kbGUgbGlua2luZyB0aGVtIHRvIHRoZSByaWdodCBETUEgb3BlcmF0aW9ucworCSAqLworCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICZjZWxsX29mX2J1c19ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoY2VsbF9pb21tdV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwZDc3YS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSNpZm5kZWYgQ0VMTF9JT01NVV9ICi0jZGVmaW5lIENFTExfSU9NTVVfSAotCi0vKiBzb21lIGNvbnN0YW50cyAqLwotZW51bSB7Ci0JLyogc2VnbWVudCB0YWJsZSBlbnRyaWVzICovCi0JSU9TVF9WQUxJRF9NQVNLCSAgPSAweDgwMDAwMDAwMDAwMDAwMDB1bCwKLQlJT1NUX1RBR19NQVNLICAgICA9IDB4MzAwMDAwMDAwMDAwMDAwMHVsLAotCUlPU1RfUFRfQkFTRV9NQVNLID0gMHgwMDAwMDNmZmZmZmZmMDAwdWwsCi0JSU9TVF9OTlBUX01BU0sJICA9IDB4MDAwMDAwMDAwMDAwMGZlMHVsLAotCUlPU1RfUFNfTUFTSwkgID0gMHgwMDAwMDAwMDAwMDAwMDBmdWwsCi0KLQlJT1NUX1BTXzRLCSAgPSAweDEsCi0JSU9TVF9QU182NEsJICA9IDB4MywKLQlJT1NUX1BTXzFNCSAgPSAweDUsCi0JSU9TVF9QU18xNk0JICA9IDB4NywKLQotCS8qIGlvcHQgdGFnIHJlZ2lzdGVyICovCi0JSU9QVF9WQUxJRF9NQVNLICAgPSAweDAwMDAwMDAyMDAwMDAwMDB1bCwKLQlJT1BUX1RBR19NQVNLCSAgPSAweDAwMDAwMDAxZmZmZmZmZmZ1bCwKLQotCS8qIGlvcHQgY2FjaGUgcmVnaXN0ZXIgKi8KLQlJT1BUX1BST1RfTUFTSwkgID0gMHhjMDAwMDAwMDAwMDAwMDAwdWwsCi0JSU9QVF9QUk9UX05PTkUJICA9IDB4MDAwMDAwMDAwMDAwMDAwMHVsLAotCUlPUFRfUFJPVF9SRUFECSAgPSAweDQwMDAwMDAwMDAwMDAwMDB1bCwKLQlJT1BUX1BST1RfV1JJVEUJICA9IDB4ODAwMDAwMDAwMDAwMDAwMHVsLAotCUlPUFRfUFJPVF9SVwkgID0gMHhjMDAwMDAwMDAwMDAwMDAwdWwsCi0JSU9QVF9DT0hFUkVOVAkgID0gMHgyMDAwMDAwMDAwMDAwMDAwdWwsCi0JCi0JSU9QVF9PUkRFUl9NQVNLCSAgPSAweDE4MDAwMDAwMDAwMDAwMDB1bCwKLQkvKiBvcmRlciBhY2Nlc3MgdG8gc2FtZSBJT0lEL1ZDIG9uIHNhbWUgYWRkcmVzcyAqLwotCUlPUFRfT1JERVJfQUREUgkgID0gMHgwODAwMDAwMDAwMDAwMDAwdWwsCi0JLyogc2ltaWxhciwgYnV0IG9ubHkgYWZ0ZXIgYSB3cml0ZSBhY2Nlc3MgKi8KLQlJT1BUX09SREVSX1dSSVRFUyA9IDB4MTAwMDAwMDAwMDAwMDAwMHVsLAotCS8qIE9yZGVyIGFsbCBhY2Nlc3NlcyB0byBzYW1lIElPSUQvVkMgKi8KLQlJT1BUX09SREVSX1ZDCSAgPSAweDE4MDAwMDAwMDAwMDAwMDB1bCwKLQkKLQlJT1BUX1JQTl9NQVNLCSAgPSAweDAwMDAwM2ZmZmZmZmYwMDB1bCwKLQlJT1BUX0hJTlRfTUFTSwkgID0gMHgwMDAwMDAwMDAwMDAwODAwdWwsCi0JSU9QVF9JT0lEX01BU0sJICA9IDB4MDAwMDAwMDAwMDAwMDdmZnVsLAotCi0JSU9TVE9fRU5BQkxFCSAgPSAweDgwMDAwMDAwMDAwMDAwMDB1bCwKLQlJT1NUT19PUklHSU4JICA9IDB4MDAwMDAzZmZmZmZmZjAwMHVsLAotCUlPU1RPX0hXCSAgPSAweDAwMDAwMDAwMDAwMDA4MDB1bCwKLQlJT1NUT19TVwkgID0gMHgwMDAwMDAwMDAwMDAwNDAwdWwsCi0KLQlJT0NNRF9DT05GX1RFCSAgPSAweDAwMDA4MDAwMDAwMDAwMDB1bCwKLQotCS8qIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCi0JSU9DX1BUX0NBQ0hFX0RJUiAgPSAweDAwMCwKLQlJT0NfU1RfQ0FDSEVfRElSICA9IDB4ODAwLAotCUlPQ19QVF9DQUNIRV9SRUcgID0gMHg5MTAsCi0JSU9DX1NUX09SSUdJTiAgICAgPSAweDkxOCwKLQlJT0NfQ09ORgkgID0gMHg5MzAsCi0KLQkvKiBUaGUgaGlnaCBiaXQgbmVlZHMgdG8gYmUgc2V0IG9uIGV2ZXJ5IERNQSBhZGRyZXNzLAotCSAgIG9ubHkgMkdCIGFyZSBhZGRyZXNzYWJsZSAqLwotCUNFTExfRE1BX1ZBTElECSAgPSAweDgwMDAwMDAwLAotCUNFTExfRE1BX01BU0sJICA9IDB4N2ZmZmZmZmYsCi19OwotCi0KLXZvaWQgY2VsbF9pbml0X2lvbW11KHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwppbmRleCA5ZjJlNGVkLi44YzIwZjBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5jCkBAIC0zOCwzMiArMzgsMjUgQEAKICNpbmNsdWRlICJwZXJ2YXNpdmUuaCIKICNpbmNsdWRlICJjYmVfcmVncy5oIgogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNiZV9wZXJ2YXNpdmVfbG9jayk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjYmVfZW5hYmxlX3BhdXNlX3plcm8odm9pZCkKK3N0YXRpYyB2b2lkIGNiZV9wb3dlcl9zYXZlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB0aHJlYWRfc3dpdGNoX2NvbnRyb2w7Ci0JdW5zaWduZWQgbG9uZyB0ZW1wX3JlZ2lzdGVyOwotCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcHJlZ3M7CisJdW5zaWduZWQgbG9uZyBjdHJsLCB0aHJlYWRfc3dpdGNoX2NvbnRyb2w7CiAKLQlzcGluX2xvY2tfaXJxKCZjYmVfcGVydmFzaXZlX2xvY2spOwotCXByZWdzID0gY2JlX2dldF9jcHVfcG1kX3JlZ3Moc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpZiAocHJlZ3MgPT0gTlVMTCkKLQkJZ290byBvdXQ7CisJLyoKKwkgKiBXZSBuZWVkIHRvIGhhcmQgZGlzYWJsZSBpbnRlcnJ1cHRzLCBidXQgd2UgYWxzbyBuZWVkIHRvIG1hcmsgdGhlbQorCSAqIGhhcmQgZGlzYWJsZWQgaW4gdGhlIFBBQ0Egc28gdGhhdCB0aGUgbG9jYWxfaXJxX2VuYWJsZSgpIGRvbmUgYnkKKwkgKiBvdXIgY2FsbGVyIHVwb24gcmV0dXJuIHByb3BlcnRseSBoYXJkIGVuYWJsZXMuCisJICovCisJaGFyZF9pcnFfZGlzYWJsZSgpOworCWdldF9wYWNhKCktPmhhcmRfZW5hYmxlZCA9IDA7CiAKLQlwcl9kZWJ1ZygiUG93ZXIgTWFuYWdlbWVudDogQ1BVICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCi0JIC8qIEVuYWJsZSBQYXVzZSgwKSBjb250cm9sIGJpdCAqLwotCXRlbXBfcmVnaXN0ZXIgPSBpbl9iZTY0KCZwcmVncy0+cG1fY29udHJvbCk7Ci0KLQlvdXRfYmU2NCgmcHJlZ3MtPnBtX2NvbnRyb2wsCi0JCSB0ZW1wX3JlZ2lzdGVyIHwgQ0JFX1BNRF9QQVVTRV9aRVJPX0NPTlRST0wpOworCWN0cmwgPSBtZnNwcihTUFJOX0NUUkxGKTsKIAogCS8qIEVuYWJsZSBERUMgYW5kIEVFIGludGVycnVwdCByZXF1ZXN0ICovCiAJdGhyZWFkX3N3aXRjaF9jb250cm9sICA9IG1mc3ByKFNQUk5fVFNDX0NFTEwpOwogCXRocmVhZF9zd2l0Y2hfY29udHJvbCB8PSBUU0NfQ0VMTF9FRV9FTkFCTEUgfCBUU0NfQ0VMTF9FRV9CT09TVDsKIAotCXN3aXRjaCAoKG1mc3ByKFNQUk5fQ1RSTEYpICYgQ1RSTF9DVCkpIHsKKwlzd2l0Y2ggKGN0cmwgJiBDVFJMX0NUKSB7CiAJY2FzZSBDVFJMX0NUMDoKIAkJdGhyZWFkX3N3aXRjaF9jb250cm9sIHw9IFRTQ19DRUxMX0RFQ19FTkFCTEVfMDsKIAkJYnJlYWs7CkBAIC03NSw1OCArNjgsMjEgQEAKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCWJyZWFrOwogCX0KLQogCW10c3ByKFNQUk5fVFNDX0NFTEwsIHRocmVhZF9zd2l0Y2hfY29udHJvbCk7CiAKLW91dDoKLQlzcGluX3VubG9ja19pcnEoJmNiZV9wZXJ2YXNpdmVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNiZV9pZGxlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBjdHJsOwotCi0JLyogV2h5IGRvIHdlIGRvIHRoYXQgb24gZXZlcnkgaWRsZSA/IENvdWxkbid0IHRoYXQgYmUgZG9uZSBvbmNlIGZvcgotCSAqIGFsbCBvciBkbyB3ZSBsb3NlIHRoZSBzdGF0ZSBzb21lIHdheSA/IEFsc28sIHRoZSBwbV9jb250cm9sCi0JICogcmVnaXN0ZXIgc2V0dGluZywgdGhhdCBjYW4ndCBiZSBzZXQgb25jZSBhdCBib290ID8gV2UgcmVhbGx5IHdhbnQKLQkgKiB0byBtb3ZlIHRoYXQgYXdheSBpbiBvcmRlciB0byBpbXBsZW1lbnQgYSBzaW1wbGUgcG93ZXJzYXZlCisJLyoKKwkgKiBnbyBpbnRvIGxvdyB0aHJlYWQgcHJpb3JpdHksIG1lZGl1bSBwcmlvcml0eSB3aWxsIGJlCisJICogcmVzdG9yZWQgZm9yIHVzIGFmdGVyIHdha2UtdXAuCiAJICovCi0JY2JlX2VuYWJsZV9wYXVzZV96ZXJvKCk7CisJSE1UX2xvdygpOwogCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJCQkvKiBnbyBpbnRvIGxvdyB0aHJlYWQgcHJpb3JpdHkgKi8KLQkJCQlITVRfbG93KCk7Ci0KLQkJCQkvKgotCQkJCSAqIGF0b21pY2FsbHkgZGlzYWJsZSB0aHJlYWQgZXhlY3V0aW9uCi0JCQkJICogYW5kIHJ1bmxhdGNoLgotCQkJCSAqIEV4dGVybmFsIGFuZCBEZWNyZW1lbnRlciBleGNlcHRpb25zCi0JCQkJICogYXJlIHN0aWxsIGhhbmRsZWQgd2hlbiB0aGUgdGhyZWFkCi0JCQkJICogaXMgZGlzYWJsZWQgYnV0IG5vdyBlbnRlciBpbgotCQkJCSAqIGNiZV9zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKCkKLQkJCQkgKi8KLQkJCQljdHJsID0gbWZzcHIoU1BSTl9DVFJMRik7Ci0JCQkJY3RybCAmPSB+KENUUkxfUlVOTEFUQ0ggfCBDVFJMX1RFKTsKLQkJCQltdHNwcihTUFJOX0NUUkxULCBjdHJsKTsKLQkJCX0KLQkJCS8qIHJlc3RvcmUgdGhyZWFkIHByaW8gKi8KLQkJCUhNVF9tZWRpdW0oKTsKLQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIHR1cm4gcnVubGF0Y2ggb24gYWdhaW4gYmVmb3JlIHNjaGVkdWxpbmcgdGhlCi0JCSAqIHByb2Nlc3Mgd2UganVzdCB3b2tlIHVwCi0JCSAqLwotCQlwcGM2NF9ydW5sYXRjaF9vbigpOwotCi0JCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKLQkJc2NoZWR1bGUoKTsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JfQorCS8qCisJICogYXRvbWljYWxseSBkaXNhYmxlIHRocmVhZCBleGVjdXRpb24gYW5kIHJ1bmxhdGNoLgorCSAqIEV4dGVybmFsIGFuZCBEZWNyZW1lbnRlciBleGNlcHRpb25zIGFyZSBzdGlsbCBoYW5kbGVkIHdoZW4gdGhlCisJICogdGhyZWFkIGlzIGRpc2FibGVkIGJ1dCBub3cgZW50ZXIgaW4gY2JlX3N5c3RlbV9yZXNldF9leGNlcHRpb24oKQorCSAqLworCWN0cmwgJj0gfihDVFJMX1JVTkxBVENIIHwgQ1RSTF9URSk7CisJbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7CiB9CiAKIHN0YXRpYyBpbnQgY2JlX3N5c3RlbV9yZXNldF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0xNTgsOSArMTE0LDIwIEBACiAKIHZvaWQgX19pbml0IGNiZV9wZXJ2YXNpdmVfaW5pdCh2b2lkKQogeworCWludCBjcHU7CiAJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QQVVTRV9aRVJPKSkKIAkJcmV0dXJuOwogCi0JcHBjX21kLmlkbGVfbG9vcCA9IGNiZV9pZGxlOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpyZWdzID0gY2JlX2dldF9jcHVfcG1kX3JlZ3MoY3B1KTsKKwkJaWYgKCFyZWdzKQorCQkJY29udGludWU7CisKKwkJIC8qIEVuYWJsZSBQYXVzZSgwKSBjb250cm9sIGJpdCAqLworCQlvdXRfYmU2NCgmcmVncy0+cG1jciwgaW5fYmU2NCgmcmVncy0+cG1jcikgfAorCQkJCQkgICAgQ0JFX1BNRF9QQVVTRV9aRVJPX0NPTlRST0wpOworCX0KKworCXBwY19tZC5wb3dlcl9zYXZlID0gY2JlX3Bvd2VyX3NhdmU7CiAJcHBjX21kLnN5c3RlbV9yZXNldF9leGNlcHRpb24gPSBjYmVfc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM2MTIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogQ2VsbCBCcm9hZGJhbmQgRW5naW5lIFBlcmZvcm1hbmNlIE1vbml0b3IKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLDIwMDYKKyAqCisgKiBBdXRob3I6CisgKiAgICBEYXZpZCBFcmIgKGRqZXJiQHVzLmlibS5jb20pCisgKiAgICBLZXZpbiBDb3JyeSAoa2V2Y29ycnlAdXMuaWJtLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWMuaD4KKyNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL3NwdS5oPgorCisjaW5jbHVkZSAiY2JlX3JlZ3MuaCIKKyNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKKworLyoKKyAqIFdoZW4gd3JpdGluZyB0byB3cml0ZS1vbmx5IG1taW8gYWRkcmVzc2VzLCBzYXZlIGEgc2hhZG93IGNvcHkuIEFsbCBvZiB0aGUKKyAqIHJlZ2lzdGVycyBhcmUgMzItYml0LCBidXQgc3RvcmVkIGluIHRoZSB1cHBlci1oYWxmIG9mIGEgNjQtYml0IGZpZWxkIGluCisgKiBwbWRfcmVncy4KKyAqLworCisjZGVmaW5lIFdSSVRFX1dPX01NSU8ocmVnLCB4KQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1MzIgX3ggPSAoeCk7CQkJCQlcCisJCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CQlcCisJCXN0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzICpzaGFkb3dfcmVnczsJXAorCQlwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKGNwdSk7CQlcCisJCXNoYWRvd19yZWdzID0gY2JlX2dldF9jcHVfcG1kX3NoYWRvd19yZWdzKGNwdSk7CVwKKwkJb3V0X2JlNjQoJihwbWRfcmVncy0+cmVnKSwgKCgodTY0KV94KSA8PCAzMikpOwlcCisJCXNoYWRvd19yZWdzLT5yZWcgPSBfeDsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVBRF9TSEFET1dfUkVHKHZhbCwgcmVnKQkJCQlcCisJZG8gewkJCQkJCQlcCisJCXN0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzICpzaGFkb3dfcmVnczsJXAorCQlzaGFkb3dfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9zaGFkb3dfcmVncyhjcHUpOwlcCisJCSh2YWwpID0gc2hhZG93X3JlZ3MtPnJlZzsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBSRUFEX01NSU9fVVBQRVIzMih2YWwsIHJlZykJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnBtZF9yZWdzOwkJXAorCQlwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKGNwdSk7CQlcCisJCSh2YWwpID0gKHUzMikoaW5fYmU2NCgmcG1kX3JlZ3MtPnJlZykgPj4gMzIpOwlcCisJfSB3aGlsZSAoMCkKKworLyoKKyAqIFBoeXNpY2FsIGNvdW50ZXIgcmVnaXN0ZXJzLgorICogRWFjaCBwaHlzaWNhbCBjb3VudGVyIGNhbiBhY3QgYXMgb25lIDMyLWJpdCBjb3VudGVyIG9yIHR3byAxNi1iaXQgY291bnRlcnMuCisgKi8KKwordTMyIGNiZV9yZWFkX3BoeXNfY3RyKHUzMiBjcHUsIHUzMiBwaHlzX2N0cikKK3sKKwl1MzIgdmFsX2luX2xhdGNoLCB2YWwgPSAwOworCisJaWYgKHBoeXNfY3RyIDwgTlJfUEhZU19DVFJTKSB7CisJCVJFQURfU0hBRE9XX1JFRyh2YWxfaW5fbGF0Y2gsIGNvdW50ZXJfdmFsdWVfaW5fbGF0Y2gpOworCisJCS8qIFJlYWQgdGhlIGxhdGNoIG9yIHRoZSBhY3R1YWwgY291bnRlciwgd2hpY2hldmVyIGlzIG5ld2VyLiAqLworCQlpZiAodmFsX2luX2xhdGNoICYgKDEgPDwgcGh5c19jdHIpKSB7CisJCQlSRUFEX1NIQURPV19SRUcodmFsLCBwbV9jdHJbcGh5c19jdHJdKTsKKwkJfSBlbHNlIHsKKwkJCVJFQURfTU1JT19VUFBFUjMyKHZhbCwgcG1fY3RyW3BoeXNfY3RyXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3JlYWRfcGh5c19jdHIpOworCit2b2lkIGNiZV93cml0ZV9waHlzX2N0cih1MzIgY3B1LCB1MzIgcGh5c19jdHIsIHUzMiB2YWwpCit7CisJc3RydWN0IGNiZV9wbWRfc2hhZG93X3JlZ3MgKnNoYWRvd19yZWdzOworCXUzMiBwbV9jdHJsOworCisJaWYgKHBoeXNfY3RyIDwgTlJfUEhZU19DVFJTKSB7CisJCS8qIFdyaXRpbmcgdG8gYSBjb3VudGVyIG9ubHkgd3JpdGVzIHRvIGEgaGFyZHdhcmUgbGF0Y2guCisJCSAqIFRoZSBuZXcgdmFsdWUgaXMgbm90IHByb3BhZ2F0ZWQgdG8gdGhlIGFjdHVhbCBjb3VudGVyCisJCSAqIHVudGlsIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGVuYWJsZWQuCisJCSAqLworCQlXUklURV9XT19NTUlPKHBtX2N0cltwaHlzX2N0cl0sIHZhbCk7CisKKwkJcG1fY3RybCA9IGNiZV9yZWFkX3BtKGNwdSwgcG1fY29udHJvbCk7CisJCWlmIChwbV9jdHJsICYgQ0JFX1BNX0VOQUJMRV9QRVJGX01PTikgeworCQkJLyogVGhlIGNvdW50ZXJzIGFyZSBhbHJlYWR5IGFjdGl2ZSwgc28gd2UgbmVlZCB0bworCQkJICogcmV3cml0ZSB0aGUgcG1fY29udHJvbCByZWdpc3RlciB0byAicmUtZW5hYmxlIgorCQkJICogdGhlIFBNVS4KKwkJCSAqLworCQkJY2JlX3dyaXRlX3BtKGNwdSwgcG1fY29udHJvbCwgcG1fY3RybCk7CisJCX0gZWxzZSB7CisJCQlzaGFkb3dfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9zaGFkb3dfcmVncyhjcHUpOworCQkJc2hhZG93X3JlZ3MtPmNvdW50ZXJfdmFsdWVfaW5fbGF0Y2ggfD0gKDEgPDwgcGh5c19jdHIpOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3dyaXRlX3BoeXNfY3RyKTsKKworLyoKKyAqICJMb2dpY2FsIiBjb3VudGVyIHJlZ2lzdGVycy4KKyAqIFRoZXNlIHdpbGwgcmVhZC93cml0ZSAxNi1iaXRzIG9yIDMyLWJpdHMgZGVwZW5kaW5nIG9uIHRoZQorICogY3VycmVudCBzaXplIG9mIHRoZSBjb3VudGVyLiBDb3VudGVycyA0IC0gNyBhcmUgYWx3YXlzIDE2LWJpdC4KKyAqLworCit1MzIgY2JlX3JlYWRfY3RyKHUzMiBjcHUsIHUzMiBjdHIpCit7CisJdTMyIHZhbDsKKwl1MzIgcGh5c19jdHIgPSBjdHIgJiAoTlJfUEhZU19DVFJTIC0gMSk7CisKKwl2YWwgPSBjYmVfcmVhZF9waHlzX2N0cihjcHUsIHBoeXNfY3RyKTsKKworCWlmIChjYmVfZ2V0X2N0cl9zaXplKGNwdSwgcGh5c19jdHIpID09IDE2KQorCQl2YWwgPSAoY3RyIDwgTlJfUEhZU19DVFJTKSA/ICh2YWwgPj4gMTYpIDogKHZhbCAmIDB4ZmZmZik7CisKKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3JlYWRfY3RyKTsKKwordm9pZCBjYmVfd3JpdGVfY3RyKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiB2YWwpCit7CisJdTMyIHBoeXNfY3RyOworCXUzMiBwaHlzX3ZhbDsKKworCXBoeXNfY3RyID0gY3RyICYgKE5SX1BIWVNfQ1RSUyAtIDEpOworCisJaWYgKGNiZV9nZXRfY3RyX3NpemUoY3B1LCBwaHlzX2N0cikgPT0gMTYpIHsKKwkJcGh5c192YWwgPSBjYmVfcmVhZF9waHlzX2N0cihjcHUsIHBoeXNfY3RyKTsKKworCQlpZiAoY3RyIDwgTlJfUEhZU19DVFJTKQorCQkJdmFsID0gKHZhbCA8PCAxNikgfCAocGh5c192YWwgJiAweGZmZmYpOworCQllbHNlCisJCQl2YWwgPSAodmFsICYgMHhmZmZmKSB8IChwaHlzX3ZhbCAmIDB4ZmZmZjAwMDApOworCX0KKworCWNiZV93cml0ZV9waHlzX2N0cihjcHUsIHBoeXNfY3RyLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3dyaXRlX2N0cik7CisKKy8qCisgKiBDb3VudGVyLWNvbnRyb2wgcmVnaXN0ZXJzLgorICogRWFjaCAibG9naWNhbCIgY291bnRlciBoYXMgYSBjb3JyZXNwb25kaW5nIGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKwordTMyIGNiZV9yZWFkX3BtMDdfY29udHJvbCh1MzIgY3B1LCB1MzIgY3RyKQoreworCXUzMiBwbTA3X2NvbnRyb2wgPSAwOworCisJaWYgKGN0ciA8IE5SX0NUUlMpCisJCVJFQURfU0hBRE9XX1JFRyhwbTA3X2NvbnRyb2wsIHBtMDdfY29udHJvbFtjdHJdKTsKKworCXJldHVybiBwbTA3X2NvbnRyb2w7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfcmVhZF9wbTA3X2NvbnRyb2wpOworCit2b2lkIGNiZV93cml0ZV9wbTA3X2NvbnRyb2wodTMyIGNwdSwgdTMyIGN0ciwgdTMyIHZhbCkKK3sKKwlpZiAoY3RyIDwgTlJfQ1RSUykKKwkJV1JJVEVfV09fTU1JTyhwbTA3X2NvbnRyb2xbY3RyXSwgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV93cml0ZV9wbTA3X2NvbnRyb2wpOworCisvKgorICogT3RoZXIgUE1VIGNvbnRyb2wgcmVnaXN0ZXJzLiBNb3N0IG9mIHRoZXNlIGFyZSB3cml0ZS1vbmx5LgorICovCisKK3UzMiBjYmVfcmVhZF9wbSh1MzIgY3B1LCBlbnVtIHBtX3JlZ19uYW1lIHJlZykKK3sKKwl1MzIgdmFsID0gMDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBncm91cF9jb250cm9sOgorCQlSRUFEX1NIQURPV19SRUcodmFsLCBncm91cF9jb250cm9sKTsKKwkJYnJlYWs7CisKKwljYXNlIGRlYnVnX2J1c19jb250cm9sOgorCQlSRUFEX1NIQURPV19SRUcodmFsLCBkZWJ1Z19idXNfY29udHJvbCk7CisJCWJyZWFrOworCisJY2FzZSB0cmFjZV9hZGRyZXNzOgorCQlSRUFEX01NSU9fVVBQRVIzMih2YWwsIHRyYWNlX2FkZHJlc3MpOworCQlicmVhazsKKworCWNhc2UgZXh0X3RyX3RpbWVyOgorCQlSRUFEX1NIQURPV19SRUcodmFsLCBleHRfdHJfdGltZXIpOworCQlicmVhazsKKworCWNhc2UgcG1fc3RhdHVzOgorCQlSRUFEX01NSU9fVVBQRVIzMih2YWwsIHBtX3N0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBwbV9jb250cm9sOgorCQlSRUFEX1NIQURPV19SRUcodmFsLCBwbV9jb250cm9sKTsKKwkJYnJlYWs7CisKKwljYXNlIHBtX2ludGVydmFsOgorCQlSRUFEX1NIQURPV19SRUcodmFsLCBwbV9pbnRlcnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBwbV9zdGFydF9zdG9wOgorCQlSRUFEX1NIQURPV19SRUcodmFsLCBwbV9zdGFydF9zdG9wKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9yZWFkX3BtKTsKKwordm9pZCBjYmVfd3JpdGVfcG0odTMyIGNwdSwgZW51bSBwbV9yZWdfbmFtZSByZWcsIHUzMiB2YWwpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIGdyb3VwX2NvbnRyb2w6CisJCVdSSVRFX1dPX01NSU8oZ3JvdXBfY29udHJvbCwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIGRlYnVnX2J1c19jb250cm9sOgorCQlXUklURV9XT19NTUlPKGRlYnVnX2J1c19jb250cm9sLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgdHJhY2VfYWRkcmVzczoKKwkJV1JJVEVfV09fTU1JTyh0cmFjZV9hZGRyZXNzLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgZXh0X3RyX3RpbWVyOgorCQlXUklURV9XT19NTUlPKGV4dF90cl90aW1lciwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIHBtX3N0YXR1czoKKwkJV1JJVEVfV09fTU1JTyhwbV9zdGF0dXMsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBwbV9jb250cm9sOgorCQlXUklURV9XT19NTUlPKHBtX2NvbnRyb2wsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBwbV9pbnRlcnZhbDoKKwkJV1JJVEVfV09fTU1JTyhwbV9pbnRlcnZhbCwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIHBtX3N0YXJ0X3N0b3A6CisJCVdSSVRFX1dPX01NSU8ocG1fc3RhcnRfc3RvcCwgdmFsKTsKKwkJYnJlYWs7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3dyaXRlX3BtKTsKKworLyoKKyAqIEdldC9zZXQgdGhlIHNpemUgb2YgYSBwaHlzaWNhbCBjb3VudGVyIHRvIGVpdGhlciAxNiBvciAzMiBiaXRzLgorICovCisKK3UzMiBjYmVfZ2V0X2N0cl9zaXplKHUzMiBjcHUsIHUzMiBwaHlzX2N0cikKK3sKKwl1MzIgcG1fY3RybCwgc2l6ZSA9IDA7CisKKwlpZiAocGh5c19jdHIgPCBOUl9QSFlTX0NUUlMpIHsKKwkJcG1fY3RybCA9IGNiZV9yZWFkX3BtKGNwdSwgcG1fY29udHJvbCk7CisJCXNpemUgPSAocG1fY3RybCAmIENCRV9QTV8xNkJJVF9DVFIocGh5c19jdHIpKSA/IDE2IDogMzI7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZ2V0X2N0cl9zaXplKTsKKwordm9pZCBjYmVfc2V0X2N0cl9zaXplKHUzMiBjcHUsIHUzMiBwaHlzX2N0ciwgdTMyIGN0cl9zaXplKQoreworCXUzMiBwbV9jdHJsOworCisJaWYgKHBoeXNfY3RyIDwgTlJfUEhZU19DVFJTKSB7CisJCXBtX2N0cmwgPSBjYmVfcmVhZF9wbShjcHUsIHBtX2NvbnRyb2wpOworCQlzd2l0Y2ggKGN0cl9zaXplKSB7CisJCWNhc2UgMTY6CisJCQlwbV9jdHJsIHw9IENCRV9QTV8xNkJJVF9DVFIocGh5c19jdHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAzMjoKKwkJCXBtX2N0cmwgJj0gfkNCRV9QTV8xNkJJVF9DVFIocGh5c19jdHIpOworCQkJYnJlYWs7CisJCX0KKwkJY2JlX3dyaXRlX3BtKGNwdSwgcG1fY29udHJvbCwgcG1fY3RybCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3NldF9jdHJfc2l6ZSk7CisKKy8qCisgKiBFbmFibGUvZGlzYWJsZSB0aGUgZW50aXJlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgdW5pdC4KKyAqIFdoZW4gd2UgZW5hYmxlIHRoZSBQTVUsIGFsbCBwZW5kaW5nIHdyaXRlcyB0byBjb3VudGVycyBnZXQgY29tbWl0dGVkLgorICovCisKK3ZvaWQgY2JlX2VuYWJsZV9wbSh1MzIgY3B1KQoreworCXN0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzICpzaGFkb3dfcmVnczsKKwl1MzIgcG1fY3RybDsKKworCXNoYWRvd19yZWdzID0gY2JlX2dldF9jcHVfcG1kX3NoYWRvd19yZWdzKGNwdSk7CisJc2hhZG93X3JlZ3MtPmNvdW50ZXJfdmFsdWVfaW5fbGF0Y2ggPSAwOworCisJcG1fY3RybCA9IGNiZV9yZWFkX3BtKGNwdSwgcG1fY29udHJvbCkgfCBDQkVfUE1fRU5BQkxFX1BFUkZfTU9OOworCWNiZV93cml0ZV9wbShjcHUsIHBtX2NvbnRyb2wsIHBtX2N0cmwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2VuYWJsZV9wbSk7CisKK3ZvaWQgY2JlX2Rpc2FibGVfcG0odTMyIGNwdSkKK3sKKwl1MzIgcG1fY3RybDsKKwlwbV9jdHJsID0gY2JlX3JlYWRfcG0oY3B1LCBwbV9jb250cm9sKSAmIH5DQkVfUE1fRU5BQkxFX1BFUkZfTU9OOworCWNiZV93cml0ZV9wbShjcHUsIHBtX2NvbnRyb2wsIHBtX2N0cmwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2Rpc2FibGVfcG0pOworCisvKgorICogUmVhZGluZyBmcm9tIHRoZSB0cmFjZV9idWZmZXIuCisgKiBUaGUgdHJhY2UgYnVmZmVyIGlzIHR3byA2NC1iaXQgcmVnaXN0ZXJzLiBSZWFkaW5nIGZyb20KKyAqIHRoZSBzZWNvbmQgaGFsZiBhdXRvbWF0aWNhbGx5IGluY3JlbWVudHMgdGhlIHRyYWNlX2FkZHJlc3MuCisgKi8KKwordm9pZCBjYmVfcmVhZF90cmFjZV9idWZmZXIodTMyIGNwdSwgdTY0ICpidWYpCit7CisJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKGNwdSk7CisKKwkqYnVmKysgPSBpbl9iZTY0KCZwbWRfcmVncy0+dHJhY2VfYnVmZmVyXzBfNjMpOworCSpidWYrKyA9IGluX2JlNjQoJnBtZF9yZWdzLT50cmFjZV9idWZmZXJfNjRfMTI3KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9yZWFkX3RyYWNlX2J1ZmZlcik7CisKKy8qCisgKiBFbmFibGluZy9kaXNhYmxpbmcgaW50ZXJydXB0cyBmb3IgdGhlIGVudGlyZSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIHVuaXQuCisgKi8KKwordTMyIGNiZV9xdWVyeV9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUpCit7CisJcmV0dXJuIGNiZV9yZWFkX3BtKGNwdSwgcG1fc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9xdWVyeV9wbV9pbnRlcnJ1cHRzKTsKKwordTMyIGNiZV9jbGVhcl9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUpCit7CisJLyogUmVhZGluZyBwbV9zdGF0dXMgY2xlYXJzIHRoZSBpbnRlcnJ1cHQgYml0cy4gKi8KKwlyZXR1cm4gY2JlX3F1ZXJ5X3BtX2ludGVycnVwdHMoY3B1KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9jbGVhcl9wbV9pbnRlcnJ1cHRzKTsKKwordm9pZCBjYmVfZW5hYmxlX3BtX2ludGVycnVwdHModTMyIGNwdSwgdTMyIHRocmVhZCwgdTMyIG1hc2spCit7CisJLyogU2V0IHdoaWNoIG5vZGUgYW5kIHRocmVhZCB3aWxsIGhhbmRsZSB0aGUgbmV4dCBpbnRlcnJ1cHQuICovCisJaWljX3NldF9pbnRlcnJ1cHRfcm91dGluZyhjcHUsIHRocmVhZCwgMCk7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCBiaXRzIGluIHRoZSBwbV9zdGF0dXMgcmVnaXN0ZXIuICovCisJaWYgKG1hc2spCisJCWNiZV93cml0ZV9wbShjcHUsIHBtX3N0YXR1cywgbWFzayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZW5hYmxlX3BtX2ludGVycnVwdHMpOworCit2b2lkIGNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHModTMyIGNwdSkKK3sKKwljYmVfY2xlYXJfcG1faW50ZXJydXB0cyhjcHUpOworCWNiZV93cml0ZV9wbShjcHUsIHBtX3N0YXR1cywgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZGlzYWJsZV9wbV9pbnRlcnJ1cHRzKTsKKworc3RhdGljIGlycXJldHVybl90IGNiZV9wbV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXBlcmZfaXJxKGdldF9pcnFfcmVncygpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBfX2luaXQgY2JlX2luaXRfcG1faXJxKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgcmMsIG5vZGU7CisKKwlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKKwkJaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIElJQ19JUlFfSU9FWF9QTUkgfAorCQkJCQkgICAgICAgKG5vZGUgPDwgSUlDX0lSUV9OT0RFX1NISUZUKSk7CisJCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCQlwcmludGsoIkVSUk9SOiBVbmFibGUgdG8gYWxsb2NhdGUgaXJxIGZvciBub2RlICVkXG4iLAorCQkJICAgICAgIG5vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgY2JlX3BtX2lycSwKKwkJCQkgSVJRRl9ESVNBQkxFRCwgImNiZS1wbXUtMCIsIE5VTEwpOworCQlpZiAocmMpIHsKKwkJCXByaW50aygiRVJST1I6IFJlcXVlc3QgZm9yIGlycSBvbiBub2RlICVkIGZhaWxlZFxuIiwKKwkJCSAgICAgICBub2RlKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChjYmVfaW5pdF9wbV9pcnEpOworCit2b2lkIGNiZV9zeW5jX2lycShpbnQgbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhOVUxMLAorCQkJICAgICAgIElJQ19JUlFfSU9FWF9QTUkKKwkJCSAgICAgICB8IChub2RlIDw8IElJQ19JUlFfTk9ERV9TSElGVCkpOworCisJaWYgKGlycSA9PSBOT19JUlEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVJST1IsIHVuYWJsZSB0byBnZXQgZXhpc3RpbmcgaXJxICVkICIgXAorCQkiZm9yIG5vZGUgJWRcbiIsIGlycSwgbm9kZSk7CisJCXJldHVybjsKKwl9CisKKwlzeW5jaHJvbml6ZV9pcnEoaXJxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9zeW5jX2lycSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKaW5kZXggMjJjMjI4YS4uMzY5ODljMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKQEAgLTUwLDkgKzUwLDEwIEBACiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKLSNpbmNsdWRlICJpb21tdS5oIgogI2luY2x1ZGUgImNiZV9yZWdzLmgiCiAjaW5jbHVkZSAicGVydmFzaXZlLmgiCiAjaW5jbHVkZSAicmFzLmgiCkBAIC04MCwyNCArODEsNzIgQEAKIAlwcmludGsoIioqKiAlMDR4IDogJXNcbiIsIGhleCwgcyA/IHMgOiAiIik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjZWxsX3BjaWJpb3NfZml4dXAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNlbGxfcHVibGlzaF9kZXZpY2VzKHZvaWQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaWYgKCFtYWNoaW5lX2lzKGNlbGwpKQorCQlyZXR1cm4gMDsKIAotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOworCS8qIFB1Ymxpc2ggT0YgcGxhdGZvcm0gZGV2aWNlcyBmb3Igc291dGhicmlkZ2UgSU9zICovCisJb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIE5VTEwsIE5VTEwpOworCisJcmV0dXJuIDA7CiB9CitkZXZpY2VfaW5pdGNhbGwoY2VsbF9wdWJsaXNoX2RldmljZXMpOworCitzdGF0aWMgdm9pZCBjZWxsX21waWNfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IG1waWMgKm1waWMgPSBkZXNjLT5oYW5kbGVyX2RhdGE7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwl2aXJxID0gbXBpY19nZXRfb25lX2lycShtcGljKTsKKwlpZiAodmlycSAhPSBOT19JUlEpCisJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKKwlkZXNjLT5jaGlwLT5lb2koaXJxKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1waWNfaW5pdF9JUlEodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBtcGljICptcGljOworCXVuc2lnbmVkIGludCB2aXJxOworCisJZm9yIChkbiA9IE5VTEw7CisJICAgICAoZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShkbiwgImludGVycnVwdC1jb250cm9sbGVyIikpOykgeworCQlpZiAoIWRldmljZV9pc19jb21wYXRpYmxlKGRuLCAiQ0JFQSxwbGF0Zm9ybS1vcGVuLXBpYyIpKQorCQkJY29udGludWU7CisKKwkJLyogVGhlIE1QSUMgZHJpdmVyIHdpbGwgZ2V0IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgZnJvbSB0aGUKKwkJICogZGV2aWNlLXRyZWUsIGp1c3QgcGFzcyAwIHRvIGFsbCBhcmd1bWVudHMKKwkJICovCisJCW1waWMgPSBtcGljX2FsbG9jKGRuLCAwLCAwLCAwLCAwLCAiIE1QSUMgICAgICIpOworCQlpZiAobXBpYyA9PSBOVUxMKQorCQkJY29udGludWU7CisJCW1waWNfaW5pdChtcGljKTsKKworCQl2aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOworCQlpZiAodmlycSA9PSBOT19JUlEpCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlcyA6IGhvb2tpbmcgdXAgdG8gSVJRICVkXG4iLAorCQkgICAgICAgZG4tPmZ1bGxfbmFtZSwgdmlycSk7CisJCXNldF9pcnFfZGF0YSh2aXJxLCBtcGljKTsKKwkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIodmlycSwgY2VsbF9tcGljX2Nhc2NhZGUpOworCX0KK30KKwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2VsbF9pbml0X2lycSh2b2lkKQogewogCWlpY19pbml0X0lSUSgpOwogCXNwaWRlcl9pbml0X0lSUSgpOworCW1waWNfaW5pdF9JUlEoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGNlbGxfc2V0dXBfYXJjaCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TUFVfQkFTRQotCXNwdV9wcml2MV9vcHMgICAgICAgICA9ICZzcHVfcHJpdjFfbW1pb19vcHM7CisJc3B1X3ByaXYxX29wcyA9ICZzcHVfcHJpdjFfbW1pb19vcHM7CisJc3B1X21hbmFnZW1lbnRfb3BzID0gJnNwdV9tYW5hZ2VtZW50X29mX29wczsKICNlbmRpZgogCiAJY2JlX3JlZ3NfaW5pdCgpOwpAQCAtMTA5LDcgKzE1OCw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9pbml0X2NlbGwoKTsKICNlbmRpZgotCiAJLyogaW5pdCB0byBzb21lIH5zYW5lIHZhbHVlIHVudGlsIGNhbGlicmF0ZV9kZWxheSgpIHJ1bnMgKi8KIAlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMDsKIApAQCAtMTI5LDE5ICsxNzcsNiBAQAogCW1taW9fbnZyYW1faW5pdCgpOwogfQogCi0vKgotICogRWFybHkgaW5pdGlhbGl6YXRpb24uICBSZWxvY2F0aW9uIGlzIG9uIGJ1dCBkbyBub3QgcmVmZXJlbmNlIHVuYm9sdGVkIHBhZ2VzCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBjZWxsX2luaXRfZWFybHkodm9pZCkKLXsKLQlEQkcoIiAtPiBjZWxsX2luaXRfZWFybHkoKVxuIik7Ci0KLQljZWxsX2luaXRfaW9tbXUoKTsKLQotCURCRygiIDwtIGNlbGxfaW5pdF9lYXJseSgpXG4iKTsKLX0KLQotCiBzdGF0aWMgaW50IF9faW5pdCBjZWxsX3Byb2JlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwpAQCAtMTY4LDcgKzIwMyw2IEBACiAJLm5hbWUJCQk9ICJDZWxsIiwKIAkucHJvYmUJCQk9IGNlbGxfcHJvYmUsCiAJLnNldHVwX2FyY2gJCT0gY2VsbF9zZXR1cF9hcmNoLAotCS5pbml0X2Vhcmx5CQk9IGNlbGxfaW5pdF9lYXJseSwKIAkuc2hvd19jcHVpbmZvCQk9IGNlbGxfc2hvd19jcHVpbmZvLAogCS5yZXN0YXJ0CQk9IHJ0YXNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHJ0YXNfcG93ZXJfb2ZmLApAQCAtMTgwLDcgKzIxNCw3IEBACiAJLmNoZWNrX2xlZ2FjeV9pb3BvcnQJPSBjZWxsX2NoZWNrX2xlZ2FjeV9pb3BvcnQsCiAJLnByb2dyZXNzCQk9IGNlbGxfcHJvZ3Jlc3MsCiAJLmluaXRfSVJRICAgICAgIAk9IGNlbGxfaW5pdF9pcnEsCi0JLnBjaWJpb3NfZml4dXAJCT0gY2VsbF9wY2liaW9zX2ZpeHVwLAorCS5wY2lfc2V0dXBfcGhiCQk9IHJ0YXNfc2V0dXBfcGhiLAogI2lmZGVmIENPTkZJR19LRVhFQwogCS5tYWNoaW5lX2tleGVjCQk9IGRlZmF1bHRfbWFjaGluZV9rZXhlYywKIAkubWFjaGluZV9rZXhlY19wcmVwYXJlCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCmluZGV4IDdhYTgwOWQuLmJkN2JmZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCkBAIC0yNSwyMiArMjUsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+Ci0jaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3htb24uaD4KIAotI2luY2x1ZGUgImludGVycnVwdC5oIgotCitjb25zdCBzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzICpzcHVfbWFuYWdlbWVudF9vcHM7CiBjb25zdCBzdHJ1Y3Qgc3B1X3ByaXYxX29wcyAqc3B1X3ByaXYxX29wczsKIAogRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3ByaXYxX29wcyk7CkBAIC04OSw3ICs4NCwzMCBAQAogCQlwcmludGsoIiVzOiBpbnZhbGlkIGFjY2VzcyBkdXJpbmcgc3dpdGNoIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMTsKIAl9Ci0JaWYgKCFtbSB8fCAoUkVHSU9OX0lEKGVhKSAhPSBVU0VSX1JFR0lPTl9JRCkpIHsKKwllc2lkID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7CisKKwlzd2l0Y2goUkVHSU9OX0lEKGVhKSkgeworCWNhc2UgVVNFUl9SRUdJT05fSUQ6CisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorCQlpZiAoaW5faHVnZXBhZ2VfYXJlYShtbS0+Y29udGV4dCwgZWEpKQorCQkJbGxwID0gbW11X3BzaXplX2RlZnNbbW11X2h1Z2VfcHNpemVdLnNsbHA7CisJCWVsc2UKKyNlbmRpZgorCQkJbGxwID0gbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNsbHA7CisJCXZzaWQgPSAoZ2V0X3ZzaWQobW0tPmNvbnRleHQuaWQsIGVhKSA8PCBTTEJfVlNJRF9TSElGVCkgfAorCQkJCVNMQl9WU0lEX1VTRVIgfCBsbHA7CisJCWJyZWFrOworCWNhc2UgVk1BTExPQ19SRUdJT05fSUQ6CisJCWxscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV92aXJ0dWFsX3BzaXplXS5zbGxwOworCQl2c2lkID0gKGdldF9rZXJuZWxfdnNpZChlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKKwkJCVNMQl9WU0lEX0tFUk5FTCB8IGxscDsKKwkJYnJlYWs7CisJY2FzZSBLRVJORUxfUkVHSU9OX0lEOgorCQlsbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfbGluZWFyX3BzaXplXS5zbGxwOworCQl2c2lkID0gKGdldF9rZXJuZWxfdnNpZChlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKKwkJCVNMQl9WU0lEX0tFUk5FTCB8IGxscDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJLyogRnV0dXJlOiBzdXBwb3J0IGtlcm5lbCBzZWdtZW50cyBzbyB0aGF0IGRyaXZlcnMKIAkJICogY2FuIHVzZSBTUFVzLgogCQkgKi8KQEAgLTk3LDE2ICsxMTUsNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQllc2lkID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7Ci0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQotCWlmIChpbl9odWdlcGFnZV9hcmVhKG1tLT5jb250ZXh0LCBlYSkpCi0JCWxscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV9odWdlX3BzaXplXS5zbGxwOwotCWVsc2UKLSNlbmRpZgotCQlsbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfdmlydHVhbF9wc2l6ZV0uc2xscDsKLQl2c2lkID0gKGdldF92c2lkKG1tLT5jb250ZXh0LmlkLCBlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKLQkJCVNMQl9WU0lEX1VTRVIgfCBsbHA7Ci0KIAlvdXRfYmU2NCgmcHJpdjItPnNsYl9pbmRleF9XLCBzcHUtPnNsYl9yZXBsYWNlKTsKIAlvdXRfYmU2NCgmcHJpdjItPnNsYl92c2lkX1JXLCB2c2lkKTsKIAlvdXRfYmU2NCgmcHJpdjItPnNsYl9lc2lkX1JXLCBlc2lkKTsKQEAgLTMyMCw2ICszMjgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzcHVfbGlzdFtNQVhfTlVNTk9ERVNdOworc3RhdGljIExJU1RfSEVBRChzcHVfZnVsbF9saXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc3B1X211dGV4KTsKIAogc3RhdGljIHZvaWQgc3B1X2luaXRfY2hhbm5lbHMoc3RydWN0IHNwdSAqc3B1KQpAQCAtMzY0LDggKzM3Myw3IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZzcHVfbGlzdFtub2RlXSkpIHsKIAkJc3B1ID0gbGlzdF9lbnRyeShzcHVfbGlzdFtub2RlXS5uZXh0LCBzdHJ1Y3Qgc3B1LCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKLQkJcHJfZGVidWcoIkdvdCBTUFUgJXggJWQgJWRcbiIsCi0JCQkgc3B1LT5pc3JjLCBzcHUtPm51bWJlciwgc3B1LT5ub2RlKTsKKwkJcHJfZGVidWcoIkdvdCBTUFUgJWQgJWRcbiIsIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOwogCQlzcHVfaW5pdF9jaGFubmVscyhzcHUpOwogCX0KIAltdXRleF91bmxvY2soJnNwdV9tdXRleCk7CkBAIC00OTMsMjgwICs1MDEsNjUgQEAKIAlpZiAoIWVycm9yKSB7CiAJCXNwdV9yZXN0YXJ0X2RtYShzcHUpOwogCX0gZWxzZSB7Ci0JCV9fc3B1X3RyYXBfaW52YWxpZF9kbWEoc3B1KTsKKwkJc3B1LT5kbWFfY2FsbGJhY2soc3B1LCBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRSk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfc3B1X25vZGVfaWQoc3RydWN0IGRldmljZV9ub2RlICpzcGUpCi17Ci0JY29uc3QgdW5zaWduZWQgaW50ICppZDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKLQljcHUgPSBzcGUtPnBhcmVudC0+cGFyZW50OwotCWlkID0gZ2V0X3Byb3BlcnR5KGNwdSwgIm5vZGUtaWQiLCBOVUxMKTsKLQlyZXR1cm4gaWQgPyAqaWQgOiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjZWxsX3NwdXByb3BfcHJlc2VudChzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlLAotCQljb25zdCBjaGFyICpwcm9wKQotewotCXN0YXRpYyBERUZJTkVfTVVURVgoYWRkX3NwdW1lbV9tdXRleCk7Ci0KLQljb25zdCBzdHJ1Y3QgYWRkcmVzc19wcm9wIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCQl1bnNpZ25lZCBpbnQgbGVuOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKnA7Ci0JaW50IHByb3BsZW47Ci0KLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgbnJfcGFnZXM7Ci0Jc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGE7Ci0Jc3RydWN0IHpvbmUgKnpvbmU7Ci0JaW50IHJldDsKLQotCXAgPSBnZXRfcHJvcGVydHkoc3BlLCBwcm9wLCAmcHJvcGxlbik7Ci0JV0FSTl9PTihwcm9wbGVuICE9IHNpemVvZiAoKnApKTsKLQotCXN0YXJ0X3BmbiA9IHAtPmFkZHJlc3MgPj4gUEFHRV9TSElGVDsKLQlucl9wYWdlcyA9ICgodW5zaWduZWQgbG9uZylwLT5sZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCi0JcGdkYXRhID0gTk9ERV9EQVRBKHNwdS0+bmlkKTsKLQl6b25lID0gcGdkYXRhLT5ub2RlX3pvbmVzOwotCi0JLyogWFhYIHJldGhpbmsgbG9ja2luZyBoZXJlICovCi0JbXV0ZXhfbG9jaygmYWRkX3NwdW1lbV9tdXRleCk7Ci0JcmV0ID0gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7Ci0JbXV0ZXhfdW5sb2NrKCZhZGRfc3B1bWVtX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgbWFwX3NwZV9wcm9wKHN0cnVjdCBzcHUgKnNwdSwKLQkJc3RydWN0IGRldmljZV9ub2RlICpuLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNvbnN0IHN0cnVjdCBhZGRyZXNzX3Byb3AgewotCQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JCXVuc2lnbmVkIGludCBsZW47Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcHJvcDsKLQotCWNvbnN0IHZvaWQgKnA7Ci0JaW50IHByb3BsZW47Ci0Jdm9pZCBfX2lvbWVtICpyZXQgPSBOVUxMOwotCWludCBlcnIgPSAwOwotCi0JcCA9IGdldF9wcm9wZXJ0eShuLCBuYW1lLCAmcHJvcGxlbik7Ci0JaWYgKHByb3BsZW4gIT0gc2l6ZW9mIChzdHJ1Y3QgYWRkcmVzc19wcm9wKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwcm9wID0gcDsKLQotCWVyciA9IGNlbGxfc3B1cHJvcF9wcmVzZW50KHNwdSwgbiwgbmFtZSk7Ci0JaWYgKGVyciAmJiAoZXJyICE9IC1FRVhJU1QpKQotCQlnb3RvIG91dDsKLQotCXJldCA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKLQotIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzcHVfdW5tYXAoc3RydWN0IHNwdSAqc3B1KQotewotCWlvdW5tYXAoc3B1LT5wcml2Mik7Ci0JaW91bm1hcChzcHUtPnByaXYxKTsKLQlpb3VubWFwKHNwdS0+cHJvYmxlbSk7Ci0JaW91bm1hcCgoX19mb3JjZSB1OCBfX2lvbWVtICopc3B1LT5sb2NhbF9zdG9yZSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgYWJzdHJhY3RlZCBmb3IgSFYgcGxhdGZvcm1zICovCi1zdGF0aWMgaW50IF9faW5pdCBzcHVfbWFwX2ludGVycnVwdHNfb2xkKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQl1bnNpZ25lZCBpbnQgaXNyYzsKLQljb25zdCB1MzIgKnRtcDsKLQotCS8qIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZSB1bml0IGZyb20gdGhlIGRldmljZS10cmVlICovCi0JdG1wID0gZ2V0X3Byb3BlcnR5KG5wLCAiaXNyYyIsIE5VTEwpOwotCWlmICghdG1wKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpc3JjID0gdG1wWzBdOwotCi0JLyogQWRkIHRoZSBub2RlIG51bWJlciAqLwotCWlzcmMgfD0gc3B1LT5ub2RlIDw8IElJQ19JUlFfTk9ERV9TSElGVDsKLQlzcHUtPmlzcmMgPSBpc3JjOwotCi0JLyogTm93IG1hcCBpbnRlcnJ1cHRzIG9mIGFsbCAzIGNsYXNzZXMgKi8KLQlzcHUtPmlycXNbMF0gPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgSUlDX0lSUV9DTEFTU18wIHwgaXNyYyk7Ci0Jc3B1LT5pcnFzWzFdID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIElJQ19JUlFfQ0xBU1NfMSB8IGlzcmMpOwotCXNwdS0+aXJxc1syXSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBJSUNfSVJRX0NMQVNTXzIgfCBpc3JjKTsKLQotCS8qIFJpZ2h0IG5vdywgd2Ugb25seSBmYWlsIGlmIGNsYXNzIDIgZmFpbGVkICovCi0JcmV0dXJuIHNwdS0+aXJxc1syXSA9PSBOT19JUlEgPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3B1X21hcF9kZXZpY2Vfb2xkKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCWNvbnN0IGNoYXIgKnByb3A7Ci0JaW50IHJldDsKLQotCXJldCA9IC1FTk9ERVY7Ci0Jc3B1LT5uYW1lID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJuYW1lIiwgTlVMTCk7Ci0JaWYgKCFzcHUtPm5hbWUpCi0JCWdvdG8gb3V0OwotCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShub2RlLCAibG9jYWwtc3RvcmUiLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCWdvdG8gb3V0OwotCXNwdS0+bG9jYWxfc3RvcmVfcGh5cyA9ICoodW5zaWduZWQgbG9uZyAqKXByb3A7Ci0KLQkvKiB3ZSB1c2UgbG9jYWwgc3RvcmUgYXMgcmFtLCBub3QgaW8gbWVtb3J5ICovCi0Jc3B1LT5sb2NhbF9zdG9yZSA9ICh2b2lkIF9fZm9yY2UgKikKLQkJbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgImxvY2FsLXN0b3JlIik7Ci0JaWYgKCFzcHUtPmxvY2FsX3N0b3JlKQotCQlnb3RvIG91dDsKLQotCXByb3AgPSBnZXRfcHJvcGVydHkobm9kZSwgInByb2JsZW0iLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCWdvdG8gb3V0X3VubWFwOwotCXNwdS0+cHJvYmxlbV9waHlzID0gKih1bnNpZ25lZCBsb25nICopcHJvcDsKLQotCXNwdS0+cHJvYmxlbT0gbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgInByb2JsZW0iKTsKLQlpZiAoIXNwdS0+cHJvYmxlbSkKLQkJZ290byBvdXRfdW5tYXA7Ci0KLQlzcHUtPnByaXYxPSBtYXBfc3BlX3Byb3Aoc3B1LCBub2RlLCAicHJpdjEiKTsKLQkvKiBwcml2MSBpcyBub3QgYXZhaWxhYmxlIG9uIGEgaHlwZXJ2aXNvciAqLwotCi0Jc3B1LT5wcml2Mj0gbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgInByaXYyIik7Ci0JaWYgKCFzcHUtPnByaXYyKQotCQlnb3RvIG91dF91bm1hcDsKLQlyZXQgPSAwOwotCWdvdG8gb3V0OwotCi1vdXRfdW5tYXA6Ci0Jc3B1X3VubWFwKHNwdSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3B1X21hcF9pbnRlcnJ1cHRzKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0JCXJldCA9IG9mX2lycV9tYXBfb25lKG5wLCBpLCAmb2lycSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2RlYnVnKCJzcHVfbmV3OiBmYWlsZWQgdG8gZ2V0IGlycSAlZFxuIiwgaSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlyZXQgPSAtRUlOVkFMOwotCQlwcl9kZWJ1ZygiICBpcnEgJWQgbm8gMHgleCBvbiAlc1xuIiwgaSwgb2lycS5zcGVjaWZpZXJbMF0sCi0JCQkgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCQlzcHUtPmlycXNbaV0gPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLAotCQkJCQlvaXJxLnNwZWNpZmllciwgb2lycS5zaXplKTsKLQkJaWYgKHNwdS0+aXJxc1tpXSA9PSBOT19JUlEpIHsKLQkJCXByX2RlYnVnKCJzcHVfbmV3OiBmYWlsZWQgdG8gbWFwIGl0ICFcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlwcl9kZWJ1ZygiZmFpbGVkIHRvIG1hcCBpcnEgJXggZm9yIHNwdSAlc1xuIiwgKm9pcnEuc3BlY2lmaWVyLCBzcHUtPm5hbWUpOwotCWZvciAoOyBpID49IDA7IGktLSkgewotCQlpZiAoc3B1LT5pcnFzW2ldICE9IE5PX0lSUSkKLQkJCWlycV9kaXNwb3NlX21hcHBpbmcoc3B1LT5pcnFzW2ldKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzcHVfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IG5yLAotCQl2b2lkIF9faW9tZW0qKiB2aXJ0LCB1bnNpZ25lZCBsb25nICpwaHlzKQotewotCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZSA9IHsgfTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCBuciwgJnJlc291cmNlKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWlmIChwaHlzKQotCQkqcGh5cyA9IHJlc291cmNlLnN0YXJ0OwotCSp2aXJ0ID0gaW9yZW1hcChyZXNvdXJjZS5zdGFydCwgcmVzb3VyY2UuZW5kIC0gcmVzb3VyY2Uuc3RhcnQpOwotCWlmICghKnZpcnQpCi0JCXJldCA9IC1FSU5WQUw7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzcHVfbWFwX2RldmljZShzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQlzcHUtPm5hbWUgPSBnZXRfcHJvcGVydHkobm9kZSwgIm5hbWUiLCBOVUxMKTsKLQlpZiAoIXNwdS0+bmFtZSkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDAsICh2b2lkIF9faW9tZW0qKikmc3B1LT5sb2NhbF9zdG9yZSwKLQkJCQkJJnNwdS0+bG9jYWxfc3RvcmVfcGh5cyk7Ci0JaWYgKHJldCkgewotCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCAlcyByZXNvdXJjZSAwXG4iLAotCQkJIG5vZGUtPmZ1bGxfbmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDEsICh2b2lkIF9faW9tZW0qKikmc3B1LT5wcm9ibGVtLAotCQkJCQkmc3B1LT5wcm9ibGVtX3BoeXMpOwotCWlmIChyZXQpIHsKLQkJcHJfZGVidWcoInNwdV9uZXc6IGZhaWxlZCB0byBtYXAgJXMgcmVzb3VyY2UgMVxuIiwKLQkJCSBub2RlLT5mdWxsX25hbWUpOwotCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0JcmV0ID0gc3B1X21hcF9yZXNvdXJjZShub2RlLCAyLCAodm9pZCBfX2lvbWVtKiopJnNwdS0+cHJpdjIsCi0JCQkJCU5VTEwpOwotCWlmIChyZXQpIHsKLQkJcHJfZGVidWcoInNwdV9uZXc6IGZhaWxlZCB0byBtYXAgJXMgcmVzb3VyY2UgMlxuIiwKLQkJCSBub2RlLT5mdWxsX25hbWUpOwotCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0KLQlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCi0JCXJldCA9IHNwdV9tYXBfcmVzb3VyY2Uobm9kZSwgMywgKHZvaWQgX19pb21lbSoqKSZzcHUtPnByaXYxLAotCQkJCQlOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCXByX2RlYnVnKCJzcHVfbmV3OiBmYWlsZWQgdG8gbWFwICVzIHJlc291cmNlIDNcbiIsCi0JCQkgbm9kZS0+ZnVsbF9uYW1lKTsKLQkJZ290byBvdXRfdW5tYXA7Ci0JfQotCXByX2RlYnVnKCJzcHVfbmV3OiAlcyBtYXBzOlxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKLQlwcl9kZWJ1ZygiICBsb2NhbCBzdG9yZSAgIDogMHglMDE2bHggLT4gMHglcFxuIiwKLQkJIHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgc3B1LT5sb2NhbF9zdG9yZSk7Ci0JcHJfZGVidWcoIiAgcHJvYmxlbSBzdGF0ZSA6IDB4JTAxNmx4IC0+IDB4JXBcbiIsCi0JCSBzcHUtPnByb2JsZW1fcGh5cywgc3B1LT5wcm9ibGVtKTsKLQlwcl9kZWJ1ZygiICBwcml2MiAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgIDB4JXBcbiIsIHNwdS0+cHJpdjIpOwotCXByX2RlYnVnKCIgIHByaXYxICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgMHglcFxuIiwgc3B1LT5wcml2MSk7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X3VubWFwOgotCXNwdV91bm1hcChzcHUpOwotb3V0OgotCXByX2RlYnVnKCJmYWlsZWQgdG8gbWFwIHNwZSAlczogJWRcbiIsIHNwdS0+bmFtZSwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNwdV9zeXNkZXZfY2xhc3MgPSB7CiAJc2V0X2tzZXRfbmFtZSgic3B1IikKIH07CiAKLXN0YXRpYyBzc2l6ZV90IHNwdV9zaG93X2lzcmMoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmKQoraW50IHNwdV9hZGRfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpCiB7Ci0Jc3RydWN0IHNwdSAqc3B1ID0gY29udGFpbmVyX29mKHN5c2Rldiwgc3RydWN0IHNwdSwgc3lzZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3B1LT5pc3JjKTsKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKIAorCWxpc3RfZm9yX2VhY2hfZW50cnkoc3B1LCAmc3B1X2Z1bGxfbGlzdCwgZnVsbF9saXN0KQorCQlzeXNkZXZfY3JlYXRlX2ZpbGUoJnNwdS0+c3lzZGV2LCBhdHRyKTsKKworCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKKwlyZXR1cm4gMDsKIH0KLXN0YXRpYyBTWVNERVZfQVRUUihpc3JjLCAwNDAwLCBzcHVfc2hvd19pc3JjLCBOVUxMKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9hZGRfc3lzZGV2X2F0dHIpOwogCi1leHRlcm4gaW50IGF0dGFjaF9zeXNkZXZfdG9fbm9kZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBpbnQgbmlkKTsKK2ludCBzcHVfYWRkX3N5c2Rldl9hdHRyX2dyb3VwKHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJzKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwltdXRleF9sb2NrKCZzcHVfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcHUsICZzcHVfZnVsbF9saXN0LCBmdWxsX2xpc3QpCisJCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc3B1LT5zeXNkZXYua29iaiwgYXR0cnMpOworCisJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2FkZF9zeXNkZXZfYXR0cl9ncm91cCk7CisKKwordm9pZCBzcHVfcmVtb3ZlX3N5c2Rldl9hdHRyKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwltdXRleF9sb2NrKCZzcHVfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcHUsICZzcHVfZnVsbF9saXN0LCBmdWxsX2xpc3QpCisJCXN5c2Rldl9yZW1vdmVfZmlsZSgmc3B1LT5zeXNkZXYsIGF0dHIpOworCisJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3JlbW92ZV9zeXNkZXZfYXR0cik7CisKK3ZvaWQgc3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cChzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycykKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3B1LCAmc3B1X2Z1bGxfbGlzdCwgZnVsbF9saXN0KQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnNwdS0+c3lzZGV2LmtvYmosIGF0dHJzKTsKKworCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9yZW1vdmVfc3lzZGV2X2F0dHJfZ3JvdXApOwogCiBzdGF0aWMgaW50IHNwdV9jcmVhdGVfc3lzZGV2KHN0cnVjdCBzcHUgKnNwdSkKIHsKQEAgLTc4MSwyMSArNTc0LDE4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHNwdS0+aXNyYyAhPSAwKQotCQlzeXNkZXZfY3JlYXRlX2ZpbGUoJnNwdS0+c3lzZGV2LCAmYXR0cl9pc3JjKTsKLQlzeXNmc19hZGRfZGV2aWNlX3RvX25vZGUoJnNwdS0+c3lzZGV2LCBzcHUtPm5pZCk7CisJc3lzZnNfYWRkX2RldmljZV90b19ub2RlKCZzcHUtPnN5c2Rldiwgc3B1LT5ub2RlKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzcHVfZGVzdHJveV9zeXNkZXYoc3RydWN0IHNwdSAqc3B1KQogewotCXN5c2Rldl9yZW1vdmVfZmlsZSgmc3B1LT5zeXNkZXYsICZhdHRyX2lzcmMpOwotCXN5c2ZzX3JlbW92ZV9kZXZpY2VfZnJvbV9ub2RlKCZzcHUtPnN5c2Rldiwgc3B1LT5uaWQpOworCXN5c2ZzX3JlbW92ZV9kZXZpY2VfZnJvbV9ub2RlKCZzcHUtPnN5c2Rldiwgc3B1LT5ub2RlKTsKIAlzeXNkZXZfdW5yZWdpc3Rlcigmc3B1LT5zeXNkZXYpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfc3B1KHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlKQorc3RhdGljIGludCBfX2luaXQgY3JlYXRlX3NwdSh2b2lkICpkYXRhKQogewogCXN0cnVjdCBzcHUgKnNwdTsKIAlpbnQgcmV0OwpAQCAtODA2LDU3ICs1OTYsMzcgQEAKIAlpZiAoIXNwdSkKIAkJZ290byBvdXQ7CiAKLQlzcHUtPm5vZGUgPSBmaW5kX3NwdV9ub2RlX2lkKHNwZSk7Ci0JaWYgKHNwdS0+bm9kZSA+PSBNQVhfTlVNTk9ERVMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1BFICVzIG9uIG5vZGUgJWQgaWdub3JlZCwiCi0JCSAgICAgICAiIG5vZGUgbnVtYmVyIHRvbyBiaWdcbiIsIHNwZS0+ZnVsbF9uYW1lLCBzcHUtPm5vZGUpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDaGVjayBpZiBDT05GSUdfTlVNQSBpcyBlbmFibGVkLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlzcHUtPm5pZCA9IG9mX25vZGVfdG9fbmlkKHNwZSk7Ci0JaWYgKHNwdS0+bmlkID09IC0xKQotCQlzcHUtPm5pZCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKKwlzcHUtPm51bWJlciA9IG51bWJlcisrOworCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKIAotCXJldCA9IHNwdV9tYXBfZGV2aWNlKHNwdSwgc3BlKTsKLQkvKiB0cnkgb2xkIG1ldGhvZCAqLwotCWlmIChyZXQpCi0JCXJldCA9IHNwdV9tYXBfZGV2aWNlX29sZChzcHUsIHNwZSk7CisJcmV0ID0gc3B1X2NyZWF0ZV9zcHUoc3B1LCBkYXRhKTsKKwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKLQlyZXQgPSBzcHVfbWFwX2ludGVycnVwdHMoc3B1LCBzcGUpOwotCWlmIChyZXQpCi0JCXJldCA9IHNwdV9tYXBfaW50ZXJydXB0c19vbGQoc3B1LCBzcGUpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubWFwOwotCXNwaW5fbG9ja19pbml0KCZzcHUtPnJlZ2lzdGVyX2xvY2spOwotCXNwdV9tZmNfc2RyX3NldChzcHUsIG1mc3ByKFNQUk5fU0RSMSkpOworCXNwdV9tZmNfc2RyX3NldHVwKHNwdSk7CiAJc3B1X21mY19zcjFfc2V0KHNwdSwgMHgzMyk7Ci0JbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKLQotCXNwdS0+bnVtYmVyID0gbnVtYmVyKys7CiAJcmV0ID0gc3B1X3JlcXVlc3RfaXJxcyhzcHUpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfZGVzdHJveTsKIAogCXJldCA9IHNwdV9jcmVhdGVfc3lzZGV2KHNwdSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZV9pcnFzOwogCisJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKIAlsaXN0X2FkZCgmc3B1LT5saXN0LCAmc3B1X2xpc3Rbc3B1LT5ub2RlXSk7CisJbGlzdF9hZGQoJnNwdS0+ZnVsbF9saXN0LCAmc3B1X2Z1bGxfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOwogCi0JcHJfZGVidWcoS0VSTl9ERUJVRyAiVXNpbmcgU1BFICVzICUwMnggJXAgJXAgJXAgJXAgJWRcbiIsCi0JCXNwdS0+bmFtZSwgc3B1LT5pc3JjLCBzcHUtPmxvY2FsX3N0b3JlLAotCQlzcHUtPnByb2JsZW0sIHNwdS0+cHJpdjEsIHNwdS0+cHJpdjIsIHNwdS0+bnVtYmVyKTsKIAlnb3RvIG91dDsKIAogb3V0X2ZyZWVfaXJxczoKIAlzcHVfZnJlZV9pcnFzKHNwdSk7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKLW91dF91bm1hcDoKLQlzcHVfdW5tYXAoc3B1KTsKK291dF9kZXN0cm95OgorCXNwdV9kZXN0cm95X3NwdShzcHUpOwogb3V0X2ZyZWU6CiAJa2ZyZWUoc3B1KTsKIG91dDoKQEAgLTg2NiwxMCArNjM2LDExIEBACiBzdGF0aWMgdm9pZCBkZXN0cm95X3NwdShzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZzcHUtPmZ1bGxfbGlzdCk7CiAKIAlzcHVfZGVzdHJveV9zeXNkZXYoc3B1KTsKIAlzcHVfZnJlZV9pcnFzKHNwdSk7Ci0Jc3B1X3VubWFwKHNwdSk7CisJc3B1X2Rlc3Ryb3lfc3B1KHNwdSk7CiAJa2ZyZWUoc3B1KTsKIH0KIApAQCAtODkwLDkgKzY2MSwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWludCBpLCByZXQ7CiAKKwlpZiAoIXNwdV9tYW5hZ2VtZW50X29wcykKKwkJcmV0dXJuIDA7CisKIAkvKiBjcmVhdGUgc3lzZGV2IGNsYXNzIGZvciBzcHVzICovCiAJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZzcHVfc3lzZGV2X2NsYXNzKTsKIAlpZiAocmV0KQpAQCAtOTAxLDE3ICs2NzQsMTcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspCiAJCUlOSVRfTElTVF9IRUFEKCZzcHVfbGlzdFtpXSk7CiAKLQlyZXQgPSAtRU5PREVWOwotCWZvciAobm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzcGUiKTsKLQkJCW5vZGU7IG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShub2RlLCAic3BlIikpIHsKLQkJcmV0ID0gY3JlYXRlX3NwdShub2RlKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIGluaXRpYWxpemluZyAlc1xuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOwotCQkJY2xlYW51cF9zcHVfYmFzZSgpOwotCQkJYnJlYWs7Ci0JCX0KKwlyZXQgPSBzcHVfZW51bWVyYXRlX3NwdXMoY3JlYXRlX3NwdSk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCWNsZWFudXBfc3B1X2Jhc2UoKTsKKwkJcmV0dXJuIHJldDsKIAl9CisKKwl4bW9uX3JlZ2lzdGVyX3NwdXMoJnNwdV9mdWxsX2xpc3QpOworCiAJcmV0dXJuIHJldDsKIH0KIG1vZHVsZV9pbml0KGluaXRfc3B1X2Jhc2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jb3JlZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jb3JlZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTViNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NvcmVkdW1wLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIFNQVSBjb3JlIGR1bXAgY29kZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycC4KKyAqCisgKiBBdXRob3I6IER3YXluZSBHcmFudCBNY0Nvbm5lbGwgPGRlY2ltYWxAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS9zcHUuaD4KKworc3RhdGljIHN0cnVjdCBzcHVfY29yZWR1bXBfY2FsbHMgc3B1X2NvcmVkdW1wX2NhbGxzOworc3RhdGljIERFRklORV9NVVRFWChzcHVfY29yZWR1bXBfbXV0ZXgpOworCitpbnQgYXJjaF9ub3Rlc19zaXplKHZvaWQpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBzcHVfY29yZWR1bXBfY2FsbHMub3duZXI7CisKKwlyZXQgPSAtRU5PU1lTOworCW11dGV4X2xvY2soJnNwdV9jb3JlZHVtcF9tdXRleCk7CisJaWYgKG93bmVyICYmIHRyeV9tb2R1bGVfZ2V0KG93bmVyKSkgeworCQlyZXQgPSBzcHVfY29yZWR1bXBfY2FsbHMuYXJjaF9ub3Rlc19zaXplKCk7CisJCW1vZHVsZV9wdXQob3duZXIpOworCX0KKwltdXRleF91bmxvY2soJnNwdV9jb3JlZHVtcF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhcmNoX3dyaXRlX25vdGVzKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gc3B1X2NvcmVkdW1wX2NhbGxzLm93bmVyOworCisJbXV0ZXhfbG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKKwlpZiAob3duZXIgJiYgdHJ5X21vZHVsZV9nZXQob3duZXIpKSB7CisJCXNwdV9jb3JlZHVtcF9jYWxscy5hcmNoX3dyaXRlX25vdGVzKGZpbGUpOworCQltb2R1bGVfcHV0KG93bmVyKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzcHVfY29yZWR1bXBfbXV0ZXgpOworfQorCitpbnQgcmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyhzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzICpjYWxscykKK3sKKwlpZiAoc3B1X2NvcmVkdW1wX2NhbGxzLm93bmVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJbXV0ZXhfbG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKKwlzcHVfY29yZWR1bXBfY2FsbHMuYXJjaF9ub3Rlc19zaXplID0gY2FsbHMtPmFyY2hfbm90ZXNfc2l6ZTsKKwlzcHVfY29yZWR1bXBfY2FsbHMuYXJjaF93cml0ZV9ub3RlcyA9IGNhbGxzLT5hcmNoX3dyaXRlX25vdGVzOworCXNwdV9jb3JlZHVtcF9jYWxscy5vd25lciA9IGNhbGxzLT5vd25lcjsKKwltdXRleF91bmxvY2soJnNwdV9jb3JlZHVtcF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9hcmNoX2NvcmVkdW1wX2NhbGxzKTsKKwordm9pZCB1bnJlZ2lzdGVyX2FyY2hfY29yZWR1bXBfY2FsbHMoc3RydWN0IHNwdV9jb3JlZHVtcF9jYWxscyAqY2FsbHMpCit7CisJQlVHX09OKHNwdV9jb3JlZHVtcF9jYWxscy5vd25lciAhPSBjYWxscy0+b3duZXIpOworCisJbXV0ZXhfbG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKKwlzcHVfY29yZWR1bXBfY2FsbHMub3duZXIgPSBOVUxMOworCW11dGV4X3VubG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X3ByaXYxX21taW8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCmluZGV4IDcxYjY5ZjAuLmE1ZGUwNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCkBAIC0xOCwxMjAgKzE4LDQ5OCBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKICNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKKyNpbmNsdWRlICJzcHVfcHJpdjFfbW1pby5oIgorCitzdHJ1Y3Qgc3B1X3BkYXRhIHsKKwlpbnQgbmlkOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2bm9kZTsKKwlzdHJ1Y3Qgc3B1X3ByaXYxIF9faW9tZW0gKnByaXYxOworfTsKKworc3RhdGljIHN0cnVjdCBzcHVfcGRhdGEgKnNwdV9nZXRfcGRhdGEoc3RydWN0IHNwdSAqc3B1KQoreworCUJVR19PTighc3B1LT5wZGF0YSk7CisJcmV0dXJuIHNwdS0+cGRhdGE7Cit9CisKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqc3B1X2Rldm5vZGUoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBzcHVfZ2V0X3BkYXRhKHNwdSktPmRldm5vZGU7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9kZXZub2RlKTsKKworc3RhdGljIGludCBfX2luaXQgZmluZF9zcHVfbm9kZV9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKnNwZSkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgKmlkOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OworCWNwdSA9IHNwZS0+cGFyZW50LT5wYXJlbnQ7CisJaWQgPSBnZXRfcHJvcGVydHkoY3B1LCAibm9kZS1pZCIsIE5VTEwpOworCXJldHVybiBpZCA/ICppZCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNlbGxfc3B1cHJvcF9wcmVzZW50KHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpzcGUsCisJCWNvbnN0IGNoYXIgKnByb3ApCit7CisJc3RhdGljIERFRklORV9NVVRFWChhZGRfc3B1bWVtX211dGV4KTsKKworCWNvbnN0IHN0cnVjdCBhZGRyZXNzX3Byb3AgeworCQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJCXVuc2lnbmVkIGludCBsZW47CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcDsKKwlpbnQgcHJvcGxlbjsKKworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBucl9wYWdlczsKKwlzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0YTsKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwlpbnQgcmV0OworCisJcCA9IGdldF9wcm9wZXJ0eShzcGUsIHByb3AsICZwcm9wbGVuKTsKKwlXQVJOX09OKHByb3BsZW4gIT0gc2l6ZW9mICgqcCkpOworCisJc3RhcnRfcGZuID0gcC0+YWRkcmVzcyA+PiBQQUdFX1NISUZUOworCW5yX3BhZ2VzID0gKCh1bnNpZ25lZCBsb25nKXAtPmxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisKKwlwZ2RhdGEgPSBOT0RFX0RBVEEoc3B1X2dldF9wZGF0YShzcHUpLT5uaWQpOworCXpvbmUgPSBwZ2RhdGEtPm5vZGVfem9uZXM7CisKKwkvKiBYWFggcmV0aGluayBsb2NraW5nIGhlcmUgKi8KKwltdXRleF9sb2NrKCZhZGRfc3B1bWVtX211dGV4KTsKKwlyZXQgPSBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwltdXRleF91bmxvY2soJmFkZF9zcHVtZW1fbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBtYXBfc3BlX3Byb3Aoc3RydWN0IHNwdSAqc3B1LAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm4sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3Qgc3RydWN0IGFkZHJlc3NfcHJvcCB7CisJCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwkJdW5zaWduZWQgaW50IGxlbjsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpwcm9wOworCisJY29uc3Qgdm9pZCAqcDsKKwlpbnQgcHJvcGxlbjsKKwl2b2lkIF9faW9tZW0gKnJldCA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwlwID0gZ2V0X3Byb3BlcnR5KG4sIG5hbWUsICZwcm9wbGVuKTsKKwlpZiAocHJvcGxlbiAhPSBzaXplb2YgKHN0cnVjdCBhZGRyZXNzX3Byb3ApKQorCQlyZXR1cm4gTlVMTDsKKworCXByb3AgPSBwOworCisJZXJyID0gY2VsbF9zcHVwcm9wX3ByZXNlbnQoc3B1LCBuLCBuYW1lKTsKKwlpZiAoZXJyICYmIChlcnIgIT0gLUVFWElTVCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW9yZW1hcChwcm9wLT5hZGRyZXNzLCBwcm9wLT5sZW4pOworCisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV91bm1hcChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJaW91bm1hcChzcHUtPnByaXYyKTsKKwlpb3VubWFwKHNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEpOworCWlvdW5tYXAoc3B1LT5wcm9ibGVtKTsKKwlpb3VubWFwKChfX2ZvcmNlIHU4IF9faW9tZW0gKilzcHUtPmxvY2FsX3N0b3JlKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3B1X21hcF9pbnRlcnJ1cHRzX29sZChzdHJ1Y3Qgc3B1ICpzcHUsCisJc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1bnNpZ25lZCBpbnQgaXNyYzsKKwljb25zdCB1MzIgKnRtcDsKKworCS8qIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZSB1bml0IGZyb20gdGhlIGRldmljZS10cmVlICovCisJdG1wID0gZ2V0X3Byb3BlcnR5KG5wLCAiaXNyYyIsIE5VTEwpOworCWlmICghdG1wKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpc3JjID0gdG1wWzBdOworCisJLyogQWRkIHRoZSBub2RlIG51bWJlciAqLworCWlzcmMgfD0gc3B1LT5ub2RlIDw8IElJQ19JUlFfTk9ERV9TSElGVDsKKworCS8qIE5vdyBtYXAgaW50ZXJydXB0cyBvZiBhbGwgMyBjbGFzc2VzICovCisJc3B1LT5pcnFzWzBdID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIElJQ19JUlFfQ0xBU1NfMCB8IGlzcmMpOworCXNwdS0+aXJxc1sxXSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBJSUNfSVJRX0NMQVNTXzEgfCBpc3JjKTsKKwlzcHUtPmlycXNbMl0gPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgSUlDX0lSUV9DTEFTU18yIHwgaXNyYyk7CisKKwkvKiBSaWdodCBub3csIHdlIG9ubHkgZmFpbCBpZiBjbGFzcyAyIGZhaWxlZCAqLworCXJldHVybiBzcHUtPmlycXNbMl0gPT0gTk9fSVJRID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNwdV9tYXBfZGV2aWNlX29sZChzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwljb25zdCBjaGFyICpwcm9wOworCWludCByZXQ7CisKKwlyZXQgPSAtRU5PREVWOworCXNwdS0+bmFtZSA9IGdldF9wcm9wZXJ0eShub2RlLCAibmFtZSIsIE5VTEwpOworCWlmICghc3B1LT5uYW1lKQorCQlnb3RvIG91dDsKKworCXByb3AgPSBnZXRfcHJvcGVydHkobm9kZSwgImxvY2FsLXN0b3JlIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG91dDsKKwlzcHUtPmxvY2FsX3N0b3JlX3BoeXMgPSAqKHVuc2lnbmVkIGxvbmcgKilwcm9wOworCisJLyogd2UgdXNlIGxvY2FsIHN0b3JlIGFzIHJhbSwgbm90IGlvIG1lbW9yeSAqLworCXNwdS0+bG9jYWxfc3RvcmUgPSAodm9pZCBfX2ZvcmNlICopCisJCW1hcF9zcGVfcHJvcChzcHUsIG5vZGUsICJsb2NhbC1zdG9yZSIpOworCWlmICghc3B1LT5sb2NhbF9zdG9yZSkKKwkJZ290byBvdXQ7CisKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJwcm9ibGVtIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG91dF91bm1hcDsKKwlzcHUtPnByb2JsZW1fcGh5cyA9ICoodW5zaWduZWQgbG9uZyAqKXByb3A7CisKKwlzcHUtPnByb2JsZW09IG1hcF9zcGVfcHJvcChzcHUsIG5vZGUsICJwcm9ibGVtIik7CisJaWYgKCFzcHUtPnByb2JsZW0pCisJCWdvdG8gb3V0X3VubWFwOworCisJc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MT0gbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgInByaXYxIik7CisKKwlzcHUtPnByaXYyPSBtYXBfc3BlX3Byb3Aoc3B1LCBub2RlLCAicHJpdjIiKTsKKwlpZiAoIXNwdS0+cHJpdjIpCisJCWdvdG8gb3V0X3VubWFwOworCXJldCA9IDA7CisJZ290byBvdXQ7CisKK291dF91bm1hcDoKKwlzcHVfdW5tYXAoc3B1KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBzcHVfbWFwX2ludGVycnVwdHMoc3RydWN0IHNwdSAqc3B1LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBvZl9pcnEgb2lycTsKKwlpbnQgcmV0OworCWludCBpOworCisJZm9yIChpPTA7IGkgPCAzOyBpKyspIHsKKwkJcmV0ID0gb2ZfaXJxX21hcF9vbmUobnAsIGksICZvaXJxKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZGVidWcoInNwdV9uZXc6IGZhaWxlZCB0byBnZXQgaXJxICVkXG4iLCBpKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXJldCA9IC1FSU5WQUw7CisJCXByX2RlYnVnKCIgIGlycSAlZCBubyAweCV4IG9uICVzXG4iLCBpLCBvaXJxLnNwZWNpZmllclswXSwKKwkJCSBvaXJxLmNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7CisJCXNwdS0+aXJxc1tpXSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsCisJCQkJCW9pcnEuc3BlY2lmaWVyLCBvaXJxLnNpemUpOworCQlpZiAoc3B1LT5pcnFzW2ldID09IE5PX0lSUSkgeworCQkJcHJfZGVidWcoInNwdV9uZXc6IGZhaWxlZCB0byBtYXAgaXQgIVxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZXJyOgorCXByX2RlYnVnKCJmYWlsZWQgdG8gbWFwIGlycSAleCBmb3Igc3B1ICVzXG4iLCAqb2lycS5zcGVjaWZpZXIsCisJCXNwdS0+bmFtZSk7CisJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzcHUtPmlycXNbaV0gIT0gTk9fSVJRKQorCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhzcHUtPmlycXNbaV0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNwdV9tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgbnIsCisJCXZvaWQgX19pb21lbSoqIHZpcnQsIHVuc2lnbmVkIGxvbmcgKnBoeXMpCit7CisJc3RydWN0IHJlc291cmNlIHJlc291cmNlID0geyB9OworCWludCByZXQ7CisKKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIG5yLCAmcmVzb3VyY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHBoeXMpCisJCSpwaHlzID0gcmVzb3VyY2Uuc3RhcnQ7CisJKnZpcnQgPSBpb3JlbWFwKHJlc291cmNlLnN0YXJ0LCByZXNvdXJjZS5lbmQgLSByZXNvdXJjZS5zdGFydCk7CisJaWYgKCEqdmlydCkKKwkJcmV0ID0gLUVJTlZBTDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNwdV9tYXBfZGV2aWNlKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCWludCByZXQgPSAtRU5PREVWOworCXNwdS0+bmFtZSA9IGdldF9wcm9wZXJ0eShub2RlLCAibmFtZSIsIE5VTEwpOworCWlmICghc3B1LT5uYW1lKQorCQlnb3RvIG91dDsKKworCXJldCA9IHNwdV9tYXBfcmVzb3VyY2Uobm9kZSwgMCwgKHZvaWQgX19pb21lbSoqKSZzcHUtPmxvY2FsX3N0b3JlLAorCQkJCQkmc3B1LT5sb2NhbF9zdG9yZV9waHlzKTsKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCJzcHVfbmV3OiBmYWlsZWQgdG8gbWFwICVzIHJlc291cmNlIDBcbiIsCisJCQkgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IHNwdV9tYXBfcmVzb3VyY2Uobm9kZSwgMSwgKHZvaWQgX19pb21lbSoqKSZzcHUtPnByb2JsZW0sCisJCQkJCSZzcHUtPnByb2JsZW1fcGh5cyk7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCAlcyByZXNvdXJjZSAxXG4iLAorCQkJIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKwlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDIsICh2b2lkIF9faW9tZW0qKikmc3B1LT5wcml2MiwKKwkJCQkJTlVMTCk7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCAlcyByZXNvdXJjZSAyXG4iLAorCQkJIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCisJCXJldCA9IHNwdV9tYXBfcmVzb3VyY2Uobm9kZSwgMywKKwkJCSh2b2lkIF9faW9tZW0qKikmc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MSwgTlVMTCk7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1Zygic3B1X25ldzogZmFpbGVkIHRvIG1hcCAlcyByZXNvdXJjZSAzXG4iLAorCQkJIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKwlwcl9kZWJ1Zygic3B1X25ldzogJXMgbWFwczpcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJcHJfZGVidWcoIiAgbG9jYWwgc3RvcmUgICA6IDB4JTAxNmx4IC0+IDB4JXBcbiIsCisJCSBzcHUtPmxvY2FsX3N0b3JlX3BoeXMsIHNwdS0+bG9jYWxfc3RvcmUpOworCXByX2RlYnVnKCIgIHByb2JsZW0gc3RhdGUgOiAweCUwMTZseCAtPiAweCVwXG4iLAorCQkgc3B1LT5wcm9ibGVtX3BoeXMsIHNwdS0+cHJvYmxlbSk7CisJcHJfZGVidWcoIiAgcHJpdjIgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAweCVwXG4iLCBzcHUtPnByaXYyKTsKKwlwcl9kZWJ1ZygiICBwcml2MSAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgIDB4JXBcbiIsCisJCQkJCQlzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJc3B1X3VubWFwKHNwdSk7CitvdXQ6CisJcHJfZGVidWcoImZhaWxlZCB0byBtYXAgc3BlICVzOiAlZFxuIiwgc3B1LT5uYW1lLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9mX2VudW1lcmF0ZV9zcHVzKGludCAoKmZuKSh2b2lkICpkYXRhKSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKworCXJldCA9IC1FTk9ERVY7CisJZm9yIChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNwZSIpOworCQkJbm9kZTsgbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5vZGUsICJzcGUiKSkgeworCQlyZXQgPSBmbihub2RlKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIGluaXRpYWxpemluZyAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgb2ZfY3JlYXRlX3NwdShzdHJ1Y3Qgc3B1ICpzcHUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNwZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilkYXRhOworCisJc3B1LT5wZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcHVfcGRhdGEpLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNwdS0+cGRhdGEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJc3B1LT5ub2RlID0gZmluZF9zcHVfbm9kZV9pZChzcGUpOworCWlmIChzcHUtPm5vZGUgPj0gTUFYX05VTU5PREVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNQRSAlcyBvbiBub2RlICVkIGlnbm9yZWQsIgorCQkgICAgICAgIiBub2RlIG51bWJlciB0b28gYmlnXG4iLCBzcGUtPmZ1bGxfbmFtZSwgc3B1LT5ub2RlKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2hlY2sgaWYgQ09ORklHX05VTUEgaXMgZW5hYmxlZC5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXNwdV9nZXRfcGRhdGEoc3B1KS0+bmlkID0gb2Zfbm9kZV90b19uaWQoc3BlKTsKKwlpZiAoc3B1X2dldF9wZGF0YShzcHUpLT5uaWQgPT0gLTEpCisJCXNwdV9nZXRfcGRhdGEoc3B1KS0+bmlkID0gMDsKKworCXJldCA9IHNwdV9tYXBfZGV2aWNlKHNwdSwgc3BlKTsKKwkvKiB0cnkgb2xkIG1ldGhvZCAqLworCWlmIChyZXQpCisJCXJldCA9IHNwdV9tYXBfZGV2aWNlX29sZChzcHUsIHNwZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKworCXJldCA9IHNwdV9tYXBfaW50ZXJydXB0cyhzcHUsIHNwZSk7CisJaWYgKHJldCkKKwkJcmV0ID0gc3B1X21hcF9pbnRlcnJ1cHRzX29sZChzcHUsIHNwZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5tYXA7CisKKwlzcHVfZ2V0X3BkYXRhKHNwdSktPmRldm5vZGUgPSBvZl9ub2RlX2dldChzcGUpOworCisJcHJfZGVidWcoS0VSTl9ERUJVRyAiVXNpbmcgU1BFICVzICVwICVwICVwICVwICVkXG4iLCBzcHUtPm5hbWUsCisJCXNwdS0+bG9jYWxfc3RvcmUsIHNwdS0+cHJvYmxlbSwgc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MSwKKwkJc3B1LT5wcml2Miwgc3B1LT5udW1iZXIpOworCWdvdG8gb3V0OworCitvdXRfdW5tYXA6CisJc3B1X3VubWFwKHNwdSk7CitvdXRfZnJlZToKKwlrZnJlZShzcHUtPnBkYXRhKTsKKwlzcHUtPnBkYXRhID0gTlVMTDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9mX2Rlc3Ryb3lfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzcHVfdW5tYXAoc3B1KTsKKwlvZl9ub2RlX3B1dChzcHVfZ2V0X3BkYXRhKHNwdSktPmRldm5vZGUpOworCWtmcmVlKHNwdS0+cGRhdGEpOworCXNwdS0+cGRhdGEgPSBOVUxMOworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzIHNwdV9tYW5hZ2VtZW50X29mX29wcyA9IHsKKwkuZW51bWVyYXRlX3NwdXMgPSBvZl9lbnVtZXJhdGVfc3B1cywKKwkuY3JlYXRlX3NwdSA9IG9mX2NyZWF0ZV9zcHUsCisJLmRlc3Ryb3lfc3B1ID0gb2ZfZGVzdHJveV9zcHUsCit9OwogCiBzdGF0aWMgdm9pZCBpbnRfbWFza19hbmQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQogewogCXU2NCBvbGRfbWFzazsKIAotCW9sZF9tYXNrID0gaW5fYmU2NCgmc3B1LT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdKTsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdLCBvbGRfbWFzayAmIG1hc2spOworCW9sZF9tYXNrID0gaW5fYmU2NCgmc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdKTsKKwlvdXRfYmU2NCgmc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdLAorCQlvbGRfbWFzayAmIG1hc2spOwogfQogCiBzdGF0aWMgdm9pZCBpbnRfbWFza19vcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCiB7CiAJdTY0IG9sZF9tYXNrOwogCi0Jb2xkX21hc2sgPSBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOwotCW91dF9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10sIG9sZF9tYXNrIHwgbWFzayk7CisJb2xkX21hc2sgPSBpbl9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOworCW91dF9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10sCisJCW9sZF9tYXNrIHwgbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGludF9tYXNrX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCiB7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSwgbWFzayk7CisJb3V0X2JlNjQoJnNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSwgbWFzayk7CiB9CiAKIHN0YXRpYyB1NjQgaW50X21hc2tfZ2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzKQogewotCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOworCXJldHVybiBpbl9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOwogfQogCiBzdGF0aWMgdm9pZCBpbnRfc3RhdF9jbGVhcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IHN0YXQpCiB7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9zdGF0X1JXW2NsYXNzXSwgc3RhdCk7CisJb3V0X2JlNjQoJnNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEtPmludF9zdGF0X1JXW2NsYXNzXSwgc3RhdCk7CiB9CiAKIHN0YXRpYyB1NjQgaW50X3N0YXRfZ2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzKQogewotCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfc3RhdF9SV1tjbGFzc10pOworCXJldHVybiBpbl9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5pbnRfc3RhdF9SV1tjbGFzc10pOwogfQogCiBzdGF0aWMgdm9pZCBjcHVfYWZmaW5pdHlfc2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNwdSkKIHsKIAl1NjQgdGFyZ2V0ID0gaWljX2dldF90YXJnZXRfaWQoY3B1KTsKIAl1NjQgcm91dGUgPSB0YXJnZXQgPDwgNDggfCB0YXJnZXQgPDwgMzIgfCB0YXJnZXQgPDwgMTY7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9yb3V0ZV9SVywgcm91dGUpOworCW91dF9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5pbnRfcm91dGVfUlcsIHJvdXRlKTsKIH0KIAogc3RhdGljIHU2NCBtZmNfZGFyX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0JcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPm1mY19kYXJfUlcpOworCXJldHVybiBpbl9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5tZmNfZGFyX1JXKTsKIH0KIAogc3RhdGljIHU2NCBtZmNfZHNpc3JfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKIHsKLQlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX2RzaXNyX1JXKTsKKwlyZXR1cm4gaW5fYmU2NCgmc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MS0+bWZjX2RzaXNyX1JXKTsKIH0KIAogc3RhdGljIHZvaWQgbWZjX2RzaXNyX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBkc2lzcikKIHsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+bWZjX2RzaXNyX1JXLCBkc2lzcik7CisJb3V0X2JlNjQoJnNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEtPm1mY19kc2lzcl9SVywgZHNpc3IpOwogfQogCi1zdGF0aWMgdm9pZCBtZmNfc2RyX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBzZHIpCitzdGF0aWMgdm9pZCBtZmNfc2RyX3NldHVwKHN0cnVjdCBzcHUgKnNwdSkKIHsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+bWZjX3Nkcl9SVywgc2RyKTsKKwlvdXRfYmU2NCgmc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MS0+bWZjX3Nkcl9SVywgbWZzcHIoU1BSTl9TRFIxKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1mY19zcjFfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSkKIHsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+bWZjX3NyMV9SVywgc3IxKTsKKwlvdXRfYmU2NCgmc3B1X2dldF9wZGF0YShzcHUpLT5wcml2MS0+bWZjX3NyMV9SVywgc3IxKTsKIH0KIAogc3RhdGljIHU2NCBtZmNfc3IxX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0JcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPm1mY19zcjFfUlcpOworCXJldHVybiBpbl9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5tZmNfc3IxX1JXKTsKIH0KIAogc3RhdGljIHZvaWQgbWZjX3RjbGFzc19pZF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgdGNsYXNzX2lkKQogewotCW91dF9iZTY0KCZzcHUtPnByaXYxLT5tZmNfdGNsYXNzX2lkX1JXLCB0Y2xhc3NfaWQpOworCW91dF9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5tZmNfdGNsYXNzX2lkX1JXLCB0Y2xhc3NfaWQpOwogfQogCiBzdGF0aWMgdTY0IG1mY190Y2xhc3NfaWRfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKIHsKLQlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX3RjbGFzc19pZF9SVyk7CisJcmV0dXJuIGluX2JlNjQoJnNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEtPm1mY190Y2xhc3NfaWRfUlcpOwogfQogCiBzdGF0aWMgdm9pZCB0bGJfaW52YWxpZGF0ZShzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnRsYl9pbnZhbGlkYXRlX2VudHJ5X1csIDB1bCk7CisJb3V0X2JlNjQoJnNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEtPnRsYl9pbnZhbGlkYXRlX2VudHJ5X1csIDB1bCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgaWQpCiB7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9SVywgaWQpOworCW91dF9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfUlcsCisJCWlkKTsKIH0KIAogc3RhdGljIHU2NCByZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKIHsKLQlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+cmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX1JXKTsKKwlyZXR1cm4gaW5fYmU2NCgKKwkJJnNwdV9nZXRfcGRhdGEoc3B1KS0+cHJpdjEtPnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9SVyk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBlbmFibGUpCiB7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX1JXLCBlbmFibGUpOworCW91dF9iZTY0KCZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVywKKwkJZW5hYmxlKTsKIH0KIAogc3RhdGljIHU2NCByZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3RydWN0IHNwdSAqc3B1KQogewotCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVyk7CisJcmV0dXJuIGluX2JlNjQoCisJCSZzcHVfZ2V0X3BkYXRhKHNwdSktPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVyk7CiB9CiAKIGNvbnN0IHN0cnVjdCBzcHVfcHJpdjFfb3BzIHNwdV9wcml2MV9tbWlvX29wcyA9CkBAIC0xNDYsNyArNTI0LDcgQEAKIAkubWZjX2Rhcl9nZXQgPSBtZmNfZGFyX2dldCwKIAkubWZjX2RzaXNyX2dldCA9IG1mY19kc2lzcl9nZXQsCiAJLm1mY19kc2lzcl9zZXQgPSBtZmNfZHNpc3Jfc2V0LAotCS5tZmNfc2RyX3NldCA9IG1mY19zZHJfc2V0LAorCS5tZmNfc2RyX3NldHVwID0gbWZjX3Nkcl9zZXR1cCwKIAkubWZjX3NyMV9zZXQgPSBtZmNfc3IxX3NldCwKIAkubWZjX3NyMV9nZXQgPSBtZmNfc3IxX2dldCwKIAkubWZjX3RjbGFzc19pZF9zZXQgPSBtZmNfdGNsYXNzX2lkX3NldCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MV9tbWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2MmJkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBzcHUgaHlwZXJ2aXNvciBhYnN0cmFjdGlvbiBmb3IgZGlyZWN0IGhhcmR3YXJlIGFjY2Vzcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgU1BVX1BSSVYxX01NSU9fSAorI2RlZmluZSBTUFVfUFJJVjFfTU1JT19ICisKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqc3B1X2Rldm5vZGUoc3RydWN0IHNwdSAqc3B1KTsKKworI2VuZGlmIC8qIFNQVV9QUklWMV9NTUlPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9NYWtlZmlsZQppbmRleCBlY2RmYmIzLi40NzIyMTdkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogb2JqLXkgKz0gc3dpdGNoLm8KIAogb2JqLSQoQ09ORklHX1NQVV9GUykgKz0gc3B1ZnMubwotc3B1ZnMteSArPSBpbm9kZS5vIGZpbGUubyBjb250ZXh0Lm8gc3lzY2FsbHMubworc3B1ZnMteSArPSBpbm9kZS5vIGZpbGUubyBjb250ZXh0Lm8gc3lzY2FsbHMubyBjb3JlZHVtcC5vCiBzcHVmcy15ICs9IHNjaGVkLm8gYmFja2luZ19vcHMubyBod19vcHMubyBydW4ubyBnYW5nLm8KIAogIyBSdWxlcyB0byBidWlsZCBzd2l0Y2gubyB3aXRoIHRoZSBoZWxwIG9mIFNQVSB0b29sIGNoYWluCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCmluZGV4IDJkMjJjZDUuLjE4OThmMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CisjaW5jbHVkZSA8YXNtL3NwdV9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSAic3B1ZnMuaCIKIApAQCAtMjY3LDYgKzI2OCwxMSBAQAogCXJldHVybiBjdHgtPmNzYS5sc2NzYS0+bHM7CiB9CiAKK3N0YXRpYyB1MzIgc3B1X2JhY2tpbmdfcnVuY250bF9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmNzYS5wcm9iLnNwdV9ydW5jbnRsX1JXOworfQorCiBzdGF0aWMgdm9pZCBzcHVfYmFja2luZ19ydW5jbnRsX3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgdmFsKQogewogCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CkBAIC0yNzksOSArMjg1LDI2IEBACiAJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzcHVfYmFja2luZ19ydW5jbnRsX3N0b3Aoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBzcHVfYmFja2luZ19tYXN0ZXJfc3RhcnQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0Jc3B1X2JhY2tpbmdfcnVuY250bF93cml0ZShjdHgsIFNQVV9SVU5DTlRMX1NUT1ApOworCXN0cnVjdCBzcHVfc3RhdGUgKmNzYSA9ICZjdHgtPmNzYTsKKwl1NjQgc3IxOworCisJc3Bpbl9sb2NrKCZjc2EtPnJlZ2lzdGVyX2xvY2spOworCXNyMSA9IGNzYS0+cHJpdjEubWZjX3NyMV9SVyB8IE1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0s7CisJY3NhLT5wcml2MS5tZmNfc3IxX1JXID0gc3IxOworCXNwaW5fdW5sb2NrKCZjc2EtPnJlZ2lzdGVyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzcHVfYmFja2luZ19tYXN0ZXJfc3RvcChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EgPSAmY3R4LT5jc2E7CisJdTY0IHNyMTsKKworCXNwaW5fbG9jaygmY3NhLT5yZWdpc3Rlcl9sb2NrKTsKKwlzcjEgPSBjc2EtPnByaXYxLm1mY19zcjFfUlcgJiB+TUZDX1NUQVRFMV9NQVNURVJfUlVOX0NPTlRST0xfTUFTSzsKKwljc2EtPnByaXYxLm1mY19zcjFfUlcgPSBzcjE7CisJc3Bpbl91bmxvY2soJmNzYS0+cmVnaXN0ZXJfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgc3B1X2JhY2tpbmdfc2V0X21mY19xdWVyeShzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsIHUzMiBtYXNrLApAQCAtMzQ1LDggKzM2OCwxMCBAQAogCS5ucGNfd3JpdGUgPSBzcHVfYmFja2luZ19ucGNfd3JpdGUsCiAJLnN0YXR1c19yZWFkID0gc3B1X2JhY2tpbmdfc3RhdHVzX3JlYWQsCiAJLmdldF9scyA9IHNwdV9iYWNraW5nX2dldF9scywKKwkucnVuY250bF9yZWFkID0gc3B1X2JhY2tpbmdfcnVuY250bF9yZWFkLAogCS5ydW5jbnRsX3dyaXRlID0gc3B1X2JhY2tpbmdfcnVuY250bF93cml0ZSwKLQkucnVuY250bF9zdG9wID0gc3B1X2JhY2tpbmdfcnVuY250bF9zdG9wLAorCS5tYXN0ZXJfc3RhcnQgPSBzcHVfYmFja2luZ19tYXN0ZXJfc3RhcnQsCisJLm1hc3Rlcl9zdG9wID0gc3B1X2JhY2tpbmdfbWFzdGVyX3N0b3AsCiAJLnNldF9tZmNfcXVlcnkgPSBzcHVfYmFja2luZ19zZXRfbWZjX3F1ZXJ5LAogCS5yZWFkX21mY190YWdzdGF0dXMgPSBzcHVfYmFja2luZ19yZWFkX21mY190YWdzdGF0dXMsCiAJLmdldF9tZmNfZnJlZV9lbGVtZW50cyA9IHNwdV9iYWNraW5nX2dldF9tZmNfZnJlZV9lbGVtZW50cywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCmluZGV4IDAzNGNmNmEuLjA4NzAwMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwpAQCAtMTIwLDYgKzEyMCwzMyBAQAogCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGN0eC0+c2lnbmFsMiwgMCwgMHg0MDAwLCAxKTsKIH0KIAoraW50IHNwdV9hY3F1aXJlX2V4Y2x1c2l2ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRvd25fd3JpdGUoJmN0eC0+c3RhdGVfc2VtYSk7CisJLyogY3R4IGlzIGFib3V0IHRvIGJlIGZyZWVkLCBjYW4ndCBhY3F1aXJlIGFueSBtb3JlICovCisJaWYgKCFjdHgtPm93bmVyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgeworCQlyZXQgPSBzcHVfYWN0aXZhdGUoY3R4LCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQljdHgtPnN0YXRlID0gU1BVX1NUQVRFX1JVTk5BQkxFOworCX0gZWxzZSB7CisJCS8qIFdlIG5lZWQgdG8gZXhjbHVkZSB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZSBjb250ZXh0LiAqLworCQlzcHVfdW5tYXBfbWFwcGluZ3MoY3R4KTsKKwl9CisKK291dDoKKwlpZiAocmV0KQorCQl1cF93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgc3B1X2FjcXVpcmVfcnVubmFibGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJaW50IHJldCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTQ1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIFNQVSBjb3JlIGR1bXAgY29kZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycC4KKyAqCisgKiBBdXRob3I6IER3YXluZSBHcmFudCBNY0Nvbm5lbGwgPGRlY2ltYWxAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzcHVmcy5oIgorCitzdHJ1Y3Qgc3B1ZnNfY3R4X2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgZGZkOworCWludCBtZW1zaXplOyAvKiBpbiBieXRlcyAqLworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OworfTsKKworc3RhdGljIExJU1RfSEVBRChjdHhfaW5mb19saXN0KTsKKworc3RhdGljIHNzaXplX3QgZG9fY29yZWR1bXBfcmVhZChpbnQgbnVtLCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICpvZmYpCit7CisJdTY0IGRhdGE7CisJaW50IHJldDsKKworCWlmIChzcHVmc19jb3JlZHVtcF9yZWFkW251bV0ucmVhZCkKKwkJcmV0dXJuIHNwdWZzX2NvcmVkdW1wX3JlYWRbbnVtXS5yZWFkKGN0eCwgYnVmZmVyLCBzaXplLCBvZmYpOworCisJZGF0YSA9IHNwdWZzX2NvcmVkdW1wX3JlYWRbbnVtXS5nZXQoY3R4KTsKKwlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCAmZGF0YSwgOCk7CisJcmV0dXJuIHJldCA/IC1FRkFVTFQgOiA4OworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBvbmx5IHRoaW5ncyB5b3Ugc2hvdWxkIGRvIG9uIGEgY29yZS1maWxlOiB1c2Ugb25seSB0aGVzZQorICogZnVuY3Rpb25zIHRvIHdyaXRlIG91dCBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvLgorICovCitzdGF0aWMgaW50IHNwdWZzX2R1bXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmFkZHIsIGludCBucikKK3sKKwlyZXR1cm4gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwgYWRkciwgbnIsICZmaWxlLT5mX3BvcykgPT0gbnI7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfZHVtcF9zZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmKQoreworCWlmIChmaWxlLT5mX29wLT5sbHNlZWspIHsKKwkJaWYgKGZpbGUtPmZfb3AtPmxsc2VlayhmaWxlLCBvZmYsIDApICE9IG9mZikKKwkJCXJldHVybiAwOworCX0gZWxzZQorCQlmaWxlLT5mX3BvcyA9IG9mZjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3B1ZnNfZmlsbF9tZW1zaXplKHN0cnVjdCBzcHVmc19jdHhfaW5mbyAqY3R4X2luZm8pCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisJdW5zaWduZWQgbG9uZyBsb25nIGxzbHI7CisKKwljdHggPSBjdHhfaW5mby0+Y3R4OworCWxzbHIgPSBjdHgtPmNzYS5wcml2Mi5zcHVfbHNscl9SVzsKKwljdHhfaW5mby0+bWVtc2l6ZSA9IGxzbHIgKyAxOworfQorCitzdGF0aWMgaW50IHNwdWZzX2N0eF9ub3RlX3NpemUoc3RydWN0IHNwdWZzX2N0eF9pbmZvICpjdHhfaW5mbykKK3sKKwlpbnQgZGZkLCBtZW1zaXplLCBpLCBzeiwgdG90YWwgPSAwOworCWNoYXIgKm5hbWU7CisJY2hhciBmdWxsbmFtZVs4MF07CisKKwlkZmQgPSBjdHhfaW5mby0+ZGZkOworCW1lbXNpemUgPSBjdHhfaW5mby0+bWVtc2l6ZTsKKworCWZvciAoaSA9IDA7IHNwdWZzX2NvcmVkdW1wX3JlYWRbaV0ubmFtZTsgaSsrKSB7CisJCW5hbWUgPSBzcHVmc19jb3JlZHVtcF9yZWFkW2ldLm5hbWU7CisJCXN6ID0gc3B1ZnNfY29yZWR1bXBfcmVhZFtpXS5zaXplOworCisJCXNwcmludGYoZnVsbG5hbWUsICJTUFUvJWQvJXMiLCBkZmQsIG5hbWUpOworCisJCXRvdGFsICs9IHNpemVvZihzdHJ1Y3QgZWxmX25vdGUpOworCQl0b3RhbCArPSByb3VuZHVwKHN0cmxlbihmdWxsbmFtZSkgKyAxLCA0KTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgIm1lbSIpKQorCQkJdG90YWwgKz0gcm91bmR1cChtZW1zaXplLCA0KTsKKwkJZWxzZQorCQkJdG90YWwgKz0gcm91bmR1cChzeiwgNCk7CisJfQorCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgaW50IHNwdWZzX2FkZF9vbmVfY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRmZCkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3Qgc3B1ZnNfY3R4X2luZm8gKmN0eF9pbmZvOworCWludCBzaXplOworCisJY3R4ID0gU1BVRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmlfY3R4OworCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXR1cm4gMDsKKworCWN0eF9pbmZvID0ga3phbGxvYyhzaXplb2YoKmN0eF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFjdHhfaW5mbykpCisJCXJldHVybiAtRU5PTUVNOworCisJY3R4X2luZm8tPmRmZCA9IGRmZDsKKwljdHhfaW5mby0+Y3R4ID0gY3R4OworCisJc3B1ZnNfZmlsbF9tZW1zaXplKGN0eF9pbmZvKTsKKworCXNpemUgPSBzcHVmc19jdHhfbm90ZV9zaXplKGN0eF9pbmZvKTsKKwlsaXN0X2FkZCgmY3R4X2luZm8tPmxpc3QsICZjdHhfaW5mb19saXN0KTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIFRoZSBhZGRpdGlvbmFsIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBub3RlcyBmb3IgQ2VsbCBhcmUgdmFyaW91cworICogY29udGV4dCBmaWxlcyBpbiB0aGUgc3B1IGNvbnRleHQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHNlZXMKKyAqIGlmIHRoZXkgYXJlIGEgZGlyZWN0b3J5IGluIHNwdWZzLiAgSW4gdGhhdCBjYXNlIHdlIHVzZSBzcHVmcworICogaW50ZXJuYWwgZnVuY3Rpb25hbGl0eSB0byBkdW1wIHRoZW0gd2l0aG91dCBuZWVkaW5nIHRvIGFjdHVhbGx5CisgKiBvcGVuIHRoZSBmaWxlcy4KKyAqLworc3RhdGljIGludCBzcHVmc19hcmNoX25vdGVzX3NpemUodm9pZCkKK3sKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJaW50IHNpemUgPSAwLCBmZDsKKworCWZvciAoZmQgPSAwOyBmZCA8IGZkdC0+bWF4X2Zkc2V0ICYmIGZkIDwgZmR0LT5tYXhfZmRzOyBmZCsrKSB7CisJCWlmIChGRF9JU1NFVChmZCwgZmR0LT5vcGVuX2ZkcykpIHsKKwkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmNoZWNrKGZkKTsKKworCQkJaWYgKGZpbGUgJiYgZmlsZS0+Zl9vcCA9PSAmc3B1ZnNfY29udGV4dF9mb3BzKSB7CisJCQkJaW50IHJ2YWwgPSBzcHVmc19hZGRfb25lX2NvbnRleHQoZmlsZSwgZmQpOworCQkJCWlmIChydmFsIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJc2l6ZSArPSBydmFsOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIHNwdWZzX2FyY2hfd3JpdGVfbm90ZShzdHJ1Y3Qgc3B1ZnNfY3R4X2luZm8gKmN0eF9pbmZvLCBpbnQgaSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKKwlsb2ZmX3QgcG9zID0gMDsKKwlpbnQgc3osIGRmZCwgcmMsIHRvdGFsID0gMDsKKwljb25zdCBpbnQgYnVmc3ogPSA0MDk2OworCWNoYXIgKm5hbWU7CisJY2hhciBmdWxsbmFtZVs4MF0sICpidWY7CisJc3RydWN0IGVsZl9ub3RlIGVuOworCisJYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWRmZCA9IGN0eF9pbmZvLT5kZmQ7CisJbmFtZSA9IHNwdWZzX2NvcmVkdW1wX3JlYWRbaV0ubmFtZTsKKworCWlmICghc3RyY21wKG5hbWUsICJtZW0iKSkKKwkJc3ogPSBjdHhfaW5mby0+bWVtc2l6ZTsKKwllbHNlCisJCXN6ID0gc3B1ZnNfY29yZWR1bXBfcmVhZFtpXS5zaXplOworCisJY3R4ID0gY3R4X2luZm8tPmN0eDsKKwlpZiAoIWN0eCkgeworCQlyZXR1cm47CisJfQorCisJc3ByaW50ZihmdWxsbmFtZSwgIlNQVS8lZC8lcyIsIGRmZCwgbmFtZSk7CisJZW4ubl9uYW1lc3ogPSBzdHJsZW4oZnVsbG5hbWUpICsgMTsKKwllbi5uX2Rlc2NzeiA9IHN6OworCWVuLm5fdHlwZSA9IE5UX1NQVTsKKworCWlmICghc3B1ZnNfZHVtcF93cml0ZShmaWxlLCAmZW4sIHNpemVvZihlbikpKQorCQlyZXR1cm47CisJaWYgKCFzcHVmc19kdW1wX3dyaXRlKGZpbGUsIGZ1bGxuYW1lLCBlbi5uX25hbWVzeikpCisJCXJldHVybjsKKwlpZiAoIXNwdWZzX2R1bXBfc2VlayhmaWxlLCByb3VuZHVwKCh1bnNpZ25lZCBsb25nKWZpbGUtPmZfcG9zLCA0KSkpCisJCXJldHVybjsKKworCWRvIHsKKwkJcmMgPSBkb19jb3JlZHVtcF9yZWFkKGksIGN0eCwgYnVmLCBidWZzeiwgJnBvcyk7CisJCWlmIChyYyA+IDApIHsKKwkJCWlmICghc3B1ZnNfZHVtcF93cml0ZShmaWxlLCBidWYsIHJjKSkKKwkJCQlyZXR1cm47CisJCQl0b3RhbCArPSByYzsKKwkJfQorCX0gd2hpbGUgKHJjID09IGJ1ZnN6ICYmIHRvdGFsIDwgc3opOworCisJc3B1ZnNfZHVtcF9zZWVrKGZpbGUsIHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpZmlsZS0+Zl9wb3MKKwkJCQkJCS0gdG90YWwgKyBzeiwgNCkpOworfQorCitzdGF0aWMgdm9pZCBzcHVmc19hcmNoX3dyaXRlX25vdGVzKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBqOworCXN0cnVjdCBzcHVmc19jdHhfaW5mbyAqY3R4X2luZm8sICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN0eF9pbmZvLCBuZXh0LCAmY3R4X2luZm9fbGlzdCwgbGlzdCkgeworCQlzcHVfYWNxdWlyZV9zYXZlZChjdHhfaW5mby0+Y3R4KTsKKwkJZm9yIChqID0gMDsgaiA8IHNwdWZzX2NvcmVkdW1wX251bV9ub3RlczsgaisrKQorCQkJc3B1ZnNfYXJjaF93cml0ZV9ub3RlKGN0eF9pbmZvLCBqLCBmaWxlKTsKKwkJc3B1X3JlbGVhc2UoY3R4X2luZm8tPmN0eCk7CisJCWxpc3RfZGVsKCZjdHhfaW5mby0+bGlzdCk7CisJCWtmcmVlKGN0eF9pbmZvKTsKKwl9Cit9CisKK3N0cnVjdCBzcHVfY29yZWR1bXBfY2FsbHMgc3B1ZnNfY29yZWR1bXBfY2FsbHMgPSB7CisJLmFyY2hfbm90ZXNfc2l6ZSA9IHNwdWZzX2FyY2hfbm90ZXNfc2l6ZSwKKwkuYXJjaF93cml0ZV9ub3RlcyA9IHNwdWZzX2FyY2hfd3JpdGVfbm90ZXMsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKaW5kZXggNTMzZTI3Mi4uMzQ3ZWZmNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC0zMiwxMyArMzIsMTMgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfaW5mby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJzcHVmcy5oIgogCiAjZGVmaW5lIFNQVUZTX01NQVBfNEsgKFBBR0VfU0laRSA9PSAweDEwMDApCiAKLQogc3RhdGljIGludAogc3B1ZnNfbWVtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC01MSwxOCArNTEsMjMgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKK19fc3B1ZnNfbWVtX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJY2hhciAqbG9jYWxfc3RvcmUgPSBjdHgtPm9wcy0+Z2V0X2xzKGN0eCk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwgcG9zLCBsb2NhbF9zdG9yZSwKKwkJCQkJTFNfU0laRSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CiBzcHVmc19tZW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqbG9jYWxfc3RvcmU7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXNwdV9hY3F1aXJlKGN0eCk7Ci0KLQlsb2NhbF9zdG9yZSA9IGN0eC0+b3BzLT5nZXRfbHMoY3R4KTsKLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIHNpemUsIHBvcywgbG9jYWxfc3RvcmUsIExTX1NJWkUpOwotCisJcmV0ID0gX19zcHVmc19tZW1fcmVhZChjdHgsIGJ1ZmZlciwgc2l6ZSwgcG9zKTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMDQsMTEgKzEwOSwxMSBAQAogCiAJaWYgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1NBVkVEKSB7CiAJCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKLQkJCQkJJiB+KF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCkpOworCQkJCQkJCSYgfl9QQUdFX05PX0NBQ0hFKTsKIAkJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZShjdHgtPmNzYS5sc2NzYS0+bHMgKyBvZmZzZXQpOwogCX0gZWxzZSB7CiAJCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKLQkJCQkJfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOworCQkJCQkJCXwgX1BBR0VfTk9fQ0FDSEUpOwogCQlwYWdlID0gcGZuX3RvX3BhZ2UoKGN0eC0+c3B1LT5sb2NhbF9zdG9yZV9waHlzICsgb2Zmc2V0KQogCQkJCSAgID4+IFBBR0VfU0hJRlQpOwogCX0KQEAgLTEzMSw3ICsxMzYsNyBAQAogCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIEZJWE1FOiAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQogCQkJCSAgICAgfCBfUEFHRV9OT19DQUNIRSk7CiAKQEAgLTIwMCw3ICsyMDUsNyBAQAogCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCiAJCQkJICAgICB8IF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7CiAKQEAgLTI2MSwxOCArMjY2LDIzIEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90CitfX3NwdWZzX3JlZ3NfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCXNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIHNpemUsIHBvcywKKwkJCQkgICAgICBsc2NzYS0+Z3Bycywgc2l6ZW9mIGxzY3NhLT5ncHJzKTsKK30KKworc3RhdGljIHNzaXplX3QKIHNwdWZzX3JlZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIHNpemUsIHBvcywKLQkJCQkgICAgICBsc2NzYS0+Z3Bycywgc2l6ZW9mIGxzY3NhLT5ncHJzKTsKLQorCXJldCA9IF9fc3B1ZnNfcmVnc19yZWFkKGN0eCwgYnVmZmVyLCBzaXplLCBwb3MpOwogCXNwdV9yZWxlYXNlKGN0eCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTMwNywxOCArMzE3LDIzIEBACiB9OwogCiBzdGF0aWMgc3NpemVfdAorX19zcHVmc19mcGNyX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJc2l6ZV90IHNpemUsIGxvZmZfdCAqIHBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIHNpemUsIHBvcywKKwkJCQkgICAgICAmbHNjc2EtPmZwY3IsIHNpemVvZihsc2NzYS0+ZnBjcikpOworfQorCitzdGF0aWMgc3NpemVfdAogc3B1ZnNfZnBjcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKIAkJc2l6ZV90IHNpemUsIGxvZmZfdCAqIHBvcykKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOwogCWludCByZXQ7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmZmVyLCBzaXplLCBwb3MsCi0JCQkJICAgICAgJmxzY3NhLT5mcGNyLCBzaXplb2YobHNjc2EtPmZwY3IpKTsKLQorCXJldCA9IF9fc3B1ZnNfZnBjcl9yZWFkKGN0eCwgYnVmZmVyLCBzaXplLCBwb3MpOwogCXNwdV9yZWxlYXNlKGN0eCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTcxOCwyMyArNzMzLDQxIEBACiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCitzdGF0aWMgc3NpemVfdCBfX3NwdWZzX3NpZ25hbDFfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOwogCXUzMiBkYXRhOwogCiAJaWYgKGxlbiA8IDQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3B1X2FjcXVpcmUoY3R4KTsKLQlkYXRhID0gY3R4LT5vcHMtPnNpZ25hbDFfcmVhZChjdHgpOwotCXNwdV9yZWxlYXNlKGN0eCk7CisJaWYgKGN0eC0+Y3NhLnNwdV9jaG5sY250X1JXWzNdKSB7CisJCWRhdGEgPSBjdHgtPmNzYS5zcHVfY2hubGRhdGFfUldbM107CisJCXJldCA9IDQ7CisJfQorCisJaWYgKCFyZXQpCisJCWdvdG8gb3V0OwogCiAJaWYgKGNvcHlfdG9fdXNlcihidWYsICZkYXRhLCA0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gNDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlyZXQgPSBfX3NwdWZzX3NpZ25hbDFfcmVhZChjdHgsIGJ1ZiwgbGVuLCBwb3MpOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLApAQCAtNzgyLDcgKzgxNSw3IEBACiAJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKIAkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKIApAQCAtODA3LDI1ICs4NDAsNDEgQEAKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfc2lnbmFsMl9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCBjaGFyIF9fdXNlciAqYnVmLAogCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisJaW50IHJldCA9IDA7CiAJdTMyIGRhdGE7CiAKLQljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KIAlpZiAobGVuIDwgNCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcHVfYWNxdWlyZShjdHgpOwotCWRhdGEgPSBjdHgtPm9wcy0+c2lnbmFsMl9yZWFkKGN0eCk7Ci0Jc3B1X3JlbGVhc2UoY3R4KTsKKwlpZiAoY3R4LT5jc2Euc3B1X2NobmxjbnRfUldbNF0pIHsKKwkJZGF0YSA9ICBjdHgtPmNzYS5zcHVfY2hubGRhdGFfUldbNF07CisJCXJldCA9IDQ7CisJfQorCisJaWYgKCFyZXQpCisJCWdvdG8gb3V0OwogCiAJaWYgKGNvcHlfdG9fdXNlcihidWYsICZkYXRhLCA0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gNDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlyZXQgPSBfX3NwdWZzX3NpZ25hbDJfcmVhZChjdHgsIGJ1ZiwgbGVuLCBwb3MpOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLApAQCAtODc0LDggKzkyMyw3IEBACiAJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogRklYTUU6ICovCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKIAkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKIApAQCAtOTAyLDEzICs5NTAsMTkgQEAKIAlzcHVfcmVsZWFzZShjdHgpOwogfQogCitzdGF0aWMgdTY0IF9fc3B1ZnNfc2lnbmFsMV90eXBlX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlyZXR1cm4gY3R4LT5vcHMtPnNpZ25hbDFfdHlwZV9nZXQoY3R4KTsKK30KKwogc3RhdGljIHU2NCBzcHVmc19zaWduYWwxX3R5cGVfZ2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXU2NCByZXQ7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwotCXJldCA9IGN0eC0+b3BzLT5zaWduYWwxX3R5cGVfZ2V0KGN0eCk7CisJcmV0ID0gX19zcHVmc19zaWduYWwxX3R5cGVfZ2V0KGRhdGEpOwogCXNwdV9yZWxlYXNlKGN0eCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTI1LDEzICs5NzksMTkgQEAKIAlzcHVfcmVsZWFzZShjdHgpOwogfQogCitzdGF0aWMgdTY0IF9fc3B1ZnNfc2lnbmFsMl90eXBlX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlyZXR1cm4gY3R4LT5vcHMtPnNpZ25hbDJfdHlwZV9nZXQoY3R4KTsKK30KKwogc3RhdGljIHU2NCBzcHVmc19zaWduYWwyX3R5cGVfZ2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXU2NCByZXQ7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwotCXJldCA9IGN0eC0+b3BzLT5zaWduYWwyX3R5cGVfZ2V0KGN0eCk7CisJcmV0ID0gX19zcHVmc19zaWduYWwyX3R5cGVfZ2V0KGRhdGEpOwogCXNwdV9yZWxlYXNlKGN0eCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTU4LDcgKzEwMTgsNyBAQAogCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCiAJCQkJICAgICB8IF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7CiAKQEAgLTEwMDAsNyArMTA2MCw3IEBACiAJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKIAkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKIApAQCAtMTA0MSw3ICsxMTAxLDcgQEAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQogCQkJCSAgICAgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOwogCkBAIC0xMjY1LDYgKzEzMjUsNyBAQAogCQlnb3RvIG91dDsKIAogCWN0eC0+dGFnd2FpdCB8PSAxIDw8IGNtZC50YWc7CisJcmV0ID0gc2l6ZTsKIAogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xMzYwLDcgKzE0MjEsOCBAQAogCXNwdV9yZWxlYXNlKGN0eCk7CiAJcmV0dXJuIHJldDsKIH0KLURFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX25wY19vcHMsIHNwdWZzX25wY19nZXQsIHNwdWZzX25wY19zZXQsICIlbGx4XG4iKQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfbnBjX29wcywgc3B1ZnNfbnBjX2dldCwgc3B1ZnNfbnBjX3NldCwKKwkJCSIweCVsbHhcbiIpCiAKIHN0YXRpYyB2b2lkIHNwdWZzX2RlY3Jfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CkBAIC0xMzcxLDE4ICsxNDMzLDI0IEBACiAJc3B1X3JlbGVhc2UoY3R4KTsKIH0KIAotc3RhdGljIHU2NCBzcHVmc19kZWNyX2dldCh2b2lkICpkYXRhKQorc3RhdGljIHU2NCBfX3NwdWZzX2RlY3JfZ2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJcmV0dXJuIGxzY3NhLT5kZWNyLnNsb3RbMF07Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfZGVjcl9nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJdTY0IHJldDsKIAlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOwotCXJldCA9IGxzY3NhLT5kZWNyLnNsb3RbMF07CisJcmV0ID0gX19zcHVmc19kZWNyX2dldChkYXRhKTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCXJldHVybiByZXQ7CiB9CiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19kZWNyX29wcywgc3B1ZnNfZGVjcl9nZXQsIHNwdWZzX2RlY3Jfc2V0LAotCQkJIiVsbHhcbiIpCisJCQkiMHglbGx4XG4iKQogCiBzdGF0aWMgdm9pZCBzcHVmc19kZWNyX3N0YXR1c19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKQEAgLTEzOTMsNDAgKzE0NjEsMjQgQEAKIAlzcHVfcmVsZWFzZShjdHgpOwogfQogCi1zdGF0aWMgdTY0IHNwdWZzX2RlY3Jfc3RhdHVzX2dldCh2b2lkICpkYXRhKQorc3RhdGljIHU2NCBfX3NwdWZzX2RlY3Jfc3RhdHVzX2dldCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKIAlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXJldHVybiBsc2NzYS0+ZGVjcl9zdGF0dXMuc2xvdFswXTsKK30KKworc3RhdGljIHU2NCBzcHVmc19kZWNyX3N0YXR1c19nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJdTY0IHJldDsKIAlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOwotCXJldCA9IGxzY3NhLT5kZWNyX3N0YXR1cy5zbG90WzBdOworCXJldCA9IF9fc3B1ZnNfZGVjcl9zdGF0dXNfZ2V0KGRhdGEpOwogCXNwdV9yZWxlYXNlKGN0eCk7CiAJcmV0dXJuIHJldDsKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2RlY3Jfc3RhdHVzX29wcywgc3B1ZnNfZGVjcl9zdGF0dXNfZ2V0LAotCQkJc3B1ZnNfZGVjcl9zdGF0dXNfc2V0LCAiJWxseFxuIikKLQotc3RhdGljIHZvaWQgc3B1ZnNfc3B1X3RhZ19tYXNrX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQotewotCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKLQlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOwotCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7Ci0JbHNjc2EtPnRhZ19tYXNrLnNsb3RbMF0gPSAodTMyKSB2YWw7Ci0Jc3B1X3JlbGVhc2UoY3R4KTsKLX0KLQotc3RhdGljIHU2NCBzcHVmc19zcHVfdGFnX21hc2tfZ2V0KHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwotCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7Ci0JdTY0IHJldDsKLQlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOwotCXJldCA9IGxzY3NhLT50YWdfbWFzay5zbG90WzBdOwotCXNwdV9yZWxlYXNlKGN0eCk7Ci0JcmV0dXJuIHJldDsKLX0KLURFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX3NwdV90YWdfbWFza19vcHMsIHNwdWZzX3NwdV90YWdfbWFza19nZXQsCi0JCQlzcHVmc19zcHVfdGFnX21hc2tfc2V0LCAiJWxseFxuIikKKwkJCXNwdWZzX2RlY3Jfc3RhdHVzX3NldCwgIjB4JWxseFxuIikKIAogc3RhdGljIHZvaWQgc3B1ZnNfZXZlbnRfbWFza19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKQEAgLTE0MzcsMTggKzE0ODksNDggQEAKIAlzcHVfcmVsZWFzZShjdHgpOwogfQogCi1zdGF0aWMgdTY0IHNwdWZzX2V2ZW50X21hc2tfZ2V0KHZvaWQgKmRhdGEpCitzdGF0aWMgdTY0IF9fc3B1ZnNfZXZlbnRfbWFza19nZXQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKKwlyZXR1cm4gbHNjc2EtPmV2ZW50X21hc2suc2xvdFswXTsKK30KKworc3RhdGljIHU2NCBzcHVmc19ldmVudF9tYXNrX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKIAl1NjQgcmV0OwogCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7Ci0JcmV0ID0gbHNjc2EtPmV2ZW50X21hc2suc2xvdFswXTsKKwlyZXQgPSBfX3NwdWZzX2V2ZW50X21hc2tfZ2V0KGRhdGEpOwogCXNwdV9yZWxlYXNlKGN0eCk7CiAJcmV0dXJuIHJldDsKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2V2ZW50X21hc2tfb3BzLCBzcHVmc19ldmVudF9tYXNrX2dldCwKLQkJCXNwdWZzX2V2ZW50X21hc2tfc2V0LCAiJWxseFxuIikKKwkJCXNwdWZzX2V2ZW50X21hc2tfc2V0LCAiMHglbGx4XG4iKQorCitzdGF0aWMgdTY0IF9fc3B1ZnNfZXZlbnRfc3RhdHVzX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlzdHJ1Y3Qgc3B1X3N0YXRlICpzdGF0ZSA9ICZjdHgtPmNzYTsKKwl1NjQgc3RhdDsKKwlzdGF0ID0gc3RhdGUtPnNwdV9jaG5sY250X1JXWzBdOworCWlmIChzdGF0KQorCQlyZXR1cm4gc3RhdGUtPnNwdV9jaG5sZGF0YV9SV1swXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBzcHVmc19ldmVudF9zdGF0dXNfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXU2NCByZXQgPSAwOworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlyZXQgPSBfX3NwdWZzX2V2ZW50X3N0YXR1c19nZXQoZGF0YSk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfZXZlbnRfc3RhdHVzX29wcywgc3B1ZnNfZXZlbnRfc3RhdHVzX2dldCwKKwkJCU5VTEwsICIweCVsbHhcbiIpCiAKIHN0YXRpYyB2b2lkIHNwdWZzX3NycjBfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CkBAIC0xNDcwLDcgKzE1NTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19zcnIwX29wcywgc3B1ZnNfc3JyMF9nZXQsIHNwdWZzX3NycjBfc2V0LAotCQkJIiVsbHhcbiIpCisJCQkiMHglbGx4XG4iKQogCiBzdGF0aWMgdTY0IHNwdWZzX2lkX2dldCh2b2lkICpkYXRhKQogewpAQCAtMTQ4OCwxMiArMTU3MCwxOCBAQAogfQogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfaWRfb3BzLCBzcHVmc19pZF9nZXQsIE5VTEwsICIweCVsbHhcbiIpCiAKLXN0YXRpYyB1NjQgc3B1ZnNfb2JqZWN0X2lkX2dldCh2b2lkICpkYXRhKQorc3RhdGljIHU2NCBfX3NwdWZzX29iamVjdF9pZF9nZXQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJcmV0dXJuIGN0eC0+b2JqZWN0X2lkOwogfQogCitzdGF0aWMgdTY0IHNwdWZzX29iamVjdF9pZF9nZXQodm9pZCAqZGF0YSkKK3sKKwkvKiBGSVhNRTogU2hvdWxkIHRoZXJlIHJlYWxseSBiZSBubyBsb2NraW5nIGhlcmU/ICovCisJcmV0dXJuIF9fc3B1ZnNfb2JqZWN0X2lkX2dldChkYXRhKTsKK30KKwogc3RhdGljIHZvaWQgc3B1ZnNfb2JqZWN0X2lkX3NldCh2b2lkICpkYXRhLCB1NjQgaWQpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwpAQCAtMTUwMyw2ICsxNTkxLDI1MCBAQAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfb2JqZWN0X2lkX29wcywgc3B1ZnNfb2JqZWN0X2lkX2dldCwKIAkJc3B1ZnNfb2JqZWN0X2lkX3NldCwgIjB4JWxseFxuIik7CiAKK3N0YXRpYyB1NjQgX19zcHVmc19sc2xyX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlyZXR1cm4gY3R4LT5jc2EucHJpdjIuc3B1X2xzbHJfUlc7Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfbHNscl9nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJdTY0IHJldDsKKworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJcmV0ID0gX19zcHVmc19sc2xyX2dldChkYXRhKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2xzbHJfb3BzLCBzcHVmc19sc2xyX2dldCwgTlVMTCwgIjB4JWxseFxuIikKKworc3RhdGljIGludCBzcHVmc19pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwdWZzX2lub2RlX2luZm8gKmkgPSBTUFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGktPmlfY3R4OworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGN0eDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgX19zcHVmc19tYm94X2luZm9fcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXUzMiBtYm94X3N0YXQ7CisJdTMyIGRhdGE7CisKKwltYm94X3N0YXQgPSBjdHgtPmNzYS5wcm9iLm1iX3N0YXRfUjsKKwlpZiAobWJveF9zdGF0ICYgMHgwMDAwZmYpIHsKKwkJZGF0YSA9IGN0eC0+Y3NhLnByb2IucHVfbWJfUjsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIHBvcywgJmRhdGEsIHNpemVvZiBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1ZnNfbWJveF9pbmZvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlyZXQgPSBfX3NwdWZzX21ib3hfaW5mb19yZWFkKGN0eCwgYnVmLCBsZW4sIHBvcyk7CisJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19tYm94X2luZm9fZm9wcyA9IHsKKwkub3BlbiA9IHNwdWZzX2luZm9fb3BlbiwKKwkucmVhZCA9IHNwdWZzX21ib3hfaW5mb19yZWFkLAorCS5sbHNlZWsgID0gZ2VuZXJpY19maWxlX2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfaWJveF9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJdTMyIGlib3hfc3RhdDsKKwl1MzIgZGF0YTsKKworCWlib3hfc3RhdCA9IGN0eC0+Y3NhLnByb2IubWJfc3RhdF9SOworCWlmIChpYm94X3N0YXQgJiAweGZmMDAwMCkgeworCQlkYXRhID0gY3R4LT5jc2EucHJpdjIucHVpbnRfbWJfUjsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIHBvcywgJmRhdGEsIHNpemVvZiBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1ZnNfaWJveF9pbmZvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlyZXQgPSBfX3NwdWZzX2lib3hfaW5mb19yZWFkKGN0eCwgYnVmLCBsZW4sIHBvcyk7CisJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19pYm94X2luZm9fZm9wcyA9IHsKKwkub3BlbiA9IHNwdWZzX2luZm9fb3BlbiwKKwkucmVhZCA9IHNwdWZzX2lib3hfaW5mb19yZWFkLAorCS5sbHNlZWsgID0gZ2VuZXJpY19maWxlX2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfd2JveF9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgaSwgY250OworCXUzMiBkYXRhWzRdOworCXUzMiB3Ym94X3N0YXQ7CisKKwl3Ym94X3N0YXQgPSBjdHgtPmNzYS5wcm9iLm1iX3N0YXRfUjsKKwljbnQgPSA0IC0gKCh3Ym94X3N0YXQgJiAweDAwZmYwMCkgPj4gOCk7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWRhdGFbaV0gPSBjdHgtPmNzYS5zcHVfbWFpbGJveF9kYXRhW2ldOworCX0KKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGxlbiwgcG9zLCAmZGF0YSwKKwkJCQljbnQgKiBzaXplb2YodTMyKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX3dib3hfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJcmV0ID0gX19zcHVmc193Ym94X2luZm9fcmVhZChjdHgsIGJ1ZiwgbGVuLCBwb3MpOworCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfd2JveF9pbmZvX2ZvcHMgPSB7CisJLm9wZW4gPSBzcHVmc19pbmZvX29wZW4sCisJLnJlYWQgPSBzcHVmc193Ym94X2luZm9fcmVhZCwKKwkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBfX3NwdWZzX2RtYV9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2RtYV9pbmZvIGluZm87CisJc3RydWN0IG1mY19jcV9zciAqcXAsICpzcHVxcDsKKwlpbnQgaTsKKworCWluZm8uZG1hX2luZm9fdHlwZSA9IGN0eC0+Y3NhLnByaXYyLnNwdV90YWdfc3RhdHVzX3F1ZXJ5X1JXOworCWluZm8uZG1hX2luZm9fbWFzayA9IGN0eC0+Y3NhLmxzY3NhLT50YWdfbWFzay5zbG90WzBdOworCWluZm8uZG1hX2luZm9fc3RhdHVzID0gY3R4LT5jc2Euc3B1X2NobmxkYXRhX1JXWzI0XTsKKwlpbmZvLmRtYV9pbmZvX3N0YWxsX2FuZF9ub3RpZnkgPSBjdHgtPmNzYS5zcHVfY2hubGRhdGFfUldbMjVdOworCWluZm8uZG1hX2luZm9fYXRvbWljX2NvbW1hbmRfc3RhdHVzID0gY3R4LT5jc2Euc3B1X2NobmxkYXRhX1JXWzI3XTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlxcCA9ICZpbmZvLmRtYV9pbmZvX2NvbW1hbmRfZGF0YVtpXTsKKwkJc3B1cXAgPSAmY3R4LT5jc2EucHJpdjIuc3B1cVtpXTsKKworCQlxcC0+bWZjX2NxX2RhdGEwX1JXID0gc3B1cXAtPm1mY19jcV9kYXRhMF9SVzsKKwkJcXAtPm1mY19jcV9kYXRhMV9SVyA9IHNwdXFwLT5tZmNfY3FfZGF0YTFfUlc7CisJCXFwLT5tZmNfY3FfZGF0YTJfUlcgPSBzcHVxcC0+bWZjX2NxX2RhdGEyX1JXOworCQlxcC0+bWZjX2NxX2RhdGEzX1JXID0gc3B1cXAtPm1mY19jcV9kYXRhM19SVzsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIHBvcywgJmluZm8sCisJCQkJc2l6ZW9mIGluZm8pOworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc19kbWFfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlyZXQgPSBfX3NwdWZzX2RtYV9pbmZvX3JlYWQoY3R4LCBidWYsIGxlbiwgcG9zKTsKKwlzcGluX3VubG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2RtYV9pbmZvX2ZvcHMgPSB7CisJLm9wZW4gPSBzcHVmc19pbmZvX29wZW4sCisJLnJlYWQgPSBzcHVmc19kbWFfaW5mb19yZWFkLAorfTsKKworc3RhdGljIHNzaXplX3QgX19zcHVmc19wcm94eWRtYV9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X3Byb3h5ZG1hX2luZm8gaW5mbzsKKwlzdHJ1Y3QgbWZjX2NxX3NyICpxcCwgKnB1cXA7CisJaW50IHJldCA9IHNpemVvZiBpbmZvOworCWludCBpOworCisJaWYgKGxlbiA8IHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmZvLnByb3h5ZG1hX2luZm9fdHlwZSA9IGN0eC0+Y3NhLnByb2IuZG1hX3F1ZXJ5dHlwZV9SVzsKKwlpbmZvLnByb3h5ZG1hX2luZm9fbWFzayA9IGN0eC0+Y3NhLnByb2IuZG1hX3F1ZXJ5bWFza19SVzsKKwlpbmZvLnByb3h5ZG1hX2luZm9fc3RhdHVzID0gY3R4LT5jc2EucHJvYi5kbWFfdGFnc3RhdHVzX1I7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlxcCA9ICZpbmZvLnByb3h5ZG1hX2luZm9fY29tbWFuZF9kYXRhW2ldOworCQlwdXFwID0gJmN0eC0+Y3NhLnByaXYyLnB1cVtpXTsKKworCQlxcC0+bWZjX2NxX2RhdGEwX1JXID0gcHVxcC0+bWZjX2NxX2RhdGEwX1JXOworCQlxcC0+bWZjX2NxX2RhdGExX1JXID0gcHVxcC0+bWZjX2NxX2RhdGExX1JXOworCQlxcC0+bWZjX2NxX2RhdGEyX1JXID0gcHVxcC0+bWZjX2NxX2RhdGEyX1JXOworCQlxcC0+bWZjX2NxX2RhdGEzX1JXID0gcHVxcC0+bWZjX2NxX2RhdGEzX1JXOworCX0KKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGxlbiwgcG9zLCAmaW5mbywKKwkJCQlzaXplb2YgaW5mbyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX3Byb3h5ZG1hX2luZm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlzcGluX2xvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCXJldCA9IF9fc3B1ZnNfcHJveHlkbWFfaW5mb19yZWFkKGN0eCwgYnVmLCBsZW4sIHBvcyk7CisJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19wcm94eWRtYV9pbmZvX2ZvcHMgPSB7CisJLm9wZW4gPSBzcHVmc19pbmZvX29wZW4sCisJLnJlYWQgPSBzcHVmc19wcm94eWRtYV9pbmZvX3JlYWQsCit9OworCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfY29udGVudHNbXSA9IHsKIAl7ICJtZW0iLCAgJnNwdWZzX21lbV9mb3BzLCAgMDY2NiwgfSwKIAl7ICJyZWdzIiwgJnNwdWZzX3JlZ3NfZm9wcywgIDA2NjYsIH0sCkBAIC0xNTE2LDE4ICsxODQ4LDcwIEBACiAJeyAic2lnbmFsMiIsICZzcHVmc19zaWduYWwyX2ZvcHMsIDA2NjYsIH0sCiAJeyAic2lnbmFsMV90eXBlIiwgJnNwdWZzX3NpZ25hbDFfdHlwZSwgMDY2NiwgfSwKIAl7ICJzaWduYWwyX3R5cGUiLCAmc3B1ZnNfc2lnbmFsMl90eXBlLCAwNjY2LCB9LAorCXsgImNudGwiLCAmc3B1ZnNfY250bF9mb3BzLCAgMDY2NiwgfSwKKwl7ICJmcGNyIiwgJnNwdWZzX2ZwY3JfZm9wcywgMDY2NiwgfSwKKwl7ICJsc2xyIiwgJnNwdWZzX2xzbHJfb3BzLCAwNDQ0LCB9LAorCXsgIm1mYyIsICZzcHVmc19tZmNfZm9wcywgMDY2NiwgfSwKKwl7ICJtc3MiLCAmc3B1ZnNfbXNzX2ZvcHMsIDA2NjYsIH0sCisJeyAibnBjIiwgJnNwdWZzX25wY19vcHMsIDA2NjYsIH0sCisJeyAic3JyMCIsICZzcHVmc19zcnIwX29wcywgMDY2NiwgfSwKKwl7ICJkZWNyIiwgJnNwdWZzX2RlY3Jfb3BzLCAwNjY2LCB9LAorCXsgImRlY3Jfc3RhdHVzIiwgJnNwdWZzX2RlY3Jfc3RhdHVzX29wcywgMDY2NiwgfSwKKwl7ICJldmVudF9tYXNrIiwgJnNwdWZzX2V2ZW50X21hc2tfb3BzLCAwNjY2LCB9LAorCXsgImV2ZW50X3N0YXR1cyIsICZzcHVmc19ldmVudF9zdGF0dXNfb3BzLCAwNDQ0LCB9LAorCXsgInBzbWFwIiwgJnNwdWZzX3BzbWFwX2ZvcHMsIDA2NjYsIH0sCisJeyAicGh5cy1pZCIsICZzcHVmc19pZF9vcHMsIDA2NjYsIH0sCisJeyAib2JqZWN0LWlkIiwgJnNwdWZzX29iamVjdF9pZF9vcHMsIDA2NjYsIH0sCisJeyAibWJveF9pbmZvIiwgJnNwdWZzX21ib3hfaW5mb19mb3BzLCAwNDQ0LCB9LAorCXsgImlib3hfaW5mbyIsICZzcHVmc19pYm94X2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7ICJ3Ym94X2luZm8iLCAmc3B1ZnNfd2JveF9pbmZvX2ZvcHMsIDA0NDQsIH0sCisJeyAiZG1hX2luZm8iLCAmc3B1ZnNfZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7ICJwcm94eWRtYV9pbmZvIiwgJnNwdWZzX3Byb3h5ZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7fSwKK307CisKK3N0cnVjdCB0cmVlX2Rlc2NyIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzW10gPSB7CisJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCisJeyAibWJveCIsICZzcHVmc19tYm94X2ZvcHMsIDA0NDQsIH0sCisJeyAiaWJveCIsICZzcHVmc19pYm94X2ZvcHMsIDA0NDQsIH0sCisJeyAid2JveCIsICZzcHVmc193Ym94X2ZvcHMsIDAyMjIsIH0sCisJeyAibWJveF9zdGF0IiwgJnNwdWZzX21ib3hfc3RhdF9mb3BzLCAwNDQ0LCB9LAorCXsgImlib3hfc3RhdCIsICZzcHVmc19pYm94X3N0YXRfZm9wcywgMDQ0NCwgfSwKKwl7ICJ3Ym94X3N0YXQiLCAmc3B1ZnNfd2JveF9zdGF0X2ZvcHMsIDA0NDQsIH0sCisJeyAic2lnbmFsMSIsICZzcHVmc19zaWduYWwxX2ZvcHMsIDA2NjYsIH0sCisJeyAic2lnbmFsMiIsICZzcHVmc19zaWduYWwyX2ZvcHMsIDA2NjYsIH0sCisJeyAic2lnbmFsMV90eXBlIiwgJnNwdWZzX3NpZ25hbDFfdHlwZSwgMDY2NiwgfSwKKwl7ICJzaWduYWwyX3R5cGUiLCAmc3B1ZnNfc2lnbmFsMl90eXBlLCAwNjY2LCB9LAogCXsgIm1zcyIsICZzcHVmc19tc3NfZm9wcywgMDY2NiwgfSwKIAl7ICJtZmMiLCAmc3B1ZnNfbWZjX2ZvcHMsIDA2NjYsIH0sCiAJeyAiY250bCIsICZzcHVmc19jbnRsX2ZvcHMsICAwNjY2LCB9LAogCXsgIm5wYyIsICZzcHVmc19ucGNfb3BzLCAwNjY2LCB9LAotCXsgImZwY3IiLCAmc3B1ZnNfZnBjcl9mb3BzLCAwNjY2LCB9LAotCXsgImRlY3IiLCAmc3B1ZnNfZGVjcl9vcHMsIDA2NjYsIH0sCi0JeyAiZGVjcl9zdGF0dXMiLCAmc3B1ZnNfZGVjcl9zdGF0dXNfb3BzLCAwNjY2LCB9LAotCXsgInNwdV90YWdfbWFzayIsICZzcHVmc19zcHVfdGFnX21hc2tfb3BzLCAwNjY2LCB9LAotCXsgImV2ZW50X21hc2siLCAmc3B1ZnNfZXZlbnRfbWFza19vcHMsIDA2NjYsIH0sCi0JeyAic3JyMCIsICZzcHVmc19zcnIwX29wcywgMDY2NiwgfSwKIAl7ICJwc21hcCIsICZzcHVmc19wc21hcF9mb3BzLCAwNjY2LCB9LAogCXsgInBoeXMtaWQiLCAmc3B1ZnNfaWRfb3BzLCAwNjY2LCB9LAogCXsgIm9iamVjdC1pZCIsICZzcHVmc19vYmplY3RfaWRfb3BzLCAwNjY2LCB9LAogCXt9LAogfTsKKworc3RydWN0IHNwdWZzX2NvcmVkdW1wX3JlYWRlciBzcHVmc19jb3JlZHVtcF9yZWFkW10gPSB7CisJeyAicmVncyIsIF9fc3B1ZnNfcmVnc19yZWFkLCBOVUxMLCAxMjggKiAxNiB9LAorCXsgImZwY3IiLCBfX3NwdWZzX2ZwY3JfcmVhZCwgTlVMTCwgMTYgfSwKKwl7ICJsc2xyIiwgTlVMTCwgX19zcHVmc19sc2xyX2dldCwgMTEgfSwKKwl7ICJkZWNyIiwgTlVMTCwgX19zcHVmc19kZWNyX2dldCwgMTEgfSwKKwl7ICJkZWNyX3N0YXR1cyIsIE5VTEwsIF9fc3B1ZnNfZGVjcl9zdGF0dXNfZ2V0LCAxMSB9LAorCXsgIm1lbSIsIF9fc3B1ZnNfbWVtX3JlYWQsIE5VTEwsIDI1NiAqIDEwMjQsIH0sCisJeyAic2lnbmFsMSIsIF9fc3B1ZnNfc2lnbmFsMV9yZWFkLCBOVUxMLCA0IH0sCisJeyAic2lnbmFsMV90eXBlIiwgTlVMTCwgX19zcHVmc19zaWduYWwxX3R5cGVfZ2V0LCAyIH0sCisJeyAic2lnbmFsMiIsIF9fc3B1ZnNfc2lnbmFsMl9yZWFkLCBOVUxMLCA0IH0sCisJeyAic2lnbmFsMl90eXBlIiwgTlVMTCwgX19zcHVmc19zaWduYWwyX3R5cGVfZ2V0LCAyIH0sCisJeyAiZXZlbnRfbWFzayIsIE5VTEwsIF9fc3B1ZnNfZXZlbnRfbWFza19nZXQsIDggfSwKKwl7ICJldmVudF9zdGF0dXMiLCBOVUxMLCBfX3NwdWZzX2V2ZW50X3N0YXR1c19nZXQsIDggfSwKKwl7ICJtYm94X2luZm8iLCBfX3NwdWZzX21ib3hfaW5mb19yZWFkLCBOVUxMLCA0IH0sCisJeyAiaWJveF9pbmZvIiwgX19zcHVmc19pYm94X2luZm9fcmVhZCwgTlVMTCwgNCB9LAorCXsgIndib3hfaW5mbyIsIF9fc3B1ZnNfd2JveF9pbmZvX3JlYWQsIE5VTEwsIDE2IH0sCisJeyAiZG1hX2luZm8iLCBfX3NwdWZzX2RtYV9pbmZvX3JlYWQsIE5VTEwsIDY5ICogOCB9LAorCXsgInByb3h5ZG1hX2luZm8iLCBfX3NwdWZzX3Byb3h5ZG1hX2luZm9fcmVhZCwgTlVMTCwgMzUgKiA4IH0sCisJeyAib2JqZWN0LWlkIiwgTlVMTCwgX19zcHVmc19vYmplY3RfaWRfZ2V0LCAxOSB9LAorCXsgfSwKK307CitpbnQgc3B1ZnNfY29yZWR1bXBfbnVtX25vdGVzID0gQVJSQVlfU0laRShzcHVmc19jb3JlZHVtcF9yZWFkKSAtIDE7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYwppbmRleCBkODA1ZmZlLi5hZTQyZTAzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCkBAIC0xMzUsMjEgKzEzNSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1MzIgc3B1X2h3X3NpZ25hbDFfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKLXsKLQlyZXR1cm4gaW5fYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNpZ25hbF9ub3RpZnkxKTsKLX0KLQogc3RhdGljIHZvaWQgc3B1X2h3X3NpZ25hbDFfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiBkYXRhKQogewogCW91dF9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c2lnbmFsX25vdGlmeTEsIGRhdGEpOwogfQogCi1zdGF0aWMgdTMyIHNwdV9od19zaWduYWwyX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCi17Ci0JcmV0dXJuIGluX2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zaWduYWxfbm90aWZ5Mik7Ci19Ci0KIHN0YXRpYyB2b2lkIHNwdV9od19zaWduYWwyX3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgZGF0YSkKIHsKIAlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNpZ25hbF9ub3RpZnkyLCBkYXRhKTsKQEAgLTIxNywyMSArMjA3LDQyIEBACiAJcmV0dXJuIGN0eC0+c3B1LT5sb2NhbF9zdG9yZTsKIH0KIAotc3RhdGljIHZvaWQgc3B1X2h3X3J1bmNudGxfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiB2YWwpCitzdGF0aWMgdTMyIHNwdV9od19ydW5jbnRsX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0JZWllaW8oKTsKLQlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXLCB2YWwpOworCXJldHVybiBpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c3B1X3J1bmNudGxfUlcpOwogfQogCi1zdGF0aWMgdm9pZCBzcHVfaHdfcnVuY250bF9zdG9wKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQorc3RhdGljIHZvaWQgc3B1X2h3X3J1bmNudGxfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiB2YWwpCiB7CiAJc3Bpbl9sb2NrX2lycSgmY3R4LT5zcHUtPnJlZ2lzdGVyX2xvY2spOwotCW91dF9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c3B1X3J1bmNudGxfUlcsIFNQVV9SVU5DTlRMX1NUT1ApOwotCXdoaWxlIChpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfUlVOTklORykKLQkJY3B1X3JlbGF4KCk7CisJaWYgKHZhbCAmIFNQVV9SVU5DTlRMX0lTT0xBVEUpCisJCW91dF9iZTY0KCZjdHgtPnNwdS0+cHJpdjItPnNwdV9wcml2Y250bF9SVywgNExMKTsKKwlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXLCB2YWwpOwogCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5zcHUtPnJlZ2lzdGVyX2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBzcHVfaHdfbWFzdGVyX3N0YXJ0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCXU2NCBzcjE7CisKKwlzcGluX2xvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXNyMSA9IHNwdV9tZmNfc3IxX2dldChzcHUpIHwgTUZDX1NUQVRFMV9NQVNURVJfUlVOX0NPTlRST0xfTUFTSzsKKwlzcHVfbWZjX3NyMV9zZXQoc3B1LCBzcjEpOworCXNwaW5fdW5sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc3B1X2h3X21hc3Rlcl9zdG9wKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCXU2NCBzcjE7CisKKwlzcGluX2xvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXNyMSA9IHNwdV9tZmNfc3IxX2dldChzcHUpICYgfk1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0s7CisJc3B1X21mY19zcjFfc2V0KHNwdSwgc3IxKTsKKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7Cit9CisKIHN0YXRpYyBpbnQgc3B1X2h3X3NldF9tZmNfcXVlcnkoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4LCB1MzIgbWFzaywgdTMyIG1vZGUpCiB7CiAJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBjdHgtPnNwdS0+cHJvYmxlbTsKQEAgLTI5MSw5ICszMDIsNyBAQAogCS5tYm94X3N0YXRfcG9sbCA9IHNwdV9od19tYm94X3N0YXRfcG9sbCwKIAkuaWJveF9yZWFkID0gc3B1X2h3X2lib3hfcmVhZCwKIAkud2JveF93cml0ZSA9IHNwdV9od193Ym94X3dyaXRlLAotCS5zaWduYWwxX3JlYWQgPSBzcHVfaHdfc2lnbmFsMV9yZWFkLAogCS5zaWduYWwxX3dyaXRlID0gc3B1X2h3X3NpZ25hbDFfd3JpdGUsCi0JLnNpZ25hbDJfcmVhZCA9IHNwdV9od19zaWduYWwyX3JlYWQsCiAJLnNpZ25hbDJfd3JpdGUgPSBzcHVfaHdfc2lnbmFsMl93cml0ZSwKIAkuc2lnbmFsMV90eXBlX3NldCA9IHNwdV9od19zaWduYWwxX3R5cGVfc2V0LAogCS5zaWduYWwxX3R5cGVfZ2V0ID0gc3B1X2h3X3NpZ25hbDFfdHlwZV9nZXQsCkBAIC0zMDMsOCArMzEyLDEwIEBACiAJLm5wY193cml0ZSA9IHNwdV9od19ucGNfd3JpdGUsCiAJLnN0YXR1c19yZWFkID0gc3B1X2h3X3N0YXR1c19yZWFkLAogCS5nZXRfbHMgPSBzcHVfaHdfZ2V0X2xzLAorCS5ydW5jbnRsX3JlYWQgPSBzcHVfaHdfcnVuY250bF9yZWFkLAogCS5ydW5jbnRsX3dyaXRlID0gc3B1X2h3X3J1bmNudGxfd3JpdGUsCi0JLnJ1bmNudGxfc3RvcCA9IHNwdV9od19ydW5jbnRsX3N0b3AsCisJLm1hc3Rlcl9zdGFydCA9IHNwdV9od19tYXN0ZXJfc3RhcnQsCisJLm1hc3Rlcl9zdG9wID0gc3B1X2h3X21hc3Rlcl9zdG9wLAogCS5zZXRfbWZjX3F1ZXJ5ID0gc3B1X2h3X3NldF9tZmNfcXVlcnksCiAJLnJlYWRfbWZjX3RhZ3N0YXR1cyA9IHNwdV9od19yZWFkX21mY190YWdzdGF0dXMsCiAJLmdldF9tZmNfZnJlZV9lbGVtZW50cyA9IHNwdV9od19nZXRfbWZjX2ZyZWVfZWxlbWVudHMsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCmluZGV4IDQyN2QwMGEuLmM3ZDAxMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAic3B1ZnMuaCIKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqc3B1ZnNfaW5vZGVfY2FjaGU7CitjaGFyICppc29sYXRlZF9sb2FkZXI7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgogc3B1ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTIzMSw2ICsyMzIsNyBAQAogCS5yZWFkZGlyCT0gZGNhY2hlX3JlYWRkaXIsCiAJLmZzeW5jCQk9IHNpbXBsZV9zeW5jX2ZpbGUsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoc3B1ZnNfY29udGV4dF9mb3BzKTsKIAogc3RhdGljIGludAogc3B1ZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGZsYWdzLApAQCAtMjU1LDEwICsyNTcsMTQgQEAKIAkJZ290byBvdXRfaXB1dDsKIAogCWN0eC0+ZmxhZ3MgPSBmbGFnczsKLQogCWlub2RlLT5pX29wID0gJnNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7Ci0JcmV0ID0gc3B1ZnNfZmlsbF9kaXIoZGVudHJ5LCBzcHVmc19kaXJfY29udGVudHMsIG1vZGUsIGN0eCk7CisJaWYgKGZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXQgPSBzcHVmc19maWxsX2RpcihkZW50cnksIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzLAorCQkJCQkgbW9kZSwgY3R4KTsKKwllbHNlCisJCXJldCA9IHNwdWZzX2ZpbGxfZGlyKGRlbnRyeSwgc3B1ZnNfZGlyX2NvbnRlbnRzLCBtb2RlLCBjdHgpOworCiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZV9jdHg7CiAKQEAgLTMwNyw2ICszMTMsMjAgQEAKIHsKIAlpbnQgcmV0OwogCisJcmV0ID0gLUVQRVJNOworCWlmICgoZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpICYmCisJICAgICFjYXBhYmxlKENBUF9TWVNfTklDRSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKChmbGFncyAmIChTUFVfQ1JFQVRFX05PU0NIRUQgfCBTUFVfQ1JFQVRFX0lTT0xBVEUpKQorCSAgICA9PSBTUFVfQ1JFQVRFX0lTT0xBVEUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IC1FTk9ERVY7CisJaWYgKChmbGFncyAmIFNQVV9DUkVBVEVfSVNPTEFURSkgJiYgIWlzb2xhdGVkX2xvYWRlcikKKwkJZ290byBvdXRfdW5sb2NrOworCiAJcmV0ID0gc3B1ZnNfbWtkaXIoaW5vZGUsIGRlbnRyeSwgZmxhZ3MsIG1vZGUgJiBTX0lSV1hVR08pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTU0MCw2ICs1NjAsMzAgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQKK3NwdWZzX2luaXRfaXNvbGF0ZWRfbG9hZGVyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwljb25zdCBjaGFyICpsb2FkZXI7CisJaW50IHNpemU7CisKKwlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvc3B1LWlzb2xhdGlvbiIpOworCWlmICghZG4pCisJCXJldHVybjsKKworCWxvYWRlciA9IGdldF9wcm9wZXJ0eShkbiwgImxvYWRlciIsICZzaXplKTsKKwlpZiAoIWxvYWRlcikKKwkJcmV0dXJuOworCisJLyoga21hbGxvYyBzaG91bGQgYWxpZ24gb24gYSAxNiBieXRlIGJvdW5kYXJ5Li4qICovCisJaXNvbGF0ZWRfbG9hZGVyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlzb2xhdGVkX2xvYWRlcikKKwkJcmV0dXJuOworCisJbWVtY3B5KGlzb2xhdGVkX2xvYWRlciwgbG9hZGVyLCBzaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICJzcHVmczogU1BVIGlzb2xhdGlvbiBtb2RlIGVuYWJsZWRcbiIpOworfQorCiBzdGF0aWMgaW50CiBzcHVmc19jcmVhdGVfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQogewpAQCAtNjA4LDYgKzY1Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzcHVmc19pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKKwogCXJldCA9IC1FTk9NRU07CiAJc3B1ZnNfaW5vZGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3B1ZnNfaW5vZGVfY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCBzcHVmc19pbm9kZV9pbmZvKSwgMCwKQEAgLTYyNSw2ICs2NzAsMTIgQEAKIAlyZXQgPSByZWdpc3Rlcl9zcHVfc3lzY2FsbHMoJnNwdWZzX2NhbGxzKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mczsKKwlyZXQgPSByZWdpc3Rlcl9hcmNoX2NvcmVkdW1wX2NhbGxzKCZzcHVmc19jb3JlZHVtcF9jYWxscyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnM7CisKKwlzcHVmc19pbml0X2lzb2xhdGVkX2xvYWRlcigpOworCiAJcmV0dXJuIDA7CiBvdXRfZnM6CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzcHVmc190eXBlKTsKQEAgLTYzOCw2ICs2ODksNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHNwdWZzX2V4aXQodm9pZCkKIHsKIAlzcHVfc2NoZWRfZXhpdCgpOworCXVucmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscygmc3B1ZnNfY29yZWR1bXBfY2FsbHMpOwogCXVucmVnaXN0ZXJfc3B1X3N5c2NhbGxzKCZzcHVmc19jYWxscyk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzcHVmc190eXBlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc3B1ZnNfaW5vZGVfY2FjaGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCmluZGV4IDYzZGY4Y2YuLjFhY2MyZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKQEAgLTEsNyArMSwxMSBAQAorI2RlZmluZSBERUJVRworCiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKICNpbmNsdWRlICJzcHVmcy5oIgpAQCAtMjQsNiArMjgsNyBAQAogCX0gZWxzZSB7CiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIFNQRV9FVkVOVF9ETUFfQUxJR05NRU5UOgorCQljYXNlIFNQRV9FVkVOVF9TUEVfREFUQV9TVE9SQUdFOgogCQljYXNlIFNQRV9FVkVOVF9JTlZBTElEX0RNQToKIAkJCWZvcmNlX3NpZyhTSUdCVVMsIC8qIGluZm8sICovIGN1cnJlbnQpOwogCQkJYnJlYWs7CkBAIC00OCwxNSArNTMsMTIyIEBACiAJcmV0dXJuICghKCpzdGF0ICYgMHgxKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8gMSA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgc3B1X3NldHVwX2lzb2xhdGVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCWludCByZXQ7CisJdTY0IF9faW9tZW0gKm1mY19jbnRsOworCXU2NCBzcjE7CisJdTMyIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJY29uc3QgdTMyIHN0YXR1c19sb2FkaW5nID0gU1BVX1NUQVRVU19SVU5OSU5HCisJCXwgU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSB8IFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFUVVM7CisKKwlpZiAoIWlzb2xhdGVkX2xvYWRlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzcHVfYWNxdWlyZV9leGNsdXNpdmUoY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW1mY19jbnRsID0gJmN0eC0+c3B1LT5wcml2Mi0+bWZjX2NvbnRyb2xfUlc7CisKKwkvKiBwdXJnZSB0aGUgTUZDIERNQSBxdWV1ZSB0byBlbnN1cmUgbm8gc3B1cmlvdXMgYWNjZXNzZXMgYmVmb3JlIHdlCisJICogZW50ZXIga2VybmVsIG1vZGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCW91dF9iZTY0KG1mY19jbnRsLCBNRkNfQ05UTF9QVVJHRV9ETUFfUkVRVUVTVCk7CisJd2hpbGUgKChpbl9iZTY0KG1mY19jbnRsKSAmIE1GQ19DTlRMX1BVUkdFX0RNQV9TVEFUVVNfTUFTSykKKwkJCSE9IE1GQ19DTlRMX1BVUkdFX0RNQV9DT01QTEVURSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCBmbHVzaGluZyBNRkMgRE1BIHF1ZXVlXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwkvKiBwdXQgdGhlIFNQRSBpbiBrZXJuZWwgbW9kZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGxvYWRlciAqLworCXNyMSA9IHNwdV9tZmNfc3IxX2dldChjdHgtPnNwdSk7CisJc3IxICY9IH5NRkNfU1RBVEUxX1BST0JMRU1fU1RBVEVfTUFTSzsKKwlzcHVfbWZjX3NyMV9zZXQoY3R4LT5zcHUsIHNyMSk7CisKKwkvKiBzdGFydCB0aGUgbG9hZGVyICovCisJY3R4LT5vcHMtPnNpZ25hbDFfd3JpdGUoY3R4LCAodW5zaWduZWQgbG9uZylpc29sYXRlZF9sb2FkZXIgPj4gMzIpOworCWN0eC0+b3BzLT5zaWduYWwyX3dyaXRlKGN0eCwKKwkJCSh1bnNpZ25lZCBsb25nKWlzb2xhdGVkX2xvYWRlciAmIDB4ZmZmZmZmZmYpOworCisJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LAorCQkJU1BVX1JVTkNOVExfUlVOTkFCTEUgfCBTUFVfUlVOQ05UTF9JU09MQVRFKTsKKworCXJldCA9IDA7CisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwl3aGlsZSAoKChzdGF0dXMgPSBjdHgtPm9wcy0+c3RhdHVzX3JlYWQoY3R4KSkgJiBzdGF0dXNfbG9hZGluZykgPT0KKwkJCQlzdGF0dXNfbG9hZGluZykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBsb2FkZXJcbiIsCisJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXRfZHJvcF9wcml2OworCQl9CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCWlmICghKHN0YXR1cyAmIFNQVV9TVEFUVVNfUlVOTklORykpIHsKKwkJLyogSWYgaXNvbGF0ZWQgTE9BRCBoYXMgZmFpbGVkOiBydW4gU1BVLCB3ZSB3aWxsIGdldCBhIHN0b3AtYW5kCisJCSAqIHNpZ25hbCBsYXRlci4gKi8KKwkJcHJfZGVidWcoIiVzOiBpc29sYXRlZCBMT0FEIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CisJCXJldCA9IC1FQUNDRVM7CisKKwl9IGVsc2UgaWYgKCEoc3RhdHVzICYgU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSkpIHsKKwkJLyogVGhpcyBpc24ndCBhbGxvd2VkIGJ5IHRoZSBDQkVBLCBidXQgY2hlY2sgYW55d2F5ICovCisJCXByX2RlYnVnKCIlczogU1BVIGZlbGwgb3V0IG9mIGlzb2xhdGVkIG1vZGU/XG4iLCBfX0ZVTkNUSU9OX18pOworCQljdHgtPm9wcy0+cnVuY250bF93cml0ZShjdHgsIFNQVV9SVU5DTlRMX1NUT1ApOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworb3V0X2Ryb3BfcHJpdjoKKwkvKiBGaW5pc2hlZCBhY2Nlc3NpbmcgdGhlIGxvYWRlci4gRHJvcCBrZXJuZWwgbW9kZSAqLworCXNyMSB8PSBNRkNfU1RBVEUxX1BST0JMRU1fU1RBVEVfTUFTSzsKKwlzcHVfbWZjX3NyMV9zZXQoY3R4LT5zcHUsIHNyMSk7CisKK291dF91bmxvY2s6CisJc3B1X3JlbGVhc2VfZXhjbHVzaXZlKGN0eCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc3B1X3J1bl9pbml0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMpCiB7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHJ1bmNudGwgPSBTUFVfUlVOQ05UTF9SVU5OQUJMRTsKIAotCWlmICgocmV0ID0gc3B1X2FjcXVpcmVfcnVubmFibGUoY3R4KSkgIT0gMCkKKwlyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JY3R4LT5vcHMtPm5wY193cml0ZShjdHgsICpucGMpOwotCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfUlVOTkFCTEUpOwotCXJldHVybiAwOworCisJaWYgKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX0lTT0xBVEUpIHsKKwkJaWYgKCEoY3R4LT5vcHMtPnN0YXR1c19yZWFkKGN0eCkgJiBTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFKSkgeworCQkJLyogTmVlZCB0byByZWxlYXNlIGN0eCwgYmVjYXVzZSBzcHVfc2V0dXBfaXNvbGF0ZWQgd2lsbAorCQkJICogYWNxdWlyZSBpdCBleGNsdXNpdmVseS4KKwkJCSAqLworCQkJc3B1X3JlbGVhc2UoY3R4KTsKKwkJCXJldCA9IHNwdV9zZXR1cF9pc29sYXRlZChjdHgpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gc3B1X2FjcXVpcmVfcnVubmFibGUoY3R4KTsKKwkJfQorCisJCS8qIGlmIHVzZXJzcGFjZSBoYXMgc2V0IHRoZSBydW5jbnRybCByZWdpc3RlciAoZWcsIHRvIGlzc3VlIGFuCisJCSAqIGlzb2xhdGVkIGV4aXQpLCB3ZSBuZWVkIHRvIHJlLXNldCBpdCBoZXJlICovCisJCXJ1bmNudGwgPSBjdHgtPm9wcy0+cnVuY250bF9yZWFkKGN0eCkgJgorCQkJKFNQVV9SVU5DTlRMX1JVTk5BQkxFIHwgU1BVX1JVTkNOVExfSVNPTEFURSk7CisJCWlmIChydW5jbnRsID09IDApCisJCQlydW5jbnRsID0gU1BVX1JVTkNOVExfUlVOTkFCTEU7CisJfSBlbHNlCisJCWN0eC0+b3BzLT5ucGNfd3JpdGUoY3R4LCAqbnBjKTsKKworCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgcnVuY250bCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc3B1X3J1bl9maW5pKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMsCkBAIC03MCwxMyArMTgyLDcgQEAKIAogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCWlmICh1bmxpa2VseShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkgewotCQlpZiAoKCpzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkKLQkJICAgICYmICgqc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCkgPT0gMHgzZmZmKSB7Ci0JCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7Ci0JCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCX0KLQl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMDQsNiArMzEwLDcgQEAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjdHgtPnJ1bl9zZW1hKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAorCWN0eC0+b3BzLT5tYXN0ZXJfc3RhcnQoY3R4KTsKIAljdHgtPmV2ZW50X3JldHVybiA9IDA7CiAJcmV0ID0gc3B1X3J1bl9pbml0KGN0eCwgbnBjKTsKIAlpZiAocmV0KQpAQCAtMjIzLDcgKzMzMCw3IEBACiAJCWlmICh1bmxpa2VseShjdHgtPnN0YXRlICE9IFNQVV9TVEFURV9SVU5OQUJMRSkpIHsKIAkJCXJldCA9IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoY3R4LCBucGMsICZzdGF0dXMpOwogCQkJaWYgKHJldCkKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIG91dDI7CiAJCQljb250aW51ZTsKIAkJfQogCQlyZXQgPSBzcHVfcHJvY2Vzc19ldmVudHMoY3R4KTsKQEAgLTIzMSwxMiArMzM4LDI0IEBACiAJfSB3aGlsZSAoIXJldCAmJiAhKHN0YXR1cyAmIChTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCB8CiAJCQkJICAgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpKSk7CiAKLQljdHgtPm9wcy0+cnVuY250bF9zdG9wKGN0eCk7CisJY3R4LT5vcHMtPm1hc3Rlcl9zdG9wKGN0eCk7CiAJcmV0ID0gc3B1X3J1bl9maW5pKGN0eCwgbnBjLCAmc3RhdHVzKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gc3RhdHVzOwogCXNwdV95aWVsZChjdHgpOwogCitvdXQyOgorCWlmICgocmV0ID09IDApIHx8CisJICAgICgocmV0ID09IC1FUkVTVEFSVFNZUykgJiYKKwkgICAgICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpIHx8CisJICAgICAgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkgJiYKKwkgICAgICAgKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQgIT0gMHgyMTA0KSkpKSkKKwkJcmV0ID0gc3RhdHVzOworCisJaWYgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkKKwkgICAgJiYgKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpID09IDB4M2ZmZikgeworCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwl9CisKIG91dDoKIAkqZXZlbnQgPSBjdHgtPmV2ZW50X3JldHVybjsKIAl1cCgmY3R4LT5ydW5fc2VtYSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IGEwZjU1Y2EuLjcwZmIxMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlIDxhc20vc3B1X2luZm8uaD4KIAogLyogVGhlIG1hZ2ljIG51bWJlciBmb3Igb3VyIGZpbGUgc3lzdGVtICovCiBlbnVtIHsKQEAgLTExNCwxMyArMTE1LDE5IEBACiAJdm9pZCAoKm5wY193cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOwogCSB1MzIoKnN0YXR1c19yZWFkKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKIAljaGFyKigqZ2V0X2xzKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKKwkgdTMyICgqcnVuY250bF9yZWFkKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKIAl2b2lkICgqcnVuY250bF93cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOwotCXZvaWQgKCpydW5jbnRsX3N0b3ApIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworCXZvaWQgKCptYXN0ZXJfc3RhcnQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworCXZvaWQgKCptYXN0ZXJfc3RvcCkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCk7CiAJaW50ICgqc2V0X21mY19xdWVyeSkoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4LCB1MzIgbWFzaywgdTMyIG1vZGUpOwogCXUzMiAoKnJlYWRfbWZjX3RhZ3N0YXR1cykoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKIAl1MzIgKCpnZXRfbWZjX2ZyZWVfZWxlbWVudHMpKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKLQlpbnQgKCpzZW5kX21mY19jb21tYW5kKShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKLQkJCQkJc3RydWN0IG1mY19kbWFfY29tbWFuZCAqY21kKTsKKwlpbnQgKCpzZW5kX21mY19jb21tYW5kKShzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCisJCQkJc3RydWN0IG1mY19kbWFfY29tbWFuZCAqIGNtZCk7CisJdm9pZCAoKmRtYV9pbmZvX3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCisJCQkgICAgICAgc3RydWN0IHNwdV9kbWFfaW5mbyAqIGluZm8pOworCXZvaWQgKCpwcm94eWRtYV9pbmZvX3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCisJCQkJICAgIHN0cnVjdCBzcHVfcHJveHlkbWFfaW5mbyAqIGluZm8pOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzcHVfY29udGV4dF9vcHMgc3B1X2h3X29wczsKQEAgLTEzNSw2ICsxNDIsNyBAQAogCWNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHNwdWZzX2lub2RlX2luZm8sIHZmc19pbm9kZSkKIAogZXh0ZXJuIHN0cnVjdCB0cmVlX2Rlc2NyIHNwdWZzX2Rpcl9jb250ZW50c1tdOworZXh0ZXJuIHN0cnVjdCB0cmVlX2Rlc2NyIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzW107CiAKIC8qIHN5c3RlbSBjYWxsIGltcGxlbWVudGF0aW9uICovCiBsb25nIHNwdWZzX3J1bl9zcHUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xNjIsNiArMTcwLDEyIEBACiB2b2lkIHNwdV9yZWxlYXNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIGludCBzcHVfYWNxdWlyZV9ydW5uYWJsZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CiB2b2lkIHNwdV9hY3F1aXJlX3NhdmVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK2ludCBzcHVfYWNxdWlyZV9leGNsdXNpdmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1X3JlbGVhc2VfZXhjbHVzaXZlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXVwX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworfQogCiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1NjQgZmxhZ3MpOwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CkBAIC0xNjksNiArMTgzLDggQEAKIGludCBfX2luaXQgc3B1X3NjaGVkX2luaXQodm9pZCk7CiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKTsKIAorZXh0ZXJuIGNoYXIgKmlzb2xhdGVkX2xvYWRlcjsKKwogLyoKICAqIHNwdWZzX3dhaXQKICAqIAlTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCkBAIC0yMDcsNCArMjIzLDE1IEBACiB2b2lkIHNwdWZzX21mY19jYWxsYmFjayhzdHJ1Y3Qgc3B1ICpzcHUpOwogdm9pZCBzcHVmc19kbWFfY2FsbGJhY2soc3RydWN0IHNwdSAqc3B1LCBpbnQgdHlwZSk7CiAKK2V4dGVybiBzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzIHNwdWZzX2NvcmVkdW1wX2NhbGxzOworc3RydWN0IHNwdWZzX2NvcmVkdW1wX3JlYWRlciB7CisJY2hhciAqbmFtZTsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQljaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpOworCXU2NCAoKmdldCkodm9pZCAqZGF0YSk7CisJc2l6ZV90IHNpemU7Cit9OworZXh0ZXJuIHN0cnVjdCBzcHVmc19jb3JlZHVtcF9yZWFkZXIgc3B1ZnNfY29yZWR1bXBfcmVhZFtdOworZXh0ZXJuIGludCBzcHVmc19jb3JlZHVtcF9udW1fbm90ZXM7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCmluZGV4IDBmNzgyY2EuLmMwODk4MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqICAgICBzYXZlZCBhdCB0aGlzIHRpbWUuCiAJICovCiAJaXNvbGF0ZV9zdGF0ZSA9IFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUgfAotCSAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVVRVUyB8IFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFVVFVTOworCSAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVFVTIHwgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVRVUzsKIAlyZXR1cm4gKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBpc29sYXRlX3N0YXRlKSA/IDEgOiAwOwogfQogCkBAIC0xMDQ2LDEyICsxMDQ2LDEyIEBACiAJICovCiAJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpIHsKIAkJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgotCQkgICAgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVVUVVMpIHsKKwkJICAgIFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFUVVMpIHsKIAkJCVBPTExfV0hJTEVfVFJVRShpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKIAkJCQkJU1BVX1NUQVRVU19SVU5OSU5HKTsKIAkJfQogCQlpZiAoKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgotCQkgICAgIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFVVFVTKQorCQkgICAgIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFUVVMpCiAJCSAgICB8fCAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCiAJCQlTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFKSkgewogCQkJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9TVE9QKTsKQEAgLTEwODUsNyArMTA4NSw3IEBACiAJICovCiAJaWYgKCEoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfUlVOTklORykpIHsKIAkJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgotCQkgICAgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVVUVVMpIHsKKwkJICAgIFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFUVVMpIHsKIAkJCXNwdV9tZmNfc3IxX3NldChzcHUsCiAJCQkJCU1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0spOwogCQkJZWllaW8oKTsKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAJCQkJCVNQVV9TVEFUVVNfUlVOTklORyk7CiAJCX0KIAkJaWYgKChpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKLQkJICAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVVRVUykKKwkJICAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVFVTKQogCQkgICAgfHwgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgogCQkJU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSkpIHsKIAkJCXNwdV9tZmNfc3IxX3NldChzcHUsCkBAIC0xOTE2LDYgKzE5MTYsNTEgQEAKIAl3YWl0X3NwdV9zdG9wcGVkKHByZXYsIHNwdSk7CS8qIFN0ZXAgNTcuICovCiB9CiAKK3N0YXRpYyB2b2lkIGZvcmNlX3NwdV9pc29sYXRlX2V4aXQoc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU3RvcCBTUEUgZXhlY3V0aW9uIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqLworCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgU1BVX1JVTkNOVExfU1RPUCk7CisJaW9iYXJyaWVyX3J3KCk7CisJUE9MTF9XSElMRV9UUlVFKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpOworCisJLyogUmVzdGFydCBTUEUgbWFzdGVyIHJ1bmNudGwuICovCisJc3B1X21mY19zcjFfc2V0KHNwdSwgTUZDX1NUQVRFMV9NQVNURVJfUlVOX0NPTlRST0xfTUFTSyk7CisJaW9iYXJyaWVyX3coKTsKKworCS8qIEluaXRpYXRlIGlzb2xhdGUgZXhpdCByZXF1ZXN0IGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X3ByaXZjbnRsX1JXLCA0TEwpOworCWlvYmFycmllcl93KCk7CisJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCAyKTsKKwlpb2JhcnJpZXJfcncoKTsKKwlQT0xMX1dISUxFX0ZBTFNFKChpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpCisJCQkJJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkpOworCisJLyogUmVzZXQgbG9hZCByZXF1ZXN0IHRvIG5vcm1hbC4gKi8KKwlvdXRfYmU2NCgmcHJpdjItPnNwdV9wcml2Y250bF9SVywgU1BVX1BSSVZDTlRfTE9BRF9SRVFVRVNUX05PUk1BTCk7CisJaW9iYXJyaWVyX3coKTsKK30KKworLyoqCisgKiBzdG9wX3NwdV9pc29sYXRlCisgKglDaGVjayBTUFUgcnVuLWNvbnRyb2wgc3RhdGUgYW5kIGZvcmNlIGlzb2xhdGVkCisgKglleGl0IGZ1bmN0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIHZvaWQgc3RvcF9zcHVfaXNvbGF0ZShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisKKwlpZiAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUpIHsKKwkJLyogVGhlIFNQVSBpcyBpbiBpc29sYXRlZCBzdGF0ZTsgdGhlIG9ubHkgd2F5CisJCSAqIHRvIGdldCBpdCBvdXQgaXMgdG8gcGVyZm9ybSBhbiBpc29sYXRlZAorCQkgKiBleGl0IChjbGVhbikgb3BlcmF0aW9uLgorCQkgKi8KKwkJZm9yY2Vfc3B1X2lzb2xhdGVfZXhpdChzcHUpOworCX0KK30KKwogc3RhdGljIHZvaWQgaGFydmVzdChzdHJ1Y3Qgc3B1X3N0YXRlICpwcmV2LCBzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJLyoKQEAgLTE5MjgsNiArMTk3Myw3IEBACiAJaW5oaWJpdF91c2VyX2FjY2VzcyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMy4gICovCiAJdGVybWluYXRlX3NwdV9hcHAocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDQuICAqLwogCXNldF9zd2l0Y2hfcGVuZGluZyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNS4gICovCisJc3RvcF9zcHVfaXNvbGF0ZShzcHUpOwkJCS8qIE5FVy4gICAgICovCiAJcmVtb3ZlX290aGVyX3NwdV9hY2Nlc3MocHJldiwgc3B1KTsJLyogU3RlcCA2LiAgKi8KIAlzdXNwZW5kX21mYyhwcmV2LCBzcHUpOwkgICAgICAgICAgICAgICAgLyogU3RlcCA3LiAgKi8KIAl3YWl0X3N1c3BlbmRfbWZjX2NvbXBsZXRlKHByZXYsIHNwdSk7CS8qIFN0ZXAgOC4gICovCkBAIC0yMDk2LDExICsyMTQyLDExIEBACiAJYWNxdWlyZV9zcHVfbG9jayhzcHUpOwkgICAgICAgIC8qIFN0ZXAgMS4gICAgICovCiAJcmMgPSBfX2RvX3NwdV9zYXZlKHByZXYsIHNwdSk7CS8qIFN0ZXBzIDItNTMuICovCiAJcmVsZWFzZV9zcHVfbG9jayhzcHUpOwotCWlmIChyYykgeworCWlmIChyYyAhPSAwICYmIHJjICE9IDIgJiYgcmMgIT0gNikgewogCQlwYW5pYygiJXMgZmFpbGVkIG9uIFNQVVslZF0sIHJjPSVkLlxuIiwKIAkJICAgICAgX19mdW5jX18sIHNwdS0+bnVtYmVyLCByYyk7CiAJfQotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdV9zYXZlKTsKIApAQCAtMjE2NSw5ICsyMjExLDYgQEAKIAkgICAgTUZDX1NUQVRFMV9QUk9CTEVNX1NUQVRFX01BU0sgfAogCSAgICBNRkNfU1RBVEUxX1JFTE9DQVRFX01BU0sgfCBNRkNfU1RBVEUxX0JVU19UTEJJRV9NQVNLOwogCi0JLyogU2V0IHN0b3JhZ2UgZGVzY3JpcHRpb24uICAqLwotCWNzYS0+cHJpdjEubWZjX3Nkcl9SVyA9IG1mc3ByKFNQUk5fU0RSMSk7Ci0KIAkvKiBFbmFibGUgT1Mtc3BlY2lmaWMgc2V0IG9mIGludGVycnVwdHMuICovCiAJY3NhLT5wcml2MS5pbnRfbWFza19jbGFzczBfUlcgPSBDTEFTUzBfRU5BQkxFX0RNQV9BTElHTk1FTlRfSU5UUiB8CiAJICAgIENMQVNTMF9FTkFCTEVfSU5WQUxJRF9ETUFfQ09NTUFORF9JTlRSIHwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9jaHJwLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvY2hycC5oCmluZGV4IDk5NmMyODcuLjYzZjBhZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9jaHJwLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL2NocnAuaApAQCAtOSw0ICs5LDMgQEAKIAogZXh0ZXJuIHZvaWQgY2hycF9maW5kX2JyaWRnZXModm9pZCk7CiBleHRlcm4gdm9pZCBjaHJwX2V2ZW50X3NjYW4odW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBjaHJwX3BjaWJpb3NfZml4dXAodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKaW5kZXggMGY0MzQwNS4uZGRiNGExMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwpAQCAtMTU2LDE1ICsxNTYsNiBAQAogCXJldHVybiAxOwogfQogCi12b2lkIF9faW5pdAotY2hycF9wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLX0KLQogI2RlZmluZSBQUkdfQ0xfUkVTRVRfVkFMSUQgMHgwMDAxMDAwMAogCiBzdGF0aWMgdm9pZCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKaW5kZXggNDliOGRhYi4uZTFmNTFkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKQEAgLTU4OCw3ICs1ODgsNiBAQAogCUlTQV9ETUFfVEhSRVNIT0xEID0gfjBMOwogCURNQV9NT0RFX1JFQUQgPSAweDQ0OwogCURNQV9NT0RFX1dSSVRFID0gMHg0ODsKLQlpc2FfaW9fYmFzZSA9IENIUlBfSVNBX0lPX0JBU0U7CQkvKiBkZWZhdWx0IHZhbHVlICovCiAKIAlyZXR1cm4gMTsKIH0KQEAgLTYwMCw3ICs1OTksNiBAQAogCS5pbml0CQkJPSBjaHJwX2luaXQyLAogCS5zaG93X2NwdWluZm8JCT0gY2hycF9zaG93X2NwdWluZm8sCiAJLmluaXRfSVJRCQk9IGNocnBfaW5pdF9JUlEsCi0JLnBjaWJpb3NfZml4dXAJCT0gY2hycF9wY2liaW9zX2ZpeHVwLAogCS5yZXN0YXJ0CQk9IHJ0YXNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHJ0YXNfcG93ZXJfb2ZmLAogCS5oYWx0CQkJPSBydGFzX2hhbHQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKaW5kZXggMjM0YTg2MS4uZGRiZTM5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwpAQCAtNzQsNiArNzQsMTggQEAKIAkgIFNlbGVjdCBTQU5EUE9JTlQgaWYgY29uZmlndXJpbmcgZm9yIGEgTW90b3JvbGEgU2FuZHBvaW50IFgzCiAJICAoYW55IGZsYXZvcikuCiAKK2NvbmZpZyBMSU5LU1RBVElPTgorCWJvb2wgIkxpbmtzdGF0aW9uIC8gS3Vyb2JveChIRykgZnJvbSBCdWZmYWxvIgorCXNlbGVjdCBNUElDCisJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAgaWYgU0VSSUFMXzgyNTAKKwloZWxwCisJICBTZWxlY3QgTElOS1NUQVRJT04gaWYgY29uZmlndXJpbmcgZm9yIG9uZSBvZiBQUEMtIChNUEM4MjQxKQorCSAgYmFzZWQgTkFTIHN5c3RlbXMgZnJvbSBCdWZmYWxvIFRlY2hub2xvZ3kuIFNvIGZhciBvbmx5CisJICBLdXJvYm94SEcgaGFzIGJlZW4gdGVzdGVkLiBJbiB0aGUgZnV0dXJlIGNsYXNzaWNhbCBLdXJvYm94LAorCSAgTGlua3N0YXRpb24tSSBIRC1ITEFOIGFuZCBIRC1IR0xBTiB2ZXJzaW9ucywgYW5kIFBQQy1iYXNlZAorCSAgVGVyYXN0YXRpb24gc3lzdGVtcyBzaG91bGQgYmUgc3VwcG9ydGVkIHRvby4KKwogY29uZmlnIE1QQzc0NDhIUEMyCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzc0NDhIUEMyKFRhaWdhKSIKIAlzZWxlY3QgVFNJMTA4X0JSSURHRQpAQCAtMTQ2LDE1ICsxNTgsNiBAQAogCSAgU2VsZWN0IFBRMkZBRFMgaWYgeW91IHdpc2ggdG8gY29uZmlndXJlIGZvciBhIEZyZWVzY2FsZQogCSAgUFEyRkFEUyBib2FyZCAoLVZSIG9yIC1aVSkuCiAKLWNvbmZpZyBMSVRFNTIwMAotCWJvb2wgIkZyZWVzY2FsZSBMSVRFNTIwMCAvIChJY2VDdWJlKSIKLQlzZWxlY3QgUFBDX01QQzUyeHgKLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgTElURTUyMDAgZGV2IGJvYXJkIGZvciB0aGUgTVBDNTIwMCBmcm9tIEZyZWVzY2FsZS4KLQkgIFRoaXMgaXMgZm9yIHRoZSBMSVRFNTIwMCB2ZXJzaW9uIDIuMCBib2FyZC4gRG9uJ3Qga25vdyBpZiBpdCBjaGFuZ2VzCi0JICBtdWNoIGJ1dCBpdCdzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gdGhpcyBib2FyZCB2ZXJzaW9uLiBJIHRoaW5rIHRoaXMKLQkgIGJvYXJkIGlzIGFsc28ga25vd24gYXMgSWNlQ3ViZS4KLQogY29uZmlnIEVWNjQzNjAKIAlib29sICJNYXJ2ZWxsLUVWNjQzNjBCUCIKIAloZWxwCkBAIC0xNzIsOSArMTc1LDYgQEAKIAlkZXBlbmRzIG9uIDh4eCAmJiAoVFFNODIzTCB8fCBUUU04NTBMIHx8IEZQUzg1MEwgfHwgVFFNODU1TCB8fCBUUU04NjBMKQogCWRlZmF1bHQgeQogCi1jb25maWcgUFBDX01QQzUyeHgKLQlib29sCi0KIGNvbmZpZyA4MjYwCiAJYm9vbCAiQ1BNMiBTdXBwb3J0IiBpZiBXSUxMT1cKIAlkZXBlbmRzIG9uIDZ4eApAQCAtMjA4LDcgKzIwOCw3IEBACiAJZGVwZW5kcyBvbiBTQU5EUE9JTlQgfHwgU1BSVUNFIHx8IFBQTFVTIHx8IFwKIAkJUFJQTUM3NTAgfHwgUFJQTUM4MDAgfHwgTE9QRUMgfHwgXAogCQkoRVY2NDI2MCAmJiAhU0VSSUFMX01QU0MpIHx8IENIRVNUTlVUIHx8IFJBRFNUT05FX1BQQzdEIHx8IFwKLQkJODN4eAorCQk4M3h4IHx8IExJTktTVEFUSU9OCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBGT1JDRQpAQCAtMjgyLDEzICsyODIsMTMgQEAKIAogY29uZmlnIE1QQzEwWF9CUklER0UKIAlib29sCi0JZGVwZW5kcyBvbiBQT1dFUlBNQzI1MCB8fCBMT1BFQyB8fCBTQU5EUE9JTlQKKwlkZXBlbmRzIG9uIFBPV0VSUE1DMjUwIHx8IExPUEVDIHx8IFNBTkRQT0lOVCB8fCBMSU5LU1RBVElPTgogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEMxMFhfT1BFTlBJQwogCWJvb2wKLQlkZXBlbmRzIG9uIFBPV0VSUE1DMjUwIHx8IExPUEVDIHx8IFNBTkRQT0lOVAorCWRlcGVuZHMgb24gUE9XRVJQTUMyNTAgfHwgTE9QRUMgfHwgU0FORFBPSU5UIHx8IExJTktTVEFUSU9OCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEMxMFhfU1RPUkVfR0FUSEVSSU5HCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9NYWtlZmlsZQppbmRleCBmYTQ5OWZlLi5kM2QxMWEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvTWFrZWZpbGUKQEAgLTIsMyArMiw0IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgNnh4Lzd4eC83eHh4eCBsaW51eCBrZXJuZWwuCiAjCiBvYmotJChDT05GSUdfTVBDNzQ0OEhQQzIpCSs9IG1wYzc0NDhfaHBjMi5vCitvYmotJChDT05GSUdfTElOS1NUQVRJT04pCSs9IGxpbmtzdGF0aW9uLm8gbHNfdWFydC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OTlkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIEJvYXJkIHNldHVwIHJvdXRpbmVzIGZvciB0aGUgQnVmZmFsbyBMaW5rc3RhdGlvbiAvIEt1cm9ib3ggUGxhdGZvcm0uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEcuIExpYWtob3ZldHNraSAoZy5saWFraG92ZXRza2lAZ214LmRlKQorICoKKyAqIEJhc2VkIG9uIHNhbmRwb2ludC5jIGJ5IE1hcmsgQS4gR3JlZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YKKyAqIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL21wYzEweC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBsaW5rc3RhdGlvbl9waHlzbWFwX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgPSAibXRkX2Zpcm1pbWciLAorCQkub2Zmc2V0ID0gMHgwMDAwMDAsCisJCS5zaXplICAgPSAweDMwMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfYm9vdGNvZGUiLAorCQkub2Zmc2V0ID0gMHgzMDAwMDAsCisJCS5zaXplICAgPSAweDA3MDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfc3RhdHVzIiwKKwkJLm9mZnNldCA9IDB4MzcwMDAwLAorCQkuc2l6ZSAgID0gMHgwMTAwMDAsCisJfSwKKwl7CisJCS5uYW1lICAgPSAibXRkX2NvbmYiLAorCQkub2Zmc2V0ID0gMHgzODAwMDAsCisJCS5zaXplICAgPSAweDA4MDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfYWxsZmxhc2giLAorCQkub2Zmc2V0ID0gMHgwMDAwMDAsCisJCS5zaXplICAgPSAweDQwMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfZGF0YSIsCisJCS5vZmZzZXQgPSAweDMxMDAwMCwKKwkJLnNpemUgICA9IDB4MGYwMDAwLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCWludCBsZW47CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCWludCAqYnVzX3JhbmdlOworCisJcHJpbnRrKCJBZGRpbmcgUENJIGhvc3QgYnJpZGdlICVzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CisKKwlidXNfcmFuZ2UgPSAoaW50ICopIGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgorCQkJCSIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CisJaG9zZS0+YXJjaF9kYXRhID0gZGV2OworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKKworCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KKwkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KKwlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxpbmtzdGF0aW9uX3NldHVwX2FyY2godm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworI2lmZGVmIENPTkZJR19NVERfUEhZU01BUAorCXBoeXNtYXBfc2V0X3BhcnRpdGlvbnMobGlua3N0YXRpb25fcGh5c21hcF9wYXJ0aXRpb25zLAorCQkJICAgICAgIEFSUkFZX1NJWkUobGlua3N0YXRpb25fcGh5c21hcF9wYXJ0aXRpb25zKSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChpbml0cmRfc3RhcnQpCisJCVJPT1RfREVWID0gUm9vdF9SQU0wOworCWVsc2UKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19ST09UX05GUworCQlST09UX0RFViA9IFJvb3RfTkZTOworI2Vsc2UKKwkJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKKworCS8qIExvb2t1cCBQQ0kgaG9zdCBicmlkZ2VzICovCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQorCQlhZGRfYnJpZGdlKG5wKTsKKworCXByaW50ayhLRVJOX0lORk8gIkJVRkZBTE8gTmV0d29yayBBdHRhY2hlZCBTdG9yYWdlIFNlcmllc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiKEMpIDIwMDItMjAwNSBCVUZGQUxPIElOQy5cbiIpOworfQorCisvKgorICogSW50ZXJydXB0IHNldHVwIGFuZCBzZXJ2aWNlLiAgSW50ZXJycnVwdHMgb24gdGhlIGxpbmtzdGF0aW9uIGNvbWUKKyAqIGZyb20gdGhlIGZvdXIgUENJIHNsb3RzIHBsdXMgb25ib2FyZCA4MjQxIGRldmljZXM6IEkyQywgRFVBUlQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBsaW5rc3RhdGlvbl9pbml0X0lSUSh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG5wOworCXZvaWQgKnByb3A7CisJaW50IHNpemU7CisJcGh5c19hZGRyX3QgcGFkZHI7CisKKwlkbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKKwlpZiAoZG5wID09IE5VTEwpCisJCXJldHVybjsKKworCXByb3AgPSAoc3RydWN0IGRldmljZV9ub2RlICopZ2V0X3Byb3BlcnR5KGRucCwgInJlZyIsICZzaXplKTsKKwlwYWRkciA9IChwaHlzX2FkZHJfdClvZl90cmFuc2xhdGVfYWRkcmVzcyhkbnAsIHByb3ApOworCisJbXBpYyA9IG1waWNfYWxsb2MoZG5wLCBwYWRkciwgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCwgNCwgMzIsICIgRVBJQyAgICAgIik7CisJQlVHX09OKG1waWMgPT0gTlVMTCk7CisKKwkvKiBQQ0kgSVJRcyAqLworCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCBwYWRkciArIDB4MTAyMDApOworCisJLyogSTJDICovCisJbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHBhZGRyICsgMHgxMTAwMCk7CisKKwkvKiB0dHlTMCwgdHR5UzEgKi8KKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgcGFkZHIgKyAweDExMTAwKTsKKworCW1waWNfaW5pdChtcGljKTsKK30KKworZXh0ZXJuIHZvaWQgYXZyX3VhcnRfY29uZmlndXJlKHZvaWQpOworZXh0ZXJuIHZvaWQgYXZyX3VhcnRfc2VuZChjb25zdCBjaGFyKTsKKworc3RhdGljIHZvaWQgbGlua3N0YXRpb25fcmVzdGFydChjaGFyICpjbWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIFJlc2V0IHN5c3RlbSB2aWEgQVZSICovCisJYXZyX3VhcnRfY29uZmlndXJlKCk7CisJLyogU2VuZCByZWJvb3QgY29tbWFuZCAqLworCWF2cl91YXJ0X3NlbmQoJ0MnKTsKKworCWZvcig7OykgIC8qIFNwaW4gdW50aWwgcmVzZXQgaGFwcGVucyAqLworCQlhdnJfdWFydF9zZW5kKCdHJyk7CS8qICJraWNrIiAqLworfQorCitzdGF0aWMgdm9pZCBsaW5rc3RhdGlvbl9wb3dlcl9vZmYodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUG93ZXIgZG93biBzeXN0ZW0gdmlhIEFWUiAqLworCWF2cl91YXJ0X2NvbmZpZ3VyZSgpOworCS8qIHNlbmQgc2h1dGRvd24gY29tbWFuZCAqLworCWF2cl91YXJ0X3NlbmQoJ0UnKTsKKworCWZvcig7OykgIC8qIFNwaW4gdW50aWwgcG93ZXItb2ZmIGhhcHBlbnMgKi8KKwkJYXZyX3VhcnRfc2VuZCgnRycpOwkvKiAia2ljayIgKi8KKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGxpbmtzdGF0aW9uX2hhbHQodm9pZCkKK3sKKwlsaW5rc3RhdGlvbl9wb3dlcl9vZmYoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGxpbmtzdGF0aW9uX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3ByaW50ZihtLCAidmVuZG9yXHRcdDogQnVmZmFsbyBUZWNobm9sb2d5XG4iKTsKKwlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogTGlua3N0YXRpb24gSS9LdXJvYm94KEhHKVxuIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxpbmtzdGF0aW9uX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290OworCisJcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJsaW5rc3RhdGlvbiIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworZGVmaW5lX21hY2hpbmUobGlua3N0YXRpb24peworCS5uYW1lIAkJCT0gIkJ1ZmZhbG8gTGlua3N0YXRpb24iLAorCS5wcm9iZSAJCQk9IGxpbmtzdGF0aW9uX3Byb2JlLAorCS5zZXR1cF9hcmNoIAkJPSBsaW5rc3RhdGlvbl9zZXR1cF9hcmNoLAorCS5pbml0X0lSUSAJCT0gbGlua3N0YXRpb25faW5pdF9JUlEsCisJLnNob3dfY3B1aW5mbyAJCT0gbGlua3N0YXRpb25fc2hvd19jcHVpbmZvLAorCS5nZXRfaXJxIAkJPSBtcGljX2dldF9pcnEsCisJLnJlc3RhcnQgCQk9IGxpbmtzdGF0aW9uX3Jlc3RhcnQsCisJLnBvd2VyX29mZiAJCT0gbGlua3N0YXRpb25fcG93ZXJfb2ZmLAorCS5oYWx0CSAJCT0gbGlua3N0YXRpb25faGFsdCwKKwkuY2FsaWJyYXRlX2RlY3IgCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xzX3VhcnQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbHNfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmNkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xzX3VhcnQuYwpAQCAtMCwwICsxLDEzMSBAQAorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21wYzEweC5oPgorI2luY2x1ZGUgPGFzbS9wcGNfc3lzLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdGVybWJpdHMuaD4KKworc3RhdGljIHZvaWQgX19pb21lbSAqYXZyX2FkZHI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdnJfY2xvY2s7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2Rfd29yazsKKworc3RhdGljIHZvaWQgd2Rfc3RvcCh2b2lkICp1bnVzZWQpCit7CisJY29uc3QgY2hhciBzdHJpbmdbXSA9ICJBQUFBRkZGRkpKSko+Pj4+VlZWVj4+Pj5aWlpaVlZWVktLS0siOworCWludCBpID0gMCwgcmVzY3VlID0gODsKKwlpbnQgbGVuID0gc3RybGVuKHN0cmluZyk7CisKKwl3aGlsZSAocmVzY3VlLS0pIHsKKwkJaW50IGo7CisJCWNoYXIgbHNyID0gaW5fOChhdnJfYWRkciArIFVBUlRfTFNSKTsKKworCQlpZiAobHNyICYgKFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9URU1UKSkgeworCQkJZm9yIChqID0gMDsgaiA8IDE2ICYmIGkgPCBsZW47IGorKywgaSsrKQorCQkJCW91dF84KGF2cl9hZGRyICsgVUFSVF9UWCwgc3RyaW5nW2ldKTsKKwkJCWlmIChpID09IGxlbikgeworCQkJCS8qIFJlYWQgIk9LIiBiYWNrOiA0bXMgZm9yIHRoZSBsYXN0ICJLS0tLIgorCQkJCSAgIHBsdXMgYSBjb3VwbGUgYnl0ZXMgYmFjayAqLworCQkJCW1zbGVlcCg3KTsKKwkJCQlwcmludGsoImxpbmtzdGF0aW9uOiBkaXNhcm1pbmcgdGhlIEFWUiB3YXRjaGRvZzogIik7CisJCQkJd2hpbGUgKGluXzgoYXZyX2FkZHIgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9EUikKKwkJCQkJcHJpbnRrKCIlYyIsIGluXzgoYXZyX2FkZHIgKyBVQVJUX1JYKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbXNsZWVwKDE3KTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisjZGVmaW5lIEFWUl9RVU9UKGNsb2NrKSAoKGNsb2NrKSArIDggKiA5NjAwKSAvICgxNiAqIDk2MDApCisKK3ZvaWQgYXZyX3VhcnRfY29uZmlndXJlKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBjdmFsID0gVUFSVF9MQ1JfV0xFTjg7CisJdW5zaWduZWQgaW50IHF1b3QgPSBBVlJfUVVPVChhdnJfY2xvY2spOworCisJaWYgKCFhdnJfYWRkciB8fCAhYXZyX2Nsb2NrKQorCQlyZXR1cm47CisKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfTENSLCBjdmFsKTsJCQkvKiBpbml0aWFsaXNlIFVBUlQgKi8KKwlvdXRfOChhdnJfYWRkciArIFVBUlRfTUNSLCAwKTsKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfSUVSLCAwKTsKKworCWN2YWwgfD0gVUFSVF9MQ1JfU1RPUCB8IFVBUlRfTENSX1BBUklUWSB8IFVBUlRfTENSX0VQQVI7CisKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfTENSLCBjdmFsKTsJCQkvKiBTZXQgY2hhcmFjdGVyIGZvcm1hdCAqLworCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0xDUiwgY3ZhbCB8IFVBUlRfTENSX0RMQUIpOwkvKiBzZXQgRExBQiAqLworCW91dF84KGF2cl9hZGRyICsgVUFSVF9ETEwsIHF1b3QgJiAweGZmKTsJCS8qIExTIG9mIGRpdmlzb3IgKi8KKwlvdXRfOChhdnJfYWRkciArIFVBUlRfRExNLCBxdW90ID4+IDgpOwkJCS8qIE1TIG9mIGRpdmlzb3IgKi8KKwlvdXRfOChhdnJfYWRkciArIFVBUlRfTENSLCBjdmFsKTsJCQkvKiByZXNldCBETEFCICovCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwkvKiBlbmFibGUgRklGTyAqLworfQorCit2b2lkIGF2cl91YXJ0X3NlbmQoY29uc3QgY2hhciBjKQoreworCWlmICghYXZyX2FkZHIgfHwgIWF2cl9jbG9jaykKKwkJcmV0dXJuOworCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX1RYLCBjKTsKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfVFgsIGMpOworCW91dF84KGF2cl9hZGRyICsgVUFSVF9UWCwgYyk7CisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX1RYLCBjKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxzX3VhcnRfaW5pdCh2b2lkKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKyNpZm5kZWYgQ09ORklHX1NFUklBTF84MjUwCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwkvKiBlbmFibGUgRklGTyAqLworCW91dF84KGF2cl9hZGRyICsgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKKwkgICAgICBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCk7CS8qIGNsZWFyIEZJRk9zICovCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0ZDUiwgMCk7CisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0lFUiwgMCk7CisKKwkvKiBDbGVhciB1cCBpbnRlcnJ1cHRzICovCisJKHZvaWQpIGluXzgoYXZyX2FkZHIgKyBVQVJUX0xTUik7CisJKHZvaWQpIGluXzgoYXZyX2FkZHIgKyBVQVJUX1JYKTsKKwkodm9pZCkgaW5fOChhdnJfYWRkciArIFVBUlRfSUlSKTsKKwkodm9pZCkgaW5fOChhdnJfYWRkciArIFVBUlRfTVNSKTsKKyNlbmRpZgorCWF2cl91YXJ0X2NvbmZpZ3VyZSgpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBsc191YXJ0c19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICphdnI7CisJcGh5c19hZGRyX3QgcGh5c19hZGRyOworCWludCBsZW47CisKKwlhdnIgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL3NvYzEweC9zZXJpYWxAODAwMDQ1MDAiKTsKKwlpZiAoIWF2cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdnJfY2xvY2sgPSAqKHUzMiopZ2V0X3Byb3BlcnR5KGF2ciwgImNsb2NrLWZyZXF1ZW5jeSIsICZsZW4pOworCXBoeXNfYWRkciA9ICgodTMyKilnZXRfcHJvcGVydHkoYXZyLCAicmVnIiwgJmxlbikpWzBdOworCisJaWYgKCFhdnJfY2xvY2sgfHwgIXBoeXNfYWRkcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdnJfYWRkciA9IGlvcmVtYXAocGh5c19hZGRyLCAzMik7CisJaWYgKCFhdnJfYWRkcikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsc191YXJ0X2luaXQoKTsKKworCUlOSVRfV09SSygmd2Rfd29yaywgd2Rfc3RvcCwgTlVMTCk7CisJc2NoZWR1bGVfd29yaygmd2Rfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChsc191YXJ0c19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCmluZGV4IGJkYjQ3NWMuLjNmY2M4NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtNjAsNyArNjAsNyBAQAogCiBleHRlcm4gaW50IHRzaTEwOF9zZXR1cF9wY2koc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwogZXh0ZXJuIHZvaWQgX25tYXNrX2FuZF9vcl9tc3IodW5zaWduZWQgbG9uZyBubWFzaywgdW5zaWduZWQgbG9uZyBvcl92YWwpOwotZXh0ZXJuIHZvaWQgdHNpMTA4X3BjaV9pbnRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRzaTEwOF9wY2lfaW50X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiB2b2lkIHRzaTEwOF9pcnFfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogCiBpbnQgbXBjNzQ0OF9ocGMyX2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKQEAgLTcxLDY1ICs3MSw2IEBACiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLS8qCi0gKiBmaW5kIHBjaSBzbG90IGJ5IGRldmZuIGluIGludGVycnVwdCBtYXAgb2YgT0YgdHJlZQotICovCi11OCBmaW5kX3Nsb3RfYnlfZGV2Zm4odW5zaWduZWQgaW50ICppbnRlcnJ1cHRfbWFwLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKXsKLQkJdG1wID0gaW50ZXJydXB0X21hcFtpKjQqN107Ci0JCWlmICgodG1wID4+IDExKSA9PSAoZGV2Zm4gPj4gMykpCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIGk7Ci19Ci0KLS8qCi0gKiBTY2FucyB0aGUgaW50ZXJydXB0IG1hcCBmb3IgcGNpIGRldmljZQotICovCi12b2lkIG1wYzc0NDhfaHBjMl9maXh1cF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCWNvbnN0IHVuc2lnbmVkIGludCAqaW50ZXJydXB0OwotCWludCBidXNucjsKLQlpbnQgbGVuOwotCXU4IHNsb3Q7Ci0JdTggcGluOwotCi0JLyogTG9va3VwIHRoZSBob3NlICovCi0JYnVzbnIgPSBkZXYtPmJ1cy0+bnVtYmVyOwotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzbnIpOwotCWlmICghaG9zZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJObyBwY2kgaG9zZSBmb3VuZFxuIik7Ci0KLQkvKiBDaGVjayBpdCBoYXMgYW4gT0Ygbm9kZSBhc3NvY2lhdGVkICovCi0Jbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgaG9zZS0+YXJjaF9kYXRhOwotCWlmICghbm9kZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJObyBwY2kgbm9kZSBmb3VuZFxuIik7Ci0KLQlpbnRlcnJ1cHQgPSBnZXRfcHJvcGVydHkobm9kZSwgImludGVycnVwdC1tYXAiLCAmbGVuKTsKLQlzbG90ID0gZmluZF9zbG90X2J5X2RldmZuKGludGVycnVwdCwgZGV2LT5kZXZmbik7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7Ci0JaWYgKHBpbiA9PSAwIHx8IHBpbiA+IDQpCi0JCXBpbiA9IDE7Ci0JcGluLS07Ci0JZGV2LT5pcnEgID0gaW50ZXJydXB0W3Nsb3QqNCo3ICsgcGluKjcgKyA1XTsKLQlEQkcoIlRTSV9QQ0k6IGRldi0+aXJxID0gMHgleFxuIiwgZGV2LT5pcnEpOwotfQotLyogdGVtcG9yYXJ5IHBjaSBpcnEgbWFwIGZpeHVwKi8KLQotdm9pZCBfX2luaXQgbXBjNzQ0OF9ocGMyX3BjaWJpb3NfZml4dXAodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQltcGM3NDQ4X2hwYzJfZml4dXBfaXJxKGRldik7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgX19pbml0IG1wYzc0NDhfaHBjMl9zZXR1cF9hcmNoKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CkBAIC0xOTIsOSArMTMzLDEyIEBACiB7CiAJc3RydWN0IG1waWMgKm1waWM7CiAJcGh5c19hZGRyX3QgbXBpY19wYWRkciA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICp0c2lfcGljOworI2lmZGVmIENPTkZJR19QQ0kKIAl1bnNpZ25lZCBpbnQgY2FzY2FkZV9wY2lfaXJxOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdHNpX3BjaTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRzaV9waWM7CisJc3RydWN0IGRldmljZV9ub2RlICpjYXNjYWRlX25vZGUgPSBOVUxMOworI2VuZGlmCiAKIAl0c2lfcGljID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7CiAJaWYgKHRzaV9waWMpIHsKQEAgLTIwOCwzMSArMTUyLDQxIEBACiAJCXJldHVybjsKIAl9CiAKLQlEQkcoIiVzOiB0c2kxMDhwaWMgcGh5c19hZGRyID0gMHgleFxuIiwgX19GVU5DVElPTl9fLAorCURCRygiJXM6IHRzaTEwOCBwaWMgcGh5c19hZGRyID0gMHgleFxuIiwgX19GVU5DVElPTl9fLAogCSAgICAodTMyKSBtcGljX3BhZGRyKTsKIAogCW1waWMgPSBtcGljX2FsbG9jKHRzaV9waWMsIG1waWNfcGFkZHIsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX0JJR19FTkRJQU4gfCBNUElDX1dBTlRTX1JFU0VUIHwKIAkJCU1QSUNfU1BWX0VPSSB8IE1QSUNfTk9fUFRIUk9VX0RJUyB8IE1QSUNfUkVHU0VUX1RTSTEwOCwKLQkJCTAsIC8qIG51bV9zb3VyY2VzIHVzZWQgKi8KLQkJCTAsIC8qIG51bV9zb3VyY2VzIHVzZWQgKi8KKwkJCTI0LAorCQkJTlJfSVJRUy00LCAvKiBudW1fc291cmNlcyB1c2VkICovCiAJCQkiVHNpMTA4X1BJQyIpOwogCi0JQlVHX09OKG1waWMgPT0gTlVMTCk7IC8qIFhYWFggKi8KKwlCVUdfT04obXBpYyA9PSBOVUxMKTsKKworCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCBtcGljX3BhZGRyICsgMHgxMDApOworCiAJbXBpY19pbml0KG1waWMpOwogCisjaWZkZWYgQ09ORklHX1BDSQogCXRzaV9wY2kgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicGNpIik7Ci0JaWYgKHRzaV9wY2kgPT0gMCkgeworCWlmICh0c2lfcGNpID09IE5VTEwpIHsKIAkJcHJpbnRrKCIlczogTm8gdHNpMTA4IHBjaSBub2RlIGZvdW5kICFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybjsKIAl9CisJY2FzY2FkZV9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInBpYy1yb3V0ZXIiKTsKKwlpZiAoY2FzY2FkZV9ub2RlID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogTm8gdHNpMTA4IHBjaSBjYXNjYWRlIG5vZGUgZm91bmQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KIAogCWNhc2NhZGVfcGNpX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHRzaV9wY2ksIDApOworCURCRygiJXM6IHRzaTEwOCBjYXNjYWRlX3BjaV9pcnEgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgICh1MzIpIGNhc2NhZGVfcGNpX2lycSk7CisJdHNpMTA4X3BjaV9pbnRfaW5pdChjYXNjYWRlX25vZGUpOwogCXNldF9pcnFfZGF0YShjYXNjYWRlX3BjaV9pcnEsIG1waWMpOwogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGNhc2NhZGVfcGNpX2lycSwgdHNpMTA4X2lycV9jYXNjYWRlKTsKLQotCXRzaTEwOF9wY2lfaW50X2luaXQoKTsKLQorI2VuZGlmCiAJLyogQ29uZmlndXJlIE1QSUMgb3V0cHV0cyB0byBDUFUwICovCiAJdHNpMTA4X3dyaXRlX3JlZyhUU0kxMDhfTVBJQ19PRkZTRVQgKyAweDMwYywgMCk7CiAJb2Zfbm9kZV9wdXQodHNpX3BpYyk7CkBAIC0yOTAsNyArMjQ0LDYgQEAKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwotCiB9CiAKIGRlZmluZV9tYWNoaW5lKG1wYzc0NDhfaHBjMil7CkBAIC0zMDAsNyArMjUzLDYgQEAKIAkuaW5pdF9JUlEgCQk9IG1wYzc0NDhfaHBjMl9pbml0X0lSUSwKIAkuc2hvd19jcHVpbmZvIAkJPSBtcGM3NDQ4X2hwYzJfc2hvd19jcHVpbmZvLAogCS5nZXRfaXJxIAkJPSBtcGljX2dldF9pcnEsCi0JLnBjaWJpb3NfZml4dXAgCQk9IG1wYzc0NDhfaHBjMl9wY2liaW9zX2ZpeHVwLAogCS5yZXN0YXJ0IAkJPSBtcGM3NDQ4X2hwYzJfcmVzdGFydCwKIAkuY2FsaWJyYXRlX2RlY3IgCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkubWFjaGluZV9jaGVja19leGNlcHRpb249IG1wYzc0NDhfbWFjaGluZV9jaGVja19leGNlcHRpb24sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUKaW5kZXggZGVlNGViNC4uMTNhYzMwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZQpAQCAtMSw1ICsxLDcgQEAKIEVYVFJBX0NGTEFHUwkrPSAtbW5vLW1pbmltYWwtdG9jCiAKK2V4dHJhLXkgKz0gZHQubworCiBvYmoteSArPSBodmxvZy5vIGh2bHBjb25maWcubyBscGFyZGF0YS5vIHNldHVwLm8gZHRfbW9kLm8gbWYubyBscGV2ZW50cy5vIFwKIAlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vIGlycS5vCiBvYmotJChDT05GSUdfUENJKSArPSBwY2kubyB2cGRpbmZvLm8KQEAgLTcsNSArOSw5IEBACiBvYmotJChDT05GSUdfVklPUEFUSCkgKz0gdmlvcGF0aC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0ga3N5bXMubwogCitxdWlldF9jbWRfZHRfc3RyaW5ncyA9IERUX1NUUiAgJEAKKyAgICAgIGNtZF9kdF9zdHJpbmdzID0gJChPQkpDT1BZKSAtLXJlbmFtZS1zZWN0aW9uIC5yb2RhdGEuc3RyMS44PS5kdF9zdHJpbmdzIFwKKwkJCQkkPCAkQAorCiAkKG9iaikvZHRfbW9kLm86CSQob2JqKS9kdC5vCi0JQCQoT0JKQ09QWSkgLS1yZW5hbWUtc2VjdGlvbiAucm9kYXRhLnN0cjEuOD0uZHRfc3RyaW5ncyAkKG9iaikvZHQubyAkKG9iaikvZHRfbW9kLm8KKwkkKGNhbGwgaWZfY2hhbmdlZCxkdF9zdHJpbmdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2R0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYwppbmRleCBlMzA1ZGVlLi45ZThhMzM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgImNhbGxfcGNpLmgiCiAjaW5jbHVkZSAicGNpLmgiCiAjaW5jbHVkZSAiaXRfZXhwX3ZwZF9wYW5lbC5oIgorI2luY2x1ZGUgIm5hY2EuaCIKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKQEAgLTIwNSwxMyArMjA2LDExIEBACiAJZHRfcHJvcChkdCwgbmFtZSwgJmRhdGEsIHNpemVvZih1MzIpKTsKIH0KIAotI2lmZGVmIG5vdHlldAogc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTY0KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjb25zdCBjaGFyICpuYW1lLAogCQl1NjQgZGF0YSkKIHsKIAlkdF9wcm9wKGR0LCBuYW1lLCAmZGF0YSwgc2l6ZW9mKHU2NCkpOwogfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBkdF9wcm9wX3U2NF9saXN0KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LAogCQljb25zdCBjaGFyICpuYW1lLCB1NjQgKmRhdGEsIGludCBuKQpAQCAtMzA2LDYgKzMwNSwxNyBAQAogCWR0X3Byb3BfdTMyKGR0LCAiaWJtLHBhcnRpdGlvbi1ubyIsIEh2THBDb25maWdfZ2V0THBJbmRleCgpKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGR0X2luaXRyZChzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCkKK3sKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwlpZiAobmFjYS54UmFtRGlzaykgeworCQlkdF9wcm9wX3U2NChkdCwgImxpbnV4LGluaXRyZC1zdGFydCIsICh1NjQpbmFjYS54UmFtRGlzayk7CisJCWR0X3Byb3BfdTY0KGR0LCAibGludXgsaW5pdHJkLWVuZCIsCisJCQkodTY0KW5hY2EueFJhbURpc2sgKyBuYWNhLnhSYW1EaXNrU2l6ZSAqIEhXX1BBR0VfU0laRSk7CisJfQorI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBkdF9kb192ZGV2aWNlKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LAogCQljb25zdCBjaGFyICpuYW1lLCB1MzIgcmVnLCBpbnQgdW5pdCwKIAkJY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqY29tcGF0LCBpbnQgZW5kKQpAQCAtNjQxLDYgKzY1MSw3IEBACiAJLyogL2Nob3NlbiAqLwogCWR0X3N0YXJ0X25vZGUoaXNlcmllc19kdCwgImNob3NlbiIpOwogCWR0X3Byb3Bfc3RyKGlzZXJpZXNfZHQsICJib290YXJncyIsIGNtZF9saW5lKTsKKwlkdF9pbml0cmQoaXNlcmllc19kdCk7CiAJZHRfZW5kX25vZGUoaXNlcmllc19kdCk7CiAKIAlkdF9jcHVzKGlzZXJpZXNfZHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwppbmRleCAyMTg4MTdkLi5kN2E3NTZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vdGNlLmg+CkBAIC0xMTQsMTIgKzExNSwxMCBAQAogewogCXN0cnVjdCBpb21tdV90YWJsZV9jYiAqcGFybXM7CiAKLQlwYXJtcyA9IGttYWxsb2Moc2l6ZW9mKCpwYXJtcyksIEdGUF9LRVJORUwpOworCXBhcm1zID0ga3phbGxvYyhzaXplb2YoKnBhcm1zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBhcm1zID09IE5VTEwpCiAJCXBhbmljKCJQQ0lfRE1BOiBUQ0UgVGFibGUgQWxsb2NhdGlvbiBmYWlsZWQuIik7CiAKLQltZW1zZXQocGFybXMsIDAsIHNpemVvZigqcGFybXMpKTsKLQogCXBhcm1zLT5pdGNfYnVzbm8gPSBidXNubzsKIAlwYXJtcy0+aXRjX3Nsb3RubyA9IHNsb3RubzsKIAlwYXJtcy0+aXRjX3ZpcnRidXMgPSB2aXJ0YnVzOwpAQCAtMTY4LDcgKzE2Nyw3IEBACiB9CiAKIAotdm9pZCBpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQordm9pZCBpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKIAlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKIAlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBQQ0lfRE4oZG4pOwpAQCAtMTg2LDE5ICsxODUsMTQgQEAKIAkJcGRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsLCAtMSk7CiAJZWxzZQogCQlrZnJlZSh0YmwpOworCXBkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9IHBkbi0+aW9tbXVfdGFibGU7CiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgaW9tbXVfZGV2X3NldHVwX2lTZXJpZXMoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9Ci1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfaVNlcmllcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IH0KLQogdm9pZCBpb21tdV9pbml0X2Vhcmx5X2lTZXJpZXModm9pZCkKIHsKIAlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX2lTZXJpZXM7CiAJcHBjX21kLnRjZV9mcmVlICA9IHRjZV9mcmVlX2lTZXJpZXM7CiAKLQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX2lTZXJpZXM7Ci0JcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9pU2VyaWVzOwotCi0JcGNpX2lvbW11X2luaXQoKTsKKwlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYwppbmRleCBhMjIwMDg0Li4yNDMwODQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYwpAQCAtMTksOSArMTksMyBAQAogRVhQT1JUX1NZTUJPTChIdkNhbGw1KTsKIEVYUE9SVF9TWU1CT0woSHZDYWxsNik7CiBFWFBPUlRfU1lNQk9MKEh2Q2FsbDcpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotRVhQT1JUX1NZTUJPTChsb2NhbF9nZXRfZmxhZ3MpOwotRVhQT1JUX1NZTUJPTChsb2NhbF9pcnFfZGlzYWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGxvY2FsX2lycV9yZXN0b3JlKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21pc2MuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMKaW5kZXggNzY0MWZjNy4uMmM2ZmYwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21pc2MuUworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWlzYy5TCkBAIC0xOSwzOSArMTksOCBAQAogCiAJLnRleHQKIAotLyogdW5zaWduZWQgbG9uZyBsb2NhbF9zYXZlX2ZsYWdzKHZvaWQpICovCi1fR0xPQkFMKGxvY2FsX2dldF9mbGFncykKLQlsYnoJcjMsUEFDQVBST0NFTkFCTEVEKHIxMykKLQlibHIKLQotLyogdW5zaWduZWQgbG9uZyBsb2NhbF9pcnFfZGlzYWJsZSh2b2lkKSAqLwotX0dMT0JBTChsb2NhbF9pcnFfZGlzYWJsZSkKLQlsYnoJcjMsUEFDQVBST0NFTkFCTEVEKHIxMykKLQlsaQlyNCwwCi0Jc3RiCXI0LFBBQ0FQUk9DRU5BQkxFRChyMTMpCi0JYmxyCQkJLyogRG9uZSAqLwotCi0vKiB2b2lkIGxvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpICovCi1fR0xPQkFMKGxvY2FsX2lycV9yZXN0b3JlKQotCWxieglyNSxQQUNBUFJPQ0VOQUJMRUQocjEzKQotCSAvKiBDaGVjayBpZiB0aGluZ3MgYXJlIHNldHVwIHRoZSB3YXkgd2Ugd2FudCBfYWxyZWFkeV8uICovCi0JY21wdwkwLHIzLHI1Ci0JYmVxbHIKLQkvKiBhcmUgd2UgZW5hYmxpbmcgaW50ZXJydXB0cz8gKi8KLQljbXBkaQkwLHIzLDAKLQlzdGIJcjMsUEFDQVBST0NFTkFCTEVEKHIxMykKLQliZXFscgotCS8qIENoZWNrIHBlbmRpbmcgaW50ZXJydXB0cyAqLwotCS8qICAgQSBkZWNyZW1lbnRlciwgSVBJIG9yIFBNQyBpbnRlcnJ1cHQgbWF5IGhhdmUgb2NjdXJyZWQKLQkgKiAgIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGh5cGVydmlzb3IgKHdoaWNoIGVuYWJsZXMpICovCi0JbGQJcjQsUEFDQUxQUEFDQVBUUihyMTMpCi0JbGQJcjQsTFBQQUNBQU5ZSU5UKHI0KQotCWNtcGRpCXI0LDAKLQliZXFscgotCi0JLyoKLQkgKiBIYW5kbGUgcGVuZGluZyBpbnRlcnJ1cHRzIGluIGludGVycnVwdCBjb250ZXh0Ci0JICovCisvKiBIYW5kbGUgcGVuZGluZyBpbnRlcnJ1cHRzIGluIGludGVycnVwdCBjb250ZXh0ICovCitfR0xPQkFMKGlzZXJpZXNfaGFuZGxlX2ludGVycnVwdHMpCiAJbGkJcjAsMHg1NTU1CiAJc2MKIAlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwppbmRleCA0YWExNjVlLi40YTA2ZDljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCkBAIC0xNTYsNTMgKzE1Niw2IEBACiB9CiAKIC8qCi0gKiBpU2VyaWVzX3BjaWJpb3NfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgYWxsIHBvc3NpYmxlIHN5c3RlbSBQQ0kgaG9zdCBicmlkZ2VzIHRoYXQgY29ubmVjdAotICogICBQQ0kgYnVzZXMuICBUaGUgc3lzdGVtIGh5cGVydmlzb3IgaXMgcXVlcmllZCBhcyB0byB0aGUgZ3Vlc3QgcGFydGl0aW9uCi0gKiAgIG93bmVyc2hpcCBzdGF0dXMuICBBIHBjaV9jb250cm9sbGVyIGlzIGJ1aWx0IGZvciBhbnkgYnVzIHdoaWNoIGlzIHBhcnRpYWxseQotICogICBvd25lZCBvciBmdWxseSBvd25lZCBieSB0aGlzIGd1ZXN0IHBhcnRpdGlvbi4KLSAqLwotdm9pZCBpU2VyaWVzX3BjaWJpb3NfaW5pdCh2b2lkKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gTlVMTDsKLQotCWlmIChyb290ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiaVNlcmllc19wY2liaW9zX2luaXQ6IGNhbid0IGZpbmQgcm9vdCAiCi0JCQkJIm9mIGRldmljZSB0cmVlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl3aGlsZSAoKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBub2RlKSkgIT0gTlVMTCkgewotCQlIdkJ1c051bWJlciBidXM7Ci0JCWNvbnN0IHUzMiAqYnVzcDsKLQotCQlpZiAoKG5vZGUtPnR5cGUgPT0gTlVMTCkgfHwgKHN0cmNtcChub2RlLT50eXBlLCAicGNpIikgIT0gMCkpCi0JCQljb250aW51ZTsKLQotCQlidXNwID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtcmFuZ2UiLCBOVUxMKTsKLQkJaWYgKGJ1c3AgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlidXMgPSAqYnVzcDsKLQkJcHJpbnRrKCJidXMgJWQgYXBwZWFycyB0byBleGlzdFxuIiwgYnVzKTsKLQkJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5vZGUpOwotCQlpZiAocGhiID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7Ci0JCXBoYi0+Zmlyc3RfYnVzbm8gPSBidXM7Ci0JCXBoYi0+bGFzdF9idXNubyA9IGJ1czsKLQkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOwotCX0KLQotCW9mX25vZGVfcHV0KHJvb3QpOwotCi0JcGNpX2RldnNfcGhiX2luaXQoKTsKLX0KLQotLyoKICAqIGlTZXJpZXNfcGNpX2ZpbmFsX2ZpeHVwKHZvaWQpCiAgKi8KIHZvaWQgX19pbml0IGlTZXJpZXNfcGNpX2ZpbmFsX2ZpeHVwKHZvaWQpCkBAIC0yNTMsNyArMjA2LDcgQEAKIAkJCVBDSV9ETihub2RlKS0+cGNpZGV2ID0gcGRldjsKIAkJCWFsbG9jYXRlX2RldmljZV9iYXJzKHBkZXYpOwogCQkJaVNlcmllc19EZXZpY2VfSW5mb3JtYXRpb24ocGRldiwgRGV2aWNlQ291bnQpOwotCQkJaW9tbXVfZGV2bm9kZV9pbml0X2lTZXJpZXMobm9kZSk7CisJCQlpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhwZGV2LCBub2RlKTsKIAkJfSBlbHNlCiAJCQlwcmludGsoIlBDSTogRGV2aWNlIFRyZWUgbm90IGZvdW5kIGZvciAweCUwMTZsWFxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcpcGRldik7CkBAIC00MzgsMTEgKzM5MSw3IEBACiAvKgogICogUmVhZCBNTSBJL08gSW5zdHJ1Y3Rpb25zIGZvciB0aGUgaVNlcmllcwogICogT24gTU0gSS9PIGVycm9yLCBhbGwgb25lcyBhcmUgcmV0dXJuZWQgYW5kIGlTZXJpZXNfcGNpX0lvRXJyb3IgaXMgY2FsCi0gKiBlbHNlLCBkYXRhIGlzIHJldHVybmVkIGluIGJpZyBFbmRpYW4gZm9ybWF0LgotICoKLSAqIGlTZXJpZXNfUmVhZF9CeXRlID0gUmVhZCBCeXRlICAoIDggYml0KQotICogaVNlcmllc19SZWFkX1dvcmQgPSBSZWFkIFdvcmQgICgxNiBiaXQpCi0gKiBpU2VyaWVzX1JlYWRfTG9uZyA9IFJlYWQgTG9uZyAgKDMyIGJpdCkKKyAqIGVsc2UsIGRhdGEgaXMgcmV0dXJuZWQgaW4gQmlnIEVuZGlhbiBmb3JtYXQuCiAgKi8KIHN0YXRpYyB1OCBpU2VyaWVzX1JlYWRfQnl0ZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKklvQWRkcmVzcykKIHsKQEAgLTQ2MiwxNCArNDExLDE1IEBACiAJCQludW1fcHJpbnRlZCA9IDA7CiAJCX0KIAkJaWYgKG51bV9wcmludGVkKysgPCAxMCkKLQkJCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19SZWFkX0J5dGU6IGludmFsaWQgYWNjZXNzIGF0IElPIGFkZHJlc3MgJXBcbiIsIElvQWRkcmVzcyk7CisJCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfUmVhZF9CeXRlOiBpbnZhbGlkIGFjY2VzcyBhdCBJTyBhZGRyZXNzICVwXG4iLAorCQkJICAgICAgIElvQWRkcmVzcyk7CiAJCXJldHVybiAweGZmOwogCX0KIAlkbyB7CiAJCUh2Q2FsbDNSZXQxNihIdkNhbGxQY2lCYXJMb2FkOCwgJnJldCwgZHNhLCBCYXJPZmZzZXQsIDApOwogCX0gd2hpbGUgKENoZWNrUmV0dXJuQ29kZSgiUkRCIiwgRGV2Tm9kZSwgJnJldHJ5LCByZXQucmMpICE9IDApOwogCi0JcmV0dXJuICh1OClyZXQudmFsdWU7CisJcmV0dXJuIHJldC52YWx1ZTsKIH0KIAogc3RhdGljIHUxNiBpU2VyaWVzX1JlYWRfV29yZChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKklvQWRkcmVzcykKQEAgLTQ5MCw3ICs0NDAsOCBAQAogCQkJbnVtX3ByaW50ZWQgPSAwOwogCQl9CiAJCWlmIChudW1fcHJpbnRlZCsrIDwgMTApCi0JCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfUmVhZF9Xb3JkOiBpbnZhbGlkIGFjY2VzcyBhdCBJTyBhZGRyZXNzICVwXG4iLCBJb0FkZHJlc3MpOworCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1JlYWRfV29yZDogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwKKwkJCSAgICAgICBJb0FkZHJlc3MpOwogCQlyZXR1cm4gMHhmZmZmOwogCX0KIAlkbyB7CkBAIC00OTgsNyArNDQ5LDcgQEAKIAkJCQlCYXJPZmZzZXQsIDApOwogCX0gd2hpbGUgKENoZWNrUmV0dXJuQ29kZSgiUkRXIiwgRGV2Tm9kZSwgJnJldHJ5LCByZXQucmMpICE9IDApOwogCi0JcmV0dXJuIHN3YWIxNigodTE2KXJldC52YWx1ZSk7CisJcmV0dXJuIHJldC52YWx1ZTsKIH0KIAogc3RhdGljIHUzMiBpU2VyaWVzX1JlYWRfTG9uZyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKklvQWRkcmVzcykKQEAgLTUxOSw3ICs0NzAsOCBAQAogCQkJbnVtX3ByaW50ZWQgPSAwOwogCQl9CiAJCWlmIChudW1fcHJpbnRlZCsrIDwgMTApCi0JCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfUmVhZF9Mb25nOiBpbnZhbGlkIGFjY2VzcyBhdCBJTyBhZGRyZXNzICVwXG4iLCBJb0FkZHJlc3MpOworCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1JlYWRfTG9uZzogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwKKwkJCSAgICAgICBJb0FkZHJlc3MpOwogCQlyZXR1cm4gMHhmZmZmZmZmZjsKIAl9CiAJZG8gewpAQCAtNTI3LDE1ICs0NzksMTIgQEAKIAkJCQlCYXJPZmZzZXQsIDApOwogCX0gd2hpbGUgKENoZWNrUmV0dXJuQ29kZSgiUkRMIiwgRGV2Tm9kZSwgJnJldHJ5LCByZXQucmMpICE9IDApOwogCi0JcmV0dXJuIHN3YWIzMigodTMyKXJldC52YWx1ZSk7CisJcmV0dXJuIHJldC52YWx1ZTsKIH0KIAogLyoKICAqIFdyaXRlIE1NIEkvTyBJbnN0cnVjdGlvbnMgZm9yIHRoZSBpU2VyaWVzCiAgKgotICogaVNlcmllc19Xcml0ZV9CeXRlID0gV3JpdGUgQnl0ZSAoOCBiaXQpCi0gKiBpU2VyaWVzX1dyaXRlX1dvcmQgPSBXcml0ZSBXb3JkKDE2IGJpdCkKLSAqIGlTZXJpZXNfV3JpdGVfTG9uZyA9IFdyaXRlIExvbmcoMzIgYml0KQogICovCiBzdGF0aWMgdm9pZCBpU2VyaWVzX1dyaXRlX0J5dGUodTggZGF0YSwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpJb0FkZHJlc3MpCiB7CkBAIC01ODEsMTEgKzUzMCwxMiBAQAogCQkJbnVtX3ByaW50ZWQgPSAwOwogCQl9CiAJCWlmIChudW1fcHJpbnRlZCsrIDwgMTApCi0JCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfV3JpdGVfV29yZDogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwgSW9BZGRyZXNzKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19Xcml0ZV9Xb3JkOiBpbnZhbGlkIGFjY2VzcyBhdCBJTyBhZGRyZXNzICVwXG4iLAorCQkJICAgICAgIElvQWRkcmVzcyk7CiAJCXJldHVybjsKIAl9CiAJZG8gewotCQlyYyA9IEh2Q2FsbDQoSHZDYWxsUGNpQmFyU3RvcmUxNiwgZHNhLCBCYXJPZmZzZXQsIHN3YWIxNihkYXRhKSwgMCk7CisJCXJjID0gSHZDYWxsNChIdkNhbGxQY2lCYXJTdG9yZTE2LCBkc2EsIEJhck9mZnNldCwgZGF0YSwgMCk7CiAJfSB3aGlsZSAoQ2hlY2tSZXR1cm5Db2RlKCJXV1ciLCBEZXZOb2RlLCAmcmV0cnksIHJjKSAhPSAwKTsKIH0KIApAQCAtNjA3LDIzMSArNTU3LDIyMSBAQAogCQkJbnVtX3ByaW50ZWQgPSAwOwogCQl9CiAJCWlmIChudW1fcHJpbnRlZCsrIDwgMTApCi0JCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfV3JpdGVfTG9uZzogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwgSW9BZGRyZXNzKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19Xcml0ZV9Mb25nOiBpbnZhbGlkIGFjY2VzcyBhdCBJTyBhZGRyZXNzICVwXG4iLAorCQkJICAgICAgIElvQWRkcmVzcyk7CiAJCXJldHVybjsKIAl9CiAJZG8gewotCQlyYyA9IEh2Q2FsbDQoSHZDYWxsUGNpQmFyU3RvcmUzMiwgZHNhLCBCYXJPZmZzZXQsIHN3YWIzMihkYXRhKSwgMCk7CisJCXJjID0gSHZDYWxsNChIdkNhbGxQY2lCYXJTdG9yZTMyLCBkc2EsIEJhck9mZnNldCwgZGF0YSwgMCk7CiAJfSB3aGlsZSAoQ2hlY2tSZXR1cm5Db2RlKCJXV0wiLCBEZXZOb2RlLCAmcmV0cnksIHJjKSAhPSAwKTsKIH0KIAotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgX19yYXdfcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHU4IGlzZXJpZXNfcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKWFkZHI7CisJcmV0dXJuIGlTZXJpZXNfUmVhZF9CeXRlKGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkYik7CiAKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBfX3Jhd19yZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdTE2IGlzZXJpZXNfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilhZGRyOworCXJldHVybiBsZTE2X3RvX2NwdShpU2VyaWVzX1JlYWRfV29yZChhZGRyKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWR3KTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBfX3Jhd19yZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdTMyIGlzZXJpZXNfcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopYWRkcjsKKwlyZXR1cm4gbGUzMl90b19jcHUoaVNlcmllc19SZWFkX0xvbmcoYWRkcikpOwogfQotRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkbCk7CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB1MTYgaXNlcmllc19yZWFkd19iZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCi0JcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ZvcmNlICopYWRkcjsKKwlyZXR1cm4gaVNlcmllc19SZWFkX1dvcmQoYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRxKTsKIAotZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGViKHVuc2lnbmVkIGNoYXIgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHUzMiBpc2VyaWVzX3JlYWRsX2JlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKWFkZHIgPSB2OworCXJldHVybiBpU2VyaWVzX1JlYWRfTG9uZyhhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0woX19yYXdfd3JpdGViKTsKIAotZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGViKHU4IGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilhZGRyID0gdjsKKwlpU2VyaWVzX1dyaXRlX0J5dGUoZGF0YSwgYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRldyk7CiAKLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRlbCh1bnNpZ25lZCBpbnQgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgaXNlcmllc193cml0ZXcodTE2IGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopYWRkciA9IHY7CisJaVNlcmllc19Xcml0ZV9Xb3JkKGNwdV90b19sZTE2KGRhdGEpLCBhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVsKTsKIAotZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGVxKHVuc2lnbmVkIGxvbmcgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgaXNlcmllc193cml0ZWwodTMyIGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19mb3JjZSAqKWFkZHIgPSB2OworCWlTZXJpZXNfV3JpdGVfTG9uZyhjcHVfdG9fbGUzMihkYXRhKSwgYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlcSk7CiAKLWludCBpbl84KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGV3X2JlKHUxNiBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCXJldHVybiBpU2VyaWVzX1JlYWRfQnl0ZShhZGRyKTsKLQlyZXR1cm4gX19pbl84KGFkZHIpOworCWlTZXJpZXNfV3JpdGVfV29yZChkYXRhLCBhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0woaW5fOCk7CiAKLXZvaWQgb3V0Xzgodm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICphZGRyLCBpbnQgdmFsKQorc3RhdGljIHZvaWQgaXNlcmllc193cml0ZWxfYmUodTMyIGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKLQkJaVNlcmllc19Xcml0ZV9CeXRlKHZhbCwgYWRkcik7Ci0JZWxzZQotCQlfX291dF84KGFkZHIsIHZhbCk7CisJaVNlcmllc19Xcml0ZV9Mb25nKGRhdGEsIGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChvdXRfOCk7CiAKLWludCBpbl9sZTE2KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3JlYWRzYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCXJldHVybiBpU2VyaWVzX1JlYWRfV29yZChhZGRyKTsKLQlyZXR1cm4gX19pbl9sZTE2KGFkZHIpOworCXU4ICpkc3QgPSBidWY7CisJd2hpbGUoY291bnQtLSA+IDApCisJCSooZHN0KyspID0gaVNlcmllc19SZWFkX0J5dGUoYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKGluX2xlMTYpOwogCi1pbnQgaW5fYmUxNihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgaXNlcmllc19yZWFkc3coY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCXJldHVybiBfX2luX2JlMTYoYWRkcik7CisJdTE2ICpkc3QgPSBidWY7CisJd2hpbGUoY291bnQtLSA+IDApCisJCSooZHN0KyspID0gaVNlcmllc19SZWFkX1dvcmQoYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKGluX2JlMTYpOwogCi12b2lkIG91dF9sZTE2KHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIsIGludCB2YWwpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3JlYWRzbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCWlTZXJpZXNfV3JpdGVfV29yZCh2YWwsIGFkZHIpOwotCWVsc2UKLQkJX19vdXRfbGUxNihhZGRyLCB2YWwpOworCXUzMiAqZHN0ID0gYnVmOworCXdoaWxlKGNvdW50LS0gPiAwKQorCQkqKGRzdCsrKSA9IGlTZXJpZXNfUmVhZF9Mb25nKGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChvdXRfbGUxNik7CiAKLXZvaWQgb3V0X2JlMTYodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkciwgaW50IHZhbCkKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGVzYih2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCV9fb3V0X2JlMTYoYWRkciwgdmFsKTsKKwljb25zdCB1OCAqc3JjID0gYnVmOworCXdoaWxlKGNvdW50LS0gPiAwKQorCQlpU2VyaWVzX1dyaXRlX0J5dGUoKihzcmMrKyksIGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChvdXRfYmUxNik7CiAKLXVuc2lnbmVkIGluX2xlMzIoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGVzdyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gaVNlcmllc19SZWFkX0xvbmcoYWRkcik7Ci0JcmV0dXJuIF9faW5fbGUzMihhZGRyKTsKKwljb25zdCB1MTYgKnNyYyA9IGJ1ZjsKKwl3aGlsZShjb3VudC0tID4gMCkKKwkJaVNlcmllc19Xcml0ZV9Xb3JkKCooc3JjKyspLCBhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0woaW5fbGUzMik7CiAKLXVuc2lnbmVkIGluX2JlMzIoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGVzbCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCXJldHVybiBfX2luX2JlMzIoYWRkcik7CisJY29uc3QgdTMyICpzcmMgPSBidWY7CisJd2hpbGUoY291bnQtLSA+IDApCisJCWlTZXJpZXNfV3JpdGVfTG9uZygqKHNyYysrKSwgYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKGluX2JlMzIpOwogCi12b2lkIG91dF9sZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIGludCB2YWwpCitzdGF0aWMgdm9pZCBpc2VyaWVzX21lbXNldF9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBjLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBuKQogewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlpU2VyaWVzX1dyaXRlX0xvbmcodmFsLCBhZGRyKTsKLQllbHNlCi0JCV9fb3V0X2xlMzIoYWRkciwgdmFsKTsKLX0KLUVYUE9SVF9TWU1CT0wob3V0X2xlMzIpOworCXZvbGF0aWxlIGNoYXIgX19pb21lbSAqZCA9IGFkZHI7CiAKLXZvaWQgb3V0X2JlMzIodm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkciwgaW50IHZhbCkKKwl3aGlsZSAobi0tID4gMCkKKwkJaVNlcmllc19Xcml0ZV9CeXRlKGMsIGQrKyk7Cit9CisKK3N0YXRpYyB2b2lkIGlzZXJpZXNfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7CisJY2hhciAqZCA9IGRlc3Q7CisJY29uc3Qgdm9sYXRpbGUgY2hhciBfX2lvbWVtICpzID0gc3JjOwogCi0JX19vdXRfYmUzMihhZGRyLCB2YWwpOworCXdoaWxlIChuLS0gPiAwKQorCQkqZCsrID0gaVNlcmllc19SZWFkX0J5dGUocysrKTsKIH0KLUVYUE9SVF9TWU1CT0wob3V0X2JlMzIpOwogCi11bnNpZ25lZCBsb25nIGluX2xlNjQoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgaXNlcmllc19tZW1jcHlfdG9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywKKwkJCQl1bnNpZ25lZCBsb25nIG4pCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOworCWNvbnN0IGNoYXIgKnMgPSBzcmM7CisJdm9sYXRpbGUgY2hhciBfX2lvbWVtICpkID0gZGVzdDsKIAotCXJldHVybiBfX2luX2xlNjQoYWRkcik7CisJd2hpbGUgKG4tLSA+IDApCisJCWlTZXJpZXNfV3JpdGVfQnl0ZSgqcysrLCBkKyspOwogfQotRVhQT1JUX1NZTUJPTChpbl9sZTY0KTsKIAotdW5zaWduZWQgbG9uZyBpbl9iZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcikKKy8qIFdlIG9ubHkgc2V0IE1NSU8gb3BzLiBUaGUgZGVmYXVsdCBQSU8gb3BzIHdpbGwgYmUgZGVmYXVsdAorICogdG8gdGhlIE1NSU8gb3BzICsgcGNpX2lvX2Jhc2Ugd2hpY2ggaXMgMCBvbiBpU2VyaWVzIGFzCisgKiBleHBlY3RlZCBzbyBib3RoIHNob3VsZCB3b3JrLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCBpbXBsZW1lbnQgdGhlIHJlYWRxL3dyaXRlcSB2ZXJzaW9ucyBhcworICogSSBkb24ndCBrbm93IG9mIGFuIEhWIGNhbGwgZm9yIGRvaW5nIHNvLiBUaHVzLCB0aGUgZGVmYXVsdAorICogb3BlcmF0aW9uIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLCB3aGljaCB3aWxsIGZhdWx0IGEgdGhlIHZhbHVlCisgKiByZXR1cm4gYnkgaVNlcmllcyBmb3IgTU1JTyBhZGRyZXNzZXMgYWx3YXlzIGhpdHMgYSBub24gbWFwcGVkCisgKiBhcmVhLiBUaGlzIGlzIGFzIGdvb2QgYXMgdGhlIEJVRygpIHdlIHVzZWQgdG8gaGF2ZSB0aGVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBwcGNfcGNpX2lvIF9faW5pdGRhdGEgaXNlcmllc19wY2lfaW8gPSB7CisJLnJlYWRiID0gaXNlcmllc19yZWFkYiwKKwkucmVhZHcgPSBpc2VyaWVzX3JlYWR3LAorCS5yZWFkbCA9IGlzZXJpZXNfcmVhZGwsCisJLnJlYWR3X2JlID0gaXNlcmllc19yZWFkd19iZSwKKwkucmVhZGxfYmUgPSBpc2VyaWVzX3JlYWRsX2JlLAorCS53cml0ZWIgPSBpc2VyaWVzX3dyaXRlYiwKKwkud3JpdGV3ID0gaXNlcmllc193cml0ZXcsCisJLndyaXRlbCA9IGlzZXJpZXNfd3JpdGVsLAorCS53cml0ZXdfYmUgPSBpc2VyaWVzX3dyaXRld19iZSwKKwkud3JpdGVsX2JlID0gaXNlcmllc193cml0ZWxfYmUsCisJLnJlYWRzYiA9IGlzZXJpZXNfcmVhZHNiLAorCS5yZWFkc3cgPSBpc2VyaWVzX3JlYWRzdywKKwkucmVhZHNsID0gaXNlcmllc19yZWFkc2wsCisJLndyaXRlc2IgPSBpc2VyaWVzX3dyaXRlc2IsCisJLndyaXRlc3cgPSBpc2VyaWVzX3dyaXRlc3csCisJLndyaXRlc2wgPSBpc2VyaWVzX3dyaXRlc2wsCisJLm1lbXNldF9pbyA9IGlzZXJpZXNfbWVtc2V0X2lvLAorCS5tZW1jcHlfZnJvbWlvID0gaXNlcmllc19tZW1jcHlfZnJvbWlvLAorCS5tZW1jcHlfdG9pbyA9IGlzZXJpZXNfbWVtY3B5X3RvaW8sCit9OworCisvKgorICogaVNlcmllc19wY2liaW9zX2luaXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIGFsbCBwb3NzaWJsZSBzeXN0ZW0gUENJIGhvc3QgYnJpZGdlcyB0aGF0IGNvbm5lY3QKKyAqICAgUENJIGJ1c2VzLiAgVGhlIHN5c3RlbSBoeXBlcnZpc29yIGlzIHF1ZXJpZWQgYXMgdG8gdGhlIGd1ZXN0IHBhcnRpdGlvbgorICogICBvd25lcnNoaXAgc3RhdHVzLiAgQSBwY2lfY29udHJvbGxlciBpcyBidWlsdCBmb3IgYW55IGJ1cyB3aGljaCBpcyBwYXJ0aWFsbHkKKyAqICAgb3duZWQgb3IgZnVsbHkgb3duZWQgYnkgdGhpcyBndWVzdCBwYXJ0aXRpb24uCisgKi8KK3ZvaWQgX19pbml0IGlTZXJpZXNfcGNpYmlvc19pbml0KHZvaWQpCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gTlVMTDsKIAotCXJldHVybiBfX2luX2JlNjQoYWRkcik7CisJLyogSW5zdGFsbCBJTyBob29rcyAqLworCXBwY19wY2lfaW8gPSBpc2VyaWVzX3BjaV9pbzsKKworCWlmIChyb290ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiaVNlcmllc19wY2liaW9zX2luaXQ6IGNhbid0IGZpbmQgcm9vdCAiCisJCQkJIm9mIGRldmljZSB0cmVlXG4iKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBub2RlKSkgIT0gTlVMTCkgeworCQlIdkJ1c051bWJlciBidXM7CisJCWNvbnN0IHUzMiAqYnVzcDsKKworCQlpZiAoKG5vZGUtPnR5cGUgPT0gTlVMTCkgfHwgKHN0cmNtcChub2RlLT50eXBlLCAicGNpIikgIT0gMCkpCisJCQljb250aW51ZTsKKworCQlidXNwID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtcmFuZ2UiLCBOVUxMKTsKKwkJaWYgKGJ1c3AgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlidXMgPSAqYnVzcDsKKwkJcHJpbnRrKCJidXMgJWQgYXBwZWFycyB0byBleGlzdFxuIiwgYnVzKTsKKwkJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5vZGUpOworCQlpZiAocGhiID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7CisJCXBoYi0+Zmlyc3RfYnVzbm8gPSBidXM7CisJCXBoYi0+bGFzdF9idXNubyA9IGJ1czsKKwkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOworCX0KKworCW9mX25vZGVfcHV0KHJvb3QpOworCisJcGNpX2RldnNfcGhiX2luaXQoKTsKIH0KLUVYUE9SVF9TWU1CT0woaW5fYmU2NCk7CiAKLXZvaWQgb3V0X2xlNjQodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlfX291dF9sZTY0KGFkZHIsIHZhbCk7Ci19Ci1FWFBPUlRfU1lNQk9MKG91dF9sZTY0KTsKLQotdm9pZCBvdXRfYmU2NCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCV9fb3V0X2JlNjQoYWRkciwgdmFsKTsKLX0KLUVYUE9SVF9TWU1CT0wob3V0X2JlNjQpOwotCi12b2lkIG1lbXNldF9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBjLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpIHsKLQkJdm9sYXRpbGUgY2hhciBfX2lvbWVtICpkID0gYWRkcjsKLQotCQl3aGlsZSAobi0tID4gMCkgewotCQkJaVNlcmllc19Xcml0ZV9CeXRlKGMsIGQrKyk7Ci0JCX0KLQl9IGVsc2UKLQkJZWVoX21lbXNldF9pbyhhZGRyLCBjLCBuKTsKLX0KLUVYUE9SVF9TWU1CT0wobWVtc2V0X2lvKTsKLQotdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7Ci0JCWNoYXIgKmQgPSBkZXN0OwotCQljb25zdCB2b2xhdGlsZSBjaGFyIF9faW9tZW0gKnMgPSBzcmM7Ci0KLQkJd2hpbGUgKG4tLSA+IDApIHsKLQkJCSpkKysgPSBpU2VyaWVzX1JlYWRfQnl0ZShzKyspOwotCQl9Ci0JfSBlbHNlCi0JCWVlaF9tZW1jcHlfZnJvbWlvKGRlc3QsIHNyYywgbik7Ci19Ci1FWFBPUlRfU1lNQk9MKG1lbWNweV9mcm9taW8pOwotCi12b2lkIG1lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpIHsKLQkJY29uc3QgY2hhciAqcyA9IHNyYzsKLQkJdm9sYXRpbGUgY2hhciBfX2lvbWVtICpkID0gZGVzdDsKLQotCQl3aGlsZSAobi0tID4gMCkgewotCQkJaVNlcmllc19Xcml0ZV9CeXRlKCpzKyssIGQrKyk7Ci0JCX0KLQl9IGVsc2UKLQkJZWVoX21lbWNweV90b2lvKGRlc3QsIHNyYywgbik7Ci19Ci1FWFBPUlRfU1lNQk9MKG1lbWNweV90b2lvKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKaW5kZXggNmY3MzQ2OS4uYmRmMmFmYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KQEAgLTgwLDggKzc5LDYgQEAKIHN0YXRpYyB2b2lkIGlTZXJpZXNfcGNpX2ZpbmFsX2ZpeHVwKHZvaWQpIHsgfQogI2VuZGlmCiAKLWV4dGVybiBpbnQgcmRfc2l6ZTsJCS8qIERlZmluZWQgaW4gZHJpdmVycy9ibG9jay9yZC5jICovCi0KIGV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGI7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpU2VyaWVzX3JlY2FsX3RpdGFuOwogCkBAIC0yOTUsMjQgKzI5Miw2IEBACiB7CiAJREJHKCIgLT4gaVNlcmllc19pbml0X2Vhcmx5KClcbiIpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpCi0JLyoKLQkgKiBJZiB0aGUgaW5pdCBSQU0gZGlzayBoYXMgYmVlbiBjb25maWd1cmVkIGFuZCB0aGVyZSBpcwotCSAqIGEgbm9uLXplcm8gc3RhcnRpbmcgYWRkcmVzcyBmb3IgaXQsIHNldCBpdCB1cAotCSAqLwotCWlmIChuYWNhLnhSYW1EaXNrKSB7Ci0JCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEobmFjYS54UmFtRGlzayk7Ci0JCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBuYWNhLnhSYW1EaXNrU2l6ZSAqIEhXX1BBR0VfU0laRTsKLQkJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsJLy8gcmFtZGlzayBpbiBrZXJuZWwgc3BhY2UKLQkJUk9PVF9ERVYgPSBSb290X1JBTTA7Ci0JCWlmICgoKHJkX3NpemUgKiAxMDI0KSAvIEhXX1BBR0VfU0laRSkgPCBuYWNhLnhSYW1EaXNrU2l6ZSkKLQkJCXJkX3NpemUgPSAobmFjYS54UmFtRGlza1NpemUgKiBIV19QQUdFX1NJWkUpIC8gMTAyNDsKLQl9IGVsc2UKLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KLQl7Ci0JICAgIC8qIFJPT1RfREVWID0gTUtERVYoVklPREFTRF9NQUpPUiwgMSk7ICovCi0JfQotCiAJaVNlcmllc19yZWNhbF90YiA9IGdldF90YigpOwogCWlTZXJpZXNfcmVjYWxfdGl0YW4gPSBIdkNhbGxYbV9sb2FkVG9kKCk7CiAKQEAgLTMzMSwxNyArMzEwLDYgQEAKIAogCW1mX2luaXQoKTsKIAotCS8qIElmIHdlIHdlcmUgcGFzc2VkIGFuIGluaXRyZCwgc2V0IHRoZSBST09UX0RFViBwcm9wZXJseSBpZiB0aGUgdmFsdWVzCi0JICogbG9vayBzZW5zaWJsZS4gSWYgbm90LCBjbGVhciBpbml0cmQgcmVmZXJlbmNlLgotCSAqLwotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCWlmIChpbml0cmRfc3RhcnQgPj0gS0VSTkVMQkFTRSAmJiBpbml0cmRfZW5kID49IEtFUk5FTEJBU0UgJiYKLQkgICAgaW5pdHJkX2VuZCA+IGluaXRyZF9zdGFydCkKLQkJUk9PVF9ERVYgPSBSb290X1JBTTA7Ci0JZWxzZQotCQlpbml0cmRfc3RhcnQgPSBpbml0cmRfZW5kID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KLQogCURCRygiIDwtIGlTZXJpZXNfaW5pdF9lYXJseSgpXG4iKTsKIH0KIApAQCAtNjQ5LDYgKzYxNywxNiBAQAogdm9pZCBfX2luaXQgaVNlcmllc19pbml0X0lSUSh2b2lkKSB7IH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCBfX2lvbWVtICppc2VyaWVzX2lvcmVtYXAocGh5c19hZGRyX3QgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWFkZHJlc3M7Cit9CisKK3N0YXRpYyB2b2lkIGlzZXJpZXNfaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnRva2VuKQoreworfQorCiAvKgogICogaVNlcmllcyBoYXMgbm8gbGVnYWN5IElPLCBhbnl0aGluZyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaGFzIHRvCiAgKiBmYWlsIG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4KQEAgLTY2NSw2ICs2NDMsOCBAQAogCQlyZXR1cm4gMDsKIAogCWhwdGVfaW5pdF9pU2VyaWVzKCk7CisJLyogaVNlcmllcyBkb2VzIG5vdCBzdXBwb3J0IDE2TSBwYWdlcyAqLworCWN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzICY9IH5DUFVfRlRSXzE2TV9QQUdFOwogCiAJcmV0dXJuIDE7CiB9CkBAIC02ODcsNiArNjY3LDggQEAKIAkucHJvZ3Jlc3MJPSBpU2VyaWVzX3Byb2dyZXNzLAogCS5wcm9iZQkJPSBpc2VyaWVzX3Byb2JlLAogCS5jaGVja19sZWdhY3lfaW9wb3J0CT0gaXNlcmllc19jaGVja19sZWdhY3lfaW9wb3J0LAorCS5pb3JlbWFwCT0gaXNlcmllc19pb3JlbWFwLAorCS5pb3VubWFwCT0gaXNlcmllc19pb3VubWFwLAogCS8qIFhYWCBJbXBsZW1lbnQgZW5hYmxlX3BtY3MgZm9yIGlTZXJpZXMgKi8KIH07CiAKQEAgLTY5Nyw3ICs2NzksNyBAQAogCS8qIElkZW50aWZ5IENQVSB0eXBlLiBUaGlzIGlzIGRvbmUgYWdhaW4gYnkgdGhlIGNvbW1vbiBjb2RlIGxhdGVyCiAJICogb24gYnV0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBpcyBmaW5lLgogCSAqLwotCWlkZW50aWZ5X2NwdSgwKTsKKwlpZGVudGlmeV9jcHUoMCwgbWZzcHIoU1BSTl9QVlIpKTsKIAogCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9JU0VSSUVTOwogCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9MUEFSOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMKaW5kZXggMDRlMDdlNS4uODRlN2VlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCkBAIC0xMTksMTAgKzExOSw5IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWNvbnN0IGNoYXIgKnN5c2lkOwogCi0JYnVmID0ga21hbGxvYyhIV19QQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWJ1ZiA9IGt6YWxsb2MoSFdfUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIDA7Ci0JbWVtc2V0KGJ1ZiwgMCwgSFdfUEFHRV9TSVpFKTsKIAogCWhhbmRsZSA9IGRtYV9tYXBfc2luZ2xlKGlTZXJpZXNfdmlvX2RldiwgYnVmLCBIV19QQUdFX1NJWkUsCiAJCQkJRE1BX0ZST01fREVWSUNFKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvbWFwbGUuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvbWFwbGUuaAppbmRleCAwNjU3YzU3Li5jNjkxMWRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL21hcGxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9tYXBsZS5oCkBAIC04LDUgKzgsNSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFwbGVfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIG1hcGxlX2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFwbGVfcGNpX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtYXBsZV9wY2liaW9zX2ZpeHVwKHZvaWQpOworZXh0ZXJuIHZvaWQgbWFwbGVfcGNpX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgbWFwbGVfcGNpX2dldF9sZWdhY3lfaWRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2hhbm5lbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwppbmRleCA2M2I0ZDFiLi4zYTMyZGVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKQEAgLTUwMiwzOCArNTAyLDI5IEBACiB9CiAKIAotdm9pZCBfX2luaXQgbWFwbGVfcGNpYmlvc19maXh1cCh2b2lkKQordm9pZCBfX2RldmluaXQgbWFwbGVfcGNpX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCURCRygiIC0+IG1hcGxlX3BjaV9pcnFfZml4dXBcbiIpOwogCi0JREJHKCIgLT4gbWFwbGVfcGNpYmlvc19maXh1cFxuIik7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQkvKiBGaXh1cCBJUlEgZm9yIFBDSWUgaG9zdCAqLwotCQlpZiAodTRfcGNpZSAhPSBOVUxMICYmIGRldi0+YnVzLT5udW1iZXIgPT0gMCAmJgotCQkgICAgcGNpX2J1c190b19ob3N0KGRldi0+YnVzKSA9PSB1NF9wY2llKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiRml4dXAgVTQgUENJZSBJUlFcbiIpOwotCQkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgMSk7Ci0JCQlpZiAoZGV2LT5pcnEgIT0gTk9fSVJRKQotCQkJCXNldF9pcnFfdHlwZShkZXYtPmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogSGlkZSBBTUQ4MTExIElERSBpbnRlcnJ1cHQgd2hlbiBpbiBsZWdhY3kgbW9kZSBzbwotCQkgKiB0aGUgZHJpdmVyIGNhbGxzIHBjaV9nZXRfbGVnYWN5X2lkZV9pcnEoKQotCQkgKi8KLQkJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EICYmCi0JCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0lERSAmJgotCQkgICAgKGRldi0+Y2xhc3MgJiA1KSAhPSA1KSB7Ci0JCQlkZXYtPmlycSA9IE5PX0lSUTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRm9yIGFsbCBvdGhlcnMsIG1hcCB0aGUgaW50ZXJydXB0IGZyb20gdGhlIGRldmljZS10cmVlICovCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7CisJLyogRml4dXAgSVJRIGZvciBQQ0llIGhvc3QgKi8KKwlpZiAodTRfcGNpZSAhPSBOVUxMICYmIGRldi0+YnVzLT5udW1iZXIgPT0gMCAmJgorCSAgICBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpID09IHU0X3BjaWUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkZpeHVwIFU0IFBDSWUgSVJRXG4iKTsKKwkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgMSk7CisJCWlmIChkZXYtPmlycSAhPSBOT19JUlEpCisJCQlzZXRfaXJxX3R5cGUoZGV2LT5pcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJfQogCi0JREJHKCIgPC0gbWFwbGVfcGNpYmlvc19maXh1cFxuIik7CisJLyogSGlkZSBBTUQ4MTExIElERSBpbnRlcnJ1cHQgd2hlbiBpbiBsZWdhY3kgbW9kZSBzbworCSAqIHRoZSBkcml2ZXIgY2FsbHMgcGNpX2dldF9sZWdhY3lfaWRlX2lycSgpCisJICovCisJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfSURFICYmCisJICAgIChkZXYtPmNsYXNzICYgNSkgIT0gNSkgeworCQlkZXYtPmlycSA9IE5PX0lSUTsKKwl9CisKKwlEQkcoIiA8LSBtYXBsZV9wY2lfaXJxX2ZpeHVwXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1hcGxlX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwppbmRleCBmZTZiOWJmLi4wOTQ5ODlkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkuc2V0dXBfYXJjaAkJPSBtYXBsZV9zZXR1cF9hcmNoLAogCS5pbml0X2Vhcmx5CQk9IG1hcGxlX2luaXRfZWFybHksCiAJLmluaXRfSVJRCQk9IG1hcGxlX2luaXRfSVJRLAotCS5wY2liaW9zX2ZpeHVwCQk9IG1hcGxlX3BjaWJpb3NfZml4dXAsCisJLnBjaV9pcnFfZml4dXAJCT0gbWFwbGVfcGNpX2lycV9maXh1cCwKIAkucGNpX2dldF9sZWdhY3lfaWRlX2lycQk9IG1hcGxlX3BjaV9nZXRfbGVnYWN5X2lkZV9pcnEsCiAJLnJlc3RhcnQJCT0gbWFwbGVfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IG1hcGxlX3Bvd2VyX29mZiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3Bhc2VtaS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGFzZW1pLmgKaW5kZXggZmQ3MWQ3Mi4uNTFjMmEyMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGFzZW1pLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGFzZW1pLmgKQEAgLTMsNiArMyw1IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBhc19nZXRfYm9vdF90aW1lKHZvaWQpOwogZXh0ZXJuIHZvaWQgcGFzX3BjaV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGFzX3BjaWJpb3NfZml4dXAodm9pZCk7CiAKICNlbmRpZiAvKiBfUEFTRU1JX1BBU0VNSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCmluZGV4IDM5MDIwYzEuLmZhYTYxOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCkBAIC0xNDgsMTQgKzE0OCw2IEBACiB9CiAKIAotdm9pZCBfX2luaXQgcGFzX3BjaWJpb3NfZml4dXAodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwppbmRleCAxMDY4OTZjLi44OWQ2ZTI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNzEsNiArNzIsOSBAQAogCS8qIFNldHVwIFNNUCBjYWxsYmFjayAqLwogCXNtcF9vcHMgPSAmcGFzX3NtcF9vcHM7CiAjZW5kaWYKKwkvKiBubyBpb21tdSB5ZXQgKi8KKwlwY2lfZG1hX29wcyA9ICZkbWFfZGlyZWN0X29wczsKKwogCS8qIExvb2t1cCBQQ0kgaG9zdHMgKi8KIAlwYXNfcGNpX2luaXQoKTsKIApAQCAtODEsMTcgKzg1LDYgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgZGVmYXVsdCBpZGxlIGxvb3BcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9udWxsKHN0cnVjdCBwY2lfYnVzICpidXMpIHsgfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGFzX2luaXRfZWFybHkodm9pZCkKLXsKLQkvKiBObyBpb21tdSBjb2RlIHlldCAqLwotCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfbnVsbDsKLQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX251bGw7Ci0JcGNpX2RpcmVjdF9pb21tdV9pbml0KCk7Ci19Ci0KIC8qIE5vIGxlZ2FjeSBJTyBvbiBvdXIgcGFydHMgKi8KIHN0YXRpYyBpbnQgcGFzX2NoZWNrX2xlZ2FjeV9pb3BvcnQodW5zaWduZWQgaW50IGJhc2Vwb3J0KQogewpAQCAtMTczLDEwICsxNjYsOCBAQAogCS5uYW1lCQkJPSAiUEEgU2VtaSBQQTZULTE2ODJNIiwKIAkucHJvYmUJCQk9IHBhc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBwYXNfc2V0dXBfYXJjaCwKLQkuaW5pdF9lYXJseQkJPSBwYXNfaW5pdF9lYXJseSwKIAkuaW5pdF9JUlEJCT0gcGFzX2luaXRfSVJRLAogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKLQkucGNpYmlvc19maXh1cAkJPSBwYXNfcGNpYmlvc19maXh1cCwKIAkucmVzdGFydAkJPSBwYXNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHBhc19wb3dlcl9vZmYsCiAJLmhhbHQJCQk9IHBhc19oYWx0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYwppbmRleCBlNDk2MjFiLi5jMjlhNmEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYwpAQCAtNDg2LDEwICs0ODYsNiBAQAogCiBzdGF0aWMgdTMyIHNhdmVfZmNyWzZdOwogc3RhdGljIHUzMiBzYXZlX21iY3I7Ci1zdGF0aWMgdTMyIHNhdmVfZ3Bpb19sZXZlbHNbMl07Ci1zdGF0aWMgdTggc2F2ZV9ncGlvX2V4dGludFtLRVlMQVJHT19HUElPX0VYVElOVF9DTlRdOwotc3RhdGljIHU4IHNhdmVfZ3Bpb19ub3JtYWxbS0VZTEFSR09fR1BJT19DTlRdOwotc3RhdGljIHUzMiBzYXZlX3VuaW5fY2xvY2tfY3RsOwogc3RhdGljIHN0cnVjdCBkYmRtYV9yZWdzIHNhdmVfZGJkbWFbMTNdOwogc3RhdGljIHN0cnVjdCBkYmRtYV9yZWdzIHNhdmVfYWx0X2RiZG1hWzEzXTsKIApAQCAtMTU0OCw2ICsxNTQ0LDEwIEBACiAKIAogI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHUzMiBzYXZlX2dwaW9fbGV2ZWxzWzJdOworc3RhdGljIHU4IHNhdmVfZ3Bpb19leHRpbnRbS0VZTEFSR09fR1BJT19FWFRJTlRfQ05UXTsKK3N0YXRpYyB1OCBzYXZlX2dwaW9fbm9ybWFsW0tFWUxBUkdPX0dQSU9fQ05UXTsKK3N0YXRpYyB1MzIgc2F2ZV91bmluX2Nsb2NrX2N0bDsKIAogc3RhdGljIHZvaWQga2V5bGFyZ29fc2h1dGRvd24oc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvLCBpbnQgc2xlZXBfbW9kZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDk5MjNhZGMuLmY0MjQ3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtNDgsNyArNDgsNiBAQAogc3RhdGljIGludCBoYXNfc2Vjb25kX29oYXJlOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi1leHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKIGV4dGVybiBpbnQgcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldDsKIAogc3RydWN0IGRldmljZV9ub2RlICprMl9za2lwbGlzdFsyXTsKQEAgLTk4NSwzMCArOTg0LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IHBtYWNfcGNpYmlvc19maXh1cCh2b2lkKQordm9pZCBfX2RldmluaXQgcG1hY19wY2lfaXJxX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYqIGRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQkvKiBSZWFkIGludGVycnVwdCBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLwotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOwotCiAjaWZkZWYgQ09ORklHX1BQQzMyCi0JCS8qIEZpeHVwIGludGVycnVwdCBmb3IgdGhlIG1vZGVtL2V0aGVybmV0IGNvbWJvIGNvbnRyb2xsZXIuCi0JCSAqIG9uIG1hY2hpbmVzIHdpdGggYSBzZWNvbmQgb2hhcmUgY2hpcC4KLQkJICogVGhlIG51bWJlciBpbiB0aGUgZGV2aWNlIHRyZWUgKDI3KSBpcyBib2d1cyAoY29ycmVjdCBmb3IKLQkJICogdGhlIGV0aGVybmV0LW9ubHkgYm9hcmQgYnV0IG5vdCB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0KLQkJICogYm9hcmQpLiBUaGUgcmVhbCBpbnRlcnJ1cHQgaXMgMjggb24gdGhlIHNlY29uZCBjb250cm9sbGVyCi0JCSAqIC0+IDI4KzMyID0gNjAuCi0JCSAqLwotCQlpZiAoaGFzX3NlY29uZF9vaGFyZSAmJgotCQkgICAgZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUMgJiYKLQkJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMpIHsKLQkJCWRldi0+aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIDYwKTsKLQkJCXNldF9pcnFfdHlwZShkZXYtPmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQkJfQotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLworCS8qIEZpeHVwIGludGVycnVwdCBmb3IgdGhlIG1vZGVtL2V0aGVybmV0IGNvbWJvIGNvbnRyb2xsZXIuCisJICogb24gbWFjaGluZXMgd2l0aCBhIHNlY29uZCBvaGFyZSBjaGlwLgorCSAqIFRoZSBudW1iZXIgaW4gdGhlIGRldmljZSB0cmVlICgyNykgaXMgYm9ndXMgKGNvcnJlY3QgZm9yCisJICogdGhlIGV0aGVybmV0LW9ubHkgYm9hcmQgYnV0IG5vdCB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0KKwkgKiBib2FyZCkuIFRoZSByZWFsIGludGVycnVwdCBpcyAyOCBvbiB0aGUgc2Vjb25kIGNvbnRyb2xsZXIKKwkgKiAtPiAyOCszMiA9IDYwLgorCSAqLworCWlmIChoYXNfc2Vjb25kX29oYXJlICYmCisJICAgIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVDICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMpIHsKKwkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgNjApOworCQlzZXRfaXJxX3R5cGUoZGV2LT5pcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJfQorI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogfQogCiAjaWZkZWYgQ09ORklHX1BQQzY0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BtYWMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hYy5oCmluZGV4IDk0ZTdiMjQuLjZlMDkwYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hYy5oCkBAIC0yMCw3ICsyMCw3IEBACiBleHRlcm4gaW50IHBtYWNfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqKTsKIGV4dGVybiB2b2lkIHBtYWNfcmVhZF9ydGNfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBtYWNfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci1leHRlcm4gdm9pZCBwbWFjX3BjaWJpb3NfZml4dXAodm9pZCk7CitleHRlcm4gdm9pZCBwbWFjX3BjaV9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKik7CiBleHRlcm4gdm9pZCBwbWFjX3BjaV9pbml0KHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcG1hY19pZGVfZ2V0X2Jhc2UoaW50IGluZGV4KTsKIGV4dGVybiB2b2lkIHBtYWNfaWRlX2luaXRfaHdpZl9wb3J0cyhod19yZWdzX3QgKmh3LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IDgyNGE2MTguLmQ5NDllOWRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCkBAIC03MCw2ICs3MCw3IEBACiAjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9zbXUuaD4KQEAgLTM2MSw3ICszNjIsNyBAQAogdm9pZCAqYm9vdF9ob3N0OwogaW50IGJvb3RfdGFyZ2V0OwogaW50IGJvb3RfcGFydDsKLWV4dGVybiBkZXZfdCBib290X2RldjsKK3N0YXRpYyBkZXZfdCBib290X2RldjsKIAogI2lmZGVmIENPTkZJR19TQ1NJCiB2b2lkIF9faW5pdCBub3RlX3Njc2lfaG9zdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHZvaWQgKmhvc3QpCkBAIC02NzYsOCArNjc3LDYgQEAKIAogI2lmZGVmIENPTkZJR19QUEMzMgogCS8qIGlzYV9pb19iYXNlIGdldHMgc2V0IGluIHBtYWNfcGNpX2luaXQgKi8KLQlpc2FfbWVtX2Jhc2UgPSBQTUFDX0lTQV9NRU1fQkFTRTsKLQlwY2lfZHJhbV9vZmZzZXQgPSBQTUFDX1BDSV9EUkFNX09GRlNFVDsKIAlJU0FfRE1BX1RIUkVTSE9MRCA9IH4wTDsKIAlETUFfTU9ERV9SRUFEID0gMTsKIAlETUFfTU9ERV9XUklURSA9IDI7CkBAIC03MjcsNyArNzI2LDcgQEAKIAkuc2hvd19jcHVpbmZvCQk9IHBtYWNfc2hvd19jcHVpbmZvLAogCS5pbml0X0lSUQkJPSBwbWFjX3BpY19pbml0LAogCS5nZXRfaXJxCQk9IE5VTEwsCS8qIGNoYW5nZWQgbGF0ZXIgKi8KLQkucGNpYmlvc19maXh1cAkJPSBwbWFjX3BjaWJpb3NfZml4dXAsCisJLnBjaV9pcnFfZml4dXAJCT0gcG1hY19wY2lfaXJxX2ZpeHVwLAogCS5yZXN0YXJ0CQk9IHBtYWNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHBtYWNfcG93ZXJfb2ZmLAogCS5oYWx0CQkJPSBwbWFjX2hhbHQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFiZmNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwpAQCAtMCwwICsxLDQzIEBACittZW51ICJQUzMgUGxhdGZvcm0gT3B0aW9ucyIKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKworY29uZmlnIFBTM19IVEFCX1NJWkUKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwlpbnQgIlBTMyBQbGF0Zm9ybSBwYWdldGFibGUgc2l6ZSIKKwlyYW5nZSAxOCAyMAorCWRlZmF1bHQgMjAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBvbmx5IGZvciBleHBlcnRzIHdobyBtYXkgaGF2ZSB0aGUgZGVzaXJlIHRvIGZpbmUKKwkgIHR1bmUgdGhlIHBhZ2V0YWJsZSBzaXplIG9uIHRoZWlyIHN5c3RlbS4gIFRoZSB2YWx1ZSBoZXJlIGlzCisJICBleHByZXNzZWQgYXMgdGhlIGxvZzIgb2YgdGhlIHBhZ2UgdGFibGUgc2l6ZS4gIFZhbGlkIHZhbHVlcyBhcmUKKwkgIDE4LCAxOSwgYW5kIDIwLCBjb3JyZXNwb25kaW5nIHRvIDI1NktCLCA1MTJLQiBhbmQgMU1CIHJlc3BlY3RpdmVseS4KKworCSAgSWYgdW5zdXJlLCBjaG9vc2UgdGhlIGRlZmF1bHQgKDIwKSB3aXRoIHRoZSBjb25maWRlbmNlIHRoYXQgeW91cgorCSAgc3lzdGVtIHdpbGwgaGF2ZSBvcHRpbWFsIHJ1bnRpbWUgcGVyZm9ybWFuY2UuCisKK2NvbmZpZyBQUzNfRFlOQU1JQ19ETUEKKwlkZXBlbmRzIG9uIFBQQ19QUzMgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiUFMzIFBsYXRmb3JtIGR5bmFtaWMgRE1BIHBhZ2UgdGFibGUgbWFuYWdlbWVudCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBrZXJuZWwgc3VwcG9ydCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUKKwkgIHBlciBkZXZpY2UgZHluYW1pYyBETUEgcGFnZSB0YWJsZSBtYW5hZ2VtZW50IHByb3ZpZGVkIGJ5IHRoZSBDZWxsCisJICBwcm9jZXNzb3IncyBJTyBDb250cm9sbGVyLiAgVGhpcyBzdXBwb3J0IGluY3VycyBzb21lIHJ1bnRpbWUKKwkgIG92ZXJoZWFkIGFuZCBhbHNvIHNsaWdodGx5IGluY3JlYXNlcyBrZXJuZWwgbWVtb3J5IHVzYWdlLiAgVGhlCisJICBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4KKworCSAgVGhpcyBzdXBwb3J0IGlzIG1haW5seSBmb3IgTGludXgga2VybmVsIGRldmVsb3BtZW50LiAgSWYgdW5zdXJlLAorCSAgc2F5IE4uCisKK2NvbmZpZyBQUzNfVVNFX0xQQVJfQUREUgorCWRlcGVuZHMgb24gUFBDX1BTMyAmJiBFWFBFUklNRU5UQUwKKwlib29sICJQUzMgdXNlIGxwYXIgYWRkcmVzcyBzcGFjZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBzb2xlbHkgZm9yIGV4cGVyaW1lbnRhdGlvbiBieSBleHBlcnRzLiAgRGlzYWJsZXMKKwkgIHRyYW5zbGF0aW9uIG9mIGxwYXIgYWRkcmVzc2VzLiAgU1BFIHN1cHBvcnQgY3VycmVudGx5IHdvbid0IHdvcmsKKwkgIHdpdGhvdXQgdGhpcyBzZXQgdG8geS4KKworCSAgSWYgeW91IGhhdmUgYW55IGRvdWJ0LCBjaG9vc2UgdGhlIGRlZmF1bHQgeS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU3Y2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitvYmoteSArPSBzZXR1cC5vIG1tLm8gc21wLm8gdGltZS5vIGh2Y2FsbC5vIGh0YWIubyByZXBvc2l0b3J5Lm8KK29iai15ICs9IGludGVycnVwdC5vIGV4cG9ydHMubyBvcy1hcmVhLm8KKworb2JqLSQoQ09ORklHX1NQVV9CQVNFKSArPSBzcHUubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZXhwb3J0cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZXhwb3J0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZThmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9leHBvcnRzLmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqICBQUzMgaHZjYWxsIGV4cG9ydHMgZm9yIG1vZHVsZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgTFYxX0NBTEwobmFtZSwgaW4sIG91dCwgbnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleHRlcm4gczY0IF9sdjFfIyNuYW1lKExWMV8jI2luIyNfSU5fIyNvdXQjI19PVVRfQVJHX0RFQ0wpOyBcCisgIEVYUE9SVF9TWU1CT0woX2x2MV8jI25hbWUpOworCisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmUxNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogIFBTMyBwYWdldGFibGUgbWFuYWdlbWVudCByb3V0aW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2xtYi5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgaHB0ZV90ICpodGFiOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHRhYl9hZGRyOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmJvbHR0YWI7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqaW51c2V0YWI7CisKK3N0YXRpYyBzcGlubG9ja190IHBzM19ib2x0dGFiX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKKyNkZWZpbmUgZGVidWdfZHVtcF9ocHRlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nKSBcCisJX2RlYnVnX2R1bXBfaHB0ZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2RlYnVnX2R1bXBfaHB0ZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHZhLAorCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBocHRlX3QgbGhwdGUsIGludCBwc2l6ZSwKKwl1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCURCRygiJXM6JWQ6IHBhICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHBhKTsKKwlEQkcoIiVzOiVkOiBscGFyICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLAorCQlwczNfbW1fcGh5c190b19scGFyKHBhKSk7CisJREJHKCIlczolZDogdmEgICAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgdmEpOworCURCRygiJXM6JWQ6IGdyb3VwICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIGdyb3VwKTsKKwlEQkcoIiVzOiVkOiBiaXRtYXAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBiaXRtYXApOworCURCRygiJXM6JWQ6IGhwdGUudiA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIGxocHRlLnYpOworCURCRygiJXM6JWQ6IGhwdGUuciA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIGxocHRlLnIpOworCURCRygiJXM6JWQ6IHBzaXplICA9ICV4aFxuIiwgZnVuYywgbGluZSwgcHNpemUpOworCURCRygiJXM6JWQ6IHNsb3QgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHNsb3QpOworfQorCitzdGF0aWMgbG9uZyBwczNfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLCB1bnNpZ25lZCBsb25nIHZhLAorCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLCB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgc2xvdDsKKwlocHRlX3QgbGhwdGU7CisJaW50IHNlY29uZGFyeSA9IDA7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBiaXRtYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHBfcHRlZywgc19wdGVnLCBiX2luZGV4LCBiX21hc2ssIGNiLCBjaTsKKworCXZmbGFncyAmPSB+SFBURV9WX1NFQ09OREFSWTsgLyogdGhpcyBiaXQgaXMgaWdub3JlZCAqLworCisJbGhwdGUudiA9IGhwdGVfZW5jb2RlX3YodmEsIHBzaXplKSB8IHZmbGFncyB8IEhQVEVfVl9WQUxJRDsKKwlsaHB0ZS5yID0gaHB0ZV9lbmNvZGVfcihwczNfbW1fcGh5c190b19scGFyKHBhKSwgcHNpemUpIHwgcmZsYWdzOworCisJcF9wdGVnID0gaHB0ZV9ncm91cCAvIEhQVEVTX1BFUl9HUk9VUDsKKwlzX3B0ZWcgPSB+cF9wdGVnICYgaHRhYl9oYXNoX21hc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHMzX2JvbHR0YWJfbG9jaywgZmxhZ3MpOworCisJQlVHX09OKGJvbHR0YWJbcF9wdGVnXSA9PSAweGZmICYmIGJvbHR0YWJbc19wdGVnXSA9PSAweGZmKTsKKworCWJpdG1hcCA9IChpbnVzZXRhYltwX3B0ZWddIDw8IDgpIHwgaW51c2V0YWJbc19wdGVnXTsKKworCWlmIChiaXRtYXAgPT0gMHhmZmZmKSB7CisJCS8qCisJCSAqIFBURUcgaXMgZnVsbC4gU2VhcmNoIGZvciB2aWN0aW0uCisJCSAqLworCQliaXRtYXAgJj0gfigoYm9sdHRhYltwX3B0ZWddIDw8IDgpIHwgYm9sdHRhYltzX3B0ZWddKTsKKwkJZG8geworCQkJY2kgPSBtZnRiKCkgJiAxNTsKKwkJCWNiID0gMHg4MDAwVUwgPj4gY2k7CisJCX0gd2hpbGUgKChjYiAmIGJpdG1hcCkgPT0gMCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogc2VhcmNoIGZyZWUgc2xvdCBpbiBoYXJkd2FyZSBvcmRlcgorCQkgKglbcHJpbWFyeV0JMCwgMiwgNCwgNiwgMSwgMywgNSwgNworCQkgKglbc2Vjb25kYXJ5XQkwLCAyLCA0LCA2LCAxLCAzLCA1LCA3CisJCSAqLworCQlmb3IgKGNpID0gMDsgY2kgPCBIUFRFU19QRVJfR1JPVVA7IGNpICs9IDIpIHsKKwkJCWNiID0gMHg4MDAwVUwgPj4gY2k7CisJCQlpZiAoKGNiICYgYml0bWFwKSA9PSAwKQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwkJZm9yIChjaSA9IDE7IGNpIDwgSFBURVNfUEVSX0dST1VQOyBjaSArPSAyKSB7CisJCQljYiA9IDB4ODAwMFVMID4+IGNpOworCQkJaWYgKChjYiAmIGJpdG1hcCkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJCWZvciAoY2kgPSBIUFRFU19QRVJfR1JPVVA7IGNpIDwgSFBURVNfUEVSX0dST1VQKjI7IGNpICs9IDIpIHsKKwkJCWNiID0gMHg4MDAwVUwgPj4gY2k7CisJCQlpZiAoKGNiICYgYml0bWFwKSA9PSAwKQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwkJZm9yIChjaSA9IEhQVEVTX1BFUl9HUk9VUCsxOyBjaSA8IEhQVEVTX1BFUl9HUk9VUCoyOyBjaSArPSAyKSB7CisJCQljYiA9IDB4ODAwMFVMID4+IGNpOworCQkJaWYgKChjYiAmIGJpdG1hcCkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCitmb3VuZDoKKwlpZiAoY2kgPCBIUFRFU19QRVJfR1JPVVApIHsKKwkJc2xvdCA9IHBfcHRlZyAqIEhQVEVTX1BFUl9HUk9VUCArIGNpOworCX0gZWxzZSB7CisJCXNsb3QgPSBzX3B0ZWcgKiBIUFRFU19QRVJfR1JPVVAgKyAoY2kgJiA3KTsKKwkJLyogbGhwdGUuZHcwLmR3MC5oID0gMTsgKi8KKwkJdmZsYWdzIHw9IEhQVEVfVl9TRUNPTkRBUlk7CisJCWxocHRlLnYgfD0gSFBURV9WX1NFQ09OREFSWTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfd3JpdGVfaHRhYl9lbnRyeSgwLCBzbG90LCBsaHB0ZS52LCBsaHB0ZS5yKTsKKworCWlmIChyZXN1bHQpIHsKKwkJZGVidWdfZHVtcF9ocHRlKHBhLCB2YSwgaHB0ZV9ncm91cCwgYml0bWFwLCBsaHB0ZSwgcHNpemUsIHNsb3QpOworCQlCVUcoKTsKKwl9CisKKwkvKgorCSAqIElmIHVzZWQgc2xvdCBpcyBub3QgaW4gcHJpbWFyeSBIUFRFIGdyb3VwLAorCSAqIHRoZSBzbG90IHNob3VsZCBiZSBpbiBzZWNvbmRhcnkgSFBURSBncm91cC4KKwkgKi8KKworCWlmICgoaHB0ZV9ncm91cCBeIHNsb3QpICYgfihIUFRFU19QRVJfR1JPVVAgLSAxKSkgeworCQlzZWNvbmRhcnkgPSAxOworCQliX2luZGV4ID0gc19wdGVnOworCX0gZWxzZSB7CisJCXNlY29uZGFyeSA9IDA7CisJCWJfaW5kZXggPSBwX3B0ZWc7CisJfQorCisJYl9tYXNrID0gKGxocHRlLnYgJiBIUFRFX1ZfQk9MVEVEKSA/IDEgPDwgNyA6IDAgPDwgNzsKKwlib2x0dGFiW2JfaW5kZXhdIHw9IGJfbWFzayA+PiAoc2xvdCAmIDcpOworCWJfbWFzayA9IDEgPDwgNzsKKwlpbnVzZXRhYltiX2luZGV4XSB8PSBiX21hc2sgPj4gKHNsb3QgJiA3KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwczNfYm9sdHRhYl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKHNsb3QgJiA3KSB8IChzZWNvbmRhcnkgPDwgMyk7Cit9CisKK3N0YXRpYyBsb25nIHBzM19ocHRlX3JlbW92ZSh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXApCit7CisJcGFuaWMoInBzM19ocHRlX3JlbW92ZSgpIG5vdCBpbXBsZW1lbnRlZCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBwczNfaHB0ZV91cGRhdGVwcCh1bnNpZ25lZCBsb25nIHNsb3QsIHVuc2lnbmVkIGxvbmcgbmV3cHAsCisJdW5zaWduZWQgbG9uZyB2YSwgaW50IHBzaXplLCBpbnQgbG9jYWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHB0ZWcsIGJpdDsKKwl1bnNpZ25lZCBsb25nIGhwdGVfdiwgd2FudF92OworCisJd2FudF92ID0gaHB0ZV9lbmNvZGVfdih2YSwgcHNpemUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzM19ib2x0dGFiX2xvY2ssIGZsYWdzKTsKKworCWhwdGVfdiA9IGh0YWJbc2xvdF0udjsKKwlpZiAoIUhQVEVfVl9DT01QQVJFKGhwdGVfdiwgd2FudF92KSB8fCAhKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHMzX2JvbHR0YWJfbG9jaywgZmxhZ3MpOworCisJCS8qIHBzM19ocHRlX2luc2VydCgpIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgUFRFICovCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfd3JpdGVfaHRhYl9lbnRyeSgwLCBzbG90LCAwLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJREJHKCIlczogdmE9JWx4IHNsb3Q9JWx4IHBzaXplPSVkIHJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLAorCQkgICAgICAgX19mdW5jX18sIHZhLCBzbG90LCBwc2l6ZSwgcmVzdWx0LCByZXN1bHQpOworCQlCVUcoKTsKKwl9CisKKwlwdGVnID0gc2xvdCAvIEhQVEVTX1BFUl9HUk9VUDsKKwliaXQgPSBzbG90ICUgSFBURVNfUEVSX0dST1VQOworCWludXNldGFiW3B0ZWddICY9IH4oMHg4MCA+PiBiaXQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHMzX2JvbHR0YWJfbG9jaywgZmxhZ3MpOworCisJLyogcHMzX2hwdGVfaW5zZXJ0KCkgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSBQVEUgKi8KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19ocHRlX3VwZGF0ZWJvbHRlZHBwKHVuc2lnbmVkIGxvbmcgbmV3cHAsIHVuc2lnbmVkIGxvbmcgZWEsCisJaW50IHBzaXplKQoreworCXBhbmljKCJwczNfaHB0ZV91cGRhdGVib2x0ZWRwcCgpIG5vdCBpbXBsZW1lbnRlZCIpOworfQorCitzdGF0aWMgdm9pZCBwczNfaHB0ZV9pbnZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyB2YSwKKwlpbnQgcHNpemUsIGludCBsb2NhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgcHRlZywgYml0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzM19ib2x0dGFiX2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSBsdjFfd3JpdGVfaHRhYl9lbnRyeSgwLCBzbG90LCAwLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJREJHKCIlczogdmE9JWx4IHNsb3Q9JWx4IHBzaXplPSVkIHJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLAorCQkgICAgICAgX19mdW5jX18sIHZhLCBzbG90LCBwc2l6ZSwgcmVzdWx0LCByZXN1bHQpOworCQlCVUcoKTsKKwl9CisKKwlwdGVnID0gc2xvdCAvIEhQVEVTX1BFUl9HUk9VUDsKKwliaXQgPSBzbG90ICUgSFBURVNfUEVSX0dST1VQOworCWludXNldGFiW3B0ZWddICY9IH4oMHg4MCA+PiBiaXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzM19ib2x0dGFiX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHMzX2hwdGVfY2xlYXIodm9pZCkKK3sKKwlsdjFfdW5tYXBfaHRhYihodGFiX2FkZHIpOworfQorCit2b2lkIF9faW5pdCBwczNfaHB0ZV9pbml0KHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplKQoreworCWxvbmcgYml0bWFwX3NpemU7CisKKwlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBwY19tZC5ocHRlX2ludmFsaWRhdGUgPSBwczNfaHB0ZV9pbnZhbGlkYXRlOworCXBwY19tZC5ocHRlX3VwZGF0ZXBwID0gcHMzX2hwdGVfdXBkYXRlcHA7CisJcHBjX21kLmhwdGVfdXBkYXRlYm9sdGVkcHAgPSBwczNfaHB0ZV91cGRhdGVib2x0ZWRwcDsKKwlwcGNfbWQuaHB0ZV9pbnNlcnQgPSBwczNfaHB0ZV9pbnNlcnQ7CisJcHBjX21kLmhwdGVfcmVtb3ZlID0gcHMzX2hwdGVfcmVtb3ZlOworCXBwY19tZC5ocHRlX2NsZWFyX2FsbCA9IHBzM19ocHRlX2NsZWFyOworCisJcHBjNjRfcGZ0X3NpemUgPSBfX2lsb2cyKGh0YWJfc2l6ZSk7CisKKwliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihocHRlX3QpIC8gODsKKworCWJvbHR0YWIgPSBfX3ZhKGxtYl9hbGxvYyhiaXRtYXBfc2l6ZSwgMSkpOworCWludXNldGFiID0gX192YShsbWJfYWxsb2MoYml0bWFwX3NpemUsIDEpKTsKKworCW1lbXNldChib2x0dGFiLCAwLCBiaXRtYXBfc2l6ZSk7CisJbWVtc2V0KGludXNldGFiLCAwLCBiaXRtYXBfc2l6ZSk7CisKKwlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKwordm9pZCBfX2luaXQgcHMzX21hcF9odGFiKHZvaWQpCit7CisJbG9uZyByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBodGFiX3NpemUgPSAoMVVMIDw8IHBwYzY0X3BmdF9zaXplKTsKKworCXJlc3VsdCA9IGx2MV9tYXBfaHRhYigwLCAmaHRhYl9hZGRyKTsKKworCWh0YWIgPSAoaHB0ZV90ICopX19pb3JlbWFwKGh0YWJfYWRkciwgaHRhYl9zaXplLCBQQUdFX1JFQURPTkxZX1gpOworCisJREJHKCIlczolZDogbHBhciAlMDE2bHhoLCB2aXJ0ICUwMTZseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJaHRhYl9hZGRyLCAodW5zaWduZWQgbG9uZylodGFiKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h2Y2FsbC5TIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHZjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h2Y2FsbC5TCkBAIC0wLDAgKzEsODA0IEBACisvKgorICogIFBTMyBodmNhbGwgaW50ZXJmYWNlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisKKyNkZWZpbmUgbHYxY2FsbCAubG9uZyAweDQ0MDAwMDIyOyBleHRzdyByMywgcjMKKworI2RlZmluZSBMVjFfTl9JTl8wX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMF9JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfMV9JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfMl9JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfM19JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfNF9JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfNV9JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfNl9JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorI2RlZmluZSBMVjFfN19JTl8wX09VVCBMVjFfTl9JTl8wX09VVAorCisjZGVmaW5lIExWMV8wX0lOXzFfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGR1ICAgIHIzLCAtOChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgODsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzBfSU5fMl9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjMsIC04KHIxKTsJCQlcCisJc3RkdQlyNCwgLTE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAxNjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzBfSU5fM19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjMsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAtMTYocjEpOwkJCVwKKwlzdGR1CXI1LCAtMjQocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDI0OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMF9JTl83X09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByMywgLTgocjEpOwkJCVwKKwlzdGQJcjQsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIC00MChyMSk7CQkJXAorCXN0ZAlyOCwgLTQ4KHIxKTsJCQlcCisJc3RkdQlyOSwgLTU2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA1NjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0zMihyMSk7CQkJXAorCXN0ZAlyNywgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC00MChyMSk7CQkJXAorCXN0ZAlyOCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC00OChyMSk7CQkJXAorCXN0ZAlyOSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC01NihyMSk7CQkJXAorCXN0ZAlyMTAsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8xX0lOXzFfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGR1ICAgIHI0LCAtOChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgODsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzFfSU5fMl9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjQsIC04KHIxKTsJCQlcCisJc3RkdQlyNSwgLTE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAxNjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzFfSU5fM19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjQsIC04KHIxKTsJCQlcCisJc3RkCXI1LCAtMTYocjEpOwkJCVwKKwlzdGR1CXI2LCAtMjQocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDI0OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMV9JTl80X09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNCwgLTgocjEpOwkJCVwKKwlzdGQJcjUsIC0xNihyMSk7CQkJXAorCXN0ZAlyNiwgLTI0KHIxKTsJCQlcCisJc3RkdQlyNywgLTMyKHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAzMjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0zMihyMSk7CQkJXAorCXN0ZAlyNywgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzFfSU5fNV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjQsIC04KHIxKTsJCQlcCisJc3RkCXI1LCAtMTYocjEpOwkJCVwKKwlzdGQJcjYsIC0yNChyMSk7CQkJXAorCXN0ZAlyNywgLTMyKHIxKTsJCQlcCisJc3RkdQlyOCwgLTQwKHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA0MDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0zMihyMSk7CQkJXAorCXN0ZAlyNywgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC00MChyMSk7CQkJXAorCXN0ZAlyOCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzFfSU5fNl9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjQsIC04KHIxKTsJCQlcCisJc3RkCXI1LCAtMTYocjEpOwkJCVwKKwlzdGQJcjYsIC0yNChyMSk7CQkJXAorCXN0ZAlyNywgLTMyKHIxKTsJCQlcCisJc3RkCXI4LCAtNDAocjEpOwkJCVwKKwlzdGR1CXI5LCAtNDgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDQ4OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTMyKHIxKTsJCQlcCisJc3RkCXI3LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTQwKHIxKTsJCQlcCisJc3RkCXI4LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTQ4KHIxKTsJCQlcCisJc3RkCXI5LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMV9JTl83X09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNCwgLTgocjEpOwkJCVwKKwlzdGQJcjUsIC0xNihyMSk7CQkJXAorCXN0ZAlyNiwgLTI0KHIxKTsJCQlcCisJc3RkCXI3LCAtMzIocjEpOwkJCVwKKwlzdGQJcjgsIC00MChyMSk7CQkJXAorCXN0ZAlyOSwgLTQ4KHIxKTsJCQlcCisJc3RkdQlyMTAsIC01NihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgNTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIDAocjExKTsJCQlcCisJbGQJcjExLCAtNDAocjEpOwkJCVwKKwlzdGQJcjgsIDAocjExKTsJCQlcCisJbGQJcjExLCAtNDgocjEpOwkJCVwKKwlzdGQJcjksIDAocjExKTsJCQlcCisJbGQJcjExLCAtNTYocjEpOwkJCVwKKwlzdGQJcjEwLCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMl9JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdQlyNSwgLTgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDg7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8yX0lOXzJfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI1LCAtOChyMSk7CQkJXAorCXN0ZHUJcjYsIC0xNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8yX0lOXzNfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI1LCAtOChyMSk7CQkJXAorCXN0ZAlyNiwgLTE2KHIxKTsJCQlcCisJc3RkdQlyNywgLTI0KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAyNDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzJfSU5fNF9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjUsIC04KHIxKTsJCQlcCisJc3RkCXI2LCAtMTYocjEpOwkJCVwKKwlzdGQJcjcsIC0yNChyMSk7CQkJXAorCXN0ZHUJcjgsIC0zMihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMzI7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8yX0lOXzVfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI1LCAtOChyMSk7CQkJXAorCXN0ZAlyNiwgLTE2KHIxKTsJCQlcCisJc3RkCXI3LCAtMjQocjEpOwkJCVwKKwlzdGQJcjgsIC0zMihyMSk7CQkJXAorCXN0ZHUJcjksIC00MChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgNDA7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIDAocjExKTsJCQlcCisJbGQJcjExLCAtNDAocjEpOwkJCVwKKwlzdGQJcjgsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8zX0lOXzFfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGR1CXI2LCAtOChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgODsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzNfSU5fMl9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjYsIC04KHIxKTsJCQlcCisJc3RkdQlyNywgLTE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAxNjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzNfSU5fM19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjYsIC04KHIxKTsJCQlcCisJc3RkCXI3LCAtMTYocjEpOwkJCVwKKwlzdGR1CXI4LCAtMjQocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDI0OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNF9JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdSAgICByNywgLTgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDg7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV80X0lOXzJfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI3LCAtOChyMSk7CQkJXAorCXN0ZHUJcjgsIC0xNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV80X0lOXzNfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI3LCAtOChyMSk7CQkJXAorCXN0ZAlyOCwgLTE2KHIxKTsJCQlcCisJc3RkdQlyOSwgLTI0KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAyNDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzVfSU5fMV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZHUgICAgcjgsIC04KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA4OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNV9JTl8yX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByOCwgLTgocjEpOwkJCVwKKwlzdGR1CXI5LCAtMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDE2OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNV9JTl8zX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByOCwgLTgocjEpOwkJCVwKKwlzdGQJcjksIC0xNihyMSk7CQkJXAorCXN0ZHUJcjEwLCAtMjQocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDI0OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNl9JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdSAgICByOSwgLTgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDg7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV82X0lOXzJfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI5LCAtOChyMSk7CQkJXAorCXN0ZHUgICAgcjEwLCAtMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDE2OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNl9JTl8zX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByOSwgLTgocjEpOwkJCVwKKwlzdGR1ICAgIHIxMCwgLTE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAxNjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIDQ4KzgqOChyMSk7CQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfN19JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdSAgICByMTAsIC04KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA4OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfN19JTl82X09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkCXIxMCwgNDgrOCo3KHIxKTsJCVwKKwkJCQkJCVwKKwlsaQlyMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWxkCXIxMSwgNDgrOCo3KHIxKTsJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCA0OCs4KjgocjEpOwkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIDQ4KzgqOShyMSk7CQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgNDgrOCoxMChyMSk7CQlcCisJc3RkCXI3LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgNDgrOCoxMShyMSk7CQlcCisJc3RkCXI4LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgNDgrOCoxMihyMSk7CQlcCisJc3RkCXI5LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfOF9JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWxkCXIxMSwgNDgrOCo4KHIxKTsJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisJLnRleHQKKworLyogdGhlIGx2MSB1bmRlcnNjb3JlZCBjYWxsIGRlZmluaXRpb25zIGV4cGFuZCBoZXJlICovCisKKyNkZWZpbmUgTFYxX0NBTEwobmFtZSwgaW4sIG91dCwgbnVtKSBMVjFfIyNpbiMjX0lOXyMjb3V0IyNfT1VUKGx2MV8jI25hbWUsIG51bSkKKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZjMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiAgUFMzIGludGVycnVwdCByb3V0aW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vcHMzLmg+CisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNpZiBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2VuZGlmCisKKy8qKgorICogcHMzX2FsbG9jX2lvX2lycSAtIEFzc2lnbiBhIHZpcnEgdG8gYSBzeXN0ZW0gYnVzIGRldmljZS4KKyAqIGludGVycnVwdF9pZDogVGhlIGRldmljZSBpbnRlcnJ1cHQgaWQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeS4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBBbiBpbyBpcnEgcmVwcmVzZW50cyBhIG5vbi12aXJ0dWFsaXplZCBkZXZpY2UgaW50ZXJydXB0LiAgaW50ZXJydXB0X2lkCisgKiBjb3Jlc3BvbmRzIHRvIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlci4KKyAqLworCitpbnQgcHMzX2FsbG9jX2lvX2lycSh1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLCB1bnNpZ25lZCBpbnQgKnZpcnEpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG91dGxldDsKKworCXJlc3VsdCA9IGx2MV9jb25zdHJ1Y3RfaW9faXJxX291dGxldChpbnRlcnJ1cHRfaWQsICZvdXRsZXQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25zdHJ1Y3RfaW9faXJxX291dGxldCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCSp2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIG91dGxldCk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGludGVycnVwdF9pZCAldSA9PiBvdXRsZXQgJWx1LCB2aXJxICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIGludGVycnVwdF9pZCwgb3V0bGV0LCAqdmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBzM19mcmVlX2lvX2lycSh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQodmlycV90b19odyh2aXJxKSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGVzdHJ1Y3RfaW9faXJxX291dGxldCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX2FsbG9jX2V2ZW50X2lycSAtIEFsbG9jYXRlIGEgdmlycSBmb3IgdXNlIHdpdGggYSBzeXN0ZW0gZXZlbnQuCisgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCisgKgorICogVGhlIHZpcnEgY2FuIGJlIHVzZWQgd2l0aCBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KCkgdG8KKyAqIGFycmFuZ2UgdG8gcmVjZWl2ZSBldmVudHMsIG9yIHdpdGggcHMzX3NlbmRfZXZlbnRfbG9jYWxseSgpIHRvIHNpZ25hbAorICogZXZlbnRzLgorICovCisKK2ludCBwczNfYWxsb2NfZXZlbnRfaXJxKHVuc2lnbmVkIGludCAqdmlycSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgb3V0bGV0OworCisJcmVzdWx0ID0gbHYxX2NvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQoJm91dGxldCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJKnZpcnEgPSBOT19JUlE7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJKnZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgb3V0bGV0KTsKKworCXByX2RlYnVnKCIlczolZDogb3V0bGV0ICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBvdXRsZXQsCisJCSp2aXJxKTsKKworCXJldHVybiAwOworfQorCitpbnQgcHMzX2ZyZWVfZXZlbnRfaXJxKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCByZXN1bHQ7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCh2aXJxX3RvX2h3KHZpcnEpKTsKKworCWlmIChyZXN1bHQpCisJCXByX2RlYnVnKCIlczolZDogbHYxX2Rlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19zZW5kX2V2ZW50X2xvY2FsbHkodW5zaWduZWQgaW50IHZpcnEpCit7CisJcmV0dXJuIGx2MV9zZW5kX2V2ZW50X2xvY2FsbHkodmlycV90b19odyh2aXJxKSk7Cit9CisKKy8qKgorICogcHMzX2Nvbm5lY3RfZXZlbnRfaXJxIC0gQXNzaWduIGEgdmlycSB0byBhIHN5c3RlbSBidXMgZGV2aWNlLgorICogQGRpZDogVGhlIEhWIGRldmljZSBpZGVudGlmaWVyIHJlYWQgZnJvbSB0aGUgc3lzdGVtIHJlcG9zaXRvcnkuCisgKiBAaW50ZXJydXB0X2lkOiBUaGUgZGV2aWNlIGludGVycnVwdCBpZCByZWFkIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5LgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIEFuIGV2ZW50IGlycSByZXByZXNlbnRzIGEgdmlydHVhbCBkZXZpY2UgaW50ZXJydXB0LiAgVGhlIGludGVycnVwdF9pZAorICogY29yZXNwb25kcyB0byB0aGUgc29mdHdhcmUgaW50ZXJydXB0IG51bWJlci4KKyAqLworCitpbnQgcHMzX2Nvbm5lY3RfZXZlbnRfaXJxKGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCisJdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50ICp2aXJxKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBwczNfYWxsb2NfZXZlbnRfaXJxKHZpcnEpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGlkLT5idXNfaWQsCisJCWRpZC0+ZGV2X2lkLCB2aXJxX3RvX2h3KCp2aXJxKSwgaW50ZXJydXB0X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0IgorCQkJIiBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlwczNfcmVzdWx0KHJlc3VsdCkpOworCQlwczNfZnJlZV9ldmVudF9pcnEoKnZpcnEpOworCQkqdmlycSA9IE5PX0lSUTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGludGVycnVwdF9pZCAldSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlpbnRlcnJ1cHRfaWQsICp2aXJxKTsKKworCXJldHVybiAwOworfQorCitpbnQgcHMzX2Rpc2Nvbm5lY3RfZXZlbnRfaXJxKGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCisJdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IHJlc3VsdDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6IGludGVycnVwdF9pZCAldSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlpbnRlcnJ1cHRfaWQsIHZpcnEpOworCisJcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKKwkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGludGVycnVwdF9pZCk7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kaXNjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQiCisJCQkiIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXBzM19yZXN1bHQocmVzdWx0KSk7CisKKwlwczNfZnJlZV9ldmVudF9pcnEodmlycSk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX2FsbG9jX3Z1YXJ0X2lycSAtIENvbmZpZ3VyZSB0aGUgc3lzdGVtIHZpcnR1YWwgdWFydCB2aXJxLgorICogQHZpcnRfYWRkcl9ibXA6IFRoZSBjYWxsZXIgc3VwcGxpZWQgdmlydHVhbCB1YXJ0IGludGVycnVwdCBiaXRtYXAuCisgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCisgKgorICogVGhlIHN5c3RlbSBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHZpcnR1YWwgdWFydCwgc28gbXVsdGlwbGUgY2FsbHMgd2l0aG91dAorICogZnJlZWluZyB0aGUgaW50ZXJydXB0IHdpbGwgcmV0dXJuIGEgd3Jvbmcgc3RhdGUgZXJyb3IuCisgKi8KKworaW50IHBzM19hbGxvY192dWFydF9pcnEodm9pZCogdmlydF9hZGRyX2JtcCwgdW5zaWduZWQgaW50ICp2aXJxKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBvdXRsZXQ7CisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHI7CisKKwlCVUdfT04oIWlzX2tlcm5lbF9hZGRyKCh1bnNpZ25lZCBsb25nKXZpcnRfYWRkcl9ibXApKTsKKworCWxwYXJfYWRkciA9IHBzM19tbV9waHlzX3RvX2xwYXIoX19wYSh2aXJ0X2FkZHJfYm1wKSk7CisKKwlyZXN1bHQgPSBsdjFfY29uZmlndXJlX3ZpcnR1YWxfdWFydF9pcnEobHBhcl9hZGRyLCAmb3V0bGV0KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29uZmlndXJlX3ZpcnR1YWxfdWFydF9pcnEgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkqdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBvdXRsZXQpOworCisJcHJfZGVidWcoIiVzOiVkOiBvdXRsZXQgJWx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCW91dGxldCwgKnZpcnEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwczNfZnJlZV92dWFydF9pcnEodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV9kZWNvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxKCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX2FsbG9jX3NwZV9pcnEgLSBDb25maWd1cmUgYW4gc3BlIHZpcnEuCisgKiBAc3BlX2lkOiBUaGUgc3BlX2lkIHJldHVybmVkIGZyb20gbHYxX2NvbnN0cnVjdF9sb2dpY2FsX3NwZSgpLgorICogQGNsYXNzOiBUaGUgc3BlIGludGVycnVwdCBjbGFzcyB7MCwxLDJ9LgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqLworCitpbnQgcHMzX2FsbG9jX3NwZV9pcnEodW5zaWduZWQgbG9uZyBzcGVfaWQsIHVuc2lnbmVkIGludCBjbGFzcywKKwl1bnNpZ25lZCBpbnQgKnZpcnEpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG91dGxldDsKKworCUJVR19PTihjbGFzcyA+IDIpOworCisJcmVzdWx0ID0gbHYxX2dldF9zcGVfaXJxX291dGxldChzcGVfaWQsIGNsYXNzLCAmb3V0bGV0KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZ2V0X3NwZV9pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJKnZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgb3V0bGV0KTsKKworCXByX2RlYnVnKCIlczolZDogc3BlX2lkICVsdSwgY2xhc3MgJXUsIG91dGxldCAlbHUsIHZpcnEgJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgc3BlX2lkLCBjbGFzcywgb3V0bGV0LCAqdmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBzM19mcmVlX3NwZV9pcnEodW5zaWduZWQgaW50IHZpcnEpCit7CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBQUzNfSU5WQUxJRF9PVVRMRVQgKChpcnFfaHdfbnVtYmVyX3QpLTEpCisjZGVmaW5lIFBTM19QTFVHX01BWCA2MworCisvKioKKyAqIHN0cnVjdCBibXAgLSBhIHBlciBjcHUgaXJxIHN0YXR1cyBhbmQgbWFzayBiaXRtYXAgc3RydWN0dXJlCisgKiBAc3RhdHVzOiAyNTYgYml0IHN0YXR1cyBiaXRtYXAgaW5kZXhlZCBieSBwbHVnCisgKiBAdW51c2VkXzE6CisgKiBAbWFzazogMjU2IGJpdCBtYXNrIGJpdG1hcCBpbmRleGVkIGJ5IHBsdWcKKyAqIEB1bnVzZWRfMjoKKyAqIEBsb2NrOgorICogQGlwaV9kZWJ1Z19icmtfbWFzazoKKyAqCisgKiBUaGUgSFYgbWFudGFpbnMgcGVyIFNNVCB0aHJlYWQgbWFwcGluZ3Mgb2YgSFYgb3V0bGV0IHRvIEhWIHBsdWcgb24KKyAqIGJlaGFsZiBvZiB0aGUgZ3Vlc3QuICBUaGVzZSBtYXBwaW5ncyBhcmUgaW1wbGVtZW50ZWQgYXMgMjU2IGJpdCBndWVzdAorICogc3VwcGxpZWQgYml0bWFwcyBpbmRleGVkIGJ5IHBsdWcgbnVtYmVyLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGJpdG1hcHMgYXJlCisgKiByZWdpc3RlcmVkIHdpdGggdGhlIEhWIHRocm91Z2ggbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKCkuCisgKgorICogVGhlIEhWIHN1cHBvcnRzIDI1NiBwbHVncyBwZXIgdGhyZWFkLCBhc3NpZ25lZCBhcyB7MC4uMjU1fSwgZm9yIGEgdG90YWwKKyAqIG9mIDUxMiBwbHVncyBzdXBwb3J0ZWQgb24gYSBwcm9jZXNzb3IuICBUbyBzaW1wbGlmeSB0aGUgbG9naWMgdGhpcworICogaW1wbGVtZW50YXRpb24gZXF1YXRlcyBIViBwbHVnIHZhbHVlIHRvIGxpbnV4IHZpcnEgdmFsdWUsIGNvbnN0cmFpbnMgZWFjaAorICogaW50ZXJydXB0IHRvIGhhdmUgYSBzeXN0ZW0gd2lkZSB1bmlxdWUgcGx1ZyBudW1iZXIsIGFuZCBsaW1pdHMgdGhlIHJhbmdlCisgKiBvZiB0aGUgcGx1ZyB2YWx1ZXMgdG8gbWFwIGludG8gdGhlIGZpcnN0IGR3b3JkIG9mIHRoZSBiaXRtYXBzLiAgVGhpcworICogZ2l2ZXMgYSB1c2FibGUgcmFuZ2Ugb2YgcGx1ZyB2YWx1ZXMgb2YgIHtOVU1fSVNBX0lOVEVSUlVQVFMuLjYzfS4gIE5vdGUKKyAqIHRoYXQgdGhlcmUgaXMgbm8gY29uc3RyYWludCBvbiBob3cgbWFueSBpbiB0aGlzIHNldCBhbiBpbmRpdmlkdWFsIHRocmVhZAorICogY2FuIGFxdWlyZS4KKyAqLworCitzdHJ1Y3QgYm1wIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwkJdW5zaWduZWQgbG9uZyB1bnVzZWRfMVszXTsKKwkJdW5zaWduZWQgbG9uZyBtYXNrOworCQl1bnNpZ25lZCBsb25nIHVudXNlZF8yWzNdOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGlwaV9kZWJ1Z19icmtfbWFzazsKK307CisKKy8qKgorICogc3RydWN0IHByaXZhdGUgLSBhIHBlciBjcHUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBub2RlOiBIViBub2RlIGlkCisgKiBAY3B1OiBIViB0aHJlYWQgaWQKKyAqIEBibXA6IGFuIEhWIGJtcCBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgcHJpdmF0ZSB7CisJdW5zaWduZWQgbG9uZyBub2RlOworCXVuc2lnbmVkIGludCBjcHU7CisJc3RydWN0IGJtcCBibXA7Cit9OworCisjaWYgZGVmaW5lZChERUJVRykKK3N0YXRpYyB2b2lkIF9kdW1wXzY0X2JtcChjb25zdCBjaGFyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGNwdSwKKwljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3sKKwlwcl9kZWJ1ZygiJXM6JWQ6ICVzICV1IHslMDRseF8lMDRseF8lMDRseF8lMDRseH1cbiIsCisJCWZ1bmMsIGxpbmUsIGhlYWRlciwgY3B1LAorCQkqcCA+PiA0OCwgKCpwID4+IDMyKSAmIDB4ZmZmZiwgKCpwID4+IDE2KSAmIDB4ZmZmZiwKKwkJKnAgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfMjU2X2JtcChjb25zdCBjaGFyICpoZWFkZXIsCisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCwgdW5zaWduZWQgY3B1LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3sKKwlwcl9kZWJ1ZygiJXM6JWQ6ICVzICV1IHslMDE2bHg6JTAxNmx4OiUwMTZseDolMDE2bHh9XG4iLAorCQlmdW5jLCBsaW5lLCBoZWFkZXIsIGNwdSwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSk7Cit9CisKKyNkZWZpbmUgZHVtcF9ibXAoX3gpIF9kdW1wX2JtcChfeCwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfYm1wKHN0cnVjdCBwcml2YXRlKiBwZCwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKwlfZHVtcF82NF9ibXAoInN0YXQiLCAmcGQtPmJtcC5zdGF0dXMsIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIGR1bXBfbWFzayhfeCkgX2R1bXBfbWFzayhfeCwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX21hc2soc3RydWN0IHByaXZhdGUqIHBkLAorCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CisJX2R1bXBfNjRfYm1wKCJtYXNrIiwgJnBkLT5ibXAubWFzaywgcGQtPmNwdSwgZnVuYywgbGluZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgZHVtcF9ibXAoc3RydWN0IHByaXZhdGUqIHBkKSB7fTsKKyNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKSAqLworCitzdGF0aWMgdm9pZCBjaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKworCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5jcHUsIHZpcnEpOworCisJQlVHX09OKHZpcnEgPCBOVU1fSVNBX0lOVEVSUlVQVFMpOworCUJVR19PTih2aXJxID4gUFMzX1BMVUdfTUFYKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKwlwZC0+Ym1wLm1hc2sgJj0gfigweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiB2aXJxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKworCWx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKHBkLT5ub2RlLCBwZC0+Y3B1KTsKK30KKworc3RhdGljIHZvaWQgY2hpcF91bm1hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKworCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5jcHUsIHZpcnEpOworCisJQlVHX09OKHZpcnEgPCBOVU1fSVNBX0lOVEVSUlVQVFMpOworCUJVR19PTih2aXJxID4gUFMzX1BMVUdfTUFYKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKwlwZC0+Ym1wLm1hc2sgfD0gKDB4ODAwMDAwMDAwMDAwMDAwMFVMID4+IHZpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOworCisJbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPm5vZGUsIHBkLT5jcHUpOworfQorCitzdGF0aWMgdm9pZCBjaGlwX2VvaSh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlsdjFfZW5kX29mX2ludGVycnVwdCh2aXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcnFfY2hpcCA9IHsKKwkudHlwZW5hbWUgPSAicHMzIiwKKwkubWFzayA9IGNoaXBfbWFzaywKKwkudW5tYXNrID0gY2hpcF91bm1hc2ssCisJLmVvaSA9IGNoaXBfZW9pLAorfTsKKworc3RhdGljIHZvaWQgaG9zdF91bm1hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCByZXN1bHQ7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgdmlycSk7CisKKwlsdjFfZGlzY29ubmVjdF9pcnFfcGx1Zyh2aXJxKTsKKworCXJlc3VsdCA9IHNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOworCUJVR19PTihyZXN1bHQpOworfQorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHByaXZhdGUsIHByaXZhdGUpOworCitzdGF0aWMgaW50IGhvc3RfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCisJaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IGNwdTsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcHJfZGVidWcoIiVzOiVkOiBod2lycSAlbHUgPT4gdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBod2lycSwKKwkJdmlycSk7CisKKwkvKiBiaW5kIHRoaXMgdmlycSB0byBhIGNwdSAqLworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXJlc3VsdCA9IGx2MV9jb25uZWN0X2lycV9wbHVnKHZpcnEsIGh3aXJxKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9pbmZvKCIlczolZDogbHYxX2Nvbm5lY3RfaXJxX3BsdWcgZmFpbGVkOiIKKwkJCSIgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXN1bHQgPSBzZXRfaXJxX2NoaXBfZGF0YSh2aXJxLCAmcGVyX2NwdShwcml2YXRlLCBjcHUpKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3Rfb3BzIGhvc3Rfb3BzID0geworCS5tYXAgPSBob3N0X21hcCwKKwkudW5tYXAgPSBob3N0X3VubWFwLAorfTsKKwordm9pZCBfX2luaXQgcHMzX3JlZ2lzdGVyX2lwaV9kZWJ1Z19icmsodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHByaXZhdGUgKnBkID0gJnBlcl9jcHUocHJpdmF0ZSwgY3B1KTsKKworCXBkLT5ibXAuaXBpX2RlYnVnX2Jya19tYXNrID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKKworCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICV1LCBtYXNrICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJY3B1LCB2aXJxLCBwZC0+Ym1wLmlwaV9kZWJ1Z19icmtfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgYm1wX2dldF9hbmRfY2xlYXJfc3RhdHVzX2JpdChzdHJ1Y3QgYm1wICptKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGJpdDsKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOworCisJLyogY2hlY2sgZm9yIGlwaSBicmVhayBmaXJzdCB0byBzdG9wIHRoaXMgY3B1IEFTQVAgKi8KKworCWlmIChtLT5zdGF0dXMgJiBtLT5pcGlfZGVidWdfYnJrX21hc2spIHsKKwkJbS0+c3RhdHVzICY9IH5tLT5pcGlfZGVidWdfYnJrX21hc2s7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIF9faWxvZzIobS0+aXBpX2RlYnVnX2Jya19tYXNrKTsKKwl9CisKKwl4ID0gKG0tPnN0YXR1cyAmIG0tPm1hc2spOworCisJZm9yIChiaXQgPSBOVU1fSVNBX0lOVEVSUlVQVFMsIHggPDw9IGJpdDsgeDsgYml0KyssIHggPDw9IDEpCisJCWlmICh4ICYgMHg4MDAwMDAwMDAwMDAwMDAwVUwpIHsKKwkJCW0tPnN0YXR1cyAmPSB+KDB4ODAwMDAwMDAwMDAwMDAwMFVMID4+IGJpdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gYml0OworCQl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IG5vdCBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gLTE7Cit9CisKK3Vuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQoreworCWludCBwbHVnOworCisJc3RydWN0IHByaXZhdGUgKnBkID0gJl9fZ2V0X2NwdV92YXIocHJpdmF0ZSk7CisKKwlwbHVnID0gYm1wX2dldF9hbmRfY2xlYXJfc3RhdHVzX2JpdCgmcGQtPmJtcCk7CisKKwlpZiAocGx1ZyA8IDEpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBubyBwbHVnIGZvdW5kOiBjcHUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXBkLT5jcHUpOworCQlkdW1wX2JtcCgmcGVyX2NwdShwcml2YXRlLCAwKSk7CisJCWR1bXBfYm1wKCZwZXJfY3B1KHByaXZhdGUsIDEpKTsKKwkJcmV0dXJuIE5PX0lSUTsKKwl9CisKKyNpZiBkZWZpbmVkKERFQlVHKQorCWlmIChwbHVnIDwgTlVNX0lTQV9JTlRFUlJVUFRTIHx8IHBsdWcgPiBQUzNfUExVR19NQVgpIHsKKwkJZHVtcF9ibXAoJnBlcl9jcHUocHJpdmF0ZSwgMCkpOworCQlkdW1wX2JtcCgmcGVyX2NwdShwcml2YXRlLCAxKSk7CisJCUJVRygpOworCX0KKyNlbmRpZgorCXJldHVybiBwbHVnOworfQorCit2b2lkIF9faW5pdCBwczNfaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgbm9kZTsKKwl1bnNpZ25lZCBjcHU7CisJc3RydWN0IGlycV9ob3N0ICpob3N0OworCisJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmbm9kZSk7CisKKwlob3N0ID0gaXJxX2FsbG9jX2hvc3QoSVJRX0hPU1RfTUFQX05PTUFQLCAwLCAmaG9zdF9vcHMsCisJCVBTM19JTlZBTElEX09VVExFVCk7CisJaXJxX3NldF9kZWZhdWx0X2hvc3QoaG9zdCk7CisJaXJxX3NldF92aXJxX2NvdW50KFBTM19QTFVHX01BWCArIDEpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgcHJpdmF0ZSAqcGQgPSAmcGVyX2NwdShwcml2YXRlLCBjcHUpOworCisJCXBkLT5ub2RlID0gbm9kZTsKKwkJcGQtPmNwdSA9IGNwdTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBkLT5ibXAubG9jayk7CisKKwkJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKG5vZGUsIGNwdSwKKwkJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcC5zdGF0dXMpKSk7CisKKwkJaWYgKHJlc3VsdCkKKwkJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwIGZhaWxlZDoiCisJCQkJIiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXBzM19yZXN1bHQocmVzdWx0KSk7CisJfQorCisJcHBjX21kLmdldF9pcnEgPSBwczNfZ2V0X2lycTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzBkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCkBAIC0wLDAgKzEsODMxIEBACisvKgorICogIFBTMyBhZGRyZXNzIHNwYWNlIG1hbmFnZW1lbnQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4KKworI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sbWIuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZW5kaWYKKworZW51bSB7CisjaWYgZGVmaW5lZChDT05GSUdfUFMzX1VTRV9MUEFSX0FERFIpCisJVVNFX0xQQVJfQUREUiA9IDEsCisjZWxzZQorCVVTRV9MUEFSX0FERFIgPSAwLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUFMzX0RZTkFNSUNfRE1BKQorCVVTRV9EWU5BTUlDX0RNQSA9IDEsCisjZWxzZQorCVVTRV9EWU5BTUlDX0RNQSA9IDAsCisjZW5kaWYKK307CisKK2VudW0geworCVBBR0VfU0hJRlRfNEsgPSAxMlUsCisJUEFHRV9TSElGVF82NEsgPSAxNlUsCisJUEFHRV9TSElGVF8xNk0gPSAyNFUsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWtlX3BhZ2Vfc2l6ZXModW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIpCit7CisJcmV0dXJuIChhIDw8IDU2KSB8IChiIDw8IDQ4KTsKK30KKworZW51bSB7CisJQUxMT0NBVEVfTUVNT1JZX1RSWV9BTFRfVU5JVCA9IDBYMDQsCisJQUxMT0NBVEVfTUVNT1JZX0FERFJfWkVSTyA9IDBYMDgsCit9OworCisvKiB2YWxpZCBodGFiIHNpemVzIGFyZSB7MTgsMTksMjB9ID0gMjU2SywgNTEySywgMU0gKi8KKworZW51bSB7CisJSFRBQl9TSVpFX01BWCA9IDIwVSwgLyogSFYgbGltaXQgb2YgMU1CICovCisJSFRBQl9TSVpFX01JTiA9IDE4VSwgLyogQ1BVIGxpbWl0IG9mIDI1NktCICovCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogdmlydHVhbCBhZGRyZXNzIHNwYWNlIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogc3RydWN0IG1lbV9yZWdpb24gLSBtZW1vcnkgcmVnaW9uIHN0cnVjdHVyZQorICogQGJhc2U6IGJhc2UgYWRkcmVzcworICogQHNpemU6IHNpemUgaW4gYnl0ZXMKKyAqIEBvZmZzZXQ6IGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNlIGFuZCBybS5zaXplCisgKi8KKworc3RydWN0IG1lbV9yZWdpb24geworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBtYXAgLSBhZGRyZXNzIHNwYWNlIHN0YXRlIHZhcmlhYmxlcyBob2xkZXIKKyAqIEB0b3RhbDogdG90YWwgbWVtb3J5IGF2YWlsYWJsZSBhcyByZXBvcnRlZCBieSBIVgorICogQHZhc19pZCAtIEhWIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBpZAorICogQGh0YWJfc2l6ZTogaHRhYiBzaXplIGluIGJ5dGVzCisgKgorICogVGhlIEhWIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAodmFzKSBhbGxvd3MgZm9yIGhvdHBsdWcgbWVtb3J5IHJlZ2lvbnMuCisgKiBNZW1vcnkgcmVnaW9ucyBjYW4gYmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGluIHRoZSB2YXMgYXQgcnVudGltZS4KKyAqIEBybTogcmVhbCBtb2RlIChib290bWVtKSByZWdpb24KKyAqIEByMTogaG90cGx1ZyBtZW1vcnkgcmVnaW9uKHMpCisgKgorICogcHMzIGFkZHJlc3NlcworICogdmlydF9hZGRyOiBhIGNwdSAndHJhbnNsYXRlZCcgZWZmZWN0aXZlIGFkZHJlc3MKKyAqIHBoeXNfYWRkcjogYW4gYWRkcmVzcyBpbiB3aGF0IExpbnV4IHRoaW5rcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZQorICogbHBhcl9hZGRyOiBhbiBhZGRyZXNzIGluIHRoZSBIViB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKyAqIGJ1c19hZGRyOiBhbiBpbyBjb250cm9sbGVyICd0cmFuc2xhdGVkJyBhZGRyZXNzIG9uIGEgZGV2aWNlIGJ1cworICovCisKK3N0cnVjdCBtYXAgeworCXVuc2lnbmVkIGxvbmcgdG90YWw7CisJdW5zaWduZWQgbG9uZyB2YXNfaWQ7CisJdW5zaWduZWQgbG9uZyBodGFiX3NpemU7CisJc3RydWN0IG1lbV9yZWdpb24gcm07CisJc3RydWN0IG1lbV9yZWdpb24gcjE7Cit9OworCisjZGVmaW5lIGRlYnVnX2R1bXBfbWFwKHgpIF9kZWJ1Z19kdW1wX21hcCh4LCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfZGVidWdfZHVtcF9tYXAoY29uc3Qgc3RydWN0IG1hcCogbSwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJREJHKCIlczolZDogbWFwLnRvdGFsICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnRvdGFsKTsKKwlEQkcoIiVzOiVkOiBtYXAucm0uc2l6ZSAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgbS0+cm0uc2l6ZSk7CisJREJHKCIlczolZDogbWFwLnZhc19pZCAgICA9ICVsdVxuIiwgZnVuYywgbGluZSwgbS0+dmFzX2lkKTsKKwlEQkcoIiVzOiVkOiBtYXAuaHRhYl9zaXplID0gJWx4aFxuIiwgZnVuYywgbGluZSwgbS0+aHRhYl9zaXplKTsKKwlEQkcoIiVzOiVkOiBtYXAucjEuYmFzZSAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgbS0+cjEuYmFzZSk7CisJREJHKCIlczolZDogbWFwLnIxLm9mZnNldCA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnIxLm9mZnNldCk7CisJREJHKCIlczolZDogbWFwLnIxLnNpemUgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnIxLnNpemUpOworfQorCitzdGF0aWMgc3RydWN0IG1hcCBtYXA7CisKKy8qKgorICogcHMzX21tX3BoeXNfdG9fbHBhciAtIHRyYW5zbGF0ZSBhIGxpbnV4IHBoeXNpY2FsIGFkZHJlc3MgdG8gbHBhciBhZGRyZXNzCisgKiBAcGh5c19hZGRyOiBsaW51eCBwaHlzaWNhbCBhZGRyZXNzCisgKi8KKwordW5zaWduZWQgbG9uZyBwczNfbW1fcGh5c190b19scGFyKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQoreworCUJVR19PTihpc19rZXJuZWxfYWRkcihwaHlzX2FkZHIpKTsKKwlpZiAoVVNFX0xQQVJfQUREUikKKwkJcmV0dXJuIHBoeXNfYWRkcjsKKwllbHNlCisJCXJldHVybiAocGh5c19hZGRyIDwgbWFwLnJtLnNpemUgfHwgcGh5c19hZGRyID49IG1hcC50b3RhbCkKKwkJCT8gcGh5c19hZGRyIDogcGh5c19hZGRyICsgbWFwLnIxLm9mZnNldDsKK30KKworRVhQT1JUX1NZTUJPTChwczNfbW1fcGh5c190b19scGFyKTsKKworLyoqCisgKiBwczNfbW1fdmFzX2NyZWF0ZSAtIGNyZWF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlCisgKi8KKwordm9pZCBfX2luaXQgcHMzX21tX3Zhc19jcmVhdGUodW5zaWduZWQgbG9uZyogaHRhYl9zaXplKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFjY2Vzc19yaWdodDsKKwl1bnNpZ25lZCBsb25nIG1heF9wYWdlX3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJlc3VsdCA9IGx2MV9xdWVyeV9sb2dpY2FsX3BhcnRpdGlvbl9hZGRyZXNzX3JlZ2lvbl9pbmZvKDAsCisJCSZzdGFydF9hZGRyZXNzLCAmc2l6ZSwgJmFjY2Vzc19yaWdodCwgJm1heF9wYWdlX3NpemUsCisJCSZmbGFncyk7CisKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6JWQ6IGx2MV9xdWVyeV9sb2dpY2FsX3BhcnRpdGlvbl9hZGRyZXNzX3JlZ2lvbl9pbmZvICIKKwkJCSJmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlwczNfcmVzdWx0KHJlc3VsdCkpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKG1heF9wYWdlX3NpemUgPCBQQUdFX1NISUZUXzE2TSkgeworCQlEQkcoIiVzOiVkOiBiYWQgbWF4X3BhZ2Vfc2l6ZSAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQltYXhfcGFnZV9zaXplKTsKKwkJZ290byBmYWlsOworCX0KKworCUJVSUxEX0JVR19PTihDT05GSUdfUFMzX0hUQUJfU0laRSA+IEhUQUJfU0laRV9NQVgpOworCUJVSUxEX0JVR19PTihDT05GSUdfUFMzX0hUQUJfU0laRSA8IEhUQUJfU0laRV9NSU4pOworCisJcmVzdWx0ID0gbHYxX2NvbnN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UoQ09ORklHX1BTM19IVEFCX1NJWkUsCisJCQkyLCBtYWtlX3BhZ2Vfc2l6ZXMoUEFHRV9TSElGVF8xNk0sIFBBR0VfU0hJRlRfNjRLKSwKKwkJCSZtYXAudmFzX2lkLCAmbWFwLmh0YWJfc2l6ZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6JWQ6IGx2MV9jb25zdHJ1Y3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXN1bHQgPSBsdjFfc2VsZWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZShtYXAudmFzX2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJREJHKCIlczolZDogbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJZ290byBmYWlsOworCX0KKworCSpodGFiX3NpemUgPSBtYXAuaHRhYl9zaXplOworCisJZGVidWdfZHVtcF9tYXAoJm1hcCk7CisKKwlyZXR1cm47CisKK2ZhaWw6CisJcGFuaWMoInBzM19tbV92YXNfY3JlYXRlIGZhaWxlZCIpOworfQorCisvKioKKyAqIHBzM19tbV92YXNfZGVzdHJveSAtCisgKi8KKwordm9pZCBwczNfbW1fdmFzX2Rlc3Ryb3kodm9pZCkKK3sKKwlpZiAobWFwLnZhc19pZCkgeworCQlsdjFfc2VsZWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSgwKTsKKwkJbHYxX2Rlc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZShtYXAudmFzX2lkKTsKKwkJbWFwLnZhc19pZCA9IDA7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogbWVtb3J5IGhvdHBsdWcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogcHMzX21tX3JlZ2lvbl9jcmVhdGUgLSBjcmVhdGUgYSBtZW1vcnkgcmVnaW9uIGluIHRoZSB2YXMKKyAqIEByOiBwb2ludGVyIHRvIGEgc3RydWN0IG1lbV9yZWdpb24gdG8gYWNjZXB0IGluaXRpYWxpemVkIHZhbHVlcworICogQHNpemU6IHJlcXVlc3RlZCByZWdpb24gc2l6ZQorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gY3JlYXRlcyB0aGUgcmVnaW9uIHdpdGggdGhlIHZhcyBsYXJnZSBwYWdlIHNpemUuCisgKiBAc2l6ZSBpcyByb3VuZGVkIGRvd24gdG8gYSBtdWx0aXBsZSBvZiB0aGUgdmFzIGxhcmdlIHBhZ2Ugc2l6ZS4KKyAqLworCitpbnQgcHMzX21tX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG1lbV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgbXVpZDsKKworCXItPnNpemUgPSBfQUxJR05fRE9XTihzaXplLCAxIDw8IFBBR0VfU0hJRlRfMTZNKTsKKworCURCRygiJXM6JWQgcmVxdWVzdGVkICAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHNpemUpOworCURCRygiJXM6JWQgYWN0dWFsICAgICAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHItPnNpemUpOworCURCRygiJXM6JWQgZGlmZmVyZW5jZSAlbHhoICglbHVNQilcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpKHNpemUgLSByLT5zaXplKSwKKwkJKHNpemUgLSByLT5zaXplKSAvIDEwMjQgLyAxMDI0KTsKKworCWlmIChyLT5zaXplID09IDApIHsKKwkJREJHKCIlczolZDogc2l6ZSA9PSAwXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXN1bHQgPSAtMTsKKwkJZ290byB6ZXJvX3JlZ2lvbjsKKwl9CisKKwlyZXN1bHQgPSBsdjFfYWxsb2NhdGVfbWVtb3J5KHItPnNpemUsIFBBR0VfU0hJRlRfMTZNLCAwLAorCQlBTExPQ0FURV9NRU1PUllfVFJZX0FMVF9VTklULCAmci0+YmFzZSwgJm11aWQpOworCisJaWYgKHJlc3VsdCB8fCByLT5iYXNlIDwgbWFwLnJtLnNpemUpIHsKKwkJREJHKCIlczolZDogbHYxX2FsbG9jYXRlX21lbW9yeSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlnb3RvIHplcm9fcmVnaW9uOworCX0KKworCXItPm9mZnNldCA9IHItPmJhc2UgLSBtYXAucm0uc2l6ZTsKKwlyZXR1cm4gcmVzdWx0OworCit6ZXJvX3JlZ2lvbjoKKwlyLT5zaXplID0gci0+YmFzZSA9IHItPm9mZnNldCA9IDA7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfbW1fcmVnaW9uX2Rlc3Ryb3kgLSBkZXN0cm95IGEgbWVtb3J5IHJlZ2lvbgorICogQHI6IHBvaW50ZXIgdG8gc3RydWN0IG1lbV9yZWdpb24KKyAqLworCit2b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKK3sKKwlpZiAoci0+YmFzZSkgeworCQlsdjFfcmVsZWFzZV9tZW1vcnkoci0+YmFzZSk7CisJCXItPnNpemUgPSByLT5iYXNlID0gci0+b2Zmc2V0ID0gMDsKKwkJbWFwLnRvdGFsID0gbWFwLnJtLnNpemU7CisJfQorfQorCisvKioKKyAqIHBzM19tbV9hZGRfbWVtb3J5IC0gaG90IGFkZCBtZW1vcnkKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwczNfbW1fYWRkX21lbW9yeSh2b2lkKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCisJCXJldHVybiAwOworCisJQlVHX09OKCFtZW1faW5pdF9kb25lKTsKKworCXN0YXJ0X2FkZHIgPSBVU0VfTFBBUl9BRERSID8gbWFwLnIxLmJhc2UgOiBtYXAucm0uc2l6ZTsKKwlzdGFydF9wZm4gPSBzdGFydF9hZGRyID4+IFBBR0VfU0hJRlQ7CisJbnJfcGFnZXMgPSAobWFwLnIxLnNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCisJREJHKCIlczolZDogc3RhcnRfYWRkciAlbHhoLCBzdGFydF9wZm4gJWx4aCwgbnJfcGFnZXMgJWx4aFxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBzdGFydF9hZGRyLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKworCXJlc3VsdCA9IGFkZF9tZW1vcnkoMCwgc3RhcnRfYWRkciwgbWFwLnIxLnNpemUpOworCisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBhZGRfbWVtb3J5IGZhaWxlZDogKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXN1bHQgPSBvbmxpbmVfcGFnZXMoc3RhcnRfcGZuLCBucl9wYWdlcyk7CisKKwlpZiAocmVzdWx0KQorCQlEQkcoIiVzOiVkOiBvbmxpbmVfcGFnZXMgZmFpbGVkOiAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworY29yZV9pbml0Y2FsbChwczNfbW1fYWRkX21lbW9yeSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBkbWEgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgKiBkbWFfbHBhcl90b19idXMgLSBUcmFuc2xhdGUgYW4gbHBhciBhZGRyZXNzIHRvIGlvYyBtYXBwZWQgYnVzIGFkZHJlc3MuCisgKiBAcjogcG9pbnRlciB0byBkbWEgcmVnaW9uIHN0cnVjdHVyZQorICogQGxwYXJfYWRkcjogSFYgbHBhciBhZGRyZXNzCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX2xwYXJfdG9fYnVzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcikKK3sKKwlCVUdfT04obHBhcl9hZGRyID49IG1hcC5yMS5iYXNlICsgbWFwLnIxLnNpemUpOworCXJldHVybiByLT5idXNfYWRkciArIChscGFyX2FkZHIgPD0gbWFwLnJtLnNpemUgPyBscGFyX2FkZHIKKwkJOiBscGFyX2FkZHIgLSBtYXAucjEub2Zmc2V0KTsKK30KKworI2RlZmluZSBkbWFfZHVtcF9yZWdpb24oX2EpIF9kbWFfZHVtcF9yZWdpb24oX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kbWFfZHVtcF9yZWdpb24oY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCBjb25zdCBjaGFyKiBmdW5jLAorCWludCBsaW5lKQoreworCURCRygiJXM6JWQ6IGRldiAgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsIHItPmRpZC5idXNfaWQsCisJCXItPmRpZC5kZXZfaWQpOworCURCRygiJXM6JWQ6IHBhZ2Vfc2l6ZSAgJXVcbiIsIGZ1bmMsIGxpbmUsIHItPnBhZ2Vfc2l6ZSk7CisJREJHKCIlczolZDogYnVzX2FkZHIgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5idXNfYWRkcik7CisJREJHKCIlczolZDogbGVuICAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5sZW4pOworfQorCisvKioKKyAqIGRtYV9jaHVuayAtIEEgY2h1bmsgb2YgZG1hIHBhZ2VzIG1hcHBlZCBieSB0aGUgaW8gY29udHJvbGxlci4KKyAqIEByZWdpb24gLSBUaGUgZG1hIHJlZ2lvbiB0aGF0IG93bnMgdGhpcyBjaHVuay4KKyAqIEBscGFyX2FkZHI6IFN0YXJ0aW5nIGxwYXIgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCisgKiBAYnVzX2FkZHI6IFN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCisgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGxpbms6IEEgc3RydWN0IGxpc3RfaGVhZCB1c2VkIHdpdGggc3RydWN0IHBzM19kbWFfcmVnaW9uLmNodW5rX2xpc3QsIHRoZQorICogbGlzdCBvZiBhbGwgY2h1bmNrcyBvd25lZCBieSB0aGUgcmVnaW9uLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhIHZlcnkgc2ltcGxlIGRtYSBwYWdlIG1hbmFnZXIKKyAqIGJhc2VkIG9uIHRoZSBkbWFfY2h1bmsgc3RydWN0dXJlLiAgVGhpcyBzY2hlbWUgYXNzdW1lcworICogdGhhdCBhbGwgZHJpdmVycyB1c2UgdmVyeSB3ZWxsIGJlaGF2ZWQgZG1hIG9wcy4KKyAqLworCitzdHJ1Y3QgZG1hX2NodW5rIHsKKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnJlZ2lvbjsKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwl1bnNpZ25lZCBpbnQgdXNhZ2VfY291bnQ7Cit9OworCisjZGVmaW5lIGRtYV9kdW1wX2NodW5rKF9hKSBfZG1hX2R1bXBfY2h1bmsoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kbWFfZHVtcF9jaHVuayAoY29uc3Qgc3RydWN0IGRtYV9jaHVuayogYywgY29uc3QgY2hhciogZnVuYywKKwlpbnQgbGluZSkKK3sKKwlEQkcoIiVzOiVkOiByLmRldiAgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsCisJCWMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwgYy0+cmVnaW9uLT5kaWQuZGV2X2lkKTsKKwlEQkcoIiVzOiVkOiByLmJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5idXNfYWRkcik7CisJREJHKCIlczolZDogci5wYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPnBhZ2Vfc2l6ZSk7CisJREJHKCIlczolZDogci5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+bGVuKTsKKwlEQkcoIiVzOiVkOiBjLmxwYXJfYWRkciAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+bHBhcl9hZGRyKTsKKwlEQkcoIiVzOiVkOiBjLmJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+YnVzX2FkZHIpOworCURCRygiJXM6JWQ6IGMubGVuICAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5sZW4pOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9jaHVuayAqIGRtYV9maW5kX2NodW5rKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9idXMgPSBfQUxJR05fRE9XTihidXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJLyogaW50ZXJzZWN0aW9uICovCisJCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkcgorCQkJJiYgYWxpZ25lZF9idXMgPCBjLT5idXNfYWRkciArIGMtPmxlbgorCQkJJiYgYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkciArIGMtPmxlbikgeworCQkJcmV0dXJuIGM7CisJCX0KKwkJLyogYmVsb3cgKi8KKwkJaWYgKGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGFib3ZlICovCisJCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkciArIGMtPmxlbikgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiB3ZSBkb24ndCBoYW5kbGUgdGhlIG11bHRpLWNodW5rIGNhc2UgZm9yIG5vdyAqLworCisJCWRtYV9kdW1wX2NodW5rKGMpOworCQlCVUcoKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2ZyZWVfY2h1bmsoc3RydWN0IGRtYV9jaHVuayAqYykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChjLT5idXNfYWRkcikgeworCQlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX2RtYV9yZWdpb24oYy0+cmVnaW9uLT5kaWQuYnVzX2lkLAorCQkJYy0+cmVnaW9uLT5kaWQuZGV2X2lkLCBjLT5idXNfYWRkciwgYy0+bGVuKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQorCisJa2ZyZWUoYyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBkbWFfbWFwX3BhZ2VzIC0gTWFwcyBkbWEgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBidXMgYWRkcmVzcyBzcGFjZS4KKyAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgorICogQHBoeXNfYWRkcjogU3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCisgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogY19vdXQ6IEEgcG9pbnRlciB0byByZWNlaXZlIGFuIGFsbG9jYXRlZCBzdHJ1Y3QgZG1hX2NodW5rIGZvciB0aGlzIGFyZWEuCisgKgorICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIGRtYSBtYXBwaW5nIHJvdXRpbmUsIGFuZCBpcyB0aGUgb25lIHRoYXQgd2lsbAorICogbWFrZSB0aGUgSFYgY2FsbCB0byBhZGQgdGhlIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYWRkcmVzcyBzcGFjZS4KKyAqLworCitzdGF0aWMgaW50IGRtYV9tYXBfcGFnZXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IGRtYV9jaHVuayAqKmNfb3V0KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRtYV9jaHVuayAqYzsKKworCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX2NodW5rKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWMpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCWMtPnJlZ2lvbiA9IHI7CisJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOworCWMtPmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIGMtPmxwYXJfYWRkcik7CisJYy0+bGVuID0gbGVuOworCisJcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRpZC5idXNfaWQsCisJCWMtPnJlZ2lvbi0+ZGlkLmRldl9pZCwgYy0+bHBhcl9hZGRyLCBjLT5idXNfYWRkciwgYy0+bGVuLAorCQkweGY4MDAwMDAwMDAwMDAwMDBVTCk7CisKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJZ290byBmYWlsX21hcDsKKwl9CisKKwlsaXN0X2FkZCgmYy0+bGluaywgJnItPmNodW5rX2xpc3QuaGVhZCk7CisKKwkqY19vdXQgPSBjOworCXJldHVybiAwOworCitmYWlsX21hcDoKKwlrZnJlZShjKTsKK2ZhaWxfYWxsb2M6CisJKmNfb3V0ID0gTlVMTDsKKwlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGRtYV9yZWdpb25fY3JlYXRlIC0gQ3JlYXRlIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgZG1hIHJlZ2lvbiBjcmVhdGUgcm91dGluZSwgYW5kIGlzIHRoZSBvbmUgdGhhdAorICogd2lsbCBtYWtlIHRoZSBIViBjYWxsIHRvIGNyZWF0ZSB0aGUgcmVnaW9uLgorICovCisKK3N0YXRpYyBpbnQgZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uKiByKQoreworCWludCByZXN1bHQ7CisKKwlyLT5sZW4gPSBfQUxJR05fVVAobWFwLnRvdGFsLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnItPmNodW5rX2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJnItPmNodW5rX2xpc3QubG9jayk7CisKKwlyZXN1bHQgPSBsdjFfYWxsb2NhdGVfZGV2aWNlX2RtYV9yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwkJci0+bGVuLCByLT5wYWdlX3NpemUsIHItPnJlZ2lvbl90eXBlLCAmci0+YnVzX2FkZHIpOworCisJZG1hX2R1bXBfcmVnaW9uKHIpOworCisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfYWxsb2NhdGVfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJci0+bGVuID0gci0+YnVzX2FkZHIgPSAwOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZG1hX3JlZ2lvbl9mcmVlIC0gRnJlZSBhIGRldmljZSBkbWEgcmVnaW9uLgorICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCisgKgorICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIGRtYSByZWdpb24gZnJlZSByb3V0aW5lLCBhbmQgaXMgdGhlIG9uZSB0aGF0CisgKiB3aWxsIG1ha2UgdGhlIEhWIGNhbGwgdG8gZnJlZSB0aGUgcmVnaW9uLgorICovCisKK3N0YXRpYyBpbnQgZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiogcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisJc3RydWN0IGRtYV9jaHVuayAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIHRtcCwgJnItPmNodW5rX2xpc3QuaGVhZCwgbGluaykgeworCQlsaXN0X2RlbCgmYy0+bGluayk7CisJCWRtYV9mcmVlX2NodW5rKGMpOworCX0KKworCXJlc3VsdCA9IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJCXItPmJ1c19hZGRyKTsKKworCWlmIChyZXN1bHQpCisJCURCRygiJXM6JWQ6IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisKKwlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGRtYV9tYXBfYXJlYSAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqIEB2aXJ0X2FkZHI6IFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCisgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGJ1c19hZGRyOiBBIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8KKyAqIG1hcC4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb21tb24gZG1hIG1hcHBpbmcgcm91dGluZS4KKyAqLworCitzdGF0aWMgaW50IGRtYV9tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYV9jaHVuayAqYzsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKKwkJOiB2aXJ0X2FkZHI7CisKKwkqYnVzX2FkZHIgPSBkbWFfbHBhcl90b19idXMociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpKTsKKworCWlmICghVVNFX0RZTkFNSUNfRE1BKSB7CisJCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOworCQlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJREJHKCIlczolZCB2aXJ0X2FkZHIgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJdmlydF9hZGRyKTsKKwkJREJHKCIlczolZCBwaHlzX2FkZHIgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcGh5c19hZGRyKTsKKwkJREJHKCIlczolZCBscGFyX2FkZHIgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJbHBhcl9hZGRyKTsKKwkJREJHKCIlczolZCBsZW4gICAgICAgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBsZW4pOworCQlEQkcoIiVzOiVkIGJ1c19hZGRyICAlbHhoICglbHhoKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkqYnVzX2FkZHIsIGxlbik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCWMgPSBkbWFfZmluZF9jaHVuayhyLCAqYnVzX2FkZHIsIGxlbik7CisKKwlpZiAoYykgeworCQljLT51c2FnZV9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzdWx0ID0gZG1hX21hcF9wYWdlcyhyLCBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKSwKKwkJX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpLCAmYyk7CisKKwlpZiAocmVzdWx0KSB7CisJCSpidXNfYWRkciA9IDA7CisJCURCRygiJXM6JWQ6IGRtYV9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWMtPnVzYWdlX2NvdW50ID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZG1hX3VubWFwX2FyZWEgLSBVbm1hcCBhbiBhcmVhIG9mIG1lbW9yeSBmcm9tIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqIEBidXNfYWRkcjogVGhlIHN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KKyAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb21tb24gZG1hIHVubWFwIHJvdXRpbmUuCisgKi8KKworaW50IGRtYV91bm1hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJYyA9IGRtYV9maW5kX2NodW5rKHIsIGJ1c19hZGRyLCBsZW4pOworCisJaWYgKCFjKSB7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9idXMgPSBfQUxJR05fRE9XTihidXNfYWRkciwKKwkJCTEgPDwgci0+cGFnZV9zaXplKTsKKwkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGxlbik7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYWxpZ25lZF9idXMgJWx4aFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgYWxpZ25lZF9idXMpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGFsaWduZWRfbGVuICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGFsaWduZWRfbGVuKTsKKwkJQlVHKCk7CisJfQorCisJYy0+dXNhZ2VfY291bnQtLTsKKworCWlmICghYy0+dXNhZ2VfY291bnQpIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIgLSBTZXR1cCBhIGxpbmVhciBkbWEgbWFwaW5nIGZvciBhIGRldmljZS4KKyAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgorICoKKyAqIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuIEhWIGRtYSByZWdpb24gZm9yIHRoZSBkZXZpY2UgYW5kIG1hcHMgYWxsIGF2YWlsYWJsZQorICogcmFtIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCisgKi8KKworc3RhdGljIGludCBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkvKiBmb3JjZSAxNk0gZG1hIHBhZ2VzIGZvciBsaW5lYXIgbWFwcGluZyAqLworCisJaWYgKHItPnBhZ2Vfc2l6ZSAhPSBQUzNfRE1BXzE2TSkgeworCQlwcl9pbmZvKCIlczolZDogZm9yY2luZyAxNk0gcGFnZXMgZm9yIGxpbmVhciBtYXBcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyLT5wYWdlX3NpemUgPSBQUzNfRE1BXzE2TTsKKwl9CisKKwlyZXN1bHQgPSBkbWFfcmVnaW9uX2NyZWF0ZShyKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IGRtYV9tYXBfYXJlYShyLCBtYXAucm0uYmFzZSwgbWFwLnJtLnNpemUsICZ0bXApOworCUJVR19PTihyZXN1bHQpOworCisJaWYgKFVTRV9MUEFSX0FERFIpCisJCXJlc3VsdCA9IGRtYV9tYXBfYXJlYShyLCBtYXAucjEuYmFzZSwgbWFwLnIxLnNpemUsCisJCQkmdG1wKTsKKwllbHNlCisJCXJlc3VsdCA9IGRtYV9tYXBfYXJlYShyLCBtYXAucm0uc2l6ZSwgbWFwLnIxLnNpemUsCisJCQkmdG1wKTsKKworCUJVR19PTihyZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCB1bm1hcCBhbGwgbWFwcGVkIGFyZWFzIGFuZCBmcmVlIHRoZSBIViBkbWEgcmVnaW9uLgorICovCisKK3N0YXRpYyBpbnQgZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGRtYV91bm1hcF9hcmVhKHIsIGRtYV9scGFyX3RvX2J1cyhyLCAwKSwgbWFwLnJtLnNpemUpOworCUJVR19PTihyZXN1bHQpOworCisJcmVzdWx0ID0gZG1hX3VubWFwX2FyZWEociwgZG1hX2xwYXJfdG9fYnVzKHIsIG1hcC5yMS5iYXNlKSwKKwkJbWFwLnIxLnNpemUpOworCUJVR19PTihyZXN1bHQpOworCisJcmVzdWx0ID0gZG1hX3JlZ2lvbl9mcmVlKHIpOworCUJVR19PTihyZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBkbWFfbWFwX2FyZWFfbGluZWFyIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgorICogQHZpcnRfYWRkcjogU3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIG1hcC4KKyAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byBtYXAuCisgKiBAYnVzX2FkZHI6IEEgcG9pbnRlciB0byByZXR1cm4gdGhlIHN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0bworICogbWFwLgorICoKKyAqIFRoaXMgcm91dGluZSBqdXN0IHJldHVybnMgdGhlIGNvcmVzcG9uZGluZyBidXMgYWRkcmVzcy4gIEFjdHVhbCBtYXBwaW5nCisgKiBvY2N1cnMgaW4gZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKCkuCisgKi8KKworc3RhdGljIGludCBkbWFfbWFwX2FyZWFfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gaXNfa2VybmVsX2FkZHIodmlydF9hZGRyKSA/IF9fcGEodmlydF9hZGRyKQorCQk6IHZpcnRfYWRkcjsKKwkqYnVzX2FkZHIgPSBkbWFfbHBhcl90b19idXMociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkbWFfdW5tYXBfYXJlYV9saW5lYXIgLSBVbm1hcCBhbiBhcmVhIG9mIG1lbW9yeSBmcm9tIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqIEBidXNfYWRkcjogVGhlIHN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KKyAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBub3RoaW5nLiAgVW5tYXBwaW5nIG9jY3VycyBpbiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyKCkuCisgKi8KKworc3RhdGljIGludCBkbWFfdW5tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXJldHVybiAwOworfQorCitpbnQgcHMzX2RtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkKKwkJPyBkbWFfcmVnaW9uX2NyZWF0ZShyKQorCQk6IGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcihyKTsKK30KKworaW50IHBzM19kbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQoreworCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQorCQk/IGRtYV9yZWdpb25fZnJlZShyKQorCQk6IGRtYV9yZWdpb25fZnJlZV9saW5lYXIocik7Cit9CisKK2ludCBwczNfZG1hX21hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3sKKwlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkKKwkJPyBkbWFfbWFwX2FyZWEociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyKQorCQk6IGRtYV9tYXBfYXJlYV9saW5lYXIociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyKTsKK30KKworaW50IHBzM19kbWFfdW5tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuKQoreworCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKSA/IGRtYV91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pCisJCTogZG1hX3VubWFwX2FyZWFfbGluZWFyKHIsIGJ1c19hZGRyLCBsZW4pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogc3lzdGVtIHN0YXJ0dXAgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogcHMzX21tX2luaXQgLSBpbml0aWFsaXplIHRoZSBhZGRyZXNzIHNwYWNlIHN0YXRlIHZhcmlhYmxlcworICovCisKK3ZvaWQgX19pbml0IHBzM19tbV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9tbV9pbmZvKCZtYXAucm0uYmFzZSwgJm1hcC5ybS5zaXplLAorCQkmbWFwLnRvdGFsKTsKKworCWlmIChyZXN1bHQpCisJCXBhbmljKCJwczNfcmVwb3NpdG9yeV9yZWFkX21tX2luZm8oKSBmYWlsZWQiKTsKKworCW1hcC5ybS5vZmZzZXQgPSBtYXAucm0uYmFzZTsKKwltYXAudmFzX2lkID0gbWFwLmh0YWJfc2l6ZSA9IDA7CisKKwkvKiB0aGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgbWFwLnJtLmJhc2UgaXMgemVybyAqLworCisJQlVHX09OKG1hcC5ybS5iYXNlKTsKKwlCVUdfT04oIW1hcC5ybS5zaXplKTsKKworCWxtYl9hZGQobWFwLnJtLmJhc2UsIG1hcC5ybS5zaXplKTsKKwlsbWJfYW5hbHl6ZSgpOworCisJLyogYXJyYW5nZSB0byBkbyB0aGlzIGluIHBzM19tbV9hZGRfbWVtb3J5ICovCisJcHMzX21tX3JlZ2lvbl9jcmVhdGUoJm1hcC5yMSwgbWFwLnRvdGFsIC0gbWFwLnJtLnNpemUpOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cit9CisKKy8qKgorICogcHMzX21tX3NodXRkb3duIC0gZmluYWwgY2xlYW51cCBvZiBhZGRyZXNzIHNwYWNlCisgKi8KKwordm9pZCBwczNfbW1fc2h1dGRvd24odm9pZCkKK3sKKwlwczNfbW1fcmVnaW9uX2Rlc3Ryb3koJm1hcC5yMSk7CisJbWFwLnRvdGFsID0gbWFwLnJtLnNpemU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzNTgzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqICBQUzMgJ090aGVyIE9TJyBhcmVhIGRhdGEuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9sbWIuaD4KKyNpbmNsdWRlIDxhc20vcHMzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCitlbnVtIHsKKwlPU19BUkVBX1NFR01FTlRfU0laRSA9IDBYMjAwLAorfTsKKworZW51bSB7CisJSEVBREVSX0xEUl9GT1JNQVRfUkFXID0gMCwKKwlIRUFERVJfTERSX0ZPUk1BVF9HWklQID0gMSwKK307CisKKy8qKgorICogc3RydWN0IG9zX2FyZWFfaGVhZGVyIC0gb3MgYXJlYSBoZWFkZXIgc2VnbWVudC4KKyAqIEBtYWdpY19udW06IEFsd2F5cyAnY2VsbF9leHRfb3NfYXJlYScuCisgKiBAaGRyX3ZlcnNpb246IEhlYWRlciBmb3JtYXQgdmVyc2lvbiBudW1iZXIuCisgKiBAb3NfYXJlYV9vZmZzZXQ6IFN0YXJ0aW5nIHNlZ21lbnQgbnVtYmVyIG9mIG9zIGltYWdlIGFyZWEuCisgKiBAbGRyX2FyZWFfb2Zmc2V0OiBTdGFydGluZyBzZWdtZW50IG51bWJlciBvZiBib290bG9hZGVyIGltYWdlIGFyZWEuCisgKiBAbGRyX2Zvcm1hdDogSEVBREVSX0xEUl9GT1JNQVQgZmxhZy4KKyAqIEBsZHJfc2l6ZTogU2l6ZSBvZiBib290bG9hZGVyIGltYWdlIGluIGJ5dGVzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZG9jcyByZWZlciB0byBhcmVhIG9mZnNldHMuICBUaGVzZSBhcmUgb2Zmc2V0cyBpbiB1bml0cyBvZgorICogc2VnbWVudHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG9zIGFyZWEgKHRvcCBvZiB0aGUgaGVhZGVyKS4gIFRoZXNlIGFyZQorICogYmV0dGVyIHRob3VnaHQgb2YgYXMgc2VnbWVudCBudW1iZXJzLiAgVGhlIG9zIGFyZWEgb2YgdGhlIG9zIGFyZWEgaXMKKyAqIHJlc2VydmVkIGZvciB0aGUgb3MgaW1hZ2UuCisgKi8KKworc3RydWN0IG9zX2FyZWFfaGVhZGVyIHsKKwlzOCBtYWdpY19udW1bMTZdOworCXUzMiBoZHJfdmVyc2lvbjsKKwl1MzIgb3NfYXJlYV9vZmZzZXQ7CisJdTMyIGxkcl9hcmVhX29mZnNldDsKKwl1MzIgX3Jlc2VydmVkXzE7CisJdTMyIGxkcl9mb3JtYXQ7CisJdTMyIGxkcl9zaXplOworCXUzMiBfcmVzZXJ2ZWRfMls2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIHsKKwlQQVJBTV9CT09UX0ZMQUdfR0FNRV9PUyA9IDAsCisJUEFSQU1fQk9PVF9GTEFHX09USEVSX09TID0gMSwKK307CisKK2VudW0geworCVBBUkFNX0FWX01VTFRJX09VVF9OVFNDID0gMCwKKwlQQVJBTV9BVl9NVUxUSV9PVVRfUEFMX1JHQiA9IDEsCisJUEFSQU1fQVZfTVVMVElfT1VUX1BBTF9ZQ0JDUiA9IDIsCisJUEFSQU1fQVZfTVVMVElfT1VUX1NFQ0FNID0gMywKK307CisKK2VudW0geworCVBBUkFNX0NUUkxfQlVUVE9OX09fSVNfWUVTID0gMCwKKwlQQVJBTV9DVFJMX0JVVFRPTl9YX0lTX1lFUyA9IDEsCit9OworCisvKioKKyAqIHN0cnVjdCBvc19hcmVhX3BhcmFtcyAtIG9zIGFyZWEgcGFyYW1zIHNlZ21lbnQuCisgKiBAYm9vdF9mbGFnOiBVc2VyIHByZWZlcmVuY2Ugb2Ygb3BlcmF0aW5nIHN5c3RlbSwgUEFSQU1fQk9PVF9GTEFHIGZsYWcuCisgKiBAbnVtX3BhcmFtczogTnVtYmVyIG9mIHBhcmFtcyBpbiB0aGlzIChwYXJhbXMpIHNlZ21lbnQuCisgKiBAcnRjX2RpZmY6IERpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIDE5NzAgYW5kIHRoZSBwczMgcnRjIHZhbHVlLgorICogQGF2X211bHRpX291dDogVXNlciBwcmVmZXJlbmNlIG9mIEFWIG91dHB1dCwgUEFSQU1fQVZfTVVMVElfT1VUIGZsYWcuCisgKiBAY3RybF9idXR0b246IFVzZXIgcHJlZmVyZW5jZSBvZiBjb250cm9sbGVyIGJ1dHRvbiBjb25maWcsIFBBUkFNX0NUUkxfQlVUVE9OCisgKglmbGFnLgorICogQHN0YXRpY19pcF9hZGRyOiBVc2VyIHByZWZlcmVuY2Ugb2Ygc3RhdGljIElQIGFkZHJlc3MuCisgKiBAbmV0d29ya19tYXNrOiBVc2VyIHByZWZlcmVuY2Ugb2Ygc3RhdGljIG5ldHdvcmsgbWFzay4KKyAqIEBkZWZhdWx0X2dhdGV3YXk6IFVzZXIgcHJlZmVyZW5jZSBvZiBzdGF0aWMgZGVmYXVsdCBnYXRld2F5LgorICogQGRuc19wcmltYXJ5OiBVc2VyIHByZWZlcmVuY2Ugb2Ygc3RhdGljIHByaW1hcnkgZG5zIHNlcnZlci4KKyAqIEBkbnNfc2Vjb25kYXJ5OiBVc2VyIHByZWZlcmVuY2Ugb2Ygc3RhdGljIHNlY29uZGFyeSBkbnMgc2VydmVyLgorICoKKyAqIFVzZXIgcHJlZmVyZW5jZSBvZiB6ZXJvIGZvciBzdGF0aWNfaXBfYWRkciBtZWFucyB1c2UgZGhjcC4KKyAqLworCitzdHJ1Y3Qgb3NfYXJlYV9wYXJhbXMgeworCXUzMiBib290X2ZsYWc7CisJdTMyIF9yZXNlcnZlZF8xWzNdOworCXUzMiBudW1fcGFyYW1zOworCXUzMiBfcmVzZXJ2ZWRfMlszXTsKKwkvKiBwYXJhbSAwICovCisJczY0IHJ0Y19kaWZmOworCXU4IGF2X211bHRpX291dDsKKwl1OCBjdHJsX2J1dHRvbjsKKwl1OCBfcmVzZXJ2ZWRfM1s2XTsKKwkvKiBwYXJhbSAxICovCisJdTggc3RhdGljX2lwX2FkZHJbNF07CisJdTggbmV0d29ya19tYXNrWzRdOworCXU4IGRlZmF1bHRfZ2F0ZXdheVs0XTsKKwl1OCBfcmVzZXJ2ZWRfNFs0XTsKKwkvKiBwYXJhbSAyICovCisJdTggZG5zX3ByaW1hcnlbNF07CisJdTggZG5zX3NlY29uZGFyeVs0XTsKKwl1OCBfcmVzZXJ2ZWRfNVs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCBzYXZlZF9wYXJhbXMgLSBTdGF0aWMgd29ya2luZyBjb3BpZXMgb2YgZGF0YSBmcm9tIHRoZSAnT3RoZXIgT1MnIGFyZWEuCisgKgorICogRm9yIHRoZSBjb252aW5pZW5jZSBvZiB0aGUgZ3Vlc3QsIHRoZSBIViBtYWtlcyBhIGNvcHkgb2YgdGhlICdPdGhlciBPUycgYXJlYQorICogaW4gZmxhc2ggdG8gYSBoaWdoIGFkZHJlc3MgaW4gdGhlIGJvb3QgbWVtb3J5IHJlZ2lvbiBhbmQgdGhlbiBwdXRzIHRoYXQgUkFNCisgKiBhZGRyZXNzIGFuZCB0aGUgYnl0ZSBjb3VudCBpbnRvIHRoZSByZXBvc2l0b3J5IGZvciByZXRyZXZhbCBieSB0aGUgZ3Vlc3QuCisgKiBXZSBjb3B5IHRoZSBkYXRhIHdlIHdhbnQgaW50byBhIHN0YXRpYyB2YXJpYWJsZSBhbmQgYWxsb3cgdGhlIG1lbW9yeSBzZXR1cAorICogYnkgdGhlIEhWIHRvIGJlIGNsYWltZWQgYnkgdGhlIGxtYiBtYW5hZ2VyLgorICovCisKK3N0cnVjdCBzYXZlZF9wYXJhbXMgeworCS8qIHBhcmFtIDAgKi8KKwlzNjQgcnRjX2RpZmY7CisJdW5zaWduZWQgaW50IGF2X211bHRpX291dDsKKwl1bnNpZ25lZCBpbnQgY3RybF9idXR0b247CisJLyogcGFyYW0gMSAqLworCXU4IHN0YXRpY19pcF9hZGRyWzRdOworCXU4IG5ldHdvcmtfbWFza1s0XTsKKwl1OCBkZWZhdWx0X2dhdGV3YXlbNF07CisJLyogcGFyYW0gMiAqLworCXU4IGRuc19wcmltYXJ5WzRdOworCXU4IGRuc19zZWNvbmRhcnlbNF07Cit9IHN0YXRpYyBzYXZlZF9wYXJhbXM7CisKKyNkZWZpbmUgZHVtcF9oZWFkZXIoX2EpIF9kdW1wX2hlYWRlcihfYSwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfaGVhZGVyKGNvbnN0IHN0cnVjdCBvc19hcmVhX2hlYWRlciBfX2lvbWVtICpoLCBjb25zdCBjaGFyKiBmdW5jLAorCWludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogaC5tYWdpY19udW06ICAgICAgICAgJyVzJ1xuIiwgZnVuYywgbGluZSwKKwkJaC0+bWFnaWNfbnVtKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGguaGRyX3ZlcnNpb246ICAgICAgICV1XG4iLCBmdW5jLCBsaW5lLAorCQloLT5oZHJfdmVyc2lvbik7CisJcHJfZGVidWcoIiVzOiVkOiBoLm9zX2FyZWFfb2Zmc2V0OiAgICV1XG4iLCBmdW5jLCBsaW5lLAorCQloLT5vc19hcmVhX29mZnNldCk7CisJcHJfZGVidWcoIiVzOiVkOiBoLmxkcl9hcmVhX29mZnNldDogJXVcbiIsIGZ1bmMsIGxpbmUsCisJCWgtPmxkcl9hcmVhX29mZnNldCk7CisJcHJfZGVidWcoIiVzOiVkOiBoLmxkcl9mb3JtYXQ6ICAgICAgICAldVxuIiwgZnVuYywgbGluZSwKKwkJaC0+bGRyX2Zvcm1hdCk7CisJcHJfZGVidWcoIiVzOiVkOiBoLmxkcl9zaXplOiAgICAgICAgICAleGhcbiIsIGZ1bmMsIGxpbmUsCisJCWgtPmxkcl9zaXplKTsKK30KKworI2RlZmluZSBkdW1wX3BhcmFtcyhfYSkgX2R1bXBfcGFyYW1zKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfZHVtcF9wYXJhbXMoY29uc3Qgc3RydWN0IG9zX2FyZWFfcGFyYW1zIF9faW9tZW0gKnAsIGNvbnN0IGNoYXIqIGZ1bmMsCisJaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiBwLmJvb3RfZmxhZzogICAgICAgJXVcbiIsIGZ1bmMsIGxpbmUsIHAtPmJvb3RfZmxhZyk7CisJcHJfZGVidWcoIiVzOiVkOiBwLm51bV9wYXJhbXM6ICAgICAgJXVcbiIsIGZ1bmMsIGxpbmUsIHAtPm51bV9wYXJhbXMpOworCXByX2RlYnVnKCIlczolZDogcC5ydGNfZGlmZiAgICAgICAgICVsZFxuIiwgZnVuYywgbGluZSwgcC0+cnRjX2RpZmYpOworCXByX2RlYnVnKCIlczolZDogcC5hdl9tdWx0aV9vdXQgICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5hdl9tdWx0aV9vdXQpOworCXByX2RlYnVnKCIlczolZDogcC5jdHJsX2J1dHRvbjogICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5jdHJsX2J1dHRvbik7CisJcHJfZGVidWcoIiVzOiVkOiBwLnN0YXRpY19pcF9hZGRyOiAgJXUuJXUuJXUuJXVcbiIsIGZ1bmMsIGxpbmUsCisJCXAtPnN0YXRpY19pcF9hZGRyWzBdLCBwLT5zdGF0aWNfaXBfYWRkclsxXSwKKwkJcC0+c3RhdGljX2lwX2FkZHJbMl0sIHAtPnN0YXRpY19pcF9hZGRyWzNdKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAubmV0d29ya19tYXNrOiAgICAldS4ldS4ldS4ldVxuIiwgZnVuYywgbGluZSwKKwkJcC0+bmV0d29ya19tYXNrWzBdLCBwLT5uZXR3b3JrX21hc2tbMV0sCisJCXAtPm5ldHdvcmtfbWFza1syXSwgcC0+bmV0d29ya19tYXNrWzNdKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAuZGVmYXVsdF9nYXRld2F5OiAldS4ldS4ldS4ldVxuIiwgZnVuYywgbGluZSwKKwkJcC0+ZGVmYXVsdF9nYXRld2F5WzBdLCBwLT5kZWZhdWx0X2dhdGV3YXlbMV0sCisJCXAtPmRlZmF1bHRfZ2F0ZXdheVsyXSwgcC0+ZGVmYXVsdF9nYXRld2F5WzNdKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAuZG5zX3ByaW1hcnk6ICAgICAldS4ldS4ldS4ldVxuIiwgZnVuYywgbGluZSwKKwkJcC0+ZG5zX3ByaW1hcnlbMF0sIHAtPmRuc19wcmltYXJ5WzFdLAorCQlwLT5kbnNfcHJpbWFyeVsyXSwgcC0+ZG5zX3ByaW1hcnlbM10pOworCXByX2RlYnVnKCIlczolZDogcC5kbnNfc2Vjb25kYXJ5OiAgICV1LiV1LiV1LiV1XG4iLCBmdW5jLCBsaW5lLAorCQlwLT5kbnNfc2Vjb25kYXJ5WzBdLCBwLT5kbnNfc2Vjb25kYXJ5WzFdLAorCQlwLT5kbnNfc2Vjb25kYXJ5WzJdLCBwLT5kbnNfc2Vjb25kYXJ5WzNdKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdmVyaWZ5X2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgKmhlYWRlcikKK3sKKwlpZiAobWVtY21wKGhlYWRlci0+bWFnaWNfbnVtLCAiY2VsbF9leHRfb3NfYXJlYSIsIDE2KSkgeworCQlwcl9kZWJ1ZygiJXM6JWQgbWFnaWNfbnVtIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZWFkZXItPmhkcl92ZXJzaW9uIDwgMSkgeworCQlwcl9kZWJ1ZygiJXM6JWQgaGRyX3ZlcnNpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhlYWRlci0+b3NfYXJlYV9vZmZzZXQgPiBoZWFkZXItPmxkcl9hcmVhX29mZnNldCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgb2Zmc2V0cyBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBwczNfb3NfYXJlYV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgbHBhcl9hZGRyOworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCBvc19hcmVhX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBvc19hcmVhX3BhcmFtcyAqcGFyYW1zOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9pbmZvKCZscGFyX2FkZHIsICZzaXplKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfaW5mbyBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWhlYWRlciA9IChzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgKilfX3ZhKGxwYXJfYWRkcik7CisJcGFyYW1zID0gKHN0cnVjdCBvc19hcmVhX3BhcmFtcyAqKV9fdmEobHBhcl9hZGRyICsgT1NfQVJFQV9TRUdNRU5UX1NJWkUpOworCisJcmVzdWx0ID0gdmVyaWZ5X2hlYWRlcihoZWFkZXIpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgdmVyaWZ5X2hlYWRlciBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWR1bXBfaGVhZGVyKGhlYWRlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCWR1bXBfaGVhZGVyKGhlYWRlcik7CisJZHVtcF9wYXJhbXMocGFyYW1zKTsKKworCXNhdmVkX3BhcmFtcy5ydGNfZGlmZiA9IHBhcmFtcy0+cnRjX2RpZmY7CisJc2F2ZWRfcGFyYW1zLmF2X211bHRpX291dCA9IHBhcmFtcy0+YXZfbXVsdGlfb3V0OworCXNhdmVkX3BhcmFtcy5jdHJsX2J1dHRvbiA9IHBhcmFtcy0+Y3RybF9idXR0b247CisJbWVtY3B5KHNhdmVkX3BhcmFtcy5zdGF0aWNfaXBfYWRkciwgcGFyYW1zLT5zdGF0aWNfaXBfYWRkciwgNCk7CisJbWVtY3B5KHNhdmVkX3BhcmFtcy5uZXR3b3JrX21hc2ssIHBhcmFtcy0+bmV0d29ya19tYXNrLCA0KTsKKwltZW1jcHkoc2F2ZWRfcGFyYW1zLmRlZmF1bHRfZ2F0ZXdheSwgcGFyYW1zLT5kZWZhdWx0X2dhdGV3YXksIDQpOworCW1lbWNweShzYXZlZF9wYXJhbXMuZG5zX3NlY29uZGFyeSwgcGFyYW1zLT5kbnNfc2Vjb25kYXJ5LCA0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX29zX2FyZWFfcnRjX2RpZmYgLSBSZXR1cm5zIHRoZSBwczMgcnRjIGRpZmYgdmFsdWUuCisgKgorICogVGhlIHBzMyBydGMgbWFpbnRhaW5zIGEgdmFsdWUgdGhhdCBhcHByb3hpbWF0ZXMgc2Vjb25kcyBzaW5jZQorICogMjAwMC0wMS0wMSAwMDowMDowMCBVVEMuICBSZXR1cm5zIHRoZSBleGFjdCBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIDE5NzAgdG8KKyAqIDIwMDAgd2hlbiBzYXZlZF9wYXJhbXMucnRjX2RpZmYgaGFzIG5vdCBiZWVuIHByb3Blcmx5IHNldCB1cC4KKyAqLworCit1NjQgcHMzX29zX2FyZWFfcnRjX2RpZmYodm9pZCkKK3sKKwlyZXR1cm4gc2F2ZWRfcGFyYW1zLnJ0Y19kaWZmID8gc2F2ZWRfcGFyYW1zLnJ0Y19kaWZmIDogOTQ2Njg0ODAwVUw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2IxMTFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaApAQCAtMCwwICsxLDY4IEBACisvKgorICogIFBTMyBwbGF0Zm9ybSBkZWNsYXJhdGlvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWYgIWRlZmluZWQoX1BTM19QTEFURk9STV9IKQorI2RlZmluZSBfUFMzX1BMQVRGT1JNX0gKKworI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisvKiBodGFiICovCisKK3ZvaWQgX19pbml0IHBzM19ocHRlX2luaXQodW5zaWduZWQgbG9uZyBodGFiX3NpemUpOwordm9pZCBfX2luaXQgcHMzX21hcF9odGFiKHZvaWQpOworCisvKiBtbSAqLworCit2b2lkIF9faW5pdCBwczNfbW1faW5pdCh2b2lkKTsKK3ZvaWQgX19pbml0IHBzM19tbV92YXNfY3JlYXRlKHVuc2lnbmVkIGxvbmcqIGh0YWJfc2l6ZSk7Cit2b2lkIHBzM19tbV92YXNfZGVzdHJveSh2b2lkKTsKK3ZvaWQgcHMzX21tX3NodXRkb3duKHZvaWQpOworCisvKiBpcnEgKi8KKwordm9pZCBwczNfaW5pdF9JUlEodm9pZCk7Cit2b2lkIF9faW5pdCBwczNfcmVnaXN0ZXJfaXBpX2RlYnVnX2Jyayh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgdmlycSk7CisKKy8qIHNtcCAqLworCit2b2lkIHNtcF9pbml0X3BzMyh2b2lkKTsKK3ZvaWQgcHMzX3NtcF9jbGVhbnVwX2NwdShpbnQgY3B1KTsKKworLyogdGltZSAqLworCit2b2lkIF9faW5pdCBwczNfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Cit1bnNpZ25lZCBsb25nIF9faW5pdCBwczNfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKK3ZvaWQgcHMzX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpOworaW50IHBzM19zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKTsKKworLyogb3MgYXJlYSAqLworCitpbnQgX19pbml0IHBzM19vc19hcmVhX2luaXQodm9pZCk7Cit1NjQgcHMzX29zX2FyZWFfcnRjX2RpZmYodm9pZCk7CisKKy8qIHNwdSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1BVX0JBU0UpCit2b2lkIHBzM19zcHVfc2V0X3BsYXRmb3JtICh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHMzX3NwdV9zZXRfcGxhdGZvcm0gKHZvaWQpIHt9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczYTBkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwpAQCAtMCwwICsxLDg0MCBAQAorLyoKKyAqICBQUzMgcmVwb3NpdG9yeSByb3V0aW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxhc20vcHMzLmg+CisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKworZW51bSBwczNfdmVuZG9yX2lkIHsKKwlQUzNfVkVORE9SX0lEX05PTkUgPSAwLAorCVBTM19WRU5ET1JfSURfU09OWSA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMLAorfTsKKworZW51bSBwczNfbHBhcl9pZCB7CisJUFMzX0xQQVJfSURfQ1VSUkVOVCA9IDAsCisJUFMzX0xQQVJfSURfUE1FID0gMSwKK307CisKKyNkZWZpbmUgZHVtcF9maWVsZChfYSwgX2IpIF9kdW1wX2ZpZWxkKF9hLCBfYiwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfZmllbGQoY29uc3QgY2hhciAqaGRyLCB1NjQgbiwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisjaWYgZGVmaW5lZChERUJVRykKKwljaGFyIHNbMTZdOworCWNvbnN0IGNoYXIgKmNvbnN0IGluID0gKGNvbnN0IGNoYXIgKikmbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXNbaV0gPSAoaW5baV0gPD0gMTI2ICYmIGluW2ldID49IDMyKSA/IGluW2ldIDogJy4nOworCXNbaV0gPSAwOworCisJcHJfZGVidWcoIiVzOiVkOiAlcyUwMTZseCA6ICVzXG4iLCBmdW5jLCBsaW5lLCBoZHIsIG4sIHMpOworI2VuZGlmCit9CisKKyNkZWZpbmUgZHVtcF9ub2RlX25hbWUoX2EsIF9iLCBfYywgX2QsIF9lKSBcCisJX2R1bXBfbm9kZV9uYW1lKF9hLCBfYiwgX2MsIF9kLCBfZSwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfbm9kZV9uYW1lICh1bnNpZ25lZCBpbnQgbHBhcl9pZCwgdTY0IG4xLCB1NjQgbjIsIHU2NCBuMywKKwl1NjQgbjQsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogbHBhcjogJXVcbiIsIGZ1bmMsIGxpbmUsIGxwYXJfaWQpOworCV9kdW1wX2ZpZWxkKCJuMTogIiwgbjEsIGZ1bmMsIGxpbmUpOworCV9kdW1wX2ZpZWxkKCJuMjogIiwgbjIsIGZ1bmMsIGxpbmUpOworCV9kdW1wX2ZpZWxkKCJuMzogIiwgbjMsIGZ1bmMsIGxpbmUpOworCV9kdW1wX2ZpZWxkKCJuNDogIiwgbjQsIGZ1bmMsIGxpbmUpOworfQorCisjZGVmaW5lIGR1bXBfbm9kZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZykgXAorCV9kdW1wX25vZGUoX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX25vZGUodW5zaWduZWQgaW50IGxwYXJfaWQsIHU2NCBuMSwgdTY0IG4yLCB1NjQgbjMsIHU2NCBuNCwKKwl1NjQgdjEsIHU2NCB2MiwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiBscGFyOiAldVxuIiwgZnVuYywgbGluZSwgbHBhcl9pZCk7CisJX2R1bXBfZmllbGQoIm4xOiAiLCBuMSwgZnVuYywgbGluZSk7CisJX2R1bXBfZmllbGQoIm4yOiAiLCBuMiwgZnVuYywgbGluZSk7CisJX2R1bXBfZmllbGQoIm4zOiAiLCBuMywgZnVuYywgbGluZSk7CisJX2R1bXBfZmllbGQoIm40OiAiLCBuNCwgZnVuYywgbGluZSk7CisJcHJfZGVidWcoIiVzOiVkOiB2MTogJTAxNmx4XG4iLCBmdW5jLCBsaW5lLCB2MSk7CisJcHJfZGVidWcoIiVzOiVkOiB2MjogJTAxNmx4XG4iLCBmdW5jLCBsaW5lLCB2Mik7Cit9CisKKy8qKgorICogbWFrZV9maXJzdF9maWVsZCAtIE1ha2UgdGhlIGZpcnN0IGZpZWxkIG9mIGEgcmVwb3NpdG9yeSBub2RlIG5hbWUuCisgKiBAdGV4dDogVGV4dCBwb3J0aW9uIG9mIHRoZSBmaWVsZC4KKyAqIEBpbmRleDogTnVtZXJpYyBpbmRleCBwb3J0aW9uIG9mIHRoZSBmaWVsZC4gIFVzZSB6ZXJvIGZvciAnZG9uJ3QgY2FyZScuCisgKgorICogVGhpcyByb3V0aW5lIHNldHMgdGhlIHZlbmRvciBpZCB0byB6ZXJvIChub24tdmVuZG9yIHNwZWNpZmljKS4KKyAqIFJldHVybnMgZmllbGQgdmFsdWUuCisgKi8KKworc3RhdGljIHU2NCBtYWtlX2ZpcnN0X2ZpZWxkKGNvbnN0IGNoYXIgKnRleHQsIHU2NCBpbmRleCkKK3sKKwl1NjQgbjsKKworCXN0cm5jcHkoKGNoYXIgKikmbiwgdGV4dCwgOCk7CisJcmV0dXJuIFBTM19WRU5ET1JfSURfTk9ORSArIChuID4+IDMyKSArIGluZGV4OworfQorCisvKioKKyAqIG1ha2VfZmllbGQgLSBNYWtlIHN1YnNlcXVlbnQgZmllbGRzIG9mIGEgcmVwb3NpdG9yeSBub2RlIG5hbWUuCisgKiBAdGV4dDogVGV4dCBwb3J0aW9uIG9mIHRoZSBmaWVsZC4gIFVzZSAiIiBmb3IgJ2Rvbid0IGNhcmUnLgorICogQGluZGV4OiBOdW1lcmljIGluZGV4IHBvcnRpb24gb2YgdGhlIGZpZWxkLiAgVXNlIHplcm8gZm9yICdkb24ndCBjYXJlJy4KKyAqCisgKiBSZXR1cm5zIGZpZWxkIHZhbHVlLgorICovCisKK3N0YXRpYyB1NjQgbWFrZV9maWVsZChjb25zdCBjaGFyICp0ZXh0LCB1NjQgaW5kZXgpCit7CisJdTY0IG47CisKKwlzdHJuY3B5KChjaGFyICopJm4sIHRleHQsIDgpOworCXJldHVybiBuICsgaW5kZXg7Cit9CisKKy8qKgorICogcmVhZF9ub2RlIC0gUmVhZCBhIHJlcG9zaXRvcnkgbm9kZSBmcm9tIHJhdyBmaWVsZHMuCisgKiBAbjE6IEZpcnN0IGZpZWxkIG9mIG5vZGUgbmFtZS4KKyAqIEBuMjogU2Vjb25kIGZpZWxkIG9mIG5vZGUgbmFtZS4gIFVzZSB6ZXJvIGZvciAnZG9uJ3QgY2FyZScuCisgKiBAbjM6IFRoaXJkIGZpZWxkIG9mIG5vZGUgbmFtZS4gIFVzZSB6ZXJvIGZvciAnZG9uJ3QgY2FyZScuCisgKiBAbjQ6IEZvdXJ0aCBmaWVsZCBvZiBub2RlIG5hbWUuICBVc2UgemVybyBmb3IgJ2Rvbid0IGNhcmUnLgorICogQHYxOiBGaXJzdCByZXBvc2l0b3J5IHZhbHVlIChoaWdoIHdvcmQpLgorICogQHYyOiBTZWNvbmQgcmVwb3NpdG9yeSB2YWx1ZSAobG93IHdvcmQpLiAgT3B0aW9uYWwgcGFyYW1ldGVyLCB1c2UgemVybworICogICAgICBmb3IgJ2Rvbid0IGNhcmUnLgorICovCisKK3N0YXRpYyBpbnQgcmVhZF9ub2RlKHVuc2lnbmVkIGludCBscGFyX2lkLCB1NjQgbjEsIHU2NCBuMiwgdTY0IG4zLCB1NjQgbjQsCisJdTY0ICpfdjEsIHU2NCAqX3YyKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCXU2NCB2MjsKKworCWlmIChscGFyX2lkID09IFBTM19MUEFSX0lEX0NVUlJFTlQpIHsKKwkJdTY0IGlkOworCQlsdjFfZ2V0X2xvZ2ljYWxfcGFydGl0aW9uX2lkKCZpZCk7CisJCWxwYXJfaWQgPSBpZDsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZShscGFyX2lkLCBuMSwgbjIsIG4zLCBuNCwgJnYxLAorCQkmdjIpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCWR1bXBfbm9kZV9uYW1lKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlkdW1wX25vZGUobHBhcl9pZCwgbjEsIG4yLCBuMywgbjQsIHYxLCB2Mik7CisKKwlpZiAoX3YxKQorCQkqX3YxID0gdjE7CisJaWYgKF92MikKKwkJKl92MiA9IHYyOworCisJaWYgKHYxICYmICFfdjEpCisJCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MTogJTAxNmx4XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCB2MSk7CisJaWYgKHYyICYmICFfdjIpCisJCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MjogJTAxNmx4XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCB2Mik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGNvbnN0IGNoYXIgKmJ1c19zdHIsCisJdTY0ICp2YWx1ZSkKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKKwkJbWFrZV9maWVsZChidXNfc3RyLCAwKSwKKwkJMCwgMCwKKwkJdmFsdWUsIDApOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50ICpidXNfaWQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisJdTY0IHYyOyAvKiB1bnVzZWQgKi8KKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImlkIiwgMCksCisJCTAsIDAsCisJCSZ2MSwgJnYyKTsKKwkqYnVzX2lkID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwllbnVtIHBzM19idXNfdHlwZSAqYnVzX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJ0eXBlIiwgMCksCisJCTAsIDAsCisJCSZ2MSwgMCk7CisJKmJ1c190eXBlID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgKm51bV9kZXYpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJudW1fZGV2IiwgMCksCisJCTAsIDAsCisJCSZ2MSwgMCk7CisJKm51bV9kZXYgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgY29uc3QgY2hhciAqZGV2X3N0ciwgdTY0ICp2YWx1ZSkKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKKwkJbWFrZV9maWVsZCgiZGV2IiwgZGV2X2luZGV4KSwKKwkJbWFrZV9maWVsZChkZXZfc3RyLCAwKSwKKwkJMCwKKwkJdmFsdWUsIDApOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IGRldl9pbmRleCwKKwl1bnNpZ25lZCBpbnQgKmRldl9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImRldiIsIGRldl9pbmRleCksCisJCW1ha2VfZmllbGQoImlkIiwgMCksCisJCTAsCisJCSZ2MSwgMCk7CisJKmRldl9pZCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgKmRldl90eXBlKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKKwkJbWFrZV9maWVsZCgiZGV2IiwgZGV2X2luZGV4KSwKKwkJbWFrZV9maWVsZCgidHlwZSIsIDApLAorCQkwLAorCQkmdjEsIDApOworCSpkZXZfdHlwZSA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IGludHJfaW5kZXgsCisJdW5zaWduZWQgaW50ICppbnRyX3R5cGUsIHVuc2lnbmVkIGludCogaW50ZXJydXB0X2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCXU2NCB2MjsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImRldiIsIGRldl9pbmRleCksCisJCW1ha2VfZmllbGQoImludHIiLCBpbnRyX2luZGV4KSwKKwkJMCwKKwkJJnYxLCAmdjIpOworCSppbnRyX3R5cGUgPSB2MTsKKwkqaW50ZXJydXB0X2lkID0gdjI7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ190eXBlKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IHJlZ19pbmRleCwgdW5zaWduZWQgaW50ICpyZWdfdHlwZSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImRldiIsIGRldl9pbmRleCksCisJCW1ha2VfZmllbGQoInJlZyIsIHJlZ19pbmRleCksCisJCW1ha2VfZmllbGQoInR5cGUiLCAwKSwKKwkJJnYxLCAwKTsKKwkqcmVnX3R5cGUgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnX2FkZHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgcmVnX2luZGV4LCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbikKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKKwkJbWFrZV9maWVsZCgiZGV2IiwgZGV2X2luZGV4KSwKKwkJbWFrZV9maWVsZCgicmVnIiwgcmVnX2luZGV4KSwKKwkJbWFrZV9maWVsZCgiZGF0YSIsIDApLAorCQlidXNfYWRkciwgbGVuKTsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCByZWdfaW5kZXgsIHVuc2lnbmVkIGludCAqcmVnX3R5cGUsCisJdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pCit7CisJaW50IHJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ190eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAorCQlyZWdfaW5kZXgsIHJlZ190eXBlKTsKKwlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0CisJCTogcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnX2FkZHIoYnVzX2luZGV4LCBkZXZfaW5kZXgsCisJCXJlZ19pbmRleCwgYnVzX2FkZHIsIGxlbik7Cit9CisKKyNpZiBkZWZpbmVkKERFQlVHKQoraW50IHBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IHJlc19pbmRleDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICgldToldSlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOworCisJZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50cl90eXBlOworCQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIoYnVzX2luZGV4LCBkZXZfaW5kZXgsCisJCQlyZXNfaW5kZXgsICZpbnRyX3R5cGUsICZpbnRlcnJ1cHRfaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWlmIChyZXN1bHQgIT0gIExWMV9OT19FTlRSWSkKKwkJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50ciIKKwkJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIGludHJfdHlwZSAldSwgaW50ZXJydXB0X2lkICV1XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgaW50cl90eXBlLAorCQkJaW50ZXJydXB0X2lkKTsKKwl9CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19yZWdpb25fdHlwZSByZWdfdHlwZTsKKwkJdTY0IGJ1c19hZGRyOworCQl1NjQgbGVuOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhidXNfaW5kZXgsIGRldl9pbmRleCwKKwkJCXJlc19pbmRleCwgJnJlZ190eXBlLCAmYnVzX2FkZHIsICZsZW4pOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWlmIChyZXN1bHQgIT0gIExWMV9OT19FTlRSWSkKKwkJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnIgorCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnX3R5cGUgJXUsIGJ1c19hZGRyICVseGgsIGxlbiAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgcmVnX3R5cGUsCisJCQlidXNfYWRkciwgbGVuKTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9kZXZpY2VfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCB1bnNpZ25lZCBpbnQgbnVtX2RldikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OworCisJcHJfZGVidWcoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7CisKKwlmb3IgKGRldl9pbmRleCA9IDA7IGRldl9pbmRleCA8IG51bV9kZXY7IGRldl9pbmRleCsrKSB7CisJCWVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlOworCQl1bnNpZ25lZCBpbnQgZGV2X2lkOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUoYnVzX2luZGV4LCBkZXZfaW5kZXgsCisJCQkmZGV2X3R5cGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlIgorCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKGJ1c19pbmRleCwgZGV2X2luZGV4LAorCQkJJmRldl9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIgorCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogZGV2X3R5cGUgJXUsIGRldl9pZCAldVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIGRldl90eXBlLCBkZXZfaWQpOworCisJCXBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCk7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBidXNfaW5kZXg7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJZm9yIChidXNfaW5kZXggPSAwOyBidXNfaW5kZXggPCAxMDsgYnVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGU7CisJCXVuc2lnbmVkIGludCBidXNfaWQ7CisJCXVuc2lnbmVkIGludCBudW1fZGV2OworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmYnVzX3R5cGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZidXNfaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19pZCgldSkgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGJ1c19pbmRleCAhPSBidXNfaWQpCisJCQlwcl9kZWJ1ZygiJXM6JWQgYnVzX2luZGV4ICE9IGJ1c19pZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYoYnVzX2luZGV4LCAmbnVtX2Rldik7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCBidXNfJXU6IGJ1c190eXBlICV1LCBidXNfaWQgJXUsIG51bV9kZXYgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgYnVzX3R5cGUsIGJ1c19pZCwKKwkJCW51bV9kZXYpOworCisJCWR1bXBfZGV2aWNlX2luZm8oYnVzX2luZGV4LCBudW1fZGV2KTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogZGVmaW5lZChERUJVRykgKi8KKworc3RhdGljIGludCBmaW5kX2RldmljZSh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCB1bnNpZ25lZCBpbnQgbnVtX2RldiwKKwl1bnNpZ25lZCBpbnQgc3RhcnRfZGV2X2luZGV4LCBlbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGRldl9pbmRleDsKKworCXByX2RlYnVnKCIlczolZDogZmluZCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXZfdHlwZSk7CisKKwlkZXYtPmRldl9pbmRleCA9IFVJTlRfTUFYOworCisJZm9yIChkZXZfaW5kZXggPSBzdGFydF9kZXZfaW5kZXg7IGRldl9pbmRleCA8IG51bV9kZXY7IGRldl9pbmRleCsrKSB7CisJCWVudW0gcHMzX2Rldl90eXBlIHg7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZShidXNfaW5kZXgsIGRldl9pbmRleCwKKwkJCSZ4KTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfdHlwZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlpZiAoeCA9PSBkZXZfdHlwZSkKKwkJCWJyZWFrOworCX0KKworCUJVR19PTihkZXZfaW5kZXggPT0gbnVtX2Rldik7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGRldl90eXBlICV1IGF0IGRldl9pbmRleCAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBkZXZfdHlwZSwgZGV2X2luZGV4KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKGJ1c19pbmRleCwgZGV2X2luZGV4LAorCQkmZGV2LT5kaWQuZGV2X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X2lkIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZGV2LT5kZXZfaW5kZXggPSBkZXZfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6JWQgZm91bmQ6IGRldl9pZCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPmRpZC5kZXZfaWQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlIChlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKKwllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBidXNfaW5kZXg7CisJdW5zaWduZWQgaW50IG51bV9kZXY7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgYnVzX3R5cGUgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWJ1c190eXBlLCBkZXZfdHlwZSk7CisKKwlkZXYtPmJ1c19pbmRleCA9IFVJTlRfTUFYOworCisJZm9yIChidXNfaW5kZXggPSBzdGFydF9kZXYgPyBzdGFydF9kZXYtPmJ1c19pbmRleCA6IDA7IGJ1c19pbmRleCA8IDEwOworCQlidXNfaW5kZXgrKykgeworCQllbnVtIHBzM19idXNfdHlwZSB4OworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmeCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX3R5cGUgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmICh4ID09IGJ1c190eXBlKQorCQkJYnJlYWs7CisJfQorCisJQlVHX09OKGJ1c19pbmRleCA9PSAxMCk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGJ1c190eXBlICV1IGF0IGJ1c19pbmRleCAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBidXNfdHlwZSwgYnVzX2luZGV4KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYoYnVzX2luZGV4LCAmbnVtX2Rldik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmVzdWx0ID0gZmluZF9kZXZpY2UoYnVzX2luZGV4LCBudW1fZGV2LCBzdGFydF9kZXYKKwkJPyBzdGFydF9kZXYtPmRldl9pbmRleCArIDEgOiAwLCBkZXZfdHlwZSwgZGV2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIGdldF9kaWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKGJ1c19pbmRleCwgJmRldi0+ZGlkLmJ1c19pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19pZCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWRldi0+YnVzX2luZGV4ID0gYnVzX2luZGV4OworCisJcHJfZGVidWcoIiVzOiVkIGZvdW5kOiBidXNfaWQgJXUsIGRldl9pZCAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmRpZC5idXNfaWQsIGRldi0+ZGlkLmRldl9pZCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAorCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IHJlc19pbmRleDsKKworCXByX2RlYnVnKCIlczolZDogZmluZCBpbnRyX3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaW50cl90eXBlKTsKKworCSppbnRlcnJ1cHRfaWQgPSBVSU5UX01BWDsKKworCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7CisJCWVudW0gcHMzX2ludGVycnVwdF90eXBlIHQ7CisJCXVuc2lnbmVkIGludCBpZDsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKGRldi0+YnVzX2luZGV4LAorCQkJZGV2LT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZpZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X2ludHIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJaWYgKHQgPT0gaW50cl90eXBlKSB7CisJCQkqaW50ZXJydXB0X2lkID0gaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCUJVR19PTihyZXNfaW5kZXggPT0gMTApOworCisJcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBpbnRyX3R5cGUgJXUgYXQgcmVzX2luZGV4ICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIGludHJfdHlwZSwgcmVzX2luZGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCisJZW51bSBwczNfcmVnaW9uX3R5cGUgcmVnX3R5cGUsIHU2NCAqYnVzX2FkZHIsIHU2NCAqbGVuKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCByZXNfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgcmVnX3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmVnX3R5cGUpOworCisJKmJ1c19hZGRyID0gKmxlbiA9IDA7CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19yZWdpb25fdHlwZSB0OworCQl1NjQgYTsKKwkJdTY0IGw7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKGRldi0+YnVzX2luZGV4LAorCQkJZGV2LT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZhLCAmbCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3JlZyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlpZiAodCA9PSByZWdfdHlwZSkgeworCQkJKmJ1c19hZGRyID0gYTsKKwkJCSpsZW4gPSBsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlCVUdfT04ocmVzX2luZGV4ID09IDEwKTsKKworCXByX2RlYnVnKCIlczolZDogZm91bmQgcmVnX3R5cGUgJXUgYXQgcmVzX2luZGV4ICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlZ190eXBlLCByZXNfaW5kZXgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfcm1fc2l6ZSh1bnNpZ25lZCBpbnQgcHBlX2lkLCB1NjQgKnJtX3NpemUpCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJwdSIsIDApLAorCQlwcGVfaWQsCisJCW1ha2VfZmllbGQoInJtX3NpemUiLCAwKSwKKwkJcm1fc2l6ZSwgMCk7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3JlZ2lvbl90b3RhbCh1NjQgKnJlZ2lvbl90b3RhbCkKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInJnbnRvdGFsIiwgMCksCisJCTAsIDAsCisJCXJlZ2lvbl90b3RhbCwgMCk7Cit9CisKKy8qKgorICogcHMzX3JlcG9zaXRvcnlfcmVhZF9tbV9pbmZvIC0gUmVhZCBtbSBpbmZvIGZvciBzaW5nbGUgcHUgc3lzdGVtLgorICogQHJtX2Jhc2U6IFJlYWwgbW9kZSBtZW1vcnkgYmFzZSBhZGRyZXNzLgorICogQHJtX3NpemU6IFJlYWwgbW9kZSBtZW1vcnkgc2l6ZS4KKyAqIEByZWdpb25fdG90YWw6IE1heGltdW0gbWVtb3J5IHJlZ2lvbiBzaXplLgorICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX21tX2luZm8odTY0ICpybV9iYXNlLCB1NjQgKnJtX3NpemUsIHU2NCAqcmVnaW9uX3RvdGFsKQoreworCWludCByZXN1bHQ7CisJdTY0IHBwZV9pZDsKKworCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7CisJKnJtX2Jhc2UgPSAwOworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfcm1fc2l6ZShwcGVfaWQsIHJtX3NpemUpOworCXJldHVybiByZXN1bHQgPyByZXN1bHQKKwkJOiBwczNfcmVwb3NpdG9yeV9yZWFkX3JlZ2lvbl90b3RhbChyZWdpb25fdG90YWwpOworfQorCisvKioKKyAqIHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3NwdV9yZXNlcnZlZCAtIE51bWJlciBvZiBwaHlzaWNhbCBzcHVzIHJlc2VydmVkLgorICogQG51bV9zcHU6IE51bWJlciBvZiBwaHlzaWNhbCBzcHVzLgorICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9zcHVfcmVzZXJ2ZWQodW5zaWduZWQgaW50ICpudW1fc3B1X3Jlc2VydmVkKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInNwdW4iLCAwKSwKKwkJMCwgMCwKKwkJJnYxLCAwKTsKKwkqbnVtX3NwdV9yZXNlcnZlZCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fc3B1X3Jlc291cmNlX2lkIC0gTnVtYmVyIG9mIHNwdSByZXNvdXJjZSByZXNlcnZhdGlvbnMuCisgKiBAbnVtX3Jlc291cmNlX2lkOiBOdW1iZXIgb2Ygc3B1IHJlc291cmNlIGlkcy4KKyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fc3B1X3Jlc291cmNlX2lkKHVuc2lnbmVkIGludCAqbnVtX3Jlc291cmNlX2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInNwdXJzdm4iLCAwKSwKKwkJMCwgMCwKKwkJJnYxLCAwKTsKKwkqbnVtX3Jlc291cmNlX2lkID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCAtIHNwdSByZXNvdXJjZSByZXNlcnZhdGlvbiBpZCB2YWx1ZS4KKyAqIEByZXNfaW5kZXg6IFJlc291cmNlIHJlc2VydmF0aW9uIGluZGV4LgorICogQHJlc291cmNlX3R5cGU6IFJlc291cmNlIHJlc2VydmF0aW9uIHR5cGUuCisgKiBAcmVzb3VyY2VfaWQ6IFJlc291cmNlIHJlc2VydmF0aW9uIGlkLgorICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgcmVzX2luZGV4LAorCWVudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlKiByZXNvdXJjZV90eXBlLCB1bnNpZ25lZCBpbnQgKnJlc291cmNlX2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCXU2NCB2MjsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJzcHVyc3YiLCAwKSwKKwkJcmVzX2luZGV4LAorCQkwLAorCQkmdjEsICZ2Mik7CisJKnJlc291cmNlX3R5cGUgPSB2MTsKKwkqcmVzb3VyY2VfaWQgPSB2MjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9hZGRyZXNzKHU2NCAqYWRkcmVzcykKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoImJvb3RfZGF0IiwgMCksCisJCW1ha2VfZmllbGQoImFkZHJlc3MiLCAwKSwKKwkJMCwKKwkJYWRkcmVzcywgMCk7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X3NpemUodW5zaWduZWQgaW50ICpzaXplKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoImJvb3RfZGF0IiwgMCksCisJCW1ha2VfZmllbGQoInNpemUiLCAwKSwKKwkJMCwKKwkJJnYxLCAwKTsKKwkqc2l6ZSA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICAqIHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfaW5mbyAtIEdldCBhZGRyZXNzIGFuZCBzaXplIG9mIGNlbGxfZXh0X29zX2FyZWEuCisgICogYWRkcmVzczogbHBhciBhZGRyZXNzIG9mIGNlbGxfZXh0X29zX2FyZWEKKyAgKiBAc2l6ZTogc2l6ZSBvZiBjZWxsX2V4dF9vc19hcmVhCisgICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2luZm8odTY0ICpscGFyX2FkZHIsIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCisJKnNpemUgPSAwOworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfYWRkcmVzcyhscGFyX2FkZHIpOworCXJldHVybiByZXN1bHQgPyByZXN1bHQKKwkJOiBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X3NpemUoc2l6ZSk7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9iZSh1bnNpZ25lZCBpbnQgKm51bV9iZSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJlbiIsIDApLAorCQkwLAorCQkwLAorCQkwLAorCQkmdjEsIDApOworCSpudW1fYmUgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9iZV9ub2RlX2lkKHVuc2lnbmVkIGludCBiZV9pbmRleCwgdTY0ICpub2RlX2lkKQoreworCXJldHVybiByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiZSIsIGJlX2luZGV4KSwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJbm9kZV9pZCwgMCk7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3RiX2ZyZXEodTY0IG5vZGVfaWQsIHU2NCAqdGJfZnJlcSkKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYmUiLCAwKSwKKwkJbm9kZV9pZCwKKwkJbWFrZV9maWVsZCgiY2xvY2siLCAwKSwKKwkJMCwKKwkJdGJfZnJlcSwgMCk7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2JlX3RiX2ZyZXEodW5zaWduZWQgaW50IGJlX2luZGV4LCB1NjQgKnRiX2ZyZXEpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgbm9kZV9pZDsKKworCSp0Yl9mcmVxID0gMDsKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2JlX25vZGVfaWQoMCwgJm5vZGVfaWQpOworCXJldHVybiByZXN1bHQgPyByZXN1bHQKKwkJOiBwczNfcmVwb3NpdG9yeV9yZWFkX3RiX2ZyZXEobm9kZV9pZCwgdGJfZnJlcSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGI1Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqICBQUzMgcGxhdGZvcm0gc2V0dXAgcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwczNfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogJXNcbiIsIHBwY19tZC5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgcHMzX3Bvd2VyX3NhdmUodm9pZCkKK3sKKwkvKgorCSAqIGx2MV9wYXVzZSgpIHB1dHMgdGhlIFBQRSB0aHJlYWQgaW50byBpbmFjdGl2ZSBzdGF0ZSB1bnRpbCBhbgorCSAqIGlycSBvbiBhbiB1bm1hc2tlZCBwbHVnIGV4aXN0cy4gTVNSW0VFXSBoYXMgbm8gZWZmZWN0LgorCSAqIGZsYWdzOiAwID0gd2FrZSBvbiBERUMgaW50ZXJydXB0LCAxID0gaWdub3JlIERFQyBpbnRlcnJ1cHQuCisJICovCisKKwlsdjFfcGF1c2UoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19wYW5pYyhjaGFyICpzdHIpCit7CisJREJHKCIlczolZCAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBzdHIpOworCisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9zZW5kX3N0b3AoKTsKKyNlbmRpZgorCXByaW50aygiXG4iKTsKKwlwcmludGsoIiAgIFN5c3RlbSBkb2VzIG5vdCByZWJvb3QgYXV0b21hdGljYWxseS5cbiIpOworCXByaW50aygiICAgUGxlYXNlIHByZXNzIFBPV0VSIGJ1dHRvbi5cbiIpOworCXByaW50aygiXG4iKTsKKworCWZvciAoOzspIDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBzM19zZXR1cF9hcmNoKHZvaWQpCit7CisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwczNfc3B1X3NldF9wbGF0Zm9ybSgpOworCXBzM19tYXBfaHRhYigpOworCisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9pbml0X3BzMygpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQorCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOworI2VuZGlmCisKKwlwcGNfbWQucG93ZXJfc2F2ZSA9IHBzM19wb3dlcl9zYXZlOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwczNfcHJvZ3Jlc3MoY2hhciAqcywgdW5zaWduZWQgc2hvcnQgaGV4KQoreworCXByaW50aygiKioqICUwNHggOiAlc1xuIiwgaGV4LCBzID8gcyA6ICIiKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBodGFiX3NpemU7CisJdW5zaWduZWQgbG9uZyBkdF9yb290OworCisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlkdF9yb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKGR0X3Jvb3QsICJQUzMiKSkKKwkJcmV0dXJuIDA7CisKKwlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfUFMzX1BPU1NJQkxFOworCisJcHMzX29zX2FyZWFfaW5pdCgpOworCXBzM19tbV9pbml0KCk7CisJcHMzX21tX3Zhc19jcmVhdGUoJmh0YWJfc2l6ZSk7CisJcHMzX2hwdGVfaW5pdChodGFiX3NpemUpOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDE7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVhFQykKK3N0YXRpYyB2b2lkIHBzM19rZXhlY19jcHVfZG93bihpbnQgY3Jhc2hfc2h1dGRvd24sIGludCBzZWNvbmRhcnkpCit7CisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlpZiAoc2Vjb25kYXJ5KSB7CisJCWludCBjcHU7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQkJaWYgKGNwdSkKKwkJCQlwczNfc21wX2NsZWFudXBfY3B1KGNwdSk7CisJfSBlbHNlCisJCXBzM19zbXBfY2xlYW51cF9jcHUoMCk7CisKKwlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKworc3RhdGljIHZvaWQgcHMzX21hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJdW5zaWduZWQgbG9uZyBwcGVfaWQ7CisKKwlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7CisJbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBwZV9pZCwgMCwgMCk7CisJcHMzX21tX3NodXRkb3duKCk7CisJcHMzX21tX3Zhc19kZXN0cm95KCk7CisKKwlkZWZhdWx0X21hY2hpbmVfa2V4ZWMoaW1hZ2UpOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cit9CisjZW5kaWYKKworZGVmaW5lX21hY2hpbmUocHMzKSB7CisJLm5hbWUJCQkJPSAiUFMzIiwKKwkucHJvYmUJCQkJPSBwczNfcHJvYmUsCisJLnNldHVwX2FyY2gJCQk9IHBzM19zZXR1cF9hcmNoLAorCS5zaG93X2NwdWluZm8JCQk9IHBzM19zaG93X2NwdWluZm8sCisJLmluaXRfSVJRCQkJPSBwczNfaW5pdF9JUlEsCisJLnBhbmljCQkJCT0gcHMzX3BhbmljLAorCS5nZXRfYm9vdF90aW1lCQkJPSBwczNfZ2V0X2Jvb3RfdGltZSwKKwkuc2V0X3J0Y190aW1lCQkJPSBwczNfc2V0X3J0Y190aW1lLAorCS5nZXRfcnRjX3RpbWUJCQk9IHBzM19nZXRfcnRjX3RpbWUsCisJLmNhbGlicmF0ZV9kZWNyCQkJPSBwczNfY2FsaWJyYXRlX2RlY3IsCisJLnByb2dyZXNzCQkJPSBwczNfcHJvZ3Jlc3MsCisjaWYgZGVmaW5lZChDT05GSUdfS0VYRUMpCisJLmtleGVjX2NwdV9kb3duCQkJPSBwczNfa2V4ZWNfY3B1X2Rvd24sCisJLm1hY2hpbmVfa2V4ZWMJCQk9IHBzM19tYWNoaW5lX2tleGVjLAorCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUsCisJLm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24JCT0gZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQyMDgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiAgUFMzIFNNUCByb3V0aW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vcHMzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX2Z1bmN0aW9uX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqbXNnKQoreworCXNtcF9tZXNzYWdlX3JlY3YoKGludCkobG9uZyltc2cpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgICogdmlycXMgLSBhIHBlciBjcHUgYXJyYXkgb2YgdmlycXMgZm9yIGlwaSB1c2UKKyAgKi8KKworI2RlZmluZSBNU0dfQ09VTlQgNAorc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgdmlycXNbTVNHX0NPVU5UXSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tNU0dfQ09VTlRdID0geworCSJpcGkgY2FsbCIsCisJImlwaSByZXNjaGVkdWxlIiwKKwkiaXBpIG1pZ3JhdGUiLAorCSJpcGkgZGVidWcgYnJrIgorfTsKKworc3RhdGljIHZvaWQgZG9fbWVzc2FnZV9wYXNzKGludCB0YXJnZXQsIGludCBtc2cpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgdmlycTsKKworCWlmIChtc2cgPj0gTVNHX0NPVU5UKSB7CisJCURCRygiJXM6JWQ6IGJhZCBtc2c6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1zZyk7CisJCXJldHVybjsKKwl9CisKKwl2aXJxID0gcGVyX2NwdSh2aXJxcywgdGFyZ2V0KVttc2ddOworCXJlc3VsdCA9IHBzM19zZW5kX2V2ZW50X2xvY2FsbHkodmlycSk7CisKKwlpZiAocmVzdWx0KQorCQlEQkcoIiVzOiVkOiBwczNfc2VuZF9ldmVudF9sb2NhbGx5KCVkLCAlZCkgZmFpbGVkIgorCQkJIiAoJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHRhcmdldCwgbXNnLCByZXN1bHQpOworfQorCitzdGF0aWMgdm9pZCBwczNfc21wX21lc3NhZ2VfcGFzcyhpbnQgdGFyZ2V0LCBpbnQgbXNnKQoreworCWludCBjcHU7CisKKwlpZiAodGFyZ2V0IDwgTlJfQ1BVUykKKwkJZG9fbWVzc2FnZV9wYXNzKHRhcmdldCwgbXNnKTsKKwllbHNlIGlmICh0YXJnZXQgPT0gTVNHX0FMTF9CVVRfU0VMRikgeworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJCWlmIChjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQkJCWRvX21lc3NhZ2VfcGFzcyhjcHUsIG1zZyk7CisJfSBlbHNlIHsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCQlkb19tZXNzYWdlX3Bhc3MoY3B1LCBtc2cpOworCX0KK30KKworc3RhdGljIGludCBwczNfc21wX3Byb2JlKHZvaWQpCit7CisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwczNfc21wX3NldHVwX2NwdShpbnQgY3B1KQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50ICp2aXJxcyA9IHBlcl9jcHUodmlycXMsIGNwdSk7CisJaW50IGk7CisKKwlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOworCisJLyoKKwkgKiBDaGVjayBhc3N1bXB0aW9ucyBvbiB2aXJxc1tdIGluZGV4aW5nLiBJZiB0aGlzCisJICogY2hlY2sgZmFpbHMsIHRoZW4gYSBkaWZmZXJlbnQgbWFwcGluZyBvZiBQUENfTVNHXworCSAqIHRvIGluZGV4IG5lZWRzIHRvIGJlIHNldHVwLgorCSAqLworCisJQlVJTERfQlVHX09OKFBQQ19NU0dfQ0FMTF9GVU5DVElPTiAgIT0gMCk7CisJQlVJTERfQlVHX09OKFBQQ19NU0dfUkVTQ0hFRFVMRSAgICAgIT0gMSk7CisJQlVJTERfQlVHX09OKFBQQ19NU0dfREVCVUdHRVJfQlJFQUsgIT0gMyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNHX0NPVU5UOyBpKyspIHsKKwkJcmVzdWx0ID0gcHMzX2FsbG9jX2V2ZW50X2lycSgmdmlycXNbaV0pOworCisJCWlmIChyZXN1bHQpCisJCQljb250aW51ZTsKKworCQlEQkcoIiVzOiVkOiAoJWQsICVkKSA9PiB2aXJxICV1XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBjcHUsIGksIHZpcnFzW2ldKTsKKworCisJCXJlcXVlc3RfaXJxKHZpcnFzW2ldLCBpcGlfZnVuY3Rpb25faGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJCW5hbWVzW2ldLCAodm9pZCopKGxvbmcpaSk7CisJfQorCisJcHMzX3JlZ2lzdGVyX2lwaV9kZWJ1Z19icmsoY3B1LCB2aXJxc1tQUENfTVNHX0RFQlVHR0VSX0JSRUFLXSk7CisKKwlEQkcoIiA8LSAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOworfQorCit2b2lkIHBzM19zbXBfY2xlYW51cF9jcHUoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdSh2aXJxcywgY3B1KTsKKwlpbnQgaTsKKworCURCRygiIC0+ICVzOiVkOiAoJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNwdSk7CisJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7CisJCXBzM19mcmVlX2V2ZW50X2lycSh2aXJxc1tpXSk7CisJCWZyZWVfaXJxKHZpcnFzW2ldLCAodm9pZCopKGxvbmcpaSk7CisJCXZpcnFzW2ldID0gTk9fSVJROworCX0KKwlEQkcoIiA8LSAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOworfQorCitzdGF0aWMgc3RydWN0IHNtcF9vcHNfdCBwczNfc21wX29wcyA9IHsKKwkucHJvYmUJCT0gcHMzX3NtcF9wcm9iZSwKKwkubWVzc2FnZV9wYXNzCT0gcHMzX3NtcF9tZXNzYWdlX3Bhc3MsCisJLmtpY2tfY3B1CT0gc21wX2dlbmVyaWNfa2lja19jcHUsCisJLnNldHVwX2NwdQk9IHBzM19zbXBfc2V0dXBfY3B1LAorfTsKKwordm9pZCBzbXBfaW5pdF9wczModm9pZCkKK3sKKwlEQkcoIiAtPiAlc1xuIiwgX19mdW5jX18pOworCXNtcF9vcHMgPSAmcHMzX3NtcF9vcHM7CisJREJHKCIgPC0gJXNcbiIsIF9fZnVuY19fKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0NTMyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogIFBTMyBQbGF0Zm9ybSBzcHUgcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisKKy8qIHNwdV9tYW5hZ2VtZW50X29wcyAqLworCisvKioKKyAqIGVudW0gc3BlX3R5cGUgLSBUeXBlIG9mIHNwZSB0byBjcmVhdGUuCisgKiBAc3BlX3R5cGVfbG9naWNhbDogU3RhbmRhcmQgbG9naWNhbCBzcGUuCisgKgorICogRm9yIHVzZSB3aXRoIGx2MV9jb25zdHJ1Y3RfbG9naWNhbF9zcGUoKS4gIFRoZSBjdXJyZW50IEhWIGRvZXMgbm90IHN1cHBvcnQKKyAqIGFueSB0eXBlcyBvdGhlciB0aGFuIHRob3NlIGxpc3RlZC4KKyAqLworCitlbnVtIHNwZV90eXBlIHsKKwlTUEVfVFlQRV9MT0dJQ0FMID0gMCwKK307CisKKy8qKgorICogc3RydWN0IHNwZV9zaGFkb3cgLSBsb2dpY2FsIHNwZSBzaGFkb3cgcmVnaXN0ZXIgYXJlYS4KKyAqCisgKiBSZWFkLW9ubHkgc2hhZG93IG9mIHNwZSByZWdpc3RlcnMuCisgKi8KKworc3RydWN0IHNwZV9zaGFkb3cgeworCXU4IHBhZGRpbmdfMDAwMFsweDAxNDBdOworCXU2NCBpbnRfc3RhdHVzX2NsYXNzMF9SVzsgICAgICAgLyogMHgwMTQwICovCisJdTY0IGludF9zdGF0dXNfY2xhc3MxX1JXOyAgICAgICAvKiAweDAxNDggKi8KKwl1NjQgaW50X3N0YXR1c19jbGFzczJfUlc7ICAgICAgIC8qIDB4MDE1MCAqLworCXU4IHBhZGRpbmdfMDE1OFsweDA2MTAtMHgwMTU4XTsKKwl1NjQgbWZjX2RzaXNyX1JXOyAgICAgICAgICAgICAgIC8qIDB4MDYxMCAqLworCXU4IHBhZGRpbmdfMDYxOFsweDA2MjAtMHgwNjE4XTsKKwl1NjQgbWZjX2Rhcl9SVzsgICAgICAgICAgICAgICAgIC8qIDB4MDYyMCAqLworCXU4IHBhZGRpbmdfMDYyOFsweDA4MDAtMHgwNjI4XTsKKwl1NjQgbWZjX2RzaXByX1I7ICAgICAgICAgICAgICAgIC8qIDB4MDgwMCAqLworCXU4IHBhZGRpbmdfMDgwOFsweDA4MTAtMHgwODA4XTsKKwl1NjQgbWZjX2xzY3JyX1I7ICAgICAgICAgICAgICAgIC8qIDB4MDgxMCAqLworCXU4IHBhZGRpbmdfMDgxOFsweDBjMDAtMHgwODE4XTsKKwl1NjQgbWZjX2Nlcl9SOyAgICAgICAgICAgICAgICAgIC8qIDB4MGMwMCAqLworCXU4IHBhZGRpbmdfMGMwOFsweDBmMDAtMHgwYzA4XTsKKwl1NjQgc3BlX2V4ZWN1dGlvbl9zdGF0dXM7ICAgICAgIC8qIDB4MGYwMCAqLworCXU4IHBhZGRpbmdfMGYwOFsweDEwMDAtMHgwZjA4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qKgorICogZW51bSBzcGVfZXhfc3RhdGUgLSBMb2dpY2FsIHNwZSBleGVjdXRpb24gc3RhdGUuCisgKiBAc3BlX2V4X3N0YXRlX3VuZXhlY3V0YWJsZTogVW5pbml0aWFsaXplZC4KKyAqIEBzcGVfZXhfc3RhdGVfZXhlY3V0YWJsZTogRW5hYmxlZCwgbm90IHJlYWR5LgorICogQHNwZV9leF9zdGF0ZV9leGVjdXRlZDogUmVhZHkgZm9yIHVzZS4KKyAqCisgKiBUaGUgZXhlY3V0aW9uIHN0YXRlIChzdGF0dXMpIG9mIHRoZSBsb2dpY2FsIHNwZSBhcyByZXBvcnRlZCBpbgorICogc3RydWN0IHNwZV9zaGFkb3c6c3BlX2V4ZWN1dGlvbl9zdGF0dXMuCisgKi8KKworZW51bSBzcGVfZXhfc3RhdGUgeworCVNQRV9FWF9TVEFURV9VTkVYRUNVVEFCTEUgPSAwLAorCVNQRV9FWF9TVEFURV9FWEVDVVRBQkxFID0gMiwKKwlTUEVfRVhfU1RBVEVfRVhFQ1VURUQgPSAzLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgcHJpdjFfY2FjaGUgLSBDYWNoZWQgdmFsdWVzIG9mIHByaXYxIHJlZ2lzdGVycy4KKyAqIEBtYXNrc1tdOiBBcnJheSBvZiBjYWNoZWQgc3BlIGludGVycnVwdCBtYXNrcywgaW5kZXhlZCBieSBjbGFzcy4KKyAqIEBzcjE6IENhY2hlZCBtZmNfc3IxIHJlZ2lzdGVyLgorICogQHRjbGFzc19pZDogQ2FjaGVkIG1mY190Y2xhc3NfaWQgcmVnaXN0ZXIuCisgKi8KKworc3RydWN0IHByaXYxX2NhY2hlIHsKKwl1NjQgbWFza3NbM107CisJdTY0IHNyMTsKKwl1NjQgdGNsYXNzX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3B1X3BkYXRhIC0gUGxhdGZvcm0gc3RhdGUgdmFyaWFibGVzLgorICogQHNwZV9pZDogSFYgc3BlIGlkIHJldHVybmVkIGJ5IGx2MV9jb25zdHJ1Y3RfbG9naWNhbF9zcGUoKS4KKyAqIEByZXNvdXJjZV9pZDogSFYgc3BlIHJlc291cmNlIGlkIHJldHVybmVkIGJ5CisgKiAJcHMzX3JlcG9zaXRvcnlfcmVhZF9zcGVfcmVzb3VyY2VfaWQoKS4KKyAqIEBwcml2Ml9hZGRyOiBscGFyIGFkZHJlc3Mgb2Ygc3BlIHByaXYyIGFyZWEgcmV0dXJuZWQgYnkKKyAqIAlsdjFfY29uc3RydWN0X2xvZ2ljYWxfc3BlKCkuCisgKiBAc2hhZG93X2FkZHI6IGxwYXIgYWRkcmVzcyBvZiBzcGUgcmVnaXN0ZXIgc2hhZG93IGFyZWEgcmV0dXJuZWQgYnkKKyAqIAlsdjFfY29uc3RydWN0X2xvZ2ljYWxfc3BlKCkuCisgKiBAc2hhZG93OiBWaXJ0dWFsIChpb3JlbWFwKSBhZGRyZXNzIG9mIHNwZSByZWdpc3RlciBzaGFkb3cgYXJlYS4KKyAqIEBjYWNoZTogQ2FjaGVkIHZhbHVlcyBvZiBwcml2MSByZWdpc3RlcnMuCisgKi8KKworc3RydWN0IHNwdV9wZGF0YSB7CisJdTY0IHNwZV9pZDsKKwl1NjQgcmVzb3VyY2VfaWQ7CisJdTY0IHByaXYyX2FkZHI7CisJdTY0IHNoYWRvd19hZGRyOworCXN0cnVjdCBzcGVfc2hhZG93IF9faW9tZW0gKnNoYWRvdzsKKwlzdHJ1Y3QgcHJpdjFfY2FjaGUgY2FjaGU7Cit9OworCitzdGF0aWMgc3RydWN0IHNwdV9wZGF0YSAqc3B1X3BkYXRhKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1LT5wZGF0YTsKK30KKworI2RlZmluZSBkdW1wX2FyZWFzKF9hLCBfYiwgX2MsIF9kLCBfZSkgXAorCV9kdW1wX2FyZWFzKF9hLCBfYiwgX2MsIF9kLCBfZSwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfYXJlYXModW5zaWduZWQgaW50IHNwZV9pZCwgdW5zaWduZWQgbG9uZyBwcml2MiwKKwl1bnNpZ25lZCBsb25nIHByb2JsZW0sIHVuc2lnbmVkIGxvbmcgbHMsIHVuc2lnbmVkIGxvbmcgc2hhZG93LAorCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogc3BlX2lkOiAgJXhoICgldSlcbiIsIGZ1bmMsIGxpbmUsIHNwZV9pZCwgc3BlX2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHByaXYyOiAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHByaXYyKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHByb2JsZW06ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHByb2JsZW0pOworCXByX2RlYnVnKCIlczolZDogbHM6ICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgbHMpOworCXByX2RlYnVnKCIlczolZDogc2hhZG93OiAgJWx4aFxuIiwgZnVuYywgbGluZSwgc2hhZG93KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3Zhc19pZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaWQ7CisKKwlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZpZCk7CisJbHYxX2dldF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2VfaWRfb2ZfcHBlKGlkLCAmaWQpOworCisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb25zdHJ1Y3Rfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgdW51c2VkOworCisJcmVzdWx0ID0gbHYxX2NvbnN0cnVjdF9sb2dpY2FsX3NwZShQQUdFX1NISUZULCBQQUdFX1NISUZULCBQQUdFX1NISUZULAorCQlQQUdFX1NISUZULCBQQUdFX1NISUZULCBnZXRfdmFzX2lkKCksIFNQRV9UWVBFX0xPR0lDQUwsCisJCSZzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwgJnNwdS0+cHJvYmxlbV9waHlzLAorCQkmc3B1LT5sb2NhbF9zdG9yZV9waHlzLCAmdW51c2VkLAorCQkmc3B1X3BkYXRhKHNwdSktPnNoYWRvd19hZGRyLAorCQkmc3B1X3BkYXRhKHNwdSktPnNwZV9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbnN0cnVjdF9sb2dpY2FsX3NwZSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFkZF9zcHVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXRhOworCXN0cnVjdCB6b25lICp6b25lOworCisJQlVHX09OKCFtZW1faW5pdF9kb25lKTsKKworCXN0YXJ0X3BmbiA9IHN0YXJ0X2FkZHIgPj4gUEFHRV9TSElGVDsKKwlucl9wYWdlcyA9IChzaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKworCXBnZGF0YSA9IE5PREVfREFUQSgwKTsKKwl6b25lID0gcGdkYXRhLT5ub2RlX3pvbmVzOworCisJcmVzdWx0ID0gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQ6IF9fYWRkX3BhZ2VzIGZhaWxlZDogKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV91bm1hcChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJaW91bm1hcChzcHUtPnByaXYyKTsKKwlpb3VubWFwKHNwdS0+cHJvYmxlbSk7CisJaW91bm1hcCgoX19mb3JjZSB1OCBfX2lvbWVtICopc3B1LT5sb2NhbF9zdG9yZSk7CisJaW91bm1hcChzcHVfcGRhdGEoc3B1KS0+c2hhZG93KTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfYXJlYXMoc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCB0YWJsZSB7Y2hhciogbmFtZTsgdW5zaWduZWQgbG9uZyBhZGRyOyB1bnNpZ25lZCBsb25nIHNpemU7fTsKKwlpbnQgcmVzdWx0OworCisJLyogc2V0dXAgcGFnZXMgKi8KKworCXJlc3VsdCA9IGFkZF9zcHVfcGFnZXMoc3B1LT5sb2NhbF9zdG9yZV9waHlzLCBMU19TSVpFKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfYWRkOworCisJcmVzdWx0ID0gYWRkX3NwdV9wYWdlcyhzcHUtPnByb2JsZW1fcGh5cywgc2l6ZW9mKHN0cnVjdCBzcHVfcHJvYmxlbSkpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9hZGQ7CisKKwkvKiBpb3JlbWFwICovCisKKwlzcHVfcGRhdGEoc3B1KS0+c2hhZG93ID0gX19pb3JlbWFwKAorCQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCisJCVBBR0VfUkVBRE9OTFkgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOworCWlmICghc3B1X3BkYXRhKHNwdSktPnNoYWRvdykgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgc2hhZG93IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2lvcmVtYXA7CisJfQorCisJc3B1LT5sb2NhbF9zdG9yZSA9IGlvcmVtYXAoc3B1LT5sb2NhbF9zdG9yZV9waHlzLCBMU19TSVpFKTsKKwlpZiAoIXNwdS0+bG9jYWxfc3RvcmUpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIGxvY2FsX3N0b3JlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9pb3JlbWFwOworCX0KKworCXNwdS0+cHJvYmxlbSA9IGlvcmVtYXAoc3B1LT5wcm9ibGVtX3BoeXMsCisJCXNpemVvZihzdHJ1Y3Qgc3B1X3Byb2JsZW0pKTsKKwlpZiAoIXNwdS0+cHJvYmxlbSkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJvYmxlbSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9pb3JlbWFwOworCX0KKworCXNwdS0+cHJpdjIgPSBpb3JlbWFwKHNwdV9wZGF0YShzcHUpLT5wcml2Ml9hZGRyLAorCQlzaXplb2Yoc3RydWN0IHNwdV9wcml2MikpOworCWlmICghc3B1LT5wcml2MikgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJpdjIgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfaW9yZW1hcDsKKwl9CisKKwlkdW1wX2FyZWFzKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIHNwdV9wZGF0YShzcHUpLT5wcml2Ml9hZGRyLAorCQlzcHUtPnByb2JsZW1fcGh5cywgc3B1LT5sb2NhbF9zdG9yZV9waHlzLAorCQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93X2FkZHIpOworCWR1bXBfYXJlYXMoc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwgKHVuc2lnbmVkIGxvbmcpc3B1LT5wcml2MiwKKwkJKHVuc2lnbmVkIGxvbmcpc3B1LT5wcm9ibGVtLCAodW5zaWduZWQgbG9uZylzcHUtPmxvY2FsX3N0b3JlLAorCQkodW5zaWduZWQgbG9uZylzcHVfcGRhdGEoc3B1KS0+c2hhZG93KTsKKworCXJldHVybiAwOworCitmYWlsX2lvcmVtYXA6CisJc3B1X3VubWFwKHNwdSk7CitmYWlsX2FkZDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9pbnRlcnJ1cHRzKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gcHMzX2FsbG9jX3NwZV9pcnEoc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwgMCwKKwkJJnNwdS0+aXJxc1swXSk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfYWxsb2NfMDsKKworCXJlc3VsdCA9IHBzM19hbGxvY19zcGVfaXJxKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIDEsCisJCSZzcHUtPmlycXNbMV0pOworCisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2FsbG9jXzE7CisKKwlyZXN1bHQgPSBwczNfYWxsb2Nfc3BlX2lycShzcHVfcGRhdGEoc3B1KS0+c3BlX2lkLCAyLAorCQkmc3B1LT5pcnFzWzJdKTsKKworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9hbGxvY18yOworCisJcmV0dXJuIHJlc3VsdDsKKworZmFpbF9hbGxvY18yOgorCXBzM19mcmVlX3NwZV9pcnEoc3B1LT5pcnFzWzFdKTsKK2ZhaWxfYWxsb2NfMToKKwlwczNfZnJlZV9zcGVfaXJxKHNwdS0+aXJxc1swXSk7CitmYWlsX2FsbG9jXzA6CisJc3B1LT5pcnFzWzBdID0gc3B1LT5pcnFzWzFdID0gc3B1LT5pcnFzWzJdID0gTk9fSVJROworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9zcHUoc3RydWN0IHNwdSAqc3B1KQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBsdjFfZW5hYmxlX2xvZ2ljYWxfc3BlKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsCisJCXNwdV9wZGF0YShzcHUpLT5yZXNvdXJjZV9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2VuYWJsZV9sb2dpY2FsX3NwZSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlnb3RvIGZhaWxfZW5hYmxlOworCX0KKworCXJlc3VsdCA9IHNldHVwX2FyZWFzKHNwdSk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfYXJlYXM7CisKKwlyZXN1bHQgPSBzZXR1cF9pbnRlcnJ1cHRzKHNwdSk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfaW50ZXJydXB0czsKKworCXJldHVybiAwOworCitmYWlsX2ludGVycnVwdHM6CisJc3B1X3VubWFwKHNwdSk7CitmYWlsX2FyZWFzOgorCWx2MV9kaXNhYmxlX2xvZ2ljYWxfc3BlKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIDApOworZmFpbF9lbmFibGU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfZGVzdHJveV9zcHUoc3RydWN0IHNwdSAqc3B1KQoreworCWludCByZXN1bHQ7CisKKwlwcl9kZWJ1ZygiJXM6JWQgc3B1XyVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHNwdS0+bnVtYmVyKTsKKworCXJlc3VsdCA9IGx2MV9kaXNhYmxlX2xvZ2ljYWxfc3BlKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIDApOworCUJVR19PTihyZXN1bHQpOworCisJcHMzX2ZyZWVfc3BlX2lycShzcHUtPmlycXNbMl0pOworCXBzM19mcmVlX3NwZV9pcnEoc3B1LT5pcnFzWzFdKTsKKwlwczNfZnJlZV9zcGVfaXJxKHNwdS0+aXJxc1swXSk7CisKKwlzcHUtPmlycXNbMF0gPSBzcHUtPmlycXNbMV0gPSBzcHUtPmlycXNbMl0gPSBOT19JUlE7CisKKwlzcHVfdW5tYXAoc3B1KTsKKworCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9sb2dpY2FsX3NwZShzcHVfcGRhdGEoc3B1KS0+c3BlX2lkKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCWtmcmVlKHNwdS0+cGRhdGEpOworCXNwdS0+cGRhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19jcmVhdGVfc3B1KHN0cnVjdCBzcHUgKnNwdSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfZGVidWcoIiVzOiVkIHNwdV8lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBzcHUtPm51bWJlcik7CisKKwlzcHUtPnBkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9wZGF0YSksCisJCUdGUF9LRVJORUwpOworCisJaWYgKCFzcHUtPnBkYXRhKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYWxsb2M7CisJfQorCisJc3B1X3BkYXRhKHNwdSktPnJlc291cmNlX2lkID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKworCS8qIEluaXQgY2FjaGVkIHJlZyB2YWx1ZXMgdG8gSFYgZGVmYXVsdHMuICovCisKKwlzcHVfcGRhdGEoc3B1KS0+Y2FjaGUuc3IxID0gMHgzMzsKKworCXJlc3VsdCA9IGNvbnN0cnVjdF9zcHUoc3B1KTsKKworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9jb25zdHJ1Y3Q7CisKKwkvKiBGb3Igbm93LCBqdXN0IGdvIGFoZWFkIGFuZCBlbmFibGUgaXQuICovCisKKwlyZXN1bHQgPSBlbmFibGVfc3B1KHNwdSk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfZW5hYmxlOworCisJLyogTWFrZSBzdXJlIHRoZSBzcHUgaXMgaW4gU1BFX0VYX1NUQVRFX0VYRUNVVEVELiAqLworCisJLyogbmVlZCBzb21ldGhpbmcgYmV0dGVyIGhlcmUhISEgKi8KKwl3aGlsZSAoaW5fYmU2NCgmc3B1X3BkYXRhKHNwdSktPnNoYWRvdy0+c3BlX2V4ZWN1dGlvbl9zdGF0dXMpCisJCSE9IFNQRV9FWF9TVEFURV9FWEVDVVRFRCkKKwkJKHZvaWQpMDsKKworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfZW5hYmxlOgorZmFpbF9jb25zdHJ1Y3Q6CisJcHMzX2Rlc3Ryb3lfc3B1KHNwdSk7CitmYWlsX21hbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfZW51bWVyYXRlX3NwdXMoaW50ICgqZm4pKHZvaWQgKmRhdGEpKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IG51bV9yZXNvdXJjZV9pZDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3NwdV9yZXNvdXJjZV9pZCgmbnVtX3Jlc291cmNlX2lkKTsKKworCXByX2RlYnVnKCIlczolZDogbnVtX3Jlc291cmNlX2lkICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCW51bV9yZXNvdXJjZV9pZCk7CisKKwkvKgorCSAqIEZvciBub3csIGp1c3QgY3JlYXRlIGxvZ2ljYWwgc3B1cyBlcXVhbCB0byB0aGUgbnVtYmVyCisJICogb2YgcGh5c2ljYWwgc3B1cyByZXNlcnZlZCBmb3IgdGhlIHBhcnRpdGlvbi4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVzb3VyY2VfaWQ7IGkrKykgeworCQllbnVtIHBzM19zcHVfcmVzb3VyY2VfdHlwZSByZXNvdXJjZV90eXBlOworCQl1bnNpZ25lZCBpbnQgcmVzb3VyY2VfaWQ7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zcHVfcmVzb3VyY2VfaWQoaSwKKwkJCSZyZXNvdXJjZV90eXBlLCAmcmVzb3VyY2VfaWQpOworCisJCWlmIChyZXN1bHQpCisJCQlicmVhazsKKworCQlpZiAocmVzb3VyY2VfdHlwZSA9PSBQUzNfU1BVX1JFU09VUkNFX1RZUEVfRVhDTFVTSVZFKSB7CisJCQlyZXN1bHQgPSBmbigodm9pZCopKHVuc2lnbmVkIGxvbmcpcmVzb3VyY2VfaWQpOworCisJCQlpZiAocmVzdWx0KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJlc3VsdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IEVycm9yIGluaXRpYWxpemluZyBzcHVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IHN0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMgc3B1X21hbmFnZW1lbnRfcHMzX29wcyA9IHsKKwkuZW51bWVyYXRlX3NwdXMgPSBwczNfZW51bWVyYXRlX3NwdXMsCisJLmNyZWF0ZV9zcHUgPSBwczNfY3JlYXRlX3NwdSwKKwkuZGVzdHJveV9zcHUgPSBwczNfZGVzdHJveV9zcHUsCit9OworCisvKiBzcHVfcHJpdjFfb3BzICovCisKK3N0YXRpYyB2b2lkIGludF9tYXNrX2FuZChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCit7CisJdTY0IG9sZF9tYXNrOworCisJLyogYXJlIHRoZXNlIHNlcmlhbGl6ZWQgYnkgY2FsbGVyPz8/ICovCisJb2xkX21hc2sgPSBzcHVfaW50X21hc2tfZ2V0KHNwdSwgY2xhc3MpOworCXNwdV9pbnRfbWFza19zZXQoc3B1LCBjbGFzcywgb2xkX21hc2sgJiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgaW50X21hc2tfb3Ioc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQoreworCXU2NCBvbGRfbWFzazsKKworCW9sZF9tYXNrID0gc3B1X2ludF9tYXNrX2dldChzcHUsIGNsYXNzKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgY2xhc3MsIG9sZF9tYXNrIHwgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGludF9tYXNrX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCit7CisJc3B1X3BkYXRhKHNwdSktPmNhY2hlLm1hc2tzW2NsYXNzXSA9IG1hc2s7CisJbHYxX3NldF9zcGVfaW50ZXJydXB0X21hc2soc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwgY2xhc3MsCisJCXNwdV9wZGF0YShzcHUpLT5jYWNoZS5tYXNrc1tjbGFzc10pOworfQorCitzdGF0aWMgdTY0IGludF9tYXNrX2dldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcykKK3sKKwlyZXR1cm4gc3B1X3BkYXRhKHNwdSktPmNhY2hlLm1hc2tzW2NsYXNzXTsKK30KKworc3RhdGljIHZvaWQgaW50X3N0YXRfY2xlYXIoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBzdGF0KQoreworCS8qIE5vdGUgdGhhdCBNRkNfRFNJU1Igd2lsbCBiZSBjbGVhcmVkIHdoZW4gY2xhc3MxW01GXSBpcyBzZXQuICovCisKKwlsdjFfY2xlYXJfc3BlX2ludGVycnVwdF9zdGF0dXMoc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwgY2xhc3MsCisJCXN0YXQsIDApOworfQorCitzdGF0aWMgdTY0IGludF9zdGF0X2dldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcykKK3sKKwl1NjQgc3RhdDsKKworCWx2MV9nZXRfc3BlX2ludGVycnVwdF9zdGF0dXMoc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwgY2xhc3MsICZzdGF0KTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIHZvaWQgY3B1X2FmZmluaXR5X3NldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjcHUpCit7CisJLyogTm8gc3VwcG9ydC4gKi8KK30KKworc3RhdGljIHU2NCBtZmNfZGFyX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdV9wZGF0YShzcHUpLT5zaGFkb3ctPm1mY19kYXJfUlcpOworfQorCitzdGF0aWMgdm9pZCBtZmNfZHNpc3Jfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IGRzaXNyKQoreworCS8qIE5vdGhpbmcgdG8gZG8sIGNsZWFyZWQgaW4gaW50X3N0YXRfY2xlYXIoKS4gKi8KK30KKworc3RhdGljIHU2NCBtZmNfZHNpc3JfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gaW5fYmU2NCgmc3B1X3BkYXRhKHNwdSktPnNoYWRvdy0+bWZjX2RzaXNyX1JXKTsKK30KKworc3RhdGljIHZvaWQgbWZjX3Nkcl9zZXR1cChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogTm90aGluZyB0byBkby4gKi8KK30KKworc3RhdGljIHZvaWQgbWZjX3NyMV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgc3IxKQoreworCS8qIENoZWNrIGJpdHMgYWxsb3dlZCBieSBIVi4gKi8KKworCXN0YXRpYyBjb25zdCB1NjQgYWxsb3dlZCA9IH4oTUZDX1NUQVRFMV9MT0NBTF9TVE9SQUdFX0RFQ09ERV9NQVNLCisJCXwgTUZDX1NUQVRFMV9QUk9CTEVNX1NUQVRFX01BU0spOworCisJQlVHX09OKChzcjEgJiBhbGxvd2VkKSAhPSAoc3B1X3BkYXRhKHNwdSktPmNhY2hlLnNyMSAmIGFsbG93ZWQpKTsKKworCXNwdV9wZGF0YShzcHUpLT5jYWNoZS5zcjEgPSBzcjE7CisJbHYxX3NldF9zcGVfcHJpdmlsZWdlX3N0YXRlX2FyZWFfMV9yZWdpc3RlcigKKwkJc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHNwdV9wcml2MSwgbWZjX3NyMV9SVyksCisJCXNwdV9wZGF0YShzcHUpLT5jYWNoZS5zcjEpOworfQorCitzdGF0aWMgdTY0IG1mY19zcjFfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X3BkYXRhKHNwdSktPmNhY2hlLnNyMTsKK30KKworc3RhdGljIHZvaWQgbWZjX3RjbGFzc19pZF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgdGNsYXNzX2lkKQoreworCXNwdV9wZGF0YShzcHUpLT5jYWNoZS50Y2xhc3NfaWQgPSB0Y2xhc3NfaWQ7CisJbHYxX3NldF9zcGVfcHJpdmlsZWdlX3N0YXRlX2FyZWFfMV9yZWdpc3RlcigKKwkJc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHNwdV9wcml2MSwgbWZjX3RjbGFzc19pZF9SVyksCisJCXNwdV9wZGF0YShzcHUpLT5jYWNoZS50Y2xhc3NfaWQpOworfQorCitzdGF0aWMgdTY0IG1mY190Y2xhc3NfaWRfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X3BkYXRhKHNwdSktPmNhY2hlLnRjbGFzc19pZDsKK30KKworc3RhdGljIHZvaWQgdGxiX2ludmFsaWRhdGUoc3RydWN0IHNwdSAqc3B1KQoreworCS8qIE5vdGhpbmcgdG8gZG8uICovCit9CisKK3N0YXRpYyB2b2lkIHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgaWQpCit7CisJLyogTm8gc3VwcG9ydC4gKi8KK30KKworc3RhdGljIHU2NCByZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gMDsgLyogTm8gc3VwcG9ydC4gKi8KK30KKworc3RhdGljIHZvaWQgcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IGVuYWJsZSkKK3sKKwkvKiBObyBzdXBwb3J0LiAqLworfQorCitzdGF0aWMgdTY0IHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIDA7IC8qIE5vIHN1cHBvcnQuICovCit9CisKK2NvbnN0IHN0cnVjdCBzcHVfcHJpdjFfb3BzIHNwdV9wcml2MV9wczNfb3BzID0geworCS5pbnRfbWFza19hbmQgPSBpbnRfbWFza19hbmQsCisJLmludF9tYXNrX29yID0gaW50X21hc2tfb3IsCisJLmludF9tYXNrX3NldCA9IGludF9tYXNrX3NldCwKKwkuaW50X21hc2tfZ2V0ID0gaW50X21hc2tfZ2V0LAorCS5pbnRfc3RhdF9jbGVhciA9IGludF9zdGF0X2NsZWFyLAorCS5pbnRfc3RhdF9nZXQgPSBpbnRfc3RhdF9nZXQsCisJLmNwdV9hZmZpbml0eV9zZXQgPSBjcHVfYWZmaW5pdHlfc2V0LAorCS5tZmNfZGFyX2dldCA9IG1mY19kYXJfZ2V0LAorCS5tZmNfZHNpc3Jfc2V0ID0gbWZjX2RzaXNyX3NldCwKKwkubWZjX2RzaXNyX2dldCA9IG1mY19kc2lzcl9nZXQsCisJLm1mY19zZHJfc2V0dXAgPSBtZmNfc2RyX3NldHVwLAorCS5tZmNfc3IxX3NldCA9IG1mY19zcjFfc2V0LAorCS5tZmNfc3IxX2dldCA9IG1mY19zcjFfZ2V0LAorCS5tZmNfdGNsYXNzX2lkX3NldCA9IG1mY190Y2xhc3NfaWRfc2V0LAorCS5tZmNfdGNsYXNzX2lkX2dldCA9IG1mY190Y2xhc3NfaWRfZ2V0LAorCS50bGJfaW52YWxpZGF0ZSA9IHRsYl9pbnZhbGlkYXRlLAorCS5yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfc2V0ID0gcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX3NldCwKKwkucmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX2dldCA9IHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9nZXQsCisJLnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldCA9IHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldCwKKwkucmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0ID0gcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0LAorfTsKKwordm9pZCBwczNfc3B1X3NldF9wbGF0Zm9ybSh2b2lkKQoreworCXNwdV9wcml2MV9vcHMgPSAmc3B1X3ByaXYxX3BzM19vcHM7CisJc3B1X21hbmFnZW1lbnRfb3BzID0gJnNwdV9tYW5hZ2VtZW50X3BzM19vcHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhZThiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqICBQUzMgdGltZSBhbmQgcnRjIHJvdXRpbmVzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBkdW1wX3RtKF9hKSBfZHVtcF90bShfYSwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfdG0oY29uc3Qgc3RydWN0IHJ0Y190aW1lICp0bSwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkIHRtX3NlYyAgJWRcbiIsIGZ1bmMsIGxpbmUsIHRtLT50bV9zZWMpOworCXByX2RlYnVnKCIlczolZCB0bV9taW4gICVkXG4iLCBmdW5jLCBsaW5lLCB0bS0+dG1fbWluKTsKKwlwcl9kZWJ1ZygiJXM6JWQgdG1faG91ciAlZFxuIiwgZnVuYywgbGluZSwgdG0tPnRtX2hvdXIpOworCXByX2RlYnVnKCIlczolZCB0bV9tZGF5ICVkXG4iLCBmdW5jLCBsaW5lLCB0bS0+dG1fbWRheSk7CisJcHJfZGVidWcoIiVzOiVkIHRtX21vbiAgJWRcbiIsIGZ1bmMsIGxpbmUsIHRtLT50bV9tb24pOworCXByX2RlYnVnKCIlczolZCB0bV95ZWFyICVkXG4iLCBmdW5jLCBsaW5lLCB0bS0+dG1feWVhcik7CisJcHJfZGVidWcoIiVzOiVkIHRtX3dkYXkgJWRcbiIsIGZ1bmMsIGxpbmUsIHRtLT50bV93ZGF5KTsKK30KKworI2RlZmluZSBkdW1wX3RpbWUoX2EpIF9kdW1wX3RpbWUoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF90aW1lKGludCB0aW1lLCBjb25zdCBjaGFyKiBmdW5jLAorCWludCBsaW5lKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCXRvX3RtKHRpbWUsICZ0bSk7CisKKwlwcl9kZWJ1ZygiJXM6JWQgdGltZSAgICAlZFxuIiwgZnVuYywgbGluZSwgdGltZSk7CisJX2R1bXBfdG0oJnRtLCBmdW5jLCBsaW5lKTsKK30KKworLyoqCisgKiBydGNfc2hpZnQgLSBEaWZmZXJlbmNlIGluIHNlY29uZHMgYmV0d2VlbiAxOTcwIGFuZCB0aGUgcHMzIHJ0YyB2YWx1ZS4KKyAqLworCitzdGF0aWMgczY0IHJ0Y19zaGlmdDsKKwordm9pZCBfX2luaXQgcHMzX2NhbGlicmF0ZV9kZWNyKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdG1wOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9iZV90Yl9mcmVxKDAsICZ0bXApOworCUJVR19PTihyZXN1bHQpOworCisJcHBjX3RiX2ZyZXEgPSB0bXA7CisJcHBjX3Byb2NfZnJlcSA9IHBwY190Yl9mcmVxICogNDA7CisKKwlydGNfc2hpZnQgPSBwczNfb3NfYXJlYV9ydGNfZGlmZigpOworfQorCitzdGF0aWMgdTY0IHJlYWRfcnRjKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgcnRjX3ZhbDsKKwl1NjQgdGJfdmFsOworCisJcmVzdWx0ID0gbHYxX2dldF9ydGMoJnJ0Y192YWwsICZ0Yl92YWwpOworCUJVR19PTihyZXN1bHQpOworCisJcmV0dXJuIHJ0Y192YWw7Cit9CisKK2ludCBwczNfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTY0IG5vdyA9IG1rdGltZSh0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJcnRjX3NoaWZ0ID0gbm93IC0gcmVhZF9ydGMoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwczNfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdG9fdG0ocmVhZF9ydGMoKSArIHJ0Y19zaGlmdCwgdG0pOworCXRtLT50bV95ZWFyIC09IDE5MDA7CisJdG0tPnRtX21vbiAtPSAxOworfQorCit1bnNpZ25lZCBsb25nIF9faW5pdCBwczNfZ2V0X2Jvb3RfdGltZSh2b2lkKQoreworCXJldHVybiByZWFkX3J0YygpICsgcnRjX3NoaWZ0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwppbmRleCA1NTZjMjc5Li4zYzk1MzkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJdGJsLT5pdF9zaXplID0gc2l6ZSA+PiBJT01NVV9QQUdFX1NISUZUOwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfcFNlcmllcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgcGNpX2RtYV9idXNfc2V0dXBfcFNlcmllcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CkBAIC0zMTgsMTAgKzMxOCw5IEBACiAJc3RydWN0IHBjaV9kbiAqcGNpOwogCWludCBjaGlsZHJlbjsKIAotCURCRygiaW9tbXVfYnVzX3NldHVwX3BTZXJpZXMsIGJ1cyAlcCwgYnVzLT5zZWxmICVwXG4iLCBidXMsIGJ1cy0+c2VsZik7Ci0KIAlkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwotCXBjaSA9IFBDSV9ETihkbik7CisKKwlEQkcoInBjaV9kbWFfYnVzX3NldHVwX3BTZXJpZXM6IHNldHRpbmcgdXAgYnVzICVzXG4iLCBkbi0+ZnVsbF9uYW1lKTsKIAogCWlmIChidXMtPnNlbGYpIHsKIAkJLyogVGhpcyBpcyBub3QgYSByb290IGJ1cywgYW55IHNldHVwIHdpbGwgYmUgZG9uZSBmb3IgdGhlCkBAIC0zMjksNiArMzI4LDcgQEAKIAkJICovCiAJCXJldHVybjsKIAl9CisJcGNpID0gUENJX0ROKGRuKTsKIAogCS8qIENoZWNrIGlmIHRoZSBJU0EgYnVzIG9uIHRoZSBzeXN0ZW0gaXMgdW5kZXIKIAkgKiB0aGlzIFBIQi4KQEAgLTM5MCwxNyArMzkwLDE3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX3BTZXJpZXNMUChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgcGNpX2RtYV9idXNfc2V0dXBfcFNlcmllc0xQKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBkbjsKIAlzdHJ1Y3QgcGNpX2RuICpwcGNpOwogCWNvbnN0IHZvaWQgKmRtYV93aW5kb3cgPSBOVUxMOwogCi0JREJHKCJpb21tdV9idXNfc2V0dXBfcFNlcmllc0xQLCBidXMgJXAsIGJ1cy0+c2VsZiAlcFxuIiwgYnVzLCBidXMtPnNlbGYpOwotCiAJZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKIAorCURCRygicGNpX2RtYV9idXNfc2V0dXBfcFNlcmllc0xQOiBzZXR0aW5nIHVwIGJ1cyAlc1xuIiwgZG4tPmZ1bGxfbmFtZSk7CisKIAkvKiBGaW5kIG5lYXJlc3QgaWJtLGRtYS13aW5kb3csIHdhbGtpbmcgdXAgdGhlIGRldmljZSB0cmVlICovCiAJZm9yIChwZG4gPSBkbjsgcGRuICE9IE5VTEw7IHBkbiA9IHBkbi0+cGFyZW50KSB7CiAJCWRtYV93aW5kb3cgPSBnZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKQEAgLTQwOSwxMSArNDA5LDE1IEBACiAJfQogCiAJaWYgKGRtYV93aW5kb3cgPT0gTlVMTCkgewotCQlEQkcoImlvbW11X2J1c19zZXR1cF9wU2VyaWVzTFA6IGJ1cyAlcyBzZWVtcyB0byBoYXZlIG5vIGlibSxkbWEtd2luZG93IHByb3BlcnR5XG4iLCBkbi0+ZnVsbF9uYW1lKTsKKwkJREJHKCIgIG5vIGlibSxkbWEtd2luZG93IHByb3BlcnR5ICFcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJcHBjaSA9IFBDSV9ETihwZG4pOworCisJREJHKCIgIHBhcmVudCBpcyAlcywgaW9tbXVfdGFibGU6IDB4JXBcbiIsCisJICAgIHBkbi0+ZnVsbF9uYW1lLCBwcGNpLT5pb21tdV90YWJsZSk7CisKIAlpZiAoIXBwY2ktPmlvbW11X3RhYmxlKSB7CiAJCS8qIEJ1c3N1Ym5vIGhhc24ndCBiZWVuIGNvcGllZCB5ZXQuCiAJCSAqIERvIGl0IG5vdyBiZWNhdXNlIGlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIgbmVlZHMgaXQuCkBAIC00MjcsNiArNDMxLDcgQEAKIAkJaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhcihwcGNpLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKIAogCQlwcGNpLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsLCBwcGNpLT5waGItPm5vZGUpOworCQlEQkcoIiAgY3JlYXRlZCB0YWJsZTogJXBcbiIsIHBwY2ktPmlvbW11X3RhYmxlKTsKIAl9CiAKIAlpZiAocGRuICE9IGRuKQpAQCAtNDM0LDI3ICs0MzksMjcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfcFNlcmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX2RtYV9kZXZfc2V0dXBfcFNlcmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sICpteWRuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CiAKLQlEQkcoImlvbW11X2Rldl9zZXR1cF9wU2VyaWVzLCBkZXYgJXAgKCVzKVxuIiwgZGV2LCBwY2lfbmFtZShkZXYpKTsKKwlEQkcoInBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXM6ICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKIAotCW15ZG4gPSBkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCWRuID0gZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZTsKIAogCS8qIElmIHdlJ3JlIHRoZSBkaXJlY3QgY2hpbGQgb2YgYSByb290IGJ1cywgdGhlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlCiAJICogYW4gaW9tbXUgdGFibGUgb3Vyc2VsdmVzLiBUaGUgYnVzIHNldHVwIGNvZGUgc2hvdWxkIGhhdmUgc2V0dXAKIAkgKiB0aGUgd2luZG93IHNpemVzIGFscmVhZHkuCiAJICovCiAJaWYgKCFkZXYtPmJ1cy0+c2VsZikgeworCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYiA9IFBDSV9ETihkbiktPnBoYjsKKwogCQlEQkcoIiAtLT4gZmlyc3QgY2hpbGQsIG5vIGJyaWRnZS4gQWxsb2NhdGluZyBpb21tdSB0YWJsZS5cbiIpOwogCQl0YmwgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwsCi0JCQkJICAgUENJX0ROKGRuKS0+cGhiLT5ub2RlKTsKLQkJaW9tbXVfdGFibGVfc2V0cGFybXMoUENJX0ROKGRuKS0+cGhiLCBkbiwgdGJsKTsKLQkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCwKLQkJCQkJCVBDSV9ETihkbiktPnBoYi0+bm9kZSk7Ci0KKwkJCQkgICBwaGItPm5vZGUpOworCQlpb21tdV90YWJsZV9zZXRwYXJtcyhwaGIsIGRuLCB0YmwpOworCQlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9IGlvbW11X2luaXRfdGFibGUodGJsLCBwaGItPm5vZGUpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NjUsMTEgKzQ3MCwxMSBAQAogCXdoaWxlIChkbiAmJiBQQ0lfRE4oZG4pICYmIFBDSV9ETihkbiktPmlvbW11X3RhYmxlID09IE5VTEwpCiAJCWRuID0gZG4tPnBhcmVudDsKIAotCWlmIChkbiAmJiBQQ0lfRE4oZG4pKSB7Ci0JCVBDSV9ETihteWRuKS0+aW9tbXVfdGFibGUgPSBQQ0lfRE4oZG4pLT5pb21tdV90YWJsZTsKLQl9IGVsc2UgewotCQlEQkcoImlvbW11X2Rldl9zZXR1cF9wU2VyaWVzLCBkZXYgJXAgKCVzKSBoYXMgbm8gaW9tbXUgdGFibGVcbiIsIGRldiwgcGNpX25hbWUoZGV2KSk7Ci0JfQorCWlmIChkbiAmJiBQQ0lfRE4oZG4pKQorCQlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9IFBDSV9ETihkbiktPmlvbW11X3RhYmxlOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW9tbXU6IERldmljZSAlcyBoYXMgbm8gaW9tbXUgdGFibGVcbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKIH0KIAogc3RhdGljIGludCBpb21tdV9yZWNvbmZpZ19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqbm9kZSkKQEAgLTQ5NSwxMyArNTAwLDE1IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBpb21tdV9yZWNvbmZpZ19ub3RpZmllciwKIH07CiAKLXN0YXRpYyB2b2lkIGlvbW11X2Rldl9zZXR1cF9wU2VyaWVzTFAoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXNMUChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGRuLCAqZG47CiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CiAJY29uc3Qgdm9pZCAqZG1hX3dpbmRvdyA9IE5VTEw7CiAJc3RydWN0IHBjaV9kbiAqcGNpOwogCisJREJHKCJwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzTFA6ICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKwogCS8qIGRldiBzZXR1cCBmb3IgTFBBUiBpcyBhIGxpdHRsZSB0cmlja3ksIHNpbmNlIHRoZSBkZXZpY2UgdHJlZSBtaWdodAogCSAqIGNvbnRhaW4gdGhlIGRtYS13aW5kb3cgcHJvcGVydGllcyBwZXItZGV2aWNlIGFuZCBub3QgbmVjY2VzYXJpbHkKIAkgKiBmb3IgdGhlIGJ1cy4gU28gd2UgbmVlZCB0byBzZWFyY2ggdXB3YXJkcyBpbiB0aGUgdHJlZSB1bnRpbCB3ZQpAQCAtNTA5LDkgKzUxNiw3IEBACiAJICogYWxyZWFkeSBhbGxvY2F0ZWQuCiAJICovCiAJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKLQotCURCRygiaW9tbXVfZGV2X3NldHVwX3BTZXJpZXNMUCwgZGV2ICVwICglcykgJXNcbiIsCi0JICAgICBkZXYsIHBjaV9uYW1lKGRldiksIGRuLT5mdWxsX25hbWUpOworCURCRygiICBub2RlIGlzICVzXG4iLCBkbi0+ZnVsbF9uYW1lKTsKIAogCWZvciAocGRuID0gZG47IHBkbiAmJiBQQ0lfRE4ocGRuKSAmJiAhUENJX0ROKHBkbiktPmlvbW11X3RhYmxlOwogCSAgICAgcGRuID0gcGRuLT5wYXJlbnQpIHsKQEAgLTUyMCwxNiArNTI1LDE3IEBACiAJCQlicmVhazsKIAl9CiAKKwlEQkcoIiAgcGFyZW50IGlzICVzXG4iLCBwZG4tPmZ1bGxfbmFtZSk7CisKIAkvKiBDaGVjayBmb3IgcGFyZW50ID09IE5VTEwgc28gd2UgZG9uJ3QgdHJ5IHRvIHNldHVwIHRoZSBlbXB0eSBFQURTCiAJICogc2xvdHMgb24gUE9XRVI0IG1hY2hpbmVzLgogCSAqLwogCWlmIChkbWFfd2luZG93ID09IE5VTEwgfHwgcGRuLT5wYXJlbnQgPT0gTlVMTCkgewotCQlEQkcoIk5vIGRtYSB3aW5kb3cgZm9yIGRldmljZSwgbGlua2luZyB0byBwYXJlbnRcbiIpOwotCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9IFBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKKwkJREJHKCIgIG5vIGRtYSB3aW5kb3cgZm9yIGRldmljZSwgbGlua2luZyB0byBwYXJlbnRcbiIpOworCQlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9IFBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKIAkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCURCRygiRm91bmQgRE1BIHdpbmRvdywgYWxsb2NhdGluZyB0YWJsZVxuIik7CiAJfQorCURCRygiICBmb3VuZCBETUEgd2luZG93LCB0YWJsZTogJXBcbiIsIHBjaS0+aW9tbXVfdGFibGUpOwogCiAJcGNpID0gUENJX0ROKHBkbik7CiAJaWYgKCFwY2ktPmlvbW11X3RhYmxlKSB7CkBAIC01NDIsMjQgKzU0OCwyMCBAQAogCQlpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CiAKIAkJcGNpLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsLCBwY2ktPnBoYi0+bm9kZSk7CisJCURCRygiICBjcmVhdGVkIHRhYmxlOiAlcFxuIiwgcGNpLT5pb21tdV90YWJsZSk7CiAJfQogCi0JaWYgKHBkbiAhPSBkbikKLQkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSBwY2ktPmlvbW11X3RhYmxlOworCWRldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gcGNpLT5pb21tdV90YWJsZTsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX251bGwoc3RydWN0IHBjaV9idXMgKmIpIHsgfQotc3RhdGljIHZvaWQgaW9tbXVfZGV2X3NldHVwX251bGwoc3RydWN0IHBjaV9kZXYgKmQpIHsgfQotCiAvKiBUaGVzZSBhcmUgY2FsbGVkIHZlcnkgZWFybHkuICovCiB2b2lkIGlvbW11X2luaXRfZWFybHlfcFNlcmllcyh2b2lkKQogewogCWlmIChvZl9jaG9zZW4gJiYgZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKSB7CiAJCS8qIERpcmVjdCBJL08sIElPTU1VIG9mZiAqLwotCQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7Ci0JCXBwY19tZC5pb21tdV9idXNfc2V0dXAgPSBpb21tdV9idXNfc2V0dXBfbnVsbDsKLQkJcGNpX2RpcmVjdF9pb21tdV9pbml0KCk7Ci0KKwkJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gTlVMTDsKKwkJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwID0gTlVMTDsKKwkJcGNpX2RtYV9vcHMgPSAmZG1hX2RpcmVjdF9vcHM7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU3MiwxOSArNTc0LDE5IEBACiAJCQlwcGNfbWQudGNlX2ZyZWUJID0gdGNlX2ZyZWVfcFNlcmllc0xQOwogCQl9CiAJCXBwY19tZC50Y2VfZ2V0ICAgPSB0Y2VfZ2V0X3BTZXJpZXNMUDsKLQkJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9wU2VyaWVzTFA7Ci0JCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfcFNlcmllc0xQOworCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzTFA7CisJCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXNMUDsKIAl9IGVsc2UgewogCQlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX3BTZXJpZXM7CiAJCXBwY19tZC50Y2VfZnJlZSAgPSB0Y2VfZnJlZV9wU2VyaWVzOwogCQlwcGNfbWQudGNlX2dldCAgID0gdGNlX2dldF9wc2VyaWVzOwotCQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX3BTZXJpZXM7Ci0JCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfcFNlcmllczsKKwkJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwID0gcGNpX2RtYV9idXNfc2V0dXBfcFNlcmllczsKKwkJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gcGNpX2RtYV9kZXZfc2V0dXBfcFNlcmllczsKIAl9CiAKIAogCXBTZXJpZXNfcmVjb25maWdfbm90aWZpZXJfcmVnaXN0ZXIoJmlvbW11X3JlY29uZmlnX25iKTsKIAotCXBjaV9pb21tdV9pbml0KCk7CisJcGNpX2RtYV9vcHMgPSAmZG1hX2lvbW11X29wczsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKaW5kZXggMTgyMGEwYi4uNzIxNDM2ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAl9CiB9CiAKLWxvbmcgcFNlcmllc19scGFyX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwKK3N0YXRpYyBsb25nIHBTZXJpZXNfbHBhcl9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCiAgCQkJICAgICAgdW5zaWduZWQgbG9uZyB2YSwgdW5zaWduZWQgbG9uZyBwYSwKICAJCQkgICAgICB1bnNpZ25lZCBsb25nIHJmbGFncywgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsCiAgCQkJICAgICAgaW50IHBzaXplKQpAQCAtNTA2LDcgKzUwNiw3IEBACiAgKiBUYWtlIGEgc3BpbmxvY2sgYXJvdW5kIGZsdXNoZXMgdG8gYXZvaWQgYm91bmNpbmcgdGhlIGh5cGVydmlzb3IgdGxiaWUKICAqIGxvY2suCiAgKi8KLXZvaWQgcFNlcmllc19scGFyX2ZsdXNoX2hhc2hfcmFuZ2UodW5zaWduZWQgbG9uZyBudW1iZXIsIGludCBsb2NhbCkKK3N0YXRpYyB2b2lkIHBTZXJpZXNfbHBhcl9mbHVzaF9oYXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgbnVtYmVyLCBpbnQgbG9jYWwpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKaW5kZXggNDEwYTZiYy4uNzE1ZGI1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYwpAQCAtMjksOCArMjksNiBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KIAotc3RhdGljIGludCBfX2RldmluaXRkYXRhIHM3YV93b3JrYXJvdW5kID0gLTE7Ci0KICNpZiAwCiB2b2lkIHBjaWJpb3NfbmFtZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTU3LDM5ICs1NSw2IEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpYmlvc19uYW1lX2RldmljZSk7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGNoZWNrX3M3YSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdDsKLQljb25zdCBjaGFyICptb2RlbDsKLQotCXM3YV93b3JrYXJvdW5kID0gMDsKLQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQlpZiAocm9vdCkgewotCQltb2RlbCA9IGdldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKLQkJaWYgKG1vZGVsICYmICFzdHJjbXAobW9kZWwsICJJQk0sNzAxMy1TN0EiKSkKLQkJCXM3YV93b3JrYXJvdW5kID0gMTsKLQkJb2Zfbm9kZV9wdXQocm9vdCk7Ci0JfQotfQotCi12b2lkIF9fZGV2aW5pdCBwU2VyaWVzX2lycV9idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCi0JaWYgKHM3YV93b3JrYXJvdW5kIDwgMCkKLQkJY2hlY2tfczdhKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7Ci0JCWlmIChzN2Ffd29ya2Fyb3VuZCkgewotCQkJaWYgKGRldi0+aXJxID4gMTYpIHsKLQkJCQlkZXYtPmlycSAtPSAzOwotCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKLQkJCQkJZGV2LT5pcnEpOwotCQkJfQotCQl9Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcFNlcmllc19yZXF1ZXN0X3JlZ2lvbnModm9pZCkKIHsKIAlpZiAoIWlzYV9pb19iYXNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCmluZGV4IDZiZmFjYzIuLmFjNTZiODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKQEAgLTkzLDggKzkzLDggQEAKIAkJaWYgKGxpc3RfZW1wdHkoJmRldi0+Z2xvYmFsX2xpc3QpKSB7CiAJCQlpbnQgaTsKIAotCQkJLyogTmVlZCB0byBzZXR1cCBJT01NVSB0YWJsZXMgKi8KLQkJCXBwY19tZC5pb21tdV9kZXZfc2V0dXAoZGV2KTsKKwkJCS8qIEZpbGwgZGV2aWNlIGFyY2hkYXRhIGFuZCBzZXR1cCBpb21tdSB0YWJsZSAqLworCQkJcGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKGRldik7CiAKIAkJCWlmKGZpeF9idXMpCiAJCQkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldiwgYnVzKTsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXBoYiA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkbik7CiAJaWYgKCFwaGIpCiAJCXJldHVybiBOVUxMOwotCXNldHVwX3BoYihkbiwgcGhiKTsKKwlydGFzX3NldHVwX3BoYihwaGIpOwogCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMocGhiLCBkbiwgMCk7CiAKIAlwY2lfc2V0dXBfcGhiX2lvX2R5bmFtaWMocGhiLCBwcmltYXJ5KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKaW5kZXggMTc3MzEwMy4uNGFkMzNlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKQEAgLTI2OCwxMSArMjY4LDEwIEBACiBzdGF0aWMgc3RydWN0IHByb3BlcnR5ICpuZXdfcHJvcGVydHkoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgaW50IGxlbmd0aCwKIAkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHVlLCBzdHJ1Y3QgcHJvcGVydHkgKmxhc3QpCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpuZXcgPSBrbWFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHByb3BlcnR5ICpuZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIW5ldykKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KG5ldywgMCwgc2l6ZW9mKCpuZXcpKTsKIAogCWlmICghKG5ldy0+bmFtZSA9IGttYWxsb2Moc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCkpKQogCQlnb3RvIGNsZWFudXA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IDg5YTgxMTkuLjBkYzI1NDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zNDcsNiArMzQ3LDcgQEAKIH0KIGFyY2hfaW5pdGNhbGwocFNlcmllc19pbml0X3BhbmVsKTsKIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIHZvaWQgcFNlcmllc19tYWNoX2NwdV9kaWUodm9pZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtMzU3LDYgKzM1OCw5IEBACiAJQlVHKCk7CiAJZm9yKDs7KTsKIH0KKyNlbHNlCisjZGVmaW5lIHBTZXJpZXNfbWFjaF9jcHVfZGllIE5VTEwKKyNlbmRpZgogCiBzdGF0aWMgaW50IHBzZXJpZXNfc2V0X2RhYnIodW5zaWduZWQgbG9uZyBkYWJyKQogewpAQCAtNTUzLDcgKzU1Nyw2IEBACiAJLmxvZ19lcnJvcgkJPSBwU2VyaWVzX2xvZ19lcnJvciwKIAkucGNpYmlvc19maXh1cAkJPSBwU2VyaWVzX2ZpbmFsX2ZpeHVwLAogCS5wY2lfcHJvYmVfbW9kZQkJPSBwU2VyaWVzX3BjaV9wcm9iZV9tb2RlLAotCS5pcnFfYnVzX3NldHVwCQk9IHBTZXJpZXNfaXJxX2J1c19zZXR1cCwKIAkucmVzdGFydAkJPSBydGFzX3Jlc3RhcnQsCiAJLnBvd2VyX29mZgkJPSBydGFzX3Bvd2VyX29mZiwKIAkuaGFsdAkJCT0gcnRhc19oYWx0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggZDA3MWFiZS4uYjViMmIxMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC02NTYsMTMgKzY1NiwzOCBAQAogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGNhc2NhZGUsIHBzZXJpZXNfODI1OV9jYXNjYWRlKTsKIH0KIAorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1aWRfdG9fb2Zfbm9kZShpbnQgY3B1KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTMyIGhjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgImNwdSIpIHsKKwkJaW50IGksIGxlbjsKKwkJY29uc3QgdTMyICppbnRzZXJ2OworCisJCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCisJCWlmICghaW50c2VydikKKwkJCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCAmbGVuKTsKKworCQlpID0gbGVuIC8gc2l6ZW9mKHUzMik7CisKKwkJd2hpbGUgKGktLSkKKwkJCWlmIChpbnRzZXJ2W2ldID09IGhjcHVpZCkKKwkJCQlyZXR1cm4gbnA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIHZvaWQgX19pbml0IHhpY3NfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXUzMiBpbGVuLCBpbmR4ID0gMDsKLQljb25zdCB1MzIgKmlyZWc7CisJY29uc3QgdTMyICppcmVnLCAqaXNpemU7CiAJaW50IGZvdW5kID0gMDsKKwl1MzIgaGNwdWlkOwogCiAJcHBjNjRfYm9vdF9tc2coMHgyMCwgIlhJQ1MgSW5pdCIpOwogCkBAIC02ODMsMjYgKzcwOCwzMSBAQAogCXhpY3NfaW5pdF9ob3N0KCk7CiAKIAkvKiBGaW5kIHRoZSBzZXJ2ZXIgbnVtYmVycyBmb3IgdGhlIGJvb3QgY3B1LiAqLwotCWZvciAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7Ci0JICAgICBucDsKLQkgICAgIG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJjcHUiKSkgewotCQlpcmVnID0gZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJmlsZW4pOwotCQlpZiAoaXJlZyAmJiBpcmVnWzBdID09IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCkpIHsKLQkJCWlyZWcgPSBnZXRfcHJvcGVydHkobnAsCi0JCQkJCSJpYm0scHBjLWludGVycnVwdC1nc2VydmVyI3MiLCAmaWxlbik7Ci0JCQlpID0gaWxlbiAvIHNpemVvZihpbnQpOwotCQkJaWYgKGlyZWcgJiYgaSA+IDApIHsKLQkJCQlkZWZhdWx0X3NlcnZlciA9IGlyZWdbMF07Ci0JCQkJLyogdGFrZSBsYXN0IGVsZW1lbnQgKi8KLQkJCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tpLTFdOwotCQkJfQotCQkJaXJlZyA9IGdldF9wcm9wZXJ0eShucCwKKwlucCA9IGNwdWlkX3RvX29mX25vZGUoYm9vdF9jcHVpZCk7CisJQlVHX09OKCFucCk7CisJaXJlZyA9IGdldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIsICZpbGVuKTsKKwlpZiAoIWlyZWcpCisJCWdvdG8gc2tpcF9nc2VydmVyX2NoZWNrOworCWkgPSBpbGVuIC8gc2l6ZW9mKGludCk7CisJaGNwdWlkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChib290X2NwdWlkKTsKKworCS8qIEdsb2JhbCBpbnRlcnJ1cHQgZGlzdHJpYnV0aW9uIHNlcnZlciBpcyBzcGVjaWZpZWQgaW4gdGhlIGxhc3QKKwkgKiBlbnRyeSBvZiAiaWJtLHBwYy1pbnRlcnJ1cHQtZ3NlcnZlciNzIiBwcm9wZXJ0eS4gR2V0IHRoZSBsYXN0CisJICogZW50cnkgZm9tIHRoaXMgcHJvcGVydHkgZm9yIGN1cnJlbnQgYm9vdCBjcHUgaWQgYW5kIHVzZSBpdCBhcworCSAqIGRlZmF1bHQgZGlzdHJpYnV0aW9uIHNlcnZlcgorCSAqLworCWZvciAoaiA9IDA7IGogPCBpOyBqICs9IDIpIHsKKwkJaWYgKGlyZWdbal0gPT0gaGNwdWlkKSB7CisJCQlkZWZhdWx0X3NlcnZlciA9IGhjcHVpZDsKKwkJCWRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXIgPSBpcmVnW2orMV07CisKKwkJCWlzaXplID0gZ2V0X3Byb3BlcnR5KG5wLAogCQkJCQkiaWJtLGludGVycnVwdC1zZXJ2ZXIjLXNpemUiLCBOVUxMKTsKLQkJCWlmIChpcmVnKQotCQkJCWludGVycnVwdF9zZXJ2ZXJfc2l6ZSA9ICppcmVnOwotCQkJYnJlYWs7CisJCQlpZiAoaXNpemUpCisJCQkJaW50ZXJydXB0X3NlcnZlcl9zaXplID0gKmlzaXplOwogCQl9CiAJfQorc2tpcF9nc2VydmVyX2NoZWNrOgogCW9mX25vZGVfcHV0KG5wKTsKIAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggOTFmMDUyZC4uNmNjMzQ1OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDE0ICs1LDEzIEBACiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubwogb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDX01QQzEwNikJKz0gZ3JhY2tsZS5vCi1vYmotJChDT05GSUdfQk9PS0UpCQkrPSBkY3Iubwotb2JqLSQoQ09ORklHXzQweCkJCSs9IGRjci5vCitvYmotJChDT05GSUdfUFBDX0RDUikJCSs9IGRjci5vIGRjci1sb3cubwogb2JqLSQoQ09ORklHX1UzX0RBUlQpCQkrPSBkYXJ0X2lvbW11Lm8KIG9iai0kKENPTkZJR19NTUlPX05WUkFNKQkrPSBtbWlvX252cmFtLm8KIG9iai0kKENPTkZJR19GU0xfU09DKQkJKz0gZnNsX3NvYy5vCi1vYmotJChDT05GSUdfUFBDX1RPREMpCQkrPSB0b2RjLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCitvYmotJChDT05GSUdfTVREKQkJKz0gcm9tLm8KIAogaWZlcSAoJChDT05GSUdfUFBDX01FUkdFKSx5KQogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKaW5kZXggNTcyYjc4NC4uMTQ4ODUzNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTQ4LDkgKzQ4LDYgQEAKIAogI2luY2x1ZGUgImRhcnQuaCIKIAotZXh0ZXJuIGludCBpb21tdV9pc19vZmY7Ci1leHRlcm4gaW50IGlvbW11X2ZvcmNlX29uOwotCiAvKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIERBUlQgdGFibGUgKi8KIHVuc2lnbmVkIGxvbmcgZGFydF90YWJsZWJhc2U7IC8qIGV4cG9ydGVkIHRvIGh0YWJfaW5pdGlhbGl6ZSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZGFydF90YWJsZXNpemU7CkBAIC0yODksMjQgKzI4NiwxNSBAQAogCXNldF9iaXQoaW9tbXVfdGFibGVfZGFydC5pdF9zaXplIC0gMSwgaW9tbXVfdGFibGVfZGFydC5pdF9tYXApOwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX2RtYV9kZXZfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0KIAkvKiBXZSBvbmx5IGhhdmUgb25lIGlvbW11IHRhYmxlIG9uIHRoZSBtYWMgZm9yIG5vdywgd2hpY2ggbWFrZXMKIAkgKiB0aGluZ3Mgc2ltcGxlLiBTZXR1cCBhbGwgUENJIGRldmljZXMgdG8gcG9pbnQgdG8gdGhpcyB0YWJsZQotCSAqCi0JICogV2UgbXVzdCB1c2UgcGNpX2RldmljZV90b19PRl9ub2RlKCkgdG8gbWFrZSBzdXJlIHRoYXQKLQkgKiB3ZSBnZXQgdGhlIHJlYWwgImZpbmFsIiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgaW4gdGhlCi0JICogcGNpX2RldiBzeXNkYXRhIGFuZCBub3QgdGhlIHRlbXBvcmFyeSBQSEIgb25lCiAJICovCi0JZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKLQotCWlmIChkbikKLQkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfZGFydDsKKwlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9ICZpb21tdV90YWJsZV9kYXJ0OwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgcGNpX2RtYV9idXNfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAKQEAgLTMyMSw5ICszMDksNiBAQAogCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV9kYXJ0OwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9udWxsKHN0cnVjdCBwY2lfYnVzICpidXMpIHsgfQotCiB2b2lkIGlvbW11X2luaXRfZWFybHlfZGFydCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CkBAIC0zNDQsMjIgKzMyOSwyMSBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgREFSVCBIVyAqLwogCWlmIChkYXJ0X2luaXQoZG4pID09IDApIHsKLQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9kYXJ0OwotCQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX2RhcnQ7CisJCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IHBjaV9kbWFfZGV2X3NldHVwX2RhcnQ7CisJCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IHBjaV9kbWFfYnVzX3NldHVwX2RhcnQ7CiAKIAkJLyogU2V0dXAgcGNpX2RtYSBvcHMgKi8KLQkJcGNpX2lvbW11X2luaXQoKTsKLQorCQlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOwogCQlyZXR1cm47CiAJfQogCiAgYmFpbDoKIAkvKiBJZiBpbml0IGZhaWxlZCwgdXNlIGRpcmVjdCBpb21tdSBhbmQgbnVsbCBzZXR1cCBmdW5jdGlvbnMgKi8KLQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7Ci0JcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOworCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IE5VTEw7CisJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwID0gTlVMTDsKIAogCS8qIFNldHVwIHBjaV9kbWEgb3BzICovCi0JcGNpX2RpcmVjdF9pb21tdV9pbml0KCk7CisJcGNpX2RtYV9vcHMgPSAmZG1hX2RpcmVjdF9vcHM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3ItbG93LlMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci1sb3cuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDc4ZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3ItbG93LlMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICJJbmRpcmVjdCIgRENSIGFjY2VzcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBFdWdlbmUgU3Vyb3ZlZ2luIDxlYnNAZWJzaG9tZS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNkZWZpbmUgRENSX0FDQ0VTU19QUk9MT0codGFibGUpIFwKKwlybHdpbm0gIHIzLHIzLDQsMTgsMjc7ICAgXAorCWxpcyAgICAgcjUsdGFibGVAaDsgICAgICBcCisJb3JpICAgICByNSxyNSx0YWJsZUBsOyAgIFwKKwlhZGQgICAgIHIzLHIzLHI1OyAgICAgICAgXAorCW10Y3RyICAgcjM7ICAgICAgICAgICAgICBcCisJYmN0cgorCitfR0xPQkFMKF9fbWZkY3IpCisJRENSX0FDQ0VTU19QUk9MT0coX19tZmRjcl90YWJsZSkKKworX0dMT0JBTChfX210ZGNyKQorCURDUl9BQ0NFU1NfUFJPTE9HKF9fbXRkY3JfdGFibGUpCisKK19fbWZkY3JfdGFibGU6CisJbWZkY3IgIHIzLDA7IGJscgorX19tdGRjcl90YWJsZToKKwltdGRjciAgMCxyNDsgYmxyCisKK2RjciAgICAgPSAxCisgICAgICAgIC5yZXB0ICAgMTAyMworCW1mZGNyICAgcjMsZGNyOyBibHIKKwltdGRjciAgIGRjcixyNDsgYmxyCisJZGNyICAgICA9IGRjciArIDEKKwkuZW5kcgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZWVhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKiAgICAgICAgICAgICAgICAgICAgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2Rjci5oPgorCit1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgZHM7CisJY29uc3QgdTMyICpkciA9IGdldF9wcm9wZXJ0eShucCwgImRjci1yZWciLCAmZHMpOworCisJaWYgKGRyID09IE5VTEwgfHwgZHMgJiAxIHx8IGluZGV4ID49IChkcyAvIDgpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBkcltpbmRleCAqIDJdOworfQorCit1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX2xlbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGRzOworCWNvbnN0IHUzMiAqZHIgPSBnZXRfcHJvcGVydHkobnAsICJkY3ItcmVnIiwgJmRzKTsKKworCWlmIChkciA9PSBOVUxMIHx8IGRzICYgMSB8fCBpbmRleCA+PSAoZHMgLyA4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZHJbaW5kZXggKiAyICsgMV07Cit9CisKKyNpZm5kZWYgQ09ORklHX1BQQ19EQ1JfTkFUSVZFCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBmaW5kX2Rjcl9wYXJlbnQoc3RydWN0IGRldmljZV9ub2RlICogbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhciwgKnRtcDsKKwljb25zdCB1MzIgKnA7CisKKwlmb3IgKHBhciA9IG9mX25vZGVfZ2V0KG5vZGUpOyBwYXI7KSB7CisJCWlmIChnZXRfcHJvcGVydHkocGFyLCAiZGNyLWNvbnRyb2xsZXIiLCBOVUxMKSkKKwkJCWJyZWFrOworCQlwID0gZ2V0X3Byb3BlcnR5KHBhciwgImRjci1wYXJlbnQiLCBOVUxMKTsKKwkJdG1wID0gcGFyOworCQlpZiAocCA9PSBOVUxMKQorCQkJcGFyID0gb2ZfZ2V0X3BhcmVudChwYXIpOworCQllbHNlCisJCQlwYXIgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcCk7CisJCW9mX25vZGVfcHV0KHRtcCk7CisJfQorCXJldHVybiBwYXI7Cit9CisKK3U2NCBvZl90cmFuc2xhdGVfZGNyX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCQkgICAgIHVuc2lnbmVkIGludCBkY3JfbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpvdXRfc3RyaWRlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJY29uc3QgdTMyICpwOworCXVuc2lnbmVkIGludCBzdHJpZGU7CisJdTY0IHJldDsKKworCWRwID0gZmluZF9kY3JfcGFyZW50KGRldik7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiBPRl9CQURfQUREUjsKKworCS8qIFN0cmlkZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZCB5ZXQsIGRlZmF1bHQgdG8gMHgxMCBmb3IgQXhvbiAqLworCXAgPSBnZXRfcHJvcGVydHkoZHAsICJkY3ItbW1pby1zdHJpZGUiLCBOVUxMKTsKKwlzdHJpZGUgPSAocCA9PSBOVUxMKSA/IDB4MTAgOiAqcDsKKworCS8qIFhYWCBGSVhNRTogV2hpY2ggcHJvcGVydHkgbmFtZSBpcyB0byB1c2Ugb2YgdGhlIDIgZm9sbG93aW5nID8gKi8KKwlwID0gZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tcmFuZ2UiLCBOVUxMKTsKKwlpZiAocCA9PSBOVUxMKQorCQlwID0gZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tc3BhY2UiLCBOVUxMKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gT0ZfQkFEX0FERFI7CisKKwkvKiBNYXliZSBjb3VsZCBkbyBzb21lIGJldHRlciByYW5nZSBjaGVja2luZyBoZXJlICovCisJcmV0ID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZHAsIHApOworCWlmIChyZXQgIT0gT0ZfQkFEX0FERFIpCisJCXJldCArPSAodTY0KShzdHJpZGUpICogKHU2NClkY3JfbjsKKwlpZiAob3V0X3N0cmlkZSkKKwkJKm91dF9zdHJpZGUgPSBzdHJpZGU7CisJcmV0dXJuIHJldDsKK30KKworZGNyX2hvc3RfdCBkY3JfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGNyX24sCisJCSAgIHVuc2lnbmVkIGludCBkY3JfYykKK3sKKwlkY3JfaG9zdF90IHJldCA9IHsgLnRva2VuID0gTlVMTCwgLnN0cmlkZSA9IDAgfTsKKwl1NjQgYWRkcjsKKworCXByX2RlYnVnKCJkY3JfbWFwKCVzLCAweCV4LCAweCV4KVxuIiwKKwkJIGRldi0+ZnVsbF9uYW1lLCBkY3JfbiwgZGNyX2MpOworCisJYWRkciA9IG9mX3RyYW5zbGF0ZV9kY3JfYWRkcmVzcyhkZXYsIGRjcl9uLCAmcmV0LnN0cmlkZSk7CisJcHJfZGVidWcoInRyYW5zbGF0ZXMgdG8gYWRkcjogMHglbHgsIHN0cmlkZTogMHgleFxuIiwKKwkJIGFkZHIsIHJldC5zdHJpZGUpOworCWlmIChhZGRyID09IE9GX0JBRF9BRERSKQorCQlyZXR1cm4gcmV0OworCXByX2RlYnVnKCJtYXBwaW5nIDB4JXggYnl0ZXNcbiIsIGRjcl9jICogcmV0LnN0cmlkZSk7CisJcmV0LnRva2VuID0gaW9yZW1hcChhZGRyLCBkY3JfYyAqIHJldC5zdHJpZGUpOworCWlmIChyZXQudG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuIHJldDsKKwlwcl9kZWJ1ZygibWFwcGVkIGF0IDB4JXAgLT4gYmFzZSBpcyAweCVwXG4iLAorCQkgcmV0LnRva2VuLCByZXQudG9rZW4gLSBkY3JfbiAqIHJldC5zdHJpZGUpOworCXJldC50b2tlbiAtPSBkY3JfbiAqIHJldC5zdHJpZGU7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkY3JfdW5tYXAoZGNyX2hvc3RfdCBob3N0LCB1bnNpZ25lZCBpbnQgZGNyX24sIHVuc2lnbmVkIGludCBkY3JfYykKK3sKKwlkY3JfaG9zdF90IGggPSBob3N0OworCisJaWYgKGgudG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuOworCWgudG9rZW4gLT0gZGNyX24gKiBoLnN0cmlkZTsKKwlpb3VubWFwKGgudG9rZW4pOworCWgudG9rZW4gPSBOVUxMOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQ19EQ1JfTkFUSVZFKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBkYmU5MmFlLi5hZDMxZTU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfZW5ldF9wZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3VhcnRfcGQuaD4KQEAgLTE0Niw3ICsxNDcsNyBAQAogCQl9CiAKIAkJZm9yIChrID0gMDsgayA8IDMyOyBrKyspCi0JCQltZGlvX2RhdGEuaXJxW2tdID0gLTE7CisJCQltZGlvX2RhdGEuaXJxW2tdID0gUEhZX1BPTEw7CiAKIAkJd2hpbGUgKChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpICE9IE5VTEwpIHsKIAkJCWludCBpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChjaGlsZCwgMCk7CkBAIC0xNzcsNiArMTc4LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpnZmFyX3J4X2ludHIgPSAicngiOwogc3RhdGljIGNvbnN0IGNoYXIgKmdmYXJfZXJyX2ludHIgPSAiZXJyb3IiOwogCisKIHN0YXRpYyBpbnQgX19pbml0IGdmYXJfb2ZfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CkBAIC0yMDQsOCArMjA2LDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyOwogCi0JCXJbMV0uc3RhcnQgPSByWzFdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKIAogCQltb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CiAKQEAgLTIxNCwxMiArMjE1LDEwIEBACiAJCQlyWzFdLm5hbWUgPSBnZmFyX3R4X2ludHI7CiAKIAkJCXJbMl0ubmFtZSA9IGdmYXJfcnhfaW50cjsKLQkJCXJbMl0uc3RhcnQgPSByWzJdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAxKTsKLQkJCXJbMl0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwkJCW9mX2lycV90b19yZXNvdXJjZShucCwgMSwgJnJbMl0pOwogCiAJCQlyWzNdLm5hbWUgPSBnZmFyX2Vycl9pbnRyOwotCQkJclszXS5zdGFydCA9IHJbM10uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDIpOwotCQkJclszXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQkJb2ZfaXJxX3RvX3Jlc291cmNlKG5wLCAyLCAmclszXSk7CiAKIAkJCW5fcmVzICs9IDI7CiAJCX0KQEAgLTMyMyw4ICszMjIsNyBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnI7CiAKLQkJclsxXS5zdGFydCA9IHJbMV0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlyWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCW9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJnJbMV0pOwogCiAJCWkyY19kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmc2wtaTJjIiwgaSwgciwgMik7CiAJCWlmIChJU19FUlIoaTJjX2RldikpIHsKQEAgLTQ1OSw4ICs0NTcsNyBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnI7CiAKLQkJclsxXS5zdGFydCA9IHJbMV0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlyWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCW9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJnJbMV0pOwogCiAJCXVzYl9kZXZfbXBoID0KIAkJICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImZzbC1laGNpIiwgaSwgciwgMik7CkBAIC01MDcsOCArNTA0LDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gdW5yZWdfbXBoOwogCi0JCXJbMV0uc3RhcnQgPSByWzFdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKIAogCQl1c2JfZGV2X2RyID0KIAkJICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImZzbC1laGNpIiwgaSwgciwgMik7CkBAIC01OTEsOCArNTg3LDcgQEAKIAkJclsyXS5uYW1lID0gZmNjX3JlZ3NfYzsKIAkJZnNfZW5ldF9kYXRhLmZjY19yZWdzX2MgPSByWzJdLnN0YXJ0OwogCi0JCXJbM10uc3RhcnQgPSByWzNdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclszXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzNdKTsKIAogCQlmc19lbmV0X2RldiA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmc2wtY3BtLWZjYyIsIGksICZyWzBdLCA0KTsKQEAgLTc1NCw4ICs3NDksNyBAQAogCQkJZ290byBlcnI7CiAJCXJbMV0ubmFtZSA9IHNjY19wcmFtOwogCi0JCXJbMl0uc3RhcnQgPSByWzJdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclsyXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzJdKTsKIAogCQljcG1fdWFydF9kZXYgPQogCQkgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWNwbS1zY2M6dWFydCIsIGksICZyWzBdLCAzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggYmE0ODMzZi4uNDExNDgwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTE0NywzMyArMTQ3LDUxIEBACiAgKi8KIAogCi1zdGF0aWMgaW5saW5lIHUzMiBfbXBpY19yZWFkKHVuc2lnbmVkIGludCBiZSwgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmJhc2UsCi0JCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdTMyIF9tcGljX3JlYWQoZW51bSBtcGljX3JlZ190eXBlIHR5cGUsCisJCQkgICAgIHN0cnVjdCBtcGljX3JlZ19iYW5rICpyYiwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQlpZiAoYmUpCi0JCXJldHVybiBpbl9iZTMyKGJhc2UgKyAocmVnID4+IDIpKTsKLQllbHNlCi0JCXJldHVybiBpbl9sZTMyKGJhc2UgKyAocmVnID4+IDIpKTsKKwlzd2l0Y2godHlwZSkgeworI2lmZGVmIENPTkZJR19QUENfRENSCisJY2FzZSBtcGljX2FjY2Vzc19kY3I6CisJCXJldHVybiBkY3JfcmVhZChyYi0+ZGhvc3QsCisJCQkJcmItPmRiYXNlICsgcmVnICsgcmItPmRvZmYpOworI2VuZGlmCisJY2FzZSBtcGljX2FjY2Vzc19tbWlvX2JlOgorCQlyZXR1cm4gaW5fYmUzMihyYi0+YmFzZSArIChyZWcgPj4gMikpOworCWNhc2UgbXBpY19hY2Nlc3NfbW1pb19sZToKKwlkZWZhdWx0OgorCQlyZXR1cm4gaW5fbGUzMihyYi0+YmFzZSArIChyZWcgPj4gMikpOworCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9tcGljX3dyaXRlKHVuc2lnbmVkIGludCBiZSwgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmJhc2UsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgaW5saW5lIHZvaWQgX21waWNfd3JpdGUoZW51bSBtcGljX3JlZ190eXBlIHR5cGUsCisJCQkgICAgICAgc3RydWN0IG1waWNfcmVnX2JhbmsgKnJiLAorIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgdmFsdWUpCiB7Ci0JaWYgKGJlKQotCQlvdXRfYmUzMihiYXNlICsgKHJlZyA+PiAyKSwgdmFsdWUpOwotCWVsc2UKLQkJb3V0X2xlMzIoYmFzZSArIChyZWcgPj4gMiksIHZhbHVlKTsKKwlzd2l0Y2godHlwZSkgeworI2lmZGVmIENPTkZJR19QUENfRENSCisJY2FzZSBtcGljX2FjY2Vzc19kY3I6CisJCXJldHVybiBkY3Jfd3JpdGUocmItPmRob3N0LAorCQkJCSByYi0+ZGJhc2UgKyByZWcgKyByYi0+ZG9mZiwgdmFsdWUpOworI2VuZGlmCisJY2FzZSBtcGljX2FjY2Vzc19tbWlvX2JlOgorCQlyZXR1cm4gb3V0X2JlMzIocmItPmJhc2UgKyAocmVnID4+IDIpLCB2YWx1ZSk7CisJY2FzZSBtcGljX2FjY2Vzc19tbWlvX2xlOgorCWRlZmF1bHQ6CisJCXJldHVybiBvdXRfbGUzMihyYi0+YmFzZSArIChyZWcgPj4gMiksIHZhbHVlKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIF9tcGljX2lwaV9yZWFkKHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBpbnQgaXBpKQogewotCXVuc2lnbmVkIGludCBiZSA9IChtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTikgIT0gMDsKKwllbnVtIG1waWNfcmVnX3R5cGUgdHlwZSA9IG1waWMtPnJlZ190eXBlOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSBNUElDX0lORk8oR1JFR19JUElfVkVDVE9SX1BSSV8wKSArCiAJCQkgICAgICAoaXBpICogTVBJQ19JTkZPKEdSRUdfSVBJX1NUUklERSkpOwogCi0JaWYgKG1waWMtPmZsYWdzICYgTVBJQ19CUk9LRU5fSVBJKQotCQliZSA9ICFiZTsKLQlyZXR1cm4gX21waWNfcmVhZChiZSwgbXBpYy0+Z3JlZ3MsIG9mZnNldCk7CisJaWYgKChtcGljLT5mbGFncyAmIE1QSUNfQlJPS0VOX0lQSSkgJiYgdHlwZSA9PSBtcGljX2FjY2Vzc19tbWlvX2xlKQorCQl0eXBlID0gbXBpY19hY2Nlc3NfbW1pb19iZTsKKwlyZXR1cm4gX21waWNfcmVhZCh0eXBlLCAmbXBpYy0+Z3JlZ3MsIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfbXBpY19pcGlfd3JpdGUoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBpcGksIHUzMiB2YWx1ZSkKQEAgLTE4MSw3ICsxOTksNyBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQgPSBNUElDX0lORk8oR1JFR19JUElfVkVDVE9SX1BSSV8wKSArCiAJCQkgICAgICAoaXBpICogTVBJQ19JTkZPKEdSRUdfSVBJX1NUUklERSkpOwogCi0JX21waWNfd3JpdGUobXBpYy0+ZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4sIG1waWMtPmdyZWdzLCBvZmZzZXQsIHZhbHVlKTsKKwlfbXBpY193cml0ZShtcGljLT5yZWdfdHlwZSwgJm1waWMtPmdyZWdzLCBvZmZzZXQsIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgX21waWNfY3B1X3JlYWQoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCByZWcpCkBAIC0xOTAsOCArMjA4LDcgQEAKIAogCWlmIChtcGljLT5mbGFncyAmIE1QSUNfUFJJTUFSWSkKIAkJY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7Ci0JcmV0dXJuIF9tcGljX3JlYWQobXBpYy0+ZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4sCi0JCQkgIG1waWMtPmNwdXJlZ3NbY3B1XSwgcmVnKTsKKwlyZXR1cm4gX21waWNfcmVhZChtcGljLT5yZWdfdHlwZSwgJm1waWMtPmNwdXJlZ3NbY3B1XSwgcmVnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9tcGljX2NwdV93cml0ZShzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IHJlZywgdTMyIHZhbHVlKQpAQCAtMjAxLDcgKzIxOCw3IEBACiAJaWYgKG1waWMtPmZsYWdzICYgTVBJQ19QUklNQVJZKQogCQljcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAotCV9tcGljX3dyaXRlKG1waWMtPmZsYWdzICYgTVBJQ19CSUdfRU5ESUFOLCBtcGljLT5jcHVyZWdzW2NwdV0sIHJlZywgdmFsdWUpOworCV9tcGljX3dyaXRlKG1waWMtPnJlZ190eXBlLCAmbXBpYy0+Y3B1cmVnc1tjcHVdLCByZWcsIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgX21waWNfaXJxX3JlYWQoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBzcmNfbm8sIHVuc2lnbmVkIGludCByZWcpCkBAIC0yMDksNyArMjI2LDcgQEAKIAl1bnNpZ25lZCBpbnQJaXN1ID0gc3JjX25vID4+IG1waWMtPmlzdV9zaGlmdDsKIAl1bnNpZ25lZCBpbnQJaWR4ID0gc3JjX25vICYgbXBpYy0+aXN1X21hc2s7CiAKLQlyZXR1cm4gX21waWNfcmVhZChtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTiwgbXBpYy0+aXN1c1tpc3VdLAorCXJldHVybiBfbXBpY19yZWFkKG1waWMtPnJlZ190eXBlLCAmbXBpYy0+aXN1c1tpc3VdLAogCQkJICByZWcgKyAoaWR4ICogTVBJQ19JTkZPKElSUV9TVFJJREUpKSk7CiB9CiAKQEAgLTIxOSwxMiArMjM2LDEyIEBACiAJdW5zaWduZWQgaW50CWlzdSA9IHNyY19ubyA+PiBtcGljLT5pc3Vfc2hpZnQ7CiAJdW5zaWduZWQgaW50CWlkeCA9IHNyY19ubyAmIG1waWMtPmlzdV9tYXNrOwogCi0JX21waWNfd3JpdGUobXBpYy0+ZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4sIG1waWMtPmlzdXNbaXN1XSwKKwlfbXBpY193cml0ZShtcGljLT5yZWdfdHlwZSwgJm1waWMtPmlzdXNbaXN1XSwKIAkJICAgIHJlZyArIChpZHggKiBNUElDX0lORk8oSVJRX1NUUklERSkpLCB2YWx1ZSk7CiB9CiAKLSNkZWZpbmUgbXBpY19yZWFkKGIscikJCV9tcGljX3JlYWQobXBpYy0+ZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4sKGIpLChyKSkKLSNkZWZpbmUgbXBpY193cml0ZShiLHIsdikJX21waWNfd3JpdGUobXBpYy0+ZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4sKGIpLChyKSwodikpCisjZGVmaW5lIG1waWNfcmVhZChiLHIpCQlfbXBpY19yZWFkKG1waWMtPnJlZ190eXBlLCYoYiksKHIpKQorI2RlZmluZSBtcGljX3dyaXRlKGIscix2KQlfbXBpY193cml0ZShtcGljLT5yZWdfdHlwZSwmKGIpLChyKSwodikpCiAjZGVmaW5lIG1waWNfaXBpX3JlYWQoaSkJX21waWNfaXBpX3JlYWQobXBpYywoaSkpCiAjZGVmaW5lIG1waWNfaXBpX3dyaXRlKGksdikJX21waWNfaXBpX3dyaXRlKG1waWMsKGkpLCh2KSkKICNkZWZpbmUgbXBpY19jcHVfcmVhZChpKQlfbXBpY19jcHVfcmVhZChtcGljLChpKSkKQEAgLTIzOCw2ICsyNTUsMzggQEAKICAqLwogCiAKK3N0YXRpYyB2b2lkIF9tcGljX21hcF9tbWlvKHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCSAgIHN0cnVjdCBtcGljX3JlZ19iYW5rICpyYiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgIHVuc2lnbmVkIGludCBzaXplKQoreworCXJiLT5iYXNlID0gaW9yZW1hcChwaHlzX2FkZHIgKyBvZmZzZXQsIHNpemUpOworCUJVR19PTihyYi0+YmFzZSA9PSBOVUxMKTsKK30KKworI2lmZGVmIENPTkZJR19QUENfRENSCitzdGF0aWMgdm9pZCBfbXBpY19tYXBfZGNyKHN0cnVjdCBtcGljICptcGljLCBzdHJ1Y3QgbXBpY19yZWdfYmFuayAqcmIsCisJCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplKQoreworCXJiLT5kYmFzZSA9IG1waWMtPmRjcl9iYXNlOworCXJiLT5kb2ZmID0gb2Zmc2V0OworCXJiLT5kaG9zdCA9IGRjcl9tYXAobXBpYy0+b2Zfbm9kZSwgcmItPmRiYXNlICsgcmItPmRvZmYsIHNpemUpOworCUJVR19PTighRENSX01BUF9PSyhyYi0+ZGhvc3QpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1waWNfbWFwKHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCSAgICBzdHJ1Y3QgbXBpY19yZWdfYmFuayAqcmIsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKG1waWMtPmZsYWdzICYgTVBJQ19VU0VTX0RDUikKKwkJX21waWNfbWFwX2RjcihtcGljLCByYiwgb2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCV9tcGljX21hcF9tbWlvKG1waWMsIHBoeXNfYWRkciwgcmIsIG9mZnNldCwgc2l6ZSk7Cit9CisjZWxzZSAvKiBDT05GSUdfUFBDX0RDUiAqLworI2RlZmluZSBtcGljX21hcChtLHAsYixvLHMpCV9tcGljX21hcF9tbWlvKG0scCxiLG8scykKKyNlbmRpZiAvKiAhQ09ORklHX1BQQ19EQ1IgKi8KKworCiAKIC8qIENoZWNrIGlmIHdlIGhhdmUgb25lIG9mIHRob3NlIG5pY2UgYnJva2VuIE1QSUNzIHdpdGggYSBmbGlwcGVkIGVuZGlhbiBvbgogICogcmVhZHMgZnJvbSBJUEkgcmVnaXN0ZXJzCkBAIC04NDUsNyArODk0LDcgQEAKICAqLwogCiBzdHJ1Y3QgbXBpYyAqIF9faW5pdCBtcGljX2FsbG9jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCQlwaHlzX2FkZHJfdCBwaHlzX2FkZHIsCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzLAogCQkJCXVuc2lnbmVkIGludCBpc3Vfc2l6ZSwKIAkJCQl1bnNpZ25lZCBpbnQgaXJxX2NvdW50LApAQCAtODU1LDYgKzkwNCw3IEBACiAJdTMyCQlyZWc7CiAJY29uc3QgY2hhcgkqdmVyczsKIAlpbnQJCWk7CisJdTY0CQlwYWRkciA9IHBoeXNfYWRkcjsKIAogCW1waWMgPSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgbXBpYykpOwogCWlmIChtcGljID09IE5VTEwpCkBAIC04ODMsNiArOTMzLDcgQEAKIAlpZiAoZmxhZ3MgJiBNUElDX1BSSU1BUlkpCiAJCW1waWMtPmhjX2h0X2lycS5zZXRfYWZmaW5pdHkgPSBtcGljX3NldF9hZmZpbml0eTsKICNlbmRpZiAvKiBDT05GSUdfTVBJQ19CUk9LRU5fVTMgKi8KKwogI2lmZGVmIENPTkZJR19TTVAKIAltcGljLT5oY19pcGkgPSBtcGljX2lwaV9jaGlwOwogCW1waWMtPmhjX2lwaS50eXBlbmFtZSA9IG5hbWU7CkBAIC04OTMsMTUgKzk0NCw1MiBAQAogCW1waWMtPmlycV9jb3VudCA9IGlycV9jb3VudDsKIAltcGljLT5udW1fc291cmNlcyA9IDA7IC8qIHNvIGZhciAqLwogCisJLyogQ2hlY2sgZm9yICJiaWctZW5kaWFuIiBpbiBkZXZpY2UtdHJlZSAqLworCWlmIChub2RlICYmIGdldF9wcm9wZXJ0eShub2RlLCAiYmlnLWVuZGlhbiIsIE5VTEwpICE9IE5VTEwpCisJCW1waWMtPmZsYWdzIHw9IE1QSUNfQklHX0VORElBTjsKKworCiAjaWZkZWYgQ09ORklHX01QSUNfV0VJUkQKIAltcGljLT5od19zZXQgPSBtcGljX2luZm9zW01QSUNfR0VUX1JFR1NFVChmbGFncyldOwogI2VuZGlmCiAKKwkvKiBkZWZhdWx0IHJlZ2lzdGVyIHR5cGUgKi8KKwltcGljLT5yZWdfdHlwZSA9IChmbGFncyAmIE1QSUNfQklHX0VORElBTikgPworCQltcGljX2FjY2Vzc19tbWlvX2JlIDogbXBpY19hY2Nlc3NfbW1pb19sZTsKKworCS8qIElmIG5vIHBoeXNpY2FsIGFkZHJlc3MgaXMgcGFzc2VkIGluLCBhIGRldmljZS1ub2RlIGlzIG1hbmRhdG9yeSAqLworCUJVR19PTihwYWRkciA9PSAwICYmIG5vZGUgPT0gTlVMTCk7CisKKwkvKiBJZiBubyBwaHlzaWNhbCBhZGRyZXNzIHBhc3NlZCBpbiwgY2hlY2sgaWYgaXQncyBkY3IgYmFzZWQgKi8KKwlpZiAocGFkZHIgPT0gMCAmJiBnZXRfcHJvcGVydHkobm9kZSwgImRjci1yZWciLCBOVUxMKSAhPSBOVUxMKQorCQltcGljLT5mbGFncyB8PSBNUElDX1VTRVNfRENSOworCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1VTRVNfRENSKSB7CisJCWNvbnN0IHUzMiAqZGJhc2VwOworCQlkYmFzZXAgPSBnZXRfcHJvcGVydHkobm9kZSwgImRjci1yZWciLCBOVUxMKTsKKwkJQlVHX09OKGRiYXNlcCA9PSBOVUxMKTsKKwkJbXBpYy0+ZGNyX2Jhc2UgPSAqZGJhc2VwOworCQltcGljLT5yZWdfdHlwZSA9IG1waWNfYWNjZXNzX2RjcjsKKwl9CisjZWxzZQorCUJVR19PTiAobXBpYy0+ZmxhZ3MgJiBNUElDX1VTRVNfRENSKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX0RDUiAqLworCisJLyogSWYgdGhlIE1QSUMgaXMgbm90IERDUiBiYXNlZCwgYW5kIG5vIHBoeXNpY2FsIGFkZHJlc3Mgd2FzIHBhc3NlZAorCSAqIGluLCB0cnkgdG8gb2J0YWluIG9uZQorCSAqLworCWlmIChwYWRkciA9PSAwICYmICEobXBpYy0+ZmxhZ3MgJiBNUElDX1VTRVNfRENSKSkgeworCQljb25zdCB1MzIgKnJlZzsKKwkJcmVnID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKKwkJQlVHX09OKHJlZyA9PSBOVUxMKTsKKwkJcGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhub2RlLCByZWcpOworCQlCVUdfT04ocGFkZHIgPT0gT0ZfQkFEX0FERFIpOworCX0KKwogCS8qIE1hcCB0aGUgZ2xvYmFsIHJlZ2lzdGVycyAqLwotCW1waWMtPmdyZWdzID0gaW9yZW1hcChwaHlzX2FkZHIgKyBNUElDX0lORk8oR1JFR19CQVNFKSwgMHgxMDAwKTsKLQltcGljLT50bXJlZ3MgPSBtcGljLT5ncmVncyArCi0JCSAgICAgICAoKE1QSUNfSU5GTyhUSU1FUl9CQVNFKSAtIE1QSUNfSU5GTyhHUkVHX0JBU0UpKSA+PiAyKTsKLQlCVUdfT04obXBpYy0+Z3JlZ3MgPT0gTlVMTCk7CisJbXBpY19tYXAobXBpYywgcGFkZHIsICZtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfQkFTRSksIDB4MTAwMCk7CisJbXBpY19tYXAobXBpYywgcGFkZHIsICZtcGljLT50bXJlZ3MsIE1QSUNfSU5GTyhUSU1FUl9CQVNFKSwgMHgxMDAwKTsKIAogCS8qIFJlc2V0ICovCiAJaWYgKGZsYWdzICYgTVBJQ19XQU5UU19SRVNFVCkgewpAQCAtOTI2LDE3ICsxMDE0LDE2IEBACiAKIAkvKiBNYXAgdGhlIHBlci1DUFUgcmVnaXN0ZXJzICovCiAJZm9yIChpID0gMDsgaSA8IG1waWMtPm51bV9jcHVzOyBpKyspIHsKLQkJbXBpYy0+Y3B1cmVnc1tpXSA9IGlvcmVtYXAocGh5c19hZGRyICsgTVBJQ19JTkZPKENQVV9CQVNFKSArCi0JCQkJCSAgIGkgKiBNUElDX0lORk8oQ1BVX1NUUklERSksIDB4MTAwMCk7Ci0JCUJVR19PTihtcGljLT5jcHVyZWdzW2ldID09IE5VTEwpOworCQltcGljX21hcChtcGljLCBwYWRkciwgJm1waWMtPmNwdXJlZ3NbaV0sCisJCQkgTVBJQ19JTkZPKENQVV9CQVNFKSArIGkgKiBNUElDX0lORk8oQ1BVX1NUUklERSksCisJCQkgMHgxMDAwKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIG1haW4gSVNVIGlmIG5vbmUgcHJvdmlkZWQgKi8KIAlpZiAobXBpYy0+aXN1X3NpemUgPT0gMCkgewogCQltcGljLT5pc3Vfc2l6ZSA9IG1waWMtPm51bV9zb3VyY2VzOwotCQltcGljLT5pc3VzWzBdID0gaW9yZW1hcChwaHlzX2FkZHIgKyBNUElDX0lORk8oSVJRX0JBU0UpLAotCQkJCQlNUElDX0lORk8oSVJRX1NUUklERSkgKiBtcGljLT5pc3Vfc2l6ZSk7Ci0JCUJVR19PTihtcGljLT5pc3VzWzBdID09IE5VTEwpOworCQltcGljX21hcChtcGljLCBwYWRkciwgJm1waWMtPmlzdXNbMF0sCisJCQkgTVBJQ19JTkZPKElSUV9CQVNFKSwgTVBJQ19JTkZPKElSUV9TVFJJREUpICogbXBpYy0+aXN1X3NpemUpOwogCX0KIAltcGljLT5pc3Vfc2hpZnQgPSAxICsgX19pbG9nMihtcGljLT5pc3Vfc2l6ZSAtIDEpOwogCW1waWMtPmlzdV9tYXNrID0gKDEgPDwgbXBpYy0+aXN1X3NoaWZ0KSAtIDE7CkBAIC05NTYsMTAgKzEwNDMsMTEgQEAKIAkJdmVycyA9ICI8dW5rbm93bj4iOwogCQlicmVhazsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAibXBpYzogU2V0dGluZyB1cCBNUElDIFwiJXNcIiB2ZXJzaW9uICVzIGF0ICVseCwgbWF4ICVkIENQVXNcbiIsCi0JICAgICAgIG5hbWUsIHZlcnMsIHBoeXNfYWRkciwgbXBpYy0+bnVtX2NwdXMpOwotCXByaW50ayhLRVJOX0lORk8gIm1waWM6IElTVSBzaXplOiAlZCwgc2hpZnQ6ICVkLCBtYXNrOiAleFxuIiwgbXBpYy0+aXN1X3NpemUsCi0JICAgICAgIG1waWMtPmlzdV9zaGlmdCwgbXBpYy0+aXN1X21hc2spOworCXByaW50ayhLRVJOX0lORk8gIm1waWM6IFNldHRpbmcgdXAgTVBJQyBcIiVzXCIgdmVyc2lvbiAlcyBhdCAlbGx4LCIKKwkgICAgICAgIiBtYXggJWQgQ1BVc1xuIiwKKwkgICAgICAgbmFtZSwgdmVycywgKHVuc2lnbmVkIGxvbmcgbG9uZylwYWRkciwgbXBpYy0+bnVtX2NwdXMpOworCXByaW50ayhLRVJOX0lORk8gIm1waWM6IElTVSBzaXplOiAlZCwgc2hpZnQ6ICVkLCBtYXNrOiAleFxuIiwKKwkgICAgICAgbXBpYy0+aXN1X3NpemUsIG1waWMtPmlzdV9zaGlmdCwgbXBpYy0+aXN1X21hc2spOwogCiAJbXBpYy0+bmV4dCA9IG1waWNzOwogCW1waWNzID0gbXBpYzsKQEAgLTk3MywxNCArMTA2MSwxNCBAQAogfQogCiB2b2lkIF9faW5pdCBtcGljX2Fzc2lnbl9pc3Uoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBpc3VfbnVtLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQorCQkJICAgIHBoeXNfYWRkcl90IHBhZGRyKQogewogCXVuc2lnbmVkIGludCBpc3VfZmlyc3QgPSBpc3VfbnVtICogbXBpYy0+aXN1X3NpemU7CiAKIAlCVUdfT04oaXN1X251bSA+PSBNUElDX01BWF9JU1UpOwogCi0JbXBpYy0+aXN1c1tpc3VfbnVtXSA9IGlvcmVtYXAocGh5c19hZGRyLAotCQkJCSAgICAgIE1QSUNfSU5GTyhJUlFfU1RSSURFKSAqIG1waWMtPmlzdV9zaXplKTsKKwltcGljX21hcChtcGljLCBwYWRkciwgJm1waWMtPmlzdXNbaXN1X251bV0sIDAsCisJCSBNUElDX0lORk8oSVJRX1NUUklERSkgKiBtcGljLT5pc3Vfc2l6ZSk7CiAJaWYgKChpc3VfZmlyc3QgKyBtcGljLT5pc3Vfc2l6ZSkgPiBtcGljLT5udW1fc291cmNlcykKIAkJbXBpYy0+bnVtX3NvdXJjZXMgPSBpc3VfZmlyc3QgKyBtcGljLT5pc3Vfc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCmluZGV4IGU0MjIzMjIuLmUzZDcxZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYwpAQCAtMTc0LDggKzE3NCw3IEBACiAJdTMyIGRpdmlzb3IsIHRlbXB2YWw7CiAJaW50IGRpdjE2ID0gMDsKIAotCWJwID0gJnFlX2ltbXItPmJyZy5icmdjMTsKLQlicCArPSBicmc7CisJYnAgPSAmcWVfaW1tci0+YnJnLmJyZ2NbYnJnXTsKIAogCWRpdmlzb3IgPSAoZ2V0X2JyZ19jbGsoKSAvIHJhdGUpOwogCWlmIChkaXZpc29yID4gUUVfQlJHQ19ESVZJU09SX01BWCArIDEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCmluZGV4IDc1ZmEzMTAuLmU2NTc1NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwpAQCAtMjE2LDE0ICsyMTYsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JdWNjZiA9IChzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqKQotCQkga21hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwl1Y2NmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVjY2YpIHsKIAkJdWNjZl9lcnIKIAkJICAgICgidWNjX2Zhc3RfaW5pdDogTm8gbWVtb3J5IGZvciBVQ0Mgc2xvdyBkYXRhIHN0cnVjdHVyZSEiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldCh1Y2NmLCAwLCBzaXplb2Yoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUpKTsKIAogCS8qIEZpbGwgZmFzdCBVQ0Mgc3RydWN0dXJlICovCiAJdWNjZi0+dWZfaW5mbyA9IHVmX2luZm87CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYwppbmRleCBhNDlkYTZiLi40N2I1NjIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMKQEAgLTE2OCwxNCArMTY4LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXVjY3MgPSAoc3RydWN0IHVjY19zbG93X3ByaXZhdGUgKikKLQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19zbG93X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwl1Y2NzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVjY19zbG93X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVjY3MpIHsKIAkJdWNjc19lcnIKIAkJICAgICgidWNjX3Nsb3dfaW5pdDogTm8gbWVtb3J5IGZvciBVQ0Mgc2xvdyBkYXRhIHN0cnVjdHVyZSEiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldCh1Y2NzLCAwLCBzaXplb2Yoc3RydWN0IHVjY19zbG93X3ByaXZhdGUpKTsKIAogCS8qIEZpbGwgc2xvdyBVQ0Mgc3RydWN0dXJlICovCiAJdWNjcy0+dXNfaW5mbyA9IHVzX2luZm87CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3JvbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjViM2YxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9yb20uYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogUk9NIGRldmljZSByZWdpc3RyYXRpb24KKyAqCisgKiAoQykgMjAwNiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisKK3N0YXRpYyBpbnQgX19pbml0IHBvd2VycGNfZmxhc2hfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IE5VTEw7CisKKwkvKgorCSAqIFJlZ2lzdGVyIGFsbCB0aGUgZGV2aWNlcyB3aGljaCB0eXBlIGlzICJyb20iCisJICovCisJd2hpbGUgKChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobm9kZSwgInJvbSIpKSAhPSBOVUxMKSB7CisJCWlmIChub2RlLT5uYW1lID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBvd2VycGNfZmxhc2hfaW5pdDogZm91bmQgJ3JvbScgIgorCQkJCSJkZXZpY2UsIGJ1dCB3aXRoIG5vIG5hbWUsIHNraXBwaW5nLi4uXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobm9kZSwgbm9kZS0+bmFtZSwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHBvd2VycGNfZmxhc2hfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RvZGMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdG9kYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY1OTgwLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdG9kYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBUaW1lIG9mIERheSBDbG9jayBzdXBwb3J0IGZvciB0aGUgTTQ4VDM1LCBNNDhUMzcsIE00OFQ1OSwgYW5kIE1DMTQ2ODE4Ci0gKiBSZWFsIFRpbWUgQ2xvY2tzL1RpbWVrZWVwZXJzLgotICoKLSAqIEF1dGhvcjogTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+Ci0gKgotICogMjAwMS0yMDA0IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQotICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvYmNkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vdG9kYy5oPgotCi0vKgotICogRGVwZW5kaW5nIG9uIHRoZSBoYXJkd2FyZSBvbiB5b3VyIGJvYXJkIGFuZCB5b3VyIGJvYXJkIGRlc2lnbiwgdGhlCi0gKiBSVEMvTlZSQU0gbWF5IGJlIGFjY2Vzc2VkIGVpdGhlciBkaXJlY3RseSAobGlrZSBub3JtYWwgbWVtb3J5KSBvciB2aWEKLSAqIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMuICBJZiB5b3VyIGJvYXJkIHVzZXMgdGhlIGRpcmVjdCBtZXRob2QsIHNldAotICogJ252cmFtX2RhdGEnIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBudnJhbSBhbmQgbGVhdmUgJ252cmFtX2FzMCcgYW5kCi0gKiAnbnZyYW1fYXMxJyBOVUxMLiAgSWYgeW91ciBib2FyZCB1c2VzIGFkZHJlc3MvZGF0YSByZWdzIHRvIGFjY2VzcyBudnJhbSwKLSAqIHNldCAnbnZyYW1fYXMwJyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgYnl0ZSwgc2V0ICdudnJhbV9hczEnIHRvIHRoZQotICogYWRkcmVzcyBvZiB0aGUgdXBwZXIgYnl0ZSAobGVhdmUgTlVMTCBpZiB1c2luZyBtYzE0NjgxOCksIGFuZCBzZXQKLSAqICdudnJhbV9kYXRhJyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgOC1iaXQgZGF0YSByZWdpc3Rlci4KLSAqCi0gKiBOb3RlOiBFdmVuIHRob3VnaCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHZhcmlvdXMgUlRDIGNoaXBzIHNheSB0aGF0IGl0Ci0gKiAJIHRha2UgdXAgdG8gYSBzZWNvbmQgYmVmb3JlIGl0IHN0YXJ0cyB1cGRhdGluZyBvbmNlIHRoZSAnUicgYml0IGlzCi0gKiAJIGNsZWFyZWQsIHRoZXkgYWx3YXlzIHNlZW0gdG8gdXBkYXRlIGV2ZW4gdGhvdWdoIHdlIGJhbmcgb24gaXQgbWFueQotICogCSB0aW1lcyBhIHNlY29uZC4gIFRoaXMgaXMgdHJ1ZSwgZXhjZXB0IGZvciB0aGUgRGFsbGFzIFNlbWkgMTc0Ni8xNzQ3Ci0gKiAJIChwb3NzaWJseSBvdGhlcnMpLiAgVGhvc2UgY2hpcHMgc2VlbSB0byBoYXZlIGEgcmVhbCBwcm9ibGVtIHdoZW5ldmVyCi0gKiAJIHdlIHNldCB0aGUgJ1InIGJpdCBiZWZvcmUgcmVhZGluZyB0aGVtLCB0aGV5IGJhc2ljYWxseSBzdG9wIGNvdW50aW5nLgotICogCSAJCQkJCS0tTUFHCi0gKi8KLQotLyoKLSAqICd0b2RjX2luZm8nIHNob3VsZCBiZSBpbml0aWFsaXplZCBpbiB5b3VyICpfc2V0dXAuYyBmaWxlIHRvCi0gKiBwb2ludCB0byBhIGZ1bGx5IGluaXRpYWxpemVkICd0b2RjX2luZm9fdCcgc3RydWN0dXJlLgotICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSByZWdpc3RlciBvZmZzZXRzIGZvciB5b3VyIHBhcnRpY3VsYXIKLSAqIFRPREMvUlRDIGNoaXAuCi0gKiBUT0RDX0FMTE9DKCkvVE9EQ19JTklUKCkgd2lsbCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGlzIHRhYmxlIGZvciB5b3UuCi0gKi8KLQotI2lmZGVmCVJUQ19GUkVRX1NFTEVDVAotI3VuZGVmCVJUQ19GUkVRX1NFTEVDVAotI2RlZmluZQlSVENfRlJFUV9TRUxFQ1QJCWNvbnRyb2xfYgkvKiBSZWdpc3RlciBBICovCi0jZW5kaWYKLQotI2lmZGVmCVJUQ19DT05UUk9MCi0jdW5kZWYJUlRDX0NPTlRST0wKLSNkZWZpbmUJUlRDX0NPTlRST0wJCWNvbnRyb2xfYQkvKiBSZWdpc3RlciBCICovCi0jZW5kaWYKLQotI2lmZGVmCVJUQ19JTlRSX0ZMQUdTCi0jdW5kZWYJUlRDX0lOVFJfRkxBR1MKLSNkZWZpbmUJUlRDX0lOVFJfRkxBR1MJCXdhdGNoZG9nCS8qIFJlZ2lzdGVyIEMgKi8KLSNlbmRpZgotCi0jaWZkZWYJUlRDX1ZBTElECi0jdW5kZWYJUlRDX1ZBTElECi0jZGVmaW5lCVJUQ19WQUxJRAkJaW50ZXJydXB0cwkvKiBSZWdpc3RlciBEICovCi0jZW5kaWYKLQotLyogQWNjZXNzIHJvdXRpbmVzIHdoZW4gUlRDIGFjY2Vzc2VkIGRpcmVjdGx5IChsaWtlIG5vcm1hbCBtZW1vcnkpICovCi11X2NoYXIKLXRvZGNfZGlyZWN0X3JlYWRfdmFsKGludCBhZGRyKQotewotCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopKHRvZGNfaW5mby0+bnZyYW1fZGF0YSArIGFkZHIpKTsKLX0KLQotdm9pZAotdG9kY19kaXJlY3Rfd3JpdGVfdmFsKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKLXsKLQl3cml0ZWIodmFsLCAodm9pZCBfX2lvbWVtICopKHRvZGNfaW5mby0+bnZyYW1fZGF0YSArIGFkZHIpKTsKLQlyZXR1cm47Ci19Ci0KLS8qIEFjY2VzcyByb3V0aW5lcyBmb3IgYWNjZXNzaW5nIG00OHR4eCB0eXBlIGNoaXBzIHZpYSBhZGRyL2RhdGEgcmVncyAqLwotdV9jaGFyCi10b2RjX200OHR4eF9yZWFkX3ZhbChpbnQgYWRkcikKLXsKLQlvdXRiKGFkZHIsIHRvZGNfaW5mby0+bnZyYW1fYXMwKTsKLQlvdXRiKGFkZHI+PnRvZGNfaW5mby0+YXMwX2JpdHMsIHRvZGNfaW5mby0+bnZyYW1fYXMxKTsKLQlyZXR1cm4gaW5iKHRvZGNfaW5mby0+bnZyYW1fZGF0YSk7Ci19Ci0KLXZvaWQKLXRvZGNfbTQ4dHh4X3dyaXRlX3ZhbChpbnQgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCi17Ci0Jb3V0YihhZGRyLCB0b2RjX2luZm8tPm52cmFtX2FzMCk7Ci0Jb3V0YihhZGRyPj50b2RjX2luZm8tPmFzMF9iaXRzLCB0b2RjX2luZm8tPm52cmFtX2FzMSk7Ci0Jb3V0Yih2YWwsIHRvZGNfaW5mby0+bnZyYW1fZGF0YSk7Ci0JcmV0dXJuOwotfQotCi0vKiBBY2Nlc3Mgcm91dGluZXMgZm9yIGFjY2Vzc2luZyBtYzE0NjgxOCB0eXBlIGNoaXBzIHZpYSBhZGRyL2RhdGEgcmVncyAqLwotdV9jaGFyCi10b2RjX21jMTQ2ODE4X3JlYWRfdmFsKGludCBhZGRyKQotewotCW91dGJfcChhZGRyLCB0b2RjX2luZm8tPm52cmFtX2FzMCk7Ci0JcmV0dXJuIGluYl9wKHRvZGNfaW5mby0+bnZyYW1fZGF0YSk7Ci19Ci0KLXZvaWQKLXRvZGNfbWMxNDY4MThfd3JpdGVfdmFsKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKLXsKLQlvdXRiX3AoYWRkciwgdG9kY19pbmZvLT5udnJhbV9hczApOwotCW91dGJfcCh2YWwsIHRvZGNfaW5mby0+bnZyYW1fZGF0YSk7Ci19Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIG1ha2UgUlRDIGNoaXBzIHdpdGggTlZSQU0gYnVyaWVkIGJlaGluZCBhbiBhZGRyL2RhdGEgcGFpcgotICogaGF2ZSB0aGUgTlZSQU0gYW5kIGNsb2NrIHJlZ3MgYXBwZWFyIGF0IHRoZSBzYW1lIGxldmVsLgotICogVGhlIE5WUkFNIHdpbGwgYXBwZWFyIHRvIHN0YXJ0IGF0IGFkZHIgMCBhbmQgdGhlIGNsb2NrIHJlZ3Mgd2lsbCBhcHBlYXIKLSAqIHRvIHN0YXJ0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBOVlJBTSAoYWN0dWFsbHksIHN0YXJ0IGF0IG9mZnNldAotICogdG9kY19pbmZvLT5udnJhbV9zaXplKS4KLSAqLwotc3RhdGljIGlubGluZSB1X2NoYXIKLXRvZGNfcmVhZF92YWwoaW50IGFkZHIpCi17Ci0JdV9jaGFyCXZhbDsKLQotCWlmICh0b2RjX2luZm8tPnN3X2ZsYWdzICYgVE9EQ19GTEFHXzJfTEVWRUxfTlZSQU0pIHsKLQkJaWYgKGFkZHIgPCB0b2RjX2luZm8tPm52cmFtX3NpemUpIHsgLyogTlZSQU0gKi8KLQkJCXBwY19tZC5ydGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+bnZyYW1fYWRkcl9yZWcsIGFkZHIpOwotCQkJdmFsID0gcHBjX21kLnJ0Y19yZWFkX3ZhbCh0b2RjX2luZm8tPm52cmFtX2RhdGFfcmVnKTsKLQkJfSBlbHNlIHsgLyogQ2xvY2sgUmVnICovCi0JCQlhZGRyIC09IHRvZGNfaW5mby0+bnZyYW1fc2l6ZTsKLQkJCXZhbCA9IHBwY19tZC5ydGNfcmVhZF92YWwoYWRkcik7Ci0JCX0KLQl9IGVsc2UKLQkJdmFsID0gcHBjX21kLnJ0Y19yZWFkX3ZhbChhZGRyKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdG9kY193cml0ZV92YWwoaW50IGFkZHIsIHVfY2hhciB2YWwpCi17Ci0JaWYgKHRvZGNfaW5mby0+c3dfZmxhZ3MgJiBUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTSkgewotCQlpZiAoYWRkciA8IHRvZGNfaW5mby0+bnZyYW1fc2l6ZSkgeyAvKiBOVlJBTSAqLwotCQkJcHBjX21kLnJ0Y193cml0ZV92YWwodG9kY19pbmZvLT5udnJhbV9hZGRyX3JlZywgYWRkcik7Ci0JCQlwcGNfbWQucnRjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPm52cmFtX2RhdGFfcmVnLCB2YWwpOwotCQl9IGVsc2UgeyAvKiBDbG9jayBSZWcgKi8KLQkJCWFkZHIgLT0gdG9kY19pbmZvLT5udnJhbV9zaXplOwotCQkJcHBjX21kLnJ0Y193cml0ZV92YWwoYWRkciwgdmFsKTsKLQkJfQotCX0gZWxzZQotCQlwcGNfbWQucnRjX3dyaXRlX3ZhbChhZGRyLCB2YWwpOwotfQotCi0vKgotICogVE9EQyByb3V0aW5lcwotICoKLSAqIFRoZXJlIGlzIHNvbWUgdWdseSBzdHVmZiBpbiB0aGF0IHRoZXJlIGFyZSBhc3N1bXB0aW9ucyBmb3IgdGhlIG1jMTQ2ODE4LgotICoKLSAqIEFzc3VtcHRpb25zOgotICoJLSB0b2RjX2luZm8tPmNvbnRyb2xfYSBoYXMgdGhlIG9mZnNldCBhcyBtYzE0NjgxOCBSZWdpc3RlciBCIHJlZwotICoJLSB0b2RjX2luZm8tPmNvbnRyb2xfYiBoYXMgdGhlIG9mZnNldCBhcyBtYzE0NjgxOCBSZWdpc3RlciBBIHJlZwotICoJLSBtNDh0eHggY29udHJvbCByZWcncyB3cml0ZSBlbmFibGUgb3IgJ1cnIGJpdCBpcyBzYW1lIGFzCi0gKgkgIG1jMTQ2ODE4IFJlZ2lzdGVyIEIgJ1NFVCcgYml0IChpLmUuLCAweDgwKQotICoKLSAqIFRoZXNlIGFzc3VtcHRpb25zIHdlcmUgbWFkZSB0byBtYWtlIHRoZSBjb2RlIHNpbXBsZXIuCi0gKi8KLWxvbmcgX19pbml0Ci10b2RjX3RpbWVfaW5pdCh2b2lkKQotewotCXVfY2hhcgljbnRsX2I7Ci0KLQlpZiAoIXBwY19tZC5ydGNfcmVhZF92YWwpCi0JCXBwY19tZC5ydGNfcmVhZF92YWwgPSBwcGNfbWQubnZyYW1fcmVhZF92YWw7Ci0JaWYgKCFwcGNfbWQucnRjX3dyaXRlX3ZhbCkKLQkJcHBjX21kLnJ0Y193cml0ZV92YWwgPSBwcGNfbWQubnZyYW1fd3JpdGVfdmFsOwotCi0JY250bF9iID0gdG9kY19yZWFkX3ZhbCh0b2RjX2luZm8tPmNvbnRyb2xfYik7Ci0KLQlpZiAodG9kY19pbmZvLT5ydGNfdHlwZSA9PSBUT0RDX1RZUEVfTUMxNDY4MTgpIHsKLQkJaWYgKChjbnRsX2IgJiAweDcwKSAhPSAweDIwKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJUT0RDIHJlYWwtdGltZS1jbG9jayB3YXMgc3RvcHBlZC4iCi0JCQkJIiAgTm93IHN0YXJ0aW5nLi4uIik7Ci0JCQljbnRsX2IgJj0gfjB4NzA7Ci0JCQljbnRsX2IgfD0gMHgyMDsKLQkJfQotCi0JCXRvZGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+Y29udHJvbF9iLCBjbnRsX2IpOwotCX0gZWxzZSBpZiAodG9kY19pbmZvLT5ydGNfdHlwZSA9PSBUT0RDX1RZUEVfRFMxNzI4NSkgewotCQl1X2NoYXIgbW9kZTsKLQotCQltb2RlID0gdG9kY19yZWFkX3ZhbChUT0RDX1RZUEVfRFMxNzI4NV9DTlRMX0EpOwotCQkvKiBNYWtlIHN1cmUgY291bnRkb3duIGNsZWFyIGlzIG5vdCBzZXQgKi8KLQkJbW9kZSAmPSB+MHg0MDsKLQkJLyogRW5hYmxlIG9zY2lsbGF0b3IsIGV4dGVuZGVkIHJlZ2lzdGVyIHNldCAqLwotCQltb2RlIHw9IDB4MzA7Ci0JCXRvZGNfd3JpdGVfdmFsKFRPRENfVFlQRV9EUzE3Mjg1X0NOVExfQSwgbW9kZSk7Ci0KLQl9IGVsc2UgaWYgKHRvZGNfaW5mby0+cnRjX3R5cGUgPT0gVE9EQ19UWVBFX0RTMTUwMSkgewotCQl1X2NoYXIJbW9udGg7Ci0KLQkJdG9kY19pbmZvLT5lbmFibGVfcmVhZCA9IFRPRENfRFMxNTAxX0NOVExfQl9URTsKLQkJdG9kY19pbmZvLT5lbmFibGVfd3JpdGUgPSBUT0RDX0RTMTUwMV9DTlRMX0JfVEU7Ci0KLQkJbW9udGggPSB0b2RjX3JlYWRfdmFsKHRvZGNfaW5mby0+bW9udGgpOwotCi0JCWlmICgobW9udGggJiAweDgwKSA9PSAweDgwKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJUT0RDICVzICVzXG4iLAotCQkJCSJyZWFsLXRpbWUtY2xvY2sgd2FzIHN0b3BwZWQuIiwKLQkJCQkiTm93IHN0YXJ0aW5nLi4uIik7Ci0JCQltb250aCAmPSB+MHg4MDsKLQkJCXRvZGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+bW9udGgsIG1vbnRoKTsKLQkJfQotCi0JCWNudGxfYiAmPSB+VE9EQ19EUzE1MDFfQ05UTF9CX1RFOwotCQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPmNvbnRyb2xfYiwgY250bF9iKTsKLQl9IGVsc2UgeyAvKiBtdXN0IGJlIGEgbTQ4dHh4IHR5cGUgKi8KLQkJdV9jaGFyCWNudGxfYTsKLQotCQl0b2RjX2luZm8tPmVuYWJsZV9yZWFkID0gVE9EQ19NSzQ4VFhYX0NOVExfQV9SOwotCQl0b2RjX2luZm8tPmVuYWJsZV93cml0ZSA9IFRPRENfTUs0OFRYWF9DTlRMX0FfVzsKLQotCQljbnRsX2EgPSB0b2RjX3JlYWRfdmFsKHRvZGNfaW5mby0+Y29udHJvbF9hKTsKLQotCQkvKiBDaGVjayAmIGNsZWFyIFNUT1AgYml0IGluIGNvbnRyb2wgQiByZWdpc3RlciAqLwotCQlpZiAoY250bF9iICYgVE9EQ19NSzQ4VFhYX0RBWV9DQikgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVE9EQyAlcyAlc1xuIiwKLQkJCQkicmVhbC10aW1lLWNsb2NrIHdhcyBzdG9wcGVkLiIsCi0JCQkJIk5vdyBzdGFydGluZy4uLiIpOwotCi0JCQljbnRsX2EgfD0gdG9kY19pbmZvLT5lbmFibGVfd3JpdGU7Ci0JCQljbnRsX2IgJj0gflRPRENfTUs0OFRYWF9EQVlfQ0I7LyogU3RhcnQgT3NjaWwgKi8KLQotCQkJdG9kY193cml0ZV92YWwodG9kY19pbmZvLT5jb250cm9sX2EsIGNudGxfYSk7Ci0JCQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPmNvbnRyb2xfYiwgY250bF9iKTsKLQkJfQotCi0JCS8qIE1ha2Ugc3VyZSBSRUFEICYgV1JJVEUgYml0cyBhcmUgY2xlYXJlZC4gKi8KLQkJY250bF9hICY9IH4odG9kY19pbmZvLT5lbmFibGVfd3JpdGUgfCB0b2RjX2luZm8tPmVuYWJsZV9yZWFkKTsKLQkJdG9kY193cml0ZV92YWwodG9kY19pbmZvLT5jb250cm9sX2EsIGNudGxfYSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGVyZSBpcyBzb21lIHVnbHkgc3R1ZmYgaW4gdGhhdCB0aGVyZSBhcmUgYXNzdW1wdGlvbnMgdGhhdCBmb3IgYSBtYzE0NjgxOCwKLSAqIHRoZSB0b2RjX2luZm8tPmNvbnRyb2xfYSBoYXMgdGhlIG9mZnNldCBvZiB0aGUgbWMxNDY4MTggUmVnaXN0ZXIgQiByZWcgYW5kCi0gKiB0aGF0IHRoZSByZWdpc3RlcidzcyAnU0VUJyBiaXQgaXMgdGhlIHNhbWUgYXMgdGhlIG00OHR4eCdzIHdyaXRlIGVuYWJsZQotICogYml0IGluIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBtNDh0eHggKGkuZS4sIDB4ODApLgotICoKLSAqIEl0IHdhcyBkb25lIHRvIG1ha2UgdGhlIGNvZGUgbG9vayBzaW1wbGVyLgotICovCi12b2lkCi10b2RjX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXVpbnQJeWVhciA9IDAsIG1vbiA9IDAsIG1kYXkgPSAwLCBob3VyID0gMCwgbWluID0gMCwgc2VjID0gMDsKLQl1aW50CWxpbWl0LCBpOwotCXVfY2hhcglzYXZlX2NvbnRyb2wsIHVpcCA9IDA7Ci0JZXh0ZXJuIHZvaWQgR3JlZ29yaWFuRGF5KHN0cnVjdCBydGNfdGltZSAqKTsKLQotCXNwaW5fbG9jaygmcnRjX2xvY2spOwotCXNhdmVfY29udHJvbCA9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5jb250cm9sX2EpOwotCi0JaWYgKHRvZGNfaW5mby0+cnRjX3R5cGUgIT0gVE9EQ19UWVBFX01DMTQ2ODE4KSB7Ci0JCWxpbWl0ID0gMTsKLQotCQlzd2l0Y2ggKHRvZGNfaW5mby0+cnRjX3R5cGUpIHsKLQkJY2FzZSBUT0RDX1RZUEVfRFMxNTUzOgotCQljYXNlIFRPRENfVFlQRV9EUzE1NTc6Ci0JCWNhc2UgVE9EQ19UWVBFX0RTMTc0MzoKLQkJY2FzZSBUT0RDX1RZUEVfRFMxNzQ2OgkvKiBYWFhYIEJBRCBIQUNLIC0+IEZJWCAqLwotCQljYXNlIFRPRENfVFlQRV9EUzE3NDc6Ci0JCWNhc2UgVE9EQ19UWVBFX0RTMTcyODU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRvZGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+Y29udHJvbF9hLAotCQkJCShzYXZlX2NvbnRyb2wgfCB0b2RjX2luZm8tPmVuYWJsZV9yZWFkKSk7Ci0JCX0KLQl9IGVsc2UKLQkJbGltaXQgPSAxMDAwMDAwMDA7Ci0KLQlmb3IgKGk9MDsgaTxsaW1pdDsgaSsrKSB7Ci0JCWlmICh0b2RjX2luZm8tPnJ0Y190eXBlID09IFRPRENfVFlQRV9NQzE0NjgxOCkKLQkJCXVpcCA9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5SVENfRlJFUV9TRUxFQ1QpOwotCi0JCXNlYyA9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5zZWNvbmRzKSAmIDB4N2Y7Ci0JCW1pbiA9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5taW51dGVzKSAmIDB4N2Y7Ci0JCWhvdXIgPSB0b2RjX3JlYWRfdmFsKHRvZGNfaW5mby0+aG91cnMpICYgMHgzZjsKLQkJbWRheSA9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5kYXlfb2ZfbW9udGgpICYgMHgzZjsKLQkJbW9uID0gdG9kY19yZWFkX3ZhbCh0b2RjX2luZm8tPm1vbnRoKSAmIDB4MWY7Ci0JCXllYXIgPSB0b2RjX3JlYWRfdmFsKHRvZGNfaW5mby0+eWVhcikgJiAweGZmOwotCi0JCWlmICh0b2RjX2luZm8tPnJ0Y190eXBlID09IFRPRENfVFlQRV9NQzE0NjgxOCkgewotCQkJdWlwIHw9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5SVENfRlJFUV9TRUxFQ1QpOwotCQkJaWYgKCh1aXAgJiBSVENfVUlQKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHRvZGNfaW5mby0+cnRjX3R5cGUgIT0gVE9EQ19UWVBFX01DMTQ2ODE4KSB7Ci0JCXN3aXRjaCAodG9kY19pbmZvLT5ydGNfdHlwZSkgewotCQljYXNlIFRPRENfVFlQRV9EUzE1NTM6Ci0JCWNhc2UgVE9EQ19UWVBFX0RTMTU1NzoKLQkJY2FzZSBUT0RDX1RZUEVfRFMxNzQzOgotCQljYXNlIFRPRENfVFlQRV9EUzE3NDY6CS8qIFhYWFggQkFEIEhBQ0sgLT4gRklYICovCi0JCWNhc2UgVE9EQ19UWVBFX0RTMTc0NzoKLQkJY2FzZSBUT0RDX1RZUEVfRFMxNzI4NToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc2F2ZV9jb250cm9sICY9IH4odG9kY19pbmZvLT5lbmFibGVfcmVhZCk7Ci0JCQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPmNvbnRyb2xfYSwgc2F2ZV9jb250cm9sKTsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmcnRjX2xvY2spOwotCi0JaWYgKCh0b2RjX2luZm8tPnJ0Y190eXBlICE9IFRPRENfVFlQRV9NQzE0NjgxOCkKLQkJCXx8ICgoc2F2ZV9jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgPT0gMCkKLQkJCXx8IFJUQ19BTFdBWVNfQkNEKSB7Ci0JCUJDRF9UT19CSU4oc2VjKTsKLQkJQkNEX1RPX0JJTihtaW4pOwotCQlCQ0RfVE9fQklOKGhvdXIpOwotCQlCQ0RfVE9fQklOKG1kYXkpOwotCQlCQ0RfVE9fQklOKG1vbik7Ci0JCUJDRF9UT19CSU4oeWVhcik7Ci0JfQotCi0JaWYgKCh5ZWFyICsgMTkwMCkgPCAxOTcwKSB7Ci0JCXllYXIgKz0gMTAwOwotCX0KLQotCXRtLT50bV9zZWMgPSBzZWM7Ci0JdG0tPnRtX21pbiA9IG1pbjsKLQl0bS0+dG1faG91ciA9IGhvdXI7Ci0JdG0tPnRtX21kYXkgPSBtZGF5OwotCXRtLT50bV9tb24gPSBtb247Ci0JdG0tPnRtX3llYXIgPSB5ZWFyOwotCi0JR3JlZ29yaWFuRGF5KHRtKTsKLX0KLQotaW50Ci10b2RjX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXVfY2hhciBzYXZlX2NvbnRyb2wsIHNhdmVfZnJlcV9zZWxlY3QgPSAwOwotCi0Jc3Bpbl9sb2NrKCZydGNfbG9jayk7Ci0Jc2F2ZV9jb250cm9sID0gdG9kY19yZWFkX3ZhbCh0b2RjX2luZm8tPmNvbnRyb2xfYSk7Ci0KLQkvKiBBc3N1bWluZyBNSzQ4VDU5X1JUQ19DQV9XUklURSAmIFJUQ19TRVQgYXJlIGVxdWFsICovCi0JdG9kY193cml0ZV92YWwodG9kY19pbmZvLT5jb250cm9sX2EsCi0JCShzYXZlX2NvbnRyb2wgfCB0b2RjX2luZm8tPmVuYWJsZV93cml0ZSkpOwotCXNhdmVfY29udHJvbCAmPSB+KHRvZGNfaW5mby0+ZW5hYmxlX3dyaXRlKTsgLyogaW4gY2FzZSBpdCB3YXMgc2V0ICovCi0KLQlpZiAodG9kY19pbmZvLT5ydGNfdHlwZSA9PSBUT0RDX1RZUEVfTUMxNDY4MTgpIHsKLQkJc2F2ZV9mcmVxX3NlbGVjdCA9IHRvZGNfcmVhZF92YWwodG9kY19pbmZvLT5SVENfRlJFUV9TRUxFQ1QpOwotCQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPlJUQ19GUkVRX1NFTEVDVCwKLQkJCXNhdmVfZnJlcV9zZWxlY3QgfCBSVENfRElWX1JFU0VUMik7Ci0JfQotCi0JaWYgKCh0b2RjX2luZm8tPnJ0Y190eXBlICE9IFRPRENfVFlQRV9NQzE0NjgxOCkKLQkJCXx8ICgoc2F2ZV9jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgPT0gMCkKLQkJCXx8IFJUQ19BTFdBWVNfQkNEKSB7Ci0JCUJJTl9UT19CQ0QodG0tPnRtX3NlYyk7Ci0JCUJJTl9UT19CQ0QodG0tPnRtX21pbik7Ci0JCUJJTl9UT19CQ0QodG0tPnRtX2hvdXIpOwotCQlCSU5fVE9fQkNEKHRtLT50bV9tb24pOwotCQlCSU5fVE9fQkNEKHRtLT50bV9tZGF5KTsKLQkJQklOX1RPX0JDRCh0bS0+dG1feWVhcik7Ci0JfQotCi0JdG9kY193cml0ZV92YWwodG9kY19pbmZvLT5zZWNvbmRzLCB0bS0+dG1fc2VjKTsKLQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPm1pbnV0ZXMsIHRtLT50bV9taW4pOwotCXRvZGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+aG91cnMsIHRtLT50bV9ob3VyKTsKLQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPm1vbnRoLCB0bS0+dG1fbW9uKTsKLQl0b2RjX3dyaXRlX3ZhbCh0b2RjX2luZm8tPmRheV9vZl9tb250aCwgdG0tPnRtX21kYXkpOwotCXRvZGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+eWVhciwgdG0tPnRtX3llYXIpOwotCi0JdG9kY193cml0ZV92YWwodG9kY19pbmZvLT5jb250cm9sX2EsIHNhdmVfY29udHJvbCk7Ci0KLQlpZiAodG9kY19pbmZvLT5ydGNfdHlwZSA9PSBUT0RDX1RZUEVfTUMxNDY4MTgpCi0JCXRvZGNfd3JpdGVfdmFsKHRvZGNfaW5mby0+UlRDX0ZSRVFfU0VMRUNULCBzYXZlX2ZyZXFfc2VsZWN0KTsKLQotCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jCmluZGV4IDMyMmY4NmUuLmFlMjQ5YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jCkBAIC0zLDYgKzMsOCBAQAogICoKICAqIDIwMDQtMjAwNSAoYykgVHVuZHJhIFNlbWljb25kdWN0b3IgQ29ycC4KICAqIEF1dGhvcjogQWxleCBCb3VuaW5lIChhbGV4YW5kcmViQHR1bmRyYS5jb20pCisgKiBBdXRob3I6IFJveSBaYW5nICh0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbSkKKyAqIAkgICBBZGQgcGNpIGludGVycnVwdCByb3V0ZXIgaG9zdAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtNDgsNiArNTAsOCBAQAogCiB1MzIgdHNpMTA4X3BjaV9jZmdfYmFzZTsKIHUzMiB0c2kxMDhfY3NyX3Zpcl9iYXNlOworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2lycV9ub2RlOworc3RhdGljIHN0cnVjdCBpcnFfaG9zdCAqcGNpX2lycV9ob3N0OwogCiBleHRlcm4gdTMyIGdldF92aXJfY3NyYmFzZSh2b2lkKTsKIGV4dGVybiB1MzIgdHNpMTA4X3JlYWRfcmVnKHUzMiByZWdfb2Zmc2V0KTsKQEAgLTM3OCw2ICszODIsMzggQEAKIAkudW5tYXNrID0gdHNpMTA4X3BjaV9pcnFfZW5hYmxlLAogfTsKIAorc3RhdGljIGludCBwY2lfaXJxX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAorCQkJICAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQoreworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzBdOworCSpvdXRfZmxhZ3MgPSBJUlFfVFlQRV9MRVZFTF9ISUdIOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaV9pcnFfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgaXJxX2h3X251bWJlcl90IGh3KQorewl1bnNpZ25lZCBpbnQgaXJxOworCURCRygiJXMoJWQsIDB4JWx4KVxuIiwgX19GVU5DVElPTl9fLCB2aXJxLCBodyk7CisJaWYgKCh2aXJxID49IDEpICYmICh2aXJxIDw9IDQpKXsKKwkJaXJxID0gdmlycSArIElSUV9QQ0lfSU5UQURfQkFTRSAtIDE7CisJCWdldF9pcnFfZGVzYyhpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCQlzZXRfaXJxX2NoaXAoaXJxLCAmdHNpMTA4X3BjaV9pcnEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfaXJxX2hvc3RfbWF0Y2goc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIHBjaV9pcnFfbm9kZSA9PSBub2RlOworfQorCitzdGF0aWMgc3RydWN0IGlycV9ob3N0X29wcyBwY2lfaXJxX2hvc3Rfb3BzID0geworCS5tYXRjaCA9IHBjaV9pcnFfaG9zdF9tYXRjaCwKKwkubWFwID0gcGNpX2lycV9ob3N0X21hcCwKKwkueGxhdGUgPSBwY2lfaXJxX2hvc3RfeGxhdGUsCit9OworCiAvKgogICogRXhwb3J0ZWQgZnVuY3Rpb25zCiAgKi8KQEAgLTM5MSwxNSArNDI3LDE1IEBACiAgKiB0byB0aGUgTVBJQy4KICAqLwogCi12b2lkIF9faW5pdCB0c2kxMDhfcGNpX2ludF9pbml0KHZvaWQpCit2b2lkIF9faW5pdCB0c2kxMDhfcGNpX2ludF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKLQl1X2ludCBpOwotCiAJREJHKCJUc2kxMDhfcGNpX2ludF9pbml0OiBpbml0aWFsaXppbmcgUENJIGludGVycnVwdHNcbiIpOwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9QQ0lfSVJRUzsgaSsrKSB7Ci0JCWlycV9kZXNjW2kgKyBJUlFfUENJX0lOVEFEX0JBU0VdLmNoaXAgPSAmdHNpMTA4X3BjaV9pcnE7Ci0JCWlycV9kZXNjW2kgKyBJUlFfUENJX0lOVEFEX0JBU0VdLnN0YXR1cyB8PSBJUlFfTEVWRUw7CisJcGNpX2lycV9ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CisJcGNpX2lycV9ob3N0ID0gaXJxX2FsbG9jX2hvc3QoSVJRX0hPU1RfTUFQX0xFR0FDWSwgMCwgJnBjaV9pcnFfaG9zdF9vcHMsIDApOworCWlmIChwY2lfaXJxX2hvc3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInBjaV9pcnFfaG9zdDogZmFpbGVkIHRvIGFsbG9jYXRlIGlycSBob3N0ICFcbiIpOworCQlyZXR1cm47CiAJfQogCiAJaW5pdF9wY2lfc291cmNlKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy94bW9uL01ha2VmaWxlCmluZGV4IDEwOWQ4NzQuLjUxZDk3NTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL01ha2VmaWxlCkBAIC0zLDUgKzMsMTAgQEAKIGlmZGVmIENPTkZJR19QUEM2NAogRVhUUkFfQ0ZMQUdTICs9IC1tbm8tbWluaW1hbC10b2MKIGVuZGlmCi1vYmoteQkJCSs9IHhtb24ubyBwcGMtZGlzLm8gcHBjLW9wYy5vIHNldGptcC5vIHN0YXJ0Lm8gXAotCQkJICAgbm9uc3RkaW8ubworCitvYmoteQkJCSs9IHhtb24ubyBzZXRqbXAubyBzdGFydC5vIG5vbnN0ZGlvLm8KKworaWZkZWYgQ09ORklHX1hNT05fRElTQVNTRU1CTFkKK29iai15CQkJKz0gcHBjLWRpcy5vIHBwYy1vcGMubworb2JqLSQoQ09ORklHX1NQVV9CQVNFKQkrPSBzcHUtZGlzLm8gc3B1LW9wYy5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vZGlzLWFzbS5oIGIvYXJjaC9wb3dlcnBjL3htb24vZGlzLWFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMzUzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMveG1vbi9kaXMtYXNtLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfUE9XRVJQQ19YTU9OX0RJU19BU01fSAorI2RlZmluZSBfUE9XRVJQQ19YTU9OX0RJU19BU01fSAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEVsbGVybWFuLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitleHRlcm4gdm9pZCBwcmludF9hZGRyZXNzICh1bnNpZ25lZCBsb25nIG1lbWFkZHIpOworCisjaWZkZWYgQ09ORklHX1hNT05fRElTQVNTRU1CTFkKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9wb3dlcnBjKHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgbG9uZyBtZW1hZGRyKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9zcHUodW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nIG1lbWFkZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHByaW50X2luc25fcG93ZXJwYyh1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcgbWVtYWRkcikKK3sKKwlwcmludGYoIiUuOHgiLCBpbnNuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJpbnRfaW5zbl9zcHUodW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nIG1lbWFkZHIpCit7CisJcHJpbnRmKCIlLjh4IiwgaW5zbik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9QT1dFUlBDX1hNT05fRElTX0FTTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9wcGMtZGlzLmMgYi9hcmNoL3Bvd2VycGMveG1vbi9wcGMtZGlzLmMKaW5kZXggYWMwYTlkMi4uODkwOThmMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3BwYy1kaXMuYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi9wcGMtZGlzLmMKQEAgLTEsNSArMSw2IEBACiAvKiBwcGMtZGlzLmMgLS0gRGlzYXNzZW1ibGUgUG93ZXJQQyBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCkBAIC0xNiwyNyArMTcsMzYgQEAKIAogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KIAorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgIm5vbnN0ZGlvLmgiCiAjaW5jbHVkZSAiYW5zaWRlY2wuaCIKICNpbmNsdWRlICJwcGMuaCIKLQotZXh0ZXJuIHZvaWQgcHJpbnRfYWRkcmVzcyAodW5zaWduZWQgbG9uZyBtZW1hZGRyKTsKKyNpbmNsdWRlICJkaXMtYXNtLmgiCiAKIC8qIFByaW50IGEgUG93ZXJQQyBvciBQT1dFUiBpbnN0cnVjdGlvbi4gICovCiAKIGludAotcHJpbnRfaW5zbl9wb3dlcnBjICh1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcgbWVtYWRkciwgaW50IGRpYWxlY3QpCitwcmludF9pbnNuX3Bvd2VycGMgKHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgbG9uZyBtZW1hZGRyKQogewogICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOwogICB1bnNpZ25lZCBsb25nIG9wOworICBpbnQgZGlhbGVjdDsKIAotICBpZiAoZGlhbGVjdCA9PSAwKQotICAgIGRpYWxlY3QgPSBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ0xBU1NJQyB8IFBQQ19PUENPREVfQ09NTU9OCisgIGRpYWxlY3QgPSBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ0xBU1NJQyB8IFBQQ19PUENPREVfQ09NTU9OCiAJICAgICAgfCBQUENfT1BDT0RFXzY0IHwgUFBDX09QQ09ERV9QT1dFUjQgfCBQUENfT1BDT0RFX0FMVElWRUM7CiAKKyAgaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSU19QT1dFUjUpKQorICAgIGRpYWxlY3QgfD0gUFBDX09QQ09ERV9QT1dFUjU7CisKKyAgaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSU19DRUxMKSkKKyAgICBkaWFsZWN0IHw9IFBQQ19PUENPREVfQ0VMTCB8IFBQQ19PUENPREVfQUxUSVZFQzsKKworICBpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJTX1BPV0VSNikpCisgICAgZGlhbGVjdCB8PSBQUENfT1BDT0RFX1BPV0VSNSB8IFBQQ19PUENPREVfUE9XRVI2IHwgUFBDX09QQ09ERV9BTFRJVkVDOworCiAgIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCiAgIG9wID0gUFBDX09QIChpbnNuKTsKIApAQCAtMTIxLDcgKzEzMSw4IEBACiAJICAgIH0KIAogCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFIpICE9IDApCisJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfR1BSKSAhPSAwCisJICAgICAgfHwgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0dQUl8wKSAhPSAwICYmIHZhbHVlICE9IDApKQogCSAgICBwcmludGYoInIlbGQiLCB2YWx1ZSk7CiAJICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9GUFIpICE9IDApCiAJICAgIHByaW50ZigiZiVsZCIsIHZhbHVlKTsKQEAgLTEzNyw3ICsxNDgsNyBAQAogCSAgZWxzZQogCSAgICB7CiAJICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMykKLQkJcHJpbnRmKCJjciVkIiwgdmFsdWUpOworCQlwcmludGYoImNyJWxkIiwgdmFsdWUpOwogCSAgICAgIGVsc2UKIAkJewogCQkgIHN0YXRpYyBjb25zdCBjaGFyICpjYm5hbWVzWzRdID0geyAibHQiLCAiZ3QiLCAiZXEiLCAic28iIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9wcGMtb3BjLmMgYi9hcmNoL3Bvd2VycGMveG1vbi9wcGMtb3BjLmMKaW5kZXggNWVlOGZjMy4uNWQ4NDFmNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24vcHBjLW9wYy5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3BwYy1vcGMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHBwYy1vcGMuYyAtLSBQb3dlclBDIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyAgIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0CiAKICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KQEAgLTE3LDggKzE3LDggQEAKIAogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgICAwMjExMC0xMzAxLCBVU0EuICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSAibm9uc3RkaW8uaCIKQEAgLTg2LDYgKzg2LDggQEAKIHN0YXRpYyBsb25nIGV4dHJhY3Rfc2g2ICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zcHIgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CiBzdGF0aWMgbG9uZyBleHRyYWN0X3NwciAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc3ByZyAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3Rfc3ByZyAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfdGJyICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOwogc3RhdGljIGxvbmcgZXh0cmFjdF90YnIgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2V2MiAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKQEAgLTE5Niw4ICsxOTgsMTEgQEAKICNkZWZpbmUgQk9FIEJPICsgMQogICB7IDUsIDIxLCBpbnNlcnRfYm9lLCBleHRyYWN0X2JvZSwgMCB9LAogCisjZGVmaW5lIEJIIEJPRSArIDEKKyAgeyAyLCAxMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKwogICAvKiBUaGUgQlQgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQlQgQk9FICsgMQorI2RlZmluZSBCVCBCSCArIDEKICAgeyA1LCAyMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfQ1IgfSwKIAogICAvKiBUaGUgY29uZGl0aW9uIHJlZ2lzdGVyIG51bWJlciBwb3J0aW9uIG9mIHRoZSBCSSBmaWVsZCBpbiBhIEIgZm9ybQpAQCAtMzAxLDEwICszMDYsMTQgQEAKICNkZWZpbmUgTCBGWE00ICsgMQogICB7IDEsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAogCi0gIC8qIFRoZSBMRVYgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTEVWIEwgKyAxCisgIC8qIFRoZSBMRVYgZmllbGQgaW4gYSBQT1dFUiBTVkMgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNWQ19MRVYgTCArIDEKICAgeyA3LCA1LCBOVUxMLCBOVUxMLCAwIH0sCiAKKyAgLyogVGhlIExFViBmaWVsZCBpbiBhbiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTEVWIFNWQ19MRVYgKyAxCisgIHsgNywgNSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKwogICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQogICAgICBmb3JjZWQgdG8gemVyby4gICovCiAjZGVmaW5lIExJIExFViArIDEKQEAgLTM0Niw3ICszNTUsNyBAQAogCiAgIC8qIFRoZSBNTyBmaWVsZCBpbiBhbiBtYmFyIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgTU8gTUI2ICsgMQotICB7IDUsIDIxLCBOVUxMLCBOVUxMLCAwIH0sCisgIHsgNSwgMjEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCiAKICAgLyogVGhlIE5CIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSB2YWx1ZSAzMiBpcyBzdG9yZWQgYXMKICAgICAgMC4gICovCkBAIC0zNjQsMzAgKzM3MywzOCBAQAogI2RlZmluZSBSQV9NQVNLICgweDFmIDw8IDE2KQogICB7IDUsIDE2LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKIAorICAvKiBBcyBhYm92ZSwgYnV0IDAgaW4gdGhlIFJBIGZpZWxkIG1lYW5zIHplcm8sIG5vdCByMC4gICovCisjZGVmaW5lIFJBMCBSQSArIDEKKyAgeyA1LCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKKwogICAvKiBUaGUgUkEgZmllbGQgaW4gdGhlIERRIGZvcm0gbHEgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsCiAgICAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCi0jZGVmaW5lIFJBUSBSQSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhcSwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIH0sCisjZGVmaW5lIFJBUSBSQTAgKyAxCisgIHsgNSwgMTYsIGluc2VydF9yYXEsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUl8wIH0sCiAKICAgLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKICAgICAgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEgZmllbGQgbWF5IG5vdCBiZSB6ZXJvIGFuZCBtYXkgbm90CiAgICAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCiAjZGVmaW5lIFJBTCBSQVEgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYWwsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorICB7IDUsIDE2LCBpbnNlcnRfcmFsLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAogCiAgIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCiAgICAgIHJlc3RyaWN0aW9ucy4gICovCiAjZGVmaW5lIFJBTSBSQUwgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYW0sIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorICB7IDUsIDE2LCBpbnNlcnRfcmFtLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAogCiAgIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCiAgICAgIHN0b3JlIG9yIGFuIHVwZGF0aW5nIGZsb2F0aW5nIHBvaW50IGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBCiAgICAgIGZpZWxkIG1heSBub3QgYmUgemVyby4gICovCiAjZGVmaW5lIFJBUyBSQU0gKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYXMsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorICB7IDUsIDE2LCBpbnNlcnRfcmFzLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAorCisgIC8qIFRoZSBSQSBmaWVsZCBvZiB0aGUgdGxid2UgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgUkFPUFQgUkFTICsgMQorICB7IDUsIDE2LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAogCiAgIC8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYLCBYTywgTSwgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSQiBSQVMgKyAxCisjZGVmaW5lIFJCIFJBT1BUICsgMQogI2RlZmluZSBSQl9NQVNLICgweDFmIDw8IDExKQogICB7IDUsIDExLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKIApAQCAtNDA4LDE1ICs0MjUsMjAgQEAKICAgLyogVGhlIFJTIGZpZWxkIG9mIHRoZSBEUyBmb3JtIHN0cSBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwKICAgICAgdmFsdWUgcmVzdHJpY3Rpb25zLiAgKi8KICNkZWZpbmUgUlNRIFJTICsgMQotICB7IDUsIDIxLCBpbnNlcnRfcnNxLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKKyAgeyA1LCAyMSwgaW5zZXJ0X3JzcSwgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKIAogICAvKiBUaGUgUlQgZmllbGQgb2YgdGhlIERRIGZvcm0gbHEgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsCiAgICAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCiAjZGVmaW5lIFJUUSBSU1EgKyAxCi0gIHsgNSwgMjEsIGluc2VydF9ydHEsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorICB7IDUsIDIxLCBpbnNlcnRfcnRxLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAorCisgIC8qIFRoZSBSUyBmaWVsZCBvZiB0aGUgdGxid2UgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgUlNPIFJUUSArIDEKKyNkZWZpbmUgUlRPIFJTTworICB7IDUsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAogCiAgIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBYIG9yIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNIIFJUUSArIDEKKyNkZWZpbmUgU0ggUlNPICsgMQogI2RlZmluZSBTSF9NQVNLICgweDFmIDw8IDExKQogICB7IDUsIDExLCBOVUxMLCBOVUxMLCAwIH0sCiAKQEAgLTQyNSw4ICs0NDcsMTIgQEAKICNkZWZpbmUgU0g2X01BU0sgKCgweDFmIDw8IDExKSB8ICgxIDw8IDEpKQogICB7IDYsIDEsIGluc2VydF9zaDYsIGV4dHJhY3Rfc2g2LCAwIH0sCiAKKyAgLyogVGhlIFNIIGZpZWxkIG9mIHRoZSB0bGJ3ZSBpbnN0cnVjdGlvbiwgd2hpY2ggaXMgb3B0aW9uYWwuICAqLworI2RlZmluZSBTSE8gU0g2ICsgMQorICB7IDUsIDExLE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKICAgLyogVGhlIFNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0kgU0g2ICsgMQorI2RlZmluZSBTSSBTSE8gKyAxCiAgIHsgMTYsIDAsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX1NJR05FRCB9LAogCiAgIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHdlIGFjY2VwdCBhIHdpZGUgcmFuZ2UKQEAgLTQ0OCw4ICs0NzQsNyBAQAogCiAgIC8qIFRoZSBTUFJHIHJlZ2lzdGVyIG51bWJlciBpbiBhbiBYRlggZm9ybSBtW2Z0XXNwcmcgaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBTUFJHIFNQUkJBVCArIDEKLSNkZWZpbmUgU1BSR19NQVNLICgweDMgPDwgMTYpCi0gIHsgMiwgMTYsIE5VTEwsIE5VTEwsIDAgfSwKKyAgeyA1LCAxNiwgaW5zZXJ0X3NwcmcsIGV4dHJhY3Rfc3ByZywgMCB9LAogCiAgIC8qIFRoZSBTUiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBTUiBTUFJHICsgMQpAQCAtNTM2LDEwICs1NjEsNDUgQEAKICNkZWZpbmUgV1NfTUFTSyAoMHg3IDw8IDExKQogICB7IDMsIDExLCBOVUxMLCBOVUxMLCAwIH0sCiAKLSAgLyogVGhlIEwgZmllbGQgaW4gYW4gbXRtc3JkIGluc3RydWN0aW9uICovCisgIC8qIFRoZSBMIGZpZWxkIGluIGFuIG10bXNyZCBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBNVE1TUkRfTCBXUyArIDEKKyNkZWZpbmUgQV9MIE1UTVNSRF9MCiAgIHsgMSwgMTYsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCiAKKyAgLyogVGhlIERDTSBmaWVsZCBpbiBhIFogZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIERDTSBNVE1TUkRfTCArIDEKKyAgeyA2LCAxNiwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIExpa2V3aXNlLCB0aGUgREdNIGZpZWxkIGluIGEgWiBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgREdNIERDTSArIDEKKyAgeyA2LCAxNiwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFRFIERHTSArIDEKKyAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFJNQyBURSArIDEKKyAgeyAyLCAyMSwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFIgUk1DICsgMQorICB7IDEsIDE1LCBOVUxMLCBOVUxMLCAwIH0sCisKKyNkZWZpbmUgU1AgUiArIDEKKyAgeyAyLCAxMSwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFMgU1AgKyAxCisgIHsgMSwgMTEsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBTSCBmaWVsZCBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gMTYuICAqLworI2RlZmluZSBTSDE2IFMgKyAxCisgIHsgNiwgMTAsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgTCBmaWVsZCBpbiBhbiBYIGZvcm0gd2l0aCB0aGUgUlQgZmllbGQgZml4ZWQgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYUlRfTCBTSDE2ICsgMQorICB7IDIsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBFSCBmaWVsZCBpbiBsYXJ4IGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRUggWFJUX0wgKyAxCisgIHsgMSwgMCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKIH07CiAKIC8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbnNlcnQgYW5kIGV4dHJhY3QgY29tcGxpY2F0ZWQgb3BlcmFuZHMuICAqLwpAQCAtNTUwLDcgKzYxMCw2IEBACiAgICBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUKICAgIHNhbWUuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfYmF0ICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTU3Niw3ICs2MzUsNiBAQAogICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCiAgICBzYW1lLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2JiYSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQsCkBAIC01OTksNyArNjU3LDYgQEAKIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKICAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2JkICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgbG9uZyB2YWx1ZSwKQEAgLTYwOSw3ICs2NjYsNiBAQAogICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3RfYmQgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTYzMSw3ICs2ODcsNiBAQAogICAgaW4gQk8gZmllbGQsIHRoZSAiYSIgYml0IGlzIDAwMDEwIGZvciBicmFuY2ggb24gQ1IoQkkpIGFuZCAwMTAwMAogICAgZm9yIGJyYW5jaCBvbiBDVFIuICBXZSBvbmx5IGhhbmRsZSB0aGUgdGFrZW4vbm90LXRha2VuIGhpbnQgaGVyZS4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9iZG0gKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSwKQEAgLTY3Nyw3ICs3MzIsNiBAQAogICAgVGhpcyBpcyBsaWtlIEJETSwgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUKICAgIHRha2VuLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2JkcCAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlLApAQCAtODMxLDcgKzg4NSw2IEBACiAvKiBUaGUgRFEgZmllbGQgaW4gYSBEUSBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKICAgIGxvd2VyIGZvdXIgYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9kcSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgIGxvbmcgdmFsdWUsCkBAIC04NDMsNyArODk2LDYgQEAKICAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZjApOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X2RxICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCkBAIC05MTgsNyArOTcwLDYgQEAKIC8qIFRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgRCwgYnV0IHRoZQogICAgbG93ZXIgdHdvIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2RzICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgbG9uZyB2YWx1ZSwKQEAgLTkzMCw3ICs5ODEsNiBAQAogICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3RfZHMgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTk0MSw3ICs5OTEsNiBAQAogCiAvKiBUaGUgREUgZmllbGQgaW4gYSBERSBmb3JtIGluc3RydWN0aW9uLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2RlICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgbG9uZyB2YWx1ZSwKQEAgLTk1Myw3ICsxMDAyLDYgQEAKICAgcmV0dXJuIGluc24gfCAoKHZhbHVlIDw8IDQpICYgMHhmZmYwKTsKIH0KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgbG9uZwogZXh0cmFjdF9kZSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELApAQCAtOTY0LDcgKzEwMTIsNiBAQAogCiAvKiBUaGUgREVTIGZpZWxkIGluIGEgREVTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfZGVzICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUsCkBAIC05NzgsNyArMTAyNSw2IEBACiAgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSA8PCAyKSAmIDB4ZmZmMCk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3RfZGVzICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELApAQCAtOTk1LDE3ICsxMDQxLDMzIEBACiAJICAgIGludCBkaWFsZWN0LAogCSAgICBjb25zdCBjaGFyICoqZXJybXNnKQogeworICAvKiBJZiB3ZSdyZSBoYW5kbGluZyB0aGUgbWZvY3JmIGFuZCBtdG9jcmYgaW5zbnMgZW5zdXJlIHRoYXQgZXhhY3RseQorICAgICBvbmUgYml0IG9mIHRoZSBtYXNrIGZpZWxkIGlzIHNldC4gICovCisgIGlmICgoaW5zbiAmICgxIDw8IDIwKSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAodmFsdWUgPT0gMCB8fCAodmFsdWUgJiAtdmFsdWUpICE9IHZhbHVlKQorCXsKKwkgICplcnJtc2cgPSBfKCJpbnZhbGlkIG1hc2sgZmllbGQiKTsKKwkgIHZhbHVlID0gMDsKKwl9CisgICAgfQorCiAgIC8qIElmIHRoZSBvcHRpb25hbCBmaWVsZCBvbiBtZmNyIGlzIG1pc3NpbmcgdGhhdCBtZWFucyB3ZSB3YW50IHRvIHVzZQogICAgICB0aGUgb2xkIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uIHRoYXQgbW92ZXMgdGhlIHdob2xlIGNyLiAgSW4gdGhhdAogICAgICBjYXNlIHdlJ2xsIGhhdmUgVkFMVUUgemVyby4gIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0bwogICAgICBkaXN0aW5ndWlzaCB0aGlzIGZyb20gdGhlIGNhc2Ugd2hlcmUgc29tZW9uZSB3cml0ZXMgbWZjciAlcjMsMC4gICovCi0gIGlmICh2YWx1ZSA9PSAwKQorICBlbHNlIGlmICh2YWx1ZSA9PSAwKQogICAgIDsKIAogICAvKiBJZiBvbmx5IG9uZSBiaXQgb2YgdGhlIEZYTSBmaWVsZCBpcyBzZXQsIHdlIGNhbiB1c2UgdGhlIG5ldyBmb3JtCiAgICAgIG9mIHRoZSBpbnN0cnVjdGlvbiwgd2hpY2ggaXMgZmFzdGVyLiAgVW5saWtlIHRoZSBQb3dlcjQgYnJhbmNoIGhpbnQKLSAgICAgZW5jb2RpbmcsIHRoaXMgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUuICAqLwotICBlbHNlIGlmICgoZGlhbGVjdCAmIFBQQ19PUENPREVfUE9XRVI0KSAhPSAwICYmICh2YWx1ZSAmIC12YWx1ZSkgPT0gdmFsdWUpCisgICAgIGVuY29kaW5nLCB0aGlzIGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLiAgRG8gbm90IGdlbmVyYXRlIHRoZQorICAgICBuZXcgZm9ybSB1bmxlc3MgLW1wb3dlcjQgaGFzIGJlZW4gZ2l2ZW4sIG9yIC1tYW55IGFuZCB0aGUgdHdvCisgICAgIG9wZXJhbmQgZm9ybSBvZiBtZmNyIHdhcyB1c2VkLiAgKi8KKyAgZWxzZSBpZiAoKHZhbHVlICYgLXZhbHVlKSA9PSB2YWx1ZQorCSAgICYmICgoZGlhbGVjdCAmIFBQQ19PUENPREVfUE9XRVI0KSAhPSAwCisJICAgICAgIHx8ICgoZGlhbGVjdCAmIFBQQ19PUENPREVfQU5ZKSAhPSAwCisJCSAgICYmIChpbnNuICYgKDB4M2ZmIDw8IDEpKSA9PSAxOSA8PCAxKSkpCiAgICAgaW5zbiB8PSAxIDw8IDIwOwogCiAgIC8qIEFueSBvdGhlciB2YWx1ZSBvbiBtZmNyIGlzIGFuIGVycm9yLiAgKi8KQEAgLTEwMjAsNyArMTA4Miw3IEBACiAKIHN0YXRpYyBsb25nCiBleHRyYWN0X2Z4bSAodW5zaWduZWQgbG9uZyBpbnNuLAotCSAgICAgaW50IGRpYWxlY3QsCisJICAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAogCSAgICAgaW50ICppbnZhbGlkKQogewogICBsb25nIG1hc2sgPSAoaW5zbiA+PiAxMikgJiAweGZmOwpAQCAtMTAyOCwxNCArMTA5MCw5IEBACiAgIC8qIElzIHRoaXMgYSBQb3dlcjQgaW5zbj8gICovCiAgIGlmICgoaW5zbiAmICgxIDw8IDIwKSkgIT0gMCkKICAgICB7Ci0gICAgICBpZiAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BPV0VSNCkgPT0gMCkKKyAgICAgIC8qIEV4YWN0bHkgb25lIGJpdCBvZiBNQVNLIHNob3VsZCBiZSBzZXQuICAqLworICAgICAgaWYgKG1hc2sgPT0gMCB8fCAobWFzayAmIC1tYXNrKSAhPSBtYXNrKQogCSppbnZhbGlkID0gMTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBFeGFjdGx5IG9uZSBiaXQgb2YgTUFTSyBzaG91bGQgYmUgc2V0LiAgKi8KLQkgIGlmIChtYXNrID09IDAgfHwgKG1hc2sgJiAtbWFzaykgIT0gbWFzaykKLQkgICAgKmludmFsaWQgPSAxOwotCX0KICAgICB9CiAKICAgLyogQ2hlY2sgdGhhdCBub24tcG93ZXI0IGZvcm0gb2YgbWZjciBoYXMgYSB6ZXJvIE1BU0suICAqLwpAQCAtMTA1MSw3ICsxMTA4LDYgQEAKIC8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCiAgICBmb3JjZWQgdG8gemVyby4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9saSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgIGxvbmcgdmFsdWUsCkBAIC0xMDYzLDcgKzExMTksNiBAQAogICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4M2ZmZmZmYyk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3RfbGkgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTExNjMsNyArMTIxOCw2IEBACiAvKiBUaGUgTUIgb3IgTUUgZmllbGQgaW4gYW4gTUQgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCBiaXQKICAgIGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfbWI2ICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUsCkBAIC0xMTczLDcgKzEyMjcsNiBAQAogICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCA2KSB8ICh2YWx1ZSAmIDB4MjApOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X21iNiAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTExOTgsNyArMTI1MSw2IEBACiAgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDExKTsKIH0KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgbG9uZwogZXh0cmFjdF9uYiAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELApAQCAtMTIxNyw3ICsxMjY5LDYgQEAKICAgIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuIGluc3RydWN0aW9uIHdoaWNoIHVzZXMKICAgIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X25zaSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlLApAQCAtMTI2OSw3ICsxMzIwLDYgQEAKIC8qIFRoZSBSQSBmaWVsZCBpbiB0aGUgRFEgZm9ybSBscSBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwKICAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9yYXEgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSwKQEAgLTEzMDQsNyArMTM1NCw2IEBACiAgICBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQlQgZmllbGQgaW50byB0aGUgQkEgZmllbGQsIGFuZCB0aGUKICAgIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZS4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9yYnMgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VELApAQCAtMTMyNyw3ICsxMzc2LDYgQEAKIC8qIFRoZSBSVCBmaWVsZCBvZiB0aGUgRFEgZm9ybSBscSBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwKICAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9ydHEgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSwKQEAgLTEzNDIsNyArMTM5MCw2IEBACiAvKiBUaGUgUlMgZmllbGQgb2YgdGhlIERTIGZvcm0gc3RxIGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbAogICAgdmFsdWUgcmVzdHJpY3Rpb25zLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X3JzcSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQsCkBAIC0xMzU2LDcgKzE0MDMsNiBAQAogCiAvKiBUaGUgU0ggZmllbGQgaW4gYW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgc3BsaXQuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfc2g2ICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUsCkBAIC0xMzY2LDcgKzE0MTIsNiBAQAogICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSkgfCAoKHZhbHVlICYgMHgyMCkgPj4gNCk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3Rfc2g2ICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELApAQCAtMTM5NSw2ICsxNDQwLDQ3IEBACiAgIHJldHVybiAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7CiB9CiAKKy8qIFNvbWUgZGlhbGVjdHMgaGF2ZSA4IFNQUkcgcmVnaXN0ZXJzIGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIDQuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3NwcmcgKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICAgIGxvbmcgdmFsdWUsCisJICAgICBpbnQgZGlhbGVjdCwKKwkgICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpCit7CisgIC8qIFRoaXMgY2hlY2sgdXNlcyBQUENfT1BDT0RFXzQwMyBiZWNhdXNlIFBQQzQwNSBpcyBsYXRlciBkZWZpbmVkCisgICAgIGFzIGEgc3lub255bS4gIElmIGV2ZXIgYSA0MDUgc3BlY2lmaWMgZGlhbGVjdCBpcyBhZGRlZCB0aGlzCisgICAgIGNoZWNrIHNob3VsZCB1c2UgdGhhdCBpbnN0ZWFkLiAgKi8KKyAgaWYgKHZhbHVlID4gNworICAgICAgfHwgKHZhbHVlID4gMworCSAgJiYgKGRpYWxlY3QgJiAoUFBDX09QQ09ERV9CT09LRSB8IFBQQ19PUENPREVfNDAzKSkgPT0gMCkpCisgICAgKmVycm1zZyA9IF8oImludmFsaWQgc3ByZyBudW1iZXIiKTsKKworICAvKiBJZiB0aGlzIGlzIG1mc3ByZzQuLjcgdGhlbiB1c2Ugc3ByIDI2MC4uMjYzIHdoaWNoIGNhbiBiZSByZWFkIGluCisgICAgIHVzZXIgbW9kZS4gIEFueXRoaW5nIGVsc2UgbXVzdCB1c2Ugc3ByIDI3Mi4uMjc5LiAgKi8KKyAgaWYgKHZhbHVlIDw9IDMgfHwgKGluc24gJiAweDEwMCkgIT0gMCkKKyAgICB2YWx1ZSB8PSAweDEwOworCisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MTcpIDw8IDE2KTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3Rfc3ByZyAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgIGludCBkaWFsZWN0LAorCSAgICAgIGludCAqaW52YWxpZCkKK3sKKyAgdW5zaWduZWQgbG9uZyB2YWwgPSAoaW5zbiA+PiAxNikgJiAweDFmOworCisgIC8qIG1mc3ByZyBjYW4gdXNlIDI2MC4uMjYzIGFuZCAyNzIuLjI3OS4gIG10c3ByZyBvbmx5IHVzZXMgc3ByIDI3Mi4uMjc5CisgICAgIElmIG5vdCBCT09LRSBvciA0MDUsIHRoZW4gYm90aCB1c2Ugb25seSAyNzIuLjI3NS4gICovCisgIGlmICh2YWwgPD0gMworICAgICAgfHwgKHZhbCA8IDB4MTAgJiYgKGluc24gJiAweDEwMCkgIT0gMCkKKyAgICAgIHx8ICh2YWwgLSAweDEwID4gMworCSAgJiYgKGRpYWxlY3QgJiAoUFBDX09QQ09ERV9CT09LRSB8IFBQQ19PUENPREVfNDAzKSkgPT0gMCkpCisgICAgKmludmFsaWQgPSAxOworICByZXR1cm4gdmFsICYgNzsKK30KKwogLyogVGhlIFRCUiBmaWVsZCBpbiBhbiBYRlggaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGp1c3QgbGlrZSBTUFIsIGJ1dCBpdAogICAgaXMgb3B0aW9uYWwuICBXaGVuIFRCUiBpcyBvbWl0dGVkLCBpdCBtdXN0IGJlIGluc2VydGVkIGFzIDI2OCAodGhlCiAgICBtYWdpYyBudW1iZXIgb2YgdGhlIFRCIHJlZ2lzdGVyKS4gIFRoZXNlIGZ1bmN0aW9ucyB0cmVhdCAwCkBAIC0xNDYwLDYgKzE1NDYsOSBAQAogLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQSBhbmQgRlJDIGZpZWxkcyBmaXhlZC4gICovCiAjZGVmaW5lIEFGUkFGUkNfTUFTSyAoQV9NQVNLIHwgRlJBX01BU0sgfCBGUkNfTUFTSykKIAorLyogQW4gQUZSQUZSQ19NQVNLLCBidXQgd2l0aCBMIGJpdCBjbGVhci4gICovCisjZGVmaW5lIEFGUkFMRlJDX01BU0sgKEFGUkFGUkNfTUFTSyAmIH4oKHVuc2lnbmVkIGxvbmcpIDEgPDwgMTYpKQorCiAvKiBBIEIgZm9ybSBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIEIob3AsIGFhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoYWEpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKICNkZWZpbmUgQl9NQVNLIEIgKDB4M2YsIDEsIDEpCkBAIC0xNDk0LDExICsxNTgzLDExIEBACiAKIC8qIEFuIENvbnRleHQgZm9ybSBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIENUWChvcCwgeG9wKSAgIChPUCAob3ApIHwgKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDcpKQotI2RlZmluZSBDVFhfTUFTSyAgICAgICBDVFgoMHgzZiwgMHg3KQorI2RlZmluZSBDVFhfTUFTSyBDVFgoMHgzZiwgMHg3KQogCiAvKiBBbiBVc2VyIENvbnRleHQgZm9ybSBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIFVDVFgob3AsIHhvcCkgIChPUCAob3ApIHwgKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmKSkKLSNkZWZpbmUgVUNUWF9NQVNLICAgICAgVUNUWCgweDNmLCAweDFmKQorI2RlZmluZSBVQ1RYX01BU0sgVUNUWCgweDNmLCAweDFmKQogCiAvKiBUaGUgbWFpbiBvcGNvZGUgbWFzayB3aXRoIHRoZSBSQSBmaWVsZCBjbGVhci4gICovCiAjZGVmaW5lIERSQV9NQVNLIChPUF9NQVNLIHwgUkFfTUFTSykKQEAgLTE1NzAsMTIgKzE2NTksMjEgQEAKIC8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIFgob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCiAKKy8qIEEgWiBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWihvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWZmKSA8PCAxKSkKKwogLyogQW4gWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFJDIGJpdCBzcGVjaWZpZWQuICAqLwogI2RlZmluZSBYUkMob3AsIHhvcCwgcmMpIChYICgob3ApLCAoeG9wKSkgfCAoKHJjKSAmIDEpKQogCisvKiBBIFogZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBSQyBiaXQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgWlJDKG9wLCB4b3AsIHJjKSAoWiAoKG9wKSwgKHhvcCkpIHwgKChyYykgJiAxKSkKKwogLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIFhfTUFTSyBYUkMgKDB4M2YsIDB4M2ZmLCAxKQogCisvKiBUaGUgbWFzayBmb3IgYSBaIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBaX01BU0sgWlJDICgweDNmLCAweDFmZiwgMSkKKwogLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGZpZWxkIGZpeGVkLiAgKi8KICNkZWZpbmUgWFJBX01BU0sgKFhfTUFTSyB8IFJBX01BU0spCiAKQEAgLTE1ODUsNiArMTY4Myw5IEBACiAvKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgZmllbGQgZml4ZWQuICAqLwogI2RlZmluZSBYUlRfTUFTSyAoWF9NQVNLIHwgUlRfTUFTSykKIAorLyogQW4gWFJUX01BU0sgbWFzayB3aXRoIHRoZSBMIGJpdHMgY2xlYXIuICAqLworI2RlZmluZSBYTFJUX01BU0sgKFhSVF9NQVNLICYgfigodW5zaWduZWQgbG9uZykgMHgzIDw8IDIxKSkKKwogLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGFuZCBSQiBmaWVsZHMgZml4ZWQuICAqLwogI2RlZmluZSBYUkFSQl9NQVNLIChYX01BU0sgfCBSQV9NQVNLIHwgUkJfTUFTSykKIApAQCAtMTU5Nyw4ICsxNjk4LDggQEAKIC8qIEFuIFhSVFJBX01BU0ssIGJ1dCB3aXRoIEwgYml0IGNsZWFyLiAgKi8KICNkZWZpbmUgWFJUTFJBX01BU0sgKFhSVFJBX01BU0sgJiB+KCh1bnNpZ25lZCBsb25nKSAxIDw8IDIxKSkKIAotLyogQW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYQ01QTChvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKKy8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBMIGJpdCBzcGVjaWZpZWQuICAqLworI2RlZmluZSBYT1BMKG9wLCB4b3AsIGwpIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQogCiAvKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBYQ01QX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjIpKQpAQCAtMTYyMSw2ICsxNzIyLDkgQEAKIC8qIEFuIFggZm9ybSBzeW5jIGluc3RydWN0aW9uIHdpdGggZXZlcnl0aGluZyBmaWxsZWQgaW4gZXhjZXB0IHRoZSBMUyBmaWVsZC4gICovCiAjZGVmaW5lIFhTWU5DX01BU0sgKDB4ZmY5ZmZmZmYpCiAKKy8qIEFuIFhfTUFTSywgYnV0IHdpdGggdGhlIEVIIGJpdCBjbGVhci4gICovCisjZGVmaW5lIFhFSF9NQVNLIChYX01BU0sgJiB+KCh1bnNpZ25lZCBsb25nICkxKSkKKwogLyogQW4gWCBmb3JtIEFsdGlWZWMgZHNzIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgWERTUyhvcCwgeG9wLCBhKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGEpKSAmIDEpIDw8IDI1KSkKICNkZWZpbmUgWERTU19NQVNLIFhEU1MoMHgzZiwgMHgzZmYsIDEpCkBAIC0xNjYzLDYgKzE3NjcsOSBAQAogI2RlZmluZSBYTFlCQl9NQVNLIChYTFlMS19NQVNLIHwgQkJfTUFTSykKICNkZWZpbmUgWExCT0NCQkJfTUFTSyAoWExPQ0JfTUFTSyB8IEJCX01BU0spCiAKKy8qIEEgbWFzayBmb3IgYnJhbmNoIGluc3RydWN0aW9ucyB1c2luZyB0aGUgQkggZmllbGQuICAqLworI2RlZmluZSBYTEJIX01BU0sgKFhMX01BU0sgfCAoMHgxYyA8PCAxMSkpCisKIC8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8gYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCiAjZGVmaW5lIFhMQk9CQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJCX01BU0spCiAKQEAgLTE2ODIsMTEgKzE3ODksMTIgQEAKICNkZWZpbmUgWFNfTUFTSyBYUyAoMHgzZiwgMHgxZmYsIDEpCiAKIC8qIEEgbWFzayBmb3IgdGhlIEZYTSB2ZXJzaW9uIG9mIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWEZYRlhNX01BU0sgKFhfTUFTSyB8ICgxIDw8IDExKSkKKyNkZWZpbmUgWEZYRlhNX01BU0sgKFhfTUFTSyB8ICgxIDw8IDExKSB8ICgxIDw8IDIwKSkKIAogLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgRlhNIGZpZWxkIGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhGWE0ob3AsIHhvcCwgZnhtKSBcCi0gIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoZnhtKSkgJiAweGZmKSA8PCAxMikpCisjZGVmaW5lIFhGWE0ob3AsIHhvcCwgZnhtLCBwNCkgXAorICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGZ4bSkpICYgMHhmZikgPDwgMTIpIFwKKyAgIHwgKCh1bnNpZ25lZCBsb25nKShwNCkgPDwgMjApKQogCiAvKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluLiAgKi8KICNkZWZpbmUgWFNQUihvcCwgeG9wLCBzcHIpIFwKQEAgLTE2OTksNyArMTgwNyw3IEBACiAKIC8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4gZXhjZXB0IGZvciB0aGUKICAgIFNQUkcgZmllbGQuICAqLwotI2RlZmluZSBYU1BSR19NQVNLIChYU1BSX01BU0sgJn4gU1BSR19NQVNLKQorI2RlZmluZSBYU1BSR19NQVNLIChYU1BSX01BU0sgJiB+KDB4MTcgPDwgMTYpKQogCiAvKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCBldmVyeXRoaW5nIGZpbGxlZCBpbiBleGNlcHQgdGhlIEUgZmllbGQuICAqLwogI2RlZmluZSBYRV9NQVNLICgweGZmZmY3ZmZmKQpAQCAtMTc2OSw2ICsxODc3LDkgQEAKICNkZWZpbmUgUFBDQ09NCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04KICNkZWZpbmUgTk9QT1dFUjQgUFBDX09QQ09ERV9OT1BPV0VSNCB8IFBQQ0NPTQogI2RlZmluZSBQT1dFUjQJUFBDX09QQ09ERV9QT1dFUjQKKyNkZWZpbmUgUE9XRVI1CVBQQ19PUENPREVfUE9XRVI1CisjZGVmaW5lIFBPV0VSNglQUENfT1BDT0RFX1BPV0VSNgorI2RlZmluZSBDRUxMCVBQQ19PUENPREVfQ0VMTAogI2RlZmluZSBQUEMzMiAgIFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFX1BQQwogI2RlZmluZSBQUEM2NCAgIFBQQ19PUENPREVfNjQgfCBQUENfT1BDT0RFX1BQQwogI2RlZmluZSBQUEM0MDMJUFBDX09QQ09ERV80MDMKQEAgLTE3NzYsNyArMTg4Nyw3IEBACiAjZGVmaW5lIFBQQzQ0MAlQUENfT1BDT0RFXzQ0MAogI2RlZmluZSBQUEM3NTAJUFBDCiAjZGVmaW5lIFBQQzg2MAlQUEMKLSNkZWZpbmUgUFBDVkVDCVBQQ19PUENPREVfQUxUSVZFQyB8IFBQQ19PUENPREVfUFBDCisjZGVmaW5lIFBQQ1ZFQwlQUENfT1BDT0RFX0FMVElWRUMKICNkZWZpbmUJUE9XRVIgICBQUENfT1BDT0RFX1BPV0VSCiAjZGVmaW5lCVBPV0VSMglQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIKICNkZWZpbmUgUFBDUFdSMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMgpAQCAtMTc5MCw2ICsxOTAxLDcgQEAKICNkZWZpbmUgQk9PS0UJUFBDX09QQ09ERV9CT09LRQogI2RlZmluZSBCT09LRTY0CVBQQ19PUENPREVfQk9PS0U2NAogI2RlZmluZSBDTEFTU0lDCVBQQ19PUENPREVfQ0xBU1NJQworI2RlZmluZSBQUENFMzAwIFBQQ19PUENPREVfRTMwMAogI2RlZmluZSBQUENTUEUJUFBDX09QQ09ERV9TUEUKICNkZWZpbmUgUFBDSVNFTAlQUENfT1BDT0RFX0lTRUwKICNkZWZpbmUgUFBDRUZTCVBQQ19PUENPREVfRUZTCkBAIC0xOTUyLDYgKzIwNjQsNDEgQEAKIHsgIm5tYWNsaHdzby4iLAlYTyg0LDQ5NCwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAogeyAibWZ2c2NyIiwgIFZYKDQsIDE1NDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZEIH0gfSwKIHsgIm10dnNjciIsICBWWCg0LCAxNjA0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWQiB9IH0sCisKKyAgLyogRG91YmxlLXByZWNpc2lvbiBvcGNvZGVzLiAgKi8KKyAgLyogU29tZSBvZiB0aGVzZSBjb25mbGljdCB3aXRoIEFsdGlWZWMsIHNvIG1vdmUgdGhlbSBiZWZvcmUsIHNpbmNlCisgICAgIFBQQ1ZFQyBpbmNsdWRlcyB0aGUgUFBDX09QQ09ERV9QUEMgc2V0LiAgKi8KK3sgImVmc2NmZCIsICAgVlgoNCwgNzE5KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkYWJzIiwgICBWWCg0LCA3NDApLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSB9IH0sCit7ICJlZmRuYWJzIiwgIFZYKDQsIDc0MSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBIH0gfSwKK3sgImVmZG5lZyIsICAgVlgoNCwgNzQyKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEgfSB9LAoreyAiZWZkYWRkIiwgICBWWCg0LCA3MzYpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZWZkc3ViIiwgICBWWCg0LCA3MzcpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZWZkbXVsIiwgICBWWCg0LCA3NDQpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZWZkZGl2IiwgICBWWCg0LCA3NDUpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZWZkY21wZ3QiLCBWWCg0LCA3NDgpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZmRjbXBsdCIsIFZYKDQsIDc0OSksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmZGNtcGVxIiwgVlgoNCwgNzUwKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZkdHN0Z3QiLCBWWCg0LCA3NjQpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZmR0c3RsdCIsIFZYKDQsIDc2NSksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmZHRzdGVxIiwgVlgoNCwgNzY2KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZkY2ZzaSIsICBWWCg0LCA3NTMpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnNpZCIsIFZYKDQsIDczOSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGNmdWkiLCAgVlgoNCwgNzUyKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY2Z1aWQiLCBWWCg0LCA3MzgpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnNmIiwgIFZYKDQsIDc1NSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGNmdWYiLCAgVlgoNCwgNzU0KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3RzaSIsICBWWCg0LCA3NTcpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHNpZHoiLFZYKDQsIDc0NyksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0c2l6IiwgVlgoNCwgNzYyKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3R1aSIsICBWWCg0LCA3NTYpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHVpZHoiLFZYKDQsIDc0NiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0dWl6IiwgVlgoNCwgNzYwKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3RzZiIsICBWWCg0LCA3NTkpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHVmIiwgIFZYKDQsIDc1OCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGNmcyIsICAgVlgoNCwgNzUxKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAorICAvKiBFbmQgb2YgZG91YmxlLXByZWNpc2lvbiBvcGNvZGVzLiAgKi8KKwogeyAidmFkZGN1dyIsIFZYKDQsICAzODQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAogeyAidmFkZGZwIiwgIFZYKDQsICAgMTApLCBWWF9NQVNLLCAJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKIHsgInZhZGRzYnMiLCBWWCg0LCAgNzY4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKQEAgLTIzODksMTYgKzI1MzYsMTYgQEAKIAogeyAibGkiLAkgICAgIE9QKDE0KSwJRFJBX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFNJIH0gfSwKIHsgImxpbCIsICAgICBPUCgxNCksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSSB9IH0sCi17ICJhZGRpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAiY2FsIiwgICAgIE9QKDE0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAic3ViaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi17ICJsYSIsCSAgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQSB9IH0sCit7ICJhZGRpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQTAsIFNJIH0gfSwKK3sgImNhbCIsICAgICBPUCgxNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCit7ICJzdWJpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQTAsIE5TSSB9IH0sCit7ICJsYSIsCSAgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQTAgfSB9LAogCiB7ICJsaXMiLCAgICAgT1AoMTUpLAlEUkFfTUFTSywJUFBDQ09NLAkJeyBSVCwgU0lTSUdOT1BUIH0gfSwKIHsgImxpdSIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoteyAiYWRkaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAiY2F1IiwgICAgIE9QKDE1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAic3ViaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCit7ICJhZGRpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULFJBMCxTSVNJR05PUFQgfSB9LAoreyAiY2F1IiwgICAgIE9QKDE1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCxSQTAsU0lTSUdOT1BUIH0gfSwKK3sgInN1YmlzIiwgICBPUCgxNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBMCwgTlNJIH0gfSwKIAogeyAiYmRuei0iLCAgIEJCTygxNixCT0ROWiwwLDApLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJETSB9IH0sCiB7ICJiZG56KyIsICAgQkJPKDE2LEJPRE5aLDAsMCksICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRQIH0gfSwKQEAgLTI2NjUsOSArMjgxMiw5IEBACiB7ICJiY2xhKyIsICAgQigxNiwxLDEpLAlCX01BU0ssCQlQUENDT00sCQl7IEJPRSwgQkksIEJEUEEgfSB9LAogeyAiYmNsYSIsICAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEQSB9IH0sCiAKLXsgInNjIiwgICAgICBTQygxNywxLDApLCAweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAoteyAic3ZjIiwgICAgIFNDKDE3LDAsMCksIFNDX01BU0ssCVBPV0VSLAkJeyBMRVYsIEZMMSwgRkwyIH0gfSwKLXsgInN2Y2wiLCAgICBTQygxNywwLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCit7ICJzYyIsICAgICAgU0MoMTcsMSwwKSwgU0NfTUFTSywJUFBDLAkJeyBMRVYgfSB9LAoreyAic3ZjIiwgICAgIFNDKDE3LDAsMCksIFNDX01BU0ssCVBPV0VSLAkJeyBTVkNfTEVWLCBGTDEsIEZMMiB9IH0sCit7ICJzdmNsIiwgICAgU0MoMTcsMCwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IFNWQ19MRVYsIEZMMSwgRkwyIH0gfSwKIHsgInN2Y2EiLCAgICBTQygxNywxLDApLCBTQ19NQVNLLAlQV1JDT00sCQl7IFNWIH0gfSwKIHsgInN2Y2xhIiwgICBTQygxNywxLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgU1YgfSB9LAogCkBAIC0yODkwLDEyICszMDM3LDEyIEBACiB7ICJiZHpmbHJsIiwgWExPKDE5LEJPRFpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKIHsgImJkemZscmwtIixYTE8oMTksQk9EWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCiB7ICJiZHpmbHJsKyIsWExPKDE5LEJPRFpGUCwxNiwxKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LCB7IEJJIH0gfSwKLXsgImJjbHIiLCAgICBYTExLKDE5LDE2LDApLCBYTFlCQl9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSB9IH0sCi17ICJiY2xybCIsICAgWExMSygxOSwxNiwxKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAogeyAiYmNscisiLCAgIFhMWUxLKDE5LDE2LDEsMCksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKIHsgImJjbHJsKyIsICBYTFlMSygxOSwxNiwxLDEpLCBYTFlCQl9NQVNLLCBQUENDT00sCXsgQk9FLCBCSSB9IH0sCiB7ICJiY2xyLSIsICAgWExZTEsoMTksMTYsMCwwKSwgWExZQkJfTUFTSywgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAogeyAiYmNscmwtIiwgIFhMWUxLKDE5LDE2LDAsMSksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKK3sgImJjbHIiLCAgICBYTExLKDE5LDE2LDApLCBYTEJIX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJLCBCSCB9IH0sCit7ICJiY2xybCIsICAgWExMSygxOSwxNiwxKSwgWExCSF9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSwgQkggfSB9LAogeyAiYmNyIiwgICAgIFhMTEsoMTksMTYsMCksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAogeyAiYmNybCIsICAgIFhMTEsoMTksMTYsMSksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAogeyAiYmNscmUiLCAgIFhMTEsoMTksMTcsMCksIFhMQkJfTUFTSywJQk9PS0U2NCwJeyBCTywgQkkgfSB9LApAQCAtMjkyNCwxNCArMzA3MSwyMyBAQAogCiB7ICJjcmFuZCIsICAgWEwoMTksMjU3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKIAoreyAiaHJmaWQiLCAgIFhMKDE5LDI3NCksIDB4ZmZmZmZmZmYsCVBPV0VSNSB8IENFTEwsCXsgMCB9IH0sCisKIHsgImNyc2V0IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQVQsIEJCQSB9IH0sCiB7ICJjcmVxdiIsICAgWEwoMTksMjg5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKIAoreyAiZG96ZSIsICAgIFhMKDE5LDQwMiksIDB4ZmZmZmZmZmYsCVBPV0VSNiwJCXsgMCB9IH0sCisKIHsgImNyb3JjIiwgICBYTCgxOSw0MTcpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAogCit7ICJuYXAiLCAgICAgWEwoMTksNDM0KSwgMHhmZmZmZmZmZiwJUE9XRVI2LAkJeyAwIH0gfSwKKwogeyAiY3Jtb3ZlIiwgIFhMKDE5LDQ0OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAogeyAiY3JvciIsICAgIFhMKDE5LDQ0OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCiAKK3sgInNsZWVwIiwgICBYTCgxOSw0NjYpLCAweGZmZmZmZmZmLAlQT1dFUjYsCQl7IDAgfSB9LAoreyAicnZ3aW5rbGUiLCBYTCgxOSw0OTgpLCAweGZmZmZmZmZmLAlQT1dFUjYsCQl7IDAgfSB9LAorCiB7ICJiY3RyIiwgICAgWExPKDE5LEJPVSw1MjgsMCksIFhMQk9CSUJCX01BU0ssIENPTSwJeyAwIH0gfSwKIHsgImJjdHJsIiwgICBYTE8oMTksQk9VLDUyOCwxKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAogeyAiYmx0Y3RyIiwgIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCkBAIC0zMDc0LDEyICszMjMwLDEyIEBACiB7ICJiZmN0cmwtIiwgWExPKDE5LEJPRk00LDUyOCwxKSwgWExCT0JCX01BU0ssIFBPV0VSNCwgeyBCSSB9IH0sCiB7ICJiZmN0cmwrIiwgWExPKDE5LEJPRlAsNTI4LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAogeyAiYmZjdHJsKyIsIFhMTygxOSxCT0ZQNCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQT1dFUjQsIHsgQkkgfSB9LAoteyAiYmNjdHIiLCAgIFhMTEsoMTksNTI4LDApLCAgICAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCTywgQkkgfSB9LAogeyAiYmNjdHItIiwgIFhMWUxLKDE5LDUyOCwwLDApLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKIHsgImJjY3RyKyIsICBYTFlMSygxOSw1MjgsMSwwKSwgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cmwiLCAgWExMSygxOSw1MjgsMSksICAgICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPLCBCSSB9IH0sCiB7ICJiY2N0cmwtIiwgWExZTEsoMTksNTI4LDAsMSksICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAogeyAiYmNjdHJsKyIsIFhMWUxLKDE5LDUyOCwxLDEpLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKK3sgImJjY3RyIiwgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMQkhfTUFTSywgICBQUENDT00sCXsgQk8sIEJJLCBCSCB9IH0sCit7ICJiY2N0cmwiLCAgWExMSygxOSw1MjgsMSksICAgICBYTEJIX01BU0ssICAgUFBDQ09NLAl7IEJPLCBCSSwgQkggfSB9LAogeyAiYmNjIiwgICAgIFhMTEsoMTksNTI4LDApLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAogeyAiYmNjbCIsICAgIFhMTEsoMTksNTI4LDEpLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAogeyAiYmNjdHJlIiwgIFhMTEsoMTksNTI5LDApLCAgICAgWExZQkJfTUFTSywgIEJPT0tFNjQsCXsgQk8sIEJJIH0gfSwKQEAgLTMxNTgsOCArMzMxNCw4IEBACiB7ICJybGRjciIsICAgTURTKDMwLDksMCksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKIHsgInJsZGNyLiIsICBNRFMoMzAsOSwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNRTYgfSB9LAogCi17ICJjbXB3IiwgICAgWENNUEwoMzEsMCwwKSwgWENNUExfTUFTSywgUFBDQ09NLAkJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXBkIiwgICAgWENNUEwoMzEsMCwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKK3sgImNtcHciLCAgICBYT1BMKDMxLDAsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJCXsgT0JGLCBSQSwgUkIgfSB9LAoreyAiY21wZCIsICAgIFhPUEwoMzEsMCwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKIHsgImNtcCIsICAgICBYKDMxLDApLAlYQ01QX01BU0ssCVBQQywJCXsgQkYsIEwsIFJBLCBSQiB9IH0sCiB7ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUExfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFJCIH0gfSwKIApAQCAtMzIyOCwxNyArMzM4NCwxOCBAQAogeyAiaXNlbGVxIiwgIFgoMzEsNzkpLCAgICAgIFhfTUFTSywJUFBDSVNFTCwJeyBSVCwgUkEsIFJCIH0gfSwKIHsgImlzZWwiLCAgICBYSVNFTCgzMSwxNSksICBYSVNFTF9NQVNLLAlQUENJU0VMLAl7IFJULCBSQSwgUkIsIENSQiB9IH0sCiAKLXsgIm1mY3IiLCAgICBYKDMxLDE5KSwJWFJBUkJfTUFTSywJTk9QT1dFUjQsCXsgUlQgfSB9LAoreyAibWZvY3JmIiwgIFhGWE0oMzEsMTksMCwxKSwgWEZYRlhNX01BU0ssIENPTSwJCXsgUlQsIEZYTSB9IH0sCit7ICJtZmNyIiwgICAgWCgzMSwxOSksCVhSQVJCX01BU0ssCU5PUE9XRVI0IHwgQ09NLAl7IFJUIH0gfSwKIHsgIm1mY3IiLCAgICBYKDMxLDE5KSwJWEZYRlhNX01BU0ssCVBPV0VSNCwJCXsgUlQsIEZYTTQgfSB9LAogCi17ICJsd2FyeCIsICAgWCgzMSwyMCksCVhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsd2FyeCIsICAgWCgzMSwyMCksCVhFSF9NQVNLLAlQUEMsCQl7IFJULCBSQTAsIFJCLCBFSCB9IH0sCiAKLXsgImxkeCIsICAgICBYKDMxLDIxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibGR4IiwgICAgIFgoMzEsMjEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBMCwgUkIgfSB9LAogCi17ICJpY2J0IiwgICAgWCgzMSwyMiksCVhfTUFTSywJCUJPT0tFLAkJeyBDVCwgUkEsIFJCIH0gfSwKK3sgImljYnQiLCAgICBYKDMxLDIyKSwJWF9NQVNLLAkJQk9PS0V8UFBDRTMwMCwJeyBDVCwgUkEsIFJCIH0gfSwKIHsgImljYnQiLCAgICBYKDMxLDI2MiksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCiAKLXsgImx3engiLCAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImx3engiLCAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCiB7ICJseCIsICAgICAgWCgzMSwyMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCiAKIHsgInNsdyIsICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKQEAgLTMyNjIsMTAgKzM0MTksMTAgQEAKIAogeyAiaWNidGUiLCAgIFgoMzEsMzApLAlYX01BU0ssCQlCT09LRTY0LAl7IENULCBSQSwgUkIgfSB9LAogCi17ICJsd3p4ZSIsICAgWCgzMSwzMSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsd3p4ZSIsICAgWCgzMSwzMSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAogCi17ICJjbXBsdyIsICAgWENNUEwoMzEsMzIsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXBsZCIsICAgWENNUEwoMzEsMzIsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXBsdyIsICAgWE9QTCgzMSwzMiwwKSwgWENNUExfTUFTSywgUFBDQ09NLAl7IE9CRiwgUkEsIFJCIH0gfSwKK3sgImNtcGxkIiwgICBYT1BMKDMxLDMyLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAogeyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QX01BU0ssCSBQUEMsCQl7IEJGLCBMLCBSQSwgUkIgfSB9LAogeyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QTF9NQVNLLAkgUFdSQ09NLAl7IEJGLCBSQSwgUkIgfSB9LAogCkBAIC0zMzI0LDE1ICszNDgxLDE2IEBACiAKIHsgIm1mbXNyIiwgICBYKDMxLDgzKSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSVCB9IH0sCiAKLXsgImxkYXJ4IiwgICBYKDMxLDg0KSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibGRhcngiLCAgIFgoMzEsODQpLAlYRUhfTUFTSywJUFBDNjQsCQl7IFJULCBSQTAsIFJCLCBFSCB9IH0sCiAKLXsgImRjYmYiLCAgICBYKDMxLDg2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKK3sgImRjYmZsIiwgICBYT1BMKDMxLDg2LDEpLCBYUlRfTUFTSywJUE9XRVI1LAkJeyBSQSwgUkIgfSB9LAoreyAiZGNiZiIsICAgIFgoMzEsODYpLAlYTFJUX01BU0ssCVBQQywJCXsgUkEsIFJCLCBYUlRfTCB9IH0sCiAKLXsgImxiengiLCAgICBYKDMxLDg3KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxiengiLCAgICBYKDMxLDg3KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgImRjYmZlIiwgICBYKDMxLDk0KSwJWFJUX01BU0ssCUJPT0tFNjQsCXsgUkEsIFJCIH0gfSwKIAoteyAibGJ6eGUiLCAgIFgoMzEsOTUpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibGJ6eGUiLCAgIFgoMzEsOTUpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKIAogeyAibmVnIiwgICAgIFhPKDMxLDEwNCwwLDApLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKIHsgIm5lZy4iLCAgICBYTygzMSwxMDQsMCwxKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCkBAIC0zMzUwLDEyICszNTA4LDE0IEBACiAKIHsgImxienV4IiwgICBYKDMxLDExOSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAogCit7ICJwb3BjbnRiIiwgWCgzMSwxMjIpLCBYUkJfTUFTSywJUE9XRVI1LAkJeyBSQSwgUlMgfSB9LAorCiB7ICJub3QiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKIHsgIm5vciIsICAgICBYUkMoMzEsMTI0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJub3QuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKIHsgIm5vci4iLCAgICBYUkMoMzEsMTI0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCiAKLXsgImx3YXJ4ZSIsICBYKDMxLDEyNiksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsd2FyeGUiLCAgWCgzMSwxMjYpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKIAogeyAibGJ6dXhlIiwgIFgoMzEsMTI3KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkFMLCBSQiB9IH0sCiAKQEAgLTMzODMsMjEgKzM1NDMsMjIgQEAKIAogeyAiZGNidHN0bHNlIixYKDMxLDE0MiksWF9NQVNLLAkJUFBDQ0hMSzY0LAl7IENULCBSQSwgUkIgfX0sCiAKLXsgIm10Y3IiLCAgICBYRlhNKDMxLDE0NCwweGZmKSwgWFJBUkJfTUFTSywgQ09NLAl7IFJTIH19LAoreyAibXRvY3JmIiwgIFhGWE0oMzEsMTQ0LDAsMSksIFhGWEZYTV9NQVNLLCBDT00sCXsgRlhNLCBSUyB9IH0sCit7ICJtdGNyIiwgICAgWEZYTSgzMSwxNDQsMHhmZiwwKSwgWFJBUkJfTUFTSywgQ09NLAl7IFJTIH19LAogeyAibXRjcmYiLCAgIFgoMzEsMTQ0KSwJWEZYRlhNX01BU0ssCUNPTSwJCXsgRlhNLCBSUyB9IH0sCiAKIHsgIm10bXNyIiwgICBYKDMxLDE0NiksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlMgfSB9LAogCi17ICJzdGR4IiwgICAgWCgzMSwxNDkpLCBYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGR4IiwgICAgWCgzMSwxNDkpLCBYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBMCwgUkIgfSB9LAogCi17ICJzdHdjeC4iLCAgWFJDKDMxLDE1MCwxKSwgWF9NQVNLLAlQUEMsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3R3Y3guIiwgIFhSQygzMSwxNTAsMSksIFhfTUFTSywJUFBDLAkJeyBSUywgUkEwLCBSQiB9IH0sCiAKLXsgInN0d3giLCAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdHd4IiwgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKIHsgInN0eCIsICAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCiAKLXsgInN0d2N4ZS4iLCBYUkMoMzEsMTU4LDEpLCBYX01BU0ssCUJPT0tFNjQsCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdHdjeGUuIiwgWFJDKDMxLDE1OCwxKSwgWF9NQVNLLAlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKIAoteyAic3R3eGUiLCAgIFgoMzEsMTU5KSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0d3hlIiwgICBYKDMxLDE1OSksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJzbHEiLCAgICAgWFJDKDMxLDE1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNscS4iLCAgICBYUkMoMzEsMTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LApAQCAtMzQwNSw2ICszNTY2LDggQEAKIHsgInNsZSIsICAgICBYUkMoMzEsMTUzLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic2xlLiIsICAgIFhSQygzMSwxNTMsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiAKK3sgInBydHl3IiwgICBYKDMxLDE1NCksCVhSQl9NQVNLLAlQT1dFUjYsCQl7IFJBLCBSUyB9IH0sCisKIHsgIndydGVlaSIsICBYKDMxLDE2MyksCVhFX01BU0ssCVBQQzQwMyB8IEJPT0tFLAl7IEUgfSB9LAogCiB7ICJkY2J0bHMiLCAgWCgzMSwxNjYpLAlYX01BU0ssCQlQUENDSExLLAl7IENULCBSQSwgUkIgfX0sCkBAIC0zNDE1LDExICszNTc4LDEzIEBACiB7ICJzdGR1eCIsICAgWCgzMSwxODEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBUywgUkIgfSB9LAogCiB7ICJzdHd1eCIsICAgWCgzMSwxODMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLXsgInN0dXgiLCAgICBYKDMxLDE4MyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdHV4IiwgICAgWCgzMSwxODMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKIAogeyAic2xpcSIsICAgIFhSQygzMSwxODQsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCiB7ICJzbGlxLiIsICAgWFJDKDMxLDE4NCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKIAoreyAicHJ0eWQiLCAgIFgoMzEsMTg2KSwJWFJCX01BU0ssCVBPV0VSNiwJCXsgUkEsIFJTIH0gfSwKKwogeyAic3R3dXhlIiwgIFgoMzEsMTkxKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkFTLCBSQiB9IH0sCiAKIHsgInN1YmZ6ZSIsICBYTygzMSwyMDAsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCkBAIC0zNDQyLDkgKzM2MDcsOSBAQAogCiB7ICJtdHNyIiwgICAgWCgzMSwyMTApLAlYUkJfTUFTS3woMTw8MjApLCBDT00zMiwJeyBTUiwgUlMgfSB9LAogCi17ICJzdGRjeC4iLCAgWFJDKDMxLDIxNCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGRjeC4iLCAgWFJDKDMxLDIxNCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUlMsIFJBMCwgUkIgfSB9LAogCi17ICJzdGJ4IiwgICAgWCgzMSwyMTUpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RieCIsICAgIFgoMzEsMjE1KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCiAKIHsgInNsbHEiLCAgICBYUkMoMzEsMjE2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic2xscS4iLCAgIFhSQygzMSwyMTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCkBAIC0zNDUyLDcgKzM2MTcsNyBAQAogeyAic2xlcSIsICAgIFhSQygzMSwyMTcsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzbGVxLiIsICAgWFJDKDMxLDIxNywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIAoteyAic3RieGUiLCAgIFgoMzEsMjIzKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0YnhlIiwgICBYKDMxLDIyMyksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJpY2JsYyIsICAgWCgzMSwyMzApLAlYX01BU0ssCQlQUENDSExLLAl7IENULCBSQSwgUkIgfX0sCiAKQEAgLTM0OTIsNyArMzY1Nyw3IEBACiB7ICJtdHNyaW4iLCAgWCgzMSwyNDIpLAlYUkFfTUFTSywJUFBDMzIsCQl7IFJTLCBSQiB9IH0sCiB7ICJtdHNyaSIsICAgWCgzMSwyNDIpLAlYUkFfTUFTSywJUE9XRVIzMiwJeyBSUywgUkIgfSB9LAogCi17ICJkY2J0c3QiLCAgWCgzMSwyNDYpLAlYUlRfTUFTSywJUFBDLAkJeyBDVCwgUkEsIFJCIH0gfSwKK3sgImRjYnRzdCIsICBYKDMxLDI0NiksCVhfTUFTSywJUFBDLAkJCXsgQ1QsIFJBLCBSQiB9IH0sCiAKIHsgInN0YnV4IiwgICBYKDMxLDI0NyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAogCkBAIC0zNTE5LDI2ICszNjg0LDI2IEBACiB7ICJhZGRvLiIsICAgWE8oMzEsMjY2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCiB7ICJjYXhvLiIsICAgWE8oMzEsMjY2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCiAKLXsgInRsYmllbCIsICBYKDMxLDI3NCksIFhSVFJBX01BU0ssCVBPV0VSNCwJCXsgUkIgfSB9LAoreyAidGxiaWVsIiwgIFgoMzEsMjc0KSwgWFJUTFJBX01BU0ssCVBPV0VSNCwJCXsgUkIsIEwgfSB9LAogCiB7ICJtZmFwaWRpIiwgWCgzMSwyNzUpLCBYX01BU0ssCQlCT09LRSwJCXsgUlQsIFJBIH0gfSwKIAogeyAibHNjYngiLCAgIFhSQygzMSwyNzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCiB7ICJsc2NieC4iLCAgWFJDKDMxLDI3NywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKIAoteyAiZGNidCIsICAgIFgoMzEsMjc4KSwJWFJUX01BU0ssCVBQQywJCXsgQ1QsIFJBLCBSQiB9IH0sCit7ICJkY2J0IiwgICAgWCgzMSwyNzgpLAlYX01BU0ssCQlQUEMsCQl7IENULCBSQSwgUkIgfSB9LAogCi17ICJsaHp4IiwgICAgWCgzMSwyNzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibGh6eCIsICAgIFgoMzEsMjc5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgImVxdiIsICAgICBYUkMoMzEsMjg0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJlcXYuIiwgICAgWFJDKDMxLDI4NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAogCiB7ICJkY2J0ZSIsICAgWCgzMSwyODYpLAlYX01BU0ssCQlCT09LRTY0LAl7IENULCBSQSwgUkIgfSB9LAogCi17ICJsaHp4ZSIsICAgWCgzMSwyODcpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibGh6eGUiLCAgIFgoMzEsMjg3KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgInRsYmllIiwgICBYKDMxLDMwNiksCVhSVExSQV9NQVNLLAlQUEMsCQl7IFJCLCBMIH0gfSwKLXsgInRsYmkiLCAgICBYKDMxLDMwNiksCVhSVF9NQVNLLAlQT1dFUiwJCXsgUkEsIFJCIH0gfSwKK3sgInRsYmkiLCAgICBYKDMxLDMwNiksCVhSVF9NQVNLLAlQT1dFUiwJCXsgUkEwLCBSQiB9IH0sCiAKIHsgImVjaXd4IiwgICBYKDMxLDMxMCksIFhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCiAKQEAgLTM2MDcsNiArMzc3Miw3IEBACiB7ICJtZnNkcjEiLCAgICAgWFNQUigzMSwzMzksMjUpLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJUIH0gfSwKIHsgIm1mc3JyMCIsICAgICBYU1BSKDMxLDMzOSwyNiksICAgWFNQUl9NQVNLLCBDT00sCXsgUlQgfSB9LAogeyAibWZzcnIxIiwgICAgIFhTUFIoMzEsMzM5LDI3KSwgICBYU1BSX01BU0ssIENPTSwJeyBSVCB9IH0sCit7ICJtZmNmYXIiLCAgICAgWFNQUigzMSwzMzksMjgpLCAgIFhTUFJfTUFTSywgUE9XRVI2LAl7IFJUIH0gfSwKIHsgIm1mcGlkIiwgICAgICBYU1BSKDMxLDMzOSw0OCksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCiB7ICJtZnBpZCIsICAgICAgWFNQUigzMSwzMzksOTQ1KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKIHsgIm1mY3NycjAiLCAgICBYU1BSKDMxLDMzOSw1OCksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCkBAIC0zNjM0LDIxICszODAwLDIxIEBACiB7ICJtZmJhciIsICAgICAgWFNQUigzMSwzMzksMTU5KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKIHsgIm1mdnJzYXZlIiwgICBYU1BSKDMxLDMzOSwyNTYpLCAgWFNQUl9NQVNLLCBQUENWRUMsCXsgUlQgfSB9LAogeyAibWZ1c3ByZzAiLCAgIFhTUFIoMzEsMzM5LDI1NiksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKLXsgIm1mc3ByZzQiLCAgICBYU1BSKDMxLDMzOSwyNjApLCAgWFNQUl9NQVNLLCBQUEM0MDUsCXsgUlQgfSB9LAoteyAibWZzcHJnNSIsICAgIFhTUFIoMzEsMzM5LDI2MSksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCi17ICJtZnNwcmc2IiwgICAgWFNQUigzMSwzMzksMjYyKSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJUIH0gfSwKLXsgIm1mc3ByZzciLCAgICBYU1BSKDMxLDMzOSwyNjMpLCAgWFNQUl9NQVNLLCBQUEM0MDUsCXsgUlQgfSB9LAogeyAibWZ0YiIsICAgICAgIFgoMzEsMzcxKSwJICAgWF9NQVNLLCAgICBDTEFTU0lDLAl7IFJULCBUQlIgfSB9LAogeyAibWZ0YiIsICAgICAgIFhTUFIoMzEsMzM5LDI2OCksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKIHsgIm1mdGJsIiwgICAgICBYU1BSKDMxLDM3MSwyNjgpLCAgWFNQUl9NQVNLLCBDTEFTU0lDLAl7IFJUIH0gfSwKIHsgIm1mdGJsIiwgICAgICBYU1BSKDMxLDMzOSwyNjgpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCiB7ICJtZnRidSIsICAgICAgWFNQUigzMSwzNzEsMjY5KSwgIFhTUFJfTUFTSywgQ0xBU1NJQywJeyBSVCB9IH0sCiB7ICJtZnRidSIsICAgICAgWFNQUigzMSwzMzksMjY5KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoteyAibWZzcHJnIiwgICAgIFhTUFIoMzEsMzM5LDI3MiksICBYU1BSR19NQVNLLCBQUEMsCXsgUlQsIFNQUkcgfSB9LAoreyAibWZzcHJnIiwgICAgIFhTUFIoMzEsMzM5LDI1NiksICBYU1BSR19NQVNLLCBQUEMsCXsgUlQsIFNQUkcgfSB9LAogeyAibWZzcHJnMCIsICAgIFhTUFIoMzEsMzM5LDI3MiksICBYU1BSX01BU0ssIFBQQywJeyBSVCB9IH0sCiB7ICJtZnNwcmcxIiwgICAgWFNQUigzMSwzMzksMjczKSwgIFhTUFJfTUFTSywgUFBDLAl7IFJUIH0gfSwKIHsgIm1mc3ByZzIiLCAgICBYU1BSKDMxLDMzOSwyNzQpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlQgfSB9LAogeyAibWZzcHJnMyIsICAgIFhTUFIoMzEsMzM5LDI3NSksICBYU1BSX01BU0ssIFBQQywJeyBSVCB9IH0sCit7ICJtZnNwcmc0IiwgICAgWFNQUigzMSwzMzksMjYwKSwgIFhTUFJfTUFTSywgUFBDNDA1IHwgQk9PS0UsCXsgUlQgfSB9LAoreyAibWZzcHJnNSIsICAgIFhTUFIoMzEsMzM5LDI2MSksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLAl7IFJUIH0gfSwKK3sgIm1mc3ByZzYiLCAgICBYU1BSKDMxLDMzOSwyNjIpLCAgWFNQUl9NQVNLLCBQUEM0MDUgfCBCT09LRSwJeyBSVCB9IH0sCit7ICJtZnNwcmc3IiwgICAgWFNQUigzMSwzMzksMjYzKSwgIFhTUFJfTUFTSywgUFBDNDA1IHwgQk9PS0UsCXsgUlQgfSB9LAogeyAibWZhc3IiLCAgICAgIFhTUFIoMzEsMzM5LDI4MCksICBYU1BSX01BU0ssIFBQQzY0LAl7IFJUIH0gfSwKIHsgIm1mZWFyIiwgICAgICBYU1BSKDMxLDMzOSwyODIpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlQgfSB9LAogeyAibWZwaXIiLCAgICAgIFhTUFIoMzEsMzM5LDI4NiksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKQEAgLTM2OTksNiArMzg2NSwxMCBAQAogeyAibWZzcGVmc2NyIiwgIFhTUFIoMzEsMzM5LDUxMiksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSVCB9IH0sCiB7ICJtZmJiZWFyIiwgICAgWFNQUigzMSwzMzksNTEzKSwgIFhTUFJfTUFTSywgUFBDQlJMSywgIHsgUlQgfSB9LAogeyAibWZiYnRhciIsICAgIFhTUFIoMzEsMzM5LDUxNCksICBYU1BSX01BU0ssIFBQQ0JSTEssICB7IFJUIH0gfSwKK3sgIm1maXZvcjMyIiwgICBYU1BSKDMxLDMzOSw1MjgpLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlQgfSB9LAoreyAibWZpdm9yMzMiLCAgIFhTUFIoMzEsMzM5LDUyOSksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSVCB9IH0sCit7ICJtZml2b3IzNCIsICAgWFNQUigzMSwzMzksNTMwKSwgIFhTUFJfTUFTSywgUFBDU1BFLAl7IFJUIH0gfSwKK3sgIm1maXZvcjM1IiwgICBYU1BSKDMxLDMzOSw1MzEpLCAgWFNQUl9NQVNLLCBQUENQTVIsCXsgUlQgfSB9LAogeyAibWZpYmF0dSIsICAgIFhTUFIoMzEsMzM5LDUyOCksICBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKIHsgIm1maWJhdGwiLCAgICBYU1BSKDMxLDMzOSw1MjkpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCiB7ICJtZmRiYXR1IiwgICAgWFNQUigzMSwzMzksNTM2KSwgIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LApAQCAtMzcwOCwxMCArMzg3OCwxMSBAQAogeyAibWZpY19kYXQiLCAgIFhTUFIoMzEsMzM5LDU2MiksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCiB7ICJtZmRjX2NzdCIsICAgWFNQUigzMSwzMzksNTY4KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKIHsgIm1mZGNfYWRyIiwgICBYU1BSKDMxLDMzOSw1NjkpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19kYXQiLCAgIFhTUFIoMzEsMzM5LDU3MCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCiB7ICJtZm1jc3JyMCIsICAgWFNQUigzMSwzMzksNTcwKSwgIFhTUFJfTUFTSywgUFBDUkZNQ0ksIHsgUlQgfSB9LAoreyAibWZkY19kYXQiLCAgIFhTUFIoMzEsMzM5LDU3MCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCiB7ICJtZm1jc3JyMSIsICAgWFNQUigzMSwzMzksNTcxKSwgIFhTUFJfTUFTSywgUFBDUkZNQ0ksIHsgUlQgfSB9LAogeyAibWZtY3NyIiwgICAgIFhTUFIoMzEsMzM5LDU3MiksICBYU1BSX01BU0ssIFBQQ1JGTUNJLCB7IFJUIH0gfSwKK3sgIm1mbWNhciIsICAgICBYU1BSKDMxLDMzOSw1NzMpLCAgWFNQUl9NQVNLLCBQUENSRk1DSSwgeyBSVCB9IH0sCiB7ICJtZmRwZHIiLCAgICAgWFNQUigzMSwzMzksNjMwKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKIHsgIm1mZHBpciIsICAgICBYU1BSKDMxLDMzOSw2MzEpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAogeyAibWZpbW1yIiwgICAgIFhTUFIoMzEsMzM5LDYzOCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCkBAIC0zNzc1LDE0ICszOTQ2LDE0IEBACiB7ICJtZnBidTIiLCAgICAgWFNQUigzMSwzMzksMTAyMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKIHsgIm1mc3ByIiwgICAgICBYKDMxLDMzOSksCSAgIFhfTUFTSywgICAgQ09NLAl7IFJULCBTUFIgfSB9LAogCi17ICJsd2F4IiwgICAgWCgzMSwzNDEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsd2F4IiwgICAgWCgzMSwzNDEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJkc3QiLCAgICAgWERTUygzMSwzNDIsMCksIFhEU1NfTUFTSywJUFBDVkVDLAkJeyBSQSwgUkIsIFNUUk0gfSB9LAogeyAiZHN0dCIsICAgIFhEU1MoMzEsMzQyLDEpLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgUkEsIFJCLCBTVFJNIH0gfSwKIAoteyAibGhheCIsICAgIFgoMzEsMzQzKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxoYXgiLCAgICBYKDMxLDM0MyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogCi17ICJsaGF4ZSIsICAgWCgzMSwzNTEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibGhheGUiLCAgIFgoMzEsMzUxKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgImRzdHN0IiwgICBYRFNTKDMxLDM3NCwwKSwgWERTU19NQVNLLAlQUENWRUMsCQl7IFJBLCBSQiwgU1RSTSB9IH0sCiB7ICJkc3RzdHQiLCAgWERTUygzMSwzNzQsMSksIFhEU1NfTUFTSywJUFBDVkVDLAkJeyBSQSwgUkIsIFNUUk0gfSB9LApAQCAtMzgyMSwxNCArMzk5MiwyMCBAQAogCiB7ICJzbGJtdGUiLCAgWCgzMSw0MDIpLCBYUkFfTUFTSywJUFBDNjQsCQl7IFJTLCBSQiB9IH0sCiAKLXsgInN0aHgiLCAgICBYKDMxLDQwNyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGh4IiwgICAgWCgzMSw0MDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAiY21wYiIsICAgIFgoMzEsNTA4KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSQSwgUlMsIFJCIH0gfSwKIAogeyAibGZxeCIsICAgIFgoMzEsNzkxKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCiAKK3sgImxmZHB4IiwgICBYKDMxLDc5MSksCVhfTUFTSywJCVBPV0VSNiwJCXsgRlJULCBSQSwgUkIgfSB9LAorCiB7ICJsZnF1eCIsICAgWCgzMSw4MjMpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKIAogeyAic3RmcXgiLCAgIFgoMzEsOTE5KSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlMsIFJBLCBSQiB9IH0sCiAKK3sgInN0ZmRweCIsICBYKDMxLDkxOSksCVhfTUFTSywJCVBPV0VSNiwJCXsgRlJTLCBSQSwgUkIgfSB9LAorCiB7ICJzdGZxdXgiLCAgWCgzMSw5NTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKIAogeyAib3JjIiwgICAgIFhSQygzMSw0MTIsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKQEAgLTM4MzcsNyArNDAxNCw3IEBACiB7ICJzcmFkaSIsICAgWFMoMzEsNDEzLDApLCBYU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAogeyAic3JhZGkuIiwgIFhTKDMxLDQxMywxKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKIAoteyAic3RoeGUiLCAgIFgoMzEsNDE1KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0aHhlIiwgICBYKDMxLDQxNSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJzbGJpZSIsICAgWCgzMSw0MzQpLAlYUlRSQV9NQVNLLAlQUEM2NCwJCXsgUkIgfSB9LAogCkBAIC0zOTE4LDYgKzQwOTUsNyBAQAogeyAibXRzZHIxIiwgICAgWFNQUigzMSw0NjcsMjUpLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJTIH0gfSwKIHsgIm10c3JyMCIsICAgIFhTUFIoMzEsNDY3LDI2KSwgICBYU1BSX01BU0ssIENPTSwJeyBSUyB9IH0sCiB7ICJtdHNycjEiLCAgICBYU1BSKDMxLDQ2NywyNyksICAgWFNQUl9NQVNLLCBDT00sCXsgUlMgfSB9LAoreyAibXRjZmFyIiwgICAgWFNQUigzMSw0NjcsMjgpLCAgIFhTUFJfTUFTSywgUE9XRVI2LAl7IFJTIH0gfSwKIHsgIm10cGlkIiwgICAgIFhTUFIoMzEsNDY3LDQ4KSwgICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCiB7ICJtdHBpZCIsICAgICBYU1BSKDMxLDQ2Nyw5NDUpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAogeyAibXRkZWNhciIsICAgWFNQUigzMSw0NjcsNTQpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKQEAgLTM5NDYsNyArNDEyNCw3IEBACiB7ICJtdGJhciIsICAgICBYU1BSKDMxLDQ2NywxNTkpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAogeyAibXR2cnNhdmUiLCAgWFNQUigzMSw0NjcsMjU2KSwgIFhTUFJfTUFTSywgUFBDVkVDLAl7IFJTIH0gfSwKIHsgIm10dXNwcmcwIiwgIFhTUFIoMzEsNDY3LDI1NiksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCi17ICJtdHNwcmciLCAgICBYU1BSKDMxLDQ2NywyNzIpLCAgWFNQUkdfTUFTSyxQUEMsCXsgU1BSRywgUlMgfSB9LAoreyAibXRzcHJnIiwgICAgWFNQUigzMSw0NjcsMjU2KSwgIFhTUFJHX01BU0ssUFBDLAl7IFNQUkcsIFJTIH0gfSwKIHsgIm10c3ByZzAiLCAgIFhTUFIoMzEsNDY3LDI3MiksICBYU1BSX01BU0ssIFBQQywJeyBSUyB9IH0sCiB7ICJtdHNwcmcxIiwgICBYU1BSKDMxLDQ2NywyNzMpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlMgfSB9LAogeyAibXRzcHJnMiIsICAgWFNQUigzMSw0NjcsMjc0KSwgIFhTUFJfTUFTSywgUFBDLAl7IFJTIH0gfSwKQEAgLTQwMDUsNiArNDE4MywxMCBAQAogeyAibXRzcGVmc2NyIiwgIFhTUFIoMzEsNDY3LDUxMiksICBYU1BSX01BU0ssIFBQQ1NQRSwgICB7IFJTIH0gfSwKIHsgIm10YmJlYXIiLCAgIFhTUFIoMzEsNDY3LDUxMyksICBYU1BSX01BU0ssIFBQQ0JSTEssICAgeyBSUyB9IH0sCiB7ICJtdGJidGFyIiwgICBYU1BSKDMxLDQ2Nyw1MTQpLCAgWFNQUl9NQVNLLCBQUENCUkxLLCAgeyBSUyB9IH0sCit7ICJtdGl2b3IzMiIsICBYU1BSKDMxLDQ2Nyw1MjgpLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlMgfSB9LAoreyAibXRpdm9yMzMiLCAgWFNQUigzMSw0NjcsNTI5KSwgIFhTUFJfTUFTSywgUFBDU1BFLAl7IFJTIH0gfSwKK3sgIm10aXZvcjM0IiwgIFhTUFIoMzEsNDY3LDUzMCksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSUyB9IH0sCit7ICJtdGl2b3IzNSIsICBYU1BSKDMxLDQ2Nyw1MzEpLCAgWFNQUl9NQVNLLCBQUENQTVIsCXsgUlMgfSB9LAogeyAibXRpYmF0dSIsICAgWFNQUigzMSw0NjcsNTI4KSwgIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAogeyAibXRpYmF0bCIsICAgWFNQUigzMSw0NjcsNTI5KSwgIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAogeyAibXRkYmF0dSIsICAgWFNQUigzMSw0NjcsNTM2KSwgIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LApAQCAtNDEwMSwxMyArNDI4MywxNSBAQAogCiB7ICJjbGNzIiwgICAgWCgzMSw1MzEpLCBYUkJfTUFTSywJTTYwMSwJCXsgUlQsIFJBIH0gfSwKIAoteyAibHN3eCIsICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxkYnJ4IiwgICBYKDMxLDUzMiksCVhfTUFTSywJCUNFTEwsCQl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAibHN3eCIsICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCiB7ICJsc3giLCAgICAgWCgzMSw1MzMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAogCi17ICJsd2JyeCIsICAgWCgzMSw1MzQpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibHdicngiLCAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCiB7ICJsYnJ4IiwgICAgWCgzMSw1MzQpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAogCi17ICJsZnN4IiwgICAgWCgzMSw1MzUpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKK3sgImxmc3giLCAgICBYKDMxLDUzNSksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQTAsIFJCIH0gfSwKIAogeyAic3J3IiwgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNyIiwgICAgICBYUkMoMzEsNTM2LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCkBAIC00MTIzLDExICs0MzA3LDEyIEBACiB7ICJtYXNraXIiLCAgWFJDKDMxLDU0MSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgIm1hc2tpci4iLCBYUkMoMzEsNTQxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogCi17ICJsd2JyeGUiLCAgWCgzMSw1NDIpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibHdicnhlIiwgIFgoMzEsNTQyKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKLXsgImxmc3hlIiwgICBYKDMxLDU0MyksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJULCBSQSwgUkIgfSB9LAoreyAibGZzeGUiLCAgIFgoMzEsNTQzKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBGUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJiYmVsciIsICAgWCgzMSw1NTApLAlYX01BU0ssCQlQUENCUkxLLAl7IDAgfX0sCisKIHsgInRsYnN5bmMiLCBYKDMxLDU2NiksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCiAKIHsgImxmc3V4IiwgICBYKDMxLDU2NyksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKQEAgLTQxMzYsOCArNDMyMSw4IEBACiAKIHsgIm1mc3IiLCAgICBYKDMxLDU5NSksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFJULCBTUiB9IH0sCiAKLXsgImxzd2kiLCAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCi17ICJsc2kiLCAgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgTkIgfSB9LAoreyAibHN3aSIsICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEwLCBOQiB9IH0sCit7ICJsc2kiLCAgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQTAsIE5CIH0gfSwKIAogeyAibHdzeW5jIiwgIFhTWU5DKDMxLDU5OCwxKSwgMHhmZmZmZmZmZiwgUFBDLAkJeyAwIH0gfSwKIHsgInB0ZXN5bmMiLCBYU1lOQygzMSw1OTgsMiksIDB4ZmZmZmZmZmYsIFBQQzY0LAl7IDAgfSB9LApAQCAtNDE0NSw5ICs0MzMwLDExIEBACiB7ICJzeW5jIiwgICAgWCgzMSw1OTgpLCBYU1lOQ19NQVNLLAlQUENDT00sCQl7IExTIH0gfSwKIHsgImRjcyIsICAgICBYKDMxLDU5OCksIDB4ZmZmZmZmZmYsCVBXUkNPTSwJCXsgMCB9IH0sCiAKLXsgImxmZHgiLCAgICBYKDMxLDU5OSksIFhfTUFTSywJCUNPTSwJCXsgRlJULCBSQSwgUkIgfSB9LAoreyAibGZkeCIsICAgIFgoMzEsNTk5KSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBMCwgUkIgfSB9LAogCi17ICJsZmR4ZSIsICAgWCgzMSw2MDcpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkEsIFJCIH0gfSwKK3sgImxmZHhlIiwgICBYKDMxLDYwNyksIFhfTUFTSywJCUJPT0tFNjQsCXsgRlJULCBSQTAsIFJCIH0gfSwKKworeyAibWZmZ3ByIiwgIFhSQygzMSw2MDcsMCksIFhSQV9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgUkIgfSB9LAogCiB7ICJtZnNyaSIsICAgWCgzMSw2MjcpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAogCkBAIC00MTU5LDEzICs0MzQ2LDE1IEBACiAKIHsgIm1mc3JpbiIsICBYKDMxLDY1OSksIFhSQV9NQVNLLAlQUEMzMiwJCXsgUlQsIFJCIH0gfSwKIAoteyAic3Rzd3giLCAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLXsgInN0c3giLCAgICBYKDMxLDY2MSksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGRicngiLCAgWCgzMSw2NjApLCBYX01BU0ssCQlDRUxMLAkJeyBSUywgUkEwLCBSQiB9IH0sCiAKLXsgInN0d2JyeCIsICBYKDMxLDY2MiksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdGJyeCIsICAgWCgzMSw2NjIpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3Rzd3giLCAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCit7ICJzdHN4IiwgICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKIAoteyAic3Rmc3giLCAgIFgoMzEsNjYzKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBLCBSQiB9IH0sCit7ICJzdHdicngiLCAgWCgzMSw2NjIpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKK3sgInN0YnJ4IiwgICBYKDMxLDY2MiksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzdGZzeCIsICAgWCgzMSw2NjMpLCBYX01BU0ssCQlDT00sCQl7IEZSUywgUkEwLCBSQiB9IH0sCiAKIHsgInNycSIsICAgICBYUkMoMzEsNjY0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic3JxLiIsICAgIFhSQygzMSw2NjQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCkBAIC00MTczLDkgKzQzNjIsOSBAQAogeyAic3JlIiwgICAgIFhSQygzMSw2NjUsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzcmUuIiwgICAgWFJDKDMxLDY2NSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIAoteyAic3R3YnJ4ZSIsIFgoMzEsNjcwKSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0d2JyeGUiLCBYKDMxLDY3MCksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAogCi17ICJzdGZzeGUiLCAgWCgzMSw2NzEpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkEsIFJCIH0gfSwKK3sgInN0ZnN4ZSIsICBYKDMxLDY3MSksIFhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQTAsIFJCIH0gfSwKIAogeyAic3Rmc3V4IiwgIFgoMzEsNjk1KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBUywgUkIgfSB9LAogCkBAIC00MTg0LDEwICs0MzczLDEwIEBACiAKIHsgInN0ZnN1eGUiLCBYKDMxLDcwMyksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQVMsIFJCIH0gfSwKIAoteyAic3Rzd2kiLCAgIFgoMzEsNzI1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIE5CIH0gfSwKLXsgInN0c2kiLCAgICBYKDMxLDcyNSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCit7ICJzdHN3aSIsICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQTAsIE5CIH0gfSwKK3sgInN0c2kiLCAgICBYKDMxLDcyNSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBMCwgTkIgfSB9LAogCi17ICJzdGZkeCIsICAgWCgzMSw3MjcpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkEsIFJCIH0gfSwKK3sgInN0ZmR4IiwgICBYKDMxLDcyNyksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQTAsIFJCIH0gfSwKIAogeyAic3JscSIsICAgIFhSQygzMSw3MjgsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzcmxxLiIsICAgWFJDKDMxLDcyOCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKQEAgLTQxOTUsNyArNDM4NCw5IEBACiB7ICJzcmVxIiwgICAgWFJDKDMxLDcyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNyZXEuIiwgICBYUkMoMzEsNzI5LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogCi17ICJzdGZkeGUiLCAgWCgzMSw3MzUpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkEsIFJCIH0gfSwKK3sgInN0ZmR4ZSIsICBYKDMxLDczNSksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQTAsIFJCIH0gfSwKKworeyAibWZ0Z3ByIiwgIFhSQygzMSw3MzUsMCksIFhSQV9NQVNLLAlQT1dFUjYsCQl7IFJULCBGUkIgfSB9LAogCiB7ICJkY2JhIiwgICAgWCgzMSw3NTgpLAlYUlRfTUFTSywJUFBDNDA1IHwgQk9PS0UsCXsgUkEsIFJCIH0gfSwKIApAQCAtNDIxMSw3ICs0NDAyLDkgQEAKIHsgInRsYml2YXgiLCBYKDMxLDc4NiksCVhSVF9NQVNLLAlCT09LRSwJCXsgUkEsIFJCIH0gfSwKIHsgInRsYml2YXhlIixYKDMxLDc4NyksCVhSVF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCiAKLXsgImxoYnJ4IiwgICBYKDMxLDc5MCksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsd3pjaXgiLCAgWCgzMSw3ODkpLAlYX01BU0ssCQlQT1dFUjYsCQl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAibGhicngiLCAgIFgoMzEsNzkwKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgInNyYXciLCAgICBYUkMoMzEsNzkyLDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzcmEiLCAgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LApAQCAtNDIyMSwxMyArNDQxNCwxNSBAQAogeyAic3JhZCIsICAgIFhSQygzMSw3OTQsMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic3JhZC4iLCAgIFhSQygzMSw3OTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAogCi17ICJsaGJyeGUiLCAgWCgzMSw3OTgpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibGhicnhlIiwgIFgoMzEsNzk4KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKLXsgImxkeGUiLCAgICBYKDMxLDc5OSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsZHV4ZSIsICAgWCgzMSw4MzEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibGR4ZSIsICAgIFgoMzEsNzk5KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCit7ICJsZHV4ZSIsICAgWCgzMSw4MzEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKIAogeyAicmFjIiwgICAgIFgoMzEsODE4KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKIAoreyAibGh6Y2l4IiwgIFgoMzEsODIxKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKIHsgImRzcyIsICAgICBYRFNTKDMxLDgyMiwwKSwgWERTU19NQVNLLAlQUENWRUMsCQl7IFNUUk0gfSB9LAogeyAiZHNzYWxsIiwgIFhEU1MoMzEsODIyLDEpLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgMCB9IH0sCiAKQEAgLTQyMzgsMTkgKzQ0MzMsMjUgQEAKIAogeyAic2xibWZldiIsIFgoMzEsODUxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBSVCwgUkIgfSB9LAogCit7ICJsYnpjaXgiLCAgWCgzMSw4NTMpLAlYX01BU0ssCQlQT1dFUjYsCQl7IFJULCBSQTAsIFJCIH0gfSwKKwogeyAibWJhciIsICAgIFgoMzEsODU0KSwJWF9NQVNLLAkJQk9PS0UsCQl7IE1PIH0gfSwKIHsgImVpZWlvIiwgICBYKDMxLDg1NCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCiAKLXsgInRsYnN4IiwgICBYUkMoMzEsOTE0LDApLCBYX01BU0ssCUJPT0tFLAkJeyBSQSwgUkIgfSB9LAoteyAidGxic3giLCAgIFhSQygzMSw5MTQsMCksIFhfTUFTSywgCVBQQzQwMywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJ0bGJzeC4iLCAgWFJDKDMxLDkxNCwxKSwgWF9NQVNLLAlCT09LRSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsYnN4LiIsICBYUkMoMzEsOTE0LDEpLCBYX01BU0ssIAlQUEM0MDMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibGZpd2F4IiwgIFgoMzEsODU1KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBGUlQsIFJBMCwgUkIgfSB9LAorCit7ICJsZGNpeCIsICAgWCgzMSw4ODUpLAlYX01BU0ssCQlQT1dFUjYsCQl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAidGxic3giLCAgIFhSQygzMSw5MTQsMCksIFhfTUFTSywgCVBQQzQwM3xCT09LRSwJeyBSVE8sIFJBLCBSQiB9IH0sCit7ICJ0bGJzeC4iLCAgWFJDKDMxLDkxNCwxKSwgWF9NQVNLLCAJUFBDNDAzfEJPT0tFLAl7IFJUTywgUkEsIFJCIH0gfSwKIHsgInRsYnN4ZSIsICBYUkMoMzEsOTE1LDApLCBYX01BU0ssCUJPT0tFNjQsCXsgUkEsIFJCIH0gfSwKIHsgInRsYnN4ZS4iLCBYUkMoMzEsOTE1LDEpLCBYX01BU0ssCUJPT0tFNjQsCXsgUkEsIFJCIH0gfSwKIAogeyAic2xibWZlZSIsIFgoMzEsOTE1KSwgWFJBX01BU0ssCVBQQzY0LAkJeyBSVCwgUkIgfSB9LAogCi17ICJzdGhicngiLCAgWCgzMSw5MTgpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3R3Y2l4IiwgIFgoMzEsOTE3KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInN0aGJyeCIsICBYKDMxLDkxOCksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJzcmFxIiwgICAgWFJDKDMxLDkyMCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNyYXEuIiwgICBYUkMoMzEsOTIwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LApAQCAtNDI2MywxNCArNDQ2NCwxNSBAQAogeyAiZXh0c2guIiwgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCiB7ICJleHRzLiIsICAgWFJDKDMxLDkyMiwxKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKIAoteyAic3RoYnJ4ZSIsIFgoMzEsOTI2KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0aGJyeGUiLCBYKDMxLDkyNiksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAogCi17ICJzdGR4ZSIsICAgWCgzMSw5MjcpLCBYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RkeGUiLCAgIFgoMzEsOTI3KSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEwLCBSQiB9IH0sCiAKIHsgInRsYnJlaGkiLCBYVExCKDMxLDk0NiwwKSwgWFRMQl9NQVNLLAlQUEM0MDMsCQl7IFJULCBSQSB9IH0sCiB7ICJ0bGJyZWxvIiwgWFRMQigzMSw5NDYsMSksIFhUTEJfTUFTSywJUFBDNDAzLAkJeyBSVCwgUkEgfSB9LAoteyAidGxicmUiLCAgIFgoMzEsOTQ2KSwJWF9NQVNLLAkJQk9PS0UsCQl7IDAgfSB9LAoteyAidGxicmUiLCAgIFgoMzEsOTQ2KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSUywgUkEsIFNIIH0gfSwKK3sgInRsYnJlIiwgICBYKDMxLDk0NiksCVhfTUFTSywJCVBQQzQwM3xCT09LRSwJeyBSU08sIFJBT1BULCBTSE8gfSB9LAorCit7ICJzdGhjaXgiLCAgWCgzMSw5NDkpLAlYX01BU0ssCQlQT1dFUjYsCQl7IFJTLCBSQTAsIFJCIH0gfSwKIAogeyAic3JhaXEiLCAgIFhSQygzMSw5NTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCiB7ICJzcmFpcS4iLCAgWFJDKDMxLDk1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKQEAgLTQyODQsMTMgKzQ0ODYsMTQgQEAKIAogeyAidGxid2VoaSIsIFhUTEIoMzEsOTc4LDApLCBYVExCX01BU0ssCVBQQzQwMywJCXsgUlQsIFJBIH0gfSwKIHsgInRsYndlbG8iLCBYVExCKDMxLDk3OCwxKSwgWFRMQl9NQVNLLAlQUEM0MDMsCQl7IFJULCBSQSB9IH0sCi17ICJ0bGJ3ZSIsICAgWCgzMSw5NzgpLAlYX01BU0ssCQlCT09LRSwJCXsgMCB9IH0sCi17ICJ0bGJ3ZSIsICAgWCgzMSw5NzgpLAlYX01BU0ssCQlQUEM0MDMsCQl7IFJTLCBSQSwgU0ggfSB9LAoreyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJUFBDNDAzfEJPT0tFLAl7IFJTTywgUkFPUFQsIFNITyB9IH0sCiB7ICJ0bGJsZCIsICAgWCgzMSw5NzgpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKIAoreyAic3RiY2l4IiwgIFgoMzEsOTgxKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSUywgUkEwLCBSQiB9IH0sCisKIHsgImljYmkiLCAgICBYKDMxLDk4MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCiAKLXsgInN0Zml3eCIsICBYKDMxLDk4MyksCVhfTUFTSywJCVBQQywJCXsgRlJTLCBSQSwgUkIgfSB9LAoreyAic3RmaXd4IiwgIFgoMzEsOTgzKSwJWF9NQVNLLAkJUFBDLAkJeyBGUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJleHRzdyIsICAgWFJDKDMxLDk4NiwwKSwgWFJCX01BU0ssCVBQQzY0IHwgQk9PS0U2NCx7IFJBLCBSUyB9IH0sCiB7ICJleHRzdy4iLCAgWFJDKDMxLDk4NiwxKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LApAQCAtNDI5OCwxMCArNDUwMSwxMyBAQAogeyAiaWNyZWFkIiwgIFgoMzEsOTk4KSwJWFJUX01BU0ssCVBQQzQwM3xQUEM0NDAsCXsgUkEsIFJCIH0gfSwKIAogeyAiaWNiaWUiLCAgIFgoMzEsOTkwKSwJWFJUX01BU0ssCUJPT0tFNjQsCXsgUkEsIFJCIH0gfSwKLXsgInN0Zml3eGUiLCBYKDMxLDk5MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQSwgUkIgfSB9LAoreyAic3RmaXd4ZSIsIFgoMzEsOTkxKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBGUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJ0bGJsaSIsICAgWCgzMSwxMDEwKSwgWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCiAKK3sgInN0ZGNpeCIsICBYKDMxLDEwMTMpLCBYX01BU0ssCVBPV0VSNiwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJkY2J6bCIsICAgWE9QTCgzMSwxMDE0LDEpLCBYUlRfTUFTSyxQT1dFUjQsICAgICAgICAgICAgeyBSQSwgUkIgfSB9LAogeyAiZGNieiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCiB7ICJkY2x6IiwgICAgWCgzMSwxMDE0KSwgWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKIApAQCAtNDMyMCw4NiArNDUyNiwxMDQgQEAKIHsgInN0dngiLCAgICBYKDMxLCAyMzEpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVlMsIFJBLCBSQiB9IH0sCiB7ICJzdHZ4bCIsICAgWCgzMSwgNDg3KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZTLCBSQSwgUkIgfSB9LAogCi17ICJsd3oiLCAgICAgT1AoMzIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQSB9IH0sCi17ICJsIiwJICAgICBPUCgzMiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKKy8qIE5ldyBsb2FkL3N0b3JlIGxlZnQvcmlnaHQgaW5kZXggdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGFyZSBpbiB0aGUgQ2VsbCBvbmx5LiAgKi8KK3sgImx2bHgiLCAgICBYKDMxLCA1MTkpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgImx2bHhsIiwgICBYKDMxLCA3NzUpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgImx2cngiLCAgICBYKDMxLCA1NTEpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgImx2cnhsIiwgICBYKDMxLCA4MDcpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgInN0dmx4IiwgICBYKDMxLCA2NDcpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKK3sgInN0dmx4bCIsICBYKDMxLCA5MDMpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKK3sgInN0dnJ4IiwgICBYKDMxLCA2NzkpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKK3sgInN0dnJ4bCIsICBYKDMxLCA5MzUpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKKworeyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKK3sgImwiLAkgICAgIE9QKDMyKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKIAogeyAibHd6dSIsICAgIE9QKDMzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLXsgImx1IiwgICAgICBPUCgzMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKK3sgImx1IiwgICAgICBPUCgzMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCiAKLXsgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKK3sgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCiAKIHsgImxienUiLCAgICBPUCgzNSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCiAKLXsgInN0dyIsICAgICBPUCgzNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0IiwgICAgICBPUCgzNiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKK3sgInN0dyIsICAgICBPUCgzNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCit7ICJzdCIsICAgICAgT1AoMzYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQTAgfSB9LAogCiB7ICJzdHd1IiwgICAgT1AoMzcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQVMgfSB9LAoteyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoreyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKIAoteyAic3RiIiwgICAgIE9QKDM4KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoreyAic3RiIiwgICAgIE9QKDM4KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKIAogeyAic3RidSIsICAgIE9QKDM5KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKIAoteyAibGh6IiwgICAgIE9QKDQwKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoreyAibGh6IiwgICAgIE9QKDQwKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKIAogeyAibGh6dSIsICAgIE9QKDQxKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKIAoteyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoreyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKIAogeyAibGhhdSIsICAgIE9QKDQzKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKIAoteyAic3RoIiwgICAgIE9QKDQ0KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoreyAic3RoIiwgICAgIE9QKDQ0KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKIAogeyAic3RodSIsICAgIE9QKDQ1KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKIAogeyAibG13IiwgICAgIE9QKDQ2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkFNIH0gfSwKLXsgImxtIiwgICAgICBPUCg0NiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKK3sgImxtIiwgICAgICBPUCg0NiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCiAKLXsgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0bSIsICAgICBPUCg0NyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKK3sgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCit7ICJzdG0iLCAgICAgT1AoNDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQTAgfSB9LAogCi17ICJsZnMiLCAgICAgT1AoNDgpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkEgfSB9LAoreyAibGZzIiwgICAgIE9QKDQ4KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBMCB9IH0sCiAKIHsgImxmc3UiLCAgICBPUCg0OSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAogCi17ICJsZmQiLCAgICAgT1AoNTApLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkEgfSB9LAoreyAibGZkIiwgICAgIE9QKDUwKSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBMCB9IH0sCiAKIHsgImxmZHUiLCAgICBPUCg1MSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAogCi17ICJzdGZzIiwgICAgT1AoNTIpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAoreyAic3RmcyIsICAgIE9QKDUyKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBMCB9IH0sCiAKIHsgInN0ZnN1IiwgICBPUCg1MyksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQVMgfSB9LAogCi17ICJzdGZkIiwgICAgT1AoNTQpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAoreyAic3RmZCIsICAgIE9QKDU0KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBMCB9IH0sCiAKIHsgInN0ZmR1IiwgICBPUCg1NSksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQVMgfSB9LAogCiB7ICJscSIsICAgICAgT1AoNTYpLAlPUF9NQVNLLAlQT1dFUjQsCQl7IFJUUSwgRFEsIFJBUSB9IH0sCiAKLXsgImxmcSIsICAgICBPUCg1NiksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCit7ICJsZnEiLCAgICAgT1AoNTYpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEwIH0gfSwKIAoteyAibGZxdSIsICAgIE9QKDU3KSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEQsIFJBIH0gfSwKK3sgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQTAgfSB9LAogCi17ICJsYnplIiwgICAgREVPKDU4LDApLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEgfSB9LAoreyAibGZkcCIsICAgIE9QKDU3KSwJT1BfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEQsIFJBMCB9IH0sCisKK3sgImxiemUiLCAgICBERU8oNTgsMCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQTAgfSB9LAogeyAibGJ6dWUiLCAgIERFTyg1OCwxKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBTCB9IH0sCi17ICJsaHplIiwgICAgREVPKDU4LDIpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEgfSB9LAoreyAibGh6ZSIsICAgIERFTyg1OCwyKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBMCB9IH0sCiB7ICJsaHp1ZSIsICAgREVPKDU4LDMpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkFMIH0gfSwKLXsgImxoYWUiLCAgICBERU8oNTgsNCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQSB9IH0sCit7ICJsaGFlIiwgICAgREVPKDU4LDQpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEwIH0gfSwKIHsgImxoYXVlIiwgICBERU8oNTgsNSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQUwgfSB9LAoteyAibHd6ZSIsICAgIERFTyg1OCw2KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBIH0gfSwKK3sgImx3emUiLCAgICBERU8oNTgsNiksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQTAgfSB9LAogeyAibHd6dWUiLCAgIERFTyg1OCw3KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBTCB9IH0sCi17ICJzdGJlIiwgICAgREVPKDU4LDgpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERSwgUkEgfSB9LAoreyAic3RiZSIsICAgIERFTyg1OCw4KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBMCB9IH0sCiB7ICJzdGJ1ZSIsICAgREVPKDU4LDkpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERSwgUkFTIH0gfSwKLXsgInN0aGUiLCAgICBERU8oNTgsMTApLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERSwgUkEgfSB9LAoreyAic3RoZSIsICAgIERFTyg1OCwxMCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQTAgfSB9LAogeyAic3RodWUiLCAgIERFTyg1OCwxMSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQVMgfSB9LAoteyAic3R3ZSIsICAgIERFTyg1OCwxNCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQSB9IH0sCit7ICJzdHdlIiwgICAgREVPKDU4LDE0KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBMCB9IH0sCiB7ICJzdHd1ZSIsICAgREVPKDU4LDE1KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBUyB9IH0sCiAKLXsgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKK3sgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBMCB9IH0sCiAKIHsgImxkdSIsICAgICBEU08oNTgsMSksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBTCB9IH0sCiAKLXsgImx3YSIsICAgICBEU08oNTgsMiksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKK3sgImx3YSIsICAgICBEU08oNTgsMiksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBMCB9IH0sCisKK3sgImRhZGQiLCAgICBYUkMoNTksMiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZGFkZC4iLCAgIFhSQyg1OSwyLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRxdWEiLCAgICBaUkMoNTksMywwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCit7ICJkcXVhLiIsICAgWlJDKDU5LDMsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAogCiB7ICJmZGl2cyIsICAgQSg1OSwxOCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAogeyAiZmRpdnMuIiwgIEEoNTksMTgsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKQEAgLTQ0MTMsMTIgKzQ2MzcsMTUgQEAKIHsgImZzcXJ0cyIsICBBKDU5LDIyLDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAogeyAiZnNxcnRzLiIsIEEoNTksMjIsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCiAKLXsgImZyZXMiLCAgICBBKDU5LDI0LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJlcy4iLCAgIEEoNTksMjQsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcmVzIiwgICAgQSg1OSwyNCwwKSwgQUZSQUxGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKK3sgImZyZXMuIiwgICBBKDU5LDI0LDEpLCBBRlJBTEZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAogCiB7ICJmbXVscyIsICAgQSg1OSwyNSwwKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAogeyAiZm11bHMuIiwgIEEoNTksMjUsMSksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKIAoreyAiZnJzcXJ0ZXMiLCBBKDU5LDI2LDApLCBBRlJBTEZSQ19NQVNLLFBPV0VSNSwJCXsgRlJULCBGUkIsIEFfTCB9IH0sCit7ICJmcnNxcnRlcy4iLEEoNTksMjYsMSksIEFGUkFMRlJDX01BU0ssUE9XRVI1LAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKKwogeyAiZm1zdWJzIiwgIEEoNTksMjgsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogeyAiZm1zdWJzLiIsIEEoNTksMjgsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogCkBAIC00NDMxLDMxICs0NjU4LDEwMyBAQAogeyAiZm5tYWRkcyIsIEEoNTksMzEsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogeyAiZm5tYWRkcy4iLEEoNTksMzEsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogCit7ICJkbXVsIiwgICAgWFJDKDU5LDM0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkbXVsLiIsICAgWFJDKDU5LDM0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRycm5kIiwgICBaUkMoNTksMzUsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAoreyAiZHJybmQuIiwgIFpSQyg1OSwzNSwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCisKK3sgImRzY2xpIiwgICBaUkMoNTksNjYsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgU0gxNiB9IH0sCit7ICJkc2NsaS4iLCAgWlJDKDU5LDY2LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAorCit7ICJkcXVhaSIsICAgWlJDKDU5LDY3LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgVEUsICBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRxdWFpLiIsICBaUkMoNTksNjcsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBURSwgIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkc2NyaSIsICAgWlJDKDU5LDk4LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjcmkuIiwgIFpSQyg1OSw5OCwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHJpbnR4IiwgIFpSQyg1OSw5OSwwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAoreyAiZHJpbnR4LiIsIFpSQyg1OSw5OSwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkY21wbyIsICAgWCg1OSwxMzApLAkgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCisKK3sgImR0c3RleCIsICBYKDU5LDE2MiksCSAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKK3sgImR0c3RkYyIsICBaKDU5LDE5NCksCSAgIFpfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRENNIH0gfSwKK3sgImR0c3RkZyIsICBaKDU5LDIyNiksCSAgIFpfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgREdNIH0gfSwKKworeyAiZHJpbnRuIiwgIFpSQyg1OSwyMjcsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRyaW50bi4iLCBaUkMoNTksMjI3LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCisKK3sgImRjdGRwIiwgICBYUkMoNTksMjU4LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZGN0ZHAuIiwgIFhSQyg1OSwyNTgsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRjdGZpeCIsICBYUkMoNTksMjkwLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZGN0Zml4LiIsIFhSQyg1OSwyOTAsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRkZWRwZCIsICBYUkMoNTksMzIyLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgU1AsIEZSVCwgRlJCIH0gfSwgCit7ICJkZGVkcGQuIiwgWFJDKDU5LDMyMiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFNQLCBGUlQsIEZSQiB9IH0sIAorCit7ICJkeGV4IiwgICAgWFJDKDU5LDM1NCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImR4ZXguIiwgICBYUkMoNTksMzU0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkc3ViIiwgICAgWFJDKDU5LDUxNCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZHN1Yi4iLCAgIFhSQyg1OSw1MTQsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZGRpdiIsICAgIFhSQyg1OSw1NDYsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRkaXYuIiwgICBYUkMoNTksNTQ2LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRjbXB1IiwgICBYKDU5LDY0MiksCSAgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCisKK3sgImR0c3RzZiIsICBYKDU5LDY3NCksCSAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAiZHJzcCIsICAgIFhSQyg1OSw3NzAsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkcnNwLiIsICAgWFJDKDU5LDc3MCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGNmZml4IiwgIFhSQyg1OSw4MDIsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkY2ZmaXguIiwgWFJDKDU5LDgwMiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGVuYmNkIiwgIFhSQyg1OSw4MzQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBTLCBGUlQsIEZSQiB9IH0sCit7ICJkZW5iY2QuIiwgWFJDKDU5LDgzNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFMsIEZSVCwgRlJCIH0gfSwKKworeyAiZGlleCIsICAgIFhSQyg1OSw4NjYsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRpZXguIiwgICBYUkMoNTksODY2LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKIHsgInN0ZnEiLCAgICBPUCg2MCksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJTLCBELCBSQSB9IH0sCiAKIHsgInN0ZnF1IiwgICBPUCg2MSksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJTLCBELCBSQSB9IH0sCiAKLXsgImxkZSIsICAgICBERU8oNjIsMCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFUywgUkEgfSB9LAoteyAibGR1ZSIsICAgIERFTyg2MiwxKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREVTLCBSQSB9IH0sCi17ICJsZnNlIiwgICAgREVPKDYyLDQpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSVCwgREVTLCBSQSB9IH0sCit7ICJzdGZkcCIsICAgT1AoNjEpLAlPUF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRCwgUkEwIH0gfSwKKworeyAibGRlIiwgICAgIERFTyg2MiwwKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREVTLCBSQTAgfSB9LAoreyAibGR1ZSIsICAgIERFTyg2MiwxKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREVTLCBSQTAgfSB9LAoreyAibGZzZSIsICAgIERFTyg2Miw0KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlQsIERFUywgUkEwIH0gfSwKIHsgImxmc3VlIiwgICBERU8oNjIsNSksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJULCBERVMsIFJBUyB9IH0sCi17ICJsZmRlIiwgICAgREVPKDYyLDYpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSVCwgREVTLCBSQSB9IH0sCit7ICJsZmRlIiwgICAgREVPKDYyLDYpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSVCwgREVTLCBSQTAgfSB9LAogeyAibGZkdWUiLCAgIERFTyg2Miw3KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlQsIERFUywgUkFTIH0gfSwKLXsgInN0ZGUiLCAgICBERU8oNjIsOCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFUywgUkEgfSB9LAoreyAic3RkZSIsICAgIERFTyg2Miw4KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREVTLCBSQTAgfSB9LAogeyAic3RkdWUiLCAgIERFTyg2Miw5KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREVTLCBSQVMgfSB9LAoteyAic3Rmc2UiLCAgIERFTyg2MiwxMiksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJTLCBERVMsIFJBIH0gfSwKK3sgInN0ZnNlIiwgICBERU8oNjIsMTIpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSUywgREVTLCBSQTAgfSB9LAogeyAic3Rmc3VlIiwgIERFTyg2MiwxMyksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJTLCBERVMsIFJBUyB9IH0sCi17ICJzdGZkZSIsICAgREVPKDYyLDE0KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlMsIERFUywgUkEgfSB9LAoreyAic3RmZGUiLCAgIERFTyg2MiwxNCksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJTLCBERVMsIFJBMCB9IH0sCiB7ICJzdGZkdWUiLCAgREVPKDYyLDE1KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlMsIERFUywgUkFTIH0gfSwKIAoteyAic3RkIiwgICAgIERTTyg2MiwwKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkEgfSB9LAoreyAic3RkIiwgICAgIERTTyg2MiwwKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkEwIH0gfSwKIAogeyAic3RkdSIsICAgIERTTyg2MiwxKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkFTIH0gfSwKIAoteyAic3RxIiwgICAgIERTTyg2MiwyKSwJRFNfTUFTSywJUE9XRVI0LAkJeyBSU1EsIERTLCBSQSB9IH0sCit7ICJzdHEiLCAgICAgRFNPKDYyLDIpLAlEU19NQVNLLAlQT1dFUjQsCQl7IFJTUSwgRFMsIFJBMCB9IH0sCiAKIHsgImZjbXB1IiwgICBYKDYzLDApLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAogCit7ICJkYWRkcSIsICAgWFJDKDYzLDIsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRhZGRxLiIsICBYUkMoNjMsMiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkcXVhcSIsICAgWlJDKDYzLDMsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAoreyAiZHF1YXEuIiwgIFpSQyg2MywzLDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKKworeyAiZmNwc2duIiwgIFhSQyg2Myw4LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmY3BzZ24uIiwgWFJDKDYzLDgsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKwogeyAiZnJzcCIsICAgIFhSQyg2MywxMiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogeyAiZnJzcC4iLCAgIFhSQyg2MywxMiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogCkBAIC00NDkwLDEzICs0Nzg5LDE2IEBACiB7ICJmc2VsIiwgICAgQSg2MywyMywwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCiB7ICJmc2VsLiIsICAgQSg2MywyMywxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCiAKK3sgImZyZSIsICAgICBBKDYzLDI0LDApLCBBRlJBTEZSQ19NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAoreyAiZnJlLiIsICAgIEEoNjMsMjQsMSksIEFGUkFMRlJDX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIsIEFfTCB9IH0sCisKIHsgImZtdWwiLCAgICBBKDYzLDI1LDApLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCiB7ICJmbSIsICAgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAogeyAiZm11bC4iLCAgIEEoNjMsMjUsMSksIEFGUkJfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKIHsgImZtLiIsICAgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCiAKLXsgImZyc3FydGUiLCBBKDYzLDI2LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJzcXJ0ZS4iLEEoNjMsMjYsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcnNxcnRlIiwgQSg2MywyNiwwKSwgQUZSQUxGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKK3sgImZyc3FydGUuIixBKDYzLDI2LDEpLCBBRlJBTEZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAogCiB7ICJmbXN1YiIsICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCiB7ICJmbXMiLCAgICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCkBAIC00NTIwLDYgKzQ4MjIsMTIgQEAKIAogeyAiZmNtcG8iLCAgIFgoNjMsMzIpLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAogCit7ICJkbXVscSIsICAgWFJDKDYzLDM0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkbXVscS4iLCAgWFJDKDYzLDM0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRycm5kcSIsICBaUkMoNjMsMzUsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAoreyAiZHJybmRxLiIsIFpSQyg2MywzNSwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCisKIHsgIm10ZnNiMSIsICBYUkMoNjMsMzgsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAogeyAibXRmc2IxLiIsIFhSQyg2MywzOCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCiAKQEAgLTQ1MjgsMzYgKzQ4MzYsMTAwIEBACiAKIHsgIm1jcmZzIiwgICBYKDYzLDY0KSwJWFJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCiAKK3sgImRzY2xpcSIsICBaUkMoNjMsNjYsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgU0gxNiB9IH0sCit7ICJkc2NsaXEuIiwgWlJDKDYzLDY2LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAorCit7ICJkcXVhaXEiLCAgWlJDKDYzLDY3LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgVEUsICBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRxdWFpcS4iLCBaUkMoNjMsNjcsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAorCiB7ICJtdGZzYjAiLCAgWFJDKDYzLDcwLDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKIHsgIm10ZnNiMC4iLCBYUkMoNjMsNzAsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAogCiB7ICJmbXIiLCAgICAgWFJDKDYzLDcyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCiB7ICJmbXIuIiwgICAgWFJDKDYzLDcyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCiAKK3sgImRzY3JpcSIsICBaUkMoNjMsOTgsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgU0gxNiB9IH0sCit7ICJkc2NyaXEuIiwgWlJDKDYzLDk4LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAorCit7ICJkcmludHhxIiwgWlJDKDYzLDk5LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCit7ICJkcmludHhxLiIsWlJDKDYzLDk5LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCisKK3sgImRjbXBvcSIsICBYKDYzLDEzMCksCSAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKwogeyAibXRmc2ZpIiwgIFhSQyg2MywxMzQsMCksIFhSQV9NQVNLfCgzPDwyMSl8KDE8PDExKSwgQ09NLCB7IEJGLCBVIH0gfSwKIHsgIm10ZnNmaS4iLCBYUkMoNjMsMTM0LDEpLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCiAKIHsgImZuYWJzIiwgICBYUkMoNjMsMTM2LDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCiB7ICJmbmFicy4iLCAgWFJDKDYzLDEzNiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogCit7ICJkdHN0ZXhxIiwgWCg2MywxNjIpLAkgICAgWF9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBGUkIgfSB9LAoreyAiZHRzdGRjcSIsIFooNjMsMTk0KSwJICAgIFpfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRENNIH0gfSwKK3sgImR0c3RkZ3EiLCBaKDYzLDIyNiksCSAgICBaX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIERHTSB9IH0sCisKK3sgImRyaW50bnEiLCBaUkMoNjMsMjI3LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCit7ICJkcmludG5xLiIsWlJDKDYzLDIyNywxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkY3RxcHEiLCAgWFJDKDYzLDI1OCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjdHFwcS4iLCBYUkMoNjMsMjU4LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCiB7ICJmYWJzIiwgICAgWFJDKDYzLDI2NCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogeyAiZmFicy4iLCAgIFhSQyg2MywyNjQsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKIAoreyAiZGN0Zml4cSIsIFhSQyg2MywyOTAsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkY3RmaXhxLiIsWFJDKDYzLDI5MCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGRlZHBkcSIsIFhSQyg2MywzMjIsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBTUCwgRlJULCBGUkIgfSB9LAoreyAiZGRlZHBkcS4iLFhSQyg2MywzMjIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBTUCwgRlJULCBGUkIgfSB9LAorCit7ICJkeGV4cSIsICAgWFJDKDYzLDM1NCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImR4ZXhxLiIsICBYUkMoNjMsMzU0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmcmluIiwgICAgWFJDKDYzLDM5MiwwKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpbi4iLCAgIFhSQyg2MywzOTIsMSksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaXoiLCAgICBYUkMoNjMsNDI0LDApLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcml6LiIsICAgWFJDKDYzLDQyNCwxKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpcCIsICAgIFhSQyg2Myw0NTYsMCksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaXAuIiwgICBYUkMoNjMsNDU2LDEpLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcmltIiwgICAgWFJDKDYzLDQ4OCwwKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpbS4iLCAgIFhSQyg2Myw0ODgsMSksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZHN1YnEiLCAgIFhSQyg2Myw1MTQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRzdWJxLiIsICBYUkMoNjMsNTE0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRkaXZxIiwgICBYUkMoNjMsNTQ2LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkZGl2cS4iLCAgWFJDKDYzLDU0NiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCiB7ICJtZmZzIiwgICAgWFJDKDYzLDU4MywwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBGUlQgfSB9LAogeyAibWZmcy4iLCAgIFhSQyg2Myw1ODMsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKIAoreyAiZGNtcHVxIiwgIFgoNjMsNjQyKSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAiZHRzdHNmcSIsIFgoNjMsNjc0KSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKwogeyAibXRmc2YiLCAgIFhGTCg2Myw3MTEsMCksIFhGTF9NQVNLLAlDT00sCQl7IEZMTSwgRlJCIH0gfSwKIHsgIm10ZnNmLiIsICBYRkwoNjMsNzExLDEpLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCiAKK3sgImRyZHBxIiwgICBYUkMoNjMsNzcwLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZHJkcHEuIiwgIFhSQyg2Myw3NzAsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRjZmZpeHEiLCBYUkMoNjMsODAyLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZGNmZml4cS4iLFhSQyg2Myw4MDIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKIHsgImZjdGlkIiwgICBYUkMoNjMsODE0LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKIHsgImZjdGlkLiIsICBYUkMoNjMsODE0LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKIAogeyAiZmN0aWR6IiwgIFhSQyg2Myw4MTUsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAogeyAiZmN0aWR6LiIsIFhSQyg2Myw4MTUsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAogCit7ICJkZW5iY2RxIiwgWFJDKDYzLDgzNCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFMsIEZSVCwgRlJCIH0gfSwKK3sgImRlbmJjZHEuIixYUkMoNjMsODM0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgUywgRlJULCBGUkIgfSB9LAorCiB7ICJmY2ZpZCIsICAgWFJDKDYzLDg0NiwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCiB7ICJmY2ZpZC4iLCAgWFJDKDYzLDg0NiwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCiAKK3sgImRpZXhxIiwgICBYUkMoNjMsODY2LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkaWV4cS4iLCAgWFJDKDYzLDg2NiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCiB9OwogCiBjb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlcyA9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9wcGMuaCBiL2FyY2gvcG93ZXJwYy94bW9uL3BwYy5oCmluZGV4IDM0MjIzN2UuLjExMGRmOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3BwYy5oCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3BwYy5oCkBAIC0xLDUgKzEsNSBAQAogLyogcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMworICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAogCkBAIC0xNyw3ICsxNyw3IEBACiAKIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KK1NvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCiAKICNpZm5kZWYgUFBDX0gKICNkZWZpbmUgUFBDX0gKQEAgLTEzNCw2ICsxMzQsMTggQEAKIC8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgbWFjaGluZSBjaGVjayBBUFUuICAqLwogI2RlZmluZSBQUENfT1BDT0RFX1JGTUNJCSAgMHg4MDAwMDAKIAorLyogT3Bjb2RlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFBvd2VyNSBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSNQkgMHgxMDAwMDAwCisKKy8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgUG93ZXJQQyBlMzAwIGZhbWlseS4gICovCisjZGVmaW5lIFBQQ19PUENPREVfRTMwMCAgICAgICAgICAweDIwMDAwMDAKKworLyogT3Bjb2RlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFBvd2VyNiBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSNgkgMHg0MDAwMDAwCisKKy8qIE9wY29kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb3dlclBDIENlbGwgZmFtaWx5LiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9DRUxMCQkgMHg4MDAwMDAwCisKIC8qIEEgbWFjcm8gdG8gZXh0cmFjdCB0aGUgbWFqb3Igb3Bjb2RlIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBQUENfT1AoaSkgKCgoaSkgPj4gMjYpICYgMHgzZikKIAwKQEAgLTIzMywyNSArMjQ1LDI4IEBACiAgICByZWdpc3RlciBuYW1lcyB3aXRoIGEgbGVhZGluZyAncicuICAqLwogI2RlZmluZSBQUENfT1BFUkFORF9HUFIgKDA0MCkKIAorLyogTGlrZSBQUENfT1BFUkFORF9HUFIsIGJ1dCBkb24ndCBwcmludCBhIGxlYWRpbmcgJ3InIGZvciByMC4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX0dQUl8wICgwMTAwKQorCiAvKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIKICAgIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAnZicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9GUFIgKDAxMDApCisjZGVmaW5lIFBQQ19PUEVSQU5EX0ZQUiAoMDIwMCkKIAogLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKICAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9SRUxBVElWRSAoMDIwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfUkVMQVRJVkUgKDA0MDApCiAKIC8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKICAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9BQlNPTFVURSAoMDQwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfQUJTT0xVVEUgKDAxMDAwKQogCiAvKiBUaGlzIG9wZXJhbmQgaXMgb3B0aW9uYWwsIGFuZCBpcyB6ZXJvIGlmIG9taXR0ZWQuICBUaGlzIGlzIHVzZWQgZm9yCi0gICB0aGUgb3B0aW9uYWwgQkYgYW5kIEwgZmllbGRzIGluIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gIFRoZQorICAgZXhhbXBsZSwgaW4gdGhlIG9wdGlvbmFsIEJGIGZpZWxkIGluIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gIFRoZQogICAgYXNzZW1ibGVyIG11c3QgY291bnQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZW1haW5pbmcgb24gdGhlIGxpbmUsCiAgICBhbmQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZW1haW5pbmcgZm9yIHRoZSBvcGNvZGUsIGFuZCBkZWNpZGUKICAgIHdoZXRoZXIgdGhpcyBvcGVyYW5kIGlzIHByZXNlbnQgb3Igbm90LiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQKICAgIHByaW50IHRoaXMgb3BlcmFuZCBvdXQgb25seSBpZiBpdCBpcyBub3QgemVyby4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX09QVElPTkFMICgwMTAwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfT1BUSU9OQUwgKDAyMDAwKQogCiAvKiBUaGlzIGZsYWcgaXMgb25seSB1c2VkIHdpdGggUFBDX09QRVJBTkRfT1BUSU9OQUwuICBJZiB0aGlzIG9wZXJhbmQKICAgIGlzIG9taXR0ZWQsIHRoZW4gZm9yIHRoZSBuZXh0IG9wZXJhbmQgdXNlIHRoaXMgb3BlcmFuZCB2YWx1ZSBwbHVzCkBAIC0yNTksMjQgKzI3NCwyNCBAQAogICAgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgUG93ZXIgcm90YXRlIGluc3RydWN0aW9ucyBjYW4gdGFrZQogICAgZWl0aGVyIDQgb3IgNSBvcGVyYW5kcy4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIHByaW50IHRoaXMgb3BlcmFuZAogICAgb3V0IHJlZ2FyZGxlc3Mgb2YgdGhlIFBQQ19PUEVSQU5EX09QVElPTkFMIGZpZWxkLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfTkVYVCAoMDIwMDApCisjZGVmaW5lIFBQQ19PUEVSQU5EX05FWFQgKDA0MDAwKQogCiAvKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKICAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKICAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQogICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCiAgICBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfTkVHQVRJVkUgKDA0MDAwKQorI2RlZmluZSBQUENfT1BFUkFORF9ORUdBVElWRSAoMDEwMDAwKQogCiAvKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSB2ZWN0b3IgdW5pdCByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIKICAgIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAndicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9WUiAoMDEwMDAwKQorI2RlZmluZSBQUENfT1BFUkFORF9WUiAoMDIwMDAwKQogCiAvKiBUaGlzIG9wZXJhbmQgaXMgZm9yIHRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9EUyAoMDIwMDAwKQorI2RlZmluZSBQUENfT1BFUkFORF9EUyAoMDQwMDAwKQogCiAvKiBUaGlzIG9wZXJhbmQgaXMgZm9yIHRoZSBEUSBmaWVsZCBpbiBhIERRIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9EUSAoMDQwMDAwKQorI2RlZmluZSBQUENfT1BFUkFORF9EUSAoMDEwMDAwMCkKIAwKIC8qIFRoZSBQT1dFUiBhbmQgUG93ZXJQQyBhc3NlbWJsZXJzIHVzZSBhIGZldyBtYWNyb3MuICBXZSBrZWVwIHRoZW0KICAgIHdpdGggdGhlIG9wZXJhbmRzIHRhYmxlIGZvciBzaW1wbGljaXR5LiAgVGhlIG1hY3JvIHRhYmxlIGlzIGFuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zcHUtZGlzLmMgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5MjljNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1kaXMuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogRGlzYXNzZW1ibGUgU1BVIGluc3RydWN0aW9ucworCisgICBDb3B5cmlnaHQgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJub25zdGRpby5oIgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAic3B1LmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorCisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBkaXNhc3NlbWJsZXIgZnVuY3Rpb24gd2hpY2ggdXNlcworICAgdGhlIGRpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZGVmaW5lZCBpbiBkaXMtYXNtLmguICAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcHVfb3Bjb2RlIHNwdV9vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IHNwdV9udW1fb3Bjb2RlczsKKworI2RlZmluZSBTUFVfRElTQVNNX1RCTF9TSVpFICgxIDw8IDExKQorc3RhdGljIGNvbnN0IHN0cnVjdCBzcHVfb3Bjb2RlICpzcHVfZGlzYXNzZW1ibGVfdGFibGVbU1BVX0RJU0FTTV9UQkxfU0laRV07CisKK3N0YXRpYyB2b2lkCitpbml0X3NwdV9kaXNhc3NlbWJsZSAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgLyogSWYgdHdvIGluc3RydWN0aW9ucyBoYXZlIHRoZSBzYW1lIG9wY29kZSB0aGVuIHdlIHByZWZlciB0aGUgZmlyc3QKKyAgICogb25lLiAgSW4gbW9zdCBjYXNlcyBpdCBpcyBqdXN0IGFuIGFsdGVybmF0ZSBtbmVtb25pYy4gKi8KKyAgZm9yIChpID0gMDsgaSA8IHNwdV9udW1fb3Bjb2RlczsgaSsrKQorICAgIHsKKyAgICAgIGludCBvID0gc3B1X29wY29kZXNbaV0ub3Bjb2RlOworICAgICAgaWYgKG8gPj0gU1BVX0RJU0FTTV9UQkxfU0laRSkKKwljb250aW51ZTsgLyogYWJvcnQgKCk7ICovCisgICAgICBpZiAoc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29dID09IDApCisJc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29dID0gJnNwdV9vcGNvZGVzW2ldOworICAgIH0KK30KKworLyogRGV0ZXJtaW5lIHRoZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSAxMCBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzcHVfb3Bjb2RlICoKK2dldF9pbmRleF9mb3Jfb3Bjb2RlICh1bnNpZ25lZCBpbnQgaW5zbikKK3sKKyAgY29uc3Qgc3RydWN0IHNwdV9vcGNvZGUgKmluZGV4OworICB1bnNpZ25lZCBpbnQgb3Bjb2RlID0gaW5zbiA+PiAoMzItMTEpOworCisgIC8qIEluaXQgdGhlIHRhYmxlLiAgVGhpcyBhc3N1bWVzIHRoYXQgZWxlbWVudCAwL29wY29kZSAwIChjdXJyZW50bHkKKyAgICogTk9QKSBpcyBhbHdheXMgdXNlZCAqLworICBpZiAoc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlWzBdID09IDApCisgICAgaW5pdF9zcHVfZGlzYXNzZW1ibGUgKCk7CisKKyAgaWYgKChpbmRleCA9IHNwdV9kaXNhc3NlbWJsZV90YWJsZVtvcGNvZGUgJiAweDc4MF0pICE9IDAKKyAgICAgICYmIGluZGV4LT5pbnNuX3R5cGUgPT0gUlJSKQorICAgIHJldHVybiBpbmRleDsKKworICBpZiAoKGluZGV4ID0gc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29wY29kZSAmIDB4N2YwXSkgIT0gMAorICAgICAgJiYgKGluZGV4LT5pbnNuX3R5cGUgPT0gUkkxOCB8fCBpbmRleC0+aW5zbl90eXBlID09IExCVCkpCisgICAgcmV0dXJuIGluZGV4OworCisgIGlmICgoaW5kZXggPSBzcHVfZGlzYXNzZW1ibGVfdGFibGVbb3Bjb2RlICYgMHg3ZjhdKSAhPSAwCisgICAgICAmJiBpbmRleC0+aW5zbl90eXBlID09IFJJMTApCisgICAgcmV0dXJuIGluZGV4OworCisgIGlmICgoaW5kZXggPSBzcHVfZGlzYXNzZW1ibGVfdGFibGVbb3Bjb2RlICYgMHg3ZmNdKSAhPSAwCisgICAgICAmJiAoaW5kZXgtPmluc25fdHlwZSA9PSBSSTE2KSkKKyAgICByZXR1cm4gaW5kZXg7CisKKyAgaWYgKChpbmRleCA9IHNwdV9kaXNhc3NlbWJsZV90YWJsZVtvcGNvZGUgJiAweDdmZV0pICE9IDAKKyAgICAgICYmIChpbmRleC0+aW5zbl90eXBlID09IFJJOCkpCisgICAgcmV0dXJuIGluZGV4OworCisgIGlmICgoaW5kZXggPSBzcHVfZGlzYXNzZW1ibGVfdGFibGVbb3Bjb2RlICYgMHg3ZmZdKSAhPSAwKQorICAgIHJldHVybiBpbmRleDsKKworICByZXR1cm4gMDsKK30KKworLyogUHJpbnQgYSBTcHUgaW5zdHJ1Y3Rpb24uICAqLworCitpbnQKK3ByaW50X2luc25fc3B1ICh1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcgbWVtYWRkcikKK3sKKyAgaW50IHZhbHVlOworICBpbnQgaGV4X3ZhbHVlOworICBjb25zdCBzdHJ1Y3Qgc3B1X29wY29kZSAqaW5kZXg7CisgIGVudW0gc3B1X2luc25zIHRhZzsKKworICBpbmRleCA9IGdldF9pbmRleF9mb3Jfb3Bjb2RlIChpbnNuKTsKKworICBpZiAoaW5kZXggPT0gMCkKKyAgICB7CisgICAgICBwcmludGYoIi5sb25nIDB4JXgiLCBpbnNuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBwYXJlbiA9IDA7CisgICAgICB0YWcgPSAoZW51bSBzcHVfaW5zbnMpKGluZGV4IC0gc3B1X29wY29kZXMpOworICAgICAgcHJpbnRmKCIlcyIsIGluZGV4LT5tbmVtb25pYyk7CisgICAgICBpZiAodGFnID09IE1fQkkgfHwgdGFnID09IE1fQklTTCB8fCB0YWcgPT0gTV9JUkVUIHx8IHRhZyA9PSBNX0JJU0xFRAorCSAgfHwgdGFnID09IE1fQklITlogfHwgdGFnID09IE1fQklIWiB8fCB0YWcgPT0gTV9CSU5aIHx8IHRhZyA9PSBNX0JJWgorICAgICAgICAgIHx8IHRhZyA9PSBNX1NZTkMgfHwgdGFnID09IE1fSEJSKQorCXsKKwkgIGludCBmYiA9IChpbnNuID4+ICgzMi0xOCkpICYgMHg3ZjsKKwkgIGlmIChmYiAmIDB4NDApCisJICAgIHByaW50Zih0YWcgPT0gTV9TWU5DID8gImMiIDogInAiKTsKKwkgIGlmIChmYiAmIDB4MjApCisJICAgIHByaW50ZigiZCIpOworCSAgaWYgKGZiICYgMHgxMCkKKwkgICAgcHJpbnRmKCJlIik7CisJfQorICAgICAgaWYgKGluZGV4LT5hcmdbMF0gIT0gMCkKKwlwcmludGYoIlx0Iik7CisgICAgICBoZXhfdmFsdWUgPSAwOworICAgICAgZm9yIChpID0gMTsgIGkgPD0gaW5kZXgtPmFyZ1swXTsgaSsrKQorCXsKKwkgIGludCBhcmcgPSBpbmRleC0+YXJnW2ldOworCSAgaWYgKGFyZyAhPSBBX1AgJiYgIXBhcmVuICYmIGkgPiAxKQorCSAgICBwcmludGYoIiwiKTsKKworCSAgc3dpdGNoIChhcmcpCisJICAgIHsKKwkgICAgY2FzZSBBX1Q6CisJICAgICAgcHJpbnRmKCIkJWQiLAorCQkJCSAgICAgREVDT0RFX0lOU05fUlQgKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0E6CisJICAgICAgcHJpbnRmKCIkJWQiLAorCQkJCSAgICAgREVDT0RFX0lOU05fUkEgKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0I6CisJICAgICAgcHJpbnRmKCIkJWQiLAorCQkJCSAgICAgREVDT0RFX0lOU05fUkIgKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0M6CisJICAgICAgcHJpbnRmKCIkJWQiLAorCQkJCSAgICAgREVDT0RFX0lOU05fUkMgKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1M6CisJICAgICAgcHJpbnRmKCIkc3AlZCIsCisJCQkJICAgICBERUNPREVfSU5TTl9SQSAoaW5zbikpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfSDoKKwkgICAgICBwcmludGYoIiRjaCVkIiwKKwkJCQkgICAgIERFQ09ERV9JTlNOX1JBIChpbnNuKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9QOgorCSAgICAgIHBhcmVuKys7CisJICAgICAgcHJpbnRmKCIoIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9VN0E6CisJICAgICAgcHJpbnRmKCIlZCIsCisJCQkJICAgICAxNzMgLSBERUNPREVfSU5TTl9VOCAoaW5zbikpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfVTdCOgorCSAgICAgIHByaW50ZigiJWQiLAorCQkJCSAgICAgMTU1IC0gREVDT0RFX0lOU05fVTggKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1MzOgorCSAgICBjYXNlIEFfUzY6CisJICAgIGNhc2UgQV9TNzoKKwkgICAgY2FzZSBBX1M3TjoKKwkgICAgY2FzZSBBX1UzOgorCSAgICBjYXNlIEFfVTU6CisJICAgIGNhc2UgQV9VNjoKKwkgICAgY2FzZSBBX1U3OgorCSAgICAgIGhleF92YWx1ZSA9IERFQ09ERV9JTlNOX0k3IChpbnNuKTsKKwkgICAgICBwcmludGYoIiVkIiwgaGV4X3ZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1MxMToKKwkgICAgICBwcmludF9hZGRyZXNzKG1lbWFkZHIgKyBERUNPREVfSU5TTl9JOWEgKGluc24pICogNCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMTFJOgorCSAgICAgIHByaW50X2FkZHJlc3MobWVtYWRkciArIERFQ09ERV9JTlNOX0k5YiAoaW5zbikgKiA0KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1MxMDoKKwkgICAgY2FzZSBBX1MxMEI6CisJICAgICAgaGV4X3ZhbHVlID0gREVDT0RFX0lOU05fSTEwIChpbnNuKTsKKwkgICAgICBwcmludGYoIiVkIiwgaGV4X3ZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1MxNDoKKwkgICAgICBoZXhfdmFsdWUgPSBERUNPREVfSU5TTl9JMTAgKGluc24pICogMTY7CisJICAgICAgcHJpbnRmKCIlZCIsIGhleF92YWx1ZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMTY6CisJICAgICAgaGV4X3ZhbHVlID0gREVDT0RFX0lOU05fSTE2IChpbnNuKTsKKwkgICAgICBwcmludGYoIiVkIiwgaGV4X3ZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1gxNjoKKwkgICAgICBoZXhfdmFsdWUgPSBERUNPREVfSU5TTl9VMTYgKGluc24pOworCSAgICAgIHByaW50ZigiJXUiLCBoZXhfdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfUjE4OgorCSAgICAgIHZhbHVlID0gREVDT0RFX0lOU05fSTE2IChpbnNuKSAqIDQ7CisJICAgICAgaWYgKHZhbHVlID09IDApCisJCXByaW50ZigiJWQiLCB2YWx1ZSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgaGV4X3ZhbHVlID0gbWVtYWRkciArIHZhbHVlOworCQkgIHByaW50X2FkZHJlc3MoaGV4X3ZhbHVlICYgMHgzZmZmZik7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1MxODoKKwkgICAgICB2YWx1ZSA9IERFQ09ERV9JTlNOX1UxNiAoaW5zbikgKiA0OworCSAgICAgIGlmICh2YWx1ZSA9PSAwKQorCQlwcmludGYoIiVkIiwgdmFsdWUpOworCSAgICAgIGVsc2UKKwkJcHJpbnRfYWRkcmVzcyh2YWx1ZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9VMTg6CisJICAgICAgdmFsdWUgPSBERUNPREVfSU5TTl9VMTggKGluc24pOworCSAgICAgIGlmICh2YWx1ZSA9PSAwIHx8IDEpCisJCXsKKwkJICBoZXhfdmFsdWUgPSB2YWx1ZTsKKwkJICBwcmludGYoIiV1IiwgdmFsdWUpOworCQl9CisJICAgICAgZWxzZQorCQlwcmludF9hZGRyZXNzKHZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1UxNDoKKwkgICAgICBoZXhfdmFsdWUgPSBERUNPREVfSU5TTl9VMTQgKGluc24pOworCSAgICAgIHByaW50ZigiJXUiLCBoZXhfdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAoYXJnICE9IEFfUCAmJiBwYXJlbikKKwkgICAgeworCSAgICAgIHByaW50ZigiKSIpOworCSAgICAgIHBhcmVuLS07CisJICAgIH0KKwl9CisgICAgICBpZiAoaGV4X3ZhbHVlID4gMTYpCisJcHJpbnRmKCJcdCMgJXgiLCBoZXhfdmFsdWUpOworICAgIH0KKyAgcmV0dXJuIDQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zcHUtaW5zbnMuaCBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1pbnNucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGM0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUtaW5zbnMuaApAQCAtMCwwICsxLDQxMCBAQAorLyogU1BVIEVMRiBzdXBwb3J0IGZvciBCRkQuCisKKyAgIENvcHlyaWdodCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKworLyogU1BVIE9wY29kZSBUYWJsZQorCistPS09LT0gRk9STUFUID0tPS09LQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICArLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKyAgCQkgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKK1JSUiAgICB8IG9wIHwgIFJDICAgfCAgUkIgICB8ICBSQSAgIHwgIFJUICAgfAkJUkk3ICAgIHwgb3AgICAgICAgICB8ICBJNyAgIHwgIFJBICAgfCAgUlQgICB8CisgICAgICAgKy0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsJCSAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICAwICAzICAgICAgIDEgICAgICAgMSAgICAgICAyICAgICAgIDMJCSAgICAgICAgMCAgICAgICAgICAxICAgICAgIDEgICAgICAgMiAgICAgICAzIAorICAgICAgICAgICAgICAgICAgIDAgICAgICAgNyAgICAgICA0ICAgICAgIDEJCSAgICAgICAgICAgICAgICAgICAwICAgICAgIDcgICAgICAgNCAgICAgICAxIAorCisgICAgICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsJCSAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworUkk4ICAgIHwgb3AgICAgICAgIHwgICBJOCAgIHwgIFJBICAgfCAgUlQgICB8CQlSSTEwICAgfCBvcCAgICAgIHwgICBJMTAgICAgfCAgUkEgICB8ICBSVCAgIHwKKyAgICAgICArLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwkJICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgIDAgICAgICAgICA5ICAgICAgICAxICAgICAgIDIgICAgICAgMwkJICAgICAgICAwICAgICAgIDcgICAgICAgICAgMSAgICAgICAyICAgICAgIDMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAgICAgIDQgICAgICAgMQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgICAgICA0ICAgICAgIDEgCisKKyAgICAgICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwkJICAgICAgICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCitSSTE2ICAgfCBvcCAgICAgICB8ICAgICAgIEkxNiAgICAgICB8ICBSVCAgIHwJCVJJMTggICB8IG9wICAgICB8ICAgICAgIEkxOCAgICAgICAgIHwgIFJUICAgfAorICAgICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCQkgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAgMCAgICAgICAgOCAgICAgICAgICAgICAgICAgMiAgICAgICAzCQkgICAgICAgIDAgICAgICA2ICAgICAgICAgICAgICAgICAgIDIgICAgICAgMyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAxCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgMSAKKworICAgICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCQkgICAgICAgKy0tLS0tLS0rLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK1JSICAgICB8IG9wICAgICAgICAgfCAgUkIgICB8ICBSQSAgIHwgIFJUICAgfAkJTEJUICAgIHwgb3AgICAgfFJPfCAgICAgICBJMTYgICAgICAgfCAgUk8gICB8CisgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsJCSAgICAgICArLS0tLS0tLSstLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworICAgICAgICAwICAgICAgICAgIDEgICAgICAgMSAgICAgICAyICAgICAgIDMJCSAgICAgICAgMCAgICAgNiAgOCAgICAgICAgICAgICAgICAgMiAgICAgICAzIAorICAgICAgICAgICAgICAgICAgIDAgICAgICAgNyAgICAgICA0ICAgICAgIDEJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAxIAorCisJCQkJCQkJICAgICAgICstLS0tLS0tLS0tLS0rLS0tLSstLSstLS0tLS0tKy0tLS0tLS0rCisJCQkJCQkJTEJUSSAgIHwgb3AgICAgICAgICB8IC8vIHxST3wgIFJBICAgfCAgUk8gICB8CisJCQkJCQkJICAgICAgICstLS0tLS0tLS0tLS0rLS0tLSstLSstLS0tLS0tKy0tLS0tLS0rCisJCQkJCQkJICAgICAgICAwICAgICAgICAgIDEgICAgMSAgMSAgICAgICAyICAgICAgIDMKKwkJCQkJCQkgICAgICAgICAgICAgICAgICAgMCAgICA1ICA3ICAgICAgIDQgICAgICAgMQorCistPS09LT0gT1BDT0RFID0tPS09LQorCitPUENPREUgZmllbGQgc3BlY2lmaWVzIHRoZSBtb3N0IHNpZ25pZmljYW50IDExYml0IG9mIHRoZSBpbnN0cnVjdGlvbi4gU29tZSBmb3JtYXRzIGRvbid0IGhhdmUgMTFiaXRzIGZvciBvcGNvZGUgZmllbGQsIGFuZCBpbiB0aGlzCitjYXNlLCBiaXQgZmllbGQgb3RoZXIgdGhhbiBvcCBhcmUgZGVmaW5lZCBhcyAwcy4gRm9yIGV4YW1wbGUsIG9wY29kZSBvZiBmbWEgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgUlJSIGZvcm1hdCBpcyBkZWZpbmVkIGFzIDB4NzAwLAorc2luY2UgMHg3MDAgLT4gMTEnYjExMTAwMDAwMDAwLCB0aGlzIG1lYW5zIG9wY29kZSBpcyA0J2IxMTEwLCBhbmQgb3RoZXIgN2JpdHMgYXJlIGRlZmluZWQgYXMgNydiMDAwMDAwMC4KKworLT0tPS09IEFTTV9GT1JNQVQgPS09LT0tCisKK1JSUiBjYXRlZ29yeQkJCQkJCVJJNyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlBU01fUlJSCQltbmVtb25pYyBSQywgUkEsIFJCLCBSVAkJICAgICAgICBBU01fUkk0ICAgICAgICAgbW5lbW9uaWMgUlQsIFJBLCBJNAorCQkJCQkJCSAgICAgICAgQVNNX1JJNyAgICAgICAgIG1uZW1vbmljIFJULCBSQSwgSTcKKworUkk4IGNhdGVnb3J5CQkJCQkJUkkxMCBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlBU01fUlVJOAltbmVtb25pYyBSVCwgUkEsIFVJOAkJICAgICAgICBBU01fQUkxMCAgICAgICAgbW5lbW9uaWMgUkEsIEkxMCAgICAKKwkJCQkJCQkgICAgICAgIEFTTV9SSTEwICAgICAgICBtbmVtb25pYyBSVCwgUkEsIFIxMAorCQkJCQkJCSAgICAgICAgQVNNX1JJMTBJRFggICAgIG1uZW1vbmljIFJULCBJMTAoUkEpCisKK1JJMTYgY2F0ZWdvcnkJCQkJCQlSSTE4IGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJQVNNX0kxNlcJbW5lbW9uaWMgSTE2VwkJCSAgICAgICAgQVNNX1JJMTggICAgICAgIG1uZW1vbmljIFJULCBJMTgKKwlBU01fUkkxNgltbmVtb25pYyBSVCwgSTE2CisJQVNNX1JJMTZXCW1uZW1vbmljIFJULCBJMTZXCisKK1JSIGNhdGVnb3J5CQkJCQkJTEJUIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJQVNNX01GU1BSCW1uZW1vbmljIFJULCBTQQkJCSAgICAgICAgQVNNX0xCVCAgICAgICAgIG1uZW1vbmljIGJyaW5zdCwgYnJ0YXJnIAorCUFTTV9NVFNQUgltbmVtb25pYyBTQSwgUlQJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlBU01fTk9PUAltbmVtb25pYwkJCUxCVEkgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCUFTTV9SQQkJbW5lbW9uaWMgUkEJCQkgICAgICAgIEFTTV9MQlRJICAgICAgICBtbmVtb25pYyBicmluc3QsIFJBICAgICAKKwlBU01fUkFCCQltbmVtb25pYyBSQSwgUkIKKwlBU01fUkRDSAltbmVtb25pYyBSVCwgQ0EKKwlBU01fUlIJCW1uZW1vbmljIFJULCBSQSwgUkIKKwlBU01fUlQJCW1uZW1vbmljIFJUCisJQVNNX1JUQQkJbW5lbW9uaWMgUlQsIFJBCisJQVNNX1dSQ0gJbW5lbW9uaWMgQ0EsIFJUCisKK05vdGUgdGhhdCBSUlIgaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIG5hbWVzIGZvciBSQyBhbmQgUlQgcmV2ZXJzZWQgZnJvbQord2hhdCdzIGluIHRoZSBJU0EsIGluIG9yZGVyIHRvIHB1dCBSVCBpbiB0aGUgc2FtZSBwb3NpdGlvbiBpdCBhcHBlYXJzCitmb3Igb3RoZXIgZm9ybWF0cy4KKworLT0tPS09IERFUEVOREVOQ1kgPS09LT0tCisKK0RFUEVOREVOQ1kgZmlsZWQgY29uc2lzdHMgb2YgNSBkaWdpdHMuIFRoaXMgcmVwcmVzZW50cyB3aGljaCByZWdpc3RlciBpcyB1c2VkIGFzIHNvdXJjZSBhbmQgd2hpY2ggcmVnaXN0ZXIgaXMgdXNlZCBhcyB0YXJnZXQuCitUaGUgZmlyc3QobW9zdCBzaWduaWZpY2FudCkgZGlnaXQgaXMgYWx3YXlzIDAuIFRoZW4gaXQgaXMgZm9sbG93ZCBieSBSQywgUkIsIFJBIGFuZCBSVCBkaWdpdHMuCitJZiB0aGUgZGlnaXQgaXMgMCwgdGhpcyBtZWFucyB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBpcyBub3QgdXNlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCitJZiB0aGUgZGlnaXQgaXMgMSwgdGhpcyBtZWFucyB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBpcyB1c2VkIGFzIGEgc291cmNlIGluIHRoZSBpbnN0cnVjdGlvbi4KK0lmIHRoZSBkaWdpdCBpcyAyLCB0aGlzIG1lYW5zIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYSB0YXJnZXQgaW4gdGhlIGluc3RydWN0aW9uLgorSWYgdGhlIGRpZ2l0IGlzIDMsIHRoaXMgbWVhbnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgaXMgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgdGFyZ2V0IGluIHRoZSBpbnN0cnVjdGlvbi4KK0ZvciBleGFtcGxlLCBmbXMgaW5zdHJ1Y3Rpb24gaGFzIDAwMTEzIGFzIHRoZSBERVBFTkRFTkNZIGZpZWxkLiBUaGlzIG1lYW5zIFJDIGlzIG5vdCB1c2VkIGluIHRoaXMgb3BlcmF0aW9uLCBSQiBhbmQgUkEgYXJlCit1c2VkIGFzIHNvdXJjZXMgYW5kIFJUIGlzIHRoZSB0YXJnZXQuCisKKy09LT0tPSBQSVBFID0tPS09LQorCitUaGlzIGZpZWxkIHNob3dzIHdoaWNoIGV4ZWN1dGlvbiBwaXBlIGlzIHVzZWQgZm9yIHRoZSBpbnN0cnVjdGlvbgorCitwaXBlMCBleGVjdXRpb24gcGlwZWxpbmVzOgorCUZQNglTUCBmbG9hdGluZyBwaXBlbGluZQorCUZQNwlpbnRlZ2VyIG9wZXJhdGlvbnMgZXhlY3V0ZWQgaW4gU1AgZmxvYXRpbmcgcGlwZWxpbmUKKwlGUEQJRFAgZmxvYXRpbmcgcGlwZWxpbmUKKwlGWDIJRlhVIHBpcGVsaW5lCisJRlgzCVJvdGF0ZS9TaGlmdCBwaXBlbGluZQorCUZYQglCeXRlIHBpcGVsaW5lCisJTk9QCU5vIHBpcGVsaW5lCisKK3BpcGUxIGV4ZWN1dGlvbiBwaXBlbGluZXM6CisJQlIJQnJhbmNoIHBpcGVsaW5lCisJTE5PUAlObyBwaXBlbGluZQorCUxTCUxvYWQvU3RvcmUgcGlwZWxpbmUKKwlTSFVGCVNodWZmbGUgcGlwZWxpbmUKKwlTUFIJU1BSL0NIIHBpcGVsaW5lCisKKyovCisKKyNkZWZpbmUgX0EwKCkgezB9CisjZGVmaW5lIF9BMShhKSB7MSxhfQorI2RlZmluZSBfQTIoYSxiKSB7MixhLGJ9CisjZGVmaW5lIF9BMyhhLGIsYykgezMsYSxiLGN9CisjZGVmaW5lIF9BNChhLGIsYyxkKSB7NCxhLGIsYyxkfQorCisvKiAgICBUQUcJCUZPUk1BVAlPUENPREUJTU5FTU9OSUMJQVNNX0ZPUk1BVAlERVBFTkRFTkNZCVBJUEUJQ09NTUVOVAkJCQkqLworLyoJCQkJCQkJCQkwW1JDXVtSQl1bUkFdW1JUXQkJCQkJKi8KKy8qCQkJCQkJCQkJMTpzcmMsIDI6dGFyZ2V0CQkJCQkJKi8KKworQVBVT1AoTV9CUiwJCVJJMTYsCTB4MTkwLAkiYnIiLAkJX0ExKEFfUjE4KSwJMDAwMDAsCUJSKQkvKiBCUmVsICAgICAgICAgIElQPC1JUCtJMTYgKi8KK0FQVU9QKE1fQlJTTCwJCVJJMTYsCTB4MTk4LAkiYnJzbCIsCQlfQTIoQV9ULEFfUjE4KSwJMDAwMDIsCUJSKQkvKiBCUmVsU2V0TGluayAgIFJULElQPC1JUCxJUCtJMTYgKi8KK0FQVU9QKE1fQlJBLAkJUkkxNiwJMHgxODAsCSJicmEiLAkJX0ExKEFfUzE4KSwJMDAwMDAsCUJSKQkvKiBCUkFicyAgICAgICAgIElQPC1JMTYgKi8KK0FQVU9QKE1fQlJBU0wsCQlSSTE2LAkweDE4OCwJImJyYXNsIiwJX0EyKEFfVCxBX1MxOCksCTAwMDAyLAlCUikJLyogQlJBYnNTZXRMaW5rICBSVCxJUDwtSVAsSTE2ICovCitBUFVPUChNX0ZTTUJJLAkJUkkxNiwJMHgxOTQsCSJmc21iaSIsCV9BMihBX1QsQV9YMTYpLAkwMDAwMiwJU0hVRikJLyogRm9ybVNlbE1hc2slSSBSVDwtZnNtKEkxNikgKi8KK0FQVU9QKE1fTFFBLAkJUkkxNiwJMHgxODQsCSJscWEiLAkJX0EyKEFfVCxBX1MxOCksCTAwMDAyLAlMUykJLyogTG9hZFFBYnMgICAgICBSVDwtTVtJMTZdICovCitBUFVPUChNX0xRUiwJCVJJMTYsCTB4MTlDLAkibHFyIiwJCV9BMihBX1QsQV9SMTgpLAkwMDAwMiwJTFMpCS8qIExvYWRRUmVsICAgICAgUlQ8LU1bSVArSTE2XSAqLworQVBVT1AoTV9TVE9QLAkJUlIsCTB4MDAwLAkic3RvcCIsCQlfQTAoKSwJCTAwMDAwLAlCUikJLyogU1RPUCAgICAgICAgICBzdG9wICovCitBUFVPUChNX1NUT1AyLAkJUlIsCTB4MDAwLAkic3RvcCIsCQlfQTEoQV9VMTQpLAkwMDAwMCwJQlIpCS8qIFNUT1AgICAgICAgICAgc3RvcCAqLworQVBVT1AoTV9TVE9QRCwJCVJSLAkweDE0MCwJInN0b3BkIiwJX0EzKEFfVCxBX0EsQV9CKSwgICAgICAgICAwMDExMSwJQlIpCS8qIFNUT1BEICAgICAgICAgc3RvcCAod2l0aCByZWdpc3RlciBkZXBlbmRlbmNpZXMpICovCitBUFVPUChNX0xOT1AsCQlSUiwJMHgwMDEsCSJsbm9wIiwJCV9BMCgpLAkJMDAwMDAsCUxOT1ApCS8qIExOT1AgICAgICAgICAgbm9fb3BlcmF0aW9uICovCitBUFVPUChNX1NZTkMsCQlSUiwJMHgwMDIsCSJzeW5jIiwJCV9BMCgpLAkJMDAwMDAsCUJSKQkvKiBTWU5DICAgICAgICAgIGZsdXNoX3BpcGUgKi8KK0FQVU9QKE1fRFNZTkMsCQlSUiwJMHgwMDMsCSJkc3luYyIsCV9BMCgpLAkJMDAwMDAsCUJSKQkvKiBEU1lOQyAgICAgICAgIGZsdXNoX3N0b3JlX3F1ZXVlICovCitBUFVPUChNX01GU1BSLAkJUlIsCTB4MDBjLAkibWZzcHIiLAlfQTIoQV9ULEFfUyksCTAwMDAyLAlTUFIpCS8qIE1GU1BSICAgICAgICAgUlQ8LVNBICovCitBUFVPUChNX1JEQ0gsCQlSUiwJMHgwMGQsCSJyZGNoIiwJCV9BMihBX1QsQV9IKSwJMDAwMDIsCVNQUikJLyogUmVhRENIYW5uZWwgICBSVDwtQ0E6ZGF0YSAqLworQVBVT1AoTV9SQ0hDTlQsCQlSUiwJMHgwMGYsCSJyY2hjbnQiLAlfQTIoQV9ULEFfSCksCTAwMDAyLAlTUFIpCS8qIFJlYURDSGFuQ291TlQgUlQ8LUNBOmNvdW50ICovCitBUFVPUChNX0hCUkEsCQlMQlQsCTB4MDgwLAkiaGJyYSIsCQlfQTIoQV9TMTEsQV9TMTgpLAkwMDAwMCwJTFMpCS8qIEhCUkEgICAgICAgICAgQlRCW0I5XTwtTVtJMTZdICovCitBUFVPUChNX0hCUlIsCQlMQlQsCTB4MDkwLAkiaGJyciIsCQlfQTIoQV9TMTEsQV9SMTgpLAkwMDAwMCwJTFMpCS8qIEhCUlIgICAgICAgICAgQlRCW0I5XTwtTVtJUCtJMTZdICovCitBUFVPUChNX0JSWiwJCVJJMTYsCTB4MTAwLAkiYnJ6IiwJCV9BMihBX1QsQV9SMTgpLAkwMDAwMSwJQlIpCS8qIEJSWiAgICAgICAgICAgSVA8LUlQK0kxNl9pZihSVCkgKi8KK0FQVU9QKE1fQlJOWiwJCVJJMTYsCTB4MTA4LAkiYnJueiIsCQlfQTIoQV9ULEFfUjE4KSwJMDAwMDEsCUJSKQkvKiBCUk5aICAgICAgICAgIElQPC1JUCtJMTZfaWYoUlQpICovCitBUFVPUChNX0JSSFosCQlSSTE2LAkweDExMCwJImJyaHoiLAkJX0EyKEFfVCxBX1IxOCksCTAwMDAxLAlCUikJLyogQlJIWiAgICAgICAgICBJUDwtSVArSTE2X2lmKFJUKSAqLworQVBVT1AoTV9CUkhOWiwJCVJJMTYsCTB4MTE4LAkiYnJobnoiLAlfQTIoQV9ULEFfUjE4KSwJMDAwMDEsCUJSKQkvKiBCUkhOWiAgICAgICAgIElQPC1JUCtJMTZfaWYoUlQpICovCitBUFVPUChNX1NUUUEsCQlSSTE2LAkweDEwNCwJInN0cWEiLAkJX0EyKEFfVCxBX1MxOCksCTAwMDAxLAlMUykJLyogU1RvcmVRQWJzICAgICBNW0kxNl08LVJUICovCitBUFVPUChNX1NUUVIsCQlSSTE2LAkweDExQywJInN0cXIiLAkJX0EyKEFfVCxBX1IxOCksCTAwMDAxLAlMUykJLyogU1RvcmVRUmVsICAgICBNW0lQK0kxNl08LVJUICovCitBUFVPUChNX01UU1BSLAkJUlIsCTB4MTBjLAkibXRzcHIiLAlfQTIoQV9TLEFfVCksCTAwMDAxLAlTUFIpCS8qIE1UU1BSICAgICAgICAgU0E8LVJUICovCitBUFVPUChNX1dSQ0gsCQlSUiwJMHgxMGQsCSJ3cmNoIiwJCV9BMihBX0gsQV9UKSwJMDAwMDEsCVNQUikJLyogQ2hhbldSaXRlICAgICBDQTwtUlQgKi8KK0FQVU9QKE1fTFFELAkJUkkxMCwJMHgxYTAsCSJscWQiLAkJX0E0KEFfVCxBX1MxNCxBX1AsQV9BKSwJMDAwMTIsCUxTKQkvKiBMb2FkUURpc3AgICAgIFJUPC1NW1JhK0kxMF0gKi8KK0FQVU9QKE1fQkksCQlSUiwJMHgxYTgsCSJiaSIsCQlfQTEoQV9BKSwJCTAwMDEwLAlCUikJLyogQkkgICAgICAgICAgICBJUDwtUkEgKi8KK0FQVU9QKE1fQklTTCwJCVJSLAkweDFhOSwJImJpc2wiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJQlIpCS8qIEJJU0wgICAgICAgICAgUlQsSVA8LUlQLFJBICovCitBUFVPUChNX0lSRVQsICAJCVJSLAkweDFhYSwJImlyZXQiLAkgICAgICAgIF9BMShBX0EpLCAJMDAwMTAsCUJSKQkvKiBJUkVUICAgICAgICAgIElQPC1TUlIwICovCitBUFVPUChNX0lSRVQyLCAJCVJSLAkweDFhYSwJImlyZXQiLAkgICAgICAgIF9BMCgpLAkgCTAwMDEwLAlCUikJLyogSVJFVCAgICAgICAgICBJUDwtU1JSMCAqLworQVBVT1AoTV9CSVNMRUQsCQlSUiwJMHgxYWIsCSJiaXNsZWQiLAlfQTIoQV9ULEFfQSksCTAwMDEyLAlCUikJLyogQklTTEVEICAgICAgICBSVCxJUDwtSVAsUkFfaWYoZXh0KSAqLworQVBVT1AoTV9IQlIsCQlMQlRJLAkweDFhYywJImhiciIsCQlfQTIoQV9TMTFJLEFfQSksCTAwMDEwLAlMUykJLyogSEJSICAgICAgICAgICBCVEJbQjldPC1NW1JhXSAqLworQVBVT1AoTV9GUkVTVCwJCVJSLAkweDFiOCwJImZyZXN0IiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogRlJFU1QgICAgICAgICBSVDwtcmVjaXAoUkEpICovCitBUFVPUChNX0ZSU1FFU1QsCVJSLAkweDFiOSwJImZyc3Flc3QiLAlfQTIoQV9ULEFfQSksCTAwMDEyLAlTSFVGKQkvKiBGUlNRRVNUICAgICAgIFJUPC1yc3FydChSQSkgKi8KK0FQVU9QKE1fRlNNLAkJUlIsCTB4MWI0LAkiZnNtIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIEZvcm1TZWxNYXNrJSAgUlQ8LWV4cGFuZChSYSkgKi8KK0FQVU9QKE1fRlNNSCwJCVJSLAkweDFiNSwJImZzbWgiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogRm9ybVNlbE1hc2slICBSVDwtZXhwYW5kKFJhKSAqLworQVBVT1AoTV9GU01CLAkJUlIsCTB4MWI2LAkiZnNtYiIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlTSFVGKQkvKiBGb3JtU2VsTWFzayUgIFJUPC1leHBhbmQoUmEpICovCitBUFVPUChNX0dCLAkJUlIsCTB4MWIwLAkiZ2IiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogR2F0aGVyQml0cyUgICBSVDwtZ2F0aGVyKFJBKSAqLworQVBVT1AoTV9HQkgsCQlSUiwJMHgxYjEsCSJnYmgiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogR2F0aGVyQml0cyUgICBSVDwtZ2F0aGVyKFJBKSAqLworQVBVT1AoTV9HQkIsCQlSUiwJMHgxYjIsCSJnYmIiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogR2F0aGVyQml0cyUgICBSVDwtZ2F0aGVyKFJBKSAqLworQVBVT1AoTV9DQkQsCQlSSTcsCTB4MWY0LAkiY2JkIiwJCV9BNChBX1QsQV9VNyxBX1AsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zRCAgUlQ8LXN0YShSYStJNCxzaXopICovCitBUFVPUChNX0NIRCwJCVJJNywJMHgxZjUsCSJjaGQiLAkJX0E0KEFfVCxBX1U3LEFfUCxBX0EpLAkwMDAxMiwJU0hVRikJLyogZ2VuQ3RsJSVpbnNEICBSVDwtc3RhKFJhK0k0LHNpeikgKi8KK0FQVU9QKE1fQ1dELAkJUkk3LAkweDFmNiwJImN3ZCIsCQlfQTQoQV9ULEFfVTcsQV9QLEFfQSksCTAwMDEyLAlTSFVGKQkvKiBnZW5DdGwlJWluc0QgIFJUPC1zdGEoUmErSTQsc2l6KSAqLworQVBVT1AoTV9DREQsCQlSSTcsCTB4MWY3LAkiY2RkIiwJCV9BNChBX1QsQV9VNyxBX1AsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zRCAgUlQ8LXN0YShSYStJNCxzaXopICovCitBUFVPUChNX1JPVFFCSUksCVJJNywJMHgxZjgsCSJyb3RxYmlpIiwJX0EzKEFfVCxBX0EsQV9VMyksCTAwMDEyLAlTSFVGKQkvKiBST1RRQklJICAgICAgIFJUPC1SQTw8PEk3ICovCitBUFVPUChNX1JPVFFCWUksCVJJNywJMHgxZmMsCSJyb3RxYnlpIiwJX0EzKEFfVCxBX0EsQV9TN04pLAkwMDAxMiwJU0hVRikJLyogUk9UUUJZSSAgICAgICBSVDwtUkE8PDwoSTcqOCkgKi8KK0FQVU9QKE1fUk9UUU1CSUksCVJJNywJMHgxZjksCSJyb3RxbWJpaSIsCV9BMyhBX1QsQV9BLEFfUzMpLAkwMDAxMiwJU0hVRikJLyogUk9UUU1CSUkgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1JPVFFNQllJLAlSSTcsCTB4MWZkLAkicm90cW1ieWkiLAlfQTMoQV9ULEFfQSxBX1M2KSwJMDAwMTIsCVNIVUYpCS8qIFJPVFFNQllJICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9TSExRQklJLAlSSTcsCTB4MWZiLAkic2hscWJpaSIsCV9BMyhBX1QsQV9BLEFfVTMpLAkwMDAxMiwJU0hVRikJLyogU0hMUUJJSSAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1NITFFCWUksCVJJNywJMHgxZmYsCSJzaGxxYnlpIiwJX0EzKEFfVCxBX0EsQV9VNSksCTAwMDEyLAlTSFVGKQkvKiBTSExRQllJICAgICAgIFJUPC1SQTw8STcgKi8KK0FQVU9QKE1fU1RRRCwJCVJJMTAsCTB4MTIwLAkic3RxZCIsCQlfQTQoQV9ULEFfUzE0LEFfUCxBX0EpLAkwMDAxMSwJTFMpCS8qIFNUb3JlUURpc3AgICAgTVtSYStJMTBdPC1SVCAqLworQVBVT1AoTV9CSUhOWiwJCVJSLAkweDEyYiwJImJpaG56IiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSE5aICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1AoTV9CSUhaLAkJUlIsCTB4MTJhLAkiYmloeiIsCQlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklIWiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUChNX0JJTlosCQlSUiwJMHgxMjksCSJiaW56IiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSU5aICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QKE1fQklaLAkJUlIsCTB4MTI4LAkiYml6IiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSVogICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QKE1fQ0JYLAkJUlIsCTB4MWQ0LAkiY2J4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogZ2VuQ3RsJSVpbnNYICBSVDwtc3RhKFJhK1JiLHNpeikgKi8KK0FQVU9QKE1fQ0hYLAkJUlIsCTB4MWQ1LAkiY2h4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogZ2VuQ3RsJSVpbnNYICBSVDwtc3RhKFJhK1JiLHNpeikgKi8KK0FQVU9QKE1fQ1dYLAkJUlIsCTB4MWQ2LAkiY3d4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogZ2VuQ3RsJSVpbnNYICBSVDwtc3RhKFJhK1JiLHNpeikgKi8KK0FQVU9QKE1fQ0RYLAkJUlIsCTB4MWQ3LAkiY2R4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogZ2VuQ3RsJSVpbnNYICBSVDwtc3RhKFJhK1JiLHNpeikgKi8KK0FQVU9QKE1fTFFYLAkJUlIsCTB4MWM0LAkibHF4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJTFMpCS8qIExvYWRRaW5kZVggICAgUlQ8LU1bUmErUmJdICovCitBUFVPUChNX1JPVFFCSSwJCVJSLAkweDFkOCwJInJvdHFiaSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogUk9UUUJJICAgICAgICBSVDwtUkE8PDxSYiAqLworQVBVT1AoTV9ST1RRTUJJLAlSUiwJMHgxZDksCSJyb3RxbWJpIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlTSFVGKQkvKiBST1RRTUJJICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fU0hMUUJJLAkJUlIsCTB4MWRiLAkic2hscWJpIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlTSFVGKQkvKiBTSExRQkkgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fUk9UUUJZLAkJUlIsCTB4MWRjLAkicm90cWJ5IiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAkJU0hVRikJLyogUk9UUUJZICAgICAgICBSVDwtUkE8PDwoUmIqOCkgKi8KK0FQVU9QKE1fUk9UUU1CWSwJUlIsCTB4MWRkLAkicm90cW1ieSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJCVNIVUYpCS8qIFJPVFFNQlkgICAgICAgUlQ8LVJBPDxSYiAqLworQVBVT1AoTV9TSExRQlksCQlSUiwJMHgxZGYsCSJzaGxxYnkiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCVNIVUYpCS8qIFNITFFCWSAgICAgICAgUlQ8LVJBPDxSYiAqLworQVBVT1AoTV9ST1RRQllCSSwJUlIsCTB4MWNjLAkicm90cWJ5YmkiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCQlTSFVGKQkvKiBST1RRQllCSSAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fUk9UUU1CWUJJLAlSUiwJMHgxY2QsCSJyb3RxbWJ5YmkiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCQlTSFVGKQkvKiBST1RRTUJZQkkgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fU0hMUUJZQkksCVJSLAkweDFjZiwJInNobHFieWJpIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlTSFVGKQkvKiBTSExRQllCSSAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fU1RRWCwJCVJSLAkweDE0NCwJInN0cXgiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTExLAlMUykJLyogU1RvcmVRaW5kZVggICBNW1JhK1JiXTwtUlQgKi8KK0FQVU9QKE1fU0hVRkIsCQlSUlIsCTB4NTgwLAkic2h1ZmIiLAlfQTQoQV9DLEFfQSxBX0IsQV9UKSwJMDIxMTEsCVNIVUYpCS8qIFNIVUZmbGVCeXRlcyAgUkM8LWYoUkEsUkIsUlQpICovCitBUFVPUChNX0lMLAkJUkkxNiwJMHgyMDQsCSJpbCIsCQlfQTIoQV9ULEFfUzE2KSwJMDAwMDIsCUZYMikJLyogSW1tTG9hZCAgICAgICBSVDwtc3h0KEkxNikgKi8KK0FQVU9QKE1fSUxILAkJUkkxNiwJMHgyMGMsCSJpbGgiLAkJX0EyKEFfVCxBX1gxNiksCTAwMDAyLAlGWDIpCS8qIEltbUxvYWRIICAgICAgUlQ8LUkxNiAqLworQVBVT1AoTV9JTEhVLAkJUkkxNiwJMHgyMDgsCSJpbGh1IiwJCV9BMihBX1QsQV9YMTYpLAkwMDAwMiwJRlgyKQkvKiBJbW1Mb2FkSFVwcGVyIFJUPC1JMTY8PDE2ICovCitBUFVPUChNX0lMQSwJCVJJMTgsCTB4MjEwLAkiaWxhIiwJCV9BMihBX1QsQV9VMTgpLAkwMDAwMiwJRlgyKQkvKiBJbW1Mb2FkQWRkciAgIFJUPC16eHQoSTE4KSAqLworQVBVT1AoTV9OT1AsCQlSUiwJMHgyMDEsCSJub3AiLAkJX0ExKEFfVCksCQkwMDAwMCwJTk9QKQkvKiBYTk9QICAgICAgICAgIG5vX29wZXJhdGlvbiAqLworQVBVT1AoTV9OT1AyLAkJUlIsCTB4MjAxLAkibm9wIiwJCV9BMCgpLAkJMDAwMDAsCU5PUCkJLyogWE5PUCAgICAgICAgICBub19vcGVyYXRpb24gKi8KK0FQVU9QKE1fSU9ITCwJCVJJMTYsCTB4MzA0LAkiaW9obCIsCQlfQTIoQV9ULEFfWDE2KSwJMDAwMDMsCUZYMikJLyogQWRkSW1tZVh0ICAgICBSVDwtUlQrc3h0KEkxNikgKi8KK0FQVU9QKE1fQU5EQkksCQlSSTEwLAkweDBiMCwJImFuZGJpIiwJX0EzKEFfVCxBX0EsQV9TMTBCKSwJMDAwMTIsCUZYMikJLyogQU5EJUkgICAgICAgICBSVDwtUkEmSTEwICovCitBUFVPUChNX0FOREhJLAkJUkkxMCwJMHgwYTgsCSJhbmRoaSIsCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogQU5EJUkgICAgICAgICBSVDwtUkEmSTEwICovCitBUFVPUChNX0FOREksCQlSSTEwLAkweDBhMCwJImFuZGkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBBTkQlSSAgICAgICAgIFJUPC1SQSZJMTAgKi8KK0FQVU9QKE1fT1JCSSwJCVJJMTAsCTB4MDMwLAkib3JiaSIsCQlfQTMoQV9ULEFfQSxBX1MxMEIpLAkwMDAxMiwJRlgyKQkvKiBPUiVJICAgICAgICAgIFJUPC1SQXxJMTAgKi8KK0FQVU9QKE1fT1JISSwJCVJJMTAsCTB4MDI4LAkib3JoaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIE9SJUkgICAgICAgICAgUlQ8LVJBfEkxMCAqLworQVBVT1AoTV9PUkksCQlSSTEwLAkweDAyMCwJIm9yaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIE9SJUkgICAgICAgICAgUlQ8LVJBfEkxMCAqLworQVBVT1AoTV9PUlgsCQlSUiwJMHgxZjAsCSJvcngiLAkJX0EyKEFfVCxBX0EpLAkJMDAwMTIsCUJSKQkvKiBPUlggICAgICAgICAgIFJUPC1SQS53MHxSQS53MXxSQS53MnxSQS53MyAqLworQVBVT1AoTV9YT1JCSSwJCVJJMTAsCTB4MjMwLAkieG9yYmkiLAlfQTMoQV9ULEFfQSxBX1MxMEIpLAkwMDAxMiwJRlgyKQkvKiBYT1IlSSAgICAgICAgIFJUPC1SQV5JMTAgKi8KK0FQVU9QKE1fWE9SSEksCQlSSTEwLAkweDIyOCwJInhvcmhpIiwJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBYT1IlSSAgICAgICAgIFJUPC1SQV5JMTAgKi8KK0FQVU9QKE1fWE9SSSwJCVJJMTAsCTB4MjIwLAkieG9yaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIFhPUiVJICAgICAgICAgUlQ8LVJBXkkxMCAqLworQVBVT1AoTV9BSEksCQlSSTEwLAkweDBlOCwJImFoaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIEFkZCVJbW1lZCAgICAgUlQ8LVJBK0kxMCAqLworQVBVT1AoTV9BSSwJCVJJMTAsCTB4MGUwLAkiYWkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBBZGQlSW1tZWQgICAgIFJUPC1SQStJMTAgKi8KK0FQVU9QKE1fU0ZISSwJCVJJMTAsCTB4MDY4LAkic2ZoaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIFN1YkZyb20lSW1tICAgUlQ8LUkxMC1SQSAqLworQVBVT1AoTV9TRkksCQlSSTEwLAkweDA2MCwJInNmaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIFN1YkZyb20lSW1tICAgUlQ8LUkxMC1SQSAqLworQVBVT1AoTV9DR1RCSSwJCVJJMTAsCTB4MjcwLAkiY2d0YmkiLAlfQTMoQV9ULEFfQSxBX1MxMEIpLAkwMDAxMiwJRlgyKQkvKiBDR1QlSSAgICAgICAgIFJUPC0oUkE+STEwKSAqLworQVBVT1AoTV9DR1RISSwJCVJJMTAsCTB4MjY4LAkiY2d0aGkiLAlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIENHVCVJICAgICAgICAgUlQ8LShSQT5JMTApICovCitBUFVPUChNX0NHVEksCQlSSTEwLAkweDI2MCwJImNndGkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBDR1QlSSAgICAgICAgIFJUPC0oUkE+STEwKSAqLworQVBVT1AoTV9DTEdUQkksCQlSSTEwLAkweDJmMCwJImNsZ3RiaSIsCV9BMyhBX1QsQV9BLEFfUzEwQiksCTAwMDEyLAlGWDIpCS8qIENMR1QlSSAgICAgICAgUlQ8LShSQT5JMTApICovCitBUFVPUChNX0NMR1RISSwJCVJJMTAsCTB4MmU4LAkiY2xndGhpIiwJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBDTEdUJUkgICAgICAgIFJUPC0oUkE+STEwKSAqLworQVBVT1AoTV9DTEdUSSwJCVJJMTAsCTB4MmUwLAkiY2xndGkiLAlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIENMR1QlSSAgICAgICAgUlQ8LShSQT5JMTApICovCitBUFVPUChNX0NFUUJJLAkJUkkxMCwJMHgzZjAsCSJjZXFiaSIsCV9BMyhBX1QsQV9BLEFfUzEwQiksCTAwMDEyLAlGWDIpCS8qIENFUSVJICAgICAgICAgUlQ8LShSQT1JMTApICovCitBUFVPUChNX0NFUUhJLAkJUkkxMCwJMHgzZTgsCSJjZXFoaSIsCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogQ0VRJUkgICAgICAgICBSVDwtKFJBPUkxMCkgKi8KK0FQVU9QKE1fQ0VRSSwJCVJJMTAsCTB4M2UwLAkiY2VxaSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIENFUSVJICAgICAgICAgUlQ8LShSQT1JMTApICovCitBUFVPUChNX0hHVEksCQlSSTEwLAkweDI3OCwJImhndGkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMCwJRlgyKQkvKiBIYWx0R1RJICAgICAgIGhhbHRfaWYoUkE+STEwKSAqLworQVBVT1AoTV9IR1RJMiwJCVJJMTAsCTB4Mjc4LAkiaGd0aSIsCQlfQTIoQV9BLEFfUzEwKSwJMDAwMTAsCUZYMikJLyogSGFsdEdUSSAgICAgICBoYWx0X2lmKFJBPkkxMCkgKi8KK0FQVU9QKE1fSExHVEksCQlSSTEwLAkweDJmOCwJImhsZ3RpIiwJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMCwJRlgyKQkvKiBIYWx0TEdUSSAgICAgIGhhbHRfaWYoUkE+STEwKSAqLworQVBVT1AoTV9ITEdUSTIsCQlSSTEwLAkweDJmOCwJImhsZ3RpIiwJX0EyKEFfQSxBX1MxMCksCTAwMDEwLAlGWDIpCS8qIEhhbHRMR1RJICAgICAgaGFsdF9pZihSQT5JMTApICovCitBUFVPUChNX0hFUUksCQlSSTEwLAkweDNmOCwJImhlcWkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMCwJRlgyKQkvKiBIYWx0RVFJbW0gICAgIGhhbHRfaWYoUkE9STEwKSAqLworQVBVT1AoTV9IRVFJMiwJCVJJMTAsCTB4M2Y4LAkiaGVxaSIsCQlfQTIoQV9BLEFfUzEwKSwJMDAwMTAsCUZYMikJLyogSGFsdEVRSW1tICAgICBoYWx0X2lmKFJBPUkxMCkgKi8KK0FQVU9QKE1fTVBZSSwJCVJJMTAsCTB4M2EwLAkibXB5aSIsCQlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGUDcpCS8qIE1QWUkgICAgICAgICAgUlQ8LVJBKkkxMCAqLworQVBVT1AoTV9NUFlVSSwJCVJJMTAsCTB4M2E4LAkibXB5dWkiLAlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGUDcpCS8qIE1QWVVJICAgICAgICAgUlQ8LVJBKkkxMCAqLworQVBVT1AoTV9DRkxUUywJCVJJOCwJMHgzYjAsCSJjZmx0cyIsCV9BMyhBX1QsQV9BLEFfVTdBKSwJMDAwMTIsCUZQNykJLyogQ0ZMVFMgICAgICAgICBSVDwtaW50KFJBLEk4KSAqLworQVBVT1AoTV9DRkxUVSwJCVJJOCwJMHgzYjIsCSJjZmx0dSIsCV9BMyhBX1QsQV9BLEFfVTdBKSwJMDAwMTIsCUZQNykJLyogQ0ZMVFUgICAgICAgICBSVDwtaW50KFJBLEk4KSAqLworQVBVT1AoTV9DU0ZMVCwJCVJJOCwJMHgzYjQsCSJjc2ZsdCIsCV9BMyhBX1QsQV9BLEFfVTdCKSwJMDAwMTIsCUZQNykJLyogQ1NGTFQgICAgICAgICBSVDwtZmx0KFJBLEk4KSAqLworQVBVT1AoTV9DVUZMVCwJCVJJOCwJMHgzYjYsCSJjdWZsdCIsCV9BMyhBX1QsQV9BLEFfVTdCKSwJMDAwMTIsCUZQNykJLyogQ1VGTFQgICAgICAgICBSVDwtZmx0KFJBLEk4KSAqLworQVBVT1AoTV9GRVNELAkJUlIsCTB4M2I4LAkiZmVzZCIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlGUEQpCS8qIEZFU0QgICAgICAgICAgUlQ8LWRvdWJsZShSQSkgKi8KK0FQVU9QKE1fRlJEUywJCVJSLAkweDNiOSwJImZyZHMiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJRlBEKQkvKiBGUkRTICAgICAgICAgIFJUPC1zaW5nbGUoUkEpICovCitBUFVPUChNX0ZTQ1JSRCwJCVJSLAkweDM5OCwJImZzY3JyZCIsCV9BMShBX1QpLAkJMDAwMDIsCUZQRCkJLyogRlNDUlJEICAgICAgICBSVDwtRlBfc3RhdHVzICovCitBUFVPUChNX0ZTQ1JXUiwJCVJSLAkweDNiYSwJImZzY3J3ciIsCV9BMihBX1QsQV9BKSwJMDAwMTAsCUZQNykJLyogRlNDUldSICAgICAgICBGUF9zdGF0dXM8LVJBICovCitBUFVPUChNX0ZTQ1JXUjIsCVJSLAkweDNiYSwJImZzY3J3ciIsCV9BMShBX0EpLAkJMDAwMTAsCUZQNykJLyogRlNDUldSICAgICAgICBGUF9zdGF0dXM8LVJBICovCitBUFVPUChNX0NMWiwJCVJSLAkweDJhNSwJImNseiIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlGWDIpCS8qIENMWiAgICAgICAgICAgUlQ8LWNseihSQSkgKi8KK0FQVU9QKE1fQ05UQiwJCVJSLAkweDJiNCwJImNudGIiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJRlhCKQkvKiBDTlQgICAgICAgICAgIFJUPC1wb3AoUkEpICovCitBUFVPUChNX1hTQkgsCQlSUiwJMHgyYjYsCSJ4c2JoIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUZYMikJLyogZVh0U2lnbkJ0b0ggICBSVDwtc2lnbl9leHQoUkEpICovCitBUFVPUChNX1hTSFcsCQlSUiwJMHgyYWUsCSJ4c2h3IiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUZYMikJLyogZVh0U2lnbkh0b1cgICBSVDwtc2lnbl9leHQoUkEpICovCitBUFVPUChNX1hTV0QsCQlSUiwJMHgyYTYsCSJ4c3dkIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUZYMikJLyogZVh0U2lnbld0b0QgICBSVDwtc2lnbl9leHQoUkEpICovCitBUFVPUChNX1JPVEksCQlSSTcsCTB4MDc4LAkicm90aSIsCQlfQTMoQV9ULEFfQSxBX1M3TiksCTAwMDEyLAlGWDMpCS8qIFJPVCVJICAgICAgICAgUlQ8LVJBPDw8STcgKi8KK0FQVU9QKE1fUk9UTUksCQlSSTcsCTB4MDc5LAkicm90bWkiLAlfQTMoQV9ULEFfQSxBX1M3KSwJMDAwMTIsCUZYMykJLyogUk9UJU1JICAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1JPVE1BSSwJCVJJNywJMHgwN2EsCSJyb3RtYWkiLAlfQTMoQV9ULEFfQSxBX1M3KSwJMDAwMTIsCUZYMykJLyogUk9UTUElSSAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1NITEksCQlSSTcsCTB4MDdiLAkic2hsaSIsCQlfQTMoQV9ULEFfQSxBX1U2KSwJMDAwMTIsCUZYMykJLyogU0hMJUkgICAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1JPVEhJLAkJUkk3LAkweDA3YywJInJvdGhpIiwJX0EzKEFfVCxBX0EsQV9TN04pLAkwMDAxMiwJRlgzKQkvKiBST1QlSSAgICAgICAgIFJUPC1SQTw8PEk3ICovCitBUFVPUChNX1JPVEhNSSwJCVJJNywJMHgwN2QsCSJyb3RobWkiLAlfQTMoQV9ULEFfQSxBX1M2KSwJMDAwMTIsCUZYMykJLyogUk9UJU1JICAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1JPVE1BSEksCVJJNywJMHgwN2UsCSJyb3RtYWhpIiwJX0EzKEFfVCxBX0EsQV9TNiksCTAwMDEyLAlGWDMpCS8qIFJPVE1BJUkgICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9TSExISSwJCVJJNywJMHgwN2YsCSJzaGxoaSIsCV9BMyhBX1QsQV9BLEFfVTUpLAkwMDAxMiwJRlgzKQkvKiBTSEwlSSAgICAgICAgIFJUPC1SQTw8STcgKi8KK0FQVU9QKE1fQSwJCVJSLAkweDBjMCwJImEiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEFkZCUgICAgICAgICAgUlQ8LVJBK1JCICovCitBUFVPUChNX0FILAkJUlIsCTB4MGM4LAkiYWgiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEFkZCUgICAgICAgICAgUlQ8LVJBK1JCICovCitBUFVPUChNX1NGLAkJUlIsCTB4MDQwLAkic2YiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIFN1YkZyb20lICAgICAgUlQ8LVJCLVJBICovCitBUFVPUChNX1NGSCwJCVJSLAkweDA0OCwJInNmaCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogU3ViRnJvbSUgICAgICBSVDwtUkItUkEgKi8KK0FQVU9QKE1fQ0dULAkJUlIsCTB4MjQwLAkiY2d0IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDR1QlICAgICAgICAgIFJUPC0oUkE+UkIpICovCitBUFVPUChNX0NHVEIsCQlSUiwJMHgyNTAsCSJjZ3RiIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDR1QlICAgICAgICAgIFJUPC0oUkE+UkIpICovCitBUFVPUChNX0NHVEgsCQlSUiwJMHgyNDgsCSJjZ3RoIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDR1QlICAgICAgICAgIFJUPC0oUkE+UkIpICovCitBUFVPUChNX0NMR1QsCQlSUiwJMHgyYzAsCSJjbGd0IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDTEdUJSAgICAgICAgIFJUPC0oUkE+UkIpICovCitBUFVPUChNX0NMR1RCLAkJUlIsCTB4MmQwLAkiY2xndGIiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0xHVCUgICAgICAgICBSVDwtKFJBPlJCKSAqLworQVBVT1AoTV9DTEdUSCwJCVJSLAkweDJjOCwJImNsZ3RoIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIENMR1QlICAgICAgICAgUlQ8LShSQT5SQikgKi8KK0FQVU9QKE1fQ0VRLAkJUlIsCTB4M2MwLAkiY2VxIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDRVElICAgICAgICAgIFJUPC0oUkE9UkIpICovCitBUFVPUChNX0NFUUIsCQlSUiwJMHgzZDAsCSJjZXFiIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDRVElICAgICAgICAgIFJUPC0oUkE9UkIpICovCitBUFVPUChNX0NFUUgsCQlSUiwJMHgzYzgsCSJjZXFoIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDRVElICAgICAgICAgIFJUPC0oUkE9UkIpICovCitBUFVPUChNX0hHVCwJCVJSLAkweDI1OCwJImhndCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTAsCUZYMikJLyogSGFsdEdUICAgICAgICBoYWx0X2lmKFJBPlJCKSAqLworQVBVT1AoTV9IR1QyLAkJUlIsCTB4MjU4LAkiaGd0IiwJCV9BMihBX0EsQV9CKSwJMDAxMTAsCUZYMikJLyogSGFsdEdUICAgICAgICBoYWx0X2lmKFJBPlJCKSAqLworQVBVT1AoTV9ITEdULAkJUlIsCTB4MmQ4LAkiaGxndCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTAsCUZYMikJLyogSGFsdExHVCAgICAgICBoYWx0X2lmKFJBPlJCKSAqLworQVBVT1AoTV9ITEdUMiwJCVJSLAkweDJkOCwJImhsZ3QiLAkJX0EyKEFfQSxBX0IpLAkwMDExMCwJRlgyKQkvKiBIYWx0TEdUICAgICAgIGhhbHRfaWYoUkE+UkIpICovCitBUFVPUChNX0hFUSwJCVJSLAkweDNkOCwJImhlcSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTAsCUZYMikJLyogSGFsdEVRICAgICAgICBoYWx0X2lmKFJBPVJCKSAqLworQVBVT1AoTV9IRVEyLAkJUlIsCTB4M2Q4LAkiaGVxIiwJCV9BMihBX0EsQV9CKSwJMDAxMTAsCUZYMikJLyogSGFsdEVRICAgICAgICBoYWx0X2lmKFJBPVJCKSAqLworQVBVT1AoTV9GQ0VRLAkJUlIsCTB4M2MyLAkiZmNlcSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogRkNFUSAgICAgICAgICBSVDwtKFJBPVJCKSAqLworQVBVT1AoTV9GQ01FUSwJCVJSLAkweDNjYSwJImZjbWVxIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEZDTUVRICAgICAgICAgUlQ8LSh8UkF8PXxSQnwpICovCitBUFVPUChNX0ZDR1QsCQlSUiwJMHgyYzIsCSJmY2d0IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBGQ0dUICAgICAgICAgIFJUPC0oUkE8UkIpICovCitBUFVPUChNX0ZDTUdULAkJUlIsCTB4MmNhLAkiZmNtZ3QiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogRkNNR1QgICAgICAgICBSVDwtKHxSQXw8fFJCfCkgKi8KK0FQVU9QKE1fQU5ELAkJUlIsCTB4MGMxLAkiYW5kIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBBTkQgICAgICAgICAgIFJUPC1SQSZSQiAqLworQVBVT1AoTV9OQU5ELAkJUlIsCTB4MGM5LAkibmFuZCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogTkFORCAgICAgICAgICBSVDwtIShSQSZSQikgKi8KK0FQVU9QKE1fT1IsCQlSUiwJMHgwNDEsCSJvciIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogT1IgICAgICAgICAgICBSVDwtUkF8UkIgKi8KK0FQVU9QKE1fTk9SLAkJUlIsCTB4MDQ5LAkibm9yIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBOT1IgICAgICAgICAgIFJUPC0hKFJBJlJCKSAqLworQVBVT1AoTV9YT1IsCQlSUiwJMHgyNDEsCSJ4b3IiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIFhPUiAgICAgICAgICAgUlQ8LVJBXlJCICovCitBUFVPUChNX0VRViwJCVJSLAkweDI0OSwJImVxdiIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogRVF1aVZhbGVudCAgICBSVDwtIShSQV5SQikgKi8KK0FQVU9QKE1fQU5EQywJCVJSLAkweDJjMSwJImFuZGMiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEFORENvbXBsZW1lbnQgUlQ8LVJBJiFSQiAqLworQVBVT1AoTV9PUkMsCQlSUiwJMHgyYzksCSJvcmMiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIE9SQ29tcGxlbWVudCAgUlQ8LVJBfCFSQiAqLworQVBVT1AoTV9BQlNEQiwJCVJSLAkweDA1MywJImFic2RiIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWEIpCS8qIEFCU29sdXRlRGlmZiAgUlQ8LXxSQS1SQnwgKi8KK0FQVU9QKE1fQVZHQiwJCVJSLAkweDBkMywJImF2Z2IiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWEIpCS8qIEFWRyUgICAgICAgICAgUlQ8LShSQStSQisxKS8yICovCitBUFVPUChNX1NVTUIsCQlSUiwJMHgyNTMsCSJzdW1iIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlhCKQkvKiBTVU0lICAgICAgICAgIFJUPC1mKFJBLFJCKSAqLworQVBVT1AoTV9ERkEsCQlSUiwJMHgyY2MsCSJkZmEiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGUEQpCS8qIERGQWRkICAgICAgICAgUlQ8LVJBK1JCICovCitBUFVPUChNX0RGTSwJCVJSLAkweDJjZSwJImRmbSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQRCkJLyogREZNdWwgICAgICAgICBSVDwtUkEqUkIgKi8KK0FQVU9QKE1fREZTLAkJUlIsCTB4MmNkLAkiZGZzIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlBEKQkvKiBERlN1YiAgICAgICAgIFJUPC1SQS1SQiAqLworQVBVT1AoTV9GQSwJCVJSLAkweDJjNCwJImZhIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA2KQkvKiBGQWRkICAgICAgICAgIFJUPC1SQStSQiAqLworQVBVT1AoTV9GTSwJCVJSLAkweDJjNiwJImZtIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA2KQkvKiBGTXVsICAgICAgICAgIFJUPC1SQSpSQiAqLworQVBVT1AoTV9GUywJCVJSLAkweDJjNSwJImZzIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA2KQkvKiBGU3ViICAgICAgICAgIFJUPC1SQS1SQiAqLworQVBVT1AoTV9NUFksCQlSUiwJMHgzYzQsCSJtcHkiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGUDcpCS8qIE1QWSAgICAgICAgICAgUlQ8LVJBKlJCICovCitBUFVPUChNX01QWUgsCQlSUiwJMHgzYzUsCSJtcHloIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA3KQkvKiBNUFlIICAgICAgICAgIFJUPC0oUkFoKlJCKTw8MTYgKi8KK0FQVU9QKE1fTVBZSEgsCQlSUiwJMHgzYzYsCSJtcHloaCIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA3KQkvKiBNUFlISCAgICAgICAgIFJUPC1SQWgqUkJoICovCitBUFVPUChNX01QWUhIVSwJCVJSLAkweDNjZSwJIm1weWhodSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA3KQkvKiBNUFlISFUgICAgICAgIFJUPC1SQWgqUkJoICovCitBUFVPUChNX01QWVMsCQlSUiwJMHgzYzcsCSJtcHlzIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA3KQkvKiBNUFlTICAgICAgICAgIFJUPC0oUkEqUkIpPj4xNiAqLworQVBVT1AoTV9NUFlVLAkJUlIsCTB4M2NjLAkibXB5dSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNykJLyogTVBZVSAgICAgICAgICBSVDwtUkEqUkIgKi8KK0FQVU9QKE1fRkksCQlSUiwJMHgzZDQsCSJmaSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNykJLyogRkludGVycG9sYXRlICBSVDwtZihSQSxSQikgKi8KK0FQVU9QKE1fUk9ULAkJUlIsCTB4MDU4LAkicm90IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBST1QlICAgICAgICAgIFJUPC1SQTw8PFJCICovCitBUFVPUChNX1JPVE0sCQlSUiwJMHgwNTksCSJyb3RtIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBST1QlTSAgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fUk9UTUEsCQlSUiwJMHgwNWEsCSJyb3RtYSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBST1RNQSUgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fU0hMLAkJUlIsCTB4MDViLAkic2hsIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBTSEwlICAgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fUk9USCwJCVJSLAkweDA1YywJInJvdGgiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDMpCS8qIFJPVCUgICAgICAgICAgUlQ8LVJBPDw8UkIgKi8KK0FQVU9QKE1fUk9USE0sCQlSUiwJMHgwNWQsCSJyb3RobSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBST1QlTSAgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fUk9UTUFILAkJUlIsCTB4MDVlLAkicm90bWFoIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDMpCS8qIFJPVE1BJSAgICAgICAgUlQ8LVJBPDxSYiAqLworQVBVT1AoTV9TSExILAkJUlIsCTB4MDVmLAkic2hsaCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMykJLyogU0hMJSAgICAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX01QWUhIQSwJCVJSLAkweDM0NiwJIm1weWhoYSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMywJRlA3KQkvKiBNUFlISEEgICAgICAgIFJUPC1SQWgqUkJoK1JUICovCitBUFVPUChNX01QWUhIQVUsCVJSLAkweDM0ZSwJIm1weWhoYXUiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCUZQNykJLyogTVBZSEhBVSAgICAgICBSVDwtUkFoKlJCaCtSVCAqLworQVBVT1AoTV9ERk1BLAkJUlIsCTB4MzVjLAkiZGZtYSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCUZQRCkJLyogREZNQWRkICAgICAgICBSVDwtUlQrUkEqUkIgKi8KK0FQVU9QKE1fREZNUywJCVJSLAkweDM1ZCwJImRmbXMiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAlGUEQpCS8qIERGTVN1YiAgICAgICAgUlQ8LVJBKlJCLVJUICovCitBUFVPUChNX0RGTk1TLAkJUlIsCTB4MzVlLAkiZGZubXMiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCUZQRCkJLyogREZOTVN1YiAgICAgICBSVDwtUlQtUkEqUkIgKi8KK0FQVU9QKE1fREZOTUEsCQlSUiwJMHgzNWYsCSJkZm5tYSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMywJRlBEKQkvKiBERk5NQWRkICAgICAgIFJUPC0oLVJUKS1SQSpSQiAqLworQVBVT1AoTV9GTUEsCQlSUlIsCTB4NzAwLAkiZm1hIiwJCV9BNChBX0MsQV9BLEFfQixBX1QpLAkwMjExMSwJRlA2KQkvKiBGTUFkZCAgICAgICAgIFJDPC1SVCtSQSpSQiAqLworQVBVT1AoTV9GTVMsCQlSUlIsCTB4NzgwLAkiZm1zIiwJCV9BNChBX0MsQV9BLEFfQixBX1QpLAkwMjExMSwJRlA2KQkvKiBGTVN1YiAgICAgICAgIFJDPC1SQSpSQi1SVCAqLworQVBVT1AoTV9GTk1TLAkJUlJSLAkweDY4MCwJImZubXMiLAkJX0E0KEFfQyxBX0EsQV9CLEFfVCksCTAyMTExLAlGUDYpCS8qIEZOTVN1YiAgICAgICAgUkM8LVJULVJBKlJCICovCitBUFVPUChNX01QWUEsCQlSUlIsCTB4NjAwLAkibXB5YSIsCQlfQTQoQV9DLEFfQSxBX0IsQV9UKSwJMDIxMTEsCUZQNykJLyogTVBZQSAgICAgICAgICBSQzwtUkEqUkIrUlQgKi8KK0FQVU9QKE1fU0VMQiwJCVJSUiwJMHg0MDAsCSJzZWxiIiwJCV9BNChBX0MsQV9BLEFfQixBX1QpLAkwMjExMSwJRlgyKQkvKiBTRUxlY3RCaXRzICAgIFJDPC1SQSZSVHxSQiYhUlQgKi8KKy8qIGZvciBzeXN0ZW0gZnVuY3Rpb24gY2FsbCwgdGhpcyB1c2VzIG9wLWNvZGUgb2YgbXRzcHIgKi8KK0FQVU9QKE1fU1lTQ0FMTCwJUkk3LCAgICAweDEwYywJInN5c2NhbGwiLCAgICAgIF9BMyhBX1QsQV9BLEFfUzdOKSwJMDAwMDIsCVNQUikgICAgICAgIC8qIFN5c3RlbSBDYWxsICovCisvKgorcHNldWRvIGluc3RydWN0aW9uOgorc3lzdGVtIGNhbGwKK3ZhbHVlIG9mIEk5CW9wZXJhdGlvbgorMAloYWx0CisxCQlydFswXSA9IG9wZW4oTUVNW3JhWzBdXSwJcmFbMV0pCisyCQlydFswXSA9IGNsb3NlKHJhWzBdKQorMwkJcnRbMF0gPSByZWFkKHJhWzBdLAlNRU1bcmFbMV1dLAlyYVsyXSkKKzQJCXJ0WzBdID0gd3JpdGUocmFbMF0sCU1FTVtyYVsxXV0sCXJhWzJdKQorNQkJcHJpbnRmKE1FTVtyYVswXV0sCXJhWzFdLAlyYVsyXSwJcmFbM10pCis0MgkJcnRbMF0gPSBjbG9jaygpCis1MgkJcnRbMF0gPSBsc2VlayhyYTAsCXJhMSwJcmEyKQorCisqLworCisKKy8qIG5ldyBtdWx0aXByZWNpc2lvbiBhZGQvc3ViICovCitBUFVPUChNX0FERFgsCQlSUiwJMHgzNDAsCSJhZGR4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMywJCUZYMikJLyogQWRkX2VYdGVuZGVkICBSVDwtUkErUkIrUlQgKi8KK0FQVU9QKE1fQ0csCQlSUiwJMHgwYzIsCSJjZyIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCQlGWDIpCS8qIENhcnJ5R2VuZXJhdGUgUlQ8LWNvdXQoUkErUkIpICovCitBUFVPUChNX0NHWCwJCVJSLAkweDM0MiwJImNneCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCQlGWDIpCS8qIENhcnJ5R2VuX2VYdGQgUlQ8LWNvdXQoUkErUkIrUlQpICovCitBUFVPUChNX1NGWCwJCVJSLAkweDM0MSwJInNmeCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCQlGWDIpCS8qIEFkZF9lWHRlbmRlZCAgUlQ8LVJBK1JCK1JUICovCitBUFVPUChNX0JHLAkJUlIsCTB4MDQyLAkiYmciLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAkJRlgyKQkvKiBDYXJyeUdlbmVyYXRlIFJUPC1jb3V0KFJBK1JCKSAqLworQVBVT1AoTV9CR1gsCQlSUiwJMHgzNDMsCSJiZ3giLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAkJRlgyKQkvKiBDYXJyeUdlbl9lWHRkIFJUPC1jb3V0KFJBK1JCK1JUKSAqLworCisvKgorCitUaGUgZm9sbG93aW5nIG9wcyBhcmUgYSBzdWJzZXQgb2YgYWJvdmUgZXhjZXB0IHdpdGggZmVhdHVyZSBiaXRzIHNldC4KK0ZlYXR1cmUgYml0cyBhcmUgYml0cyAxMS0xNyBvZiB0aGUgaW5zdHJ1Y3Rpb246CisKKyAgMTEgLSBDICYgUCBmZWF0dXJlIGJpdAorICAxMiAtIGRpc2FibGUgaW50ZXJydXB0cworICAxMyAtIGVuYWJsZSBpbnRlcnJ1cHRzCisKKyovCitBUFVPUEZCKE1fQklELAkJUlIsCTB4MWE4LAkweDIwLAkiYmlkIiwJCV9BMShBX0EpLAkJMDAwMTAsCUJSKQkvKiBCSSAgICAgICAgICAgIElQPC1SQSAqLworQVBVT1BGQihNX0JJRSwJCVJSLAkweDFhOCwJMHgxMCwJImJpZSIsCQlfQTEoQV9BKSwJCTAwMDEwLAlCUikJLyogQkkgICAgICAgICAgICBJUDwtUkEgKi8KK0FQVU9QRkIoTV9CSVNMRCwJUlIsCTB4MWE5LAkweDIwLAkiYmlzbGQiLAlfQTIoQV9ULEFfQSksCTAwMDEyLAlCUikJLyogQklTTCAgICAgICAgICBSVCxJUDwtSVAsUkEgKi8KK0FQVU9QRkIoTV9CSVNMRSwJUlIsCTB4MWE5LAkweDEwLAkiYmlzbGUiLAlfQTIoQV9ULEFfQSksCTAwMDEyLAlCUikJLyogQklTTCAgICAgICAgICBSVCxJUDwtSVAsUkEgKi8KK0FQVU9QRkIoTV9JUkVURCwgIAlSUiwJMHgxYWEsCTB4MjAsCSJpcmV0ZCIsCV9BMShBX0EpLCAJMDAwMTAsCUJSKQkvKiBJUkVUICAgICAgICAgIElQPC1TUlIwICovCitBUFVPUEZCKE1fSVJFVEQyLCAgCVJSLAkweDFhYSwJMHgyMCwJImlyZXRkIiwJX0EwKCksCSAJMDAwMTAsCUJSKQkvKiBJUkVUICAgICAgICAgIElQPC1TUlIwICovCitBUFVPUEZCKE1fSVJFVEUsICAJUlIsCTB4MWFhLAkweDEwLAkiaXJldGUiLAlfQTEoQV9BKSwgCTAwMDEwLAlCUikJLyogSVJFVCAgICAgICAgICBJUDwtU1JSMCAqLworQVBVT1BGQihNX0lSRVRFMiwgIAlSUiwJMHgxYWEsCTB4MTAsCSJpcmV0ZSIsCV9BMCgpLAkgCTAwMDEwLAlCUikJLyogSVJFVCAgICAgICAgICBJUDwtU1JSMCAqLworQVBVT1BGQihNX0JJU0xFREQsCVJSLAkweDFhYiwJMHgyMCwJImJpc2xlZGQiLAlfQTIoQV9ULEFfQSksCTAwMDEyLAlCUikJLyogQklTTEVEICAgICAgICBSVCxJUDwtSVAsUkFfaWYoZXh0KSAqLworQVBVT1BGQihNX0JJU0xFREUsCVJSLAkweDFhYiwJMHgxMCwJImJpc2xlZGUiLAlfQTIoQV9ULEFfQSksCTAwMDEyLAlCUikJLyogQklTTEVEICAgICAgICBSVCxJUDwtSVAsUkFfaWYoZXh0KSAqLworQVBVT1BGQihNX0JJSE5aRCwJUlIsCTB4MTJiLAkweDIwLAkiYmlobnpkIiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSE5aICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJSE5aRSwJUlIsCTB4MTJiLAkweDEwLAkiYmlobnplIiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSE5aICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJSFpELAlSUiwJMHgxMmEsCTB4MjAsCSJiaWh6ZCIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhaICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUhaRSwJUlIsCTB4MTJhLAkweDEwLAkiYmloemUiLAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklIWiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklOWkQsCVJSLAkweDEyOSwJMHgyMCwJImJpbnpkIiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJTlogICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJTlpFLAlSUiwJMHgxMjksCTB4MTAsCSJiaW56ZSIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSU5aICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSVpELAkJUlIsCTB4MTI4LAkweDIwLAkiYml6ZCIsCQlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklaICAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklaRSwJCVJSLAkweDEyOCwJMHgxMCwJImJpemUiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJWiAgICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX1NZTkNDLAlSUiwJMHgwMDIsCTB4NDAsCSJzeW5jYyIsCV9BMCgpLAkJMDAwMDAsCUJSKQkvKiBTWU5DQyAgICAgICAgICBmbHVzaF9waXBlICovCitBUFVPUEZCKE1fSEJSUCwJCUxCVEksCTB4MWFjLAkweDQwLAkiaGJycCIsCQlfQTAoKSwJICAgICAgICAwMDAxMCwJTFMpCS8qIEhCUiAgICAgICAgICAgQlRCW0I5XTwtTVtSYV0gKi8KKworLyogU3lub255bXMgcmVxdWlyZWQgYnkgdGhlIEFTIG1hbnVhbC4gKi8KK0FQVU9QKE1fTFIsCQlSSTEwLAkweDAyMCwJImxyIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUZYMikJLyogT1IlSSAgICAgICAgICBSVDwtUkF8STEwICovCitBUFVPUChNX0JJSFQsCQlSUiwJMHgxMmIsCSJiaWh0IiwgCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhOWiAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QKE1fQklIRiwJCVJSLAkweDEyYSwJImJpaGYiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSFogICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1AoTV9CSVQsCQlSUiwJMHgxMjksCSJiaXQiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJTlogICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1AoTV9CSUYsCQlSUiwJMHgxMjgsCSJiaWYiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJWiAgICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJSFRELAlSUiwJMHgxMmIsCTB4MjAsCSJiaWh0ZCIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhORiAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUhURSwJUlIsCTB4MTJiLAkweDEwLAkiYmlodGUiLAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklITkYgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklIRkQsCVJSLAkweDEyYSwJMHgyMCwJImJpaGZkIiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSFogICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJSEZFLAlSUiwJMHgxMmEsCTB4MTAsCSJiaWhmZSIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhaICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSVRELCAJUlIsCTB4MTI5LAkweDIwLAkiYml0ZCIsIAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklORiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklURSwgCVJSLAkweDEyOSwJMHgxMCwJImJpdGUiLCAJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJTkYgICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJRkQsCQlSUiwJMHgxMjgsCTB4MjAsCSJiaWZkIiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSVogICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUZFLAkJUlIsCTB4MTI4LAkweDEwLAkiYmlmZSIsCQlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklaICAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCisKKyN1bmRlZiBfQTAKKyN1bmRlZiBfQTEKKyN1bmRlZiBfQTIKKyN1bmRlZiBfQTMKKyN1bmRlZiBfQTQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1vcGMuYyBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZmZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vc3B1LW9wYy5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIFNQVSBvcGNvZGUgbGlzdAorCisgICBDb3B5cmlnaHQgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKyNpbmNsdWRlICJzcHUuaCIKKworLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBTcHUgb3Bjb2RlIHRhYmxlICovCisMCisKKy8qCisgICBFeGFtcGxlIGNvbnRlbnRzIG9mIHNwdS1pbnNuLmgKKyAgICAgIGlkX3RhZwltb2RlCW1vZGUJdHlwZQlvcGNvZGUJbW5lbW9uaWMJYXNtdHlwZQkgICAgZGVwZW5kZW5jeQkJRlBVCUwvUz8JYnJhbmNoPwlpbnN0cnVjdGlvbiAgIAorICAgICAgICAgICAgICAgIFFVQUQJV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsUkMsUkIsUkEsUlQpICAgIGxhdGVuY3kgIAkJCSAgICAgICAgICAgICAgCQkKKyAgIEFQVU9QKE1fTFFELAkxLAkwLAlSSTksCTB4MWY4LAkibHFkIiwJCUFTTV9SSTlJRFgsCTAwMDEyLAkJRlhVLAkxLAkwKQlMb2FkIFF1YWR3b3JkIGQtZm9ybSAKKyAqLworCitjb25zdCBzdHJ1Y3Qgc3B1X29wY29kZSBzcHVfb3Bjb2Rlc1tdID0geworI2RlZmluZSBBUFVPUChUQUcsTUFDRk9STUFULE9QQ09ERSxNTkVNT05JQyxBU01GT1JNQVQsREVQLFBJUEUpIFwKKwl7IE1BQ0ZPUk1BVCwgT1BDT0RFLCBNTkVNT05JQywgQVNNRk9STUFUIH0sCisjZGVmaW5lIEFQVU9QRkIoVEFHLE1BQ0ZPUk1BVCxPUENPREUsRkIsTU5FTU9OSUMsQVNNRk9STUFULERFUCxQSVBFKSBcCisJeyBNQUNGT1JNQVQsIE9QQ09ERSwgTU5FTU9OSUMsIEFTTUZPUk1BVCB9LAorI2luY2x1ZGUgInNwdS1pbnNucy5oIgorI3VuZGVmIEFQVU9QCisjdW5kZWYgQVBVT1BGQgorfTsKKworY29uc3QgaW50IHNwdV9udW1fb3Bjb2RlcyA9CisgIHNpemVvZiAoc3B1X29wY29kZXMpIC8gc2l6ZW9mIChzcHVfb3Bjb2Rlc1swXSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zcHUuaCBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NjFmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUuaApAQCAtMCwwICsxLDEyNiBAQAorLyogU1BVIEVMRiBzdXBwb3J0IGZvciBCRkQuCisKKyAgIENvcHlyaWdodCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKworCisvKiBUaGVzZSB0d28gZW51bXMgYXJlIGZyb20gcmVsX2FwdS9jb21tb24vc3B1X2FzbV9mb3JtYXQuaCAqLworLyogZGVmaW5pdGlvbiBvZiBpbnN0cnVjdGlvbiBmb3JtYXQgKi8KK3R5cGVkZWYgZW51bSB7CisgIFJSUiwKKyAgUkkxOCwKKyAgUkkxNiwKKyAgUkkxMCwKKyAgUkk4LAorICBSSTcsCisgIFJSLAorICBMQlQsCisgIExCVEksCisgIElEQVRBLAorICBVTktOT1dOX0lGT1JNQVQKK30gc3B1X2lmb3JtYXQ7CisKKy8qIFRoZXNlIHZhbHVlcyBkZXNjcmliZSBhc3NlbWJseSBpbnN0cnVjdGlvbiBhcmd1bWVudHMuICBUaGV5IGluZGljYXRlCisgKiBob3cgdG8gZW5jb2RlLCByYW5nZSBjaGVja2luZyBhbmQgd2hpY2ggcmVsb2NhdGlvbiB0byB1c2UuICovCit0eXBlZGVmIGVudW0geworICBBX1QsICAvKiByZWdpc3RlciBhdCBwb3MgMCAqLworICBBX0EsICAvKiByZWdpc3RlciBhdCBwb3MgNyAqLworICBBX0IsICAvKiByZWdpc3RlciBhdCBwb3MgMTQgKi8KKyAgQV9DLCAgLyogcmVnaXN0ZXIgYXQgcG9zIDIxICovCisgIEFfUywgIC8qIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlciBhdCBwb3MgNyAqLworICBBX0gsICAvKiBjaGFubmVsIHJlZ2lzdGVyIGF0IHBvcyA3ICovCisgIEFfUCwgIC8qIHBhcmVudGhlc2lzLCB0aGlzIGhhcyB0byBzZXBhcmF0ZSByZWdzIGZyb20gaW1tZWRpYXRlcyAqLworICBBX1MzLAorICBBX1M2LAorICBBX1M3TiwKKyAgQV9TNywKKyAgQV9VN0EsCisgIEFfVTdCLAorICBBX1MxMEIsCisgIEFfUzEwLAorICBBX1MxMSwKKyAgQV9TMTFJLAorICBBX1MxNCwKKyAgQV9TMTYsCisgIEFfUzE4LAorICBBX1IxOCwKKyAgQV9VMywKKyAgQV9VNSwKKyAgQV9VNiwKKyAgQV9VNywKKyAgQV9VMTQsCisgIEFfWDE2LAorICBBX1UxOCwKKyAgQV9NQVgKK30gc3B1X2Fmb3JtYXQ7CisKK2VudW0gc3B1X2luc25zIHsKKyNkZWZpbmUgQVBVT1AoVEFHLE1BQ0ZPUk1BVCxPUENPREUsTU5FTU9OSUMsQVNNRk9STUFULERFUCxQSVBFKSBcCisJVEFHLAorI2RlZmluZSBBUFVPUEZCKFRBRyxNQUNGT1JNQVQsT1BDT0RFLEZCLE1ORU1PTklDLEFTTUZPUk1BVCxERVAsUElQRSkgXAorCVRBRywKKyNpbmNsdWRlICJzcHUtaW5zbnMuaCIKKyN1bmRlZiBBUFVPUAorI3VuZGVmIEFQVU9QRkIKKyAgICAgICAgTV9TUFVfTUFYCit9OworCitzdHJ1Y3Qgc3B1X29wY29kZQoreworICAgc3B1X2lmb3JtYXQgaW5zbl90eXBlOworICAgdW5zaWduZWQgaW50IG9wY29kZTsKKyAgIGNoYXIgKm1uZW1vbmljOworICAgaW50IGFyZ1s1XTsKK307CisKKyNkZWZpbmUgU0lHTkVEX0VYVFJBQ1QoaW5zbixzaXplLHBvcykgKCgoaW50KSgoaW5zbikgPDwgKDMyLXNpemUtcG9zKSkpID4+ICgzMi1zaXplKSkKKyNkZWZpbmUgVU5TSUdORURfRVhUUkFDVChpbnNuLHNpemUscG9zKSAoKChpbnNuKSA+PiBwb3MpICYgKCgxIDw8IHNpemUpLTEpKQorCisjZGVmaW5lIERFQ09ERV9JTlNOX1JUKGluc24pIChpbnNuICYgMHg3ZikKKyNkZWZpbmUgREVDT0RFX0lOU05fUkEoaW5zbikgKChpbnNuID4+IDcpICYgMHg3ZikKKyNkZWZpbmUgREVDT0RFX0lOU05fUkIoaW5zbikgKChpbnNuID4+IDE0KSAmIDB4N2YpCisjZGVmaW5lIERFQ09ERV9JTlNOX1JDKGluc24pICgoaW5zbiA+PiAyMSkgJiAweDdmKQorCisjZGVmaW5lIERFQ09ERV9JTlNOX0kxMChpbnNuKSBTSUdORURfRVhUUkFDVChpbnNuLDEwLDE0KQorI2RlZmluZSBERUNPREVfSU5TTl9VMTAoaW5zbikgVU5TSUdORURfRVhUUkFDVChpbnNuLDEwLDE0KQorCisvKiBGb3IgYnJhbmNoaW5nLCBpbW1lZGlhdGUgbG9hZHMsIGhiciBhbmQgIGxxYS9zdHFhLiAqLworI2RlZmluZSBERUNPREVfSU5TTl9JMTYoaW5zbikgU0lHTkVEX0VYVFJBQ1QoaW5zbiwxNiw3KQorI2RlZmluZSBERUNPREVfSU5TTl9VMTYoaW5zbikgVU5TSUdORURfRVhUUkFDVChpbnNuLDE2LDcpCisKKy8qIGZvciBzdG9wICovCisjZGVmaW5lIERFQ09ERV9JTlNOX1UxNChpbnNuKSBVTlNJR05FRF9FWFRSQUNUKGluc24sMTQsMCkKKworLyogRm9yIGlsYSAqLworI2RlZmluZSBERUNPREVfSU5TTl9JMTgoaW5zbikgU0lHTkVEX0VYVFJBQ1QoaW5zbiwxOCw3KQorI2RlZmluZSBERUNPREVfSU5TTl9VMTgoaW5zbikgVU5TSUdORURfRVhUUkFDVChpbnNuLDE4LDcpCisKKy8qIEZvciByb3RhdGUgYW5kIHNoaWZ0IGFuZCBnZW5lcmF0ZSBjb250cm9sIG1hc2sgKi8KKyNkZWZpbmUgREVDT0RFX0lOU05fSTcoaW5zbikgU0lHTkVEX0VYVFJBQ1QoaW5zbiw3LDE0KQorI2RlZmluZSBERUNPREVfSU5TTl9VNyhpbnNuKSBVTlNJR05FRF9FWFRSQUNUKGluc24sNywxNCkKKworLyogRm9yIGZsb2F0IDwtPiBpbnQgY29udmVyc2lvbiAqLworI2RlZmluZSBERUNPREVfSU5TTl9JOChpbnNuKSAgU0lHTkVEX0VYVFJBQ1QoaW5zbiw4LDE0KQorI2RlZmluZSBERUNPREVfSU5TTl9VOChpbnNuKSBVTlNJR05FRF9FWFRSQUNUKGluc24sOCwxNCkKKworLyogRm9yIGhiciAgKi8KKyNkZWZpbmUgREVDT0RFX0lOU05fSTlhKGluc24pICgoU0lHTkVEX0VYVFJBQ1QoaW5zbiwyLDIzKSA8PCA3KSB8IFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiw3LDApKQorI2RlZmluZSBERUNPREVfSU5TTl9JOWIoaW5zbikgKChTSUdORURfRVhUUkFDVChpbnNuLDIsMTQpIDw8IDcpIHwgVU5TSUdORURfRVhUUkFDVChpbnNuLDcsMCkpCisjZGVmaW5lIERFQ09ERV9JTlNOX1U5YShpbnNuKSAoKFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiwyLDIzKSA8PCA3KSB8IFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiw3LDApKQorI2RlZmluZSBERUNPREVfSU5TTl9VOWIoaW5zbikgKChVTlNJR05FRF9FWFRSQUNUKGluc24sMiwxNCkgPDwgNykgfCBVTlNJR05FRF9FWFRSQUNUKGluc24sNywwKSkKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCmluZGV4IGY1NmZmZWYuLmEzNGVkNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKQEAgLTM3LDEzICszNywxOCBAQAogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaXRfbHBfcmVnX3NhdmUuaD4KICNlbmRpZgogCiAjaW5jbHVkZSAibm9uc3RkaW8uaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCiAKICNkZWZpbmUgc2NhbmhleAl4bW9uX3NjYW5oZXgKICNkZWZpbmUgc2tpcGJsCXhtb25fc2tpcGJsCkBAIC0xMDcsNyArMTEyLDYgQEAKIHN0YXRpYyB2b2lkIGR1bXAodm9pZCk7CiBzdGF0aWMgdm9pZCBwcmR1bXAodW5zaWduZWQgbG9uZywgbG9uZyk7CiBzdGF0aWMgaW50IHBwY19pbnN0X2R1bXAodW5zaWduZWQgbG9uZywgbG9uZywgaW50KTsKLXZvaWQgcHJpbnRfYWRkcmVzcyh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIGJhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqKTsKIHN0YXRpYyB2b2lkIGV4Y3ByaW50KHN0cnVjdCBwdF9yZWdzICopOwogc3RhdGljIHZvaWQgcHJyZWdzKHN0cnVjdCBwdF9yZWdzICopOwpAQCAtMTQ3LDkgKzE1MSw5IEBACiAJCQkgICAgICBjb25zdCBjaGFyICphZnRlcik7CiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0dmVjbmFtZSh1bnNpZ25lZCBsb25nIHZlYyk7CiAKLWludCB4bW9uX25vX2F1dG9fYmFja3RyYWNlOworc3RhdGljIGludCBkb19zcHVfY21kKHZvaWQpOwogCi1leHRlcm4gaW50IHByaW50X2luc25fcG93ZXJwYyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOworaW50IHhtb25fbm9fYXV0b19iYWNrdHJhY2U7CiAKIGV4dGVybiB2b2lkIHhtb25fZW50ZXIodm9pZCk7CiBleHRlcm4gdm9pZCB4bW9uX2xlYXZlKHZvaWQpOwpAQCAtMjA5LDggKzIxMywxNSBAQAogICBtaQlzaG93IGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeSBhbGxvY2F0aW9uXG5cCiAgIHAgCWNhbGwgYSBwcm9jZWR1cmVcblwKICAgcglwcmludCByZWdpc3RlcnNcblwKLSAgcwlzaW5nbGUgc3RlcFxuXAotICBTCXByaW50IHNwZWNpYWwgcmVnaXN0ZXJzXG5cCisgIHMJc2luZ2xlIHN0ZXBcbiIKKyNpZmRlZiBDT05GSUdfU1BVX0JBU0UKKyIgIHNzCXN0b3AgZXhlY3V0aW9uIG9uIGFsbCBzcHVzXG5cCisgIHNyCXJlc3RvcmUgZXhlY3V0aW9uIG9uIHN0b3BwZWQgc3B1c1xuXAorICBzZiAgIwlkdW1wIHNwdSBmaWVsZHMgZm9yIHNwdSAjIChpbiBoZXgpXG5cCisgIHNkICAjCWR1bXAgc3B1IGxvY2FsIHN0b3JlIGZvciBzcHUgIyAoaW4gaGV4KVwKKyAgc2RpICMJZGlzYXNzZW1ibGUgc3B1IGxvY2FsIHN0b3JlIGZvciBzcHUgIyAoaW4gaGV4KVxuIgorI2VuZGlmCisiICBTCXByaW50IHNwZWNpYWwgcmVnaXN0ZXJzXG5cCiAgIHQJcHJpbnQgYmFja3RyYWNlXG5cCiAgIHgJZXhpdCBtb25pdG9yIGFuZCByZWNvdmVyXG5cCiAgIFgJZXhpdCBtb25pdG9yIGFuZCBkb250IHJlY292ZXJcbiIKQEAgLTUxOCw2ICs1MjksNyBAQAogCQl4bW9uX3NhdmVfcmVncygmcmVncyk7CiAJCWV4Y3AgPSAmcmVnczsKIAl9CisKIAlyZXR1cm4geG1vbl9jb3JlKGV4Y3AsIDApOwogfQogRVhQT1JUX1NZTUJPTCh4bW9uKTsKQEAgLTgwOSw2ICs4MjEsOCBAQAogCQkJY2FjaGVmbHVzaCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgJ3MnOgorCQkJaWYgKGRvX3NwdV9jbWQoKSA9PSAwKQorCQkJCWJyZWFrOwogCQkJaWYgKGRvX3N0ZXAoZXhjcCkpCiAJCQkJcmV0dXJuIGNtZDsKIAkJCWJyZWFrOwpAQCAtMTU1NSwxMSArMTU2OSw2IEBACiB7CiAJaW50IGNtZDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKnB0clBhY2EgPSBOVUxMOwotCXN0cnVjdCBscHBhY2EgKnB0ckxwUGFjYSA9IE5VTEw7Ci0Jc3RydWN0IEl0THBSZWdTYXZlICpwdHJMcFJlZ1NhdmUgPSBOVUxMOwotI2VuZGlmCiAKIAljbWQgPSBza2lwYmwoKTsKIAlpZiAoY21kID09ICdcbicpIHsKQEAgLTE1NzYsMjYgKzE1ODUsMzIgQEAKIAkJcHJpbnRmKCJzcCAgID0gIlJFRyIgIHNwcmczPSAiUkVHIlxuIiwgc3AsIG1mc3ByKFNQUk5fU1BSRzMpKTsKIAkJcHJpbnRmKCJ0b2MgID0gIlJFRyIgIGRhciAgPSAiUkVHIlxuIiwgdG9jLCBtZnNwcihTUFJOX0RBUikpOwogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCQkvLyBEdW1wIG91dCByZWxldmFudCBQYWNhIGRhdGEgYXJlYXMuCi0JCXByaW50ZigiUGFjYTogXG4iKTsKLQkJcHRyUGFjYSA9IGdldF9wYWNhKCk7Ci0gICAgCi0JCXByaW50ZigiICBMb2NhbCBQcm9jZXNzb3IgQ29udHJvbCBBcmVhIChMcFBhY2EpOiBcbiIpOwotCQlwdHJMcFBhY2EgPSBwdHJQYWNhLT5scHBhY2FfcHRyOwotCQlwcmludGYoIiAgICBTYXZlZCBTcnIwPSUuMTZseCAgU2F2ZWQgU3JyMT0lLjE2bHggXG4iLAotCQkgICAgICAgcHRyTHBQYWNhLT5zYXZlZF9zcnIwLCBwdHJMcFBhY2EtPnNhdmVkX3NycjEpOwotCQlwcmludGYoIiAgICBTYXZlZCBHcHIzPSUuMTZseCAgU2F2ZWQgR3ByND0lLjE2bHggXG4iLAotCQkgICAgICAgcHRyTHBQYWNhLT5zYXZlZF9ncHIzLCBwdHJMcFBhY2EtPnNhdmVkX2dwcjQpOwotCQlwcmludGYoIiAgICBTYXZlZCBHcHI1PSUuMTZseCBcbiIsIHB0ckxwUGFjYS0+c2F2ZWRfZ3ByNSk7Ci0gICAgCi0JCXByaW50ZigiICBMb2NhbCBQcm9jZXNzb3IgUmVnaXN0ZXIgU2F2ZSBBcmVhIChMcFJlZ1NhdmUpOiBcbiIpOwotCQlwdHJMcFJlZ1NhdmUgPSBwdHJQYWNhLT5yZWdfc2F2ZV9wdHI7Ci0JCXByaW50ZigiICAgIFNhdmVkIFNwcmcwPSUuMTZseCAgU2F2ZWQgU3ByZzE9JS4xNmx4IFxuIiwKLQkJICAgICAgIHB0ckxwUmVnU2F2ZS0+eFNQUkcwLCBwdHJMcFJlZ1NhdmUtPnhTUFJHMCk7Ci0JCXByaW50ZigiICAgIFNhdmVkIFNwcmcyPSUuMTZseCAgU2F2ZWQgU3ByZzM9JS4xNmx4IFxuIiwKLQkJICAgICAgIHB0ckxwUmVnU2F2ZS0+eFNQUkcyLCBwdHJMcFJlZ1NhdmUtPnhTUFJHMyk7Ci0JCXByaW50ZigiICAgIFNhdmVkIE1zciAgPSUuMTZseCAgU2F2ZWQgTmlhICA9JS4xNmx4IFxuIiwKLQkJICAgICAgIHB0ckxwUmVnU2F2ZS0+eE1TUiwgcHRyTHBSZWdTYXZlLT54TklBKTsKKwkJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpIHsKKwkJCXN0cnVjdCBwYWNhX3N0cnVjdCAqcHRyUGFjYTsKKwkJCXN0cnVjdCBscHBhY2EgKnB0ckxwUGFjYTsKKwkJCXN0cnVjdCBJdExwUmVnU2F2ZSAqcHRyTHBSZWdTYXZlOworCisJCQkvKiBEdW1wIG91dCByZWxldmFudCBQYWNhIGRhdGEgYXJlYXMuICovCisJCQlwcmludGYoIlBhY2E6IFxuIik7CisJCQlwdHJQYWNhID0gZ2V0X3BhY2EoKTsKKworCQkJcHJpbnRmKCIgIExvY2FsIFByb2Nlc3NvciBDb250cm9sIEFyZWEgKExwUGFjYSk6IFxuIik7CisJCQlwdHJMcFBhY2EgPSBwdHJQYWNhLT5scHBhY2FfcHRyOworCQkJcHJpbnRmKCIgICAgU2F2ZWQgU3JyMD0lLjE2bHggIFNhdmVkIFNycjE9JS4xNmx4IFxuIiwKKwkJCSAgICAgICBwdHJMcFBhY2EtPnNhdmVkX3NycjAsIHB0ckxwUGFjYS0+c2F2ZWRfc3JyMSk7CisJCQlwcmludGYoIiAgICBTYXZlZCBHcHIzPSUuMTZseCAgU2F2ZWQgR3ByND0lLjE2bHggXG4iLAorCQkJICAgICAgIHB0ckxwUGFjYS0+c2F2ZWRfZ3ByMywgcHRyTHBQYWNhLT5zYXZlZF9ncHI0KTsKKwkJCXByaW50ZigiICAgIFNhdmVkIEdwcjU9JS4xNmx4IFxuIiwgcHRyTHBQYWNhLT5zYXZlZF9ncHI1KTsKKworCQkJcHJpbnRmKCIgIExvY2FsIFByb2Nlc3NvciBSZWdpc3RlciBTYXZlIEFyZWEgKExwUmVnU2F2ZSk6IFxuIik7CisJCQlwdHJMcFJlZ1NhdmUgPSBwdHJQYWNhLT5yZWdfc2F2ZV9wdHI7CisJCQlwcmludGYoIiAgICBTYXZlZCBTcHJnMD0lLjE2bHggIFNhdmVkIFNwcmcxPSUuMTZseCBcbiIsCisJCQkgICAgICAgcHRyTHBSZWdTYXZlLT54U1BSRzAsIHB0ckxwUmVnU2F2ZS0+eFNQUkcwKTsKKwkJCXByaW50ZigiICAgIFNhdmVkIFNwcmcyPSUuMTZseCAgU2F2ZWQgU3ByZzM9JS4xNmx4IFxuIiwKKwkJCSAgICAgICBwdHJMcFJlZ1NhdmUtPnhTUFJHMiwgcHRyTHBSZWdTYXZlLT54U1BSRzMpOworCQkJcHJpbnRmKCIgICAgU2F2ZWQgTXNyICA9JS4xNmx4ICBTYXZlZCBOaWEgID0lLjE2bHggXG4iLAorCQkJICAgICAgIHB0ckxwUmVnU2F2ZS0+eE1TUiwgcHRyTHBSZWdTYXZlLT54TklBKTsKKwkJfQogI2VuZGlmCiAKIAkJcmV0dXJuOwpAQCAtMjA1Myw4ICsyMDY4LDExIEBACiAJfQogfQogCit0eXBlZGVmIGludCAoKmluc3RydWN0aW9uX2R1bXBfZnVuYykodW5zaWduZWQgbG9uZyBpbnN0LCB1bnNpZ25lZCBsb25nIGFkZHIpOworCiBpbnQKLXBwY19pbnN0X2R1bXAodW5zaWduZWQgbG9uZyBhZHIsIGxvbmcgY291bnQsIGludCBwcmFkZHIpCitnZW5lcmljX2luc3RfZHVtcCh1bnNpZ25lZCBsb25nIGFkciwgbG9uZyBjb3VudCwgaW50IHByYWRkciwKKwkJCWluc3RydWN0aW9uX2R1bXBfZnVuYyBkdW1wX2Z1bmMpCiB7CiAJaW50IG5yLCBkb3R0ZWQ7CiAJdW5zaWduZWQgbG9uZyBmaXJzdF9hZHI7CkBAIC0yMDg0LDEyICsyMTAyLDE4IEBACiAJCWlmIChwcmFkZHIpCiAJCQlwcmludGYoUkVHIiAgJS44eCIsIGFkciwgaW5zdCk7CiAJCXByaW50ZigiXHQiKTsKLQkJcHJpbnRfaW5zbl9wb3dlcnBjKGluc3QsIGFkciwgMCk7CS8qIGFsd2F5cyByZXR1cm5zIDQgKi8KKwkJZHVtcF9mdW5jKGluc3QsIGFkcik7CiAJCXByaW50ZigiXG4iKTsKIAl9CiAJcmV0dXJuIGFkciAtIGZpcnN0X2FkcjsKIH0KIAoraW50CitwcGNfaW5zdF9kdW1wKHVuc2lnbmVkIGxvbmcgYWRyLCBsb25nIGNvdW50LCBpbnQgcHJhZGRyKQoreworCXJldHVybiBnZW5lcmljX2luc3RfZHVtcChhZHIsIGNvdW50LCBwcmFkZHIsIHByaW50X2luc25fcG93ZXJwYyk7Cit9CisKIHZvaWQKIHByaW50X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewpAQCAtMjU1Nyw2ICsyNTgxLDEwIEBACiAKIHZvaWQgeG1vbl9pbml0KGludCBlbmFibGUpCiB7CisjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCisJCXJldHVybjsKKyNlbmRpZgogCWlmIChlbmFibGUpIHsKIAkJX19kZWJ1Z2dlciA9IHhtb247CiAJCV9fZGVidWdnZXJfaXBpID0geG1vbl9pcGk7CkBAIC0yNTk0LDYgKzI2MjIsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2V0dXBfeG1vbl9zeXNycSh2b2lkKQogeworI2lmZGVmIENPTkZJR19QUENfSVNFUklFUworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgogCXJlZ2lzdGVyX3N5c3JxX2tleSgneCcsICZzeXNycV94bW9uX29wKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MzAsMyArMjY2MiwyNjMgQEAKIAlpZiAoeG1vbl9lYXJseSkKIAkJZGVidWdnZXIoTlVMTCk7CiB9CisKKyNpZmRlZiBDT05GSUdfU1BVX0JBU0UKKworc3RydWN0IHNwdV9pbmZvIHsKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJdTY0IHNhdmVkX21mY19zcjFfUlc7CisJdTMyIHNhdmVkX3NwdV9ydW5jbnRsX1JXOworCXVuc2lnbmVkIGxvbmcgZHVtcF9hZGRyOworCXU4IHN0b3BwZWRfb2s7Cit9OworCisjZGVmaW5lIFhNT05fTlVNX1NQVVMJMTYJLyogRW5vdWdoIGZvciBjdXJyZW50IGhhcmR3YXJlICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3B1X2luZm8gc3B1X2luZm9bWE1PTl9OVU1fU1BVU107CisKK3ZvaWQgeG1vbl9yZWdpc3Rlcl9zcHVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHNwdSAqc3B1OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcHUsIGxpc3QsIGZ1bGxfbGlzdCkgeworCQlpZiAoc3B1LT5udW1iZXIgPj0gWE1PTl9OVU1fU1BVUykgeworCQkJV0FSTl9PTigxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3B1X2luZm9bc3B1LT5udW1iZXJdLnNwdSA9IHNwdTsKKwkJc3B1X2luZm9bc3B1LT5udW1iZXJdLnN0b3BwZWRfb2sgPSAwOworCQlzcHVfaW5mb1tzcHUtPm51bWJlcl0uZHVtcF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJc3B1X2luZm9bc3B1LT5udW1iZXJdLnNwdS0+bG9jYWxfc3RvcmU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdG9wX3NwdXModm9pZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJaW50IGk7CisJdTY0IHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCBYTU9OX05VTV9TUFVTOyBpKyspIHsKKwkJaWYgKCFzcHVfaW5mb1tpXS5zcHUpCisJCQljb250aW51ZTsKKworCQlpZiAoc2V0am1wKGJ1c19lcnJvcl9qbXApID09IDApIHsKKwkJCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAxOworCQkJc3luYygpOworCisJCQlzcHUgPSBzcHVfaW5mb1tpXS5zcHU7CisKKwkJCXNwdV9pbmZvW2ldLnNhdmVkX3NwdV9ydW5jbnRsX1JXID0KKwkJCQlpbl9iZTMyKCZzcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXKTsKKworCQkJdG1wID0gc3B1X21mY19zcjFfZ2V0KHNwdSk7CisJCQlzcHVfaW5mb1tpXS5zYXZlZF9tZmNfc3IxX1JXID0gdG1wOworCisJCQl0bXAgJj0gfk1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0s7CisJCQlzcHVfbWZjX3NyMV9zZXQoc3B1LCB0bXApOworCisJCQlzeW5jKCk7CisJCQlfX2RlbGF5KDIwMCk7CisKKwkJCXNwdV9pbmZvW2ldLnN0b3BwZWRfb2sgPSAxOworCisJCQlwcmludGYoIlN0b3BwZWQgc3B1ICUuMmQgKHdhcyAlcylcbiIsIGksCisJCQkJCXNwdV9pbmZvW2ldLnNhdmVkX3NwdV9ydW5jbnRsX1JXID8KKwkJCQkJInJ1bm5pbmciIDogInN0b3BwZWQiKTsKKwkJfSBlbHNlIHsKKwkJCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAwOworCQkJcHJpbnRmKCIqKiogRXJyb3Igc3RvcHBpbmcgc3B1ICUuMmRcbiIsIGkpOworCQl9CisJCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzdGFydF9zcHVzKHZvaWQpCit7CisJc3RydWN0IHNwdSAqc3B1OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFhNT05fTlVNX1NQVVM7IGkrKykgeworCQlpZiAoIXNwdV9pbmZvW2ldLnNwdSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3B1X2luZm9baV0uc3RvcHBlZF9vaykgeworCQkJcHJpbnRmKCIqKiogRXJyb3IsIHNwdSAlZCB3YXMgbm90IHN1Y2Nlc3NmdWxseSBzdG9wcGVkIgorCQkJCQkiLCBub3QgcmVzdGFydGluZ1xuIiwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzZXRqbXAoYnVzX2Vycm9yX2ptcCkgPT0gMCkgeworCQkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDE7CisJCQlzeW5jKCk7CisKKwkJCXNwdSA9IHNwdV9pbmZvW2ldLnNwdTsKKwkJCXNwdV9tZmNfc3IxX3NldChzcHUsIHNwdV9pbmZvW2ldLnNhdmVkX21mY19zcjFfUlcpOworCQkJb3V0X2JlMzIoJnNwdS0+cHJvYmxlbS0+c3B1X3J1bmNudGxfUlcsCisJCQkJCXNwdV9pbmZvW2ldLnNhdmVkX3NwdV9ydW5jbnRsX1JXKTsKKworCQkJc3luYygpOworCQkJX19kZWxheSgyMDApOworCisJCQlwcmludGYoIlJlc3RhcnRlZCBzcHUgJS4yZFxuIiwgaSk7CisJCX0gZWxzZSB7CisJCQljYXRjaF9tZW1vcnlfZXJyb3JzID0gMDsKKwkJCXByaW50ZigiKioqIEVycm9yIHJlc3RhcnRpbmcgc3B1ICUuMmRcbiIsIGkpOworCQl9CisJCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAwOworCX0KK30KKworI2RlZmluZSBEVU1QX1dJRFRICTIzCisjZGVmaW5lIERVTVBfVkFMVUUoZm9ybWF0LCBmaWVsZCwgdmFsdWUpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKHNldGptcChidXNfZXJyb3Jfam1wKSA9PSAwKSB7CQkJCVwKKwkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDE7CQkJCVwKKwkJc3luYygpOwkJCQkJCQlcCisJCXByaW50ZigiICAlLSpzID0gImZvcm1hdCJcbiIsIERVTVBfV0lEVEgsCQlcCisJCQkJI2ZpZWxkLCB2YWx1ZSk7CQkJCVwKKwkJc3luYygpOwkJCQkJCQlcCisJCV9fZGVsYXkoMjAwKTsJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQljYXRjaF9tZW1vcnlfZXJyb3JzID0gMDsJCQkJXAorCQlwcmludGYoIiAgJS0qcyA9ICoqKiBFcnJvciByZWFkaW5nIGZpZWxkLlxuIiwJCVwKKwkJCQkJRFVNUF9XSURUSCwgI2ZpZWxkKTsJCVwKKwl9CQkJCQkJCQlcCisJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDA7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERVTVBfRklFTEQob2JqLCBmb3JtYXQsIGZpZWxkKQlcCisJRFVNUF9WQUxVRShmb3JtYXQsIGZpZWxkLCBvYmotPmZpZWxkKQorCitzdGF0aWMgdm9pZCBkdW1wX3NwdV9maWVsZHMoc3RydWN0IHNwdSAqc3B1KQoreworCXByaW50ZigiRHVtcGluZyBzcHUgZmllbGRzIGF0IGFkZHJlc3MgJXA6XG4iLCBzcHUpOworCisJRFVNUF9GSUVMRChzcHUsICIweCV4IiwgbnVtYmVyKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIiVzIiwgbmFtZSk7CisJRFVNUF9GSUVMRChzcHUsICIweCVseCIsIGxvY2FsX3N0b3JlX3BoeXMpOworCURVTVBfRklFTEQoc3B1LCAiMHglcCIsIGxvY2FsX3N0b3JlKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgbHNfc2l6ZSk7CisJRFVNUF9GSUVMRChzcHUsICIweCV4Iiwgbm9kZSk7CisJRFVNUF9GSUVMRChzcHUsICIweCVseCIsIGZsYWdzKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgZGFyKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgZHNpc3IpOworCURVTVBfRklFTEQoc3B1LCAiJWQiLCBjbGFzc18wX3BlbmRpbmcpOworCURVTVBfRklFTEQoc3B1LCAiMHglbHgiLCBpcnFzWzBdKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgaXJxc1sxXSk7CisJRFVNUF9GSUVMRChzcHUsICIweCVseCIsIGlycXNbMl0pOworCURVTVBfRklFTEQoc3B1LCAiMHgleCIsIHNsYl9yZXBsYWNlKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIiVkIiwgcGlkKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIiVkIiwgcHJpbyk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgbW0pOworCURVTVBfRklFTEQoc3B1LCAiMHglcCIsIGN0eCk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgcnEpOworCURVTVBfRklFTEQoc3B1LCAiMHglcCIsIHRpbWVzdGFtcCk7CisJRFVNUF9GSUVMRChzcHUsICIweCVseCIsIHByb2JsZW1fcGh5cyk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgcHJvYmxlbSk7CisJRFVNUF9WQUxVRSgiMHgleCIsIHByb2JsZW0tPnNwdV9ydW5jbnRsX1JXLAorCQkJaW5fYmUzMigmc3B1LT5wcm9ibGVtLT5zcHVfcnVuY250bF9SVykpOworCURVTVBfVkFMVUUoIjB4JXgiLCBwcm9ibGVtLT5zcHVfc3RhdHVzX1IsCisJCQlpbl9iZTMyKCZzcHUtPnByb2JsZW0tPnNwdV9zdGF0dXNfUikpOworCURVTVBfVkFMVUUoIjB4JXgiLCBwcm9ibGVtLT5zcHVfbnBjX1JXLAorCQkJaW5fYmUzMigmc3B1LT5wcm9ibGVtLT5zcHVfbnBjX1JXKSk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgcHJpdjIpOworCURVTVBfRklFTEQoc3B1LCAiMHglcCIsIHBkYXRhKTsKK30KKworaW50CitzcHVfaW5zdF9kdW1wKHVuc2lnbmVkIGxvbmcgYWRyLCBsb25nIGNvdW50LCBpbnQgcHJhZGRyKQoreworCXJldHVybiBnZW5lcmljX2luc3RfZHVtcChhZHIsIGNvdW50LCBwcmFkZHIsIHByaW50X2luc25fc3B1KTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zcHVfbHModW5zaWduZWQgbG9uZyBudW0sIGludCBzdWJjbWQpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGFkZHIsIGxzX2FkZHI7CisKKwlpZiAoc2V0am1wKGJ1c19lcnJvcl9qbXApID09IDApIHsKKwkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDE7CisJCXN5bmMoKTsKKwkJbHNfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNwdV9pbmZvW251bV0uc3B1LT5sb2NhbF9zdG9yZTsKKwkJc3luYygpOworCQlfX2RlbGF5KDIwMCk7CisJfSBlbHNlIHsKKwkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDA7CisJCXByaW50ZigiKioqIEVycm9yOiBhY2Nlc3Npbmcgc3B1IGluZm8gZm9yIHNwdSAlZFxuIiwgbnVtKTsKKwkJcmV0dXJuOworCX0KKwljYXRjaF9tZW1vcnlfZXJyb3JzID0gMDsKKworCWlmIChzY2FuaGV4KCZvZmZzZXQpKQorCQlhZGRyID0gbHNfYWRkciArIG9mZnNldDsKKwllbHNlCisJCWFkZHIgPSBzcHVfaW5mb1tudW1dLmR1bXBfYWRkcjsKKworCWlmIChhZGRyID49IGxzX2FkZHIgKyBMU19TSVpFKSB7CisJCXByaW50ZigiKioqIEVycm9yOiBhZGRyZXNzIG91dHNpZGUgb2YgbG9jYWwgc3RvcmVcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChzdWJjbWQpIHsKKwljYXNlICdpJzoKKwkJYWRkciArPSBzcHVfaW5zdF9kdW1wKGFkZHIsIDE2LCAxKTsKKwkJbGFzdF9jbWQgPSAic2RpXG4iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmR1bXAoYWRkciwgNjQpOworCQlhZGRyICs9IDY0OworCQlsYXN0X2NtZCA9ICJzZFxuIjsKKwkJYnJlYWs7CisJfQorCisJc3B1X2luZm9bbnVtXS5kdW1wX2FkZHIgPSBhZGRyOworfQorCitzdGF0aWMgaW50IGRvX3NwdV9jbWQodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBudW0gPSAwOworCWludCBjbWQsIHN1YmNtZCA9IDA7CisKKwljbWQgPSBpbmNoYXIoKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgJ3MnOgorCQlzdG9wX3NwdXMoKTsKKwkJYnJlYWs7CisJY2FzZSAncic6CisJCXJlc3RhcnRfc3B1cygpOworCQlicmVhazsKKwljYXNlICdkJzoKKwkJc3ViY21kID0gaW5jaGFyKCk7CisJCWlmIChpc3hkaWdpdChzdWJjbWQpIHx8IHN1YmNtZCA9PSAnXG4nKQorCQkJdGVybWNoID0gc3ViY21kOworCWNhc2UgJ2YnOgorCQlzY2FuaGV4KCZudW0pOworCQlpZiAobnVtID49IFhNT05fTlVNX1NQVVMgfHwgIXNwdV9pbmZvW251bV0uc3B1KSB7CisJCQlwcmludGYoIioqKiBFcnJvcjogaW52YWxpZCBzcHUgbnVtYmVyXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSAnZic6CisJCQlkdW1wX3NwdV9maWVsZHMoc3B1X2luZm9bbnVtXS5zcHUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkdW1wX3NwdV9scyhudW0sIHN1YmNtZCk7CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qICEgQ09ORklHX1NQVV9CQVNFICovCitzdGF0aWMgaW50IGRvX3NwdV9jbWQodm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLy5naXRpZ25vcmUgYi9hcmNoL3BwYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTg2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL0tjb25maWcgYi9hcmNoL3BwYy9LY29uZmlnCmluZGV4IDA3NzcxMWUuLmVkZjcxYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL0tjb25maWcKKysrIGIvYXJjaC9wcGMvS2NvbmZpZwpAQCAtNzcsOSArNzcsMTEgQEAKIAogY29uZmlnIDQweAogCWJvb2wgIjQweCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKIAogY29uZmlnIDQ0eAogCWJvb2wgIjQ0eCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKIAogY29uZmlnIDh4eAogCWJvb2wgIjh4eCIKQEAgLTk1LDYgKzk3LDE1IEBACiBjb25maWcgUFBDX0ZQVQogCWJvb2wKIAorY29uZmlnIFBQQ19EQ1JfTkFUSVZFCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0RDUgorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ19EQ1JfTkFUSVZFCisJZGVmYXVsdCB5CisKIGNvbmZpZyBCT09LRQogCWJvb2wKIAlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMApAQCAtNzI0LDcgKzczNSw3IEBACiAJICBCZSBhd2FyZSB0aGF0IFBDSSBidXNlcyBjYW4gb25seSBmdW5jdGlvbiB3aGVuIFNZUyBib2FyZCBpcyBwbHVnZ2VkCiAJICBpbnRvIHRoZSBQSUIgKFBsYXRmb3JtIElPIEJvYXJkKSBib2FyZCBmcm9tIEZyZWVzY2FsZSB3aGljaCBwcm92aWRlCiAJICAzIFBDSSBzbG90cy4gIFRoZSBQSUJzIFBDSSBpbml0aWFsaXphdGlvbiBpcyB0aGUgYm9vdGxvYWRlcidzCi0JICByZXNwb25zaWJsaWx0eS4KKwkgIHJlc3BvbnNpYmlsaXR5LgogCiBjb25maWcgRVY2NDM2MAogCWJvb2wgIk1hcnZlbGwtRVY2NDM2MEJQIgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9pbWFnZXMvLmdpdGlnbm9yZSBiL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjMmRjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACitzSW1hZ2UKK3ZtYXB1cwordm1saW51eCoKK21pYm9vdCoKK3pJbWFnZSoKK3VJbWFnZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9saWIvLmdpdGlnbm9yZSBiL2FyY2gvcHBjL2Jvb3QvbGliLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyOWE2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2Jvb3QvbGliLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACitpbmZmYXN0LmMKK2luZmxhdGUuYworaW5mdHJlZXMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC91dGlscy8uZ2l0aWdub3JlIGIvYXJjaC9wcGMvYm9vdC91dGlscy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZGZiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9ib290L3V0aWxzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACitta3ByZXAKK21rYnVnYm9vdAorbWt0cmVlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCmluZGV4IDI3ZmFlY2EuLjNjNTA2YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAkgKiBJZGVudGlmeSB0aGUgQ1BVIHR5cGUgYW5kIGZpeCB1cCBjb2RlIHNlY3Rpb25zCiAJICogdGhhdCBkZXBlbmQgb24gd2hpY2ggY3B1IHdlIGhhdmUuCiAJICovCi0Jc3BlYyA9IGlkZW50aWZ5X2NwdShvZmZzZXQpOworCXNwZWMgPSBpZGVudGlmeV9jcHUob2Zmc2V0LCBtZnNwcihTUFJOX1BWUikpOwogCWRvX2ZlYXR1cmVfZml4dXBzKHNwZWMtPmNwdV9mZWF0dXJlcywKIAkJCSAgUFRSUkVMT0MoJl9fc3RhcnRfX19mdHJfZml4dXApLAogCQkJICBQVFJSRUxPQygmX19zdG9wX19fZnRyX2ZpeHVwKSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDk2NjFhOTEuLjJmODM1YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCkBAIC0zMTYsNyArMzE2LDcgQEAKIAlpZiAocmVhc29uICYgTUNTUl9CVVNfUkJFUlIpCiAJCXByaW50aygiQnVzIC0gUmVhZCBEYXRhIEJ1cyBFcnJvclxuIik7CiAJaWYgKHJlYXNvbiAmIE1DU1JfQlVTX1dCRVJSKQotCQlwcmludGsoIkJ1cyAtIFJlYWQgRGF0YSBCdXMgRXJyb3JcbiIpOworCQlwcmludGsoIkJ1cyAtIFdyaXRlIERhdGEgQnVzIEVycm9yXG4iKTsKIAlpZiAocmVhc29uICYgTUNTUl9CVVNfSVBFUlIpCiAJCXByaW50aygiQnVzIC0gSW5zdHJ1Y3Rpb24gUGFyaXR5IEVycm9yXG4iKTsKIAlpZiAocmVhc29uICYgTUNTUl9CVVNfUlBFUlIpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2J1YmluZ2EuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYnViaW5nYS5jCmluZGV4IDQwMDlmNDkuLjc1ODU3YjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYnViaW5nYS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYnViaW5nYS5jCkBAIC0xMTYsNiArMTE2LDcgQEAKIHZvaWQgX19pbml0CiBiaW9zX2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgc3RydWN0IHBjaWwwX3JlZ3MgKnBjaXApCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCiAJdW5zaWduZWQgaW50IGJhcl9yZXNwb25zZSwgYmFyOwogCS8qCkBAIC0yMTIsNiArMjEzLDcgQEAKIAlwcmludGsoIiBwdG0ybGFcdDB4JXhcbiIsIGluX2xlMzIoJihwY2lwLT5wdG0ybGEpKSk7CiAKICNlbmRpZgorI2VuZGlmCiB9CiAKIHZvaWQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2NwY2k0MDUuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvY3BjaTQwNS5jCmluZGV4IDM2NzQzMDkuLjg0NzRiMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvY3BjaTQwNS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvY3BjaTQwNS5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIHZvaWQgX19pbml0CiBiaW9zX2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgc3RydWN0IHBjaWwwX3JlZ3MgKnBjaXApCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCXVuc2lnbmVkIGludCBiYXJfcmVzcG9uc2UsIGJhcjsKIAogCS8qIERpc2FibGUgcmVnaW9uIGZpcnN0ICovCkBAIC0xNjcsNiArMTY4LDcgQEAKIAkJCQkJUENJX0ZVTkMoaG9zZS0+Zmlyc3RfYnVzbm8pLCBiYXIsCiAJCQkJCSZiYXJfcmVzcG9uc2UpOwogCX0KKyNlbmRpZgogfQogCiB2b2lkIF9faW5pdApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lcDQwNS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lcDQwNS5jCmluZGV4IGFlNWM4MjAuLmU1YWRmOWJhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2VwNDA1LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lcDQwNS5jCkBAIC02OCw2ICs2OCw3IEBACiB2b2lkIF9faW5pdAogYmlvc19maXh1cChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHN0cnVjdCBwY2lsMF9yZWdzICpwY2lwKQogeworI2lmZGVmIENPTkZJR19QQ0kKIAl1bnNpZ25lZCBpbnQgYmFyX3Jlc3BvbnNlLCBiYXI7CiAJLyoKIAkgKiBFeHBlY3RlZCBQQ0kgbWFwcGluZzoKQEAgLTEzMCw2ICsxMzEsNyBAQAogCQkgICAgUENJX0ZVTkMoaG9zZS0+Zmlyc3RfYnVzbm8pLCBiYXIsIGJhcl9yZXNwb25zZSk7CiAJfQogCS8qIGVuZCB3b3JrIGFycm91bmQgKi8KKyNlbmRpZgogfQogCiB2b2lkIF9faW5pdApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggMzM5N2YwZC4uYjg0ZjhkZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC0xMjEsOCArMTIxLDggQEAKIAogCW1kYXRhLT5pcnFbMF0gPSBNUEM4M3h4X0lSUV9FWFQxOwogCW1kYXRhLT5pcnFbMV0gPSBNUEM4M3h4X0lSUV9FWFQyOwotCW1kYXRhLT5pcnFbMl0gPSAtMTsKLQltZGF0YS0+aXJxWzMxXSA9IC0xOworCW1kYXRhLT5pcnFbMl0gPSBQSFlfUE9MTDsKKwltZGF0YS0+aXJxWzMxXSA9IFBIWV9QT0xMOwogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4M3h4X1RTRUMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jCmluZGV4IDRmODM5ZGEuLjAwYTNiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYwpAQCAtOTIsOSArOTIsOSBAQAogCiAJbWRhdGEtPmlycVswXSA9IE1QQzg1eHhfSVJRX0VYVDU7CiAJbWRhdGEtPmlycVsxXSA9IE1QQzg1eHhfSVJRX0VYVDU7Ci0JbWRhdGEtPmlycVsyXSA9IC0xOworCW1kYXRhLT5pcnFbMl0gPSBQSFlfUE9MTDsKIAltZGF0YS0+aXJxWzNdID0gTVBDODV4eF9JUlFfRVhUNTsKLQltZGF0YS0+aXJxWzMxXSA9IC0xOworCW1kYXRhLT5pcnFbMzFdID0gUEhZX1BPTEw7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMKaW5kZXggMTRlY2VjNy4uM2EwNjA0NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTYwX2Fkcy5jCkBAIC0xNTYsOSArMTU2LDkgQEAKIAogCW1kYXRhLT5pcnFbMF0gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbMV0gPSBNUEM4NXh4X0lSUV9FWFQ1OwotCW1kYXRhLT5pcnFbMl0gPSAtMTsKKwltZGF0YS0+aXJxWzJdID0gUEhZX1BPTEw7CiAJbWRhdGEtPmlycVszXSA9IE1QQzg1eHhfSVJRX0VYVDU7Ci0JbWRhdGEtPmlycVszMV0gPSAtMTsKKwltZGF0YS0+aXJxWzMxXSA9IFBIWV9QT0xMOwogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzX2NvbW1vbi5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMKaW5kZXggNWNlMGY2OS4uMmQ1OWViNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMKQEAgLTQ1MSw5ICs0NTEsOSBAQAogCiAJbWRhdGEtPmlycVswXSA9IE1QQzg1eHhfSVJRX0VYVDU7CiAJbWRhdGEtPmlycVsxXSA9IE1QQzg1eHhfSVJRX0VYVDU7Ci0JbWRhdGEtPmlycVsyXSA9IC0xOwotCW1kYXRhLT5pcnFbM10gPSAtMTsKLQltZGF0YS0+aXJxWzMxXSA9IC0xOworCW1kYXRhLT5pcnFbMl0gPSBQSFlfUE9MTDsKKwltZGF0YS0+aXJxWzNdID0gUEhZX1BPTEw7CisJbWRhdGEtPmlycVszMV0gPSBQSFlfUE9MTDsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKaW5kZXggNzY0ZDU4MC4uMWQxMGFiOSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAKIAltZGF0YS0+aXJxWzI1XSA9IE1QQzg1eHhfSVJRX0VYVDY7CiAJbWRhdGEtPmlycVsyNl0gPSBNUEM4NXh4X0lSUV9FWFQ3OwotCW1kYXRhLT5pcnFbMzFdID0gLTE7CisJbWRhdGEtPmlycVszMV0gPSBQSFlfUE9MTDsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMKaW5kZXggNGJiMThhYi4uYjFmNWI3MyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKIAltZGF0YS0+aXJxWzJdID0gTVBDODV4eF9JUlFfRVhUNTsKIAltZGF0YS0+aXJxWzRdID0gTVBDODV4eF9JUlFfRVhUNTsKLQltZGF0YS0+aXJxWzMxXSA9IC0xOworCW1kYXRhLT5pcnFbMzFdID0gUEhZX1BPTEw7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCmluZGV4IGRkNDVmMmUuLjRlZTJiZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKQEAgLTEzNyw5ICsxMzcsOSBAQAogCiAJbWRhdGEtPmlycVswXSA9IE1QQzg1eHhfSVJRX0VYVDg7CiAJbWRhdGEtPmlycVsxXSA9IE1QQzg1eHhfSVJRX0VYVDg7Ci0JbWRhdGEtPmlycVsyXSA9IC0xOworCW1kYXRhLT5pcnFbMl0gPSBQSFlfUE9MTDsKIAltZGF0YS0+aXJxWzNdID0gTVBDODV4eF9JUlFfRVhUODsKLQltZGF0YS0+aXJxWzMxXSA9IC0xOworCW1kYXRhLT5pcnFbMzFdID0gUEhZX1BPTEw7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzgyNzJhZHNfc2V0dXAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4MjcyYWRzX3NldHVwLmMKaW5kZXggMWY5ZWEzNjguLjBiYzA2NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4MjcyYWRzX3NldHVwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzgyNzJhZHNfc2V0dXAuYwpAQCAtMjY2LDEwICsyNjYsMTAgQEAKIAkJCQkJICAgICAgaW50IGlkeCkKIHsKIAltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzBdID0gUEhZX0lOVEVSUlVQVDsKLQltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzFdID0gLTE7Ci0JbTgyeHhfbWlpX2JiX3BkYXRhLmlycVsyXSA9IC0xOworCW04Mnh4X21paV9iYl9wZGF0YS5pcnFbMV0gPSBQSFlfUE9MTDsKKwltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzJdID0gUEhZX1BPTEw7CiAJbTgyeHhfbWlpX2JiX3BkYXRhLmlycVszXSA9IFBIWV9JTlRFUlJVUFQ7Ci0JbTgyeHhfbWlpX2JiX3BkYXRhLmlycVszMV0gPSAtMTsKKwltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzMxXSA9IFBIWV9QT0xMOwogCiAKIAltODJ4eF9taWlfYmJfcGRhdGEubWRpb19kYXQub2Zmc2V0ID0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4NjZhZHNfc2V0dXAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4NjZhZHNfc2V0dXAuYwppbmRleCBlOTVkMmMxLi44YTBjMDdlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODY2YWRzX3NldHVwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg2NmFkc19zZXR1cC5jCkBAIC0zNjEsNyArMzYxLDcgQEAKIAogCWZtcGktPm1paV9zcGVlZCA9ICgoKChiZC0+YmlfaW50ZnJlcSArIDQ5OTk5OTkpIC8gMjUwMDAwMCkgLyAyKSAmIDB4M0YpIDw8IDE7CiAJLyogTm8gUEhZIGludGVycnVwdCBsaW5lIGhlcmUgKi8KLQlmbXBpLT5pcnFbMHhmXSA9IC0xOworCWZtcGktPmlycVsweGZdID0gUEhZX1BPTEw7CiAKIC8qIFNpbmNlIGVpdGhlciBvZiB0aGUgdWFydHMgY291bGQgYmUgdXNlZCBhcyBjb25zb2xlLCB0aGV5IG5lZWQgdG8gcmVhZHkgKi8KICNpZmRlZiBDT05GSUdfU0VSSUFMX0NQTV9TTUMxCkBAIC0zODAsNyArMzgwLDcgQEAKIAogCWZtcGktPm1paV9zcGVlZCA9ICgoKChiZC0+YmlfaW50ZnJlcSArIDQ5OTk5OTkpIC8gMjUwMDAwMCkgLyAyKSAmIDB4M0YpIDw8IDE7CiAJLyogTm8gUEhZIGludGVycnVwdCBsaW5lIGhlcmUgKi8KLQlmbXBpLT5pcnFbMHhmXSA9IC0xOworCWZtcGktPmlycVsweGZdID0gUEhZX1BPTEw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4eHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzh4eF9kZXZpY2VzLmMKaW5kZXggY2Y1YWI0Ny4uMzFmYjU2NSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL21wYzh4eF9kZXZpY2VzLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzh4eF9kZXZpY2VzLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAkJCXsKIAkJCQkubmFtZSAJPSAicHJhbSIsCiAJCQkJLnN0YXJ0IAk9IDB4M2MwMCwKLQkJCQkuZW5kIAk9IDB4M2M4MCwKKwkJCQkuZW5kIAk9IDB4M2M3ZiwKIAkJCQkuZmxhZ3MgCT0gSU9SRVNPVVJDRV9NRU0sCiAJCQl9LAogCQkJewpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCQl7CiAJCQkJLm5hbWUgCT0gInByYW0iLAogCQkJCS5zdGFydCAJPSAweDNkMDAsCi0JCQkJLmVuZCAJPSAweDNkODAsCisJCQkJLmVuZCAJPSAweDNkN2YsCiAJCQkJLmZsYWdzIAk9IElPUkVTT1VSQ0VfTUVNLAogCQkJfSwKIApAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQl7CiAJCQkJLm5hbWUgCT0gInByYW0iLAogCQkJCS5zdGFydCAJPSAweDNlMDAsCi0JCQkJLmVuZCAJPSAweDNlODAsCisJCQkJLmVuZCAJPSAweDNlN2YsCiAJCQkJLmZsYWdzIAk9IElPUkVTT1VSQ0VfTUVNLAogCQkJfSwKIApAQCAtMTU1LDcgKzE1NSw3IEBACiAJCQl7CiAJCQkJLm5hbWUgCT0gInByYW0iLAogCQkJCS5zdGFydCAJPSAweDNmMDAsCi0JCQkJLmVuZCAJPSAweDNmODAsCisJCQkJLmVuZCAJPSAweDNmN2YsCiAJCQkJLmZsYWdzIAk9IElPUkVTT1VSQ0VfTUVNLAogCQkJfSwKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCAyNDViODFiLi41ODNkOWZmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtMzMsOSArMzMsNiBAQAogY29uZmlnIEdFTkVSSUNfVElNRQogCWRlZl9ib29sIHkKIAotY29uZmlnIEdFTkVSSUNfQlVTVF9TUElOTE9DSwotCWJvb2wKLQogbWFpbm1lbnUgIkxpbnV4IEtlcm5lbCBDb25maWd1cmF0aW9uIgogCiBjb25maWcgUzM5MApAQCAtMTgxLDcgKzE3OCw3IEBACiAKIGNvbmZpZyBTTUFMTF9TVEFDSwogCWJvb2wgIlVzZSA0a2IvOGtiIGZvciBrZXJuZWwgc3RhY2sgaW5zdGVhZCBvZiA4a2IvMTZrYiIKLQlkZXBlbmRzIG9uIFBBQ0tfU1RBQ0sKKwlkZXBlbmRzIG9uIFBBQ0tfU1RBQ0sgJiYgIUxPQ0tERVAKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtbWtlcm5lbC1iYWNrY2hhaW4KIAkgIG9wdGlvbiB0aGUga2VybmVsIHdpbGwgdXNlIGEgc21hbGxlciBrZXJuZWwgc3RhY2sgc2l6ZS4gRm9yIDMxIGJpdApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL01ha2VmaWxlIGIvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IDVkZWI5ZjcuLjY1OThlNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvTWFrZWZpbGUKQEAgLTM1LDYgKzM1LDkgQEAKIGNmbGFncy0kKENPTkZJR19NQVJDSF9aOTkwKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD16OTkwKQogY2ZsYWdzLSQoQ09ORklHX01BUkNIX1o5XzEwOSkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9ejktMTA5KQogCisjS0JVSUxEX0lNQUdFIGlzIG5lY2Vzc2FyeSBmb3IgbWFrZSBycG0KK0tCVUlMRF9JTUFHRQk6PWFyY2gvczM5MC9ib290L2ltYWdlCisKICMKICMgUHJldmVudCB0YWlsLWNhbGwgb3B0aW1pemF0aW9ucywgdG8gZ2V0IGNsZWFyZXIgYmFja3RyYWNlczoKICMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IGFhOTc4OTcuLmE4MTg4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogRVhUUkFfQUZMQUdTCTo9IC10cmFkaXRpb25hbAogCi1vYmoteQk6PSAgYml0bWFwLm8gdHJhcHMubyB0aW1lLm8gcHJvY2Vzcy5vIFwKK29iai15CTo9ICBiaXRtYXAubyB0cmFwcy5vIHRpbWUubyBwcm9jZXNzLm8gcmVzZXQubyBcCiAgICAgICAgICAgICBzZXR1cC5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBcCiAJICAgIHNlbWFwaG9yZS5vIHMzOTBfZXh0Lm8gZGVidWcubyBwcm9maWxlLm8gaXJxLm8gaXBsLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jCmluZGV4IDFlYWU3NGUuLmE1OTcyZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY3BjbWQuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NwY21kLmMKQEAgLTIxLDE0ICsyMSwxNSBAQAogc3RhdGljIGNoYXIgY3BjbWRfYnVmWzI0MV07CiAKIC8qCi0gKiB0aGUgY2FsbGVyIG9mIF9fY3BjbWQgaGFzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNwb25zZSBidWZmZXIgaXMgYmVsb3cgMiBHQgorICogX19jcGNtZCBoYXMgc29tZSByZXN0cmljdGlvbnMgb3ZlciBjcGNtZAorICogIC0gdGhlIHJlc3BvbnNlIGJ1ZmZlciBtdXN0IHJlc2lkZSBiZWxvdyAyR0IgKGlmIGFueSkKKyAqICAtIF9fY3BjbWQgaXMgdW5sb2NrZWQgYW5kIHRoZXJlZm9yZSBub3QgU01QLXNhZmUKICAqLwogaW50ICBfX2NwY21kKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqcmVzcG9uc2UsIGludCBybGVuLCBpbnQgKnJlc3BvbnNlX2NvZGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgY21kbGVuOworCXVuc2lnbmVkIGNtZGxlbjsKIAlpbnQgcmV0dXJuX2NvZGUsIHJldHVybl9sZW47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY3BjbWRfbG9jaywgZmxhZ3MpOwogCWNtZGxlbiA9IHN0cmxlbihjbWQpOwogCUJVR19PTihjbWRsZW4gPiAyNDApOwogCW1lbWNweShjcGNtZF9idWYsIGNtZCwgY21kbGVuKTsKQEAgLTc0LDcgKzc1LDYgQEAKIAkJCTogIitkIiAocmVnMykgOiAiZCIgKHJlZzIpIDogImNjIik7CiAJCXJldHVybl9jb2RlID0gKGludCkgcmVnMzsKICAgICAgICAgfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwY21kX2xvY2ssIGZsYWdzKTsKIAlpZiAocmVzcG9uc2VfY29kZSAhPSBOVUxMKQogCQkqcmVzcG9uc2VfY29kZSA9IHJldHVybl9jb2RlOwogCXJldHVybiByZXR1cm5fbGVuOwpAQCAtODIsMTUgKzgyLDE4IEBACiAKIEVYUE9SVF9TWU1CT0woX19jcGNtZCk7CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIGludCBjcGNtZChjb25zdCBjaGFyICpjbWQsIGNoYXIgKnJlc3BvbnNlLCBpbnQgcmxlbiwgaW50ICpyZXNwb25zZV9jb2RlKQogewogCWNoYXIgKmxvd2J1ZjsKIAlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoKHJsZW4gPT0gMCkgfHwgKHJlc3BvbnNlID09IE5VTEwpCi0JICAgIHx8ICEoKHVuc2lnbmVkIGxvbmcpcmVzcG9uc2UgPj4gMzEpKQorCSAgICB8fCAhKCh1bnNpZ25lZCBsb25nKXJlc3BvbnNlID4+IDMxKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3BjbWRfbG9jaywgZmxhZ3MpOwogCQlsZW4gPSBfX2NwY21kKGNtZCwgcmVzcG9uc2UsIHJsZW4sIHJlc3BvbnNlX2NvZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcGNtZF9sb2NrLCBmbGFncyk7CisJfQogCWVsc2UgewogCQlsb3didWYgPSBrbWFsbG9jKHJsZW4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAkJaWYgKCFsb3didWYpIHsKQEAgLTk4LDcgKzEwMSw5IEBACiAJCQkJImNwY21kOiBjb3VsZCBub3QgYWxsb2NhdGUgcmVzcG9uc2UgYnVmZmVyXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjcGNtZF9sb2NrLCBmbGFncyk7CiAJCWxlbiA9IF9fY3BjbWQoY21kLCBsb3didWYsIHJsZW4sIHJlc3BvbnNlX2NvZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcGNtZF9sb2NrLCBmbGFncyk7CiAJCW1lbWNweShyZXNwb25zZSwgbG93YnVmLCBybGVuKTsKIAkJa2ZyZWUobG93YnVmKTsKIAl9CkBAIC0xMDYsNCArMTExLDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChjcGNtZCk7Ci0jZW5kaWYJCS8qIENPTkZJR182NEJJVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwppbmRleCAwY2Y1OWJiLi44ZjhjODAyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwpAQCAtNDE4LDI0ICs0MTgsNiBAQAogLmdvdHI6CiAJbAklcjEwLC50YmwJCSMgRUJDRElDIHRvIEFTQ0lJIHRhYmxlCiAJdHIJMCgyNDAsJXI4KSwwKCVyMTApCi0Jc3RpZHAJX19MQ19DUFVJRAkJIyBBcmUgd2UgcnVubmluZyBvbiBWTSBtYXliZQotCWNsaQlfX0xDX0NQVUlELDB4ZmYKLQlibnoJLnRlc3QKLQkubG9uZwkweDgzMzAwMDYwCQkjIGRpYWcgMywwLHgnMDA2MCcgLSBzdG9yYWdlIHNpemUKLQliCS5kb25lCi0udGVzdDoKLQltdmMJMHg2OCg4KSwucGdtbncJCSMgc2V0IHVwIHBnbSBjaGVjayBoYW5kbGVyCi0JbAklcjIsLmZvdXJtZWcKLQlscgklcjMsJXIyCi0JYmN0cgklcjMsJXIwCQkJIyA0TS0xCi0ubG9vcDoJaXNrZQklcjAsJXIzCi0JYXIJJXIzLCVyMgotLnBnbXg6Ci0Jc3IJJXIzLCVyMgotCWxhCSVyMywxKCVyMykKLS5kb25lOgotCWwJJXIxLC5tZW1zaXplCi0Jc3QJJXIzLEFSQ0hfT0ZGU0VUKCVyMSkKIAlzbHIJJXIwLCVyMAogCXN0CSVyMCxJTklUUkRfU0laRStBUkNIX09GRlNFVC1QQVJNQVJFQSglcjExKQogCXN0CSVyMCxJTklUUkRfU1RBUlQrQVJDSF9PRkZTRVQtUEFSTUFSRUEoJXIxMSkKQEAgLTQ0Myw5ICs0MjUsNiBAQAogLnRibDoJLmxvbmcJX2ViY2FzYwkJCSMgdHJhbnNsYXRlIHRhYmxlCiAuY21kOgkubG9uZwlDT01NQU5EX0xJTkUJCSMgYWRkcmVzcyBvZiBjb21tYW5kIGxpbmUgYnVmZmVyCiAucGFybToJLmxvbmcJUEFSTUFSRUEKLS5tZW1zaXplOiAubG9uZyBtZW1vcnlfc2l6ZQotLmZvdXJtZWc6IC5sb25nIDB4MDA0MDAwMDAgICAgICAJIyA0TQotLnBnbW53OgkubG9uZwkweDAwMDgwMDAwLC5wZ214CiAubG93Y2FzZToKIAkuYnl0ZSAweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcKIAkuYnl0ZSAweDA4LDB4MDksMHgwYSwweDBiLDB4MGMsMHgwZCwweDBlLDB4MGYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZDMxLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TCmluZGV4IDBhMmM5MjkuLjQzODhiMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZDMxLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUwpAQCAtMTMxLDEwICsxMzEsMTEgQEAKIAkubG9uZwlpbml0X3RocmVhZF91bmlvbgogLkxwbWFzazoKIAkuYnl0ZQkwCi0uYWxpZ24gOAorCS5hbGlnbgk4CiAuTHBjZXh0Oi5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMAogLkxjcjoKIAkubG9uZwkweDAwCQkJIyBwbGFjZSBob2xkZXIgZm9yIGNyMAorCS5hbGlnbgk4CiAuTHdhaXRzY2xwOgogCS5sb25nIDB4MDEwYTAwMDAsMHg4MDAwMDAwMCArIC5Mc2NscGgKIC5McmNwOgpAQCAtMTU2LDcgKzE1Nyw3IEBACiAJc2xyCSVyNCwlcjQJCQkjIHNldCBzdGFydCBvZiBjaHVuayB0byB6ZXJvCiAJc2xyCSVyNSwlcjUJCQkjIHNldCBlbmQgb2YgY2h1bmsgdG8gemVybwogCXNscgklcjYsJXI2CQkJIyBzZXQgYWNjZXNzIGNvZGUgdG8gemVybwotCWxhCSVyMTAsIE1FTU9SWV9DSFVOS1MJIyBudW1iZXIgb2YgY2h1bmtzCisJbGEJJXIxMCxNRU1PUllfQ0hVTktTCSMgbnVtYmVyIG9mIGNodW5rcwogLkxsb29wOgogCXRwcm90CTAoJXI1KSwwCQkjIHRlc3QgcHJvdGVjdGlvbiBvZiBmaXJzdCBieXRlCiAJaXBtCSVyNwpAQCAtMTc2LDggKzE3Nyw2IEBACiAJc3QJJXIwLDQoJXIzKQkJIyBzdG9yZSBzaXplIG9mIGNodW5rCiAJc3QJJXI2LDgoJXIzKQkJIyBzdG9yZSB0eXBlIG9mIGNodW5rCiAJbGEJJXIzLDEyKCVyMykKLQlsCSVyNCwuTG1lbXNpemUtLkxQRzEoJXIxMykJICMgYWRkcmVzcyBvZiB2YXJpYWJsZSBtZW1vcnlfc2l6ZQotCXN0CSVyNSwwKCVyNCkJCSMgc3RvcmUgbGFzdCBlbmQgdG8gbWVtb3J5IHNpemUKIAlhaGkJJXIxMCwtMQkJCSMgdXBkYXRlIGNodW5rIG51bWJlcgogLkxjaGtsb29wOgogCWxyCSVyNiwlcjcJCQkjIHNldCBhY2Nlc3MgY29kZSB0byBsYXN0IGNjCkBAIC0yOTIsNyArMjkxLDYgQEAKIC5McGNtdnBnOi5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCArIC5MY2hrbXZwZwogLkxwY2lkdGU6LmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwICsgLkxjaGtpZHRlCiAuTHBjZGlhZzljOi5sb25nIDB4MDAwODAwMDAsMHg4MDAwMDAwMCArIC5MY2hrZGlhZzljCi0uTG1lbXNpemU6LmxvbmcgbWVtb3J5X3NpemUKIC5MbWNodW5rOi5sb25nCW1lbW9yeV9jaHVuawogLkxtZmxhZ3M6LmxvbmcJbWFjaGluZV9mbGFncwogLkxic3NfYmduOiAgLmxvbmcgX19ic3Nfc3RhcnQKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCmluZGV4IDQyZjU0ZDQuLmM1MjYyNzllMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCkBAIC03MCw3ICs3MCwyMCBAQAogCXNncgklcjUsJXI1IAkJIyBzZXQgc3JjLGxlbmd0aCBhbmQgcGFkIHRvIHplcm8KIAltdmNsZQklcjIsJXI0LDAJCSMgY2xlYXIgbWVtCiAJam8JLi00CQkJIyBicmFuY2ggYmFjaywgaWYgbm90IGZpbmlzaAorCQkJCQkjIHNldCBwcm9ncmFtIGNoZWNrIG5ldyBwc3cgbWFzaworCW12YwlfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNtc2stLkxQRzEoJXIxMykKKwlsYXJsCSVyMSwuTHNsb3dtZW1kZXRlY3QJIyBzZXQgcHJvZ3JhbSBjaGVjayBhZGRyZXNzCisJc3RnCSVyMSxfX0xDX1BHTV9ORVdfUFNXKzgKKwlsZ2hpCSVyMSwweGMKKwlkaWFnCSVyMCwlcjEsMHgyNjAJCSMgZ2V0IG1lbW9yeSBzaXplIG9mIHZpcnR1YWwgbWFjaGluZQorCWNncgklcjAsJXIxCQkJIyBkaWZmZXJlbnQ/IC0+IG9sZCBkZXRlY3Rpb24gcm91dGluZQorCWpuZQkuTHNsb3dtZW1kZXRlY3QKKwlhZ2hpCSVyMSwxCQkJIyBzaXplIGlzIG9uZSBtb3JlIHRoYW4gZW5kCisJbGFybAklcjIsbWVtb3J5X2NodW5rCisJc3RnCSVyMSw4KCVyMikJCSMgc3RvcmUgc2l6ZSBvZiBjaHVuaworCWoJLkxkb25lbWVtCiAKKy5Mc2xvd21lbWRldGVjdDoKIAlsCSVyMiwuTHJjcC0uTFBHMSglcjEzKQkjIFJlYWQgU0NQIGZvcmNlZCBjb21tYW5kIHdvcmQKIC5Mc2VydmljZWNhbGw6CiAJc3Rvc20JLkxwbWFzay0uTFBHMSglcjEzKSwweDAxCSMgYXV0aG9yaXplIGV4dCBpbnRlcnJ1cHRzCkBAIC0xMzksOCArMTUyLDYgQEAKIAkuaW50CTB4MTAwMDAwCiAKIC5MZmNodW5rOgotCQkJCQkjIHNldCBwcm9ncmFtIGNoZWNrIG5ldyBwc3cgbWFzawotCW12YwlfX0xDX1BHTV9ORVdfUFNXKDgpLC5McGNtc2stLkxQRzEoJXIxMykKIAogIwogIyBmaW5kIG1lbW9yeSBjaHVua3MuCkBAIC0xNzUsOCArMTg2LDYgQEAKIAlzdGcJJXIwLDgoJXIzKQkJIyBzdG9yZSBzaXplIG9mIGNodW5rCiAJc3QJJXI2LDIwKCVyMykJCSMgc3RvcmUgdHlwZSBvZiBjaHVuawogCWxhCSVyMywyNCglcjMpCi0JbGFybAklcjgsbWVtb3J5X3NpemUKLQlzdGcJJXI1LDAoJXI4KQkJIyBzdG9yZSBtZW1vcnkgc2l6ZQogCWFoaQklcjEwLC0xCQkJIyB1cGRhdGUgY2h1bmsgbnVtYmVyCiAuTGNoa2xvb3A6CiAJbHIJJXI2LCVyNwkJCSMgc2V0IGFjY2VzcyBjb2RlIHRvIGxhc3QgY2MKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCmluZGV4IDFmNWU3ODIuLmEzNmJlYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwpAQCAtMTMsMTIgKzEzLDIxIEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vY3BjbWQuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgorI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogCiAjZGVmaW5lIElQTF9QQVJNX0JMT0NLX1ZFUlNJT04gMAorI2RlZmluZSBMT0FEUEFSTV9MRU4gOAorCitleHRlcm4gY2hhciBzMzkwX3JlYWRpbmZvX3NjY2JbXTsKKyNkZWZpbmUgU0NDQl9WQUxJRCAoKigoX191MTYqKSZzMzkwX3JlYWRpbmZvX3NjY2JbNl0pID09IDB4MDAxMCkKKyNkZWZpbmUgU0NDQl9MT0FEUEFSTSAoJnMzOTBfcmVhZGluZm9fc2NjYlsyNF0pCisjZGVmaW5lIFNDQ0JfRkxBRyAoczM5MF9yZWFkaW5mb19zY2NiWzkxXSkKIAogZW51bSBpcGxfdHlwZSB7CiAJSVBMX1RZUEVfTk9ORQkgPSAxLApAQCAtMjg5LDkgKzI5OCwyNSBAQAogCiAvKiBDQ1cgaXBsIGRldmljZSBhdHRyaWJ1dGVzICovCiAKK3N0YXRpYyBzc2l6ZV90IGlwbF9jY3dfbG9hZHBhcm1fc2hvdyhzdHJ1Y3Qgc3Vic3lzdGVtICpzdWJzeXMsIGNoYXIgKnBhZ2UpCit7CisJY2hhciBsb2FkcGFybVtMT0FEUEFSTV9MRU4gKyAxXSA9IHt9OworCisJaWYgKCFTQ0NCX1ZBTElEKQorCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiI3Vua25vd24jXG4iKTsKKwltZW1jcHkobG9hZHBhcm0sIFNDQ0JfTE9BRFBBUk0sIExPQURQQVJNX0xFTik7CisJRUJDQVNDKGxvYWRwYXJtLCBMT0FEUEFSTV9MRU4pOworCXN0cnN0cmlwKGxvYWRwYXJtKTsKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGxvYWRwYXJtKTsKK30KKworc3RhdGljIHN0cnVjdCBzdWJzeXNfYXR0cmlidXRlIHN5c19pcGxfY2N3X2xvYWRwYXJtX2F0dHIgPQorCV9fQVRUUihsb2FkcGFybSwgMDQ0NCwgaXBsX2Njd19sb2FkcGFybV9zaG93LCBOVUxMKTsKKwogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlwbF9jY3dfYXR0cnNbXSA9IHsKIAkmc3lzX2lwbF90eXBlX2F0dHIuYXR0ciwKIAkmc3lzX2lwbF9kZXZpY2VfYXR0ci5hdHRyLAorCSZzeXNfaXBsX2Njd19sb2FkcGFybV9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTM0OCw4ICszNzMsNTcgQEAKIERFRklORV9JUExfQVRUUl9SVyhyZWlwbF9jY3csIGRldmljZSwgIjAuMC4lMDRsbHhcbiIsICIwLjAuJWxseFxuIiwKIAlyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubyk7CiAKK3N0YXRpYyB2b2lkIHJlaXBsX2dldF9hc2NpaV9sb2FkcGFybShjaGFyICpsb2FkcGFybSkKK3sKKwltZW1jcHkobG9hZHBhcm0sICZyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5sb2FkX3BhcmFtLAorCSAgICAgICBMT0FEUEFSTV9MRU4pOworCUVCQ0FTQyhsb2FkcGFybSwgTE9BRFBBUk1fTEVOKTsKKwlsb2FkcGFybVtMT0FEUEFSTV9MRU5dID0gMDsKKwlzdHJzdHJpcChsb2FkcGFybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlaXBsX2Njd19sb2FkcGFybV9zaG93KHN0cnVjdCBzdWJzeXN0ZW0gKnN1YnN5cywgY2hhciAqcGFnZSkKK3sKKwljaGFyIGJ1ZltMT0FEUEFSTV9MRU4gKyAxXTsKKworCXJlaXBsX2dldF9hc2NpaV9sb2FkcGFybShidWYpOworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgcmVpcGxfY2N3X2xvYWRwYXJtX3N0b3JlKHN0cnVjdCBzdWJzeXN0ZW0gKnN1YnN5cywKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBpLCBscF9sZW47CisKKwkvKiBpZ25vcmUgdHJhaWxpbmcgbmV3bGluZSAqLworCWxwX2xlbiA9IGxlbjsKKwlpZiAoKGxlbiA+IDApICYmIChidWZbbGVuIC0gMV0gPT0gJ1xuJykpCisJCWxwX2xlbi0tOworCS8qIGxvYWRwYXJtIGNhbiBoYXZlIG1heCA4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBibGFuayAqLworCWlmICgobHBfbGVuID4gTE9BRFBBUk1fTEVOKSB8fCAoKGxwX2xlbiA+IDApICYmIChidWZbMF0gPT0gJyAnKSkpCisJCXJldHVybiAtRUlOVkFMOworCS8qIGxvYWRwYXJtIGNhbiBvbmx5IGNvbnRhaW4gImEteixBLVosMC05LFNQLC4iICovCisJZm9yIChpID0gMDsgaSA8IGxwX2xlbjsgaSsrKSB7CisJCWlmIChpc2FscGhhKGJ1ZltpXSkgfHwgaXNkaWdpdChidWZbaV0pIHx8IChidWZbaV0gPT0gJyAnKSB8fAorCQkgICAgKGJ1ZltpXSA9PSAnLicpKQorCQkJY29udGludWU7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBpbml0aWFsaXplIGxvYWRwYXJtIHdpdGggYmxhbmtzICovCisJbWVtc2V0KCZyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5sb2FkX3BhcmFtLCAnICcsIExPQURQQVJNX0xFTik7CisJLyogY29weSBhbmQgY29udmVydCB0byBlYmNkaWMgKi8KKwltZW1jcHkoJnJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmxvYWRfcGFyYW0sIGJ1ZiwgbHBfbGVuKTsKKwlBU0NFQkMocmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cubG9hZF9wYXJhbSwgTE9BRFBBUk1fTEVOKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgc3lzX3JlaXBsX2Njd19sb2FkcGFybV9hdHRyID0KKwlfX0FUVFIobG9hZHBhcm0sIDA2NDQsIHJlaXBsX2Njd19sb2FkcGFybV9zaG93LAorCSAgICAgICByZWlwbF9jY3dfbG9hZHBhcm1fc3RvcmUpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcmVpcGxfY2N3X2F0dHJzW10gPSB7CiAJJnN5c19yZWlwbF9jY3dfZGV2aWNlX2F0dHIuYXR0ciwKKwkmc3lzX3JlaXBsX2Njd19sb2FkcGFybV9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTUwMiwyMyArNTc2LDYgQEAKIAogc3RhdGljIGRlY2xfc3Vic3lzKGR1bXAsIE5VTEwsIE5VTEwpOwogCi0jaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgZHVtcF9zbXBfc3RvcF9hbGwodm9pZCkKLXsKLQlpbnQgY3B1OwotCXByZWVtcHRfZGlzYWJsZSgpOwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQotCQkJY29udGludWU7Ci0JCXdoaWxlIChzaWduYWxfcHJvY2Vzc29yKGNwdSwgc2lncF9zdG9wKSA9PSBzaWdwX2J1c3kpCi0JCQl1ZGVsYXkoMTApOwotCX0KLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotI2Vsc2UKLSNkZWZpbmUgZHVtcF9zbXBfc3RvcF9hbGwoKSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQogLyoKICAqIFNodXRkb3duIGFjdGlvbnMgc2VjdGlvbgogICovCkBAIC01NzEsMTEgKzYyOCwxNCBAQAogewogCXN0cnVjdCBjY3dfZGV2X2lkIGRldmlkOwogCXN0YXRpYyBjaGFyIGJ1ZlsxMDBdOworCWNoYXIgbG9hZHBhcm1bTE9BRFBBUk1fTEVOICsgMV07CiAKIAlzd2l0Y2ggKHJlaXBsX3R5cGUpIHsKIAljYXNlIElQTF9UWVBFX0NDVzoKKwkJcmVpcGxfZ2V0X2FzY2lpX2xvYWRwYXJtKGxvYWRwYXJtKTsKIAkJcHJpbnRrKEtFUk5fRU1FUkcgInJlYm9vdCBvbiBjY3cgZGV2aWNlOiAwLjAuJTA0eFxuIiwKIAkJCXJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgImxvYWRwYXJtID0gJyVzJ1xuIiwgbG9hZHBhcm0pOwogCQlicmVhazsKIAljYXNlIElQTF9UWVBFX0ZDUDoKIAkJcHJpbnRrKEtFUk5fRU1FUkcgInJlYm9vdCBvbiBmY3AgZGV2aWNlOlxuIik7CkBAIC01ODgsMTIgKzY0OCwxOSBAQAogCXN3aXRjaCAocmVpcGxfbWV0aG9kKSB7CiAJY2FzZSBJUExfTUVUSE9EX0NDV19DSU86CiAJCWRldmlkLmRldm5vID0gcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm87CisJCWlmIChpcGxfZ2V0X3R5cGUoKSA9PSBJUExfVFlQRV9DQ1cgJiYgZGV2aWQuZGV2bm8gPT0gaXBsX2Rldm5vKQorCQkJZGlhZzMwOChESUFHMzA4X0lQTCwgTlVMTCk7CiAJCWRldmlkLnNzaWQgID0gMDsKIAkJcmVpcGxfY2N3X2RldigmZGV2aWQpOwogCQlicmVhazsKIAljYXNlIElQTF9NRVRIT0RfQ0NXX1ZNOgotCQlzcHJpbnRmKGJ1ZiwgIklQTCAlWCIsIHJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vKTsKLQkJY3BjbWQoYnVmLCBOVUxMLCAwLCBOVUxMKTsKKwkJaWYgKHN0cmxlbihsb2FkcGFybSkgPT0gMCkKKwkJCXNwcmludGYoYnVmLCAiSVBMICVYIiwKKwkJCQlyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubyk7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmLCAiSVBMICVYIExPQURQQVJNICclcyciLAorCQkJCXJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vLCBsb2FkcGFybSk7CisJCV9fY3BjbWQoYnVmLCBOVUxMLCAwLCBOVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBJUExfTUVUSE9EX0NDV19ESUFHOgogCQlkaWFnMzA4KERJQUczMDhfU0VULCByZWlwbF9ibG9ja19jY3cpOwpAQCAtNjA3LDE2ICs2NzQsMTcgQEAKIAkJZGlhZzMwOChESUFHMzA4X0lQTCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgSVBMX01FVEhPRF9GQ1BfUk9fVk06Ci0JCWNwY21kKCJJUEwiLCBOVUxMLCAwLCBOVUxMKTsKKwkJX19jcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgSVBMX01FVEhPRF9OT05FOgogCWRlZmF1bHQ6CiAJCWlmIChNQUNISU5FX0lTX1ZNKQotCQkJY3BjbWQoIklQTCIsIE5VTEwsIDAsIE5VTEwpOworCQkJX19jcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKIAl9Ci0JcGFuaWMoInJlaXBsIGZhaWxlZCFcbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJyZWJvb3QgZmFpbGVkIVxuIik7CisJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgZG9fZHVtcCh2b2lkKQpAQCAtNjM5LDE3ICs3MDcsMTcgQEAKIAogCXN3aXRjaCAoZHVtcF9tZXRob2QpIHsKIAljYXNlIElQTF9NRVRIT0RfQ0NXX0NJTzoKLQkJZHVtcF9zbXBfc3RvcF9hbGwoKTsKKwkJc21wX3NlbmRfc3RvcCgpOwogCQlkZXZpZC5kZXZubyA9IGR1bXBfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm87CiAJCWRldmlkLnNzaWQgID0gMDsKIAkJcmVpcGxfY2N3X2RldigmZGV2aWQpOwogCQlicmVhazsKIAljYXNlIElQTF9NRVRIT0RfQ0NXX1ZNOgotCQlkdW1wX3NtcF9zdG9wX2FsbCgpOworCQlzbXBfc2VuZF9zdG9wKCk7CiAJCXNwcmludGYoYnVmLCAiU1RPUkUgU1RBVFVTIik7Ci0JCWNwY21kKGJ1ZiwgTlVMTCwgMCwgTlVMTCk7CisJCV9fY3BjbWQoYnVmLCBOVUxMLCAwLCBOVUxMKTsKIAkJc3ByaW50ZihidWYsICJJUEwgJVgiLCBkdW1wX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vKTsKLQkJY3BjbWQoYnVmLCBOVUxMLCAwLCBOVUxMKTsKKwkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIElQTF9NRVRIT0RfQ0NXX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIGR1bXBfYmxvY2tfY2N3KTsKQEAgLTc0Niw2ICs4MTQsMTcgQEAKIAlyZWlwbF9ibG9ja19jY3ctPmhkci52ZXJzaW9uID0gSVBMX1BBUk1fQkxPQ0tfVkVSU0lPTjsKIAlyZWlwbF9ibG9ja19jY3ctPmhkci5ibGswX2xlbiA9IHNpemVvZihyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdyk7CiAJcmVpcGxfYmxvY2tfY2N3LT5oZHIucGJ0ID0gRElBRzMwOF9JUExfVFlQRV9DQ1c7CisJLyogY2hlY2sgaWYgcmVhZCBzY3AgaW5mbyB3b3JrZWQgYW5kIHNldCBsb2FkcGFybSAqLworCWlmIChTQ0NCX1ZBTElEKQorCQltZW1jcHkocmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cubG9hZF9wYXJhbSwKKwkJICAgICAgIFNDQ0JfTE9BRFBBUk0sIExPQURQQVJNX0xFTik7CisJZWxzZQorCQkvKiByZWFkIHNjcCBpbmZvIGZhaWxlZDogc2V0IGVtcHR5IGxvYWRwYXJtIChFQkNESUMgYmxhbmtzKSAqLworCQltZW1zZXQocmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cubG9hZF9wYXJhbSwgMHg0MCwKKwkJICAgICAgIExPQURQQVJNX0xFTik7CisJLyogRklYTUU6IGNoZWNrIGZvciBkaWFnMzA4X3NldF93b3JrcyB3aGVuIGVuYWJsaW5nIGRpYWcgY2N3IHJlaXBsICovCisJaWYgKCFNQUNISU5FX0lTX1ZNKQorCQlzeXNfcmVpcGxfY2N3X2xvYWRwYXJtX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAlpZiAoaXBsX2dldF90eXBlKCkgPT0gSVBMX1RZUEVfQ0NXKQogCQlyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubyA9IGlwbF9kZXZubzsKIAlyZWlwbF9jYXBhYmlsaXRpZXMgfD0gSVBMX1RZUEVfQ0NXOwpAQCAtODI3LDEzICs5MDYsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIGNoYXIgczM5MF9yZWFkaW5mb19zY2NiW107Ci0KIHN0YXRpYyBpbnQgX19pbml0IGR1bXBfZmNwX2luaXQodm9pZCkKIHsKIAlpbnQgcmM7CiAKLQlpZighKHMzOTBfcmVhZGluZm9fc2NjYls5MV0gJiAweDIpKQorCWlmKCEoU0NDQl9GTEFHICYgMHgyKSB8fCAhU0NDQl9WQUxJRCkKIAkJcmV0dXJuIDA7IC8qIExESVBMIERVTVAgaXMgbm90IGluc3RhbGxlZCAqLwogCWlmICghZGlhZzMwOF9zZXRfd29ya3MpCiAJCXJldHVybiAwOwpAQCAtOTMxLDMgKzEwMDgsNTMgQEAKIH0KIAogX19pbml0Y2FsbChzMzkwX2lwbF9pbml0KTsKKworc3RhdGljIExJU1RfSEVBRChyY2FsbCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHJjYWxsX211dGV4KTsKKwordm9pZCByZWdpc3Rlcl9yZXNldF9jYWxsKHN0cnVjdCByZXNldF9jYWxsICpyZXNldCkKK3sKKwltdXRleF9sb2NrKCZyY2FsbF9tdXRleCk7CisJbGlzdF9hZGQoJnJlc2V0LT5saXN0LCAmcmNhbGwpOworCW11dGV4X3VubG9jaygmcmNhbGxfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfcmVzZXRfY2FsbCk7CisKK3ZvaWQgdW5yZWdpc3Rlcl9yZXNldF9jYWxsKHN0cnVjdCByZXNldF9jYWxsICpyZXNldCkKK3sKKwltdXRleF9sb2NrKCZyY2FsbF9tdXRleCk7CisJbGlzdF9kZWwoJnJlc2V0LT5saXN0KTsKKwltdXRleF91bmxvY2soJnJjYWxsX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfcmVzZXRfY2FsbCk7CisKK3N0YXRpYyB2b2lkIGRvX3Jlc2V0X2NhbGxzKHZvaWQpCit7CisJc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNldCwgJnJjYWxsLCBsaXN0KQorCQlyZXNldC0+Zm4oKTsKK30KKworZXh0ZXJuIHZvaWQgcmVzZXRfbWNja19oYW5kbGVyKHZvaWQpOworCit2b2lkIHMzOTBfcmVzZXRfc3lzdGVtKHZvaWQpCit7CisJc3RydWN0IF9sb3djb3JlICpsYzsKKworCS8qIFN0YWNrIGZvciBpbnRlcnJ1cHQvbWFjaGluZSBjaGVjayBoYW5kbGVyICovCisJbGMgPSAoc3RydWN0IF9sb3djb3JlICopKHVuc2lnbmVkIGxvbmcpIHN0b3JlX3ByZWZpeCgpOworCWxjLT5wYW5pY19zdGFjayA9IFMzOTBfbG93Y29yZS5wYW5pY19zdGFjazsKKworCS8qIERpc2FibGUgcHJlZml4aW5nICovCisJc2V0X3ByZWZpeCgwKTsKKworCS8qIERpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCisJX19jdGxfY2xlYXJfYml0KDAsMjgpOworCisJLyogU2V0IG5ldyBtYWNoaW5lIGNoZWNrIGhhbmRsZXIgKi8KKwlTMzkwX2xvd2NvcmUubWNja19uZXdfcHN3Lm1hc2sgPSBQU1dfS0VSTkVMX0JJVFMgJiB+UFNXX01BU0tfTUNIRUNLOworCVMzOTBfbG93Y29yZS5tY2NrX25ld19wc3cuYWRkciA9CisJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpICZyZXNldF9tY2NrX2hhbmRsZXI7CisJZG9fcmVzZXRfY2FsbHMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggNjBiMWVhOS4uZjZkOWJjYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTEsMTUgKzEsMTAgQEAKIC8qCiAgKiBhcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwogICoKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNSwyMDA2CiAgKgotICogQXV0aG9yKHMpOiBSb2xmIEFkZWxzYmVyZ2VyIDxhZGVsc2JlcmdlckBkZS5pYm0uY29tPgotICoKLSAqLwotCi0vKgotICogczM5MF9tYWNoaW5lX2tleGVjLmMgLSBoYW5kbGUgdGhlIHRyYW5zaXRpb24gb2YgTGludXggYm9vdGluZyBhbm90aGVyIGtlcm5lbAotICogb24gdGhlIFMzOTAgYXJjaGl0ZWN0dXJlLgorICogQXV0aG9yKHMpOiBSb2xmIEFkZWxzYmVyZ2VyLAorICoJICAgICAgSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMjIsODYgKzE3LDQ5IEBACiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogCi1zdGF0aWMgdm9pZCBrZXhlY19oYWx0X2FsbF9jcHVzKHZvaWQgKik7Ci0KLXR5cGVkZWYgdm9pZCAoKnJlbG9jYXRlX2tlcm5lbF90KSAoa2ltYWdlX2VudHJ5X3QgKiwgdW5zaWduZWQgbG9uZyk7Cit0eXBlZGVmIHZvaWQgKCpyZWxvY2F0ZV9rZXJuZWxfdCkoa2ltYWdlX2VudHJ5X3QgKiwgdW5zaWduZWQgbG9uZyk7CiAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX2tlcm5lbFtdOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyByZWxvY2F0ZV9rZXJuZWxfbGVuOwogCi1pbnQKLW1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK2ludCBtYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7Ci0JdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXI7CisJdm9pZCAqcmVib290X2NvZGVfYnVmZmVyOwogCiAJLyogV2UgZG9uJ3Qgc3VwcG9ydCBhbnl0aGluZyBidXQgdGhlIGRlZmF1bHQgaW1hZ2UgdHlwZSBmb3Igbm93LiAqLwogCWlmIChpbWFnZS0+dHlwZSAhPSBLRVhFQ19UWVBFX0RFRkFVTFQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogR2V0IHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGUgYXNzZW1ibGVyIGNvZGUgc2hvdWxkIGJlIGNvcGllZCB0by4qLwotCXJlYm9vdF9jb2RlX2J1ZmZlciA9IHBhZ2VfdG9fcGZuKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSk8PFBBR0VfU0hJRlQ7CisJcmVib290X2NvZGVfYnVmZmVyID0gKHZvaWQgKikgcGFnZV90b19waHlzKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSk7CiAKIAkvKiBUaGVuIGNvcHkgaXQgKi8KLQltZW1jcHkoKHZvaWQgKikgcmVib290X2NvZGVfYnVmZmVyLCByZWxvY2F0ZV9rZXJuZWwsCi0JICAgICAgIHJlbG9jYXRlX2tlcm5lbF9sZW4pOworCW1lbWNweShyZWJvb3RfY29kZV9idWZmZXIsIHJlbG9jYXRlX2tlcm5lbCwgcmVsb2NhdGVfa2VybmVsX2xlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLW1hY2hpbmVfa2V4ZWNfY2xlYW51cChzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3ZvaWQgbWFjaGluZV9rZXhlY19jbGVhbnVwKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogewogfQogCi12b2lkCi1tYWNoaW5lX3NodXRkb3duKHZvaWQpCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJrZXhlYzogbWFjaGluZV9zaHV0ZG93biBjYWxsZWRcbiIpOwogfQogCi1OT1JFVF9UWVBFIHZvaWQKLW1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7Ci0JY2xlYXJfYWxsX3N1YmNoYW5uZWxzKCk7Ci0JY2lvX3Jlc2V0X2NoYW5uZWxfcGF0aHMoKTsKLQotCS8qIERpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCi0JY3RsX2NsZWFyX2JpdCgwLDI4KTsKLQotCW9uX2VhY2hfY3B1KGtleGVjX2hhbHRfYWxsX2NwdXMsIGltYWdlLCAwLCAwKTsKLQlmb3IgKDs7KTsKLX0KLQotZXh0ZXJuIHZvaWQgcGZhdWx0X2Zpbmkodm9pZCk7Ci0KLXN0YXRpYyB2b2lkCi1rZXhlY19oYWx0X2FsbF9jcHVzKHZvaWQgKmtlcm5lbF9pbWFnZSkKLXsKLQlzdGF0aWMgYXRvbWljX3QgY3B1aWQgPSBBVE9NSUNfSU5JVCgtMSk7Ci0JaW50IGNwdTsKLQlzdHJ1Y3Qga2ltYWdlICppbWFnZTsKIAlyZWxvY2F0ZV9rZXJuZWxfdCBkYXRhX21vdmVyOwogCi0jaWZkZWYgQ09ORklHX1BGQVVMVAotCWlmIChNQUNISU5FX0lTX1ZNKQotCQlwZmF1bHRfZmluaSgpOwotI2VuZGlmCisJc21wX3NlbmRfc3RvcCgpOworCXBmYXVsdF9maW5pKCk7CisJczM5MF9yZXNldF9zeXN0ZW0oKTsKIAotCWlmIChhdG9taWNfY21weGNoZygmY3B1aWQsIC0xLCBzbXBfcHJvY2Vzc29yX2lkKCkpICE9IC0xKQotCQlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wKTsKLQotCS8qIFdhaXQgZm9yIGFsbCBvdGhlciBjcHVzIHRvIGVudGVyIHN0b3BwZWQgc3RhdGUgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJCWNvbnRpbnVlOwotCQl3aGlsZSAoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKLQkJCWNwdV9yZWxheCgpOwotCX0KLQotCWltYWdlID0gKHN0cnVjdCBraW1hZ2UgKikga2VybmVsX2ltYWdlOwotCWRhdGFfbW92ZXIgPSAocmVsb2NhdGVfa2VybmVsX3QpCi0JCShwYWdlX3RvX3BmbihpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpIDw8IFBBR0VfU0hJRlQpOworCWRhdGFfbW92ZXIgPSAocmVsb2NhdGVfa2VybmVsX3QpIHBhZ2VfdG9fcGh5cyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOwogCiAJLyogQ2FsbCB0aGUgbW92aW5nIHJvdXRpbmUgKi8KLQkoKmRhdGFfbW92ZXIpICgmaW1hZ2UtPmhlYWQsIGltYWdlLT5zdGFydCk7CisJKCpkYXRhX21vdmVyKSgmaW1hZ2UtPmhlYWQsIGltYWdlLT5zdGFydCk7CisJZm9yICg7Oyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKaW5kZXggMDM0MDQ3Ny4uZjk0MzRkNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUwpAQCAtMTEsMTkgKzExLDEwIEBACiAJCS5nbG9ibAlkb19yZWlwbF9hc20KIGRvX3JlaXBsX2FzbToJYmFzcgklcjEzLDAKIC5McGcwOgkJbHBzdwkuTG5ld3Bzdy0uTHBnMCglcjEzKQotCi0JCSMgc3dpdGNoIG9mZiBsb3djb3JlIHByb3RlY3Rpb24KLQotLkxwZzE6CQlzdGN0bAklYzAsJWMwLC5MY3Rsc2F2ZTEtLkxwZzAoJXIxMykKLQkJc3RjdGwJJWMwLCVjMCwuTGN0bHNhdmUyLS5McGcwKCVyMTMpCi0JCW5pCS5MY3Rsc2F2ZTEtLkxwZzAoJXIxMyksMHhlZgotCQlsY3RsCSVjMCwlYzAsLkxjdGxzYXZlMS0uTHBnMCglcjEzKQotCi0JCSMgZG8gc3RvcmUgc3RhdHVzIG9mIGFsbCByZWdpc3RlcnMKKy5McGcxOgkJIyBkbyBzdG9yZSBzdGF0dXMgb2YgYWxsIHJlZ2lzdGVycwogCiAJCXN0bQklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEKIAkJc3RjdGwJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEKLQkJbXZjCV9fTENfQ1JFR1NfU0FWRV9BUkVBKDQpLC5MY3Rsc2F2ZTItLkxwZzAoJXIxMykKIAkJc3RhbQklYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQQogCQlzdHB4CV9fTENfUFJFRklYX1NBVkVfQVJFQQogCQlzdGNrYwkuTGNsa2NtcC0uTHBnMCglcjEzKQpAQCAtNTYsOCArNDcsNyBAQAogLkwwMDI6CQl0bQkuTGlwbGlyYis4LS5McGcwKCVyMTMpLDB4ZjMKIAkJanoJLkwwMDMKIAkJYmFzCSVyMTQsLkxkaXNhYi0uTHBnMCglcjEzKQotLkwwMDM6CQlzcHgJLkxudWxsLS5McGcwKCVyMTMpCi0JCXN0CSVyMSxfX0xDX1NVQkNIQU5ORUxfSUQKKy5MMDAzOgkJc3QJJXIxLF9fTENfU1VCQ0hBTk5FTF9JRAogCQlscHN3CTAKIAkJc2lncAkwLDAsMCg2KQogLkxkaXNhYjoJc3QJJXIxNCwuTGRpc3Bzdys0LS5McGcwKCVyMTMpCkBAIC02NSw5ICs1NSw2IEBACiAJCS5hbGlnbgk4CiAuTGNsa2NtcDoJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwCiAuTGFsbDoJCS5sb25nCTB4ZmYwMDAwMDAKLS5MbnVsbDoJCS5sb25nCTB4MDAwMDAwMDAKLS5MY3Rsc2F2ZTE6CS5sb25nCTB4MDAwMDAwMDAKLS5MY3Rsc2F2ZTI6CS5sb25nCTB4MDAwMDAwMDAKIAkJLmFsaWduCTgKIC5MbmV3cHN3OgkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDArLkxwZzEKIC5McGNuZXc6CS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTGVjcwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUwppbmRleCBkZTc0MzUwLi5mMThlZjI2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUwpAQCAtMTAsMTAgKzEwLDEwIEBACiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KIAkJLmdsb2JsCWRvX3JlaXBsX2FzbQogZG9fcmVpcGxfYXNtOgliYXNyCSVyMTMsMAorLkxwZzA6CQlscHN3ZQkuTG5ld3Bzdy0uTHBnMCglcjEzKQorLkxwZzE6CQkjIGRvIHN0b3JlIHN0YXR1cyBvZiBhbGwgcmVnaXN0ZXJzCiAKLQkJIyBkbyBzdG9yZSBzdGF0dXMgb2YgYWxsIHJlZ2lzdGVycwotCi0uTHBnMDoJCXN0ZwklcjEsLkxyZWdzYXZlLS5McGcwKCVyMTMpCisJCXN0ZwklcjEsLkxyZWdzYXZlLS5McGcwKCVyMTMpCiAJCWxnaGkJJXIxLDB4MTAwMAogCQlzdG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS0weDEwMDAoJXIxKQogCQlsZwklcjAsLkxyZWdzYXZlLS5McGcwKCVyMTMpCkBAIC0yNywxMSArMjcsNyBAQAogCQlzdHB0CV9fTENfQ1BVX1RJTUVSX1NBVkVfQVJFQS0weDEwMDAoJXIxKQogCQlzdGcJJXIxMywgX19MQ19QU1dfU0FWRV9BUkVBLTB4MTAwMCs4KCVyMSkKIAotCQlscHN3ZQkuTG5ld3Bzdy0uTHBnMCglcjEzKQotLkxwZzE6CQlsY3RsZwklYzYsJWM2LC5MYWxsLS5McGcwKCVyMTMpCi0JCXN0Y3RnCSVjMCwlYzAsLkxyZWdzYXZlLS5McGcwKCVyMTMpCi0JCW5pCS5McmVnc2F2ZSs0LS5McGcwKCVyMTMpLDB4ZWYKLQkJbGN0bGcJJWMwLCVjMCwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKKwkJbGN0bGcJJWM2LCVjNiwuTGFsbC0uTHBnMCglcjEzKQogCQlsZ3IJJXIxLCVyMgogCQltdmMJX19MQ19QR01fTkVXX1BTVygxNiksLkxwY25ldy0uTHBnMCglcjEzKQogCQlzdHNjaAkuTHNjaGliLS5McGcwKCVyMTMpCkBAIC01Niw4ICs1Miw3IEBACiAuTDAwMjoJCXRtCS5MaXBsaXJiKzgtLkxwZzAoJXIxMyksMHhmMwogCQlqegkuTDAwMwogCQliYXMJJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpCi0uTDAwMzoJCXNweAkuTG51bGwtLkxwZzAoJXIxMykKLQkJc3QJJXIxLF9fTENfU1VCQ0hBTk5FTF9JRAorLkwwMDM6CQlzdAklcjEsX19MQ19TVUJDSEFOTkVMX0lECiAJCWxoaQklcjEsMAkJICMgbW9kZSAwID0gZXNhCiAJCXNscgklcjAsJXIwIAkgIyBzZXQgY3B1aWQgdG8gemVybwogCQlzaWdwCSVyMSwlcjAsMHgxMgkgIyBzd2l0Y2ggdG8gZXNhIG1vZGUKQEAgLTcwLDcgKzY1LDYgQEAKIC5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKIC5MYWxsOgkJLnF1YWQJMHgwMDAwMDAwMGZmMDAwMDAwCiAuTHJlZ3NhdmU6CS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAotLkxudWxsOgkJLmxvbmcJMHgwMDAwMDAwMDAwMDAwMDAwCiAJCS5hbGlnbgkxNgogLyoKICAqIFRoZXNlIGFkZHJlc3NlcyBoYXZlIHRvIGJlIDMxIGJpdCBvdGhlcndpc2UKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgYi9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCmluZGV4IGY5ODk5ZmYuLjNiNDU2YjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpAQCAtMjYsOCArMjYsNyBAQAogCXJlbG9jYXRlX2tlcm5lbDoKIAkJYmFzcgklcjEzLDAJCSMgYmFzZSBhZGRyZXNzCiAJLmJhc2U6Ci0JCXN0bnNtCXN5c19tc2stLmJhc2UoJXIxMyksMHhmOAkjIGRpc2FibGUgREFUIGFuZCBJUlEgKGV4dGVybmFsKQotCQlzcHgJemVybzY0LS5iYXNlKCVyMTMpCSMgYWJzb2x1dGUgYWRkcmVzc2luZyBtb2RlCisJCXN0bnNtCXN5c19tc2stLmJhc2UoJXIxMyksMHhmYgkjIGRpc2FibGUgREFUCiAJCXN0Y3RsCSVjMCwlYzE1LGN0bHJlZ3MtLmJhc2UoJXIxMykKIAkJc3RtCSVyMCwlcjE1LGdwcnJlZ3MtLmJhc2UoJXIxMykKIAkJbGEJJXIxLGxvYWRfcHN3LS5iYXNlKCVyMTMpCkBAIC05Nyw4ICs5Niw2IEBACiAJCWxwc3cJMAkJIyBob3BlZnVsbHkgc3RhcnQgbmV3IGtlcm5lbC4uLgogCiAJCS5hbGlnbgk4Ci0JemVybzY0OgotCQkucXVhZAkwCiAJbG9hZF9wc3c6CiAJCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMAogCXN5c19tc2s6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbDY0LlMKaW5kZXggNGZiNDQzMC4uMWY5ZWEyMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWw2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUwpAQCAtMjcsOCArMjcsNyBAQAogCXJlbG9jYXRlX2tlcm5lbDoKIAkJYmFzcgklcjEzLDAJCSMgYmFzZSBhZGRyZXNzCiAJLmJhc2U6Ci0JCXN0bnNtCXN5c19tc2stLmJhc2UoJXIxMyksMHhmOAkjIGRpc2FibGUgREFUIGFuZCBJUlFzCi0JCXNweAl6ZXJvNjQtLmJhc2UoJXIxMykJIyBhYnNvbHV0ZSBhZGRyZXNzaW5nIG1vZGUKKwkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGZiCSMgZGlzYWJsZSBEQVQKIAkJc3RjdGcJJWMwLCVjMTUsY3RscmVncy0uYmFzZSglcjEzKQogCQlzdG1nCSVyMCwlcjE1LGdwcnJlZ3MtLmJhc2UoJXIxMykKIAkJbGdoaQklcjAsMwpAQCAtMTAwLDggKzk5LDYgQEAKIAkJbHBzdwkwCQkjIGhvcGVmdWxseSBzdGFydCBuZXcga2VybmVsLi4uCiAKIAkJLmFsaWduCTgKLQl6ZXJvNjQ6Ci0JCS5xdWFkCTAKIAlsb2FkX3BzdzoKIAkJLmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwCiAJc3lzX21zazoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVzZXQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVzZXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg2ODhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZXNldC5TCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiAgYXJjaC9zMzkwL2tlcm5lbC9yZXNldC5TCisgKgorICogICAgQ29weXJpZ2h0IChDKSBJQk0gQ29ycC4gMjAwNgorICogICAgQXV0aG9yKHMpOiBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CisKKyNpZmRlZiBDT05GSUdfNjRCSVQKKworCS5nbG9ibAlyZXNldF9tY2NrX2hhbmRsZXIKK3Jlc2V0X21jY2tfaGFuZGxlcjoKKwliYXNyCSVyMTMsMAorMDoJbGcJJXIxNSxfX0xDX1BBTklDX1NUQUNLCSMgbG9hZCBwYW5pYyBzdGFjaworCWFnaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlsZwklcjEsczM5MF9yZXNldF9tY2NrX2hhbmRsZXItMGIoJXIxMykKKwlsdGdyCSVyMSwlcjEKKwlqegkxZgorCWJhc3IJJXIxNCwlcjEKKzE6CWxhCSVyMSw0MDk1CisJbG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS00MDk1KCVyMSkKKwlscHN3ZQlfX0xDX01DS19PTERfUFNXCisKKwkuZ2xvYmwJczM5MF9yZXNldF9tY2NrX2hhbmRsZXIKK3MzOTBfcmVzZXRfbWNja19oYW5kbGVyOgorCS5xdWFkCTAKKworI2Vsc2UgLyogQ09ORklHXzY0QklUICovCisKKwkuZ2xvYmwJcmVzZXRfbWNja19oYW5kbGVyCityZXNldF9tY2NrX2hhbmRsZXI6CisJYmFzcgklcjEzLDAKKzA6CWwJJXIxNSxfX0xDX1BBTklDX1NUQUNLCSMgbG9hZCBwYW5pYyBzdGFjaworCWFoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAorCWwJJXIxLHMzOTBfcmVzZXRfbWNja19oYW5kbGVyLTBiKCVyMTMpCisJbHRyCSVyMSwlcjEKKwlqegkxZgorCWJhc3IJJXIxNCwlcjEKKzE6CWxtCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQQorCWxwc3cJX19MQ19NQ0tfT0xEX1BTVworCisJLmdsb2JsCXMzOTBfcmVzZXRfbWNja19oYW5kbGVyCitzMzkwX3Jlc2V0X21jY2tfaGFuZGxlcjoKKwkubG9uZwkwCisKKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCAyYWExM2U4Li5iOTI4ZmVjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC02MiwxMyArNjIsOSBAQAogdW5zaWduZWQgaW50IGNvbnNvbGVfbW9kZSA9IDA7CiB1bnNpZ25lZCBpbnQgY29uc29sZV9kZXZubyA9IC0xOwogdW5zaWduZWQgaW50IGNvbnNvbGVfaXJxID0gLTE7Ci11bnNpZ25lZCBsb25nIG1lbW9yeV9zaXplID0gMDsKIHVuc2lnbmVkIGxvbmcgbWFjaGluZV9mbGFncyA9IDA7Ci1zdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZSwgdHlwZTsKLX0gbWVtb3J5X2NodW5rW01FTU9SWV9DSFVOS1NdID0geyB7IDAgfSB9OwotI2RlZmluZSBDSFVOS19SRUFEX1dSSVRFIDAKLSNkZWZpbmUgQ0hVTktfUkVBRF9PTkxZIDEKKworc3RydWN0IG1lbV9jaHVuayBtZW1vcnlfY2h1bmtbTUVNT1JZX0NIVU5LU107CiB2b2xhdGlsZSBpbnQgX19jcHVfbG9naWNhbF9tYXBbTlJfQ1BVU107IC8qIGxvZ2ljYWwgY3B1IHRvIGNwdSBhZGRyZXNzICovCiB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgemhvbGVzX3NpemVbTUFYX05SX1pPTkVTXTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbWVtb3J5X2VuZDsKQEAgLTIyOSwxMSArMjI1LDExIEBACiAJY2hhciAqcHRyOwogCiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNKSB7Ci0JCV9fY3BjbWQoIlFVRVJZIENPTlNPTEUiLCBxdWVyeV9idWZmZXIsIDEwMjQsIE5VTEwpOworCQljcGNtZCgiUVVFUlkgQ09OU09MRSIsIHF1ZXJ5X2J1ZmZlciwgMTAyNCwgTlVMTCk7CiAJCWNvbnNvbGVfZGV2bm8gPSBzaW1wbGVfc3RydG91bChxdWVyeV9idWZmZXIgKyA1LCBOVUxMLCAxNik7CiAJCXB0ciA9IHN0cnN0cihxdWVyeV9idWZmZXIsICJTVUJDSEFOTkVMID0iKTsKIAkJY29uc29sZV9pcnEgPSBzaW1wbGVfc3RydG91bChwdHIgKyAxMywgTlVMTCwgMTYpOwotCQlfX2NwY21kKCJRVUVSWSBURVJNIiwgcXVlcnlfYnVmZmVyLCAxMDI0LCBOVUxMKTsKKwkJY3BjbWQoIlFVRVJZIFRFUk0iLCBxdWVyeV9idWZmZXIsIDEwMjQsIE5VTEwpOwogCQlwdHIgPSBzdHJzdHIocXVlcnlfYnVmZmVyLCAiQ09OTU9ERSIpOwogCQkvKgogCQkgKiBTZXQgdGhlIGNvbm1vZGUgdG8gMzIxNSBzbyB0aGF0IHRoZSBkZXZpY2UgcmVjb2duaXRpb24gCkBAIC0yNDIsNyArMjM4LDcgQEAKIAkJICogMzIxNSBhbmQgdGhlIDMyNzAgZHJpdmVyIHdpbGwgdHJ5IHRvIGFjY2VzcyB0aGUgY29uc29sZQogCQkgKiBkZXZpY2UgKDMyMTUgYXMgY29uc29sZSBhbmQgMzI3MCBhcyBub3JtYWwgdHR5KS4KIAkJICovCi0JCV9fY3BjbWQoIlRFUk0gQ09OTU9ERSAzMjE1IiwgTlVMTCwgMCwgTlVMTCk7CisJCWNwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDAsIE5VTEwpOwogCQlpZiAocHRyID09IE5VTEwpIHsKICNpZiBkZWZpbmVkKENPTkZJR19TQ0xQX0NPTlNPTEUpCiAJCQlTRVRfQ09OU09MRV9TQ0xQOwpAQCAtMjk5LDE0ICsyOTUsMTQgQEAKIHN0YXRpYyB2b2lkIGRvX21hY2hpbmVfaGFsdF9ub25zbXAodm9pZCkKIHsKICAgICAgICAgaWYgKE1BQ0hJTkVfSVNfVk0gJiYgc3RybGVuKHZtaGFsdF9jbWQpID4gMCkKLSAgICAgICAgICAgICAgICBjcGNtZCh2bWhhbHRfY21kLCBOVUxMLCAwLCBOVUxMKTsKKwkJX19jcGNtZCh2bWhhbHRfY21kLCBOVUxMLCAwLCBOVUxMKTsKICAgICAgICAgc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgZG9fbWFjaGluZV9wb3dlcl9vZmZfbm9uc21wKHZvaWQpCiB7CiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bXBvZmZfY21kKSA+IDApCi0gICAgICAgICAgICAgICAgY3BjbWQodm1wb2ZmX2NtZCwgTlVMTCwgMCwgTlVMTCk7CisJCV9fY3BjbWQodm1wb2ZmX2NtZCwgTlVMTCwgMCwgTlVMTCk7CiAgICAgICAgIHNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CiB9CiAKQEAgLTQ4OSw2ICs0ODUsMzcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnlfZW5kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByZWFsX3NpemUsIG1lbW9yeV9zaXplOworCXVuc2lnbmVkIGxvbmcgbWF4X21lbSwgbWF4X3BoeXM7CisJaW50IGk7CisKKwltZW1vcnlfc2l6ZSA9IHJlYWxfc2l6ZSA9IDA7CisJbWF4X3BoeXMgPSBWTUFMTE9DX0VORCAtIFZNQUxMT0NfTUlOX1NJWkU7CisJbWVtb3J5X2VuZCAmPSBQQUdFX01BU0s7CisKKwltYXhfbWVtID0gbWVtb3J5X2VuZCA/IG1pbihtYXhfcGh5cywgbWVtb3J5X2VuZCkgOiBtYXhfcGh5czsKKworCWZvciAoaSA9IDA7IGkgPCBNRU1PUllfQ0hVTktTOyBpKyspIHsKKwkJc3RydWN0IG1lbV9jaHVuayAqY2h1bmsgPSAmbWVtb3J5X2NodW5rW2ldOworCisJCXJlYWxfc2l6ZSA9IG1heChyZWFsX3NpemUsIGNodW5rLT5hZGRyICsgY2h1bmstPnNpemUpOworCQlpZiAoY2h1bmstPmFkZHIgPj0gbWF4X21lbSkgeworCQkJbWVtc2V0KGNodW5rLCAwLCBzaXplb2YoKmNodW5rKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSA+IG1heF9tZW0pCisJCQljaHVuay0+c2l6ZSA9IG1heF9tZW0gLSBjaHVuay0+YWRkcjsKKwkJbWVtb3J5X3NpemUgPSBtYXgobWVtb3J5X3NpemUsIGNodW5rLT5hZGRyICsgY2h1bmstPnNpemUpOworCX0KKwlpZiAoIW1lbW9yeV9lbmQpCisJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc2l6ZTsKKwlpZiAocmVhbF9zaXplID4gbWVtb3J5X2VuZCkKKwkJcHJpbnRrKCJNb3JlIG1lbW9yeSBkZXRlY3RlZCB0aGFuIHN1cHBvcnRlZC4gVW51c2VkOiAlbHVrXG4iLAorCQkgICAgICAgKHJlYWxfc2l6ZSAtIG1lbW9yeV9lbmQpID4+IDEwKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0CiBzZXR1cF9tZW1vcnkodm9pZCkKIHsKQEAgLTY0NSw4ICs2NzIsNiBAQAogCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJl9lZGF0YTsKIAlpbml0X21tLmJyayA9ICh1bnNpZ25lZCBsb25nKSAmX2VuZDsKIAotCW1lbW9yeV9lbmQgPSBtZW1vcnlfc2l6ZTsKLQogCWlmIChNQUNISU5FX0hBU19NVkNPUykKIAkJbWVtY3B5KCZ1YWNjZXNzLCAmdWFjY2Vzc19tdmNvcywgc2l6ZW9mKHVhY2Nlc3MpKTsKIAllbHNlCkBAIC02NTQsMjAgKzY3OSw3IEBACiAKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCW1lbW9yeV9lbmQgJj0gfjB4NDAwMDAwVUw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCBzb21lIGZyZWUgdmlydHVhbCBzcGFjZSB0byBiZSBhYmxlIHRvIGRvIHZtYWxsb2MuCi0gICAgICAgICAqIE9uIGEgbWFjaGluZSB3aXRoIDJHQiBtZW1vcnkgd2UgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhdAotICAgICAgICAgKiBsZWFzdCAxMjggTUIgZnJlZSBzcGFjZSBmb3Igdm1hbGxvYy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtZW1vcnlfZW5kID4gMTkyMCoxMDI0KjEwMjQpCi0gICAgICAgICAgICAgICAgbWVtb3J5X2VuZCA9IDE5MjAqMTAyNCoxMDI0OwotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0JbWVtb3J5X2VuZCAmPSB+MHgyMDAwMDBVTDsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQorCXNldHVwX21lbW9yeV9lbmQoKTsKIAlzZXR1cF9tZW1vcnkoKTsKIAlzZXR1cF9yZXNvdXJjZXMoKTsKIAlzZXR1cF9sb3djb3JlKCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCA2MjgyMjI0Li4xOTA5MGY3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTIzMCwxOCArMjMwLDM3IEBACiAgICAgICAgIH0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGRvX3dhaXRfZm9yX3N0b3Aodm9pZCkKK3sKKwlpbnQgY3B1OworCisJLyogV2FpdCBmb3IgYWxsIG90aGVyIGNwdXMgdG8gZW50ZXIgc3RvcHBlZCBzdGF0ZSAqLworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQkJY29udGludWU7CisJCXdoaWxlKCFzbXBfY3B1X25vdF9ydW5uaW5nKGNwdSkpCisJCQljcHVfcmVsYXgoKTsKKwl9Cit9CisKIC8qCiAgKiB0aGlzIGZ1bmN0aW9uIHNlbmRzIGEgJ3N0b3AnIHNpZ3AgdG8gYWxsIG90aGVyIENQVXMgaW4gdGhlIHN5c3RlbS4KICAqIGl0IGdvZXMgc3RyYWlnaHQgdGhyb3VnaC4KICAqLwogdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCiB7CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cy9tYWNoaW5lIGNoZWNrcyAqLworCV9fbG9hZF9wc3dfbWFzayhQU1dfS0VSTkVMX0JJVFMgJiB+UFNXX01BU0tfTUNIRUNLKTsKKwogICAgICAgICAvKiB3cml0ZSBtYWdpYyBudW1iZXIgdG8gemVybyBwYWdlIChhYnNvbHV0ZSAwKSAqLwogCWxvd2NvcmVfcHRyW3NtcF9wcm9jZXNzb3JfaWQoKV0tPnBhbmljX21hZ2ljID0gX19QQU5JQ19NQUdJQzsKIAogCS8qIHN0b3Agb3RoZXIgcHJvY2Vzc29ycy4gKi8KIAlkb19zZW5kX3N0b3AoKTsKIAorCS8qIHdhaXQgdW50aWwgb3RoZXIgcHJvY2Vzc29ycyBhcmUgc3RvcHBlZCAqLworCWRvX3dhaXRfZm9yX3N0b3AoKTsKKwogCS8qIHN0b3JlIHN0YXR1cyBvZiBvdGhlciBwcm9jZXNzb3JzLiAqLwogCWRvX3N0b3JlX3N0YXR1cygpOwogfQpAQCAtMjUwLDg4ICsyNjksMjggQEAKICAqIFJlYm9vdCwgaGFsdCBhbmQgcG93ZXJfb2ZmIHJvdXRpbmVzIGZvciBTTVAuCiAgKi8KIAotc3RhdGljIHZvaWQgZG9fbWFjaGluZV9yZXN0YXJ0KHZvaWQgKiBfX3VudXNlZCkKLXsKLQlpbnQgY3B1OwotCXN0YXRpYyBhdG9taWNfdCBjcHVpZCA9IEFUT01JQ19JTklUKC0xKTsKLQotCWlmIChhdG9taWNfY21weGNoZygmY3B1aWQsIC0xLCBzbXBfcHJvY2Vzc29yX2lkKCkpICE9IC0xKQotCQlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wKTsKLQotCS8qIFdhaXQgZm9yIGFsbCBvdGhlciBjcHVzIHRvIGVudGVyIHN0b3BwZWQgc3RhdGUgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJCWNvbnRpbnVlOwotCQl3aGlsZSghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQotCQkJY3B1X3JlbGF4KCk7Ci0JfQotCi0JLyogU3RvcmUgc3RhdHVzIG9mIG90aGVyIGNwdXMuICovCi0JZG9fc3RvcmVfc3RhdHVzKCk7Ci0KLQkvKgotCSAqIEZpbmFsbHkgY2FsbCByZWlwbC4gQmVjYXVzZSB3ZSB3YWl0ZWQgZm9yIGFsbCBvdGhlcgotCSAqIGNwdXMgdG8gZW50ZXIgdGhpcyBmdW5jdGlvbiB3ZSBrbm93IHRoYXQgdGhleSBkbwotCSAqIG5vdCBob2xkIGFueSBzMzkwaXJxLWxvY2tzICh0aGUgY3B1cyBoYXZlIGJlZW4KLQkgKiBpbnRlcnJ1cHRlZCBieSBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgYW5kIHMzOTBpcnEKLQkgKiBsb2NrcyBhcmUgYWx3YXlzIGhlbGQgZGlzYWJsZWQpLgotCSAqLwotCWRvX3JlaXBsKCk7Ci19Ci0KIHZvaWQgbWFjaGluZV9yZXN0YXJ0X3NtcChjaGFyICogX191bnVzZWQpIAogewotICAgICAgICBvbl9lYWNoX2NwdShkb19tYWNoaW5lX3Jlc3RhcnQsIE5VTEwsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBkb193YWl0X2Zvcl9zdG9wKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBjclsxNl07Ci0KLQlfX2N0bF9zdG9yZShjciwgMCwgMTUpOwotCWNyWzBdICY9IH4weGZmZmY7Ci0JY3JbNl0gPSAwOwotCV9fY3RsX2xvYWQoY3IsIDAsIDE1KTsKLQlmb3IgKDs7KQotCQllbmFibGVkX3dhaXQoKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fbWFjaGluZV9oYWx0KHZvaWQgKiBfX3VudXNlZCkKLXsKLQlzdGF0aWMgYXRvbWljX3QgY3B1aWQgPSBBVE9NSUNfSU5JVCgtMSk7Ci0KLQlpZiAoYXRvbWljX2NtcHhjaGcoJmNwdWlkLCAtMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9PSAtMSkgewotCQlzbXBfc2VuZF9zdG9wKCk7Ci0JCWlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bWhhbHRfY21kKSA+IDApCi0JCQljcGNtZCh2bWhhbHRfY21kLCBOVUxMLCAwLCBOVUxMKTsKLQkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksCi0JCQkJIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKLQl9Ci0JZG9fd2FpdF9mb3Jfc3RvcCgpOworCXNtcF9zZW5kX3N0b3AoKTsKKwlkb19yZWlwbCgpOwogfQogCiB2b2lkIG1hY2hpbmVfaGFsdF9zbXAodm9pZCkKIHsKLSAgICAgICAgb25fZWFjaF9jcHUoZG9fbWFjaGluZV9oYWx0LCBOVUxMLCAwLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fbWFjaGluZV9wb3dlcl9vZmYodm9pZCAqIF9fdW51c2VkKQotewotCXN0YXRpYyBhdG9taWNfdCBjcHVpZCA9IEFUT01JQ19JTklUKC0xKTsKLQotCWlmIChhdG9taWNfY21weGNoZygmY3B1aWQsIC0xLCBzbXBfcHJvY2Vzc29yX2lkKCkpID09IC0xKSB7Ci0JCXNtcF9zZW5kX3N0b3AoKTsKLQkJaWYgKE1BQ0hJTkVfSVNfVk0gJiYgc3RybGVuKHZtcG9mZl9jbWQpID4gMCkKLQkJCWNwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDAsIE5VTEwpOwotCQlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwKLQkJCQkgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOwotCX0KLQlkb193YWl0X2Zvcl9zdG9wKCk7CisJc21wX3NlbmRfc3RvcCgpOworCWlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bWhhbHRfY21kKSA+IDApCisJCV9fY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCwgTlVMTCk7CisJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKKwlmb3IgKDs7KTsKIH0KIAogdm9pZCBtYWNoaW5lX3Bvd2VyX29mZl9zbXAodm9pZCkKIHsKLSAgICAgICAgb25fZWFjaF9jcHUoZG9fbWFjaGluZV9wb3dlcl9vZmYsIE5VTEwsIDAsIDApOworCXNtcF9zZW5kX3N0b3AoKTsKKwlpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1wb2ZmX2NtZCkgPiAwKQorCQlfX2NwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDAsIE5VTEwpOworCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CisJZm9yICg7Oyk7CiB9CiAKIC8qCkBAIC01MDEsOCArNDYwLDYgQEAKICAqLwogZXh0ZXJuIHZvaWQgaW5pdF9jcHVfdGltZXIodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0X2NwdV92dGltZXIodm9pZCk7Ci1leHRlcm4gaW50IHBmYXVsdF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGZhdWx0X2Zpbmkodm9pZCk7CiAKIGludCBfX2RldmluaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQgKmNwdXZvaWQpCiB7CkBAIC01MTQsMTEgKzQ3MSw5IEBACiAjaWZkZWYgQ09ORklHX1ZJUlRfVElNRVIKICAgICAgICAgaW5pdF9jcHVfdnRpbWVyKCk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUEZBVUxUCiAJLyogRW5hYmxlIHBmYXVsdCBwc2V1ZG8gcGFnZSBmYXVsdHMgb24gdGhpcyBjcHUuICovCi0JaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCXBmYXVsdF9pbml0KCk7Ci0jZW5kaWYKKwlwZmF1bHRfaW5pdCgpOworCiAJLyogTWFyayB0aGlzIGNwdSBhcyBvbmxpbmUgKi8KIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOwogCS8qIFN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCkBAIC03MDgsMTEgKzY2Myw4IEBACiAJfQogCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKIAotI2lmZGVmIENPTkZJR19QRkFVTFQKIAkvKiBEaXNhYmxlIHBmYXVsdCBwc2V1ZG8gcGFnZSBmYXVsdHMgb24gdGhpcyBjcHUuICovCi0JaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCXBmYXVsdF9maW5pKCk7Ci0jZW5kaWYKKwlwZmF1bHRfZmluaSgpOwogCiAJbWVtc2V0KCZjcl9wYXJtcy5vcnZhbHMsIDAsIHNpemVvZihjcl9wYXJtcy5vcnZhbHMpKTsKIAltZW1zZXQoJmNyX3Bhcm1zLmFuZHZhbHMsIDB4ZmYsIHNpemVvZihjcl9wYXJtcy5hbmR2YWxzKSk7CkBAIC04NjAsNCArODEyLDMgQEAKIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogRVhQT1JUX1NZTUJPTChzbXBfZ2V0X2NwdSk7CiBFWFBPUlRfU1lNQk9MKHNtcF9wdXRfY3B1KTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IDkyZWNmZmIuLjNjYmIwZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTU4LDEyICs1OCw2IEBACiAKIGV4dGVybiBwZ21fY2hlY2tfaGFuZGxlcl90IGRvX3Byb3RlY3Rpb25fZXhjZXB0aW9uOwogZXh0ZXJuIHBnbV9jaGVja19oYW5kbGVyX3QgZG9fZGF0X2V4Y2VwdGlvbjsKLSNpZmRlZiBDT05GSUdfUEZBVUxUCi1leHRlcm4gaW50IHBmYXVsdF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGZhdWx0X2Zpbmkodm9pZCk7Ci1leHRlcm4gdm9pZCBwZmF1bHRfaW50ZXJydXB0KF9fdTE2IGVycm9yX2NvZGUpOwotc3RhdGljIGV4dF9pbnRfaW5mb190IGV4dF9pbnRfcGZhdWx0OwotI2VuZGlmCiBleHRlcm4gcGdtX2NoZWNrX2hhbmRsZXJfdCBkb19tb25pdG9yX2NhbGw7CiAKICNkZWZpbmUgc3RhY2tfcG9pbnRlciAoeyB2b2lkICoqc3A7IGFzbSgibGEgJTAsMCgxNSkiIDogIj0mZCIgKHNwKSk7IHNwOyB9KQpAQCAtMTM1LDcgKzEyOSw3IEBACiAJfQogfQogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICogc3RhY2spCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcjE1IGFzbSAoIjE1Iik7CiAJdW5zaWduZWQgbG9uZyBzcDsKQEAgLTE1Nyw2ICsxNTEsOSBAQAogCQlfX3Nob3dfdHJhY2Uoc3AsIFMzOTBfbG93Y29yZS50aHJlYWRfaW5mbywKIAkJCSAgICAgUzM5MF9sb3djb3JlLnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUpOwogCXByaW50aygiXG4iKTsKKwlpZiAoIXRhc2spCisJCXRhc2sgPSBjdXJyZW50OworCWRlYnVnX3Nob3dfaGVsZF9sb2Nrcyh0YXNrKTsKIH0KIAogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApCkBAIC03MzksMjIgKzczNiw1IEBACiAgICAgICAgIHBnbV9jaGVja190YWJsZVsweDFDXSA9ICZzcGFjZV9zd2l0Y2hfZXhjZXB0aW9uOwogICAgICAgICBwZ21fY2hlY2tfdGFibGVbMHgxRF0gPSAmaGZwX3NxcnRfZXhjZXB0aW9uOwogCXBnbV9jaGVja190YWJsZVsweDQwXSA9ICZkb19tb25pdG9yX2NhbGw7Ci0KLQlpZiAoTUFDSElORV9JU19WTSkgewotI2lmZGVmIENPTkZJR19QRkFVTFQKLQkJLyoKLQkJICogVHJ5IHRvIGdldCBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIGdvaW5nLgotCQkgKi8KLQkJaWYgKHJlZ2lzdGVyX2Vhcmx5X2V4dGVybmFsX2ludGVycnVwdCgweDI2MDMsIHBmYXVsdF9pbnRlcnJ1cHQsCi0JCQkJCQkgICAgICAmZXh0X2ludF9wZmF1bHQpICE9IDApCi0JCQlwYW5pYygiQ291bGRuJ3QgcmVxdWVzdCBleHRlcm5hbCBpbnRlcnJ1cHQgMHgyNjAzIik7Ci0KLQkJaWYgKHBmYXVsdF9pbml0KCkgPT0gMCkgCi0JCQlyZXR1cm47Ci0JCQotCQkvKiBUb3VnaCBsdWNrLCBubyBwZmF1bHQuICovCi0JCXVucmVnaXN0ZXJfZWFybHlfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MjYwMywgcGZhdWx0X2ludGVycnVwdCwKLQkJCQkJCSAgICAmZXh0X2ludF9wZmF1bHQpOwotI2VuZGlmCi0JfQorCXBmYXVsdF9pcnFfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZSBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKaW5kZXggYjBjZmE2Yy4uYjVmOTRjZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvbGliL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBFWFRSQV9BRkxBR1MgOj0gLXRyYWRpdGlvbmFsCiAKLWxpYi15ICs9IGRlbGF5Lm8gc3RyaW5nLm8gdWFjY2Vzc19zdGQubworbGliLXkgKz0gZGVsYXkubyBzdHJpbmcubyB1YWNjZXNzX3N0ZC5vIHVhY2Nlc3NfcHQubwogbGliLSQoQ09ORklHXzMyQklUKSArPSBkaXY2NC5vCiBsaWItJChDT05GSUdfNjRCSVQpICs9IHVhY2Nlc3NfbXZjb3MubwogbGliLSQoQ09ORklHX1NNUCkgKz0gc3BpbmxvY2subwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwppbmRleCAxMjFiMjkzLi5mOWEyM2Q1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwpAQCAtMjcsNiArMjcsOSBAQAogI2RlZmluZSBTTFIJInNsZ3IiCiAjZW5kaWYKIAorZXh0ZXJuIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9zdGQoc2l6ZV90LCBjb25zdCB2b2lkIF9fdXNlciAqLCB2b2lkICopOworZXh0ZXJuIHNpemVfdCBjb3B5X3RvX3VzZXJfc3RkKHNpemVfdCwgdm9pZCBfX3VzZXIgKiwgY29uc3Qgdm9pZCAqKTsKKwogc2l6ZV90IGNvcHlfZnJvbV91c2VyX212Y29zKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDB4ODFVTDsKQEAgLTY2LDYgKzY5LDEzIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3NpemVfdCBjb3B5X2Zyb21fdXNlcl9tdmNvc19jaGVjayhzaXplX3Qgc2l6ZSwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKK3sKKwlpZiAoc2l6ZSA8PSAyNTYpCisJCXJldHVybiBjb3B5X2Zyb21fdXNlcl9zdGQoc2l6ZSwgcHRyLCB4KTsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXJfbXZjb3Moc2l6ZSwgcHRyLCB4KTsKK30KKwogc2l6ZV90IGNvcHlfdG9fdXNlcl9tdmNvcyhzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgY29uc3Qgdm9pZCAqeCkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtKCIwIikgPSAweDgxMDAwMFVMOwpAQCAtOTUsNiArMTA1LDEzIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3NpemVfdCBjb3B5X3RvX3VzZXJfbXZjb3NfY2hlY2soc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICpwdHIsIGNvbnN0IHZvaWQgKngpCit7CisJaWYgKHNpemUgPD0gMjU2KQorCQlyZXR1cm4gY29weV90b191c2VyX3N0ZChzaXplLCBwdHIsIHgpOworCXJldHVybiBjb3B5X3RvX3VzZXJfbXZjb3Moc2l6ZSwgcHRyLCB4KTsKK30KKwogc2l6ZV90IGNvcHlfaW5fdXNlcl9tdmNvcyhzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtKCIwIikgPSAweDgxMDA4MVVMOwpAQCAtMTQ1LDE4ICsxNjIsMTYgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotZXh0ZXJuIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9zdGRfc21hbGwoc2l6ZV90LCBjb25zdCB2b2lkIF9fdXNlciAqLCB2b2lkICopOwotZXh0ZXJuIHNpemVfdCBjb3B5X3RvX3VzZXJfc3RkX3NtYWxsKHNpemVfdCwgdm9pZCBfX3VzZXIgKiwgY29uc3Qgdm9pZCAqKTsKIGV4dGVybiBzaXplX3Qgc3Rybmxlbl91c2VyX3N0ZChzaXplX3QsIGNvbnN0IGNoYXIgX191c2VyICopOwogZXh0ZXJuIHNpemVfdCBzdHJuY3B5X2Zyb21fdXNlcl9zdGQoc2l6ZV90LCBjb25zdCBjaGFyIF9fdXNlciAqLCBjaGFyICopOwogZXh0ZXJuIGludCBmdXRleF9hdG9taWNfb3AoaW50LCBpbnQgX191c2VyICosIGludCwgaW50ICopOwogZXh0ZXJuIGludCBmdXRleF9hdG9taWNfY21weGNoZyhpbnQgX191c2VyICosIGludCwgaW50KTsKIAogc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3NfbXZjb3MgPSB7Ci0JLmNvcHlfZnJvbV91c2VyID0gY29weV9mcm9tX3VzZXJfbXZjb3MsCi0JLmNvcHlfZnJvbV91c2VyX3NtYWxsID0gY29weV9mcm9tX3VzZXJfc3RkX3NtYWxsLAotCS5jb3B5X3RvX3VzZXIgPSBjb3B5X3RvX3VzZXJfbXZjb3MsCi0JLmNvcHlfdG9fdXNlcl9zbWFsbCA9IGNvcHlfdG9fdXNlcl9zdGRfc21hbGwsCisJLmNvcHlfZnJvbV91c2VyID0gY29weV9mcm9tX3VzZXJfbXZjb3NfY2hlY2ssCisJLmNvcHlfZnJvbV91c2VyX3NtYWxsID0gY29weV9mcm9tX3VzZXJfc3RkLAorCS5jb3B5X3RvX3VzZXIgPSBjb3B5X3RvX3VzZXJfbXZjb3NfY2hlY2ssCisJLmNvcHlfdG9fdXNlcl9zbWFsbCA9IGNvcHlfdG9fdXNlcl9zdGQsCiAJLmNvcHlfaW5fdXNlciA9IGNvcHlfaW5fdXNlcl9tdmNvcywKIAkuY2xlYXJfdXNlciA9IGNsZWFyX3VzZXJfbXZjb3MsCiAJLnN0cm5sZW5fdXNlciA9IHN0cm5sZW5fdXNlcl9zdGQsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzc19wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDFiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICBhcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYworICoKKyAqICBVc2VyIGFjY2VzcyBmdW5jdGlvbnMgYmFzZWQgb24gcGFnZSB0YWJsZSB3YWxrcy4KKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDYKKyAqICAgIEF1dGhvcihzKTogR2VyYWxkIFNjaGFlZmVyIChnZXJhbGQuc2NoYWVmZXJAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2Z1dGV4Lmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faGFuZGxlX2ZhdWx0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJIGludCB3cml0ZV9hY2Nlc3MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJaW50IHJldCA9IC1FRkFVTFQ7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOworCWlmICh1bmxpa2VseSghdm1hKSkKKwkJZ290byBvdXQ7CisJaWYgKHVubGlrZWx5KHZtYS0+dm1fc3RhcnQgPiBhZGRyZXNzKSkgeworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXdyaXRlX2FjY2VzcykgeworCQkvKiBwYWdlIG5vdCBwcmVzZW50LCBjaGVjayB2bSBmbGFncyAqLworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQlnb3RvIG91dDsKKwl9CisKK3N1cnZpdmU6CisJc3dpdGNoIChoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGVfYWNjZXNzKSkgeworCWNhc2UgVk1fRkFVTFRfTUlOT1I6CisJCWN1cnJlbnQtPm1pbl9mbHQrKzsKKwkJYnJlYWs7CisJY2FzZSBWTV9GQVVMVF9NQUpPUjoKKwkJY3VycmVudC0+bWFqX2ZsdCsrOworCQlicmVhazsKKwljYXNlIFZNX0ZBVUxUX1NJR0JVUzoKKwkJZ290byBvdXRfc2lnYnVzOworCWNhc2UgVk1fRkFVTFRfT09NOgorCQlnb3RvIG91dF9vZl9tZW1vcnk7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJldCA9IDA7CitvdXQ6CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gcmV0OworCitvdXRfb2ZfbWVtb3J5OgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJaWYgKGN1cnJlbnQtPnBpZCA9PSAxKSB7CisJCXlpZWxkKCk7CisJCWdvdG8gc3Vydml2ZTsKKwl9CisJcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCBjdXJyZW50LT5jb21tKTsKKwlyZXR1cm4gcmV0OworCitvdXRfc2lnYnVzOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJY3VycmVudC0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAweDExOworCWZvcmNlX3NpZyhTSUdCVVMsIGN1cnJlbnQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IF9fdXNlcl9jb3B5X3B0KHVuc2lnbmVkIGxvbmcgdWFkZHIsIHZvaWQgKmtwdHIsCisJCQkJICAgIHNpemVfdCBuLCBpbnQgd3JpdGVfdXNlcikKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBwZm4sIGRvbmUsIHNpemU7CisJcGdkX3QgKnBnZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisJdm9pZCAqZnJvbSwgKnRvOworCisJZG9uZSA9IDA7CityZXRyeToKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWRvIHsKKwkJcGdkID0gcGdkX29mZnNldChtbSwgdWFkZHIpOworCQlpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpCisJCQlnb3RvIGZhdWx0OworCisJCXBtZCA9IHBtZF9vZmZzZXQocGdkLCB1YWRkcik7CisJCWlmIChwbWRfbm9uZSgqcG1kKSB8fCB1bmxpa2VseShwbWRfYmFkKCpwbWQpKSkKKwkJCWdvdG8gZmF1bHQ7CisKKwkJcHRlID0gcHRlX29mZnNldF9tYXAocG1kLCB1YWRkcik7CisJCWlmICghcHRlIHx8ICFwdGVfcHJlc2VudCgqcHRlKSB8fAorCQkgICAgKHdyaXRlX3VzZXIgJiYgIXB0ZV93cml0ZSgqcHRlKSkpCisJCQlnb3RvIGZhdWx0OworCisJCXBmbiA9IHB0ZV9wZm4oKnB0ZSk7CisJCWlmICghcGZuX3ZhbGlkKHBmbikpCisJCQlnb3RvIG91dDsKKworCQlvZmZzZXQgPSB1YWRkciAmIChQQUdFX1NJWkUgLSAxKTsKKwkJc2l6ZSA9IG1pbihuIC0gZG9uZSwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwkJaWYgKHdyaXRlX3VzZXIpIHsKKwkJCXRvID0gKHZvaWQgKikoKHBmbiA8PCBQQUdFX1NISUZUKSArIG9mZnNldCk7CisJCQlmcm9tID0ga3B0ciArIGRvbmU7CisJCX0gZWxzZSB7CisJCQlmcm9tID0gKHZvaWQgKikoKHBmbiA8PCBQQUdFX1NISUZUKSArIG9mZnNldCk7CisJCQl0byA9IGtwdHIgKyBkb25lOworCQl9CisJCW1lbWNweSh0bywgZnJvbSwgc2l6ZSk7CisJCWRvbmUgKz0gc2l6ZTsKKwkJdWFkZHIgKz0gc2l6ZTsKKwl9IHdoaWxlIChkb25lIDwgbik7CitvdXQ6CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXJldHVybiBuIC0gZG9uZTsKK2ZhdWx0OgorCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlpZiAoX19oYW5kbGVfZmF1bHQobW0sIHVhZGRyLCB3cml0ZV91c2VyKSkKKwkJcmV0dXJuIG4gLSBkb25lOworCWdvdG8gcmV0cnk7Cit9CisKK3NpemVfdCBjb3B5X2Zyb21fdXNlcl9wdChzaXplX3QgbiwgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHZvaWQgKnRvKQoreworCXNpemVfdCByYzsKKworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSB7CisJCW1lbWNweSh0bywgKHZvaWQgX19rZXJuZWwgX19mb3JjZSAqKSBmcm9tLCBuKTsKKwkJcmV0dXJuIDA7CisJfQorCXJjID0gX191c2VyX2NvcHlfcHQoKHVuc2lnbmVkIGxvbmcpIGZyb20sIHRvLCBuLCAwKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQltZW1zZXQodG8gKyBuIC0gcmMsIDAsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3NpemVfdCBjb3B5X3RvX3VzZXJfcHQoc2l6ZV90IG4sIHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSkKK3sKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQltZW1jcHkoKHZvaWQgX19rZXJuZWwgX19mb3JjZSAqKSB0bywgZnJvbSwgbik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gX191c2VyX2NvcHlfcHQoKHVuc2lnbmVkIGxvbmcpIHRvLCAodm9pZCAqKSBmcm9tLCBuLCAxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvdWFjY2Vzc19zdGQuYyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzc19zdGQuYwppbmRleCBmNDRmMDA3Li4yZDU0OWVkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3Nfc3RkLmMKKysrIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3N0ZC5jCkBAIC0yOCw2ICsyOCw5IEBACiAjZGVmaW5lIFNMUgkic2xnciIKICNlbmRpZgogCitleHRlcm4gc2l6ZV90IGNvcHlfZnJvbV91c2VyX3B0KHNpemVfdCBuLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdm9pZCAqdG8pOworZXh0ZXJuIHNpemVfdCBjb3B5X3RvX3VzZXJfcHQoc2l6ZV90IG4sIHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSk7CisKIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9zdGQoc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgX191c2VyICpwdHIsIHZvaWQgKngpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwpAQCAtNjksMzQgKzcyLDExIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXNpemVfdCBjb3B5X2Zyb21fdXNlcl9zdGRfc21hbGwoc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgX191c2VyICpwdHIsIHZvaWQgKngpCitzaXplX3QgY29weV9mcm9tX3VzZXJfc3RkX2NoZWNrKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQogewotCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKLQotCXRtcDEgPSAwVUw7Ci0JYXNtIHZvbGF0aWxlKAotCQkiMDogbXZjcCAgMCglMCwlMiksMCglMSksJTNcbiIKLQkJIiAgIlNMUiIgICUwLCUwXG4iCi0JCSIgICBqICAgICA1ZlxuIgotCQkiMTogbGEgICAgJTQsMjU1KCUxKVxuIiAvKiAlNCA9IHB0ciArIDI1NSAqLwotCQkiICAiTEhJIiAgJTMsLTQwOTZcbiIKLQkJIiAgIG5yICAgICU0LCUzXG4iCS8qICU0ID0gKHB0ciArIDI1NSkgJiAtNDA5NiAqLwotCQkiICAiU0xSIiAgJTQsJTFcbiIKLQkJIiAgIkNMUiIgICUwLCU0XG4iCS8qIGNvcHkgY3Jvc3NlcyBuZXh0IHBhZ2UgYm91bmRhcnk/ICovCi0JCSIgICBqbmggICA1ZlxuIgotCQkiMjogbXZjcCAgMCglNCwlMiksMCglMSksJTNcbiIKLQkJIiAgIlNMUiIgICUwLCU0XG4iCi0JCSIgICJBTFIiICAlMiwlNFxuIgotCQkiMzoiTEhJIiAgJTQsLTFcbiIKLQkJIiAgIkFMUiIgICU0LCUwXG4iCS8qIGNvcHkgcmVtYWluaW5nIHNpemUsIHN1YnRyYWN0IDEgKi8KLQkJIiAgIGJyYXMgICUzLDRmXG4iCi0JCSIgICB4YyAgICAwKDEsJTIpLDAoJTIpXG4iCi0JCSI0OiBleCAgICAlNCwwKCUzKVxuIgotCQkiNTpcbiIKLQkJRVhfVEFCTEUoMGIsMWIpIEVYX1RBQkxFKDJiLDNiKQotCQk6ICIrYSIgKHNpemUpLCAiK2EiIChwdHIpLCAiK2EiICh4KSwgIithIiAodG1wMSksICI9YSIgKHRtcDIpCi0JCTogOiAiY2MiLCAibWVtb3J5Iik7Ci0JcmV0dXJuIHNpemU7CisJaWYgKHNpemUgPD0gMTAyNCkKKwkJcmV0dXJuIGNvcHlfZnJvbV91c2VyX3N0ZChzaXplLCBwdHIsIHgpOworCXJldHVybiBjb3B5X2Zyb21fdXNlcl9wdChzaXplLCBwdHIsIHgpOwogfQogCiBzaXplX3QgY29weV90b191c2VyX3N0ZChzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgY29uc3Qgdm9pZCAqeCkKQEAgLTEzMCwyOCArMTEwLDExIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXNpemVfdCBjb3B5X3RvX3VzZXJfc3RkX3NtYWxsKHNpemVfdCBzaXplLCB2b2lkIF9fdXNlciAqcHRyLCBjb25zdCB2b2lkICp4KQorc2l6ZV90IGNvcHlfdG9fdXNlcl9zdGRfY2hlY2soc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICpwdHIsIGNvbnN0IHZvaWQgKngpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwotCi0JdG1wMSA9IDBVTDsKLQlhc20gdm9sYXRpbGUoCi0JCSIwOiBtdmNzICAwKCUwLCUxKSwwKCUyKSwlM1xuIgotCQkiICAiU0xSIiAgJTAsJTBcbiIKLQkJIiAgIGogICAgIDNmXG4iCi0JCSIxOiBsYSAgICAlNCwyNTUoJTEpXG4iIC8qIHB0ciArIDI1NSAqLwotCQkiICAiTEhJIiAgJTMsLTQwOTZcbiIKLQkJIiAgIG5yICAgICU0LCUzXG4iCS8qIChwdHIgKyAyNTUpICYgLTQwOTZVTCAqLwotCQkiICAiU0xSIiAgJTQsJTFcbiIKLQkJIiAgIkNMUiIgICUwLCU0XG4iCS8qIGNvcHkgY3Jvc3NlcyBuZXh0IHBhZ2UgYm91bmRhcnk/ICovCi0JCSIgICBqbmggICAzZlxuIgotCQkiMjogbXZjcyAgMCglNCwlMSksMCglMiksJTNcbiIKLQkJIiAgIlNMUiIgICUwLCU0XG4iCi0JCSIzOlxuIgotCQlFWF9UQUJMRSgwYiwxYikgRVhfVEFCTEUoMmIsM2IpCi0JCTogIithIiAoc2l6ZSksICIrYSIgKHB0ciksICIrYSIgKHgpLCAiK2EiICh0bXAxKSwgIj1hIiAodG1wMikKLQkJOiA6ICJjYyIsICJtZW1vcnkiKTsKLQlyZXR1cm4gc2l6ZTsKKwlpZiAoc2l6ZSA8PSAxMDI0KQorCQlyZXR1cm4gY29weV90b191c2VyX3N0ZChzaXplLCBwdHIsIHgpOworCXJldHVybiBjb3B5X3RvX3VzZXJfcHQoc2l6ZSwgcHRyLCB4KTsKIH0KIAogc2l6ZV90IGNvcHlfaW5fdXNlcl9zdGQoc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20pCkBAIC0zNDMsMTAgKzMwNiwxMCBAQAogfQogCiBzdHJ1Y3QgdWFjY2Vzc19vcHMgdWFjY2Vzc19zdGQgPSB7Ci0JLmNvcHlfZnJvbV91c2VyID0gY29weV9mcm9tX3VzZXJfc3RkLAotCS5jb3B5X2Zyb21fdXNlcl9zbWFsbCA9IGNvcHlfZnJvbV91c2VyX3N0ZF9zbWFsbCwKLQkuY29weV90b191c2VyID0gY29weV90b191c2VyX3N0ZCwKLQkuY29weV90b191c2VyX3NtYWxsID0gY29weV90b191c2VyX3N0ZF9zbWFsbCwKKwkuY29weV9mcm9tX3VzZXIgPSBjb3B5X2Zyb21fdXNlcl9zdGRfY2hlY2ssCisJLmNvcHlfZnJvbV91c2VyX3NtYWxsID0gY29weV9mcm9tX3VzZXJfc3RkLAorCS5jb3B5X3RvX3VzZXIgPSBjb3B5X3RvX3VzZXJfc3RkX2NoZWNrLAorCS5jb3B5X3RvX3VzZXJfc21hbGwgPSBjb3B5X3RvX3VzZXJfc3RkLAogCS5jb3B5X2luX3VzZXIgPSBjb3B5X2luX3VzZXJfc3RkLAogCS5jbGVhcl91c2VyID0gY2xlYXJfdXNlcl9zdGQsCiAJLnN0cm5sZW5fdXNlciA9IHN0cm5sZW5fdXNlcl9zdGQsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZXh0bWVtLmMgYi9hcmNoL3MzOTAvbW0vZXh0bWVtLmMKaW5kZXggMjI2Mjc1ZC4uOWU5YmM0ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9leHRtZW0uYworKysgYi9hcmNoL3MzOTAvbW0vZXh0bWVtLmMKQEAgLTE0LDEyICsxNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZXh0bWVtLmg+CiAjaW5jbHVkZSA8YXNtL2NwY21kLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2RlZmluZSBEQ1NTX0RFQlVHCS8qIERlYnVnIG1lc3NhZ2VzIG9uL29mZiAqLwogCkBAIC03NywxNSArNzgsMTEgQEAKIAlpbnQgc2VnY250OwogfTsKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhkY3NzX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChkY3NzX2xvY2spOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZGNzc19saXN0ID0gTElTVF9IRUFEX0lOSVQoZGNzc19saXN0KTsKIHN0YXRpYyBjaGFyICpzZWd0eXBlX3N0cmluZ1tdID0geyAiU1ciLCAiRVciLCAiU1IiLCAiRVIiLCAiU04iLCAiRU4iLCAiU0MiLAogCQkJCQkiRVcvRU4tTUlYRUQiIH07CiAKLWV4dGVybiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZSwgdHlwZTsKLX0gbWVtb3J5X2NodW5rW01FTU9SWV9DSFVOS1NdOwotCiAvKgogICogQ3JlYXRlIHRoZSA4IGJ5dGVzLCBlYmNkaWMgVk0gc2VnbWVudCBuYW1lIGZyb20KICAqIGFuIGFzY2lpIG5hbWUuCkBAIC0xMTcsNyArMTE0LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsOwogCXN0cnVjdCBkY3NzX3NlZ21lbnQgKnRtcCwgKnJldHZhbCA9IE5VTEw7CiAKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRjc3NfbG9jayk7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRjc3NfbG9jaykpOwogCWRjc3NfbWtuYW1lIChuYW1lLCBkY3NzX25hbWUpOwogCWxpc3RfZm9yX2VhY2ggKGwsICZkY3NzX2xpc3QpIHsKIAkJdG1wID0gbGlzdF9lbnRyeSAobCwgc3RydWN0IGRjc3Nfc2VnbWVudCwgbGlzdCk7CkBAIC0yNDksOCArMjQ2LDggQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgewotCQlpZiAobWVtb3J5X2NodW5rW2ldLnR5cGUgIT0gMCkKKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgeworCQlpZiAobWVtb3J5X2NodW5rW2ldLnR5cGUgIT0gQ0hVTktfUkVBRF9XUklURSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKG1lbW9yeV9jaHVua1tpXS5hZGRyID4+IDIwKSA+IChzZWctPmVuZCA+PiAyMCkpCiAJCQljb250aW51ZTsKQEAgLTI3Miw3ICsyNjksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAJc3RydWN0IGRjc3Nfc2VnbWVudCAqdG1wOwogCi0JYXNzZXJ0X3NwaW5fbG9ja2VkKCZkY3NzX2xvY2spOworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkY3NzX2xvY2spKTsKIAlsaXN0X2Zvcl9lYWNoKGwsICZkY3NzX2xpc3QpIHsKIAkJdG1wID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgZGNzc19zZWdtZW50LCBsaXN0KTsKIAkJaWYgKCh0bXAtPnN0YXJ0X2FkZHIgPj4gMjApID4gKHNlZy0+ZW5kID4+IDIwKSkKQEAgLTQyOSw3ICs0MjYsNyBAQAogCWlmICghTUFDSElORV9JU19WTSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKLQlzcGluX2xvY2sgKCZkY3NzX2xvY2spOworCW11dGV4X2xvY2soJmRjc3NfbG9jayk7CiAJc2VnID0gc2VnbWVudF9ieV9uYW1lIChuYW1lKTsKIAlpZiAoc2VnID09IE5VTEwpCiAJCXJjID0gX19zZWdtZW50X2xvYWQgKG5hbWUsIGRvX25vbnNoYXJlZCwgYWRkciwgZW5kKTsKQEAgLTQ0NCw3ICs0NDEsNyBAQAogCQkJcmMgICAgPSAtRVBFUk07CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2sgKCZkY3NzX2xvY2spOworCW11dGV4X3VubG9jaygmZGNzc19sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ2Nyw3ICs0NjQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZHVtbXk7CiAJaW50IGRjc3NfY29tbWFuZCwgcmMsIGRpYWdfY2M7CiAKLQlzcGluX2xvY2sgKCZkY3NzX2xvY2spOworCW11dGV4X2xvY2soJmRjc3NfbG9jayk7CiAJc2VnID0gc2VnbWVudF9ieV9uYW1lIChuYW1lKTsKIAlpZiAoc2VnID09IE5VTEwpIHsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtNTA4LDcgKzUwNSw3IEBACiAJCSAgJmR1bW15LCAmZHVtbXkpOwogCWtmcmVlKHNlZyk7CiAgb3V0X3VubG9jazoKLQlzcGluX3VubG9jaygmZGNzc19sb2NrKTsKKwltdXRleF91bmxvY2soJmRjc3NfbG9jayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC01MjYsNyArNTIzLDcgQEAKIAlpZiAoIU1BQ0hJTkVfSVNfVk0pCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmZGNzc19sb2NrKTsKKwltdXRleF9sb2NrKCZkY3NzX2xvY2spOwogCXNlZyA9IHNlZ21lbnRfYnlfbmFtZSAobmFtZSk7CiAJaWYgKHNlZyA9PSBOVUxMKSB7CiAJCVBSSU5UX0VSUiAoImNvdWxkIG5vdCBmaW5kIHNlZ21lbnQgJXMgaW4gc2VnbWVudF91bmxvYWQsICIKQEAgLTU0MCw3ICs1MzcsNyBAQAogCQlrZnJlZShzZWcpOwogCX0KIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJmRjc3NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkY3NzX2xvY2spOwogfQogCiAvKgpAQCAtNTU5LDEyICs1NTYsMTMgQEAKIAlpZiAoIU1BQ0hJTkVfSVNfVk0pCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmZGNzc19sb2NrKTsKKwltdXRleF9sb2NrKCZkY3NzX2xvY2spOwogCXNlZyA9IHNlZ21lbnRfYnlfbmFtZSAobmFtZSk7CiAKIAlpZiAoc2VnID09IE5VTEwpIHsKLQkJUFJJTlRfRVJSICgiY291bGQgbm90IGZpbmQgc2VnbWVudCAlcyBpbiBzZWdtZW50X3NhdmUsIHBsZWFzZSByZXBvcnQgdG8gbGludXgzOTBAZGUuaWJtLmNvbVxuIixuYW1lKTsKLQkJcmV0dXJuOworCQlQUklOVF9FUlIoImNvdWxkIG5vdCBmaW5kIHNlZ21lbnQgJXMgaW4gc2VnbWVudF9zYXZlLCBwbGVhc2UgIgorCQkJICAicmVwb3J0IHRvIGxpbnV4MzkwQGRlLmlibS5jb21cbiIsIG5hbWUpOworCQlnb3RvIG91dDsKIAl9CiAKIAlzdGFydHBmbiA9IHNlZy0+c3RhcnRfYWRkciA+PiBQQUdFX1NISUZUOwpAQCAtNTkxLDcgKzU4OSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIG91dDoKLQlzcGluX3VubG9jaygmZGNzc19sb2NrKTsKKwltdXRleF91bmxvY2soJmRjc3NfbG9jayk7CiB9CiAKIEVYUE9SVF9TWU1CT0woc2VnbWVudF9sb2FkKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9mYXVsdC5jIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKaW5kZXggMWMzMjNiYi4uY2Q4NWUzNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgogCiAjaWZuZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBfX0ZBSUxfQUREUl9NQVNLIDB4N2ZmZmYwMDAKQEAgLTM5NCw2ICszOTUsNyBAQAogLyoKICAqICdwZmF1bHQnIHBzZXVkbyBwYWdlIGZhdWx0cyByb3V0aW5lcy4KICAqLworc3RhdGljIGV4dF9pbnRfaW5mb190IGV4dF9pbnRfcGZhdWx0Owogc3RhdGljIGludCBwZmF1bHRfZGlzYWJsZSA9IDA7CiAKIHN0YXRpYyBpbnQgX19pbml0IG5vcGZhdWx0KGNoYXIgKnN0cikKQEAgLTQyMiw3ICs0MjQsNyBAQAogCQkgIF9fUEZfUkVTX0ZJRUxEIH07CiAgICAgICAgIGludCByYzsKIAotCWlmIChwZmF1bHRfZGlzYWJsZSkKKwlpZiAoIU1BQ0hJTkVfSVNfVk0gfHwgcGZhdWx0X2Rpc2FibGUpCiAJCXJldHVybiAtMTsKIAlhc20gdm9sYXRpbGUoCiAJCSIJZGlhZwklMSwlMCwweDI1OFxuIgpAQCAtNDQwLDcgKzQ0Miw3IEBACiAJcGZhdWx0X3JlZmJrX3QgcmVmYmsgPQogCXsgMHgyNTgsIDEsIDUsIDIsIDBVTEwsIDBVTEwsIDBVTEwsIDBVTEwgfTsKIAotCWlmIChwZmF1bHRfZGlzYWJsZSkKKwlpZiAoIU1BQ0hJTkVfSVNfVk0gfHwgcGZhdWx0X2Rpc2FibGUpCiAJCXJldHVybjsKIAlfX2N0bF9jbGVhcl9iaXQoMCw5KTsKIAlhc20gdm9sYXRpbGUoCkBAIC01MDAsNSArNTAyLDI1IEBACiAJCQlzZXRfdHNrX25lZWRfcmVzY2hlZCh0c2spOwogCX0KIH0KLSNlbmRpZgogCit2b2lkIF9faW5pdCBwZmF1bHRfaXJxX2luaXQodm9pZCkKK3sKKwlpZiAoIU1BQ0hJTkVfSVNfVk0pCisJCXJldHVybjsKKworCS8qCisJICogVHJ5IHRvIGdldCBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIGdvaW5nLgorCSAqLworCWlmIChyZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBwZmF1bHRfaW50ZXJydXB0LAorCQkJCQkgICAgICAmZXh0X2ludF9wZmF1bHQpICE9IDApCisJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDI2MDMiKTsKKworCWlmIChwZmF1bHRfaW5pdCgpID09IDApCisJCXJldHVybjsKKworCS8qIFRvdWdoIGx1Y2ssIG5vIHBmYXVsdC4gKi8KKwlwZmF1bHRfZGlzYWJsZSA9IDE7CisJdW5yZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBwZmF1bHRfaW50ZXJydXB0LAorCQkJCQkgICAgJmV4dF9pbnRfcGZhdWx0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IDZhNDYxZDQuLmJmZmM3ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZworKysgYi9hcmNoL3NoL0tjb25maWcKQEAgLTIxNyw3ICsyMTcsNyBAQAogCWJvb2wgIlNITUlOIgogCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDYKIAloZWxwCi0JICBTZWxlY3QgU0hNSU4gaWYgY29uZmlndXJlaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQKKwkgIFNlbGVjdCBTSE1JTiBpZiBjb25maWd1cmluZyBmb3IgdGhlIFNITUlOIGJvYXJkLgogCiBjb25maWcgU0hfVU5LTk9XTgogCWJvb2wgIkJhcmVDUFUiCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwppbmRleCA5ZGFhZDcwLi44YTJmZDE5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCiBleHRlcm4gaW50IGR1bXBfZnB1KHN0cnVjdCBwdF9yZWdzICosIGVsZl9mcHJlZ3NldF90ICopOwogZXh0ZXJuIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBub19pcnFfdHlwZTsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvc2hfa3N5bXMuYyBiL2FyY2gvc2g2NC9rZXJuZWwvc2hfa3N5bXMuYwppbmRleCA0YjJkZjcyLi43YWE0YjRmIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC9zaF9rc3ltcy5jCkBAIC0zOCw3ICszOCw3IEBACiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCiAvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKIAogRVhQT1JUX1NZTUJPTChzdHJzdHIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCmluZGV4IDBlOGE3NDIuLjRiMjY3NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCisrKyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCkBAIC0xMTgsMjQgKzExOCwyNCBAQAogCiAvKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKICAgIGFuZCBhZGRzIGluICJzdW0iICgzMi1iaXQpICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOworCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOwogCS8qIDMyK2MgYml0cyAtPiAzMiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAKIAlwcl9kZWJ1ZygiY3N1bV9wYXJ0aWFsLCBidWZmICVwIGxlbiAlZCBzdW0gMHgleCByZXN1bHQ9MHglMDE2THhcbiIsCiAJCWJ1ZmYsIGxlbiwgc3VtLCByZXN1bHQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAogLyogQ29weSB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbC4gICovCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXN1bSA9IGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CkBAIC0xNDUsOSArMTQ1LDkgQEAKIAogLyogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgogICAgdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkgICAgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJICAgIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAlpbnQgbWlzc2luZzsKIApAQCAtMTY2LDkgKzE2Niw5IEBACiB9CiAKIC8qIENvcHkgdG8gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgKi8KLXVuc2lnbmVkIGludAorX193c3VtCiBjc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCisJCQkgIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAlzdW0gPSBjc3VtX3BhcnRpYWwoc3JjLCBsZW4sIHN1bSk7CiAKQEAgLTE4MiwyOCArMTgyLDI0IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXByX2RlYnVnKCJpcF9mYXN0X2NzdW0gJXAsJWRcbiIsIGlwaCwgaWhsKTsKIAotCXJldHVybiB+ZG9fY3N1bShpcGgsIGlobCAqIDQpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGlwaCwgaWhsICogNCk7CiB9CiAKLXVuc2lnbmVkIGludCBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCisJCQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdDsKIAogCXByX2RlYnVnKCJudG9ocygweCV4KT0weCV4XG4iLCAweGRlYWQsIG50b2hzKDB4ZGVhZCkpOwogCXByX2RlYnVnKCJodG9ucygweCV4KT0weCV4XG4iLCAweGRlYWQsIGh0b25zKDB4ZGVhZCkpOwogCi0JcmVzdWx0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIHNhZGRyICsKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkYWRkciArCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3VtICsKLQkJICAoKHVuc2lnbmVkIGxvbmcgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkgICgodW5zaWduZWQgbG9uZyBsb25nKSBwcm90byA8PCA4KSk7CisJcmVzdWx0ID0gKF9fZm9yY2UgdTY0KSBzYWRkciArIChfX2ZvcmNlIHU2NCkgZGFkZHIgKworCQkgKF9fZm9yY2UgdTY0KSBzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KTsKIAogCS8qIEZvbGQgZG93biB0byAzMi1iaXRzIHNvIHdlIGRvbid0IGxvb3NlIGluIHRoZSB0eXBlZGVmLWxlc3MKIAkgICBuZXR3b3JrIHN0YWNrLiAgKi8KQEAgLTIxNSwxNiArMjExLDUgQEAKIAlwcl9kZWJ1ZygiJXMgc2FkZHIgJXggZGFkZHIgJXggbGVuICV4IHByb3RvICV4IHN1bSAleCByZXN1bHQgJTA4THhcbiIsCiAJCV9fRlVOQ1RJT05fXywgc2FkZHIsIGRhZGRyLCBsZW4sIHByb3RvLCBzdW0sIHJlc3VsdCk7CiAKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vLyBQb3N0IFNJTToKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKLXsKLQkvLyAgdW5zaWduZWQgZHVtbXk7Ci0JcHJfZGVidWcoImNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgc3JjICVwIGRzdCAlcCBsZW4gJWRcbiIsIHNyYywgZHN0LAotCQlsZW4pOwotCi0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5KHNyYywgZHN0LCBsZW4sIHN1bSk7CisJcmV0dXJuIChfX3dzdW0pcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2xpYi9kYmcuYyBiL2FyY2gvc2g2NC9saWIvZGJnLmMKaW5kZXggMTMyNmY0NS4uNDMxMGZjOCAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2xpYi9kYmcuYworKysgYi9hcmNoL3NoNjQvbGliL2RiZy5jCkBAIC0zODMsNyArMzgzLDcgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qCi0qKiBEZXBlbmRpbmcgb24gPGJhc2U+IHNjYW4gdGhlIE1NVSwgRGF0YSBvciBJbnN0cmN0aW9uIHNpZGUKKyoqIERlcGVuZGluZyBvbiA8YmFzZT4gc2NhbiB0aGUgTU1VLCBEYXRhIG9yIEluc3RydWN0aW9uIHNpZGUKICoqIGxvb2tpbmcgZm9yIGEgdmFsaWQgbWFwcGluZyBtYXRjaGluZyBFYWRkciAmIGFzaWQuCiAqKiBSZXR1cm4gLTEgaWYgbm90IGZvdW5kIG9yIHRoZSBUTEIgaWQgZW50cnkgb3RoZXJ3aXNlLgogKiogTm90ZTogaXQgd29ya3Mgb25seSBmb3IgNGsgcGFnZXMhCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggMmY5NjYxMC4uOTJhN2M4YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjEyLDggKzIxMiw4IEBACiAJdHJpc3RhdGUgIlN1bjRtIExFRCBkcml2ZXIiCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgdG9nZ2xlcyB0aGUgZnJvbnQtcGFuZWwgTEVEIG9uIHN1bjRtIHN5c3RlbXMKLQkgIGluIGEgdXNlci1zcGVjaWZ5YWJsZSBtYW5uZXIuICBJdCdzIHN0YXRlIGNhbiBiZSBwcm9iZWQKLQkgIGJ5IHJlYWRpbmcgL3Byb2MvbGVkIGFuZCBpdCdzIGJsaW5raW5nIG1vZGUgY2FuIGJlIGNoYW5nZWQKKwkgIGluIGEgdXNlci1zcGVjaWZpYWJsZSBtYW5uZXIuICBJdHMgc3RhdGUgY2FuIGJlIHByb2JlZAorCSAgYnkgcmVhZGluZyAvcHJvYy9sZWQgYW5kIGl0cyBibGlua2luZyBtb2RlIGNhbiBiZSBjaGFuZ2VkCiAJICB2aWEgd3JpdGVzIHRvIC9wcm9jL2xlZAogCiBzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKaW5kZXggZTAyZjAxYi4uZGZjNDFjZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCkBAIC02NDYsMTMgKzY0Niw0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kb21haW5fbnIpOwogCi1pbnQgcGNpYmlvc19wcmVwX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCS8qIFdlIHNldCBjb3JyZWN0IFBDSV9DQUNIRV9MSU5FX1NJWkUgcmVnaXN0ZXIgdmFsdWVzIGZvciBldmVyeQotCSAqIGRldmljZSBwcm9iZWQgb24gdGhpcyBwbGF0Zm9ybS4gIFNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2sKLQkgKiBhbmQgdGhpcyBhbHdheXMgc3VjY2VlZHMuCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KICNlbmRpZiAvKiAhKENPTkZJR19QQ0kpICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKaW5kZXggMmY4ODBjYi4uMGNhZDM1NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJLyogVGhlc2UgYXJlIHN5bmNocm9uaXphdGlvbiBjYWxscyBiZXR3ZWVuIHZhcmlvdXMgVU1MIHRocmVhZHMgb24gdGhlCiAJICogaG9zdCAtIHNpbmNlIHRoZXkgYXJlIG5vdCBkaWZmZXJlbnQga2VybmVsIHRocmVhZHMsIHdlIGNhbm5vdCB1c2UKIAkgKiBrZXJuZWwgc2VtYXBob3Jlcy4gV2UgZG9uJ3QgdXNlIFN5c1Ygc2VtYXBob3JlcyBiZWNhdXNlIHRoZXkgYXJlCi0JICogcGVyc2lzdGFudC4gKi8KKwkgKiBwZXJzaXN0ZW50LiAqLwogCWNvdW50ID0gb3NfcmVhZF9maWxlKHBpcGVfZmQsICZjLCBzaXplb2YoYykpOwogCWlmKGNvdW50ICE9IHNpemVvZihjKSkKIAkJcHJpbnRrKCJ3aW5jaF90aHJlYWQgOiBmYWlsZWQgdG8gcmVhZCBzeW5jaHJvbml6YXRpb24gYnl0ZSwgIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL29zLmggYi9hcmNoL3VtL2luY2x1ZGUvb3MuaAppbmRleCA2NTE2ZjZkLi4xM2E4NmJkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvb3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvb3MuaApAQCAtMjMzLDYgKzIzMyw4IEBACiAJCQkJICAgIHZvaWQgKCpvcCkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCiAJCQkJCSAgICAgICBpbnQgbiksIGludCAqZmF1bHRlZF9vdXQpOwogCisvKiBleGVjdnAuYyAqLworZXh0ZXJuIGludCBleGVjdnBfbm9hbGxvYyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSk7CiAvKiBoZWxwZXIuYyAqLwogZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2LAogCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L2NoZWNrc3VtLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaAppbmRleCAwNTJiYjA2Li4wY2I0NjQ1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaApAQCAtMjAsOCArMjAsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCAKLQkJCSAgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQpAQCAtMzIsOCArMzEsOCBAQAogICovCiAKIHN0YXRpYyBfX2lubGluZV9fCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkgICAgICAgaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCW1lbWNweShkc3QsIHNyYywgbGVuKTsKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwpAQCAtNDgsMzYgKzQ3LDI1IEBACiAgKi8KIAogc3RhdGljIF9faW5saW5lX18KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywKLQkJCQkJIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJIGludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewotCWlmKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pKXsKKwlpZiAoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGxlbikpIHsKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwotCQlyZXR1cm4oLTEpOworCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOwogCX0KIAogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKIC8qCi0gKiBUaGVzZSBhcmUgdGhlIG9sZCAoYW5kIHVuc2FmZSkgd2F5IG9mIGRvaW5nIGNoZWNrc3VtcywgYSB3YXJuaW5nIG1lc3NhZ2UgCi0gKiB3aWxsIGJlIHByaW50ZWQgaWYgdGhleSBhcmUgdXNlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3Vycy4KLSAqCi0gKiB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGdvIGF3YXkgYWZ0ZXIgc29tZSB0aW1lLgotICovCi0KLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbXVzZXIgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyCi0KLS8qCiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICoKICAqCUJ5IEpvcmdlIEN3aWsgPGpvcmdlQGxhc2VyLnNhdGxpbmsubmV0PiwgYWRhcHRlZCBmb3IgbGludXggYnkKICAqCUFybnQgR3VsYnJhbmRzZW4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW07CiAKQEAgLTEwNSwyOSArOTMsMjkgQEAKIAk6ICI9ciIgKHN1bSksICI9ciIgKGlwaCksICI9ciIgKGlobCkKIAk6ICIxIiAoaXBoKSwgIjIiIChpaGwpCiAJOiAibWVtb3J5Iik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJCSJhZGRsICUxLCAlMAkJO1xuIgogCQkiYWRjbCAkMHhmZmZmLCAlMAk7XG4iCiAJCTogIj1yIiAoc3VtKQotCQk6ICJyIiAoc3VtIDw8IDE2KSwgIjAiIChzdW0gJiAweGZmZmYwMDAwKQorCQk6ICJyIiAoKF9fZm9yY2UgdTMyKXN1bSA8PCAxNiksCisJCSAgIjAiICgoX19mb3JjZSB1MzIpc3VtICYgMHhmZmZmMDAwMCkKIAkpOwotCXJldHVybiAofnN1bSkgPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKH4oX19mb3JjZSB1MzIpc3VtID4+IDE2KTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAgICAgX19hc21fXygKIAkiYWRkbCAlMSwgJTAJO1xuIgpAQCAtMTM1LDcgKzEyMyw3IEBACiAJImFkY2wgJTMsICUwCTtcbiIKIAkiYWRjbCAkMCwgJTAJO1xuIgogCTogIj1yIiAoc3VtKQotCTogImciIChkYWRkciksICJnIihzYWRkciksICJnIigobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NiksICIwIihzdW0pKTsKKwk6ICJnIiAoZGFkZHIpLCAiZyIoc2FkZHIpLCAiZyIoKGxlbiArIHByb3RvKSA8PCA4KSwgIjAiKHN1bSkpOwogICAgIHJldHVybiBzdW07CiB9CiAKQEAgLTE0MywxMSArMTMxLDEwIEBACiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTE1NywxNyArMTQ0LDE2IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKICAgICByZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJCSAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQkJCSAgICAgX191MzIgbGVuLAotCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkJICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkJImFkZGwgMCglMSksICUwCQk7XG4iCkBAIC0xOTIsMTQgKzE3OCwxNCBAQAogICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgogICovCiAjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQkJICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LAotCQkJCQkJICAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJCSAgICAgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpewotCQlpZihjb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbikpeworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihkc3QsIHNyYywgbGVuKSkgewogCQkJKmVycl9wdHIgPSAtRUZBVUxUOwotCQkJcmV0dXJuKC0xKTsKKwkJCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7CiAJCX0KIAogCQlyZXR1cm4gY3N1bV9wYXJ0aWFsKHNyYywgbGVuLCBzdW0pOwpAQCAtMjA4LDcgKzE5NCw3IEBACiAJaWYgKGxlbikKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwogCi0JcmV0dXJuIC0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2NoZWNrc3VtLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9jaGVja3N1bS5oCmluZGV4IGVhOTcwMDUuLmE1YmU5MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2NoZWNrc3VtLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvY2hlY2tzdW0uaApAQCAtOSw4ICs5LDcgQEAKICNpbmNsdWRlICJsaW51eC9pbjYuaCIKICNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgogCi1leHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIHVuc2lnbmVkIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQpAQCAtMjEsMjEgKzIwLDIxIEBACiAgKi8KIAogc3RhdGljIF9faW5saW5lX18KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogCXJldHVybihjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSkpOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSwKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVycl9wdHIpCiB7Ci0gICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pKXsKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pKSB7CiAgICAgICAgICAgICAgICAgKmVycl9wdHIgPSAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwogfQpAQCAtNDgsMTUgKzQ3LDE2IEBACiAgKiB0aGUgbGFzdCBzdGVwIGJlZm9yZSBwdXR0aW5nIGEgY2hlY2tzdW0gaW50byBhIHBhY2tldC4KICAqIE1ha2Ugc3VyZSBub3QgdG8gbWl4IHdpdGggNjRiaXQgY2hlY2tzdW1zLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCQkiICBhZGRsICUxLCUwXG4iCiAJCSIgIGFkY2wgJDB4ZmZmZiwlMCIKIAkJOiAiPXIiIChzdW0pCi0JCTogInIiIChzdW0gPDwgMTYpLCAiMCIgKHN1bSAmIDB4ZmZmZjAwMDApCisJCTogInIiICgoX19mb3JjZSB1MzIpc3VtIDw8IDE2KSwKKwkJICAiMCIgKChfX2ZvcmNlIHUzMilzdW0gJiAweGZmZmYwMDAwKQogCSk7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCiAvKioKQEAgLTcwLDI4ICs3MCwyNyBAQAogICogUmV0dXJucyB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bSB0aGUgaW5wdXQgZGF0YS4gUmVzdWx0IGlzCiAgKiAzMmJpdCB1bmZvbGRlZC4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgc2FkZHIsIHVuc2lnbmVkIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlhc20oIiAgYWRkbCAlMSwgJTBcbiIKIAkgICAgIiAgYWRjbCAlMiwgJTBcbiIKIAkgICAgIiAgYWRjbCAlMywgJTBcbiIKIAkgICAgIiAgYWRjbCAkMCwgJTBcbiIKIAkJOiAiPXIiIChzdW0pCi0JICAgIDogImciIChkYWRkciksICJnIiAoc2FkZHIpLCAiZyIgKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgIjAiIChzdW0pKTsKLSAgICByZXR1cm4gc3VtOworCSAgICA6ICJnIiAoZGFkZHIpLCAiZyIgKHNhZGRyKSwgImciICgobGVuICsgcHJvdG8pIDw8IDgpLCAiMCIgKHN1bSkpOworCXJldHVybiBzdW07CiB9CiAKIC8qCiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTAxLDcgKzEwMCw3IEBACiAgKiBpcGg6IGlwdjQgaGVhZGVyCiAgKiBpaGw6IGxlbmd0aCBvZiBoZWFkZXIgLyA0CiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW07CiAKQEAgLTEyOCw3ICsxMjcsNyBAQAogCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJtZW1vcnkiKTsKLQlyZXR1cm4oc3VtKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgYWRkMzJfd2l0aF9jYXJyeSh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQpAQCAtMTQwLDYgKzEzOSw2IEBACiAgICAgICAgIHJldHVybiBhOwogfQogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQppbmRleCBiNDE4MzkyLi4yZjhjNzk0IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKQEAgLTMsOCArMyw4IEBACiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAotb2JqLXkgPSBhaW8ubyBlbGZfYXV4Lm8gZmlsZS5vIGhlbHBlci5vIGlycS5vIG1haW4ubyBtZW0ubyBwcm9jZXNzLm8gc2lnaW8ubyBcCi0Jc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHJhcC5vIHR0eS5vIHVhY2Nlc3MubyB1bWlkLm8gdGxzLm8gXAorb2JqLXkgPSBhaW8ubyBlbGZfYXV4Lm8gZXhlY3ZwLm8gZmlsZS5vIGhlbHBlci5vIGlycS5vIG1haW4ubyBtZW0ubyBwcm9jZXNzLm8gXAorCXNpZ2lvLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHJhcC5vIHR0eS5vIHVhY2Nlc3MubyB1bWlkLm8gdGxzLm8gXAogCXVzZXJfc3ltcy5vIHV0aWwubyBkcml2ZXJzLyBzeXMtJChTVUJBUkNIKS8KIAogb2JqLSQoQ09ORklHX01PREVfU0tBUykgKz0gc2thcy8KQEAgLTE1LDkgKzE1LDkgQEAKIG9iai0kKENPTkZJR19UVFlfTE9HKSArPSB0dHlfbG9nLm8KIHVzZXItb2Jqcy0kKENPTkZJR19UVFlfTE9HKSArPSB0dHlfbG9nLm8KIAotVVNFUl9PQkpTIDo9ICQodXNlci1vYmpzLXkpIGFpby5vIGVsZl9hdXgubyBmaWxlLm8gaGVscGVyLm8gaXJxLm8gbWFpbi5vIG1lbS5vIFwKLQlwcm9jZXNzLm8gc2lnaW8ubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0cmFwLm8gdHR5Lm8gdGxzLm8gXAotCXVhY2Nlc3MubyB1bWlkLm8gdXRpbC5vCitVU0VSX09CSlMgOj0gJCh1c2VyLW9ianMteSkgYWlvLm8gZWxmX2F1eC5vIGV4ZWN2cC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBcCisJbWFpbi5vIG1lbS5vIHByb2Nlc3MubyBzaWdpby5vIHNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIHRyYXAubyB0dHkubyBcCisJdGxzLm8gdWFjY2Vzcy5vIHVtaWQubyB1dGlsLm8KIAogQ0ZMQUdTX3VzZXJfc3ltcy5vICs9IC1EU1VCQVJDSF8kKFNVQkFSQ0gpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZXhlY3ZwLmMgYi9hcmNoL3VtL29zLUxpbnV4L2V4ZWN2cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTU4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L2V4ZWN2cC5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgUGFvbG8gR2lhcnJ1c3NvIC0gbW9kaWZpZWQgZnJvbSBnbGliYycgZXhlY3ZwLmMuCisgICBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGZvbGxvd3M6CisKKyAgIENvcHlyaWdodCAoQykgMTk5MSw5MiwxOTk1LTk5LDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZuZGVmIFRFU1QKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgdW1fa21hbGxvYyBtYWxsb2MKKyNlbmRpZgorI2luY2x1ZGUgIm9zLmgiCisKKy8qIEV4ZWN1dGUgRklMRSwgc2VhcmNoaW5nIGluIHRoZSBgUEFUSCcgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgY29udGFpbnMKKyAgIG5vIHNsYXNoZXMsIHdpdGggYXJndW1lbnRzIEFSR1YgYW5kIGVudmlyb25tZW50IGZyb20gYGVudmlyb24nLiAgKi8KK2ludCBleGVjdnBfbm9hbGxvYyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSkKK3sKKwlpZiAoKmZpbGUgPT0gJ1wwJykgeworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoc3RyY2hyIChmaWxlLCAnLycpICE9IE5VTEwpIHsKKwkJLyogRG9uJ3Qgc2VhcmNoIHdoZW4gaXQgY29udGFpbnMgYSBzbGFzaC4gICovCisJCWV4ZWN2KGZpbGUsIGFyZ3YpOworCX0gZWxzZSB7CisJCWludCBnb3RfZWFjY2VzOworCQlzaXplX3QgbGVuLCBwYXRobGVuOworCQljaGFyICpuYW1lLCAqcDsKKwkJY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOworCQlpZiAocGF0aCA9PSBOVUxMKQorCQkJcGF0aCA9ICI6L2JpbjovdXNyL2JpbiI7CisKKwkJbGVuID0gc3RybGVuKGZpbGUpICsgMTsKKwkJcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwkJLyogQ29weSB0aGUgZmlsZSBuYW1lIGF0IHRoZSB0b3AuICAqLworCQluYW1lID0gbWVtY3B5KGJ1ZiArIHBhdGhsZW4gKyAxLCBmaWxlLCBsZW4pOworCQkvKiBBbmQgYWRkIHRoZSBzbGFzaC4gICovCisJCSotLW5hbWUgPSAnLyc7CisKKwkJZ290X2VhY2NlcyA9IDA7CisJCXAgPSBwYXRoOworCQlkbyB7CisJCQljaGFyICpzdGFydHA7CisKKwkJCXBhdGggPSBwOworCQkJLy9MZXQncyBhdm9pZCB0aGlzIEdOVSBleHRlbnNpb24uCisJCQkvL3AgPSBzdHJjaHJudWwgKHBhdGgsICc6Jyk7CisJCQlwID0gc3RyY2hyKHBhdGgsICc6Jyk7CisJCQlpZiAoIXApCisJCQkJcCA9IHN0cmNocihwYXRoLCAnXDAnKTsKKworCQkJaWYgKHAgPT0gcGF0aCkKKwkJCQkvKiBUd28gYWRqYWNlbnQgY29sb25zLCBvciBhIGNvbG9uIGF0IHRoZSBiZWdpbm5pbmcgb3IgdGhlIGVuZAorCQkJCSAgIG9mIGBQQVRIJyBtZWFucyB0byBzZWFyY2ggdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgKi8KKwkJCQlzdGFydHAgPSBuYW1lICsgMTsKKwkJCWVsc2UKKwkJCQlzdGFydHAgPSBtZW1jcHkobmFtZSAtIChwIC0gcGF0aCksIHBhdGgsIHAgLSBwYXRoKTsKKworCQkJLyogVHJ5IHRvIGV4ZWN1dGUgdGhpcyBuYW1lLiAgSWYgaXQgd29ya3MsIGV4ZWN2IHdpbGwgbm90IHJldHVybi4gICovCisJCQlleGVjdihzdGFydHAsIGFyZ3YpOworCisJCQkvKgorCQkJaWYgKGVycm5vID09IEVOT0VYRUMpIHsKKwkJCX0KKwkJCSovCisKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQljYXNlIEVBQ0NFUzoKKwkJCQkJLyogUmVjb3JkIHRoZSB3ZSBnb3QgYSBgUGVybWlzc2lvbiBkZW5pZWQnIGVycm9yLiAgSWYgd2UgZW5kCisJCQkJCSAgIHVwIGZpbmRpbmcgbm8gZXhlY3V0YWJsZSB3ZSBjYW4gdXNlLCB3ZSB3YW50IHRvIGRpYWdub3NlCisJCQkJCSAgIHRoYXQgd2UgZGlkIGZpbmQgb25lIGJ1dCB3ZXJlIGRlbmllZCBhY2Nlc3MuICAqLworCQkJCQlnb3RfZWFjY2VzID0gMTsKKwkJCQljYXNlIEVOT0VOVDoKKwkJCQljYXNlIEVTVEFMRToKKwkJCQljYXNlIEVOT1RESVI6CisJCQkJCS8qIFRob3NlIGVycm9ycyBpbmRpY2F0ZSB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIG5vdCBleGVjdXRhYmxlCisJCQkJCSAgIGJ5IHVzLCBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8ganVzdCB0cnkgdGhlIG5leHQgcGF0aAorCQkJCQkgICBkaXJlY3RvcnkuICAqLworCQkJCWNhc2UgRU5PREVWOgorCQkJCWNhc2UgRVRJTUVET1VUOgorCQkJCQkvKiBTb21lIHN0cmFuZ2UgZmlsZXN5c3RlbXMgbGlrZSBBRlMgcmV0dXJuIGV2ZW4KKwkJCQkJICAgc3RyYW5nZXIgZXJyb3IgbnVtYmVycy4gIFRoZXkgY2Fubm90IHJlYXNvbmFibHkgbWVhbgorCQkJCQkgICBhbnl0aGluZyBlbHNlIHNvIGlnbm9yZSB0aG9zZSwgdG9vLiAgKi8KKwkJCQljYXNlIEVOT0VYRUM6CisJCQkJCS8qIFdlIHdvbid0IGdvIHNlYXJjaGluZyBmb3IgdGhlIHNoZWxsCisJCQkJCSAqIGlmIGl0IGlzIG5vdCBleGVjdXRhYmxlIC0gdGhlIExpbnV4CisJCQkJCSAqIGtlcm5lbCBhbHJlYWR5IGhhbmRsZXMgdGhpcyBlbm91Z2gsCisJCQkJCSAqIGZvciB1cy4gKi8KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQkvKiBTb21lIG90aGVyIGVycm9yIG1lYW5zIHdlIGZvdW5kIGFuIGV4ZWN1dGFibGUgZmlsZSwgYnV0CisJCQkJCSAgIHNvbWV0aGluZyB3ZW50IHdyb25nIGV4ZWN1dGluZyBpdDsgcmV0dXJuIHRoZSBlcnJvciB0byBvdXIKKwkJCQkJICAgY2FsbGVyLiAgKi8KKwkJCQkJcmV0dXJuIC1lcnJubzsKKwkJCX0KKwkJfSB3aGlsZSAoKnArKyAhPSAnXDAnKTsKKworCQkvKiBXZSB0cmllZCBldmVyeSBlbGVtZW50IGFuZCBub25lIG9mIHRoZW0gd29ya2VkLiAgKi8KKwkJaWYgKGdvdF9lYWNjZXMpCisJCQkvKiBBdCBsZWFzdCBvbmUgZmFpbHVyZSB3YXMgZHVlIHRvIHBlcm1pc3Npb25zLCBzbyByZXBvcnQgdGhhdAorCQkJICAgZXJyb3IuICAqLworCQkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogUmV0dXJuIHRoZSBlcnJvciBmcm9tIHRoZSBsYXN0IGF0dGVtcHQgKHByb2JhYmx5IEVOT0VOVCkuICAqLworCXJldHVybiAtZXJybm87Cit9CisjaWZkZWYgVEVTVAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpCit7CisJY2hhciBidWZbUEFUSF9NQVhdOworCWludCByZXQ7CisJYXJnYy0tOworCWlmICghYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWFyZ3YrKzsKKwlpZiAocmV0ID0gZXhlY3ZwX25vYWxsb2MoYnVmLCBhcmd2WzBdLCBhcmd2KSkgeworCQllcnJubyA9IC1yZXQ7CisJCXBlcnJvcigiZXhlY3ZwX25vYWxsb2MiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCmluZGV4IGQxMzI5OWMuLmM3YWQ2MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwpAQCAtOCwxOCArOCwyMSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IGhlbHBlcl9kYXRhIHsKIAl2b2lkICgqcHJlX2V4ZWMpKHZvaWQqKTsKIAl2b2lkICpwcmVfZGF0YTsKIAljaGFyICoqYXJndjsKIAlpbnQgZmQ7CisJY2hhciAqYnVmOwogfTsKIAogLyogRGVidWdnaW5nIGFpZCwgY2hhbmdlZCBvbmx5IGZyb20gZ2RiICovCkBAIC00MSw5ICs0NCw4IEBACiAJfQogCWlmIChkYXRhLT5wcmVfZXhlYyAhPSBOVUxMKQogCQkoKmRhdGEtPnByZV9leGVjKShkYXRhLT5wcmVfZGF0YSk7Ci0JZXhlY3ZwKGFyZ3ZbMF0sIGFyZ3YpOwotCWVycnZhbCA9IC1lcnJubzsKLQlwcmludGsoImhlbHBlcl9jaGlsZCAtIGV4ZWN2ZSBvZiAnJXMnIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIGFyZ3ZbMF0sIGVycm5vKTsKKwllcnJ2YWwgPSBleGVjdnBfbm9hbGxvYyhkYXRhLT5idWYsIGFyZ3ZbMF0sIGFyZ3YpOworCXByaW50aygiaGVscGVyX2NoaWxkIC0gZXhlY3ZwIG9mICclcycgZmFpbGVkIC0gZXJybm8gPSAlZFxuIiwgYXJndlswXSwgLWVycnZhbCk7CiAJb3Nfd3JpdGVfZmlsZShkYXRhLT5mZCwgJmVycnZhbCwgc2l6ZW9mKGVycnZhbCkpOwogCWtpbGwob3NfZ2V0cGlkKCksIFNJR0tJTEwpOwogCXJldHVybiAwOwpAQCAtODQsMTEgKzg2LDEzIEBACiAJZGF0YS5wcmVfZGF0YSA9IHByZV9kYXRhOwogCWRhdGEuYXJndiA9IGFyZ3Y7CiAJZGF0YS5mZCA9IGZkc1sxXTsKKwlkYXRhLmJ1ZiA9IF9fY2FudF9zbGVlcCgpID8gdW1fa21hbGxvY19hdG9taWMoUEFUSF9NQVgpIDoKKwkJCQkJdW1fa21hbGxvYyhQQVRIX01BWCk7CiAJcGlkID0gY2xvbmUoaGVscGVyX2NoaWxkLCAodm9pZCAqKSBzcCwgQ0xPTkVfVk0gfCBTSUdDSExELCAmZGF0YSk7CiAJaWYgKHBpZCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwogCQlwcmludGsoInJ1bl9oZWxwZXIgOiBjbG9uZSBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKLQkJZ290byBvdXRfY2xvc2U7CisJCWdvdG8gb3V0X2ZyZWUyOwogCX0KIAogCWNsb3NlKGZkc1sxXSk7CkBAIC0xMDksNiArMTEzLDggQEAKIAkJQ0FUQ0hfRUlOVFIod2FpdHBpZChwaWQsIE5VTEwsIDApKTsKIAl9CiAKK291dF9mcmVlMjoKKwlrZnJlZShkYXRhLmJ1Zik7CiBvdXRfY2xvc2U6CiAJaWYgKGZkc1sxXSAhPSAtMSkKIAkJY2xvc2UoZmRzWzFdKTsKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvdjg1MF9rc3ltcy5jIGIvYXJjaC92ODUwL2tlcm5lbC92ODUwX2tzeW1zLmMKaW5kZXggNjdiYzQ4ZS4uOTM1NzVmZCAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC92ODUwX2tzeW1zLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC92ODUwX2tzeW1zLmMKQEAgLTI0LDcgKzI0LDcgQEAKIEVYUE9SVF9TWU1CT0wgKF9fYnVnKTsKIAogLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCi1FWFBPUlRfU1lNQk9MIChjc3VtX3BhcnRpYWxfY29weSk7CitFWFBPUlRfU1lNQk9MIChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKIEVYUE9SVF9TWU1CT0wgKGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MIChpcF9jb21wdXRlX2NzdW0pOwogRVhQT1JUX1NZTUJPTCAoaXBfZmFzdF9jc3VtKTsKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvdjg1MC9saWIvY2hlY2tzdW0uYwppbmRleCBmYTU4NzI2Li4wNDIxNThkIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC92ODUwL2xpYi9jaGVja3N1bS5jCkBAIC04OCwzMiArODgsMzIgQEAKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewotCXJldHVybiB+ZG9fY3N1bShpcGgsaWhsKjQpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGlwaCxpaGwqNCk7CiB9CiAKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKLQlyZXR1cm4gfmRvX2NzdW0oYnVmZixsZW4pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGJ1ZmYsbGVuKTsKIH0KIAogLyoKICAqIGNvbXB1dGVzIGEgcGFydGlhbCBjaGVja3N1bSwgZS5nLiBmb3IgVENQL1VEUCBmcmFnbWVudHMKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOwotCWlmKHN1bSA+IHJlc3VsdCkKKwlyZXN1bHQgKz0gKF9fZm9yY2UgdTMyKXN1bTsKKwlpZiAoKF9fZm9yY2UgdTMyKXN1bSA+IHJlc3VsdCkKIAkJcmVzdWx0ICs9IDE7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpAQCAtMTIxLDggKzEyMSw4IEBACiAvKgogICogY29weSB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJLyoKIAkgKiBJdCdzIDI6MzAgYW0gYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGRvaW5nIGl0IHJlYWwgLi4uCkBAIC0xMzgsOSArMTM4LDkgQEAKICAqIENvcHkgZnJvbSB1c2Vyc3BhY2UgYW5kIGNvbXB1dGUgY2hlY2tzdW0uICBJZiB3ZSBjYXRjaCBhbiBleGNlcHRpb24KICAqIHRoZW4gemVybyB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCQkJCSAgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJICB2b2lkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jCmluZGV4IGUyMmVjZDUuLjQ3YjZkOTAzIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHlfcHJpbnRrLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJcmV0dXJuIDA7CiAJZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDE7CiAKLQlpZiAoIXN0cmNtcChidWYsImtlZXAiKSkKKwlpZiAoc3Ryc3RyKGJ1ZiwgImtlZXAiKSkKIAkJa2VlcF9lYXJseSA9IDE7CiAKIAlpZiAoIXN0cm5jbXAoYnVmLCAic2VyaWFsIiwgNikpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDE0NjU0ZTYuLmM4MDA4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtNzU0LDEwICs3NTQsOCBAQAogewogCS8qIEluaXRpYWxpemUgdmVjdG9yX2lycSBvbiBhIG5ldyBjcHUgKi8KIAkvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdmVjdG9yX2xvY2sgaGVsZCAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGlycSwgdmVjdG9yOwogCi0KIAkvKiBNYXJrIHRoZSBpbnVzZSB2ZWN0b3JzICovCiAJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFfVkVDVE9SUzsgKytpcnEpIHsKIAkJaWYgKCFjcHVfaXNzZXQoY3B1LCBpcnFfZG9tYWluW2lycV0pKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwppbmRleCBhMTUzZDBhLi4wZDY1YjIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjQyLDEyICsyNDIsMTkgQEAKICAqIHNldmVyZSBleGNlcHRpb24gKGRvdWJsZSBmYXVsdCwgbm1pLCBzdGFjayBmYXVsdCwgZGVidWcsIG1jZSkgaGFyZHdhcmUgc3RhY2sKICAqLwogCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdm9pZCAqcCkKK3sKKwl2b2lkICp0ID0gKHZvaWQgKil0aW5mbzsKKyAgICAgICAgcmV0dXJuIHAgPiB0ICYmIHAgPCB0ICsgVEhSRUFEX1NJWkUgLSAzOworfQorCiB2b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICogc3RhY2ssCiAJCXN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQogewogCWNvbnN0IHVuc2lnbmVkIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKWNwdV9wZGEoY3B1KS0+aXJxc3RhY2twdHI7CiAJdW5zaWduZWQgdXNlZCA9IDA7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbzsKIAogCWlmICghdHNrKQogCQl0c2sgPSBjdXJyZW50OwpAQCAtMzcwLDcgKzM3Nyw4IEBACiAJLyoKIAkgKiBUaGlzIGhhbmRsZXMgdGhlIHByb2Nlc3Mgc3RhY2s6CiAJICovCi0JSEFORExFX1NUQUNLICgoKGxvbmcpIHN0YWNrICYgKFRIUkVBRF9TSVpFLTEpKSAhPSAwKTsKKwl0aW5mbyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKwlIQU5ETEVfU1RBQ0sgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgc3RhY2spKTsKICN1bmRlZiBIQU5ETEVfU1RBQ0sKIH0KIEVYUE9SVF9TWU1CT0woZHVtcF90cmFjZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY3N1bS1wYXJ0aWFsLmMgYi9hcmNoL3g4Nl82NC9saWIvY3N1bS1wYXJ0aWFsLmMKaW5kZXggYzQ5MzczNS4uMDZhZTYzMCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NzdW0tcGFydGlhbC5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLXBhcnRpYWwuYwpAQCAtMTMyLDkgKzEzMiwxMCBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDY0LWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7Ci0JcmV0dXJuIGFkZDMyX3dpdGhfY2FycnkoZG9fY3N1bShidWZmLCBsZW4pLCBzdW0pOyAKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKWFkZDMyX3dpdGhfY2FycnkoZG9fY3N1bShidWZmLCBsZW4pLAorCQkJCQkJKF9fZm9yY2UgdTMyKXN1bSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKQEAgLTE0Myw3ICsxNDQsNyBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZixsZW4sMCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbGliL2NzdW0td3JhcHBlcnMuYyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLXdyYXBwZXJzLmMKaW5kZXggYjEzMjBlYy4uZmQ0MmE0YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NzdW0td3JhcHBlcnMuYworKysgYi9hcmNoL3g4Nl82NC9saWIvY3N1bS13cmFwcGVycy5jCkBAIC0xOCw5ICsxOCw5IEBACiAgKiBSZXR1cm5zIGFuIDMyYml0IHVuZm9sZGVkIGNoZWNrc3VtIG9mIHRoZSBidWZmZXIuCiAgKiBzcmMgYW5kIGRzdCBhcmUgYmVzdCBhbGlnbmVkIHRvIDY0Yml0cy4gCiAgKi8gCi11bnNpZ25lZCBpbnQgCi1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBpc3VtLCBpbnQgKmVycnApCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkgICAgaW50IGxlbiwgX193c3VtIGlzdW0sIGludCAqZXJycCkKIHsgCiAJbWlnaHRfc2xlZXAoKTsKIAkqZXJycCA9IDA7CkBAIC0zNCwxNyArMzQsMTkgQEAKIAkJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKXNyYyAmIDYpKSB7CQkJCiAJCQl3aGlsZSAoKCh1bnNpZ25lZCBsb25nKXNyYyAmIDYpICYmIGxlbiA+PSAyKSB7IAogCQkJCV9fdTE2IHZhbDE2OwkJCQotCQkJCSplcnJwID0gX19nZXRfdXNlcih2YWwxNiwgKF9fdTE2IF9fdXNlciAqKXNyYyk7IAorCQkJCSplcnJwID0gX19nZXRfdXNlcih2YWwxNiwgKGNvbnN0IF9fdTE2IF9fdXNlciAqKXNyYyk7CiAJCQkJaWYgKCplcnJwKQogCQkJCQlyZXR1cm4gaXN1bTsKIAkJCQkqKF9fdTE2ICopZHN0ID0gdmFsMTY7Ci0JCQkJaXN1bSA9IGFkZDMyX3dpdGhfY2FycnkoaXN1bSwgdmFsMTYpOyAKKwkJCQlpc3VtID0gKF9fZm9yY2UgX193c3VtKWFkZDMyX3dpdGhfY2FycnkoCisJCQkJCQkoX19mb3JjZSB1bnNpZ25lZClpc3VtLCB2YWwxNik7CiAJCQkJc3JjICs9IDI7IAogCQkJCWRzdCArPSAyOyAKIAkJCQlsZW4gLT0gMjsKIAkJCX0KIAkJfQotCQlpc3VtID0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSB2b2lkICopc3JjLGRzdCxsZW4saXN1bSxlcnJwLE5VTEwpOworCQlpc3VtID0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLAorCQkJCQlkc3QsIGxlbiwgaXN1bSwgZXJycCwgTlVMTCk7CiAJCWlmIChsaWtlbHkoKmVycnAgPT0gMCkpIAogCQkJcmV0dXJuIGlzdW07CiAJfSAKQEAgLTY2LDkgKzY4LDkgQEAKICAqIFJldHVybnMgYW4gMzJiaXQgdW5mb2xkZWQgY2hlY2tzdW0gb2YgdGhlIGJ1ZmZlci4KICAqIHNyYyBhbmQgZHN0IGFyZSBiZXN0IGFsaWduZWQgdG8gNjRiaXRzLgogICovIAotdW5zaWduZWQgaW50IAotY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcih1bnNpZ25lZCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkgIGludCBsZW4sIHVuc2lnbmVkIGludCBpc3VtLCBpbnQgKmVycnApCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLCB2b2lkIF9fdXNlciAqZHN0LAorCQkJICBpbnQgbGVuLCBfX3dzdW0gaXN1bSwgaW50ICplcnJwKQogeyAKIAltaWdodF9zbGVlcCgpOwogCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKSkgewpAQCAtNzksNyArODEsOCBAQAogCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylkc3QgJiA2KSkgewogCQl3aGlsZSAoKCh1bnNpZ25lZCBsb25nKWRzdCAmIDYpICYmIGxlbiA+PSAyKSB7IAogCQkJX191MTYgdmFsMTYgPSAqKF9fdTE2ICopc3JjOwotCQkJaXN1bSA9IGFkZDMyX3dpdGhfY2FycnkoaXN1bSwgdmFsMTYpOworCQkJaXN1bSA9IChfX2ZvcmNlIF9fd3N1bSlhZGQzMl93aXRoX2NhcnJ5KAorCQkJCQkoX19mb3JjZSB1bnNpZ25lZClpc3VtLCB2YWwxNik7CiAJCQkqZXJycCA9IF9fcHV0X3VzZXIodmFsMTYsIChfX3UxNiBfX3VzZXIgKilkc3QpOwogCQkJaWYgKCplcnJwKQogCQkJCXJldHVybiBpc3VtOwpAQCAtMTA0LDE5ICsxMDcsMjEgQEAKICAqIAogICogUmV0dXJucyBhbiAzMmJpdCB1bmZvbGRlZCBjaGVja3N1bSBvZiB0aGUgYnVmZmVyLgogICovIAotdW5zaWduZWQgaW50IAotY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsgCiAJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLGRzdCxsZW4sc3VtLE5VTEwsTlVMTCk7CiB9IAogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKIAotdW5zaWduZWQgc2hvcnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkgICAgICAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkgCitfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCV9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJX191NjQgcmVzdCwgc3VtNjQ7CiAgICAgIAotCXJlc3QgPSAoX191NjQpaHRvbmwobGVuKSArIChfX3U2NClodG9ucyhwcm90bykgKyAoX191NjQpc3VtOworCXJlc3QgPSAoX19mb3JjZSBfX3U2NClodG9ubChsZW4pICsgKF9fZm9yY2UgX191NjQpaHRvbnMocHJvdG8pICsKKwkJKF9fZm9yY2UgX191NjQpc3VtOwogCWFzbSgiICBhZGRxICglW3NhZGRyXSksJVtzdW1dXG4iCiAJICAgICIgIGFkY3EgOCglW3NhZGRyXSksJVtzdW1dXG4iCiAJICAgICIgIGFkY3EgKCVbZGFkZHJdKSwlW3N1bV1cbiIgCkBAIC0xMjQsNyArMTI5LDcgQEAKIAkgICAgIiAgYWRjcSAkMCwlW3N1bV1cbiIKIAkgICAgOiBbc3VtXSAiPXIiIChzdW02NCkgCiAJICAgIDogIltzdW1dIiAocmVzdCksW3NhZGRyXSAiciIgKHNhZGRyKSwgW2RhZGRyXSAiciIgKGRhZGRyKSk7Ci0JcmV0dXJuIGNzdW1fZm9sZChhZGQzMl93aXRoX2NhcnJ5KHN1bTY0ICYgMHhmZmZmZmZmZiwgc3VtNjQ+PjMyKSk7CisJcmV0dXJuIGNzdW1fZm9sZCgoX19mb3JjZSBfX3dzdW0pYWRkMzJfd2l0aF9jYXJyeShzdW02NCAmIDB4ZmZmZmZmZmYsIHN1bTY0Pj4zMikpOwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1faXB2Nl9tYWdpYyk7CmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCA4Mzc2NmE2Li5hNTBmNDgxIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTE5LDExICsxOSw5IEBACiAKIGlmIEJMT0NLCiAKLSNYWFggLSBpdCBtYWtlcyBzZW5zZSB0byBlbmFibGUgdGhpcyBvbmx5IGZvciAzMi1iaXQgc3ViYXJjaCdzLCBub3QgZm9yIHg4Nl82NAotI2ZvciBpbnN0YW5jZS4KIGNvbmZpZyBMQkQKIAlib29sICJTdXBwb3J0IGZvciBMYXJnZSBCbG9jayBEZXZpY2VzIgotCWRlcGVuZHMgb24gWDg2IHx8IChNSVBTICYmIDMyQklUKSB8fCBQUEMzMiB8fCAoUzM5MCAmJiAhNjRCSVQpIHx8IFNVUEVSSCB8fCBVTUwKKwlkZXBlbmRzIG9uICE2NEJJVAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGxhcmdlIChiaWdnZXIgdGhhbiAyVEIpIGRpc2NzIHRvCiAJICB5b3VyIG1hY2hpbmUsIG9yIGlmIHlvdSB3YW50IHRvIGhhdmUgYSByYWlkIG9yIGxvb3BiYWNrIGRldmljZQpAQCAtNDQsNyArNDIsNyBAQAogCiBjb25maWcgTFNGCiAJYm9vbCAiU3VwcG9ydCBmb3IgTGFyZ2UgU2luZ2xlIEZpbGVzIgotCWRlcGVuZHMgb24gWDg2IHx8IChNSVBTICYmIDMyQklUKSB8fCBQUEMzMiB8fCBBUkNIX1MzOTBfMzEgfHwgU1VQRVJIIHx8IFVNTAorCWRlcGVuZHMgb24gITY0QklUCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGhhbmRsZSB2ZXJ5IGxhcmdlIGZpbGVzIChiaWdnZXIKIAkgIHRoYW4gMlRCKSwgb3RoZXJ3aXNlIHNheSBOLgpkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDUwYjk1ZTRjLi4wMDI0MjExIDEwMDY0NAotLS0gYS9ibG9jay9hcy1pb3NjaGVkLmMKKysrIGIvYmxvY2svYXMtaW9zY2hlZC5jCkBAIC0xMzE3LDcgKzEzMTcsNyBAQAogLyoKICAqIGluaXRpYWxpemUgZWxldmF0b3IgcHJpdmF0ZSBkYXRhIChhc19kYXRhKS4KICAqLwotc3RhdGljIHZvaWQgKmFzX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBlbGV2YXRvcl90ICplKQorc3RhdGljIHZvaWQgKmFzX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBhc19kYXRhICphZDsKIApkaWZmIC0tZ2l0IGEvYmxvY2svYmxrdHJhY2UuYyBiL2Jsb2NrL2Jsa3RyYWNlLmMKaW5kZXggMTM1NTkzYy4uNzRlMDJjMCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrdHJhY2UuYworKysgYi9ibG9jay9ibGt0cmFjZS5jCkBAIC0yMiwzMCArMjIsNTggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nIGxvbmcsIGJsa190cmFjZV9jcHVfb2Zmc2V0KSA9IHsgMCwgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmxrdHJhY2Vfc2VxIF9fcmVhZF9tb3N0bHkgPSAxOwogCiAvKgorICogU2VuZCBvdXQgYSBub3RpZnkgbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQgdHJhY2Vfbm90ZShzdHJ1Y3QgYmxrX3RyYWNlICpidCwgcGlkX3QgcGlkLCBpbnQgYWN0aW9uLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgYmxrX2lvX3RyYWNlICp0OworCisJdCA9IHJlbGF5X3Jlc2VydmUoYnQtPnJjaGFuLCBzaXplb2YoKnQpICsgbGVuKTsKKwlpZiAodCkgeworCQljb25zdCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJCXQtPm1hZ2ljID0gQkxLX0lPX1RSQUNFX01BR0lDIHwgQkxLX0lPX1RSQUNFX1ZFUlNJT047CisJCXQtPnRpbWUgPSBzY2hlZF9jbG9jaygpIC0gcGVyX2NwdShibGtfdHJhY2VfY3B1X29mZnNldCwgY3B1KTsKKwkJdC0+ZGV2aWNlID0gYnQtPmRldjsKKwkJdC0+YWN0aW9uID0gYWN0aW9uOworCQl0LT5waWQgPSBwaWQ7CisJCXQtPmNwdSA9IGNwdTsKKwkJdC0+cGR1X2xlbiA9IGxlbjsKKwkJbWVtY3B5KCh2b2lkICopIHQgKyBzaXplb2YoKnQpLCBkYXRhLCBsZW4pOworCX0KK30KKworLyoKICAqIFNlbmQgb3V0IGEgbm90aWZ5IGZvciB0aGlzIHByb2Nlc3MsIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBzaW5jZSBhIHRyYWNlCiAgKiBzdGFydGVkCiAgKi8KIHN0YXRpYyB2b2lkIHRyYWNlX25vdGVfdHNrKHN0cnVjdCBibGtfdHJhY2UgKmJ0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlzdHJ1Y3QgYmxrX2lvX3RyYWNlICp0OworCXRzay0+YnRyYWNlX3NlcSA9IGJsa3RyYWNlX3NlcTsKKwl0cmFjZV9ub3RlKGJ0LCB0c2stPnBpZCwgQkxLX1ROX1BST0NFU1MsIHRzay0+Y29tbSwgc2l6ZW9mKHRzay0+Y29tbSkpOworfQogCi0JdCA9IHJlbGF5X3Jlc2VydmUoYnQtPnJjaGFuLCBzaXplb2YoKnQpICsgc2l6ZW9mKHRzay0+Y29tbSkpOwotCWlmICh0KSB7Ci0JCXQtPm1hZ2ljID0gQkxLX0lPX1RSQUNFX01BR0lDIHwgQkxLX0lPX1RSQUNFX1ZFUlNJT047Ci0JCXQtPmRldmljZSA9IGJ0LT5kZXY7Ci0JCXQtPmFjdGlvbiA9IEJMS19UQ19BQ1QoQkxLX1RDX05PVElGWSk7Ci0JCXQtPnBpZCA9IHRzay0+cGlkOwotCQl0LT5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCXQtPnBkdV9sZW4gPSBzaXplb2YodHNrLT5jb21tKTsKLQkJbWVtY3B5KCh2b2lkICopIHQgKyBzaXplb2YoKnQpLCB0c2stPmNvbW0sIHQtPnBkdV9sZW4pOwotCQl0c2stPmJ0cmFjZV9zZXEgPSBibGt0cmFjZV9zZXE7Ci0JfQorc3RhdGljIHZvaWQgdHJhY2Vfbm90ZV90aW1lKHN0cnVjdCBibGtfdHJhY2UgKmJ0KQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgd29yZHNbMl07CisKKwlnZXRuc3RpbWVvZmRheSgmbm93KTsKKwl3b3Jkc1swXSA9IG5vdy50dl9zZWM7CisJd29yZHNbMV0gPSBub3cudHZfbnNlYzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0cmFjZV9ub3RlKGJ0LCAwLCBCTEtfVE5fVElNRVNUQU1QLCB3b3Jkcywgc2l6ZW9mKHdvcmRzKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IGFjdF9sb2dfY2hlY2soc3RydWN0IGJsa190cmFjZSAqYnQsIHUzMiB3aGF0LCBzZWN0b3JfdCBzZWN0b3IsCkBAIC0zOTQsNiArNDIyLDggQEAKIAkJCWJsa3RyYWNlX3NlcSsrOwogCQkJc21wX21iKCk7CiAJCQlidC0+dHJhY2Vfc3RhdGUgPSBCbGt0cmFjZV9ydW5uaW5nOworCisJCQl0cmFjZV9ub3RlX3RpbWUoYnQpOwogCQkJcmV0ID0gMDsKIAkJfQogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCAxZDljM2M3Li5lOTAxOWVkIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTE0NjQsOCArMTQ2NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jZnFfdXBkYXRlX2lvX3NlZWt0aW1lKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMsCi0JCSAgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitjZnFfdXBkYXRlX2lvX3NlZWt0aW1lKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc2VjdG9yX3Qgc2Rpc3Q7CiAJdTY0IHRvdGFsOwpAQCAtMTYxNyw3ICsxNjE2LDcgQEAKIAl9CiAKIAljZnFfdXBkYXRlX2lvX3RoaW5rdGltZShjZnFkLCBjaWMpOwotCWNmcV91cGRhdGVfaW9fc2Vla3RpbWUoY2ZxZCwgY2ljLCBycSk7CisJY2ZxX3VwZGF0ZV9pb19zZWVrdGltZShjaWMsIHJxKTsKIAljZnFfdXBkYXRlX2lkbGVfd2luZG93KGNmcWQsIGNmcXEsIGNpYyk7CiAKIAljaWMtPmxhc3RfcXVldWUgPSBqaWZmaWVzOwpAQCAtMTc3MCw3ICsxNzY5LDcgQEAKIC8qCiAgKiBxdWV1ZSBsb2NrIGhlbGQgaGVyZQogICovCi1zdGF0aWMgdm9pZCBjZnFfcHV0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBjZnFfcHV0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBSUV9DRlFRKHJxKTsKIApAQCAtMTk1MSw3ICsxOTUwLDcgQEAKIAlrZnJlZShjZnFkKTsKIH0KIAotc3RhdGljIHZvaWQgKmNmcV9pbml0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgZWxldmF0b3JfdCAqZSkKK3N0YXRpYyB2b2lkICpjZnFfaW5pdF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkOwogCWludCBpOwpkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IGI3YzViMzQuLjZkNjczZTkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogLyoKICAqIGluaXRpYWxpemUgZWxldmF0b3IgcHJpdmF0ZSBkYXRhIChkZWFkbGluZV9kYXRhKS4KICAqLwotc3RhdGljIHZvaWQgKmRlYWRsaW5lX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBlbGV2YXRvcl90ICplKQorc3RhdGljIHZvaWQgKmRlYWRsaW5lX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZDsKIApkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggOGNjZDE2My4uYzAwNjNmMyAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogc3RhdGljIHZvaWQgKmVsZXZhdG9yX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmVxKQogewotCXJldHVybiBlcS0+b3BzLT5lbGV2YXRvcl9pbml0X2ZuKHEsIGVxKTsKKwlyZXR1cm4gZXEtPm9wcy0+ZWxldmF0b3JfaW5pdF9mbihxKTsKIH0KIAogc3RhdGljIHZvaWQgZWxldmF0b3JfYXR0YWNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplcSwKQEAgLTgxMCw3ICs4MTAsNyBAQAogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX3B1dF9yZXFfZm4pCi0JCWUtPm9wcy0+ZWxldmF0b3JfcHV0X3JlcV9mbihxLCBycSk7CisJCWUtPm9wcy0+ZWxldmF0b3JfcHV0X3JlcV9mbihycSk7CiB9CiAKIGludCBlbHZfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQpkaWZmIC0tZ2l0IGEvYmxvY2svbGxfcndfYmxrLmMgYi9ibG9jay9sbF9yd19ibGsuYwppbmRleCA5ZWFlZTY2Li4wZjgyZTEyIDEwMDY0NAotLS0gYS9ibG9jay9sbF9yd19ibGsuYworKysgYi9ibG9jay9sbF9yd19ibGsuYwpAQCAtMjMyMiw2ICsyMzIyLDg0IEBACiAKIEVYUE9SVF9TWU1CT0woYmxrX2luc2VydF9yZXF1ZXN0KTsKIAorc3RhdGljIGludCBfX2Jsa19ycV91bm1hcF91c2VyKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChiaW8pIHsKKwkJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX1VTRVJfTUFQUEVEKSkKKwkJCWJpb191bm1hcF91c2VyKGJpbyk7CisJCWVsc2UKKwkJCXJldCA9IGJpb191bmNvcHlfdXNlcihiaW8pOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19ibGtfcnFfbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkgICAgIHZvaWQgX191c2VyICp1YnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgdWFkZHI7CisJc3RydWN0IGJpbyAqYmlvLCAqb3JpZ19iaW87CisJaW50IHJlYWRpbmcsIHJldDsKKworCXJlYWRpbmcgPSBycV9kYXRhX2RpcihycSkgPT0gUkVBRDsKKworCS8qCisJICogaWYgYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzIHNhdGlzZmllZCwgbWFwIGluIHVzZXIgcGFnZXMgZm9yCisJICogZGlyZWN0IGRtYS4gZWxzZSwgc2V0IHVwIGtlcm5lbCBib3VuY2UgYnVmZmVycworCSAqLworCXVhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHVidWY7CisJaWYgKCEodWFkZHIgJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSAmJiAhKGxlbiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpKQorCQliaW8gPSBiaW9fbWFwX3VzZXIocSwgTlVMTCwgdWFkZHIsIGxlbiwgcmVhZGluZyk7CisJZWxzZQorCQliaW8gPSBiaW9fY29weV91c2VyKHEsIHVhZGRyLCBsZW4sIHJlYWRpbmcpOworCisJaWYgKElTX0VSUihiaW8pKSB7CisJCXJldHVybiBQVFJfRVJSKGJpbyk7CisJfQorCisJb3JpZ19iaW8gPSBiaW87CisJYmxrX3F1ZXVlX2JvdW5jZShxLCAmYmlvKTsKKwkvKgorCSAqIFdlIGxpbmsgdGhlIGJvdW5jZSBidWZmZXIgaW4gYW5kIGNvdWxkIGhhdmUgdG8gdHJhdmVyc2UgaXQKKwkgKiBsYXRlciBzbyB3ZSBoYXZlIHRvIGdldCBhIHJlZiB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgZnJlZWQKKwkgKi8KKwliaW9fZ2V0KGJpbyk7CisKKwkvKgorCSAqIGZvciBtb3N0IChhbGw/IGRvbid0IGtub3cgb2YgYW55KSBxdWV1ZXMgd2UgY291bGQKKwkgKiBza2lwIGdyYWJiaW5nIHRoZSBxdWV1ZSBsb2NrIGhlcmUuIG9ubHkgZHJpdmVycyB3aXRoCisJICogZnVua3kgcHJpdmF0ZSAtPmJhY2tfbWVyZ2VfZm4oKSBmdW5jdGlvbiBjb3VsZCBiZQorCSAqIHByb2JsZW1hdGljLgorCSAqLworCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJaWYgKCFycS0+YmlvKQorCQlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7CisJZWxzZSBpZiAoIXEtPmJhY2tfbWVyZ2VfZm4ocSwgcnEsIGJpbykpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCQlnb3RvIHVubWFwX2JpbzsKKwl9IGVsc2UgeworCQlycS0+YmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKKwkJcnEtPmJpb3RhaWwgPSBiaW87CisKKwkJcnEtPm5yX3NlY3RvcnMgKz0gYmlvX3NlY3RvcnMoYmlvKTsKKwkJcnEtPmhhcmRfbnJfc2VjdG9ycyA9IHJxLT5ucl9zZWN0b3JzOworCQlycS0+ZGF0YV9sZW4gKz0gYmlvLT5iaV9zaXplOworCX0KKwlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CisKKwlyZXR1cm4gYmlvLT5iaV9zaXplOworCit1bm1hcF9iaW86CisJLyogaWYgaXQgd2FzIGJvdWNuZWQgd2UgbXVzdCBjYWxsIHRoZSBlbmQgaW8gZnVuY3Rpb24gKi8KKwliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIDApOworCV9fYmxrX3JxX3VubWFwX3VzZXIob3JpZ19iaW8pOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIGJsa19ycV9tYXBfdXNlciAtIG1hcCB1c2VyIGRhdGEgdG8gYSByZXF1ZXN0LCBmb3IgUkVRX0JMT0NLX1BDIHVzYWdlCiAgKiBAcToJCXJlcXVlc3QgcXVldWUgd2hlcmUgcmVxdWVzdCBzaG91bGQgYmUgaW5zZXJ0ZWQKQEAgLTIzNDMsNDIgKzI0MjEsNDQgQEAKICAqICAgIHVubWFwcGluZy4KICAqLwogaW50IGJsa19ycV9tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCBfX3VzZXIgKnVidWYsCi0JCSAgICB1bnNpZ25lZCBpbnQgbGVuKQorCQkgICAgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0JdW5zaWduZWQgbG9uZyB1YWRkcjsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IHJlYWRpbmc7CisJdW5zaWduZWQgbG9uZyBieXRlc19yZWFkID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKGxlbiA+IChxLT5tYXhfaHdfc2VjdG9ycyA8PCA5KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFsZW4gfHwgIXVidWYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmVhZGluZyA9IHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEOworCXdoaWxlIChieXRlc19yZWFkICE9IGxlbikgeworCQl1bnNpZ25lZCBsb25nIG1hcF9sZW4sIGVuZCwgc3RhcnQ7CiAKLQkvKgotCSAqIGlmIGFsaWdubWVudCByZXF1aXJlbWVudCBpcyBzYXRpc2ZpZWQsIG1hcCBpbiB1c2VyIHBhZ2VzIGZvcgotCSAqIGRpcmVjdCBkbWEuIGVsc2UsIHNldCB1cCBrZXJuZWwgYm91bmNlIGJ1ZmZlcnMKLQkgKi8KLQl1YWRkciA9ICh1bnNpZ25lZCBsb25nKSB1YnVmOwotCWlmICghKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkgJiYgIShsZW4gJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSkKLQkJYmlvID0gYmlvX21hcF91c2VyKHEsIE5VTEwsIHVhZGRyLCBsZW4sIHJlYWRpbmcpOwotCWVsc2UKLQkJYmlvID0gYmlvX2NvcHlfdXNlcihxLCB1YWRkciwgbGVuLCByZWFkaW5nKTsKKwkJbWFwX2xlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbiAtIGJ5dGVzX3JlYWQsIEJJT19NQVhfU0laRSk7CisJCWVuZCA9ICgodW5zaWduZWQgbG9uZyl1YnVmICsgbWFwX2xlbiArIFBBR0VfU0laRSAtIDEpCisJCQkJCQkJCT4+IFBBR0VfU0hJRlQ7CisJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpdWJ1ZiA+PiBQQUdFX1NISUZUOwogCi0JaWYgKCFJU19FUlIoYmlvKSkgewotCQlycS0+YmlvID0gcnEtPmJpb3RhaWwgPSBiaW87Ci0JCWJsa19ycV9iaW9fcHJlcChxLCBycSwgYmlvKTsKKwkJLyoKKwkJICogQSBiYWQgb2Zmc2V0IGNvdWxkIGNhdXNlIHVzIHRvIHJlcXVpcmUgQklPX01BWF9QQUdFUyArIDEKKwkJICogcGFnZXMuIElmIHRoaXMgaGFwcGVucyB3ZSBqdXN0IGxvd2VyIHRoZSByZXF1ZXN0ZWQKKwkJICogbWFwcGluZyBsZW4gYnkgYSBwYWdlIHNvIHRoYXQgd2UgY2FuIGZpdAorCQkgKi8KKwkJaWYgKGVuZCAtIHN0YXJ0ID4gQklPX01BWF9QQUdFUykKKwkJCW1hcF9sZW4gLT0gUEFHRV9TSVpFOwogCi0JCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7Ci0JCXJxLT5kYXRhX2xlbiA9IGxlbjsKLQkJcmV0dXJuIDA7CisJCXJldCA9IF9fYmxrX3JxX21hcF91c2VyKHEsIHJxLCB1YnVmLCBtYXBfbGVuKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIHVubWFwX3JxOworCQlieXRlc19yZWFkICs9IHJldDsKKwkJdWJ1ZiArPSByZXQ7CiAJfQogCi0JLyoKLQkgKiBiaW8gaXMgdGhlIGVyci1wdHIKLQkgKi8KLQlyZXR1cm4gUFRSX0VSUihiaW8pOworCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit1bm1hcF9ycToKKwlibGtfcnFfdW5tYXBfdXNlcihycSk7CisJcmV0dXJuIHJldDsKIH0KIAogRVhQT1JUX1NZTUJPTChibGtfcnFfbWFwX3VzZXIpOwpAQCAtMjQwNCw3ICsyNDg0LDcgQEAKICAqICAgIHVubWFwcGluZy4KICAqLwogaW50IGJsa19ycV9tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCi0JCQlzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCkKKwkJCXN0cnVjdCBzZ19pb3ZlYyAqaW92LCBpbnQgaW92X2NvdW50LCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBiaW8gKmJpbzsKIApAQCAtMjQxOCwxMCArMjQ5OCwxNSBAQAogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKIAotCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKKwlpZiAoYmlvLT5iaV9zaXplICE9IGxlbikgeworCQliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIDApOworCQliaW9fdW5tYXBfdXNlcihiaW8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliaW9fZ2V0KGJpbyk7CiAJYmxrX3JxX2Jpb19wcmVwKHEsIHJxLCBiaW8pOwogCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7Ci0JcnEtPmRhdGFfbGVuID0gYmlvLT5iaV9zaXplOwogCXJldHVybiAwOwogfQogCkBAIC0yNDI5LDIzICsyNTE0LDI2IEBACiAKIC8qKgogICogYmxrX3JxX3VubWFwX3VzZXIgLSB1bm1hcCBhIHJlcXVlc3Qgd2l0aCB1c2VyIGRhdGEKLSAqIEBiaW86CWJpbyB0byBiZSB1bm1hcHBlZAotICogQHVsZW46CWxlbmd0aCBvZiB1c2VyIGJ1ZmZlcgorICogQHJxOgkJcnEgdG8gYmUgdW5tYXBwZWQKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgIFVubWFwIGEgYmlvIHByZXZpb3VzbHkgbWFwcGVkIGJ5IGJsa19ycV9tYXBfdXNlcigpLgorICogICAgVW5tYXAgYSBycSBwcmV2aW91c2x5IG1hcHBlZCBieSBibGtfcnFfbWFwX3VzZXIoKS4KKyAqICAgIHJxLT5iaW8gbXVzdCBiZSBzZXQgdG8gdGhlIG9yaWdpbmFsIGhlYWQgb2YgdGhlIHJlcXVlc3QuCiAgKi8KLWludCBibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCB1bGVuKQoraW50IGJsa19ycV91bm1hcF91c2VyKHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYmlvICpiaW8sICptYXBwZWRfYmlvOwogCi0JaWYgKGJpbykgewotCQlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVNFUl9NQVBQRUQpKQotCQkJYmlvX3VubWFwX3VzZXIoYmlvKTsKKwl3aGlsZSAoKGJpbyA9IHJxLT5iaW8pKSB7CisJCWlmIChiaW9fZmxhZ2dlZChiaW8sIEJJT19CT1VOQ0VEKSkKKwkJCW1hcHBlZF9iaW8gPSBiaW8tPmJpX3ByaXZhdGU7CiAJCWVsc2UKLQkJCXJldCA9IGJpb191bmNvcHlfdXNlcihiaW8pOwotCX0KKwkJCW1hcHBlZF9iaW8gPSBiaW87CiAKKwkJX19ibGtfcnFfdW5tYXBfdXNlcihtYXBwZWRfYmlvKTsKKwkJcnEtPmJpbyA9IGJpby0+YmlfbmV4dDsKKwkJYmlvX3B1dChiaW8pOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ3NiwxMSArMjU2NCw4IEBACiAJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKIAkJYmlvLT5iaV9ydyB8PSAoMSA8PCBCSU9fUlcpOwogCi0JcnEtPmJpbyA9IHJxLT5iaW90YWlsID0gYmlvOwogCWJsa19ycV9iaW9fcHJlcChxLCBycSwgYmlvKTsKLQogCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7Ci0JcnEtPmRhdGFfbGVuID0gbGVuOwogCXJldHVybiAwOwogfQogCkBAIC0zNDk1LDYgKzM1ODAsNyBAQAogCXJxLT5oYXJkX2N1cl9zZWN0b3JzID0gcnEtPmN1cnJlbnRfbnJfc2VjdG9yczsKIAlycS0+aGFyZF9ucl9zZWN0b3JzID0gcnEtPm5yX3NlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pOwogCXJxLT5idWZmZXIgPSBiaW9fZGF0YShiaW8pOworCXJxLT5kYXRhX2xlbiA9IGJpby0+Ymlfc2l6ZTsKIAogCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKIH0KZGlmZiAtLWdpdCBhL2Jsb2NrL25vb3AtaW9zY2hlZC5jIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKaW5kZXggNzlhZjQzMS4uMWMzZGUyYiAxMDA2NDQKLS0tIGEvYmxvY2svbm9vcC1pb3NjaGVkLmMKKysrIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlyZXR1cm4gbGlzdF9lbnRyeShycS0+cXVldWVsaXN0Lm5leHQsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpOwogfQogCi1zdGF0aWMgdm9pZCAqbm9vcF9pbml0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgZWxldmF0b3JfdCAqZSkKK3N0YXRpYyB2b2lkICpub29wX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBub29wX2RhdGEgKm5kOwogCmRpZmYgLS1naXQgYS9ibG9jay9zY3NpX2lvY3RsLmMgYi9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggZGNkOWM3MS4uYjNlMjEwNyAxMDA2NDQKLS0tIGEvYmxvY2svc2NzaV9pb2N0bC5jCisrKyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtMjI2LDcgKzIyNiw2IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwogCWludCB3cml0aW5nID0gMCwgcmV0ID0gMDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0Jc3RydWN0IGJpbyAqYmlvOwogCWNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAl1bnNpZ25lZCBjaGFyIGNtZFtCTEtfTUFYX0NEQl07CiAKQEAgLTI1OCw2ICsyNTcsMzIgQEAKIAlpZiAoIXJxKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOworCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCisJbWVtY3B5KHJxLT5jbWQsIGNtZCwgaGRyLT5jbWRfbGVuKTsKKworCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7CisJcnEtPnNlbnNlID0gc2Vuc2U7CisJcnEtPnNlbnNlX2xlbiA9IDA7CisKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCS8qCisJICogYm91bmNlIHRoaXMgYWZ0ZXIgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgYmlvLCBpdCdzCisJICogbmVlZGVkIGZvciBwcm9wZXIgdW5tYXBwaW5nCisJICovCisJaWYgKHJxLT5iaW8pCisJCWJsa19xdWV1ZV9ib3VuY2UocSwgJnJxLT5iaW8pOworCisJcnEtPnRpbWVvdXQgPSBqaWZmaWVzX3RvX21zZWNzKGhkci0+dGltZW91dCk7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwogCWlmIChoZHItPmlvdmVjX2NvdW50KSB7CiAJCWNvbnN0IGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzZ19pb3ZlYykgKiBoZHItPmlvdmVjX2NvdW50OwogCQlzdHJ1Y3Qgc2dfaW92ZWMgKmlvdjsKQEAgLTI3NCw3ICsyOTksOCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyZXQgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBpb3YsIGhkci0+aW92ZWNfY291bnQpOworCQlyZXQgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBpb3YsIGhkci0+aW92ZWNfY291bnQsCisJCQkJCSAgaGRyLT5keGZlcl9sZW4pOwogCQlrZnJlZShpb3YpOwogCX0gZWxzZSBpZiAoaGRyLT5keGZlcl9sZW4pCiAJCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgaGRyLT5keGZlcnAsIGhkci0+ZHhmZXJfbGVuKTsKQEAgLTI4MiwzMyArMzA4LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQotCSAqLwotCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOwotCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCi0JbWVtY3B5KHJxLT5jbWQsIGNtZCwgaGRyLT5jbWRfbGVuKTsKLQotCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7Ci0JcnEtPnNlbnNlID0gc2Vuc2U7Ci0JcnEtPnNlbnNlX2xlbiA9IDA7Ci0KLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKLQliaW8gPSBycS0+YmlvOwotCi0JLyoKLQkgKiBib3VuY2UgdGhpcyBhZnRlciBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBiaW8sIGl0J3MKLQkgKiBuZWVkZWQgZm9yIHByb3BlciB1bm1hcHBpbmcKLQkgKi8KLQlpZiAocnEtPmJpbykKLQkJYmxrX3F1ZXVlX2JvdW5jZShxLCAmcnEtPmJpbyk7Ci0KLQlycS0+dGltZW91dCA9IGppZmZpZXNfdG9fbXNlY3MoaGRyLT50aW1lb3V0KTsKLQlpZiAoIXJxLT50aW1lb3V0KQotCQlycS0+dGltZW91dCA9IHEtPnNnX3RpbWVvdXQ7Ci0JaWYgKCFycS0+dGltZW91dCkKLQkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9USU1FT1VUOwotCiAJcnEtPnJldHJpZXMgPSAwOwogCiAJc3RhcnRfdGltZSA9IGppZmZpZXM7CkBAIC0zMzksNyArMzM4LDcgQEAKIAkJCWhkci0+c2JfbGVuX3dyID0gbGVuOwogCX0KIAotCWlmIChibGtfcnFfdW5tYXBfdXNlcihiaW8sIGhkci0+ZHhmZXJfbGVuKSkKKwlpZiAoYmxrX3JxX3VubWFwX3VzZXIocnEpKQogCQlyZXQgPSAtRUZBVUxUOwogCiAJLyogbWF5IG5vdCBoYXZlIHN1Y2NlZWRlZCwgYnV0IG91dHB1dCB2YWx1ZXMgd3JpdHRlbiB0byBjb250cm9sCmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCA0YWMxNGRhLi42NzcxMTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTc3LDMgKzc3LDQgQEAKIG9iai0kKENPTkZJR19TVVBFUkgpCQkrPSBzaC8KIG9iai0kKENPTkZJR19HRU5FUklDX1RJTUUpCSs9IGNsb2Nrc291cmNlLwogb2JqLSQoQ09ORklHX0RNQV9FTkdJTkUpCSs9IGRtYS8KK29iai0kKENPTkZJR19QUENfUFMzKQkJKz0gcHMzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RvY2suYyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKaW5kZXggNTc4Yjk5Yi4uYmY1Yjc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RvY2suYworKysgYi9kcml2ZXJzL2FjcGkvZG9jay5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDEwZjE2MGQuLmEyZjQ2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMjY3LDkgKzI2Nyw5IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JaWYgKGRldi0+ZmlybXdhcmVfZGF0YSkgeworCWlmIChkZXYtPmFyY2hkYXRhLmFjcGlfaGFuZGxlKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCSAgICAgICAiRHJpdmVycyBjaGFuZ2VkICdmaXJtd2FyZV9kYXRhJyBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwkJICAgICAgICJEcml2ZXJzIGNoYW5nZWQgJ2FjcGlfaGFuZGxlJyBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWdldF9kZXZpY2UoZGV2KTsKQEAgLTI3OCwyNSArMjc4LDI2IEBACiAJCXB1dF9kZXZpY2UoZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWRldi0+ZmlybXdhcmVfZGF0YSA9IGhhbmRsZTsKKwlkZXYtPmFyY2hkYXRhLmFjcGlfaGFuZGxlID0gaGFuZGxlOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV91bmJpbmRfb25lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+ZmlybXdhcmVfZGF0YSkKKwlpZiAoIWRldi0+YXJjaGRhdGEuYWNwaV9oYW5kbGUpCiAJCXJldHVybiAwOwotCWlmIChkZXYgPT0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGRldi0+ZmlybXdhcmVfZGF0YSkpIHsKKwlpZiAoZGV2ID09IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXYtPmFyY2hkYXRhLmFjcGlfaGFuZGxlKSkgewogCQkvKiBhY3BpX2dldF9waHlzaWNhbF9kZXZpY2UgaW5jcmVhc2UgcmVmY250IGJ5IG9uZSAqLwogCQlwdXRfZGV2aWNlKGRldik7Ci0JCWFjcGlfZGV0YWNoX2RhdGEoZGV2LT5maXJtd2FyZV9kYXRhLCBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyKTsKLQkJZGV2LT5maXJtd2FyZV9kYXRhID0gTlVMTDsKKwkJYWNwaV9kZXRhY2hfZGF0YShkZXYtPmFyY2hkYXRhLmFjcGlfaGFuZGxlLAorCQkJCSBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyKTsKKwkJZGV2LT5hcmNoZGF0YS5hY3BpX2hhbmRsZSA9IE5VTEw7CiAJCS8qIGFjcGlfYmluZF9vbmUgaW5jcmVhc2UgcmVmY250IGJ5IG9uZSAqLwogCQlwdXRfZGV2aWNlKGRldik7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAotCQkgICAgICAgIk9vcHMsICdmaXJtd2FyZV9kYXRhJyBjb3JydXB0IGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOworCQkgICAgICAgIk9vcHMsICdhY3BpX2hhbmRsZScgY29ycnVwdCBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjgsNyArMzI5LDggQEAKIAlpZiAoIXJldCkgewogCQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCi0JCWFjcGlfZ2V0X25hbWUoZGV2LT5maXJtd2FyZV9kYXRhLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCQlhY3BpX2dldF9uYW1lKGRldi0+YXJjaGRhdGEuYWNwaV9oYW5kbGUsCisJCQkgICAgICBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCQlEQkcoIkRldmljZSAlcyAtPiAlc1xuIiwgZGV2LT5idXNfaWQsIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOwogCQlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IDdiYTVlNDkuLjZmZDE3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC04MywxMCArODMsOCBAQAogCQlnb3RvIG91dDsKIAogCXBwYyA9ICh1bnNpZ25lZCBpbnQpcHItPnBlcmZvcm1hbmNlX3BsYXRmb3JtX2xpbWl0OwotCWlmICghcHBjKQotCQlnb3RvIG91dDsKIAotCWlmIChwcGMgPiBwci0+cGVyZm9ybWFuY2UtPnN0YXRlX2NvdW50KQorCWlmIChwcGMgPj0gcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudCkKIAkJZ290byBvdXQ7CiAKIAljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IDAzZjYzMzguLjk4NGFiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtMzI4LDYgKzMyOCwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgUEFUQV9NQVJWRUxMCisJdHJpc3RhdGUgIk1hcnZlbGwgUEFUQSBzdXBwb3J0IHZpYSBsZWdhY3kgbW9kZSIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgbGltaXRlZCBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCA4OFNFNjE0NSBBVEEKKwkgIGNvbnRyb2xsZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBQQVRBX01QSUlYCiAJdHJpc3RhdGUgIkludGVsIFBBVEEgTVBJSVggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtNDgzLDYgKzQ5MiwzMiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgUEFUQV9XSU5CT05EX1ZMQgorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc1OUEgVkxCIFBBVEEgc3VwcG9ydCAoRXhwZXJpbWVudGFsKSIKKwlkZXBlbmRzIG9uIElTQSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM3NTlBIGNvbnRyb2xsZXIgb24gVmVzYSBMb2NhbCBCdXMKKwkgIHN5c3RlbXMuCisKK2NvbmZpZyBQQVRBX1BMQVRGT1JNCisJdHJpc3RhdGUgIkdlbmVyaWMgcGxhdGZvcm0gZGV2aWNlIFBBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVNQkVEREVECisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBnZW5lcmljIGRpcmVjdGx5IGNvbm5lY3RlZCBBVEEKKwkgIGRldmljZXMgY29tbW9ubHkgZm91bmQgb24gZW1iZWRkZWQgc3lzdGVtcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBBVEFfSVhQNFhYX0NGCisJdHJpc3RhdGUgIklYUDRYWCBDb21wYWN0IEZsYXNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0lYUDRYWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYSBDb21wYWN0IEZsYXNoIGNvbm5lY3RlZCBvbgorCSAgdGhlIGl4cDR4eCBleHBhbnNpb24gYnVzLiBUaGlzIGRyaXZlciBoYWQgYmVlbiB3cml0dGVuIGZvcgorCSAgTG9mdC9BdmlsYSBib2FyZHMgaW4gbWluZCBidXQgY2FuIHdvcmsgd2l0aCBvdGhlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZGlmCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL01ha2VmaWxlIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKaW5kZXggNzIyNDNhNi4uYmMzZDgxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAKIG9iai0kKENPTkZJR19QQVRBX05TODc0MTApCSs9IHBhdGFfbnM4NzQxMC5vCiBvYmotJChDT05GSUdfUEFUQV9PUFRJKQkJKz0gcGF0YV9vcHRpLm8KIG9iai0kKENPTkZJR19QQVRBX09QVElETUEpCSs9IHBhdGFfb3B0aWRtYS5vCitvYmotJChDT05GSUdfUEFUQV9NQVJWRUxMKQkrPSBwYXRhX21hcnZlbGwubwogb2JqLSQoQ09ORklHX1BBVEFfTVBJSVgpCSs9IHBhdGFfbXBpaXgubwogb2JqLSQoQ09ORklHX1BBVEFfT0xEUElJWCkJKz0gcGF0YV9vbGRwaWl4Lm8KIG9iai0kKENPTkZJR19QQVRBX1BDTUNJQSkJKz0gcGF0YV9wY21jaWEubwpAQCAtNTEsOCArNTIsMTEgQEAKIG9iai0kKENPTkZJR19QQVRBX1NJTDY4MCkJKz0gcGF0YV9zaWw2ODAubwogb2JqLSQoQ09ORklHX1BBVEFfVklBKQkJKz0gcGF0YV92aWEubwogb2JqLSQoQ09ORklHX1BBVEFfV0lOQk9ORCkJKz0gcGF0YV9zbDgyYzEwNS5vCitvYmotJChDT05GSUdfUEFUQV9XSU5CT05EX1ZMQikJKz0gcGF0YV93aW5ib25kLm8KIG9iai0kKENPTkZJR19QQVRBX1NJUykJCSs9IHBhdGFfc2lzLm8KIG9iai0kKENPTkZJR19QQVRBX1RSSUZMRVgpCSs9IHBhdGFfdHJpZmxleC5vCitvYmotJChDT05GSUdfUEFUQV9JWFA0WFhfQ0YpCSs9IHBhdGFfaXhwNHh4X2NmLm8KK29iai0kKENPTkZJR19QQVRBX1BMQVRGT1JNKQkrPSBwYXRhX3BsYXRmb3JtLm8KICMgU2hvdWxkIGJlIGxhc3QgYnV0IG9uZSBsaWJhdGEgZHJpdmVyCiBvYmotJChDT05GSUdfQVRBX0dFTkVSSUMpCSs9IGF0YV9nZW5lcmljLm8KICMgU2hvdWxkIGJlIGxhc3QgbGliYXRhIGRyaXZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5jIGIvZHJpdmVycy9hdGEvYWhjaS5jCmluZGV4IDIzNDE5N2UuLmYzNmRhNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuYworKysgYi9kcml2ZXJzL2F0YS9haGNpLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogZW51bSB7CiAJQUhDSV9QQ0lfQkFSCQk9IDUsCisJQUhDSV9NQVhfUE9SVFMJCT0gMzIsCiAJQUhDSV9NQVhfU0cJCT0gMTY4LCAvKiBoYXJkd2FyZSBtYXggaXMgNjRLICovCiAJQUhDSV9ETUFfQk9VTkRBUlkJPSAweGZmZmZmZmZmLAogCUFIQ0lfVVNFX0NMVVNURVJJTkcJPSAwLApAQCAtNzcsNyArNzgsOSBAQAogCVJYX0ZJU19VTksJCT0gMHg2MCwgLyogb2Zmc2V0IG9mIFVua25vd24gRklTIGRhdGEgKi8KIAogCWJvYXJkX2FoY2kJCT0gMCwKLQlib2FyZF9haGNpX3Z0ODI1MQk9IDEsCisJYm9hcmRfYWhjaV9waQkJPSAxLAorCWJvYXJkX2FoY2lfdnQ4MjUxCT0gMiwKKwlib2FyZF9haGNpX2lnbl9pZmVycgk9IDMsCiAKIAkvKiBnbG9iYWwgY29udHJvbGxlciByZWdpc3RlcnMgKi8KIAlIT1NUX0NBUAkJPSAweDAwLCAvKiBob3N0IGNhcGFiaWxpdGllcyAqLwpAQCAtMTY2LDggKzE2OSw5IEBACiAJQUhDSV9GTEFHX01TSQkJPSAoMSA8PCAwKSwKIAogCS8qIGFwLT5mbGFncyBiaXRzICovCi0JQUhDSV9GTEFHX1JFU0VUX05FRURTX0NMTwk9ICgxIDw8IDI0KSwKLQlBSENJX0ZMQUdfTk9fTkNRCQk9ICgxIDw8IDI1KSwKKwlBSENJX0ZMQUdfTk9fTkNRCQk9ICgxIDw8IDI0KSwKKwlBSENJX0ZMQUdfSUdOX0lSUV9JRl9FUlIJPSAoMSA8PCAyNSksIC8qIGlnbm9yZSBJUlFfSUZfRVJSICovCisJQUhDSV9GTEFHX0hPTk9SX1BJCQk9ICgxIDw8IDI2KSwgLyogaG9ub3IgUE9SVFNfSU1QTCAqLwogfTsKIAogc3RydWN0IGFoY2lfY21kX2hkciB7CkBAIC0yMTQsNiArMjE4LDcgQEAKIHN0YXRpYyB2b2lkIGFoY2lfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYWhjaV92dDgyNTFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIGFoY2lfcG9zdF9pbnRlcm5hbF9jbWQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgaW50IGFoY2lfcG9ydF9zdXNwZW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHBtX21lc3NhZ2VfdCBtZXNnKTsKIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKQEAgLTI3Myw2ICsyNzgsMzcgQEAKIAkucG9ydF9zdG9wCQk9IGFoY2lfcG9ydF9zdG9wLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfdnQ4MjUxX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisKKwkuY2hlY2tfc3RhdHVzCQk9IGFoY2lfY2hlY2tfc3RhdHVzLAorCS5jaGVja19hbHRzdGF0dXMJPSBhaGNpX2NoZWNrX3N0YXR1cywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfbm9vcF9kZXZfc2VsZWN0LAorCisJLnRmX3JlYWQJCT0gYWhjaV90Zl9yZWFkLAorCisJLnFjX3ByZXAJCT0gYWhjaV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhaGNpX3FjX2lzc3VlLAorCisJLmlycV9oYW5kbGVyCQk9IGFoY2lfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYWhjaV9pcnFfY2xlYXIsCisKKwkuc2NyX3JlYWQJCT0gYWhjaV9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IGFoY2lfc2NyX3dyaXRlLAorCisJLmZyZWV6ZQkJCT0gYWhjaV9mcmVlemUsCisJLnRoYXcJCQk9IGFoY2lfdGhhdywKKworCS5lcnJvcl9oYW5kbGVyCQk9IGFoY2lfdnQ4MjUxX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYWhjaV9wb3N0X2ludGVybmFsX2NtZCwKKworCS5wb3J0X3N1c3BlbmQJCT0gYWhjaV9wb3J0X3N1c3BlbmQsCisJLnBvcnRfcmVzdW1lCQk9IGFoY2lfcG9ydF9yZXN1bWUsCisKKwkucG9ydF9zdGFydAkJPSBhaGNpX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhaGNpX3BvcnRfc3RvcCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mb1tdID0gewogCS8qIGJvYXJkX2FoY2kgKi8KIAl7CkBAIC0yODQsMTMgKzMyMCwzNCBAQAogCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCiAJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKIAl9LAorCS8qIGJvYXJkX2FoY2lfcGkgKi8KKwl7CisJCS5zaHQJCT0gJmFoY2lfc2h0LAorCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8CisJCQkJICBBVEFfRkxBR19TS0lQX0QySF9CU1kgfCBBSENJX0ZMQUdfSE9OT1JfUEksCisJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKKwl9LAogCS8qIGJvYXJkX2FoY2lfdnQ4MjUxICovCiAJewogCQkuc2h0CQk9ICZhaGNpX3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAogCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX1BJT19ETUEgfAogCQkJCSAgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZIHwKLQkJCQkgIEFIQ0lfRkxBR19SRVNFVF9ORUVEU19DTE8gfCBBSENJX0ZMQUdfTk9fTkNRLAorCQkJCSAgQVRBX0ZMQUdfSFJTVF9UT19SRVNVTUUgfCBBSENJX0ZMQUdfTk9fTkNRLAorCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLworCQkucG9ydF9vcHMJPSAmYWhjaV92dDgyNTFfb3BzLAorCX0sCisJLyogYm9hcmRfYWhjaV9pZ25faWZlcnIgKi8KKwl7CisJCS5zaHQJCT0gJmFoY2lfc2h0LAorCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8CisJCQkJICBBVEFfRkxBR19TS0lQX0QySF9CU1kgfAorCQkJCSAgQUhDSV9GTEFHX0lHTl9JUlFfSUZfRVJSLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCkBAIC0zMDksMTggKzM2NiwyOSBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY4MiksIGJvYXJkX2FoY2kgfSwgLyogRVNCMiAqLwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY4MyksIGJvYXJkX2FoY2kgfSwgLyogRVNCMiAqLwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdjNiksIGJvYXJkX2FoY2kgfSwgLyogSUNINy1NIERIICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODIxKSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODIyKSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODI0KSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODI5KSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4TSAqLwotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgyYSksIGJvYXJkX2FoY2kgfSwgLyogSUNIOE0gKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjEpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjIpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjQpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjkpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDhNICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODJhKSwgYm9hcmRfYWhjaV9waSB9LCAvKiBJQ0g4TSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyMiksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyMyksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyNCksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyNSksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyNyksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyOSksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOU0gKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MmEpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDlNICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTJiKSwgYm9hcmRfYWhjaV9waSB9LCAvKiBJQ0g5TSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyZiksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOU0gKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5NGQpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDkgKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5NGUpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDlNICovCiAKIAkvKiBKTWljcm9uICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjApLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYwICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjEpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYxICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjMpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYzICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjUpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzY1ICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjYpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzY2ICovCisJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjApLCBib2FyZF9haGNpX2lnbl9pZmVyciB9LCAvKiBKTUIzNjAgKi8KKwl7IFBDSV9WREVWSUNFKEpNSUNST04sIDB4MjM2MSksIGJvYXJkX2FoY2lfaWduX2lmZXJyIH0sIC8qIEpNQjM2MSAqLworCXsgUENJX1ZERVZJQ0UoSk1JQ1JPTiwgMHgyMzYzKSwgYm9hcmRfYWhjaV9pZ25faWZlcnIgfSwgLyogSk1CMzYzICovCisJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjUpLCBib2FyZF9haGNpX2lnbl9pZmVyciB9LCAvKiBKTUIzNjUgKi8KKwl7IFBDSV9WREVWSUNFKEpNSUNST04sIDB4MjM2NiksIGJvYXJkX2FoY2lfaWduX2lmZXJyIH0sIC8qIEpNQjM2NiAqLwogCiAJLyogQVRJICovCiAJeyBQQ0lfVkRFVklDRShBVEksIDB4NDM4MCksIGJvYXJkX2FoY2kgfSwgLyogQVRJIFNCNjAwIG5vbi1yYWlkICovCkBAIC0zNDgsNiArNDE2LDEwIEBACiAJeyBQQ0lfVkRFVklDRShTSSwgMHgxMTg1KSwgYm9hcmRfYWhjaSB9LCAvKiBTaVMgOTY2ICovCiAJeyBQQ0lfVkRFVklDRShTSSwgMHgwMTg2KSwgYm9hcmRfYWhjaSB9LCAvKiBTaVMgOTY4ICovCiAKKwkvKiBHZW5lcmljLCBQQ0kgY2xhc3MgY29kZSBmb3IgQUhDSSAqLworCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgIDB4MDEwNjAxLCAweGZmZmZmZiwgYm9hcmRfYWhjaSB9LAorCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCkBAIC0zNjIsNiArNDM0LDExIEBACiB9OwogCiAKK3N0YXRpYyBpbmxpbmUgaW50IGFoY2lfbnJfcG9ydHModTMyIGNhcCkKK3sKKwlyZXR1cm4gKGNhcCAmIDB4MWYpICsgMTsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFoY2lfcG9ydF9iYXNlX3VsICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBwb3J0KQogewogCXJldHVybiBiYXNlICsgMHgxMDAgKyAocG9ydCAqIDB4ODApOwpAQCAtNTM1LDkgKzYxMiw2IEBACiBzdGF0aWMgdm9pZCBhaGNpX2luaXRfcG9ydCh2b2lkIF9faW9tZW0gKnBvcnRfbW1pbywgdTMyIGNhcCwKIAkJCSAgIGRtYV9hZGRyX3QgY21kX3Nsb3RfZG1hLCBkbWFfYWRkcl90IHJ4X2Zpc19kbWEpCiB7Ci0JLyogcG93ZXIgdXAgKi8KLQlhaGNpX3Bvd2VyX3VwKHBvcnRfbW1pbywgY2FwKTsKLQogCS8qIGVuYWJsZSBGSVMgcmVjZXB0aW9uICovCiAJYWhjaV9zdGFydF9maXNfcngocG9ydF9tbWlvLCBjYXAsIGNtZF9zbG90X2RtYSwgcnhfZmlzX2RtYSk7CiAKQEAgLTU2MywxOSArNjM3LDE3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQkvKiBwdXQgZGV2aWNlIGludG8gc2x1bWJlciBtb2RlICovCi0JYWhjaV9wb3dlcl9kb3duKHBvcnRfbW1pbywgY2FwKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFoY2lfcmVzZXRfY29udHJvbGxlcih2b2lkIF9faW9tZW0gKm1taW8sIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXUzMiBjYXBfc2F2ZSwgdG1wOworCXUzMiBjYXBfc2F2ZSwgaW1wbF9zYXZlLCB0bXA7CiAKIAljYXBfc2F2ZSA9IHJlYWRsKG1taW8gKyBIT1NUX0NBUCk7CiAJY2FwX3NhdmUgJj0gKCAoMTw8MjgpIHwgKDE8PDE3KSApOwogCWNhcF9zYXZlIHw9ICgxIDw8IDI3KTsKKwlpbXBsX3NhdmUgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKIAogCS8qIGdsb2JhbCBjb250cm9sbGVyIHJlc2V0ICovCiAJdG1wID0gcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsKQEAgLTU5NiwxMCArNjY4LDIxIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCS8qIHR1cm4gb24gQUhDSSBtb2RlICovCiAJd3JpdGVsKEhPU1RfQUhDSV9FTiwgbW1pbyArIEhPU1RfQ1RMKTsKIAkodm9pZCkgcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsJLyogZmx1c2ggKi8KKworCS8qIFRoZXNlIHdyaXRlLW9uY2UgcmVnaXN0ZXJzIGFyZSBub3JtYWxseSBjbGVhcmVkIG9uIHJlc2V0LgorCSAqIFJlc3RvcmUgQklPUyB2YWx1ZXMuLi4gd2hpY2ggd2UgSE9QRSB3ZXJlIHByZXNlbnQgYmVmb3JlCisJICogcmVzZXQuCisJICovCisJaWYgKCFpbXBsX3NhdmUpIHsKKwkJaW1wbF9zYXZlID0gKDEgPDwgYWhjaV9ucl9wb3J0cyhjYXBfc2F2ZSkpIC0gMTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCisJCQkgICAiUE9SVFNfSU1QTCBpcyB6ZXJvLCBmb3JjaW5nIDB4JXhcbiIsIGltcGxfc2F2ZSk7CisJfQogCXdyaXRlbChjYXBfc2F2ZSwgbW1pbyArIEhPU1RfQ0FQKTsKLQl3cml0ZWwoMHhmLCBtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwl3cml0ZWwoaW1wbF9zYXZlLCBtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKIAkodm9pZCkgcmVhZGwobW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7CS8qIGZsdXNoICovCiAKIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwpIHsKQEAgLTYxNSw3ICs2OTgsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBhaGNpX2luaXRfY29udHJvbGxlcih2b2lkIF9faW9tZW0gKm1taW8sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSBpbnQgbl9wb3J0cywgdTMyIGNhcCkKKwkJCQkgaW50IG5fcG9ydHMsIHVuc2lnbmVkIGludCBwb3J0X2ZsYWdzLAorCQkJCSBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQogewogCWludCBpLCByYzsKIAl1MzIgdG1wOwpAQCAtNjI0LDEzICs3MDgsMTIgQEAKIAkJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBpKTsKIAkJY29uc3QgY2hhciAqZW1zZyA9IE5VTEw7CiAKLSNpZiAwIC8qIEJJT1NlbiBpbml0aWFsaXplIHRoaXMgaW5jb3JyZWN0bHkgKi8KLQkJaWYgKCEoaHByaXYtPnBvcnRfbWFwICYgKDEgPDwgaSkpKQorCQlpZiAoKHBvcnRfZmxhZ3MgJiBBSENJX0ZMQUdfSE9OT1JfUEkpICYmCisJCSAgICAhKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKIAkJCWNvbnRpbnVlOwotI2VuZGlmCiAKIAkJLyogbWFrZSBzdXJlIHBvcnQgaXMgbm90IGFjdGl2ZSAqLwotCQlyYyA9IGFoY2lfZGVpbml0X3BvcnQocG9ydF9tbWlvLCBjYXAsICZlbXNnKTsKKwkJcmMgPSBhaGNpX2RlaW5pdF9wb3J0KHBvcnRfbW1pbywgaHByaXYtPmNhcCwgJmVtc2cpOwogCQlpZiAocmMpCiAJCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBkZXYtPmRldiwKIAkJCQkgICAiJXMgKCVkKVxuIiwgZW1zZywgcmMpOwpAQCAtNzA1LDE3ICs3ODgsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFoY2lfcHJlcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlpZiAoKGFwLT5mbGFncyAmIEFIQ0lfRkxBR19SRVNFVF9ORUVEU19DTE8pICYmCi0JICAgIChhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMTAwMCkgJiBBVEFfQlVTWSkpIHsKLQkJLyogQVRBX0JVU1kgaGFzbid0IGNsZWFyZWQsIHNvIHNlbmQgYSBDTE8gKi8KLQkJYWhjaV9jbG8oYXApOwotCX0KLQotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQogc3RhdGljIGludCBhaGNpX3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwpAQCAtODUzLDYgKzkyNSwzMSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBhaGNpX3Z0ODI1MV9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCWludCByYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCWFoY2lfc3RvcF9lbmdpbmUocG9ydF9tbWlvKTsKKworCXJjID0gc2F0YV9wb3J0X2hhcmRyZXNldChhcCwgc2F0YV9laGNfZGViX3RpbWluZygmYXAtPmVoX2NvbnRleHQpKTsKKworCS8qIHZ0ODI1MSBuZWVkcyBTRXJyb3IgY2xlYXJlZCBmb3IgdGhlIHBvcnQgdG8gb3BlcmF0ZSAqLworCWFoY2lfc2NyX3dyaXRlKGFwLCBTQ1JfRVJST1IsIGFoY2lfc2NyX3JlYWQoYXAsIFNDUl9FUlJPUikpOworCisJYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKworCURQUklOVEsoIkVYSVQsIHJjPSVkLCBjbGFzcz0ldVxuIiwgcmMsICpjbGFzcyk7CisKKwkvKiB2dDgyNTEgZG9lc24ndCBjbGVhciBCU1kgb24gc2lnbmF0dXJlIEZJUyByZWNlcHRpb24sCisJICogcmVxdWVzdCBmb2xsb3ctdXAgc29mdHJlc2V0LgorCSAqLworCXJldHVybiByYyA/OiAtRUFHQUlOOworfQorCiBzdGF0aWMgdm9pZCBhaGNpX3Bvc3RyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewogCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyOwpAQCAtOTY5LDYgKzEwNjYsMTAgQEAKIAkvKiBhbmFseXplIEBpcnFfc3RhdCAqLwogCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgImlycV9zdGF0IDB4JTA4eCIsIGlycV9zdGF0KTsKIAorCS8qIHNvbWUgY29udHJvbGxlcnMgc2V0IElSUV9JRl9FUlIgb24gZGV2aWNlIGVycm9ycywgaWdub3JlIGl0ICovCisJaWYgKGFwLT5mbGFncyAmIEFIQ0lfRkxBR19JR05fSVJRX0lGX0VSUikKKwkJaXJxX3N0YXQgJj0gflBPUlRfSVJRX0lGX0VSUjsKKwogCWlmIChpcnFfc3RhdCAmIFBPUlRfSVJRX1RGX0VSUikKIAkJZXJyX21hc2sgfD0gQUNfRVJSX0RFVjsKIApAQCAtMTE2OCw3ICsxMjY5LDIzIEBACiAJfQogCiAJLyogcGVyZm9ybSByZWNvdmVyeSAqLwotCWF0YV9kb19laChhcCwgYWhjaV9wcmVyZXNldCwgYWhjaV9zb2Z0cmVzZXQsIGFoY2lfaGFyZHJlc2V0LAorCWF0YV9kb19laChhcCwgYXRhX3N0ZF9wcmVyZXNldCwgYWhjaV9zb2Z0cmVzZXQsIGFoY2lfaGFyZHJlc2V0LAorCQkgIGFoY2lfcG9zdHJlc2V0KTsKK30KKworc3RhdGljIHZvaWQgYWhjaV92dDgyNTFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisKKwlpZiAoIShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX0ZST1pFTikpIHsKKwkJLyogcmVzdGFydCBlbmdpbmUgKi8KKwkJYWhjaV9zdG9wX2VuZ2luZShwb3J0X21taW8pOworCQlhaGNpX3N0YXJ0X2VuZ2luZShwb3J0X21taW8pOworCX0KKworCS8qIHBlcmZvcm0gcmVjb3ZlcnkgKi8KKwlhdGFfZG9fZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGFoY2lfc29mdHJlc2V0LCBhaGNpX3Z0ODI1MV9oYXJkcmVzZXQsCiAJCSAgYWhjaV9wb3N0cmVzZXQpOwogfQogCkBAIC0xMTk4LDcgKzEzMTUsOSBAQAogCWludCByYzsKIAogCXJjID0gYWhjaV9kZWluaXRfcG9ydChwb3J0X21taW8sIGhwcml2LT5jYXAsICZlbXNnKTsKLQlpZiAocmMpIHsKKwlpZiAocmMgPT0gMCkKKwkJYWhjaV9wb3dlcl9kb3duKHBvcnRfbW1pbywgaHByaXYtPmNhcCk7CisJZWxzZSB7CiAJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICIlcyAoJWQpXG4iLCBlbXNnLCByYyk7CiAJCWFoY2lfaW5pdF9wb3J0KHBvcnRfbW1pbywgaHByaXYtPmNhcCwKIAkJCSAgICAgICBwcC0+Y21kX3Nsb3RfZG1hLCBwcC0+cnhfZmlzX2RtYSk7CkBAIC0xMjE0LDYgKzEzMzMsNyBAQAogCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5tbWlvX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CiAKKwlhaGNpX3Bvd2VyX3VwKHBvcnRfbW1pbywgaHByaXYtPmNhcCk7CiAJYWhjaV9pbml0X3BvcnQocG9ydF9tbWlvLCBocHJpdi0+Y2FwLCBwcC0+Y21kX3Nsb3RfZG1hLCBwcC0+cnhfZmlzX2RtYSk7CiAKIAlyZXR1cm4gMDsKQEAgLTEyNTMsNyArMTM3Myw4IEBACiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAotCQlhaGNpX2luaXRfY29udHJvbGxlcihtbWlvLCBwZGV2LCBob3N0LT5uX3BvcnRzLCBocHJpdi0+Y2FwKTsKKwkJYWhjaV9pbml0X2NvbnRyb2xsZXIobW1pbywgcGRldiwgaG9zdC0+bl9wb3J0cywKKwkJCQkgICAgIGhvc3QtPnBvcnRzWzBdLT5mbGFncywgaHByaXYpOwogCX0KIAogCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKQEAgLTEzMTksNiArMTQ0MCw5IEBACiAKIAlhcC0+cHJpdmF0ZV9kYXRhID0gcHA7CiAKKwkvKiBwb3dlciB1cCBwb3J0ICovCisJYWhjaV9wb3dlcl91cChwb3J0X21taW8sIGhwcml2LT5jYXApOworCiAJLyogaW5pdGlhbGl6ZSBwb3J0ICovCiAJYWhjaV9pbml0X3BvcnQocG9ydF9tbWlvLCBocHJpdi0+Y2FwLCBwcC0+Y21kX3Nsb3RfZG1hLCBwcC0+cnhfZmlzX2RtYSk7CiAKQEAgLTEzNjUsNyArMTQ4OSw3IEBACiAJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7CiAJdm9pZCBfX2lvbWVtICptbWlvID0gcHJvYmVfZW50LT5tbWlvX2Jhc2U7Ci0JdW5zaWduZWQgaW50IGksIHVzaW5nX2RhYzsKKwl1bnNpZ25lZCBpbnQgaSwgY2FwX25fcG9ydHMsIHVzaW5nX2RhYzsKIAlpbnQgcmM7CiAKIAlyYyA9IGFoY2lfcmVzZXRfY29udHJvbGxlcihtbWlvLCBwZGV2KTsKQEAgLTEzNzQsMTAgKzE0OTgsMzQgQEAKIAogCWhwcml2LT5jYXAgPSByZWFkbChtbWlvICsgSE9TVF9DQVApOwogCWhwcml2LT5wb3J0X21hcCA9IHJlYWRsKG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOwotCXByb2JlX2VudC0+bl9wb3J0cyA9IChocHJpdi0+Y2FwICYgMHgxZikgKyAxOworCWNhcF9uX3BvcnRzID0gYWhjaV9ucl9wb3J0cyhocHJpdi0+Y2FwKTsKIAogCVZQUklOVEsoImNhcCAweCV4ICBwb3J0X21hcCAweCV4ICBuX3BvcnRzICVkXG4iLAotCQlocHJpdi0+Y2FwLCBocHJpdi0+cG9ydF9tYXAsIHByb2JlX2VudC0+bl9wb3J0cyk7CisJCWhwcml2LT5jYXAsIGhwcml2LT5wb3J0X21hcCwgY2FwX25fcG9ydHMpOworCisJaWYgKHByb2JlX2VudC0+cG9ydF9mbGFncyAmIEFIQ0lfRkxBR19IT05PUl9QSSkgeworCQl1bnNpZ25lZCBpbnQgbl9wb3J0cyA9IGNhcF9uX3BvcnRzOworCQl1MzIgcG9ydF9tYXAgPSBocHJpdi0+cG9ydF9tYXA7CisJCWludCBtYXhfcG9ydCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IEFIQ0lfTUFYX1BPUlRTICYmIG5fcG9ydHM7IGkrKykgeworCQkJaWYgKHBvcnRfbWFwICYgKDEgPDwgaSkpIHsKKwkJCQluX3BvcnRzLS07CisJCQkJcG9ydF9tYXAgJj0gfigxIDw8IGkpOworCQkJCW1heF9wb3J0ID0gaTsKKwkJCX0gZWxzZQorCQkJCXByb2JlX2VudC0+ZHVtbXlfcG9ydF9tYXNrIHw9IDEgPDwgaTsKKwkJfQorCisJCWlmIChuX3BvcnRzIHx8IHBvcnRfbWFwKQorCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCisJCQkJICAgIm5yX3BvcnRzICgldSkgYW5kIGltcGxlbWVudGVkIHBvcnQgbWFwICIKKwkJCQkgICAiKDB4JXgpIGRvbid0IG1hdGNoXG4iLAorCQkJCSAgIGNhcF9uX3BvcnRzLCBocHJpdi0+cG9ydF9tYXApOworCisJCXByb2JlX2VudC0+bl9wb3J0cyA9IG1heF9wb3J0ICsgMTsKKwl9IGVsc2UKKwkJcHJvYmVfZW50LT5uX3BvcnRzID0gY2FwX25fcG9ydHM7CiAKIAl1c2luZ19kYWMgPSBocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQ7CiAJaWYgKHVzaW5nX2RhYyAmJgpAQCAtMTQwOSw3ICsxNTU3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgcHJvYmVfZW50LT5uX3BvcnRzOyBpKyspCiAJCWFoY2lfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0W2ldLCAodW5zaWduZWQgbG9uZykgbW1pbywgaSk7CiAKLQlhaGNpX2luaXRfY29udHJvbGxlcihtbWlvLCBwZGV2LCBwcm9iZV9lbnQtPm5fcG9ydHMsIGhwcml2LT5jYXApOworCWFoY2lfaW5pdF9jb250cm9sbGVyKG1taW8sIHBkZXYsIHByb2JlX2VudC0+bl9wb3J0cywKKwkJCSAgICAgcHJvYmVfZW50LT5wb3J0X2ZsYWdzLCBocHJpdik7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKaW5kZXggMzc3NDI1ZS4uOTA4NzUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgImF0YV9nZW5lcmljIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjYiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuMTAiCiAKIC8qCiAgKglBIGdlbmVyaWMgcGFyYWxsZWwgQVRBIGRyaXZlciB1c2luZyBsaWJhdGEKQEAgLTEwOSwxNCArMTA5LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGdlbmVyaWNfcG9ydF9vcHMgPSB7CkBAIC0yMjUsMTIgKzIyNywxNCBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBhdGFfZ2VuZXJpYywKIAkucHJvYmUgCQk9IGF0YV9nZW5lcmljX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXRhX2dlbmVyaWNfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmF0YV9nZW5lcmljX3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhdGFfZ2VuZXJpY19wY2lfZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwppbmRleCA3MjAxNzRkLi5jN2RlMGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKQEAgLTQwLDcgKzQwLDcgQEAKICAqIERvY3VtZW50YXRpb24KICAqCVB1YmxpY2FsbHkgYXZhaWxhYmxlIGZyb20gSW50ZWwgd2ViIHNpdGUuIEVycmF0YSBkb2N1bWVudGF0aW9uCiAgKiBpcyBhbHNvIHB1YmxpY2FsbHkgYXZhaWxhYmxlLiBBcyBhbiBhaWRlIHRvIGFueW9uZSBoYWNraW5nIG9uIHRoaXMKLSAqIGRyaXZlciB0aGUgbGlzdCBvZiBlcnJhdGEgdGhhdCBhcmUgcmVsZXZhbnQgaXMgYmVsb3cuZ29pbmcgYmFjayB0bworICogZHJpdmVyIHRoZSBsaXN0IG9mIGVycmF0YSB0aGF0IGFyZSByZWxldmFudCBpcyBiZWxvdywgZ29pbmcgYmFjayB0bwogICogUElJWDQuIE9sZGVyIGRldmljZSBkb2N1bWVudGF0aW9uIGlzIG5vdyBhIGJpdCB0cmlja3kgdG8gZmluZC4KICAqCiAgKiBUaGUgY2hpcHNldHMgYWxsIGZvbGxvdyB2ZXJ5IG11Y2ggdGhlIHNhbWUgZGVzaWduLiBUaGUgb3JnaW5hbCBUcml0b24KQEAgLTkzLDcgKzkzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkiYXRhX3BpaXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIyLjAwYWM2IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4wMGFjNyIKIAogZW51bSB7CiAJUElJWF9JT0NGRwkJPSAweDU0LCAvKiBJREUgSS9PIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTEwMSwxMSArMTAxLDEzIEBACiAJSUNINV9QQ1MJCT0gMHg5MiwJLyogcG9ydCBjb250cm9sIGFuZCBzdGF0dXMgKi8KIAlQSUlYX1NDQwkJPSAweDBBLCAvKiBzdWItY2xhc3MgY29kZSByZWdpc3RlciAqLwogCi0JUElJWF9GTEFHX0lHTk9SRV9QQ1MJPSAoMSA8PCAyNSksIC8qIGlnbm9yZSBQQ1MgcHJlc2VudCBiaXRzICovCiAJUElJWF9GTEFHX1NDUgkJPSAoMSA8PCAyNiksIC8qIFNDUiBhdmFpbGFibGUgKi8KIAlQSUlYX0ZMQUdfQUhDSQkJPSAoMSA8PCAyNyksIC8qIEFIQ0kgcG9zc2libGUgKi8KIAlQSUlYX0ZMQUdfQ0hFQ0tJTlRSCT0gKDEgPDwgMjgpLCAvKiBtYWtlIHN1cmUgUENJIElOVHggZW5hYmxlZCAqLwogCisJUElJWF9QQVRBX0ZMQUdTCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJUElJWF9TQVRBX0ZMQUdTCQk9IEFUQV9GTEFHX1NBVEEgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAorCiAJLyogY29tYmluZWQgbW9kZS4gIGlmIHNldCwgUEFUQSBpcyBjaGFubmVsIDAuCiAJICogaWYgY2xlYXIsIFBBVEEgaXMgY2hhbm5lbCAxLgogCSAqLwpAQCAtMTIyLDExICsxMjQsMTAgQEAKIAlpY2hfcGF0YV8xMDAJCT0gMywJLyogSUNIIHVwIHRvIFVETUEgMTAwICovCiAJaWNoX3BhdGFfMTMzCQk9IDQsCS8qIElDSCB1cCB0byBVRE1BIDEzMyAqLwogCWljaDVfc2F0YQkJPSA1LAotCWVzYl9zYXRhCQk9IDYsCi0JaWNoNl9zYXRhCQk9IDcsCi0JaWNoNl9zYXRhX2FoY2kJCT0gOCwKLQlpY2g2bV9zYXRhX2FoY2kJCT0gOSwKLQlpY2g4X3NhdGFfYWhjaQkJPSAxMCwKKwlpY2g2X3NhdGEJCT0gNiwKKwlpY2g2X3NhdGFfYWhjaQkJPSA3LAorCWljaDZtX3NhdGFfYWhjaQkJPSA4LAorCWljaDhfc2F0YV9haGNpCQk9IDksCiAKIAkvKiBjb25zdGFudHMgZm9yIG1hcHBpbmcgdGFibGUgKi8KIAlQMAkJCT0gMCwgIC8qIHBvcnQgMCAqLwpAQCAtMTQzLDEzICsxNDQsMTEgQEAKIHN0cnVjdCBwaWl4X21hcF9kYiB7CiAJY29uc3QgdTMyIG1hc2s7CiAJY29uc3QgdTE2IHBvcnRfZW5hYmxlOwotCWNvbnN0IGludCBwcmVzZW50X3NoaWZ0OwogCWNvbnN0IGludCBtYXBbXVs0XTsKIH07CiAKIHN0cnVjdCBwaWl4X2hvc3RfcHJpdiB7CiAJY29uc3QgaW50ICptYXA7Ci0JY29uc3Qgc3RydWN0IHBpaXhfbWFwX2RiICptYXBfZGI7CiB9OwogCiBzdGF0aWMgaW50IHBpaXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApAQCAtMjE0LDkgKzIxMyw5IEBACiAJLyogODI4MDFFQiAoSUNINSkgKi8KIAl7IDB4ODA4NiwgMHgyNGRmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g1X3NhdGEgfSwKIAkvKiA2MzAwRVNCIChJQ0g1IHZhcmlhbnQgd2l0aCBicm9rZW4gUENTIHByZXNlbnQgYml0cykgKi8KLQl7IDB4ODA4NiwgMHgyNWEzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBlc2Jfc2F0YSB9LAorCXsgMHg4MDg2LCAweDI1YTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfc2F0YSB9LAogCS8qIDYzMDBFU0IgcHJldGVuZGluZyBSQUlEICovCi0JeyAweDgwODYsIDB4MjViMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgZXNiX3NhdGEgfSwKKwl7IDB4ODA4NiwgMHgyNWIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g1X3NhdGEgfSwKIAkvKiA4MjgwMUZCL0ZXIChJQ0g2L0lDSDZXKSAqLwogCXsgMHg4MDg2LCAweDI2NTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YSB9LAogCS8qIDgyODAxRlIvRlJXIChJQ0g2Ui9JQ0g2UlcpICovCkBAIC0zNjcsNyArMzY2LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlpeF9tYXBfZGIgaWNoNV9tYXBfZGIgPSB7CiAJLm1hc2sgPSAweDcsCiAJLnBvcnRfZW5hYmxlID0gMHgzLAotCS5wcmVzZW50X3NoaWZ0ID0gNCwKIAkubWFwID0gewogCQkvKiBQTSAgIFBTICAgU00gICBTUyAgICAgICBNQVAgICovCiAJCXsgIFAwLCAgTkEsICBQMSwgIE5BIH0sIC8qIDAwMGIgKi8KQEAgLTM4NCw3ICszODIsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiBpY2g2X21hcF9kYiA9IHsKIAkubWFzayA9IDB4MywKIAkucG9ydF9lbmFibGUgPSAweGYsCi0JLnByZXNlbnRfc2hpZnQgPSA0LAogCS5tYXAgPSB7CiAJCS8qIFBNICAgUFMgICBTTSAgIFNTICAgICAgIE1BUCAqLwogCQl7ICBQMCwgIFAyLCAgUDEsICBQMyB9LCAvKiAwMGIgKi8KQEAgLTM5Nyw3ICszOTQsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiBpY2g2bV9tYXBfZGIgPSB7CiAJLm1hc2sgPSAweDMsCiAJLnBvcnRfZW5hYmxlID0gMHg1LAotCS5wcmVzZW50X3NoaWZ0ID0gNCwKIAogCS8qIE1hcCAwMWIgaXNuJ3Qgc3BlY2lmaWVkIGluIHRoZSBkb2MgYnV0IHNvbWUgbm90ZWJvb2tzIHVzZQogCSAqIGl0IGFueXdheS4gIE1BUCAwMWIgaGF2ZSBiZWVuIHNwb3R0ZWQgb24gYm90aCBJQ0g2TSBhbmQKQEAgLTQxNSw3ICs0MTEsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiBpY2g4X21hcF9kYiA9IHsKIAkubWFzayA9IDB4MywKIAkucG9ydF9lbmFibGUgPSAweDMsCi0JLnByZXNlbnRfc2hpZnQgPSA4LAogCS5tYXAgPSB7CiAJCS8qIFBNICAgUFMgICBTTSAgIFNTICAgICAgIE1BUCAqLwogCQl7ICBQMCwgIFAyLCAgUDEsICBQMyB9LCAvKiAwMGIgKGhhcmR3aXJlZCB3aGVuIGluIEFIQ0kpICovCkBAIC00MjcsNyArNDIyLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiAqcGlpeF9tYXBfZGJfdGFibGVbXSA9IHsKIAlbaWNoNV9zYXRhXQkJPSAmaWNoNV9tYXBfZGIsCi0JW2VzYl9zYXRhXQkJPSAmaWNoNV9tYXBfZGIsCiAJW2ljaDZfc2F0YV0JCT0gJmljaDZfbWFwX2RiLAogCVtpY2g2X3NhdGFfYWhjaV0JPSAmaWNoNl9tYXBfZGIsCiAJW2ljaDZtX3NhdGFfYWhjaV0JPSAmaWNoNm1fbWFwX2RiLApAQCAtNDM4LDcgKzQzMiw3IEBACiAJLyogcGlpeF9wYXRhXzMzOiAwOiAgUElJWDMgb3IgNCBhdCAzM01IeiAqLwogCXsKIAkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKKwkJLmZsYWdzCQk9IFBJSVhfUEFUQV9GTEFHUywKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNiwgLyogbXdkbWExLTIgPz8gQ0hFQ0sgMCBzaG91bGQgYmUgb2sgYnV0IHNsb3cgKi8KIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BX01BU0tfNDBDLApAQCAtNDQ4LDcgKzQ0Miw3IEBACiAJLyogaWNoX3BhdGFfMzM6IDEgCUlDSDAgLSBJQ0ggYXQgMzNNaHoqLwogCXsKIAkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLmZsYWdzCQk9IFBJSVhfUEFUQV9GTEFHUywKIAkJLnBpb19tYXNrIAk9IDB4MWYsCS8qIHBpbyAwLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA2LCAvKiBDaGVjazogbWF5YmUgMHgwNyAgKi8KIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BMiwgLyogVURNQTMzICovCkBAIC00NTcsNyArNDUxLDcgQEAKIAkvKiBpY2hfcGF0YV82NjogMiAJSUNIIGNvbnRyb2xsZXJzIHVwIHRvIDY2TUh6ICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19TTEFWRV9QT1NTLAorCQkuZmxhZ3MJCT0gUElJWF9QQVRBX0ZMQUdTLAogCQkucGlvX21hc2sgCT0gMHgxZiwJLyogcGlvIDAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDYsIC8qIE1XRE1BMCBpcyBicm9rZW4gb24gY2hpcCAqLwogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE0LApAQCAtNDY3LDcgKzQ2MSw3IEBACiAJLyogaWNoX3BhdGFfMTAwOiAzICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19TTEFWRV9QT1NTIHwgUElJWF9GTEFHX0NIRUNLSU5UUiwKKwkJLmZsYWdzCQk9IFBJSVhfUEFUQV9GTEFHUyB8IFBJSVhfRkxBR19DSEVDS0lOVFIsCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDYsIC8qIG13ZG1hMS0yICovCiAJCS51ZG1hX21hc2sJPSBBVEFfVURNQTUsIC8qIHVkbWEwLTUgKi8KQEAgLTQ3Nyw3ICs0NzEsNyBAQAogCS8qIGljaF9wYXRhXzEzMzogNCAJSUNIIHdpdGggZnVsbCBVRE1BNiAqLwogCXsKIAkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IFBJSVhfRkxBR19DSEVDS0lOVFIsCisJCS5mbGFncwkJPSBQSUlYX1BBVEFfRkxBR1MgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAogCQkucGlvX21hc2sgCT0gMHgxZiwJLyogcGlvIDAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDYsIC8qIENoZWNrOiBtYXliZSAweDA3ICAqLwogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LCAvKiBVRE1BMTMzICovCkBAIC00ODcsNDEgKzQ4MSwyNyBAQAogCS8qIGljaDVfc2F0YTogNSAqLwogCXsKIAkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgUElJWF9GTEFHX0NIRUNLSU5UUiB8Ci0JCQkJICBQSUlYX0ZMQUdfSUdOT1JFX1BDUywKKwkJLmZsYWdzCQk9IFBJSVhfU0FUQV9GTEFHUywKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KIAkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCiAJfSwKIAotCS8qIGk2MzAwZXNiX3NhdGE6IDYgKi8KKwkvKiBpY2g2X3NhdGE6IDYgKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8Ci0JCQkJICBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwgUElJWF9GTEFHX0lHTk9SRV9QQ1MsCisJCS5mbGFncwkJPSBQSUlYX1NBVEFfRkxBR1MgfCBQSUlYX0ZMQUdfU0NSLAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLwogCQkudWRtYV9tYXNrCT0gMHg3ZiwJLyogdWRtYTAtNiAqLwogCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKIAl9LAogCi0JLyogaWNoNl9zYXRhOiA3ICovCisJLyogaWNoNl9zYXRhX2FoY2k6IDcgKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8Ci0JCQkJICBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwgUElJWF9GTEFHX1NDUiwKLQkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCi0JCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KLQkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KLQkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCi0JfSwKLQotCS8qIGljaDZfc2F0YV9haGNpOiA4ICovCi0JewotCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfAotCQkJCSAgUElJWF9GTEFHX0NIRUNLSU5UUiB8IFBJSVhfRkxBR19TQ1IgfAorCQkuZmxhZ3MJCT0gUElJWF9TQVRBX0ZMQUdTIHwgUElJWF9GTEFHX1NDUiB8CiAJCQkJICBQSUlYX0ZMQUdfQUhDSSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KQEAgLTUyOSwxMSArNTA5LDEwIEBACiAJCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAogCX0sCiAKLQkvKiBpY2g2bV9zYXRhX2FoY2k6IDkgKi8KKwkvKiBpY2g2bV9zYXRhX2FoY2k6IDggKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8Ci0JCQkJICBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwgUElJWF9GTEFHX1NDUiB8CisJCS5mbGFncwkJPSBQSUlYX1NBVEFfRkxBR1MgfCBQSUlYX0ZMQUdfU0NSIHwKIAkJCQkgIFBJSVhfRkxBR19BSENJLAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLwpAQCAtNTQxLDExICs1MjAsMTAgQEAKIAkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCiAJfSwKIAotCS8qIGljaDhfc2F0YV9haGNpOiAxMCAqLworCS8qIGljaDhfc2F0YV9haGNpOiA5ICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfAotCQkJCSAgUElJWF9GTEFHX0NIRUNLSU5UUiB8IFBJSVhfRkxBR19TQ1IgfAorCQkuZmxhZ3MJCT0gUElJWF9TQVRBX0ZMQUdTIHwgUElJWF9GTEFHX1NDUiB8CiAJCQkJICBQSUlYX0ZMQUdfQUhDSSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KQEAgLTU2NiwxMCArNTQ0LDIyIEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGlpeF9wY2lfdGJsKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKIAotc3RhdGljIGludCBmb3JjZV9wY3MgPSAwOwotbW9kdWxlX3BhcmFtKGZvcmNlX3BjcywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcGNzLCAiZm9yY2UgaG9ub3Jpbmcgb3IgaWdub3JpbmcgUENTIHRvIHdvcmsgYXJvdW5kICIKLQkJICJkZXZpY2UgbWlzLWRldGVjdGlvbiAoMD1kZWZhdWx0LCAxPWlnbm9yZSBQQ1MsIDI9aG9ub3IgUENTKSIpOworc3RydWN0IGljaF9sYXB0b3AgeworCXUxNiBkZXZpY2U7CisJdTE2IHN1YnZlbmRvcjsKKwl1MTYgc3ViZGV2aWNlOworfTsKKworLyoKKyAqCUxpc3Qgb2YgbGFwdG9wcyB0aGF0IHVzZSBzaG9ydCBjYWJsZXMgcmF0aGVyIHRoYW4gODAgd2lyZQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWNoX2xhcHRvcCBpY2hfbGFwdG9wW10gPSB7CisJLyogZGV2aWQsIHN1YnZlbmRvciwgc3ViZGV2ICovCisJeyAweDI3REYsIDB4MDAwNSwgMHgwMjgwIH0sCS8qIElDSDcgb24gQWNlciA1NjAyV0xNaSAqLworCS8qIGVuZCBtYXJrZXIgKi8KKwl7IDAsIH0KK307CiAKIC8qKgogICoJcGlpeF9wYXRhX2NibF9kZXRlY3QgLSBQcm9iZSBob3N0IGNvbnRyb2xsZXIgY2FibGUgZGV0ZWN0IGluZm8KQEAgLTU4NSwxMiArNTc1LDI0IEBACiBzdGF0aWMgdm9pZCBpY2hfcGF0YV9jYmxfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCWNvbnN0IHN0cnVjdCBpY2hfbGFwdG9wICpsYXAgPSAmaWNoX2xhcHRvcFswXTsKIAl1OCB0bXAsIG1hc2s7CiAKIAkvKiBubyA4MGMgc3VwcG9ydCBpbiBob3N0IGNvbnRyb2xsZXI/ICovCiAJaWYgKChhcC0+dWRtYV9tYXNrICYgfkFUQV9VRE1BX01BU0tfNDBDKSA9PSAwKQogCQlnb3RvIGNibDQwOwogCisJLyogQ2hlY2sgZm9yIHNwZWNpYWxzIC0gQWNlciBBc3BpcmUgNTYwMldMTWkgKi8KKwl3aGlsZSAobGFwLT5kZXZpY2UpIHsKKwkJaWYgKGxhcC0+ZGV2aWNlID09IHBkZXYtPmRldmljZSAmJgorCQkgICAgbGFwLT5zdWJ2ZW5kb3IgPT0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvciAmJgorCQkgICAgbGFwLT5zdWJkZXZpY2UgPT0gcGRldi0+c3Vic3lzdGVtX2RldmljZSkgeworCQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwX1NIT1JUOworCQkgICAgCXJldHVybjsKKwkJfQorCQlsYXArKzsKKwl9CisKIAkvKiBjaGVjayBCSU9TIGNhYmxlIGRldGVjdCByZXN1bHRzICovCiAJbWFzayA9IGFwLT5wb3J0X25vID09IDAgPyBQSUlYXzgwQ19QUkkgOiBQSUlYXzgwQ19TRUM7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUElJWF9JT0NGRywgJnRtcCk7CkBAIC02NTksODQgKzY2MSw5IEBACiAJCQkgICBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKLS8qKgotICoJcGlpeF9zYXRhX3ByZXNlbnRfbWFzayAtIGRldGVybWluZSBwcmVzZW50IG1hc2sgZm9yIFNBVEEgaG9zdCBjb250cm9sbGVyCi0gKglAYXA6IFRhcmdldCBwb3J0Ci0gKgotICoJUmVhZHMgU0FUQSBQQ0kgZGV2aWNlJ3MgUENJIGNvbmZpZyByZWdpc3RlciBQb3J0IENvbmZpZ3VyYXRpb24KLSAqCWFuZCBTdGF0dXMgKFBDUykgdG8gZGV0ZXJtaW5lIHBvcnQgYW5kIGRldmljZSBhdmFpbGFiaWxpdHkuCi0gKgotICoJTE9DS0lORzoKLSAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCi0gKgotICoJUkVUVVJOUzoKLSAqCWRldGVybWluZWQgcHJlc2VudF9tYXNrCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGlpeF9zYXRhX3ByZXNlbnRfbWFzayhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQljb25zdCB1bnNpZ25lZCBpbnQgKm1hcCA9IGhwcml2LT5tYXA7Ci0JaW50IGJhc2UgPSAyICogYXAtPnBvcnRfbm87Ci0JdW5zaWduZWQgaW50IHByZXNlbnRfbWFzayA9IDA7Ci0JaW50IHBvcnQsIGk7Ci0JdTE2IHBjczsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIElDSDVfUENTLCAmcGNzKTsKLQlEUFJJTlRLKCJhdGEldTogRU5URVIsIHBjcz0weCV4IGJhc2U9JWRcbiIsIGFwLT5pZCwgcGNzLCBiYXNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJcG9ydCA9IG1hcFtiYXNlICsgaV07Ci0JCWlmIChwb3J0IDwgMCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKGFwLT5mbGFncyAmIFBJSVhfRkxBR19JR05PUkVfUENTKSB8fAotCQkgICAgKHBjcyAmIDEgPDwgKGhwcml2LT5tYXBfZGItPnByZXNlbnRfc2hpZnQgKyBwb3J0KSkpCi0JCQlwcmVzZW50X21hc2sgfD0gMSA8PCBpOwotCX0KLQotCURQUklOVEsoImF0YSV1OiBMRUFWRSwgcGNzPTB4JXggcHJlc2VudF9tYXNrPTB4JXhcbiIsCi0JCWFwLT5pZCwgcGNzLCBwcmVzZW50X21hc2spOwotCi0JcmV0dXJuIHByZXNlbnRfbWFzazsKLX0KLQotLyoqCi0gKglwaWl4X3NhdGFfc29mdHJlc2V0IC0gcmVzZXQgU0FUQSBob3N0IHBvcnQgdmlhIEFUQSBTUlNUCi0gKglAYXA6IHBvcnQgdG8gcmVzZXQKLSAqCUBjbGFzc2VzOiByZXN1bHRpbmcgY2xhc3NlcyBvZiBhdHRhY2hlZCBkZXZpY2VzCi0gKgotICoJUmVzZXQgU0FUQSBob3N0IHBvcnQgdmlhIEFUQSBTUlNULiAgT24gY29udHJvbGxlcnMgd2l0aAotICoJcmVsaWFibGUgUENTIHByZXNlbnQgYml0cywgdGhlIGJpdHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lCi0gKglkZXZpY2UgcHJlc2VuY2UuCi0gKgotICoJTE9DS0lORzoKLSAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQotICoKLSAqCVJFVFVSTlM6Ci0gKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgcGlpeF9zYXRhX3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCi17Ci0JdW5zaWduZWQgaW50IHByZXNlbnRfbWFzazsKLQlpbnQgaSwgcmM7Ci0KLQlwcmVzZW50X21hc2sgPSBwaWl4X3NhdGFfcHJlc2VudF9tYXNrKGFwKTsKLQotCXJjID0gYXRhX3N0ZF9zb2Z0cmVzZXQoYXAsIGNsYXNzZXMpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7Ci0JCWlmICghKHByZXNlbnRfbWFzayAmICgxIDw8IGkpKSkKLQkJCWNsYXNzZXNbaV0gPSBBVEFfREVWX05PTkU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIHBpaXhfc2F0YV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBhdGFfc3RkX3ByZXJlc2V0LCBwaWl4X3NhdGFfc29mdHJlc2V0LCBOVUxMLAorCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgYXRhX3N0ZF9wcmVyZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsIE5VTEwsCiAJCQkgICBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKQEAgLTEwNTEsMTggKzk3OCw2IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBJQ0g1X1BDUywgbmV3X3Bjcyk7CiAJCW1zbGVlcCgxNTApOwogCX0KLQotCWlmIChmb3JjZV9wY3MgPT0gMSkgewotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKLQkJCSAgICJmb3JjZSBpZ25vcmluZyBQQ1MgKDB4JXgpXG4iLCBuZXdfcGNzKTsKLQkJcGluZm9bMF0uZmxhZ3MgfD0gUElJWF9GTEFHX0lHTk9SRV9QQ1M7Ci0JCXBpbmZvWzFdLmZsYWdzIHw9IFBJSVhfRkxBR19JR05PUkVfUENTOwotCX0gZWxzZSBpZiAoZm9yY2VfcGNzID09IDIpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCi0JCQkgICAiZm9yY2UgaG9ub3JpbmcgUENTICgweCV4KVxuIiwgbmV3X3Bjcyk7Ci0JCXBpbmZvWzBdLmZsYWdzICY9IH5QSUlYX0ZMQUdfSUdOT1JFX1BDUzsKLQkJcGluZm9bMV0uZmxhZ3MgJj0gflBJSVhfRkxBR19JR05PUkVfUENTOwotCX0KIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHBpaXhfaW5pdF9zYXRhX21hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKQEAgLTExMTIsNyArMTAyNyw2IEBACiAJCQkgICAiaW52YWxpZCBNQVAgdmFsdWUgJXVcbiIsIG1hcF92YWx1ZSk7CiAKIAlocHJpdi0+bWFwID0gbWFwOwotCWhwcml2LT5tYXBfZGIgPSBtYXBfZGI7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggOTE1YTU1YS4uZjhlYzM4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC0xOTksNyArMTk5LDggQEAKIAogLyoqCiAgKglhdGFfcndjbWRfcHJvdG9jb2wgLSBzZXQgdGFza2ZpbGUgci93IGNvbW1hbmRzIGFuZCBwcm90b2NvbAotICoJQHFjOiBjb21tYW5kIHRvIGV4YW1pbmUgYW5kIGNvbmZpZ3VyZQorICoJQHRmOiBjb21tYW5kIHRvIGV4YW1pbmUgYW5kIGNvbmZpZ3VyZQorICoJQGRldjogZGV2aWNlIHRmIGJlbG9uZ3MgdG8KICAqCiAgKglFeGFtaW5lIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiBhbmQgdGYtPmZsYWdzIHRvIGNhbGN1bGF0ZQogICoJdGhlIHByb3BlciByZWFkL3dyaXRlIGNvbW1hbmRzIGFuZCBwcm90b2NvbCB0byB1c2UuCkBAIC0yMDcsMTAgKzIwOCw4IEBACiAgKglMT0NLSU5HOgogICoJY2FsbGVyLgogICovCi1pbnQgYXRhX3J3Y21kX3Byb3RvY29sKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgaW50IGF0YV9yd2NtZF9wcm90b2NvbChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiA9ICZxYy0+dGY7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IHFjLT5kZXY7CiAJdTggY21kOwogCiAJaW50IGluZGV4LCBmdWEsIGxiYTQ4LCB3cml0ZTsKQEAgLTIyMiw3ICsyMjEsNyBAQAogCWlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTykgewogCQl0Zi0+cHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87CiAJCWluZGV4ID0gZGV2LT5tdWx0aV9jb3VudCA/IDAgOiA4OwotCX0gZWxzZSBpZiAobGJhNDggJiYgKHFjLT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19QSU9fTEJBNDgpKSB7CisJfSBlbHNlIGlmIChsYmE0OCAmJiAoZGV2LT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19QSU9fTEJBNDgpKSB7CiAJCS8qIFVuYWJsZSB0byB1c2UgRE1BIGR1ZSB0byBob3N0IGxpbWl0YXRpb24gKi8KIAkJdGYtPnByb3RvY29sID0gQVRBX1BST1RfUElPOwogCQlpbmRleCA9IGRldi0+bXVsdGlfY291bnQgPyAwIDogODsKQEAgLTI0MCw2ICsyMzksMTc0IEBACiB9CiAKIC8qKgorICoJYXRhX3RmX3JlYWRfYmxvY2sgLSBSZWFkIGJsb2NrIGFkZHJlc3MgZnJvbSBBVEEgdGFza2ZpbGUKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIG9mIGludGVyZXN0CisgKglAZGV2OiBBVEEgZGV2aWNlIEB0ZiBiZWxvbmdzIHRvCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUmVhZCBibG9jayBhZGRyZXNzIGZyb20gQHRmLiAgVGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIGFsbAorICoJdGhyZWUgYWRkcmVzcyBmb3JtYXRzIC0gTEJBLCBMQkE0OCBhbmQgQ0hTLiAgdGYtPnByb3RvY29sIGFuZAorICoJZmxhZ3Mgc2VsZWN0IHRoZSBhZGRyZXNzIGZvcm1hdCB0byB1c2UuCisgKgorICoJUkVUVVJOUzoKKyAqCUJsb2NrIGFkZHJlc3MgcmVhZCBmcm9tIEB0Zi4KKyAqLwordTY0IGF0YV90Zl9yZWFkX2Jsb2NrKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXU2NCBibG9jayA9IDA7CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQSkgeworCQlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSB7CisJCQlibG9jayB8PSAodTY0KXRmLT5ob2JfbGJhaCA8PCA0MDsKKwkJCWJsb2NrIHw9ICh1NjQpdGYtPmhvYl9sYmFtIDw8IDMyOworCQkJYmxvY2sgfD0gdGYtPmhvYl9sYmFsIDw8IDI0OworCQl9IGVsc2UKKwkJCWJsb2NrIHw9ICh0Zi0+ZGV2aWNlICYgMHhmKSA8PCAyNDsKKworCQlibG9jayB8PSB0Zi0+bGJhaCA8PCAxNjsKKwkJYmxvY2sgfD0gdGYtPmxiYW0gPDwgODsKKwkJYmxvY2sgfD0gdGYtPmxiYWw7CisJfSBlbHNlIHsKKwkJdTMyIGN5bCwgaGVhZCwgc2VjdDsKKworCQljeWwgPSB0Zi0+bGJhbSB8ICh0Zi0+bGJhaCA8PCA4KTsKKwkJaGVhZCA9IHRmLT5kZXZpY2UgJiAweGY7CisJCXNlY3QgPSB0Zi0+bGJhbDsKKworCQlibG9jayA9IChjeWwgKiBkZXYtPmhlYWRzICsgaGVhZCkgKiBkZXYtPnNlY3RvcnMgKyBzZWN0OworCX0KKworCXJldHVybiBibG9jazsKK30KKworLyoqCisgKglhdGFfYnVpbGRfcndfdGYgLSBCdWlsZCBBVEEgdGFza2ZpbGUgZm9yIGdpdmVuIHJlYWQvd3JpdGUgcmVxdWVzdAorICoJQHRmOiBUYXJnZXQgQVRBIHRhc2tmaWxlCisgKglAZGV2OiBBVEEgZGV2aWNlIEB0ZiBiZWxvbmdzIHRvCisgKglAYmxvY2s6IEJsb2NrIGFkZHJlc3MKKyAqCUBuX2Jsb2NrOiBOdW1iZXIgb2YgYmxvY2tzCisgKglAdGZfZmxhZ3M6IFJXL0ZVQSBldGMuLi4KKyAqCUB0YWc6IHRhZworICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICoKKyAqCUJ1aWxkIEFUQSB0YXNrZmlsZSBAdGYgZm9yIHJlYWQvd3JpdGUgcmVxdWVzdCBkZXNjcmliZWQgYnkKKyAqCUBibG9jaywgQG5fYmxvY2ssIEB0Zl9mbGFncyBhbmQgQHRhZyBvbiBAZGV2LgorICoKKyAqCVJFVFVSTlM6CisgKgorICoJMCBvbiBzdWNjZXNzLCAtRVJBTkdFIGlmIHRoZSByZXF1ZXN0IGlzIHRvbyBsYXJnZSBmb3IgQGRldiwKKyAqCS1FSU5WQUwgaWYgdGhlIHJlcXVlc3QgaXMgaW52YWxpZC4KKyAqLworaW50IGF0YV9idWlsZF9yd190ZihzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJICAgIHU2NCBibG9jaywgdTMyIG5fYmxvY2ssIHVuc2lnbmVkIGludCB0Zl9mbGFncywKKwkJICAgIHVuc2lnbmVkIGludCB0YWcpCit7CisJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19JU0FERFIgfCBBVEFfVEZMQUdfREVWSUNFOworCXRmLT5mbGFncyB8PSB0Zl9mbGFnczsKKworCWlmICgoZGV2LT5mbGFncyAmIChBVEFfREZMQUdfUElPIHwgQVRBX0RGTEFHX05DUV9PRkYgfAorCQkJICAgQVRBX0RGTEFHX05DUSkpID09IEFUQV9ERkxBR19OQ1EgJiYKKwkgICAgbGlrZWx5KHRhZyAhPSBBVEFfVEFHX0lOVEVSTkFMKSkgeworCQkvKiB5YXksIE5DUSAqLworCQlpZiAoIWxiYV80OF9vayhibG9jaywgbl9ibG9jaykpCisJCQlyZXR1cm4gLUVSQU5HRTsKKworCQl0Zi0+cHJvdG9jb2wgPSBBVEFfUFJPVF9OQ1E7CisJCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfTEJBIHwgQVRBX1RGTEFHX0xCQTQ4OworCisJCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpCisJCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRlBETUFfV1JJVEU7CisJCWVsc2UKKwkJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9GUERNQV9SRUFEOworCisJCXRmLT5uc2VjdCA9IHRhZyA8PCAzOworCQl0Zi0+aG9iX2ZlYXR1cmUgPSAobl9ibG9jayA+PiA4KSAmIDB4ZmY7CisJCXRmLT5mZWF0dXJlID0gbl9ibG9jayAmIDB4ZmY7CisKKwkJdGYtPmhvYl9sYmFoID0gKGJsb2NrID4+IDQwKSAmIDB4ZmY7CisJCXRmLT5ob2JfbGJhbSA9IChibG9jayA+PiAzMikgJiAweGZmOworCQl0Zi0+aG9iX2xiYWwgPSAoYmxvY2sgPj4gMjQpICYgMHhmZjsKKwkJdGYtPmxiYWggPSAoYmxvY2sgPj4gMTYpICYgMHhmZjsKKwkJdGYtPmxiYW0gPSAoYmxvY2sgPj4gOCkgJiAweGZmOworCQl0Zi0+bGJhbCA9IGJsb2NrICYgMHhmZjsKKworCQl0Zi0+ZGV2aWNlID0gMSA8PCA2OworCQlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0ZVQSkKKwkJCXRmLT5kZXZpY2UgfD0gMSA8PCA3OworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkEpIHsKKwkJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19MQkE7CisKKwkJaWYgKGxiYV8yOF9vayhibG9jaywgbl9ibG9jaykpIHsKKwkJCS8qIHVzZSBMQkEyOCAqLworCQkJdGYtPmRldmljZSB8PSAoYmxvY2sgPj4gMjQpICYgMHhmOworCQl9IGVsc2UgaWYgKGxiYV80OF9vayhibG9jaywgbl9ibG9jaykpIHsKKwkJCWlmICghKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpKQorCQkJCXJldHVybiAtRVJBTkdFOworCisJCQkvKiB1c2UgTEJBNDggKi8KKwkJCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfTEJBNDg7CisKKwkJCXRmLT5ob2JfbnNlY3QgPSAobl9ibG9jayA+PiA4KSAmIDB4ZmY7CisKKwkJCXRmLT5ob2JfbGJhaCA9IChibG9jayA+PiA0MCkgJiAweGZmOworCQkJdGYtPmhvYl9sYmFtID0gKGJsb2NrID4+IDMyKSAmIDB4ZmY7CisJCQl0Zi0+aG9iX2xiYWwgPSAoYmxvY2sgPj4gMjQpICYgMHhmZjsKKwkJfSBlbHNlCisJCQkvKiByZXF1ZXN0IHRvbyBsYXJnZSBldmVuIGZvciBMQkE0OCAqLworCQkJcmV0dXJuIC1FUkFOR0U7CisKKwkJaWYgKHVubGlrZWx5KGF0YV9yd2NtZF9wcm90b2NvbCh0ZiwgZGV2KSA8IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdGYtPm5zZWN0ID0gbl9ibG9jayAmIDB4ZmY7CisKKwkJdGYtPmxiYWggPSAoYmxvY2sgPj4gMTYpICYgMHhmZjsKKwkJdGYtPmxiYW0gPSAoYmxvY2sgPj4gOCkgJiAweGZmOworCQl0Zi0+bGJhbCA9IGJsb2NrICYgMHhmZjsKKworCQl0Zi0+ZGV2aWNlIHw9IEFUQV9MQkE7CisJfSBlbHNlIHsKKwkJLyogQ0hTICovCisJCXUzMiBzZWN0LCBoZWFkLCBjeWwsIHRyYWNrOworCisJCS8qIFRoZSByZXF1ZXN0IC1tYXktIGJlIHRvbyBsYXJnZSBmb3IgQ0hTIGFkZHJlc3NpbmcuICovCisJCWlmICghbGJhXzI4X29rKGJsb2NrLCBuX2Jsb2NrKSkKKwkJCXJldHVybiAtRVJBTkdFOworCisJCWlmICh1bmxpa2VseShhdGFfcndjbWRfcHJvdG9jb2wodGYsIGRldikgPCAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIENvbnZlcnQgTEJBIHRvIENIUyAqLworCQl0cmFjayA9ICh1MzIpYmxvY2sgLyBkZXYtPnNlY3RvcnM7CisJCWN5bCAgID0gdHJhY2sgLyBkZXYtPmhlYWRzOworCQloZWFkICA9IHRyYWNrICUgZGV2LT5oZWFkczsKKwkJc2VjdCAgPSAodTMyKWJsb2NrICUgZGV2LT5zZWN0b3JzICsgMTsKKworCQlEUFJJTlRLKCJibG9jayAldSB0cmFjayAldSBjeWwgJXUgaGVhZCAldSBzZWN0ICV1XG4iLAorCQkJKHUzMilibG9jaywgdHJhY2ssIGN5bCwgaGVhZCwgc2VjdCk7CisKKwkJLyogQ2hlY2sgd2hldGhlciB0aGUgY29udmVydGVkIENIUyBjYW4gZml0LgorCQkgICBDeWxpbmRlcjogMC02NTUzNQorCQkgICBIZWFkOiAwLTE1CisJCSAgIFNlY3RvcjogMS0yNTUqLworCQlpZiAoKGN5bCA+PiAxNikgfHwgKGhlYWQgPj4gNCkgfHwgKHNlY3QgPj4gOCkgfHwgKCFzZWN0KSkKKwkJCXJldHVybiAtRVJBTkdFOworCisJCXRmLT5uc2VjdCA9IG5fYmxvY2sgJiAweGZmOyAvKiBTZWN0b3IgY291bnQgMCBtZWFucyAyNTYgc2VjdG9ycyAqLworCQl0Zi0+bGJhbCA9IHNlY3Q7CisJCXRmLT5sYmFtID0gY3lsOworCQl0Zi0+bGJhaCA9IGN5bCA+PiA4OworCQl0Zi0+ZGV2aWNlIHw9IGhlYWQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICoJYXRhX3BhY2tfeGZlcm1hc2sgLSBQYWNrIHBpbywgbXdkbWEgYW5kIHVkbWEgbWFza3MgaW50byB4ZmVyX21hc2sKICAqCUBwaW9fbWFzazogcGlvX21hc2sKICAqCUBtd2RtYV9tYXNrOiBtd2RtYV9tYXNrCkBAIC05OTksMTMgKzExNjYsMTMgQEAKIH0KIAogLyoqCi0gKglhdGFfZXhlY19pbnRlcm5hbCAtIGV4ZWN1dGUgbGliYXRhIGludGVybmFsIGNvbW1hbmQKKyAqCWF0YV9leGVjX2ludGVybmFsX3NnIC0gZXhlY3V0ZSBsaWJhdGEgaW50ZXJuYWwgY29tbWFuZAogICoJQGRldjogRGV2aWNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIHNlbnQKICAqCUB0ZjogVGFza2ZpbGUgcmVnaXN0ZXJzIGZvciB0aGUgY29tbWFuZCBhbmQgdGhlIHJlc3VsdAogICoJQGNkYjogQ0RCIGZvciBwYWNrZXQgY29tbWFuZAogICoJQGRtYV9kaXI6IERhdGEgdHJhbmZlciBkaXJlY3Rpb24gb2YgdGhlIGNvbW1hbmQKLSAqCUBidWY6IERhdGEgYnVmZmVyIG9mIHRoZSBjb21tYW5kCi0gKglAYnVmbGVuOiBMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqCUBzZzogc2cgbGlzdCBmb3IgdGhlIGRhdGEgYnVmZmVyIG9mIHRoZSBjb21tYW5kCisgKglAbl9lbGVtOiBOdW1iZXIgb2Ygc2cgZW50cmllcwogICoKICAqCUV4ZWN1dGVzIGxpYmF0YSBpbnRlcm5hbCBjb21tYW5kIHdpdGggdGltZW91dC4gIEB0ZiBjb250YWlucwogICoJY29tbWFuZCBvbiBlbnRyeSBhbmQgcmVzdWx0IG9uIHJldHVybi4gIFRpbWVvdXQgYW5kIGVycm9yCkBAIC0xMDE5LDkgKzExODYsMTAgQEAKICAqCVJFVFVSTlM6CiAgKglaZXJvIG9uIHN1Y2Nlc3MsIEFDX0VSUl8qIG1hc2sgb24gZmFpbHVyZQogICovCi11bnNpZ25lZCBhdGFfZXhlY19pbnRlcm5hbChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIGNvbnN0IHU4ICpjZGIsCi0JCQkgICBpbnQgZG1hX2Rpciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQordW5zaWduZWQgYXRhX2V4ZWNfaW50ZXJuYWxfc2coc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBjb25zdCB1OCAqY2RiLAorCQkJICAgICAgaW50IGRtYV9kaXIsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbl9lbGVtKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOwogCXU4IGNvbW1hbmQgPSB0Zi0+Y29tbWFuZDsKQEAgLTEwNzcsNyArMTI0NSwxMiBAQAogCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX1JFU1VMVF9URjsKIAlxYy0+ZG1hX2RpciA9IGRtYV9kaXI7CiAJaWYgKGRtYV9kaXIgIT0gRE1BX05PTkUpIHsKLQkJYXRhX3NnX2luaXRfb25lKHFjLCBidWYsIGJ1Zmxlbik7CisJCXVuc2lnbmVkIGludCBpLCBidWZsZW4gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBuX2VsZW07IGkrKykKKwkJCWJ1ZmxlbiArPSBzZ1tpXS5sZW5ndGg7CisKKwkJYXRhX3NnX2luaXQocWMsIHNnLCBuX2VsZW0pOwogCQlxYy0+bnNlY3QgPSBidWZsZW4gLyBBVEFfU0VDVF9TSVpFOwogCX0KIApAQCAtMTE2MSw2ICsxMzM0LDM1IEBACiB9CiAKIC8qKgorICoJYXRhX2V4ZWNfaW50ZXJuYWxfc2cgLSBleGVjdXRlIGxpYmF0YSBpbnRlcm5hbCBjb21tYW5kCisgKglAZGV2OiBEZXZpY2UgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgc2VudAorICoJQHRmOiBUYXNrZmlsZSByZWdpc3RlcnMgZm9yIHRoZSBjb21tYW5kIGFuZCB0aGUgcmVzdWx0CisgKglAY2RiOiBDREIgZm9yIHBhY2tldCBjb21tYW5kCisgKglAZG1hX2RpcjogRGF0YSB0cmFuZmVyIGRpcmVjdGlvbiBvZiB0aGUgY29tbWFuZAorICoJQGJ1ZjogRGF0YSBidWZmZXIgb2YgdGhlIGNvbW1hbmQKKyAqCUBidWZsZW46IExlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICoKKyAqCVdyYXBwZXIgYXJvdW5kIGF0YV9leGVjX2ludGVybmFsX3NnKCkgd2hpY2ggdGFrZXMgc2ltcGxlCisgKglidWZmZXIgaW5zdGVhZCBvZiBzZyBsaXN0LgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLiAgU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGtlcm5lbCBjb250ZXh0LCBtaWdodCBzbGVlcC4KKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBBQ19FUlJfKiBtYXNrIG9uIGZhaWx1cmUKKyAqLwordW5zaWduZWQgYXRhX2V4ZWNfaW50ZXJuYWwoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBjb25zdCB1OCAqY2RiLAorCQkJICAgaW50IGRtYV9kaXIsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwlzZ19pbml0X29uZSgmc2csIGJ1ZiwgYnVmbGVuKTsKKworCXJldHVybiBhdGFfZXhlY19pbnRlcm5hbF9zZyhkZXYsIHRmLCBjZGIsIGRtYV9kaXIsICZzZywgMSk7Cit9CisKKy8qKgogICoJYXRhX2RvX3NpbXBsZV9jbWQgLSBleGVjdXRlIHNpbXBsZSBpbnRlcm5hbCBjb21tYW5kCiAgKglAZGV2OiBEZXZpY2UgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgc2VudAogICoJQGNtZDogT3Bjb2RlIHRvIGV4ZWN1dGUKQEAgLTEyMjQsNyArMTQyNiw3IEBACiAgKglhdGFfZGV2X3JlYWRfaWQgLSBSZWFkIElEIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGRldmljZQogICoJQGRldjogdGFyZ2V0IGRldmljZQogICoJQHBfY2xhc3M6IHBvaW50ZXIgdG8gY2xhc3Mgb2YgdGhlIHRhcmdldCBkZXZpY2UgKG1heSBiZSBjaGFuZ2VkKQotICoJQHBvc3RfcmVzZXQ6IGlzIHRoaXMgcmVhZCBJRCBwb3N0LXJlc2V0PworICoJQGZsYWdzOiBBVEFfUkVBRElEXyogZmxhZ3MKICAqCUBpZDogYnVmZmVyIHRvIHJlYWQgSURFTlRJRlkgZGF0YSBpbnRvCiAgKgogICoJUmVhZCBJRCBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBkZXZpY2UuICBBVEFfQ01EX0lEX0FUQSBpcwpAQCAtMTIzOSw3ICsxNDQxLDcgQEAKICAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KICAqLwogaW50IGF0YV9kZXZfcmVhZF9pZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnBfY2xhc3MsCi0JCSAgICBpbnQgcG9zdF9yZXNldCwgdTE2ICppZCkKKwkJICAgIHVuc2lnbmVkIGludCBmbGFncywgdTE2ICppZCkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5hcDsKIAl1bnNpZ25lZCBpbnQgY2xhc3MgPSAqcF9jbGFzczsKQEAgLTEyNzEsMTAgKzE0NzMsMTcgQEAKIAl9CiAKIAl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX1BJTzsKKwl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfUE9MTElORzsgLyogZm9yIHBvbGxpbmcgcHJlc2VuY2UgZGV0ZWN0aW9uICovCiAKIAllcnJfbWFzayA9IGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBOVUxMLCBETUFfRlJPTV9ERVZJQ0UsCiAJCQkJICAgICBpZCwgc2l6ZW9mKGlkWzBdKSAqIEFUQV9JRF9XT1JEUyk7CiAJaWYgKGVycl9tYXNrKSB7CisJCWlmIChlcnJfbWFzayAmIEFDX0VSUl9OT0RFVl9ISU5UKSB7CisJCQlEUFJJTlRLKCJhdGEldS4lZDogTk9ERVYgYWZ0ZXIgcG9sbGluZyBkZXRlY3Rpb25cbiIsCisJCQkJYXAtPmlkLCBkZXYtPmRldm5vKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisKIAkJcmMgPSAtRUlPOwogCQlyZWFzb24gPSAiSS9PIGVycm9yIjsKIAkJZ290byBlcnJfb3V0OwpAQCAtMTI5NCw3ICsxNTAzLDcgQEAKIAkJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlpZiAocG9zdF9yZXNldCAmJiBjbGFzcyA9PSBBVEFfREVWX0FUQSkgeworCWlmICgoZmxhZ3MgJiBBVEFfUkVBRElEX1BPU1RSRVNFVCkgJiYgY2xhc3MgPT0gQVRBX0RFVl9BVEEpIHsKIAkJLyoKIAkJICogVGhlIGV4YWN0IHNlcXVlbmNlIGV4cGVjdGVkIGJ5IGNlcnRhaW4gcHJlLUFUQTQgZHJpdmVzIGlzOgogCQkgKiBTUlNUIFJFU0VUCkBAIC0xMzE0LDcgKzE1MjMsNyBAQAogCQkJLyogY3VycmVudCBDSFMgdHJhbnNsYXRpb24gaW5mbyAoaWRbNTMtNThdKSBtaWdodCBiZQogCQkJICogY2hhbmdlZC4gcmVyZWFkIHRoZSBpZGVudGlmeSBkZXZpY2UgaW5mby4KIAkJCSAqLwotCQkJcG9zdF9yZXNldCA9IDA7CisJCQlmbGFncyAmPSB+QVRBX1JFQURJRF9QT1NUUkVTRVQ7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAJfQpAQCAtMTM0NSw3ICsxNTU0LDEwIEBACiAJCWRlc2NbMF0gPSAnXDAnOwogCQlyZXR1cm47CiAJfQotCisJaWYgKGF0YV9kZXZpY2VfYmxhY2tsaXN0ZWQoZGV2KSAmIEFUQV9IT1JLQUdFX05PTkNRKSB7CisJCXNucHJpbnRmKGRlc2MsIGRlc2Nfc3osICJOQ1EgKG5vdCB1c2VkKSIpOworCQlyZXR1cm47CisJfQogCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19OQ1EpIHsKIAkJaGRlcHRoID0gbWluKGFwLT5zY3NpX2hvc3QtPmNhbl9xdWV1ZSwgQVRBX01BWF9RVUVVRSAtIDEpOwogCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19OQ1E7CkBAIC0xMzc0LDcgKzE1ODYsNiBAQAogLyoqCiAgKglhdGFfZGV2X2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSB0aGUgc3BlY2lmaWVkIEFUQS9BVEFQSSBkZXZpY2UKICAqCUBkZXY6IFRhcmdldCBkZXZpY2UgdG8gY29uZmlndXJlCi0gKglAcHJpbnRfaW5mbzogRW5hYmxlIGRldmljZSBpbmZvIHByaW50b3V0CiAgKgogICoJQ29uZmlndXJlIEBkZXYgYWNjb3JkaW5nIHRvIEBkZXYtPmlkLiAgR2VuZXJpYyBhbmQgbG93LWxldmVsCiAgKglkcml2ZXIgc3BlY2lmaWMgZml4dXBzIGFyZSBhbHNvIGFwcGxpZWQuCkBAIC0xMzg1LDkgKzE1OTYsMTAgQEAKICAqCVJFVFVSTlM6CiAgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UKICAqLwotaW50IGF0YV9kZXZfY29uZmlndXJlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBwcmludF9pbmZvKQoraW50IGF0YV9kZXZfY29uZmlndXJlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CisJaW50IHByaW50X2luZm8gPSBhcC0+ZWhfY29udGV4dC5pLmZsYWdzICYgQVRBX0VISV9QUklOVElORk87CiAJY29uc3QgdTE2ICppZCA9IGRldi0+aWQ7CiAJdW5zaWduZWQgaW50IHhmZXJfbWFzazsKIAljaGFyIHJldmJ1Zls3XTsJCS8qIFhZWi05OVwwICovCkBAIC0xNDU0LDYgKzE2NjYsMTAgQEAKIAkJCWlmIChhdGFfaWRfaGFzX2xiYTQ4KGlkKSkgewogCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0xCQTQ4OwogCQkJCWxiYV9kZXNjID0gIkxCQTQ4IjsKKworCQkJCWlmIChkZXYtPm5fc2VjdG9ycyA+PSAoMVVMIDw8IDI4KSAmJgorCQkJCSAgICBhdGFfaWRfaGFzX2ZsdXNoX2V4dChpZCkpCisJCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0ZMVVNIX0VYVDsKIAkJCX0KIAogCQkJLyogY29uZmlnIE5DUSAqLwpAQCAtMTUzMCw2ICsxNzQ2LDExIEBACiAJCQkJICAgICAgIGNkYl9pbnRyX3N0cmluZyk7CiAJfQogCisJLyogZGV0ZXJtaW5lIG1heF9zZWN0b3JzICovCisJZGV2LT5tYXhfc2VjdG9ycyA9IEFUQV9NQVhfU0VDVE9SUzsKKwlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkE0OCkKKwkJZGV2LT5tYXhfc2VjdG9ycyA9IEFUQV9NQVhfU0VDVE9SU19MQkE0ODsKKwogCWlmIChkZXYtPmhvcmthZ2UgJiBBVEFfSE9SS0FHRV9ESUFHTk9TVElDKSB7CiAJCS8qIExldCB0aGUgdXNlciBrbm93LiBXZSBkb24ndCB3YW50IHRvIGRpc2FsbG93IG9wZW5zIGZvcgogCQkgICByZXNjdWUgcHVycG9zZXMsIG9yIGluIGNhc2UgdGhlIHZlbmRvciBpcyBqdXN0IGEgYmxpdGhlcmluZwpAQCAtMTYzMSwxMSArMTg1MiwxNCBAQAogCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpKQogCQkJY29udGludWU7CiAKLQkJcmMgPSBhdGFfZGV2X3JlYWRfaWQoZGV2LCAmZGV2LT5jbGFzcywgMSwgZGV2LT5pZCk7CisJCXJjID0gYXRhX2Rldl9yZWFkX2lkKGRldiwgJmRldi0+Y2xhc3MsIEFUQV9SRUFESURfUE9TVFJFU0VULAorCQkJCSAgICAgZGV2LT5pZCk7CiAJCWlmIChyYykKIAkJCWdvdG8gZmFpbDsKIAotCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldiwgMSk7CisJCWFwLT5laF9jb250ZXh0LmkuZmxhZ3MgfD0gQVRBX0VISV9QUklOVElORk87CisJCXJjID0gYXRhX2Rldl9jb25maWd1cmUoZGV2KTsKKwkJYXAtPmVoX2NvbnRleHQuaS5mbGFncyAmPSB+QVRBX0VISV9QUklOVElORk87CiAJCWlmIChyYykKIAkJCWdvdG8gZmFpbDsKIAl9CkBAIC0yMTUzLDYgKzIzNzcsNyBAQAogCiBzdGF0aWMgaW50IGF0YV9kZXZfc2V0X21vZGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZkZXYtPmFwLT5laF9jb250ZXh0OwogCXVuc2lnbmVkIGludCBlcnJfbWFzazsKIAlpbnQgcmM7CiAKQEAgLTIxNjcsNyArMjM5Miw5IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1BPU1RfU0VUTU9ERTsKIAlyYyA9IGF0YV9kZXZfcmV2YWxpZGF0ZShkZXYsIDApOworCWVoYy0+aS5mbGFncyAmPSB+QVRBX0VISV9QT1NUX1NFVE1PREU7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTIzMjUsMTEgKzI1NTIsMTQgQEAKICAqCVNsZWVwIHVudGlsIEFUQSBTdGF0dXMgcmVnaXN0ZXIgYml0IEJTWSBjbGVhcnMsCiAgKglvciBhIHRpbWVvdXQgb2NjdXJzLgogICoKLSAqCUxPQ0tJTkc6IE5vbmUuCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KLQotdW5zaWduZWQgaW50IGF0YV9idXN5X3NsZWVwIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHRtb3V0X3BhdCwgdW5zaWduZWQgbG9uZyB0bW91dCkKK2ludCBhdGFfYnVzeV9zbGVlcChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkgICB1bnNpZ25lZCBsb25nIHRtb3V0X3BhdCwgdW5zaWduZWQgbG9uZyB0bW91dCkKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXJ0LCB0aW1lb3V0OwogCXU4IHN0YXR1czsKQEAgLTIzMzcsMjcgKzI1NjcsMzIgQEAKIAlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMzAwKTsKIAl0aW1lcl9zdGFydCA9IGppZmZpZXM7CiAJdGltZW91dCA9IHRpbWVyX3N0YXJ0ICsgdG1vdXRfcGF0OwotCXdoaWxlICgoc3RhdHVzICYgQVRBX0JVU1kpICYmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkpIHsKKwl3aGlsZSAoc3RhdHVzICE9IDB4ZmYgJiYgKHN0YXR1cyAmIEFUQV9CVVNZKSAmJgorCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoNTApOwogCQlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMyk7CiAJfQogCi0JaWYgKHN0YXR1cyAmIEFUQV9CVVNZKQorCWlmIChzdGF0dXMgIT0gMHhmZiAmJiAoc3RhdHVzICYgQVRBX0JVU1kpKQogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywKIAkJCQkicG9ydCBpcyBzbG93IHRvIHJlc3BvbmQsIHBsZWFzZSBiZSBwYXRpZW50ICIKIAkJCQkiKFN0YXR1cyAweCV4KVxuIiwgc3RhdHVzKTsKIAogCXRpbWVvdXQgPSB0aW1lcl9zdGFydCArIHRtb3V0OwotCXdoaWxlICgoc3RhdHVzICYgQVRBX0JVU1kpICYmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkpIHsKKwl3aGlsZSAoc3RhdHVzICE9IDB4ZmYgJiYgKHN0YXR1cyAmIEFUQV9CVVNZKSAmJgorCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoNTApOwogCQlzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CiAJfQogCisJaWYgKHN0YXR1cyA9PSAweGZmKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkgewogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAicG9ydCBmYWlsZWQgdG8gcmVzcG9uZCAiCiAJCQkJIiglbHUgc2VjcywgU3RhdHVzIDB4JXgpXG4iLAogCQkJCXRtb3V0IC8gSFosIHN0YXR1cyk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjQ0OCwxMCArMjY4Myw4IEBACiAJICogdGhlIGJ1cyBzaG93cyAweEZGIGJlY2F1c2UgdGhlIG9kZCBjbG93biBmb3JnZXRzIHRoZSBENwogCSAqIHB1bGxkb3duIHJlc2lzdG9yLgogCSAqLwotCWlmIChhdGFfY2hlY2tfc3RhdHVzKGFwKSA9PSAweEZGKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJTUlNUIGZhaWxlZCAoc3RhdHVzIDB4RkYpXG4iKTsKLQkJcmV0dXJuIEFDX0VSUl9PVEhFUjsKLQl9CisJaWYgKGF0YV9jaGVja19zdGF0dXMoYXApID09IDB4RkYpCisJCXJldHVybiAwOwogCiAJYXRhX2J1c19wb3N0X3Jlc2V0KGFwLCBkZXZtYXNrKTsKIApAQCAtMjc3Nyw5ICszMDEwLDkgQEAKIH0KIAogLyoqCi0gKglzYXRhX3N0ZF9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CisgKglzYXRhX3BvcnRfaGFyZHJlc2V0IC0gcmVzZXQgcG9ydCB2aWEgU0FUQSBwaHkgcmVzZXQKICAqCUBhcDogcG9ydCB0byByZXNldAotICoJQGNsYXNzOiByZXN1bHRpbmcgY2xhc3Mgb2YgYXR0YWNoZWQgZGV2aWNlCisgKglAdGltaW5nOiB0aW1pbmcgcGFyYW1ldGVycyB7IGludGVydmFsLCBkdXJhdGlub24sIHRpbWVvdXQgfSBpbiBtc2VjCiAgKgogICoJU0FUQSBwaHktcmVzZXQgaG9zdCBwb3J0IHVzaW5nIERFVCBiaXRzIG9mIFNDb250cm9sIHJlZ2lzdGVyLgogICoKQEAgLTI3ODksMTAgKzMwMjIsOCBAQAogICoJUkVUVVJOUzoKICAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KICAqLwotaW50IHNhdGFfc3RkX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQoraW50IHNhdGFfcG9ydF9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nKQogewotCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRpbWluZyA9IHNhdGFfZWhjX2RlYl90aW1pbmcoZWhjKTsKIAl1MzIgc2NvbnRyb2w7CiAJaW50IHJjOwogCkBAIC0yODA1LDI0ICszMDM2LDI0IEBACiAJCSAqIGFuZCBTaWwzMTI0LgogCQkgKi8KIAkJaWYgKChyYyA9IHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpKSkKLQkJCXJldHVybiByYzsKKwkJCWdvdG8gb3V0OwogCiAJCXNjb250cm9sID0gKHNjb250cm9sICYgMHgwZjApIHwgMHgzMDQ7CiAKIAkJaWYgKChyYyA9IHNhdGFfc2NyX3dyaXRlKGFwLCBTQ1JfQ09OVFJPTCwgc2NvbnRyb2wpKSkKLQkJCXJldHVybiByYzsKKwkJCWdvdG8gb3V0OwogCiAJCXNhdGFfc2V0X3NwZChhcCk7CiAJfQogCiAJLyogaXNzdWUgcGh5IHdha2UvcmVzZXQgKi8KIAlpZiAoKHJjID0gc2F0YV9zY3JfcmVhZChhcCwgU0NSX0NPTlRST0wsICZzY29udHJvbCkpKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gb3V0OwogCiAJc2NvbnRyb2wgPSAoc2NvbnRyb2wgJiAweDBmMCkgfCAweDMwMTsKIAogCWlmICgocmMgPSBzYXRhX3Njcl93cml0ZV9mbHVzaChhcCwgU0NSX0NPTlRST0wsIHNjb250cm9sKSkpCi0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAKIAkvKiBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIGluIFNBVEEgSS9JSSBzcGVjcywgYnV0IEFIQ0ktMS4xCiAJICogMTAuNC4yIHNheXMgYXQgbGVhc3QgMSBtcy4KQEAgLTI4MzAsNyArMzA2MSw0MCBAQAogCW1zbGVlcCgxKTsKIAogCS8qIGJyaW5nIHBoeSBiYWNrICovCi0Jc2F0YV9waHlfcmVzdW1lKGFwLCB0aW1pbmcpOworCXJjID0gc2F0YV9waHlfcmVzdW1lKGFwLCB0aW1pbmcpOworIG91dDoKKwlEUFJJTlRLKCJFWElULCByYz0lZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoqCisgKglzYXRhX3N0ZF9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CisgKglAYXA6IHBvcnQgdG8gcmVzZXQKKyAqCUBjbGFzczogcmVzdWx0aW5nIGNsYXNzIG9mIGF0dGFjaGVkIGRldmljZQorICoKKyAqCVNBVEEgcGh5LXJlc2V0IGhvc3QgcG9ydCB1c2luZyBERVQgYml0cyBvZiBTQ29udHJvbCByZWdpc3RlciwKKyAqCXdhaXQgZm9yICFCU1kgYW5kIGNsYXNzaWZ5IHRoZSBhdHRhY2hlZCBkZXZpY2UuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCisgKi8KK2ludCBzYXRhX3N0ZF9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICp0aW1pbmcgPSBzYXRhX2VoY19kZWJfdGltaW5nKCZhcC0+ZWhfY29udGV4dCk7CisJaW50IHJjOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJLyogZG8gaGFyZHJlc2V0ICovCisJcmMgPSBzYXRhX3BvcnRfaGFyZHJlc2V0KGFwLCB0aW1pbmcpOworCWlmIChyYykgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJCSJDT01SRVNFVCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQogCiAJLyogVE9ETzogcGh5IGxheWVyIHdpdGggcG9sbGluZywgdGltZW91dHMsIGV0Yy4gKi8KIAlpZiAoYXRhX3BvcnRfb2ZmbGluZShhcCkpIHsKQEAgLTI5NjksNyArMzIzMyw3IEBACiAvKioKICAqCWF0YV9kZXZfcmV2YWxpZGF0ZSAtIFJldmFsaWRhdGUgQVRBIGRldmljZQogICoJQGRldjogZGV2aWNlIHRvIHJldmFsaWRhdGUKLSAqCUBwb3N0X3Jlc2V0OiBpcyB0aGlzIHJldmFsaWRhdGlvbiBhZnRlciByZXNldD8KKyAqCUByZWFkaWRfZmxhZ3M6IHJlYWQgSUQgZmxhZ3MKICAqCiAgKglSZS1yZWFkIElERU5USUZZIHBhZ2UgYW5kIG1ha2Ugc3VyZSBAZGV2IGlzIHN0aWxsIGF0dGFjaGVkIHRvCiAgKgl0aGUgcG9ydC4KQEAgLTI5ODAsNyArMzI0NCw3IEBACiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKICAqLwotaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcG9zdF9yZXNldCkKK2ludCBhdGFfZGV2X3JldmFsaWRhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlYWRpZF9mbGFncykKIHsKIAl1bnNpZ25lZCBpbnQgY2xhc3MgPSBkZXYtPmNsYXNzOwogCXUxNiAqaWQgPSAodm9pZCAqKWRldi0+YXAtPnNlY3Rvcl9idWY7CkBAIC0yOTkyLDcgKzMyNTYsNyBAQAogCX0KIAogCS8qIHJlYWQgSUQgZGF0YSAqLwotCXJjID0gYXRhX2Rldl9yZWFkX2lkKGRldiwgJmNsYXNzLCBwb3N0X3Jlc2V0LCBpZCk7CisJcmMgPSBhdGFfZGV2X3JlYWRfaWQoZGV2LCAmY2xhc3MsIHJlYWRpZF9mbGFncywgaWQpOwogCWlmIChyYykKIAkJZ290byBmYWlsOwogCkBAIC0zMDA1LDcgKzMyNjksNyBAQAogCW1lbWNweShkZXYtPmlkLCBpZCwgc2l6ZW9mKGlkWzBdKSAqIEFUQV9JRF9XT1JEUyk7CiAKIAkvKiBjb25maWd1cmUgZGV2aWNlIGFjY29yZGluZyB0byB0aGUgbmV3IElEICovCi0JcmMgPSBhdGFfZGV2X2NvbmZpZ3VyZShkZXYsIDApOworCXJjID0gYXRhX2Rldl9jb25maWd1cmUoZGV2KTsKIAlpZiAocmMgPT0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTMwMTQsMzcgKzMyNzgsNTUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRhX2RtYV9ibGFja2xpc3QgW10gPSB7Ci0JIldEQyBBQzExMDAwSCIsIE5VTEwsCi0JIldEQyBBQzIyMTAwSCIsIE5VTEwsCi0JIldEQyBBQzMyNTAwSCIsIE5VTEwsCi0JIldEQyBBQzMzMTAwSCIsIE5VTEwsCi0JIldEQyBBQzMxNjAwSCIsIE5VTEwsCi0JIldEQyBBQzMyMTAwSCIsICIyNC4wOVAwNyIsCi0JIldEQyBBQzIzMjAwTCIsICIyMS4xME4yMSIsCi0JIkNvbXBhcSBDUkQtODI0MUIiLCAgTlVMTCwKLQkiQ1JELTg0MDBCIiwgTlVMTCwKLQkiQ1JELTg0ODBCIiwgTlVMTCwKLQkiQ1JELTg0ODJCIiwgTlVMTCwKLSAJIkNSRC04NCIsIE5VTEwsCi0JIlNhbkRpc2sgU0RQM0IiLCBOVUxMLAotCSJTYW5EaXNrIFNEUDNCLTY0IiwgTlVMTCwKLQkiU0FOWU8gQ0QtUk9NIENSRCIsIE5VTEwsCi0JIkhJVEFDSEkgQ0RSLTgiLCBOVUxMLAotCSJISVRBQ0hJIENEUi04MzM1IiwgTlVMTCwKLQkiSElUQUNISSBDRFItODQzNSIsIE5VTEwsCi0JIlRvc2hpYmEgQ0QtUk9NIFhNLTYyMDJCIiwgTlVMTCwKLQkiVE9TSElCQSBDRC1ST00gWE0tMTcwMkJDIiwgTlVMTCwKLQkiQ0QtNTMyRS1BIiwgTlVMTCwKLQkiRS1JREUgQ0QtUk9NIENSLTg0MCIsIE5VTEwsCi0JIkNELVJPTSBEcml2ZS9GNUEiLCBOVUxMLAotCSJXUEkgQ0RELTgyMCIsIE5VTEwsCi0JIlNBTVNVTkcgQ0QtUk9NIFNDLTE0OEMiLCBOVUxMLAotCSJTQU1TVU5HIENELVJPTSBTQyIsIE5VTEwsCi0JIlNhbkRpc2sgU0RQM0ItNjQiLCBOVUxMLAotCSJBVEFQSSBDRC1ST00gRFJJVkUgNDBYIE1BWElNVU0iLE5VTEwsCi0JIl9ORUMgRFY1ODAwQSIsIE5VTEwsCi0JIlNBTVNVTkcgQ0QtUk9NIFNOLTEyNCIsICJOMDAxIgorc3RydWN0IGF0YV9ibGFja2xpc3RfZW50cnkgeworCWNvbnN0IGNoYXIgKm1vZGVsX251bTsKKwljb25zdCBjaGFyICptb2RlbF9yZXY7CisJdW5zaWduZWQgbG9uZyBob3JrYWdlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfYmxhY2tsaXN0X2VudHJ5IGF0YV9kZXZpY2VfYmxhY2tsaXN0IFtdID0geworCS8qIERldmljZXMgd2l0aCBETUEgcmVsYXRlZCBwcm9ibGVtcyB1bmRlciBMaW51eCAqLworCXsgIldEQyBBQzExMDAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzIyMTAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMyNTAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMzMTAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMxNjAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMyMTAwSCIsCSIyNC4wOVAwNyIsCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiV0RDIEFDMjMyMDBMIiwJIjIxLjEwTjIxIiwJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDb21wYXEgQ1JELTgyNDFCIiwgCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkNSRC04NDAwQiIsCQlOVUxMLCAJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiQ1JELTg0ODBCIiwJCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkNSRC04NDgyQiIsCQlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDUkQtODQiLAkJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiU2FuRGlzayBTRFAzQiIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIlNhbkRpc2sgU0RQM0ItNjQiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJTQU5ZTyBDRC1ST00gQ1JEIiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiSElUQUNISSBDRFItOCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkhJVEFDSEkgQ0RSLTgzMzUiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJISVRBQ0hJIENEUi04NDM1IiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiVG9zaGliYSBDRC1ST00gWE0tNjIwMkIiLCBOVUxMLAlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIlRPU0hJQkEgQ0QtUk9NIFhNLTE3MDJCQyIsIE5VTEwsCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiQ0QtNTMyRS1BIiwgCQlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJFLUlERSBDRC1ST00gQ1ItODQwIixOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDRC1ST00gRHJpdmUvRjVBIiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiV1BJIENERC04MjAiLCAJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiU0FNU1VORyBDRC1ST00gU0MtMTQ4QyIsIE5VTEwsCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiU0FNU1VORyBDRC1ST00gU0MiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJTYW5EaXNrIFNEUDNCLTY0IiwgCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkFUQVBJIENELVJPTSBEUklWRSA0MFggTUFYSU1VTSIsTlVMTCxBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIl9ORUMgRFY1ODAwQSIsIAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJTQU1TVU5HIENELVJPTSBTTi0xMjQiLCJOMDAxIiwJQVRBX0hPUktBR0VfTk9ETUEgfSwKKworCS8qIERldmljZXMgd2UgZXhwZWN0IHRvIGZhaWwgZGlhZ25vc3RpY3MgKi8KKworCS8qIERldmljZXMgd2hlcmUgTkNRIHNob3VsZCBiZSBhdm9pZGVkICovCisJLyogTkNRIGlzIHNsb3cgKi8KKyAgICAgICAgeyAiV0RDIFdENzQwQURGRC0wMCIsICAgTlVMTCwJCUFUQV9IT1JLQUdFX05PTkNRIH0sCisKKwkvKiBEZXZpY2VzIHdpdGggTkNRIGxpbWl0cyAqLworCisJLyogRW5kIE1hcmtlciAqLworCXsgfQogfTsKIAogc3RhdGljIGludCBhdGFfc3RyaW0oY2hhciAqcywgc2l6ZV90IGxlbikKQEAgLTMwNTksMjAgKzMzNDEsMTIgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGF0YV9kbWFfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3Vuc2lnbmVkIGxvbmcgYXRhX2RldmljZV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtWzQwXTsKIAl1bnNpZ25lZCBjaGFyIG1vZGVsX3JldlsxNl07CiAJdW5zaWduZWQgaW50IG5sZW4sIHJsZW47Ci0JaW50IGk7Ci0KLQkvKiBXZSBkb24ndCBzdXBwb3J0IHBvbGxpbmcgRE1BLgotCSAqIERNQSBibGFja2xpc3QgdGhvc2UgQVRBUEkgZGV2aWNlcyB3aXRoIENEQi1pbnRyIChhbmQgdXNlIFBJTykKLQkgKiBpZiB0aGUgTExERCBoYW5kbGVzIG9ubHkgaW50ZXJydXB0cyBpbiB0aGUgSFNNX1NUX0xBU1Qgc3RhdGUuCi0JICovCi0JaWYgKChkZXYtPmFwLT5mbGFncyAmIEFUQV9GTEFHX1BJT19QT0xMSU5HKSAmJgotCSAgICAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19DREJfSU5UUikpCi0JCXJldHVybiAxOworCWNvbnN0IHN0cnVjdCBhdGFfYmxhY2tsaXN0X2VudHJ5ICphZCA9IGF0YV9kZXZpY2VfYmxhY2tsaXN0OwogCiAJYXRhX2lkX3N0cmluZyhkZXYtPmlkLCBtb2RlbF9udW0sIEFUQV9JRF9QUk9EX09GUywKIAkJCSAgc2l6ZW9mKG1vZGVsX251bSkpOwpAQCAtMzA4MSwxNyArMzM1NSwzMCBAQAogCW5sZW4gPSBhdGFfc3RyaW0obW9kZWxfbnVtLCBzaXplb2YobW9kZWxfbnVtKSk7CiAJcmxlbiA9IGF0YV9zdHJpbShtb2RlbF9yZXYsIHNpemVvZihtb2RlbF9yZXYpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0YV9kbWFfYmxhY2tsaXN0KTsgaSArPSAyKSB7Ci0JCWlmICghc3RybmNtcChhdGFfZG1hX2JsYWNrbGlzdFtpXSwgbW9kZWxfbnVtLCBubGVuKSkgewotCQkJaWYgKGF0YV9kbWFfYmxhY2tsaXN0W2krMV0gPT0gTlVMTCkKLQkJCQlyZXR1cm4gMTsKLQkJCWlmICghc3RybmNtcChhdGFfZG1hX2JsYWNrbGlzdFtpXSwgbW9kZWxfcmV2LCBybGVuKSkKLQkJCQlyZXR1cm4gMTsKKwl3aGlsZSAoYWQtPm1vZGVsX251bSkgeworCQlpZiAoIXN0cm5jbXAoYWQtPm1vZGVsX251bSwgbW9kZWxfbnVtLCBubGVuKSkgeworCQkJaWYgKGFkLT5tb2RlbF9yZXYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gYWQtPmhvcmthZ2U7CisJCQlpZiAoIXN0cm5jbXAoYWQtPm1vZGVsX3JldiwgbW9kZWxfcmV2LCBybGVuKSkKKwkJCQlyZXR1cm4gYWQtPmhvcmthZ2U7CiAJCX0KKwkJYWQrKzsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRhX2RtYV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCS8qIFdlIGRvbid0IHN1cHBvcnQgcG9sbGluZyBETUEuCisJICogRE1BIGJsYWNrbGlzdCB0aG9zZSBBVEFQSSBkZXZpY2VzIHdpdGggQ0RCLWludHIgKGFuZCB1c2UgUElPKQorCSAqIGlmIHRoZSBMTEREIGhhbmRsZXMgb25seSBpbnRlcnJ1cHRzIGluIHRoZSBIU01fU1RfTEFTVCBzdGF0ZS4KKwkgKi8KKwlpZiAoKGRldi0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfUElPX1BPTExJTkcpICYmCisJICAgIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0NEQl9JTlRSKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIChhdGFfZGV2aWNlX2JsYWNrbGlzdGVkKGRldikgJiBBVEFfSE9SS0FHRV9OT0RNQSkgPyAxIDogMDsKK30KKwogLyoqCiAgKglhdGFfZGV2X3hmZXJtYXNrIC0gQ29tcHV0ZSBzdXBwb3J0ZWQgeGZlcm1hc2sgb2YgdGhlIGdpdmVuIGRldmljZQogICoJQGRldjogRGV2aWNlIHRvIGNvbXB1dGUgeGZlcm1hc2sgZm9yCkBAIC0zMTE5LDYgKzM0MDYsMTMgQEAKIAkgKi8KIAlpZiAoYXAtPmNibCA9PSBBVEFfQ0JMX1BBVEE0MCkKIAkJeGZlcl9tYXNrICY9IH4oMHhGOCA8PCBBVEFfU0hJRlRfVURNQSk7CisJLyogQXBwbHkgZHJpdmUgc2lkZSBjYWJsZSBydWxlLiBVbmtub3duIG9yIDgwIHBpbiBjYWJsZXMgcmVwb3J0ZWQKKwkgKiBob3N0IHNpZGUgYXJlIGNoZWNrZWQgZHJpdmUgc2lkZSBhcyB3ZWxsLiBDYXNlcyB3aGVyZSB3ZSBrbm93IGEKKwkgKiA0MHdpcmUgY2FibGUgaXMgdXNlZCBzYWZlbHkgZm9yIDgwIGFyZSBub3QgY2hlY2tlZCBoZXJlLgorCSAqLworICAgICAgICBpZiAoYXRhX2RyaXZlXzQwd2lyZShkZXYtPmlkKSAmJiAoYXAtPmNibCA9PSBBVEFfQ0JMX1BBVEFfVU5LIHx8IGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBODApKQorCQl4ZmVyX21hc2sgJj0gfigweEY4IDw8IEFUQV9TSElGVF9VRE1BKTsKKwogCiAJeGZlcl9tYXNrICY9IGF0YV9wYWNrX3hmZXJtYXNrKGRldi0+cGlvX21hc2ssCiAJCQkJICAgICAgIGRldi0+bXdkbWFfbWFzaywgZGV2LT51ZG1hX21hc2spOwpAQCAtMzIzNiw4ICszNTMwLDcgQEAKICAqCUxPQ0tJTkc6CiAgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0IGxvY2spCiAgKi8KLQotc3RhdGljIHZvaWQgYXRhX3NnX2NsZWFuKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit2b2lkIGF0YV9zZ19jbGVhbihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5fX3NnOwpAQCAtMzM5NSwxOSArMzY4OCwxNSBAQAogCiB2b2lkIGF0YV9zZ19pbml0X29uZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQogCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX1NJTkdMRTsKIAotCW1lbXNldCgmcWMtPnNnZW50LCAwLCBzaXplb2YocWMtPnNnZW50KSk7CiAJcWMtPl9fc2cgPSAmcWMtPnNnZW50OwogCXFjLT5uX2VsZW0gPSAxOwogCXFjLT5vcmlnX25fZWxlbSA9IDE7CiAJcWMtPmJ1Zl92aXJ0ID0gYnVmOwogCXFjLT5uYnl0ZXMgPSBidWZsZW47CiAKLQlzZyA9IHFjLT5fX3NnOwotCXNnX2luaXRfb25lKHNnLCBidWYsIGJ1Zmxlbik7CisJc2dfaW5pdF9vbmUoJnFjLT5zZ2VudCwgYnVmLCBidWZsZW4pOwogfQogCiAvKioKQEAgLTQyMDAsOCArNDQ4OSwxMiBAQAogCQkJCQkvKiBkZXZpY2Ugc3RvcHMgSFNNIGZvciBhYm9ydC9lcnJvciAqLwogCQkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0RFVjsKIAkJCQllbHNlCi0JCQkJCS8qIEhTTSB2aW9sYXRpb24uIExldCBFSCBoYW5kbGUgdGhpcyAqLwotCQkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKKwkJCQkJLyogSFNNIHZpb2xhdGlvbi4gTGV0IEVIIGhhbmRsZSB0aGlzLgorCQkJCQkgKiBQaGFudG9tIGRldmljZXMgYWxzbyB0cmlnZ2VyIHRoaXMKKwkJCQkJICogY29uZGl0aW9uLiAgTWFyayBoaW50LgorCQkJCQkgKi8KKwkJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IU00gfAorCQkJCQkJCUFDX0VSUl9OT0RFVl9ISU5UOwogCiAJCQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0VSUjsKIAkJCQlnb3RvIGZzbV9zdGFydDsKQEAgLTQ0NDAsNiArNDczMywxNCBAQAogCXFjLT5jb21wbGV0ZV9mbihxYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGZpbGxfcmVzdWx0X3RmKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKworCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZxYy0+cmVzdWx0X3RmKTsKKwlxYy0+cmVzdWx0X3RmLmZsYWdzID0gcWMtPnRmLmZsYWdzOworfQorCiAvKioKICAqCWF0YV9xY19jb21wbGV0ZSAtIENvbXBsZXRlIGFuIGFjdGl2ZSBBVEEgY29tbWFuZAogICoJQHFjOiBDb21tYW5kIHRvIGNvbXBsZXRlCkBAIC00NDc3LDcgKzQ3NzgsNyBAQAogCQlpZiAodW5saWtlbHkocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpKSB7CiAJCQlpZiAoIWF0YV90YWdfaW50ZXJuYWwocWMtPnRhZykpIHsKIAkJCQkvKiBhbHdheXMgZmlsbCByZXN1bHQgVEYgZm9yIGZhaWxlZCBxYyAqLwotCQkJCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZxYy0+cmVzdWx0X3RmKTsKKwkJCQlmaWxsX3Jlc3VsdF90ZihxYyk7CiAJCQkJYXRhX3FjX3NjaGVkdWxlX2VoKHFjKTsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC00NDg1LDcgKzQ3ODYsNyBAQAogCiAJCS8qIHJlYWQgcmVzdWx0IFRGIGlmIHJlcXVlc3RlZCAqLwogCQlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19SRVNVTFRfVEYpCi0JCQlhcC0+b3BzLT50Zl9yZWFkKGFwLCAmcWMtPnJlc3VsdF90Zik7CisJCQlmaWxsX3Jlc3VsdF90ZihxYyk7CiAKIAkJX19hdGFfcWNfY29tcGxldGUocWMpOwogCX0gZWxzZSB7CkBAIC00NDk0LDcgKzQ3OTUsNyBAQAogCiAJCS8qIHJlYWQgcmVzdWx0IFRGIGlmIGZhaWxlZCBvciByZXF1ZXN0ZWQgKi8KIAkJaWYgKHFjLT5lcnJfbWFzayB8fCBxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1JFU1VMVF9URikKLQkJCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZxYy0+cmVzdWx0X3RmKTsKKwkJCWZpbGxfcmVzdWx0X3RmKHFjKTsKIAogCQlfX2F0YV9xY19jb21wbGV0ZShxYyk7CiAJfQpAQCAtNDY3NCw2ICs0OTc1LDE0IEBACiAJCX0KIAl9CiAKKwkvKiBTb21lIGNvbnRyb2xsZXJzIHNob3cgZmxha3kgaW50ZXJydXB0IGJlaGF2aW9yIGFmdGVyCisJICogc2V0dGluZyB4ZmVyIG1vZGUuICBVc2UgcG9sbGluZyBpbnN0ZWFkLgorCSAqLworCWlmICh1bmxpa2VseShxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUyAmJgorCQkgICAgIHFjLT50Zi5mZWF0dXJlID09IFNFVEZFQVRVUkVTX1hGRVIpICYmCisJICAgIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcpKQorCQlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX1BPTExJTkc7CisKIAkvKiBzZWxlY3QgdGhlIGRldmljZSAqLwogCWF0YV9kZXZfc2VsZWN0KGFwLCBxYy0+ZGV2LT5kZXZubywgMSwgMCk7CiAKQEAgLTQ3ODIsNiArNTA5MSw3IEBACiBpbmxpbmUgdW5zaWduZWQgaW50IGF0YV9ob3N0X2ludHIgKHN0cnVjdCBhdGFfcG9ydCAqYXAsCiAJCQkJICAgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKKwlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+ZWhfaW5mbzsKIAl1OCBzdGF0dXMsIGhvc3Rfc3RhdCA9IDA7CiAKIAlWUFJJTlRLKCJhdGEldTogcHJvdG9jb2wgJWQgdGFza19zdGF0ZSAlZFxuIiwKQEAgLTQ4NDIsNiArNTE1MiwxMSBAQAogCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7CiAKIAlhdGFfaHNtX21vdmUoYXAsIHFjLCBzdGF0dXMsIDApOworCisJaWYgKHVubGlrZWx5KHFjLT5lcnJfbWFzaykgJiYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgfHwKKwkJCQkgICAgICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkpCisJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIkJNRE1BIHN0YXQgMHgleCIsIGhvc3Rfc3RhdCk7CisKIAlyZXR1cm4gMTsJLyogaXJxIGhhbmRsZWQgKi8KIAogaWRsZV9pcnE6CkBAIC01MDQ4LDcgKzUzNjMsNyBAQAogCWlmICghYXRhX3RyeV9mbHVzaF9jYWNoZShkZXYpKQogCQlyZXR1cm4gMDsKIAotCWlmIChhdGFfaWRfaGFzX2ZsdXNoX2V4dChkZXYtPmlkKSkKKwlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19GTFVTSF9FWFQpCiAJCWNtZCA9IEFUQV9DTURfRkxVU0hfRVhUOwogCWVsc2UKIAkJY21kID0gQVRBX0NNRF9GTFVTSDsKQEAgLTU1MjAsOSArNTgzNSw4IEBACiAJCQkJYXAtPmlvYWRkci5ibWRtYV9hZGRyLAogCQkJCWlycV9saW5lKTsKIAotCQlhdGFfY2hrX3N0YXR1cyhhcCk7Ci0JCWhvc3QtPm9wcy0+aXJxX2NsZWFyKGFwKTsKLQkJYXRhX2VoX2ZyZWV6ZV9wb3J0KGFwKTsJLyogZnJlZXplIHBvcnQgYmVmb3JlIHJlcXVlc3RpbmcgSVJRICovCisJCS8qIGZyZWV6ZSBwb3J0IGJlZm9yZSByZXF1ZXN0aW5nIElSUSAqLworCQlhdGFfZWhfZnJlZXplX3BvcnQoYXApOwogCX0KIAogCS8qIG9idGFpbiBpcnEsIHRoYXQgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzICovCkBAIC02MTIwLDYgKzY0MzQsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2J1c19yZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX3ByZXJlc2V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfc29mdHJlc2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfcG9ydF9oYXJkcmVzZXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9zdGRfaGFyZHJlc2V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfcG9zdHJlc2V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZfY2xhc3NpZnkpOwpAQCAtNjE0Niw2ICs2NDYxLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X3Jlc3VtZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaWRfc3RyaW5nKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9pZF9jX3N0cmluZyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2aWNlX2JsYWNrbGlzdGVkKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NpbXVsYXRlKTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Bpb19uZWVkX2lvcmR5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKaW5kZXggMDJiMmIyNy4uNzZhODVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKQEAgLTExMzYsMTkgKzExMzYsMjEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFUQV9ERVZfQVRBUEk6Ci0JCXRtcCA9IGF0YXBpX2VoX3JlcXVlc3Rfc2Vuc2UocWMtPmRldiwKLQkJCQkJICAgICBxYy0+c2NzaWNtZC0+c2Vuc2VfYnVmZmVyKTsKLQkJaWYgKCF0bXApIHsKLQkJCS8qIEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQgaXMgdXNlZCB0byB0ZWxsCi0JCQkgKiBhdGFwaV9xY19jb21wbGV0ZSgpIHRoYXQgc2Vuc2UgZGF0YSBpcwotCQkJICogYWxyZWFkeSB2YWxpZC4KLQkJCSAqCi0JCQkgKiBUT0RPOiBpbnRlcnByZXQgc2Vuc2UgZGF0YSBhbmQgc2V0Ci0JCQkgKiBhcHByb3ByaWF0ZSBlcnJfbWFzay4KLQkJCSAqLwotCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQ7Ci0JCX0gZWxzZQotCQkJcWMtPmVycl9tYXNrIHw9IHRtcDsKKwkJaWYgKCEocWMtPmFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKSkgeworCQkJdG1wID0gYXRhcGlfZWhfcmVxdWVzdF9zZW5zZShxYy0+ZGV2LAorCQkJCQkJICAgICBxYy0+c2NzaWNtZC0+c2Vuc2VfYnVmZmVyKTsKKwkJCWlmICghdG1wKSB7CisJCQkJLyogQVRBX1FDRkxBR19TRU5TRV9WQUxJRCBpcyB1c2VkIHRvCisJCQkJICogdGVsbCBhdGFwaV9xY19jb21wbGV0ZSgpIHRoYXQgc2Vuc2UKKwkJCQkgKiBkYXRhIGlzIGFscmVhZHkgdmFsaWQuCisJCQkJICoKKwkJCQkgKiBUT0RPOiBpbnRlcnByZXQgc2Vuc2UgZGF0YSBhbmQgc2V0CisJCQkJICogYXBwcm9wcmlhdGUgZXJyX21hc2suCisJCQkJICovCisJCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQ7CisJCQl9IGVsc2UKKwkJCQlxYy0+ZXJyX21hc2sgfD0gdG1wOworCQl9CiAJfQogCiAJaWYgKHFjLT5lcnJfbWFzayAmIChBQ19FUlJfSFNNIHwgQUNfRVJSX1RJTUVPVVQgfCBBQ19FUlJfQVRBX0JVUykpCkBAIC0xNDMzLDE2ICsxNDM1LDM5IEBACiAJfQogCiAJZm9yICh0YWcgPSAwOyB0YWcgPCBBVEFfTUFYX1FVRVVFOyB0YWcrKykgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZG1hX3N0cltdID0geworCQkJW0RNQV9CSURJUkVDVElPTkFMXQk9ICJiaWRpIiwKKwkJCVtETUFfVE9fREVWSUNFXQkJPSAib3V0IiwKKwkJCVtETUFfRlJPTV9ERVZJQ0VdCT0gImluIiwKKwkJCVtETUFfTk9ORV0JCT0gIiIsCisJCX07CiAJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBfX2F0YV9xY19mcm9tX3RhZyhhcCwgdGFnKTsKKwkJc3RydWN0IGF0YV90YXNrZmlsZSAqY21kID0gJnFjLT50ZiwgKnJlcyA9ICZxYy0+cmVzdWx0X3RmOworCQl1bnNpZ25lZCBpbnQgbmJ5dGVzOwogCiAJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fCAhcWMtPmVycl9tYXNrKQogCQkJY29udGludWU7CiAKLQkJYXRhX2Rldl9wcmludGsocWMtPmRldiwgS0VSTl9FUlIsICJ0YWcgJWQgY21kIDB4JXggIgotCQkJICAgICAgICJFbWFzayAweCV4IHN0YXQgMHgleCBlcnIgMHgleCAoJXMpXG4iLAotCQkJICAgICAgIHFjLT50YWcsIHFjLT50Zi5jb21tYW5kLCBxYy0+ZXJyX21hc2ssCi0JCQkgICAgICAgcWMtPnJlc3VsdF90Zi5jb21tYW5kLCBxYy0+cmVzdWx0X3RmLmZlYXR1cmUsCi0JCQkgICAgICAgYXRhX2Vycl9zdHJpbmcocWMtPmVycl9tYXNrKSk7CisJCW5ieXRlcyA9IHFjLT5uYnl0ZXM7CisJCWlmICghbmJ5dGVzKQorCQkJbmJ5dGVzID0gcWMtPm5zZWN0IDw8IDk7CisKKwkJYXRhX2Rldl9wcmludGsocWMtPmRldiwgS0VSTl9FUlIsCisJCQkiY21kICUwMngvJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4ICIKKwkJCSJ0YWcgJWQgY2RiIDB4JXggZGF0YSAldSAlc1xuICAgICAgICAgIgorCQkJInJlcyAlMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngvJTAyeCAiCisJCQkiRW1hc2sgMHgleCAoJXMpXG4iLAorCQkJY21kLT5jb21tYW5kLCBjbWQtPmZlYXR1cmUsIGNtZC0+bnNlY3QsCisJCQljbWQtPmxiYWwsIGNtZC0+bGJhbSwgY21kLT5sYmFoLAorCQkJY21kLT5ob2JfZmVhdHVyZSwgY21kLT5ob2JfbnNlY3QsCisJCQljbWQtPmhvYl9sYmFsLCBjbWQtPmhvYl9sYmFtLCBjbWQtPmhvYl9sYmFoLAorCQkJY21kLT5kZXZpY2UsIHFjLT50YWcsIHFjLT5jZGJbMF0sIG5ieXRlcywKKwkJCWRtYV9zdHJbcWMtPmRtYV9kaXJdLAorCQkJcmVzLT5jb21tYW5kLCByZXMtPmZlYXR1cmUsIHJlcy0+bnNlY3QsCisJCQlyZXMtPmxiYWwsIHJlcy0+bGJhbSwgcmVzLT5sYmFoLAorCQkJcmVzLT5ob2JfZmVhdHVyZSwgcmVzLT5ob2JfbnNlY3QsCisJCQlyZXMtPmhvYl9sYmFsLCByZXMtPmhvYl9sYmFtLCByZXMtPmhvYl9sYmFoLAorCQkJcmVzLT5kZXZpY2UsIHFjLT5lcnJfbWFzaywgYXRhX2Vycl9zdHJpbmcocWMtPmVycl9tYXNrKSk7CiAJfQogfQogCkBAIC0xNjM0LDExICsxNjU5LDE0IEBACiAJRFBSSU5USygiRU5URVJcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBhY3Rpb247CisJCXVuc2lnbmVkIGludCBhY3Rpb24sIHJlYWRpZF9mbGFncyA9IDA7CiAKIAkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CiAJCWFjdGlvbiA9IGF0YV9laF9kZXZfYWN0aW9uKGRldik7CiAKKwkJaWYgKGVoYy0+aS5mbGFncyAmIEFUQV9FSElfRElEX1JFU0VUKQorCQkJcmVhZGlkX2ZsYWdzIHw9IEFUQV9SRUFESURfUE9TVFJFU0VUOworCiAJCWlmIChhY3Rpb24gJiBBVEFfRUhfUkVWQUxJREFURSAmJiBhdGFfZGV2X3JlYWR5KGRldikpIHsKIAkJCWlmIChhdGFfcG9ydF9vZmZsaW5lKGFwKSkgewogCQkJCXJjID0gLUVJTzsKQEAgLTE2NDYsMTMgKzE2NzQsMTcgQEAKIAkJCX0KIAogCQkJYXRhX2VoX2Fib3V0X3RvX2RvKGFwLCBkZXYsIEFUQV9FSF9SRVZBTElEQVRFKTsKLQkJCXJjID0gYXRhX2Rldl9yZXZhbGlkYXRlKGRldiwKLQkJCQkJZWhjLT5pLmZsYWdzICYgQVRBX0VISV9ESURfUkVTRVQpOworCQkJcmMgPSBhdGFfZGV2X3JldmFsaWRhdGUoZGV2LCByZWFkaWRfZmxhZ3MpOwogCQkJaWYgKHJjKQogCQkJCWJyZWFrOwogCiAJCQlhdGFfZWhfZG9uZShhcCwgZGV2LCBBVEFfRUhfUkVWQUxJREFURSk7CiAKKwkJCS8qIENvbmZpZ3VyYXRpb24gbWF5IGhhdmUgY2hhbmdlZCwgcmVjb25maWd1cmUKKwkJCSAqIHRyYW5zZmVyIG1vZGUuCisJCQkgKi8KKwkJCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1NFVE1PREU7CisKIAkJCS8qIHNjaGVkdWxlIHRoZSBzY3NpX3Jlc2Nhbl9kZXZpY2UoKSBoZXJlICovCiAJCQlxdWV1ZV93b3JrKGF0YV9hdXhfd3EsICYoYXAtPnNjc2lfcmVzY2FuX3Rhc2spKTsKIAkJfSBlbHNlIGlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfVU5LTk9XTiAmJgpAQCAtMTY2MCwxOCArMTY5MiwzNSBAQAogCQkJICAgYXRhX2NsYXNzX2VuYWJsZWQoZWhjLT5jbGFzc2VzW2Rldi0+ZGV2bm9dKSkgewogCQkJZGV2LT5jbGFzcyA9IGVoYy0+Y2xhc3Nlc1tkZXYtPmRldm5vXTsKIAotCQkJcmMgPSBhdGFfZGV2X3JlYWRfaWQoZGV2LCAmZGV2LT5jbGFzcywgMSwgZGV2LT5pZCk7Ci0JCQlpZiAocmMgPT0gMCkKLQkJCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldiwgMSk7CisJCQlyYyA9IGF0YV9kZXZfcmVhZF9pZChkZXYsICZkZXYtPmNsYXNzLCByZWFkaWRfZmxhZ3MsCisJCQkJCSAgICAgZGV2LT5pZCk7CisJCQlpZiAocmMgPT0gMCkgeworCQkJCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1BSSU5USU5GTzsKKwkJCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldik7CisJCQkJZWhjLT5pLmZsYWdzICY9IH5BVEFfRUhJX1BSSU5USU5GTzsKKwkJCX0gZWxzZSBpZiAocmMgPT0gLUVOT0VOVCkgeworCQkJCS8qIElERU5USUZZIHdhcyBpc3N1ZWQgdG8gbm9uLWV4aXN0ZW50CisJCQkJICogZGV2aWNlLiAgTm8gbmVlZCB0byByZXNldC4gIEp1c3QKKwkJCQkgKiB0aGF3IGFuZCBraWxsIHRoZSBkZXZpY2UuCisJCQkJICovCisJCQkJYXRhX2VoX3RoYXdfcG9ydChhcCk7CisJCQkJZGV2LT5jbGFzcyA9IEFUQV9ERVZfVU5LTk9XTjsKKwkJCQlyYyA9IDA7CisJCQl9CiAKIAkJCWlmIChyYykgewogCQkJCWRldi0+Y2xhc3MgPSBBVEFfREVWX1VOS05PV047CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7Ci0JCQlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19TQ1NJX0hPVFBMVUc7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCQkJCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX1NDU0lfSE9UUExVRzsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkJCQkvKiBuZXcgZGV2aWNlIGRpc2NvdmVyZWQsIGNvbmZpZ3VyZSB4ZmVybW9kZSAqLworCQkJCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1NFVE1PREU7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTE5ODcsMTMgKzIwMzYsMTQgQEAKIAlpZiAocmMpCiAJCWdvdG8gZGV2X2ZhaWw7CiAKLQkvKiBjb25maWd1cmUgdHJhbnNmZXIgbW9kZSBpZiB0aGUgcG9ydCBoYXMgYmVlbiByZXNldCAqLwotCWlmIChlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX0RJRF9SRVNFVCkgeworCS8qIGNvbmZpZ3VyZSB0cmFuc2ZlciBtb2RlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX1NFVE1PREUpIHsKIAkJcmMgPSBhdGFfc2V0X21vZGUoYXAsICZkZXYpOwogCQlpZiAocmMpIHsKIAkJCWRvd25feGZlcm1hc2sgPSAxOwogCQkJZ290byBkZXZfZmFpbDsKIAkJfQorCQllaGMtPmkuZmxhZ3MgJj0gfkFUQV9FSElfU0VUTU9ERTsKIAl9CiAKIAkvKiBzdXNwZW5kIGRldmljZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDVjMWZjNDYuLjhlYWFjZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtNjcxLDcgKzY3MSw3IEBACiB9CiAKIC8qCi0gKglhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlIC0gR2VuZXJhdGUgY2hlY2sgY29uZGl0aW9uIHNlbnNlIGJsb2NrLgorICoJYXRhX2dlbl9wYXNzdGhydV9zZW5zZSAtIEdlbmVyYXRlIGNoZWNrIGNvbmRpdGlvbiBzZW5zZSBibG9jay4KICAqCUBxYzogQ29tbWFuZCB0aGF0IGNvbXBsZXRlZC4KICAqCiAgKglUaGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmljIHRvIHRoZSBBVEEgZGVzY3JpcHRvciBmb3JtYXQgc2Vuc2UKQEAgLTY4MSw5ICs2ODEsOSBAQAogICoJYmxvY2suIENsZWFyIHNlbnNlIGtleSwgQVNDICYgQVNDUSBpZiB0aGVyZSBpcyBubyBlcnJvci4KICAqCiAgKglMT0NLSU5HOgotICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdCBsb2NrKQorICoJTm9uZS4KICAqLwotdm9pZCBhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgdm9pZCBhdGFfZ2VuX3Bhc3N0aHJ1X3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CiAJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnJlc3VsdF90ZjsKQEAgLTcxMywxMiArNzEzLDkgQEAKIAogCWRlc2NbMF0gPSAweDA5OwogCi0JLyoKLQkgKiBTZXQgbGVuZ3RoIG9mIGFkZGl0aW9uYWwgc2Vuc2UgZGF0YS4KLQkgKiBTaW5jZSB3ZSBvbmx5IHBvcHVsYXRlIGRlc2NyaXB0b3IgMCwgdGhlIHRvdGFsCi0JICogbGVuZ3RoIGlzIHRoZSBzYW1lIChmaXhlZCkgbGVuZ3RoIGFzIGRlc2NyaXB0b3IgMC4KLQkgKi8KLQlkZXNjWzFdID0gc2JbN10gPSAxNDsKKwkvKiBzZXQgbGVuZ3RoIG9mIGFkZGl0aW9uYWwgc2Vuc2UgZGF0YSAqLworCXNiWzddID0gMTQ7CisJZGVzY1sxXSA9IDEyOwogCiAJLyoKIAkgKiBDb3B5IHJlZ2lzdGVycyBpbnRvIHNlbnNlIGJ1ZmZlci4KQEAgLTc0Niw1NiArNzQzLDU2IEBACiB9CiAKIC8qKgotICoJYXRhX2dlbl9maXhlZF9zZW5zZSAtIGdlbmVyYXRlIGEgU0NTSSBmaXhlZCBzZW5zZSBibG9jaworICoJYXRhX2dlbl9hdGFfc2Vuc2UgLSBnZW5lcmF0ZSBhIFNDU0kgZml4ZWQgc2Vuc2UgYmxvY2sKICAqCUBxYzogQ29tbWFuZCB0aGF0IHdlIGFyZSBlcnJvcmluZyBvdXQKICAqCi0gKglMZXZlcmFnZSBhdGFfdG9fc2Vuc2VfZXJyb3IoKSB0byBnaXZlIHVzIHRoZSBjb2Rlcy4gIEZpdCBvdXIKLSAqCUxCQSBpbiBoZXJlIGlmIHRoZXJlJ3Mgcm9vbS4KKyAqCUdlbmVyYXRlIHNlbnNlIGJsb2NrIGZvciBhIGZhaWxlZCBBVEEgY29tbWFuZCBAcWMuICBEZXNjcmlwdG9yCisgKglmb3JtYXQgaXMgdXNlZCB0byBhY2NvbW9kYXRlIExCQTQ4IGJsb2NrIGFkZHJlc3MuCiAgKgogICoJTE9DS0lORzoKLSAqCWluaGVyaXRlZCBmcm9tIGNhbGxlcgorICoJTm9uZS4KICAqLwotdm9pZCBhdGFfZ2VuX2ZpeGVkX3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgdm9pZCBhdGFfZ2VuX2F0YV9zZW5zZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogeworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHFjLT5zY3NpY21kOwogCXN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmID0gJnFjLT5yZXN1bHRfdGY7CiAJdW5zaWduZWQgY2hhciAqc2IgPSBjbWQtPnNlbnNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICpkZXNjID0gc2IgKyA4OwogCWludCB2ZXJib3NlID0gcWMtPmFwLT5vcHMtPmVycm9yX2hhbmRsZXIgPT0gTlVMTDsKKwl1NjQgYmxvY2s7CiAKIAltZW1zZXQoc2IsIDAsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CiAKIAljbWQtPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpIHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCi0JLyoKLQkgKiBVc2UgYXRhX3RvX3NlbnNlX2Vycm9yKCkgdG8gbWFwIHN0YXR1cyByZWdpc3RlciBiaXRzCisJLyogc2Vuc2UgZGF0YSBpcyBjdXJyZW50IGFuZCBmb3JtYXQgaXMgZGVzY3JpcHRvciAqLworCXNiWzBdID0gMHg3MjsKKworCS8qIFVzZSBhdGFfdG9fc2Vuc2VfZXJyb3IoKSB0byBtYXAgc3RhdHVzIHJlZ2lzdGVyIGJpdHMKIAkgKiBvbnRvIHNlbnNlIGtleSwgYXNjICYgYXNjcS4KIAkgKi8KIAlpZiAocWMtPmVycl9tYXNrIHx8CiAJICAgIHRmLT5jb21tYW5kICYgKEFUQV9CVVNZIHwgQVRBX0RGIHwgQVRBX0VSUiB8IEFUQV9EUlEpKSB7CiAJCWF0YV90b19zZW5zZV9lcnJvcihxYy0+YXAtPmlkLCB0Zi0+Y29tbWFuZCwgdGYtPmZlYXR1cmUsCi0JCQkJICAgJnNiWzJdLCAmc2JbMTJdLCAmc2JbMTNdLCB2ZXJib3NlKTsKLQkJc2JbMl0gJj0gMHgwZjsKKwkJCQkgICAmc2JbMV0sICZzYlsyXSwgJnNiWzNdLCB2ZXJib3NlKTsKKwkJc2JbMV0gJj0gMHgwZjsKIAl9CiAKLQlzYlswXSA9IDB4NzA7Ci0Jc2JbN10gPSAweDBhOworCWJsb2NrID0gYXRhX3RmX3JlYWRfYmxvY2soJnFjLT5yZXN1bHRfdGYsIGRldik7CiAKLQlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSB7Ci0JCS8qIFRPRE86IGZpbmQgc29sdXRpb24gZm9yIExCQTQ4IGRlc2NyaXB0b3JzICovCi0JfQorCS8qIGluZm9ybWF0aW9uIHNlbnNlIGRhdGEgZGVzY3JpcHRvciAqLworCXNiWzddID0gMTI7CisJZGVzY1swXSA9IDB4MDA7CisJZGVzY1sxXSA9IDEwOwogCi0JZWxzZSBpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQSkgewotCQkvKiBBIHNtYWxsICgyOGIpIExCQSB3aWxsIGZpdCBpbiB0aGUgMzJiIGluZm8gZmllbGQgKi8KLQkJc2JbMF0gfD0gMHg4MDsJCS8qIHNldCB2YWxpZCBiaXQgKi8KLQkJc2JbM10gPSB0Zi0+ZGV2aWNlICYgMHgwZjsKLQkJc2JbNF0gPSB0Zi0+bGJhaDsKLQkJc2JbNV0gPSB0Zi0+bGJhbTsKLQkJc2JbNl0gPSB0Zi0+bGJhbDsKLQl9Ci0KLQllbHNlIHsKLQkJLyogVE9ETzogQy9IL1MgKi8KLQl9CisJZGVzY1syXSB8PSAweDgwOwkvKiB2YWxpZCAqLworCWRlc2NbNl0gPSBibG9jayA+PiA0MDsKKwlkZXNjWzddID0gYmxvY2sgPj4gMzI7CisJZGVzY1s4XSA9IGJsb2NrID4+IDI0OworCWRlc2NbOV0gPSBibG9jayA+PiAxNjsKKwlkZXNjWzEwXSA9IGJsb2NrID4+IDg7CisJZGVzY1sxMV0gPSBibG9jazsKIH0KIAogc3RhdGljIHZvaWQgYXRhX3Njc2lfc2Rldl9jb25maWcoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQpAQCAtODA3LDIzICs4MDQsMTAgQEAKIHN0YXRpYyB2b2lkIGF0YV9zY3NpX2Rldl9jb25maWcoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7Ci0JdW5zaWduZWQgaW50IG1heF9zZWN0b3JzOworCS8qIGNvbmZpZ3VyZSBtYXggc2VjdG9ycyAqLworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBkZXYtPm1heF9zZWN0b3JzKTsKIAotCS8qIFRPRE86IDIwNDggaXMgYW4gYXJiaXRyYXJ5IG51bWJlciwgbm90IHRoZQotCSAqIGhhcmR3YXJlIG1heGltdW0uICBUaGlzIHNob3VsZCBiZSBpbmNyZWFzZWQgdG8KLQkgKiA2NTUzNCB3aGVuIEplbnMgQXhib2UncyBwYXRjaCBmb3IgZHluYW1pY2FsbHkKLQkgKiBkZXRlcm1pbmluZyBtYXhfc2VjdG9ycyBpcyBtZXJnZWQuCi0JICovCi0JbWF4X3NlY3RvcnMgPSBBVEFfTUFYX1NFQ1RPUlM7Ci0JaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpCi0JCW1heF9zZWN0b3JzID0gQVRBX01BWF9TRUNUT1JTX0xCQTQ4OwotCWlmIChkZXYtPm1heF9zZWN0b3JzKQotCQltYXhfc2VjdG9ycyA9IGRldi0+bWF4X3NlY3RvcnM7Ci0KLQlibGtfcXVldWVfbWF4X3NlY3RvcnMoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgbWF4X3NlY3RvcnMpOwotCi0JLyoKLQkgKiBTQVRBIERNQSB0cmFuc2ZlcnMgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNCBieXRlLCBzbworCS8qIFNBVEEgRE1BIHRyYW5zZmVycyBtdXN0IGJlIG11bHRpcGxlcyBvZiA0IGJ5dGUsIHNvCiAJICogd2UgbmVlZCB0byBwYWQgQVRBUEkgdHJhbnNmZXJzIHVzaW5nIGFuIGV4dHJhIHNnLgogCSAqIERlY3JlbWVudCBtYXggaHcgc2VnbWVudHMgYWNjb3JkaW5nbHkuCiAJICovCkBAIC0xMDQwLDggKzEwMjQsNyBAQAogCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfREVWSUNFOwogCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKIAotCWlmICgocWMtPmRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpICYmCi0JICAgIChhdGFfaWRfaGFzX2ZsdXNoX2V4dChxYy0+ZGV2LT5pZCkpKQorCWlmIChxYy0+ZGV2LT5mbGFncyAmIEFUQV9ERkxBR19GTFVTSF9FWFQpCiAJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9GTFVTSF9FWFQ7CiAJZWxzZQogCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRkxVU0g7CkBAIC0xMjgyLDE3ICsxMjY1LDE0IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3Njc2lfcndfeGxhdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCBjb25zdCB1OCAqc2NzaWNtZCkKIHsKLQlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiA9ICZxYy0+dGY7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IHFjLT5kZXY7CisJdW5zaWduZWQgaW50IHRmX2ZsYWdzID0gMDsKIAl1NjQgYmxvY2s7CiAJdTMyIG5fYmxvY2s7Ci0KLQlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19JTzsKLQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJaW50IHJjOwogCiAJaWYgKHNjc2ljbWRbMF0gPT0gV1JJVEVfMTAgfHwgc2NzaWNtZFswXSA9PSBXUklURV82IHx8CiAJICAgIHNjc2ljbWRbMF0gPT0gV1JJVEVfMTYpCi0JCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfV1JJVEU7CisJCXRmX2ZsYWdzIHw9IEFUQV9URkxBR19XUklURTsKIAogCS8qIENhbGN1bGF0ZSB0aGUgU0NTSSBMQkEsIHRyYW5zZmVyIGxlbmd0aCBhbmQgRlVBLiAqLwogCXN3aXRjaCAoc2NzaWNtZFswXSkgewpAQCAtMTMwMCw3ICsxMjgwLDcgQEAKIAljYXNlIFdSSVRFXzEwOgogCQlzY3NpXzEwX2xiYV9sZW4oc2NzaWNtZCwgJmJsb2NrLCAmbl9ibG9jayk7CiAJCWlmICh1bmxpa2VseShzY3NpY21kWzFdICYgKDEgPDwgMykpKQotCQkJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19GVUE7CisJCQl0Zl9mbGFncyB8PSBBVEFfVEZMQUdfRlVBOwogCQlicmVhazsKIAljYXNlIFJFQURfNjoKIAljYXNlIFdSSVRFXzY6CkBAIC0xMzE2LDcgKzEyOTYsNyBAQAogCWNhc2UgV1JJVEVfMTY6CiAJCXNjc2lfMTZfbGJhX2xlbihzY3NpY21kLCAmYmxvY2ssICZuX2Jsb2NrKTsKIAkJaWYgKHVubGlrZWx5KHNjc2ljbWRbMV0gJiAoMSA8PCAzKSkpCi0JCQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0ZVQTsKKwkJCXRmX2ZsYWdzIHw9IEFUQV9URkxBR19GVUE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURQUklOVEsoIm5vLWJ5dGUgY29tbWFuZFxuIik7CkBAIC0xMzM0LDEwNiArMTMxNCwxNyBAQAogCQkgKi8KIAkJZ290byBub3RoaW5nX3RvX2RvOwogCi0JaWYgKChkZXYtPmZsYWdzICYgKEFUQV9ERkxBR19QSU8gfCBBVEFfREZMQUdfTkNRX09GRiB8Ci0JCQkgICBBVEFfREZMQUdfTkNRKSkgPT0gQVRBX0RGTEFHX05DUSkgewotCQkvKiB5YXksIE5DUSAqLwotCQlpZiAoIWxiYV80OF9vayhibG9jaywgbl9ibG9jaykpCi0JCQlnb3RvIG91dF9vZl9yYW5nZTsKKwlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19JTzsKKwlxYy0+bnNlY3QgPSBuX2Jsb2NrOwogCi0JCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05DUTsKLQkJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19MQkEgfCBBVEFfVEZMQUdfTEJBNDg7CisJcmMgPSBhdGFfYnVpbGRfcndfdGYoJnFjLT50ZiwgcWMtPmRldiwgYmxvY2ssIG5fYmxvY2ssIHRmX2ZsYWdzLAorCQkJICAgICBxYy0+dGFnKTsKKwlpZiAobGlrZWx5KHJjID09IDApKQorCQlyZXR1cm4gMDsKIAotCQlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKQotCQkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0ZQRE1BX1dSSVRFOwotCQllbHNlCi0JCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRlBETUFfUkVBRDsKLQotCQlxYy0+bnNlY3QgPSBuX2Jsb2NrOwotCi0JCXRmLT5uc2VjdCA9IHFjLT50YWcgPDwgMzsKLQkJdGYtPmhvYl9mZWF0dXJlID0gKG5fYmxvY2sgPj4gOCkgJiAweGZmOwotCQl0Zi0+ZmVhdHVyZSA9IG5fYmxvY2sgJiAweGZmOwotCi0JCXRmLT5ob2JfbGJhaCA9IChibG9jayA+PiA0MCkgJiAweGZmOwotCQl0Zi0+aG9iX2xiYW0gPSAoYmxvY2sgPj4gMzIpICYgMHhmZjsKLQkJdGYtPmhvYl9sYmFsID0gKGJsb2NrID4+IDI0KSAmIDB4ZmY7Ci0JCXRmLT5sYmFoID0gKGJsb2NrID4+IDE2KSAmIDB4ZmY7Ci0JCXRmLT5sYmFtID0gKGJsb2NrID4+IDgpICYgMHhmZjsKLQkJdGYtPmxiYWwgPSBibG9jayAmIDB4ZmY7Ci0KLQkJdGYtPmRldmljZSA9IDEgPDwgNjsKLQkJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19GVUEpCi0JCQl0Zi0+ZGV2aWNlIHw9IDEgPDwgNzsKLQl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBKSB7Ci0JCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfTEJBOwotCi0JCWlmIChsYmFfMjhfb2soYmxvY2ssIG5fYmxvY2spKSB7Ci0JCQkvKiB1c2UgTEJBMjggKi8KLQkJCXRmLT5kZXZpY2UgfD0gKGJsb2NrID4+IDI0KSAmIDB4ZjsKLQkJfSBlbHNlIGlmIChsYmFfNDhfb2soYmxvY2ssIG5fYmxvY2spKSB7Ci0JCQlpZiAoIShkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4KSkKLQkJCQlnb3RvIG91dF9vZl9yYW5nZTsKLQotCQkJLyogdXNlIExCQTQ4ICovCi0JCQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0xCQTQ4OwotCi0JCQl0Zi0+aG9iX25zZWN0ID0gKG5fYmxvY2sgPj4gOCkgJiAweGZmOwotCi0JCQl0Zi0+aG9iX2xiYWggPSAoYmxvY2sgPj4gNDApICYgMHhmZjsKLQkJCXRmLT5ob2JfbGJhbSA9IChibG9jayA+PiAzMikgJiAweGZmOwotCQkJdGYtPmhvYl9sYmFsID0gKGJsb2NrID4+IDI0KSAmIDB4ZmY7Ci0JCX0gZWxzZQotCQkJLyogcmVxdWVzdCB0b28gbGFyZ2UgZXZlbiBmb3IgTEJBNDggKi8KLQkJCWdvdG8gb3V0X29mX3JhbmdlOwotCi0JCWlmICh1bmxpa2VseShhdGFfcndjbWRfcHJvdG9jb2wocWMpIDwgMCkpCi0JCQlnb3RvIGludmFsaWRfZmxkOwotCi0JCXFjLT5uc2VjdCA9IG5fYmxvY2s7Ci0JCXRmLT5uc2VjdCA9IG5fYmxvY2sgJiAweGZmOwotCi0JCXRmLT5sYmFoID0gKGJsb2NrID4+IDE2KSAmIDB4ZmY7Ci0JCXRmLT5sYmFtID0gKGJsb2NrID4+IDgpICYgMHhmZjsKLQkJdGYtPmxiYWwgPSBibG9jayAmIDB4ZmY7Ci0KLQkJdGYtPmRldmljZSB8PSBBVEFfTEJBOwotCX0gZWxzZSB7Ci0JCS8qIENIUyAqLwotCQl1MzIgc2VjdCwgaGVhZCwgY3lsLCB0cmFjazsKLQotCQkvKiBUaGUgcmVxdWVzdCAtbWF5LSBiZSB0b28gbGFyZ2UgZm9yIENIUyBhZGRyZXNzaW5nLiAqLwotCQlpZiAoIWxiYV8yOF9vayhibG9jaywgbl9ibG9jaykpCi0JCQlnb3RvIG91dF9vZl9yYW5nZTsKLQotCQlpZiAodW5saWtlbHkoYXRhX3J3Y21kX3Byb3RvY29sKHFjKSA8IDApKQotCQkJZ290byBpbnZhbGlkX2ZsZDsKLQotCQkvKiBDb252ZXJ0IExCQSB0byBDSFMgKi8KLQkJdHJhY2sgPSAodTMyKWJsb2NrIC8gZGV2LT5zZWN0b3JzOwotCQljeWwgICA9IHRyYWNrIC8gZGV2LT5oZWFkczsKLQkJaGVhZCAgPSB0cmFjayAlIGRldi0+aGVhZHM7Ci0JCXNlY3QgID0gKHUzMilibG9jayAlIGRldi0+c2VjdG9ycyArIDE7Ci0KLQkJRFBSSU5USygiYmxvY2sgJXUgdHJhY2sgJXUgY3lsICV1IGhlYWQgJXUgc2VjdCAldVxuIiwKLQkJCSh1MzIpYmxvY2ssIHRyYWNrLCBjeWwsIGhlYWQsIHNlY3QpOwotCi0JCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbnZlcnRlZCBDSFMgY2FuIGZpdC4KLQkJICAgQ3lsaW5kZXI6IDAtNjU1MzUKLQkJICAgSGVhZDogMC0xNQotCQkgICBTZWN0b3I6IDEtMjU1Ki8KLQkJaWYgKChjeWwgPj4gMTYpIHx8IChoZWFkID4+IDQpIHx8IChzZWN0ID4+IDgpIHx8ICghc2VjdCkpCi0JCQlnb3RvIG91dF9vZl9yYW5nZTsKLQotCQlxYy0+bnNlY3QgPSBuX2Jsb2NrOwotCQl0Zi0+bnNlY3QgPSBuX2Jsb2NrICYgMHhmZjsgLyogU2VjdG9yIGNvdW50IDAgbWVhbnMgMjU2IHNlY3RvcnMgKi8KLQkJdGYtPmxiYWwgPSBzZWN0OwotCQl0Zi0+bGJhbSA9IGN5bDsKLQkJdGYtPmxiYWggPSBjeWwgPj4gODsKLQkJdGYtPmRldmljZSB8PSBoZWFkOwotCX0KLQotCXJldHVybiAwOwotCisJaWYgKHJjID09IC1FUkFOR0UpCisJCWdvdG8gb3V0X29mX3JhbmdlOworCS8qIHRyZWF0IGFsbCBvdGhlciBlcnJvcnMgYXMgLUVJTlZBTCwgZmFsbCB0aHJvdWdoICovCiBpbnZhbGlkX2ZsZDoKIAlhdGFfc2NzaV9zZXRfc2Vuc2UocWMtPnNjc2ljbWQsIElMTEVHQUxfUkVRVUVTVCwgMHgyNCwgMHgwKTsKIAkvKiAiSW52YWxpZCBmaWVsZCBpbiBjYmQiICovCkBAIC0xNDUxLDYgKzEzNDIsNyBAQAogCiBzdGF0aWMgdm9pZCBhdGFfc2NzaV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CiAJdTggKmNkYiA9IGNtZC0+Y21uZDsKICAJaW50IG5lZWRfc2Vuc2UgPSAocWMtPmVycl9tYXNrICE9IDApOwpAQCAtMTQ1OSwxMSArMTM1MSwxMiBAQAogCSAqIHNjaGVkdWxlIEVIX1JFVkFMSURBVEUgb3BlcmF0aW9uIHRvIHVwZGF0ZSB0aGUgSURFTlRJRlkgREVWSUNFCiAJICogY2FjaGUKIAkgKi8KLQlpZiAoIW5lZWRfc2Vuc2UgJiYgKHFjLT50Zi5jb21tYW5kID09IEFUQV9DTURfU0VUX0ZFQVRVUkVTKSAmJgorCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyICYmCisJICAgICFuZWVkX3NlbnNlICYmIChxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUykgJiYKIAkgICAgKChxYy0+dGYuZmVhdHVyZSA9PSBTRVRGRUFUVVJFU19XQ19PTikgfHwKIAkgICAgIChxYy0+dGYuZmVhdHVyZSA9PSBTRVRGRUFUVVJFU19XQ19PRkYpKSkgewotCQlxYy0+YXAtPmVoX2luZm8uYWN0aW9uIHw9IEFUQV9FSF9SRVZBTElEQVRFOwotCQlhdGFfcG9ydF9zY2hlZHVsZV9laChxYy0+YXApOworCQlhcC0+ZWhfaW5mby5hY3Rpb24gfD0gQVRBX0VIX1JFVkFMSURBVEU7CisJCWF0YV9wb3J0X3NjaGVkdWxlX2VoKGFwKTsKIAl9CiAKIAkvKiBGb3IgQVRBIHBhc3MgdGhydSAoU0FUKSBjb21tYW5kcywgZ2VuZXJhdGUgYSBzZW5zZSBibG9jayBpZgpAQCAtMTQ3NSw3ICsxMzY4LDcgQEAKIAkgKi8KIAlpZiAoKChjZGJbMF0gPT0gQVRBXzE2KSB8fCAoY2RiWzBdID09IEFUQV8xMikpICYmCiAgCSAgICAoKGNkYlsyXSAmIDB4MjApIHx8IG5lZWRfc2Vuc2UpKSB7Ci0gCQlhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlKHFjKTsKKwkJYXRhX2dlbl9wYXNzdGhydV9zZW5zZShxYyk7CiAJfSBlbHNlIHsKIAkJaWYgKCFuZWVkX3NlbnNlKSB7CiAJCQljbWQtPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CkBAIC0xNDg2LDEyICsxMzc5LDEyIEBACiAJCQkgKiBnb29kIGZvciBzbWFsbGVyIExCQSAoYW5kIG1heWJlIENIUz8pCiAJCQkgKiBkZXZpY2VzLgogCQkJICovCi0JCQlhdGFfZ2VuX2ZpeGVkX3NlbnNlKHFjKTsKKwkJCWF0YV9nZW5fYXRhX3NlbnNlKHFjKTsKIAkJfQogCX0KIAotCWlmIChuZWVkX3NlbnNlICYmICFxYy0+YXAtPm9wcy0+ZXJyb3JfaGFuZGxlcikKLQkJYXRhX2R1bXBfc3RhdHVzKHFjLT5hcC0+aWQsICZxYy0+cmVzdWx0X3RmKTsKKwlpZiAobmVlZF9zZW5zZSAmJiAhYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcikKKwkJYXRhX2R1bXBfc3RhdHVzKGFwLT5pZCwgJnFjLT5yZXN1bHRfdGYpOwogCiAJcWMtPnNjc2lkb25lKGNtZCk7CiAKQEAgLTE3MTMsNiArMTYwNiwyMiBAQAogfQogCiAvKioKKyAqCUFUQV9TQ1NJX1JCVUZfU0VUIC0gaGVscGVyIHRvIHNldCB2YWx1ZXMgaW4gU0NTSSByZXNwb25zZSBidWZmZXIKKyAqCUBpZHg6IGJ5dGUgaW5kZXggaW50byBTQ1NJIHJlc3BvbnNlIGJ1ZmZlcgorICoJQHZhbDogdmFsdWUgdG8gc2V0CisgKgorICoJVG8gYmUgdXNlZCBieSBTQ1NJIGNvbW1hbmQgc2ltdWxhdG9yIGZ1bmN0aW9ucy4gIFRoaXMgbWFjcm9zCisgKglleHBlY3RzIHR3byBsb2NhbCB2YXJpYWJsZXMsIHU4ICpyYnVmIGFuZCB1bnNpZ25lZCBpbnQgYnVmbGVuLAorICoJYXJlIGluIHNjb3BlLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCisjZGVmaW5lIEFUQV9TQ1NJX1JCVUZfU0VUKGlkeCwgdmFsKSBkbyB7IFwKKwkJaWYgKChpZHgpIDwgYnVmbGVuKSByYnVmWyhpZHgpXSA9ICh1OCkodmFsKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKgogICoJYXRhX3Njc2lvcF9pbnFfc3RkIC0gU2ltdWxhdGUgSU5RVUlSWSBjb21tYW5kCiAgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCiAgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCkBAIC0yMTcxLDY3ICsyMDgwLDQyIEBACiAgKglTaW11bGF0ZSBSRUFEIENBUEFDSVRZIGNvbW1hbmRzLgogICoKICAqCUxPQ0tJTkc6Ci0gKglzcGluX2xvY2tfaXJxc2F2ZShob3N0IGxvY2spCisgKglOb25lLgogICovCi0KIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX3JlYWRfY2FwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKIAkJCSAgICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbikKIHsKLQl1NjQgbl9zZWN0b3JzOwotCXUzMiB0bXA7CisJdTY0IGxhc3RfbGJhID0gYXJncy0+ZGV2LT5uX3NlY3RvcnMgLSAxOyAvKiBMQkEgb2YgdGhlIGxhc3QgYmxvY2sgKi8KIAogCVZQUklOVEsoIkVOVEVSXG4iKTsKIAotCWlmIChhdGFfaWRfaGFzX2xiYShhcmdzLT5pZCkpIHsKLQkJaWYgKGF0YV9pZF9oYXNfbGJhNDgoYXJncy0+aWQpKQotCQkJbl9zZWN0b3JzID0gYXRhX2lkX3U2NChhcmdzLT5pZCwgMTAwKTsKLQkJZWxzZQotCQkJbl9zZWN0b3JzID0gYXRhX2lkX3UzMihhcmdzLT5pZCwgNjApOwotCX0gZWxzZSB7Ci0JCS8qIENIUyBkZWZhdWx0IHRyYW5zbGF0aW9uICovCi0JCW5fc2VjdG9ycyA9IGFyZ3MtPmlkWzFdICogYXJncy0+aWRbM10gKiBhcmdzLT5pZFs2XTsKLQotCQlpZiAoYXRhX2lkX2N1cnJlbnRfY2hzX3ZhbGlkKGFyZ3MtPmlkKSkKLQkJCS8qIENIUyBjdXJyZW50IHRyYW5zbGF0aW9uICovCi0JCQluX3NlY3RvcnMgPSBhdGFfaWRfdTMyKGFyZ3MtPmlkLCA1Nyk7Ci0JfQotCi0Jbl9zZWN0b3JzLS07CQkvKiBBVEEgVG90YWxVc2VyU2VjdG9ycyAtIDEgKi8KLQogCWlmIChhcmdzLT5jbWQtPmNtbmRbMF0gPT0gUkVBRF9DQVBBQ0lUWSkgewotCQlpZiggbl9zZWN0b3JzID49IDB4ZmZmZmZmZmZVTEwgKQotCQkJdG1wID0gMHhmZmZmZmZmZiA7ICAvKiBSZXR1cm4gbWF4IGNvdW50IG9uIG92ZXJmbG93ICovCi0JCWVsc2UKLQkJCXRtcCA9IG5fc2VjdG9ycyA7CisJCWlmIChsYXN0X2xiYSA+PSAweGZmZmZmZmZmVUxMKQorCQkJbGFzdF9sYmEgPSAweGZmZmZmZmZmOwogCiAJCS8qIHNlY3RvciBjb3VudCwgMzItYml0ICovCi0JCXJidWZbMF0gPSB0bXAgPj4gKDggKiAzKTsKLQkJcmJ1ZlsxXSA9IHRtcCA+PiAoOCAqIDIpOwotCQlyYnVmWzJdID0gdG1wID4+ICg4ICogMSk7Ci0JCXJidWZbM10gPSB0bXA7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDAsIGxhc3RfbGJhID4+ICg4ICogMykpOworCQlBVEFfU0NTSV9SQlVGX1NFVCgxLCBsYXN0X2xiYSA+PiAoOCAqIDIpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMiwgbGFzdF9sYmEgPj4gKDggKiAxKSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDMsIGxhc3RfbGJhKTsKIAogCQkvKiBzZWN0b3Igc2l6ZSAqLwotCQl0bXAgPSBBVEFfU0VDVF9TSVpFOwotCQlyYnVmWzZdID0gdG1wID4+IDg7Ci0JCXJidWZbN10gPSB0bXA7Ci0KKwkJQVRBX1NDU0lfUkJVRl9TRVQoNiwgQVRBX1NFQ1RfU0laRSA+PiA4KTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoNywgQVRBX1NFQ1RfU0laRSk7CiAJfSBlbHNlIHsKIAkJLyogc2VjdG9yIGNvdW50LCA2NC1iaXQgKi8KLQkJdG1wID0gbl9zZWN0b3JzID4+ICg4ICogNCk7Ci0JCXJidWZbMl0gPSB0bXAgPj4gKDggKiAzKTsKLQkJcmJ1ZlszXSA9IHRtcCA+PiAoOCAqIDIpOwotCQlyYnVmWzRdID0gdG1wID4+ICg4ICogMSk7Ci0JCXJidWZbNV0gPSB0bXA7Ci0JCXRtcCA9IG5fc2VjdG9yczsKLQkJcmJ1Zls2XSA9IHRtcCA+PiAoOCAqIDMpOwotCQlyYnVmWzddID0gdG1wID4+ICg4ICogMik7Ci0JCXJidWZbOF0gPSB0bXAgPj4gKDggKiAxKTsKLQkJcmJ1Zls5XSA9IHRtcDsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMCwgbGFzdF9sYmEgPj4gKDggKiA3KSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDEsIGxhc3RfbGJhID4+ICg4ICogNikpOworCQlBVEFfU0NTSV9SQlVGX1NFVCgyLCBsYXN0X2xiYSA+PiAoOCAqIDUpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMywgbGFzdF9sYmEgPj4gKDggKiA0KSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDQsIGxhc3RfbGJhID4+ICg4ICogMykpOworCQlBVEFfU0NTSV9SQlVGX1NFVCg1LCBsYXN0X2xiYSA+PiAoOCAqIDIpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoNiwgbGFzdF9sYmEgPj4gKDggKiAxKSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDcsIGxhc3RfbGJhKTsKIAogCQkvKiBzZWN0b3Igc2l6ZSAqLwotCQl0bXAgPSBBVEFfU0VDVF9TSVpFOwotCQlyYnVmWzEyXSA9IHRtcCA+PiA4OwotCQlyYnVmWzEzXSA9IHRtcDsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMTAsIEFUQV9TRUNUX1NJWkUgPj4gOCk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDExLCBBVEFfU0VDVF9TSVpFKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIzMTcsNyArMjIwMSw3IEBACiAJCSAqIGEgc2Vuc2UgZGVzY3JpcHRvcnMsIHNpbmNlIHRoYXQncyBvbmx5CiAJCSAqIGNvcnJlY3QgZm9yIEFUQSwgbm90IEFUQVBJCiAJCSAqLwotCQlhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlKHFjKTsKKwkJYXRhX2dlbl9wYXNzdGhydV9zZW5zZShxYyk7CiAJfQogCiAJcWMtPnNjc2lkb25lKHFjLT5zY3NpY21kKTsKQEAgLTIzOTIsNyArMjI3Niw3IEBACiAJCQkgKiBzZW5zZSBkZXNjcmlwdG9ycywgc2luY2UgdGhhdCdzIG9ubHkKIAkJCSAqIGNvcnJlY3QgZm9yIEFUQSwgbm90IEFUQVBJCiAJCQkgKi8KLQkJCWF0YV9nZW5fYXRhX2Rlc2Nfc2Vuc2UocWMpOworCQkJYXRhX2dlbl9wYXNzdGhydV9zZW5zZShxYyk7CiAJCX0KIAogCQkvKiBTQ1NJIEVIIGF1dG9tYXRpY2FsbHkgbG9ja3MgZG9vciBpZiBzZGV2LT5sb2NrZWQgaXMKQEAgLTI0MjUsNyArMjMwOSw3IEBACiAJCSAqIGEgc2Vuc2UgZGVzY3JpcHRvcnMsIHNpbmNlIHRoYXQncyBvbmx5CiAJCSAqIGNvcnJlY3QgZm9yIEFUQSwgbm90IEFUQVBJCiAJCSAqLwotCQlhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlKHFjKTsKKwkJYXRhX2dlbl9wYXNzdGhydV9zZW5zZShxYyk7CiAJfSBlbHNlIHsKIAkJdTggKnNjc2ljbWQgPSBjbWQtPmNtbmQ7CiAKQEAgLTMxODAsMTAgKzMwNjQsMTIgQEAKIAkJCXJjID0gLUVJTlZBTDsKIAl9CiAKLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCkgewogCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKwkJYXRhX3BvcnRfd2FpdF9laChhcCk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTMyMDMsMTUgKzMwODksMjcgQEAKIHZvaWQgYXRhX3Njc2lfZGV2X3Jlc2Nhbih2b2lkICpkYXRhKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkYXRhOwotCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewotCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKKwlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwogCi0JCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSAmJiBkZXYtPnNkZXYpCi0JCQlzY3NpX3Jlc2Nhbl9kZXZpY2UoJihkZXYtPnNkZXYtPnNkZXZfZ2VuZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gZGV2LT5zZGV2OworCisJCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgfHwgIXNkZXYpCisJCQljb250aW51ZTsKKwkJaWYgKHNjc2lfZGV2aWNlX2dldChzZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKwkJc2NzaV9yZXNjYW5fZGV2aWNlKCYoc2Rldi0+c2Rldl9nZW5kZXYpKTsKKwkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwogCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoqCkBAIC0zMzQ1LDIwICszMjQzLDIzIEBACiAgKglAYXA6CUFUQSBwb3J0IHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGJlaW5nIHNlbnQKICAqCiAgKglSRVRVUk5TOgotICoJWmVyby4KKyAqCVJldHVybiB2YWx1ZSBmcm9tIF9fYXRhX3Njc2lfcXVldWVjbWQoKSBpZiBAY21kIGNhbiBiZSBxdWV1ZWQsCisgKgkwIG90aGVyd2lzZS4KICAqLwogCiBpbnQgYXRhX3Nhc19xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAogCQkgICAgIHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJaW50IHJjID0gMDsKKwogCWF0YV9zY3NpX2R1bXBfY2RiKGFwLCBjbWQpOwogCiAJaWYgKGxpa2VseShhdGFfc2NzaV9kZXZfZW5hYmxlZChhcC0+ZGV2aWNlKSkpCi0JCV9fYXRhX3Njc2lfcXVldWVjbWQoY21kLCBkb25lLCBhcC0+ZGV2aWNlKTsKKwkJcmMgPSBfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgZG9uZSwgYXAtPmRldmljZSk7CiAJZWxzZSB7CiAJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKIAkJZG9uZShjbWQpOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2FzX3F1ZXVlY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwppbmRleCA3NjQ1ZjJiLi4xMGVlMjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCkBAIC0zOSw2ICszOSwzNSBAQAogI2luY2x1ZGUgImxpYmF0YS5oIgogCiAvKioKKyAqCWF0YV9pcnFfb24gLSBFbmFibGUgaW50ZXJydXB0cyBvbiBhIHBvcnQuCisgKglAYXA6IFBvcnQgb24gd2hpY2ggaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKyAqCisgKglFbmFibGUgaW50ZXJydXB0cyBvbiBhIGxlZ2FjeSBJREUgZGV2aWNlIHVzaW5nIE1NSU8gb3IgUElPLAorICoJd2FpdCBmb3IgaWRsZSwgY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCit1OCBhdGFfaXJxX29uKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1OCB0bXA7CisKKwlhcC0+Y3RsICY9IH5BVEFfTklFTjsKKwlhcC0+bGFzdF9jdGwgPSBhcC0+Y3RsOworCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCXdyaXRlYihhcC0+Y3RsLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+Y3RsX2FkZHIpOworCWVsc2UKKwkJb3V0YihhcC0+Y3RsLCBpb2FkZHItPmN0bF9hZGRyKTsKKwl0bXAgPSBhdGFfd2FpdF9pZGxlKGFwKTsKKworCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7CisKKwlyZXR1cm4gdG1wOworfQorCisvKioKICAqCWF0YV90Zl9sb2FkX3BpbyAtIHNlbmQgdGFza2ZpbGUgcmVnaXN0ZXJzIHRvIGhvc3QgY29udHJvbGxlcgogICoJQGFwOiBQb3J0IHRvIHdoaWNoIG91dHB1dCBpcyBzZW50CiAgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKQEAgLTY3MSw2ICs3MDAsMTQgQEAKIAkJd3JpdGViKGFwLT5jdGwsICh2b2lkIF9faW9tZW0gKilpb2FkZHItPmN0bF9hZGRyKTsKIAllbHNlCiAJCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisKKwkvKiBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHNvbWUgY29udHJvbGxlcnMgcmFpc2UgSVJRIG9uCisJICogQVRBX05JRU4gbWFuaXB1bGF0aW9uLiAgQWxzbywgbWFueSBjb250cm9sbGVycyBmYWlsIHRvIG1hc2sKKwkgKiBwcmV2aW91c2x5IHBlbmRpbmcgSVJRIG9uIEFUQV9OSUVOIGFzc2VydGlvbi4gIENsZWFyIGl0LgorCSAqLworCWF0YV9jaGtfc3RhdHVzKGFwKTsKKworCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7CiB9CiAKIC8qKgpAQCAtNzE0LDcgKzc1MSw2IEBACiAJCQlhdGFfcmVzZXRfZm5fdCBzb2Z0cmVzZXQsIGF0YV9yZXNldF9mbl90IGhhcmRyZXNldCwKIAkJCWF0YV9wb3N0cmVzZXRfZm5fdCBwb3N0cmVzZXQpCiB7Ci0Jc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmYXAtPmVoX2NvbnRleHQ7CiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0aGF3ID0gMDsKQEAgLTczMiw5ICs3NjgsNyBAQAogCQkgICBxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfQVRBUElfRE1BKSkgewogCQl1OCBob3N0X3N0YXQ7CiAKLQkJaG9zdF9zdGF0ID0gYXRhX2JtZG1hX3N0YXR1cyhhcCk7Ci0KLQkJYXRhX2VoaV9wdXNoX2Rlc2MoJmVoYy0+aSwgIkJNRE1BIHN0YXQgMHgleCIsIGhvc3Rfc3RhdCk7CisJCWhvc3Rfc3RhdCA9IGFwLT5vcHMtPmJtZG1hX3N0YXR1cyhhcCk7CiAKIAkJLyogQk1ETUEgY29udHJvbGxlcnMgaW5kaWNhdGUgaG9zdCBidXMgZXJyb3IgYnkKIAkJICogc2V0dGluZyBETUFfRVJSIGJpdCBhbmQgdGltaW5nIG91dC4gIEFzIGl0IHdhc24ndApAQCAtODc3LDYgKzkxMSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKKwlwcm9iZV9lbnQtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwogCiAJaWYgKHBvcnRfbWFzayAmIEFUQV9QT1JUX1BSSU1BUlkpIHsKIAkJcHJvYmVfZW50LT5pcnEgPSBBVEFfUFJJTUFSWV9JUlE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEuaCBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCmluZGV4IDBlZDI2M2IuLjEwN2IyYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCkBAIC0zOSwyNiArMzksMzkgQEAKIH07CiAKIC8qIGxpYmF0YS1jb3JlLmMgKi8KK2VudW0geworCS8qIGZsYWdzIGZvciBhdGFfZGV2X3JlYWRfaWQoKSAqLworCUFUQV9SRUFESURfUE9TVFJFU0VUCT0gKDEgPDwgMCksIC8qIHJlYWRpbmcgSUQgYWZ0ZXIgcmVzZXQgKi8KK307CisKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXRhX2F1eF93cTsKIGV4dGVybiBpbnQgYXRhcGlfZW5hYmxlZDsKIGV4dGVybiBpbnQgYXRhcGlfZG1hZGlyOwogZXh0ZXJuIGludCBsaWJhdGFfZnVhOwogZXh0ZXJuIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3FjX25ld19pbml0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCBhdGFfcndjbWRfcHJvdG9jb2woc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitleHRlcm4gaW50IGF0YV9idWlsZF9yd190ZihzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCSAgIHU2NCBibG9jaywgdTMyIG5fYmxvY2ssIHVuc2lnbmVkIGludCB0Zl9mbGFncywKKwkJCSAgIHVuc2lnbmVkIGludCB0YWcpOworZXh0ZXJuIHU2NCBhdGFfdGZfcmVhZF9ibG9jayhzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhdGFfZGV2X2Rpc2FibGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9mbHVzaF90YXNrKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIHVuc2lnbmVkIGF0YV9leGVjX2ludGVybmFsKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgY29uc3QgdTggKmNkYiwKIAkJCQkgIGludCBkbWFfZGlyLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIHVuc2lnbmVkIGF0YV9leGVjX2ludGVybmFsX3NnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgY29uc3QgdTggKmNkYiwKKwkJCQkgICAgIGludCBkbWFfZGlyLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG5fZWxlbSk7CiBleHRlcm4gdW5zaWduZWQgaW50IGF0YV9kb19zaW1wbGVfY21kKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU4IGNtZCk7CiBleHRlcm4gaW50IGF0YV9kZXZfcmVhZF9pZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnBfY2xhc3MsCi0JCQkgICBpbnQgcG9zdF9yZXNldCwgdTE2ICppZCk7Ci1leHRlcm4gaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcG9zdF9yZXNldCk7Ci1leHRlcm4gaW50IGF0YV9kZXZfY29uZmlndXJlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBwcmludF9pbmZvKTsKKwkJCSAgIHVuc2lnbmVkIGludCBmbGFncywgdTE2ICppZCk7CitleHRlcm4gaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBhdGFfZGV2X2NvbmZpZ3VyZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgc2F0YV9kb3duX3NwZF9saW1pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgc2F0YV9zZXRfc3BkX25lZWRlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX2Rvd25feGZlcm1hc2tfbGltaXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgaW50IGZvcmNlX3BpbzApOwogZXh0ZXJuIGludCBhdGFfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpOworZXh0ZXJuIHZvaWQgYXRhX3NnX2NsZWFuKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIHZvaWQgYXRhX3FjX2ZyZWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gdm9pZCBhdGFfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gdm9pZCBfX2F0YV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKQEAgLTEyMCw0ICsxMzMsNyBAQAogZXh0ZXJuIHZvaWQgYXRhX3BvcnRfd2FpdF9laChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiB2b2lkIGF0YV9xY19zY2hlZHVsZV9laChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIAorLyogbGliYXRhLXNmZi5jICovCitleHRlcm4gdTggYXRhX2lycV9vbihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKKwogI2VuZGlmIC8qIF9fTElCQVRBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKaW5kZXggMWQ2OTVkZi4uYzVkNjFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfYWxpIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC42LjYiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjcuMiIKIAogLyoKICAqCUNhYmxlIHNwZWNpYWwgY2FzZXMKQEAgLTc4LDcgKzc4LDcgQEAKIAkgICBpbXBsZW1lbnQgdGhlIGRldGVjdCBsb2dpYyAqLwogCiAJaWYgKGFsaV9jYWJsZV9vdmVycmlkZShwZGV2KSkKLQkJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDBfU0hPUlQ7CiAKIAkvKiBIb3N0IHZpZXcgY2FibGUgZGV0ZWN0IDB4NEEgYml0IDAgcHJpbWFyeSBiaXQgMSBzZWNvbmRhcnkKIAkgICBCaXQgc2V0IGZvciA0MCBwaW4gKi8KQEAgLTMzNywxNiArMzM3LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS8qIEtlZXAgTEJBMjggY291bnRzIHNvIGxhcmdlIEkvTydzIGRvbid0IHR1cm4gTEJBNDggYW5kIFBJTwotCSAgIHdpdGggb2xkZXIgY29udHJvbGxlcnMuIE5vdCBsb2NrZWQgc28gd2lsbCBncm93IG9uIEM1IG9yIGxhdGVyICovCi0JLm1heF9zZWN0b3JzCQk9IDI1NSwKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiAvKgpAQCAtNDk2LDYgKzQ5Niw2OSBAQAogCS5ob3N0X3N0b3AJPSBhdGFfaG9zdF9zdG9wCiB9OwogCisKKy8qKgorICoJYWxpX2luaXRfY2hpcHNldAktCWNoaXAgc2V0dXAgZnVuY3Rpb24KKyAqCUBwZGV2OiBQQ0kgZGV2aWNlIG9mIEFUQSBjb250cm9sbGVyCisgKgorICoJUGVyZm9ybSB0aGUgc2V0dXAgb24gdGhlIGRldmljZSB0aGF0IG11c3QgYmUgZG9uZSBib3RoIGF0IGJvb3QKKyAqCWFuZCBhdCByZXN1bWUgdGltZS4KKyAqLworIAorc3RhdGljIHZvaWQgYWxpX2luaXRfY2hpcHNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OCByZXYsIHRtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqbm9ydGgsICppc2FfYnJpZGdlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKKworCS8qCisJICogVGhlIGNoaXBzZXQgcmV2aXNpb24gc2VsZWN0cyB0aGUgZHJpdmVyIG9wZXJhdGlvbnMgYW5kCisJICogbW9kZSBkYXRhLgorCSAqLworCisJaWYgKHJldiA+PSAweDIwICYmIHJldiA8IDB4QzIpIHsKKwkJLyogMTU0My1FL0YsIDE1NDNDLUMsIDE1NDNDLUQsIDE1NDNDLUUgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgJnRtcCk7CisJCS8qIENsZWFyIENELVJPTSBETUEgd3JpdGUgYml0ICovCisJCXRtcCAmPSAweDdGOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgdG1wKTsKKwl9IGVsc2UgaWYgKHJldiA+PSAweEMyKSB7CisJCS8qIEVuYWJsZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgJnRtcCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRCLCB0bXAgfCAweDA4KTsKKwl9CisJbm9ydGggPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwwKSk7CisJaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOworCisJaWYgKG5vcnRoICYmIG5vcnRoLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTCAmJiBpc2FfYnJpZGdlKSB7CisJCS8qIENvbmZpZ3VyZSB0aGUgQUxpIGJyaWRnZSBsb2dpYy4gRm9yIG5vbiBBTGkgcmVseSBvbiBCSU9TLgorCQkgICBTZXQgdGhlIHNvdXRoIGJyaWRnZSBlbmFibGUgYml0ICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NzksICZ0bXApOworCQlpZiAocmV2ID09IDB4QzIpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg3OSwgdG1wIHwgMHgwNCk7CisJCWVsc2UgaWYgKHJldiA+IDB4QzIgJiYgcmV2IDwgMHhDNSkKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDc5LCB0bXAgfCAweDAyKTsKKwl9CisJaWYgKHJldiA+PSAweDIwKSB7CisJCS8qCisJCSAqIENEX1JPTSBETUEgb24gKDB4NTMgYml0IDApLiBFbmFibGUgdGhpcyBldmVuIGlmIHdlIHdhbnQKKwkJICogdG8gdXNlIFBJTy4gMHg1MyBiaXQgMSAocmV2IDIwIG9ubHkpIC0gZW5hYmxlIEZJRk8gY29udHJvbAorCQkgKiB2aWEgMHg1NC81NS4KKwkJICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsICZ0bXApOworCQlpZiAocmV2IDw9IDB4MjApCisJCQl0bXAgJj0gfjB4MDI7CisJCWlmIChyZXYgPj0gMHhjNykKKwkJCXRtcCB8PSAweDAzOworCQllbHNlCisJCQl0bXAgfD0gMHgwMTsJLyogQ0RfUk9NIGVuYWJsZSBmb3IgRE1BICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDUzLCB0bXApOworCX0KKwlwY2lfZGV2X3B1dChpc2FfYnJpZGdlKTsKKwlwY2lfZGV2X3B1dChub3J0aCk7CisJYXRhX3BjaV9jbGVhcl9zaW1wbGV4KHBkZXYpOworfQogLyoqCiAgKglhbGlfaW5pdF9vbmUJCS0JZGlzY292ZXJ5IGNhbGxiYWNrCiAgKglAcGRldjogUENJIGRldmljZSBJRApAQCAtNTY5LDcgKzYzMiw3IEBACiAKIAlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKIAl1OCByZXYsIHRtcDsKLQlzdHJ1Y3QgcGNpX2RldiAqbm9ydGgsICppc2FfYnJpZGdlOworCXN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKIApAQCAtNTgxLDExICs2NDQsNiBAQAogCWlmIChyZXYgPCAweDIwKSB7CiAJCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX2Vhcmx5OwogCX0gZWxzZSBpZiAocmV2IDwgMHhDMikgewotCQkvKiAxNTQzLUUvRiwgMTU0M0MtQywgMTU0M0MtRCwgMTU0M0MtRSAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDRCLCAmdG1wKTsKLQkJLyogQ2xlYXIgQ0QtUk9NIERNQSB3cml0ZSBiaXQgKi8KLQkJdG1wICY9IDB4N0Y7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRCLCB0bXApOwogICAgICAgICAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fMjA7CiAJfSBlbHNlIGlmIChyZXYgPT0gMHhDMikgewogICAgICAgICAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fYzI7CkBAIC01OTYsNTQgKzY1NCwyNSBAQAogCX0gZWxzZQogICAgICAgICAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fYzU7CiAKLQlpZiAocmV2ID49IDB4QzIpIHsKLQkJLyogRW5hYmxlIGNhYmxlIGRldGVjdGlvbiBsb2dpYyAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDRCLCAmdG1wKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsIHRtcCB8IDB4MDgpOwotCX0KLQotCW5vcnRoID0gcGNpX2dldF9zbG90KHBkZXYtPmJ1cywgUENJX0RFVkZOKDAsMCkpOworCWFsaV9pbml0X2NoaXBzZXQocGRldik7CisJCiAJaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOwotCi0JaWYgKG5vcnRoICYmIG5vcnRoLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTCkgewotCQkvKiBDb25maWd1cmUgdGhlIEFMaSBicmlkZ2UgbG9naWMuIEZvciBub24gQUxpIHJlbHkgb24gQklPUy4KLQkJICAgU2V0IHRoZSBzb3V0aCBicmlkZ2UgZW5hYmxlIGJpdCAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDc5LCAmdG1wKTsKLQkJaWYgKHJldiA9PSAweEMyKQotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NzksIHRtcCB8IDB4MDQpOwotCQllbHNlIGlmIChyZXYgPiAweEMyKQotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NzksIHRtcCB8IDB4MDIpOworCWlmIChpc2FfYnJpZGdlICYmIHJldiA+PSAweDIwICYmIHJldiA8IDB4QzIpIHsKKwkJLyogQXJlIHdlIHBhaXJlZCB3aXRoIGEgVURNQSBjYXBhYmxlIGNoaXAgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg1RSwgJnRtcCk7CisJCWlmICgodG1wICYgMHgxRSkgPT0gMHgxMikKKwkgICAgICAgIAlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb18yMF91ZG1hOworCQlwY2lfZGV2X3B1dChpc2FfYnJpZGdlKTsKIAl9Ci0KLQlpZiAocmV2ID49IDB4MjApIHsKLQkJaWYgKHJldiA8IDB4QzIpIHsKLQkJCS8qIEFyZSB3ZSBwYWlyZWQgd2l0aCBhIFVETUEgY2FwYWJsZSBjaGlwICovCi0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDVFLCAmdG1wKTsKLQkJCWlmICgodG1wICYgMHgxRSkgPT0gMHgxMikKLQkJICAgICAgICAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fMjBfdWRtYTsKLQkJfQotCQkvKgotCQkgKiBDRF9ST00gRE1BIG9uICgweDUzIGJpdCAwKS4gRW5hYmxlIHRoaXMgZXZlbiBpZiB3ZSB3YW50Ci0JCSAqIHRvIHVzZSBQSU8uIDB4NTMgYml0IDEgKHJldiAyMCBvbmx5KSAtIGVuYWJsZSBGSUZPIGNvbnRyb2wKLQkJICogdmlhIDB4NTQvNTUuCi0JCSAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUzLCAmdG1wKTsKLQkJaWYgKHJldiA8PSAweDIwKQotCQkJdG1wICY9IH4weDAyOwotCQlpZiAocmV2ID49IDB4YzcpCi0JCQl0bXAgfD0gMHgwMzsKLQkJZWxzZQotCQkJdG1wIHw9IDB4MDE7CS8qIENEX1JPTSBlbmFibGUgZm9yIERNQSAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MywgdG1wKTsKLQl9Ci0KLQlwY2lfZGV2X3B1dChpc2FfYnJpZGdlKTsKLQlwY2lfZGV2X3B1dChub3J0aCk7Ci0KLQlhdGFfcGNpX2NsZWFyX3NpbXBsZXgocGRldik7CiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKIH0KIAorc3RhdGljIGludCBhbGlfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlhbGlfaW5pdF9jaGlwc2V0KHBkZXYpOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbGlbXSA9IHsKIAl7IFBDSV9WREVWSUNFKEFMLCBQQ0lfREVWSUNFX0lEX0FMX001MjI4KSwgfSwKIAl7IFBDSV9WREVWSUNFKEFMLCBQQ0lfREVWSUNFX0lEX0FMX001MjI5KSwgfSwKQEAgLTY1NSw3ICs2ODQsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBhbGksCiAJLnByb2JlIAkJPSBhbGlfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhbGlfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFsaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwppbmRleCA1YzQ3YTllLi5hNmIzMzAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfYW1kIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuNyIKIAogLyoqCiAgKgl0aW1pbmdfc2V0dXAJCS0Jc2hhcmVkIHRpbWluZyBjb21wdXRhdGlvbiBhbmQgbG9hZApAQCAtMzI2LDE0ICszMjYsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYW1kMzNfcG9ydF9vcHMgPSB7CkBAIC02NjEsNiArNjYzLDIzIEBACiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKIH0KIAorc3RhdGljIGludCBhbWRfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EKSB7CisJCXU4IGZpZm87CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsICZmaWZvKTsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDExKQorCQkJLyogRklGTyBpcyBicm9rZW4gKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQxLCBmaWZvICYgMHgwRik7CisJCWVsc2UKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQxLCBmaWZvIHwgMHhGMCk7CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwOSB8fAorCQkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQU1EX0NPQlJBXzc0MDEpCisJCSAgICAJYXRhX3BjaV9jbGVhcl9zaW1wbGV4KHBkZXYpOworCX0KKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKHBkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYW1kW10gPSB7CiAJeyBQQ0lfVkRFVklDRShBTUQsCVBDSV9ERVZJQ0VfSURfQU1EX0NPQlJBXzc0MDEpLAkJMCB9LAogCXsgUENJX1ZERVZJQ0UoQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDA5KSwJCTEgfSwKQEAgLTY4OCw3ICs3MDcsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBhbWQsCiAJLnByb2JlIAkJPSBhbWRfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhbWRfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFtZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKaW5kZXggOTZhMDk4MC4uMzdiYzEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwpAQCAtMzA3LDEzICszMDcsMTMgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKaW5kZXggMWNlMjhkMi4uNmY2NjcyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfYXRpaXhwIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjMiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuNCIKIAogZW51bSB7CiAJQVRJSVhQX0lERV9QSU9fVElNSU5HCT0gMHg0MCwKQEAgLTIwOSwxNCArMjA5LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0aWl4cF9wb3J0X29wcyA9IHsKQEAgLTI4MCw3ICsyODIsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBhdGlpeHAsCiAJLnByb2JlIAkJPSBhdGlpeHBfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkucmVzdW1lCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhdGlpeHBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKaW5kZXggYjliYmQxZC4uMTU4NDFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfY21kNjR4IgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuMiIKIAogLyoKICAqIENNRDY0eCBzcGVjaWZpYyByZWdpc3RlcnMgZGVmaW5pdGlvbi4KQEAgLTI2OCwxNCArMjY4LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGNtZDY0eF9wb3J0X29wcyA9IHsKQEAgLTQ2OCw2ICs0NzAsMjAgQEAKIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOwogfQogCitzdGF0aWMgaW50IGNtZDY0eF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU4IG1yZG1vZGU7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgJm1yZG1vZGUpOworCW1yZG1vZGUgJj0gfiAweDMwOwkvKiBJUlEgc2V0IHVwICovCisJbXJkbW9kZSB8PSAweDAyOwkvKiBNZW1vcnkgcmVhZCBsaW5lIGVuYWJsZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBNUkRNT0RFLCBtcmRtb2RlKTsKKyNpZmRlZiBDT05GSUdfUFBDCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFVESURFVENSMCwgMHhGMCk7CisjZW5kaWYKKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKHBkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY21kNjR4W10gPSB7CiAJeyBQQ0lfVkRFVklDRShDTUQsIFBDSV9ERVZJQ0VfSURfQ01EXzY0MyksIDAgfSwKIAl7IFBDSV9WREVWSUNFKENNRCwgUENJX0RFVklDRV9JRF9DTURfNjQ2KSwgMSB9LApAQCAtNDgxLDcgKzQ5Nyw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGNtZDY0eCwKIAkucHJvYmUgCQk9IGNtZDY0eF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGNtZDY0eF9yZWluaXRfb25lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21kNjR4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCmluZGV4IDJjZDNjMGYuLjlmMTY1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2NzNTUyMCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjMiCiAKIHN0cnVjdCBwaW9fY2xvY2tzCiB7CkBAIC0xNTksMTQgKzE1OSwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjczU1MjBfcG9ydF9vcHMgPSB7CkBAIC0yOTYsNiArMjk4LDIyIEBACiAJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiB9CiAKKy8qKgorICoJY3M1NTIwX3JlaW5pdF9vbmUJLQlkZXZpY2UgcmVzdW1lCisgKglAcGRldjogUENJIGRldmljZQorICoKKyAqCURvIGFueSByZWNvbmZpZ3VyYXRpb24gd29yayBuZWVkZWQgYnkgYSByZXN1bWUgZnJvbSBSQU0uIFdlIG5lZWQKKyAqCXRvIHJlc3RvcmUgRE1BIG1vZGUgc3VwcG9ydCBvbiBCSU9TZW4gd2hpY2ggZGlzYWJsZWQgaXQKKyAqLworIAorc3RhdGljIGludCBjczU1MjBfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OCBwY2ljZmc7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2MCwgJnBjaWNmZyk7CisJaWYgKChwY2ljZmcgJiAweDQwKSA9PSAwKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg2MCwgcGNpY2ZnIHwgMHg0MCk7CisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShwZGV2KTsKK30KIC8qIEZvciBub3cga2VlcCBETUEgb2ZmLiBXZSBjYW4gc2V0IGl0IGZvciBhbGwgYnV0IEEgcmV2IENTNTUxMCBvbmNlIHRoZQogICAgY29yZSBBVEEgY29kZSBjYW4gaGFuZGxlIGl0ICovCiAKQEAgLTMxMCw3ICszMjgsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBwYXRhX2NzNTUyMCwKIAkucHJvYmUgCQk9IGNzNTUyMF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IGNzNTUyMF9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBjczU1MjBfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBjczU1MjBfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNzNTUyMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYwppbmRleCBhMDdjYzgxLi4xYzYyODAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9jczU1MzAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjcuMSIKIAogLyoqCiAgKgljczU1MzBfc2V0X3Bpb21vZGUJCS0JUElPIHNldHVwCkBAIC0xNzMsMTQgKzE3MywxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjczU1MzBfcG9ydF9vcHMgPSB7CkBAIC0yMzgsMzggKzI0MCwxOCBAQAogCXJldHVybiAwOwogfQogCisKIC8qKgotICoJY3M1NTMwX2luaXRfb25lCQktCUluaXRpYWxpc2UgYSBDUzU1MzAKLSAqCUBkZXY6IFBDSSBkZXZpY2UKLSAqCUBpZDogRW50cnkgaW4gbWF0Y2ggdGFibGUKKyAqCWNzNTUzMF9pbml0X2NoaXAJLQlDaGlwc2V0IGluaXQKICAqCi0gKglJbnN0YWxsIGEgZHJpdmVyIGZvciB0aGUgbmV3bHkgZm91bmQgQ1M1NTMwIGNvbXBhbmlvbiBjaGlwLiBNb3N0IG9mCi0gKgl0aGlzIGlzIGp1c3QgaG91c2VrZWVwaW5nLiBXZSBoYXZlIHRvIHNldCB0aGUgY2hpcCB1cCBjb3JyZWN0bHkgYW5kCi0gKgl0dXJuIG9mZiB2YXJpb3VzIGJpdHMgb2YgZW11bGF0aW9uIG1hZ2ljLgorICoJUGVyZm9ybSB0aGUgY2hpcCBpbml0aWFsaXNhdGlvbiB3b3JrIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gYm90aAorICoJc2V0dXAgYW5kIHJlc3VtZSBwYXRocwogICovCi0KLXN0YXRpYyBpbnQgY3M1NTMwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKKyAKK3N0YXRpYyBpbnQgY3M1NTMwX2luaXRfY2hpcCh2b2lkKQogewotCWludCBjb21waWxlcl93YXJuaW5nX3BvaW50bGVzc19maXg7Ci0Jc3RydWN0IHBjaV9kZXYgKm1hc3Rlcl8wID0gTlVMTCwgKmNzNTUzMF8wID0gTlVMTDsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKLQkJLnNodCA9ICZjczU1MzBfc2h0LAotCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCi0JCS5waW9fbWFzayA9IDB4MWYsCi0JCS5td2RtYV9tYXNrID0gMHgwNywKLQkJLnVkbWFfbWFzayA9IDB4MDcsCi0JCS5wb3J0X29wcyA9ICZjczU1MzBfcG9ydF9vcHMKLQl9OwotCS8qIFRoZSBkb2NraW5nIGNvbm5lY3RvciBkb2Vzbid0IGRvIFVETUEsIGFuZCBpdCBzZWVtcyBub3QgTVdETUEgKi8KLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19wYWxtYXhfc2Vjb25kYXJ5ID0gewotCQkuc2h0ID0gJmNzNTUzMF9zaHQsCi0JCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKLQkJLnBpb19tYXNrID0gMHgxZiwKLQkJLnBvcnRfb3BzID0gJmNzNTUzMF9wb3J0X29wcwotCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCXN0cnVjdCBwY2lfZGV2ICptYXN0ZXJfMCA9IE5VTEwsICpjczU1MzBfMCA9IE5VTEwsICpkZXYgPSBOVUxMOwogCi0JZGV2ID0gTlVMTDsKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKIAkJc3dpdGNoIChkZXYtPmRldmljZSkgewogCQkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYX1BDSV9NQVNURVI6CkBAIC0yOTAsNyArMjcyLDcgQEAKIAl9CiAKIAlwY2lfc2V0X21hc3RlcihjczU1MzBfMCk7Ci0JY29tcGlsZXJfd2FybmluZ19wb2ludGxlc3NfZml4ID0gcGNpX3NldF9td2koY3M1NTMwXzApOworCXBjaV9zZXRfbXdpKGNzNTUzMF8wKTsKIAogCS8qCiAJICogU2V0IFBDSSBDYWNoZUxpbmVTaXplIHRvIDE2LWJ5dGVzOgpAQCAtMzM4LDEzICszMjAsNyBAQAogCiAJcGNpX2Rldl9wdXQobWFzdGVyXzApOwogCXBjaV9kZXZfcHV0KGNzNTUzMF8wKTsKLQotCWlmIChjczU1MzBfaXNfcGFsbWF4KCkpCi0JCXBvcnRfaW5mb1sxXSA9ICZpbmZvX3BhbG1heF9zZWNvbmRhcnk7Ci0KLQkvKiBOb3cga2ljayBvZmYgQVRBIHNldCB1cCAqLwotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcG9ydF9pbmZvLCAyKTsKLQorCXJldHVybiAwOwogZmFpbF9wdXQ6CiAJaWYgKG1hc3Rlcl8wKQogCQlwY2lfZGV2X3B1dChtYXN0ZXJfMCk7CkBAIC0zNTMsNiArMzI5LDUzIEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKKy8qKgorICoJY3M1NTMwX2luaXRfb25lCQktCUluaXRpYWxpc2UgYSBDUzU1MzAKKyAqCUBkZXY6IFBDSSBkZXZpY2UKKyAqCUBpZDogRW50cnkgaW4gbWF0Y2ggdGFibGUKKyAqCisgKglJbnN0YWxsIGEgZHJpdmVyIGZvciB0aGUgbmV3bHkgZm91bmQgQ1M1NTMwIGNvbXBhbmlvbiBjaGlwLiBNb3N0IG9mCisgKgl0aGlzIGlzIGp1c3QgaG91c2VrZWVwaW5nLiBXZSBoYXZlIHRvIHNldCB0aGUgY2hpcCB1cCBjb3JyZWN0bHkgYW5kCisgKgl0dXJuIG9mZiB2YXJpb3VzIGJpdHMgb2YgZW11bGF0aW9uIG1hZ2ljLgorICovCisKK3N0YXRpYyBpbnQgY3M1NTMwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJCS5zaHQgPSAmY3M1NTMwX3NodCwKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TU3xBVEFfRkxBR19TUlNULAorCQkucGlvX21hc2sgPSAweDFmLAorCQkubXdkbWFfbWFzayA9IDB4MDcsCisJCS51ZG1hX21hc2sgPSAweDA3LAorCQkucG9ydF9vcHMgPSAmY3M1NTMwX3BvcnRfb3BzCisJfTsKKwkvKiBUaGUgZG9ja2luZyBjb25uZWN0b3IgZG9lc24ndCBkbyBVRE1BLCBhbmQgaXQgc2VlbXMgbm90IE1XRE1BICovCisJc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fcGFsbWF4X3NlY29uZGFyeSA9IHsKKwkJLnNodCA9ICZjczU1MzBfc2h0LAorCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCisJCS5waW9fbWFzayA9IDB4MWYsCisJCS5wb3J0X29wcyA9ICZjczU1MzBfcG9ydF9vcHMKKwl9OworCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKKwkKKwkvKiBDaGlwIGluaXRpYWxpc2F0aW9uICovCisJaWYgKGNzNTUzMF9pbml0X2NoaXAoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCQorCWlmIChjczU1MzBfaXNfcGFsbWF4KCkpCisJCXBvcnRfaW5mb1sxXSA9ICZpbmZvX3BhbG1heF9zZWNvbmRhcnk7CisKKwkvKiBOb3cga2ljayBvZmYgQVRBIHNldCB1cCAqLworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7Cit9CisKK3N0YXRpYyBpbnQgY3M1NTMwX3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyogSWYgd2UgZmFpbCBvbiByZXN1bWUgd2UgYXJlIGRvb21lZCAqLworCUJVR19PTihjczU1MzBfaW5pdF9jaGlwKCkpOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7Cit9CisJCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3M1NTMwW10gPSB7CiAJeyBQQ0lfVkRFVklDRShDWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0lERSksIH0sCiAKQEAgLTM2Myw3ICszODYsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBjczU1MzAsCiAJLnByb2JlIAkJPSBjczU1MzBfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBjczU1MzBfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNzNTUzMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYwppbmRleCBmOGRlZjNmLi5lM2VmZWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImNzNTUzNSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi4xMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi4xMSIKIAogLyoKICAqCVRoZSBHZW9kZSAoQWthIEF0aGxvbiBHWCBub3cpIHVzZXMgYW4gaW50ZXJuYWwgTVNSIGJhc2VkCkBAIC0xNzcsMTQgKzE3NywxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjczU1MzVfcG9ydF9vcHMgPSB7CkBAIC0yNjcsNyArMjY5LDkgQEAKIAkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBjczU1MzUsCiAJLnByb2JlIAkJPSBjczU1MzVfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjczU1MzVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jeXByZXNzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYwppbmRleCAyNDdiNDM2Li5lMmE5NTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2N5cHJlc3MiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMS40IgogCiAvKiBoZXJlIGFyZSB0aGUgb2Zmc2V0IGRlZmluaXRpb25zIGZvciB0aGUgcmVnaXN0ZXJzICovCiAKQEAgLTEyOCwxNCArMTI4LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGN5ODJjNjkzX3BvcnRfb3BzID0gewpAQCAtMjAzLDcgKzIwNSw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGN5ODJjNjkzLAogCS5wcm9iZSAJCT0gY3k4MmM2OTNfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjeTgyYzY5M19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCmluZGV4IGVmMThjNjAuLmVkZjhhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfZWZhciIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40LjMiCiAKIC8qKgogICoJZWZhcl9wcmVfcmVzZXQJLQljaGVjayBmb3IgNDAvODAgcGluCkBAIC0yMjYsMTQgKzIyNiwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBlZmFyX29wcyA9IHsKQEAgLTMxNSw2ICszMTcsOCBAQAogCS5pZF90YWJsZQkJPSBlZmFyX3BjaV90YmwsCiAJLnByb2JlCQkJPSBlZmFyX2luaXRfb25lLAogCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAkJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGVmYXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggNmQzZTRjMC4uMjY2MzU5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0MzY2IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41LjMiCiAKIHN0cnVjdCBocHRfY2xvY2sgewogCXU4CXhmZXJfc3BlZWQ7CkBAIC0yMjIsOSArMjIyLDE3IEBACiAKIHN0YXRpYyBpbnQgaHB0MzZ4X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2JpdHMgaHB0MzZ4X2VuYWJsZV9iaXRzW10gPSB7CisJCXsgMHg1MCwgMSwgMHgwNCwgMHgwNCB9LAorCQl7IDB4NTQsIDEsIDB4MDQsIDB4MDQgfQorCX07CisKIAl1OCBhdGE2NjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAKKwlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZocHQzNnhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJCQogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NUEsICZhdGE2Nik7CiAJaWYgKGF0YTY2ICYgKDEgPDwgYXAtPnBvcnRfbm8pKQogCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CkBAIC0zMjIsMTQgKzMzMCwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIC8qCkBAIC0zNzIsNiArMzgyLDI3IEBACiB9OwogCiAvKioKKyAqCWhwdDM2eF9pbml0X2NoaXBzZXQJLQljb21tb24gY2hpcCBzZXR1cAorICoJQGRldjogUENJIGRldmljZQorICoKKyAqCVBlcmZvcm0gdGhlIGNoaXAgc2V0dXAgd29yayB0aGF0IG11c3QgYmUgZG9uZSBhdCBib3RoIGluaXQgYW5kCisgKglyZXN1bWUgdGltZQorICovCisKK3N0YXRpYyB2b2lkIGhwdDM2eF9pbml0X2NoaXBzZXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCBkcml2ZV9mYXN0OworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIChMMV9DQUNIRV9CWVRFUyAvIDQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg3OCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsIDB4MDgpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NQVhfTEFULCAweDA4KTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgJmRyaXZlX2Zhc3QpOworCWlmIChkcml2ZV9mYXN0ICYgMHg4MCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgZHJpdmVfZmFzdCAmIH4weDgwKTsKK30KKworLyoqCiAgKglocHQzNnhfaW5pdF9vbmUJCS0JSW5pdGlhbGlzZSBhbiBIUFQzNjYvMzY4CiAgKglAZGV2OiBQQ0kgZGV2aWNlCiAgKglAaWQ6IEVudHJ5IGluIG1hdGNoIHRhYmxlCkBAIC00MDYsNyArNDM3LDYgQEAKIAogCXUzMiBjbGFzc19yZXY7CiAJdTMyIHJlZzE7Ci0JdTggZHJpdmVfZmFzdDsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CiAJY2xhc3NfcmV2ICY9IDB4RkY7CkBAIC00MTYsMTQgKzQ0Niw3IEBACiAJaWYgKGNsYXNzX3JldiA+IDIpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIChMMV9DQUNIRV9CWVRFUyAvIDQpKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg3OCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsIDB4MDgpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NQVhfTEFULCAweDA4KTsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgJmRyaXZlX2Zhc3QpOwotCWlmIChkcml2ZV9mYXN0ICYgMHg4MCkKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgZHJpdmVfZmFzdCAmIH4weDgwKTsKKwlocHQzNnhfaW5pdF9jaGlwc2V0KGRldik7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAgJnJlZzEpOwogCkBAIC00NDQsOSArNDY3LDE1IEBACiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOwogfQogCitzdGF0aWMgaW50IGhwdDM2eF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaHB0MzZ4X2luaXRfY2hpcHNldChkZXYpOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUoZGV2KTsKK30KKworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaHB0MzZ4W10gPSB7CiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM2NiksIH0sCi0KIAl7IH0sCiB9OwogCkBAIC00NTQsNyArNDgzLDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gaHB0MzZ4LAogCS5wcm9iZSAJCT0gaHB0MzZ4X2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaHB0MzZ4X3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBocHQzNnhfaW5pdCh2b2lkKQpAQCAtNDYyLDEzICs0OTMsMTEgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaHB0MzZ4X3BjaV9kcml2ZXIpOwogfQogCi0KIHN0YXRpYyB2b2lkIF9fZXhpdCBocHQzNnhfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaHB0MzZ4X3BjaV9kcml2ZXIpOwogfQogCi0KIE1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIHRoZSBIaWdocG9pbnQgSFBUMzY2LzM2OCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKaW5kZXggZmNlM2ZjZC4uNDcwODJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCkBAIC03NjgsMTMgKzc2OCwxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCmluZGV4IDU4Y2ZiMmIuLmY2ODE3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwppbmRleCAzMzM0ZDcyLi41ZjFkMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9ocHQzeDMiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4yIgogCiBzdGF0aWMgaW50IGhwdDN4M19wcm9iZV9pbml0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CkBAIC0xMTEsMTQgKzExMSwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzeDNfcG9ydF9vcHMgPSB7CkBAIC0xNTcsNiArMTU5LDI3IEBACiB9OwogCiAvKioKKyAqCWhwdDN4M19pbml0X2NoaXBzZXQJLQljaGlwIHNldHVwCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKgorICoJUGVyZm9ybSB0aGUgc2V0dXAgcmVxdWlyZWQgYXQgYm9vdCBhbmQgb24gcmVzdW1lLgorICovCisgCitzdGF0aWMgdm9pZCBocHQzeDNfaW5pdF9jaGlwc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2IGNtZDsKKwkvKiBJbml0aWFsaXplIHRoZSBib2FyZCAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4ODAsIDB4MDApOworCS8qIENoZWNrIGlmIGl0IGlzIGEgMzQzIG9yIGEgMzYzLiAzNjMgaGFzIENPTU1BTkRfTUVNT1JZIHNldCAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWlmIChjbWQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweEYwKTsKKwllbHNlCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDIwKTsKK30KKworCisvKioKICAqCWhwdDN4M19pbml0X29uZQkJLQlJbml0aWFsaXNlIGFuIEhQVDM0My8zNjMKICAqCUBkZXY6IFBDSSBkZXZpY2UKICAqCUBpZDogRW50cnkgaW4gbWF0Y2ggdGFibGUKQEAgLTE3NywyMSArMjAwLDE4IEBACiAJCS5wb3J0X29wcyA9ICZocHQzeDNfcG9ydF9vcHMKIAl9OwogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKLQl1MTYgY21kOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgYm9hcmQgKi8KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDgwLCAweDAwKTsKLQkvKiBDaGVjayBpZiBpdCBpcyBhIDM0MyBvciBhIDM2My4gMzYzIGhhcyBDT01NQU5EX01FTU9SWSBzZXQgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAoY21kICYgUENJX0NPTU1BTkRfTUVNT1JZKQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHhGMCk7Ci0JZWxzZQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHgyMCk7Ci0KKwlocHQzeDNfaW5pdF9jaGlwc2V0KGRldik7CiAJLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CiB9CiAKK3N0YXRpYyBpbnQgaHB0M3gzX3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlocHQzeDNfaW5pdF9jaGlwc2V0KGRldik7CisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaHB0M3gzW10gPSB7CiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM0MyksIH0sCiAKQEAgLTIwMiw3ICsyMjIsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBocHQzeDMsCiAJLnByb2JlIAkJPSBocHQzeDNfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBocHQzeDNfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGhwdDN4M19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pc2FwbnAuYwppbmRleCA2NDBiOGIwLi5hOTdkNTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMKQEAgLTI3LDEzICsyNywxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwppbmRleCAxOGZmM2U1Li4wYjU2ZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2l0ODIxeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4yIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjMiCiAKIHN0cnVjdCBpdDgyMXhfZGV2CiB7CkBAIC02NjYsMTYgKzY2NiwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkvKiAyNTUgc2VjdG9ycyB0byBiZWdpbiB3aXRoLiBUaGlzIGlzIGxvY2tlZCBpbiBzbWFydCBtb2RlIGJ1dCBub3QKLQkgICBpbiBwYXNzIHRocm91Z2ggKi8KLQkubWF4X3NlY3RvcnMJCT0gMjU1LAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBpdDgyMXhfc21hcnRfcG9ydF9vcHMgPSB7CkBAIC04MDgsNiArODA4LDE0IEBACiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKIH0KIAorc3RhdGljIGludCBpdDgyMXhfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwkvKiBSZXN1bWUgLSB0dXJuIHJhaWQgYmFjayBvZmYgaWYgbmVlZCBiZSAqLworCWlmIChpdDgyMTJfbm9yYWlkKQorCQlpdDgyMXhfZGlzYWJsZV9yYWlkKHBkZXYpOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpdDgyMXhbXSA9IHsKIAl7IFBDSV9WREVWSUNFKElURSwgUENJX0RFVklDRV9JRF9JVEVfODIxMSksIH0sCiAJeyBQQ0lfVkRFVklDRShJVEUsIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTIpLCB9LApAQCAtODE5LDcgKzgyNyw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGl0ODIxeCwKIAkucHJvYmUgCQk9IGl0ODIxeF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGl0ODIxeF9yZWluaXRfb25lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXQ4MjF4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODkyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogaXhwNHh4IFBBVEEvQ29tcGFjdCBGbGFzaCBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBUb3dlciBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKgorICogQW4gQVRBIGRyaXZlciB0byBoYW5kbGUgYSBDb21wYWN0IEZsYXNoIGNvbm5lY3RlZAorICogdG8gdGhlIGl4cDR4eCBleHBhbnNpb24gYnVzIGluIFRydWVJREUgbW9kZS4gVGhlIENGCisgKiBtdXN0IGhhdmUgaXQgY2hpcCBzZWxlY3RzIGNvbm5lY3RlZCB0byB0d28gQ1MgbGluZXMKKyAqIG9uIHRoZSBpeHA0eHguIFRoZSBpbnRlcnJ1cHQgbGluZSBpcyBvcHRpb25hbCwgaWYgbm90CisgKiBzcGVjaWZpZWQgdGhlIGRyaXZlciB3aWxsIHJ1biBpbiBwb2xsaW5nIG1vZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInBhdGFfaXhwNHh4X2NmIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xLjEiCisKK3N0YXRpYyB2b2lkIGl4cDR4eF9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7CisJCQlkZXYtPnBpb19tb2RlID0gWEZFUl9QSU9fMDsKKwkJCWRldi0+eGZlcl9tb2RlID0gWEZFUl9QSU9fMDsKKwkJCWRldi0+eGZlcl9zaGlmdCA9IEFUQV9TSElGVF9QSU87CisJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGl4cDR4eF9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CisJYXRhX3BvcnRfcHJvYmUoYXApOworCWF0YV9idXNfcmVzZXQoYXApOworfQorCitzdGF0aWMgdm9pZCBpeHA0eHhfbW1pb19kYXRhX3hmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgd3JpdGVfZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgd29yZHMgPSBidWZsZW4gPj4gMTsKKwl1MTYgKmJ1ZjE2ID0gKHUxNiAqKSBidWY7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGFkZXYtPmFwOworCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmRhdGFfYWRkcjsKKwlzdHJ1Y3QgaXhwNHh4X3BhdGFfZGF0YSAqZGF0YSA9IGFwLT5ob3N0LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisKKwkvKiBzZXQgdGhlIGV4cGFuc2lvbiBidXMgaW4gMTZiaXQgbW9kZSBhbmQgcmVzdG9yZQorCSAqIDggYml0IG1vZGUgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCSpkYXRhLT5jczBfY2ZnICY9IH4oMHgwMSk7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBUcmFuc2ZlciBtdWx0aXBsZSBvZiAyIGJ5dGVzICovCisJaWYgKHdyaXRlX2RhdGEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCisJCQl3cml0ZXcoYnVmMTZbaV0sIG1taW8pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKQorCQkJYnVmMTZbaV0gPSByZWFkdyhtbWlvKTsKKwl9CisKKwkvKiBUcmFuc2ZlciB0cmFpbGluZyAxIGJ5dGUsIGlmIGFueS4gKi8KKwlpZiAodW5saWtlbHkoYnVmbGVuICYgMHgwMSkpIHsKKwkJdTE2IGFsaWduX2J1ZlsxXSA9IHsgMCB9OworCQl1bnNpZ25lZCBjaGFyICp0cmFpbGluZ19idWYgPSBidWYgKyBidWZsZW4gLSAxOworCisJCWlmICh3cml0ZV9kYXRhKSB7CisJCQltZW1jcHkoYWxpZ25fYnVmLCB0cmFpbGluZ19idWYsIDEpOworCQkJd3JpdGV3KGFsaWduX2J1ZlswXSwgbW1pbyk7CisJCX0gZWxzZSB7CisJCQlhbGlnbl9idWZbMF0gPSByZWFkdyhtbWlvKTsKKwkJCW1lbWNweSh0cmFpbGluZ19idWYsIGFsaWduX2J1ZiwgMSk7CisJCX0KKwl9CisKKwl1ZGVsYXkoMTAwKTsKKwkqZGF0YS0+Y3MwX2NmZyB8PSAweDAxOworfQorCitzdGF0aWMgdm9pZCBpeHA0eHhfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7Cit9CisKK3N0YXRpYyB2b2lkIGl4cDR4eF9ob3N0X3N0b3AgKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaXhwNHh4X3BhdGFfZGF0YSAqZGF0YSA9IGhvc3QtPmRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlvdW5tYXAoZGF0YS0+Y3MwKTsKKwlpb3VubWFwKGRhdGEtPmNzMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGl4cDR4eF9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBpeHA0eHhfcG9ydF9vcHMgPSB7CisJLnNldF9tb2RlCT0gaXhwNHh4X3NldF9tb2RlLAorCS5tb2RlX2ZpbHRlcgk9IGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIsCisKKwkucG9ydF9kaXNhYmxlCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cyAJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0IAk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKworCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwkuZGF0YV94ZmVyCT0gaXhwNHh4X21taW9fZGF0YV94ZmVyLAorCisJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCT0gaXhwNHh4X2lycV9jbGVhciwKKworCS5wb3J0X3N0YXJ0CT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAk9IGF0YV9wb3J0X3N0b3AsCisJLmhvc3Rfc3RvcAk9IGl4cDR4eF9ob3N0X3N0b3AsCisKKwkucGh5X3Jlc2V0CT0gaXhwNHh4X3BoeV9yZXNldCwKK307CisKK3N0YXRpYyB2b2lkIGl4cDR4eF9zZXR1cF9wb3J0KHN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyLAorCQkJCXN0cnVjdCBpeHA0eHhfcGF0YV9kYXRhICpkYXRhKQoreworCWlvYWRkci0+Y21kX2FkZHIJPSAodW5zaWduZWQgbG9uZykgZGF0YS0+Y3MwOworCWlvYWRkci0+YWx0c3RhdHVzX2FkZHIJPSAodW5zaWduZWQgbG9uZykgZGF0YS0+Y3MxICsgMHgwNjsKKwlpb2FkZHItPmN0bF9hZGRyCT0gKHVuc2lnbmVkIGxvbmcpIGRhdGEtPmNzMSArIDB4MDY7CisKKwlhdGFfc3RkX3BvcnRzKGlvYWRkcik7CisKKyNpZm5kZWYgX19BUk1FQl9fCisKKwkvKiBhZGp1c3QgdGhlIGFkZHJlc3NlcyB0byBoYW5kbGUgdGhlIGFkZHJlc3Mgc3dpenpsaW5nIG9mIHRoZQorCSAqIGl4cDR4eCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCisJICovCisKKwlpb2FkZHItPmRhdGFfYWRkcglePSAweDAyOworCWlvYWRkci0+Y21kX2FkZHIJXj0gMHgwMzsKKwlpb2FkZHItPmFsdHN0YXR1c19hZGRyCV49IDB4MDM7CisJaW9hZGRyLT5jdGxfYWRkcglePSAweDAzOworCWlvYWRkci0+ZXJyb3JfYWRkcglePSAweDAzOworCWlvYWRkci0+ZmVhdHVyZV9hZGRyCV49IDB4MDM7CisJaW9hZGRyLT5uc2VjdF9hZGRyCV49IDB4MDM7CisJaW9hZGRyLT5sYmFsX2FkZHIgCV49IDB4MDM7CisJaW9hZGRyLT5sYmFtX2FkZHIJXj0gMHgwMzsKKwlpb2FkZHItPmxiYWhfYWRkcglePSAweDAzOworCWlvYWRkci0+ZGV2aWNlX2FkZHIJXj0gMHgwMzsKKwlpb2FkZHItPnN0YXR1c19hZGRyCV49IDB4MDM7CisJaW9hZGRyLT5jb21tYW5kX2FkZHIJXj0gMHgwMzsKKyNlbmRpZgorfQorCitzdGF0aWMgX19kZXZpbml0IGludCBpeHA0eHhfcGF0YV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmNzMCwgKmNzMTsKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCBhZTsKKworCXN0cnVjdCBpeHA0eHhfcGF0YV9kYXRhICpkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwljczAgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWNzMSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisKKwlpZiAoIWNzMCB8fCAhY3MxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLOworCisJZGF0YS0+Y3MwID0gaW9yZW1hcChjczAtPnN0YXJ0LCAweDEwMDApOworCWRhdGEtPmNzMSA9IGlvcmVtYXAoY3MxLT5zdGFydCwgMHgxMDAwKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSkKKwkJc2V0X2lycV90eXBlKGlycSwgSVJRVF9ISUdIKTsKKworCS8qIFNldHVwIGV4cGFuc2lvbiBidXMgY2hpcCBzZWxlY3RzICovCisJKmRhdGEtPmNzMF9jZmcgPSBkYXRhLT5jczBfYml0czsKKwkqZGF0YS0+Y3MxX2NmZyA9IGRhdGEtPmNzMV9iaXRzOworCisJbWVtc2V0KCZhZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGFfcHJvYmVfZW50KSk7CisJSU5JVF9MSVNUX0hFQUQoJmFlLm5vZGUpOworCisJYWUuZGV2CQk9ICZwZGV2LT5kZXY7CisJYWUucG9ydF9vcHMJPSAmaXhwNHh4X3BvcnRfb3BzOworCWFlLnNodAkJPSAmaXhwNHh4X3NodDsKKwlhZS5uX3BvcnRzCT0gMTsKKwlhZS5waW9fbWFzawk9IDB4MWY7IC8qIFBJTzQgKi8KKwlhZS5pcnEJCT0gaXJxOworCWFlLmlycV9mbGFncwk9IDA7CisJYWUucG9ydF9mbGFncwk9IEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OT19MRUdBQ1kKKwkJCXwgQVRBX0ZMQUdfTk9fQVRBUEkgfCBBVEFfRkxBR19TUlNUOworCisJLyogcnVuIGluIHBvbGxpbmcgbW9kZSBpZiBubyBpcnEgaGFzIGJlZW4gYXNzaWduZWQgKi8KKwlpZiAoIWlycSkKKwkJYWUucG9ydF9mbGFncyB8PSBBVEFfRkxBR19QSU9fUE9MTElORzsKKworCWl4cDR4eF9zZXR1cF9wb3J0KCZhZS5wb3J0WzBdLCBkYXRhKTsKKworCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmV0ID0gYXRhX2RldmljZV9hZGQoJmFlKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IGl4cDR4eF9wYXRhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCWF0YV9ob3N0X3JlbW92ZShob3N0KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGl4cDR4eF9wYXRhX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCSA9IHsKKwkJLm5hbWUgICA9IERSVl9OQU1FLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gaXhwNHh4X3BhdGFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpeHA0eHhfcGF0YV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXhwNHh4X3BhdGFfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJml4cDR4eF9wYXRhX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpeHA0eHhfcGF0YV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJml4cDR4eF9wYXRhX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBpeHA0eHggQ29tcGFjdCBGbGFzaCBQQVRBIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGl4cDR4eF9wYXRhX2luaXQpOworbW9kdWxlX2V4aXQoaXhwNHh4X3BhdGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2ptaWNyb24uYyBiL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCmluZGV4IDUyYTJiZGYuLjJkNjYxY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfam1pY3JvbiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMS4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xLjQiCiAKIHR5cGVkZWYgZW51bSB7CiAJUE9SVF9QQVRBMCA9IDAsCkBAIC0xMjgsMTQgKzEyOCwxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkvKiBTcGVjaWFsIGhhbmRsaW5nIG5lZWRlZCBpZiB5b3UgaGF2ZSBzZWN0b3Igb3IgTEJBNDggbGltaXRzICovCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLyogVXNlIHN0YW5kYXJkIENIUyBtYXBwaW5nIHJ1bGVzICovCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKQEAgLTIxMiwxMiArMjExLDExIEBACiAKIAkJLyogRklYTUU6IFdlIG1heSB3YW50IGEgd2F5IHRvIG92ZXJyaWRlIHRoaXMgaW4gZnV0dXJlICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQxLCAweGExKTsKKworCQkvKiBQQVRBIGNvbnRyb2xsZXIgaXMgZm4gMSwgQUhDSSBpcyBmbiAwICovCisJCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMSkKKwkJCXJldHVybiAtRU5PREVWOwogCX0KLQotCS8qIFBBVEEgY29udHJvbGxlciBpcyBmbiAxLCBBSENJIGlzIGZuIDAgKi8KLQlpZiAoUENJX0ZVTkMocGRldi0+ZGV2Zm4pICE9IDEpCi0JCXJldHVybiAtRU5PREVWOwotCiAJaWYgKCBpZC0+ZHJpdmVyX2RhdGEgPT0gMzY1IHx8IGlkLT5kcml2ZXJfZGF0YSA9PSAzNjYpIHsKIAkJLyogVGhlIDM2NS82NiBoYXZlIHR3byBQQVRBIGNoYW5uZWxzLCByZWRpcmVjdCB0aGUgc2Vjb25kICovCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDgwLCAmcmVnKTsKQEAgLTIyOCw2ICsyMjYsMjcgQEAKIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOwogfQogCitzdGF0aWMgaW50IGptaWNyb25fcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgcmVnOworCQorCXN3aXRjaChwZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY4OgorCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2NToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY2OgorCQkJLyogUmVzdG9yZSBtYXBwaW5nIG9yIGRpc2tzIHN3YXAgYW5kIGJveSBkb2VzIGl0IGdldCB1Z2x5ICovCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg4MCwgJnJlZyk7CisJCQlyZWcgfD0gKDEgPDwgMjQpOwkvKiBJREUxIHRvIFBBVEEgSURFIHNlY29uZGFyeSAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDgwLCByZWcpOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQkvKiBNYWtlIHN1cmUgQUhDSSBpcyB0dXJuZWQgYmFjayBvbiAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsIDB4YTEpOworCX0KKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKHBkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgam1pY3Jvbl9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYxKSwgMzYxfSwKIAl7IFBDSV9WREVWSUNFKEpNSUNST04sIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjMpLCAzNjN9LApAQCAtMjQzLDYgKzI2Miw4IEBACiAJLmlkX3RhYmxlCQk9IGptaWNyb25fcGNpX3RibCwKIAkucHJvYmUJCQk9IGptaWNyb25faW5pdF9vbmUsCiAJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCQk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gam1pY3Jvbl9yZWluaXRfb25lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgam1pY3Jvbl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwppbmRleCAxMDIzMWVmLi5jN2QxNzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKQEAgLTEyOCwxMyArMTI4LDEzIEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4MTBlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICoJTWFydmVsbCBQQVRBIGRyaXZlci4KKyAqCisgKglGb3IgdGhlIG1vbWVudCB3ZSBkcml2ZSB0aGUgUEFUQSBwb3J0IGluIGxlZ2FjeSBtb2RlLiBUaGF0CisgKglpc24ndCBtYWtpbmcgZnVsbCB1c2Ugb2YgdGhlIGRldmljZSBmdW5jdGlvbmFsaXR5IGJ1dCBpdCBpcworICoJZWFzeSB0byBnZXQgd29ya2luZy4KKyAqCisgKgkoYykgMjAwNiBSZWQgSGF0ICA8YWxhbkByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJwYXRhX21hcnZlbGwiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjEuMSIKKworLyoqCisgKgltYXJ2ZWxsX3ByZV9yZXNldAktCWNoZWNrIGZvciA0MC84MCBwaW4KKyAqCUBhcDogUG9ydAorICoKKyAqCVBlcmZvcm0gdGhlIFBBVEEgcG9ydCBzZXR1cCB3ZSBuZWVkLgorICovCisKK3N0YXRpYyBpbnQgbWFydmVsbF9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJdTMyIGRldmljZXM7CisJdm9pZCBfX2lvbWVtICpiYXJwOworCWludCBpOworCisJLyogQ2hlY2sgaWYgb3VyIHBvcnQgaXMgZW5hYmxlZCAqLworCisJYmFycCA9IHBjaV9pb21hcChwZGV2LCA1LCAweDEwKTsKKwlpZiAoYmFycCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwcmludGsoIkJBUjU6Iik7CisJZm9yKGkgPSAwOyBpIDw9IDB4MEY7IGkrKykKKwkJcHJpbnRrKCIlMDJYOiUwMlggIiwgaSwgcmVhZGIoYmFycCArIGkpKTsKKwlwcmludGsoIlxuIik7CisJCisJZGV2aWNlcyA9IHJlYWRsKGJhcnAgKyAweDBDKTsKKwlwY2lfaW91bm1hcChwZGV2LCBiYXJwKTsKKwkKKwlpZiAoKHBkZXYtPmRldmljZSA9PSAweDYxNDUpICYmIChhcC0+cG9ydF9ubyA9PSAwKSAmJgorCSAgICAoIShkZXZpY2VzICYgMHgxMCkpKQkvKiBQQVRBIGVuYWJsZSA/ICovCisJCXJldHVybiAtRU5PRU5UOworCisJLyogQ2FibGUgdHlwZSAqLworCXN3aXRjaChhcC0+cG9ydF9ubykKKwl7CisJY2FzZSAwOgorCQlpZiAoaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIDEpICYgMSkKKwkJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKKwkJZWxzZQorCQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOworCQlicmVhazsKKworCWNhc2UgMTogLyogTGVnYWN5IFNBVEEgcG9ydCAqLworCQlhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOworfQorCisvKioKKyAqCW1hcnZlbGxfZXJyb3JfaGFuZGxlciAtIFNldHVwIGFuZCBlcnJvciBoYW5kbGVyCisgKglAYXA6IFBvcnQgdG8gaGFuZGxlCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCisgKi8KKworc3RhdGljIHZvaWQgbWFydmVsbF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIGF0YV9ibWRtYV9kcml2ZV9laChhcCwgbWFydmVsbF9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LAorCQkJCSAgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOworfQorCisvKiBObyBQSU8gb3IgRE1BIG1ldGhvZHMgbmVlZGVkIGZvciB0aGlzIGRldmljZSAqLworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtYXJ2ZWxsX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCisJLyogVXNlIHN0YW5kYXJkIENIUyBtYXBwaW5nIHJ1bGVzICovCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbWFydmVsbF9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCisJLyogVGFzayBmaWxlIGlzIFBDSSBBVEEgZm9ybWF0LCB1c2UgaGVscGVycyAqLworCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCisJLmZyZWV6ZQkJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKKwkudGhhdwkJCT0gYXRhX2JtZG1hX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gbWFydmVsbF9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKworCS8qIEJNRE1BIGhhbmRsaW5nIGlzIFBDSSBBVEEgZm9ybWF0LCB1c2UgaGVscGVycyAqLworCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCisKKwkvKiBUaW1lb3V0IGhhbmRsaW5nICovCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLyogR2VuZXJpYyBQQVRBIFBDSSBBVEEgaGVscGVycyAqLworCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCQk9IGF0YV9ob3N0X3N0b3AsCit9OworCisKKy8qKgorICoJbWFydmVsbF9pbml0X29uZSAtIFJlZ2lzdGVyIE1hcnZlbGwgQVRBIFBDSSBkZXZpY2Ugd2l0aCBrZXJuZWwgc2VydmljZXMKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKglAZW50OiBFbnRyeSBpbiBtYXJ2ZWxsX3BjaV90YmwgbWF0Y2hpbmcgd2l0aCBAcGRldgorICoKKyAqCUNhbGxlZCBmcm9tIGtlcm5lbCBQQ0kgbGF5ZXIuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIFBDSSBsYXllciAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBvciAtRVJSTk8gdmFsdWUuCisgKi8KKworc3RhdGljIGludCBtYXJ2ZWxsX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCQkuc2h0CQk9ICZtYXJ2ZWxsX3NodCwKKwkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAorCisJCS5waW9fbWFzawk9IDB4MWYsCisJCS5td2RtYV9tYXNrCT0gMHgwNywKKwkJLnVkbWFfbWFzayAJPSAweDNmLAorCisJCS5wb3J0X29wcwk9ICZtYXJ2ZWxsX29wcywKKwl9OworCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3NhdGEgPSB7CisJCS5zaHQJCT0gJm1hcnZlbGxfc2h0LAorCQkvKiBTbGF2ZSBwb3NzaWJsZSBhcyBpdHMgbWFnaWNhbGx5IG1hcHBlZCBub3QgcmVhbCAqLworCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCisKKwkJLnBpb19tYXNrCT0gMHgxZiwKKwkJLm13ZG1hX21hc2sJPSAweDA3LAorCQkudWRtYV9tYXNrIAk9IDB4N2YsCisKKwkJLnBvcnRfb3BzCT0gJm1hcnZlbGxfb3BzLAorCX07CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvX3NhdGEgfTsKKwlpbnQgbl9wb3J0ID0gMjsKKworCWlmIChwZGV2LT5kZXZpY2UgPT0gMHg2MTAxKQorCQluX3BvcnQgPSAxOworCisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCBuX3BvcnQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWFydmVsbF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfREVWSUNFKDB4MTFBQiwgMHg2MTAxKSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxMUFCLCAweDYxNDUpLCB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG1hcnZlbGxfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IG1hcnZlbGxfcGNpX3RibCwKKwkucHJvYmUJCQk9IG1hcnZlbGxfaW5pdF9vbmUsCisJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCQk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWFydmVsbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1hcnZlbGxfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYXJ2ZWxsX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1hcnZlbGxfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1hcnZlbGxfaW5pdCk7Cittb2R1bGVfZXhpdChtYXJ2ZWxsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIGxvdy1sZXZlbCBkcml2ZXIgZm9yIE1hcnZlbGwgQVRBIGluIGxlZ2FjeSBtb2RlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWFydmVsbF9wY2lfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCmluZGV4IDlkZmUzZTkuLjRjY2NhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9tcGlpeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy4yIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC43LjMiCiAKIGVudW0gewogCUlERVRJTSA9IDB4NkMsCQkvKiBJREUgY29udHJvbCByZWdpc3RlciAqLwpAQCAtMTU5LDE0ICsxNTksMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbXBpaXhfcG9ydF9vcHMgPSB7CkBAIC0yODQsNyArMjg2LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gbXBpaXgsCiAJLnByb2JlIAkJPSBtcGlpeF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IG1waWl4X3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IG1waWl4X3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbXBpaXhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMgYi9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYwppbmRleCBmNTY3MmRlLi5jZjdmZTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX25ldGNlbGwiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjEuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMS42IgogCiAvKioKICAqCW5ldGNlbGxfcHJvYmVfaW5pdAktCWNoZWNrIGZvciA0MC84MCBwaW4KQEAgLTU0LDE2ICs1NCwxNyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkvKiBTcGVjaWFsIGhhbmRsaW5nIG5lZWRlZCBpZiB5b3UgaGF2ZSBzZWN0b3Igb3IgTEJBNDggbGltaXRzICovCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLyogVXNlIHN0YW5kYXJkIENIUyBtYXBwaW5nIHJ1bGVzICovCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbmV0Y2VsbF9vcHMgPSB7CkBAIC0xNTIsNiArMTUzLDggQEAKIAkuaWRfdGFibGUJCT0gbmV0Y2VsbF9wY2lfdGJsLAogCS5wcm9iZQkJCT0gbmV0Y2VsbF9pbml0X29uZSwKIAkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBuZXRjZWxsX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKaW5kZXggMmEzZGJlZS4uYzMwMzJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9uczg3NDEwIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjIiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuMyIKIAogLyoqCiAgKgluczg3NDEwX3ByZV9yZXNldAkJLQlwcm9iZSBiZWdpbgpAQCAtMTQ5LDE0ICsxNDksMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnM4NzQxMF9wb3J0X29wcyA9IHsKQEAgLTIwOSw3ICsyMTEsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBuczg3NDEwLAogCS5wcm9iZSAJCT0gbnM4NzQxMF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG5zODc0MTBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwppbmRleCBmYzk0N2RmLi4xMGFjM2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwpAQCAtMjI0LDE0ICsyMjQsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgb2xkcGlpeF9wYXRhX29wcyA9IHsKQEAgLTMxMyw2ICszMTUsOCBAQAogCS5pZF90YWJsZQkJPSBvbGRwaWl4X3BjaV90YmwsCiAJLnByb2JlCQkJPSBvbGRwaWl4X2luaXRfb25lLAogCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAkJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG9sZHBpaXhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwppbmRleCBhNzMyMGJhLi5jMjk4OGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX29wdGkiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi43IgogCiBlbnVtIHsKIAlSRUFEX1JFRwk9IDAsCS8qIGluZGV4IG9mIFJlYWQgY3ljbGUgdGltaW5nIHJlZ2lzdGVyICovCkBAIC0xMDksMzAgKzEwOSw2IEBACiAJb3V0YigweDgzLCByZWdpbyArIDIpOwogfQogCi0jaWYgMAotLyoqCi0gKglvcHRpX3JlYWRfcmVnCQktCWNvbnRyb2wgcmVnaXN0ZXIgcmVhZAotICoJQGFwOiBBVEEgcG9ydAotICoJQHJlZzogY29udHJvbCByZWdpc3RlciBudW1iZXIKLSAqCi0gKglUaGUgT3B0aSB1c2VzIG1hZ2ljICd0cmFwZG9vcicgcmVnaXN0ZXIgYWNjZXNzZXMgdG8gZG8gY29uZmlndXJhdGlvbgotICoJcmF0aGVyIHRoYW4gdXNpbmcgUENJIHNwYWNlIGFzIG90aGVyIGNvbnRyb2xsZXJzIGRvLiBUaGUgZG91YmxlIGludwotICoJb24gdGhlIGVycm9yIHJlZ2lzdGVyIGFjdGl2YXRlcyBjb25maWd1cmF0aW9uIG1vZGUuIFdlIGNhbiB0aGVuIHJlYWQKLSAqCXRoZSBjb250cm9sIHJlZ2lzdGVyCi0gKi8KLQotc3RhdGljIHU4IG9wdGlfcmVhZF9yZWcoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHJlZykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ2lvID0gYXAtPmlvYWRkci5jbWRfYWRkcjsKLQl1OCByZXQ7Ci0JaW53KHJlZ2lvICsgMSk7Ci0JaW53KHJlZ2lvICsgMSk7Ci0Jb3V0YigzLCByZWdpbyArIDIpOwotCXJldCA9IGluYihyZWdpbyArIHJlZyk7Ci0Jb3V0YigweDgzLCByZWdpbyArIDIpOwotfQotI2VuZGlmCi0KIC8qKgogICoJb3B0aV9zZXRfcGlvbW9kZQktCXNldCBpbml0aWFsIFBJTyBtb2RlIGRhdGEKICAqCUBhcDogQVRBIGludGVyZmFjZQpAQCAtMTk1LDIwICsxNzEsMjEgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgb3B0aV9wb3J0X29wcyA9IHsKIAkucG9ydF9kaXNhYmxlCT0gYXRhX3BvcnRfZGlzYWJsZSwKIAkuc2V0X3Bpb21vZGUJPSBvcHRpX3NldF9waW9tb2RlLAotLyoJLnNldF9kbWFtb2RlCT0gb3B0aV9zZXRfZG1hbW9kZSwgKi8KIAkudGZfbG9hZAk9IGF0YV90Zl9sb2FkLAogCS50Zl9yZWFkCT0gYXRhX3RmX3JlYWQsCiAJLmNoZWNrX3N0YXR1cyAJPSBhdGFfY2hlY2tfc3RhdHVzLApAQCAtMjY2LDcgKzI0Myw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IG9wdGksCiAJLnByb2JlIAkJPSBvcHRpX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgb3B0aV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCmluZGV4IGM2OTA2YjQuLjgwZDExMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfb3B0aWRtYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi4yIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjMiCiAKIGVudW0gewogCVJFQURfUkVHCT0gMCwJLyogaW5kZXggb2YgUmVhZCBjeWNsZSB0aW1pbmcgcmVnaXN0ZXIgKi8KQEAgLTM1MiwxNCArMzUyLDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG9wdGlkbWFfcG9ydF9vcHMgPSB7CkBAIC01MjEsNyArNTIzLDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gb3B0aWRtYSwKIAkucHJvYmUgCQk9IG9wdGlkbWFfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBvcHRpZG1hX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCmluZGV4IGU5M2VhMjcuLjllZDdmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYwpAQCAtNjIsMTMgKzYyLDEzIEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTE1NCwxOSArMTU0LDEyIEBACiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKIAl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCi0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShwZGV2LCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShwZGV2LCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUocGRldiwgJnR1cGxlLCAmc3RrLT5wYXJzZSkpOwotCXBkZXYtPmNvbmYuQ29uZmlnQmFzZSA9IHN0ay0+cGFyc2UuY29uZmlnLmJhc2U7Ci0JcGRldi0+Y29uZi5QcmVzZW50ID0gc3RrLT5wYXJzZS5jb25maWcucm1hc2tbMF07CiAKIAkvKiBTZWUgaWYgd2UgaGF2ZSBhIG1hbnVmYWN0dXJlciBpZGVudGlmaWVyLiBVc2UgaXQgdG8gc2V0IGlzX2ttZSBmb3IKIAkgICB2ZW5kb3IgcXVpcmtzICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKLQlpZiAoIXBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocGRldiwgJnR1cGxlKSAmJiAhcGNtY2lhX2dldF90dXBsZV9kYXRhKHBkZXYsICZ0dXBsZSkgJiYgIXBjbWNpYV9wYXJzZV90dXBsZShwZGV2LCAmdHVwbGUsICZzdGstPnBhcnNlKSkKLQkJCWlzX2ttZSA9ICgoc3RrLT5wYXJzZS5tYW5maWQubWFuZiA9PSBNQU5GSURfS01FKSAmJiAoKHN0ay0+cGFyc2UubWFuZmlkLmNhcmQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0EpIHx8IChzdGstPnBhcnNlLm1hbmZpZC5jYXJkID09IFBST0RJRF9LTUVfS1hMQzAwNV9CKSkpOworCWlzX2ttZSA9ICgocGRldi0+bWFuZl9pZCA9PSBNQU5GSURfS01FKSAmJgorCQkgICgocGRldi0+Y2FyZF9pZCA9PSBQUk9ESURfS01FX0tYTEMwMDVfQSkgfHwKKwkJICAgKHBkZXYtPmNhcmRfaWQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0IpKSk7CiAKIAkvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHJpZ2h0Li4uIGxvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCiAJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHBkZXYsICZzdGstPmNvbmYpKTsKQEAgLTM1Niw4ICszNDksMTAgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU01JIFZFTkRPUiIsICJTTUkgUFJPRFVDVCIsIDB4MzA4OTZjOTIsIDB4NzAzY2M1ZjYpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJUT1NISUJBIiwgIk1LMjAwMU1QTCIsIDB4YjQ1ODVhMWEsIDB4MzQ4OWUwMDMpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIlRSQU5TQ0VORCAgICA1MTJNICAgIiwgMHhkMDkwOTQ0MyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRSQU5TQ0VORCIsICJUUzFHQ0Y4MCIsIDB4NzA5YjFiZjEsIDB4MmE1NGQ0YjEpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJUUkFOU0NFTkQiLCAiVFM0R0NGMTIwIiwgMHg3MDliMWJmMSwgMHhmNTRhOTFjOCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIldJVCIsICJJREUxNiIsIDB4MjQ0ZTU5OTQsIDB4M2UyMzI4NTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJXRUlEQSIsICJUV1RUSSIsIDB4Y2M3Y2Y2OWMsIDB4MjEyYmI5MTgpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIlNUSSBGbGFzaCIsIDB4ZTRhMTMyMDkpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTVEkiLCAiRmxhc2ggNS4wIiwgMHhiZjJkZjE4ZCwgMHg4Y2I1N2EwZSksCiAJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJTYW5EaXNrIiwgIkNvbm5lY3RQbHVzIiwgMHg3YTk1NGJkOSwgMHg3NGJlMDBjNiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKaW5kZXggZDg5NGQ5OS4uNzZkZDFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYwpAQCAtMTM0LDEzICsxMzQsMTMgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIApAQCAtODUzLDcgKzg1Myw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBkYzIwMjd4X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwZGMyMDI3eF9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGRjMjAyN3hfcGNpX2RyaXZlcik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDJ4eF9vbGQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMKaW5kZXggNWJhOWViMi4uYWQ2OTFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDJ4eF9vbGQuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMnh4X29sZC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfcGRjMjAyeHhfb2xkIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuMyIKIAogLyoqCiAgKglwZGMyMDI0eF9wcmVfcmVzZXQJCS0JcHJvYmUgYmVnaW4KQEAgLTYzLDcgKzYzLDcgQEAKIH0KIAogLyoqCi0gKglwZGNfY29uZmlndXJlX3Bpb21vZGUJLQlzZXQgY2hpcCBQSU8gdGltaW5nCisgKglwZGMyMDJ4eF9jb25maWd1cmVfcGlvbW9kZQktCXNldCBjaGlwIFBJTyB0aW1pbmcKICAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQGFkZXY6IEFUQSBkZXZpY2UKICAqCUBwaW86IFBJTyBtb2RlCkBAIC03Myw3ICs3Myw3IEBACiAgKgl2ZXJzYQogICovCiAKLXN0YXRpYyB2b2lkIHBkY19jb25maWd1cmVfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgaW50IHBpbykKK3N0YXRpYyB2b2lkIHBkYzIwMnh4X2NvbmZpZ3VyZV9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCBpbnQgcGlvKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAlpbnQgcG9ydCA9IDB4NjAgKyA0ICogYXAtPnBvcnRfbm8gKyAyICogYWRldi0+ZGV2bm87CkBAIC05OCw3ICs5OCw3IEBACiB9CiAKIC8qKgotICoJcGRjX3NldF9waW9tb2RlCS0Jc2V0IGluaXRpYWwgUElPIG1vZGUgZGF0YQorICoJcGRjMjAyeHhfc2V0X3Bpb21vZGUJLQlzZXQgaW5pdGlhbCBQSU8gbW9kZSBkYXRhCiAgKglAYXA6IEFUQSBpbnRlcmZhY2UKICAqCUBhZGV2OiBBVEEgZGV2aWNlCiAgKgpAQCAtMTA2LDEzICsxMDYsMTMgQEAKICAqCWJ1dCB3ZSB3YW50IHRvIHNldCB0aGUgUElPIHRpbWluZyBieSBkZWZhdWx0LgogICovCiAKLXN0YXRpYyB2b2lkIHBkY19zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3N0YXRpYyB2b2lkIHBkYzIwMnh4X3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXBkY19jb25maWd1cmVfcGlvbW9kZShhcCwgYWRldiwgYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wKTsKKwlwZGMyMDJ4eF9jb25maWd1cmVfcGlvbW9kZShhcCwgYWRldiwgYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wKTsKIH0KIAogLyoqCi0gKglwZGNfY29uZmlndXJlX2RtYW1vZGUJLQlzZXQgRE1BIG1vZGUgaW4gY2hpcAorICoJcGRjMjAyeHhfY29uZmlndXJlX2RtYW1vZGUJLQlzZXQgRE1BIG1vZGUgaW4gY2hpcAogICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQogICoKQEAgLTEyMCw3ICsxMjAsNyBAQAogICoJdG8gb2NjdXIuCiAgKi8KIAotc3RhdGljIHZvaWQgcGRjX3NldF9kbWFtb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQorc3RhdGljIHZvaWQgcGRjMjAyeHhfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCWludCBwb3J0ID0gMHg2MCArIDQgKiBhcC0+cG9ydF9ubyArIDIgKiBhZGV2LT5kZXZubzsKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJLyogVGhlIERNQSBjbG9ja3MgbWF5IGhhdmUgYmVlbiB0cmFzaGVkIGJ5IGEgcmVzZXQuIEZJWE1FOiBtYWtlIGNvbmRpdGlvbmFsCiAJICAgYW5kIG1vdmUgdG8gcWNfaXNzdWUgPyAqLwotCXBkY19zZXRfZG1hbW9kZShhcCwgcWMtPmRldik7CisJcGRjMjAyeHhfc2V0X2RtYW1vZGUoYXAsIHFjLT5kZXYpOwogCiAJLyogQ2FzZXMgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgY29tcGxldGUgY29ycmVjdGx5IHdpdGhvdXQgaGVscCAqLwogCWlmICgodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSB8fCAgdGYtPnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkKQEAgLTI1NCw3ICsyNTQsNyBAQAogCWFkZXYtPm1heF9zZWN0b3JzID0gMjU2OwogfQogCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwZGNfc2h0ID0geworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcGRjMjAyeHhfc2h0ID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSBEUlZfTkFNRSwKIAkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLApAQCAtMjYyLDIwICsyNjIsMjIgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGRjMjAyNHhfcG9ydF9vcHMgPSB7CiAJLnBvcnRfZGlzYWJsZQk9IGF0YV9wb3J0X2Rpc2FibGUsCi0JLnNldF9waW9tb2RlCT0gcGRjX3NldF9waW9tb2RlLAotCS5zZXRfZG1hbW9kZQk9IHBkY19zZXRfZG1hbW9kZSwKKwkuc2V0X3Bpb21vZGUJPSBwZGMyMDJ4eF9zZXRfcGlvbW9kZSwKKwkuc2V0X2RtYW1vZGUJPSBwZGMyMDJ4eF9zZXRfZG1hbW9kZSwKIAkubW9kZV9maWx0ZXIJPSBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyLAogCS50Zl9sb2FkCT0gYXRhX3RmX2xvYWQsCiAJLnRmX3JlYWQJPSBhdGFfdGZfcmVhZCwKQEAgLTMwNyw4ICszMDksOCBAQAogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGRjMjAyNnhfcG9ydF9vcHMgPSB7CiAJLnBvcnRfZGlzYWJsZQk9IGF0YV9wb3J0X2Rpc2FibGUsCi0JLnNldF9waW9tb2RlCT0gcGRjX3NldF9waW9tb2RlLAotCS5zZXRfZG1hbW9kZQk9IHBkY19zZXRfZG1hbW9kZSwKKwkuc2V0X3Bpb21vZGUJPSBwZGMyMDJ4eF9zZXRfcGlvbW9kZSwKKwkuc2V0X2RtYW1vZGUJPSBwZGMyMDJ4eF9zZXRfZG1hbW9kZSwKIAkubW9kZV9maWx0ZXIJPSBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyLAogCS50Zl9sb2FkCT0gYXRhX3RmX2xvYWQsCiAJLnRmX3JlYWQJPSBhdGFfdGZfcmVhZCwKQEAgLTMzOSwxMSArMzQxLDExIEBACiAJLmhvc3Rfc3RvcAk9IGF0YV9ob3N0X3N0b3AKIH07CiAKLXN0YXRpYyBpbnQgcGRjX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgcGRjMjAyeHhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvWzNdID0gewogCQl7Ci0JCQkuc2h0ID0gJnBkY19zaHQsCisJCQkuc2h0ID0gJnBkYzIwMnh4X3NodCwKIAkJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkJLnBpb19tYXNrID0gMHgxZiwKIAkJCS5td2RtYV9tYXNrID0gMHgwNywKQEAgLTM1MSw3ICszNTMsNyBAQAogCQkJLnBvcnRfb3BzID0gJnBkYzIwMjR4X3BvcnRfb3BzCiAJCX0sCiAJCXsKLQkJCS5zaHQgPSAmcGRjX3NodCwKKwkJCS5zaHQgPSAmcGRjMjAyeHhfc2h0LAogCQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCQkucGlvX21hc2sgPSAweDFmLAogCQkJLm13ZG1hX21hc2sgPSAweDA3LApAQCAtMzU5LDcgKzM2MSw3IEBACiAJCQkucG9ydF9vcHMgPSAmcGRjMjAyNnhfcG9ydF9vcHMKIAkJfSwKIAkJewotCQkJLnNodCA9ICZwZGNfc2h0LAorCQkJLnNodCA9ICZwZGMyMDJ4eF9zaHQsCiAJCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJCS5waW9fbWFzayA9IDB4MWYsCiAJCQkubXdkbWFfbWFzayA9IDB4MDcsCkBAIC0zODUsNyArMzg3LDcgQEAKIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwZGNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwZGMyMDJ4eFtdID0gewogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjQ2KSwgMCB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjYyKSwgMSB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjYzKSwgMSB9LApAQCAtMzk1LDI4ICszOTcsMzAgQEAKIAl7IH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGRjX3BjaV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGRjMjAyeHhfcGNpX2RyaXZlciA9IHsKIAkubmFtZSAJCT0gRFJWX05BTUUsCi0JLmlkX3RhYmxlCT0gcGRjLAotCS5wcm9iZSAJCT0gcGRjX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLmlkX3RhYmxlCT0gcGRjMjAyeHgsCisJLnByb2JlIAkJPSBwZGMyMDJ4eF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwZGNfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcGRjMjAyeHhfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwZGNfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBkYzIwMnh4X3BjaV9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGRjX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwZGMyMDJ4eF9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwZGNfcGNpX2RyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwZGMyMDJ4eF9wY2lfZHJpdmVyKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKIE1PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgUHJvbWlzZSAyMDI0eCBhbmQgMjAyNjItMjAyNjciKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwZGMpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBkYzIwMnh4KTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKIAotbW9kdWxlX2luaXQocGRjX2luaXQpOwotbW9kdWxlX2V4aXQocGRjX2V4aXQpOworbW9kdWxlX2luaXQocGRjMjAyeHhfaW5pdCk7Cittb2R1bGVfZXhpdChwZGMyMDJ4eF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDNiMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogR2VuZXJpYyBwbGF0Zm9ybSBkZXZpY2UgUEFUQSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBCYXNlZCBvbiBwYXRhX3BjbWNpYToKKyAqCisgKiAgIENvcHlyaWdodCAyMDA1LTIwMDYgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9hdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXRhX3BsYXRmb3JtLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgInBhdGFfcGxhdGZvcm0iCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuMiIKKworc3RhdGljIGludCBwaW9fbWFzayA9IDE7CisKKy8qCisgKiBQcm92aWRlIG91ciBvd24gc2V0X21vZGUoKSBhcyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZyB0aGF0IGhhcworICogYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuLgorICovCitzdGF0aWMgdm9pZCBwYXRhX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOworCisJCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSkgeworCQkJLyogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgKi8KKwkJCWRldi0+cGlvX21vZGUgPSBkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7CisJCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOworCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfUElPOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwYXRhX3BsYXRmb3JtX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFVubWFwIHRoZSBiYXNlcyBmb3IgTU1JTworCSAqLworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKSB7CisJCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmN0bF9hZGRyKTsKKwkJCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWFwLT5pb2FkZHIuY21kX2FkZHIpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwYXRhX3BsYXRmb3JtX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBhdGFfcGxhdGZvcm1fcG9ydF9vcHMgPSB7CisJLnNldF9tb2RlCQk9IHBhdGFfcGxhdGZvcm1fc2V0X21vZGUsCisKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisKKwkuZnJlZXplCQkJPSBhdGFfYm1kbWFfZnJlZXplLAorCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKKwkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyX25vaXJxLAorCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gcGF0YV9wbGF0Zm9ybV9ob3N0X3N0b3AKK307CisKK3N0YXRpYyB2b2lkIHBhdGFfcGxhdGZvcm1fc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciwKKwkJCQkgICAgIHN0cnVjdCBwYXRhX3BsYXRmb3JtX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gMDsKKworCS8qIEZpeHVwIHRoZSBwb3J0IHNoaWZ0IGZvciBwbGF0Zm9ybXMgdGhhdCBuZWVkIGl0ICovCisJaWYgKGluZm8gJiYgaW5mby0+aW9wb3J0X3NoaWZ0KQorCQlzaGlmdCA9IGluZm8tPmlvcG9ydF9zaGlmdDsKKworCWlvYWRkci0+ZGF0YV9hZGRyCT0gaW9hZGRyLT5jbWRfYWRkciArIChBVEFfUkVHX0RBVEEgICAgPDwgc2hpZnQpOworCWlvYWRkci0+ZXJyb3JfYWRkcgk9IGlvYWRkci0+Y21kX2FkZHIgKyAoQVRBX1JFR19FUlIgICAgIDw8IHNoaWZ0KTsKKwlpb2FkZHItPmZlYXR1cmVfYWRkcgk9IGlvYWRkci0+Y21kX2FkZHIgKyAoQVRBX1JFR19GRUFUVVJFIDw8IHNoaWZ0KTsKKwlpb2FkZHItPm5zZWN0X2FkZHIJPSBpb2FkZHItPmNtZF9hZGRyICsgKEFUQV9SRUdfTlNFQ1QgICA8PCBzaGlmdCk7CisJaW9hZGRyLT5sYmFsX2FkZHIJPSBpb2FkZHItPmNtZF9hZGRyICsgKEFUQV9SRUdfTEJBTCAgICA8PCBzaGlmdCk7CisJaW9hZGRyLT5sYmFtX2FkZHIJPSBpb2FkZHItPmNtZF9hZGRyICsgKEFUQV9SRUdfTEJBTSAgICA8PCBzaGlmdCk7CisJaW9hZGRyLT5sYmFoX2FkZHIJPSBpb2FkZHItPmNtZF9hZGRyICsgKEFUQV9SRUdfTEJBSCAgICA8PCBzaGlmdCk7CisJaW9hZGRyLT5kZXZpY2VfYWRkcgk9IGlvYWRkci0+Y21kX2FkZHIgKyAoQVRBX1JFR19ERVZJQ0UgIDw8IHNoaWZ0KTsKKwlpb2FkZHItPnN0YXR1c19hZGRyCT0gaW9hZGRyLT5jbWRfYWRkciArIChBVEFfUkVHX1NUQVRVUyAgPDwgc2hpZnQpOworCWlvYWRkci0+Y29tbWFuZF9hZGRyCT0gaW9hZGRyLT5jbWRfYWRkciArIChBVEFfUkVHX0NNRCAgICAgPDwgc2hpZnQpOworfQorCisvKioKKyAqCXBhdGFfcGxhdGZvcm1fcHJvYmUJCS0JYXR0YWNoIGEgcGxhdGZvcm0gaW50ZXJmYWNlCisgKglAcGRldjogcGxhdGZvcm0gZGV2aWNlCisgKgorICoJUmVnaXN0ZXIgYSBwbGF0Zm9ybSBidXMgSURFIGludGVyZmFjZS4gU3VjaCBpbnRlcmZhY2VzIGFyZSBQSU8gYW5kIHdlCisgKglhc3N1bWUgZG8gbm90IHN1cHBvcnQgSVJRIHNoYXJpbmcuCisgKgorICoJUGxhdGZvcm0gZGV2aWNlcyBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbiAzIHJlc291cmNlcyBwZXIgcG9ydDoKKyAqCisgKgkJLSBJL08gQmFzZSAoSU9SRVNPVVJDRV9JTyBvciBJT1JFU09VUkNFX01FTSkKKyAqCQktIENUTCBCYXNlIChJT1JFU09VUkNFX0lPIG9yIElPUkVTT1VSQ0VfTUVNKQorICoJCS0gSVJRCSAgIChJT1JFU09VUkNFX0lSUSkKKyAqCisgKglJZiB0aGUgYmFzZSByZXNvdXJjZXMgYXJlIGJvdGggbWVtIHR5cGVzLCB0aGUgaW9yZW1hcCgpIGlzIGhhbmRsZWQKKyAqCWhlcmUuIEZvciBJT1JFU09VUkNFX0lPLCBpdCdzIGFzc3VtZWQgdGhhdCB0aGVyZSdzIG5vIHJlbWFwcGluZworICoJbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXRhX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICppb19yZXMsICpjdGxfcmVzOworCXN0cnVjdCBhdGFfcHJvYmVfZW50IGFlOworCXVuc2lnbmVkIGludCBtbWlvOworCWludCByZXQ7CisKKwkvKgorCSAqIFNpbXBsZSByZXNvdXJjZSB2YWxpZGF0aW9uIC4uCisJICovCisJaWYgKHVubGlrZWx5KHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBudW1iZXIgb2YgcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIEkvTyBiYXNlIGZpcnN0CisJICovCisJaW9fcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOworCWlmIChpb19yZXMgPT0gTlVMTCkgeworCQlpb19yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCQlpZiAodW5saWtlbHkoaW9fcmVzID09IE5VTEwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBUaGVuIHRoZSBDVEwgYmFzZQorCSAqLworCWN0bF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMSk7CisJaWYgKGN0bF9yZXMgPT0gTlVMTCkgeworCQljdGxfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwkJaWYgKHVubGlrZWx5KGN0bF9yZXMgPT0gTlVMTCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBNTUlPCisJICovCisJbW1pbyA9ICgoIGlvX3Jlcy0+ZmxhZ3MgPT0gSU9SRVNPVVJDRV9NRU0pICYmCisJCShjdGxfcmVzLT5mbGFncyA9PSBJT1JFU09VUkNFX01FTSkpOworCisJLyoKKwkgKiBOb3cgdGhhdCB0aGF0J3Mgb3V0IG9mIHRoZSB3YXksIHdpcmUgdXAgdGhlIHBvcnQuLgorCSAqLworCW1lbXNldCgmYWUsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX3Byb2JlX2VudCkpOworCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKKwlhZS5kZXYgPSAmcGRldi0+ZGV2OworCWFlLnBvcnRfb3BzID0gJnBhdGFfcGxhdGZvcm1fcG9ydF9vcHM7CisJYWUuc2h0ID0gJnBhdGFfcGxhdGZvcm1fc2h0OworCWFlLm5fcG9ydHMgPSAxOworCWFlLnBpb19tYXNrID0gcGlvX21hc2s7CisJYWUuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlhZS5pcnFfZmxhZ3MgPSAwOworCWFlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVDsKKworCS8qCisJICogSGFuZGxlIHRoZSBNTUlPIGNhc2UKKwkgKi8KKwlpZiAobW1pbykgeworCQlhZS5wb3J0X2ZsYWdzIHw9IEFUQV9GTEFHX01NSU87CisKKwkJYWUucG9ydFswXS5jbWRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoaW9fcmVzLT5zdGFydCwKKwkJCQlpb19yZXMtPmVuZCAtIGlvX3Jlcy0+c3RhcnQgKyAxKTsKKwkJaWYgKHVubGlrZWx5KCFhZS5wb3J0WzBdLmNtZF9hZGRyKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbWFwIElPIGJhc2VcbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisJCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKGN0bF9yZXMtPnN0YXJ0LAorCQkJCWN0bF9yZXMtPmVuZCAtIGN0bF9yZXMtPnN0YXJ0ICsgMSk7CisJCWlmICh1bmxpa2VseSghYWUucG9ydFswXS5jdGxfYWRkcikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBDVEwgYmFzZVxuIik7CisJCQlyZXQgPSAtRU5YSU87CisJCQlnb3RvIGJhZF9yZW1hcDsKKwkJfQorCX0gZWxzZSB7CisJCWFlLnBvcnRbMF0uY21kX2FkZHIgPSBpb19yZXMtPnN0YXJ0OworCQlhZS5wb3J0WzBdLmN0bF9hZGRyID0gY3RsX3Jlcy0+c3RhcnQ7CisJfQorCisJYWUucG9ydFswXS5hbHRzdGF0dXNfYWRkciA9IGFlLnBvcnRbMF0uY3RsX2FkZHI7CisKKwlwYXRhX3BsYXRmb3JtX3NldHVwX3BvcnQoJmFlLnBvcnRbMF0sIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKTsKKworCWlmICh1bmxpa2VseShhdGFfZGV2aWNlX2FkZCgmYWUpID09IDApKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gYWRkX2ZhaWxlZDsKKwl9CisKKwlyZXR1cm4gMDsKKworYWRkX2ZhaWxlZDoKKwlpZiAoYWUucG9ydFswXS5jdGxfYWRkciAmJiBtbWlvKQorCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilhZS5wb3J0WzBdLmN0bF9hZGRyKTsKK2JhZF9yZW1hcDoKKwlpZiAoYWUucG9ydFswXS5jbWRfYWRkciAmJiBtbWlvKQorCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilhZS5wb3J0WzBdLmNtZF9hZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJcGF0YV9wbGF0Zm9ybV9yZW1vdmUJLQl1bnBsdWcgYSBwbGF0Zm9ybSBpbnRlcmZhY2UKKyAqCUBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKKyAqCisgKglBIHBsYXRmb3JtIGJ1cyBBVEEgZGV2aWNlIGhhcyBiZWVuIHVucGx1Z2dlZC4gUGVyZm9ybSB0aGUgbmVlZGVkCisgKgljbGVhbnVwLiBBbHNvIGNhbGxlZCBvbiBtb2R1bGUgdW5sb2FkIGZvciBhbnkgYWN0aXZlIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHBhdGFfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWF0YV9ob3N0X3JlbW92ZShob3N0KTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYXRhX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGF0YV9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBhdGFfcGxhdGZvcm1fcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSBEUlZfTkFNRSwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwYXRhX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwYXRhX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYXRhX3BsYXRmb3JtX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGF0YV9wbGF0Zm9ybV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQocGF0YV9wbGF0Zm9ybV9pbml0KTsKK21vZHVsZV9leGl0KHBhdGFfcGxhdGZvcm1fZXhpdCk7CisKK21vZHVsZV9wYXJhbShwaW9fbWFzaywgaW50LCAwKTsKKworTU9EVUxFX0FVVEhPUigiUGF1bCBNdW5kdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBwbGF0Zm9ybSBkZXZpY2UgQVRBIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwppbmRleCAyYzNjYzBjLi4zNmY2MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMKQEAgLTE1NywxMyArMTU3LDEzIEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jIGIvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMKaW5kZXggMWFmODNkNy4uMDY1NTQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMKQEAgLTIyMCwxNCArMjIwLDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHJhZGlzeXNfcGF0YV9vcHMgPSB7CkBAIC0zMTAsNiArMzEyLDggQEAKIAkuaWRfdGFibGUJCT0gcmFkaXN5c19wY2lfdGJsLAogCS5wcm9iZQkJCT0gcmFkaXN5c19pbml0X29uZSwKIAkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByYWRpc3lzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCmluZGV4IDQ1MzNiNjMuLjM2NzdjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX3J6MTAwMCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yLjMiCiAKIAogLyoqCkBAIC04MywxNCArODMsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcnoxMDAwX3BvcnRfb3BzID0gewpAQCAtMTI4LDYgKzEzMCwxOSBAQAogCS5ob3N0X3N0b3AJPSBhdGFfaG9zdF9zdG9wCiB9OwogCitzdGF0aWMgaW50IHJ6MTAwMF9maWZvX2Rpc2FibGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHJlZzsKKwkvKiBCZSBleGNlcHRpb25hbGx5IHBhcmFub2lkIGFzIHdlIG11c3QgYmUgc3VyZSB0byBhcHBseSB0aGUgZml4ICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NDAsICZyZWcpICE9IDApCisJCXJldHVybiAtMTsKKwlyZWcgJj0gMHhERkZGOworCWlmIChwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgMHg0MCwgcmVnKSAhPSAwKQorCQlyZXR1cm4gLTE7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBkaXNhYmxlZCBjaGlwc2V0IHJlYWRhaGVhZC5cbiIpOworCXJldHVybiAwOworfQorCiAvKioKICAqCXJ6MTAwMF9pbml0X29uZSAtIFJlZ2lzdGVyIFJaMTAwMCBBVEEgUENJIGRldmljZSB3aXRoIGtlcm5lbCBzZXJ2aWNlcwogICoJQHBkZXY6IFBDSSBkZXZpY2UgdG8gcmVnaXN0ZXIKQEAgLTE0Miw3ICsxNTcsNiBAQAogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl07Ci0JdTE2IHJlZzsKIAlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodCA9ICZyejEwMDBfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKQEAgLTE1MywyMyArMTY3LDI1IEBACiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKLQkvKiBCZSBleGNlcHRpb25hbGx5IHBhcmFub2lkIGFzIHdlIG11c3QgYmUgc3VyZSB0byBhcHBseSB0aGUgZml4ICovCi0JaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NDAsICZyZWcpICE9IDApCi0JCWdvdG8gZmFpbDsKLQlyZWcgJj0gMHhERkZGOwotCWlmIChwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgMHg0MCwgcmVnKSAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBkaXNhYmxlZCBjaGlwc2V0IHJlYWRhaGVhZC5cbiIpOwotCi0JcG9ydF9pbmZvWzBdID0gJmluZm87Ci0JcG9ydF9pbmZvWzFdID0gJmluZm87Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKLWZhaWw6CisJaWYgKHJ6MTAwMF9maWZvX2Rpc2FibGUocGRldikgPT0gMCkgeworCQlwb3J0X2luZm9bMF0gPSAmaW5mbzsKKwkJcG9ydF9pbmZvWzFdID0gJmluZm87CisJCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CisJfQogCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBmYWlsZWQgdG8gZGlzYWJsZSByZWFkLWFoZWFkIG9uIGNoaXBzZXQuLlxuIik7CiAJLyogTm90IHNhZmUgdG8gdXNlIHNvIHNraXAgKi8KIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorc3RhdGljIGludCByejEwMDBfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwkvKiBJZiB0aGlzIGZhaWxzIG9uIHJlc3VtZSAod2hpY2ggaXMgYSAiY2FudCBoYXBwZW4iIGNhc2UpLCB3ZQorCSAgIG11c3Qgc3RvcCBhcyBhbnkgcHJvZ3Jlc3Mgcmlza3MgZGF0YSBsb3NzICovCisJaWYgKHJ6MTAwMF9maWZvX2Rpc2FibGUocGRldikpCisJCXBhbmljKCJyejEwMDAgZmlmbyIpOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwYXRhX3J6MTAwMFtdID0gewogCXsgUENJX1ZERVZJQ0UoUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDApLCB9LAogCXsgUENJX1ZERVZJQ0UoUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDEpLCB9LApAQCAtMTgxLDcgKzE5Nyw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IHBhdGFfcnoxMDAwLAogCS5wcm9iZSAJCT0gcnoxMDAwX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcnoxMDAwX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByejEwMDBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKaW5kZXggMDY3ZDlkMi4uYTNiMzViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInNjMTIwMCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi4zIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yLjQiCiAKICNkZWZpbmUgU0MxMjAwX1JFVl9BCTB4MDAKICNkZWZpbmUgU0MxMjAwX1JFVl9CMQkweDAxCkBAIC0xODYsMTQgKzE4NiwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzYzEyMDBfcG9ydF9vcHMgPSB7CkBAIC0yNjMsNyArMjY1LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gc2MxMjAwLAogCS5wcm9iZSAJCT0gc2MxMjAwX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2MxMjAwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYwppbmRleCA1YmJmNzZlLi5mMDJiNmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfc2VydmVyd29ya3MiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuNyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy45IgogCiAjZGVmaW5lIFNWV0tTX0NTQjVfUkVWSVNJT05fTkVXCTB4OTIgLyogbWluIFBDSV9SRVZJU0lPTl9JRCBmb3IgVURNQTUgKEEyLjApICovCiAjZGVmaW5lIFNWV0tTX0NTQjZfUkVWSVNJT04JMHhhMCAvKiBtaW4gUENJX1JFVklTSU9OX0lEIGZvciBVRE1BNCAoQTEuMCkgKi8KQEAgLTMxOCwxNCArMzE4LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHNlcnZlcndvcmtzX29zYjRfcG9ydF9vcHMgPSB7CkBAIC01NTMsNiArNTU1LDMwIEBACiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCBwb3J0cyk7CiB9CiAKK3N0YXRpYyBpbnQgc2VydmVyd29ya3NfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwkvKiBGb3JjZSBtYXN0ZXIgbGF0ZW5jeSB0aW1lciB0byA2NCBQQ0kgY2xvY2tzICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKKwkKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkKKwl7CisJCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFOgorCQkJc2VydmVyd29ya3NfZml4dXBfb3NiNChwZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERToKKwkJCWF0YV9wY2lfY2xlYXJfc2ltcGxleChwZGV2KTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyOgorCQkJc2VydmVyd29ya3NfZml4dXBfY3NiKHBkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDEwMDBJREU6CisJCQlzZXJ2ZXJ3b3Jrc19maXh1cF9odDEwMDAocGRldik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShwZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNlcnZlcndvcmtzW10gPSB7CiAJeyBQQ0lfVkRFVklDRShTRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFKSwgMH0sCiAJeyBQQ0lfVkRFVklDRShTRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFKSwgMn0sCkBAIC01NjcsNyArNTkzLDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gc2VydmVyd29ya3MsCiAJLnByb2JlIAkJPSBzZXJ2ZXJ3b3Jrc19pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNlcnZlcndvcmtzX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzZXJ2ZXJ3b3Jrc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCA0YTJiNzJiLi4zMmNmMGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9zaWw2ODAiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC4xIgogCiAvKioKICAqCXNpbDY4MF9zZWxyZWcJCS0JcmV0dXJuIHJlZ2lzdGVyIGJhc2UKQEAgLTIxOCwxMyArMjE4LDEzIEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTI2MiwzMiArMjYyLDIwIEBACiAJLmhvc3Rfc3RvcAk9IGF0YV9ob3N0X3N0b3AKIH07CiAKLXN0YXRpYyBpbnQgc2lsNjgwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCisvKioKKyAqCXNpbDY4MF9pbml0X2NoaXAJCS0JY2hpcCBzZXR1cAorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKglQZXJmb3JtIGFsbCB0aGUgY2hpcCBzZXR1cCB3aGljaCBtdXN0IGJlIGRvbmUgYm90aCB3aGVuIHRoZSBkZXZpY2UKKyAqCWlzIHBvd2VyZWQgdXAgb24gYm9vdCBhbmQgd2hlbiB3ZSByZXN1bWUgaW4gY2FzZSB3ZSByZXN1bWVkIGZyb20gUkFNLgorICoJUmV0dXJucyB0aGUgZmluYWwgY2xvY2sgc2V0dGluZ3MuCisgKi8KKyAKK3N0YXRpYyB1OCBzaWw2ODBfaW5pdF9jaGlwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewotCQkuc2h0ID0gJnNpbDY4MF9zaHQsCi0JCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAotCQkucGlvX21hc2sgPSAweDFmLAotCQkubXdkbWFfbWFzayA9IDB4MDcsCi0JCS51ZG1hX21hc2sgPSAweDdmLAotCQkucG9ydF9vcHMgPSAmc2lsNjgwX3BvcnRfb3BzCi0JfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19zbG93ID0gewotCQkuc2h0ID0gJnNpbDY4MF9zaHQsCi0JCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAotCQkucGlvX21hc2sgPSAweDFmLAotCQkubXdkbWFfbWFzayA9IDB4MDcsCi0JCS51ZG1hX21hc2sgPSAweDNmLAotCQkucG9ydF9vcHMgPSAmc2lsNjgwX3BvcnRfb3BzCi0JfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsmaW5mbywgJmluZm99OwotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXUzMiBjbGFzc19yZXYJPSAwOwogCXU4IHRtcGJ5dGUJPSAwOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwotCiAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOwogICAgICAgICBjbGFzc19yZXYgJj0gMHhmZjsKICAgICAgICAgLyogRklYTUU6IGRvdWJsZSBjaGVjayAqLwpAQCAtMzIyLDggKzMxMCw2IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgICAweDhBLCAmdG1wYnl0ZSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAic2lsNjgwOiBCQTVfRU4gPSAlZCBjbG9jayA9ICUwMlhcbiIsCiAJCQl0bXBieXRlICYgMSwgdG1wYnl0ZSAmIDB4MzApOwotCWlmICgodG1wYnl0ZSAmIDB4MzApID09IDApCi0JCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX3Nsb3c7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgIDB4QTEsIDB4NzIpOwogCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCAgMHhBMiwgMHgzMjhBKTsKQEAgLTM0MiwxMSArMzI4LDUxIEBACiAJCWNhc2UgMHgyMDogcHJpbnRrKEtFUk5fSU5GTyAic2lsNjgwOiBVc2luZyBQQ0kgY2xvY2suXG4iKTticmVhazsKIAkJLyogVGhpcyBsYXN0IGNhc2UgaXMgX05PVF8gb2sgKi8KIAkJY2FzZSAweDMwOiBwcmludGsoS0VSTl9FUlIgInNpbDY4MDogQ2xvY2sgZGlzYWJsZWQgP1xuIik7Ci0JCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIHRtcGJ5dGUgJiAweDMwOworfQorCitzdGF0aWMgaW50IHNpbDY4MF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCQkuc2h0ID0gJnNpbDY4MF9zaHQsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAorCQkucGlvX21hc2sgPSAweDFmLAorCQkubXdkbWFfbWFzayA9IDB4MDcsCisJCS51ZG1hX21hc2sgPSAweDdmLAorCQkucG9ydF9vcHMgPSAmc2lsNjgwX3BvcnRfb3BzCisJfTsKKwlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19zbG93ID0geworCQkuc2h0ID0gJnNpbDY4MF9zaHQsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAorCQkucGlvX21hc2sgPSAweDFmLAorCQkubXdkbWFfbWFzayA9IDB4MDcsCisJCS51ZG1hX21hc2sgPSAweDNmLAorCQkucG9ydF9vcHMgPSAmc2lsNjgwX3BvcnRfb3BzCisJfTsKKwlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsmaW5mbywgJmluZm99OworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJc3dpdGNoKHNpbDY4MF9pbml0X2NoaXAocGRldikpCisJeworCQljYXNlIDA6CisJCQlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb19zbG93OworCQkJYnJlYWs7CisJCWNhc2UgMHgzMDoKKwkJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOwogfQogCitzdGF0aWMgaW50IHNpbDY4MF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXNpbDY4MF9pbml0X2NoaXAocGRldik7CisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShwZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpbDY4MFtdID0gewogCXsgUENJX1ZERVZJQ0UoQ01ELCBQQ0lfREVWSUNFX0lEX1NJSV82ODApLCB9LAogCkBAIC0zNTcsNyArMzgzLDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gc2lsNjgwLAogCS5wcm9iZSAJCT0gc2lsNjgwX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2lsNjgwX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaWw2ODBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKaW5kZXggYjlmZmFmYi4uOTE2Y2VkYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaXMuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX3NpcyIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC40IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40LjUiCiAKIHN0cnVjdCBzaXNfY2hpcHNldCB7CiAJdTE2IGRldmljZTsJCQkvKiBQQ0kgaG9zdCBJRCAqLwpAQCAtNTM4LDE0ICs1MzgsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2lzXzEzM19vcHMgPSB7CkBAIC05OTksNiArMTAwMSw4IEBACiAJLmlkX3RhYmxlCQk9IHNpc19wY2lfdGJsLAogCS5wcm9iZQkJCT0gc2lzX2luaXRfb25lLAogCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAkJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNpc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKaW5kZXggMDhhNmRjOC4uZTk0ZjUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwpAQCAtMjMwLDEzICsyMzAsMTMgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYwppbmRleCA5NjQwZjgwLi5hMTQyOTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYwpAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX3RyaWZsZXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi43IgogCiAvKioKICAqCXRyaWZsZXhfcHJlcmVzZXQJCS0JcHJvYmUgYmVnaW4KQEAgLTE4NSwxNCArMTg1LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHRyaWZsZXhfcG9ydF9vcHMgPSB7CkBAIC0yNTcsNyArMjU5LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gdHJpZmxleCwKIAkucHJvYmUgCQk9IHRyaWZsZXhfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB0cmlmbGV4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCmluZGV4IDFlN2JlOWUuLmNjMDlkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwpAQCAtMjMsNiArMjMsNyBAQAogICoJVklBIFZUODIzM2MJLQlVRE1BMTAwCiAgKglWSUEgVlQ4MjM1CS0JVURNQTEzMwogICoJVklBIFZUODIzNwktCVVETUExMzMKKyAqCVZJQSBWVDgyNTEJLQlVRE1BMTMzCiAgKgogICoJTW9zdCByZWdpc3RlcnMgcmVtYWluIGNvbXBhdGlibGUgYWNyb3NzIGNoaXBzLiBPdGhlcnMgc3RhcnQgcmVzZXJ2ZWQKICAqCWFuZCBhY3F1aXJlIHNlbnNpYmxlIHNlbWFudGljcyBpZiBzZXQgdG8gMSAoZWcgY2FibGUgZGV0ZWN0KS4gQSBmZXcKQEAgLTYwLDcgKzYxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV92aWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuMTQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuMCIKIAogLyoKICAqCVRoZSBmb2xsb3dpbmcgY29tZXMgZGlyZWN0bHkgZnJvbSBWb2p0ZWNoIFBhdmxpaydzIGlkZS9wY2kvdmlhODJjeHh4CkBAIC05NCw2ICs5NSw3IEBACiAJdTggcmV2X21heDsKIAl1MTYgZmxhZ3M7CiB9IHZpYV9pc2FfYnJpZGdlc1tdID0geworCXsgInZ0ODI1MSIsCVBDSV9ERVZJQ0VfSURfVklBXzgyNTEsICAgICAweDAwLCAweDJmLCBWSUFfVURNQV8xMzMgfCBWSUFfQkFEX0FTVCB9LAogCXsgImN4NzAwIiwJUENJX0RFVklDRV9JRF9WSUFfQ1g3MDAsICAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BXzEzMyB8IFZJQV9CQURfQVNUIH0sCiAJeyAidnQ2NDEwIiwJUENJX0RFVklDRV9JRF9WSUFfNjQxMCwgICAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BXzEzMyB8IFZJQV9CQURfQVNUIHwgVklBX05PX0VOQUJMRVN9LAogCXsgInZ0ODIzN2EiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjM3QSwgICAgMHgwMCwgMHgyZiwgVklBX1VETUFfMTMzIHwgVklBX0JBRF9BU1QgfSwKQEAgLTI4OCwxNCArMjkwLDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHZpYV9wb3J0X29wcyA9IHsKQEAgLTM2OSw4ICszNzMsNDIgQEAKIH07CiAKIC8qKgorICoJdmlhX2NvbmZpZ19maWZvCQktCXNldCB1cCB0aGUgRklGTworICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCUBmbGFnczogY29uZmlndXJhdGlvbiBmbGFncworICoKKyAqCVNldCB0aGUgRklGTyBwcm9wZXJ0aWVzIGZvciB0aGlzIGRldmljZSBpZiBuZWNjZXNzYXJ5LiBVc2VkIGJvdGggb24KKyAqCXNldCB1cCBhbmQgb24gYW5kIHRoZSByZXN1bWUgcGF0aAorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jb25maWdfZmlmbyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXU4IGVuYWJsZTsKKwkKKwkvKiAweDQwIGxvdyBiaXRzIGluZGljYXRlIGVuYWJsZWQgY2hhbm5lbHMgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQwICwgJmVuYWJsZSk7CisJZW5hYmxlICY9IDM7CisJCisJaWYgKGZsYWdzICYgVklBX1NFVF9GSUZPKSB7CisJCXU4IGZpZm9fc2V0dGluZ1s0XSA9IHsweDAwLCAweDYwLCAweDAwLCAweDIwfTsKKwkJdTggZmlmbzsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQzLCAmZmlmbyk7CisKKwkJLyogQ2xlYXIgUFJFUSMgdW50aWwgRERBQ0sjIGZvciBlcnJhdGEgKi8KKwkJaWYgKGZsYWdzICYgVklBX0JBRF9QUkVRKQorCQkJZmlmbyAmPSAweDdGOworCQllbHNlCisJCQlmaWZvICY9IDB4OWY7CisJCS8qIFR1cm4gb24gRklGTyBmb3IgZW5hYmxlZCBjaGFubmVscyAqLworCQlmaWZvIHw9IGZpZm9fc2V0dGluZ1tlbmFibGVdOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MywgZmlmbyk7CisJfQorfQorCisvKioKICAqCXZpYV9pbml0X29uZQkJLQlkaXNjb3ZlcnkgY2FsbGJhY2sKLSAqCUBwZGV2OiBQQ0kgZGV2aWNlIElECisgKglAcGRldjogUENJIGRldmljZQogICoJQGlkOiBQQ0kgdGFibGUgaW5mbwogICoKICAqCUEgVklBIElERSBpbnRlcmZhY2UgaGFzIGJlZW4gZGlzY292ZXJlZC4gRmlndXJlIG91dCB3aGF0IHJldmlzaW9uCkBAIC0zODIsNyArNDIwLDcgQEAKIAkvKiBFYXJseSBWSUEgd2l0aG91dCBVRE1BIHN1cHBvcnQgKi8KIAlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdmlhX213ZG1hX2luZm8gPSB7CiAJCS5zaHQgPSAmdmlhX3NodCwKLQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5td2RtYV9tYXNrID0gMHgwNywKIAkJLnBvcnRfb3BzID0gJnZpYV9wb3J0X29wcwpAQCAtMzkwLDcgKzQyOCw3IEBACiAJLyogRGl0dG8gd2l0aCBJUlEgbWFza2luZyByZXF1aXJlZCAqLwogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfbXdkbWFfaW5mb19ib3JrZWQgPSB7CiAJCS5zaHQgPSAmdmlhX3NodCwKLQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5td2RtYV9tYXNrID0gMHgwNywKIAkJLnBvcnRfb3BzID0gJnZpYV9wb3J0X29wc19ub2lycSwKQEAgLTM5OCw3ICs0MzYsNyBAQAogCS8qIFZJQSBVRE1BIDMzIGRldmljZXMgKGFuZCBib3JrZWQgNjYpICovCiAJc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHZpYV91ZG1hMzNfaW5mbyA9IHsKIAkJLnNodCA9ICZ2aWFfc2h0LAotCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NFVFhGRVJfUE9MTElORywKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkudWRtYV9tYXNrID0gMHg3LApAQCAtNDA3LDcgKzQ0NSw3IEBACiAJLyogVklBIFVETUEgNjYgZGV2aWNlcyAqLwogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfdWRtYTY2X2luZm8gPSB7CiAJCS5zaHQgPSAmdmlhX3NodCwKLQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5td2RtYV9tYXNrID0gMHgwNywKIAkJLnVkbWFfbWFzayA9IDB4MWYsCkBAIC00MTYsNyArNDU0LDcgQEAKIAkvKiBWSUEgVURNQSAxMDAgZGV2aWNlcyAqLwogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfdWRtYTEwMF9pbmZvID0gewogCQkuc2h0ID0gJnZpYV9zaHQsCi0JCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAorCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU0VUWEZFUl9QT0xMSU5HLAogCQkucGlvX21hc2sgPSAweDFmLAogCQkubXdkbWFfbWFzayA9IDB4MDcsCiAJCS51ZG1hX21hc2sgPSAweDNmLApAQCAtNDI1LDcgKzQ2Myw3IEBACiAJLyogVURNQTEzMyB3aXRoIGJhZCBBU1QgKEFsbCBjdXJyZW50IDEzMykgKi8KIAlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdmlhX3VkbWExMzNfaW5mbyA9IHsKIAkJLnNodCA9ICZ2aWFfc2h0LAotCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NFVFhGRVJfUE9MTElORywKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkudWRtYV9tYXNrID0gMHg3ZiwJLyogRklYTUU6IHNob3VsZCBjaGVjayBub3J0aCBicmlkZ2UgKi8KQEAgLTQ3MCwyMSArNTA4LDggQEAKIAl9CiAKIAkvKiBJbml0aWFsaXNlIHRoZSBGSUZPIGZvciB0aGUgZW5hYmxlZCBjaGFubmVscy4gKi8KLQlpZiAoY29uZmlnLT5mbGFncyAmIFZJQV9TRVRfRklGTykgewotCQl1OCBmaWZvX3NldHRpbmdbNF0gPSB7MHgwMCwgMHg2MCwgMHgwMCwgMHgyMH07Ci0JCXU4IGZpZm87Ci0KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0MywgJmZpZm8pOwotCi0JCS8qIENsZWFyIFBSRVEjIHVudGlsIEREQUNLIyBmb3IgZXJyYXRhICovCi0JCWlmIChjb25maWctPmZsYWdzICYgVklBX0JBRF9QUkVRKQotCQkJZmlmbyAmPSAweDdGOwotCQllbHNlCi0JCQlmaWZvICY9IDB4OWY7Ci0JCS8qIFR1cm4gb24gRklGTyBmb3IgZW5hYmxlZCBjaGFubmVscyAqLwotCQlmaWZvIHw9IGZpZm9fc2V0dGluZ1tlbmFibGVdOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MywgZmlmbyk7Ci0JfQorCXZpYV9jb25maWdfZmlmbyhwZGV2LCBjb25maWctPmZsYWdzKTsKKwkKIAkvKiBDbG9jayBzZXQgdXAgKi8KIAlzd2l0Y2goY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSB7CiAJCWNhc2UgVklBX1VETUFfTk9ORToKQEAgLTUyOCw2ICs1NTMsMzkgQEAKIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOwogfQogCisvKioKKyAqCXZpYV9yZWluaXRfb25lCQktCXJlaW5pdCBhZnRlciByZXN1bWUKKyAqCUBwZGV2OyBQQ0kgZGV2aWNlCisgKgorICoJQ2FsbGVkIHdoZW4gdGhlIFZJQSBQQVRBIGRldmljZSBpcyByZXN1bWVkLiBXZSBtdXN0IHRoZW4KKyAqCXJlY29uZmlndXJlIHRoZSBmaWZvIGFuZCBvdGhlciBzZXR1cCB3ZSBtYXkgaGF2ZSBhbHRlcmVkLiBJbgorICoJYWRkaXRpb24gdGhlIGtlcm5lbCBuZWVkcyB0byBoYXZlIHRoZSByZXN1bWUgbWV0aG9kcyBvbiBQQ0kKKyAqCXF1aXJrIHN1cHBvcnRlZC4KKyAqLworCitzdGF0aWMgaW50IHZpYV9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUzMiB0aW1pbmc7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWNvbnN0IHN0cnVjdCB2aWFfaXNhX2JyaWRnZSAqY29uZmlnID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCQorCXZpYV9jb25maWdfZmlmbyhwZGV2LCBjb25maWctPmZsYWdzKTsKKworCWlmICgoY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSA9PSBWSUFfVURNQV82NikgeworCQkvKiBUaGUgNjYgTUh6IGRldmljZXMgcmVxdWlyZSB3ZSBlbmFibGUgdGhlIGNsb2NrICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmdGltaW5nKTsKKwkJdGltaW5nIHw9IDB4ODAwMDg7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgdGltaW5nKTsKKwl9CisJaWYgKGNvbmZpZy0+ZmxhZ3MgJiBWSUFfQkFEX0NMSzY2KSB7CisJCS8qIERpc2FibGUgdGhlIDY2TUh6IGNsb2NrIG9uIHByb2JsZW0gZGV2aWNlcyAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJnRpbWluZyk7CisJCXRpbWluZyAmPSB+MHg4MDAwODsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCB0aW1pbmcpOworCX0KKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKHBkZXYpOwkKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYVtdID0gewogCXsgUENJX1ZERVZJQ0UoVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NzZfMSksIH0sCiAJeyBQQ0lfVkRFVklDRShWSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xKSwgfSwKQEAgLTU0MSw3ICs1OTksOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSB2aWEsCiAJLnByb2JlIAkJPSB2aWFfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB2aWFfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHZpYV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3dpbmJvbmQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfd2luYm9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTM0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9wYXRhX3dpbmJvbmQuYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqICAgIHBhdGFfd2luYm9uZC5jIC0gV2luYm9uZCBWTEIgQVRBIGNvbnRyb2xsZXJzCisgKgkoQykgMjAwNiBSZWQgSGF0IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogICAgU3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgODM3NTlBIHdoZW4gb3BlcmF0aW5nIGluIGFkdmFuY2VkIG1vZGUuCisgKiAgICBNdWx0aWNoaXAgbW9kZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgInBhdGFfd2luYm9uZCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMC4xIgorCisjZGVmaW5lIE5SX0hPU1QgNAkvKiBUd28gd2luYm9uZCBjb250cm9sbGVycywgdHdvIGNoYW5uZWxzIGVhY2ggKi8KKworc3RydWN0IHdpbmJvbmRfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBjb25maWc7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworfTsKKworc3RhdGljIHN0cnVjdCBhdGFfaG9zdCAqd2luYm9uZF9ob3N0W05SX0hPU1RdOworc3RhdGljIHN0cnVjdCB3aW5ib25kX2RhdGEgd2luYm9uZF9kYXRhW05SX0hPU1RdOworc3RhdGljIGludCBucl93aW5ib25kX2hvc3Q7CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgcHJvYmVfd2luYm9uZCA9IDE7CisjZWxzZQorc3RhdGljIGludCBwcm9iZV93aW5ib25kOworI2VuZGlmCisKK3N0YXRpYyBzcGlubG9ja190IHdpbmJvbmRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworc3RhdGljIHZvaWQgd2luYm9uZF93cml0ZWNmZyh1bnNpZ25lZCBsb25nIHBvcnQsIHU4IHJlZywgdTggdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJndpbmJvbmRfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBwb3J0ICsgMHgwMSk7CisJb3V0Yih2YWwsIHBvcnQgKyAweDAyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aW5ib25kX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHU4IHdpbmJvbmRfcmVhZGNmZyh1bnNpZ25lZCBsb25nIHBvcnQsIHU4IHJlZykKK3sKKwl1OCB2YWw7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZ3aW5ib25kX2xvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgcG9ydCArIDB4MDEpOworCXZhbCA9IGluYihwb3J0ICsgMHgwMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2luYm9uZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB3aW5ib25kX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQoreworCXN0cnVjdCBhdGFfdGltaW5nIHQ7CisJc3RydWN0IHdpbmJvbmRfZGF0YSAqd2luYm9uZCA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CisJaW50IGFjdGl2ZSwgcmVjb3Zlcnk7CisJdTggcmVnOworCWludCB0aW1pbmcgPSAweDg4ICsgKGFwLT5wb3J0X25vICogNCkgKyAoYWRldi0+ZGV2bm8gKiAyKTsKKworCXJlZyA9IHdpbmJvbmRfcmVhZGNmZyh3aW5ib25kLT5jb25maWcsIDB4ODEpOworCQorCS8qIEdldCB0aGUgdGltaW5nIGRhdGEgaW4gY3ljbGVzICovCisJaWYgKHJlZyAmIDB4NDApCQkvKiBGYXN0IFZMQiBidXMsIGFzc3VtZSA1ME1IeiAqLworCQlhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZ0LCAyMDAwMCwgMTAwMCk7CisJZWxzZQorCQlhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZ0LCAzMDMwMywgMTAwMCk7CisKKwlhY3RpdmUgPSAoRklUKHQuYWN0aXZlLCAzLCAxNykgLSAxKSAmIDB4MEY7CisJcmVjb3ZlcnkgPSAoRklUKHQucmVjb3ZlciwgMSwgMTUpICsgMSkgJiAweDBGOworCXRpbWluZyA9IChhY3RpdmUgPDwgNCkgfCByZWNvdmVyeTsKKwl3aW5ib25kX3dyaXRlY2ZnKHdpbmJvbmQtPmNvbmZpZywgdGltaW5nLCByZWcpOworCQorCS8qIExvYWQgdGhlIHNldHVwIHRpbWluZyAqLworCQorCXJlZyA9IDB4MzU7CisJaWYgKGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKQorCQlyZWcgfD0gMHgwODsJLyogRklGTyBvZmYgKi8KKwlpZiAoIWF0YV9waW9fbmVlZF9pb3JkeShhZGV2KSkKKwkJcmVnIHw9IDB4MDI7CS8qIElPUkRZIG9mZiAqLworCXJlZyB8PSAoRklUKHQuc2V0dXAsIDAsIDMpIDw8IDYpOworCXdpbmJvbmRfd3JpdGVjZmcod2luYm9uZC0+Y29uZmlnLCB0aW1pbmcgKyAxLCByZWcpOworfQorCisKK3N0YXRpYyB2b2lkIHdpbmJvbmRfZGF0YV94ZmVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4sIGludCB3cml0ZV9kYXRhKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhZGV2LT5hcDsKKwlpbnQgc2xvcCA9IGJ1ZmxlbiAmIDM7CisKKwlpZiAoYXRhX2lkX2hhc19kd29yZF9pbyhhZGV2LT5pZCkpIHsKKwkJaWYgKHdyaXRlX2RhdGEpCisJCQlvdXRzbChhcC0+aW9hZGRyLmRhdGFfYWRkciwgYnVmLCBidWZsZW4gPj4gMik7CisJCWVsc2UKKwkJCWluc2woYXAtPmlvYWRkci5kYXRhX2FkZHIsIGJ1ZiwgYnVmbGVuID4+IDIpOworCisJCWlmICh1bmxpa2VseShzbG9wKSkgeworCQkJdTMyIHBhZDsKKwkJCWlmICh3cml0ZV9kYXRhKSB7CisJCQkJbWVtY3B5KCZwYWQsIGJ1ZiArIGJ1ZmxlbiAtIHNsb3AsIHNsb3ApOworCQkJCW91dGwobGUzMl90b19jcHUocGFkKSwgYXAtPmlvYWRkci5kYXRhX2FkZHIpOworCQkJfSBlbHNlIHsKKwkJCQlwYWQgPSBjcHVfdG9fbGUxNihpbmwoYXAtPmlvYWRkci5kYXRhX2FkZHIpKTsKKwkJCQltZW1jcHkoYnVmICsgYnVmbGVuIC0gc2xvcCwgJnBhZCwgc2xvcCk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJYXRhX3Bpb19kYXRhX3hmZXIoYWRldiwgYnVmLCBidWZsZW4sIHdyaXRlX2RhdGEpOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSB3aW5ib25kX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHdpbmJvbmRfcG9ydF9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnNldF9waW9tb2RlCT0gd2luYm9uZF9zZXRfcGlvbW9kZSwKKworCS50Zl9sb2FkCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzIAk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QgCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCisJLmZyZWV6ZQkJPSBhdGFfYm1kbWFfZnJlZXplLAorCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCisJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZGF0YV94ZmVyCT0gd2luYm9uZF9kYXRhX3hmZXIsCisKKwkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLnBvcnRfc3RhcnQJPSBhdGFfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCT0gYXRhX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCT0gYXRhX2hvc3Rfc3RvcAorfTsKKworLyoqCisgKgl3aW5ib25kX2luaXRfb25lCQktCWF0dGFjaCBhIHdpbmJvbmQgaW50ZXJmYWNlCisgKglAdHlwZTogVHlwZSB0byBkaXNwbGF5CisgKglAaW86IEkvTyBwb3J0IHN0YXJ0CisgKglAaXJxOiBpbnRlcnJ1cHQgbGluZQorICoJQGZhc3Q6IFRydWUgaWYgb24gYSA+IDMzTWh6IFZMQgorICoKKyAqCVJlZ2lzdGVyIGEgVkxCIGJ1cyBJREUgaW50ZXJmYWNlLiBTdWNoIGludGVyZmFjZXMgYXJlIFBJTyBhbmQgd2UKKyAqCWFzc3VtZSBkbyBub3Qgc3VwcG9ydCBJUlEgc2hhcmluZy4KKyAqLworCitzdGF0aWMgX19pbml0IGludCB3aW5ib25kX2luaXRfb25lKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCBhZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCByZXQ7CisJdTggcmVnOworCWludCBpOworCisJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODEpOworCXJlZyB8PSAweDgwOwkvKiBqdW1wZXJlZCBtb2RlIG9mZiAqLworCXdpbmJvbmRfd3JpdGVjZmcocG9ydCwgMHg4MSwgcmVnKTsKKwlyZWcgPSB3aW5ib25kX3JlYWRjZmcocG9ydCwgMHg4Myk7CisJcmVnIHw9IDB4RjA7CS8qIGxvY2FsIGNvbnRyb2wgKi8KKwl3aW5ib25kX3dyaXRlY2ZnKHBvcnQsIDB4ODMsIHJlZyk7CisJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODUpOworCXJlZyB8PSAweEYwOwkvKiBwcm9ncmFtbWFibGUgdGltaW5nICovCisJd2luYm9uZF93cml0ZWNmZyhwb3J0LCAweDg1LCByZWcpOworCisJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODEpOworCQorCWlmICghKHJlZyAmIDB4MDMpKQkJLyogRGlzYWJsZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMiA7IGkgKyspIHsKKworCQlpZiAocmVnICYgKDEgPDwgaSkpIHsJCQorCQkJLyoKKwkJCSAqCUZpbGwgaW4gYSBwcm9iZSBzdHJ1Y3R1cmUgZmlyc3Qgb2YgYWxsCisJCQkgKi8KKworCQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWX05BTUUsIG5yX3dpbmJvbmRfaG9zdCwgTlVMTCwgMCk7CisJCQlpZiAocGRldiA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKKwkJCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKKwkJCWFlLmRldiA9ICZwZGV2LT5kZXY7CisKKwkJCWFlLnBvcnRfb3BzID0gJndpbmJvbmRfcG9ydF9vcHM7CisJCQlhZS5waW9fbWFzayA9IDB4MUY7CisKKwkJCWFlLnNodCA9ICZ3aW5ib25kX3NodDsKKwkKKwkJCWFlLm5fcG9ydHMgPSAxOworCQkJYWUuaXJxID0gMTQgKyBpOworCQkJYWUuaXJxX2ZsYWdzID0gMDsKKwkJCWFlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVDsKKwkJCWFlLnBvcnRbMF0uY21kX2FkZHIgPSAweDFGMCAtICgweDgwICogaSk7CisJCQlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gYWUucG9ydFswXS5jbWRfYWRkciArIDB4MDIwNjsKKwkJCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyOworCQkJYXRhX3N0ZF9wb3J0cygmYWUucG9ydFswXSk7CisJCQkvKgorCQkJICoJSG9vayBpbiBhIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgcGVyIGNoYW5uZWwKKwkJCSAqLworCQkJYWUucHJpdmF0ZV9kYXRhID0gJndpbmJvbmRfZGF0YVtucl93aW5ib25kX2hvc3RdOworCQkJd2luYm9uZF9kYXRhW25yX3dpbmJvbmRfaG9zdF0uY29uZmlnID0gcG9ydDsKKwkJCXdpbmJvbmRfZGF0YVtucl93aW5ib25kX2hvc3RdLnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwkJCXJldCA9IGF0YV9kZXZpY2VfYWRkKCZhZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJCXdpbmJvbmRfaG9zdFtucl93aW5ib25kX2hvc3QrK10gPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3aW5ib25kX2luaXQJCS0JYXR0YWNoIHdpbmJvbmQgaW50ZXJmYWNlcworICoKKyAqCUF0dGFjaCB3aW5ib25kIElERSBpbnRlcmZhY2VzIGJ5IHNjYW5uaW5nIHRoZSBwb3J0cyBpdCBtYXkgb2NjdXB5LgorICovCisKK3N0YXRpYyBfX2luaXQgaW50IHdpbmJvbmRfaW5pdCh2b2lkKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGNvbmZpZ1syXSA9IHsgMHgxMzAsIDB4MUIwIH07CisKKwlpbnQgY3QgPSAwOworCWludCBpOworCQorCWlmIChwcm9iZV93aW5ib25kID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKyAJICoJQ2hlY2sgYm90aCBiYXNlIGFkZHJlc3NlcworCSAqLworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAocHJvYmVfd2luYm9uZCAmICgxPDxpKSkgeworCQkJaW50IHJldCA9IDA7CisJCQl1bnNpZ25lZCBsb25nIHBvcnQgPSBjb25maWdbaV07CisKKwkJCWlmIChyZXF1ZXN0X3JlZ2lvbihwb3J0LCAyLCAicGF0YV93aW5ib25kIikpIHsKKwkJCQlyZXQgPSB3aW5ib25kX2luaXRfb25lKHBvcnQpOworCQkJCWlmKHJldCA8PSAwKQorCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAyKTsKKwkJCQllbHNlIGN0Kz0gcmV0OworCQkJfQorCQl9CisJfQorCWlmIChjdCAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHdpbmJvbmRfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX3dpbmJvbmRfaG9zdDsgaSsrKSB7CisJCWF0YV9ob3N0X3JlbW92ZSh3aW5ib25kX2hvc3RbaV0pOworCQlyZWxlYXNlX3JlZ2lvbih3aW5ib25kX2RhdGFbaV0uY29uZmlnLCAyKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2luYm9uZF9kYXRhW2ldLnBsYXRmb3JtX2Rldik7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBXaW5ib25kIFZMIEFUQSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdCh3aW5ib25kX2luaXQpOworbW9kdWxlX2V4aXQod2luYm9uZF9leGl0KTsKKworbW9kdWxlX3BhcmFtKHByb2JlX3dpbmJvbmQsIGludCwgMCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCBkNjVlYmZkLi4wZDMxNmViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9udi5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwpAQCAtMjksNiArMjksMTEgQEAKICAqICBOVi1zcGVjaWZpYyBkZXRhaWxzIHN1Y2ggYXMgcmVnaXN0ZXIgb2Zmc2V0cywgU0FUQSBwaHkgbG9jYXRpb24sCiAgKiAgaG90cGx1ZyBpbmZvLCBldGMuCiAgKgorICogIENLODA0L01DUDA0IGNvbnRyb2xsZXJzIHN1cHBvcnQgYW4gYWx0ZXJuYXRlIHByb2dyYW1taW5nIGludGVyZmFjZQorICogIHNpbWlsYXIgdG8gdGhlIEFETUEgc3BlY2lmaWNhdGlvbiAod2l0aCBzb21lIG1vZGlmaWNhdGlvbnMpLgorICogIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgTkNRLiBOb24tRE1BLW1hcHBlZCBBVEEgY29tbWFuZHMgYXJlIHN0aWxsCisgKiAgc2VudCB0aHJvdWdoIHRoZSBsZWdhY3kgaW50ZXJmYWNlLgorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00MCwxMCArNDUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkJCSJzYXRhX252IgotI2RlZmluZSBEUlZfVkVSU0lPTgkJCSIyLjAiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkJIjMuMiIKKworI2RlZmluZSBOVl9BRE1BX0RNQV9CT1VOREFSWQkJMHhmZmZmZmZmZlVMCiAKIGVudW0gewogCU5WX1BPUlRTCQkJPSAyLApAQCAtNzgsOCArODYsMTM4IEBACiAJLy8gRm9yIFBDSSBjb25maWcgcmVnaXN0ZXIgMjAKIAlOVl9NQ1BfU0FUQV9DRkdfMjAJCT0gMHg1MCwKIAlOVl9NQ1BfU0FUQV9DRkdfMjBfU0FUQV9TUEFDRV9FTiA9IDB4MDQsCisJTlZfTUNQX1NBVEFfQ0ZHXzIwX1BPUlQwX0VOCT0gKDEgPDwgMTcpLAorCU5WX01DUF9TQVRBX0NGR18yMF9QT1JUMV9FTgk9ICgxIDw8IDE2KSwKKwlOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDBfUFdCX0VOCT0gKDEgPDwgMTQpLAorCU5WX01DUF9TQVRBX0NGR18yMF9QT1JUMV9QV0JfRU4JPSAoMSA8PCAxMiksCisKKwlOVl9BRE1BX01BWF9DUEJTCQk9IDMyLAorCU5WX0FETUFfQ1BCX1NaCQkJPSAxMjgsCisJTlZfQURNQV9BUFJEX1NaCQkJPSAxNiwKKwlOVl9BRE1BX1NHVEJMX0xFTgkJPSAoMTAyNCAtIE5WX0FETUFfQ1BCX1NaKSAvCisJCQkJCSAgIE5WX0FETUFfQVBSRF9TWiwKKwlOVl9BRE1BX1NHVEJMX1RPVEFMX0xFTgkJPSBOVl9BRE1BX1NHVEJMX0xFTiArIDUsCisJTlZfQURNQV9TR1RCTF9TWiAgICAgICAgICAgICAgICA9IE5WX0FETUFfU0dUQkxfTEVOICogTlZfQURNQV9BUFJEX1NaLAorCU5WX0FETUFfUE9SVF9QUklWX0RNQV9TWiAgICAgICAgPSBOVl9BRE1BX01BWF9DUEJTICoKKwkJCQkJICAgKE5WX0FETUFfQ1BCX1NaICsgTlZfQURNQV9TR1RCTF9TWiksCisKKwkvKiBCQVI1IG9mZnNldCB0byBBRE1BIGdlbmVyYWwgcmVnaXN0ZXJzICovCisJTlZfQURNQV9HRU4JCQk9IDB4NDAwLAorCU5WX0FETUFfR0VOX0NUTAkJCT0gMHgwMCwKKwlOVl9BRE1BX05PVElGSUVSX0NMRUFSCQk9IDB4MzAsCisKKwkvKiBCQVI1IG9mZnNldCB0byBBRE1BIHBvcnRzICovCisJTlZfQURNQV9QT1JUCQkJPSAweDQ4MCwKKworCS8qIHNpemUgb2YgQURNQSBwb3J0IHJlZ2lzdGVyIHNwYWNlICAqLworCU5WX0FETUFfUE9SVF9TSVpFCQk9IDB4MTAwLAorCisJLyogQURNQSBwb3J0IHJlZ2lzdGVycyAqLworCU5WX0FETUFfQ1RMCQkJPSAweDQwLAorCU5WX0FETUFfQ1BCX0NPVU5UCQk9IDB4NDIsCisJTlZfQURNQV9ORVhUX0NQQl9JRFgJCT0gMHg0MywKKwlOVl9BRE1BX1NUQVQJCQk9IDB4NDQsCisJTlZfQURNQV9DUEJfQkFTRV9MT1cJCT0gMHg0OCwKKwlOVl9BRE1BX0NQQl9CQVNFX0hJR0gJCT0gMHg0QywKKwlOVl9BRE1BX0FQUEVORAkJCT0gMHg1MCwKKwlOVl9BRE1BX05PVElGSUVSCQk9IDB4NjgsCisJTlZfQURNQV9OT1RJRklFUl9FUlJPUgkJPSAweDZDLAorCisJLyogTlZfQURNQV9DVEwgcmVnaXN0ZXIgYml0cyAqLworCU5WX0FETUFfQ1RMX0hPVFBMVUdfSUVOCQk9ICgxIDw8IDApLAorCU5WX0FETUFfQ1RMX0NIQU5ORUxfUkVTRVQJPSAoMSA8PCA1KSwKKwlOVl9BRE1BX0NUTF9HTwkJCT0gKDEgPDwgNyksCisJTlZfQURNQV9DVExfQUlFTgkJPSAoMSA8PCA4KSwKKwlOVl9BRE1BX0NUTF9SRUFEX05PTl9DT0hFUkVOVAk9ICgxIDw8IDExKSwKKwlOVl9BRE1BX0NUTF9XUklURV9OT05fQ09IRVJFTlQJPSAoMSA8PCAxMiksCisKKwkvKiBDUEIgcmVzcG9uc2UgZmxhZyBiaXRzICovCisJTlZfQ1BCX1JFU1BfRE9ORQkJPSAoMSA8PCAwKSwKKwlOVl9DUEJfUkVTUF9BVEFfRVJSCQk9ICgxIDw8IDMpLAorCU5WX0NQQl9SRVNQX0NNRF9FUlIJCT0gKDEgPDwgNCksCisJTlZfQ1BCX1JFU1BfQ1BCX0VSUgkJPSAoMSA8PCA3KSwKKworCS8qIENQQiBjb250cm9sIGZsYWcgYml0cyAqLworCU5WX0NQQl9DVExfQ1BCX1ZBTElECQk9ICgxIDw8IDApLAorCU5WX0NQQl9DVExfUVVFVUUJCT0gKDEgPDwgMSksCisJTlZfQ1BCX0NUTF9BUFJEX1ZBTElECQk9ICgxIDw8IDIpLAorCU5WX0NQQl9DVExfSUVOCQkJPSAoMSA8PCAzKSwKKwlOVl9DUEJfQ1RMX0ZQRE1BCQk9ICgxIDw8IDQpLAorCisJLyogQVBSRCBmbGFncyAqLworCU5WX0FQUkRfV1JJVEUJCQk9ICgxIDw8IDEpLAorCU5WX0FQUkRfRU5ECQkJPSAoMSA8PCAyKSwKKwlOVl9BUFJEX0NPTlQJCQk9ICgxIDw8IDMpLAorCisJLyogTlZfQURNQV9TVEFUIGZsYWdzICovCisJTlZfQURNQV9TVEFUX1RJTUVPVVQJCT0gKDEgPDwgMCksCisJTlZfQURNQV9TVEFUX0hPVFVOUExVRwkJPSAoMSA8PCAxKSwKKwlOVl9BRE1BX1NUQVRfSE9UUExVRwkJPSAoMSA8PCAyKSwKKwlOVl9BRE1BX1NUQVRfQ1BCRVJSCQk9ICgxIDw8IDQpLAorCU5WX0FETUFfU1RBVF9TRVJST1IJCT0gKDEgPDwgNSksCisJTlZfQURNQV9TVEFUX0NNRF9DT01QTEVURQk9ICgxIDw8IDYpLAorCU5WX0FETUFfU1RBVF9JRExFCQk9ICgxIDw8IDgpLAorCU5WX0FETUFfU1RBVF9MRUdBQ1kJCT0gKDEgPDwgOSksCisJTlZfQURNQV9TVEFUX1NUT1BQRUQJCT0gKDEgPDwgMTApLAorCU5WX0FETUFfU1RBVF9ET05FCQk9ICgxIDw8IDEyKSwKKwlOVl9BRE1BX1NUQVRfRVJSCQk9IE5WX0FETUFfU1RBVF9DUEJFUlIgfAorCSAJCQkJICBOVl9BRE1BX1NUQVRfVElNRU9VVCwKKworCS8qIHBvcnQgZmxhZ3MgKi8KKwlOVl9BRE1BX1BPUlRfUkVHSVNURVJfTU9ERQk9ICgxIDw8IDApLAorCU5WX0FETUFfQVRBUElfU0VUVVBfQ09NUExFVEUJPSAoMSA8PCAxKSwKKwogfTsKIAorLyogQURNQSBQaHlzaWNhbCBSZWdpb24gRGVzY3JpcHRvciAtIG9uZSBTRyBzZWdtZW50ICovCitzdHJ1Y3QgbnZfYWRtYV9wcmQgeworCV9fbGU2NAkJCWFkZHI7CisJX19sZTMyCQkJbGVuOworCXU4CQkJZmxhZ3M7CisJdTgJCQlwYWNrZXRfbGVuOworCV9fbGUxNgkJCXJlc2VydmVkOworfTsKKworZW51bSBudl9hZG1hX3JlZ2JpdHMgeworCUNNREVORAk9ICgxIDw8IDE1KSwJCS8qIGVuZCBvZiBjb21tYW5kIGxpc3QgKi8KKwlXTkIJPSAoMSA8PCAxNCksCQkvKiB3YWl0LW5vdC1CU1kgKi8KKwlJR04JPSAoMSA8PCAxMyksCQkvKiBpZ25vcmUgdGhpcyBlbnRyeSAqLworCUNTMW4JPSAoMSA8PCAoNCArIDgpKSwJLyogc3RkLiBQQVRBIHNpZ25hbHMgZm9sbG93Li4uICovCisJREEyCT0gKDEgPDwgKDIgKyA4KSksCisJREExCT0gKDEgPDwgKDEgKyA4KSksCisJREEwCT0gKDEgPDwgKDAgKyA4KSksCit9OworCisvKiBBRE1BIENvbW1hbmQgUGFyYW1ldGVyIEJsb2NrCisgICBUaGUgZmlyc3QgNSBTRyBzZWdtZW50cyBhcmUgc3RvcmVkIGluc2lkZSB0aGUgQ29tbWFuZCBQYXJhbWV0ZXIgQmxvY2sgaXRzZWxmLgorICAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiA1IHNlZ21lbnRzIHRoZSByZW1haW5kZXIgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlCisgICBtZW1vcnkgYXJlYSBpbmRpY2F0ZWQgYnkgbmV4dF9hcHJkLiAqLworc3RydWN0IG52X2FkbWFfY3BiIHsKKwl1OAkJCXJlc3BfZmxhZ3M7ICAgIC8qIDAgKi8KKwl1OAkJCXJlc2VydmVkMTsgICAgIC8qIDEgKi8KKwl1OAkJCWN0bF9mbGFnczsgICAgIC8qIDIgKi8KKwkvKiBsZW4gaXMgbGVuZ3RoIG9mIHRhc2tmaWxlIGluIDY0IGJpdCB3b3JkcyAqLworIAl1OAkJCWxlbjsgICAgICAgICAgIC8qIDMgICovCisJdTgJCQl0YWc7ICAgICAgICAgICAvKiA0ICovCisJdTgJCQluZXh0X2NwYl9pZHg7ICAvKiA1ICovCisJX19sZTE2CQkJcmVzZXJ2ZWQyOyAgICAgLyogNi03ICovCisJX19sZTE2CQkJdGZbMTJdOyAgICAgICAgLyogOC0zMSAqLworCXN0cnVjdCBudl9hZG1hX3ByZAlhcHJkWzVdOyAgICAgICAvKiAzMi0xMTEgKi8KKwlfX2xlNjQJCQluZXh0X2FwcmQ7ICAgICAvKiAxMTItMTE5ICovCisJX19sZTY0CQkJcmVzZXJ2ZWQzOyAgICAgLyogMTIwLTEyNyAqLworfTsKKworCitzdHJ1Y3QgbnZfYWRtYV9wb3J0X3ByaXYgeworCXN0cnVjdCBudl9hZG1hX2NwYgkqY3BiOworCWRtYV9hZGRyX3QJCWNwYl9kbWE7CisJc3RydWN0IG52X2FkbWFfcHJkCSphcHJkOworCWRtYV9hZGRyX3QJCWFwcmRfZG1hOworCXU4CQkJZmxhZ3M7Cit9OworCisjZGVmaW5lIE5WX0FETUFfQ0hFQ0tfSU5UUihHQ1RMLCBQT1JUKSAoKEdDVEwpICYgKCAxIDw8ICgxOSArICgxMiAqIChQT1JUKSkpKSkKKwogc3RhdGljIGludCBudl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogc3RhdGljIHZvaWQgbnZfY2s4MDRfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgbnZfZ2VuZXJpY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKQEAgLTkzLDEzICsyMzEsMjggQEAKIHN0YXRpYyB2b2lkIG52X2NrODA0X2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIG52X2NrODA0X3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBudl9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBudl9hZG1hX3NsYXZlX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworc3RhdGljIGludCBudl9hZG1hX2NoZWNrX2F0YXBpX2RtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyB2b2lkIG52X2FkbWFfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnZfYWRtYV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9hZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworc3RhdGljIHZvaWQgbnZfYWRtYV9pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IG52X2FkbWFfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIG52X2FkbWFfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgbnZfYWRtYV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgbnZfYWRtYV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIG52X2FkbWFfYm1kbWFfc2V0dXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdm9pZCBudl9hZG1hX2JtZG1hX3N0YXJ0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgbnZfYWRtYV9ibWRtYV9zdG9wKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHU4IG52X2FkbWFfYm1kbWFfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogCiBlbnVtIG52X2hvc3RfdHlwZQogewogCUdFTkVSSUMsCiAJTkZPUkNFMiwKIAlORk9SQ0UzID0gTkZPUkNFMiwJLyogTkYyID09IE5GMyBhcyBmYXIgYXMgc2F0YV9udiBpcyBjb25jZXJuZWQgKi8KLQlDSzgwNAorCUNLODA0LAorCUFETUEKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBudl9wY2lfdGJsW10gPSB7CkBAIC0xNjAsNiArMzEzLDI0IEBACiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIAorc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbnZfYWRtYV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuY2FuX3F1ZXVlCQk9IE5WX0FETUFfTUFYX0NQQlMsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTlZfQURNQV9TR1RCTF9UT1RBTF9MRU4sCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IE5WX0FETUFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBudl9hZG1hX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9nZW5lcmljX29wcyA9IHsKIAkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCiAJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCkBAIC0yNDEsMTEgKzQxMiw0MCBAQAogCS5ob3N0X3N0b3AJCT0gbnZfY2s4MDRfaG9zdF9zdG9wLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2FkbWFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfYXRhcGlfZG1hCT0gbnZfYWRtYV9jaGVja19hdGFwaV9kbWEsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLmJtZG1hX3NldHVwCQk9IG52X2FkbWFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IG52X2FkbWFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gbnZfYWRtYV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gbnZfYWRtYV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gbnZfYWRtYV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBudl9hZG1hX3FjX2lzc3VlLAorCS5mcmVlemUJCQk9IG52X2NrODA0X2ZyZWV6ZSwKKwkudGhhdwkJCT0gbnZfY2s4MDRfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBudl9hZG1hX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gbnZfYWRtYV9ibWRtYV9zdG9wLAorCS5kYXRhX3hmZXIJCT0gYXRhX21taW9fZGF0YV94ZmVyLAorCS5pcnFfaGFuZGxlcgkJPSBudl9hZG1hX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IG52X2FkbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBudl9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IG52X3Njcl93cml0ZSwKKwkucG9ydF9zdGFydAkJPSBudl9hZG1hX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBudl9hZG1hX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCQk9IG52X2FkbWFfaG9zdF9zdG9wLAorfTsKKwogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mb1tdID0gewogCS8qIGdlbmVyaWMgKi8KIAl7CiAJCS5zaHQJCT0gJm52X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX0hSU1RfVE9fUkVTVU1FLAogCQkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKIAkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAogCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLApAQCAtMjU0LDcgKzQ1NCw4IEBACiAJLyogbmZvcmNlMi8zICovCiAJewogCQkuc2h0CQk9ICZudl9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19IUlNUX1RPX1JFU1VNRSwKIAkJLnBpb19tYXNrCT0gTlZfUElPX01BU0ssCiAJCS5td2RtYV9tYXNrCT0gTlZfTVdETUFfTUFTSywKIAkJLnVkbWFfbWFzawk9IE5WX1VETUFfTUFTSywKQEAgLTI2MywxMiArNDY0LDIzIEBACiAJLyogY2s4MDQgKi8KIAl7CiAJCS5zaHQJCT0gJm52X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX0hSU1RfVE9fUkVTVU1FLAogCQkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKIAkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAogCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLAogCQkucG9ydF9vcHMJPSAmbnZfY2s4MDRfb3BzLAogCX0sCisJLyogQURNQSAqLworCXsKKwkJLnNodAkJPSAmbnZfYWRtYV9zaHQsCisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OQ1EsCisJCS5waW9fbWFzawk9IE5WX1BJT19NQVNLLAorCQkubXdkbWFfbWFzawk9IE5WX01XRE1BX01BU0ssCisJCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCisJCS5wb3J0X29wcwk9ICZudl9hZG1hX29wcywKKwl9LAogfTsKIAogTU9EVUxFX0FVVEhPUigiTlZJRElBIik7CkBAIC0yNzcsNiArNDg5LDcwMCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG52X3BjaV90YmwpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogCitzdGF0aWMgaW50IGFkbWFfZW5hYmxlZCA9IDE7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX252X2FkbWFfY3RsX2Jsb2NrKHZvaWQgX19pb21lbSAqbW1pbywKKwkJCQkJICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydF9ubykKK3sKKwltbWlvICs9IE5WX0FETUFfUE9SVCArIHBvcnRfbm8gKiBOVl9BRE1BX1BPUlRfU0laRTsKKwlyZXR1cm4gbW1pbzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm52X2FkbWFfY3RsX2Jsb2NrKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIF9fbnZfYWRtYV9jdGxfYmxvY2soYXAtPmhvc3QtPm1taW9fYmFzZSwgYXAtPnBvcnRfbm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbnZfYWRtYV9nZW5fYmxvY2soc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlyZXR1cm4gKGFwLT5ob3N0LT5tbWlvX2Jhc2UgKyBOVl9BRE1BX0dFTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpudl9hZG1hX25vdGlmaWVyX2NsZWFyX2Jsb2NrKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIChudl9hZG1hX2dlbl9ibG9jayhhcCkgKyBOVl9BRE1BX05PVElGSUVSX0NMRUFSICsgKDQgKiBhcC0+cG9ydF9ubykpOworfQorCitzdGF0aWMgdm9pZCBudl9hZG1hX3JlZ2lzdGVyX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBudl9hZG1hX2N0bF9ibG9jayhhcCk7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdTE2IHRtcDsKKworCWlmIChwcC0+ZmxhZ3MgJiBOVl9BRE1BX1BPUlRfUkVHSVNURVJfTU9ERSkKKwkJcmV0dXJuOworCisJdG1wID0gcmVhZHcobW1pbyArIE5WX0FETUFfQ1RMKTsKKwl3cml0ZXcodG1wICYgfk5WX0FETUFfQ1RMX0dPLCBtbWlvICsgTlZfQURNQV9DVEwpOworCisJcHAtPmZsYWdzIHw9IE5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFOworfQorCitzdGF0aWMgdm9pZCBudl9hZG1hX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBudl9hZG1hX2N0bF9ibG9jayhhcCk7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdTE2IHRtcDsKKworCWlmICghKHBwLT5mbGFncyAmIE5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFKSkKKwkJcmV0dXJuOworCQkKKwlXQVJOX09OKHBwLT5mbGFncyAmIE5WX0FETUFfQVRBUElfU0VUVVBfQ09NUExFVEUpOworCisJdG1wID0gcmVhZHcobW1pbyArIE5WX0FETUFfQ1RMKTsKKwl3cml0ZXcodG1wIHwgTlZfQURNQV9DVExfR08sIG1taW8gKyBOVl9BRE1BX0NUTCk7CisKKwlwcC0+ZmxhZ3MgJj0gfk5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFOworfQorCitzdGF0aWMgaW50IG52X2FkbWFfc2xhdmVfY29uZmlnKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXU2NCBib3VuY2VfbGltaXQ7CisJdW5zaWduZWQgbG9uZyBzZWdtZW50X2JvdW5kYXJ5OworCXVuc2lnbmVkIHNob3J0IHNnX3RhYmxlc2l6ZTsKKwlpbnQgcmM7CisJaW50IGFkbWFfZW5hYmxlOworCXUzMiBjdXJyZW50X3JlZywgbmV3X3JlZywgY29uZmlnX21hc2s7CisKKwlyYyA9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZyhzZGV2KTsKKworCWlmIChzZGV2LT5pZCA+PSBBVEFfTUFYX0RFVklDRVMgfHwgc2Rldi0+Y2hhbm5lbCB8fCBzZGV2LT5sdW4pCisJCS8qIE5vdCBhIHByb3BlciBsaWJhdGEgZGV2aWNlLCBpZ25vcmUgKi8KKwkJcmV0dXJuIHJjOworCisJaWYgKGFwLT5kZXZpY2Vbc2Rldi0+aWRdLmNsYXNzID09IEFUQV9ERVZfQVRBUEkpIHsKKwkJLyoKKwkJICogTlZJRElBIHJlcG9ydHMgdGhhdCBBRE1BIG1vZGUgZG9lcyBub3Qgc3VwcG9ydCBBVEFQSSBjb21tYW5kcy4KKwkJICogVGhlcmVmb3JlIEFUQVBJIGNvbW1hbmRzIGFyZSBzZW50IHRocm91Z2ggdGhlIGxlZ2FjeSBpbnRlcmZhY2UuCisJCSAqIEhvd2V2ZXIsIHRoZSBsZWdhY3kgaW50ZXJmYWNlIG9ubHkgc3VwcG9ydHMgMzItYml0IERNQS4KKwkJICogUmVzdHJpY3QgRE1BIHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQgYnkgdGhlIGxlZ2FjeSBpbnRlcmZhY2UKKwkJICogd2hlbiBhbiBBVEFQSSBkZXZpY2UgaXMgY29ubmVjdGVkLgorCQkgKi8KKwkJYm91bmNlX2xpbWl0ID0gQVRBX0RNQV9NQVNLOworCQlzZWdtZW50X2JvdW5kYXJ5ID0gQVRBX0RNQV9CT1VOREFSWTsKKwkJLyogU3VidHJhY3QgMSBzaW5jZSBhbiBleHRyYSBlbnRyeSBtYXkgYmUgbmVlZGVkIGZvciBwYWRkaW5nLCBzZWUKKwkJICAgbGliYXRhLXNjc2kuYyAqLworCQlzZ190YWJsZXNpemUgPSBMSUJBVEFfTUFYX1BSRCAtIDE7CisJCQorCQkvKiBTaW5jZSB0aGUgbGVnYWN5IERNQSBlbmdpbmUgaXMgaW4gdXNlLCB3ZSBuZWVkIHRvIGRpc2FibGUgQURNQQorCQkgICBvbiB0aGUgcG9ydC4gKi8KKwkJYWRtYV9lbmFibGUgPSAwOworCQludl9hZG1hX3JlZ2lzdGVyX21vZGUoYXApOworCX0KKwllbHNlIHsKKwkJYm91bmNlX2xpbWl0ID0gKmFwLT5kZXYtPmRtYV9tYXNrOworCQlzZWdtZW50X2JvdW5kYXJ5ID0gTlZfQURNQV9ETUFfQk9VTkRBUlk7CisJCXNnX3RhYmxlc2l6ZSA9IE5WX0FETUFfU0dUQkxfVE9UQUxfTEVOOworCQlhZG1hX2VuYWJsZSA9IDE7CisJfQorCQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZjdXJyZW50X3JlZyk7CisKKwlpZihhcC0+cG9ydF9ubyA9PSAxKQorCQljb25maWdfbWFzayA9IE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMV9FTiB8CisJCQkgICAgICBOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDFfUFdCX0VOOworCWVsc2UKKwkJY29uZmlnX21hc2sgPSBOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDBfRU4gfAorCQkJICAgICAgTlZfTUNQX1NBVEFfQ0ZHXzIwX1BPUlQwX1BXQl9FTjsKKwkKKwlpZihhZG1hX2VuYWJsZSkgeworCQluZXdfcmVnID0gY3VycmVudF9yZWcgfCBjb25maWdfbWFzazsKKwkJcHAtPmZsYWdzICY9IH5OVl9BRE1BX0FUQVBJX1NFVFVQX0NPTVBMRVRFOworCX0KKwllbHNlIHsKKwkJbmV3X3JlZyA9IGN1cnJlbnRfcmVnICYgfmNvbmZpZ19tYXNrOworCQlwcC0+ZmxhZ3MgfD0gTlZfQURNQV9BVEFQSV9TRVRVUF9DT01QTEVURTsKKwl9CisJCisJaWYoY3VycmVudF9yZWcgIT0gbmV3X3JlZykKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsIG5ld19yZWcpOworCQorCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgYm91bmNlX2xpbWl0KTsKKwlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBzZWdtZW50X2JvdW5kYXJ5KTsKKwlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHNkZXYtPnJlcXVlc3RfcXVldWUsIHNnX3RhYmxlc2l6ZSk7CisJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sCisJCSJib3VuY2UgbGltaXQgMHglbGxYLCBzZWdtZW50IGJvdW5kYXJ5IDB4JWxYLCBodyBzZWdzICVodVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylib3VuY2VfbGltaXQsIHNlZ21lbnRfYm91bmRhcnksIHNnX3RhYmxlc2l6ZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG52X2FkbWFfY2hlY2tfYXRhcGlfZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOworCXJldHVybiAhKHBwLT5mbGFncyAmIE5WX0FETUFfQVRBUElfU0VUVVBfQ09NUExFVEUpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG52X2FkbWFfdGZfdG9fY3BiKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBfX2xlMTYgKmNwYikKK3sKKwl1bnNpZ25lZCBpbnQgaWR4ID0gMDsKKworCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNigoQVRBX1JFR19ERVZJQ0UgPDwgOCkgfCB0Zi0+ZGV2aWNlIHwgV05CKTsKKworCWlmICgodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSA9PSAwKSB7CisJCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNihJR04pOworCQljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoSUdOKTsKKwkJY3BiW2lkeCsrXSA9IGNwdV90b19sZTE2KElHTik7CisJCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNihJR04pOworCQljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoSUdOKTsKKwl9CisJZWxzZSB7CisJCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNigoQVRBX1JFR19FUlIgICA8PCA4KSB8IHRmLT5ob2JfZmVhdHVyZSk7CisJCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNigoQVRBX1JFR19OU0VDVCA8PCA4KSB8IHRmLT5ob2JfbnNlY3QpOworCQljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoKEFUQV9SRUdfTEJBTCAgPDwgOCkgfCB0Zi0+aG9iX2xiYWwpOworCQljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoKEFUQV9SRUdfTEJBTSAgPDwgOCkgfCB0Zi0+aG9iX2xiYW0pOworCQljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoKEFUQV9SRUdfTEJBSCAgPDwgOCkgfCB0Zi0+aG9iX2xiYWgpOworCX0KKwljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoKEFUQV9SRUdfRVJSICAgIDw8IDgpIHwgdGYtPmZlYXR1cmUpOworCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNigoQVRBX1JFR19OU0VDVCAgPDwgOCkgfCB0Zi0+bnNlY3QpOworCWNwYltpZHgrK10gPSBjcHVfdG9fbGUxNigoQVRBX1JFR19MQkFMICAgPDwgOCkgfCB0Zi0+bGJhbCk7CisJY3BiW2lkeCsrXSA9IGNwdV90b19sZTE2KChBVEFfUkVHX0xCQU0gICA8PCA4KSB8IHRmLT5sYmFtKTsKKwljcGJbaWR4KytdID0gY3B1X3RvX2xlMTYoKEFUQV9SRUdfTEJBSCAgIDw8IDgpIHwgdGYtPmxiYWgpOworCisJY3BiW2lkeCsrXSA9IGNwdV90b19sZTE2KChBVEFfUkVHX0NNRCAgICA8PCA4KSB8IHRmLT5jb21tYW5kIHwgQ01ERU5EKTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIG52X2FkbWFfY2hlY2tfY3BiKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBjcGJfbnVtLCBpbnQgZm9yY2VfZXJyKQoreworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCWludCBjb21wbGV0ZSA9IDAsIGhhdmVfZXJyID0gMDsKKwl1OCBmbGFncyA9IHBwLT5jcGJbY3BiX251bV0ucmVzcF9mbGFnczsKKworCVZQUklOVEsoIkNQQiAlZCwgZmxhZ3M9MHgleFxuIiwgY3BiX251bSwgZmxhZ3MpOworCisJaWYgKGZsYWdzICYgTlZfQ1BCX1JFU1BfRE9ORSkgeworCQlWUFJJTlRLKCJDUEIgZmxhZ3MgZG9uZSwgZmxhZ3M9MHgleFxuIiwgZmxhZ3MpOworCQljb21wbGV0ZSA9IDE7CisJfQorCWlmIChmbGFncyAmIE5WX0NQQl9SRVNQX0FUQV9FUlIpIHsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIkNQQiBmbGFncyBBVEEgZXJyLCBmbGFncz0weCV4XG4iLCBmbGFncyk7CisJCWhhdmVfZXJyID0gMTsKKwkJY29tcGxldGUgPSAxOworCX0KKwlpZiAoZmxhZ3MgJiBOVl9DUEJfUkVTUF9DTURfRVJSKSB7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJDUEIgZmxhZ3MgQ01EIGVyciwgZmxhZ3M9MHgleFxuIiwgZmxhZ3MpOworCQloYXZlX2VyciA9IDE7CisJCWNvbXBsZXRlID0gMTsKKwl9CisJaWYgKGZsYWdzICYgTlZfQ1BCX1JFU1BfQ1BCX0VSUikgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiQ1BCIGZsYWdzIENQQiBlcnIsIGZsYWdzPTB4JXhcbiIsIGZsYWdzKTsKKwkJaGF2ZV9lcnIgPSAxOworCQljb21wbGV0ZSA9IDE7CisJfQorCWlmKGNvbXBsZXRlIHx8IGZvcmNlX2VycikKKwl7CisJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGNwYl9udW0pOworCQlpZihsaWtlbHkocWMpKSB7CisJCQl1OCBhdGFfc3RhdHVzID0gMDsKKwkJCS8qIE9ubHkgdXNlIHRoZSBBVEEgcG9ydCBzdGF0dXMgZm9yIG5vbi1OQ1EgY29tbWFuZHMuCisJCQkgICBGb3IgTkNRIGNvbW1hbmRzIHRoZSBjdXJyZW50IHN0YXR1cyBtYXkgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGgKKwkJCSAgIHRoZSBjb21tYW5kIGp1c3QgY29tcGxldGVkLiAqLworCQkJaWYocWMtPnRmLnByb3RvY29sICE9IEFUQV9QUk9UX05DUSkKKwkJCQlhdGFfc3RhdHVzID0gcmVhZGIobnZfYWRtYV9jdGxfYmxvY2soYXApICsgKEFUQV9SRUdfU1RBVFVTICogNCkpOworCisJCQlpZihoYXZlX2VyciB8fCBmb3JjZV9lcnIpCisJCQkJYXRhX3N0YXR1cyB8PSBBVEFfRVJSOworCisJCQlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2soYXRhX3N0YXR1cyk7CisJCQlEUFJJTlRLKCJDb21wbGV0aW5nIHFjIGZyb20gdGFnICVkIHdpdGggZXJyX21hc2sgJXVcbiIsY3BiX251bSwKKwkJCQlxYy0+ZXJyX21hc2spOworCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBudl9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggaXJxX3N0YXQpCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWludCBoYW5kbGVkOworCisJLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgKi8KKwlpZiAodW5saWtlbHkoaXJxX3N0YXQgJiAoTlZfSU5UX0FEREVEIHwgTlZfSU5UX1JFTU9WRUQpKSkgeworCQlhdGFfcG9ydF9mcmVlemUoYXApOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBiYWlsIG91dCBpZiBub3Qgb3VyIGludGVycnVwdCAqLworCWlmICghKGlycV9zdGF0ICYgTlZfSU5UX0RFVikpCisJCXJldHVybiAwOworCisJLyogREVWIGludGVycnVwdCB3LyBubyBhY3RpdmUgcWM/ICovCisJaWYgKHVubGlrZWx5KCFxYyB8fCAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSkgeworCQlhdGFfY2hlY2tfc3RhdHVzKGFwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogaGFuZGxlIGludGVycnVwdCAqLworCWhhbmRsZWQgPSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7CisJaWYgKHVubGlrZWx5KCFoYW5kbGVkKSkgeworCQkvKiBzcHVyaW91cywgY2xlYXIgaXQgKi8KKwkJYXRhX2NoZWNrX3N0YXR1cyhhcCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9hZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2luc3RhbmNlOworCWludCBpLCBoYW5kbGVkID0gMDsKKwl1MzIgbm90aWZpZXJfY2xlYXJzWzJdOworCisJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCQlub3RpZmllcl9jbGVhcnNbaV0gPSAwOworCisJCWlmIChhcCAmJiAhKGFwLT5mbGFncyAmIEFUQV9GTEFHX0RJU0FCTEVEKSkgeworCQkJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJCQl2b2lkIF9faW9tZW0gKm1taW8gPSBudl9hZG1hX2N0bF9ibG9jayhhcCk7CisJCQl1MTYgc3RhdHVzOworCQkJdTMyIGdlbl9jdGw7CisJCQlpbnQgaGF2ZV9nbG9iYWxfZXJyID0gMDsKKwkJCXUzMiBub3RpZmllciwgbm90aWZpZXJfZXJyb3I7CisKKwkJCS8qIGlmIGluIEFUQSByZWdpc3RlciBtb2RlLCB1c2Ugc3RhbmRhcmQgYXRhIGludGVycnVwdCBoYW5kbGVyICovCisJCQlpZiAocHAtPmZsYWdzICYgTlZfQURNQV9QT1JUX1JFR0lTVEVSX01PREUpIHsKKwkJCQl1OCBpcnFfc3RhdCA9IHJlYWRiKGhvc3QtPm1taW9fYmFzZSArIE5WX0lOVF9TVEFUVVNfQ0s4MDQpCisJCQkJCT4+IChOVl9JTlRfUE9SVF9TSElGVCAqIGkpOworCQkJCWhhbmRsZWQgKz0gbnZfaG9zdF9pbnRyKGFwLCBpcnFfc3RhdCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW5vdGlmaWVyID0gcmVhZGwobW1pbyArIE5WX0FETUFfTk9USUZJRVIpOworCQkJbm90aWZpZXJfZXJyb3IgPSByZWFkbChtbWlvICsgTlZfQURNQV9OT1RJRklFUl9FUlJPUik7CisJCQlub3RpZmllcl9jbGVhcnNbaV0gPSBub3RpZmllciB8IG5vdGlmaWVyX2Vycm9yOworCisJCQlnZW5fY3RsID0gcmVhZGwobnZfYWRtYV9nZW5fYmxvY2soYXApICsgTlZfQURNQV9HRU5fQ1RMKTsKKworCQkJaWYoICFOVl9BRE1BX0NIRUNLX0lOVFIoZ2VuX2N0bCwgYXAtPnBvcnRfbm8pICYmICFub3RpZmllciAmJgorCQkJICAgICFub3RpZmllcl9lcnJvcikKKwkJCQkvKiBOb3RoaW5nIHRvIGRvICovCisJCQkJY29udGludWU7CisKKwkJCXN0YXR1cyA9IHJlYWR3KG1taW8gKyBOVl9BRE1BX1NUQVQpOworCisJCQkvKiBDbGVhciBzdGF0dXMuIEVuc3VyZSB0aGUgY29udHJvbGxlciBzZWVzIHRoZSBjbGVhcmluZyBiZWZvcmUgd2Ugc3RhcnQKKwkJCSAgIGxvb2tpbmcgYXQgYW55IG9mIHRoZSBDUEIgc3RhdHVzZXMsIHNvIHRoYXQgYW55IENQQiBjb21wbGV0aW9ucyBhZnRlcgorCQkJICAgdGhpcyBwb2ludCBpbiB0aGUgaGFuZGxlciB3aWxsIHJhaXNlIGFub3RoZXIgaW50ZXJydXB0LiAqLworCQkJd3JpdGV3KHN0YXR1cywgbW1pbyArIE5WX0FETUFfU1RBVCk7CisJCQlyZWFkdyhtbWlvICsgTlZfQURNQV9TVEFUKTsgLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCisJCQlybWIoKTsKKworCQkJLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgKi8KKwkJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoTlZfQURNQV9TVEFUX0hPVFBMVUcgfCBOVl9BRE1BX1NUQVRfSE9UVU5QTFVHKSkpIHsKKwkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fTk9USUNFLCAiSG90cGx1ZyBldmVudCwgZnJlZXppbmdcbiIpOworCQkJCWF0YV9wb3J0X2ZyZWV6ZShhcCk7CisJCQkJaGFuZGxlZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoc3RhdHVzICYgTlZfQURNQV9TVEFUX1RJTUVPVVQpIHsKKwkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAidGltZW91dCwgc3RhdD0weCV4XG4iLCBzdGF0dXMpOworCQkJCWhhdmVfZ2xvYmFsX2VyciA9IDE7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgTlZfQURNQV9TVEFUX0NQQkVSUikgeworCQkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJDUEIgZXJyb3IsIHN0YXQ9MHgleFxuIiwgc3RhdHVzKTsKKwkJCQloYXZlX2dsb2JhbF9lcnIgPSAxOworCQkJfQorCQkJaWYgKChzdGF0dXMgJiBOVl9BRE1BX1NUQVRfRE9ORSkgfHwgaGF2ZV9nbG9iYWxfZXJyKSB7CisJCQkJLyoqIENoZWNrIENQQnMgZm9yIGNvbXBsZXRlZCBjb21tYW5kcyAqLworCisJCQkJaWYoYXRhX3RhZ192YWxpZChhcC0+YWN0aXZlX3RhZykpCisJCQkJCS8qIE5vbi1OQ1EgY29tbWFuZCAqLworCQkJCQludl9hZG1hX2NoZWNrX2NwYihhcCwgYXAtPmFjdGl2ZV90YWcsIGhhdmVfZ2xvYmFsX2VyciB8fAorCQkJCQkJKG5vdGlmaWVyX2Vycm9yICYgKDEgPDwgYXAtPmFjdGl2ZV90YWcpKSk7CisJCQkJZWxzZSB7CisJCQkJCWludCBwb3M7CisJCQkJCXUzMiBhY3RpdmUgPSBhcC0+c2FjdGl2ZTsKKwkJCQkJd2hpbGUoIChwb3MgPSBmZnMoYWN0aXZlKSkgKSB7CisJCQkJCQlwb3MtLTsKKwkJCQkJCW52X2FkbWFfY2hlY2tfY3BiKGFwLCBwb3MsIGhhdmVfZ2xvYmFsX2VyciB8fAorCQkJCQkJCShub3RpZmllcl9lcnJvciAmICgxIDw8IHBvcykpICk7CisJCQkJCQlhY3RpdmUgJj0gfigxIDw8IHBvcyApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQloYW5kbGVkKys7IC8qIGlycSBoYW5kbGVkIGlmIHdlIGdvdCBoZXJlICovCisJCX0KKwl9CisJCisJaWYobm90aWZpZXJfY2xlYXJzWzBdIHx8IG5vdGlmaWVyX2NsZWFyc1sxXSkgeworCQkvKiBOb3RlOiBCb3RoIG5vdGlmaWVyIGNsZWFyIHJlZ2lzdGVycyBtdXN0IGJlIHdyaXR0ZW4KKwkJICAgaWYgZWl0aGVyIGlzIHNldCwgZXZlbiBpZiBvbmUgaXMgemVybywgYWNjb3JkaW5nIHRvIE5WSURJQS4gKi8KKwkJd3JpdGVsKG5vdGlmaWVyX2NsZWFyc1swXSwgCisJCQludl9hZG1hX25vdGlmaWVyX2NsZWFyX2Jsb2NrKGhvc3QtPnBvcnRzWzBdKSk7CisJCXdyaXRlbChub3RpZmllcl9jbGVhcnNbMV0sIAorCQkJbnZfYWRtYV9ub3RpZmllcl9jbGVhcl9ibG9jayhob3N0LT5wb3J0c1sxXSkpOworCX0KKworCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBudl9hZG1hX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IG52X2FkbWFfY3RsX2Jsb2NrKGFwKTsKKwl1MTYgc3RhdHVzID0gcmVhZHcobW1pbyArIE5WX0FETUFfU1RBVCk7CisJdTMyIG5vdGlmaWVyID0gcmVhZGwobW1pbyArIE5WX0FETUFfTk9USUZJRVIpOworCXUzMiBub3RpZmllcl9lcnJvciA9IHJlYWRsKG1taW8gKyBOVl9BRE1BX05PVElGSUVSX0VSUk9SKTsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGF0X2FkZHIgPSBhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX1NUQVRVUzsKKworCS8qIGNsZWFyIEFETUEgc3RhdHVzICovCisJd3JpdGV3KHN0YXR1cywgbW1pbyArIE5WX0FETUFfU1RBVCk7CisJd3JpdGVsKG5vdGlmaWVyIHwgbm90aWZpZXJfZXJyb3IsCisJICAgICAgIG52X2FkbWFfbm90aWZpZXJfY2xlYXJfYmxvY2soYXApKTsKKworCS8qKiBjbGVhciBsZWdhY3kgc3RhdHVzICovCisJb3V0YihpbmIoZG1hX3N0YXRfYWRkciksIGRtYV9zdGF0X2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBudl9hZG1hX2JtZG1hX3NldHVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl1bnNpZ25lZCBpbnQgcncgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKTsKKwlzdHJ1Y3QgbnZfYWRtYV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwl1OCBkbWFjdGw7CisKKwlpZighKHBwLT5mbGFncyAmIE5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCisJLyogbG9hZCBQUkQgdGFibGUgYWRkci4gKi8KKwlvdXRsKGFwLT5wcmRfZG1hLCBhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX1RBQkxFX09GUyk7CisKKwkvKiBzcGVjaWZ5IGRhdGEgZGlyZWN0aW9uLCB0cmlwbGUtY2hlY2sgc3RhcnQgYml0IGlzIGNsZWFyICovCisJZG1hY3RsID0gaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKKwlkbWFjdGwgJj0gfihBVEFfRE1BX1dSIHwgQVRBX0RNQV9TVEFSVCk7CisJaWYgKCFydykKKwkJZG1hY3RsIHw9IEFUQV9ETUFfV1I7CisKKwlvdXRiKGRtYWN0bCwgYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9DTUQpOworCisJLyogaXNzdWUgci93IGNvbW1hbmQgKi8KKwlhdGFfZXhlY19jb21tYW5kKGFwLCAmcWMtPnRmKTsKK30KKworc3RhdGljIHZvaWQgbnZfYWRtYV9ibWRtYV9zdGFydChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdTggZG1hY3RsOworCisJaWYoIShwcC0+ZmxhZ3MgJiBOVl9BRE1BX1BPUlRfUkVHSVNURVJfTU9ERSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHN0YXJ0IGhvc3QgRE1BIHRyYW5zYWN0aW9uICovCisJZG1hY3RsID0gaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKKwlvdXRiKGRtYWN0bCB8IEFUQV9ETUFfU1RBUlQsCisJICAgICBhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2FkbWFfYm1kbWFfc3RvcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwlpZighKHBwLT5mbGFncyAmIE5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFKSkKKwkJcmV0dXJuOworCisJLyogY2xlYXIgc3RhcnQvc3RvcCBiaXQgKi8KKwlvdXRiKGluYihhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX0NNRCkgJiB+QVRBX0RNQV9TVEFSVCwKKwkJYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9DTUQpOworCisJLyogb25lLVBJTy1jeWNsZSBndWFyYW50ZWVkIHdhaXQsIHBlciBzcGVjLCBmb3IgSERNQTE6MCB0cmFuc2l0aW9uICovCisJYXRhX2FsdHN0YXR1cyhhcCk7ICAgICAgICAvKiBkdW1teSByZWFkICovCit9CisKK3N0YXRpYyB1OCBudl9hZG1hX2JtZG1hX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCisJV0FSTl9PTighKHBwLT5mbGFncyAmIE5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFKSk7CisKKwlyZXR1cm4gaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfU1RBVFVTKTsKK30KKworc3RhdGljIGludCBudl9hZG1hX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdC0+ZGV2OworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHA7CisJaW50IHJjOworCXZvaWQgKm1lbTsKKwlkbWFfYWRkcl90IG1lbV9kbWE7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbnZfYWRtYV9jdGxfYmxvY2soYXApOworCXUxNiB0bXA7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlyYyA9IGF0YV9wb3J0X3N0YXJ0KGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBwID0ga3phbGxvYyhzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwltZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBOVl9BRE1BX1BPUlRfUFJJVl9ETUFfU1osCisJCQkJICZtZW1fZG1hLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWVtKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2tmcmVlOworCX0KKwltZW1zZXQobWVtLCAwLCBOVl9BRE1BX1BPUlRfUFJJVl9ETUFfU1opOworCisJLyoKKwkgKiBGaXJzdCBpdGVtIGluIGNodW5rIG9mIERNQSBtZW1vcnk6CisJICogMTI4LWJ5dGUgY29tbWFuZCBwYXJhbWV0ZXIgYmxvY2sgKENQQikKKwkgKiBvbmUgZm9yIGVhY2ggY29tbWFuZCB0YWcKKwkgKi8KKwlwcC0+Y3BiICAgICA9IG1lbTsKKwlwcC0+Y3BiX2RtYSA9IG1lbV9kbWE7CisKKwl3cml0ZWwobWVtX2RtYSAmIDB4RkZGRkZGRkYsIAltbWlvICsgTlZfQURNQV9DUEJfQkFTRV9MT1cpOworCXdyaXRlbCgobWVtX2RtYSA+PiAxNiApID4+IDE2LAltbWlvICsgTlZfQURNQV9DUEJfQkFTRV9ISUdIKTsKKworCW1lbSAgICAgKz0gTlZfQURNQV9NQVhfQ1BCUyAqIE5WX0FETUFfQ1BCX1NaOworCW1lbV9kbWEgKz0gTlZfQURNQV9NQVhfQ1BCUyAqIE5WX0FETUFfQ1BCX1NaOworCisJLyoKKwkgKiBTZWNvbmQgaXRlbTogYmxvY2sgb2YgQURNQV9TR1RCTF9MRU4gcy9nIGVudHJpZXMKKwkgKi8KKwlwcC0+YXByZCA9IG1lbTsKKwlwcC0+YXByZF9kbWEgPSBtZW1fZG1hOworCisJYXAtPnByaXZhdGVfZGF0YSA9IHBwOworCisJLyogY2xlYXIgYW55IG91dHN0YW5kaW5nIGludGVycnVwdCBjb25kaXRpb25zICovCisJd3JpdGV3KDB4ZmZmZiwgbW1pbyArIE5WX0FETUFfU1RBVCk7CisKKwkvKiBpbml0aWFsaXplIHBvcnQgdmFyaWFibGVzICovCisJcHAtPmZsYWdzID0gTlZfQURNQV9QT1JUX1JFR0lTVEVSX01PREU7CisKKwkvKiBjbGVhciBDUEIgZmV0Y2ggY291bnQgKi8KKwl3cml0ZXcoMCwgbW1pbyArIE5WX0FETUFfQ1BCX0NPVU5UKTsKKworCS8qIGNsZWFyIEdPIGZvciByZWdpc3RlciBtb2RlICovCisJdG1wID0gcmVhZHcobW1pbyArIE5WX0FETUFfQ1RMKTsKKwl3cml0ZXcodG1wICYgfk5WX0FETUFfQ1RMX0dPLCBtbWlvICsgTlZfQURNQV9DVEwpOworCisJdG1wID0gcmVhZHcobW1pbyArIE5WX0FETUFfQ1RMKTsKKwl3cml0ZXcodG1wIHwgTlZfQURNQV9DVExfQ0hBTk5FTF9SRVNFVCwgbW1pbyArIE5WX0FETUFfQ1RMKTsKKwlyZWFkbCggbW1pbyArIE5WX0FETUFfQ1RMICk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworCXVkZWxheSgxKTsKKwl3cml0ZXcodG1wICYgfk5WX0FETUFfQ1RMX0NIQU5ORUxfUkVTRVQsIG1taW8gKyBOVl9BRE1BX0NUTCk7CisJcmVhZGwoIG1taW8gKyBOVl9BRE1BX0NUTCApOwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KKworCXJldHVybiAwOworCitlcnJfb3V0X2tmcmVlOgorCWtmcmVlKHBwKTsKK2Vycl9vdXQ6CisJYXRhX3BvcnRfc3RvcChhcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBudl9hZG1hX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0LT5kZXY7CisJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbnZfYWRtYV9jdGxfYmxvY2soYXApOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJd3JpdGV3KDAsIG1taW8gKyBOVl9BRE1BX0NUTCk7CisKKwlhcC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIE5WX0FETUFfUE9SVF9QUklWX0RNQV9TWiwgcHAtPmNwYiwgcHAtPmNwYl9kbWEpOworCWtmcmVlKHBwKTsKKwlhdGFfcG9ydF9zdG9wKGFwKTsKK30KKworCitzdGF0aWMgdm9pZCBudl9hZG1hX3NldHVwX3BvcnQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICptbWlvID0gcHJvYmVfZW50LT5tbWlvX2Jhc2U7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb3BvcnQgPSAmcHJvYmVfZW50LT5wb3J0W3BvcnRdOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJbW1pbyArPSBOVl9BRE1BX1BPUlQgKyBwb3J0ICogTlZfQURNQV9QT1JUX1NJWkU7CisKKwlpb3BvcnQtPmNtZF9hZGRyCT0gKHVuc2lnbmVkIGxvbmcpIG1taW87CisJaW9wb3J0LT5kYXRhX2FkZHIJPSAodW5zaWduZWQgbG9uZykgbW1pbyArIChBVEFfUkVHX0RBVEEgKiA0KTsKKwlpb3BvcnQtPmVycm9yX2FkZHIJPQorCWlvcG9ydC0+ZmVhdHVyZV9hZGRyCT0gKHVuc2lnbmVkIGxvbmcpIG1taW8gKyAoQVRBX1JFR19FUlIgKiA0KTsKKwlpb3BvcnQtPm5zZWN0X2FkZHIJPSAodW5zaWduZWQgbG9uZykgbW1pbyArIChBVEFfUkVHX05TRUNUICogNCk7CisJaW9wb3J0LT5sYmFsX2FkZHIJPSAodW5zaWduZWQgbG9uZykgbW1pbyArIChBVEFfUkVHX0xCQUwgKiA0KTsKKwlpb3BvcnQtPmxiYW1fYWRkcgk9ICh1bnNpZ25lZCBsb25nKSBtbWlvICsgKEFUQV9SRUdfTEJBTSAqIDQpOworCWlvcG9ydC0+bGJhaF9hZGRyCT0gKHVuc2lnbmVkIGxvbmcpIG1taW8gKyAoQVRBX1JFR19MQkFIICogNCk7CisJaW9wb3J0LT5kZXZpY2VfYWRkcgk9ICh1bnNpZ25lZCBsb25nKSBtbWlvICsgKEFUQV9SRUdfREVWSUNFICogNCk7CisJaW9wb3J0LT5zdGF0dXNfYWRkcgk9CisJaW9wb3J0LT5jb21tYW5kX2FkZHIJPSAodW5zaWduZWQgbG9uZykgbW1pbyArIChBVEFfUkVHX1NUQVRVUyAqIDQpOworCWlvcG9ydC0+YWx0c3RhdHVzX2FkZHIJPQorCWlvcG9ydC0+Y3RsX2FkZHIJPSAodW5zaWduZWQgbG9uZykgbW1pbyArIDB4MjA7Cit9CisKK3N0YXRpYyBpbnQgbnZfYWRtYV9ob3N0X2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocHJvYmVfZW50LT5kZXYpOworCXVuc2lnbmVkIGludCBpOworCXUzMiB0bXAzMjsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCS8qIGVuYWJsZSBBRE1BIG9uIHRoZSBwb3J0cyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZ0bXAzMik7CisJdG1wMzIgfD0gTlZfTUNQX1NBVEFfQ0ZHXzIwX1BPUlQwX0VOIHwKKwkJIE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMF9QV0JfRU4gfAorCQkgTlZfTUNQX1NBVEFfQ0ZHXzIwX1BPUlQxX0VOIHwKKwkJIE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMV9QV0JfRU47CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgdG1wMzIpOworCisJZm9yIChpID0gMDsgaSA8IHByb2JlX2VudC0+bl9wb3J0czsgaSsrKQorCQludl9hZG1hX3NldHVwX3BvcnQocHJvYmVfZW50LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKm1taW8gPSBfX252X2FkbWFfY3RsX2Jsb2NrKHByb2JlX2VudC0+bW1pb19iYXNlLCBpKTsKKwkJdTE2IHRtcDsKKworCQkvKiBlbmFibGUgaW50ZXJydXB0LCBjbGVhciByZXNldCBpZiBub3QgYWxyZWFkeSBjbGVhciAqLworCQl0bXAgPSByZWFkdyhtbWlvICsgTlZfQURNQV9DVEwpOworCQl3cml0ZXcodG1wIHwgTlZfQURNQV9DVExfQUlFTiwgbW1pbyArIE5WX0FETUFfQ1RMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnZfYWRtYV9maWxsX2FwcmQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywKKwkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgICBpbnQgaWR4LAorCQkJICAgICAgc3RydWN0IG52X2FkbWFfcHJkICphcHJkKQoreworCXU4IGZsYWdzOworCisJbWVtc2V0KGFwcmQsIDAsIHNpemVvZihzdHJ1Y3QgbnZfYWRtYV9wcmQpKTsKKworCWZsYWdzID0gMDsKKwlpZiAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKQorCQlmbGFncyB8PSBOVl9BUFJEX1dSSVRFOworCWlmIChpZHggPT0gcWMtPm5fZWxlbSAtIDEpCisJCWZsYWdzIHw9IE5WX0FQUkRfRU5EOworCWVsc2UgaWYgKGlkeCAhPSA0KQorCQlmbGFncyB8PSBOVl9BUFJEX0NPTlQ7CisKKwlhcHJkLT5hZGRyICA9IGNwdV90b19sZTY0KCgodTY0KXNnX2RtYV9hZGRyZXNzKHNnKSkpOworCWFwcmQtPmxlbiAgID0gY3B1X3RvX2xlMzIoKCh1MzIpc2dfZG1hX2xlbihzZykpKTsgLyogbGVuIGluIGJ5dGVzICovCisJYXByZC0+ZmxhZ3MgPSBmbGFnczsKK30KKworc3RhdGljIHZvaWQgbnZfYWRtYV9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHN0cnVjdCBudl9hZG1hX2NwYiAqY3BiKQoreworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHAgPSBxYy0+YXAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXN0cnVjdCBudl9hZG1hX3ByZCAqYXByZDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaWR4ID0gMDsKKworCWF0YV9mb3JfZWFjaF9zZyhzZywgcWMpIHsKKwkJYXByZCA9IChpZHggPCA1KSA/ICZjcGItPmFwcmRbaWR4XSA6ICZwcC0+YXByZFtOVl9BRE1BX1NHVEJMX0xFTiAqIHFjLT50YWcgKyAoaWR4LTUpXTsKKwkJbnZfYWRtYV9maWxsX2FwcmQocWMsIHNnLCBpZHgsIGFwcmQpOworCQlpZHgrKzsKKwl9CisJaWYgKGlkeCA+IDUpCisJCWNwYi0+bmV4dF9hcHJkID0gY3B1X3RvX2xlNjQoKCh1NjQpKHBwLT5hcHJkX2RtYSArIE5WX0FETUFfU0dUQkxfU1ogKiBxYy0+dGFnKSkpOworfQorCitzdGF0aWMgdm9pZCBudl9hZG1hX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgbnZfYWRtYV9wb3J0X3ByaXYgKnBwID0gcWMtPmFwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG52X2FkbWFfY3BiICpjcGIgPSAmcHAtPmNwYltxYy0+dGFnXTsKKwl1OCBjdGxfZmxhZ3MgPSBOVl9DUEJfQ1RMX0NQQl9WQUxJRCB8CisJCSAgICAgICBOVl9DUEJfQ1RMX0FQUkRfVkFMSUQgfAorCQkgICAgICAgTlZfQ1BCX0NUTF9JRU47CisKKwlWUFJJTlRLKCJxYy0+ZmxhZ3MgPSAweCVseFxuIiwgcWMtPmZsYWdzKTsKKworCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKSB8fAorCSAgICAgKHBwLT5mbGFncyAmIE5WX0FETUFfQVRBUElfU0VUVVBfQ09NUExFVEUpKSB7CisJCW52X2FkbWFfcmVnaXN0ZXJfbW9kZShxYy0+YXApOworCQlhdGFfcWNfcHJlcChxYyk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoY3BiLCAwLCBzaXplb2Yoc3RydWN0IG52X2FkbWFfY3BiKSk7CisKKwljcGItPmxlbgkJPSAzOworCWNwYi0+dGFnCQk9IHFjLT50YWc7CisJY3BiLT5uZXh0X2NwYl9pZHgJPSAwOworCisJLyogdHVybiBvbiBOQ1EgZmxhZ3MgZm9yIE5DUSBjb21tYW5kcyAqLworCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfTkNRKQorCQljdGxfZmxhZ3MgfD0gTlZfQ1BCX0NUTF9RVUVVRSB8IE5WX0NQQl9DVExfRlBETUE7CisKKwludl9hZG1hX3RmX3RvX2NwYigmcWMtPnRmLCBjcGItPnRmKTsKKworCW52X2FkbWFfZmlsbF9zZyhxYywgY3BiKTsKKworCS8qIEJlIHBhcmFub2lkIGFuZCBkb24ndCBsZXQgdGhlIGRldmljZSBzZWUgTlZfQ1BCX0NUTF9DUEJfVkFMSUQgdW50aWwgd2UgYXJlCisJICAgZmluaXNoZWQgZmlsbGluZyBpbiBhbGwgb2YgdGhlIGNvbnRlbnRzICovCisJd21iKCk7CisJY3BiLT5jdGxfZmxhZ3MgPSBjdGxfZmxhZ3M7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnZfYWRtYV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHAgPSBxYy0+YXAtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBudl9hZG1hX2N0bF9ibG9jayhxYy0+YXApOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaWYgKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApIHx8CisJICAgICAocHAtPmZsYWdzICYgTlZfQURNQV9BVEFQSV9TRVRVUF9DT01QTEVURSkpIHsKKwkJLyogdXNlIEFUQSByZWdpc3RlciBtb2RlICovCisJCVZQUklOVEsoIm5vIGRtYW1hcCBvciBBVEFQSSwgdXNpbmcgQVRBIHJlZ2lzdGVyIG1vZGU6IDB4JWx4XG4iLCBxYy0+ZmxhZ3MpOworCQludl9hZG1hX3JlZ2lzdGVyX21vZGUocWMtPmFwKTsKKwkJcmV0dXJuIGF0YV9xY19pc3N1ZV9wcm90KHFjKTsKKwl9IGVsc2UKKwkJbnZfYWRtYV9tb2RlKHFjLT5hcCk7CisKKwkvKiB3cml0ZSBhcHBlbmQgcmVnaXN0ZXIsIGNvbW1hbmQgdGFnIGluIGxvd2VyIDggYml0cworCSAgIGFuZCAobnVtYmVyIG9mIGNwYnMgdG8gYXBwZW5kIC0xKSBpbiB0b3AgOCBiaXRzICovCisJd21iKCk7CisJd3JpdGV3KHFjLT50YWcsIG1taW8gKyBOVl9BRE1BX0FQUEVORCk7CisKKwlEUFJJTlRLKCJJc3N1ZWQgdGFnICV1XG4iLHFjLT50YWcpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBudl9nZW5lcmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2luc3RhbmNlOwpAQCAtMzEwLDM3ICsxMjE2LDYgQEAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAotc3RhdGljIGludCBudl9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggaXJxX3N0YXQpCi17Ci0Jc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCWludCBoYW5kbGVkOwotCi0JLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgKi8KLQlpZiAodW5saWtlbHkoaXJxX3N0YXQgJiAoTlZfSU5UX0FEREVEIHwgTlZfSU5UX1JFTU9WRUQpKSkgewotCQlhdGFfcG9ydF9mcmVlemUoYXApOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBiYWlsIG91dCBpZiBub3Qgb3VyIGludGVycnVwdCAqLwotCWlmICghKGlycV9zdGF0ICYgTlZfSU5UX0RFVikpCi0JCXJldHVybiAwOwotCi0JLyogREVWIGludGVycnVwdCB3LyBubyBhY3RpdmUgcWM/ICovCi0JaWYgKHVubGlrZWx5KCFxYyB8fCAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSkgewotCQlhdGFfY2hlY2tfc3RhdHVzKGFwKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogaGFuZGxlIGludGVycnVwdCAqLwotCWhhbmRsZWQgPSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7Ci0JaWYgKHVubGlrZWx5KCFoYW5kbGVkKSkgewotCQkvKiBzcHVyaW91cywgY2xlYXIgaXQgKi8KLQkJYXRhX2NoZWNrX3N0YXR1cyhhcCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBudl9kb19pbnRlcnJ1cHQoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1OCBpcnFfc3RhdCkKIHsKIAlpbnQgaSwgaGFuZGxlZCA9IDA7CkBAIC00NjYsNiArMTM0MSw1NiBAQAogCQkJICAgbnZfaGFyZHJlc2V0LCBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKK3N0YXRpYyB2b2lkIG52X2FkbWFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCWlmKCEocHAtPmZsYWdzICYgTlZfQURNQV9QT1JUX1JFR0lTVEVSX01PREUpKSB7CisJCXZvaWQgX19pb21lbSAqbW1pbyA9IG52X2FkbWFfY3RsX2Jsb2NrKGFwKTsKKwkJaW50IGk7CisJCXUxNiB0bXA7CisKKwkJdTMyIG5vdGlmaWVyID0gcmVhZGwobW1pbyArIE5WX0FETUFfTk9USUZJRVIpOworCQl1MzIgbm90aWZpZXJfZXJyb3IgPSByZWFkbChtbWlvICsgTlZfQURNQV9OT1RJRklFUl9FUlJPUik7CisJCXUzMiBnZW5fY3RsID0gcmVhZGwobnZfYWRtYV9nZW5fYmxvY2soYXApICsgTlZfQURNQV9HRU5fQ1RMKTsKKwkJdTMyIHN0YXR1cyA9IHJlYWR3KG1taW8gKyBOVl9BRE1BX1NUQVQpOworCisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJFSCBpbiBBRE1BIG1vZGUsIG5vdGlmaWVyIDB4JVggIgorCQkJIm5vdGlmaWVyX2Vycm9yIDB4JVggZ2VuX2N0bCAweCVYIHN0YXR1cyAweCVYXG4iLAorCQkJbm90aWZpZXIsIG5vdGlmaWVyX2Vycm9yLCBnZW5fY3RsLCBzdGF0dXMpOworCisJCWZvciggaT0wO2k8TlZfQURNQV9NQVhfQ1BCUztpKyspIHsKKwkJCXN0cnVjdCBudl9hZG1hX2NwYiAqY3BiID0gJnBwLT5jcGJbaV07CisJCQlpZiggY3BiLT5jdGxfZmxhZ3MgfHwgY3BiLT5yZXNwX2ZsYWdzICkKKwkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJCQkiQ1BCICVkOiBjdGxfZmxhZ3MgMHgleCwgcmVzcF9mbGFncyAweCV4XG4iLAorCQkJCQlpLCBjcGItPmN0bF9mbGFncywgY3BiLT5yZXNwX2ZsYWdzKTsKKwkJfQorCisJCS8qIFB1c2ggdXMgYmFjayBpbnRvIHBvcnQgcmVnaXN0ZXIgbW9kZSBmb3IgZXJyb3IgaGFuZGxpbmcuICovCisJCW52X2FkbWFfcmVnaXN0ZXJfbW9kZShhcCk7CisKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlJlc2V0dGluZyBwb3J0XG4iKTsKKworCQkvKiBNYXJrIGFsbCBvZiB0aGUgQ1BCcyBhcyBpbnZhbGlkIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGV4ZWN1dGVkICovCisJCWZvciggaT0wO2k8TlZfQURNQV9NQVhfQ1BCUztpKyspCisJCQlwcC0+Y3BiW2ldLmN0bF9mbGFncyAmPSB+TlZfQ1BCX0NUTF9DUEJfVkFMSUQ7CisKKwkJLyogY2xlYXIgQ1BCIGZldGNoIGNvdW50ICovCisJCXdyaXRldygwLCBtbWlvICsgTlZfQURNQV9DUEJfQ09VTlQpOworCisJCS8qIFJlc2V0IGNoYW5uZWwgKi8KKwkJdG1wID0gcmVhZHcobW1pbyArIE5WX0FETUFfQ1RMKTsKKwkJd3JpdGV3KHRtcCB8IE5WX0FETUFfQ1RMX0NIQU5ORUxfUkVTRVQsIG1taW8gKyBOVl9BRE1BX0NUTCk7CisJCXJlYWRsKCBtbWlvICsgTlZfQURNQV9DVEwgKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCisJCXVkZWxheSgxKTsKKwkJd3JpdGV3KHRtcCAmIH5OVl9BRE1BX0NUTF9DSEFOTkVMX1JFU0VULCBtbWlvICsgTlZfQURNQV9DVEwpOworCQlyZWFkbCggbW1pbyArIE5WX0FETUFfQ1RMICk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworCX0KKworCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgYXRhX3N0ZF9wcmVyZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsCisJCQkgICBudl9oYXJkcmVzZXQsIGF0YV9zdGRfcG9zdHJlc2V0KTsKK30KKwogc3RhdGljIGludCBudl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb24gPSAwOwpAQCAtNDc1LDYgKzE0MDAsOCBAQAogCWludCByYzsKIAl1MzIgYmFyOwogCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl1bnNpZ25lZCBsb25nIHR5cGUgPSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBtYXNrX3NldCA9IDA7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgYSBTQVRBIGNvbnRyb2xsZXIgYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBiYXJzCiAgICAgICAgIC8vIChOVklESUEgU0FUQSBjb250cm9sbGVycyB3aWxsIGFsd2F5cyBoYXZlIHNpeCBiYXJzKS4gIE90aGVyd2lzZSwKQEAgLTQ4Myw3ICsxNDEwLDcgQEAKIAkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpID09IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJaWYgKAkhcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAogCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC00OTYsMTYgKzE0MjMsMjYgQEAKIAkJZ290byBlcnJfb3V0X2Rpc2FibGU7CiAJfQogCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOwotCWlmIChyYykKLQkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJaWYodHlwZSA+PSBDSzgwNCAmJiBhZG1hX2VuYWJsZWQpIHsKKwkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBkZXYtPmRldiwgIlVzaW5nIEFETUEgbW9kZVxuIik7CisJCXR5cGUgPSBBRE1BOworCQlpZighcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgJiYKKwkJICAgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpCisJCQltYXNrX3NldCA9IDE7CisJfQorCisJaWYoIW1hc2tfc2V0KSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCQlpZiAocmMpCisJCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQogCiAJcmMgPSAtRU5PTUVNOwogCi0JcHBpWzBdID0gcHBpWzFdID0gJm52X3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKwlwcGlbMF0gPSBwcGlbMV0gPSAmbnZfcG9ydF9pbmZvW3R5cGVdOwogCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwcGksIEFUQV9QT1JUX1BSSU1BUlkgfCBBVEFfUE9SVF9TRUNPTkRBUlkpOwogCWlmICghcHJvYmVfZW50KQogCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKQEAgLTUyMiw3ICsxNDU5LDcgQEAKIAlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBiYXNlICsgTlZfUE9SVDFfU0NSX1JFR19PRkZTRVQ7CiAKIAkvKiBlbmFibGUgU0FUQSBzcGFjZSBmb3IgQ0s4MDQgKi8KLQlpZiAoZW50LT5kcml2ZXJfZGF0YSA9PSBDSzgwNCkgeworCWlmICh0eXBlID49IENLODA0KSB7CiAJCXU4IHJlZ3ZhbDsKIAogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZyZWd2YWwpOwpAQCAtNTMyLDYgKzE0NjksMTIgQEAKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCisJaWYgKHR5cGUgPT0gQURNQSkgeworCQlyYyA9IG52X2FkbWFfaG9zdF9pbml0KHByb2JlX2VudCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKwogCXJjID0gYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKIAlpZiAocmMgIT0gTlZfUE9SVFMpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwpAQCAtNTY2LDYgKzE1MDksMzMgQEAKIAlhdGFfcGNpX2hvc3Rfc3RvcChob3N0KTsKIH0KIAorc3RhdGljIHZvaWQgbnZfYWRtYV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCWludCBpOworCXUzMiB0bXAzMjsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICptbWlvID0gX19udl9hZG1hX2N0bF9ibG9jayhob3N0LT5tbWlvX2Jhc2UsIGkpOworCQl1MTYgdG1wOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJCXRtcCA9IHJlYWR3KG1taW8gKyBOVl9BRE1BX0NUTCk7CisJCXdyaXRldyh0bXAgJiB+TlZfQURNQV9DVExfQUlFTiwgbW1pbyArIE5WX0FETUFfQ1RMKTsKKwl9CisKKwkvKiBkaXNhYmxlIEFETUEgb24gdGhlIHBvcnRzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgJnRtcDMyKTsKKwl0bXAzMiAmPSB+KE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMF9FTiB8CisJCSAgIE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMF9QV0JfRU4gfAorCQkgICBOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDFfRU4gfAorCQkgICBOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDFfUFdCX0VOKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTlZfTUNQX1NBVEFfQ0ZHXzIwLCB0bXAzMik7CisKKwludl9jazgwNF9ob3N0X3N0b3AoaG9zdCk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG52X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbnZfcGNpX2RyaXZlcik7CkBAIC01NzgsMyArMTU0OCw1IEBACiAKIG1vZHVsZV9pbml0KG52X2luaXQpOwogbW9kdWxlX2V4aXQobnZfZXhpdCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYWRtYSwgYWRtYV9lbmFibGVkLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWRtYSwgIkVuYWJsZSB1c2Ugb2YgQURNQSAoRGVmYXVsdDogdHJ1ZSkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggNzJlZGE1MS4uYTI3NzhjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTQ2LDIwICs0NiwxOSBAQAogI2luY2x1ZGUgInNhdGFfcHJvbWlzZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3Byb21pc2UiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIxLjA0IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wNSIKIAogCiBlbnVtIHsKIAlQRENfUEtUX1NVQk1JVAkJPSAweDQwLCAvKiBDb21tYW5kIHBhY2tldCBwb2ludGVyIGFkZHIgKi8KIAlQRENfSU5UX1NFUU1BU0sJCT0gMHg0MCwJLyogTWFzayBvZiBhc3NlcnRlZCBTRVEgSU5UcyAqLwotCVBEQ19UQkdfTU9ERQkJPSAweDQxLAkvKiBUQkcgbW9kZSAqLwogCVBEQ19GTEFTSF9DVEwJCT0gMHg0NCwgLyogRmxhc2ggY29udHJvbCByZWdpc3RlciAqLwotCVBEQ19QQ0lfQ1RMCQk9IDB4NDgsIC8qIFBDSSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KIAlQRENfR0xPQkFMX0NUTAkJPSAweDQ4LCAvKiBHbG9iYWwgY29udHJvbC9zdGF0dXMgKHBlciBwb3J0KSAqLwogCVBEQ19DVExTVEFUCQk9IDB4NjAsCS8qIElERSBjb250cm9sIGFuZCBzdGF0dXMgKHBlciBwb3J0KSAqLwogCVBEQ19TQVRBX1BMVUdfQ1NSCT0gMHg2QywgLyogU0FUQSBQbHVnIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwogCVBEQzJfU0FUQV9QTFVHX0NTUgk9IDB4NjAsIC8qIFNBVEFJSSBQbHVnIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwotCVBEQ19TTEVXX0NUTAkJPSAweDQ3MCwgLyogc2xldyByYXRlIGNvbnRyb2wgcmVnICovCisJUERDX1RCR19NT0RFCQk9IDB4NDFDLCAvKiBUQkcgbW9kZSAobm90IFNBVEFJSSkgKi8KKwlQRENfU0xFV19DVEwJCT0gMHg0NzAsIC8qIHNsZXcgcmF0ZSBjb250cm9sIHJlZyAobm90IFNBVEFJSSkgKi8KIAogCVBEQ19FUlJfTUFTSwkJPSAoMTw8MTkpIHwgKDE8PDIwKSB8ICgxPDwyMSkgfCAoMTw8MjIpIHwKIAkJCQkgICgxPDw4KSB8ICgxPDw5KSB8ICgxPDwxMCksCkBAIC03OCw2ICs3Nyw5IEBACiAJUERDX0NPTU1PTl9GTEFHUwk9IEFUQV9GTEFHX05PX0xFR0FDWSB8IEFUQV9GTEFHX1NSU1QgfAogCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX05PX0FUQVBJIHwKIAkJCQkgIEFUQV9GTEFHX1BJT19QT0xMSU5HLAorCisJLyogaHAtPmZsYWdzIGJpdHMgKi8KKwlQRENfRkxBR19HRU5fSUkJCT0gKDEgPDwgMCksCiB9OwogCiAKQEAgLTg3LDYgKzg5LDcgQEAKIH07CiAKIHN0cnVjdCBwZGNfaG9zdF9wcml2IHsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlpbnQJCQlob3RwbHVnX29mZnNldDsKIH07CiAKQEAgLTIzNSwyMCArMjM4LDIwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwZGNfYXRhX3BjaV90YmxbXSA9IHsKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzM3MSksIGJvYXJkXzIwMzd4IH0sCi0JeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDM1NzApLCBib2FyZF8yMDM3eCB9LAotCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTcxKSwgYm9hcmRfMjAzN3ggfSwKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzM3MyksIGJvYXJkXzIwMzd4IH0sCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDMzNzUpLCBib2FyZF8yMDM3eCB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzMzc2KSwgYm9hcmRfMjAzN3ggfSwKKwl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzU3MCksIGJvYXJkXzIwNTd4IH0sCisJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDM1NzEpLCBib2FyZF8yMDU3eCB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTc0KSwgYm9hcmRfMjA1N3ggfSwKKwl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4M2Q3MyksIGJvYXJkXzIwNTd4IH0sCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDNkNzUpLCBib2FyZF8yMDU3eCB9LAotCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzZDczKSwgYm9hcmRfMjAzN3ggfSwKIAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzMzE4KSwgYm9hcmRfMjAzMTkgfSwKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzMxOSksIGJvYXJkXzIwMzE5IH0sCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDM1MTUpLCBib2FyZF8yMDMxOSB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTE5KSwgYm9hcmRfMjAzMTkgfSwKLQl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4M2QxNyksIGJvYXJkXzIwMzE5IH0sCisJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDNkMTcpLCBib2FyZF80MDUxOCB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzZDE4KSwgYm9hcmRfNDA1MTggfSwKIAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHg2NjI5KSwgYm9hcmRfMjA2MTkgfSwKQEAgLTI3Nyw2ICsyODAsNyBAQAogc3RhdGljIGludCBwZGNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0LT5kZXY7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHA7CiAJaW50IHJjOwogCkBAIC0yOTgsNiArMzAyLDE2IEBACiAKIAlhcC0+cHJpdmF0ZV9kYXRhID0gcHA7CiAKKwkvKiBmaXggdXAgUEhZTU9ERTQgYWxpZ24gdGltaW5nICovCisJaWYgKChocC0+ZmxhZ3MgJiBQRENfRkxBR19HRU5fSUkpICYmIHNhdGFfc2NyX3ZhbGlkKGFwKSkgeworCQl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuc2NyX2FkZHI7CisJCXVuc2lnbmVkIGludCB0bXA7CisKKwkJdG1wID0gcmVhZGwobW1pbyArIDB4MDE0KTsKKwkJdG1wID0gKHRtcCAmIH4zKSB8IDE7CS8qIHNldCBiaXRzIDE6MCA9IDA6MSAqLworCQl3cml0ZWwodG1wLCBtbWlvICsgMHgwMTQpOworCX0KKwogCXJldHVybiAwOwogCiBlcnJfb3V0X2tmcmVlOgpAQCAtNjQwLDkgKzY1NCwxMSBAQAogCSAqICJUT0RPOiBmaWd1cmUgb3V0IHdoeSB3ZSBkbyB0aGlzIgogCSAqLwogCi0JLyogY2hhbmdlIEZJRk9fU0hEIHRvIDggZHdvcmRzLCBlbmFibGUgQk1SX0JVUlNUICovCisJLyogZW5hYmxlIEJNUl9CVVJTVCwgbWF5YmUgY2hhbmdlIEZJRk9fU0hEIHRvIDggZHdvcmRzICovCiAJdG1wID0gcmVhZGwobW1pbyArIFBEQ19GTEFTSF9DVEwpOwotCXRtcCB8PSAweDEyMDAwOwkvKiBiaXQgMTYgKGZpZm8gOCBkdykgYW5kIDEzIChibXIgYnVyc3Q/KSAqLworCXRtcCB8PSAweDAyMDAwOwkvKiBiaXQgMTMgKGVuYWJsZSBibXIgYnVyc3QpICovCisJaWYgKCEoaHAtPmZsYWdzICYgUERDX0ZMQUdfR0VOX0lJKSkKKwkJdG1wIHw9IDB4MTAwMDA7CS8qIGJpdCAxNiAoZmlmbyB0aHJlc2hvbGQgYXQgOCBkdykgKi8KIAl3cml0ZWwodG1wLCBtbWlvICsgUERDX0ZMQVNIX0NUTCk7CiAKIAkvKiBjbGVhciBwbHVnL3VucGx1ZyBmbGFncyBmb3IgYWxsIHBvcnRzICovCkBAIC02NTMsNiArNjY5LDEwIEBACiAJdG1wID0gcmVhZGwobW1pbyArIGhvdHBsdWdfb2Zmc2V0KTsKIAl3cml0ZWwodG1wIHwgMHhmZjAwMDAsIG1taW8gKyBob3RwbHVnX29mZnNldCk7CiAKKwkvKiBkb24ndCBpbml0aWFsaXNlIFRCRyBvciBTTEVXIG9uIDJuZCBnZW5lcmF0aW9uIGNoaXBzICovCisJaWYgKGhwLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSSkKKwkJcmV0dXJuOworCiAJLyogcmVkdWNlIFRCRyBjbG9jayB0byAxMzMgTWh6LiAqLwogCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfVEJHX01PREUpOwogCXRtcCAmPSB+MHgzMDAwMDsgLyogY2xlYXIgYml0IDE3LCAxNiovCkBAIC03NDYsNiArNzY2LDcgQEAKIAkvKiBub3RpY2UgNC1wb3J0IGJvYXJkcyAqLwogCXN3aXRjaCAoYm9hcmRfaWR4KSB7CiAJY2FzZSBib2FyZF80MDUxODoKKwkJaHAtPmZsYWdzIHw9IFBEQ19GTEFHX0dFTl9JSTsKIAkJLyogT3ZlcnJpZGUgaG90cGx1ZyBvZmZzZXQgZm9yIFNBVEFJSTE1MCAqLwogCQlocC0+aG90cGx1Z19vZmZzZXQgPSBQREMyX1NBVEFfUExVR19DU1I7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwpAQCAtNzU5LDE1ICs3ODAsMTQgQEAKIAkJcHJvYmVfZW50LT5wb3J0WzNdLnNjcl9hZGRyID0gYmFzZSArIDB4NzAwOwogCQlicmVhazsKIAljYXNlIGJvYXJkXzIwNTd4OgorCWNhc2UgYm9hcmRfMjA3NzE6CisJCWhwLT5mbGFncyB8PSBQRENfRkxBR19HRU5fSUk7CiAJCS8qIE92ZXJyaWRlIGhvdHBsdWcgb2Zmc2V0IGZvciBTQVRBSUkxNTAgKi8KIAkJaHAtPmhvdHBsdWdfb2Zmc2V0ID0gUERDMl9TQVRBX1BMVUdfQ1NSOwogCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIGJvYXJkXzIwMzd4OgogCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSAyOwogCQlicmVhazsKLQljYXNlIGJvYXJkXzIwNzcxOgotCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSAyOwotCQlicmVhazsKIAljYXNlIGJvYXJkXzIwNjE5OgogCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwppbmRleCBjYThkOTkzLi43ODA4ZDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTM1Niw2ICszNTYsNyBAQAogCiBzdGF0aWMgdm9pZCBzaWxfaG9zdF9pbnRyKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHUzMiBibWRtYTIpCiB7CisJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmVoX2luZm87CiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwogCXU4IHN0YXR1czsKIApAQCAtNDI4LDYgKzQyOSwxMCBAQAogCS8qIGtpY2sgSFNNIGluIHRoZSBhc3MgKi8KIAlhdGFfaHNtX21vdmUoYXAsIHFjLCBzdGF0dXMsIDApOwogCisJaWYgKHVubGlrZWx5KHFjLT5lcnJfbWFzaykgJiYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgfHwKKwkJCQkgICAgICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkpCisJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIkJNRE1BMiBzdGF0IDB4JXgiLCBibWRtYTIpOworCiAJcmV0dXJuOwogCiAgZXJyX2hzbToKQEAgLTUzNCw2ICs1MzksNyBAQAogICovCiBzdGF0aWMgdm9pZCBzaWxfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogeworCWludCBwcmludF9pbmZvID0gYXAtPmVoX2NvbnRleHQuaS5mbGFncyAmIEFUQV9FSElfUFJJTlRJTkZPOwogCXVuc2lnbmVkIGludCBuLCBxdWlya3MgPSAwOwogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtWzQxXTsKIApAQCAtNTQ5LDE2ICs1NTUsMTggQEAKIAlpZiAoc2xvd19kb3duIHx8CiAJICAgICgoYXAtPmZsYWdzICYgU0lMX0ZMQUdfTU9EMTVXUklURSkgJiYKIAkgICAgIChxdWlya3MgJiBTSUxfUVVJUktfTU9EMTVXUklURSkpKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiYXBwbHlpbmcgU2VhZ2F0ZSBlcnJhdGEgZml4ICIKLQkJCSAgICAgICAiKG1vZDE1d3JpdGUgd29ya2Fyb3VuZClcbiIpOworCQlpZiAocHJpbnRfaW5mbykKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiYXBwbHlpbmcgU2VhZ2F0ZSAiCisJCQkJICAgICAgICJlcnJhdGEgZml4IChtb2QxNXdyaXRlIHdvcmthcm91bmQpXG4iKTsKIAkJZGV2LT5tYXhfc2VjdG9ycyA9IDE1OwogCQlyZXR1cm47CiAJfQogCiAJLyogbGltaXQgdG8gdWRtYTUgKi8KIAlpZiAocXVpcmtzICYgU0lMX1FVSVJLX1VETUE1TUFYKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAotCQkJICAgICAgICJhcHBseWluZyBNYXh0b3IgZXJyYXRhIGZpeCAlc1xuIiwgbW9kZWxfbnVtKTsKKwkJaWYgKHByaW50X2luZm8pCisJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImFwcGx5aW5nIE1heHRvciAiCisJCQkJICAgICAgICJlcnJhdGEgZml4ICVzXG4iLCBtb2RlbF9udW0pOwogCQlkZXYtPnVkbWFfbWFzayAmPSBBVEFfVURNQTU7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKaW5kZXggMTY5ZTIwMC4uNWFhMjg4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwpAQCAtMTAwLDEwICsxMDAsMTQgQEAKIAkgKi8KIAlQT1JUX1JFR1NfU0laRQkJPSAweDIwMDAsCiAKLQlQT1JUX0xSQU0JCT0gMHgwMDAwLCAvKiAzMSBMUkFNIHNsb3RzIGFuZCBQTSByZWdzICovCisJUE9SVF9MUkFNCQk9IDB4MDAwMCwgLyogMzEgTFJBTSBzbG90cyBhbmQgUE1QIHJlZ3MgKi8KIAlQT1JUX0xSQU1fU0xPVF9TWgk9IDB4MDA4MCwgLyogMzIgYnl0ZXMgUFJCICsgMiBTR0UsIEFDVC4uLiAqLwogCi0JUE9SVF9QTQkJCT0gMHgwZjgwLCAvKiA4IGJ5dGVzIFBNICogMTYgKDEyOCBieXRlcykgKi8KKwlQT1JUX1BNUAkJPSAweDBmODAsIC8qIDggYnl0ZXMgUE1QICogMTYgKDEyOCBieXRlcykgKi8KKwlQT1JUX1BNUF9TVEFUVVMJCT0gMHgwMDAwLCAvKiBwb3J0IGRldmljZSBzdGF0dXMgb2Zmc2V0ICovCisJUE9SVF9QTVBfUUFDVElWRQk9IDB4MDAwNCwgLyogcG9ydCBkZXZpY2UgUUFjdGl2ZSBvZmZzZXQgKi8KKwlQT1JUX1BNUF9TSVpFCQk9IDB4MDAwOCwgLyogOCBieXRlcyBwZXIgUE1QICovCisKIAkJLyogMzIgYml0IHJlZ3MgKi8KIAlQT1JUX0NUUkxfU1RBVAkJPSAweDEwMDAsIC8qIHdyaXRlOiBjdHJsLXNldCwgcmVhZDogc3RhdCAqLwogCVBPUlRfQ1RSTF9DTFIJCT0gMHgxMDA0LCAvKiB3cml0ZTogY3RybC1jbGVhciAqLwpAQCAtMTI2LDYgKzEzMCw3IEBACiAJUE9SVF9QSFlfQ0ZHCQk9IDB4MTA1MCwKIAlQT1JUX1NMT1RfU1RBVAkJPSAweDE4MDAsCiAJUE9SVF9DTURfQUNUSVZBVEUJPSAweDFjMDAsIC8qIDY0IGJpdCBjbWQgYWN0aXZhdGUgKiAzMSAoMjQ4IGJ5dGVzKSAqLworCVBPUlRfQ09OVEVYVAkJPSAweDFlMDQsCiAJUE9SVF9FWEVDX0RJQUcJCT0gMHgxZTAwLCAvKiAzMmJpdCBleGVjIGRpYWcgKiAxNiAoNjQgYnl0ZXMsIDAtMTAgdXNlZCBvbiAzMTI0KSAqLwogCVBPUlRfUFNEX0RJQUcJCT0gMHgxZTQwLCAvKiAzMmJpdCBwc2QgZGlhZyAqIDE2ICg2NCBieXRlcywgMC04IHVzZWQgb24gMzEyNCkgKi8KIAlQT1JUX1NDT05UUk9MCQk9IDB4MWYwMCwKQEAgLTEzOSw5ICsxNDQsOSBAQAogCVBPUlRfQ1NfSU5JVAkJPSAoMSA8PCAyKSwgLyogcG9ydCBpbml0aWFsaXplICovCiAJUE9SVF9DU19JUlFfV09DCQk9ICgxIDw8IDMpLCAvKiBpbnRlcnJ1cHQgd3JpdGUgb25lIHRvIGNsZWFyICovCiAJUE9SVF9DU19DREIxNgkJPSAoMSA8PCA1KSwgLyogMD0xMmIgY2RiLCAxPTE2YiBjZGIgKi8KLQlQT1JUX0NTX1JFU1VNRQkJPSAoMSA8PCA2KSwgLyogcG9ydCByZXN1bWUgKi8KKwlQT1JUX0NTX1BNUF9SRVNVTUUJPSAoMSA8PCA2KSwgLyogUE1QIHJlc3VtZSAqLwogCVBPUlRfQ1NfMzJCSVRfQUNUVgk9ICgxIDw8IDEwKSwgLyogMzItYml0IGFjdGl2YXRpb24gKi8KLQlQT1JUX0NTX1BNX0VOCQk9ICgxIDw8IDEzKSwgLyogcG9ydCBtdWx0aXBsaWVyIGVuYWJsZSAqLworCVBPUlRfQ1NfUE1QX0VOCQk9ICgxIDw8IDEzKSwgLyogcG9ydCBtdWx0aXBsaWVyIGVuYWJsZSAqLwogCVBPUlRfQ1NfUkRZCQk9ICgxIDw8IDMxKSwgLyogcG9ydCByZWFkeSB0byBhY2NlcHQgY29tbWFuZHMgKi8KIAogCS8qIFBPUlRfSVJRX1NUQVQvRU5BQkxFX1NFVC9DTFIgKi8KQEAgLTU2Miw3ICs1NjcsNyBAQAogCiAJLyogZG8gU1JTVCAqLwogCXByYi0+Y3RybCA9IGNwdV90b19sZTE2KFBSQl9DVFJMX1NSU1QpOwotCXByYi0+ZmlzWzFdID0gMDsgLyogbm8gUE0geWV0ICovCisJcHJiLT5maXNbMV0gPSAwOyAvKiBubyBQTVAgeWV0ICovCiAKIAl3cml0ZWwoKHUzMilwYWRkciwgcG9ydCArIFBPUlRfQ01EX0FDVElWQVRFKTsKIAl3cml0ZWwoKHU2NClwYWRkciA+PiAzMiwgcG9ydCArIFBPUlRfQ01EX0FDVElWQVRFICsgNCk7CkBAIC0xMDUwLDcgKzEwNTUsOCBAQAogCQl3cml0ZWwoUE9SVF9DU18zMkJJVF9BQ1RWLCBwb3J0ICsgUE9SVF9DVFJMX0NMUik7CiAKIAkJLyogQ2xlYXIgcG9ydCBtdWx0aXBsaWVyIGVuYWJsZSBhbmQgcmVzdW1lIGJpdHMgKi8KLQkJd3JpdGVsKFBPUlRfQ1NfUE1fRU4gfCBQT1JUX0NTX1JFU1VNRSwgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOworCQl3cml0ZWwoUE9SVF9DU19QTVBfRU4gfCBQT1JUX0NTX1BNUF9SRVNVTUUsCisJCSAgICAgICBwb3J0ICsgUE9SVF9DVFJMX0NMUik7CiAJfQogCiAJLyogVHVybiBvbiBpbnRlcnJ1cHRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwppbmRleCA5ZDEyMzViLi45YzI1YTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCWlmICgocGRldi0+ZGV2aWNlID09IDB4MTgyKSB8fCAocG1yICYgU0lTX1BNUl9DT01CSU5FRCkpCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkcisweDEwLCAmdmFsMik7CiAKLQlyZXR1cm4gdmFsfHZhbDI7CisJcmV0dXJuICh2YWx8dmFsMikgJiAgMHhmZmZmZmZmYjsgLyogYXZvaWQgcHJvYmxlbXMgd2l0aCBwb3dlcmRvd25lZCBwb3J0cyAqLwogfQogCiBzdGF0aWMgdm9pZCBzaXNfc2NyX2NmZ193cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjciwgdTMyIHZhbCkKQEAgLTIxMiw3ICsyMTIsNyBAQAogCWlmICgocGRldi0+ZGV2aWNlID09IDB4MTgyKSB8fCAocG1yICYgU0lTX1BNUl9DT01CSU5FRCkpCiAJCXZhbDIgPSBpbmwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSArIDB4MTApOwogCi0JcmV0dXJuIHZhbCB8IHZhbDI7CisJcmV0dXJuICh2YWwgfCB2YWwyKSAmICAweGZmZmZmZmZiOwogfQogCiBzdGF0aWMgdm9pZCBzaXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQpAQCAtMjM5LDcgKzIzOSw3IEBACiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CiAJaW50IHJjOwotCXUzMiBnZW5jdGw7CisJdTMyIGdlbmN0bCwgdmFsOwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gc2lzX3BvcnRfaW5mbywgKnBwaVsyXSA9IHsgJnBpLCAmcGkgfTsKIAlpbnQgcGNpX2Rldl9idXN5ID0gMDsKIAl1OCBwbXI7CkBAIC0yODUsMTcgKzI4NSwyNCBAQAogCWlmIChlbnQtPmRldmljZSAhPSAweDE4MikgewogCQlpZiAoKHBtciAmIFNJU19QTVJfQ09NQklORUQpID09IDApIHsKIAkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCQkJCSAgICJEZXRlY3RlZCBTaVMgMTgwLzE4MSBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CisJCQkJICAgIkRldGVjdGVkIFNpUyAxODAvMTgxLzk2NCBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CiAJCQlwb3J0Ml9zdGFydCA9IDY0OwogCQl9CiAJCWVsc2UgewogCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCiAJCQkJICAgIkRldGVjdGVkIFNpUyAxODAvMTgxIGNoaXBzZXQgaW4gY29tYmluZWQgbW9kZVxuIik7CiAJCQlwb3J0Ml9zdGFydD0wOworCQkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKIAkJfQogCX0KIAllbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJEZXRlY3RlZCBTaVMgMTgyIGNoaXBzZXRcbiIpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwZGV2LCAweDZDLCAmdmFsKTsKKwkJaWYgKHZhbCAmICgxTCA8PCAzMSkpIHsKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAiRGV0ZWN0ZWQgU2lTIDE4Mi85NjUgY2hpcHNldFxuIik7CisJCQlwaS5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOworCQl9CisJCWVsc2UKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAiRGV0ZWN0ZWQgU2lTIDE4Mi85NjVMIGNoaXBzZXRcbiIpOwogCQlwb3J0Ml9zdGFydCA9IDB4MjA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKaW5kZXggOWZmZmE3YWYuLmFmYTdkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYworKysgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKQEAgLTk3Miw3ICs5NzIsNyBAQAogICAgICAgfQogICAgICAgY2FzZSByb3VuZF91cDogewogCS8vIGNoZWNrIGFsbCBiaXRzIHRoYXQgd2UgYXJlIGRpc2NhcmRpbmcKLQlpZiAobWFuICYgKC0xPj45KSkgeworCWlmIChtYW4gJiAofjBVPj45KSkgewogCSAgbWFuID0gKG1hbj4+KDMyLTkpKSArIDE7CiAJICBpZiAobWFuID09ICgxPDw5KSkgewogCSAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciByb3VuZCB1cCBvdXRzaWRlIG9mIHJhbmdlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKaW5kZXggNjk3YWQ4Mi4uOWM2N2RmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCisrKyBiL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCX0KIAkJY2FzZSBST1VORF9VUDogewogCQkJLyogY2hlY2sgYWxsIGJpdHMgdGhhdCB3ZSBhcmUgZGlzY2FyZGluZyAqLwotCQkJaWYgKG1hbiAmICgtMT4+OSkpIHsKKwkJCWlmIChtYW4gJiAofjBVPj45KSkgewogCQkJCW1hbiA9IChtYW4+PigzMi05KSkgKyAxOwogCQkJCWlmIChtYW4gPT0gKDE8PDkpKSB7CiAJCQkJCS8qIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHJvdW5kIHVwIG91dHNpZGUgb2YgcmFuZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKaW5kZXggOWVkMWM2MC4uYmI3ZWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaXBoYXNlLmMKKysrIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogKiogIHwgIFIgfCBOWiB8ICA1LWJpdCBleHBvbmVudCAgfCAgICAgICAgOS1iaXQgbWFudGlzc2EgICAgICAgICB8CiAqKiAgKy0tLS0rLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICoqIAotKiogICAgUiA9IHJlc2VydmVyZCAod3JpdHRlbiBhcyAwKQorKiogICAgUiA9IHJlc2VydmVkICh3cml0dGVuIGFzIDApCiAqKiAgICBOWiA9IDAgaWYgMCBjZWxscy9zZWM7IDEgb3RoZXJ3aXNlCiAqKgogKiogICAgaWYgTlogPSAxLCByYXRlID0gMS5tbW1tbW1tbW0geCAyXihlZWVlZSkgY2VsbHMvc2VjCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYnVzLmMgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKaW5kZXggN2Q4YTdjZS4uNDcyODEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2J1cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9idXMuYwpAQCAtMzU1LDYgKzM1NSwyMSBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECitzdGF0aWMgaW50IG1ha2VfZGVwcmVjYXRlZF9idXNfbGlua3Moc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLAorCQkJCSAmZGV2LT5idXMtPnN1YnN5cy5rc2V0LmtvYmosICJidXMiKTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2RlcHJlY2F0ZWRfYnVzX2xpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiYnVzIik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbWFrZV9kZXByZWNhdGVkX2J1c19saW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZGVwcmVjYXRlZF9idXNfbGlua3Moc3RydWN0IGRldmljZSAqZGV2KSB7IH0KKyNlbmRpZgogCiAvKioKICAqCWJ1c19hZGRfZGV2aWNlIC0gYWRkIGRldmljZSB0byBidXMKQEAgLTM4MSw4ICszOTYsNyBAQAogCQkJCSZkZXYtPmJ1cy0+c3Vic3lzLmtzZXQua29iaiwgInN1YnN5c3RlbSIpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9zdWJzeXM7Ci0JCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwKLQkJCQkmZGV2LT5idXMtPnN1YnN5cy5rc2V0LmtvYmosICJidXMiKTsKKwkJZXJyb3IgPSBtYWtlX2RlcHJlY2F0ZWRfYnVzX2xpbmtzKGRldik7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2RlcHJlY2F0ZWQ7CiAJfQpAQCAtNDM2LDcgKzQ1MCw3IEBACiB7CiAJaWYgKGRldi0+YnVzKSB7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJzdWJzeXN0ZW0iKTsKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImJ1cyIpOworCQlyZW1vdmVfZGVwcmVjYXRlZF9idXNfbGlua3MoZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+YnVzLT5kZXZpY2VzLmtvYmosIGRldi0+YnVzX2lkKTsKIAkJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYtPmJ1cywgZGV2KTsKIAkJaWYgKGRldi0+aXNfcmVnaXN0ZXJlZCkgewpAQCAtNzI0LDYgKzczOCw4IEBACiB7CiAJaW50IHJldHZhbDsKIAorCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmYnVzLT5idXNfbm90aWZpZXIpOworCiAJcmV0dmFsID0ga29iamVjdF9zZXRfbmFtZSgmYnVzLT5zdWJzeXMua3NldC5rb2JqLCAiJXMiLCBidXMtPm5hbWUpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gb3V0OwpAQCAtNzgyLDYgKzc5OCwxOCBAQAogCXN1YnN5c3RlbV91bnJlZ2lzdGVyKCZidXMtPnN1YnN5cyk7CiB9CiAKK2ludCBidXNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGJ1c190eXBlICpidXMsIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZidXMtPmJ1c19ub3RpZmllciwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnVzX3JlZ2lzdGVyX25vdGlmaWVyKTsKKworaW50IGJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZidXMtPmJ1c19ub3RpZmllciwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIpOworCiBpbnQgX19pbml0IGJ1c2VzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gc3Vic3lzdGVtX3JlZ2lzdGVyKCZidXNfc3Vic3lzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKaW5kZXggMGZmMjY3YS4uZjA5ODg4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKQEAgLTM1Miw2ICszNTIsOTIgQEAKIAlyZXR1cm4gY2xhc3NfZGV2LT5jbGFzcy0+bmFtZTsKIH0KIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECitjaGFyICptYWtlX2NsYXNzX25hbWUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJY2hhciAqY2xhc3NfbmFtZTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzdHJsZW4obmFtZSkgKyBzdHJsZW4oa29iamVjdF9uYW1lKGtvYmopKSArIDI7CisKKwljbGFzc19uYW1lID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsYXNzX25hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3RyY3B5KGNsYXNzX25hbWUsIG5hbWUpOworCXN0cmNhdChjbGFzc19uYW1lLCAiOiIpOworCXN0cmNhdChjbGFzc19uYW1lLCBrb2JqZWN0X25hbWUoa29iaikpOworCXJldHVybiBjbGFzc19uYW1lOworfQorCitzdGF0aWMgaW50IGRlcHJlY2F0ZWRfY2xhc3NfdWV2ZW50KGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGludCAqY3VyX2luZGV4LAorCQkJCSAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplLAorCQkJCSAgIGludCAqY3VyX2xlbiwKKwkJCQkgICBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZGV2LT5kZXY7CisJY2hhciAqcGF0aDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCS8qIGFkZCBkZXZpY2UsIGJhY2tpbmcgdGhpcyBjbGFzcyBkZXZpY2UgKGRlcHJlY2F0ZWQpICovCisJcGF0aCA9IGtvYmplY3RfZ2V0X3BhdGgoJmRldi0+a29iaiwgR0ZQX0tFUk5FTCk7CisKKwlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgY3VyX2luZGV4LCBidWZmZXIsIGJ1ZmZlcl9zaXplLAorCQkgICAgICAgY3VyX2xlbiwgIlBIWVNERVZQQVRIPSVzIiwgcGF0aCk7CisJa2ZyZWUocGF0aCk7CisKKwlpZiAoZGV2LT5idXMpCisJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCBjdXJfaW5kZXgsCisJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgY3VyX2xlbiwKKwkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKKworCWlmIChkZXYtPmRyaXZlcikKKwkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsIGN1cl9pbmRleCwKKwkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCBjdXJfbGVuLAorCQkJICAgICAgICJQSFlTREVWRFJJVkVSPSVzIiwgZGV2LT5kcml2ZXItPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2VfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCWNoYXIgKmNsYXNzX25hbWU7CisJaW50IGVycm9yOworCisJaWYgKCFjbGFzc19kZXYtPmRldikKKwkJcmV0dXJuIDA7CisKKwljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsICZjbGFzc19kZXYtPmtvYmopOworCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCAmY2xhc3NfZGV2LT5rb2JqLAorCQkJCSAgY2xhc3NfbmFtZSk7CisJa2ZyZWUoY2xhc3NfbmFtZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCWNoYXIgKmNsYXNzX25hbWU7CisKKwlpZiAoIWNsYXNzX2Rldi0+ZGV2KQorCQlyZXR1cm47CisKKwljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsICZjbGFzc19kZXYtPmtvYmopOworCXN5c2ZzX3JlbW92ZV9saW5rKCZjbGFzc19kZXYtPmRldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJa2ZyZWUoY2xhc3NfbmFtZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZGVwcmVjYXRlZF9jbGFzc191ZXZlbnQoY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCQkJICBpbnQgKmN1cl9pbmRleCwgY2hhciAqYnVmZmVyLAorCQkJCQkgIGludCBidWZmZXJfc2l6ZSwgaW50ICpjdXJfbGVuLAorCQkJCQkgIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IG1ha2VfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7IHJldHVybiAwOyB9CitzdGF0aWMgdm9pZCByZW1vdmVfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7IH0KKyNlbmRpZgorCiBzdGF0aWMgaW50IGNsYXNzX3VldmVudChzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKiplbnZwLAogCQkJIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CkBAIC0zNjIsMjUgKzQ0OCw4IEBACiAKIAlwcl9kZWJ1ZygiJXMgLSBuYW1lID0gJXNcbiIsIF9fRlVOQ1RJT05fXywgY2xhc3NfZGV2LT5jbGFzc19pZCk7CiAKLQlpZiAoY2xhc3NfZGV2LT5kZXYpIHsKLQkJLyogYWRkIGRldmljZSwgYmFja2luZyB0aGlzIGNsYXNzIGRldmljZSAoZGVwcmVjYXRlZCkgKi8KLQkJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZGV2LT5kZXY7Ci0JCWNoYXIgKnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKCZkZXYtPmtvYmosIEdGUF9LRVJORUwpOwotCi0JCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwKLQkJCSAgICAgICAmbGVuZ3RoLCAiUEhZU0RFVlBBVEg9JXMiLCBwYXRoKTsKLQkJa2ZyZWUocGF0aCk7Ci0KLQkJaWYgKGRldi0+YnVzKQotCQkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAotCQkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAotCQkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKLQotCQlpZiAoZGV2LT5kcml2ZXIpCi0JCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCi0JCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCi0JCQkJICAgICAgICJQSFlTREVWRFJJVkVSPSVzIiwgZGV2LT5kcml2ZXItPm5hbWUpOwotCX0KKwlkZXByZWNhdGVkX2NsYXNzX3VldmVudChlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsCisJCQkJJmxlbmd0aCwgY2xhc3NfZGV2KTsKIAogCWlmIChNQUpPUihjbGFzc19kZXYtPmRldnQpKSB7CiAJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKQEAgLTUwNiwyOSArNTc1LDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJmNsYXNzX2Rldi0+bm9kZSk7CiB9CiAKLWNoYXIgKm1ha2VfY2xhc3NfbmFtZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQljaGFyICpjbGFzc19uYW1lOwotCWludCBzaXplOwotCi0Jc2l6ZSA9IHN0cmxlbihuYW1lKSArIHN0cmxlbihrb2JqZWN0X25hbWUoa29iaikpICsgMjsKLQotCWNsYXNzX25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghY2xhc3NfbmFtZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlzdHJjcHkoY2xhc3NfbmFtZSwgbmFtZSk7Ci0Jc3RyY2F0KGNsYXNzX25hbWUsICI6Iik7Ci0Jc3RyY2F0KGNsYXNzX25hbWUsIGtvYmplY3RfbmFtZShrb2JqKSk7Ci0JcmV0dXJuIGNsYXNzX25hbWU7Ci19Ci0KIGludCBjbGFzc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKIHsKIAlzdHJ1Y3QgY2xhc3MgKnBhcmVudF9jbGFzcyA9IE5VTEw7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqcGFyZW50X2NsYXNzX2RldiA9IE5VTEw7CiAJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKLQljaGFyICpjbGFzc19uYW1lID0gTlVMTDsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCiAJY2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2dldChjbGFzc19kZXYpOwpAQCAtNTk5LDIwICs2NTAsMTggQEAKIAkJZ290byBvdXQ1OwogCiAJaWYgKGNsYXNzX2Rldi0+ZGV2KSB7Ci0JCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSwKLQkJCQkJICAgICAmY2xhc3NfZGV2LT5rb2JqKTsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmY2xhc3NfZGV2LT5rb2JqLAogCQkJCQkgICZjbGFzc19kZXYtPmRldi0+a29iaiwgImRldmljZSIpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDY7Ci0JCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCAmY2xhc3NfZGV2LT5rb2JqLAotCQkJCQkgIGNsYXNzX25hbWUpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDc7CiAJfQogCiAJZXJyb3IgPSBjbGFzc19kZXZpY2VfYWRkX2dyb3VwcyhjbGFzc19kZXYpOwogCWlmIChlcnJvcikKKwkJZ290byBvdXQ3OworCisJZXJyb3IgPSBtYWtlX2RlcHJlY2F0ZWRfY2xhc3NfZGV2aWNlX2xpbmtzKGNsYXNzX2Rldik7CisJaWYgKGVycm9yKQogCQlnb3RvIG91dDg7CiAKIAlrb2JqZWN0X3VldmVudCgmY2xhc3NfZGV2LT5rb2JqLCBLT0JKX0FERCk7CkBAIC02MjksOCArNjc4LDcgQEAKIAlnb3RvIG91dDE7CiAKICBvdXQ4OgotCWlmIChjbGFzc19kZXYtPmRldikKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9ncm91cHMoY2xhc3NfZGV2KTsKICBvdXQ3OgogCWlmIChjbGFzc19kZXYtPmRldikKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgImRldmljZSIpOwpAQCAtNjQ5LDcgKzY5Nyw2IEBACiAJY2xhc3NfcHV0KHBhcmVudF9jbGFzcyk7CiAgb3V0MToKIAljbGFzc19kZXZpY2VfcHV0KGNsYXNzX2Rldik7Ci0Ja2ZyZWUoY2xhc3NfbmFtZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC03MjYsNyArNzczLDYgQEAKIAlzdHJ1Y3QgY2xhc3MgKnBhcmVudF9jbGFzcyA9IGNsYXNzX2Rldi0+Y2xhc3M7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqcGFyZW50X2RldmljZSA9IGNsYXNzX2Rldi0+cGFyZW50OwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGY7Ci0JY2hhciAqY2xhc3NfbmFtZSA9IE5VTEw7CiAKIAlpZiAocGFyZW50X2NsYXNzKSB7CiAJCWRvd24oJnBhcmVudF9jbGFzcy0+c2VtKTsKQEAgLTczOCwxMCArNzg0LDggQEAKIAl9CiAKIAlpZiAoY2xhc3NfZGV2LT5kZXYpIHsKLQkJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShjbGFzc19kZXYtPmNsYXNzLT5uYW1lLAotCQkJCQkgICAgICZjbGFzc19kZXYtPmtvYmopOworCQlyZW1vdmVfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3MoY2xhc3NfZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgImRldmljZSIpOwotCQlzeXNmc19yZW1vdmVfbGluaygmY2xhc3NfZGV2LT5kZXYtPmtvYmosIGNsYXNzX25hbWUpOwogCX0KIAlzeXNmc19yZW1vdmVfbGluaygmY2xhc3NfZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7CiAJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsYXNzX2RldiwgJmNsYXNzX2Rldi0+dWV2ZW50X2F0dHIpOwpAQCAtNzU1LDcgKzc5OSw2IEBACiAKIAljbGFzc19kZXZpY2VfcHV0KHBhcmVudF9kZXZpY2UpOwogCWNsYXNzX3B1dChwYXJlbnRfY2xhc3MpOwotCWtmcmVlKGNsYXNzX25hbWUpOwogfQogCiB2b2lkIGNsYXNzX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKQEAgLTgwNCwxNCArODQ3LDE3IEBACiAJcHJfZGVidWcoIkNMQVNTOiByZW5hbWluZyAnJXMnIHRvICclcydcbiIsIGNsYXNzX2Rldi0+Y2xhc3NfaWQsCiAJCSBuZXdfbmFtZSk7CiAKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCWlmIChjbGFzc19kZXYtPmRldikKIAkJb2xkX2NsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSwKIAkJCQkJCSAmY2xhc3NfZGV2LT5rb2JqKTsKKyNlbmRpZgogCiAJc3RybGNweShjbGFzc19kZXYtPmNsYXNzX2lkLCBuZXdfbmFtZSwgS09CSl9OQU1FX0xFTik7CiAKIAllcnJvciA9IGtvYmplY3RfcmVuYW1lKCZjbGFzc19kZXYtPmtvYmosIG5ld19uYW1lKTsKIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJaWYgKGNsYXNzX2Rldi0+ZGV2KSB7CiAJCW5ld19jbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsCiAJCQkJCQkgJmNsYXNzX2Rldi0+a29iaik7CkBAIC04MTksNiArODY1LDcgQEAKIAkJCQkgIG5ld19jbGFzc19uYW1lKTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCBvbGRfY2xhc3NfbmFtZSk7CiAJfQorI2VuZGlmCiAJY2xhc3NfZGV2aWNlX3B1dChjbGFzc19kZXYpOwogCiAJa2ZyZWUob2xkX2NsYXNzX25hbWUpOwpAQCAtODkzLDIzICs5NDAsNiBAQAogCWNsYXNzX3B1dChwYXJlbnQpOwogfQogCi1pbnQgdmlydHVhbF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpZiAoIWRldi0+Y2xhc3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCFkZXYtPmNsYXNzLT52aXJ0dWFsX2RpcikgewotCQlzdGF0aWMgc3RydWN0IGtvYmplY3QgKnZpcnR1YWxfZGlyID0gTlVMTDsKLQotCQlpZiAoIXZpcnR1YWxfZGlyKQotCQkJdmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIoJmRldmljZXNfc3Vic3lzLmtzZXQua29iaiwgInZpcnR1YWwiKTsKLQkJZGV2LT5jbGFzcy0+dmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIodmlydHVhbF9kaXIsIGRldi0+Y2xhc3MtPm5hbWUpOwotCX0KLQotCWRldi0+a29iai5wYXJlbnQgPSBkZXYtPmNsYXNzLT52aXJ0dWFsX2RpcjsKLQlyZXR1cm4gMDsKLX0KLQogaW50IF9faW5pdCBjbGFzc2VzX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggNjhhZDExYS4uZTRiNTMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKQEAgLTE1MywyMCArMTU0LDI0IEBACiAJCQkgICAgICAgIk1JTk9SPSV1IiwgTUlOT1IoZGV2LT5kZXZ0KSk7CiAJfQogCisjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKIAkvKiBhZGQgYnVzIG5hbWUgKHNhbWUgYXMgU1VCU1lTVEVNLCBkZXByZWNhdGVkKSAqLwogCWlmIChkZXYtPmJ1cykKIAkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCiAJCQkgICAgICAgIlBIWVNERVZCVVM9JXMiLCBkZXYtPmJ1cy0+bmFtZSk7CisjZW5kaWYKIAogCS8qIGFkZCBkcml2ZXIgbmFtZSAoUEhZU0RFViogdmFsdWVzIGFyZSBkZXByZWNhdGVkKSovCiAJaWYgKGRldi0+ZHJpdmVyKSB7CiAJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKIAkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAogCQkJICAgICAgICJEUklWRVI9JXMiLCBkZXYtPmRyaXZlci0+bmFtZSk7CisjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKIAkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCiAJCQkgICAgICAgIlBIWVNERVZEUklWRVI9JXMiLCBkZXYtPmRyaXZlci0+bmFtZSk7CisjZW5kaWYKIAl9CiAKIAkvKiB0ZXJtaW5hdGUsIHNldCB0byBuZXh0IGZyZWUgc2xvdCwgc2hyaW5rIGF2YWlsYWJsZSBzcGFjZSAqLwpAQCAtMzgzLDYgKzM4OCw1MiBAQAogCWRldmljZV9pbml0X3dha2V1cChkZXYsIDApOwogfQogCisjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKK3N0YXRpYyBpbnQgc2V0dXBfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCS8qIFNldCB0aGUgcGFyZW50IHRvIHRoZSBjbGFzcywgbm90IHRoZSBwYXJlbnQgZGV2aWNlICovCisJLyogdGhpcyBrZWVwcyBzeXNmcyBmcm9tIGhhdmluZyBhIHN5bWxpbmsgdG8gbWFrZSBvbGQgdWRldnMgaGFwcHkgKi8KKwlpZiAoZGV2LT5jbGFzcykKKwkJZGV2LT5rb2JqLnBhcmVudCA9ICZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqOworCWVsc2UgaWYgKHBhcmVudCkKKwkJZGV2LT5rb2JqLnBhcmVudCA9ICZwYXJlbnQtPmtvYmo7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHZpcnR1YWxfZGV2aWNlX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKCFkZXYtPmNsYXNzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZGV2LT5jbGFzcy0+dmlydHVhbF9kaXIpIHsKKwkJc3RhdGljIHN0cnVjdCBrb2JqZWN0ICp2aXJ0dWFsX2RpciA9IE5VTEw7CisKKwkJaWYgKCF2aXJ0dWFsX2RpcikKKwkJCXZpcnR1YWxfZGlyID0ga29iamVjdF9hZGRfZGlyKCZkZXZpY2VzX3N1YnN5cy5rc2V0LmtvYmosICJ2aXJ0dWFsIik7CisJCWRldi0+Y2xhc3MtPnZpcnR1YWxfZGlyID0ga29iamVjdF9hZGRfZGlyKHZpcnR1YWxfZGlyLCBkZXYtPmNsYXNzLT5uYW1lKTsKKwl9CisKKwlkZXYtPmtvYmoucGFyZW50ID0gZGV2LT5jbGFzcy0+dmlydHVhbF9kaXI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCWludCBlcnJvcjsKKworCS8qIGlmIHRoaXMgaXMgYSBjbGFzcyBkZXZpY2UsIGFuZCBoYXMgbm8gcGFyZW50LCBjcmVhdGUgb25lICovCisJaWYgKChkZXYtPmNsYXNzKSAmJiAocGFyZW50ID09IE5VTEwpKSB7CisJCWVycm9yID0gdmlydHVhbF9kZXZpY2VfcGFyZW50KGRldik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9IGVsc2UgaWYgKHBhcmVudCkKKwkJZGV2LT5rb2JqLnBhcmVudCA9ICZwYXJlbnQtPmtvYmo7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAvKioKICAqCWRldmljZV9hZGQgLSBhZGQgZGV2aWNlIHRvIGRldmljZSBoaWVyYXJjaHkuCiAgKglAZGV2OglkZXZpY2UuCkBAIC00MDUsMjkgKzQ1NiwyOSBAQAogCWlmICghZGV2IHx8ICFzdHJsZW4oZGV2LT5idXNfaWQpKQogCQlnb3RvIEVycm9yOwogCi0JLyogaWYgdGhpcyBpcyBhIGNsYXNzIGRldmljZSwgYW5kIGhhcyBubyBwYXJlbnQsIGNyZWF0ZSBvbmUgKi8KLQlpZiAoKGRldi0+Y2xhc3MpICYmIChkZXYtPnBhcmVudCA9PSBOVUxMKSkgewotCQllcnJvciA9IHZpcnR1YWxfZGV2aWNlX3BhcmVudChkZXYpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIEVycm9yOwotCX0KKwlwcl9kZWJ1ZygiREVWOiByZWdpc3RlcmluZyBkZXZpY2U6IElEID0gJyVzJ1xuIiwgZGV2LT5idXNfaWQpOwogCiAJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBhcmVudCk7CiAKLQlwcl9kZWJ1ZygiREVWOiByZWdpc3RlcmluZyBkZXZpY2U6IElEID0gJyVzJ1xuIiwgZGV2LT5idXNfaWQpOworCWVycm9yID0gc2V0dXBfcGFyZW50KGRldiwgcGFyZW50KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gRXJyb3I7CiAKIAkvKiBmaXJzdCwgcmVnaXN0ZXIgd2l0aCBnZW5lcmljIGxheWVyLiAqLwogCWtvYmplY3Rfc2V0X25hbWUoJmRldi0+a29iaiwgIiVzIiwgZGV2LT5idXNfaWQpOwotCWlmIChwYXJlbnQpCi0JCWRldi0+a29iai5wYXJlbnQgPSAmcGFyZW50LT5rb2JqOwotCi0JaWYgKChlcnJvciA9IGtvYmplY3RfYWRkKCZkZXYtPmtvYmopKSkKKwllcnJvciA9IGtvYmplY3RfYWRkKCZkZXYtPmtvYmopOworCWlmIChlcnJvcikKIAkJZ290byBFcnJvcjsKIAogCS8qIG5vdGlmeSBwbGF0Zm9ybSBvZiBkZXZpY2UgZW50cnkgKi8KIAlpZiAocGxhdGZvcm1fbm90aWZ5KQogCQlwbGF0Zm9ybV9ub3RpZnkoZGV2KTsKIAorCS8qIG5vdGlmeSBjbGllbnRzIG9mIGRldmljZSBlbnRyeSAobmV3IHdheSkgKi8KKwlpZiAoZGV2LT5idXMpCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5idXNfbm90aWZpZXIsCisJCQkJCSAgICAgQlVTX05PVElGWV9BRERfREVWSUNFLCBkZXYpOworCiAJZGV2LT51ZXZlbnRfYXR0ci5hdHRyLm5hbWUgPSAidWV2ZW50IjsKIAlkZXYtPnVldmVudF9hdHRyLmF0dHIubW9kZSA9IFNfSVdVU1I7CiAJaWYgKGRldi0+ZHJpdmVyKQpAQCAtNDYxLDEzICs1MTIsMTggQEAKIAlpZiAoZGV2LT5jbGFzcykgewogCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwKIAkJCQkgICJzdWJzeXN0ZW0iKTsKLQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+Y2xhc3MtPnN1YnN5cy5rc2V0LmtvYmosICZkZXYtPmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCS8qIElmIHRoaXMgaXMgbm90IGEgImZha2UiIGNvbXBhdGlibGUgZGV2aWNlLCB0aGVuIGNyZWF0ZSB0aGUKKwkJICogc3ltbGluayBmcm9tIHRoZSBjbGFzcyB0byB0aGUgZGV2aWNlLiAqLworCQlpZiAoZGV2LT5rb2JqLnBhcmVudCAhPSAmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaikKKwkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqLAorCQkJCQkgICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCQlpZiAocGFyZW50KSB7CiAJCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmZGV2LT5wYXJlbnQtPmtvYmosICJkZXZpY2UiKTsKIAkJCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwgJmRldi0+a29iaik7CiAJCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5wYXJlbnQtPmtvYmosICZkZXYtPmtvYmosIGNsYXNzX25hbWUpOwogCQl9CisjZW5kaWYKIAl9CiAKIAlpZiAoKGVycm9yID0gZGV2aWNlX2FkZF9hdHRycyhkZXYpKSkKQEAgLTUwNCw2ICs1NjAsOSBAQAogIEJ1c0Vycm9yOgogCWRldmljZV9wbV9yZW1vdmUoZGV2KTsKICBQTUVycm9yOgorCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0RFTF9ERVZJQ0UsIGRldik7CiAJZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2KTsKICBHcm91cEVycm9yOgogIAlkZXZpY2VfcmVtb3ZlX2F0dHJzKGRldik7CkBAIC01ODYsMjIgKzY0NSwzMSBAQAogdm9pZCBkZXZpY2VfZGVsKHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqIHBhcmVudCA9IGRldi0+cGFyZW50OwotCWNoYXIgKmNsYXNzX25hbWUgPSBOVUxMOwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGY7CiAKIAlpZiAocGFyZW50KQogCQlrbGlzdF9kZWwoJmRldi0+a25vZGVfcGFyZW50KTsKLQlpZiAoZGV2LT5kZXZ0X2F0dHIpCisJaWYgKGRldi0+ZGV2dF9hdHRyKSB7CiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsIGRldi0+ZGV2dF9hdHRyKTsKKwkJa2ZyZWUoZGV2LT5kZXZ0X2F0dHIpOworCX0KIAlpZiAoZGV2LT5jbGFzcykgewogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqLCBkZXYtPmJ1c19pZCk7Ci0JCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwgJmRldi0+a29iaik7CisJCS8qIElmIHRoaXMgaXMgbm90IGEgImZha2UiIGNvbXBhdGlibGUgZGV2aWNlLCByZW1vdmUgdGhlCisJCSAqIHN5bWxpbmsgZnJvbSB0aGUgY2xhc3MgdG8gdGhlIGRldmljZS4gKi8KKwkJaWYgKGRldi0+a29iai5wYXJlbnQgIT0gJmRldi0+Y2xhc3MtPnN1YnN5cy5rc2V0LmtvYmopCisJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwKKwkJCQkJICBkZXYtPmJ1c19pZCk7CisjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKIAkJaWYgKHBhcmVudCkgewotCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOworCQkJY2hhciAqY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLAorCQkJCQkJCSAgICZkZXYtPmtvYmopOwogCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+cGFyZW50LT5rb2JqLCBjbGFzc19uYW1lKTsKKwkJCWtmcmVlKGNsYXNzX25hbWUpOworCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOwogCQl9Ci0JCWtmcmVlKGNsYXNzX25hbWUpOworI2VuZGlmCisKIAkJZG93bigmZGV2LT5jbGFzcy0+c2VtKTsKIAkJLyogbm90aWZ5IGFueSBpbnRlcmZhY2VzIHRoYXQgdGhlIGRldmljZSBpcyBub3cgZ29uZSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsYXNzX2ludGYsICZkZXYtPmNsYXNzLT5pbnRlcmZhY2VzLCBub2RlKQpAQCAtNjE0LDEzICs2ODIsMTYgQEAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2LT51ZXZlbnRfYXR0cik7CiAJZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2F0dHJzKGRldik7CisJYnVzX3JlbW92ZV9kZXZpY2UoZGV2KTsKIAogCS8qIE5vdGlmeSB0aGUgcGxhdGZvcm0gb2YgdGhlIHJlbW92YWwsIGluIGNhc2UgdGhleQogCSAqIG5lZWQgdG8gZG8gYW55dGhpbmcuLi4KIAkgKi8KIAlpZiAocGxhdGZvcm1fbm90aWZ5X3JlbW92ZSkKIAkJcGxhdGZvcm1fbm90aWZ5X3JlbW92ZShkZXYpOwotCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9SRU1PVkUpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOwpAQCAtNjc5LDEyICs3NTAsNDUgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qKgorICogZGV2aWNlX2ZpbmRfY2hpbGQgLSBkZXZpY2UgaXRlcmF0b3IgZm9yIGxvY2F0aW5nIGEgcGFydGljdWxhciBkZXZpY2UuCisgKiBAcGFyZW50OiBwYXJlbnQgc3RydWN0IGRldmljZQorICogQGRhdGE6IERhdGEgdG8gcGFzcyB0byBtYXRjaCBmdW5jdGlvbgorICogQG1hdGNoOiBDYWxsYmFjayBmdW5jdGlvbiB0byBjaGVjayBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGRldmljZV9mb3JfZWFjaF9jaGlsZCgpIGZ1bmN0aW9uIGFib3ZlLCBidXQgaXQKKyAqIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBkZXZpY2UgdGhhdCBpcyAnZm91bmQnIGZvciBsYXRlciB1c2UsIGFzCisgKiBkZXRlcm1pbmVkIGJ5IHRoZSBAbWF0Y2ggY2FsbGJhY2suCisgKgorICogVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gMCBpZiB0aGUgZGV2aWNlIGRvZXNuJ3QgbWF0Y2ggYW5kIG5vbi16ZXJvCisgKiBpZiBpdCBkb2VzLiAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgbm9uLXplcm8gYW5kIGEgcmVmZXJlbmNlIHRvIHRoZQorICogY3VycmVudCBkZXZpY2UgY2FuIGJlIG9idGFpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRvIHRoZSBjYWxsZXIKKyAqIGFuZCBub3QgaXRlcmF0ZSBvdmVyIGFueSBtb3JlIGRldmljZXMuCisgKi8KK3N0cnVjdCBkZXZpY2UgKiBkZXZpY2VfZmluZF9jaGlsZChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHZvaWQgKmRhdGEsCisJCQkJICBpbnQgKCptYXRjaCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopKQoreworCXN0cnVjdCBrbGlzdF9pdGVyIGk7CisJc3RydWN0IGRldmljZSAqY2hpbGQ7CisKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKKwl3aGlsZSAoKGNoaWxkID0gbmV4dF9kZXZpY2UoJmkpKSkKKwkJaWYgKG1hdGNoKGNoaWxkLCBkYXRhKSAmJiBnZXRfZGV2aWNlKGNoaWxkKSkKKwkJCWJyZWFrOworCWtsaXN0X2l0ZXJfZXhpdCgmaSk7CisJcmV0dXJuIGNoaWxkOworfQorCiBpbnQgX19pbml0IGRldmljZXNfaW5pdCh2b2lkKQogewogCXJldHVybiBzdWJzeXN0ZW1fcmVnaXN0ZXIoJmRldmljZXNfc3Vic3lzKTsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9maW5kX2NoaWxkKTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2luaXRpYWxpemUpOwogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2FkZCk7CkBAIC04MDcsOCArOTExLDEwIEBACiAKIAlwcl9kZWJ1ZygiREVWSUNFOiByZW5hbWluZyAnJXMnIHRvICclcydcbiIsIGRldi0+YnVzX2lkLCBuZXdfbmFtZSk7CiAKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCWlmICgoZGV2LT5jbGFzcykgJiYgKGRldi0+cGFyZW50KSkKIAkJb2xkX2NsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwgJmRldi0+a29iaik7CisjZW5kaWYKIAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCW9sZF9zeW1saW5rX25hbWUgPSBrbWFsbG9jKEJVU19JRF9TSVpFLCBHRlBfS0VSTkVMKTsKQEAgLTgyMyw2ICs5MjksNyBAQAogCiAJZXJyb3IgPSBrb2JqZWN0X3JlbmFtZSgmZGV2LT5rb2JqLCBuZXdfbmFtZSk7CiAKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCWlmIChvbGRfY2xhc3NfbmFtZSkgewogCQluZXdfY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKIAkJaWYgKG5ld19jbGFzc19uYW1lKSB7CkBAIC04MzEsNiArOTM4LDggQEAKIAkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgb2xkX2NsYXNzX25hbWUpOwogCQl9CiAJfQorI2VuZGlmCisKIAlpZiAoZGV2LT5jbGFzcykgewogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwKIAkJCQkgIG9sZF9zeW1saW5rX25hbWUpOwpAQCAtODQ2LDMgKzk1NSw5NSBAQAogCiAJcmV0dXJuIGVycm9yOwogfQorCisKK3N0YXRpYyBpbnQgZGV2aWNlX21vdmVfY2xhc3NfbGlua3Moc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKm9sZF9wYXJlbnQsCisJCQkJICAgc3RydWN0IGRldmljZSAqbmV3X3BhcmVudCkKK3sKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAorCWludCBlcnJvcjsKKwljaGFyICpjbGFzc19uYW1lOworCisJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKKwlpZiAoIWNsYXNzX25hbWUpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKGNsYXNzX25hbWUpOworCQljbGFzc19uYW1lID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChvbGRfcGFyZW50KSB7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJm9sZF9wYXJlbnQtPmtvYmosIGNsYXNzX25hbWUpOworCX0KKwllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZuZXdfcGFyZW50LT5rb2JqLCAiZGV2aWNlIik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZuZXdfcGFyZW50LT5rb2JqLCAmZGV2LT5rb2JqLCBjbGFzc19uYW1lKTsKKwlpZiAoZXJyb3IpCisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKK291dDoKKwlrZnJlZShjbGFzc19uYW1lKTsKKwlyZXR1cm4gZXJyb3I7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKy8qKgorICogZGV2aWNlX21vdmUgLSBtb3ZlcyBhIGRldmljZSB0byBhIG5ldyBwYXJlbnQKKyAqIEBkZXY6IHRoZSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZGV2aWNlIHRvIGJlIG1vdmVkCisgKiBAbmV3X3BhcmVudDogdGhlIG5ldyBwYXJlbnQgb2YgdGhlIGRldmljZQorICovCitpbnQgZGV2aWNlX21vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpuZXdfcGFyZW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZGV2aWNlICpvbGRfcGFyZW50OworCisJZGV2ID0gZ2V0X2RldmljZShkZXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGV2aWNlX2lzX3JlZ2lzdGVyZWQoZGV2KSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwluZXdfcGFyZW50ID0gZ2V0X2RldmljZShuZXdfcGFyZW50KTsKKwlpZiAoIW5ld19wYXJlbnQpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcHJfZGVidWcoIkRFVklDRTogbW92aW5nICclcycgdG8gJyVzJ1xuIiwgZGV2LT5idXNfaWQsCisJCW5ld19wYXJlbnQtPmJ1c19pZCk7CisJZXJyb3IgPSBrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgJm5ld19wYXJlbnQtPmtvYmopOworCWlmIChlcnJvcikgeworCQlwdXRfZGV2aWNlKG5ld19wYXJlbnQpOworCQlnb3RvIG91dDsKKwl9CisJb2xkX3BhcmVudCA9IGRldi0+cGFyZW50OworCWRldi0+cGFyZW50ID0gbmV3X3BhcmVudDsKKwlpZiAob2xkX3BhcmVudCkKKwkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX3BhcmVudCk7CisJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmbmV3X3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCWlmICghZGV2LT5jbGFzcykKKwkJZ290byBvdXRfcHV0OworCWVycm9yID0gZGV2aWNlX21vdmVfY2xhc3NfbGlua3MoZGV2LCBvbGRfcGFyZW50LCBuZXdfcGFyZW50KTsKKwlpZiAoZXJyb3IpIHsKKwkJLyogV2UgaWdub3JlIGVycm9ycyBvbiBjbGVhbnVwIHNpbmNlIHdlJ3JlIGhvc2VkIGFueXdheS4uLiAqLworCQlkZXZpY2VfbW92ZV9jbGFzc19saW5rcyhkZXYsIG5ld19wYXJlbnQsIG9sZF9wYXJlbnQpOworCQlpZiAoIWtvYmplY3RfbW92ZSgmZGV2LT5rb2JqLCAmb2xkX3BhcmVudC0+a29iaikpIHsKKwkJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQkJaWYgKG9sZF9wYXJlbnQpCisJCQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LAorCQkJCQkgICAgICAgJm9sZF9wYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwkJfQorCQlwdXRfZGV2aWNlKG5ld19wYXJlbnQpOworCQlnb3RvIG91dDsKKwl9CitvdXRfcHV0OgorCXB1dF9kZXZpY2Uob2xkX3BhcmVudCk7CitvdXQ6CisJcHV0X2RldmljZShkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX21vdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NwdS5jIGIvZHJpdmVycy9iYXNlL2NwdS5jCmluZGV4IDRiZWY3NmEuLjFmNzQ1ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jcHUuYworKysgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggYzVkNmJiNC4uNTEwZTc4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKKysrIGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTI2LDYgKzI2LDUwIEBACiAjZGVmaW5lIHRvX2Rydihub2RlKSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGRldmljZV9kcml2ZXIsIGtvYmouZW50cnkpCiAKIAorc3RhdGljIHZvaWQgZHJpdmVyX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5rbm9kZV9kcml2ZXIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkZXZpY2UgJXMgYWxyZWFkeSBib3VuZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJcmV0dXJuOworCX0KKworCXByX2RlYnVnKCJib3VuZCBkZXZpY2UgJyVzJyB0byBkcml2ZXIgJyVzJ1xuIiwKKwkJIGRldi0+YnVzX2lkLCBkZXYtPmRyaXZlci0+bmFtZSk7CisKKwlpZiAoZGV2LT5idXMpCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5idXNfbm90aWZpZXIsCisJCQkJCSAgICAgQlVTX05PVElGWV9CT1VORF9EUklWRVIsIGRldik7CisKKwlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9kcml2ZXIsICZkZXYtPmRyaXZlci0+a2xpc3RfZGV2aWNlcyk7Cit9CisKK3N0YXRpYyBpbnQgZHJpdmVyX3N5c2ZzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmRyaXZlci0+a29iaiwgJmRldi0+a29iaiwKKwkJCSAga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJmRldi0+ZHJpdmVyLT5rb2JqLAorCQkJCQkiZHJpdmVyIik7CisJCWlmIChyZXQpCisJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5kcml2ZXItPmtvYmosCisJCQkJCWtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRyaXZlcl9zeXNmc19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKworCWlmIChkcnYpIHsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRydi0+a29iaiwga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRyaXZlciIpOworCX0KK30KKwogLyoqCiAgKglkZXZpY2VfYmluZF9kcml2ZXIgLSBiaW5kIGEgZHJpdmVyIHRvIG9uZSBkZXZpY2UuCiAgKglAZGV2OglkZXZpY2UuCkBAIC00MiwyNyArODYsOCBAQAogICovCiBpbnQgZGV2aWNlX2JpbmRfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpbnQgcmV0OwotCi0JaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfZHJpdmVyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2aWNlICVzIGFscmVhZHkgYm91bmRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByX2RlYnVnKCJib3VuZCBkZXZpY2UgJyVzJyB0byBkcml2ZXIgJyVzJ1xuIiwKLQkJIGRldi0+YnVzX2lkLCBkZXYtPmRyaXZlci0+bmFtZSk7Ci0Ja2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfZHJpdmVyLCAmZGV2LT5kcml2ZXItPmtsaXN0X2RldmljZXMpOwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmRyaXZlci0+a29iaiwgJmRldi0+a29iaiwKLQkJCSAga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJmRldi0+ZHJpdmVyLT5rb2JqLAotCQkJCQkiZHJpdmVyIik7Ci0JCWlmIChyZXQpCi0JCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5kcml2ZXItPmtvYmosCi0JCQkJCWtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7Ci0JfQotCXJldHVybiByZXQ7CisJZHJpdmVyX2JvdW5kKGRldik7CisJcmV0dXJuIGRyaXZlcl9zeXNmc19hZGQoZGV2KTsKIH0KIAogc3RydWN0IHN0dXBpZF90aHJlYWRfc3RydWN0dXJlIHsKQEAgLTg1LDMwICsxMTAsMzIgQEAKIAkJIGRydi0+YnVzLT5uYW1lLCBkcnYtPm5hbWUsIGRldi0+YnVzX2lkKTsKIAogCWRldi0+ZHJpdmVyID0gZHJ2OworCWlmIChkcml2ZXJfc3lzZnNfYWRkKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJpdmVyX3N5c2ZzX2FkZCglcykgZmFpbGVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBkZXYtPmJ1c19pZCk7CisJCWdvdG8gcHJvYmVfZmFpbGVkOworCX0KKwogCWlmIChkZXYtPmJ1cy0+cHJvYmUpIHsKIAkJcmV0ID0gZGV2LT5idXMtPnByb2JlKGRldik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldi0+ZHJpdmVyID0gTlVMTDsKKwkJaWYgKHJldCkKIAkJCWdvdG8gcHJvYmVfZmFpbGVkOwotCQl9CiAJfSBlbHNlIGlmIChkcnYtPnByb2JlKSB7CiAJCXJldCA9IGRydi0+cHJvYmUoZGV2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2LT5kcml2ZXIgPSBOVUxMOworCQlpZiAocmV0KQogCQkJZ290byBwcm9iZV9mYWlsZWQ7Ci0JCX0KIAl9Ci0JaWYgKGRldmljZV9iaW5kX2RyaXZlcihkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGRldmljZV9iaW5kX2RyaXZlciglcykgZmFpbGVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBkZXYtPmJ1c19pZCk7Ci0JCS8qIEhvdyBkb2VzIHVuZG8gYSAtPnByb2JlPyAgV2UncmUgc2NyZXdlZC4gKi8KLQl9CisKKwlkcml2ZXJfYm91bmQoZGV2KTsKIAlyZXQgPSAxOwogCXByX2RlYnVnKCIlczogQm91bmQgRGV2aWNlICVzIHRvIERyaXZlciAlc1xuIiwKIAkJIGRydi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKIAlnb3RvIGRvbmU7CiAKIHByb2JlX2ZhaWxlZDoKKwlkcml2ZXJfc3lzZnNfcmVtb3ZlKGRldik7CisJZGV2LT5kcml2ZXIgPSBOVUxMOworCiAJaWYgKHJldCA9PSAtRU5PREVWIHx8IHJldCA9PSAtRU5YSU8pIHsKIAkJLyogRHJpdmVyIG1hdGNoZWQsIGJ1dCBkaWRuJ3Qgc3VwcG9ydCBkZXZpY2UKIAkJICogb3IgZGV2aWNlIG5vdCBmb3VuZC4KQEAgLTI4NCwxMCArMzExLDE1IEBACiAJZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaWYgKGRydikgewogCQlnZXRfZHJpdmVyKGRydik7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZkcnYtPmtvYmosIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRyaXZlciIpOwogCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfZHJpdmVyKTsKIAorCQlpZiAoZGV2LT5idXMpCisJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+YnVzX25vdGlmaWVyLAorCQkJCQkJICAgICBCVVNfTk9USUZZX1VOQklORF9EUklWRVIsCisJCQkJCQkgICAgIGRldik7CisKIAkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5yZW1vdmUpCiAJCQlkZXYtPmJ1cy0+cmVtb3ZlKGRldik7CiAJCWVsc2UgaWYgKGRydi0+cmVtb3ZlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCAxNDYxNTY5Li40YmFkMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCisjZGVmaW5lIHRvX2RldihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCisKIE1PRFVMRV9BVVRIT1IoIk1hbnVlbCBFc3RyYWRhIFNhaW56IDxyYW50eUBkZWJpYW4ub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNdWx0aSBwdXJwb3NlIGZpcm13YXJlIGxvYWRpbmcgc3VwcG9ydCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtODYsMTIgKzg4LDEyIEBACiAKIHN0YXRpYyBDTEFTU19BVFRSKHRpbWVvdXQsIDA2NDQsIGZpcm13YXJlX3RpbWVvdXRfc2hvdywgZmlybXdhcmVfdGltZW91dF9zdG9yZSk7CiAKLXN0YXRpYyB2b2lkICBmd19jbGFzc19kZXZfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpOworc3RhdGljIHZvaWQgZndfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKIAotc3RhdGljIGludCBmaXJtd2FyZV9jbGFzc191ZXZlbnQoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICoqZW52cCwKLQkJCQkgaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3N0YXRpYyBpbnQgZmlybXdhcmVfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCSAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpID0gMCwgbGVuID0gMDsKIAogCWlmICghdGVzdF9iaXQoRldfU1RBVFVTX1JFQURZLCAmZndfcHJpdi0+c3RhdHVzKSkKQEAgLTExMCwyMSArMTEyLDIxIEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgZmlybXdhcmVfY2xhc3MgPSB7CiAJLm5hbWUJCT0gImZpcm13YXJlIiwKLQkudWV2ZW50CQk9IGZpcm13YXJlX2NsYXNzX3VldmVudCwKLQkucmVsZWFzZQk9IGZ3X2NsYXNzX2Rldl9yZWxlYXNlLAorCS5kZXZfdWV2ZW50CT0gZmlybXdhcmVfdWV2ZW50LAorCS5kZXZfcmVsZWFzZQk9IGZ3X2Rldl9yZWxlYXNlLAogfTsKIAotc3RhdGljIHNzaXplX3QKLWZpcm13YXJlX2xvYWRpbmdfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGZpcm13YXJlX2xvYWRpbmdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBsb2FkaW5nID0gdGVzdF9iaXQoRldfU1RBVFVTX0xPQURJTkcsICZmd19wcml2LT5zdGF0dXMpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsb2FkaW5nKTsKIH0KIAogLyoqCiAgKiBmaXJtd2FyZV9sb2FkaW5nX3N0b3JlIC0gc2V0IHZhbHVlIGluIHRoZSAnbG9hZGluZycgY29udHJvbCBmaWxlCi0gKiBAY2xhc3NfZGV2OiBjbGFzc19kZXZpY2UgcG9pbnRlcgorICogQGRldjogZGV2aWNlIHBvaW50ZXIKICAqIEBidWY6IGJ1ZmZlciB0byBzY2FuIGZvciBsb2FkaW5nIGNvbnRyb2wgdmFsdWUKICAqIEBjb3VudDogbnVtYmVyIG9mIGJ5dGVzIGluIEBidWYKICAqCkBAIC0xMzQsMTEgKzEzNiwxMSBAQAogICoJIDA6IENvbmNsdWRlIHRoZSBsb2FkIGFuZCBoYW5kIHRoZSBkYXRhIHRvIHRoZSBkcml2ZXIgY29kZS4KICAqCS0xOiBDb25jbHVkZSB0aGUgbG9hZCB3aXRoIGFuIGVycm9yIGFuZCBkaXNjYXJkIGFueSB3cml0dGVuIGRhdGEuCiAgKiovCi1zdGF0aWMgc3NpemVfdAotZmlybXdhcmVfbG9hZGluZ19zdG9yZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCi0JCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGZpcm13YXJlX2xvYWRpbmdfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBsb2FkaW5nID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAogCXN3aXRjaCAobG9hZGluZykgewpAQCAtMTc0LDE1ICsxNzYsMTQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihsb2FkaW5nLCAwNjQ0LAotCQkJZmlybXdhcmVfbG9hZGluZ19zaG93LCBmaXJtd2FyZV9sb2FkaW5nX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsb2FkaW5nLCAwNjQ0LCBmaXJtd2FyZV9sb2FkaW5nX3Nob3csIGZpcm13YXJlX2xvYWRpbmdfc3RvcmUpOwogCiBzdGF0aWMgc3NpemVfdAogZmlybXdhcmVfZGF0YV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkgICBjaGFyICpidWZmZXIsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSB0b19jbGFzc19kZXYoa29iaik7Ci0Jc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJc3NpemVfdCByZXRfY291bnQgPSBjb3VudDsKIApAQCAtMjM0LDcgKzIzNSw3IEBACiAKIC8qKgogICogZmlybXdhcmVfZGF0YV93cml0ZSAtIHdyaXRlIG1ldGhvZCBmb3IgZmlybXdhcmUKLSAqIEBrb2JqOiBrb2JqZWN0IGZvciB0aGUgY2xhc3NfZGV2aWNlCisgKiBAa29iajoga29iamVjdCBmb3IgdGhlIGRldmljZQogICogQGJ1ZmZlcjogYnVmZmVyIGJlaW5nIHdyaXR0ZW4KICAqIEBvZmZzZXQ6IGJ1ZmZlciBvZmZzZXQgZm9yIHdyaXRlIGluIHRvdGFsIGRhdGEgc3RvcmUgYXJlYQogICogQGNvdW50OiBidWZmZXIgc2l6ZQpAQCAtMjQ2LDggKzI0Nyw4IEBACiBmaXJtd2FyZV9kYXRhX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkgICAgY2hhciAqYnVmZmVyLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0gdG9fY2xhc3NfZGV2KGtvYmopOwotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iaik7CisJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCXNzaXplX3QgcmV0dmFsOwogCkBAIC0yODAsMTMgKzI4MSwxMiBAQAogCS53cml0ZSA9IGZpcm13YXJlX2RhdGFfd3JpdGUsCiB9OwogCi1zdGF0aWMgdm9pZAotZndfY2xhc3NfZGV2X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQorc3RhdGljIHZvaWQgZndfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJa2ZyZWUoZndfcHJpdik7Ci0Ja2ZyZWUoY2xhc3NfZGV2KTsKKwlrZnJlZShkZXYpOwogCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CkBAIC0yOTgsMjYgKzI5OCwyMyBAQAogCWZ3X2xvYWRfYWJvcnQoZndfcHJpdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotZndfc2V0dXBfY2xhc3NfZGV2aWNlX2lkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGZ3X3NldHVwX2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpmX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQogewogCS8qIFhYWCB3YXJuaW5nIHdlIHNob3VsZCB3YXRjaCBvdXQgZm9yIG5hbWUgY29sbGlzaW9ucyAqLwotCXN0cmxjcHkoY2xhc3NfZGV2LT5jbGFzc19pZCwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKTsKKwlzdHJsY3B5KGZfZGV2LT5idXNfaWQsIGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQKLWZ3X3JlZ2lzdGVyX2NsYXNzX2RldmljZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICoqY2xhc3NfZGV2X3AsCi0JCQkgY29uc3QgY2hhciAqZndfbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBmd19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqKmRldl9wLCBjb25zdCBjaGFyICpmd19uYW1lLAorCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSBremFsbG9jKHNpemVvZigqZndfcHJpdiksCiAJCQkJCQlHRlBfS0VSTkVMKTsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSBremFsbG9jKHNpemVvZigqY2xhc3NfZGV2KSwKLQkJCQkJCSBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgZGV2aWNlICpmX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpmX2RldiksIEdGUF9LRVJORUwpOwogCi0JKmNsYXNzX2Rldl9wID0gTlVMTDsKKwkqZGV2X3AgPSBOVUxMOwogCi0JaWYgKCFmd19wcml2IHx8ICFjbGFzc19kZXYpIHsKKwlpZiAoIWZ3X3ByaXYgfHwgIWZfZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGttYWxsb2MgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX2tmcmVlOwpAQCAtMzMxLDU1ICszMjgsNTQgQEAKIAlmd19wcml2LT50aW1lb3V0LmRhdGEgPSAodV9sb25nKSBmd19wcml2OwogCWluaXRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOwogCi0JZndfc2V0dXBfY2xhc3NfZGV2aWNlX2lkKGNsYXNzX2RldiwgZGV2aWNlKTsKLQljbGFzc19kZXYtPmRldiA9IGRldmljZTsKLQljbGFzc19kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOwotCWNsYXNzX3NldF9kZXZkYXRhKGNsYXNzX2RldiwgZndfcHJpdik7Ci0JcmV0dmFsID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKGNsYXNzX2Rldik7CisJZndfc2V0dXBfZGV2aWNlX2lkKGZfZGV2LCBkZXZpY2UpOworCWZfZGV2LT5wYXJlbnQgPSBkZXZpY2U7CisJZl9kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOworCWRldl9zZXRfZHJ2ZGF0YShmX2RldiwgZndfcHJpdik7CisJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKGZfZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNsYXNzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycm9yX2tmcmVlOwogCX0KLQkqY2xhc3NfZGV2X3AgPSBjbGFzc19kZXY7CisJKmRldl9wID0gZl9kZXY7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2tmcmVlOgogCWtmcmVlKGZ3X3ByaXYpOwotCWtmcmVlKGNsYXNzX2Rldik7CisJa2ZyZWUoZl9kZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQKLWZ3X3NldHVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmlybXdhcmUgKmZ3LCBzdHJ1Y3QgY2xhc3NfZGV2aWNlICoqY2xhc3NfZGV2X3AsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgaW50IHVldmVudCkKK3N0YXRpYyBpbnQgZndfc2V0dXBfZGV2aWNlKHN0cnVjdCBmaXJtd2FyZSAqZncsIHN0cnVjdCBkZXZpY2UgKipkZXZfcCwKKwkJCSAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIGludCB1ZXZlbnQpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmZfZGV2OwogCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OwogCWludCByZXR2YWw7CiAKLQkqY2xhc3NfZGV2X3AgPSBOVUxMOwotCXJldHZhbCA9IGZ3X3JlZ2lzdGVyX2NsYXNzX2RldmljZSgmY2xhc3NfZGV2LCBmd19uYW1lLCBkZXZpY2UpOworCSpkZXZfcCA9IE5VTEw7CisJcmV0dmFsID0gZndfcmVnaXN0ZXJfZGV2aWNlKCZmX2RldiwgZndfbmFtZSwgZGV2aWNlKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIG91dDsKIAogCS8qIE5lZWQgdG8gcGluIHRoaXMgbW9kdWxlIHVudGlsIGNsYXNzIGRldmljZSBpcyBkZXN0cm95ZWQgKi8KIAlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwogCi0JZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShmX2Rldik7CiAKIAlmd19wcml2LT5mdyA9IGZ3OwotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmY2xhc3NfZGV2LT5rb2JqLCAmZndfcHJpdi0+YXR0cl9kYXRhKTsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmZfZGV2LT5rb2JqLCAmZndfcHJpdi0+YXR0cl9kYXRhKTsKIAlpZiAocmV0dmFsKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSBmYWlsZWRcbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycm9yX3VucmVnOwogCX0KIAotCXJldHZhbCA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc19kZXYsCi0JCQkJCSAgJmNsYXNzX2RldmljZV9hdHRyX2xvYWRpbmcpOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShmX2RldiwgJmRldl9hdHRyX2xvYWRpbmcpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gZXJyb3JfdW5yZWc7CiAJfQpAQCAtMzg4LDExICszODQsMTEgQEAKICAgICAgICAgICAgICAgICBzZXRfYml0KEZXX1NUQVRVU19SRUFEWSwgJmZ3X3ByaXYtPnN0YXR1cyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBzZXRfYml0KEZXX1NUQVRVU19SRUFEWV9OT0hPVFBMVUcsICZmd19wcml2LT5zdGF0dXMpOwotCSpjbGFzc19kZXZfcCA9IGNsYXNzX2RldjsKKwkqZGV2X3AgPSBmX2RldjsKIAlnb3RvIG91dDsKIAogZXJyb3JfdW5yZWc6Ci0JY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoY2xhc3NfZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3RlcihmX2Rldik7CiBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTQwMSw3ICszOTcsNyBAQAogX3JlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZmlybXdhcmVfcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgaW50IHVldmVudCkKIHsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJc3RydWN0IGRldmljZSAqZl9kZXY7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXY7CiAJc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKIAlpbnQgcmV0dmFsOwpAQCAtNDE3LDEyICs0MTMsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0dmFsID0gZndfc2V0dXBfY2xhc3NfZGV2aWNlKGZpcm13YXJlLCAmY2xhc3NfZGV2LCBuYW1lLCBkZXZpY2UsCi0JCQkJICAgICAgIHVldmVudCk7CisJcmV0dmFsID0gZndfc2V0dXBfZGV2aWNlKGZpcm13YXJlLCAmZl9kZXYsIG5hbWUsIGRldmljZSwgdWV2ZW50KTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2tmcmVlX2Z3OwogCi0JZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShmX2Rldik7CiAKIAlpZiAodWV2ZW50KSB7CiAJCWlmIChsb2FkaW5nX3RpbWVvdXQgPiAwKSB7CkBAIC00MzAsNyArNDI1LDcgQEAKIAkJCWFkZF90aW1lcigmZndfcHJpdi0+dGltZW91dCk7CiAJCX0KIAotCQlrb2JqZWN0X3VldmVudCgmY2xhc3NfZGV2LT5rb2JqLCBLT0JKX0FERCk7CisJCWtvYmplY3RfdWV2ZW50KCZmX2Rldi0+a29iaiwgS09CSl9BREQpOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmd19wcml2LT5jb21wbGV0aW9uKTsKIAkJc2V0X2JpdChGV19TVEFUVVNfRE9ORSwgJmZ3X3ByaXYtPnN0YXR1cyk7CiAJCWRlbF90aW1lcl9zeW5jKCZmd19wcml2LT50aW1lb3V0KTsKQEAgLTQ0NSw3ICs0NDAsNyBAQAogCX0KIAlmd19wcml2LT5mdyA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZmd19sb2NrKTsKLQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcihjbGFzc19kZXYpOworCWRldmljZV91bnJlZ2lzdGVyKGZfZGV2KTsKIAlnb3RvIG91dDsKIAogZXJyb3Jfa2ZyZWVfZnc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDk0MGNlNDEuLmQxZGY0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0zODgsNiArMzg4LDExIEBACiAJcmV0dXJuIGRydi0+cHJvYmUoZGV2KTsKIH0KIAorc3RhdGljIGludCBwbGF0Zm9ybV9kcnZfcHJvYmVfZmFpbChzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXJldHVybiAtRU5YSU87Cit9CisKIHN0YXRpYyBpbnQgcGxhdGZvcm1fZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihfZGV2LT5kcml2ZXIpOwpAQCAtNDUxLDYgKzQ1Niw0OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIpOwogCisvKioKKyAqIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSAtIHJlZ2lzdGVyIGRyaXZlciBmb3Igbm9uLWhvdHBsdWdnYWJsZSBkZXZpY2UKKyAqIEBkcnY6IHBsYXRmb3JtIGRyaXZlciBzdHJ1Y3R1cmUKKyAqIEBwcm9iZTogdGhlIGRyaXZlciBwcm9iZSByb3V0aW5lLCBwcm9iYWJseSBmcm9tIGFuIF9faW5pdCBzZWN0aW9uCisgKgorICogVXNlIHRoaXMgaW5zdGVhZCBvZiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoKSB3aGVuIHlvdSBrbm93IHRoZSBkZXZpY2UKKyAqIGlzIG5vdCBob3RwbHVnZ2FibGUgYW5kIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgYW5kIHlvdSB3YW50IHRvCisgKiByZW1vdmUgaXRzIHJ1bi1vbmNlIHByb2JlKCkgaW5mcmFzdHJ1Y3R1cmUgZnJvbSBtZW1vcnkgYWZ0ZXIgdGhlIGRyaXZlcgorICogaGFzIGJvdW5kIHRvIHRoZSBkZXZpY2UuCisgKgorICogT25lIHR5cGljYWwgdXNlIGZvciB0aGlzIHdvdWxkIGJlIHdpdGggZHJpdmVycyBmb3IgY29udHJvbGxlcnMgaW50ZWdyYXRlZAorICogaW50byBzeXN0ZW0tb24tY2hpcCBwcm9jZXNzb3JzLCB3aGVyZSB0aGUgY29udHJvbGxlciBkZXZpY2VzIGhhdmUgYmVlbgorICogY29uZmlndXJlZCBhcyBwYXJ0IG9mIGJvYXJkIHNldHVwLgorICoKKyAqIFJldHVybnMgemVybyBpZiB0aGUgZHJpdmVyIHJlZ2lzdGVyZWQgYW5kIGJvdW5kIHRvIGEgZGV2aWNlLCBlbHNlIHJldHVybnMKKyAqIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBhbmQgd2l0aCB0aGUgZHJpdmVyIG5vdCByZWdpc3RlcmVkLgorICovCitpbnQgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRydiwKKwkJaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKikpCit7CisJaW50IHJldHZhbCwgY29kZTsKKworCS8qIHRlbXBvcmFyeSBzZWN0aW9uIHZpb2xhdGlvbiBkdXJpbmcgcHJvYmUoKSAqLworCWRydi0+cHJvYmUgPSBwcm9iZTsKKwlyZXR2YWwgPSBjb2RlID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKGRydik7CisKKwkvKiBGaXh1cCB0aGF0IHNlY3Rpb24gdmlvbGF0aW9uLCBiZWluZyBwYXJhbm9pZCBhYm91dCBjb2RlIHNjYW5uaW5nCisJICogdGhlIGxpc3Qgb2YgZHJpdmVycyBpbiBvcmRlciB0byBwcm9iZSBuZXcgZGV2aWNlcy4gIENoZWNrIHRvIHNlZQorCSAqIGlmIHRoZSBwcm9iZSB3YXMgc3VjY2Vzc2Z1bCwgYW5kIG1ha2Ugc3VyZSBhbnkgZm9yY2VkIHByb2JlcyBvZgorCSAqIG5ldyBkZXZpY2VzIGZhaWwuCisJICovCisJc3Bpbl9sb2NrKCZwbGF0Zm9ybV9idXNfdHlwZS5rbGlzdF9kcml2ZXJzLmtfbG9jayk7CisJZHJ2LT5wcm9iZSA9IE5VTEw7CisJaWYgKGNvZGUgPT0gMCAmJiBsaXN0X2VtcHR5KCZkcnYtPmRyaXZlci5rbGlzdF9kZXZpY2VzLmtfbGlzdCkpCisJCXJldHZhbCA9IC1FTk9ERVY7CisJZHJ2LT5kcml2ZXIucHJvYmUgPSBwbGF0Zm9ybV9kcnZfcHJvYmVfZmFpbDsKKwlzcGluX3VubG9jaygmcGxhdGZvcm1fYnVzX3R5cGUua2xpc3RfZHJpdmVycy5rX2xvY2spOworCisJaWYgKGNvZGUgIT0gcmV0dmFsKQorCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcihkcnYpOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kcml2ZXJfcHJvYmUpOwogCiAvKiBtb2RhbGlhcyBzdXBwb3J0IGVuYWJsZXMgbW9yZSBoYW5kcy1vZmYgdXNlcnNwYWNlIHNldHVwOgogICogKGEpIGVudmlyb25tZW50IHZhcmlhYmxlIGxldHMgbmV3LXN0eWxlIGhvdHBsdWcgZXZlbnRzIHdvcmsgb25jZSBzeXN0ZW0gaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jIGIvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMKaW5kZXggMjhkY2NiNy4uM2QxMmI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMKKysrIGIvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMKQEAgLTk0LDU0ICs5NCw2MyBAQAogCS5uYW1lID0gInRvcG9sb2d5IgogfTsKIAorc3RhdGljIGNwdW1hc2tfdCB0b3BvbG9neV9kZXZfbWFwID0gQ1BVX01BU0tfTk9ORTsKKwogLyogQWRkL1JlbW92ZSBjcHVfdG9wb2xvZ3kgaW50ZXJmYWNlIGZvciBDUFUgZGV2aWNlICovCi1zdGF0aWMgaW50IF9fY3B1aW5pdCB0b3BvbG9neV9hZGRfZGV2KHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3N0YXRpYyBpbnQgX19jcHVpbml0IHRvcG9sb2d5X2FkZF9kZXYodW5zaWduZWQgaW50IGNwdSkKIHsKLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmdG9wb2xvZ3lfYXR0cl9ncm91cCk7CisJaW50IHJjOworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKworCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmdG9wb2xvZ3lfYXR0cl9ncm91cCk7CisJaWYgKCFyYykKKwkJY3B1X3NldChjcHUsIHRvcG9sb2d5X2Rldl9tYXApOworCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgdG9wb2xvZ3lfcmVtb3ZlX2Rldih1bnNpZ25lZCBpbnQgY3B1KQogeworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKworCWlmICghY3B1X2lzc2V0KGNwdSwgdG9wb2xvZ3lfZGV2X21hcCkpCisJCXJldHVybjsKKwljcHVfY2xlYXIoY3B1LCB0b3BvbG9neV9kZXZfbWFwKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0b3BvbG9neV9hdHRyX2dyb3VwKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXY7CisJaW50IHJjID0gMDsKIAotCXN5c19kZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOwogCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQl0b3BvbG9neV9hZGRfZGV2KHN5c19kZXYpOworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJCXJjID0gdG9wb2xvZ3lfYWRkX2RldihjcHUpOwogCQlicmVhazsKKwljYXNlIENQVV9VUF9DQU5DRUxFRDoKIAljYXNlIENQVV9ERUFEOgotCQl0b3BvbG9neV9yZW1vdmVfZGV2KHN5c19kZXYpOworCQl0b3BvbG9neV9yZW1vdmVfZGV2KGNwdSk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiByYyA/IE5PVElGWV9CQUQgOiBOT1RJRllfT0s7CiB9Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSB0b3BvbG9neV9jcHVfbm90aWZpZXIgPQotewotCS5ub3RpZmllcl9jYWxsID0gdG9wb2xvZ3lfY3B1X2NhbGxiYWNrLAotfTsKKyNlbmRpZgogCiBzdGF0aWMgaW50IF9fY3B1aW5pdCB0b3BvbG9neV9zeXNmc19pbml0KHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IGNwdTsKKwlpbnQgcmM7CiAKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJdG9wb2xvZ3lfY3B1X2NhbGxiYWNrKCZ0b3BvbG9neV9jcHVfbm90aWZpZXIsIENQVV9PTkxJTkUsCi0JCQkJKHZvaWQgKikobG9uZylpKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlyYyA9IHRvcG9sb2d5X2FkZF9kZXYoY3B1KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCX0KLQotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdG9wb2xvZ3lfY3B1X25vdGlmaWVyKTsKKwlob3RjcHVfbm90aWZpZXIodG9wb2xvZ3lfY3B1X2NhbGxiYWNrLCAwKTsKIAogCXJldHVybiAwOwogfQogCiBkZXZpY2VfaW5pdGNhbGwodG9wb2xvZ3lfc3lzZnNfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKaW5kZXggZWM1YTFiOS4uZTE5YmE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKKysrIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKQEAgLTc1OSw2ICs3NTksOCBAQAogCX0KIH07CiAKK3N0YXRpYyBpbnQgbmVlZF9kZWxldGVfcHJvYmU7CisKIC8qCiAgKiBJbml0aWFsaXplIHRoZSB3aG9sZSBkZXZpY2UgZHJpdmVyLiAgSGFuZGxlIG1vZHVsZSBhbmQgbm9uLW1vZHVsZQogICogdmVyc2lvbnMKQEAgLTc3Myw0NiArNzc1LDY3IEBACiAKIAlpZiAodmlvcGF0aF9ob3N0THAgPT0gSHZMcEluZGV4SW52YWxpZCkgewogCQlwcmludGsoVklPRF9LRVJOX1dBUk5JTkcgImludmFsaWQgaG9zdGluZyBwYXJ0aXRpb25cbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVhcmx5X2ZhaWw7CiAJfQogCiAJcHJpbnRrKFZJT0RfS0VSTl9JTkZPICJ2ZXJzICIgVklPRF9WRVJTICIsIGhvc3RpbmcgcGFydGl0aW9uICVkXG4iLAogCQkJdmlvcGF0aF9ob3N0THApOwogCiAgICAgICAgIC8qIHJlZ2lzdGVyIHRoZSBibG9jayBkZXZpY2UgKi8KLQlpZiAocmVnaXN0ZXJfYmxrZGV2KFZJT0RBU0RfTUFKT1IsIFZJT0RfR0VOSERfTkFNRSkpIHsKKwlyYyA9ICByZWdpc3Rlcl9ibGtkZXYoVklPREFTRF9NQUpPUiwgVklPRF9HRU5IRF9OQU1FKTsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKFZJT0RfS0VSTl9XQVJOSU5HCiAJCQkJIlVuYWJsZSB0byBnZXQgbWFqb3IgbnVtYmVyICVkIGZvciAlc1xuIiwKIAkJCQlWSU9EQVNEX01BSk9SLCBWSU9EX0dFTkhEX05BTUUpOwotCQlyZXR1cm4gLUVJTzsKKwkJZ290byBlYXJseV9mYWlsOwogCX0KIAkvKiBBY3R1YWxseSBvcGVuIHRoZSBwYXRoIHRvIHRoZSBob3N0aW5nIHBhcnRpdGlvbiAqLwotCWlmICh2aW9wYXRoX29wZW4odmlvcGF0aF9ob3N0THAsIHZpb21ham9yc3VidHlwZV9ibG9ja2lvLAotCQkJCVZJT01BWFJFUSArIDIpKSB7CisJcmMgPSB2aW9wYXRoX29wZW4odmlvcGF0aF9ob3N0THAsIHZpb21ham9yc3VidHlwZV9ibG9ja2lvLAorCQkJCVZJT01BWFJFUSArIDIpOworCWlmIChyYykgewogCQlwcmludGsoVklPRF9LRVJOX1dBUk5JTkcKIAkJICAgICAgICJlcnJvciBvcGVuaW5nIHBhdGggdG8gaG9zdCBwYXJ0aXRpb24gJWRcbiIsCiAJCSAgICAgICB2aW9wYXRoX2hvc3RMcCk7Ci0JCXVucmVnaXN0ZXJfYmxrZGV2KFZJT0RBU0RfTUFKT1IsIFZJT0RfR0VOSERfTkFNRSk7Ci0JCXJldHVybiAtRUlPOworCQlnb3RvIHVucmVnaXN0ZXJfYmxrOwogCX0KIAogCS8qIEluaXRpYWxpemUgb3VyIHJlcXVlc3QgaGFuZGxlciAqLwogCXZpb19zZXRIYW5kbGVyKHZpb21ham9yc3VidHlwZV9ibG9ja2lvLCBoYW5kbGVfYmxvY2tfZXZlbnQpOwogCiAJcmMgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2aW9kYXNkX2RyaXZlcik7Ci0JaWYgKHJjID09IDApCi0JCWRyaXZlcl9jcmVhdGVfZmlsZSgmdmlvZGFzZF9kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfcHJvYmUpOworCWlmIChyYykgeworCQlwcmludGsoVklPRF9LRVJOX1dBUk5JTkcgInZpb19yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkXG4iKTsKKwkJZ290byB1bnNldF9oYW5kbGVyOworCX0KKworCS8qCisJICogSWYgdGhpcyBjYWxsIGZhaWxzLCBpdCBqdXN0IG1lYW5zIHRoYXQgd2UgY2Fubm90IGR5bmFtaWNhbGx5CisJICogYWRkIHZpcnR1YWwgZGlza3MsIGJ1dCB0aGUgZHJpdmVyIHdpbGwgc3RpbGwgd29yayBmaW5lIGZvcgorCSAqIGFsbCBleGlzdGluZyBkaXNrLCBzbyBpZ25vcmUgdGhlIGZhaWx1cmUuCisJICovCisJaWYgKCFkcml2ZXJfY3JlYXRlX2ZpbGUoJnZpb2Rhc2RfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3Byb2JlKSkKKwkJbmVlZF9kZWxldGVfcHJvYmUgPSAxOworCisJcmV0dXJuIDA7CisKK3Vuc2V0X2hhbmRsZXI6CisJdmlvX2NsZWFySGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfYmxvY2tpbyk7CisJdmlvcGF0aF9jbG9zZSh2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX2Jsb2NraW8sIFZJT01BWFJFUSArIDIpOwordW5yZWdpc3Rlcl9ibGs6CisJdW5yZWdpc3Rlcl9ibGtkZXYoVklPREFTRF9NQUpPUiwgVklPRF9HRU5IRF9OQU1FKTsKK2Vhcmx5X2ZhaWw6CiAJcmV0dXJuIHJjOwogfQogbW9kdWxlX2luaXQodmlvZGFzZF9pbml0KTsKIAotdm9pZCB2aW9kYXNkX2V4aXQodm9pZCkKK3ZvaWQgX19leGl0IHZpb2Rhc2RfZXhpdCh2b2lkKQogewotCWRyaXZlcl9yZW1vdmVfZmlsZSgmdmlvZGFzZF9kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfcHJvYmUpOworCWlmIChuZWVkX2RlbGV0ZV9wcm9iZSkKKwkJZHJpdmVyX3JlbW92ZV9maWxlKCZ2aW9kYXNkX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9wcm9iZSk7CiAJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2aW9kYXNkX2RyaXZlcik7CiAJdmlvX2NsZWFySGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfYmxvY2tpbyk7Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoVklPREFTRF9NQUpPUiwgVklPRF9HRU5IRF9OQU1FKTsKIAl2aW9wYXRoX2Nsb3NlKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfYmxvY2tpbywgVklPTUFYUkVRICsgMik7CisJdW5yZWdpc3Rlcl9ibGtkZXYoVklPREFTRF9NQUpPUiwgVklPRF9HRU5IRF9OQU1FKTsKIH0KLQogbW9kdWxlX2V4aXQodmlvZGFzZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCmluZGV4IGNiYzA3MjUuLmFjZmI2YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwpAQCAtODkyLDQzICs4OTIsMTAgQEAKIH0KIAogCi1zdGF0aWMgaW50IGZpcnN0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKLXsKLQlpbnQgaTsKLQotCWkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBDU19OT19NT1JFX0lURU1TOwotCi0JaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKQotCQlyZXR1cm4gaTsKLQotCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQotCiBzdGF0aWMgaW50IGJsdWVjYXJkX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlibHVlY2FyZF9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OwotCXR1cGxlX3QgdHVwbGU7Ci0JdV9zaG9ydCBidWZbMjU2XTsKLQljaXNwYXJzZV90IHBhcnNlOwotCWludCBpLCBuLCBsYXN0X3JldCwgbGFzdF9mbjsKLQotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQotCS8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZm9ybWF0aW9uICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlsYXN0X3JldCA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQlpZiAobGFzdF9yZXQgIT0gQ1NfU1VDQ0VTUykgewotCQlsYXN0X2ZuID0gUGFyc2VUdXBsZTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwlpbnQgaSwgbjsKIAogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDIwOwogCWxpbmstPmlvLk51bVBvcnRzMSA9IDY0OwpAQCAtOTY2LDkgKzkzMyw2IEBACiAKIAlyZXR1cm4gMDsKIAotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKLQogZmFpbGVkOgogCWJsdWVjYXJkX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggM2E5NmEwYi4uYWFlM2FiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtNzEzLDIyICs3MTMsNyBAQAogCXVfc2hvcnQgYnVmWzI1Nl07CiAJY2lzcGFyc2VfdCBwYXJzZTsKIAljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OwotCWludCBpLCBqLCB0cnksIGxhc3RfcmV0LCBsYXN0X2ZuOwotCi0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCi0JLyogR2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5mb3JtYXRpb24gKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCWxhc3RfcmV0ID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCWludCBpLCBqLCB0cnk7CiAKIAkvKiBGaXJzdCBwYXNzOiBsb29rIGZvciBhIGNvbmZpZyBlbnRyeSB0aGF0IGxvb2tzIG5vcm1hbC4gKi8KIAl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwpAQCAtODAyLDkgKzc4Nyw2IEBACiAKIAlyZXR1cm4gMDsKIAotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKLQogZmFpbGVkOgogCWJ0M2NfcmVsZWFzZShsaW5rKTsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKaW5kZXggM2IyOTA4Ni4uOTI2NDhlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKQEAgLTY0NCwyMiArNjQ0LDcgQEAKIAl1X3Nob3J0IGJ1ZlsyNTZdOwogCWNpc3BhcnNlX3QgcGFyc2U7CiAJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKLQlpbnQgaSwgaiwgdHJ5LCBsYXN0X3JldCwgbGFzdF9mbjsKLQotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQotCS8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZm9ybWF0aW9uICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlsYXN0X3JldCA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQlpZiAobGFzdF9yZXQgIT0gQ1NfU1VDQ0VTUykgewotCQlsYXN0X2ZuID0gUGFyc2VUdXBsZTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwlpbnQgaSwgaiwgdHJ5OwogCiAJLyogRmlyc3QgcGFzczogbG9vayBmb3IgYSBjb25maWcgZW50cnkgdGhhdCBsb29rcyBub3JtYWwuICovCiAJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSBidWY7CkBAIC03MzQsOSArNzE5LDYgQEAKIAogCXJldHVybiAwOwogCi1jc19mYWlsZWQ6Ci0JY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOwotCiBmYWlsZWQ6CiAJYnR1YXJ0X3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKaW5kZXggMDdlYWZiYy4uNzdiOTllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwpAQCAtNjI2LDIyICs2MjYsNyBAQAogCXVfc2hvcnQgYnVmWzI1Nl07CiAJY2lzcGFyc2VfdCBwYXJzZTsKIAljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OwotCWludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKLQotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQotCS8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZm9ybWF0aW9uICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlsYXN0X3JldCA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQlpZiAobGFzdF9yZXQgIT0gQ1NfU1VDQ0VTUykgewotCQlsYXN0X2ZuID0gUGFyc2VUdXBsZTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwlpbnQgaTsKIAogCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwpAQCAtNjkwLDkgKzY3NSw2IEBACiAKIAlyZXR1cm4gMDsKIAotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKLQogZmFpbGVkOgogCWR0bDFfcmVsZWFzZShsaW5rKTsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwppbmRleCA3ZWEwZjQ4Zi4uMmRmNWNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMjEzMywxNiArMjEzMywxNCBAQAogCQlycS0+dGltZW91dCA9IDYwICogSFo7CiAJCWJpbyA9IHJxLT5iaW87CiAKLQkJaWYgKHJxLT5iaW8pCi0JCQlibGtfcXVldWVfYm91bmNlKHEsICZycS0+YmlvKTsKLQogCQlpZiAoYmxrX2V4ZWN1dGVfcnEocSwgY2RpLT5kaXNrLCBycSwgMCkpIHsKIAkJCXN0cnVjdCByZXF1ZXN0X3NlbnNlICpzID0gcnEtPnNlbnNlOwogCQkJcmV0ID0gLUVJTzsKIAkJCWNkaS0+bGFzdF9zZW5zZSA9IHMtPnNlbnNlX2tleTsKIAkJfQogCi0JCWlmIChibGtfcnFfdW5tYXBfdXNlcihiaW8sIGxlbikpCisJCXJxLT5iaW8gPSBiaW87CisJCWlmIChibGtfcnFfdW5tYXBfdXNlcihycSkpCiAJCQlyZXQgPSAtRUZBVUxUOwogCiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDJhZjEyZmMuLjI0ZjkyMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC04NTUsMzkgKzg1NSw2IEBACiAJZGVwZW5kcyBUQU5CQUNfVEIwMjJYCiAJc2VsZWN0IEdQSU9fVlI0MVhYCiAKLW1lbnUgIkZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlciIKLQotY29uZmlnIEZUQVBFCi0JdHJpc3RhdGUgIkZ0YXBlIChRSUMtODAvVHJhdmFuKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJPS0VOX09OX1NNUCAmJiAoQUxQSEEgfHwgWDg2KQotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBoYXZlIGEgdGFwZSBkcml2ZSB0aGF0IGlzIGNvbm5lY3RlZCB0byB5b3VyIGZsb3BweQotCSAgY29udHJvbGxlciwgc2F5IFkgaGVyZS4KLQotCSAgU29tZSB0YXBlIGRyaXZlcyAobGlrZSB0aGUgU2VhZ2F0ZSAiVGFwZSBTdG9yZSAzMjAwIiBvciB0aGUgSW9tZWdhCi0JICAiRGl0dG8gMzIwMCIgb3IgdGhlIEV4YWJ5dGUgIkVhZ2xlIFRSLTMiKSBjb21lIHdpdGggYSAiaGlnaCBzcGVlZCIKLQkgIGNvbnRyb2xsZXIgb2YgdGhlaXIgb3duLiBUaGVzZSBkcml2ZXMgKGFuZCB0aGVpciBjb21wYW5pb24KLQkgIGNvbnRyb2xsZXJzKSBhcmUgYWxzbyBzdXBwb3J0ZWQgaWYgeW91IHNheSBZIGhlcmUuCi0KLQkgIElmIHlvdSBoYXZlIGEgc3BlY2lhbCBjb250cm9sbGVyIChzdWNoIGFzIHRoZSBDTVMgRkMtMTAsIEZDLTIwLAotCSAgTW91bnRhaW4gTWFjaC1JSSwgb3IgYW55IGNvbnRyb2xsZXIgdGhhdCBpcyBiYXNlZCBvbiB0aGUgSW50ZWwgODIwNzgKLQkgIEZEQyBsaWtlIHRoZSBoaWdoIHNwZWVkIGNvbnRyb2xsZXJzIGJ5IFNlYWdhdGUgYW5kIEV4YWJ5dGUgYW5kCi0JICBJb21lZ2EncyAiRGl0dG8gRGFzaCIpIHlvdSBtdXN0IGNvbmZpZ3VyZSBpdCBieSBzZWxlY3RpbmcgdGhlCi0JICBhcHByb3ByaWF0ZSBlbnRyaWVzIGZyb20gdGhlICJGbG9wcHkgdGFwZSBjb250cm9sbGVycyIgc3ViLW1lbnUKLQkgIGJlbG93IGFuZCBwb3NzaWJseSBtb2RpZnkgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgSVJRIGFuZCBETUEKLQkgIGNoYW5uZWwgYW5kIHRoZSBJTyBiYXNlIGluIGZ0YXBlJ3MgY29uZmlndXJhdGlvbiBtZW51LgotCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBmbG9wcHkgdGFwZSBkcml2ZSBvbiBhIFBDSS1idXMgYmFzZWQgc3lzdGVtLAotCSAgcGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6ZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0k+LgotCi0JICBUaGUgZnRhcGUga2VybmVsIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIHJ1bnRpbWUgbG9hZGFibGUKLQkgIG1vZHVsZS4gVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZnRhcGUuCi0KLXNvdXJjZSAiZHJpdmVycy9jaGFyL2Z0YXBlL0tjb25maWciCi0KLWVuZG1lbnUKLQogc291cmNlICJkcml2ZXJzL2NoYXIvYWdwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9jaGFyL2RybS9LY29uZmlnIgpAQCAtOTk0LDcgKzk2MSw3IEBACiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGhhdmUgYSBtaXNjZGV2aWNlIG5hbWVkICIvZGV2L2hwZXQvIi4gIEVhY2gKIAkgIG9wZW4gc2VsZWN0cyBvbmUgb2YgdGhlIHRpbWVycyBzdXBwb3J0ZWQgYnkgdGhlIEhQRVQuICBUaGUgdGltZXJzIGFyZQotCSAgbm9uLXBlcmlvZGlvYyBhbmQvb3IgcGVyaW9kaWMuCisJICBub24tcGVyaW9kaWMgYW5kL29yIHBlcmlvZGljLgogCiBjb25maWcgSFBFVF9SVENfSVJRCiAJYm9vbCAiSFBFVCBDb250cm9sIFJUQyBJUlEiIGlmICFIUEVUX0VNVUxBVEVfUlRDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggNzc3Y2FkMC4uYjFmY2RhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtNzgsNyArNzgsNiBAQAogb2JqLSQoQ09ORklHX0k4SykJCSs9IGk4ay5vCiBvYmotJChDT05GSUdfRFMxNjIwKQkJKz0gZHMxNjIwLm8KIG9iai0kKENPTkZJR19IV19SQU5ET00pCQkrPSBod19yYW5kb20vCi1vYmotJChDT05GSUdfRlRBUEUpCQkrPSBmdGFwZS8KIG9iai0kKENPTkZJR19DT0JBTFRfTENEKQkrPSBsY2Qubwogb2JqLSQoQ09ORklHX1BQREVWKQkJKz0gcHBkZXYubwogb2JqLSQoQ09ORklHX05XQlVUVE9OKQkJKz0gbndidXR0b24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwppbmRleCBjMzkyMDAxLi41ZmY0NTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMTA1NCw3ICsxMDU0LDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CiAKLQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQTMyKTsKIAlpZiAocGFnZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKaW5kZXggZDFlZGU3ZC4uNTU1YjNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CiAKLQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMik7CisJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BMzIsIDIpOwogCWlmIChwYWdlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC0zODcsMTEgKzM4Nyw3IEBACiAJLyogV2Ugb2J0YWluIHRoZSBzaXplIG9mIHRoZSBHVFQsIHdoaWNoIGlzIGFsc28gc3RvcmVkIChmb3Igc29tZQogCSAqIHJlYXNvbikgYXQgdGhlIHRvcCBvZiBzdG9sZW4gbWVtb3J5LiBUaGVuIHdlIGFkZCA0S0IgdG8gdGhhdAogCSAqIGZvciB0aGUgdmlkZW8gQklPUyBwb3B1cCwgd2hpY2ggaXMgYWxzbyBzdG9yZWQgaW4gdGhlcmUuICovCi0KLQlpZiAoSVNfSTk2NSkKLQkJc2l6ZSA9IDUxMiArIDQ7Ci0JZWxzZQotCQlzaXplID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5mZXRjaF9zaXplKCkgKyA0OworCXNpemUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmZldGNoX3NpemUoKSArIDQ7CiAKIAlpZiAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9IQiB8fAogCSAgICBhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19IQikgewpAQCAtODA1LDYgKzgwMSwyNiBAQAogCiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBUaGUgaTk2NSBzdXBwb3J0cyAzNi1iaXQgcGh5c2ljYWwgYWRkcmVzc2VzLCBidXQgdG8ga2VlcAorICogdGhlIGZvcm1hdCBvZiB0aGUgR1RUIHRoZSBzYW1lLCB0aGUgYml0cyB0aGF0IGRvbid0IGZpdAorICogaW4gYSAzMi1iaXQgd29yZCBhcmUgc2hpZnRlZCBkb3duIHRvIGJpdHMgNC4uNy4KKyAqCisgKiBHY2MgaXMgc21hcnQgZW5vdWdoIHRvIG5vdGljZSB0aGF0ICIoYWRkciA+PiAyOCkgJiAweGYwIgorICogaXMgYWx3YXlzIHplcm8gb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIHNvIG5vIG5lZWQgdG8gbWFrZQorICogdGhpcyBjb25kaXRpb25hbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfaTk2NV9tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCisJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSkKK3sKKwkvKiBTaGlmdCBoaWdoIGJpdHMgZG93biAqLworCWFkZHIgfD0gKGFkZHIgPj4gMjgpICYgMHhmMDsKKworCS8qIFR5cGUgY2hlY2tpbmcgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSAqLworCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzW3R5cGVdLm1hc2s7Cit9CisKIHN0YXRpYyBpbnQgaW50ZWxfaTk2NV9mZXRjaF9zaXplKHZvaWQpCiB7CiAgICAgICAgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICp2YWx1ZXM7CkBAIC04MzIsNyArODQ4LDggQEAKIAogICAgICAgIGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSh2YWx1ZXMgKyBvZmZzZXQpOwogCi0gICAgICAgcmV0dXJuIHZhbHVlc1tvZmZzZXRdLnNpemU7CisJLyogVGhlIGk5NjUgR1RUIGlzIGFsd2F5cyBzaXplZCBhcyBpZiBpdCBoYWQgYSA1MTJrQiBhcGVydHVyZSBzaXplICovCisJcmV0dXJuIDUxMjsKIH0KIAogLyogVGhlIGludGVsIGk5NjUgYXV0b21hdGljYWxseSBpbml0aWFsaXplcyB0aGUgYWdwIGFwZXJ0dXJlIGR1cmluZyBQT1NULgpAQCAtMTU4NCw3ICsxNjAxLDcgQEAKICAgICAgICAuZmV0Y2hfc2l6ZSAgICAgICAgICAgICA9IGludGVsX2k5NjVfZmV0Y2hfc2l6ZSwKICAgICAgICAuY2xlYW51cCAgICAgICAgICAgICAgICA9IGludGVsX2k5MTVfY2xlYW51cCwKICAgICAgICAudGxiX2ZsdXNoICAgICAgICAgICAgICA9IGludGVsX2k4MTBfdGxiZmx1c2gsCi0gICAgICAgLm1hc2tfbWVtb3J5ICAgICAgICAgICAgPSBpbnRlbF9pODEwX21hc2tfbWVtb3J5LAorICAgICAgIC5tYXNrX21lbW9yeSAgICAgICAgICAgID0gaW50ZWxfaTk2NV9tYXNrX21lbW9yeSwKICAgICAgICAubWFza3MgICAgICAgICAgICAgICAgICA9IGludGVsX2k4MTBfbWFza3MsCiAgICAgICAgLmFncF9lbmFibGUgICAgICAgICAgICAgPSBpbnRlbF9pODEwX2FncF9lbmFibGUsCiAgICAgICAgLmNhY2hlX2ZsdXNoICAgICAgICAgICAgPSBnbG9iYWxfY2FjaGVfZmx1c2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY1MTg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLSMKLSMgRnRhcGUgY29uZmlndXJhdGlvbgotIwotY29uZmlnIFpGVEFQRQotCXRyaXN0YXRlICJaZnRhcGUsIHRoZSBWRlMgaW50ZXJmYWNlIgotCWRlcGVuZHMgb24gRlRBUEUKLQktLS1oZWxwLS0tCi0JICBOb3JtYWxseSwgeW91IHdhbnQgdG8gc2F5IFkgb3IgTS4gRE9OJ1Qgc2F5IE4gaGVyZSBvciB5b3UKLQkgIFdPTidUIEJFIEFCTEUgVE8gVVNFIFlPVVIgRkxPUFBZIFRBUEUgRFJJVkUuCi0KLQkgIFRoZSBmdGFwZSBtb2R1bGUgaXRzZWxmIG5vIGxvbmdlciBjb250YWlucyB0aGUgcm91dGluZXMgbmVjZXNzYXJ5Ci0JICB0byBpbnRlcmZhY2Ugd2l0aCB0aGUga2VybmVsIFZGUyBsYXllciAoaS5lLiB0byBhY3R1YWxseSB3cml0ZSBkYXRhCi0JICB0byBhbmQgcmVhZCBkYXRhIGZyb20gdGhlIHRhcGUgZHJpdmUpLiAgSW5zdGVhZCB0aGUgZmlsZSBzeXN0ZW0KLQkgIGludGVyZmFjZSAoaS5lLiB0aGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQgcGFydCBvZiB0aGUgZHJpdmVyKSBoYXMKLQkgIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBtb2R1bGUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpmdGFwZS4KLQotCSAgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdSBzYXkgWSBvciBNIGhlcmUsIGFuIGFkZGl0aW9uYWwgcnVudGltZQotCSAgbG9hZGFibGUgbW9kdWxlIGNhbGxlZCBgemZ0LWNvbXByZXNzb3InIHdoaWNoIGNvbnRhaW5zIGNvZGUgdG8KLQkgIHN1cHBvcnQgdXNlciB0cmFuc3BhcmVudCBvbi10aGUtZmx5IGNvbXByZXNzaW9uIGJhc2VkIG9uIFJvc3MKLQkgIFdpbGxpYW0ncyBsenJ3MyBhbGdvcml0aG0gd2lsbCBiZSBwcm9kdWNlZC4gIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhlCi0JICBrZXJuZWwgbW9kdWxlIGxvYWRlciAoaS5lLiBoYXZlIHNhaWQgWSB0byAiS2VybmVsIG1vZHVsZSBsb2FkZXIKLQkgIHN1cHBvcnQiLCBhYm92ZSkgdGhlbiBgemZ0LWNvbXByZXNzb3InIHdpbGwgYmUgbG9hZGVkCi0JICBhdXRvbWF0aWNhbGx5IGJ5IHpmdGFwZSB3aGVuIG5lZWRlZC4KLQotCSAgRGVzcGl0ZSBpdHMgbmFtZSwgemZ0YXBlIGRvZXMgTk9UIHVzZSBjb21wcmVzc2lvbiBieSBkZWZhdWx0LgotCi1jb25maWcgWkZUX0RGTFRfQkxLX1NaCi0JaW50ICJEZWZhdWx0IGJsb2NrIHNpemUiCi0JZGVwZW5kcyBvbiBaRlRBUEUKLQlkZWZhdWx0ICIxMDI0MCIKLQktLS1oZWxwLS0tCi0JICBJZiB1bnN1cmUgbGVhdmUgdGhpcyBhdCBpdHMgZGVmYXVsdCB2YWx1ZSwgaS5lLiAxMDI0MC4gTm90ZSB0aGF0Ci0JICB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaGVyZS4gVGhlIGJsb2NrIHNpemUgY2FuIGJlCi0JICBjaGFuZ2VkIGF0IHJ1biB0aW1lIHVzaW5nIHRoZSBNVFNFVEJMSyB0YXBlIG9wZXJhdGlvbiB3aXRoIHRoZQotCSAgTVRJT0NUT1AgaW9jdGwgKGkuZS4gd2l0aCAibXQgLWYgL2Rldi9xZnQwIHNldGJsayAjQkxLU1oiIGZyb20gdGhlCi0JICBzaGVsbCBjb21tYW5kIGxpbmUpLgotCi0JICBUaGUgcHJvYmFibHkgbW9zdCBzdHJpa2luZyBkaWZmZXJlbmNlIGJldHdlZW4gemZ0YXBlIGFuZCBwcmV2aW91cwotCSAgdmVyc2lvbnMgb2YgZnRhcGUgaXMgdGhlIGZhY3QgdGhhdCBhbGwgZGF0YSBtdXN0IGJlIHdyaXR0ZW4gb3IgcmVhZAotCSAgaW4gbXVsdGlwbGVzIG9mIGEgZml4ZWQgYmxvY2sgc2l6ZS4gVGhlIGJsb2NrIHNpemUgZGVmYXVsdHMgdG8KLQkgIDEwMjQwIHdoaWNoIGlzIHdoYXQgR05VIHRhciB1c2VzLiBUaGUgdmFsdWVzIGZvciB0aGUgYmxvY2sgc2l6ZQotCSAgc2hvdWxkIGJlIGVpdGhlciAxIG9yIG11bHRpcGxlcyBvZiAxMDI0IHVwIHRvIGEgbWF4aW11bSB2YWx1ZSBvZgotCSAgNjM0ODggKGkuZS4gNjIgSykuIElmIHlvdSBzcGVjaWZ5IGAxJyB0aGVuIHpmdGFwZSdzIGJ1aWx0aW4KLQkgIGNvbXByZXNzaW9uIHdpbGwgYmUgZGlzYWJsZWQuCi0KLQkgIFJlYXNvbmFibGUgdmFsdWVzIGFyZSBgMTAyNDAnIChHTlUgdGFyJ3MgZGVmYXVsdCBibG9jayBzaXplKSwKLQkgIGA1MTIwJyAoYWZpbydzIGRlZmF1bHQgYmxvY2sgc2l6ZSksIGAzMjc2OCcgKGRlZmF1bHQgYmxvY2sgc2l6ZSBzb21lCi0JICBiYWNrdXAgcHJvZ3JhbXMgYXNzdW1lIGZvciBTQ1NJIHRhcGUgZHJpdmVzKSBvciBgMScgKG5vIHJlc3RyaWN0aW9uCi0JICBvbiBibG9jayBzaXplLCBidXQgZGlzYWJsZXMgYnVpbHRpbiBjb21wcmVzc2lvbikuCi0KLWNvbW1lbnQgIlRoZSBjb21wcmVzc29yIHdpbGwgYmUgYnVpbHQgYXMgYSBtb2R1bGUgb25seSEiCi0JZGVwZW5kcyBvbiBGVEFQRSAmJiBaRlRBUEUKLQotY29uZmlnIFpGVF9DT01QUkVTU09SCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIEZUQVBFIT1uICYmIFpGVEFQRSE9bgotCWRlZmF1bHQgbQotCi1jb25maWcgRlRfTlJfQlVGRkVSUwotCWludCAiTnVtYmVyIG9mIGZ0YXBlIGJ1ZmZlcnMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0ICIzIgotCWhlbHAKLQkgIFBsZWFzZSBsZWF2ZSB0aGlzIGF0IGAzJyB1bmxlc3MgeW91IFJFQUxMWSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KLQkgIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoaXMgdmFsdWUuIFZhbHVlcyBiZWxvdyAzIG1ha2UgdGhlCi0JICBwcm9wZXIgdXNlIG9mIGZ0YXBlIGltcG9zc2libGUsIHZhbHVlcyBncmVhdGVyIHRoYW4gMyBhcmUgYSB3YXN0ZSBvZgotCSAgbWVtb3J5LiBZb3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIERNQSBtZW1vcnkgdXNlZCBieSBmdGFwZSBhdAotCSAgcnVudGltZSB3aXRoICJtdCAtZiAvZGV2L3FmdDAgc2V0ZHJ2YnVmZmVyICNOVU1CVUZGRVJTIi4gRWFjaCBidWZmZXIKLQkgIHdhc3RlcyAzMiBLQiBvZiBtZW1vcnkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZW1vcnkgY2Fubm90IGJlCi0JICBzd2FwcGVkIG91dC4KLQotY29uZmlnIEZUX1BST0NfRlMKLQlib29sICJFbmFibGUgcHJvY2ZzIHN0YXR1cyByZXBvcnQgKCsya2IpIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgUFJPQ19GUwotCS0tLWhlbHAtLS0KLQkgIE9wdGlvbmFsLiBTYXlpbmcgWSB3aWxsIHJlc3VsdCBpbiBjcmVhdGlvbiBvZiBhIGRpcmVjdG9yeQotCSAgYC9wcm9jL2Z0YXBlJyB1bmRlciB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uIFRoZSBmaWxlcyBjYW4gYmUgdmlld2VkCi0JICB3aXRoIHlvdXIgZmF2b3JpdGUgcGFnZXIgKGkuZS4gdXNlICJtb3JlIC9wcm9jL2Z0YXBlL2hpc3RvcnkiIG9yCi0JICAibGVzcyAvcHJvYy9mdGFwZS9oaXN0b3J5IiBvciBzaW1wbHkgImNhdCAvcHJvYy9mdGFwZS9oaXN0b3J5IikuIFRoZQotCSAgZmlsZSB3aWxsIGNvbnRhaW4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc2VydGVkCi0JICBjYXJ0cmlkZ2UsIHRoZSBrZXJuZWwgZHJpdmVyLCB5b3VyIHRhcGUgZHJpdmUsIHRoZSBmbG9wcHkgZGlzawotCSAgY29udHJvbGxlciBhbmQgdGhlIGVycm9yIGhpc3RvcnkgZm9yIHRoZSBtb3N0IHJlY2VudCB1c2Ugb2YgdGhlCi0JICBrZXJuZWwgZHJpdmVyLiBTYXlpbmcgWSB3aWxsIGVubGFyZ2UgdGhlIHNpemUgb2YgdGhlIGZ0YXBlIGRyaXZlcgotCSAgYnkgYXBwcm94aW1hdGVseSAyIEtCLgotCi0JICBXQVJOSU5HOiBXaGVuIGNvbXBpbGluZyBmdGFwZSBhcyBhIG1vZHVsZSAoaS5lLiBzYXlpbmcgTSB0byAiRmxvcHB5Ci0JICB0YXBlIGRyaXZlIikgaXQgaXMgZGFuZ2Vyb3VzIHRvIHVzZSBmdGFwZSdzIC9wcm9jIGZpbGUgc3lzdGVtCi0JICBpbnRlcmZhY2UuIEFjY2Vzc2luZyBgL3Byb2MvZnRhcGUnIHdoaWxlIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQgd2lsbAotCSAgcmVzdWx0IGluIGEga2VybmVsIE9vcHMuIFRoaXMgY2Fubm90IGJlIGZpeGVkIGZyb20gaW5zaWRlIGZ0YXBlLgotCi1jaG9pY2UKLQlwcm9tcHQgIkRlYnVnZ2luZyBvdXRwdXQiCi0JZGVwZW5kcyBvbiBGVEFQRQotCWRlZmF1bHQgRlRfTk9STUFMX0RFQlVHCi0KLWNvbmZpZyBGVF9OT1JNQUxfREVCVUcKLQlib29sICJOb3JtYWwiCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gY29udHJvbHMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IHRoZSBmdGFwZSBkcml2ZXIKLQkgIGlzIEFCTEUgdG8gcHJvZHVjZTsgaXQgZG9lcyBub3QgaW5jcmVhc2Ugb3IgZGltaW5pc2ggdGhlIGRlYnVnZ2luZwotCSAgbGV2ZWwgaXRzZWxmLiBJZiB1bnN1cmUsIGxlYXZlIHRoaXMgYXQgaXRzIGRlZmF1bHQgc2V0dGluZywKLQkgIGkuZS4gY2hvb3NlICJOb3JtYWwiLgotCi0JICBGdGFwZSBjYW4gcHJpbnQgbG90cyBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBjb25zb2xlCi0JICByZXNwLiBrZXJuZWwgbG9nIGZpbGVzLiBSZWR1Y2luZyB0aGUgYW1vdW50IG9mIHBvc3NpYmxlIGRlYnVnZ2luZwotCSAgb3V0cHV0IHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBtb2R1bGUgYnkgc29tZSBLQiwgc28gaXQgbWlnaHQKLQkgIGJlIGEgZ29vZCBpZGVhIHRvIHVzZSAiTm9uZSIgZm9yIGVtZXJnZW5jeSBib290IGZsb3BwaWVzLgotCi0JICBJZiB5b3Ugd2FudCB0byBzYXZlIG1lbW9yeSB0aGVuIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgaXMKLQkgIHJlY29tbWVuZGVkOiBsZWF2ZSB0aGlzIG9wdGlvbiBhdCBpdHMgZGVmYXVsdCBzZXR0aW5nICJOb3JtYWwiIHVudGlsCi0JICB5b3Uga25vdyB0aGF0IHRoZSBkcml2ZXIgd29ya3MgYXMgZXhwZWN0ZWQsIGFmdGVyd2FyZHMgcmVjb25maWd1cmUKLQkgIHRoZSBrZXJuZWwsIHRoaXMgdGltZSBzcGVjaWZ5aW5nICJSZWR1Y2VkIiBvciAiTm9uZSIgYW5kIHJlY29tcGlsZQotCSAgYW5kIGluc3RhbGwgdGhlIGtlcm5lbCBhcyB1c3VhbC4gTm90ZSB0aGF0IGNob29zaW5nICJFeGNlc3NpdmUiCi0JICBkZWJ1Z2dpbmcgb3V0cHV0IGRvZXMgbm90IGluY3JlYXNlIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dAotCSAgcHJpbnRlZCB0byB0aGUgY29uc29sZSBidXQgb25seSBtYWtlcyBpdCBwb3NzaWJsZSB0byBwcm9kdWNlCi0JICAiRXhjZXNzaXZlIiBkZWJ1Z2dpbmcgb3V0cHV0LgotCi0JICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gZm9yIGEgc2hvcnQgZGVzY3JpcHRpb24KLQkgIGhvdyB0byBjb250cm9sIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dC4KLQotY29uZmlnIEZUX0ZVTExfREVCVUcKLQlib29sICJFeGNlc3NpdmUiCi0JaGVscAotCSAgRXh0cmVtZWx5IHZlcmJvc2Ugb3V0cHV0IGZvciBkcml2ZXIgZGVidWdnaW5nIHB1cnBvc2VzLgotCi1jb25maWcgRlRfTk9fVFJBQ0UKLQlib29sICJSZWR1Y2VkIgotCWhlbHAKLQkgIFJlZHVjZWQgdGFwZSBkcml2ZXIgZGVidWdnaW5nIG91dHB1dC4KLQotY29uZmlnIEZUX05PX1RSQUNFX0FUX0FMTAotCWJvb2wgIk5vbmUiCi0JaGVscAotCSAgU3VwcHJlc3MgYWxsIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSB0aGUgdGFwZSBkcml2ZS4KLQotZW5kY2hvaWNlCi0KLWNvbW1lbnQgIkhhcmR3YXJlIGNvbmZpZ3VyYXRpb24iCi0JZGVwZW5kcyBvbiBGVEFQRQotCi1jaG9pY2UKLQlwcm9tcHQgIkZsb3BweSB0YXBlIGNvbnRyb2xsZXJzIgotCWRlcGVuZHMgb24gRlRBUEUKLQlkZWZhdWx0IEZUX1NURF9GREMKLQotY29uZmlnIEZUX1NURF9GREMKLQlib29sICJTdGFuZGFyZCIKLQktLS1oZWxwLS0tCi0JICBPbmx5IGNoYW5nZSB0aGlzIHNldHRpbmcgaWYgeW91IGhhdmUgYSBzcGVjaWFsIGNvbnRyb2xsZXIuIElmIHlvdQotCSAgZGlkbid0IHBsdWcgYW55IGFkZC1vbiBjYXJkIGludG8geW91ciBjb21wdXRlciBzeXN0ZW0gYnV0IGp1c3QKLQkgIHBsdWdnZWQgdGhlIGZsb3BweSB0YXBlIGNhYmxlIGludG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgZmxvcHB5IGRyaXZlCi0JICBjb250cm9sbGVyIHRoZW4geW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHNldHRpbmcsCi0JICBpLmUuIGNob29zZSAiU3RhbmRhcmQiLgotCi0JICBDaG9vc2UgIk1BQ0gtMiIgaWYgeW91IGhhdmUgYSBNb3VudGFpbiBNYWNoLTIgY29udHJvbGxlci4KLQkgIENob29zZSAiRkMtMTAvRkMtMjAiIGlmIHlvdSBoYXZlIGEgQ29sb3JhZG8gRkMtMTAgb3IgRkMtMjAKLQkgIGNvbnRyb2xsZXIuCi0JICBDaG9vc2UgIkFsdC84MjA3OCIgaWYgeW91IGhhdmUgYW5vdGhlciBjb250cm9sbGVyIHRoYXQgaXMgbG9jYXRlZCBhdAotCSAgYW4gSU8gYmFzZSBhZGRyZXNzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFuZGFyZCBmbG9wcHkgZHJpdmUKLQkgIGNvbnRyb2xsZXIncyBiYXNlIGFkZHJlc3Mgb2YgYDB4M2YwJywgb3IgdXNlcyBhbiBJUlEgKGludGVycnVwdCkKLQkgIGNoYW5uZWwgZGlmZmVyZW50IGZyb20gYDYnLCBvciBhIERNQSBjaGFubmVsIGRpZmZlcmVudCBmcm9tCi0JICBgMicuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBhbnkgY29udHJvbGxlciBjYXJkIHRoYXQgaXMgYmFzZWQgb24KLQkgIEludGVsJ3MgODIwNzggRkRDIHN1Y2ggYXMgU2VhZ2F0ZSdzLCBFeGFieXRlJ3MgYW5kIElvbWVnYSdzICJoaWdoCi0JICBzcGVlZCIgY29udHJvbGxlcnMuCi0KLQkgIElmIHlvdSBjaG9vc2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIlN0YW5kYXJkIiB0aGVuIHBsZWFzZSBtYWtlCi0JICBzdXJlIHRoYXQgdGhlIHNldHRpbmdzIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzIGFuZCB0aGUgSVJRIGFuZCBETUEKLQkgIGNoYW5uZWwgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbWVudXMgYmVsb3cgYXJlIGNvcnJlY3QuIFVzZSB0aGUgbWFudWFsCi0JICBvZiB5b3VyIHRhcGUgZHJpdmUgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHNldHRpbmdzIQotCi0JICBJZiB5b3UgYXJlIGFscmVhZHkgc3VjY2Vzc2Z1bGx5IHVzaW5nIHlvdXIgdGFwZSBkcml2ZSB3aXRoIGFub3RoZXIKLQkgIG9wZXJhdGluZyBzeXN0ZW0gdGhlbiB5b3UgZGVmaW5pdGVseSBzaG91bGQgdXNlIHRoZSBzYW1lIHNldHRpbmdzCi0JICBmb3IgdGhlIElPIGJhc2UsIHRoZSBJUlEgYW5kIERNQSBjaGFubmVsIHRoYXQgaGF2ZSBwcm92ZW4gdG8gd29yawotCSAgd2l0aCB0aGF0IG90aGVyIE9TLgotCi0JICBOb3RlIHRoYXQgdGhpcyBtZW51IGxldHMgeW91IHNwZWNpZnkgb25seSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvcgotCSAgdGhlIGhhcmR3YXJlIHNldHVwLiBUaGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBhdAotCSAgYm9vdCB0aW1lICh3aGVuIGZ0YXBlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgaS5lLiBpZiB5b3UKLQkgIGhhdmUgc2FpZCBZIHRvICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91Ci0JICBoYXZlIHNhaWQgTSB0byAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KLQotCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKLQkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0Ci0JICBib290IG9yIGxvYWQgdGltZS4gSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgZmxvcHB5IHRhcGUgZHJpdmUgb24gYQotCSAgUENJLWJ1cyBiYXNlZCBzeXN0ZW0sIHBsZWFzZSByZWFkIHRoZSBmaWxlCi0JICA8ZmlsZTpkcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDST4uCi0KLWNvbmZpZyBGVF9NQUNIMgotCWJvb2wgIk1BQ0gtMiIKLQotY29uZmlnIEZUX1BST0JFX0ZDMTAKLQlib29sICJGQy0xMC9GQy0yMCIKLQotY29uZmlnIEZUX0FMVF9GREMKLQlib29sICJBbHQvODIwNzgiCi0KLWVuZGNob2ljZQotCi1jb21tZW50ICJDb25zdWx0IHRoZSBtYW51YWxzIG9mIHlvdXIgdGFwZSBkcml2ZSBmb3IgdGhlIGNvcnJlY3Qgc2V0dGluZ3MhIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKLQotY29uZmlnIEZUX0ZEQ19CQVNFCi0JaGV4ICJJTyBiYXNlIG9mIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKLQlkZWZhdWx0ICIwIgotCS0tLWhlbHAtLS0KLQkgIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBpZiB0aGUgZm9sbG93aW5nIGRlZmF1bHQKLQkgIHNldHRpbmdzIGZvciB0aGUgYmFzZSBJTyBhZGRyZXNzIGFyZSBjb3JyZWN0OgotCSAgPDw8IE1BQ0gtMiAgICAgOiAweDFFMCA+Pj4KLQkgIDw8PCBGQy0xMC9GQy0yMDogMHgxODAgPj4+Ci0JICA8PDwgU2Vjb25kYXJ5ICA6IDB4MzcwID4+PgotCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBhIHNlY29uZGFyeSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKLQkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KLQkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcwotCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCi0JICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQotCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KLQkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCi0JICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCi0KLQkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCi0JICB0aGUgSU8gYmFzZS4gVGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm9vdCB0aW1lCi0JICAod2hlbiBmdGFwZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGkuZS4gaWYgeW91IHNwZWNpZmllZCBZIHRvCi0JICAiRmxvcHB5IHRhcGUgZHJpdmUiKSBvciBtb2R1bGUgbG9hZCB0aW1lIChpLmUuIGlmIHlvdSBoYXZlIHNhaWQgTSB0bwotCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCi0KLQkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCi0JICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAotCSAgYm9vdCBvciBsb2FkIHRpbWUuCi0KLWNvbmZpZyBGVF9GRENfSVJRCi0JaW50ICJJUlEgY2hhbm5lbCBvZiB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEZUQVBFICYmICFGVF9TVERfRkRDCi0JZGVmYXVsdCAiMCIKLQktLS1oZWxwLS0tCi0JICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBkZWZhdWx0Ci0JICBzZXR0aW5ncyBmb3IgdGhlIGludGVycnVwdCBjaGFubmVsIGFyZSBjb3JyZWN0OgotCSAgPDw8IE1BQ0gtMiAgICAgOiA2ID4+PgotCSAgPDw8IEZDLTEwL0ZDLTIwOiA5ID4+PgotCSAgPDw8IFNlY29uZGFyeSAgOiA2ID4+PgotCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBzZWNvbmRhcnkgYSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKLQkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KLQkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcwotCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCi0JICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQotCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KLQkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCi0JICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCi0KLQkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCi0JICB0aGUgSVJRIGNoYW5uZWwuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QKLQkgIHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdSBzYWlkIFkgdG8KLQkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IHNhaWQgTSB0bwotCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCi0KLQkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCi0JICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAotCSAgYm9vdCBvciBsb2FkIHRpbWUuCi0KLWNvbmZpZyBGVF9GRENfRE1BCi0JaW50ICJETUEgY2hhbm5lbCBvZiB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEZUQVBFICYmICFGVF9TVERfRkRDCi0JZGVmYXVsdCAiMCIKLQktLS1oZWxwLS0tCi0JICBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBkZWZhdWx0Ci0JICBzZXR0aW5ncyBmb3IgdGhlIERNQSBjaGFubmVsIGFyZSBjb3JyZWN0OgotCSAgPDw8IE1BQ0gtMiAgICAgOiAyID4+PgotCSAgPDw8IEZDLTEwL0ZDLTIwOiAzID4+PgotCSAgPDw8IFNlY29uZGFyeSAgOiAyID4+PgotCSAgU2Vjb25kYXJ5IHJlZmVycyB0byBhIHNlY29uZGFyeSBGREMgY29udHJvbGxlciBsaWtlIHRoZSAiaGlnaCBzcGVlZCIKLQkgIGNvbnRyb2xsZXJzIGRlbGl2ZXJlZCBieSBTZWFnYXRlIG9yIEV4YWJ5dGUgb3IgSW9tZWdhJ3MgRGl0dG8gRGFzaC4KLQkgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2V0dGluZyBmb3IgdGhlIElPIGJhc2UgYWRkcmVzcwotCSAgc3BlY2lmaWVkIGhlcmUgaXMgY29ycmVjdC4gVVNFIFRIRSBNQU5VQUwgT0YgWU9VUiBUQVBFIERSSVZFIE9SCi0JICBDT05UUk9MTEVSIENBUkQgVE8gREVURVJNSU5FIFRIRSBDT1JSRUNUIFNFVFRJTkcuIElmIHlvdSBhcmUgYWxyZWFkeQotCSAgc3VjY2Vzc2Z1bGx5IHVzaW5nIHRoZSB0YXBlIGRyaXZlIHdpdGggYW5vdGhlciBvcGVyYXRpbmcgc3lzdGVtIHRoZW4KLQkgIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIHRoYXQgaGFzCi0JICBwcm92ZW4gdG8gd29yayB3aXRoIHRoYXQgb3RoZXIgT1MuCi0KLQkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCi0JICB0aGUgRE1BIGNoYW5uZWwuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QKLQkgIHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdSBzYWlkIFkgdG8KLQkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IHNhaWQgTSB0bwotCSAgIkZsb3BweSB0YXBlIGRyaXZlIikuCi0KLQkgIFBsZWFzZSByZWFkIGFsc28gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IHdoaWNoCi0JICBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBhdAotCSAgYm9vdCBvciBsb2FkIHRpbWUuCi0KLWNvbmZpZyBGVF9GRENfVEhSCi0JaW50ICJEZWZhdWx0IEZJRk8gdGhyZXNob2xkIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCAiOCIKLQloZWxwCi0JICBTZXQgdGhlIEZJRk8gdGhyZXNob2xkIG9mIHRoZSBGREMuIElmIHRoaXMgaXMgaGlnaGVyIHRoZSBETUEKLQkgIGNvbnRyb2xsZXIgbWF5IHNlcnZlIHRoZSBGREMgYWZ0ZXIgYSBoaWdoZXIgbGF0ZW5jeSB0aW1lLiBJZiB0aGlzIGlzCi0JICBsb3dlciwgZmV3ZXIgRE1BIHRyYW5zZmVycyBvY2N1ciBsZWFkaW5nIHRvIGxlc3MgYnVzIGNvbnRlbnRpb24uCi0JICBZb3UgbWF5IHRyeSB0byB0dW5lIHRoaXMgaWYgZnRhcGUgYW5ub3lzIHlvdSB3aXRoICJyZWR1Y2VkIGRhdGEKLQkgIHJhdGUgYmVjYXVzZSBvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIG1lc3NhZ2VzLiBIb3dldmVyLCB0aGlzCi0JICBkb2Vzbid0IHNlZW0gdG8gaGF2ZSB0b28gbXVjaCBlZmZlY3QuCi0KLQkgIElmIHVuc3VyZSwgZG9uJ3QgdG91Y2ggdGhlIGluaXRpYWwgdmFsdWUsIGkuZS4gbGVhdmUgaXQgYXQgIjgiLgotCi1jb25maWcgRlRfRkRDX01BWF9SQVRFCi0JaW50ICJNYXhpbWFsIGRhdGEgcmF0ZSB0byB1c2UgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0ICIyMDAwIgotCS0tLWhlbHAtLS0KLQkgIFdpdGggc29tZSBtb3RoZXJib2FyZC9GREMgY29tYmluYXRpb25zIGZ0YXBlIHdpbGwgbm90IGJlIGFibGUgdG8KLQkgIHJ1biB5b3VyIEZEQy90YXBlIGRyaXZlIGNvbWJpbmF0aW9uIGF0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZQotCSAgc3BlZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgeW91J2xsIGVuY291bnRlciAicmVkdWNlZCBkYXRhIHJhdGUKLQkgIGJlY2F1c2Ugb2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIiBtZXNzYWdlcyBhbmQgbG90cyBvZiByZXRyaWVzCi0JICBiZWZvcmUgZnRhcGUgZmluYWxseSBkZWNpZGVzIHRvIHJlZHVjZSB0aGUgZGF0YSByYXRlLgotCi0JICBJbiB0aGlzIGNhc2UgaXQgbWlnaHQgYmUgZGVzaXJhYmxlIHRvIHRlbGwgZnRhcGUgYmVmb3JlaGFuZCB0aGF0Ci0JICBpdCBuZWVkIG5vdCB0cnkgdG8gcnVuIHRoZSB0YXBlIGRyaXZlIGF0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZQotCSAgc3BlZWQuIElmIHVuc3VyZSwgbGVhdmUgdGhpcyBkaXNhYmxlZCwgaS5lLiBsZWF2ZSBpdCBhdCAyMDAwCi0JICBiaXRzL3NlYy4KLQotY29uZmlnIEZUX0FMUEhBX0NMT0NLCi0JaW50ICJDUFUgY2xvY2sgZnJlcXVlbmN5IG9mIHlvdXIgREVDIEFscGhhIiBpZiBBTFBIQQotCWRlcGVuZHMgb24gRlRBUEUKLQlkZWZhdWx0ICIwIgotCWhlbHAKLQkgIE9uIHNvbWUgREVDIEFscGhhIG1hY2hpbmVzIHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGNhbm5vdCBiZQotCSAgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LCBzbyB5b3UgbmVlZCB0byBzcGVjaWZ5IGl0IGhlcmUgT05MWSBpZgotCSAgcnVubmluZyBhIERFQyBBbHBoYSwgb3RoZXJ3aXNlIHRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0LgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjdkMmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIwotIyAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMgSGVpbmUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSMKLSMgJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL01ha2VmaWxlLHYgJAotIyAkUmV2aXNpb246IDEuNCAkCi0jICREYXRlOiAxOTk3LzEwLzA1IDE5OjE3OjU2ICQKLSMKLSMgICAgICBNYWtlZmlsZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvcgotIyAgICAgIExpbnV4LgotIwotCi1vYmotJChDT05GSUdfRlRBUEUpCQkrPSBsb3dsZXZlbC8KLW9iai0kKENPTkZJR19aRlRBUEUpCQkrPSB6ZnRhcGUvCi1vYmotJChDT05GSUdfWkZUX0NPTVBSRVNTT1IpCSs9IGNvbXByZXNzb3IvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDSSBiL2RyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGRlMTU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotU29tZSBub3RlcyBmb3IgZnRhcGUgdXNlcnMgd2l0aCBQQ0kgbW90aGVyYm9hcmRzOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgcHJvYmxlbToKLS0tLS0tLS0tLS0tLQotCi1UaGVyZSBoYXZlIGJlZW4gc29tZSBwcm9ibGVtIHJlcG9ydHMgZnJvbSBwZW9wbGUgdXNpbmcgUENJLWJ1cyBiYXNlZAotc3lzdGVtcyBnZXR0aW5nIG92ZXJydW4gZXJyb3JzLgotSSB3YXNuJ3QgYWJsZSB0byByZXByb2R1Y2UgdGhlc2UgdW50aWwgSSByYW4gZnRhcGUgb24gYSBJbnRlbCBQbGF0bwotKFByZW1pZXJlIFBDSSBJSSkgbW90aGVyYm9hcmQgd2l0aCBiaW9zIHZlcnNpb24gMS4wMC4wOEFYMS4KLUl0IHR1cm5lZCBvdXQgdGhhdCBpZiBHQVQgKEd1YXJhbnRlZWQgQWNjZXNzIFRpbWluZykgaXMgZW5hYmxlZCAoPykKLWZ0YXBlIGdldHMgYSBsb3Qgb2Ygb3ZlcnJ1biBlcnJvcnMuCi1UaGUgcHJvYmxlbSBkaXNhcHBlYXJzIHdoZW4gZGlzYWJsaW5nIEdBVCBpbiB0aGUgYmlvcy4KLU5vdGUgdGhhdCBJbnRlbCByZW1vdmVkIHRoaXMgc2V0dGluZyAocGVybWFuZW50bHkgZGlzYWJsZWQpIGZyb20gdGhlCi0xLjAwLjEwQVgxIGJpb3MgIQotCi1JdCBsb29rcyBsaWtlIHRoYXQgaWYgR0FUIGlzIGVuYWJsZWQgdGhlcmUgYXJlIG9mdGVuIGxhcmdlIHBlcmlvZHMKLShncmVhdGVyIHRoYW4gMTIwIHVzICE/Pykgb24gdGhlIElTQSBidXMgdGhhdCB0aGUgRE1BIGNvbnRyb2xsZXIgY2Fubm90Ci1zZXJ2aWNlIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyLgotSSBjYW5ub3QgaW1hZ2luZSB0aGlzIGJlaW5nIGFjY2VwdGFibGUgaW4gYSBkZWNlbnQgUENJIGltcGxlbWVudGF0aW9uLgotTWF5YmUgdGhpcyBpcyBhIGBmZWF0dXJlJyBvZiB0aGUgY2hpcHNldC4gSSBjYW4gb25seSBzcGVjdWxhdGUgd2h5Ci1JbnRlbCBjaG9vc2UgdG8gcmVtb3ZlIHRoZSBvcHRpb24gZnJvbSB0aGUgbGF0ZXN0IEJpb3MuLi4KLQotVGhlIGxlc3NvbiBvZiB0aGlzIGFsbCBpcyB0aGF0IHRoZXJlIG1heSBiZSBvdGhlciBtb3RoZXJib2FyZAotaW1wbGVtZW50YXRpb25zIGhhdmluZyB0aGUgc2FtZSBvZiBzaW1pbGFyIHByb2JsZW1zLgotSWYgeW91IGV4cGVyaWVuY2UgYSBsb3Qgb2Ygb3ZlcnJ1biBlcnJvcnMgZHVyaW5nIGEgYmFja3VwIHRvIHRhcGUsCi1zZWUgaWYgdGhlcmUgaXMgc29tZSBzZXR0aW5nIGluIHRoZSBCaW9zIHRoYXQgbWF5IGluZmx1ZW5jZSB0aGUKLWJ1cyB0aW1pbmcuCi0KLUkganVkZ2UgdGhpcyBhIGhhcmR3YXJlIHByb2JsZW0gYW5kIG5vdCBhIGxpbWl0YXRpb24gb2YgZnRhcGUgOy0pCi1NeSBET1MgYmFja3VwIHNvZnR3YXJlIHNlZW1zIHRvIGJlIHN1ZmZlcmluZyBmcm9tIHRoZSBzYW1lIHByb2JsZW1zCi1hbmQgZXZlbiByZWZ1c2VzIHRvIHJ1biBhdCAxIE1icHMgIQotRnRhcGUgd2lsbCByZWR1Y2UgdGhlIGRhdGEtcmF0ZSBmcm9tIDEgTWJwcyB0byA1MDAgS2JwcyBpZiB0aGUgbnVtYmVyCi1vZiBvdmVycnVuIGVycm9ycyBvbiBhIHRyYWNrIGV4Y2VlZHMgYSB0aHJlc2hvbGQuCi0KLQotUG9zc2libGUgc29sdXRpb25zOgotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Tb21lIG9mIHRoZSBwcm9ibGVtcyB3ZXJlIHNvbHZlZCBieSB1cGdyYWRpbmcgdGhlIChmbGFzaCkgYmlvcy4KLU90aGVyIHN1Z2dlc3QgdGhhdCBpdCBoYXMgdG8gZG8gd2l0aCB0aGUgRkRDIGJlaW5nIG9uIHRoZSBQQ0kKLWJ1cywgYnV0IHRoYXQgaXMgbm90IHRoZSBjYXNlIHdpdGggdGhlIEludGVsIFByZW1pZXJlIElJIGJvYXJkcy4KLVtJZiB1cGdyYWRpbmcgdGhlIGJpb3MgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbSB5b3UgY291bGQgdHJ5Ci1hIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIgb24gdGhlIGlzYS1idXNdLgotCi1IZXJlIGlzIGEgbGlzdCBvZiBzeXN0ZW1zIGFuZCByZWNvbW1lbmRlZCBCSU9TIHNldHRpbmdzOgotCi0KLSAgICAgICAgSW50ZWwgUHJlbWllcmUgUENJIChSZXZlbmdlKToKLQotQmlvcyB2ZXJzaW9uIDEuMDAuMDkuQUYyIGlzIHJlcG9ydGVkIHRvIHdvcmsuCi0KLQotCi0gICAgICAgIEludGVsIFByZW1pZXJlIFBDSSBJSSAoUGxhdG8pOgotCi1CaW9zIHZlcnNpb24gMS4wMC4xMC5BWDEgYW5kIHZlcnNpb24gMTEgYmV0YSBhcmUgb2suCi1JZiB1c2luZyB2ZXJzaW9uIDEuMDAuMDguQVgxLCBHQVQgbXVzdCBiZSBkaXNhYmxlZCAhCi0KLQotCi0gICAgICAgIEFTVVMgUENJL0ktU1AzRzoKLQotUHJlZmVycmVkIHNldHRpbmdzOiAgICAgSVNBLUdBVC1tb2RlIDogZGlzYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIERNQS1saW5lYnVmZmVyLW1vZGUgOiBzdGFuZGFyZAotICAgICAgICAgICAgICAgICAgICAgICAgSVNBLW1hc3RlcmJ1ZmZlci1tb2RlIDogc3RhbmRhcmQKLQotCi0gICAgICAgIERFTEwgRGltZW5zaW9uIFhQUyBQOTAKLQotQmlvcyB2ZXJzaW9uIEEyIGlzIHJlcG9ydGVkIHRvIGJlIGJyb2tlbiwgd2hpbGUgYmlvcyB2ZXJzaW9uIEE1IHdvcmtzLgotWW91IGNhbiBnZXQgYSBmbGFzaCBiaW9zIHVwZ3JhZGUgZnJvbSBodHRwOi8vd3d3LmRlbGwuY29tCi0KLQotVG8gc2VlIGlmIHlvdSdyZSBoYXZpbmcgdGhlIEdBVCBwcm9ibGVtLCB0cnkgbWFraW5nIGEgYmFja3VwCi11bmRlciBET1MuIElmIGl0J3MgdmVyeSBzbG93IGFuZCBvZnRlbiByZXBvc2l0aW9ucyB5b3UncmUKLXByb2JhYmx5IGhhdmluZyB0aGlzIHByb2JsZW0uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0tLy8tLQotIExvY2FsV29yZHM6ICBmdGFwZSBQQ0kgYmlvcyBHQVQgSVNBIERNQSBjaGlwc2V0IE1icHMgS2JwcyBGREMgaXNhIEFGIG9rIEFTVVMKLSBMb2NhbFdvcmRzOiAgU1AgbGluZWJ1ZmZlciBtYXN0ZXJidWZmZXIgWFBTIGh0dHAgd3d3IGNvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL1JFTEVBU0UtTk9URVMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvUkVMRUFTRS1OT1RFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3OTlkYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvUkVMRUFTRS1OT1RFUworKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi1IZXksIEVtYWNzLCB3ZSdyZSAtKi1UZXh0LSotIG1vZGUhCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRkIDI1LzExLzk3ID09PT09Ci0tIFRoZSBjb3JyZWN0IHByZS1wcm9jZXNzb3Igc3RhdGVtZW50IGZvciAiZWxzZSBpZiIgaXMgIiNlbGlmIiBub3QKLSAgImVsc2lmIi4KLS0gTmVlZCB0byBjYWxsIHpmdF9yZXNldF9wb3NpdGlvbigpIHdoZW4gb3ZlcndyaXRpbmcgY2FydHJpZGdlcwotICBwcmV2aW91c2x5IHdyaXR0ZW4gd2l0aCBmdGFwZS0yLngsIHNmdGFwZSwgb3IgYW5jaWVudAotICAocHJlLWZ0YXBlLTMueCkgdmVyc2lvbnMgb2YgemZ0YXBlLgotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjA0YyAxNi8xMS85NyA9PT09PQotLSBmZGNfcHJvYmUoKSB3YXMgY2FsbGluZyBEVU1QUkVHUyB3aXRoIGEgcmVzdWx0IGxlbmd0aCBvZiAiMSIgd2hpY2gKLSAgd2FzIGp1c3QgZmluZS4gVW5kbyBwcmV2aW91cyBjaGFuZ2UuCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRiIDE0LzExLzk3ID09PT09Ci0KLS0gcGF0Y2hlcy8yLngueC9mbG9wcHkuYy5kaWZmIHdhcyBzb21ld2hhdCBicm9rZW4sIHJlbGVhc2luZyBpL28KLSAgcmVnaW9ucyBpdCBuZXZlciBoYWQgYWxsb2NhdGVkLgotLSBmZGNfcHJvYmUoKSB3YXMgY2FsbGluZyBEVU1QUkVHUyB3aXRoIGEgcmVzdWx0IGxlbmd0aCBvZiAiMSIgaW5zdGVhZAotICBvZiAiMTAiCi0tIFdyaXRpbmcgZGVsZXRlZCBkYXRhIG1hcmtzIGlmIHRoZSBmaXJzdCBzZWdlbnRzIG9uIHRyYWNrIHplcm8gYXJlCi0gIHNob3VsZCB3b3JrIG5vdy4KLS0gZnRmb3JtYXQgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgdGFwZQotICBkcml2ZSBzZXRzIHRoZSByZWFkIG9ubHkgc3RhdHVzIGJpdCAoUUlDLTQwLzgwIGNhcnRyaWRnZXMgd2l0aAotICBRSUMtMzAxMC8zMDIwIHRhcGUgZHJpdmVzKSBiZWNhdXNlIHRoZSBoZWFkZXIgc2VnbWVudCBpcyBkYW1hZ2VkLgotLSB0aGUgTVRJT0NGVENNRCBpb2N0bCBtYXkgbm93IGJlIGlzc3VlZCBieSB0aGUgc3VwZXJ1c2VyIE9OTFkuCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRhIDEyLzExLzk3ID09PT09Ci0tIEZpeCBhbiAiaW5maW5pdGUgbG9vcCBjYW4ndCBiZSBraWxsZWQgYnkgc2lnbmFsIiBidWcgaW4KLSAgZnRhcGVfZ2V0X2RyaXZlX3N0YXR1cygpLiBPbmx5IHJlbGV2YW50IHdoZW4gdHJ5aW5nIHRvIGFjY2VzcwotICBidWdneS9taXNjb25maWd1cmVkIGhhcmR3YXJlCi0tIFRyeSB0byBjb21wZW5zYXRlIGEgYnVnIGluIHRoZSBIUCBDb2xvcmFkbyBUMzAwMCdzIGZpcm13YXJlOiBpdAotICBkb2Vzbid0IHNldCB0aGUgd3JpdGUgcHJvdGVjdCBiaXQgZm9yIFFJQzgwL1FJQzQwIGNhcnRyaWRnZXMuCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDQgMDYvMTEvOTcgPT09PT0KLS0gSWYgcG9zaXRpb25pbmcgd2l0aCBmYXN0IHNlZWtpbmcgZmFpbHMgZmFsbCBiYWNrIHRvIGEgc2xvdyBzZWVrCi0gIGJlZm9yZSBnaXZpbmcgdXAuCi0tIChuZWFybHkpIG5vIHJldHJpZXMgb24gIm5vIGRhdGEgZXJyb3JzIiB3aGVuIHZlcmlmeWluZyBhZnRlcgotICBmb3JtYXR0aW5nLiBJbXByb3ZlZCB0dW5pbmcgb2YgdGhlIGJhZCBzZWN0b3IgbWFwIGFmdGVyIGZvcm1hdHRpbmcuCi0tIHRoZSBkaXJlY3RvcnkgbGF5b3V0IGhhcyBjaGFuZ2VkIGFnYWluIHRvIGFsbG93IGZvciBlYXNpZXIga2VybmVsCi0gIGludGVncmF0aW9uCi0tIE1vZHVsZSBwYXJhbWV0ZXIgImZ0YXBlX3RyYWNpbmciIG5vdyBpcyBjYWxsZWQgImZ0X3RyYWNpbmciIGJlY2F1c2UKLSAgdGhlICJmdGFwZV90cmFjaW5nIiB2YXJpYWJsZSBoYXMgdGhlIHZlcnNpb24gY2hlY2tzdW0gYXR0YWNoZWQgdG8gaXQuCi0tIGAvcHJvYy9mdGFwZScgaW50ZXJmYWNlIGZvciAyLjAuKiBrZXJuZWxzLiBgL3Byb2MvZnRhcGUnIG5vIGxvbmdlcgotICBpcyBhIGRpcmVjdG9yeSBidXQgYSBmaWxlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBmb3JtZXJseQotICBwcm92aWRlZCBpbiBzZXBhcmF0ZSBmaWxlcyB1bmRlciB0aGUgYC9wcm9jL2Z0YXBlLycgZGlyZWN0b3J5LgotLSBNb3N0IG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaGF2ZSBiZWVuIHByZWZpeGVkIGJ5ICJDT05GSUdfRlRfIgotICBpbiBwcmVwYXJhdGlvbiBvZiB0aGUga2VybmVsIGluY2x1c2lvbi4gVGhlIE1ha2VmaWxlcyB1bmRlcgotICAiLi9mdGFwZS8iIHNob3VsZCBiZSBkaXJlY3RseSB1c2FibGUgYnkgdGhlIGtlcm5lbC4KLS0gVGhlIE1PRFZFUlNJT05TIHN0dWZmIGlzIG5vdyBhdXRvLWRldGVjdGVkLgotLSBCcm9rZSBiYWNrc2xhc2hlZCBtdWx0aSBsaW5lIG9wdGlvbnMgaW4gTUNPTkZJRyBpbnRvIHNlcGFyYXRlIGxpbmVzCi0gIHVzaW5nIEdOVS1tYWtlJ3MgIis9IiBmZWF0dXJlLgotLSBUaGUgaHRtbCBhbmQgZHZpIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBpcyBub3cgaW5zdGFsbGVkIHVuZGVyCi0gICcvdXNyL2RvYy9mdGFwZWAgd2l0aCAnbWFrZSBpbnN0YWxsYAotLSBOZXcgU01QIGRlZmluZSBpbiBNQ09ORklHLiBmdGFwZSB3b3JrcyB3aXRoIFNNUCBpZiB0aGlzIGlzIGRlZmluZWQuCi0tIGF0dGVtcHQgdG8gY29wZSB3aXRoICJleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIGJ5IGdyYWR1YWxseQotICBpbmNyZWFzaW5nIEZEQyBGSUZPIHRocmVzaG9sZC4gQnV0IHRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgdG9vCi0gIG11Y2ggYW4gZWZmZWN0LgotLSBOZXcgbG9hZCB0aW1lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICJmdF9mZGNfcmF0ZV9saW1pdCIuIElmIHlvdQotICBlbmNvdW50ZXIgdG9vIG1hbnkgb3ZlcnJ1biBlcnJvcnMgd2l0aCBhIDJNYiBjb250cm9sbGVyIHRoZW4geW91Ci0gIG1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgdG8gMTAwMC4KLS0gb3ZlcnJ1biBlcnJvcnMgb24gdGhlIGxhc3Qgc2VjdG9yIGluIGEgc2VnbWVudCBzb21ldGltZXMgcmVzdWx0IGluCi0gIGEgemVybyBETUEgcmVzaWR1ZS4gRHVubm8gd2h5LCBidXQgY29tcGVuc2F0ZSBmb3IgaXQuCi0tIHRoZXJlIHdlcmUgc3RpbGwgZmRjX3JlYWQoKSB0aW1lb3V0IGVycm9ycy4gSSB0aGluayBJIGhhdmUgZml4ZWQgaXQKLSAgbm93LCBwbGVhc2UgRklYTUUuCi0tIFNvbWV0aW1lcyBmdGFwZV93cml0ZSgpIGZhaWxlZCB0byByZS1zdGFydCB0aGUgdGFwZSBkcml2ZSB3aGVuIGEKLSAgc2VnbWVudCB3aXRob3V0IGEgZ29vZCBzZWN0b3Igd2FzIHJlYWNoZWQgKCJ3YWl0IGZvciBlbXB0eSBzZWdtZW50Ci0gIGZhaWxlZCIpLiBUaGlzIGlzIGZpeGVkLiBFc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgPiBRSUMtMzAxMC4KLS0gc2Z0YXBlIChha2EgZnRhcGUtMi54KSBoYXMgdmFuaXNoZWQuIEkgZGlkbid0IHdvcmsgb24gaXQgZm9yCi0gIGFnZXMuIEl0IGlzIHByb2JhYmx5IHN0aWxsIHBvc3NpYmxlIHRvIHVzZSB0aGUgb2xkIGNvZGUgd2l0aAotICBmdGFwZS0zLjA0LCBpZiBvbmUgcmVhbGx5IG5lZWRzIGl0IChCVVQgUkVDT01QSUxFIElUKQotLSB6ZnRhcGUgbm8gbG9uZ2VyIGFsdGVycyB0aGUgY29udGVudHMgb2YgYWxyZWFkeSBleGlzdGluZyB2b2x1bWUKLSAgdGFibGUgZW50cmllcywgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gZmlsbCBpbiBtaXNzaW5nIGZpZWxkcywKLSAgbGlrZSB0aW1lIHN0YW1wcyB1c2luZyBzb21lIHVzZXIgc3BhY2UgcHJvZ3JhbS4KLS0gLi9jb250cmliL3Z0YmxjLyBjb250YWlucyBzdWNoIGEgcHJvZ3JhbS4KLS0gbmV3IHBlcmwgc2NyaXB0IC4vY29udHJpYi9zY3JpcHRzL2xpc3R0YXBlIHRoYXQgbGlzdCB0aGUgY29udGVudHMgb2YgYQotICBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2UgcGFyc2luZyB0aGUgb3V0cHV0IG9mICJtdCB2b2xpbmZvIiArICJtdCBmc2YiCi0tIHRoZSBNVFdFT0YgaW1wbGVtZW50YXRpb24gaGFzIGNoYW5nZWQgYSBsaXR0bGUgYml0IChhZnRlciBJIGhhZCBhCi0gIGxvb2sgYXQgYW1hbmRhKS4gQ2FsbGluZyBNVFdFT0Ygd2hpbGUgdGhlIHRhcGUgaXMgc3RpbGwgaGVsZCBvcGVuCi0gIGFmdGVyIHdyaXRpbmcgc29tZXRoaW5nIHRvIHRoZSB0YXBlIG5vdyB3aWxsIHRlcm1pbmF0ZSB0aGUgY3VycmVudAotICB2b2x1bWUsIGFuZCBzdGFydCBhIG5ldyBvbmUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0tIHRoZSB2b2x1bWUgdGFibGUgbWFpbnRhaW5lZCBieSB6ZnRhcGUgbm93IGlzIGEgZG91Ymx5IGxpbmtlZCBsaXN0Ci0gIHRoYXQgZ3Jvd3MgZHluYW1pY2FsbHkgYXMgbmVlZGVkLgotCi0gIGZvcm1hdHRpbmcgZmxvcHB5IHRhcGUgY2FydHJpZGdlcwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgKiB0aGVyZSBpcyBhIG5ldyB1c2VyIHNwYWNlIGZvcm1hdHRpbmcgcHJvZ3JhbSB0aGF0IGRvZXMgbW9zdCBvZiB0aGUKLSAgICBkaXJ0eSB3b3JrIGluIHVzZXIgc3BhY2UgKGF1dG8tZGV0ZWN0LCBjb21wdXRpbmcgdGhlIHNlY3RvcgotICAgIGNvb3JkaW5hdGVzLCBhZGp1c3RpbmcgdGltZSBzdGFtcHMgYW5kIHN0YXRpc3RpY3MpLiBJdCBoYXMgYQotICAgIHNpbXBsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotICAqIGZ0YXBlLWZvcm1hdC5vIGhhcyB2YW5pc2hlZCwgaXQgaGFzIGJlZW4gZm9sZGVkIGludG8gdGhlIGxvdyBsZXZlbAotICAgIGZ0YXBlLm8gbW9kdWxlLCBhbmQgdGhlIGlvY3RsIGludGVyZmFjZSBpbnRvIHpmdGFwZS5vLiBNb3N0IG9mIHRoZQotICAgIGNvbXBsaWNhdGVkIHN0dWZmIGhhcyBiZWVuIG1vdmVkIHRvIHVzZXIgc3BhY2UsIHNvIHRoZXJlIHdhcyBubwotICAgIG5lZWQgZm9yIGEgc2VwYXJhdGUgbW9kdWxlIGFueW1vcmUuCi0gICogdGhlcmUgaXMgYSBuZXcgaW9jdGwgTVRJT0NGVENNRCB0aGF0IHNlbmRzIGEgYmFyZSBRSUMtMTE3IGNvbW1hbmQKLSAgICB0byB0aGUgdGFwZSBkcml2ZS4KLSAgKiB0aGVyZSBpcyBhIG5ldyBtbWFwKCkgZmVhdHVyZSB0byBtYXAgdGhlIGRtYSBidWZmZXJzIGludG8gdXNlcgotICAgIHNwYWNlIHRvIGJlIHVzZWQgYnkgdGhlIHVzZXIgbGV2ZWwgZm9ybWF0dGluZyBwcm9ncmFtLgotICAqIEZvcm1hdHRpbmcgb2YgeWV0IHVuZm9ybWF0dGVkIG9yIHRvdGFsbHkgZGVnYXVzc2VkIGNhcnRyaWRnZXMKLSAgICBzaG91bGQgYmUgcG9zc2libGUgbm93LiBGSVhNRS4KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wM2IsIDxmb3Jnb3QgdGhlIGV4YWN0IGRhdGU+ID09PT0KLQotZnRhcGUtMy4wM2Igd2FzIHJlbGVhc2VkIGFzIGEgYmV0YSByZWxlYXNlIG9ubHkuIEl0cyBtYWluIG5ldyBmZWF0dXJlCi13YXMgc3VwcG9ydCBvZiB0aGUgRElUVE8tMkdCIGRyaXZlLiBUaGlzIHdhcyBtYWRlIHBvc3NpYmxlIGJ5IHJldmVyc2UKLWVuZ2luZWVyaW5nIGRvbmUgYnkgPGZpbGwgaW4gaGlzIG5hbWU+IGFmdGVyIElvbWVnYSBmYWlsZWQgdG8gc3VwcG9ydAotZnRhcGUuIEFsdGhvdWdoIHRoZXkgaGFkIHByb21pc2VkIHRvIGRvIHNvICh0aGlzIG1ha2VzIG1lIGZlZWwgYSBiaXQKLXNhZCBhbmQgdW5jb21mb3J0YWJsZSBhYm91dCBJb21lZ2EpLgotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzYSwgMjIvMDUvOTcgPT09PQotCi0tIEZpbmFsbHkgZml4ZWQgYXV0by11bi1sb2FkaW5nIG9mIG1vZHVsZXMgZm9yIGtlcm5lbHMgPiAyLjEuMTgKLS0gQWRkIGFuICJ1bmluc3RhbGwiIHRhcmdldCB0byB0aGUgTWFrZWZpbGUKLS0gcmVtb3ZlZCB0aGUga2R0aW1lIGhhY2sKLS0gdGV4aTJ3d3cgZGlkbid0IHByb3Blcmx5IHNldCB0aGUgYmFjay1yZWZlcmVuY2UgZnJvbSBhIGZvb3Rub3RlIGJhY2sKLSAgdG8gdGhlIHJlZ3VsYXIgdGV4dC4KLQotICB6ZnRhcGUgc3BlY2lmaWMKLSAgLS0tLS0tLS0tLS0tLS0tCi0gICogaGlkZSB0aGUgb2xkIGNvbXByZXNzaW9uIG1hcCB2b2x1bWUuIFRhcGVyIGRvZXNuJ3QgYWNjZXB0IHRoZQotICAgIHByZXNlbmNlIG9mIG5vbi1UYXBlciB2b2x1bWVzIGFuZCBUYXBlci13cml0dGVuIHZvbHVtZSBvbiB0aGUgc2FtZQotICAgIHRhcGUuCi0gICogRU9EIChFbmQgT2YgRGF0YSkgaGFuZGxpbmcgd2FzIHN0aWxsIGJyb2tlbjogdGhlIGV4cGVjdGVkIGJlaGF2aW9yCi0gICAgaXMgdG8gcmV0dXJuIGEgemVybyBieXRlIGNvdW50IGF0IHRoZSBmaXJzdCBhdHRlbXB0IHRvIHJlYWQgcGFzdAotICAgIEVPRCwgcmV0dXJuIGEgemVybyBieXRlIGNvdW50IGF0IHRoZSBzZWNvbmQgYXR0ZW1wdCB0byByZWFkIHBhc3QKLSAgICBFT0QgYW5kIFRIRU4gcmV0dXJuIC1FSU8uCi0gIAotICBmdGFwZS1mb3JtYXQgc3BlY2lmaWMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICogRGV0ZWN0aW9uIG9mIFFJQy00MCBjYXJ0cmlkZ2VzIGluIHNlbGVjdF90YXBlX2Zvcm1hdCgpIHdhcyBicm9rZW4KLSAgICBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIGZvcm1hdCBRSUMtMzAxMC8zMDIwIGNhcnRyaWRnZXMuCi0gICogVGhlcmUgYXJlIHN0cmFuZ2UgIlRSLTEgRXh0cmEiIGNhcnRyaWRnZXMgb3V0IHRoZXJlIHdoaWNoIHdlcmVuJ3QKLSAgICBkZXRlY3RlZCBwcm9wZXJseSBiZWNhdXNlIHRoZSBkb24ndCBzdHJpY3RseSBjb25mb3JtIHRvIHRoZQotICAgIFFJQy04MCwgUmV2LiBOLCBzcGVjLgotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzLCAzMC8wNC85NyA9PT09PQotCi0tIFJlbW92ZWQga2VybmVsIGludGVncmF0aW9uIGNvZGUgZnJvbSB0aGUgcGFja2FnZS4gSSBwbGFuIHRvIHByb3ZpZGUKLSAgYSBwYWNrYWdlIHRoYXQgY2FuIGJlIGludGVncmF0ZWQgaW50byB0aGUgc3RvY2sga2VybmVsIHNlcGFyYXRlbHkKLSAgKGhvcGVmdWxseSBzb29uKS4KLSAgQXMgYSByZXN1bHQsIGEgc2ltcGxlIGBtYWtlJyBjb21tYW5kIG5vdyB3aWxsIGJ1aWxkIGV2ZXJ5dGhpbmcuCi0tIEFMTCBjb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZmlsZQotICBgTUNPTkZJRycuCi0tIFF1aXRlIGEgZmV3IGBsb3cgbGV2ZWwnIGNoYW5nZXMgdG8gYWxsb3cgZm9ybWF0dGluZyBvZiBjYXJ0cmlkZ2VzLgotLSBmb3JtYXR0aW5nIGlzIGltcGxlbWVudGVkIGFzIGEgc2VwYXJhdGUgbW9kdWxlIGBmdGFwZS1mb3JtYXQubycuIFRoZQotICBtb2RpZmllZCBgbXQnIHByb2dyYW0gY29udGFpbnMgc2FtcGxlIGNvZGUgdGhhdCBzaG93cyBob3cgdG8gdXNlIGl0LgotLSBUaGUgVkZTIGludGVyZmFjZSBoYXMgYmVlbiBtb3ZlZCBmcm9tIHRoZSBgZnRhcGUubycgbW9kdWxlIHRvIHRoZQotICBoaWdoIGxldmVsIG1vZHVsZXMgYHpmdGFwZS5vJyByZXNwLiBgc2Z0YXBlLm8nLiBgZnRhcGUubycgY29udGFpbnMKLSAgdGhlIGhhcmR3YXJlIHN1cHBvcnQgb25seS4KLS0gQSBiaXQgb2YgL3Byb2Mgc3VwcG9ydCBmb3Iga2VybmVscyA+IDIuMS4yOAotLSBNb3ZlZCBkb2N1bWVudGF0aW9uIHRvIERvYyBzdWJkaXIuIElOU1RBTEwgbm93IGNvbnRhaW5zIHNvbWUgcmVhbAotICBpbnN0YWxsYXRpb24gbm90ZXMuCi0tIGBpbnN0YWxsJyB0YXJnZXQgaW4gTWFrZWZpbGUuCi0KLXpmdGFwZSBzcGVjaWZpYzoKLS0tLS0tLS0tLS0tLS0tLS0KLQotLSB6ZnRhcGUgd29ya3MgZm9yIGxhcmdlIGNhcnRyaWRnZXMgbm93ICggPiAyXjMxIGJ5dGVzKQotLSBNVElPQ1ZPTElORk8gYW5kIE1USU9DR0VUU0laRSBub3cgcmV0dXJuIHRoZSBzaXplIGluIEtJTE9CWVRFUywKLSAgTk8gTE9OR0VSIGluIGJ5dGVzLgotCi0tIHBlcm1pc3Npb25zIGZvciB3cml0ZSBhY2Nlc3MgdG8gYSBjYXJ0cmlkZ2UgaGF2ZSBjaGFuZ2VkOgotICAqIHpmdGFwZSBub3cgYWxzbyB0YWtlcyB0aGUgZmlsZSBhY2Nlc3MgbW9kZSBpbnRvIGFjY291bnQKLSAgKiB6ZnRhcGUgbm8gbG9uZ2VyIGFsbG93cyB3cml0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJlY29yZGVkCi0gICAgbWVkaWEuIFRoZSB0YXBlIGhhcyB0byBiZSBwb3NpdGlvbmVkIGF0IEJPVCBvciBFT0QgZm9yIHdyaXRlCi0gICAgYWNjZXNzLgotCi0tIE1UQlNGIGhhcyBjaGFuZ2VkLiBJdCB1c2VkIHRvIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gIHByZXZpb3VzIGZpbGUgd2hlbiBjYWxsZWQgd2l0aCBjb3VudCAxLiBUaGlzIHdhcyBkaWZmZXJlbnQgZnJvbSB0aGUKLSAgZXhwZWN0ZWQgYmVoYXZpb3IgZm9yIG90aGVyIFVuKnggdGFwZSBkcml2ZXJzIChpLmUuIFNDU0kpLiBNVEJTRgotICB3aXRoIGNvdW50IDEgc2hvdWxkIG1lcmVseSBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50Ci0gIHZvbHVtZS4gRml4ZWQuIEFzIGEgcmVzdWx0LCBgdGFyIC0tdmVyaWZ5JyBub3cgcHJvZHVjZXMgdGhlIGRlc2lyZWQKLSAgcmVzdWx0OiBpdCB2ZXJpZmllcyB0aGUgbGFzdCB3cml0dGVuIHZvbHVtZSwgbm90IHRoZSBwcmUtbGFzdAotICB3cml0dGVuIHZvbHVtZS4KLQotLSBUaGUgY29tcHJlc3Npb24gbWFwIGhhcyB2YW5pc2hlZCAtLT4gbm8gbmVlZCBmb3IgYG10IGVyYXNlJyBhbnkKLSAgbW9yZS4gRmFzdCBzZWVraW5nIGluIGEgY29tcHJlc3NlZCB2b2x1bWUgaXMgc3RpbGwgYmUgcG9zc2libGUsIGJ1dAotICB0YWtlcyBzbGlnaHRseSBsb25nZXIuIEFzIGEgc2lkZSBlZmZlY3QsIHlvdSBtYXkgZXhwZXJpZW5jZSBhbgotICBhZGRpdGlvbmFsIHZvbHVtZSBzaG93aW5nIHVwIGluIGZyb250IG9mIGFsbCBvdGhlcnMgZm9yIG9sZAotICBjYXJ0cmlkZ2VzLiBUaGlzIGlzIHRoZSB0YXBlIHZvbHVtZSB0aGF0IGhvbGRzIHRoZSBjb21wcmVzc2lvbiBtYXAuCi0KLS0gVGhlIGNvbXByZXNzaW9uIHN1cHBvcnQgZm9yIHpmdGFwZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlCi0gIG1vZHVsZSBgemZ0LWNvbXByZXNzb3InLiBET04nVCBmb3JnZXQgdG8gbG9hZCBpdCBiZWZvcmUgdHJ5aW5nIHRvCi0gIHJlYWQgYmFjayBjb21wcmVzc2VkIHZvbHVtZXMuIFRoZSBzdG9jayBgemZ0YXBlLm8nIG1vZHVsZSBwcm9iZXMgZm9yCi0gIHRoZSBtb2R1bGUgYHpmdC1jb21wcmVzc29yJyB1c2luZyB0aGUga2VybmVsZCBtZXNzYWdlIGNoYW5uZWw7IHlvdQotICBoYXZlIHRvIGluc3RhbGwgYHpmdC1jb21wcmVzc29yLm8nIGluIGEgcGxhY2Ugd2hlcmUgbW9kcHJvYmUgY2FuCi0gIGZpbmQgaXQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMuCi0KLS0gTmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgdHJpZXMgdG8gZ2V0IHRoZSBicm9rZW4gZG93biBHTVQgdGltZQotICBmcm9tIHVzZXIgc3BhY2UgdmlhIGEga2VybmVsIGRhZW1vbiBtZXNzYWdlIGNoYW5uZWwuIFlvdSBuZWVkIHRvCi0gIGNvbXBpbGUgYW5kIHN0YXJ0IHRoZSBga2R0aW1lJyBkYWVtb24gY29udGFpbmVkIGluIHRoZSBjb250cmliCi0gIGRpcmVjdG9yeSB0byB1c2UgaXQuIE5lZWRlZCAoPykgZm9yIHRpbWUgc3RhbXBzIGluIHRoZSBoZWFkZXIKLSAgc2VnbWVudHMgYW5kIHRoZSB2b2x1bWUgdGFibGUuCi0KLS0gdmFyaWFibGUgYmxvY2sgc2l6ZSBtb2RlIHZpYSBNVFNFVEJMSyAwCi0KLS0ga2VlcCBtb2R1bGVzIGxvY2tlZCBpbiBtZW1vcnkgYWZ0ZXIgdGhlIGJsb2NrIHNpemUgaGFzIGJlZW4gY2hhbmdlZAotCi1zZnRhcGUgc3BlY2lmaWM6Ci0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gZW5kIG9mIHRhcGUgaGFuZGxpbmcgc2hvdWxkIGJlIGZpeGVkLCBpLmUuIG11bHRpIHZvbHVtZSBhcmNoaXZlcwotICB3cml0dGVuIHdpdGggYGFmaW8nIGNhbiBiZSByZWFkIGJhY2sgbm93LgotCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDJhLCAwOS8wMS85NyA9PT09PQotCi1ObyBiaWcgbmV3czoKLS0gY2FsbCB6ZnRfaW5pdCgpIHJlc3AuIHNmdF9pbml0KCkgd2hlbiBjb21waWxpbmcgdGhlIGVudGlyZSBzdHVmZgotICBpbnRvIHRoZSBrZXJuZWwgaW1hZ2UuCi0tIGZpeCBidWcgaW4gZnRhcGUtc2V0dXAuYyB3aGVuIE5PX1RSQUNFX0FUX0FMTCB3YXMgZGVmaW5lZC4KLS0gZml4IGJ1ZyBpbiBzZnRhcGUtZW9mLmMvemZ0YXBlLWVvZi5jIGZvciBvbGQga2VybmVscyAoMS4yLiopCi0tIGFkZCBzdXBwb3J0IGZvciBuZXcgbW9kdWxlIGludGVyZmFjZSBmb3IgcmVjZW50IGtlcm5lbHMKLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wMiwgMTYvMTIvOTYgPT09PT0KLS0gRml4ZWQgdGhlIGBGREMgdW5sb2NrIGNvbW1hbmQgZmFpbGVkJyBidWcgaW4gZmRjLWlvLmMuIFdoZW4gdGhlIEZJRk8KLSAgd2FzIGFscmVhZHkgbG9ja2VkIHdoZW4gZnRhcGUgd2FzIGxvYWRlZCwgZnRhcGUgZmFpbGVkIHRvIHVubG9jayBpdC4KLS0gRml4ZWQgY29tcGlsYXRpb24gb2YgYGNvbnRyaWIvZ251bXQnLiBJdCBub3cgZmluZHMgYG10aW8uaCcgZXZlbiBpZgotICBmdGFwZSBpcyBOT1QgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHNvdXJjZSB0cmVlLgotLSBmYy0xMC5jOiBpbmNsdWRlIDxhc20vaW8uaD4gZm9yIGluYigpIGFuZCBvdXRiKCkuCi0tIGZ0YXBlL3NmdGFwZS96ZnRhcGU6IGFsbCBnbG9iYWwgdmFyaWFibGUgbm93IGhhdmUgZWl0aGVyIGEgYGZ0YXBlXycsCi0gIGEgYGZ0XycsIGBzZnRfJywgYHpmdF8nIG9yIGBxaWNfJyBwcmVmaXggdG8gcHJldmVudCBuYW1lIGNsYXNoZXMKLSAgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsIHdoZW4gaW5jbHVkaW5nIGZ0YXBlIGludG8gdGhlIGtlcm5lbAotICBzb3VyY2UgdHJlZS4KLS0gS2VybmVsZCBzdXBwb3J0IGhhcyBjaGFuZ2VkLiBgZnRhcGUnIG5vdyBzZWFyY2hlcyBmb3IgYSBtb2R1bGUKLSAgYGZ0YXBlLWZyb250ZW5kJyB3aGVuIG5vbmUgb2YgdGhlIGZyb250ZW5kIChgc2Z0YXBlJyBvciBgemZ0YXBlJykgaXMKLSAgbG9hZGVkLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGBJbnN0YWxsYXRpb24vTG9hZGluZyBmdGFwZScgc2VjdGlvbiBvZgotICB0aGUgVGVYaW5mbyBtYW51YWwuCi0tIEFkZCBsb2FkIHJlc3AuIGJvb3QtdGltZSBjb25maWd1cmF0aW9uIG9mIGZ0YXBlLiBUaGVyZSBhcmUgbm93Ci0gIHZhcmlhYmxlcyBmdF9mZGNfYmFzZSwgZnRfZmRjX2RtYSBhbmQgZnRfZmRjX2lycSBjb3JyZXNwb25kaW5nIHRvCi0gIHRoZSBmb3JtZXIgRkRDX0JBU0UgZXRjLiBjb21waWxlIHRpbWUgZGVmaW5pdGlvbnMuIE9uZSBjYW4gYWxzbyB1c2UKLSAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyB0byBjb25maWd1cmUgdGhlIGRyaXZlciBpZiBpdCBpcwotICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIEFsc28sIHRoZSBGQy0xMC9GQy0yMCBzdXBwb3J0IGlzIGxvYWQtdGltZQotICBjb25maWd1cmFibGUgbm93IGFzIHdlbGwgYXMgdGhlIE1BQ0gtSUkgaGFjayAoZnRfcHJvYmVfZmMxMCwKLSAgcmVzcC4gZnRfbWFjaDIpLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHNlY3Rpb24gYEluc3RhbGxhdGlvbi9Db25maWd1cmUKLSAgZnRhcGUnIG9mIHRoZSBUZVhpbmZvIG1hbnVhbC4KLS0gSSByZW1vdmVkIHRoZSBNT0RWRVJTSU9OUyBvcHRpb24gZnJvbSBgTWFrZWZpbGUubW9kdWxlJy4gTGV0IG1lIGFsb25lCi0gIHdpdGggZnRhcGUgYW5kIE1PRFZFUlNJT05TIHVubGVzcyB5b3UgaW5jbHVkZSB0aGUgZnRhcGUgc291cmNlcyBpbnRvCi0gIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuCi0tIG5ldyB2ZW5kb3JzIGluIGB2ZW5kb3JzLmgnOgotICAqIEhQIENvbG9yYWRvIFQzMDAwIAotICAqIENvbUJ5dGUgRG91YmxlUGxheSAoaW5jbHVkaW5nIGEgYnVnIGZpeCBmb3IgdGhlaXIgYnJva2VuCi0gICAgZm9ybWF0dGluZyBzb2Z0d2FyZSwgdGhhbmtzIHRvIHdocmF2ZW5AbmphY2tuLmNvbSkKLSAgKiBJb21lZ2EgRElUVE8gMkdJRy4gTk9URTogdGhpcyBkcml2ZSBjYW5ub3Qgd29yayB3aXRoIGZ0YXBlIGJlY2F1c2UKLSAgICB0aGUgbG9naWNhbCBkYXRhIGxheW91dCBvZiB0aGUgY2FydHJpZGdlcyB1c2VkIGJ5IHRoaXMgZHJpdmUgZG9lcwotICAgIE5PVCBjb25mb3JtIHRvIHRoZSBRSUMgc3RhbmRhcmRzLCBpdCBpcyBhIHNwZWNpYWwgSW9tZWdhIHNwZWNpZmljCi0gICAgZm9ybWF0LiBJJ3ZlIHNlbnQgbWFpbCB0byBJb21lZ2EgYnV0IGRpZG4ndCByZWNlaXZlIGFuIGFuc3dlcgotICAgIHlldC4gSWYgeW91IHdhbnQgdGhpcyBkcml2ZSB0byBiZSBzdXBwb3J0ZWQgYnkgZnRhcGUsIGFzayBJb21lZ2EKLSAgICB0byBnaXZlIG1lIGluZm9ybWF0aW9uIGFib3V0IGl0LgotLSB6ZnRhcGU6Ci0gICogcmUtaW50cm9kdWNlZCB0aGUgTVRJT0NfWkZUQVBFX0dFVEJMS1NaIGlvY3RsIGZvciBjb21wYXRpYmlsaXR5Ci0gICAgd2l0aCB6ZnRhcGUgMS4wNmEgYW5kIGVhcmxpZXIuIFBsZWFzZSBkb24ndCB1c2UgaXQgd2hlbiB3cml0aW5nCi0gICAgbmV3IHNvZnR3YXJlLCB1c2UgdGhlIE1USU9DVk9MSU5GTyBpb2N0bCBpbnN0ZWFkLgotICAqIE1ham9yIG92ZXJoYXVsIG9mIHRoZSBjb2RlIHRoYXQgdXBkYXRlcyB0aGUgaGVhZGVyIHNlZ21lbnRzLiBOZXZlcgotICAgIGNoYW5nZSB0aGUgdGFwZSBsYWJlbCB1bmxlc3MgZXJhc2luZyB0aGUgdGFwZS4gVGh1cyB3ZSBhbG1vc3QKLSAgICBuZXZlciBuZWVkIHRvIHdyaXRlIHRoZSBoZWFkZXIgc2VnbWVudHMsIHVubGVzcyB3ZSB3b3VsZCBtb2RpZnkKLSAgICB0aGUgYmFkIHNlY3RvciBtYXAgd2hpY2ggaXNuJ3QgZG9uZSB5ZXQuIFVwZGF0aW5nIG9mIHZvbHVtZSB0YWJsZQotICAgIGFuZCBjb21wcmVzc2lvbiBtYXAgbW9yZSBzZWN1cmUgbm93IGFsdGhvdWdoIGl0IHRha2VzIGEgYml0Ci0gICAgbG9uZ2VyLgotICAqIEZpeGVkIGJ1ZyB3aGVuIGFib3J0aW5nIGEgd3JpdGUgb3BlcmF0aW9uIHdpdGggYSBzaWduYWw6IHpmdGFwZQotICAgIG5vdyBmaW5pc2hlcyB0aGUgY3VycmVudCB2b2x1bWUgKGkuZS4gd3JpdGVzIGFuIGVvZiBtYXJrZXIpIGF0IHRoZQotICAgIGN1cnJlbnQgcG9zaXRpb24uIEl0IGRpZG4ndCBiZWZvcmUgd2hpY2ggbGVkIHRvIHNvbWVob3cgKnN0cmFuZ2UqCi0gICAgYmVoYXZpb3IgaW4gdGhpcyBjYXNlcy4KLSAgKiBLZWVwIG1vZHVsZSBsb2NrZWQgaW4gbWVtb3J5IHdoZW4gdXNpbmcgaXQgd2l0aCAgdGhlIG5vbi1yZXdpbmRpbmcKLSAgICBkZXZpY2VzIGFuZCB0aGUgdGFwZSBpcyBub3QgbG9naWNhbCBhdCBCT1QuIE5lZWRlZCBmb3Iga2VybmVsZAotICAgIHN1cHBvcnQuCi0tIHNmdGFwZToKLSAgKiBLZWVwIG1vZHVsZSBsb2NrZWQgaW4gbWVtb3J5IHdoZW4gdXNpbmcgaXQgd2l0aCAgdGhlIG5vbi1yZXdpbmRpbmcKLSAgICBkZXZpY2VzIGFuZCB0aGUgdGFwZSBpcyBub3QgbG9naWNhbCBhdCBCT1QuIE5lZWRlZCBmb3Iga2VybmVsZAotICAgIHN1cHBvcnQuCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDEsIDE0LzExLzk2ID09PT09Ci0KLS0gRml4ZWQgc2lsbHkgYnVncyBpbiBmdGFwZS0zLjAwOgotICAqIE1BS0VERVYuZnRhcGU6IG1ham9yIGRldmljZSBudW1iZXIgbXVzdCBiZSAyNywgbm90IDIzIAotICAqIHNmdGFwZS9zZnRhcGUtcmVhZC5jOiBzZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudHMoKSBjYWxsZWQgCi0gICAgaXRzZWxmIHJlY3Vyc2l2ZWx5IGluc3RlYWQgb2YgY2FsbGluZyBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KCkKLSAgKiB6ZnRhcGUvcWljLXZ0YmwuaDogY29udmVyc2lvbiBvZiBmdGFwZSdzIGZpbGUgbWFya3MgdG8gemZ0YXBlJ3MKLSAgICBpbnRlcm5hbCB2b2x1bWUgdGFibGUgd2FzIGJyb2tlbi4KLSAgKiBwYXRjaGVzLzIueC54L2xpbnV4LTIuMC4yMS5kaWY6IG15IFJDUyAocmVzcC4gQ1ZTKSBzeXN0ZW0gcmVwbGFjZWQKLSAgICB0aGUgYCRSZXZpc29uOicgZXRjLiBtYWNyb3MgaW4gdGhlIGBmdGFwZS5oJyBjb25jZXJuaW5nIHBhcnQgb2YgdGhlCi0gICAgcGF0Y2ggOi0oIEZpeGVkLgotICAqIGluZm8vZnRhcGUuaW5mbzogRml4ZWQgbWlzc3BlbGxpbmdzIChgY3AnIDwtPiBgY3AgLXInIGV0Yy4pCi0gICogd2hlbiBmdGFwZS9zZnRhcGUgb3IgZnRhcGUvemZ0YXBlIHdhcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgdGhlCi0gICAgdmFyaWFibGUgZnRhcGVfc3RhdHVzIHdhcyBkZWNsYXJlZCB0d2ljZS4gRml4ZWQuCi0gICogcmVtb3ZlZCByZWZlcmVuY2UgdG8gdW5kZWNsYXJlZCB2YXJpYWJsZSBrZXJuZWxfdmVyc2lvbiB3aGVuIG5vdAotICAgIGNvbXBpbGluZyBhcyBtb2R1bGUKLSAgKiBmaXhlZCBhIGJ1ZyBpbnRyb2R1Y2VkIGJ5IHRoZSB1c2Ugb2YgYml0LWZpZWxkcyBmb3Igc29tZSBmbGFncwotICAgIChpLmUuIHdyaXRlX3Byb3RlY3RlZCwgbm9fY2FydHJpZGdlLCBmb3JtYXR0ZWQpCi0gICogZmxhZyBgaGVhZGVyX3JlYWQnIGlzIG5vdyByZXNldCBjb3JyZWN0bHkgdG8gemVybyB3aGVuIHRhcGUgaXMKLSAgICByZW1vdmVkLgotLSBmaXhlZCBhIGJ1ZyBpbiBzZnRhcGUvc2Z0YXBlLWVvZi5jIHRoYXQgd2FzIGFscmVhZHkgaW4gdGhlIG9yaWdpbmFsCi0gIGZ0YXBlIGNvZGUuIE1URlNGL0JTRiB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gcG9zaXRpb25lZAotICByaWdodCBiZWZvcmUgdGhlIGZpbGUgbWFyayAodGhpbmsgb2YgdGFyKQotLSBDaGFuZ2VkIFRSQUNFIG1hY3JvcyAoZm9sbG93aW5nIGEgc3VnZ2VzdGlvbiBvZiBNYXJjaW4gRGFsZWNraSkgdG8gdXNlCi0gIHRoZSBwcmVkZWZpbmVkIF9fRlVOQ1RJT05fXyBtYWNybyBvZiBHQ0MuIFNwYXJlcyBhYm91dCA0ayBvZiBjb2RlLgotLSBhZGRlZCBuZXcgdmVuZG9yIGlkIGZvciBJb21lZ2EgRElUVE8gMkdJRwotLSBmaXhlZCBhIGJ1ZyBhbHJlYWR5IHByZXNlbnQgaW4gemZ0YXBlLTEuMDYgd2hlbiBhYm9ydGluZyBhIHdyaXRlCi0gIHdpdGggYSBzaWduYWw6IHdlIG5vdyBmaW5pc2ggdGhlIGN1cnJlbnQgdm9sdW1lIGF0IHRoYXQKLSAgcG9zaXRpb24uIEhlYWRlciBzZWdtZW50cyByZW1haW4gTk9UIHVwIHRvIGRhdGUgdW50aWwgYW4gZXhwbGljaXQgY2FsbAotICB0byBNVFJFVyBvciBNVE9GRkwgaXMgZG9uZS4gIAotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAwLCAxNC8xMC85NiA9PT09PQotCi0tIE1lcmdlZCBmdGFwZSB3aXRoIHpmdGFwZS4gVGhlcmUgYXJlIHRocmVlIG1vZHVsZXMgbm93OgotICBmdGFwZSBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnQsIHNmdGFwZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICBvcmlnaW5hbCBmdGFwZSBlb2YgbWFyayBzdHVmZiBhbmQgemZ0YXBlIHRoYXQgaW1wbGVtZW50cyB6ZnRhcGUncyB3YXkKLSAgb2YgaGFuZGxpbmcgdGhpbmdzIChjb21wcmVzc2lvbiwgdm9sdW1lIHRhYmxlLCB0YXBlIGJsb2NrcyBvZgotICBjb25zdGFudCBsZW5ndGgpCi0tIERvY3VtZW50YXRpb24gaW4gVGVYaW5mbyBmb3JtYXQgaW4gdGhlIGBpbmZvJyBzdWJkaXJlY3RvcnkuCi0tIE5ldyBpb2N0bHMgZm9yIHpmdGFwZS4gU2VlIHpmdGFwZS96ZnRhcGUuaAotLSBEdW1teSBmb3JtYXR0aW5nIGlvY3RsIGZvciBmdGFwZS4gU2VlIGZ0YXBlLmgKLS0gS2VybmVsIHBhdGNoIGZpbGVzIGZvciB0aGUgMi4qLiogc2VyaWVzIHRvIGluY2x1ZGUgZnRhcGUtMy4wMCBpbiB0aGUKLSAga2VybmVsIHNvdXJjZSB0cmVlLiBUaGVzZSBpbmNsdWRlcyBhIGtlcm5lbCBjb21wYXRpYmxlIENvbmZpZy5pbgotICBzY3JpcHQgYW5kIGZhaXJseSBsYXJnZSBvbmxpbmUgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXJuZWwgY29uZmlndXJlCi0gIHNjcmlwdC4KLS0gU3VwcG9ydCBmb3IgY29tcGlsaW5nIHdpdGggTGludXgtMS4yLjEzLiAKLS0gTW9kaWZpZWQgR05VIG10IGZyb20gdGhlaXIgY3BpbyBwYWNrYWdlIHRoYXQgY2FuIGhhbmRsZSB0aGUgbmV3Ci0gIGlvY3Rscy4KLS0gZnRhcGUvc2Z0YXBlL3pmdGFwZSBpcyBrZXJuZWxkIHNhdmUgbm93IQotCi1Ob3RlcyBvbiBzZnRhcGU6Ci0tIHNmdGFwZSBpbXBsZW1lbnRzIHRoZSBlb2YgaGFuZGxpbmcgY29kZSBvZiB0aGUgb3JpZ2luYWwgZnRhcGUuIElmCi0gIHlvdSBsaWtlIHRvIHN0aWNrIHdpdGggdGhlIG9yaWdpbmFsIGZ0YXBlIHN0dWZmLCB5b3UgaGF2ZSB0byB1c2UKLSAgdGhpcyBtb2R1bGUsIG5vdCB6ZnRhcGUuCi0tIHNmdGFwZSBpcyBrZXJuZWxkIHNhdmUsIHVubGlrZSB0aGUgb3JpZ2luYWwgZnRhcGUuCi0tIHdlIGtlZXAgdGhlIGVudGlyZSBoZWFkZXIgc2VnbWVudCBub3cgaW4gbWVtb3J5LCBzbyBubyBuZWVkIHRvIHJlYWQKLSAgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkZXIgc2VnbWVudHMuIEFkZGl0aW9uYWwgbWVtb3J5Ci0gIGNvbnN1bXB0aW9uOiAyNTYgYnl0ZXMuIAotCi1Ob3RlcyBmb3IgemZ0YXBlOgotLSB6ZnRhcGUgaGFzIHN1cHBvcnQgZm9yIHRhcGVzIHdpdGggZm9ybWF0IGNvZGUgNiBub3csIHdoaWNoIHVzZSBhCi0gIHNsaWdodGx5IGRpZmZlcmVudCB2b2x1bWUgdGFibGUgZm9ybWF0IGNvbXBhcmVkIHdpdGggb3RoZXIgZmxvcHB5Ci0gIHRhcGVzLgotLSBuZXcgaW9jdGxzIGZvciB6ZnRhcGUuIEhhdmUgYSBsb29rIGF0IHpmdGFwZS96ZnRhcGUuaAotLSBUaGUgaW50ZXJuYWwgdm9sdW1lIHRhYmxlIHJlcHJlc2VudGF0aW9uIGhhcyBjaGFuZ2VkIGZvciB6ZnRhcGUuIE9sZAotICBjYXJ0cmlkZ2VzIGFyZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseS4KLS0gemZ0YXBlIG5vIGxvbmdlciB1c2VzIGNvbXByZXNzaW9uIG1hcCBzZWdtZW50cywgd2hpY2ggaGF2ZSB2YW5pc2hlZAotICBmcm9tIHRoZSBRSUMgc3BlY3MsIGJ1dCBjcmVhdGVzIHZvbHVtZSB0YWJsZSBlbnRyeSB0aGF0IHJlc2VydmVzCi0gIGVub3VnaCBzcGFjZSBmb3IgdGhlIGNvbXByZXNzaW9uIG1hcC4gCi0tIHpmdGFwZSBpcyBrZXJuZWxkIHNhdmUgbm93LgotLSB3ZSBrZWVwIHRoZSBlbnRpcmUgaGVhZGVyIHNlZ21lbnQgbm93IGluIG1lbW9yeSwgc28gbm8gbmVlZCB0byByZWFkCi0gIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZGVyIHNlZ21lbnRzLiBBZGRpdGlvbmFsIG1lbW9yeQotICBjb25zdW1wdGlvbjogMjU2IGJ5dGVzLiAKLQotTm90ZXMgZm9yIGNvbnRyaWIvZ251bXQ6Ci0tIG1vZGlmaWVkIG10IGZyb20gdGhlIEdOVSBjcGlvIHBhY2thZ2UgdGhhdCBzdXBwb3J0cyBhbGwgdGhlIG5ldwotICBpb2N0bHMgb2YgemZ0YXBlLgotTm90ZXMgZm9yIGNvbnRyaWIvc3dhcG91dDoKLS0gVGhpcyBjb250YWlucyB0aGUgc3dhcG91dC5jIHByb2dyYW0gdGhhdCB3YXMgd3JpdHRlbiBieSBLYWkKLSAgSGFycmVraWxkZS1QZWRlcnNvbi4gSSBzaW1wbHkgYWRkZWQgYSBNYWtlZmlsZS4KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4xMCwgMTQvMTAvOTYgPT09PT0KLQotVGhlIGZ0YXBlIG1haW50YWluZXIgaGFzIGNoYW5nZWQuIAotS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gPGtocEBkb2xwaGluaWNzLm5vPgotaGFzIHJlc2lnbmVkIGZyb20gbWFpbnRhaW5pbmcgZnRhcGUsIGFuZCBJLAotQ2xhdXMtSnVzdHVzIEhlaW5lIDxjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGU+LAotaGF2ZSB0YWtlbiBvdmVyLgotCi0tIEFkZGVkIHN1cHBvcnQgZm9yIHRhcGVzIHdpdGggYGZvcm1hdCBjb2RlIDYnLCBpLmUuIFFJQy0zMDIwIHRhcGVzCi0gIHdpdGggbW9yZSB0aGFuIDJeMTYgc2VnbWVudHMuCi0tIG1lcmdlZCBjaGFuZ2VzIG1hZGUgYnkgQmFzIExhYXJob3ZlbiB3aXRoIGZ0YXBlLTIuMDkuIFJlZmVyCi0gIHRvIGhpcyByZWxlYXNlIG5vdGVzIGJlbG93LiBJJ3ZlIGluY2x1ZGVkIHRoZW0gaW50byB0aGlzCi0gIGZpbGUgdW5jaGFuZ2VkIGZvciB5b3VyIHJlZmVyZW5jZS4KLS0gZGlzYWJsZWQgY2FsbCBzdGFjayBiYWNrIHRyYWNlIGZvciBub3cuIFRoaXMgbmV3IGZlYXR1cmUKLSAgaW50cm9kdWNlZCBieSB0aGUgaW50ZXJpbSByZWxlYXNlIDIuMC54IHN0aWxsIHNlZW1zIHRvCi0gIGJlIGJ1Z2d5LgotLSBUcmllZCB0byBtaW5pbWl6ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBmdGFwZSB2ZXJzaW9uCi0gIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBhbmQgdGhlIHN0YW5kYWxvbmUKLSAgbW9kdWxlIHZlcnNpb24uCi0tIFJlaW50cm9kdWNlZCBzdXBwb3J0IGZvciBMaW51eC0xLjIuMTMuIFBsZWFzZSByZWZlciB0byB0aGUKLSAgSW5zdGFsbC1ndWlkZS4gCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDksIDE2LzA2Lzk2ID09PT09Ci0KLVRoZXJlIGFyZW4ndCBhbnkgcmVhbGx5IGJpZyBuZXdzIGluIHRoaXMgcmVsZWFzZSwgbW9zdGx5IGp1c3QgdGhhdCBJCi0odGhlIG1haW50YWluZXIpIGhhdmUgY2hhbmdlZCBteSBlbWFpbCBhZGRyZXNzIChkdWUgdG8gYSBuZXcgam9iKS4gIE15Ci1uZXcgYWRkcmVzcyBpcyA8a2hwQGRvbHBoaW5pY3Mubm8+Ci0KLS0gVGhlIENMS180OE1IWiBhbmQgRkRDXzgyMDc4U0wgb3B0aW9ucyBoYXMgZ29uZSAoYWxsIDJNYnBzIGNhcmRzIHNlZW0KLSAgdG8gdXNlIGEgNDhNSHogb3NjaWxsYXRvciBhbnl3YXkgYW5kIEkgaGF2ZW4ndCBoZWFyZCBvZiBhbiAnU0wKLSAgY2hpcCBvdXQgdGhlcmUpLgotLSBUaGUgUzgyMDc4QiBoYXMgYmVlbiBgZG93bmdyYWRlZCcgdG8gaTgyMDc3QUEgY29tcGFiaWxpdHkuCi0tIFRFU1RJTkcgb3B0aW9uIHJldml2ZWQuICBSaWdodCBub3csIGl0J2xsIGVuYWJsZSB0aGUgKHNlcmlvdXNseSBicm9rZW4pCi0gIDJNYnBzIGNvZGUuICBJZiB5b3UgZW5hYmxlIGl0LCB5b3UnbGwgZXhwZXJpZW5jZSBhIHRhcGUgZHJpdmUgdGhhdCdzCi0gICpyZWFsbHkqIG91dCB0byBsdW5jaCEKLS0gU29tZSAoYm9sZCkgY2hhbmdlcyBpbiB0aGUgaW5pdCBjb2RlLiAgUGxlYXNlIG5vdGlmeSBtZSBpZiB0aGV5Ci0gIGJyZWFrIHRoaW5ncyBmb3IgeW91LgotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA4LCAxNC8wMy85NiA9PT09PQotCi1JZiB5b3UgY29ycmVjdCBhIHByb2JsZW0gd2l0aCBmdGFwZSwgcGxlYXNlIHNlbmQgeW91ciBwYXRjaCB0bwota2hwQGRvbHBoaW5pY3Mubm8gdG9vLgotCi0tIFVwZGF0ZWQgdG8gcmVmbGVjdCB0aGF0IE5SX01FTV9MSVNUUyBpcyBnb25lIGluIDEuMy43NAotLSBUZWFjIDcwMCBhZGRlZCB0byBsaXN0IG9mIGtub3duIGRyaXZlcy4KLS0gVGhlIHJlZ2lzdGVyZWQgZGV2aWNlIG5hbWUgaXMgbm93ICJmdCIgcmF0aGVyIHRoYW4gImZ0YXBlIi4KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wN2EsIDE0LzAzLzk2ID09PT09Ci0KLUJ1Z2ZpeGVzIGJ5IE1hcmNpbiBEYWxlY2tpIDxkYWxlY2tpQG5hbXUwMy5nd2RnLmRlPjoKLS0gSW4gdGhlIGxhc3QgcmVsZWFzZSBpdCBqdXN0IGNvbXBpbGVkIGFnYWluc3QgMS4zLjcwOwotICBub3cgdGhlIHBhcmFtcyB0byByZXF1ZXN0X2lycSgpIGFuZCBmcmVlX2lycSBhcmUoKSBhcmUgZml4ZWQsIHNvIGl0IGFsc28gCi0gIHdvcmtzIGluIDEuMy43MyA6LSkKLS0gU3VwcG9ydCBmb3IgbW9kdWxlcyBpcyBub3cgY29ycmVjdCBmb3IgbmV3ZXIga2VybmVscy4KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNywgMDQvMDMvOTYgPT09PT0KLQotCi0tIGZ0YXBlIHVwZGF0ZWQgdG8gY29tcGlsZSBhZ2FpbnN0IDEuMy43MC4KLS0gSW9tZWdhIDcwMCBhbmQgV2FuZ3RlayAzMjAwIHJlY29nbmlzZWQuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNmIsIDEzLzAyLzk2ID09PT09Ci0KLUFub3RoZXIgc2ltcGxlIGJ1Z2ZpeCB2ZXJzaW9uLgotCi0tIEp1bWJvIDcwMCByZWNvZ25pc2VkLgotLSBUeXBvIGluIHZlbmRvcnMuaCBmaXhlZC4KLQotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA2YSwgMTAvMDIvOTYgPT09PT0KLQotVGhpcyByZWxlYXNlIGlzIGEgc2ltcGxlIGJ1Z2ZpeCB2ZXJzaW9uLgotCi0tIExpbnV4L1NNUDogZnRhcGUgKnNob3VsZCogd29yay4KLS0gRkMtMTAvMjA6IE9ubHkgYWNjZXB0cyBJUlFzIDMtNywgb3IgOS4gIElmIElSUSA5LCBwcm9wZXJseSB0ZWxsIHRoZSBjYXJkCi0gIHRvIHVzZSBJUlEgMi4gIFRoYW5rcyB0byBHcmVnIENyaWRlciAoZ2NyaWRlckBpY2xuZXQub3JnKSBmb3IgZmluZGluZyBhbmQKLSAgbG9jYXRpbmcgdGhpcyBidWcgYW5kIHRlc3RpbmcgdGhlIHBhdGNoLgotLSBJbnNpZ2h0IGRyaXZlIHJlY29nbmlzZWQgY29ycmVjdGx5IGFnYWluLgotLSBNb3Rvci1vbiB3YWtldXAgdmVyc2lvbiBvZiB0aGUgSW9tZWdhIDI1MCBkcml2ZSBhZGRlZAotCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDYsIDI4LzAxLzk2ID09PT09Ci0KLVNwZWNpYWwgdGhhbmtzIGdvIHRvIE5lYWwgRnJpZWRtYW4gYW5kIFN0ZXZlbiBTb3Jib20gZm9yIHRoZWlyCi1oZWxwIGluIHByb2R1Y2luZyBhbmQgdGVzdGluZyB0aGlzIHJlbGVhc2UuCi0KLUkgaGF2ZSBjb250aW51ZWQgdG8gY2xlYW4gdXAgdGhlIGNvZGUsIHdpdGggYW4gZXllIHRvd2FyZHMgaW5jbHVzaW9uCi1vZiBmdGFwZSBpbiBMaW51cycgb2ZmaWNpYWwga2VybmVsIChJbiBmYWN0LCBhcyBJIHR5cGUgdGhpcywgSSBhbQotcnVubmluZyBvbiBhIGtlcm5lbCB3aXRoIGZ0YXBlIHN1cHBvcnQgc3RhdGljYWxseSBsaW5rZWQpLiAgSSBoYXZlCi10ZXN0LWNvbXBpbGVkIGZ0YXBlIGFnYWluc3QgbXkgMS4yLjEzIHRyZWUgd2l0aG91dCBwcm9ibGVtcy4KLUhvcGVmdWxseSwgZXZlcnl0aGluZyBzaG91bGQgYmUgT0sgZm9yIHRoZSB2MS4yLnggcGVvcGxlLgotCi1XQVJOSU5HISBBbGFuIENveCBoYXMgbWFpbGVkIG1lIHRoYXQgZnRhcGUgZG9lcyAqTk9UKiB3b3JrIHdpdGgKLUxpbnV4L1NNUC4gIElmIHlvdSB0cnkgdG8gcnVuIGZ0YXBlIHVuZGVyIExpbnV4L1NNUCwgaXQgd2lsbCBjYXVzZSBhCi1rZXJuZWwgZGVhZGxvY2sgKHdoaWNoIGlzIHdvcnNlIHRoYW4gYSBwYW5pYykuCi0KLS0gUUlDLTMwMjAvVFItMzogMU1icHMgc3VwcG9ydCB3b3Jrcy4gIE5lYWwgaXMgY2FwYWJsZSBvZiByZWFkaW5nIGFuZAotICB3cml0aW5nIGRhdGEgdG8gYSB0YXBlLiAgZnRhcGUgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdHlwZSBvZgotICB0YXBlIChlLmcuIFRSLTMgdnMgUUlDLTgwKSBhbmQgbW92ZSB0aGUgZmRjIGluIGFuZCBvdXQgb2YKLSAgInBlcnBlbmRpY3VsYXIgbW9kZSIgYXMgbmVjZXNzYXJ5LgotLSAyTWJwcyBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNpbmNlIGl0IGlzIG5vdCBmdWxseQotICBkZWJ1Z2dlZC4gIElmIHlvdSBhcmUgYWR2ZW50dXJvdXMsIHJlbW92ZSAtREZEQ184MjA3OFNMIGluIHRoZQotICBNYWtlZmlsZSBhbmQgc2VlIHdoYXQgaGFwcGVucyA6LSkKLS0gZmRjIGRldGVjdGlvbjogc2lsbHkgYnVncyByZW1vdmVkIChPbmx5IDJNYnBzIGZkY3Mgd2VyZSBhZmZlY3RlZCkKLSAgYW5kIGFkZGVkIGRldGVjdGlvbiBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgUEM4NzQ0IGZkYyBjaGlwCi0gICh1c2VkIGluIHRoZSBQQzg3M3h4ICJzdXBlci1JTyIgY2hpcHMpLgotLSBSZW1vdmVkIHdhcm5pbmcgYWJvdXQgaW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gY29tcGlsaW5nIHdpdGggTGludXgKLSAgMS4yLnguCi0tIFJFQURNRS5QQ0kgdXBkYXRlZCB3aXRoIGluZm8gYWJvdXQgdGhlIERFTEwgRGltZW5zaW9uIFhQUyBQOTAuCi0tIENvbm5vciBUU1QzMjAwUiBhZGRlZCB0byBkZXRlY3RlZCBkcml2ZXMuCi0tIGBzd2Fwb3V0JyB1dGlsaXR5IGFkZGVkIHRvIGRpc3RyaWJ1dGlvbi4gIEl0IHdpbGwgZGlydHkgNU1lZyBvZgotICBtZW1vcnksIHRyeWluZyB0byBzd2FwIG91dCBvdGhlciBwcm9ncmFtcy4gIEp1c3Qgc2F5IGBtYWtlIHN3YXBvdXQnCi0gIHRvIGJ1aWxkIGl0LiAgZnRhcGUgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgUmVhbCBTb29uIE5vdyAoaWU6Ci0gIHdoZW4gSSBoYXZlIGZvdW5kIG91dCB3aGljaCBrZXJuZWwgbWVtb3J5IGFsbG9jIGZ1bmN0aW9uIHRvIGNhbGwpLgotCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDUsIDA4LzAxLzk2ID09PT09Ci0KLS0gRm9yIHYxLjIueCBLZXJuZWxzLCB5b3UgbXVzdCBhcHBseSB0aGUgcGF0Y2ggbGludXgtMS4yL2tzeW1zLnBhdGNoIHRvCi0gIHRoZSBrZXJuZWwgYW5kIHJlYnVpbGQgaXQgKGl0IGFkZHMgdGhlIF9fZ2V0X2RtYV9wYWdlcyBzeW1ib2wgdG8KLSAga3N5bXMuYykuCi0tIEluY2x1ZGVkIG5ldyBhc20taTM4Ni9pby5oIGZpbGUgZnJvbSB2MS4zLngga2VybmVsIHNlcmllcywgdG8gZW5hYmxlCi0gIGdjYyB2LjIuNy5bMTJdIHRvIGNvbXBpbGUgdjEuMi54IGtlcm5lbHMgKGxpbnV4LTEuMi9pby5oKS4KLS0gTW9kdWxlIHZlcnNpb25zOiBJZiB5b3Ugd2lzaCB0byBjb21waWxlIGZ0YXBlIGFzIGEgdmVyc2lvbmVkIG1vZHVsZSwKLSAgeW91IG11c3QgZmlyc3QgY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIENPTkZJR19NT0RWRVJTSU9OUz15LgotICBPdGhlcndpc2UsIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgPGxpbnV4L21vZHZlcnNpb25zLmg+IGRvZXMgbm90Ci0gIGV4aXN0IChpZiB0aGF0IGhhcHBlbnMsIGEgYHRvdWNoIG1vZHZlcnNpb25zLmgnIHdpbGwgaGVscCB5b3Ugb3V0KS4KLS0gQ0xLXzQ4TUhaOiBuZXcgZGVmaW5lIGluIHRoZSBNYWtlZmlsZSAoZGVmYXVsdDogbm9uLXplcm8pLiAgSWYgeW91IGhhdmUKLSAgYSB0YXBlIGNvbnRyb2xsZXIgY2FyZCB0aGF0IHVzZXMgdGhlIGk4MjA3OCgtMSkgY2hpcCwgYnV0IGNhbm5vdCBnZXQKLSAgaXQgdG8gd29yayB3aXRoIGZ0YXBlLCB0cnkgc2V0IGl0IHRvIDAgKGFuZCBwbGVhc2UgcmVwb3J0IHRoaXMpLgotLSBRSUMtMzAxMC8zMDIwOiBDb21wbGV0ZSBzdXBwb3J0IGlzIHN0aWxsIG1pc3NpbmcsIGJ1dCB3aWxsIGhvcGVmdWxseQotICBjb21lIHNvb24uICBTdGV2ZW4gU29yYm9tIGhhcyBraW5kbHkgcHJvdmlkZWQgbWUgd2l0aCBoaW50cyBhYm91dAotICB0aGlzLiAgV3JpdGluZyBvZiBRSUMtMzAyMCB0YXBlcyBkZWZpbml0ZWx5IGRvZXMgTk9UIHdvcmsgKGRvIG5vdCB0cnkKLSAgaXQhIC0gdGhlIGRyaXZlIHdpbGwgbm90IGJlIGluICJwZXJwZW5kaWN1bGFyIG1vZGUiIGFuZCB0aGlzIHdpbGwgcnVpbgotICB0aGUgZm9ybWF0dGluZyBpbmZvIG9uIHRoZSB0YXBlKS4KLS0gZnRhcGVfbnVtX2J1ZmZlcnMgaXMgb3V0IG9mIGZhc2hpb246IHVzZSBOUl9CVUZGRVJTIGluc3RlYWQgKGFuZAotICByZWNvbXBpbGUgaWYgeW91IHdhbnQgdG8gY2hhbmdlIGl0IDotKS4KLQotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA0LCAwMS8wMS85NiA9PT09PQotCi1UaGlzIHZlcnNpb24gYnkgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gPGtocEBkb2xwaGluaWNzLm5vPgotCi0tIEFMRVJUISBTdXBwb3J0IGZvciBLZXJuZWxzIGVhcmxpZXIgdGhlbiB2MS4xLjg1IGlzIGFib3V0IHRvIGdvIGF3YXkuCi0gIEkgaW50ZW5kIHRvIGNsZWFuIHVwIHNvbWUgb2YgdGhlIGNvZGUgKGdldHRpbmcgcmlkIG9mIGFuIGFubm95aW5nbHkKLSAgbGFyZ2UgbnVtYmVycyBvZiAjaWZkZWYgbW9zdGx5KSwgd2hpY2ggbWVhbnMgdGhhdCBzdXBwb3J0IGZvcgotICBwcmUtMS4xLjg1IGtlcm5lbHMgbXVzdCBnbyBhcyB3ZWxsLgotLSBOUl9GVEFQRV9CVUZGRVJTIGlzIGdvbmU7IFlvdSBjYW4gaW5zdGVhZCBzZWxlY3QgdGhlIG51bWJlciBvZiBkbWEKLSAgYnVmZmVycyBieSBzYXlpbmcgYGluc21vZCBmdGFwZS5vIGZ0YXBlX251bV9idWZmZXI9PG4+JyBpbnN0ZWFkLgotLSBDb25maWd1cmUgc2NyaXB0IGdvbmUuICBmdGFwZSB3aWxsIG5vdyBhdXRvbWFnaWNhbGx5IGRldGVybWluZSB5b3VyCi0gIGtlcm5lbCB2ZXJzaW9uIGJ5IC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmggaW5zdGVhZC4KLS0gQ09ORklHX01PRFZFUlNJT05TIG5vdyB3b3JrLiAgQWxsIGNvbWJpbmF0aW9ucyBvZiB2ZXJzaW9uZWQgLwotICB1bnZlcnNpb25lZCBrZXJuZWwgYW5kIGZ0YXBlIG1vZHVsZSB3b3JrcyAoYXQgbGVhc3Qgd2l0aCBteSAxLjMuNTIKLSAga2VybmVsKS4KLS0gSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBpbnNlcnRpbmcgZnRhcGUgaW50byBhbiBvbGQgKDEuMi54KQotICBrZXJuZWwgKGUuZy4gaW5zbW9kIHNheXMgIjEuMi44IGRvZXMgbm90IG1hdGNoIDEuMi44KSwgcmVjb21waWxlCi0gIHlvdXIgbW9kdWxlcyB1dGlsaXRpZXMgd2l0aCB5b3VyIG5ldyBjb21waWxlci4KLS0gUmV2ZWFsIFRCMTQwMCBkcml2ZSBhZGRlZCB0byB2ZW5kb3JzLmgKLS0gU3VwcG9ydCBmb3IgdGhlIGk4MjA3OC0xICgyTWJwcykgY2hpcCBpcyBjb21pbmcgYWxvbmcuICBUaGUKLSAgYmlnZ2VzdCBwcm9ibGVtIGlzIHRoYXQgSSBkb24ndCBoYXZlIHN1Y2ggYSBjYXJkLCB3aGljaCBtYWtlcwotICB0ZXN0aW5nIC8gZGVidWdnaW5nIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgVGhlIHNlY29uZCBiaWdnZXN0Ci0gIHByb2JsZW0gaXMgdGhhdCBJIGRvIG5vdCBoYXZlIHRoZSBRSUMtMzAxMC8zMDIwIHN0YW5kYXJkcyBlaXRoZXIuCi0gIFN0YXR1cyByaWdodCBub3cgaXMgdGhhdCB0aGUgY2hpcCBpcyBkZXRlY3RlZCwgYW5kIGl0IHNob3VsZCBiZQotICBwb3NzaWJsZSB0byBwdXQgaXQgaW50byAyTWJwcyBtb2RlLiAgSG93ZXZlciwgSSBkbyBub3Qga25vdyB3aGF0Ci0gICJleHRyYXMiIGFyZSBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN1cHBvcnQuICBBbHRob3VnaCBwdXR0aW5nIHRoZQotICBpODIwNzggaW50byAxTWJwcyBtb2RlIG91Z2h0IHRvIHdvcmsgb3V0IG9mIHRoZSBib3gsIGl0IGRvZXNuJ3QKLSAgKHJpZ2h0IG5vdywgZnRhcGUgY29tcGxhaW5zIGFib3V0IGlkIGFtIGVycm9ycykuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNGJldGE1LCAyOS8xMi85NSA9PT09PQotCi1CYXMgb2ZmbGluZSBsaW51eC10YXBlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgcmVhc29ucyBvbmx5IGtub3duIHRvIHRoZSBtYWpvcmRvbW8gbWFpbCBsaXN0IHByb2Nlc3NvciwgQmFzIHdhcwota2lja2VkIG9mZiB0aGUgbGludXgtdGFwZSBsaXN0IHNvbWV0aW1lIGR1cmluZyB0aGUgc3VtbWVyLiAgQmVpbmcKLW92ZXJ3b3JrZWQgYXQgaGlzIGZvci1wYXkgam9iLCBoZSBkaWRuJ3Qgbm90aWNlIGl0IG11Y2guICBJbnN0ZWFkIEkKLShLYWksIGtocEBkb2xwaGluaWNzLm5vKSBoYXMgd29ya2VkIG9uIGZ0YXBlIHRvIHByb2R1Y2UgdGhlIDIuMDQoYmV0YSkKLXZlcnNpb24uCi0KLXpmdGFwZQotLS0tLS0tCi1Ob3RlIHRoYXQgdGhlcmUgZXhpc3RzIGEgbXVjaCBpbXByb3ZlZCB2ZXJzaW9uIG9mIGZ0YXBlLCB3cml0dGVuIGJ5Ci1DbGF1cy1KdXN0dXMgSGVpbmUgPGNsYXVzQHdpbGxpLm1hdGgucnd0aC1hYWNoZW4uZGU+IHdoaWNoIGlzIG5hbWVkCi16ZnRhcGUsIHdoaWNoIGNvbmZvcm1zIHRvIHRoZSBRSUMtODAgc3BlY3Mgb24gaG93IHRvIG1hcmsgYmFja3VwcywgYW5kCi1pcyBjYXBhYmxlIG9mIGRvaW5nIGF1dG9tYXRpYyBjb21wcmVzc2lvbi4gIEhvd2V2ZXIsIHpmdGFwZSBtYWtlcwotc3Vic3RhbnRpYWwgY2hhbmdlcyB0byBmdGFwZSwgYW5kIEkgKEthaSkgaGF2ZSB0aGVyZWZvcmUgZGVjbGluZWQgdG8KLWludGVncmF0ZSB6ZnRhcGUgaW50byBmdGFwZS4gIEhvcGVmdWxseSwgdGhpcyB3aWxsIGhhcHBlbiBzb29uLgotCi1DT05GSUdfUUlDMTE3IHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgYmlnZ2VzdCBjaGFuZ2Ugb2YgYWxsIGlzIHRoYXQgZnRhcGUgbm93IHdpbGwgYWxsb2NhdGUgaXRzIGRtYQotYnVmZmVycyB3aGVuIGl0IGlzIGluc2VydGVkLiAgVGhlIG1lYW5zIHRoYXQgdGhlIENPTkZJR19RSUMxMTcgb3B0aW9uCi1oYXMgZGlzYXBwZWFyZWQgZnJvbSB0aGUgTGludXgga2VybmVsIGFzIG9mIHYxLjMuMzQuICBJZiB5b3UgaGF2ZSBhbgotZWFybGllciBrZXJuZWwsIHNpbXBseSBhbnN3ZXIgJ25vJyB0byB0aGUgcXVlc3Rpb24gd2lsbCBkbyB0aGUgdHJpY2sKLShpZiB5b3UgZ2V0IGNvbXBsYWlucyBhYm91dCBfX2dldF9mcmVlX3BhZ2VzKCkgbWlzc2luZywgY29udGFjdCB0aGUKLWxpbnV4LXRhcGUgbWFpbGluZyBsaXN0KS4KLQotTm90ZSB0aGF0IGZ0YXBlLTIuMDRiZXRhIHdpbGwgd29yayBlcXVhbGx5IHdlbGwgb24ga2VybmVscyB3aXRoIGFuZAotd2l0aG91dCBgZnRhcGUgc3VwcG9ydCcuICBUaGUgb25seSBjYXRjaCBpcywgdGhhdCB5b3Ugd2lsbCB3YXN0ZQotYXJvdW5kIDk2LTEyOEtiIG9mIHByZWNpb3VzIERNQSdhYmxlIG1lbW9yeSBvbiBhIGJveCB0aGF0IGhhcyBmdGFwZQotc3VwcG9ydCBjb21waWxlZCBpbi4KLQotTm93IGZvciB0aGUgcmVhbCBjaGFuZ2VzOgotCi0tIEZDLTIwIGNhbiBub3cgdXNlIERNQSBjaGFubmVscyAxLCAyLCBhbmQgMy4gVGhhbmtzIHRvIERhbmllbAotICBDb2hlbiwgY2F0bWFuQHdwaS5lZHUuCi0tIGZ0YXBlIG5vIGxvbmdlciByZXF1aXJlcyBhIChnaWdhbnRpYykgOTZLYiBidWZmZXIgdG8gYmUgc3RhdGljYWxseQotICBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC4KLS0gQWRkZWQgbmV3IElvbWVnYSBkcml2ZSAoODg4MikgdG8gdmVuZG9ycy5oCi0tIC1mbm8tc3RyZW5ndGgtcmVkdWNlIGFkZGVkIHRvIE1ha2VmaWxlLCBzaW5jZSBHQ0MgaXMgYnJva2VuLgotLSBpODIwNzgtMSAoMk1icHMpIEZEQyBzdXBwb3J0IHN0YXJ0ZWQuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wM2IsIDI3LzA1Lzk1ID09PT09Ci0KLS0gUHJldmVudGVkIHZlcmlmeV9hcmVhIHRvIHJldHVybiBlcnJvciBpZiBjYWxsZWQgd2l0aCB6ZXJvIGxlbmd0aC4KLS0gRml4ZWQgYSBidWcgaW4gZmx1c2hfYnVmZmVycyB0aGF0IGNhdXNlZCB0b28gbXVjaCBwYWRkaW5nIHRvIGJlCi0gIHdyaXR0ZW4gd2hlbiBhIGZpbmFsIHNlZ21lbnQgaGFkIGJhZCBzZWN0b3JzLgotLSBJbmNyZWFzZWQgbWF4aW11bSBmYXN0LXNlZWsgb3ZlcnNob290IHZhbHVlIGZyb20gNSB0byAxMCBzZWdtZW50cy4KLS0gQnJlYWtpbmcgbG9vcCBhZnRlciA1IHJldHJpZXMgd2hlbiBwb3NpdGlvbmluZyBmYWlscy4KLS0gRml4ZWQgd3JvbmcgY2FsY3VsYXRpb24gb2YgdGFwZSBsZW5ndGggZm9yIFFJQy0zMDEwIGFuZCBRSUMtMzAyMAotICB0YXBlcyAoZGVuc2l0aWVzIHdlcmUgc3dhcHBlZCkuCi0tIEZpeGVkIHdyb25nIGNhbGN1bGF0aW9uIG9mIG92ZXJzaG9vdCBvbiBzZWVrX2ZvcndhcmQ6IFdyb25nIHNpZ24KLSAgb2YgZXJyb3IuCi0tIFN1cHByZXNzIChmYWxzZSkgZXJyb3IgbWVzc2FnZSBkdWUgdG8gbmV3IHRhcGUgbG9hZGVkLgotLSBBZGRlZCB0d28gbmV3IENNUyBkcml2ZXMgKDExYzMgYW5kIDExYzUpIHRvIHZlbmRvcnMuaC4KLQotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAzYSwgMDkvMDUvOTUgPT09PT0KLQotLSBGaXhlZCBkaXNwbGF5IG9mIG9sZCBlcnJvciAoZXZlbiBpZiBhbHJlYWR5IGNsZWFyZWQpIGluIGZ0YXBlX29wZW4uCi0tIEltcHJvdmVkIHRhcGUgbGVuZ3RoIGRldGVjdGlvbiwgaW9jdGxzIHdvdWxkIGZhaWwgZm9yIDQyNSBmdCB0YXBlcy4KLSAgVW50aWwgdGhlIHRhcGUgbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIGhlYWRlcgotICBzZWdtZW50LCB3ZSdsbCB1c2Ugd29yc3QtY2FzZSB2YWx1ZXMuCi0tIENsZWFyIGVvZl9tYXJrIGFmdGVyIHJld2luZGluZyBpb2N0bHMuCi0tIEZpeGVkIHdyb25nIHZlcnNpb24gbWVzc2FnZSAoMi4wMyBoYWQgMi4wMmcgaWQpLgotLSBGaXhlZCBidWcgdGhhdCBjYXVzZWQgdGhlIGZkYyB0byBiZSByZXNldCB2ZXJ5IGZyZXF1ZW50bHkuCi0gIFRoaXMgc2hvdWxkbid0IGFmZmVjdCBub3JtYWwgb3BlcmF0aW9uIGJ1dCB0aGUgdGltaW5nIG9mIHRoZQotICByZXBvcnQgcm91dGluZXMgaGFzIGNoYW5nZWQgYWdhaW4gYW5kIHRoYXQgbWF5IGNhdXNlIHByb2JsZW1zLgotICBXZSdsbCBqdXN0IGhhdmUgdG8gZmluZCBvdXQuLi4uCi0tIEltcGxlbWVudGVkIGNvcnJlY3Qgd3JpdGUgcHJlY29tcGVuc2F0aW9uIHNldHRpbmcgZm9yIFFJQy0zMDEwLzMwMjAuCi0tIENsZWFuZWQgdXAgZmRjX2ludGVycnVwdF93YWl0IHJvdXRpbmUuIEhvcGUgaXQgc3RpbGwgd29ya3MgOi0pCi0tIEZpbmFsbHkgcmVtb3ZlZCAoYWxyZWFkeSBkaXNhYmxlZCkgc3BlY2lhbCBlb2YgbWFyayBoYW5kbGluZyBmb3IKLSAgZ251IHRhci4KLS0gQ2hhbmdlZCBvcmRlciBvZiBnZXRfZG1hX3Jlc2lkdWUgYW5kIGRpc2FibGVfZG1hIGluIGZkYy1pc3IuYwotICBiZWNhdXNlIHRoZSBjdXJyZW50IG9yZGVyIHdvdWxkIGZhaWwgb24gYXQgbGVhc3Qgb25lIHN5c3RlbS4KLSAgV2UncmUgYmFjayB0byB0aGUgb3JpZ2luYWwgb3JkZXIgYWdhaW4sIGhvcGUgKGFuZCBleHBlY3QpIHRoaXMKLSAgZG9lc24ndCBicmVhayBhbnkgb3RoZXIgc3lzdGVtLgotCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDMsIDA3LzA1Lzk1ID09PT09Ci0KLShDaGFuZ2VzIHJlZmVyIHRvIHRoZSBmaXJzdCBmdGFwZS0yLjAyIHJlbGVhc2UpCi0KLVN1cHBvcnQgZm9yIHdpZGUgYW5kIGV4dGVuZGVkIGxlbmd0aCB0YXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgQ29ubmVyIFRTTSA0MjAgYW5kIDg1MCBkcml2ZXMgYXJlIHJlcG9ydGVkIHRvIGJlIHdvcmtpbmcuCi1JIGhhdmVuJ3QgcmVjZWl2ZWQgYW55IHJlcG9ydHMgYWJvdXQgb3RoZXIgYnJhbmRzOyB0aGUgVFNNIDQyMAotYW5kIDg1MCBzZWVtIHRvIGJlIHRoZSBtb3N0IHdpZGVseSB1c2VkIHdpZGUgZHJpdmVzLgotRXh0ZW5kZWQgbGVuZ3RoIHRhcGVzICg0MjUgZnQpIHdpdGggbm9ybWFsIFFJQy04MCBkcml2ZXMKLWFyZSBvcGVyYXRpbmcgdG9vIChBdCBsZWFzdCBJJ3ZlIGhhZCBubyByZXBvcnRzIHN0YXRpbmcgb3RoZXJ3aXNlKS4KLV9Ob3RfIHlldCBjb21wbGV0ZWx5IHN1cHBvcnRlZCAoYWx0aG91Z2ggdGhleSBtYXkgd29yaykgYXJlCi1RSUMtMzAyMCBkcml2ZXMgYW5kIDIgTWJwcyBmbG9wcHkgZGlzayBjb250cm9sbGVycyB3b24ndCB3b3JrIGF0Ci10aGUgaGlnaGVzdCBzcGVlZC4KLUlmIHNvbWVvbmUgaXMga2luZCBlbm91Z2ggdG8gc2VuZCBtZSBvbmUgb2YgdGhlc2UsIEknbGwgaW5jbHVkZQotc3VwcG9ydCBmb3IgaXQgdG9vIDstKQotCi1FYXNpZXIgY29uZmlndXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVByb2JsZW1zIGR1ZSB0byB3cm9uZyBzZXR0aW5ncyBpbiB0aGUgTWFrZWZpbGUgYXJlIHByZXZlbnRlZAotYnkgdXNpbmcgYSBjb25maWd1cmF0aW9uIHNjcmlwdCB0aGF0IHNldHMgdGhlIG5lY2Vzc2FyeSAoa2VybmVsCi12ZXJzaW9uIGRlcGVuZGVudCkgY29tcGlsZSB0aW1lIG9wdGlvbnMuCi1UaGlzIGtlcm5lbCB2ZXJzaW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIHNvdXJjZXMgZm91bmQKLWF0IC91c3Ivc3JjL2xpbnV4LCBvciBpZiBub3QgZm91bmQsIHRoZSBvbGQgd2F5IHVzaW5nCi0vcHJvYy92ZXJzaW9uLgotVmVyc2lvbmVkIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkgd2hlbiBzdXBwb3J0ZWQKLWJ5LSBhbmQgY29uZmlndXJlZCBpbi0gdGhlIGtlcm5lbC4KLU5vdGUgdGhhdCB0aGUgY3VycmVudCBtb2R1bGVzIGNvZGUgKDEuMS44NykgaXMgc3RpbGwgYnJva2VuCi1hbmQgX25lZWRzXyB0aGUgZml4IGluY2x1ZGVkIGluIHRoZSBpbnNtb2QgZGlyZWN0b3J5LgotUGxlYXNlIGRvbid0IHNlbmQgbWUgYW55IG1vcmUgT29wcyByZXBvcnRzIGNhdXNlZCBieSBpbnNtb2QgOi0oCi0KLVJlZHVjZWQgbW9kdWxlIHNpemUKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBzdGFuZGFyZCBtb2R1bGUgc2l6ZSBpcyBtdWNoIHJlZHVjZWQgYW5kIHNvbWUgY29tcGlsZSB0aW1lCi1vcHRpb25zIGNhbiBldmVuIHJlZHVjZSBpdCBmdXJ0aGVyLiAoSSBkb24ndCByZWNvbW1lbmQgdGhpcwotZm9yIG5vcm1hbCB1c2UgYnV0IGl0IGNhbiBiZSBoYW5keSBmb3IgcmVzY3VlIGRpc2tldHRlcykKLQotT3B0aW9uOiAgICAgICAgICAgQXBwcm94LiBtb2R1bGUgc2l6ZToKLQotPHN0YW5kYXJkPiAgICAgICAgICAgICAxNTAgS2IKLU5PX1RSQUNFICAgICAgICAgICAgICAgMTI1IEtiCi1OT19UUkFDRV9BVF9BTEwgICAgICAgICA2NyBLYgotCi0KLU11Y2ggaW1wcm92ZWQgZHJpdmVyIGludGVycnVwdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Nb3N0IHBvc3NpYmxlIGxvb3BzIGhhdmUgYmVlbiBicm9rZW4gYW5kIHNpZ25hbCBkZXRlY3Rpb24KLWhhcyBiZWVuIGltcHJvdmVkLgotSW4gbW9zdCBjYXNlcyB0aGUgZHJpdmVyIGNhbiBiZSBhYm9ydGVkIGJ5IF5DIChTSUdJTlQpIGFuZAotU0lHS0lMTCAoa2lsbCAtOSkgd2lsbCBnZW5lcmF0ZSBiZSBhIHN1cmUga2lsbC4KLShOb3RlIHRoYXQgYWJvcnRpbmcgYSB0YXBlIG9wZXJhdGlvbiBtYXkgZGFtYWdlIHRoZSBsYXN0Ci1kYXRhIHdyaXR0ZW4gdG8gdGFwZSkKLQotSW1wcm92ZWQgZXJyb3IgcmVjb3ZlcnkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1GdGFwZSBub3cgcmV0dXJucyBhbiBlcnJvciAoRU5PREFUQSkgdG8gdGhlIGFwcGxpY2F0aW9uIGlmCi1hIHNlZ21lbnQgcHJvdmVzIHRvIGJlIHVucmVjb3ZlcmFibGUgYW5kIHRoZW4gc2tpcHMgdGhlCi1iYWQgc2VnbWVudC4KLVRoaXMgY2F1c2VzIG1vc3QgYXBwbGljYXRpb25zIHRvIGNvbnRpbnVlIHRvIHdvcmsgKHRhcgotYW5kIGFmaW8pIGxvb3Npbmcgb25seSBhIHNtYWxsIGFtb3VudCAodXAgdG8gMjkgS2IpIG9mIGRhdGEuCi1SZXRyaWVkIHJlYWQgb3BlcmF0aW9ucyB3aWxsIG5vdyBiZSBkb25lIHNsaWdodGx5IG9mZi10cmFjawotdG8gaW1wcm92ZSB0aGUgY2hhbmNlIG9mIHN1Y2Nlc3MuIFNlcmlvdXMgaGVhZCBvZmYtdHJhY2sKLWVycm9ycyB3aWxsIGJlIGRldGVjdGVkLgotCi1GQy0xMCBhbmQgRkMtMjAgY29udHJvbGxlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRnRhcGUgbm93IHN1cHBvcnRzIGJvdGggdGhlIG9sZCBDTVMgRkMtMTAgYW5kIHRoZSBuZXdlciBGQy0yMAotY29udHJvbGxlcnMuCi1CZWNhdXNlIHRoZSBvcGVyYXRpb24gb2YgdGhlc2UgY2FyZHMgaXMgc3RpbGwgdW5kb2N1bWVudGVkLAotdGh1cyBmYXIgdGhleSB3aWxsIG9ubHkgd29yayB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzIChTZWUKLU1ha2VmaWxlKS4gQW55IGZlZWQtYmFjayBvbiBob3cgdG8gdXNlIHRoZW0gd2l0aCBvdGhlciBzZXR0aW5ncwotd2lsbCBiZSB3ZWxjb21lICEKLUNvbXBpbGF0aW9uIHdpbGwgZmFpbCBpZiBvbmUgY2hhbmdlcyB0aGUgc2V0dGluZ3MgdG8gaWxsZWdhbAotdmFsdWVzLgotCi1LZXJuZWxzIGFuZCBjb21waWxlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRnRhcGUgaXMgY3VycmVudGx5IGJlaW5nIGRldmVsb3BlZCB1c2luZyB0aGUgMi41LjggY29tcGlsZXIuCi1UaGUgb2xkZXIgMi40LjUgcHJvYmFibHkgd29ya3MgdG9vIChTZXQgb3B0aW9uIGluIE1ha2VmaWxlISkuCi1JIGhhdmUgbm8gZXhwZXJpZW5jZSB3aXRoIGFueSBsYXRlciBjb21waWxlcnMgbm9yIEVsZiBzdXBwb3J0LgotQW55IGluZm9ybWF0aW9uIG9uIHRoaXMgaXMgd2VsY29tZS4KLVRoZSBsYXRlc3Qga2VybmVsIEkgaGF2ZSB0ZXN0ZWQgZnRhcGUgd2l0aCBpcyAxLjIuNi4KLQotQ29tcHJlc3Npb24KLS0tLS0tLS0tLS0tCi1BbiBpbXByZXNzaXZlIGNvbGxlY3Rpb24gb2YgY2hhbmdlcyBmb3IgZnRhcGUgaW5jbHVkaW5nCi1vbi10aGUtZmx5IGNvbXByZXNzaW9uIGlzIHN0aWxsIGx5aW5nIG9uIG15IGRlc2suCi1JZiAyLjAzIHByb3ZlcyB0byBiZSByZWxpYWJsZSBJIG1pZ2h0IHN0YXJ0IGludGVncmF0aW5nIHRoZXNlCi1idXQgYXMgdXN1YWwsIEknbSBzaG9ydCBpbiB0aW1lIDotKAotCi1Gb3JtYXR0aW5nCi0tLS0tLS0tLS0tCi1UaGVyZSBpcyBzdGlsbCBubyB3YXkgdG8gZm9ybWF0IHRhcGVzIHVuZGVyIExpbnV4LiBBcyBmYXIgYXMKLUkga25vdyBhbGwgYXR0ZW1wdHMgdG8gd3JpdGUgc3VjaCBhIHByb2dyYW0gaGF2ZSBkaWVkIG5vdy4KLVNpbmNlIGZvcm1hdHRlZCB0YXBlcyBhcmUgcmF0aGVyIGNvbW1vbiBub3csIEkgdGhpbmsgYWxsIHdlCi1uZWVkIGlzIGEgdXRpbGl0eSB0aGF0IHdyaXRlcyBhIHdvcnN0IGNhc2UgcGF0dGVybiBhbmQgdmVyaWZpZXMKLXRoYXQgd2l0aCB0aGUgZHJpdmUgcHV0IGluIHZlcmlmeSBtb2RlLCByZWR1Y2luZyBtYXJnaW5zLgotQW55IHRha2VycyA/Ci0KLUZ1cnRoZXJtb3JlCi0tLS0tLS0tLS0tLQotQ2xlYW5lZCB1cCBtZXNzYWdlcy4KLVByZXBhcmVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGFwZSBkcml2ZXMgb24gb25lIGZkYy4KLVRoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gc2VudCBidWcgcmVwb3J0cyBhbmQgaGVscGVkIG1lCi1pbXByb3ZlIHRoZSBkcml2ZXIuIFdpdGhvdXQgdHJ5aW5nIHRvIGJlIGNvbXBsZXRlIEknbGwgbWVudGlvbgotR2FyeSBBbmRlcnNvbiAod2l0aG91dCBoaXMgYWNjdXJhdGUgcmVwb3J0cyBhbmQgdW5yZWxpYWJsZQotaGFyZHdhcmUgdGhlcmUgd291bGRuJ3QgYmUgYSAyLjAzKSwgU3RlZmFuIEtuZWlmZWwgKEZDLTIwKSwKLVJvYmVydCBCcm91Z2h0b24gKEZDLTIwLCB5b3Ugd2VyZSBhbG1vc3QgdGhlcmUgOy0pLCBCam9ybgotRWt3YWxsIChmb3IgdGhlIHZlcnNpb25lZCBtb2R1bGVzIGFuZCBidWdneSBpbnNtb2QgOy0pLCBQZXRlcgotRm94LCBDaHJpc3RvcGhlciBPbGl2ZXIsIFJhbHBoIFdoaXR0YWtlciBhbmQgbm90IHRoZSBsZWFzdAotTGludXMgVG9ydmFsZHMgKGZvciBMaW51eCBhbmQga2VlcGluZyBtZSBidXN5IGJlY2F1c2Ugb2YKLWNoYW5nZXMgdG8gdGhlIGtlcm5lbCA7LSkKLVRoYW5rcyB0byBhbnlvbmUgSSBmb3Jnb3QsIGZvciB0aGUgYnVnIHJlcG9ydHMsIHRoZSBmdGFwZQotYmFzaGluZyBhbmQgdGhlIG1lbnRhbCBzdXBwb3J0Li4uCi0KLQotVGhhdCdzIGl0IGZvciBub3cuIEhhdmUgRnVuLAotCi1CYXMuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmcsIDA2LzA1Lzk1ID09PT09Ci0KLS0gQWRkZWQgZXh0cmEgdGVzdCB0byBicmVhayByZWFkLWlkIGxvb3Agd2l0aCBzaWduYWwuCi0tIENoYW5nZWQgcmV3aW5kIGNvZGUgdG8gaGFuZGxlIG5lZ2F0aXZlIG92ZXJzaG9vdCBmb3IgZHJpdmVzCi0gIHRoYXQgdGFrZSB2ZXJ5IGxvbmcgdG8gc3RhcnQgb3Igc3RvcC4KLS0gTGV0IHVzZSBvZiBnZXQvc2V0IGkvby1yZWdpb25zIGRlcGVuZCBvbiBrZXJuZWwgdmVyc2lvbi4KLS0gQ2hhbmdlZCBjb2RlIHRvIHVzZSBhIG1vcmUgZ2VuZXJhbCB0ZXN0IGZvciBjb25kaXRpb25hbAotICBjb21waWxhdGlvbnMgZGVwZW5kaW5nIG9uIGtlcm5lbCB2ZXJzaW9uLgotLSBJbXByb3ZlZCBtaWNyby1zdGVwIGZ1bmN0aW9uYWxpdHkgdG8gZ28gb2ZmLXRyYWNrIG9ubHkKLSAgd2hpbGUgcmVhZGluZyAoaWQgJiBkYXRhKS4KLS0gQWRkZWQgZmFpbHVyZSBvbiB0YXBlLW5vdC1yZWZlcmVuY2VkIGJpdCBpbiBmdGFwZV9jb21tYW5kLgotLSBBZGRlZCBGT1JFVkVSIG9wdGlvbiB0byByZWFkLXdhaXQgcm91dGluZS4KLS0gQ2hhbmdlZCByZWFkLWlkIHRvIHVzZSBzaG9ydGVyIHRpbWVvdXQgY2F1c2luZyBzbWFsbGVyCi0gIHJld2luZHMgb24gdGltZW91dC4KLS0gTWFkZSBrZXJuZWwtaW50ZXJmYWNlIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmYsIDAzLzA1Lzk1ID09PT09Ci0KLS0gQWRkZWQgc3VwcG9ydCBmb3IgZHVhbCB0YXBlIGRyaXZlcyBvbiBteSBzeXN0ZW0sIGV4dGVuZGVkIENvbmZpZ3VyZQotICBzY3JpcHQgdG8gZGV0ZWN0IGhvc3QgJ2RvZG8nLgotLSBMb2cgbWVkaWEgZGVmZWN0IGluIGhpc3RvcnkgaWYgZWNjIGZhaWxlZCBhbmQgbm8gZGF0YSB3YXMgcmV0dXJuZWQuCi0tIEZpeGVkIENvbmZpZ3VyZSBzY3JpcHQgdGhhdCB3YXMgZmFpbGluZyBmb3Iga2VybmVsIHZlcnNpb25zIHdpdGgKLSAgZG91YmxlIGRpZ2l0IHZlcnNpb24gb3IgcmV2aXNpb24gbnVtYmVycy4KLQotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyZSwgMDEvMDUvOTUgPT09PT0KLQotLSBGaXhlZCByZXBvc2l0aW9uIGxvb3AgYXQgbG9naWNhbCBlb3QgKGZhaWxpbmcgcmVhZF9pZCkuCi0tIEZpeGVkIDM0IHNlZ21lbnQgb2Zmc2V0IHdoZW4gcmV3aW5kaW5nLgotLSBBZGRlZCBmYXN0IHNlZWsgY2FwYWJpbGl0eSBmb3IgbW9yZSB0aGFuIDI1NSBzZWdtZW50cy4KLS0gRml4ZWQgd3JvbmcgYnVzeSByZXN1bHQgZnJvbSBmdGFwZV9jb21tYW5kIGNhdXNpbmcgcmV2ZXJzZQotICBzZWVrIHRvIGZhaWwuCi0tIEFkZGVkIGJyZWFrb3V0IGZyb20gaW5maW5pdGUgcmV3aW5kIGxvb3AgKGlmIHNvbWV0aGluZyBmYWlscykuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmQsIDMwLzA0Lzk1ID09PT09Ci0KLS0gSW1wcm92ZWQgYWJvcnRpb24gb24gc2lnbmFsczogSW50ZXJydXB0IHdpbGwgbWFrZSBhIGdyYWNlZnVsCi0gIGV4aXQsIEtpbGwgd2lsbCBiZSBsZXNzIG5pY2UgYW5kIHNob3VsZCBiZSB1c2VkIGlmIGV2ZXJ5dGhpbmcKLSAgZWxzZSBmYWlscy4KLS0gSW5jbHVkZWQgY2hlY2sgZm9yIHRhcGUtaGVhZCBvZmYgdHJhY2suCi0tIEltcGxlbWVudGVkIGV4aXQgZnJvbSB0YXBlLXN0YXJ0IGxvb3AuCi0tIEFkZGVkIGtlcm5lbCBpby1wb3J0IHJlZ2lzdHJhdGlvbi4KLS0gSW1wbGVtZW50ZWQgc2tpcCBvZiBmYWlsaW5nIHNlZ21lbnQgKEVOT0RBVEEpIG9uIGVjYyBmYWlsdXJlLgotICBUaGlzIGFsbG93cyBhZmlvIGFuZCB0YXIgdG8gY29udGludWUgd2hlbiB0aGUgdGFwZSBpcyBkYW1hZ2VkLgotLSBNYWRlIGRpc3RpbmN0aW9uIGJldHdlZW4gZHJpdmUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY29kZXMuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmMsIDIyLzA0Lzk1ID09PT09Ci0KLS0gRml4ZWQgdG9vIHRpZ2h0IGNvbW1hbmQgcXVldWVpbmcgYWZ0ZXIgdGFwZSBzdG9wL3BhdXNlIGNvbW1hbmQKLSAgaXNzdWVkIGZyb20gd2l0aGluIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKFNob3dlZCBhcyB0aW1lb3V0Ci0gIG9uIEFja25vd2xlZGdlIGVycm9ycyBkdXJpbmcgcmV0cmllcyBvbiBzb21lIHN5c3RlbXMpCi0tIFRyaWVkIHRvIGZpeCB0aW1lb3V0cyB3aGVuIHVzaW5nIDQyNSBmdCB0YXBlIGJlY2F1c2UgdGhlIGV4dGVuZGVkCi0gIGxlbmd0aCBkb2Vzbid0IHNlZW0gdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGhhcmR3YXJlLgotICBXZSBub3cgdXNlIHRoZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBoZWFkZXIgc2VnbWVudCBzbyBhZGp1c3QgdGhlCi0gIHRpbWluZyBhZnRlciByZWFkaW5nIHRoZSBoZWFkZXIgc2VnbWVudC4KLS0gRml4ZWQgc29tZSBtZXNzYWdlcyBzdGF0aW5nICd1bmV4cGVjdGVkIHNvbWV0aGluZy4uLicgYmVpbmcgbm90Ci0gIHVuZXhwZWN0ZWQgYW55bW9yZS4KLS0gU3RhcnRlZCBwcmVwYXJhdGlvbnMgZm9yIG1lcmdlIG9mIGR5bmFtaWMgYnVmZmVyIGFsbG9jYXRpb24gYW5kCi0gIGNvbXByZXNzaW9uIGNvZGUuCi0tIENoYW5nZWQgc29tZSBkZWJ1ZyBtZXNzYWdlcyB0byBpbmNsdWRlIHJlbGV2YW50IHNlZ21lbnQgaW5mb3JtYXRpb24KLSAgYXQgbGV2ZWwgNC4KLS0gSW5jbHVkZWQgZWFybHkgYmFpbC1vdXQgd2hlbiBkcml2ZSBvZmZsaW5lLCBwcmV2ZW50aW5nIGEgbG90IG9mCi0gIGZhbHNlIG1lc3NhZ2VzLgotLSBNb3ZlZCBmdGFwZV9wYXJhbWV0ZXJfeHh4KCkgb2Zmc2V0cyBpbnRvIGZ1bmN0aW9uIGluc3RlYWQgb2YgaW4gY2FsbHMuCi0tIFJlbW92ZWQgJ3dlaXJkLCBkcml2ZSBidXN5IGJ1dCBubyBkYXRhJyBlcnJvciB3aGVuIGNhdXNlZCBieQotICBhbiBlcnJvciBkdXJpbmcgYSByZWFkLWlkLgotLSBJbXByb3ZlZCAndGltZW91dCBvbiBhY2tub3dsZWRnZScgZGlhZ25vc3RpY3MuCi0tIE1vdmVkIE1PRFVMRSBvcHRpb24gaW50byBDb25maWd1cmUuCi0tIFJlZHVjZWQgY29kZSBzaXplIHdoZW4gbm8gdHJhY2luZyBhdCBhbGwgd2FzIHNldCAoQ2xhdXMgSGVpbmUpLgotLSBObyBsb25nZXIgbG9nIGVycm9yIGNvZGUgMCAobm8gZXJyb3IpIGFzIGFuIGVycm9yLgotCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJiLCAwOS8wNC85NSA9PT09PQotCi0tIFJlbGF4ZWQgdGltaW5nIGZvciBzdGF0dXMgb3BlcmF0aW9uIGFuZCBkaXNwbGF5aW5nCi0gIGFibm9ybWFsIHJlc3VsdHMuIEhvcGVmdWxseSB0aGlzIHNob3dzIHdoYXQncyBnb2luZwotICB3cm9uZyB3aXRoIHRoZSBDb25uZXIgVFNNODUwUiBkcml2ZXMuCi0tIENyZWF0ZWQgc2NyaXB0IGZvciBjb25maWd1cmF0aW9uLCB1c2luZyB2ZXJzaW9uIG51bWJlcgotICBvZiBrZXJuZWwgc291cmNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIC9wcm9jL3ZlcnNpb24uCi0tIEZpeGVkIGNvbmRpdGlvbmFscyBpbiBrZXJuZWwtaW50ZXJmYWNlLmMuCi0tIFJlbW92ZWQgdW5hdm9pZGFibGUgVFJBQ0Ugb3V0cHV0LgotCi0KLT09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJhLCAwMS8wNC85NSA9PT09PQotCi0tIEltcGxlbWVudGVkIGBuZXctc3R5bGUnICh2ZXJzaW9uZWQpIG1vZHVsZXMgc3VwcG9ydCBmb3IgbmV3Ci0gIGtlcm5lbHMuCi0tIFJlZHVjZWQgc2l6ZSBvZiBtb2R1bGUgYnkgbW92aW5nIHN0YXRpYyBkYXRhIHRvIGJzcy4KLS0gTm93IHVzaW5nIHZlcnNpb24gbnVtYmVyIG9mIGtlcm5lbCBzb3VyY2UgaW5zdGVhZCBvZiBydW5uaW5nCi0gIGtlcm5lbCBmb3Iga2VybmVsIHZlcnNpb25zID49IDEuMS44MgotLSBBZGRlZCBmZWVkYmFjayBvbiBkcml2ZSBzcGVlZHMgdG8gdmVuZG9yIGluZm9ybWF0aW9uLgotLSBJbmNsdWRlZCBmaXhlZCBpbnNtb2Qgc291cmNlcyB0byBkaXN0cmlidXRpb24gKExldCdzIGhvcGUKLSAgdGhlIG1vZHVsZXMgZGlzdHJpYnV0aW9uIGdldCBmaXhlZCBzb29uIDotLykuCi0KLU5vdGUgdGhhdCBJIGhhdmVuJ3QgeWV0IGltcGxlbWVudGVkIGFueSBvZiB0aGUgY29kZSBleHRlbnNpb24gSQotcmVjZWl2ZWQuIEkgaG9wZSB0byBmaW5kIHNvbWUgdGltZSB0byBkbyB0aGlzIHNvb24uCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMiwgMTUvMDEvOTUgPT09PT0KLQotCi0tIEZpeGVkIGZhaWxpbmcgcmVwb3NpdGlvbmluZyB3aGVuIG92ZXJzaG9vdCB3YXMgaW5jcmVtZW50ZWQuCi0tIEZpeGVkIHJhdGUgc2VsZWN0aW9uOiBCZWNhdXNlIG9mIGEgZGVmaWNpZW5jeSBpbiB0aGUgUUlDLTExNwotICBzcGVjaWZpY2F0aW9uIG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG5vdCBpbXBsZW1lbnRlZAotICBhbmQgYSBmYWlsaW5nIGNvbW1hbmQuIFRoZXJlZm9yIHdlIG5vdyB0cnkgdG8gZmluZCBvdXQgaWYgdGhlCi0gIGRyaXZlIGRvZXMgc3VwcG9ydCB0aGlzIGNvbW1hbmQgYmVmb3JlIHVzYWdlLgotLSBGaXhlZCBlcnJvciByZXRyeSB1c2luZyB3cm9uZyBvZmZzZXQgaW4gZmRjLWlzci4KLS0gSW1wcm92ZWQgcmV0cnkgY29kZSB0byByZXRyeSBvbmx5IG9uY2Ugb24gYSBzaW5nbGUgbm8tZGF0YQotICBlcnJvciBpbiBhIHNlZ21lbnQuCi0tIFZhbGlkYXRlIHNlY3RvciBudW1iZXIgZXh0cmFjdGVkIGZyb20gZW9mIG1hcmsgYmVjYXVzZSBhbgotICBpbnZhbGlkIGZpbGUgbWFyayAoZHVlIHRvID8/PykgY291bGQgY2F1c2Uga2VybmVsIHBhbmljLgotLSBTcGxpdCBmdGFwZS1pby5jIGludG8gZnRhcGUtaW8uYyBhbmQgZnRhcGUtY3RsLmMgZmlsZXMuCi0tIENvcnJlY3RlZCB0b28gaGlnaCBtZWRpYSBlcnJvciBjb3VudCBhZnRlciB3cml0aW5nIHRvCi0gIGEgYmFkIHRhcGUuCi0tIEFkZGVkICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPiBhZ2FpbiBiZWNhdXNlIG9sZCBrZXJuZWwgdmVyc2lvbnMKLSAgbmVlZCBpdC4KLS0gRml4ZWQgZmRjIG5vdCBiZWluZyBkaXNhYmxlZCB3aGVuIG9wZW4gZmFpbGVkIGJlY2F1c2Ugbm8gdGFwZQotICBkcml2ZSB3YXMgZm91bmQuCi0tIEZpeGVkIHByb2JsZW0gd2l0aCBzb2Z0IGVycm9yIGluIHNlY3RvciAzMiAoc2hpZnQgb3BlcmF0b3Igd2l0aAotICBzaGlmdGNvdW50IDMyIGlzIG5vdCBkZWZpbmVkKS4KLQotCi09PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAxLCAwOC8wMS85NSA9PT09PQotCi0KLS0gUmVtb3ZlZCBURVNUSU5HIHNldHRpbmcgZnJvbSBkaXN0cmlidXRlZCBNYWtlZmlsZS4KLS0gRml4ZWQgYG10IGFzZicgZmFpbHVyZTogUmV3aW5kIHdhcyBkZWZlcnJlZCB0byBjbG9zZSB3aGljaAotICBvdmVycnVsZWQgdGhlIGZzZiBpb2N0bC4KLS0gUHJldmVudGVkIG5vbi1pbnRlcnJ1cHRpYmxlIGNvbW1hbmRzIGJlaW5nIGludGVycnVwdGVkLgotLSBBZGRlZCBtaXNzaW5nIHRpbWVvdXQucGF1c2Ugc2V0dGluZy4KLS0gTWF4aW11bSB0YXBlIHNwZWVkIHJlYWQgZnJvbSBkcml2ZSB0eXBlIGluZm9ybWF0aW9uIHRhYmxlLgotICBJZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSB0YWJsZSAoMCkgdGhlIGRyaXZlIHdpbGwKLSAgZGV0ZXJtaW5lIHRoZSBzcGVlZCBpdHNlbGYgYW5kIHB1dCBhIG1lc3NhZ2UgaW4gdGhlIGxvZ2ZpbGUuCi0gIFRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIHRoZW4gYmUgYWRkZWQgdG8gdGhlIHRhYmxlIGluIHRoZQotICB2ZW5kb3JzLmggZmlsZSAoYW5kIHJlcG9ydGVkIHRvIG1lKS4KLS0gQWRkZWQgY2FsbCB0byBmdGFwZV9pbml0X2RyaXZlIGFmdGVyIHNvZnQgcmVzZXQgZm9yIHRob3NlCi0gIChhbnRpcXVlKSBkcml2ZXMgdGhhdCBkb24ndCBkbyBhbiBpbXBsaWNpdCBzZWVrX2xvYWRfcG9pbnQKLSAgYWZ0ZXIgYSByZXNldCBvciBwb3dlciB1cC4KLS0gRG9uJ3QgdHJ5IHRvIHNldCBkYXRhIHJhdGUgaWYgcmVzZXQgZmFpbGVkLgotLSBQcmV2ZW50IHVwZGF0ZSBvZiBzZWVrIHZhcmlhYmxlcyB3aGVuIHN0YXJ0aW5nIGZyb20gdGhlCi0gIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIHRoZSB0YXBlLgotLSBGaXhlZCB3cm9uZyBhZGp1c3RtZW50IG9mIG92ZXJzaG9vdCBpbiBzZWVrX2ZvcndhcmQoKS4KLS0gQWRkZWQgc3luYyB0byBNYWtlZmlsZSAoYWdhaW4pLgotLSBBZGRlZCBjb2RlIHRvIGRpYWdub3NlIHRpbWVyIHByb2JsZW1zIChjYWxpYnIuYykuCi0tIFJlcGxhY2VkIHRpbWUgZGlmZmVyZW5jZXMgYnkgdGltZWRpZmYgY2FsbHMuCi0tIFJlbW92ZWQgcmVmZXJlbmNlIHRvIGRvX2Zsb3BweSBmcm9tIG9iamVjdCBmb3IgcmVjZW50IGtlcm5lbHMuCi0tIEZpeGVkIHdyb25nIGRpc3BsYXkgb2YgJ2ZhaWxpbmcgZG1hIGNvbnRyb2xsZXInIG1lc3NhZ2UuCi0tIFJlbW92ZWQgdmFyaW91cyBubyBsb25nZXIgdXNlZCAjaW5jbHVkZSBzdGF0ZW1lbnRzLgotLSBBZGRlZCBtYXguIHRhcGUgc3BlZWQgdmFsdWUgdG8gdmVuZG9yLXN0cnVjdC4KLS0gQ2hhbmdlZCBmdGFwZS1jb21tYW5kIHRvIGNoZWNrIHByZS1jb25kaXRpb25zIGFuZCB3YWl0Ci0gIGlmIG5lZWRlZC4KLS0gRnVydGhlciB1cGRhdGVkIHFpYzExNy5oIHRvIHJldiBHLgotLSBDb21iaW5lZCBjb21tYW5kIG5hbWUgdGFibGUgYW5kIHJlc3RyaWN0aW9ucyB0YWJsZSB0byBvbmUuCi0gIEV4dGVuZGVkIHRoaXMgdGFibGUgd2l0aCBzb21lIG5ldyBmaWVsZHMuCi0tIEluY3JlYXNlZCB0aW1lb3V0IG9uIEFjayB0aW1lciB2YWx1ZSBhbmQgaW5jbHVkZWQgY29kZSB0bwotICByZXBvcnQgb3V0IG9mIHNwZWMgYmVoYXZpb3VyLgotLSBJbmNyZWFzZWQgcmV3aW5kIHRpbWVvdXQgbWFyZ2luIHRvIGNhbGN1bGF0ZWQgKyAyMCUuCi0tIEltcHJvdmVkIGRhdGEgcmF0ZSBzZWxlY3Rpb24gc28gaXQgd29uJ3QgZmFpbCBvbiBzb21lCi0gIG9sZGVyIChwcmUgc3RhbmRhcmQpIGRyaXZlcy4KLS0gQ2hhbmdlZCBpbml0aWFsaXNhdGlvbiBjb2RlIHNvIGRyaXZlIHdpbGwgYmUgcmV3b3VuZCBpZiB0aGUKLSAgZHJpdmVyIGlzIHJlbG9hZGVkIGFuZCB0aGUgdGFwZSBpcyBub3QgYXQgYm90LgotLSBNb3ZlZCBzb21lIG9mIHRoZSBmbHVzaCBvcGVyYXRpb25zIGZyb20gY2xvc2UgdG8gdGhlIGlvY3Rscy4KLS0gQWRkZWQgZXhpdCBjb2RlIHZhbHVlIHRvIGZhaWxpbmcgdmVyaWZ5IGFyZWEgbWVzc2FnZS4KLS0gTG9vcCB1bnRpbCB0YXBlIGhhbHRlZCBpbiBzbWFydC1zdG9wLgotLSBGYXN0IHNlZWsgaGFuZGxlZCBzcGVjaWFsbHkgaWYgbG9jYXRlZCBhdCBib3Qgb3IgZW90LgotLSBCZWluZyBtb3JlIGNvbnNlcnZhdGl2ZSBvbiBvdmVyc2hvb3QgdmFsdWUuCi0KLQotPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMCwgMzEvMTIvOTQgPT09PT0KLQotICBUaGUgSW5zdGFsbC1ndWlkZSBpcyBjb21wbGV0ZWx5IHJld3JpdHRlbiBhbmQgbm93IGFsc28gaW5jbHVkZXMKLXNvbWUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgZHJpdmVyLiBJZiB5b3UncmUgZWl0aGVyIG5ldwotdG8gZnRhcGUgb3IgbmV3IHRvIFVuaXggdGFwZSBkZXZpY2VzIG1ha2Ugc3VyZSB0byByZWFkIGl0ICEKLQotICBJZiB5b3Ugb3duIGEgcGNpIHN5c3RlbSBhbmQgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoZQotZnRhcGUgZHJpdmVyIG1ha2Ugc3VyZSB0byByZWFkIHRoZSBSRUFETUUuUENJIGZpbGUuIEl0IGNvbnRhaW5zCi1zb21lIGhpbnRzIG9uIGhvdyB0byBmaXggeW91ciBoYXJkd2FyZS4KLQotICBGb3IgYW55Ym9keSB3aG8gaGFzbid0IG5vdGljZWQ6IFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKLWRyaXZlciBoYXMgYmVlbiBpbmNyZW1lbnRlZCAoVGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uIGhhcwotYmVlbiB2ZXJzaW9uIDEuMTRkKS4KLSAgVGhpcyBoYXMgYmVlbiBkb25lIGZvciB0d28gbWFqb3IgcmVhc29uczoKLQotICBvICBBIG5ldyAoYmV0dGVyKSBlcnJvciByZWNvdmVyeSBzY2hlbWUgaXMgaW1wbGVtZW50ZWQuCi0gIG8gIFN1cHBvcnQgZm9yIG5ldyBkcml2ZSB0eXBlcyBoYXMgYmVlbiBhZGRlZC4KLQotICBBbGwgdGhlc2UgaW1wcm92ZW1lbnRzL2NoYW5nZXMgd2lsbCBwcm9iYWJseSBpbmNsdWRlIGEgY291cGxlCi1vZiBuZXcgKGFuZCBvbGQ/KSBidWdzLiBJZiB5b3UgZW5jb3VudGVyIGFueSBwcm9ibGVtcyB0aGF0IHlvdSB0aGluawotSSdtIG5vdCB5ZXQgYXdhcmUgb2YsIGZlZWwgZnJlZSB0byBzZW5kIGEgcmVwb3J0IHRvIDxiYXNAdmltZWMubmw+LgotICBJIHJlY29tbWVuZCBrZWVwaW5nIGEgdmVyc2lvbiBvZiBmdGFwZS0xLjE0ZCBhdmFpbGFibGUsIGp1c3QKLWluIGNhc2UgOy0pCi0KLSAgVGhpcyB2ZXJzaW9uIHNob3VsZCB3b3JrIHdpdGggYWxsIGtlcm5lbCB2ZXJzaW9ucyBmcm9tIDEuMC45IHVwCi10byAxLjEuNzIgKGFuZCBwcm9iYWJseSBlYXJsaWVyIGFuZCBsYXRlciB2ZXJzaW9ucyB0b28pLgotCi0KLU1ham9yIG5ldyBmZWF0dXJlczoKLQotLSBCZXR0ZXIgaGFuZGxpbmcgb2YgdGFwZXMgd2l0aCBkZWZlY3RzOiBXaGVuIGEgc2VjdG9yIHJlcGVhdGVkbHkKLSAgKFNPRlRfUkVUUklFUyBpbiBmdGFwZS5oKSBjYW5ub3QgYmUgd3JpdHRlbiB0byBvciByZWFkIGZyb20gaXQgaXMKLSAgbWFya2VkIGFzIGFuIGhhcmQgZXJyb3IgYW5kIGdldHMgc2tpcHBlZC4KLSAgVGhlIGVycm9yIGNvcnJlY3Rpb24gY29kZSBjYW4gaGFuZGxlIHVwIHRvIHRocmVlIG9mIHRoZXNlIGhhcmQKLSAgZXJyb3JzIHByb3ZpZGVkIHRoZXJlIGFyZSBubyBvdGhlciBlcnJvcnMgaW4gdGhhdCBzZWdtZW50ICgzMiBLYikuCi0gIAotLSBBbGxvd3Mgd3JpdGluZyB0byB0YXBlcyB3aXRoIGRlZmVjdHMgKGFsdGhvdWdoIHRoZSByaXNrIG9mIGxvb3NpbmcKLSAgZGF0YSBpbmNyZWFzZXMgISkKLSAgTG9vayBmb3IgdGhlIG1lZGlhLWRlZmVjdHMgZW50cnkgcHJpbnRlZCB3aXRoIHRoZSBzdGF0aXN0aWNzIHdoZW4KLSAgdGhlIHRhcGUgaXMgY2xvc2VkLiBBIG5vbi16ZXJvIHZhbHVlIGhlcmUgc2hvd3MgYSBiYWQgdGFwZS4KLSAgW3RoZSBhY3R1YWwgY291bnQgaXMgd3JvbmcgKHRvbyBoaWdoKSwgdGhpcyBpcyBhIGtub3duIGJ1Z10uCi0KLS0gVXNlIG9mIGJhY2t1cCBoZWFkZXIgc2VnbWVudCBpZiBmaXJzdCBvbmUgaXMgZmFpbGluZy4KLQotLSBTdXBwb3J0IGZvciBleHRlbmRlZCBsZW5ndGggdGFwZXMgd2l0aCBRSUMtODA6IGJvdGggNDI1IGFuZCAxMTAwIGZ0LgotICAwLjI1IGluY2ggdGFwZXMgYXJlIG5vdyByZWNvZ25pemVkIGFuZCBoYW5kbGVkLgotCi0tIFN1cHBvcnQgZm9yIG5ldyBRSUMtODAgZHJpdmVzIHdpdGggOCBtbSBgd2lkZScgdGFwZXMgKGUuZy4gQ29ubmVyCi0gIFRTTSA0MjApLgotCi0tIFN1cHBvcnQgZm9yIG5ldyBRSUMtMzAxMCBhbmQgUUlDLTMwMjAgZHJpdmVzIChleHBlcmltZW50YWwpIHdpdGgKLSAgYm90aCAwLjI1IGluY2ggYW5kIDggbW0gdGFwZXMuCi0KLVNvbWUgbWlub3IgZmVhdHVyZXMgd2VyZSBhZGRlZCwgYSBjb3VwbGUgb2Ygc21hbGwgYnVncyB3ZXJlIGZpeGVkIGFuZAotcHJvYmFibHkgc29tZSBuZXcgb25lcyBpbnRyb2R1Y2VkIDstKS4KLQotW2xzZWVrKCkgZGlkbid0IG1ha2UgaXQgaW50byB0aGlzIHZlcnNpb25dCi0KLUhhdmUgZnVuLAotCi1CYXMuCi0tLS0tCi0gTG9jYWxXb3JkczogIGZ0YXBlIE1DT05GSUcgbXQgVkZTIHpmdGFwZSByZXNwIHNmdGFwZSBwcm9jIHN1YmRpciBNVElPQ1ZPTElORk8KLSBMb2NhbFdvcmRzOiAgTVRJT0NHRVRTSVpFIEJPVCBFT0QgTVRCU0YgemZ0IGtlcm5lbGQgbW9kcHJvYmUga2R0aW1lIGNvbnRyaWIgVFIKLSBMb2NhbFdvcmRzOiAgTVRTRVRCTEsgYWZpbyB1bmluc3RhbGwgdGV4aSB3d3cgRUlPIFFJQyBpbml0IHNmdCBlb2YgYWthIGRtYSBHQgotIExvY2FsV29yZHM6ICBTSUdLSUxMIE1USU9DRlRDTUQgbW1hcCBJb21lZ2EgRkRDIGZkYyBpbyBnbnVtdCBtdGlvIGZjIGFzbSBpbmIKLSBMb2NhbFdvcmRzOiAgb3V0YiBmdCBxaWMgZnJvbnRlbmQgVGVYaW5mbyBpcnEgbWFjaCBNT0RWRVJTSU9OUyBDT05GSUcgaHRtbCBkdmkKLSBMb2NhbFdvcmRzOiAgdXNyIGRvYyBTTVAgTWIgRHVubm8gRklYTUUgdnRibGMgcGVybCBsaXN0dGFwZSB2b2xpbmZvIGZzZiBNVFdFT0YKLSBMb2NhbFdvcmRzOiAgYW1hbmRhIGRlZ2F1c3NlZCBDb21CeXRlIERvdWJsZVBsYXkgd2hyYXZlbiBuamFja24gY29tIE1USU9DIHZ0YmwKLSBMb2NhbFdvcmRzOiAgR0VUQkxLU1ogTUFLRURFViB6ZnRhcGUncyBsaW51eCBkaWYgQ1ZTIFJldmlzb24gY3AgTVRSRVcgTVRPRkZMCi0gTG9jYWxXb3JkczogIE1URlNGIEJTRiBNYXJjaW4gRGFsZWNraSBHQ0MgQ29uZmlnIGNwaW8gc3dhcG91dCBLYWkgSGFycmVraWxkZQotIExvY2FsV29yZHM6ICBQZWRlcnNvbiBraHAgZG9scGhpbmljcyBKdXN0dXMgY2xhdXMgbW9tbyByd3RoIGFhY2hlbiBMYWFyaG92ZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYmQ2YzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jCi0jICAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSMKLSMgJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUsdiAkCi0jICRSZXZpc2lvbjogMS4xICQKLSMgJERhdGU6IDE5OTcvMTAvMDUgMTk6MTI6MjggJAotIwotIyAgICAgIE1ha2VmaWxlIGZvciB0aGUgb3B0aW9uYWwgY29tcHJlc3NvciBmb3IgdGggemZ0YXBlIFZGUwotIyAgICAgIGludGVyZmFjZSB0byB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yCi0jICAgICAgTGludXguCi0jCi0KLW9iai0kKENPTkZJR19aRlRfQ09NUFJFU1NPUikgKz0gemZ0LWNvbXByZXNzb3IubwotCi16ZnQtY29tcHJlc3Nvci1vYmpzIDo9IHpmdGFwZS1jb21wcmVzcy5vIGx6cnczLm8KLQotQ0ZMQUdTX2x6cnczLm8JOj0gLU82IC1mdW5yb2xsLWFsbC1sb29wcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzJhMGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYworKysgL2Rldi9udWxsCkBAIC0xLDc0MyArMCwwIEBACi0vKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4xICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjI5ICQKLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBSb3NzIFdpbGxpYW1zIGx6cnczIGFsZ29yaXRobS4gQWRhcHRpb24gZm9yIHpmdGFwZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIi4uL2NvbXByZXNzb3IvbHpydzMuaCIgICAgICAgLyogRGVmaW5lcyBzaW5nbGUgZXhwb3J0ZWQgZnVuY3Rpb24gImNvbXByZXNzIi4gICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFpSVzMuQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBBdXRob3IgIDogUm9zcyBXaWxsaWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRGF0ZSAgICA6IDMwLUp1bi0xOTkxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlbGVhc2UgOiAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIExaUlczIGRhdGEgY29tcHJlc3Npb24gICAgICAgICAqLwotLyogYWxnb3JpdGhtIGluIEMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgYWxnb3JpdGhtIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0aGF0IHJ1bnMgZmFzdCAgICAqLwotLyogYW5kIGdpdmVzIHJlYXNvbmFibGUgY29tcHJlc3Npb24uIFRoZSBhbGdvcml0aG0gaXMgYSBtZW1iZXIgb2YgdGhlIExlbXBlbCAgKi8KLS8qIFppdiBmYW1pbHkgb2YgYWxnb3JpdGhtcyBhbmQgYmFzZXMgaXRzIGNvbXByZXNzaW9uIG9uIHRoZSBwcmVzZW5jZSBpbiB0aGUgICovCi0vKiBkYXRhIG9mIHJlcGVhdGVkIHN1YnN0cmluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYWxnb3JpdGhtIGlzIHVucGF0ZW50ZWQgYW5kIHRoZSBjb2RlIGlzIHB1YmxpYyBkb21haW4uIEFzIHRoZSAgICAgICAgICovCi0vKiBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIExaNzcgY2xhc3Mgb2YgYWxnb3JpdGhtcywgaXQgaXMgdW5saWtlbHkgdG8gYmUgICAqLwotLyogdGhlIHN1YmplY3Qgb2YgYSBwYXRlbnQgY2hhbGxlbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBVbmxpa2UgdGhlIExaUlcxIGFuZCBMWlJXMS1BIGFsZ29yaXRobXMsIHRoZSBMWlJXMyBhbGdvcml0aG0gaXMgICAgICAgICAgICAqLwotLyogZGV0ZXJtaW5pc3RpYyBhbmQgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCB0aGUgc2FtZSBjb21wcmVzc2VkICAgICAgICAgICAgICAgKi8KLS8qIHJlcHJlc2VudGF0aW9uIGZvciBhIGdpdmVuIGZpbGUgZWFjaCB0aW1lIGl0IGlzIHJ1bi4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIExaUlczIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgKi8KLS8qIGJ5IFJvc3MgV2lsbGlhbXMgb24gMzEtRGVjLTE5OTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSGVyZSBhcmUgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhpcyBjb2RlLCBjb21waWxlZCB1bmRlciBUSElOSyBDIDQuMCAgICAgKi8KLS8qIGFuZCBydW5uaW5nIG9uIGEgTWFjLVNFICg4TUh6IDY4MDAwKSwgdG8gdGhlIHN0YW5kYXJkIGNhbGdhcnkgY29ycHVzLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKi8KLS8qICAgIHwgREFUQSBDT01QUkVTU0lPTiBURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCi0vKiAgICB8ID09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLwotLyogICAgfCBUaW1lIG9mIHJ1biAgICAgOiBTdW4gMzAtSnVuLTE5OTEgMDk6MzFQTSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KLS8qICAgIHwgVGltaW5nIGFjY3VyYWN5IDogT25lIHBhcnQgaW4gMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCi0vKiAgICB8IENvbnRleHQgbGVuZ3RoICA6IDI2MjE0NCBieXRlcyAoPSAyNTYuMDAwMEspICAgICAgICAgICAgICAgICAgIHwgICAgICAqLwotLyogICAgfCBUZXN0IHN1aXRlICAgICAgOiBDYWxnYXJ5IENvcnB1cyBTdWl0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KLS8qICAgIHwgRmlsZXMgaW4gc3VpdGUgIDogMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCi0vKiAgICB8IEFsZ29yaXRobSAgICAgICA6IExaUlczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLwotLyogICAgfCBOb3RlOiBBbGwgYXZlcmFnZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgdW4tcm91bmRlZCB2YWx1ZXMuICB8ICAgICAgKi8KLS8qICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICovCi0vKiAgICB8IEZpbGUgTmFtZSAgIExlbmd0aCAgQ3hCICBDb21MZW4gICVSZW1uICBCaXRzICBDb20gSy9zICBEZWMgSy9zIHwgICAgICAqLwotLyogICAgfCAtLS0tLS0tLS0tICAtLS0tLS0gIC0tLSAgLS0tLS0tICAtLS0tLSAgLS0tLSAgLS0tLS0tLSAgLS0tLS0tLSB8ICAgICAgKi8KLS8qICAgIHwgcnB1czpCaWIuRCAgMTExMjYxICAgIDEgICA1NTAzMyAgIDQ5LjUgIDMuOTYgICAgMTkuNDYgICAgMzIuMjcgfCAgICAgICovCi0vKiAgICB8IHVzOkJvb2sxLkQgIDc2ODc3MSAgICAzICA0Njc5NjIgICA2MC45ICA0Ljg3ICAgIDE3LjAzICAgIDMxLjA3IHwgICAgICAqLwotLyogICAgfCB1czpCb29rMi5EICA2MTA4NTYgICAgMyAgMzE3MTAyICAgNTEuOSAgNC4xNSAgICAxOS4zOSAgICAzNC4xNSB8ICAgICAgKi8KLS8qICAgIHwgcnB1czpHZW8uRCAgMTAyNDAwICAgIDEgICA4MjQyNCAgIDgwLjUgIDYuNDQgICAgMTEuNjUgICAgMTguMTggfCAgICAgICovCi0vKiAgICB8IHB1czpOZXdzLkQgIDM3NzEwOSAgICAyICAyMDU2NzAgICA1NC41ICA0LjM2ICAgIDE3LjE0ICAgIDI3LjQ3IHwgICAgICAqLwotLyogICAgfCBwdXM6T2JqMS5EICAgMjE1MDQgICAgMSAgIDEzMDI3ICAgNjAuNiAgNC44NSAgICAxMy40MCAgICAxOC45NSB8ICAgICAgKi8KLS8qICAgIHwgcHVzOk9iajIuRCAgMjQ2ODE0ICAgIDEgIDExNjI4NiAgIDQ3LjEgIDMuNzcgICAgMTkuMzEgICAgMzAuMTAgfCAgICAgICovCi0vKiAgICB8IHM6UGFwZXIxLkQgICA1MzE2MSAgICAxICAgMjc1MjIgICA1MS44ICA0LjE0ICAgIDE4LjYwICAgIDMxLjE1IHwgICAgICAqLwotLyogICAgfCBzOlBhcGVyMi5EICAgODIxOTkgICAgMSAgIDQ1MTYwICAgNTQuOSAgNC40MCAgICAxOC40NSAgICAzMi44NCB8ICAgICAgKi8KLS8qICAgIHwgcnB1czpQaWMuRCAgNTEzMjE2ICAgIDIgIDEyMjM4OCAgIDIzLjggIDEuOTEgICAgMzUuMjkgICAgNTEuMDUgfCAgICAgICovCi0vKiAgICB8IHVzOlByb2djLkQgICAzOTYxMSAgICAxICAgMTk2NjkgICA0OS43ICAzLjk3ICAgIDE4Ljg3ICAgIDMwLjY0IHwgICAgICAqLwotLyogICAgfCB1czpQcm9nbC5EICAgNzE2NDYgICAgMSAgIDI4MjQ3ICAgMzkuNCAgMy4xNSAgICAyNC4zNCAgICA0MC42NiB8ICAgICAgKi8KLS8qICAgIHwgdXM6UHJvZ3AuRCAgIDQ5Mzc5ICAgIDEgICAxOTM3NyAgIDM5LjIgIDMuMTQgICAgMjMuOTEgICAgMzkuMjMgfCAgICAgICovCi0vKiAgICB8IHVzOlRyYW5zLkQgICA5MzY5NSAgICAxICAgMzM0ODEgICAzNS43ICAyLjg2ICAgIDI1LjQ4ICAgIDQwLjM3IHwgICAgICAqLwotLyogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKi8KLS8qICAgIHwgQXZlcmFnZSAgICAgMjI0NDAxICAgIDEgIDExMDk1MyAgIDUwLjAgIDQuMDAgICAgMjAuMTcgICAgMzIuNzIgfCAgICAgICovCi0vKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSAiY29tcHJlc3MiIGZ1bmN0aW9uIGJlbG93IHdoZW4gICovCi0vKiB0aGUgdXNlciBhc2tzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAqLwotLyogVGhlIG1vc3QgaW1wb3J0YW50IGZpZWxkIGluIHRoZSByZWNvcmQgaXMgdGhlIHdvcmtpbmcgbWVtb3J5IGZpZWxkIHdoaWNoICAgKi8KLS8qIHRlbGxzIHRoZSBjYWxsaW5nIHByb2dyYW0gaG93IG11Y2ggd29ya2luZyBtZW1vcnkgc2hvdWxkIGJlIHBhc3NlZCB0byAgICAgICovCi0vKiAiY29tcHJlc3MiIHdoZW4gaXQgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLiAgICAqLwotLyogTFpSVzMgdXNlcyB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5IGR1cmluZyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4gKi8KLS8qIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgc3RydWN0dXJlIHNlZSAiY29tcHJlc3MuaCIuICAgICAgICAgICAgICAgICAgICovCi0gIAotI2RlZmluZSBVKFgpICAgICAgICAgICAgKChVTE9ORykgWCkKLSNkZWZpbmUgU0laRV9QX0JZVEUgICAgIChVKHNpemVvZihVQllURSAqKSkpCi0jZGVmaW5lIFNJWkVfV09SRCAgICAgICAoVShzaXplb2YoVVdPUkQgICkpKQotI2RlZmluZSBBTElHTk1FTlRfRlVER0UgKFUoMTYpKQotI2RlZmluZSBNRU1fUkVRICggVSg0MDk2KSooU0laRV9QX0JZVEUpICsgQUxJR05NRU5UX0ZVREdFICkKLQotc3RhdGljIHN0cnVjdCBjb21wcmVzc19pZGVudGl0eSBpZGVudGl0eSA9Ci17Ci0gVSgweDAzMkRERUE4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gaWRlbnRpZmljYXRpb24gbnVtYmVyLiAqLwotIE1FTV9SRVEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2luZyBtZW1vcnkgKGJ5dGVzKSByZXF1aXJlZC4gKi8KLSAiTFpSVzMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICovCi0gIjEuMCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uIG51bWJlciBvZiBhbGdvcml0aG0uICAgICAqLwotICIzMS1EZWMtMTk5MCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0ZSBvZiBhbGdvcml0aG0uICAgICAgICAgICAgICAgKi8KLSAiUHVibGljIERvbWFpbiIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHlyaWdodCBub3RpY2UuICAgICAgICAgICAgICAgICovCi0gIlJvc3MgTi4gV2lsbGlhbXMiLCAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRob3Igb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAqLwotICJSZW5haXNzYW5jZSBTb2Z0d2FyZSIsICAgICAgICAgICAgICAgICAgLyogQWZmaWxpYXRpb24gb2YgYXV0aG9yLiAgICAgICAgICAgKi8KLSAiUHVibGljIERvbWFpbiIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciBvZiBhbGdvcml0aG0uICAgICAgICAgICAgICovCi19OwotIAotTE9DQUwgdm9pZCBjb21wcmVzc19jb21wcmVzcyAgKFVCWVRFICosVUJZVEUgKixVTE9ORyxVQllURSAqLCBMT05HICopOwotTE9DQUwgdm9pZCBjb21wcmVzc19kZWNvbXByZXNzKFVCWVRFICosVUJZVEUgKixMT05HLCBVQllURSAqLCBVTE9ORyAqKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb25seSBmdW5jdGlvbiBleHBvcnRlZCBieSB0aGlzIG1vZHVsZS4gICAgICAgICAgICAgICAgKi8KLS8qIERlcGVuZGluZyBvbiBpdHMgZmlyc3QgcGFyYW1ldGVyLCB0aGUgZnVuY3Rpb24gY2FuIGJlIHJlcXVlc3RlZCB0byAgICAgICAgICovCi0vKiBjb21wcmVzcyBhIGJsb2NrIG9mIG1lbW9yeSwgZGVjb21wcmVzcyBhIGJsb2NrIG9mIG1lbW9yeSwgb3IgdG8gaWRlbnRpZnkgICAqLwotLyogaXRzZWxmLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUgImNvbXByZXNzLmgiLiAgICAgKi8KLQotRVhQT1JUIHZvaWQgbHpydzNfY29tcHJlc3MoCi0JVVdPUkQgICAgIGFjdGlvbiwgICAgICAvKiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkLgkJKi8KLQlVQllURSAgICp3cmtfbWVtLAkvKiBBZGRyZXNzIG9mIHdvcmtpbmcgbWVtb3J5IHdlIGNhbiB1c2UuKi8KLQlVQllURSAgICpzcmNfYWRyLAkvKiBBZGRyZXNzIG9mIGlucHV0IGRhdGEuCQkqLwotCUxPTkcgICAgIHNyY19sZW4sCS8qIExlbmd0aCAgb2YgaW5wdXQgZGF0YS4JCSovCi0JVUJZVEUgICAqZHN0X2FkciwJLyogQWRkcmVzcyB0byBwdXQgb3V0cHV0IGRhdGEuCQkqLwotCXZvaWQgICpwX2RzdF9sZW4JLyogQWRkcmVzcyBvZiBsb25nd29yZCBmb3IgbGVuZ3RoIG9mIG91dHB1dCBkYXRhLiovCi0pCi17Ci0gc3dpdGNoIChhY3Rpb24pCi0gICB7Ci0gICAgY2FzZSBDT01QUkVTU19BQ1RJT05fSURFTlRJVFk6Ci0gICAgICAgKigoc3RydWN0IGNvbXByZXNzX2lkZW50aXR5ICoqKXBfZHN0X2xlbik9ICZpZGVudGl0eTsKLSAgICAgICBicmVhazsKLSAgICBjYXNlIENPTVBSRVNTX0FDVElPTl9DT01QUkVTUzoKLSAgICAgICBjb21wcmVzc19jb21wcmVzcyh3cmtfbWVtLHNyY19hZHIsc3JjX2xlbixkc3RfYWRyLChMT05HICopcF9kc3RfbGVuKTsKLSAgICAgICBicmVhazsKLSAgICBjYXNlIENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTOgotICAgICAgIGNvbXByZXNzX2RlY29tcHJlc3Mod3JrX21lbSxzcmNfYWRyLHNyY19sZW4sZHN0X2FkciwoTE9ORyAqKXBfZHN0X2xlbik7Ci0gICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQlJJRUYgREVTQ1JJUFRJT04gT0YgVEhFIExaUlczIEFMR09SSVRITSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgTFpSVzMgYWxnb3JpdGhtIGlzIGlkZW50aWNhbCB0byB0aGUgTFpSVzEtQSBhbGdvcml0aG0gZXhjZXB0IHRoYXQgICAgICAqLwotLyogaW5zdGVhZCBvZiB0cmFuc21pdHRpbmcgaGlzdG9yeSBvZmZzZXRzLCBpdCB0cmFuc21pdHMgaGFzaCB0YWJsZSBpbmRleGVzLiAgKi8KLS8qIEluIG9yZGVyIHRvIGRlY29kZSB0aGUgaW5kZXhlcywgdGhlIGRlY29tcHJlc3NvciBtdXN0IG1haW50YWluIGFuICAgICAgICAgICovCi0vKiBpZGVudGljYWwgaGFzaCB0YWJsZS4gQ29weSBpdGVtcyBhcmUgc3RyYWlnaHRmb3J3YXJkOndoZW4gdGhlIGRlY29tcHJlc3NvciAqLwotLyogcmVjZWl2ZXMgYSBjb3B5IGl0ZW0sIGl0IHNpbXBseSBsb29rcyB1cCB0aGUgaGFzaCB0YWJsZSB0byB0cmFuc2xhdGUgdGhlICAgKi8KLS8qIGluZGV4IGludG8gYSBwb2ludGVyIGludG8gdGhlIGRhdGEgYWxyZWFkeSBkZWNvbXByZXNzZWQuIFRvIHVwZGF0ZSB0aGUgICAgICovCi0vKiBoYXNoIHRhYmxlLCBpdCByZXBsYWNlcyB0aGUgc2FtZSB0YWJsZSBlbnRyeSB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgICAqLwotLyogb2YgdGhlIG5ld2x5IGRlY29kZWQgcGhyYXNlLiBUaGUgdHJpY2t5IHBhcnQgaXMgd2l0aCBsaXRlcmFsIGl0ZW1zLCBmb3IgYXQgKi8KLS8qIHRoZSB0aW1lIHRoYXQgdGhlIGRlY29tcHJlc3NvciByZWNlaXZlcyBhIGxpdGVyYWwgaXRlbSB0aGUgZGVjb21wcmVzc29yICAgICovCi0vKiBkb2VzIG5vdCBoYXZlIHRoZSB0aHJlZSBieXRlcyBpbiB0aGUgWml2ICh0aGF0IHRoZSBjb21wcmVzc29yIGhhcykgdG8gICAgICAqLwotLyogcGVyZm9ybSB0aGUgdGhyZWUtYnl0ZSBoYXNoLiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIGluIExaUlczLCBib3RoIHRoZSAgICAgKi8KLS8qIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBhcmUgd2lyZWQgdXAgc28gdGhhdCB0aGV5ICJidWZmZXIiIHRoZXNlICAgICAgICovCi0vKiBsaXRlcmFscyBhbmQgdXBkYXRlIHRoZWlyIGhhc2ggdGFibGVzIG9ubHkgd2hlbiB0aHJlZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwotLyogVGhpcyBtYWtlcyB0aGUgbWF4aW11bSBidWZmZXJpbmcgMiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXBsYWNlbWVudCBvZiBvZmZzZXRzIGJ5IGhhc2ggdGFibGUgaW5kZXhlcyB5aWVsZHMgYSBmZXcgcGVyY2VudCBleHRyYSAgICAqLwotLyogY29tcHJlc3Npb24gYXQgdGhlIGNvc3Qgb2Ygc29tZSBzcGVlZC4gTFpSVzMgaXMgc2xvd2VyIHRoYW4gTFpSVzEsIExaUlcxLUEgKi8KLS8qIGFuZCBMWlJXMiwgYnV0IHlpZWxkcyBiZXR0ZXIgY29tcHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRXh0cmEgY29tcHJlc3Npb24gY291bGQgYmUgb2J0YWluZWQgYnkgdXNpbmcgYSBoYXNoIHRhYmxlIG9mIGRlcHRoIHR3by4gICAgKi8KLS8qIEhvd2V2ZXIsIGluY3JlYXNpbmcgdGhlIGRlcHRoIGFib3ZlIG9uZSBpbmN1cnMgYSBzaWduaWZpY2FudCBkZWNyZWFzZSBpbiAgICovCi0vKiBjb21wcmVzc2lvbiBzcGVlZCB3aGljaCB3YXMgbm90IGNvbnNpZGVyZWQgd29ydGh3aGlsZS4gQW5vdGhlciByZWFzb24gZm9yICAqLwotLyoga2VlcGluZyB0aGUgZGVwdGggZG93biB0byBvbmUgd2FzIHRvIGFsbG93IGVhc3kgY29tcGFyaXNvbiB3aXRoIHRoZSAgICAgICAgKi8KLS8qIExaUlcxLUEgYW5kIExaUlcyIGFsZ29yaXRobXMgc28gYXMgdG8gZGVtb25zdHJhdGUgdGhlIGV4YWN0IGVmZmVjdCBvZiB0aGUgICovCi0vKiB1c2Ugb2YgZGlyZWN0IGhhc2ggaW5kZXhlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19ffDQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKl98PC0tLSsgICAvLS0tLSstLS1cICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8X19ffCAgICArLS0tfEhhc2ggICAgfCAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfF9fX3wgICAgICAgIHxGdW5jdGlvbnwgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHxfX198ICAgICAgICBcLS0tLS0tLS0vICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8X19ffDAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgKy0tLSsgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIEhhc2ggICAgICAgICstLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBUYWJsZSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAqLwotLyogICAgICB8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCAgICAgICAgICAgICAgKi8KLS8qICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICovCi0vKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDEuLi4uLi4xOHwgICAgICB8ICAgICAgICAgICAgICAqLwotLyogICAgICB8PC0tLS0tLS0gTGVtcGVsPUhpc3RvcnkgLS0tLS0tLS0tLS0tPnw8LS1aaXYtLT58ICAgICAgfCAgICAgICAgICAgICAgKi8KLS8qICAgICAgfCAgICAgKD1ieXRlcyBhbHJlYWR5IHByb2Nlc3NlZCkgICAgICB8PC1TdGlsbCB0byBnby0tPnwgICAgICAgICAgICAgICovCi0vKiAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVVQgQkxPQ0sgLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBkaWFncmFtIGFib3ZlIGZvciBMWlJXMyBsb29rcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBkaWFncmFtIGZvciAgICAgICovCi0vKiBMWlJXMS4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpbiBMWlJXMywgdGhlIGNvbXByZXNzb3IgdHJhbnNtaXRzIGhhc2ggICAgICAqLwotLyogdGFibGUgaW5kaWNlcyBpbnN0ZWFkIG9mIExlbXBlbCBvZmZzZXRzLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgICAgICAgICAgICAgKi8KLS8qIGRlY29tcHJlc3NvciBtdXN0IG1haW50YWluIGEgaGFzaCB0YWJsZSBhcyB3ZWxsIGFzIHRoZSBjb21wcmVzc29yIGFuZCBib3RoICovCi0vKiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCAiYnVmZmVyIiBsaXRlcmFscywgYXMgdGhlIGRlY29tcHJlc3NvciAgICAqLwotLyogY2Fubm90IGhhc2ggcGhyYXNlcyBjb21tZW5jaW5nIHdpdGggYSBsaXRlcmFsIHVudGlsIGFub3RoZXIgdHdvIGJ5dGVzIGhhdmUgKi8KLS8qIGFycml2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExaUlczIEFsZ29yaXRobSBFeGVjdXRpb24gU3VtbWFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gSGFzaCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlIFppdiB0byB5aWVsZCBhIGhhc2ggdGFibGUgaW5kZXggaC4gICAqLwotLyogIDIuIExvb2sgdXAgdGhlIGhhc2ggdGFibGUgeWllbGRpbmcgaGlzdG9yeSBwb2ludGVyIHAuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAzLiBNYXRjaCB3aGVyZSBwIHBvaW50cyB3aXRoIHRoZSBaaXYuIElmIHRoZXJlIGlzIGEgbWF0Y2ggb2YgdGhyZWUgb3IgICAgICovCi0vKiAgICAgbW9yZSBieXRlcywgY29kZSB0aG9zZSBieXRlcyAoaW4gdGhlIFppdikgYXMgYSBjb3B5IGl0ZW0sIG90aGVyd2lzZSAgICAqLwotLyogICAgIGNvZGUgdGhlIG5leHQgYnl0ZSBpbiB0aGUgWml2IGFzIGEgbGl0ZXJhbCBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICA0LiBVcGRhdGUgdGhlIGhhc2ggdGFibGUgYXMgcG9zc2libGUgc3ViamVjdCB0byB0aGUgY29uc3RyYWludCB0aGF0IG9ubHkgICovCi0vKiAgICAgcGhyYXNlcyBjb21tZW5jaW5nIHRocmVlIGJ5dGVzIGJhY2sgZnJvbSB0aGUgWml2IGNhbiBiZSBoYXNoZWQgYW5kICAgICAqLwotLyogICAgIGVudGVyZWQgaW50byB0aGUgaGFzaCB0YWJsZS4gKFRoaXMgZW5hYmxlcyB0aGUgZGVjb21wcmVzc29yIHRvIGtlZXAgICAgKi8KLS8qICAgICBwYWNlKS4gU2VlIHRoZSBkZXNjcmlwdGlvbiBhbmQgY29kZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09NUFJFU1NFRCBGSUxFIEZPUk1BVCAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgKi8KLS8qICAqIEEgY29tcHJlc3NlZCBmaWxlIGNvbnNpc3RzIG9mIGEgQ09QWSBGTEFHIGZvbGxvd2VkIGJ5IGEgUkVNQUlOREVSLiAgICAgICovCi0vKiAgKiBUaGUgY29weSBmbGFnIENGIHVzZXMgdXAgZm91ciBieXRlcyB3aXRoIHRoZSBmaXJzdCBieXRlIGJlaW5nIHRoZSAgICAgICAqLwotLyogICAgbGVhc3Qgc2lnbmlmaWNhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAqIElmIENGPTEsIHRoZW4gdGhlIGNvbXByZXNzZWQgZmlsZSByZXByZXNlbnRzIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpbGUgICovCi0vKiAgICBleGFjdGx5LiBPdGhlcndpc2UgQ0Y9MCBhbmQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZmlsZSBjb25zaXN0cyBvZiB6ZXJvICAqLwotLyogICAgb3IgbW9yZSBHUk9VUFMsIGVhY2ggb2Ygd2hpY2ggcmVwcmVzZW50cyBvbmUgb3IgbW9yZSBieXRlcy4gICAgICAgICAgICAgKi8KLS8qICAqIEVhY2ggZ3JvdXAgY29uc2lzdHMgb2YgdHdvIGJ5dGVzIG9mIENPTlRST0wgaW5mb3JtYXRpb24gZm9sbG93ZWQgYnkgICAgICovCi0vKiAgICBzaXh0ZWVuIElURU1zIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZ3JvdXAgd2hpY2ggY2FuIGNvbnRhaW4gZnJvbSBvbmUgICAgICAqLwotLyogICAgdG8gc2l4dGVlbiBpdGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAqIEFuIGl0ZW0gY2FuIGJlIGVpdGhlciBhIExJVEVSQUwgaXRlbSBvciBhIENPUFkgaXRlbS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgKiBFYWNoIGl0ZW0gY29ycmVzcG9uZHMgdG8gYSBiaXQgaW4gdGhlIGNvbnRyb2wgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAqLwotLyogICogVGhlIGZpcnN0IGNvbnRyb2wgYnl0ZSBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgOCBpdGVtcyBpbiB0aGUgZ3JvdXAgICAgKi8KLS8qICAgIHdpdGggYml0IDAgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgZ3JvdXAgYW5kIGJpdCA3IHRvICAgICovCi0vKiAgICB0aGUgZWlnaHRoIGl0ZW0gaW4gdGhlIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICogVGhlIHNlY29uZCBjb250cm9sIGJ5dGUgY29ycmVzcG9uZHMgdG8gdGhlIHNlY29uZCA4IGl0ZW1zIGluIHRoZSBncm91cCAgKi8KLS8qICAgIHdpdGggYml0IDAgY29ycmVzcG9uZGluZyB0byB0aGUgbmludGggaXRlbSBpbiB0aGUgZ3JvdXAgYW5kIGJpdCA3IHRvICAgICovCi0vKiAgICB0aGUgc2l4dGVlbnRoIGl0ZW0gaW4gdGhlIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICogQSB6ZXJvIGJpdCBpbiBhIGNvbnRyb2wgd29yZCBtZWFucyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gaXMgYSAgICAgKi8KLS8qICAgIGxpdGVyYWwgaXRlbS4gQSBvbmUgYml0IGNvcnJlc3BvbmRzIHRvIGEgY29weSBpdGVtLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgKiBBIGxpdGVyYWwgaXRlbSBjb25zaXN0cyBvZiBhIHNpbmdsZSBieXRlIHdoaWNoIHJlcHJlc2VudHMgaXRzZWxmLiAgICAgICAqLwotLyogICogQSBjb3B5IGl0ZW0gY29uc2lzdHMgb2YgdHdvIGJ5dGVzIHRoYXQgcmVwcmVzZW50IGZyb20gMyB0byAxOCBieXRlcy4gICAgKi8KLS8qICAqIFRoZSBmaXJzdCAgYnl0ZSBpbiBhIGNvcHkgaXRlbSB3aWxsIGJlIGRlbm90ZWQgQzEuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgKiBUaGUgc2Vjb25kIGJ5dGUgaW4gYSBjb3B5IGl0ZW0gd2lsbCBiZSBkZW5vdGVkIEMyLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICogQml0cyB3aWxsIGJlIHNlbGVjdGVkIHVzaW5nIHNxdWFyZSBicmFja2V0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZvciBleGFtcGxlOiBDMVswLi4zXSBpcyB0aGUgbG93IG5pYmJsZSBvZiB0aGUgZmlyc3QgY29udHJvbCBieXRlLiAgICAgICovCi0vKiAgICBvZiBjb3B5IGl0ZW0gQzEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICogVGhlIExFTkdUSCBvZiBhIGNvcHkgaXRlbSBpcyBkZWZpbmVkIHRvIGJlIEMxWzAuLjNdKzMgd2hpY2ggaXMgYSBudW1iZXIgKi8KLS8qICAgIGluIHRoZSByYW5nZSBbMywxOF0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgKiBUaGUgSU5ERVggb2YgYSBjb3B5IGl0ZW0gaXMgZGVmaW5lZCB0byBiZSBDMVs0Li43XSoyNTYrQzJbMC4uOF0gd2hpY2ggICAqLwotLyogICAgaXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLDQwOTVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAqIEEgY29weSBpdGVtIHJlcHJlc2VudHMgdGhlIHNlcXVlbmNlIG9mIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICB0ZXh0W1BPUy1PRkZTRVQuLlBPUy1PRkZTRVQrTEVOR1RILTFdIHdoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgdGV4dCAgIGlzIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmluZy4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIFBPUyAgICBpcyB0aGUgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgYWxsIHRoZSBpdGVtcyBwcmVjZWVkaW5nIHRoZSBpdGVtICAqLwotLyogICAgICAgICAgICAgICAgICAgYmVpbmcgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIE9GRlNFVCBpcyBvYnRhaW5lZCBmcm9tIElOREVYIGJ5IGxvb2tpbmcgdXAgdGhlIGhhc2ggdGFibGUuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGZvbGxvd2luZyAjZGVmaW5lIGRlZmluZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29weSBmbGFnIHRoYXQgYXBwZWFycyBhdCAgKi8KLS8qIHRoZSBzdGFydCBvZiB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgdmFsdWUgb2YgZm91ciBieXRlcyB3YXMgY2hvc2VuICAgICAgICovCi0vKiBiZWNhdXNlIHRoZSBmYXN0X2NvcHkgcm91dGluZSBvbiBteSBNYWNpbnRvc2ggcnVucyBmYXN0ZXIgaWYgdGhlIHNvdXJjZSAgICAqLwotLyogYW5kIGRlc3RpbmF0aW9uIGJsb2NrcyBhcmUgcmVsYXRpdmVseSBsb25nd29yZCBhbGlnbmVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBhY3R1YWwgZmxhZyBkYXRhIGFwcGVhcnMgaW4gdGhlIGZpcnN0IGJ5dGUuIFRoZSByZXN0IGFyZSB6ZXJvZWQgc28gYXMgICovCi0vKiB0byBub3JtYWxpemUgdGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gKGkuZS4gbm90IG5vbi1kZXRlcm1pbmlzdGljKS4gICAqLwotI2RlZmluZSBGTEFHX0JZVEVTIDQKLQotLyogVGhlIGZvbGxvd2luZyAjZGVmaW5lcyBkZWZpbmUgdGhlIG1lYW5pbmcgb2YgdGhlIHZhbHVlcyBvZiB0aGUgY29weSAgICAgICAgKi8KLS8qIGZsYWcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb21wcmVzc2VkIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZMQUdfQ09NUFJFU1MgMCAgICAgLyogU2lnbmFscyB0aGF0IG91dHB1dCB3YXMgcmVzdWx0IG9mIGNvbXByZXNzaW9uLiAqLwotI2RlZmluZSBGTEFHX0NPUFkgICAgIDEgICAgIC8qIFNpZ25hbHMgdGhhdCBvdXRwdXQgd2FzIHNpbXBseSBjb3BpZWQgb3Zlci4gICAgKi8KLQotLyogVGhlIDY4MDAwIG1pY3JvcHJvY2Vzc29yIChvbiB3aGljaCB0aGlzIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgKi8KLS8qIGlzIGZ1c3N5IGFib3V0IG5vbi1hbGlnbmVkIGFycmF5cyBvZiB3b3Jkcy4gVG8gYXZvaWQgdGhlc2UgcHJvYmxlbXMgdGhlICAgICovCi0vKiBmb2xsb3dpbmcgbWFjcm8gY2FuIGJlIHVzZWQgdG8gIndhc3RlIiBmcm9tIDAgdG8gMyBieXRlcyBzbyBhcyB0byBhbGlnbiAgICAqLwotLyogdGhlIGFyZ3VtZW50IHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVUxPTkdfQUxJR05fVVAoWCkgKCgoKFVMT05HKVgpK3NpemVvZihVTE9ORyktMSkmfihzaXplb2YoVUxPTkcpLTEpKQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVmaW5lcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gdW5jb21wcmVzc2VkIGl0ZW0uICovCi0vKiBUaGlzIGRlZmluaXRpb24gbXVzdCBub3QgYmUgY2hhbmdlZDsgaXRzIHZhbHVlIGlzIGhhcmR3aXJlZCBpbnRvIHRoZSBjb2RlLiAqLwotLyogVGhlIGxvbmdlc3QgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHNwYW5uZWQgYnkgYSBzaW5nbGUgaXRlbSBpcyAxOCAgICAgKi8KLS8qIGZvciB0aGUgbG9uZ2VzdCBjb3B5IGl0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE1BWF9SQVdfSVRFTSAoMTgpCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVmaW5lcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gdW5jb21wcmVzc2VkIGdyb3VwLiovCi0vKiBUaGlzIGRlZmluaXRpb24gbXVzdCBub3QgYmUgY2hhbmdlZDsgaXRzIHZhbHVlIGlzIGhhcmR3aXJlZCBpbnRvIHRoZSBjb2RlLiAqLwotLyogQSBncm91cCBjb250YWlucyBhdCBtb3N0IDE2IGl0ZW1zIHdoaWNoIGV4cGxhaW5zIHRoaXMgZGVmaW5pdGlvbi4gICAgICAgICAgKi8KLSNkZWZpbmUgTUFYX1JBV19HUk9VUCAoMTYqTUFYX1JBV19JVEVNKQotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tcHJlc3NlZCBncm91cC4gICAqLwotLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KLS8qIEEgY29tcHJlc3NlZCBncm91cCBjb25zaXN0cyBvZiB0d28gY29udHJvbCBieXRlcyBmb2xsb3dlZCBieSB1cCB0byAxNiAgICAgICovCi0vKiBjb21wcmVzc2VkIGl0ZW1zIGVhY2ggb2Ygd2hpY2ggY2FuIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiB0d28gYnl0ZXMuICAgICAqLwotI2RlZmluZSBNQVhfQ01QX0dST1VQICgyKzE2KjIpCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUuICAgICovCi0vKiBUaGlzIGRlZmluaXRpb24gbXVzdCBub3QgYmUgY2hhbmdlZDsgaXRzIHZhbHVlIGlzIGhhcmR3aXJlZCBpbnRvIHRoZSBjb2RlLiAqLwotI2RlZmluZSBIQVNIX1RBQkxFX0xFTkdUSCAoNDA5NikKLQotLyogTFpSVzMsIHVubGlrZSBMWlJXMSgtQSksIG11c3QgaW5pdGlhbGl6ZSBpdHMgaGFzaCB0YWJsZSBzbyBhcyB0byBlbmFibGUgICAgKi8KLS8qIHRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgdG8gc3RheSBpbiBzdGVwIG1haW50YWluaW5nIGlkZW50aWNhbCBoYXNoICovCi0vKiB0YWJsZXMuIEluIGFuIGVhcmx5IHZlcnNpb24gb2YgdGhlIGFsZ29yaXRobSwgdGhlIHRhYmxlcyB3ZXJlIHNpbXBseSAgICAgICAqLwotLyogaW5pdGlhbGl6ZWQgdG8gemVybyBhbmQgYSBjaGVjayBmb3IgemVybyB3YXMgaW5jbHVkZWQganVzdCBiZWZvcmUgdGhlICAgICAgKi8KLS8qIG1hdGNoaW5nIGNvZGUuIEhvd2V2ZXIsIHRoaXMgdGVzdCBjb3N0cyB0aW1lLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byAgICAgICovCi0vKiBpbml0aWFsaXplIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSB0byBwb2ludCB0byBhIGNvbnN0YW50ICAgICAgICAqLwotLyogc3RyaW5nLiBUaGUgZGVjb21wcmVzc29yIGRvZXMgdGhlIHNhbWUuIFRoaXMgc29sdXRpb24gcmVxdWlyZXMgbm8gZXh0cmEgICAgKi8KLS8qIHRlc3QuIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGRvIG5vdCBtYXR0ZXIgc28gbG9uZyBhcyB0aGUgc3RyaW5nIGlzICAgICovCi0vKiB0aGUgc2FtZSBmb3IgdGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBhbmQgY29udGFpbnMgYXQgbGVhc3QgICAgICAgICAqLwotLyogTUFYX1JBV19JVEVNIGJ5dGVzLiBJIGNob3NlIGNvbnNlY3V0aXZlIGRlY2ltYWwgZGlnaXRzIGJlY2F1c2UgdGhleSBkbyBub3QgKi8KLS8qIGhhdmUgd2hpdGUgc3BhY2UgcHJvYmxlbXMgKGUuZy4gdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgICovCi0vKiByZXBsYWNlIG1vcmUgdGhhbiBvbmUgc3BhY2UgYnkgYSBUQUIpIGFuZCBiZWNhdXNlIHRoZXkgbWFrZSB0aGUgbGVuZ3RoIG9mICAqLwotLyogdGhlIHN0cmluZyBvYnZpb3VzIGJ5IGluc3BlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU1RBUlRfU1RSSU5HXzE4ICgoVUJZVEUgKikgIjEyMzQ1Njc4OTAxMjM0NTY3OCIpCi0KLS8qIEluIHRoaXMgYWxnb3JpdGhtLCBoYXNoIHZhbHVlcyBoYXZlIHRvIGJlIGNhbGN1bGF0ZWQgYXQgbW9yZSB0aGFuIG9uZSAgICAgICovCi0vKiBwb2ludC4gVGhlIGZvbGxvd2luZyBtYWNybyBuZWF0ZW5zIHRoZSBjb2RlIHVwIGZvciB0aGlzLiAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBIQVNIKFBUUikgXAotICAgKCgoNDA1NDMqKCgoKihQVFIpKTw8OCleKCgqKChQVFIpKzEpKTw8NCleKCooKFBUUikrMikpKSk+PjQpICYgMHhGRkYpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIElucHV0ICA6IEhhbmQgb3ZlciB0aGUgcmVxdWlyZWQgYW1vdW50IG9mIHdvcmtpbmcgbWVtb3J5IGluIHBfd3JrX21lbS4gICAgICovCi0vKiBJbnB1dCAgOiBTcGVjaWZ5IGlucHV0IGJsb2NrIHVzaW5nIHBfc3JjX2ZpcnN0IGFuZCBzcmNfbGVuLiAgICAgICAgICAgICAgICAqLwotLyogSW5wdXQgIDogUG9pbnQgcF9kc3RfZmlyc3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgem9uZSAoT1opLiAgICAgICAgICAgKi8KLS8qIElucHV0ICA6IFBvaW50IHBfZHN0X2xlbiB0byBhIFVMT05HIHRvIHJlY2VpdmUgdGhlIG91dHB1dCBsZW5ndGguICAgICAgICAgICovCi0vKiBJbnB1dCAgOiBJbnB1dCBibG9jayBhbmQgb3V0cHV0IHpvbmUgbXVzdCBub3Qgb3ZlcmxhcC4gICAgICAgICAgICAgICAgICAgICAqLwotLyogT3V0cHV0IDogTGVuZ3RoIG9mIG91dHB1dCBibG9jayB3cml0dGVuIHRvICpwX2RzdF9sZW4uICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE91dHB1dCA6IE91dHB1dCBibG9jayBpbiBNZW1bcF9kc3RfZmlyc3QuLnBfZHN0X2ZpcnN0KypwX2RzdF9sZW4tMV0uIE1heSAgICovCi0vKiBPdXRwdXQgOiB3cml0ZSBpbiBPWj1NZW1bcF9kc3RfZmlyc3QuLnBfZHN0X2ZpcnN0K3NyY19sZW4rTUFYX0NNUF9HUk9VUC0xXS4qLwotLyogT3V0cHV0IDogVXBvbiBjb21wbGV0aW9uIGd1YXJhbnRlZWQgKnBfZHN0X2xlbjw9c3JjX2xlbitGTEFHX0JZVEVTLiAgICAgICAgKi8KLUxPQ0FMIHZvaWQgY29tcHJlc3NfY29tcHJlc3MoVUJZVEUgKnBfd3JrX21lbSwKLQkJCSAgICAgVUJZVEUgKnBfc3JjX2ZpcnN0LCBVTE9ORyAgc3JjX2xlbiwKLQkJCSAgICAgVUJZVEUgKnBfZHN0X2ZpcnN0LCBMT05HICAqcF9kc3RfbGVuKQotewotIC8qIHBfc3JjIGFuZCBwX2RzdCBzdGVwIHRocm91Z2ggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmxvY2tzLiAgICAgICAgICAgKi8KLSByZWdpc3RlciBVQllURSAqcF9zcmMgPSBwX3NyY19maXJzdDsKLSByZWdpc3RlciBVQllURSAqcF9kc3QgPSBwX2RzdF9maXJzdDsKLSAKLSAvKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgbmV2ZXIgbW9kaWZpZWQgYW5kIGFyZSB1c2VkIGluIHRoZSAgICAgICAgICAgICovCi0gLyogY2FsY3VsYXRpb25zIHRoYXQgZGV0ZXJtaW5lIHdoZW4gdGhlIG1haW4gbG9vcCB0ZXJtaW5hdGVzLiAgICAgICAgICAgICAgICAqLwotIFVCWVRFICpwX3NyY19wb3N0ICA9IHBfc3JjX2ZpcnN0K3NyY19sZW47Ci0gVUJZVEUgKnBfZHN0X3Bvc3QgID0gcF9kc3RfZmlyc3Qrc3JjX2xlbjsKLSBVQllURSAqcF9zcmNfbWF4MSAgPSBwX3NyY19maXJzdCtzcmNfbGVuLU1BWF9SQVdfSVRFTTsKLSBVQllURSAqcF9zcmNfbWF4MTYgPSBwX3NyY19maXJzdCtzcmNfbGVuLU1BWF9SQVdfSVRFTSoxNjsKLSAKLSAvKiBUaGUgdmFyaWFibGVzICdwX2NvbnRyb2wnIGFuZCAnY29udHJvbCcgYXJlIHVzZWQgdG8gYnVmZmVyIGNvbnRyb2wgYml0cy4gICovCi0gLyogQmVmb3JlIGVhY2ggZ3JvdXAgaXMgcHJvY2Vzc2VkLCB0aGUgbmV4dCB0d28gYnl0ZXMgb2YgdGhlIG91dHB1dCBibG9jayAgICAqLwotIC8qIGFyZSBzZXQgYXNpZGUgZm9yIHRoZSBjb250cm9sIHdvcmQgZm9yIHRoZSBncm91cCBhYm91dCB0byBiZSBwcm9jZXNzZWQuICAgKi8KLSAvKiAncF9jb250cm9sJyBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhhdCB3b3JkLiBNZWFud2hpbGUsICAgICovCi0gLyogJ2NvbnRyb2wnIGJ1ZmZlcnMgdGhlIGNvbnRyb2wgYml0cyBiZWluZyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nICAqLwotIC8qIG9mIHRoZSBncm91cC4gSW5zdGVhZCBvZiBoYXZpbmcgYSBjb3VudGVyIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgaXRlbXMgKi8KLSAvKiBoYXZlIGJlZW4gcHJvY2Vzc2VkICg9dGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb250cm9sIHdvcmQpLCBhdCB0aGUgICAgICovCi0gLyogc3RhcnQgb2YgZWFjaCBncm91cCwgdGhlIHRvcCB3b3JkIG9mICdjb250cm9sJyBpcyBmaWxsZWQgd2l0aCAxIGJpdHMuICAgICAqLwotIC8qIEFzICdjb250cm9sJyBpcyBzaGlmdGVkIGZvciBlYWNoIGl0ZW0sIHRoZSAxIGJpdHMgaW4gdGhlIHRvcCB3b3JkIGFyZSAgICAgKi8KLSAvKiBhYnNvcmJlZCBvciBkZXN0cm95ZWQuIFdoZW4gdGhleSBhbGwgcnVuIG91dCAoaS5lLiB3aGVuIHRoZSB0b3Agd29yZCBpcyAgICovCi0gLyogYWxsIHplcm8gYml0cywgd2Uga25vdyB0aGF0IHdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgZ3JvdXAuICAgICAgICAgICAgICAgICAqLwotIyBkZWZpbmUgVE9QV09SRCAweEZGRkYwMDAwCi0gVUJZVEUgKnBfY29udHJvbDsKLSByZWdpc3RlciBVTE9ORyBjb250cm9sPVRPUFdPUkQ7Ci0gCi0gLyogVEhlIHZhcmlhYmxlICdoYXNoJyBhbHdheXMgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBoYXNoIHRhYmxlLiAqLwotIFVCWVRFICoqaGFzaD0gKFVCWVRFICoqKSAgVUxPTkdfQUxJR05fVVAocF93cmtfbWVtKTsKLSAKLSAvKiBUaGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgcmVwcmVzZW50IHRoZSBsaXRlcmFsIGJ1ZmZlci4gcF9oMSBwb2ludHMgdG8gICovCi0gLyogdGhlIGhhc2ggdGFibGUgZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgeW91bmdlc3QgbGl0ZXJhbC4gcF9oMiBwb2ludHMgICAqLwotIC8qIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY29uZCB5b3VuZ2VzdCBsaXRlcmFsLiAgICAgKi8KLSAvKiBOb3RlOiBwX2gxPTA9PnBfaDI9MCBiZWNhdXNlIHplcm8gdmFsdWVzIGRlbm90ZSBhYnNlbmNlIG9mIGEgcGVuZGluZyAgICAgICovCi0gLyogbGl0ZXJhbC4gVGhlIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBtZWFuaW5nIGFuIGVtcHR5ICJidWZmZXIiLiAqLwotIFVCWVRFICoqcF9oMT1OVUxMOwotIFVCWVRFICoqcF9oMj1OVUxMOwotICAKLSAvKiBUbyBzdGFydCwgd2Ugd3JpdGUgdGhlIGZsYWcgYnl0ZXMuIEJlaW5nIG9wdGltaXN0aWMsIHdlIHNldCB0aGUgZmxhZyB0byAgICovCi0gLyogRkxBR19DT01QUkVTUy4gVGhlIHJlbWFpbmluZyBmbGFnIGJ5dGVzIGFyZSB6ZXJvZWQgc28gYXMgdG8ga2VlcCB0aGUgICAgICAqLwotIC8qIGFsZ29yaXRobSBkZXRlcm1pbmlzdGljLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAqcF9kc3QrKz1GTEFHX0NPTVBSRVNTOwotIHtVV09SRCBpOyBmb3IgKGk9MjtpPD1GTEFHX0JZVEVTO2krKykgKnBfZHN0Kys9MDt9Ci0KLSAvKiBSZXNlcnZlIHRoZSBmaXJzdCB3b3JkIG9mIG91dHB1dCBhcyB0aGUgY29udHJvbCB3b3JkIGZvciB0aGUgZmlyc3QgZ3JvdXAuICovCi0gLyogTm90ZTogVGhpcyBpcyB1bmRvbmUgYXQgdGhlIGVuZCBpZiB0aGUgaW5wdXQgYmxvY2sgaXMgZW1wdHkuICAgICAgICAgICAgICAqLwotIHBfY29udHJvbD1wX2RzdDsgcF9kc3QrPTI7Ci0gCi0gLyogSW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgb2YgdGhlIGhhc2ggdGFibGUgdG8gcG9pbnQgdG8gYSBjb25zdGFudCBzdHJpbmcuICAqLwotIC8qIFVzZSBvZiBhbiB1bnJvbGxlZCBsb29wIHNwZWVkcyB0aGlzIHVwIGNvbnNpZGVyYWJseS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSB7VVdPUkQgaTsgVUJZVEUgKipwX2g9aGFzaDsKLSMgIGRlZmluZSBaSCAqcF9oKys9U1RBUlRfU1RSSU5HXzE4Ci0gIGZvciAoaT0wO2k8MjU2O2krKykgICAgIC8qIDI1Nj1IQVNIX1RBQkxFX0xFTkdUSC8xNi4gKi8KLSAgICB7Wkg7Wkg7Wkg7Wkg7Ci0gICAgIFpIO1pIO1pIO1pIOwotICAgICBaSDtaSDtaSDtaSDsKLSAgICAgWkg7Wkg7Wkg7Wkg7fQotIH0KLQotIC8qIFRoZSBtYWluIGxvb3AgcHJvY2Vzc2VzIGVpdGhlciAxIG9yIDE2IGl0ZW1zIHBlciBpdGVyYXRpb24uIEFzIGl0cyAgICAgICAgKi8KLSAvKiB0ZXJtaW5hdGlvbiBsb2dpYyBpcyBjb21wbGljYXRlZCwgSSBoYXZlIG9wdGVkIGZvciBhbiBpbmZpbml0ZSBsb29wICAgICAgICovCi0gLyogc3RydWN0dXJlIGNvbnRhaW5pbmcgJ2JyZWFrJyBhbmQgJ2dvdG8nIHN0YXRlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAqLwotIHdoaWxlIChUUlVFKQotICAgey8qIEJlZ2luIG1haW4gcHJvY2Vzc2luZyBsb29wLiAqLwotICAgCi0gICAgLyogTm90ZTogQWxsIHRoZSB2YXJpYWJsZXMgaGVyZSBleGNlcHQgdW5yb2xsIHNob3VsZCBiZSBkZWZpbmVkIHdpdGhpbiAgICAqLwotICAgIC8qICAgICAgIHRoZSBpbm5lciBsb29wLiBVbmZvcnR1bmF0ZWx5IHRoZSBsb29wIGhhc24ndCBnb3QgYSBibG9jay4gICAgICAgKi8KLSAgICAgcmVnaXN0ZXIgVUJZVEUgKnA7ICAgICAgICAgLyogU2NhbnMgdGhyb3VnaCB0YXJnIHBocmFzZSBkdXJpbmcgbWF0Y2hpbmcuICovCi0gICAgIHJlZ2lzdGVyIFVCWVRFICpwX3ppdj0gTlVMTCA7ICAgICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBvZiBjdXJyZW50IFppdi4gICAgICAgKi8KLSAgICAgcmVnaXN0ZXIgVVdPUkQgdW5yb2xsOyAgICAgLyogTG9vcCBjb3VudGVyIGZvciB1bnJvbGxlZCBpbm5lciBsb29wLiAgICAgICovCi0gICAgIHJlZ2lzdGVyIFVXT1JEIGluZGV4OyAgICAgIC8qIEluZGV4IG9mIGN1cnJlbnQgaGFzaCB0YWJsZSBlbnRyeS4gICAgICAgICAqLwotICAgICByZWdpc3RlciBVQllURSAqKnBfaDAgPSBOVUxMIDsgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBoYXNoIHRhYmxlIGVudHJ5LiAgICAgICAqLwotICAgICAKLSAgICAvKiBUZXN0IGZvciBvdmVycnVuIGFuZCBqdW1wIHRvIG92ZXJydW4gY29kZSBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICovCi0gICAgaWYgKHBfZHN0PnBfZHN0X3Bvc3QpCi0gICAgICAgZ290byBvdmVycnVuOwotICAgICAgIAotICAgIC8qIFRoZSBmb2xsb3dpbmcgY2FzY2FkZSBvZiBpZiBzdGF0ZW1lbnRzIGVmZmljaWVudGx5IGNhdGNoZXMgYW5kIGRlYWxzICAgKi8KLSAgICAvKiB3aXRoIHZhcnlpbmcgZGVncmVlcyBvZiBjbG9zZW5lc3MgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYmxvY2suICAgICAgICovCi0gICAgLyogV2hlbiB3ZSBnZXQgdmVyeSBjbG9zZSB0byB0aGUgZW5kLCB3ZSBzdG9wIHVwZGF0aW5nIHRoZSB0YWJsZSBhbmQgICAgICAqLwotICAgIC8qIGNvZGUgdGhlIHJlbWFpbmluZyBieXRlcyBhcyBsaXRlcmFscy4gVGhpcyBtYWtlcyB0aGUgY29kZSBzaW1wbGVyLiAgICAgKi8KLSAgICB1bnJvbGw9MTY7Ci0gICAgaWYgKHBfc3JjPnBfc3JjX21heDE2KQotICAgICAgewotICAgICAgIHVucm9sbD0xOwotICAgICAgIGlmIChwX3NyYz5wX3NyY19tYXgxKQotICAgICAgICAgewotICAgICAgICAgIGlmIChwX3NyYz09cF9zcmNfcG9zdCkKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgZ290byBsaXRlcmFsOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgICAgCi0gICAgLyogVGhpcyBpbm5lciB1bnJvbGxlZCBsb29wIHByb2Nlc3NlcyAndW5yb2xsJyAod2hvc2UgdmFsdWUgaXMgZWl0aGVyIDEgICAqLwotICAgIC8qIG9yIDE2KSBpdGVtcy4gSSBoYXZlIGNob3NlbiB0byBpbXBsZW1lbnQgdGhpcyBsb29wIHdpdGggbGFiZWxzIGFuZCAgICAgKi8KLSAgICAvKiBnb3RvcyB0byBoZWlnaHRlbiB0aGUgZWFzZSB3aXRoIHdoaWNoIHRoZSBsb29wIG1heSBiZSBpbXBsZW1lbnRlZCB3aXRoICovCi0gICAgLyogYSBzaW5nbGUgZGVjcmVtZW50IGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb24gaW4gYXNzZW1ibHkgbGFuZ3VhZ2UgYW5kICAgICAqLwotICAgIC8qIGFsc28gYmVjYXVzZSB0aGUgbGFiZWxzIGFjdCBhcyBoaWdobHkgcmVhZGFibGUgcGxhY2UgbWFya2Vycy4gICAgICAgICAgKi8KLSAgICAvKiAoQWxzbyBiZWNhdXNlIHdlIGp1bXAgaW50byB0aGUgbG9vcCBmb3IgZW5kZ2FtZSBsaXRlcmFscyAoc2VlIGFib3ZlKSkuICovCi0gICAgCi0gICAgYmVnaW5fdW5yb2xsZWRfbG9vcDoKLSAgICAKLSAgICAgICAvKiBUbyBwcm9jZXNzIHRoZSBuZXh0IHBocmFzZSwgd2UgaGFzaCB0aGUgbmV4dCB0aHJlZSBieXRlcyBhbmQgdXNlICAgICovCi0gICAgICAgLyogdGhlIHJlc3VsdGFudCBoYXNoIHRhYmxlIGluZGV4IHRvIGxvb2sgdXAgdGhlIGhhc2ggdGFibGUuIEEgcG9pbnRlciAqLwotICAgICAgIC8qIHRvIHRoZSBlbnRyeSBpcyBzdG9yZWQgaW4gcF9oMCBzbyBhcyB0byBhdm9pZCBhbiBhcnJheSBsb29rdXAuIFRoZSAgKi8KLSAgICAgICAvKiBoYXNoIHRhYmxlIGVudHJ5ICpwX2gwIGlzIGxvb2tlZCB1cCB5aWVsZGluZyBhIHBvaW50ZXIgcCB0byBhICAgICAgICovCi0gICAgICAgLyogcG90ZW50aWFsIG1hdGNoIG9mIHRoZSBaaXYgaW4gdGhlIGhpc3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgIGluZGV4PUhBU0gocF9zcmMpOwotICAgICAgIHBfaDA9Jmhhc2hbaW5kZXhdOwotICAgICAgIHA9KnBfaDA7Ci0gICAgICAgCi0gICAgICAgLyogSGF2aW5nIGxvb2tlZCB1cCB0aGUgY2FuZGlkYXRlIHBvc2l0aW9uLCB3ZSBhcmUgaW4gYSBwb3NpdGlvbiB0byAgICAqLwotICAgICAgIC8qIGF0dGVtcHQgYSBtYXRjaC4gVGhlIG1hdGNoIGxvb3AgaGFzIGJlZW4gdW5yb2xsZWQgdXNpbmcgdGhlIFBTICAgICAgKi8KLSAgICAgICAvKiBtYWNybyBzbyB0aGF0IGZhaWx1cmUgd2l0aGluIHRoZSBmaXJzdCB0aHJlZSBieXRlcyBhdXRvbWF0aWNhbGx5ICAgICovCi0gICAgICAgLyogcmVzdWx0cyBpbiB0aGUgbGl0ZXJhbCBicmFuY2ggYmVpbmcgdGFrZW4uIFRoZSBjb2RpbmcgaXMgc2ltcGxlLiAgICAqLwotICAgICAgIC8qIHBfeml2IHNhdmVzIHBfc3JjIHNvIHdlIGNhbiBsZXQgcF9zcmMgd2FuZGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSMgICAgICAgZGVmaW5lIFBTICpwKyshPSpwX3NyYysrCi0gICAgICAgcF96aXY9cF9zcmM7Ci0gICAgICAgaWYgKFBTIHx8IFBTIHx8IFBTKQotICAgICAgICAgewotICAgICAgICAgIC8qIExpdGVyYWwuICovCi0gICAgICAgICAgCi0gICAgICAgICAgLyogQ29kZSB0aGUgbGl0ZXJhbCBieXRlIGFzIGl0c2VsZiBhbmQgYSB6ZXJvIGNvbnRyb2wgYml0LiAgICAgICAgICAqLwotICAgICAgICAgIHBfc3JjPXBfeml2OyBsaXRlcmFsOiAqcF9kc3QrKz0qcF9zcmMrKzsgY29udHJvbCY9MHhGRkZFRkZGRjsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBXZSBoYXZlIGp1c3QgY29kZWQgYSBsaXRlcmFsLiBJZiB3ZSBoYWQgdHdvIHBlbmRpbmcgb25lcywgdGhhdCAgICovCi0gICAgICAgICAgLyogbWFrZXMgdGhyZWUgYW5kIHdlIGNhbiB1cGRhdGUgdGhlIGhhc2ggdGFibGUuICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmIChwX2gyIT0wKQotICAgICAgICAgICAgIHsqcF9oMj1wX3ppdi0yO30KLSAgICAgICAgICAgICAKLSAgICAgICAgICAvKiBJbiBhbnkgY2FzZSwgcm90YXRlIHRoZSBoYXNoIHRhYmxlIHBvaW50ZXJzIGZvciBuZXh0IHRpbWUuICovCi0gICAgICAgICAgcF9oMj1wX2gxOyBwX2gxPXBfaDA7Ci0gICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgIC8qIENvcHkgKi8KLSAgICAgICAgICAKLSAgICAgICAgICAvKiBNYXRjaCB1cCB0byAxNSByZW1haW5pbmcgYnl0ZXMgdXNpbmcgYW4gdW5yb2xsZWQgbG9vcCBhbmQgY29kZS4gKi8KLSNpZiAwCi0gICAgICAgICAgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwKLSAgICAgICAgICBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBwX3NyYysrOwotI2Vsc2UgICAgIAotICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICEoIFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8Ci0gICAgICAgICAgICAgICAgICBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyApIAotICAgICAgICAgICAgICkgcF9zcmMrKzsKLSNlbmRpZgotICAgICAgICAgICpwX2RzdCsrPSgoaW5kZXgmMHhGMDApPj40KXwoLS1wX3NyYy1wX3ppdi0zKTsKLSAgICAgICAgICAqcF9kc3QrKz1pbmRleCYweEZGOwotICAgICAgICAgIAotICAgICAgICAgIC8qIEFzIHdlIGhhdmUganVzdCBjb2RlZCB0aHJlZSBieXRlcywgd2UgYXJlIG5vdyBpbiBhIHBvc2l0aW9uIHRvICAgKi8KLSAgICAgICAgICAvKiB1cGRhdGUgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgbGl0ZXJhbCBieXRlcyB0aGF0IHdlcmUgcGVuZGluZyAgICovCi0gICAgICAgICAgLyogdXBvbiB0aGUgYXJyaXZhbCBvZiBleHRyYSBjb250ZXh0IGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmIChwX2gxIT0wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgIGlmIChwX2gyKQotICAgICAgICAgICAgICAgeypwX2gyPXBfeml2LTI7IHBfaDI9TlVMTDt9Ci0gICAgICAgICAgICAgKnBfaDE9cF96aXYtMTsgcF9oMT1OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgLyogSW4gYW55IGNhc2UsIHdlIGNhbiB1cGRhdGUgdGhlIGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgICAqLwotICAgICAgICAgIC8qIHBvc2l0aW9uIGFzIHdlIGp1c3QgY29kZWQgYXQgbGVhc3QgdGhyZWUgYnl0ZXMgaW4gYSBjb3B5IGl0ZW1zLiAgKi8KLSAgICAgICAgICAqcF9oMD1wX3ppdjsKLSAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAgICBjb250cm9sPj49MTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAvKiBUaGlzIGxvb3AgaXMgYWxsIHNldCB1cCBmb3IgYSBkZWNyZW1lbnQgYW5kIGp1bXAgaW5zdHJ1Y3Rpb24hICovCi0jaWZuZGVmIGxpbnV4Ci1gICAgIGVuZF91bnJvbGxlZF9sb29wOiBpZiAoLS11bnJvbGwpIGdvdG8gYmVnaW5fdW5yb2xsZWRfbG9vcDsKLSNlbHNlCi0gICAgLyogZW5kX3Vucm9sbGVkX2xvb3A6ICovIGlmICgtLXVucm9sbCkgZ290byBiZWdpbl91bnJvbGxlZF9sb29wOwotI2VuZGlmCi0KLSAgICAvKiBBdCB0aGlzIHBvaW50IGl0IHdpbGwgbmVhcmx5IGFsd2F5cyBiZSB0aGUgZW5kIG9mIGEgZ3JvdXAgaW4gd2hpY2ggICAgICovCi0gICAgLyogY2FzZSwgd2UgaGF2ZSB0byBkbyBzb21lIGNvbnRyb2wtd29yZCBwcm9jZXNzaW5nLiBIb3dldmVyLCBuZWFyIHRoZSAgICAqLwotICAgIC8qIGVuZCBvZiB0aGUgaW5wdXQgYmxvY2ssIHRoZSBpbm5lciB1bnJvbGxlZCBsb29wIGlzIG9ubHkgZXhlY3V0ZWQgb25jZS4gKi8KLSAgICAvKiBUaGlzIG5lY2Vzc2l0YXRlcyB0aGUgJ2lmJyB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKChjb250cm9sJlRPUFdPUkQpPT0wKQotICAgICAgewotICAgICAgIC8qIFdyaXRlIHRoZSBjb250cm9sIHdvcmQgdG8gdGhlIHBsYWNlIHdlIHNhdmVkIGZvciBpdCBpbiB0aGUgb3V0cHV0LiAqLwotICAgICAgICpwX2NvbnRyb2wrKz0gIGNvbnRyb2wgICAgICYweEZGOwotICAgICAgICpwX2NvbnRyb2wgID0gKGNvbnRyb2w+PjgpICYweEZGOwotCi0gICAgICAgLyogUmVzZXJ2ZSB0aGUgbmV4dCB3b3JkIGluIHRoZSBvdXRwdXQgYmxvY2sgZm9yIHRoZSBjb250cm9sIHdvcmQgKi8KLSAgICAgICAvKiBmb3IgdGhlIGdyb3VwIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgIHBfY29udHJvbD1wX2RzdDsgcF9kc3QrPTI7Ci0gICAgICAgCi0gICAgICAgLyogUmVzZXQgdGhlIGNvbnRyb2wgYml0cyBidWZmZXIuICovCi0gICAgICAgY29udHJvbD1UT1BXT1JEOwotICAgICAgfQotICAgICAgICAgIAotICAgfSAvKiBFbmQgbWFpbiBwcm9jZXNzaW5nIGxvb3AuICovCi0gICAKLSAvKiBBZnRlciB0aGUgbWFpbiBwcm9jZXNzaW5nIGxvb3AgaGFzIGV4ZWN1dGVkLCBhbGwgdGhlIGlucHV0IGJ5dGVzIGhhdmUgICAgICovCi0gLyogYmVlbiBwcm9jZXNzZWQuIEhvd2V2ZXIsIHRoZSBjb250cm9sIHdvcmQgaGFzIHN0aWxsIHRvIGJlIHdyaXR0ZW4gdG8gdGhlICAqLwotIC8qIHdvcmQgcmVzZXJ2ZWQgZm9yIGl0IGluIHRoZSBvdXRwdXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBtb3N0IHJlY2VudCBncm91cC4gKi8KLSAvKiBCZWZvcmUgd3JpdGluZywgdGhlIGNvbnRyb2wgd29yZCBoYXMgdG8gYmUgc2hpZnRlZCBzbyB0aGF0IGFsbCB0aGUgYml0cyAgICovCi0gLyogYXJlIGluIHRoZSByaWdodCBwbGFjZS4gVGhlICJlbXB0eSIgYml0IHBvc2l0aW9ucyBhcmUgZmlsbGVkIHdpdGggMXMgICAgICAqLwotIC8qIHdoaWNoIHBhcnRpYWxseSBmaWxsIHRoZSB0b3Agd29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSB3aGlsZShjb250cm9sJlRPUFdPUkQpIGNvbnRyb2w+Pj0xOwotICpwX2NvbnRyb2wrKz0gY29udHJvbCAgICAgJjB4RkY7Ci0gKnBfY29udHJvbCsrPShjb250cm9sPj44KSAmMHhGRjsKLSAKLSAvKiBJZiB0aGUgbGFzdCBncm91cCBjb250YWluZWQgbm8gaXRlbXMsIGRlbGV0ZSB0aGUgY29udHJvbCB3b3JkIHRvby4gICAgICAgICovCi0gaWYgKHBfY29udHJvbD09cF9kc3QpIHBfZHN0LT0yOwotIAotIC8qIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dCBibG9jayB0byB0aGUgZHN0X2xlbiBwYXJhbWV0ZXIgYW5kIHJldHVybi4gKi8KLSAqcF9kc3RfbGVuPXBfZHN0LXBfZHN0X2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIHJldHVybjsKLSAKLSAvKiBKdW1wIGhlcmUgYXMgc29vbiBhcyBhbiBvdmVycnVuIGlzIGRldGVjdGVkLiBBbiBvdmVycnVuIGlzIGRlZmluZWQgdG8gICAgICovCi0gLyogaGF2ZSBvY2N1cnJlZCBpZiBwX2RzdD5wX2RzdF9maXJzdCtzcmNfbGVuLiBUaGF0IGlzLCB0aGUgbW9tZW50IHRoZSAgICAgICAqLwotIC8qIGxlbmd0aCBvZiB0aGUgb3V0cHV0IHdyaXR0ZW4gc28gZmFyIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYmxvY2suKi8KLSAvKiBUaGUgYWxnb3JpdGhtIGNoZWNrcyBmb3Igb3ZlcnJ1bnMgYXQgbGVhc3QgYXQgdGhlIGVuZCBvZiBlYWNoIGdyb3VwICAgICAgICovCi0gLyogd2hpY2ggbWVhbnMgdGhhdCB0aGUgbWF4aW11bSBvdmVycnVuIGlzIE1BWF9DTVBfR1JPVVAgYnl0ZXMuICAgICAgICAgICAgICAqLwotIC8qIE9uY2UgYW4gb3ZlcnJ1biBvY2N1cnMsIHRoZSBvbmx5IHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgY29weSBmbGFnIGFuZCAgKi8KLSAvKiBjb3B5IHRoZSBpbnB1dCBvdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gb3ZlcnJ1bjoKLSNpZiAwCi0gKnBfZHN0X2ZpcnN0PUZMQUdfQ09QWTsKLSBmYXN0X2NvcHkocF9zcmNfZmlyc3QscF9kc3RfZmlyc3QrRkxBR19CWVRFUyxzcmNfbGVuKTsKLSAqcF9kc3RfbGVuPXNyY19sZW4rRkxBR19CWVRFUzsKLSNlbHNlCi0gZmFzdF9jb3B5KHBfc3JjX2ZpcnN0LHBfZHN0X2ZpcnN0LHNyY19sZW4pOwotICpwX2RzdF9sZW49IC1zcmNfbGVuOyAvKiByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgdG8gaW5kaWNhdGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBJbnB1dCAgOiBIYW5kIG92ZXIgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiB3b3JraW5nIG1lbW9yeSBpbiBwX3dya19tZW0uICAgICAqLwotLyogSW5wdXQgIDogU3BlY2lmeSBpbnB1dCBibG9jayB1c2luZyBwX3NyY19maXJzdCBhbmQgc3JjX2xlbi4gICAgICAgICAgICAgICAgKi8KLS8qIElucHV0ICA6IFBvaW50IHBfZHN0X2ZpcnN0IHRvIHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHpvbmUuICAgICAgICAgICAgICAgICovCi0vKiBJbnB1dCAgOiBQb2ludCBwX2RzdF9sZW4gdG8gYSBVTE9ORyB0byByZWNlaXZlIHRoZSBvdXRwdXQgbGVuZ3RoLiAgICAgICAgICAqLwotLyogSW5wdXQgIDogSW5wdXQgYmxvY2sgYW5kIG91dHB1dCB6b25lIG11c3Qgbm90IG92ZXJsYXAuIFVzZXIga25vd3MgICAgICAgICAgKi8KLS8qIElucHV0ICA6IHVwcGVyYm91bmQgb24gb3V0cHV0IGJsb2NrIGxlbmd0aCBmcm9tIGVhcmxpZXIgY29tcHJlc3Npb24uICAgICAgICovCi0vKiBJbnB1dCAgOiBJbiBhbnkgY2FzZSwgbWF4aW11bSBleHBhbnNpb24gcG9zc2libGUgaXMgbmluZSB0aW1lcy4gICAgICAgICAgICAqLwotLyogT3V0cHV0IDogTGVuZ3RoIG9mIG91dHB1dCBibG9jayB3cml0dGVuIHRvICpwX2RzdF9sZW4uICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE91dHB1dCA6IE91dHB1dCBibG9jayBpbiBNZW1bcF9kc3RfZmlyc3QuLnBfZHN0X2ZpcnN0KypwX2RzdF9sZW4tMV0uICAgICAgICovCi0vKiBPdXRwdXQgOiBXcml0ZXMgb25seSAgaW4gTWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCsqcF9kc3RfbGVuLTFdLiAgICAgICAqLwotTE9DQUwgdm9pZCBjb21wcmVzc19kZWNvbXByZXNzKCBVQllURSAqcF93cmtfbWVtLAotCQkJCVVCWVRFICpwX3NyY19maXJzdCwgTE9ORyAgIHNyY19sZW4sCi0JCQkJVUJZVEUgKnBfZHN0X2ZpcnN0LCBVTE9ORyAqcF9kc3RfbGVuKQotewotIC8qIEJ5dGUgcG9pbnRlcnMgcF9zcmMgYW5kIHBfZHN0IHNjYW4gdGhyb3VnaCB0aGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3MuICAgKi8KLSByZWdpc3RlciBVQllURSAqcF9zcmMgPSBwX3NyY19maXJzdCtGTEFHX0JZVEVTOwotIHJlZ2lzdGVyIFVCWVRFICpwX2RzdCA9IHBfZHN0X2ZpcnN0OwotIC8qIHdlIG5lZWQgdG8gYXZvaWQgYSBTRUdWIHdoZW4gdHJ5aW5nIHRvIHVuY29tcHJlc3MgY29ycnVwdCBkYXRhICovCi0gcmVnaXN0ZXIgVUJZVEUgKnBfZHN0X3Bvc3QgPSBwX2RzdF9maXJzdCArICpwX2RzdF9sZW47Ci0KLSAvKiBUaGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgYXJlIG5ldmVyIG1vZGlmaWVkIGFuZCBhcmUgdXNlZCB0byBjb250cm9sICAgICovCi0gLyogdGhlIG1haW4gbG9vcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotIFVCWVRFICpwX3NyY19wb3N0ICA9IHBfc3JjX2ZpcnN0K3NyY19sZW47Ci0gVUJZVEUgKnBfc3JjX21heDE2ID0gcF9zcmNfZmlyc3Qrc3JjX2xlbi0oTUFYX0NNUF9HUk9VUC0yKTsKLSAKLSAvKiBUaGUgaGFzaCB0YWJsZSBpcyB0aGUgb25seSByZXNpZGVudCBvZiB0aGUgd29ya2luZyBtZW1vcnkuIFRoZSBoYXNoIHRhYmxlICovCi0gLyogY29udGFpbnMgSEFTSF9UQUJMRV9MRU5HVEg9NDA5NiBwb2ludGVycyB0byBwb3NpdGlvbnMgaW4gdGhlIGhpc3RvcnkuIFRvICAqLwotIC8qIGtlZXAgTWFjaW50b3NoZXMgaGFwcHksIGl0IGlzIGxvbmd3b3JkIGFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSBVQllURSAqKmhhc2ggPSAoVUJZVEUgKiopIFVMT05HX0FMSUdOX1VQKHBfd3JrX21lbSk7Ci0KLSAvKiBUaGUgdmFyaWFibGUgJ2NvbnRyb2wnIGlzIHVzZWQgdG8gYnVmZmVyIHRoZSBjb250cm9sIGJpdHMgd2hpY2ggYXBwZWFyIGluICovCi0gLyogZ3JvdXBzIG9mIDE2IGJpdHMgKGNvbnRyb2wgd29yZHMpIGF0IHRoZSBzdGFydCBvZiBlYWNoIGNvbXByZXNzZWQgZ3JvdXAuICAqLwotIC8qIFdoZW4gZWFjaCBncm91cCBpcyByZWFkLCBiaXQgMTYgb2YgdGhlIHJlZ2lzdGVyIGlzIHNldCB0byBvbmUuIFdoZW5ldmVyICAgKi8KLSAvKiBhIG5ldyBiaXQgaXMgbmVlZGVkLCB0aGUgcmVnaXN0ZXIgaXMgc2hpZnRlZCByaWdodC4gV2hlbiB0aGUgdmFsdWUgb2YgdGhlICovCi0gLyogcmVnaXN0ZXIgYmVjb21lcyAxLCB3ZSBrbm93IHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYSBncm91cC4gICAgICAqLwotIC8qIEluaXRpYWxpemluZyB0aGUgcmVnaXN0ZXIgdG8gMSB0aHVzIGluc3RydWN0cyB0aGUgY29kZSB0byBmb2xsb3cgdGhhdCBpdCAgKi8KLSAvKiBzaG91bGQgcmVhZCBhIG5ldyBjb250cm9sIHdvcmQgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gcmVnaXN0ZXIgVUxPTkcgY29udHJvbD0xOwotIAotIC8qIFRoZSB2YWx1ZSBvZiAnbGl0ZXJhbHMnIGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgMC4uMy4gSXQgaXMgdGhlIG51bWJlciBvZiAgKi8KLSAvKiBjb25zZWN1dGl2ZSBsaXRlcmFsIGl0ZW1zIGp1c3Qgc2Vlbi4gV2UgaGF2ZSB0byByZWNvcmQgdGhpcyBudW1iZXIgc28gYXMgICovCi0gLyogdG8ga25vdyB3aGVuIHRvIHVwZGF0ZSB0aGUgaGFzaCB0YWJsZS4gV2hlbiBsaXRlcmFscyBnZXRzIHRvIDMsIHRoZXJlICAgICAqLwotIC8qIGhhdmUgYmVlbiB0aHJlZSBjb25zZWN1dGl2ZSBsaXRlcmFscyBhbmQgd2UgY2FuIHVwZGF0ZSBhdCB0aGUgcG9zaXRpb24gb2YgKi8KLSAvKiB0aGUgb2xkZXN0IG9mIHRoZSB0aHJlZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gcmVnaXN0ZXIgVVdPUkQgbGl0ZXJhbHM9MDsKLSAKLSAvKiBDaGVjayB0aGUgbGVhZGluZyBjb3B5IGZsYWcgdG8gc2VlIGlmIHRoZSBjb21wcmVzc29yIGNob3NlIHRvIHVzZSBhIGNvcHkgICovCi0gLyogb3BlcmF0aW9uIGluc3RlYWQgb2YgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24uIElmIGEgY29weSBvcGVyYXRpb24gd2FzICAgICAqLwotIC8qIHVzZWQsIHRoZW4gYWxsIHdlIG5lZWQgdG8gZG8gaXMgY29weSB0aGUgZGF0YSBvdmVyLCBzZXQgdGhlIG91dHB1dCBsZW5ndGggKi8KLSAvKiBhbmQgcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgMAotIGlmICgqcF9zcmNfZmlyc3Q9PUZMQUdfQ09QWSkKLSAgIHsKLSAgICBmYXN0X2NvcHkocF9zcmNfZmlyc3QrRkxBR19CWVRFUyxwX2RzdF9maXJzdCxzcmNfbGVuLUZMQUdfQllURVMpOwotICAgICpwX2RzdF9sZW49c3JjX2xlbi1GTEFHX0JZVEVTOwotICAgIHJldHVybjsKLSAgIH0KLSNlbHNlCi0gIGlmICggc3JjX2xlbiA8IDAgKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZhc3RfY29weShwX3NyY19maXJzdCxwX2RzdF9maXJzdCwtc3JjX2xlbiApOwotICAgKnBfZHN0X2xlbiA9IChVTE9ORyktc3JjX2xlbjsKLSAgIHJldHVybjsKLSAgfQotI2VuZGlmCi0gICAKLSAvKiBJbml0aWFsaXplIGFsbCBlbGVtZW50cyBvZiB0aGUgaGFzaCB0YWJsZSB0byBwb2ludCB0byBhIGNvbnN0YW50IHN0cmluZy4gICovCi0gLyogVXNlIG9mIGFuIHVucm9sbGVkIGxvb3Agc3BlZWRzIHRoaXMgdXAgY29uc2lkZXJhYmx5LiAgICAgICAgICAgICAgICAgICAgICAqLwotIHtVV09SRCBpOyBVQllURSAqKnBfaD1oYXNoOwotIyAgZGVmaW5lIFpKICpwX2grKz1TVEFSVF9TVFJJTkdfMTgKLSAgZm9yIChpPTA7aTwyNTY7aSsrKSAgICAgLyogMjU2PUhBU0hfVEFCTEVfTEVOR1RILzE2LiAqLwotICAgIHtaSjtaSjtaSjtaSjsKLSAgICAgWko7Wko7Wko7Wko7Ci0gICAgIFpKO1pKO1pKO1pKOwotICAgICBaSjtaSjtaSjtaSjt9Ci0gfQotCi0gLyogVGhlIG91dGVyIGxvb3AgcHJvY2Vzc2VzIGVpdGhlciAxIG9yIDE2IGl0ZW1zIHBlciBpdGVyYXRpb24gZGVwZW5kaW5nIG9uICAqLwotIC8qIGhvdyBjbG9zZSBwX3NyYyBpcyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSB3aGlsZSAocF9zcmMhPXBfc3JjX3Bvc3QpCi0gICB7LyogU3RhcnQgb2Ygb3V0ZXIgbG9vcCAqLwotICAgCi0gICAgcmVnaXN0ZXIgVVdPUkQgdW5yb2xsOyAgIC8qIENvdW50cyB1bnJvbGxlZCBsb29wIGV4ZWN1dGlvbnMuICAgICAgICAgICAgICAqLwotICAgIAotICAgIC8qIFdoZW4gJ2NvbnRyb2wnIGhhcyB0aGUgdmFsdWUgMSwgaXQgbWVhbnMgdGhhdCB0aGUgMTYgYnVmZmVyZWQgY29udHJvbCAgKi8KLSAgICAvKiBiaXRzIHRoYXQgd2VyZSByZWFkIGluIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBncm91cCBoYXZlIGFsbCBiZWVuICovCi0gICAgLyogc2hpZnRlZCBvdXQgYW5kIHRoYXQgYWxsIHRoYXQgaXMgbGVmdCBpcyB0aGUgMSBiaXQgdGhhdCB3YXMgaW5qZWN0ZWQgICAqLwotICAgIC8qIGludG8gYml0IDE2IGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBncm91cC4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kICAgKi8KLSAgICAvKiBvZiBhIGdyb3VwLCB3ZSBoYXZlIHRvIGxvYWQgYSBuZXcgY29udHJvbCB3b3JkIGFuZCBpbmplY3QgYSBuZXcgMSBiaXQuICovCi0gICAgaWYgKGNvbnRyb2w9PTEpCi0gICAgICB7Ci0gICAgICAgY29udHJvbD0weDEwMDAwfCpwX3NyYysrOwotICAgICAgIGNvbnRyb2x8PSgqcF9zcmMrKyk8PDg7Ci0gICAgICB9Ci0KLSAgICAvKiBJZiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSB3aXRoaW4gMTYgZ3JvdXBzIGZyb20gdGhlIGVuZCBvZiB0aGUgICAgICovCi0gICAgLyogaW5wdXQsIGV4ZWN1dGUgdGhlIHVucm9sbGVkIGxvb3Agb25seSBvbmNlLCBlbHNlIHByb2Nlc3MgYSB3aG9sZSBncm91cCAqLwotICAgIC8qIG9mIDE2IGl0ZW1zIGJ5IGxvb3BpbmcgMTYgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnJvbGw9IHBfc3JjPD1wX3NyY19tYXgxNiA/IDE2IDogMTsKLQotICAgIC8qIFRoaXMgaW5uZXIgbG9vcCBwcm9jZXNzZXMgb25lIHBocmFzZSAoaXRlbSkgcGVyIGl0ZXJhdGlvbi4gKi8KLSAgICB3aGlsZSAodW5yb2xsLS0pCi0gICAgICB7IC8qIEJlZ2luIHVucm9sbGVkIGlubmVyIGxvb3AuICovCi0gICAgICAKLSAgICAgICAvKiBQcm9jZXNzIGEgbGl0ZXJhbCBvciBjb3B5IGl0ZW0gZGVwZW5kaW5nIG9uIHRoZSBuZXh0IGNvbnRyb2wgYml0LiAqLwotICAgICAgIGlmIChjb250cm9sJjEpCi0gICAgICAgICB7Ci0gICAgICAgICAgLyogQ29weSBpdGVtLiAqLwotICAgICAgICAgIAotICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICpwOyAgICAgICAgICAgLyogUG9pbnRzIHRvIHBsYWNlIGZyb20gd2hpY2ggdG8gY29weS4gKi8KLSAgICAgICAgICByZWdpc3RlciBVV09SRCBsZW5tdDsgICAgICAgIC8qIExlbmd0aCBvZiBjb3B5IGl0ZW0gbWludXMgdGhyZWUuICAgICovCi0gICAgICAgICAgcmVnaXN0ZXIgVUJZVEUgKipwX2h0ZTsgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgaGFzaCB0YWJsZSBlbnRyeS4qLwotICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICpwX3ppdj1wX2RzdDsgLyogUG9pbnRlciB0byBzdGFydCBvZiBjdXJyZW50IFppdi4gICAgKi8KLSAgICAgICAgICAKLSAgICAgICAgICAvKiBSZWFkIGFuZCBkaXNtYW50bGUgdGhlIGNvcHkgd29yZC4gV29yayBvdXQgZnJvbSB3aGVyZSB0byBjb3B5LiAgICovCi0gICAgICAgICAgbGVubXQ9KnBfc3JjKys7Ci0gICAgICAgICAgcF9odGU9Jmhhc2hbKChsZW5tdCYweEYwKTw8NCl8KnBfc3JjKytdOwotICAgICAgICAgIHA9KnBfaHRlOwotICAgICAgICAgIGxlbm10Jj0weEY7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyogTm93IHBlcmZvcm0gdGhlIGNvcHkgdXNpbmcgYSBoYWxmIHVucm9sbGVkIGxvb3AuICovCi0gICAgICAgICAgKnBfZHN0Kys9KnArKzsKLSAgICAgICAgICAqcF9kc3QrKz0qcCsrOwotICAgICAgICAgICpwX2RzdCsrPSpwKys7Ci0gICAgICAgICAgd2hpbGUgKGxlbm10LS0pCi0gICAgICAgICAgICAgKnBfZHN0Kys9KnArKzsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLyogQmVjYXVzZSB3ZSBoYXZlIGp1c3QgcmVjZWl2ZWQgMyBvciBtb3JlIGJ5dGVzIGluIGEgY29weSBpdGVtICAgICAqLwotICAgICAgICAgIC8qICh3aG9zZSBieXRlcyB3ZSBoYXZlIGp1c3QgaW5zdGFsbGVkIGluIHRoZSBvdXRwdXQpLCB3ZSBhcmUgbm93ICAgKi8KLSAgICAgICAgICAvKiBpbiBhIHBvc2l0aW9uIHRvIGZsdXNoIGFsbCB0aGUgcGVuZGluZyBsaXRlcmFsIGhhc2hpbmdzIHRoYXQgaGFkICovCi0gICAgICAgICAgLyogYmVlbiBwb3N0cG9uZWQgZm9yIGxhY2sgb2YgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmIChsaXRlcmFscz4wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICpyPXBfeml2LWxpdGVyYWxzOwotICAgICAgICAgICAgIGhhc2hbSEFTSChyKV09cjsKLSAgICAgICAgICAgICBpZiAobGl0ZXJhbHM9PTIpCi0gICAgICAgICAgICAgICAge3IrKzsgaGFzaFtIQVNIKHIpXT1yO30KLSAgICAgICAgICAgICBsaXRlcmFscz0wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgLyogSW4gYW55IGNhc2UsIHdlIGNhbiBpbW1lZGlhdGVseSB1cGRhdGUgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgICAqLwotICAgICAgICAgIC8qIGN1cnJlbnQgcG9zaXRpb24uIFdlIGRvbid0IG5lZWQgdG8gZG8gYSBIQVNIKC4uLikgdG8gd29yayBvdXQgICAgKi8KLSAgICAgICAgICAvKiB3aGVyZSB0byBwdXQgdGhlIHBvaW50ZXIsIGFzIHRoZSBjb21wcmVzc29yIGp1c3QgdG9sZCB1cyEhISAgICAgICovCi0gICAgICAgICAgKnBfaHRlPXBfeml2OwotICAgICAgICAgIAotICAgICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAvKiBMaXRlcmFsIGl0ZW0uICovCi0gICAgICAgICAgCi0gICAgICAgICAgLyogQ29weSBvdmVyIHRoZSBsaXRlcmFsIGJ5dGUuICovCi0gICAgICAgICAgKnBfZHN0Kys9KnBfc3JjKys7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyogSWYgd2Ugbm93IGhhdmUgdGhyZWUgbGl0ZXJhbHMgd2FpdGluZyB0byBiZSBoYXNoZWQgaW50byB0aGUgaGFzaCAqLwotICAgICAgICAgIC8qIHRhYmxlLCB3ZSBjYW4gZG8gb25lIG9mIHRoZW0gbm93IChiZWNhdXNlIHRoZXJlIGFyZSB0aHJlZSkuICAgICAgKi8KLSAgICAgICAgICBpZiAoKytsaXRlcmFscyA9PSAzKQotICAgICAgICAgICAgIHtyZWdpc3RlciBVQllURSAqcD1wX2RzdC0zOyBoYXNoW0hBU0gocCldPXA7IGxpdGVyYWxzPTI7fQotICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgIC8qIFNoaWZ0IHRoZSBjb250cm9sIGJ1ZmZlciBzbyB0aGUgbmV4dCBjb250cm9sIGJpdCBpcyBpbiBiaXQgMC4gKi8KLSAgICAgICBjb250cm9sPj49MTsKLSNpZiAxCi0gICAgICAgaWYgKHBfZHN0ID4gcF9kc3RfcG9zdCkgCi0gICAgICAgewotCSAgICAgICAvKiBTaGl0OiB3ZSB0cmllZCB0byBkZWNvbXByZXNzIGNvcnJ1cHQgZGF0YSAqLwotCSAgICAgICAqcF9kc3RfbGVuID0gMDsKLQkgICAgICAgcmV0dXJuOwotICAgICAgIH0KLSNlbmRpZgotICAgICAgfSAvKiBFbmQgdW5yb2xsZWQgaW5uZXIgbG9vcC4gKi8KLSAgICAgICAgICAgICAgIAotICAgfSAvKiBFbmQgb2Ygb3V0ZXIgbG9vcCAqLwotICAgCi0gLyogV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgZGVjb21wcmVzc2VkIGRhdGEgYmVmb3JlIHJldHVybmluZy4gKi8KLSAgKnBfZHN0X2xlbj1wX2RzdC1wX2RzdF9maXJzdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiBMWlJXMy5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2ZlYmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0jaWZuZGVmIF9MWlJXM19ICi0jZGVmaW5lIF9MWlJXM19ICi0vKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4xICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjMwICQKLSAqCi0gKiAgaW5jbHVkZSBmaWxlcyBmb3IgbHpydzMuIE9ubHkgc2xpZ2h0eSBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbAotICogIHZlcnNpb24uIEFzc2VtYmxlcyB0aGUgdGhyZWUgaW5jbHVkZSBmaWxlcyBjb21wcmVzcy5oLCBwb3J0LmggYW5kCi0gKiAgZmFzdGNvcHkuaCBmcm9tIHRoZSBvcmlnaW5hbCBsenJ3MyBwYWNrYWdlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQXV0aG9yIDogUm9zcyBXaWxsaWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERhdGUgICA6IERlY2VtYmVyIDE5ODkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gYSBzZXQgb2YgZnVuY3Rpb25zIGNhbGxlZCAgICAgICAgKi8KLS8qICdjb21wcmVzcycsIGVhY2ggbWVtYmVyIG9mIHdoaWNoIGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIGRhdGEgY29tcHJlc3Npb24gICovCi0vKiBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5vcm1hbGx5IGluIEMgcHJvZ3JhbW1pbmcsIGZvciBlYWNoIC5IIGZpbGUsIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyAuQyAgICovCi0vKiBmaWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIHByb21pc2VkIGluIHRoZSAuSCBmaWxlLiAgICAgICAgICAgICAgICAqLwotLyogSGVyZSwgdGhlcmUgYXJlIG1hbnkgLkMgZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGhlYWRlciBmaWxlLiAgICAgICAgICAgKi8KLS8qIEVhY2ggY29tZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIGZ1bmN0aW9uICAgICAgICAgICAgICovCi0vKiBjYWxsZWQgJ2NvbXByZXNzJyB0aGF0IGltcGxlbWVudHMgYSBzaW5nbGUgZGF0YSBjb21wcmVzc2lvbiAgICAgICAgICAgICAgICAqLwotLyogYWxnb3JpdGhtIHRoYXQgY29uZm9ybXMgd2l0aCB0aGUgaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGlzIGhlYWRlciBmaWxlLiAgKi8KLS8qIE9ubHkgb25lIGFsZ29yaXRobSBjYW4gYmUgbGlua2VkIGluIGF0IGEgdGltZSBpbiB0aGlzIG9yZ2FuaXphdGlvbi4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBGVU5DVElPTiBDT01QUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTdW1tYXJ5IG9mIEZ1bmN0aW9uIENvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBhY3Rpb24gdGhhdCAnY29tcHJlc3MnIHRha2VzIGRlcGVuZHMgb24gaXRzIGZpcnN0IGFyZ3VtZW50IGNhbGxlZCAgICAgICovCi0vKiAnYWN0aW9uJy4gIFRoZSBmdW5jdGlvbiBwcm92aWRlcyB0aHJlZSBhY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAtIENvbXByZXNzICAgYSBibG9jayBvZiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgLSBEZWNvbXByZXNzIGEgYmxvY2sgb2YgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFNlZSB0aGUgZm9ybWFsIEMgZGVmaW5pdGlvbiBsYXRlciBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycy4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBDT01QUkVTU19PVkVSUlVOOiBUaGUgY29uc3RhbnQgQ09NUFJFU1NfT1ZFUlJVTiBkZWZpbmVzIGJ5IGhvdyBtYW55IGJ5dGVzICAqLwotLyogYW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8gZXhwYW5kIGEgYmxvY2sgZHVyaW5nIGEgY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBBbHRob3VnaCBjb21wcmVzc2lvbiBhbGdvcml0aG1zIHVzdWFsbHkgY29tcHJlc3MgZGF0YSwgdGhlcmUgd2lsbCBhbHdheXMgICAqLwotLyogYmUgZGF0YSB0aGF0IGEgZ2l2ZW4gY29tcHJlc3NvciB3aWxsIGV4cGFuZCAodGhpcyBjYW4gYmUgcHJvdmVuKS4gICAgICAgICAgKi8KLS8qIEZvcnR1bmF0ZWx5LCB0aGUgZGVncmVlIG9mIGV4cGFuc2lvbiBjYW4gYmUgbGltaXRlZCB0byBhIHNpbmdsZSBiaXQsIGJ5ICAgICovCi0vKiBjb3B5aW5nIG92ZXIgdGhlIGlucHV0IGRhdGEgaWYgdGhlIGRhdGEgZ2V0cyBiaWdnZXIgZHVyaW5nIGNvbXByZXNzaW9uLiAgICAqLwotLyogVG8gYWxsb3cgZm9yIHRoaXMgcG9zc2liaWxpdHksIHRoZSBmaXJzdCBiaXQgb2YgYSBjb21wcmVzc2VkICAgICAgICAgICAgICAgKi8KLS8qIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlICAgICAgICAgICAgICAgICovCi0vKiBpbnB1dCBkYXRhIHdhcyBjb3BpZWQgb3Zlciwgb3IgdHJ1bHkgY29tcHJlc3NlZC4gSW4gcHJhY3RpY2UsIHRoZSBmaXJzdCAgICAqLwotLyogYnl0ZSB3b3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoaXMgYml0IHNvIGFzIHRvIG1haW50YWluIGJ5dGUgYWxpZ25tZW50LiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBVbmZvcnR1bmF0ZWx5LCBpbiBnZW5lcmFsLCB0aGUgb25seSB3YXkgdG8gdGVsbCBpZiBhbiBhbGdvcml0aG0gd2lsbCAgICAgICAqLwotLyogZXhwYW5kIGEgcGFydGljdWxhciBibG9jayBvZiBkYXRhIGlzIHRvIHJ1biB0aGUgYWxnb3JpdGhtIG9uIHRoZSBkYXRhLiAgICAgKi8KLS8qIElmIHRoZSBhbGdvcml0aG0gZG9lcyBub3QgY29udGludW91c2x5IG1vbml0b3IgaG93IG1hbnkgb3V0cHV0IGJ5dGVzIGl0ICAgICovCi0vKiBoYXMgd3JpdHRlbiwgaXQgbWlnaHQgd3JpdGUgYW4gb3V0cHV0IGJsb2NrIGZhciBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgICAgICAqLwotLyogYmxvY2sgYmVmb3JlIHJlYWxpemluZyB0aGF0IGl0IGhhcyBkb25lIHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9uIHRoZSBvdGhlciBoYW5kLCBjb250aW51b3VzIGNoZWNrcyBvbiBvdXRwdXQgbGVuZ3RoIGFyZSBpbmVmZmljaWVudC4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVG8gY2F0ZXIgZm9yIGFsbCB0aGVzZSBwcm9ibGVtcywgdGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbjogICAgICAgICAgICAgICAgKi8KLS8qID4gQWxsb3dzIGEgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHJldHVybiBhbiBvdXRwdXQgYmxvY2sgdGhhdCBpcyB1cCB0byAgICovCi0vKiAgIENPTVBSRVNTX09WRVJSVU4gYnl0ZXMgbG9uZ2VyIHRoYW4gdGhlIGlucHV0IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPiBBbGxvd3MgYSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gd3JpdGUgdXAgdG8gQ09NUFJFU1NfT1ZFUlJVTiBieXRlcyAgICAgKi8KLS8qICAgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrIHRvIHRoZSBtZW1vcnkgb2YgdGhlIG91dHB1dCAgICAgICovCi0vKiAgIGJsb2NrIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJsb2NrIGV2ZW50dWFsbHkgcmV0dXJuZWQuICAqLwotLyogICBUaGlzIGFsbG93cyBhbiBhbGdvcml0aG0gdG8gb3ZlcnJ1biB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgKi8KLS8qICAgb3V0cHV0IGJsb2NrIGJ5IHVwIHRvIENPTVBSRVNTX09WRVJSVU4gYnl0ZXMgYmV0d2VlbiBleHBhbnNpb24gY2hlY2tzLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHByb2JsZW0gZG9lcyBub3QgYXJpc2UgZm9yIGRlY29tcHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJZGVudGl0eSBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gYWN0aW9uIG11c3QgYmUgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA+IHBfZHN0X2xlbiBtdXN0IHBvaW50IHRvIGEgbG9uZ3dvcmQgdG8gcmVjZWl2ZSBhIGxvbmd3b3JkIGFkZHJlc3MuICAgICAgICAqLwotLyogPiBUaGUgdmFsdWUgb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gQWZ0ZXIgZXhlY3V0aW9uLCB0aGUgbG9uZ3dvcmQgdGhhdCBwX2RzdF9sZW4gcG9pbnRzIHRvIHdpbGwgYmUgYSBwb2ludGVyICovCi0vKiAgIHRvIGEgc3RydWN0dXJlIG9mIHR5cGUgY29tcHJlc3NfaWRlbnRpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaHVzLCBmb3IgZXhhbXBsZSwgYWZ0ZXIgdGhlIGNhbGwsICgqcF9kc3RfbGVuKS0+bWVtb3J5IHdpbGwgcmV0dXJuIHRoZSAgKi8KLS8qICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHdvcmtpbmcgbWVtb3J5IHRoYXQgdGhlIGFsZ29yaXRobSByZXF1aXJlcyB0byBydW4uICAgICovCi0vKiA+IFRoZSB2YWx1ZXMgb2YgdGhlIGlkZW50aXR5IHN0cnVjdHVyZSByZXR1cm5lZCBhcmUgZml4ZWQgY29uc3RhbnQgICAgICAgICAqLwotLyogICBhdHRyaWJ1dGVzIG9mIHRoZSBhbGdvcml0aG0gYW5kIG11c3Qgbm90IHZhcnkgZnJvbSBjYWxsIHRvIGNhbGwuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBDb21tb24gUmVxdWlyZW1lbnRzIGZvciBDb21wcmVzc2lvbiBhbmQgRGVjb21wcmVzc2lvbiBBY3Rpb25zICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgKi8KLS8qID4gd3JrX21lbSBtdXN0IHBvaW50IHRvIGFuIHVudXNlZCBibG9jayBvZiBtZW1vcnkgb2YgYSBsZW5ndGggc3BlY2lmaWVkIGluICovCi0vKiAgIHRoZSBhbGdvcml0aG0ncyBpZGVudGl0eSBibG9jay4gVGhlIGlkZW50aXR5IGJsb2NrIGNhbiBiZSBvYnRhaW5lZCBieSAgICAqLwotLyogICBtYWtpbmcgYSBzZXBhcmF0ZSBjYWxsIHRvIGNvbXByZXNzLCBzcGVjaWZ5aW5nIHRoZSBpZGVudGl0eSBhY3Rpb24uICAgICAgKi8KLS8qID4gVGhlIElOUFVUIEJMT0NLIGlzIGRlZmluZWQgdG8gYmUgTWVtb3J5W3NyY19hZGRyLHNyY19hZGRyK3NyY19sZW4tMV0uICAgICovCi0vKiA+IGRzdF9sZW4gd2lsbCBiZSB1c2VkIHRvIGRlbm90ZSAqcF9kc3RfbGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPiBkc3RfbGVuIGlzIG5vdCByZWFkIGJ5IGNvbXByZXNzLCBvbmx5IHdyaXR0ZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gVGhlIHZhbHVlIG9mIGRzdF9sZW4gaXMgZGVmaW5lZCBvbmx5IHVwb24gdGVybWluYXRpb24uICAgICAgICAgICAgICAgICAgICovCi0vKiA+IFRoZSBPVVRQVVQgQkxPQ0sgaXMgZGVmaW5lZCB0byBiZSBNZW1vcnlbZHN0X2FkZHIsZHN0X2FkZHIrZHN0X2xlbi0xXS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIENvbXByZXNzaW9uIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPiBhY3Rpb24gbXVzdCBiZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gc3JjX2xlbiBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfT1JHXS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA+IFRoZSBPVVRQVVQgWk9ORSBpcyBkZWZpbmVkIHRvIGJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBNZW1vcnlbZHN0X2FkZHIsZHN0X2FkZHIrc3JjX2xlbi0xK0NPTVBSRVNTX09WRVJSVU5dLiAgICAgICAgICAgICAgICAgKi8KLS8qID4gVGhlIGZ1bmN0aW9uIGNhbiBtb2RpZnkgYW55IHBhcnQgb2YgdGhlIG91dHB1dCB6b25lIHJlZ2FyZGxlc3Mgb2YgdGhlICAgICovCi0vKiAgIGZpbmFsIGxlbmd0aCBvZiB0aGUgb3V0cHV0IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPiBUaGUgaW5wdXQgYmxvY2sgYW5kIHRoZSBvdXRwdXQgem9uZSBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxzcmNfbGVuK0NPTVBSRVNTX09WRVJSVU5dLiAgICAgICAgICAgICAgICovCi0vKiA+IGRzdF9sZW4gd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsQ09NUFJFU1NfTUFYX0NPTV0gKGZyb20gcHJldiBmYWN0KS4gICAgICAqLwotLyogPiBUaGUgb3V0cHV0IGJsb2NrIHdpbGwgY29uc2lzdCBvZiBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCBibG9jay4gICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBEZWNvbXByZXNzaW9uIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gYWN0aW9uIG11c3QgYmUgQ09NUFJFU1NfQUNUSU9OX0RFQ09NUFJFU1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA+IFRoZSBpbnB1dCBibG9jayBtdXN0IGJlIHRoZSByZXN1bHQgb2YgYW4gZWFybGllciBjb21wcmVzc2lvbiBvcGVyYXRpb24uICAqLwotLyogPiBJZiB0aGUgcHJldmlvdXMgZmFjdCBpcyB0cnVlLCB0aGUgZm9sbG93aW5nIGZhY3RzIG11c3QgYWxzbyBiZSB0cnVlOiAgICAgKi8KLS8qICAgPiBzcmNfbGVuIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswLENPTVBSRVNTX01BWF9DT01dLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfT1JHXS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogPiBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3MgbXVzdCBub3Qgb3ZlcmxhcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID4gT25seSB0aGUgb3V0cHV0IGJsb2NrIGlzIG1vZGlmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA+IFVwb24gdGVybWluYXRpb24sIHRoZSBvdXRwdXQgYmxvY2sgd2lsbCBjb25zaXN0IG9mIHRoZSBieXRlcyBjb250YWluZWQgICAqLwotLyogICBpbiB0aGUgaW5wdXQgYmxvY2sgcGFzc2VkIHRvIHRoZSBlYXJsaWVyIGNvbXByZXNzaW9uIG9wZXJhdGlvbi4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9SVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIG1vZHVsZSBjb250YWlucyBtYWNybyBkZWZpbml0aW9ucyBhbmQgdHlwZXMgdGhhdCBhcmUgbGlrZWx5IHRvICAgICAgICAqLwotLyogY2hhbmdlIGJldHdlZW4gY29tcHV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIERPTkVfUE9SVCAgICAgICAvKiBPbmx5IGRvIHRoaXMgaWYgbm90IHByZXZpb3VzbHkgZG9uZS4gICAgICAgICAgICAgICAqLwotCi0gICAjaWZkZWYgVEhJTktfQwotICAgICAgI2RlZmluZSBVQllURSB1bnNpZ25lZCBjaGFyICAgICAgLyogVW5zaWduZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICNkZWZpbmUgVVdPUkQgdW5zaWduZWQgaW50ICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDIgYnl0ZXMpICAgICAgICAgICAgICovCi0gICAgICAjZGVmaW5lIFVMT05HIHVuc2lnbmVkIGxvbmcgICAgICAvKiBVbnNpZ25lZCB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLwotICAgICAgI2RlZmluZSBCT09MICB1bnNpZ25lZCBjaGFyICAgICAgLyogQm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICNkZWZpbmUgRk9QRU5fQklOQVJZX1JFQUQgICJyYiIgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgcmVhZGluZy4gICAgICovCi0gICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9XUklURSAid2IiICAvKiBNb2RlIHN0cmluZyBmb3IgYmluYXJ5IHdyaXRpbmcuICAgICAqLwotICAgICAgI2RlZmluZSBGT1BFTl9URVhUX0FQUEVORCAgImEiICAgLyogTW9kZSBzdHJpbmcgZm9yIHRleHQgYXBwZW5kaW5nLiAgICAgKi8KLSAgICAgICNkZWZpbmUgUkVBTCBkb3VibGUgICAgICAgICAgICAgIC8qIFVTZWQgZm9yIGZsb2F0aW5nIHBvaW50IHN0dWZmLiAgICAgICovCi0gICAjZW5kaWYKLSAgICNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKGxpbnV4KQotICAgICAgI2RlZmluZSBVQllURSBfX3U4ICAgICAgICAgICAgICAgLyogVW5zaWduZWQgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICNkZWZpbmUgVVdPUkQgX191MTYgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDIgYnl0ZXMpICAgICAgICAgICAgICovCi0gICAgICAjZGVmaW5lIFVMT05HIF9fdTMyICAgICAgICAgICAgICAvKiBVbnNpZ25lZCB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLwotICAgICAgI2RlZmluZSBMT05HICBfX3MzMiAgICAgICAgICAgICAgLyogU2lnbmVkICAgd29yZCAoNCBieXRlcykgICAgICAgICAgICAgKi8KLSAgICAgICNkZWZpbmUgQk9PTCAgaXMgbm90IHVzZWQgaGVyZSAgIC8qIEJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9SRUFEICBub3QgdXNlZCAgLyogTW9kZSBzdHJpbmcgZm9yIGJpbmFyeSByZWFkaW5nLiAqLwotICAgICAgI2RlZmluZSBGT1BFTl9CSU5BUllfV1JJVEUgbm90IHVzZWQgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgd3JpdGluZy4gKi8KLSAgICAgICNkZWZpbmUgRk9QRU5fVEVYVF9BUFBFTkQgIG5vdCB1c2VkICAvKiBNb2RlIHN0cmluZyBmb3IgdGV4dCBhcHBlbmRpbmcuICovCi0gICAgICAjZGVmaW5lIFJFQUwgbm90IHVzZWQgICAgICAgICAgICAgICAgLyogVVNlZCBmb3IgZmxvYXRpbmcgcG9pbnQgc3R1ZmYuICAqLwotICAgICAgI2lmbmRlZiBUUlVFCi0gICAgICAjZGVmaW5lIFRSVUUgMQotICAgICAgI2VuZGlmCi0gICAjZW5kaWYKLQotICAgI2RlZmluZSBET05FX1BPUlQgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgZG8gYWxsIHRoaXMgYWdhaW4uICAgICAgICAgICAgKi8KLSAgICNkZWZpbmUgTUFMTE9DX0ZBSUwgTlVMTCAgICAgICAgICAgIC8qIEZhaWx1cmUgc3RhdHVzIGZyb20gbWFsbG9jKCkgICAgICAgICovCi0gICAjZGVmaW5lIExPQ0FMIHN0YXRpYyAgICAgICAgICAgICAgICAvKiBGb3Igbm9uLWV4cG9ydGVkIHJvdXRpbmVzLiAgICAgICAgICAqLwotICAgI2RlZmluZSBFWFBPUlQgICAgICAgICAgICAgICAgICAgICAgLyogU2lnbmFscyBleHBvcnRlZCBmdW5jdGlvbi4gICAgICAgICAgKi8KLSAgICNkZWZpbmUgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZWZ1bCBmb3IgYWxpZ25pbmcgaWZzLiAgICAgICAgICAgICovCi0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgUE9SVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQ09NUFJFU1NfQUNUSU9OX0lERU5USVRZICAgMAotI2RlZmluZSBDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MgICAxCi0jZGVmaW5lIENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTIDIKLQotI2RlZmluZSBDT01QUkVTU19PVkVSUlVOIDEwMjQKLSNkZWZpbmUgQ09NUFJFU1NfTUFYX0NPTSAweDcwMDAwMDAwCi0jZGVmaW5lIENPTVBSRVNTX01BWF9PUkcgKENPTVBSRVNTX01BWF9DT00tQ09NUFJFU1NfT1ZFUlJVTikKLQotI2RlZmluZSBDT01QUkVTU19NQVhfU1RSTEVOIDI1NQotCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWxnb3JpdGhtLiAgICAgICAgICovCi0vKiA+IFRoZSB0b3AgYml0IG9mIGlkIG11c3QgYmUgemVyby4gVGhlIHJlbWFpbmluZyBiaXRzIG11c3QgYmUgY2hvc2VuIGJ5ICAgICovCi0vKiAgIHRoZSBhdXRob3Igb2YgdGhlIGFsZ29yaXRobSBieSB0b3NzaW5nIGEgY29pbiAzMSB0aW1lcy4gICAgICAgICAgICAgICAgICovCi0vKiA+IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVlc3RlZCBieSB0aGUgYWxnb3JpdGhtIGlzIHNwZWNpZmllZCBpbiBieXRlcyAgICovCi0vKiAgIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwweDcwMDAwMDAwXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA+IEFsbCBzdHJpbmdzIHMgbXVzdCBiZSBzdWNoIHRoYXQgc3RybGVuKHMpPD1DT01QUkVTU19NQVhfU1RSTEVOLiAgICAgICAgICovCi1zdHJ1Y3QgY29tcHJlc3NfaWRlbnRpdHkKLSAgewotICAgVUxPTkcgaWQ7ICAgICAgICAgICAvKiBJZGVudGlmeWluZyBudW1iZXIgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICovCi0gICBVTE9ORyBtZW1vcnk7ICAgICAgIC8qIE51bWJlciBvZiBieXRlcyBvZiB3b3JraW5nIG1lbW9yeSByZXF1aXJlZC4gKi8KLQotICAgY2hhciAgKm5hbWU7ICAgICAgICAvKiBOYW1lIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICBjaGFyICAqdmVyc2lvbjsgICAgIC8qIFZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgIGNoYXIgICpkYXRlOyAgICAgICAgLyogRGF0ZSBvZiByZWxlYXNlIG9mIHRoaXMgdmVyc2lvbi4gICAgICAgICAgICAqLwotICAgY2hhciAgKmNvcHlyaWdodDsgICAvKiBDb3B5cmlnaHQgbWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgIGNoYXIgICphdXRob3I7ICAgICAgLyogQXV0aG9yIG9mIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgY2hhciAgKmFmZmlsaWF0aW9uOyAvKiBBZmZpbGlhdGlvbiBvZiBhdXRob3IuICAgICAgICAgICAgICAgICAgICAgICovCi0gICBjaGFyICAqdmVuZG9yOyAgICAgIC8qIFdoZXJlIHRoZSBhbGdvcml0aG0gY2FuIGJlIG9idGFpbmVkLiAgICAgICAgKi8KLSAgfTsKLQotdm9pZCAgbHpydzNfY29tcHJlc3MoICAgICAgICAvKiBTaW5nbGUgZnVuY3Rpb24gaW50ZXJmYWNlIHRvIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gKi8KLVVXT1JEICAgICBhY3Rpb24sICAgICAgLyogQWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1VQllURSAgICp3cmtfbWVtLCAgICAgIC8qIFdvcmtpbmcgbWVtb3J5IHRlbXBvcmFyaWx5IGdpdmVuIHRvIHJvdXRpbmUgdG8gdXNlLiAqLwotVUJZVEUgICAqc3JjX2FkciwgICAgICAvKiBBZGRyZXNzIG9mIGlucHV0ICBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUxPTkcgICAgIHNyY19sZW4sICAgICAgLyogTGVuZ3RoICBvZiBpbnB1dCAgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1VQllURSAgICpkc3RfYWRyLCAgICAgIC8qIEFkZHJlc3Mgb2Ygb3V0cHV0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotdm9pZCAgKnBfZHN0X2xlbiAgICAgICAvKiBQb2ludGVyIHRvIGEgbG9uZ3dvcmQgd2hlcmUgcm91dGluZSB3aWxsIHdyaXRlOiAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogICAgSWYgYWN0aW9uPS4uSURFTlRJVFkgICA9PiBBZHIgb2YgaWQgc3RydWN0dXJlLiAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIC8qICAgIElmIGFjdGlvbj0uLkNPTVBSRVNTICAgPT4gTGVuZ3RoIG9mIG91dHB1dCBkYXRhLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBJZiBhY3Rpb249Li5ERUNPTVBSRVNTID0+IExlbmd0aCBvZiBvdXRwdXQgZGF0YS4gKi8KLSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIENPTVBSRVNTLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdF9jb3B5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgZnVuY3Rpb24gY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IHZlcnkgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZXhhY3Qgc3BlZWQgZGVwZW5kcyBvbiB0aGUgcmVsYXRpdmUgYWxpZ25tZW50IG9mIHRoZSBibG9ja3Mgb2YgbWVtb3J5LiAqLwotLyogUFJFICA6IDA8PXNyY19sZW48PSgyXjMyKS0xIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBSRSAgOiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJsb2NrcyBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQT1NUIDogTUVNW2RzdF9hZHIsZHN0X2FkcitzcmNfbGVuLTFdPU1FTVtzcmNfYWRyLHNyY19hZHIrc3JjX2xlbi0xXS4gICAgICAqLwotLyogUE9TVCA6IE1FTVtkc3RfYWRyLGRzdF9hZHIrc3JjX2xlbi0xXSBpcyB0aGUgb25seSBtZW1vcnkgY2hhbmdlZC4gICAgICAgICAgKi8KLQotI2RlZmluZSBmYXN0X2NvcHkoc3JjLGRzdCxsZW4pIG1lbWNweShkc3Qsc3JjLGxlbikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiBmYXN0X2NvcHkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmZjMGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAzICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3IENsYXVzLUp1c3R1cyBIZWluZQotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSBVU0EuCi0gCi0gKgotICogICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgImdlbmVyaWMiIGludGVyZmFjZSBiZXR3ZWVuIHRoZSAqCi0gKiAgICAgemZ0YXBlLWRyaXZlciBhbmQgYSBjb21wcmVzc2lvbi1hbGdvcml0aG0uIFRoZSAqCi0gKiAgICAgY29tcHJlc3Npb24tYWxnb3JpdGhtIGN1cnJlbnRseSB1c2VkIGlzIGEgTFo3Ny4gSSB1c2UgdGhlICoKLSAqICAgICBpbXBsZW1lbnRhdGlvbiBsenJ3MyBieSBSb3NzIE4uIFdpbGxpYW1zIChSZW5haXNzYW5jZSAqCi0gKiAgICAgU29mdHdhcmUpLiBUaGUgY29tcHJlc3Npb24gcHJvZ3JhbSBpdHNlbGYgaXMgaW4gdGhlIGZpbGUKLSAqICAgICBsenJ3My5jICogYW5kIGx6cnczLmguICBUbyBhZG9wdCBhbm90aGVyIGNvbXByZXNzaW9uIGFsZ29yaXRobQotICogICAgIHRoZSBmdW5jdGlvbnMgKiB6ZnRfY29tcHJlc3MoKSBhbmQgemZ0X3VuY29tcHJlc3MoKSBtdXN0IGJlCi0gKiAgICAgY2hhbmdlZCAqIGFwcHJvcHJpYXRlbHkuIFNlZSBiZWxvdy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLSNpbmNsdWRlICIuLi9jb21wcmVzc29yL2x6cnczLmgiCi0KLS8qCi0gKiAgIGdsb2JhbCB2YXJpYWJsZXMKLSAqLwotCi0vKiBJIGhhbmRsZSB0aGUgYWxsb2NhdGlvbiBvZiB0aGlzIGJ1ZmZlciBhcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZQotICogaXQncyBzaXplIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHRhcGUgbGVuZ3RoIGluc2VydGVkLgotICovCi0KLS8qIGxvY2FsIHZhcmlhYmxlcyAKLSAqLwotc3RhdGljIHZvaWQgKnpmdGNfd3JrX21lbSA9IE5VTEw7Ci1zdGF0aWMgX191OCAqemZ0Y19idWYgICAgID0gTlVMTDsKLXN0YXRpYyB2b2lkICp6ZnRjX3NjcmF0Y2hfYnVmICA9IE5VTEw7Ci0KLS8qIGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgemZ0Y193cl91bmNvbXByZXNzZWQgPSAwOwotc3RhdGljIHVuc2lnbmVkIGludCB6ZnRjX3dyX2NvbXByZXNzZWQgICA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHpmdGNfcmRfdW5jb21wcmVzc2VkID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgemZ0Y19yZF9jb21wcmVzc2VkICAgPSAwOwotCi0vKiBmb3J3YXJkICovCi1zdGF0aWMgaW50ICB6ZnRjX3dyaXRlKGludCAqd3JpdGVfY250LAotCQkgICAgICAgX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKLQkJICAgICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKLQkJICAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKLXN0YXRpYyBpbnQgIHpmdGNfcmVhZChpbnQgKnJlYWRfY250LAotCQkgICAgICBfX3U4ICBfX3VzZXIgKmRzdF9idWYsIGNvbnN0IGludCB0b19kbywKLQkJICAgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKLQkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOwotc3RhdGljIGludCAgemZ0Y19zZWVrKHVuc2lnbmVkIGludCBuZXdfYmxvY2tfcG9zLCAKLQkJICAgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCi0JCSAgICAgIF9fdTggKmJ1ZmZlcik7Ci1zdGF0aWMgdm9pZCB6ZnRjX2xvY2sgICAodm9pZCk7Ci1zdGF0aWMgdm9pZCB6ZnRjX3Jlc2V0ICAodm9pZCk7Ci1zdGF0aWMgdm9pZCB6ZnRjX2NsZWFudXAodm9pZCk7Ci1zdGF0aWMgdm9pZCB6ZnRjX3N0YXRzICAgICAgKHZvaWQpOwotCi0vKiBjb21wcmVzc2VkIHNlZ21lbnQuIFRoaXMgY29uZm9ybXMgdG8gUUlDLTgwLU1DLCBSZXZpc2lvbiBLLgotICogCi0gKiBSZXYuIEsgYXBwbGllcyB0byB0YXBlcyB3aXRoIGBmaXhlZCBsZW5ndGggZm9ybWF0JyB3aGljaCBpcwotICogaW5kaWNhdGVkIGJ5IGZvcm1hdCBjb2RlIDIsMyBhbmQgNS4gU2VlIGJlbG93IGZvciBmb3JtYXQgY29kZSA0IGFuZCA2Ci0gKgotICogMiBieXRlczogb2Zmc2V0IG9mIGNvbXByZXNzaW9uIHNlZ21lbnQgc3RydWN0dXJlCi0gKiAgICAgICAgICAyOWsgPiBvZmZzZXQgPj0gMjlrLTE4OiBkYXRhIGZyb20gcHJldmlvdXMgc2VnbWVudCBlbnMgaW4gdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBhbmQgbm8gY29tcHJlc3NlZCBibG9jayBzdGFydHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoaXMgc2VnbWVudAotICogICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPT0gMDogZGF0YSBmcm9tIHByZXZpb3VzIHNlZ21lbnQgb2NjdXBpZXMgZW50aXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50IGFuZCBjb250aW51ZXMgaW4gbmV4dCBzZWdtZW50Ci0gKiBuIGJ5dGVzOiByZW1haW5kZXIgZnJvbSBwcmV2aW91cyBzZWdtZW50Ci0gKiAKLSAqIFJldi4gSzogIAotICogNCBieXRlczogNCBieXRlczogZmlsZXMgc2V0IGJ5dGUgb2Zmc2V0Ci0gKiBQb3N0IFJldi4gSyBhbmQgUUlDLTMwMjAvMzAyMDoKLSAqIDggYnl0ZXM6IDggYnl0ZXM6IGZpbGVzIHNldCBieXRlIG9mZnNldAotICogMiBieXRlczogYnl0ZSBjb3VudCBOIChhbW91bnQgb2YgZGF0YSBmb2xsb3dpbmcpCi0gKiAgICAgICAgICBiaXQgMTUgaXMgc2V0IGlmIGRhdGEgaXMgY29tcHJlc3NlZCwgYml0IDE1IGlzIG5vdAotICogICAgICAgICAgc2V0IGlmIGRhdGEgaXMgdW5jb21wcmVzc2VkCi0gKiBOIGJ5dGVzOiBkYXRhIChhcyBtdWNoIGFzIHNwZWNpZmllZCBpbiB0aGUgYnl0ZSBjb3VudCkKLSAqIDIgYnl0ZXM6IGJ5dGUgY291bnQgTl8xIG9mIG5leHQgY2x1c3RlcgotICogTl8xIGJ5dGVzOiBkYXRhIG9mIG5leHQgY2x1c2V0Ci0gKiAyIGJ5dGVzOiBieXRlIGNvdW50IE5fMiBvZiBuZXh0IGNsdXN0ZXIKLSAqIE5fMiBieXRlczogLi4uICAKLSAqCi0gKiBOb3RlIHRoYXQgdGhlIGBOJyBieXRlIGNvdW50IGFjY291bnRzIG9ubHkgZm9yIHRoZSBieXRlcyB0aGF0IGluIHRoZQotICogY3VycmVudCBzZWdtZW50IGlmIHRoZSBjbHVzdGVyIHNwYW5zIHRvIHRoZSBuZXh0IHNlZ21lbnQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQlpbnQgY21wcl9wb3M7ICAgICAgICAgICAgIC8qIGFjdHVhbCBwb3NpdGlvbiBpbiBjb21wcmVzc2lvbiBidWZmZXIgKi8KLQlpbnQgY21wcl9zejsgICAgICAgICAgICAgIC8qIHdoYXQgaXMgbGVmdCBpbiB0aGUgY29tcHJlc3Npb24gYnVmZmVyCi0JCQkJICAgKiB3aGVuIGNvcHlpbmcgdGhlIGNvbXByZXNzZWQgZGF0YSB0byB0aGUKLQkJCQkgICAqIGRlYmxvY2sgYnVmZmVyCi0JCQkJICAgKi8KLQl1bnNpZ25lZCBpbnQgZmlyc3RfYmxvY2s7IC8qIGxvY2F0aW9uIG9mIGhlYWRlciBpbmZvcm1hdGlvbiBpbgotCQkJCSAgICogdGhpcyBzZWdtZW50Ci0JCQkJICAgKi8KLQl1bnNpZ25lZCBpbnQgY291bnQ7ICAgICAgIC8qIGFtb3VudCBvZiBkYXRhIG9mIGN1cnJlbnQgYmxvY2sKLQkJCQkgICAqIGNvbnRhaW5lZCBpbiBjdXJyZW50IHNlZ21lbnQgCi0JCQkJICAgKi8KLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OyAgICAgIC8qIG9mZnNldCBpbiBjdXJyZW50IHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBpbnQgc3BhbnM6MTsgICAgIC8qIG1pZ2h0IGNvbnRpbnVlIGluIG5leHQgc2VnbWVudCAqLwotCXVuc2lnbmVkIGludCB1bmNtcHI7ICAgICAgLyogMHg4MDAwIGlmIHRoaXMgYmxvY2sgY29udGFpbnMKLQkJCQkgICAqIHVuY29tcHJlc3NlZCBkYXRhIAotCQkJCSAgICovCi0JX19zNjQgZm9mZnM7ICAgICAgICAgICAgICAvKiBmaWxlIHNldCBieXRlIG9mZnNldCwgc2FtZSBhcyBpbiAKLQkJCQkgICAqIGNvbXByZXNzaW9uIG1hcCBzZWdtZW50Ci0JCQkJICAgKi8KLX0gY21wcl9pbmZvOwotCi1zdGF0aWMgY21wcl9pbmZvIGNzZWc7IC8qIHN0YXRpYyBkYXRhLiBNdXN0IGJlIGtlcHQgdXB0b2RhdGUgYW5kIHNoYXJlZCBieSAKLQkJCSogcmVhZCwgd3JpdGUgYW5kIHNlZWsgZnVuY3Rpb25zCi0JCQkqLwotCi0jZGVmaW5lIERVTVBfQ01QUl9JTkZPKGxldmVsLCBtc2csIGluZm8pCQkJCVwKLQlUUkFDRShsZXZlbCwgbXNnICJcbiIJCQkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJjbXByX3BvcyAgIDogJWRcbiIJCQkJXAotCSAgICAgIEtFUk5fSU5GTyAiY21wcl9zeiAgICA6ICVkXG4iCQkJCVwKLQkgICAgICBLRVJOX0lORk8gImZpcnN0X2Jsb2NrOiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJjb3VudCAgICAgIDogJWRcbiIJCQkJXAotCSAgICAgIEtFUk5fSU5GTyAib2Zmc2V0ICAgICA6ICVkXG4iCQkJCVwKLQkgICAgICBLRVJOX0lORk8gInNwYW5zICAgICAgOiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJ1bmNtcHIgICAgIDogMHglMDR4XG4iCQkJCVwKLQkgICAgICBLRVJOX0lORk8gImZvZmZzICAgICAgOiAiIExMX1gsCQkJCVwKLQkgICAgICAoaW5mbyktPmNtcHJfcG9zLCAoaW5mbyktPmNtcHJfc3osIChpbmZvKS0+Zmlyc3RfYmxvY2ssCVwKLQkgICAgICAoaW5mbyktPmNvdW50LCAoaW5mbyktPm9mZnNldCwgKGluZm8pLT5zcGFucyA9PSAxLAlcCi0JICAgICAgKGluZm8pLT51bmNtcHIsIExMKChpbmZvKS0+Zm9mZnMpKQotCi0vKiAgIGRpc3BhdGNoIGNvbXByZXNzaW9uIHNlZ21lbnQgaW5mbywgcmV0dXJuIGVycm9yIGNvZGUKLSAqICAKLSAqICAgYWZ0ZXJ3YXJkcywgY3NlZy0+b2Zmc2V0IHBvaW50cyB0byBzdGFydCBvZiBkYXRhIG9mIHRoZSBORVhUCi0gKiAgIGNvbXByZXNzZWQgYmxvY2ssIGFuZCBjc2VnLT5jb3VudCBjb250YWlucyB0aGUgYW1vdW50IG9mIGRhdGEKLSAqICAgbGVmdCBpbiB0aGUgYWN0dWFsIGNvbXByZXNzZWQgYmxvY2suIGNzZWctPnNwYW5zIGlzIHNldCB0byAxIGlmCi0gKiAgIHRoZSBibG9jayBpcyBjb250aW51ZWQgaW4gdGhlIGZvbGxvd2luZyBzZWdtZW50LiBPdGhlcndpc2UgaXQgaXMKLSAqICAgc2V0IHRvIDAuIAotICovCi1zdGF0aWMgaW50IGdldF9jc2VnIChjbXByX2luZm8gKmNpbmZvLCBjb25zdCBfX3U4ICpidWZmLCAKLQkJICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2VnX3N6LAotCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLSAJY2luZm8tPmZpcnN0X2Jsb2NrID0gR0VUMihidWZmLCAwKTsKLQlpZiAoY2luZm8tPmZpcnN0X2Jsb2NrID09IDApIHsgLyogZGF0YSBzcGFucyB0byBuZXh0IHNlZ21lbnQgKi8KLQkJY2luZm8tPmNvdW50ICA9IHNlZ19zeiAtIHNpemVvZihfX3UxNik7Ci0JCWNpbmZvLT5vZmZzZXQgPSBzZWdfc3o7Ci0JCWNpbmZvLT5zcGFucyA9IDE7Ci0JfSBlbHNlIHsgLyogY2x1c3RlciBkZWZpbmV0ZWx5IGVuZHMgaW4gdGhpcyBzZWdtZW50ICovCi0JCWlmIChjaW5mby0+Zmlyc3RfYmxvY2sgPiBzZWdfc3opIHsKLQkJCS8qIGRhdGEgY29ycnVwdGVkICovCi0JCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImNvcnJ1cHRlZCBkYXRhOlxuIgotCQkJCSAgICBLRVJOX0lORk8gInNlZ21lbnQgc2l6ZTogJWRcbiIKLQkJCQkgICAgS0VSTl9JTkZPICJmaXJzdCBibG9jayA6ICVkIiwKLQkJCQkgICAgc2VnX3N6LCBjaW5mby0+Zmlyc3RfYmxvY2spOwotCQl9Ci0JICAgICAgICBjaW5mby0+Y291bnQgID0gY2luZm8tPmZpcnN0X2Jsb2NrIC0gc2l6ZW9mKF9fdTE2KTsKLQkJY2luZm8tPm9mZnNldCA9IGNpbmZvLT5maXJzdF9ibG9jazsKLQkJY2luZm8tPnNwYW5zID0gMDsKLQl9Ci0JLyogbm93IGdldCB0aGUgb2Zmc2V0IHRoZSBmaXJzdCBibG9jayBzaG91bGQgaGF2ZSBpbiB0aGUKLQkgKiB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCi0JICoKLQkgKiBGb3IgdGhpcyBtYWdpYyBgMTgnIHJlZmVyIHRvIENSRi0zIHN0YW5kYXJkIG9yIFFJQy04ME1DLAotCSAqIFJldi4gSy4gIAotCSAqLwotCWlmICgoc2VnX3N6IC0gY2luZm8tPm9mZnNldCkgPiAxOCkgewotCQlpZiAodm9sdW1lLT5xaWMxMTMpIHsgLyogPiByZXZpc2lvbiBLICovCi0JCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIk5ldyBRSUMtMTEzIGNvbXBsaWFuY2UiKTsKLQkJCWNpbmZvLT5mb2ZmcyA9IEdFVDgoYnVmZiwgY2luZm8tPm9mZnNldCk7Ci0JCQljaW5mby0+b2Zmc2V0ICs9IHNpemVvZihfX3M2NCk7IAotCQl9IGVsc2UgewotCQkJVFJBQ0UoLyogZnRfdF9kYXRhX2Zsb3cgKi8gZnRfdF9ub2lzZSwgInByZSBRSUMtMTEzIHZlcnNpb24iKTsKLQkJCWNpbmZvLT5mb2ZmcyAgID0gKF9fczY0KUdFVDQoYnVmZiwgY2luZm8tPm9mZnNldCk7Ci0JCQljaW5mby0+b2Zmc2V0ICs9IHNpemVvZihfX3UzMik7IAotCQl9Ci0JfQotCWlmIChjaW5mby0+Zm9mZnMgPiB2b2x1bWUtPnNpemUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJJbmNvbnNpc3RlbmN5OlxuIgotCQkJICAgIEtFUk5fSU5GTyAib2Zmc2V0IGluIGN1cnJlbnQgdm9sdW1lOiAlZFxuIgotCQkJICAgIEtFUk5fSU5GTyAic2l6ZSBvZiBjdXJyZW50IHZvbHVtZSAgOiAlZCIsCi0JCQkgICAgKGludCkoY2luZm8tPmZvZmZzPj4xMCksIChpbnQpKHZvbHVtZS0+c2l6ZT4+MTApKTsKLQl9Ci0JaWYgKGNpbmZvLT5jbXByX3BvcyArIGNpbmZvLT5jb3VudCA+IHZvbHVtZS0+YmxrX3N6KSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiSW5jb25zaXN0ZW5jeTpcbiIKLQkJCSAgICBLRVJOX0lORk8gImJsb2NrIHNpemUgOiAlZFxuIgotCQkJICAgIEtFUk5fSU5GTyAiZGF0YSByZWNvcmQ6ICVkIiwKLQkJCSAgICB2b2x1bWUtPmJsa19zeiwgY2luZm8tPmNtcHJfcG9zICsgY2luZm8tPmNvdW50KTsKLQl9Ci0JRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSAvKiBmdF90X2FueSAqLywgIiIsIGNpbmZvKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICBUaGlzIG9uZSBpcyBjYWxsZWQsIHdoZW4gYSBuZXcgY2x1c3RlciBzdGFydHMgaW4gc2FtZSBzZWdtZW50LgotICogIAotICogIE5vdGU6IGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNsdXN0ZXIgaW4gdGhlIGN1cnJlbnQgc2VnbWVudCwgd2UgbXVzdAotICogIG5vdCBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIHRoYW4gMTggYnl0ZXMgYXZhaWxhYmxlIGJlY2F1c2UKLSAqICB0aGlzIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUgaW4gZ2V0X2NzZWcoKSBhbmQgdGhlcmUgbWF5IGJlIGxlc3MKLSAqICB0aGFuIDE4IGJ5dGVzIGF2YWlsYWJsZSBkdWUgdG8gaGVhZGVyIGluZm9ybWF0aW9uLgotICogCi0gKi8KLXN0YXRpYyB2b2lkIGdldF9uZXh0X2NsdXN0ZXIoY21wcl9pbmZvICpjbHVzdGVyLCBjb25zdCBfX3U4ICpidWZmLCAKLQkJCSAgICAgY29uc3QgaW50IHNlZ19zeiwgY29uc3QgaW50IGZpbmlzaCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChzZWdfc3ogLSBjbHVzdGVyLT5vZmZzZXQgPiAxOCB8fCBjbHVzdGVyLT5mb2ZmcyAhPSAwKSB7Ci0JCWNsdXN0ZXItPmNvdW50ICAgPSBHRVQyKGJ1ZmYsIGNsdXN0ZXItPm9mZnNldCk7Ci0JCWNsdXN0ZXItPnVuY21wciAgPSBjbHVzdGVyLT5jb3VudCAmIDB4ODAwMDsKLQkJY2x1c3Rlci0+Y291bnQgIC09IGNsdXN0ZXItPnVuY21wcjsKLQkJY2x1c3Rlci0+b2Zmc2V0ICs9IHNpemVvZihfX3UxNik7Ci0JCWNsdXN0ZXItPmZvZmZzICAgPSAwOwotCQlpZiAoKGNsdXN0ZXItPm9mZnNldCArIGNsdXN0ZXItPmNvdW50KSA8IHNlZ19zeikgewotCQkJY2x1c3Rlci0+c3BhbnMgPSAwOwotCQl9IGVsc2UgaWYgKGNsdXN0ZXItPm9mZnNldCArIGNsdXN0ZXItPmNvdW50ID09IHNlZ19zeikgewotCQkJY2x1c3Rlci0+c3BhbnMgPSAhZmluaXNoOwotCQl9IGVsc2UgewotCQkJLyogZWl0aGVyIGFuIGVycm9yIG9yIGEgdm9sdW1lIHdyaXR0ZW4gYnkgYW4gCi0JCQkgKiBvbGQgdmVyc2lvbi4gSWYgdGhpcyBpcyBhIGRhdGEgZXJyb3IsIHRoZW4gd2UnbGwKLQkJCSAqIGNhdGNoIGl0IGxhdGVyLgotCQkJICovCi0JCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIkVpdGhlciBlcnJvciBvciBvbGQgdm9sdW1lIik7Ci0JCQljbHVzdGVyLT5zcGFucyA9IDE7Ci0JCQljbHVzdGVyLT5jb3VudCA9IHNlZ19zeiAtIGNsdXN0ZXItPm9mZnNldDsKLQkJfQotCX0gZWxzZSB7Ci0JCWNsdXN0ZXItPmNvdW50ID0gMDsKLQkJY2x1c3Rlci0+c3BhbnMgPSAwOwotCQljbHVzdGVyLT5mb2ZmcyA9IDA7Ci0JfQotCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UgLyogZnRfdF9hbnkgKi8gLCAiIiwgY2x1c3Rlcik7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIHZvaWQgemZ0Y19sb2NrKHZvaWQpCi17Ci19Ci0KLS8qICB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBmb3IgemZ0YXBlX3Jlc2V0X3Bvc2l0aW9uIGluIHpmdGFwZS1pby5jIAotICovCi1zdGF0aWMgdm9pZCB6ZnRjX3Jlc2V0KHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQltZW1zZXQoKHZvaWQgKikmY3NlZywgJ1wwJywgc2l6ZW9mKGNzZWcpKTsKLQl6ZnRjX3N0YXRzKCk7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIGludCBjbXByX21lbV9pbml0aWFsaXplZCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX2Jsa3N6ID0gMDsKLQotc3RhdGljIGludCB6ZnRfYWxsb2NhdGVfY21wcl9tZW0odW5zaWduZWQgaW50IGJsa3N6KQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKGNtcHJfbWVtX2luaXRpYWxpemVkICYmIGJsa3N6ID09IGFsbG9jX2Jsa3N6KSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2Nfb25jZSgmemZ0Y193cmtfbWVtLCBDTVBSX1dSS19NRU1fU0laRSksCi0JCSAgICB6ZnRjX2NsZWFudXAoKSk7Ci0JVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2NfYWx3YXlzKCZ6ZnRjX2J1ZiwgYmxrc3ogKyBDTVBSX09WRVJSVU4pLAotCQkgICAgemZ0Y19jbGVhbnVwKCkpOwotCWFsbG9jX2Jsa3N6ID0gYmxrc3o7Ci0JVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2NfYWx3YXlzKCZ6ZnRjX3NjcmF0Y2hfYnVmLCBibGtzeitDTVBSX09WRVJSVU4pLAotCQkgICAgemZ0Y19jbGVhbnVwKCkpOwotCWNtcHJfbWVtX2luaXRpYWxpemVkID0gMTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHpmdGNfY2xlYW51cCh2b2lkKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JemZ0X3ZmcmVlKCZ6ZnRjX3dya19tZW0sIENNUFJfV1JLX01FTV9TSVpFKTsKLQl6ZnRfdmZyZWUoJnpmdGNfYnVmLCBhbGxvY19ibGtzeiArIENNUFJfT1ZFUlJVTik7Ci0JemZ0X3ZmcmVlKCZ6ZnRjX3NjcmF0Y2hfYnVmLCBhbGxvY19ibGtzeiArIENNUFJfT1ZFUlJVTik7Ci0JY21wcl9tZW1faW5pdGlhbGl6ZWQgPSBhbGxvY19ibGtzeiA9IDA7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgImZ0YXBlX2NvbXByZXNzKCkiIGFuZCAgICAgICAgICAgICAgICAgICAgICAgKgotICogICJmdGFwZV91bmNvbXByZXNzKCkiIGFyZSB0aGUgaW50ZXJmYWNlIHRvIHRoZSBhY3R1YWwgY29tcHJlc3Npb24gICAgICAgICAqCi0gKiAgYWxnb3JpdGhtIChpLmUuIHRoZXkgYXJlIGNhbGxpbmcgdGhlICJjb21wcmVzcygpIiBmdW5jdGlvbiBmcm9tICAgICAgICAgICoKLSAqICB0aGUgbHpydzMgcGFja2FnZSBmb3Igbm93KS4gVGhlc2Ugcm91dGluZXMgY291bGQgcXVpdGUgZWFzaWx5IGJlICAgICAgICAgKgotICogIGNoYW5nZWQgdG8gYWRvcHQgYW5vdGhlciBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW5zdGVhZCBvZiBsenJ3MywgICAgICAgICAqCi0gKiAgd2hpY2ggY3VycmVudGx5IGlzIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBjYWxsZWQgYnkgemZ0X2NvbXByZXNzX3dyaXRlKCkgdG8gcGVyZm9ybSB0aGUgY29tcHJlc3Npb24uIE11c3QKLSAqIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICoKLSAqIE5PVEU6IFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgc2hvdWxkIG5vdCBleGNlZWQgdGhlIHNpemUgb2YKLSAqICAgICAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4gTW9zdCBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGhhdmUgbWVhbnMKLSAqICAgICAgIHRvIHN0b3JlIGRhdGEgdW5jaGFuZ2VkIGlmIHRoZSAiY29tcHJlc3NlZCIgZGF0YSBhbW91bnQgd291bGQKLSAqICAgICAgIGV4Y2VlZCB0aGUgb3JpZ2luYWwgb25lLiBNb3N0bHkgdGhpcyBpcyBkb25lIGJ5IHN0b3Jpbmcgc29tZQotICogICAgICAgZmxhZy1ieXRlcyBpbiBmcm9udCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIGluZGljYXRlIGlmIGl0Ci0gKiAgICAgICBpcyBjb21wcmVzc2VkIG9yIG5vdC4gVGh1cyB0aGUgd29yc3QgY29tcHJlc3Npb24gcmVzdWx0Ci0gKiAgICAgICBsZW5ndGggaXMgdGhlIG9yaWdpbmFsIGxlbmd0aCBwbHVzIHRob3NlIGZsYWctYnl0ZXMuCi0gKgotICogICAgICAgV2UgZG9uJ3Qgd2FudCB0aGF0LCBhcyB0aGUgUUlDLTgwIHN0YW5kYXJkIHByb3ZpZGVzIGEgbWVhbnMKLSAqICAgICAgIG9mIG1hcmtpbmcgdW5jb21wcmVzc2VkIGJsb2NrcyBieSBzaW1wbHkgc2V0dGluZyBiaXQgMTUgb2YKLSAqICAgICAgIHRoZSBjb21wcmVzc2VkIGJsb2NrJ3MgbGVuZ3RoLiBUaHVzIGEgY29tcGVzc2VkIGJsb2NrIGNhbgotICogICAgICAgaGF2ZSBhdCBtb3N0IGEgbGVuZ3RoIG9mIDJeMTUtMSBieXRlcy4gVGhlIFFJQy04MCBzdGFuZGFyZAotICogICAgICAgcmVzdHJpY3RzIHRoZSBibG9jay1sZW5ndGggZXZlbiBmdXJ0aGVyLCBhbGxvd2luZyBvbmx5IDI5ayAtCi0gKiAgICAgICA2IGJ5dGVzLgotICoKLSAqICAgICAgIEN1cnJlbnRseSwgdGhlIG1heGltdW0gYmxvY2tzaXplIHVzZWQgYnkgemZ0YXBlIGlzIDI4ay4KLSAqCi0gKiAgICAgICBJbiBzaG9ydDogZG9uJ3QgZXhjZWVkIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0LXBhY2thZ2UsIHNldAotICogICAgICAgYml0IDE1IG9mIHRoZSBjb21wcmVzc2VkIHNpemUgdG8gMSBpZiB5b3UgaGF2ZSBjb3BpZWQgZGF0YQotICogICAgICAgaW5zdGVhZCBvZiBjb21wcmVzc2luZyBpdC4KLSAqLwotc3RhdGljIGludCB6ZnRfY29tcHJlc3MoX191OCAqaW5fYnVmZmVyLCB1bnNpZ25lZCBpbnQgaW5fc3osIF9fdTggKm91dF9idWZmZXIpCi17IAotCV9fczMyIGNvbXByZXNzZWRfc3o7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0KLQlsenJ3M19jb21wcmVzcyhDT01QUkVTU19BQ1RJT05fQ09NUFJFU1MsIHpmdGNfd3JrX21lbSwKLQkJICAgICAgIGluX2J1ZmZlciwgaW5fc3osIG91dF9idWZmZXIsICZjb21wcmVzc2VkX3N6KTsKLQlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7Ci0JCS8qICB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGlzIGF3YXkgd2hlbgotCQkgKiAgY29tcGlsZWQgd2l0aCBOT19UUkFDRV9BVF9BTEwgb3B0aW9uCi0JCSAqLwotCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgotCQkgICAgICBLRVJOX0lORk8gImJlZm9yZSBjb21wcmVzc2lvbjogJWQgYnl0ZXNcbiIKLQkJICAgICAgS0VSTl9JTkZPICJhZnRlciBjb21wcmVzaXNvbiA6ICVkIGJ5dGVzIiwgCi0JCSAgICAgIGluX3N6LCAKLQkJICAgICAgKGludCkoY29tcHJlc3NlZF9zeiA8IDAgCi0JCSAgICAgID8gLWNvbXByZXNzZWRfc3ogOiBjb21wcmVzc2VkX3N6KSk7Ci0JCS8qICBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMKLQkJICovCi0JCXpmdGNfd3JfY29tcHJlc3NlZCAgICs9IChjb21wcmVzc2VkX3N6IDwgMCAKLQkJCQkJICAgPyAtY29tcHJlc3NlZF9zeiA6IGNvbXByZXNzZWRfc3opOwotCQl6ZnRjX3dyX3VuY29tcHJlc3NlZCArPSBpbl9zejsKLQl9Ci0JVFJBQ0VfRVhJVCAoaW50KWNvbXByZXNzZWRfc3o7Ci19Ci0KLS8qIGNhbGxlZCBieSB6ZnRfY29tcHJlc3NfcmVhZCgpIHRvIGRlY29tcHJlc3MgdGhlIGRhdGEuIE11c3QKLSAqIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZGVjb21wcmVzc2VkIGRhdGEgZm9yIHNhbml0eSBjaGVja3MKLSAqIChjb21wYXJlZCB3aXRoIHpmdF9ibGtfc3opCi0gKgotICogTk9URTogUmVhZCB0aGUgbm90ZSBmb3IgemZ0X2NvbXByZXNzKCkgYWJvdmUhICBJZiBiaXQgMTUgb2YgdGhlCi0gKiAgICAgICBwYXJhbWV0ZXIgaW5fc3ogaXMgc2V0LCB0aGVuIHRoZSBkYXRhIGluIGluX2J1ZmZlciBpc24ndAotICogICAgICAgY29tcHJlc3NlZCwgd2hpY2ggbXVzdCBiZSBoYW5kbGVkIGJ5IHRoZSB1bi1jb21wcmVzc2lvbgotICogICAgICAgYWxnb3JpdGhtLiAoSSBjaGFuZ2VkIGx6cnczIHRvIGhhbmRsZSB0aGlzLikKLSAqCi0gKiAgVGhlIHBhcmFtZXRlciBtYXhfb3V0X3N6IGlzIG5lZWRlZCB0byBwcmV2ZW50IGJ1ZmZlciBvdmVycnVucyB3aGVuIAotICogIHVuY29tcHJlc3NpbmcgY29ycnVwdCBkYXRhLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHpmdF91bmNvbXByZXNzKF9fdTggKmluX2J1ZmZlciwgCi0JCQkJICAgaW50IGluX3N6LCAKLQkJCQkgICBfX3U4ICpvdXRfYnVmZmVyLAotCQkJCSAgIHVuc2lnbmVkIGludCBtYXhfb3V0X3N6KQoteyAKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlsenJ3M19jb21wcmVzcyhDT01QUkVTU19BQ1RJT05fREVDT01QUkVTUywgemZ0Y193cmtfbWVtLAotCQkgICAgICAgaW5fYnVmZmVyLCAoX19zMzIpaW5fc3osCi0JCSAgICAgICBvdXRfYnVmZmVyLCAoX191MzIgKikmbWF4X291dF9zeik7Ci0JCi0JaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgewotCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgotCQkgICAgICBLRVJOX0lORk8gImJlZm9yZSBkZWNvbXByZXNzaW9uOiAlZCBieXRlc1xuIgotCQkgICAgICBLRVJOX0lORk8gImFmdGVyIGRlY29tcHJlc3Npb24gOiAlZCBieXRlcyIsIAotCQkgICAgICBpbl9zeiA8IDAgPyAtaW5fc3ogOiBpbl9zeiwoaW50KW1heF9vdXRfc3opOwotCQkvKiAgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzCi0JCSAqLwotCQl6ZnRjX3JkX2NvbXByZXNzZWQgICArPSBpbl9zeiA8IDAgPyAtaW5fc3ogOiBpbl9zejsKLQkJemZ0Y19yZF91bmNvbXByZXNzZWQgKz0gbWF4X291dF9zejsKLQl9Ci0JVFJBQ0VfRVhJVCAodW5zaWduZWQgaW50KW1heF9vdXRfc3o7Ci19Ci0KLS8qIHByaW50IHNvbWUgc3RhdGlzdGljcyBhYm91dCB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgY29tcHJlc3Npb24gdG8KLSAqIHRoZSBrZXJuZWwgbG9nIAotICovCi1zdGF0aWMgdm9pZCB6ZnRjX3N0YXRzKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoVFJBQ0VfTEVWRUwgPCBmdF90X2luZm8pIHsKLQkJVFJBQ0VfRVhJVDsKLQl9Ci0JaWYgKHpmdGNfd3JfdW5jb21wcmVzc2VkICE9IDApIHsKLQkJaWYgKHpmdGNfd3JfY29tcHJlc3NlZCA+ICgxPDwxNCkpIHsKLQkJCVRSQUNFKGZ0X3RfaW5mbywgImNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKHdyaXRpbmcpOlxuIgotCQkJICAgICAgS0VSTl9JTkZPICIgY29tcHIuL3VuY21wci4gICA6ICUzZCAlJSIsCi0JCQkgICAgICAoKCh6ZnRjX3dyX2NvbXByZXNzZWQ+PjEwKSAqIDEwMCkKLQkJCSAgICAgICAvICh6ZnRjX3dyX3VuY29tcHJlc3NlZD4+MTApKSk7Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X2luZm8sICJjb21wcmVzc2lvbiBzdGF0aXN0aWNzICh3cml0aW5nKTpcbiIKLQkJCSAgICAgIEtFUk5fSU5GTyAiIGNvbXByLi91bmNtcHIuICAgOiAlM2QgJSUiLAotCQkJICAgICAgKCh6ZnRjX3dyX2NvbXByZXNzZWQgKiAxMDApCi0JCQkgICAgICAgLyB6ZnRjX3dyX3VuY29tcHJlc3NlZCkpOwotCQl9Ci0JfQotCWlmICh6ZnRjX3JkX3VuY29tcHJlc3NlZCAhPSAwKSB7Ci0JCWlmICh6ZnRjX3JkX2NvbXByZXNzZWQgPiAoMTw8MTQpKSB7Ci0JCQlUUkFDRShmdF90X2luZm8sICJjb21wcmVzc2lvbiBzdGF0aXN0aWNzIChyZWFkaW5nKTpcbiIKLQkJCSAgICAgIEtFUk5fSU5GTyAiIGNvbXByLi91bmNtcHIuICAgOiAlM2QgJSUiLAotCQkJICAgICAgKCgoemZ0Y19yZF9jb21wcmVzc2VkPj4xMCkgKiAxMDApCi0JCQkgICAgICAgLyAoemZ0Y19yZF91bmNvbXByZXNzZWQ+PjEwKSkpOwotCQl9IGVsc2UgewotCQkJVFJBQ0UoZnRfdF9pbmZvLCAiY29tcHJlc3Npb24gc3RhdGlzdGljcyAocmVhZGluZyk6XG4iCi0JCQkgICAgICBLRVJOX0lORk8gIiBjb21wci4vdW5jbXByLiAgIDogJTNkICUlIiwKLQkJCSAgICAgICgoemZ0Y19yZF9jb21wcmVzc2VkICogMTAwKQotCQkJICAgICAgIC8gemZ0Y19yZF91bmNvbXByZXNzZWQpKTsKLQkJfQotCX0KLQkvKiBvbmx5IHByaW50IGl0IG9uY2U6ICovCi0JemZ0Y193cl91bmNvbXByZXNzZWQgPSAKLQkJemZ0Y193cl9jb21wcmVzc2VkICA9Ci0JCXpmdGNfcmRfdW5jb21wcmVzc2VkID0KLQkJemZ0Y19yZF9jb21wcmVzc2VkICAgPSAwOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qIHN0YXJ0IG5ldyBjb21wcmVzc2VkIGJsb2NrIAotICovCi1zdGF0aWMgaW50IHN0YXJ0X25ld19jc2VnKGNtcHJfaW5mbyAqY2x1c3RlciwgCi0JCQkgIGNoYXIgKmRzdF9idWYsIAotCQkJICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywKLQkJCSAgY29uc3QgdW5zaWduZWQgaW50IGJsa19zeiwKLQkJCSAgY29uc3QgY2hhciAqc3JjX2J1ZiwKLQkJCSAgY29uc3QgaW50IHRoaXNfc2Vnc19zeiwKLQkJCSAgY29uc3QgaW50IHFpYzExMykKLXsKLQlpbnQgc2l6ZV9sZWZ0OwotCWludCBjcF9jbnQ7Ci0JaW50IGJ1Zl9wb3M7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlzaXplX2xlZnQgPSB0aGlzX3NlZ3Nfc3ogLSBzaXplb2YoX191MTYpIC0gY2x1c3Rlci0+Y21wcl9zejsKLQlUUkFDRShmdF90X2RhdGFfZmxvdywiXG4iIAotCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCBzaXplICAgOiAlZFxuIgotCSAgICAgIEtFUk5fSU5GTyAiY29tcHJlc3NlZF9zejogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInNpemVfbGVmdCAgICAgIDogJWQiLAotCSAgICAgIHRoaXNfc2Vnc19zeiwgY2x1c3Rlci0+Y21wcl9zeiwgc2l6ZV9sZWZ0KTsKLQlpZiAoc2l6ZV9sZWZ0ID4gMTgpIHsgLyogc3RhcnQgYSBuZXcgY2x1c2V0ZXIgKi8KLQkJY3BfY250ID0gY2x1c3Rlci0+Y21wcl9zejsKLQkJY2x1c3Rlci0+Y21wcl9zeiA9IDA7Ci0JCWJ1Zl9wb3MgPSBjcF9jbnQgKyBzaXplb2YoX191MTYpOwotCQlQVVQyKGRzdF9idWYsIDAsIGJ1Zl9wb3MpOwotCi0JCWlmIChxaWMxMTMpIHsKLQkJCV9fczY0IGZvZmZzID0gcG9zLT52b2x1bWVfcG9zOwotCQkJaWYgKGNwX2NudCkgZm9mZnMgKz0gKF9fczY0KWJsa19zejsKLQotCQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJuZXcgc3R5bGUgUUlDLTExMyBoZWFkZXIiKTsKLQkJCVBVVDgoZHN0X2J1ZiwgYnVmX3BvcywgZm9mZnMpOwotCQkJYnVmX3BvcyArPSBzaXplb2YoX19zNjQpOwotCQl9IGVsc2UgewotCQkJX191MzIgZm9mZnMgPSAoX191MzIpcG9zLT52b2x1bWVfcG9zOwotCQkJaWYgKGNwX2NudCkgZm9mZnMgKz0gKF9fdTMyKWJsa19zejsKLQkJCQotCQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJvbGQgc3R5bGUgUUlDLTgwTUMgaGVhZGVyIik7Ci0JCQlQVVQ0KGRzdF9idWYsIGJ1Zl9wb3MsIGZvZmZzKTsKLQkJCWJ1Zl9wb3MgKz0gc2l6ZW9mKF9fdTMyKTsKLQkJfQotCX0gZWxzZSBpZiAoc2l6ZV9sZWZ0ID49IDApIHsKLQkJY3BfY250ID0gY2x1c3Rlci0+Y21wcl9zejsKLQkJY2x1c3Rlci0+Y21wcl9zeiA9IDA7Ci0JCWJ1Zl9wb3MgPSBjcF9jbnQgKyBzaXplb2YoX191MTYpOwotCQlQVVQyKGRzdF9idWYsIDAsIGJ1Zl9wb3MpOyAgCi0JCS8qIHplcm8gdW51c2VkIHBhcnQgb2Ygc2VnbWVudC4gKi8KLQkJbWVtc2V0KGRzdF9idWYgKyBidWZfcG9zLCAnXDAnLCBzaXplX2xlZnQpOwotCQlidWZfcG9zID0gdGhpc19zZWdzX3N6OwotCX0gZWxzZSB7IC8qIG5lZWQgZW50aXJlIHNlZ21lbnQgYW5kIG1vcmUgc3BhY2UgKi8KLQkJUFVUMihkc3RfYnVmLCAwLCAwKTsgCi0JCWNwX2NudCA9IHRoaXNfc2Vnc19zeiAtIHNpemVvZihfX3UxNik7Ci0JCWNsdXN0ZXItPmNtcHJfc3ogIC09IGNwX2NudDsKLQkJYnVmX3BvcyA9IHRoaXNfc2Vnc19zejsKLQl9Ci0JbWVtY3B5KGRzdF9idWYgKyBzaXplb2YoX191MTYpLCBzcmNfYnVmICsgY2x1c3Rlci0+Y21wcl9wb3MsIGNwX2NudCk7Ci0JY2x1c3Rlci0+Y21wcl9wb3MgKz0gY3BfY250OwotCVRSQUNFX0VYSVQgYnVmX3BvczsKLX0KLQotLyogcmV0dXJuLXZhbHVlOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbW92ZWQgZnJvbSB0aGUgdXNlci1idWZmZXIKLSAqICAgICAgICAgICAgICAgYHNyY19idWYnIG9yIGVycm9yIGNvZGUKLSAqCi0gKiAgaW50ICp3cml0ZV9jbnQgICAgICAgICAgIDogaG93IG11Y2ggYWN0dWFsbHkgaGFzIGJlZW4gbW92ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1Zi4gTmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQgd2hlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJldHVybnMgd2l0aCBhbiBlcnJvciBjb2RlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5lZ2F0aXYgcmV0dXJuIHZhbHVlKSAKLSAqICBfX3U4ICpkc3RfYnVmICAgICAgICAgICAgOiBrZXJuZWwgc3BhY2UgYnVmZmVyIHdoZXJlIHRoZSBoYXMgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQgdG8uIFRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlcnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2VzIHRvIGEgc3BlY2lmaWMgc2VnbWVudC4KLSAqICBjb25zdCBpbnQgc2VnX3N6ICAgICAgICAgOiB0aGUgc2l6ZSBvZiB0aGUgc2VnbWVudCBkc3RfYnVmIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQgdG8uCi0gKiAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MgIDogc3RydWN0IGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgdm9sdW1lIChieXRlIHBvc2l0aW9uLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgaWQgb2YgY3VycmVudCBzZWdtZW50IGV0YykKLSAqICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB2b2x1bWUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBldGMuCi0gKiAgY29uc3QgX191OCAqc3JjX2J1ZiAgICAgIDogdXNlciBzcGFjZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRoZSB1c2VyIHdhbnRzIHRvIGJlIHdyaXR0ZW4gdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBlLgotICogIGNvbnN0IGludCByZXFfbGVuICAgICAgICA6IHRoZSBhbW91bnQgb2YgZGF0YSB0aGUgdXNlciB3YW50cyB0byBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8gdGFwZS4KLSAqLwotc3RhdGljIGludCB6ZnRjX3dyaXRlKGludCAqd3JpdGVfY250LAotCQkgICAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAotCQkgICAgICBjb25zdCBfX3U4IF9fdXNlciAqc3JjX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCi0JCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQotewotCWludCByZXFfbGVuX2xlZnQgPSByZXFfbGVuOwotCWludCByZXN1bHQ7Ci0JaW50IGxlbl9sZWZ0OwotCWludCBidWZfcG9zX3dyaXRlID0gcG9zLT5zZWdfYnl0ZV9wb3M7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JLyogTm90ZTogd2UgZG8gbm90IHVubG9jayB0aGUgbW9kdWxlIGJlY2F1c2UKLQkgKiB0aGVyZSBhcmUgc29tZSB2YWx1ZXMgY2FjaGVkIGluIHRoYXQgYGNzZWcnIHZhcmlhYmxlLiAgV2UKLQkgKiBkb24ndCBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gYmVpbmcKLQkgKiB1bmxvYWRlZCBieSBrZXJuZWxkIGV2ZW4gd2hlbiB0aGUgdGFwZSBpcyBmdWxsIG9yIHdoZW4gd2UKLQkgKiBjYW5ub3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeS4KLQkgKi8KLQlpZiAocG9zLT50YXBlX3BvcyA+ICh2b2x1bWUtPnNpemUtdm9sdW1lLT5ibGtfc3otWkZUX0NNUFJfT1ZFUkhFQUQpKSB7Ci0JCVRSQUNFX0VYSVQgLUVOT1NQQzsKLQl9ICAgIAotCWlmICh6ZnRfYWxsb2NhdGVfY21wcl9tZW0odm9sdW1lLT5ibGtfc3opIDwgMCkgewotCQkvKiBzaG91bGQgd2UgdW5sb2NrIHRoZSBtb2R1bGU/IEJ1dCBpdCBzaG91bGRuJ3QgCi0JCSAqIGJlIGxvY2tlZCBhbnl3YXkgLi4uCi0JCSAqLwotCQlUUkFDRV9FWElUIC1FTk9NRU07Ci0JfQotCWlmIChidWZfcG9zX3dyaXRlID09IDApIHsgLyogZmlsbCBhIG5ldyBzZWdtZW50ICovCi0JCSp3cml0ZV9jbnQgPSBidWZfcG9zX3dyaXRlID0gc3RhcnRfbmV3X2NzZWcoJmNzZWcsCi0JCQkJCQkJICAgIGRzdF9idWYsCi0JCQkJCQkJICAgIHBvcywKLQkJCQkJCQkgICAgdm9sdW1lLT5ibGtfc3osCi0JCQkJCQkJICAgIHpmdGNfYnVmLCAKLQkJCQkJCQkgICAgc2VnX3N6LAotCQkJCQkJCSAgICB2b2x1bWUtPnFpYzExMyk7Ci0JCWlmIChjc2VnLmNtcHJfc3ogPT0gMCAmJiBjc2VnLmNtcHJfcG9zICE9IDApIHsKLQkJCXJlcV9sZW5fbGVmdCAtPSByZXN1bHQgPSB2b2x1bWUtPmJsa19zejsKLQkJCWNzZWcuY21wcl9wb3MgID0gMDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQkqd3JpdGVfY250ID0gcmVzdWx0ID0gMDsKLQl9Ci0JCi0JbGVuX2xlZnQgPSBzZWdfc3ogLSBidWZfcG9zX3dyaXRlOwotCXdoaWxlICgocmVxX2xlbl9sZWZ0ID4gMCkgJiYgKGxlbl9sZWZ0ID4gMTgpKSB7Ci0JCS8qIG5vdyB3ZSBoYXZlIHNvbWUgc2l6ZSBsZWZ0IGZvciBhIG5ldyBjb21wcmVzc2VkCi0JCSAqIGJsb2NrLiAgV2Uga25vdywgdGhhdCB0aGUgY29tcHJlc3Npb24gYnVmZmVyIGlzCi0JCSAqIGVtcHR5IChlbHNlIHRoZXJlIHdvdWxkbid0IGJlIGFueSBzcGFjZSBsZWZ0KS4gIAotCQkgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHpmdGNfc2NyYXRjaF9idWYsIHNyY19idWYgKyByZXN1bHQsIAotCQkJCSAgIHZvbHVtZS0+YmxrX3N6KSAhPSAwKSB7Ci0JCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JCX0KLQkJcmVxX2xlbl9sZWZ0IC09IHZvbHVtZS0+YmxrX3N6OwotCQljc2VnLmNtcHJfc3ogPSB6ZnRfY29tcHJlc3MoemZ0Y19zY3JhdGNoX2J1Ziwgdm9sdW1lLT5ibGtfc3osIAotCQkJCQkgICAgemZ0Y19idWYpOwotCQlpZiAoY3NlZy5jbXByX3N6IDwgMCkgewotCQkJY3NlZy51bmNtcHIgPSAweDgwMDA7Ci0JCQljc2VnLmNtcHJfc3ogPSAtY3NlZy5jbXByX3N6OwotCQl9IGVsc2UgewotCQkJY3NlZy51bmNtcHIgPSAwOwotCQl9Ci0JCS8qIGluY3JlbWVudCAicmVzdWx0IiBpZmYgd2UgY29waWVkIHRoZSBlbnRpcmUKLQkJICogY29tcHJlc3NlZCBibG9jayB0byB0aGUgemZ0X2RlYmxvY2tfYnVmIAotCQkgKi8KLQkJbGVuX2xlZnQgLT0gc2l6ZW9mKF9fdTE2KTsKLQkJaWYgKGxlbl9sZWZ0ID49IGNzZWcuY21wcl9zeikgewotCQkJbGVuX2xlZnQgLT0gY3NlZy5jb3VudCA9IGNzZWcuY21wcl9zejsKLQkJCWNzZWcuY21wcl9wb3MgPSBjc2VnLmNtcHJfc3ogPSAwOwotCQkJcmVzdWx0ICs9IHZvbHVtZS0+YmxrX3N6OwotCQl9IGVsc2UgewotCQkJY3NlZy5jbXByX3N6ICAgICAgIC09IAotCQkJCWNzZWcuY21wcl9wb3MgPQotCQkJCWNzZWcuY291bnQgICAgPSBsZW5fbGVmdDsKLQkJCWxlbl9sZWZ0ID0gMDsKLQkJfQotCQlQVVQyKGRzdF9idWYsIGJ1Zl9wb3Nfd3JpdGUsIGNzZWcudW5jbXByIHwgY3NlZy5jb3VudCk7Ci0JCWJ1Zl9wb3Nfd3JpdGUgKz0gc2l6ZW9mKF9fdTE2KTsKLQkJbWVtY3B5KGRzdF9idWYgKyBidWZfcG9zX3dyaXRlLCB6ZnRjX2J1ZiwgY3NlZy5jb3VudCk7Ci0JCWJ1Zl9wb3Nfd3JpdGUgKz0gY3NlZy5jb3VudDsKLQkJKndyaXRlX2NudCAgICArPSBjc2VnLmNvdW50ICsgc2l6ZW9mKF9fdTE2KTsKLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCX0KLQkvKiBlcmFzZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50IGlmIGxlc3MgdGhhbiAxOCBieXRlcwotCSAqIGxlZnQgKDE4IGJ5dGVzIGlzIGR1ZSB0byB0aGUgUUlDLTgwIHN0YW5kYXJkKSAKLQkgKi8KLQlpZiAobGVuX2xlZnQgPD0gMTgpIHsKLQkJbWVtc2V0KGRzdF9idWYgKyBidWZfcG9zX3dyaXRlLCAnXDAnLCBsZW5fbGVmdCk7Ci0JCSgqd3JpdGVfY250KSArPSBsZW5fbGVmdDsKLQl9Ci0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZXR1cm5pbmcgJWQiLCByZXN1bHQpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfSAgIAotCi0vKiBvdXQ6Ci0gKgotICogaW50ICpyZWFkX2NudDogdGhlIG51bWJlciBvZiBieXRlcyB3ZSByZW1vdmVkIGZyb20gdGhlIHpmdF9kZWJsb2NrX2J1ZgotICogICAgICAgICAgICAgICAgKHJlc3VsdCkKLSAqIGludCAqdG9fZG8gICA6IHRoZSByZW1haW5pbmcgc2l6ZSBvZiB0aGUgcmVhZC1yZXF1ZXN0LgotICoKLSAqIGluOgotICoKLSAqIGNoYXIgKmJ1ZmYgICAgICAgICAgOiBidWZmIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSB1c2VyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCB0aGF0IGhhc24ndCBiZWVuIGZpbGxlZCB3aXRoIGRhdGEgeWV0LgotCi0gKiBpbnQgYnVmX3Bvc19yZWFkICAgIDogY29weSBvZiBmcm9tIF9mdGFwZV9yZWFkKCkKLSAqIGludCBidWZfbGVuX3JlYWQgICAgOiBjb3B5IG9mIGJ1Zl9sZW5fcmQgZnJvbSBfZnRhcGVfcmVhZCgpCi0gKiBjaGFyICp6ZnRfZGVibG9ja19idWY6IHpmdF9kZWJsb2NrX2J1ZgotICogdW5zaWduZWQgc2hvcnQgYmxrX3N6OiB0aGUgYmxvY2sgc2l6ZSB2YWxpZCBmb3IgdGhpcyB2b2x1bWUsIG1heSBkaWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gemZ0X2Jsa19zei4KLSAqIGludCBmaW5pc2g6IGlmICE9IDAgbWVhbnMgdGhhdCB0aGlzIGlzIHRoZSBsYXN0IHNlZ21lbnQgYmVsb25naW5nCi0gKiAgdG8gdGhpcyB2b2x1bWUKLSAqIHJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGNvcGllZCB0byB0aGUgdXNlci1idWZmZXIKLSAqCi0gKiB0b19kbyBNVVNUIE5PVCBTSFJJTksgZXhjZXB0IHRvIGluZGljYXRlIGFuIEVPRi4gSW4gdGhpcyBjYXNlICp0b19kbyBoYXMgdG8KLSAqIGJlIHNldCB0byAwIAotICovCi1zdGF0aWMgaW50IHpmdGNfcmVhZCAoaW50ICpyZWFkX2NudCwgCi0JCSAgICAgIF9fdTggIF9fdXNlciAqZHN0X2J1ZiwgY29uc3QgaW50IHRvX2RvLCAKLQkJICAgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwgCi0JCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoteyAgICAgICAgICAKLQlpbnQgdW5jb21wcmVzc2VkX3N6OyAgICAgICAgIAotCWludCByZXN1bHQgPSAwOwotCWludCByZW1haW5pbmcgPSB0b19kbzsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFX0NBVENIKHpmdF9hbGxvY2F0ZV9jbXByX21lbSh2b2x1bWUtPmJsa19zeiksKTsKLQlpZiAocG9zLT5zZWdfYnl0ZV9wb3MgPT0gMCkgewotCQkvKiBuZXcgc2VnbWVudCBqdXN0IHJlYWQKLQkJICovCi0JCVRSQUNFX0NBVENIKGdldF9jc2VnKCZjc2VnLCBzcmNfYnVmLCBzZWdfc3osIHZvbHVtZSksCi0JCQkgICAgKnJlYWRfY250ID0gMCk7Ci0JCW1lbWNweSh6ZnRjX2J1ZiArIGNzZWcuY21wcl9wb3MsIHNyY19idWYgKyBzaXplb2YoX191MTYpLCAKLQkJICAgICAgIGNzZWcuY291bnQpOwotCQljc2VnLmNtcHJfcG9zICs9IGNzZWcuY291bnQ7Ci0JCSpyZWFkX2NudCAgICAgID0gY3NlZy5vZmZzZXQ7Ci0JCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UgLyogZnRfdF9hbnkgKi8sICIiLCAmY3NlZyk7Ci0JfSBlbHNlIHsKLQkJKnJlYWRfY250ID0gMDsKLQl9Ci0JLyogbG9vcCBhbmQgdW5jb21wcmVzcyB1bnRpbCB1c2VyIGJ1ZmZlciBmdWxsIG9yCi0JICogZGVibG9jay1idWZmZXIgZW1wdHkgCi0JICovCi0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJjb21wcmVzc2VkX3N6OiAlZCwgY29tcG9zIDogJWQsICpyZWFkX2NudDogJWQiLAotCSAgICAgIGNzZWcuY21wcl9zeiwgY3NlZy5jbXByX3BvcywgKnJlYWRfY250KTsKLQl3aGlsZSAoKGNzZWcuc3BhbnMgPT0gMCkgJiYgKHJlbWFpbmluZyA+IDApKSB7Ci0JCWlmIChjc2VnLmNtcHJfcG9zICAhPSAwKSB7IC8qIGNtcHIgYnVmIGlzIG5vdCBlbXB0eSAqLwotCQkJdW5jb21wcmVzc2VkX3N6ID0gCi0JCQkJemZ0X3VuY29tcHJlc3MoemZ0Y19idWYsCi0JCQkJCSAgICAgICBjc2VnLnVuY21wciA9PSAweDgwMDAgPwotCQkJCQkgICAgICAgLWNzZWcuY21wcl9wb3MgOiBjc2VnLmNtcHJfcG9zLAotCQkJCQkgICAgICAgemZ0Y19zY3JhdGNoX2J1ZiwKLQkJCQkJICAgICAgIHZvbHVtZS0+YmxrX3N6KTsKLQkJCWlmICh1bmNvbXByZXNzZWRfc3ogIT0gdm9sdW1lLT5ibGtfc3opIHsKLQkJCQkqcmVhZF9jbnQgPSAwOwotCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3Rfd2FybiwKLQkJCQkgICAgICAiVW5jb21wcmVzc2VkIGJsayAoJWQpICE9IGJsayBzaXplICglZCkiLAotCQkJCSAgICAgIHVuY29tcHJlc3NlZF9zeiwgdm9sdW1lLT5ibGtfc3opOwotCQkJfSAgICAgICAKLQkJCWlmIChjb3B5X3RvX3VzZXIoZHN0X2J1ZiArIHJlc3VsdCwgCi0JCQkJCSB6ZnRjX3NjcmF0Y2hfYnVmLCAKLQkJCQkJIHVuY29tcHJlc3NlZF9zeikgIT0gMCApIHsKLQkJCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlyZW1haW5pbmcgICAgICAtPSB1bmNvbXByZXNzZWRfc3o7Ci0JCQlyZXN1bHQgICAgICs9IHVuY29tcHJlc3NlZF9zejsKLQkJCWNzZWcuY21wcl9wb3MgID0gMDsKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJaWYgKHJlbWFpbmluZyA+IDApIHsKLQkJCWdldF9uZXh0X2NsdXN0ZXIoJmNzZWcsIHNyY19idWYsIHNlZ19zeiwgCi0JCQkJCSB2b2x1bWUtPmVuZF9zZWcgPT0gcG9zLT5zZWdfcG9zKTsKLQkJCWlmIChjc2VnLmNvdW50ICE9IDApIHsKLQkJCQltZW1jcHkoemZ0Y19idWYsIHNyY19idWYgKyBjc2VnLm9mZnNldCwKLQkJCQkgICAgICAgY3NlZy5jb3VudCk7Ci0JCQkJY3NlZy5jbXByX3BvcyA9IGNzZWcuY291bnQ7Ci0JCQkJY3NlZy5vZmZzZXQgICs9IGNzZWcuY291bnQ7Ci0JCQkJKnJlYWRfY250ICs9IGNzZWcuY291bnQgKyBzaXplb2YoX191MTYpOwotCQkJfSBlbHNlIHsKLQkJCQlyZW1haW5pbmcgPSAwOwotCQkJfQotCQl9Ci0JCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iIAotCQkgICAgICBLRVJOX0lORk8gImNvbXByZXNzZWRfc3o6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiY29tcG9zICAgICAgIDogJWRcbiIKLQkJICAgICAgS0VSTl9JTkZPICIqcmVhZF9jbnQgICAgOiAlZCIsCi0JCSAgICAgIGNzZWcuY21wcl9zeiwgY3NlZy5jbXByX3BvcywgKnJlYWRfY250KTsKLQl9Ci0JaWYgKHNlZ19zeiAtIGNzZWcub2Zmc2V0IDw9IDE4KSB7Ci0JCSpyZWFkX2NudCArPSBzZWdfc3ogLSBjc2VnLm9mZnNldDsKLQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJleHBhbmRpbmcgcmVhZCBjbnQgdG86ICVkIiwgKnJlYWRfY250KTsKLQl9Ci0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIKLQkgICAgICBLRVJOX0lORk8gInNlZ21lbnQgc2l6ZSAgIDogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInJlYWQgY291bnQgICAgIDogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gImJ1Zl9wb3NfcmVhZCAgIDogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZyAgICAgIDogJWQiLAotCQlzZWdfc3osICpyZWFkX2NudCwgcG9zLT5zZWdfYnl0ZV9wb3MsIAotCQlzZWdfc3ogLSAqcmVhZF9jbnQgLSBwb3MtPnNlZ19ieXRlX3Bvcyk7Ci0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZXR1cm5pbmc6ICVkIiwgcmVzdWx0KTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0gICAgICAgICAgICAgICAgCi0KLS8qIHNlZWtzIHRvIHRoZSBuZXcgZGF0YS1wb3NpdGlvbi4gUmVhZHMgc29tZXRpbWVzIGEgc2VnbWVudC4KLSAqICAKLSAqIHN0YXJ0X3NlZyBhbmQgZW5kX3NlZyBnaXZlIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBjdXJyZW50IHZvbHVtZQotICogYmxrX3N6IGlzIHRoZSBibGtfc3ogb2YgdGhlIGN1cnJlbnQgdm9sdW1lIGFzIHN0b3JlZCBpbiB0aGUKLSAqIHZvbHVtZSBsYWJlbAotICoKLSAqIFdlIGRvbid0IGFsbG93IGJsb2Nrc2l6ZXMgbGVzcyB0aGFuIDEwMjQgYnl0ZXMsIHRoZXJlZm9yZSB3ZSBkb24ndCBuZWVkCi0gKiBhIDY0IGJpdCBhcmd1bWVudCBmb3IgbmV3X2Jsb2NrX3Bvcy4KLSAqLwotCi1zdGF0aWMgaW50IHNlZWtfaW5fc2VnbWVudChjb25zdCB1bnNpZ25lZCBpbnQgdG9fZG8sIGNtcHJfaW5mbyAgKmNfaW5mbywKLQkJCSAgIGNvbnN0IGNoYXIgKnNyY19idWYsIGNvbnN0IGludCBzZWdfc3osIAotCQkJICAgY29uc3QgaW50IHNlZ19wb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOwotc3RhdGljIGludCBzbG93X3NlZWtfZm9yd2FyZF91bnRpbF9lcnJvcihjb25zdCB1bnNpZ25lZCBpbnQgZGlzdGFuY2UsCi0JCQkJCSBjbXByX2luZm8gKmNfaW5mbywgemZ0X3Bvc2l0aW9uICpwb3MsIAotCQkJCQkgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwgX191OCAqYnVmKTsKLXN0YXRpYyBpbnQgc2VhcmNoX3ZhbGlkX3NlZ21lbnQodW5zaWduZWQgaW50IHNlZ21lbnQsCi0JCQkJY29uc3QgdW5zaWduZWQgaW50IGVuZF9zZWcsCi0JCQkJY29uc3QgdW5zaWduZWQgaW50IG1heF9mb2ZmcywKLQkJCQl6ZnRfcG9zaXRpb24gKnBvcywgY21wcl9pbmZvICpjX2luZm8sCi0JCQkJY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwgX191OCAqYnVmKTsKLXN0YXRpYyBpbnQgc2xvd19zZWVrX2ZvcndhcmQodW5zaWduZWQgaW50IGRlc3QsIGNtcHJfaW5mbyAqY19pbmZvLAotCQkJICAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKLQkJCSAgICAgX191OCAqYnVmKTsKLXN0YXRpYyBpbnQgY29tcHV0ZV9zZWdfcG9zKHVuc2lnbmVkIGludCBkZXN0LCB6ZnRfcG9zaXRpb24gKnBvcywKLQkJCSAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOwotCi0jZGVmaW5lIFpGVF9TTE9XX1NFRUtfVEhSRVNIT0xEICAxMCAvKiBzZWdtZW50cyAqLwotI2RlZmluZSBaRlRfRkFTVF9TRUVLX01BWF9UUklBTFMgMTAgLyogdGltZXMgKi8KLSNkZWZpbmUgWkZUX0ZBU1RfU0VFS19CQUNLVVAgICAgIDEwIC8qIHNlZ21lbnRzICovCi0KLXN0YXRpYyBpbnQgemZ0Y19zZWVrKHVuc2lnbmVkIGludCBuZXdfYmxvY2tfcG9zLAotCQkgICAgIHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLCBfX3U4ICpidWYpCi17Ci0JdW5zaWduZWQgaW50IGRlc3Q7Ci0JaW50IGxpbWl0OwotCWludCBkaXN0YW5jZTsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgc2VnX2Rpc3Q7Ci0JaW50IG5ld19zZWc7Ci0JaW50IG9sZF9zZWcgPSAwOwotCWludCBmYXN0X3NlZWtfdHJpYWxzID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChuZXdfYmxvY2tfcG9zID09IDApIHsKLQkJcG9zLT5zZWdfcG9zICAgICAgPSB2b2x1bWUtPnN0YXJ0X3NlZzsKLQkJcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOwotCQlwb3MtPnZvbHVtZV9wb3MgICA9IDA7Ci0JCXpmdGNfcmVzZXQoKTsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlkZXN0ID0gbmV3X2Jsb2NrX3BvcyAqICh2b2x1bWUtPmJsa19zeiA+PiAxMCk7Ci0JZGlzdGFuY2UgPSBkZXN0IC0gKHBvcy0+dm9sdW1lX3BvcyA+PiAxMCk7Ci0Jd2hpbGUgKGRpc3RhbmNlICE9IDApIHsKLQkJc2VnX2Rpc3QgPSBjb21wdXRlX3NlZ19wb3MoZGVzdCwgcG9zLCB2b2x1bWUpOwotCQlUUkFDRShmdF90X25vaXNlLCAiXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAic2VnX2Rpc3Q6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiZGlzdGFuY2U6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiZGVzdCAgICA6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAidnBvcyAgICA6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAic2VnX3BvcyA6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAidHJpYWxzICA6ICVkIiwKLQkJICAgICAgc2VnX2Rpc3QsIGRpc3RhbmNlLCBkZXN0LAotCQkgICAgICAodW5zaWduZWQgaW50KShwb3MtPnZvbHVtZV9wb3M+PjEwKSwgcG9zLT5zZWdfcG9zLAotCQkgICAgICBmYXN0X3NlZWtfdHJpYWxzKTsKLQkJaWYgKGRpc3RhbmNlID4gMCkgewotCQkJaWYgKHNlZ19kaXN0IDwgMCkgewotCQkJCVRSQUNFKGZ0X3RfYnVnLCAiQlVHOiBkaXN0YW5jZSAlZCA+IDAsICIKLQkJCQkgICAgICAic2VnbWVudCBkaWZmZXJlbmNlICVkIDwgMCIsCi0JCQkJICAgICAgZGlzdGFuY2UsIHNlZ19kaXN0KTsKLQkJCQlyZXN1bHQgPSAtRUlPOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbmV3X3NlZyA9IHBvcy0+c2VnX3BvcyArIHNlZ19kaXN0OwotCQkJaWYgKG5ld19zZWcgPiB2b2x1bWUtPmVuZF9zZWcpIHsKLQkJCQluZXdfc2VnID0gdm9sdW1lLT5lbmRfc2VnOwotCQkJfQotCQkJaWYgKG9sZF9zZWcgPT0gbmV3X3NlZyB8fCAvKiBsb29wICovCi0JCQkgICAgc2VnX2Rpc3QgPD0gWkZUX1NMT1dfU0VFS19USFJFU0hPTEQgfHwKLQkJCSAgICBmYXN0X3NlZWtfdHJpYWxzID49IFpGVF9GQVNUX1NFRUtfTUFYX1RSSUFMUykgewotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzdGFydGluZyBzbG93IHNlZWs6XG4iCi0JCQkJICAgS0VSTl9JTkZPICJmYXN0IHNlZWsgZmFpbGVkIHRvbyBvZnRlbjogJXNcbiIKLQkJCQkgICBLRVJOX0lORk8gIm5lYXIgdGFyZ2V0IHBvc2l0aW9uICAgICAgOiAlc1xuIgotCQkJCSAgIEtFUk5fSU5GTyAibG9vcGluZyBiZXR3ZWVuIHR3byBzZWdzICA6ICVzIiwKLQkJCQkgICAgICAoZmFzdF9zZWVrX3RyaWFscyA+PSAKLQkJCQkgICAgICAgWkZUX0ZBU1RfU0VFS19NQVhfVFJJQUxTKQotCQkJCSAgICAgID8gInllcyIgOiAibm8iLAotCQkJCSAgICAgIChzZWdfZGlzdCA8PSBaRlRfU0xPV19TRUVLX1RIUkVTSE9MRCkgCi0JCQkJICAgICAgPyAieWVzIiA6ICJubyIsCi0JCQkJICAgICAgKG9sZF9zZWcgPT0gbmV3X3NlZykKLQkJCQkgICAgICA/ICJ5ZXMiIDogIm5vIik7Ci0JCQkJcmVzdWx0ID0gc2xvd19zZWVrX2ZvcndhcmQoZGVzdCwgJmNzZWcsIAotCQkJCQkJCSAgIHBvcywgdm9sdW1lLCBidWYpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJb2xkX3NlZyA9IG5ld19zZWc7Ci0JCQlsaW1pdCA9IHZvbHVtZS0+ZW5kX3NlZzsKLQkJCWZhc3Rfc2Vla190cmlhbHMgKys7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJcmVzdWx0ID0gc2VhcmNoX3ZhbGlkX3NlZ21lbnQobmV3X3NlZywgbGltaXQsCi0JCQkJCQkJICAgICAgdm9sdW1lLT5zaXplLAotCQkJCQkJCSAgICAgIHBvcywgJmNzZWcsCi0JCQkJCQkJICAgICAgdm9sdW1lLCBidWYpOwotCQkJCWlmIChyZXN1bHQgPT0gMCB8fCByZXN1bHQgPT0gLUVJTlRSKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobmV3X3NlZyA9PSB2b2x1bWUtPnN0YXJ0X3NlZykgewotCQkJCQlyZXN1bHQgPSAtRUlPOyAvKiBzZXQgZXJycm9yIAotCQkJCQkJCSogY29uZGl0aW9uCi0JCQkJCQkJKi8KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWxpbWl0ICAgID0gbmV3X3NlZzsKLQkJCQluZXdfc2VnIC09IFpGVF9GQVNUX1NFRUtfQkFDS1VQOwotCQkJCWlmIChuZXdfc2VnIDwgdm9sdW1lLT5zdGFydF9zZWcpIHsKLQkJCQkJbmV3X3NlZyA9IHZvbHVtZS0+c3RhcnRfc2VnOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLAotCQkJCSAgICAgICJDb3VsZG4ndCBmaW5kIGEgcmVhZGFibGUgc2VnbWVudCIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgLyogaWYgKGRpc3RhbmNlIDwgMCkgKi8gewotCQkJaWYgKHNlZ19kaXN0ID4gMCkgewotCQkJCVRSQUNFKGZ0X3RfYnVnLCAiQlVHOiBkaXN0YW5jZSAlZCA8IDAsICIKLQkJCQkgICAgICAic2VnbWVudCBkaWZmZXJlbmNlICVkID4wIiwKLQkJCQkgICAgICBkaXN0YW5jZSwgc2VnX2Rpc3QpOwotCQkJCXJlc3VsdCA9IC1FSU87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQluZXdfc2VnID0gcG9zLT5zZWdfcG9zICsgc2VnX2Rpc3Q7Ci0JCQlpZiAoZmFzdF9zZWVrX3RyaWFscyA+IDAgJiYgc2VnX2Rpc3QgPT0gMCkgewotCQkJCS8qIHRoaXMgYXZvaWRzIHN0aWNraW5nIHRvIHRoZSBzYW1lCi0JCQkJICogc2VnbWVudCBhbGwgdGhlIHRpbWUuIE9uIHRoZSBvdGhlciBoYW5kOgotCQkJCSAqIGlmIHdlIGdvdCBoZXJlIGZvciB0aGUgZmlyc3QgdGltZSwgYW5kIHRoZQotCQkJCSAqIGRlYmxvY2tfYnVmZmVyIHN0aWxsIGNvbnRhaW5zIGEgdmFsaWQKLQkJCQkgKiBzZWdtZW50LCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2tpcCB0byAKLQkJCQkgKiB0aGUgcHJldmlvdXMgc2VnbWVudCBpZiB0aGUgZGVzaXJlZCBwb3NpdGlvbgotCQkJCSAqIGlzIGluc2lkZSB0aGlzIHNlZ21lbnQuCi0JCQkJICovCi0JCQkJbmV3X3NlZyAtLTsKLQkJCX0KLQkJCWlmIChuZXdfc2VnIDwgdm9sdW1lLT5zdGFydF9zZWcpIHsKLQkJCQluZXdfc2VnID0gdm9sdW1lLT5zdGFydF9zZWc7Ci0JCQl9Ci0JCQlsaW1pdCAgID0gcG9zLT5zZWdfcG9zOwotCQkJZmFzdF9zZWVrX3RyaWFscyArKzsKLQkJCWZvciAoOzspIHsKLQkJCQlyZXN1bHQgPSBzZWFyY2hfdmFsaWRfc2VnbWVudChuZXdfc2VnLCBsaW1pdCwKLQkJCQkJCQkgICAgICBwb3MtPnZvbHVtZV9wb3MsCi0JCQkJCQkJICAgICAgcG9zLCAmY3NlZywKLQkJCQkJCQkgICAgICB2b2x1bWUsIGJ1Zik7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAtRUlOVFIpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChuZXdfc2VnID09IHZvbHVtZS0+c3RhcnRfc2VnKSB7Ci0JCQkJCXJlc3VsdCA9IC1FSU87IC8qIHNldCBlcnJyb3IgCi0JCQkJCQkJKiBjb25kaXRpb24KLQkJCQkJCQkqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbGltaXQgICAgPSBuZXdfc2VnOwotCQkJCW5ld19zZWcgLT0gWkZUX0ZBU1RfU0VFS19CQUNLVVA7Ci0JCQkJaWYgKG5ld19zZWcgPCB2b2x1bWUtPnN0YXJ0X3NlZykgewotCQkJCQluZXdfc2VnID0gdm9sdW1lLT5zdGFydF9zZWc7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQlUUkFDRShmdF90X3dhcm4sCi0JCQkJICAgICAgIkNvdWxkbid0IGZpbmQgYSByZWFkYWJsZSBzZWdtZW50Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZGlzdGFuY2UgPSBkZXN0IC0gKHBvcy0+dm9sdW1lX3BvcyA+PiAxMCk7Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0KLS8qICBhZHZhbmNlIGluc2lkZSB0aGUgZ2l2ZW4gc2VnbWVudCBhdCBtb3N0IHRvX2RvIGJ5dGVzLgotICogIG9mIGtpbG9ieXRlcyBtb3ZlZAotICovCi0KLXN0YXRpYyBpbnQgc2Vla19pbl9zZWdtZW50KGNvbnN0IHVuc2lnbmVkIGludCB0b19kbywKLQkJCSAgIGNtcHJfaW5mbyAgKmNfaW5mbywKLQkJCSAgIGNvbnN0IGNoYXIgKnNyY19idWYsIAotCQkJICAgY29uc3QgaW50IHNlZ19zeiwgCi0JCQkgICBjb25zdCBpbnQgc2VnX3BvcywKLQkJCSAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IGJsa19zeiA9IHZvbHVtZS0+YmxrX3N6ID4+IDEwOwotCWludCByZW1haW5pbmcgPSB0b19kbzsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChjX2luZm8tPm9mZnNldCA9PSAwKSB7Ci0JCS8qIG5ldyBzZWdtZW50IGp1c3QgcmVhZAotCQkgKi8KLQkJVFJBQ0VfQ0FUQ0goZ2V0X2NzZWcoY19pbmZvLCBzcmNfYnVmLCBzZWdfc3osIHZvbHVtZSksKTsKLQkJY19pbmZvLT5jbXByX3BvcyArPSBjX2luZm8tPmNvdW50OwotCQlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlLCAiIiwgY19pbmZvKTsKLQl9Ci0JLyogbG9vcCBhbmQgdW5jb21wcmVzcyB1bnRpbCB1c2VyIGJ1ZmZlciBmdWxsIG9yCi0JICogZGVibG9jay1idWZmZXIgZW1wdHkgCi0JICovCi0JVFJBQ0UoZnRfdF9ub2lzZSwgImNvbXByZXNzZWRfc3o6ICVkLCBjb21wb3MgOiAlZCIsCi0JICAgICAgY19pbmZvLT5jbXByX3N6LCBjX2luZm8tPmNtcHJfcG9zKTsKLQl3aGlsZSAoY19pbmZvLT5zcGFucyA9PSAwICYmIHJlbWFpbmluZyA+IDApIHsKLQkJaWYgKGNfaW5mby0+Y21wcl9wb3MgICE9IDApIHsgLyogY21wciBidWYgaXMgbm90IGVtcHR5ICovCi0JCQlyZXN1bHQgICAgICAgKz0gYmxrX3N6OwotCQkJcmVtYWluaW5nICAgIC09IGJsa19zejsKLQkJCWNfaW5mby0+Y21wcl9wb3MgPSAwOwotCQl9Ci0JCWlmIChyZW1haW5pbmcgPiAwKSB7Ci0JCQlnZXRfbmV4dF9jbHVzdGVyKGNfaW5mbywgc3JjX2J1Ziwgc2VnX3N6LCAKLQkJCQkJIHZvbHVtZS0+ZW5kX3NlZyA9PSBzZWdfcG9zKTsKLQkJCWlmIChjX2luZm8tPmNvdW50ICE9IDApIHsKLQkJCQljX2luZm8tPmNtcHJfcG9zID0gY19pbmZvLT5jb3VudDsKLQkJCQljX2luZm8tPm9mZnNldCAgKz0gY19pbmZvLT5jb3VudDsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwhCi0JCSAqLwotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UsICIiLCBjX2luZm8pOwotCQlUUkFDRShmdF90X25vaXNlLCAidG9fZG86ICVkIiwgcmVtYWluaW5nKTsKLQl9Ci0JaWYgKHNlZ19zeiAtIGNfaW5mby0+b2Zmc2V0IDw9IDE4KSB7Ci0JCWNfaW5mby0+b2Zmc2V0ID0gc2VnX3N6OwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAiXG4iCi0JICAgICAgS0VSTl9JTkZPICJzZWdtZW50IHNpemUgICA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJidWZfcG9zX3JlYWQgICA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmcgICAgICA6ICVkIiwKLQkgICAgICBzZWdfc3osIGNfaW5mby0+b2Zmc2V0LAotCSAgICAgIHNlZ19zeiAtIGNfaW5mby0+b2Zmc2V0KTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0gICAgICAgICAgICAgICAgCi0KLXN0YXRpYyBpbnQgc2xvd19zZWVrX2ZvcndhcmRfdW50aWxfZXJyb3IoY29uc3QgdW5zaWduZWQgaW50IGRpc3RhbmNlLAotCQkJCQkgY21wcl9pbmZvICpjX2luZm8sCi0JCQkJCSB6ZnRfcG9zaXRpb24gKnBvcywgCi0JCQkJCSBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAotCQkJCQkgX191OCAqYnVmKQotewotCXVuc2lnbmVkIGludCByZW1haW5pbmcgPSBkaXN0YW5jZTsKLQlpbnQgc2VnX3N6OwotCWludCBzZWdfcG9zOwotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0Jc2VnX3BvcyA9IHBvcy0+c2VnX3BvczsKLQlkbyB7Ci0JCVRSQUNFX0NBVENIKHNlZ19zeiA9IHpmdF9mZXRjaF9zZWdtZW50KHNlZ19wb3MsIGJ1ZiwgCi0JCQkJCQkgICAgICAgRlRfUkRfQUhFQUQpLCk7Ci0JCS8qIG5vdyB3ZSBoYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgYWN0dWFsIHNlZ21lbnQgaW4KLQkJICogdGhlIGRlYmxvY2sgYnVmZmVyCi0JCSAqLwotCQlUUkFDRV9DQVRDSChyZXN1bHQgPSBzZWVrX2luX3NlZ21lbnQocmVtYWluaW5nLCBjX2luZm8sIGJ1ZiwKLQkJCQkJCSAgICAgc2VnX3N6LCBzZWdfcG9zLHZvbHVtZSksKTsKLQkJcmVtYWluaW5nICAgICAgICAtPSByZXN1bHQ7Ci0JCXBvcy0+dm9sdW1lX3BvcyAgKz0gcmVzdWx0PDwxMDsKLQkJcG9zLT5zZWdfcG9zICAgICAgPSBzZWdfcG9zOwotCQlwb3MtPnNlZ19ieXRlX3BvcyA9IGNfaW5mby0+b2Zmc2V0OwotCQlzZWdfcG9zICsrOwotCQlpZiAoc2VnX3BvcyA8PSB2b2x1bWUtPmVuZF9zZWcgJiYgY19pbmZvLT5vZmZzZXQgPT0gc2VnX3N6KSB7Ci0JCQlwb3MtPnNlZ19wb3MgKys7Ci0JCQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7Ci0JCQljX2luZm8tPm9mZnNldCA9IDA7Ci0JCX0KLQkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwhCi0JCSAqLwotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKLQkJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmc6ICAlZFxuIgotCQkgICAgICBLRVJOX0lORk8gInNlZ19wb3M6ICAgICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiZW5kX3NlZzogICAgJWRcbiIKLQkJICAgICAgS0VSTl9JTkZPICJyZXN1bHQ6ICAgICAlZCIsCi0JCSAgICAgIHJlbWFpbmluZywgc2VnX3Bvcywgdm9sdW1lLT5lbmRfc2VnLCByZXN1bHQpOyAgCi0JfSB3aGlsZSAocmVtYWluaW5nID4gMCAmJiBzZWdfcG9zIDw9IHZvbHVtZS0+ZW5kX3NlZyk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiByZXR1cm4gc2VnbWVudCBpZCBvZiBuZXh0IHNlZ21lbnQgY29udGFpbmluZyB2YWxpZCBkYXRhLCAtRUlPIG90aGVyd2lzZQotICovCi1zdGF0aWMgaW50IHNlYXJjaF92YWxpZF9zZWdtZW50KHVuc2lnbmVkIGludCBzZWdtZW50LAotCQkJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRfc2VnLAotCQkJCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfZm9mZnMsCi0JCQkJemZ0X3Bvc2l0aW9uICpwb3MsCi0JCQkJY21wcl9pbmZvICpjX2luZm8sCi0JCQkJY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKLQkJCQlfX3U4ICpidWYpCi17Ci0JY21wcl9pbmZvIHRtcF9pbmZvOwotCWludCBzZWdfc3o7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JbWVtc2V0KCZ0bXBfaW5mbywgMCwgc2l6ZW9mKGNtcHJfaW5mbykpOwotCXdoaWxlIChzZWdtZW50IDw9IGVuZF9zZWcpIHsKLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQlUUkFDRShmdF90X25vaXNlLAotCQkgICAgICAiU2VhcmNoaW5nIHJlYWRhYmxlIHNlZ21lbnQgYmV0d2VlbiAlZCBhbmQgJWQiLAotCQkgICAgICBzZWdtZW50LCBlbmRfc2VnKTsKLQkJc2VnX3N6ID0gemZ0X2ZldGNoX3NlZ21lbnQoc2VnbWVudCwgYnVmLCBGVF9SRF9BSEVBRCk7Ci0JCWlmICgoc2VnX3N6ID4gMCkgJiYKLQkJICAgIChnZXRfY3NlZyAoJnRtcF9pbmZvLCBidWYsIHNlZ19zeiwgdm9sdW1lKSA+PSAwKSAmJgotCQkgICAgKHRtcF9pbmZvLmZvZmZzICE9IDAgfHwgc2VnbWVudCA9PSB2b2x1bWUtPnN0YXJ0X3NlZykpIHsKLQkJCWlmICgodG1wX2luZm8uZm9mZnM+PjEwKSA+IG1heF9mb2ZmcykgewotCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3Rfbm9pc2UsICJcbiIKLQkJCQkJICAgIEtFUk5fSU5GTyAiY3NlZy5mb2ZmOiAlZFxuIgotCQkJCQkgICAgS0VSTl9JTkZPICJkZXN0ICAgICA6ICVkIiwKLQkJCQkJICAgIChpbnQpKHRtcF9pbmZvLmZvZmZzID4+IDEwKSwKLQkJCQkJICAgIG1heF9mb2Zmcyk7Ci0JCQl9Ci0JCQlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlLCAiIiwgJnRtcF9pbmZvKTsKLQkJCSpjX2luZm8gICAgICAgICAgID0gdG1wX2luZm87Ci0JCQlwb3MtPnNlZ19wb3MgICAgICA9IHNlZ21lbnQ7Ci0JCQlwb3MtPnZvbHVtZV9wb3MgICA9IGNfaW5mby0+Zm9mZnM7Ci0JCQlwb3MtPnNlZ19ieXRlX3BvcyA9IGNfaW5mby0+b2Zmc2V0OwotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImZvdW5kIHNlZ21lbnQgYXQgJWQiLCBzZWdtZW50KTsKLQkJCVRSQUNFX0VYSVQgMDsKLQkJfQotCQlzZWdtZW50Kys7Ci0JfQotCVRSQUNFX0VYSVQgLUVJTzsKLX0KLQotc3RhdGljIGludCBzbG93X3NlZWtfZm9yd2FyZCh1bnNpZ25lZCBpbnQgZGVzdCwKLQkJCSAgICAgY21wcl9pbmZvICpjX2luZm8sCi0JCQkgICAgIHpmdF9wb3NpdGlvbiAqcG9zLAotCQkJICAgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAotCQkJICAgICBfX3U4ICpidWYpCi17Ci0JdW5zaWduZWQgaW50IGRpc3RhbmNlOwotCWludCByZXN1bHQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQkKLQlkaXN0YW5jZSA9IGRlc3QgLSAocG9zLT52b2x1bWVfcG9zID4+IDEwKTsKLQl3aGlsZSAoKGRpc3RhbmNlID4gMCkgJiYKLQkgICAgICAgKHJlc3VsdCA9IHNsb3dfc2Vla19mb3J3YXJkX3VudGlsX2Vycm9yKGRpc3RhbmNlLAotCQkJCQkJICAgICAgIGNfaW5mbywKLQkJCQkJCSAgICAgICBwb3MsCi0JCQkJCQkgICAgICAgdm9sdW1lLAotCQkJCQkJICAgICAgIGJ1ZikpIDwgMCkgewotCQlpZiAocmVzdWx0ID09IC1FSU5UUikgewotCQkJYnJlYWs7Ci0JCX0KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgInNlZ19wb3M6ICVkIiwgcG9zLT5zZWdfcG9zKTsKLQkJLyogdGhlIGZhaWxpbmcgc2VnbWVudCBpcyBlaXRoZXIgcG9zLT5zZWdfcG9zIG9yCi0JCSAqIHBvcy0+c2VnX3BvcyArIDEuIFRoZXJlIGlzIG5vIG5lZWQgdG8gZnVydGhlciB0cnkKLQkJICogdGhhdCBzZWdtZW50LCBiZWNhdXNlIGZ0YXBlX3JlYWRfc2VnbWVudCgpIGFscmVhZHkKLQkJICogaGFzIHRyaWVkIHZlcnkgbXVjaCB0byByZWFkIGl0LiBTbyB3ZSBzdGFydCB3aXRoCi0JCSAqIGZvbGxvd2luZyBzZWdtZW50LCB3aGljaCBpcyBwb3MtPnNlZ19wb3MgKyAxCi0JCSAqLwotCQlpZihzZWFyY2hfdmFsaWRfc2VnbWVudChwb3MtPnNlZ19wb3MrMSwgdm9sdW1lLT5lbmRfc2VnLCBkZXN0LAotCQkJCQlwb3MsIGNfaW5mbywKLQkJCQkJdm9sdW1lLCBidWYpIDwgMCkgewotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInNlYXJjaF92YWxpZF9zZWdtZW50KCkgZmFpbGVkIik7Ci0JCQlyZXN1bHQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkZXN0IC0gKHBvcy0+dm9sdW1lX3BvcyA+PiAxMCk7Ci0JCXJlc3VsdCA9IDA7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZWdtZW50OiAlZCIsIHBvcy0+c2VnX3Bvcyk7Ci0JCS8qIGZvdW5kIHZhbGlkIHNlZ21lbnQsIHJldHJ5IHRoZSBzZWVrICovCi0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IGNvbXB1dGVfc2VnX3Bvcyhjb25zdCB1bnNpZ25lZCBpbnQgZGVzdCwKLQkJCSAgIHpmdF9wb3NpdGlvbiAqcG9zLAotCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKLXsKLQlpbnQgc2VnbWVudDsKLQlpbnQgZGlzdGFuY2UgPSBkZXN0IC0gKHBvcy0+dm9sdW1lX3BvcyA+PiAxMCk7Ci0JdW5zaWduZWQgaW50IHJhd19zaXplOwotCXVuc2lnbmVkIGludCB2aXJ0X3NpemU7Ci0JdW5zaWduZWQgaW50IGZhY3RvcjsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChkaXN0YW5jZSA+PSAwKSB7Ci0JCXJhd19zaXplICA9IHZvbHVtZS0+ZW5kX3NlZyAtIHBvcy0+c2VnX3BvcyArIDE7Ci0JCXZpcnRfc2l6ZSA9ICgodW5zaWduZWQgaW50KSh2b2x1bWUtPnNpemU+PjEwKSAKLQkJCSAgICAgLSAodW5zaWduZWQgaW50KShwb3MtPnZvbHVtZV9wb3M+PjEwKQotCQkJICAgICArIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBGVF9FQ0NfU0VDVE9SUyAtIDEpOwotCQl2aXJ0X3NpemUgLz0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTOwotCQlpZiAodmlydF9zaXplID09IDAgfHwgcmF3X3NpemUgPT0gMCkgewotCQkJVFJBQ0VfRVhJVCAwOwotCQl9Ci0JCWlmIChyYXdfc2l6ZSA+PSAoMTw8MjUpKSB7Ci0JCQlmYWN0b3IgPSByYXdfc2l6ZS8odmlydF9zaXplPj43KTsKLQkJfSBlbHNlIHsKLQkJCWZhY3RvciA9IChyYXdfc2l6ZTw8NykvdmlydF9zaXplOwotCQl9Ci0JCXNlZ21lbnQgPSBkaXN0YW5jZS8oRlRfU0VDVE9SU19QRVJfU0VHTUVOVC1GVF9FQ0NfU0VDVE9SUyk7Ci0JCXNlZ21lbnQgPSAoc2VnbWVudCAqIGZhY3Rvcik+Pjc7Ci0JfSBlbHNlIHsKLQkJcmF3X3NpemUgID0gcG9zLT5zZWdfcG9zIC0gdm9sdW1lLT5zdGFydF9zZWcgKyAxOwotCQl2aXJ0X3NpemUgPSAoKHVuc2lnbmVkIGludCkocG9zLT52b2x1bWVfcG9zPj4xMCkKLQkJCSAgICAgKyBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gRlRfRUNDX1NFQ1RPUlMgLSAxKTsKLQkJdmlydF9zaXplIC89IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBGVF9FQ0NfU0VDVE9SUzsKLQkJaWYgKHZpcnRfc2l6ZSA9PSAwIHx8IHJhd19zaXplID09IDApIHsKLQkJCVRSQUNFX0VYSVQgMDsKLQkJfQotCQlpZiAocmF3X3NpemUgPj0gKDE8PDI1KSkgewotCQkJZmFjdG9yID0gcmF3X3NpemUvKHZpcnRfc2l6ZT4+Nyk7Ci0JCX0gZWxzZSB7Ci0JCQlmYWN0b3IgPSAocmF3X3NpemU8PDcpL3ZpcnRfc2l6ZTsKLQkJfQotCQlzZWdtZW50ID0gZGlzdGFuY2UvKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQtRlRfRUNDX1NFQ1RPUlMpOwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAiZmFjdG9yOiAlZC8lZCIsIGZhY3RvciwgMTw8Nyk7Ci0JVFJBQ0VfRVhJVCBzZWdtZW50OwotfQotCi1zdGF0aWMgc3RydWN0IHpmdF9jbXByX29wcyBjbXByX29wcyA9IHsKLQl6ZnRjX3dyaXRlLAotCXpmdGNfcmVhZCwKLQl6ZnRjX3NlZWssCi0JemZ0Y19sb2NrLAotCXpmdGNfcmVzZXQsCi0JemZ0Y19jbGVhbnVwCi19OwotCi1pbnQgemZ0X2NvbXByZXNzb3JfaW5pdCh2b2lkKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotI2lmZGVmIE1PRFVMRQotCXByaW50ayhLRVJOX0lORk8gInpmdGFwZSBjb21wcmVzc29yIHYxLjAwYSA5NzA1MTQgZm9yICIgRlRBUEVfVkVSU0lPTiAiXG4iKTsKLSAgICAgICAgaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgewotCQlwcmludGsoCi1LRVJOX0lORk8gIihjKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKVxuIgotS0VSTl9JTkZPICJDb21wcmVzc29yIGZvciB6ZnRhcGUgKGx6cnczIGFsZ29yaXRobSlcbiIpOwotICAgICAgICB9Ci0jZWxzZSAvKiAhTU9EVUxFICovCi0JLyogcHJpbnQgYSBzaG9ydCBuby1ub25zZW5zZSBib290IG1lc3NhZ2UgKi8KLQlwcmludGsoS0VSTl9JTkZPICJ6ZnRhcGUgY29tcHJlc3NvciB2MS4wMGEgOTcwNTE0XG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJGb3IgdXNlIHdpdGggIiBGVEFQRV9WRVJTSU9OICJcbiIpOwotI2VuZGlmIC8qIE1PRFVMRSAqLwotCVRSQUNFKGZ0X3RfaW5mbywgInpmdF9jb21wcmVzc29yX2luaXQgQCAweCVwIiwgemZ0X2NvbXByZXNzb3JfaW5pdCk7Ci0JVFJBQ0UoZnRfdF9pbmZvLCAiaW5zdGFsbGluZyBjb21wcmVzc29yIGZvciB6ZnRhcGUgLi4uIik7Ci0JVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfcmVnaXN0ZXIoJmNtcHJfb3BzKSwpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotI2lmZGVmIE1PRFVMRQotCi1NT0RVTEVfQVVUSE9SKAotCSIoYykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKAotIkNvbXByZXNzaW9uIHJvdXRpbmVzIGZvciB6ZnRhcGUuIFVzZXMgdGhlIGx6cnczIGFsZ29yaXRobSBieSBSb3NzIFdpbGxpYW1zIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIKLSAqLwotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHpmdF9jb21wcmVzc29yX2luaXQoKTsKLX0KLQotI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwMDc0MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSNpZm5kZWYgX1pGVEFQRV9DT01QUkVTU19ICi0jZGVmaW5lIF9aRlRBUEVfQ09NUFJFU1NfSAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0geW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5oLHYgJAotICogJFJldmlzaW9uOiAxLjEgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTI6MzIgJAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgYW5kIGRlZmluaXRpb25zIGZvciB6ZnRhcGUncwotICogYnVpbHRpbiBjb21wcmVzc2lvbiBjb2RlLgotICoKLSAqLwotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCi0jaW5jbHVkZSAiLi4vY29tcHJlc3Nvci9senJ3My5oIgotCi0vKiBDTVBSX1dSS19NRU1fU0laRSBnaXZlcyB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gd3JrX21lbSAqLwotLyogSSBnb3QgdGhlc2Ugb3V0IG9mIGx6cnczLmMgKi8KLSNkZWZpbmUgVShYKSAgICAgICAgICAgICgoX191MzIpIFgpCi0jZGVmaW5lIFNJWkVfUF9CWVRFICAgICAoVShzaXplb2YoX191OCAqKSkpCi0jZGVmaW5lIEFMSUdOTUVOVF9GVURHRSAoVSgxNikpCi0KLSNkZWZpbmUgQ01QUl9XUktfTUVNX1NJWkUgKFUoNDA5NikqKFNJWkVfUF9CWVRFKSArIEFMSUdOTUVOVF9GVURHRSkKLQotLyogdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoZSBzaXplIG9mIHRoZSAiY29tcHJlc3NlZCIgZGF0YSBjYW4KLSAqIGV4Y2VlZCB0aGUgdW5jb21wcmVzc2VkIGRhdGEuIEFzIGl0IGlzIHF1aXRlIHVzZWxlc3MgdG8gY29tcHJlc3MKLSAqIGRhdGEgdHdpY2UgaXQgaXMgc29tZXRpbWVzIHRoZSBjYXNlIHRoYXQgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8KLSAqIGNvcHkgYSBibG9jayBvZiBkYXRhIGJ1dCB0byBmZWVkIGl0IHRvIHRoZSAiY29tcHJlc3Npb24iCi0gKiBhbGdvcml0aG0uIEluIHRoaXMgY2FzZSB0aGVyZSBhcmUgc29tZSBmbGFnIGJ5dGVzIG9yIHRoZSBsaWtlCi0gKiBwcm9jZWRpbmcgdGhlICJjb21wcmVzc2VkIiBkYXRhLiAgVEhBVCBNVVNUIE5PVCBCRSBUSEUgQ0FTRSBmb3IgdGhlCi0gKiBhbGdvcml0aG0gd2UgdXNlIGZvciB0aGlzIGRyaXZlci4gSW5zdGVhZCwgdGhlIGhpZ2ggYml0IDE1IG9mCi0gKiBjb21wcmVzc2VkX3NpemU6Ci0gKgotICogY29tcHJlc3NlZF9zaXplID0gZnRhcGVfY29tcHJlc3MoKQotICoKLSAqIG11c3QgYmUgc2V0IGluIHN1Y2ggYSBjYXNlLgotICoKLSAqIE5ldmVydGhlbGVzcywgaXQgbWlnaHQgYWxzbyBiZSBhcyBmb3IgbHpydzMgdGhhdCB0aGVyZSBpcyBhbgotICogImludGVybWVkaWF0ZSIgb3ZlcnJ1biB0aGF0IGV4Y2VlZHMgdGhlIGFtb3VudCBvZiB0aGUgY29tcHJlc3NlZAotICogZGF0YSB0aGF0IGlzIGFjdHVhbGx5IHByb2R1Y2VkLiBEdXJpbmcgdGhlIGFsZ29yaXRobSB3ZSBuZWVkIGluIHRoZQotICogd29yc3QgY2FzZSBNQVhfQ01QX0dST1VQIGJ5dGVzIG1vcmUgdGhhbiB0aGUgaW5wdXQtc2l6ZS4KLSAqLwotI2RlZmluZSBNQVhfQ01QX0dST1VQICgyKzE2KjIpIC8qIGZyb20gbHpydzMuYyAqLwotCi0jZGVmaW5lIENNUFJfT1ZFUlJVTiAgICAgIE1BWF9DTVBfR1JPVVAgLyogZHVyaW5nIGNvbXByZXNzaW9uICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lICAgICBDTVBSX0JVRkZFUl9TSVpFIChNQVhfQkxPQ0tfU0laRSArIENNUFJfT1ZFUlJVTikKLQotLyogdGhlIGNvbXByZXNzaW9uIG1hcCBzdG9yZXMgdGhlIGJ5dGUgb2Zmc2V0IGNvbXByZXNzZWQgYmxvY2tzIHdpdGhpbgotICogdGhlIGN1cnJlbnQgdm9sdW1lIGZvciBjYXRyaWRnZXMgd2l0aCBmb3JtYXQgY29kZSAyLDMgYW5kIDUKLSAqIChhbmQgb2xkIHZlcnNpb25zIG9mIHpmdGFwZSkgYW5kIHRoZSBvZmZzZXQgbWVhc3VyZWQgaW4ga2lsb2J5dGVzIGZvcgotICogZm9ybWF0IGNvZGUgNCBhbmQgNi4gVGhpcyBnaXZlcyB1cyBhIHBvc3NpYmxlIG1heC4gc2l6ZSBvZiBhIAotICogY29tcHJlc3NlZCB2b2x1bWUgb2YgMTAyNCo0R0lHIHdoaWNoIHNob3VsZCBiZSBlbm91Z2guCi0gKi8KLXR5cGVkZWYgX191MzIgQ21wck1hcDsKLQotLyogZ2xvYmFscyAKLSAqLwotCi0vKiBleHBvcnRlZCBmdW5jdGlvbnMKLSAqLwotCi0jZW5kaWYgLyogX1pGVEFQRV9DT01QUkVTU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmFiMDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIwotIyAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdS1KdXN0dXMgSGVpbmUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSMKLSMgJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlLHYgJAotIyAkUmV2aXNpb246IDEuNCAkCi0jICREYXRlOiAxOTk3LzEwLzA3IDA5OjI2OjAyICQKLSMKLSMgICAgICBNYWtlZmlsZSBmb3IgdGhlIGxvd2xldmVsIHBhcnQgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZQotIyAgICAgIGRyaXZlciBmb3IgTGludXguCi0jCi0KLW9iai0kKENPTkZJR19GVEFQRSkgKz0gZnRhcGUubwotCi1mdGFwZS1vYmpzIDo9IGZ0YXBlLWluaXQubyBmZGMtaW8ubyBmZGMtaXNyLm8gXAotCSAgICAgIGZ0YXBlLWJzbS5vIGZ0YXBlLWN0bC5vIGZ0YXBlLXJlYWQubyBmdGFwZS1ydy5vIFwKLQkgICAgICBmdGFwZS13cml0ZS5vIGZ0YXBlLWlvLm8gZnRhcGUtY2FsaWJyLm8gZnRhcGUtZWNjLm8gZmMtMTAubyBcCi0JICAgICAgZnRhcGUtYnVmZmVyLm8gZnRhcGUtZm9ybWF0Lm8gZnRhcGVfc3ltcy5vCi0KLWlmZXEgKCQoQ09ORklHX0ZUQVBFKSx5KQotZnRhcGUtb2JqcyArPSBmdGFwZS1zZXR1cC5vCi1lbmRpZgotCi1pZm5kZWYgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAotZnRhcGUtb2JqcyArPSBmdGFwZS10cmFjaW5nLm8KLWVuZGlmCi0KLWlmZXEgKCQoQ09ORklHX0ZUX1BST0NfRlMpLHkpCi1mdGFwZS1vYmpzICs9IGZ0YXBlLXByb2MubwotZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mYy0xMC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzFjZGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqCi0KLSAgIENvcHlyaWdodCAoQykgMTk5MywxOTk0IEpvbiBUb21icy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgVGhlIGVudGlyZSBndXRzIG9mIHRoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiBieSBkb3NlbXUsIG1vZGlmaWVkIHRvCi0gICByZWNvcmQgcmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgcG9ydHMgaW4gdGhlIDB4MTgwLTB4MTg4IGFkZHJlc3Mgc3BhY2UsCi0gICB3aGlsZSBydW5uaW5nIHRoZSBDTVMgcHJvZ3JhbSBUQVBFLkVYRSBWMi4wLjUgc3VwcGxpZWQgd2l0aCB0aGUgZHJpdmUuCi0KLSAgIE1vZGlmaWVkIHRvIHVzZSBhbiBhcnJheSBvZiBhZGRyZXNzZXMgYW5kIGdlbmVyYWxseSBjbGVhbmVkIHVwIChtYWRlCi0gICBtdWNoIHNob3J0ZXIpIDQgSnVuZSA5NCwgZG9zZW11IGlzbid0IHRoYXQgZ29vZCBhdCB3cml0aW5nIHNob3J0IGNvZGUgaXQKLSAgIHdvdWxkIHNlZW0gOi0pLiBNYWRlIGluZGVwZW5kZW50IG9mIDB4MTgwLCBidXQgSSBkb3VidCBpdCB3aWxsIHdvcmsKLSAgIGF0IGFueSBvdGhlciBhZGRyZXNzLgotCi0gICBNb2RpZmllZCBmb3IgZGlzdHJpYnV0aW9uIHdpdGggZnRhcGUgc291cmNlLiAyMSBKdW5lIDk0LCBTSkwuCi0KLSAgIE1vZGlmaWNhdGlvbnMgb24gMjAgT2N0b2JlciA5NSwgYnkgRGFuaWVsIENvaGVuIChjYXRtYW5Ad3BpLmVkdSk6Ci0gICBNb2RpZmllZCB0byBzdXBwb3J0IGRpZmZlcmVudCBETUEsIElSUSwgYW5kIElPIFBvcnRzLiAgQm9ybGFuZCdzCi0gICBUdXJibyBEZWJ1Z2dlciBpbiB2aXJ0dWFsIDgwODYgbW9kZSAoVEQzODYuRVhFIHdpdGggaGFyZHdhcmUgYnJlYWtwb2ludHMKLSAgIHByb3ZpZGVkIGJ5IHRoZSBUREgzODYuU1lTIERldmljZSBEcml2ZXIpIHdhcyB1c2VkIG9uIHRoZSBDTVMgcHJvZ3JhbQotICAgVEFQRSBWNC4wLjUuICBJIHNldCBicmVha3BvaW50cyBvbiBJL08gdG8gcG9ydHMgMHgxODAtMHgxODcuICBOb3RlIHRoYXQKLSAgIENNUydzIHByb2dyYW0gd2lsbCBub3Qgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZSB0aGUgdGFwZSBkcml2ZSBpZiB5b3Ugc2V0Ci0gICBicmVha3BvaW50cyBvbiBJTyBSZWFkcywgYnV0IHlvdSBjYW4gc2V0IHRoZW0gb24gSU8gV3JpdGVzIHdpdGhvdXQgcHJvYmxlbXMuCi0gICBLbm93biBwcm9ibGVtczoKLSAgIC0gWW91IGNhbiBub3QgdXNlIERNQSBDaGFubmVscyA1IG9yIDcuCi0KLSAgIE1vZGlmaWNhdGlvbiBvbiAyOSBKYW51YXJ5IDk2LCBieSBEYW5pZWwgQ29oZW4gKGNhdG1hbkB3cGkuZWR1KToKLSAgIE1vZGlmaWVkIHRvIG9ubHkgYWNjZXB0IElSUXMgMyAtIDcsIG9yIDkuICBTaW5jZSB3ZSBjYW4gb25seSBzZW5kIGEgMyBiaXQKLSAgIG51bWJlciByZXByZXNlbnRpbmcgdGhlIElSUSB0byB0aGUgY2FyZCwgc3BlY2lhbCBoYW5kbGluZyBpcyByZXF1aXJlZCB3aGVuCi0gICBJUlEgOSBpcyBzZWxlY3RlZC4gIElSUSAyIGFuZCA5IGFyZSB0aGUgc2FtZSwgYW5kIHdlIHNob3VsZCByZXF1ZXN0IElSUSA5Ci0gICBmcm9tIHRoZSBrZXJuZWwgd2hpbGUgdGVsbGluZyB0aGUgY2FyZCB0byB1c2UgSVJRIDIuICBUaGFua3MgdG8gR3JlZwotICAgQ3JpZGVyIChnY3JpZGVyQGljbG5ldC5vcmcpIGZvciBmaW5kaW5nIGFuZCBsb2NhdGluZyB0aGlzIGJ1ZywgYXMgd2VsbCBhcwotICAgdGVzdGluZyB0aGUgcGF0Y2guCi0KLSAgIE1vZGlmaWNhdGlvbiBvbiAxMSBEZWNlbWJlciA5NiwgYnkgQ2xhdXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSk6Ci0gICBNb2RpZmllZCBhIGxpdHRsZSB0byB1c2UgdmFyaWFobGUgZnRfZmRjX2Jhc2UsIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEgCi0gICBpbnN0ZWFkIG9mIHByZXByb2Nlc3NvciBzeW1ib2xzLiBUaHVzIHdlIGNhbiBjb21waWxlIHRoaXMgaW50byB0aGUgbW9kdWxlCi0gICBvciBrZXJuZWwgYW5kIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBvcHRpb25zIGFzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmMtMTAuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA0ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciB0aGUgQ01TIEZDLTEwL0ZDLTIwIGNhcmQuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZjLTEwLmgiCi0KLXN0YXRpYyBfX3UxNiBpbmJzX21hZ2ljW10gPSB7Ci0JMHgzLCAweDMsIDB4MCwgMHg0LCAweDcsIDB4MiwgMHg1LCAweDMsIDB4MSwgMHg0LAotCTB4MywgMHg1LCAweDIsIDB4MCwgMHgzLCAweDcsIDB4NCwgMHgyLAotCTB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3Ci19OwotCi1zdGF0aWMgX191MTYgZmMxMF9wb3J0c1tdID0gewotCTB4MTgwLCAweDIxMCwgMHgyQTAsIDB4MzAwLCAweDMzMCwgMHgzNDAsIDB4MzcwCi19OwotCi1pbnQgZmMxMF9lbmFibGUodm9pZCkKLXsKLQlpbnQgaTsKLQlfX3U4IGNhcmRDb25maWcgPSAweDAwOwotCV9fdTggeDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotLyogIFRoaXMgY29kZSB3aWxsIG9ubHkgd29yayBpZiB0aGUgRkMtMTAgKG9yIEZDLTIwKSBpcyBzZXQgdG8KLSAqICB1c2UgRE1BIGNoYW5uZWxzIDEsIDIsIG9yIDMuICBETUEgY2hhbm5lbHMgNSBhbmQgNyBzZWVtIHRvIGJlIAotICogIGluaXRpYWxpemVkIGJ5IHRoZSBzYW1lIGNvbW1hbmQgYXMgY2hhbm5lbHMgMSBhbmQgMywgcmVzcGVjdGl2ZWx5LgotICovCi0JaWYgKGZ0X2ZkY19kbWEgPiAzKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAotIkVycm9yOiBUaGUgRkMtMTAvMjAgbXVzdCBiZSBzZXQgdG8gdXNlIERNQSBjaGFubmVscyAxLCAyLCBvciAzISIpOwotCX0KLS8qICBPbmx5IGFsbG93IHRoZSBGQy0xMC8yMCB0byB1c2UgSVJRIDMtNywgb3IgOS4gIE5vdGUgdGhhdCBDTVMncyBwcm9ncmFtCi0gKiAgb25seSBhY2NlcHRzIElSUSdzIDItNywgYnV0IGluIGxpbnV4LCBJUlEgMiBpcyB0aGUgc2FtZSBhcyBJUlEgOS4KLSAqLwotCWlmIChmdF9mZGNfaXJxIDwgMyB8fCBmdF9mZGNfaXJxID09IDggfHwgZnRfZmRjX2lycSA+IDkpIHsKLQkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9lcnIsIAotIkVycm9yOiBUaGUgRkMtMTAvMjAgbXVzdCBiZSBzZXQgdG8gdXNlIElSUSBsZXZlbHMgMyAtIDcsIG9yIDkhXG4iCi1LRVJOX0lORk8gIk5vdGU6IElSUSA5IGlzIHRoZSBzYW1lIGFzIElSUSAyIik7Ci0JfQotCS8qICBDbGVhciBzdGF0ZSBtYWNoaW5lID8/PwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhpbmJzX21hZ2ljKTsgaSsrKSB7Ci0JCWluYihmdF9mZGNfYmFzZSArIGluYnNfbWFnaWNbaV0pOwotCX0KLQlvdXRiKDB4MCwgZnRfZmRjX2Jhc2UpOwotCi0JeCA9IGluYihmdF9mZGNfYmFzZSk7Ci0JaWYgKHggPT0gMHgxMyB8fCB4ID09IDB4OTMpIHsKLQkJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgewotCQkJaWYgKGluYihmdF9mZGNfYmFzZSArIGkpICE9IHgpIHsKLQkJCQlUUkFDRV9FWElUIDA7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlUUkFDRV9FWElUIDA7Ci0JfQotCi0Jb3V0YigweDgsIGZ0X2ZkY19iYXNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKGluYihmdF9mZGNfYmFzZSArIGkpICE9IDB4MCkgewotCQkJVFJBQ0VfRVhJVCAwOwotCQl9Ci0JfQotCW91dGIoMHgxMCwgZnRfZmRjX2Jhc2UpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoaW5iKGZ0X2ZkY19iYXNlICsgaSkgIT0gMHhmZikgewotCQkJVFJBQ0VfRVhJVCAwOwotCQl9Ci0JfQotCi0JLyogIE9rYXksIHdlIGZvdW5kIGEgRkMtMTAgY2FyZCAhID8/PwotCSAqLwotCW91dGIoMHgwLCBmZGMuY2NyKTsKLQotCS8qICBDbGVhciBzdGF0ZSBtYWNoaW5lIGFnYWluID8/PwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhpbmJzX21hZ2ljKTsgaSsrKSB7Ci0JCWluYihmdF9mZGNfYmFzZSArIGluYnNfbWFnaWNbaV0pOwotCX0KLQkvKiBTZW5kIGlvIHBvcnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVRFTVMoZmMxMF9wb3J0cyk7IGkrKykKLQkJaWYgKGZ0X2ZkY19iYXNlID09IGZjMTBfcG9ydHNbaV0pCi0JCQljYXJkQ29uZmlnID0gaSArIDE7Ci0JaWYgKGNhcmRDb25maWcgPT0gMCkgewotCQlUUkFDRV9FWElUIDA7CS8qIEludmFsaWQgSS9PIFBvcnQgKi8KLQl9Ci0JLyogYW5kIElSUSAtIElmIHVzaW5nIElSUSA5LCB0ZWxsIHRoZSBGQyBjYXJkIGl0IGlzIGFjdHVhbGx5IElSUSAyICovCi0JaWYgKGZ0X2ZkY19pcnEgIT0gOSkKLQkJY2FyZENvbmZpZyB8PSBmdF9mZGNfaXJxIDw8IDM7Ci0JZWxzZQotCQljYXJkQ29uZmlnIHw9IDIgPDwgMzsKLQotCS8qIGFuZCBmaW5hbGx5IERNQSBDaGFubmVsICovCi0JY2FyZENvbmZpZyB8PSBmdF9mZGNfZG1hIDw8IDY7Ci0Jb3V0YihjYXJkQ29uZmlnLCBmdF9mZGNfYmFzZSk7CS8qIERNQSBbMiBiaXRzXS9JUlEgWzMgYml0c10vQkFTRSBbMyBiaXRzXSAqLwotCi0JLyogIEVuYWJsZSBGQy0xMCA/Pz8KLQkgKi8KLQlvdXRiKDAsIGZkYy5jY3IpOwotCW91dGIoMCwgZmRjLmRvcjIpOwotCW91dGIoRkRDX0RNQV9NT0RFIC8qIDggKi8sIGZkYy5kb3IpOwotCW91dGIoRkRDX0RNQV9NT0RFIC8qIDggKi8sIGZkYy5kb3IpOwotCW91dGIoMSwgZmRjLmRvcjIpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKgotCSAqIGNIOiB3aHkgdGhlIGhlbGwgc2hvdWxkIHRoaXMgYmUgbmVjZXNzYXJ5PyBUaGlzIGlzIGRvbmUgCi0JICogICAgIGJ5IGZkY19yZXNldCgpISEhCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiAgSW5pdGlhbGl6ZSBmZGMsIHNlbGVjdCBkcml2ZSBCOgotCSAqLwotCW91dGIoRkRDX0RNQV9NT0RFLCBmZGMuZG9yKTsJLyogYXNzZXJ0IHJlc2V0LCBkbWEgJiBpcnEgZW5hYmxlZCAqLwotCS8qICAgICAgIDB4MDggICAgKi8KLQlvdXRiKEZEQ19ETUFfTU9ERXxGRENfUkVTRVRfTk9ULCBmZGMuZG9yKTsJLyogcmVsZWFzZSByZXNldCAqLwotCS8qICAgICAgIDB4MDggICAgfCAgIDB4MDQgICA9IDB4MGMgKi8KLQlvdXRiKEZEQ19ETUFfTU9ERXxGRENfUkVTRVRfTk9UfEZEQ19NT1RPUl8xfEZUQVBFX1NFTF9CLCBmZGMuZG9yKTsKLQkvKiAgICAgICAweDA4ICAgIHwgICAweDA0ICAgICAgfCAgMHgyMCAgICAgfCAgMHgwMSAgPSAweDJkICovICAgIAotCS8qIHNlbGVjdCBkcml2ZSAxICovIC8qIHdoeSBub3QgZHJpdmUgMCA/Pz8/ICovCi0JVFJBQ0VfRVhJVCAoeCA9PSAweDkzKSA/IDIgOiAxOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3Yjg4Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNpZm5kZWYgX0ZDXzEwX0gKLSNkZWZpbmUgX0ZDXzEwX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4uCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMSAkCi0gKiAkRGF0ZTogMTk5Ny8wOS8xOSAwOTowNToyMiAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBGQy0xMCBjb2RlCi0gKiAgICAgIG9mIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0vKgotICogICAgICBmYy0xMC5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCi0gKi8KLQotLyoKLSAqICAgICAgZmMtMTAuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiBpbnQgZmMxMF9lbmFibGUodm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNmOTE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jLHYgJAotICogJFJldmlzaW9uOiAxLjcuNC4yICQKLSAqICREYXRlOiAxOTk3LzExLzE2IDE0OjQ4OjE3ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93LWxldmVsIGZsb3BweSBkaXNrIGludGVyZmFjZSBjb2RlCi0gKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKLSAqICAgICAgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pc3IuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmMtMTAuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotc3RhdGljIGludCBmdGFwZV9tb3RvcjsKLXZvbGF0aWxlIGludCBmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gLTE7Ci12b2xhdGlsZSBmZGNfbW9kZV9lbnVtIGZkY19tb2RlID0gZmRjX2lkbGU7Ci1mZGNfY29uZmlnX2luZm8gZmRjOwotREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZnRhcGVfd2FpdF9pbnRyKTsKLQotdW5zaWduZWQgaW50IGZ0X2ZkY19iYXNlICAgICAgID0gQ09ORklHX0ZUX0ZEQ19CQVNFOwotdW5zaWduZWQgaW50IGZ0X2ZkY19pcnEgICAgICAgID0gQ09ORklHX0ZUX0ZEQ19JUlE7Ci11bnNpZ25lZCBpbnQgZnRfZmRjX2RtYSAgICAgICAgPSBDT05GSUdfRlRfRkRDX0RNQTsKLXVuc2lnbmVkIGludCBmdF9mZGNfdGhyZXNob2xkICA9IENPTkZJR19GVF9GRENfVEhSOyAgLyogYnl0ZXMgKi8KLXVuc2lnbmVkIGludCBmdF9mZGNfcmF0ZV9saW1pdCA9IENPTkZJR19GVF9GRENfTUFYX1JBVEU7IC8qIGJpdHMvc2VjICovCi1pbnQgZnRfcHJvYmVfZmMxMCAgICAgICAgPSBDT05GSUdfRlRfUFJPQkVfRkMxMDsKLWludCBmdF9tYWNoMiAgICAgICAgICAgICA9IENPTkZJR19GVF9NQUNIMjsKLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi1zdGF0aWMgc3BpbmxvY2tfdCBmZGNfaW9fbG9jazsgCi1zdGF0aWMgdW5zaWduZWQgaW50IGZkY19jYWxpYnJfY291bnQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZkY19jYWxpYnJfdGltZTsKLXN0YXRpYyBpbnQgZmRjX3N0YXR1czsKLXZvbGF0aWxlIF9fdTggZmRjX2hlYWQ7CQkvKiBGREMgaGVhZCBmcm9tIHNlY3RvciBpZCAqLwotdm9sYXRpbGUgX191OCBmZGNfY3lsOwkJLyogRkRDIHRyYWNrIGZyb20gc2VjdG9yIGlkICovCi12b2xhdGlsZSBfX3U4IGZkY19zZWN0OwkJLyogRkRDIHNlY3RvciBmcm9tIHNlY3RvciBpZCAqLwotc3RhdGljIGludCBmZGNfZGF0YV9yYXRlID0gNTAwOwkvKiBkYXRhIHJhdGUgKEticHMpICovCi1zdGF0aWMgaW50IGZkY19yYXRlX2NvZGU7CS8qIGRhdGEgcmF0ZSBjb2RlICgwID09IDUwMCBLYnBzKSAqLwotc3RhdGljIGludCBmZGNfc2Vla19yYXRlID0gMjsJLyogc3RlcCByYXRlIChtc2VjKSAqLwotc3RhdGljIHZvaWQgKCpkb19mdGFwZSkgKHZvaWQpOwotc3RhdGljIGludCBmZGNfZmlmb19zdGF0ZTsJLyogb3JpZ2luYWwgZmlmbyBzZXR0aW5nIC0gZmlmbyBlbmFibGVkICovCi1zdGF0aWMgaW50IGZkY19maWZvX3RocjsJLyogb3JpZ2luYWwgZmlmbyBzZXR0aW5nIC0gdGhyZXNob2xkICovCi1zdGF0aWMgaW50IGZkY19sb2NrX3N0YXRlOwkvKiBvcmlnaW5hbCBsb2NrIHNldHRpbmcgLSBsb2NrZWQgKi8KLXN0YXRpYyBpbnQgZmRjX2ZpZm9fbG9ja2VkOwkvKiBoYXMgZmlmbyAmJiBsb2NrIHNldCA/ICovCi1zdGF0aWMgX191OCBmZGNfcHJlY29tcDsJLyogZGVmYXVsdCBwcmVjb21wLiB2YWx1ZSAobnNlYykgKi8KLXN0YXRpYyBfX3U4IGZkY19wcmVjX2NvZGU7CS8qIGZkYyBwcmVjb21wLiBzZWxlY3QgY29kZSAqLwotCi1zdGF0aWMgY2hhciBmdGFwZV9pZFtdID0gImZ0YXBlIjsgIC8qIHVzZWQgYnkgcmVxdWVzdCBpcnEgYW5kIGZyZWUgaXJxICovCi0KLXN0YXRpYyBpbnQgZmRjX3NldF9zZWVrX3JhdGUoaW50IHNlZWtfcmF0ZSk7Ci0KLXZvaWQgZmRjX2NhdGNoX3N0cmF5X2ludGVycnVwdHMoaW50IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKLQlpZiAoY291bnQgPT0gMCkgewotCQlmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzID0gMDsKLQl9IGVsc2UgewotCQlmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzICs9IGNvdW50OwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOwotfQotCi0vKiAgV2FpdCBkdXJpbmcgYSB0aW1lb3V0IHBlcmlvZCBmb3IgYSBnaXZlbiBGREMgc3RhdHVzLgotICogIElmIHVzZWNzID09IDAgdGhlbiBqdXN0IHRlc3Qgc3RhdHVzLCBlbHNlIHdhaXQgYXQgbGVhc3QgZm9yIHVzZWNzLgotICogIFJldHVybnMgLUVUSU1FIG9uIHRpbWVvdXQuIEZ1bmN0aW9uIG11c3QgYmUgY2FsaWJyYXRlZCBmaXJzdCAhCi0gKi8KLXN0YXRpYyBpbnQgZmRjX3dhaXQodW5zaWduZWQgaW50IHVzZWNzLCBfX3U4IG1hc2ssIF9fdTggc3RhdGUpCi17Ci0JaW50IGNvdW50XzEgPSAoZmRjX2NhbGlicl9jb3VudCAqIHVzZWNzICsKLSAgICAgICAgICAgICAgICAgICAgICAgZmRjX2NhbGlicl9jb3VudCAtIDEpIC8gZmRjX2NhbGlicl90aW1lOwotCi0JZG8gewotCQlmZGNfc3RhdHVzID0gaW5iX3AoZmRjLm1zcik7Ci0JCWlmICgoZmRjX3N0YXR1cyAmIG1hc2spID09IHN0YXRlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gd2hpbGUgKGNvdW50XzEtLSA+PSAwKTsKLQlyZXR1cm4gLUVUSU1FOwotfQotCi1pbnQgZmRjX3JlYWR5X3dhaXQodW5zaWduZWQgaW50IHVzZWNzKQotewotCXJldHVybiBmZGNfd2FpdCh1c2VjcywgRkRDX0RBVEFfUkVBRFkgfCBGRENfQlVTWSwgRkRDX0RBVEFfUkVBRFkpOwotfQotCi0vKiBXaHkgY2FuJ3Qgd2UganVzdCB1c2UgdWRlbGF5KCk/Ci0gKi8KLXN0YXRpYyB2b2lkIGZkY191c2VjX3dhaXQodW5zaWduZWQgaW50IHVzZWNzKQotewotCWZkY193YWl0KHVzZWNzLCAwLCAxKTsJLyogd2lsbCBhbHdheXMgdGltZW91dCAhICovCi19Ci0KLXN0YXRpYyBpbnQgZmRjX3JlYWR5X291dF93YWl0KHVuc2lnbmVkIGludCB1c2VjcykKLXsKLQlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KLQlyZXR1cm4gZmRjX3dhaXQodXNlY3MsIEZEQ19EQVRBX09VVF9SRUFEWSwgRkRDX0RBVEFfT1VUX1JFQURZKTsKLX0KLQotdm9pZCBmZGNfd2FpdF9jYWxpYnJhdGUodm9pZCkKLXsKLQlmdGFwZV9jYWxpYnJhdGUoImZkY193YWl0IiwKLQkJCWZkY191c2VjX3dhaXQsICZmZGNfY2FsaWJyX2NvdW50LCAmZmRjX2NhbGlicl90aW1lKTsgCi19Ci0KLS8qICBXYWl0IGZvciBhIChzaG9ydCkgd2hpbGUgZm9yIHRoZSBGREMgdG8gYmVjb21lIHJlYWR5Ci0gKiAgYW5kIHRyYW5zZmVyIHRoZSBuZXh0IGNvbW1hbmQgYnl0ZS4KLSAqICBSZXR1cm4gLUVUSU1FIG9uIHRpbWVvdXQgb24gZ2V0dGluZyByZWFkeSAoZGVwZW5kcyBvbiBoYXJkd2FyZSEpLgotICovCi1zdGF0aWMgaW50IGZkY193cml0ZShjb25zdCBfX3U4IGRhdGEpCi17Ci0JZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCi0JaWYgKGZkY193YWl0KDE1MCwgRkRDX0RBVEFfUkVBRFlfTUFTSywgRkRDX0RBVEFfSU5fUkVBRFkpIDwgMCkgewotCQlyZXR1cm4gLUVUSU1FOwotCX0gZWxzZSB7Ci0JCW91dGIoZGF0YSwgZmRjLmZpZm8pOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qICBXYWl0IGZvciBhIChzaG9ydCkgd2hpbGUgZm9yIHRoZSBGREMgdG8gYmVjb21lIHJlYWR5Ci0gKiAgYW5kIHRyYW5zZmVyIHRoZSBuZXh0IHJlc3VsdCBieXRlLgotICogIFJldHVybiAtRVRJTUUgaWYgdGltZW91dCBvbiBnZXR0aW5nIHJlYWR5IChkZXBlbmRzIG9uIGhhcmR3YXJlISkuCi0gKi8KLXN0YXRpYyBpbnQgZmRjX3JlYWQoX191OCAqIGRhdGEpCi17Ci0JZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCi0JaWYgKGZkY193YWl0KDE1MCwgRkRDX0RBVEFfUkVBRFlfTUFTSywgRkRDX0RBVEFfT1VUX1JFQURZKSA8IDApIHsKLQkJcmV0dXJuIC1FVElNRTsKLQl9IGVsc2UgewotCQkqZGF0YSA9IGluYihmZGMuZmlmbyk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyogIE91dHB1dCBhIGNtZF9sZW4gbG9uZyBjb21tYW5kIHN0cmluZyB0byB0aGUgRkRDLgotICogIFRoZSBGREMgc2hvdWxkIGJlIHJlYWR5IHRvIHJlY2VpdmUgYSBuZXcgY29tbWFuZCBvcgotICogIGFuIGVycm9yIChFQlVTWSBvciBFVElNRSkgd2lsbCBvY2N1ci4KLSAqLwotaW50IGZkY19jb21tYW5kKGNvbnN0IF9fdTggKiBjbWRfZGF0YSwgaW50IGNtZF9sZW4pCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgY291bnQgPSBjbWRfbGVuOwotCWludCByZXRyeSA9IDA7Ci0jaWZkZWYgVEVTVElORwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF90aW1lOwotCXVuc2lnbmVkIGludCB0aW1lOwotI2VuZGlmCi0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogd2FpdCBmb3IgdmFsaWQgUlFNIHN0YXR1cyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOwotCWlmICghaW5faW50ZXJydXB0KCkpCi0JCS8qIFllcywgSSBrbm93LCB0b28gbXVjaCBjb21tZW50cyBpbnNpZGUgdGhpcyBmdW5jdGlvbgotCQkgKiAuLi4KLQkJICogCi0JCSAqIFlldCBhbm90aGVyIGJ1ZyBpbiB0aGUgb3JpZ2luYWwgZHJpdmVyLiBBbGwgdGhhdAotCQkgKiBoYXZvYyBpcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgaXNyKCkgc2VuZHMKLQkJICogaXRzZWxmIGEgY29tbWFuZCB0byB0aGUgZmxvcHB5IHRhcGUgZHJpdmVyIChwYXVzZSwKLQkJICogbWljcm8gc3RlcCBwYXVzZSkuICBOb3csIHRoZSBwcm9ibGVtIGlzIHRoYXQKLQkJICogY29tbWFuZHMgYXJlIHRyYW5zbWl0dGVkIHZpYSB0aGUgZmRjX3NlZWsKLQkJICogY29tbWFuZC4gQnV0OiB0aGUgZmRjIHBlcmZvcm1zIHNlZWtzIGluIHRoZQotCQkgKiBiYWNrZ3JvdW5kIGkuZS4gaXQgZG9lc24ndCBzaWduYWwgYnVzeSB3aGlsZQotCQkgKiBzZW5kaW5nIHRoZSBzdGVwIHB1bHNlcyB0byB0aGUgZHJpdmUuIFRoZXJlZm9yZSB0aGUKLQkJICogbm9uLWludGVycnVwdCBsZXZlbCBkcml2ZXIgaGFzIG5vIGNoYW5jZSB0byB0ZWxsCi0JCSAqIHdoZXRoZXIgdGhlIGlzcigpIGp1c3QgaGFzIGlzc3VlZCBhIHNlZWsuIFRoZXJlZm9yZQotCQkgKiB3ZSBIQVZFIFRPIGhhdmUgYSBsb29rIGF0IHRoZSBmdF9oaWRlX2ludGVycnVwdAotCQkgKiBmbGFnOiBpdCBzaWduYWxzIHRoZSBub24taW50ZXJydXB0IGxldmVsIHBhcnQgb2YKLQkJICogdGhlIGRyaXZlciB0aGF0IGl0IGhhcyB0byB3YWl0IGZvciB0aGUgZmRjIHVudGlsIGl0Ci0JCSAqIGhhcyBjb21wbGV0ZXQgc2Vla2luZy4KLQkJICoKLQkJICogVEhJUyBXQVMgUFJFU1VNQUJMWSBUSEUgUkVBU09OIEZPUiBBTEwgVEhBVAotCQkgKiAiZmRjX3JlYWQgdGltZW91dCIgZXJyb3JzLCBJIEhPUEUgOi0pCi0JCSAqLwotCQlpZiAoZnRfaGlkZV9pbnRlcnJ1cHQpIHsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQkJVFJBQ0UoZnRfdF9pbmZvLAotCQkJICAgICAgIldhaXRpbmcgZm9yIHRoZSBpc3IoKSBjb21wbGV0aW5nIGZkY19zZWVrKCkiKTsKLQkJCWlmIChmZGNfaW50ZXJydXB0X3dhaXQoMiAqIEZUX1NFQ09ORCkgPCAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLAotCQkgICAgICAiV2FybmluZzogdGltZW91dCB3YWl0aW5nIGZvciBpc3IoKSBzZWVrIHRvIGNvbXBsZXRlIik7Ci0JCQl9Ci0JCQlpZiAoZnRfaGlkZV9pbnRlcnJ1cHQgfHwgIWZ0X3NlZWtfY29tcGxldGVkKSB7Ci0JCQkJLyogVGhlcmUgY2Fubm90IGJlIGFub3RoZXIKLQkJCQkgKiBpbnRlcnJ1cHQuIFRoZSBpc3IoKSBvbmx5IHN0b3BzCi0JCQkJICogdGhlIHRhcGUgYW5kIHRoZSBuZXh0IGludGVycnVwdAotCQkJCSAqIHdvbid0IGNvbWUgdW50aWwgd2UgaGF2ZSBzZW5kIG91cgotCQkJCSAqIGNvbW1hbmQgdG8gdGhlIGRyaXZlLgotCQkJCSAqLwotCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAotCQkJCQkgICAgIkJVRz8gaXNyKCkgaXMgc3RpbGwgc2Vla2luZz9cbiIKLQkJCQkJICAgIEtFUk5fSU5GTyAiaGlkZTogJWRcbiIKLQkJCQkJICAgIEtFUk5fSU5GTyAic2VlazogJWQiLAotCQkJCQkgICAgZnRfaGlkZV9pbnRlcnJ1cHQsCi0JCQkJCSAgICBmdF9zZWVrX2NvbXBsZXRlZCk7Ci0KLQkJCX0KLQkJCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogd2FpdCBmb3IgdmFsaWQgUlFNIHN0YXR1cyAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JCX0KLQlmZGNfc3RhdHVzID0gaW5iKGZkYy5tc3IpOwotCWlmICgoZmRjX3N0YXR1cyAmIEZEQ19EQVRBX1JFQURZX01BU0spICE9IEZEQ19EQVRBX0lOX1JFQURZKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JCVRSQUNFX0FCT1JUKC1FQlVTWSwgZnRfdF9lcnIsICJmZGMgbm90IHJlYWR5Iik7Ci0JfSAKLQlmZGNfbW9kZSA9ICpjbWRfZGF0YTsJLyogdXNlZCBieSBpc3IgKi8KLSNpZmRlZiBURVNUSU5HCi0JaWYgKGZkY19tb2RlID09IEZEQ19TRUVLKSB7Ci0JCXRpbWUgPSBmdGFwZV90aW1lZGlmZihsYXN0X3RpbWUsIGZ0YXBlX3RpbWVzdGFtcCgpKTsKLQkJaWYgKHRpbWUgPCA2MDAwKSB7Ci0JVFJBQ0UoZnRfdF9idWcsIldhcm5pbmc6IHNob3J0IHRpbWVvdXQgYmV0d2VlbiBzZWVrIGNvbW1hbmRzOiAlZCIsCi0JICAgICAgdGltZSk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlpZiAoIWluX2ludGVycnVwdCgpKSB7Ci0JCS8qIHNob3VsZG4ndCBiZSBjbGVhcmVkIGlmIGNhbGxlZCBmcm9tIGlzcgotCQkgKi8KLQkJZnRfaW50ZXJydXB0X3NlZW4gPSAwOwotCX0KLQl3aGlsZSAoY291bnQpIHsKLQkJcmVzdWx0ID0gZmRjX3dyaXRlKCpjbWRfZGF0YSk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlUUkFDRShmdF90X2ZkY19kbWEsCi0JCQkgICAgICAiZmRjX21vZGUgPSAlMDJ4LCBzdGF0dXMgPSAlMDJ4IGF0IGluZGV4ICVkIiwKLQkJCSAgICAgIChpbnQpIGZkY19tb2RlLCAoaW50KSBmZGNfc3RhdHVzLAotCQkJICAgICAgY21kX2xlbiAtIGNvdW50KTsKLQkJCWlmICgrK3JldHJ5IDw9IDMpIHsKLQkJCQlUUkFDRShmdF90X3dhcm4sICJmZGNfd3JpdGUgdGltZW91dCwgcmV0cnkiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsICJmZGNfd3JpdGUgdGltZW91dCwgZmF0YWwiKTsKLQkJCQkvKiByZWNvdmVyID8/PyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLS1jb3VudDsKLQkJCSsrY21kX2RhdGE7Ci0JCX0KLSAgICAgICAgfQotI2lmZGVmIFRFU1RJTkcKLQlpZiAoZmRjX21vZGUgPT0gRkRDX1NFRUspIHsKLQkJbGFzdF90aW1lID0gZnRhcGVfdGltZXN0YW1wKCk7Ci0JfQotI2VuZGlmCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyogIElucHV0IGEgcmVzX2xlbiBsb25nIHJlc3VsdCBzdHJpbmcgZnJvbSB0aGUgRkRDLgotICogIFRoZSBGREMgc2hvdWxkIGJlIHJlYWR5IHRvIHNlbmQgdGhlIHJlc3VsdCBvciBhbiBlcnJvcgotICogIChFQlVTWSBvciBFVElNRSkgd2lsbCBvY2N1ci4KLSAqLwotaW50IGZkY19yZXN1bHQoX191OCAqIHJlc19kYXRhLCBpbnQgcmVzX2xlbikKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjb3VudCA9IHJlc19sZW47Ci0JaW50IHJldHJ5ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JZmRjX3N0YXR1cyA9IGluYihmZGMubXNyKTsKLQlpZiAoKGZkY19zdGF0dXMgJiBGRENfREFUQV9SRUFEWV9NQVNLKSAhPSBGRENfREFUQV9PVVRfUkVBRFkpIHsKLQkJVFJBQ0UoZnRfdF9lcnIsICJmZGMgbm90IHJlYWR5Iik7Ci0JCXJlc3VsdCA9IC1FQlVTWTsKLQl9IGVsc2Ugd2hpbGUgKGNvdW50KSB7Ci0JCWlmICghKGZkY19zdGF0dXMgJiBGRENfQlVTWSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgInByZW1hdHVyZSBlbmQgb2YgcmVzdWx0IHBoYXNlIik7Ci0JCX0KLQkJcmVzdWx0ID0gZmRjX3JlYWQocmVzX2RhdGEpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJVFJBQ0UoZnRfdF9mZGNfZG1hLAotCQkJICAgICAgImZkY19tb2RlID0gJTAyeCwgc3RhdHVzID0gJTAyeCBhdCBpbmRleCAlZCIsCi0JCQkgICAgICAoaW50KSBmZGNfbW9kZSwKLQkJCSAgICAgIChpbnQpIGZkY19zdGF0dXMsCi0JCQkgICAgICByZXNfbGVuIC0gY291bnQpOwotCQkJaWYgKCsrcmV0cnkgPD0gMykgewotCQkJCVRSQUNFKGZ0X3Rfd2FybiwgImZkY19yZWFkIHRpbWVvdXQsIHJldHJ5Iik7Ci0JCQl9IGVsc2UgewotCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZmRjX3JlYWQgdGltZW91dCwgZmF0YWwiKTsKLQkJCQkvKiByZWNvdmVyID8/PyAqLwotCQkJCWJyZWFrOwotCQkJCSsrcmV0cnk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQktLWNvdW50OwotCQkJKytyZXNfZGF0YTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOwotCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogYWxsb3cgRkRDIHRvIG5lZ2F0ZSBCU1kgKi8KLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyogICAgICBIYW5kbGUgY29tbWFuZCBhbmQgcmVzdWx0IHBoYXNlcyBmb3IKLSAqICAgICAgY29tbWFuZHMgd2l0aG91dCBkYXRhIHBoYXNlLgotICovCi1zdGF0aWMgaW50IGZkY19pc3N1ZV9jb21tYW5kKGNvbnN0IF9fdTggKiBvdXRfZGF0YSwgaW50IG91dF9jb3VudCwKLQkJICAgICAgX191OCAqIGluX2RhdGEsIGludCBpbl9jb3VudCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKG91dF9jb3VudCA+IDApIHsKLQkJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQob3V0X2RhdGEsIG91dF9jb3VudCksKTsKLQl9Ci0JLyogd2lsbCB0YWtlIDI0IC0gMzAgdXNlYyBmb3IgZmRjX3NlbnNlX2RyaXZlX3N0YXR1cyBhbmQKLQkgKiBmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cyBjb21tYW5kcy4KLQkgKiAgICAzNSBmYWlscyBzb21ldGltZXMgKDUvOS85MyBTSkwpCi0JICogT24gYSBsb2FkZWQgc3lzdGVtIGl0IGluY2lkZW50YWxseSB0YWtlcyBsb25nZXIgdGhhbgotCSAqIHRoaXMgZm9yIHRoZSBmZGMgdG8gZ2V0IHJlYWR5ICEgPz8/Pz8/IFdIWSA/Pz8/Pz8KLQkgKiBTbyB1bnRpbCB3ZSBrbm93IHdoYXQncyBnb2luZyBvbiB1c2UgYSB2ZXJ5IGxvbmcgdGltZW91dC4KLQkgKi8KLQlUUkFDRV9DQVRDSChmZGNfcmVhZHlfb3V0X3dhaXQoNTAwIC8qIHVzZWMgKi8pLCk7Ci0JaWYgKGluX2NvdW50ID4gMCkgewotCQlUUkFDRV9DQVRDSChmZGNfcmVzdWx0KGluX2RhdGEsIGluX2NvdW50KSwKLQkJCSAgICBUUkFDRShmdF90X2VyciwgInJlc3VsdCBwaGFzZSBhYm9ydGVkIikpOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgICAgV2FpdCBmb3IgRkRDIGludGVycnVwdCB3aXRoIHRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykuCi0gKiAgICAgIFNpZ25hbHMgYXJlIGJsb2NrZWQgc28gdGhlIHdhaXQgd2lsbCBub3QgYmUgYWJvcnRlZC4KLSAqICAgICAgTm90ZTogaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgISAoMjMvMDUvOTMgU0pMKQotICovCi1pbnQgZmRjX2ludGVycnVwdF93YWl0KHVuc2lnbmVkIGludCB0aW1lKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7Ci0Jc2lnc2V0X3Qgb2xkX3NpZ21hc2s7CQotCXN0YXRpYyBpbnQgcmVzZXR0aW5nOwotCWxvbmcgdGltZW91dDsKLQotCVRSQUNFX0ZVTihmdF90X2ZkY19kbWEpOwotCi0gCWlmICh3YWl0cXVldWVfYWN0aXZlKCZmdGFwZV93YWl0X2ludHIpKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiZXJyb3I6IG5lc3RlZCBjYWxsIik7Ci0JfQotCS8qIHRpbWVvdXQgdGltZSB3aWxsIGJlIHVwIHRvIFVTUFQgbWljcm9zZWNvbmRzIHRvbyBsb25nICEgKi8KLQl0aW1lb3V0ID0gKDEwMDAgKiB0aW1lICsgRlRfVVNQVCAtIDEpIC8gRlRfVVNQVDsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKLQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZmdGFwZV93YWl0X2ludHIsICZ3YWl0KTsKLQl3aGlsZSAoIWZ0X2ludGVycnVwdF9zZWVuICYmIHRpbWVvdXQpCi0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Ci0KLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQotCXJlbW92ZV93YWl0X3F1ZXVlKCZmdGFwZV93YWl0X2ludHIsICZ3YWl0KTsKLQkvKiAgdGhlIGZvbGxvd2luZyBJUyBuZWNlc3NhcnkuIFRydWU6IGFzIHdlbGwKLQkgKiAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCkgYXMgdGhlIHNjaGVkdWxlKCkgc2V0IFRBU0tfUlVOTklORwotCSAqICB3aGVuIHRoZXkgd2FrZXVwIGEgdGFzaywgQlVUOiBpdCBtYXkgdmVyeSB3ZWxsIGJlIHRoYXQKLQkgKiAgZnRfaW50ZXJydXB0X3NlZW4gaXMgYWxyZWFkeSBzZXQgdG8gMSB3aGVuIHdlIGVudGVyIGhlcmUKLQkgKiAgaW4gd2hpY2ggY2FzZSBzY2hlZHVsZSgpIGdldHMgbmV2ZXIgY2FsbGVkLCBhbmQKLQkgKiAgVEFTS19SVU5OSU5HIG5ldmVyIHNldC4gVGhpcyBoYXMgdGhlIGZ1bm55IGVmZmVjdCB0aGF0IHdlCi0JICogIGV4ZWN1dGUgYWxsIHRoZSBjb2RlIHVudGlsIHdlIGxlYXZlIGtlcm5lbCBzcGFjZSwgYnV0IHRoZW4KLQkgKiAgdGhlIHRhc2sgaXMgc3RvcHBlZCAoYSB0YXNrIENBTk5PVCBiZSBwcmVlbXB0ZWQgd2hpbGUgaW4KLQkgKiAga2VybmVsIG1vZGUuIFNlbmRpbmcgYSBwYWlyIG9mIFNJR1NUT1AvU0lHQ09OVCB0byB0aGUKLQkgKiAgdGFza3Mgd2FrZXMgaXQgdXAgYWdhaW4uIEZ1bm55ISA6LSkKLQkgKi8KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgCi0JaWYgKGZ0X2ludGVycnVwdF9zZWVuKSB7IC8qIHdva2VuIHVwIGJ5IGludGVycnVwdCAqLwotCQlmdF9pbnRlcnJ1cHRfc2VlbiA9IDA7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JLyogIE9yaWdpbmFsIGNvbW1lbnQ6Ci0JICogIEluIGZpcnN0IGluc3RhbmNlLCBuZXh0IHN0YXRlbWVudCBzZWVtcyB1bm5lY2Vzc2FyeSBzaW5jZQotCSAqICBpdCB3aWxsIGJlIGNsZWFyZWQgaW4gZmRjX2NvbW1hbmQuIEhvd2V2ZXIsIGEgc21hbGwgcGFydCBvZgotCSAqICB0aGUgc29mdHdhcmUgc2VlbXMgdG8gcmVseSBvbiB0aGlzIGJlaW5nIGNsZWFyZWQgaGVyZQotCSAqICAoZnRhcGVfY2xvc2UgbWlnaHQgZmFpbCkgc28gc3RpY2sgdG8gaXQgdW50aWwgdGhpbmdzIGdldCBmaXhlZCAhCi0JICovCi0JLyogIE15IGRlZXBseSBzb3VnaHQgb2Yga25vd2xlZGdlOgotCSAqICBCZWhvbGQgTk8hIEl0IGlzIG9idmlvdXMuIGZkY19yZXNldCgpIGRvZXNuJ3QgY2FsbCBmZGNfY29tbWFuZCgpCi0JICogIGJ1dCBuZXZlcnRoZWxlc3MgdXNlcyBmZGNfaW50ZXJydXB0X3dhaXQoKS4gT0YgQ09VUlNFIHRoaXMgbmVlZHMgdG8KLQkgKiAgYmUgcmVzZXQgaGVyZS4KLQkgKi8KLQlmdF9pbnRlcnJ1cHRfc2VlbiA9IDA7CS8qIGNsZWFyIGZvciBuZXh0IGNhbGwgKi8KLQlpZiAoIXJlc2V0dGluZykgewotCQlyZXNldHRpbmcgPSAxOwkvKiBicmVhayBpbmZpbml0ZSByZWN1cnNpb24gaWYgcmVzZXQgZmFpbHMgKi8KLQkJVFJBQ0UoZnRfdF9hbnksICJjbGVhbnVwIHJlc2V0Iik7Ci0JCWZkY19yZXNldCgpOwotCQlyZXNldHRpbmcgPSAwOwotCX0KLQlUUkFDRV9FWElUIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgPyAtRUlOVFIgOiAtRVRJTUU7Ci19Ci0KLS8qICAgICAgU3RhcnQvc3RvcCBkcml2ZSBtb3Rvci4gRW5hYmxlIERNQSBtb2RlLgotICovCi12b2lkIGZkY19tb3RvcihpbnQgbW90b3IpCi17Ci0JaW50IHVuaXQgPSBmdF9kcml2ZV9zZWw7Ci0JaW50IGRhdGEgPSB1bml0IHwgRkRDX1JFU0VUX05PVCB8IEZEQ19ETUFfTU9ERTsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JZnRhcGVfbW90b3IgPSBtb3RvcjsKLQlpZiAoZnRhcGVfbW90b3IpIHsKLQkJZGF0YSB8PSBGRENfTU9UT1JfMCA8PCB1bml0OwotCQlUUkFDRShmdF90X25vaXNlLCAidHVybmluZyBtb3RvciAlZCBvbiIsIHVuaXQpOwotCX0gZWxzZSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0dXJuaW5nIG1vdG9yICVkIG9mZiIsIHVuaXQpOwotCX0KLQlpZiAoZnRfbWFjaDIpIHsKLQkJb3V0Yl9wKGRhdGEsIGZkYy5kb3IyKTsKLQl9IGVsc2UgewotCQlvdXRiX3AoZGF0YSwgZmRjLmRvcik7Ci0JfQotCWZ0YXBlX3NsZWVwKDEwICogRlRfTUlMTElTRUNPTkQpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZkY191cGRhdGVfZHNyKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCVRSQUNFKGZ0X3RfZmxvdywgInJhdGUgPSAlZCBLYnBzLCBwcmVjb21wID0gJWQgbnMiLAotCSAgICAgIGZkY19kYXRhX3JhdGUsIGZkY19wcmVjb21wKTsKLQlpZiAoZmRjLnR5cGUgPj0gaTgyMDc3KSB7Ci0JCW91dGJfcCgoZmRjX3JhdGVfY29kZSAmIDB4MDMpIHwgZmRjX3ByZWNfY29kZSwgZmRjLmRzcik7Ci0JfSBlbHNlIHsKLQkJb3V0Yl9wKGZkY19yYXRlX2NvZGUgJiAweDAzLCBmZGMuY2NyKTsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotdm9pZCBmZGNfc2V0X3dyaXRlX3ByZWNvbXAoaW50IHByZWNvbXApCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJOZXcgcHJlY29tcDogJWQgbnNlYyIsIHByZWNvbXApOwotCWZkY19wcmVjb21wID0gcHJlY29tcDsKLQkvKiAgd3JpdGUgcHJlY29tcGVuc2F0aW9uIGNhbiBiZSBzZXQgaW4gbXVsdGlwbGVzIG9mIDQxLjY3IG5zZWMuCi0JICogIHJvdW5kIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgYW5kIGNvbnZlcnQgaXQKLQkgKiAgaW50byBhIGZkYyBzZXR0aW5nLiBOb3RlIHRoYXQgMCBtZWFucyBkZWZhdWx0IHRvIHRoZSBmZGMsCi0JICogIDcgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoYXQuCi0JICovCi0JZmRjX3ByZWNfY29kZSA9ICgoZmRjX3ByZWNvbXAgKyAyMSkgLyA0MikgPDwgMjsKLQlpZiAoZmRjX3ByZWNfY29kZSA9PSAwIHx8IGZkY19wcmVjX2NvZGUgPiAoNiA8PCAyKSkgewotCQlmZGNfcHJlY19jb2RlID0gNyA8PCAyOwotCX0KLQlmZGNfdXBkYXRlX2RzcigpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qICBSZXByb2dyYW0gdGhlIDgyMDc4IHJlZ2lzdGVycyB0byB1c2UgRGF0YSBSYXRlIFRhYmxlIDEgb24gYWxsIGRyaXZlcy4KLSAqLwotc3RhdGljIHZvaWQgZmRjX3NldF9kcml2ZV9zcGVjcyh2b2lkKQotewotCV9fdTggY21kW10gPSB7IEZEQ19EUklWRV9TUEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMwfTsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlUUkFDRShmdF90X2Zsb3csICJTZXR0aW5nIG9mIGRyaXZlIHNwZWNzIGNhbGxlZCIpOwotCWlmIChmZGMudHlwZSA+PSBpODIwNzhfMSkgewotCQljbWRbMV0gPSAoMCA8PCA1KSB8ICgyIDw8IDIpOwotCQljbWRbMl0gPSAoMSA8PCA1KSB8ICgyIDw8IDIpOwotCQljbWRbM10gPSAoMiA8PCA1KSB8ICgyIDw8IDIpOwotCQljbWRbNF0gPSAoMyA8PCA1KSB8ICgyIDw8IDIpOwotCQlyZXN1bHQgPSBmZGNfY29tbWFuZChjbWQsIE5SX0lURU1TKGNtZCkpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJVFJBQ0UoZnRfdF9lcnIsICJTZXR0aW5nIG9mIGRyaXZlIHNwZWNzIGZhaWxlZCIpOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qIFNlbGVjdCBjbG9jayBmb3IgZmRjLCBtdXN0IGNvcnJlc3BvbmQgd2l0aCB0YXBlIGRyaXZlIHNldHRpbmcgIQotICogVGhpcyBhbHNvIGluZmx1ZW5jZXMgdGhlIGZkYyB0aW1pbmcgc28gd2UgbXVzdCBhZGp1c3Qgc29tZSB2YWx1ZXMuCi0gKi8KLWludCBmZGNfc2V0X2RhdGFfcmF0ZShpbnQgcmF0ZSkKLXsKLQlpbnQgYmFkX3JhdGUgPSAwOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiBTZWxlY3QgY2xvY2sgZm9yIGZkYywgbXVzdCBjb3JyZXNwb25kIHdpdGggdGFwZSBkcml2ZSBzZXR0aW5nICEKLQkgKiBUaGlzIGFsc28gaW5mbHVlbmNlcyB0aGUgZmRjIHRpbWluZyBzbyB3ZSBtdXN0IGFkanVzdCBzb21lIHZhbHVlcy4KLQkgKi8KLQlUUkFDRShmdF90X2ZkY19kbWEsICJuZXcgcmF0ZSA9ICVkIiwgcmF0ZSk7Ci0Jc3dpdGNoIChyYXRlKSB7Ci0JY2FzZSAyNTA6Ci0JCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzI1MDsKLQkJYnJlYWs7Ci0JY2FzZSA1MDA6Ci0JCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzUwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxMDAwOgotCQlpZiAoZmRjLnR5cGUgPCBpODIwNzcpIHsKLQkJCWJhZF9yYXRlID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCQkJZmRjX3JhdGVfY29kZSA9IGZkY19kYXRhX3JhdGVfMTAwMDsKLQkJfQotCQlicmVhazsKLQljYXNlIDIwMDA6Ci0JCWlmIChmZGMudHlwZSA8IGk4MjA3OF8xKSB7Ci0JCQliYWRfcmF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzIwMDA7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYmFkX3JhdGUgPSAxOwotICAgICAgICB9Ci0JaWYgKGJhZF9yYXRlKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sCi0JCQkgICAgZnRfdF9mZGNfZG1hLCAiJWQgaXMgbm90IGEgdmFsaWQgZGF0YSByYXRlIiwgcmF0ZSk7Ci0JfQotCWZkY19kYXRhX3JhdGUgPSByYXRlOwotCWZkY191cGRhdGVfZHNyKCk7Ci0JZmRjX3NldF9zZWVrX3JhdGUoZmRjX3NlZWtfcmF0ZSk7ICAvKiBjbG9jayBjaGFuZ2VkISAqLwotCWZ0YXBlX3VkZWxheSgxMDAwKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICBrZWVwIHRoZSB1bml0IHNlbGVjdCBpZiBrZWVwX3NlbGVjdCBpcyAhPSAwLAotICovCi1zdGF0aWMgdm9pZCBmZGNfZG9yX3Jlc2V0KGludCBrZWVwX3NlbGVjdCkKLXsKLQlfX3U4IGZkY19jdGwgPSBmdF9kcml2ZV9zZWw7Ci0KLQlpZiAoa2VlcF9zZWxlY3QgIT0gMCkgewotCQlmZGNfY3RsIHw9IEZEQ19ETUFfTU9ERTsKLQkJaWYgKGZ0YXBlX21vdG9yKSB7Ci0JCQlmZGNfY3RsIHw9IEZEQ19NT1RPUl8wIDw8IGZ0X2RyaXZlX3NlbDsKLQkJfQotCX0KLQlmdGFwZV91ZGVsYXkoMTApOyAvKiA/Pz8gYnV0IHNlZW1zIHRvIGJlIG5lY2Vzc2FyeSAqLwotCWlmIChmdF9tYWNoMikgewotCQlvdXRiX3AoZmRjX2N0bCAmIDB4MGYsIGZkYy5kb3IpOwotCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcjIpOwotCX0gZWxzZSB7Ci0JCW91dGJfcChmZGNfY3RsLCBmZGMuZG9yKTsKLQl9Ci0JZmRjX3VzZWNfd2FpdCgxMCk7IC8qIGRlbGF5ID49IDE0IGZkYyBjbG9ja3MgKi8KLQlpZiAoa2VlcF9zZWxlY3QgPT0gMCkgewotCQlmZGNfY3RsID0gMDsKLQl9Ci0JZmRjX2N0bCB8PSBGRENfUkVTRVRfTk9UOwotCWlmIChmdF9tYWNoMikgewotCQlvdXRiX3AoZmRjX2N0bCAmIDB4MGYsIGZkYy5kb3IpOwotCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcjIpOwotCX0gZWxzZSB7Ci0JCW91dGJfcChmZGNfY3RsLCBmZGMuZG9yKTsKLQl9Ci19Ci0KLS8qICAgICAgUmVzZXQgdGhlIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIuIExlYXZlIHRoZSBmdGFwZV91bml0IHNlbGVjdGVkLgotICovCi12b2lkIGZkY19yZXNldCh2b2lkKQotewotCWludCBzdDA7Ci0JaW50IGk7Ci0JaW50IGR1bW15OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOwotCi0JZmRjX2Rvcl9yZXNldCgxKTsgLyoga2VlcCB1bml0IHNlbGVjdGVkICovCi0KLQlmZGNfbW9kZSA9IGZkY19pZGxlOwotCi0JLyogIG1heWJlIHRoZSBzcGluX2xvY2tfaXJxKiBwYWlyIGlzIG5vdCBuZWNlc3NhcnksIEJVVDoKLQkgKiAgdGhlIGZvbGxvd2luZyBsaW5lIE1VU1QgYmUgaGVyZS4gT3RoZXJ3aXNlIGZkY19pbnRlcnJ1cHRfd2FpdCgpCi0JICogIHdvbid0IHdhaXQuIE5vdGUgdGhhdCBmZGNfcmVzZXQoKSBpcyBjYWxsZWQgZnJvbSAKLQkgKiAgZnRhcGVfZHVtYl9zdG9wKCkgd2hlbiB0aGUgZmRjIGlzIGJ1c3kgdHJhbnNmZXJyaW5nIGRhdGEuIEluIHRoaXMKLQkgKiAgY2FzZSBmZGNfaXNyKCkgTU9TVCBQUk9CQUJMWSBzZXRzIGZ0X2ludGVycnVwdF9zZWVuLCBhbmQgdHJpZXMKLQkgKiAgdG8gZ2V0IHRoZSByZXN1bHQgYnl0ZXMgZnJvbSB0aGUgZmRjIGV0Yy4gQ0xBU0guCi0JICovCi0JZnRfaW50ZXJydXB0X3NlZW4gPSAwOwotCQotCS8qICBQcm9ncmFtIGRhdGEgcmF0ZQotCSAqLwotCWZkY191cGRhdGVfZHNyKCk7ICAgICAgICAgICAgICAgLyogcmVzdG9yZSBkYXRhIHJhdGUgYW5kIHByZWNvbXAgKi8KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICoJV2FpdCBmb3IgZmlyc3QgcG9sbGluZyBjeWNsZSB0byBjb21wbGV0ZQotCSAqLwotCWlmIChmZGNfaW50ZXJydXB0X3dhaXQoMSAqIEZUX1NFQ09ORCkgPCAwKSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAibm8gZHJpdmUgcG9sbGluZyBpbnRlcnJ1cHQhIik7Ci0JfSBlbHNlIHsJLyogY2xlYXIgYWxsIGRpc2stY2hhbmdlZCBzdGF0dXNlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0JCQlpZihmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cygmc3QwLCAmZHVtbXkpICE9IDApIHsKLQkJCQlUUkFDRShmdF90X2VyciwgInNlbnNlIGZhaWxlZCBmb3IgJWQiLCBpKTsKLQkJCX0KLQkJCWlmIChpID09IGZ0X2RyaXZlX3NlbCkgewotCQkJCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSBkdW1teTsKLQkJCX0KLQkJfQotCQlUUkFDRShmdF90X25vaXNlLCAiZHJpdmUgcG9sbGluZyBjb21wbGV0ZWQiKTsKLQl9Ci0JLyoKLSAgICAgICAgICoJU1BFQ0lGWSBDT01NQU5ECi0JICovCi0JZmRjX3NldF9zZWVrX3JhdGUoZmRjX3NlZWtfcmF0ZSk7Ci0JLyoKLQkgKglEUklWRSBTUEVDSUZJQ0FUSU9OIENPTU1BTkQgKGlmIGZkYyB0eXBlIGtub3duKQotCSAqLwotCWlmIChmZGMudHlwZSA+PSBpODIwNzhfMSkgewotCQlmZGNfc2V0X2RyaXZlX3NwZWNzKCk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLSNpZiAhZGVmaW5lZChDTEtfNDhNSFopCi0jIGRlZmluZSBDTEtfNDhNSFogMQotI2VuZGlmCi0KLS8qICBXaGVuIHdlJ3JlIGRvbmUsIHB1dCB0aGUgZmRjIGludG8gcmVzZXQgbW9kZSBzbyB0aGF0IHRoZSByZWd1bGFyCi0gKiAgZmxvcHB5IGRpc2sgZHJpdmVyIHdpbGwgZmlndXJlIG91dCB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZyBhbmQKLSAqICBpbml0aWFsaXplIHRoZSBjb250cm9sbGVyIHRoZSB3YXkgaXQgd2FudHMuCi0gKi8KLXZvaWQgZmRjX2Rpc2FibGUodm9pZCkKLXsKLQlfX3U4IGNtZDFbXSA9IHtGRENfQ09ORklHVVJFLCAweDAwLCAweDAwLCAweDAwfTsKLQlfX3U4IGNtZDJbXSA9IHtGRENfTE9DS307Ci0JX191OCBjbWQzW10gPSB7RkRDX1VOTE9DS307Ci0JX191OCBzdGF0WzFdOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKCFmZGNfZmlmb19sb2NrZWQpIHsKLQkJZmRjX3Jlc2V0KCk7Ci0JCVRSQUNFX0VYSVQ7Ci0JfQotCWlmIChmZGNfaXNzdWVfY29tbWFuZChjbWQzLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSAhPSAweDAwKSB7Ci0JCWZkY19kb3JfcmVzZXQoMCk7Ci0JCVRSQUNFX0FCT1JUKC8qKi8sIGZ0X3RfYnVnLCAKLQkJImNvdWxkbid0IHVubG9jayBmaWZvLCBjb25maWd1cmF0aW9uIHJlbWFpbnMgY2hhbmdlZCIpOwotCX0KLQlmZGNfZmlmb19sb2NrZWQgPSAwOwotCWlmIChDTEtfNDhNSFogJiYgZmRjLnR5cGUgPj0gaTgyMDc4KSB7Ci0JCWNtZDFbMF0gfD0gRkRDX0NMSzQ4X0JJVDsKLQl9Ci0JY21kMVsyXSA9ICgoZmRjX2ZpZm9fc3RhdGUpID8gMCA6IDB4MjApICsgKGZkY19maWZvX3RociAtIDEpOwotCWlmIChmZGNfY29tbWFuZChjbWQxLCBOUl9JVEVNUyhjbWQxKSkgPCAwKSB7Ci0JCWZkY19kb3JfcmVzZXQoMCk7Ci0JCVRSQUNFX0FCT1JUKC8qKi8sIGZ0X3RfYnVnLAotCQkiY291bGRuJ3QgcmVjb25maWd1cmUgZmlmbyB0byBvbGQgc3RhdGUiKTsKLQl9Ci0JaWYgKGZkY19sb2NrX3N0YXRlICYmCi0JICAgIGZkY19pc3N1ZV9jb21tYW5kKGNtZDIsIDEsIHN0YXQsIDEpIDwgMCkgewotCQlmZGNfZG9yX3Jlc2V0KDApOwotCQlUUkFDRV9BQk9SVCgvKiovLCBmdF90X2J1ZywgImNvdWxkbid0IGxvY2sgb2xkIHN0YXRlIGFnYWluIik7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaWZvIHJlc3RvcmVkOiAlc2FibGVkLCB0aHIuICVkLCAlc2xvY2tlZCIsCi0JICAgICAgZmRjX2ZpZm9fc3RhdGUgPyAiZW4iIDogImRpcyIsCi0JICAgICAgZmRjX2ZpZm9fdGhyLCAoZmRjX2xvY2tfc3RhdGUpID8gIiIgOiAibm90ICIpOwotCWZkY19kb3JfcmVzZXQoMCk7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotLyogICAgICBTcGVjaWZ5IEZEQyBzZWVrLXJhdGUgKG1pbGxpc2Vjb25kcykKLSAqLwotc3RhdGljIGludCBmZGNfc2V0X3NlZWtfcmF0ZShpbnQgc2Vla19yYXRlKQotewotCS8qIHNldCBzdGVwIHJhdGUsIGRtYSBtb2RlLCBhbmQgbWluaW1hbCBoZWFkIGxvYWQgYW5kIHVubG9hZCB0aW1lcwotCSAqLwotCV9fdTggaW5bM10gPSB7IEZEQ19TUEVDSUZZLCAxLCAoMSA8PCAxKX07Ci0gCi0JZmRjX3NlZWtfcmF0ZSA9IHNlZWtfcmF0ZTsKLQlpblsxXSB8PSAoMTYgLSAoZmRjX2RhdGFfcmF0ZSAqIGZkY19zZWVrX3JhdGUpIC8gNTAwKSA8PCA0OwotCi0JcmV0dXJuIGZkY19jb21tYW5kKGluLCAzKTsKLX0KLQotLyogICAgICBTZW5zZSBkcml2ZSBzdGF0dXM6IGdldCB1bml0J3MgZHJpdmUgc3RhdHVzIChTVDMpCi0gKi8KLWludCBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKGludCAqc3QzKQotewotCV9fdTggb3V0WzJdOwotCV9fdTggaW5bMV07Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCW91dFswXSA9IEZEQ19TRU5TRUQ7Ci0Jb3V0WzFdID0gZnRfZHJpdmVfc2VsOwotCVRSQUNFX0NBVENIKGZkY19pc3N1ZV9jb21tYW5kKG91dCwgMiwgaW4sIDEpLCk7Ci0JKnN0MyA9IGluWzBdOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogICAgICBTZW5zZSBJbnRlcnJ1cHQgU3RhdHVzIGNvbW1hbmQ6Ci0gKiAgICAgIHNob3VsZCBiZSBpc3N1ZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHNlZWsuCi0gKiAgICAgIGdldCBTVDAgYW5kIGN1cnJlbnQgY3lsaW5kZXIuCi0gKi8KLWludCBmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cyhpbnQgKnN0MCwgaW50ICpjdXJyZW50X2N5bGluZGVyKQotewotCV9fdTggb3V0WzFdOwotCV9fdTggaW5bMl07Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCW91dFswXSA9IEZEQ19TRU5TRUk7Ci0JVFJBQ0VfQ0FUQ0goZmRjX2lzc3VlX2NvbW1hbmQob3V0LCAxLCBpbiwgMiksKTsKLQkqc3QwID0gaW5bMF07Ci0JKmN1cnJlbnRfY3lsaW5kZXIgPSBpblsxXTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgICAgc3RlcCB0byB0cmFjawotICovCi1pbnQgZmRjX3NlZWsoaW50IHRyYWNrKQotewotCV9fdTggb3V0WzNdOwotCWludCBzdDAsIHBjbjsKLSNpZmRlZiBURVNUSU5HCi0JdW5zaWduZWQgaW50IHRpbWU7Ci0jZW5kaWYKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0Jb3V0WzBdID0gRkRDX1NFRUs7Ci0Jb3V0WzFdID0gZnRfZHJpdmVfc2VsOwotCW91dFsyXSA9IHRyYWNrOwotI2lmZGVmIFRFU1RJTkcKLQl0aW1lID0gZnRhcGVfdGltZXN0YW1wKCk7Ci0jZW5kaWYKLQkvKiAgV2UgcmVhbGx5IG5lZWQgdGhpcyBjb21tYW5kIHRvIHdvcmsgIQotCSAqLwotCWZ0X3NlZWtfY29tcGxldGVkID0gMDsKLQlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChvdXQsIDMpLAotCQkgICAgZmRjX3Jlc2V0KCk7Ci0JCSAgICBUUkFDRShmdF90X25vaXNlLCAiZGVzdGluYXRpb24gd2FzOiAlZCwgcmVzZXR0aW5nIEZEQy4uLiIsCi0JCQkgIHRyYWNrKSk7Ci0JLyogICAgSGFuZGxlIGludGVycnVwdHMgdW50aWwgZnRfc2Vla19jb21wbGV0ZWQgb3IgdGltZW91dC4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCVRSQUNFX0NBVENIKGZkY19pbnRlcnJ1cHRfd2FpdCgyICogRlRfU0VDT05EKSwpOwotCQlpZiAoZnRfc2Vla19jb21wbGV0ZWQpIHsKLQkJCVRSQUNFX0NBVENIKGZkY19zZW5zZV9pbnRlcnJ1cHRfc3RhdHVzKCZzdDAsICZwY24pLCk7Ci0JCQlpZiAoKHN0MCAmIFNUMF9TRUVLX0VORCkgPT0gMCkgewotCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJCSAgICAgICJubyBzZWVrLWVuZCBhZnRlciBzZWVrIGNvbXBsZXRpb24gIT8/Iik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLSNpZmRlZiBURVNUSU5HCi0JdGltZSA9IGZ0YXBlX3RpbWVkaWZmKHRpbWUsIGZ0YXBlX3RpbWVzdGFtcCgpKSAvIGFicyh0cmFjayAtIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIpOwotCWlmICgodGltZSA8IDkwMCB8fCB0aW1lID4gMzEwMCkgJiYgYWJzKHRyYWNrIC0gZnRhcGVfY3VycmVudF9jeWxpbmRlcikgPiA1KSB7Ci0JCVRSQUNFKGZ0X3Rfd2FybiwgIldyb25nIEZEQyBTVEVQIGludGVydmFsOiAlZCB1c2VjcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLCB0cmFjayAtIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIpOwotCX0KLSNlbmRpZgotCS8qICAgIFZlcmlmeSB3aGV0aGVyIHdlIGlzc3VlZCB0aGUgcmlnaHQgdGFwZSBjb21tYW5kLgotCSAqLwotCS8qIFZlcmlmeSB0aGF0IHdlIHNlZWsgdG8gdGhlIHByb3BlciB0cmFjay4gKi8KLQlpZiAocGNuICE9IHRyYWNrKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiYmFkIHNlZWsuLiIpOwotCX0KLQlmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gdHJhY2s7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IHBlcnBlbmRfbW9kZTsgLyogc2V0IGlmIGZkYyBpcyBpbiBwZXJwZW5kaWN1bGFyIG1vZGUgKi8KLQotc3RhdGljIGludCBwZXJwZW5kX29mZih2b2lkKQotewotIAlfX3U4IHBlcnBlbmRbXSA9IHtGRENfUEVSUEVORCwgMHgwMH07Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQlpZiAocGVycGVuZF9tb2RlKSB7Ci0JCS8qIFR1cm4gb2ZmIHBlcnBlbmRpY3VsYXIgbW9kZSAqLwotCQlwZXJwZW5kWzFdID0gMHg4MDsKLQkJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQocGVycGVuZCwgMiksCi0JCQkgICAgVFJBQ0UoZnRfdF9lcnIsIlBlcnBlbmRpY3VsYXIgbW9kZSBleGl0IGZhaWxlZCEiKSk7Ci0JCXBlcnBlbmRfbW9kZSA9IDA7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfcGVycGVuZChpbnQgc2VnbWVudF9pZCkKLXsKLSAJX191OCBwZXJwZW5kW10gPSB7RkRDX1BFUlBFTkQsIDB4MDB9OwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiBXaGVuIHdyaXRpbmcgUUlDLTMwMjAgdGFwZXMsIHR1cm4gb24gcGVycGVuZGljdWxhciBtb2RlCi0JICogaWYgdGFwZSBpcyBtb3ZpbmcgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKGV2ZW4gdHJhY2tzKS4KLQkgKi8KLQlpZiAoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDIwICYmCi0JICAgICgoc2VnbWVudF9pZCAvIGZ0X3NlZ21lbnRzX3Blcl90cmFjaykgJiAxKSA9PSAwKSB7Ci0vKiAgRklYTUU6IHNvbWUgaTgyMDc3IHNlZW0gdG8gc3VwcG9ydCBwZXJwZW5kaWN1bGFyIG1vZGUgYXMKLSAqICB3ZWxsLiAKLSAqLwotI2lmIDAKLQkJaWYgKGZkYy50eXBlIDwgaTgyMDc3QUEpIHt9Ci0jZWxzZQotCQlpZiAoZmRjLnR5cGUgPCBpODIwNzcgJiYgZnRfZGF0YV9yYXRlIDwgMTAwMCkgewotI2VuZGlmCi0JCQkvKiAgZmRjIGRvZXMgbm90IHN1cHBvcnQgcGVycGVuZGljdWxhciBtb2RlOiBjb21wbGFpbiAKLQkJCSAqLwotCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkJICAgICJZb3VyIEZEQyBkb2VzIG5vdCBzdXBwb3J0IFFJQy0zMDIwLiIpOwotCQl9Ci0JCXBlcnBlbmRbMV0gPSAweDAzIC8qIDB4ODMgKyAoMHg0IDw8IGZ0X2RyaXZlX3NlbCkgKi8gOwotCQlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChwZXJwZW5kLCAyKSwKLQkJCSAgIFRSQUNFKGZ0X3RfZXJyLCJQZXJwZW5kaWN1bGFyIG1vZGUgZW50cnkgZmFpbGVkISIpKTsKLQkJVFJBQ0UoZnRfdF9mbG93LCAiUGVycGVuZGljdWxhciBtb2RlIHNldCIpOwotCQlwZXJwZW5kX21vZGUgPSAxOwotCQlUUkFDRV9FWElUIDA7Ci0JfQotCVRSQUNFX0VYSVQgcGVycGVuZF9vZmYoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZkY19zZXR1cF9kbWEoY2hhciBtb2RlLAotCQkJCSB2b2xhdGlsZSB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JLyogUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIuCi0JICovCi0JZGlzYWJsZV9kbWEoZmRjLmRtYSk7Ci0JY2xlYXJfZG1hX2ZmKGZkYy5kbWEpOwotCXNldF9kbWFfbW9kZShmZGMuZG1hLCBtb2RlKTsKLQlzZXRfZG1hX2FkZHIoZmRjLmRtYSwgdmlydF90b19idXMoKHZvaWQqKWFkZHIpKTsKLQlzZXRfZG1hX2NvdW50KGZkYy5kbWEsIGNvdW50KTsKLQllbmFibGVfZG1hKGZkYy5kbWEpOwotfQotCi0vKiAgU2V0dXAgZmRjIGFuZCBkbWEgZm9yIGZvcm1hdHRpbmcgdGhlIG5leHQgc2VnbWVudAotICovCi1pbnQgZmRjX3NldHVwX2Zvcm1hdHRpbmcoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlfX3U4IG91dFs2XSA9IHsKLQkJRkRDX0ZPUk1BVCwgMHgwMCwgMywgNCAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQsIDB4MDAsIDB4NmIKLQl9OwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0JCi0JVFJBQ0VfQ0FUQ0goaGFuZGxlX3BlcnBlbmQoYnVmZi0+c2VnbWVudF9pZCksKTsKLQkvKiBQcm9ncmFtIHRoZSBETUEgY29udHJvbGxlci4KLQkgKi8KLSAgICAgICAgVFJBQ0UoZnRfdF9mZGNfZG1hLAotCSAgICAgICJwaHlzLiBhZGRyLiA9ICVseCIsIHZpcnRfdG9fYnVzKCh2b2lkKikgYnVmZi0+cHRyKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JZmRjX3NldHVwX2RtYShETUFfTU9ERV9XUklURSwgYnVmZi0+cHRyLCBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICogNCk7Ci0JLyogSXNzdWUgRkRDIGNvbW1hbmQgdG8gc3RhcnQgcmVhZGluZy93cml0aW5nLgotCSAqLwotCW91dFsxXSA9IGZ0X2RyaXZlX3NlbDsKLQlvdXRbNF0gPSBidWZmLT5nYXAzOwotCVRSQUNFX0NBVENIKGZkY19zZXR1cF9lcnJvciA9IGZkY19jb21tYW5kKG91dCwgc2l6ZW9mKG91dCkpLAotCQkgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7IGZkY19tb2RlID0gZmRjX2lkbGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0KLS8qICAgICAgU2V0dXAgRmxvcHB5IERpc2sgQ29udHJvbGxlciBhbmQgRE1BIHRvIHJlYWQgb3Igd3JpdGUgdGhlIG5leHQgY2x1c3RlcgotICogICAgICBvZiBnb29kIHNlY3RvcnMgZnJvbSBvciB0byB0aGUgY3VycmVudCBzZWdtZW50LgotICovCi1pbnQgZmRjX3NldHVwX3JlYWRfd3JpdGUoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYsIF9fdTggb3BlcmF0aW9uKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX191OCBvdXRbOV07Ci0JaW50IGRtYV9tb2RlOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlzd2l0Y2gob3BlcmF0aW9uKSB7Ci0JY2FzZSBGRENfVkVSSUZZOgotCQlpZiAoZmRjLnR5cGUgPCBpODIwNzcpIHsKLQkJCW9wZXJhdGlvbiA9IEZEQ19SRUFEOwotCQl9Ci0JY2FzZSBGRENfUkVBRDoKLQljYXNlIEZEQ19SRUFEX0RFTEVURUQ6Ci0JCWRtYV9tb2RlID0gRE1BX01PREVfUkVBRDsKLQkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAieGZlciAlZCBzZWN0b3JzIHRvIDB4JXAiLAotCQkgICAgICBidWZmLT5zZWN0b3JfY291bnQsIGJ1ZmYtPnB0cik7Ci0JCVRSQUNFX0NBVENIKHBlcnBlbmRfb2ZmKCksKTsKLQkJYnJlYWs7Ci0JY2FzZSBGRENfV1JJVEVfREVMRVRFRDoKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImRlbGV0aW5nIHNlZ21lbnQgJWQiLCBidWZmLT5zZWdtZW50X2lkKTsKLQljYXNlIEZEQ19XUklURToKLQkJZG1hX21vZGUgPSBETUFfTU9ERV9XUklURTsKLQkJLyogV2hlbiB3cml0aW5nIFFJQy0zMDIwIHRhcGVzLCB0dXJuIG9uIHBlcnBlbmRpY3VsYXIgbW9kZQotCQkgKiBpZiB0YXBlIGlzIG1vdmluZyBpbiBmb3J3YXJkIGRpcmVjdGlvbiAoZXZlbiB0cmFja3MpLgotCQkgKi8KLQkJVFJBQ0VfQ0FUQ0goaGFuZGxlX3BlcnBlbmQoYnVmZi0+c2VnbWVudF9pZCksKTsKLQkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAieGZlciAlZCBzZWN0b3JzIGZyb20gMHglcCIsCi0JCSAgICAgIGJ1ZmYtPnNlY3Rvcl9jb3VudCwgYnVmZi0+cHRyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJVFJBQ0VfQUJPUlQoLUVJTywKLQkJCSAgICBmdF90X2J1ZywgImJ1ZzogaW52YWxpZCBvcGVyYXRpb24gcGFyYW1ldGVyIik7Ci0JfQotCVRSQUNFKGZ0X3RfZmRjX2RtYSwgInBoeXMuIGFkZHIuID0gJWx4Iix2aXJ0X3RvX2J1cygodm9pZCopYnVmZi0+cHRyKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JaWYgKG9wZXJhdGlvbiAhPSBGRENfVkVSSUZZKSB7Ci0JCWZkY19zZXR1cF9kbWEoZG1hX21vZGUsIGJ1ZmYtPnB0ciwKLQkJCSAgICAgIEZUX1NFQ1RPUl9TSVpFICogYnVmZi0+c2VjdG9yX2NvdW50KTsKLQl9Ci0JLyogSXNzdWUgRkRDIGNvbW1hbmQgdG8gc3RhcnQgcmVhZGluZy93cml0aW5nLgotCSAqLwotCW91dFswXSA9IG9wZXJhdGlvbjsKLQlvdXRbMV0gPSBmdF9kcml2ZV9zZWw7Ci0Jb3V0WzJdID0gYnVmZi0+Y3lsOwotCW91dFszXSA9IGJ1ZmYtPmhlYWQ7Ci0Jb3V0WzRdID0gYnVmZi0+c2VjdCArIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7Ci0Jb3V0WzVdID0gMzsJCS8qIFNlY3RvciBzaXplIG9mIDFLLiAqLwotCW91dFs2XSA9IG91dFs0XSArIGJ1ZmYtPnNlY3Rvcl9jb3VudCAtIDE7CS8qIGxhc3Qgc2VjdG9yICovCi0Jb3V0WzddID0gMTA5OwkJLyogR2FwIGxlbmd0aC4gKi8KLQlvdXRbOF0gPSAweGZmOwkJLyogTm8gbGltaXQgdG8gdHJhbnNmZXIgc2l6ZS4gKi8KLQlUUkFDRShmdF90X2ZkY19kbWEsICJDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4LCBjbnQ6IDB4JTAyeCIsCi0JCW91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs2XSAtIG91dFs0XSArIDEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7Ci0JVFJBQ0VfQ0FUQ0goZmRjX3NldHVwX2Vycm9yID0gZmRjX2NvbW1hbmQob3V0LCA5KSxmZGNfbW9kZSA9IGZkY19pZGxlKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWludCBmZGNfZmlmb190aHJlc2hvbGQoX191OCB0aHJlc2hvbGQsCi0JCSAgICAgICBpbnQgKmZpZm9fc3RhdGUsIGludCAqbG9ja19zdGF0ZSwgaW50ICpmaWZvX3RocikKLXsKLQljb25zdCBfX3U4IGNtZDBbXSA9IHtGRENfRFVNUFJFR1N9OwotCV9fdTggY21kMVtdID0ge0ZEQ19DT05GSUdVUkUsIDAsICgweDBmICYgKHRocmVzaG9sZCAtIDEpKSwgMH07Ci0JY29uc3QgX191OCBjbWQyW10gPSB7RkRDX0xPQ0t9OwotCWNvbnN0IF9fdTggY21kM1tdID0ge0ZEQ19VTkxPQ0t9OwotCV9fdTggcmVnWzEwXTsKLQlfX3U4IHN0YXQ7Ci0JaW50IGk7Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKENMS180OE1IWiAmJiBmZGMudHlwZSA+PSBpODIwNzgpIHsKLQkJY21kMVswXSB8PSBGRENfQ0xLNDhfQklUOwotCX0KLQkvKiAgRHVtcCBmZGMgaW50ZXJuYWwgcmVnaXN0ZXJzIGZvciBleGFtaW5hdGlvbgotCSAqLwotCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKGNtZDAsIE5SX0lURU1TKGNtZDApKSwKLQkJICAgIFRSQUNFKGZ0X3Rfd2FybiwgImR1bXByZWcgY21kIGZhaWxlZCwgZmlmbyB1bmNoYW5nZWQiKSk7Ci0JLyogIE5vdyByZWFkIGZkYyBpbnRlcm5hbCByZWdpc3RlcnMgZnJvbSBmaWZvCi0JICovCi0JZm9yIChpID0gMDsgaSA8IChpbnQpTlJfSVRFTVMocmVnKTsgKytpKSB7Ci0JCWZkY19yZWFkKCZyZWdbaV0pOwotCQlUUkFDRShmdF90X2ZkY19kbWEsICJSZWdpc3RlciAlZCA9IDB4JTAyeCIsIGksIHJlZ1tpXSk7Ci0JfQotCWlmIChmaWZvX3N0YXRlICYmIGxvY2tfc3RhdGUgJiYgZmlmb190aHIpIHsKLQkJKmZpZm9fc3RhdGUgPSAocmVnWzhdICYgMHgyMCkgPT0gMDsKLQkJKmxvY2tfc3RhdGUgPSByZWdbN10gJiAweDgwOwotCQkqZmlmb190aHIgPSAxICsgKHJlZ1s4XSAmIDB4MGYpOwotCX0KLQlUUkFDRShmdF90X25vaXNlLAotCSAgICAgICJvcmlnaW5hbCBmaWZvIHN0YXRlOiAlc2FibGVkLCB0aHJlc2hvbGQgJWQsICVzbG9ja2VkIiwKLQkgICAgICAoKHJlZ1s4XSAmIDB4MjApID09IDApID8gImVuIiA6ICJkaXMiLAotCSAgICAgIDEgKyAocmVnWzhdICYgMHgwZiksIChyZWdbN10gJiAweDgwKSA/ICIiIDogIm5vdCAiKTsKLQkvKiAgSWYgZmRjIGlzIGFscmVhZHkgbG9ja2VkLCB1bmxvY2sgaXQgZmlyc3QgISAqLwotCWlmIChyZWdbN10gJiAweDgwKSB7Ci0JCWZkY19yZWFkeV93YWl0KDEwMCk7Ci0JCVRSQUNFX0NBVENIKGZkY19pc3N1ZV9jb21tYW5kKGNtZDMsIE5SX0lURU1TKGNtZDMpLCAmc3RhdCwgMSksCi0JCQkgICAgVFJBQ0UoZnRfdF9idWcsICJGREMgdW5sb2NrIGNvbW1hbmQgZmFpbGVkLCAiCi0JCQkJICAiY29uZmlndXJhdGlvbiB1bmNoYW5nZWQiKSk7Ci0JfQotCWZkY19maWZvX2xvY2tlZCA9IDA7Ci0JLyogIEVuYWJsZSBmaWZvIGFuZCBzZXQgdGhyZXNob2xkIGF0IHh4IGJ5dGVzIHRvIGFsbG93IGEKLQkgKiAgcmVhc29uYWJseSBsYXJnZSBsYXRlbmN5IGFuZCByZWR1Y2UgbnVtYmVyIG9mIGRtYSBidXJzdHMuCi0JICovCi0JZmRjX3JlYWR5X3dhaXQoMTAwKTsKLQlpZiAoKHJlc3VsdCA9IGZkY19jb21tYW5kKGNtZDEsIE5SX0lURU1TKGNtZDEpKSkgPCAwKSB7Ci0JCVRSQUNFKGZ0X3RfYnVnLCAiY29uZmlndXJlIGNtZCBmYWlsZWQsIGZpZm8gdW5jaGFuZ2VkIik7Ci0JfQotCS8qICBOb3cgbG9jayBjb25maWd1cmF0aW9uIHNvIHJlc2V0IHdpbGwgbm90IGNoYW5nZSBpdAotCSAqLwotICAgICAgICBpZihmZGNfaXNzdWVfY29tbWFuZChjbWQyLCBOUl9JVEVNUyhjbWQyKSwgJnN0YXQsIDEpIDwgMCB8fAotCSAgIHN0YXQgIT0gMHgxMCkgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKLQkJCSAgICAiRkRDIGxvY2sgY29tbWFuZCBmYWlsZWQsIHN0YXQgPSAweCUwMngiLCBzdGF0KTsKLQl9Ci0JZmRjX2ZpZm9fbG9ja2VkID0gMTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBmZGNfZmlmb19lbmFibGUodm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKGZkY19maWZvX2xvY2tlZCkgewotCQlUUkFDRV9BQk9SVCgwLCBmdF90X3dhcm4sICJGaWZvIG5vdCBlbmFibGVkIGJlY2F1c2UgbG9ja2VkIik7Ci0JfQotCVRSQUNFX0NBVENIKGZkY19maWZvX3RocmVzaG9sZChmdF9mZGNfdGhyZXNob2xkIC8qIGJ5dGVzICovLAotCQkJCSAgICAgICAmZmRjX2ZpZm9fc3RhdGUsCi0JCQkJICAgICAgICZmZGNfbG9ja19zdGF0ZSwKLQkJCQkgICAgICAgJmZkY19maWZvX3RociksKTsKLQlUUkFDRV9DQVRDSChmZGNfZmlmb190aHJlc2hvbGQoZnRfZmRjX3RocmVzaG9sZCAvKiBieXRlcyAqLywKLQkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCksKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgRGV0ZXJtaW5lIGZkIGNvbnRyb2xsZXIgdHlwZSAKLSAqLwotc3RhdGljIF9fdTggZmRjX3NhdmVfc3RhdGVbMl07Ci0KLXN0YXRpYyBpbnQgZmRjX3Byb2JlKHZvaWQpCi17Ci0JX191OCBjbWRbMV07Ci0JX191OCBzdGF0WzE2XTsgLyogbXVzdCBiZSBhYmxlIHRvIGhvbGQgZHVtcHJlZ3MgJiBzYXZlIHJlc3VsdHMgKi8KLQlpbnQgaTsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JLyogIFRyeSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZmQgY29udHJvbGxlciB3ZSBoYXZlIHRvIGRlYWwgd2l0aAotCSAqICBTY2hlbWUgYm9ycm93ZWQgZnJvbSBmbG9wcHkgZHJpdmVyOgotCSAqICBmaXJzdCB0cnkgaWYgRkRDX0RVTVBSRUdTIGNvbW1hbmQgd29ya3MKLQkgKiAgKHRoaXMgaW5kaWNhdGVzIHRoYXQgd2UgaGF2ZSBhIDgyMDcyIG9yIGJldHRlcikKLQkgKiAgdGhlbiB0cnkgdGhlIEZEQ19WRVJTSU9OIGNvbW1hbmQgKDgyMDcyIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzKQotCSAqICB0aGVuIHRyeSB0aGUgRkRDX1VOTE9DSyBjb21tYW5kIChzb21lIG9sZGVyIDgyMDc3J3MgZG9uJ3Qgc3VwcG9ydCB0aGlzKQotCSAqICB0aGVuIHRyeSB0aGUgRkRDX1BBUlRJRCBjb21tYW5kICg4MjA3OCdzIHN1cHBvcnQgdGhpcykKLQkgKi8KLQljbWRbMF0gPSBGRENfRFVNUFJFR1M7Ci0JaWYgKGZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMSkgIT0gMCkgewotCQlUUkFDRV9BQk9SVChub19mZGMsIGZ0X3RfYnVnLCAiTm8gRkRDIGZvdW5kIik7Ci0JfQotCWlmIChzdGF0WzBdID09IDB4ODApIHsKLQkJLyogaW52YWxpZCBjb21tYW5kOiBtdXN0IGJlIHByZSA4MjA3MiAqLwotCQlUUkFDRV9BQk9SVChpODI3MiwKLQkJCSAgICBmdF90X3dhcm4sICJUeXBlIDgyNzJBLzc2NUEgY29tcGF0aWJsZSBGREMgZm91bmQiKTsKLQl9Ci0JZmRjX3Jlc3VsdCgmc3RhdFsxXSwgOSk7Ci0JZmRjX3NhdmVfc3RhdGVbMF0gPSBzdGF0WzddOwotCWZkY19zYXZlX3N0YXRlWzFdID0gc3RhdFs4XTsKLQljbWRbMF0gPSBGRENfVkVSU0lPTjsKLQlpZiAoZmRjX2lzc3VlX2NvbW1hbmQoY21kLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSA9PSAweDgwKSB7Ci0JCVRSQUNFX0FCT1JUKGk4MjcyLCBmdF90X3dhcm4sICJUeXBlIDgyMDcyIEZEQyBmb3VuZCIpOwotCX0KLQlpZiAoKnN0YXQgIT0gMHg5MCkgewotCQlUUkFDRV9BQk9SVChpODI3MiwgZnRfdF93YXJuLCAiVW5rbm93biBGREMgZm91bmQiKTsKLQl9Ci0JY21kWzBdID0gRkRDX1VOTE9DSzsKLQlpZihmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpIDwgMCB8fCBzdGF0WzBdICE9IDB4MDApIHsKLQkJVFJBQ0VfQUJPUlQoaTgyNzIsIGZ0X3Rfd2FybiwKLQkJCSAgICAiVHlwZSBwcmUtMTk5MSA4MjA3NyBGREMgZm91bmQsICIKLQkJCSAgICAidHJlYXRpbmcgaXQgbGlrZSBhIDgyMDcyIik7Ci0JfQotCWlmIChmZGNfc2F2ZV9zdGF0ZVswXSAmIDB4ODApIHsgLyogd2FzIGxvY2tlZCAqLwotCQljbWRbMF0gPSBGRENfTE9DSzsgLyogcmVzdG9yZSBsb2NrICovCi0JCSh2b2lkKWZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMSk7Ci0JCVRSQUNFKGZ0X3Rfd2FybiwgIkZEQyBpcyBhbHJlYWR5IGxvY2tlZCIpOwotCX0KLQkvKiBUZXN0IGZvciBhIGk4MjA3OCBGREMgKi8KLQljbWRbMF0gPSBGRENfUEFSVElEOwotCWlmIChmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpIDwgMCB8fCBzdGF0WzBdID09IDB4ODApIHsKLQkJLyogaW52YWxpZCBjb21tYW5kOiBub3QgYSBpODIwNzh4eCB0eXBlIEZEQyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0JCQlvdXRiX3AoaSwgZmRjLnRkcik7Ci0JCQlpZiAoKGluYl9wKGZkYy50ZHIpICYgMHgwMykgIT0gaSkgewotCQkJCVRSQUNFX0FCT1JUKGk4MjA3NywKLQkJCQkJICAgIGZ0X3Rfd2FybiwgIlR5cGUgODIwNzcgRkRDIGZvdW5kIik7Ci0JCQl9Ci0JCX0KLQkJVFJBQ0VfQUJPUlQoaTgyMDc3QUEsIGZ0X3Rfd2FybiwgIlR5cGUgODIwNzdBQSBGREMgZm91bmQiKTsKLQl9Ci0JLyogRkRDX1BBUlRJRCBjbWQgc3VjY2VlZGVkICovCi0Jc3dpdGNoIChzdGF0WzBdID4+IDUpIHsKLQljYXNlIDB4MDoKLQkJLyogaTgyMDc4U0wgb3IgaTgyMDc4LTEuICBUaGUgU0wgcGFydCBjYW5ub3QgcnVuIGF0Ci0JCSAqIDJNYnBzICh0aGUgU0wgYW5kIC0xIGRpZXMgYXJlIGlkZW50aWNhbDsgdGhleSBhcmUKLQkJICogc3BlZWQgZ3JhZGVkIGFmdGVyIHByb2R1Y3Rpb24sIGFjY29yZGluZyB0byBJbnRlbCkuCi0JCSAqIFNvbWUgU0wncyBjYW4gYmUgZGV0ZWN0ZWQgYnkgZG9pbmcgYSBTQVZFIGNtZCBhbmQKLQkJICogbG9vayBhdCBiaXQgNyBvZiB0aGUgZmlyc3QgYnl0ZSAodGhlIFNFTDNWIyBiaXQpLgotCQkgKiBJZiBpdCBpcyAwLCB0aGUgcGFydCBydW5zIG9mZiAzVm9sdHMsIGFuZCBoZW5jZSBpdAotCQkgKiBpcyBhIFNMLgotCQkgKi8KLQkJY21kWzBdID0gRkRDX1NBVkU7Ci0JCWlmKGZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMTYpIDwgMCkgewotCQkJVFJBQ0UoZnRfdF9lcnIsICJGRENfU0FWRSBmYWlsZWQuIER1bm5vIHdoeSIpOwotCQkJLyogZ3Vlc3Mgd2UgYmV0dGVyIGNsYWltIHRoZSBmZGMgdG8gYmUgYSBpODIwNzggKi8KLQkJCVRSQUNFX0FCT1JUKGk4MjA3OCwKLQkJCQkgICAgZnRfdF93YXJuLAotCQkJCSAgICAiVHlwZSBpODIwNzggRkRDIChpIHN1cHBvc2UpIGZvdW5kIik7Ci0JCX0KLQkJaWYgKChzdGF0WzBdICYgRkRDX1NFTDNWX0JJVCkpIHsKLQkJCS8qIGZkYyBydW5uaW5nIG9mZiA1Vm9sdHM7IFByYXkgdGhhdCBpdCdzIGEgaTgyMDc4LTEKLQkJCSAqLwotCQkJVFJBQ0VfQUJPUlQoaTgyMDc4XzEsIGZ0X3Rfd2FybiwKLQkJCQkgICJUeXBlIGk4MjA3OC0xIG9yIDVWb2x0IGk4MjA3OFNMIEZEQyBmb3VuZCIpOwotCQl9Ci0JCVRSQUNFX0FCT1JUKGk4MjA3OCwgZnRfdF93YXJuLAotCQkJICAgICJUeXBlIDNWb2x0IGk4MjA3OFNMIEZEQyAoMU1icHMpIGZvdW5kIik7Ci0JY2FzZSAweDE6Ci0JY2FzZSAweDI6IC8qIFM4MjA3OEIgICovCi0JCS8qIFRoZSAnNzhCICBpc24ndCAnNzggY29tcGF0aWJsZS4gIERldGVjdCBpdCBhcyBhICc3N0FBICovCi0JCVRSQUNFX0FCT1JUKGk4MjA3N0FBLCBmdF90X3dhcm4sICJUeXBlIGk4MjA3N0FBIEZEQyBmb3VuZCIpOwotCWNhc2UgMHgzOiAvKiBOU0MgUEM4NzQ0IGNvcmU7IHVzZWQgaW4gc2V2ZXJhbCBzdXBlci1JTyBjaGlwcyAqLwotCQlUUkFDRV9BQk9SVChpODIwNzdBQSwKLQkJCSAgICBmdF90X3dhcm4sICJUeXBlIDgyMDc3QUEgY29tcGF0aWJsZSBGREMgZm91bmQiKTsKLQlkZWZhdWx0OgotCQlUUkFDRShmdF90X3dhcm4sICJBIHByZXZpb3VzbHkgdW5kZXRlY3RlZCBGREMgZm91bmQiKTsKLQkJVFJBQ0VfQUJPUlQoaTgyMDc3QUEsIGZ0X3Rfd2FybiwKLQkJCSAgIlRyZWF0aW5nIGl0IGFzIGEgODIwNzdBQS4gUGxlYXNlIHJlcG9ydCBwYXJ0aWQ9ICVkIiwKLQkJCSAgICBzdGF0WzBdKTsKLQl9IC8qIHN3aXRjaChzdGF0WyAwXSA+PiA1KSAqLwotCVRSQUNFX0VYSVQgbm9fZmRjOwotfQotCi1zdGF0aWMgaW50IGZkY19yZXF1ZXN0X3JlZ2lvbnModm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChmdF9tYWNoMiB8fCBmdF9wcm9iZV9mYzEwKSB7Ci0JCWlmICghcmVxdWVzdF9yZWdpb24oZmRjLnNyYSwgOCwgImZkYyAoZnQpIikpIHsKLSNpZm5kZWYgQlJPS0VOX0ZMT1BQWV9EUklWRVIKLQkJCVRSQUNFX0VYSVQgLUVCVVNZOwotI2Vsc2UKLQkJCVRSQUNFKGZ0X3Rfd2FybiwKLSJhZGRyZXNzIDB4JTAzeCBvY2N1cGllZCAoYnkgZmxvcHB5IGRyaXZlcj8pLCB1c2luZyBpdCBhbnl3YXkiLCBmZGMuc3JhKTsKLSNlbmRpZgotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihmZGMuc3JhLCA2LCAiZmRjIChmdCkiKSkgewotI2lmbmRlZiBCUk9LRU5fRkxPUFBZX0RSSVZFUgotCQkJVFJBQ0VfRVhJVCAtRUJVU1k7Ci0jZWxzZQotCQkJVFJBQ0UoZnRfdF93YXJuLAotImFkZHJlc3MgMHglMDN4IG9jY3VwaWVkIChieSBmbG9wcHkgZHJpdmVyPyksIHVzaW5nIGl0IGFueXdheSIsIGZkYy5zcmEpOwotI2VuZGlmCi0JCX0KLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihmZGMuc3JhICsgNywgMSwgImZkYyAoZnQpIikpIHsKLSNpZm5kZWYgQlJPS0VOX0ZMT1BQWV9EUklWRVIKLQkJCXJlbGVhc2VfcmVnaW9uKGZkYy5zcmEsIDYpOwotCQkJVFJBQ0VfRVhJVCAtRUJVU1k7Ci0jZWxzZQotCQkJVFJBQ0UoZnRfdF93YXJuLAotImFkZHJlc3MgMHglMDN4IG9jY3VwaWVkIChieSBmbG9wcHkgZHJpdmVyPyksIHVzaW5nIGl0IGFueXdheSIsIGZkYy5zcmEgKyA3KTsKLSNlbmRpZgotCQl9Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotdm9pZCBmZGNfcmVsZWFzZV9yZWdpb25zKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoZmRjLnNyYSAhPSAwKSB7Ci0JCWlmIChmZGMuZG9yMiAhPSAwKSB7Ci0JCQlyZWxlYXNlX3JlZ2lvbihmZGMuc3JhLCA4KTsKLQkJfSBlbHNlIHsKLQkJCXJlbGVhc2VfcmVnaW9uKGZkYy5zcmEsIDYpOwotCQkJcmVsZWFzZV9yZWdpb24oZmRjLmRpciwgMSk7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIGludCBmZGNfY29uZmlnX3JlZ3ModW5zaWduZWQgaW50IGZkY19iYXNlLCAKLQkJCSAgIHVuc2lnbmVkIGludCBmZGNfaXJxLCAKLQkJCSAgIHVuc2lnbmVkIGludCBmZGNfZG1hKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JZmRjLmlycSA9IGZkY19pcnE7Ci0JZmRjLmRtYSA9IGZkY19kbWE7Ci0JZmRjLnNyYSA9IGZkY19iYXNlOwotCWZkYy5zcmIgPSBmZGNfYmFzZSArIDE7Ci0JZmRjLmRvciA9IGZkY19iYXNlICsgMjsKLQlmZGMudGRyID0gZmRjX2Jhc2UgKyAzOwotCWZkYy5tc3IgPSBmZGMuZHNyID0gZmRjX2Jhc2UgKyA0OwotCWZkYy5maWZvID0gZmRjX2Jhc2UgKyA1OwotCWZkYy5kaXIgPSBmZGMuY2NyID0gZmRjX2Jhc2UgKyA3OwotCWZkYy5kb3IyID0gKGZ0X21hY2gyIHx8IGZ0X3Byb2JlX2ZjMTApID8gZmRjX2Jhc2UgKyA2IDogMDsKLQlUUkFDRV9DQVRDSChmZGNfcmVxdWVzdF9yZWdpb25zKCksIGZkYy5zcmEgPSAwKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmRjX2NvbmZpZyh2b2lkKQotewotCXN0YXRpYyBpbnQgYWxyZWFkeV9kb25lOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlpZiAoYWxyZWFkeV9kb25lKSB7Ci0JCVRSQUNFX0NBVENIKGZkY19yZXF1ZXN0X3JlZ2lvbnMoKSwpOwotCQkqKGZkYy5ob29rKSA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW4gKi8KLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlpZiAoZnRfcHJvYmVfZmMxMCkgewotCQlpbnQgZmNfdHlwZTsKLQkJCi0JCVRSQUNFX0NBVENIKGZkY19jb25maWdfcmVncyhmdF9mZGNfYmFzZSwKLQkJCQkJICAgIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEpLCk7Ci0JCWZjX3R5cGUgPSBmYzEwX2VuYWJsZSgpOwotCQlpZiAoZmNfdHlwZSAhPSAwKSB7Ci0JCQlUUkFDRShmdF90X3dhcm4sICJGQy0lYzAgY29udHJvbGxlciBmb3VuZCIsICcwJyArIGZjX3R5cGUpOwotCQkJZmRjLnR5cGUgPSBmYzEwOwotCQkJZmRjLmhvb2sgPSAmZG9fZnRhcGU7Ci0JCQkqKGZkYy5ob29rKSA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW4gKi8KLQkJCWFscmVhZHlfZG9uZSA9IDE7Ci0JCQlUUkFDRV9FWElUIDA7Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X3dhcm4sICJGQy0xMC8yMCBjb250cm9sbGVyIG5vdCBmb3VuZCIpOwotCQkJZmRjX3JlbGVhc2VfcmVnaW9ucygpOwotCQkJZmRjLnR5cGUgPSBub19mZGM7Ci0JCQlmdF9wcm9iZV9mYzEwID0gMDsKLQkJCWZ0X2ZkY19iYXNlICAgPSAweDNmMDsKLQkJCWZ0X2ZkY19pcnEgICAgPSA2OwotCQkJZnRfZmRjX2RtYSAgICA9IDI7Ci0JCX0KLQl9Ci0JVFJBQ0UoZnRfdF93YXJuLCAiZmRjIGJhc2U6IDB4JXgsIGlycTogJWQsIGRtYTogJWQiLCAKLQkgICAgICBmdF9mZGNfYmFzZSwgZnRfZmRjX2lycSwgZnRfZmRjX2RtYSk7Ci0JVFJBQ0VfQ0FUQ0goZmRjX2NvbmZpZ19yZWdzKGZ0X2ZkY19iYXNlLCBmdF9mZGNfaXJxLCBmdF9mZGNfZG1hKSwpOwotCWZkYy5ob29rID0gJmRvX2Z0YXBlOwotCSooZmRjLmhvb2spID0gZmRjX2lzcjsJLyogaG9vayBvdXIgaGFuZGxlciBpbiAqLwotCWFscmVhZHlfZG9uZSA9IDE7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZnRhcGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl2b2lkICgqaGFuZGxlcikgKHZvaWQpID0gKmZkYy5ob29rOwotCWludCBoYW5kbGVkID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JKmZkYy5ob29rID0gTlVMTDsKLQlpZiAoaGFuZGxlcikgewotCQloYW5kbGVkID0gMTsKLQkJaGFuZGxlcigpOwotCX0gZWxzZSB7Ci0JCVRSQUNFKGZ0X3RfYnVnLCAiVW5leHBlY3RlZCBmdGFwZSBpbnRlcnJ1cHQiKTsKLQl9Ci0JVFJBQ0VfRVhJVCBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQotCi1zdGF0aWMgaW50IGZkY19ncmFiX2lycV9hbmRfZG1hKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWlmIChmZGMuaG9vayA9PSAmZG9fZnRhcGUpIHsKLQkJLyogIEdldCBmYXN0IGludGVycnVwdCBoYW5kbGVyLgotCQkgKi8KLQkJaWYgKHJlcXVlc3RfaXJxKGZkYy5pcnEsIGZ0YXBlX2ludGVycnVwdCwKLQkJCQlJUlFGX0RJU0FCTEVELCAiZnQiLCBmdGFwZV9pZCkpIHsKLQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAotCQkJCSAgICAiVW5hYmxlIHRvIGdyYWIgSVJRJWQgZm9yIGZ0YXBlIGRyaXZlciIsCi0JCQkJICAgIGZkYy5pcnEpOwotCQl9Ci0JCWlmIChyZXF1ZXN0X2RtYShmZGMuZG1hLCBmdGFwZV9pZCkpIHsKLQkJCWZyZWVfaXJxKGZkYy5pcnEsIGZ0YXBlX2lkKTsKLQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAotCQkJICAgICAgIlVuYWJsZSB0byBncmFiIERNQSVkIGZvciBmdGFwZSBkcml2ZXIiLAotCQkJICAgICAgZmRjLmRtYSk7Ci0JCX0KLQl9Ci0JaWYgKGZ0X2ZkY19iYXNlICE9IDB4M2YwICYmIChmdF9mZGNfZG1hID09IDIgfHwgZnRfZmRjX2lycSA9PSA2KSkgewotCQkvKiBVc2luZyBzYW1lIGRtYSBjaGFubmVsIG9yIGlycSBhcyBzdGFuZGFyZCBmZGMsIG5lZWQKLQkJICogdG8gZGlzYWJsZSB0aGUgZG1hLWdhdGUgb24gdGhlIHN0ZCBmZGMuIFRoaXMKLQkJICogY291bGRuJ3QgYmUgZG9uZSBpbiB0aGUgZmxvcHB5IGRyaXZlciBhcyBzb21lCi0JCSAqIGxhcHRvcHMgYXJlIHVzaW5nIHRoZSBkbWEtZ2F0ZSB0byBlbnRlciBhIGxvdyBwb3dlcgotCQkgKiBvciBldmVuIHN1c3BlbmRlZCBzdGF0ZSA6LSgKLQkJICovCi0JCW91dGJfcChGRENfUkVTRVRfTk9ULCAweDNmMik7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJETUEtZ2F0ZSBvbiBzdGFuZGFyZCBmZGMgZGlzYWJsZWQiKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1pbnQgZmRjX3JlbGVhc2VfaXJxX2FuZF9kbWEodm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKGZkYy5ob29rID09ICZkb19mdGFwZSkgewotCQlkaXNhYmxlX2RtYShmZGMuZG1hKTsJLyoganVzdCBpbiBjYXNlLi4uICovCi0JCWZyZWVfZG1hKGZkYy5kbWEpOwotCQlmcmVlX2lycShmZGMuaXJxLCBmdGFwZV9pZCk7Ci0JfQotCWlmIChmdF9mZGNfYmFzZSAhPSAweDNmMCAmJiAoZnRfZmRjX2RtYSA9PSAyIHx8IGZ0X2ZkY19pcnEgPT0gNikpIHsKLQkJLyogVXNpbmcgc2FtZSBkbWEgY2hhbm5lbCBhcyBzdGFuZGFyZCBmZGMsIG5lZWQgdG8KLQkJICogZGlzYWJsZSB0aGUgZG1hLWdhdGUgb24gdGhlIHN0ZCBmZGMuIFRoaXMgY291bGRuJ3QKLQkJICogYmUgZG9uZSBpbiB0aGUgZmxvcHB5IGRyaXZlciBhcyBzb21lIGxhcHRvcHMgYXJlCi0JCSAqIHVzaW5nIHRoZSBkbWEtZ2F0ZSB0byBlbnRlciBhIGxvdyBwb3dlciBvciBldmVuCi0JCSAqIHN1c3BlbmRlZCBzdGF0ZSA6LSgKLQkJICovCi0JCW91dGJfcChGRENfUkVTRVRfTk9UIHwgRkRDX0RNQV9NT0RFLCAweDNmMik7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJETUEtZ2F0ZSBvbiBzdGFuZGFyZCBmZGMgZW5hYmxlZCBhZ2FpbiIpOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWludCBmZGNfaW5pdCh2b2lkKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiBmaW5kIGEgRkRDIHRvIHVzZSAqLwotCVRSQUNFX0NBVENIKGZkY19jb25maWcoKSwpOwotCVRSQUNFX0NBVENIKGZkY19ncmFiX2lycV9hbmRfZG1hKCksIGZkY19yZWxlYXNlX3JlZ2lvbnMoKSk7Ci0JZnRhcGVfbW90b3IgPSAwOwotCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDApOwkvKiBjbGVhciBudW1iZXIgb2YgYXdhaW50ZWQKLQkJCQkJICogc3RyYXkgaW50ZXJydXB0ZSAKLQkJCQkJICovCi0JZmRjX2NhdGNoX3N0cmF5X2ludGVycnVwdHMoMSk7CS8qIG9uZSBhbHdheXMgY29tZXMgKD8pICovCi0JVFJBQ0UoZnRfdF9mbG93LCAicmVzZXR0aW5nIGZkYyIpOwotCWZkY19zZXRfc2Vla19yYXRlKDIpOwkJLyogdXNlIG5vbWluYWwgUUlDIHN0ZXAgcmF0ZSAqLwotCWZkY19yZXNldCgpOwkJCS8qIGluaXQgZmRjICYgY2xlYXIgdHJhY2sgY291bnRlcnMgKi8KLQlpZiAoZmRjLnR5cGUgPT0gbm9fZmRjKSB7CS8qIG5vIEZDLTEwIG9yIEZDLTIwIGZvdW5kICovCi0JCWZkYy50eXBlID0gZmRjX3Byb2JlKCk7Ci0JCWZkY19yZXNldCgpOwkJLyogdXBkYXRlIHdpdGggbmV3IGtub3dsZWRnZSAqLwotCX0KLQlpZiAoZmRjLnR5cGUgPT0gbm9fZmRjKSB7Ci0JCWZkY19yZWxlYXNlX2lycV9hbmRfZG1hKCk7Ci0JCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKLQkJVFJBQ0VfRVhJVCAtRU5YSU87Ci0JfQotCWlmIChmZGMudHlwZSA+PSBpODIwNzcpIHsKLQkJaWYgKGZkY19maWZvX2VuYWJsZSgpIDwgMCkgewotCQkJVFJBQ0UoZnRfdF93YXJuLCAiY291bGRuJ3QgZW5hYmxlIGZkYyBmaWZvICEiKTsKLQkJfSBlbHNlIHsKLQkJCVRSQUNFKGZ0X3RfZmxvdywgImZkYyBmaWZvIGVuYWJsZWQgYW5kIGxvY2tlZCIpOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjM2M3Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotI2lmbmRlZiBfRkRDX0lPX0gKLSNkZWZpbmUgX0ZEQ19JT19ICi0KLS8qCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaCx2ICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA2ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbG93IGxldmVsCi0gKiAgICAgIGZ1bmN0aW9ucyB0aGF0IGNvbW11bmljYXRlIHdpdGggdGhlIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIsCi0gKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKLSAqICAgICAgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZkcmVnLmg+Ci0KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLQotI2RlZmluZSBGRENfU0tfQklUICAgICAgKDB4MjApCi0jZGVmaW5lIEZEQ19NVF9CSVQgICAgICAoMHg4MCkKLQotI2RlZmluZSBGRENfUkVBRCAgICAgICAgKEZEX1JFQUQgJiB+KEZEQ19TS19CSVQgfCBGRENfTVRfQklUKSkKLSNkZWZpbmUgRkRDX1dSSVRFICAgICAgIChGRF9XUklURSAmIH5GRENfTVRfQklUKQotI2RlZmluZSBGRENfUkVBRF9ERUxFVEVEICAoMHg0YykKLSNkZWZpbmUgRkRDX1dSSVRFX0RFTEVURUQgKDB4NDkpCi0jZGVmaW5lIEZEQ19WRVJJRlkgICAgICAgICgweDU2KQotI2RlZmluZSBGRENfUkVBRElEICAgICAgKDB4NGEpCi0jZGVmaW5lIEZEQ19TRU5TRUQgICAgICAoMHgwNCkKLSNkZWZpbmUgRkRDX1NFTlNFSSAgICAgIChGRF9TRU5TRUkpCi0jZGVmaW5lIEZEQ19GT1JNQVQgICAgICAoRkRfRk9STUFUKQotI2RlZmluZSBGRENfUkVDQUwgICAgICAgKEZEX1JFQ0FMSUJSQVRFKQotI2RlZmluZSBGRENfU0VFSyAgICAgICAgKEZEX1NFRUspCi0jZGVmaW5lIEZEQ19TUEVDSUZZICAgICAoRkRfU1BFQ0lGWSkKLSNkZWZpbmUgRkRDX1JFQ0FMSUJSICAgIChGRF9SRUNBTElCUkFURSkKLSNkZWZpbmUgRkRDX1ZFUlNJT04gICAgIChGRF9WRVJTSU9OKQotI2RlZmluZSBGRENfUEVSUEVORCAgICAgKEZEX1BFUlBFTkRJQ1VMQVIpCi0jZGVmaW5lIEZEQ19EVU1QUkVHUyAgICAoRkRfRFVNUFJFR1MpCi0jZGVmaW5lIEZEQ19MT0NLICAgICAgICAoRkRfTE9DSykKLSNkZWZpbmUgRkRDX1VOTE9DSyAgICAgIChGRF9VTkxPQ0spCi0jZGVmaW5lIEZEQ19DT05GSUdVUkUgICAoRkRfQ09ORklHVVJFKQotI2RlZmluZSBGRENfRFJJVkVfU1BFQyAgKDB4OGUpCS8qIGk4MjA3OCBoYXMgdGhpcyAoYW55IG90aGVycz8pICovCi0jZGVmaW5lIEZEQ19QQVJUSUQgICAgICAoMHgxOCkJLyogaTgyMDc4IGhhcyB0aGlzICovCi0jZGVmaW5lIEZEQ19TQVZFICAgICAgICAoMHgyZSkJLyogaTgyMDc4IGhhcyB0aGlzIChhbnkgb3RoZXJzPykgKi8KLSNkZWZpbmUgRkRDX1JFU1RPUkUgICAgICgweDRlKQkvKiBpODIwNzggaGFzIHRoaXMgKGFueSBvdGhlcnM/KSAqLwotCi0jZGVmaW5lIEZEQ19TVEFUVVNfTUFTSyAoU1RBVFVTX0JVU1kgfCBTVEFUVVNfRE1BIHwgU1RBVFVTX0RJUiB8IFNUQVRVU19SRUFEWSkKLSNkZWZpbmUgRkRDX0RBVEFfUkVBRFkgIChTVEFUVVNfUkVBRFkpCi0jZGVmaW5lIEZEQ19EQVRBX09VVFBVVCAoU1RBVFVTX0RJUikKLSNkZWZpbmUgRkRDX0RBVEFfUkVBRFlfTUFTSyAoU1RBVFVTX1JFQURZIHwgU1RBVFVTX0RJUikKLSNkZWZpbmUgRkRDX0RBVEFfT1VUX1JFQURZICAoU1RBVFVTX1JFQURZIHwgU1RBVFVTX0RJUikKLSNkZWZpbmUgRkRDX0RBVEFfSU5fUkVBRFkgICAoU1RBVFVTX1JFQURZKQotI2RlZmluZSBGRENfQlVTWSAgICAgICAgKFNUQVRVU19CVVNZKQotI2RlZmluZSBGRENfQ0xLNDhfQklUICAgKDB4ODApCi0jZGVmaW5lIEZEQ19TRUwzVl9CSVQgICAoMHg0MCkKLQotI2RlZmluZSBTVDBfSU5UX01BU0sgICAgKFNUMF9JTlRSKQotI2RlZmluZSBGRENfSU5UX05PUk1BTCAgKFNUMF9JTlRSICYgMHgwMCkKLSNkZWZpbmUgRkRDX0lOVF9BQk5PUk1BTCAoU1QwX0lOVFIgJiAweDQwKQotI2RlZmluZSBGRENfSU5UX0lOVkFMSUQgKFNUMF9JTlRSICYgMHg4MCkKLSNkZWZpbmUgRkRDX0lOVF9SRUFEWUNIIChTVDBfSU5UUiAmIDB4QzApCi0jZGVmaW5lIFNUMF9TRUVLX0VORCAgICAoU1QwX1NFKQotI2RlZmluZSBTVDNfVFJBQ0tfMCAgICAgKFNUM19UWikKLQotI2RlZmluZSBGRENfUkVTRVRfTk9UICAgKDB4MDQpCi0jZGVmaW5lIEZEQ19ETUFfTU9ERSAgICAoMHgwOCkKLSNkZWZpbmUgRkRDX01PVE9SXzAgICAgICgweDEwKQotI2RlZmluZSBGRENfTU9UT1JfMSAgICAgKDB4MjApCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICgqKmhvb2spICh2b2lkKTsJLyogb3VyIHdlZGdlIGludG8gdGhlIGlzciAqLwotCWVudW0gewotCQlub19mZGMsIGk4MjcyLCBpODIwNzcsIGk4MjA3N0FBLCBmYzEwLAotCQlpODIwNzgsIGk4MjA3OF8xCi0JfSB0eXBlOwkJCS8qIEZEQyB0eXBlICovCi0JdW5zaWduZWQgaW50IGlycTsgLyogRkRDIGlycSBuciAqLwotCXVuc2lnbmVkIGludCBkbWE7IC8qIEZEQyBkbWEgY2hhbm5lbCBuciAqLwotCV9fdTE2IHNyYTsJICAvKiBTdGF0dXMgcmVnaXN0ZXIgQSAoUFMvMiBvbmx5KSAqLwotCV9fdTE2IHNyYjsJICAvKiBTdGF0dXMgcmVnaXN0ZXIgQiAoUFMvMiBvbmx5KSAqLwotCV9fdTE2IGRvcjsJICAvKiBEaWdpdGFsIG91dHB1dCByZWdpc3RlciAqLwotCV9fdTE2IHRkcjsJICAvKiBUYXBlIERyaXZlIFJlZ2lzdGVyICg4MjA3N1NMLTEgJgotCQkJICAgICA4MjA3OCBvbmx5KSAqLwotCV9fdTE2IG1zcjsJICAvKiBNYWluIFN0YXR1cyBSZWdpc3RlciAqLwotCV9fdTE2IGRzcjsJICAvKiBEYXRhcmF0ZSBTZWxlY3QgUmVnaXN0ZXIgKDgyMDd4IG9ubHkpICovCi0JX191MTYgZmlmbzsJICAvKiBEYXRhIHJlZ2lzdGVyIC8gRmlmbyBvbiA4MjA3eCAqLwotCV9fdTE2IGRpcjsJICAvKiBEaWdpdGFsIElucHV0IFJlZ2lzdGVyICovCi0JX191MTYgY2NyOwkgIC8qIENvbmZpZ3VyYXRpb24gQ29udHJvbCBSZWdpc3RlciAqLwotCV9fdTE2IGRvcjI7CSAgLyogQWx0ZXJuYXRlIGRvciBvbiBNQUNILTIgY29udHJvbGxlciwKLQkJCSAgICAgYWxzbyB1c2VkIHdpdGggRkMtMTAsIG1lYW5pbmcgdW5rbm93biAqLwotfSBmZGNfY29uZmlnX2luZm87Ci0KLXR5cGVkZWYgZW51bSB7Ci0JZmRjX2RhdGFfcmF0ZV8yNTAgID0gMiwKLQlmZGNfZGF0YV9yYXRlXzMwMCAgPSAxLAkvKiBhbnkgZmRjIGluIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLwotCWZkY19kYXRhX3JhdGVfNTAwICA9IDAsCi0JZmRjX2RhdGFfcmF0ZV8xMDAwID0gMywKLQlmZGNfZGF0YV9yYXRlXzIwMDAgPSAxLAkvKiBpODIwNzgtMTogd2hlbiB1c2luZyBEYXRhIFJhdGUgVGFibGUgIzIgKi8KLX0gZmRjX2RhdGFfcmF0ZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotCWZkY19pZGxlICAgICAgICAgID0gMCwKLQlmZGNfcmVhZGluZ19kYXRhICA9IEZEQ19SRUFELAotCWZkY19zZWVraW5nICAgICAgID0gRkRDX1NFRUssCi0JZmRjX3dyaXRpbmdfZGF0YSAgPSBGRENfV1JJVEUsCi0JZmRjX2RlbGV0aW5nICAgICAgPSBGRENfV1JJVEVfREVMRVRFRCwKLQlmZGNfcmVhZGluZ19pZCAgICA9IEZEQ19SRUFESUQsCi0JZmRjX3JlY2FsaWJyYXRpbmcgPSBGRENfUkVDQUwsCi0JZmRjX2Zvcm1hdHRpbmcgICAgPSBGRENfRk9STUFULAotCWZkY192ZXJpZnlpbmcgICAgID0gRkRDX1ZFUklGWQotfSBmZGNfbW9kZV9lbnVtOwotCi10eXBlZGVmIGVudW0gewotCXdhaXRpbmcgPSAwLAotCXJlYWRpbmcsCi0Jd3JpdGluZywKLQlmb3JtYXR0aW5nLAotCXZlcmlmeWluZywKLQlkZWxldGluZywKLQlkb25lLAotCWVycm9yLAotCW1tYXBwZWQsCi19IGJ1ZmZlcl9zdGF0ZV9lbnVtOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JX191OCAqYWRkcmVzczsKLQl2b2xhdGlsZSBidWZmZXJfc3RhdGVfZW51bSBzdGF0dXM7Ci0Jdm9sYXRpbGUgX191OCAqcHRyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBieXRlczsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2VnbWVudF9pZDsKLQotCS8qIGJpdG1hcCBmb3IgcmVtYWluZGVyIG9mIHNlZ21lbnQgbm90IHlldCBoYW5kbGVkLgotCSAqIG9uZSBiaXQgc2V0IGZvciBlYWNoIGJhZCBzZWN0b3IgdGhhdCBtdXN0IGJlIHNraXBwZWQuCi0JICovCi0Jdm9sYXRpbGUgU2VjdG9yTWFwIGJhZF9zZWN0b3JfbWFwOwotCi0JLyogYml0bWFwIHdpdGggYmFkIGRhdGEgYmxvY2tzIGluIGRhdGEgYnVmZmVyLgotCSAqIHRoZSBlcnJvcnMgaW4gdGhpcyBtYXAgbWF5IGJlIHJldHJpZWQuCi0JICovCi0Jdm9sYXRpbGUgU2VjdG9yTWFwIHNvZnRfZXJyb3JfbWFwOwotCi0JLyogYml0bWFwIHdpdGggYmFkIGRhdGEgYmxvY2tzIGluIGRhdGEgYnVmZmVyCi0JICogdGhlIGVycm9ycyBpbiB0aGlzIG1hcCBtYXkgbm90IGJlIHJldHJpZWQuCi0JICovCi0Jdm9sYXRpbGUgU2VjdG9yTWFwIGhhcmRfZXJyb3JfbWFwOwotCi0JLyogcmV0cnkgY291bnRlciBmb3Igc29mdCBlcnJvcnMuCi0JICovCi0Jdm9sYXRpbGUgaW50IHJldHJ5OwotCi0JLyogc2VjdG9ycyB0byBza2lwIG9uIHJldHJ5ID8/PwotCSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBza2lwOwotCi0JLyogbnIgb2YgZGF0YSBibG9ja3MgaW4gZGF0YSBidWZmZXIKLQkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQ7Ci0KLQkvKiBvZmZzZXQgaW4gc2VnbWVudCBmb3IgZmlyc3Qgc2VjdG9yIHRvIGJlIGhhbmRsZWQuCi0JICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IHNlY3Rvcl9vZmZzZXQ7Ci0KLQkvKiBzaXplIG9mIGNsdXN0ZXIgb2YgZ29vZCBzZWN0b3JzIHRvIGJlIGhhbmRsZWQuCi0JICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IHNlY3Rvcl9jb3VudDsKLQotCS8qIHNpemUgb2YgcmVtYWluaW5nIHBhcnQgb2Ygc2VnbWVudCB0byBiZSBoYW5kbGVkLgotCSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCByZW1haW5pbmc7Ci0KLQkvKiBwb2ludHMgdG8gbmV4dCBzZWdtZW50IChjb250aWd1b3VzKSB0byBiZSBoYW5kbGVkLAotCSAqIG9yIGlzIHplcm8gaWYgbm8gcmVhZC1haGVhZCBpcyBhbGxvd2VkLgotCSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBuZXh0X3NlZ21lbnQ7Ci0KLQkvKiBmbGFnIGJlaW5nIHNldCBpZiBkZWxldGVkIGRhdGEgd2FzIHJlYWQuCi0JICovCi0Jdm9sYXRpbGUgaW50IGRlbGV0ZWQ7Ci0KLQkvKiBmbG9wcHkgY29vcmRpbmF0ZXMgb2YgZmlyc3Qgc2VjdG9yIGluIHNlZ21lbnQgKi8KLQl2b2xhdGlsZSBfX3U4IGhlYWQ7Ci0Jdm9sYXRpbGUgX191OCBjeWw7Ci0Jdm9sYXRpbGUgX191OCBzZWN0OwotCi0JLyogZ2FwIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgKi8KLQlfX3U4IGdhcDM7Ci0JLyogZmxhZyBzZXQgd2hlbiBidWZmZXIgaXMgbW1hcGVkICovCi0JaW50IG1tYXBwZWQ7Ci19IGJ1ZmZlcl9zdHJ1Y3Q7Ci0KLS8qCi0gKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIHZhcmlhYmxlcwotICovCi1leHRlcm4gdm9sYXRpbGUgZmRjX21vZGVfZW51bSBmZGNfbW9kZTsKLWV4dGVybiBpbnQgZmRjX3NldHVwX2Vycm9yOwkvKiBvdXRkYXRlZCA/Pz8gKi8KLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBmdGFwZV93YWl0X2ludHI7Ci1leHRlcm4gdm9sYXRpbGUgaW50IGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXI7IC8qIHRyYWNrIG5yIEZEQyB0aGlua3Mgd2UncmUgb24gKi8KLWV4dGVybiB2b2xhdGlsZSBfX3U4IGZkY19oZWFkOwkvKiBGREMgaGVhZCAqLwotZXh0ZXJuIHZvbGF0aWxlIF9fdTggZmRjX2N5bDsJLyogRkRDIHRyYWNrICovCi1leHRlcm4gdm9sYXRpbGUgX191OCBmZGNfc2VjdDsJLyogRkRDIHNlY3RvciAqLwotZXh0ZXJuIGZkY19jb25maWdfaW5mbyBmZGM7CS8qIEZEQyBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX2Jhc2U7Ci1leHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19pcnE7Ci1leHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19kbWE7Ci1leHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY190aHJlc2hvbGQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGZ0X2ZkY19yYXRlX2xpbWl0OwotZXh0ZXJuIGludCBmdF9wcm9iZV9mYzEwOwotZXh0ZXJuIGludCBmdF9tYWNoMjsKLS8qCi0gKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIGZ1bmN0aW9ucwotICovCi1leHRlcm4gdm9pZCBmZGNfY2F0Y2hfc3RyYXlfaW50ZXJydXB0cyhpbnQgY291bnQpOwotZXh0ZXJuIGludCBmZGNfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCk7Ci1leHRlcm4gaW50IGZkY19jb21tYW5kKGNvbnN0IF9fdTggKiBjbWRfZGF0YSwgaW50IGNtZF9sZW4pOwotZXh0ZXJuIGludCBmZGNfcmVzdWx0KF9fdTggKiByZXNfZGF0YSwgaW50IHJlc19sZW4pOwotZXh0ZXJuIGludCBmZGNfaW50ZXJydXB0X3dhaXQodW5zaWduZWQgaW50IHRpbWUpOwotZXh0ZXJuIGludCBmZGNfc2VlayhpbnQgdHJhY2spOwotZXh0ZXJuIGludCBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKGludCAqc3QzKTsKLWV4dGVybiB2b2lkIGZkY19tb3RvcihpbnQgbW90b3IpOwotZXh0ZXJuIHZvaWQgZmRjX3Jlc2V0KHZvaWQpOwotZXh0ZXJuIHZvaWQgZmRjX2Rpc2FibGUodm9pZCk7Ci1leHRlcm4gaW50IGZkY19maWZvX3RocmVzaG9sZChfX3U4IHRocmVzaG9sZCwKLQkJCSAgICAgIGludCAqZmlmb19zdGF0ZSwgaW50ICpsb2NrX3N0YXRlLCBpbnQgKmZpZm9fdGhyKTsKLWV4dGVybiB2b2lkIGZkY193YWl0X2NhbGlicmF0ZSh2b2lkKTsKLWV4dGVybiBpbnQgZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMoaW50ICpzdDAsIGludCAqY3VycmVudF9jeWxpbmRlcik7Ci1leHRlcm4gdm9pZCBmZGNfc2F2ZV9kcml2ZV9zcGVjcyh2b2lkKTsKLWV4dGVybiB2b2lkIGZkY19yZXN0b3JlX2RyaXZlX3NwZWNzKHZvaWQpOwotZXh0ZXJuIGludCBmZGNfc2V0X2RhdGFfcmF0ZShpbnQgcmF0ZSk7Ci1leHRlcm4gdm9pZCBmZGNfc2V0X3dyaXRlX3ByZWNvbXAoaW50IHByZWNvbXApOwotZXh0ZXJuIGludCBmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSh2b2lkKTsKLWV4dGVybiB2b2lkIGZkY19yZWxlYXNlX3JlZ2lvbnModm9pZCk7Ci1leHRlcm4gaW50IGZkY19pbml0KHZvaWQpOwotZXh0ZXJuIGludCBmZGNfc2V0dXBfcmVhZF93cml0ZShidWZmZXJfc3RydWN0ICogYnVmZiwgX191OCBvcGVyYXRpb24pOwotZXh0ZXJuIGludCBmZGNfc2V0dXBfZm9ybWF0dGluZyhidWZmZXJfc3RydWN0ICogYnVmZik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDJiYzczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcwICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5jLHYgJAotICogJFJldmlzaW9uOiAxLjkgJAotICogJERhdGU6IDE5OTcvMTAvMTcgMjM6MDE6NTMgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGFuZAotICogICAgICBhc3NvY2lhdGVkIGNvZGUgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlcgotICogICAgICAiZnRhcGUiIGZvciBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotCi0jZGVmaW5lIHZvbGF0aWxlCQkvKiAqLwotCi0jaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KLSNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlzci5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotdm9sYXRpbGUgaW50IGZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHM7Ci12b2xhdGlsZSBpbnQgZnRfaW50ZXJydXB0X3NlZW47Ci12b2xhdGlsZSBpbnQgZnRfc2Vla19jb21wbGV0ZWQ7Ci12b2xhdGlsZSBpbnQgZnRfaGlkZV9pbnRlcnJ1cHQ7Ci0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0Jbm9fZXJyb3IgPSAwLCBpZF9hbV9lcnJvciA9IDB4MDEsIGlkX2NyY19lcnJvciA9IDB4MDIsCi0JZGF0YV9hbV9lcnJvciA9IDB4MDQsIGRhdGFfY3JjX2Vycm9yID0gMHgwOCwKLQlub19kYXRhX2Vycm9yID0gMHgxMCwgb3ZlcnJ1bl9lcnJvciA9IDB4MjAsCi19IGVycm9yX2NhdXNlOwotc3RhdGljIGludCBzdG9wX3JlYWRfYWhlYWQ7Ci0KLQotc3RhdGljIHZvaWQgcHJpbnRfZXJyb3JfY2F1c2UoaW50IGNhdXNlKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlzd2l0Y2ggKGNhdXNlKSB7Ci0JY2FzZSBub19kYXRhX2Vycm9yOgotCQlUUkFDRShmdF90X25vaXNlLCAibm8gZGF0YSBlcnJvciIpOwotCQlicmVhazsKLQljYXNlIGlkX2FtX2Vycm9yOgotCQlUUkFDRShmdF90X25vaXNlLCAiaWQgYW0gZXJyb3IiKTsKLQkJYnJlYWs7Ci0JY2FzZSBpZF9jcmNfZXJyb3I6Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJpZCBjcmMgZXJyb3IiKTsKLQkJYnJlYWs7Ci0JY2FzZSBkYXRhX2FtX2Vycm9yOgotCQlUUkFDRShmdF90X25vaXNlLCAiZGF0YSBhbSBlcnJvciIpOwotCQlicmVhazsKLQljYXNlIGRhdGFfY3JjX2Vycm9yOgotCQlUUkFDRShmdF90X25vaXNlLCAiZGF0YSBjcmMgZXJyb3IiKTsKLQkJYnJlYWs7Ci0JY2FzZSBvdmVycnVuX2Vycm9yOgotCQlUUkFDRShmdF90X25vaXNlLCAib3ZlcnJ1biBlcnJvciIpOwotCQlicmVhazsKLQlkZWZhdWx0OjsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIGNoYXIgKmZkY19tb2RlX3R4dChmZGNfbW9kZV9lbnVtIG1vZGUpCi17Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBmZGNfaWRsZToKLQkJcmV0dXJuICJmZGNfaWRsZSI7Ci0JY2FzZSBmZGNfcmVhZGluZ19kYXRhOgotCQlyZXR1cm4gImZkY19yZWFkaW5nX2RhdGEiOwotCWNhc2UgZmRjX3NlZWtpbmc6Ci0JCXJldHVybiAiZmRjX3NlZWtpbmciOwotCWNhc2UgZmRjX3dyaXRpbmdfZGF0YToKLQkJcmV0dXJuICJmZGNfd3JpdGluZ19kYXRhIjsKLQljYXNlIGZkY19yZWFkaW5nX2lkOgotCQlyZXR1cm4gImZkY19yZWFkaW5nX2lkIjsKLQljYXNlIGZkY19yZWNhbGlicmF0aW5nOgotCQlyZXR1cm4gImZkY19yZWNhbGlicmF0aW5nIjsKLQljYXNlIGZkY19mb3JtYXR0aW5nOgotCQlyZXR1cm4gImZkY19mb3JtYXR0aW5nIjsKLQljYXNlIGZkY192ZXJpZnlpbmc6Ci0JCXJldHVybiAiZmRjX3ZlcmlmeWluZyI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJ1bmtub3duIjsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgZXJyb3JfY2F1c2UgZGVjb2RlX2lycV9jYXVzZShmZGNfbW9kZV9lbnVtIG1vZGUsIF9fdTggc3RbXSkKLXsKLQllcnJvcl9jYXVzZSBjYXVzZSA9IG5vX2Vycm9yOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiAgVmFsaWQgc3RbXSwgZGVjb2RlIGNhdXNlIG9mIGludGVycnVwdC4KLQkgKi8KLQlzd2l0Y2ggKHN0WzBdICYgU1QwX0lOVF9NQVNLKSB7Ci0JY2FzZSBGRENfSU5UX05PUk1BTDoKLQkJVFJBQ0UoZnRfdF9mZGNfZG1hLCJub3JtYWwgY29tcGxldGlvbjogJXMiLGZkY19tb2RlX3R4dChtb2RlKSk7Ci0JCWJyZWFrOwotCWNhc2UgRkRDX0lOVF9BQk5PUk1BTDoKLQkJVFJBQ0UoZnRfdF9mbG93LCAiYWJub3JtYWwgY29tcGxldGlvbiAlcyIsIGZkY19tb2RlX3R4dChtb2RlKSk7Ci0JCVRSQUNFKGZ0X3RfZmRjX2RtYSwgIlNUMDogMHglMDJ4LCBTVDE6IDB4JTAyeCwgU1QyOiAweCUwMngiLAotCQkgICAgICBzdFswXSwgc3RbMV0sIHN0WzJdKTsKLQkJVFJBQ0UoZnRfdF9mZGNfZG1hLAotCQkgICAgICAiQzogMHglMDJ4LCBIOiAweCUwMngsIFI6IDB4JTAyeCwgTjogMHglMDJ4IiwKLQkJICAgICAgc3RbM10sIHN0WzRdLCBzdFs1XSwgc3RbNl0pOwotCQlpZiAoc3RbMV0gJiAweDAxKSB7Ci0JCQlpZiAoc3RbMl0gJiAweDAxKSB7Ci0JCQkJY2F1c2UgPSBkYXRhX2FtX2Vycm9yOwotCQkJfSBlbHNlIHsKLQkJCQljYXVzZSA9IGlkX2FtX2Vycm9yOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0WzFdICYgMHgyMCkgewotCQkJaWYgKHN0WzJdICYgMHgyMCkgewotCQkJCWNhdXNlID0gZGF0YV9jcmNfZXJyb3I7Ci0JCQl9IGVsc2UgewotCQkJCWNhdXNlID0gaWRfY3JjX2Vycm9yOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0WzFdICYgMHgwNCkgewotCQkJY2F1c2UgPSBub19kYXRhX2Vycm9yOwotCQl9IGVsc2UgaWYgKHN0WzFdICYgMHgxMCkgewotCQkJY2F1c2UgPSBvdmVycnVuX2Vycm9yOwotCQl9Ci0JCXByaW50X2Vycm9yX2NhdXNlKGNhdXNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBGRENfSU5UX0lOVkFMSUQ6Ci0JCVRSQUNFKGZ0X3RfZmxvdywgImludmFsaWQgY29tcGxldGlvbiAlcyIsIGZkY19tb2RlX3R4dChtb2RlKSk7Ci0JCWJyZWFrOwotCWNhc2UgRkRDX0lOVF9SRUFEWUNIOgotCQlpZiAoc3RbMF0gJiBTVDBfU0VFS19FTkQpIHsKLQkJCVRSQUNFKGZ0X3RfZmxvdywgImRyaXZlIHBvbGwgY29tcGxldGVkIik7Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X2Zsb3csICJyZWFkeSBjaGFuZ2UgJXMiLGZkY19tb2RlX3R4dChtb2RlKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCVRSQUNFX0VYSVQgY2F1c2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9oaXN0b3J5KGVycm9yX2NhdXNlIGNhdXNlKQotewotCXN3aXRjaCAoY2F1c2UpIHsKLQljYXNlIGlkX2FtX2Vycm9yOgotCQlmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycysrOwotCQlicmVhazsKLQljYXNlIGlkX2NyY19lcnJvcjoKLQkJZnRfaGlzdG9yeS5pZF9jcmNfZXJyb3JzKys7Ci0JCWJyZWFrOwotCWNhc2UgZGF0YV9hbV9lcnJvcjoKLQkJZnRfaGlzdG9yeS5kYXRhX2FtX2Vycm9ycysrOwotCQlicmVhazsKLQljYXNlIGRhdGFfY3JjX2Vycm9yOgotCQlmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycysrOwotCQlicmVhazsKLQljYXNlIG92ZXJydW5fZXJyb3I6Ci0JCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMrKzsKLQkJYnJlYWs7Ci0JY2FzZSBub19kYXRhX2Vycm9yOgotCQlmdF9oaXN0b3J5Lm5vX2RhdGFfZXJyb3JzKys7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6OwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2tpcF9iYWRfc2VjdG9yKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiAgTWFyayBzZWN0b3IgYXMgc29mdCBlcnJvciBhbmQgc2tpcCBpdAotCSAqLwotCWlmIChidWZmLT5yZW1haW5pbmcgPiAwKSB7Ci0JCSsrYnVmZi0+c2VjdG9yX29mZnNldDsKLQkJKytidWZmLT5kYXRhX29mZnNldDsKLQkJLS1idWZmLT5yZW1haW5pbmc7Ci0JCWJ1ZmYtPnB0ciArPSBGVF9TRUNUT1JfU0laRTsKLQkJYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPj49IDE7Ci0JfSBlbHNlIHsKLQkJLyogIEhleSwgd2hhdCBpcyB0aGlzPz8/Pz8/Pz8/Pz8/PyBDIGNvZGU6IGlmIHdlIHNoaWZ0IAotCQkgKiAgbW9yZSB0aGFuIDMxIGJpdHMsIHdlIGdldCBubyBzaGlmdC4gVGhhdCdzIGJhZCEhISEhIQotCQkgKi8KLQkJKytidWZmLT5zZWN0b3Jfb2Zmc2V0OwkvKiBoYWNrIGZvciBlcnJvciBtYXBzICovCi0JCVRSQUNFKGZ0X3Rfd2FybiwgInNraXBwaW5nIGxhc3Qgc2VjdG9yIGluIHNlZ21lbnQiKTsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2Vycm9yX21hcHMoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYsIHVuc2lnbmVkIGludCBlcnJvcl9vZmZzZXQpCi17Ci0JaW50IGhhcmQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlpZiAoYnVmZi0+cmV0cnkgPCBGVF9TT0ZUX1JFVFJJRVMpIHsKLQkJYnVmZi0+c29mdF9lcnJvcl9tYXAgfD0gKDEgPDwgZXJyb3Jfb2Zmc2V0KTsKLQl9IGVsc2UgewotCQlidWZmLT5oYXJkX2Vycm9yX21hcCB8PSAoMSA8PCBlcnJvcl9vZmZzZXQpOwotCQlidWZmLT5zb2Z0X2Vycm9yX21hcCAmPSB+YnVmZi0+aGFyZF9lcnJvcl9tYXA7Ci0JCWJ1ZmYtPnJldHJ5ID0gLTE7ICAvKiB3aWxsIGJlIHNldCB0byAwIGluIHNldHVwX3NlZ21lbnQgKi8KLQkJaGFyZCA9IDE7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZWN0b3IgJWQgOiAlcyBlcnJvclxuIgotCSAgICAgIEtFUk5fSU5GTyAiaGFyZCBtYXA6IDB4JTA4bHhcbiIKLQkgICAgICBLRVJOX0lORk8gInNvZnQgbWFwOiAweCUwOGx4IiwKLQkgICAgICBGVF9TRUNUT1IoZXJyb3Jfb2Zmc2V0KSwgaGFyZCA/ICJoYXJkIiA6ICJzb2Z0IiwKLQkgICAgICAobG9uZykgYnVmZi0+aGFyZF9lcnJvcl9tYXAsIChsb25nKSBidWZmLT5zb2Z0X2Vycm9yX21hcCk7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfcHJvZ3Jlc3MoYnVmZmVyX3N0cnVjdCAqYnVmZiwgZXJyb3JfY2F1c2UgY2F1c2UpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCXN3aXRjaCAoY2F1c2UpIHsKLQljYXNlIG5vX2Vycm9yOiAKLQkJVFJBQ0UoZnRfdF9mbG93LCIlZCBTZWN0b3IocykgdHJhbnNmZXJyZWQiLCBidWZmLT5zZWN0b3JfY291bnQpOwotCQlicmVhazsKLQljYXNlIG5vX2RhdGFfZXJyb3I6Ci0JCVRSQUNFKGZ0X3RfZmxvdywgIlNlY3RvciAlZCBub3QgZm91bmQiLAotCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCkpOwotCQlicmVhazsKLQljYXNlIG92ZXJydW5fZXJyb3I6Ci0JCS8qICBnb3QgYW4gb3ZlcnJ1biBlcnJvciBvbiB0aGUgZmlyc3QgYnl0ZSwgbXVzdCBiZSBhCi0JCSAqICBoYXJkd2FyZSBwcm9ibGVtCi0JCSAqLwotCQlUUkFDRShmdF90X2J1ZywKLQkJICAgICAgIlVuZXhwZWN0ZWQgZXJyb3I6IGZhaWxpbmcgRE1BIG9yIEZEQyBjb250cm9sbGVyID8iKTsKLQkJYnJlYWs7Ci0JY2FzZSBkYXRhX2NyY19lcnJvcjoKLQkJVFJBQ0UoZnRfdF9mbG93LCAiRXJyb3IgaW4gc2VjdG9yICVkIiwKLQkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKSk7Ci0JCWJyZWFrOwotCWNhc2UgaWRfY3JjX2Vycm9yOgotCWNhc2UgaWRfYW1fZXJyb3I6Ci0JY2FzZSBkYXRhX2FtX2Vycm9yOgotCQlUUkFDRShmdF90X2Zsb3csICJFcnJvciBpbiBzZWN0b3IgJWQiLAotCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlUUkFDRShmdF90X2Zsb3csICJVbmV4cGVjdGVkIGVycm9yIGF0IHNlY3RvciAlZCIsCi0JCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0KSk7Ci0JCWJyZWFrOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi0vKgotICogIEVycm9yIGNhdXNlOiAgIEFtb3VudCB4ZmVycmVkOiAgQWN0aW9uOgotICoKLSAqICBpZF9hbV9lcnJvciAgICAgICAgIDAgICAgICAgICAgIG1hcmsgYmFkIGFuZCBza2lwCi0gKiAgaWRfY3JjX2Vycm9yICAgICAgICAwICAgICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcAotICogIGRhdGFfYW1fZXJyb3IgICAgICAgMCAgICAgICAgICAgbWFyayBiYWQgYW5kIHNraXAKLSAqICBkYXRhX2NyY19lcnJvciAgICAlIDEwMjQgICAgICAgIG1hcmsgYmFkIGFuZCBza2lwCi0gKiAgbm9fZGF0YV9lcnJvciAgICAgICAwICAgICAgICAgICByZXRyeSBvbiB3cml0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyayBiYWQgYW5kIHNraXAgb24gcmVhZAotICogIG92ZXJydW5fZXJyb3IgIFsgMC4uYWxsLTEgXSAgICAgbWFyayBiYWQgYW5kIHNraXAKLSAqICBub19lcnJvciAgICAgICAgICAgYWxsICAgICAgICAgIGNvbnRpbnVlCi0gKi8KLQotLyogIHRoZSBhcmcgYHNlY3RvcicgaXMgcmV0dXJuZWQgYnkgdGhlIGZkYyBhbmQgdGVsbHMgdXMgYXQgd2hpY2ggc2VjdG9yIHdlCi0gKiAgYXJlIHBvc2l0aW9uZWQgYXQgKHJlbGF0aXZlIHRvIHN0YXJ0aW5nIHNlY3RvciBvZiBzZWdtZW50KQotICovCi1zdGF0aWMgdm9pZCBkZXRlcm1pbmVfdmVyaWZ5X3Byb2dyZXNzKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsCi0JCQkJICAgICAgZXJyb3JfY2F1c2UgY2F1c2UsCi0JCQkJICAgICAgX191OCBzZWN0b3IpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWlmIChjYXVzZSA9PSBub19lcnJvciAmJiBzZWN0b3IgPT0gMSkgewotCQlidWZmLT5zZWN0b3Jfb2Zmc2V0ID0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKLQkJYnVmZi0+cmVtYWluaW5nICAgICA9IDA7Ci0JCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2Zsb3cpIHsKLQkJCXByaW50X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPSBzZWN0b3IgLSBidWZmLT5zZWN0OwotCQlidWZmLT5yZW1haW5pbmcgPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gYnVmZi0+c2VjdG9yX29mZnNldDsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIiVzc2VjdG9yIG9mZnNldDogMHglMDR4IiwgCi0JCSAgICAgIChjYXVzZSA9PSBub19lcnJvcikgPyAidW5leHBlY3RlZCAiIDogIiIsCi0JCSAgICAgIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpOwotCQlzd2l0Y2ggKGNhdXNlKSB7Ci0JCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKLQkJCWJyZWFrOwotI2lmIDAKLQkJY2FzZSBub19kYXRhX2Vycm9yOgotCQkJYnVmZi0+cmV0cnkgPSBGVF9TT0ZUX1JFVFJJRVM7Ci0JCQlpZiAoYnVmZi0+aGFyZF9lcnJvcl9tYXAgICAgJiYKLQkJCSAgICBidWZmLT5zZWN0b3Jfb2Zmc2V0ID4gMSAmJgotCQkJICAgIChidWZmLT5oYXJkX2Vycm9yX21hcCAmIAotCQkJICAgICAoMSA8PCAoYnVmZi0+c2VjdG9yX29mZnNldC0yKSkpKSB7Ci0JCQkJYnVmZi0+cmV0cnkgLS07Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZgotCQlkZWZhdWx0OgotCQkJYnVmZi0+cmV0cnkgPSBGVF9TT0ZUX1JFVFJJRVM7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9mbG93KSB7Ci0JCQlwcmludF9wcm9ncmVzcyhidWZmLCBjYXVzZSk7Ci0JCX0KLQkJLyogIFNlY3Rvcl9vZmZzZXQgcG9pbnRzIHRvIHRoZSBwcm9ibGVtIGFyZWEgTm93IGFkanVzdAotCQkgKiAgc2VjdG9yX29mZnNldCBzbyBpdCBhbHdheXMgcG9pbnRzIG9uZSBwYXN0IGhlIGZhaWxpbmcKLQkJICogIHNlY3Rvci4gSS5lLiBza2lwIHRoZSBiYWQgc2VjdG9yLgotCQkgKi8KLQkJKytidWZmLT5zZWN0b3Jfb2Zmc2V0OwotCQktLWJ1ZmYtPnJlbWFpbmluZzsKLQkJdXBkYXRlX2Vycm9yX21hcHMoYnVmZiwgYnVmZi0+c2VjdG9yX29mZnNldCAtIDEpOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgdm9pZCBkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZmVyX3N0cnVjdCAqYnVmZiwKLQkJCSAgICAgICBlcnJvcl9jYXVzZSBjYXVzZSwKLQkJCSAgICAgICBfX3U4IHNlY3RvcikKLXsKLQl1bnNpZ25lZCBpbnQgZG1hX3Jlc2lkdWU7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qICBVc2luZyBsZXNzIHByZWZlcnJlZCBvcmRlciBvZiBkaXNhYmxlX2RtYSBhbmQKLQkgKiAgZ2V0X2RtYV9yZXNpZHVlIGJlY2F1c2UgdGhpcyBzZWVtcyB0byBmYWlsIG9uIGF0IGxlYXN0IG9uZQotCSAqICBzeXN0ZW0gaWYgcmV2ZXJzZWQhCi0JICovCi0JZG1hX3Jlc2lkdWUgPSBnZXRfZG1hX3Jlc2lkdWUoZmRjLmRtYSk7Ci0JZGlzYWJsZV9kbWEoZmRjLmRtYSk7Ci0JaWYgKGNhdXNlICE9IG5vX2Vycm9yIHx8IGRtYV9yZXNpZHVlICE9IDApIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIiVzRE1BIHJlc2lkdWU6IDB4JTA0eCIsIAotCQkgICAgICAoY2F1c2UgPT0gbm9fZXJyb3IpID8gInVuZXhwZWN0ZWQgIiA6ICIiLAotCQkgICAgICBkbWFfcmVzaWR1ZSk7Ci0JCS8qIGFkanVzdCB0byBhY3R1YWwgdmFsdWU6ICovCi0JCWlmIChkbWFfcmVzaWR1ZSA9PSAwKSB7Ci0JCQkvKiB0aGlzIGhhcHBlbnMgc29tZXRpbWVzIHdpdGggb3ZlcnJ1biBlcnJvcnMuCi0JCQkgKiBJIGRvbid0IGtub3cgd2hldGhlciB3ZSBjb3VsZCBpZ25vcmUgdGhlCi0JCQkgKiBvdmVycnVuIGVycm9yLiBQbGF5IHNhdmUuCi0JCQkgKi8KLQkJCWJ1ZmYtPnNlY3Rvcl9jb3VudCAtLTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmYtPnNlY3Rvcl9jb3VudCAtPSAoKGRtYV9yZXNpZHVlICsgCi0JCQkJCQkoRlRfU0VDVE9SX1NJWkUgLSAxKSkgLwotCQkJCQkgICAgICAgRlRfU0VDVE9SX1NJWkUpOwotCQl9Ci0JfQotCS8qICBVcGRhdGUgdmFyJ3MgaW5mbHVlbmNlZCBieSB0aGUgRE1BIG9wZXJhdGlvbi4KLQkgKi8KLQlpZiAoYnVmZi0+c2VjdG9yX2NvdW50ID4gMCkgewotCQlidWZmLT5zZWN0b3Jfb2Zmc2V0ICAgKz0gYnVmZi0+c2VjdG9yX2NvdW50OwotCQlidWZmLT5kYXRhX29mZnNldCAgICAgKz0gYnVmZi0+c2VjdG9yX2NvdW50OwotCQlidWZmLT5wdHIgICAgICAgICAgICAgKz0gKGJ1ZmYtPnNlY3Rvcl9jb3VudCAqCi0JCQkJCSAgRlRfU0VDVE9SX1NJWkUpOwotCQlidWZmLT5yZW1haW5pbmcgICAgICAgLT0gYnVmZi0+c2VjdG9yX2NvdW50OwotCQlidWZmLT5iYWRfc2VjdG9yX21hcCA+Pj0gYnVmZi0+c2VjdG9yX2NvdW50OwotCX0KLQlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9mbG93KSB7Ci0JCXByaW50X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKTsKLQl9Ci0JaWYgKGNhdXNlICE9IG5vX2Vycm9yKSB7Ci0JCWlmIChidWZmLT5yZW1haW5pbmcgPT0gMCkgewotCQkJVFJBQ0UoZnRfdF93YXJuLCAiZm9vP1xuIgotCQkJICAgICAgS0VSTl9JTkZPICJjb3VudCA6ICVkXG4iCi0JCQkgICAgICBLRVJOX0lORk8gIm9mZnNldDogJWRcbiIKLQkJCSAgICAgIEtFUk5fSU5GTyAic29mdCAgOiAlMDh4XG4iCi0JCQkgICAgICBLRVJOX0lORk8gImhhcmQgIDogJTA4eCIsCi0JCQkgICAgICBidWZmLT5zZWN0b3JfY291bnQsCi0JCQkgICAgICBidWZmLT5zZWN0b3Jfb2Zmc2V0LAotCQkJICAgICAgYnVmZi0+c29mdF9lcnJvcl9tYXAsCi0JCQkgICAgICBidWZmLT5oYXJkX2Vycm9yX21hcCk7Ci0JCX0KLQkJLyogIFNlY3Rvcl9vZmZzZXQgcG9pbnRzIHRvIHRoZSBwcm9ibGVtIGFyZWEsIGV4Y2VwdCBpZiB3ZSBnb3QKLQkJICogIGEgZGF0YV9jcmNfZXJyb3IuIEluIHRoYXQgY2FzZSBpdCBwb2ludHMgb25lIHBhc3QgdGhlCi0JCSAqICBmYWlsaW5nIHNlY3Rvci4KLQkJICoKLQkJICogIE5vdyBhZGp1c3Qgc2VjdG9yX29mZnNldCBzbyBpdCBhbHdheXMgcG9pbnRzIG9uZSBwYXN0IGhlCi0JCSAqICBmYWlsaW5nIHNlY3Rvci4gSS5lLiBza2lwIHRoZSBiYWQgc2VjdG9yLiAgCi0JCSAqLwotCQlpZiAoY2F1c2UgIT0gZGF0YV9jcmNfZXJyb3IpIHsKLQkJCXNraXBfYmFkX3NlY3RvcihidWZmKTsKLQkJfQotCQl1cGRhdGVfZXJyb3JfbWFwcyhidWZmLCBidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FsY19zdGVwcyhpbnQgY21kKQotewotCWlmIChmdGFwZV9jdXJyZW50X2N5bGluZGVyID4gY21kKSB7Ci0JCXJldHVybiBmdGFwZV9jdXJyZW50X2N5bGluZGVyIC0gY21kOwotCX0gZWxzZSB7Ci0JCXJldHVybiBmdGFwZV9jdXJyZW50X2N5bGluZGVyICsgY21kOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcGF1c2VfdGFwZShpbnQgcmV0cnksIGludCBtb2RlKQotewotCWludCByZXN1bHQ7Ci0JX191OCBvdXRbM10gPSB7RkRDX1NFRUssIGZ0X2RyaXZlX3NlbCwgMH07Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qICBXZSdsbCB1c2UgYSByYXcgc2VlayBjb21tYW5kIHRvIGdldCB0aGUgdGFwZSB0byByZXdpbmQgYW5kCi0JICogIHN0b3AgZm9yIGEgcmV0cnkuCi0JICovCi0JKytmdF9oaXN0b3J5LnJld2luZHM7Ci0JaWYgKHFpYzExN19jbWRzW2Z0YXBlX2N1cnJlbnRfY29tbWFuZF0ubm9uX2ludHIpIHsKLQkJVFJBQ0UoZnRfdF93YXJuLCAibW90aW9uIGNvbW1hbmQgbWF5IGJlIGlzc3VlZCB0b28gc29vbiIpOwotCX0KLQlpZiAocmV0cnkgJiYgKG1vZGUgPT0gZmRjX3JlYWRpbmdfZGF0YSB8fAotCQkgICAgICBtb2RlID09IGZkY19yZWFkaW5nX2lkICAgfHwKLQkJICAgICAgbW9kZSA9PSBmZGNfdmVyaWZ5aW5nKSkgewotCQlmdGFwZV9jdXJyZW50X2NvbW1hbmQgPSBRSUNfTUlDUk9fU1RFUF9QQVVTRTsKLQkJZnRhcGVfbWlnaHRfYmVfb2ZmX3RyYWNrID0gMTsKLQl9IGVsc2UgewotCQlmdGFwZV9jdXJyZW50X2NvbW1hbmQgPSBRSUNfUEFVU0U7Ci0JfQotCW91dFsyXSA9IGNhbGNfc3RlcHMoZnRhcGVfY3VycmVudF9jb21tYW5kKTsKLQlyZXN1bHQgPSBmZGNfY29tbWFuZChvdXQsIDMpOyAvKiBpc3N1ZSBRSUNfMTE3IGNvbW1hbmQgKi8KLQlmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gb3V0WyAyXTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAicWljLXBhdXNlIGZhaWxlZCwgc3RhdHVzID0gJWQiLCByZXN1bHQpOwotCX0gZWxzZSB7Ci0JCWZ0X2xvY2F0aW9uLmtub3duICA9IDA7Ci0JCWZ0X3J1bm5lcl9zdGF0dXMgICA9IGlkbGU7Ci0JCWZ0X2hpZGVfaW50ZXJydXB0ICAgICA9IDE7Ci0JCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnRpbnVlX3hmZXIoYnVmZmVyX3N0cnVjdCAqYnVmZiwKLQkJCSAgZmRjX21vZGVfZW51bSBtb2RlLCAKLQkJCSAgdW5zaWduZWQgaW50IHNraXApCi17Ci0JaW50IHdyaXRlID0gMDsKLSAJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWlmIChtb2RlID09IGZkY193cml0aW5nX2RhdGEgfHwgbW9kZSA9PSBmZGNfZGVsZXRpbmcpIHsKLQkJd3JpdGUgPSAxOwotCX0KLQkvKiAgVGhpcyBwYXJ0IGNhbiBiZSByZW1vdmVkIGlmIGl0IG5ldmVyIGhhcHBlbnMKLQkgKi8KLQlpZiAoc2tpcCA+IDAgJiYKLQkgICAgKGZ0X3J1bm5lcl9zdGF0dXMgIT0gcnVubmluZyB8fAotCSAgICAgKHdyaXRlICYmIChidWZmLT5zdGF0dXMgIT0gd3JpdGluZykpIHx8Ci0JICAgICAoIXdyaXRlICYmIChidWZmLT5zdGF0dXMgIT0gcmVhZGluZyAmJiAKLQkJCSBidWZmLT5zdGF0dXMgIT0gdmVyaWZ5aW5nKSkpKSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAidW5leHBlY3RlZCBydW5uZXIvYnVmZmVyIHN0YXRlICVkLyVkIiwKLQkJICAgICAgZnRfcnVubmVyX3N0YXR1cywgYnVmZi0+c3RhdHVzKTsKLQkJYnVmZi0+c3RhdHVzID0gZXJyb3I7Ci0JCS8qIGZpbmlzaCB0aGlzIGJ1ZmZlcjogKi8KLQkJKHZvaWQpZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfaGVhZCk7Ci0JCWZ0X3J1bm5lcl9zdGF0dXMgPSBhYm9ydGluZzsKLQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOwotCX0gZWxzZSBpZiAoYnVmZi0+cmVtYWluaW5nID4gMCAmJiBmdGFwZV9jYWxjX25leHRfY2x1c3RlcihidWZmKSA+IDApIHsKLQkJLyogIHN0aWxsIHNlY3RvcnMgbGVmdCBpbiBjdXJyZW50IHNlZ21lbnQsIGNvbnRpbnVlCi0JCSAqICB3aXRoIHRoaXMgc2VnbWVudAotCQkgKi8KLQkJaWYgKGZkY19zZXR1cF9yZWFkX3dyaXRlKGJ1ZmYsIG1vZGUpIDwgMCkgewotCQkJLyogZmFpbGVkLCBhYm9ydCBvcGVyYXRpb24KLQkJCSAqLwotCQkJYnVmZi0+Ynl0ZXMgPSBidWZmLT5wdHIgLSBidWZmLT5hZGRyZXNzOwotCQkJYnVmZi0+c3RhdHVzID0gZXJyb3I7Ci0JCQkvKiBmaW5pc2ggdGhpcyBidWZmZXI6ICovCi0JCQkodm9pZClmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKLQkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBhYm9ydGluZzsKLQkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIGN1cnJlbnQgc2VnbWVudCBjb21wbGV0ZWQKLQkJICovCi0JCXVuc2lnbmVkIGludCBsYXN0X3NlZ21lbnQgPSBidWZmLT5zZWdtZW50X2lkOwotCQlpbnQgZW90ID0gKChsYXN0X3NlZ21lbnQgKyAxKSAlIGZ0X3NlZ21lbnRzX3Blcl90cmFjaykgPT0gMDsKLQkJdW5zaWduZWQgaW50IG5leHQgPSBidWZmLT5uZXh0X3NlZ21lbnQ7CS8qIDAgbWVhbnMgc3RvcCAhICovCi0KLQkJYnVmZi0+Ynl0ZXMgPSBidWZmLT5wdHIgLSBidWZmLT5hZGRyZXNzOwotCQlidWZmLT5zdGF0dXMgPSBkb25lOwotCQlidWZmID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfaGVhZCk7Ci0JCWlmIChlb3QpIHsKLQkJCS8qICBmaW5pc2hlZCBsYXN0IHNlZ21lbnQgb24gY3VycmVudCB0cmFjaywKLQkJCSAqICBjYW4ndCBjb250aW51ZQotCQkJICovCi0JCQlmdF9ydW5uZXJfc3RhdHVzID0gbG9naWNhbF9lb3Q7Ci0JCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7Ci0JCQlUUkFDRV9FWElUOwotCQl9Ci0JCWlmIChuZXh0IDw9IDApIHsKLQkJCS8qICBkb24ndCBjb250aW51ZSB3aXRoIG5leHQgc2VnbWVudAotCQkJICovCi0JCQlUUkFDRShmdF90X25vaXNlLCAibm8gJXMgYWxsb3dlZCwgc3RvcHBpbmcgdGFwZSIsCi0JCQkgICAgICAod3JpdGUpID8gIndyaXRlIG5leHQiIDogInJlYWQgYWhlYWQiKTsKLQkJCXBhdXNlX3RhcGUoMCwgbW9kZSk7Ci0JCQlmdF9ydW5uZXJfc3RhdHVzID0gaWRsZTsgIC8qICBub3QgcXVpdGUgdHJ1ZSB1bnRpbAotCQkJCQkJICAgKiAgbmV4dCBpcnEgCi0JCQkJCQkgICAqLwotCQkJVFJBQ0VfRVhJVDsKLQkJfQotCQkvKiAgY29udGludWUgd2l0aCBuZXh0IHNlZ21lbnQKLQkJICovCi0JCWlmIChidWZmLT5zdGF0dXMgIT0gd2FpdGluZykgewotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImFsbCBpbnB1dCBidWZmZXJzICVzLCBwYXVzaW5nIHRhcGUiLAotCQkJICAgICAgKHdyaXRlKSA/ICJlbXB0eSIgOiAiZnVsbCIpOwotCQkJcGF1c2VfdGFwZSgwLCBtb2RlKTsKLQkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBpZGxlOyAgLyogIG5vdCBxdWl0ZSB0cnVlIHVudGlsCi0JCQkJCQkgICAqICBuZXh0IGlycSAKLQkJCQkJCSAgICovCi0JCQlUUkFDRV9FWElUOwotCQl9Ci0JCWlmICh3cml0ZSAmJiBuZXh0ICE9IGJ1ZmYtPnNlZ21lbnRfaWQpIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsIAotCQkJICAgICAgInNlZ21lbnRzIG91dCBvZiBvcmRlciwgYWJvcnRpbmcgd3JpdGUiKTsKLQkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKLQkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKLQkJCVRSQUNFX0VYSVQ7Ci0JCX0KLQkJZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoYnVmZiwgbmV4dCwgMCk7Ci0JCWlmIChzdG9wX3JlYWRfYWhlYWQpIHsKLQkJCWJ1ZmYtPm5leHRfc2VnbWVudCA9IDA7Ci0JCQlzdG9wX3JlYWRfYWhlYWQgPSAwOwotCQl9Ci0JCWlmIChmdGFwZV9jYWxjX25leHRfY2x1c3RlcihidWZmKSA9PSAwIHx8Ci0JCSAgICBmZGNfc2V0dXBfcmVhZF93cml0ZShidWZmLCBtb2RlKSAhPSAwKSB7Ci0JCQlUUkFDRShmdF90X2VyciwgImNvdWxkbid0IHN0YXJ0ICVzLWFoZWFkIiwKLQkJCSAgICAgIHdyaXRlID8gIndyaXRlIiA6ICJyZWFkIik7Ci0JCQlmdF9ydW5uZXJfc3RhdHVzID0gZG9fYWJvcnQ7Ci0JCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBrZWVwIG9uIGdvaW5nICovCi0JCQlzd2l0Y2ggKGZ0X2RyaXZlcl9zdGF0ZSkgewotCQkJY2FzZSAgIHJlYWRpbmc6IGJ1ZmYtPnN0YXR1cyA9IHJlYWRpbmc7ICAgYnJlYWs7Ci0JCQljYXNlIHZlcmlmeWluZzogYnVmZi0+c3RhdHVzID0gdmVyaWZ5aW5nOyBicmVhazsKLQkJCWNhc2UgICB3cml0aW5nOiBidWZmLT5zdGF0dXMgPSB3cml0aW5nOyAgIGJyZWFrOwotCQkJY2FzZSAgZGVsZXRpbmc6IGJ1ZmYtPnN0YXR1cyA9IGRlbGV0aW5nOyAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVRSQUNFKGZ0X3RfZXJyLCAKLQkJICAgICAgIkJVRzogZnRfZHJpdmVyX3N0YXRlICVkIHNob3VsZCBiZSBvbmUgb3V0IG9mICIKLQkJICAgICAgIntyZWFkaW5nLCB3cml0aW5nLCB2ZXJpZnlpbmcsIGRlbGV0aW5nfSIsCi0JCQkJICAgICAgZnRfZHJpdmVyX3N0YXRlKTsKLQkJCQlidWZmLT5zdGF0dXMgPSB3cml0ZSA/IHdyaXRpbmcgOiByZWFkaW5nOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJldHJ5X3NlY3RvcihidWZmZXJfc3RydWN0ICpidWZmLCAKLQkJCSBpbnQgbW9kZSwKLQkJCSB1bnNpZ25lZCBpbnQgc2tpcCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIiVzIGVycm9yLCB3aWxsIHJldHJ5IiwKLQkgICAgICAobW9kZSA9PSBmZGNfd3JpdGluZ19kYXRhIHx8IG1vZGUgPT0gZmRjX2RlbGV0aW5nKSA/ICJ3cml0ZSIgOiAicmVhZCIpOwotCXBhdXNlX3RhcGUoMSwgbW9kZSk7Ci0JZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOwotCWJ1ZmYtPnN0YXR1cyAgICAgPSBlcnJvcjsKLQlidWZmLT5za2lwICAgICAgID0gc2tpcDsKLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGZpbmRfcmVzdW1lX3BvaW50KGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYpCi17Ci0JaW50IGkgPSAwOwotCVNlY3Rvck1hcCBtYXNrOwotCVNlY3Rvck1hcCBtYXA7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgdmFyaWFibGVzIGhhdmUgYmVlbgotCSAqICB1cGRhdGVkIHRvIHBvaW50IHBhc3QgdGhlIGZhaWxpbmcgc2VjdG9yLgotCSAqICBJZiB0aGVyZSBhcmUgYW55IHNvZnQgZXJyb3JzIGJlZm9yZSB0aGUgZmFpbGluZyBzZWN0b3IsCi0JICogIGZpbmQgdGhlIGZpcnN0IHNvZnQgZXJyb3IgYW5kIHJldHVybiB0aGUgc2VjdG9yIG9mZnNldC4KLQkgKiAgT3RoZXJ3aXNlIGZpbmQgdGhlIGxhc3QgaGFyZCBlcnJvci4KLQkgKiAgTm90ZTogdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgaGFyZCBvciBzb2Z0IGVycm9yICEKLQkgKi8KLQlpZiAoYnVmZi0+c2VjdG9yX29mZnNldCA8IDEgfHwgYnVmZi0+c2VjdG9yX29mZnNldCA+IDMyKSB7Ci0JCVRSQUNFKGZ0X3RfYnVnLCAiQlVHOiBzZWN0b3Jfb2Zmc2V0ID0gJWQiLAotCQkgICAgICBidWZmLT5zZWN0b3Jfb2Zmc2V0KTsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlpZiAoYnVmZi0+c2VjdG9yX29mZnNldCA+PSAzMikgeyAvKiBDLWxpbWl0YXRpb24gb24gc2hpZnQgISAqLwotCQltYXNrID0gMHhmZmZmZmZmZjsKLQl9IGVsc2UgewotCQltYXNrID0gKDEgPDwgYnVmZi0+c2VjdG9yX29mZnNldCkgLSAxOwotCX0KLQltYXAgPSBidWZmLT5zb2Z0X2Vycm9yX21hcCAmIG1hc2s7Ci0JaWYgKG1hcCkgewotCQl3aGlsZSAoKG1hcCAmICgxIDw8IGkpKSA9PSAwKSB7Ci0JCQkrK2k7Ci0JCX0KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImF0IHNlY3RvciAlZCIsIEZUX1NFQ1RPUihpKSk7Ci0JfSBlbHNlIHsKLQkJbWFwID0gYnVmZi0+aGFyZF9lcnJvcl9tYXAgJiBtYXNrOwotCQlpID0gYnVmZi0+c2VjdG9yX29mZnNldCAtIDE7Ci0JCWlmIChtYXApIHsKLQkJCXdoaWxlICgobWFwICYgKDEgPDwgaSkpID09IDApIHsKLQkJCQktLWk7Ci0JCQl9Ci0JCQlUUkFDRShmdF90X25vaXNlLCAiYWZ0ZXIgc2VjdG9yICVkIiwgRlRfU0VDVE9SKGkpKTsKLQkJCSsraTsgLyogZmlyc3Qgc2VjdG9yIGFmdGVyIGxhc3QgaGFyZCBlcnJvciAqLwotCQl9IGVsc2UgewotCQkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IG5vIHNvZnQgb3IgaGFyZCBlcnJvcnMiKTsKLQkJfQotCX0KLQlUUkFDRV9FWElUIGk7Ci19Ci0KLS8qICBjaGVjayBwb3NzaWJsZSBkbWEgcmVzaWR1ZSB3aGVuIGZvcm1hdHRpbmcsIHVwZGF0ZSBwb3NpdGlvbiByZWNvcmQgaW4KLSAqICBidWZmZXIgc3RydWN0LiBUaGlzIGlzLCBvZiBjb3Vyc2UsIG1vZGVsbGVkIGFmdGVyIGRldGVybWluZV9wcm9ncmVzcygpLCBidXQKLSAqICB3ZSBkb24ndCBuZWVkIHRvIHNldCB1cCBmb3IgcmV0cmllcyBiZWNhdXNlIHRoZSBmb3JtYXQgcHJvY2VzcyBjYW5ub3QgYmUKLSAqICBpbnRlcnJ1cHRlZCAoZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIHRhcGUgdHJhY2spLgotICovCi1zdGF0aWMgaW50IGRldGVybWluZV9mbXRfcHJvZ3Jlc3MoYnVmZmVyX3N0cnVjdCAqYnVmZiwgZXJyb3JfY2F1c2UgY2F1c2UpCi17Ci0JdW5zaWduZWQgaW50IGRtYV9yZXNpZHVlOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiAgVXNpbmcgbGVzcyBwcmVmZXJyZWQgb3JkZXIgb2YgZGlzYWJsZV9kbWEgYW5kCi0JICogIGdldF9kbWFfcmVzaWR1ZSBiZWNhdXNlIHRoaXMgc2VlbXMgdG8gZmFpbCBvbiBhdCBsZWFzdCBvbmUKLQkgKiAgc3lzdGVtIGlmIHJldmVyc2VkIQotCSAqLwotCWRtYV9yZXNpZHVlID0gZ2V0X2RtYV9yZXNpZHVlKGZkYy5kbWEpOwotCWRpc2FibGVfZG1hKGZkYy5kbWEpOwotCWlmIChjYXVzZSAhPSBub19lcnJvciB8fCBkbWFfcmVzaWR1ZSAhPSAwKSB7Ci0JCVRSQUNFKGZ0X3RfaW5mbywgIkRNQSByZXNpZHVlID0gMHglMDR4IiwgZG1hX3Jlc2lkdWUpOwotCQlmZGNfbW9kZSA9IGZkY19pZGxlOwotCQlzd2l0Y2goY2F1c2UpIHsKLQkJY2FzZSBub19lcnJvcjoKLQkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBhYm9ydGluZzsKLQkJCWJ1ZmYtPnN0YXR1cyA9IGlkbGU7Ci0JCQlicmVhazsKLQkJY2FzZSBvdmVycnVuX2Vycm9yOgotCQkJLyogIGdvdCBhbiBvdmVycnVuIGVycm9yIG9uIHRoZSBmaXJzdCBieXRlLCBtdXN0IGJlIGEKLQkJCSAqICBoYXJkd2FyZSBwcm9ibGVtIAotCQkJICovCi0JCQlUUkFDRShmdF90X2J1ZywgCi0JCQkgICAgICAiVW5leHBlY3RlZCBlcnJvcjogZmFpbGluZyBETUEgY29udHJvbGxlciA/Iik7Ci0JCQlmdF9ydW5uZXJfc3RhdHVzID0gZG9fYWJvcnQ7Ci0JCQlidWZmLT5zdGF0dXMgPSBlcnJvcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIlVuZXhwZWN0ZWQgZXJyb3IgYXQgc2VnbWVudCAlZCIsCi0JCQkgICAgICBidWZmLT5zZWdtZW50X2lkKTsKLQkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKLQkJCWJ1ZmYtPnN0YXR1cyA9IGVycm9yOwotCQkJYnJlYWs7Ci0JCX0KLQkJVFJBQ0VfRVhJVCAtRUlPOyAvKiBjYW4gb25seSByZXRyeSBlbnRpcmUgdHJhY2sgaW4gZm9ybWF0IG1vZGUKLQkJCQkgICovCi0JfQotCS8qICBVcGRhdGUgdmFyJ3MgaW5mbHVlbmNlZCBieSB0aGUgRE1BIG9wZXJhdGlvbi4KLQkgKi8KLQlidWZmLT5wdHIgICAgICAgICAgICAgKz0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAqIDQ7Ci0JYnVmZi0+Ynl0ZXMgICAgICAgICAgIC09IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgKiA0OwotCWJ1ZmYtPnJlbWFpbmluZyAgICAgICAtPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOwotCWJ1ZmYtPnNlZ21lbnRfaWQgKys7IC8qIGRvbmUgd2l0aCBzZWdtZW50ICovCi0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKgotICogIENvbnRpbnVlIGZvcm1hdHRpbmcsIHN3aXRjaCBidWZmZXJzIGlmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdCBpbgotICogIGN1cnJlbnQgYnVmZmVyLiBUaGlzIGlzLCBvZiBjb3Vyc2UsIG1vZGVsbGVkIGFmdGVyCi0gKiAgY29udGludWVfeGZlcigpLCBidXQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgZm9yIHJldHJpZXMgYmVjYXVzZQotICogIHRoZSBmb3JtYXQgcHJvY2VzcyBjYW5ub3QgYmUgaW50ZXJydXB0ZWQgKGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZQotICogIHRhcGUgdHJhY2spLgotICovCi1zdGF0aWMgdm9pZCBjb250aW51ZV9mb3JtYXR0aW5nKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWlmIChidWZmLT5yZW1haW5pbmcgPD0gMCkgeyAvKiAgbm8gc3BhY2UgbGVmdCBpbiBkbWEgYnVmZmVyICovCi0JCXVuc2lnbmVkIGludCBuZXh0ID0gYnVmZi0+bmV4dF9zZWdtZW50OyAKLQotCQlpZiAobmV4dCA9PSAwKSB7IC8qIGVuZCBvZiB0YXBlIHRyYWNrICovCi0JCQlidWZmLT5zdGF0dXMgICAgID0gZG9uZTsKLQkJCWZ0X3J1bm5lcl9zdGF0dXMgPSBsb2dpY2FsX2VvdDsKLQkJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJEb25lIGZvcm1hdHRpbmcgdHJhY2sgJWQiLAotCQkJICAgICAgZnRfbG9jYXRpb24udHJhY2spOwotCQkJVFJBQ0VfRVhJVDsKLQkJfQotCQkvKgotCQkgKiAgc3dpdGNoIHRvIG5leHQgYnVmZmVyIQotCQkgKi8KLQkJYnVmZi0+c3RhdHVzICAgPSBkb25lOwotCQlidWZmID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfaGVhZCk7Ci0KLQkJaWYgKGJ1ZmYtPnN0YXR1cyAhPSB3YWl0aW5nICB8fCBuZXh0ICE9IGJ1ZmYtPnNlZ21lbnRfaWQpIHsKLQkJCWdvdG8gZm9ybWF0X3NldHVwX2Vycm9yOwotCQl9Ci0JfQotCWlmIChmZGNfc2V0dXBfZm9ybWF0dGluZyhidWZmKSA8IDApIHsKLQkJZ290byBmb3JtYXRfc2V0dXBfZXJyb3I7Ci0JfQotCWJ1ZmYtPnN0YXR1cyA9IGZvcm1hdHRpbmc7Ci0JVFJBQ0UoZnRfdF9mZGNfZG1hLCAiRm9ybWF0dGluZyBzZWdtZW50ICVkIG9uIHRyYWNrICVkIiwKLQkgICAgICBidWZmLT5zZWdtZW50X2lkLCBmdF9sb2NhdGlvbi50cmFjayk7Ci0JVFJBQ0VfRVhJVDsKLSBmb3JtYXRfc2V0dXBfZXJyb3I6Ci0JZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OwotCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKLQlidWZmLT5zdGF0dXMgICAgID0gZXJyb3I7Ci0JVFJBQ0UoZnRfdF9lcnIsICJFcnJvciBzZXR0aW5nIHVwIGZvciBzZWdtZW50ICVkIG9uIHRyYWNrICVkIiwKLQkgICAgICBidWZmLT5zZWdtZW50X2lkLCBmdF9sb2NhdGlvbi50cmFjayk7Ci0JVFJBQ0VfRVhJVDsKLQotfQotCi0vKiAgdGhpcyBoYW5kbGVzIHdyaXRpbmcsIHJlYWQgaWQsIHJlYWRpbmcgYW5kIGZvcm1hdHRpbmcKLSAqLwotc3RhdGljIHZvaWQgaGFuZGxlX2ZkY19idXN5KGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYpCi17Ci0Jc3RhdGljIGludCBub19kYXRhX2Vycm9yX2NvdW50OwotCWludCByZXRyeSA9IDA7Ci0JZXJyb3JfY2F1c2UgY2F1c2U7Ci0JX191OCBpbls3XTsKLQlpbnQgc2tpcDsKLQlmZGNfbW9kZV9lbnVtIGZtb2RlID0gZmRjX21vZGU7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWlmIChmZGNfcmVzdWx0KGluLCA3KSA8IDApIHsgLyogYmV0dGVyIGdldCBpdCBmYXN0ICEgKi8KLQkJVFJBQ0UoZnRfdF9lcnIsIAotCQkgICAgICAiUHJvYmFibHkgZmF0YWwgZXJyb3IgZHVyaW5nIEZEQyBSZXN1bHQgUGhhc2VcbiIKLQkJICAgICAgS0VSTl9JTkZPCi0JCSAgICAgICJkcml2ZSBtYXkgaGFuZyB1bnRpbCAocG93ZXIgb24pIHJlc2V0IDotKCIpOwotCQkvKiAgd2hhdCB0byBkbyBuZXh0ID8/Pz8KLQkJICovCi0JCVRSQUNFX0VYSVQ7Ci0JfQotCWNhdXNlID0gZGVjb2RlX2lycV9jYXVzZShmZGNfbW9kZSwgaW4pOwotI2lmZGVmIFRFU1RJTkcKLQl7IGludCBpOwotCWZvciAoaSA9IDA7IGkgPCAoaW50KWZ0X25yX2J1ZmZlcnM7ICsraSkKLQkJVFJBQ0UoZnRfdF9hbnksICJidWZmZXJbJWRdIHN0YXR1czogJWQsIHNlZ21lbnRfaWQ6ICVkIiwKLQkJICAgICAgaSwgZnRfYnVmZmVyW2ldLT5zdGF0dXMsIGZ0X2J1ZmZlcltpXS0+c2VnbWVudF9pZCk7Ci0JfQotI2VuZGlmCi0JaWYgKGZtb2RlID09IGZkY19yZWFkaW5nX2RhdGEgJiYgZnRfZHJpdmVyX3N0YXRlID09IHZlcmlmeWluZykgewotCQlmbW9kZSA9IGZkY192ZXJpZnlpbmc7Ci0JfQotCXN3aXRjaCAoZm1vZGUpIHsKLQljYXNlIGZkY192ZXJpZnlpbmc6Ci0JCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nIHx8Ci0JCSAgICBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCJhYm9ydGluZyAlcyIsZmRjX21vZGVfdHh0KGZkY19tb2RlKSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYnVmZi0+cmV0cnkgPiAwKSB7Ci0JCQlUUkFDRShmdF90X2Zsb3csICJ0aGlzIGlzIHJldHJ5IG5yICVkIiwgYnVmZi0+cmV0cnkpOwotCQl9Ci0JCXN3aXRjaCAoY2F1c2UpIHsKLQkJY2FzZSBub19lcnJvcjoKLQkJCW5vX2RhdGFfZXJyb3JfY291bnQgPSAwOwotCQkJZGV0ZXJtaW5lX3ZlcmlmeV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOwotCQkJaWYgKGluWzJdICYgMHg0MCkgewotCQkJCS8qICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdoZW4gdmVyaWZ5aW5nCi0JCQkJICovCi0JCQkJVFJBQ0UoZnRfdF93YXJuLAotCQkJCSAgICAgICJkZWxldGVkIGRhdGEgaW4gc2VnbWVudCAlZC8lZCIsCi0JCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCwKLQkJCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCAtIDEpKTsKLQkJCQlidWZmLT5yZW1haW5pbmcgPSAwOyAvKiBhYm9ydCB0cmFuc2ZlciAqLwotCQkJCWJ1ZmYtPmhhcmRfZXJyb3JfbWFwID0gRU1QVFlfU0VHTUVOVDsKLQkJCQlza2lwID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2tpcCA9IDA7Ci0JCQl9Ci0JCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKLQkJCWJyZWFrOwotCQljYXNlIG5vX2RhdGFfZXJyb3I6Ci0JCQlub19kYXRhX2Vycm9yX2NvdW50ICsrOwotCQljYXNlIG92ZXJydW5fZXJyb3I6Ci0JCQlyZXRyeSArKzsKLQkJY2FzZSBpZF9hbV9lcnJvcjoKLQkJY2FzZSBpZF9jcmNfZXJyb3I6Ci0JCWNhc2UgZGF0YV9hbV9lcnJvcjoKLQkJY2FzZSBkYXRhX2NyY19lcnJvcjoKLQkJCWRldGVybWluZV92ZXJpZnlfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsgCi0JCQlpZiAoY2F1c2UgPT0gbm9fZGF0YV9lcnJvcikgewotCQkJCWlmIChub19kYXRhX2Vycm9yX2NvdW50ID49IDIpIHsKLQkJCQkJVFJBQ0UoZnRfdF93YXJuLAotCQkJCQkgICAgICAicmV0cnlpbmcgYmVjYXVzZSBvZiBzdWNjZXNzaXZlICIKLQkJCQkJICAgICAgIm5vIGRhdGEgZXJyb3JzIik7Ci0JCQkJCW5vX2RhdGFfZXJyb3JfY291bnQgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHJ5IC0tOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbm9fZGF0YV9lcnJvcl9jb3VudCA9IDA7Ci0JCQl9Ci0JCQlpZiAocmV0cnkpIHsKLQkJCQlza2lwID0gZmluZF9yZXN1bWVfcG9pbnQoYnVmZik7Ci0JCQl9IGVsc2UgewotCQkJCXNraXAgPSBidWZmLT5zZWN0b3Jfb2Zmc2V0OwotCQkJfQotCQkJaWYgKHJldHJ5ICYmIHNraXAgPCAzMikgewotCQkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIHNraXApOwotCQkJfQotCQkJdXBkYXRlX2hpc3RvcnkoY2F1c2UpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiAgRG9uJ3Qga25vdyB3aHkgdGhpcyBjb3VsZCBoYXBwZW4gCi0JCQkgKiAgYnV0IGZpbmQgb3V0LgotCQkJICovCi0JCQlkZXRlcm1pbmVfdmVyaWZ5X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7Ci0JCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIDApOwotCQkJVFJBQ0UoZnRfdF9lcnIsICJFcnJvcjogdW5leHBlY3RlZCBlcnJvciIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBmZGNfcmVhZGluZ19kYXRhOgotI2lmZGVmIFRFU1RJTkcKLQkJLyogSSdtIHNvcnJ5LCBidXQ6IE5PQk9EWSBldmVyIHVzZWQgdGhpcyB0cmFjZQotCQkgKiBtZXNzYWdlcyBmb3IgYWdlcy4gSSBndWVzcyB0aGF0IEJhcyB3YXMgdGhlIGxhc3QgcGVyc29uCi0JCSAqIHRoYXQgZXZlciByZWFsbHkgdXNlZCB0aGlzICh0aGFuayB5b3UsIGJldHdlZW4gdGhlIGxpbmVzKQotCQkgKi8KLQkJaWYgKGNhdXNlID09IG5vX2Vycm9yKSB7Ci0JCQlUUkFDRShmdF90X2Zsb3csInJlYWRpbmcgc2VnbWVudCAlZCIsYnVmZi0+c2VnbWVudF9pZCk7Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAiZXJyb3IgcmVhZGluZyBzZWdtZW50ICVkIiwKLQkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOwotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgotCQkJICAgICAgS0VSTl9JTkZPCi0JCQkgICAgICJJUlE6QzogMHglMDJ4LCBIOiAweCUwMngsIFI6IDB4JTAyeCwgTjogMHglMDJ4XG4iCi0JCQkgICAgICBLRVJOX0lORk8KLQkJCSAgICAgICJCVUY6QzogMHglMDJ4LCBIOiAweCUwMngsIFI6IDB4JTAyeCIsCi0JCQkgICAgICBpblszXSwgaW5bNF0sIGluWzVdLCBpbls2XSwKLQkJCSAgICAgIGJ1ZmYtPmN5bCwgYnVmZi0+aGVhZCwgYnVmZi0+c2VjdCk7Ci0JCX0KLSNlbmRpZgotCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fAotCQkgICAgZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgewotCQkJVFJBQ0UoZnRfdF9ub2lzZSwiYWJvcnRpbmcgJXMiLGZkY19tb2RlX3R4dChmZGNfbW9kZSkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwID09IEZBS0VfU0VHTUVOVCkgewotCQkJLyogVGhpcyBjb25kaXRpb24gb2NjdXJzIHdoZW4gcmVhZGluZyBhIGBmYWtlJwotCQkJICogc2VjdG9yIHRoYXQncyBub3QgYWNjZXNzaWJsZS4gRG9lc24ndAotCQkJICogcmVhbGx5IG1hdHRlciBhcyB3ZSB3b3VsZCBoYXZlIGlnbm9yZWQgaXQKLQkJCSAqIGFueXdheSAhCi0JCQkgKgotCQkJICogQ2hhbmNlIGlzIHRoYXQgd2UncmUgcGFzdCB0aGUgbmV4dCBzZWdtZW50Ci0JCQkgKiBub3csIHNvIHRoZSBuZXh0IG9wZXJhdGlvbiBtYXkgZmFpbCBhbmQKLQkJCSAqIHJlc3VsdCBpbiBhIHJldHJ5LiAgCi0JCQkgKi8KLQkJCWJ1ZmYtPnJlbWFpbmluZyA9IDA7CS8qIHNraXAgZmFpbGluZyBzZWN0b3IgKi8KLQkJCS8qIGJ1ZmYtPnB0ciAgICAgICA9IGJ1ZmYtPmFkZHJlc3M7ICovCi0JCQkvKiBmYWtlIHN1Y2Nlc3M6ICovCi0JCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCAxKTsKLQkJCS8qICB0cmFjZSBjYWxscyBhcmUgZXhwZW5zaXZlOiBwbGFjZSB0aGVtIEFGVEVSCi0JCQkgKiAgdGhlIHJlYWwgc3R1ZmYgaGFzIGJlZW4gZG9uZS4KLQkJCSAqICAKLQkJCSAqLwotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInNraXBwaW5nIGVtcHR5IHNlZ21lbnQgJWQgKHJlYWQpLCBzaXplPyAlZCIsCi0JCQkgICAgICBidWZmLT5zZWdtZW50X2lkLCBidWZmLT5wdHIgLSBidWZmLT5hZGRyZXNzKTsKLQkJCVRSQUNFX0VYSVQ7Ci0JCX0KLQkJaWYgKGJ1ZmYtPnJldHJ5ID4gMCkgewotCQkJVFJBQ0UoZnRfdF9mbG93LCAidGhpcyBpcyByZXRyeSBuciAlZCIsIGJ1ZmYtPnJldHJ5KTsKLQkJfQotCQlzd2l0Y2ggKGNhdXNlKSB7Ci0JCWNhc2Ugbm9fZXJyb3I6Ci0JCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKLQkJCWlmIChpblsyXSAmIDB4NDApIHsKLQkJCQkvKiAgSGFuZGxlIGRlbGV0ZWQgZGF0YSBpbiBoZWFkZXIgc2VnbWVudHMuCi0JCQkJICogIFNraXAgc2VnbWVudCBhbmQgZm9yY2UgcmVhZC1haGVhZC4KLQkJCQkgKi8KLQkJCQlUUkFDRShmdF90X3dhcm4sCi0JCQkJICAgICAgImRlbGV0ZWQgZGF0YSBpbiBzZWdtZW50ICVkLyVkIiwKLQkJCQkgICAgICBidWZmLT5zZWdtZW50X2lkLAotCQkJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSkpOwotCQkJCWJ1ZmYtPmRlbGV0ZWQgPSAxOwotCQkJCWJ1ZmYtPnJlbWFpbmluZyA9IDA7LyphYm9ydCB0cmFuc2ZlciAqLwotCQkJCWJ1ZmYtPnNvZnRfZXJyb3JfbWFwIHw9Ci0JCQkJCQkoLTFMIDw8IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpOwotCQkJCWlmIChidWZmLT5zZWdtZW50X2lkID09IDApIHsKLQkJCQkJLyogc3RvcCBvbiBuZXh0IHNlZ21lbnQgKi8KLQkJCQkJc3RvcF9yZWFkX2FoZWFkID0gMTsKLQkJCQl9Ci0JCQkJLyogZm9yY2UgcmVhZC1haGVhZDogKi8KLQkJCQlidWZmLT5uZXh0X3NlZ21lbnQgPSAKLQkJCQkJYnVmZi0+c2VnbWVudF9pZCArIDE7Ci0JCQkJc2tpcCA9IChGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gCi0JCQkJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlza2lwID0gMDsKLQkJCX0KLQkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIHNraXApOwotCQkJYnJlYWs7Ci0JCWNhc2Ugbm9fZGF0YV9lcnJvcjoKLQkJCS8qIFRhcGUgc3RhcnRlZCB0b28gZmFyIGFoZWFkIG9mIG9yIGJlaGluZCB0aGUKLQkJCSAqIHJpZ2h0IHNlY3Rvci4gIFRoaXMgbWF5IGFsc28gaGFwcGVuIGluIHRoZQotCQkJICogbWlkZGxlIG9mIGEgc2VnbWVudCAhCi0JCQkgKgotCQkJICogSGFuZGxlIG5vLWRhdGEgYXMgc29mdCBlcnJvci4gSWYgbmV4dAotCQkJICogc2VjdG9yIGZhaWxzIHRvbywgYSByZXRyeSAod2l0aCBuZWVkZWQKLQkJCSAqIHJlcG9zaXRpb24pIHdpbGwgZm9sbG93LgotCQkJICovCi0JCQlyZXRyeSArKzsKLQkJY2FzZSBpZF9hbV9lcnJvcjoKLQkJY2FzZSBpZF9jcmNfZXJyb3I6Ci0JCWNhc2UgZGF0YV9hbV9lcnJvcjoKLQkJY2FzZSBkYXRhX2NyY19lcnJvcjoKLQkJY2FzZSBvdmVycnVuX2Vycm9yOgotCQkJcmV0cnkgKz0gKGJ1ZmYtPnNvZnRfZXJyb3JfbWFwICE9IDAgfHwKLQkJCQkgIGJ1ZmYtPmhhcmRfZXJyb3JfbWFwICE9IDApOwotCQkJZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7IAotI2lmIDEgfHwgZGVmaW5lZChURVNUSU5HKQotCQkJaWYgKGNhdXNlID09IG92ZXJydW5fZXJyb3IpIHJldHJ5ICsrOwotI2VuZGlmCi0JCQlpZiAocmV0cnkpIHsKLQkJCQlza2lwID0gZmluZF9yZXN1bWVfcG9pbnQoYnVmZik7Ci0JCQl9IGVsc2UgewotCQkJCXNraXAgPSBidWZmLT5zZWN0b3Jfb2Zmc2V0OwotCQkJfQotCQkJLyogIFRyeSB0byByZXN1bWUgd2l0aCBuZXh0IHNlY3RvciBvbiBzaW5nbGUKLQkJCSAqICBlcnJvcnMgKGxldCBlY2MgY29ycmVjdCBpdCksIGJ1dCByZXRyeSBvbgotCQkJICogIG5vX2RhdGEgKHdlJ2xsIGJlIHBhc3QgdGhlIHRhcmdldCB3aGVuIHdlCi0JCQkgKiAgZ2V0IGhlcmUgc28gd2UgY2Fubm90IHJldHJ5KSBvciBvbgotCQkJICogIG11bHRpcGxlIGVycm9ycyAocmVkdWNlIGNoYW5jZSBvbiBlY2MKLQkJCSAqICBmYWlsdXJlKS4KLQkJCSAqLwotCQkJLyogIGNIOiAyMy8wMi85NzogaWYgdGhlIGxhc3Qgc2VjdG9yIGluIHRoZSAKLQkJCSAqICBzZWdtZW50IHdhcyBhIGhhcmQgZXJyb3IsIHRoZW4gdGhlcmUgaXMgCi0JCQkgKiAgbm8gc2Vuc2UgaW4gYSByZXRyeS4gVGhpcyBvY2Nhc2lvbiBzZWxkb20KLQkJCSAqICBvY2N1cnMgYnV0IC4uLiBAOrOyuGBAJSanJAotCQkJICovCi0JCQlpZiAocmV0cnkgJiYgc2tpcCA8IDMyKSB7Ci0JCQkJcmV0cnlfc2VjdG9yKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7Ci0JCQl9Ci0JCQl1cGRhdGVfaGlzdG9yeShjYXVzZSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qICBEb24ndCBrbm93IHdoeSB0aGlzIGNvdWxkIGhhcHBlbiAKLQkJCSAqICBidXQgZmluZCBvdXQuCi0JCQkgKi8KLQkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOwotCQkJcmV0cnlfc2VjdG9yKGJ1ZmYsIGZkY19tb2RlLCAwKTsKLQkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6IHVuZXhwZWN0ZWQgZXJyb3IiKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgZmRjX3JlYWRpbmdfaWQ6Ci0JCWlmIChjYXVzZSA9PSBub19lcnJvcikgewotCQkJZmRjX2N5bCA9IGluWzNdOwotCQkJZmRjX2hlYWQgPSBpbls0XTsKLQkJCWZkY19zZWN0ID0gaW5bNV07Ci0JCQlUUkFDRShmdF90X2ZkY19kbWEsCi0JCQkgICAgICAiaWQgcmVhZDogQzogMHglMDJ4LCBIOiAweCUwMngsIFI6IDB4JTAyeCIsCi0JCQkgICAgICBmZGNfY3lsLCBmZGNfaGVhZCwgZmRjX3NlY3QpOwotCQl9IGVsc2UgewkvKiBubyB2YWxpZCBpbmZvcm1hdGlvbiwgdXNlIGludmFsaWQgc2VjdG9yICovCi0JCQlmZGNfY3lsID0gZmRjX2hlYWQgPSBmZGNfc2VjdCA9IDA7Ci0JCQlUUkFDRShmdF90X2Zsb3csICJEaWRuJ3QgZmluZCB2YWxpZCBzZWN0b3IgSWQiKTsKLQkJfQotCQlmZGNfbW9kZSA9IGZkY19pZGxlOwotCQlicmVhazsKLQljYXNlIGZkY19kZWxldGluZzoKLQljYXNlIGZkY193cml0aW5nX2RhdGE6Ci0jaWZkZWYgVEVTVElORwotCQlpZiAoY2F1c2UgPT0gbm9fZXJyb3IpIHsKLQkJCVRSQUNFKGZ0X3RfZmxvdywgIndyaXRpbmcgc2VnbWVudCAlZCIsIGJ1ZmYtPnNlZ21lbnRfaWQpOwotCQl9IGVsc2UgewotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIHdyaXRpbmcgc2VnbWVudCAlZCIsCi0JCQkgICAgICBidWZmLT5zZWdtZW50X2lkKTsKLQkJfQotI2VuZGlmCi0JCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nIHx8Ci0JCSAgICBmdF9ydW5uZXJfc3RhdHVzID09IGRvX2Fib3J0KSB7Ci0JCQlUUkFDRShmdF90X2Zsb3csICJhYm9ydGluZyAlcyIsZmRjX21vZGVfdHh0KGZkY19tb2RlKSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYnVmZi0+cmV0cnkgPiAwKSB7Ci0JCQlUUkFDRShmdF90X2Zsb3csICJ0aGlzIGlzIHJldHJ5IG5yICVkIiwgYnVmZi0+cmV0cnkpOwotCQl9Ci0JCWlmIChidWZmLT5iYWRfc2VjdG9yX21hcCA9PSBGQUtFX1NFR01FTlQpIHsKLQkJCS8qIFRoaXMgY29uZGl0aW9uIG9jY3VycyB3aGVuIHRyeWluZyB0byB3cml0ZSB0byBhCi0JCQkgKiBgZmFrZScgc2VjdG9yIHRoYXQncyBub3QgYWNjZXNzaWJsZS4gRG9lc24ndCByZWFsbHkKLQkJCSAqIG1hdHRlciBhcyBpdCBpc24ndCB1c2VkIGFueXdheSAhIE1pZ2h0IGJlIGxvY2F0ZWQKLQkJCSAqIGF0IHdyb25nIHNlZ21lbnQsIHRoZW4gd2UnbGwgZmFpbCBvbiB0aGUgbmV4dAotCQkJICogc2VnbWVudC4KLQkJCSAqLwotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInNraXBwaW5nIGVtcHR5IHNlZ21lbnQgKHdyaXRlKSIpOwotCQkJYnVmZi0+cmVtYWluaW5nID0gMDsJLyogc2tpcCBmYWlsaW5nIHNlY3RvciAqLwotCQkJLyogZmFrZSBzdWNjZXNzOiAqLwotCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgMSk7Ci0JCQlicmVhazsKLQkJfQotCQlzd2l0Y2ggKGNhdXNlKSB7Ci0JCWNhc2Ugbm9fZXJyb3I6Ci0JCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKLQkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2Ugbm9fZGF0YV9lcnJvcjoKLQkJY2FzZSBpZF9hbV9lcnJvcjoKLQkJY2FzZSBpZF9jcmNfZXJyb3I6Ci0JCWNhc2UgZGF0YV9hbV9lcnJvcjoKLQkJY2FzZSBvdmVycnVuX2Vycm9yOgotCQkJdXBkYXRlX2hpc3RvcnkoY2F1c2UpOwotCQkJZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7Ci0JCQlza2lwID0gZmluZF9yZXN1bWVfcG9pbnQoYnVmZik7Ci0JCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIHNraXApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoaW5bMV0gJiAweDAyKSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsICJtZWRpYSBub3Qgd3JpdGFibGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9idWcsICJ1bmZvcmVzZWVuIHdyaXRlIGVycm9yIik7Ci0JCQl9Ci0JCQlmZGNfbW9kZSA9IGZkY19pZGxlOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7IC8qIGZkY19kZWxldGluZyB8fCBmZGNfd3JpdGluZ19kYXRhICovCi0JY2FzZSBmZGNfZm9ybWF0dGluZzoKLQkJLyogIFRoZSBpbnRlcnJ1cHQgY29tZXMgYWZ0ZXIgZm9ybWF0dGluZyBhIHNlZ21lbnQuIFdlIHRoZW4KLQkJICogIGhhdmUgdG8gc2V0IHVwIFFVSUNLTFkgZm9yIHRoZSBuZXh0IHNlZ21lbnQuIEJ1dAotCQkgKiAgYWZ0ZXJ3YXJkcywgdGhlcmUgaXMgcGxlbnR5IG9mIHRpbWUuCi0JCSAqLwotCQlzd2l0Y2ggKGNhdXNlKSB7Ci0JCWNhc2Ugbm9fZXJyb3I6Ci0JCQkvKiAgd291bGQgbGlrZSB0byBrZWVwIG1vc3Qgb2YgdGhlIGZvcm1hdHRpbmcgc3R1ZmYKLQkJCSAqICBvdXRzaWRlIHRoZSBpc3IgY29kZSwgYnV0IHRpbWluZyBpcyB0b28gY3JpdGljYWwKLQkJCSAqLwotCQkJaWYgKGRldGVybWluZV9mbXRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpID49IDApIHsKLQkJCQljb250aW51ZV9mb3JtYXR0aW5nKGJ1ZmYpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2Ugbm9fZGF0YV9lcnJvcjoKLQkJY2FzZSBpZF9hbV9lcnJvcjoKLQkJY2FzZSBpZF9jcmNfZXJyb3I6Ci0JCWNhc2UgZGF0YV9hbV9lcnJvcjoKLQkJY2FzZSBvdmVycnVuX2Vycm9yOgotCQlkZWZhdWx0OgotCQkJZGV0ZXJtaW5lX2ZtdF9wcm9ncmVzcyhidWZmLCBjYXVzZSk7Ci0JCQl1cGRhdGVfaGlzdG9yeShjYXVzZSk7Ci0JCQlpZiAoaW5bMV0gJiAweDAyKSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsICJtZWRpYSBub3Qgd3JpdGFibGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9idWcsICJ1bmZvcmVzZWVuIHdyaXRlIGVycm9yIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfSAvKiBjYXVzZSAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiB1bmV4cGVjdGVkIGlycSBkdXJpbmc6ICVzIiwKLQkJICAgICAgZmRjX21vZGVfdHh0KGZkY19tb2RlKSk7Ci0JCWZkY19tb2RlID0gZmRjX2lkbGU7Ci0JCWJyZWFrOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi0vKiAgICAgIEZEQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgotICovCi12b2lkIGZkY19pc3Iodm9pZCkKLXsKLQlzdGF0aWMgaW50IGlzcl9hY3RpdmU7Ci0jaWZkZWYgVEVTVElORwotCXVuc2lnbmVkIGludCB0MCA9IGZ0YXBlX3RpbWVzdGFtcCgpOwotI2VuZGlmCi0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotIAlpZiAoaXNyX2FjdGl2ZSsrKSB7Ci0JCS0taXNyX2FjdGl2ZTsKLQkJVFJBQ0UoZnRfdF9idWcsICJCVUc6IG5lc3RlZCBpbnRlcnJ1cHQsIG5vdCBnb29kICEiKTsKLQkJKmZkYy5ob29rID0gZmRjX2lzcjsgLyogIGhvb2sgb3VyIGhhbmRsZXIgaW50byB0aGUgZmRjCi0JCQkJICAgICAgKiAgY29kZSBhZ2FpbiAKLQkJCQkgICAgICAqLwotCQlUUkFDRV9FWElUOwotCX0KLQlzdGkoKTsKLQlpZiAoaW5iX3AoZmRjLm1zcikgJiBGRENfQlVTWSkgewkvKiAgRW50ZXJpbmcgUmVzdWx0IFBoYXNlICovCi0JCWZ0X2hpZGVfaW50ZXJydXB0ID0gMDsKLQkJaGFuZGxlX2ZkY19idXN5KGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCkpOwotCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgewotCQkJLyogICAgICBjZWFzZSBvcGVyYXRpb24sIHJlbWVtYmVyIHRhcGUgcG9zaXRpb24KLQkJCSAqLwotCQkJVFJBQ0UoZnRfdF9mbG93LCAicnVubmVyIGFib3J0aW5nIik7Ci0JCQlmdF9ydW5uZXJfc3RhdHVzID0gYWJvcnRpbmc7Ci0JCQkrK2Z0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHM7Ci0JCX0KLQl9IGVsc2UgeyAvKiAhRkRDX0JVU1kgKi8KLQkJLyogIGNsZWFyIGludGVycnVwdCwgY2F1c2Ugc2hvdWxkIGJlIGdvdHRlbiBieSBpc3N1aW5nCi0JCSAqICBhIFNlbnNlIEludGVycnVwdCBTdGF0dXMgY29tbWFuZC4KLQkJICovCi0JCWlmIChmZGNfbW9kZSA9PSBmZGNfcmVjYWxpYnJhdGluZyB8fCBmZGNfbW9kZSA9PSBmZGNfc2Vla2luZykgewotCQkJaWYgKGZ0X2hpZGVfaW50ZXJydXB0KSB7Ci0JCQkJaW50IHN0MDsKLQkJCQlpbnQgcGNuOwotCi0JCQkJaWYgKGZkY19zZW5zZV9pbnRlcnJ1cHRfc3RhdHVzKCZzdDAsICZwY24pIDwgMCkKLQkJCQkJVFJBQ0UoZnRfdF9lcnIsCi0JCQkJCSAgICAgICJzZW5zZSBpbnRlcnJ1cHQgc3RhdHVzIGZhaWxlZCIpOwotCQkJCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSBwY247Ci0JCQkJVFJBQ0UoZnRfdF9mbG93LCAiaGFuZGxlZCBoaWRkZW4gaW50ZXJydXB0Iik7Ci0JCQl9Ci0JCQlmdF9zZWVrX2NvbXBsZXRlZCA9IDE7Ci0JCQlmZGNfbW9kZSA9IGZkY19pZGxlOwotCQl9IGVsc2UgaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZmdGFwZV93YWl0X2ludHIpKSB7Ci0JCQlpZiAoZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0cyA9PSAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLCAidW5leHBlY3RlZCBzdHJheSBpbnRlcnJ1cHQiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9mbG93LCAiZXhwZWN0ZWQgc3RyYXkgaW50ZXJydXB0Iik7Ci0JCQkJLS1mdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZkY19tb2RlID09IGZkY19yZWFkaW5nX2RhdGEgfHwKLQkJCSAgICBmZGNfbW9kZSA9PSBmZGNfdmVyaWZ5aW5nICAgIHx8Ci0JCQkgICAgZmRjX21vZGUgPT0gZmRjX3dyaXRpbmdfZGF0YSB8fAotCQkJICAgIGZkY19tb2RlID09IGZkY19kZWxldGluZyAgICAgfHwKLQkJCSAgICBmZGNfbW9kZSA9PSBmZGNfZm9ybWF0dGluZyAgIHx8Ci0JCQkgICAgZmRjX21vZGUgPT0gZmRjX3JlYWRpbmdfaWQpIHsKLQkJCQlpZiAoaW5iX3AoZmRjLm1zcikgJiBGRENfQlVTWSkgewotCQkJCQlUUkFDRShmdF90X2J1ZywKLQkJCQkJIioqKioqIEZEQyBmYWlsdXJlLCBidXN5IHRvbyBsYXRlIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVFJBQ0UoZnRfdF9idWcsCi0JCQkJCSAgICAgICIqKioqKiBGREMgZmFpbHVyZSwgbm8gYnVzeSIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAiYXdhaXRlZCBzdHJheSBpbnRlcnJ1cHQiKTsKLQkJCX0KLQkJfQotCQlmdF9oaWRlX2ludGVycnVwdCA9IDA7Ci0JfQotCS8qICAgIEhhbmRsZSBzbGVlcCBjb2RlLgotCSAqLwotCWlmICghZnRfaGlkZV9pbnRlcnJ1cHQpIHsKLQkJZnRfaW50ZXJydXB0X3NlZW4gKys7Ci0JCWlmICh3YWl0cXVldWVfYWN0aXZlKCZmdGFwZV93YWl0X2ludHIpKSB7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZ0YXBlX3dhaXRfaW50cik7Ci0JCX0KLQl9IGVsc2UgewotCQlUUkFDRShmdF90X2Zsb3csICJoaWRpbmcgaW50ZXJydXB0IHdoaWxlICVzIiwgCi0JCSAgICAgIHdhaXRxdWV1ZV9hY3RpdmUoJmZ0YXBlX3dhaXRfaW50cikgPyAid2FpdGluZyI6ImFjdGl2ZSIpOwotCX0KLSNpZmRlZiBURVNUSU5HCi0JdDAgPSBmdGFwZV90aW1lZGlmZih0MCwgZnRhcGVfdGltZXN0YW1wKCkpOwotCWlmICh0MCA+PSAxMDAwKSB7Ci0JCS8qIG9ubHkgdGVsbCB1cyBhYm91dCBsb25nIGNhbGxzICovCi0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJpc3IoKSBkdXJhdGlvbjogJTVkIHVzZWMiLCB0MCk7Ci0JfQotI2VuZGlmCi0JKmZkYy5ob29rID0gZmRjX2lzcjsJLyogaG9vayBvdXIgaGFuZGxlciBpbnRvIHRoZSBmZGMgY29kZSBhZ2FpbiAqLwotCS0taXNyX2FjdGl2ZTsKLQlUUkFDRV9FWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFhOTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSNpZm5kZWYgX0ZEQ19JU1JfSAotI2RlZmluZSBfRkRDX0lTUl9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowNyAkCi0gKgotICogICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdsb2JhbCB2YXJpYWJsZXMgbmVjZXNzYXJ5IHRvCi0gKiAgICAgIHN5bmNocm9uaXplIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIChpc3IpIHdpdGggdGhlCi0gKiAgICAgIHJlbWFpbmRlciBvZiB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIKLSAqICAgICAgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotLyoKLSAqICAgICAgZmRjLWlzci5jIGRlZmluZWQgcHVibGljIHZhcmlhYmxlcwotICovCi1leHRlcm4gdm9sYXRpbGUgaW50IGZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHM7IC8qIG1hc2tzIHN0cmF5IGludGVycnVwdHMgKi8KLWV4dGVybiB2b2xhdGlsZSBpbnQgZnRfc2Vla19jb21wbGV0ZWQ7CSAgICAgICAgICAvKiBmbGFnIHNldCBieSBpc3IgKi8KLWV4dGVybiB2b2xhdGlsZSBpbnQgZnRfaW50ZXJydXB0X3NlZW47CSAgICAgICAgICAvKiBmbGFnIHNldCBieSBpc3IgKi8KLWV4dGVybiB2b2xhdGlsZSBpbnQgZnRfaGlkZV9pbnRlcnJ1cHQ7ICAgICAgICAgICAgLyogZmxhZyBzZXQgYnkgaXNyICovCi0KLS8qCi0gKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIGZ1bmN0aW9ucwotICovCi1leHRlcm4gdm9pZCBmZGNfaXNyKHZvaWQpOwotCi0vKgotICogICAgICBBIGtlcm5lbCBob29rIHRoYXQgc3RlYWxzIG9uZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZmxvcHB5Ci0gKiAgICAgIGRyaXZlciAoU2hvdWxkIGJlIGZpeGVkIHdoZW4gdGhlIG5ldyBmZGMgZHJpdmVyIGdldHMgcmVhZHkpCi0gKiAgICAgIFNlZSB0aGUgbGludXgga2VybmVsIHNvdXJjZSBmaWxlczoKLSAqICAgICAgICAgIGRyaXZlcnMvYmxvY2svZmxvcHB5LmMgJiBkcml2ZXJzL2Jsb2NrL2Jsay5oCi0gKiAgICAgIGZvciB0aGUgZGV0YWlscy4KLSAqLwotZXh0ZXJuIHZvaWQgKCpkb19mbG9wcHkpICh2b2lkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTMwMWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uYyx2ICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE1OjE1ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmFkLXNlY3RvciBtYXAgaGFuZGxpbmcgY29kZSBmb3IKLSAqICAgICAgdGhlIFFJQy0xMTcgZmxvcHB5IHRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqICAgICAgUUlDLTQwLCBRSUMtODAsIFFJQy0zMDEwIGFuZCBRSUMtMzAyMCBtYXBzIGFyZSBpbXBsZW1lbnRlZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi0KLS8qICAgICAgTG9jYWwgdmFycy4KLSAqLwotc3RhdGljIF9fdTggKmJhZF9zZWN0b3JfbWFwOwotc3RhdGljIFNlY3RvckNvdW50ICpic21faGFzaF9wdHI7IAotCi10eXBlZGVmIGVudW0gewotCWZvcndhcmQsIGJhY2t3YXJkCi19IG1vZGVfdHlwZTsKLQotI2lmIDAKLXN0YXRpYyB2b2lkIGZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgbmV3X21hcCk7Ci0jZW5kaWYKLQotI2lmIDAKLS8qICBmaXhfdGFwZSBjb252ZXJ0cyBhIG5vcm1hbCBRSUMtODAgdGFwZSBpbnRvIGEgJ3dpZGUnIHRhcGUuCi0gKiAgRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSAhCi0gKi8KLXZvaWQgZml4X3RhcGUoX191OCAqIGJ1ZmZlciwgZnRfZm9ybWF0X3R5cGUgbmV3X2NvZGUpCi17Ci0Jc3RhdGljIF9fdTggbGlzdFtCQURfU0VDVE9SX01BUF9TSVpFXTsKLQlTZWN0b3JNYXAgKnNyY19wdHIgPSAoU2VjdG9yTWFwICopIGxpc3Q7Ci0JX191OCAqZHN0X3B0ciA9IGJhZF9zZWN0b3JfbWFwOwotCVNlY3Rvck1hcCBtYXA7Ci0JdW5zaWduZWQgaW50IHNlY3RvciA9IDE7Ci0JaW50IGk7Ci0KLQlpZiAoZm9ybWF0X2NvZGUgIT0gZm10X3ZhciAmJiBmb3JtYXRfY29kZSAhPSBmbXRfYmlnKSB7Ci0JCW1lbWNweShsaXN0LCBiYWRfc2VjdG9yX21hcCwgc2l6ZW9mKGxpc3QpKTsKLQkJbWVtc2V0KGJhZF9zZWN0b3JfbWFwLCAwLCBzaXplb2YoYmFkX3NlY3Rvcl9tYXApKTsKLQkJd2hpbGUgKChfX3U4ICopIHNyY19wdHIgLSBsaXN0IDwgc2l6ZW9mKGxpc3QpKSB7Ci0JCQltYXAgPSAqc3JjX3B0cisrOwotCQkJaWYgKG1hcCA9PSBFTVBUWV9TRUdNRU5UKSB7Ci0JCQkJKihTZWN0b3JNYXAgKikgZHN0X3B0ciA9IDB4ODAwMDAwICsgc2VjdG9yOwotCQkJCWRzdF9wdHIgKz0gMzsKLQkJCQlzZWN0b3IgKz0gU0VDVE9SU19QRVJfU0VHTUVOVDsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IFNFQ1RPUlNfUEVSX1NFR01FTlQ7ICsraSkgewotCQkJCQlpZiAobWFwICYgMSkgewotCQkJCQkJKihTZXdjdG9yTWFwICopIGRzdF9wdHIgPSBzZWN0b3I7Ci0JCQkJCQlkc3RfcHRyICs9IDM7Ci0JCQkJCX0KLQkJCQkJbWFwID4+PSAxOwotCQkJCQkrK3NlY3RvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JYmFkX3NlY3Rvcl9tYXBfY2hhbmdlZCA9IDE7Ci0JKihidWZmZXIgKyA0KSA9IG5ld19jb2RlOwkvKiBwdXQgbmV3IGZvcm1hdCBjb2RlICovCi0JaWYgKGZvcm1hdF9jb2RlICE9IGZtdF92YXIgJiYgbmV3X2NvZGUgPT0gZm10X2JpZykgewotCQlQVVQ0KGJ1ZmZlciwgRlRfNl9IU0VHXzEsICAgKF9fdTMyKUdFVDIoYnVmZmVyLCA2KSk7Ci0JCVBVVDQoYnVmZmVyLCBGVF82X0hTRUdfMiwgICAoX191MzIpR0VUMihidWZmZXIsIDgpKTsKLQkJUFVUNChidWZmZXIsIEZUXzZfRlJTVF9TRUcsIChfX3UzMilHRVQyKGJ1ZmZlciwgMTApKTsKLQkJUFVUNChidWZmZXIsIEZUXzZfTEFTVF9TRUcsIChfX3UzMilHRVQyKGJ1ZmZlciwgMTIpKTsKLQkJbWVtc2V0KGJ1ZmZlcis2LCAnXDAnLCA4KTsKLQl9Ci0JZm9ybWF0X2NvZGUgPSBuZXdfY29kZTsKLX0KLQotI2VuZGlmCi0KLS8qICAgZ2l2ZW4gYnVmZmVyIHRoYXQgY29udGFpbnMgYSBoZWFkZXIgc2VnbWVudCwgZmluZCB0aGUgZW5kIG9mCi0gKiAgIG9mIHRoZSBic20gbGlzdAotICovCi1fX3U4ICogZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoX191OCAqIGFkZHJlc3MpCi17Ci0JX191OCAqcHRyICAgPSBhZGRyZXNzICsgRlRfSEVBREVSX0VORDsgLyogc3RhcnQgb2YgYnNtIGxpc3QgKi8KLQlfX3U4ICpsaW1pdCA9IGFkZHJlc3MgKyBGVF9TRUdNRU5UX1NJWkU7Ci0Jd2hpbGUgKHB0ciArIDIgPCBsaW1pdCkgewotCQlpZiAocHRyWzBdIHx8IHB0clsxXSB8fCBwdHJbMl0pIHsKLQkJCXB0ciArPSAzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHB0cjsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF9zZWN0b3IoU2VjdG9yQ291bnQgKnB0ciwgdW5zaWduZWQgaW50IHNlY3RvcikKLXsKLQlwdHItPmJ5dGVzWzBdID0gc2VjdG9yICYgMHhmZjsKLQlzZWN0b3IgPj49IDg7Ci0JcHRyLT5ieXRlc1sxXSA9IHNlY3RvciAmIDB4ZmY7Ci0Jc2VjdG9yID4+PSA4OwotCXB0ci0+Ynl0ZXNbMl0gPSBzZWN0b3IgJiAweGZmOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfc2VjdG9yKFNlY3RvckNvdW50ICpwdHIpCi17Ci0jaWYgMQotCXVuc2lnbmVkIGludCBzZWN0b3I7Ci0KLQlzZWN0b3IgID0gcHRyLT5ieXRlc1swXTsKLQlzZWN0b3IgKz0gcHRyLT5ieXRlc1sxXSA8PCAgODsKLQlzZWN0b3IgKz0gcHRyLT5ieXRlc1syXSA8PCAxNjsKLQotCXJldHVybiBzZWN0b3I7Ci0jZWxzZQotCS8qICBHRVQ0IGdldHMgdGhlIG5leHQgZm91ciBieXRlcyBpbiBJbnRlbCBsaXR0bGUgZW5kaWFuIG9yZGVyCi0JICogIGFuZCBjb252ZXJ0cyB0aGVtIHRvIGhvc3QgYnl0ZSBvcmRlciBhbmQgaGFuZGxlcyB1bmFsaWduZWQKLQkgKiAgYWNjZXNzLgotCSAqLwotCXJldHVybiAoR0VUNChwdHIsIDApICYgMHgwMGZmZmZmZik7IC8qIGJhY2sgdG8gaG9zdCBieXRlIG9yZGVyICovCi0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgYnNtX2RlYnVnX2Zha2Uodm9pZCkKLXsKLQkvKiBmb3IgdGVzdGluZyBvZiBiYWQgc2VjdG9yIGhhbmRsaW5nIGF0IGVuZCBvZiB0YXBlCi0JICovCi0jaWYgMAotCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KHNlZ21lbnRzX3Blcl90cmFjayAqIHRyYWNrc19wZXJfdGFwZSAtIDMsCi0JCQkJICAgMHgwMDAwMDNlMDsKLQlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50c19wZXJfdHJhY2sgKiB0cmFja3NfcGVyX3RhcGUgLSAyLAotCQkJCSAgIDB4ZmYzZmZmZmY7Ci0JZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudHNfcGVyX3RyYWNrICogdHJhY2tzX3Blcl90YXBlIC0gMSwKLQkJCQkgICAweGZmZmZlMDAwOwotI2VuZGlmCi0JLyogIEVuYWJsZSB0byB0ZXN0IGJhZCBzZWN0b3IgaGFuZGxpbmcKLQkgKi8KLSNpZiAwCi0JZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzAsIDB4ZmZmZmZmZmUpCi0JZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzIsIDB4N2ZmZmZmZmYpOwotCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDM0LCAweGZmZmVmZmZmKTsKLQlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSgzNiwgMHg1NTU1NTU1NSk7Ci0JZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzgsIDB4ZmZmZmZmZmYpOwotCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUwLCAweGZmZmYwMDAwKTsKLQlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSg1MSwgMHhmZmZmZmZmZik7Ci0JZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoNTIsIDB4ZmZmZmZmZmYpOwotCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUzLCAweDAwMDBmZmZmKTsKLSNlbmRpZgotCS8qICBFbmFibGUgd2hlbiB0ZXN0aW5nIG11bHRpcGxlIHZvbHVtZSB0YXIgZHVtcHMuCi0JICovCi0jaWYgMAotCXsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OwotCQkgICAgIGkgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSA3OyArK2kpIHsKLQkJCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGksIEVNUFRZX1NFR01FTlQpOwotCQl9Ci0JfQotI2VuZGlmCi0JLyogIEVuYWJsZSB3aGVuIHRlc3RpbmcgYml0IHBvc2l0aW9ucyBpbiAqX2Vycm9yX21hcAotCSAqLwotI2lmIDAKLQl7Ci0JCWludCBpOwotCQkKLQkJZm9yIChpID0gZmlyc3RfZGF0YV9zZWdtZW50OyBpIDw9IGxhc3RfZGF0YV9zZWdtZW50OyArK2kpIHsKLQkJCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGksCi0JCQkJCSAgIGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGkpIAotCQkJCQkgICB8IDB4MDBmZjAwZmYpOwotCQl9Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2JhZF9zZWN0b3JfbWFwKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGdvb2Rfc2VjdG9yczsKLQl1bnNpZ25lZCBpbnQgdG90YWxfYmFkID0gMDsKLQlpbnQgaTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IAotCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IAotCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfMTEwMGZ0KSB7Ci0JCVNlY3RvckNvdW50ICpwdHIgPSAoU2VjdG9yQ291bnQgKiliYWRfc2VjdG9yX21hcDsKLQkJdW5zaWduZWQgaW50IHNlY3RvcjsKLQkJX191MTYgKnB0cjE2OwotCi0JCXdoaWxlKChzZWN0b3IgPSBnZXRfc2VjdG9yKHB0cisrKSkgIT0gMCkgewotCQkJaWYgKChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IAotCQkJICAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyKSAmJgotCQkJICAgIHNlY3RvciAmIDB4ODAwMDAwKSB7Ci0JCQkJdG90YWxfYmFkICs9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzOwotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VnbWVudCBhdCBzZWN0b3I6ICU2ZCIsCi0JCQkJICAgICAgc2VjdG9yICYgMHg3ZmZmZmYpOwotCQkJfSBlbHNlIHsKLQkJCQkrK3RvdGFsX2JhZDsKLQkJCQlUUkFDRShmdF90X25vaXNlLCAiYmFkIHNlY3RvcjogJTZkIiwgc2VjdG9yKTsKLQkJCX0KLQkJfQotCQkvKiAgRGlzcGxheSBvbGQgZnRhcGUncyBlbmQtb2YtZmlsZSBtYXJrcwotCQkgKi8KLQkJcHRyMTYgPSAoX191MTYqKXB0cjsKLQkJd2hpbGUgKChzZWN0b3IgPSBnZXRfdW5hbGlnbmVkKHB0cjE2KyspKSAhPSAwKSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAiT2xkIGZ0YXBlIGVvZiBtYXJrOiAlNGQvJTJkIiwKLQkJCSAgICAgIHNlY3RvciwgZ2V0X3VuYWxpZ25lZChwdHIxNisrKSk7Ci0JCX0KLQl9IGVsc2UgeyAvKiBmaXhlZCBzaXplIGZvcm1hdCAqLwotCQlmb3IgKGkgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JCSAgICAgaSA8IChpbnQpKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSk7ICsraSkgewotCQkJU2VjdG9yTWFwIG1hcCA9ICgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtpXTsKLQotCQkJaWYgKG1hcCkgewotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCQkJICAgICAgImJzbSBmb3Igc2VnbWVudCAlNGQ6IDB4JTA4eCIsIGksICh1bnNpZ25lZCBpbnQpbWFwKTsKLQkJCQl0b3RhbF9iYWQgKz0gKChtYXAgPT0gRU1QVFlfU0VHTUVOVCkKLQkJCQkJICAgICAgID8gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIDMKLQkJCQkJICAgICAgIDogY291bnRfb25lcyhtYXApKTsKLQkJCX0KLQkJfQotCX0KLQlnb29kX3NlY3RvcnMgPQotCQkoKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSAtIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCkKLQkJICogKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzKSkgLSB0b3RhbF9iYWQ7Ci0JVFJBQ0UoZnRfdF9pbmZvLCAiJWQgS2IgdXNhYmxlIG9uIHRoaXMgdGFwZSIsIGdvb2Rfc2VjdG9ycyk7Ci0JaWYgKHRvdGFsX2JhZCA9PSAwKSB7Ci0JCVRSQUNFKGZ0X3RfaW5mbywKLQkJICAgICAgIldBUk5JTkc6IHRoaXMgdGFwZSBoYXMgbm8gYmFkIGJsb2NrcyByZWdpc3RlcmVkICEiKTsKLQl9IGVsc2UgewotCQlUUkFDRShmdF90X2luZm8sICIlZCBiYWQgc2VjdG9ycyIsIHRvdGFsX2JhZCk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLQotdm9pZCBmdGFwZV9leHRyYWN0X2JhZF9zZWN0b3JfbWFwKF9fdTggKiBidWZmZXIpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qICBGaWxsIHRoZSBiYWQgc2VjdG9yIG1hcCB3aXRoIHRoZSBjb250ZW50cyBvZiBidWZmZXIuCi0JICovCi0JaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgewotCQkvKiBRSUMtMzAxMC8zMDIwIGFuZCB3aWRlIFFJQy04MCB0YXBlcyBubyBsb25nZXIgaGF2ZSBhIGZhaWxlZAotCQkgKiBzZWN0b3IgbG9nIGJ1dCB1c2UgdGhpcyBhcmVhIHRvIGV4dGVuZCB0aGUgYmFkIHNlY3RvciBtYXAuCi0JCSAqLwotCQliYWRfc2VjdG9yX21hcCA9ICZidWZmZXJbRlRfSEVBREVSX0VORF07Ci0JfSBlbHNlIHsKLQkJLyogbm9uLXdpZGUgUUlDLTgwIHRhcGVzIGhhdmUgYSBmYWlsZWQgc2VjdG9yIGxvZyBhcmVhIHRoYXQKLQkJICogbXVzdG4ndCBiZSBpbmNsdWRlZCBpbiB0aGUgYmFkIHNlY3RvciBtYXAuCi0JCSAqLwotCQliYWRfc2VjdG9yX21hcCA9ICZidWZmZXJbRlRfRlNMICsgRlRfRlNMX1NJWkVdOwotCX0KLQlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10XzExMDBmdCB8fCAKLQkgICAgZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciAgICB8fAotCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7Ci0JCWJzbV9oYXNoX3B0ciA9IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwOwotCX0gZWxzZSB7Ci0JCWJzbV9oYXNoX3B0ciA9IE5VTEw7Ci0JfQotCWJzbV9kZWJ1Z19mYWtlKCk7Ci0JaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgewotCQlwcmludF9iYWRfc2VjdG9yX21hcCgpOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgaW5saW5lIFNlY3Rvck1hcCBjdnQybWFwKHVuc2lnbmVkIGludCBzZWN0b3IpCi17Ci0JcmV0dXJuIDEgPDwgKCgoc2VjdG9yICYgMHg3ZmZmZmYpIC0gMSkgJSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY3Z0MnNlZ21lbnQodW5zaWduZWQgaW50IHNlY3RvcikKLXsKLQlyZXR1cm4gKChzZWN0b3IgJiAweDdmZmZmZikgLSAxKSAvIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7Ci19Ci0KLXN0YXRpYyBpbnQgZm9yd2FyZF9zZWVrX2VudHJ5KGludCBzZWdtZW50X2lkLCAKLQkJCSAgICAgIFNlY3RvckNvdW50ICoqcHRyLCAKLQkJCSAgICAgIFNlY3Rvck1hcCAqbWFwKQotewotCXVuc2lnbmVkIGludCBzZWN0b3I7Ci0JaW50IHNlZ21lbnQ7Ci0KLQlkbyB7Ci0JCXNlY3RvciA9IGdldF9zZWN0b3IoKCpwdHIpKyspOwotCQlzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKTsKLQl9IHdoaWxlIChzZWN0b3IgIT0gMCAmJiBzZWdtZW50IDwgc2VnbWVudF9pZCk7Ci0JKCpwdHIpIC0tOyAvKiBwb2ludCB0byBmaXJzdCBzZWN0b3IgPj0gc2VnbWVudF9pZCAqLwotCS8qICBHZXQgYWxsIHNlY3RvcnMgaW4gc2VnbWVudF9pZAotCSAqLwotCWlmIChzZWN0b3IgPT0gMCB8fCBzZWdtZW50ICE9IHNlZ21lbnRfaWQpIHsKLQkJKm1hcCA9IDA7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoKHNlY3RvciAmIDB4ODAwMDAwKSAmJgotCQkgICAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSkgewotCQkqbWFwID0gRU1QVFlfU0VHTUVOVDsKLQkJcmV0dXJuIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7Ci0JfSBlbHNlIHsKLQkJaW50IGNvdW50ID0gMTsKLQkJU2VjdG9yQ291bnQgKnRtcF9wdHIgPSAoKnB0cikgKyAxOwotCQkKLQkJKm1hcCA9IGN2dDJtYXAoc2VjdG9yKTsKLQkJd2hpbGUgKChzZWN0b3IgPSBnZXRfc2VjdG9yKHRtcF9wdHIrKykpICE9IDAgJiYKLQkJICAgICAgIChzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKSkgPT0gc2VnbWVudF9pZCkgewotCQkJKm1hcCB8PSBjdnQybWFwKHNlY3Rvcik7Ci0JCQkrK2NvdW50OwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYmFja3dhcmRzX3NlZWtfZW50cnkoaW50IHNlZ21lbnRfaWQsCi0JCQkJU2VjdG9yQ291bnQgKipwdHIsCi0JCQkJU2VjdG9yTWFwICptYXApCi17Ci0JdW5zaWduZWQgaW50IHNlY3RvcjsKLQlpbnQgc2VnbWVudDsgLyogbWF4IHVuc2lnbmVkIGludCAqLwotCi0JaWYgKCpwdHIgPD0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXApIHsKLQkJKm1hcCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlkbyB7Ci0JCXNlY3RvciAgPSBnZXRfc2VjdG9yKC0tKCpwdHIpKTsKLQkJc2VnbWVudCA9IGN2dDJzZWdtZW50KHNlY3Rvcik7Ci0JfSB3aGlsZSAoKnB0ciA+IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwICYmIHNlZ21lbnQgPiBzZWdtZW50X2lkKTsKLQlpZiAoc2VnbWVudCA+IHNlZ21lbnRfaWQpIHsgLyogIGF0IHN0YXJ0IG9mIGxpc3QsIG5vIGVudHJ5IGZvdW5kICovCi0JCSptYXAgPSAwOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKHNlZ21lbnQgPCBzZWdtZW50X2lkKSB7Ci0JCS8qICBiZWZvcmUgc21hbGxlciBlbnRyeSwgYWRqdXN0IGZvciBvdmVyc2hvb3QgKi8KLQkJKCpwdHIpICsrOwotCQkqbWFwID0gMDsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICgoc2VjdG9yICYgMHg4MDAwMDApICYmCi0JCSAgIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIpKSB7Ci0JCSptYXAgPSBFTVBUWV9TRUdNRU5UOwotCQlyZXR1cm4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKLQl9IGVsc2UgeyAvKiAgZ2V0IGFsbCBzZWN0b3JzIGluIHNlZ21lbnRfaWQgKi8KLQkJaW50IGNvdW50ID0gMTsKLQotCQkqbWFwID0gY3Z0Mm1hcChzZWN0b3IpOwotCQl3aGlsZSgqcHRyID4gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXApIHsKLQkJCXNlY3RvciA9IGdldF9zZWN0b3IoLS0oKnB0cikpOwotCQkJc2VnbWVudCA9IGN2dDJzZWdtZW50KHNlY3Rvcik7Ci0JCQlpZiAoc2VnbWVudCAhPSBzZWdtZW50X2lkKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkqbWFwIHw9IGN2dDJtYXAoc2VjdG9yKTsKLQkJCSsrY291bnQ7Ci0JCX0KLQkJaWYgKHNlZ21lbnQgPCBzZWdtZW50X2lkKSB7Ci0JCQkoKnB0cikgKys7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLX0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIGZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgbmV3X21hcCkKLXsKLQlTZWN0b3JDb3VudCAqcHRyID0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXA7Ci0JaW50IGNvdW50OwotCWludCBuZXdfY291bnQ7Ci0JU2VjdG9yTWFwIG1hcDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF8xMTAwZnQgfHwgCi0JICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgCi0JICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKLQkJY291bnQgPSBmb3J3YXJkX3NlZWtfZW50cnkoc2VnbWVudF9pZCwgJnB0ciwgJm1hcCk7Ci0JCW5ld19jb3VudCA9IGNvdW50X29uZXMobmV3X21hcCk7Ci0JCS8qIElmIGZvcm1hdCBjb2RlID09IDQgcHV0IGVtcHR5IHNlZ21lbnQgaW5zdGVhZCBvZiAzMgotCQkgKiBiYWQgc2VjdG9ycy4KLQkJICovCi0JCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKLQkJCWlmIChuZXdfY291bnQgPT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgewotCQkJCW5ld19jb3VudCA9IDE7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgewotCQkJCWNvdW50ID0gMTsKLQkJCX0KLQkJfQotCQlpZiAoY291bnQgIT0gbmV3X2NvdW50KSB7Ci0JCQkvKiBpbnNlcnQgKG9yIGRlbGV0ZSBpZiA8IDApIG5ld19jb3VudCAtIGNvdW50Ci0JCQkgKiBlbnRyaWVzLiAgTW92ZSB0cmFpbGluZyBwYXJ0IG9mIGxpc3QKLQkJCSAqIGluY2x1ZGluZyB0ZXJtaW5hdGluZyAwLgotCQkJICovCi0JCQlTZWN0b3JDb3VudCAqaGlfcHRyID0gcHRyOwotCi0JCQlkbyB7Ci0JCQl9IHdoaWxlIChnZXRfc2VjdG9yKGhpX3B0cisrKSAhPSAwKTsKLQkJCS8qICBOb3RlOiBwdHIgaXMgb2YgdHlwZSBieXRlICosIGFuZCBlYWNoIGJhZCBzZWN0b3IKLQkJCSAqICBjb25zdW1lcyAzIGJ5dGVzLgotCQkJICovCi0JCQltZW1tb3ZlKHB0ciArIG5ld19jb3VudCwgcHRyICsgY291bnQsCi0JCQkJKHNpemVfdCkoaGlfcHRyIC0gKHB0ciArIGNvdW50KSkqc2l6ZW9mKFNlY3RvckNvdW50KSk7Ci0JCX0KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgInB1dHRpbmcgbWFwIDB4JTA4eCBhdCAlcCwgc2VnbWVudCAlZCIsCi0JCSAgICAgICh1bnNpZ25lZCBpbnQpbmV3X21hcCwgcHRyLCBzZWdtZW50X2lkKTsKLQkJaWYgKG5ld19jb3VudCA9PSAxICYmIG5ld19tYXAgPT0gRU1QVFlfU0VHTUVOVCkgewotCQkJcHV0X3NlY3RvcihwdHIrKywgKDB4ODAwMDAxICsgCi0JCQkJCSAgc2VnbWVudF9pZCAqIAotCQkJCQkgIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpKTsKLQkJfSBlbHNlIHsKLQkJCWludCBpID0gMDsKLQotCQkJd2hpbGUgKG5ld19tYXApIHsKLQkJCQlpZiAobmV3X21hcCAmIDEpIHsKLQkJCQkJcHV0X3NlY3RvcihwdHIrKywgCi0JCQkJCQkgICAxICsgc2VnbWVudF9pZCAqIAotCQkJCQkJICAgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCArIGkpOwotCQkJCX0KLQkJCQkrK2k7Ci0JCQkJbmV3X21hcCA+Pj0gMTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCSgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtzZWdtZW50X2lkXSA9IG5ld19tYXA7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0jZW5kaWYgIC8qICAwICAqLwotCi1TZWN0b3JNYXAgZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoaW50IHNlZ21lbnRfaWQpCi17Ci0JaWYgKGZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPT0gLTEpIHsKLQkJLyogIFdoZW4gcmVhZGluZyBoZWFkZXIgc2VnbWVudCB3ZSdsbCBuZWVkIGEgYmxhbmsgbWFwLgotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChic21faGFzaF9wdHIgIT0gTlVMTCkgewotCQkvKiAgSW52YXJpYW50czoKLQkJICogICAgbWFwIC0gbWFzayB2YWx1ZSByZXR1cm5lZCBvbiBsYXN0IGNhbGwuCi0JCSAqICAgIGJzbV9oYXNoX3B0ciAtIHBvaW50cyB0byBmaXJzdCBzZWN0b3IgZ3JlYXRlciBvciBlcXVhbCB0bwotCQkgKiAgICAgICAgICBmaXJzdCBzZWN0b3IgaW4gbGFzdF9yZWZlcmVuY2VkIHNlZ21lbnQuCi0JCSAqICAgIGxhc3RfcmVmZXJlbmNlZCAtIHNlZ21lbnQgaWQgdXNlZCBpbiB0aGUgbGFzdCBjYWxsLAotCQkgKiAgICAgICAgICAgICAgICAgICAgICBzZWN0b3IgYW5kIG1hcCBiZWxvbmcgdG8gdGhpcyBpZC4KLQkJICogIFRoaXMgY29kZSBpcyBkZXNpZ25lZCBmb3Igc2VxdWVudGlhbCBhY2Nlc3MgYW5kIHJldHJpZXMuCi0JCSAqICBGb3IgdHJ1ZSByYW5kb20gYWNjZXNzIGl0IG1heSBoYXZlIHRvIGJlIHJlZGVzaWduZWQuCi0JCSAqLwotCQlzdGF0aWMgaW50IGxhc3RfcmVmZXJlbmNlID0gLTE7Ci0JCXN0YXRpYyBTZWN0b3JNYXAgbWFwOwotCi0JCWlmIChzZWdtZW50X2lkID4gbGFzdF9yZWZlcmVuY2UpIHsKLQkJCS8qICBTa2lwIGFsbCBzZWN0b3JzIGJlZm9yZSBzZWdtZW50X2lkCi0JCQkgKi8KLQkJCWZvcndhcmRfc2Vla19lbnRyeShzZWdtZW50X2lkLCAmYnNtX2hhc2hfcHRyLCAmbWFwKTsKLQkJfSBlbHNlIGlmIChzZWdtZW50X2lkIDwgbGFzdF9yZWZlcmVuY2UpIHsKLQkJCS8qIFNraXAgYmFja3dhcmRzIHVudGlsIGJlZ2luIG9mIGJ1ZmZlciBvcgotCQkJICogZmlyc3Qgc2VjdG9yIGluIHNlZ21lbnRfaWQgCi0JCQkgKi8KLQkJCWJhY2t3YXJkc19zZWVrX2VudHJ5KHNlZ21lbnRfaWQsICZic21faGFzaF9wdHIsICZtYXApOwotCQl9CQkvKiBzZWdtZW50X2lkID09IGxhc3RfcmVmZXJlbmNlIDoga2VlcCBtYXAgKi8KLQkJbGFzdF9yZWZlcmVuY2UgPSBzZWdtZW50X2lkOwotCQlyZXR1cm4gbWFwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoKFNlY3Rvck1hcCAqKSBiYWRfc2VjdG9yX21hcClbc2VnbWVudF9pZF07Ci0JfQotfQotCi0vKiAgVGhpcyBpcyBzaW1wbHkgaGVyZSB0byBwcmV2ZW50IHVzIGZyb20gb3ZlcndyaXRpbmcgb3RoZXIga2VybmVsCi0gKiAgZGF0YS4gV3JpdGVzIHdpbGwgcmVzdWx0IGluIE5VTEwgUG9pbnRlciBkZXJlZmVyZW5jZS4KLSAqLwotdm9pZCBmdGFwZV9pbml0X2JzbSh2b2lkKQotewotCWJhZF9zZWN0b3JfbWFwID0gTlVMTDsKLQlic21faGFzaF9wdHIgICA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDU0NjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfQlNNX0gKLSNkZWZpbmUgX0ZUQVBFX0JTTV9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA3ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIGJhZCBzZWN0b3IgbWFwIGhhbmRsaW5nCi0gKiAgICAgIHJvdXRpbmVzIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50Lmg+Ci0KLSNkZWZpbmUgRU1QVFlfU0VHTUVOVCAgICAgICAgICAgKDB4ZmZmZmZmZmYpCi0jZGVmaW5lIEZBS0VfU0VHTUVOVCAgICAgICAgICAgICgweGZmZmZmZmZlKQotCi0vKiAgbWF4aW11bSAoZm9ybWF0IGNvZGUgNCkgYmFkIHNlY3RvciBtYXAgc2l6ZSAoYnl0ZXMpLgotICovCi0jZGVmaW5lIEJBRF9TRUNUT1JfTUFQX1NJWkUgICAgICgyOSAqIFNFQ1RPUl9TSVpFIC0gMjU2KQotCi0vKiAgZm9ybWF0IGNvZGUgNCBiYWQgc2VjdG9yIGVudHJ5LCBmdGFwZSB1c2VzIHRoaXMKLSAqICBpbnRlcm5hbGx5IGZvciBhbGwgZm9ybWF0IGNvZGVzCi0gKi8KLXR5cGVkZWYgX191MzIgU2VjdG9yTWFwOwotLyogIHZhcmlhYmxlIGFuZCAxMTAwIGZ0IGJhZCBzZWN0b3IgbWFwIGVudHJ5LiBUaGVzZSB0aHJlZSBieXRlcyByZXByZXNlbnQKLSAqICBhIHNpbmdsZSBzZWN0b3IgYWRkcmVzcyBtZWFzdXJlZCBmcm9tIEJPVC4gCi0gKi8KLXR5cGVkZWYgc3RydWN0IE5ld1NlY3Rvck1hcCB7ICAgICAgICAgIAotCV9fdTggYnl0ZXNbM107Ci19IFNlY3RvckNvdW50OwotCi0KLS8qCi0gKiAgICAgIGZ0YXBlLWJzbS5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCi0gKi8KLQotLyoKLSAqICAgICAgZnRhcGUtYnNtLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgotICovCi1leHRlcm4gdm9pZCB1cGRhdGVfYmFkX3NlY3Rvcl9tYXAoX191OCAqIGJ1ZmZlcik7Ci1leHRlcm4gdm9pZCBmdGFwZV9leHRyYWN0X2JhZF9zZWN0b3JfbWFwKF9fdTggKiBidWZmZXIpOwotZXh0ZXJuIFNlY3Rvck1hcCBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShpbnQgc2VnbWVudF9pZCk7Ci1leHRlcm4gX191OCAqZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoX191OCAqIGFkZHJlc3MpOwotZXh0ZXJuIHZvaWQgZnRhcGVfaW5pdF9ic20odm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA2ZmYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5jLHYgJAotICogJFJldmlzaW9uOiAxLjMgJAotICogJERhdGU6IDE5OTcvMTAvMTYgMjM6MzM6MTEgJAotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFsbG9jYXRvci9kZWFsbG9jdG9yIGZvciBmdGFwZSdzIGR5bmFtaWMgZG1hCi0gKiAgYnVmZmVyLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotCi0jaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgiCi0KLS8qICBETUEnYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHVmZi4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmRtYWFsbG9jKHNpemVfdCBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCWlmIChzaXplID09IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFkZHIgPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKLQlpZiAoYWRkcikgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7IHBhZ2UgPCB2aXJ0X3RvX3BhZ2UoYWRkcitzaXplKTsgcGFnZSsrKQotCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOwotCX0KLQlyZXR1cm4gKHZvaWQgKilhZGRyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hZnJlZSh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA+IDApIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOwotCQkgICAgIHBhZ2UgPCB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRkcitzaXplKTsgcGFnZSsrKQotCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7Ci0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGdldF9vcmRlcihzaXplKSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFkZF9vbmVfYnVmZmVyKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKGZ0X25yX2J1ZmZlcnMgPj0gRlRfTUFYX05SX0JVRkZFUlMpIHsKLQkJVFJBQ0VfRVhJVCAtRU5PTUVNOwotCX0KLQlmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10gPSBrbWFsbG9jKHNpemVvZihidWZmZXJfc3RydWN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSA9PSBOVUxMKSB7Ci0JCVRSQUNFX0VYSVQgLUVOT01FTTsKLQl9Ci0JbWVtc2V0KGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSwgMCwgc2l6ZW9mKGJ1ZmZlcl9zdHJ1Y3QpKTsKLQlmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10tPmFkZHJlc3MgPSBkbWFhbGxvYyhGVF9CVUZGX1NJWkUpOwotCWlmIChmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10tPmFkZHJlc3MgPT0gTlVMTCkgewotCQlrZnJlZShmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10pOwotCQlmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10gPSBOVUxMOwotCQlUUkFDRV9FWElUIC1FTk9NRU07Ci0JfQotCWZ0X25yX2J1ZmZlcnMgKys7Ci0JVFJBQ0UoZnRfdF9pbmZvLCAiYnVmZmVyIG5yICMlZCBAICVwLCBkbWEgYXJlYSBAICVwIiwKLQkgICAgICBmdF9ucl9idWZmZXJzLAotCSAgICAgIGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzLTFdLAotCSAgICAgIGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzLTFdLT5hZGRyZXNzKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbF9vbmVfYnVmZmVyKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JaWYgKGZ0X25yX2J1ZmZlcnMgPiAwKSB7Ci0JCVRSQUNFKGZ0X3RfaW5mbywgInJlbGVhc2luZyBidWZmZXIgbnIgIyVkIEAgJXAsIGRtYSBhcmVhIEAgJXAiLAotCQkgICAgICBmdF9ucl9idWZmZXJzLAotCQkgICAgICBmdF9idWZmZXJbZnRfbnJfYnVmZmVycy0xXSwKLQkJICAgICAgZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnMtMV0tPmFkZHJlc3MpOwotCQlmdF9ucl9idWZmZXJzIC0tOwotCQlkbWFmcmVlKGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXS0+YWRkcmVzcywgRlRfQlVGRl9TSVpFKTsKLQkJa2ZyZWUoZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdKTsKLQkJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdID0gTlVMTDsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotaW50IGZ0YXBlX3NldF9ucl9idWZmZXJzKGludCBjbnQpCi17Ci0JaW50IGRlbHRhID0gY250IC0gZnRfbnJfYnVmZmVyczsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChkZWx0YSA+IDApIHsKLQkJd2hpbGUgKGRlbHRhLS0pIHsKLQkJCWlmIChhZGRfb25lX2J1ZmZlcigpIDwgMCkgewotCQkJCVRSQUNFX0VYSVQgLUVOT01FTTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoZGVsdGEgPCAwKSB7Ci0JCXdoaWxlIChkZWx0YSsrKSB7Ci0JCQlkZWxfb25lX2J1ZmZlcigpOwotCQl9Ci0JfQotCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKLQlUUkFDRV9FWElUIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzk5Y2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfQlVGRkVSX0gKLSNkZWZpbmUgX0ZUQVBFX0JVRkZFUl9ICi0KLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDggJAotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFsbG9jYXRvci9kZWFsbG9jdG9yIGZvciBmdGFwZSdzIGR5bmFtaWMgZG1hCi0gKiAgYnVmZmVyLgotICovCi0KLWV4dGVybiBpbnQgIGZ0YXBlX3NldF9ucl9idWZmZXJzKGludCBjbnQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1MGJmZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3Zlbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmMsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowOCAkCi0gKgotICogICAgICBHUCBjYWxpYnJhdGlvbiByb3V0aW5lIGZvciBwcm9jZXNzb3Igc3BlZWQgZGVwZW5kZW50Ci0gKiAgICAgIGZ1bmN0aW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2lmIGRlZmluZWQoX19hbHBoYV9fKQotIyBpbmNsdWRlIDxhc20vaHdycGIuaD4KLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLSMgaW5jbHVkZSA8YXNtL21zci5oPgotIyBpbmNsdWRlIDxhc20vdGltZXguaD4KLSNlbGlmIGRlZmluZWQoX19pMzg2X18pCi0jIGluY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKLQotI3VuZGVmIERFQlVHCi0KLSNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotIyBlcnJvciBGdGFwZSBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHNfcGVyX2N5Y2xlID0gMDsKLSNlbmRpZgotCi1zdGF0aWMgc3BpbmxvY2tfdCBjYWxpYnJfbG9jazsKLQotLyoKLSAqIE5vdGU6IE9uIEludGVsIFBDcywgdGhlIGNsb2NrIHRpY2tzIGF0IDEwMCBIeiAoSFo9PTEwMCkgd2hpY2ggaXMKLSAqIHRvbyBzbG93IGZvciBjZXJ0YWluIHRpbWVvdXRzIChhbmQgdGhhdCBjbG9jayBkb2Vzbid0IGV2ZW4gdGljawotICogd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCkuICBGb3IgdGhhdCByZWFzb24sIHRoZSA4MjU0IHRpbWVyIGlzCi0gKiB1c2VkIGRpcmVjdGx5IHRvIGltcGxlbWVudCBmaW5lLWdyYWluZWQgdGltZW91dHMuICBIb3dldmVyLCBvbgotICogQWxwaGEgUENzLCB0aGUgODI1NCBpcyAqbm90KiB1c2VkIHRvIGltcGxlbWVudCB0aGUgY2xvY2sgdGljawotICogKHdoaWNoIGlzIDEwMjQgSHosIG5vcm1hbGx5KSBhbmQgdGhlIDgyNTQgdGltZXIgcnVucyBhdCBzb21lCi0gKiAicmFuZG9tIiBmcmVxdWVuY3kgKGl0IHNlZW1zIHRvIHJ1biBhdCAxOEh6LCBidXQgaXQncyBub3Qgc2FmZSB0bwotICogcmVseSBvbiB0aGlzIHZhbHVlKS4gIEluc3RlYWQsIHdlIHVzZSB0aGUgQWxwaGEncyAicnBjYyIKLSAqIGluc3RydWN0aW9uIHRvIHJlYWQgY3ljbGUgY291bnRzLiAgQXMgdGhpcyBpcyBhIDMyIGJpdCBjb3VudGVyLAotICogaXQgd2lsbCBvdmVyZmxvdyBvbmx5IG9uY2UgcGVyIDMwIHNlY29uZHMgKG9uIGEgMjAwTUh6IG1hY2hpbmUpLAotICogd2hpY2ggaXMgcGxlbnR5LgotICovCi0KLXVuc2lnbmVkIGludCBmdGFwZV90aW1lc3RhbXAodm9pZCkKLXsKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykKLQl1bnNpZ25lZCBsb25nIHI7Ci0KLQlhc20gdm9sYXRpbGUgKCJycGNjICUwIiA6ICI9ciIgKHIpKTsKLQlyZXR1cm4gcjsKLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLQl1bnNpZ25lZCBsb25nIHI7Ci0JcmR0c2NsKHIpOwotCXJldHVybiByOwotI2VsaWYgZGVmaW5lZChfX2kzODZfXykKLQotLyoKLSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBzb21lIHRpbWUgYmV0d2VlbiBjb3VudGVyIHVuZGVyZmxvd2luZyBhbmQgamlmZmllcwotICogaW5jcmVhc2luZywgc28gdGhlIGNvZGUgYmVsb3cgd29uJ3QgYWx3YXlzIGdpdmUgY29ycmVjdCBvdXRwdXQuCi0gKiAtVm9qdGVjaAotICovCi0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fdTE2IGxvOwotCV9fdTE2IGhpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbGlicl9sb2NrLCBmbGFncyk7Ci0Jb3V0Yl9wKDB4MDAsIDB4NDMpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLwotCWxvID0gaW5iX3AoMHg0MCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KLQlsbyB8PSBpbmIoMHg0MCkgPDwgODsKLQloaSA9IGppZmZpZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gKChoaSArIDEpICogKHVuc2lnbmVkIGludCkgTEFUQ0gpIC0gbG87ICAvKiBkb3duY291bnRlciAhICovCi0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzaG9ydF9mdGFwZV90aW1lc3RhbXAodm9pZCkKLXsKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotCXJldHVybiBmdGFwZV90aW1lc3RhbXAoKTsKLSNlbGlmIGRlZmluZWQoX19pMzg2X18pCi0JdW5zaWduZWQgaW50IGNvdW50OwotIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOwotIAlvdXRiX3AoMHgwMCwgMHg0Myk7CS8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCi0JY291bnQgPSBpbmJfcCgweDQwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLwotCWNvdW50IHw9IGluYigweDQwKSA8PCA4OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbGlicl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIChMQVRDSCAtIGNvdW50KTsJLyogbm9ybWFsOiBkb3duY291bnRlciAqLwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlmZih1bnNpZ25lZCBpbnQgdDAsIHVuc2lnbmVkIGludCB0MSkKLXsKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotCXJldHVybiAodDEgLSB0MCk7Ci0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQotCS8qCi0JICogVGhpcyBpcyB0cmlja3k6IHRvIHdvcmsgZm9yIGJvdGggc2hvcnQgYW5kIGZ1bGwgZnRhcGVfdGltZXN0YW1wcwotCSAqIHdlJ2xsIGhhdmUgdG8gZGlzY3JpbWluYXRlIGJldHdlZW4gdGhlc2UuCi0JICogSWYgaXQgX2xvb2tzXyBsaWtlIHNob3J0IHN0YW1wcyB3aXRoIHdyYXBwaW5nIGFyb3VuZCB3ZSdsbAotCSAqIGFzdW1lIGl0IGFyZS4gVGhpcyB3aWxsIGdlbmVyYXRlIGEgc21hbGwgZXJyb3IgaWYgaXQgcmVhbGx5Ci0JICogd2FzIGEgKHZlcnkgbGFyZ2UpIGRlbHRhIGZyb20gZnVsbCBmdGFwZV90aW1lc3RhbXBzLgotCSAqLwotCXJldHVybiAodDEgPD0gdDAgJiYgdDAgPD0gTEFUQ0gpID8gdDEgKyBMQVRDSCAtIHQwIDogdDEgLSB0MDsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHVzZWNzKHVuc2lnbmVkIGludCBjb3VudCkKLXsKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotCXJldHVybiAocHNfcGVyX2N5Y2xlICogY291bnQpIC8gMTAwMDAwMFVMOwotI2VsaWYgZGVmaW5lZChfX2kzODZfXykKLQlyZXR1cm4gKDEwMDAwICogY291bnQpIC8gKChDTE9DS19USUNLX1JBVEUgKyA1MCkgLyAxMDApOwotI2VuZGlmCi19Ci0KLXVuc2lnbmVkIGludCBmdGFwZV90aW1lZGlmZih1bnNpZ25lZCBpbnQgdDAsIHVuc2lnbmVkIGludCB0MSkKLXsKLQkvKgotCSAqICBDYWxjdWxhdGUgZGlmZmVyZW5jZSBpbiB1c2VjIGZvciBmdGFwZV90aW1lc3RhbXAgcmVzdWx0cyB0MCAmIHQxLgotCSAqICBOb3RlIHRoYXQgb24gdGhlIGkzODYgcGxhdGZvcm0gd2l0aCBzaG9ydCB0aW1lLXN0YW1wcywgdGhlCi0JICogIG1heGltdW0gYWxsb3dlZCB0aW1lc3BhbiBpcyAxL0haIG9yIHdlJ2xsIGxvc2UgdGlja3MhCi0JICovCi0JcmV0dXJuIHVzZWNzKGRpZmYodDAsIHQxKSk7Ci19Ci0KLS8qICAgICAgVG8gZ2V0IGFuIGluZGljYXRpb24gb2YgdGhlIEkvTyBwZXJmb3JtYW5jZSwKLSAqICAgICAgbWVhc3VyZSB0aGUgZHVyYXRpb24gb2YgdGhlIGluYigpIGZ1bmN0aW9uLgotICovCi1zdGF0aWMgdm9pZCB0aW1lX2luYih2b2lkKQotewotCWludCBpOwotCWludCB0MCwgdDE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc3RhdHVzOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKLQl0MCA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOwotCWZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKLQkJc3RhdHVzID0gaW5iKGZkYy5tc3IpOwotCX0KLQl0MSA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbGlicl9sb2NrLCBmbGFncyk7Ci0JVFJBQ0UoZnRfdF9pbmZvLCAiaW5iKCkgZHVyYXRpb246ICVkIG5zZWMiLCBmdGFwZV90aW1lZGlmZih0MCwgdDEpKTsKLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X2Nsb2NrKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotI2lmIGRlZmluZWQoX194ODZfNjRfXykKLQlwc19wZXJfY3ljbGUgPSAxMDAwMDAwMDAwVUwgLyBjcHVfa2h6OwotI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCi0JZXh0ZXJuIHN0cnVjdCBod3JwYl9zdHJ1Y3QgKmh3cnBiOwotCXBzX3Blcl9jeWNsZSA9ICgxMDAwKjEwMDAqMTAwMCoxMDAwVUwpIC8gaHdycGItPmN5Y2xlX2ZyZXE7Ci0jZW5kaWYKLQlUUkFDRV9FWElUOwotfQotCi0vKgotICogICAgICBJbnB1dDogIGZ1bmN0aW9uIHRha2luZyBpbnQgY291bnQgYXMgcGFyYW1ldGVyLgotICogICAgICAgICAgICAgIHBvaW50ZXJzIHRvIGNhbGN1bGF0ZWQgY2FsaWJyYXRpb24gdmFyaWFibGVzLgotICovCi12b2lkIGZ0YXBlX2NhbGlicmF0ZShjaGFyICpuYW1lLAotCQkgICAgdm9pZCAoKmZ1bikgKHVuc2lnbmVkIGludCksIAotCQkgICAgdW5zaWduZWQgaW50ICpjYWxpYnJfY291bnQsIAotCQkgICAgdW5zaWduZWQgaW50ICpjYWxpYnJfdGltZSkKLXsKLQlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOwotCWludCBpOwotCXVuc2lnbmVkIGludCB0YyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCXVuc2lnbmVkIGludCB0aW1lOwotI2lmIGRlZmluZWQoX19pMzg2X18pCi0JdW5zaWduZWQgaW50IG9sZF90YyA9IDA7Ci0JdW5zaWduZWQgaW50IG9sZF9jb3VudCA9IDE7Ci0JdW5zaWduZWQgaW50IG9sZF90aW1lID0gMTsKLSNlbmRpZgotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKGZpcnN0X3RpbWUpIHsgICAgICAgICAgICAgLyogZ2V0IGlkZWEgb2YgSS9PIHBlcmZvcm1hbmNlICovCi0JCWluaXRfY2xvY2soKTsKLQkJdGltZV9pbmIoKTsKLQkJZmlyc3RfdGltZSA9IDA7Ci0JfQotCS8qICAgIHZhbHVlIG9mIHRpbWVvdXQgbXVzdCBiZSBzZXQgc28gdGhhdCBvbiB2ZXJ5IHNsb3cgc3lzdGVtcwotCSAqICAgIGl0IHdpbGwgZ2l2ZSBhIHRpbWUgbGVzcyB0aGFuIG9uZSBqaWZmeSwgYW5kIG9uCi0JICogICAgdmVyeSBmYXN0IHN5c3RlbXMgaXQnbGwgZ2l2ZSByZWFzb25hYmxlIHByZWNpc2lvbi4KLQkgKi8KLQotCWNvdW50ID0gNDA7Ci0JZm9yIChpID0gMDsgaSA8IDE1OyArK2kpIHsKLQkJdW5zaWduZWQgaW50IHQwOwotCQl1bnNpZ25lZCBpbnQgdDE7Ci0JCXVuc2lnbmVkIGludCBvbmNlOwotCQl1bnNpZ25lZCBpbnQgbXVsdGlwbGU7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJKmNhbGlicl9jb3VudCA9Ci0JCSpjYWxpYnJfdGltZSA9IGNvdW50OwkvKiBzZXQgVEMgdG8gMSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKLQkJZnVuKDApOwkJLyogZHVtbXksIGdldCBjb2RlIGludG8gY2FjaGUgKi8KLQkJdDAgPSBzaG9ydF9mdGFwZV90aW1lc3RhbXAoKTsKLQkJZnVuKDApOwkJLyogb3ZlcmhlYWQgKyBvbmUgdGVzdCAqLwotCQl0MSA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOwotCQlvbmNlID0gZGlmZih0MCwgdDEpOwotCQl0MCA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOwotCQlmdW4oY291bnQpOwkJLyogb3ZlcmhlYWQgKyBjb3VudCB0ZXN0cyAqLwotCQl0MSA9IHNob3J0X2Z0YXBlX3RpbWVzdGFtcCgpOwotCQltdWx0aXBsZSA9IGRpZmYodDAsIHQxKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKLQkJdGltZSA9IGZ0YXBlX3RpbWVkaWZmKDAsIG11bHRpcGxlIC0gb25jZSk7Ci0JCXRjID0gKDEwMDAgKiB0aW1lKSAvIChjb3VudCAtIDEpOwotCQlUUkFDRShmdF90X2FueSwgIm9uY2U6JTNkIHVzLCU2ZCB0aW1lczolNmQgdXMsIFRDOiU1ZCBucyIsCi0JCQl1c2VjcyhvbmNlKSwgY291bnQgLSAxLCB1c2VjcyhtdWx0aXBsZSksIHRjKTsKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotCQkvKgotCQkgKiBJbmNyZWFzZSB0aGUgY2FsaWJyYXRpb24gY291bnQgZXhwb25lbnRpYWxseSB1bnRpbCB0aGUKLQkJICogY2FsaWJyYXRpb24gdGltZSBleGNlZWRzIDEwMCBtcy4KLQkJICovCi0JCWlmICh0aW1lID49IDEwMCoxMDAwKSB7Ci0JCQlicmVhazsKLQkJfQotI2VsaWYgZGVmaW5lZChfX2kzODZfXykKLQkJLyoKLQkJICogaW5jcmVhc2UgdGhlIGNvdW50IHVudGlsIHRoZSByZXN1bHRpbmcgdGltZSBuZWFycyAyL0haLAotCQkgKiB0aGVuIHRoZSB0YyB3aWxsIGRyb3Agc2hhcnBseSBiZWNhdXNlIHdlIGxvc2UgTEFUQ0ggY291bnRzLgotCQkgKi8KLQkJaWYgKHRjIDw9IG9sZF90YyAvIDIpIHsKLQkJCXRpbWUgPSBvbGRfdGltZTsKLQkJCWNvdW50ID0gb2xkX2NvdW50OwotCQkJYnJlYWs7Ci0JCX0KLQkJb2xkX3RjID0gdGM7Ci0JCW9sZF9jb3VudCA9IGNvdW50OwotCQlvbGRfdGltZSA9IHRpbWU7Ci0jZW5kaWYKLQkJY291bnQgKj0gMjsKLQl9Ci0JKmNhbGlicl9jb3VudCA9IGNvdW50IC0gMTsKLQkqY2FsaWJyX3RpbWUgID0gdGltZTsKLQlUUkFDRShmdF90X2luZm8sICJUQyBmb3IgYCVzKCknID0gJWQgbnNlYyAoYXQgJWQgY291bnRzKSIsCi0JICAgICBuYW1lLCAoMTAwMCAqICpjYWxpYnJfdGltZSkgLyAqY2FsaWJyX2NvdW50LCAqY2FsaWJyX2NvdW50KTsKLQlUUkFDRV9FWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdlNzUyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX0ZUQVBFX0NBTElCUl9ICi0jZGVmaW5lIF9GVEFQRV9DQUxJQlJfSAotCi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4xICQKLSAqICREYXRlOiAxOTk3LzA5LzE5IDA5OjA1OjI2ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBhIGdwIGNhbGlicmF0aW9uIHJvdXRpbmUgZm9yCi0gKiAgICAgIGhhcmR3YXJlIGRlcGVuZGVudCB0aW1lb3V0IGZ1bmN0aW9ucy4KLSAqLwotCi1leHRlcm4gdm9pZCBmdGFwZV9jYWxpYnJhdGUoY2hhciAqbmFtZSwKLQkJCSAgICB2b2lkICgqZnVuKSAodW5zaWduZWQgaW50KSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl9jb3VudCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl90aW1lKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZnRhcGVfdGltZXN0YW1wKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBmdGFwZV90aW1lZGlmZih1bnNpZ25lZCBpbnQgdDAsIHVuc2lnbmVkIGludCB0MSk7Ci0KLSNlbmRpZiAvKiBfRlRBUEVfQ0FMSUJSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3YzFjZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTYgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAgICAgICAgICAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYyx2ICQKLSAqICRSZXZpc2lvbjogMS40ICQKLSAqICREYXRlOiAxOTk3LzExLzExIDE0OjM3OjQ0ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXJlYWQvd3JpdGUgZnRhcGUgZnVuY3Rpb25zIGZvciB0aGUKLSAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qIGVhc2UgcG9ydGluZyBiZXR3ZWVuIHByZS0yLjQueCBhbmQgbGF0ZXIga2VybmVscyAqLwotI2RlZmluZSB2bWFfZ2V0X3Bnb2ZmKHYpICAgICAgKCh2KS0+dm1fcGdvZmYpCi0KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi1mdGFwZV9pbmZvIGZ0YXBlX3N0YXR1cyA9IHsKLS8qICB2ZW5kb3IgaW5mb3JtYXRpb24gKi8KLQl7IDAsIH0sICAgICAvKiBkcml2ZSB0eXBlICovCi0vKiAgZGF0YSByYXRlcyAqLwotCTUwMCwgICAgICAgIC8qIHVzZWQgZGF0YSByYXRlICovCi0JNTAwLCAgICAgICAgLyogZHJpdmUgbWF4IHJhdGUgKi8KLQk1MDAsICAgICAgICAvKiBmZGMgbWF4IHJhdGUgICAqLwotLyogIGRyaXZlIHNlbGVjdGlvbiwgZWl0aGVyIEZUQVBFX1NFTF9BL0IvQy9EICovCi0JLTEsICAgICAvKiBkcml2ZSBzZWxlY3Rpb24gKi8KLS8qICBmbGFncyBzZXQgYWZ0ZXIgZGVjb2RlIHRoZSBkcml2ZSBhbmQgdGFwZSBzdGF0dXMgICAqLwotCTAsICAgICAgICAgIC8qIGZvcm1hdHRlZCAqLwotCTEsICAgICAgICAgIC8qIG5vIHRhcGUgKi8KLQkxLCAgICAgICAgICAvKiB3cml0ZSBwcm90ZWN0ZWQgKi8KLQkxLCAgICAgICAgICAvKiBuZXcgdGFwZSAqLwotLyogIHZhbHVlcyBvZiBsYXN0IHF1ZXJpZWQgZHJpdmUvdGFwZSBzdGF0dXMgYW5kIGVycm9yICovCi0Je3swLH19LCAgICAgLyogbGFzdCBlcnJvciBjb2RlICovCi0Je3swLH19LCAgICAgLyogZHJpdmUgc3RhdHVzLCBjb25maWd1cmF0aW9uLCB0YXBlIHN0YXR1cyAqLwotLyogIGNhcnRyaWRnZSBnZW9tZXRyeSAqLwotICAgICAgICAyMCwgICAgICAgICAvKiB0cmFja3NfcGVyX3RhcGUgKi8KLSAgICAgICAgMTAyLCAgICAgICAgLyogc2VnbWVudHNfcGVyX3RyYWNrICovCi0vKiAgbG9jYXRpb24gb2YgaGVhZGVyIHNlZ21lbnRzLCBldGMuICovCi0JLTEsICAgICAvKiB1c2VkX2hlYWRlcl9zZWdtZW50ICovCi0JLTEsICAgICAvKiBoZWFkZXJfc2VnbWVudF8xICovCi0JLTEsICAgICAvKiBoZWFkZXJfc2VnbWVudF8yICovCi0JLTEsICAgICAvKiBmaXJzdF9kYXRhX3NlZ21lbnQgKi8KLSAgICAgICAgLTEsICAgICAvKiBsYXN0X2RhdGFfc2VnbWVudCAqLwotLyogIHRoZSBmb3JtYXQgY29kZSBhcyBzdG9yZWQgaW4gdGhlIGhlYWRlciBzZWdtZW50ICAqLwotCWZtdF9ub3JtYWwsIC8qIGZvcm1hdCBjb2RlICovCi0vKiAgdGhlIGRlZmF1bHQgZm9yIHRoZSBxaWMgc3RkOiB1bmtub3duICovCi0JLTEsCi0vKiAgaXMgdGFwZSBydW5uaW5nPyAqLwotCWlkbGUsICAgICAgIC8qIHJ1bm5lcl9zdGF0ZSAqLwotLyogIGlzIHRhcGUgcmVhZGluZy93cml0aW5nL3ZlcmlmeWluZy9mb3JtYXR0aW5nL2RlbGV0aW5nICovCi0JaWRsZSwgICAgICAgLyogZHJpdmVyIHN0YXRlICovCi0vKiAgZmxhZ3MgZmF0YWwgaGFyZHdhcmUgZXJyb3IgKi8KLQkxLCAgICAgICAgICAvKiBmYWlsdXJlICovCi0vKiAgaGlzdG9yeSByZWNvcmQgKi8KLQl7IDAsIH0gICAgICAvKiBoaXN0b3J5IHJlY29yZCAqLwotfTsKLQkKLWludCBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAgICAgPSAxMDIwOwotaW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9IDQ7Ci1pbnQgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOyAvKiBuZWVkIHRvIGJlIGdsb2JhbCBmb3IgZnRhcGVfcmVzZXRfZHJpdmUoKQotCQkJCSAgKiBpbiBmdGFwZS1pby5jCi0JCQkJICAqLwotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLXN0YXRpYyBjb25zdCB2ZW5kb3Jfc3RydWN0IHZlbmRvcnNbXSA9IFFJQzExN19WRU5ET1JTOwotc3RhdGljIGNvbnN0IHdha2V1cF9tZXRob2QgbWV0aG9kc1tdID0gV0FLRVVQX01FVEhPRFM7Ci0KLWNvbnN0IGZ0YXBlX2luZm8gKmZ0YXBlX2dldF9zdGF0dXModm9pZCkKLXsKLSNpZiBkZWZpbmVkKFNUQVRVU19QQVJBTk9ZQSkKLQlzdGF0aWMgZnRhcGVfaW5mbyBnZXRfc3RhdHVzOwotCi0JZ2V0X3N0YXR1cyA9IGZ0YXBlX3N0YXR1czsKLQlyZXR1cm4gJmdldF9zdGF0dXM7Ci0jZWxzZQotCXJldHVybiAmZnRhcGVfc3RhdHVzOyAvKiAgbWF5YmUgcmV0dXJuIG9ubHkgYSBjb3B5IG9mIGl0IHRvIGFzc3VyZSAKLQkJCSAgICAgICAqICByZWFkIG9ubHkgYWNjZXNzCi0JCQkgICAgICAgKi8KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IGZ0YXBlX25vdF9vcGVyYXRpb25hbChpbnQgc3RhdHVzKQotewotCS8qIHJldHVybiB0cnVlIGlmIHN0YXR1cyBpbmRpY2F0ZXMgdGFwZSBjYW4gbm90IGJlIHVzZWQuCi0JICovCi0JcmV0dXJuICgoc3RhdHVzIF4gUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCkgJgotCQkoUUlDX1NUQVRVU19FUlJPUiB8Ci0JCSBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UIHwKLQkJIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSkpOwotfQotCi1pbnQgZnRhcGVfc2Vla190b19lb3Qodm9pZCkKLXsKLQlpbnQgc3RhdHVzOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsICZzdGF0dXMpLCk7Ci0Jd2hpbGUgKChzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0VPVCkgPT0gMCkgewotCQlpZiAoZnRhcGVfbm90X29wZXJhdGlvbmFsKHN0YXR1cykpIHsKLQkJCVRSQUNFX0VYSVQgLUVJTzsKLQkJfQotCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1BIWVNJQ0FMX0ZPUldBUkQsCi0JCQkJCSAgICAgICBmdGFwZV90aW1lb3V0LnJld2luZCwmc3RhdHVzKSwpOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWludCBmdGFwZV9zZWVrX3RvX2JvdCh2b2lkKQotewotCWludCBzdGF0dXM7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cyksKTsKLQl3aGlsZSAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfQk9UKSA9PSAwKSB7Ci0JCWlmIChmdGFwZV9ub3Rfb3BlcmF0aW9uYWwoc3RhdHVzKSkgewotCQkJVFJBQ0VfRVhJVCAtRUlPOwotCQl9Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmRfd2FpdChRSUNfUEhZU0lDQUxfUkVWRVJTRSwKLQkJCQkJICAgICAgIGZ0YXBlX3RpbWVvdXQucmV3aW5kLCZzdGF0dXMpLCk7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBmdGFwZV9uZXdfY2FydHJpZGdlKHZvaWQpCi17Ci0JZnRfbG9jYXRpb24udHJhY2sgPSAtMTsgLyogZm9yY2Ugc2VlayBvbiBmaXJzdCBhY2Nlc3MgKi8KLQlmdGFwZV96YXBfcmVhZF9idWZmZXJzKCk7Ci0JZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnMoKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGZ0YXBlX2Fib3J0X29wZXJhdGlvbih2b2lkKQotewotCWludCByZXN1bHQgPSAwOwotCWludCBzdGF0dXM7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBydW5uaW5nKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJhYm9ydGluZyBydW5uZXIsIHdhaXRpbmciKTsKLQkJCi0JCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKLQkJLyogc2V0IHRpbWVvdXQgc28gdGhhdCB0aGUgdGFwZSB3aWxsIHJ1biB0byBsb2dpY2FsIEVPVAotCQkgKiBpZiB3ZSBtaXNzZWQgdGhlIGxhc3Qgc2VjdG9yIGFuZCB0aGVyZSBhcmUgbm8gcXVldWUgcHVsc2VzLgotCQkgKi8KLQkJcmVzdWx0ID0gZnRhcGVfZHVtYl9zdG9wKCk7Ci0JfQotCWlmIChmdF9ydW5uZXJfc3RhdHVzICE9IGlkbGUpIHsKLQkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmb3JjaW5nIHJ1bm5lciBhYm9ydCIpOwotCQl9Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJzdG9wcGluZyB0YXBlIik7Ci0JCXJlc3VsdCA9IGZ0YXBlX3N0b3BfdGFwZSgmc3RhdHVzKTsKLQkJZnRfbG9jYXRpb24ua25vd24gPSAwOwotCQlmdF9ydW5uZXJfc3RhdHVzICA9IGlkbGU7Ci0JfQotCWZ0YXBlX3Jlc2V0X2J1ZmZlcigpOwotCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKLQlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbG9va3VwX3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgdmVuZG9yX2lkKQotewotCWludCBpID0gMDsKLQotCXdoaWxlICh2ZW5kb3JzW2ldLnZlbmRvcl9pZCAhPSB2ZW5kb3JfaWQpIHsKLQkJaWYgKCsraSA+PSBOUl9JVEVNUyh2ZW5kb3JzKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXJldHVybiBpOwotfQotCi1zdGF0aWMgdm9pZCBmdGFwZV9kZXRhY2hfZHJpdmUodm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JVFJBQ0UoZnRfdF9mbG93LCAiZGlzYWJsaW5nIHRhcGUgZHJpdmUgYW5kIGZkYyIpOwotCWZ0YXBlX3B1dF9kcml2ZV90b19zbGVlcChmdF9kcml2ZV90eXBlLndha2VfdXApOwotCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDEpOwkvKiBvbmUgYWx3YXlzIGNvbWVzICovCi0JZmRjX2Rpc2FibGUoKTsKLQlmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOwotCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhcl9oaXN0b3J5KHZvaWQpCi17Ci0JZnRfaGlzdG9yeS51c2VkID0gMDsKLQlmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycyA9Ci0JCWZ0X2hpc3RvcnkuaWRfY3JjX2Vycm9ycyA9Ci0JCWZ0X2hpc3RvcnkuZGF0YV9hbV9lcnJvcnMgPQotCQlmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycyA9Ci0JCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMgPQotCQlmdF9oaXN0b3J5Lm5vX2RhdGFfZXJyb3JzID0KLQkJZnRfaGlzdG9yeS5yZXRyaWVzID0KLQkJZnRfaGlzdG9yeS5jcmNfZXJyb3JzID0KLQkJZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMgPQotCQlmdF9oaXN0b3J5LmVjY19mYWlsdXJlcyA9Ci0JCWZ0X2hpc3RvcnkuY29ycmVjdGVkID0KLQkJZnRfaGlzdG9yeS5kZWZlY3RzID0KLQkJZnRfaGlzdG9yeS5yZXdpbmRzID0gMDsKLX0KLQotc3RhdGljIGludCBmdGFwZV9hY3RpdmF0ZV9kcml2ZSh2ZW5kb3Jfc3RydWN0ICogZHJpdmVfdHlwZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCS8qIElmIHdlIGFscmVhZHkga25vdyB0aGUgZHJpdmUgdHlwZSwgd2FrZSBpdCB1cC4KLQkgKiBFbHNlIHRyeSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZHJpdmUgaXMgYXR0YWNoZWQuCi0JICovCi0JaWYgKGRyaXZlX3R5cGUtPndha2VfdXAgIT0gdW5rbm93bl93YWtlX3VwKSB7Ci0JCVRSQUNFKGZ0X3RfZmxvdywgImVuYWJsaW5nIHRhcGUgZHJpdmUgYW5kIGZkYyIpOwotCQlyZXN1bHQgPSBmdGFwZV93YWtldXBfZHJpdmUoZHJpdmVfdHlwZS0+d2FrZV91cCk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlUUkFDRShmdF90X2VyciwgImtub3duIHdha2V1cCBtZXRob2QgZmFpbGVkIik7Ci0JCX0KLQl9IGVsc2UgewotCQl3YWtlX3VwX3R5cGVzIG1ldGhvZDsKLQkJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOwotCQlpZiAoVFJBQ0VfTEVWRUwgPCBmdF90X2Zsb3cpIHsKLQkJCVNFVF9UUkFDRV9MRVZFTChmdF90X2J1Zyk7Ci0JCX0KLQotCQkvKiAgVHJ5IHRvIGF3YWtlbiB0aGUgZHJpdmUgdXNpbmcgYWxsIGtub3duIG1ldGhvZHMuCi0JCSAqICBMb3dlciB0cmFjaW5nIGZvciBhIHdoaWxlLgotCQkgKi8KLQkJZm9yIChtZXRob2Q9bm9fd2FrZV91cDsgbWV0aG9kIDwgTlJfSVRFTVMobWV0aG9kcyk7ICsrbWV0aG9kKSB7Ci0JCQlkcml2ZV90eXBlLT53YWtlX3VwID0gbWV0aG9kOwotI2lmZGVmIENPTkZJR19GVF9UV09fRFJJVkVTCi0JCQkvKiAgVGVzdCBzZXR1cCBmb3IgZHVhbCBkcml2ZSBjb25maWd1cmF0aW9uLgotCQkJICogIC9kZXYvcmZ0MiB1c2VzIG1vdW50YWluIHdha2V1cAotCQkJICogIC9kZXYvcmZ0MyB1c2VzIGNvbG9yYWRvIHdha2V1cAotCQkJICogIE90aGVyIHN5c3RlbXMgd2lsbCB1c2UgdGhlIG5vcm1hbCBzY2hlbWUuCi0JCQkgKi8KLQkJCWlmICgoZnRfZHJpdmVfc2VsIDwgMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLQkJCSAgICAoZnRfZHJpdmVfc2VsID09IDIgJiYgbWV0aG9kID09IEZUX1dBS0VfVVBfMSkgfHwKLQkJCSAgICAoZnRfZHJpdmVfc2VsID09IDMgJiYgbWV0aG9kID09IEZUX1dBS0VfVVBfMikpIHsKLQkJCQlyZXN1bHQ9ZnRhcGVfd2FrZXVwX2RyaXZlKGRyaXZlX3R5cGUtPndha2VfdXApOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSAtRUlPOwotCQkJfQotI2Vsc2UKLQkJCXJlc3VsdCA9IGZ0YXBlX3dha2V1cF9kcml2ZShkcml2ZV90eXBlLT53YWtlX3VwKTsKLSNlbmRpZgotCQkJaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLCAiZHJpdmUgd2FrZXVwIG1ldGhvZDogJXMiLAotCQkJCSAgICAgIG1ldGhvZHNbZHJpdmVfdHlwZS0+d2FrZV91cF0ubmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKLQotCQlpZiAobWV0aG9kID49IE5SX0lURU1TKG1ldGhvZHMpKSB7Ci0JCQkvKiBubyByZXNwb25zZSBhdCBhbGwsIGNhbm5vdCBvcGVuIHRoaXMgZHJpdmUgKi8KLQkJCWRyaXZlX3R5cGUtPndha2VfdXAgPSB1bmtub3duX3dha2VfdXA7Ci0JCQlUUkFDRShmdF90X2VyciwgIm5vIHRhcGUgZHJpdmUgZm91bmQgISIpOwotCQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJfQotCX0KLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQlpbnQgc3RhdHVzOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JZnRfbm9fdGFwZSA9IGZ0X3dyaXRlX3Byb3RlY3RlZCA9IDA7Ci0JLyogICAgVGFwZSBkcml2ZSBpcyBhY3RpdmF0ZWQgbm93LgotCSAqICAgIEZpcnN0IGNsZWFyIGVycm9yIHN0YXR1cyBpZiBwcmVzZW50LgotCSAqLwotCWRvIHsKLQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnJlc2V0LCAmc3RhdHVzKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCWlmIChyZXN1bHQgPT0gLUVUSU1FKSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZWFkeV93YWl0IHRpbWVvdXQiKTsKLQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IC1FSU5UUikgewotCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVhZHlfd2FpdCBhYm9ydGVkIik7Ci0JCQl9IGVsc2UgewotCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVhZHlfd2FpdCBmYWlsZWQiKTsKLQkJCX0KLQkJCVRSQUNFX0VYSVQgLUVJTzsKLQkJfQotCQkvKiAgQ2xlYXIgZXJyb3IgY29uZGl0aW9uIChkcml2ZSBpcyByZWFkeSAhKQotCQkgKi8KLQkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKLQkJCXVuc2lnbmVkIGludCBlcnJvcjsKLQkJCXFpYzExN19jbWRfdCBjb21tYW5kOwotCi0JCQlUUkFDRShmdF90X2VyciwgImVycm9yIHN0YXR1cyBzZXQiKTsKLQkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsCi0JCQkJICAgICAgInJlcG9ydF9lcnJvcl9jb2RlIGZhaWxlZDogJWQiLCByZXN1bHQpOwotCQkJCS8qIGhvcGUgaXQncyB3b3JraW5nIG5leHQgdGltZSAqLwotCQkJCWZ0YXBlX3Jlc2V0X2RyaXZlKCk7Ci0JCQkJVFJBQ0VfRVhJVCAtRUlPOwotCQkJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIGNvZGUgICA6ICVkIiwgZXJyb3IpOwotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciBjb21tYW5kOiAlZCIsIGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCWlmIChzdGF0dXMgJiBRSUNfU1RBVFVTX05FV19DQVJUUklER0UpIHsKLQkJCXVuc2lnbmVkIGludCBlcnJvcjsKLQkJCXFpYzExN19jbWRfdCBjb21tYW5kOwotCQkJY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOwotCQkJU0VUX1RSQUNFX0xFVkVMKGZ0X3RfYnVnKTsKLQotCQkJLyogIFVuZG9jdW1lbnRlZCBmZWF0dXJlOiBNdXN0IGNsZWFyIChub3QgcHJlc2VudCEpCi0JCQkgKiAgZXJyb3IgaGVyZSBvciB3ZSdsbCBmYWlsIGxhdGVyLgotCQkJICovCi0JCQlmdGFwZV9yZXBvcnRfZXJyb3IoJmVycm9yLCAmY29tbWFuZCwgMSk7Ci0KLQkJCVNFVF9UUkFDRV9MRVZFTChvbGRfdHJhY2luZyk7Ci0JCQlUUkFDRShmdF90X2luZm8sICJzdGF0dXM6IG5ldyBjYXJ0cmlkZ2UiKTsKLQkJCWZ0X25ld190YXBlID0gMTsKLQkJfSBlbHNlIHsKLQkJCWZ0X25ld190YXBlID0gMDsKLQkJfQotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JfSB3aGlsZSAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUik7Ci0JCi0JZnRfbm9fdGFwZSA9ICEoc3RhdHVzICYgUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCk7Ci0JZnRfd3JpdGVfcHJvdGVjdGVkID0gKHN0YXR1cyAmIFFJQ19TVEFUVVNfV1JJVEVfUFJPVEVDVCkgIT0gMDsKLQlpZiAoZnRfbm9fdGFwZSkgewotCQlUUkFDRShmdF90X3dhcm4sICJubyBjYXJ0cmlkZ2UgcHJlc2VudCIpOwotCX0gZWxzZSB7Ci0JCWlmIChmdF93cml0ZV9wcm90ZWN0ZWQpIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJXcml0ZSBwcm90ZWN0ZWQgY2FydHJpZGdlIik7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgdm9pZCBmdGFwZV9sb2dfdmVuZG9yX2lkKHZvaWQpCi17Ci0JaW50IHZlbmRvcl9pbmRleDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWZ0YXBlX3JlcG9ydF92ZW5kb3JfaWQoJmZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKTsKLQl2ZW5kb3JfaW5kZXggPSBsb29rdXBfdmVuZG9yX2lkKGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKTsKLQlpZiAoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gVU5LTk9XTl9WRU5ET1IgJiYKLQkgICAgZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfY29sb3JhZG8pIHsKLQkJdmVuZG9yX2luZGV4ID0gMDsKLQkJLyogaGFjayB0byBnZXQgcmlkIG9mIGFsbCB0aGlzIG1haWwgKi8KLQkJZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPSAwOwotCX0KLQlpZiAodmVuZG9yX2luZGV4IDwgMCkgewotCQkvKiBVbmtub3duIHZlbmRvciBpZCwgZmlyc3QgdGltZSBvcGVuaW5nIGRldmljZS4gIFRoZQotCQkgKiBkcml2ZV90eXBlIHJlbWFpbnMgc2V0IHRvIHR5cGUgZm91bmQgYXQgd2FrZXVwCi0JCSAqIHRpbWUsIHRoaXMgd2lsbCBwcm9iYWJseSBrZWVwIHRoZSBkcml2ZXIgb3BlcmF0aW5nCi0JCSAqIGZvciB0aGlzIG5ldyB2ZW5kb3IuICAKLQkJICovCi0JCVRSQUNFKGZ0X3Rfd2FybiwgIlxuIgotCQkgICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PSB1bmtub3duIHZlbmRvciBpZCA9PT09PT09PT09PVxuIgotCQkgICAgICBLRVJOX0lORk8gIkEgbmV3LCB5ZXQgdW5zdXBwb3J0ZWQgdGFwZSBkcml2ZSBpcyBmb3VuZFxuIgotCQkgICAgICBLRVJOX0lORk8gIlBsZWFzZSByZXBvcnQgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiICAgVmVuZG9yIGlkICAgICA6IDB4JTA0eFxuIgotCQkgICAgICBLRVJOX0lORk8gIiAgIFdha2V1cCBtZXRob2QgOiAlc1xuIgotCQkgICAgICBLRVJOX0lORk8gIkFuZCBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgdGFwZSBkcml2ZVxuIgotCQkgICAgICBLRVJOX0lORk8gInRvICJUSEVfRlRBUEVfTUFJTlRBSU5FUiJcbiIKLQkJICAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLAotCQkgICAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCwKLQkJICAgICAgbWV0aG9kc1tmdF9kcml2ZV90eXBlLndha2VfdXBdLm5hbWUpOwotCQlmdF9kcml2ZV90eXBlLnNwZWVkID0gMDsJCS8qIHVua25vd24gKi8KLQl9IGVsc2UgewotCQlmdF9kcml2ZV90eXBlLm5hbWUgID0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLm5hbWU7Ci0JCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSB2ZW5kb3JzW3ZlbmRvcl9pbmRleF0uc3BlZWQ7Ci0JCVRSQUNFKGZ0X3RfaW5mbywgInRhcGUgZHJpdmUgdHlwZTogJXMiLCBmdF9kcml2ZV90eXBlLm5hbWUpOwotCQkvKiBzY2FuIGFsbCBtZXRob2RzIGZvciB0aGlzIHZlbmRvcl9pZCBpbiB0YWJsZSAqLwotCQl3aGlsZShmdF9kcml2ZV90eXBlLndha2VfdXAgIT0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXApIHsKLQkJCWlmICh2ZW5kb3JfaW5kZXggPCBOUl9JVEVNUyh2ZW5kb3JzKSAtIDEgJiYKLQkJCSAgICB2ZW5kb3JzW3ZlbmRvcl9pbmRleCArIDFdLnZlbmRvcl9pZCAKLQkJCSAgICA9PSAKLQkJCSAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCkgewotCQkJCSsrdmVuZG9yX2luZGV4OwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZnRfZHJpdmVfdHlwZS53YWtlX3VwICE9IHZlbmRvcnNbdmVuZG9yX2luZGV4XS53YWtlX3VwKSB7Ci0JCQlUUkFDRShmdF90X3dhcm4sICJcbiIKLQkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgotCQkgICAgIEtFUk5fSU5GTyAid2FrZXVwIHR5cGUgbWlzbWF0Y2g6XG4iCi0JCSAgICAgS0VSTl9JTkZPICJmb3VuZDogJXMsIGV4cGVjdGVkOiAlc1xuIgotCQkgICAgIEtFUk5fSU5GTyAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICJUSEVfRlRBUEVfTUFJTlRBSU5FUiJcbiIKLQkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIsCi0JCQkgICAgICBtZXRob2RzW2Z0X2RyaXZlX3R5cGUud2FrZV91cF0ubmFtZSwKLQkJCSAgICAgIG1ldGhvZHNbdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXBdLm5hbWUpOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLXZvaWQgZnRhcGVfY2FsY190aW1lb3V0cyh1bnNpZ25lZCBpbnQgcWljX3N0ZCwKLQkJCSB1bnNpZ25lZCBpbnQgZGF0YV9yYXRlLAotCQkJIHVuc2lnbmVkIGludCB0YXBlX2xlbikKLXsKLQlpbnQgc3BlZWQ7CQkvKiBkZWNpLWlwcyAhICovCi0JaW50IGZmX3NwZWVkOwotCWludCBsZW5ndGg7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwZSB0cmFuc3BvcnQgc3BlZWQKLQkgKiAgZGF0YSByYXRlOiAgICAgICAgUUlDLTQwICAgUUlDLTgwICAgUUlDLTMwMTAgUUlDLTMwMjAKLQkgKgotCSAqICAgIDI1MCBLYnBzICAgICAgICAyNSBpcHMgICAgIG4vYSAgICAgIG4vYSAgICAgIG4vYQotCSAqICAgIDUwMCBLYnBzICAgICAgICA1MCBpcHMgICAzNCBpcHMgICAyMi42IGlwcyAgIG4vYQotCSAqICAgICAgMSBNYnBzICAgICAgICAgIG4vYSAgICA2OCBpcHMgICA0NS4yIGlwcyAyMi42IGlwcwotCSAqICAgICAgMiBNYnBzICAgICAgICAgIG4vYSAgICAgIG4vYSAgICAgIG4vYSAgICA0NS4yIGlwcwotCSAqCi0JICogIGZhc3QgdGFwZSB0cmFuc3BvcnQgc3BlZWQgaXMgYXQgbGVhc3QgNjggaXBzLgotCSAqLwotCXN3aXRjaCAocWljX3N0ZCkgewotCWNhc2UgUUlDX1RBUEVfUUlDNDA6Ci0JCXNwZWVkID0gKGRhdGFfcmF0ZSA9PSAyNTApID8gMjUwIDogNTAwOwotCQlicmVhazsKLQljYXNlIFFJQ19UQVBFX1FJQzgwOgotCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gNTAwKSA/IDM0MCA6IDY4MDsKLQkJYnJlYWs7Ci0JY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgotCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gNTAwKSA/IDIyNiA6IDQ1MjsKLQkJYnJlYWs7Ci0JY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgotCQlzcGVlZCA9IChkYXRhX3JhdGUgPT0gMTAwMCkgPyAyMjYgOiA0NTI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVRSQUNFKGZ0X3RfYnVnLCAiVW5rbm93biBxaWNfc3RkIChidWcpID8iKTsKLQkJc3BlZWQgPSA1MDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoZnRfZHJpdmVfdHlwZS5zcGVlZCA9PSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdDA7Ci0JCXN0YXRpYyBpbnQgZHQgPSAwOyAgICAgLyoga2VlcCBnY2MgZnJvbSBjb21wbGFpbmluZyAqLwotCQlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOwotCi0JCS8qICBNZWFzdXJlIHRoZSB0aW1lIGl0IHRha2VzIHRvIHdpbmQgdG8gRU9UIGFuZCBiYWNrIHRvIEJPVC4KLQkJICogIElmIHRoZSB0YXBlIGxlbmd0aCBpcyBrbm93biwgY2FsY3VsYXRlIHRoZSByZXdpbmQgc3BlZWQuCi0JCSAqICBFbHNlIGtlZXAgdGhlIHRpbWUgdmFsdWUgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZSByZXdpbmQKLQkJICogIHNwZWVkIGxhdGVyIG9uLCB3aGVuIHRoZSBsZW5ndGggX2lzXyBrbm93bi4KLQkJICogIEFzayBmb3IgYSByZXBvcnQgb25seSB3aGVuIGxlbmd0aCBhbmQgc3BlZWQgYXJlIGJvdGgga25vd24uCi0JCSAqLwotCQlpZiAoZmlyc3RfdGltZSkgewotCQkJZnRhcGVfc2Vla190b19ib3QoKTsKLQkJCXQwID0gamlmZmllczsKLQkJCWZ0YXBlX3NlZWtfdG9fZW90KCk7Ci0JCQlmdGFwZV9zZWVrX3RvX2JvdCgpOwotCQkJZHQgPSAoaW50KSAoKChqaWZmaWVzIC0gdDApICogRlRfVVNQVCkgLyAxMDAwKTsKLQkJCWlmIChkdCA8IDEpIHsKLQkJCQlkdCA9IDE7CS8qIHByZXZlbnQgZGl2IGJ5IHplcm8gb24gZmFpbHVyZXMgKi8KLQkJCX0KLQkJCWZpcnN0X3RpbWUgPSAwOwotCQkJVFJBQ0UoZnRfdF9pbmZvLAotCQkJICAgICAgInRyeWluZyB0byBkZXRlcm1pbmUgc2VlayB0aW1lb3V0LCBnb3QgJWQgbXNlYyIsCi0JCQkgICAgICBkdCk7Ci0JCX0KLQkJaWYgKHRhcGVfbGVuICE9IDApIHsKLQkJCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSAKLQkJCQkoMiAqIDEyICogdGFwZV9sZW4gKiAxMDAwKSAvIGR0OwotCQkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCi0JCSAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkJICAgICBLRVJOX0lORk8gImRyaXZlIHR5cGU6ICVzXG4iCi0JCSAgICAgS0VSTl9JTkZPICJkZWx0YSB0aW1lID0gJWQgbXMsIGxlbmd0aCA9ICVkIGZ0XG4iCi0JCSAgICAgS0VSTl9JTkZPICJoYXMgYSBtYXhpbXVtIHRhcGUgc3BlZWQgb2YgJWQgaXBzXG4iCi0JCSAgICAgS0VSTl9JTkZPICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gIlRIRV9GVEFQRV9NQUlOVEFJTkVSIlxuIgotCQkgICAgIEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKLQkJCSAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSwgZHQsIHRhcGVfbGVuLCAKLQkJCSAgICAgIGZ0X2RyaXZlX3R5cGUuc3BlZWQpOwotCQl9Ci0JfQotCS8qICBIYW5kbGUgdW5rbm93biBsZW5ndGggdGFwZXMgYXMgdmVyeSBsb25nIG9uZXMuIFdlJ2xsCi0JICogIGRldGVybWluZSB0aGUgYWN0dWFsIGxlbmd0aCBmcm9tIGEgaGVhZGVyIHNlZ21lbnQgbGF0ZXIuCi0JICogIFRoaXMgaXMgbm9ybWFsIGZvciBhbGwgbW9kZXJuIChXaWRlLFRSMS8yLzMpIGZvcm1hdHMuCi0JICovCi0JaWYgKHRhcGVfbGVuIDw9IDApIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJICAgICAgIlVua25vd24gdGFwZSBsZW5ndGgsIHVzaW5nIG1heGltYWwgdGltZW91dHMiKTsKLQkJbGVuZ3RoID0gUUlDX1RPUF9UQVBFX0xFTjsJLyogdXNlIHdvcnN0IGNhc2UgdmFsdWVzICovCi0JfSBlbHNlIHsKLQkJbGVuZ3RoID0gdGFwZV9sZW47CQkvKiB1c2UgYWN0dWFsIHZhbHVlcyAqLwotCX0KLQlpZiAoZnRfZHJpdmVfdHlwZS5zcGVlZCA9PSAwKSB7Ci0JCWZmX3NwZWVkID0gc3BlZWQ7IAotCX0gZWxzZSB7Ci0JCWZmX3NwZWVkID0gZnRfZHJpdmVfdHlwZS5zcGVlZDsKLQl9Ci0JLyogIHRpbWUgdG8gZ28gZnJvbSBib3QgdG8gZW90IGF0IG5vcm1hbCBzcGVlZCAoZGF0YSByYXRlKToKLQkgKiAgdGltZSA9ICgxK2RlbHRhKSAqIGxlbmd0aCAoZnQpICogMTIgKGluY2gvZnQpIC8gc3BlZWQgKGlwcykKLQkgKiAgZGVsdGEgPSAxMCAlIGZvciBzZWVrIHNwZWVkLCAyMCAlIGZvciByZXdpbmQgc3BlZWQuCi0JICovCi0JZnRhcGVfdGltZW91dC5zZWVrID0gKGxlbmd0aCAqIDEzMiAqIEZUX1NFQ09ORCkgLyBzcGVlZDsKLQlmdGFwZV90aW1lb3V0LnJld2luZCA9IChsZW5ndGggKiAxNDQgKiBGVF9TRUNPTkQpIC8gKDEwICogZmZfc3BlZWQpOwotCWZ0YXBlX3RpbWVvdXQucmVzZXQgPSAyMCAqIEZUX1NFQ09ORCArIGZ0YXBlX3RpbWVvdXQucmV3aW5kOwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0aW1lb3V0cyBmb3Igc3BlZWQgPSAlZCwgbGVuZ3RoID0gJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInNlZWsgdGltZW91dCAgOiAlZCBzZWNcbiIKLQkgICAgICBLRVJOX0lORk8gInJld2luZCB0aW1lb3V0OiAlZCBzZWNcbiIKLQkgICAgICBLRVJOX0lORk8gInJlc2V0IHRpbWVvdXQgOiAlZCBzZWMiLAotCSAgICAgIHNwZWVkLCBsZW5ndGgsCi0JICAgICAgKGZ0YXBlX3RpbWVvdXQuc2VlayArIDUwMCkgLyAxMDAwLAotCSAgICAgIChmdGFwZV90aW1lb3V0LnJld2luZCArIDUwMCkgLyAxMDAwLAotCSAgICAgIChmdGFwZV90aW1lb3V0LnJlc2V0ICsgNTAwKSAvIDEwMDApOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY2FsaWJyYXRlcyB0aGUgZGF0YXJhdGUgKGkuZS4gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbAotICogdXNhYmxlIGRhdGEgcmF0ZSkgYW5kIHNldHMgdGhlIGdsb2JhbCB2YXJpYWJsZSBmdF9xaWNfc3RkIHRvIHFpY19zdGQKLSAqCi0gKi8KLWludCBmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHVuc2lnbmVkIGludCBxaWNfc3RkKQotewotCWludCByYXRlID0gZnRfZmRjX3JhdGVfbGltaXQ7Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWZ0X3FpY19zdGQgPSBxaWNfc3RkOwotCi0JaWYgKGZ0X3FpY19zdGQgPT0gLTEpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCSJVbmFibGUgdG8gZGV0ZXJtaW5lIGRhdGEgcmF0ZSBpZiBRSUMgc3RhbmRhcmQgaXMgdW5rbm93biIpOwotCX0KLQotCS8qICBTZWxlY3QgaGlnaGVzdCByYXRlIHN1cHBvcnRlZCBieSBib3RoIGZkYyBhbmQgZHJpdmUuCi0JICogIFN0YXJ0IHdpdGggaGlnaGVzdCByYXRlIHN1cHBvcnRlZCBieSB0aGUgZmRjLgotCSAqLwotCXdoaWxlIChmZGNfc2V0X2RhdGFfcmF0ZShyYXRlKSA8IDAgJiYgcmF0ZSA+IDI1MCkgewotCQlyYXRlIC89IDI7Ci0JfQotCVRSQUNFKGZ0X3RfaW5mbywKLQkgICAgICAiSGlnaGVzdCBGREMgc3VwcG9ydGVkIGRhdGEgcmF0ZTogJWQgS2JwcyIsIHJhdGUpOwotCWZ0X2ZkY19tYXhfcmF0ZSA9IHJhdGU7Ci0JZG8gewotCQlyZXN1bHQgPSBmdGFwZV9zZXRfZGF0YV9yYXRlKHJhdGUsIGZ0X3FpY19zdGQpOwotCX0gd2hpbGUgKHJlc3VsdCA9PSAtRUlOVkFMICYmIChyYXRlIC89IDIpID4gMjUwKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgInNldCBkYXRhcmF0ZSBmYWlsZWQiKTsKLQl9Ci0JZnRfZGF0YV9yYXRlID0gcmF0ZTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnRhcGVfaW5pdF9kcml2ZSh2b2lkKQotewotCWludCBzdGF0dXM7Ci0JcWljX21vZGVsIG1vZGVsOwotCXVuc2lnbmVkIGludCBxaWNfc3RkOwotCXVuc2lnbmVkIGludCBkYXRhX3JhdGU7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDA7IC8qIGRvbid0IHJldHJ5IGlmIHRoaXMgZmFpbHMgPyAqLwotCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7Ci0JaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQpIHsKLQkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9CT1QpKSB7Ci0JCQkvKiAgQW50aXF1ZSBkcml2ZXMgd2lsbCBnZXQgaGVyZSBhZnRlciBhIHNvZnQgcmVzZXQsCi0JCQkgKiAgbW9kZXJuIG9uZXMgb25seSBpZiB0aGUgZHJpdmVyIGlzIGxvYWRlZCB3aGVuIHRoZQotCQkJICogIHRhcGUgd2Fzbid0IHJld291bmQgcHJvcGVybHkuCi0JCQkgKi8KLQkJCS8qIFRhcGUgc2hvdWxkIGJlIGF0IGJvdCBpZiBuZXcgY2FydHJpZGdlICEgKi8KLQkJCWZ0YXBlX3NlZWtfdG9fYm90KCk7Ci0JCX0KLQkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19SRUZFUkVOQ0VEKSkgewotCQkJVFJBQ0UoZnRfdF9mbG93LCAic3RhcnRpbmcgc2Vla19sb2FkX3BvaW50Iik7Ci0JCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kX3dhaXQoUUlDX1NFRUtfTE9BRF9QT0lOVCwKLQkJCQkJCSAgICAgICBmdGFwZV90aW1lb3V0LnJlc2V0LAotCQkJCQkJICAgICAgICZzdGF0dXMpLCk7Ci0JCX0KLQl9Ci0JZnRfZm9ybWF0dGVkID0gKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVGRVJFTkNFRCkgIT0gMDsKLQlpZiAoIWZ0X2Zvcm1hdHRlZCkgewotCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiB0YXBlIGlzIG5vdCBmb3JtYXR0ZWQgISIpOwotCX0KLQotCS8qICByZXBvcnQgY29uZmlndXJhdGlvbiBhYm9ydHMgd2hlbiBmdGFwZV90YXBlX2xlbiA9PSAtMQotCSAqICB1bmtub3duIHFpY19zdGQgaXMgb2theSBpZiBub3QgZm9ybWF0dGVkLgotCSAqLwotCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9jb25maWd1cmF0aW9uKCZtb2RlbCwKLQkJCQkJICAgICAgICZkYXRhX3JhdGUsCi0JCQkJCSAgICAgICAmcWljX3N0ZCwKLQkJCQkJICAgICAgICZmdGFwZV90YXBlX2xlbiksKTsKLQotCS8qICBNYXliZSBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgL3Byb2MgZW50cnkKLQkgKi8KLQlUUkFDRShmdF90X2luZm8sICIlcyBkcml2ZSBAICVkIEticHMiLAotCSAgICAgIChtb2RlbCA9PSBwcmVoaXN0b3JpYykgPyAicHJlaGlzdG9yaWMiIDoKLQkgICAgICAoKG1vZGVsID09IHByZV9xaWMxMTdjKSA/ICJwcmUgUUlDLTExN0MiIDoKLQkgICAgICAgKChtb2RlbCA9PSBwb3N0X3FpYzExN2IpID8gInBvc3QgUUlDLTExN0IiIDoKLQkJInBvc3QgUUlDLTExN0QiKSksIGRhdGFfcmF0ZSk7Ci0KLQlpZiAoZnRfZm9ybWF0dGVkKSB7Ci0JCS8qICBpbml0aWFsaXplIGZ0X3VzZWRfZGF0YV9yYXRlIHRvIG1heGltdW0gdmFsdWUgCi0JCSAqICBhbmQgc2V0IGZ0X3FpY19zdGQKLQkJICovCi0JCVRSQUNFX0NBVENIKGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUocWljX3N0ZCksKTsKLQkJaWYgKGZ0YXBlX3RhcGVfbGVuID09IDApIHsKLQkJCVRSQUNFKGZ0X3RfaW5mbywgInVua25vd24gbGVuZ3RoIFFJQy0lcyB0YXBlIiwKLQkJCSAgICAgIChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwKSA/ICI0MCIgOgotCQkJICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSA/ICI4MCIgOgotCQkJICAgICAgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDEwKSAKLQkJCQk/ICIzMDEwIiA6ICIzMDIwIikpKTsKLQkJfSBlbHNlIHsKLQkJCVRSQUNFKGZ0X3RfaW5mbywgIiVkIGZ0LiBRSUMtJXMgdGFwZSIsIGZ0YXBlX3RhcGVfbGVuLAotCQkJICAgICAgKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDApID8gIjQwIiA6Ci0JCQkgICAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDODApID8gIjgwIiA6Ci0JCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzMwMTApCi0JCQkJPyAiMzAxMCIgOiAiMzAyMCIpKSk7Ci0JCX0KLQkJZnRhcGVfY2FsY190aW1lb3V0cyhmdF9xaWNfc3RkLCBmdF9kYXRhX3JhdGUsIGZ0YXBlX3RhcGVfbGVuKTsKLQkJLyogc29mdCB3cml0ZS1wcm90ZWN0IFFJQy00MC9RSUMtODAgY2FydHJpZGdlcyB1c2VkIHdpdGggYQotCQkgKiBDb2xvcmFkbyBUMzAwMCBkcml2ZS4gQnVnZ3kgaGFyZHdhcmUhCi0JCSAqLwotCQlpZiAoKGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkID09IDB4MDExYzYpICYmCi0JCSAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDAgfHwKLQkJICAgICAgZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgJiYKLQkJICAgICAhZnRfd3JpdGVfcHJvdGVjdGVkKSkgewotCQkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCi0JS0VSTl9JTkZPICJUaGUgZmFtb3VzIENvbG9yYWRvIFQzMDAwIGJ1ZzpcbiIKLQlLRVJOX0lORk8gIiVzIGRyaXZlcyBjYW4ndCB3cml0ZSBRSUM0MCBhbmQgUUlDODBcbiIKLQlLRVJOX0lORk8gImNhcnRyaWRnZXMgYnV0IGRvbid0IHNldCB0aGUgd3JpdGUtcHJvdGVjdCBmbGFnISIsCi0JCQkgICAgICBmdF9kcml2ZV90eXBlLm5hbWUpOwotCQkJZnRfd3JpdGVfcHJvdGVjdGVkID0gMTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qICBEb2Vzbid0IG1ha2UgdG9vIG11Y2ggc2Vuc2UgdG8gc2V0IHRoZSBkYXRhIHJhdGUKLQkJICogIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHdyaXRlCi0JCSAqICBwcmVjb21wZW5zYXRpb24uCi0JCSAqICBOZWVkIHRvIGRvIHRoaXMgYWdhaW4gd2hlbiBmb3JtYXR0aW5nIHRoZSBjYXJ0cmlkZ2UuCi0JCSAqLwotCQlmdF9kYXRhX3JhdGUgPSBkYXRhX3JhdGU7Ci0JCWZ0YXBlX2NhbGNfdGltZW91dHMoUUlDX1RBUEVfUUlDNDAsCi0JCQkJICAgIGRhdGFfcmF0ZSwKLQkJCQkgICAgZnRhcGVfdGFwZV9sZW4pOwotCX0KLQlmdGFwZV9uZXdfY2FydHJpZGdlKCk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgdm9pZCBmdGFwZV9tdW5tYXAodm9pZCkKLXsKLQlpbnQgaTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgaSsrKSB7Ci0JCWZ0X2J1ZmZlcltpXS0+bW1hcHBlZCA9IDA7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qICAgTWFwIHRoZSBkbWEgYnVmZmVycyBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgZ2l2ZW4gYnkgdm1hLgotICogICBXZSBvbmx5IGNoZWNrIHRoZSBjYWxsZXIgZG9lc24ndCBtYXAgbm9uLWV4aXN0ZW50IGJ1ZmZlcnMuIFdlCi0gKiAgIGRvbid0IGNoZWNrIGZvciBtdWx0aXBsZSBtYXBwaW5ncy4KLSAqLwotaW50IGZ0YXBlX21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IG51bV9idWZmZXJzOwotCWludCBpOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmIChmdF9mYWlsdXJlKSB7Ci0JCVRSQUNFX0VYSVQgLUVOT0RFVjsKLQl9Ci0JaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEfFZNX1dSSVRFKSkpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJVbmRlZmluZWQgbW1hcCgpIGFjY2VzcyIpOwotCX0KLQlpZiAodm1hX2dldF9wZ29mZih2bWEpICE9IDApIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsICJwYWdlIG9mZnNldCBtdXN0IGJlIDAiKTsKLQl9Ci0JaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpICUgRlRfQlVGRl9TSVpFICE9IDApIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9lcnIsCi0JCQkgICAgInNpemUgPSAlbGQsIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mICVkIiwKLQkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCi0JCQkgICAgRlRfQlVGRl9TSVpFKTsKLQl9Ci0JbnVtX2J1ZmZlcnMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIEZUX0JVRkZfU0laRTsKLQlpZiAobnVtX2J1ZmZlcnMgPiBmdF9ucl9idWZmZXJzKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsCi0JCQkgICAgZnRfdF9lcnIsICJzaXplID0gJWxkLCBzaG91bGQgYmUgbGVzcyB0aGFuICVkIiwKLQkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCi0JCQkgICAgZnRfbnJfYnVmZmVycyAqIEZUX0JVRkZfU0laRSk7Ci0JfQotCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gaWRsZSkgewotCQkvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBidWZmZXIgc3RhdGVzIAotCQkgKi8KLQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7Ci0JfSBlbHNlIHsKLQkJZnRhcGVfcmVzZXRfYnVmZmVyKCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuOwotCi0JCXBmbiA9IHZpcnRfdG9fcGh5cyhmdF9idWZmZXJbaV0tPmFkZHJlc3MpID4+IFBBR0VfU0hJRlQ7Ci0JCVRSQUNFX0NBVENIKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQgKwotCQkJCQkgICAgIGkgKiBGVF9CVUZGX1NJWkUsCi0JCQkJCSAgICAgcGZuLAotCQkJCQkgICAgIEZUX0JVRkZfU0laRSwKLQkJCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCksCi0JCQkgICAgX3JlcyA9IC1FQUdBSU4pOwotCQlUUkFDRShmdF90X25vaXNlLCAicmVtYXBwZWQgZG1hIGJ1ZmZlciBAICVwIHRvIGxvY2F0aW9uIEAgJXAiLAotCQkgICAgICBmdF9idWZmZXJbaV0tPmFkZHJlc3MsCi0JCSAgICAgICh2b2lkICopKHZtYS0+dm1fc3RhcnQgKyBpICogRlRfQlVGRl9TSVpFKSk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7Ci0JCW1lbXNldChmdF9idWZmZXJbaV0tPmFkZHJlc3MsIDB4QUEsIEZUX0JVRkZfU0laRSk7Ci0JCWZ0X2J1ZmZlcltpXS0+bW1hcHBlZCsrOwotCX0JCi0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgdm9pZCBmdGFwZV9pbml0X2RyaXZlcih2b2lkKTsgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotCi0vKiAgICAgIE9QRU4gcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCi0gKi8KLWludCBmdGFwZV9lbmFibGUoaW50IGRyaXZlX3NlbGVjdGlvbikKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKGZ0X2RyaXZlX3NlbCA9PSAtMSB8fCBmdF9kcml2ZV9zZWwgIT0gZHJpdmVfc2VsZWN0aW9uKSB7Ci0JCS8qIE90aGVyIHNlbGVjdGlvbiB0aGFuIGxhc3QgdGltZQotCQkgKi8KLQkJZnRhcGVfaW5pdF9kcml2ZXIoKTsKLQl9Ci0JZnRfZHJpdmVfc2VsID0gRlRBUEVfU0VMKGRyaXZlX3NlbGVjdGlvbik7Ci0JZnRfZmFpbHVyZSA9IDA7Ci0JVFJBQ0VfQ0FUQ0goZmRjX2luaXQoKSwpOyAvKiBpbml0ICYgZGV0ZWN0IGZkYyAqLwotCVRSQUNFX0NBVENIKGZ0YXBlX2FjdGl2YXRlX2RyaXZlKCZmdF9kcml2ZV90eXBlKSwKLQkJICAgIGZkY19kaXNhYmxlKCk7Ci0JCSAgICBmZGNfcmVsZWFzZV9pcnFfYW5kX2RtYSgpOwotCQkgICAgZmRjX3JlbGVhc2VfcmVnaW9ucygpKTsKLQlUUkFDRV9DQVRDSChmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKCksIGZ0YXBlX2RldGFjaF9kcml2ZSgpKTsKLQlpZiAoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gVU5LTk9XTl9WRU5ET1IpIHsKLQkJZnRhcGVfbG9nX3ZlbmRvcl9pZCgpOwotCX0KLQlpZiAoZnRfbmV3X3RhcGUpIHsKLQkJZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQgPSAxOwotCX0KLQlpZiAoIWZ0X25vX3RhcGUgJiYgZnRhcGVfaW5pdF9kcml2ZV9uZWVkZWQpIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfaW5pdF9kcml2ZSgpLCBmdGFwZV9kZXRhY2hfZHJpdmUoKSk7Ci0JfQotCWZ0YXBlX211bm1hcCgpOyAvKiBjbGVhciB0aGUgbW1hcCBmbGFnICovCi0JY2xlYXJfaGlzdG9yeSgpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogICByZWxlYXNlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSBtb2R1bGVzCi0gKiAgIHpmdGFwZSBvciBzZnRhcGUuCi0gKi8KLXZvaWQgZnRhcGVfZGlzYWJsZSh2b2lkKQotewotCWludCBpOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgaSsrKSB7Ci0JCWlmIChmdF9idWZmZXJbaV0tPm1tYXBwZWQpIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaXJzdCBieXRlIG9mIGJ1ZmZlciAlZDogMHglMDJ4IiwKLQkJCSAgICAgIGksICpmdF9idWZmZXJbaV0tPmFkZHJlc3MpOwotCQl9Ci0JfQotCWlmIChzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ET05UX0JMT0NLKSAmJiAKLQkgICAgIShzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ORVZFUl9CTE9DSykpICYmCi0JICAgIGZ0YXBlX3RhcGVfcnVubmluZykgewotCQlUUkFDRShmdF90X3dhcm4sCi0JCSAgICAgICJJbnRlcnJ1cHRlZCBieSBmYXRhbCBzaWduYWwgYW5kIHRhcGUgc3RpbGwgcnVubmluZyIpOwotCQlmdGFwZV9kdW1iX3N0b3AoKTsKLQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7IC8qIGl0J3MgYW5ub3lpbmcgKi8KLQl9IGVsc2UgewotCQlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7Ci0JfQotCWZ0YXBlX2RldGFjaF9kcml2ZSgpOwotCWlmIChmdF9oaXN0b3J5LnVzZWQpIHsKLQkJVFJBQ0UoZnRfdF9pbmZvLCAiPT0gTm9uLWZhdGFsIGVycm9ycyB0aGlzIHJ1bjogPT0iKTsKLQkJVFJBQ0UoZnRfdF9pbmZvLCAiZmRjIGlzciBzdGF0aXN0aWNzOlxuIgotCQkgICAgICBLRVJOX0lORk8gIiBpZF9hbV9lcnJvcnMgICAgIDogJTNkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiIGlkX2NyY19lcnJvcnMgICAgOiAlM2RcbiIKLQkJICAgICAgS0VSTl9JTkZPICIgZGF0YV9hbV9lcnJvcnMgICA6ICUzZFxuIgotCQkgICAgICBLRVJOX0lORk8gIiBkYXRhX2NyY19lcnJvcnMgIDogJTNkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAiIG92ZXJydW5fZXJyb3JzICAgOiAlM2RcbiIKLQkJICAgICAgS0VSTl9JTkZPICIgbm9fZGF0YV9lcnJvcnMgICA6ICUzZFxuIgotCQkgICAgICBLRVJOX0lORk8gIiByZXRyaWVzICAgICAgICAgIDogJTNkIiwKLQkJICAgICAgZnRfaGlzdG9yeS5pZF9hbV9lcnJvcnMsICAgZnRfaGlzdG9yeS5pZF9jcmNfZXJyb3JzLAotCQkgICAgICBmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzLCBmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycywKLQkJICAgICAgZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycywgZnRfaGlzdG9yeS5ub19kYXRhX2Vycm9ycywKLQkJICAgICAgZnRfaGlzdG9yeS5yZXRyaWVzKTsKLQkJaWYgKGZ0X2hpc3RvcnkudXNlZCAmIDEpIHsKLQkJCVRSQUNFKGZ0X3RfaW5mbywgImVjYyBzdGF0aXN0aWNzOlxuIgotCQkJICAgICAgS0VSTl9JTkZPICIgY3JjX2Vycm9ycyAgICAgICA6ICUzZFxuIgotCQkJICAgICAgS0VSTl9JTkZPICIgY3JjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgotCQkJICAgICAgS0VSTl9JTkZPICIgZWNjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgotCQkJICAgICAgS0VSTl9JTkZPICIgc2VjdG9ycyBjb3JyZWN0ZWQ6ICUzZCIsCi0JCQkgICAgICBmdF9oaXN0b3J5LmNyY19lcnJvcnMsICAgZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMsCi0JCQkgICAgICBmdF9oaXN0b3J5LmVjY19mYWlsdXJlcywgZnRfaGlzdG9yeS5jb3JyZWN0ZWQpOwotCQl9Ci0JCWlmIChmdF9oaXN0b3J5LmRlZmVjdHMgPiAwKSB7Ci0JCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiAlZCBtZWRpYSBkZWZlY3RzISIsCi0JCQkgICAgICBmdF9oaXN0b3J5LmRlZmVjdHMpOwotCQl9Ci0JCWlmIChmdF9oaXN0b3J5LnJld2luZHMgPiAwKSB7Ci0JCQlUUkFDRShmdF90X2luZm8sICJ0YXBlIG1vdGlvbiBzdGF0aXN0aWNzOlxuIgotCQkJICAgICAgS0VSTl9JTkZPICJyZXBvc2l0aW9ucyAgICAgICA6ICUzZCIsCi0JCQkgICAgICBmdF9oaXN0b3J5LnJld2luZHMpOwotCQl9Ci0JfQotCWZ0X2ZhaWx1cmUgPSAxOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ0YXBlX2luaXRfZHJpdmVyKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCA9IFVOS05PV05fVkVORE9SOwotCWZ0X2RyaXZlX3R5cGUuc3BlZWQgICAgID0gMDsKLQlmdF9kcml2ZV90eXBlLndha2VfdXAgICA9IHVua25vd25fd2FrZV91cDsKLQlmdF9kcml2ZV90eXBlLm5hbWUgICAgICA9ICJVbmtub3duIjsKLQotCWZ0YXBlX3RpbWVvdXQuc2VlayAgICAgID0gNjUwICogRlRfU0VDT05EOwotCWZ0YXBlX3RpbWVvdXQucmVzZXQgICAgID0gNjcwICogRlRfU0VDT05EOwotCWZ0YXBlX3RpbWVvdXQucmV3aW5kICAgID0gNjUwICogRlRfU0VDT05EOwotCWZ0YXBlX3RpbWVvdXQuaGVhZF9zZWVrID0gIDE1ICogRlRfU0VDT05EOwotCWZ0YXBlX3RpbWVvdXQuc3RvcCAgICAgID0gICA1ICogRlRfU0VDT05EOwotCWZ0YXBlX3RpbWVvdXQucGF1c2UgICAgID0gIDE2ICogRlRfU0VDT05EOwotCi0JZnRfcWljX3N0ZCAgICAgICAgICAgICA9IC0xOwotCWZ0YXBlX3RhcGVfbGVuICAgICAgICAgPSAwOyAgLyogdW5rbm93biAqLwotCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCAgPSAwOwotCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSAtMTsKLQotCWZ0X3NlZ21lbnRzX3Blcl90cmFjayAgICAgICA9IDEwMjsKLQlmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAgICAgPSAxMDIwOwotCWZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA9IDQ7Ci0JZnRfdHJhY2tzX3Blcl90YXBlICAgICAgICAgID0gMjA7Ci0KLQlmdF9mYWlsdXJlID0gMTsKLQotCWZ0X2Zvcm1hdHRlZCAgICAgICA9IDA7Ci0JZnRfbm9fdGFwZSAgICAgICAgID0gMTsKLQlmdF93cml0ZV9wcm90ZWN0ZWQgPSAxOwotCWZ0X25ld190YXBlICAgICAgICA9IDE7Ci0KLQlmdF9kcml2ZXJfc3RhdGUgPSBpZGxlOwotCi0JZnRfZGF0YV9yYXRlID0gCi0JCWZ0X2ZkY19tYXhfcmF0ZSAgID0gNTAwOwotCWZ0X2RyaXZlX21heF9yYXRlID0gMDsgLyogdHJpZ2dlcnMgc2V0X3JhdGVfdGVzdCgpICovCi0KLQlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7Ci0KLQlmdF9oZWFkZXJfc2VnbWVudF8xICAgID0gLTE7Ci0JZnRfaGVhZGVyX3NlZ21lbnRfMiAgICA9IC0xOwotCWZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPSAtMTsKLQlmdF9maXJzdF9kYXRhX3NlZ21lbnQgID0gLTE7Ci0JZnRfbGFzdF9kYXRhX3NlZ21lbnQgICA9IC0xOwotCi0JZnRfbG9jYXRpb24udHJhY2sgPSAtMTsKLQlmdF9sb2NhdGlvbi5rbm93biA9IDA7Ci0KLQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOwotCWZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayA9IDE7Ci0KLQlmdGFwZV9uZXdfY2FydHJpZGdlKCk7CS8qIGluaXQgc29tZSB0YXBlIHJlbGF0ZWQgdmFyaWFibGVzICovCi0JZnRhcGVfaW5pdF9ic20oKTsKLQlUUkFDRV9FWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjVlMzBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9DVExfSAotI2RlZmluZSBfRlRBUEVfQ1RMX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDkgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBub24tc3RhbmRhcmQgSU9DVEwgcmVsYXRlZCBkZWZpbml0aW9ucwotICogICAgICBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yCi0gKiAgICAgIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS12ZW5kb3JzLmg+Ci0KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50Lmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdXNlZDsJCS8qIGFueSByZWFkaW5nIG9yIHdyaXRpbmcgZG9uZSAqLwotCS8qIGlzciBzdGF0aXN0aWNzICovCi0JdW5zaWduZWQgaW50IGlkX2FtX2Vycm9yczsJLyogaWQgYWRkcmVzcyBtYXJrIG5vdCBmb3VuZCAqLwotCXVuc2lnbmVkIGludCBpZF9jcmNfZXJyb3JzOwkvKiBjcmMgZXJyb3IgaW4gaWQgYWRkcmVzcyBtYXJrICovCi0JdW5zaWduZWQgaW50IGRhdGFfYW1fZXJyb3JzOwkvKiBkYXRhIGFkZHJlc3MgbWFyayBub3QgZm91bmQgKi8KLQl1bnNpZ25lZCBpbnQgZGF0YV9jcmNfZXJyb3JzOwkvKiBjcmMgZXJyb3IgaW4gZGF0YSBmaWVsZCAqLwotCXVuc2lnbmVkIGludCBvdmVycnVuX2Vycm9yczsJLyogZmRjIGFjY2VzcyB0aW1pbmcgcHJvYmxlbSAqLwotCXVuc2lnbmVkIGludCBub19kYXRhX2Vycm9yczsJLyogc2VjdG9yIG5vdCBmb3VuZCAqLwotCXVuc2lnbmVkIGludCByZXRyaWVzOwkvKiBudW1iZXIgb2YgdGFwZSByZXRyaWVzICovCi0JLyogZWNjIHN0YXRpc3RpY3MgKi8KLQl1bnNpZ25lZCBpbnQgY3JjX2Vycm9yczsJLyogY3JjIGVycm9yIGluIGRhdGEgKi8KLQl1bnNpZ25lZCBpbnQgY3JjX2ZhaWx1cmVzOwkvKiBiYWQgZGF0YSB3aXRob3V0IGNyYyBlcnJvciAqLwotCXVuc2lnbmVkIGludCBlY2NfZmFpbHVyZXM7CS8qIGZhaWxlZCB0byBjb3JyZWN0ICovCi0JdW5zaWduZWQgaW50IGNvcnJlY3RlZDsJLyogdG90YWwgc2VjdG9ycyBjb3JyZWN0ZWQgKi8KLQkvKiBnZW5lcmFsIHN0YXRpc3RpY3MgKi8KLQl1bnNpZ25lZCBpbnQgcmV3aW5kczsJLyogbnVtYmVyIG9mIHRhcGUgcmV3aW5kcyAqLwotCXVuc2lnbmVkIGludCBkZWZlY3RzOwkvKiBiYWQgc2VjdG9ycyBkdWUgdG8gbWVkaWEgZGVmZWN0cyAqLwotfSBoaXN0b3J5X3JlY29yZDsKLQotLyogdGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgKiBBTEwgKiBpbmZvcm1hdGlvbiB0aGF0IHdlIHdhbnQKLSAqIG91ciBjaGlsZCBtb2R1bGVzIHRvIGtub3cgYWJvdXQsIGJ1dCBkb24ndCB3YW50IHRoZW0gdG8KLSAqIG1vZGlmeS4gCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiAgdmVuZG9yIGluZm9ybWF0aW9uICovCi0JdmVuZG9yX3N0cnVjdCBmdGlfZHJpdmVfdHlwZTsKLQkvKiAgZGF0YSByYXRlcyAqLwotCXVuc2lnbmVkIGludCBmdGlfdXNlZF9kYXRhX3JhdGU7Ci0JdW5zaWduZWQgaW50IGZ0aV9kcml2ZV9tYXhfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgZnRpX2ZkY19tYXhfcmF0ZTsKLQkvKiAgZHJpdmUgc2VsZWN0aW9uLCBlaXRoZXIgRlRBUEVfU0VMX0EvQi9DL0QgKi8KLQlpbnQgZnRpX2RyaXZlX3NlbDsgICAgICAKLQkvKiAgZmxhZ3Mgc2V0IGFmdGVyIGRlY29kZSB0aGUgZHJpdmUgYW5kIHRhcGUgc3RhdHVzICAgKi8KLQl1bnNpZ25lZCBpbnQgZnRpX2Zvcm1hdHRlZCAgICAgIDoxOwotCXVuc2lnbmVkIGludCBmdGlfbm9fdGFwZSAgICAgICAgOjE7Ci0JdW5zaWduZWQgaW50IGZ0aV93cml0ZV9wcm90ZWN0ZWQ6MTsKLQl1bnNpZ25lZCBpbnQgZnRpX25ld190YXBlICAgICAgIDoxOwotCS8qICB2YWx1ZXMgb2YgbGFzdCBxdWVyaWVkIGRyaXZlL3RhcGUgc3RhdHVzIGFuZCBlcnJvciAqLwotCWZ0X2RyaXZlX2Vycm9yICBmdGlfbGFzdF9lcnJvcjsKLQlmdF9kcml2ZV9zdGF0dXMgZnRpX2xhc3Rfc3RhdHVzOwotCS8qICBjYXJ0cmlkZ2UgZ2VvbWV0cnkgKi8KLQl1bnNpZ25lZCBpbnQgZnRpX3RyYWNrc19wZXJfdGFwZTsKLQl1bnNpZ25lZCBpbnQgZnRpX3NlZ21lbnRzX3Blcl90cmFjazsKLQkvKiAgbG9jYXRpb24gb2YgaGVhZGVyIHNlZ21lbnRzLCBldGMuICovCi0JaW50IGZ0aV91c2VkX2hlYWRlcl9zZWdtZW50OwotCWludCBmdGlfaGVhZGVyX3NlZ21lbnRfMTsKLQlpbnQgZnRpX2hlYWRlcl9zZWdtZW50XzI7Ci0JaW50IGZ0aV9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JaW50IGZ0aV9sYXN0X2RhdGFfc2VnbWVudDsKLQkvKiAgdGhlIGZvcm1hdCBjb2RlIGFzIHN0b3JlZCBpbiB0aGUgaGVhZGVyIHNlZ21lbnQgICovCi0JZnRfZm9ybWF0X3R5cGUgIGZ0aV9mb3JtYXRfY29kZTsKLQkvKiAgdGhlIGZvbGxvd2luZyBpcyB0aGUgc29sZSByZWFzb24gZm9yIHRoZSBmdGFwZV9zZXRfc3RhdHVzKCkgY2FsbCAqLwotCXVuc2lnbmVkIGludCBmdGlfcWljX3N0ZDsKLQkvKiAgaXMgdGFwZSBydW5uaW5nPyAqLwotCXZvbGF0aWxlIGVudW0gcnVubmVyX3N0YXR1c19lbnVtIGZ0aV9ydW5uZXJfc3RhdHVzOwotCS8qICBpcyB0YXBlIHJlYWRpbmcvd3JpdGluZy92ZXJpZnlpbmcvZm9ybWF0dGluZy9kZWxldGluZyAqLwotCWJ1ZmZlcl9zdGF0ZV9lbnVtIGZ0aV9zdGF0ZTsKLQkvKiAgZmxhZ3MgZmF0YWwgaGFyZHdhcmUgZXJyb3IgKi8KLQl1bnNpZ25lZCBpbnQgZnRpX2ZhaWx1cmU6MTsKLQkvKiAgaGlzdG9yeSByZWNvcmQgKi8KLQloaXN0b3J5X3JlY29yZCBmdGlfaGlzdG9yeTsKLX0gZnRhcGVfaW5mbzsKLQotLyogdmVuZG9yIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIGZ0X2RyaXZlX3R5cGUgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9kcml2ZV90eXBlCi0vKiAgZGF0YSByYXRlcyAqLwotI2RlZmluZSBmdF9kYXRhX3JhdGUgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfdXNlZF9kYXRhX3JhdGUKLSNkZWZpbmUgZnRfZHJpdmVfbWF4X3JhdGUgICAgICBmdGFwZV9zdGF0dXMuZnRpX2RyaXZlX21heF9yYXRlCi0jZGVmaW5lIGZ0X2ZkY19tYXhfcmF0ZSAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9mZGNfbWF4X3JhdGUKLS8qICBkcml2ZSBzZWxlY3Rpb24sIGVpdGhlciBGVEFQRV9TRUxfQS9CL0MvRCAqLwotI2RlZmluZSBmdF9kcml2ZV9zZWwgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZHJpdmVfc2VsCi0vKiAgZmxhZ3Mgc2V0IGFmdGVyIGRlY29kZSB0aGUgZHJpdmUgYW5kIHRhcGUgc3RhdHVzICAgKi8KLSNkZWZpbmUgZnRfZm9ybWF0dGVkICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2Zvcm1hdHRlZAotI2RlZmluZSBmdF9ub190YXBlICAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfbm9fdGFwZQotI2RlZmluZSBmdF93cml0ZV9wcm90ZWN0ZWQgICAgIGZ0YXBlX3N0YXR1cy5mdGlfd3JpdGVfcHJvdGVjdGVkCi0jZGVmaW5lIGZ0X25ld190YXBlICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9uZXdfdGFwZQotLyogIHZhbHVlcyBvZiBsYXN0IHF1ZXJpZWQgZHJpdmUvdGFwZSBzdGF0dXMgYW5kIGVycm9yICovCi0jZGVmaW5lIGZ0X2xhc3RfZXJyb3IgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9sYXN0X2Vycm9yCi0jZGVmaW5lIGZ0X2xhc3Rfc3RhdHVzICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9sYXN0X3N0YXR1cwotLyogIGNhcnRyaWRnZSBnZW9tZXRyeSAqLwotI2RlZmluZSBmdF90cmFja3NfcGVyX3RhcGUgICAgIGZ0YXBlX3N0YXR1cy5mdGlfdHJhY2tzX3Blcl90YXBlCi0jZGVmaW5lIGZ0X3NlZ21lbnRzX3Blcl90cmFjayAgZnRhcGVfc3RhdHVzLmZ0aV9zZWdtZW50c19wZXJfdHJhY2sKLS8qICB0aGUgZm9ybWF0IGNvZGUgYXMgc3RvcmVkIGluIHRoZSBoZWFkZXIgc2VnbWVudCAgKi8KLSNkZWZpbmUgZnRfZm9ybWF0X2NvZGUgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2Zvcm1hdF9jb2RlCi0vKiAgdGhlIHFpYyBzdGF0dXMgYXMgcmV0dXJuZWQgYnkgcmVwb3J0IGRyaXZlIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgZnRfcWljX3N0ZCAgICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX3FpY19zdGQKLSNkZWZpbmUgZnRfdXNlZF9oZWFkZXJfc2VnbWVudCBmdGFwZV9zdGF0dXMuZnRpX3VzZWRfaGVhZGVyX3NlZ21lbnQKLSNkZWZpbmUgZnRfaGVhZGVyX3NlZ21lbnRfMSAgICBmdGFwZV9zdGF0dXMuZnRpX2hlYWRlcl9zZWdtZW50XzEKLSNkZWZpbmUgZnRfaGVhZGVyX3NlZ21lbnRfMiAgICBmdGFwZV9zdGF0dXMuZnRpX2hlYWRlcl9zZWdtZW50XzIKLSNkZWZpbmUgZnRfZmlyc3RfZGF0YV9zZWdtZW50ICBmdGFwZV9zdGF0dXMuZnRpX2ZpcnN0X2RhdGFfc2VnbWVudAotI2RlZmluZSBmdF9sYXN0X2RhdGFfc2VnbWVudCAgIGZ0YXBlX3N0YXR1cy5mdGlfbGFzdF9kYXRhX3NlZ21lbnQKLS8qICBpcyB0YXBlIHJ1bm5pbmc/ICovCi0jZGVmaW5lIGZ0X3J1bm5lcl9zdGF0dXMgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9ydW5uZXJfc3RhdHVzCi0vKiAgaXMgdGFwZSByZWFkaW5nL3dyaXRpbmcvdmVyaWZ5aW5nL2Zvcm1hdHRpbmcvZGVsZXRpbmcgKi8KLSNkZWZpbmUgZnRfZHJpdmVyX3N0YXRlICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX3N0YXRlCi0vKiAgZmxhZ3MgZmF0YWwgaGFyZHdhcmUgZXJyb3IgKi8KLSNkZWZpbmUgZnRfZmFpbHVyZSAgICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2ZhaWx1cmUKLS8qICBoaXN0b3J5IHJlY29yZCAqLwotI2RlZmluZSBmdF9oaXN0b3J5ICAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfaGlzdG9yeQotCi0vKgotICogICAgICBmdGFwZS1jdGwuYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgotICovCi1leHRlcm4gZnRhcGVfaW5mbyBmdGFwZV9zdGF0dXM7Ci1leHRlcm4gaW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkOwotZXh0ZXJuIGludCBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXI7Ci1leHRlcm4gaW50IGZ0YXBlX2luaXRfZHJpdmVfbmVlZGVkOwotCi0vKgotICogICAgICBmdGFwZS1jdGwuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiBpbnQgIGZ0YXBlX21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotZXh0ZXJuIGludCAgZnRhcGVfZW5hYmxlKGludCBkcml2ZV9zZWxlY3Rpb24pOwotZXh0ZXJuIHZvaWQgZnRhcGVfZGlzYWJsZSh2b2lkKTsKLWV4dGVybiBpbnQgIGZ0YXBlX3NlZWtfdG9fYm90KHZvaWQpOwotZXh0ZXJuIGludCAgZnRhcGVfc2Vla190b19lb3Qodm9pZCk7Ci1leHRlcm4gaW50ICBmdGFwZV9hYm9ydF9vcGVyYXRpb24odm9pZCk7Ci1leHRlcm4gdm9pZCBmdGFwZV9jYWxjX3RpbWVvdXRzKHVuc2lnbmVkIGludCBxaWNfc3RkLAotCQkJCSB1bnNpZ25lZCBpbnQgZGF0YV9yYXRlLAotCQkJCSB1bnNpZ25lZCBpbnQgdGFwZV9sZW4pOwotZXh0ZXJuIGludCAgZnRhcGVfY2FsaWJyYXRlX2RhdGFfcmF0ZSh1bnNpZ25lZCBpbnQgcWljX3N0ZCk7Ci1leHRlcm4gY29uc3QgZnRhcGVfaW5mbyAqZnRhcGVfZ2V0X3N0YXR1cyh2b2lkKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTYzMmY2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYworKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKgotICoKLSAqICAgICAgQ29weXJpZ2h0IChjKSAxOTkzIE5pbmcgYW5kIERhdmlkIE1vc2Jlcmdlci4KLSAKLSBUaGlzIGlzIGJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJhcyBMYWFyaG92ZW4gKGJhc0B2aW1lYy5ubCkKLSBhbmQgRGF2aWQgTC4gQnJvd24sIEpyLiwgYW5kIGluY29ycG9yYXRlcyBpbXByb3ZlbWVudHMgc3VnZ2VzdGVkIGJ5Ci0gS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4uCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0geW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjEwICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24gY29kZSAKLSAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KLQotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1lY2MuaCIKLQotLyogTWFjaGluZXMgdGhhdCBhcmUgYmlnLWVuZGlhbiBzaG91bGQgZGVmaW5lIG1hY3JvIEJJR19FTkRJQU4uCi0gKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHN0YW5kYXJkIGluY2x1ZGUgZmlsZQotICogdGhhdCB3b3JrcyBmb3IgYWxsIE9Tcy4KLSAqLwotCi0jaWYgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19ocHBhKQotI2RlZmluZSBCSUdfRU5ESUFOCi0jZW5kaWYJCQkJLyogX19zcGFyY19fIHx8IF9faHBwYSAqLwotCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLSNlcnJvciBGaW5kIGEgc21hcnQgd2F5IHRvIGRldGVybWluZSB0aGUgRW5kaWFubmVzcyBvZiB0aGUgTUlQUyBDUFUKLSNlbmRpZgotCi0vKiBOb3RpY2U6IHRvIG1pbmltaXplIHRoZSBwb3RlbnRpYWwgZm9yIGNvbmZ1c2lvbiwgd2UgdXNlIHIgdG8KLSAqICAgICAgICAgZGVub3RlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBvZiB0aGUgcG9seW5vbWlhbHMgaW4gdGhlCi0gKiAgICAgICAgIEdhbG9pcyBGaWVsZCBHRigyXjgpLiAgV2UgcmVzZXJ2ZSB4IGZvciBwb2x5bm9taWFscyB0aGF0Ci0gKiAgICAgICAgIHRoYXQgaGF2ZSBjb2VmZmljaWVudHMgaW4gR0YoMl44KS4KLSAqICAgICAgICAgCi0gKiBUaGUgR2Fsb2lzIEZpZWxkIGluIHdoaWNoIGNvZWZmaWNpZW50IGFyaXRobWV0aWMgaXMgcGVyZm9ybWVkIGFyZQotICogdGhlIHBvbHlub21pYWxzIG92ZXIgWl8yIChpLmUuLCAwIGFuZCAxKSBtb2R1bG8gdGhlIGlycmVkdWNpYmxlCi0gKiBwb2x5bm9taWFsIGYociksIHdoZXJlIGYocik9cl44ICsgcl43ICsgcl4yICsgciArIDEuICBBIHBvbHlub21pYWwKLSAqIGlzIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSB3aXRoIHRoZSBNU0IgYXMgdGhlIGNvZWZmaWNpZW50IG9mIHJeNyBhbmQKLSAqIHRoZSBMU0IgYXMgdGhlIGNvZWZmaWNpZW50IG9mIHJeMC4gIEZvciBleGFtcGxlLCB0aGUgYmluYXJ5Ci0gKiByZXByZXNlbnRhdGlvbiBvZiBmKHgpIGlzIDB4MTg3IChvZiBjb3Vyc2UsIHRoaXMgZG9lc24ndCBmaXQgaW50byA4Ci0gKiBiaXRzKS4gIEluIHRoaXMgZmllbGQsIHRoZSBwb2x5bm9taWFsIHIgaXMgYSBwcmltaXRpdmUgZWxlbWVudC4KLSAqIFRoYXQgaXMsIHJeaSB3aXRoIGkgaW4gMCwuLi4sMjU1IGVudW1lcmF0ZXMgYWxsIGVsZW1lbnRzIGluIHRoZQotICogZmllbGQuCi0gKgotICogVGhlIGdlbmVyYXRvciBwb2x5bm9taWFsIGZvciB0aGUgUUlDLTgwIEVDQyBpcwotICoKLSAqICAgICAgZyh4KSA9IHheMyArIHJeMTA1KnheMiArIHJeMTA1KnggKyAxCi0gKgotICogd2hpY2ggY2FuIGJlIGZhY3RvcmVkIGludG86Ci0gKgotICogICAgICBnKHgpID0gKHgtcl4tMSkoeC1yXjApKHgtcl4xKQotICoKLSAqIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgYXJlOgotICoKLSAqICAgICAgcl4xMDUgPSAweGMwCi0gKiAgICAgIHJeLTEgID0gMHhjMwotICogICAgICByXjAgICA9IDB4MDEKLSAqICAgICAgcl4xICAgPSAweDAyCi0gKgotICogTm90aWNlIHRoYXQgcl4tMSA9IHJeMjU0IGFzIGV4cG9uZW50IGFyaXRobWV0aWMgaXMgcGVyZm9ybWVkCi0gKiBtb2R1bG8gMl44LTEgPSAyNTUuCi0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gR2Fsb2lzIEZpZWxkcyBhbmQgUmVlZC1Tb2xvbW9uIGNvZGVzLCByZWZlcgotICogdG8gYW55IGdvb2QgYm9vay4gIEkgZm91bmQgX0FuIEludHJvZHVjdGlvbiB0byBFcnJvciBDb3JyZWN0aW5nCi0gKiBDb2RlcyB3aXRoIEFwcGxpY2F0aW9uc18gYnkgUy4gQS4gVmFuc3RvbmUgYW5kIFAuIEMuIHZhbiBPb3JzY2hvdAotICogdG8gYmUgYSBnb29kIGludHJvZHVjdGlvbiBpbnRvIHRoZSBmb3JtZXIuICBfQ09ESU5HIFRIRU9SWTogVGhlCi0gKiBFc3NlbnRpYWxzXyBJIGZvdW5kIHZlcnkgdXNlZnVsIGZvciBpdHMgY29uY2lzZSBkZXNjcmlwdGlvbiBvZgotICogUmVlZC1Tb2xvbW9uIGVuY29kaW5nL2RlY29kaW5nLgotICoKLSAqLwotCi10eXBlZGVmIF9fdTggTWF0cml4WzNdWzNdOwotCi0vKgotICogZ2Zwb3dbXSBpcyBkZWZpbmVkIHN1Y2ggdGhhdCBnZnBvd1tpXSByZXR1cm5zIHJeaSBpZgotICogaSBpcyBpbiB0aGUgcmFuZ2UgWzAuLjI1NV0uCi0gKi8KLXN0YXRpYyBjb25zdCBfX3U4IGdmcG93W10gPQotewotCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCi0JMHg4NywgMHg4OSwgMHg5NSwgMHhhZCwgMHhkZCwgMHgzZCwgMHg3YSwgMHhmNCwKLQkweDZmLCAweGRlLCAweDNiLCAweDc2LCAweGVjLCAweDVmLCAweGJlLCAweGZiLAotCTB4NzEsIDB4ZTIsIDB4NDMsIDB4ODYsIDB4OGIsIDB4OTEsIDB4YTUsIDB4Y2QsCi0JMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHg1NywgMHhhZSwgMHhkYiwgMHgzMSwKLQkweDYyLCAweGM0LCAweDBmLCAweDFlLCAweDNjLCAweDc4LCAweGYwLCAweDY3LAotCTB4Y2UsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4MzcsIDB4NmUsIDB4ZGMsCi0JMHgzZiwgMHg3ZSwgMHhmYywgMHg3ZiwgMHhmZSwgMHg3YiwgMHhmNiwgMHg2YiwKLQkweGQ2LCAweDJiLCAweDU2LCAweGFjLCAweGRmLCAweDM5LCAweDcyLCAweGU0LAotCTB4NGYsIDB4OWUsIDB4YmIsIDB4ZjEsIDB4NjUsIDB4Y2EsIDB4MTMsIDB4MjYsCi0JMHg0YywgMHg5OCwgMHhiNywgMHhlOSwgMHg1NSwgMHhhYSwgMHhkMywgMHgyMSwKLQkweDQyLCAweDg0LCAweDhmLCAweDk5LCAweGI1LCAweGVkLCAweDVkLCAweGJhLAotCTB4ZjMsIDB4NjEsIDB4YzIsIDB4MDMsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsCi0JMHg2MCwgMHhjMCwgMHgwNywgMHgwZSwgMHgxYywgMHgzOCwgMHg3MCwgMHhlMCwKLQkweDQ3LCAweDhlLCAweDliLCAweGIxLCAweGU1LCAweDRkLCAweDlhLCAweGIzLAotCTB4ZTEsIDB4NDUsIDB4OGEsIDB4OTMsIDB4YTEsIDB4YzUsIDB4MGQsIDB4MWEsCi0JMHgzNCwgMHg2OCwgMHhkMCwgMHgyNywgMHg0ZSwgMHg5YywgMHhiZiwgMHhmOSwKLQkweDc1LCAweGVhLCAweDUzLCAweGE2LCAweGNiLCAweDExLCAweDIyLCAweDQ0LAotCTB4ODgsIDB4OTcsIDB4YTksIDB4ZDUsIDB4MmQsIDB4NWEsIDB4YjQsIDB4ZWYsCi0JMHg1OSwgMHhiMiwgMHhlMywgMHg0MSwgMHg4MiwgMHg4MywgMHg4MSwgMHg4NSwKLQkweDhkLCAweDlkLCAweGJkLCAweGZkLCAweDdkLCAweGZhLCAweDczLCAweGU2LAotCTB4NGIsIDB4OTYsIDB4YWIsIDB4ZDEsIDB4MjUsIDB4NGEsIDB4OTQsIDB4YWYsCi0JMHhkOSwgMHgzNSwgMHg2YSwgMHhkNCwgMHgyZiwgMHg1ZSwgMHhiYywgMHhmZiwKLQkweDc5LCAweGYyLCAweDYzLCAweGM2LCAweDBiLCAweDE2LCAweDJjLCAweDU4LAotCTB4YjAsIDB4ZTcsIDB4NDksIDB4OTIsIDB4YTMsIDB4YzEsIDB4MDUsIDB4MGEsCi0JMHgxNCwgMHgyOCwgMHg1MCwgMHhhMCwgMHhjNywgMHgwOSwgMHgxMiwgMHgyNCwKLQkweDQ4LCAweDkwLCAweGE3LCAweGM5LCAweDE1LCAweDJhLCAweDU0LCAweGE4LAotCTB4ZDcsIDB4MjksIDB4NTIsIDB4YTQsIDB4Y2YsIDB4MTksIDB4MzIsIDB4NjQsCi0JMHhjOCwgMHgxNywgMHgyZSwgMHg1YywgMHhiOCwgMHhmNywgMHg2OSwgMHhkMiwKLQkweDIzLCAweDQ2LCAweDhjLCAweDlmLCAweGI5LCAweGY1LCAweDZkLCAweGRhLAotCTB4MzMsIDB4NjYsIDB4Y2MsIDB4MWYsIDB4M2UsIDB4N2MsIDB4ZjgsIDB4NzcsCi0JMHhlZSwgMHg1YiwgMHhiNiwgMHhlYiwgMHg1MSwgMHhhMiwgMHhjMywgMHgwMQotfTsKLQotLyoKLSAqIFRoaXMgaXMgYSBsb2cgdGFibGUuICBUaGF0IGlzLCBnZmxvZ1tyXmldIHJldHVybnMgaSAobW9kdWxvIGYocikpLgotICogZ2Zsb2dbMF0gaXMgdW5kZWZpbmVkIGFuZCB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGVyZWZvcmUgbm90IHZhbGlkLgotICovCi1zdGF0aWMgY29uc3QgX191OCBnZmxvZ1syNTZdID0KLXsKLQkweGZmLCAweDAwLCAweDAxLCAweDYzLCAweDAyLCAweGM2LCAweDY0LCAweDZhLAotCTB4MDMsIDB4Y2QsIDB4YzcsIDB4YmMsIDB4NjUsIDB4N2UsIDB4NmIsIDB4MmEsCi0JMHgwNCwgMHg4ZCwgMHhjZSwgMHg0ZSwgMHhjOCwgMHhkNCwgMHhiZCwgMHhlMSwKLQkweDY2LCAweGRkLCAweDdmLCAweDMxLCAweDZjLCAweDIwLCAweDJiLCAweGYzLAotCTB4MDUsIDB4NTcsIDB4OGUsIDB4ZTgsIDB4Y2YsIDB4YWMsIDB4NGYsIDB4ODMsCi0JMHhjOSwgMHhkOSwgMHhkNSwgMHg0MSwgMHhiZSwgMHg5NCwgMHhlMiwgMHhiNCwKLQkweDY3LCAweDI3LCAweGRlLCAweGYwLCAweDgwLCAweGIxLCAweDMyLCAweDM1LAotCTB4NmQsIDB4NDUsIDB4MjEsIDB4MTIsIDB4MmMsIDB4MGQsIDB4ZjQsIDB4MzgsCi0JMHgwNiwgMHg5YiwgMHg1OCwgMHgxYSwgMHg4ZiwgMHg3OSwgMHhlOSwgMHg3MCwKLQkweGQwLCAweGMyLCAweGFkLCAweGE4LCAweDUwLCAweDc1LCAweDg0LCAweDQ4LAotCTB4Y2EsIDB4ZmMsIDB4ZGEsIDB4OGEsIDB4ZDYsIDB4NTQsIDB4NDIsIDB4MjQsCi0JMHhiZiwgMHg5OCwgMHg5NSwgMHhmOSwgMHhlMywgMHg1ZSwgMHhiNSwgMHgxNSwKLQkweDY4LCAweDYxLCAweDI4LCAweGJhLCAweGRmLCAweDRjLCAweGYxLCAweDJmLAotCTB4ODEsIDB4ZTYsIDB4YjIsIDB4M2YsIDB4MzMsIDB4ZWUsIDB4MzYsIDB4MTAsCi0JMHg2ZSwgMHgxOCwgMHg0NiwgMHhhNiwgMHgyMiwgMHg4OCwgMHgxMywgMHhmNywKLQkweDJkLCAweGI4LCAweDBlLCAweDNkLCAweGY1LCAweGE0LCAweDM5LCAweDNiLAotCTB4MDcsIDB4OWUsIDB4OWMsIDB4OWQsIDB4NTksIDB4OWYsIDB4MWIsIDB4MDgsCi0JMHg5MCwgMHgwOSwgMHg3YSwgMHgxYywgMHhlYSwgMHhhMCwgMHg3MSwgMHg1YSwKLQkweGQxLCAweDFkLCAweGMzLCAweDdiLCAweGFlLCAweDBhLCAweGE5LCAweDkxLAotCTB4NTEsIDB4NWIsIDB4NzYsIDB4NzIsIDB4ODUsIDB4YTEsIDB4NDksIDB4ZWIsCi0JMHhjYiwgMHg3YywgMHhmZCwgMHhjNCwgMHhkYiwgMHgxZSwgMHg4YiwgMHhkMiwKLQkweGQ3LCAweDkyLCAweDU1LCAweGFhLCAweDQzLCAweDBiLCAweDI1LCAweGFmLAotCTB4YzAsIDB4NzMsIDB4OTksIDB4NzcsIDB4OTYsIDB4NWMsIDB4ZmEsIDB4NTIsCi0JMHhlNCwgMHhlYywgMHg1ZiwgMHg0YSwgMHhiNiwgMHhhMiwgMHgxNiwgMHg4NiwKLQkweDY5LCAweGM1LCAweDYyLCAweGZlLCAweDI5LCAweDdkLCAweGJiLCAweGNjLAotCTB4ZTAsIDB4ZDMsIDB4NGQsIDB4OGMsIDB4ZjIsIDB4MWYsIDB4MzAsIDB4ZGMsCi0JMHg4MiwgMHhhYiwgMHhlNywgMHg1NiwgMHhiMywgMHg5MywgMHg0MCwgMHhkOCwKLQkweDM0LCAweGIwLCAweGVmLCAweDI2LCAweDM3LCAweDBjLCAweDExLCAweDQ0LAotCTB4NmYsIDB4NzgsIDB4MTksIDB4OWEsIDB4NDcsIDB4NzQsIDB4YTcsIDB4YzEsCi0JMHgyMywgMHg1MywgMHg4OSwgMHhmYiwgMHgxNCwgMHg1ZCwgMHhmOCwgMHg5NywKLQkweDJlLCAweDRiLCAweGI5LCAweDYwLCAweDBmLCAweGVkLCAweDNlLCAweGU1LAotCTB4ZjYsIDB4ODcsIDB4YTUsIDB4MTcsIDB4M2EsIDB4YTMsIDB4M2MsIDB4YjcKLX07Ci0KLS8qIFRoaXMgaXMgYSBtdWx0aXBsaWNhdGlvbiB0YWJsZSBmb3IgdGhlIGZhY3RvciAweGMwIChpLmUuLCByXjEwNSAobW9kIGYocikpLgotICogZ2ZtdWxfYzBbZl0gcmV0dXJucyByXjEwNSAqIGYocikgKG1vZHVsbyBmKHIpKS4KLSAqLwotc3RhdGljIGNvbnN0IF9fdTggZ2ZtdWxfYzBbMjU2XSA9Ci17Ci0JMHgwMCwgMHhjMCwgMHgwNywgMHhjNywgMHgwZSwgMHhjZSwgMHgwOSwgMHhjOSwKLQkweDFjLCAweGRjLCAweDFiLCAweGRiLCAweDEyLCAweGQyLCAweDE1LCAweGQ1LAotCTB4MzgsIDB4ZjgsIDB4M2YsIDB4ZmYsIDB4MzYsIDB4ZjYsIDB4MzEsIDB4ZjEsCi0JMHgyNCwgMHhlNCwgMHgyMywgMHhlMywgMHgyYSwgMHhlYSwgMHgyZCwgMHhlZCwKLQkweDcwLCAweGIwLCAweDc3LCAweGI3LCAweDdlLCAweGJlLCAweDc5LCAweGI5LAotCTB4NmMsIDB4YWMsIDB4NmIsIDB4YWIsIDB4NjIsIDB4YTIsIDB4NjUsIDB4YTUsCi0JMHg0OCwgMHg4OCwgMHg0ZiwgMHg4ZiwgMHg0NiwgMHg4NiwgMHg0MSwgMHg4MSwKLQkweDU0LCAweDk0LCAweDUzLCAweDkzLCAweDVhLCAweDlhLCAweDVkLCAweDlkLAotCTB4ZTAsIDB4MjAsIDB4ZTcsIDB4MjcsIDB4ZWUsIDB4MmUsIDB4ZTksIDB4MjksCi0JMHhmYywgMHgzYywgMHhmYiwgMHgzYiwgMHhmMiwgMHgzMiwgMHhmNSwgMHgzNSwKLQkweGQ4LCAweDE4LCAweGRmLCAweDFmLCAweGQ2LCAweDE2LCAweGQxLCAweDExLAotCTB4YzQsIDB4MDQsIDB4YzMsIDB4MDMsIDB4Y2EsIDB4MGEsIDB4Y2QsIDB4MGQsCi0JMHg5MCwgMHg1MCwgMHg5NywgMHg1NywgMHg5ZSwgMHg1ZSwgMHg5OSwgMHg1OSwKLQkweDhjLCAweDRjLCAweDhiLCAweDRiLCAweDgyLCAweDQyLCAweDg1LCAweDQ1LAotCTB4YTgsIDB4NjgsIDB4YWYsIDB4NmYsIDB4YTYsIDB4NjYsIDB4YTEsIDB4NjEsCi0JMHhiNCwgMHg3NCwgMHhiMywgMHg3MywgMHhiYSwgMHg3YSwgMHhiZCwgMHg3ZCwKLQkweDQ3LCAweDg3LCAweDQwLCAweDgwLCAweDQ5LCAweDg5LCAweDRlLCAweDhlLAotCTB4NWIsIDB4OWIsIDB4NWMsIDB4OWMsIDB4NTUsIDB4OTUsIDB4NTIsIDB4OTIsCi0JMHg3ZiwgMHhiZiwgMHg3OCwgMHhiOCwgMHg3MSwgMHhiMSwgMHg3NiwgMHhiNiwKLQkweDYzLCAweGEzLCAweDY0LCAweGE0LCAweDZkLCAweGFkLCAweDZhLCAweGFhLAotCTB4MzcsIDB4ZjcsIDB4MzAsIDB4ZjAsIDB4MzksIDB4ZjksIDB4M2UsIDB4ZmUsCi0JMHgyYiwgMHhlYiwgMHgyYywgMHhlYywgMHgyNSwgMHhlNSwgMHgyMiwgMHhlMiwKLQkweDBmLCAweGNmLCAweDA4LCAweGM4LCAweDAxLCAweGMxLCAweDA2LCAweGM2LAotCTB4MTMsIDB4ZDMsIDB4MTQsIDB4ZDQsIDB4MWQsIDB4ZGQsIDB4MWEsIDB4ZGEsCi0JMHhhNywgMHg2NywgMHhhMCwgMHg2MCwgMHhhOSwgMHg2OSwgMHhhZSwgMHg2ZSwKLQkweGJiLCAweDdiLCAweGJjLCAweDdjLCAweGI1LCAweDc1LCAweGIyLCAweDcyLAotCTB4OWYsIDB4NWYsIDB4OTgsIDB4NTgsIDB4OTEsIDB4NTEsIDB4OTYsIDB4NTYsCi0JMHg4MywgMHg0MywgMHg4NCwgMHg0NCwgMHg4ZCwgMHg0ZCwgMHg4YSwgMHg0YSwKLQkweGQ3LCAweDE3LCAweGQwLCAweDEwLCAweGQ5LCAweDE5LCAweGRlLCAweDFlLAotCTB4Y2IsIDB4MGIsIDB4Y2MsIDB4MGMsIDB4YzUsIDB4MDUsIDB4YzIsIDB4MDIsCi0JMHhlZiwgMHgyZiwgMHhlOCwgMHgyOCwgMHhlMSwgMHgyMSwgMHhlNiwgMHgyNiwKLQkweGYzLCAweDMzLCAweGY0LCAweDM0LCAweGZkLCAweDNkLCAweGZhLCAweDNhCi19OwotCi0KLS8qIFJldHVybnMgViBtb2R1bG8gMjU1IHByb3ZpZGVkIFYgaXMgaW4gdGhlIHJhbmdlIC0yNTUsLTI1NCwuLi4sNTA5LgotICovCi1zdGF0aWMgaW5saW5lIF9fdTggbW9kMjU1KGludCB2KQotewotCWlmICh2ID4gMCkgewotCQlpZiAodiA8IDI1NSkgewotCQkJcmV0dXJuIHY7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdiAtIDI1NTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiB2ICsgMjU1OwotCX0KLX0KLQotCi0vKiBBZGQgdHdvIG51bWJlcnMgaW4gdGhlIGZpZWxkLiAgQWRkaXRpb24gaW4gdGhpcyBmaWVsZCBpcyBlcXVpdmFsZW50Ci0gKiB0byBhIGJpdC13aXNlIGV4Y2x1c2l2ZSBPUiBvcGVyYXRpb24tLS1zdWJ0cmFjdGlvbiBpcyB0aGVyZWZvcmUKLSAqIGlkZW50aWNhbCB0byBhZGRpdGlvbi4KLSAqLwotc3RhdGljIGlubGluZSBfX3U4IGdmYWRkKF9fdTggYSwgX191OCBiKQotewotCXJldHVybiBhIF4gYjsKLX0KLQotCi0vKiBBZGQgdHdvIHZlY3RvcnMgb2YgbnVtYmVycyBpbiB0aGUgZmllbGQuICBFYWNoIGJ5dGUgaW4gQSBhbmQgQiBnZXRzCi0gKiBhZGRlZCBpbmRpdmlkdWFsbHkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZmFkZF9sb25nKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQotewotCXJldHVybiBhIF4gYjsKLX0KLQotCi0vKiBNdWx0aXBseSB0d28gbnVtYmVycyBpbiB0aGUgZmllbGQ6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgX191OCBnZm11bChfX3U4IGEsIF9fdTggYikKLXsKLQlpZiAoYSAmJiBiKSB7Ci0JCXJldHVybiBnZnBvd1ttb2QyNTUoZ2Zsb2dbYV0gKyBnZmxvZ1tiXSldOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotCi0vKiBKdXN0IGxpa2UgZ2ZtdWwsIGV4Y2VwdCB3ZSBoYXZlIGFscmVhZHkgbG9va2VkIHVwIHRoZSBsb2cgb2YgdGhlCi0gKiBzZWNvbmQgbnVtYmVyLgotICovCi1zdGF0aWMgaW5saW5lIF9fdTggZ2ZtdWxfZXhwKF9fdTggYSwgaW50IGIpCi17Ci0JaWYgKGEpIHsKLQkJcmV0dXJuIGdmcG93W21vZDI1NShnZmxvZ1thXSArIGIpXTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLQotLyogSnVzdCBsaWtlIGdmbXVsX2V4cCwgZXhjZXB0IHRoYXQgQSBpcyBhIHZlY3RvciBvZiBudW1iZXJzLiAgVGhhdAotICogaXMsIGVhY2ggYnl0ZSBpbiBBIGdldHMgbXVsdGlwbGllZCBieSBnZnBvd1ttb2QyNTUoQildLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2ZtdWxfZXhwX2xvbmcodW5zaWduZWQgbG9uZyBhLCBpbnQgYikKLXsKLQlfX3U4IHQ7Ci0KLQlpZiAoc2l6ZW9mKGxvbmcpID09IDQpIHsKLQkJcmV0dXJuICgKLQkJKCh0ID0gKF9fdTMyKWEgPj4gMjQgJiAweGZmKSA/Ci0JCSAoKChfX3UzMikgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAyNCkgOiAwKSB8Ci0JCSgodCA9IChfX3UzMilhID4+IDE2ICYgMHhmZikgPwotCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMTYpIDogMCkgfAotCQkoKHQgPSAoX191MzIpYSA+PiA4ICYgMHhmZikgPwotCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgOCkgOiAwKSB8Ci0JCSgodCA9IChfX3UzMilhID4+IDAgJiAweGZmKSA/Ci0JCSAoKChfX3UzMikgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAwKSA6IDApKTsKLQl9IGVsc2UgaWYgKHNpemVvZihsb25nKSA9PSA4KSB7Ci0JCXJldHVybiAoCi0JCSgodCA9IChfX3U2NClhID4+IDU2ICYgMHhmZikgPwotCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgNTYpIDogMCkgfAotCQkoKHQgPSAoX191NjQpYSA+PiA0OCAmIDB4ZmYpID8KLQkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDQ4KSA6IDApIHwKLQkJKCh0ID0gKF9fdTY0KWEgPj4gNDAgJiAweGZmKSA/Ci0JCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCA0MCkgOiAwKSB8Ci0JCSgodCA9IChfX3U2NClhID4+IDMyICYgMHhmZikgPwotCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMzIpIDogMCkgfAotCQkoKHQgPSAoX191NjQpYSA+PiAyNCAmIDB4ZmYpID8KLQkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDI0KSA6IDApIHwKLQkJKCh0ID0gKF9fdTY0KWEgPj4gMTYgJiAweGZmKSA/Ci0JCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAxNikgOiAwKSB8Ci0JCSgodCA9IChfX3U2NClhID4+IDggJiAweGZmKSA/Ci0JCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCA4KSA6IDApIHwKLQkJKCh0ID0gKF9fdTY0KWEgPj4gMCAmIDB4ZmYpID8KLQkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDApIDogMCkpOwotCX0gZWxzZSB7Ci0JCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0JCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwgIkVycm9yOiBzaXplIG9mIGxvbmcgaXMgJWQgYnl0ZXMiLAotCQkJICAgIChpbnQpc2l6ZW9mKGxvbmcpKTsKLQl9Ci19Ci0KLQotLyogRGl2aWRlIHR3byBudW1iZXJzIGluIHRoZSBmaWVsZC4gIFJldHVybnMgYS9iIChtb2R1bG8gZih4KSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgX191OCBnZmRpdihfX3U4IGEsIF9fdTggYikKLXsKLQlpZiAoIWIpIHsKLQkJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkJVFJBQ0VfQUJPUlQoMHhmZiwgZnRfdF9idWcsICJFcnJvcjogZGl2aXNpb24gYnkgemVybyIpOwotCX0gZWxzZSBpZiAoYSA9PSAwKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiBnZnBvd1ttb2QyNTUoZ2Zsb2dbYV0gLSBnZmxvZ1tiXSldOwotCX0KLX0KLQotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhlIG1hdHJpeCBvZiB0aGUKLSAqIGxpbmVhciBzeXN0ZW0gdGhhdCBuZWVkcyB0byBiZSBzb2x2ZWQgdG8gZGV0ZXJtaW5lIHRoZSBlcnJvcgotICogbWFnbml0dWRlcy4gIFRoZSBmaXJzdCBkZWFscyB3aXRoIG1hdHJpY2VzIG9mIHJhbmsgMywgd2hpbGUgdGhlCi0gKiBzZWNvbmQgZGVhbHMgd2l0aCBtYXRyaWNlcyBvZiByYW5rIDIuICBUaGUgZXJyb3IgaW5kaWNlcyBhcmUgcGFzc2VkCi0gKiBpbiBhcmd1bWVudHMgTDAsLi4sTDIgKDA9Zmlyc3Qgc2VjdG9yLCAzMT1sYXN0IHNlY3RvcikuICBUaGUgZXJyb3IKLSAqIGluZGljZXMgbXVzdCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLCBpLmUuLCBMMDxMMTxMMi4KLSAqCi0gKiBUaGUgbGluZWFyIHN5c3RlbSB0aGF0IG5lZWRzIHRvIGJlIHNvbHZlZCBmb3IgdGhlIGVycm9yIG1hZ25pdHVkZXMKLSAqIGlzIEEgKiBiID0gcywgd2hlcmUgcyBpcyB0aGUga25vd24gdmVjdG9yIG9mIHN5bmRyb21lcywgYiBpcyB0aGUKLSAqIHZlY3RvciBvZiBlcnJvciBtYWduaXR1ZGVzIGFuZCBBIGluIHRoZSBPUkRFUj0zIGNhc2U6Ci0gKgotICogICAgQV8zID0ge3sxL3JeTFswXSwgMS9yXkxbMV0sIDEvcl5MWzJdfSwKLSAqICAgICAgICAgIHsgICAgICAgIDEsICAgICAgICAxLCAgICAgICAgMX0sCi0gKiAgICAgICAgICB7IHJeTFswXSwgcl5MWzFdLCByXkxbMl19fSAKLSAqLwotc3RhdGljIGlubGluZSBpbnQgZ2ZpbnYzKF9fdTggbDAsCi0JCQkgX191OCBsMSwgCi0JCQkgX191OCBsMiwgCi0JCQkgTWF0cml4IEFpbnYpCi17Ci0JX191OCBkZXQ7Ci0JX191OCB0MjAsIHQxMCwgdDIxLCB0MTIsIHQwMSwgdDAyOwotCWludCBsb2dfZGV0OwotCi0JLyogY29tcHV0ZSBzb21lIGludGVybWVkaWF0ZSByZXN1bHRzOiAqLwotCXQyMCA9IGdmcG93W2wyIC0gbDBdOwkgICAgICAgIC8qIHQyMCA9IHJebDIvcl5sMCAqLwotCXQxMCA9IGdmcG93W2wxIC0gbDBdOwkgICAgICAgIC8qIHQxMCA9IHJebDEvcl5sMCAqLwotCXQyMSA9IGdmcG93W2wyIC0gbDFdOwkgICAgICAgIC8qIHQyMSA9IHJebDIvcl5sMSAqLwotCXQxMiA9IGdmcG93W2wxIC0gbDIgKyAyNTVdOwkvKiB0MTIgPSByXmwxL3JebDIgKi8KLQl0MDEgPSBnZnBvd1tsMCAtIGwxICsgMjU1XTsJLyogdDAxID0gcl5sMC9yXmwxICovCi0JdDAyID0gZ2Zwb3dbbDAgLSBsMiArIDI1NV07CS8qIHQwMiA9IHJebDAvcl5sMiAqLwotCS8qIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnQgb2YgbWF0cml4IEFfM14tMSAoc29tZXRpbWVzCi0JICogY2FsbGVkIHRoZSBWYW5kZXJtb25kZSBkZXRlcm1pbmFudCk6Ci0JICovCi0JZGV0ID0gZ2ZhZGQodDIwLCBnZmFkZCh0MTAsIGdmYWRkKHQyMSwgZ2ZhZGQodDEyLCBnZmFkZCh0MDEsIHQwMikpKSkpOwotCWlmICghZGV0KSB7Ci0JCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAotCQkJICAgIkludmVyc2lvbiBmYWlsZWQgKDMgQ1JDIGVycm9ycywgPjAgQ1JDIGZhaWx1cmVzKSIpOwotCX0KLQlsb2dfZGV0ID0gMjU1IC0gZ2Zsb2dbZGV0XTsKLQotCS8qIE5vdywgY2FsY3VsYXRlIGFsbCBvZiB0aGUgY29lZmZpY2llbnRzOgotCSAqLwotCUFpbnZbMF1bMF09IGdmbXVsX2V4cChnZmFkZChnZnBvd1tsMV0sIGdmcG93W2wyXSksIGxvZ19kZXQpOwotCUFpbnZbMF1bMV09IGdmbXVsX2V4cChnZmFkZCh0MjEsIHQxMiksIGxvZ19kZXQpOwotCUFpbnZbMF1bMl09IGdmbXVsX2V4cChnZmFkZChnZnBvd1syNTUgLSBsMV0sIGdmcG93WzI1NSAtIGwyXSksbG9nX2RldCk7Ci0KLQlBaW52WzFdWzBdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbbDBdLCBnZnBvd1tsMl0pLCBsb2dfZGV0KTsKLQlBaW52WzFdWzFdPSBnZm11bF9leHAoZ2ZhZGQodDIwLCB0MDIpLCBsb2dfZGV0KTsKLQlBaW52WzFdWzJdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbMjU1IC0gbDBdLCBnZnBvd1syNTUgLSBsMl0pLGxvZ19kZXQpOwotCi0JQWludlsyXVswXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93W2wwXSwgZ2Zwb3dbbDFdKSwgbG9nX2RldCk7Ci0JQWludlsyXVsxXT0gZ2ZtdWxfZXhwKGdmYWRkKHQxMCwgdDAxKSwgbG9nX2RldCk7Ci0JQWludlsyXVsyXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93WzI1NSAtIGwwXSwgZ2Zwb3dbMjU1IC0gbDFdKSxsb2dfZGV0KTsKLQotCXJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IGdmaW52MihfX3U4IGwwLCBfX3U4IGwxLCBNYXRyaXggQWludikKLXsKLQlfX3U4IGRldDsKLQlfX3U4IHQxLCB0MjsKLQlpbnQgbG9nX2RldDsKLQotCXQxID0gZ2Zwb3dbMjU1IC0gbDBdOwotCXQyID0gZ2Zwb3dbMjU1IC0gbDFdOwotCWRldCA9IGdmYWRkKHQxLCB0Mik7Ci0JaWYgKCFkZXQpIHsKLQkJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9lcnIsCi0JCQkgICAiSW52ZXJzaW9uIGZhaWxlZCAoMiBDUkMgZXJyb3JzLCA+MCBDUkMgZmFpbHVyZXMpIik7Ci0JfQotCWxvZ19kZXQgPSAyNTUgLSBnZmxvZ1tkZXRdOwotCi0JLyogTm93LCBjYWxjdWxhdGUgYWxsIG9mIHRoZSBjb2VmZmljaWVudHM6Ci0JICovCi0JQWludlswXVswXSA9IEFpbnZbMV1bMF0gPSBnZnBvd1tsb2dfZGV0XTsKLQotCUFpbnZbMF1bMV0gPSBnZm11bF9leHAodDIsIGxvZ19kZXQpOwotCUFpbnZbMV1bMV0gPSBnZm11bF9leHAodDEsIGxvZ19kZXQpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLQotLyogTXVsdGlwbHkgbWF0cml4IEEgYnkgdmVjdG9yIFMgYW5kIHJldHVybiByZXN1bHQgaW4gdmVjdG9yIEIuICBNIGlzCi0gKiBhc3N1bWVkIHRvIGJlIG9mIG9yZGVyIE54TiwgUyBhbmQgQiBvZiBvcmRlciBOeDEuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBnZm1hdF9tdWwoaW50IG4sIE1hdHJpeCBBLCAKLQkJCSAgICAgX191OCAqcywgX191OCAqYikKLXsKLQlpbnQgaSwgajsKLQlfX3U4IGRvdF9wcm9kOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlkb3RfcHJvZCA9IDA7Ci0JCWZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKLQkJCWRvdF9wcm9kID0gZ2ZhZGQoZG90X3Byb2QsIGdmbXVsKEFbaV1bal0sIHNbal0pKTsKLQkJfQotCQliW2ldID0gZG90X3Byb2Q7Ci0JfQotfQotDAotCi0KLS8qIFRoZSBSZWVkIFNvbG9tb24gRUNDIGNvZGVzIGFyZSBjb21wdXRlZCBvdmVyIHRoZSBOLXRoIGJ5dGUgb2YgZWFjaAotICogYmxvY2ssIHdoZXJlIE49U0VDVE9SX1NJWkUuICBUaGVyZSBhcmUgdXAgdG8gMjkgYmxvY2tzIG9mIGRhdGEsIGFuZAotICogMyBibG9ja3Mgb2YgRUNDLiAgVGhlIGJsb2NrcyBhcmUgc3RvcmVkIGNvbnRpZ3VvdXNseSBpbiBtZW1vcnkuICBBCi0gKiBzZWdtZW50LCBjb25zZXF1ZW50bHksIGlzIGFzc3VtZWQgdG8gaGF2ZSBhdCBsZWFzdCA0IGJsb2Nrczogb25lIG9yCi0gKiBtb3JlIGRhdGEgYmxvY2tzIHBsdXMgdGhyZWUgRUNDIGJsb2Nrcy4KLSAqCi0gKiBOb3RpY2U6IEluIFFJQy04MCBzcGVhaywgYSBDUkMgZXJyb3IgaXMgYSBzZWN0b3Igd2l0aCBhbiBpbmNvcnJlY3QKLSAqICAgICAgICAgQ1JDLiAgQSBDUkMgZmFpbHVyZSBpcyBhIHNlY3RvciB3aXRoIGluY29ycmVjdCBkYXRhLCBidXQKLSAqICAgICAgICAgYSB2YWxpZCBDUkMuICBJbiB0aGUgZXJyb3IgY29udHJvbCBsaXRlcmF0dXJlLCB0aGUgZm9ybWVyCi0gKiAgICAgICAgIGlzIHVzdWFsbHkgY2FsbGVkICJlcmFzdXJlIiwgdGhlIGxhdHRlciAiZXJyb3IuIgotICovCi0vKiBDb21wdXRlIHRoZSBwYXJpdHkgYnl0ZXMgZm9yIEMgY29sdW1ucyBvZiBkYXRhLCB3aGVyZSBDIGlzIHRoZQotICogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgZml0IGludG8gYSBsb25nIGludGVnZXIuICBXZSB1c2UgYSBsaW5lYXIKLSAqIGZlZWQtYmFjayByZWdpc3RlciB0byBkbyB0aGlzLiAgVGhlIHBhcml0eSBieXRlcyBQWzBdLCBQW1NUUklERV0sCi0gKiBQWzIqU1RSSURFXSBhcmUgY29tcHV0ZWQgc3VjaCB0aGF0OgotICoKLSAqICAgICAgICAgICAgICB4XmsgKiBwKHgpICsgbSh4KSA9IDAgKG1vZHVsbyBnKHgpKQotICoKLSAqIHdoZXJlIGsgPSBOQkxPQ0tTLAotICogICAgICAgcCh4KSA9IFBbMF0gKyBQW1NUUklERV0qeCArIFBbMipTVFJJREVdKnheMiwgYW5kCi0gKiAgICAgICBtKHgpID0gc3VtX3tpPTB9XmsgbV9pKnheaS4KLSAqICAgICAgIG1faSA9IERBVEFbaSpTRUNUT1JfU0laRV0KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldF9wYXJpdHkodW5zaWduZWQgbG9uZyAqZGF0YSwKLQkJCSAgICAgIGludCBuYmxvY2tzLCAKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnAsIAotCQkJICAgICAgaW50IHN0cmlkZSkKLXsKLQl1bnNpZ25lZCBsb25nIHAwLCBwMSwgcDIsIHQxLCB0MiwgKmVuZDsKLQotCWVuZCA9IGRhdGEgKyBuYmxvY2tzICogKEZUX1NFQ1RPUl9TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKLQlwMCA9IHAxID0gcDIgPSAwOwotCXdoaWxlIChkYXRhIDwgZW5kKSB7Ci0JCS8qIFRoZSBuZXcgcGFyaXR5IGJ5dGVzIHAwX2ksIHAxX2ksIHAyX2kgYXJlIGNvbXB1dGVkCi0JCSAqIGZyb20gdGhlIG9sZCB2YWx1ZXMgcDBfe2ktMX0sIHAxX3tpLTF9LCBwMl97aS0xfQotCQkgKiByZWN1cnNpdmVseSBhczoKLQkJICoKLQkJICogICAgICAgIHAwX2kgPSBwMV97aS0xfSArIHJeMTA1ICogKG1fe2ktMX0gLSBwMF97aS0xfSkKLQkJICogICAgICAgIHAxX2kgPSBwMl97aS0xfSArIHJeMTA1ICogKG1fe2ktMX0gLSBwMF97aS0xfSkKLQkJICogICAgICAgIHAyX2kgPSAgICAgICAgICAgICAgICAgICAgKG1fe2ktMX0gLSBwMF97aS0xfSkKLQkJICoKLQkJICogV2l0aCB0aGUgaW5pdGlhbCBjb25kaXRpb246IHAwXzAgPSBwMV8wID0gcDJfMCA9IDAuCi0JCSAqLwotCQl0MSA9IGdmYWRkX2xvbmcoKmRhdGEsIHAwKTsKLQkJLyoKLQkJICogTXVsdGlwbHkgZWFjaCBieXRlIGluIHQxIGJ5IDB4YzA6Ci0JCSAqLwotCQlpZiAoc2l6ZW9mKGxvbmcpID09IDQpIHsKLQkJCXQyPSAoKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+IDI0ICYgMHhmZl0pIDw8IDI0IHwKLQkJCSAgICAgKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+IDE2ICYgMHhmZl0pIDw8IDE2IHwKLQkJCSAgICAgKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+ICA4ICYgMHhmZl0pIDw8ICA4IHwKLQkJCSAgICAgKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+ICAwICYgMHhmZl0pIDw8ICAwKTsKLQkJfSBlbHNlIGlmIChzaXplb2YobG9uZykgPT0gOCkgewotCQkJdDI9ICgoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gNTYgJiAweGZmXSkgPDwgNTYgfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gNDggJiAweGZmXSkgPDwgNDggfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gNDAgJiAweGZmXSkgPDwgNDAgfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gMzIgJiAweGZmXSkgPDwgMzIgfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gMjQgJiAweGZmXSkgPDwgMjQgfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gMTYgJiAweGZmXSkgPDwgMTYgfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gIDggJiAweGZmXSkgPDwgIDggfAotCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gIDAgJiAweGZmXSkgPDwgIDApOwotCQl9IGVsc2UgewotCQkJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6IGxvbmcgaXMgb2Ygc2l6ZSAlZCIsCi0JCQkgICAgICAoaW50KSBzaXplb2YobG9uZykpOwotCQkJVFJBQ0VfRVhJVDsKLQkJfQotCQlwMCA9IGdmYWRkX2xvbmcodDIsIHAxKTsKLQkJcDEgPSBnZmFkZF9sb25nKHQyLCBwMik7Ci0JCXAyID0gdDE7Ci0JCWRhdGEgKz0gRlRfU0VDVE9SX1NJWkUgLyBzaXplb2YobG9uZyk7Ci0JfQotCSpwID0gcDA7Ci0JcCArPSBzdHJpZGU7Ci0JKnAgPSBwMTsKLQlwICs9IHN0cmlkZTsKLQkqcCA9IHAyOwotCXJldHVybjsKLX0KLQotCi0vKiBDb21wdXRlIHRoZSAzIHN5bmRyb21lIHZhbHVlcy4gIERBVEEgc2hvdWxkIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlCi0gKiBvZiB0aGUgY29sdW1uIGZvciB3aGljaCB0aGUgc3luZHJvbWVzIGFyZSBkZXNpcmVkLiAgVGhlIHN5bmRyb21lcwotICogYXJlIGNvbXB1dGVkIG92ZXIgdGhlIGZpcnN0IE5CTE9DS1Mgb2Ygcm93cy4gIFRoZSB0aHJlZSBieXRlcyB3aWxsCi0gKiBiZSBwbGFjZWQgaW4gU1swXSwgU1sxXSwgYW5kIFNbMl0uCi0gKgotICogU1tpXSBpcyB0aGUgdmFsdWUgb2YgdGhlICJtZXNzYWdlIiBwb2x5bm9taWFsIG0oeCkgZXZhbHVhdGVkIGF0IHRoZQotICogaS10aCByb290IG9mIHRoZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBnKHgpLgotICoKLSAqIEFzIGcoeCk9KHgtcl4tMSkoeC0xKSh4LXJeMSkgd2UgZXZhbHVhdGUgdGhlIG1lc3NhZ2UgcG9seW5vbWlhbCBhdAotICogeD1yXi0xIHRvIGdldCBTWzBdLCBhdCB4PXJeMD0xIHRvIGdldCBTWzFdLCBhbmQgYXQgeD1yIHRvIGdldCBTWzJdLgotICogVGhpcyBjb3VsZCBiZSBkb25lIGRpcmVjdGx5IGFuZCBlZmZpY2llbnRseSB2aWEgdGhlIEhvcm5lciBzY2hlbWUuCi0gKiBIb3dldmVyLCBpdCB3b3VsZCByZXF1aXJlIG11bHRpcGxpY2F0aW9uIHRhYmxlcyBmb3IgdGhlIGZhY3RvcnMKLSAqIHJeLTEgKDB4YzMpIGFuZCByICgweDAyKS4gIFRoZSBmb2xsb3dpbmcgc2NoZW1lIGRvZXMgbm90IHJlcXVpcmUKLSAqIGFueSBtdWx0aXBsaWNhdGlvbiB0YWJsZXMgYmV5b25kIHdoYXQncyBuZWVkZWQgZm9yIHNldF9wYXJpdHkoKQotICogYW55d2F5IGFuZCBpcyBzbGlnaHRseSBmYXN0ZXIgaWYgdGhlcmUgYXJlIG5vIGVycm9ycyBhbmQgc2xpZ2h0bHkKLSAqIHNsb3dlciBpZiB0aGVyZSBhcmUgZXJyb3JzLiAgVGhlIGxhdHRlciBpcyBob3BlZnVsbHkgdGhlIGluZnJlcXVlbnQKLSAqIGNhc2UuCi0gKgotICogVG8gdW5kZXJzdGFuZCB0aGUgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtLCBub3RpY2UgdGhhdCBzZXRfcGFyaXR5KG0sCi0gKiBrLCBwKSBjb21wdXRlcyBwYXJpdHkgYnl0ZXMgc3VjaCB0aGF0OgotICoKLSAqICAgICAgeF5rICogcCh4KSA9IG0oeCkgKG1vZHVsbyBnKHgpKS4KLSAqCi0gKiBUaGF0IGlzLCB0byBldmFsdWF0ZSBtKHJebSksIHdoZXJlIHJebSBpcyBhIHJvb3Qgb2YgZyh4KSwgd2UgY2FuCi0gKiBzaW1wbHkgZXZhbHVhdGUgKHJebSleaypwKHJebSkuICBBbHNvLCBub3RpY2UgdGhhdCBwIGlzIDAgaWYgYW5kCi0gKiBvbmx5IGlmIHMgaXMgemVyby4gIFRoYXQgaXMsIGlmIGFsbCBwYXJpdHkgYnl0ZXMgYXJlIDAsIHdlIGtub3cKLSAqIHRoZXJlIGlzIG5vIGVycm9yIGluIHRoZSBkYXRhIGFuZCBjb25zZXF1ZW50bHkgdGhlcmUgaXMgbm8gbmVlZCB0bwotICogY29tcHV0ZSBzKHgpIGF0IGFsbCEgIEluIGFsbCBvdGhlciBjYXNlcywgd2UgY29tcHV0ZSBzKHgpIGZyb20gcCh4KQotICogYnkgZXZhbHVhdGluZyAocl5tKV5rKnAocl5tKSBmb3IgbT0tMSwgbT0wLCBhbmQgbT0xLiAgVGhlIHAoeCkKLSAqIHBvbHlub21pYWwgaXMgZXZhbHVhdGVkIHZpYSB0aGUgSG9ybmVyIHNjaGVtZS4KLSAqLwotc3RhdGljIGludCBjb21wdXRlX3N5bmRyb21lcyh1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgbmJsb2NrcywgdW5zaWduZWQgbG9uZyAqcykKLXsKLQl1bnNpZ25lZCBsb25nIHBbM107Ci0KLQlzZXRfcGFyaXR5KGRhdGEsIG5ibG9ja3MsIHAsIDEpOwotCWlmIChwWzBdIHwgcFsxXSB8IHBbMl0pIHsKLQkJLyogU29tZSBvZiB0aGUgY2hlY2tlZCBjb2x1bW5zIGRvIG5vdCBoYXZlIGEgemVybwotCQkgKiBzeW5kcm9tZS4gIEZvciBzaW1wbGljaXR5LCB3ZSBjb21wdXRlIHRoZSBzeW5kcm9tZXMKLQkJICogZm9yIGFsbCBjb2x1bW5zIHRoYXQgd2UgaGF2ZSBjb21wdXRlZCB0aGUKLQkJICogcmVtYWluZGVycyBmb3IuCi0JCSAqLwotCQlzWzBdID0gZ2ZtdWxfZXhwX2xvbmcoCi0JCQlnZmFkZF9sb25nKHBbMF0sIAotCQkJCSAgIGdmbXVsX2V4cF9sb25nKAotCQkJCQkgICBnZmFkZF9sb25nKHBbMV0sIAotCQkJCQkJICAgICAgZ2ZtdWxfZXhwX2xvbmcocFsyXSwgLTEpKSwKLQkJCQkJICAgLTEpKSwgCi0JCQktbmJsb2Nrcyk7Ci0JCXNbMV0gPSBnZmFkZF9sb25nKGdmYWRkX2xvbmcocFsyXSwgcFsxXSksIHBbMF0pOwotCQlzWzJdID0gZ2ZtdWxfZXhwX2xvbmcoCi0JCQlnZmFkZF9sb25nKHBbMF0sIAotCQkJCSAgIGdmbXVsX2V4cF9sb25nKAotCQkJCQkgICBnZmFkZF9sb25nKHBbMV0sCi0JCQkJCQkgICAgICBnZm11bF9leHBfbG9uZyhwWzJdLCAxKSksCi0JCQkJCSAgIDEpKSwKLQkJCW5ibG9ja3MpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTsKLQl9Ci19Ci0KLQotLyogQ29ycmVjdCB0aGUgYmxvY2sgaW4gdGhlIGNvbHVtbiBwb2ludGVkIHRvIGJ5IERBVEEuICBUaGVyZSBhcmUgTkJBRAotICogQ1JDIGVycm9ycyBhbmQgdGhlaXIgaW5kaWNlcyBhcmUgaW4gQkFEX0xPQ1swXSwgdXAgdG8KLSAqIEJBRF9MT0NbTkJBRC0xXS4gIElmIE5CQUQ+MSwgQWludiBob2xkcyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4Ci0gKiBvZiB0aGUgbGluZWFyIHN5c3RlbSB0aGF0IG5lZWRzIHRvIGJlIHNvbHZlZCB0byBkZXRlcm1pbmUgdGhlIGVycm9yCi0gKiBtYWduaXR1ZGVzLiAgU1swXSwgU1sxXSwgYW5kIFNbMl0gYXJlIHRoZSBzeW5kcm9tZSB2YWx1ZXMuICBJZiByb3cKLSAqIGogZ2V0cyBjb3JyZWN0ZWQsIHRoZW4gYml0IGogd2lsbCBiZSBzZXQgaW4gQ09SUkVDVElPTl9NQVAuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNvcnJlY3RfYmxvY2soX191OCAqZGF0YSwgaW50IG5ibG9ja3MsCi0JCQkJaW50IG5iYWQsIGludCAqYmFkX2xvYywgTWF0cml4IEFpbnYsCi0JCQkJX191OCAqcywKLQkJCQlTZWN0b3JNYXAgKiBjb3JyZWN0aW9uX21hcCkKLXsKLQlpbnQgbmNvcnJlY3RlZCA9IDA7Ci0JaW50IGk7Ci0JX191OCB0MSwgdDI7Ci0JX191OCBjMCwgYzEsIGMyOwkvKiBjaGVjayBieXRlcyAqLwotCV9fdTggZXJyb3JfbWFnWzNdLCBsb2dfZXJyb3JfbWFnOwotCV9fdTggKmRwLCBsLCBlOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlzd2l0Y2ggKG5iYWQpIHsKLQljYXNlIDA6Ci0JCS8qIG1pZ2h0IGhhdmUgYSBDUkMgZmFpbHVyZTogKi8KLQkJaWYgKHNbMF0gPT0gMCkgewotCQkJLyogbW9yZSB0aGFuIG9uZSBlcnJvciAqLwotCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAotCQkJCSAiRUNDIGZhaWxlZCAoMCBDUkMgZXJyb3JzLCA+MSBDUkMgZmFpbHVyZXMpIik7Ci0JCX0KLQkJdDEgPSBnZmRpdihzWzFdLCBzWzBdKTsKLQkJaWYgKChiYWRfbG9jW25iYWQrK10gPSBnZmxvZ1t0MV0pID49IG5ibG9ja3MpIHsKLQkJCVRSQUNFKGZ0X3RfZXJyLAotCQkJICAgICAgIkVDQyBmYWlsZWQgKDAgQ1JDIGVycm9ycywgPjEgQ1JDIGZhaWx1cmVzKSIpOwotCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAotCQkJCSAgImF0dGVtcHQgdG8gY29ycmVjdCBkYXRhIGF0ICVkIiwgYmFkX2xvY1swXSk7Ci0JCX0KLQkJZXJyb3JfbWFnWzBdID0gc1sxXTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl0MSA9IGdmYWRkKGdmbXVsX2V4cChzWzFdLCBiYWRfbG9jWzBdKSwgc1syXSk7Ci0JCXQyID0gZ2ZhZGQoZ2ZtdWxfZXhwKHNbMF0sIGJhZF9sb2NbMF0pLCBzWzFdKTsKLQkJaWYgKHQxID09IDAgJiYgdDIgPT0gMCkgewotCQkJLyogb25lIGVyYXN1cmUsIG5vIGVycm9yOiAqLwotCQkJQWludlswXVswXSA9IGdmcG93W2JhZF9sb2NbMF1dOwotCQl9IGVsc2UgaWYgKHQxID09IDAgfHwgdDIgPT0gMCkgewotCQkJLyogb25lIGVyYXN1cmUgYW5kIG1vcmUgdGhhbiBvbmUgZXJyb3I6ICovCi0JCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsCi0JCQkJICAgICJFQ0MgZmFpbGVkICgxIGVyYXN1cmUsID4xIGVycm9yKSIpOwotCQl9IGVsc2UgewotCQkJLyogb25lIGVyYXN1cmUsIG9uZSBlcnJvcjogKi8KLQkJCWlmICgoYmFkX2xvY1tuYmFkKytdID0gZ2Zsb2dbZ2ZkaXYodDEsIHQyKV0pIAotCQkJICAgID49IG5ibG9ja3MpIHsKLQkJCQlUUkFDRShmdF90X2VyciwgIkVDQyBmYWlsZWQgIgotCQkJCSAgICAgICIoMSBDUkMgZXJyb3JzLCA+MSBDUkMgZmFpbHVyZXMpIik7Ci0JCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAotCQkJCQkgICAgImF0dGVtcHQgdG8gY29ycmVjdCBkYXRhIGF0ICVkIiwKLQkJCQkJICAgIGJhZF9sb2NbMV0pOwotCQkJfQotCQkJaWYgKCFnZmludjIoYmFkX2xvY1swXSwgYmFkX2xvY1sxXSwgQWludikpIHsKLQkJCQkvKiBpbnZlcnNpb24gZmFpbGVkLS0tbXVzdCBoYXZlIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHRoYW4gb25lIGVycm9yIAotCQkJCSAqLwotCQkJCVRSQUNFX0VYSVQgLTE7Ci0JCQl9Ci0JCX0KLQkJLyogRkFMTCBUSFJPVUdIIFRPIEVSUk9SIE1BR05JVFVERSBDT01QVVRBVElPTjoKLQkJICovCi0JY2FzZSAyOgotCWNhc2UgMzoKLQkJLyogY29tcHV0ZSBlcnJvciBtYWduaXR1ZGVzOiAqLwotCQlnZm1hdF9tdWwobmJhZCwgQWludiwgcywgZXJyb3JfbWFnKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsCi0JCQkgICAgIkludGVybmFsIEVycm9yOiBudW1iZXIgb2YgQ1JDIGVycm9ycyA+IDMiKTsKLQl9Ci0KLQkvKiBQZXJmb3JtIGNvcnJlY3Rpb24gYnkgYWRkaW5nIEVSUk9SX01BR1tpXSB0byB0aGUgYnl0ZSBhdAotCSAqIG9mZnNldCBCQURfTE9DW2ldLiAgQWxzbyBhZGQgdGhlIHZhbHVlIG9mIHRoZSBjb21wdXRlZAotCSAqIGVycm9yIHBvbHlub21pYWwgdG8gdGhlIHN5bmRyb21lIHZhbHVlcy4gIElmIHRoZSBjb3JyZWN0aW9uCi0JICogd2FzIHN1Y2Nlc3NmdWwsIHRoZSByZXN1bHRpbmcgY2hlY2sgYnl0ZXMgc2hvdWxkIGJlIHplcm8KLQkgKiAoaS5lLiwgdGhlIGNvcnJlY3RlZCBkYXRhIGlzIGEgdmFsaWQgY29kZSB3b3JkKS4KLQkgKi8KLQljMCA9IHNbMF07Ci0JYzEgPSBzWzFdOwotCWMyID0gc1syXTsKLQlmb3IgKGkgPSAwOyBpIDwgbmJhZDsgKytpKSB7Ci0JCWUgPSBlcnJvcl9tYWdbaV07Ci0JCWlmIChlKSB7Ci0JCQkvKiBjb3JyZWN0IHRoZSBieXRlIGF0IG9mZnNldCBMIGJ5IG1hZ25pdHVkZSBFOiAqLwotCQkJbCA9IGJhZF9sb2NbaV07Ci0JCQlkcCA9ICZkYXRhW2wgKiBGVF9TRUNUT1JfU0laRV07Ci0JCQkqZHAgPSBnZmFkZCgqZHAsIGUpOwotCQkJKmNvcnJlY3Rpb25fbWFwIHw9IDEgPDwgbDsKLQkJCSsrbmNvcnJlY3RlZDsKLQotCQkJbG9nX2Vycm9yX21hZyA9IGdmbG9nW2VdOwotCQkJYzAgPSBnZmFkZChjMCwgZ2Zwb3dbbW9kMjU1KGxvZ19lcnJvcl9tYWcgLSBsKV0pOwotCQkJYzEgPSBnZmFkZChjMSwgZSk7Ci0JCQljMiA9IGdmYWRkKGMyLCBnZnBvd1ttb2QyNTUobG9nX2Vycm9yX21hZyArIGwpXSk7Ci0JCX0KLQl9Ci0JaWYgKGMwIHx8IGMxIHx8IGMyKSB7Ci0JCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKLQkJCSAgICAiRUNDIHNlbGYtY2hlY2sgZmFpbGVkLCB0b28gbWFueSBlcnJvcnMiKTsKLQl9Ci0JVFJBQ0VfRVhJVCBuY29ycmVjdGVkOwotfQotCi0KLSNpZiBkZWZpbmVkKEVDQ19TQU5JVFlfQ0hFQ0spIHx8IGRlZmluZWQoRUNDX1BBUkFOT0lEKQotCi0vKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBjb21wdXRlZCBwYXJpdHkgYnl0ZXM6Ci0gKi8KLXN0YXRpYyBpbnQgc2FuaXR5X2NoZWNrKHVuc2lnbmVkIGxvbmcgKmRhdGEsIGludCBuYmxvY2tzKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0JdW5zaWduZWQgbG9uZyBzWzNdOwotCi0JaWYgKCFjb21wdXRlX3N5bmRyb21lcyhkYXRhLCBuYmxvY2tzLCBzKSkgewotCQlUUkFDRV9BQk9SVCgwLCBmdF9idWcsCi0JCQkgICAgIkludGVybmFsIEVycm9yOiBzeW5kcm9tZSBzZWxmLWNoZWNrIGZhaWxlZCIpOwotCX0KLQlUUkFDRV9FWElUIDE7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKEVDQ19TQU5JVFlfQ0hFQ0spIHx8IGRlZmluZWQoRUNDX1BBUkFOT0lEKSAqLwotCi0vKiBDb21wdXRlIHRoZSBwYXJpdHkgZm9yIGFuIGVudGlyZSBzZWdtZW50IG9mIGRhdGEuCi0gKi8KLWludCBmdGFwZV9lY2Nfc2V0X3NlZ21lbnRfcGFyaXR5KHN0cnVjdCBtZW1vcnlfc2VnbWVudCAqbXNlZykKLXsKLQlpbnQgaTsKLQlfX3U4ICpwYXJpdHlfYnl0ZXM7Ci0KLQlwYXJpdHlfYnl0ZXMgPSAmbXNlZy0+ZGF0YVsobXNlZy0+YmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRV07Ci0JZm9yIChpID0gMDsgaSA8IEZUX1NFQ1RPUl9TSVpFOyBpICs9IHNpemVvZihsb25nKSkgewotCQlzZXRfcGFyaXR5KCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2ldLCBtc2VnLT5ibG9ja3MgLSAzLAotCQkJICAgKHVuc2lnbmVkIGxvbmcgKikgJnBhcml0eV9ieXRlc1tpXSwKLQkJCSAgIEZUX1NFQ1RPUl9TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKLSNpZmRlZiBFQ0NfUEFSQU5PSUQKLQkJaWYgKCFzYW5pdHlfY2hlY2soKHVuc2lnbmVkIGxvbmcgKikgJm1zZWctPmRhdGFbaV0sCi0JCQkJICAgbXNlZy0+YmxvY2tzKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0jZW5kaWYJCQkJLyogRUNDX1BBUkFOT0lEICovCi0JfQotCXJldHVybiAwOwotfQotCi0KLS8qIENoZWNrcyBhbmQgY29ycmVjdHMgKGlmIHBvc3NpYmxlKSB0aGUgc2VnbWVudCBNU0VHLiAgUmV0dXJucyBvbmUgb2YKLSAqIEVDQ19PSywgRUNDX0NPUlJFQ1RFRCwgYW5kIEVDQ19GQUlMRUQuCi0gKi8KLWludCBmdGFwZV9lY2NfY29ycmVjdF9kYXRhKHN0cnVjdCBtZW1vcnlfc2VnbWVudCAqbXNlZykKLXsKLQlpbnQgY29sLCBpLCByZXN1bHQ7Ci0JaW50IG5jb3JyZWN0ZWQgPSAwOwotCWludCBuZXJhc3VyZXMgPSAwOwkvKiAjIG9mIGVyYXN1cmVzIChDUkMgZXJyb3JzKSAqLwotCWludCBlcmFzdXJlX2xvY1szXTsJLyogZXJhc3VyZSBsb2NhdGlvbnMgKi8KLQl1bnNpZ25lZCBsb25nIHNzWzNdOwotCV9fdTggc1szXTsKLQlNYXRyaXggQWludjsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCW1zZWctPmNvcnJlY3RlZCA9IDA7Ci0KLQkvKiBmaW5kIGZpcnN0IGNvbHVtbiB0aGF0IGhhcyBub24temVybyBzeW5kcm9tZXM6ICovCi0JZm9yIChjb2wgPSAwOyBjb2wgPCBGVF9TRUNUT1JfU0laRTsgY29sICs9IHNpemVvZihsb25nKSkgewotCQlpZiAoIWNvbXB1dGVfc3luZHJvbWVzKCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2NvbF0sCi0JCQkJICAgICAgIG1zZWctPmJsb2Nrcywgc3MpKSB7Ci0JCQkvKiBzb21ldGhpbmcgaXMgd3JvbmctLS1oYXZlIHRvIGZpeCB0aGluZ3MgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChjb2wgPj0gRlRfU0VDVE9SX1NJWkUpIHsKLQkJLyogYWxsIHN5bmRyb21lcyBhcmUgb2ssIHRoZXJlZm9yZSBub3RoaW5nIHRvIGNvcnJlY3QgKi8KLQkJVFJBQ0VfRVhJVCBFQ0NfT0s7Ci0JfQotCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgQ1JDIGVycm9ycyBpZiB0aGVyZSB3ZXJlIGFueTogKi8KLQlpZiAobXNlZy0+cmVhZF9iYWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IG1zZWctPmJsb2NrczsgaSsrKSB7Ci0JCQlpZiAoQkFEX0NIRUNLKG1zZWctPnJlYWRfYmFkLCBpKSkgewotCQkJCWlmIChuZXJhc3VyZXMgPj0gMykgewotCQkJCQkvKiB0aGlzIGlzIHRvbyBtdWNoIGZvciBFQ0MgKi8KLQkJCQkJVFJBQ0VfQUJPUlQoRUNDX0ZBSUxFRCwgZnRfdF9lcnIsCi0JCQkJCQkiRUNDIGZhaWxlZCAoPjMgQ1JDIGVycm9ycykiKTsKLQkJCQl9CS8qIGlmICovCi0JCQkJZXJhc3VyZV9sb2NbbmVyYXN1cmVzKytdID0gaTsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIElmIHRoZXJlIGFyZSBhdCBsZWFzdCAyIENSQyBlcnJvcnMsIGRldGVybWluZSBpbnZlcnNlIG9mIG1hdHJpeAotCSAqIG9mIGxpbmVhciBzeXN0ZW0gdG8gYmUgc29sdmVkOgotCSAqLwotCXN3aXRjaCAobmVyYXN1cmVzKSB7Ci0JY2FzZSAyOgotCQlpZiAoIWdmaW52MihlcmFzdXJlX2xvY1swXSwgZXJhc3VyZV9sb2NbMV0sIEFpbnYpKSB7Ci0JCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoIWdmaW52MyhlcmFzdXJlX2xvY1swXSwgZXJhc3VyZV9sb2NbMV0sCi0JCQkgICAgZXJhc3VyZV9sb2NbMl0sIEFpbnYpKSB7Ci0JCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogdGhpcyBpcyBub3QgYW4gZXJyb3IgY29uZGl0aW9uLi4uICovCi0JCWJyZWFrOwotCX0KLQotCWRvIHsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihsb25nKTsgKytpKSB7Ci0JCQlzWzBdID0gc3NbMF07Ci0JCQlzWzFdID0gc3NbMV07Ci0JCQlzWzJdID0gc3NbMl07Ci0JCQlpZiAoc1swXSB8IHNbMV0gfCBzWzJdKSB7Ci0jaWZkZWYgQklHX0VORElBTgotCQkJCXJlc3VsdCA9IGNvcnJlY3RfYmxvY2soCi0JCQkJCSZtc2VnLT5kYXRhW2NvbCArIHNpemVvZihsb25nKSAtIDEgLSBpXSwKLQkJCQkJbXNlZy0+YmxvY2tzLAotCQkJCQluZXJhc3VyZXMsCi0JCQkJCWVyYXN1cmVfbG9jLAotCQkJCQlBaW52LAotCQkJCQlzLAotCQkJCQkmbXNlZy0+Y29ycmVjdGVkKTsKLSNlbHNlCi0JCQkJcmVzdWx0ID0gY29ycmVjdF9ibG9jaygmbXNlZy0+ZGF0YVtjb2wgKyBpXSwKLQkJCQkJCSAgICAgICBtc2VnLT5ibG9ja3MsCi0JCQkJCQkgICAgICAgbmVyYXN1cmVzLAotCQkJCQkJICAgICAgIGVyYXN1cmVfbG9jLAotCQkJCQkJICAgICAgIEFpbnYsCi0JCQkJCQkgICAgICAgcywKLQkJCQkJCSAgICAgICAmbXNlZy0+Y29ycmVjdGVkKTsKLSNlbmRpZgotCQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJCVRSQUNFX0VYSVQgRUNDX0ZBSUxFRDsKLQkJCQl9Ci0JCQkJbmNvcnJlY3RlZCArPSByZXN1bHQ7Ci0JCQl9Ci0JCQlzc1swXSA+Pj0gODsKLQkJCXNzWzFdID4+PSA4OwotCQkJc3NbMl0gPj49IDg7Ci0JCX0KLQotI2lmZGVmIEVDQ19TQU5JVFlfQ0hFQ0sKLQkJaWYgKCFzYW5pdHlfY2hlY2soKHVuc2lnbmVkIGxvbmcgKikgJm1zZWctPmRhdGFbY29sXSwKLQkJCQkgIG1zZWctPmJsb2NrcykpIHsKLQkJCVRSQUNFX0VYSVQgRUNDX0ZBSUxFRDsKLQkJfQotI2VuZGlmCQkJCS8qIEVDQ19TQU5JVFlfQ0hFQ0sgKi8KLQotCQkvKiBmaW5kIG5leHQgY29sdW1uIHdpdGggbm9uLXplcm8gc3luZHJvbWVzOiAqLwotCQl3aGlsZSAoKGNvbCArPSBzaXplb2YobG9uZykpIDwgRlRfU0VDVE9SX1NJWkUpIHsKLQkJCWlmICghY29tcHV0ZV9zeW5kcm9tZXMoKHVuc2lnbmVkIGxvbmcgKikKLQkJCQkgICAgJm1zZWctPmRhdGFbY29sXSwgbXNlZy0+YmxvY2tzLCBzcykpIHsKLQkJCQkvKiBzb21ldGhpbmcgaXMgd3JvbmctLS1oYXZlIHRvIGZpeCB0aGluZ3MgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKGNvbCA8IEZUX1NFQ1RPUl9TSVpFKTsKLQlpZiAobmNvcnJlY3RlZCAmJiBuZXJhc3VyZXMgPT0gMCkgewotCQlUUkFDRShmdF90X3dhcm4sICJibG9jayBjb250YWluZWQgZXJyb3Igbm90IGNhdWdodCBieSBDUkMiKTsKLQl9Ci0JVFJBQ0UoKG5jb3JyZWN0ZWQgPiAwKSA/IGZ0X3Rfbm9pc2UgOiBmdF90X2FueSwgIm51bWJlciBvZiBjb3JyZWN0aW9uczogJWQiLCBuY29ycmVjdGVkKTsKLQlUUkFDRV9FWElUIG5jb3JyZWN0ZWQgPyBFQ0NfQ09SUkVDVEVEIDogRUNDX09LOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI5MTQ2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSNpZm5kZWYgX0ZUQVBFX0VDQ19IXwotI2RlZmluZSBfRlRBUEVfRUNDX0hfCi0KLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5MyBOaW5nIGFuZCBEYXZpZCBNb3NiZXJnZXIuCi0gKiAgICAgIE9yaWdpbmFsOgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMgQmFzIExhYXJob3Zlbi4KLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkyIERhdmlkIEwuIEJyb3duLCBKci4KLSAKLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0geW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotIFVTQS4KLSAKLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoxMSAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUKLSAqICAgICAgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24gY29kZSAKLSAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgdGFwZSBzdHJlYW1lciBkZXZpY2UgZHJpdmVyLgotICovCi0KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLQotI2RlZmluZSBCQURfQ0xFQVIoZW50cnkpICgoZW50cnkpPTApCi0jZGVmaW5lIEJBRF9TRVQoZW50cnksc2VjdG9yKSAoKGVudHJ5KXw9KDE8PChzZWN0b3IpKSkKLSNkZWZpbmUgQkFEX0NIRUNLKGVudHJ5LHNlY3RvcikgKChlbnRyeSkmKDE8PChzZWN0b3IpKSkKLQotLyoKLSAqIFJldHVybiB2YWx1ZXMgZm9yIGVjY19jb3JyZWN0X2RhdGE6Ci0gKi8KLWVudW0gewotCUVDQ19PSywJCQkvKiBEYXRhIHdhcyBjb3JyZWN0LiAqLwotCUVDQ19DT1JSRUNURUQsCQkvKiBDb3JyZWN0YWJsZSBlcnJvciBpbiBkYXRhLiAqLwotCUVDQ19GQUlMRUQsCQkvKiBDb3VsZCBub3QgY29ycmVjdCBkYXRhLiAqLwotfTsKLQotLyoKLSAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGluIG1lbW9yeSBzZWdtZW50LiAgTUFSS0VEX0JBRCBsaXN0cyB0aGUKLSAqIHNlY3RvcnMgdGhhdCB3ZXJlIG1hcmtlZCBiYWQgZHVyaW5nIGZvcm1hdHRpbmcuICBJZiB0aGUgTi10aCBzZWN0b3IKLSAqIGluIGEgc2VnbWVudCBpcyBtYXJrZWQgYmFkLCBiaXQgMTw8TiB3aWxsIGJlIHNldCBpbiBNQVJLRURfQkFELgotICogVGhlIHNlY3RvcnMgc2hvdWxkIGJlIHJlYWQgaW4gZnJvbSB0aGUgZGlzayBhbmQgcGFja2VkLCBhcyBpZiB0aGUKLSAqIGJhZCBzZWN0b3JzIHdlcmUgbm90IHRoZXJlLCBhbmQgdGhlIHNlZ21lbnQganVzdCBjb250YWluZWQgZmV3ZXIKLSAqIHNlY3RvcnMuICBSRUFEX1NFQ1RPUlMgaXMgYSBiaXRtYXAgb2YgZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlCi0gKiByZWFkaW5nIHRoZSBkYXRhLiAgVGhlc2Ugb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHBhY2tlZCBkYXRhLgotICogQkxPQ0tTIGlzIGEgY291bnQgb2YgdGhlIHNlY3RvcnMgbm90IG1hcmtlZCBiYWQuICBUaGlzIGlzIGp1c3QgdG8KLSAqIHByZXZlbnQgaGF2aW5nIHRvIGNvdW50IHRoZSB6ZXJvIGJpdHMgaW4gTUFSS0VEX0JBRCBlYWNoIHRpbWUgdGhpcwotICogaXMgbmVlZGVkLiAgREFUQSBpcyB0aGUgYWN0dWFsIHNlY3RvciBwYWNrZWQgZGF0YSBmcm9tIChvciB0bykgdGhlCi0gKiB0YXBlLgotICovCi0gc3RydWN0IG1lbW9yeV9zZWdtZW50IHsKLQlTZWN0b3JNYXAgbWFya2VkX2JhZDsKLQlTZWN0b3JNYXAgcmVhZF9iYWQ7Ci0gCWludCBibG9ja3M7Ci0gCV9fdTggKmRhdGE7Ci0JU2VjdG9yTWFwIGNvcnJlY3RlZDsKLSB9OwotCi0vKgotICogZWNjLmMgZGVmaW5lZCBnbG9iYWwgdmFyaWFibGVzOgotICovCi0jaWZkZWYgVEVTVAotZXh0ZXJuIGludCBmdGFwZV9lY2NfdHJhY2luZzsKLSNlbmRpZgotCi0vKgotICogZWNjLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zOgotICovCi1leHRlcm4gaW50IGZ0YXBlX2VjY19jb3JyZWN0X2RhdGEoc3RydWN0IG1lbW9yeV9zZWdtZW50ICpkYXRhKTsKLWV4dGVybiBpbnQgZnRhcGVfZWNjX3NldF9zZWdtZW50X3Bhcml0eShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKmRhdGEpOwotCi0jZW5kaWYJLyogX0ZUQVBFX0VDQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQ0YzU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmMsdiAkCi0gKiAkUmV2aXNpb246IDEuMi40LjEgJAotICogJERhdGU6IDE5OTcvMTEvMTQgMTY6MDU6MzkgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIHN1cHBvcnQgZm9ybWF0dGluZyBvZiBmbG9wcHkKLSAqICAgICAgdGFwZSBjYXJ0cmlkZ2VzIHdpdGggdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUKLSAqICAgICAgZHJpdmVyICJmdGFwZSIgZm9yIExpbnV4LgotICovCi0gCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1lY2MuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCIKLQotI2lmIGRlZmluZWQoVEVTVElORykKLSNkZWZpbmUgRlRfRk1UX1NFR1NfUEVSX0JVRiA1MAotI2Vsc2UKLSNkZWZpbmUgRlRfRk1UX1NFR1NfUEVSX0JVRiAoRlRfQlVGRl9TSVpFLyg0KkZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpKQotI2VuZGlmCi0KLXN0YXRpYyBzcGlubG9ja190IGZ0YXBlX2Zvcm1hdF9sb2NrOwotCi0vKgotICogIGZpcnN0IHNlZ21lbnQgb2YgdGhlIG5ldyBidWZmZXIKLSAqLwotc3RhdGljIGludCBzd2l0Y2hfc2VnbWVudDsKLQotLyoKLSAqICBhdCBtb3N0IDI1NiBzZWdtZW50cyBmaXQgaW50byBvbmUgMzIga2IgYnVmZmVyLiAgRXZlbiBUUi0xIGNhcnRyaWRnZXMgaGF2ZQotICogIG1vcmUgdGhhbiB0aGlzIG1hbnkgc2VnbWVudHMgcGVyIHRyYWNrLCBzbyBiZXR0ZXIgYmUgY2FyZWZ1bC4KLSAqCi0gKiAgYnVmZmVyX3N0cnVjdCAqYnVmZjogYnVmZmVyIHRvIHN0b3JlIHRoZSBmb3JtYXR0aW5nIGNvb3JkaW5hdGVzIGluCi0gKiAgaW50ICBzdGFydDogc3RhcnRpbmcgc2VnbWVudCBmb3IgdGhpcyBidWZmZXIuCi0gKiAgaW50ICAgIHNwdDogc2VnbWVudHMgcGVyIHRyYWNrCi0gKgotICogIE5vdGU6IHNlZ21lbnQgaWRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIGhlcmUuCi0gKi8KLXN0YXRpYyB2b2lkIHNldHVwX2Zvcm1hdF9idWZmZXIoYnVmZmVyX3N0cnVjdCAqYnVmZiwgaW50IHN0YXJ0LCBpbnQgc3B0LAotCQkJCV9fdTggZ2FwMykKLXsKLQlpbnQgdG9fZG8gPSBzcHQgLSBzdGFydDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICh0b19kbyA+IEZUX0ZNVF9TRUdTX1BFUl9CVUYpIHsKLQkJdG9fZG8gPSBGVF9GTVRfU0VHU19QRVJfQlVGOwotCX0KLQlidWZmLT5wdHIgICAgICAgICAgPSBidWZmLT5hZGRyZXNzOwotCWJ1ZmYtPnJlbWFpbmluZyAgICA9IHRvX2RvICogRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsgLyogIyBzZWN0b3JzICovCi0JYnVmZi0+Ynl0ZXMgICAgICAgID0gYnVmZi0+cmVtYWluaW5nICogNDsgLyogbmVlZCA0IGJ5dGVzIHBlciBzZWN0b3IgKi8KLQlidWZmLT5nYXAzICAgICAgICAgPSBnYXAzOwotCWJ1ZmYtPnNlZ21lbnRfaWQgICA9IHN0YXJ0OwotCWJ1ZmYtPm5leHRfc2VnbWVudCA9IHN0YXJ0ICsgdG9fZG87Ci0JaWYgKGJ1ZmYtPm5leHRfc2VnbWVudCA+PSBzcHQpIHsKLQkJYnVmZi0+bmV4dF9zZWdtZW50ID0gMDsgLyogMCBtZWFuczogc3RvcCBydW5uZXIgKi8KLQl9Ci0JYnVmZi0+c3RhdHVzICAgICAgID0gd2FpdGluZzsgLyogdGVsbHMgdGhlIGlzciB0aGF0IGl0IGNhbiB1c2UKLQkJCQkgICAgICAgKiB0aGlzIGJ1ZmZlcgotCQkJCSAgICAgICAqLwotCVRSQUNFX0VYSVQ7Ci19Ci0KLQotLyoKLSAqICBzdGFydCBmb3JtYXR0aW5nIGEgbmV3IHRyYWNrLgotICovCi1pbnQgZnRhcGVfZm9ybWF0X3RyYWNrKGNvbnN0IHVuc2lnbmVkIGludCB0cmFjaywgY29uc3QgX191OCBnYXAzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYnVmZmVyX3N0cnVjdCAqdGFpbCwgKmhlYWQ7Ci0JaW50IHN0YXR1czsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cyksKTsKLQlpZiAodHJhY2sgJiAxKSB7Ci0JCWlmICghKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfRU9UKSkgewotCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfc2Vla190b19lb3QoKSwpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCEoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9CT1QpKSB7Ci0JCQlUUkFDRV9DQVRDSChmdGFwZV9zZWVrX3RvX2JvdCgpLCk7Ci0JCX0KLQl9Ci0JZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7IC8qIHRoaXMgc2V0cyBmdF9oZWFkID0gZnRfdGFpbCA9IDAgKi8KLQlmdGFwZV9zZXRfc3RhdGUoZm9ybWF0dGluZyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLAotCSAgICAgICJGb3JtYXR0aW5nIHRyYWNrICVkLCBsb2dpY2FsOiBmcm9tIHNlZ21lbnQgJWQgdG8gJWQiLAotCSAgICAgIHRyYWNrLCB0cmFjayAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgCi0JICAgICAgKHRyYWNrICsgMSkgKiBmdF9zZWdtZW50c19wZXJfdHJhY2sgLSAxKTsKLQkKLQkvKgotCSAqICBpbml0aWFsaXplIHRoZSBidWZmZXIgc3dpdGNoaW5nIHByb3RvY29sIGZvciB0aGlzIHRyYWNrCi0JICovCi0JaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7IC8qIHRhcGUgaXNuJ3QgcnVubmluZyB5ZXQgKi8KLQl0YWlsID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsgLyogdGFwZSBpc24ndCBydW5uaW5nIHlldCAqLwotCXN3aXRjaF9zZWdtZW50ID0gMDsKLQlkbyB7Ci0JCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKLQkJc2V0dXBfZm9ybWF0X2J1ZmZlcih0YWlsLCBzd2l0Y2hfc2VnbWVudCwKLQkJCQkgICAgZnRfc2VnbWVudHNfcGVyX3RyYWNrLCBnYXAzKTsKLQkJc3dpdGNoX3NlZ21lbnQgPSB0YWlsLT5uZXh0X3NlZ21lbnQ7Ci0JfSB3aGlsZSAoKHN3aXRjaF9zZWdtZW50ICE9IDApICYmCi0JCSAoKHRhaWwgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKSkgIT0gaGVhZCkpOwotCS8qIGdvICovCi0JaGVhZC0+c3RhdHVzID0gZm9ybWF0dGluZzsKLQlUUkFDRV9DQVRDSChmdGFwZV9zZWVrX2hlYWRfdG9fdHJhY2sodHJhY2spLCk7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfTE9HSUNBTF9GT1JXQVJEKSwpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZmdGFwZV9mb3JtYXRfbG9jaywgZmxhZ3MpOwotCVRSQUNFX0NBVENIKGZkY19zZXR1cF9mb3JtYXR0aW5nKGhlYWQpLCByZXN0b3JlX2ZsYWdzKGZsYWdzKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnRhcGVfZm9ybWF0X2xvY2ssIGZsYWdzKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgcmV0dXJuIHNlZ21lbnQgaWQgb2Ygc2VnbWVudCBjdXJyZW50bHkgYmVpbmcgZm9ybWF0dGVkIGFuZCBkbyB0aGUKLSAqICAgYnVmZmVyIHN3aXRjaGluZyBzdHVmZi4KLSAqLwotaW50IGZ0YXBlX2Zvcm1hdF9zdGF0dXModW5zaWduZWQgaW50ICpzZWdtZW50X2lkKQotewotCWJ1ZmZlcl9zdHJ1Y3QgKnRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOwotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQl3aGlsZSAoc3dpdGNoX3NlZ21lbnQgIT0gMCAmJgotCSAgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpICE9IHRhaWwpIHsKLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQkvKiAgbmVlZCBtb3JlIGJ1ZmZlcnMsIGZpcnN0IHdhaXQgZm9yIGVtcHR5IGJ1ZmZlcgotCQkgKi8KLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfd2FpdF9zZWdtZW50KGZvcm1hdHRpbmcpLCk7Ci0JCS8qICBkb24ndCB3b3JyeSBmb3IgZ2FwMy4gSWYgd2UgZXZlciBoaXQgdGhpcyBwaWVjZSBvZiBjb2RlLAotCQkgKiAgdGhlbiBhbGwgYnVmZmVyIGFscmVhZHkgaGF2ZSB0aGUgY29ycmVjdCBnYXAzIHNldCEKLQkJICovCi0JCXNldHVwX2Zvcm1hdF9idWZmZXIodGFpbCwgc3dpdGNoX3NlZ21lbnQsCi0JCQkJICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgdGFpbC0+Z2FwMyk7Ci0JCXN3aXRjaF9zZWdtZW50ID0gdGFpbC0+bmV4dF9zZWdtZW50OwotCQlpZiAoc3dpdGNoX3NlZ21lbnQgIT0gMCkgewotCQkJdGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOwotCQl9Ci0JfQotCS8qICAgIHNob3VsZCBydW5uZXIgc3RvcCA/Ci0JICovCi0JaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwgZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgewotCQlidWZmZXJfc3RydWN0ICpoZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKLQkJVFJBQ0UoZnRfdF93YXJuLCAiRXJyb3IgZm9ybWF0dGluZyBzZWdtZW50ICVkIiwKLQkJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKS0+c2VnbWVudF9pZCk7Ci0JCSh2b2lkKWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOwotCQlUUkFDRV9FWElUIChoZWFkLT5zdGF0dXMgIT0gZXJyb3IpID8gLUVBR0FJTiA6IC1FSU87Ci0JfQotCS8qCi0JICogIGRvbid0IGNhcmUgaWYgdGhlIHRpbWVyIGV4cGlyZXMsIHRoaXMgaXMganVzdCBraW5kIG9mIGEKLQkgKiAgInNlbGVjdCIgb3BlcmF0aW9uIHRoYXQgbGV0cyB0aGUgY2FsbGluZyBwcm9jZXNzIHNsZWVwCi0JICogIHVudGlsIHNvbWV0aGluZyBoYXMgaGFwcGVuZWQKLQkgKi8KLQlpZiAoZmRjX2ludGVycnVwdF93YWl0KDUgKiBGVF9TRUNPTkQpIDwgMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAiRW5kIG9mIHRyYWNrICVkIGF0IHNlZ21lbnQgJWQiLAotCQkgICAgICBmdF9sb2NhdGlvbi50cmFjaywKLQkJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKS0+c2VnbWVudF9pZCk7Ci0JCXJlc3VsdCA9IDE7ICAvKiBlbmQgb2YgdHJhY2ssIHVubG9jayBtb2R1bGUgKi8KLQl9IGVsc2UgewotCQlyZXN1bHQgPSAwOwotCX0KLQkvKgotCSAqICB0aGUgY2FsbGluZyBwcm9jZXNzIHNob3VsZCB1c2UgdGhlIHNlZyBpZCB0byBkZXRlcm1pbmUKLQkgKiAgd2hpY2ggcGFydHMgb2YgdGhlIGRtYSBidWZmZXJzIGNhbiBiZSBzYWZlbHkgb3ZlcndyaXR0ZW4KLQkgKiAgd2l0aCBuZXcgZGF0YS4KLQkgKi8KLQkqc2VnbWVudF9pZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnNlZ21lbnRfaWQ7Ci0JLyoKLQkgKiAgSW50ZXJuYWxseSB3ZSBzdGFydCBjb3VudGluZyBzZWdtZW50IGlkcyBmcm9tIHRoZSBzdGFydCBvZgotCSAqICBlYWNoIHRyYWNrIHdoZW4gZm9ybWF0dGluZywgYnV0IGV4dGVybmFsbHkgd2Uga2VlcCB0aGVtCi0JICogIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdGFwZToKLQkgKi8KLQkqc2VnbWVudF9pZCArPSBmdF9sb2NhdGlvbi50cmFjayAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjazsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyoKLSAqICBUaGUgc2VnbWVudCBpZCBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHRhcGUKLSAqLwotaW50IGZ0YXBlX3ZlcmlmeV9zZWdtZW50KGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgKmJzbSkKLXsKLQlpbnQgcmVzdWx0OwotCWludCB2ZXJpZnlfZG9uZSA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAiVmVyaWZ5aW5nIHNlZ21lbnQgJWQiLCBzZWdtZW50X2lkKTsKLQotCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gdmVyaWZ5aW5nKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJjYWxsaW5nIGZ0YXBlX2Fib3J0X29wZXJhdGlvbiIpOwotCQlpZiAoZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCkgPCAwKSB7Ci0JCQlUUkFDRShmdF90X2VyciwgImZ0YXBlX2Fib3J0X29wZXJhdGlvbiBmYWlsZWQiKTsKLQkJCVRSQUNFX0VYSVQgLUVJTzsKLQkJfQotCX0KLQkqYnNtID0gMHgwMDAwMDAwMDsKLQlmdGFwZV9zZXRfc3RhdGUodmVyaWZ5aW5nKTsKLQlmb3IgKDs7KSB7Ci0JCWJ1ZmZlcl9zdHJ1Y3QgKnRhaWw7Ci0JCS8qCi0JCSAqICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsCi0JCSAqLwotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JCS8qCi0JCSAqICBTZWFyY2ggYWxsIGZ1bGwgYnVmZmVycyBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIHRoZQotCQkgKiAgd2FudGVkIHNlZ21lbnQuICBDbGVhciBvdGhlciBidWZmZXJzIG9uIHRoZSBmbHkuCi0JCSAqLwotCQl0YWlsID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKLQkJd2hpbGUgKCF2ZXJpZnlfZG9uZSAmJiB0YWlsLT5zdGF0dXMgPT0gZG9uZSkgewotCQkJLyoKLQkJCSAqICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsICEKLQkJCSAqLwotCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQkJaWYgKHRhaWwtPnNlZ21lbnRfaWQgPT0gc2VnbWVudF9pZCkgewotCQkJCS8qICBJZiBvdXQgYnVmZmVyIGlzIGFscmVhZHkgZnVsbCwKLQkJCQkgKiAgcmV0dXJuIGl0cyBjb250ZW50cy4gIAotCQkJCSAqLwotCQkJCVRSQUNFKGZ0X3RfZmxvdywgImZvdW5kIHNlZ21lbnQgaW4gY2FjaGU6ICVkIiwKLQkJCQkgICAgICBzZWdtZW50X2lkKTsKLQkJCQlpZiAoKHRhaWwtPnNvZnRfZXJyb3JfbWFwIHwKLQkJCQkgICAgIHRhaWwtPmhhcmRfZXJyb3JfbWFwKSAhPSAwKSB7Ci0JCQkJCVRSQUNFKGZ0X3RfaW5mbywiYnNtWyVkXSA9IDB4JTA4bHgiLAotCQkJCQkgICAgICBzZWdtZW50X2lkLAotCQkJCQkgICAgICAodW5zaWduZWQgbG9uZykKLQkJCQkJICAgICAgKHRhaWwtPnNvZnRfZXJyb3JfbWFwIHwKLQkJCQkJICAgICAgdGFpbC0+aGFyZF9lcnJvcl9tYXApKTsKLQkJCQkJKmJzbSA9ICh0YWlsLT5zb2Z0X2Vycm9yX21hcCB8Ci0JCQkJCQl0YWlsLT5oYXJkX2Vycm9yX21hcCk7Ci0JCQkJfQotCQkJCXZlcmlmeV9kb25lID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9mbG93LCJ6YXBwaW5nIHNlZ21lbnQgaW4gY2FjaGU6ICVkIiwKLQkJCQkgICAgICB0YWlsLT5zZWdtZW50X2lkKTsKLQkJCX0KLQkJCXRhaWwtPnN0YXR1cyA9IHdhaXRpbmc7Ci0JCQl0YWlsID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfdGFpbCk7Ci0JCX0KLQkJaWYgKCF2ZXJpZnlfZG9uZSAmJiB0YWlsLT5zdGF0dXMgPT0gdmVyaWZ5aW5nKSB7Ci0JCQlpZiAodGFpbC0+c2VnbWVudF9pZCA9PSBzZWdtZW50X2lkKSB7Ci0JCQkJc3dpdGNoKGZ0YXBlX3dhaXRfc2VnbWVudCh2ZXJpZnlpbmcpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlicmVhazsKLQkJCQljYXNlIC1FSU5UUjoKLQkJCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCBmdF90X3dhcm4sCi0JCQkJCQkgICAgImludGVycnVwdGVkIGJ5ICIKLQkJCQkJCSAgICAibm9uLWJsb2NrYWJsZSBzaWduYWwiKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7Ci0JCQkJCWZ0YXBlX3NldF9zdGF0ZSh2ZXJpZnlpbmcpOwotCQkJCQkvKiBiZSBwaWNreSAqLwotCQkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X3dhcm4sCi0JCQkJCQkgICAgIndhaXRfc2VnbWVudCBmYWlsZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qICBXZSdyZSByZWFkaW5nIHRoZSB3cm9uZyBzZWdtZW50LAotCQkJCSAqICBzdG9wIHJ1bm5lci4KLQkJCQkgKi8KLQkJCQlUUkFDRShmdF90X25vaXNlLCAidmVyaWZ5aW5nIHdyb25nIHNlZ21lbnQiKTsKLQkJCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKLQkJCQlmdGFwZV9zZXRfc3RhdGUodmVyaWZ5aW5nKTsKLQkJCX0KLQkJfQotCQkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPwotCQkgKi8KLQkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcpIHsKLQkJCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOwotCQkJaWYgKGhlYWQtPnN0YXR1cyA9PSBlcnJvciB8fAotCQkJICAgIGhlYWQtPnN0YXR1cyA9PSB2ZXJpZnlpbmcpIHsKLQkJCQkvKiBubyBkYXRhIG9yIG92ZXJydW4gZXJyb3IgKi8KLQkJCQloZWFkLT5zdGF0dXMgPSB3YWl0aW5nOwotCQkJfQotCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfZHVtYl9zdG9wKCksKTsKLQkJfSBlbHNlIHsKLQkJCS8qICBJZiBqdXN0IHBhc3NlZCBsYXN0IHNlZ21lbnQgb24gdGFwZTogd2FpdAotCQkJICogIGZvciBCT1Qgb3IgRU9UIG1hcmsuIFNldHMgZnRfcnVubmVyX3N0YXR1cyB0bwotCQkJICogIGlkbGUgaWYgYXQgbEVPVCBhbmQgc3VjY2Vzc2Z1bCAKLQkJCSAqLwotCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksKTsKLQkJfQotCQlpZiAodmVyaWZ5X2RvbmUpIHsKLQkJCVRSQUNFX0VYSVQgMDsKLQkJfQotCQkvKiAgICBOb3cgYXQgbGVhc3Qgb25lIGJ1ZmZlciBpcyBpZGxlIQotCQkgKiAgICBSZXN0YXJ0IHJ1bm5lciAmIHRhcGUgaWYgbmVlZGVkLgotCQkgKi8KLQkJLyogIFdlIGNvdWxkIG9wdGltaXplIHRoZSBmb2xsb3dpbmcgYSBsaXR0bGUgYml0LiBXZSBrbm93IHRoYXQgCi0JCSAqICB0aGUgYmFkIHNlY3RvciBtYXAgaXMgZW1wdHkuCi0JCSAqLwotCQl0YWlsID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKLQkJaWYgKHRhaWwtPnN0YXR1cyA9PSB3YWl0aW5nKSB7Ci0JCQlidWZmZXJfc3RydWN0ICpoZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKLQotCQkJZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoaGVhZCwgc2VnbWVudF9pZCwgLTEpOwotCQkJZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoaGVhZCk7Ci0JCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBpZGxlKSB7Ci0JCQkJcmVzdWx0ID0gZnRhcGVfc3RhcnRfdGFwZShzZWdtZW50X2lkLAotCQkJCQkJCSAgaGVhZC0+c2VjdG9yX29mZnNldCk7Ci0JCQkJc3dpdGNoKHJlc3VsdCkgewotCQkJCWNhc2UgMDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAtRVRJTUU6Ci0JCQkJY2FzZSAtRUlOVFI6Ci0JCQkJCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9lcnIsICJFcnJvcjogIgotCQkJCQkJICAgICJzZWdtZW50ICVkIHVucmVhY2hhYmxlIiwKLQkJCQkJCSAgICBzZWdtZW50X2lkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJKmJzbSA9IEVNUFRZX1NFR01FTlQ7Ci0JCQkJCVRSQUNFX0VYSVQgMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaGVhZC0+c3RhdHVzID0gdmVyaWZ5aW5nOwotCQkJZmRjX3NldHVwX3JlYWRfd3JpdGUoaGVhZCwgRkRDX1ZFUklGWSk7Ci0JCX0KLQl9Ci0JLyogbm90IHJlYWNoZWQgKi8KLQlUUkFDRV9FWElUIC1FSU87Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTE2MTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfRk9STUFUX0gKLSNkZWZpbmUgX0ZUQVBFX0ZPUk1BVF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MTMgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsb3cgbGV2ZWwgZGVmaW5pdGlvbnMgZm9yIHRoZQotICogICAgICBmb3JtYXR0aW5nIHN1cHBvcnQgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlCi0gKiAgICAgIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KLSAqLwotCi0jaWZkZWYgX19LRVJORUxfXwotZXh0ZXJuIGludCBmdGFwZV9mb3JtYXRfdHJhY2soY29uc3QgdW5zaWduZWQgaW50IHRyYWNrLCBjb25zdCBfX3U4IGdhcDMpOwotZXh0ZXJuIGludCBmdGFwZV9mb3JtYXRfc3RhdHVzKHVuc2lnbmVkIGludCAqc2VnbWVudF9pZCk7Ci1leHRlcm4gaW50IGZ0YXBlX3ZlcmlmeV9zZWdtZW50KGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgKmJzbSk7Ci0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pbml0LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTk4MTMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaW50ZXJmYWNlcyB0aGUga2VybmVsCi0gKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgotI2lmZGVmIENPTkZJR19aRlRBUEUKLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1idWZmZXIuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1wcm9jLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotCi0KLSNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgIWRlZmluZWQoQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTCkKLXN0YXRpYyBpbnQgZnRfdHJhY2luZyA9IC0xOwotI2VuZGlmCi0KLQotLyogIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIKLSAqICBvciBieSBrZXJuZWwgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBmdGFwZV9pbml0KHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLSNpZmRlZiBNT0RVTEUKLSNpZm5kZWYgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAotCWlmIChmdF90cmFjaW5nICE9IC0xKSB7Ci0JCWZ0YXBlX3RyYWNpbmcgPSBmdF90cmFjaW5nOwotCX0KLSNlbmRpZgotCXByaW50ayhLRVJOX0lORk8gRlRBUEVfVkVSU0lPTiAiXG4iKTsKLSAgICAgICAgaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgewotCQlwcmludGsoCi1LRVJOX0lORk8gIihjKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiAoYmFzQHZpbWVjLm5sKVxuIgotS0VSTl9JTkZPICIoYykgMTk5NS0xOTk2IEthaSBIYXJyZWtpbGRlLVBldGVyc2VuIChraHBAZG9scGhpbmljcy5ubylcbiIKLUtFUk5fSU5GTyAiKGMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSlcbiIKLUtFUk5fSU5GTyAiUUlDLTExNyBkcml2ZXIgZm9yIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5IHRhcGUgZHJpdmVzXG4iKTsKLSAgICAgICAgfQotI2Vsc2UgLyogIU1PRFVMRSAqLwotCS8qIHByaW50IGEgc2hvcnQgbm8tbm9uc2Vuc2UgYm9vdCBtZXNzYWdlICovCi0JcHJpbnRrKEtFUk5fSU5GTyBGVEFQRV9WRVJTSU9OICJcbiIpOwotI2VuZGlmIC8qIE1PRFVMRSAqLwotCVRSQUNFKGZ0X3RfaW5mbywgImluc3RhbGxpbmcgUUlDLTExNyBmbG9wcHkgdGFwZSBoYXJkd2FyZSBkcml2ZSAuLi4gIik7Ci0JVFJBQ0UoZnRfdF9pbmZvLCAiZnRhcGVfaW5pdCBAIDB4JXAiLCBmdGFwZV9pbml0KTsKLQkvKiAgQWxsb2NhdGUgdGhlIERNQSBidWZmZXJzLiBUaGV5IGFyZSBkZWFsbG9jYXRlZCBhdCBjbGVhbnVwKCkgdGltZS4KLQkgKi8KLSNpZmRlZiBURVNUSU5HCi0jaWZkZWYgTU9EVUxFCi0Jd2hpbGUgKGZ0YXBlX3NldF9ucl9idWZmZXJzKENPTkZJR19GVF9OUl9CVUZGRVJTKSA8IDApIHsKLQkJZnRhcGVfc2xlZXAoRlRfU0VDT05ELzIwKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkodm9pZClmdGFwZV9zZXRfbnJfYnVmZmVycygwKTsKLQkJCVRSQUNFKGZ0X3RfYnVnLAotCQkJICAgICAgIktpbGxlZCBieSBzaWduYWwgd2hpbGUgYWxsb2NhdGluZyBidWZmZXJzLiIpOwotCQkJVFJBQ0VfQUJPUlQoLUVJTlRSLCAKLQkJCQkgICAgZnRfdF9idWcsICJGcmVlIHVwIG1lbW9yeSBhbmQgcmV0cnkiKTsKLQkJfQotCX0KLSNlbHNlCi0JVFJBQ0VfQ0FUQ0goZnRhcGVfc2V0X25yX2J1ZmZlcnMoQ09ORklHX0ZUX05SX0JVRkZFUlMpLAotCQkgICAgKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCkpOwotI2VuZGlmCi0jZWxzZQotCVRSQUNFX0NBVENIKGZ0YXBlX3NldF9ucl9idWZmZXJzKENPTkZJR19GVF9OUl9CVUZGRVJTKSwKLQkJICAgICh2b2lkKWZ0YXBlX3NldF9ucl9idWZmZXJzKDApKTsKLSNlbmRpZgotCWZ0X2RyaXZlX3NlbCA9IC0xOwotCWZ0X2ZhaWx1cmUgICA9IDE7ICAgICAgICAgLyogaW5oaWJpdCBhbnkgb3BlcmF0aW9uIGJ1dCBvcGVuICovCi0JZnRhcGVfdWRlbGF5X2NhbGlicmF0ZSgpOyAvKiBtdXN0IGJlIGJlZm9yZSBmZGNfd2FpdF9jYWxpYnJhdGUgISAqLwotCWZkY193YWl0X2NhbGlicmF0ZSgpOwotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCi0JKHZvaWQpZnRhcGVfcHJvY19pbml0KCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWkZUQVBFCi0JKHZvaWQpemZ0X2luaXQoKTsKLSNlbmRpZgotCVRSQUNFX0VYSVQgMDsKLX0KLQotbW9kdWxlX3BhcmFtKGZ0X2ZkY19iYXNlLCAgICAgICB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2Jhc2UsICAiQmFzZSBhZGRyZXNzIG9mIEZEQyBjb250cm9sbGVyLiIpOwotbW9kdWxlX3BhcmFtKGZ0X2ZkY19pcnEsICAgICAgICB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2lycSwgICAiSVJRIChpbnRlcnJ1cHQgY2hhbm5lbCkgdG8gdXNlLiIpOwotbW9kdWxlX3BhcmFtKGZ0X2ZkY19kbWEsICAgICAgICB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX2RtYSwgICAiRE1BIGNoYW5uZWwgdG8gdXNlLiIpOwotbW9kdWxlX3BhcmFtKGZ0X2ZkY190aHJlc2hvbGQsICB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX3RocmVzaG9sZCwgICJUaHJlc2hvbGQgb2YgdGhlIEZEQyBGaWZvLiIpOwotbW9kdWxlX3BhcmFtKGZ0X2ZkY19yYXRlX2xpbWl0LCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfZmRjX3JhdGVfbGltaXQsICJNYXhpbWFsIGRhdGEgcmF0ZSBmb3IgRkRDLiIpOwotbW9kdWxlX3BhcmFtKGZ0X3Byb2JlX2ZjMTAsICAgICBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfcHJvYmVfZmMxMCwKLQkgICAgIklmIG5vbi16ZXJvLCBwcm9iZSBmb3IgYSBDb2xvcmFkbyBGQy0xMC9GQy0yMCBjb250cm9sbGVyLiIpOwotbW9kdWxlX3BhcmFtKGZ0X21hY2gyLCAgICAgICAgICBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZnRfbWFjaDIsCi0JICAgICJJZiBub24temVybywgcHJvYmUgZm9yIGEgTW91bnRhaW4gTUFDSC0yIGNvbnRyb2xsZXIuIik7Ci0jaWYgZGVmaW5lZChNT0RVTEUpICYmICFkZWZpbmVkKENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwpCi1tb2R1bGVfcGFyYW0oZnRfdHJhY2luZywgICAgICAgIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZ0X3RyYWNpbmcsCi0JICAgICJBbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCwgMCA8PSB0cmFjaW5nIDw9IDgsIGRlZmF1bHQgMy4iKTsKLSNlbmRpZgotCi1NT0RVTEVfQVVUSE9SKAotCSIoYykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4gKGJhc0B2aW1lYy5ubCksICIKLQkiKGMpIDE5OTUtMTk5NiBLYWkgSGFycmVraWxkZS1QZXRlcnNlbiAoa2hwQGRvbHBoaW5pY3Mubm8pLCAiCi0JIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKAotCSJRSUMtMTE3IGRyaXZlciBmb3IgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHkgdGFwZSBkcml2ZXMuIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmdGFwZV9leGl0KHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKQotCWZ0YXBlX3Byb2NfZGVzdHJveSgpOwotI2VuZGlmCi0JKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCk7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gImZ0YXBlOiB1bmxvYWRlZC5cbiIpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLW1vZHVsZV9pbml0KGZ0YXBlX2luaXQpOwotbW9kdWxlX2V4aXQoZnRhcGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhN2I4YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfSU5JVF9ICi0jZGVmaW5lIF9GVEFQRV9JTklUX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWluaXQuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjE2ICQKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgaW50ZXJmYWNlIHRvIAotICogdGhlIExpbnV4IGtlcm5lbCBmb3IgZmxvcHB5IHRhcGUgZHJpdmVyIGZ0YXBlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotCi0jZGVmaW5lIF9ORVZFUl9CTE9DSyAgICAoc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpCi0jZGVmaW5lIF9ET05UX0JMT0NLICAgICAoX05FVkVSX0JMT0NLIHwgc2lnbWFzayhTSUdJTlQpKQotI2RlZmluZSBfRE9fQkxPQ0sgICAgICAgKHNpZ21hc2soU0lHUElQRSkpCi0KLSNpZm5kZWYgUUlDMTE3X1RBUEVfTUFKT1IKLSNkZWZpbmUgUUlDMTE3X1RBUEVfTUFKT1IgMjcKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pby5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTAxNWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTIgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAgICAgIChDKSAxOTk2ICAgICAgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4sCi0gKiAgICAgICAgICAgICAgICAoQykgMTk5NyAgICAgIENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uYyx2ICQKLSAqICRSZXZpc2lvbjogMS40ICQKLSAqICREYXRlOiAxOTk3LzExLzExIDE0OjAyOjM2ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZ2VuZXJhbCBjb250cm9sIGZ1bmN0aW9ucyBmb3IgdGhlCi0gKiAgICAgIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgiCi0KLS8qICAgICAgR2xvYmFsIHZhcnMuCi0gKi8KLS8qIE5PVEU6IHNlY3RvcnMgc3RhcnQgbnVtYmVyaW5nIGF0IDEsIGFsbCBvdGhlcnMgYXQgMCAhICovCi1mdF90aW1lb3V0X3RhYmxlIGZ0YXBlX3RpbWVvdXQ7Ci11bnNpZ25lZCBpbnQgZnRhcGVfdGFwZV9sZW47Ci12b2xhdGlsZSBxaWMxMTdfY21kX3QgZnRhcGVfY3VycmVudF9jb21tYW5kOwotY29uc3Qgc3RydWN0IHFpYzExN19jb21tYW5kX3RhYmxlIHFpYzExN19jbWRzW10gPSBRSUMxMTdfQ09NTUFORFM7Ci1pbnQgZnRhcGVfbWlnaHRfYmVfb2ZmX3RyYWNrOwotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLXN0YXRpYyBpbnQgZGlhZ25vc3RpY19tb2RlOwotc3RhdGljIHVuc2lnbmVkIGludCBmdGFwZV91ZGVsYXlfY291bnQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZ0YXBlX3VkZWxheV90aW1lOwotCi12b2lkIGZ0YXBlX3VkZWxheSh1bnNpZ25lZCBpbnQgdXNlY3MpCi17Ci0Jdm9sYXRpbGUgaW50IGNvdW50ID0gKGZ0YXBlX3VkZWxheV9jb3VudCAqIHVzZWNzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YXBlX3VkZWxheV9jb3VudCAtIDEpIC8gZnRhcGVfdWRlbGF5X3RpbWU7Ci0Jdm9sYXRpbGUgaW50IGk7Ci0KLQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IDIwOyArK2kpOwotCX0KLX0KLQotdm9pZCBmdGFwZV91ZGVsYXlfY2FsaWJyYXRlKHZvaWQpCi17Ci0JZnRhcGVfY2FsaWJyYXRlKCJmdGFwZV91ZGVsYXkiLAotCQkJZnRhcGVfdWRlbGF5LCAmZnRhcGVfdWRlbGF5X2NvdW50LCAmZnRhcGVfdWRlbGF5X3RpbWUpOwotfQotCi0vKiAgICAgIERlbGF5IChtc2VjKSByb3V0aW5lLgotICovCi12b2lkIGZ0YXBlX3NsZWVwKHVuc2lnbmVkIGludCB0aW1lKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQl0aW1lICo9IDEwMDA7ICAgLyogbXNlY3MgLT4gdXNlY3MgKi8KLQlpZiAodGltZSA8IEZUX1VTUFQpIHsKLQkJLyogIFRpbWUgdG9vIHNtYWxsIGZvciBzY2hlZHVsZXIsIGRvIGEgYnVzeSB3YWl0ICEgKi8KLQkJZnRhcGVfdWRlbGF5KHRpbWUpOwotCX0gZWxzZSB7Ci0JCWxvbmcgdGltZW91dDsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJdW5zaWduZWQgaW50IHRpY2tzID0gKHRpbWUgKyBGVF9VU1BUIC0gMSkgLyBGVF9VU1BUOwotCi0JCVRSQUNFKGZ0X3RfYW55LCAiJWQgbXNlYywgJWQgdGlja3MiLCB0aW1lLzEwMDAsIHRpY2tzKTsKLQkJdGltZW91dCA9IHRpY2tzOwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJc3RpKCk7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3ModGltZW91dCkpOwotCQkvKiAgTW1tLiBJc24ndCBjdXJyZW50LT5ibG9ja2VkID09IDB4ZmZmZmZmZmYgPwotCQkgKi8KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlUUkFDRShmdF90X2VyciwgImF3b2tlbiBieSBub24tYmxvY2tlZCBzaWduYWwgOi0oIik7Ci0JCX0KLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qICBzZW5kIGEgY29tbWFuZCBvciBwYXJhbWV0ZXIgdG8gdGhlIGRyaXZlCi0gKiAgR2VuZXJhdGVzICMgb2Ygc3RlcCBwdWxzZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZ0X3NlbmRfdG9fZHJpdmUoaW50IGFyZykKLXsKLQkvKiAgQWx3YXlzIHdhaXQgZm9yIGEgY29tbWFuZF90aW1lb3V0IHBlcmlvZCB0byBzZXBhcmF0ZQotCSAqICBpbmRpdmlkdWFscyBjb21tYW5kcyBhbmQvb3IgcGFyYW1ldGVycy4KLQkgKi8KLQlmdGFwZV9zbGVlcCgzICogRlRfTUlMTElTRUNPTkQpOwotCS8qICBLZWVwIGN5bGluZGVyIG5yIHdpdGhpbiByYW5nZSwgc3RlcCB0b3dhcmRzIGhvbWUgaWYgcG9zc2libGUuCi0JICovCi0JaWYgKGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPj0gYXJnKSB7Ci0JCXJldHVybiBmZGNfc2VlayhmdGFwZV9jdXJyZW50X2N5bGluZGVyIC0gYXJnKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZmRjX3NlZWsoZnRhcGVfY3VycmVudF9jeWxpbmRlciArIGFyZyk7Ci0JfQotfQotCi0vKiBmb3J3YXJkICovIGludCBmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cyk7Ci0KLXN0YXRpYyBpbnQgZnRfY2hlY2tfY21kX3Jlc3RyaWN0aW9ucyhxaWMxMTdfY21kX3QgY29tbWFuZCkKLXsKLQlpbnQgc3RhdHVzID0gLTE7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQlUUkFDRShmdF90X2Zsb3csICIlcyIsIHFpYzExN19jbWRzW2NvbW1hbmRdLm5hbWUpOwotCS8qIEEgbmV3IG1vdGlvbiBjb21tYW5kIGR1cmluZyBhbiB1bmludGVycnVwdGlibGUgKG1vdGlvbikKLQkgKiAgY29tbWFuZCByZXF1aXJlcyBhIHJlYWR5IHN0YXR1cyBiZWZvcmUgdGhlIG5ldyBjb21tYW5kIGNhbgotCSAqICBiZSBpc3N1ZWQuIE90aGVyd2lzZSBhIG5ldyBtb3Rpb24gY29tbWFuZCBuZWVkcyB0byBiZQotCSAqICBjaGVja2VkIGFnYWluc3QgcmVxdWlyZWQgc3RhdHVzLgotCSAqLwotCWlmIChxaWMxMTdfY21kc1tjb21tYW5kXS5jbWRfdHlwZSA9PSBtb3Rpb24gJiYKLQkgICAgcWljMTE3X2NtZHNbZnRhcGVfY3VycmVudF9jb21tYW5kXS5ub25faW50cikgewotCQlmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cygmc3RhdHVzKTsKLQkJaWYgKChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSA9PSAwKSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLAotCQkJICAgICAgIm1vdGlvbiBjbWQgKCVkKSBkdXJpbmcgbm9uLWludHIgY21kICglZCkiLAotCQkJICAgICAgY29tbWFuZCwgZnRhcGVfY3VycmVudF9jb21tYW5kKTsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3YWl0aW5nIHVudGlsIGRyaXZlIGdldHMgcmVhZHkiKTsKLQkJCWZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5zZWVrLAotCQkJCQkgJnN0YXR1cyk7Ci0JCX0KLQl9Ci0JaWYgKHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2sgIT0gMCkgewotCQlfX3U4IGRpZmZlcmVuY2U7Ci0JCS8qICBTb21lIGNvbW1hbmRzIGRvIHJlcXVpcmUgYSBjZXJ0YWluIHN0YXR1czoKLQkJICovCi0JCWlmIChzdGF0dXMgPT0gLTEpIHsJLyogbm90IHlldCBzZXQgKi8KLQkJCWZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOwotCQl9Ci0JCWRpZmZlcmVuY2UgPSAoKHN0YXR1cyBeIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKSAmCi0JCQkgICAgICBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrKTsKLQkJLyogIFdhaXQgdW50aWwgdGhlIGRyaXZlIGdldHMKLQkJICogIHJlYWR5LiBUaGlzIG1heSBsYXN0IGZvcmV2ZXIgaWYKLQkJICogIHRoZSBkcml2ZSBuZXZlciBnZXRzIHJlYWR5Li4uIAotCQkgKi8KLQkJd2hpbGUgKChkaWZmZXJlbmNlICYgUUlDX1NUQVRVU19SRUFEWSkgIT0gMCkgewotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImNvbW1hbmQgJWQgaXNzdWVkIHdoaWxlIG5vdCByZWFkeSIsCi0JCQkgICAgICBjb21tYW5kKTsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3YWl0aW5nIHVudGlsIGRyaXZlIGdldHMgcmVhZHkiKTsKLQkJCWlmIChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQuc2VlaywKLQkJCQkJICAgICAmc3RhdHVzKSA9PSAtRUlOVFIpIHsKLQkJCQkvKiAgQmFpbCBvdXQgb24gc2lnbmFsICEKLQkJCQkgKi8KLQkJCQlUUkFDRV9BQk9SVCgtRUlOVFIsIGZ0X3Rfd2FybiwKLQkJCQkgICAgICAiaW50ZXJydXB0ZWQgYnkgbm9uLWJsb2NrYWJsZSBzaWduYWwiKTsKLQkJCX0KLQkJCWRpZmZlcmVuY2UgPSAoKHN0YXR1cyBeIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKSAmCi0JCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0ubWFzayk7Ci0JCX0KLQkJd2hpbGUgKChkaWZmZXJlbmNlICYgUUlDX1NUQVRVU19FUlJPUikgIT0gMCkgewotCQkJaW50IGVycjsKLQkJCXFpYzExN19jbWRfdCBjbWQ7Ci0KLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCQkgICAgICAiY29tbWFuZCAlZCBpc3N1ZWQgd2hpbGUgZXJyb3IgcGVuZGluZyIsCi0JCQkgICAgICBjb21tYW5kKTsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjbGVhcmluZyBlcnJvciBzdGF0dXMiKTsKLQkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyLCAmY21kLCAxKTsKLQkJCWZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOwotCQkJZGlmZmVyZW5jZSA9ICgoc3RhdHVzIF4gcWljMTE3X2NtZHNbY29tbWFuZF0uc3RhdGUpICYKLQkJCQkgICAgICBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrKTsKLQkJCWlmICgoZGlmZmVyZW5jZSAmIFFJQ19TVEFUVVNfRVJST1IpICE9IDApIHsKLQkJCQkvKiAgQmFpbCBvdXQgb24gZmF0YWwgc2lnbmFsICEKLQkJCQkgKi8KLQkJCQlGVF9TSUdOQUxfRVhJVChfTkVWRVJfQkxPQ0spOwotCQkJfQotCQl9Ci0JCWlmIChkaWZmZXJlbmNlKSB7Ci0JCQkvKiAgQW55IHJlbWFpbmluZyBkaWZmZXJlbmNlIGNhbid0IGJlIHNvbHZlZAotCQkJICogIGhlcmUuICAKLQkJCSAqLwotCQkJaWYgKGRpZmZlcmVuY2UgJiAoUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCB8Ci0JCQkJCSAgUUlDX1NUQVRVU19ORVdfQ0FSVFJJREdFIHwKLQkJCQkJICBRSUNfU1RBVFVTX1JFRkVSRU5DRUQpKSB7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLAotCQkJCSAgICAgICJGYXRhbDogdGFwZSByZW1vdmVkIG9yIHJlaW5zZXJ0ZWQgISIpOwotCQkJCWZ0X2ZhaWx1cmUgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlUUkFDRShmdF90X2VyciwgIndyb25nIHN0YXRlOiAweCUwMnggc2hvdWxkIGJlOiAweCUwMngiLAotCQkJCSAgICAgIHN0YXR1cyAmIHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2ssCi0JCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0uc3RhdGUpOwotCQkJfQotCQkJVFJBQ0VfRVhJVCAtRUlPOwotCQl9Ci0JCWlmICh+c3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSAmIHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2spIHsKLQkJCVRSQUNFX0FCT1JUKC1FQlVTWSwgZnRfdF9lcnIsICJCYWQ6IHN0aWxsIGJ1c3khIik7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiAgICAgIElzc3VlIGEgdGFwZSBjb21tYW5kOgotICovCi1pbnQgZnRhcGVfY29tbWFuZChxaWMxMTdfY21kX3QgY29tbWFuZCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdGF0aWMgaW50IGxldmVsOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlpZiAoKHVuc2lnbmVkIGludCljb21tYW5kID4gTlJfSVRFTVMocWljMTE3X2NtZHMpKSB7Ci0JCS8qICBUaGlzIGlzIGEgYnVnIHdlJ2xsIHdhbnQgdG8ga25vdyBhYm91dCB0b28uCi0JCSAqLwotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywgImJ1ZyAtIGJhZCBjb21tYW5kOiAlZCIsIGNvbW1hbmQpOwotCX0KLQlpZiAoKytsZXZlbCA+IDUpIHsgLyogIFRoaXMgaXMgYSBidWcgd2UnbGwgd2FudCB0byBrbm93IGFib3V0LiAqLwotCQktLWxldmVsOwotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywgImJ1ZyAtIHJlY3Vyc2lvbiBmb3IgY29tbWFuZDogJWQiLAotCQkJICAgIGNvbW1hbmQpOwotCX0KLQkvKiAgZGlzYWJsZSBsb2dnaW5nIGFuZCByZXN0cmljdGlvbiBjaGVjayBmb3Igc29tZSBjb21tYW5kcywKLQkgKiAgY2hlY2sgYWxsIG90aGVyIGNvbW1hbmRzIHRoYXQgaGF2ZSBhIHByZXNjcmliZWQgc3RhcnRpbmcKLQkgKiAgc3RhdHVzLgotCSAqLwotCWlmIChkaWFnbm9zdGljX21vZGUpIHsKLQkJVFJBQ0UoZnRfdF9mbG93LCAiZGlhZ25vc3RpYyBjb21tYW5kICVkIiwgY29tbWFuZCk7Ci0JfSBlbHNlIGlmIChjb21tYW5kID09IFFJQ19SRVBPUlRfRFJJVkVfU1RBVFVTIHx8Ci0JCSAgIGNvbW1hbmQgPT0gUUlDX1JFUE9SVF9ORVhUX0JJVCkgewotCQlUUkFDRShmdF90X2FueSwgIiVzIiwgcWljMTE3X2NtZHNbY29tbWFuZF0ubmFtZSk7Ci0JfSBlbHNlIHsKLQkJVFJBQ0VfQ0FUQ0goZnRfY2hlY2tfY21kX3Jlc3RyaWN0aW9ucyhjb21tYW5kKSwgLS1sZXZlbCk7Ci0JfQotCS8qICBOb3cgYWxsIGNvbmRpdGlvbnMgYXJlIG1ldCBvciByZXN1bHQgd2FzIDwgMC4KLQkgKi8KLQlyZXN1bHQgPSBmdF9zZW5kX3RvX2RyaXZlKCh1bnNpZ25lZCBpbnQpY29tbWFuZCk7Ci0JaWYgKHFpYzExN19jbWRzW2NvbW1hbmRdLmNtZF90eXBlID09IG1vdGlvbiAmJgotCSAgICBjb21tYW5kICE9IFFJQ19MT0dJQ0FMX0ZPUldBUkQgJiYgY29tbWFuZCAhPSBRSUNfU1RPUF9UQVBFKSB7Ci0JCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKLQl9Ci0JZnRhcGVfY3VycmVudF9jb21tYW5kID0gY29tbWFuZDsKLQktLWxldmVsOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiAgICAgIFNlbmQgYSB0YXBlIGNvbW1hbmQgcGFyYW1ldGVyOgotICogICAgICBHZW5lcmF0ZXMgY29tbWFuZCAjIG9mIHN0ZXAgcHVsc2VzLgotICogICAgICBTa2lwcyB0YXBlLXN0YXR1cyBjYWxsICEKLSAqLwotaW50IGZ0YXBlX3BhcmFtZXRlcih1bnNpZ25lZCBpbnQgcGFyYW1ldGVyKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlUUkFDRShmdF90X2Zsb3csICJjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgPSAlZCIsIHBhcmFtZXRlcik7Ci0JVFJBQ0VfRVhJVCBmdF9zZW5kX3RvX2RyaXZlKHBhcmFtZXRlciArIDIpOwotfQotCi0vKiAgICAgIFdhaXQgZm9yIHRoZSBkcml2ZSB0byBnZXQgcmVhZHkuCi0gKiAgICAgIHRpbWVvdXQgdGltZSBpbiBtaWxsaS1zZWNvbmRzCi0gKiAgICAgIFJldHVybmVkIHN0YXR1cyBpcyB2YWxpZCBpZiByZXN1bHQgIT0gLUVJTwotICoKLSAqICAgICAgU2hvdWxkIHdlIGFsbG93IHRvIGJlIGtpbGxlZCBieSBTSUdJTlQ/ICAoXkMpCi0gKiAgICAgIFdvdWxkIGJlIG5pY2UgYXQgbGVhc3QgZm9yIGxhcmdlIHRpbWVvdXRzLgotICovCi1pbnQgZnRhcGVfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpCi17Ci0JdW5zaWduZWQgbG9uZyB0MDsKLQl1bnNpZ25lZCBpbnQgcG9sbF9kZWxheTsKLQlpbnQgc2lnbmFsX3JldHJpZXM7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qICB0aGUgZm9sbG93aW5nICoqIFJFQUxMWSAqKiByZWR1Y2VzIHRoZSBzeXN0ZW0gbG9hZCB3aGVuCi0JICogIGUuZy4gb25lIHNpbXBseSByZXdpbmRzIG9yIHJldGVuc2lvbnMuIFRoZSB0YXBlIGlzIHNsb3cgCi0JICogIGFueXdheS4gSXQgaXMgcmVhbGx5IG5vdCBuZWNlc3NhcnkgdG8gZGV0ZWN0IGVycm9yIAotCSAqICBjb25kaXRpb25zIHdpdGggMS8xMCBzZWNvbmRzIGdyYW51bGFyaXR5Ci0JICoKLQkgKiAgT24gbXkgQU1EIDEzM01IWiA0ODY6IDEwMCBtczogMjMlIHN5c3RlbSBsb2FkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAxICBzZWM6ICA1JQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgNSAgc2VjOiAgMC42JSwgeWVhaAotCSAqLwotCWlmICh0aW1lb3V0IDw9IEZUX1NFQ09ORCkgewotCQlwb2xsX2RlbGF5ID0gMTAwICogRlRfTUlMTElTRUNPTkQ7Ci0JCXNpZ25hbF9yZXRyaWVzID0gMjA7IC8qIHR3byBzZWNvbmRzICovCi0JfSBlbHNlIGlmICh0aW1lb3V0IDwgMjAgKiBGVF9TRUNPTkQpIHsKLQkJVFJBQ0UoZnRfdF9mbG93LCAic2V0dGluZyBwb2xsIGRlbGF5IHRvIDEgc2Vjb25kIik7Ci0JCXBvbGxfZGVsYXkgPSBGVF9TRUNPTkQ7Ci0JCXNpZ25hbF9yZXRyaWVzID0gMjsgLyogdHdvIHNlY29uZHMgKi8KLQl9IGVsc2UgewotCQlUUkFDRShmdF90X2Zsb3csICJzZXR0aW5nIHBvbGwgZGVsYXkgdG8gNSBzZWNvbmRzIik7Ci0JCXBvbGxfZGVsYXkgPSA1ICogRlRfU0VDT05EOwotCQlzaWduYWxfcmV0cmllcyA9IDE7IC8qIGZpdmUgc2Vjb25kcyAqLwotCX0KLQlmb3IgKDs7KSB7Ci0JCXQwID0gamlmZmllczsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoc3RhdHVzKSwpOwotCQlpZiAoKnN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpIHsKLQkJCVRSQUNFX0VYSVQgMDsKLQkJfQotCQlpZiAoIXNpZ25hbF9yZXRyaWVzLS0pIHsKLQkJCUZUX1NJR05BTF9FWElUKF9ORVZFUl9CTE9DSyk7Ci0JCX0KLQkJaWYgKChpbnQpdGltZW91dCA+PSAwKSB7Ci0JCQkvKiB0aGlzIHdpbGwgZmFpbCB3aGVuIGppZmZpZXMgd3JhcHMgYXJvdW5kIGFib3V0Ci0JCQkgKiBvbmNlIGV2ZXJ5IHllYXIgOi0pCi0JCQkgKi8KLQkJCXRpbWVvdXQgLT0gKChqaWZmaWVzIC0gdDApICogRlRfU0VDT05EKSAvIEhaOwotCQkJaWYgKHRpbWVvdXQgPD0gMCkgewotCQkJCVRSQUNFX0FCT1JUKC1FVElNRSwgZnRfdF9lcnIsICJ0aW1lb3V0Iik7Ci0JCQl9Ci0JCQlmdGFwZV9zbGVlcChwb2xsX2RlbGF5KTsKLQkJCXRpbWVvdXQgLT0gcG9sbF9kZWxheTsKLQkJfSBlbHNlIHsKLQkJCWZ0YXBlX3NsZWVwKHBvbGxfZGVsYXkpOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQgLUVUSU1FOwotfQotCi0vKiAgICAgIElzc3VlIGNvbW1hbmQgYW5kIHdhaXQgdXAgdG8gdGltZW91dCBtaWxsaSBzZWNvbmRzIGZvciBkcml2ZSByZWFkeQotICovCi1pbnQgZnRhcGVfY29tbWFuZF93YWl0KHFpYzExN19jbWRfdCBjb21tYW5kLCB1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpCi17Ci0JaW50IHJlc3VsdDsKLQotCS8qIERyaXZlIHNob3VsZCBiZSByZWFkeSwgaXNzdWUgY29tbWFuZAotCSAqLwotCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmQoY29tbWFuZCk7Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQodGltZW91dCwgc3RhdHVzKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBmdGFwZV9wYXJhbWV0ZXJfd2FpdCh1bnNpZ25lZCBpbnQgcGFybSwgdW5zaWduZWQgaW50IHRpbWVvdXQsIGludCAqc3RhdHVzKQotewotCWludCByZXN1bHQ7Ci0KLQkvKiBEcml2ZSBzaG91bGQgYmUgcmVhZHksIGlzc3VlIGNvbW1hbmQKLQkgKi8KLQlyZXN1bHQgPSBmdGFwZV9wYXJhbWV0ZXIocGFybSk7Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQodGltZW91dCwgc3RhdHVzKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgICBSZXBvcnQgb3BlcmF0aW9ucwotICovCi0KLS8qIFF1ZXJ5IHRoZSBkcml2ZSBhYm91dCBpdHMgc3RhdHVzLiAgVGhlIGNvbW1hbmQgaXMgc2VudCBhbmQKLSAgIHJlc3VsdF9sZW5ndGggYml0cyBvZiBzdGF0dXMgYXJlIHJldHVybmVkICgyIGV4dHJhIGJpdHMgYXJlIHJlYWQKLSAgIGZvciBzdGFydCBhbmQgc3RvcCkuICovCi0KLWludCBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKGludCAqc3RhdHVzLAotCQkJICAgcWljMTE3X2NtZF90IGNvbW1hbmQsCi0JCQkgICBpbnQgcmVzdWx0X2xlbmd0aCkKLXsKLQlpbnQgaSwgc3QzOwotCXVuc2lnbmVkIGludCB0MDsKLQl1bnNpZ25lZCBpbnQgZHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoY29tbWFuZCksKTsKLQl0MCA9IGZ0YXBlX3RpbWVzdGFtcCgpOwotCWkgPSAwOwotCWRvIHsKLQkJKytpOwotCQlmdGFwZV9zbGVlcCgzICogRlRfTUlMTElTRUNPTkQpOwkvKiBzZWUgcmVtYXJrIGJlbG93ICovCi0JCVRSQUNFX0NBVENIKGZkY19zZW5zZV9kcml2ZV9zdGF0dXMoJnN0MyksKTsKLQkJZHQgPSBmdGFwZV90aW1lZGlmZih0MCwgZnRhcGVfdGltZXN0YW1wKCkpOwotCQkvKiAgQWNrIHNob3VsZCBiZSBhc3NlcnRlZCB3aXRoaW4gVHRpbW91dCArIFRhY2sgPSA2IG1zZWMuCi0JCSAqICBMb29rcyBsaWtlIHNvbWUgZHJpdmVzIGZhaWwgdG8gZG8gdGhpcyBzbyBleHRlbmQgdGhpcwotCQkgKiAgcGVyaW9kIHRvIDMwMCBtc2VjLgotCQkgKi8KLQl9IHdoaWxlICghKHN0MyAmIFNUM19UUkFDS18wKSAmJiBkdCA8IDMwMDAwMCk7Ci0JaWYgKCEoc3QzICYgU1QzX1RSQUNLXzApKSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLAotCQkgICAgICAiTm8gYWNrbm93bGVkZ2UgYWZ0ZXIgJXUgbXNlYy4gKCVpIGl0ZXIpIiwgZHQgLyAxMDAwLCBpKTsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJ0aW1lb3V0IG9uIEFja25vd2xlZGdlIik7Ci0JfQotCS8qICBkdCBtYXkgYmUgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQgYmVjYXVzZSBvZiBvdGhlciB0YXNrcwotCSAqICBzY2hlZHVsZWQgd2hpbGUgd2Ugd2VyZSBzbGVlcGluZy4KLQkgKi8KLQlpZiAoaSA+IDEgJiYgZHQgPiA2MDAwKSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAiQWNrbm93bGVkZ2UgYWZ0ZXIgJXUgbXNlYy4gKCVpIGl0ZXIpIiwKLQkJICAgICAgZHQgLyAxMDAwLCBpKTsKLQl9Ci0JKnN0YXR1cyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHJlc3VsdF9sZW5ndGggKyAxOyBpKyspIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfUkVQT1JUX05FWFRfQklUKSwpOwotCQlUUkFDRV9DQVRDSChmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKCZzdDMpLCk7Ci0JCWlmIChpIDwgcmVzdWx0X2xlbmd0aCkgewotCQkJKnN0YXR1cyB8PSAoKHN0MyAmIFNUM19UUkFDS18wKSA/IDEgOiAwKSA8PCBpOwotCQl9IGVsc2UgaWYgKChzdDMgJiBTVDNfVFJBQ0tfMCkgPT0gMCkgewotCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJtaXNzaW5nIHN0YXR1cyBzdG9wIGJpdCIpOwotCQl9Ci0JfQotCS8qIHRoaXMgY29tbWFuZCB3aWxsIHB1dCB0cmFjayB6ZXJvIGFuZCBpbmRleCBiYWNrIGludG8gbm9ybWFsIHN0YXRlICovCi0JKHZvaWQpZnRhcGVfY29tbWFuZChRSUNfUkVQT1JUX05FWFRfQklUKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qIFJlcG9ydCB0aGUgY3VycmVudCBkcml2ZSBzdGF0dXMuICovCi0KLWludCBmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cykKLXsKLQlpbnQgcmVzdWx0OwotCWludCBjb3VudCA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWRvIHsKLQkJcmVzdWx0ID0gZnRhcGVfcmVwb3J0X29wZXJhdGlvbihzdGF0dXMsCi0JCQkJCQlRSUNfUkVQT1JUX0RSSVZFX1NUQVRVUywgOCk7Ci0JfSB3aGlsZSAocmVzdWx0IDwgMCAmJiArK2NvdW50IDw9IDMpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJyZXBvcnRfb3BlcmF0aW9uIGZhaWxlZCBhZnRlciAlZCB0cmlhbHMiLCBjb3VudCk7Ci0JfQotCWlmICgoKnN0YXR1cyAmIDB4ZmYpID09IDB4ZmYpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkgICAgImltcG9zc2libGUgZHJpdmUgc3RhdHVzIDB4ZmYiKTsKLQl9Ci0JaWYgKCpzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7Ci0JCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IFFJQ19OT19DT01NQU5EOyAvKiBjb21wbGV0ZWQgKi8KLQl9Ci0JZnRfbGFzdF9zdGF0dXMuc3RhdHVzLmRyaXZlX3N0YXR1cyA9IChfX3U4KSgqc3RhdHVzICYgMHhmZik7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1pbnQgZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cykKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoc3RhdHVzKSwpOwotCWlmICgqc3RhdHVzICYgUUlDX1NUQVRVU19ORVdfQ0FSVFJJREdFIHx8Ci0JICAgICEoKnN0YXR1cyAmIFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQpKSB7Ci0JCWZ0X2ZhaWx1cmUgPSAxOwkvKiB3aWxsIGluaGliaXQgZnVydGhlciBvcGVyYXRpb25zICovCi0JCVRSQUNFX0VYSVQgLUVJTzsKLQl9Ci0JaWYgKCpzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZICYmICpzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSB7Ci0JCS8qICBMZXQgY2FsbGVyIGhhbmRsZSBhbGwgZXJyb3JzICovCi0JCVRSQUNFX0FCT1JUKDEsIGZ0X3Rfd2FybiwgIndhcm5pbmc6IGVycm9yIHN0YXR1cyBzZXQhIik7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotaW50IGZ0YXBlX3JlcG9ydF9lcnJvcih1bnNpZ25lZCBpbnQgKmVycm9yLAotCQkgICAgICAgcWljMTE3X2NtZF90ICpjb21tYW5kLCBpbnQgcmVwb3J0KQotewotCXN0YXRpYyBjb25zdCBmdGFwZV9lcnJvciBmdGFwZV9lcnJvcnNbXSA9IFFJQzExN19FUlJPUlM7Ci0JaW50IGNvZGU7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJmNvZGUsIFFJQ19SRVBPUlRfRVJST1JfQ09ERSwgMTYpLCk7Ci0JKmVycm9yICAgPSAodW5zaWduZWQgaW50KShjb2RlICYgMHhmZik7Ci0JKmNvbW1hbmQgPSAocWljMTE3X2NtZF90KSgoY29kZT4+OCkmMHhmZik7Ci0JLyogIHJlbWVtYmVyIGhhcmR3YXJlIHN0YXR1cywgbWF5YmUgdXNlZnVsIGZvciBzdGF0dXMgaW9jdGxzCi0JICovCi0JZnRfbGFzdF9lcnJvci5lcnJvci5jb21tYW5kID0gKF9fdTgpKmNvbW1hbmQ7Ci0JZnRfbGFzdF9lcnJvci5lcnJvci5lcnJvciAgID0gKF9fdTgpKmVycm9yOwotCWlmICghcmVwb3J0KSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JaWYgKCplcnJvciA9PSAwKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3RfaW5mbywgIk5vIGVycm9yIik7Ci0JfQotCVRSQUNFKGZ0X3RfaW5mbywgImVycm9yY29kZTogJWQiLCAqZXJyb3IpOwotCWlmICgqZXJyb3IgPCBOUl9JVEVNUyhmdGFwZV9lcnJvcnMpKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICIlc0ZhdGFsIEVSUk9SOiIsCi0JCSAgICAgIChmdGFwZV9lcnJvcnNbKmVycm9yXS5mYXRhbCA/ICIiIDogIk5vbi0iKSk7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICIlcyAuLi4iLCBmdGFwZV9lcnJvcnNbKmVycm9yXS5tZXNzYWdlKTsKLQl9IGVsc2UgewotCQlUUkFDRShmdF90X25vaXNlLCAiVW5rbm93biBFUlJPUiAhIik7Ci0JfQotCWlmICgodW5zaWduZWQgaW50KSpjb21tYW5kIDwgTlJfSVRFTVMocWljMTE3X2NtZHMpICYmCi0JICAgIHFpYzExN19jbWRzWypjb21tYW5kXS5uYW1lICE9IE5VTEwpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIi4uLiBjYXVzZWQgYnkgY29tbWFuZCBcJyVzXCciLAotCQkgICAgICBxaWMxMTdfY21kc1sqY29tbWFuZF0ubmFtZSk7Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIi4uLiBjYXVzZWQgYnkgdW5rbm93biBjb21tYW5kICVkIiwKLQkJICAgICAgKmNvbW1hbmQpOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWludCBmdGFwZV9yZXBvcnRfY29uZmlndXJhdGlvbihxaWNfbW9kZWwgKm1vZGVsLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqcmF0ZSwKLQkJCSAgICAgICBpbnQgKnFpY19zdGQsCi0JCQkgICAgICAgaW50ICp0YXBlX2xlbikKLXsKLQlpbnQgcmVzdWx0OwotCWludCBjb25maWc7Ci0JaW50IHN0YXR1czsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFpY19yYXRlc1sgNF0gPSB7IDI1MCwgMjAwMCwgNTAwLCAxMDAwIH07Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJmNvbmZpZywKLQkJCQkJUUlDX1JFUE9SVF9EUklWRV9DT05GSUdVUkFUSU9OLCA4KTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMuZHJpdmVfY29uZmlnID0gKF9fdTgpMHgwMDsKLQkJKm1vZGVsID0gcHJlaGlzdG9yaWM7Ci0JCSpyYXRlID0gNTAwOwotCQkqcWljX3N0ZCA9IFFJQ19UQVBFX1FJQzQwOwotCQkqdGFwZV9sZW4gPSAyMDU7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9IGVsc2UgewotCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMuZHJpdmVfY29uZmlnID0gKF9fdTgpKGNvbmZpZyAmIDB4ZmYpOwotCX0KLQkqcmF0ZSA9IHFpY19yYXRlc1soY29uZmlnICYgUUlDX0NPTkZJR19SQVRFX01BU0spID4+IFFJQ19DT05GSUdfUkFURV9TSElGVF07Ci0JcmVzdWx0ID0gZnRhcGVfcmVwb3J0X29wZXJhdGlvbigmc3RhdHVzLCBRSUNfUkVQT1JUX1RBUEVfU1RBVFVTLCA4KTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMudGFwZV9zdGF0dXMgPSAoX191OCkweDAwOwotCQkvKiBwcmUtIFFJQzExNyByZXYgQyBzcGVjLiBkcml2ZSwgUUlDX0NPTkZJR184MCBiaXQgaXMgdmFsaWQuCi0JCSAqLwotCQkqcWljX3N0ZCA9IChjb25maWcgJiBRSUNfQ09ORklHXzgwKSA/Ci0JCQlRSUNfVEFQRV9RSUM4MCA6IFFJQ19UQVBFX1FJQzQwOwotCQkvKiA/PyBob3cncyBhYm91dCA0MjVmdCB0YXBlcz8gKi8KLQkJKnRhcGVfbGVuID0gKGNvbmZpZyAmIFFJQ19DT05GSUdfTE9ORykgPyAzMDcgOiAwOwotCQkqbW9kZWwgPSBwcmVfcWljMTE3YzsKLQkJcmVzdWx0ID0gMDsKLQl9IGVsc2UgewotCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMudGFwZV9zdGF0dXMgPSAoX191OCkoc3RhdHVzICYgMHhmZik7Ci0JCSptb2RlbCA9IHBvc3RfcWljMTE3YjsKLQkJVFJBQ0UoZnRfdF9hbnksICJyZXBvcnQgdGFwZSBzdGF0dXMgcmVzdWx0ID0gJTAyeCIsIHN0YXR1cyk7Ci0JCS8qIHBvc3QtIFFJQzExNyByZXYgQyBzcGVjLiBkcml2ZSwgUUlDX0NPTkZJR184MCBiaXQgaXMKLQkJICogaW52YWxpZC4gCi0JCSAqLwotCQlzd2l0Y2ggKHN0YXR1cyAmIFFJQ19UQVBFX1NURF9NQVNLKSB7Ci0JCWNhc2UgUUlDX1RBUEVfUUlDNDA6Ci0JCWNhc2UgUUlDX1RBUEVfUUlDODA6Ci0JCWNhc2UgUUlDX1RBUEVfUUlDMzAyMDoKLQkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgotCQkJKnFpY19zdGQgPSBzdGF0dXMgJiBRSUNfVEFQRV9TVERfTUFTSzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJKnFpY19zdGQgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JCXN3aXRjaCAoc3RhdHVzICYgUUlDX1RBUEVfTEVOX01BU0spIHsKLQkJY2FzZSBRSUNfVEFQRV8yMDVGVDoKLQkJCS8qIDIwNSBvciA0MjUrIGZ0IDU1MCBPZSB0YXBlICovCi0JCQkqdGFwZV9sZW4gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUlDX1RBUEVfMzA3RlQ6Ci0JCQkvKiAzMDcuNSBmdCA1NTAgT2UgRXh0ZW5kZWQgTGVuZ3RoIChYTCkgdGFwZSAqLwotCQkJKnRhcGVfbGVuID0gMzA3OwotCQkJYnJlYWs7Ci0JCWNhc2UgUUlDX1RBUEVfVkFSSUFCTEU6Ci0JCQkvKiBWYXJpYWJsZSBsZW5ndGggNTUwIE9lIHRhcGUgKi8KLQkJCSp0YXBlX2xlbiA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBRSUNfVEFQRV8xMTAwRlQ6Ci0JCQkvKiAxMTAwIGZ0IDU1MCBPZSB0YXBlICovCi0JCQkqdGFwZV9sZW4gPSAxMTAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUlDX1RBUEVfRkxFWDoKLQkJCS8qIFZhcmlhYmxlIGxlbmd0aCA5MDAgT2UgdGFwZSAqLwotCQkJKnRhcGVfbGVuID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJKnRhcGVfbGVuID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoKnFpY19zdGQgPT0gLTEgfHwgKnRhcGVfbGVuID09IC0xKSB7Ci0JCQlUUkFDRShmdF90X2FueSwKLQkJCSAgICAgICJwb3N0IHFpYy0xMTdiIHNwZWMgZHJpdmUgd2l0aCB1bmtub3duIHRhcGUiKTsKLQkJfQotCQlyZXN1bHQgPSAqdGFwZV9sZW4gPT0gLTEgPyAtRUlPIDogMDsKLQkJaWYgKHN0YXR1cyAmIFFJQ19UQVBFX1dJREUpIHsKLQkJCXN3aXRjaCAoKnFpY19zdGQpIHsKLQkJCWNhc2UgUUlDX1RBUEVfUUlDODA6Ci0JCQkJVFJBQ0UoZnRfdF9pbmZvLCAiVFItMSB0YXBlIGRldGVjdGVkIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFJQ19UQVBFX1FJQzMwMTA6Ci0JCQkJVFJBQ0UoZnRfdF9pbmZvLCAiVFItMiB0YXBlIGRldGVjdGVkIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6Ci0JCQkJVFJBQ0UoZnRfdF9pbmZvLCAiVFItMyB0YXBlIGRldGVjdGVkIik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVRSQUNFKGZ0X3Rfd2FybiwKLQkJCQkgICAgICAiVW5rbm93biBUcmF2YW4gdGFwZSB0eXBlIGRldGVjdGVkIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVCAocmVzdWx0IDwgMCkgPyAtRUlPIDogMDsKLX0KLQotc3RhdGljIGludCBmdGFwZV9yZXBvcnRfcm9tX3ZlcnNpb24oaW50ICp2ZXJzaW9uKQotewotCi0JaWYgKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24odmVyc2lvbiwgUUlDX1JFUE9SVF9ST01fVkVSU0lPTiwgOCkgPCAwKSB7Ci0JCXJldHVybiAtRUlPOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotdm9pZCBmdGFwZV9yZXBvcnRfdmVuZG9yX2lkKHVuc2lnbmVkIGludCAqaWQpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JLyogV2UnbGwgdHJ5IHRvIGdldCBhIHZlbmRvciBpZCBmcm9tIHRoZSBkcml2ZS4gIEZpcnN0Ci0JICogYWNjb3JkaW5nIHRvIHRoZSBRSUMtMTE3IHNwZWMsIGEgMTYtYml0IGlkIGlzIHJlcXVlc3RlZC4KLQkgKiBJZiB0aGF0IGZhaWxzIHdlJ2xsIHRyeSBhbiA4LWJpdCB2ZXJzaW9uLCBvdGhlcndpc2Ugd2UnbGwKLQkgKiB0cnkgYW4gdW5kb2N1bWVudGVkIHF1ZXJ5LgotCSAqLwotCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oKGludCAqKSBpZCwgUUlDX1JFUE9SVF9WRU5ET1JfSUQsIDE2KTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKChpbnQgKikgaWQsCi0JCQkJCQlRSUNfUkVQT1JUX1ZFTkRPUl9JRCwgOCk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkvKiBUaGUgZm9sbG93aW5nIGlzIGFuIHVuZG9jdW1lbnRlZCBjYWxsIGZvdW5kCi0JCQkgKiBpbiB0aGUgQ01TIGNvZGUuCi0JCQkgKi8KLQkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oKGludCAqKSBpZCwgMjQsIDgpOwotCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQkqaWQgPSBVTktOT1dOX1ZFTkRPUjsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCBvbGQgOCBiaXQgaWQ6ICUwNHgiLAotCQkJCSAgICAgICppZCk7Ci0JCQkJKmlkIHw9IDB4MjAwMDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAiZ290IDggYml0IGlkOiAlMDR4IiwgKmlkKTsKLQkJCSppZCB8PSAweDEwMDAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCAxNiBiaXQgaWQ6ICUwNHgiLCAqaWQpOwotCX0KLQlpZiAoKmlkID09IDB4MDA0NykgewotCQlpbnQgdmVyc2lvbjsKLQkJaW50IHNpZ247Ci0KLQkJaWYgKGZ0YXBlX3JlcG9ydF9yb21fdmVyc2lvbigmdmVyc2lvbikgPCAwKSB7Ci0JCQlUUkFDRShmdF90X2J1ZywgInJlcG9ydCByb20gdmVyc2lvbiBmYWlsZWQiKTsKLQkJCVRSQUNFX0VYSVQ7Ci0JCX0KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkNNUyByb20gdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKLQkJZnRhcGVfY29tbWFuZChRSUNfRU5URVJfRElBR05PU1RJQ18xKTsKLQkJZnRhcGVfY29tbWFuZChRSUNfRU5URVJfRElBR05PU1RJQ18xKTsKLQkJZGlhZ25vc3RpY19tb2RlID0gMTsKLQkJaWYgKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJnNpZ24sIDksIDgpIDwgMCkgewotCQkJdW5zaWduZWQgaW50IGVycm9yOwotCQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7Ci0KLQkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKLQkJCWZ0YXBlX2NvbW1hbmQoUUlDX0VOVEVSX1BSSU1BUllfTU9ERSk7Ci0JCQlkaWFnbm9zdGljX21vZGUgPSAwOwotCQkJVFJBQ0VfRVhJVDsJLyogZmFpbHVyZSAhICovCi0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAiQ01TIHNpZ25hdHVyZTogJTAyeCIsIHNpZ24pOwotCQl9Ci0JCWlmIChzaWduID09IDB4YTUpIHsKLQkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJnNpZ24sIDM3LCA4KTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJaWYgKHZlcnNpb24gPj0gNjMpIHsKLQkJCQkJKmlkID0gMHg4ODgwOwotCQkJCQlUUkFDRShmdF90X25vaXNlLAotCQkJCQkgICAgICAiVGhpcyBpcyBhbiBJb21lZ2EgZHJpdmUgISIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCSppZCA9IDB4MDA0NzsKLQkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJCQkJICAgICAgIlRoaXMgaXMgYSByZWFsIENNUyBkcml2ZSAhIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkqaWQgPSAweDAwNDc7Ci0JCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkNNUyBzdGF0dXM6ICVkIiwgc2lnbik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkqaWQgPSBVTktOT1dOX1ZFTkRPUjsKLQkJfQotCQlmdGFwZV9jb21tYW5kKFFJQ19FTlRFUl9QUklNQVJZX01PREUpOwotCQlkaWFnbm9zdGljX21vZGUgPSAwOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgaW50IHFpY19yYXRlX2NvZGUodW5zaWduZWQgaW50IHJhdGUpCi17Ci0Jc3dpdGNoIChyYXRlKSB7Ci0JY2FzZSAyNTA6Ci0JCXJldHVybiBRSUNfQ09ORklHX1JBVEVfMjUwOwotCWNhc2UgNTAwOgotCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzUwMDsKLQljYXNlIDEwMDA6Ci0JCXJldHVybiBRSUNfQ09ORklHX1JBVEVfMTAwMDsKLQljYXNlIDIwMDA6Ci0JCXJldHVybiBRSUNfQ09ORklHX1JBVEVfMjAwMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzUwMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZnRhcGVfc2V0X3JhdGVfdGVzdCh1bnNpZ25lZCBpbnQgKm1heF9yYXRlKQotewotCXVuc2lnbmVkIGludCBlcnJvcjsKLQlxaWMxMTdfY21kX3QgY29tbWFuZDsKLQlpbnQgc3RhdHVzOwotCWludCBzdXBwb3J0ZWQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiAgQ2hlY2sgaWYgdGhlIGRyaXZlIGRvZXMgc3VwcG9ydCB0aGUgc2VsZWN0IHJhdGUgY29tbWFuZAotCSAqICBieSB0ZXN0aW5nIGFsbCBkaWZmZXJlbnQgc2V0dGluZ3MuIElmIGFueSBvbmUgaXMgYWNjZXB0ZWQKLQkgKiAgd2UgYXNzdW1lIHRoZSBjb21tYW5kIGlzIHN1cHBvcnRlZCwgZWxzZSBub3QuCi0JICovCi0JZm9yICgqbWF4X3JhdGUgPSAyMDAwOyAqbWF4X3JhdGUgPj0gMjUwOyAqbWF4X3JhdGUgLz0gMikgewotCQlpZiAoZnRhcGVfY29tbWFuZChRSUNfU0VMRUNUX1JBVEUpIDwgMCkgewotCQkJY29udGludWU7Ci0JCX0JCQotCQlpZiAoZnRhcGVfcGFyYW1ldGVyX3dhaXQocWljX3JhdGVfY29kZSgqbWF4X3JhdGUpLAotCQkJCQkgMSAqIEZUX1NFQ09ORCwgJnN0YXR1cykgPCAwKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgewotCQkJZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJc3VwcG9ydGVkID0gMTsgLyogZGlkIGFjY2VwdCBhIHJlcXVlc3QgKi8KLQkJYnJlYWs7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJTZWxlY3QgUmF0ZSBjb21tYW5kIGlzJXMgc3VwcG9ydGVkIiwgCi0JICAgICAgc3VwcG9ydGVkID8gIiIgOiAiIG5vdCIpOwotCVRSQUNFX0VYSVQgc3VwcG9ydGVkOwotfQotCi1pbnQgZnRhcGVfc2V0X2RhdGFfcmF0ZSh1bnNpZ25lZCBpbnQgbmV3X3JhdGUgLyogS2JwcyAqLywgdW5zaWduZWQgaW50IHFpY19zdGQpCi17Ci0JaW50IHN0YXR1czsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZGF0YV9yYXRlID0gbmV3X3JhdGU7Ci0Jc3RhdGljIGludCBzdXBwb3J0ZWQ7Ci0JaW50IHJhdGVfY2hhbmdlZCA9IDA7Ci0JcWljX21vZGVsIGR1bW15X21vZGVsOwotCXVuc2lnbmVkIGludCBkdW1teV9xaWNfc3RkLCBkdW1teV90YXBlX2xlbjsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKGZ0X2RyaXZlX21heF9yYXRlID09IDApIHsgLyogZmlyc3QgdGltZSAqLwotCQlzdXBwb3J0ZWQgPSBmdGFwZV9zZXRfcmF0ZV90ZXN0KCZmdF9kcml2ZV9tYXhfcmF0ZSk7Ci0JfQotCWlmIChzdXBwb3J0ZWQpIHsKLQkJZnRhcGVfY29tbWFuZChRSUNfU0VMRUNUX1JBVEUpOwotCQlyZXN1bHQgPSBmdGFwZV9wYXJhbWV0ZXJfd2FpdChxaWNfcmF0ZV9jb2RlKG5ld19yYXRlKSwKLQkJCQkJICAgICAgMSAqIEZUX1NFQ09ORCwgJnN0YXR1cyk7Ci0JCWlmIChyZXN1bHQgPj0gMCAmJiAhKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpKSB7Ci0JCQlyYXRlX2NoYW5nZWQgPSAxOwotCQl9Ci0JfQotCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9jb25maWd1cmF0aW9uKCZkdW1teV9tb2RlbCwKLQkJCQkJCQkmZGF0YV9yYXRlLCAKLQkJCQkJCQkmZHVtbXlfcWljX3N0ZCwKLQkJCQkJCQkmZHVtbXlfdGFwZV9sZW4pLCk7Ci0JaWYgKGRhdGFfcmF0ZSAhPSBuZXdfcmF0ZSkgewotCQlpZiAoIXN1cHBvcnRlZCkgewotCQkJVFJBQ0UoZnRfdF93YXJuLCAiUmF0ZSBjaGFuZ2Ugbm90IHN1cHBvcnRlZCEiKTsKLQkJfSBlbHNlIGlmIChyYXRlX2NoYW5nZWQpIHsKLQkJCVRSQUNFKGZ0X3Rfd2FybiwgIlJlcXVlc3RlZDogJWQsIGdvdCAlZCIsCi0JCQkgICAgICBuZXdfcmF0ZSwgZGF0YV9yYXRlKTsKLQkJfSBlbHNlIHsKLQkJCVRSQUNFKGZ0X3Rfd2FybiwgIlJhdGUgY2hhbmdlIGZhaWxlZCEiKTsKLQkJfQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0KLQkvKgotCSAqICBTZXQgZGF0YSByYXRlIGFuZCB3cml0ZSBwcmVjb21wZW5zYXRpb24gYXMgc3BlY2lmaWVkOgotCSAqCi0JICogICAgICAgICAgICB8ICBRSUMtNDAvODAgIHwgUUlDLTMwMTAvMzAyMAotCSAqICAgcmF0ZSAgICAgfCAgIHByZWNvbXAgICB8ICAgIHByZWNvbXAKLQkgKiAgLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tCi0JICogIDI1MCBLYnBzLiB8ICAgMjUwIG5zLiAgIHwgICAgIDAgbnMuCi0JICogIDUwMCBLYnBzLiB8ICAgMTI1IG5zLiAgIHwgICAgIDAgbnMuCi0JICogICAgMSBNYnBzLiB8ICAgIDQyIG5zLiAgIHwgICAgIDAgbnMuCi0JICogICAgMiBNYnBzICB8ICAgICAgTi9BICAgIHwgICAgIDAgbnMuCi0JICovCi0JaWYgKChxaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwICYmIGRhdGFfcmF0ZSA+IDUwMCkgfHwgCi0JICAgIChxaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwICYmIGRhdGFfcmF0ZSA+IDEwMDApKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsCi0JCQkgICAgZnRfdF93YXJuLCAiRGF0YXJhdGUgdG9vIGhpZ2ggZm9yIFFJQy1tb2RlIik7Ci0JfQotCVRSQUNFX0NBVENIKGZkY19zZXRfZGF0YV9yYXRlKGRhdGFfcmF0ZSksX3JlcyA9IC1FSU5WQUwpOwotCWZ0X2RhdGFfcmF0ZSA9IGRhdGFfcmF0ZTsKLQlpZiAocWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCB8fCBxaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSB7Ci0JCXN3aXRjaCAoZGF0YV9yYXRlKSB7Ci0JCWNhc2UgMjUwOgotCQkJZmRjX3NldF93cml0ZV9wcmVjb21wKDI1MCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJY2FzZSA1MDA6Ci0JCQlmZGNfc2V0X3dyaXRlX3ByZWNvbXAoMTI1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEwMDA6Ci0JCQlmZGNfc2V0X3dyaXRlX3ByZWNvbXAoNDIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlmZGNfc2V0X3dyaXRlX3ByZWNvbXAoMCk7Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiAgVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb3BlIHdpdGggZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzCi0gKi8KLWludCBmdGFwZV9pbmNyZWFzZV90aHJlc2hvbGQodm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChmZGMudHlwZSA8IGk4MjA3NyB8fCBmdF9mZGNfdGhyZXNob2xkID49IDEyKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiY2Fubm90IGluY3JlYXNlIGZpZm8gdGhyZXNob2xkIik7Ci0JfQotCWlmIChmZGNfZmlmb190aHJlc2hvbGQoKytmdF9mZGNfdGhyZXNob2xkLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApIHsKLQkJVFJBQ0UoZnRfdF9lcnIsICJjYW5ub3QgaW5jcmVhc2UgZmlmbyB0aHJlc2hvbGQiKTsKLQkJZnRfZmRjX3RocmVzaG9sZCAtLTsKLQkJZmRjX3Jlc2V0KCk7Ci0JfQotCVRSQUNFKGZ0X3RfaW5mbywgIk5ldyBGSUZPIHRocmVzaG9sZDogJWQiLCBmdF9mZGNfdGhyZXNob2xkKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWludCBmdGFwZV9oYWxmX2RhdGFfcmF0ZSh2b2lkKQotewotCWlmIChmdF9kYXRhX3JhdGUgPCA1MDApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZnRhcGVfc2V0X2RhdGFfcmF0ZShmdF9kYXRhX3JhdGUgLyAyLCBmdF9xaWNfc3RkKSA8IDApIHsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWZ0YXBlX2NhbGNfdGltZW91dHMoZnRfcWljX3N0ZCwgZnRfZGF0YV9yYXRlLCBmdGFwZV90YXBlX2xlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qICAgICAgU2VlayB0aGUgaGVhZCB0byB0aGUgc3BlY2lmaWVkIHRyYWNrLgotICovCi1pbnQgZnRhcGVfc2Vla19oZWFkX3RvX3RyYWNrKHVuc2lnbmVkIGludCB0cmFjaykKLXsKLQlpbnQgc3RhdHVzOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlmdF9sb2NhdGlvbi50cmFjayA9IC0xOyAvKiByZW1haW5zIHNldCBpbiBjYXNlIG9mIGVycm9yICovCi0JaWYgKHRyYWNrID49IGZ0X3RyYWNrc19wZXJfdGFwZSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2J1ZywgInRyYWNrIG91dCBvZiBib3VuZHMiKTsKLQl9Ci0JVFJBQ0UoZnRfdF9mbG93LCAic2Vla2luZyB0cmFjayAlZCIsIHRyYWNrKTsKLQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19TRUVLX0hFQURfVE9fVFJBQ0spLCk7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfcGFyYW1ldGVyX3dhaXQodHJhY2ssIGZ0YXBlX3RpbWVvdXQuaGVhZF9zZWVrLAotCQkJCQkgJnN0YXR1cyksKTsKLQlmdF9sb2NhdGlvbi50cmFjayA9IHRyYWNrOwotCWZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayA9IDA7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1pbnQgZnRhcGVfd2FrZXVwX2RyaXZlKHdha2VfdXBfdHlwZXMgbWV0aG9kKQotewotCWludCBzdGF0dXM7Ci0JaW50IG1vdG9yX29uID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0Jc3dpdGNoIChtZXRob2QpIHsKLQljYXNlIHdha2VfdXBfY29sb3JhZG86Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1BIQU5UT01fU0VMRUNUKSwpOwotCQlUUkFDRV9DQVRDSChmdGFwZV9wYXJhbWV0ZXIoMCAvKiBmdF9kcml2ZV9zZWwgPz8gKi8pLCk7Ci0JCWJyZWFrOwotCWNhc2Ugd2FrZV91cF9tb3VudGFpbjoKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfU09GVF9TRUxFQ1QpLCk7Ci0JCWZ0YXBlX3NsZWVwKEZUX01JTExJU0VDT05EKTsJLyogTkVFREVEICovCi0JCVRSQUNFX0NBVENIKGZ0YXBlX3BhcmFtZXRlcigxOCksKTsKLQkJYnJlYWs7Ci0JY2FzZSB3YWtlX3VwX2luc2lnaHQ6Ci0JCWZ0YXBlX3NsZWVwKDEwMCAqIEZUX01JTExJU0VDT05EKTsKLQkJbW90b3Jfb24gPSAxOwotCQlmZGNfbW90b3IobW90b3Jfb24pOwkvKiBlbmFibGUgaXMgZG9uZSBieSBtb3Rvci1vbiAqLwotCWNhc2Ugbm9fd2FrZV91cDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJVFJBQ0VfRVhJVCAtRU5PREVWOwkvKiB1bmtub3duIHdha2V1cCBtZXRob2QgKi8KLQkJYnJlYWs7Ci0JfQotCS8qICBJZiB3YWtldXAgc3VjY2VlZGVkIHdlIHNob3VsZG4ndCBnZXQgYW4gZXJyb3IgaGVyZS4uCi0JICovCi0JVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoJnN0YXR1cyksCi0JCSAgICBpZiAobW90b3Jfb24pIHsKLQkJCSAgICBmZGNfbW90b3IoMCk7Ci0JCSAgICB9KTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWludCBmdGFwZV9wdXRfZHJpdmVfdG9fc2xlZXAod2FrZV91cF90eXBlcyBtZXRob2QpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCXN3aXRjaCAobWV0aG9kKSB7Ci0JY2FzZSB3YWtlX3VwX2NvbG9yYWRvOgotCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19QSEFOVE9NX0RFU0VMRUNUKSwpOwotCQlicmVhazsKLQljYXNlIHdha2VfdXBfbW91bnRhaW46Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1NPRlRfREVTRUxFQ1QpLCk7Ci0JCWJyZWFrOwotCWNhc2Ugd2FrZV91cF9pbnNpZ2h0OgotCQlmZGNfbW90b3IoMCk7CS8qIGVuYWJsZSBpcyBkb25lIGJ5IG1vdG9yLW9uICovCi0JY2FzZSBub193YWtlX3VwOgkvKiBubyB3YWtldXAgLyBubyBzbGVlcCAhICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVRSQUNFX0VYSVQgLUVOT0RFVjsJLyogdW5rbm93biB3YWtldXAgbWV0aG9kICovCi0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotaW50IGZ0YXBlX3Jlc2V0X2RyaXZlKHZvaWQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgZXJyX2NvZGU7Ci0JcWljMTE3X2NtZF90IGVycl9jb21tYW5kOwotCWludCBpOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQkvKiAgV2Ugd2FudCB0byByZS1lc3RhYmxpc2ggY29udGFjdCB3aXRoIG91ciBkcml2ZS4gIEZpcmUgYQotCSAqICBudW1iZXIgb2YgcmVzZXQgY29tbWFuZHMgKHNpbmdsZSBzdGVwIHB1bHNlcykgYW5kIHByYXkgZm9yCi0JICogIHN1Y2Nlc3MuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewotCQlUUkFDRShmdF90X2Zsb3csICJSZXNldHRpbmcgZmRjIik7Ci0JCWZkY19yZXNldCgpOwotCQlmdGFwZV9zbGVlcCgxMCAqIEZUX01JTExJU0VDT05EKTsKLQkJVFJBQ0UoZnRfdF9mbG93LCAiUmVzZXQgY29tbWFuZCB0byBkcml2ZSIpOwotCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kKFFJQ19SRVNFVCk7Ci0JCWlmIChyZXN1bHQgPT0gMCkgewotCQkJZnRhcGVfc2xlZXAoMSAqIEZUX1NFQ09ORCk7IC8qICBkcml2ZSBub3QKLQkJCQkJCSAgICAgKiAgYWNjZXNzaWJsZQotCQkJCQkJICAgICAqICBkdXJpbmcgMSBzZWNvbmQKLQkJCQkJCSAgICAgKi8KLQkJCVRSQUNFKGZ0X3RfZmxvdywgIlJlLXNlbGVjdGluZyBkcml2ZSIpOwotCi0JCQkvKiBTdHJhbmdlLCB0aGUgUUlDLTExNyBzcGVjcyBkb24ndCBtZW50aW9uCi0JCQkgKiB0aGlzIGJ1dCB0aGUgZHJpdmUgZ2V0cyBkZXNlbGVjdGVkIGFmdGVyIGEKLQkJCSAqIHNvZnQgcmVzZXQgISAgU28gd2UgbmVlZCB0byBlbmFibGUgaXQKLQkJCSAqIGFnYWluLgotCQkJICovCi0JCQlpZiAoZnRhcGVfd2FrZXVwX2RyaXZlKGZ0X2RyaXZlX3R5cGUud2FrZV91cCkgPCAwKSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsICJXYWtldXAgZmFpbGVkICEiKTsKLQkJCX0KLQkJCVRSQUNFKGZ0X3RfZmxvdywgIldhaXRpbmcgdW50aWwgZHJpdmUgZ2V0cyByZWFkeSIpOwotCQkJcmVzdWx0PSBmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucmVzZXQsICZzdGF0dXMpOwotCQkJaWYgKHJlc3VsdCA9PSAwICYmIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSkgewotCQkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyX2NvZGUsCi0JCQkJCQkJICAgICZlcnJfY29tbWFuZCwgMSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwICYmIGVycl9jb2RlID09IDI3KSB7Ci0JCQkJCS8qICBPa2F5LCBkcml2ZSBzYXcgcmVzZXQKLQkJCQkJICogIGNvbW1hbmQgYW5kIHJlc3BvbmRlZCBhcyBpdAotCQkJCQkgKiAgc2hvdWxkCi0JCQkJCSAqLwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSAtRUlPOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gLUVJTzsKLQkJCX0KLQkJfQotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JfQotCWlmIChyZXN1bHQgIT0gMCkgewotCQlUUkFDRShmdF90X2VyciwgIkdlbmVyYWwgZmFpbHVyZSB0byByZXNldCB0YXBlIGRyaXZlIik7Ci0JfSBlbHNlIHsKLQkJLyogIFJlc3RvcmUgY29ycmVjdCBzZXR0aW5nczoga2VlcCBvcmlnaW5hbCByYXRlIAotCQkgKi8KLQkJZnRhcGVfc2V0X2RhdGFfcmF0ZShmdF9kYXRhX3JhdGUsIGZ0X3FpY19zdGQpOwotCX0KLQlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE3YmFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pby5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfSU9fSAotI2RlZmluZSBfRlRBUEVfSU9fSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAoQykgMTk5NyAgICAgIENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjE4ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIGdsdWUgcGFydCBvZiB0aGUKLSAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLXZlbmRvcnMuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCBzZWVrOwotCXVuc2lnbmVkIGludCByZXNldDsKLQl1bnNpZ25lZCBpbnQgcmV3aW5kOwotCXVuc2lnbmVkIGludCBoZWFkX3NlZWs7Ci0JdW5zaWduZWQgaW50IHN0b3A7Ci0JdW5zaWduZWQgaW50IHBhdXNlOwotfSBmdF90aW1lb3V0X3RhYmxlOwotCi10eXBlZGVmIGVudW0gewotCXByZWhpc3RvcmljLCBwcmVfcWljMTE3YywgcG9zdF9xaWMxMTdiLCBwb3N0X3FpYzExN2QgCi19IHFpY19tb2RlbDsKLQotLyoKLSAqICAgICAgZnRhcGUtaW8uYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgotICovCi1leHRlcm4gZnRfdGltZW91dF90YWJsZSBmdGFwZV90aW1lb3V0OwotZXh0ZXJuIHVuc2lnbmVkIGludCBmdGFwZV90YXBlX2xlbjsKLWV4dGVybiB2b2xhdGlsZSBxaWMxMTdfY21kX3QgZnRhcGVfY3VycmVudF9jb21tYW5kOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBxaWMxMTdfY29tbWFuZF90YWJsZSBxaWMxMTdfY21kc1tdOwotZXh0ZXJuIGludCBmdGFwZV9taWdodF9iZV9vZmZfdHJhY2s7Ci0KLS8qCi0gKiAgICAgIGZ0YXBlLWlvLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgotICovCi1leHRlcm4gdm9pZCBmdGFwZV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKTsKLWV4dGVybiB2b2lkICBmdGFwZV91ZGVsYXlfY2FsaWJyYXRlKHZvaWQpOwotZXh0ZXJuIHZvaWQgZnRhcGVfc2xlZXAodW5zaWduZWQgaW50IHRpbWUpOwotZXh0ZXJuIHZvaWQgZnRhcGVfcmVwb3J0X3ZlbmRvcl9pZCh1bnNpZ25lZCBpbnQgKmlkKTsKLWV4dGVybiBpbnQgIGZ0YXBlX2NvbW1hbmQocWljMTE3X2NtZF90IGNvbW1hbmQpOwotZXh0ZXJuIGludCAgZnRhcGVfY29tbWFuZF93YWl0KHFpYzExN19jbWRfdCBjb21tYW5kLAotCQkJICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0LAotCQkJICAgICAgIGludCAqc3RhdHVzKTsKLWV4dGVybiBpbnQgIGZ0YXBlX3BhcmFtZXRlcih1bnNpZ25lZCBpbnQgcGFyYW1ldGVyKTsKLWV4dGVybiBpbnQgZnRhcGVfcmVwb3J0X29wZXJhdGlvbihpbnQgKnN0YXR1cywKLQkJCQkgIHFpYzExN19jbWRfdCAgY29tbWFuZCwKLQkJCQkgIGludCByZXN1bHRfbGVuZ3RoKTsKLWV4dGVybiBpbnQgZnRhcGVfcmVwb3J0X2NvbmZpZ3VyYXRpb24ocWljX21vZGVsICptb2RlbCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCi0JCQkJICAgICAgaW50ICpxaWNfc3RkLAotCQkJCSAgICAgIGludCAqdGFwZV9sZW4pOwotZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKGludCAqc3RhdHVzKTsKLWV4dGVybiBpbnQgZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpOwotZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfc3RhdHVzKGludCAqc3RhdHVzKTsKLWV4dGVybiBpbnQgZnRhcGVfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpOwotZXh0ZXJuIGludCBmdGFwZV9zZWVrX2hlYWRfdG9fdHJhY2sodW5zaWduZWQgaW50IHRyYWNrKTsKLWV4dGVybiBpbnQgZnRhcGVfc2V0X2RhdGFfcmF0ZSh1bnNpZ25lZCBpbnQgbmV3X3JhdGUsIHVuc2lnbmVkIGludCBxaWNfc3RkKTsKLWV4dGVybiBpbnQgZnRhcGVfcmVwb3J0X2Vycm9yKHVuc2lnbmVkIGludCAqZXJyb3IsCi0JCQkgICAgICBxaWMxMTdfY21kX3QgKmNvbW1hbmQsCi0JCQkgICAgICBpbnQgcmVwb3J0KTsKLWV4dGVybiBpbnQgZnRhcGVfcmVzZXRfZHJpdmUodm9pZCk7Ci1leHRlcm4gaW50IGZ0YXBlX3B1dF9kcml2ZV90b19zbGVlcCh3YWtlX3VwX3R5cGVzIG1ldGhvZCk7Ci1leHRlcm4gaW50IGZ0YXBlX3dha2V1cF9kcml2ZSh3YWtlX3VwX3R5cGVzIG1ldGhvZCk7Ci1leHRlcm4gaW50IGZ0YXBlX2luY3JlYXNlX3RocmVzaG9sZCh2b2lkKTsKLWV4dGVybiBpbnQgZnRhcGVfaGFsZl9kYXRhX3JhdGUodm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDViMTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4xMSAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8yNCAxNDo0NzozNyAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHByb2NmcyBpbnRlcmZhY2UgZm9yIHRoZQotICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KLQotICoJT2xkIGNvZGUgcmVtb3ZlZCwgc3dpdGNoZWQgdG8gZHluYW1pYyBwcm9jIGVudHJ5LgotICovCi0KLQotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCi0KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KLQotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcHJvYy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKLQotc3RhdGljIHNpemVfdCBnZXRfZHJpdmVyX2luZm8oY2hhciAqYnVmKQotewotCWNvbnN0IGNoYXIgKmRlYnVnX2xldmVsW10gPSB7ICJidWdzIiAgLAotCQkJCSAgICAgICJlcnJvcnMiLAotCQkJCSAgICAgICJ3YXJuaW5ncyIsCi0JCQkJICAgICAgImluZm9ybWF0aW9uYWwiLAotCQkJCSAgICAgICJub2lzeSIsCi0JCQkJICAgICAgInByb2dyYW0gZmxvdyIsCi0JCQkJICAgICAgImZkYyBhbmQgZG1hIiwKLQkJCQkgICAgICAiZGF0YSBmbG93IiwKLQkJCQkgICAgICAiYW55dGhpbmciIH07Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsCi0JCSAgICAgICAidmVyc2lvbiAgICAgICA6ICVzXG4iCi0JCSAgICAgICAidXNlZCBkYXRhIHJhdGU6ICVkIGtiaXQvc2VjXG4iCi0JCSAgICAgICAiZG1hIG1lbW9yeSAgICA6ICVkIGtiXG4iCi0JCSAgICAgICAiZGVidWcgbWVzc2FnZXM6ICVzXG4iLAotCQkgICAgICAgRlRBUEVfVkVSU0lPTiwKLQkJICAgICAgIGZ0X2RhdGFfcmF0ZSwKLQkJICAgICAgIEZUX0JVRkZfU0laRSAqIGZ0X25yX2J1ZmZlcnMgPj4gMTAsCi0JCSAgICAgICBkZWJ1Z19sZXZlbFtUUkFDRV9MRVZFTF0pOwotfQotCi1zdGF0aWMgc2l6ZV90IGdldF90YXBlZHJpdmVfaW5mbyhjaGFyICpidWYpCi17IAotCXJldHVybiBzcHJpbnRmKGJ1ZiwKLQkJICAgICAgICJ2ZW5kb3IgaWQgOiAweCUwNHhcbiIKLQkJICAgICAgICJkcml2ZSBuYW1lOiAlc1xuIgotCQkgICAgICAgIndpbmQgc3BlZWQ6ICVkIGlwc1xuIgotCQkgICAgICAgIndha2V1cCAgICA6ICVzXG4iCi0JCSAgICAgICAibWF4LiByYXRlIDogJWQga2JpdC9zZWNcbiIsCi0JCSAgICAgICBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCwKLQkJICAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSwKLQkJICAgICAgIGZ0X2RyaXZlX3R5cGUuc3BlZWQsCi0JCSAgICAgICAoKGZ0X2RyaXZlX3R5cGUud2FrZV91cCA9PSBub193YWtlX3VwKQotCQkJPyAiTm8gd2FrZXVwIG5lZWRlZCIgOgotCQkJKChmdF9kcml2ZV90eXBlLndha2VfdXAgPT0gd2FrZV91cF9jb2xvcmFkbykKLQkJCSA/ICJDb2xvcmFkbyIgOgotCQkJICgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfbW91bnRhaW4pCi0JCQkgID8gIk1vdW50YWluIiA6Ci0JCQkgICgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfaW5zaWdodCkKLQkJCSAgID8gIk1vdG9yIG9uIiA6Ci0JCQkgICAiVW5rbm93biIpKSkpLAotCQkgICAgICAgZnRfZHJpdmVfbWF4X3JhdGUpOwotfQotCi1zdGF0aWMgc2l6ZV90IGdldF9jYXJ0cmlkZ2VfaW5mbyhjaGFyICpidWYpCi17Ci0JaWYgKGZ0YXBlX2luaXRfZHJpdmVfbmVlZGVkKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuaW5pdGlhbGl6ZWRcbiIpOwotCX0KLQlpZiAoZnRfbm9fdGFwZSkgewotCQlyZXR1cm4gc3ByaW50ZihidWYsICJubyBjYXJ0cmlkZ2UgaW5zZXJ0ZWRcbiIpOwotCX0KLQlyZXR1cm4gc3ByaW50ZihidWYsCi0JCSAgICAgICAic2VnbWVudHMgIDogJTVkXG4iCi0JCSAgICAgICAidHJhY2tzICAgIDogJTVkXG4iCi0JCSAgICAgICAibGVuZ3RoICAgIDogJTVkZnRcbiIKLQkJICAgICAgICJmb3JtYXR0ZWQgOiAlM3NcbiIKLQkJICAgICAgICJ3cml0YWJsZSAgOiAlM3NcbiIKLQkJICAgICAgICJRSUMgc3BlYy4gOiBRSUMtJXNcbiIKLQkJICAgICAgICJmbXQtY29kZSAgOiAlMWRcbiIsCi0JCSAgICAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssCi0JCSAgICAgICBmdF90cmFja3NfcGVyX3RhcGUsCi0JCSAgICAgICBmdGFwZV90YXBlX2xlbiwKLQkJICAgICAgIChmdF9mb3JtYXR0ZWQgPT0gMSkgPyAieWVzIiA6ICJubyIsCi0JCSAgICAgICAoZnRfd3JpdGVfcHJvdGVjdGVkID09IDEpID8gIm5vIiA6ICJ5ZXMiLAotCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwKSA/ICI0MCIgOgotCQkJKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSA/ICI4MCIgOgotCQkJICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDEwKSA/ICIzMDEwIiA6Ci0JCQkgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDIwKSA/ICIzMDIwIiA6Ci0JCQkgICAiPz8/IikpKSksCi0JCSAgICAgICBmdF9mb3JtYXRfY29kZSk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgZ2V0X2NvbnRyb2xsZXJfaW5mbyhjaGFyICpidWYpCi17Ci0JY29uc3QgY2hhciAgKmZkY19uYW1lW10gPSB7ICJubyBmZGMiLAotCQkJCSAgICAiaTgyNzIiLAotCQkJCSAgICAiaTgyMDc3IiwKLQkJCQkgICAgImk4MjA3N0FBIiwKLQkJCQkgICAgIkNvbG9yYWRvIEZDLTEwIG9yIEZDLTIwIiwKLQkJCQkgICAgImk4MjA3OCIsCi0JCQkJICAgICJpODIwNzhfMSIgfTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwKLQkJICAgICAgICJGREMgdHlwZSAgOiAlc1xuIgotCQkgICAgICAgIkZEQyBiYXNlICA6IDB4JTAzeFxuIgotCQkgICAgICAgIkZEQyBpcnEgICA6ICVkXG4iCi0JCSAgICAgICAiRkRDIGRtYSAgIDogJWRcbiIKLQkJICAgICAgICJGREMgdGhyLiAgOiAlZFxuIgotCQkgICAgICAgIm1heC4gcmF0ZSA6ICVkIGtiaXQvc2VjXG4iLAotCQkgICAgICAgZnRfbWFjaDIgPyAiTW91bnRhaW4gTUFDSC0yIiA6IGZkY19uYW1lW2ZkYy50eXBlXSwKLQkJICAgICAgIGZkYy5zcmEsIGZkYy5pcnEsIGZkYy5kbWEsCi0JCSAgICAgICBmdF9mZGNfdGhyZXNob2xkLCBmdF9mZGNfbWF4X3JhdGUpOwotfQotCi1zdGF0aWMgc2l6ZV90IGdldF9oaXN0b3J5X2luZm8oY2hhciAqYnVmKQotewotICAgICAgICBzaXplX3QgbGVuOwotCi0JbGVuICA9IHNwcmludGYoYnVmLAotCQkgICAgICAgIlxuRkRDIGlzciBzdGF0aXN0aWNzXG4iCi0JCSAgICAgICAiIGlkX2FtX2Vycm9ycyAgICAgOiAlM2RcbiIKLQkJICAgICAgICIgaWRfY3JjX2Vycm9ycyAgICA6ICUzZFxuIgotCQkgICAgICAgIiBkYXRhX2FtX2Vycm9ycyAgIDogJTNkXG4iCi0JCSAgICAgICAiIGRhdGFfY3JjX2Vycm9ycyAgOiAlM2RcbiIKLQkJICAgICAgICIgb3ZlcnJ1bl9lcnJvcnMgICA6ICUzZFxuIgotCQkgICAgICAgIiBub19kYXRhX2Vycm9ycyAgIDogJTNkXG4iCi0JCSAgICAgICAiIHJldHJpZXMgICAgICAgICAgOiAlM2RcbiIsCi0JCSAgICAgICBmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycywgICBmdF9oaXN0b3J5LmlkX2NyY19lcnJvcnMsCi0JCSAgICAgICBmdF9oaXN0b3J5LmRhdGFfYW1fZXJyb3JzLCBmdF9oaXN0b3J5LmRhdGFfY3JjX2Vycm9ycywKLQkJICAgICAgIGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMsIGZ0X2hpc3Rvcnkubm9fZGF0YV9lcnJvcnMsCi0JCSAgICAgICBmdF9oaXN0b3J5LnJldHJpZXMpOwotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKLQkJICAgICAgICJcbkVDQyBzdGF0aXN0aWNzXG4iCi0JCSAgICAgICAiIGNyY19lcnJvcnMgICAgICAgOiAlM2RcbiIKLQkJICAgICAgICIgY3JjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgotCQkgICAgICAgIiBlY2NfZmFpbHVyZXMgICAgIDogJTNkXG4iCi0JCSAgICAgICAiIHNlY3RvcnMgY29ycmVjdGVkOiAlM2RcbiIsCi0JCSAgICAgICBmdF9oaXN0b3J5LmNyY19lcnJvcnMsICAgZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMsCi0JCSAgICAgICBmdF9oaXN0b3J5LmVjY19mYWlsdXJlcywgZnRfaGlzdG9yeS5jb3JyZWN0ZWQpOwotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKLQkJICAgICAgICJcbnRhcGUgcXVhbGl0eSBzdGF0aXN0aWNzXG4iCi0JCSAgICAgICAiIG1lZGlhIGRlZmVjdHMgICAgOiAlM2RcbiIsCi0JCSAgICAgICBmdF9oaXN0b3J5LmRlZmVjdHMpOwotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKLQkJICAgICAgICJcbnRhcGUgbW90aW9uIHN0YXRpc3RpY3NcbiIKLQkJICAgICAgICIgcmVwb3NpdGlvbnMgICAgICA6ICUzZFxuIiwKLQkJICAgICAgIGZ0X2hpc3RvcnkucmV3aW5kcyk7Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBmdGFwZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWNoYXIgKnB0ciA9IHBhZ2U7Ci0Jc2l6ZV90IGxlbjsKLQkKLQlwdHIgKz0gc3ByaW50ZihwdHIsICJLZXJuZWwgRHJpdmVyXG5cbiIpOwotCXB0ciArPSBnZXRfZHJpdmVyX2luZm8ocHRyKTsKLQlwdHIgKz0gc3ByaW50ZihwdHIsICJcblRhcGUgRHJpdmVcblxuIik7Ci0JcHRyICs9IGdldF90YXBlZHJpdmVfaW5mbyhwdHIpOwotCXB0ciArPSBzcHJpbnRmKHB0ciwgIlxuRkRDIENvbnRyb2xsZXJcblxuIik7Ci0JcHRyICs9IGdldF9jb250cm9sbGVyX2luZm8ocHRyKTsKLQlwdHIgKz0gc3ByaW50ZihwdHIsICJcblRhcGUgQ2FydHJpZGdlXG5cbiIpOwotCXB0ciArPSBnZXRfY2FydHJpZGdlX2luZm8ocHRyKTsKLQlwdHIgKz0gc3ByaW50ZihwdHIsICJcbkhpc3RvcnkgUmVjb3JkXG5cbiIpOwotCXB0ciArPSBnZXRfaGlzdG9yeV9pbmZvKHB0cik7Ci0KLQlsZW4gPSBzdHJsZW4ocGFnZSk7Ci0JKnN0YXJ0ID0gTlVMTDsKLQlpZiAob2ZmK2NvdW50ID49IGxlbikgewotCQkqZW9mID0gMTsKLQl9IGVsc2UgewotCQkqZW9mID0gMDsKLQl9Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IF9faW5pdCBmdGFwZV9wcm9jX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZnRhcGUiLCAwLCAmcHJvY19yb290LAotCQlmdGFwZV9yZWFkX3Byb2MsIE5VTEwpICE9IE5VTEw7Ci19Ci0KLXZvaWQgZnRhcGVfcHJvY19kZXN0cm95KHZvaWQpCi17Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImZ0YXBlIiwgJnByb2Nfcm9vdCk7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NGRmY2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNpZm5kZWYgX0ZUQVBFX1BST0NfSAotI2RlZmluZSBfRlRBUEVfUFJPQ19ICi0KLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjAgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgcHJvY2ZzIGludGVyZmFjZSBvZiB0aGUKLSAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLQotZXh0ZXJuIGludCAgZnRhcGVfcHJvY19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgZnRhcGVfcHJvY19kZXN0cm95KHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY3ZDhjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMsdiAkCi0gKiAkUmV2aXNpb246IDEuNiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8yMSAxNDozOToyMiAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJlYWRpbmcgY29kZQotICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1lY2MuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLQotdm9pZCBmdGFwZV96YXBfcmVhZF9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgKytpKSB7Ci0vKiAgY2hhbmdlZCB0byAiZml0IiB3aXRoIGR5bmFtaWMgYWxsb2NhdGlvbiBvZiB0YXBlX2J1ZmZlci4gLS1raHAgICovCi0JCWZ0X2J1ZmZlcltpXS0+c3RhdHVzID0gd2FpdGluZzsKLQkJZnRfYnVmZmVyW2ldLT5ieXRlcyA9IDA7Ci0JCWZ0X2J1ZmZlcltpXS0+c2tpcCA9IDA7Ci0JCWZ0X2J1ZmZlcltpXS0+cmV0cnkgPSAwOwotCX0KLS8qCWZ0YXBlX3Jlc2V0X2J1ZmZlcigpOyAqLwotfQotCi1zdGF0aWMgU2VjdG9yTWFwIGNvbnZlcnRfc2VjdG9yX21hcChidWZmZXJfc3RydWN0ICogYnVmZikKLXsKLQlpbnQgaSA9IDA7Ci0JU2VjdG9yTWFwIGJhZF9tYXAgPSBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShidWZmLT5zZWdtZW50X2lkKTsKLQlTZWN0b3JNYXAgc3JjX21hcCA9IGJ1ZmYtPnNvZnRfZXJyb3JfbWFwIHwgYnVmZi0+aGFyZF9lcnJvcl9tYXA7Ci0JU2VjdG9yTWFwIGRzdF9tYXAgPSAwOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlpZiAoYmFkX21hcCB8fCBzcmNfbWFwKSB7Ci0JCVRSQUNFKGZ0X3RfZmxvdywgImJhZF9tYXAgPSAweCUwOGx4IiwgKGxvbmcpIGJhZF9tYXApOwotCQlUUkFDRShmdF90X2Zsb3csICJzcmNfbWFwID0gMHglMDhseCIsIChsb25nKSBzcmNfbWFwKTsKLQl9Ci0Jd2hpbGUgKGJhZF9tYXApIHsKLQkJd2hpbGUgKChiYWRfbWFwICYgMSkgPT0gMCkgewotCQkJaWYgKHNyY19tYXAgJiAxKSB7Ci0JCQkJZHN0X21hcCB8PSAoMSA8PCBpKTsKLQkJCX0KLQkJCXNyY19tYXAgPj49IDE7Ci0JCQliYWRfbWFwID4+PSAxOwotCQkJKytpOwotCQl9Ci0JCS8qIChiYWRfbWFwICYgMSkgPT0gMSAqLwotCQlzcmNfbWFwID4+PSAxOwotCQliYWRfbWFwID4+PSAxOwotCX0KLQlpZiAoc3JjX21hcCkgewotCQlkc3RfbWFwIHw9IChzcmNfbWFwIDw8IGkpOwotCX0KLQlpZiAoZHN0X21hcCkgewotCQlUUkFDRShmdF90X2Zsb3csICJkc3RfbWFwID0gMHglMDhseCIsIChsb25nKSBkc3RfbWFwKTsKLQl9Ci0JVFJBQ0VfRVhJVCBkc3RfbWFwOwotfQotCi1zdGF0aWMgaW50IGNvcnJlY3RfYW5kX2NvcHlfZnJhY3Rpb24oYnVmZmVyX3N0cnVjdCAqYnVmZiwgX191OCAqIGRlc3RpbmF0aW9uLAotCQkJCSAgICAgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgbXNlZzsKLQlpbnQgcmVzdWx0OwotCVNlY3Rvck1hcCByZWFkX2JhZDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JbXNlZy5yZWFkX2JhZCA9IGNvbnZlcnRfc2VjdG9yX21hcChidWZmKTsKLQltc2VnLm1hcmtlZF9iYWQgPSAwOwkvKiBub3QgdXNlZC4uLiAqLwotCW1zZWcuYmxvY2tzID0gYnVmZi0+Ynl0ZXMgLyBGVF9TRUNUT1JfU0laRTsKLQltc2VnLmRhdGEgPSBidWZmLT5hZGRyZXNzOwotCS8qICAgIElmIHRoZXJlIGFyZSBubyBkYXRhIHNlY3RvcnMgd2UgY2FuIHNraXAgdGhpcyBzZWdtZW50LgotCSAqLwotCWlmIChtc2VnLmJsb2NrcyA8PSAzKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJlbXB0eSBzZWdtZW50Iik7Ci0JfQotCXJlYWRfYmFkID0gbXNlZy5yZWFkX2JhZDsKLQlmdF9oaXN0b3J5LmNyY19lcnJvcnMgKz0gY291bnRfb25lcyhyZWFkX2JhZCk7Ci0JcmVzdWx0ID0gZnRhcGVfZWNjX2NvcnJlY3RfZGF0YSgmbXNlZyk7Ci0JaWYgKHJlYWRfYmFkICE9IDAgfHwgbXNlZy5jb3JyZWN0ZWQgIT0gMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAiY3JjIGVycm9yIG1hcDogMHglMDhseCIsICh1bnNpZ25lZCBsb25nKXJlYWRfYmFkKTsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImNvcnJlY3RlZCBtYXA6IDB4JTA4bHgiLCAodW5zaWduZWQgbG9uZyltc2VnLmNvcnJlY3RlZCk7Ci0JCWZ0X2hpc3RvcnkuY29ycmVjdGVkICs9IGNvdW50X29uZXMobXNlZy5jb3JyZWN0ZWQpOwotCX0KLQlpZiAocmVzdWx0ID09IEVDQ19DT1JSRUNURUQgfHwgcmVzdWx0ID09IEVDQ19PSykgewotCQlpZiAocmVzdWx0ID09IEVDQ19DT1JSRUNURUQpIHsKLQkJCVRSQUNFKGZ0X3RfaW5mbywgImVjYyBjb3JyZWN0ZWQgc2VnbWVudDogJWQiLCBidWZmLT5zZWdtZW50X2lkKTsKLQkJfQotCQlpZihzdGFydCA8IDApIHsKLQkJCXN0YXJ0PSAwOwotCQl9Ci0JCWlmKChzdGFydCtzaXplKSA+ICgobXNlZy5ibG9ja3MgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFKSkgewotCQkJc2l6ZSA9IChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkUgIC0gc3RhcnQ7Ci0JCX0gCi0JCWlmIChzaXplIDwgMCkgewotCQkJc2l6ZT0gMDsKLQkJfQotCQlpZihzaXplID4gMCkgewotCQkJbWVtY3B5KGRlc3RpbmF0aW9uICsgc3RhcnQsIG1zZWcuZGF0YSArIHN0YXJ0LCBzaXplKTsKLQkJfQotCQlpZiAoKHJlYWRfYmFkIF4gbXNlZy5jb3JyZWN0ZWQpICYgbXNlZy5jb3JyZWN0ZWQpIHsKLQkJCS8qIHNlY3RvcnMgY29ycmVjdGVkIHdpdGhvdXQgY3JjIGVycm9ycyBzZXQgKi8KLQkJCWZ0X2hpc3RvcnkuY3JjX2ZhaWx1cmVzKys7Ci0JCX0KLQkJVFJBQ0VfRVhJVCBzaXplOyAvKiAobXNlZy5ibG9ja3MgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFOyAqLwotCX0gZWxzZSB7Ci0JCWZ0X2hpc3RvcnkuZWNjX2ZhaWx1cmVzKys7Ci0JCVRSQUNFX0FCT1JUKC1FQUdBSU4sCi0JCQkgICAgZnRfdF9lcnIsICJlY2MgZmFpbHVyZSBvbiBzZWdtZW50ICVkIiwKLQkJCSAgICBidWZmLT5zZWdtZW50X2lkKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiAgICAgIFJlYWQgZ2l2ZW4gc2VnbWVudCBpbnRvIGJ1ZmZlciBhdCBhZGRyZXNzLgotICovCi1pbnQgZnRhcGVfcmVhZF9zZWdtZW50X2ZyYWN0aW9uKGNvbnN0IGludCBzZWdtZW50X2lkLAotCQkJCXZvaWQgICphZGRyZXNzLCAKLQkJCQljb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCi0JCQkJY29uc3QgaW50IHN0YXJ0LAotCQkJCWNvbnN0IGludCBzaXplKQotewotCWludCByZXN1bHQgPSAwOwotCWludCByZXRyeSAgPSAwOwotCWludCBieXRlc19yZWFkID0gMDsKLQlpbnQgcmVhZF9kb25lICA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlmdF9oaXN0b3J5LnVzZWQgfD0gMTsKLQlUUkFDRShmdF90X2RhdGFfZmxvdywgInNlZ21lbnRfaWQgPSAlZCIsIHNlZ21lbnRfaWQpOwotCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gcmVhZGluZykgewotCQlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBmdGFwZV9hYm9ydF9vcGVyYXRpb24iKTsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKLQkJZnRhcGVfc2V0X3N0YXRlKHJlYWRpbmcpOwotCX0KLQlmb3IoOzspIHsKLQkJYnVmZmVyX3N0cnVjdCAqdGFpbDsKLQkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQotCQkgKi8KLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQkvKiAgU2VhcmNoIGFsbCBmdWxsIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCBtYXRjaGluZyB0aGUKLQkJICogIHdhbnRlZCBzZWdtZW50LiAgQ2xlYXIgb3RoZXIgYnVmZmVycyBvbiB0aGUgZmx5LgotCQkgKi8KLQkJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7Ci0JCXdoaWxlICghcmVhZF9kb25lICYmIHRhaWwtPnN0YXR1cyA9PSBkb25lKSB7Ci0JCQkvKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCAhCi0JCQkgKi8KLQkJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKLQkJCWlmICh0YWlsLT5zZWdtZW50X2lkID09IHNlZ21lbnRfaWQpIHsKLQkJCQkvKiAgSWYgb3V0IGJ1ZmZlciBpcyBhbHJlYWR5IGZ1bGwsCi0JCQkJICogIHJldHVybiBpdHMgY29udGVudHMuICAKLQkJCQkgKi8KLQkJCQlUUkFDRShmdF90X2Zsb3csICJmb3VuZCBzZWdtZW50IGluIGNhY2hlOiAlZCIsCi0JCQkJICAgICAgc2VnbWVudF9pZCk7Ci0JCQkJaWYgKHRhaWwtPmRlbGV0ZWQpIHsKLQkJCQkJLyogIFJldHVybiBhIHZhbHVlIHRoYXQKLQkJCQkJICogIHJlYWRfaGVhZGVyX3NlZ21lbnQKLQkJCQkJICogIHVuZGVyc3RhbmRzLiAgQXMgdGhpcwotCQkJCQkgKiAgc2hvdWxkIG9ubHkgb2NjdXIgd2hlbgotCQkJCQkgKiAgc2VhcmNoaW5nIGZvciB0aGUgaGVhZGVyCi0JCQkJCSAqICBzZWdtZW50cyBpdCBzaG91bGRuJ3QgYmUKLQkJCQkJICogIG1pc2ludGVycHJldGVkIGVsc2V3aGVyZS4KLQkJCQkJICovCi0JCQkJCVRSQUNFX0VYSVQgMDsKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gY29ycmVjdF9hbmRfY29weV9mcmFjdGlvbigKLQkJCQkJdGFpbCwKLQkJCQkJYWRkcmVzcywKLQkJCQkJc3RhcnQsCi0JCQkJCXNpemUpOwotCQkJCVRSQUNFKGZ0X3RfZmxvdywgInNlZ21lbnQgY29udGFpbnMgKGJ5dGVzKTogJWQiLAotCQkJCSAgICAgIHJlc3VsdCk7Ci0JCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQkJaWYgKHJlc3VsdCAhPSAtRUFHQUlOKSB7Ci0JCQkJCQlUUkFDRV9FWElUIHJlc3VsdDsKLQkJCQkJfQotCQkJCQkvKiBrZWVwIHJlYWRfZG9uZSA9PSAwLCB3aWxsCi0JCQkJCSAqIHRyaWdnZXIKLQkJCQkJICogZnRhcGVfYWJvcnRfb3BlcmF0aW9uCi0JCQkJCSAqIGJlY2F1c2UgcmVhZGluZyB3cm9uZwotCQkJCQkgKiBzZWdtZW50LgotCQkJCQkgKi8KLQkJCQkJVFJBQ0UoZnRfdF9lcnIsICJlY2MgZmFpbGVkLCByZXRyeSIpOwotCQkJCQkrK3JldHJ5OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlYWRfZG9uZSA9IDE7Ci0JCQkJCWJ5dGVzX3JlYWQgPSByZXN1bHQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlUUkFDRShmdF90X2Zsb3csInphcHBpbmcgc2VnbWVudCBpbiBjYWNoZTogJWQiLAotCQkJCSAgICAgIHRhaWwtPnNlZ21lbnRfaWQpOwotCQkJfQotCQkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKLQkJCXRhaWwgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKLQkJfQotCQlpZiAoIXJlYWRfZG9uZSAmJiB0YWlsLT5zdGF0dXMgPT0gcmVhZGluZykgewotCQkJaWYgKHRhaWwtPnNlZ21lbnRfaWQgPT0gc2VnbWVudF9pZCkgewotCQkJCXN3aXRjaChmdGFwZV93YWl0X3NlZ21lbnQocmVhZGluZykpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgLUVJTlRSOgotCQkJCQlUUkFDRV9BQk9SVCgtRUlOVFIsIGZ0X3Rfd2FybiwKLQkJCQkJCSAgICAiaW50ZXJydXB0ZWQgYnkgIgotCQkJCQkJICAgICJub24tYmxvY2thYmxlIHNpZ25hbCIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlUUkFDRShmdF90X25vaXNlLAotCQkJCQkgICAgICAid2FpdF9zZWdtZW50IGZhaWxlZCIpOwotCQkJCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKLQkJCQkJZnRhcGVfc2V0X3N0YXRlKHJlYWRpbmcpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qICBXZSdyZSByZWFkaW5nIHRoZSB3cm9uZyBzZWdtZW50LAotCQkJCSAqICBzdG9wIHJ1bm5lci4KLQkJCQkgKi8KLQkJCQlUUkFDRShmdF90X25vaXNlLCAicmVhZGluZyB3cm9uZyBzZWdtZW50Iik7Ci0JCQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7Ci0JCQkJZnRhcGVfc2V0X3N0YXRlKHJlYWRpbmcpOwotCQkJfQotCQl9Ci0JCS8qICAgIHNob3VsZCBydW5uZXIgc3RvcCA/Ci0JCSAqLwotCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZykgewotCQkJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7Ci0JCQlzd2l0Y2goaGVhZC0+c3RhdHVzKSB7Ci0JCQljYXNlIGVycm9yOgotCQkJCWZ0X2hpc3RvcnkuZGVmZWN0cyArPSAKLQkJCQkJY291bnRfb25lcyhoZWFkLT5oYXJkX2Vycm9yX21hcCk7Ci0JCQljYXNlIHJlYWRpbmc6Ci0JCQkJaGVhZC0+c3RhdHVzID0gd2FpdGluZzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlUUkFDRV9DQVRDSChmdGFwZV9kdW1iX3N0b3AoKSwpOwotCQl9IGVsc2UgewotCQkJLyogIElmIGp1c3QgcGFzc2VkIGxhc3Qgc2VnbWVudCBvbiB0YXBlOiB3YWl0Ci0JCQkgKiAgZm9yIEJPVCBvciBFT1QgbWFyay4gU2V0cyBmdF9ydW5uZXJfc3RhdHVzIHRvCi0JCQkgKiAgaWRsZSBpZiBhdCBsRU9UIGFuZCBzdWNjZXNzZnVsIAotCQkJICovCi0JCQlUUkFDRV9DQVRDSChmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3QoKSwpOwotCQl9Ci0JCS8qICAgIElmIHdlIGdvdCBhIHNlZ21lbnQ6IHF1aXQsIG9yIGVsc2UgcmV0cnkgdXAgdG8gbGltaXQuCi0JCSAqCi0JCSAqICAgIElmIHNlZ21lbnQgdG8gcmVhZCBpcyBlbXB0eSwgZG8gbm90IHN0YXJ0IHJ1bm5lciBmb3IgaXQsCi0JCSAqICAgIGJ1dCB3YWl0IGZvciBuZXh0IHJlYWQgY2FsbC4KLQkJICovCi0JCWlmIChyZWFkX2RvbmUgfHwKLQkJICAgIGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KHNlZ21lbnRfaWQpID09IEVNUFRZX1NFR01FTlQgKSB7Ci0JCQkvKiBieXRlc19yZWFkID0gMDsgIHNob3VsZCBzdGlsbCBiZSB6ZXJvICovCi0JCQlUUkFDRV9FWElUIGJ5dGVzX3JlYWQ7Ci0KLQkJfQotCQlpZiAocmV0cnkgPiBGVF9SRVRSSUVTX09OX0VDQ19FUlJPUikgewotCQkJZnRfaGlzdG9yeS5kZWZlY3RzKys7Ci0JCQlUUkFDRV9BQk9SVCgtRU5PREFUQSwgZnRfdF9lcnIsCi0JCQkJICAgICJ0b28gbWFueSByZXRyaWVzIG9uIGVjYyBmYWlsdXJlIik7Ci0JCX0KLQkJLyogICAgTm93IGF0IGxlYXN0IG9uZSBidWZmZXIgaXMgZW1wdHkgIQotCQkgKiAgICBSZXN0YXJ0IHJ1bm5lciAmIHRhcGUgaWYgbmVlZGVkLgotCQkgKi8KLQkJVFJBQ0UoZnRfdF9hbnksICJoZWFkOiAlZCwgdGFpbDogJWQsIGZ0X3J1bm5lcl9zdGF0dXM6ICVkIiwKLQkJICAgICAgZnRhcGVfYnVmZmVyX2lkKGZ0X3F1ZXVlX2hlYWQpLAotCQkgICAgICBmdGFwZV9idWZmZXJfaWQoZnRfcXVldWVfdGFpbCksCi0JCSAgICAgIGZ0X3J1bm5lcl9zdGF0dXMpOwotCQlUUkFDRShmdF90X2FueSwgImJ1ZmZlcltdLnN0YXR1cywgW2hlYWRdOiAlZCwgW3RhaWxdOiAlZCIsCi0JCSAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnN0YXR1cywKLQkJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKS0+c3RhdHVzKTsKLQkJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7Ci0JCWlmICh0YWlsLT5zdGF0dXMgPT0gd2FpdGluZykgewotCQkJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7Ci0KLQkJCWZ0YXBlX3NldHVwX25ld19zZWdtZW50KGhlYWQsIHNlZ21lbnRfaWQsIC0xKTsKLQkJCWlmIChyZWFkX21vZGUgPT0gRlRfUkRfU0lOR0xFKSB7Ci0JCQkJLyogZGlzYWJsZSByZWFkLWFoZWFkICovCi0JCQkJaGVhZC0+bmV4dF9zZWdtZW50ID0gMDsKLQkJCX0KLQkJCWZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGhlYWQpOwotCQkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gaWRsZSkgewotCQkJCXJlc3VsdCA9IGZ0YXBlX3N0YXJ0X3RhcGUoc2VnbWVudF9pZCwKLQkJCQkJCQkgIGhlYWQtPnNlY3Rvcl9vZmZzZXQpOwotCQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9lcnIsICJFcnJvcjogIgotCQkJCQkJICAgICJzZWdtZW50ICVkIHVucmVhY2hhYmxlIiwKLQkJCQkJCSAgICBzZWdtZW50X2lkKTsKLQkJCQl9Ci0JCQl9Ci0JCQloZWFkLT5zdGF0dXMgPSByZWFkaW5nOwotCQkJZmRjX3NldHVwX3JlYWRfd3JpdGUoaGVhZCwgRkRDX1JFQUQpOwotCQl9Ci0JfQotCS8qIG5vdCByZWFjaGVkICovCi0JVFJBQ0VfRVhJVCAtRUlPOwotfQotCi1pbnQgZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudChfX3U4ICphZGRyZXNzKQotewotCWludCByZXN1bHQ7Ci0JaW50IGhlYWRlcl9zZWdtZW50OwotCWludCBmaXJzdF9mYWlsZWQgPSAwOwotCWludCBzdGF0dXM7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlmdF91c2VkX2hlYWRlcl9zZWdtZW50ID0gLTE7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cygmc3RhdHVzKSwpOwotCVRSQUNFKGZ0X3RfZmxvdywgInJlYWRpbmcuLi4iKTsKLQkvKiAgV2UncmUgbG9va2luZyBmb3IgdGhlIGZpcnN0IGhlYWRlciBzZWdtZW50LgotCSAqICBBIGhlYWRlciBzZWdtZW50IGNhbm5vdCBjb250YWluIGJhZCBzZWN0b3JzLCB0aGVyZWZvciBhdCB0aGUKLQkgKiAgdGFwZSBzdGFydCwgc2VnbWVudHMgd2l0aCBiYWQgc2VjdG9ycyBhcmUgKGFjY29yZGluZyB0byBRSUMtNDAvODApCi0JICogIHdyaXR0ZW4gd2l0aCBkZWxldGVkIGRhdGEgbWFya3MgYW5kIG11c3QgYmUgc2tpcHBlZC4KLQkgKi8KLQltZW1zZXQoYWRkcmVzcywgJ1wwJywgKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFKTsgCi0JcmVzdWx0ID0gMDsKLSNkZWZpbmUgSEVBREVSX1NFR01FTlRfQk9VTkRBUlkgNjggIC8qIHdoeSBub3QgNDI/ICovCi0JZm9yIChoZWFkZXJfc2VnbWVudCA9IDA7Ci0JICAgICBoZWFkZXJfc2VnbWVudCA8IEhFQURFUl9TRUdNRU5UX0JPVU5EQVJZICYmIHJlc3VsdCA9PSAwOwotCSAgICAgKytoZWFkZXJfc2VnbWVudCkgewotCQkvKiAgU2V0IG5vIHJlYWQtYWhlYWQsIHRoZSBpc3Igd2lsbCBmb3JjZSByZWFkLWFoZWFkIHdoZW5ldmVyCi0JCSAqICBpdCBlbmNvdW50ZXJzIGRlbGV0ZWQgZGF0YSAhCi0JCSAqLwotCQlyZXN1bHQgPSBmdGFwZV9yZWFkX3NlZ21lbnQoaGVhZGVyX3NlZ21lbnQsCi0JCQkJCSAgICBhZGRyZXNzLAotCQkJCQkgICAgRlRfUkRfU0lOR0xFKTsKLQkJaWYgKHJlc3VsdCA8IDAgJiYgIWZpcnN0X2ZhaWxlZCkgewotCQkJVFJBQ0UoZnRfdF9lcnIsICJoZWFkZXIgc2VnbWVudCBkYW1hZ2VkLCB0cnlpbmcgYmFja3VwIik7Ci0JCQlmaXJzdF9mYWlsZWQgPSAxOwotCQkJcmVzdWx0ID0gMDsJLyogZm9yY2UgcmVhZCBvZiBuZXh0IChiYWNrdXApIHNlZ21lbnQgKi8KLQkJfQotCX0KLQlpZiAocmVzdWx0IDwgMCB8fCBoZWFkZXJfc2VnbWVudCA+PSBIRUFERVJfU0VHTUVOVF9CT1VOREFSWSkgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAibm8gcmVhZGFibGUgaGVhZGVyIHNlZ21lbnQgZm91bmQiKTsKLQl9Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKLQlmdF91c2VkX2hlYWRlcl9zZWdtZW50ID0gaGVhZGVyX3NlZ21lbnQ7Ci0JcmVzdWx0ID0gZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KGFkZHJlc3MpOwotIAlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotaW50IGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudChfX3U4ICphZGRyZXNzKQotewotCXVuc2lnbmVkIGludCBtYXhfZmxvcHB5X3NpZGU7Ci0JdW5zaWduZWQgaW50IG1heF9mbG9wcHlfdHJhY2s7Ci0JdW5zaWduZWQgaW50IG1heF9mbG9wcHlfc2VjdG9yOwotCXVuc2lnbmVkIGludCBuZXdfdGFwZV9sZW47Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoR0VUNChhZGRyZXNzLCBGVF9TSUdOQVRVUkUpID09IEZUX0QyR19NQUdJQykgewotCQkvKiBEaXR0byAyR0IgaGVhZGVyIHNlZ21lbnQuIFRoZXkgZW5jcnlwdCB0aGUgYmFkIHNlY3RvciBtYXAuCi0JCSAqIFdlIGRlY3J5cHQgaXQgYW5kIHN0b3JlIHRoZW0gaW4gbm9ybWFsIGZvcm1hdC4KLQkJICogSSBob3BlIHRoaXMgaXMgY29ycmVjdC4KLQkJICovCi0JCWludCBpOwotCQlUUkFDRShmdF90X3dhcm4sCi0JCSAgICAgICJGb3VuZCBEaXR0byAyR0IgdGFwZSwgIgotCQkgICAgICAidHJ5aW5nIHRvIGRlY3J5cHQgYmFkIHNlY3RvciBtYXAiKTsKLQkJZm9yIChpPTI1NjsgaSA8IDI5ICogRlRfU0VDVE9SX1NJWkU7IGkrKykgewotCQkJYWRkcmVzc1tpXSA9IH4oYWRkcmVzc1tpXSAtIChpJjB4ZmYpKTsKLQkJfQotCQlQVVQ0KGFkZHJlc3MsIDAsRlRfSFNFR19NQUdJQyk7Ci0JfSBlbHNlIGlmIChHRVQ0KGFkZHJlc3MsIEZUX1NJR05BVFVSRSkgIT0gRlRfSFNFR19NQUdJQykgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAid3Jvbmcgc2lnbmF0dXJlIGluIGhlYWRlciBzZWdtZW50Iik7Ci0JfQotCWZ0X2Zvcm1hdF9jb2RlID0gKGZ0X2Zvcm1hdF90eXBlKSBhZGRyZXNzW0ZUX0ZNVF9DT0RFXTsKLQlpZiAoZnRfZm9ybWF0X2NvZGUgIT0gZm10X2JpZykgewotCQlmdF9oZWFkZXJfc2VnbWVudF8xICAgPSBHRVQyKGFkZHJlc3MsIEZUX0hTRUdfMSk7Ci0JCWZ0X2hlYWRlcl9zZWdtZW50XzIgICA9IEdFVDIoYWRkcmVzcywgRlRfSFNFR18yKTsKLQkJZnRfZmlyc3RfZGF0YV9zZWdtZW50ID0gR0VUMihhZGRyZXNzLCBGVF9GUlNUX1NFRyk7Ci0JCWZ0X2xhc3RfZGF0YV9zZWdtZW50ICA9IEdFVDIoYWRkcmVzcywgRlRfTEFTVF9TRUcpOwotCX0gZWxzZSB7Ci0JCWZ0X2hlYWRlcl9zZWdtZW50XzEgICA9IEdFVDQoYWRkcmVzcywgRlRfNl9IU0VHXzEpOwotCQlmdF9oZWFkZXJfc2VnbWVudF8yICAgPSBHRVQ0KGFkZHJlc3MsIEZUXzZfSFNFR18yKTsKLQkJZnRfZmlyc3RfZGF0YV9zZWdtZW50ID0gR0VUNChhZGRyZXNzLCBGVF82X0ZSU1RfU0VHKTsKLQkJZnRfbGFzdF9kYXRhX3NlZ21lbnQgID0gR0VUNChhZGRyZXNzLCBGVF82X0xBU1RfU0VHKTsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgImZpcnN0IGRhdGEgc2VnbWVudDogJWQiLCBmdF9maXJzdF9kYXRhX3NlZ21lbnQpOwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJsYXN0ICBkYXRhIHNlZ21lbnQ6ICVkIiwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJoZWFkZXIgc2VnbWVudHMgYXJlICVkIGFuZCAlZCIsCi0JICAgICAgZnRfaGVhZGVyX3NlZ21lbnRfMSwgZnRfaGVhZGVyX3NlZ21lbnRfMik7Ci0KLQkvKiAgICBWZXJpZnkgdGFwZSBwYXJhbWV0ZXJzLi4uCi0JICogICAgUUlDLTQwLzgwIHNwZWM6ICAgICAgICAgICAgICAgICB0YXBlX3BhcmFtZXRlcnM6Ci0JICoKLQkgKiAgICBzZWdtZW50cy1wZXItdHJhY2sgICAgICAgICAgICAgIHNlZ21lbnRzX3Blcl90cmFjawotCSAqICAgIHRyYWNrcy1wZXItY2FydHJpZGdlICAgICAgICAgICAgdHJhY2tzX3Blcl90YXBlCi0JICogICAgbWF4LWZsb3BweS1zaWRlICAgICAgICAgICAgICAgICAoc2VnbWVudHNfcGVyX3RyYWNrICoKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc19wZXJfdGFwZSAtIDEpIC8KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkCi0JICogICAgbWF4LWZsb3BweS10cmFjayAgICAgICAgICAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAvCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgLSAxCi0JICogICAgbWF4LWZsb3BweS1zZWN0b3IgICAgICAgICAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgKgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU0VDVE9SU19QRVJfU0VHTUVOVAotCSAqLwotCWZ0X3NlZ21lbnRzX3Blcl90cmFjayA9IEdFVDIoYWRkcmVzcywgRlRfU1BUKTsKLQlmdF90cmFja3NfcGVyX3RhcGUgICAgPSBhZGRyZXNzW0ZUX1RQQ107Ci0JbWF4X2Zsb3BweV9zaWRlICAgICAgID0gYWRkcmVzc1tGVF9GSE1dOwotCW1heF9mbG9wcHlfdHJhY2sgICAgICA9IGFkZHJlc3NbRlRfRlRNXTsKLQltYXhfZmxvcHB5X3NlY3RvciAgICAgPSBhZGRyZXNzW0ZUX0ZTTV07Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgIihmbXQvc3B0L3RwYy9maG0vZnRtL2ZzbSkgPSAlZC8lZC8lZC8lZC8lZC8lZCIsCi0JICAgICAgZnRfZm9ybWF0X2NvZGUsIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgZnRfdHJhY2tzX3Blcl90YXBlLAotCSAgICAgIG1heF9mbG9wcHlfc2lkZSwgbWF4X2Zsb3BweV90cmFjaywgbWF4X2Zsb3BweV9zZWN0b3IpOwotCW5ld190YXBlX2xlbiA9IGZ0YXBlX3RhcGVfbGVuOwotCXN3aXRjaCAoZnRfZm9ybWF0X2NvZGUpIHsKLQljYXNlIGZtdF80MjVmdDoKLQkJbmV3X3RhcGVfbGVuID0gNDI1OwotCQlicmVhazsKLQljYXNlIGZtdF9ub3JtYWw6Ci0JCWlmIChmdGFwZV90YXBlX2xlbiA9PSAwKSB7CS8qIG90aGVyd2lzZSAzMDcgZnQgKi8KLQkJCW5ld190YXBlX2xlbiA9IDIwNTsKLQkJfQotCQlicmVhazsKLQljYXNlIGZtdF8xMTAwZnQ6Ci0JCW5ld190YXBlX2xlbiA9IDExMDA7Ci0JCWJyZWFrOwotCWNhc2UgZm10X3Zhcjp7Ci0JCQlpbnQgc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDE7CQkvKiBub24temVybyBkZWZhdWx0IGZvciBzd2l0Y2ggKi8KLQkJCXN3aXRjaCAoZnRfcWljX3N0ZCkgewotCQkJY2FzZSBRSUNfVEFQRV9RSUM0MDoKLQkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMzMyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBRSUNfVEFQRV9RSUM4MDoKLQkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gNDg4OwotCQkJCWJyZWFrOwotCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgotCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSA3MzA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6Ci0JCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDE0MzA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQluZXdfdGFwZV9sZW4gPSAoMTAwMCAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjayArCi0JCQkJCShzZWdtZW50c19wZXJfMTAwMF9pbmNoIC0gMSkpIC8gc2VnbWVudHNfcGVyXzEwMDBfaW5jaDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBmbXRfYmlnOnsKLQkJCWludCBzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMTsJCS8qIG5vbi16ZXJvIGRlZmF1bHQgZm9yIHN3aXRjaCAqLwotCQkJc3dpdGNoIChmdF9xaWNfc3RkKSB7Ci0JCQljYXNlIFFJQ19UQVBFX1FJQzQwOgotCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAzMzI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFJQ19UQVBFX1FJQzgwOgotCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSA0ODg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFJQ19UQVBFX1FJQzMwMTA6Ci0JCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDczMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUUlDX1RBUEVfUUlDMzAyMDoKLQkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMTQzMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsCi0JCQkiJXggUUlDLXN0YW5kYXJkIHdpdGggZm10LWNvZGUgJWQsIHBsZWFzZSByZXBvcnQiLAotCQkJCQkgICAgZnRfcWljX3N0ZCwgZnRfZm9ybWF0X2NvZGUpOwotCQkJfQotCQkJbmV3X3RhcGVfbGVuID0gKCgxMDAwICogZnRfc2VnbWVudHNfcGVyX3RyYWNrICsKLQkJCQkJIChzZWdtZW50c19wZXJfMTAwMF9pbmNoIC0gMSkpIC8gCi0JCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2gpOwotCQkJYnJlYWs7Ci0JCX0KLQlkZWZhdWx0OgotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAidW5rbm93biB0YXBlIGZvcm1hdCwgcGxlYXNlIHJlcG9ydCAhIik7Ci0JfQotCWlmIChuZXdfdGFwZV9sZW4gIT0gZnRhcGVfdGFwZV9sZW4pIHsKLQkJZnRhcGVfdGFwZV9sZW4gPSBuZXdfdGFwZV9sZW47Ci0JCVRSQUNFKGZ0X3RfaW5mbywgImNhbGN1bGF0ZWQgdGFwZSBsZW5ndGggaXMgJWQgZnQiLAotCQkgICAgICBmdGFwZV90YXBlX2xlbik7Ci0JCWZ0YXBlX2NhbGNfdGltZW91dHMoZnRfcWljX3N0ZCwgZnRfZGF0YV9yYXRlLCBmdGFwZV90YXBlX2xlbik7Ci0JfQotCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMCAmJiBmdF90cmFja3NfcGVyX3RhcGUgPT0gMCAmJgotCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gMCAmJiBtYXhfZmxvcHB5X3RyYWNrID09IDAgJiYKLQkgICAgbWF4X2Zsb3BweV9zZWN0b3IgPT0gMCkgewotCQkvKiAgUUlDLTQwIFJldiBFIGFuZCBlYXJsaWVyIGhhcyBubyB2YWx1ZXMgaW4gdGhlIGhlYWRlci4KLQkJICovCi0JCWZ0X3NlZ21lbnRzX3Blcl90cmFjayA9IDY4OwotCQlmdF90cmFja3NfcGVyX3RhcGUgPSAyMDsKLQkJbWF4X2Zsb3BweV9zaWRlID0gMTsKLQkJbWF4X2Zsb3BweV90cmFjayA9IDE2OTsKLQkJbWF4X2Zsb3BweV9zZWN0b3IgPSAxMjg7Ci0JfQotCS8qICBUaGlzIHRlc3Qgd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgd3JvbmcgcGFyYW1ldGVyIG9uIHRhcGVzCi0JICogIGZvcm1hdHRlZCBieSBDb25uZXIgc29mdHdhcmUuCi0JICovCi0JaWYgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayA9PSAxNTAgJiYKLQkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDI4ICYmCi0JICAgIG1heF9mbG9wcHlfc2lkZSA9PSA3ICYmCi0JICAgIG1heF9mbG9wcHlfdHJhY2sgPT0gMTQ5ICYmCi0JICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDEyOCkgewotVFJBQ0UoZnRfdF9pbmZvLCAidGhlIGZhbW91cyBDT05ORVIgYnVnOiBtYXhfZmxvcHB5X3NpZGUgb2ZmIGJ5IG9uZSAhIik7Ci0JCW1heF9mbG9wcHlfc2lkZSA9IDY7Ci0JfQotCS8qICBUaGVzZSB0ZXN0cyB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSB3cm9uZyBwYXJhbWV0ZXIgb24gdGFwZXMKLQkgKiAgZm9ybWF0dGVkIGJ5IENvbUJ5dGUgV2luZG93cyBzb2Z0d2FyZS4KLQkgKgotCSAqICBGaXJzdCwgZm9yIDIwNSBmb290IHRhcGVzCi0JICovCi0JaWYgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayA9PSAxMDAgJiYKLQkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDI4ICYmCi0JICAgIG1heF9mbG9wcHlfc2lkZSA9PSA5ICYmCi0JICAgIG1heF9mbG9wcHlfdHJhY2sgPT0gMTQ5ICYmCi0JICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDEyOCkgewotVFJBQ0UoZnRfdF9pbmZvLCAidGhlIENvbUJ5dGUgYnVnOiBtYXhfZmxvcHB5X3NpZGUgaW5jb3JyZWN0ISIpOwotCQltYXhfZmxvcHB5X3NpZGUgPSA0OwotCX0KLQkvKiBOZXh0LCBmb3IgMzA3IGZvb3QgdGFwZXMuICovCi0JaWYgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayA9PSAxNTAgJiYKLQkgICAgZnRfdHJhY2tzX3Blcl90YXBlID09IDI4ICYmCi0JICAgIG1heF9mbG9wcHlfc2lkZSA9PSA5ICYmCi0JICAgIG1heF9mbG9wcHlfdHJhY2sgPT0gMTQ5ICYmCi0JICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDEyOCkgewotVFJBQ0UoZnRfdF9pbmZvLCAidGhlIENvbUJ5dGUgYnVnOiBtYXhfZmxvcHB5X3NpZGUgaW5jb3JyZWN0ISIpOwotCQltYXhfZmxvcHB5X3NpZGUgPSA2OwotCX0KLQkvKiAgVGhpcyB0ZXN0IHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHdyb25nIHBhcmFtZXRlciBvbiB0YXBlcwotCSAqICBmb3JtYXR0ZWQgYnkgQ29sb3JhZG8gV2luZG93cyBzb2Z0d2FyZS4KLQkgKi8KLQlpZiAoZnRfc2VnbWVudHNfcGVyX3RyYWNrID09IDE1MCAmJgotCSAgICBmdF90cmFja3NfcGVyX3RhcGUgPT0gMjggJiYKLQkgICAgbWF4X2Zsb3BweV9zaWRlID09IDYgJiYKLQkgICAgbWF4X2Zsb3BweV90cmFjayA9PSAxNTAgJiYKLQkgICAgbWF4X2Zsb3BweV9zZWN0b3IgPT0gMTI4KSB7Ci1UUkFDRShmdF90X2luZm8sICJ0aGUgZmFtb3VzIENvbG9yYWRvIGJ1ZzogbWF4X2Zsb3BweV90cmFjayBvZmYgYnkgb25lICEiKTsKLQkJbWF4X2Zsb3BweV90cmFjayA9IDE0OTsKLQl9Ci0JZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgPSAoKG1heF9mbG9wcHlfc2VjdG9yL0ZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpICoKLQkJCQkgICAobWF4X2Zsb3BweV90cmFjayArIDEpKTsKLQkvKiAgVGhpcyB0ZXN0IHdpbGwgY29tcGVuc2F0ZSBmb3Igc29tZSBidWcgcmVwb3J0ZWQgYnkgRGltYQotCSAqICBCcm9kc2t5LiAgU2VlbXMgdG8gYmUgYSBDb2xvcmFkbyBidWcsIGVpdGhlci4gKGZyZWViZWUKLQkgKiAgSW1hdGlvbiB0YXBlIHNoaXBwZWQgdG9nZXRoZXIgd2l0aCBDb2xvcmFkbyBUMzAwMAotCSAqLwotCWlmICgoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSAmJgotCSAgICBmdF90cmFja3NfcGVyX3RhcGUgPT0gNTAgJiYKLQkgICAgbWF4X2Zsb3BweV9zaWRlID09IDU0ICYmCi0JICAgIG1heF9mbG9wcHlfdHJhY2sgPT0gMjU1ICYmCi0JICAgIG1heF9mbG9wcHlfc2VjdG9yID09IDEyOCkgewotVFJBQ0UoZnRfdF9pbmZvLCAidGhlIGZhbW91cyA/Pz8gYnVnOiBtYXhfZmxvcHB5X3RyYWNrIG9mZiBieSBvbmUgISIpOwotCQltYXhfZmxvcHB5X3RyYWNrID0gMjU0OwotCX0KLQkvKgotCSAqICAgIFZlcmlmeSBkcml2ZV9jb25maWd1cmF0aW9uIHdpdGggdGFwZSBwYXJhbWV0ZXJzCi0JICovCi0JaWYgKGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkID09IDAgfHwgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID09IDAgfHwKLQkgICgoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlIC0gMSkgLyBmdGFwZV9zZWdtZW50c19wZXJfaGVhZAotCSAgICE9IG1heF9mbG9wcHlfc2lkZSkgfHwKLQkgICAgKGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkIC8gZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyIC0gMSAhPSBtYXhfZmxvcHB5X3RyYWNrKSB8fAotCShmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICE9IG1heF9mbG9wcHlfc2VjdG9yKQotI2lmZGVmIFRFU1RJTkcKLQkgICAgfHwgKChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpICYmIAotCQkobWF4X2Zsb3BweV90cmFjayAhPSAyNTQgfHwgbWF4X2Zsb3BweV9zZWN0b3IgIT0gMTI4KSkKLSNlbmRpZgotCSAgICkgewotCQljaGFyIHNlZ3BlcmhlYWR6ID0gZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgPyAnICcgOiAnPyc7Ci0JCWNoYXIgc2VncGVyY3lseiAgPSBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgPyAnICcgOiAnPyc7Ci0JCVRSQUNFKGZ0X3RfZXJyLCJUYXBlIHBhcmFtZXRlcnMgaW5jb25zaXN0ZW5jeSwgcGxlYXNlIHJlcG9ydCIpOwotCQlUUkFDRShmdF90X2VyciwgInJlcG9ydGVkID0gJWQvJWQvJWQvJWQvJWQvJWQiLAotCQkgICAgICBmdF9mb3JtYXRfY29kZSwKLQkJICAgICAgZnRfc2VnbWVudHNfcGVyX3RyYWNrLAotCQkgICAgICBmdF90cmFja3NfcGVyX3RhcGUsCi0JCSAgICAgIG1heF9mbG9wcHlfc2lkZSwKLQkJICAgICAgbWF4X2Zsb3BweV90cmFjaywKLQkJICAgICAgbWF4X2Zsb3BweV9zZWN0b3IpOwotCQlUUkFDRShmdF90X2VyciwgInJlcXVpcmVkID0gJWQvJWQvJWQvJWQlYy8lZCVjLyVkIiwKLQkJICAgICAgZnRfZm9ybWF0X2NvZGUsCi0JCSAgICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywKLQkJICAgICAgZnRfdHJhY2tzX3Blcl90YXBlLAotCQkgICAgICBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCA/Ci0JCSAgICAgICgoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlIC0xKSAvIAotCQkgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgKSA6Ci0JCQkoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlIC0xKSwKLQkJCXNlZ3BlcmhlYWR6LAotCQkgICAgICBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgPwotCQkgICAgICAoZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgLyAKLQkJICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAtIDEgKSA6Ci0JCQlmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAtIDEsCi0JCQlzZWdwZXJjeWx6LAotCQkgICAgICAoZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyICogRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkpOwotCQlUUkFDRV9FWElUIC1FSU87Ci0JfQotCWZ0YXBlX2V4dHJhY3RfYmFkX3NlY3Rvcl9tYXAoYWRkcmVzcyk7Ci0gCVRSQUNFX0VYSVQgMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjlmOTlmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9SRUFEX0gKLSNkZWZpbmUgX0ZUQVBFX1JFQURfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjIgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgZnVuY3Rpb25zCi0gKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICoKLSAqLwotCi0vKiAgICAgIGZ0YXBlLXJlYWQuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0JRlRfUkRfU0lOR0xFID0gMCwKLQlGVF9SRF9BSEVBRCAgPSAxLAotfSBmdF9yZWFkX21vZGVfdDsKLQotZXh0ZXJuIGludCBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KF9fdTggKmFkZHJlc3MpOwotZXh0ZXJuIGludCBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoX191OCAqYWRkcmVzcyk7Ci1leHRlcm4gaW50IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihjb25zdCBpbnQgc2VnbWVudCwKLQkJCQkgICAgICAgdm9pZCAgKmFkZHJlc3MsIAotCQkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCi0JCQkJICAgICAgIGNvbnN0IGludCBzdGFydCwKLQkJCQkgICAgICAgY29uc3QgaW50IHNpemUpOwotI2RlZmluZSBmdGFwZV9yZWFkX3NlZ21lbnQoc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlKQkJCVwKLQlmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlLAlcCi0JCQkJICAgIDAsIEZUX1NFR01FTlRfU0laRSkKLWV4dGVybiB2b2lkIGZ0YXBlX3phcF9yZWFkX2J1ZmZlcnModm9pZCk7Ci0KLSNlbmRpZgkJCQkvKiBfRlRBUEVfUkVBRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ2ZGMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MiArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmMsdiAkCi0gKiAkUmV2aXNpb246IDEuNyAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8yOCAxNDoyNjo0OSAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBjb21tb24gY29kZSBmb3IgdGhlIHNlZ21lbnQgcmVhZCBhbmQKLSAqICAgICAgc2VnbWVudCB3cml0ZSByb3V0aW5lcyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvcgotICogICAgICBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi1pbnQgZnRfbnJfYnVmZmVyczsKLWJ1ZmZlcl9zdHJ1Y3QgKmZ0X2J1ZmZlcltGVF9NQVhfTlJfQlVGRkVSU107Ci1zdGF0aWMgdm9sYXRpbGUgaW50IGZ0X2hlYWQ7Ci1zdGF0aWMgdm9sYXRpbGUgaW50IGZ0X3RhaWw7CS8qIG5vdCB2b2xhdGlsZSBidXQgbmVlZCBzYW1lIHR5cGUgYXMgaGVhZCAqLwotaW50IGZkY19zZXR1cF9lcnJvcjsKLWxvY2F0aW9uX3JlY29yZCBmdF9sb2NhdGlvbiA9IHstMSwgMH07Ci12b2xhdGlsZSBpbnQgZnRhcGVfdGFwZV9ydW5uaW5nOwotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLXN0YXRpYyBpbnQgb3ZlcnJ1bl9jb3VudF9vZmZzZXQ7Ci1zdGF0aWMgaW50IGluaGliaXRfY29ycmVjdGlvbjsKLQotLyogIG1heG1pbWFsIGFsbG93ZWQgb3ZlcnNob290IHdoZW4gZmFzdCBzZWVraW5nCi0gKi8KLSNkZWZpbmUgT1ZFUlNIT09UX0xJTUlUIDEwCi0KLS8qICAgICAgSW5jcmVtZW50IGN5Y2xpYyBidWZmZXIgbnIuCi0gKi8KLWJ1ZmZlcl9zdHJ1Y3QgKmZ0YXBlX25leHRfYnVmZmVyKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcykKLXsKLQlzd2l0Y2ggKHBvcykgewotCWNhc2UgZnRfcXVldWVfaGVhZDoKLQkJaWYgKCsrZnRfaGVhZCA+PSBmdF9ucl9idWZmZXJzKSB7Ci0JCQlmdF9oZWFkID0gMDsKLQkJfQotCQlyZXR1cm4gZnRfYnVmZmVyW2Z0X2hlYWRdOwotCWNhc2UgZnRfcXVldWVfdGFpbDoKLQkJaWYgKCsrZnRfdGFpbCA+PSBmdF9ucl9idWZmZXJzKSB7Ci0JCQlmdF90YWlsID0gMDsKLQkJfQotCQlyZXR1cm4gZnRfYnVmZmVyW2Z0X3RhaWxdOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLWludCBmdGFwZV9idWZmZXJfaWQoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKQotewotCXN3aXRjaChwb3MpIHsKLQljYXNlIGZ0X3F1ZXVlX2hlYWQ6IHJldHVybiBmdF9oZWFkOwotCWNhc2UgZnRfcXVldWVfdGFpbDogcmV0dXJuIGZ0X3RhaWw7Ci0JZGVmYXVsdDogcmV0dXJuIC0xOwotCX0KLX0KLWJ1ZmZlcl9zdHJ1Y3QgKmZ0YXBlX2dldF9idWZmZXIoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKQotewotCXN3aXRjaChwb3MpIHsKLQljYXNlIGZ0X3F1ZXVlX2hlYWQ6IHJldHVybiBmdF9idWZmZXJbZnRfaGVhZF07Ci0JY2FzZSBmdF9xdWV1ZV90YWlsOiByZXR1cm4gZnRfYnVmZmVyW2Z0X3RhaWxdOwotCWRlZmF1bHQ6IHJldHVybiBOVUxMOwotCX0KLX0KLXZvaWQgZnRhcGVfcmVzZXRfYnVmZmVyKHZvaWQpCi17Ci0JZnRfaGVhZCA9IGZ0X3RhaWwgPSAwOwotfQotCi1idWZmZXJfc3RhdGVfZW51bSBmdGFwZV9zZXRfc3RhdGUoYnVmZmVyX3N0YXRlX2VudW0gbmV3X3N0YXRlKQotewotCWJ1ZmZlcl9zdGF0ZV9lbnVtIG9sZF9zdGF0ZSA9IGZ0X2RyaXZlcl9zdGF0ZTsKLQotCWZ0X2RyaXZlcl9zdGF0ZSA9IG5ld19zdGF0ZTsKLQlyZXR1cm4gb2xkX3N0YXRlOwotfQotLyogICAgICBDYWxjdWxhdGUgRmxvcHB5IERpc2sgQ29udHJvbGxlciBhbmQgRE1BIHBhcmFtZXRlcnMgZm9yIGEgc2VnbWVudC4KLSAqICAgICAgaGVhZDogICBzZWxlY3RzIGJ1ZmZlciBzdHJ1Y3QgaW4gYXJyYXkuCi0gKiAgICAgIG9mZnNldDogbnVtYmVyIG9mIHBoeXNpY2FsIHNlY3RvcnMgdG8gc2tpcCAoaW5jbHVkaW5nIGJhZCBvbmVzKS4KLSAqICAgICAgY291bnQ6ICBudW1iZXIgb2YgcGh5c2ljYWwgc2VjdG9ycyB0byBoYW5kbGUgKGluY2x1ZGluZyBiYWQgb25lcykuCi0gKi8KLXN0YXRpYyBpbnQgc2V0dXBfc2VnbWVudChidWZmZXJfc3RydWN0ICogYnVmZiwgCi0JCQkgaW50IHNlZ21lbnRfaWQsCi0JCQkgdW5zaWduZWQgaW50IHNlY3Rvcl9vZmZzZXQsIAotCQkJIHVuc2lnbmVkIGludCBzZWN0b3JfY291bnQsIAotCQkJIGludCByZXRyeSkKLXsKLQlTZWN0b3JNYXAgb2Zmc2V0X21hc2s7Ci0JU2VjdG9yTWFwIG1hc2s7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWJ1ZmYtPnNlZ21lbnRfaWQgPSBzZWdtZW50X2lkOwotCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPSBzZWN0b3Jfb2Zmc2V0OwotCWJ1ZmYtPnJlbWFpbmluZyA9IHNlY3Rvcl9jb3VudDsKLQlidWZmLT5oZWFkID0gc2VnbWVudF9pZCAvIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkOwotCWJ1ZmYtPmN5bCA9IChzZWdtZW50X2lkICUgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQpIC8gZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyOwotCWJ1ZmYtPnNlY3QgPSAoc2VnbWVudF9pZCAlIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlcikgKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICsgMTsKLQlidWZmLT5kZWxldGVkID0gMDsKLQlvZmZzZXRfbWFzayA9ICgxIDw8IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpIC0gMTsKLQltYXNrID0gZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudF9pZCkgJiBvZmZzZXRfbWFzazsKLQl3aGlsZSAobWFzaykgewotCQlpZiAobWFzayAmIDEpIHsKLQkJCW9mZnNldF9tYXNrID4+PSAxOwkvKiBkb24ndCBjb3VudCBiYWQgc2VjdG9yICovCi0JCX0KLQkJbWFzayA+Pj0gMTsKLQl9Ci0JYnVmZi0+ZGF0YV9vZmZzZXQgPSBjb3VudF9vbmVzKG9mZnNldF9tYXNrKTsJLyogZ29vZCBzZWN0b3JzIHRvIHNraXAgKi8KLQlidWZmLT5wdHIgPSBidWZmLT5hZGRyZXNzICsgYnVmZi0+ZGF0YV9vZmZzZXQgKiBGVF9TRUNUT1JfU0laRTsKLQlUUkFDRShmdF90X2Zsb3csICJkYXRhIG9mZnNldCA9ICVkIHNlY3RvcnMiLCBidWZmLT5kYXRhX29mZnNldCk7Ci0JaWYgKHJldHJ5KSB7Ci0JCWJ1ZmYtPnNvZnRfZXJyb3JfbWFwICY9IG9mZnNldF9tYXNrOwkvKiBrZWVwIHNraXBwZWQgcGFydCAqLwotCX0gZWxzZSB7Ci0JCWJ1ZmYtPmhhcmRfZXJyb3JfbWFwID0gYnVmZi0+c29mdF9lcnJvcl9tYXAgPSAwOwotCX0KLQlidWZmLT5iYWRfc2VjdG9yX21hcCA9IGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGJ1ZmYtPnNlZ21lbnRfaWQpOwotCWlmIChidWZmLT5iYWRfc2VjdG9yX21hcCAhPSAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZWdtZW50OiAlZCwgYmFkIHNlY3RvciBtYXA6ICUwOGx4IiwKLQkJCWJ1ZmYtPnNlZ21lbnRfaWQsIChsb25nKWJ1ZmYtPmJhZF9zZWN0b3JfbWFwKTsKLQl9IGVsc2UgewotCQlUUkFDRShmdF90X2Zsb3csICJzZWdtZW50OiAlZCIsIGJ1ZmYtPnNlZ21lbnRfaWQpOwotCX0KLQlpZiAoYnVmZi0+c2VjdG9yX29mZnNldCA+IDApIHsKLQkJYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPj49IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7Ci0JfQotCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0ICE9IDAgfHwgYnVmZi0+cmVtYWluaW5nICE9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpIHsKLQkJVFJBQ0UoZnRfdF9mbG93LCAic2VjdG9yIG9mZnNldCA9ICVkLCBjb3VudCA9ICVkIiwKLQkJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQsIGJ1ZmYtPnJlbWFpbmluZyk7Ci0JfQotCS8qICAgIFNlZ21lbnRzIHdpdGggMyBvciBsZXNzIHNlY3RvcnMgYXJlIG5vdCB3cml0dGVuIHdpdGggdmFsaWQKLQkgKiAgICBkYXRhIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3BhY2UgbGVmdCBmb3IgdGhlIGVjYy4gIFRoZQotCSAqICAgIGRhdGEgd3JpdHRlbiBpcyB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIGluIHRoZSBidWZmZXIuCi0JICogICAgUmVhZGluZyBzdWNoIGEgc2VnbWVudCB3aWxsIHJldHVybiBhIHplcm8gYnl0ZS1jb3VudC4KLQkgKiAgICBUbyBhbGxvdyB1cyB0byByZWFkL3dyaXRlIHNlZ21lbnRzIHdpdGggYWxsIGJhZCBzZWN0b3JzCi0JICogICAgd2UgZmFrZSBvbmUgcmVhZGFibGUgc2VjdG9yIGluIHRoZSBzZWdtZW50LiBUaGlzCi0JICogICAgcHJldmVudHMgaGF2aW5nIHRvIGhhbmRsZSB0aGVzZSBzZWdtZW50cyBpbiBhIHZlcnkKLQkgKiAgICBzcGVjaWFsIHdheS4gIEl0IGlzIG5vdCBpbXBvcnRhbnQgaWYgdGhlIHJlYWRpbmcgb2YgdGhpcwotCSAqICAgIGJhZCBzZWN0b3IgZmFpbHMgb3Igbm90ICh0aGUgZGF0YSBpcyBpZ25vcmVkKS4gSXQgaXMKLQkgKiAgICBvbmx5IHJlYWQgdG8ga2VlcCB0aGUgZHJpdmVyIHJ1bm5pbmcuCi0JICoKLQkgKiAgICBUaGUgUUlDLTQwLzgwIHNwZWMuIGhhcyBubyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaGFuZGxlCi0JICogICAgdGhpcyBjYXNlLCBzbyB0aGlzIGlzIG15IGludGVycHJldGF0aW9uLiAgCi0JICovCi0JaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwID09IEVNUFRZX1NFR01FTlQpIHsKLQkJVFJBQ0UoZnRfdF9mbG93LCAiZW1wdHkgc2VnbWVudCAlZCwgZmFrZSBmaXJzdCBzZWN0b3IgZ29vZCIsCi0JCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOwotCQlpZiAoYnVmZi0+cHRyICE9IGJ1ZmYtPmFkZHJlc3MpIHsKLQkJCVRSQUNFKGZ0X3RfYnVnLCAiVGhpcyBpcyBhIGJ1ZzogJXAvJXAiLAotCQkJICAgICAgYnVmZi0+cHRyLCBidWZmLT5hZGRyZXNzKTsKLQkJfQotCQlidWZmLT5iYWRfc2VjdG9yX21hcCA9IEZBS0VfU0VHTUVOVDsKLQl9Ci0JZmRjX3NldHVwX2Vycm9yID0gMDsKLQlidWZmLT5uZXh0X3NlZ21lbnQgPSBzZWdtZW50X2lkICsgMTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgICAgQ2FsY3VsYXRlIEZsb3BweSBEaXNrIENvbnRyb2xsZXIgYW5kIERNQSBwYXJhbWV0ZXJzIGZvciBhIG5ldyBzZWdtZW50LgotICovCi1pbnQgZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYsIGludCBzZWdtZW50X2lkLCBpbnQgc2tpcCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdGF0aWMgaW50IG9sZF9zZWdtZW50X2lkID0gLTE7Ci0Jc3RhdGljIGJ1ZmZlcl9zdGF0ZV9lbnVtIG9sZF9mdF9kcml2ZXJfc3RhdGUgPSBpZGxlOwotCWludCByZXRyeSA9IDA7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gMDsKLQlpbnQgY291bnQgPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JVFJBQ0UoZnRfdF9mbG93LCAiJXMgc2VnbWVudCAlZCAob2xkID0gJWQpIiwKLQkgICAgICAoZnRfZHJpdmVyX3N0YXRlID09IHJlYWRpbmcgfHwgZnRfZHJpdmVyX3N0YXRlID09IHZlcmlmeWluZykgCi0JICAgICAgPyAicmVhZGluZyIgOiAid3JpdGluZyIsCi0JICAgICAgc2VnbWVudF9pZCwgb2xkX3NlZ21lbnRfaWQpOwotCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gb2xkX2Z0X2RyaXZlcl9zdGF0ZSkgewkvKiB3aGVuIHZlcmlmeWluZyAqLwotCQlvbGRfc2VnbWVudF9pZCA9IC0xOwotCQlvbGRfZnRfZHJpdmVyX3N0YXRlID0gZnRfZHJpdmVyX3N0YXRlOwotCX0KLQlpZiAoc2VnbWVudF9pZCA9PSBvbGRfc2VnbWVudF9pZCkgewotCQkrK2J1ZmYtPnJldHJ5OwotCQkrK2Z0X2hpc3RvcnkucmV0cmllczsKLQkJVFJBQ0UoZnRfdF9mbG93LCAic2V0dGluZyB1cCBmb3IgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7Ci0JCXJldHJ5ID0gMTsKLQkJaWYgKHNraXAgJiYgYnVmZi0+c2tpcCA+IDApIHsJLyogYWxsb3cgc2tpcCBvbiByZXRyeSAqLwotCQkJb2Zmc2V0ID0gYnVmZi0+c2tpcDsKLQkJCWNvdW50IC09IG9mZnNldDsKLQkJCVRSQUNFKGZ0X3RfZmxvdywgInNraXBwaW5nICVkIHNlY3RvcnMiLCBvZmZzZXQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJYnVmZi0+cmV0cnkgPSAwOwotCQlidWZmLT5za2lwID0gMDsKLQkJb2xkX3NlZ21lbnRfaWQgPSBzZWdtZW50X2lkOwotCX0KLQlyZXN1bHQgPSBzZXR1cF9zZWdtZW50KGJ1ZmYsIHNlZ21lbnRfaWQsIG9mZnNldCwgY291bnQsIHJldHJ5KTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyogICAgICBEZXRlcm1pbmUgc2l6ZSBvZiBuZXh0IGNsdXN0ZXIgb2YgZ29vZCBzZWN0b3JzLgotICovCi1pbnQgZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCi17Ci0JLyogU2tpcCBiYWQgc2VjdG9ycy4KLQkgKi8KLQl3aGlsZSAoYnVmZi0+cmVtYWluaW5nID4gMCAmJiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgJiAxKSAhPSAwKSB7Ci0JCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID4+PSAxOwotCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7Ci0JCS0tYnVmZi0+cmVtYWluaW5nOwotCX0KLQkvKiBGaW5kIG5leHQgY2x1c3RlciBvZiBnb29kIHNlY3RvcnMKLQkgKi8KLQlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gMCkgewkvKiBzcGVlZCB1cCAqLwotCQlidWZmLT5zZWN0b3JfY291bnQgPSBidWZmLT5yZW1haW5pbmc7Ci0JfSBlbHNlIHsKLQkJU2VjdG9yTWFwIG1hcCA9IGJ1ZmYtPmJhZF9zZWN0b3JfbWFwOwotCi0JCWJ1ZmYtPnNlY3Rvcl9jb3VudCA9IDA7Ci0JCXdoaWxlIChidWZmLT5zZWN0b3JfY291bnQgPCBidWZmLT5yZW1haW5pbmcgJiYgKG1hcCAmIDEpID09IDApIHsKLQkJCSsrYnVmZi0+c2VjdG9yX2NvdW50OwotCQkJbWFwID4+PSAxOwotCQl9Ci0JfQotCXJldHVybiBidWZmLT5zZWN0b3JfY291bnQ7Ci19Ci0KLS8qICBpZiBqdXN0IHBhc3NlZCB0aGUgbGFzdCBzZWdtZW50IG9uIGEgdHJhY2ssIHdhaXQgZm9yIEJPVAotICogIG9yIEVPVCBtYXJrLgotICovCi1pbnQgZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBsb2dpY2FsX2VvdCkgewotCQlpbnQgc3RhdHVzOwotCi0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIGF0IGxvZ2ljYWwgRU9UIik7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5zZWVrLCAmc3RhdHVzKSwpOwotCQlpZiAoKHN0YXR1cyAmIChRSUNfU1RBVFVTX0FUX0JPVCB8IFFJQ19TVEFUVVNfQVRfRU9UKSkgPT0gMCkgewotCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJlb3QvYm90IG5vdCByZWFjaGVkIik7Ci0JCX0KLQkJZnRfcnVubmVyX3N0YXR1cyA9IGVuZF9vZl90YXBlOwotCX0KLQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBlbmRfb2ZfdGFwZSkgewotCQlUUkFDRShmdF90X25vaXNlLCAicnVubmVyIHN0b3BwZWQgYmVjYXVzZSBvZiBsb2dpY2FsIEVPVCIpOwotCQlmdF9ydW5uZXJfc3RhdHVzID0gaWRsZTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX2JvdF9lb3QoaW50IHN0YXR1cykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChzdGF0dXMgJiAoUUlDX1NUQVRVU19BVF9CT1QgfCBRSUNfU1RBVFVTX0FUX0VPVCkpIHsKLQkJZnRfbG9jYXRpb24uYm90ID0gKChmdF9sb2NhdGlvbi50cmFjayAmIDEpID09IDAgPwotCQkJCShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0JPVCkgIT0gMDoKLQkJCQkoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9FT1QpICE9IDApOwotCQlmdF9sb2NhdGlvbi5lb3QgPSAhZnRfbG9jYXRpb24uYm90OwotCQlmdF9sb2NhdGlvbi5zZWdtZW50ID0gKGZ0X2xvY2F0aW9uLnRyYWNrICsKLQkJCShmdF9sb2NhdGlvbi5ib3QgPyAwIDogMSkpICogZnRfc2VnbWVudHNfcGVyX3RyYWNrIC0gMTsKLQkJZnRfbG9jYXRpb24uc2VjdG9yID0gLTE7Ci0JCWZ0X2xvY2F0aW9uLmtub3duICA9IDE7Ci0JCVRSQUNFKGZ0X3RfZmxvdywgInRhcGUgYXQgbG9naWNhbCAlcyIsCi0JCSAgICAgIGZ0X2xvY2F0aW9uLmJvdCA/ICJib3QiIDogImVvdCIpOwotCQlUUkFDRShmdF90X2Zsb3csICJzZWdtZW50ID0gJWQiLCBmdF9sb2NhdGlvbi5zZWdtZW50KTsKLQl9IGVsc2UgewotCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7Ci0JfQotCVRSQUNFX0VYSVQgZnRfbG9jYXRpb24ua25vd247Ci19Ci0KLS8qICAgICAgUmVhZCBJZCBvZiBmaXJzdCBzZWN0b3IgcGFzc2luZyB0YXBlIGhlYWQuCi0gKi8KLXN0YXRpYyBpbnQgZnRhcGVfcmVhZF9pZCh2b2lkKQotewotCWludCBzdGF0dXM7Ci0JX191OCBvdXRbMl07Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCS8qIEFzc3VtZSB0YXBlIGlzIHJ1bm5pbmcgb24gZW50cnksIGJlIGFibGUgdG8gaGFuZGxlCi0JICogc2l0dWF0aW9uIHdoZXJlIGl0IHN0b3BwZWQgb3IgaXMgc3RvcHBpbmcuCi0JICovCi0JZnRfbG9jYXRpb24ua25vd24gPSAwOwkvKiBkZWZhdWx0IGlzIGxvY2F0aW9uIG5vdCBrbm93biAqLwotCW91dFswXSA9IEZEQ19SRUFESUQ7Ci0Jb3V0WzFdID0gZnRfZHJpdmVfc2VsOwotCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKG91dCwgMiksKTsKLQlzd2l0Y2ggKGZkY19pbnRlcnJ1cHRfd2FpdCgyMCAqIEZUX1NFQ09ORCkpIHsKLQljYXNlIDA6Ci0JCWlmIChmZGNfc2VjdCA9PSAwKSB7Ci0JCQlpZiAoZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cygmc3RhdHVzKSA+PSAwICYmCi0JCQkgICAgKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpKSB7Ci0JCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKLQkJCQlUUkFDRShmdF90X2Zsb3csICJ0YXBlIGhhcyBzdG9wcGVkIik7Ci0JCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZnRfbG9jYXRpb24ua25vd24gPSAxOwotCQkJZnRfbG9jYXRpb24uc2VnbWVudCA9IChmdGFwZV9zZWdtZW50c19wZXJfaGVhZAotCQkJCQkgICAgICAgKiBmZGNfaGVhZAotCQkJCQkgICAgICAgKyBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIKLQkJCQkJICAgICAgICogZmRjX2N5bAotCQkJCQkgICAgICAgKyAoZmRjX3NlY3QgLSAxKQotCQkJCQkgICAgICAgLyBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKTsKLQkJCWZ0X2xvY2F0aW9uLnNlY3RvciA9ICgoZmRjX3NlY3QgLSAxKQotCQkJCQkgICAgICAlIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpOwotCQkJZnRfbG9jYXRpb24uZW90ID0gZnRfbG9jYXRpb24uYm90ID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIC1FVElNRToKLQkJLyogIERpZG4ndCBmaW5kIGlkIG9uIHRhcGUsIG11c3QgYmUgbmVhciBlbmQ6IFdhaXQKLQkJICogIHVudGlsIHN0b3BwZWQuCi0JCSAqLwotCQlpZiAoZnRhcGVfcmVhZHlfd2FpdChGVF9GT1JFVkVSLCAmc3RhdHVzKSA+PSAwKSB7Ci0JCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOwotCQkJVFJBQ0UoZnRfdF9mbG93LCAidGFwZSBoYXMgc3RvcHBlZCIpOwotCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qICBJbnRlcnJ1cHRlZCBvciBvdGhlcndpc2UgZmFpbGluZwotCQkgKiAgZmRjX2ludGVycnVwdF93YWl0KCkgCi0JCSAqLwotCQlUUkFDRShmdF90X2VyciwgImZkY19pbnRlcnJ1cHRfd2FpdCBmYWlsZWQiKTsKLQkJYnJlYWs7Ci0JfQotCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9mbG93LCAibm8gaWQgZm91bmQiKTsKLQl9Ci0JaWYgKGZ0X2xvY2F0aW9uLnNlY3RvciA9PSAwKSB7Ci0JCVRSQUNFKGZ0X3RfZmxvdywgInBhc3Npbmcgc2VnbWVudCAlZC8lZCIsCi0JCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAicGFzc2luZyBzZWdtZW50ICVkLyVkIiwKLQkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IGxvZ2ljYWxfZm9yd2FyZCh2b2lkKQotewotCWZ0YXBlX3RhcGVfcnVubmluZyA9IDE7Ci0JcmV0dXJuIGZ0YXBlX2NvbW1hbmQoUUlDX0xPR0lDQUxfRk9SV0FSRCk7Ci19Ci0KLWludCBmdGFwZV9zdG9wX3RhcGUoaW50ICpwc3RhdHVzKQotewotCWludCByZXRyeSA9IDA7Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWRvIHsKLQkJcmVzdWx0ID0gZnRhcGVfY29tbWFuZF93YWl0KFFJQ19TVE9QX1RBUEUsCi0JCQkJCSAgICBmdGFwZV90aW1lb3V0LnN0b3AsIHBzdGF0dXMpOwotCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCWlmICgoKnBzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSA9PSAwKSB7Ci0JCQkJcmVzdWx0ID0gLUVJTzsKLQkJCX0gZWxzZSB7Ci0JCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgKytyZXRyeSA8PSAzKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlUUkFDRShmdF90X2VyciwgImZhaWxlZCAhIChmYXRhbCkiKTsKLQl9Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLWludCBmdGFwZV9kdW1iX3N0b3Aodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCWludCBzdGF0dXM7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQkvKiAgQWJvcnQgY3VycmVudCBmZGMgb3BlcmF0aW9uIGlmIGl0J3MgYnVzeSAocHJvYmFibHkgcmVhZAotCSAqICBvciB3cml0ZSBvcGVyYXRpb24gcGVuZGluZykgd2l0aCBhIHJlc2V0LgotCSAqLwotCWlmIChmZGNfcmVhZHlfd2FpdCgxMDAgLyogdXNlYyAqLykgPCAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJhYm9ydGluZyBmZGMgb3BlcmF0aW9uIik7Ci0JCWZkY19yZXNldCgpOwotCX0KLQkvKiAgUmVhZGluZyBpZCdzIGFmdGVyIHRoZSBsYXN0IHNlZ21lbnQgb24gYSB0cmFjayBtYXkgZmFpbAotCSAqICBidXQgZXZlbnR1YWxseSB0aGUgZHJpdmUgd2lsbCBiZWNvbWUgcmVhZHkgKGxvZ2ljYWwgZW90KS4KLQkgKi8KLQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOwotCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKLQlkbyB7Ci0JCWlmIChyZXN1bHQgPT0gMCAmJiBzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7Ci0JCQkvKiBUYXBlIGlzIG5vdCBydW5uaW5nIGFueSBtb3JlLgotCQkJICovCi0JCQlUUkFDRShmdF90X25vaXNlLCAidGFwZSBhbHJlYWR5IGhhbHRlZCIpOwotCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOwotCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKLQkJfSBlbHNlIGlmIChmdGFwZV90YXBlX3J1bm5pbmcpIHsKLQkJCS8qICBUYXBlIGlzICh3YXMpIHN0aWxsIG1vdmluZy4KLQkJCSAqLwotI2lmZGVmIFRFU1RJTkcKLQkJCWZ0YXBlX3JlYWRfaWQoKTsKLSNlbmRpZgotCQkJcmVzdWx0ID0gZnRhcGVfc3RvcF90YXBlKCZzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJLyogIFRhcGUgbm90IHlldCByZWFkeSBidXQgc3RvcHBlZC4KLQkJCSAqLwotCQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnBhdXNlLCZzdGF0dXMpOwotCQl9Ci0JfSB3aGlsZSAoZnRhcGVfdGFwZV9ydW5uaW5nCi0JCSAmJiAhKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX05FVkVSX0JMT0NLKSkpOwotI2lmbmRlZiBURVNUSU5HCi0JZnRfbG9jYXRpb24ua25vd24gPSAwOwotI2VuZGlmCi0JaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwgZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgewotCQlmdF9ydW5uZXJfc3RhdHVzID0gaWRsZTsKLQl9Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qICAgICAgV2FpdCB1bnRpbCBydW5uZXIgaGFzIGZpbmlzaGVkIHRhaWwgYnVmZmVyLgotICoKLSAqLwotaW50IGZ0YXBlX3dhaXRfc2VnbWVudChidWZmZXJfc3RhdGVfZW51bSBzdGF0ZSkKLXsKLQlpbnQgc3RhdHVzOwotCWludCByZXN1bHQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0Jd2hpbGUgKGZ0X2J1ZmZlcltmdF90YWlsXS0+c3RhdHVzID09IHN0YXRlKSB7Ci0JCVRSQUNFKGZ0X3RfZmxvdywgInN0YXRlOiAlZCIsIGZ0X2J1ZmZlcltmdF90YWlsXS0+c3RhdHVzKTsKLQkJLyogIEZpcnN0IGJ1ZmZlciBzdGlsbCBiZWluZyB3b3JrZWQgb24sIHdhaXQgdXAgdG8gdGltZW91dC4KLQkJICoKLQkJICogIE5vdGU6IHdlIGNoZWNrIHR3byB0aW1lcyBmb3IgYmVpbmcga2lsbGVkLiA1MAotCQkgKiAgc2Vjb25kcyBhcmUgcXVpdGUgbG9uZy4gTm90ZSB0aGF0Ci0JCSAqICBmZGNfaW50ZXJydXB0X3dhaXQoKSBpcyBub3Qga2lsbGFibGUgYnkgYW55Ci0JCSAqICBtZWFucy4gZnRhcGVfcmVhZF9zZWdtZW50KCkgd2FudHMgdXMgdG8gcmV0dXJuCi0JCSAqICAtRUlOVFIgaW4gY2FzZSBvZiBhIHNpZ25hbC4gIAotCQkgKi8KLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQlyZXN1bHQgPSBmZGNfaW50ZXJydXB0X3dhaXQoNTAgKiBGVF9TRUNPTkQpOwotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlUUkFDRV9BQk9SVChyZXN1bHQsCi0JCQkJICAgIGZ0X3RfZXJyLCAiZmRjX2ludGVycnVwdF93YWl0IGZhaWxlZCIpOwotCQl9Ci0JCWlmIChmZGNfc2V0dXBfZXJyb3IpIHsKLQkJCS8qIHJlY292ZXIuLi4gRklYTUUgKi8KLQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAic2V0dXAgZXJyb3IiKTsKLQkJfQotCX0KLQlpZiAoZnRfYnVmZmVyW2Z0X3RhaWxdLT5zdGF0dXMgIT0gZXJyb3IpIHsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgImZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXM6IDB4JTAyeCIsIHN0YXR1cyk7Ci0JaWYgKChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSAmJiAKLQkgICAgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpKSB7Ci0JCXVuc2lnbmVkIGludCBlcnJvcjsKLQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7Ci0JCQotCQkvKiAgUmVwb3J0IGFuZCBjbGVhciBlcnJvciBzdGF0ZS4KLQkJICogIEluIGNhc2UgdGhlIGRyaXZlIGNhbid0IG9wZXJhdGUgYXQgdGhlIHNlbGVjdGVkCi0JCSAqICByYXRlLCBzZWxlY3QgdGhlIG5leHQgbG93ZXIgZGF0YSByYXRlLgotCQkgKi8KLQkJZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDEpOwotCQlpZiAoZXJyb3IgPT0gMzEgJiYgY29tbWFuZCA9PSBRSUNfTE9HSUNBTF9GT1JXQVJEKSB7Ci0JCQkvKiBkcml2ZSBkb2VzIG5vdCBhY2NlcHQgdGhpcyBkYXRhIHJhdGUgKi8KLQkJCWlmIChmdF9kYXRhX3JhdGUgPiAyNTApIHsKLQkJCQlUUkFDRShmdF90X2luZm8sCi0JCQkJICAgICAgIlByb2JhYmxlIGRhdGEgcmF0ZSBjb25mbGljdCIpOwotCQkJCVRSQUNFKGZ0X3RfaW5mbywKLQkJCQkgICAgICAiTG93ZXJpbmcgZGF0YSByYXRlIHRvICVkIEticHMiLAotCQkJCSAgICAgIGZ0X2RhdGFfcmF0ZSAvIDIpOwotCQkJCWZ0YXBlX2hhbGZfZGF0YV9yYXRlKCk7Ci0JCQkJaWYgKGZ0X2J1ZmZlcltmdF90YWlsXS0+cmV0cnkgPiAwKSB7Ci0JCQkJCS8qIGdpdmUgaXQgYSBjaGFuY2UgKi8KLQkJCQkJLS1mdF9idWZmZXJbZnRfdGFpbF0tPnJldHJ5OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogbm8gcmF0ZSBpcyBhY2NlcHRlZC4uLiAqLwotCQkJCVRSQUNFKGZ0X3RfZXJyLCAiV2UncmUgZGVhZCA6KCIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJVFJBQ0UoZnRfdF9lcnIsICJVbmtub3duIGVycm9yIik7Ci0JCX0KLQkJVFJBQ0VfRVhJVCAtRUlPOyAgIC8qIGcucC4gZXJyb3IgKi8KLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiBmb3J3YXJkICovIHN0YXRpYyBpbnQgc2Vla19mb3J3YXJkKGludCBzZWdtZW50X2lkLCBpbnQgZmFzdCk7Ci0KLXN0YXRpYyBpbnQgZmFzdF9zZWVrKGludCBjb3VudCwgaW50IHJldmVyc2UpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHN0YXR1czsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChjb3VudCA+IDApIHsKLQkJLyogIElmIHBvc2l0aW9uZWQgYXQgYmVnaW4gb3IgZW5kIG9mIHRhcGUsIGZhc3Qgc2Vla2luZyBuZWVkcwotCQkgKiAgc3BlY2lhbCB0cmVhdG1lbnQuCi0JCSAqICBTdGFydGluZyBmcm9tIGxvZ2ljYWwgYm90IG5lZWRzIGEgKHNsb3cpIHNlZWsgdG8gdGhlIGZpcnN0Ci0JCSAqICBzZWdtZW50IGJlZm9yZSB0aGUgaGlnaCBzcGVlZCBzZWVrLiBNb3N0IGRyaXZlcyBkbyB0aGlzCi0JCSAqICBhdXRvbWF0aWNhbGx5IGJ1dCBzb21lIG9sZGVyIGRvbid0LCBzbyB3ZSB0cmVhdCB0aGVtCi0JCSAqICBhbGwgdGhlIHNhbWUuCi0JCSAqICBTdGFydGluZyBmcm9tIGxvZ2ljYWwgZW90IGlzIGV2ZW4gbW9yZSBkaWZmaWN1bHQgYmVjYXVzZQotCQkgKiAgd2UgY2Fubm90IChzbG93KSByZXZlcnNlIHNlZWsgdG8gdGhlIGxhc3Qgc2VnbWVudC4KLQkJICogIFRPIEJFIElNUExFTUVOVEVELgotCQkgKi8KLQkJaW5oaWJpdF9jb3JyZWN0aW9uID0gMDsKLQkJaWYgKGZ0X2xvY2F0aW9uLmtub3duICYmCi0JCSAgICAoKGZ0X2xvY2F0aW9uLmJvdCAmJiAhcmV2ZXJzZSkgfHwKLQkJICAgICAoZnRfbG9jYXRpb24uZW90ICYmIHJldmVyc2UpKSkgewotCQkJaWYgKCFyZXZlcnNlKSB7Ci0JCQkJLyogIChzbG93KSBza2lwIHRvIGZpcnN0IHNlZ21lbnQgb24gYSB0cmFjawotCQkJCSAqLwotCQkJCXNlZWtfZm9yd2FyZChmdF9sb2NhdGlvbi50cmFjayAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgMCk7Ci0JCQkJLS1jb3VudDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogIFdoZW4gc2Vla2luZyBiYWNrd2FyZHMgZnJvbQotCQkJCSAqICBlbmQtb2YtdGFwZSB0aGUgbnVtYmVyIG9mIGVyYXNlZAotCQkJCSAqICBnYXBzIGZvdW5kIHNlZW1zIHRvIGJlIGhpZ2hlciB0aGFuCi0JCQkJICogIGV4cGVjdGVkLiAgVGhlcmVmb3IgdGhlIGRyaXZlIG11c3QKLQkJCQkgKiAgc2tpcCBzb21lIG1vcmUgc2VnbWVudHMgdGhhbgotCQkJCSAqICBjYWxjdWxhdGVkLCBidXQgd2UgZG9uJ3Qga25vdyBob3cKLQkJCQkgKiAgbWFueS4gIFRodXMgd2Ugd2lsbCBwcmV2ZW50IHRoZQotCQkJCSAqICByZS1jYWxjdWxhdGlvbiBvZiBvZmZzZXQgYW5kCi0JCQkJICogIG92ZXJzaG9vdCB3aGVuIHNlZWtpbmcgYmFja3dhcmRzLgotCQkJCSAqLwotCQkJCWluaGliaXRfY29ycmVjdGlvbiA9IDE7Ci0JCQkJY291bnQgKz0gMzsJLyogYmVzdCBndWVzcyAqLwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9mbG93LCAid2FybmluZzogemVybyBvciBuZWdhdGl2ZSBjb3VudDogJWQiLCBjb3VudCk7Ci0JfQotCWlmIChjb3VudCA+IDApIHsKLQkJaW50IGk7Ci0JCWludCBuaWJibGVzID0gY291bnQgPiAyNTUgPyAzIDogMjsKLQotCQlpZiAoY291bnQgPiA0MDk1KSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgY2xpcHBlZCBhdCA0MDk1IHNlZ21lbnQiKTsKLQkJCWNvdW50ID0gNDA5NTsKLQkJfQotCQkvKiBJc3N1ZSB0aGlzIHRhcGUgY29tbWFuZCBmaXJzdC4gKi8KLQkJaWYgKCFyZXZlcnNlKSB7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgJWQgc2VnbWVudChzKSIsIGNvdW50KTsKLQkJCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmQobmliYmxlcyA9PSAzID8KLQkJCSAgIFFJQ19TS0lQX0VYVEVOREVEX0ZPUldBUkQgOiBRSUNfU0tJUF9GT1JXQVJEKTsKLQkJfSBlbHNlIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWNraW5nIHVwICVkIHNlZ21lbnQocykiLCBjb3VudCk7Ci0JCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kKG5pYmJsZXMgPT0gMyA/Ci0JCQkgICBRSUNfU0tJUF9FWFRFTkRFRF9SRVZFUlNFIDogUUlDX1NLSVBfUkVWRVJTRSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJTa2lwIGNvbW1hbmQgZmFpbGVkIik7Ci0JCX0gZWxzZSB7Ci0JCQktLWNvdW50OwkvKiAwIG1lYW5zIG9uZSBnYXAgZXRjLiAqLwotCQkJZm9yIChpID0gMDsgaSA8IG5pYmJsZXM7ICsraSkgewotCQkJCWlmIChyZXN1bHQgPj0gMCkgewotCQkJCQlyZXN1bHQgPSBmdGFwZV9wYXJhbWV0ZXIoY291bnQgJiAxNSk7Ci0JCQkJCWNvdW50IC89IDE2OwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5yZXdpbmQsICZzdGF0dXMpOwotCQkJaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKLQkJCX0KLQkJfQotCX0KLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCB2YWxpZGF0ZShpbnQgaWQpCi17Ci0JLyogQ2hlY2sgdG8gc2VlIGlmIHBvc2l0aW9uIGZvdW5kIGlzIG9mZi10cmFjayBhcyByZXBvcnRlZAotCSAqICBvbmNlLiAgQmVjYXVzZSBhbGwgdHJhY2tzIGluIG9uZSBkaXJlY3Rpb24gbGllIG5leHQgdG8KLQkgKiAgZWFjaCBvdGhlciwgaWYgb2ZmLXRyYWNrIHRoZSBlcnJvciB3aWxsIGJlIGFwcHJveGltYXRlbHkKLQkgKiAgMiAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjay4KLQkgKi8KLQlpZiAoZnRfbG9jYXRpb24udHJhY2sgPT0gLTEpIHsKLQkJcmV0dXJuIDE7IC8qIHVuZm9yc2VlbiBzaXR1YXRpb24sIGRvbid0IGdlbmVyYXRlIGVycm9yICovCi0JfSBlbHNlIHsKLQkJLyogVXNlIG1hcmdpbiBvZiBmdF9zZWdtZW50c19wZXJfdHJhY2sgb24gYm90aCBzaWRlcwotCQkgKiBiZWNhdXNlIGZ0YXBlIG5lZWRzIHNvbWUgbWFyZ2luIGFuZCB0aGUgZXJyb3Igd2UncmUKLQkJICogbG9va2luZyBmb3IgaXMgbXVjaCBsYXJnZXIgIQotCQkgKi8KLQkJaW50IGxvID0gKGZ0X2xvY2F0aW9uLnRyYWNrIC0gMSkgKiBmdF9zZWdtZW50c19wZXJfdHJhY2s7Ci0JCWludCBoaSA9IChmdF9sb2NhdGlvbi50cmFjayArIDIpICogZnRfc2VnbWVudHNfcGVyX3RyYWNrOwotCi0JCXJldHVybiAoaWQgPj0gbG8gJiYgaWQgPCBoaSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNlZWtfZm9yd2FyZChpbnQgc2VnbWVudF9pZCwgaW50IGZhc3QpCi17Ci0JaW50IGZhaWx1cmVzID0gMDsKLQlpbnQgY291bnQ7Ci0Jc3RhdGljIGludCBtYXJnaW4gPSAxOwkvKiBmaXhlZDogc3RvcCB0aGlzIGJlZm9yZSB0YXJnZXQgKi8KLQlzdGF0aWMgaW50IG92ZXJzaG9vdCA9IDE7Ci0Jc3RhdGljIGludCBtaW5fY291bnQgPSA4OwotCWludCBleHBlY3RlZCA9IC0xOwotCWludCB0YXJnZXQgPSBzZWdtZW50X2lkIC0gbWFyZ2luOwotCWludCBmYXN0X3NlZWtpbmc7Ci0JaW50IHByZXZfc2VnbWVudCA9IGZ0X2xvY2F0aW9uLnNlZ21lbnQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoIWZ0X2xvY2F0aW9uLmtub3duKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJmYXRhbDogY2Fubm90IHNlZWsgZnJvbSB1bmtub3duIGxvY2F0aW9uIik7Ci0JfQotCWlmICghdmFsaWRhdGUoc2VnbWVudF9pZCkpIHsKLQkJZnRhcGVfc2xlZXAoMSAqIEZUX1NFQ09ORCk7Ci0JCWZ0X2ZhaWx1cmUgPSAxOwotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAiZmF0YWw6IGhlYWQgb2ZmIHRyYWNrIChiYWQgaGFyZHdhcmU/KSIpOwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAiZnJvbSAlZC8lZCB0byAlZC8wIC0gJWQiLAotCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvcixzZWdtZW50X2lkLG1hcmdpbik7Ci0JY291bnQgPSB0YXJnZXQgLSBmdF9sb2NhdGlvbi5zZWdtZW50IC0gb3ZlcnNob290OwotCWZhc3Rfc2Vla2luZyA9IChmYXN0ICYmCi0JCQljb3VudCA+IChtaW5fY291bnQgKyAoZnRfbG9jYXRpb24uYm90ID8gMSA6IDApKSk7Ci0JaWYgKGZhc3Rfc2Vla2luZykgewotCQlUUkFDRShmdF90X25vaXNlLCAiZmFzdCBza2lwcGluZyAlZCBzZWdtZW50cyIsIGNvdW50KTsKLQkJZXhwZWN0ZWQgPSBzZWdtZW50X2lkIC0gbWFyZ2luOwotCQlmYXN0X3NlZWsoY291bnQsIDApOwotCX0KLQlpZiAoIWZ0YXBlX3RhcGVfcnVubmluZykgewotCQlsb2dpY2FsX2ZvcndhcmQoKTsKLQl9Ci0Jd2hpbGUgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCBzZWdtZW50X2lkKSB7Ci0JCS8qICBUaGlzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBzZWN0b3IgaW4gYSAoYmFkKSBzZWdtZW50IHRvCi0JCSAqICBoYXZlIGEgdmFsaWQgYW5kIHJlYWRhYmxlIHNlY3RvciBpZCAhCi0JCSAqICBJdCBsb29rcyBsaWtlIHRoaXMgaXMgbm90IGd1YXJhbnRlZWQsIHNvIHdlIG11c3QgdHJ5Ci0JCSAqICB0byBmaW5kIGEgd2F5IHRvIHNraXAgYW4gRU1QVFlfU0VHTUVOVC4gISEhIEZJWE1FICEhIQotCQkgKi8KLQkJaWYgKGZ0YXBlX3JlYWRfaWQoKSA8IDAgfHwgIWZ0X2xvY2F0aW9uLmtub3duIHx8Ci0JCSAgICBzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ET05UX0JMT0NLKSkgewotCQkJZnRfbG9jYXRpb24ua25vd24gPSAwOwotCQkJaWYgKCFmdGFwZV90YXBlX3J1bm5pbmcgfHwKLQkJCSAgICArK2ZhaWx1cmVzID4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgewotCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJCQkgICAgInJlYWRfaWQgZmFpbGVkIGNvbXBsZXRlbHkiKTsKLQkJCX0KLQkJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKLQkJCVRSQUNFKGZ0X3RfZmxvdywgInJlYWRfaWQgZmFpbGVkLCByZXRyeSAoJWQpIiwKLQkJCSAgICAgIGZhaWx1cmVzKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChmYXN0X3NlZWtpbmcpIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbmRlZCBhdCAlZC8lZCAoJWQsJWQpIiwKLQkJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvciwKLQkJCSAgICAgIG92ZXJzaG9vdCwgaW5oaWJpdF9jb3JyZWN0aW9uKTsKLQkJCWlmICghaW5oaWJpdF9jb3JyZWN0aW9uICYmCi0JCQkgICAgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCBleHBlY3RlZCB8fAotCQkJICAgICBmdF9sb2NhdGlvbi5zZWdtZW50ID4gZXhwZWN0ZWQgKyBtYXJnaW4pKSB7Ci0JCQkJaW50IGVycm9yID0gZnRfbG9jYXRpb24uc2VnbWVudCAtIGV4cGVjdGVkOwotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCQkJICAgICAgImFkanVzdGluZyBvdmVyc2hvb3QgZnJvbSAlZCB0byAlZCIsCi0JCQkJICAgICAgb3ZlcnNob290LCBvdmVyc2hvb3QgKyBlcnJvcik7Ci0JCQkJb3ZlcnNob290ICs9IGVycm9yOwotCQkJCS8qICBBbGwgb3ZlcnNob290cyBoYXZlIHRoZSBzYW1lCi0JCQkJICogIGRpcmVjdGlvbiwgc28gaXQgc2hvdWxkIG5ldmVyCi0JCQkJICogIGJlY29tZSBuZWdhdGl2ZSwgYnV0IHdobyBrbm93cy4KLQkJCQkgKi8KLQkJCQlpZiAob3ZlcnNob290IDwgLTUgfHwKLQkJCQkgICAgb3ZlcnNob290ID4gT1ZFUlNIT09UX0xJTUlUKSB7Ci0JCQkJCWlmIChvdmVyc2hvb3QgPCAwKSB7Ci0JCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KLQkJCQkJCW92ZXJzaG9vdCA9IC01OwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyoga2VlcCBzYW5lIHZhbHVlICovCi0JCQkJCQlvdmVyc2hvb3QgPSBPVkVSU0hPT1RfTElNSVQ7Ci0JCQkJCX0KLQkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJCQkJICAgICAgImNsaXBwZWQgb3ZlcnNob290IHRvICVkIiwKLQkJCQkJICAgICAgb3ZlcnNob290KTsKLQkJCQl9Ci0JCQl9Ci0JCQlmYXN0X3NlZWtpbmcgPSAwOwotCQl9Ci0JCWlmIChmdF9sb2NhdGlvbi5rbm93bikgewotCQkJaWYgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBwcmV2X3NlZ21lbnQgKyAxKSB7Ci0JCQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJCQkgICAgICAibWlzc2VkIHNlZ21lbnQgJWQgd2hpbGUgc2tpcHBpbmciLAotCQkJCSAgICAgIHByZXZfc2VnbWVudCArIDEpOwotCQkJfQotCQkJcHJldl9zZWdtZW50ID0gZnRfbG9jYXRpb24uc2VnbWVudDsKLQkJfQotCX0KLQlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCA+IHNlZ21lbnRfaWQpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywKLQkJCSAgICBmdF90X25vaXNlLCAiZmFpbGVkOiBza2lwIGVuZGVkIGF0IHNlZ21lbnQgJWQvJWQiLAotCQkJICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBza2lwX3JldmVyc2UoaW50IHNlZ21lbnRfaWQsIGludCAqcHN0YXR1cykKLXsKLQlpbnQgZmFpbHVyZXMgPSAwOwotCXN0YXRpYyBpbnQgb3ZlcnNob290ID0gMTsKLQlzdGF0aWMgaW50IG1pbl9yZXdpbmQgPSAyOwkvKiAxICsgb3ZlcnNob290ICovCi0Jc3RhdGljIGNvbnN0IGludCBtYXJnaW4gPSAxOwkvKiBzdG9wIHRoaXMgYmVmb3JlIHRhcmdldCAqLwotCWludCBleHBlY3RlZCA9IDA7Ci0JaW50IGNvdW50ID0gMTsKLQlpbnQgc2hvcnRfc2VlazsKLQlpbnQgdGFyZ2V0ID0gc2VnbWVudF9pZCAtIG1hcmdpbjsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChmdF9sb2NhdGlvbi5rbm93biAmJiAhdmFsaWRhdGUoc2VnbWVudF9pZCkpIHsKLQkJZnRhcGVfc2xlZXAoMSAqIEZUX1NFQ09ORCk7Ci0JCWZ0X2ZhaWx1cmUgPSAxOwotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAiZmF0YWw6IGhlYWQgb2ZmIHRyYWNrIChiYWQgaGFyZHdhcmU/KSIpOwotCX0KLQlkbyB7Ci0JCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKLQkJCVRSQUNFKGZ0X3Rfd2FybiwgIndhcm5pbmc6IGxvY2F0aW9uIG5vdCBrbm93biIpOwotCQl9Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJmcm9tICVkLyVkIHRvICVkLzAgLSAlZCIsCi0JCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvciwKLQkJICAgICAgc2VnbWVudF9pZCwgbWFyZ2luKTsKLQkJLyogIG1pbl9yZXdpbmQgPT0gMSArIG92ZXJzaG9vdF93aGVuX2RvaW5nX21pbmltdW1fcmV3aW5kCi0JCSAqICBvdmVyc2hvb3QgID09IG92ZXJzaG9vdF93aGVuX2RvaW5nX2xhcmdlcl9yZXdpbmQKLQkJICogIEluaXRpYWxseSBtaW5fcmV3aW5kID09IDEgKyBvdmVyc2hvb3QsIG9wdGltaXphdGlvbgotCQkgKiAgb2YgYm90aCB2YWx1ZXMgd2lsbCBiZSBkb25lIHNlcGFyYXRlbHkuCi0JCSAqICBvdmVyc2hvb3QgYW5kIG1pbl9yZXdpbmQgY2FuIGJlIG5lZ2F0aXZlIGFzIGJvdGggYXJlCi0JCSAqICBzdW1zIG9mIHRocmVlIGNvbXBvbmVudHM6Ci0JCSAqICBhbnlfb3ZlcnNob290ID09IHJld2luZF9vdmVyc2hvb3QgLSAKLQkJICogICAgICAgICAgICAgICAgICAgc3RvcF9vdmVyc2hvb3QgICAtCi0JCSAqICAgICAgICAgICAgICAgICAgIHN0YXJ0X292ZXJzaG9vdAotCQkgKi8KLQkJaWYgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSB0YXJnZXQgLSAobWluX3Jld2luZCAtIDEpIDwgMSkgewotCQkJc2hvcnRfc2VlayA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQljb3VudCA9IGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSB0YXJnZXQgLSBvdmVyc2hvb3Q7Ci0JCQlzaG9ydF9zZWVrID0gKGNvdW50IDwgMSk7Ci0JCX0KLQkJaWYgKHNob3J0X3NlZWspIHsKLQkJCWNvdW50ID0gMTsJLyogZG8gc2hvcnRlc3QgcmV3aW5kICovCi0JCQlleHBlY3RlZCA9IGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSBtaW5fcmV3aW5kOwotCQkJaWYgKGV4cGVjdGVkL2Z0X3NlZ21lbnRzX3Blcl90cmFjayAhPSBmdF9sb2NhdGlvbi50cmFjaykgewotCQkJCWV4cGVjdGVkID0gKGZ0X2xvY2F0aW9uLnRyYWNrICogCi0JCQkJCSAgICBmdF9zZWdtZW50c19wZXJfdHJhY2spOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXhwZWN0ZWQgPSB0YXJnZXQ7Ci0JCX0KLQkJZmFzdF9zZWVrKGNvdW50LCAxKTsKLQkJbG9naWNhbF9mb3J3YXJkKCk7Ci0JCWlmIChmdGFwZV9yZWFkX2lkKCkgPCAwIHx8ICFmdF9sb2NhdGlvbi5rbm93biB8fAotCQkgICAgKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spKSkgewotCQkJaWYgKCghZnRhcGVfdGFwZV9ydW5uaW5nICYmICFmdF9sb2NhdGlvbi5rbm93bikgfHwKLQkJCSAgICArK2ZhaWx1cmVzID4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgewotCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJCQkgICAgInJlYWRfaWQgZmFpbGVkIGNvbXBsZXRlbHkiKTsKLQkJCX0KLQkJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKLQkJCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMocHN0YXR1cyksKTsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmdGFwZV9yZWFkX2lkIGZhaWxlZCwgcmV0cnkgKCVkKSIsCi0JCQkgICAgICBmYWlsdXJlcyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlUUkFDRShmdF90X25vaXNlLCAiZW5kZWQgYXQgJWQvJWQgKCVkLCVkLCVkKSIsIAotCQkgICAgICBmdF9sb2NhdGlvbi5zZWdtZW50LCBmdF9sb2NhdGlvbi5zZWN0b3IsCi0JCSAgICAgIG1pbl9yZXdpbmQsIG92ZXJzaG9vdCwgaW5oaWJpdF9jb3JyZWN0aW9uKTsKLQkJaWYgKCFpbmhpYml0X2NvcnJlY3Rpb24gJiYKLQkJICAgIChmdF9sb2NhdGlvbi5zZWdtZW50IDwgZXhwZWN0ZWQgfHwKLQkJICAgICBmdF9sb2NhdGlvbi5zZWdtZW50ID4gZXhwZWN0ZWQgKyBtYXJnaW4pKSB7Ci0JCQlpbnQgZXJyb3IgPSBleHBlY3RlZCAtIGZ0X2xvY2F0aW9uLnNlZ21lbnQ7Ci0JCQlpZiAoc2hvcnRfc2VlaykgewotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCQkJICAgICAgImFkanVzdGluZyBtaW5fcmV3aW5kIGZyb20gJWQgdG8gJWQiLAotCQkJCSAgICAgIG1pbl9yZXdpbmQsIG1pbl9yZXdpbmQgKyBlcnJvcik7Ci0JCQkJbWluX3Jld2luZCArPSBlcnJvcjsKLQkJCQlpZiAobWluX3Jld2luZCA8IC01KSB7Ci0JCQkJCS8qIGlzIHRoaXMgcmlnaHQgPyBGSVhNRSAhICovCi0JCQkJCS8qIGtlZXAgc2FuZSB2YWx1ZSAqLwotCQkJCQltaW5fcmV3aW5kID0gLTU7Ci0JCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsIAotCQkJCQkgICAgICAiY2xpcHBlZCBtaW5fcmV3aW5kIHRvICVkIiwKLQkJCQkJICAgICAgbWluX3Jld2luZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlUUkFDRShmdF90X25vaXNlLAotCQkJCSAgICAgICJhZGp1c3Rpbmcgb3ZlcnNob290IGZyb20gJWQgdG8gJWQiLAotCQkJCSAgICAgIG92ZXJzaG9vdCwgb3ZlcnNob290ICsgZXJyb3IpOwotCQkJCW92ZXJzaG9vdCArPSBlcnJvcjsKLQkJCQlpZiAob3ZlcnNob290IDwgLTUgfHwKLQkJCQkgICAgb3ZlcnNob290ID4gT1ZFUlNIT09UX0xJTUlUKSB7Ci0JCQkJCWlmIChvdmVyc2hvb3QgPCAwKSB7Ci0JCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KLQkJCQkJCW92ZXJzaG9vdCA9IC01OwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyoga2VlcCBzYW5lIHZhbHVlICovCi0JCQkJCQlvdmVyc2hvb3QgPSBPVkVSU0hPT1RfTElNSVQ7Ci0JCQkJCX0KLQkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJCQkJICAgICAgImNsaXBwZWQgb3ZlcnNob290IHRvICVkIiwKLQkJCQkJICAgICAgb3ZlcnNob290KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChmdF9sb2NhdGlvbi5zZWdtZW50ID4gc2VnbWVudF9pZCk7Ci0JaWYgKGZ0X2xvY2F0aW9uLmtub3duKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJjdXJyZW50IGxvY2F0aW9uOiAlZC8lZCIsCi0JCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBkZXRlcm1pbmVfcG9zaXRpb24odm9pZCkKLXsKLQlpbnQgcmV0cnkgPSAwOwotCWludCBzdGF0dXM7Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICghZnRhcGVfdGFwZV9ydW5uaW5nKSB7Ci0JCS8qICBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0YXBlIGlzIHN0b3BwZWQgYnkgaXNyLgotCQkgKi8KLQkJVFJBQ0UoZnRfdF9mbG93LCAid2FpdGluZyBmb3IgdGFwZSBzdG9wIik7Ci0JCWlmIChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsICZzdGF0dXMpIDwgMCkgewotCQkJVFJBQ0UoZnRfdF9mbG93LCAiZHJpdmUgc3RpbGwgcnVubmluZyAoZmF0YWwpIik7Ci0JCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAxOwkvKiA/ICovCi0JCX0KLQl9IGVsc2UgewotCQlmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOwotCX0KLQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgewotCQkvKiAgRHJpdmUgbXVzdCBiZSByZWFkeSB0byBjaGVjayBlcnJvciBzdGF0ZSAhCi0JCSAqLwotCQlUUkFDRShmdF90X2Zsb3csICJkcml2ZSBpcyByZWFkeSIpOwotCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgewotCQkJdW5zaWduZWQgaW50IGVycm9yOwotCQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7Ci0KLQkJCS8qICBSZXBvcnQgYW5kIGNsZWFyIGVycm9yIHN0YXRlLCB0cnkgdG8gY29udGludWUuCi0JCQkgKi8KLQkJCVRSQUNFKGZ0X3RfZmxvdywgImVycm9yIHN0YXR1cyBzZXQiKTsKLQkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKLQkJCWZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5yZXNldCwgJnN0YXR1cyk7Ci0JCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOwkvKiA/ICovCi0JCX0KLQkJaWYgKGNoZWNrX2JvdF9lb3Qoc3RhdHVzKSkgewotCQkJaWYgKGZ0X2xvY2F0aW9uLmJvdCkgewotCQkJCWlmICgoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgPT0gMCkgewotCQkJCQkvKiB0YXBlIG1vdmluZyBhd2F5IGZyb20KLQkJCQkJICogYm90L2VvdCwgbGV0J3Mgc2VlIGlmIHdlCi0JCQkJCSAqIGNhbiBjYXRjaCB1cCB3aXRoIHRoZSBmaXJzdAotCQkJCQkgKiBzZWdtZW50IG9uIHRoaXMgdHJhY2suCi0JCQkJCSAqLwotCQkJCX0gZWxzZSB7Ci0JCQkJCVRSQUNFKGZ0X3RfZmxvdywKLQkJCQkJICAgICAgInN0YXJ0IHRhcGUgZnJvbSBsb2dpY2FsIGJvdCIpOwotCQkJCQlsb2dpY2FsX2ZvcndhcmQoKTsJLyogc3RhcnQgbW92aW5nICovCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpID09IDApIHsKLQkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIndhaXRpbmcgZm9yIGxvZ2ljYWwgZW5kIG9mIHRyYWNrIik7Ci0JCQkJCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5yZXNldCwgJnN0YXR1cyk7Ci0JCQkJCS8qIGVycm9yIGhhbmRsaW5nIG5lZWRlZCA/ICovCi0JCQkJfSBlbHNlIHsKLQkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJCQkJICAgICAgInRhcGUgYXQgbG9naWNhbCBlbmQgb2YgdHJhY2siKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRShmdF90X2Zsb3csICJzdGFydCB0YXBlIik7Ci0JCQlsb2dpY2FsX2ZvcndhcmQoKTsJLyogc3RhcnQgbW92aW5nICovCi0JCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CS8qIG5vdCBjbGVhcmVkIGJ5IGxvZ2ljYWwgZm9yd2FyZCAhICovCi0JCX0KLQl9Ci0JLyogdGFwZSBzaG91bGQgYmUgbW92aW5nIG5vdywgc3RhcnQgcmVhZGluZyBpZCdzCi0JICovCi0Jd2hpbGUgKCFmdF9sb2NhdGlvbi5rbm93biAmJgotCSAgICAgICByZXRyeSsrIDwgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAmJgotCSAgICAgICAocmVzdWx0ID0gZnRhcGVfcmVhZF9pZCgpKSA8IDApIHsKLQotCQlUUkFDRShmdF90X2Zsb3csICJsb2NhdGlvbiB1bmtub3duIik7Ci0KLQkJLyogZXhpdCBvbiBzaWduYWwKLQkJICovCi0JCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKLQotCQkvKiAgcmVhZC1pZCBzb21laG93IGZhaWxlZCwgdGFwZSBtYXkKLQkJICogIGhhdmUgcmVhY2hlZCBlbmQgb3Igc29tZSBvdGhlcgotCQkgKiAgZXJyb3IgaGFwcGVuZWQuCi0JCSAqLwotCQlUUkFDRShmdF90X2Zsb3csICJyZWFkLWlkIGZhaWxlZCIpOwotCQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1czogMHglMDJ4Iiwgc3RhdHVzKTsKLQkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpIHsKLQkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7Ci0JCQlUUkFDRShmdF90X25vaXNlLCAidGFwZSBzdG9wcGVkIGZvciB1bmtub3duIHJlYXNvbiEgIgotCQkJICAgICAgInN0YXR1cyA9IDB4JTAyeCIsIHN0YXR1cyk7Ci0JCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUiB8fAotCQkJICAgICFjaGVja19ib3RfZW90KHN0YXR1cykpIHsKLQkJCQkvKiBvb3BzLCB0YXBlIHN0b3BwZWQgYnV0IG5vdCBhdCBlbmQhCi0JCQkJICovCi0JCQkJVFJBQ0VfRVhJVCAtRUlPOwotCQkJfQotCQl9Ci0JfQotCVRSQUNFKGZ0X3RfZmxvdywKLQkgICAgICAidGFwZSBpcyBwb3NpdGlvbmVkIGF0IHNlZ21lbnQgJWQiLCBmdF9sb2NhdGlvbi5zZWdtZW50KTsKLQlUUkFDRV9FWElUIGZ0X2xvY2F0aW9uLmtub3duID8gMCA6IC1FSU87Ci19Ci0KLS8qICAgICAgR2V0IHRoZSB0YXBlIHJ1bm5pbmcgYW5kIHBvc2l0aW9uIGl0IGp1c3QgYmVmb3JlIHRoZQotICogICAgICByZXF1ZXN0ZWQgc2VnbWVudC4KLSAqICAgICAgU2VlayB0YXBlLXRyYWNrIGFuZCByZXBvc2l0aW9uIGFzIG5lZWRlZC4KLSAqLwotaW50IGZ0YXBlX3N0YXJ0X3RhcGUoaW50IHNlZ21lbnRfaWQsIGludCBzZWN0b3Jfb2Zmc2V0KQotewotCWludCB0cmFjayA9IHNlZ21lbnRfaWQgLyBmdF9zZWdtZW50c19wZXJfdHJhY2s7Ci0JaW50IHJlc3VsdCA9IC1FSU87Ci0JaW50IHN0YXR1czsKLQlzdGF0aWMgaW50IGxhc3Rfc2VnbWVudCA9IC0xOwotCXN0YXRpYyBpbnQgYmFkX2J1c190aW1pbmcgPSAwOwotCS8qIG51bWJlciBvZiBzZWdtZW50cyBwYXNzaW5nIHRoZSBoZWFkIGJldHdlZW4gc3RhcnRpbmcgdGhlIHRhcGUKLQkgKiBhbmQgYmVpbmcgYWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IHNlY3Rvci4KLQkgKi8KLQlzdGF0aWMgaW50IHN0YXJ0X29mZnNldCA9IDE7Ci0JaW50IHJldHJ5OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JLyogSWYgc2VjdG9yX29mZnNldCA+IDAsIHNlZWsgaW50byB3YW50ZWQgc2VnbWVudCBpbnN0ZWFkIG9mCi0JICogaW50byBwcmV2aW91cy4KLQkgKiBUaGlzIGFsbG93cyBlcnJvciByZWNvdmVyeSBpZiBhIHBhcnQgb2YgdGhlIHNlZ21lbnQgaXMgYmFkCi0JICogKGVyYXNlZCkgY2F1c2luZyB0aGUgdGFwZSBkcml2ZSB0byBnZW5lcmF0ZSBhbiBpbmRleCBwdWxzZQotCSAqIHRodXMgY2F1c2luZyBhIG5vLWRhdGEgZXJyb3IgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgc2VjdG9yCi0JICogaXMgcmVhY2hlZC4KLQkgKi8KLQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXJnZXQgc2VnbWVudDogJWQvJWQlcyIsIHNlZ21lbnRfaWQsIHNlY3Rvcl9vZmZzZXQsCi0JCWZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnkgPiAwID8gIiByZXRyeSIgOiAiIik7Ci0JaWYgKGZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnkgPiAwKSB7CS8qIHRoaXMgaXMgYSByZXRyeSAqLwotCQlpbnQgZGlzdCA9IHNlZ21lbnRfaWQgLSBsYXN0X3NlZ21lbnQ7Ci0KLQkJaWYgKChpbnQpZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycyA8IG92ZXJydW5fY291bnRfb2Zmc2V0KSB7Ci0JCQlvdmVycnVuX2NvdW50X29mZnNldCA9IGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7Ci0JCX0gZWxzZSBpZiAoZGlzdCA8IDAgfHwgZGlzdCA+IDUwKSB7Ci0JCQlvdmVycnVuX2NvdW50X29mZnNldCA9IGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7Ci0JCX0gZWxzZSBpZiAoKGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMgLQotCQkJICAgIG92ZXJydW5fY291bnRfb2Zmc2V0KSA+PSA4KSB7Ci0JCQlpZiAoZnRhcGVfaW5jcmVhc2VfdGhyZXNob2xkKCkgPj0gMCkgewotCQkJCS0tZnRfYnVmZmVyW2Z0X2hlYWRdLT5yZXRyeTsKLQkJCQlvdmVycnVuX2NvdW50X29mZnNldCA9Ci0JCQkJCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLCAiaW5jcmVhc2VkIHRocmVzaG9sZCBiZWNhdXNlICIKLQkJCQkgICAgICAib2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIik7Ci0JCQl9IGVsc2UgaWYgKCFiYWRfYnVzX3RpbWluZyAmJiBmdF9kYXRhX3JhdGUgPj0gMTAwMCkgewotCQkJCWZ0YXBlX2hhbGZfZGF0YV9yYXRlKCk7Ci0JCQkJLS1mdF9idWZmZXJbZnRfaGVhZF0tPnJldHJ5OwotCQkJCWJhZF9idXNfdGltaW5nID0gMTsKLQkJCQlvdmVycnVuX2NvdW50X29mZnNldCA9Ci0JCQkJCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7Ci0JCQkJVFJBQ0UoZnRfdF93YXJuLCAicmVkdWNlZCBkYXRhcmF0ZSBiZWNhdXNlICIKLQkJCQkgICAgICAib2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JbGFzdF9zZWdtZW50ID0gc2VnbWVudF9pZDsKLQlpZiAoZnRfbG9jYXRpb24udHJhY2sgIT0gdHJhY2sgfHwKLQkgICAgKGZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayAmJiBmdF9idWZmZXJbZnRfaGVhZF0tPnJldHJ5PT0gMCkpIHsKLQkJLyogY3VycmVudCB0cmFjayB1bmtub3duIG9yIG5vdCBlcXVhbCB0byBkZXN0aW5hdGlvbgotCQkgKi8KLQkJZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnNlZWssICZzdGF0dXMpOwotCQlmdGFwZV9zZWVrX2hlYWRfdG9fdHJhY2sodHJhY2spOwotCQkvKiBvdmVycnVuX2NvdW50X29mZnNldCA9IGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7ICovCi0JfQotCXJlc3VsdCA9IC1FSU87Ci0JcmV0cnkgPSAwOwotCXdoaWxlIChyZXN1bHQgPCAwICAgICAmJgotCSAgICAgICByZXRyeSsrIDw9IDUgICAmJgotCSAgICAgICAhZnRfZmFpbHVyZSAmJgotCSAgICAgICAhKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spKSkgewotCQkKLQkJaWYgKHJldHJ5ICYmIHN0YXJ0X29mZnNldCA8IDUpIHsKLQkJCXN0YXJ0X29mZnNldCArKzsKLQkJfQotCQkvKiAgQ2hlY2sgaWYgd2UgYXJlIGFibGUgdG8gY2F0Y2ggdGhlIHJlcXVlc3RlZAotCQkgKiAgc2VnbWVudCBpbiB0aW1lLgotCQkgKi8KLQkJaWYgKChmdF9sb2NhdGlvbi5rbm93biB8fCAoZGV0ZXJtaW5lX3Bvc2l0aW9uKCkgPT0gMCkpICYmCi0JCSAgICBmdF9sb2NhdGlvbi5zZWdtZW50ID49Ci0JCSAgICAoc2VnbWVudF9pZCAtCi0JCSAgICAgKChmdGFwZV90YXBlX3J1bm5pbmcgfHwgZnRfbG9jYXRpb24uYm90KQotCQkgICAgICA/IDAgOiBzdGFydF9vZmZzZXQpKSkgewotCQkJLyogIFRvbyBmYXIgYWhlYWQgKGluIG9yIHBhc3QgdGFyZ2V0IHNlZ21lbnQpLgotCQkJICovCi0JCQlpZiAoZnRhcGVfdGFwZV9ydW5uaW5nKSB7Ci0JCQkJaWYgKChyZXN1bHQgPSBmdGFwZV9zdG9wX3RhcGUoJnN0YXR1cykpIDwgMCkgewotCQkJCQlUUkFDRShmdF90X2VyciwKLQkJCQkJICAgICAgInN0b3AgdGFwZSBmYWlsZWQgd2l0aCBjb2RlICVkIiwKLQkJCQkJICAgICAgcmVzdWx0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIHN0b3BwZWQiKTsKLQkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOwotCQkJfQotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInJlcG9zaXRpb25pbmciKTsKLQkJCSsrZnRfaGlzdG9yeS5yZXdpbmRzOwotCQkJaWYgKHNlZ21lbnRfaWQgJSBmdF9zZWdtZW50c19wZXJfdHJhY2sgPCBzdGFydF9vZmZzZXQpewotCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbmQgb2YgdHJhY2sgY29uZGl0aW9uXG4iCi0JCQkJICAgICAgS0VSTl9JTkZPICJzZWdtZW50X2lkICAgICAgICA6ICVkXG4iCi0JCQkJICAgICAgS0VSTl9JTkZPICJmdF9zZWdtZW50c19wZXJfdHJhY2s6ICVkXG4iCi0JCQkJICAgICAgS0VSTl9JTkZPICJzdGFydF9vZmZzZXQgICAgICA6ICVkIiwKLQkJCQkgICAgICBzZWdtZW50X2lkLCBmdF9zZWdtZW50c19wZXJfdHJhY2ssIAotCQkJCSAgICAgIHN0YXJ0X29mZnNldCk7Ci0JCQkJICAgICAgCi0JCQkJLyogIElmIHNlZWtpbmcgdG8gZmlyc3Qgc2VnbWVudHMgb24KLQkJCQkgKiAgdHJhY2sgYmV0dGVyIGRvIGEgY29tcGxldGUgcmV3aW5kCi0JCQkJICogIHRvIGxvZ2ljYWwgYmVnaW4gb2YgdHJhY2sgdG8gZ2V0IGEKLQkJCQkgKiAgbW9yZSBzdGVhZHkgdGFwZSBtb3Rpb24uICAKLQkJCQkgKi8KLQkJCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kX3dhaXQoCi0JCQkJCShmdF9sb2NhdGlvbi50cmFjayAmIDEpCi0JCQkJCT8gUUlDX1BIWVNJQ0FMX0ZPUldBUkQKLQkJCQkJOiBRSUNfUEhZU0lDQUxfUkVWRVJTRSwKLQkJCQkJZnRhcGVfdGltZW91dC5yZXdpbmQsICZzdGF0dXMpOwotCQkJCWNoZWNrX2JvdF9lb3Qoc3RhdHVzKTsJLyogdXBkYXRlIGxvY2F0aW9uICovCi0JCQl9IGVsc2UgewotCQkJCXJlc3VsdD0gc2tpcF9yZXZlcnNlKHNlZ21lbnRfaWQgLSBzdGFydF9vZmZzZXQsCi0JCQkJCQkgICAgICZzdGF0dXMpOwotCQkJfQotCQl9Ci0JCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKLQkJCVRSQUNFKGZ0X3RfYnVnLCAicGFuaWM6IGxvY2F0aW9uIG5vdCBrbm93biIpOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJCWNvbnRpbnVlOyAvKiB3aGlsZSgpIHdpbGwgY2hlY2sgZm9yIGZhaWx1cmUgKi8KLQkJfQotCQlUUkFDRShmdF90X25vaXNlLCAiY3VycmVudCBzZWdtZW50OiAlZC8lZCIsCi0JCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7Ci0JCS8qICBXZSdyZSBvbiB0aGUgcmlnaHQgdHJhY2sgc29tZXdoZXJlIGJlZm9yZSB0aGUKLQkJICogIHdhbnRlZCBzZWdtZW50LiAgU3RhcnQgdGFwZSBtb3ZlbWVudCBpZiBuZWVkZWQgYW5kCi0JCSAqICBza2lwIHRvIGp1c3QgYmVmb3JlIG9yIGluc2lkZSB0aGUgcmVxdWVzdGVkCi0JCSAqICBzZWdtZW50LiBLZWVwIHRhcGUgcnVubmluZy4gIAotCQkgKi8KLQkJcmVzdWx0ID0gMDsKLQkJaWYgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCAKLQkJICAgIChzZWdtZW50X2lkIC0gKChmdGFwZV90YXBlX3J1bm5pbmcgfHwgZnRfbG9jYXRpb24uYm90KQotCQkJCSAgID8gMCA6IHN0YXJ0X29mZnNldCkpKSB7Ci0JCQlpZiAoc2VjdG9yX29mZnNldCA+IDApIHsKLQkJCQlyZXN1bHQgPSBzZWVrX2ZvcndhcmQoc2VnbWVudF9pZCwKLQkJCQkJCSAgICAgIHJldHJ5IDw9IDMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBzZWVrX2ZvcndhcmQoc2VnbWVudF9pZCAtIDEsCi0JCQkJCQkgICAgICByZXRyeSA8PSAzKTsKLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IDAgJiYKLQkJICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgIT0KLQkJICAgIChzZWdtZW50X2lkIC0gKHNlY3Rvcl9vZmZzZXQgPiAwID8gMCA6IDEpKSkgewotCQkJcmVzdWx0ID0gLUVJTzsKLQkJfQotCX0KLQlpZiAocmVzdWx0IDwgMCkgewotCQlUUkFDRShmdF90X2VyciwgImZhaWxlZCB0byByZXBvc2l0aW9uIik7Ci0JfSBlbHNlIHsKLQkJZnRfcnVubmVyX3N0YXR1cyA9IHJ1bm5pbmc7Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNGZlZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9SV19ICi0jZGVmaW5lIF9GVEFQRV9SV19ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ydy5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjUgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgYW5kIHdyaXRlCi0gKiAgICAgIGZ1bmN0aW9ucyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqCi0gKiBDbGF1cy1KdXN0dXMgSGVpbmUgKDE5OTYvMDkvMjApOiBBZGQgZGVmaW5pdGlvbiBvZiBmb3JtYXQgY29kZSA2Ci0gKiBDbGF1cy1KdXN0dXMgSGVpbmUgKDE5OTYvMTAvMDQpOiBDaGFuZ2VkIEdFVC9QVVQgbWFjcm9zIHRvIGNhc3QgdG8gKF9fdTggKikKLSAqCi0gKi8KLQotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKLQotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLQotI2RlZmluZSBHRVQyKGFkZHJlc3MsIG9mZnNldCkgZ2V0X3VuYWxpZ25lZCgoX191MTYqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQotI2RlZmluZSBHRVQ0KGFkZHJlc3MsIG9mZnNldCkgZ2V0X3VuYWxpZ25lZCgoX191MzIqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQotI2RlZmluZSBHRVQ4KGFkZHJlc3MsIG9mZnNldCkgZ2V0X3VuYWxpZ25lZCgoX191NjQqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQotI2RlZmluZSBQVVQyKGFkZHJlc3MsIG9mZnNldCAsIHZhbHVlKSBwdXRfdW5hbGlnbmVkKCh2YWx1ZSksIChfX3UxNiopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCi0jZGVmaW5lIFBVVDQoYWRkcmVzcywgb2Zmc2V0ICwgdmFsdWUpIHB1dF91bmFsaWduZWQoKHZhbHVlKSwgKF9fdTMyKikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKLSNkZWZpbmUgUFVUOChhZGRyZXNzLCBvZmZzZXQgLCB2YWx1ZSkgcHV0X3VuYWxpZ25lZCgodmFsdWUpLCAoX191NjQqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQotCi1lbnVtIHJ1bm5lcl9zdGF0dXNfZW51bSB7Ci0JaWRsZSA9IDAsCi0JcnVubmluZywKLQlkb19hYm9ydCwKLQlhYm9ydGluZywKLQlsb2dpY2FsX2VvdCwKLQllbmRfb2ZfdGFwZSwKLX07Ci0KLXR5cGVkZWYgZW51bSBmdF9idWZmZXJfcXVldWUgewotCWZ0X3F1ZXVlX2hlYWQgPSAwLAotCWZ0X3F1ZXVlX3RhaWwgPSAxCi19IGZ0X2J1ZmZlcl9xdWV1ZV90OwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgdHJhY2s7CQkvKiB0YXBlIGhlYWQgcG9zaXRpb24gKi8KLQl2b2xhdGlsZSBpbnQgc2VnbWVudDsJLyogY3VycmVudCBzZWdtZW50ICovCi0Jdm9sYXRpbGUgaW50IHNlY3RvcjsJLyogc2VjdG9yIG9mZnNldCB3aXRoaW4gY3VycmVudCBzZWdtZW50ICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGJvdDsJLyogbG9naWNhbCBiZWdpbiBvZiB0cmFjayAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBlb3Q7CS8qIGxvZ2ljYWwgZW5kIG9mIHRyYWNrICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGtub3duOwkvKiB2YWxpZGF0ZXMgYm90LCBzZWdtZW50LCBzZWN0b3IgKi8KLX0gbG9jYXRpb25fcmVjb3JkOwotCi0vKiAgICAgIENvdW50IG5yIG9mIDEncyBpbiBwYXR0ZXJuLgotICovCi1zdGF0aWMgaW5saW5lIGludCBjb3VudF9vbmVzKHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLQlpbnQgYml0czsKLQotCWZvciAoYml0cyA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSkgewotCQlpZiAobWFzayAmIDEpIHsKLQkJCSsrYml0czsKLQkJfQotCX0KLQlyZXR1cm4gYml0czsKLX0KLQotI2RlZmluZSBGVF9NQVhfTlJfQlVGRkVSUyAxNiAvKiBhcmJpdHJhcnkgdmFsdWUgKi8KLS8qICAgICAgZnRhcGUtcncuYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgotICovCi1leHRlcm4gYnVmZmVyX3N0cnVjdCAqZnRfYnVmZmVyW0ZUX01BWF9OUl9CVUZGRVJTXTsKLWV4dGVybiBpbnQgZnRfbnJfYnVmZmVyczsKLWV4dGVybiBsb2NhdGlvbl9yZWNvcmQgZnRfbG9jYXRpb247Ci1leHRlcm4gdm9sYXRpbGUgaW50IGZ0YXBlX3RhcGVfcnVubmluZzsKLQotLyogICAgICBmdGFwZS1ydy5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuIGludCAgZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYsCi0JCQkJICAgIGludCBzZWdtZW50X2lkLAotCQkJCSAgICBpbnQgb2Zmc2V0KTsKLWV4dGVybiBpbnQgIGZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmKTsKLWV4dGVybiBidWZmZXJfc3RydWN0ICpmdGFwZV9uZXh0X2J1ZmZlciAoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKTsKLWV4dGVybiBidWZmZXJfc3RydWN0ICpmdGFwZV9nZXRfYnVmZmVyICAoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKTsKLWV4dGVybiBpbnQgICAgICAgICAgICBmdGFwZV9idWZmZXJfaWQgICAoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKTsKLWV4dGVybiB2b2lkICAgICAgICAgICBmdGFwZV9yZXNldF9idWZmZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBmdGFwZV90YXBlX3BhcmFtZXRlcnMoX191OCBkcml2ZV9jb25maWd1cmF0aW9uKTsKLWV4dGVybiBpbnQgIGZ0YXBlX3dhaXRfc2VnbWVudChidWZmZXJfc3RhdGVfZW51bSBzdGF0ZSk7Ci1leHRlcm4gaW50ICBmdGFwZV9kdW1iX3N0b3Aodm9pZCk7Ci1leHRlcm4gaW50ICBmdGFwZV9zdGFydF90YXBlKGludCBzZWdtZW50X2lkLCBpbnQgb2Zmc2V0KTsKLWV4dGVybiBpbnQgIGZ0YXBlX3N0b3BfdGFwZShpbnQgKnBzdGF0dXMpOwotZXh0ZXJuIGludCAgZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KHZvaWQpOwotZXh0ZXJuIGJ1ZmZlcl9zdGF0ZV9lbnVtIGZ0YXBlX3NldF9zdGF0ZShidWZmZXJfc3RhdGVfZW51bSBuZXdfc3RhdGUpOwotI2VuZGlmCQkJCS8qIF9GVEFQRV9SV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtc2V0dXAuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzgzNDBhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1zZXR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtc2V0dXAuYyx2ICQKLSAqICRSZXZpc2lvbjogMS43ICQKLSAqICREYXRlOiAxOTk3LzEwLzEwIDA5OjU3OjA2ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSBmb3IgcHJvY2Vzc2luZyB0aGUga2VybmVsIGNvbW1hbmQKLSAqICAgICAgbGluZSBvcHRpb25zIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIKLSAqICAgICAgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKLQotc3RhdGljIHN0cnVjdCBwYXJhbV90YWJsZSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgKnZhcjsKLQlpbnQgZGVmX3BhcmFtOwotCWludCBtaW47Ci0JaW50IG1heDsKLX0gY29uZmlnX3BhcmFtc1tdIF9faW5pdGRhdGEgPSB7Ci0jaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKLQl7ICJ0cmFjaW5nIiwgICAmZnRhcGVfdHJhY2luZywgICAgIDMsICAgICAgICAgICAgICBmdF90X2J1ZywgZnRfdF9hbnl9LAotI2VuZGlmCi0JeyAiaW9wb3J0IiwgICAgJmZ0X2ZkY19iYXNlLCAgICAgICBDT05GSUdfRlRfRkRDX0JBU0UsICAgICAweDAsIDB4ZmZmfSwKLQl7ICJpcnEiLCAgICAgICAmZnRfZmRjX2lycSwgICAgICAgIENPTkZJR19GVF9GRENfSVJRLCAgICAgICAgMiwgICAgMTV9LAotCXsgImRtYSIsICAgICAgICZmdF9mZGNfZG1hLCAgICAgICAgQ09ORklHX0ZUX0ZEQ19ETUEsICAgICAgICAwLCAgICAgM30sCi0JeyAidGhyZXNob2xkIiwgJmZ0X2ZkY190aHJlc2hvbGQsICBDT05GSUdfRlRfRkRDX1RIUiwgICAgICAgICAxLCAgICAxNn0sCi0JeyAiZGF0YXJhdGUiLCAgJmZ0X2ZkY19yYXRlX2xpbWl0LCBDT05GSUdfRlRfRkRDX01BWF9SQVRFLCA1MDAsICAyMDAwfSwKLQl7ICJmYzEwIiwgICAgICAmZnRfcHJvYmVfZmMxMCwgICAgIENPTkZJR19GVF9QUk9CRV9GQzEwLCAgICAgMCwgICAgIDF9LAotCXsgIm1hY2gyIiwgICAgICZmdF9tYWNoMiwgICAgICAgICAgQ09ORklHX0ZUX01BQ0gyLCAgICAgICAgICAwLCAgICAgMX0KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGZ0YXBlX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpbnQgaTsKLQlpbnQgcGFyYW07Ci0JaW50IGludHNbMl07Ci0KLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0JaWYgKHN0cikgewotCQlmb3IgKGk9MDsgaSA8IE5SX0lURU1TKGNvbmZpZ19wYXJhbXMpOyBpKyspIHsKLQkJCWlmIChzdHJjbXAoc3RyLGNvbmZpZ19wYXJhbXNbaV0ubmFtZSkgPT0gMCl7Ci0JCQkJaWYgKGludHNbMF0pIHsKLQkJCQkJcGFyYW0gPSBpbnRzWzFdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhcmFtID0gY29uZmlnX3BhcmFtc1tpXS5kZWZfcGFyYW07Ci0JCQkJfQotCQkJCWlmIChwYXJhbSA8IGNvbmZpZ19wYXJhbXNbaV0ubWluIHx8Ci0JCQkJICAgIHBhcmFtID4gY29uZmlnX3BhcmFtc1tpXS5tYXgpIHsKLQkJCQkJVFJBQ0UoZnRfdF9lcnIsCi0JCQkJCSJwYXJhbWV0ZXIgJXMgb3V0IG9mIHJhbmdlICVkIC4uLiAlZCIsCi0JCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubmFtZSwKLQkJCQkJICAgICAgY29uZmlnX3BhcmFtc1tpXS5taW4sCi0JCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubWF4KTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWlmKGNvbmZpZ19wYXJhbXNbaV0udmFyKSB7Ci0JCQkJCVRSQUNFKGZ0X3RfaW5mbywgIiVzPSVkIiwgc3RyLCBwYXJhbSk7Ci0JCQkJCSpjb25maWdfcGFyYW1zW2ldLnZhciA9IHBhcmFtOwotCQkJCX0KLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCX0KLQlpZiAoc3RyKSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAidW5rbm93biBmdGFwZSBvcHRpb24gWyVzXSIsIHN0cik7Ci0JCQotCQlUUkFDRShmdF90X2VyciwgImFsbG93ZWQgb3B0aW9ucyBhcmU6Iik7Ci0JCWZvciAoaT0wOyBpIDwgTlJfSVRFTVMoY29uZmlnX3BhcmFtcyk7IGkrKykgewotCQkJVFJBQ0UoZnRfdF9lcnIsICIgJXMiLGNvbmZpZ19wYXJhbXNbaV0ubmFtZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlUUkFDRShmdF90X2VyciwgImJvdGNoZWQgZnRhcGUgb3B0aW9uIik7Ci0JfQotIG91dDoKLQlUUkFDRV9FWElUIDE7Ci19Ci0KLV9fc2V0dXAoImZ0YXBlPSIsIGZ0YXBlX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRjNjU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmMsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoyNyAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJlYWRpbmcgY29kZQotICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCi0KLS8qICAgICAgR2xvYmFsIHZhcnMuCi0gKi8KLS8qICAgICAgdHJhY2luZwotICogICAgICBzZXQgaXQgdG86ICAgICB0byBsb2cgOgotICogICAgICAgMCAgICAgICAgICAgICAgYnVncwotICogICAgICAgMSAgICAgICAgICAgICAgKyBlcnJvcnMKLSAqICAgICAgIDIgICAgICAgICAgICAgICsgd2FybmluZ3MKLSAqICAgICAgIDMgICAgICAgICAgICAgICsgaW5mb3JtYXRpb24KLSAqICAgICAgIDQgICAgICAgICAgICAgICsgbW9yZSBpbmZvcm1hdGlvbgotICogICAgICAgNSAgICAgICAgICAgICAgKyBwcm9ncmFtIGZsb3cKLSAqICAgICAgIDYgICAgICAgICAgICAgICsgZmRjL2RtYSBpbmZvCi0gKiAgICAgICA3ICAgICAgICAgICAgICArIGRhdGEgZmxvdwotICogICAgICAgOCAgICAgICAgICAgICAgKyBldmVyeXRoaW5nIGVsc2UKLSAqLwotZnRfdHJhY2VfdCBmdGFwZV90cmFjaW5nID0gZnRfdF9pbmZvOyAvKiBEZWZhdWx0IGxldmVsOiBpbmZvcm1hdGlvbiBhbmQgdXAgKi8KLWludCAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbDsKLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi1zdGF0aWMgX191OCB0cmFjZV9pZDsKLXN0YXRpYyBjaGFyIHNwYWNpbmdbXSA9ICIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQotdm9pZCBmdGFwZV90cmFjZV9jYWxsKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqaW5kZW50OwotCi0JLyogICAgU2luY2UgcHJpbnRrIHNlZW1zIG5vdCB0byB3b3JrIHdpdGggIiUqcyIgZm9ybWF0Ci0JICogICAgd2UnbGwgdXNlIHRoaXMgd29yay1hcm91bmQuCi0JICovCi0JaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImZ1bmN0aW9uIG5lc3QgbGV2ZWwgKCVkKSA8IDBcbiIsCi0JCSAgICAgICBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKLQkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA9IDA7Ci0JfQotCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgc2l6ZW9mKHNwYWNpbmcpKSB7Ci0JCWluZGVudCA9IChzcGFjaW5nICsKLQkJCSAgc2l6ZW9mKHNwYWNpbmcpIC0gMSAtCi0JCQkgIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOwotCX0gZWxzZSB7Ci0JCWluZGVudCA9IHNwYWNpbmc7Ci0JfQotCXByaW50ayhLRVJOX0lORk8gIlslMDNkXSVzKyVzICglcylcbiIsCi0JICAgICAgIChpbnQpIHRyYWNlX2lkKyssIGluZGVudCwgZmlsZSwgbmFtZSk7Ci19Ci0KLXZvaWQgZnRhcGVfdHJhY2VfZXhpdChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNoYXIgKmluZGVudDsKLQotCS8qICAgIFNpbmNlIHByaW50ayBzZWVtcyBub3QgdG8gd29yayB3aXRoICIlKnMiIGZvcm1hdAotCSAqICAgIHdlJ2xsIHVzZSB0aGlzIHdvcmstYXJvdW5kLgotCSAqLwotCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJmdW5jdGlvbiBuZXN0IGxldmVsICglZCkgPCAwXG4iLCBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKLQkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA9IDA7Ci0JfQotCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgc2l6ZW9mKHNwYWNpbmcpKSB7Ci0JCWluZGVudCA9IChzcGFjaW5nICsKLQkJCSAgc2l6ZW9mKHNwYWNpbmcpIC0gMSAtCi0JCQkgIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOwotCX0gZWxzZSB7Ci0JCWluZGVudCA9IHNwYWNpbmc7Ci0JfQotCXByaW50ayhLRVJOX0lORk8gIlslMDNkXSVzLSVzICglcylcbiIsCi0JICAgICAgIChpbnQpIHRyYWNlX2lkKyssIGluZGVudCwgZmlsZSwgbmFtZSk7Ci19Ci0KLXZvaWQgZnRhcGVfdHJhY2VfbG9nKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKQotewotCWNoYXIgKmluZGVudDsKLQotCS8qICAgIFNpbmNlIHByaW50ayBzZWVtcyBub3QgdG8gd29yayB3aXRoICIlKnMiIGZvcm1hdAotCSAqICAgIHdlJ2xsIHVzZSB0aGlzIHdvcmstYXJvdW5kLgotCSAqLwotCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJmdW5jdGlvbiBuZXN0IGxldmVsICglZCkgPCAwXG4iLCBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKLQkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA9IDA7Ci0JfQotCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgc2l6ZW9mKHNwYWNpbmcpKSB7Ci0JCWluZGVudCA9IChzcGFjaW5nICsgCi0JCQkgIHNpemVvZihzcGFjaW5nKSAtIDEgLSAKLQkJCSAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7Ci0JfSBlbHNlIHsKLQkJaW5kZW50ID0gc3BhY2luZzsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiWyUwM2RdJXMlcyAoJXMpIC0gIiwgCi0JICAgICAgIChpbnQpIHRyYWNlX2lkKyssIGluZGVudCwgZmlsZSwgZnVuY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTA4MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9UUkFDSU5HX0gKLSNkZWZpbmUgX0ZUQVBFX1RSQUNJTkdfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjggJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRoYXQgZWFzZXMgdGhlIGRlYnVnZ2luZyBvZiB0aGUKLSAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0vKgotICogIEJlIHZlcnkgY2FyZWZ1bCB3aXRoIFRSQUNFX0VYSVQgYW5kIFRSQUNFX0FCT1JULgotICoKLSAqICBpZiAoc29tZXRoaW5nKSBUUkFDRV9FWElUIGVycm9yOwotICoKLSAqICB3aWxsIE5PVCB3b3JrLiBVc2UKLSAqCi0gKiAgaWYgKHNvbWV0aGluZykgewotICogICAgVFJBQ0VfRVhJVCBlcnJvcjsKLSAqICB9Ci0gKgotICogIGluc3RlYWQuIE1heWJlIGEgYml0IGRhbmdlcm91cywgYnV0IHNhdmUgbG90cyBvZiBsaW5lcyBvZiBjb2RlLgotICovCi0KLSNkZWZpbmUgTExfWCAiJWQvJWQgS0IiCi0jZGVmaW5lIExMKHgpICh1bnNpZ25lZCBpbnQpKChfX3U2NCkoeCk+PjEwKSwgKHVuc2lnbmVkIGludCkoKHgpJjEwMjMpCi0KLXR5cGVkZWYgZW51bSB7Ci0JZnRfdF9uaWwgPSAtMSwKLQlmdF90X2J1ZywKLQlmdF90X2VyciwKLQlmdF90X3dhcm4sCi0JZnRfdF9pbmZvLAotCWZ0X3Rfbm9pc2UsCi0JZnRfdF9mbG93LAotCWZ0X3RfZmRjX2RtYSwKLQlmdF90X2RhdGFfZmxvdywKLQlmdF90X2FueQotfSBmdF90cmFjZV90OwotCi0jaWZkZWYgIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKLS8qICB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSBhd2F5IG1vc3QgVFJBQ0UoKSBtYWNyb3MKLSAqLwotI2RlZmluZSBGVF9UUkFDRV9UT1BfTEVWRUwJZnRfdF9idWcKLSNkZWZpbmUgVFJBQ0VfRlVOKGxldmVsKQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBUUkFDRV9FWElUCQlyZXR1cm4KLSNkZWZpbmUgVFJBQ0UobCwgbSwgaS4uLikJCQkJCQlcCi17CQkJCQkJCQkJXAotCWlmICgoZnRfdHJhY2VfdCkobCkgPT0gRlRfVFJBQ0VfVE9QX0xFVkVMKSB7CQkJXAotCQlwcmludGsoS0VSTl9JTkZPImZ0YXBlJXMoJXMpOlxuIgkgICAgICAgICAgICAgICAgXAotCQkgICAgICAgS0VSTl9JTkZPIG0iLlxuIiAsX19GSUxFX18sIF9fRlVOQ1RJT05fXyAsICMjaSk7CVwKLQl9CQkJCQkJCQlcCi19Ci0jZGVmaW5lIFNFVF9UUkFDRV9MRVZFTChsKSAgICAgIGlmICgobCkgPT0gKGwpKSBkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBUUkFDRV9MRVZFTAkJRlRfVFJBQ0VfVE9QX0xFVkVMCi0KLSNlbHNlCi0KLSNpZmRlZiBDT05GSUdfRlRfTk9fVFJBQ0UKLS8qICB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSBhd2F5IG1hbnkgVFJBQ0UoKSBtYWNyb3MKLSAqICB0aGUgZnRhcGVfc2ltcGxlX3RyYWNlX2NhbGwoKSBmdW5jdGlvbiBzaW1wbHkgaW5jcmVtZW50cyAKLSAqICB0aGUgZnVuY3Rpb24gbmVzdCBsZXZlbC4KLSAqLyAKLSNkZWZpbmUgRlRfVFJBQ0VfVE9QX0xFVkVMCWZ0X3Rfd2FybgotI2RlZmluZSBUUkFDRV9GVU4obGV2ZWwpCWZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwrKwotI2RlZmluZSBUUkFDRV9FWElUCQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsLS07IHJldHVybgotCi0jZWxzZQotI2lmZGVmIENPTkZJR19GVF9GVUxMX0RFQlVHCi0jZGVmaW5lIEZUX1RSQUNFX1RPUF9MRVZFTCBmdF90X2FueQotI2Vsc2UKLSNkZWZpbmUgRlRfVFJBQ0VfVE9QX0xFVkVMIGZ0X3RfZmxvdwotI2VuZGlmCi0jZGVmaW5lIFRSQUNFX0ZVTihsZXZlbCkJCQkJCVwKLQljb25zdCBmdF90cmFjZV90IF90cmFjaW5nID0gbGV2ZWw7CQkJXAotCWlmIChmdGFwZV90cmFjaW5nID49IChmdF90cmFjZV90KShsZXZlbCkgJiYJCVwKLQkgICAgKGZ0X3RyYWNlX3QpKGxldmVsKSA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpCQlcCi0JCWZ0YXBlX3RyYWNlX2NhbGwoX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CVwKLQlmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsICsrOwotCi0jZGVmaW5lIFRSQUNFX0VYSVQJCQkJCQlcCi0JLS1mdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsOwkJCQlcCi0JaWYgKGZ0YXBlX3RyYWNpbmcgPj0gKGZ0X3RyYWNlX3QpKF90cmFjaW5nKSAmJgkJXAotCSAgICAoZnRfdHJhY2VfdCkoX3RyYWNpbmcpIDw9IEZUX1RSQUNFX1RPUF9MRVZFTCkJXAotCQlmdGFwZV90cmFjZV9leGl0KF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOwlcCi0JcmV0dXJuCi0KLSNlbmRpZgotCi0jZGVmaW5lIFRSQUNFKGwsIG0sIGkuLi4pCQkJCQlcCi17CQkJCQkJCQlcCi0JaWYgKGZ0YXBlX3RyYWNpbmcgPj0gKGZ0X3RyYWNlX3QpKGwpICYmCQkJXAotCSAgICAoZnRfdHJhY2VfdCkobCkgPD0gRlRfVFJBQ0VfVE9QX0xFVkVMKSB7CQlcCi0JCWZ0YXBlX3RyYWNlX2xvZyhfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsJXAotCQlwcmludGsobSIuXG4iICwjI2kpOwkJCQlcCi0JfQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgU0VUX1RSQUNFX0xFVkVMKGwpIAkJCQlcCi17CQkJCQkJCVwKLQlpZiAoKGZ0X3RyYWNlX3QpKGwpIDw9IEZUX1RSQUNFX1RPUF9MRVZFTCkgewlcCi0JCWZ0YXBlX3RyYWNpbmcgPSAoZnRfdHJhY2VfdCkobCk7CVwKLQl9IGVsc2UgewkJCQkJXAotCQlmdGFwZV90cmFjaW5nID0gRlRfVFJBQ0VfVE9QX0xFVkVMOwlcCi0JfQkJCQkJCVwKLX0KLSNkZWZpbmUgVFJBQ0VfTEVWRUwgICAgCQkJCQkJCSAgICAgXAotKChmdGFwZV90cmFjaW5nIDw9IEZUX1RSQUNFX1RPUF9MRVZFTCkgPyBmdGFwZV90cmFjaW5nIDogRlRfVFJBQ0VfVE9QX0xFVkVMKQotCi0KLS8qICAgICAgR2xvYmFsIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0cmFjaW5nLmMKLSAqLwotZXh0ZXJuIGZ0X3RyYWNlX3QgZnRhcGVfdHJhY2luZzsgIC8qIHNldHMgZGVmYXVsdCBsZXZlbCAqLwotZXh0ZXJuIGludCBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsOwotCi0vKiAgICAgIEdsb2JhbCBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gdHJhY2luZy5jCi0gKi8KLWV4dGVybiB2b2lkIGZ0YXBlX3RyYWNlX2NhbGwoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBmdGFwZV90cmFjZV9leGl0KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpOwotZXh0ZXJuIHZvaWQgZnRhcGVfdHJhY2VfbG9nIChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lKTsKLQotI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwpICovCi0KLS8qCi0gKiAgIEFib3J0IHdpdGggYSBtZXNzYWdlLgotICovCi0jZGVmaW5lIFRSQUNFX0FCT1JUKHJlcywgaS4uLikJCQlcCi17CQkJCQkJXAotIAlUUkFDRShpKTsJCQkJXAotCVRSQUNFX0VYSVQgcmVzOwkJCQlcCi19Ci0KLS8qICAgVGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1zIHRoZSBjb21tb24gImlmKHJlc3VsdCA8IDApIC4uLiAiIGludG8gYQotICogICBvbmUtbGluZXIuCi0gKi8KLSNkZWZpbmUgX1RSQUNFX0NBVENIKGxldmVsLCBmdW4sIGFjdGlvbikJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgX3JlcyA9IChmdW4pOwkJCQkJCVwKLQlpZiAoX3JlcyA8IDApIHsJCQkJCQkJXAotCQlkbyB7IGFjdGlvbiAvKiAqLyA7IH0gd2hpbGUoMCk7CQkJCVwKLQkJVFJBQ0VfQUJPUlQoX3JlcywgbGV2ZWwsICIlcyBmYWlsZWQ6ICVkIiwgI2Z1biwJX3Jlcyk7CVwKLQl9CQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgVFJBQ0VfQ0FUQ0goZnVuLCBmYWlsKSBfVFJBQ0VfQ0FUQ0goZnRfdF9lcnIsIGZ1biwgZmFpbCkKLQotLyogIEFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdoZW4gc2lnbmFsbGVkLiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUsCi0gKiAgYnV0IHJhdGhlciBpbnRvIGZ0YXBlLXJ3LmggKG1heWJlKQotICovCi0jZGVmaW5lIEZUX1NJR05BTF9FWElUKHNpZ19tYXNrKQkJCQkJXAotCWlmIChzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIHNpZ19tYXNrKSkgewlcCi0JCVRSQUNFX0FCT1JUKC1FSU5UUiwJCQkJCVwKLQkJCSAgICBmdF90X3dhcm4sCQkJCQlcCi0JCQkgICAgImludGVycnVwdGVkIGJ5IG5vbi1ibG9ja2FibGUgc2lnbmFsIik7CVwKLQl9Ci0KLSNlbmRpZiAvKiBfRlRBUEVfVFJBQ0lOR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTYwMWVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk1IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4zLjQuMSAkCi0gKiAkRGF0ZTogMTk5Ny8xMS8xNCAxODowNzowNCAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHdyaXRpbmcgY29kZQotICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KLSNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pc3IuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLXN0YXRpYyBpbnQgbGFzdF93cml0ZV9mYWlsZWQ7Ci0KLXZvaWQgZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnModm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBmdF9ucl9idWZmZXJzOyArK2kpIHsKLQkJZnRfYnVmZmVyW2ldLT5zdGF0dXMgPSBkb25lOwotCX0KLQlmdGFwZV9yZXNldF9idWZmZXIoKTsKLX0KLQotc3RhdGljIGludCBjb3B5X2FuZF9nZW5fZWNjKHZvaWQgKmRlc3RpbmF0aW9uLCAKLQkJCSAgICBjb25zdCB2b2lkICpzb3VyY2UsCi0JCQkgICAgY29uc3QgU2VjdG9yTWFwIGJhZF9zZWN0b3JfbWFwKQotewotCWludCByZXN1bHQ7Ci0Jc3RydWN0IG1lbW9yeV9zZWdtZW50IG1zZWc7Ci0JaW50IGJhZHMgPSBjb3VudF9vbmVzKGJhZF9zZWN0b3JfbWFwKTsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKGJhZHMgPiAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VjdG9ycyBpbiBtYXA6ICVkIiwgYmFkcyk7Ci0JfQotCWlmIChiYWRzICsgMyA+PSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbXB0eSBzZWdtZW50Iik7Ci0JCW1zZWcuYmxvY2tzID0gMDsgLyogc2tpcCBlbnRpcmUgc2VnbWVudCAqLwotCQlyZXN1bHQgPSAwOyAgICAgIC8qIG5vdGhpbmcgd3JpdHRlbiAqLwotCX0gZWxzZSB7Ci0JCW1zZWcuYmxvY2tzID0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIGJhZHM7Ci0JCW1zZWcuZGF0YSA9IGRlc3RpbmF0aW9uOwotCQltZW1jcHkobXNlZy5kYXRhLCBzb3VyY2UsIChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkUpOwotCQlyZXN1bHQgPSBmdGFwZV9lY2Nfc2V0X3NlZ21lbnRfcGFyaXR5KCZtc2VnKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCVRSQUNFKGZ0X3RfZXJyLCAiZWNjX3NldF9zZWdtZW50X3Bhcml0eSBmYWlsZWQiKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkU7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLQotaW50IGZ0YXBlX3N0YXJ0X3dyaXRpbmcoY29uc3QgZnRfd3JpdGVfbW9kZV90IG1vZGUpCi17Ci0JYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7Ci0JaW50IHNlZ21lbnRfaWQgPSBoZWFkLT5zZWdtZW50X2lkOwotCWludCByZXN1bHQ7Ci0JYnVmZmVyX3N0YXRlX2VudW0gd2FudGVkX3N0YXRlID0gKG1vZGUgPT0gRlRfV1JfREVMRVRFCi0JCQkJCSAgPyBkZWxldGluZwotCQkJCQkgIDogd3JpdGluZyk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKGZ0X2RyaXZlcl9zdGF0ZSAhPSB3YW50ZWRfc3RhdGUpIHx8IGhlYWQtPnN0YXR1cyAhPSB3YWl0aW5nKSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoaGVhZCwgc2VnbWVudF9pZCwgMSk7Ci0JaWYgKG1vZGUgPT0gRlRfV1JfU0lOR0xFKSB7Ci0JCS8qIHN0b3AgdGFwZSBpbnN0ZWFkIG9mIHBhdXNlICovCi0JCWhlYWQtPm5leHRfc2VnbWVudCA9IDA7Ci0JfQotCWZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGhlYWQpOyAvKiBwcmVwYXJlICovCi0JaGVhZC0+c3RhdHVzID0gZnRfZHJpdmVyX3N0YXRlOyAvKiBlaXRoZXIgd3JpdGluZyBvciBkZWxldGluZyAqLwotCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJICAgICAgInN0YXJ0aW5nIHJ1bm5lciBmb3Igc2VnbWVudCAlZCIsIHNlZ21lbnRfaWQpOwotCQlUUkFDRV9DQVRDSChmdGFwZV9zdGFydF90YXBlKHNlZ21lbnRfaWQsaGVhZC0+c2VjdG9yX29mZnNldCksKTsKLQl9IGVsc2UgewotCQlUUkFDRShmdF90X25vaXNlLCAicnVubmVyIG5vdCBpZGxlLCBub3Qgc3RhcnRpbmcgdGFwZSIpOwotCX0KLQkvKiBnbyAqLwotCXJlc3VsdCA9IGZkY19zZXR1cF9yZWFkX3dyaXRlKGhlYWQsIChtb2RlID09IEZUX1dSX0RFTEVURQotCQkJCQkgICAgID8gRkRDX1dSSVRFX0RFTEVURUQgOiBGRENfV1JJVEUpKTsKLQlmdGFwZV9zZXRfc3RhdGUod2FudGVkX3N0YXRlKTsgLyogc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgKi8KLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyogIFdhaXQgdW50aWwgYWxsIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiB0byB0YXBlLgotICogIAotICogIFRoZXJlIGlzIGEgcHJvYmxlbTogd2hlbiB0aGUgdGFwZSBydW5zIGludG8gbG9naWNhbCBFT1QsIHRoZW4gdGhpcwotICogIGZhaWxlcy4gV2UgbmVlZCB0byByZXN0YXJ0IHRoZSBydW5uZXIgaW4gdGhpcyBjYXNlLgotICovCi1pbnQgZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSh2b2lkKQotewotCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQl3aGlsZSAoKGZ0X2RyaXZlcl9zdGF0ZSA9PSB3cml0aW5nIHx8IGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZykgJiYgCi0JICAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnN0YXR1cyAhPSBkb25lKSB7Ci0JCS8qIHNldCB0aGUgcnVubmVyIHN0YXR1cyB0byBpZGxlIGlmIGF0IGxFT1QgKi8KLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksCWxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7Ci0JCS8qIHJlc3RhcnQgdGhlIHRhcGUgaWYgbmVjZXNzYXJ5ICovCi0JCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGlkbGUpIHsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJydW5uZXIgaXMgaWRsZSwgcmVzdGFydGluZyIpOwotCQkJaWYgKGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZykgewotCQkJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcoRlRfV1JfREVMRVRFKSwKLQkJCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7Ci0JCQl9IGVsc2UgewotCQkJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcoRlRfV1JfTVVMVEkpLAotCQkJCQkgICAgbGFzdF93cml0ZV9mYWlsZWQgPSAxKTsKLQkJCX0KLQkJfQotCQlUUkFDRShmdF90X25vaXNlLCAidGFpbDogJWQsIGhlYWQ6ICVkIiwgCi0JCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV90YWlsKSwKLQkJICAgICAgZnRhcGVfYnVmZmVyX2lkKGZ0X3F1ZXVlX2hlYWQpKTsKLQkJVFJBQ0VfQ0FUQ0goZmRjX2ludGVycnVwdF93YWl0KDUgKiBGVF9TRUNPTkQpLAotCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7Ci0JCWhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOwotCQlpZiAoaGVhZC0+c3RhdHVzID09IGVycm9yKSB7Ci0JCQkvKiBBbGxvdyBlc2NhcGUgZnJvbSBsb29wIHdoZW4gc2lnbmFsZWQgIQotCQkJICovCi0JCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JCQlpZiAoaGVhZC0+aGFyZF9lcnJvcl9tYXAgIT0gMCkgewotCQkJCS8qICBJbXBsZW1lbnQgaGFyZCB3cml0ZSBlcnJvciByZWNvdmVyeSBoZXJlCi0JCQkJICovCi0JCQl9Ci0JCQkvKiByZXRyeSB0aGlzIG9uZSAqLwotCQkJaGVhZC0+c3RhdHVzID0gd2FpdGluZzsKLQkJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7Ci0JCQkJZnRhcGVfZHVtYl9zdG9wKCk7Ci0JCQl9Ci0JCQlpZiAoZnRfcnVubmVyX3N0YXR1cyAhPSBpZGxlKSB7Ci0JCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkJCSAgICAidW5leHBlY3RlZCBzdGF0ZTogIgotCQkJCQkgICAgImZ0X3J1bm5lcl9zdGF0dXMgIT0gaWRsZSIpOwotCQkJfQotCQkJZnRhcGVfc3RhcnRfd3JpdGluZyhmdF9kcml2ZXJfc3RhdGUgPT0gZGVsZXRpbmcKLQkJCQkJICAgID8gRlRfV1JfTVVMVEkgOiBGVF9XUl9ERUxFVEUpOwotCQl9Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJsb29waW5nIHVudGlsIHdyaXRlcyBkb25lIik7Ci0JfQotCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgICAgV3JpdGUgZ2l2ZW4gc2VnbWVudCBmcm9tIGJ1ZmZlciBhdCBhZGRyZXNzIHRvIHRhcGUuCi0gKi8KLXN0YXRpYyBpbnQgd3JpdGVfc2VnbWVudChjb25zdCBpbnQgc2VnbWVudF9pZCwKLQkJCSBjb25zdCB2b2lkICphZGRyZXNzLCAKLQkJCSBjb25zdCBmdF93cml0ZV9tb2RlX3Qgd3JpdGVfbW9kZSkKLXsKLQlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0JYnVmZmVyX3N0cnVjdCAqdGFpbDsKLQlidWZmZXJfc3RhdGVfZW51bSB3YW50ZWRfc3RhdGUgPSAod3JpdGVfbW9kZSA9PSBGVF9XUl9ERUxFVEUKLQkJCQkJICA/IGRlbGV0aW5nIDogd3JpdGluZyk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAic2VnbWVudF9pZCA9ICVkIiwgc2VnbWVudF9pZCk7Ci0JaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSB3YW50ZWRfc3RhdGUpIHsKLQkJaWYgKGZ0X2RyaXZlcl9zdGF0ZSA9PSBkZWxldGluZyB8fAotCQkgICAgd2FudGVkX3N0YXRlID09IGRlbGV0aW5nKSB7Ci0JCQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKLQkJfQotCQlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBmdGFwZV9hYm9ydF9vcGVyYXRpb24iKTsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKLQkJZnRhcGVfemFwX3dyaXRlX2J1ZmZlcnMoKTsKLQkJZnRhcGVfc2V0X3N0YXRlKHdhbnRlZF9zdGF0ZSk7Ci0JfQotCS8qICAgIGlmIGFsbCBidWZmZXJzIGZ1bGwgd2UnbGwgaGF2ZSB0byB3YWl0Li4uCi0JICovCi0JZnRhcGVfd2FpdF9zZWdtZW50KHdhbnRlZF9zdGF0ZSk7Ci0JdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7Ci0Jc3dpdGNoKHRhaWwtPnN0YXR1cykgewotCWNhc2UgZG9uZToKLQkJZnRfaGlzdG9yeS5kZWZlY3RzICs9IGNvdW50X29uZXModGFpbC0+aGFyZF9lcnJvcl9tYXApOwotCQlicmVhazsKLQljYXNlIHdhaXRpbmc6Ci0JCS8qIHRoaXMgY291bGQgaGFwcGVuIHdpdGggbXVsdGlwbGUgRU1QVFlfU0VHTUVOVHMsIGJ1dAotCQkgKiBzaG91bGRuJ3QgaGFwcGVuIGFueSBtb3JlIGFzIHdlIHJlLXN0YXJ0IHRoZSBydW5uZXIgZXZlbgotCQkgKiB3aXRoIGFuIGVtcHR5IHNlZ21lbnQuCi0JCSAqLwotCQlieXRlc193cml0dGVuID0gLUVBR0FJTjsKLQkJYnJlYWs7Ci0JY2FzZSBlcnJvcjoKLQkJLyogIHNldHVwIGZvciBhIHJldHJ5Ci0JCSAqLwotCQl0YWlsLT5zdGF0dXMgPSB3YWl0aW5nOwotCQlieXRlc193cml0dGVuID0gLUVBR0FJTjsgLyogZm9yY2UgcmV0cnkgKi8KLQkJaWYgKHRhaWwtPmhhcmRfZXJyb3JfbWFwICE9IDApIHsKLQkJCVRSQUNFKGZ0X3Rfd2FybiwgCi0JCQkgICAgICAid2FybmluZzogJWQgaGFyZCBlcnJvcihzKSBpbiB3cml0dGVuIHNlZ21lbnQiLAotCQkJICAgICAgY291bnRfb25lcyh0YWlsLT5oYXJkX2Vycm9yX21hcCkpOwotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImhhcmRfZXJyb3JfbWFwID0gMHglMDhseCIsIAotCQkJICAgICAgKGxvbmcpdGFpbC0+aGFyZF9lcnJvcl9tYXApOwotCQkJLyogIEltcGxlbWVudCBoYXJkIHdyaXRlIGVycm9yIHJlY292ZXJ5IGhlcmUKLQkJCSAqLwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJ3YWl0IGZvciBlbXB0eSBzZWdtZW50IGZhaWxlZCwgdGFpbCBzdGF0dXM6ICVkIiwKLQkJCSAgICB0YWlsLT5zdGF0dXMpOwotCX0KLQkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPwotCSAqLwotCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7Ci0JCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOwotCQlpZiAoaGVhZC0+c3RhdHVzID09IHdhbnRlZF9zdGF0ZSkgewotCQkJaGVhZC0+c3RhdHVzID0gZG9uZTsgLyogPz8/PyAqLwotCQl9Ci0JCS8qICBkb24ndCBjYWxsIGFib3J0X29wZXJhdGlvbigpLCB3ZSBkb24ndCB3YW50IHRvIHphcAotCQkgKiAgdGhlIGRtYSBidWZmZXJzCi0JCSAqLwotCQlUUkFDRV9DQVRDSChmdGFwZV9kdW1iX3N0b3AoKSwpOwotCX0gZWxzZSB7Ci0JCS8qICBJZiBqdXN0IHBhc3NlZCBsYXN0IHNlZ21lbnQgb24gdGFwZTogd2FpdCBmb3IgQk9UCi0JCSAqICBvciBFT1QgbWFyay4gU2V0cyBmdF9ydW5uZXJfc3RhdHVzIHRvIGlkbGUgaWYgYXQgbEVPVAotCQkgKiAgYW5kIHN1Y2Nlc3NmdWwgCi0JCSAqLwotCQlUUkFDRV9DQVRDSChmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3QoKSwpOwotCX0KLQlpZiAodGFpbC0+c3RhdHVzID09IGRvbmUpIHsKLQkJLyogbm93IGF0IGxlYXN0IG9uZSBidWZmZXIgaXMgZW1wdHksIGZpbGwgaXQgd2l0aCBvdXIKLQkJICogZGF0YS4gIHNraXAgYmFkIHNlY3RvcnMgYW5kIGdlbmVyYXRlIGVjYy4KLQkJICogY29weV9hbmRfZ2VuX2VjYyByZXR1cm4gbnIgb2YgYnl0ZXMgd3JpdHRlbiwgcmFuZ2UKLQkJICogMC4uMjkgS2IgaW5jbHVzaXZlISAgCi0JCSAqCi0JCSAqIEVtcHR5IHNlZ21lbnRzIGFyZSBoYW5kbGVkIGluc2lkZSBjb3lwX2FuZF9nZW5fZWNjKCkKLQkJICovCi0JCWlmICh3cml0ZV9tb2RlICE9IEZUX1dSX0RFTEVURSkgewotCQkJVFJBQ0VfQ0FUQ0goYnl0ZXNfd3JpdHRlbiA9IGNvcHlfYW5kX2dlbl9lY2MoCi0JCQkJdGFpbC0+YWRkcmVzcywgYWRkcmVzcywKLQkJCQlmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50X2lkKSksKTsKLQkJfQotCQl0YWlsLT5zZWdtZW50X2lkID0gc2VnbWVudF9pZDsKLQkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKLQkJdGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOwotCX0KLQkvKiAgU3RhcnQgdGFwZSBvbmx5IGlmIGFsbCBidWZmZXJzIGZ1bGwgb3IgZmx1c2ggbW9kZS4KLQkgKiAgVGhpcyB3aWxsIGdpdmUgaGlnaGVyIHByb2JhYmlsaXR5IG9mIHN0cmVhbWluZy4KLQkgKi8KLQlpZiAoZnRfcnVubmVyX3N0YXR1cyAhPSBydW5uaW5nICYmIAotCSAgICAoKHRhaWwtPnN0YXR1cyA9PSB3YWl0aW5nICYmCi0JICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKSA9PSB0YWlsKSB8fAotCSAgICAgd3JpdGVfbW9kZSAhPSBGVF9XUl9BU1lOQykpIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfc3RhcnRfd3JpdGluZyh3cml0ZV9tb2RlKSwpOwotCX0KLQlUUkFDRV9FWElUIGJ5dGVzX3dyaXR0ZW47Ci19Ci0KLS8qICBXcml0ZSBhcyBtdWNoIGFzIGZpdHMgZnJvbSBidWZmZXIgdG8gdGhlIGdpdmVuIHNlZ21lbnQgb24gdGFwZQotICogIGFuZCBoYW5kbGUgcmV0cmllcy4KLSAqICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKSwgb3I6Ci0gKiAgICAgIC1FSU8gICAgICAgICAgd3JpdGUgZmFpbGVkCi0gKiAgICAgIC1FSU5UUiAgICAgICAgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCi0gKiAgICAgIC1FTk9TUEMgICAgICAgZGV2aWNlIGZ1bGwKLSAqLwotaW50IGZ0YXBlX3dyaXRlX3NlZ21lbnQoY29uc3QgaW50IHNlZ21lbnRfaWQsCi0JCQljb25zdCB2b2lkICpidWZmZXIsIAotCQkJY29uc3QgZnRfd3JpdGVfbW9kZV90IGZsdXNoKQotewotCWludCByZXRyeSA9IDA7Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWZ0X2hpc3RvcnkudXNlZCB8PSAyOwotCWlmIChzZWdtZW50X2lkID49IGZ0X3RyYWNrc19wZXJfdGFwZSpmdF9zZWdtZW50c19wZXJfdHJhY2spIHsKLQkJLyogdGFwZSBmdWxsICovCi0JCVRSQUNFX0FCT1JUKC1FTk9TUEMsIGZ0X3RfZXJyLAotCQkJICAgICJpbnZhbGlkIHNlZ21lbnQgaWQ6ICVkIChtYXggJWQpIiwgCi0JCQkgICAgc2VnbWVudF9pZCwgCi0JCQkgICAgZnRfdHJhY2tzX3Blcl90YXBlICogZnRfc2VnbWVudHNfcGVyX3RyYWNrIC0xKTsKLQl9Ci0JZm9yICg7OykgewotCQlpZiAoKHJlc3VsdCA9IHdyaXRlX3NlZ21lbnQoc2VnbWVudF9pZCwgYnVmZmVyLCBmbHVzaCkpID49IDApIHsKLQkJCWlmIChyZXN1bHQgPT0gMCkgeyAvKiBlbXB0eSBzZWdtZW50ICovCi0JCQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJCQkgICAgICAiZW1wdHkgc2VnbWVudCwgbm90aGluZyB3cml0dGVuIik7Ci0JCQl9Ci0JCQlUUkFDRV9FWElUIHJlc3VsdDsKLQkJfQotCQlpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKLQkJCWlmICgrK3JldHJ5ID4gMTAwKSB7IC8qIGdpdmUgdXAgKi8KLQkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCQkgICAgICAid3JpdGUgZmFpbGVkLCA+MTAwIHJldHJpZXMgaW4gc2VnbWVudCIpOwotCQkJfQotCQkJVFJBQ0UoZnRfdF93YXJuLCAid3JpdGUgZXJyb3IsIHJldHJ5ICVkICglZCkiLAotCQkJICAgICAgcmV0cnksCi0JCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpLT5zZWdtZW50X2lkKTsKLQkJfSBlbHNlIHsKLQkJCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9lcnIsCi0JCQkJICAgICJ3cml0ZV9zZWdtZW50IGZhaWxlZCwgZXJyb3I6ICVkIiwgcmVzdWx0KTsKLQkJfQotCQkvKiBBbGxvdyBlc2NhcGUgZnJvbSBsb29wIHdoZW4gc2lnbmFsZWQgIQotCQkgKi8KLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2Y4OTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9XUklURV9ICi0jZGVmaW5lIF9GVEFQRV9XUklURV9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCx2ICQKLSAkQXV0aG9yOiBjbGF1cyAkCi0gKgotICRSZXZpc2lvbjogMS4yICQKLSAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODozMCAkCi0gJFN0YXRlOiBFeHAgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHdyaXRlIGZ1bmN0aW9ucwotICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqCi0gKi8KLQotCi0vKiAgICAgIGZ0YXBlLXdyaXRlLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgotICovCi10eXBlZGVmIGVudW0gewotCUZUX1dSX0FTWU5DICA9IDAsIC8qIHN0YXJ0IHRhcGUgb25seSB3aGVuIGFsbCBidWZmZXJzIGFyZSBmdWxsICovCi0JRlRfV1JfTVVMVEkgID0gMSwgLyogc3RhcnQgdGFwZSwgYnV0IGRvbid0IG5lY2Vzc2FyaWx5IHN0b3AgKi8KLQlGVF9XUl9TSU5HTEUgPSAyLCAvKiB3cml0ZSBhIHNpbmdsZSBzZWdtZW50IGFuZCBzdG9wIGFmdGVyd2FyZHMgKi8KLQlGVF9XUl9ERUxFVEUgPSAzICAvKiB3cml0ZSBkZWxldGVkIGRhdGEgbWFya3MgKi8KLX0gZnRfd3JpdGVfbW9kZV90OwotCi1leHRlcm4gaW50ICBmdGFwZV9zdGFydF93cml0aW5nKGNvbnN0IGZ0X3dyaXRlX21vZGVfdCBtb2RlKTsKLWV4dGVybiBpbnQgIGZ0YXBlX3dyaXRlX3NlZ21lbnQoY29uc3QgaW50IHNlZ21lbnQsCi0JCQkJY29uc3Qgdm9pZCAqYWRkcmVzcywgCi0JCQkJY29uc3QgZnRfd3JpdGVfbW9kZV90IGZsdXNoaW5nKTsKLWV4dGVybiB2b2lkIGZ0YXBlX3phcF93cml0ZV9idWZmZXJzKHZvaWQpOwotZXh0ZXJuIGludCAgZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSh2b2lkKTsKLQotI2VuZGlmCQkJCS8qIF9GVEFQRV9XUklURV9IICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGVfc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTBkYzRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGVfc3ltcy5jLHYgJAotICogJFJldmlzaW9uOiAxLjQgJAotICogJERhdGU6IDE5OTcvMTAvMTcgMDA6MDM6NTEgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeW1ib2xzIHRoYXQgdGhlIGZ0YXBlIGxvdyBsZXZlbAotICogICAgICBwYXJ0IG9mIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiCi0gKiAgICAgIGV4cG9ydHMgdG8gaXRzIGhpZ2ggbGV2ZWwgY2xpZW50cwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgiCi0KLS8qIGJhZCBzZWN0b3IgaGFuZGxpbmcgZnJvbSBmdGFwZS1ic20uYyAqLwotRVhQT1JUX1NZTUJPTChmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeSk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2ZpbmRfZW5kX29mX2JzbV9saXN0KTsKLS8qIGZyb20gZnRhcGUtcncuYyAqLwotRVhQT1JUX1NZTUJPTChmdGFwZV9zZXRfc3RhdGUpOwotLyogZnJvbSBmdGFwZS1jdGwuYyAqLwotRVhQT1JUX1NZTUJPTChmdGFwZV9zZWVrX3RvX2JvdCk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3NlZWtfdG9fZW90KTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfYWJvcnRfb3BlcmF0aW9uKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfZ2V0X3N0YXR1cyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2VuYWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2Rpc2FibGUpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9tbWFwKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfY2FsaWJyYXRlX2RhdGFfcmF0ZSk7Ci0vKiBmcm9tIGZ0YXBlLWlvLmMgKi8KLUVYUE9SVF9TWU1CT0woZnRhcGVfcmVzZXRfZHJpdmUpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9jb21tYW5kKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfcGFyYW1ldGVyKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfcmVhZHlfd2FpdCk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24pOwotRVhQT1JUX1NZTUJPTChmdGFwZV9yZXBvcnRfZXJyb3IpOwotLyogZnJvbSBmdGFwZS1yZWFkLmMgKi8KLUVYUE9SVF9TWU1CT0woZnRhcGVfcmVhZF9zZWdtZW50X2ZyYWN0aW9uKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfemFwX3JlYWRfYnVmZmVycyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3JlYWRfaGVhZGVyX3NlZ21lbnQpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQpOwotLyogZnJvbSBmdGFwZS13cml0ZS5jICovCi1FWFBPUlRfU1lNQk9MKGZ0YXBlX3dyaXRlX3NlZ21lbnQpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9zdGFydF93cml0aW5nKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSk7Ci0vKiBmcm9tIGZ0YXBlLWJ1ZmZlci5oICovCi1FWFBPUlRfU1lNQk9MKGZ0YXBlX3NldF9ucl9idWZmZXJzKTsKLS8qIGZyb20gZnRhcGUtZm9ybWF0LmggKi8KLUVYUE9SVF9TWU1CT0woZnRhcGVfZm9ybWF0X3RyYWNrKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfZm9ybWF0X3N0YXR1cyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3ZlcmlmeV9zZWdtZW50KTsKLS8qIGZyb20gdHJhY2luZy5jICovCi0jaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKLUVYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2luZyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOwotRVhQT1JUX1NZTUJPTChmdGFwZV90cmFjZV9jYWxsKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2VfZXhpdCk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNlX2xvZyk7Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTFjMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotIwotIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL01ha2VmaWxlLHYgJAotIyAkUmV2aXNpb246IDEuNCAkCi0jICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU4ICQKLSMKLSMgICAgICBNYWtlZmlsZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgemZ0YXBlIGludGVyZmFjZSBWRlMgdG8KLSMgICAgICBmdGFwZQotIwotCi0KLSMgWkZUX09CU09MRVRFIC0gZW5hYmxlIHRoZSBNVElPQ19aRlRBUEVfR0VUQkxLU1ogaW9jdGwuIFlvdSBzaG91bGQKLSMgICAgICAgICAgICAgICAgbGVhdmUgdGhpcyBlbmFibGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFwZXIuCi0KLW9iai0kKENPTkZJR19aRlRBUEUpICs9IHpmdGFwZS5vCi0KLXpmdGFwZS1vYmpzIDo9IHpmdGFwZS1ydy5vIHpmdGFwZS1jdGwubyB6ZnRhcGUtcmVhZC5vIFwKLQkgICAgICAgemZ0YXBlLXdyaXRlLm8gemZ0YXBlLXZ0YmwubyB6ZnRhcGUtZW9mLm8gXAotCSAgICAgICB6ZnRhcGUtaW5pdC5vIHpmdGFwZS1idWZmZXJzLm8gemZ0YXBlX3N5bXMubwotCi1FWFRSQV9DRkxBR1MgOj0gLURaRlRfT0JTT0xFVEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViY2UyZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU5ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZHluYW1pYyBidWZmZXIgYWxsb2NhdGlvbiByb3V0aW5lcyAKLSAqICAgICAgb2YgemZ0YXBlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotCi0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCi0KLS8qICBnbG9iYWwgdmFyaWFibGVzCi0gKi8KLQotLyogIGxvY2FsIHZhcmliYWxlcwotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHVzZWRfbWVtb3J5Owotc3RhdGljIHVuc2lnbmVkIGludCBwZWFrX21lbW9yeTsKLQotdm9pZCB6ZnRfbWVtb3J5X3N0YXRzKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAiTWVtb3J5IHVzYWdlICh2bWFsbG9jIGFsbG9jYXRpb25zKTpcbiIKLQkgICAgICBLRVJOX0lORk8gInRvdGFsIGFsbG9jYXRlZDogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInBlYWsgYWxsb2NhdGlvbjogJWQiLAotCSAgICAgIHVzZWRfbWVtb3J5LCBwZWFrX21lbW9yeSk7Ci0JcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKLQlUUkFDRV9FWElUOwotfQotCi1pbnQgemZ0X3ZjYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCWlmICh6ZnRfdm1hbGxvY19vbmNlKG5ldywgc2l6ZSkgPCAwKSB7Ci0JCVRSQUNFX0VYSVQgLUVOT01FTTsKLQl9Ci0JbWVtc2V0KCoodm9pZCAqKiluZXcsICdcMCcsIHNpemUpOwotCVRSQUNFX0VYSVQgMDsKLX0KLWludCB6ZnRfdm1hbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKih2b2lkICoqKW5ldyAhPSBOVUxMIHx8IHNpemUgPT0gMCkgewotCQlUUkFDRV9FWElUIDA7Ci0JfQotCWlmICgoKih2b2lkICoqKW5ldyA9IHZtYWxsb2Moc2l6ZSkpID09IE5VTEwpIHsKLQkJVFJBQ0VfRVhJVCAtRU5PTUVNOwotCX0KLQl1c2VkX21lbW9yeSArPSBzaXplOwotCWlmIChwZWFrX21lbW9yeSA8IHVzZWRfbWVtb3J5KSB7Ci0JCXBlYWtfbWVtb3J5ID0gdXNlZF9tZW1vcnk7Ci0JfQotCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsCi0JCSAgICAiYWxsb2NhdGVkIGJ1ZmZlciBAICVwLCAlemQgYnl0ZXMiLCAqKHZvaWQgKiopbmV3LCBzaXplKTsKLX0KLWludCB6ZnRfdm1hbGxvY19hbHdheXModm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXpmdF92ZnJlZShuZXcsIHNpemUpOwotCVRSQUNFX0VYSVQgemZ0X3ZtYWxsb2Nfb25jZShuZXcsIHNpemUpOwotfQotdm9pZCB6ZnRfdmZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICgqKHZvaWQgKiopb2xkKSB7Ci0JCXZmcmVlKCoodm9pZCAqKilvbGQpOwotCQl1c2VkX21lbW9yeSAtPSBzaXplOwotCQlUUkFDRShmdF90X25vaXNlLCAicmVsZWFzZWQgYnVmZmVyIEAgJXAsICV6ZCBieXRlcyIsCi0JCSAgICAgICoodm9pZCAqKilvbGQsIHNpemUpOwotCQkqKHZvaWQgKiopb2xkID0gTlVMTDsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotdm9pZCAqemZ0X2ttYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqbmV3OwotCi0Jd2hpbGUgKChuZXcgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7Ci0JfQotCW1lbXNldChuZXcsIDAsIHNpemUpOwotCXVzZWRfbWVtb3J5ICs9IHNpemU7Ci0JaWYgKHBlYWtfbWVtb3J5IDwgdXNlZF9tZW1vcnkpIHsKLQkJcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKLQl9Ci0JcmV0dXJuIG5ldzsKLX0KLQotdm9pZCB6ZnRfa2ZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSkKLXsKLQlrZnJlZShvbGQpOwotCXVzZWRfbWVtb3J5IC09IHNpemU7Ci19Ci0KLS8qIHRoZXJlIGFyZSBzb21lIG1vcmUgYnVmZmVycyB0aGF0IGFyZSBhbGxvY2F0ZWQgb24gZGVtYW5kLgotICogY2xlYW51cF9tb2R1bGUoKSBjYWxsZXMgdGhpcyBmdW5jdGlvbiB0byBiZSBzdXJlIHRvIGhhdmUgcmVsZWFzZWQKLSAqIHRoZW0gCi0gKi8KLXZvaWQgemZ0X3VuaW5pdF9tZW0odm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXpmdF92ZnJlZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOwotCXpmdF92ZnJlZSgmemZ0X2RlYmxvY2tfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOyB6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7Ci0JemZ0X2ZyZWVfdnRibCgpOwotCWlmICh6ZnRfY21wcl9sb2NrKDAgLyogZG9uJ3QgbG9hZCAqLykgPT0gMCkgewotCQkoKnpmdF9jbXByX29wcy0+Y2xlYW51cCkoKTsKLQkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOyAvKiB1bmxvY2sgaXQgYWdhaW4gKi8KLQl9Ci0JemZ0X21lbW9yeV9zdGF0cygpOwotCVRSQUNFX0VYSVQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OGUzMTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfRFlOTUVNX0gKLSNkZWZpbmUgX0ZUQVBFX0RZTk1FTV9ICi0KLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODo1OSAkCi0gKgotICogICBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KLSAqCi0gKi8KLQotLyogd2UgZG8gbm90IGFsbG9jYXRlIGFsbCBvZiB0aGUgcmVhbGx5IGxhcmdlIGJ1ZmZlciBtZW1vcnkgYmVmb3JlCi0gKiBzb21lb25lIHRyaWVzIHRvIG9wZW4gdGhlIGRyaXZlLiBmdGFwZV9vcGVuKCkgbWF5IGZhaWwgd2l0aAotICogLUVOT01FTSwgYnV0IHRoYXQncyBiZXR0ZXIgaGF2aW5nIDIwMGsgb2Ygdm1hbGxvY2VkIG1lbW9yeSB3aGljaAotICogY2Fubm90IGJlIHN3YXBwZWQgb3V0LgotICovCi0KLWV4dGVybiB2b2lkICB6ZnRfbWVtb3J5X3N0YXRzKHZvaWQpOwotZXh0ZXJuIGludCAgIHpmdF92bWFsbG9jX29uY2Uodm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gaW50ICAgemZ0X3ZjYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKTsKLWV4dGVybiBpbnQgICB6ZnRfdm1hbGxvY19hbHdheXModm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gdm9pZCAgemZ0X3ZmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpOwotZXh0ZXJuIHZvaWQgKnpmdF9rbWFsbG9jKHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkICB6ZnRfa2ZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSk7Ci0KLS8qIGNhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpIAotICovCi1leHRlcm4gdm9pZCB6ZnRfdW5pbml0X21lbSh2b2lkKTsKLQotI2VuZGlmCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmEwZjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE3ICswLDAgQEAKLS8qIAotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMsdiAkCi0gKiAkUmV2aXNpb246IDEuMi42LjIgJAotICogJERhdGU6IDE5OTcvMTEvMTQgMTg6MDc6MzMgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBub24tcmVhZC93cml0ZSB6ZnRhcGUgZnVuY3Rpb25zCi0gKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi1pbnQgemZ0X3dyaXRlX3Byb3RlY3RlZDsgLyogdGhpcyBpcyB3aGVuIGNhcnRyaWRnZSByZG9ubHkgb3IgT19SRE9OTFkgKi8KLWludCB6ZnRfaGVhZGVyX3JlYWQ7Ci1pbnQgemZ0X29mZmxpbmU7Ci11bnNpZ25lZCBpbnQgemZ0X3VuaXQ7Ci1pbnQgemZ0X3Jlc2lkOwotaW50IHpmdF9tdF9jb21wcmVzc2lvbjsKLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi1zdGF0aWMgaW50IGdvaW5nX29mZmxpbmU7Ci0KLXR5cGVkZWYgaW50IChtdF9mdW4pKGludCAqYXJncHRyKTsKLXR5cGVkZWYgaW50ICgqbXRfZnVucCkoaW50ICphcmdwdHIpOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLQltdF9mdW5wIGZ1bmN0aW9uOwotCXVuc2lnbmVkIG9mZmxpbmUgICAgICAgICA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiBvZmZsaW5lIG9yIG5vX3RhcGUgKi8KLQl1bnNpZ25lZCB3cml0ZV9wcm90ZWN0ZWQgOiAxOyAvKiBvcCBwZXJtaXR0ZWQgaWYgd3JpdGUtcHJvdGVjdGVkICAgICovCi0JdW5zaWduZWQgbm90X2Zvcm1hdHRlZCAgIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIHRhcGUgbm90IGZvcm1hdHRlZCAqLwotCXVuc2lnbmVkIHJhd19tb2RlICAgICAgICA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiB6ZnRfbW9kZSA9PSAwICAgICovCi0JdW5zaWduZWQgbmVlZF9pZGxlX3N0YXRlIDogMTsgLyogbmVlZCB0byBjYWxsIGRlZl9pZGxlX3N0YXRlICAgICAgICAqLwotCWNoYXIgICAgICpuYW1lOwotfSBmdW5fZW50cnk7Ci0KLXN0YXRpYyBtdF9mdW4gbXRfZHVtbXksIG10X3Jlc2V0LCBtdF9mc3IsIG10X2JzciwgbXRfcmV3LCBtdF9vZmZsLCBtdF9ub3AsCi0JbXRfd2VvZiwgbXRfZXJhc2UsIG10X3JhczIsIG10X3NldGJsaywgbXRfc2V0ZGVuc2l0eSwKLQltdF9zZWVrLCBtdF90ZWxsLCBtdF9yZXRlbiwgbXRfZW9tLCBtdF9mc2YsIG10X2JzZiwKLQltdF9mc2ZtLCBtdF9ic2ZtLCBtdF9zZXRkcnZidWZmZXIsIG10X2NvbXByZXNzaW9uOwotCi1zdGF0aWMgZnVuX2VudHJ5IG10X2Z1bnNbXT0KLXsgCi0Je210X3Jlc2V0ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1JFU0VUIiB9LCAvKiAgMCAqLwotCXttdF9mc2YgICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9GU0YiICAgfSwKLQl7bXRfYnNmICAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfQlNGIiAgIH0sCi0Je210X2ZzciAgICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX0ZTUiIgICB9LAotCXttdF9ic3IgICAgICAgICAsIDAsIDEsIDAsIDEsIDEsICJNVF9CU1IiICAgfSwKLQl7bXRfd2VvZiAgICAgICAgLCAwLCAwLCAwLCAwLCAwLCAiTVRfV0VPRiIgIH0sIC8qICA1ICovCi0Je210X3JldyAgICAgICAgICwgMCwgMSwgMSwgMSwgMCwgIk1UX1JFVyIgICB9LAotCXttdF9vZmZsICAgICAgICAsIDAsIDEsIDEsIDEsIDAsICJNVF9PRkZMIiAgfSwKLQl7bXRfbm9wICAgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTk9QIiAgIH0sCi0Je210X3JldGVuICAgICAgICwgMCwgMSwgMSwgMSwgMCwgIk1UX1JFVEVOIiB9LAotCXttdF9ic2ZtICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9CU0ZNIiAgfSwgLyogMTAgKi8KLQl7bXRfZnNmbSAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfRlNGTSIgIH0sCi0Je210X2VvbSAgICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0VPTSIgICB9LAotCXttdF9lcmFzZSAgICAgICAsIDAsIDAsIDAsIDEsIDAsICJNVF9FUkFTRSIgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfUkFTMSIgIH0sCi0Je210X3JhczIgICAgICAgICwgMCwgMCwgMCwgMSwgMCwgIk1UX1JBUzIiICB9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9SQVMzIiAgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiVU5LTk9XTiIgIH0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIlVOS05PV04iICB9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJVTktOT1dOIiAgfSwKLQl7bXRfc2V0YmxrICAgICAgLCAxLCAxLCAxLCAxLCAxLCAiTVRfU0VUQkxLIn0sIC8qIDIwICovCi0Je210X3NldGRlbnNpdHkgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1NFVERFTlNJVFkifSwKLQl7bXRfc2VlayAgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfU0VFSyIgIH0sCi0Je210X2R1bW15ICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX1RFTEwiICB9LCAvKiB3ci1vbmx5ID8hICovCi0Je210X3NldGRydmJ1ZmZlciwgMSwgMSwgMSwgMSwgMCwgIk1UX1NFVERSVkJVRkZFUiIgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfRlNTIiAgIH0sIC8qIDI1ICovCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX0JTUyIgICB9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9XU00iICAgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTE9DSyIgIH0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1VOTE9DSyJ9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9MT0FEIiAgfSwgLyogMzAgKi8KLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfVU5MT0FEIn0sCi0Je210X2NvbXByZXNzaW9uICwgMSwgMSwgMSwgMCwgMSwgIk1UX0NPTVBSRVNTSU9OIn0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1NFVFBBUlQifSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTUtQQVJUIn0KLX07ICAKLQotI2RlZmluZSBOUl9NVF9DTURTIE5SX0lURU1TKG10X2Z1bnMpCi0KLXZvaWQgemZ0X3Jlc2V0X3Bvc2l0aW9uKHpmdF9wb3NpdGlvbiAqcG9zKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JcG9zLT5zZWdfYnl0ZV9wb3MgPQotCQlwb3MtPnZvbHVtZV9wb3MgPSAwOwotCWlmICh6ZnRfaGVhZGVyX3JlYWQpIHsKLQkJLyogbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB2b2x1bWUgdGFibGUgYW5kCi0JCSAqIGNvbXByZXNzaW9uIG1hcC4gV2UgdGhlcmVmb3Igc2ltcGx5Ci0JCSAqIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0Ci0JCSAqIHZvbHVtZS4gVGhpcyBjb3ZlcnMgb2xkIGZ0YXBlIGFyY2hpdmVzIGFzCi0JCSAqIHdlbGwgaGFzIHZhcmlvdXMgZmxhdm91cnMgb2YgdGhlCi0JCSAqIGNvbXByZXNzaW9uIG1hcCBzZWdtZW50cy4gVGhlIHdvcnN0IGNhc2UgaXMKLQkJICogdGhhdCB0aGUgY29tcHJlc3Npb24gbWFwIHNob3dzIHVwIGFzIGEKLQkJICogYWRkaXRpb25hbCB2b2x1bWUgaW4gZnJvbnQgb2YgYWxsIG90aGVycy4KLQkJICovCi0JCXBvcy0+c2VnX3BvcyAgPSB6ZnRfZmluZF92b2x1bWUoMCktPnN0YXJ0X3NlZzsKLQkJcG9zLT50YXBlX3BvcyA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7Ci0JfSBlbHNlIHsKLQkJcG9zLT50YXBlX3BvcyA9ICAwOwotCQlwb3MtPnNlZ19wb3MgID0gLTE7Ci0JfQotCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAgMDsKLQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7Ci0JemZ0X2lvX3N0YXRlICAgICAgICA9IHpmdF9pZGxlOwotCXpmdF96YXBfcmVhZF9idWZmZXJzKCk7Ci0JemZ0X3ByZXZlbnRfZmx1c2goKTsKLQkvKiAgdW5sb2NrIHRoZSBjb21wcmVzaXNvbiBtb2R1bGUgaWYgaXQgaXMgbG9hZGVkLgotCSAqICBUaGUgemVybyBhcmcgbWVhbnMgbm90IHRvIHRyeSB0byBsb2FkIHRoZSBtb2R1bGUuCi0JICovCi0JaWYgKHpmdF9jbXByX2xvY2soMCkgPT0gMCkgewotCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7IC8qIHVubG9jayAqLwotCX0KLQlUUkFDRV9FWElUOwotfQotCi1zdGF0aWMgdm9pZCB6ZnRfaW5pdF9kcml2ZXIodm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXpmdF9yZXNpZCA9Ci0JCXpmdF9oZWFkZXJfcmVhZCAgICAgICAgICA9Ci0JCXpmdF9vbGRfZnRhcGUgICAgICAgICAgICA9Ci0JCXpmdF9vZmZsaW5lICAgICAgICAgICAgICA9Ci0JCXpmdF93cml0ZV9wcm90ZWN0ZWQgICAgICA9Ci0JCWdvaW5nX29mZmxpbmUgICAgICAgICAgICA9Ci0JCXpmdF9tdF9jb21wcmVzc2lvbiAgICAgICA9Ci0JCXpmdF9oZWFkZXJfY2hhbmdlZCAgICAgICA9Ci0JCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9Ci0JCXpmdF93cml0dGVuX3NlZ21lbnRzICAgICA9IDA7Ci0JemZ0X2Jsa19zeiA9IENPTkZJR19aRlRfREZMVF9CTEtfU1o7Ci0JemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsgLyogZG9lcyBtb3N0IG9mIHRoZSBzdHVmZiAqLwotCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKLQlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotaW50IHpmdF9kZWZfaWRsZV9zdGF0ZSh2b2lkKQoteyAKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgewotCQlyZXN1bHQgPSB6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHMoKTsKLQl9IGVsc2UgaWYgKChyZXN1bHQgPSB6ZnRfZmx1c2hfYnVmZmVycygpKSA+PSAwICYmIHpmdF9xaWNfbW9kZSkgewotCQkvKiAgZG9uJ3QgbW92ZSBwYXN0IGVvZgotCQkgKi8KLQkJKHZvaWQpemZ0X2Nsb3NlX3ZvbHVtZSgmemZ0X3Bvcyk7Ci0JfQotCWlmIChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSA8IDApIHsKLQkJVFJBQ0UoZnRfdF93YXJuLCAiZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCkgZmFpbGVkIik7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JfQotCS8qIGNsZWFyIHJlbWFpbmluZyByZWFkIGJ1ZmZlcnMgKi8KLQl6ZnRfemFwX3JlYWRfYnVmZmVycygpOwotCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGZ1bmN0aW9ucyBmb3IgdGhlIE1USU9DVE9QIGNvbW1hbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBtdF9kdW1teShpbnQgKmR1bW15KQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFX0VYSVQgLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBtdF9yZXNldChpbnQgKmR1bW15KQoteyAgICAgICAgCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JKHZvaWQpZnRhcGVfc2Vla190b19ib3QoKTsKLQlUUkFDRV9DQVRDSChmdGFwZV9yZXNldF9kcml2ZSgpLAotCQkgICAgemZ0X2luaXRfZHJpdmVyKCk7IHpmdF91bmluaXRfbWVtKCk7IHpmdF9vZmZsaW5lID0gMSk7Ci0JLyogIGZha2UgYSByZS1vcGVuIG9mIHRoZSBkZXZpY2UuIFRoaXMgd2lsbCBzZXQgYWxsIGZsYWdlIGFuZCAKLQkgKiAgYWxsb2NhdGUgYnVmZmVycyBhcyBhcHByb3ByaWF0ZS4gVGhlIG5ldyB0YXBlIGNvbmRpdGlvbiB3aWxsCi0JICogIGZvcmNlIHRoZSBvcGVuIHJvdXRpbmUgdG8gZG8gYW55dGhpbmcgd2UgbmVlZC4KLQkgKi8KLQlUUkFDRV9DQVRDSChfemZ0X29wZW4oLTEgLyogZmFrZSByZW9wZW4gKi8sIDAgLyogZHVtbXkgKi8pLCk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IG10X2ZzZihpbnQgKmFyZykKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JcmVzdWx0ID0gemZ0X3NraXBfdm9sdW1lcygqYXJnLCAmemZ0X3Bvcyk7Ci0JemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfYnNmKGludCAqYXJnKQotewotCWludCByZXN1bHQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmICgqYXJnICE9IDApIHsKLQkJcmVzdWx0ID0gemZ0X3NraXBfdm9sdW1lcygtKmFyZyArIDEsICZ6ZnRfcG9zKTsKLQl9Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2Vla19ibG9jayhfX3M2NCBkYXRhX29mZnNldCwKLQkJICAgICAgX19zNjQgYmxvY2tfaW5jcmVtZW50LAotCQkgICAgICB6ZnRfcG9zaXRpb24gKnBvcykKLXsgCi0JaW50IHJlc3VsdCAgICAgID0gMDsKLQlfX3M2NCBuZXdfYmxvY2tfcG9zOwotCV9fczY0IHZvbF9ibG9ja19jb3VudDsKLQljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOwotCWludCBleGNlZWQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0Jdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7Ci0JaWYgKHZvbHVtZS0+c3RhcnRfc2VnID09IDAgfHwgdm9sdW1lLT5lbmRfc2VnID09IDApIHsKLQkJVFJBQ0VfRVhJVCAtRUlPOwotCX0KLQluZXdfYmxvY2tfcG9zICAgPSAoemZ0X2Rpdl9ibGtzeihkYXRhX29mZnNldCwgdm9sdW1lLT5ibGtfc3opCi0JCQkgICArIGJsb2NrX2luY3JlbWVudCk7Ci0Jdm9sX2Jsb2NrX2NvdW50ID0gemZ0X2Rpdl9ibGtzeih2b2x1bWUtPnNpemUsIHZvbHVtZS0+YmxrX3N6KTsKLQlpZiAobmV3X2Jsb2NrX3BvcyA8IDApIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJICAgICAgIm5ld19ibG9ja19wb3MgIiBMTF9YICIgPCAwIiwgTEwobmV3X2Jsb2NrX3BvcykpOwotCQl6ZnRfcmVzaWQgICAgID0gKGludCluZXdfYmxvY2tfcG9zOwotCQluZXdfYmxvY2tfcG9zID0gMDsKLQkJZXhjZWVkID0gMTsKLQl9IGVsc2UgaWYgKG5ld19ibG9ja19wb3MgPiB2b2xfYmxvY2tfY291bnQpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJICAgICAgIm5ld19ibG9ja19wb3MgIiBMTF9YICIgZXhjZWVkcyBzaXplIG9mIHZvbHVtZSAiIExMX1gsCi0JCSAgICAgIExMKG5ld19ibG9ja19wb3MpLCBMTCh2b2xfYmxvY2tfY291bnQpKTsKLQkJemZ0X3Jlc2lkICAgICA9IChpbnQpKHZvbF9ibG9ja19jb3VudCAtIG5ld19ibG9ja19wb3MpOwotCQluZXdfYmxvY2tfcG9zID0gdm9sX2Jsb2NrX2NvdW50OwotCQlleGNlZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWV4Y2VlZCA9IDA7Ci0JfQotCWlmICh6ZnRfdXNlX2NvbXByZXNzaW9uICYmIHZvbHVtZS0+dXNlX2NvbXByZXNzaW9uKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF9jbXByX2xvY2soMSAvKiB0cnkgdG8gbG9hZCAqLyksKTsKLQkJcmVzdWx0ID0gKCp6ZnRfY21wcl9vcHMtPnNlZWspKG5ld19ibG9ja19wb3MsIHBvcywgdm9sdW1lLAotCQkJCQkgICAgICAgemZ0X2RlYmxvY2tfYnVmKTsKLQkJcG9zLT50YXBlX3BvcyAgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOwotCQlwb3MtPnRhcGVfcG9zICs9IHBvcy0+c2VnX2J5dGVfcG9zOwotCX0gZWxzZSB7Ci0JCXBvcy0+dm9sdW1lX3BvcyA9IHpmdF9tdWxfYmxrc3oobmV3X2Jsb2NrX3Bvcywgdm9sdW1lLT5ibGtfc3opOwotCQlwb3MtPnRhcGVfcG9zICAgPSB6ZnRfY2FsY190YXBlX3Bvcyh2b2x1bWUtPnN0YXJ0X3NlZyk7Ci0JCXBvcy0+dGFwZV9wb3MgICs9IHBvcy0+dm9sdW1lX3BvczsKLQkJcG9zLT5zZWdfcG9zICAgID0gemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoJnBvcy0+c2VnX2J5dGVfcG9zLAotCQkJCQkJCSAgcG9zLT50YXBlX3Bvcyk7Ci0JfQotCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSB2b2x1bWUtPnNpemUgPT0gcG9zLT52b2x1bWVfcG9zOwotCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mKSB7Ci0JCS8qIHdoeSB0aGlzPyBiZWNhdXNlIHpmdF9maWxlX25vIGNoZWNrcyBhZ2FpbnMgc3RhcnQKLQkJICogYW5kIGVuZCBzZWdtZW50IG9mIGEgdm9sdW1lLiBXZSBkbyBub3Qgd2FudCB0bwotCQkgKiBhZHZhbmNlIHRvIHRoZSBuZXh0IHZvbHVtZSB3aXRoIHRoaXMgZnVuY3Rpb24uCi0JCSAqLwotCQlUUkFDRShmdF90X25vaXNlLCAic2V0IHpmdF9qdXN0X2JlZm9yZV9lb2YiKTsKLQkJemZ0X3Bvc2l0aW9uX2JlZm9yZV9lb2YocG9zLCB2b2x1bWUpOwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAiXG4iCi0JICAgICAgS0VSTl9JTkZPICJuZXdfc2VnX3BvcyA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJuZXdfdGFwZV9wb3M6ICIgTExfWCAiXG4iCi0JICAgICAgS0VSTl9JTkZPICJ2b2xfc2l6ZSAgICA6ICIgTExfWCAiXG4iCi0JICAgICAgS0VSTl9JTkZPICJzZWdfYnl0ZV9wb3M6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJibGtfc3ogIDogJWQiLCAKLQkgICAgICBwb3MtPnNlZ19wb3MsIExMKHBvcy0+dGFwZV9wb3MpLAotCSAgICAgIExMKHZvbHVtZS0+c2l6ZSksIHBvcy0+c2VnX2J5dGVfcG9zLAotCSAgICAgIHZvbHVtZS0+YmxrX3N6KTsKLQlpZiAoIWV4Y2VlZCkgewotCQl6ZnRfcmVzaWQgPSBuZXdfYmxvY2tfcG9zIC0gemZ0X2Rpdl9ibGtzeihwb3MtPnZvbHVtZV9wb3MsCi0JCQkJCQkJICB2b2x1bWUtPmJsa19zeik7Ci0JfQotCWlmICh6ZnRfcmVzaWQgPCAwKSB7Ci0JCXpmdF9yZXNpZCA9IC16ZnRfcmVzaWQ7Ci0JfQotCVRSQUNFX0VYSVQgKChleGNlZWQgfHwgemZ0X3Jlc2lkICE9IDApICYmIHJlc3VsdCA+PSAwKSA/IC1FSU5WQUwgOiByZXN1bHQ7Ci19ICAgICAKLQotc3RhdGljIGludCBtdF9mc3IoaW50ICphcmcpCi17IAotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JcmVzdWx0ID0gc2Vla19ibG9jayh6ZnRfcG9zLnZvbHVtZV9wb3MsICAqYXJnLCAmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfYnNyKGludCAqYXJnKQoteyAgIAotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JcmVzdWx0ID0gc2Vla19ibG9jayh6ZnRfcG9zLnZvbHVtZV9wb3MsIC0qYXJnLCAmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfd2VvZihpbnQgKmFyZykKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFX0NBVENIKHpmdF9mbHVzaF9idWZmZXJzKCksKTsKLQlyZXN1bHQgPSB6ZnRfd2VvZigqYXJnLCAmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfcmV3KGludCAqZHVtbXkpCi17ICAgICAgICAgIAotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYoemZ0X2hlYWRlcl9yZWFkKSB7Ci0JCSh2b2lkKXpmdF9kZWZfaWRsZV9zdGF0ZSgpOwotCX0KLQlyZXN1bHQgPSBmdGFwZV9zZWVrX3RvX2JvdCgpOwotCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfb2ZmbChpbnQgKmR1bW15KQotewotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JZ29pbmdfb2ZmbGluZT0gMTsKLQlyZXN1bHQgPSBtdF9yZXcoTlVMTCk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfbm9wKGludCAqZHVtbXkpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JLyogIHNob3VsZCB3ZSBzZXQgdGFwZSBzdGF0dXM/Ci0JICovCi0JaWYgKCF6ZnRfb2ZmbGluZSkgeyAvKiBvZmZsaW5lIGluY2x1ZGVzIG5vX3RhcGUgKi8KLQkJKHZvaWQpemZ0X2RlZl9pZGxlX3N0YXRlKCk7Ci0JfQotCVRSQUNFX0VYSVQgMDsgCi19Ci0KLXN0YXRpYyBpbnQgbXRfcmV0ZW4oaW50ICpkdW1teSkKLXsgIAotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYoemZ0X2hlYWRlcl9yZWFkKSB7Ci0JCSh2b2lkKXpmdF9kZWZfaWRsZV9zdGF0ZSgpOwotCX0KLQlyZXN1bHQgPSBmdGFwZV9zZWVrX3RvX2VvdCgpOwotCWlmIChyZXN1bHQgPj0gMCkgewotCQlyZXN1bHQgPSBmdGFwZV9zZWVrX3RvX2JvdCgpOwotCX0KLQlUUkFDRV9FWElUKHJlc3VsdCk7Ci19Ci0KLXN0YXRpYyBpbnQgZnNmYnNmbShpbnQgYXJnLCB6ZnRfcG9zaXRpb24gKnBvcykKLXsgCi0JY29uc3QgemZ0X3ZvbGluZm8gKnZ0Ymw7Ci0JX19zNjQgYmxvY2tfcG9zOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCS8qIFdoYXQgdG8gZG8/IFRoaXMgc2hvdWxkIHNlZWsgdG8gdGhlIG5leHQgZmlsZS1tYXJrIGFuZAotCSAqIHBvc2l0aW9uIEJFRk9SRS4gVGhhdCBpcywgYSBuZXh0IHdyaXRlIHdvdWxkIGp1c3QgZXh0ZW5kCi0JICogdGhlIGN1cnJlbnQgZmlsZS4gIFdlbGwuIExldCdzIGp1c3Qgc2VlayB0byB0aGUgZW5kIG9mIHRoZQotCSAqIGN1cnJlbnQgZmlsZSwgaWYgY291bnQgPT0gMS4gIElmIGNvdW50ID4gMSwgdGhlbiBkbyBhCi0JICogIm10X2ZzZihjb3VudCAtIDEpIiwgYW5kIHRoZW4gc2VlayB0byB0aGUgZW5kIG9mIHRoYXQgZmlsZS4KLQkgKiBJZiBjb3VudCA9PSAwLCBkbyBub3RoaW5nCi0JICovCi0JaWYgKGFyZyA9PSAwKSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7Ci0JVFJBQ0VfQ0FUQ0goemZ0X3NraXBfdm9sdW1lcyhhcmcgPCAwID8gYXJnIDogYXJnLTEsIHBvcyksCi0JCSAgICBpZiAoYXJnID4gMCkgewotCQkJICAgIHpmdF9yZXNpZCArKzsgCi0JCSAgICB9KTsKLQl2dGJsICAgICAgPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKLQlibG9ja19wb3MgPSB6ZnRfZGl2X2Jsa3N6KHZ0YmwtPnNpemUsIHZ0YmwtPmJsa19zeik7Ci0JKHZvaWQpc2Vla19ibG9jaygwLCBibG9ja19wb3MsIHBvcyk7Ci0JaWYgKHBvcy0+dm9sdW1lX3BvcyAhPSB2dGJsLT5zaXplKSB7Ci0JCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOwotCQl6ZnRfcmVzaWQgPSAxOwotCQkvKiB3ZSBkaWRuJ3QgbWFuYWdlZCB0byBnbyB0aGVyZSAqLwotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgCi0JCQkgICAgIndhbnRlZCBmaWxlIHBvc2l0aW9uICIgTExfWCAiLCBhcnJpdmVkIGF0ICIgTExfWCwgCi0JCQkgICAgTEwodnRibC0+c2l6ZSksIExMKHBvcy0+dm9sdW1lX3BvcykpOwotCX0KLQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMTsKLQlUUkFDRV9FWElUIDA7IAotfQotCi1zdGF0aWMgaW50IG10X2JzZm0oaW50ICphcmcpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlyZXN1bHQgPSBmc2Zic2ZtKC0qYXJnLCAmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfZnNmbShpbnQgKmFyZykKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXJlc3VsdCA9IGZzZmJzZm0oKmFyZywgJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X2VvbShpbnQgKmR1bW15KQoteyAgICAgICAgICAgICAgCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JemZ0X3NraXBfdG9fZW9tKCZ6ZnRfcG9zKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfZXJhc2UoaW50ICpkdW1teSkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXJlc3VsdCA9IHpmdF9lcmFzZSgpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X3JhczIoaW50ICpkdW1teSkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXJlc3VsdCA9IC1FTk9TWVM7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19IAotCi0vKiAgU2V0cyB0aGUgbmV3IGJsb2Nrc2l6ZSBpbiBCWVRFUwotICoKLSAqLwotc3RhdGljIGludCBtdF9zZXRibGsoaW50ICpuZXdfc2l6ZSkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZigodW5zaWduZWQgaW50KSgqbmV3X3NpemUpID4gWkZUX01BWF9CTEtfU1opIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAotCQkJICAgICJkZXNpcmVkIGJsa19zeiAoJWQpIHNob3VsZCBiZSA8PSAlZCBieXRlcyIsCi0JCQkgICAgKm5ld19zaXplLCBaRlRfTUFYX0JMS19TWik7Ci0JfQotCWlmICgoKm5ld19zaXplICYgKEZUX1NFQ1RPUl9TSVpFLTEpKSAhPSAwKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKLQkJCSJkZXNpcmVkIGJsa19zeiAoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAlZCBieXRlcyIsCi0JCQkgICAgKm5ld19zaXplLCBGVF9TRUNUT1JfU0laRSk7Ci0JfQotCWlmICgqbmV3X3NpemUgPT0gMCkgewotCQlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbikgewotCQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAotCQkJCSAgICAiVmFyaWFibGUgYmxvY2sgc2l6ZSBub3QgeWV0ICIKLQkJCQkgICAgInN1cHBvcnRlZCB3aXRoIGNvbXByZXNzaW9uIik7Ci0JCX0KLQkJKm5ld19zaXplID0gMTsKLQl9Ci0JemZ0X2Jsa19zeiA9ICpuZXdfc2l6ZTsKLQlUUkFDRV9FWElUIDA7Ci19IAotCi1zdGF0aWMgaW50IG10X3NldGRlbnNpdHkoaW50ICphcmcpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JU0VUX1RSQUNFX0xFVkVMKCphcmcpOwotCVRSQUNFKFRSQUNFX0xFVkVMLCAidHJhY2luZyBzZXQgdG8gJWQiLCBUUkFDRV9MRVZFTCk7Ci0JaWYgKChpbnQpVFJBQ0VfTEVWRUwgIT0gKmFyZykgewotCQlUUkFDRV9FWElUIC1FSU5WQUw7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0gICAgICAgICAgCi0KLXN0YXRpYyBpbnQgbXRfc2VlayhpbnQgKm5ld19ibG9ja19wb3MpCi17IAotCWludCByZXN1bHQ9IDA7ICAgICAgICAKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCQotCXJlc3VsdCA9IHNlZWtfYmxvY2soMCwgKF9fczY0KSpuZXdfYmxvY2tfcG9zLCAmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qICBPSywgdGhpcyBpcyB0b3RhbGx5IGRpZmZlcmVudCBmcm9tIFNDU0ksIGJ1dCB0aGUgd29yc3QgdGhpbmcgdGhhdCBjYW4gCi0gKiAgaGFwcGVuIGlzIHRoYXQgdGhlcmUgaXMgbm90IGVub3VnaCBkZWZyYWdtZW50YXRlZCBtZW1vcnkgdGhhdCBjYW4gYmUgCi0gKiAgYWxsb2NhdGVkLiBBbHNvLCB0aGVyZSBpcyBhIGhhcmR3aXJlZCBsaW1pdCBvZiAxNiBkbWEgYnVmZmVycyBpbiB0aGUgCi0gKiAgc3RvY2sgZnRhcGUgbW9kdWxlLiBUaGlzIHNob3VsZG4ndCBicmluZyB0aGUgc3lzdGVtIGRvd24uCi0gKgotICogTk9URTogdGhlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdG90YWwgbnVtYmVyIG9mIGRtYSBidWZmZXJzIHRvIHVzZS4KLSAqICAgICAgIFRoZSBkcml2ZXIgbmVlZHMgYXQgbGVhc3QgMyBidWZmZXJzIHRvIGZ1bmN0aW9uIGF0IGFsbC4KLSAqIAotICovCi1zdGF0aWMgaW50IG10X3NldGRydmJ1ZmZlcihpbnQgKmNudCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICgqY250IDwgMykgewotCQlUUkFDRV9FWElUIC1FSU5WQUw7Ci0JfQotCVRSQUNFX0NBVENIKGZ0YXBlX3NldF9ucl9idWZmZXJzKCpjbnQpLCk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotLyogcmV0dXJuIHRoZSBibG9jayBwb3NpdGlvbiBmcm9tIHN0YXJ0IG9mIHZvbHVtZSAKLSAqLwotc3RhdGljIGludCBtdF90ZWxsKGludCAqYXJnKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCSphcmcgICA9IHpmdF9kaXZfYmxrc3ooemZ0X3Bvcy52b2x1bWVfcG9zLAotCQkJICAgICAgIHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpLT5ibGtfc3opOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBtdF9jb21wcmVzc2lvbihpbnQgKmFyZykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQkvKiAgT2suIFdlIGNvdWxkIGFsc28gY2hlY2sgd2hldGhlciBjb21wcmVzc2lvbiBpcyBhdmFpbGFibGUgYXQKLQkgKiAgYWxsIGJ5IHRyeWluZyB0byBsb2FkIHRoZSBjb21wcmVzc2lvbiBtb2R1bGUuICBXZSBjb3VsZAotCSAqICBhbHNvIGNoZWNrIGZvciBhIGJsb2NrIHNpemUgb2YgMSBieXRlIHdoaWNoIGlzIGlsbGVnYWwKLQkgKiAgd2l0aCBjb21wcmVzc2lvbi4gIEluc3RlYWQgb2YgZG9pbmcgaXQgaGVyZSB3ZSByZWx5IG9uCi0JICogIHpmdGFwZV93cml0ZSgpIHRvIGRvIHRoZSBwcm9wZXIgY2hlY2tzLgotCSAqLwotCWlmICgodW5zaWduZWQgaW50KSphcmcgPiAxKSB7Ci0JCVRSQUNFX0VYSVQgLUVJTlZBTDsKLQl9Ci0JaWYgKCphcmcgIT0gMCAmJiB6ZnRfYmxrX3N6ID09IDEpIHsgLyogdmFyaWFibGUgYmxvY2sgc2l6ZSAqLwotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCi0JCQkgICAgIkNvbXByZXNzaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICIKLQkJCSAgICAid2l0aCB2YXJpYWJsZSBibG9jayBzaXplIik7Ci0JfQotCXpmdF9tdF9jb21wcmVzc2lvbiAgPSAqYXJnOwotCWlmICgoemZ0X3VuaXQgJiBaRlRfWklQX01PREUpID09IDApIHsKLQkJemZ0X3VzZV9jb21wcmVzc2lvbiA9IHpmdF9tdF9jb21wcmVzc2lvbjsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiAgY2hlY2sgd2hldGhlciB3cml0ZSBhY2Nlc3MgaXMgYWxsb3dlZC4gV3JpdGUgYWNjZXNzIGlzIGRlbmllZCB3aGVuCi0gKiAgKyB6ZnRfd3JpdGVfcHJvdGVjdGVkID09IDEgLS0gdGhpcyBhY2NvdW50cyBmb3IgZWl0aGVyIGhhcmQgd3JpdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGlvbiBvZiB0aGUgY2FydHJpZGdlIG9yIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSBhY2Nlc3MgbW9kZSBvZiB0aGUgdGFwZSBkZXZpY2UKLSAqICArIHpmdF9vZmZsaW5lID09IDEgICAgICAgICAtLSB0aGlzIG1lYW55IHRoYXQgdGhlcmUgaXMgZWl0aGVyIG5vIHRhcGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhhdCB0aGUgTVRPRkZMSU5FIGlvY3RsIGhhcyBiZWVuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgaXNzdWVkIChgc29mdCBlamVjdCcpCi0gKiAgKyBmdF9mb3JtYXR0ZWQgPT0gMCAgICAgICAgLS0gdGhpcyBtZWFucyB0aGF0IHRoZSBjYXJ0cmlkZ2UgaXMgbm90Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkCi0gKiAgVGhlbiB3ZSBkaXN0aW51Z3Vpc2ggdHdvIGNhc2VzLiBXaGVuIHpmdF9xaWNfbW9kZSBpcyBUUlVFLCB0aGVuIHdlIHRyeQotICogIHRvIGVtdWxhdGUgYSBgdHJhZGl0aW9uYWwnIChha2EgU0NTSSBsaWtlKSBVTipYIHRhcGUgZGV2aWNlLiBUaGVyZWZvcmUgd2UKLSAqICBkZW55IHdyaXRlcyB3aGVuCi0gKiAgKyB6ZnRfcWljX21vZGUgPT0xICYmIAotICogICAgICAgKCF6ZnRfdGFwZV9hdF9sYm90KCkgJiYgICAtLSB0YXBlIG5vIGF0IGxvZ2ljYWwgQk9UCi0gKiAgICAgICAgISh6ZnRfdGFwZV9hdF9lb20oKSB8fCAgIC0tIHRhcGUgbm90IGF0IGxvZ2ljYWwgRU9NIChvciBFT0QpCi0gKiAgICAgICAgICAoemZ0X3RhcGVfYXRfZW9tKCkgJiYKLSAqICAgICAgICAgICB6ZnRfb2xkX2Z0YXBlKCkpKSkgICAgLS0gd2UgY2FuJ3QgYWRkIG5ldyB2b2x1bWUgdG8gdGFwZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gYnkgb2xkIGZ0YXBlIGJlY2F1c2UgZnRhcGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgdXNlIHRoZSB2b2x1bWUgdGFibGUKLSAqCi0gKiAgd2hlbiB0aGUgZHJpdmUgaXMgaW4gdHJ1ZSByYXcgbW9kZSAoYWthIC9kZXYvcmF3ZnQwKSB0aGVuIHdlIGRvbid0IAotICogIGNhcmUgYWJvdXQgTEJPVCBhbmQgRU9NIGNvbmRpdGlvbnMuIFRoaXMgZGV2aWNlIGlzIGludGVuZGVkIGZvciBhIAotICogIHVzZXIgbGV2ZWwgcHJvZ3JhbSB0aGF0IHdhbnRzIHRvIHRydWx5IGltcGxlbWVudCB0aGUgUUlDLTgwIGNvbXBsaWFuY2UKLSAqICBhdCB0aGUgbG9naWNhbCBkYXRhIGxheW91dCBsZXZlbCBvZiB0aGUgY2FydHJpZGdlLCBpLmUuIGltcGxlbWVudCBhbGwKLSAqICB0aGF0IHZvbHVtZSB0YWJsZSBhbmQgdm9sdW1lIGRpcmVjdG9yeSBzdHVmZiBldGMuPAotICovCi1pbnQgemZ0X2NoZWNrX3dyaXRlX2FjY2Vzcyh6ZnRfcG9zaXRpb24gKnBvcykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICh6ZnRfb2ZmbGluZSkgeyAvKiBvZmZsaW5lIGluY2x1ZGVzIG5vX3RhcGUgKi8KLQkJVFJBQ0VfQUJPUlQoLUVOWElPLAotCQkJICAgIGZ0X3RfaW5mbywgInRhcGUgaXMgb2ZmbGluZSBvciBubyBjYXJ0cmlkZ2UiKTsKLQl9Ci0JaWYgKCFmdF9mb3JtYXR0ZWQpIHsKLQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAidGFwZSBpcyBub3QgZm9ybWF0dGVkIik7Ci0JfSAKLQlpZiAoemZ0X3dyaXRlX3Byb3RlY3RlZCkgewotCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJjYXJ0cmlkZ2Ugd3JpdGUgcHJvdGVjdGVkIik7Ci0JfSAKLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCS8qICBjaGVjayBCT1QgY29uZGl0aW9uICovCi0JCWlmICghemZ0X3RhcGVfYXRfbGJvdChwb3MpKSB7Ci0JCQkvKiAgcHJvdGVjdCBjYXJ0cmlkZ2VzIHdyaXR0ZW4gYnkgb2xkIGZ0YXBlIGlmCi0JCQkgKiAgbm90IGF0IEJPVCBiZWNhdXNlIHRoZXkgdXNlIHRoZSB2dGJsCi0JCQkgKiAgc2VnbWVudCBmb3Igc3RvcmluZyBkYXRhCi0JCQkgKi8KLQkJCWlmICh6ZnRfb2xkX2Z0YXBlKSB7Ci0JCQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF93YXJuLCAKLSAgICAgICJDYW5ub3Qgd3JpdGUgdG8gY2FydHJpZGdlcyB3cml0dGVuIGJ5IG9sZCBmdGFwZSB3aGVuIG5vdCBhdCBCT1QiKTsKLQkJCX0KLQkJCS8qICBub3QgYXQgQk9ULCBidXQgYWxsb3cgd3JpdGVzIGF0IEVPRCwgb2YgY291cnNlCi0JCQkgKi8KLQkJCWlmICghemZ0X3RhcGVfYXRfZW9kKHBvcykpIHsKLQkJCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCi0JCQkJCSAgICAidGFwZSBub3QgYXQgQk9UIGFuZCBub3QgYXQgRU9EIik7Ci0JCQl9Ci0JCX0KLQkJLyogIGZpbmUuIE5vdyB0aGUgdGFwZSBpcyBlaXRoZXIgYXQgQk9UIG9yIGF0IEVPRC4gKi8KLQl9Ci0JLyogb3IgaW4gcmF3IG1vZGUgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBjYXJlIGFib3V0IEJPVCBhbmQgRU9EICovCi0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiAgICAgIE9QRU4gcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCi0gKgotICogICAgICBOT1RFOiB0aGlzIGlzIGFsc28gY2FsbGVkIGJ5IG10X3Jlc2V0KCkgd2l0aCBkZXZfbWlub3IgPT0gLTEKLSAqICAgICAgICAgICAgdG8gZmFrZSBhIHJlb3BlbiBhZnRlciBhIHJlc2V0LgotICovCi1pbnQgX3pmdF9vcGVuKHVuc2lnbmVkIGludCBkZXZfbWlub3IsIHVuc2lnbmVkIGludCBhY2Nlc3NfbW9kZSkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IHRhcGVfdW5pdDsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGZpbGVfYWNjZXNzX21vZGU7Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICgoaW50KWRldl9taW5vciA9PSAtMSkgewotCQkvKiBmYWtlIHJlb3BlbiAqLwotCQl6ZnRfdW5pdCAgICA9IHRhcGVfdW5pdDsKLQkJYWNjZXNzX21vZGUgPSBmaWxlX2FjY2Vzc19tb2RlOwotCQl6ZnRfaW5pdF9kcml2ZXIoKTsgLyogcmVzZXQgYWxsIHN0YXRpYyBkYXRhIHRvIGRlZmF1bHRzICovCi0JfSBlbHNlIHsKLQkJdGFwZV91bml0ICAgICAgICA9IGRldl9taW5vcjsKLQkJZmlsZV9hY2Nlc3NfbW9kZSA9IGFjY2Vzc19tb2RlOwotCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX2VuYWJsZShGVEFQRV9TRUwoZGV2X21pbm9yKSkpIDwgMCkgewotCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2VyciwKLQkJCQkgICAgImZ0YXBlX2VuYWJsZSBmYWlsZWQ6ICVkIiwgcmVzdWx0KTsKLQkJfQotCQlpZiAoZnRfbmV3X3RhcGUgfHwgZnRfbm9fdGFwZSB8fCAhZnRfZm9ybWF0dGVkIHx8Ci0JCSAgICAoRlRBUEVfU0VMKHpmdF91bml0KSAhPSBGVEFQRV9TRUwoZGV2X21pbm9yKSkgfHwKLQkJICAgICh6ZnRfdW5pdCAmIFpGVF9SQVdfTU9ERSkgIT0gKGRldl9taW5vciAmIFpGVF9SQVdfTU9ERSkpIHsKLQkJCS8qIHJlc2V0IGFsbCBzdGF0aWMgZGF0YSB0byBkZWZhdWx0cywKLQkJCSAqLwotCQkJemZ0X2luaXRfZHJpdmVyKCk7IAotCQl9Ci0JCXpmdF91bml0ID0gZGV2X21pbm9yOwotCX0KLQl6ZnRfc2V0X2ZsYWdzKHpmdF91bml0KTsgLyogZGVjb2RlIHRoZSBtaW5vciBiaXRzICovCi0JaWYgKHpmdF9ibGtfc3ogPT0gMSAmJiB6ZnRfdXNlX2NvbXByZXNzaW9uKSB7Ci0JCWZ0YXBlX2Rpc2FibGUoKTsgLyogcmVzZXRzIGZ0X25vX3RhcGUgKi8KLQkJVFJBQ0VfQUJPUlQoLUVOT0RFViwgZnRfdF93YXJuLCAiVmFyaWFibGUgYmxvY2sgc2l6ZSBub3QgeWV0ICIKLQkJCSAgICAic3VwcG9ydGVkIHdpdGggY29tcHJlc3Npb24iKTsKLQl9Ci0JLyogIG5vIG5lZWQgZm9yIG1vc3Qgb2YgdGhlIGJ1ZmZlcnMgd2hlbiBubyB0YXBlIG9yIG5vdAotCSAqICBmb3JtYXR0ZWQuICBmb3IgdGhlIHJlYWQvd3JpdGUgb3BlcmF0aW9ucywgaXQgaXMgdGhlCi0JICogIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGVyZSBpcyBubyB0YXBlLCBhIG5vdC1mb3JtYXR0ZWQgdGFwZQotCSAqICBvciB0aGUgd2hldGhlciB0aGUgZHJpdmVyIGlzIHNvZnQgb2ZmbGluZS4gIAotCSAqICBOZXZlcnRoZWxlc3Mgd2UgYWxsb3cgc29tZSBpb2N0bHMgd2l0aCBub24tZm9ybWF0dGVkIHRhcGVzLCAKLQkgKiAgbGlrZSByZXdpbmQgYW5kIHJlc2V0LgotCSAqLwotCWlmIChmdF9ub190YXBlIHx8ICFmdF9mb3JtYXR0ZWQpIHsKLQkJemZ0X3VuaW5pdF9tZW0oKTsKLQl9Ci0JaWYgKGZ0X25vX3RhcGUpIHsKLQkJemZ0X29mZmxpbmUgPSAxOyAvKiBzbyB3ZSBuZWVkIG5vdCB0ZXN0IHR3byB2YXJpYWJsZXMgKi8KLQl9Ci0JaWYgKChhY2Nlc3NfbW9kZSA9PSBPX1dST05MWSB8fCBhY2Nlc3NfbW9kZSA9PSBPX1JEV1IpICYmCi0JICAgIChmdF93cml0ZV9wcm90ZWN0ZWQgfHwgZnRfbm9fdGFwZSkpIHsKLQkJZnRhcGVfZGlzYWJsZSgpOyAvKiByZXNldHMgZnRfbm9fdGFwZSAqLwotCQlUUkFDRV9BQk9SVChmdF9ub190YXBlID8gLUVOWElPIDogLUVST0ZTLAotCQkJICAgIGZ0X3Rfd2FybiwgIndyb25nIGFjY2VzcyBtb2RlICVzIGNhcnRyaWRnZSIsCi0JCQkgICAgZnRfbm9fdGFwZSA/ICJ3aXRob3V0IGEiIDogIndpdGggd3JpdGUgcHJvdGVjdGVkIik7Ci0JfQotCXpmdF93cml0ZV9wcm90ZWN0ZWQgPSAoYWNjZXNzX21vZGUgPT0gT19SRE9OTFkgfHwgCi0JCQkgICAgICAgZnRfd3JpdGVfcHJvdGVjdGVkICE9IDApOwotCWlmICh6ZnRfd3JpdGVfcHJvdGVjdGVkKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCSAgICAgICJyZWFkIG9ubHkgYWNjZXNzIG1vZGU6ICVkLCAiCi0JCSAgICAgICJkcml2ZSB3cml0ZSBwcm90ZWN0ZWQ6ICVkIiwgCi0JCSAgICAgIGFjY2Vzc19tb2RlID09IE9fUkRPTkxZLAotCQkgICAgICBmdF93cml0ZV9wcm90ZWN0ZWQgIT0gMCk7Ci0JfQotCWlmICghemZ0X29mZmxpbmUpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2Nfb25jZSgmemZ0X2RlYmxvY2tfYnVmLEZUX1NFR01FTlRfU0laRSksCi0JCQkgICAgZnRhcGVfZGlzYWJsZSgpKTsKLQl9Ci0JLyogemZ0X3NlZ19wb3Mgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgdnRibCBzZWdwb3MgYnV0IG5vdAotCSAqIGlmIGluIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgb25seSBhZnRlciB3ZSByZWFkIGluIHRoZQotCSAqIGhlYWRlciBzZWdtZW50cwotCSAqCi0JICogbWlnaHQgYWxzbyBiZSBhIHByb2JsZW0gaWYgdGhlIHVzZXIgbWFrZXMgYSBiYWNrdXAgd2l0aCBhCi0JICogKnFmdCogZGV2aWNlIGFuZCByZXdpbmRzIGl0IHdpdGggYSByYXcgZGV2aWNlLgotCSAqLwotCWlmICh6ZnRfcWljX21vZGUgICAgICAgICAmJgotCSAgICAhemZ0X29sZF9mdGFwZSAgICAgICAmJgotCSAgICB6ZnRfcG9zLnNlZ19wb3MgPj0gMCAmJgotCSAgICB6ZnRfaGVhZGVyX3JlYWQgICAgICAmJiAKLQkgICAgemZ0X3Bvcy5zZWdfcG9zIDw9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCkgewotCQlUUkFDRShmdF90X25vaXNlLCAieW91IHByb2JhYmx5IG1peGVkIHVwIHRoZSB6ZnRhcGUgZGV2aWNlcyEiKTsKLQkJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsgCi0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogICAgICBSRUxFQVNFIHJvdXRpbmUgY2FsbGVkIGJ5IGtlcm5lbC1pbnRlcmZhY2UgY29kZQotICovCi1pbnQgX3pmdF9jbG9zZSh2b2lkKQotewotCWludCByZXN1bHQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmICh6ZnRfb2ZmbGluZSkgewotCQkvKiBjYWxsIHRoZSBoYXJkd2FyZSByZWxlYXNlIHJvdXRpbmUuIFB1dHMgdGhlIGRyaXZlIG9mZmxpbmUgKi8KLQkJZnRhcGVfZGlzYWJsZSgpOwotCQlUUkFDRV9FWElUIDA7Ci0JfQotCWlmICghKGZ0X3dyaXRlX3Byb3RlY3RlZCB8fCB6ZnRfb2xkX2Z0YXBlKSkgewotCQlyZXN1bHQgPSB6ZnRfZmx1c2hfYnVmZmVycygpOwotCQlUUkFDRShmdF90X25vaXNlLCAid3JpdGluZyBmaWxlIG1hcmsgYXQgY3VycmVudCBwb3NpdGlvbiIpOwotCQlpZiAoemZ0X3FpY19tb2RlICYmIHpmdF9jbG9zZV92b2x1bWUoJnpmdF9wb3MpID09IDApIHsKLQkJCXpmdF9tb3ZlX3Bhc3RfZW9mKCZ6ZnRfcG9zKTsKLQkJfQotCQlpZiAoKHpmdF90YXBlX2F0X2xib3QoJnpmdF9wb3MpIHx8Ci0JCSAgICAgISh6ZnRfdW5pdCAmIEZUQVBFX05PX1JFV0lORCkpKSB7Ci0JCQlpZiAocmVzdWx0ID49IDApIHsKLQkJCQlyZXN1bHQgPSB6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cygpOwotCQkJfSBlbHNlIHsKLQkJCQlUUkFDRShmdF90X2VyciwKLQkJCQkiRXJyb3I6IHVuYWJsZSB0byB1cGRhdGUgaGVhZGVyIHNlZ21lbnRzIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7Ci0JaWYgKCEoemZ0X3VuaXQgJiBGVEFQRV9OT19SRVdJTkQpKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZXdpbmRpbmcgdGFwZSIpOwotCQlpZiAoZnRhcGVfc2Vla190b19ib3QoKSA8IDAgJiYgcmVzdWx0ID49IDApIHsKLQkJCXJlc3VsdCA9IC1FSU87IC8qIGtlZXAgb2xkIHZhbHVlICovCi0JCX0KLQkJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKLQl9IAotCXpmdF96YXBfcmVhZF9idWZmZXJzKCk7Ci0JLyogIG5vdyBmcmVlIHVwIG1lbW9yeSBhcyBtdWNoIGFzIHBvc3NpYmxlLiBXZSBkb24ndCBkZXN0cm95Ci0JICogIHRoZSBkZWJsb2NrIGJ1ZmZlciBpZiBpdCBjb250YWluZXMgYSB2YWxpZCBzZWdtZW50LgotCSAqLwotCWlmICh6ZnRfZGVibG9ja19zZWdtZW50ID09IC0xKSB7Ci0JCXpmdF92ZnJlZSgmemZ0X2RlYmxvY2tfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOyAKLQl9Ci0JLyogaGlnaCBsZXZlbCBkcml2ZXIgc3RhdHVzLCBmb3JjZXMgY3JlYXRpb24gb2YgYSBuZXcgdm9sdW1lCi0JICogd2hlbiBjYWxsaW5nIGZ0YXBlX3dyaXRlIGFnYWluIGFuZCBub3QgemZ0X2p1c3RfYmVmb3JlX2VvZgotCSAqLwotCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOyAgCi0JaWYgKGdvaW5nX29mZmxpbmUpIHsKLQkJemZ0X2luaXRfZHJpdmVyKCk7Ci0JCXpmdF91bmluaXRfbWVtKCk7Ci0JCWdvaW5nX29mZmxpbmUgPSAwOwotCQl6ZnRfb2ZmbGluZSAgID0gMTsKLQl9IGVsc2UgaWYgKHpmdF9jbXByX2xvY2soMCAvKiBkb24ndCBsb2FkICovKSA9PSAwKSB7Ci0JCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsgLyogdW5sb2NrIGl0IGFnYWluICovCi0JfQotCXpmdF9tZW1vcnlfc3RhdHMoKTsKLQkvKiBjYWxsIHRoZSBoYXJkd2FyZSByZWxlYXNlIHJvdXRpbmUuIFB1dHMgdGhlIGRyaXZlIG9mZmxpbmUgKi8KLQlmdGFwZV9kaXNhYmxlKCk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qCi0gKiAgdGhlIHdyYXBwZXIgZnVuY3Rpb24gYXJvdW5kIHRoZSB3cmFwcGVyIE1USU9DVE9QIGlvY3RsCi0gKi8KLXN0YXRpYyBpbnQgbXRpb2N0b3Aoc3RydWN0IG10b3AgKm10b3AsIGludCBhcmdfc2l6ZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlmdW5fZW50cnkgKm10X2Z1bl9lbnRyeTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdG9wKSB8fCBtdG9wLT5tdF9vcCA+PSBOUl9NVF9DTURTKSB7Ci0JCVRSQUNFX0VYSVQgLUVJTlZBTDsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgTVRJT0NUT1AgY29tbWFuZDogJXMiLAotCSAgICAgIG10X2Z1bnNbbXRvcC0+bXRfb3BdLm5hbWUpOwotCW10X2Z1bl9lbnRyeT0gJm10X2Z1bnNbbXRvcC0+bXRfb3BdOwotCXpmdF9yZXNpZCA9IG10b3AtPm10X2NvdW50OwotCWlmICghbXRfZnVuX2VudHJ5LT5vZmZsaW5lICYmIHpmdF9vZmZsaW5lKSB7Ci0JCWlmIChmdF9ub190YXBlKSB7Ci0JCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgIm5vIHRhcGUgcHJlc2VudCIpOwotCQl9IGVsc2UgewotCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2luZm8sICJkcml2ZSBpcyBvZmZsaW5lIik7Ci0JCX0KLQl9Ci0JaWYgKCFtdF9mdW5fZW50cnktPm5vdF9mb3JtYXR0ZWQgJiYgIWZ0X2Zvcm1hdHRlZCkgewotCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJ0YXBlIGlzIG5vdCBmb3JtYXR0ZWQiKTsKLQl9Ci0JaWYgKCFtdF9mdW5fZW50cnktPndyaXRlX3Byb3RlY3RlZCkgewotCQlUUkFDRV9DQVRDSCh6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKCZ6ZnRfcG9zKSwpOwotCX0KLQlpZiAobXRfZnVuX2VudHJ5LT5uZWVkX2lkbGVfc3RhdGUgJiYgISh6ZnRfb2ZmbGluZSB8fCAhZnRfZm9ybWF0dGVkKSkgewotCQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOwotCX0KLQlpZiAoIXpmdF9xaWNfbW9kZSAmJiAhbXRfZnVuX2VudHJ5LT5yYXdfbW9kZSkgewotCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sIAotIkRyaXZlIG5lZWRzIHRvIGJlIGluIFFJQy04MCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIHRoaXMgY29tbWFuZCIpOwotCX0KLQlyZXN1bHQgPSAobXRfZnVuX2VudHJ5LT5mdW5jdGlvbikoJm10b3AtPm10X2NvdW50KTsKLQlpZiAoemZ0X3RhcGVfYXRfbGJvdCgmemZ0X3BvcykpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMoKSwpOwotCX0KLQlpZiAocmVzdWx0ID49IDApIHsKLQkJemZ0X3Jlc2lkID0gMDsKLQl9Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qCi0gKiAgc3RhbmRhcmQgTVRJT0NHRVQgaW9jdGwKLSAqLwotc3RhdGljIGludCBtdGlvY2dldChzdHJ1Y3QgbXRnZXQgKm10Z2V0LCBpbnQgYXJnX3NpemUpCi17Ci0JY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZTsKLQlfX3M2NCBtYXhfdGFwZV9wb3M7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRnZXQpKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsCi0JCQkgICAgYXJnX3NpemUpOwotCX0KLQltdGdldC0+bXRfdHlwZSAgPSBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCArIDB4ODAwMDAwOwotCW10Z2V0LT5tdF9kc3JlZyA9IGZ0X2xhc3Rfc3RhdHVzLnNwYWNlOwotCW10Z2V0LT5tdF9lcnJlZyA9IGZ0X2xhc3RfZXJyb3Iuc3BhY2U7IC8qIGVycm9yIHJlZ2lzdGVyICovCi0JbXRnZXQtPm10X3Jlc2lkID0gemZ0X3Jlc2lkOyAvKiByZXNpZHV1bSBvZiB3cml0ZXMsIHJlYWRzIGFuZAotCQkJCSAgICAgICogTVRJT0NUT1AgY29tbWFuZHMgCi0JCQkJICAgICAgKi8KLQlpZiAoIXpmdF9vZmZsaW5lKSB7IC8qIG5laXRoZXIgbm9fdGFwZSBub3Igc29mdCBvZmZsaW5lICovCi0JCW10Z2V0LT5tdF9nc3RhdCA9IEdNVF9PTkxJTkUofjBVTCk7Ci0JCS8qIHNob3VsZCByYXRoZXIgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIGNhcnRyaWRnZQotCQkgKiB0aGFuIHRoZSBhY2Nlc3MgbW9kZSBvZiB0aGUgZmlsZSwgdGhlcmVmb3IgdXNlCi0JCSAqIGZ0X3dyaXRlX3Byb3RlY3RlZCwgbm90IHpmdF93cml0ZV9wcm90ZWN0ZWQgCi0JCSAqLwotCQlpZiAoZnRfd3JpdGVfcHJvdGVjdGVkKSB7Ci0JCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX1dSX1BST1QofjBVTCk7Ci0JCX0KLQkJaWYoemZ0X2hlYWRlcl9yZWFkKSB7IC8qIHRoaXMgY2F0Y2hlcyBub24tZm9ybWF0dGVkICovCi0JCQl2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUoemZ0X3Bvcy5zZWdfcG9zKTsKLQkJCW10Z2V0LT5tdF9maWxlbm8gPSB2b2x1bWUtPmNvdW50OwotCQkJbWF4X3RhcGVfcG9zID0gemZ0X2NhcGFjaXR5IC0gemZ0X2Jsa19zejsKLQkJCWlmICh6ZnRfdXNlX2NvbXByZXNzaW9uKSB7Ci0JCQkJbWF4X3RhcGVfcG9zIC09IFpGVF9DTVBSX09WRVJIRUFEOwotCQkJfQotCQkJaWYgKHpmdF90YXBlX2F0X2VvZCgmemZ0X3BvcykpIHsKLQkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0VPRCh+MFVMKTsKLQkJCX0KLQkJCWlmICh6ZnRfcG9zLnRhcGVfcG9zID4gbWF4X3RhcGVfcG9zKSB7Ci0JCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9FT1QofjBVTCk7Ci0JCQl9Ci0JCQltdGdldC0+bXRfYmxrbm8gPSB6ZnRfZGl2X2Jsa3N6KHpmdF9wb3Mudm9sdW1lX3BvcywKLQkJCQkJCQl2b2x1bWUtPmJsa19zeik7Ci0JCQlpZiAoemZ0X2p1c3RfYmVmb3JlX2VvZikgewotCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfRU9GKH4wVUwpOwotCQkJfQotCQkJaWYgKHpmdF90YXBlX2F0X2xib3QoJnpmdF9wb3MpKSB7Ci0JCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9CT1QofjBVTCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltdGdldC0+bXRfZmlsZW5vID0gbXRnZXQtPm10X2Jsa25vID0gLTE7Ci0JCQlpZiAobXRnZXQtPm10X2RzcmVnICYgUUlDX1NUQVRVU19BVF9CT1QpIHsKLQkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0JPVCh+MFVMKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChmdF9ub190YXBlKSB7Ci0JCQltdGdldC0+bXRfZ3N0YXQgPSBHTVRfRFJfT1BFTih+MFVMKTsKLQkJfSBlbHNlIHsKLQkJCW10Z2V0LT5tdF9nc3RhdCA9IDBVTDsKLQkJfQotIAkJbXRnZXQtPm10X2ZpbGVubyA9IG10Z2V0LT5tdF9ibGtubyA9IC0xOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLSNpZmRlZiBNVElPQ1JERlRTRUcKLS8qCi0gKiAgUmVhZCBhIGZsb3BweSB0YXBlIHNlZ21lbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgdGhlCi0gKiAgdm9sdW1lIHRhYmxlLCBhbmQgcmVhZCB0aGUgb2xkIGhlYWRlciBzZWdtZW50IGJlZm9yZSByZS1mb3JtYXR0aW5nCi0gKiAgdGhlIGNhcnRyaWRnZS4KLSAqLwotc3RhdGljIGludCBtdGlvY3JkZnRzZWcoc3RydWN0IG10ZnRzZWcgKiBtdGZ0c2VnLCBpbnQgYXJnX3NpemUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DUkRGVFNFRyIpOwotCWlmICh6ZnRfcWljX21vZGUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAotCQkJICAgICJkcml2ZXIgbmVlZHMgdG8gYmUgaW4gcmF3IG1vZGUgZm9yIHRoaXMgaW9jdGwiKTsKLQl9IAotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10ZnRzZWcpKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsCi0JCQkgICAgYXJnX3NpemUpOwotCX0KLQlpZiAoemZ0X29mZmxpbmUpIHsKLQkJVFJBQ0VfRVhJVCAtRU5YSU87Ci0JfQotCWlmIChtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1JEX1NJTkdMRSAmJgotCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1JEX0FIRUFEKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImludmFsaWQgcmVhZCBtb2RlIik7Ci0JfQotCWlmICghZnRfZm9ybWF0dGVkKSB7Ci0JCVRSQUNFX0VYSVQgLUVBQ0NFUzsgLyogLUVOWElPID8gKi8KLQotCX0KLQlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgewotCQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOwotCX0KLQlpZiAobXRmdHNlZy0+bXRfc2Vnbm8gPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJzZWdtZW50IG51bWJlciBpcyB0b28gbGFyZ2UiKTsKLQl9Ci0JbXRmdHNlZy0+bXRfcmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KG10ZnRzZWctPm10X3NlZ25vLAotCQkJCQkJemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJbXRmdHNlZy0+bXRfbW9kZSk7Ci0JaWYgKG10ZnRzZWctPm10X3Jlc3VsdCA8IDApIHsKLQkJLyogIGEgbmVnYXRpdiByZXN1bHQgaXMgbm90IGFuIGlvY3RsIGVycm9yLiBpZgotCQkgKiAgdGhlIHVzZXIgd2FudHMgdG8gcmVhZCBkYW1hZ2VkIHRhcGVzLAotCQkgKiAgaXQncyB1cCB0byBoZXIvaGltCi0JCSAqLwotCQlUUkFDRV9FWElUIDA7Ci0JfQotCWlmIChjb3B5X3RvX3VzZXIobXRmdHNlZy0+bXRfZGF0YSwKLQkJCSB6ZnRfZGVibG9ja19idWYsCi0JCQkgbXRmdHNlZy0+bXRfcmVzdWx0KSAhPSAwKSB7Ci0JCVRSQUNFX0VYSVQgLUVGQVVMVDsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBNVElPQ1dSRlRTRUcKLS8qCi0gKiAgd3JpdGUgYSBmbG9wcHkgdGFwZSBzZWdtZW50LiBUaGlzIHZlcnNpb24gZmVhdHVyZXMgd3JpdGluZyBvZgotICogIGRlbGV0ZWQgYWRkcmVzcyBtYXJrcywgYW5kIGdyYWNlZnVsbHkgaWdub3JlcyB0aGUgKHNvZnR3YXJlKQotICogIGZ0X2Zvcm1hdHRlZCBmbGFnIHRvIHN1cHBvcnQgd3JpdGluZyBvZiBoZWFkZXIgc2VnbWVudHMgYWZ0ZXIKLSAqICBmb3JtYXR0aW5nLgotICovCi1zdGF0aWMgaW50IG10aW9jd3JmdHNlZyhzdHJ1Y3QgbXRmdHNlZyAqIG10ZnRzZWcsIGludCBhcmdfc2l6ZSkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1dSRlRTRUciKTsKLQlpZiAoemZ0X3dyaXRlX3Byb3RlY3RlZCB8fCB6ZnRfcWljX21vZGUpIHsKLQkJVFJBQ0VfRVhJVCAtRUFDQ0VTOwotCX0gCi0JaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRmdHNlZykpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwKLQkJCSAgICBhcmdfc2l6ZSk7Ci0JfQotCWlmICh6ZnRfb2ZmbGluZSkgewotCQlUUkFDRV9FWElUIC1FTlhJTzsKLQl9Ci0JaWYgKG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfQVNZTkMgICAmJiAKLQkgICAgbXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9NVUxUSSAgICYmCi0JICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfU0lOR0xFICAmJgotCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX0RFTEVURSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJpbnZhbGlkIHdyaXRlIG1vZGUiKTsKLQl9Ci0JLyoKLQkgKiAgV2UgZG9uJ3QgY2hlY2sgZm9yIGZ0X2Zvcm1hdHRlZCwgYmVjYXVzZSB0aGlzIGdpdmVzCi0JICogIG9ubHkgdGhlIHNvZnR3YXJlIHN0YXR1cyBvZiB0aGUgZHJpdmVyLgotCSAqCi0JICogIFdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIGtub3dzIHdoYXQgaXQgaXMKLQkgKiAgZG9pbmcuIEFuZCByZWx5IG9uIHRoZSBsb3cgbGV2ZWwgc3R1ZmYgdG8gZmFpbAotCSAqICB3aGVuIHRoZSB0YXBlIGlzbid0IGZvcm1hdHRlZC4gV2Ugb25seSBtYWtlIHN1cmUKLQkgKiAgdGhhdCBUaGUgaGVhZGVyIHNlZ21lbnQgYnVmZmVyIGlzIGFsbG9jYXRlZCwKLQkgKiAgYmVjYXVzZSBpdCBob2xkcyB0aGUgYmFkIHNlY3RvciBtYXAuCi0JICovCi0JaWYgKHpmdF9oc2VnX2J1ZiA9PSBOVUxMKSB7Ci0JCVRSQUNFX0VYSVQgLUVOWElPOwotCX0KLQlpZiAobXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9ERUxFVEUpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHpmdF9kZWJsb2NrX2J1ZiwgCi0JCQkJICAgbXRmdHNlZy0+bXRfZGF0YSwKLQkJCQkgICBGVF9TRUdNRU5UX1NJWkUpICE9IDApIHsKLQkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKLQkJfQotCX0KLQltdGZ0c2VnLT5tdF9yZXN1bHQgPSBmdGFwZV93cml0ZV9zZWdtZW50KG10ZnRzZWctPm10X3NlZ25vLCAKLQkJCQkJCSB6ZnRfZGVibG9ja19idWYsCi0JCQkJCQkgbXRmdHNlZy0+bXRfbW9kZSk7Ci0JaWYgKG10ZnRzZWctPm10X3Jlc3VsdCA+PSAwICYmIG10ZnRzZWctPm10X21vZGUgPT0gRlRfV1JfU0lOR0xFKSB7Ci0JCS8qICAKLQkJICogIGEgbmVnYXRpdiByZXN1bHQgaXMgbm90IGFuIGlvY3RsIGVycm9yLiBpZgotCQkgKiAgdGhlIHVzZXIgd2FudHMgdG8gd3JpdGUgZGFtYWdlZCB0YXBlcywKLQkJICogIGl0J3MgdXAgdG8gaGVyL2hpbQotCQkgKi8KLQkJaWYgKChyZXN1bHQgPSBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCkpIDwgMCkgewotCQkJbXRmdHNlZy0+bXRfcmVzdWx0ID0gcmVzdWx0OwotCQl9Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLSNlbmRpZgotICAKLSNpZmRlZiBNVElPQ1ZPTElORk8KLS8qCi0gKiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHZvbHVtZSBwb3NpdGlvbmVkIGF0LgotICovCi1zdGF0aWMgaW50IG10aW9jdm9saW5mbyhzdHJ1Y3QgbXR2b2xpbmZvICp2b2xpbmZvLCBpbnQgYXJnX3NpemUpCi17Ci0JY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NWT0xJTkZPIik7Ci0JaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXR2b2xpbmZvKSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAotCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKLQl9Ci0JaWYgKHpmdF9vZmZsaW5lKSB7Ci0JCVRSQUNFX0VYSVQgLUVOWElPOwotCX0KLQlpZiAoIWZ0X2Zvcm1hdHRlZCkgewotCQlUUkFDRV9FWElUIC1FQUNDRVM7Ci0JfQotCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7Ci0Jdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3Bvcyk7Ci0Jdm9saW5mby0+bXRfdm9sbm8gICA9IHZvbHVtZS0+Y291bnQ7Ci0Jdm9saW5mby0+bXRfYmxrc3ogICA9IHZvbHVtZS0+YmxrX3N6ID09IDEgPyAwIDogdm9sdW1lLT5ibGtfc3o7Ci0Jdm9saW5mby0+bXRfc2l6ZSAgICA9IHZvbHVtZS0+c2l6ZSA+PiAxMDsKLQl2b2xpbmZvLT5tdF9yYXdzaXplID0gKCh6ZnRfY2FsY190YXBlX3Bvcyh2b2x1bWUtPmVuZF9zZWcgKyAxKSA+PiAxMCkgLQotCQkJICAgICAgICh6ZnRfY2FsY190YXBlX3Bvcyh2b2x1bWUtPnN0YXJ0X3NlZykgPj4gMTApKTsKLQl2b2xpbmZvLT5tdF9jbXByICAgID0gdm9sdW1lLT51c2VfY29tcHJlc3Npb247Ci0JVFJBQ0VfRVhJVCAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBaRlRfT0JTT0xFVEUgIAotc3RhdGljIGludCBtdGlvY196ZnRhcGVfZ2V0Ymxrc3ooc3RydWN0IG10Ymxrc3ogKmJsa3N6LCBpbnQgYXJnX3NpemUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgotCSAgICAgIEtFUk5fSU5GTyAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NfWlRBUEVfR0VUQkxLU1pcbiIKLQkgICAgICBLRVJOX0lORk8gIlRoaXMgaW9jdGwgaXMgaGVyZSBtZXJlbHkgZm9yIGNvbXBhdGliaWxpdHkuXG4iCi0JICAgICAgS0VSTl9JTkZPICJQbGVhc2UgdXNlIE1USU9DVk9MSU5GTyBpbnN0ZWFkIik7Ci0JaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRibGtzeikpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKLQkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7Ci0JfQotCWlmICh6ZnRfb2ZmbGluZSkgewotCQlUUkFDRV9FWElUIC1FTlhJTzsKLQl9Ci0JaWYgKCFmdF9mb3JtYXR0ZWQpIHsKLQkJVFJBQ0VfRVhJVCAtRUFDQ0VTOwotCX0KLQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOwotCWJsa3N6LT5tdF9ibGtzeiA9IHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpLT5ibGtfc3o7Ci0JVFJBQ0VfRVhJVCAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBNVElPQ0dFVFNJWkUKLS8qCi0gKiAgZ2V0IHRoZSBjYXBhY2l0eSBvZiB0aGUgdGFwZSBjYXJ0cmlkZ2UuCi0gKi8KLXN0YXRpYyBpbnQgbXRpb2NnZXRzaXplKHN0cnVjdCBtdHRhcGVzaXplICpzaXplLCBpbnQgYXJnX3NpemUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DX1pGVEFQRV9HRVRTSVpFIik7Ci0JaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXR0YXBlc2l6ZSkpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKLQkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7Ci0JfQotCWlmICh6ZnRfb2ZmbGluZSkgewotCQlUUkFDRV9FWElUIC1FTlhJTzsKLQl9Ci0JaWYgKCFmdF9mb3JtYXR0ZWQpIHsKLQkJVFJBQ0VfRVhJVCAtRUFDQ0VTOwotCX0KLQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOwotCXNpemUtPm10X2NhcGFjaXR5ID0gKHVuc2lnbmVkIGludCkoemZ0X2NhcGFjaXR5Pj4xMCk7Ci0Jc2l6ZS0+bXRfdXNlZCAgICAgPSAodW5zaWduZWQgaW50KSh6ZnRfZ2V0X2VvbV9wb3MoKT4+MTApOwotCVRSQUNFX0VYSVQgMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IG10aW9jcG9zKHN0cnVjdCBtdHBvcyAqbXRwb3MsIGludCBhcmdfc2l6ZSkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1BPUyIpOwotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10cG9zKSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAotCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKLQl9Ci0JcmVzdWx0ID0gbXRfdGVsbCgoaW50ICopJm10cG9zLT5tdF9ibGtubyk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBNVElPQ0ZURk9STUFUCi0vKgotICogZm9ybWF0dGluZyBvZiBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2VzLiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKLSAqIHRvZ2V0aGVyIHdpdGggdGhlIE1USU9DRlRDTUQgaW9jdGwgYW5kIHRoZSBuZXcgbW1hcCBmZWF0dXJlIAotICovCi0KLS8qIAotICogIFRoaXMgZnVuY3Rpb24gdXNlcyBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoKSB0byBpbmZvcm0gdGhlIGxvdwotICogIGxldmVsIGZ0YXBlIG1vZHVsZSBhYm91dCB0aGUgbmV3IHBhcmFtZXRlcnMuCi0gKgotICogIEl0IGVyYXNlcyB0aGUgaHNlZ19idWYuIFRoZSBjYWxsaW5nIHByb2Nlc3MgbXVzdCBzcGVjaWZ5IGFsbAotICogIHBhcmFtZXRlcnMgdG8gYXNzdXJlIHByb3BlciBvcGVyYXRpb24uCi0gKgotICogIHJldHVybiB2YWx1ZXM6IC1FSU5WQUwgLSB3cm9uZyBhcmd1bWVudCBzaXplCi0gKiAgICAgICAgICAgICAgICAgLUVJTlZBTCAtIGlmIGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudCgpIGZhaWxlZC4KLSAqLwotc3RhdGljIGludCBzZXRfZm9ybWF0X3Bhcm1zKHN0cnVjdCBmdGZtdHBhcm1zICpwLCBfX3U4ICpoc2VnX2J1ZikKLXsKLQlmdF90cmFjZV90IG9sZF9sZXZlbCA9IFRSQUNFX0xFVkVMOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIk1USU9DRlRGT1JNQVQgb3BlcmF0aW9uIEZURk1UX1NFVFBBUk1TIik7Ci0JbWVtc2V0KGhzZWdfYnVmLCAwLCBGVF9TRUdNRU5UX1NJWkUpOwotCVBVVDQoaHNlZ19idWYsIEZUX1NJR05BVFVSRSwgRlRfSFNFR19NQUdJQyk7Ci0KLQkvKiAgZmlsbCBpbiB1c2VyIHNwZWNpZmllZCBwYXJhbWV0ZXJzCi0JICovCi0JaHNlZ19idWZbRlRfRk1UX0NPREVdID0gKF9fdTgpcC0+ZnRfZm10Y29kZTsKLQlQVVQyKGhzZWdfYnVmLCBGVF9TUFQsIHAtPmZ0X3NwdCk7Ci0JaHNlZ19idWZbRlRfVFBDXSAgICAgID0gKF9fdTgpcC0+ZnRfdHBjOwotCWhzZWdfYnVmW0ZUX0ZITV0gICAgICA9IChfX3U4KXAtPmZ0X2ZobTsKLQloc2VnX2J1ZltGVF9GVE1dICAgICAgPSAoX191OClwLT5mdF9mdG07Ci0KLQkvKiAgZmlsbCBpbiBzYW5lIGRlZmF1bHRzIHRvIG1ha2UgZnRhcGUgaGFwcHkuCi0JICovIAotCWhzZWdfYnVmW0ZUX0ZTTV0gPSAoX191OCkxMjg7IC8qIDEyOCBpcyBoYXJkIHdpcmVkIGFsbCBvdmVyIGZ0YXBlICovCi0JaWYgKHAtPmZ0X2ZtdGNvZGUgPT0gZm10X2JpZykgewotCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0hTRUdfMSwgICAwKTsKLQkJUFVUNChoc2VnX2J1ZiwgRlRfNl9IU0VHXzIsICAgMSk7Ci0JCVBVVDQoaHNlZ19idWYsIEZUXzZfRlJTVF9TRUcsIDIpOwotCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0xBU1RfU0VHLCBwLT5mdF9zcHQgKiBwLT5mdF90cGMgLSAxKTsKLQl9IGVsc2UgewotCQlQVVQyKGhzZWdfYnVmLCBGVF9IU0VHXzEsICAgIDApOwotCQlQVVQyKGhzZWdfYnVmLCBGVF9IU0VHXzIsICAgIDEpOwotCQlQVVQyKGhzZWdfYnVmLCBGVF9GUlNUX1NFRywgIDIpOwotCQlQVVQyKGhzZWdfYnVmLCBGVF9MQVNUX1NFRywgcC0+ZnRfc3B0ICogcC0+ZnRfdHBjIC0gMSk7Ci0JfQotCi0JLyogIFN5bmNocm9uaXplIHdpdGggdGhlIGxvdyBsZXZlbCBtb2R1bGUuIFRoaXMgaXMgcGFydGljdWxhcmx5Ci0JICogIG5lZWRlZCBmb3IgdW5mb3JtYXR0ZWQgY2FydHJpZGdlcyBhcyB0aGUgUUlDIHN0ZCB3YXMgcHJldmlvdXNseSAKLQkgKiAgdW5rbm93biBCVVQgaXMgbmVlZGVkIHRvIHNldCBkYXRhIHJhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aW1lb3V0cy4KLQkgKi8KLQlUUkFDRV9DQVRDSChmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHAtPmZ0X3FpY3N0ZCZRSUNfVEFQRV9TVERfTUFTSyksCi0JCSAgICBfcmVzID0gLUVJTlZBTCk7Ci0KLQkvKiAgVGhlIGZvbGxvd2luZyB3aWxsIGFsc28gcmVjYWxjdWFsdGUgdGhlIHRpbWVvdXRzIGZvciB0aGUgdGFwZQotCSAqICBsZW5ndGggYW5kIFFJQyBzdGQgd2Ugd2FudCB0byBmb3JtYXQgdG8uCi0JICogIGFib3J0IHdpdGggLUVJTlZBTCByYXRoZXIgdGhhbiAtRUlPCi0JICovCi0JU0VUX1RSQUNFX0xFVkVMKGZ0X3Rfd2Fybik7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KGhzZWdfYnVmKSwKLQkJICAgIFNFVF9UUkFDRV9MRVZFTChvbGRfbGV2ZWwpOyBfcmVzID0gLUVJTlZBTCk7Ci0JU0VUX1RSQUNFX0xFVkVMKG9sZF9sZXZlbCk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKgotICogIFJldHVybiB0aGUgaW50ZXJuYWwgU09GVFdBUkUgc3RhdHVzIG9mIHRoZSBrZXJuZWwgZHJpdmVyLiBUaGlzIGRvZXMKLSAqICBOT1QgcXVlcnkgdGhlIHRhcGUgZHJpdmUgYWJvdXQgaXRzIHN0YXR1cy4KLSAqLwotc3RhdGljIGludCBnZXRfZm9ybWF0X3Bhcm1zKHN0cnVjdCBmdGZtdHBhcm1zICpwLCBfX3U4ICpoc2VnX2J1ZmZlcikKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNVElPQ0ZURk9STUFUIG9wZXJhdGlvbiBGVEZNVF9HRVRQQVJNUyIpOwotCXAtPmZ0X3FpY3N0ZCAgPSBmdF9xaWNfc3RkOwotCXAtPmZ0X2ZtdGNvZGUgPSBmdF9mb3JtYXRfY29kZTsKLQlwLT5mdF9maG0gICAgID0gaHNlZ19idWZmZXJbRlRfRkhNXTsKLQlwLT5mdF9mdG0gICAgID0gaHNlZ19idWZmZXJbRlRfRlRNXTsKLQlwLT5mdF9zcHQgICAgID0gZnRfc2VnbWVudHNfcGVyX3RyYWNrOwotCXAtPmZ0X3RwYyAgICAgPSBmdF90cmFja3NfcGVyX3RhcGU7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IG10aW9jZnRmb3JtYXQoc3RydWN0IG10ZnRmb3JtYXQgKm10ZnRmb3JtYXQsIGludCBhcmdfc2l6ZSkKLXsKLQlpbnQgcmVzdWx0OwotCXVuaW9uIGZtdF9hcmcgKmFyZyA9ICZtdGZ0Zm9ybWF0LT5mbXRfYXJnOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DRlRGT1JNQVQiKTsKLQlpZiAoemZ0X29mZmxpbmUpIHsKLQkJaWYgKGZ0X25vX3RhcGUpIHsKLQkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAibm8gdGFwZSBwcmVzZW50Iik7Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgImRyaXZlIGlzIG9mZmxpbmUiKTsKLQkJfQotCX0KLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywKLQkJCSAgICAiZHJpdmVyIG5lZWRzIHRvIGJlIGluIHJhdyBtb2RlIGZvciB0aGlzIGlvY3RsIik7Ci0JfSAKLQlpZiAoemZ0X2hzZWdfYnVmID09IE5VTEwpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X3ZjYWxsb2Nfb25jZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpLCk7Ci0JfQotCXpmdF9oZWFkZXJfcmVhZCA9IDA7Ci0Jc3dpdGNoKG10ZnRmb3JtYXQtPmZtdF9vcCkgewotCWNhc2UgRlRGTVRfU0VUX1BBUk1TOgotCQlUUkFDRV9DQVRDSChzZXRfZm9ybWF0X3Bhcm1zKCZhcmctPmZtdF9wYXJtcywgemZ0X2hzZWdfYnVmKSwpOwotCQlUUkFDRV9FWElUIDA7Ci0JY2FzZSBGVEZNVF9HRVRfUEFSTVM6Ci0JCVRSQUNFX0NBVENIKGdldF9mb3JtYXRfcGFybXMoJmFyZy0+Zm10X3Bhcm1zLCB6ZnRfaHNlZ19idWYpLCk7Ci0JCVRSQUNFX0VYSVQgMDsKLQljYXNlIEZURk1UX0ZPUk1BVF9UUkFDSzoKLQkJaWYgKChmdF9mb3JtYXR0ZWQgJiYgemZ0X2NoZWNrX3dyaXRlX2FjY2VzcygmemZ0X3BvcykgPCAwKSB8fAotCQkgICAgKCFmdF9mb3JtYXR0ZWQgJiYgemZ0X3dyaXRlX3Byb3RlY3RlZCkpIHsKLQkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgIldyaXRlIGFjY2VzcyBkZW5pZWQiKTsKLQkJfQotCQlUUkFDRV9DQVRDSChmdGFwZV9mb3JtYXRfdHJhY2soYXJnLT5mbXRfdHJhY2suZnRfdHJhY2ssCi0JCQkJCSAgICAgICBhcmctPmZtdF90cmFjay5mdF9nYXAzKSwpOwotCQlUUkFDRV9FWElUIDA7Ci0JY2FzZSBGVEZNVF9TVEFUVVM6Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2Zvcm1hdF9zdGF0dXMoJmFyZy0+Zm10X3N0YXR1cy5mdF9zZWdtZW50KSwpOwotCQlUUkFDRV9FWElUIDA7Ci0JY2FzZSBGVEZNVF9WRVJJRlk6Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX3ZlcmlmeV9zZWdtZW50KGFyZy0+Zm10X3ZlcmlmeS5mdF9zZWdtZW50LAotCQkJCShTZWN0b3JNYXAgKikmYXJnLT5mbXRfdmVyaWZ5LmZ0X2JzbSksKTsKLQkJVFJBQ0VfRVhJVCAwOwotCWRlZmF1bHQ6Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfZXJyLCAiSW52YWxpZCBmb3JtYXQgb3BlcmF0aW9uIik7Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotI2VuZGlmCi0KLSNpZmRlZiBNVElPQ0ZUQ01ECi0vKgotICogIHNlbmQgYSBRSUMtMTE3IGNvbW1hbmQgdG8gdGhlIGRyaXZlLCB3aXRoIG9wdGlvbmFsIHRpbWVvdXRzLAotICogIHBhcmFtZXRlciBhbmQgcmVzdWx0IGJpdHMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0b2dldGhlcgotICogIHdpdGggdGhlIGZvcm1hdHRpbmcgaW9jdGwuCi0gKi8KLXN0YXRpYyBpbnQgbXRpb2NmdGNtZChzdHJ1Y3QgbXRmdGNtZCAqZnRjbWQsIGludCBhcmdfc2l6ZSkKLXsKLQlpbnQgaTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ0ZUQ01EIik7Ci0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCVRSQUNFX0FCT1JUKC1FUEVSTSwgZnRfdF9pbmZvLAotCQkJICAgICJuZWVkIENBUF9TWVNfQURNSU4gY2FwYWJpbGl0eSB0byBzZW5kIHJhdyBxaWMtMTE3IGNvbW1hbmRzIik7Ci0JfQotCWlmICh6ZnRfcWljX21vZGUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAotCQkJICAgICJkcml2ZXIgbmVlZHMgdG8gYmUgaW4gcmF3IG1vZGUgZm9yIHRoaXMgaW9jdGwiKTsKLQl9IAotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10ZnRjbWQpKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsCi0JCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOwotCX0KLQlpZiAoZnRjbWQtPmZ0X3dhaXRfYmVmb3JlKSB7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRjbWQtPmZ0X3dhaXRfYmVmb3JlLAotCQkJCQkgICAgICZmdGNtZC0+ZnRfc3RhdHVzKSwpOwotCX0KLQlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpCi0JCWdvdG8gZnRtdGNtZF9lcnJvcjsKLQlpZiAoZnRjbWQtPmZ0X3Jlc3VsdF9iaXRzICE9IDApIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X29wZXJhdGlvbigmZnRjbWQtPmZ0X3Jlc3VsdCwKLQkJCQkJCSAgIGZ0Y21kLT5mdF9jbWQsCi0JCQkJCQkgICBmdGNtZC0+ZnRfcmVzdWx0X2JpdHMpLCk7Ci0JfSBlbHNlIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChmdGNtZC0+ZnRfY21kKSwpOwotCQlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpCi0JCQlnb3RvIGZ0bXRjbWRfZXJyb3I7Ci0JCWZvciAoaSA9IDA7IGkgPCBmdGNtZC0+ZnRfcGFybV9jbnQ7IGkrKykgewotCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcGFyYW1ldGVyKGZ0Y21kLT5mdF9wYXJtc1tpXSYweDBmKSwpOwotCQkJaWYgKGZ0Y21kLT5mdF9zdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKQotCQkJCWdvdG8gZnRtdGNtZF9lcnJvcjsKLQkJfQotCX0KLQlpZiAoZnRjbWQtPmZ0X3dhaXRfYWZ0ZXIgIT0gMCkgewotCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0Y21kLT5mdF93YWl0X2FmdGVyLAotCQkJCQkgICAgICZmdGNtZC0+ZnRfc3RhdHVzKSwpOwotCX0KLWZ0bXRjbWRfZXJyb3I6CSAgICAgICAKLQlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIHN0YXR1cyBzZXQiKTsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X2Vycm9yKCZmdGNtZC0+ZnRfZXJyb3IsCi0JCQkJCSAgICAgICAmZnRjbWQtPmZ0X2NtZCwgMSksKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOyAvKiB0aGlzIGlzIG5vdCBhbiBpL28gZXJyb3IgKi8KLX0KLSNlbmRpZgotCi0vKiAgSU9DVEwgcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCi0gKi8KLWludCBfemZ0X2lvY3RsKHVuc2lnbmVkIGludCBjb21tYW5kLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlpbnQgcmVzdWx0OwotCXVuaW9uIHsgc3RydWN0IG10b3AgICAgICAgbXRvcDsKLQkJc3RydWN0IG10Z2V0ICAgICAgbXRnZXQ7Ci0JCXN0cnVjdCBtdHBvcyAgICAgIG10cG9zOwotI2lmZGVmIE1USU9DUkRGVFNFRwotCQlzdHJ1Y3QgbXRmdHNlZyAgICBtdGZ0c2VnOwotI2VuZGlmCi0jaWZkZWYgTVRJT0NWT0xJTkZPCi0JCXN0cnVjdCBtdHZvbGluZm8gIG10dm9saW5mbzsKLSNlbmRpZgotI2lmZGVmIE1USU9DR0VUU0laRQotCQlzdHJ1Y3QgbXR0YXBlc2l6ZSBtdHRhcGVzaXplOwotI2VuZGlmCi0jaWZkZWYgTVRJT0NGVEZPUk1BVAotCQlzdHJ1Y3QgbXRmdGZvcm1hdCBtdGZ0Zm9ybWF0OwotI2VuZGlmCi0jaWZkZWYgWkZUX09CU09MRVRFCi0JCXN0cnVjdCBtdGJsa3N6IG10Ymxrc3o7Ci0jZW5kaWYKLSNpZmRlZiBNVElPQ0ZUQ01ECi0JCXN0cnVjdCBtdGZ0Y21kIG10ZnRjbWQ7Ci0jZW5kaWYKLQl9IGtybmxfYXJnOwotCWludCBhcmdfc2l6ZSA9IF9JT0NfU0laRShjb21tYW5kKTsKLQlpbnQgZGlyID0gX0lPQ19ESVIoY29tbWFuZCk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQkvKiBUaGlzIGNoZWNrIHdpbGwgb25seSBjYXRjaCBhcmd1bWVudHMgdGhhdCBhcmUgdG9vIGxhcmdlICEKLQkgKi8KLQlpZiAoZGlyICYgKF9JT0NfUkVBRCB8IF9JT0NfV1JJVEUpICYmIGFyZ19zaXplID4gc2l6ZW9mKGtybmxfYXJnKSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAotCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKLQl9Ci0JaWYgKGRpciAmIF9JT0NfV1JJVEUpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrcm5sX2FyZywgYXJnLCBhcmdfc2l6ZSkgIT0gMCkgewotCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOwotCQl9Ci0JfQotCVRSQUNFKGZ0X3RfZmxvdywgImNhbGxlZCB3aXRoIGlvY3RsIGNvbW1hbmQ6IDB4JTA4eCIsIGNvbW1hbmQpOwotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgTVRJT0NUT1A6Ci0JCXJlc3VsdCA9IG10aW9jdG9wKCZrcm5sX2FyZy5tdG9wLCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotCWNhc2UgTVRJT0NHRVQ6Ci0JCXJlc3VsdCA9IG10aW9jZ2V0KCZrcm5sX2FyZy5tdGdldCwgYXJnX3NpemUpOwotCQlicmVhazsKLQljYXNlIE1USU9DUE9TOgotCQlyZXN1bHQgPSBtdGlvY3Bvcygma3JubF9hcmcubXRwb3MsIGFyZ19zaXplKTsKLQkJYnJlYWs7Ci0jaWZkZWYgTVRJT0NWT0xJTkZPCi0JY2FzZSBNVElPQ1ZPTElORk86Ci0JCXJlc3VsdCA9IG10aW9jdm9saW5mbygma3JubF9hcmcubXR2b2xpbmZvLCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgWkZUX09CU09MRVRFCi0JY2FzZSBNVElPQ19aRlRBUEVfR0VUQkxLU1o6Ci0JCXJlc3VsdCA9IG10aW9jX3pmdGFwZV9nZXRibGtzeigma3JubF9hcmcubXRibGtzeiwgYXJnX3NpemUpOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIE1USU9DUkRGVFNFRwotCWNhc2UgTVRJT0NSREZUU0VHOiAvKiByZWFkIGEgc2VnbWVudCB2aWEgaW9jdGwgKi8KLQkJcmVzdWx0ID0gbXRpb2NyZGZ0c2VnKCZrcm5sX2FyZy5tdGZ0c2VnLCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTVRJT0NXUkZUU0VHCi0JY2FzZSBNVElPQ1dSRlRTRUc6IC8qIHdyaXRlIGEgc2VnbWVudCB2aWEgaW9jdGwgKi8KLQkJcmVzdWx0ID0gbXRpb2N3cmZ0c2VnKCZrcm5sX2FyZy5tdGZ0c2VnLCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTVRJT0NHRVRTSVpFCi0JY2FzZSBNVElPQ0dFVFNJWkU6Ci0JCXJlc3VsdCA9IG10aW9jZ2V0c2l6ZSgma3JubF9hcmcubXR0YXBlc2l6ZSwgYXJnX3NpemUpOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIE1USU9DRlRGT1JNQVQKLQljYXNlIE1USU9DRlRGT1JNQVQ6Ci0JCXJlc3VsdCA9IG10aW9jZnRmb3JtYXQoJmtybmxfYXJnLm10ZnRmb3JtYXQsIGFyZ19zaXplKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNVElPQ0ZUQ01ECi0JY2FzZSBNVElPQ0ZUQ01EOgotCQlyZXN1bHQgPSBtdGlvY2Z0Y21kKCZrcm5sX2FyZy5tdGZ0Y21kLCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCWlmICgocmVzdWx0ID49IDApICYmIChkaXIgJiBfSU9DX1JFQUQpKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAma3JubF9hcmcsIGFyZ19zaXplKSAhPSAwKSB7Ci0JCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTZmMmQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBfWkZUQVBFX0NUTF9ICi0jZGVmaW5lIF9aRlRBUEVfQ1RMX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLiAKLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDIgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBub24tc3RhbmRhcmQgSU9DVEwgcmVsYXRlZCBkZWZpbml0aW9ucwotICogICAgICBmb3IgdGhlIFFJQy00MC84MCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLQotI2lmZGVmIENPTkZJR19aRlRBUEVfTU9EVUxFCi0jZGVmaW5lIGZ0YXBlX3N0YXR1cyAoKnpmdF9zdGF0dXMpCi0jZW5kaWYKLQotZXh0ZXJuIGludCB6ZnRfb2ZmbGluZTsKLWV4dGVybiBpbnQgemZ0X210X2NvbXByZXNzaW9uOwotZXh0ZXJuIGludCB6ZnRfd3JpdGVfcHJvdGVjdGVkOwotZXh0ZXJuIGludCB6ZnRfaGVhZGVyX3JlYWQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IHpmdF91bml0OwotZXh0ZXJuIGludCB6ZnRfcmVzaWQ7Ci0KLWV4dGVybiB2b2lkIHpmdF9yZXNldF9wb3NpdGlvbih6ZnRfcG9zaXRpb24gKnBvcyk7Ci1leHRlcm4gaW50ICB6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKHpmdF9wb3NpdGlvbiAqcG9zKTsKLWV4dGVybiBpbnQgIHpmdF9kZWZfaWRsZV9zdGF0ZSh2b2lkKTsKLQotLyogIGhvb2tzIGZvciB0aGUgVkZTIGludGVyZmFjZSAKLSAqLwotZXh0ZXJuIGludCAgX3pmdF9vcGVuKHVuc2lnbmVkIGludCBkZXZfbWlub3IsIHVuc2lnbmVkIGludCBhY2Nlc3NfbW9kZSk7Ci1leHRlcm4gaW50ICBfemZ0X2Nsb3NlKHZvaWQpOwotZXh0ZXJuIGludCAgX3pmdF9pb2N0bCh1bnNpZ25lZCBpbnQgY29tbWFuZCwgdm9pZCBfX3VzZXIgKmFyZyk7Ci0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYWRjYWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqICAgSSB1c2UgdGhlc2Ugcm91dGluZXMganVzdCB0byBkZWNpZGUgd2hlbiBJIGhhdmUgdG8gZmFrZSBhIAotICogICB2b2x1bWUtdGFibGUgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSB0byBvcmlnaW5hbCBmdGFwZS4KLSAqLwotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUgQmFzIExhYXJob3Zlbi4KLSAqICAgICAgCi0gKiAgICAgIE1vZGlmaWVkIGZvciB6ZnRhcGUgMTk5NiwgMTk5NyBDbGF1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDIgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBlb2YgbWFyayBoYW5kbGluZyBjb2RlCi0gKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi0KLS8qIGEgY29weSBvZiB0aGUgZmFpbGVkIHNlY3RvciBsb2cgZnJvbSB0aGUgaGVhZGVyIHNlZ21lbnQuCi0gKi8KLWVvZl9tYXJrX3VuaW9uICp6ZnRfZW9mX21hcDsKLQotLyogbnVtYmVyIG9mIGVvZiBtYXJrcyAoZW50cmllcyBpbiBiYWQgc2VjdG9yIGxvZykgb24gdGFwZS4KLSAqLwotaW50IHpmdF9ucl9lb2ZfbWFya3MgPSAtMTsKLQotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLQotc3RhdGljIGNoYXIgbGludXhfdGFwZV9sYWJlbFtdID0gIkxpbnV4IHJhdyBmb3JtYXQgViI7Ci1lbnVtIHsgCi0JbWluX2ZtdF92ZXJzaW9uID0gMSwgbWF4X2ZtdF92ZXJzaW9uID0gMiAKLX07Ci1zdGF0aWMgdW5zaWduZWQgZnRhcGVfZm10X3ZlcnNpb24gPSAwOwotCi0KLS8qIEZ0YXBlIChtaXMpdXNlcyB0aGUgYmFkIHNlY3RvciBsb2cgdG8gcmVjb3JkIGVuZC1vZi1maWxlIG1hcmtzLgotICogSW5pdGlhbGx5ICh3aGVuIHRoZSB0YXBlIGlzIGVyYXNlZCkgYWxsIGVudHJpZXMgaW4gdGhlIGJhZCBzZWN0b3IKLSAqIGxvZyBhcmUgYWRkZWQgdG8gdGhlIHRhcGUncyBiYWQgc2VjdG9yIG1hcC4gVGhlIGJhZCBzZWN0b3IgbG9nIHRoZW4KLSAqIGlzIGNsZWFyZWQuCi0gKgotICogVGhlIGJhZCBzZWN0b3IgbG9nIG5vcm1hbGx5IGNvbnRhaW5zIGVudHJpZXMgb2YgdGhlIGZvcm06IAotICogZXZlbiAxNi1iaXQgd29yZDogc2VnbWVudCBudW1iZXIgb2YgYmFkIHNlY3RvciAKLSAqIG9kZCAxNi1iaXQgd29yZDogZW5jb2RlZCBkYXRlCi0gKiBUaGVyZSBjYW4gYmUgYSB0b3RhbCBvZiA0NDggZW50cmllcyAoMTc5MiBieXRlcykuCi0gKgotICogTXkgZ3Vlc3MgaXMgdGhhdCBubyBwcm9ncmFtIGlzIHVzaW5nIHRoaXMgYmFkIHNlY3RvciBsb2cgKHRoZSAqCi0gKiBmb3JtYXQgc2VlbXMgdXNlbGVzcyBhcyB0aGVyZSBpcyBubyBpbmRpY2F0aW9uIG9mIHRoZSBiYWQgc2VjdG9yCi0gKiBpdHNlbGYsIG9ubHkgdGhlIHNlZ21lbnQpIEhvd2V2ZXIsIGlmIGFueSBwcm9ncmFtIGRvZXMgdXNlIHRoZSBiYWQKLSAqIHNlY3RvciBsb2csIHRoZSBmb3JtYXQgdXNlZCBieSBmdGFwZSB3aWxsIGxldCB0aGUgcHJvZ3JhbSB0aGluawotICogdGhlcmUgYXJlIHNvbWUgYmFkIHNlY3RvcnMgYW5kIG5vIGhhcm0gaXMgZG9uZS4KLSAqICAKLSAqIFRoZSBlb2YgbWFyayBlbnRyaWVzIHRoYXQgZnRhcGUgc3RvcmVzIGluIHRoZSBiYWQgc2VjdG9yIGxvZzogZXZlbgotICogMTYtYml0IHdvcmQ6IHNlZ21lbnQgbnVtYmVyIG9mIGVvZiBtYXJrIG9kZCAxNi1iaXQgd29yZDogc2VjdG9yCi0gKiBudW1iZXIgb2YgZW9mIG1hcmsgWzEuLjMyXQotICogIAotICogVGhlIHpmdF9lb2ZfbWFwIGFzIG1haW50YWluZWQgaXMgYSBzb3J0ZWQgbGlzdCBvZiBlb2YgbWFyayBlbnRyaWVzLgotICoKLSAqCi0gKiBUaGUgdGFwZSBuYW1lIGZpZWxkIGluIHRoZSBoZWFkZXIgc2VnbWVudHMgaXMgdXNlZCB0byBzdG9yZSBhIGxpbnV4Ci0gKiB0YXBlIGlkZW50aWZpY2F0aW9uIHN0cmluZyBhbmQgYSB2ZXJzaW9uIG51bWJlci4gIFRoaXMgd2F5IHRoZSB0YXBlCi0gKiBjYW4gYmUgcmVjb2duaXplZCBhcyBhIExpbnV4IHJhdyBmb3JtYXQgdGFwZSB3aGVuIHVzaW5nIHRvb2xzIHVuZGVyCi0gKiBvdGhlciBPUydzLgotICoKLSAqICdXaWRlJyBRSUMgdGFwZXMgKGZvcm1hdCBjb2RlIDQpIGRvbid0IGhhdmUgYSBmYWlsZWQgc2VjdG9yIGxpc3QKLSAqIGFueW1vcmUuIFRoYXQgc3BhY2UgaXMgdXNlZCBmb3IgdGhlIChsb25nZXIpIGJhZCBzZWN0b3IgbWFwIHRoYXQKLSAqIG5vdyBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IHRvby4gIFdlIG5vdyBzdG9yZSBvdXIgZW5kLW9mLWZpbGUKLSAqIG1hcmtlciBsaXN0IGFmdGVyIHRoZSBiYWQtc2VjdG9yLW1hcCBvbiB0YXBlLiBUaGUgbGlzdCBpcyBkZWxpbWl0ZWQKLSAqIGJ5IGEgKF9fdTMyKSAwIGVudHJ5LgotICovCi0KLWludCB6ZnRfZnRhcGVfdmFsaWRhdGVfbGFiZWwoY2hhciAqbGFiZWwpCi17Ci0Jc3RhdGljIGNoYXIgdG1wX2xhYmVsWzQ1XTsKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCQotCW1lbWNweSh0bXBfbGFiZWwsIGxhYmVsLCBGVF9MQUJFTF9TWik7Ci0JdG1wX2xhYmVsW0ZUX0xBQkVMX1NaXSA9ICdcMCc7Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgInRhcGUgIGxhYmVsID0gYCVzJyIsIHRtcF9sYWJlbCk7Ci0JZnRhcGVfZm10X3ZlcnNpb24gPSAwOwotCWlmIChtZW1jbXAobGFiZWwsIGxpbnV4X3RhcGVfbGFiZWwsIHN0cmxlbihsaW51eF90YXBlX2xhYmVsKSkgPT0gMCkgewotCQlpbnQgcG9zID0gc3RybGVuKGxpbnV4X3RhcGVfbGFiZWwpOwotCQl3aGlsZSAobGFiZWxbcG9zXSA+PSAnMCcgJiYgbGFiZWxbcG9zXSA8PSAnOScpIHsKLQkJCWZ0YXBlX2ZtdF92ZXJzaW9uICo9IDEwOwotCQkJZnRhcGVfZm10X3ZlcnNpb24gPSBsYWJlbFsgcG9zKytdIC0gJzAnOwotCQl9Ci0JCXJlc3VsdCA9IChmdGFwZV9mbXRfdmVyc2lvbiA+PSBtaW5fZm10X3ZlcnNpb24gJiYKLQkJCSAgZnRhcGVfZm10X3ZlcnNpb24gPD0gbWF4X2ZtdF92ZXJzaW9uKTsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgImZvcm1hdCB2ZXJzaW9uID0gJWQiLCBmdGFwZV9mbXRfdmVyc2lvbik7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBfX3U4ICogZmluZF9lbmRfb2ZfZW9mX2xpc3QoX191OCAqIHB0ciwgX191OCAqIGxpbWl0KQotewotCXdoaWxlIChwdHIgKyAzIDwgbGltaXQpIHsKLQotCQlpZiAoZ2V0X3VuYWxpZ25lZCgoX191MzIqKXB0cikpIHsKLQkJCXB0ciArPSBzaXplb2YoX191MzIpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHB0cjsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCB6ZnRfZnRhcGVfZXh0cmFjdF9maWxlX21hcmtzKF9fdTgqIGFkZHJlc3MpCi17Ci0JaW50IGk7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQl6ZnRfZW9mX21hcCA9IE5VTEw7Ci0JaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgewotCQlfX3U4KiBlbmQ7Ci0JCV9fdTgqIHN0YXJ0ID0gZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QoYWRkcmVzcyk7Ci0KLQkJemZ0X25yX2VvZl9tYXJrcyA9IDA7Ci0JCWlmIChzdGFydCkgewotCQkJc3RhcnQgKz0gMzsgLyogc2tpcCBlbmQgb2YgbGlzdCBtYXJrICovCi0JCQllbmQgPSBmaW5kX2VuZF9vZl9lb2ZfbGlzdChzdGFydCwgCi0JCQkJCQkgICBhZGRyZXNzICsgRlRfU0VHTUVOVF9TSVpFKTsKLQkJCWlmIChlbmQgJiYgZW5kIC0gc3RhcnQgPD0gRlRfRlNMX1NJWkUpIHsKLQkJCQl6ZnRfbnJfZW9mX21hcmtzID0gKChlbmQgLSBzdGFydCkgLyAKLQkJCQkJCSAgICBzaXplb2YoZW9mX21hcmtfdW5pb24pKTsKLQkJCQl6ZnRfZW9mX21hcCA9IChlb2ZfbWFya191bmlvbiAqKXN0YXJ0OwotCQkJfSBlbHNlIHsKLQkJCQlUUkFDRShmdF90X2VyciwKLQkJCQkgICAgICAiRU9GIE1hcmsgTGlzdCBpcyB0b28gbG9uZyBvciBkYW1hZ2VkISIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJVFJBQ0UoZnRfdF9lcnIsIAotCQkJICAgICAgIkJhZCBTZWN0b3IgTGlzdCBpcyB0b28gbG9uZyBvciBkYW1hZ2VkICEiKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXpmdF9lb2ZfbWFwID0gKGVvZl9tYXJrX3VuaW9uICopJmFkZHJlc3NbRlRfRlNMXTsKLQkJemZ0X25yX2VvZl9tYXJrcyA9IEdFVDIoYWRkcmVzcywgRlRfRlNMX0NOVCk7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJudW1iZXIgb2YgZmlsZSBtYXJrczogJWQiLCB6ZnRfbnJfZW9mX21hcmtzKTsKLQlpZiAoZnRhcGVfZm10X3ZlcnNpb24gPT0gMSkgewotCQlUUkFDRShmdF90X2luZm8sICJzd2FwcGluZyB2ZXJzaW9uIDEgZmllbGRzIik7Ci0JCS8qIHZlcnNpb24gMSBmb3JtYXQgdXNlcyBzd2FwcGVkIHNlY3RvciBhbmQgc2VnbWVudAotCQkgKiBmaWVsZHMsIGNvcnJlY3QgdGhhdCAhICAKLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCB6ZnRfbnJfZW9mX21hcmtzOyArK2kpIHsKLQkJCV9fdTE2IHRtcCA9IEdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwwKTsKLQkJCVBVVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwgMCwgCi0JCQkgICAgIEdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuZGF0ZSwwKSk7Ci0JCQlQVVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsIDAsIHRtcCk7Ci0JCX0KLQl9Ci0JZm9yIChpID0gMDsgaSA8IHpmdF9ucl9lb2ZfbWFya3M7ICsraSkgewotCQlUUkFDRShmdF90X25vaXNlLCAiZW9mIG1hcms6ICU1ZC8lMmQiLAotCQkJR0VUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5zZWdtZW50LCAwKSwgCi0JCQlHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsMCkpOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi12b2lkIHpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JLyogIENsZWFyIGZhaWxlZCBzZWN0b3IgbG9nOiByZW1vdmUgYWxsIHRhcGUgbWFya3MuIFdlCi0JICogIGRvbid0IHVzZSBvbGQgZnRhcGUtc3R5bGUgRU9GLW1hcmtzLgotCSAqLwotCVRSQUNFKGZ0X3RfaW5mbywgIkNsZWFyaW5nIG9sZCBmdGFwZSdzIGVvZiBtYXAiKTsKLQltZW1zZXQoemZ0X2VvZl9tYXAsIDAsIHpmdF9ucl9lb2ZfbWFya3MgKiBzaXplb2YoX191MzIpKTsKLQl6ZnRfbnJfZW9mX21hcmtzID0gMDsKLQlQVVQyKHpmdF9oc2VnX2J1ZiwgRlRfRlNMX0NOVCwgMCk7IC8qIG5yIG9mIGVvZi1tYXJrcyAqLwotCXpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7Ci0JemZ0X3VwZGF0ZV9sYWJlbCh6ZnRfaHNlZ19idWYpOwotCVRSQUNFX0VYSVQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjU2OGMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotI2lmbmRlZiBfWkZUQVBFX0VPRl9ICi0jZGVmaW5lIF9aRlRBUEVfRU9GX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk1IEJhcyBMYWFyaG92ZW4uCi0gKiBhZGFwdGFlZCBmb3IgemZ0YXBlIDE5OTYsIDE5OTcgYnkgQ2xhdXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAzICQKLSAqCi0gKiAgICAgIERlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBlbmQgb2YgZmlsZSBtYXJrZXJzCi0gKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50Lmg+Ci0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgiCi0vKiAgZmFpbGVkIHNlY3RvciBsb2cgc2l6ZSAob25seSB1c2VkIGlmIGZvcm1hdCBjb2RlICE9IDQpLgotICovCi0KLXR5cGVkZWYgdW5pb24gewotCWZ0X2ZzbF9lbnRyeSBtYXJrOwotCV9fdTMyIGVudHJ5OwotfSBlb2ZfbWFya191bmlvbjsKLSAKLS8qICAgICAgZnRhcGUtZW9mLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KLSAqLwotZXh0ZXJuIGludCB6ZnRfbnJfZW9mX21hcmtzOwotZXh0ZXJuIGVvZl9tYXJrX3VuaW9uICp6ZnRfZW9mX21hcDsKLQotLyogICAgICBmdGFwZS1lb2YuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiB2b2lkIHpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoX191OCogYWRkcmVzcyk7Ci1leHRlcm4gaW50ICB6ZnRfZnRhcGVfdmFsaWRhdGVfbGFiZWwoY2hhciogbGFiZWwpOwotZXh0ZXJuIHZvaWQgemZ0X2NsZWFyX2Z0YXBlX2ZpbGVfbWFya3Modm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjRhMWFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgcmVnaXN0ZXJzIHRoZSB6ZnRhcGUgZnJvbnRlbmQgCi0gKiAgICAgIHRvIHRoZSBmdGFwZSBmbG9wcHkgdGFwZSBkcml2ZXIgZm9yIExpbnV4Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpZmRlZiBDT05GSUdfS01PRAotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgotCi1NT0RVTEVfQVVUSE9SKCIoYykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgIgotCSAgICAgICIoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKFpGVEFQRV9WRVJTSU9OICIgLSAiCi0JCSAgICJWRlMgaW50ZXJmYWNlIGZvciB0aGUgTGludXggZmxvcHB5IHRhcGUgZHJpdmVyLiAiCi0JCSAgICJTdXBwb3J0IGZvciBRSUMtMTEzIGNvbXBhdGlibGUgdm9sdW1lIHRhYmxlICIKLQkJICAgImFuZCBidWlsdGluIGNvbXByZXNzaW9uIChsenJ3MyBhbGdvcml0aG0pIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiY2hhci1tYWpvci0yNyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi1zdHJ1Y3QgemZ0X2NtcHJfb3BzICp6ZnRfY21wcl9vcHMgPSBOVUxMOwotY29uc3QgZnRhcGVfaW5mbyAqemZ0X3N0YXR1czsKLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBidXN5X2ZsYWc7Ci0KLXN0YXRpYyBzaWdzZXRfdCBvcmlnX3NpZ21hc2s7Ci0KLS8qICB0aGUgaW50ZXJmYWNlIHRvIHRoZSBrZXJuZWwgdmZzIGxheWVyCi0gKi8KLQotLyogTm90ZSBhYm91dCBsbHNlZWsoKToKLSAqCi0gKiBzdC5jIGFuZCB0cHFpYy5jIHVwZGF0ZSBmcC0+Zl9wb3MgYnV0IGRvbid0IGltcGxtZW50IGxsc2VlaygpIGFuZAotICogaW5pdGlhbGl6ZSB0aGUgbGxzZWVrIGNvbXBvbmVudCBvZiB0aGUgZmlsZV9vcHMgc3RydWN0IHdpdGggTlVMTC4KLSAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciB3aWxsIGdldCB0aGUgZGVmYXVsdCBzZWVrLCBidXQgdGhlIHRhcGUKLSAqIGRldmljZSB3aWxsIG5vdCByZXNwZWN0IHRoZSBuZXcgcG9zaXRpb24sIGJ1dCBoYXBwaWx5IHJlYWQgZnJvbSB0aGUKLSAqIG9sZCBwb3NpdGlvbi4gVGhpbmsgYSB6ZnRhcGUgc3BlY2lmaWMgbGxzZWVrKCkgZnVuY3Rpb24gd291bGQgYmUKLSAqIGJldHRlciwgcmV0dXJuaW5nIC1FU1BJUEUuIFRPRE8uCi0gKi8KLQotc3RhdGljIGludCAgemZ0X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwotc3RhdGljIGludCB6ZnRfY2xvc2Uoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCk7Ci1zdGF0aWMgaW50ICB6ZnRfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCwKLQkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQgIHpmdF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotc3RhdGljIHNzaXplX3QgemZ0X3JlYWQgKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1ZmYsCi0JCQkgc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcyk7Ci1zdGF0aWMgc3NpemVfdCB6ZnRfd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKLQkJCSBzaXplX3QgcmVxX2xlbiwgbG9mZl90ICpwcG9zKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgemZ0X2NkZXYgPQotewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkucmVhZAkJPSB6ZnRfcmVhZCwKLQkud3JpdGUJCT0gemZ0X3dyaXRlLAotCS5pb2N0bAkJPSB6ZnRfaW9jdGwsCi0JLm1tYXAJCT0gemZ0X21tYXAsCi0JLm9wZW4JCT0gemZ0X29wZW4sCi0JLnJlbGVhc2UJPSB6ZnRfY2xvc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsYXNzICp6ZnRfY2xhc3M7Ci0KLS8qICAgICAgT3BlbiBmbG9wcHkgdGFwZSBkZXZpY2UKLSAqLwotc3RhdGljIGludCB6ZnRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQotewotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOwotCVRSQUNFKGZ0X3RfZmxvdywgImNhbGxlZCBmb3IgbWlub3IgJWQiLCBpbWlub3IoaW5vKSk7Ci0JaWYgKCB0ZXN0X2FuZF9zZXRfYml0KDAsJmJ1c3lfZmxhZykgKSB7Ci0JCVRSQUNFX0FCT1JUKC1FQlVTWSwgZnRfdF93YXJuLCAiZmFpbGVkOiBhbHJlYWR5IGJ1c3kiKTsKLQl9Ci0JaWYgKChpbWlub3IoaW5vKSAmIH4oWkZUX01JTk9SX09QX01BU0sgfCBGVEFQRV9OT19SRVdJTkQpKQotCSAgICAgPiAKLQkgICAgRlRBUEVfU0VMX0QpIHsKLQkJY2xlYXJfYml0KDAsJmJ1c3lfZmxhZyk7Ci0JCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9lcnIsICJmYWlsZWQ6IGludmFsaWQgdW5pdCBuciIpOwotCX0KLQlvcmlnX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXJlc3VsdCA9IF96ZnRfb3BlbihpbWlub3IoaW5vKSwgZmlsZXAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCWN1cnJlbnQtPmJsb2NrZWQgPSBvcmlnX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLwotCQljbGVhcl9iaXQoMCwmYnVzeV9mbGFnKTsKLQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X2VyciwgIl9mdGFwZV9vcGVuIGZhaWxlZCIpOwotCX0gZWxzZSB7Ci0JCS8qIE1hc2sgc2lnbmFscyB0aGF0IHdpbGwgZGlzdHVyYiBwcm9wZXIgb3BlcmF0aW9uIG9mIHRoZQotCQkgKiBwcm9ncmFtIHRoYXQgaXMgY2FsbGluZy4KLQkJICovCi0JCWN1cnJlbnQtPmJsb2NrZWQgPSBvcmlnX3NpZ21hc2s7Ci0JCXNpZ2FkZHNldG1hc2sgKCZjdXJyZW50LT5ibG9ja2VkLCBfRE9fQkxPQ0spOwotCQlUUkFDRV9FWElUIDA7Ci0JfQotfQotCi0vKiAgICAgIENsb3NlIGZsb3BweSB0YXBlIGRldmljZQotICovCi1zdGF0aWMgaW50IHpmdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQotewotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoICF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0KSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAiZmFpbGVkOiBub3QgYnVzeSBvciB3cm9uZyB1bml0Iik7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0Jc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7Ci0JcmVzdWx0ID0gX3pmdF9jbG9zZSgpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCVRSQUNFKGZ0X3RfZXJyLCAiX3pmdF9jbG9zZSBmYWlsZWQiKTsKLQl9Ci0JY3VycmVudC0+YmxvY2tlZCA9IG9yaWdfc2lnbWFzazsgLyogcmVzdG9yZSBiZWZvcmUgb3BlbiBzdGF0ZSAqLwotCWNsZWFyX2JpdCgwLCZidXN5X2ZsYWcpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogICAgICBJb2N0bCBmb3IgZmxvcHB5IHRhcGUgZGV2aWNlCi0gKi8KLXN0YXRpYyBpbnQgemZ0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCi0JCSAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXN1bHQgPSAtRUlPOwotCXNpZ3NldF90IG9sZF9zaWdtYXNrOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKCAhdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSB8fCBpbWlub3IoaW5vKSAhPSB6ZnRfdW5pdCB8fCBmdF9mYWlsdXJlKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKLQl9Ci0Jb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KLQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKLQkvKiBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIHNpemVvZih2b2lkICopID09IHNpemVvZihsb25nKSAqLwotCXJlc3VsdCA9IF96ZnRfaW9jdGwoY29tbWFuZCwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyogICAgICBJb2N0bCBmb3IgZmxvcHB5IHRhcGUgZGV2aWNlCi0gKi8KLXN0YXRpYyBpbnQgIHpmdF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IHJlc3VsdCA9IC1FSU87Ci0Jc2lnc2V0X3Qgb2xkX3NpZ21hc2s7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoICF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IAotCSAgICBpbWlub3IoZmlsZXAtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSB6ZnRfdW5pdCB8fCAKLQkgICAgZnRfZmFpbHVyZSkKLQl7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKLQl9Ci0Jb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KLQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKLQlpZiAoKHJlc3VsdCA9IGZ0YXBlX21tYXAodm1hKSkgPj0gMCkgewotI2lmbmRlZiBNU1lOQ19CVUdfV0FTX0ZJWEVECi0JCXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHVtbXkgPSB7IE5VTEwsIH07Ci0JCXZtYS0+dm1fb3BzID0gJmR1bW15OwotI2VuZGlmCi0JfQotCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCi0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qICAgICAgUmVhZCBmcm9tIGZsb3BweSB0YXBlIGRldmljZQotICovCi1zdGF0aWMgc3NpemVfdCB6ZnRfcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWZmLAotCQkJc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmVzdWx0ID0gLUVJTzsKLQlzaWdzZXRfdCBvbGRfc2lnbWFzazsKLQlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiY2FsbGVkIHdpdGggY291bnQ6ICVsZCIsICh1bnNpZ25lZCBsb25nKXJlcV9sZW4pOwotCWlmICghdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSAgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQgfHwgZnRfZmFpbHVyZSkgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAiZmFpbGVkOiBub3QgYnVzeSwgZmFpbHVyZSBvciB3cm9uZyB1bml0Iik7Ci0JfQotCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsgLyogc2F2ZSBtYXNrICovCi0Jc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7Ci0JcmVzdWx0ID0gX3pmdF9yZWFkKGJ1ZmYsIHJlcV9sZW4pOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCi0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZXR1cm4gd2l0aCBjb3VudDogJWQiLCByZXN1bHQpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiAgICAgIFdyaXRlIHRvIHRhcGUgZGV2aWNlCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHpmdF93cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAotCQkJIHNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IHJlc3VsdCA9IC1FSU87Ci0Jc2lnc2V0X3Qgb2xkX3NpZ21hc2s7Ci0Jc3RydWN0IGlub2RlICppbm8gPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X2Zsb3csICJjYWxsZWQgd2l0aCBjb3VudDogJWxkIiwgKHVuc2lnbmVkIGxvbmcpcmVxX2xlbik7Ci0JaWYgKCF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0IHx8IGZ0X2ZhaWx1cmUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOwotCX0KLQlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLwotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXJlc3VsdCA9IF96ZnRfd3JpdGUoYnVmZiwgcmVxX2xlbik7Ci0JY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KLQlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybiB3aXRoIGNvdW50OiAlZCIsIHJlc3VsdCk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVkZTIElOVEVSRkFDRSAKLSAqICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgZHJpdmVyL21vZHVsZSBpbml0aWFsaXphdGlvbgotICovCi0KLS8qICB0aGUgY29tcHJlc3Npb24gbW9kdWxlIGhhcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gaG9vayBpbnRvIHRoZSB6ZnRhcGUgCi0gKiAgY29kZQotICovCi1pbnQgemZ0X2NtcHJfcmVnaXN0ZXIoc3RydWN0IHpmdF9jbXByX29wcyAqbmV3X29wcykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoemZ0X2NtcHJfb3BzICE9IE5VTEwpIHsKLQkJVFJBQ0VfRVhJVCAtRUJVU1k7Ci0JfSBlbHNlIHsKLQkJemZ0X2NtcHJfb3BzID0gbmV3X29wczsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLX0KLQotLyogIGxvY2sgdGhlIHpmdC1jb21wcmVzc29yKCkgbW9kdWxlLgotICovCi1pbnQgemZ0X2NtcHJfbG9jayhpbnQgdHJ5X3RvX2xvYWQpCi17Ci0JaWYgKHpmdF9jbXByX29wcyA9PSBOVUxMKSB7Ci0jaWZkZWYgQ09ORklHX0tNT0QKLQkJaWYgKHRyeV90b19sb2FkKSB7Ci0JCQlyZXF1ZXN0X21vZHVsZSgiemZ0LWNvbXByZXNzb3IiKTsKLQkJCWlmICh6ZnRfY21wcl9vcHMgPT0gTlVMTCkgewotCQkJCXJldHVybiAtRU5PU1lTOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIC1FTk9TWVM7Ci0JCX0KLSNlbHNlCi0JCXJldHVybiAtRU5PU1lTOwotI2VuZGlmCi0JfQotCSgqemZ0X2NtcHJfb3BzLT5sb2NrKSgpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1pGVF9DT01QUkVTU09SCi1leHRlcm4gaW50IHpmdF9jb21wcmVzc29yX2luaXQodm9pZCk7Ci0jZW5kaWYKLQotLyogIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIgb3IgYnkga2VybmVsCi0gKiAgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZQotICovCi1pbnQgX19pbml0IHpmdF9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLSNpZmRlZiBNT0RVTEUKLQlwcmludGsoS0VSTl9JTkZPIFpGVEFQRV9WRVJTSU9OICJcbiIpOwotICAgICAgICBpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7Ci0JCXByaW50aygKLUtFUk5fSU5GTwotIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKVxuIgotS0VSTl9JTkZPCi0idmZzIGludGVyZmFjZSBmb3IgZnRhcGUgZmxvcHB5IHRhcGUgZHJpdmVyLlxuIgotS0VSTl9JTkZPCi0iU3VwcG9ydCBmb3IgUUlDLTExMyBjb21wYXRpYmxlIHZvbHVtZSB0YWJsZSwgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvblxuIgotS0VSTl9JTkZPCi0iYW5kIGJ1aWx0aW4gY29tcHJlc3Npb24gKGx6cnczIGFsZ29yaXRobSkuXG4iKTsKLSAgICAgICAgfQotI2Vsc2UgLyogIU1PRFVMRSAqLwotCS8qIHByaW50IGEgc2hvcnQgbm8tbm9uc2Vuc2UgYm9vdCBtZXNzYWdlICovCi0JcHJpbnRrKEtFUk5fSU5GTyBaRlRBUEVfVkVSU0lPTiAiXG4iKTsKLSNlbmRpZiAvKiBNT0RVTEUgKi8KLQlUUkFDRShmdF90X2luZm8sICJ6ZnRfaW5pdCBAIDB4JXAiLCB6ZnRfaW5pdCk7Ci0JVFJBQ0UoZnRfdF9pbmZvLAotCSAgICAgICJpbnN0YWxsaW5nIHpmdGFwZSBWRlMgaW50ZXJmYWNlIGZvciBmdGFwZSBkcml2ZXIgLi4uIik7Ci0JVFJBQ0VfQ0FUQ0gocmVnaXN0ZXJfY2hyZGV2KFFJQzExN19UQVBFX01BSk9SLCAiemZ0IiwgJnpmdF9jZGV2KSwpOwotCi0JemZ0X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiemZ0Iik7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQljbGFzc19kZXZpY2VfY3JlYXRlKHpmdF9jbGFzcywgTlVMTCwgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkpLCBOVUxMLCAicWZ0JWkiLCBpKTsKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZSh6ZnRfY2xhc3MsIE5VTEwsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgNCksIE5VTEwsICJucWZ0JWkiLCBpKTsKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZSh6ZnRfY2xhc3MsIE5VTEwsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpLCBOVUxMLCAienFmdCVpIiwgaSk7Ci0JCWNsYXNzX2RldmljZV9jcmVhdGUoemZ0X2NsYXNzLCBOVUxMLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSwgTlVMTCwgIm56cWZ0JWkiLCBpKTsKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZSh6ZnRfY2xhc3MsIE5VTEwsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzIpLCBOVUxMLCAicmF3cWZ0JWkiLCBpKTsKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZSh6ZnRfY2xhc3MsIE5VTEwsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpLCBOVUxMLCAibnJhd3Jhd3FmdCVpIiwgaSk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1pGVF9DT01QUkVTU09SCi0JKHZvaWQpemZ0X2NvbXByZXNzb3JfaW5pdCgpOwotI2VuZGlmCi0JemZ0X3N0YXR1cyA9IGZ0YXBlX2dldF9zdGF0dXMoKTsgLyogIGZldGNoIGdsb2JhbCBkYXRhIG9mIGZ0YXBlIAotCQkJCQkgICogIGhhcmR3YXJlIGRyaXZlciAKLQkJCQkJICAqLwotCVRSQUNFX0VYSVQgMDsKLX0KLQotCi0vKiBDYWxsZWQgYnkgbW9kdWxlcyBwYWNrYWdlIHdoZW4gcmVtb3ZpbmcgdGhlIGRyaXZlciAKLSAqLwotc3RhdGljIHZvaWQgemZ0X2V4aXQodm9pZCkKLXsKLQlpbnQgaTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICh1bnJlZ2lzdGVyX2NocmRldihRSUMxMTdfVEFQRV9NQUpPUiwgInpmdCIpICE9IDApIHsKLQkJVFJBQ0UoZnRfdF93YXJuLCAiZmFpbGVkIik7Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9pbmZvLCAic3VjY2Vzc2Z1bCIpOwotCX0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQljbGFzc19kZXZpY2VfZGVzdHJveSh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpKSk7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyA0KSk7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAxNikpOwotCQljbGFzc19kZXZpY2VfZGVzdHJveSh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMjApKTsKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDMyKSk7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzNikpOwotCX0KLQljbGFzc19kZXN0cm95KHpmdF9jbGFzcyk7Ci0JemZ0X3VuaW5pdF9tZW0oKTsgLyogcmVsZWFzZSByZW1haW5pbmcgbWVtb3J5LCBpZiBhbnkgKi8KLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiemZ0YXBlIHN1Y2Nlc3NmdWxseSB1bmxvYWRlZC5cbiIpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLW1vZHVsZV9pbml0KHpmdF9pbml0KTsKLW1vZHVsZV9leGl0KHpmdF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3ZTVkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jaWZuZGVmIF9aRlRBUEVfSU5JVF9ICi0jZGVmaW5lIF9aRlRBUEVfSU5JVF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDUgJAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBhbmQgbWFjcm8gZm9yIHRoZSB2ZnMgCi0gKiBpbnRlcmZhY2UgZGVmaW5lZCBieSB6ZnRhcGUKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50Lmg+Ci0KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1idWZmZXIuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCIKLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLQotI2lmZGVmIE1PRFVMRQotI2RlZmluZSBmdGFwZV9zdGF0dXMgKCp6ZnRfc3RhdHVzKQotI2VuZGlmCi0KLWV4dGVybiBjb25zdCAgZnRhcGVfaW5mbyAqemZ0X3N0YXR1czsgLyogbmVlZGVkIGZvciB6ZnRhcGUtdnRibC5oICovCi0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLQotc3RydWN0IHpmdF9jbXByX29wcyB7Ci0JaW50ICgqd3JpdGUpKGludCAqd3JpdGVfY250LAotCQkgICAgIF9fdTggKmRzdF9idWYsIGNvbnN0IGludCBzZWdfc3osCi0JCSAgICAgY29uc3QgX191OCBfX3VzZXIgKnNyY19idWYsIGNvbnN0IGludCByZXFfbGVuLCAKLQkJICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7Ci0JaW50ICgqcmVhZCkoaW50ICpyZWFkX2NudCwKLQkJICAgIF9fdTggX191c2VyICpkc3RfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKLQkJICAgIGNvbnN0IF9fdTggKnNyY19idWYsIGNvbnN0IGludCBzZWdfc3osCi0JCSAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7Ci0JaW50ICgqc2VlaykodW5zaWduZWQgaW50IG5ld19ibG9ja19wb3MsCi0JCSAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKLQkJICAgIF9fdTggKmJ1ZmZlcik7Ci0Jdm9pZCAoKmxvY2spICAgKHZvaWQpOwotCXZvaWQgKCpyZXNldCkgICh2b2lkKTsKLQl2b2lkICgqY2xlYW51cCkodm9pZCk7Ci19OwotCi1leHRlcm4gc3RydWN0IHpmdF9jbXByX29wcyAqemZ0X2NtcHJfb3BzOwotLyogemZ0YXBlLWluaXQuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgICB6ZnRfY21wcl9yZWdpc3RlcihzdHJ1Y3QgemZ0X2NtcHJfb3BzICpuZXdfb3BzKTsKLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgICB6ZnRfY21wcl9sb2NrKGludCB0cnlfdG9fbG9hZCk7Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0YmYwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA2ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGlnaCBsZXZlbCByZWFkaW5nIGNvZGUKLSAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi1pbnQgemZ0X2p1c3RfYmVmb3JlX2VvZjsKLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi1zdGF0aWMgaW50IGJ1Zl9sZW5fcmQ7Ci0KLXZvaWQgemZ0X3phcF9yZWFkX2J1ZmZlcnModm9pZCkKLXsKLQlidWZfbGVuX3JkID0gMDsKLX0KLQotaW50IHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cyh2b2lkKSAgICAgIAotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JemZ0X2hlYWRlcl9yZWFkID0gMDsKLQlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCZ6ZnRfaHNlZ19idWYsIEZUX1NFR01FTlRfU0laRSksKTsKLQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KHpmdF9oc2VnX2J1ZiksKTsKLQlUUkFDRShmdF90X2luZm8sICJTZWdtZW50cyB3cml0dGVuIHNpbmNlIGZpcnN0IGZvcm1hdDogJWQiLAotCSAgICAgIChpbnQpR0VUNCh6ZnRfaHNlZ19idWYsIEZUX1NFR19DTlQpKTsKLQl6ZnRfcWljMTEzID0gKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9ub3JtYWwgJiYKLQkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzExMDBmdCAmJgotCQkgICAgICBmdF9mb3JtYXRfY29kZSAhPSBmbXRfNDI1ZnQpOwotCVRSQUNFKGZ0X3RfaW5mbywgImZ0X2ZpcnN0X2RhdGFfc2VnbWVudDogJWQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50OiAlZCIsIAotCSAgICAgIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOwotCXpmdF9jYXBhY2l0eSA9IHpmdF9nZXRfY2FwYWNpdHkoKTsKLQl6ZnRfb2xkX2Z0YXBlID0gemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKCZ6ZnRfaHNlZ19idWZbRlRfTEFCRUxdKTsKLQlpZiAoemZ0X29sZF9mdGFwZSkgewotCQlUUkFDRShmdF90X2luZm8sIAotIkZvdW5kIG9sZCBmdGFwZWQgdGFwZSwgZW11bGF0aW5nIGVvZiBtYXJrcywgZW50ZXJpbmcgcmVhZC1vbmx5IG1vZGUiKTsKLQkJemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyh6ZnRfaHNlZ19idWYpOwotCQlUUkFDRV9DQVRDSCh6ZnRfZmFrZV92b2x1bWVfaGVhZGVycyh6ZnRfZW9mX21hcCwgCi0JCQkJCQkgICAgemZ0X25yX2VvZl9tYXJrcyksKTsKLQl9IGVsc2UgewotCQkvKiB0aGUgc3BlY3Mgc2F5IHRoYXQgdGhlIHZvbHVtZSB0YWJsZSBtdXN0IGJlCi0JCSAqIGluaXRpYWxpemVkIHdpdGggemVyb2VzIGR1cmluZyBmb3JtYXR0aW5nLCBzbyBpdAotCQkgKiBNVVNUIGJlIHJlYWRhYmxlLCBpLmUuIGNvbnRhaW4gdmFpZCBFQ0MKLQkJICogaW5mb3JtYXRpb24uICAKLQkJICovCi0JCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWRfc2VnbWVudChmdF9maXJzdF9kYXRhX3NlZ21lbnQsIAotCQkJCQkgICAgICAgemZ0X2RlYmxvY2tfYnVmLCAKLQkJCQkJICAgICAgIEZUX1JEX1NJTkdMRSksKTsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2V4dHJhY3Rfdm9sdW1lX2hlYWRlcnMoemZ0X2RlYmxvY2tfYnVmKSwpOwotCX0KLQl6ZnRfaGVhZGVyX3JlYWQgPSAxOwotCXpmdF9zZXRfZmxhZ3MoemZ0X3VuaXQpOwotCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1pbnQgemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24oY29uc3QgdW5zaWduZWQgaW50IHNlZ21lbnQsIHZvaWQgKmJ1ZmZlciwKLQkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCi0JCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHN0YXJ0LAotCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaXplKQotewotCWludCBzZWdfc3o7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoc2VnbWVudCA9PSB6ZnRfZGVibG9ja19zZWdtZW50KSB7Ci0JCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAotCQkgICAgICAicmUtdXNpbmcgc2VnbWVudCAlZCBhbHJlYWR5IGluIGRlYmxvY2sgYnVmZmVyIiwKLQkJICAgICAgc2VnbWVudCk7Ci0JCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHNlZ21lbnQpOwotCQlpZiAoc3RhcnQgPiBzZWdfc3opIHsKLQkJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfYnVnLAotCQkJCSAgICAidHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBzZWdtZW50OlxuIgotCQkJCSAgICBLRVJOX0lORk8gInNlZ19zeiA6ICVkXG4iCi0JCQkJICAgIEtFUk5fSU5GTyAic3RhcnQgIDogJWRcbiIKLQkJCQkgICAgS0VSTl9JTkZPICJzZWdtZW50OiAlZCIsCi0JCQkJICAgIHNlZ19zeiwgc3RhcnQsIHNlZ21lbnQpOwotCQl9Ci0JCWlmICgoc3RhcnQgKyBzaXplKSA+IHNlZ19zeikgewotCQkJVFJBQ0VfRVhJVCBzZWdfc3ogLSBzdGFydDsKLQkJfQotCQlUUkFDRV9FWElUIHNpemU7Ci0JfQotCXNlZ19zeiA9IGZ0YXBlX3JlYWRfc2VnbWVudF9mcmFjdGlvbihzZWdtZW50LCBidWZmZXIsIHJlYWRfbW9kZSwKLQkJCQkJICAgICBzdGFydCwgc2l6ZSk7Ci0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJzZWdtZW50ICVkLCByZXN1bHQgJWQiLCBzZWdtZW50LCBzZWdfc3opOwotCWlmICgoaW50KXNlZ19zeiA+PSAwICYmIHN0YXJ0ID09IDAgJiYgc2l6ZSA9PSBGVF9TRUdNRU5UX1NJWkUpIHsKLQkJLyogIHRoaXMgaW1wbGljaXRseSBhc3N1bWVzIHRoYXQgd2UgYXJlIGFsd2F5cyBjYWxsZWQgd2l0aAotCQkgKiAgYnVmZmVyID09IHpmdF9kZWJsb2NrX2J1ZiAKLQkJICovCi0JCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSBzZWdtZW50OwotCX0gZWxzZSB7Ci0JCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKLQl9Ci0JVFJBQ0VfRVhJVCBzZWdfc3o7Ci19Ci0KLS8qCi0gKiBvdXQ6Ci0gKgotICogaW50ICpyZWFkX2NudDogdGhlIG51bWJlciBvZiBieXRlcyB3ZSByZW1vdmVkIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICB6ZnRfZGVibG9ja19idWYgKHJlc3VsdCkKLSAqCi0gKiBpbnQgKnRvX2RvICAgOiB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHJlYWQtcmVxdWVzdC4gSXMgY2hhbmdlZC4KLSAqCi0gKiBpbjoKLSAqCi0gKiBjaGFyICpidWZmICAgICAgOiBidWZmIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSB1c2VyCi0gKiAgICAgICAgICAgICAgICAgICBidWZmZXIsIHRoYXQgaGFzbid0IGJlZW4gZmlsbGVkIHdpdGggZGF0YSB5ZXQuCi0gKiBpbnQgYnVmX3Bvc19yZWFkOiBjb3B5IG9mIGJ1Zl9wb3NfcmQKLSAqIGludCBidWZfbGVuX3JlYWQ6IGNvcHkgb2YgYnVmX2xlbl9yZAotICogY2hhciAqemZ0X2RlYmxvY2tfYnVmOiBmdGFwZV96ZnRfZGVibG9ja19idWYKLSAqCi0gKiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCi0gKgotICogdG9fZG8gTVVTVCBOT1QgU0hSSU5LIGV4Y2VwdCB0byBpbmRpY2F0ZSBhbiBFT1QuIEluIHRoaXMgY2FzZSB0b19kbwotICogaGFzIHRvIGJlIHNldCB0byAwLiBXZSBjYW5ub3QgcmV0dXJuIC1FTk9TUEMsIGJlY2F1c2Ugd2UgcmV0dXJuIHRoZQotICogYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgKiBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCi0gKi8KLXN0YXRpYyBpbnQgemZ0X3NpbXBsZV9yZWFkIChpbnQgKnJlYWRfY250LCAKLQkJCSAgICBfX3U4ICBfX3VzZXIgKmRzdF9idWYsIAotCQkJICAgIGNvbnN0IGludCB0b19kbywgCi0JCQkgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgCi0JCQkgICAgY29uc3QgaW50IHNlZ19zeiwgCi0JCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsCi0JCQkgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvcyA8IHRvX2RvKSB7Ci0JCSpyZWFkX2NudCA9IHNlZ19zeiAtIHBvcy0+c2VnX2J5dGVfcG9zOwotCX0gZWxzZSB7Ci0JCSpyZWFkX2NudCA9IHRvX2RvOwotCX0KLQlpZiAoY29weV90b191c2VyKGRzdF9idWYsIAotCQkJIHNyY19idWYgKyBwb3MtPnNlZ19ieXRlX3BvcywgKnJlYWRfY250KSAhPSAwKSB7Ci0JCVRSQUNFX0VYSVQgLUVGQVVMVDsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgIm5yIGJ5dGVzIGp1c3QgcmVhZDogJWQiLCAqcmVhZF9jbnQpOwotCVRSQUNFX0VYSVQgKnJlYWRfY250OwotfQotCi0vKiByZXFfbGVuOiBnZXRzIGNsaXBwZWQgZHVlIHRvIEVPVCBvZiBFT0YuCi0gKiByZXFfY2xpcHBlZDogaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciByZXFfbGVuIHdhcyBjbGlwcGVkIG9yIG5vdAotICogdm9sdW1lOiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IHZvbHVtZSAoYmxrX3N6IGV0Yy4pCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfcmVhZF9hY2Nlc3MoaW50ICpyZXFfbGVuLCAKLQkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKip2b2x1bWUsCi0JCQkgICAgIGludCAqcmVxX2NsaXBwZWQsIAotCQkJICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKLXsKLQlzdGF0aWMgX19zNjQgcmVtYWluaW5nOwotCXN0YXRpYyBpbnQgZW9kOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmICh6ZnRfaW9fc3RhdGUgIT0gemZ0X3JlYWRpbmcpIHsKLQkJaWYgKHpmdF9vZmZsaW5lKSB7IC8qIG9mZmxpbmUgaW5jbHVkZXMgbm9fdGFwZSAqLwotCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X3dhcm4sCi0JCQkJICAgICJ0YXBlIGlzIG9mZmxpbmUgb3Igbm8gY2FydHJpZGdlIik7Ci0JCX0KLQkJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKLQkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsCi0JCQkJICAgIGZ0X3Rfd2FybiwgInRhcGUgaXMgbm90IGZvcm1hdHRlZCIpOwotCQl9Ci0JCS8qICBub3cgZW50ZXIgZGVmaW5lZCBzdGF0ZSwgcmVhZCBoZWFkZXIgc2VnbWVudCBpZiBub3QKLQkJICogIGFscmVhZHkgZG9uZSBhbmQgZmx1c2ggd3JpdGUgYnVmZmVycwotCQkgKi8KLQkJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKLQkJemZ0X2lvX3N0YXRlID0gemZ0X3JlYWRpbmc7Ci0JCWlmICh6ZnRfdGFwZV9hdF9lb2QocG9zKSkgewotCQkJZW9kID0gMTsKLQkJCVRSQUNFX0VYSVQgMTsKLQkJfQotCQllb2QgPSAwOwotCQkqdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7Ci0JCS8qIGdldCB0aGUgc3BhY2UgbGVmdCB1bnRpbCBFT0YgKi8KLQkJcmVtYWluaW5nID0gemZ0X2NoZWNrX2Zvcl9lb2YoKnZvbHVtZSwgcG9zKTsKLQkJYnVmX2xlbl9yZCA9IDA7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZW1haW5pbmc6ICIgTExfWCAiLCB2b2xfbm86ICVkIiwKLQkJICAgICAgTEwocmVtYWluaW5nKSwgKCp2b2x1bWUpLT5jb3VudCk7Ci0JfSBlbHNlIGlmICh6ZnRfdGFwZV9hdF9lb2QocG9zKSkgewotCQlpZiAoKytlb2QgPiAyKSB7Ci0JCQlUUkFDRV9FWElUIC1FSU87IC8qIHN0LmMgYWxzbyByZXR1cm5zIC1FSU8gKi8KLQkJfSBlbHNlIHsKLQkJCVRSQUNFX0VYSVQgMTsKLQkJfQotCX0KLQlpZiAoKCpyZXFfbGVuICUgKCp2b2x1bWUpLT5ibGtfc3opICE9IDApIHsKLQkJLyogIHRoaXMgbWVzc2FnZSBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuIFRoZSB1c2VyIGdldHMgdGhlCi0JCSAqICBwcm9wZXIgcmV0dXJuIHZhbHVlCi0JCSAqLwotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCi0JCQkgICAgInJlcV9sZW4gJWQgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSAlZCIsCi0JCQkgICAgKnJlcV9sZW4sICgqdm9sdW1lKS0+YmxrX3N6KTsKLQl9Ci0JLyogQXMgR05VIHRhciBkb2Vzbid0IGFjY2VwdCBwYXJ0aWFsIHJlYWQgY291bnRzIHdoZW4gdGhlCi0JICogbXVsdGlwbGUgdm9sdW1lIGZsYWcgaXMgc2V0LCB3ZSBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZQotCSAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YS4gRXhjZXB0LCBvZiBjb3Vyc2UsIGF0IHRoZSBlbmQgb2YKLQkgKiB0aGUgdGFwZSBvciBmaWxlIG1hcmsuICAKLQkgKi8KLQlyZW1haW5pbmcgLT0gKnJlcV9sZW47Ci0JaWYgKHJlbWFpbmluZyA8PSAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsIAotCQkgICAgICAiY2xpcHBlZCByZXF1ZXN0IGZyb20gJWQgdG8gJWQuIiwgCi0JCSAgICAgICpyZXFfbGVuLCAoaW50KSgqcmVxX2xlbiArIHJlbWFpbmluZykpOwotCQkqcmVxX2xlbiArPSByZW1haW5pbmc7Ci0JCSpyZXFfY2xpcHBlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJKnJlcV9jbGlwcGVkID0gMDsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiB0aGlzX3NlZ3Nfc2l6ZTogdGhlIGN1cnJlbnQgc2VnbWVudCdzIHNpemUuCi0gKiBidWZmOiB0aGUgVVNFUi1TUEFDRSBidWZmZXIgcHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCi0gKiByZXFfbGVuOiBob3cgbXVjaCBkYXRhIHNob3VsZCBiZSByZWFkIGF0IG1vc3QuCi0gKiB2b2x1bWU6IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGN1cnJlbnQgdm9sdW1lIChibGtfc3ogZXRjLikKLSAqLyAgCi1zdGF0aWMgaW50IGVtcHR5X2RlYmxvY2tfYnVmKF9fdTggX191c2VyICp1c3JfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwKLQkJCSAgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKLQkJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCi0JCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCi17Ci0JaW50IGNudDsKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAidGhpc19zZWdzX3NpemU6ICVkIiwgc2VnX3N6KTsKLQlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbiAmJiB2b2x1bWUtPnVzZV9jb21wcmVzc2lvbikgewotCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7Ci0JCVRSQUNFX0NBVENIKHJlc3VsdD0gKCp6ZnRfY21wcl9vcHMtPnJlYWQpKCZjbnQsCi0JCQkJCQkJICB1c3JfYnVmLCByZXFfbGVuLAotCQkJCQkJCSAgc3JjX2J1Ziwgc2VnX3N6LAotCQkJCQkJCSAgcG9zLCB2b2x1bWUpLCk7Ci0JfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVRSQUNFX0NBVENIKHJlc3VsdD0gemZ0X3NpbXBsZV9yZWFkICgmY250LAotCQkJCQkJICAgICB1c3JfYnVmLCByZXFfbGVuLAotCQkJCQkJICAgICBzcmNfYnVmLCBzZWdfc3osCi0JCQkJCQkgICAgIHBvcywgdm9sdW1lKSwpOwotCX0KLQlwb3MtPnZvbHVtZV9wb3MgICArPSByZXN1bHQ7Ci0gICAgICAgIHBvcy0+dGFwZV9wb3MgICAgICs9IGNudDsKLQlwb3MtPnNlZ19ieXRlX3BvcyArPSBjbnQ7Ci0JYnVmX2xlbl9yZCAgICAgICAgLT0gY250OyAvKiByZW1haW5pbmcgYnl0ZXMgaW4gYnVmZmVyICovCi0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJidWZfbGVuX3JkOiAlZCwgY250OiAlZCIsIGJ1Zl9sZW5fcmQsIGNudCk7Ci0JaWYocG9zLT5zZWdfYnl0ZV9wb3MgPj0gc2VnX3N6KSB7Ci0JCXBvcy0+c2VnX3BvcysrOwotCQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7Ci0JfQotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnl0ZXMgbW92ZWQgb3V0IG9mIGRlYmxvY2stYnVmZmVyOiAlZCIsIGNudCk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLQotLyogbm90ZTogd2Ugc3RvcmUgdGhlIHNlZ21lbnQgaWQgb2YgdGhlIHNlZ21lbnQgdGhhdCBpcyBpbnNpZGUgdGhlCi0gKiBkZWJsb2NrIGJ1ZmZlci4gVGhpcyBzcGFyZXMgYSBsb3Qgb2YgZnRhcGVfcmVhZF9zZWdtZW50KClzIHdoZW4gd2UKLSAqIHVzZSBzbWFsbCBibG9jay1zaXplcy4gVGhlIGJsb2NrLXNpemUgbWF5IGJlIDFrYiAoU0VDVE9SX1NJWkUpLiBJbgotICogdGhpcyBjYXNlIGEgTVRGU1IgMjggbWF5YmUgc3RpbGwgaW5zaWRlIHRoZSBzYW1lIHNlZ21lbnQuCi0gKi8KLWludCBfemZ0X3JlYWQoY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKQotewotCWludCByZXFfY2xpcHBlZDsKLQlpbnQgcmVzdWx0ICAgICA9IDA7Ci0JaW50IGJ5dGVzX3JlYWQgPSAwOwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VnX3N6ID0gMDsKLQlzdGF0aWMgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSA9IE5VTEw7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JemZ0X3Jlc2lkID0gcmVxX2xlbjsKLQlyZXN1bHQgPSBjaGVja19yZWFkX2FjY2VzcygmcmVxX2xlbiwgJnZvbHVtZSwKLQkJCQkgICAmcmVxX2NsaXBwZWQsICZ6ZnRfcG9zKTsKLQlzd2l0Y2gocmVzdWx0KSB7Ci0JY2FzZSAwOiAKLQkJYnJlYWs7IC8qIG5vdGhpbmcgc3BlY2lhbCAqLwotCWNhc2UgMTogCi0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJFT0QgcmVhY2hlZCIpOwotCQlUUkFDRV9FWElUIDA7ICAgLyogRU9EICovCi0JZGVmYXVsdDoKLQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X25vaXNlLAotCQkJICAgICJjaGVja19yZWFkX2FjY2VzcygpIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCQkgICAgcmVzdWx0KTsKLQkJVFJBQ0VfRVhJVCByZXN1bHQ7Ci0JfQotCXdoaWxlIChyZXFfbGVuID4gMCkgeyAKLQkJLyogIEFsbG93IGVzY2FwZSBmcm9tIHRoaXMgbG9vcCBvbiBzaWduYWwgIQotCQkgKi8KLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQkvKiBidWZfbGVuX3JkID09IDAgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHJlYWQgYSBuZXcKLQkJICogc2VnbWVudC4KLQkJICovCi0JCWlmIChidWZfbGVuX3JkID09IDApIHsKLQkJCXdoaWxlKChyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudCh6ZnRfcG9zLnNlZ19wb3MsCi0JCQkJCQkJICB6ZnRfZGVibG9ja19idWYsCi0JCQkJCQkJICBGVF9SRF9BSEVBRCkpID09IDApIHsKLQkJCQl6ZnRfcG9zLnNlZ19wb3MgKys7Ci0JCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAwOwotCQkJfQotCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQl6ZnRfcmVzaWQgLT0gYnl0ZXNfcmVhZDsKLQkJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3Rfbm9pc2UsCi0JCQkJCSAgICAiemZ0X2ZldGNoX3NlZ21lbnQoKTogJWQiLAotCQkJCQkgICAgcmVzdWx0KTsKLQkJCX0KLQkJCXNlZ19zeiA9IHJlc3VsdDsKLQkJCWJ1Zl9sZW5fcmQgPSBzZWdfc3ogLSB6ZnRfcG9zLnNlZ19ieXRlX3BvczsKLQkJfQotCQlUUkFDRV9DQVRDSChyZXN1bHQgPSBlbXB0eV9kZWJsb2NrX2J1ZihidWZmLCAKLQkJCQkJCSAgICAgICByZXFfbGVuLAotCQkJCQkJICAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgCi0JCQkJCQkgICAgICAgc2VnX3N6LCAKLQkJCQkJCSAgICAgICAmemZ0X3BvcywKLQkJCQkJCSAgICAgICB2b2x1bWUpLAotCQkJICAgIHpmdF9yZXNpZCAtPSBieXRlc19yZWFkKTsKLQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJieXRlcyBqdXN0IHJlYWQ6ICVkIiwgcmVzdWx0KTsKLQkJYnl0ZXNfcmVhZCArPSByZXN1bHQ7IC8qIHdoYXQgd2UgZ290IHNvIGZhciAgICAgICAqLwotCQlidWZmICAgICAgICs9IHJlc3VsdDsgLyogaW5kZXggaW4gdXNlci1idWZmZXIgICAgICovCi0JCXJlcV9sZW4gICAgLT0gcmVzdWx0OyAvKiB3aGF0J3MgbGVmdCBmcm9tIHJlcV9sZW4gKi8KLQl9IC8qIHdoaWxlIChyZXFfbGVuICA+IDApICovCi0JaWYgKHJlcV9jbGlwcGVkKSB7Ci0JCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAotCQkgICAgICAibWF5YmUgcGFydGlhbCBjb3VudCBiZWNhdXNlIG9mIGVvZiBtYXJrIik7Ci0JCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mICYmIGJ5dGVzX3JlYWQgPT0gMCkgewotCQkJLyogcmVxX2xlbiB3YXMgPiAwLCBidXQgdXNlciBkaWRuJ3QgZ2V0Ci0JCQkgKiBhbnl0aGluZyB0aGUgdXNlciBoYXMgcmVhZCBpbiB0aGUgZW9mLW1hcmsgCi0JCQkgKi8KLQkJCXpmdF9tb3ZlX3Bhc3RfZW9mKCZ6ZnRfcG9zKTsKLQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOwotCQl9IGVsc2UgewotCQkJLyogZG9uJ3Qgc2tpcCB0byB0aGUgbmV4dCBmaWxlIGJlZm9yZSB0aGUgdXNlcgotCQkJICogdHJpZWQgdG8gcmVhZCBhIHNlY29uZCB0aW1lIHBhc3QgRU9GIEp1c3QKLQkJCSAqIG1hcmsgdGhhdCB3ZSBhcmUgYXQgRU9GIGFuZCBtYXliZSBkZWNyZW1lbnQKLQkJCSAqIHpmdF9zZWdfcG9zIHRvIHN0YXkgaW4gdGhlIHNhbWUgdm9sdW1lOwotCQkJICovCi0JCQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMTsKLQkJCXpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKCZ6ZnRfcG9zLCB2b2x1bWUpOwotCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImp1c3QgYmVmb3JlIGVvZiIpOwotCQl9Ci0JfQotCXpmdF9yZXNpZCAtPSByZXN1bHQ7IC8qIGZvciBNVFNUQVRVUyAgICAgICAqLwotCVRSQUNFX0VYSVQgYnl0ZXNfcmVhZDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5NDFkZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jaWZuZGVmIF9aRlRBUEVfUkVBRF9ICi0jZGVmaW5lIF9aRlRBUEVfUkVBRF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDcgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgZnVuY3Rpb25zCi0gKiAgICAgIGZvciB0aGUgemZ0YXBlIGRyaXZlciBmb3IgTGludXguCi0gKgotICovCi0KLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCi0KLS8qICAgICAgZnRhcGUtcmVhZC5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCi0gKi8KLWV4dGVybiBpbnQgemZ0X2p1c3RfYmVmb3JlX2VvZjsKLQkKLS8qICAgICAgZnRhcGUtcmVhZC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuIHZvaWQgemZ0X3phcF9yZWFkX2J1ZmZlcnModm9pZCk7Ci1leHRlcm4gaW50ICB6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHModm9pZCk7Ci1leHRlcm4gaW50ICB6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbihjb25zdCB1bnNpZ25lZCBpbnQgc2VnbWVudCwKLQkJCQkgICAgICAgdm9pZCAqYnVmZmVyLAotCQkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCi0JCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzdGFydCwKLQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHNpemUpOwotI2RlZmluZSB6ZnRfZmV0Y2hfc2VnbWVudChzZWdtZW50LCBhZGRyZXNzLCByZWFkX21vZGUpCQlcCi0JemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlLAlcCi0JCQkJICAgMCwgRlRfU0VHTUVOVF9TSVpFKQotLyogICBob29rIGZvciB0aGUgVkZTIGludGVyZmFjZQotICovCi1leHRlcm4gaW50ICBfemZ0X3JlYWQoY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKTsKLQotI2VuZGlmIC8qIF9aRlRBUEVfUkVBRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNjM0Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDggJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgY29tbW9uIGNvZGUgZm9yIHRoZSByL3cgY29kZSBmb3IKLSAqICAgICAgemZ0YXBlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotCi1fX3U4ICp6ZnRfZGVibG9ja19idWY7Ci1fX3U4ICp6ZnRfaHNlZ19idWY7Ci1pbnQgemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOwotemZ0X3N0YXR1c19lbnVtIHpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOwotaW50IHpmdF9oZWFkZXJfY2hhbmdlZDsKLWludCB6ZnRfcWljMTEzOyAvKiBjb25mb3JtIHRvIG9sZCBzcGVjcy4gYW5kIG9sZCB6ZnRhcGUgKi8KLWludCB6ZnRfdXNlX2NvbXByZXNzaW9uOwotemZ0X3Bvc2l0aW9uIHpmdF9wb3MgPSB7Ci0JLTEsIC8qIHNlZ19wb3MgKi8KLQkwLCAgLyogc2VnX2J5dGVfcG9zICovCi0JMCwgIC8qIHRhcGVfcG9zICovCi0JMCAgIC8qIHZvbHVtZV9wb3MgKi8KLX07Ci11bnNpZ25lZCBpbnQgemZ0X2Jsa19zeiA9IENPTkZJR19aRlRfREZMVF9CTEtfU1o7Ci1fX3M2NCB6ZnRfY2FwYWNpdHk7Ci0KLXVuc2lnbmVkIGludCB6ZnRfd3JpdHRlbl9zZWdtZW50czsKLWludCB6ZnRfbGFiZWxfY2hhbmdlZDsKLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi0KLXVuc2lnbmVkIGludCB6ZnRfZ2V0X3NlZ19zeih1bnNpZ25lZCBpbnQgc2VnbWVudCkKLXsKLQlpbnQgc2l6ZTsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCQotCXNpemUgPSBGVF9TRUdNRU5UX1NJWkUgLSAKLQkJY291bnRfb25lcyhmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50KSkqRlRfU0VDVE9SX1NJWkU7Ci0JaWYgKHNpemUgPiAwKSB7Ci0JCVRSQUNFX0VYSVQgKHVuc2lnbmVkKXNpemU7IAotCX0gZWxzZSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci19Ci0KLS8qIGZ0YXBlX3NldF9mbGFncygpLiBDbGF1cy1KdXN0dXMgSGVpbmUsIDE5OTQvMTk5NQotICovCi12b2lkIHpmdF9zZXRfZmxhZ3ModW5zaWduZWQgbWlub3JfdW5pdCkKLXsgICAgIAotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXpmdF91c2VfY29tcHJlc3Npb24gPSB6ZnRfcWljX21vZGUgPSAwOwotCXN3aXRjaCAobWlub3JfdW5pdCAmIFpGVF9NSU5PUl9PUF9NQVNLKSB7Ci0JY2FzZSAoWkZUX1E4MF9NT0RFIHwgWkZUX1pJUF9NT0RFKToKLQljYXNlIFpGVF9aSVBfTU9ERToKLQkJemZ0X3VzZV9jb21wcmVzc2lvbiA9IDE7Ci0JY2FzZSAwOgotCWNhc2UgWkZUX1E4MF9NT0RFOgotCQl6ZnRfcWljX21vZGUgPSAxOwotCQlpZiAoemZ0X210X2NvbXByZXNzaW9uKSB7IC8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICovCi0JCQl6ZnRfdXNlX2NvbXByZXNzaW9uID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIFpGVF9SQVdfTU9ERToKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgInN3aXRjaGluZyB0byByYXcgbW9kZSIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOlxuIgotCQkgICAgICBLRVJOX0lORk8gIldyb25nIGNvbWJpbmF0aW9uIG9mIG1pbm9yIGRldmljZSBiaXRzLlxuIgotCQkgICAgICBLRVJOX0lORk8gIlN3aXRjaGluZyB0byByYXcgcmVhZC1vbmx5IG1vZGUuIik7Ci0JCXpmdF93cml0ZV9wcm90ZWN0ZWQgPSAxOwotCQlicmVhazsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotLyogY29tcHV0ZXMgdGhlIHNlZ21lbnQgYW5kIGJ5dGUgb2Zmc2V0IGluc2lkZSB0aGUgc2VnbWVudAotICogY29ycmVzcG9uZGluZyB0byB0YXBlX3Bvcy4KLSAqCi0gKiB0YXBlX3BvcyBnaXZlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAqIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCAqc2VnX2J5dGVfcG9zIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGN1cnJlbnQKLSAqIHNlZ21lbnQgaW4gYnl0ZXMKLSAqCi0gKiBPZiwgaWYgdGhpcyByb3V0aW5lIHdhcyBjYWxsZWQgb2Z0ZW4gb25lIHNob3VsZCBjYWNoZSB0aGUgbGFzdCBkYXRhCi0gKiBwb3MgaXQgd2FzIGNhbGxlZCB3aXRoLCBidXQgYWN0dWFsbHkgdGhpcyBpcyBvbmx5IG5lZWRlZCBpbgotICogZnRhcGVfc2Vla19ibG9jaygpLCB0aGF0IGlzLCBhbG1vc3QgbmV2ZXIuCi0gKi8KLWludCB6ZnRfY2FsY19zZWdfYnl0ZV9jb29yZChpbnQgKnNlZ19ieXRlX3BvcywgX19zNjQgdGFwZV9wb3MpCi17Ci0JaW50IHNlZ21lbnQ7Ci0JaW50IHNlZ19zejsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAodGFwZV9wb3MgPT0gMCkgewotCQkqc2VnX2J5dGVfcG9zID0gMDsKLQkJc2VnbWVudCA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKLQl9IGVsc2UgewotCQlzZWdfc3ogPSAwOwotCQkKLQkJZm9yIChzZWdtZW50ID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OyAKLQkJICAgICAoKHRhcGVfcG9zID4gMCkgJiYgKHNlZ21lbnQgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQpKTsKLQkJICAgICBzZWdtZW50KyspIHsKLQkJCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHNlZ21lbnQpOyAKLQkJCXRhcGVfcG9zIC09IHNlZ19zejsKLQkJfQotCQlpZih0YXBlX3BvcyA+PSAwKSB7Ci0JCQkvKiB0aGUgY2FzZSB0YXBlX3BvcyA+ICE9IDAgbWVhbnMgdGhhdCB0aGUKLQkJCSAqIGFyZ3VtZW50IHRhcGVfcG9zIGxpZXMgYmV5b25kIHRoZSBFT1QuCi0JCQkgKi8KLQkJCSpzZWdfYnl0ZV9wb3M9IDA7Ci0JCX0gZWxzZSB7IC8qIHRhcGVfcG9zIDwgMCAqLwotCQkJc2VnbWVudC0tOwotCQkJKnNlZ19ieXRlX3Bvcz0gdGFwZV9wb3MgKyBzZWdfc3o7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVChzZWdtZW50KTsKLX0KLQotLyogZnRhcGVfY2FsY190YXBlX3BvcygpLgotICoKLSAqIGNvbXB1dGVzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICogZnRfZmlyc3RfZGF0YV9zZWdtZW50IGludmVyc2UgdG8gZnRhcGVfY2FsY19zZWdfYnl0ZV9jb29yZAotICoKLSAqIFdlIHNob3VsZCBkbyBzb21lIGNhY2hpbmcuIEJ1dCBob3c6Ci0gKgotICogRWFjaCB0aW1lIHRoZSBoZWFkZXIgc2VnbWVudHMgYXJlIHJlYWQgaW4sIHRoaXMgcm91dGluZSBpcyBjYWxsZWQKLSAqIHdpdGggZnRfdHJhY2tzX3Blcl90YXBlKnNlZ21lbnRzX3Blcl90cmFjayBhcmd1bW5ldC4gU28gdGhpcyBzaG91bGQgYmUKLSAqIHRoZSB0aW1lIHRvIHJlc2V0IHRoZSBjYWNoZS4KLSAqCi0gKiBBbHNvLCBpdCBtaWdodCBiZSBpbiB0aGUgZnV0dXJlIHRoYXQgdGhlIGJhZCBzZWN0b3IgbWFwIGdldHMKLSAqIGNoYW5nZWQuICAtPiByZXNldCB0aGUgY2FjaGUKLSAqLwotc3RhdGljIGludCBzZWdfcG9zOwotc3RhdGljIF9fczY0IHRhcGVfcG9zOwotCi1fX3M2NCB6ZnRfZ2V0X2NhcGFjaXR5KHZvaWQpCi17Ci0Jc2VnX3BvcyAgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JdGFwZV9wb3MgPSAwOwotCi0Jd2hpbGUgKHNlZ19wb3MgPD0gZnRfbGFzdF9kYXRhX3NlZ21lbnQpIHsKLQkJdGFwZV9wb3MgKz0gemZ0X2dldF9zZWdfc3ooc2VnX3BvcyArKyk7Ci0JfQotCXJldHVybiB0YXBlX3BvczsKLX0KLQotX19zNjQgemZ0X2NhbGNfdGFwZV9wb3MoaW50IHNlZ21lbnQpCi17Ci0JaW50IGQxLCBkMiwgZDM7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQlpZiAoc2VnbWVudCA+IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7Ci0JICAgICAgICBUUkFDRV9FWElUIHpmdF9jYXBhY2l0eTsKLQl9Ci0JaWYgKHNlZ21lbnQgPCBmdF9maXJzdF9kYXRhX3NlZ21lbnQpIHsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlkMiA9IHNlZ21lbnQgLSBzZWdfcG9zOwotCWlmICgtZDIgPiAxMCkgewotCQlkMSA9IHNlZ21lbnQgLSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JCWlmICgtZDIgPiBkMSkgewotCQkJdGFwZV9wb3MgPSAwOwotCQkJc2VnX3BvcyA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKLQkJCWQyID0gZDE7Ci0JCX0KLQl9Ci0JaWYgKGQyID4gMTApIHsKLQkJZDMgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCAtIHNlZ21lbnQ7Ci0JCWlmIChkMiA+IGQzKSB7Ci0JCQl0YXBlX3BvcyA9IHpmdF9jYXBhY2l0eTsKLQkJCXNlZ19wb3MgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOwotCQkJZDIgPSAtZDM7Ci0JCX0KLQl9CQkKLQlpZiAoZDIgPiAwKSB7Ci0JCXdoaWxlIChzZWdfcG9zIDwgc2VnbWVudCkgewotCQkJdGFwZV9wb3MgKz0gIHpmdF9nZXRfc2VnX3N6KHNlZ19wb3MrKyk7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoc2VnX3BvcyA+IHNlZ21lbnQpIHsKLQkJCXRhcGVfcG9zIC09ICB6ZnRfZ2V0X3NlZ19zeigtLXNlZ19wb3MpOwotCQl9Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJuZXcgY2FjaGVkIHBvczogJWQiLCBzZWdfcG9zKTsKLQotCVRSQUNFX0VYSVQgdGFwZV9wb3M7Ci19Ci0KLS8qIGNvcHkgWi1sYWJlbCBzdHJpbmcgdG8gYnVmZmVyLCBrZWVwcyB0cmFjayBvZiB0aGUgY29ycmVjdCBvZmZzZXQgaW4KLSAqIGBidWZmZXInIAotICovCi12b2lkIHpmdF91cGRhdGVfbGFiZWwoX191OCAqYnVmZmVyKQoteyAKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoc3RybmNtcCgmYnVmZmVyW0ZUX0xBQkVMXSwgWkZUQVBFX0xBQkVMLCAKLQkJICAgIHNpemVvZihaRlRBUEVfTEFCRUwpLTEpICE9IDApIHsKLQkJVFJBQ0UoZnRfdF9pbmZvLCAidXBkYXRpbmcgbGFiZWwgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIiwKLQkJICAgICAgJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCk7Ci0JCXN0cmNweSgmYnVmZmVyW0ZUX0xBQkVMXSwgWkZUQVBFX0xBQkVMKTsKLQkJbWVtc2V0KCZidWZmZXJbRlRfTEFCRUxdICsgc2l6ZW9mKFpGVEFQRV9MQUJFTCkgLSAxLCAnICcsIAotCQkgICAgICAgRlRfTEFCRUxfU1ogLSBzaXplb2YoWkZUQVBFX0xBQkVMICsgMSkpOwotCQlQVVQ0KGJ1ZmZlciwgRlRfTEFCRUxfREFURSwgMCk7Ci0JCXpmdF9sYWJlbF9jaGFuZ2VkID0gemZ0X2hlYWRlcl9jaGFuZ2VkID0gMTsgLyogY2hhbmdlZCAqLwotCX0KLQlUUkFDRV9FWElUOwotfQotCi1pbnQgemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyh1bnNpZ25lZCBpbnQgc2VnbWVudCwgCi0JCQkgICAgICBfX3U4ICpkYXRhLCBzaXplX3Qgc2l6ZSwKLQkJCSAgICAgIF9fdTggKmJ1ZmZlcikKLXsKLQlpbnQgcmVzdWx0OwotCV9fdTggKndyaXRlX2J1ZjsKLQlfX3U4ICpzcmNfYnVmOwotCWludCBzaW5nbGU7Ci0JaW50IHNlZ19wb3M7Ci0JaW50IHNlZ19zejsKLQlpbnQgcmVtYWluaW5nOwotCWZ0X3dyaXRlX21vZGVfdCB3cml0ZV9tb2RlOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0Jc2VnX3BvcyAgID0gc2VnbWVudDsKLQlzZWdfc3ogICAgPSB6ZnRfZ2V0X3NlZ19zeihzZWdfcG9zKTsKLQlzcmNfYnVmICAgPSBkYXRhOwotCXNpbmdsZSAgICA9IHNpemUgPD0gc2VnX3N6OwotCXJlbWFpbmluZyA9IHNpemU7Ci0JZG8gewotCQlUUkFDRShmdF90X25vaXNlLCAiXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nOiAlZFxuIgotCQkgICAgICBLRVJOX0lORk8gInNlZ19zeiAgIDogJWRcbiIKLQkJICAgICAgS0VSTl9JTkZPICJzZWdtZW50ICA6ICVkIiwKLQkJICAgICAgcmVtYWluaW5nLCBzZWdfc3osIHNlZ19wb3MpOwotCQlpZiAocmVtYWluaW5nID09IHNlZ19zeikgewotCQkJd3JpdGVfYnVmID0gc3JjX2J1ZjsKLQkJCXdyaXRlX21vZGUgPSBzaW5nbGUgPyBGVF9XUl9TSU5HTEUgOiBGVF9XUl9NVUxUSTsKLQkJCXJlbWFpbmluZyA9IDA7Ci0JCX0gZWxzZSBpZiAocmVtYWluaW5nID4gc2VnX3N6KSB7Ci0JCQl3cml0ZV9idWYgPSBzcmNfYnVmOwotCQkJd3JpdGVfbW9kZSA9IEZUX1dSX0FTWU5DOyAvKiBkb24ndCBzdGFydCB0YXBlICovCi0JCQlyZW1haW5pbmcgLT0gc2VnX3N6OwotCQl9IGVsc2UgeyAvKiByZW1haW5pbmcgPCBzZWdfc3ogKi8KLQkJCXdyaXRlX2J1ZiA9IGJ1ZmZlcjsKLQkJCW1lbWNweSh3cml0ZV9idWYsIHNyY19idWYsIHJlbWFpbmluZyk7Ci0JCQltZW1zZXQoJndyaXRlX2J1ZltyZW1haW5pbmddLCdcMCcsc2VnX3N6LXJlbWFpbmluZyk7Ci0JCQl3cml0ZV9tb2RlID0gc2luZ2xlID8gRlRfV1JfU0lOR0xFIDogRlRfV1JfTVVMVEk7Ci0JCQlyZW1haW5pbmcgPSAwOwotCQl9Ci0JCWlmICgocmVzdWx0ID0gZnRhcGVfd3JpdGVfc2VnbWVudChzZWdfcG9zLCAKLQkJCQkJCSAgd3JpdGVfYnVmLCAKLQkJCQkJCSAgd3JpdGVfbW9kZSkpICE9IHNlZ19zeikgewotCQkJVFJBQ0UoZnRfdF9lcnIsICJFcnJvcjogIgotCQkJICAgICAgIkNvdWxkbid0IHdyaXRlIHNlZ21lbnQgJWQiLCBzZWdfcG9zKTsKLQkJCVRSQUNFX0VYSVQgcmVzdWx0IDwgMCA/IHJlc3VsdCA6IC1FSU87IC8qIGJhaWwgb3V0ICovCi0JCX0KLQkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgKys7Ci0JCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KCsrc2VnX3Bvcyk7Ci0JCXNyY19idWYgKz0gcmVzdWx0OwotCX0gd2hpbGUgKHJlbWFpbmluZyA+IDApOwotCWlmIChmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSA9PSB3cml0aW5nKSB7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUoKSwpOwotCQlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOwotCQl6ZnRfcHJldmVudF9mbHVzaCgpOwotCX0KLQlzZWdfcG9zID0gc2VnbWVudDsKLQlzcmNfYnVmID0gZGF0YTsKLQlyZW1haW5pbmcgPSBzaXplOwotCWRvIHsKLQkJVFJBQ0VfQ0FUQ0gocmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KHNlZ19wb3MsIGJ1ZmZlciwgCi0JCQkJCQkJc2luZ2xlID8gRlRfUkRfU0lOR0xFCi0JCQkJCQkJOiBGVF9SRF9BSEVBRCksKTsKLQkJaWYgKG1lbWNtcChzcmNfYnVmLCBidWZmZXIsIAotCQkJICAgcmVtYWluaW5nID4gcmVzdWx0ID8gcmVzdWx0IDogcmVtYWluaW5nKSAhPSAwKSB7Ci0JCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCQkgICAgIkZhaWxlZCB0byB2ZXJpZnkgd3JpdHRlbiBzZWdtZW50ICVkIiwKLQkJCQkgICAgc2VnX3Bvcyk7Ci0JCX0KLQkJcmVtYWluaW5nIC09IHJlc3VsdDsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgInZlcmlmeSBzdWNjZXNzZnVsOlxuIgotCQkgICAgICBLRVJOX0lORk8gInNlZ21lbnQgIDogJWRcbiIKLQkJICAgICAgS0VSTl9JTkZPICJzZWdzaXplICA6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nOiAlZCIsCi0JCSAgICAgIHNlZ19wb3MsIHJlc3VsdCwgcmVtYWluaW5nKTsKLQkJc3JjX2J1ZiAgICs9IHNlZ19zejsKLQkJc2VnX3BvcysrOwotCX0gd2hpbGUgKHJlbWFpbmluZyA+IDApOwotCVRSQUNFX0VYSVQgc2l6ZTsKLX0KLQotCi0vKiB6ZnRfZXJhc2UoKS4gIGltcGxlbWVudGVkIGNvbXByZXNzaW9uLWhhbmRsaW5nCi0gKgotICogY2FsY3VsYXRlIHRoZSBmaXJzdCBkYXRhLXNlZ21lbnQgd2hlbiB1c2luZy9ub3QgdXNpbmcgY29tcHJlc3Npb24uCi0gKgotICogdXBkYXRlIGhlYWRlci1zZWdtZW50IGFuZCBjb21wcmVzc2lvbi1tYXAtc2VnbWVudC4KLSAqLwotaW50IHpmdF9lcmFzZSh2b2lkKQotewotCWludCByZXN1bHQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF92bWFsbG9jX29uY2UoKHZvaWQgKiopJnpmdF9oc2VnX2J1ZiwKLQkJCQkJICAgICBGVF9TRUdNRU5UX1NJWkUpLCk7Ci0JCS8qIG5vIG5lZWQgdG8gcmVhZCB0aGUgdnRibCBhbmQgY29tcHJlc3Npb24gbWFwICovCi0JCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWRfaGVhZGVyX3NlZ21lbnQoemZ0X2hzZWdfYnVmKSwpOwotCQlpZiAoKHpmdF9vbGRfZnRhcGUgPSAKLQkJICAgICB6ZnRfZnRhcGVfdmFsaWRhdGVfbGFiZWwoJnpmdF9oc2VnX2J1ZltGVF9MQUJFTF0pKSkgewotCQkJemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyh6ZnRfaHNlZ19idWYpOwotCQl9Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCSAgICAgICJmdF9maXJzdF9kYXRhX3NlZ21lbnQ6ICVkLCBmdF9sYXN0X2RhdGFfc2VnbWVudDogJWQiLCAKLQkJICAgICAgZnRfZmlyc3RfZGF0YV9zZWdtZW50LCBmdF9sYXN0X2RhdGFfc2VnbWVudCk7Ci0JCXpmdF9xaWMxMTMgPSAoZnRfZm9ybWF0X2NvZGUgIT0gZm10X25vcm1hbCAmJgotCQkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzExMDBmdCAmJgotCQkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzQyNWZ0KTsKLQl9Ci0JaWYgKHpmdF9vbGRfZnRhcGUpIHsKLQkJemZ0X2NsZWFyX2Z0YXBlX2ZpbGVfbWFya3MoKTsKLQkJemZ0X29sZF9mdGFwZSA9IDA7IC8qIG5vIGxvbmdlciBvbGQgZnRhcGUgKi8KLQl9Ci0JUFVUMih6ZnRfaHNlZ19idWYsIEZUX0NNQVBfU1RBUlQsIDApOwotCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9IDE7Ci0JemZ0X2NhcGFjaXR5ID0gemZ0X2dldF9jYXBhY2l0eSgpOwotCXpmdF9pbml0X3Z0YmwoKTsKLQkvKiB0aGUgcmVzdCBtdXN0IGJlIGRvbmUgaW4gZnRhcGVfdXBkYXRlX2hlYWRlcl9zZWdtZW50cyAKLQkgKi8KLQl6ZnRfaGVhZGVyX3JlYWQgPSAxOwotCXpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7IC8qIGZvcmNlIHVwZGF0ZSBvZiB0aW1lc3RhbXAgKi8KLQlyZXN1bHQgPSB6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cygpOwotCi0JZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7Ci0KLQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOwotCXpmdF9zZXRfZmxhZ3MgKHpmdF91bml0KTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotdW5zaWduZWQgaW50IHpmdF9nZXRfdGltZSh2b2lkKSAKLXsKLQl1bnNpZ25lZCBpbnQgZGF0ZSA9IEZUX1RJTUVfU1RBTVAoMjA5NywgMTEsIDMwLCAyMywgNTksIDU5KTsgLyogZnVuICovCi0JcmV0dXJuIGRhdGU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZWMyMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLSNpZm5kZWYgX1pGVEFQRV9SV19ICi0jZGVmaW5lIF9aRlRBUEVfUldfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDkgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgYW5kIHdyaXRlCi0gKiAgICAgIGZ1bmN0aW9ucyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgotCi0jZGVmaW5lIFNFR01FTlRTX1BFUl9UQVBFICAoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlKQotCi0vKiAgUUlDLTExMyBSZXYuIEcgc2F5cyB0aGF0IGBhIG1heGltdW0gb2YgNjM0ODggcmF3IGJ5dGVzIG1heSBiZQotICogIGNvbXByZXNzZWQgaW50byBhIHNpbmdsZSBmcmFtZScuCi0gKiAgTWF5YmUgd2Ugc2hvdWxkIHN0aWNrIHRvIDMya2IgdG8gbWFrZSBpdCBtb3JlIGBiZWF1dGlmdWwnCi0gKi8KLSNkZWZpbmUgWkZUX01BWF9CTEtfU1ogICAgICAgICAgICg2MioxMDI0KSAvKiBieXRlcyAqLwotI2lmICFkZWZpbmVkKENPTkZJR19aRlRfREZMVF9CTEtfU1opCi0jIGRlZmluZSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaICAgKDEwKjEwMjQpIC8qIGJ5dGVzLCBkZWZhdWx0IG9mIGdudSB0YXIgKi8KLSNlbGlmIENPTkZJR19aRlRfREZMVF9CTEtfU1ogPT0gMAotIyB1bmRlZiAgQ09ORklHX1pGVF9ERkxUX0JMS19TWgotIyBkZWZpbmUgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAxCi0jZWxpZiAoQ09ORklHX1pGVF9ERkxUX0JMS19TWiAlIDEwMjQpICE9IDAKLSMgZXJyb3IgQ09ORklHX1pGVF9ERkxUX0JMS19TWiBtdXN0IGJlIDEgb3IgYSBtdWx0aXBsZSBvZiAxMDI0Ci0jZW5kaWYKLS8qIFRoZSAqb3B0aW9uYWwqIGNvbXByZXNzaW9uIHJvdXRpbmVzIG5lZWQgc29tZSBvdmVyaGVhZCBwZXIgdGFwZQotICogIGJsb2NrIGZvciB0aGVpciBwdXJwb3Nlcy4gSW5zdGVhZCBvZiBhc2tpbmcgdGhlIGFjdHVhbCBjb21wcmVzc2lvbgotICogIGltcGxlbWVudGF0aW9uIGhvdyBtdWNoIGl0IG5lZWRzLCB3ZSByZXN0cmljdCB0aGlzIG92ZXJoZWFkIHRvIGJlCi0gKiAgbWF4aW1hbCBvZiBaRlRfQ01QVF9PVkVSSEVBRCBzaXplLiBXZSBuZWVkIHRoaXMgZm9yIEVPVAotICogIGNvbmRpdGlvbnMuIFRoZSB0YXBlIGlzIGFzc3VtZWQgdG8gYmUgbG9naWNhbCBhdCBFT1Qgd2hlbiB0aGUKLSAqICBkaXN0YW5jZSBmcm9tIHRoZSBwaHlzaWNhbCBFT1QgaXMgbGVzcyB0aGFuIAotICogIG9uZSB0YXBlIGJsb2NrICsgWkZUX0NNUFJfT1ZFUkhFQUQgCi0gKi8KLSNkZWZpbmUgWkZUX0NNUFJfT1ZFUkhFQUQgMTYgICAgICAgIC8qIGJ5dGVzICovCi0KLXR5cGVkZWYgZW51bQoteyAKLQl6ZnRfaWRsZSA9IDAsCi0JemZ0X3JlYWRpbmcsCi0JemZ0X3dyaXRpbmcsCi19IHpmdF9zdGF0dXNfZW51bTsKLQotdHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAvKiAgYWxsIHZhbHVlcyBtZWFzdXJlZCBpbiBieXRlcyAqLwotewotCWludCAgIHNlZ19wb3M7ICAgICAgIC8qICBzZWdtZW50IGN1cnJlbnRseSBwb3NpdGlvbmVkIGF0ICovCi0JaW50ICAgc2VnX2J5dGVfcG9zOyAgLyogIG9mZnNldCBpbiBjdXJyZW50IHNlZ21lbnQgKi8gCi0JX19zNjQgdGFwZV9wb3M7ICAgICAgLyogIHJlYWwgb2Zmc2V0IGZyb20gQk9UICovCi0JX19zNjQgdm9sdW1lX3BvczsgICAgLyogIHBvcy4gaW4gdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtIGluCi0JCQkgICAgICAqICBjdXJyZW50IHZvbHVtZSAKLQkJCSAgICAgICovCi19IHpmdF9wb3NpdGlvbjsgCi0KLWV4dGVybiB6ZnRfcG9zaXRpb24gemZ0X3BvczsKLWV4dGVybiBfX3U4ICp6ZnRfZGVibG9ja19idWY7Ci1leHRlcm4gX191OCAqemZ0X2hzZWdfYnVmOwotZXh0ZXJuIGludCB6ZnRfZGVibG9ja19zZWdtZW50OwotZXh0ZXJuIHpmdF9zdGF0dXNfZW51bSB6ZnRfaW9fc3RhdGU7Ci1leHRlcm4gaW50IHpmdF9oZWFkZXJfY2hhbmdlZDsKLWV4dGVybiBpbnQgemZ0X3FpYzExMzsgLyogY29uZm9ybSB0byBvbGQgc3BlY3MuIGFuZCBvbGQgemZ0YXBlICovCi1leHRlcm4gaW50IHpmdF91c2VfY29tcHJlc3Npb247Ci1leHRlcm4gdW5zaWduZWQgaW50IHpmdF9ibGtfc3o7Ci1leHRlcm4gX19zNjQgemZ0X2NhcGFjaXR5OwotZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfd3JpdHRlbl9zZWdtZW50czsKLWV4dGVybiBpbnQgemZ0X2xhYmVsX2NoYW5nZWQ7Ci0KLS8qICB6ZnRhcGUtcncuYyBleHBvcnRlZCBmdW5jdGlvbnMKLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfZ2V0X3NlZ19zeih1bnNpZ25lZCBpbnQgc2VnbWVudCk7Ci1leHRlcm4gdm9pZCAgemZ0X3NldF9mbGFncyh1bnNpZ25lZCBpbnQgbWlub3JfdW5pdCk7Ci1leHRlcm4gaW50ICAgemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoaW50ICpzZWdfYnl0ZV9wb3MsIF9fczY0IHRhcGVfcG9zKTsKLWV4dGVybiBfX3M2NCB6ZnRfY2FsY190YXBlX3BvcyhpbnQgc2VnbWVudCk7Ci1leHRlcm4gX19zNjQgemZ0X2dldF9jYXBhY2l0eSh2b2lkKTsKLWV4dGVybiB2b2lkICB6ZnRfdXBkYXRlX2xhYmVsKF9fdTggKmJ1ZmZlcik7Ci1leHRlcm4gaW50ICAgemZ0X2VyYXNlKHZvaWQpOwotZXh0ZXJuIGludCAgIHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHModW5zaWduZWQgaW50IHNlZ21lbnQsIAotCQkJCSAgICAgICBfX3U4ICpkYXRhLCBzaXplX3Qgc2l6ZSwgX191OCAqYnVmZmVyKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgemZ0X2dldF90aW1lKHZvaWQpOwotI2VuZGlmIC8qIF9aRlRBUEVfUldfSCAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2Y4YmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU3ICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IENsYXVzLUp1c3R1cyBIZWluZSAKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jLHYgJAotICogJFJldmlzaW9uOiAxLjcuNi4xICQKLSAqICREYXRlOiAxOTk3LzExLzI0IDEzOjQ4OjMxICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgdm9sdW1lIHRhYmxlIGFzIGRlZmluZWQgaW4gdmFyaW91cyBRSUMKLSAqICAgICAgc3RhbmRhcmRzLgotICogCi0gKiAgICAgIFRoaXMgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uLCBqdXN0IGFsbG93aW5nIG9yZGluYXJ5IERPUwotICogICAgICA6KCBwcmdyYW1zIHRvIGlkZW50aWZ5IHRoZSBjYXJ0cmlkZ2UgYXMgdXNlZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgotCi0jZGVmaW5lIFpGVF9DTUFQX0hBQ0sgLyogbGVhdmUgdGhpcyBkZWZpbmVkIHRvIGhpZGUgdGhlIGNvbXByZXNzaW9uIG1hcCAqLwotCi0vKgotICogIGdsb2JhbCB2YXJpYWJsZXMgCi0gKi8KLWludCB6ZnRfcWljX21vZGUgICA9IDE7IC8qIHVzZSB0aGUgdnRibCAqLwotaW50IHpmdF9vbGRfZnRhcGU7IC8qIHByZXZlbnRzIG9sZCBmdGFwZWQgdGFwZXMgdG8gYmUgb3ZlcndyaXR0ZW4gKi8KLWludCB6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQ7IC8qIGZvciB3cml0ZV9oZWFkZXJfc2VnbWVudHMoKSAqLwotCi0vKgotICogIHByaXZhdGUgdmFyaWFibGVzIChvbmx5IGV4cG9ydGVkIGZvciBpbmxpbmUgZnVuY3Rpb25zKQotICovCi1MSVNUX0hFQUQoemZ0X3Z0YmwpOwotCi0vKiAgV2UgY291bGQgYWxzbyBhbGxvY2F0ZSB0aGVzZSBkeW5hbWljYWxseSB3aGVuIGV4dHJhY3RpbmcgdGhlIHZvbHVtZSB0YWJsZQotICogIHNpemVvZih6ZnRfdm9saW5mbykgaXMgYWJvdXQgMzIgb3Igc29tZXRoaW5nIGNsb3NlIHRvIHRoYXQKLSAqLwotc3RhdGljIHpmdF92b2xpbmZvICB0YXBlX3Z0Ymw7Ci1zdGF0aWMgemZ0X3ZvbGluZm8gIGVvdF92dGJsOwotc3RhdGljIHpmdF92b2xpbmZvICpjdXJfdnRibDsKLQotc3RhdGljIGlubGluZSB2b2lkIHpmdF9uZXdfdnRibF9lbnRyeSh2b2lkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9ICZ6ZnRfbGFzdF92dGJsLT5ub2RlOwotCXpmdF92b2xpbmZvICpuZXcgPSB6ZnRfa21hbGxvYyhzaXplb2YoemZ0X3ZvbGluZm8pKTsKLQotCWxpc3RfYWRkKCZuZXctPm5vZGUsIHRtcCk7Ci0JbmV3LT5jb3VudCA9IHpmdF9lb21fdnRibC0+Y291bnQgKys7Ci19Ci0KLXZvaWQgemZ0X2ZyZWVfdnRibCh2b2lkKQotewotCWZvciAoOzspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gemZ0X3Z0YmwucHJldjsKLQkJemZ0X3ZvbGluZm8gKnZ0Ymw7Ci0KLQkJaWYgKHRtcCA9PSAmemZ0X3Z0YmwpCi0JCQlicmVhazsKLQkJbGlzdF9kZWwodG1wKTsKLQkJdnRibCA9IGxpc3RfZW50cnkodG1wLCB6ZnRfdm9saW5mbywgbm9kZSk7Ci0JCXpmdF9rZnJlZSh2dGJsLCBzaXplb2YoemZ0X3ZvbGluZm8pKTsKLQl9Ci0JSU5JVF9MSVNUX0hFQUQoJnpmdF92dGJsKTsKLQljdXJfdnRibCA9IE5VTEw7Ci19Ci0KLS8qICBpbml0aWFsaXplIHZ0YmwsIGNhbGxlZCBieSBmdGFwZV9uZXdfY2FydHJpZGdlKCkKLSAqLwotdm9pZCB6ZnRfaW5pdF92dGJsKHZvaWQpCi17IAotCXpmdF92b2xpbmZvICpuZXc7Ci0KLQl6ZnRfZnJlZV92dGJsKCk7Ci0JCi0JLyogIENyZWF0ZSB0aGUgdHdvIGR1bW15IHZ0YmwgZW50cmllcwotCSAqLwotCW5ldyA9IHpmdF9rbWFsbG9jKHNpemVvZih6ZnRfdm9saW5mbykpOwotCWxpc3RfYWRkKCZuZXctPm5vZGUsICZ6ZnRfdnRibCk7Ci0JbmV3ID0gemZ0X2ttYWxsb2Moc2l6ZW9mKHpmdF92b2xpbmZvKSk7Ci0JbGlzdF9hZGQoJm5ldy0+bm9kZSwgJnpmdF92dGJsKTsKLQl6ZnRfaGVhZF92dGJsLT5lbmRfc2VnICAgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JemZ0X2hlYWRfdnRibC0+YmxrX3N6ICAgID0gemZ0X2Jsa19zejsKLQl6ZnRfaGVhZF92dGJsLT5jb3VudCAgICAgPSAtMTsKLQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQgKyAxOwotCXpmdF9lb21fdnRibC0+ZW5kX3NlZyAgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKLQl6ZnRfZW9tX3Z0YmwtPmJsa19zeiAgICAgPSB6ZnRfYmxrX3N6OwotCXpmdF9lb21fdnRibC0+Y291bnQgICAgICA9IDA7Ci0KLQkvKiAgUmVzZXQgdGhlIHBvaW50ZXIgZm9yIHpmdF9maW5kX3ZvbHVtZSgpCi0JICovCi0JY3VyX3Z0YmwgPSB6ZnRfZW9tX3Z0Ymw7Ci0KLQkvKiBpbml0aWFsaXplIHRoZSBkdW1teSB2dGJsIGVudHJpZXMgZm9yIHpmdF9xaWNfbW9kZSA9PSAwCi0JICovCi0JZW90X3Z0Ymwuc3RhcnRfc2VnICAgICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOwotCWVvdF92dGJsLmVuZF9zZWcgICAgICAgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKLQllb3RfdnRibC5ibGtfc3ogICAgICAgICAgPSB6ZnRfYmxrX3N6OwotCWVvdF92dGJsLmNvdW50ICAgICAgICAgICA9IC0xOwotCXRhcGVfdnRibC5zdGFydF9zZWcgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JdGFwZV92dGJsLmVuZF9zZWcgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50OwotCXRhcGVfdnRibC5ibGtfc3ogICAgPSB6ZnRfYmxrX3N6OwotCXRhcGVfdnRibC5zaXplICAgICAgPSB6ZnRfY2FwYWNpdHk7Ci0JdGFwZV92dGJsLmNvdW50ICAgICA9IDA7Ci19Ci0KLS8qIGNoZWNrIGZvciBhIHZhbGlkIFZUQkwgc2lnbmF0dXJlLiAKLSAqLwotc3RhdGljIGludCB2dGJsX3NpZ25hdHVyZV92YWxpZChfX3U4IHNpZ25hdHVyZVs0XSkKLXsKLQljb25zdCBjaGFyICp2dGJsX2lkc1tdID0gVlRCTF9JRFM7IC8qIHZhbGlkIHNpZ25hdHVyZXMgKi8KLQlpbnQgajsKLQkKLQlmb3IgKGogPSAwOyAKLQkgICAgIChqIDwgTlJfSVRFTVModnRibF9pZHMpKSAmJiAobWVtY21wKHNpZ25hdHVyZSwgdnRibF9pZHNbal0sIDQpICE9IDApOwotCSAgICAgaisrKTsKLQlyZXR1cm4gaiA8IE5SX0lURU1TKHZ0YmxfaWRzKTsKLX0KLQotLyogV2UgdXNlZCB0byBzdG9yZSB0aGUgYmxvY2stc2l6ZSBvZiB0aGUgdm9sdW1lIGluIHRoZSB2b2x1bWUtbGFiZWwsCi0gKiB1c2luZyB0aGUga2V5d29yZCAiYmxvY2tzaXplIi4gVGhlIGJsb2Nrc2l6ZSB3cml0dGVuIHRvIHRoZQotICogdm9sdW1lLWxhYmVsIGlzIGluIGJ5dGVzLgotICoKLSAqIFdlIHVzZSB0aGlzIG5vdyBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHpmdGFwZSB2ZXJzaW9uLiBXZQotICogc3RvcmUgdGhlIGJsb2Nrc2l6ZSBkaXJlY3RseSBhcyBiaW5hcnkgbnVtYmVyIGluIHRoZSB2ZW5kb3IKLSAqIGV4dGVuc2lvbiBwYXJ0IG9mIHRoZSB2b2x1bWUgZW50cnkuCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfdm9sdW1lX2xhYmVsKGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgKmJsa19zeikKLXsgCi0JaW50IHZhbGlkX2Zvcm1hdDsKLQljaGFyICpibG9ja3NpemU7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxlZCB3aXRoIFwiJXNcIiAvIFwiJXNcIiIsIGxhYmVsLCBaRlRfVk9MX05BTUUpOwotCWlmIChzdHJuY21wKGxhYmVsLCBaRlRfVk9MX05BTUUsIHN0cmxlbihaRlRfVk9MX05BTUUpKSAhPSAwKSB7Ci0JCSpibGtfc3ogPSAxOyAvKiBzbWFsbGVzdCBibG9jayBzaXplIHRoYXQgd2UgYWxsb3cgKi8KLQkJdmFsaWRfZm9ybWF0ID0gMDsKLQl9IGVsc2UgewotCQlUUkFDRShmdF90X25vaXNlLCAiZ290IG9sZCBzdHlsZSB6ZnRhcGUgdnRibCBlbnRyeSIpOwotCQkvKiBnZXQgdGhlIGRlZmF1bHQgYmxvY2tzaXplICovCi0JCS8qIHVzZSB0aGUga2VybmVsIHN0cnN0cigpICAgKi8KLQkJYmxvY2tzaXplPSBzdHJzdHIobGFiZWwsICIgYmxvY2tzaXplICIpOwotCQlpZiAoYmxvY2tzaXplKSB7Ci0JCQlibG9ja3NpemUgKz0gc3RybGVuKCIgYmxvY2tzaXplICIpOwotCQkJZm9yKCpibGtfc3o9IDA7IAotCQkJICAgICpibG9ja3NpemUgPj0gJzAnICYmICpibG9ja3NpemUgPD0gJzknOyAKLQkJCSAgICBibG9ja3NpemUrKykgewotCQkJCSpibGtfc3ogKj0gMTA7Ci0JCQkJKmJsa19zeiArPSAqYmxvY2tzaXplIC0gJzAnOwotCQkJfQotCQkJaWYgKCpibGtfc3ogPiBaRlRfTUFYX0JMS19TWikgewotCQkJCSpibGtfc3o9IDE7Ci0JCQkJdmFsaWRfZm9ybWF0PSAwOwotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZF9mb3JtYXQgPSAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJKmJsa19zej0gMTsKLQkJCXZhbGlkX2Zvcm1hdD0gMDsKLQkJfQotCX0KLQlUUkFDRV9FWElUIHZhbGlkX2Zvcm1hdDsKLX0KLQotLyogICBjaGVjayBmb3IgYSB6ZnRhcGUgdm9sdW1lCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdm9sdW1lKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmKHN0cm5jbXAoJmVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfU0lHXSwgWkZUQVBFX1NJRywKLQkJICAgc3RybGVuKFpGVEFQRV9TSUcpKSA9PSAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3QgbmV3IHN0eWxlIHpmdGFwZSB2dGJsIGVudHJ5Iik7Ci0JCXZvbHVtZS0+YmxrX3N6ID0gR0VUMihlbnRyeSwgVlRCTF9FWFQrRVhUX1pGVEFQRV9CTEtTWik7Ci0JCXZvbHVtZS0+cWljMTEzID0gZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9RSUMxMTNdOwotCQlUUkFDRV9FWElUIDE7Ci0JfSBlbHNlIHsKLQkJVFJBQ0VfRVhJVCBjaGVja192b2x1bWVfbGFiZWwoJmVudHJ5W1ZUQkxfREVTQ10sICZ2b2x1bWUtPmJsa19zeik7Ci0JfQotfQotCi0KLS8qIGNyZWF0ZSB6ZnRhcGUgc3BlY2lmaWMgdnRibCBlbnRyeSwgdGhlIHZvbHVtZSBib3VuZHMgYXJlIGluc2VydGVkCi0gKiBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycygpCi0gKi8KLXN0YXRpYyB2b2lkIGNyZWF0ZV96ZnRfdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdnRibCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCW1lbXNldChlbnRyeSwgMCwgVlRCTF9TSVpFKTsKLQltZW1jcHkoJmVudHJ5W1ZUQkxfU0lHXSwgVlRCTF9JRCwgNCk7Ci0Jc3ByaW50ZigmZW50cnlbVlRCTF9ERVNDXSwgWkZUX1ZPTF9OQU1FIiAlMDNkIiwgdnRibC0+Y291bnQpOwotCWVudHJ5W1ZUQkxfRkxBR1NdID0gKFZUQkxfRkxfTk9UX1ZFUklGSUVEIHwgVlRCTF9GTF9TRUdfU1BBTk5JTkcpOwotCWVudHJ5W1ZUQkxfTV9OT10gPSAxOyAvKiBtdWx0aV9jYXJ0cmlkZ2VfY291bnQgKi8KLQlzdHJjcHkoJmVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfU0lHXSwgWkZUQVBFX1NJRyk7Ci0JUFVUMihlbnRyeSwgVlRCTF9FWFQrRVhUX1pGVEFQRV9CTEtTWiwgdnRibC0+YmxrX3N6KTsKLQlpZiAoemZ0X3FpYzExMykgewotCQlQVVQ4KGVudHJ5LCBWVEJMX0RBVEFfU0laRSwgdnRibC0+c2l6ZSk7Ci0JCWVudHJ5W1ZUQkxfQ01QUl0gPSBWVEJMX0NNUFJfVU5SRUc7IAotCQlpZiAodnRibC0+dXNlX2NvbXByZXNzaW9uKSB7IC8qIHVzZSBjb21wcmVzc2lvbjogKi8KLQkJCWVudHJ5W1ZUQkxfQ01QUl0gfD0gVlRCTF9DTVBSX1VTRUQ7Ci0JCX0KLQkJZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9RSUMxMTNdID0gMTsKLQl9IGVsc2UgewotCQlQVVQ0KGVudHJ5LCBWVEJMX0RBVEFfU0laRSwgdnRibC0+c2l6ZSk7Ci0JCWVudHJ5W1ZUQkxfS19DTVBSXSA9IFZUQkxfQ01QUl9VTlJFRzsgCi0JCWlmICh2dGJsLT51c2VfY29tcHJlc3Npb24pIHsgLyogdXNlIGNvbXByZXNzaW9uOiAqLwotCQkJZW50cnlbVlRCTF9LX0NNUFJdIHw9IFZUQkxfQ01QUl9VU0VEOwotCQl9Ci0JfQotCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7Ci0JCS8qIFNDU0kgbGlrZSB2dGJsLCBzdG9yZSB0aGUgbnVtYmVyIG9mIHVzZWQKLQkJICogc2VnbWVudHMgYXMgNCBieXRlIHZhbHVlIAotCQkgKi8KLQkJUFVUNChlbnRyeSwgVlRCTF9TQ1NJX1NFR1MsIHZ0YmwtPmVuZF9zZWctdnRibC0+c3RhcnRfc2VnICsgMSk7Ci0JfSBlbHNlIHsKLQkJLyogbm9ybWFsLCBRSUMtODBNQyBsaWtlIHZ0YmwgCi0JCSAqLwotCQlQVVQyKGVudHJ5LCBWVEJMX1NUQVJULCB2dGJsLT5zdGFydF9zZWcpOwotCQlQVVQyKGVudHJ5LCBWVEJMX0VORCwgdnRibC0+ZW5kX3NlZyk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qIHRoaXMgb25lIGNyZWF0ZXMgdGhlIHZvbHVtZSBoZWFkZXJzIGZvciBlYWNoIHZvbHVtZS4gSXQgaXMgYXNzdW1lZAotICogdGhhdCBidWZmZXIgYWxyZWFkeSBjb250YWlucyB0aGUgb2xkIHZvbHVtZS10YWJsZSwgc28gdGhhdCB2dGJsCi0gKiBlbnRyaWVzIHdpdGhvdXQgdGhlIHpmdF92b2x1bWUgZmxhZyBzZXQgY2FuIHNhdmVseSBiZSBpZ25vcmVkLgotICovCi1zdGF0aWMgdm9pZCB6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcikKLXsgICAKLQlfX3U4ICplbnRyeTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0JemZ0X3ZvbGluZm8gKnZ0Ymw7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0jaWZkZWYgWkZUX0NNQVBfSEFDSwotCWlmKChzdHJuY21wKCZidWZmZXJbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHLAotCQkgICAgc3RybGVuKFpGVEFQRV9TSUcpKSA9PSAwKSAmJiAKLQkgICBidWZmZXJbVlRCTF9FWFQrRVhUX1pGVEFQRV9DTUFQXSAhPSAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJkZWxldGluZyBjbWFwIHZvbHVtZSIpOwotCQltZW1tb3ZlKGJ1ZmZlciwgYnVmZmVyICsgVlRCTF9TSVpFLAotCQkJRlRfU0VHTUVOVF9TSVpFIC0gVlRCTF9TSVpFKTsKLQl9Ci0jZW5kaWYKLQllbnRyeSA9IGJ1ZmZlcjsKLQlmb3IgKHRtcCA9IHpmdF9oZWFkX3Z0YmwtPm5vZGUubmV4dDsKLQkgICAgIHRtcCAhPSAmemZ0X2VvbV92dGJsLT5ub2RlOwotCSAgICAgdG1wID0gdG1wLT5uZXh0KSB7Ci0JCXZ0YmwgPSBsaXN0X2VudHJ5KHRtcCwgemZ0X3ZvbGluZm8sIG5vZGUpOwotCQkvKiB3ZSBub3cgZmlsbCBpbiB0aGUgdmFsdWVzIG9ubHkgZm9yIG5ld2x5IGNyZWF0ZWQgdm9sdW1lcy4KLQkJICovCi0JCWlmICh2dGJsLT5uZXdfdm9sdW1lKSB7Ci0JCQljcmVhdGVfemZ0X3ZvbHVtZShlbnRyeSwgdnRibCk7Ci0JCQl2dGJsLT5uZXdfdm9sdW1lID0gMDsgLyogY2xlYXIgdGhlIGZsYWcgKi8KLQkJfQotCQkKLQkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICZlbnRyeVtWVEJMX0RFU0NdLCB2dGJsKTsKLQkJZW50cnkgKz0gVlRCTF9TSVpFOwotCX0KLQltZW1zZXQoZW50cnksIDAsIEZUX1NFR01FTlRfU0laRSAtIHpmdF9lb21fdnRibC0+Y291bnQgKiBWVEJMX1NJWkUpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qICB3cml0ZSB2b2x1bWUgdGFibGUgdG8gdGFwZS4gQ2FsbHMgemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycygpCi0gKi8KLWludCB6ZnRfdXBkYXRlX3ZvbHVtZV90YWJsZSh1bnNpZ25lZCBpbnQgc2VnbWVudCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlfX3U4ICp2ZXJpZnlfYnVmID0gTlVMTDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChmdF9maXJzdF9kYXRhX3NlZ21lbnQsIAotCQkJCQkJemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJRlRfUkRfU0lOR0xFKSwpOwotCXpmdF9jcmVhdGVfdm9sdW1lX2hlYWRlcnMoemZ0X2RlYmxvY2tfYnVmKTsKLQlUUkFDRShmdF90X25vaXNlLCAid3JpdGluZyB2b2x1bWUgdGFibGUgc2VnbWVudCAlZCIsIHNlZ21lbnQpOwotCWlmICh6ZnRfdm1hbGxvY19vbmNlKCZ2ZXJpZnlfYnVmLCBGVF9TRUdNRU5UX1NJWkUpID09IDApIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhzZWdtZW50LCAKLQkJCQkJCSAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgcmVzdWx0LAotCQkJCQkJICAgICAgdmVyaWZ5X2J1ZiksCi0JCQkgICAgemZ0X3ZmcmVlKCZ2ZXJpZnlfYnVmLCBGVF9TRUdNRU5UX1NJWkUpKTsKLQkJemZ0X3ZmcmVlKCZ2ZXJpZnlfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOwotCX0gZWxzZSB7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX3dyaXRlX3NlZ21lbnQoc2VnbWVudCwgemZ0X2RlYmxvY2tfYnVmLCAKLQkJCQkJCUZUX1dSX1NJTkdMRSksKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiBub24gemZ0YXBlIHZvbHVtZXMgYXJlIGhhbmRsZWQgaW4gcmF3IG1vZGUuIFRodXMgd2UgbmVlZCB0bwotICogY2FsY3VsYXRlIHRoZSByYXcgYW1vdW50IG9mIGRhdGEgY29udGFpbmVkIGluIHRob3NlIHNlZ21lbnRzLiAgCi0gKi8KLXN0YXRpYyB2b2lkIGV4dHJhY3RfYWxpZW5fdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdnRibCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXZ0YmwtPnNpemUgID0gKHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcrMSkgLQotCQkgICAgICAgemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKSk7Ci0JdnRibC0+dXNlX2NvbXByZXNzaW9uID0gMDsKLQl2dGJsLT5xaWMxMTMgPSB6ZnRfcWljMTEzOwotCWlmICh2dGJsLT5xaWMxMTMpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgCi0JCSAgICAgICJGYWtlIGFsaWVuIHZvbHVtZSdzIHNpemUgZnJvbSAiIExMX1ggIiB0byAiIExMX1gsIAotCQkgICAgICBMTChHRVQ4KGVudHJ5LCBWVEJMX0RBVEFfU0laRSkpLCBMTCh2dGJsLT5zaXplKSk7Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwKLQkJICAgICAgIkZha2UgYWxpZW4gdm9sdW1lJ3Mgc2l6ZSBmcm9tICVkIHRvICIgTExfWCwgCi0JCSAgICAgIChpbnQpR0VUNChlbnRyeSwgVlRCTF9EQVRBX1NJWkUpLCBMTCh2dGJsLT5zaXplKSk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLQotLyogZXh0cmFjdCBhbiB6ZnRhcGUgc3BlY2lmaWMgdm9sdW1lCi0gKi8KLXN0YXRpYyB2b2lkIGV4dHJhY3RfemZ0X3ZvbHVtZShfX3U4ICplbnRyeSwgemZ0X3ZvbGluZm8gKnZ0YmwpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAodnRibC0+cWljMTEzKSB7Ci0JCXZ0YmwtPnNpemUgPSBHRVQ4KGVudHJ5LCBWVEJMX0RBVEFfU0laRSk7Ci0JCXZ0YmwtPnVzZV9jb21wcmVzc2lvbiA9IAotCQkJKGVudHJ5W1ZUQkxfQ01QUl0gJiBWVEJMX0NNUFJfVVNFRCkgIT0gMDsgCi0JfSBlbHNlIHsKLQkJdnRibC0+c2l6ZSA9IEdFVDQoZW50cnksIFZUQkxfREFUQV9TSVpFKTsKLQkJaWYgKGVudHJ5W1ZUQkxfS19DTVBSXSAmIFZUQkxfQ01QUl9VTlJFRykgewotCQkJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gCi0JCQkJKGVudHJ5W1ZUQkxfS19DTVBSXSAmIFZUQkxfQ01QUl9VU0VEKSAhPSAwOwotCQl9IGVsc2UgaWYgKGVudHJ5W1ZUQkxfQ01QUl0gJiBWVEJMX0NNUFJfVU5SRUcpIHsKLQkJCXZ0YmwtPnVzZV9jb21wcmVzc2lvbiA9IAotCQkJCShlbnRyeVtWVEJMX0NNUFJdICYgVlRCTF9DTVBSX1VTRUQpICE9IDA7IAotCQl9IGVsc2UgewotCQkJVFJBQ0UoZnRfdF93YXJuLCAiR2VlaCEgVGhlcmUgaXMgc29tZXRoaW5nIHdyb25nOlxuIgotCQkJICAgICAgS0VSTl9JTkZPICJRSUMgY29tcHJlc3Npb24gKFJldiA9IEspOiAleFxuIgotCQkJICAgICAgS0VSTl9JTkZPICJRSUMgY29tcHJlc3Npb24gKFJldiA+IEspOiAleCIsCi0JCQkgICAgICBlbnRyeVtWVEJMX0tfQ01QUl0sIGVudHJ5W1ZUQkxfQ01QUl0pOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIHZvbHVtZSB0YWJsZSBmcm9tIGJ1ZmZlci4gImJ1ZmZlciIgbXVzdCBhbHJlYWR5IGNvbnRhaW4KLSAqIHRoZSB2dGJsLXNlZ21lbnQgCi0gKi8KLWludCB6ZnRfZXh0cmFjdF92b2x1bWVfaGVhZGVycyhfX3U4ICpidWZmZXIpCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBfX3U4ICplbnRyeTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQl6ZnRfaW5pdF92dGJsKCk7Ci0JZW50cnkgPSBidWZmZXI7Ci0jaWZkZWYgWkZUX0NNQVBfSEFDSwotCWlmICgoc3RybmNtcCgmZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHLAotCQkgICAgIHN0cmxlbihaRlRBUEVfU0lHKSkgPT0gMCkgJiYKLQkgICAgZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9DTUFQXSAhPSAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJpZ25vcmluZyBjbWFwIHZvbHVtZSIpOwotCQllbnRyeSArPSBWVEJMX1NJWkU7Ci0JfSAKLSNlbmRpZgotCS8qIHRoZSBlbmQgb2YgdGhlIHZ0YmwgaXMgaW5kaWNhdGVkIGJ5IGFuIGludmFsaWQgc2lnbmF0dXJlIAotCSAqLwotCXdoaWxlICh2dGJsX3NpZ25hdHVyZV92YWxpZCgmZW50cnlbVlRCTF9TSUddKSAmJgotCSAgICAgICAoZW50cnkgLSBidWZmZXIpIDwgRlRfU0VHTUVOVF9TSVpFKSB7Ci0JCXpmdF9uZXdfdnRibF9lbnRyeSgpOwotCQlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgewotCQkJLyogU0NTSSBsaWtlIHZ0YmwsIHN0b3JlcyBvbmx5IHRoZSBudW1iZXIgb2YKLQkJCSAqIHNlZ21lbnRzIHVzZWQgCi0JCQkgKi8KLQkJCXVuc2lnbmVkIGludCBudW1fc2VnbWVudHM9IEdFVDQoZW50cnksIFZUQkxfU0NTSV9TRUdTKTsKLQkJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOwotCQkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyA9IAotCQkJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyArIG51bV9zZWdtZW50cyAtIDE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBgbm9ybWFsJywgUUlDLTgwIGxpa2UgdnRibCAKLQkJCSAqLwotCQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gR0VUMihlbnRyeSwgVlRCTF9TVEFSVCk7Ci0JCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgPSBHRVQyKGVudHJ5LCBWVEJMX0VORCk7Ci0JCX0KLQkJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyArIDE7Ci0JCS8qIGNoZWNrIGlmIHdlIGNyZWF0ZWQgdGhpcyB2b2x1bWUgYW5kIGdldCB0aGUKLQkJICogYmxrX3N6IAotCQkgKi8KLQkJemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSA9IGNoZWNrX3ZvbHVtZShlbnRyeSwgemZ0X2xhc3RfdnRibCk7Ci0JCWlmICh6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lID09IDApIHsKLQkJCWV4dHJhY3RfYWxpZW5fdm9sdW1lKGVudHJ5LCB6ZnRfbGFzdF92dGJsKTsKLQkJfSBlbHNlIHsKLQkJCWV4dHJhY3RfemZ0X3ZvbHVtZShlbnRyeSwgemZ0X2xhc3RfdnRibCk7Ci0JCX0KLQkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICZlbnRyeVtWVEJMX0RFU0NdLCB6ZnRfbGFzdF92dGJsKTsKLQkJZW50cnkgKz1WVEJMX1NJWkU7Ci0JfQotI2lmIDAKLS8qCi0gKiAgdW5kZWZpbmUgdG8gdGVzdCBlbmQgb2YgdGFwZSBoYW5kbGluZwotICovCi0JemZ0X25ld192dGJsX2VudHJ5KCk7Ci0JemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7Ci0JemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSAxMDsKLQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgICAgICAgPSB6ZnRfYmxrX3N6OwotCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgICAgICA9IDE7Ci0JemZ0X2xhc3RfdnRibC0+cWljMTEzICAgICAgICAgID0gemZ0X3FpYzExMzsKLQl6ZnRfbGFzdF92dGJsLT5zaXplID0gKHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcrMSkKLQkJCSAgICAgICAtIHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZykpOwotI2VuZGlmCi0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiB0aGlzIGZ1bmN0aW9ucyB0cmFuc2xhdGVzIHRoZSBmYWlsZWRfc2VjdG9yX2xvZywgbWlzdXNlZCBhcwotICogRU9GLW1hcmtlciBsaXN0LCBpbnRvIGEgdmlydHVhbCB2b2x1bWUgdGFibGUuIFRoZSB0YWJsZSBtdXN0bid0IGJlCi0gKiB3cml0dGVuIHRvIHRhcGUsIGJlY2F1c2UgdGhpcyB3b3VsZCBvY2N1cHkgdGhlIGZpcnN0IGRhdGEgc2VnbWVudCwKLSAqIHdoaWNoIHNob3VsZCBiZSB0aGUgdm9sdW1lIHRhYmxlLCBidXQgaXMgYWN0dWFsbHkgdGhlIGZpcnN0IHNlZ21lbnQKLSAqIHRoYXQgaXMgZmlsbGVkIHdpdGggZGF0YSAod2hlbiB1c2luZyBzdGFuZGFyZCBmdGFwZSkuICBXZSBhc3N1bWUsCi0gKiB0aGF0IHdlIGdldCBhIG5vbi1lbXB0eSBmYWlsZWRfc2VjdG9yX2xvZy4KLSAqLwotaW50IHpmdF9mYWtlX3ZvbHVtZV9oZWFkZXJzIChlb2ZfbWFya191bmlvbiAqZW9mX21hcCwgaW50IG51bV9mYWlsZWRfc2VjdG9ycykKLXsKLQl1bnNpZ25lZCBpbnQgc2VnbWVudCwgc2VjdG9yOwotCWludCBoYXZlX2VvbSA9IDA7Ci0JaW50IHZvbF9ubzsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICgobnVtX2ZhaWxlZF9zZWN0b3JzID49IDIpICYmCi0JICAgIChHRVQyKCZlb2ZfbWFwW251bV9mYWlsZWRfc2VjdG9ycyAtIDFdLm1hcmsuc2VnbWVudCwgMCkgCi0JICAgICA9PSAKLQkgICAgIEdFVDIoJmVvZl9tYXBbbnVtX2ZhaWxlZF9zZWN0b3JzIC0gMl0ubWFyay5zZWdtZW50LCAwKSArIDEpICYmCi0JICAgIChHRVQyKCZlb2ZfbWFwW251bV9mYWlsZWRfc2VjdG9ycyAtIDFdLm1hcmsuZGF0ZSwgMCkgPT0gMSkpIHsKLQkJLyogdGhpcyBzaG91bGQgYmUgZW9tLiBXZSBrZWVwIHRoZSByZW1haW5kZXIgb2YgdGhlCi0JCSAqIHRhcGUgYXMgYW5vdGhlciB2b2x1bWUuCi0JCSAqLwotCQloYXZlX2VvbSA9IDE7Ci0JfQotCXpmdF9pbml0X3Z0YmwoKTsKLQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKLQlmb3Iodm9sX25vID0gMDsgdm9sX25vIDwgbnVtX2ZhaWxlZF9zZWN0b3JzIC0gaGF2ZV9lb207IHZvbF9ubyArKykgewotCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKLQotCQlzZWdtZW50ID0gR0VUMigmZW9mX21hcFt2b2xfbm9dLm1hcmsuc2VnbWVudCwgMCk7Ci0JCXNlY3RvciAgPSBHRVQyKCZlb2ZfbWFwW3ZvbF9ub10ubWFyay5kYXRlLCAwKTsKLQotCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7Ci0JCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICAgPSBzZWdtZW50OwotCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBzZWdtZW50ICsgMTsKLQkJemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgICA9IDE7Ci0JCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICAgPSAKLQkJCSh6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5lbmRfc2VnKQotCQkJIC0gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKQotCQkJICsgKHNlY3Rvci0xKSAqIEZUX1NFQ1RPUl9TSVpFKTsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgCi0JCSAgICAgICJmYWlsZWQgc2VjdG9yIGxvZzogc2VnbWVudDogJWQsIHNlY3RvcjogJWQiLCAKLQkJICAgICAgc2VnbWVudCwgc2VjdG9yKTsKLQkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICJGYWtlZCB2b2x1bWUiLCB6ZnRfbGFzdF92dGJsKTsKLQl9Ci0JaWYgKCFoYXZlX2VvbSkgewotCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKLQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7Ci0JCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50OwotCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7Ci0JCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICA9IHpmdF9jYXBhY2l0eTsKLQkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgLT0gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKTsKLQkJemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgID0gMTsKLQkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICJGYWtlZCB2b2x1bWUiLHpmdF9sYXN0X3Z0YmwpOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qIHVwZGF0ZSB0aGUgaW50ZXJuYWwgdm9sdW1lIHRhYmxlCi0gKgotICogaWYgYmVmb3JlIHN0YXJ0IG9mIGxhc3Qgdm9sdW1lOiBlcmFzZSBhbGwgZm9sbG93aW5nIHZvbHVtZXMgaWYKLSAqIGluc2lkZSBhIHZvbHVtZTogc2V0IGVuZCBvZiB2b2x1bWUgdG8gaW5maW5pdHkKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIF9mdGFwZV93cml0ZSgpIGlzCi0gKiBjYWxsZWQKLSAqCi0gKiByZXR1cm46IDAgaWYgbm8gbmV3IHZvbHVtZSB3YXMgY3JlYXRlZCwgMSBpZiBhIG5ldyB2b2x1bWUgd2FzCi0gKiBjcmVhdGVkCi0gKgotICogTk9URTogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgemZ0X21vZGUgYXMgZnRhcGVfd3JpdGUoKSBkb2VzCi0gKiB0aGF0IGFscmVhZHkuIFRoaXMgZnVuY3Rpb24gZ2V0cyBuZXZlciBjYWxsZWQgd2l0aG91dCBhY2Nlc3NpbmcKLSAqIHpmdGFwZSB2aWEgdGhlICpxZnQqIGRldmljZXMgCi0gKi8KLQotaW50IHpmdF9vcGVuX3ZvbHVtZSh6ZnRfcG9zaXRpb24gKnBvcywgaW50IGJsa19zeiwgaW50IHVzZV9jb21wcmVzc2lvbikKLXsgCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKCF6ZnRfcWljX21vZGUpIHsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlpZiAoemZ0X3RhcGVfYXRfbGJvdChwb3MpKSB7Ci0JCXpmdF9pbml0X3Z0YmwoKTsKLQkJaWYoemZ0X29sZF9mdGFwZSkgewotCQkJLyogY2xlYXIgb2xkIGZ0YXBlJ3MgZW9mIG1hcmtzICovCi0JCQl6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcygpOwotCQkJemZ0X29sZF9mdGFwZSA9IDA7IC8qIG5vIGxvbmdlciBvbGQgZnRhcGUgKi8KLQkJfQotCQl6ZnRfcmVzZXRfcG9zaXRpb24ocG9zKTsKLQl9Ci0JaWYgKHBvcy0+c2VnX3BvcyAhPSB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICsgMSkgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywgCi0JCSAgICAgICJCVUc6IHNlZ19wb3M6ICVkLCB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnOiAlZCIsIAotCQkgICAgICBwb3MtPnNlZ19wb3MsIHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcpOwotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JVFJBQ0UoZnRfdF9ub2lzZSwgImNyZWF0ZSBuZXcgdm9sdW1lIik7Ci0JaWYgKHpmdF9lb21fdnRibC0+Y291bnQgPj0gWkZUX01BWF9WT0xVTUVTKSB7Ci0JCVRSQUNFX0FCT1JUKC1FTk9TUEMsIGZ0X3RfZXJyLAotCQkJICAgICJFcnJvcjogbWF4bWltYWwgbnVtYmVyIG9mIHZvbHVtZXMgZXhoYXVzdGVkICIKLQkJCSAgICAiKG1heG1pbXVtIGlzICVkKSIsIFpGVF9NQVhfVk9MVU1FUyk7Ci0JfQotCXpmdF9uZXdfdnRibF9lbnRyeSgpOwotCXBvcy0+dm9sdW1lX3BvcyA9IHBvcy0+c2VnX2J5dGVfcG9zID0gMDsKLQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgICAgICAgPSBwb3MtPnNlZ19wb3M7Ci0JemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgICAgICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7IC8qIGluZmluaXR5ICovCi0JemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgICAgICAgID0gYmxrX3N6OwotCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICAgICAgICA9IHpmdF9jYXBhY2l0eTsKLQl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lICAgICAgPSAxOwotCXpmdF9sYXN0X3Z0YmwtPnVzZV9jb21wcmVzc2lvbiA9IHVzZV9jb21wcmVzc2lvbjsKLQl6ZnRfbGFzdF92dGJsLT5xaWMxMTMgICAgICAgICAgPSB6ZnRfcWljMTEzOwotCXpmdF9sYXN0X3Z0YmwtPm5ld192b2x1bWUgICAgICA9IDE7Ci0JemZ0X2xhc3RfdnRibC0+b3BlbiAgICAgICAgICAgID0gMTsKLQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOwotCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICBwZXJmb3JtIG10ZnNmLCBtdGJzZiwgbm90IGFsbG93ZWQgd2l0aG91dCB6ZnRfcWljX21vZGUKLSAqLwotaW50IHpmdF9za2lwX3ZvbHVtZXMoaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcykKLXsgCi0JY29uc3QgemZ0X3ZvbGluZm8gKnZ0Ymw7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgImNvdW50OiAlZCIsIGNvdW50KTsKLQkKLQl2dGJsPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKLQl3aGlsZSAoY291bnQgPiAwICYmIHZ0YmwgIT0gemZ0X2VvbV92dGJsKSB7Ci0JCXZ0YmwgPSBsaXN0X2VudHJ5KHZ0YmwtPm5vZGUubmV4dCwgemZ0X3ZvbGluZm8sIG5vZGUpOwotCQljb3VudCAtLTsKLQl9Ci0Jd2hpbGUgKGNvdW50IDwgMCAmJiB2dGJsICE9IHpmdF9maXJzdF92dGJsKSB7Ci0JCXZ0YmwgPSBsaXN0X2VudHJ5KHZ0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpOwotCQljb3VudCArKzsKLQl9Ci0JcG9zLT5zZWdfcG9zICAgICAgICA9IHZ0YmwtPnN0YXJ0X3NlZzsKLQlwb3MtPnNlZ19ieXRlX3BvcyAgID0gMDsKLQlwb3MtPnZvbHVtZV9wb3MgICAgID0gMDsKLQlwb3MtPnRhcGVfcG9zICAgICAgID0gemZ0X2NhbGNfdGFwZV9wb3MocG9zLT5zZWdfcG9zKTsKLQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gdnRibC0+c2l6ZSA9PSAwOwotCWlmICh6ZnRfY21wcl9vcHMpIHsKLQkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOwotCX0KLQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7IC8qIG5vIG5lZWQgdG8ga2VlcCBjYWNoZSAqLwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZXBvc2l0aW9uaW5nIHRvOlxuIgotCSAgICAgIEtFUk5fSU5GTyAiemZ0X3NlZ19wb3MgICAgICAgIDogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInpmdF9zZWdfYnl0ZV9wb3MgICA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJ6ZnRfdGFwZV9wb3MgICAgICAgOiAiIExMX1ggIlxuIgotCSAgICAgIEtFUk5fSU5GTyAiemZ0X3ZvbHVtZV9wb3MgICAgIDogIiBMTF9YICJcbiIKLQkgICAgICBLRVJOX0lORk8gImZpbGUgbnVtYmVyICAgICAgICA6ICVkIiwKLQkgICAgICBwb3MtPnNlZ19wb3MsIHBvcy0+c2VnX2J5dGVfcG9zLCAKLQkgICAgICBMTChwb3MtPnRhcGVfcG9zKSwgTEwocG9zLT52b2x1bWVfcG9zKSwgdnRibC0+Y291bnQpOwotCXpmdF9yZXNpZCA9IGNvdW50IDwgMCA/IC1jb3VudCA6IGNvdW50OwotCVRSQUNFX0VYSVQgemZ0X3Jlc2lkID8gLUVJTlZBTCA6IDA7Ci19Ci0KLS8qIHRoZSBmb2xsb3dpbmcgc2ltcGx5IHJldHVybnMgdGhlIHJhdyBkYXRhIHBvc2l0aW9uIG9mIHRoZSBFT00KLSAqIG1hcmtlciwgTVRJT0NTSVpFIGlvY3RsIAotICovCi1fX3M2NCB6ZnRfZ2V0X2VvbV9wb3Modm9pZCkKLXsKLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCXJldHVybiB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyk7Ci0JfSBlbHNlIHsKLQkJLyogdGhlcmUgaXMgb25seSBvbmUgdm9sdW1lIGluIHJhdyBtb2RlICovCi0JCXJldHVybiB6ZnRfY2FwYWNpdHk7Ci0JfQotfQotCi0vKiBza2lwIHRvIGVvbSwgdXNlZCBmb3IgTVRFT00KLSAqLwotdm9pZCB6ZnRfc2tpcF90b19lb20oemZ0X3Bvc2l0aW9uICpwb3MpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JcG9zLT5zZWdfcG9zICAgICAgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKLQlwb3MtPnNlZ19ieXRlX3BvcyA9IAotCQlwb3MtPnZvbHVtZV9wb3MgICAgID0gCi0JCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOwotCXBvcy0+dGFwZV9wb3MgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJmdGFwZSBwb3NpdGlvbmVkIHRvIHNlZ21lbnQgJWQsIGRhdGEgcG9zICIgTExfWCwgCi0JICAgICAgcG9zLT5zZWdfcG9zLCBMTChwb3MtPnRhcGVfcG9zKSk7Ci0JVFJBQ0VfRVhJVDsKLX0KLQotLyogIHdyaXRlIGFuIEVPRi1tYXJrZXIgYnkgc2V0dGluZyB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnIHRvIHNlZ19wb3MuCi0gKiAgTk9URTogdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgemZ0X2xhc3RfdnRibCBwb2ludHMgdG8gYSB2YWxpZAotICogIHZ0YmwgZW50cnkKLSAqCi0gKiAgTk9URTogdGhpcyByb3V0aW5lIGFsd2F5cyBwb3NpdGlvbnMgYmVmb3JlIHRoZSBFT0YgbWFya2VyCi0gKi8KLWludCB6ZnRfY2xvc2Vfdm9sdW1lKHpmdF9wb3NpdGlvbiAqcG9zKQotewotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0KLQlpZiAoemZ0X3Z0YmxfZW1wdHkgfHwgIXpmdF9sYXN0X3Z0YmwtPm9wZW4pIHsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIlRoZXJlIGFyZSBubyB2b2x1bWVzIHRvIGZpbmlzaCIpOwotCQlUUkFDRV9FWElUIC1FSU87Ci0JfQotCWlmIChwb3MtPnNlZ19ieXRlX3BvcyA9PSAwICYmIAotCSAgICBwb3MtPnNlZ19wb3MgIT0gemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKSB7Ci0JCXBvcy0+c2VnX3BvcyAtLTsKLQkJcG9zLT5zZWdfYnl0ZV9wb3MgICAgICA9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7Ci0JfQotCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IHBvcy0+c2VnX3BvczsKLQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgPSBwb3MtPnZvbHVtZV9wb3M7Ci0JemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gMTsKLQl6ZnRfanVzdF9iZWZvcmVfZW9mICAgICAgPSAxOwotCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgKyAxOwotCXpmdF9sYXN0X3Z0YmwtPm9wZW4gICAgICA9IDA7IC8qIGNsb3NlZCAqLwotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogd3JpdGUgY291bnQgZmlsZS1tYXJrcyBhdCBjdXJyZW50IHBvc2l0aW9uLiAKLSAqCi0gKiAgVGhlIHRhcGUgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgZW9mLW1hcmtlciwgdGhhdCBpcyBhdCBieXRlIDAgb2YKLSAqICB0aGUgc2VnbWVudCBmb2xsb3dpbmcgdGhlIGVvZi1tYXJrZXIKLSAqCi0gKiAgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGFsbG93ZWQgaW4gemZ0X3FpY19tb2RlCi0gKgotICogIE9ubHkgYWxsb3dlZCB3aGVuIHRhcGUgaXMgYXQgQk9UIG9yIEVPRC4KLSAqLwotaW50IHpmdF93ZW9mKHVuc2lnbmVkIGludCBjb3VudCwgemZ0X3Bvc2l0aW9uICpwb3MpCi17Ci0JCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoIWNvdW50KSB7IC8qIHdyaXRlIHplcm8gRU9GIG1hcmtzIHNob3VsZCBiZSBhIHJlYWwgbm8tb3AgKi8KLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOwotCWlmICh6ZnRfdGFwZV9hdF9sYm90KHBvcykpIHsKLQkJemZ0X2luaXRfdnRibCgpOwotCQlpZih6ZnRfb2xkX2Z0YXBlKSB7Ci0JCQkvKiBjbGVhciBvbGQgZnRhcGUncyBlb2YgbWFya3MgKi8KLQkJCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7Ci0JCQl6ZnRfb2xkX2Z0YXBlID0gMDsgICAgLyogbm8gbG9uZ2VyIG9sZCBmdGFwZSAqLwotCQl9Ci0JfQotCWlmICh6ZnRfbGFzdF92dGJsLT5vcGVuKSB7Ci0JCXpmdF9jbG9zZV92b2x1bWUocG9zKTsKLQkJemZ0X21vdmVfcGFzdF9lb2YocG9zKTsKLQkJY291bnQgLS07Ci0JfQotCS8qIG5vdyBpdCdzIGVhc3ksIGp1c3QgYXBwZW5kIGVvZi1tYXJrcywgdGhhdCBpcyBlbXB0eQotCSAqIHZvbHVtZXMsIHRvIHRoZSBlbmQgb2YgdGhlIGFscmVhZHkgcmVjb3JkZWQgbWVkaWEuCi0JICovCi0Jd2hpbGUgKGNvdW50ID4gMCAmJiAKLQkgICAgICAgcG9zLT5zZWdfcG9zIDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICYmIAotCSAgICAgICB6ZnRfZW9tX3Z0YmwtPmNvdW50IDwgWkZUX01BWF9WT0xVTUVTKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCSAgICAgICJXcml0aW5nIHplcm8gc2l6ZWQgZmlsZSBhdCBzZWdtZW50ICVkIiwgcG9zLT5zZWdfcG9zKTsKLQkJemZ0X25ld192dGJsX2VudHJ5KCk7Ci0JCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyAgICAgICA9IHBvcy0+c2VnX3BvczsKLQkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgICAgICAgID0gcG9zLT5zZWdfcG9zOwotCQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgICAgICAgPSAwOwotCQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgICAgICAgPSB6ZnRfYmxrX3N6OwotCQl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lICAgICAgPSAxOwotCQl6ZnRfbGFzdF92dGJsLT51c2VfY29tcHJlc3Npb24gPSAwOwotCQlwb3MtPnRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7Ci0JCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnID0gKysgcG9zLT5zZWdfcG9zOwotCQljb3VudCAtLTsKLQl9IAotCWlmIChjb3VudCA+IDApIHsKLQkJLyogIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczogZW5kIG9mIHRhcGUsIG9yIHRoZQotCQkgKiAgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgaXMgZXhoYXVzdGVkLgotCQkgKi8KLQkJemZ0X3Jlc2lkID0gY291bnQ7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsIk51bWJlciBvZiBtYXJrcyBOT1Qgd3JpdHRlbjogJWQiLCB6ZnRfcmVzaWQpOwotCQlpZiAoemZ0X2VvbV92dGJsLT5jb3VudCA9PSBaRlRfTUFYX1ZPTFVNRVMpIHsKLQkJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3Rfd2FybiwKLQkJCQkgICAgIm1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgZmlsZXMgIgotCQkJCSAgICAiZXhoYXVzdGVkOiAlZCIsIFpGVF9NQVhfVk9MVU1FUyk7Ci0JCX0gZWxzZSB7Ci0JCQlUUkFDRV9BQk9SVCgtRU5PU1BDLAotCQkJCSAgICBmdF90X25vaXNlLCAicmVhY2hlZCBlbmQgb2YgdGFwZSIpOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotY29uc3QgemZ0X3ZvbGluZm8gKnpmdF9maW5kX3ZvbHVtZSh1bnNpZ25lZCBpbnQgc2VnX3BvcykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlUUkFDRShmdF90X2FueSwgImNhbGxlZCB3aXRoIHNlZ19wb3MgJWQiLHNlZ19wb3MpOwotCWlmICghemZ0X3FpY19tb2RlKSB7Ci0JCWlmIChzZWdfcG9zID4gZnRfbGFzdF9kYXRhX3NlZ21lbnQpIHsKLQkJCVRSQUNFX0VYSVQgJmVvdF92dGJsOwotCQl9Ci0JCXRhcGVfdnRibC5ibGtfc3ogPSAgemZ0X2Jsa19zejsKLQkJVFJBQ0VfRVhJVCAmdGFwZV92dGJsOwotCX0KLQlpZiAoc2VnX3BvcyA8IHpmdF9maXJzdF92dGJsLT5zdGFydF9zZWcpIHsKLQkJVFJBQ0VfRVhJVCAoY3VyX3Z0YmwgPSB6ZnRfZmlyc3RfdnRibCk7Ci0JfQotCXdoaWxlIChzZWdfcG9zID4gY3VyX3Z0YmwtPmVuZF9zZWcpIHsKLQkJY3VyX3Z0YmwgPSBsaXN0X2VudHJ5KGN1cl92dGJsLT5ub2RlLm5leHQsIHpmdF92b2xpbmZvLCBub2RlKTsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIiVkIC0gJWQiLCBjdXJfdnRibC0+c3RhcnRfc2VnLCBjdXJfdnRibC0+ZW5kX3NlZyk7Ci0JfQotCXdoaWxlIChzZWdfcG9zIDwgY3VyX3Z0YmwtPnN0YXJ0X3NlZykgewotCQljdXJfdnRibCA9IGxpc3RfZW50cnkoY3VyX3Z0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpOwotCQlUUkFDRShmdF90X25vaXNlLCAiJWQgLSAlZCIsIGN1cl92dGJsLT5zdGFydF9zZWcsIGN1cl92dGJsLT5lbmRfc2VnKTsKLQl9Ci0JaWYgKHNlZ19wb3MgPiBjdXJfdnRibC0+ZW5kX3NlZyB8fCBzZWdfcG9zIDwgY3VyX3Z0YmwtPnN0YXJ0X3NlZykgewotCQlUUkFDRShmdF90X2J1ZywgIlRoaXMgY2Fubm90IGhhcHBlbiIpOwotCX0KLQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIiIsIGN1cl92dGJsKTsKLQlUUkFDRV9FWElUIGN1cl92dGJsOwotfQotCi0vKiB0aGlzIGZ1bmN0aW9uIHJlYWxseSBhc3N1bWVzIHRoYXQgd2UgYXJlIGp1c3QgYmVmb3JlIGVvZgotICovCi12b2lkIHpmdF9tb3ZlX3Bhc3RfZW9mKHpmdF9wb3NpdGlvbiAqcG9zKQoteyAKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJvbGQgc2VnLiBwb3M6ICVkIiwgcG9zLT5zZWdfcG9zKTsKLQlwb3MtPnRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3BvcysrKSAtIHBvcy0+c2VnX2J5dGVfcG9zOwotCXBvcy0+c2VnX2J5dGVfcG9zID0gMDsKLQlwb3MtPnZvbHVtZV9wb3MgICA9IDA7Ci0JaWYgKHpmdF9jbXByX29wcykgewotCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7Ci0JfQotCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAgMDsKLQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7IC8qIG5vIG5lZWQgdG8gY2FjaGUgaXQgYW55bW9yZSAqLwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJuZXcgc2VnLiBwb3M6ICVkIiwgcG9zLT5zZWdfcG9zKTsKLQlUUkFDRV9FWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzFkMTk2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0jaWZuZGVmIF9aRlRBUEVfVlRCTF9ICi0jZGVmaW5lIF9aRlRBUEVfVlRCTF9ICi0KLS8qCi0gKiAgICAgIENvcHlyaWdodCAoYykgMTk5NS0xOTk3ICBDbGF1cy1KdXN0dXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5oLHYgJAotICogJFJldmlzaW9uOiAxLjMgJAotICogJERhdGU6IDE5OTcvMTAvMjggMTQ6MzA6MDkgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSB2b2x1bWUgdGFibGUgYXMgZGVmaW5lZCBpbiB0aGUgUUlDLTgwCi0gKiAgICAgIGRldmVsb3BtZW50IHN0YW5kYXJkcy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLQotI2RlZmluZSBWVEJMX1NJWkUgMTI4IC8qIGJ5dGVzICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG9mZnNldHMgaW4gdGhlIHZ0YmwuICAqLwotI2RlZmluZSBWVEJMX1NJRyAgIDAKLSNkZWZpbmUgVlRCTF9TVEFSVCA0Ci0jZGVmaW5lIFZUQkxfRU5EICAgNgotI2RlZmluZSBWVEJMX0RFU0MgIDgKLSNkZWZpbmUgVlRCTF9EQVRFICA1MgotI2RlZmluZSBWVEJMX0ZMQUdTIDU2Ci0jZGVmaW5lIFZUQkxfRkxfVkVORE9SX1NQRUNJRklDICgxPDwwKQotI2RlZmluZSBWVEJMX0ZMX01VVExJX0NBUlRSSURHRSAoMTw8MSkKLSNkZWZpbmUgVlRCTF9GTF9OT1RfVkVSSUZJRUQgICAgKDE8PDIpCi0jZGVmaW5lIFZUQkxfRkxfUkVESVJfSU5ISUJJVCAgICgxPDwzKQotI2RlZmluZSBWVEJMX0ZMX1NFR19TUEFOTklORyAgICAoMTw8NCkKLSNkZWZpbmUgVlRCTF9GTF9ESVJFQ1RPUllfTEFTVCAgKDE8PDUpCi0jZGVmaW5lIFZUQkxfRkxfUkVTRVJWRURfNiAgICAgICgxPDw2KQotI2RlZmluZSBWVEJMX0ZMX1JFU0VSVkVEXzcgICAgICAoMTw8NykKLSNkZWZpbmUgVlRCTF9NX05PICA1NwotI2RlZmluZSBWVEJMX0VYVCAgIDU4Ci0jZGVmaW5lIEVYVF9aRlRBUEVfU0lHICAgICAwCi0jZGVmaW5lIEVYVF9aRlRBUEVfQkxLU1ogIDEwCi0jZGVmaW5lIEVYVF9aRlRBUEVfQ01BUCAgIDEyCi0jZGVmaW5lIEVYVF9aRlRBUEVfUUlDMTEzIDEzCi0jZGVmaW5lIFZUQkxfUFdEICAgODQKLSNkZWZpbmUgVlRCTF9ESVJfU0laRSA5MgotI2RlZmluZSBWVEJMX0RBVEFfU0laRSA5NgotI2RlZmluZSBWVEJMX09TX1ZFUlNJT04gMTA0Ci0jZGVmaW5lIFZUQkxfU1JDX0RSSVZFICAxMDYKLSNkZWZpbmUgVlRCTF9ERVYgICAgICAgIDEyMgotI2RlZmluZSBWVEJMX1JFU0VSVkVEXzEgMTIzCi0jZGVmaW5lIFZUQkxfQ01QUiAgICAgICAxMjQKLSNkZWZpbmUgVlRCTF9DTVBSX1VOUkVHIDB4M2YKLSNkZWZpbmUgVlRCTF9DTVBSX1VTRUQgIDB4ODAKLSNkZWZpbmUgVlRCTF9GTVQgICAgICAgIDEyNQotI2RlZmluZSBWVEJMX1JFU0VSVkVEXzIgMTI2Ci0jZGVmaW5lIFZUQkxfUkVTRVJWRURfMyAxMjcKLS8qIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUgcmV2aXNpb24gSyAqLwotI2RlZmluZSBWVEJMX0tfQ01QUiAgICAgMTIwIAotCi0vKiAgdGhlIG5leHQgaXMgdXNlZCBieSBRSUMtMzAyMCB0YXBlcyB3aXRoIGZvcm1hdCBjb2RlIDYgKD4yXjE2Ci0gKiAgc2VnbWVudHMpIEl0IGlzIHNwZWNpZmllZCBpbiBRSUMtMTEzLCBSZXYuIEcsIFNlY3Rpb24gNSAoU0NTSQotICogIHZvbHVtZSB0YWJsZSkuIFRoZSBkaWZmZXJlbmNlIGlzIHNpbXBseSwgdGhhdCB3ZSBvbmx5IHN0b3JlIHRoZQotICogIG51bWJlciBvZiBzZWdtZW50cyB1c2VkLCBub3QgdGhlIHN0YXJ0aW5nIHNlZ21lbnQuCi0gKi8KLSNkZWZpbmUgVlRCTF9TQ1NJX1NFR1MgIDQgLyogaXMgYSA0IGJ5dGUgdmFsdWUgKi8KLQotLyogIG9uZSB2dGJsIGlzIDEyOCBieXRlcywgdGhhdCByZXN1bHRzIGluIGEgbWF4aW11bSBudW1iZXIgb2YKLSAqICAyOSoxMDI0LzEyOCA9IDIzMiB2b2x1bWVzLgotICovCi0jZGVmaW5lIFpGVF9NQVhfVk9MVU1FUyAoRlRfU0VHTUVOVF9TSVpFL1ZUQkxfU0laRSkKLSNkZWZpbmUgVlRCTF9JRCAgIlZUQkwiCi0jZGVmaW5lIFZUQkxfSURTIHsgVlRCTF9JRCwgIlhUQkwiLCAiVVRJRCIsICJFWFZUIiB9IC8qIG90aGVyIHZhbGlkIGlkcyAqLwotI2RlZmluZSBaRlRfVk9MX05BTUUgInpmdGFwZSB2b2x1bWUiIC8qIHZvbHVtZSBsYWJlbCB1c2VkIGJ5IG1lICovCi0jZGVmaW5lIFpGVEFQRV9TSUcgIkxJTlVYIFpGVCIKLQotLyogIGdsb2JhbCB2YXJpYWJsZXMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgemZ0X2ludGVybmFsX3Z0YmwKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci0JaW50ICAgICAgICAgIGNvdW50OwotCXVuc2lnbmVkIGludCBzdGFydF9zZWc7ICAgICAgICAgLyogMzIgYml0cyBhcmUgZW5vdWdoIGZvciBub3cgKi8KLQl1bnNpZ25lZCBpbnQgZW5kX3NlZzsgICAgICAgICAgIC8qIDMyIGJpdHMgYXJlIGVub3VnaCBmb3Igbm93ICovCi0JX19zNjQgICAgICAgIHNpemU7ICAgICAgICAgICAgICAvKiB1bmNvbXByZXNzZWQgc2l6ZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgYmxrX3N6OyAgICAgICAgICAgIC8qIGJsb2NrIHNpemUgZm9yIHRoaXMgdm9sdW1lICovCi0JdW5zaWduZWQgaW50IHpmdF92b2x1bWUgICAgIDoxOyAvKiB6ZnRhcGUgY3JlYXRlZCB0aGlzIHZvbHVtZSAqLwotCXVuc2lnbmVkIGludCB1c2VfY29tcHJlc3Npb246MTsgLyogY29tcHJlc3NlZCB2b2x1bWUgICovCi0JdW5zaWduZWQgaW50IHFpYzExMyAgICAgICAgIDoxOyAvKiBsYXlvdXQgb2YgY29tcHJlc3NlZCBibG9jawotCQkJCQkgKiBpbmZvIGFuZCB2dGJsIGNvbmZvcm1zIHRvCi0JCQkJCSAqIFFJQy0xMTMsIFJldi4gRyAKLQkJCQkJICovCi0JdW5zaWduZWQgaW50IG5ld192b2x1bWUgICAgIDoxOyAvKiBpdCB3YXMgY3JlYXRlZCBieSB1cywgdGhpcwotCQkJCQkgKiBydW4uICB0aGlzIGFsbG93cyB0aGUKLQkJCQkJICogZmllbGRzIHRoYXQgYXJlbid0IHJlYWxseQotCQkJCQkgKiB1c2VkIGJ5IHpmdGFwZSB0byBiZSBmaWxsZWQKLQkJCQkJICogaW4gYnkgc29tZSB1c2VyIGxldmVsCi0JCQkJCSAqIHByb2dyYW0uCi0JCQkJCSAqLwotCXVuc2lnbmVkIGludCBvcGVuICAgICAgICAgICA6MTsgLyoganVzdCBpbiBwcm9ncmVzcyBvZiBiZWluZyAKLQkJCQkJICogd3JpdHRlbgotCQkJCQkgKi8KLX0gemZ0X3ZvbGluZm87Ci0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHpmdF92dGJsOwotI2RlZmluZSB6ZnRfaGVhZF92dGJsICBsaXN0X2VudHJ5KHpmdF92dGJsLm5leHQsIHpmdF92b2xpbmZvLCBub2RlKQotI2RlZmluZSB6ZnRfZW9tX3Z0YmwgICBsaXN0X2VudHJ5KHpmdF92dGJsLnByZXYsIHpmdF92b2xpbmZvLCBub2RlKQotI2RlZmluZSB6ZnRfbGFzdF92dGJsICBsaXN0X2VudHJ5KHpmdF9lb21fdnRibC0+bm9kZS5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSkKLSNkZWZpbmUgemZ0X2ZpcnN0X3Z0YmwgbGlzdF9lbnRyeSh6ZnRfaGVhZF92dGJsLT5ub2RlLm5leHQsIHpmdF92b2xpbmZvLCBub2RlKQotI2RlZmluZSB6ZnRfdnRibF9lbXB0eSAoemZ0X2VvbV92dGJsLT5ub2RlLnByZXYgPT0gJnpmdF9oZWFkX3Z0YmwtPm5vZGUpCi0KLSNkZWZpbmUgRFVNUF9WT0xJTkZPKGxldmVsLCBkZXNjLCBpbmZvKQkJCQkJXAotewkJCQkJCQkJCVwKLQljaGFyIHRtcFsyMV07CQkJCQkJCVwKLQlzdHJsY3B5KHRtcCwgZGVzYywgc2l6ZW9mKHRtcCkpOwkJCQlcCi0JVFJBQ0UobGV2ZWwsICJWb2x1bWUgJWQ6XG4iCQkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJkZXNjcmlwdGlvbiAgOiAlc1xuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJmaXJzdCBzZWdtZW50OiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJsYXN0ICBzZWdtZW50OiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJzaXplICAgICAgICAgOiAiIExMX1ggIlxuIgkJCVwKLQkgICAgICBLRVJOX0lORk8gImJsb2NrIHNpemUgICA6ICVkXG4iCQkJCVwKLQkgICAgICBLRVJOX0lORk8gImNvbXByZXNzaW9uICA6ICVkXG4iCQkJCVwKLQkgICAgICBLRVJOX0lORk8gInpmdGFwZSB2b2x1bWU6ICVkXG4iCQkJCVwKLQkgICAgICBLRVJOX0lORk8gIlFJQy0xMTMgY29uZi46ICVkIiwJCQkJXAotCSAgICAgIChpbmZvKS0+Y291bnQsIHRtcCwgKGluZm8pLT5zdGFydF9zZWcsIChpbmZvKS0+ZW5kX3NlZywJXAotCSAgICAgIExMKChpbmZvKS0+c2l6ZSksIChpbmZvKS0+YmxrX3N6LAkJCQlcCi0JICAgICAgKGluZm8pLT51c2VfY29tcHJlc3Npb24gIT0gMCwgKGluZm8pLT56ZnRfdm9sdW1lICE9IDAsCVwKLQkgICAgICAoaW5mbyktPnFpYzExMyAhPSAwKTsJCQkJCVwKLX0KLQotZXh0ZXJuIGludCB6ZnRfcWljX21vZGU7Ci1leHRlcm4gaW50IHpmdF9vbGRfZnRhcGU7Ci1leHRlcm4gaW50IHpmdF92b2x1bWVfdGFibGVfY2hhbmdlZDsKLQotLyogZXhwb3J0ZWQgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCAgemZ0X2luaXRfdnRibCAgICAgICAgICAgICAodm9pZCk7Ci1leHRlcm4gdm9pZCAgemZ0X2ZyZWVfdnRibCAgICAgICAgICAgICAodm9pZCk7Ci1leHRlcm4gaW50ICAgemZ0X2V4dHJhY3Rfdm9sdW1lX2hlYWRlcnMoX191OCAqYnVmZmVyKTsKLWV4dGVybiBpbnQgICB6ZnRfdXBkYXRlX3ZvbHVtZV90YWJsZSAgICh1bnNpZ25lZCBpbnQgc2VnbWVudCk7Ci1leHRlcm4gaW50ICAgemZ0X29wZW5fdm9sdW1lICAgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MsCi0JCQkJCWludCBibGtfc3osIGludCB1c2VfY29tcHJlc3Npb24pOwotZXh0ZXJuIGludCAgIHpmdF9jbG9zZV92b2x1bWUgICAgICAgICAgKHpmdF9wb3NpdGlvbiAqcG9zKTsKLWV4dGVybiBjb25zdCB6ZnRfdm9saW5mbyAqemZ0X2ZpbmRfdm9sdW1lKHVuc2lnbmVkIGludCBzZWdfcG9zKTsKLWV4dGVybiBpbnQgICB6ZnRfc2tpcF92b2x1bWVzICAgICAgICAgIChpbnQgY291bnQsIHpmdF9wb3NpdGlvbiAqcG9zKTsKLWV4dGVybiBfX3M2NCB6ZnRfZ2V0X2VvbV9wb3MgICAgICAgICAgICh2b2lkKTsKLWV4dGVybiB2b2lkICB6ZnRfc2tpcF90b19lb20gICAgICAgICAgICh6ZnRfcG9zaXRpb24gKnBvcyk7Ci1leHRlcm4gaW50ICAgemZ0X2Zha2Vfdm9sdW1lX2hlYWRlcnMgICAoZW9mX21hcmtfdW5pb24gKmVvZl9tYXAsIAotCQkJCQlpbnQgbnVtX2ZhaWxlZF9zZWN0b3JzKTsKLWV4dGVybiBpbnQgICB6ZnRfd2VvZiAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQgY291bnQsIHpmdF9wb3NpdGlvbiAqcG9zKTsKLWV4dGVybiB2b2lkICB6ZnRfbW92ZV9wYXN0X2VvZiAgICAgICAgICh6ZnRfcG9zaXRpb24gKnBvcyk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50ICAgemZ0X3RhcGVfYXRfZW9kICAgICAgICAgKGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKTsKLXN0YXRpYyBpbmxpbmUgaW50ICAgemZ0X3RhcGVfYXRfbGJvdCAgICAgICAgKGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCAgemZ0X3Bvc2l0aW9uX2JlZm9yZV9lb2YgKHpmdF9wb3NpdGlvbiAqcG9zLCAKLQkJCQkJICAgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKLXN0YXRpYyBpbmxpbmUgX19zNjQgemZ0X2NoZWNrX2Zvcl9lb2YoY29uc3QgemZ0X3ZvbGluZm8gKnZ0YmwsCi0JCQkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpOwotCi0vKiB0aGlzIGZ1bmN0aW9uIGRlY3JlbWVudHMgdGhlIHpmdF9zZWdfcG9zIGNvdW50ZXIgaWYgd2UgYXJlIHJpZ2h0Ci0gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2VnbWVudC4gVGhpcyBpcyB0byBoYW5kbGUgZnNmbS9ic2ZtIC0tIHdlCi0gKiBuZWVkIHRvIHBvc2l0aW9uIGJlZm9yZSB0aGUgZW9mIG1hcmsuICBOT1RFOiB6ZnRfdGFwZV9wb3MgaXMgbm90Ci0gKiBjaGFuZ2VkIAotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgemZ0X3Bvc2l0aW9uX2JlZm9yZV9lb2YoemZ0X3Bvc2l0aW9uICpwb3MsIAotCQkJCQkgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoteyAKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmIChwb3MtPnNlZ19wb3MgPT0gdm9sdW1lLT5lbmRfc2VnICsgMSAmJiAgcG9zLT5zZWdfYnl0ZV9wb3MgPT0gMCkgewotCQlwb3MtPnNlZ19wb3MgLS07Ci0JCXBvcy0+c2VnX2J5dGVfcG9zID0gemZ0X2dldF9zZWdfc3oocG9zLT5zZWdfcG9zKTsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotLyogIE1tbWguIElzIHRoZSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZvbHVtZSwgdGhhdCBpcyByaWdodAotICogIGJlZm9yZSB0aGUgbGFzdCBFT0YgbWFyayBhbHNvIGxvZ2ljYWwgYW4gRU9EIGNvbmRpdGlvbj8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgemZ0X3RhcGVfYXRfZW9kKGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKQoteyAKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKHpmdF9xaWNfbW9kZSkgewotCQlUUkFDRV9FWElUIChwb3MtPnNlZ19wb3MgPj0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgfHwKLQkJCSAgICB6ZnRfbGFzdF92dGJsLT5vcGVuKTsKLQl9IGVsc2UgewotCQlUUkFDRV9FWElUIHBvcy0+c2VnX3BvcyA+IGZ0X2xhc3RfZGF0YV9zZWdtZW50OwotCX0KLX0KLQotc3RhdGljIGlubGluZSBpbnQgemZ0X3RhcGVfYXRfbGJvdChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKLXsKLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCXJldHVybiAocG9zLT5zZWdfcG9zIDw9IHpmdF9maXJzdF92dGJsLT5zdGFydF9zZWcgJiYKLQkJCXBvcy0+dm9sdW1lX3BvcyA9PSAwKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKHBvcy0+c2VnX3BvcyA8PSBmdF9maXJzdF9kYXRhX3NlZ21lbnQgJiYgCi0JCQlwb3MtPnZvbHVtZV9wb3MgPT0gMCk7Ci0JfQotfQotCi0vKiBUaGlzIG9uZSBjaGVja3MgZm9yIEVPRi4gIHJldHVybiByZW1haW5nIHNwYWNlIChtYXkgYmUgbmVnYXRpdmUpIAotICovCi1zdGF0aWMgaW5saW5lIF9fczY0IHpmdF9jaGVja19mb3JfZW9mKGNvbnN0IHpmdF92b2xpbmZvICp2dGJsLAotCQkJCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKQoteyAgICAgCi0JcmV0dXJuIChfX3M2NCkodnRibC0+c2l6ZSAtIHBvcy0+dm9sdW1lX3Bvcyk7Ci19Ci0KLSNlbmRpZiAvKiBfWkZUQVBFX1ZUQkxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzI3YjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jLHYgJAotICogJFJldmlzaW9uOiAxLjMgJAotICogJERhdGU6IDE5OTcvMTEvMDYgMDA6NTA6MjkgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB3cml0aW5nIGNvZGUKLSAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgotCi0vKiAgICAgIEdsb2JhbCB2YXJzLgotICovCi0KLS8qICAgICAgTG9jYWwgdmFycy4KLSAqLwotc3RhdGljIGludCBsYXN0X3dyaXRlX2ZhaWxlZDsKLXN0YXRpYyBpbnQgbmVlZF9mbHVzaDsKLQotdm9pZCB6ZnRfcHJldmVudF9mbHVzaCh2b2lkKQotewotCW5lZWRfZmx1c2ggPSAwOwotfQotCi1zdGF0aWMgaW50IHpmdF93cml0ZV9oZWFkZXJfc2VnbWVudHMoX191OCogYnVmZmVyKQotewotCWludCBoZWFkZXJfMV9vayA9IDA7Ci0JaW50IGhlYWRlcl8yX29rID0gMDsKLQl1bnNpZ25lZCBpbnQgdGltZV9zdGFtcDsKLQlUUkFDRV9GVU4oZnRfdF9ub2lzZSk7Ci0JCi0JVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKLQlmdGFwZV9zZWVrX3RvX2JvdCgpOyAgICAvKiBwcmV2ZW50cyBleHRyYSByZXdpbmQgKi8KLQlpZiAoR0VUNChidWZmZXIsIDApICE9IEZUX0hTRUdfTUFHSUMpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkgICAgIndyb25nIGhlYWRlciBzaWduYXR1cmUgZm91bmQsIGFib3J0aW5nIik7Ci0JfSAKLQkvKiAgIEJlIG9wdGltaXN0aWM6ICovCi0JUFVUNChidWZmZXIsIEZUX1NFR19DTlQsCi0JICAgICB6ZnRfd3JpdHRlbl9zZWdtZW50cyArIEdFVDQoYnVmZmVyLCBGVF9TRUdfQ05UKSArIDIpOwotCWlmICgodGltZV9zdGFtcCA9IHpmdF9nZXRfdGltZSgpKSAhPSAwKSB7Ci0JCVBVVDQoYnVmZmVyLCBGVF9XUl9EQVRFLCB0aW1lX3N0YW1wKTsKLQkJaWYgKHpmdF9sYWJlbF9jaGFuZ2VkKSB7Ci0JCQlQVVQ0KGJ1ZmZlciwgRlRfTEFCRUxfREFURSwgdGltZV9zdGFtcCk7Ci0JCX0KLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwKLQkgICAgICAid3JpdGluZyBmaXJzdCBoZWFkZXIgc2VnbWVudCAlZCIsIGZ0X2hlYWRlcl9zZWdtZW50XzEpOwotCWhlYWRlcl8xX29rID0gemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhmdF9oZWFkZXJfc2VnbWVudF8xLCAKLQkJCQkJCWJ1ZmZlciwgRlRfU0VHTUVOVF9TSVpFLAotCQkJCQkJemZ0X2RlYmxvY2tfYnVmKSA+PSAwOwotCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JICAgICAgIndyaXRpbmcgc2Vjb25kIGhlYWRlciBzZWdtZW50ICVkIiwgZnRfaGVhZGVyX3NlZ21lbnRfMik7Ci0JaGVhZGVyXzJfb2sgPSB6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKGZ0X2hlYWRlcl9zZWdtZW50XzIsIAotCQkJCQkJYnVmZmVyLCBGVF9TRUdNRU5UX1NJWkUsCi0JCQkJCQl6ZnRfZGVibG9ja19idWYpID49IDA7Ci0JaWYgKCFoZWFkZXJfMV9vaykgewotCQlUUkFDRShmdF90X3dhcm4sICJXYXJuaW5nOiAiCi0JCSAgICAgICJ1cGRhdGUgb2YgZmlyc3QgaGVhZGVyIHNlZ21lbnQgZmFpbGVkIik7Ci0JfQotCWlmICghaGVhZGVyXzJfb2spIHsKLQkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzogIgotCQkgICAgICAidXBkYXRlIG9mIHNlY29uZCBoZWFkZXIgc2VnbWVudCBmYWlsZWQiKTsKLQl9Ci0JaWYgKCFoZWFkZXJfMV9vayAmJiAhaGVhZGVyXzJfb2spIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJFcnJvcjogIgotCQkgICAgICAidXBkYXRlIG9mIGJvdGggaGVhZGVyIHNlZ21lbnRzIGZhaWxlZC4iKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1pbnQgemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHModm9pZCkKLXsKLQlUUkFDRV9GVU4oZnRfdF9ub2lzZSk7Ci0JCi0JLyogIG11c3QgTk9UIHVzZSB6ZnRfd3JpdGVfcHJvdGVjdGVkLCBhcyBpdCBhbHNvIGluY2x1ZGVzIHRoZQotCSAqICBmaWxlIGFjY2VzcyBtb2RlLiBCdXQgd2UgYWxzbyB3YW50IHRvIHVwZGF0ZSB3aGVuIHNvZnQKLQkgKiAgd3JpdGUgcHJvdGVjdGlvbiBpcyBlbmFibGVkIChPX1JET05MWSkKLQkgKi8KLQlpZiAoZnRfd3JpdGVfcHJvdGVjdGVkIHx8IHpmdF9vbGRfZnRhcGUpIHsKLQkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIlRhcGUgc2V0IHJlYWQtb25seTogbm8gdXBkYXRlIik7Ci0JfSAKLQlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgewotCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiTm90aGluZyB0byB1cGRhdGUiKTsKLQl9Ci0JaWYgKCF6ZnRfaGVhZGVyX2NoYW5nZWQpIHsKLQkJemZ0X2hlYWRlcl9jaGFuZ2VkID0gemZ0X3dyaXR0ZW5fc2VnbWVudHMgPiAwOwotCX0KLQlpZiAoIXpmdF9oZWFkZXJfY2hhbmdlZCAmJiAhemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJOb3RoaW5nIHRvIHVwZGF0ZSIpOwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAiVXBkYXRpbmcgaGVhZGVyIHNlZ21lbnRzIik7Ci0JaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlID09IHdyaXRpbmcpIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7Ci0JfQotCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7Ci0JCi0JemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOyAvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZSAqLwotCWlmICh6ZnRfaGVhZGVyX2NoYW5nZWQpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X3dyaXRlX2hlYWRlcl9zZWdtZW50cyh6ZnRfaHNlZ19idWYpLCk7Ci0JfQotCWlmICh6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUoZnRfZmlyc3RfZGF0YV9zZWdtZW50KSwpOwotCX0KLQl6ZnRfaGVhZGVyX2NoYW5nZWQgPQotCQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAKLQkJemZ0X2xhYmVsX2NoYW5nZWQgICAgICAgID0KLQkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgICAgID0gMDsKLQlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOwotCWZ0YXBlX3NlZWtfdG9fYm90KCk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IHJlYWRfbWVyZ2VfYnVmZmVyKGludCBzZWdfcG9zLCBfX3U4ICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzZWdfc3opCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JY29uc3QgZnRfdHJhY2VfdCBvbGRfdHJhY2luZyA9IFRSQUNFX0xFVkVMOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmICh6ZnRfcWljX21vZGUpIHsKLQkJLyogIHdyaXRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIHZvbHVtZSBpcyBOT1QgYWxsb3dlZAotCQkgKgotCQkgKi8KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIk5vIG5lZWQgdG8gcmVhZCBhIHNlZ21lbnQiKTsKLQkJbWVtc2V0KGJ1ZmZlciArIG9mZnNldCwgMCwgc2VnX3N6IC0gb2Zmc2V0KTsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlUUkFDRShmdF90X2FueSwgIndhaXRpbmciKTsKLQlmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKTsKLQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKLQkKLQlUUkFDRShmdF90X25vaXNlLCAidHJ5aW5nIHRvIHJlYWQgc2VnbWVudCAlZCBmcm9tIG9mZnNldCAlZCIsCi0JICAgICAgc2VnX3Bvcywgb2Zmc2V0KTsKLQlTRVRfVFJBQ0VfTEVWRUwoZnRfdF9idWcpOwotCXJlc3VsdCA9IHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKHNlZ19wb3MsIGJ1ZmZlciwgCi0JCQkJCSAgICBGVF9SRF9TSU5HTEUsCi0JCQkJCSAgICBvZmZzZXQsIHNlZ19zeiAtIG9mZnNldCk7Ci0JU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKLQlpZiAocmVzdWx0ICE9IChzZWdfc3ogLSBvZmZzZXQpKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJJZ25vcmUgZXJyb3I6IHJlYWRfc2VnbWVudCgpIHJlc3VsdDogJWQiLAotCQkgICAgICByZXN1bHQpOwotCQltZW1zZXQoYnVmZmVyICsgb2Zmc2V0LCAwLCBzZWdfc3ogLSBvZmZzZXQpOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qIGZsdXNoIHRoZSB3cml0ZSBidWZmZXIgdG8gdGFwZSBhbmQgd3JpdGUgYW4gZW9mLW1hcmtlciBhdCB0aGUKLSAqIGN1cnJlbnQgcG9zaXRpb24gaWYgbm90IGluIHJhdyBtb2RlLiAgVGhpcyBmdW5jdGlvbiBhbHdheXMKLSAqIHBvc2l0aW9ucyB0aGUgdGFwZSBiZWZvcmUgdGhlIGVvZi1tYXJrZXIuICBfZnRhcGVfY2xvc2UoKSBzaG91bGQKLSAqIHRoZW4gYWR2YW5jZSB0byB0aGUgbmV4dCBzZWdtZW50LgotICoKLSAqIHRoZSBwYXJhbWV0ZXIgImZpbmlzaF92b2x1bWUiIGRlc2NyaWJlcyB3aGV0aGVyIHRvIHBvc2l0aW9uIGJlZm9yZQotICogb3IgYWZ0ZXIgdGhlIHBvc3NpYmx5IGNyZWF0ZWQgZmlsZS1tYXJrLiBXZSBhbHdheXMgcG9zaXRpb24gYWZ0ZXIKLSAqIHRoZSBmaWxlLW1hcmsgd2hlbiBjYWxsZWQgZnJvbSBmdGFwZV9jbG9zZSgpIGFuZCBhIGZsdXNoIHdhcyBuZWVkZWQKLSAqICh0aGF0IGlzIGZ0YXBlX3dyaXRlKCkgd2FzIHRoZSBsYXN0IHRhcGUgb3BlcmF0aW9uIGJlZm9yZSBjYWxsaW5nCi0gKiBmdGFwZV9mbHVzaCkgQnV0IHdlIGFsd2F5cyBwb3NpdGlvbiBiZWZvcmUgdGhlIGZpbGUtbWFyayB3aGVuIHRoaXMKLSAqIGZ1bmN0aW9uIGdldCdzIGNhbGxlZCBmcm9tIG91dHNpZGUgZnRhcGVfY2xvc2UoKSAKLSAqLwotaW50IHpmdF9mbHVzaF9idWZmZXJzKHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQlpbnQgZGF0YV9yZW1haW5pbmc7Ci0JaW50IHRoaXNfc2Vnc19zaXplOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csCi0JICAgICAgImVudGVyZWQsIGZ0YXBlX3N0YXRlID0gJWQiLCBmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSk7Ci0JaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlICE9IHdyaXRpbmcgJiYgIW5lZWRfZmx1c2gpIHsKLQkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIm5vIG5lZWQgZm9yIGZsdXNoIik7Ci0JfQotCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOyAvKiAgdHJpZ2dlcnMgc29tZSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZQotCQkJCSAgKiAgcmVhZCBhbmQgd3JpdGUgcm91dGluZXMgCi0JCQkJICAqLwotCWlmIChsYXN0X3dyaXRlX2ZhaWxlZCkgewotCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKLQkJVFJBQ0VfRVhJVCAtRUlPOwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAiZmx1c2hpbmcgd3JpdGUgYnVmZmVycyIpOwotCXRoaXNfc2Vnc19zaXplID0gemZ0X2dldF9zZWdfc3ooemZ0X3Bvcy5zZWdfcG9zKTsKLQlpZiAodGhpc19zZWdzX3NpemUgPT0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpIHsKLQkJemZ0X3Bvcy5zZWdfcG9zICsrOwotCQlkYXRhX3JlbWFpbmluZyA9IHpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKLQl9IGVsc2UgewotCQlkYXRhX3JlbWFpbmluZyA9IHpmdF9wb3Muc2VnX2J5dGVfcG9zOwotCX0KLQkvKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSBub3Qgd3JpdHRlbiB0byB0YXBlIHlldCwgYXBwZW5kIHplcm8ncwotCSAqIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHNlY3RvciAoaWYgdXNpbmcgY29tcHJlc3Npb24pIG9yIG1lcmdlCi0JICogaXQgd2l0aCB0aGUgZGF0YSBleGlzdGluZyBvbiB0aGUgdGFwZSBUaGVuIHdyaXRlIHRoZQotCSAqIHNlZ21lbnQocykgdG8gdGFwZS4KLQkgKi8KLQlUUkFDRShmdF90X25vaXNlLCAiUG9zaXRpb246XG4iCi0JICAgICAgS0VSTl9JTkZPICJzZWdfcG9zICA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJieXRlIHBvcyA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmc6ICVkIiwKLQkgICAgICB6ZnRfcG9zLnNlZ19wb3MsIHpmdF9wb3Muc2VnX2J5dGVfcG9zLCBkYXRhX3JlbWFpbmluZyk7Ci0JaWYgKGRhdGFfcmVtYWluaW5nID4gMCkgewotCQlkbyB7Ci0JCQl0aGlzX3NlZ3Nfc2l6ZSA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7Ci0JCQlpZiAodGhpc19zZWdzX3NpemUgPiBkYXRhX3JlbWFpbmluZykgewotCQkJCVRSQUNFX0NBVENIKHJlYWRfbWVyZ2VfYnVmZmVyKHpmdF9wb3Muc2VnX3BvcywKLQkJCQkJCQkgICAgICB6ZnRfZGVibG9ja19idWYsCi0JCQkJCQkJICAgICAgZGF0YV9yZW1haW5pbmcsCi0JCQkJCQkJICAgICAgdGhpc19zZWdzX3NpemUpLAotCQkJCQkgICAgbGFzdF93cml0ZV9mYWlsZWQgPSAxKTsKLQkJCX0KLQkJCXJlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLCAKLQkJCQkJCSAgICAgemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJICAgICBGVF9XUl9NVUxUSSk7Ci0JCQlpZiAocmVzdWx0ICE9IHRoaXNfc2Vnc19zaXplKSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsICJmbHVzaCBidWZmZXJzIGZhaWxlZCIpOwotCQkJCXpmdF9wb3MudGFwZV9wb3MgICAgLT0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3M7Ci0JCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAwOwotCi0JCQkJbGFzdF93cml0ZV9mYWlsZWQgPSAxOwotCQkJCVRSQUNFX0VYSVQgcmVzdWx0OwotCQkJfQotCQkJemZ0X3dyaXR0ZW5fc2VnbWVudHMgKys7Ci0JCQlUUkFDRShmdF90X2RhdGFfZmxvdywKLQkJCSAgICAgICJmbHVzaCwgbW92ZWQgb3V0IGJ1ZmZlcjogJWQiLCByZXN1bHQpOwotCQkJLyogbmVlZCBuZXh0IHNlZ21lbnQgZm9yIG1vcmUgZGF0YSAoZW1wdHkgc2VnbWVudHM/KQotCQkJICovCi0JCQlpZiAocmVzdWx0IDwgZGF0YV9yZW1haW5pbmcpIHsgCi0JCQkJaWYgKHJlc3VsdCA+IDApIHsgICAgICAgCi0JCQkJCS8qIG1vdmUgcmVtYWluZGVyIHRvIGJ1ZmZlciBiZWdpbm5pbmcgCi0JCQkJCSAqLwotCQkJCQltZW1tb3ZlKHpmdF9kZWJsb2NrX2J1ZiwgCi0JCQkJCQl6ZnRfZGVibG9ja19idWYgKyByZXN1bHQsCi0JCQkJCQlGVF9TRUdNRU5UX1NJWkUgLSByZXN1bHQpOwotCQkJCX0KLQkJCX0gCi0JCQlkYXRhX3JlbWFpbmluZyAtPSByZXN1bHQ7Ci0JCQl6ZnRfcG9zLnNlZ19wb3MgKys7Ci0JCX0gd2hpbGUgKGRhdGFfcmVtYWluaW5nID4gMCk7Ci0JCVRSQUNFKGZ0X3RfYW55LCAicmVzdWx0OiAlZCIsIHJlc3VsdCk7Ci0JCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtLXpmdF9wb3Muc2VnX3BvczsKLQkJaWYgKGRhdGFfcmVtYWluaW5nID09IDApIHsgIC8qIGZpcnN0IGJ5dGUgbmV4dCBzZWdtZW50ICovCi0JCQl6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IHRoaXNfc2Vnc19zaXplOwotCQl9IGVsc2UgeyAvKiBhZnRlciBkYXRhIHByZXZpb3VzIHNlZ21lbnQsIGRhdGFfcmVtYWluaW5nIDwgMCAqLwotCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSBkYXRhX3JlbWFpbmluZyArIHJlc3VsdDsKLQkJfQotCX0gZWxzZSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJ6ZnRfZGVibG9ja19idWYgZW1wdHkiKTsKLQkJemZ0X3Bvcy5zZWdfcG9zIC0tOwotCQl6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IHpmdF9nZXRfc2VnX3N6ICh6ZnRfcG9zLnNlZ19wb3MpOwotCQlmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKTsKLQl9Ci0JVFJBQ0UoZnRfdF9hbnksICJ3YWl0aW5nIik7Ci0JaWYgKChyZXN1bHQgPSBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCkpIDwgMCkgewotCQkvKiB0aGF0J3MgcmVhbGx5IGJhZC4gV2hhdCB0byB0byB3aXRoIHpmdF90YXBlX3Bvcz8gCi0JCSAqLwotCQlUUkFDRShmdF90X2VyciwgImZsdXNoIGJ1ZmZlcnMgZmFpbGVkIik7Ci0JfQotCVRSQUNFKGZ0X3RfYW55LCAiemZ0X3NlZ19wb3M6ICVkLCB6ZnRfc2VnX2J5dGVfcG9zOiAlZCIsCi0JICAgICAgemZ0X3Bvcy5zZWdfcG9zLCB6ZnRfcG9zLnNlZ19ieXRlX3Bvcyk7Ci0JbGFzdF93cml0ZV9mYWlsZWQgID0KLQkJbmVlZF9mbHVzaCA9IDA7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qIHJldHVybi12YWx1ZTogdGhlIG51bWJlciBvZiBieXRlcyByZW1vdmVkIGZyb20gdGhlIHVzZXItYnVmZmVyCi0gKgotICogb3V0OiAKLSAqICAgICAgaW50ICp3cml0ZV9jbnQ6IGhvdyBtdWNoIGFjdHVhbGx5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgemZ0X2RlYmxvY2tfYnVmCi0gKiAgICAgIGludCByZXFfbGVuICA6IE1VU1QgTk9UIEJFIENIQU5HRUQsIGV4Y2VwdCBhdCBFT1QsIGluIAotICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FzZSBpdCBtYXkgYmUgYWRqdXN0ZWQKLSAqIGluIDogCi0gKiAgICAgIGNoYXIgKmJ1ZmYgICAgICAgIDogdGhlIHVzZXIgYnVmZmVyCi0gKiAgICAgIGludCBidWZfcG9zX3dyaXRlIDogY29weSBvZiBidWZfbGVuX3dyIGludAotICogICAgICB0aGlzX3NlZ3Nfc2l6ZSAgICA6IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBhY3R1YWwgc2VnbWVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIKLSAqICAgICAgKnpmdF9kZWJsb2NrX2J1ZiAgIDogemZ0X2RlYmxvY2tfYnVmCi0gKi8KLXN0YXRpYyBpbnQgemZ0X3NpbXBsZV93cml0ZShpbnQgKmNudCwKLQkJCSAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAotCQkJICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwgCi0JCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKLXsKLQlpbnQgc3BhY2VfbGVmdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCS8qIHZvbHVtZS0+c2l6ZSBob2xkcyB0aGUgdGFwZSBjYXBhY2l0eSB3aGlsZSB2b2x1bWUgaXMgb3BlbiAqLwotCWlmIChwb3MtPnRhcGVfcG9zICsgdm9sdW1lLT5ibGtfc3ogPiB2b2x1bWUtPnNpemUpIHsKLQkJVFJBQ0VfRVhJVCAtRU5PU1BDOwotCX0KLQkvKiAgcmVtYWluaW5nIHNwYWNlIGluIHRoaXMgc2VnbWVudCwgTk9UIHpmdF9kZWJsb2NrX2J1ZgotCSAqLwotCXNwYWNlX2xlZnQgPSBzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvczsKLQkqY250ID0gcmVxX2xlbiA8IHNwYWNlX2xlZnQgPyByZXFfbGVuIDogc3BhY2VfbGVmdDsKLQlpZiAoY29weV9mcm9tX3VzZXIoZHN0X2J1ZiArIHBvcy0+c2VnX2J5dGVfcG9zLCBzcmNfYnVmLCAqY250KSAhPSAwKSB7Ci0JCVRSQUNFX0VYSVQgLUVGQVVMVDsKLQl9Ci0JVFJBQ0VfRVhJVCAqY250OwotfQotCi1zdGF0aWMgaW50IGNoZWNrX3dyaXRlX2FjY2VzcyhpbnQgcmVxX2xlbiwKLQkJCSAgICAgIGNvbnN0IHpmdF92b2xpbmZvICoqdm9sdW1lLAotCQkJICAgICAgemZ0X3Bvc2l0aW9uICpwb3MsCi0JCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYmxrX3N6KQotewotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKHJlcV9sZW4gJSB6ZnRfYmxrX3N6KSAhPSAwKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKLQkJCSAgICAid3JpdGUtY291bnQgJWQgbXVzdCBiZSBtdWx0aXBsZSBvZiBibG9jay1zaXplICVkIiwKLQkJCSAgICByZXFfbGVuLCBibGtfc3opOwotCX0KLQlpZiAoemZ0X2lvX3N0YXRlID09IHpmdF93cml0aW5nKSB7Ci0JCS8qICBhbGwgb3RoZXIgZXJyb3IgY29uZGl0aW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBlYXJsaWVyCi0JCSAqLwotCQlUUkFDRV9FWElUIDA7Ci0JfQotCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOwotCVRSQUNFX0NBVENIKHpmdF9jaGVja193cml0ZV9hY2Nlc3MocG9zKSwpOwotCS8qICBJZiB3ZSBoYXZlbid0IHJlYWQgdGhlIGhlYWRlciBzZWdtZW50IHlldCwgZG8gaXQgbm93LgotCSAqICBUaGlzIHdpbGwgdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlIGJhZCBzZWN0b3IKLQkgKiAgdGFibGUgYW5kIHJlYWQgdGhlIHZvbHVtZSB0YWJsZSBzZWdtZW50IAotCSAqLwotCWlmICghemZ0X2hlYWRlcl9yZWFkKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF9yZWFkX2hlYWRlcl9zZWdtZW50cygpLCk7Ci0JfQotCS8qICBmaW5lLiBOb3cgdGhlIHRhcGUgaXMgZWl0aGVyIGF0IEJPVCBvciBhdCBFT0QsCi0JICogIFdyaXRlIHN0YXJ0IG9mIHZvbHVtZSBub3cKLQkgKi8KLQlUUkFDRV9DQVRDSCh6ZnRfb3Blbl92b2x1bWUocG9zLCBibGtfc3osIHpmdF91c2VfY29tcHJlc3Npb24pLCk7Ci0JKnZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOwotCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiIiwgKnZvbHVtZSk7Ci0JemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7Ci0JLyogbm93IG1lcmdlIHdpdGggb2xkIGRhdGEgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCF6ZnRfcWljX21vZGUgJiYgcG9zLT5zZWdfYnl0ZV9wb3MgIT0gMCl7Ci0JCXJlc3VsdCA9IHpmdF9mZXRjaF9zZWdtZW50KHBvcy0+c2VnX3BvcywKLQkJCQkJICAgemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkgICBGVF9SRF9TSU5HTEUpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJaWYgKHJlc3VsdCA9PSAtRUlOVFIgfHwgcmVzdWx0ID09IC1FTk9TUEMpIHsKLQkJCQlUUkFDRV9FWElUIHJlc3VsdDsKLQkJCX0KLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsIAotCQkJICAgICAgImZ0YXBlX3JlYWRfc2VnbWVudCgpIHJlc3VsdDogJWQuICIKLQkJCSAgICAgICJUaGlzIG1pZ2h0IGJlIG5vcm1hbCB3aGVuIHVzaW5nICIKLQkJCSAgICAgICJhIG5ld2x5XG5mb3JtYXR0ZWQgdGFwZSIsIHJlc3VsdCk7Ci0JCQltZW1zZXQoemZ0X2RlYmxvY2tfYnVmLCAnXDAnLCBwb3MtPnNlZ19ieXRlX3Bvcyk7Ci0JCX0KLQl9Ci0JemZ0X2lvX3N0YXRlID0gemZ0X3dyaXRpbmc7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IGZpbGxfZGVibG9ja19idWYoX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKLQkJCSAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKLQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNyX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4pCi17Ci0JaW50IGNudCA9IDA7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoc2VnX3N6ID09IDApIHsKLQkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9kYXRhX2Zsb3csICJlbXB0eSBzZWdtZW50Iik7Ci0JfQotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCi0JICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmcgcmVxX2xlbjogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gIiAgICAgICAgICBidWZfcG9zOiAlZCIsIAotCSAgICAgIHJlcV9sZW4sIHBvcy0+c2VnX2J5dGVfcG9zKTsKLQkvKiB6ZnRfZGVibG9ja19idWYgd2lsbCBub3QgY29udGFpbiBhIHZhbGlkIHNlZ21lbnQgYW55IGxvbmdlciAqLwotCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKLQlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbikgewotCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7Ci0JCVRSQUNFX0NBVENIKHJlc3VsdD0gKCp6ZnRfY21wcl9vcHMtPndyaXRlKSgmY250LAotCQkJCQkJCSAgIGRzdF9idWYsIHNlZ19zeiwKLQkJCQkJCQkgICB1c3JfYnVmLCByZXFfbGVuLAotCQkJCQkJCSAgIHBvcywgdm9sdW1lKSwpOwotCX0gZWxzZSB7Ci0JCVRSQUNFX0NBVENIKHJlc3VsdD0gemZ0X3NpbXBsZV93cml0ZSgmY250LAotCQkJCQkJICAgICBkc3RfYnVmLCBzZWdfc3osCi0JCQkJCQkgICAgIHVzcl9idWYsIHJlcV9sZW4sCi0JCQkJCQkgICAgIHBvcywgdm9sdW1lKSwpOwotCX0KLQlwb3MtPnZvbHVtZV9wb3MgICArPSByZXN1bHQ7Ci0JcG9zLT5zZWdfYnl0ZV9wb3MgKz0gY250OwotCXBvcy0+dGFwZV9wb3MgICAgICs9IGNudDsKLQlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgotCSAgICAgIEtFUk5fSU5GTyAicmVtb3ZlZCBmcm9tIHVzZXItYnVmZmVyIDogJWQgYnl0ZXMuXG4iCi0JICAgICAgS0VSTl9JTkZPICJjb3BpZWQgdG8gemZ0X2RlYmxvY2tfYnVmOiAlZCBieXRlcy5cbiIKLQkgICAgICBLRVJOX0lORk8gInpmdF90YXBlX3BvcyAgICAgICAgICAgICA6ICIgTExfWCAiIGJ5dGVzLiIsCi0JICAgICAgcmVzdWx0LCBjbnQsIExMKHBvcy0+dGFwZV9wb3MpKTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotCi0vKiAgY2FsbGVkIGJ5IHRoZSBrZXJuZWwtaW50ZXJmYWNlIHJvdXRpbmUgInpmdF93cml0ZSgpIgotICovCi1pbnQgX3pmdF93cml0ZShjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwgaW50IHJlcV9sZW4pCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHdyaXR0ZW4gPSAwOwotCWludCB3cml0ZV9jbnQ7Ci0JaW50IHNlZ19zejsKLQlzdGF0aWMgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSA9IE5VTEw7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JemZ0X3Jlc2lkICAgICAgICAgPSByZXFfbGVuOwkKLQlsYXN0X3dyaXRlX2ZhaWxlZCA9IDE7IC8qIHJlc2V0IHRvIDAgd2hlbiBzdWNjZXNzZnVsICovCi0JLyogY2hlY2sgaWYgd3JpdGUgaXMgYWxsb3dlZCAKLQkgKi8KLQlUUkFDRV9DQVRDSChjaGVja193cml0ZV9hY2Nlc3MocmVxX2xlbiwgJnZvbHVtZSwmemZ0X3Bvcyx6ZnRfYmxrX3N6KSwpOwotCXdoaWxlIChyZXFfbGVuID4gMCkgewotCQkvKiBBbGxvdyB1cyB0byBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agd2l0aCBhIHNpZ25hbCAhCi0JCSAqLwotCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7Ci0JCXNlZ19zeiA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7Ci0JCWlmICgod3JpdGVfY250ID0gZmlsbF9kZWJsb2NrX2J1Zih6ZnRfZGVibG9ja19idWYsCi0JCQkJCQkgIHNlZ19zeiwKLQkJCQkJCSAgJnpmdF9wb3MsCi0JCQkJCQkgIHZvbHVtZSwKLQkJCQkJCSAgYnVmZiwKLQkJCQkJCSAgcmVxX2xlbikpIDwgMCkgewotCQkJemZ0X3Jlc2lkIC09IHdyaXR0ZW47Ci0JCQlpZiAod3JpdGVfY250ID09IC1FTk9TUEMpIHsKLQkJCQkvKiBsZWF2ZSB0aGUgcmVtYWluZGVyIHRvIGZsdXNoX2J1ZmZlcnMoKQotCQkJCSAqLwotCQkJCVRSQUNFKGZ0X3RfaW5mbywgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIik7Ci0JCQkJbGFzdF93cml0ZV9mYWlsZWQgPSAwOwotCQkJCWlmICghbmVlZF9mbHVzaCkgewotCQkJCQluZWVkX2ZsdXNoID0gd3JpdHRlbiA+IDA7Ci0JCQkJfQotCQkJCVRSQUNFX0VYSVQgd3JpdHRlbiA+IDAgPyB3cml0dGVuIDogLUVOT1NQQzsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0VfRVhJVCByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKHpmdF9wb3Muc2VnX2J5dGVfcG9zID09IHNlZ19zeikgewotCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfd3JpdGVfc2VnbWVudCh6ZnRfcG9zLnNlZ19wb3MsIAotCQkJCQkJCXpmdF9kZWJsb2NrX2J1ZiwKLQkJCQkJCQlGVF9XUl9BU1lOQyksCi0JCQkJICAgIHpmdF9yZXNpZCAtPSB3cml0dGVuKTsKLQkJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOwotCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSAgMDsKLQkJCXpmdF9kZWJsb2NrX3NlZ21lbnQgID0gemZ0X3Bvcy5zZWdfcG9zOwotCQkJKyt6ZnRfcG9zLnNlZ19wb3M7Ci0JCX0KLQkJd3JpdHRlbiArPSB3cml0ZV9jbnQ7Ci0JCWJ1ZmYgICAgKz0gd3JpdGVfY250OwotCQlyZXFfbGVuIC09IHdyaXRlX2NudDsKLQl9IC8qIHdoaWxlIChyZXFfbGVuID4gMCkgKi8KLQlUUkFDRShmdF90X2RhdGFfZmxvdywgInJlbWFpbmluZyBpbiBibG9ja2luZyBidWZmZXI6ICVkIiwKLQkgICAgICAgemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpOwotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAianVzdCB3cml0dGVuIGJ5dGVzOiAlZCIsIHdyaXR0ZW4pOwotCWxhc3Rfd3JpdGVfZmFpbGVkID0gMDsKLQl6ZnRfcmVzaWQgLT0gd3JpdHRlbjsKLQluZWVkX2ZsdXNoID0gbmVlZF9mbHVzaCB8fCB3cml0dGVuID4gMDsKLQlUUkFDRV9FWElUIHdyaXR0ZW47ICAgICAgICAgICAgICAgLyogYnl0ZXMgd3JpdHRlbiAqLwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhODg3MDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSNpZm5kZWYgX1pGVEFQRV9XUklURV9ICi0jZGVmaW5lIF9aRlRBUEVfV1JJVEVfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOToxMyAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgd3JpdGUgZnVuY3Rpb25zCi0gKiAgICAgIGZvciB0aGUgemZ0YXBlIGRyaXZlciBmb3IgTGludXguCi0gKgotICovCi0KLWV4dGVybiBpbnQgIHpmdF9mbHVzaF9idWZmZXJzKHZvaWQpOwotZXh0ZXJuIGludCAgemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHModm9pZCk7Ci1leHRlcm4gdm9pZCB6ZnRfcHJldmVudF9mbHVzaCh2b2lkKTsKLQotLyogIGhvb2sgZm9yIHRoZSBWRlMgaW50ZXJmYWNlIAotICovCi1leHRlcm4gaW50IF96ZnRfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKTsKLSNlbmRpZiAvKiBfWkZUQVBFX1dSSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiMTQwMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZV9zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jLHYgJAotICogJFJldmlzaW9uOiAxLjMgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MTQgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeW1ib2xzIHRoYXQgdGhlIHpmdGFwZSBmcm9udGVuZCB0byAKLSAqICAgICAgdGhlIGZ0YXBlIGZsb3BweSB0YXBlIGRyaXZlciBleHBvcnRzIAotICovCQkgCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLQotLyogemZ0YXBlLWluaXQuYyAqLwotRVhQT1JUX1NZTUJPTCh6ZnRfY21wcl9yZWdpc3Rlcik7Ci0vKiB6ZnRhcGUtcmVhZC5jICovCi1FWFBPUlRfU1lNQk9MKHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKTsKLS8qIHpmdGFwZS1idWZmZXJzLmMgKi8KLUVYUE9SVF9TWU1CT0woemZ0X3ZtYWxsb2Nfb25jZSk7Ci1FWFBPUlRfU1lNQk9MKHpmdF92bWFsbG9jX2Fsd2F5cyk7Ci1FWFBPUlRfU1lNQk9MKHpmdF92ZnJlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwppbmRleCAwOTFhMTFjLi4yMGRjM2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHBldC5jCisrKyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKaW5kZXggMTU0YTgxZC4uMjZhODYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTYyLDcgKzE2Myw4IEBACiB9OwogCiAKLXN0YXRpYyBzc2l6ZV90IGh3cm5nX2F0dHJfY3VycmVudF9zdG9yZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzcywKK3N0YXRpYyBzc2l6ZV90IGh3cm5nX2F0dHJfY3VycmVudF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CiAJaW50IGVycjsKQEAgLTE5Miw3ICsxOTQsOCBAQAogCXJldHVybiBlcnIgPyA6IGxlbjsKIH0KIAotc3RhdGljIHNzaXplX3QgaHdybmdfYXR0cl9jdXJyZW50X3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsCitzdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2N1cnJlbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgICAgICBjaGFyICpidWYpCiB7CiAJaW50IGVycjsKQEAgLTIxMCw3ICsyMTMsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGh3cm5nX2F0dHJfYXZhaWxhYmxlX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsCitzdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2F2YWlsYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY2hhciAqYnVmKQogewogCWludCBlcnI7CkBAIC0yMzQsMjAgKzIzOCwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihybmdfY3VycmVudCwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQkgaHdybmdfYXR0cl9jdXJyZW50X3Nob3csCi0JCQkgaHdybmdfYXR0cl9jdXJyZW50X3N0b3JlKTsKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihybmdfYXZhaWxhYmxlLCBTX0lSVUdPLAotCQkJIGh3cm5nX2F0dHJfYXZhaWxhYmxlX3Nob3csCi0JCQkgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocm5nX2N1cnJlbnQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBod3JuZ19hdHRyX2N1cnJlbnRfc2hvdywKKwkJICAgaHdybmdfYXR0cl9jdXJyZW50X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihybmdfYXZhaWxhYmxlLCBTX0lSVUdPLAorCQkgICBod3JuZ19hdHRyX2F2YWlsYWJsZV9zaG93LAorCQkgICBOVUxMKTsKIAogCiBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX21pc2NkZXYodm9pZCkKIHsKLQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUocm5nX21pc2NkZXYuY2xhc3MsCi0JCQkJICZjbGFzc19kZXZpY2VfYXR0cl9ybmdfYXZhaWxhYmxlKTsKLQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUocm5nX21pc2NkZXYuY2xhc3MsCi0JCQkJICZjbGFzc19kZXZpY2VfYXR0cl9ybmdfY3VycmVudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHJuZ19taXNjZGV2LnRoaXNfZGV2aWNlLCAmZGV2X2F0dHJfcm5nX2F2YWlsYWJsZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHJuZ19taXNjZGV2LnRoaXNfZGV2aWNlLCAmZGV2X2F0dHJfcm5nX2N1cnJlbnQpOwogCW1pc2NfZGVyZWdpc3Rlcigmcm5nX21pc2NkZXYpOwogfQogCkBAIC0yNTgsMjAgKzI2MCwxOSBAQAogCWVyciA9IG1pc2NfcmVnaXN0ZXIoJnJuZ19taXNjZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUocm5nX21pc2NkZXYuY2xhc3MsCi0JCQkJICAgICAgICZjbGFzc19kZXZpY2VfYXR0cl9ybmdfY3VycmVudCk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKHJuZ19taXNjZGV2LnRoaXNfZGV2aWNlLAorCQkJCSAmZGV2X2F0dHJfcm5nX2N1cnJlbnQpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX21pc2NfZGVyZWc7Ci0JZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHJuZ19taXNjZGV2LmNsYXNzLAotCQkJCSAgICAgICAmY2xhc3NfZGV2aWNlX2F0dHJfcm5nX2F2YWlsYWJsZSk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKHJuZ19taXNjZGV2LnRoaXNfZGV2aWNlLAorCQkJCSAmZGV2X2F0dHJfcm5nX2F2YWlsYWJsZSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcmVtb3ZlX2N1cnJlbnQ7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIAogZXJyX3JlbW92ZV9jdXJyZW50OgotCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShybmdfbWlzY2Rldi5jbGFzcywKLQkJCQkgJmNsYXNzX2RldmljZV9hdHRyX3JuZ19jdXJyZW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUocm5nX21pc2NkZXYudGhpc19kZXZpY2UsICZkZXZfYXR0cl9ybmdfY3VycmVudCk7CiBlcnJfbWlzY19kZXJlZzoKIAltaXNjX2RlcmVnaXN0ZXIoJnJuZ19taXNjZGV2KTsKIAlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA1NTQ3MzM3Li5lNjdlZWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC05ODAsMTAgKzk4MCwxMCBAQAogCiAJbWVtX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibWVtIik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2bGlzdCk7IGkrKykKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZShtZW1fY2xhc3MsIE5VTEwsCi0JCQkJCU1LREVWKE1FTV9NQUpPUiwgZGV2bGlzdFtpXS5taW5vciksCi0JCQkJCU5VTEwsIGRldmxpc3RbaV0ubmFtZSk7Ci0JCisJCWRldmljZV9jcmVhdGUobWVtX2NsYXNzLCBOVUxMLAorCQkJICAgICAgTUtERVYoTUVNX01BSk9SLCBkZXZsaXN0W2ldLm1pbm9yKSwKKwkJCSAgICAgIGRldmxpc3RbaV0ubmFtZSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21pc2MuYyBiL2RyaXZlcnMvY2hhci9taXNjLmMKaW5kZXggNjJlYmUwOS4uN2E0ODRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21pc2MuYworKysgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCkBAIC0xNjksMTEgKzE2OSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyogCi0gKiBUT0RPIGZvciAyLjc6Ci0gKiAgLSBhZGQgYSBzdHJ1Y3Qga3JlZiB0byBzdHJ1Y3QgbWlzY2RldmljZSBhbmQgbWFrZSBhbGwgdXNhZ2VzIG9mCi0gKiAgICB0aGVtIGR5bmFtaWMuCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKm1pc2NfY2xhc3M7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pc2NfZm9wcyA9IHsKQEAgLTIyOCwxMCArMjIzLDEwIEBACiAJCW1pc2NfbWlub3JzW21pc2MtPm1pbm9yID4+IDNdIHw9IDEgPDwgKG1pc2MtPm1pbm9yICYgNyk7CiAJZGV2ID0gTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpOwogCi0JbWlzYy0+Y2xhc3MgPSBjbGFzc19kZXZpY2VfY3JlYXRlKG1pc2NfY2xhc3MsIE5VTEwsIGRldiwgbWlzYy0+ZGV2LAorCW1pc2MtPnRoaXNfZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShtaXNjX2NsYXNzLCBtaXNjLT5wYXJlbnQsIGRldiwKIAkJCQkJICAiJXMiLCBtaXNjLT5uYW1lKTsKLQlpZiAoSVNfRVJSKG1pc2MtPmNsYXNzKSkgewotCQllcnIgPSBQVFJfRVJSKG1pc2MtPmNsYXNzKTsKKwlpZiAoSVNfRVJSKG1pc2MtPnRoaXNfZGV2aWNlKSkgeworCQllcnIgPSBQVFJfRVJSKG1pc2MtPnRoaXNfZGV2aWNlKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yNjQsNyArMjU5LDcgQEAKIAogCWRvd24oJm1pc2Nfc2VtKTsKIAlsaXN0X2RlbCgmbWlzYy0+bGlzdCk7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3kobWlzY19jbGFzcywgTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpKTsKKwlkZXZpY2VfZGVzdHJveShtaXNjX2NsYXNzLCBNS0RFVihNSVNDX01BSk9SLCBtaXNjLT5taW5vcikpOwogCWlmIChpIDwgRFlOQU1JQ19NSU5PUlMgJiYgaT4wKSB7CiAJCW1pc2NfbWlub3JzW2k+PjNdICY9IH4oMSA8PCAobWlzYy0+bWlub3IgJiA3KSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwMDBfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDAwX2NzLmMKaW5kZXggNTBkMjBhYS4uMjExYzkzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwMDBfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDAwMF9jcy5jCkBAIC0xNzY0LDI5ICsxNzY0LDExIEBACiAJaW50IHJjOwogCiAJLyogcmVhZCB0aGUgY29uZmlnLXR1cGxlcyAqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAJdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhID0gYnVmOwogCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKIAotCWlmICgoZmFpbF9yYyA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSkgIT0gQ1NfU1VDQ0VTUykgewotCQlmYWlsX2ZuID0gR2V0Rmlyc3RUdXBsZTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCWlmICgoZmFpbF9yYyA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKSAhPSBDU19TVUNDRVNTKSB7Ci0JCWZhaWxfZm4gPSBHZXRUdXBsZURhdGE7Ci0JCWdvdG8gY3NfZmFpbGVkOwotCX0KLQlpZiAoKGZhaWxfcmMgPQotCSAgICAgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSkgIT0gQ1NfU1VDQ0VTUykgewotCQlmYWlsX2ZuID0gUGFyc2VUdXBsZTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCi0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCiAJbGluay0+aW8uQmFzZVBvcnQyID0gMDsKIAlsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwogCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gMDsKQEAgLTE4NDEsOCArMTgyMyw2IEBACiAKIAlyZXR1cm4gMDsKIAotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmssIGZhaWxfZm4sIGZhaWxfcmMpOwogY3NfcmVsZWFzZToKIAljbTQwMDBfcmVsZWFzZShsaW5rKTsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTE5NzMsMTQgKzE5NTMsMTQgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CiAKIAljbW1fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJjYXJkbWFuXzQwMDAiKTsKLQlpZiAoIWNtbV9jbGFzcykKLQkJcmV0dXJuIC0xOworCWlmIChJU19FUlIoY21tX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIoY21tX2NsYXNzKTsKIAogCW1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIERFVklDRV9OQU1FLCAmY200MDAwX2ZvcHMpOwogCWlmIChtYWpvciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBNT0RVTEVfTkFNRQogCQkJIjogY291bGQgbm90IGdldCBtYWpvciBudW1iZXJcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBtYWpvcjsKIAl9CiAKIAlyYyA9IHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmNtNDAwMF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDQwX2NzLmMKaW5kZXggNTVjZjRiZS4uOWIxZmY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDA0MF9jcy5jCkBAIC01MjMsMjkgKzUyMywxMSBAQAogCWludCBmYWlsX2ZuLCBmYWlsX3JjOwogCWludCByYzsKIAotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAJdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhID0gYnVmOwogCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAKLQlpZiAoKGZhaWxfcmMgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpICE9IENTX1NVQ0NFU1MpIHsKLQkJZmFpbF9mbiA9IEdldEZpcnN0VHVwbGU7Ci0JCWdvdG8gY3NfZmFpbGVkOwotCX0KLQlpZiAoKGZhaWxfcmMgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSkgIT0gQ1NfU1VDQ0VTUykgewotCQlmYWlsX2ZuID0gR2V0VHVwbGVEYXRhOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JaWYgKChmYWlsX3JjID0gcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSkKLQkJCQkJCQkhPSBDU19TVUNDRVNTKSB7Ci0JCWZhaWxfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0KLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAlsaW5rLT5pby5CYXNlUG9ydDIgPSAwOwogCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7CiAJbGluay0+aW8uQXR0cmlidXRlczIgPSAwOwpAQCAtNjA5LDggKzU5MSw2IEBACiAKIAlyZXR1cm4gMDsKIAotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmssIGZhaWxfZm4sIGZhaWxfcmMpOwogY3NfcmVsZWFzZToKIAlyZWFkZXJfcmVsZWFzZShsaW5rKTsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTcyMSwxNCArNzAxLDE0IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CiAJY214X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiY2FyZG1hbl80MDQwIik7Ci0JaWYgKCFjbXhfY2xhc3MpCi0JCXJldHVybiAtMTsKKwlpZiAoSVNfRVJSKGNteF9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKGNteF9jbGFzcyk7CiAKIAltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBERVZJQ0VfTkFNRSwgJnJlYWRlcl9mb3BzKTsKIAlpZiAobWFqb3IgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EVUxFX05BTUUKIAkJCSI6IGNvdWxkIG5vdCBnZXQgbWFqb3IgbnVtYmVyXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gbWFqb3I7CiAJfQogCiAJcmMgPSBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZyZWFkZXJfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwppbmRleCAxYTBiYzMwLi5mOWY3MjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC02MDQsMTcgKzYwNCwxMCBAQAogICAgIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQogCSAgICBwcmludGsoIm1nc2xwY19jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgLyogcmVhZCBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CiAKICAgICAvKiBnZXQgQ0lTIGNvbmZpZ3VyYXRpb24gZW50cnkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BwZGV2LmMgYi9kcml2ZXJzL2NoYXIvcHBkZXYuYwppbmRleCBlZmM0ODVlLi5jMWUzZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcHBkZXYuYworKysgYi9kcml2ZXJzL2NoYXIvcHBkZXYuYwpAQCAtNzUyLDEzICs3NTIsMTMgQEAKIAogc3RhdGljIHZvaWQgcHBfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQogewotCWNsYXNzX2RldmljZV9jcmVhdGUocHBkZXZfY2xhc3MsIE5VTEwsIE1LREVWKFBQX01BSk9SLCBwb3J0LT5udW1iZXIpLAotCQkJTlVMTCwgInBhcnBvcnQlZCIsIHBvcnQtPm51bWJlcik7CisJZGV2aWNlX2NyZWF0ZShwcGRldl9jbGFzcywgTlVMTCwgTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlciksCisJCQkicGFycG9ydCVkIiwgcG9ydC0+bnVtYmVyKTsKIH0KIAogc3RhdGljIHZvaWQgcHBfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQogewotCWNsYXNzX2RldmljZV9kZXN0cm95KHBwZGV2X2NsYXNzLCBNS0RFVihQUF9NQUpPUiwgcG9ydC0+bnVtYmVyKSk7CisJZGV2aWNlX2Rlc3Ryb3kocHBkZXZfY2xhc3MsIE1LREVWKFBQX01BSk9SLCBwb3J0LT5udW1iZXIpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwcF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggZWI2YjEzZi4uZDQwZGYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtMTQ2Niw4ICsxNDY2LDggQEAKIGxhdGVfaW5pdGNhbGwoc2VxZ2VuX2luaXQpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCi1fX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fdTMyICpzYWRkciwgX191MzIgKmRhZGRyLAotCQkJCSAgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCkKK19fdTMyIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoX19iZTMyICpzYWRkciwgX19iZTMyICpkYWRkciwKKwkJCQkgICBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKIHsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKIAlfX3UzMiBzZXE7CkBAIC0xNDc5LDEwICsxNDc5LDEwIEBACiAJICovCiAKIAltZW1jcHkoaGFzaCwgc2FkZHIsIDE2KTsKLQloYXNoWzRdPShzcG9ydCA8PCAxNikgKyBkcG9ydDsKKwloYXNoWzRdPSgoX19mb3JjZSB1MTYpc3BvcnQgPDwgMTYpICsgKF9fZm9yY2UgdTE2KWRwb3J0OwogCW1lbWNweSgmaGFzaFs1XSxrZXlwdHItPnNlY3JldCxzaXplb2YoX191MzIpICogNyk7CiAKLQlzZXEgPSB0d290aGlyZHNNRDRUcmFuc2Zvcm0oZGFkZHIsIGhhc2gpICYgSEFTSF9NQVNLOworCXNlcSA9IHR3b3RoaXJkc01ENFRyYW5zZm9ybSgoY29uc3QgX191MzIgKilkYWRkciwgaGFzaCkgJiBIQVNIX01BU0s7CiAJc2VxICs9IGtleXB0ci0+Y291bnQ7CiAKIAlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAvKiAgVGhlIGNvZGUgYmVsb3cgaXMgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoKS4KICAqICBBbGwgYmxhbWVzIHRvIEFuZHJleSBWLiBTYXZvY2hraW4gPHNhd0Btc3UucnU+LgogICovCi1fX3UzMiBzZWN1cmVfaXBfaWQoX191MzIgZGFkZHIpCitfX3UzMiBzZWN1cmVfaXBfaWQoX19iZTMyIGRhZGRyKQogewogCXN0cnVjdCBrZXlkYXRhICprZXlwdHI7CiAJX191MzIgaGFzaFs0XTsKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAJICogIFRoZSBkZXN0IGlwIGFkZHJlc3MgaXMgcGxhY2VkIGluIHRoZSBzdGFydGluZyB2ZWN0b3IsCiAJICogIHdoaWNoIGlzIHRoZW4gaGFzaGVkIHdpdGggcmFuZG9tIGRhdGEuCiAJICovCi0JaGFzaFswXSA9IGRhZGRyOworCWhhc2hbMF0gPSAoX19mb3JjZSBfX3UzMilkYWRkcjsKIAloYXNoWzFdID0ga2V5cHRyLT5zZWNyZXRbOV07CiAJaGFzaFsyXSA9IGtleXB0ci0+c2VjcmV0WzEwXTsKIAloYXNoWzNdID0ga2V5cHRyLT5zZWNyZXRbMTFdOwpAQCAtMTUxOCw4ICsxNTE4LDggQEAKIAogI2lmZGVmIENPTkZJR19JTkVUCiAKLV9fdTMyIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKLQkJCQkgX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KQorX191MzIgc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KQogewogCXN0cnVjdCB0aW1ldmFsIHR2OwogCV9fdTMyIHNlcTsKQEAgLTE1MzIsOSArMTUzMiw5IEBACiAJICogIE5vdGUgdGhhdCB0aGUgd29yZHMgYXJlIHBsYWNlZCBpbnRvIHRoZSBzdGFydGluZyB2ZWN0b3IsIHdoaWNoIGlzCiAJICogIHRoZW4gbWl4ZWQgd2l0aCBhIHBhcnRpYWwgTUQ0IG92ZXIgcmFuZG9tIGRhdGEuCiAJICovCi0JaGFzaFswXT1zYWRkcjsKLQloYXNoWzFdPWRhZGRyOwotCWhhc2hbMl09KHNwb3J0IDw8IDE2KSArIGRwb3J0OworCWhhc2hbMF09KF9fZm9yY2UgdTMyKXNhZGRyOworCWhhc2hbMV09KF9fZm9yY2UgdTMyKWRhZGRyOworCWhhc2hbMl09KChfX2ZvcmNlIHUxNilzcG9ydCA8PCAxNikgKyAoX19mb3JjZSB1MTYpZHBvcnQ7CiAJaGFzaFszXT1rZXlwdHItPnNlY3JldFsxMV07CiAKIAlzZXEgPSBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpICYgSEFTSF9NQVNLOwpAQCAtMTU1OSw3ICsxNTU5LDcgQEAKIEVYUE9SVF9TWU1CT0woc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOwogCiAvKiBHZW5lcmF0ZSBzZWN1cmUgc3RhcnRpbmcgcG9pbnQgZm9yIGVwaGVtZXJhbCBJUFY0IHRyYW5zcG9ydCBwb3J0IHNlYXJjaCAqLwotdTMyIHNlY3VyZV9pcHY0X3BvcnRfZXBoZW1lcmFsKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwgX191MTYgZHBvcnQpCit1MzIgc2VjdXJlX2lwdjRfcG9ydF9lcGhlbWVyYWwoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCkKIHsKIAlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOwogCXUzMiBoYXNoWzRdOwpAQCAtMTU2OCwyNSArMTU2OCwyNSBAQAogCSAqICBQaWNrIGEgdW5pcXVlIHN0YXJ0aW5nIG9mZnNldCBmb3IgZWFjaCBlcGhlbWVyYWwgcG9ydCBzZWFyY2gKIAkgKiAgKHNhZGRyLCBkYWRkciwgZHBvcnQpIGFuZCA0OGJpdHMgb2YgcmFuZG9tIGRhdGEuCiAJICovCi0JaGFzaFswXSA9IHNhZGRyOwotCWhhc2hbMV0gPSBkYWRkcjsKLQloYXNoWzJdID0gZHBvcnQgXiBrZXlwdHItPnNlY3JldFsxMF07CisJaGFzaFswXSA9IChfX2ZvcmNlIHUzMilzYWRkcjsKKwloYXNoWzFdID0gKF9fZm9yY2UgdTMyKWRhZGRyOworCWhhc2hbMl0gPSAoX19mb3JjZSB1MzIpZHBvcnQgXiBrZXlwdHItPnNlY3JldFsxMF07CiAJaGFzaFszXSA9IGtleXB0ci0+c2VjcmV0WzExXTsKIAogCXJldHVybiBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCi11MzIgc2VjdXJlX2lwdjZfcG9ydF9lcGhlbWVyYWwoY29uc3QgX191MzIgKnNhZGRyLCBjb25zdCBfX3UzMiAqZGFkZHIsIF9fdTE2IGRwb3J0KQordTMyIHNlY3VyZV9pcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fYmUzMiAqc2FkZHIsIGNvbnN0IF9fYmUzMiAqZGFkZHIsIF9fYmUxNiBkcG9ydCkKIHsKIAlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOwogCXUzMiBoYXNoWzEyXTsKIAogCW1lbWNweShoYXNoLCBzYWRkciwgMTYpOwotCWhhc2hbNF0gPSBkcG9ydDsKKwloYXNoWzRdID0gKF9fZm9yY2UgdTMyKWRwb3J0OwogCW1lbWNweSgmaGFzaFs1XSxrZXlwdHItPnNlY3JldCxzaXplb2YoX191MzIpICogNyk7CiAKLQlyZXR1cm4gdHdvdGhpcmRzTUQ0VHJhbnNmb3JtKGRhZGRyLCBoYXNoKTsKKwlyZXR1cm4gdHdvdGhpcmRzTUQ0VHJhbnNmb3JtKChjb25zdCBfX3UzMiAqKWRhZGRyLCBoYXNoKTsKIH0KICNlbmRpZgogCkBAIC0xNTk1LDE3ICsxNTk1LDE3IEBACiAgKiBiaXQncyAzMi00NyBpbmNyZWFzZSBldmVyeSBrZXkgZXhjaGFuZ2UKICAqICAgICAgIDAtMzEgIGhhc2goc291cmNlLCBkZXN0KQogICovCi11NjQgc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKLQkJCQlfX3UxNiBzcG9ydCwgX191MTYgZHBvcnQpCit1NjQgc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCV9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KQogewogCXN0cnVjdCB0aW1ldmFsIHR2OwogCXU2NCBzZXE7CiAJX191MzIgaGFzaFs0XTsKIAlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOwogCi0JaGFzaFswXSA9IHNhZGRyOwotCWhhc2hbMV0gPSBkYWRkcjsKLQloYXNoWzJdID0gKHNwb3J0IDw8IDE2KSArIGRwb3J0OworCWhhc2hbMF0gPSAoX19mb3JjZSB1MzIpc2FkZHI7CisJaGFzaFsxXSA9IChfX2ZvcmNlIHUzMilkYWRkcjsKKwloYXNoWzJdID0gKChfX2ZvcmNlIHUxNilzcG9ydCA8PCAxNikgKyAoX19mb3JjZSB1MTYpZHBvcnQ7CiAJaGFzaFszXSA9IGtleXB0ci0+c2VjcmV0WzExXTsKIAogCXNlcSA9IGhhbGZfbWQ0X3RyYW5zZm9ybShoYXNoLCBrZXlwdHItPnNlY3JldCk7CkBAIC0xNjQxLDcgKzE2NDEsNyBAQAogCSAqIGRyYWluIG9uIGl0KSwgYW5kIHVzZXMgaGFsZk1ENFRyYW5zZm9ybSB3aXRoaW4gdGhlIHNlY29uZC4gV2UKIAkgKiBhbHNvIG1peCBpdCB3aXRoIGppZmZpZXMgYW5kIHRoZSBQSUQ6CiAJICovCi0JcmV0dXJuIHNlY3VyZV9pcF9pZChjdXJyZW50LT5waWQgKyBqaWZmaWVzKTsKKwlyZXR1cm4gc2VjdXJlX2lwX2lkKChfX2ZvcmNlIF9fYmUzMikoY3VycmVudC0+cGlkICsgamlmZmllcykpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jhdy5jIGIvZHJpdmVycy9jaGFyL3Jhdy5jCmluZGV4IDg5YjcxOGUuLjNiMzIzMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYXcuYworKysgYi9kcml2ZXJzL2NoYXIvcmF3LmMKQEAgLTEyNyw5ICsxMjcsOSBAQAogCiBzdGF0aWMgdm9pZCBiaW5kX2RldmljZShzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0ICpycSkKIHsKLQljbGFzc19kZXZpY2VfZGVzdHJveShyYXdfY2xhc3MsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vcikpOwotCWNsYXNzX2RldmljZV9jcmVhdGUocmF3X2NsYXNzLCBOVUxMLCBNS0RFVihSQVdfTUFKT1IsIHJxLT5yYXdfbWlub3IpLAotCQkJCSAgICAgIE5VTEwsICJyYXclZCIsIHJxLT5yYXdfbWlub3IpOworCWRldmljZV9kZXN0cm95KHJhd19jbGFzcywgTUtERVYoUkFXX01BSk9SLCBycS0+cmF3X21pbm9yKSk7CisJZGV2aWNlX2NyZWF0ZShyYXdfY2xhc3MsIE5VTEwsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vciksCisJCSAgICAgICJyYXclZCIsIHJxLT5yYXdfbWlub3IpOwogfQogCiAvKgpAQCAtMjAwLDcgKzIwMCw3IEBACiAJCQlpZiAocnEuYmxvY2tfbWFqb3IgPT0gMCAmJiBycS5ibG9ja19taW5vciA9PSAwKSB7CiAJCQkJLyogdW5iaW5kICovCiAJCQkJcmF3ZGV2LT5iaW5kaW5nID0gTlVMTDsKLQkJCQljbGFzc19kZXZpY2VfZGVzdHJveShyYXdfY2xhc3MsCisJCQkJZGV2aWNlX2Rlc3Ryb3kocmF3X2NsYXNzLAogCQkJCQkJTUtERVYoUkFXX01BSk9SLCBycS5yYXdfbWlub3IpKTsKIAkJCX0gZWxzZSB7CiAJCQkJcmF3ZGV2LT5iaW5kaW5nID0gYmRnZXQoZGV2KTsKQEAgLTI4Myw3ICsyODMsNyBAQAogCQlyZXQgPSBQVFJfRVJSKHJhd19jbGFzcyk7CiAJCWdvdG8gZXJyb3JfcmVnaW9uOwogCX0KLQljbGFzc19kZXZpY2VfY3JlYXRlKHJhd19jbGFzcywgTlVMTCwgTUtERVYoUkFXX01BSk9SLCAwKSwgTlVMTCwgInJhd2N0bCIpOworCWRldmljZV9jcmVhdGUocmF3X2NsYXNzLCBOVUxMLCBNS0RFVihSQVdfTUFKT1IsIDApLCAicmF3Y3RsIik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjk1LDcgKzI5NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCByYXdfZXhpdCh2b2lkKQogewotCWNsYXNzX2RldmljZV9kZXN0cm95KHJhd19jbGFzcywgTUtERVYoUkFXX01BSk9SLCAwKSk7CisJZGV2aWNlX2Rlc3Ryb3kocmF3X2NsYXNzLCBNS0RFVihSQVdfTUFKT1IsIDApKTsKIAljbGFzc19kZXN0cm95KHJhd19jbGFzcyk7CiAJY2Rldl9kZWwoJnJhd19jZGV2KTsKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoUkFXX01BSk9SLCAwKSwgTUFYX1JBV19NSU5PUlMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKaW5kZXggNGRmNmFiMi4uMTY3ZWJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jCkBAIC05MjIsNyArOTIyLDcgQEAKICoqIAogKiogUGFja2V0IGlzIGFuIGFjdHVhbCBwYWNrZXQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBwYWNrZXQKICoqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4gWW91IG5lZWQgdG8gZmlsbCBpbiBldmVyeXRoaW5nLAotKiogYXMgdGhlIGNvbW1hbmQgcHJvY2Vzc29yZSBkb2Vzbid0IHByb2Nlc3MgdGhlIGNvbW1hbmQgcGFja2V0IGluIGFueSB3YXkuCisqKiBhcyB0aGUgY29tbWFuZCBwcm9jZXNzb3IgZG9lc24ndCBwcm9jZXNzIHRoZSBjb21tYW5kIHBhY2tldCBpbiBhbnkgd2F5LgogKiogCiAqKiBUaGUgUHJlRnVuY1AgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcGFja2V0IGlzIGVucXVldWVkIG9uIHRoZSBob3N0IHJ1cC4KICoqIFByZUZ1bmNQIGlzIGNhbGxlZCBhcyAoKlByZUZ1bmNQKShQcmVBcmcsIENtZEJsa1ApOy4gUHJlRnVuY1AgbXVzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYwppbmRleCA5OWYzZGYwLi4wNzk0ODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAqKiB3aGljaCB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gaW50byBtZW1vcnkuCiAqKiBDYWxsIHdpdGggb3Agc2V0IHRvIHplcm8gbWVhbnMgdGhhdCB0aGUgUkFNIHdpbGwgbm90IGJlIHJlYWQgYW5kIGNoZWNrZWQKICoqIGJlZm9yZSBpdCBpcyB3cml0dGVuLgotKiogQ2FsbCB3aXRoIG9wIG5vdCB6ZXJvLCBhbmQgdGhlIFJBTSB3aWxsIGJlIHJlYWQgYW5kIGNvbXBhdGVkIHdpdGggdmFsW29wLTFdCisqKiBDYWxsIHdpdGggb3Agbm90IHplcm8gYW5kIHRoZSBSQU0gd2lsbCBiZSByZWFkIGFuZCBjb21wYXJlZCB3aXRoIHZhbFtvcC0xXQogKiogdG8gY2hlY2sgdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBwaGFzZSB3YXMgcmV0YWluZWQuCiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMKaW5kZXggMTA2NmQ5Ny4uYmI0OThkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9wYXJhbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGFyYW0uYwpAQCAtODcsOCArODcsOCBAQAogKiogY29tbWFuZCBiaXQgc2V0IG9udG8gdGhlIHBvcnQuIFRoZSBjb21tYW5kIGJpdCBpcyBpbiB0aGUgbGVuIGZpZWxkLAogKiogYW5kIGdldHMgT1JlZCBpbiB3aXRoIHRoZSBhY3R1YWwgYnl0ZSBjb3VudC4KICoqCi0qKiBXaGVuIHlvdSBzZW5kIGEgcGFja2V0IHdpdGggdGhlIGNvbW1hbmQgYml0IHNldCwgdGhlbiB0aGUgZmlyc3QKLSoqIGRhdGEgYnl0ZSAoIGRhdGFbMF0gKSBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyoqIFdoZW4geW91IHNlbmQgYSBwYWNrZXQgd2l0aCB0aGUgY29tbWFuZCBiaXQgc2V0IHRoZSBmaXJzdAorKiogZGF0YSBieXRlIChkYXRhWzBdKSBpcyBpbnRlcnByZXRlZCBhcyB0aGUgY29tbWFuZCB0byBleGVjdXRlLgogKiogSXQgYWxzbyBnb3Zlcm5zIHdoYXQgZGF0YSBzdHJ1Y3R1cmUgb3ZlcmxheSBzaG91bGQgYWNjb21wYW55IHRoZSBwYWNrZXQuCiAqKiBDb21tYW5kcyBhcmUgZGVmaW5lZCBpbiBjaXJydXMvY2lycnVzLmgKICoqCkBAIC0xMDMsNyArMTAzLDcgQEAKICoqCiAqKiBNb3N0IGNvbW1hbmRzIGRvIG5vdCB1c2UgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgZGF0YSBhcnJheS4gVGhlCiAqKiBleGNlcHRpb25zIGFyZSBPUEVOIE1PUEVOIGFuZCBDT05GSUcuIChOQi4gQXMgd2l0aCB0aGUgU0kgQ09ORklHIGFuZAotKiogT1BFTiBhcmUgY3VycmVudGx5IGFuYWxhZ291cykuIFdpdGggdGhlc2UgdGhyZWUgY29tbWFuZHMgdGhlIGZvbGxvd2luZworKiogT1BFTiBhcmUgY3VycmVudGx5IGFuYWxvZ291cykuIFdpdGggdGhlc2UgdGhyZWUgY29tbWFuZHMgdGhlIGZvbGxvd2luZwogKiogMTEgZGF0YSBieXRlcyBhcmUgYWxsIHVzZWQgdG8gcGFzcyBjb25maWcgaW5mb3JtYXRpb24gc3VjaCBhcyBiYXVkIHJhdGUgZXRjLgogKiogVGhlIGZpZWxkcyBhcmUgYWxzbyBkZWZpbmVkIGluIGNpcnJ1cy5oLiBTb21lIGNvbnRhaW4gc3RyYWlnaHRmb3J3YXJkCiAqKiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSB0cmFuc21pdCBYT04gY2hhcmFjdGVyLiBUd28gY29udGFpbiB0aGUgdHJhbnNtaXQgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGxjbGsuYyBiL2RyaXZlcnMvY2hhci90bGNsay5jCmluZGV4IDI0NDRhMGUuLjI0NGQzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90bGNsay5jCisrKyBiL2RyaXZlcnMvY2hhci90bGNsay5jCkBAIC03OTIsMTUgKzc5MiwxNCBAQAogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnRsY2xrX21pc2NkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidGxjbGs6IG1pc2NfcmVnaXN0ZXIgcmV0dXJucyAlZC5cbiIsIHJldCk7Ci0JCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQzOwogCX0KIAogCXRsY2xrX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInRlbGNvX2Nsb2NrIiwKIAkJCQktMSwgTlVMTCwgMCk7Ci0JaWYgKCF0bGNsa19kZXZpY2UpIHsKKwlpZiAoSVNfRVJSKHRsY2xrX2RldmljZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ0bGNsazogcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZC5cbiIpOwotCQlyZXQgPSAtRUJVU1k7CisJCXJldCA9IFBUUl9FUlIodGxjbGtfZGV2aWNlKTsKIAkJZ290byBvdXQ0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKaW5kZXggNmFkMmQzYi4uNmUxMzI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC0xMTMwLDcgKzExMzAsNyBAQAogCXNjbnByaW50ZihkZXZuYW1lLCBERVZOQU1FX1NJWkUsICIlcyVkIiwgInRwbSIsIGNoaXAtPmRldl9udW0pOwogCWNoaXAtPnZlbmRvci5taXNjZGV2Lm5hbWUgPSBkZXZuYW1lOwogCi0JY2hpcC0+dmVuZG9yLm1pc2NkZXYuZGV2ID0gZGV2OworCWNoaXAtPnZlbmRvci5taXNjZGV2LnBhcmVudCA9IGRldjsKIAljaGlwLT5kZXYgPSBnZXRfZGV2aWNlKGRldik7CiAKIAlpZiAobWlzY19yZWdpc3RlcigmY2hpcC0+dmVuZG9yLm1pc2NkZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uaAppbmRleCAwNTBjZWQyLi5iYjlhNDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW8uYyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwppbmRleCBlOTBlYTM5Li41MGRjNDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCkBAIC0zNjEyLDcgKzM2MTIsOCBAQAogICoJCVRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGlmIHRoZXJlIGlzIG5vIGtub3duIHN0cnVjdCBkZXZpY2UKICAqCQlmb3IgdGhpcyB0dHkgZGV2aWNlIGl0IGNhbiBiZSBzZXQgdG8gTlVMTCBzYWZlbHkuCiAgKgotICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzIGRldmljZSAob3IgRVJSX1BUUigtRUZPTykgb24gZXJyb3IpLgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkZXZpY2UgZm9yIHRoaXMgdHR5IGRldmljZQorICoJKG9yIEVSUl9QVFIoLUVGT08pIG9uIGVycm9yKS4KICAqCiAgKglUaGlzIGNhbGwgaXMgcmVxdWlyZWQgdG8gYmUgbWFkZSB0byByZWdpc3RlciBhbiBpbmRpdmlkdWFsIHR0eSBkZXZpY2UKICAqCWlmIHRoZSB0dHkgZHJpdmVyJ3MgZmxhZ3MgaGF2ZSB0aGUgVFRZX0RSSVZFUl9EWU5BTUlDX0RFViBiaXQgc2V0LiAgSWYKQEAgLTM2MjIsOCArMzYyMyw4IEBACiAgKglMb2NraW5nOiA/PwogICovCiAKLXN0cnVjdCBjbGFzc19kZXZpY2UgKnR0eV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKLQkJCQkJIHVuc2lnbmVkIGluZGV4LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdHJ1Y3QgZGV2aWNlICp0dHlfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHVuc2lnbmVkIGluZGV4LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAljaGFyIG5hbWVbNjRdOwogCWRldl90IGRldiA9IE1LREVWKGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3Jfc3RhcnQpICsgaW5kZXg7CkBAIC0zNjM5LDcgKzM2NDAsNyBAQAogCWVsc2UKIAkJdHR5X2xpbmVfbmFtZShkcml2ZXIsIGluZGV4LCBuYW1lKTsKIAotCXJldHVybiBjbGFzc19kZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgZGV2LCBkZXZpY2UsICIlcyIsIG5hbWUpOworCXJldHVybiBkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgZGV2aWNlLCBkZXYsIG5hbWUpOwogfQogCiAvKioKQEAgLTM2NTUsNyArMzY1Niw3IEBACiAKIHZvaWQgdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHVuc2lnbmVkIGluZGV4KQogewotCWNsYXNzX2RldmljZV9kZXN0cm95KHR0eV9jbGFzcywgTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCkgKyBpbmRleCk7CisJZGV2aWNlX2Rlc3Ryb3kodHR5X2NsYXNzLCBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0KSArIGluZGV4KTsKIH0KIAogRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfZGV2aWNlKTsKQEAgLTM4OTUsMjAgKzM4OTYsMjAgQEAKIAlpZiAoY2Rldl9hZGQoJnR0eV9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDApLCAxKSB8fAogCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIDEsICIvZGV2L3R0eSIpIDwgMCkKIAkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvdHR5IGRyaXZlclxuIik7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIE5VTEwsICJ0dHkiKTsKKwlkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgInR0eSIpOwogCiAJY2Rldl9pbml0KCZjb25zb2xlX2NkZXYsICZjb25zb2xlX2ZvcHMpOwogCWlmIChjZGV2X2FkZCgmY29uc29sZV9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCAxKSB8fAogCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIDEsICIvZGV2L2NvbnNvbGUiKSA8IDApCiAJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L2NvbnNvbGUgZHJpdmVyXG4iKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAxKSwgTlVMTCwgImNvbnNvbGUiKTsKKwlkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAxKSwgImNvbnNvbGUiKTsKIAogI2lmZGVmIENPTkZJR19VTklYOThfUFRZUwogCWNkZXZfaW5pdCgmcHRteF9jZGV2LCAmcHRteF9mb3BzKTsKIAlpZiAoY2Rldl9hZGQoJnB0bXhfY2RldiwgTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgMSkgfHwKIAkgICAgcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCAxLCAiL2Rldi9wdG14IikgPCAwKQogCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgL2Rldi9wdG14IGRyaXZlclxuIik7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMiksIE5VTEwsICJwdG14Iik7CisJZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMiksICJwdG14Iik7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19WVApAQCAtMzkxNiw3ICszOTE3LDcgQEAKIAlpZiAoY2Rldl9hZGQoJnZjMF9jZGV2LCBNS0RFVihUVFlfTUFKT1IsIDApLCAxKSB8fAogCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWV9NQUpPUiwgMCksIDEsICIvZGV2L3ZjLzAiKSA8IDApCiAJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3R0eTAgZHJpdmVyXG4iKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZX01BSk9SLCAwKSwgTlVMTCwgInR0eTAiKTsKKwlkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZX01BSk9SLCAwKSwgInR0eTAiKTsKIAogCXZ0eV9pbml0KCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYyBiL2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYwppbmRleCBiZDdhOThjLi5mNDQyYjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMKKysrIGIvZHJpdmVycy9jaGFyL3ZjX3NjcmVlbi5jCkBAIC00NzYsMTYgKzQ3NiwxNiBAQAogCiB2b2lkIHZjc19tYWtlX3N5c2ZzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSksCi0JCQlOVUxMLCAidmNzJXUiLCB0dHktPmluZGV4ICsgMSk7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMTI5KSwKLQkJCU5VTEwsICJ2Y3NhJXUiLCB0dHktPmluZGV4ICsgMSk7CisJZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSksCisJCQkidmNzJXUiLCB0dHktPmluZGV4ICsgMSk7CisJZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMTI5KSwKKwkJCSJ2Y3NhJXUiLCB0dHktPmluZGV4ICsgMSk7CiB9CiAKIHZvaWQgdmNzX3JlbW92ZV9zeXNmcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCWNsYXNzX2RldmljZV9kZXN0cm95KHZjX2NsYXNzLCBNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxKSk7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3kodmNfY2xhc3MsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSkpOworCWRldmljZV9kZXN0cm95KHZjX2NsYXNzLCBNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxKSk7CisJZGV2aWNlX2Rlc3Ryb3kodmNfY2xhc3MsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSkpOwogfQogCiBpbnQgX19pbml0IHZjc19pbml0KHZvaWQpCkBAIC00OTQsNyArNDk0LDcgQEAKIAkJcGFuaWMoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIHZjcyBkZXZpY2UiLCBWQ1NfTUFKT1IpOwogCXZjX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidmMiKTsKIAotCWNsYXNzX2RldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgMCksIE5VTEwsICJ2Y3MiKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHZjX2NsYXNzLCBOVUxMLCBNS0RFVihWQ1NfTUFKT1IsIDEyOCksIE5VTEwsICJ2Y3NhIik7CisJZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCAwKSwgInZjcyIpOworCWRldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgMTI4KSwgInZjc2EiKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKaW5kZXggOGU0NDEzZi4uODc1ODdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RydWN0IGNvbl9kcml2ZXIgewogCWNvbnN0IHN0cnVjdCBjb25zdyAqY29uOwogCWNvbnN0IGNoYXIgKmRlc2M7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgbm9kZTsKIAlpbnQgZmlyc3Q7CiAJaW50IGxhc3Q7CkBAIC0zMDIzLDEwICszMDIzLDEwIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyAqLwogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9iaW5kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBiaW5kID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKIAogCWlmIChiaW5kKQpAQCAtMzAzNywxNyArMzAzNywxOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19iaW5kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgYmluZCA9IGNvbl9pc19ib3VuZChjb24tPmNvbik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgYmluZCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgY29uX2RyaXZlciAqY29uID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgY29uX2RyaXZlciAqY29uID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyAlc1xuIiwKIAkJCShjb24tPmZsYWcgJiBDT05fRFJJVkVSX0ZMQUdfTU9EVUxFKSA/ICIoTSkiIDogIihTKSIsCkBAIC0zMDU1LDQzICszMDU3LDQwIEBACiAKIH0KIAotc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGNsYXNzX2RldmljZV9hdHRyc1tdID0geworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldmljZV9hdHRyc1tdID0gewogCV9fQVRUUihiaW5kLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYmluZCwgc3RvcmVfYmluZCksCiAJX19BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCksCiB9OwogCi1zdGF0aWMgaW50IHZ0Y29uc29sZV9pbml0X2NsYXNzX2RldmljZShzdHJ1Y3QgY29uX2RyaXZlciAqY29uKQorc3RhdGljIGludCB2dGNvbnNvbGVfaW5pdF9kZXZpY2Uoc3RydWN0IGNvbl9kcml2ZXIgKmNvbikKIHsKIAlpbnQgaTsKIAlpbnQgZXJyb3IgPSAwOwogCiAJY29uLT5mbGFnIHw9IENPTl9EUklWRVJfRkxBR19BVFRSOwotCWNsYXNzX3NldF9kZXZkYXRhKGNvbi0+Y2xhc3NfZGV2LCBjb24pOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykgewotCQllcnJvciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjb24tPmNsYXNzX2RldiwKLQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCWRldl9zZXRfZHJ2ZGF0YShjb24tPmRldiwgY29uKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspIHsKKwkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoY29uLT5kZXYsICZkZXZpY2VfYXR0cnNbaV0pOwogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKIAl9CiAKIAlpZiAoZXJyb3IpIHsKIAkJd2hpbGUgKC0taSA+PSAwKQotCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNvbi0+Y2xhc3NfZGV2LAotCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoY29uLT5kZXYsICZkZXZpY2VfYXR0cnNbaV0pOwogCQljb24tPmZsYWcgJj0gfkNPTl9EUklWRVJfRkxBR19BVFRSOwogCX0KIAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIHZvaWQgdnRjb25zb2xlX2RlaW5pdF9jbGFzc19kZXZpY2Uoc3RydWN0IGNvbl9kcml2ZXIgKmNvbikKK3N0YXRpYyB2b2lkIHZ0Y29uc29sZV9kZWluaXRfZGV2aWNlKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCiB7CiAJaW50IGk7CiAKIAlpZiAoY29uLT5mbGFnICYgQ09OX0RSSVZFUl9GTEFHX0FUVFIpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKQotCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNvbi0+Y2xhc3NfZGV2LAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoY29uLT5kZXYsICZkZXZpY2VfYXR0cnNbaV0pOwogCQljb24tPmZsYWcgJj0gfkNPTl9EUklWRVJfRkxBR19BVFRSOwogCX0KIH0KQEAgLTMxNzksMTggKzMxNzgsMTcgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycjsKIAotCWNvbl9kcml2ZXItPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUodnRjb25zb2xlX2NsYXNzLCBOVUxMLAotCQkJCQkJICAgIE1LREVWKDAsIGNvbl9kcml2ZXItPm5vZGUpLAotCQkJCQkJICAgIE5VTEwsICJ2dGNvbiVpIiwKLQkJCQkJCSAgICBjb25fZHJpdmVyLT5ub2RlKTsKKwljb25fZHJpdmVyLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHZ0Y29uc29sZV9jbGFzcywgTlVMTCwKKwkJCQkJTUtERVYoMCwgY29uX2RyaXZlci0+bm9kZSksCisJCQkJCSJ2dGNvbiVpIiwgY29uX2RyaXZlci0+bm9kZSk7CiAKLQlpZiAoSVNfRVJSKGNvbl9kcml2ZXItPmNsYXNzX2RldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBjbGFzc19kZXZpY2UgZm9yICVzOyAiCisJaWYgKElTX0VSUihjb25fZHJpdmVyLT5kZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgZGV2aWNlIGZvciAlczsgIgogCQkgICAgICAgImVycm5vID0gJWxkXG4iLCBjb25fZHJpdmVyLT5kZXNjLAotCQkgICAgICAgUFRSX0VSUihjb25fZHJpdmVyLT5jbGFzc19kZXYpKTsKLQkJY29uX2RyaXZlci0+Y2xhc3NfZGV2ID0gTlVMTDsKKwkJICAgICAgIFBUUl9FUlIoY29uX2RyaXZlci0+ZGV2KSk7CisJCWNvbl9kcml2ZXItPmRldiA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJdnRjb25zb2xlX2luaXRfY2xhc3NfZGV2aWNlKGNvbl9kcml2ZXIpOworCQl2dGNvbnNvbGVfaW5pdF9kZXZpY2UoY29uX2RyaXZlcik7CiAJfQogCiBlcnI6CkBAIC0zMjI2LDEyICszMjI0LDEyIEBACiAKIAkJaWYgKGNvbl9kcml2ZXItPmNvbiA9PSBjc3cgJiYKIAkJICAgIGNvbl9kcml2ZXItPmZsYWcgJiBDT05fRFJJVkVSX0ZMQUdfTU9EVUxFKSB7Ci0JCQl2dGNvbnNvbGVfZGVpbml0X2NsYXNzX2RldmljZShjb25fZHJpdmVyKTsKLQkJCWNsYXNzX2RldmljZV9kZXN0cm95KHZ0Y29uc29sZV9jbGFzcywKLQkJCQkJICAgICBNS0RFVigwLCBjb25fZHJpdmVyLT5ub2RlKSk7CisJCQl2dGNvbnNvbGVfZGVpbml0X2RldmljZShjb25fZHJpdmVyKTsKKwkJCWRldmljZV9kZXN0cm95KHZ0Y29uc29sZV9jbGFzcywKKwkJCQkgICAgICAgTUtERVYoMCwgY29uX2RyaXZlci0+bm9kZSkpOwogCQkJY29uX2RyaXZlci0+Y29uID0gTlVMTDsKIAkJCWNvbl9kcml2ZXItPmRlc2MgPSBOVUxMOwotCQkJY29uX2RyaXZlci0+Y2xhc3NfZGV2ID0gTlVMTDsKKwkJCWNvbl9kcml2ZXItPmRldiA9IE5VTEw7CiAJCQljb25fZHJpdmVyLT5ub2RlID0gMDsKIAkJCWNvbl9kcml2ZXItPmZsYWcgPSAwOwogCQkJY29uX2RyaXZlci0+Zmlyc3QgPSAwOwpAQCAtMzI4OSwxOSArMzI4NywxOCBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OX0RSSVZFUjsgaSsrKSB7CiAJCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSAmcmVnaXN0ZXJlZF9jb25fZHJpdmVyW2ldOwogCi0JCWlmIChjb24tPmNvbiAmJiAhY29uLT5jbGFzc19kZXYpIHsKLQkJCWNvbi0+Y2xhc3NfZGV2ID0KLQkJCQljbGFzc19kZXZpY2VfY3JlYXRlKHZ0Y29uc29sZV9jbGFzcywgTlVMTCwKLQkJCQkJCSAgICBNS0RFVigwLCBjb24tPm5vZGUpLCBOVUxMLAotCQkJCQkJICAgICJ2dGNvbiVpIiwgY29uLT5ub2RlKTsKKwkJaWYgKGNvbi0+Y29uICYmICFjb24tPmRldikgeworCQkJY29uLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHZ0Y29uc29sZV9jbGFzcywgTlVMTCwKKwkJCQkJCSBNS0RFVigwLCBjb24tPm5vZGUpLAorCQkJCQkJICJ2dGNvbiVpIiwgY29uLT5ub2RlKTsKIAotCQkJaWYgKElTX0VSUihjb24tPmNsYXNzX2RldikpIHsKKwkJCWlmIChJU19FUlIoY29uLT5kZXYpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSAiCi0JCQkJICAgICAgICJjbGFzc19kZXZpY2UgZm9yICVzOyBlcnJubyA9ICVsZFxuIiwKLQkJCQkgICAgICAgY29uLT5kZXNjLCBQVFJfRVJSKGNvbi0+Y2xhc3NfZGV2KSk7Ci0JCQkJY29uLT5jbGFzc19kZXYgPSBOVUxMOworCQkJCSAgICAgICAiZGV2aWNlIGZvciAlczsgZXJybm8gPSAlbGRcbiIsCisJCQkJICAgICAgIGNvbi0+ZGVzYywgUFRSX0VSUihjb24tPmRldikpOworCQkJCWNvbi0+ZGV2ID0gTlVMTDsKIAkJCX0gZWxzZSB7Ci0JCQkJdnRjb25zb2xlX2luaXRfY2xhc3NfZGV2aWNlKGNvbik7CisJCQkJdnRjb25zb2xlX2luaXRfZGV2aWNlKGNvbik7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCmluZGV4IDAxODdiMTEuLmVhMDlkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCkBAIC0zNDAsNiArMzQwLDE0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpVENPX3dkdC4KIAorY29uZmlnIElUQ09fVkVORE9SX1NVUFBPUlQKKwlib29sICJJbnRlbCBUQ08gVGltZXIvV2F0Y2hkb2cgU3BlY2lmaWMgVmVuZG9yIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBJVENPX1dEVAorCS0tLWhlbHAtLS0KKwkgIEFkZCB2ZW5kb3Igc3BlY2lmaWMgc3VwcG9ydCB0byB0aGUgaW50ZWwgVENPIHRpbWVyIGJhc2VkIHdhdGNoZG9nCisJICBkZXZpY2VzLiBBdCB0aGlzIG1vbWVudCB3ZSBvbmx5IGhhdmUgYWRkaXRpb25hbCBzdXBwb3J0IGZvciBzb21lCisJICBTdXBlck1pY3JvIEluYy4gbW90aGVyYm9hcmRzLgorCiBjb25maWcgU0MxMjAwX1dEVAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczMDcvUEM5NzMwNyAoYWxhIFNDMTIwMCkgV2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKQEAgLTM2Myw2ICszNzEsMjAgQEAKIAogCSAgSWYgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHNjeDIwMF93ZHQuCiAKK2NvbmZpZyBQQzg3NDEzX1dEVAorCXRyaXN0YXRlICJOUyBQQzg3NDEzIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIFBDODc0MTMgY2hpcHNldAorCSAgVGhpcyB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndAorCSAgZnJlZXplLCBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbgorCSAgYW1vdW50IG9mIHRpbWUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjODc0MTNfd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorIAogY29uZmlnIDYwWFhfV0RUCiAJdHJpc3RhdGUgIlNCQy02MFhYIFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CkBAIC01NTMsNiArNTc1LDE2IEBACiAJICB0aW1lciBleHBpcmVkIGFuZCBubyBwcm9jZXNzIGhhcyB3cml0dGVuIHRvIC9kZXYvd2F0Y2hkb2cgZHVyaW5nCiAJICB0aGF0IHRpbWUuCiAKK2NvbmZpZyBXRFRfUk05S19HUEkKKwl0cmlzdGF0ZSAiUk05MDAwL0dQSSBoYXJkd2FyZSB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIENQVV9STTkwMDAKKwloZWxwCisJICBXYXRjaGRvZyBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgR1BJIGhhcmR3YXJlIGZvdW5kIG9uCisJICBQTUMtU2llcnJhIFJNOXh4eCBDUFVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBybTlrX3dkdC4KKwogIyBTMzkwIEFyY2hpdGVjdHVyZQogCiBjb25maWcgWlZNX1dBVENIRE9HCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggMzY0NDA0OS4uMmNkOGZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQpAQCAtNDcsOSArNDcsMTAgQEAKIG9iai0kKENPTkZJR19XQUZFUl9XRFQpICs9IHdhZmVyNTgyM3dkdC5vCiBvYmotJChDT05GSUdfSTYzMDBFU0JfV0RUKSArPSBpNjMwMGVzYi5vCiBvYmotJChDT05GSUdfSThYWF9UQ08pICs9IGk4eHhfdGNvLm8KLW9iai0kKENPTkZJR19JVENPX1dEVCkgKz0gaVRDT193ZHQubworb2JqLSQoQ09ORklHX0lUQ09fV0RUKSArPSBpVENPX3dkdC5vIGlUQ09fdmVuZG9yX3N1cHBvcnQubwogb2JqLSQoQ09ORklHX1NDMTIwMF9XRFQpICs9IHNjMTIwMHdkdC5vCiBvYmotJChDT05GSUdfU0N4MjAwX1dEVCkgKz0gc2N4MjAwX3dkdC5vCitvYmotJChDT05GSUdfUEM4NzQxM19XRFQpICs9IHBjODc0MTNfd2R0Lm8KIG9iai0kKENPTkZJR182MFhYX1dEVCkgKz0gc2JjNjB4eHdkdC5vCiBvYmotJChDT05GSUdfU0JDODM2MF9XRFQpICs9IHNiYzgzNjAubwogb2JqLSQoQ09ORklHX0NQVTVfV0RUKSArPSBjcHU1d2R0Lm8KQEAgLTcyLDYgKzczLDcgQEAKIAogIyBNSVBTIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHX0lORFlET0cpICs9IGluZHlkb2cubworb2JqLSQoQ09ORklHX1dEVF9STTlLX0dQSSkgKz0gcm05a193ZHQubwogCiAjIFMzOTAgQXJjaGl0ZWN0dXJlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3ZlbmRvcl9zdXBwb3J0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT192ZW5kb3Jfc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTA4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT192ZW5kb3Jfc3VwcG9ydC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICoJaW50ZWwgVENPIHZlbmRvciBzcGVjaWZpYyB3YXRjaGRvZyBkcml2ZXIgc3VwcG9ydAorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwNiBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgV2ltIFZhbiBTZWJyb2VjayBub3IgSWd1YW5hIHZ6dy4gYWRtaXQgbGlhYmlsaXR5IG5vcgorICoJcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqCXByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisvKgorICoJSW5jbHVkZXMsIGRlZmluZXMsIHZhcmlhYmxlcywgbW9kdWxlIHBhcmFtZXRlcnMsIC4uLgorICovCisKKy8qIE1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBEUlZfTkFNRSAgICAgICAgImlUQ09fdmVuZG9yX3N1cHBvcnQiCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICAiMS4wMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUgICAgICIxMS1Ob3YtMjAwNiIKKyNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCisKKy8qIEluY2x1ZGVzICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CQkvKiBGb3IgbW9kdWxlIHNwZWNpZmljIGl0ZW1zICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4JCS8qIEZvciBuZXcgbW9kdWxlcGFyYW0ncyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkvKiBGb3Igc3RhbmRhcmQgdHlwZXMgKGxpa2Ugc2l6ZV90KSAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CQkvKiBGb3IgdGhlIC1FTk9ERVYvLi4uIHZhbHVlcyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkJLyogRm9yIHByaW50ay9wYW5pYy8uLi4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkJLyogRm9yIF9faW5pdC9fX2V4aXQvLi4uICovCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CQkvKiBGb3IgaW8tcG9ydCBhY2Nlc3MgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgkJCS8qIEZvciBpbmIvb3V0Yi8uLi4gKi8KKworLyogaVRDTyBkZWZpbmVzICovCisjZGVmaW5lCVNNSV9FTgkJYWNwaWJhc2UgKyAweDMwCS8qIFNNSSBDb250cm9sIGFuZCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVENPQkFTRQkJYWNwaWJhc2UgKyAweDYwCS8qIFRDTyBiYXNlIGFkZHJlc3MJCSovCisjZGVmaW5lCVRDTzFfU1RTCVRDT0JBU0UgKyAweDA0CS8qIFRDTzEgU3RhdHVzIFJlZ2lzdGVyCQkqLworCisvKiBMaXN0IG9mIHZlbmRvciBzdXBwb3J0IG1vZGVzICovCisjZGVmaW5lIFNVUEVSTUlDUk9fT0xEX0JPQVJECTEJLyogU3VwZXJNaWNybyBQZW50aXVtIDMgRXJhIDM3MFNTRSstT0VNMS9QM1RTU0UgKi8KKyNkZWZpbmUgU1VQRVJNSUNST19ORVdfQk9BUkQJMgkvKiBTdXBlck1pY3JvIFBlbnRpdW0gNCAvIFhlb24gNCAvIEVNVDY0VCBFcmEgU3lzdGVtcyAqLworCitzdGF0aWMgaW50IHZlbmRvcnN1cHBvcnQgPSAwOworbW9kdWxlX3BhcmFtKHZlbmRvcnN1cHBvcnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZlbmRvcnN1cHBvcnQsICJpVENPIHZlbmRvciBzcGVjaWZpYyBzdXBwb3J0IG1vZGUsIGRlZmF1bHQ9MCAobm9uZSksIDE9U3VwZXJNaWNybyBQZW50MywgMj1TdXBlck1pY3JvIFBlbnQ0KyIpOworCisvKgorICoJVmVuZG9yIFNwZWNpZmljIFN1cHBvcnQKKyAqLworCisvKgorICoJVmVuZG9yIFN1cHBvcnQ6IDEKKyAqCUJvYXJkOiBTdXBlciBNaWNybyBDb21wdXRlciBJbmMuIDM3MFNTRSstT0VNMS9QM1RTU0UKKyAqCWlUQ08gY2hpcHNldDogSUNIMgorICoKKyAqCUNvZGUgY29udHJpYnV0ZWQgYnk6IFIuIFNlcmV0bnkgPGxrcGF0Y2hlc0BwYXlwYy5jb20+CisgKglEb2N1bWVudGF0aW9uIG9idGFpbmVkIGJ5IFIuIFNlcmV0bnkgZnJvbSBTdXBlck1pY3JvIFRlY2huaWNhbCBTdXBwb3J0CisgKgorICoJVG8gZW5hYmxlIFdhdGNoZG9nIGZ1bmN0aW9uOgorICoJICAgIEJJT1Mgc2V0dXAgLT4gUG93ZXIgLT4gVENPIExvZ2ljIFNNSSBFbmFibGUgLT4gV2l0aGluNU1pbnV0ZXMKKyAqCSAgICBUaGlzIHNldHRpbmcgZW5hYmxlcyBTTUkgdG8gY2xlYXIgdGhlIHdhdGNoZG9nIGV4cGlyZWQgZmxhZy4KKyAqCSAgICBJZiBCSU9TIG9yIENQVSBmYWlsIHdoaWNoIG1heSBjYXVzZSBTTUkgaGFuZywgdGhlbiBzeXN0ZW0gd2lsbAorICoJICAgIHJlYm9vdC4gV2hlbiBhcHBsaWNhdGlvbiBzdGFydHMgdG8gdXNlIHdhdGNoZG9nIGZ1bmN0aW9uLAorICoJICAgIGFwcGxpY2F0aW9uIGhhcyB0byB0YWtlIG92ZXIgdGhlIGNvbnRyb2wgZnJvbSBTTUkuCisgKgorICoJICAgIEZvciBQM1RTU0UsIEozNiBqdW1wZXIgbmVlZHMgdG8gYmUgcmVtb3ZlZCB0byBlbmFibGUgdGhlIFdhdGNoZG9nCisgKgkgICAgZnVuY3Rpb24uCisgKgorICoJICAgIE5vdGU6IFRoZSBzeXN0ZW0gd2lsbCByZWJvb3Qgd2hlbiBFeHBpcmUgRmxhZyBpcyBzZXQgVFdJQ0UuCisgKgkgICAgU28sIGlmIHRoZSB3YXRjaGRvZyB0aW1lciBpcyAyMCBzZWNvbmRzLCB0aGVuIHRoZSBtYXhpbXVtIGhhbmcKKyAqCSAgICB0aW1lIGlzIGFib3V0IDQwIHNlY29uZHMsIGFuZCB0aGUgbWluaW11bSBoYW5nIHRpbWUgaXMgYWJvdXQKKyAqCSAgICAyMC42IHNlY29uZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3VwZXJtaWNyb19vbGRfcHJlX3N0YXJ0KHVuc2lnbmVkIGxvbmcgYWNwaWJhc2UpCit7CisJdW5zaWduZWQgbG9uZyB2YWwzMjsKKworCXZhbDMyID0gaW5sKFNNSV9FTik7CisJdmFsMzIgJj0gMHhmZmZmZGZmZjsJLyogVHVybiBvZmYgU01JIGNsZWFyaW5nIHdhdGNoZG9nICovCisJb3V0bCh2YWwzMiwgU01JX0VOKTsJLyogTmVlZGVkIHRvIGFjdGl2YXRlIHdhdGNoZG9nICovCit9CisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fb2xkX3ByZV9zdG9wKHVuc2lnbmVkIGxvbmcgYWNwaWJhc2UpCit7CisJdW5zaWduZWQgbG9uZyB2YWwzMjsKKworCXZhbDMyID0gaW5sKFNNSV9FTik7CisJdmFsMzIgJj0gMHgwMDAwMjAwMDsJLyogVHVybiBvbiBTTUkgY2xlYXJpbmcgd2F0Y2hkb2cgKi8KKwlvdXRsKHZhbDMyLCBTTUlfRU4pOwkvKiBOZWVkZWQgdG8gZGVhY3RpdmF0ZSB3YXRjaGRvZyAqLworfQorCitzdGF0aWMgdm9pZCBzdXBlcm1pY3JvX29sZF9wcmVfa2VlcGFsaXZlKHVuc2lnbmVkIGxvbmcgYWNwaWJhc2UpCit7CisJLyogUmVsb2FkIFRDTyBUaW1lciAoZG9uZSBpbiBpVENPX3dkdF9rZWVwYWxpdmUpICsgKi8KKwkvKiBDbGVhciAiRXhwaXJlIEZsYWciIChCaXQgMyBvZiBUQzAxX1NUUyByZWdpc3RlcikgKi8KKwlvdXRiKDB4MDgsIFRDTzFfU1RTKTsKK30KKworLyoKKyAqCVZlbmRvciBTdXBwb3J0OiAyCisgKglCb2FyZDogU3VwZXIgTWljcm8gQ29tcHV0ZXIgSW5jLiBQNFNCeCwgUDREUHgKKyAqCWlUQ08gY2hpcHNldDogSUNINAorICoKKyAqCUNvZGUgY29udHJpYnV0ZWQgYnk6IFIuIFNlcmV0bnkgPGxrcGF0Y2hlc0BwYXlwYy5jb20+CisgKglEb2N1bWVudGF0aW9uIG9idGFpbmVkIGJ5IFIuIFNlcmV0bnkgZnJvbSBTdXBlck1pY3JvIFRlY2huaWNhbCBTdXBwb3J0CisgKgorICoJVG8gZW5hYmxlIFdhdGNoZG9nIGZ1bmN0aW9uOgorICoJIDEuIEJJT1MKKyAqCSAgRm9yIFA0U0J4OgorICoJICBCSU9TIHNldHVwIC0+IEFkdmFuY2VkIC0+IEludGVncmF0ZWQgUGVyaXBoZXJhbHMgLT4gV2F0Y2ggRG9nIEZlYXR1cmUKKyAqCSAgRm9yIFA0RFB4OgorICoJICBCSU9TIHNldHVwIC0+IEFkdmFuY2VkIC0+IEkvTyBEZXZpY2UgQ29uZmlndXJhdGlvbiAtPiBXYXRjaCBEb2cKKyAqCSBUaGlzIHNldHRpbmcgZW5hYmxlcyBvciBkaXNhYmxlcyBXYXRjaGRvZyBmdW5jdGlvbi4gV2hlbiBlbmFibGVkLCB0aGUKKyAqCSBkZWZhdWx0IHdhdGNoZG9nIHRpbWVyIGlzIHNldCB0byBiZSA1IG1pbnV0ZXMgKGFib3V0IDTigJkzNeKAnSkuIEl0IGlzCisgKgkgZW5vdWdoIHRvIGxvYWQgYW5kIHJ1biB0aGUgT1MuIFRoZSBhcHBsaWNhdGlvbiAoc2VydmljZSBvciBkcml2ZXIpIGhhcworICoJIHRvIHRha2Ugb3ZlciB0aGUgY29udHJvbCBvbmNlIE9TIGlzIHJ1bm5pbmcgdXAgYW5kIGJlZm9yZSB3YXRjaGRvZworICoJIGV4cGlyZXMuCisgKgorICoJIDIuIEpVTVBFUgorICoJICBGb3IgUDRTQng6IEpQMzkKKyAqCSAgRm9yIFA0RFB4OiBKUDM3CisgKgkgIFRoaXMganVtcGVyIGlzIHVzZWQgZm9yIHNhZmV0eS4gIENsb3NlZCBpcyBlbmFibGVkLiBUaGlzIGp1bXBlcgorICoJICBwcmV2ZW50cyB1c2VyIGVuYWJsZXMgd2F0Y2hkb2cgaW4gQklPUyBieSBhY2NpZGVudC4KKyAqCisgKgkgVG8gZW5hYmxlIFdhdGNoIERvZyBmdW5jdGlvbiwgYm90aCBCSU9TIGFuZCBKVU1QRVIgbXVzdCBiZSBlbmFibGVkLgorICoKKyAqCVRoZSBkb2N1bWVudGF0aW9uIGxpc3RzIG1vdGhlcmJvYXJkcyBQNFNCeCBhbmQgUDREUHggc2VyaWVzIGFzIG9mCisgKgkyMC1NYXJjaC0yMDAyLiBIb3dldmVyLCB0aGlzIGNvZGUgd29ya3MgZmxhd2xlc3NseSB3aXRoIG11Y2ggbmV3ZXIKKyAqCW1vdGhlcmJvYXJkcywgc3VjaCBhcyBteSBYNkRIUi04RzIgKFN1cGVyU2VydmVyIDYwMTRILTgyKS4KKyAqCisgKglUaGUgb3JpZ2luYWwgaVRDTyBkcml2ZXIgYXMgd3JpdHRlbiBkb2VzIG5vdCBhY3R1YWxseSByZXNldCB0aGUKKyAqCXdhdGNoZG9nIHRpbWVyIG9uIHRoZXNlIG1hY2hpbmVzLCBhcyBhIHJlc3VsdCB0aGV5IHJlYm9vdCBhZnRlciBmaXZlCisgKgltaW51dGVzLgorICoKKyAqCU5PVEU6IFlvdSBtYXkgbGVhdmUgdGhlIFdhdGNoZG9nIGZ1bmN0aW9uIGRpc2FibGVkIGluIHRoZSBTdXBlck1pY3JvCisgKglCSU9TIHRvIGF2b2lkIGEgImJvb3QtcmFjZSIuLi4gVGhpcyBkcml2ZXIgd2lsbCBlbmFibGUgd2F0Y2hkb2cKKyAqCWZ1bmN0aW9uYWxpdHkgZXZlbiBpZiBpdCdzIGRpc2FibGVkIGluIHRoZSBCSU9TIG9uY2UgdGhlIC9kZXYvd2F0Y2hkb2cKKyAqCWZpbGUgaXMgb3BlbmVkLgorICovCisKKy8qIEkvTyBQb3J0J3MgKi8KKyNkZWZpbmUgU01fUkVHSU5ERVgJMHgyZQkJLyogU3VwZXJNaWNybyBJQ0g0KyBSZWdpc3RlciBJbmRleCAqLworI2RlZmluZSBTTV9EQVRBSU8JMHgyZgkJLyogU3VwZXJNaWNybyBJQ0g0KyBSZWdpc3RlciBEYXRhIEkvTyAqLworCisvKiBDb250cm9sIFJlZ2lzdGVyJ3MgKi8KKyNkZWZpbmUgU01fQ1RMUEFHRVNXCTB4MDcJCS8qIFN1cGVyTWljcm8gSUNINCsgQ29udHJvbCBQYWdlIFN3aXRjaCAqLworI2RlZmluZSBTTV9DVExQQUdFCQkweDA4CS8qIFN1cGVyTWljcm8gSUNINCsgQ29udHJvbCBQYWdlIE51bSAqLworCisjZGVmaW5lIFNNX1dBVENIRU5BQkxFCTB4MzAJCS8qIFdhdGNoZG9nIGVuYWJsZTogQml0IDA6IDA9b2ZmLCAxPW9uICovCisKKyNkZWZpbmUgU01fV0FUQ0hQQUdFCTB4ODcJCS8qIFdhdGNoZG9nIHVubG9jayBjb250cm9sIHBhZ2UgKi8KKworI2RlZmluZSBTTV9FTkRXQVRDSAkweEFBCQkvKiBXYXRjaGRvZyBsb2NrIGNvbnRyb2wgcGFnZSAqLworCisjZGVmaW5lIFNNX0NPVU5UTU9ERQkweGY1CQkvKiBXYXRjaGRvZyBjb3VudCBtb2RlIHNlbGVjdCAqLworCQkJCQkvKiAoQml0IDM6IDAgPSBzZWNvbmRzLCAxID0gbWludXRlcyAqLworCisjZGVmaW5lIFNNX1dBVENIVElNRVIJMHhmNgkJLyogOC1iaXRzLCBXYXRjaGRvZyB0aW1lciBjb3VudGVyIChSVykgKi8KKworI2RlZmluZSBTTV9SRVNFVENPTlRST0wJMHhmNwkJLyogV2F0Y2hkb2cgcmVzZXQgY29udHJvbCAqLworCQkJCQkvKiBCaXQgNjogdGltZXIgaXMgcmVzZXQgYnkga2JkIGludGVycnVwdCAqLworCQkJCQkvKiBCaXQgNzogdGltZXIgaXMgcmVzZXQgYnkgbW91c2UgaW50ZXJydXB0ICovCisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fbmV3X3VubG9ja193YXRjaGRvZyh2b2lkKQoreworCW91dGIoU01fV0FUQ0hQQUdFLCBTTV9SRUdJTkRFWCk7CS8qIFdyaXRlIDB4ODcgdG8gcG9ydCAweDJlIHR3aWNlICovCisJb3V0YihTTV9XQVRDSFBBR0UsIFNNX1JFR0lOREVYKTsKKworCW91dGIoU01fQ1RMUEFHRVNXLCBTTV9SRUdJTkRFWCk7CS8qIFN3aXRjaCB0byB3YXRjaGRvZyBjb250cm9sIHBhZ2UgKi8KKwlvdXRiKFNNX0NUTFBBR0UsIFNNX0RBVEFJTyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fbmV3X2xvY2tfd2F0Y2hkb2codm9pZCkKK3sKKwlvdXRiKFNNX0VORFdBVENILCBTTV9SRUdJTkRFWCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fbmV3X3ByZV9zdGFydCh1bnNpZ25lZCBpbnQgaGVhcnRiZWF0KQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzdXBlcm1pY3JvX25ld191bmxvY2tfd2F0Y2hkb2coKTsKKworCS8qIFdhdGNoZG9nIHRpbWVyIHNldHRpbmcgbmVlZHMgdG8gYmUgaW4gc2Vjb25kcyovCisJb3V0YihTTV9DT1VOVE1PREUsIFNNX1JFR0lOREVYKTsKKwl2YWwgPSBpbmIoU01fREFUQUlPKTsKKwl2YWwgJj0gMHhGNzsKKwlvdXRiKHZhbCwgU01fREFUQUlPKTsKKworCS8qIFdyaXRlIGhlYXJ0YmVhdCBpbnRlcnZhbCB0byBXRE9HICovCisJb3V0YiAoU01fV0FUQ0hUSU1FUiwgU01fUkVHSU5ERVgpOworCW91dGIoKGhlYXJ0YmVhdCAmIDI1NSksIFNNX0RBVEFJTyk7CisKKwkvKiBNYWtlIHN1cmUga2V5Ym9hcmQvbW91c2UgaW50ZXJydXB0cyBkb24ndCBpbnRlcmZlcmUgKi8KKwlvdXRiKFNNX1JFU0VUQ09OVFJPTCwgU01fUkVHSU5ERVgpOworCXZhbCA9IGluYihTTV9EQVRBSU8pOworCXZhbCAmPSAweDNmOworCW91dGIodmFsLCBTTV9EQVRBSU8pOworCisJLyogZW5hYmxlIHdhdGNoZG9nIGJ5IHNldHRpbmcgYml0IDAgb2YgV2F0Y2hkb2cgRW5hYmxlIHRvIDEgKi8KKwlvdXRiKFNNX1dBVENIRU5BQkxFLCBTTV9SRUdJTkRFWCk7CisJdmFsID0gaW5iKFNNX0RBVEFJTyk7CisJdmFsIHw9IDB4MDE7CisJb3V0Yih2YWwsIFNNX0RBVEFJTyk7CisKKwlzdXBlcm1pY3JvX25ld19sb2NrX3dhdGNoZG9nKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fbmV3X3ByZV9zdG9wKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXN1cGVybWljcm9fbmV3X3VubG9ja193YXRjaGRvZygpOworCisJLyogZGlzYWJsZSB3YXRjaGRvZyBieSBzZXR0aW5nIGJpdCAwIG9mIFdhdGNoZG9nIEVuYWJsZSB0byAwICovCisJb3V0YihTTV9XQVRDSEVOQUJMRSwgU01fUkVHSU5ERVgpOworCXZhbCA9IGluYihTTV9EQVRBSU8pOworCXZhbCAmPSAweEZFOworCW91dGIodmFsLCBTTV9EQVRBSU8pOworCisJc3VwZXJtaWNyb19uZXdfbG9ja193YXRjaGRvZygpOworfQorCitzdGF0aWMgdm9pZCBzdXBlcm1pY3JvX25ld19wcmVfc2V0X2hlYXJ0YmVhdCh1bnNpZ25lZCBpbnQgaGVhcnRiZWF0KQoreworCXN1cGVybWljcm9fbmV3X3VubG9ja193YXRjaGRvZygpOworCisJLyogcmVzZXQgd2F0Y2hkb2cgdGltZW91dCB0byBoZWFydHZlYXQgdmFsdWUgKi8KKwlvdXRiKFNNX1dBVENIVElNRVIsIFNNX1JFR0lOREVYKTsKKwlvdXRiKChoZWFydGJlYXQgJiAyNTUpLCBTTV9EQVRBSU8pOworCisJc3VwZXJtaWNyb19uZXdfbG9ja193YXRjaGRvZygpOworfQorCisvKgorICoJR2VuZXJpYyBTdXBwb3J0IEZ1bmN0aW9ucworICovCisKK3ZvaWQgaVRDT192ZW5kb3JfcHJlX3N0YXJ0KHVuc2lnbmVkIGxvbmcgYWNwaWJhc2UsCisJCQkgICB1bnNpZ25lZCBpbnQgaGVhcnRiZWF0KQoreworCWlmICh2ZW5kb3JzdXBwb3J0ID09IFNVUEVSTUlDUk9fT0xEX0JPQVJEKQorCQlzdXBlcm1pY3JvX29sZF9wcmVfc3RhcnQoYWNwaWJhc2UpOworCWVsc2UgaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19ORVdfQk9BUkQpCisJCXN1cGVybWljcm9fbmV3X3ByZV9zdGFydChoZWFydGJlYXQpOworfQorRVhQT1JUX1NZTUJPTChpVENPX3ZlbmRvcl9wcmVfc3RhcnQpOworCit2b2lkIGlUQ09fdmVuZG9yX3ByZV9zdG9wKHVuc2lnbmVkIGxvbmcgYWNwaWJhc2UpCit7CisJaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19PTERfQk9BUkQpCisJCXN1cGVybWljcm9fb2xkX3ByZV9zdG9wKGFjcGliYXNlKTsKKwllbHNlIGlmICh2ZW5kb3JzdXBwb3J0ID09IFNVUEVSTUlDUk9fTkVXX0JPQVJEKQorCQlzdXBlcm1pY3JvX25ld19wcmVfc3RvcCgpOworfQorRVhQT1JUX1NZTUJPTChpVENPX3ZlbmRvcl9wcmVfc3RvcCk7CisKK3ZvaWQgaVRDT192ZW5kb3JfcHJlX2tlZXBhbGl2ZSh1bnNpZ25lZCBsb25nIGFjcGliYXNlLCB1bnNpZ25lZCBpbnQgaGVhcnRiZWF0KQoreworCWlmICh2ZW5kb3JzdXBwb3J0ID09IFNVUEVSTUlDUk9fT0xEX0JPQVJEKQorCQlzdXBlcm1pY3JvX29sZF9wcmVfa2VlcGFsaXZlKGFjcGliYXNlKTsKKwllbHNlIGlmICh2ZW5kb3JzdXBwb3J0ID09IFNVUEVSTUlDUk9fTkVXX0JPQVJEKQorCQlzdXBlcm1pY3JvX25ld19wcmVfc2V0X2hlYXJ0YmVhdChoZWFydGJlYXQpOworfQorRVhQT1JUX1NZTUJPTChpVENPX3ZlbmRvcl9wcmVfa2VlcGFsaXZlKTsKKwordm9pZCBpVENPX3ZlbmRvcl9wcmVfc2V0X2hlYXJ0YmVhdCh1bnNpZ25lZCBpbnQgaGVhcnRiZWF0KQoreworCWlmICh2ZW5kb3JzdXBwb3J0ID09IFNVUEVSTUlDUk9fTkVXX0JPQVJEKQorCQlzdXBlcm1pY3JvX25ld19wcmVfc2V0X2hlYXJ0YmVhdChoZWFydGJlYXQpOworfQorRVhQT1JUX1NZTUJPTChpVENPX3ZlbmRvcl9wcmVfc2V0X2hlYXJ0YmVhdCk7CisKK2ludCBpVENPX3ZlbmRvcl9jaGVja19ub3JlYm9vdF9vbih2b2lkKQoreworCXN3aXRjaCh2ZW5kb3JzdXBwb3J0KSB7CisJY2FzZSBTVVBFUk1JQ1JPX09MRF9CT0FSRDoKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorRVhQT1JUX1NZTUJPTChpVENPX3ZlbmRvcl9jaGVja19ub3JlYm9vdF9vbik7CisKK3N0YXRpYyBpbnQgX19pbml0IGlUQ09fdmVuZG9yX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ2ZW5kb3Itc3VwcG9ydD0lZFxuIiwgdmVuZG9yc3VwcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpVENPX3ZlbmRvcl9leGl0X21vZHVsZSh2b2lkKQoreworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTW9kdWxlIFVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoaVRDT192ZW5kb3JfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoaVRDT192ZW5kb3JfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPiwgUi4gU2VyZXRueSA8bGtwYXRjaGVzQHBheXBjLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgVENPIFZlbmRvciBTcGVjaWZpYyBXYXRjaERvZyBUaW1lciBEcml2ZXIgU3VwcG9ydCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT193ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IGI2ZjI5Y2IuLjdlYWM5MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCkBAIC00OCw4ICs0OCw4IEBACiAKIC8qIE1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwogI2RlZmluZSBEUlZfTkFNRSAgICAgICAgImlUQ09fd2R0IgotI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgIjEuMDAiCi0jZGVmaW5lIERSVl9SRUxEQVRFICAgICAiMDgtT2N0LTIwMDYiCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICAiMS4wMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUgICAgICIxMS1Ob3YtMjAwNiIKICNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCiAKIC8qIEluY2x1ZGVzICovCkBAIC0xODksNiArMTg5LDIxIEBACiBtb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKIAorLyogaVRDTyBWZW5kb3IgU3BlY2lmaWMgU3VwcG9ydCBob29rcyAqLworI2lmZGVmIENPTkZJR19JVENPX1ZFTkRPUl9TVVBQT1JUCitleHRlcm4gdm9pZCBpVENPX3ZlbmRvcl9wcmVfc3RhcnQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGlUQ09fdmVuZG9yX3ByZV9zdG9wKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgaVRDT192ZW5kb3JfcHJlX2tlZXBhbGl2ZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgaVRDT192ZW5kb3JfcHJlX3NldF9oZWFydGJlYXQodW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgaVRDT192ZW5kb3JfY2hlY2tfbm9yZWJvb3Rfb24odm9pZCk7CisjZWxzZQorI2RlZmluZSBpVENPX3ZlbmRvcl9wcmVfc3RhcnQoYWNwaWJhc2UsIGhlYXJ0YmVhdCkJe30KKyNkZWZpbmUgaVRDT192ZW5kb3JfcHJlX3N0b3AoYWNwaWJhc2UpCQkJe30KKyNkZWZpbmUgaVRDT192ZW5kb3JfcHJlX2tlZXBhbGl2ZShhY3BpYmFzZSxoZWFydGJlYXQpCXt9CisjZGVmaW5lIGlUQ09fdmVuZG9yX3ByZV9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkJe30KKyNkZWZpbmUgaVRDT192ZW5kb3JfY2hlY2tfbm9yZWJvb3Rfb24oKQkJCTEJLyogMT1jaGVjayBub3JlYm9vdDsgMD1kb24ndCBjaGVjayAqLworI2VuZGlmCisKIC8qCiAgKiBTb21lIFRDTyBzcGVjaWZpYyBmdW5jdGlvbnMKICAqLwpAQCAtMjQ5LDYgKzI2NCw4IEBACiAKIAlzcGluX2xvY2soJmlUQ09fd2R0X3ByaXZhdGUuaW9fbG9jayk7CiAKKwlpVENPX3ZlbmRvcl9wcmVfc3RhcnQoaVRDT193ZHRfcHJpdmF0ZS5BQ1BJQkFTRSwgaGVhcnRiZWF0KTsKKwogCS8qIGRpc2FibGUgY2hpcHNldCdzIE5PX1JFQk9PVCBiaXQgKi8KIAlpZiAoaVRDT193ZHRfdW5zZXRfTk9fUkVCT09UX2JpdCgpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byByZXNldCBOT19SRUJPT1QgZmxhZywgcmVib290IGRpc2FibGVkIGJ5IGhhcmR3YXJlXG4iKTsKQEAgLTI3Myw2ICsyOTAsOCBAQAogCiAJc3Bpbl9sb2NrKCZpVENPX3dkdF9wcml2YXRlLmlvX2xvY2spOwogCisJaVRDT192ZW5kb3JfcHJlX3N0b3AoaVRDT193ZHRfcHJpdmF0ZS5BQ1BJQkFTRSk7CisKIAkvKiBCaXQgMTE6IFRDTyBUaW1lciBIYWx0IC0+IDEgPSBUaGUgVENPIHRpbWVyIGlzIGRpc2FibGVkICovCiAJdmFsID0gaW53KFRDTzFfQ05UKTsKIAl2YWwgfD0gMHgwODAwOwpAQCAtMjkzLDYgKzMxMiw4IEBACiB7CiAJc3Bpbl9sb2NrKCZpVENPX3dkdF9wcml2YXRlLmlvX2xvY2spOwogCisJaVRDT192ZW5kb3JfcHJlX2tlZXBhbGl2ZShpVENPX3dkdF9wcml2YXRlLkFDUElCQVNFLCBoZWFydGJlYXQpOworCiAJLyogUmVsb2FkIHRoZSB0aW1lciBieSB3cml0aW5nIHRvIHRoZSBUQ08gVGltZXIgQ291bnRlciByZWdpc3RlciAqLwogCWlmIChpVENPX3dkdF9wcml2YXRlLmlUQ09fdmVyc2lvbiA9PSAyKSB7CiAJCW91dHcoMHgwMSwgVENPX1JMRCk7CkBAIC0zMTksNiArMzQwLDggQEAKIAkgICAgKChpVENPX3dkdF9wcml2YXRlLmlUQ09fdmVyc2lvbiA9PSAxKSAmJiAodG1ydmFsID4gMHgwM2YpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpVENPX3ZlbmRvcl9wcmVfc2V0X2hlYXJ0YmVhdCh0bXJ2YWwpOworCiAJLyogV3JpdGUgbmV3IGhlYXJ0YmVhdCB0byB3YXRjaGRvZyAqLwogCWlmIChpVENPX3dkdF9wcml2YXRlLmlUQ09fdmVyc2lvbiA9PSAyKSB7CiAJCXNwaW5fbG9jaygmaVRDT193ZHRfcHJpdmF0ZS5pb19sb2NrKTsKQEAgLTU2OSw3ICs1OTIsNyBAQAogCX0KIAogCS8qIENoZWNrIGNoaXBzZXQncyBOT19SRUJPT1QgYml0ICovCi0JaWYgKGlUQ09fd2R0X3Vuc2V0X05PX1JFQk9PVF9iaXQoKSkgeworCWlmIChpVENPX3dkdF91bnNldF9OT19SRUJPT1RfYml0KCkgJiYgaVRDT192ZW5kb3JfY2hlY2tfbm9yZWJvb3Rfb24oKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gcmVzZXQgTk9fUkVCT09UIGZsYWcsIHJlYm9vdCBkaXNhYmxlZCBieSBoYXJkd2FyZVxuIik7CiAJCXJldCA9IC1FTk9ERVY7CS8qIENhbm5vdCByZXNldCBOT19SRUJPT1QgYml0ICovCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ0N2UzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wYzg3NDEzX3dkdC5jCkBAIC0wLDAgKzEsNjM1IEBACisvKgorICogICAgICBOUyBwYzg3NDEzLXdkdCBXYXRjaGRvZyBUaW1lciBkcml2ZXIgZm9yIExpbnV4IDIuNi54LngKKyAqCisgKiAgICAgIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB3ZHQuYyB3aXRoIG9yaWdpbmFsIGNvcHlyaWdodC4KKyAqCisgKiAgICAgIChDKSBDb3B5cmlnaHQgMjAwNiBTdmVuIEFuZGVycywgPGFuZGVyc0BhbmR1cmFzLmRlPgorICogICAgICAgICAgICAgICAgICAgICBhbmQgTWFyY3VzIEp1bmtlciwgPGp1bmtlckBhbmR1cmFzLmRlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIE5laXRoZXIgU3ZlbiBBbmRlcnMsIE1hcmN1cyBKdW5rZXIgbm9yIEFORFVSQVMgQUcKKyAqICAgICAgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqICAgICAgVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICogICAgICBSZWxlYXNlIDEuMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qICNkZWZpbmUgREVCVUcgMSAqLworCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVCAgICAgMSAgICAgICAgICAgIC8qIDEgbWludXRlICovCisjZGVmaW5lIE1BWF9USU1FT1VUICAgICAgICAgMjU1CisKKyNkZWZpbmUgVkVSU0lPTiAgICAgICAgICAgICAiMS4xIgorI2RlZmluZSBNT0ROQU1FICAgICAgICAgICAgICJwYzg3NDEzIFdEVCIKKyNkZWZpbmUgUEZYICAgICAgICAgICAgICAgICBNT0ROQU1FICI6ICIKKyNkZWZpbmUgRFBGWCAgICAgICAgICAgICAgICBNT0ROQU1FICIgLSBERUJVRzogIgorCisjZGVmaW5lIFdEVF9JTkRFWF9JT19QT1JUICAgKGlvKzApICAgICAgIC8qIEkvTyBwb3J0IGJhc2UgKGluZGV4IHJlZ2lzdGVyKSAqLworI2RlZmluZSBXRFRfREFUQV9JT19QT1JUICAgIChXRFRfSU5ERVhfSU9fUE9SVCsxKQorI2RlZmluZSBTV0NfTEROICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0lPQ0ZHMiAgICAgICAgICAgICAweDIyICAgICAgICAgLyogU2VyaWFsIElPIHJlZ2lzdGVyICovCisjZGVmaW5lIFdEQ1RMICAgICAgICAgICAgICAgMHgxMCAgICAgICAgIC8qIFdhdGNoZG9nLVRpbWVyLUNvbnRyb2xsLVJlZ2lzdGVyICovCisjZGVmaW5lIFdEVE8gICAgICAgICAgICAgICAgMHgxMSAgICAgICAgIC8qIFdhdGNoZG9nIHRpbWVvdXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgV0RDRkcgICAgICAgICAgICAgICAweDEyICAgICAgICAgLyogV2F0Y2hkb2cgY29uZmlnIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbnQgaW8gPSAweDJFOwkJICAgICAgICAgLyogQWRkcmVzcyB1c2VkIG9uIFBvcnR3ZWxsIEJvYXJkcyAqLworCitzdGF0aWMgaW50IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7ICAgIC8qIHRpbWVvdXQgdmFsdWUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2VuYWJsZWQgPSAwOyAgLyogaXMgdGhlIHRpbWVyIGVuYWJsZWQ/ICovCisKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsgICAgICAgICAgICAgICAgLyogaXMgdGhlIGNsb3NlIGV4cGVjdGVkPyAqLworCitzdGF0aWMgc3BpbmxvY2tfdCBpb19sb2NrOyAgICAgICAgICAgICAgIC8qIHRvIGd1YXJkIHRoZSB3YXRjaGRvZyBmcm9tIGlvIHJhY2VzICovCisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKKworLyogLS0gTG93IGxldmVsIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTZWxlY3QgcGlucyBmb3IgV2F0Y2hkb2cgb3V0cHV0ICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX3NlbGVjdF93ZHRfb3V0ICh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcl9kYXRhID0gMDsKKworCS8qIFN0ZXAgMTogU2VsZWN0IG11bHRpcGxlIHBpbixwaW41NSxhcyBXRFQgb3V0cHV0ICovCisKKwlvdXRiX3AoU0lPQ0ZHMiwgV0RUX0lOREVYX0lPX1BPUlQpOworCisJY3JfZGF0YSA9IGluYiAoV0RUX0RBVEFfSU9fUE9SVCk7CisKKwljcl9kYXRhIHw9IDB4ODA7IC8qIFNldCBCaXQ3IHRvIDEqLworCW91dGJfcChTSU9DRkcyLCBXRFRfSU5ERVhfSU9fUE9SVCk7CisKKwlvdXRiX3AoY3JfZGF0YSwgV0RUX0RBVEFfSU9fUE9SVCk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAiU2VsZWN0IG11bHRpcGxlIHBpbixwaW41NSxhcyBXRFQgb3V0cHV0OiIKKwkgICAgICAgICAgICAgICAgICAgICAgIiBCaXQ3IHRvIDE6ICVkXG4iLCBjcl9kYXRhKTsKKyNlbmRpZgorfQorCisvKiBFbmFibGUgU1dDIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfc3djKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNyX2RhdGE9MDsKKworCS8qIFN0ZXAgMjogRW5hYmxlIFNXQyBmdW5jdGlvbnMgKi8KKworCW91dGJfcCgweDA3LCBXRFRfSU5ERVhfSU9fUE9SVCk7ICAgICAgICAvKiBQb2ludCBTV0NfTEROIChMRE49NCkgKi8KKwlvdXRiX3AoU1dDX0xETiwgV0RUX0RBVEFfSU9fUE9SVCk7CisKKwlvdXRiX3AoMHgzMCwgV0RUX0lOREVYX0lPX1BPUlQpOyAgICAgICAgLyogUmVhZCBJbmRleCAweDMwIEZpcnN0ICovCisJY3JfZGF0YSA9IGluYihXRFRfREFUQV9JT19QT1JUKTsKKwljcl9kYXRhIHw9IDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IEJpdDAgdG8gMSAqLworCW91dGJfcCgweDMwLCBXRFRfSU5ERVhfSU9fUE9SVCk7CisJb3V0Yl9wKGNyX2RhdGEsIFdEVF9EQVRBX0lPX1BPUlQpOyAgICAgIC8qIEluZGV4MHgzMF9iaXQwUDEgKi8KKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJwYzg3NDEzIC0gRW5hYmxlIFNXQyBmdW5jdGlvbnNcbiIpOworI2VuZGlmCit9CisKKy8qIFJlYWQgU1dDIEkvTyBiYXNlIGFkZHJlc3MgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGM4NzQxM19nZXRfc3djX2Jhc2Uodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgIHN3Y19iYXNlX2FkZHIgPSAwOworCXVuc2lnbmVkIGNoYXIgYWRkcl9sLCBhZGRyX2ggPSAwOworCisJLyogU3RlcCAzOiBSZWFkIFNXQyBJL08gQmFzZSBBZGRyZXNzICovCisKKwlvdXRiX3AoMHg2MCwgV0RUX0lOREVYX0lPX1BPUlQpOyAgICAgICAgLyogUmVhZCBJbmRleCAweDYwICovCisJYWRkcl9oID0gaW5iKFdEVF9EQVRBX0lPX1BPUlQpOworCisJb3V0Yl9wKDB4NjEsIFdEVF9JTkRFWF9JT19QT1JUKTsgICAgICAgIC8qIFJlYWQgSW5kZXggMHg2MSAqLworCisJYWRkcl9sID0gaW5iKFdEVF9EQVRBX0lPX1BPUlQpOworCisJc3djX2Jhc2VfYWRkciA9IChhZGRyX2ggPDwgOCkgKyBhZGRyX2w7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAiUmVhZCBTV0MgSS9PIEJhc2UgQWRkcmVzczogbG93ICVkLCBoaWdoICVkLCIKKwkgICAgICAgICAgICAgICAgICAgICAgIiByZXMgJWRcbiIsIGFkZHJfbCwgYWRkcl9oLCBzd2NfYmFzZV9hZGRyKTsKKyNlbmRpZgorCisJcmV0dXJuIHN3Y19iYXNlX2FkZHI7Cit9CisKKy8qIFNlbGVjdCBCYW5rIDMgb2YgU1dDICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX3N3Y19iYW5rMyh1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3sKKwkvKiBTdGVwIDQ6IFNlbGVjdCBCYW5rMyBvZiBTV0MgKi8KKworCW91dGJfcChpbmIoc3djX2Jhc2VfYWRkciArIDB4MGYpIHwgMHgwMywgc3djX2Jhc2VfYWRkciArIDB4MGYpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPIERQRlggIlNlbGVjdCBCYW5rMyBvZiBTV0NcbiIpOworI2VuZGlmCit9CisKKy8qIFNldCB3YXRjaGRvZyB0aW1lb3V0IHRvIHggbWludXRlcyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19wcm9ncmFtbV93ZHRvKHVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyLAorCQkJCQkgY2hhciBwYzg3NDEzX3RpbWUpCit7CisJLyogU3RlcCA1OiBQcm9ncmFtbSBXRFRPLCBUd2QuICovCisKKwlvdXRiX3AocGM4NzQxM190aW1lLCBzd2NfYmFzZV9hZGRyICsgV0RUTyk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAiU2V0IFdEVE8gdG8gJWQgbWludXRlc1xuIiwgcGM4NzQxM190aW1lKTsKKyNlbmRpZgorfQorCisvKiBFbmFibGUgV0RFTiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfd2Rlbih1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3sKKwkvKiBTdGVwIDY6IEVuYWJsZSBXREVOICovCisKKwlvdXRiX3AoaW5iIChzd2NfYmFzZV9hZGRyICsgV0RDVEwpIHwgMHgwMSwgc3djX2Jhc2VfYWRkciArIFdEQ1RMKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJFbmFibGUgV0RFTlxuIik7CisjZW5kaWYKK30KKworLyogRW5hYmxlIFNXX1dEX1RSRU4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2VuYWJsZV9zd193ZF90cmVuKHVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyKQoreworCS8qIEVuYWJsZSBTV19XRF9UUkVOICovCisKKwlvdXRiX3AoaW5iIChzd2NfYmFzZV9hZGRyICsgV0RDRkcpIHwgMHg4MCwgc3djX2Jhc2VfYWRkciArIFdEQ0ZHKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJFbmFibGUgU1dfV0RfVFJFTlxuIik7CisjZW5kaWYKK30KKworLyogRGlzYWJsZSBTV19XRF9UUkVOICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJlbih1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3sKKwkvKiBEaXNhYmxlIFNXX1dEX1RSRU4gKi8KKworCW91dGJfcChpbmIgKHN3Y19iYXNlX2FkZHIgKyBXRENGRykgJiAweDdmLCBzd2NfYmFzZV9hZGRyICsgV0RDRkcpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPIERQRlggInBjODc0MTMgLSBEaXNhYmxlIFNXX1dEX1RSRU5cbiIpOworI2VuZGlmCit9CisKKy8qIEVuYWJsZSBTV19XRF9UUkcgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZyh1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3sKKwkvKiBFbmFibGUgU1dfV0RfVFJHICovCisKKwlvdXRiX3AoaW5iIChzd2NfYmFzZV9hZGRyICsgV0RDVEwpIHwgMHg4MCwgc3djX2Jhc2VfYWRkciArIFdEQ1RMKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJwYzg3NDEzIC0gRW5hYmxlIFNXX1dEX1RSR1xuIik7CisjZW5kaWYKK30KKworLyogRGlzYWJsZSBTV19XRF9UUkcgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZGlzYWJsZV9zd193ZF90cmcodW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCit7CisJLyogRGlzYWJsZSBTV19XRF9UUkcgKi8KKworCW91dGJfcChpbmIgKHN3Y19iYXNlX2FkZHIgKyBXRENUTCkgJiAweDdmLCBzd2NfYmFzZV9hZGRyICsgV0RDVEwpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPIERQRlggIkRpc2FibGUgU1dfV0RfVFJHXG4iKTsKKyNlbmRpZgorfQorCisvKiAtLSBIaWdoZXIgbGV2ZWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEVuYWJsZSB0aGUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgcGM4NzQxM19lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcjsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisKKwlwYzg3NDEzX3NlbGVjdF93ZHRfb3V0KCk7CisJcGM4NzQxM19lbmFibGVfc3djKCk7CisJc3djX2Jhc2VfYWRkciA9IHBjODc0MTNfZ2V0X3N3Y19iYXNlKCk7CisJcGM4NzQxM19zd2NfYmFuazMoc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19wcm9ncmFtbV93ZHRvKHN3Y19iYXNlX2FkZHIsIHRpbWVvdXQpOworCXBjODc0MTNfZW5hYmxlX3dkZW4oc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcoc3djX2Jhc2VfYWRkcik7CisKKwlzcGluX3VubG9jaygmaW9fbG9jayk7Cit9CisKKy8qIERpc2FibGUgdGhlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHBjODc0MTNfZGlzYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyOworCisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKworCXBjODc0MTNfc2VsZWN0X3dkdF9vdXQoKTsKKwlwYzg3NDEzX2VuYWJsZV9zd2MoKTsKKwlzd2NfYmFzZV9hZGRyID0gcGM4NzQxM19nZXRfc3djX2Jhc2UoKTsKKwlwYzg3NDEzX3N3Y19iYW5rMyhzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfcHJvZ3JhbW1fd2R0byhzd2NfYmFzZV9hZGRyLCAwKTsKKworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogUmVmcmVzaCB0aGUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgcGM4NzQxM19yZWZyZXNoKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHI7CisKKwlzcGluX2xvY2soJmlvX2xvY2spOworCisJcGM4NzQxM19zZWxlY3Rfd2R0X291dCgpOworCXBjODc0MTNfZW5hYmxlX3N3YygpOworCXN3Y19iYXNlX2FkZHIgPSBwYzg3NDEzX2dldF9zd2NfYmFzZSgpOworCXBjODc0MTNfc3djX2JhbmszKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfZGlzYWJsZV9zd193ZF90cmVuKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfZGlzYWJsZV9zd193ZF90cmcoc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19wcm9ncmFtbV93ZHRvKHN3Y19iYXNlX2FkZHIsIHRpbWVvdXQpOworCXBjODc0MTNfZW5hYmxlX3dkZW4oc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcoc3djX2Jhc2VfYWRkcik7CisKKwlzcGluX3VubG9jaygmaW9fbG9jayk7Cit9CisKKy8qIC0tIEZpbGUgb3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKglwYzg3NDEzX29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqLworCitzdGF0aWMgaW50IHBjODc0MTNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmdGltZXJfZW5hYmxlZCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBSZWxvYWQgYW5kIGFjdGl2YXRlIHRpbWVyICovCisJcGM4NzQxM19yZWZyZXNoKCk7CisKKwlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGVuYWJsZWQuIFRpbWVvdXQgc2V0IHRvIgorCSAgICAgICAgICAgICAgICAgICAgICAgICAiICVkIG1pbnV0ZShzKS5cbiIsIHRpbWVvdXQpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKioKKyAqCXBjODc0MTNfcmVsZWFzZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqCVRoZSB3YXRjaGRvZyBoYXMgYSBjb25maWd1cmFibGUgQVBJLiBUaGVyZSBpcyBhIHJlbGlnaW91cyBkaXNwdXRlCisgKgliZXR3ZWVuIHBlb3BsZSB3aG8gd2FudCB0aGVpciB3YXRjaGRvZyB0byBiZSBhYmxlIHRvIHNodXQgZG93biBhbmQKKyAqCXRob3NlIHdobyB3YW50IHRvIGJlIHN1cmUgaWYgdGhlIHdhdGNoZG9nIG1hbmFnZXIgZGllcyB0aGUgbWFjaGluZQorICoJcmVib290cy4gSW4gdGhlIGZvcm1lciBjYXNlIHdlIGRpc2FibGUgdGhlIGNvdW50ZXJzLCBpbiB0aGUgbGF0dGVyCisgKgljYXNlIHlvdSBoYXZlIHRvIG9wZW4gaXQgYWdhaW4gdmVyeSBzb29uLgorICovCisKK3N0YXRpYyBpbnQgcGM4NzQxM19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIFNodXQgb2ZmIHRoZSB0aW1lci4gKi8KKworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJcGM4NzQxM19kaXNhYmxlKCk7CisJCXByaW50ayhLRVJOX0lORk8gTU9ETkFNRSAiV2F0Y2hkb2cgZGlzYWJsZWQsIgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIiBzbGVlcGluZyBhZ2Fpbi4uLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBNT0ROQU1FICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmciCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAiIHdhdGNoZG9nIVxuIik7CisJCXBjODc0MTNfcmVmcmVzaCgpOworCX0KKworCWNsZWFyX2JpdCgwLCAmdGltZXJfZW5hYmxlZCk7CisJZXhwZWN0X2Nsb3NlID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXBjODc0MTNfc3RhdHVzOgorICoKKyAqICAgICAgcmV0dXJuLCBpZiB0aGUgd2F0Y2hkb2cgaXMgZW5hYmxlZCAodGltZW91dCBpcyBzZXQuLi4pCisgKi8KKworCitzdGF0aWMgaW50IHBjODc0MTNfc3RhdHVzKHZvaWQpCit7CisJICByZXR1cm4gMDsgLyogY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgKi8KK30KKworLyoqCisgKglwYzg3NDEzX3dyaXRlOgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZworICoJQGRhdGE6IGRhdGEgYnVmZmVyIHRvIHdyaXRlCisgKglAbGVuOiBsZW5ndGggaW4gYnl0ZXMKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqCUEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICoJd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHBjODc0MTNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIHJlc2V0IGV4cGVjdCBmbGFnICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YStpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCS8qIHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZWxvYWQgdGhlIHRpbWVyICovCisJCXBjODc0MTNfcmVmcmVzaCgpOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqCXBjODc0MTNfaW9jdGw6CisgKglAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKglAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKglAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICoJVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqCWFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuIFdlIG9ubHkgYWN0dWFsbHkgdXNlZnVsbHkgc3VwcG9ydAorICoJcXVlcnlpbmcgY2FwYWJpbGl0aWVzIGFuZCBjdXJyZW50IHN0YXR1cy4KKyAqLworCitzdGF0aWMgaW50IHBjODc0MTNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld190aW1lb3V0OworCisJdW5pb24geworCQlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKmlkZW50OworCQlpbnQgX191c2VyICppOworCX0gdWFyZzsKKworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgICAgICAgICAgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJICAgICAgICAgICAgICAgICAgICBXRElPRl9TRVRUSU1FT1VUIHwKKwkJICAgICAgICAgICAgICAgICAgICBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSAgICAgICAgID0gIlBDODc0MTMoSEYvRikgd2F0Y2hkb2ciCisJfTsKKworCXVhcmcuaSA9IChpbnQgX191c2VyICopYXJnOworCisJc3dpdGNoKGNtZCkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9UVFk7CisKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcih1YXJnLmlkZW50LCAmaWRlbnQsCisJCQkJc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcihwYzg3NDEzX3N0YXR1cygpLCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJcGM4NzQxM19yZWZyZXNoKCk7CisjaWZkZWYgREVCVUcKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJrZWVwYWxpdmVcbiIpOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8vIHRoZSBBUEkgc3RhdGVzIHRoaXMgaXMgZ2l2ZW4gaW4gc2VjcworCQkJbmV3X3RpbWVvdXQgLz0gNjA7CisKKwkJCWlmIChuZXdfdGltZW91dCA8IDAgfHwgbmV3X3RpbWVvdXQgPiBNQVhfVElNRU9VVCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJdGltZW91dCA9IG5ld190aW1lb3V0OworCQkJcGM4NzQxM19yZWZyZXNoKCk7CisKKwkJCS8vIGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIHRoZSBuZXcgdGltZW91dC4uLgorCisJCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKworCQkgICAgICAgIG5ld190aW1lb3V0ID0gdGltZW91dCAqIDYwOworCisJCQlyZXR1cm4gcHV0X3VzZXIobmV3X3RpbWVvdXQsIHVhcmcuaSk7CisKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQl7CisJCQlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQkJaWYgKGdldF91c2VyKG9wdGlvbnMsIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCSAgICAgICAgcGM4NzQxM19kaXNhYmxlKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQkJcGM4NzQxM19lbmFibGUoKTsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorfQorCisvKiAtLSBOb3RpZmllciBmdW50aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICoJbm90aWZ5X3N5czoKKyAqCUB0aGlzOiBvdXIgbm90aWZpZXIgYmxvY2sKKyAqCUBjb2RlOiB0aGUgZXZlbnQgYmVpbmcgcmVwb3J0ZWQKKyAqCUB1bnVzZWQ6IHVudXNlZAorICoKKyAqCU91ciBub3RpZmllciBpcyBjYWxsZWQgb24gc3lzdGVtIHNodXRkb3ducy4gV2Ugd2FudCB0byB0dXJuIHRoZSBjYXJkCisgKglvZmYgYXQgcmVib290IG90aGVyd2lzZSB0aGUgbWFjaGluZSB3aWxsIHJlYm9vdCBhZ2FpbiBkdXJpbmcgbWVtb3J5CisgKgl0ZXN0IG9yIHdvcnNlIHlldCBkdXJpbmcgdGhlIGZvbGxvd2luZyBmc2NrLiBUaGlzIHdvdWxkIHN1Y2ssIGluIGZhY3QKKyAqCXRydXN0IG1lIC0gaWYgaXQgaGFwcGVucyBpdCBkb2VzIHN1Y2suCisgKi8KKworc3RhdGljIGludCBwYzg3NDEzX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJICAgICAgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCisJeworCQkvKiBUdXJuIHRoZSBjYXJkIG9mZiAqLworCQlwYzg3NDEzX2Rpc2FibGUoKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKiAtLSBNb2R1bGUncyBzdHJ1Y3R1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjODc0MTNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHBjODc0MTNfd3JpdGUsCisJLmlvY3RsCQk9IHBjODc0MTNfaW9jdGwsCisJLm9wZW4JCT0gcGM4NzQxM19vcGVuLAorCS5yZWxlYXNlCT0gcGM4NzQxM19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYzg3NDEzX25vdGlmaWVyID0KK3sKKwkubm90aWZpZXJfY2FsbCAgPSBwYzg3NDEzX25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcGM4NzQxM19taXNjZGV2PQoreworCS5taW5vciAgICAgICAgICA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lICAgICAgICAgICA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgICAgICAgICAgID0gJnBjODc0MTNfZm9wcworfTsKKworLyogLS0gTW9kdWxlIGluaXQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIAlwYzg3NDEzX2luaXQ6IG1vZHVsZSdzICJjb25zdHJ1Y3RvciIKKyAqCisgKglTZXQgdXAgdGhlIFdEVCB3YXRjaGRvZyBib2FyZC4gQWxsIHdlIGhhdmUgdG8gZG8gaXMgZ3JhYiB0aGUKKyAqCXJlc291cmNlcyB3ZSByZXF1aXJlIGFuZCBiaXRjaCBpZiBhbnlvbmUgYmVhdCB1cyB0byB0aGVtLgorICoJVGhlIG9wZW4oKSBmdW5jdGlvbiB3aWxsIGFjdHVhbGx5IGtpY2sgdGhlIGJvYXJkIG9mZi4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwYzg3NDEzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJmlvX2xvY2spOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlZlcnNpb24gIiBWRVJTSU9OICIgYXQgaW8gMHglWFxuIiwgV0RUX0lOREVYX0lPX1BPUlQpOworCisJLyogcmVxdWVzdF9yZWdpb24oaW8sIDIsICJwYzg3NDEzIik7ICovCisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjODc0MTNfbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAorCQkJcmV0KTsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZwYzg3NDEzX21pc2NkZXYpOworCisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgbWluIFxuIiwgdGltZW91dCk7CisKKwlwYzg3NDEzX2VuYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJcGM4NzQxM19leGl0OiBtb2R1bGUncyAiZGVzdHJ1Y3RvciIKKyAqCisgKglVbmxvYWQgdGhlIHdhdGNoZG9nLiBZb3UgY2Fubm90IGRvIHRoaXMgd2l0aCBhbnkgZmlsZSBoYW5kbGVzIG9wZW4uCisgKglJZiB5b3VyIHdhdGNoZG9nIGlzIHNldCB0byBjb250aW51ZSB0aWNraW5nIG9uIGNsb3NlIGFuZCB5b3UgdW5sb2FkCisgKglpdCwgd2VsbCBpdCBrZWVwcyB0aWNraW5nLiBXZSB3b24ndCBnZXQgdGhlIGludGVycnVwdCBidXQgdGhlIGJvYXJkCisgKgl3aWxsIG5vdCB0b3VjaCBQQyBtZW1vcnkgc28gYWxsIGlzIGZpbmUuIFlvdSBqdXN0IGhhdmUgdG8gbG9hZCBhIG5ldworICoJbW9kdWxlIGluIDYwIHNlY29uZHMgb3IgcmVib290LgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYzg3NDEzX2V4aXQodm9pZCkKK3sKKwkvKiBTdG9wIHRoZSB0aW1lciBiZWZvcmUgd2UgbGVhdmUgKi8KKwlpZiAoIW5vd2F5b3V0KQorCXsKKwkJcGM4NzQxM19kaXNhYmxlKCk7CisJCXByaW50ayhLRVJOX0lORk8gTU9ETkFNRSAiV2F0Y2hkb2cgZGlzYWJsZWQuXG4iKTsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJnBjODc0MTNfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjODc0MTNfbm90aWZpZXIpOworCS8qIHJlbGVhc2VfcmVnaW9uKGlvLDIpOyAqLworCisJcHJpbnRrKE1PRE5BTUUgIiB3YXRjaGRvZyBjb21wb25lbnQgZHJpdmVyIHJlbW92ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQocGM4NzQxM19pbml0KTsKK21vZHVsZV9leGl0KHBjODc0MTNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN2ZW4gQW5kZXJzIDxhbmRlcnNAYW5kdXJhcy5kZT4sIE1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUEM4NzQxMyBXRFQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgTU9ETkFNRSAiIEkvTyBwb3J0IChkZWZhdWx0OiAiIF9fTU9EVUxFX1NUUklORyhpbykgIikuIik7CisKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBtaW51dGVzIChkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKHRpbWVvdXQpICIpLiIpOworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfdXNiLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF91c2IuYwppbmRleCBiZGE0NTMzLi5lMjc1ZGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF91c2IuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGN3ZF91c2IuYwpAQCAtNTYxLDggKzU2MSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfcGN3ZF9kZWxldGUgKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlICp1c2JfcGN3ZCkKIHsKLQlpZiAodXNiX3Bjd2QtPmludHJfdXJiICE9IE5VTEwpCi0JCXVzYl9mcmVlX3VyYiAodXNiX3Bjd2QtPmludHJfdXJiKTsKKwl1c2JfZnJlZV91cmIodXNiX3Bjd2QtPmludHJfdXJiKTsKIAlpZiAodXNiX3Bjd2QtPmludHJfYnVmZmVyICE9IE5VTEwpCiAJCXVzYl9idWZmZXJfZnJlZSh1c2JfcGN3ZC0+dWRldiwgdXNiX3Bjd2QtPmludHJfc2l6ZSwKIAkJCQl1c2JfcGN3ZC0+aW50cl9idWZmZXIsIHVzYl9wY3dkLT5pbnRyX2RtYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcm05a193ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9ybTlrX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzkwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcm05a193ZHQuYwpAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqICBXYXRjaGRvZyBpbXBsZW1lbnRhdGlvbiBmb3IgR1BJIGgvdyBmb3VuZCBvbiBQTUMtU2llcnJhIFJNOXh4eAorICogIGNoaXBzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgQmFzbGVyIFZpc2lvbiBUZWNobm9sb2dpZXMgQUcKKyAqICBBdXRob3I6IFRob21hcyBLb2VsbGVyIDx0aG9tYXMua29lbGxlckBiYXNsZXJ3ZWIuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ybTlrLW9jZC5oPgorCisjaW5jbHVkZSA8cm05a193ZHQuaD4KKworCisjZGVmaW5lIENMT0NLICAgICAgICAgICAgICAgICAgMTI1MDAwMDAwCisjZGVmaW5lIE1BWF9USU1FT1VUX1NFQ09ORFMgICAgMzIKKyNkZWZpbmUgQ1BDQ1IgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgQ1BHSUcxU1IgICAgICAgICAgICAgICAweDAwNDQKKyNkZWZpbmUgQ1BHSUcxRVIgICAgICAgICAgICAgICAweDAwNTQKKworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2R0X2dwaV9pcnFoZGwoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgd2R0X2dwaV9zdGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIHdkdF9ncGlfc3RvcCh2b2lkKTsKK3N0YXRpYyB2b2lkIHdkdF9ncGlfc2V0X3RpbWVvdXQodW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgd2R0X2dwaV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgd2R0X2dwaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBzc2l6ZV90IHdkdF9ncGlfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgbG9uZyB3ZHRfZ3BpX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IHdkdF9ncGlfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOworc3RhdGljIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqd2R0X2dwaV9nZXRfcmVzb3VyY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IF9faW5pdCB3ZHRfZ3BpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IF9fZXhpdCB3ZHRfZ3BpX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICopOworCisKK3N0YXRpYyBjb25zdCBjaGFyIHdkdF9ncGlfbmFtZVtdID0gIndkdF9ncGkiOworc3RhdGljIGF0b21pY190IG9wZW5jbnQ7CitzdGF0aWMgaW50IGV4cGVjdF9jbG9zZTsKK3N0YXRpYyBpbnQgbG9ja2VkOworCisKKy8qIFRoZXNlIGFyZSBzZXQgZnJvbSBkZXZpY2UgcmVzb3VyY2VzICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICogd2RfcmVnczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2RfaXJxLCB3ZF9jdHI7CisKKworLyogTW9kdWxlIGFyZ3VtZW50cyAqLworc3RhdGljIGludCB0aW1lb3V0ID0gTUFYX1RJTUVPVVRfU0VDT05EUzsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0YWRkciA9IDB4YmZmZGMyMDA7Cittb2R1bGVfcGFyYW0ocmVzZXRhZGRyLCB1bG9uZywgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc2V0YWRkciwgIkFkZHJlc3MgdG8gd3JpdGUgdG8gdG8gZm9yY2UgYSByZXNldCIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmbGFnYWRkciA9IDB4YmZmZGMxMDQ7Cittb2R1bGVfcGFyYW0oZmxhZ2FkZHIsIHVsb25nLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZmxhZ2FkZHIsICJBZGRyZXNzIHRvIHdyaXRlIHRvIGJvb3QgZmxhZ3MgdG8iKTsKKworc3RhdGljIGludCBwb3dlcmN5Y2xlOworbW9kdWxlX3BhcmFtKHBvd2VyY3ljbGUsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcmN5Y2xlLCAiQ3ljbGUgcG93ZXIgaWYgd2F0Y2hkb2cgZXhwaXJlcyIpOworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBkaXNhYmxlZCBvbmNlIHN0YXJ0ZWQiKTsKKworCisvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90IHdkdF9ncGlfaXJxaGRsKGludCBpcnEsIHZvaWQgKmN0eHQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICghdW5saWtlbHkoX19yYXdfcmVhZGwod2RfcmVncyArIDB4MDAwOCkgJiAweDEpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJX19yYXdfd3JpdGVsKDB4MSwgd2RfcmVncyArIDB4MDAwOCk7CisKKworCXByaW50ayhLRVJOX0NSSVQgIiVzOiB3YXRjaGRvZyBleHBpcmVkIC0gcmVzZXR0aW5nIHN5c3RlbVxuIiwKKwkJd2R0X2dwaV9uYW1lKTsKKworCSoodm9sYXRpbGUgY2hhciAqKSBmbGFnYWRkciB8PSAweDAxOworCSoodm9sYXRpbGUgY2hhciAqKSByZXNldGFkZHIgPSBwb3dlcmN5Y2xlID8gMHgwMSA6IDB4MjsKKwlpb2IoKTsKKwl3aGlsZSAoMSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKKworLyogV2F0Y2hkb2cgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3N0YXJ0KHZvaWQpCit7CisJdTMyIHJlZzsKKworCWxvY2tfdGl0YW5fcmVncygpOworCXJlZyA9IHRpdGFuX3JlYWRsKENQR0lHMUVSKTsKKwl0aXRhbl93cml0ZWwocmVnIHwgKDB4MTAwIDw8IHdkX2N0ciksIENQR0lHMUVSKTsKKwlpb2IoKTsKKwl1bmxvY2tfdGl0YW5fcmVncygpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3N0b3Aodm9pZCkKK3sKKwl1MzIgcmVnOworCisJbG9ja190aXRhbl9yZWdzKCk7CisJcmVnID0gdGl0YW5fcmVhZGwoQ1BDQ1IpICYgfigweGYgPDwgKHdkX2N0ciAqIDQpKTsKKwl0aXRhbl93cml0ZWwocmVnLCBDUENDUik7CisJcmVnID0gdGl0YW5fcmVhZGwoQ1BHSUcxRVIpOworCXRpdGFuX3dyaXRlbChyZWcgJiB+KDB4MTAwIDw8IHdkX2N0ciksIENQR0lHMUVSKTsKKwlpb2IoKTsKKwl1bmxvY2tfdGl0YW5fcmVncygpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3NldF90aW1lb3V0KHVuc2lnbmVkIGludCB0bykKK3sKKwl1MzIgcmVnOworCWNvbnN0IHUzMiB3ZHZhbCA9ICh0byAqIENMT0NLKSAmIH4weDAwMDAwMDBmOworCisJbG9ja190aXRhbl9yZWdzKCk7CisJcmVnID0gdGl0YW5fcmVhZGwoQ1BDQ1IpICYgfigweGYgPDwgKHdkX2N0ciAqIDQpKTsKKwl0aXRhbl93cml0ZWwocmVnLCBDUENDUik7CisJd21iKCk7CisJX19yYXdfd3JpdGVsKHdkdmFsLCB3ZF9yZWdzICsgMHgwMDAwKTsKKwl3bWIoKTsKKwl0aXRhbl93cml0ZWwocmVnIHwgKDB4MiA8PCAod2RfY3RyICogNCkpLCBDUENDUik7CisJd21iKCk7CisJdGl0YW5fd3JpdGVsKHJlZyB8ICgweDUgPDwgKHdkX2N0ciAqIDQpKSwgQ1BDQ1IpOworCWlvYigpOworCXVubG9ja190aXRhbl9yZWdzKCk7Cit9CisKKworLyogL2Rldi93YXRjaGRvZyBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IHdkdF9ncGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmVzOworCisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfaWZfcG9zaXRpdmUoJm9wZW5jbnQpIDwgMCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlleHBlY3RfY2xvc2UgPSAwOworCWlmIChsb2NrZWQpIHsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCWZyZWVfaXJxKHdkX2lycSwgJm1pc2NkZXYpOworCQlsb2NrZWQgPSAwOworCX0KKworCXJlcyA9IHJlcXVlc3RfaXJxKHdkX2lycSwgd2R0X2dwaV9pcnFoZGwsIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULAorCQkJICB3ZHRfZ3BpX25hbWUsICZtaXNjZGV2KTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJcmV0dXJuIHJlczsKKworCXdkdF9ncGlfc2V0X3RpbWVvdXQodGltZW91dCk7CisJd2R0X2dwaV9zdGFydCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdhdGNoZG9nIHN0YXJ0ZWQsIHRpbWVvdXQgPSAldSBzZWNvbmRzXG4iLAorCQl3ZHRfZ3BpX25hbWUsIHRpbWVvdXQpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB3ZHRfZ3BpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKG5vd2F5b3V0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyB3YXkgb3V0IC0gd2F0Y2hkb2cgbGVmdCBydW5uaW5nXG4iLAorCQkJd2R0X2dwaV9uYW1lKTsKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwkJbG9ja2VkID0gMTsKKwl9IGVsc2UgeworCQlpZiAoZXhwZWN0X2Nsb3NlKSB7CisJCQl3ZHRfZ3BpX3N0b3AoKTsKKwkJCWZyZWVfaXJxKHdkX2lycSwgJm1pc2NkZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdhdGNoZG9nIHN0b3BwZWRcbiIsIHdkdF9ncGlfbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUICIlczogdW5leHBlY3RlZCBjbG9zZSgpIC0iCisJCQkJIiB3YXRjaGRvZyBsZWZ0IHJ1bm5pbmdcbiIsCisJCQkJd2R0X2dwaV9uYW1lKTsKKwkJCXdkdF9ncGlfc2V0X3RpbWVvdXQodGltZW91dCk7CisJCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQkJbG9ja2VkID0gMTsKKwkJfQorCX0KKworCWF0b21pY19pbmMoJm9wZW5jbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAord2R0X2dwaV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKmQsIHNpemVfdCBzLCBsb2ZmX3QgKm8pCit7CisJY2hhciB2YWw7CisKKwl3ZHRfZ3BpX3NldF90aW1lb3V0KHRpbWVvdXQpOworCWV4cGVjdF9jbG9zZSA9IChzID4gMCkgJiYgIWdldF91c2VyKHZhbCwgZCkgJiYgKHZhbCA9PSAnVicpOworCXJldHVybiBzID8gMSA6IDA7Cit9CisKK3N0YXRpYyBsb25nCit3ZHRfZ3BpX2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlsb25nIHJlcyA9IC1FTk9UVFk7CisJY29uc3QgbG9uZyBzaXplID0gX0lPQ19TSVpFKGNtZCk7CisJaW50IHN0YXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHdkaW5mbyA9IHsKKwkJLmlkZW50aXR5ICAgICAgICAgICAgICAgPSAiUk05eHh4L0dQSSB3YXRjaGRvZyIsCisJCS5maXJtd2FyZV92ZXJzaW9uICAgICAgID0gMCwKKwkJLm9wdGlvbnMgICAgICAgICAgICAgICAgPSBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORworCX07CisKKwlpZiAodW5saWtlbHkoX0lPQ19UWVBFKGNtZCkgIT0gV0FUQ0hET0dfSU9DVExfQkFTRSkpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQorCSAgICAmJiAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJnLCBzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKF9JT0NfRElSKGNtZCkgJiBfSU9DX1dSSVRFKQorCSAgICAmJiAhYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmcsIHNpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWV4cGVjdF9jbG9zZSA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJd2RpbmZvLm9wdGlvbnMgPSBub3dheW91dCA/CisJCQlXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyA6CisJCQlXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0U7CisJCXJlcyA9IF9fY29weV90b191c2VyKGFyZ3AsICZ3ZGluZm8sIHNpemUpID8gIC1FRkFVTFQgOiBzaXplOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJc3RhdCA9ICgqKHZvbGF0aWxlIGNoYXIgKikgZmxhZ2FkZHIgJiAweDAxKQorCQkJPyBXRElPRl9DQVJEUkVTRVQgOiAwOworCQlyZXMgPSBfX2NvcHlfdG9fdXNlcihhcmdwLCAmc3RhdCwgc2l6ZSkgPworCQkJLUVGQVVMVCA6IHNpemU7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfZ3BpX3NldF90aW1lb3V0KHRpbWVvdXQpOworCQlyZXMgPSBzaXplOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IHZhbDsKKwkJCWlmICh1bmxpa2VseShfX2NvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemUpKSkgeworCQkJCXJlcyA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh2YWwgPiBNQVhfVElNRU9VVF9TRUNPTkRTKQorCQkJCXZhbCA9IE1BWF9USU1FT1VUX1NFQ09ORFM7CisJCQl0aW1lb3V0ID0gdmFsOworCQkJd2R0X2dwaV9zZXRfdGltZW91dCh2YWwpOworCQkJcmVzID0gc2l6ZTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0aW1lb3V0IHNldCB0byAldSBzZWNvbmRzXG4iLAorCQkJCXdkdF9ncGlfbmFtZSwgdGltZW91dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJlcyA9IF9fY29weV90b191c2VyKGFyZ3AsICZ0aW1lb3V0LCBzaXplKSA/CisJCQktRUZBVUxUIDogc2l6ZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCisvKiBTaHV0ZG93biBub3RpZmllciAqLworc3RhdGljIGludAord2R0X2dwaV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQl3ZHRfZ3BpX3N0b3AoKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCisvKiBLZXJuZWwgaW50ZXJmYWNlcyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gd2R0X2dwaV9vcGVuLAorCS5yZWxlYXNlCT0gd2R0X2dwaV9yZWxlYXNlLAorCS53cml0ZQkJPSB3ZHRfZ3BpX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IHdkdF9ncGlfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gd2R0X2dwaV9uYW1lLAorCS5mb3BzCQk9ICZmb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfZ3BpX3NodXRkb3duID0geworCS5ub3RpZmllcl9jYWxsCT0gd2R0X2dwaV9ub3RpZnksCit9OworCisKKy8qIEluaXQgJiBleGl0IHByb2NlZHVyZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKgord2R0X2dwaV9nZXRfcmVzb3VyY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGR2LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwljaGFyIGJ1Zls4MF07CisJaWYgKHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVzXzAiLCBuYW1lKSA+PSBzaXplb2YgYnVmKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZHYsIHR5cGUsIGJ1Zik7Cit9CisKKy8qIE5vIGhvdHBsdWdnaW5nIG9uIHRoZSBwbGF0Zm9ybSBidXMgLSB1c2UgX19pbml0ICovCitzdGF0aWMgaW50IF9faW5pdCB3ZHRfZ3BpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBjb25zdCBwZHYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgcmVzb3VyY2UKKwkJKiBjb25zdCByciA9IHdkdF9ncGlfZ2V0X3Jlc291cmNlKHBkdiwgV0RUX1JFU09VUkNFX1JFR1MsCisJCQkJCQkgIElPUkVTT1VSQ0VfTUVNKSwKKwkJKiBjb25zdCByaSA9IHdkdF9ncGlfZ2V0X3Jlc291cmNlKHBkdiwgV0RUX1JFU09VUkNFX0lSUSwKKwkJCQkJCSAgSU9SRVNPVVJDRV9JUlEpLAorCQkqIGNvbnN0IHJjID0gd2R0X2dwaV9nZXRfcmVzb3VyY2UocGR2LCBXRFRfUkVTT1VSQ0VfQ09VTlRFUiwKKwkJCQkJCSAgMCk7CisKKwlpZiAodW5saWtlbHkoIXJyIHx8ICFyaSB8fCAhcmMpKQorCQlyZXR1cm4gLUVOWElPOworCisJd2RfcmVncyA9IGlvcmVtYXBfbm9jYWNoZShyci0+c3RhcnQsIHJyLT5lbmQgKyAxIC0gcnItPnN0YXJ0KTsKKwlpZiAodW5saWtlbHkoIXdkX3JlZ3MpKQorCQlyZXR1cm4gLUVOT01FTTsKKwl3ZF9pcnEgPSByaS0+c3RhcnQ7CisJd2RfY3RyID0gcmMtPnN0YXJ0OworCXJlcyA9IG1pc2NfcmVnaXN0ZXIoJm1pc2NkZXYpOworCWlmIChyZXMpCisJCWlvdW5tYXAod2RfcmVncyk7CisJZWxzZQorCQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ncGlfc2h1dGRvd24pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHdkdF9ncGlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzOworCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ncGlfc2h1dGRvd24pOworCXJlcyA9IG1pc2NfZGVyZWdpc3RlcigmbWlzY2Rldik7CisJaW91bm1hcCh3ZF9yZWdzKTsKKwl3ZF9yZWdzID0gTlVMTDsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIERldmljZSBkcml2ZXIgaW5pdCAmIGV4aXQgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB3ZHRfZ3BpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAoY2hhciAqKSB3ZHRfZ3BpX25hbWUsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJPSB3ZHRfZ3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19leGl0X3Aod2R0X2dwaV9yZW1vdmUpLAorCS5zaHV0ZG93bgk9IE5VTEwsCisJLnN1c3BlbmQJPSBOVUxMLAorCS5yZXN1bWUJCT0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdkdF9ncGlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlhdG9taWNfc2V0KCZvcGVuY250LCAxKTsKKwlpZiAodGltZW91dCA+IE1BWF9USU1FT1VUX1NFQ09ORFMpCisJCXRpbWVvdXQgPSBNQVhfVElNRU9VVF9TRUNPTkRTOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJndkdF9ncGlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdkdF9ncGlfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3Rlcigmd2R0X2dwaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh3ZHRfZ3BpX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHdkdF9ncGlfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgS29lbGxlciA8dGhvbWFzLmtvZWxsZXJAYmFzbGVyd2ViLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmFzbGVyIGVYY2l0ZSB3YXRjaGRvZyBkcml2ZXIgZm9yIGdwaSBkZXZpY2VzIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydS5jCmluZGV4IGU1Y2IwZmQuLmIxZGM2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKKysrIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYwpAQCAtMjEsNiArMjEsNyBAQAogICAgIGV0YyB2b2x0YWdlICYgZnJlcXVlbmN5IGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCEKICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaGRhcHMuYyBiL2RyaXZlcnMvaHdtb24vaGRhcHMuYwppbmRleCAyNmJlNGVhLi5lOGVmNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2hkYXBzLmMKKysrIGIvZHJpdmVycy9od21vbi9oZGFwcy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgSERBUFNfTE9XX1BPUlQJCTB4MTYwMAkvKiBmaXJzdCBwb3J0IHVzZWQgYnkgaGRhcHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggNTEwODE2Yy4uMDRiZWU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTEyNSw2ICsxMjUsNyBAQAogCSAgICBJQ0g3CiAJICAgIEVTQjIKIAkgICAgSUNIOAorCSAgICBJQ0g5CiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1pODAxLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwppbmRleCBiYmIyZmJlLi5jN2JlMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtMzMsNiArMzMsNyBAQAogICAgIElDSDcJCTI3REEKICAgICBFU0IyCQkyNjlCCiAgICAgSUNIOAkJMjgzRQorICAgIElDSDkJCTI5MzAKICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyBzZXZlcmFsIHZlcnNpb25zIG9mIEludGVsJ3MgSS9PIENvbnRyb2xsZXIgSHVicyAoSUNIKS4KICAgICBGb3IgU01CdXMgc3VwcG9ydCwgdGhleSBhcmUgc2ltaWxhciB0byB0aGUgUElJWDQgYW5kIGFyZSBwYXJ0CiAgICAgb2YgSW50ZWwncyAnODEwJyBhbmQgb3RoZXIgY2hpcHNldHMuCkBAIC00NTcsNiArNDU4LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzE3KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQjJfMTcpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF81KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNikgfSwKIAl7IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwNHh4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jCmluZGV4IDA1ZmZmYjkuLjY4ZmU4NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwNHh4LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHA0eHguYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJZ3Bpb19saW5lX3NldChncGlvLT5zZGFfcGluLCAwKTsKIAogCWVyciA9IGkyY19iaXRfYWRkX2J1cygmZHJ2X2RhdGEtPmFkYXB0ZXIpOwotCWlmIChlcnIgIT0gMCkKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IENvdWxkIG5vdCBpbnN0YWxsICVzXG4iLCBwbGF0X2Rldi0+ZGV2LmJ1c19pZCk7CiAKIAkJa2ZyZWUoZHJ2X2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWRldi5jIGIvZHJpdmVycy9pMmMvaTJjLWRldi5jCmluZGV4IDNmODY5MDMuLjk0YTRlOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1kZXYuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKQEAgLTQyLDcgKzQyLDcgQEAKIHN0cnVjdCBpMmNfZGV2IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOwotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiB9OwogCiAjZGVmaW5lIEkyQ19NSU5PUlMJMjU2CkBAIC05MiwxNSArOTIsMTYgQEAKIAlzcGluX3VubG9jaygmaTJjX2Rldl9saXN0X2xvY2spOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2FkYXB0ZXJfbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWRhcHRlcl9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2RldiAqaTJjX2RldiA9IGkyY19kZXZfZ2V0X2J5X21pbm9yKE1JTk9SKGNsYXNzX2Rldi0+ZGV2dCkpOworCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2ID0gaTJjX2Rldl9nZXRfYnlfbWlub3IoTUlOT1IoZGV2LT5kZXZ0KSk7CiAKIAlpZiAoIWkyY19kZXYpCiAJCXJldHVybiAtRU5PREVWOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBpMmNfZGV2LT5hZGFwLT5uYW1lKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X2FkYXB0ZXJfbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19hZGFwdGVyX25hbWUsIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCBpMmNkZXZfcmVhZCAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKm9mZnNldCkKQEAgLTQxMywxNSArNDE0LDE0IEBACiAJCXJldHVybiBQVFJfRVJSKGkyY19kZXYpOwogCiAJLyogcmVnaXN0ZXIgdGhpcyBpMmMgZGV2aWNlIHdpdGggdGhlIGRyaXZlciBjb3JlICovCi0JaTJjX2Rldi0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShpMmNfZGV2X2NsYXNzLCBOVUxMLAotCQkJCQkJIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpLAotCQkJCQkJICZhZGFwLT5kZXYsICJpMmMtJWQiLAotCQkJCQkJIGFkYXAtPm5yKTsKLQlpZiAoIWkyY19kZXYtPmNsYXNzX2RldikgeworCWkyY19kZXYtPmRldiA9IGRldmljZV9jcmVhdGUoaTJjX2Rldl9jbGFzcywgJmFkYXAtPmRldiwKKwkJCQkgICAgIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpLAorCQkJCSAgICAgImkyYy0lZCIsIGFkYXAtPm5yKTsKKwlpZiAoIWkyY19kZXYtPmRldikgewogCQlyZXMgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KLQlyZXMgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoaTJjX2Rldi0+Y2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbmFtZSk7CisJcmVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGkyY19kZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOwogCWlmIChyZXMpCiAJCWdvdG8gZXJyb3JfZGVzdHJveTsKIApAQCAtNDI5LDcgKzQyOSw3IEBACiAJCSBhZGFwLT5uYW1lLCBhZGFwLT5ucik7CiAJcmV0dXJuIDA7CiBlcnJvcl9kZXN0cm95OgotCWNsYXNzX2RldmljZV9kZXN0cm95KGkyY19kZXZfY2xhc3MsIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpKTsKKwlkZXZpY2VfZGVzdHJveShpMmNfZGV2X2NsYXNzLCBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSk7CiBlcnJvcjoKIAlyZXR1cm5faTJjX2RldihpMmNfZGV2KTsKIAlrZnJlZShpMmNfZGV2KTsKQEAgLTQ0NCw5ICs0NDQsOSBAQAogCWlmICghaTJjX2RldikgLyogYXR0YWNoX2FkYXB0ZXIgbXVzdCBoYXZlIGZhaWxlZCAqLwogCQlyZXR1cm4gMDsKIAotCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShpMmNfZGV2LT5jbGFzc19kZXYsICZjbGFzc19kZXZpY2VfYXR0cl9uYW1lKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoaTJjX2Rldi0+ZGV2LCAmZGV2X2F0dHJfbmFtZSk7CiAJcmV0dXJuX2kyY19kZXYoaTJjX2Rldik7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3koaTJjX2Rldl9jbGFzcywgTUtERVYoSTJDX01BSk9SLCBhZGFwLT5ucikpOworCWRldmljZV9kZXN0cm95KGkyY19kZXZfY2xhc3MsIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpKTsKIAlrZnJlZShpMmNfZGV2KTsKIAogCXByX2RlYnVnKCJpMmMtZGV2OiBhZGFwdGVyIFslc10gdW5yZWdpc3RlcmVkXG4iLCBhZGFwLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCA4Y2NlZTljLi5lM2EyNjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0xNjM1LDcgKzE2MzUsNyBAQAogLyoKICoqIEdldCBBVEFQSV9GT1JNQVRfVU5JVCBwcm9ncmVzcyBpbmRpY2F0aW9uLgogKioKLSoqIFVzZXJsYW5kIGdpdmVzIGEgcG9pbnRlciB0byBhbiBpbnQuICBUaGUgaW50IGlzIHNldCB0byBhIHByb2dyZXNzcworKiogVXNlcmxhbmQgZ2l2ZXMgYSBwb2ludGVyIHRvIGFuIGludC4gIFRoZSBpbnQgaXMgc2V0IHRvIGEgcHJvZ3Jlc3MKICoqIGluZGljYXRvciAwLTY1NTM2LCB3aXRoIDY1NTM2PTEwMCUuCiAqKgogKiogSWYgdGhlIGRyaXZlIGRvZXMgbm90IHN1cHBvcnQgZm9ybWF0IHByb2dyZXNzIGluZGljYXRpb24sIHdlIGp1c3QgY2hlY2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwppbmRleCBiZWY0NzU5Li43ZWZkMjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCkBAIC0xOTIsMjAgKzE5MiwxMCBAQAogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZzdGstPnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gc3RrLT5wYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBzdGstPnBhcnNlLmNvbmZpZy5ybWFza1swXTsKIAotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0gICAgaWYgKCFwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgJiYKLQkhcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgJiYKLQkhcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnN0ay0+cGFyc2UpKQotCWlzX2ttZSA9ICgoc3RrLT5wYXJzZS5tYW5maWQubWFuZiA9PSBNQU5GSURfS01FKSAmJgotCQkgICgoc3RrLT5wYXJzZS5tYW5maWQuY2FyZCA9PSBQUk9ESURfS01FX0tYTEMwMDVfQSkgfHwKLQkJICAgKHN0ay0+cGFyc2UubWFuZmlkLmNhcmQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0IpKSk7CisgICAgaXNfa21lID0gKChsaW5rLT5tYW5mX2lkID09IE1BTkZJRF9LTUUpICYmCisJICAgICAgKChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9LTUVfS1hMQzAwNV9BKSB8fAorCSAgICAgICAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfS01FX0tYTEMwMDVfQikpKTsKIAogICAgIC8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQuLi4gbG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KICAgICBDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJnN0ay0+Y29uZikpOwpAQCAtNDA4LDggKzM5OCwxMCBAQAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTTUkgVkVORE9SIiwgIlNNSSBQUk9EVUNUIiwgMHgzMDg5NmM5MiwgMHg3MDNjYzVmNiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRPU0hJQkEiLCAiTUsyMDAxTVBMIiwgMHhiNDU4NWExYSwgMHgzNDg5ZTAwMyksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiVFJBTlNDRU5EICAgIDUxMk0gICAiLCAweGQwOTA5NDQzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVFJBTlNDRU5EIiwgIlRTMUdDRjgwIiwgMHg3MDliMWJmMSwgMHgyYTU0ZDRiMSksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRSQU5TQ0VORCIsICJUUzRHQ0YxMjAiLCAweDcwOWIxYmYxLCAweGY1NGE5MWM4KSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV0lUIiwgIklERTE2IiwgMHgyNDRlNTk5NCwgMHgzZTIzMjg1MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIldFSURBIiwgIlRXVFRJIiwgMHhjYzdjZjY5YywgMHgyMTJiYjkxOCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiU1RJIEZsYXNoIiwgMHhlNGExMzIwOSksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNUSSIsICJGbGFzaCA1LjAiLCAweGJmMmRmMThkLCAweDhjYjU3YTBlKSwKIAlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIlNhbkRpc2siLCAiQ29ubmVjdFBsdXMiLCAweDdhOTU0YmQ5LCAweDc0YmUwMGM2KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMgYi9kcml2ZXJzL2lkZS9wY2kvc2dpaW9jNC5jCmluZGV4IDI0NGY3ZWIuLmNmYWQwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYwpAQCAtNzY4LDE0ICs3NjgsNyBAQAogCXJldHVybiBpb2M0X3JlZ2lzdGVyX3N1Ym1vZHVsZSgmaW9jNF9pZGVfc3VibW9kdWxlKTsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0Ci1pb2M0X2lkZV9leGl0KHZvaWQpCi17Ci0JaW9jNF91bnJlZ2lzdGVyX3N1Ym1vZHVsZSgmaW9jNF9pZGVfc3VibW9kdWxlKTsKLX0KLQogbGF0ZV9pbml0Y2FsbChpb2M0X2lkZV9pbml0KTsgLyogQ2FsbCBvbmx5IGFmdGVyIElERSBpbml0IGlzIGRvbmUgKi8KLW1vZHVsZV9leGl0KGlvYzRfaWRlX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJBbmlrZXQgTWFsYXRwdXJlL0plcmVteSBIaWdkb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSURFIFBDSSBkcml2ZXIgbW9kdWxlIGZvciBTR0kgSU9DNCBCYXNlLUlPIENhcmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYwppbmRleCAyYWY2MzRkLi5lYjdhYjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KKyNpZmRlZiBDT05GSUdfUFBDX0NIUlAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjZW5kaWYKIApAQCAtNDQyLDcgKzQ0Miw3IEBACiAJaHdpZi0+c3BlZWRwcm9jID0gJnZpYV9zZXRfZHJpdmU7CiAKIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19DSFJQKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKKyNpZmRlZiBDT05GSUdfUFBDX0NIUlAKIAlpZihtYWNoaW5lX2lzKGNocnApICYmIF9jaHJwX3R5cGUgPT0gX0NIUlBfUGVnYXNvcykgewogCQlod2lmLT5pcnEgPSBod2lmLT5jaGFubmVsID8gMTUgOiAxNDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKaW5kZXggZTExMTg3ZS4uNzc2N2ExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodGVtcF9yZXEsICZyZXFfbGlzdCwgbGlzdCkgewotCQlpZiAodGltZV9hZnRlcihyZXEtPnRpbWVvdXQsIHRlbXBfcmVxLT50aW1lb3V0KSkKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEocmVxLT50aW1lb3V0LCB0ZW1wX3JlcS0+dGltZW91dCkpCiAJCQlicmVhazsKIAl9CiAKQEAgLTIyNSwxOSArMjI1LDE3IEBACiAKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0ZW1wX3JlcSwgJnJlcV9saXN0LCBsaXN0KSB7Ci0JCWlmIChyZXEtPnN0YXR1cykgeworCQlpZiAocmVxLT5zdGF0dXMgPT0gLUVOT0RBVEEpIHsKIAkJCXNyY19pbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJlcS0+c3JjX2FkZHI7CiAJCQlkc3RfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZyZXEtPmRzdF9hZGRyOwogCQkJcmVxLT5zdGF0dXMgPSBhZGRyX3Jlc29sdmVfcmVtb3RlKHNyY19pbiwgZHN0X2luLAogCQkJCQkJCSAgcmVxLT5hZGRyKTsKKwkJCWlmIChyZXEtPnN0YXR1cyAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlcS0+dGltZW91dCkpCisJCQkJcmVxLT5zdGF0dXMgPSAtRVRJTUVET1VUOworCQkJZWxzZSBpZiAocmVxLT5zdGF0dXMgPT0gLUVOT0RBVEEpCisJCQkJY29udGludWU7CiAJCX0KLQkJaWYgKHJlcS0+c3RhdHVzICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgcmVxLT50aW1lb3V0KSkKLQkJCXJlcS0+c3RhdHVzID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAocmVxLT5zdGF0dXMgPT0gLUVOT0RBVEEpCi0JCQljb250aW51ZTsKLQotCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZG9uZV9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnJlcS0+bGlzdCwgJmRvbmVfbGlzdCk7CiAJfQogCiAJaWYgKCFsaXN0X2VtcHR5KCZyZXFfbGlzdCkpIHsKQEAgLTM0Nyw4ICszNDUsNyBAQAogCQlpZiAocmVxLT5hZGRyID09IGFkZHIpIHsKIAkJCXJlcS0+c3RhdHVzID0gLUVDQU5DRUxFRDsKIAkJCXJlcS0+dGltZW91dCA9IGppZmZpZXM7Ci0JCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKLQkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZyZXFfbGlzdCk7CisJCQlsaXN0X21vdmUoJnJlcS0+bGlzdCwgJnJlcV9saXN0KTsKIAkJCXNldF90aW1lb3V0KHJlcS0+dGltZW91dCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggMjViMTAxOC4uZTVkYzQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0xNDcsMTIgKzE0NywxMiBAQAogCV9fYmUzMiBycV9wc247CiAJaW50IHRpbWVvdXRfbXM7CiAJZW51bSBpYl9tdHUgcGF0aF9tdHU7CisJX19iZTE2IHBrZXk7CiAJdTggcHJpdmF0ZV9kYXRhX2xlbjsKIAl1OCBtYXhfY21fcmV0cmllczsKIAl1OCBwZWVyX3RvX3BlZXI7CiAJdTggcmVzcG9uZGVyX3Jlc291cmNlczsKIAl1OCBpbml0aWF0b3JfZGVwdGg7Ci0JdTggbG9jYWxfYWNrX3RpbWVvdXQ7CiAJdTggcmV0cnlfY291bnQ7CiAJdTggcm5yX3JldHJ5X2NvdW50OwogCXU4IHNlcnZpY2VfdGltZW91dDsKQEAgLTI0MCwxMSArMjQwLDEwIEBACiAJaWYgKCFwcml2YXRlX2RhdGEgfHwgIXByaXZhdGVfZGF0YV9sZW4pCiAJCXJldHVybiBOVUxMOwogCi0JZGF0YSA9IGttYWxsb2MocHJpdmF0ZV9kYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGttZW1kdXAocHJpdmF0ZV9kYXRhLCBwcml2YXRlX2RhdGFfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JbWVtY3B5KGRhdGEsIHByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbik7CiAJcmV0dXJuIGRhdGE7CiB9CiAKQEAgLTY5MSw3ICs2OTAsNyBAQAogCSAqIHRpbWV3YWl0IGJlZm9yZSBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB3ZSd2ZSBleGl0ZWQgdGltZXdhaXQuCiAJICovCiAJY21faWRfcHJpdi0+aWQuc3RhdGUgPSBJQl9DTV9USU1FV0FJVDsKLQl3YWl0X3RpbWUgPSBjbV9jb252ZXJ0X3RvX21zKGNtX2lkX3ByaXYtPmxvY2FsX2Fja190aW1lb3V0KTsKKwl3YWl0X3RpbWUgPSBjbV9jb252ZXJ0X3RvX21zKGNtX2lkX3ByaXYtPmF2LnBhY2tldF9saWZlX3RpbWUgKyAxKTsKIAlxdWV1ZV9kZWxheWVkX3dvcmsoY20ud3EsICZjbV9pZF9wcml2LT50aW1ld2FpdF9pbmZvLT53b3JrLndvcmssCiAJCQkgICBtc2Vjc190b19qaWZmaWVzKHdhaXRfdGltZSkpOwogCWNtX2lkX3ByaXYtPnRpbWV3YWl0X2luZm8gPSBOVUxMOwpAQCAtMTAxMCw2ICsxMDA5LDcgQEAKIAljbV9pZF9wcml2LT5yZXNwb25kZXJfcmVzb3VyY2VzID0gcGFyYW0tPnJlc3BvbmRlcl9yZXNvdXJjZXM7CiAJY21faWRfcHJpdi0+cmV0cnlfY291bnQgPSBwYXJhbS0+cmV0cnlfY291bnQ7CiAJY21faWRfcHJpdi0+cGF0aF9tdHUgPSBwYXJhbS0+cHJpbWFyeV9wYXRoLT5tdHU7CisJY21faWRfcHJpdi0+cGtleSA9IHBhcmFtLT5wcmltYXJ5X3BhdGgtPnBrZXk7CiAJY21faWRfcHJpdi0+cXBfdHlwZSA9IHBhcmFtLT5xcF90eXBlOwogCiAJcmV0ID0gY21fYWxsb2NfbXNnKGNtX2lkX3ByaXYsICZjbV9pZF9wcml2LT5tc2cpOwpAQCAtMTAyNCw4ICsxMDI0LDYgQEAKIAogCWNtX2lkX3ByaXYtPmxvY2FsX3FwbiA9IGNtX3JlcV9nZXRfbG9jYWxfcXBuKHJlcV9tc2cpOwogCWNtX2lkX3ByaXYtPnJxX3BzbiA9IGNtX3JlcV9nZXRfc3RhcnRpbmdfcHNuKHJlcV9tc2cpOwotCWNtX2lkX3ByaXYtPmxvY2FsX2Fja190aW1lb3V0ID0KLQkJCQljbV9yZXFfZ2V0X3ByaW1hcnlfbG9jYWxfYWNrX3RpbWVvdXQocmVxX21zZyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJldCA9IGliX3Bvc3Rfc2VuZF9tYWQoY21faWRfcHJpdi0+bXNnLCBOVUxMKTsKQEAgLTE0MTAsOSArMTQwOCw4IEBACiAJY21faWRfcHJpdi0+aW5pdGlhdG9yX2RlcHRoID0gY21fcmVxX2dldF9yZXNwX3JlcyhyZXFfbXNnKTsKIAljbV9pZF9wcml2LT5yZXNwb25kZXJfcmVzb3VyY2VzID0gY21fcmVxX2dldF9pbml0X2RlcHRoKHJlcV9tc2cpOwogCWNtX2lkX3ByaXYtPnBhdGhfbXR1ID0gY21fcmVxX2dldF9wYXRoX210dShyZXFfbXNnKTsKKwljbV9pZF9wcml2LT5wa2V5ID0gcmVxX21zZy0+cGtleTsKIAljbV9pZF9wcml2LT5zcV9wc24gPSBjbV9yZXFfZ2V0X3N0YXJ0aW5nX3BzbihyZXFfbXNnKTsKLQljbV9pZF9wcml2LT5sb2NhbF9hY2tfdGltZW91dCA9Ci0JCQkJY21fcmVxX2dldF9wcmltYXJ5X2xvY2FsX2Fja190aW1lb3V0KHJlcV9tc2cpOwogCWNtX2lkX3ByaXYtPnJldHJ5X2NvdW50ID0gY21fcmVxX2dldF9yZXRyeV9jb3VudChyZXFfbXNnKTsKIAljbV9pZF9wcml2LT5ybnJfcmV0cnlfY291bnQgPSBjbV9yZXFfZ2V0X3Jucl9yZXRyeV9jb3VudChyZXFfbXNnKTsKIAljbV9pZF9wcml2LT5xcF90eXBlID0gY21fcmVxX2dldF9xcF90eXBlKHJlcV9tc2cpOwpAQCAtMTcxNiw3ICsxNzEzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQkvKiBTZWUgY29tbWVudCBpbiBpYl9jbV9lc3RhYmxpc2ggYWJvdXQgbG9va3VwLiAqLworCS8qIFNlZSBjb21tZW50IGluIGNtX2VzdGFibGlzaCBhYm91dCBsb29rdXAuICovCiAJY21faWRfcHJpdiA9IGNtX2FjcXVpcmVfaWQod29yay0+bG9jYWxfaWQsIHdvcmstPnJlbW90ZV9pZCk7CiAJaWYgKCFjbV9pZF9wcml2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0MDIsMTEgKzIzOTksMTYgQEAKIAljbV9pZF9wcml2ID0gY29udGFpbmVyX29mKGNtX2lkLCBzdHJ1Y3QgY21faWRfcHJpdmF0ZSwgaWQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKGNtX2lkLT5zdGF0ZSAhPSBJQl9DTV9FU1RBQkxJU0hFRCB8fAotCSAgICBjbV9pZC0+bGFwX3N0YXRlICE9IElCX0NNX0xBUF9JRExFKSB7CisJICAgIChjbV9pZC0+bGFwX3N0YXRlICE9IElCX0NNX0xBUF9VTklOSVQgJiYKKwkgICAgIGNtX2lkLT5sYXBfc3RhdGUgIT0gSUJfQ01fTEFQX0lETEUpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAorCXJldCA9IGNtX2luaXRfYXZfYnlfcGF0aChhbHRlcm5hdGVfcGF0aCwgJmNtX2lkX3ByaXYtPmFsdF9hdik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKIAlyZXQgPSBjbV9hbGxvY19tc2coY21faWRfcHJpdiwgJm1zZyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CkBAIC0yNDMxLDcgKzI0MzMsOCBAQAogfQogRVhQT1JUX1NZTUJPTChpYl9zZW5kX2NtX2xhcCk7CiAKLXN0YXRpYyB2b2lkIGNtX2Zvcm1hdF9wYXRoX2Zyb21fbGFwKHN0cnVjdCBpYl9zYV9wYXRoX3JlYyAqcGF0aCwKK3N0YXRpYyB2b2lkIGNtX2Zvcm1hdF9wYXRoX2Zyb21fbGFwKHN0cnVjdCBjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2LAorCQkJCSAgICBzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKnBhdGgsCiAJCQkJICAgIHN0cnVjdCBjbV9sYXBfbXNnICpsYXBfbXNnKQogewogCW1lbXNldChwYXRoLCAwLCBzaXplb2YgKnBhdGgpOwpAQCAtMjQ0MywxMCArMjQ0NiwxMCBAQAogCXBhdGgtPmhvcF9saW1pdCA9IGxhcF9tc2ctPmFsdF9ob3BfbGltaXQ7CiAJcGF0aC0+dHJhZmZpY19jbGFzcyA9IGNtX2xhcF9nZXRfdHJhZmZpY19jbGFzcyhsYXBfbXNnKTsKIAlwYXRoLT5yZXZlcnNpYmxlID0gMTsKLQkvKiBwa2V5IGlzIHNhbWUgYXMgaW4gUkVRICovCisJcGF0aC0+cGtleSA9IGNtX2lkX3ByaXYtPnBrZXk7CiAJcGF0aC0+c2wgPSBjbV9sYXBfZ2V0X3NsKGxhcF9tc2cpOwogCXBhdGgtPm10dV9zZWxlY3RvciA9IElCX1NBX0VROwotCS8qIG10dSBpcyBzYW1lIGFzIGluIFJFUSAqLworCXBhdGgtPm10dSA9IGNtX2lkX3ByaXYtPnBhdGhfbXR1OwogCXBhdGgtPnJhdGVfc2VsZWN0b3IgPSBJQl9TQV9FUTsKIAlwYXRoLT5yYXRlID0gY21fbGFwX2dldF9wYWNrZXRfcmF0ZShsYXBfbXNnKTsKIAlwYXRoLT5wYWNrZXRfbGlmZV90aW1lX3NlbGVjdG9yID0gSUJfU0FfRVE7CkBAIC0yNDcyLDcgKzI0NzUsNyBAQAogCiAJcGFyYW0gPSAmd29yay0+Y21fZXZlbnQucGFyYW0ubGFwX3JjdmQ7CiAJcGFyYW0tPmFsdGVybmF0ZV9wYXRoID0gJndvcmstPnBhdGhbMF07Ci0JY21fZm9ybWF0X3BhdGhfZnJvbV9sYXAocGFyYW0tPmFsdGVybmF0ZV9wYXRoLCBsYXBfbXNnKTsKKwljbV9mb3JtYXRfcGF0aF9mcm9tX2xhcChjbV9pZF9wcml2LCBwYXJhbS0+YWx0ZXJuYXRlX3BhdGgsIGxhcF9tc2cpOwogCXdvcmstPmNtX2V2ZW50LnByaXZhdGVfZGF0YSA9ICZsYXBfbXNnLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMjQ4MCw2ICsyNDgzLDcgQEAKIAkJZ290byB1bmxvY2s7CiAKIAlzd2l0Y2ggKGNtX2lkX3ByaXYtPmlkLmxhcF9zdGF0ZSkgeworCWNhc2UgSUJfQ01fTEFQX1VOSU5JVDoKIAljYXNlIElCX0NNX0xBUF9JRExFOgogCQlicmVhazsKIAljYXNlIElCX0NNX01SQV9MQVBfU0VOVDoKQEAgLTI1MDIsNiArMjUwNiwxMCBAQAogCiAJY21faWRfcHJpdi0+aWQubGFwX3N0YXRlID0gSUJfQ01fTEFQX1JDVkQ7CiAJY21faWRfcHJpdi0+dGlkID0gbGFwX21zZy0+aGRyLnRpZDsKKwljbV9pbml0X2F2X2Zvcl9yZXNwb25zZSh3b3JrLT5wb3J0LCB3b3JrLT5tYWRfcmVjdl93Yy0+d2MsCisJCQkJd29yay0+bWFkX3JlY3Zfd2MtPnJlY3ZfYnVmLmdyaCwKKwkJCQkmY21faWRfcHJpdi0+YXYpOworCWNtX2luaXRfYXZfYnlfcGF0aChwYXJhbS0+YWx0ZXJuYXRlX3BhdGgsICZjbV9pZF9wcml2LT5hbHRfYXYpOwogCXJldCA9IGF0b21pY19pbmNfYW5kX3Rlc3QoJmNtX2lkX3ByaXYtPndvcmtfY291bnQpOwogCWlmICghcmV0KQogCQlsaXN0X2FkZF90YWlsKCZ3b3JrLT5saXN0LCAmY21faWRfcHJpdi0+d29ya19saXN0KTsKQEAgLTMwNDAsNyArMzA0OCw3IEBACiAJCWNtX2ZyZWVfd29yayh3b3JrKTsKIH0KIAotaW50IGliX2NtX2VzdGFibGlzaChzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKQorc3RhdGljIGludCBjbV9lc3RhYmxpc2goc3RydWN0IGliX2NtX2lkICpjbV9pZCkKIHsKIAlzdHJ1Y3QgY21faWRfcHJpdmF0ZSAqY21faWRfcHJpdjsKIAlzdHJ1Y3QgY21fd29yayAqd29yazsKQEAgLTMwODgsNyArMzA5Niw0NCBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGliX2NtX2VzdGFibGlzaCk7CisKK3N0YXRpYyBpbnQgY21fbWlncmF0ZShzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKQoreworCXN0cnVjdCBjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwljbV9pZF9wcml2ID0gY29udGFpbmVyX29mKGNtX2lkLCBzdHJ1Y3QgY21faWRfcHJpdmF0ZSwgaWQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKGNtX2lkLT5zdGF0ZSA9PSBJQl9DTV9FU1RBQkxJU0hFRCAmJgorCSAgICAoY21faWQtPmxhcF9zdGF0ZSA9PSBJQl9DTV9MQVBfVU5JTklUIHx8CisJICAgICBjbV9pZC0+bGFwX3N0YXRlID09IElCX0NNX0xBUF9JRExFKSkgeworCQljbV9pZC0+bGFwX3N0YXRlID0gSUJfQ01fTEFQX0lETEU7CisJCWNtX2lkX3ByaXYtPmF2ID0gY21faWRfcHJpdi0+YWx0X2F2OworCX0gZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtX2lkX3ByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpYl9jbV9ub3RpZnkoc3RydWN0IGliX2NtX2lkICpjbV9pZCwgZW51bSBpYl9ldmVudF90eXBlIGV2ZW50KQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQl9FVkVOVF9DT01NX0VTVDoKKwkJcmV0ID0gY21fZXN0YWJsaXNoKGNtX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBJQl9FVkVOVF9QQVRIX01JRzoKKwkJcmV0ID0gY21fbWlncmF0ZShjbV9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGliX2NtX25vdGlmeSk7CiAKIHN0YXRpYyB2b2lkIGNtX3JlY3ZfaGFuZGxlcihzdHJ1Y3QgaWJfbWFkX2FnZW50ICptYWRfYWdlbnQsCiAJCQkgICAgc3RydWN0IGliX21hZF9yZWN2X3djICptYWRfcmVjdl93YykKQEAgLTMxNzMsOCArMzIxOCw3IEBACiAJY2FzZSBJQl9DTV9FU1RBQkxJU0hFRDoKIAkJKnFwX2F0dHJfbWFzayA9IElCX1FQX1NUQVRFIHwgSUJfUVBfQUNDRVNTX0ZMQUdTIHwKIAkJCQlJQl9RUF9QS0VZX0lOREVYIHwgSUJfUVBfUE9SVDsKLQkJcXBfYXR0ci0+cXBfYWNjZXNzX2ZsYWdzID0gSUJfQUNDRVNTX0xPQ0FMX1dSSVRFIHwKLQkJCQkJICAgSUJfQUNDRVNTX1JFTU9URV9XUklURTsKKwkJcXBfYXR0ci0+cXBfYWNjZXNzX2ZsYWdzID0gSUJfQUNDRVNTX1JFTU9URV9XUklURTsKIAkJaWYgKGNtX2lkX3ByaXYtPnJlc3BvbmRlcl9yZXNvdXJjZXMpCiAJCQlxcF9hdHRyLT5xcF9hY2Nlc3NfZmxhZ3MgfD0gSUJfQUNDRVNTX1JFTU9URV9SRUFEIHwKIAkJCQkJCSAgICBJQl9BQ0NFU1NfUkVNT1RFX0FUT01JQzsKQEAgLTMyMjIsNiArMzI2Niw5IEBACiAJCWlmIChjbV9pZF9wcml2LT5hbHRfYXYuYWhfYXR0ci5kbGlkKSB7CiAJCQkqcXBfYXR0cl9tYXNrIHw9IElCX1FQX0FMVF9QQVRIOwogCQkJcXBfYXR0ci0+YWx0X3BvcnRfbnVtID0gY21faWRfcHJpdi0+YWx0X2F2LnBvcnQtPnBvcnRfbnVtOworCQkJcXBfYXR0ci0+YWx0X3BrZXlfaW5kZXggPSBjbV9pZF9wcml2LT5hbHRfYXYucGtleV9pbmRleDsKKwkJCXFwX2F0dHItPmFsdF90aW1lb3V0ID0KKwkJCQkJY21faWRfcHJpdi0+YWx0X2F2LnBhY2tldF9saWZlX3RpbWUgKyAxOwogCQkJcXBfYXR0ci0+YWx0X2FoX2F0dHIgPSBjbV9pZF9wcml2LT5hbHRfYXYuYWhfYXR0cjsKIAkJfQogCQlyZXQgPSAwOwpAQCAtMzI0OCwxOSArMzI5NSwzMSBAQAogCWNhc2UgSUJfQ01fUkVQX1NFTlQ6CiAJY2FzZSBJQl9DTV9NUkFfUkVQX1JDVkQ6CiAJY2FzZSBJQl9DTV9FU1RBQkxJU0hFRDoKLQkJKnFwX2F0dHJfbWFzayA9IElCX1FQX1NUQVRFIHwgSUJfUVBfU1FfUFNOOwotCQlxcF9hdHRyLT5zcV9wc24gPSBiZTMyX3RvX2NwdShjbV9pZF9wcml2LT5zcV9wc24pOwotCQlpZiAoY21faWRfcHJpdi0+cXBfdHlwZSA9PSBJQl9RUFRfUkMpIHsKLQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfVElNRU9VVCB8IElCX1FQX1JFVFJZX0NOVCB8Ci0JCQkJCSBJQl9RUF9STlJfUkVUUlkgfAotCQkJCQkgSUJfUVBfTUFYX1FQX1JEX0FUT01JQzsKLQkJCXFwX2F0dHItPnRpbWVvdXQgPSBjbV9pZF9wcml2LT5sb2NhbF9hY2tfdGltZW91dDsKLQkJCXFwX2F0dHItPnJldHJ5X2NudCA9IGNtX2lkX3ByaXYtPnJldHJ5X2NvdW50OwotCQkJcXBfYXR0ci0+cm5yX3JldHJ5ID0gY21faWRfcHJpdi0+cm5yX3JldHJ5X2NvdW50OwotCQkJcXBfYXR0ci0+bWF4X3JkX2F0b21pYyA9IGNtX2lkX3ByaXYtPmluaXRpYXRvcl9kZXB0aDsKLQkJfQotCQlpZiAoY21faWRfcHJpdi0+YWx0X2F2LmFoX2F0dHIuZGxpZCkgewotCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9QQVRIX01JR19TVEFURTsKKwkJaWYgKGNtX2lkX3ByaXYtPmlkLmxhcF9zdGF0ZSA9PSBJQl9DTV9MQVBfVU5JTklUKSB7CisJCQkqcXBfYXR0cl9tYXNrID0gSUJfUVBfU1RBVEUgfCBJQl9RUF9TUV9QU047CisJCQlxcF9hdHRyLT5zcV9wc24gPSBiZTMyX3RvX2NwdShjbV9pZF9wcml2LT5zcV9wc24pOworCQkJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgPT0gSUJfUVBUX1JDKSB7CisJCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9USU1FT1VUIHwgSUJfUVBfUkVUUllfQ05UIHwKKwkJCQkJCSBJQl9RUF9STlJfUkVUUlkgfAorCQkJCQkJIElCX1FQX01BWF9RUF9SRF9BVE9NSUM7CisJCQkJcXBfYXR0ci0+dGltZW91dCA9CisJCQkJCWNtX2lkX3ByaXYtPmF2LnBhY2tldF9saWZlX3RpbWUgKyAxOworCQkJCXFwX2F0dHItPnJldHJ5X2NudCA9IGNtX2lkX3ByaXYtPnJldHJ5X2NvdW50OworCQkJCXFwX2F0dHItPnJucl9yZXRyeSA9IGNtX2lkX3ByaXYtPnJucl9yZXRyeV9jb3VudDsKKwkJCQlxcF9hdHRyLT5tYXhfcmRfYXRvbWljID0KKwkJCQkJY21faWRfcHJpdi0+aW5pdGlhdG9yX2RlcHRoOworCQkJfQorCQkJaWYgKGNtX2lkX3ByaXYtPmFsdF9hdi5haF9hdHRyLmRsaWQpIHsKKwkJCQkqcXBfYXR0cl9tYXNrIHw9IElCX1FQX1BBVEhfTUlHX1NUQVRFOworCQkJCXFwX2F0dHItPnBhdGhfbWlnX3N0YXRlID0gSUJfTUlHX1JFQVJNOworCQkJfQorCQl9IGVsc2UgeworCQkJKnFwX2F0dHJfbWFzayA9IElCX1FQX0FMVF9QQVRIIHwgSUJfUVBfUEFUSF9NSUdfU1RBVEU7CisJCQlxcF9hdHRyLT5hbHRfcG9ydF9udW0gPSBjbV9pZF9wcml2LT5hbHRfYXYucG9ydC0+cG9ydF9udW07CisJCQlxcF9hdHRyLT5hbHRfcGtleV9pbmRleCA9IGNtX2lkX3ByaXYtPmFsdF9hdi5wa2V5X2luZGV4OworCQkJcXBfYXR0ci0+YWx0X3RpbWVvdXQgPQorCQkJCWNtX2lkX3ByaXYtPmFsdF9hdi5wYWNrZXRfbGlmZV90aW1lICsgMTsKKwkJCXFwX2F0dHItPmFsdF9haF9hdHRyID0gY21faWRfcHJpdi0+YWx0X2F2LmFoX2F0dHI7CiAJCQlxcF9hdHRyLT5wYXRoX21pZ19zdGF0ZSA9IElCX01JR19SRUFSTTsKIAkJfQogCQlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwppbmRleCA4NDUwOTBiLi5jZjQ4ZjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlxcF9hdHRyLnFwX3N0YXRlID0gSUJfUVBTX0lOSVQ7Ci0JcXBfYXR0ci5xcF9hY2Nlc3NfZmxhZ3MgPSBJQl9BQ0NFU1NfTE9DQUxfV1JJVEU7CisJcXBfYXR0ci5xcF9hY2Nlc3NfZmxhZ3MgPSAwOwogCXFwX2F0dHIucG9ydF9udW0gPSBpZF9wcml2LT5pZC5wb3J0X251bTsKIAlyZXR1cm4gaWJfbW9kaWZ5X3FwKHFwLCAmcXBfYXR0ciwgSUJfUVBfU1RBVEUgfCBJQl9RUF9BQ0NFU1NfRkxBR1MgfAogCQkJCQkgIElCX1FQX1BLRVlfSU5ERVggfCBJQl9RUF9QT1JUKTsKQEAgLTkzNSwxMyArOTM1LDggQEAKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlyZXQgPSBjbWFfYWNxdWlyZV9kZXYoY29ubl9pZCk7CiAJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWNtYV9leGNoKGNvbm5faWQsIENNQV9ERVNUUk9ZSU5HKTsKLQkJY21hX3JlbGVhc2VfcmVtb3ZlKGNvbm5faWQpOwotCQlyZG1hX2Rlc3Ryb3lfaWQoJmNvbm5faWQtPmlkKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChyZXQpCisJCWdvdG8gcmVsZWFzZV9jb25uX2lkOwogCiAJY29ubl9pZC0+Y21faWQuaWIgPSBjbV9pZDsKIAljbV9pZC0+Y29udGV4dCA9IGNvbm5faWQ7CkBAIC05NTEsMTMgKzk0NiwxNyBAQAogCXJldCA9IGNtYV9ub3RpZnlfdXNlcihjb25uX2lkLCBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVCwgMCwKIAkJCSAgICAgIGliX2V2ZW50LT5wcml2YXRlX2RhdGEgKyBvZmZzZXQsCiAJCQkgICAgICBJQl9DTV9SRVFfUFJJVkFURV9EQVRBX1NJWkUgLSBvZmZzZXQpOwotCWlmIChyZXQpIHsKLQkJLyogRGVzdHJveSB0aGUgQ00gSUQgYnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUuICovCi0JCWNvbm5faWQtPmNtX2lkLmliID0gTlVMTDsKLQkJY21hX2V4Y2goY29ubl9pZCwgQ01BX0RFU1RST1lJTkcpOwotCQljbWFfcmVsZWFzZV9yZW1vdmUoY29ubl9pZCk7Ci0JCXJkbWFfZGVzdHJveV9pZCgmY29ubl9pZC0+aWQpOwotCX0KKwlpZiAoIXJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBEZXN0cm95IHRoZSBDTSBJRCBieSByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZS4gKi8KKwljb25uX2lkLT5jbV9pZC5pYiA9IE5VTEw7CisKK3JlbGVhc2VfY29ubl9pZDoKKwljbWFfZXhjaChjb25uX2lkLCBDTUFfREVTVFJPWUlORyk7CisJY21hX3JlbGVhc2VfcmVtb3ZlKGNvbm5faWQpOworCXJkbWFfZGVzdHJveV9pZCgmY29ubl9pZC0+aWQpOworCiBvdXQ6CiAJY21hX3JlbGVhc2VfcmVtb3ZlKGxpc3Rlbl9pZCk7CiAJcmV0dXJuIHJldDsKQEAgLTE0ODEsMTkgKzE0ODAsMTggQEAKIAl1OCBwOwogCiAJbXV0ZXhfbG9jaygmbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbWFfZGV2LCAmZGV2X2xpc3QsIGxpc3QpCi0JCWZvciAocCA9IDE7IHAgPD0gY21hX2Rldi0+ZGV2aWNlLT5waHlzX3BvcnRfY250OyArK3ApCi0JCQlpZiAoIWliX3F1ZXJ5X3BvcnQgKGNtYV9kZXYtPmRldmljZSwgcCwgJnBvcnRfYXR0cikgJiYKLQkJCSAgICBwb3J0X2F0dHIuc3RhdGUgPT0gSUJfUE9SVF9BQ1RJVkUpCi0JCQkJZ290byBwb3J0X2ZvdW5kOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZkZXZfbGlzdCkpIHsKLQkJcCA9IDE7Ci0JCWNtYV9kZXYgPSBsaXN0X2VudHJ5KGRldl9saXN0Lm5leHQsIHN0cnVjdCBjbWFfZGV2aWNlLCBsaXN0KTsKLQl9IGVsc2UgeworCWlmIChsaXN0X2VtcHR5KCZkZXZfbGlzdCkpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY21hX2RldiwgJmRldl9saXN0LCBsaXN0KQorCQlmb3IgKHAgPSAxOyBwIDw9IGNtYV9kZXYtPmRldmljZS0+cGh5c19wb3J0X2NudDsgKytwKQorCQkJaWYgKCFpYl9xdWVyeV9wb3J0KGNtYV9kZXYtPmRldmljZSwgcCwgJnBvcnRfYXR0cikgJiYKKwkJCSAgICBwb3J0X2F0dHIuc3RhdGUgPT0gSUJfUE9SVF9BQ1RJVkUpCisJCQkJZ290byBwb3J0X2ZvdW5kOworCisJcCA9IDE7CisJY21hX2RldiA9IGxpc3RfZW50cnkoZGV2X2xpc3QubmV4dCwgc3RydWN0IGNtYV9kZXZpY2UsIGxpc3QpOwogCiBwb3J0X2ZvdW5kOgogCXJldCA9IGliX2dldF9jYWNoZWRfZ2lkKGNtYV9kZXYtPmRldmljZSwgcCwgMCwgJmdpZCk7CkBAIC0yMTIzLDggKzIxMjEsNiBAQAogCiAJY21hX2Rldi0+ZGV2aWNlID0gZGV2aWNlOwogCWNtYV9kZXYtPm5vZGVfZ3VpZCA9IGRldmljZS0+bm9kZV9ndWlkOwotCWlmICghY21hX2Rldi0+bm9kZV9ndWlkKQotCQlnb3RvIGVycjsKIAogCWluaXRfY29tcGxldGlvbigmY21hX2Rldi0+Y29tcCk7CiAJYXRvbWljX3NldCgmY21hX2Rldi0+cmVmY291bnQsIDEpOwpAQCAtMjEzNiw5ICsyMTMyLDYgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlkX3ByaXYsICZsaXN0ZW5fYW55X2xpc3QsIGxpc3QpCiAJCWNtYV9saXN0ZW5fb25fZGV2KGlkX3ByaXYsIGNtYV9kZXYpOwogCW11dGV4X3VubG9jaygmbG9jayk7Ci0JcmV0dXJuOwotZXJyOgotCWtmcmVlKGNtYV9kZXYpOwogfQogCiBzdGF0aWMgaW50IGNtYV9yZW1vdmVfaWRfZGV2KHN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMKaW5kZXggYzNmYjMwNC4uY2Y3OTdkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYwpAQCAtODAsNyArODAsNyBAQAogICogMSkgaW4gdGhlIGV2ZW50IHVwY2FsbCwgY21fZXZlbnRfaGFuZGxlcigpLCBmb3IgYSBsaXN0ZW5pbmcgY21faWQuICBJZgogICogICAgdGhlIGJhY2tsb2cgaXMgZXhjZWVkZWQsIHRoZW4gbm8gbW9yZSBjb25uZWN0aW9uIHJlcXVlc3QgZXZlbnRzIHdpbGwKICAqICAgIGJlIHByb2Nlc3NlZC4gIGNtX2V2ZW50X2hhbmRsZXIoKSByZXR1cm5zIC1FTk9NRU0gaW4gdGhpcyBjYXNlLiAgSXRzIHVwCi0gKiAgICB0byB0aGUgcHJvdmlkZXIgdG8gcmVqZWN0IHRoZSBjb25uZWN0aW5vIHJlcXVlc3QuCisgKiAgICB0byB0aGUgcHJvdmlkZXIgdG8gcmVqZWN0IHRoZSBjb25uZWN0aW9uIHJlcXVlc3QuCiAgKiAyKSBpbiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IHdvcmtxdWV1ZSBoYW5kbGVyLCBjbV9jb25uX3JlcV9oYW5kbGVyKCkuCiAgKiAgICBJZiB3b3JrIGVsZW1lbnRzIGNhbm5vdCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBuZXcgY29ubmVjdCByZXF1ZXN0IGNtX2lkLAogICogICAgdGhlbiBJV0NNIHdpbGwgY2FsbCB0aGUgcHJvdmlkZXIgcmVqZWN0IG1ldGhvZC4gIFRoaXMgaXMgb2sgc2luY2UKQEAgLTEzMSwyNiArMTMxLDI1IEBACiB9CiAKIC8qCi0gKiBTYXZlIHByaXZhdGUgZGF0YSBmcm9tIGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMgaW4gdGhlCi0gKiBjbV9pZF9wcml2IHNvIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIGRvZXNuJ3QgaGF2ZSB0by4gIEFkanVzdAorICogU2F2ZSBwcml2YXRlIGRhdGEgZnJvbSBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3RzIHRvCisgKiBpd19jbV9ldmVudCwgc28gdGhlIGxvdyBsZXZlbCBkcml2ZXIgZG9lc24ndCBoYXZlIHRvLiBBZGp1c3QKICAqIHRoZSBldmVudCBwdHIgdG8gcG9pbnQgdG8gdGhlIGxvY2FsIGNvcHkuCiAgKi8KLXN0YXRpYyBpbnQgY29weV9wcml2YXRlX2RhdGEoc3RydWN0IGl3Y21faWRfcHJpdmF0ZSAqY21faWRfcHJpdiwKLQkJICAgICAgIHN0cnVjdCBpd19jbV9ldmVudCAqZXZlbnQpCitzdGF0aWMgaW50IGNvcHlfcHJpdmF0ZV9kYXRhKHN0cnVjdCBpd19jbV9ldmVudCAqZXZlbnQpCiB7CiAJdm9pZCAqcDsKIAotCXAgPSBrbWFsbG9jKGV2ZW50LT5wcml2YXRlX2RhdGFfbGVuLCBHRlBfQVRPTUlDKTsKKwlwID0ga21lbWR1cChldmVudC0+cHJpdmF0ZV9kYXRhLCBldmVudC0+cHJpdmF0ZV9kYXRhX2xlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1jcHkocCwgZXZlbnQtPnByaXZhdGVfZGF0YSwgZXZlbnQtPnByaXZhdGVfZGF0YV9sZW4pOwogCWV2ZW50LT5wcml2YXRlX2RhdGEgPSBwOwogCXJldHVybiAwOwogfQogCiAvKgotICogUmVsZWFzZSBhIHJlZmVyZW5jZSBvbiBjbV9pZC4gSWYgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIGJlaW5nIHJlbW92ZWQKLSAqIGFuZCBpd19kZXN0cm95X2NtX2lkIGlzIHdhaXRpbmcsIHdha2UgdXAgdGhlIHdhaXRpbmcgdGhyZWFkLgorICogUmVsZWFzZSBhIHJlZmVyZW5jZSBvbiBjbV9pZC4gSWYgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIGJlaW5nCisgKiByZWxlYXNlZCwgZW5hYmxlIHRoZSB3YWl0aW5nIHRocmVhZCAoaW4gaXdfZGVzdHJveV9jbV9pZCkgdG8KKyAqIGdldCB3b2tlbiB1cCwgYW5kIHJldHVybiAxIGlmIGEgdGhyZWFkIGlzIGFscmVhZHkgd2FpdGluZy4KICAqLwogc3RhdGljIGludCBpd2NtX2RlcmVmX2lkKHN0cnVjdCBpd2NtX2lkX3ByaXZhdGUgKmNtX2lkX3ByaXYpCiB7CkBAIC0yNDMsNyArMjQyLDcgQEAKIC8qCiAgKiBDTV9JRCA8LS0gQ0xPU0lORwogICoKLSAqIEJsb2NrIGlmIGEgcGFzc2l2ZSBvciBhY3RpdmUgY29ubmVjdGlvbiBpcyBjdXJyZW5sdHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGVuCisgKiBCbG9jayBpZiBhIHBhc3NpdmUgb3IgYWN0aXZlIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlbgogICogcHJvY2VzcyB0aGUgZXZlbnQgYXMgZm9sbG93czoKICAqIC0gSWYgd2UgYXJlIEVTVEFCTElTSEVELCBtb3ZlIHRvIENMT1NJTkcgYW5kIG1vZGlmeSB0aGUgUVAgc3RhdGUKICAqICAgYmFzZWQgb24gdGhlIGFicnVwdCBmbGFnCkBAIC00MDgsNyArNDA3LDcgQEAKIHsKIAlzdHJ1Y3QgaXdjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWNtX2lkX3ByaXYgPSBjb250YWluZXJfb2YoY21faWQsIHN0cnVjdCBpd2NtX2lkX3ByaXZhdGUsIGlkKTsKIApAQCAtNTM1LDcgKzUzNCw3IEBACiBpbnQgaXdfY21fY29ubmVjdChzdHJ1Y3QgaXdfY21faWQgKmNtX2lkLCBzdHJ1Y3QgaXdfY21fY29ubl9wYXJhbSAqaXdfcGFyYW0pCiB7CiAJc3RydWN0IGl3Y21faWRfcHJpdmF0ZSAqY21faWRfcHJpdjsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGliX3FwICpxcDsKIApAQCAtNjIwLDcgKzYxOSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3Rlbl9pZF9wcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKGxpc3Rlbl9pZF9wcml2LT5zdGF0ZSAhPSBJV19DTV9TVEFURV9MSVNURU4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdGVuX2lkX3ByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdGVuX2lkX3ByaXYtPmxvY2ssIGZsYWdzKTsKIApAQCAtNjI5LDcgKzYyOCw3IEBACiAJCQkJbGlzdGVuX2lkX3ByaXYtPmlkLmNvbnRleHQpOwogCS8qIElmIHRoZSBjbV9pZCBjb3VsZCBub3QgYmUgY3JlYXRlZCwgaWdub3JlIHRoZSByZXF1ZXN0ICovCiAJaWYgKElTX0VSUihjbV9pZCkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAljbV9pZC0+cHJvdmlkZXJfZGF0YSA9IGl3X2V2ZW50LT5wcm92aWRlcl9kYXRhOwogCWNtX2lkLT5sb2NhbF9hZGRyID0gaXdfZXZlbnQtPmxvY2FsX2FkZHI7CkBAIC02NDIsNyArNjQxLDcgQEAKIAlpZiAocmV0KSB7CiAJCWl3X2NtX3JlamVjdChjbV9pZCwgTlVMTCwgMCk7CiAJCWl3X2Rlc3Ryb3lfY21faWQoY21faWQpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCS8qIENhbGwgdGhlIGNsaWVudCBDTSBoYW5kbGVyICovCkBAIC02NTQsNiArNjUzLDcgQEAKIAkJCWtmcmVlKGNtX2lkKTsKIAl9CiAKK291dDoKIAlpZiAoaXdfZXZlbnQtPnByaXZhdGVfZGF0YV9sZW4pCiAJCWtmcmVlKGl3X2V2ZW50LT5wcml2YXRlX2RhdGEpOwogfQpAQCAtNjc0LDcgKzY3NCw3IEBACiAJCQkgICAgICAgc3RydWN0IGl3X2NtX2V2ZW50ICppd19ldmVudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCkBAIC03MDQsNyArNzA0LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaXdfY21fZXZlbnQgKml3X2V2ZW50KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CiAJLyoKQEAgLTgzMCw3ICs4MzAsOCBAQAogICovCiBzdGF0aWMgdm9pZCBjbV93b3JrX2hhbmRsZXIodm9pZCAqYXJnKQogewotCXN0cnVjdCBpd2NtX3dvcmsgKndvcmsgPSBhcmcsIGx3b3JrOworCXN0cnVjdCBpd2NtX3dvcmsgKndvcmsgPSBhcmc7CisJc3RydWN0IGl3X2NtX2V2ZW50IGxldmVudDsKIAlzdHJ1Y3QgaXdjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2ID0gd29yay0+Y21faWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZW1wdHk7CkBAIC04NDMsMTEgKzg0NCwxMSBAQAogCQkJCSAgc3RydWN0IGl3Y21fd29yaywgbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJndvcmstPmxpc3QpOwogCQllbXB0eSA9IGxpc3RfZW1wdHkoJmNtX2lkX3ByaXYtPndvcmtfbGlzdCk7Ci0JCWx3b3JrID0gKndvcms7CisJCWxldmVudCA9IHdvcmstPmV2ZW50OwogCQlwdXRfd29yayh3b3JrKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JCXJldCA9IHByb2Nlc3NfZXZlbnQoY21faWRfcHJpdiwgJndvcmstPmV2ZW50KTsKKwkJcmV0ID0gcHJvY2Vzc19ldmVudChjbV9pZF9wcml2LCAmbGV2ZW50KTsKIAkJaWYgKHJldCkgewogCQkJc2V0X2JpdChJV0NNX0ZfQ0FMTEJBQ0tfREVTVFJPWSwgJmNtX2lkX3ByaXYtPmZsYWdzKTsKIAkJCWRlc3Ryb3lfY21faWQoJmNtX2lkX3ByaXYtPmlkKTsKQEAgLTkwNiw3ICs5MDcsNyBAQAogCWlmICgod29yay0+ZXZlbnQuZXZlbnQgPT0gSVdfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUIHx8CiAJICAgICB3b3JrLT5ldmVudC5ldmVudCA9PSBJV19DTV9FVkVOVF9DT05ORUNUX1JFUExZKSAmJgogCSAgICB3b3JrLT5ldmVudC5wcml2YXRlX2RhdGFfbGVuKSB7Ci0JCXJldCA9IGNvcHlfcHJpdmF0ZV9kYXRhKGNtX2lkX3ByaXYsICZ3b3JrLT5ldmVudCk7CisJCXJldCA9IGNvcHlfcHJpdmF0ZV9kYXRhKCZ3b3JrLT5ldmVudCk7CiAJCWlmIChyZXQpIHsKIAkJCXB1dF93b3JrKHdvcmspOwogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCmluZGV4IGE3MmJjZWEuLjNmOWMxNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCkBAIC00Niw3ICs0Niw3IEBACiBNT0RVTEVfQVVUSE9SKCJIYWwgUm9zZW5zdG9jayIpOwogTU9EVUxFX0FVVEhPUigiU2VhbiBIZWZ0eSIpOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICppYl9tYWRfY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmliX21hZF9jYWNoZTsKIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaWJfbWFkX3BvcnRfbGlzdDsKIHN0YXRpYyB1MzIgaWJfbWFkX2NsaWVudF9pZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IGFkNGY0ZDUuLmYxNTIyMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC0xNjEsMTIgKzE2MSwxNCBAQAogCQkJCSAgICBzdHJ1Y3QgaWJfdWNtX2V2ZW50LCBjdHhfbGlzdCk7CiAJCWxpc3RfZGVsKCZ1ZXZlbnQtPmZpbGVfbGlzdCk7CiAJCWxpc3RfZGVsKCZ1ZXZlbnQtPmN0eF9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPmZpbGUtPmZpbGVfbXV0ZXgpOwogCiAJCS8qIGNsZWFyIGluY29taW5nIGNvbm5lY3Rpb25zLiAqLwogCQlpZiAoaWJfdWNtX25ld19jbV9pZCh1ZXZlbnQtPnJlc3AuZXZlbnQpKQogCQkJaWJfZGVzdHJveV9jbV9pZCh1ZXZlbnQtPmNtX2lkKTsKIAogCQlrZnJlZSh1ZXZlbnQpOworCQltdXRleF9sb2NrKCZjdHgtPmZpbGUtPmZpbGVfbXV0ZXgpOwogCX0KIAltdXRleF91bmxvY2soJmN0eC0+ZmlsZS0+ZmlsZV9tdXRleCk7CiB9CkBAIC0zMjgsMjAgKzMzMCwxOCBAQAogCX0KIAogCWlmICh1dnQtPmRhdGFfbGVuKSB7Ci0JCXV2dC0+ZGF0YSA9IGttYWxsb2ModXZ0LT5kYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJCXV2dC0+ZGF0YSA9IGttZW1kdXAoZXZ0LT5wcml2YXRlX2RhdGEsIHV2dC0+ZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoIXV2dC0+ZGF0YSkKIAkJCWdvdG8gZXJyMTsKIAotCQltZW1jcHkodXZ0LT5kYXRhLCBldnQtPnByaXZhdGVfZGF0YSwgdXZ0LT5kYXRhX2xlbik7CiAJCXV2dC0+cmVzcC5wcmVzZW50IHw9IElCX1VDTV9QUkVTX0RBVEE7CiAJfQogCiAJaWYgKHV2dC0+aW5mb19sZW4pIHsKLQkJdXZ0LT5pbmZvID0ga21hbGxvYyh1dnQtPmluZm9fbGVuLCBHRlBfS0VSTkVMKTsKKwkJdXZ0LT5pbmZvID0ga21lbWR1cChpbmZvLCB1dnQtPmluZm9fbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1dnQtPmluZm8pCiAJCQlnb3RvIGVycjI7CiAKLQkJbWVtY3B5KHV2dC0+aW5mbywgaW5mbywgdXZ0LT5pbmZvX2xlbik7CiAJCXV2dC0+cmVzcC5wcmVzZW50IHw9IElCX1VDTV9QUkVTX0lORk87CiAJfQogCXJldHVybiAwOwpAQCAtNjg1LDExICs2ODUsMTEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3NpemVfdCBpYl91Y21fZXN0YWJsaXNoKHN0cnVjdCBpYl91Y21fZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqaW5idWYsCi0JCQkJaW50IGluX2xlbiwgaW50IG91dF9sZW4pCitzdGF0aWMgc3NpemVfdCBpYl91Y21fbm90aWZ5KHN0cnVjdCBpYl91Y21fZmlsZSAqZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKIHsKLQlzdHJ1Y3QgaWJfdWNtX2VzdGFibGlzaCBjbWQ7CisJc3RydWN0IGliX3VjbV9ub3RpZnkgY21kOwogCXN0cnVjdCBpYl91Y21fY29udGV4dCAqY3R4OwogCWludCByZXN1bHQ7CiAKQEAgLTcwMCw3ICs3MDAsNyBAQAogCWlmIChJU19FUlIoY3R4KSkKIAkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKIAotCXJlc3VsdCA9IGliX2NtX2VzdGFibGlzaChjdHgtPmNtX2lkKTsKKwlyZXN1bHQgPSBpYl9jbV9ub3RpZnkoY3R4LT5jbV9pZCwgKGVudW0gaWJfZXZlbnRfdHlwZSkgY21kLmV2ZW50KTsKIAlpYl91Y21fY3R4X3B1dChjdHgpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCVtJQl9VU0VSX0NNX0NNRF9ERVNUUk9ZX0lEXSAgICA9IGliX3VjbV9kZXN0cm95X2lkLAogCVtJQl9VU0VSX0NNX0NNRF9BVFRSX0lEXSAgICAgICA9IGliX3VjbV9hdHRyX2lkLAogCVtJQl9VU0VSX0NNX0NNRF9MSVNURU5dICAgICAgICA9IGliX3VjbV9saXN0ZW4sCi0JW0lCX1VTRVJfQ01fQ01EX0VTVEFCTElTSF0gICAgID0gaWJfdWNtX2VzdGFibGlzaCwKKwlbSUJfVVNFUl9DTV9DTURfTk9USUZZXSAgICAgICAgPSBpYl91Y21fbm90aWZ5LAogCVtJQl9VU0VSX0NNX0NNRF9TRU5EX1JFUV0gICAgICA9IGliX3VjbV9zZW5kX3JlcSwKIAlbSUJfVVNFUl9DTV9DTURfU0VORF9SRVBdICAgICAgPSBpYl91Y21fc2VuZF9yZXAsCiAJW0lCX1VTRVJfQ01fQ01EX1NFTkRfUlRVXSAgICAgID0gaWJfdWNtX3NlbmRfcnR1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuaAppbmRleCAxYjE3ZGNkLi4wNGE5ZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuaApAQCAtMzAyLDcgKzMwMiw3IEBACiAJdW5zaWduZWQgbG9uZyBwYTsJLyogUEEgZGV2aWNlIG1lbW9yeSAqLwogCXZvaWQgKipxcHRyX2FycmF5OwogCi0Ja21lbV9jYWNoZV90ICpob3N0X21zZ19jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqaG9zdF9tc2dfY2FjaGU7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNjYV9saW5rOwkJLyogYWRhcHRlciBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBlaF93YWtldXBfbGlzdDsJLyogZXZlbnQgd2FrZXVwIGxpc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3FwLmMKaW5kZXggNWJjZjY5Ny4uMTc5ZDAwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3FwLmMKQEAgLTU2NCw2ICs1NjQsMzIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYzJfbG9ja19jcXMoc3RydWN0IGMyX2NxICpzZW5kX2NxLCBzdHJ1Y3QgYzJfY3EgKnJlY3ZfY3EpCit7CisJaWYgKHNlbmRfY3EgPT0gcmVjdl9jcSkKKwkJc3Bpbl9sb2NrX2lycSgmc2VuZF9jcS0+bG9jayk7CisJZWxzZSBpZiAoc2VuZF9jcSA+IHJlY3ZfY3EpIHsKKwkJc3Bpbl9sb2NrX2lycSgmc2VuZF9jcS0+bG9jayk7CisJCXNwaW5fbG9ja19uZXN0ZWQoJnJlY3ZfY3EtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxKCZyZWN2X2NxLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX25lc3RlZCgmc2VuZF9jcS0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGMyX3VubG9ja19jcXMoc3RydWN0IGMyX2NxICpzZW5kX2NxLCBzdHJ1Y3QgYzJfY3EgKnJlY3ZfY3EpCit7CisJaWYgKHNlbmRfY3EgPT0gcmVjdl9jcSkKKwkJc3Bpbl91bmxvY2tfaXJxKCZzZW5kX2NxLT5sb2NrKTsKKwllbHNlIGlmIChzZW5kX2NxID4gcmVjdl9jcSkgeworCQlzcGluX3VubG9jaygmcmVjdl9jcS0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmc2VuZF9jcS0+bG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnNlbmRfY3EtPmxvY2spOworCQlzcGluX3VubG9ja19pcnEoJnJlY3ZfY3EtPmxvY2spOworCX0KK30KKwogdm9pZCBjMl9mcmVlX3FwKHN0cnVjdCBjMl9kZXYgKmMyZGV2LCBzdHJ1Y3QgYzJfcXAgKnFwKQogewogCXN0cnVjdCBjMl9jcSAqc2VuZF9jcTsKQEAgLTU3NiwxNSArNjAyLDkgQEAKIAkgKiBMb2NrIENRcyBoZXJlLCBzbyB0aGF0IENRIHBvbGxpbmcgY29kZSBjYW4gZG8gUVAgbG9va3VwCiAJICogd2l0aG91dCB0YWtpbmcgYSBsb2NrLgogCSAqLwotCXNwaW5fbG9ja19pcnEoJnNlbmRfY3EtPmxvY2spOwotCWlmIChzZW5kX2NxICE9IHJlY3ZfY3EpCi0JCXNwaW5fbG9jaygmcmVjdl9jcS0+bG9jayk7Ci0KKwljMl9sb2NrX2NxcyhzZW5kX2NxLCByZWN2X2NxKTsKIAljMl9mcmVlX3FwbihjMmRldiwgcXAtPnFwbik7Ci0KLQlpZiAoc2VuZF9jcSAhPSByZWN2X2NxKQotCQlzcGluX3VubG9jaygmcmVjdl9jcS0+bG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzZW5kX2NxLT5sb2NrKTsKKwljMl91bmxvY2tfY3FzKHNlbmRfY3EsIHJlY3ZfY3EpOwogCiAJLyoKIAkgKiBEZXN0b3J5IHFwIGluIHRoZSBybmljLi4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcm5pYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3JuaWMuYwppbmRleCA2MjNkYzk1Li4xNjg3YzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcm5pYy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9ybmljLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogICogaW52b2x2ZXMgaW5pdGFsaXppbmcgdGhlIHZhcmlvdXMgbGltaXRzIGFuZCByZXNvdWNlIHBvb2xzIHRoYXQKICAqIGNvbXByaXNlIHRoZSBSTklDIGluc3RhbmNlLgogICovCi1pbnQgYzJfcm5pY19pbml0KHN0cnVjdCBjMl9kZXYgKmMyZGV2KQoraW50IF9fZGV2aW5pdCBjMl9ybmljX2luaXQoc3RydWN0IGMyX2RldiAqYzJkZXYpCiB7CiAJaW50IGVycjsKIAl1MzIgcXNpemUsIG1zZ3NpemU7CkBAIC02MTEsNyArNjExLDcgQEAKIC8qCiAgKiBDYWxsZWQgYnkgYzJfcmVtb3ZlIHRvIGNsZWFudXAgdGhlIFJOSUMgcmVzb3VyY2VzLgogICovCi12b2lkIGMyX3JuaWNfdGVybShzdHJ1Y3QgYzJfZGV2ICpjMmRldikKK3ZvaWQgX19kZXZleGl0IGMyX3JuaWNfdGVybShzdHJ1Y3QgYzJfZGV2ICpjMmRldikKIHsKIAogCS8qIENsb3NlIHRoZSBvcGVuIGFkYXB0ZXIgaW5zdGFuY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMKaW5kZXggMDFmNWFhOS4uM2QxYzFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMKQEAgLTUyLDcgKzUyLDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkNocmlzdG9waCBSYWlzY2ggPHJhaXNjaEBkZS5pYm0uY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJQk0gZVNlcnZlciBIQ0EgSW5maW5pQmFuZCBEZXZpY2UgRHJpdmVyIik7Ci1NT0RVTEVfVkVSU0lPTigiU1ZORUhDQV8wMDE4Iik7CitNT0RVTEVfVkVSU0lPTigiU1ZORUhDQV8wMDE5Iik7CiAKIGludCBlaGNhX29wZW5fYXFwMSAgICAgPSAwOwogaW50IGVoY2FfZGVidWdfbGV2ZWwgICA9IDA7CkBAIC03OTAsNyArNzkwLDcgQEAKIAlpbnQgcmV0OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZUhDQSBJbmZpbmliYW5kIERldmljZSBEcml2ZXIgIgotCSAgICAgICAgICAgICAgICAgIihSZWwuOiBTVk5FSENBXzAwMTgpXG4iKTsKKwkgICAgICAgICAgICAgICAgICIoUmVsLjogU1ZORUhDQV8wMDE5KVxuIik7CiAJaWRyX2luaXQoJmVoY2FfcXBfaWRyKTsKIAlpZHJfaW5pdCgmZWhjYV9jcV9pZHIpOwogCXNwaW5fbG9ja19pbml0KCZlaGNhX3FwX2lkcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYwppbmRleCBjZjNlNTBlLi44NjgyYWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCkBAIC03MzIsOCArNzMyLDcgQEAKIAl1NjQgaF9yZXQ7CiAJc3RydWN0IGlwel9xdWV1ZSAqc3F1ZXVlOwogCXZvaWQgKmJhZF9zZW5kX3dxZV9wLCAqYmFkX3NlbmRfd3FlX3Y7Ci0Jdm9pZCAqc3F1ZXVlX3N0YXJ0X3AsICpzcXVldWVfZW5kX3A7Ci0Jdm9pZCAqc3F1ZXVlX3N0YXJ0X3YsICpzcXVldWVfZW5kX3Y7CisJdTY0IHFfb2ZzOwogCXN0cnVjdCBlaGNhX3dxZSAqd3FlOwogCWludCBxcF9udW0gPSBteV9xcC0+aWJfcXAucXBfbnVtOwogCkBAIC03NTUsMjYgKzc1NCwyMyBAQAogCWlmIChlaGNhX2RlYnVnX2xldmVsKQogCQllaGNhX2RtcChiYWRfc2VuZF93cWVfdiwgMzIsICJxcF9udW09JXggYmFkX3dxZSIsIHFwX251bSk7CiAJc3F1ZXVlID0gJm15X3FwLT5pcHpfc3F1ZXVlOwotCXNxdWV1ZV9zdGFydF9wID0gKHZvaWQqKXZpcnRfdG9fYWJzKGlwel9xZWl0X2NhbGMoc3F1ZXVlLCAwTCkpOwotCXNxdWV1ZV9lbmRfcCA9IHNxdWV1ZV9zdGFydF9wK3NxdWV1ZS0+cXVldWVfbGVuZ3RoOwotCXNxdWV1ZV9zdGFydF92ID0gYWJzX3RvX3ZpcnQoKHU2NClzcXVldWVfc3RhcnRfcCk7Ci0Jc3F1ZXVlX2VuZF92ID0gYWJzX3RvX3ZpcnQoKHU2NClzcXVldWVfZW5kX3ApOwotCWVoY2FfZGJnKCZzaGNhLT5pYl9kZXZpY2UsICJxcF9udW09JXggc3F1ZXVlX3N0YXJ0X3Y9JXAgc3F1ZXVlX2VuZF92PSVwIiwKLQkJIHFwX251bSwgc3F1ZXVlX3N0YXJ0X3YsIHNxdWV1ZV9lbmRfdik7CisJaWYgKGlwel9xdWV1ZV9hYnNfdG9fb2Zmc2V0KHNxdWV1ZSwgKHU2NCliYWRfc2VuZF93cWVfcCwgJnFfb2ZzKSkgeworCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiZmFpbGVkIHRvIGdldCB3cWUgb2Zmc2V0IHFwX251bT0leCIKKwkJCSAiIGJhZF9zZW5kX3dxZV9wPSVwIiwgcXBfbnVtLCBiYWRfc2VuZF93cWVfcCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAogCS8qIGxvb3Agc2V0cyB3cWUncyBwdXJnZSBiaXQgKi8KLQl3cWUgPSAoc3RydWN0IGVoY2Ffd3FlKiliYWRfc2VuZF93cWVfdjsKKwl3cWUgPSAoc3RydWN0IGVoY2Ffd3FlKilpcHpfcWVpdF9jYWxjKHNxdWV1ZSwgcV9vZnMpOwogCSpiYWRfd3FlX2NudCA9IDA7CiAJd2hpbGUgKHdxZS0+b3B0eXBlICE9IDB4ZmYgJiYgd3FlLT53cWVmICE9IDB4ZmYpIHsKIAkJaWYgKGVoY2FfZGVidWdfbGV2ZWwpCiAJCQllaGNhX2RtcCh3cWUsIDMyLCAicXBfbnVtPSV4IHdxZSIsIHFwX251bSk7CiAJCXdxZS0+bnJfb2ZfZGF0YV9zZWcgPSAwOyAvKiBzdXBwcmVzcyBkYXRhIGFjY2VzcyAqLwogCQl3cWUtPndxZWYgPSBXUUVGX1BVUkdFOyAvKiBXUUUgdG8gYmUgcHVyZ2VkICovCi0JCXdxZSA9IChzdHJ1Y3QgZWhjYV93cWUqKSgodTgqKXdxZStzcXVldWUtPnFlX3NpemUpOworCQlxX29mcyA9IGlwel9xdWV1ZV9hZHZhbmNlX29mZnNldChzcXVldWUsIHFfb2ZzKTsKKwkJd3FlID0gKHN0cnVjdCBlaGNhX3dxZSopaXB6X3FlaXRfY2FsYyhzcXVldWUsIHFfb2ZzKTsKIAkJKmJhZF93cWVfY250ID0gKCpiYWRfd3FlX2NudCkrMTsKLQkJaWYgKCh2b2lkKil3cWUgPj0gc3F1ZXVlX2VuZF92KSB7Ci0JCQl3cWUgPSBzcXVldWVfc3RhcnRfdjsKLQkJfQogCX0KIAkvKgogCSAqIGJhZCB3cWUgd2lsbCBiZSByZXByb2Nlc3NlZCBhbmQgaWdub3JlZCB3aGVuIHBvbF9jcSgpIGlzIGNhbGxlZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaXB6X3B0X2ZuLmMKaW5kZXggZTAyOGZmMS4uYmY3YTQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaXB6X3B0X2ZuLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaXB6X3B0X2ZuLmMKQEAgLTcwLDYgKzcwLDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGlwel9xdWV1ZV9hYnNfdG9fb2Zmc2V0KHN0cnVjdCBpcHpfcXVldWUgKnF1ZXVlLCB1NjQgYWRkciwgdTY0ICpxX29mZnNldCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPnF1ZXVlX2xlbmd0aCAvIHF1ZXVlLT5wYWdlc2l6ZTsgaSsrKSB7CisJCXU2NCBwYWdlID0gKHU2NCl2aXJ0X3RvX2FicyhxdWV1ZS0+cXVldWVfcGFnZXNbaV0pOworCQlpZiAoYWRkciA+PSBwYWdlICYmIGFkZHIgPCBwYWdlICsgcXVldWUtPnBhZ2VzaXplKSB7CisJCQkqcV9vZmZzZXQgPSBhZGRyIC0gcGFnZSArIGkgKiBxdWV1ZS0+cGFnZXNpemU7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogaW50IGlwel9xdWV1ZV9jdG9yKHN0cnVjdCBpcHpfcXVldWUgKnF1ZXVlLAogCQkgICBjb25zdCB1MzIgbnJfb2ZfcGFnZXMsCiAJCSAgIGNvbnN0IHUzMiBwYWdlc2l6ZSwgY29uc3QgdTMyIHFlX3NpemUsIGNvbnN0IHUzMiBucl9vZl9zZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaXB6X3B0X2ZuLmgKaW5kZXggMmYxMzUwOS4uZGMzYmRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaXB6X3B0X2ZuLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaXB6X3B0X2ZuLmgKQEAgLTE1MCw2ICsxNTAsMjEgQEAKIAlyZXR1cm4gaXB6X3FlaXRfZ2V0KHF1ZXVlKTsKIH0KIAorLyoKKyAqIHJldHVybiB0aGUgcV9vZmZzZXQgY29ycmVzcG9uZGluZyB0byBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgKi8KK2ludCBpcHpfcXVldWVfYWJzX3RvX29mZnNldChzdHJ1Y3QgaXB6X3F1ZXVlICpxdWV1ZSwgdTY0IGFkZHIsIHU2NCAqcV9vZmZzZXQpOworCisvKgorICogcmV0dXJuIHRoZSBuZXh0IHF1ZXVlIG9mZnNldC4gZG9uJ3QgbW9kaWZ5IHRoZSBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB1NjQgaXB6X3F1ZXVlX2FkdmFuY2Vfb2Zmc2V0KHN0cnVjdCBpcHpfcXVldWUgKnF1ZXVlLCB1NjQgb2Zmc2V0KQoreworCW9mZnNldCArPSBxdWV1ZS0+cWVfc2l6ZTsKKwlpZiAob2Zmc2V0ID49IHF1ZXVlLT5xdWV1ZV9sZW5ndGgpIG9mZnNldCA9IDA7CisJcmV0dXJuIG9mZnNldDsKK30KKwogLyogc3RydWN0IGdlbmVyaWMgcGFnZSB0YWJsZSAqLwogc3RydWN0IGlwel9wdCB7CiAJdTY0IGVudHJpZXNbRUhDQV9QVF9FTlRSSUVTXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKaW5kZXggYTU0NTYxMC4uYWNkZWUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKQEAgLTE0ODcsNyArMTQ4Nyw3IEBACiAJaWRldi0+cG1hX2NvdW50ZXJfc2VsZWN0WzFdID0gSUJfUE1BX1BPUlRfUkNWX0RBVEE7CiAJaWRldi0+cG1hX2NvdW50ZXJfc2VsZWN0WzJdID0gSUJfUE1BX1BPUlRfWE1JVF9QS1RTOwogCWlkZXYtPnBtYV9jb3VudGVyX3NlbGVjdFszXSA9IElCX1BNQV9QT1JUX1JDVl9QS1RTOwotCWlkZXYtPnBtYV9jb3VudGVyX3NlbGVjdFs1XSA9IElCX1BNQV9QT1JUX1hNSVRfV0FJVDsKKwlpZGV2LT5wbWFfY291bnRlcl9zZWxlY3RbNF0gPSBJQl9QTUFfUE9SVF9YTUlUX1dBSVQ7CiAJaWRldi0+bGlua193aWR0aF9lbmFibGVkID0gMzsJLyogMXggb3IgNHggKi8KIAogCS8qIFNuYXBzaG90IGN1cnJlbnQgSFcgY291bnRlcnMgdG8gImNsZWFyIiB0aGVtLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwppbmRleCA2OTU5OTQ1Li41N2NkYzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwpAQCAtMzMsNyArMzMsNiBAQAogICogJElkOiBtdGhjYV9hdi5jIDEzNDkgMjAwNC0xMi0xNiAyMTowOTo0M1ogcm9sYW5kICQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMzIzLDcgKzMyMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9hdl90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCitpbnQgbXRoY2FfaW5pdF9hdl90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwppbmRleCAxNDliMzY5Li4yODNkNTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwpAQCAtMzYsNyArMzYsNiBAQAogICogJElkOiBtdGhjYV9jcS5jIDEzNjkgMjAwNC0xMi0yMCAxNjoxNzowN1ogcm9sYW5kICQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtOTcwLDcgKzk2OSw3IEBACiAJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9jcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCitpbnQgbXRoY2FfaW5pdF9jcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwppbmRleCBlMjg0ZTA2Li44ZWM5ZmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwpAQCAtMzMsNyArMzMsNiBAQAogICogJElkOiBtdGhjYV9lcS5jIDEzODIgMjAwNC0xMi0yNCAwMjoyMTowMlogcm9sYW5kICQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC00NzksMTAgKzQ3OCwxMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfY3JlYXRlX2VxKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJCQkgICAgIGludCBuZW50LAotCQkJCSAgICAgdTggaW50ciwKLQkJCQkgICAgIHN0cnVjdCBtdGhjYV9lcSAqZXEpCitzdGF0aWMgaW50IG10aGNhX2NyZWF0ZV9lcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkgICBpbnQgbmVudCwKKwkJCSAgIHU4IGludHIsCisJCQkgICBzdHJ1Y3QgbXRoY2FfZXEgKmVxKQogewogCWludCBucGFnZXM7CiAJdTY0ICpkbWFfbGlzdCA9IE5VTEw7CkBAIC02NjQsOSArNjYzLDkgQEAKIAkJCQkgZGV2LT5lcV90YWJsZS5lcSArIGkpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9tYXBfcmVnKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCSAgIHZvaWQgX19pb21lbSAqKm1hcCkKK3N0YXRpYyBpbnQgbXRoY2FfbWFwX3JlZyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSB2b2lkIF9faW9tZW0gKiptYXApCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCk7CiAKQEAgLTY5MSw3ICs2OTAsNyBAQAogCWlvdW5tYXAobWFwKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfbWFwX2VxX3JlZ3Moc3RydWN0IG10aGNhX2RldiAqZGV2KQorc3RhdGljIGludCBtdGhjYV9tYXBfZXFfcmVncyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewogCQkvKgpAQCAtNzgxLDcgKzc4MCw3IEBACiAJfQogfQogCi1pbnQgX19kZXZpbml0IG10aGNhX21hcF9lcV9pY20oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgaWNtX3ZpcnQpCitpbnQgbXRoY2FfbWFwX2VxX2ljbShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBpY21fdmlydCkKIHsKIAlpbnQgcmV0OwogCXU4IHN0YXR1czsKQEAgLTgyNSw3ICs4MjQsNyBAQAogCV9fZnJlZV9wYWdlKGRldi0+ZXFfdGFibGUuaWNtX3BhZ2UpOwogfQogCi1pbnQgX19kZXZpbml0IG10aGNhX2luaXRfZXFfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQoraW50IG10aGNhX2luaXRfZXFfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCWludCBlcnI7CiAJdTggc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCmluZGV4IDQ1ZTEwNmYuLmFjZmE0MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFkLmMKQEAgLTMxNyw3ICszMTcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgX19kZXZleGl0IG10aGNhX2ZyZWVfYWdlbnRzKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3ZvaWQgbXRoY2FfZnJlZV9hZ2VudHMoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCXN0cnVjdCBpYl9tYWRfYWdlbnQgKmFnZW50OwogCWludCBwLCBxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKaW5kZXggNDdlYTAyMS4uMDQ5MWVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCkBAIC05OCw3ICs5OCw3IEBACiAJLnVhcmNfc2l6ZQkgICA9IDEgPDwgMTgsCS8qIEFyYmVsIG9ubHkgKi8KIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX3R1bmVfcGNpKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCitzdGF0aWMgaW50IG10aGNhX3R1bmVfcGNpKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCiB7CiAJaW50IGNhcDsKIAl1MTYgdmFsOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX2Rldl9saW0oc3RydWN0IG10aGNhX2RldiAqbWRldiwgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0pCitzdGF0aWMgaW50IG10aGNhX2Rldl9saW0oc3RydWN0IG10aGNhX2RldiAqbWRldiwgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0pCiB7CiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CkBAIC0yNTUsNyArMjU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfaW5pdF90YXZvcihzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQorc3RhdGljIGludCBtdGhjYV9pbml0X3Rhdm9yKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCiB7CiAJdTggc3RhdHVzOwogCWludCBlcnI7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9sb2FkX2Z3KHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCitzdGF0aWMgaW50IG10aGNhX2xvYWRfZncoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAl1OCBzdGF0dXM7CiAJaW50IGVycjsKQEAgLTM3OSwxMCArMzc5LDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfaW5pdF9pY20oc3RydWN0IG10aGNhX2RldiAqbWRldiwKLQkJCQkgICAgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0sCi0JCQkJICAgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqaW5pdF9oY2EsCi0JCQkJICAgIHU2NCBpY21fc2l6ZSkKK3N0YXRpYyBpbnQgbXRoY2FfaW5pdF9pY20oc3RydWN0IG10aGNhX2RldiAqbWRldiwKKwkJCSAgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0sCisJCQkgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqaW5pdF9oY2EsCisJCQkgIHU2NCBpY21fc2l6ZSkKIHsKIAl1NjQgYXV4X3BhZ2VzOwogCXU4IHN0YXR1czsKQEAgLTU3NSw3ICs1NzUsNyBAQAogCW10aGNhX2ZyZWVfaWNtKG1kZXYsIG1kZXYtPmZ3LmFyYmVsLmF1eF9pY20pOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X2FyYmVsKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCitzdGF0aWMgaW50IG10aGNhX2luaXRfYXJiZWwoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAlzdHJ1Y3QgbXRoY2FfZGV2X2xpbSAgICAgICAgZGV2X2xpbTsKIAlzdHJ1Y3QgbXRoY2FfcHJvZmlsZSAgICAgICAgcHJvZmlsZTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogCQltdGhjYV9TWVNfRElTKG1kZXYsICZzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X2hjYShzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQorc3RhdGljIGludCBtdGhjYV9pbml0X2hjYShzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQogewogCXU4IHN0YXR1czsKIAlpbnQgZXJyOwpAQCAtNzIwLDcgKzcyMCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2Ffc2V0dXBfaGNhKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3N0YXRpYyBpbnQgbXRoY2Ffc2V0dXBfaGNhKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCXU4IHN0YXR1czsKQEAgLTg3NSw4ICs4NzUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJICAgaW50IGRkcl9oaWRkZW4pCitzdGF0aWMgaW50IG10aGNhX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRkcl9oaWRkZW4pCiB7CiAJaW50IGVycjsKIApAQCAtOTI4LDcgKzkyNyw3IEBACiAJCQkgICBNVEhDQV9IQ1JfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX2VuYWJsZV9tc2lfeChzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQorc3RhdGljIGludCBtdGhjYV9lbmFibGVfbXNpX3goc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyaWVzWzNdOwogCWludCBlcnI7CkBAIC0xMjEzLDcgKzEyMTIsNyBAQAogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RhdGljIGludCBtdGhjYV92ZXJzaW9uX3ByaW50ZWQgPSAwOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMKaW5kZXggNDdjYThhOS4uYThhZDA3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYwpAQCAtMzIsNyArMzIsNiBAQAogICogJElkOiBtdGhjYV9tY2cuYyAxMzQ5IDIwMDQtMTItMTYgMjE6MDk6NDNaIHJvbGFuZCAkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTM3MSw3ICszNzAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9tY2dfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQoraW50IG10aGNhX2luaXRfbWNnX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCWludCB0YWJsZV9zaXplID0gZGV2LT5saW1pdHMubnVtX21nbXMgKyBkZXYtPmxpbWl0cy5udW1fYW1nbXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCmluZGV4IGE0ODZkZWMuLmY3MWZmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCkBAIC0zNCw3ICszNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgpAQCAtMTM1LDcgKzEzNCw3IEBACiAJc3Bpbl91bmxvY2soJmJ1ZGR5LT5sb2NrKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfYnVkZHlfaW5pdChzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5LCBpbnQgbWF4X29yZGVyKQorc3RhdGljIGludCBtdGhjYV9idWRkeV9pbml0KHN0cnVjdCBtdGhjYV9idWRkeSAqYnVkZHksIGludCBtYXhfb3JkZXIpCiB7CiAJaW50IGksIHM7CiAKQEAgLTc1OSw3ICs3NTgsNyBAQAogCSoodTggKikgZm1yLT5tZW0uYXJiZWwubXB0ID0gTVRIQ0FfTVBUX1NUQVRVU19TVzsKIH0KIAotaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X21yX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK2ludCBtdGhjYV9pbml0X21yX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJaW50IGVyciwgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKaW5kZXggNTlkZjUxNi4uYzFlOTUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKQEAgLTM0LDcgKzM0LDYgQEAKICAqICRJZDogbXRoY2FfcGQuYyAxMzQ5IDIwMDQtMTItMTYgMjE6MDk6NDNaIHJvbGFuZCAkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCkBAIC02OSw3ICs2OCw3IEBACiAJbXRoY2FfZnJlZSgmZGV2LT5wZF90YWJsZS5hbGxvYywgcGQtPnBkX251bSk7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9wZF90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCitpbnQgbXRoY2FfaW5pdF9wZF90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJcmV0dXJuIG10aGNhX2FsbG9jX2luaXQoJmRldi0+cGRfdGFibGUuYWxsb2MsCiAJCQkJZGV2LT5saW1pdHMubnVtX3BkcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKaW5kZXggZmM2N2Y3OC4uMjE0MjJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKQEAgLTExMDAsMTEgKzExMDAsMTAgQEAKIAlzdHJ1Y3QgbXRoY2FfZm1yICpmbXI7CiAJaW50IGVycjsKIAotCWZtciA9IGttYWxsb2Moc2l6ZW9mICpmbXIsIEdGUF9LRVJORUwpOworCWZtciA9IGttZW1kdXAoZm1yX2F0dHIsIHNpemVvZiAqZm1yLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZtcikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQltZW1jcHkoJmZtci0+YXR0ciwgZm1yX2F0dHIsIHNpemVvZiAqZm1yX2F0dHIpOwogCWVyciA9IG10aGNhX2Ztcl9hbGxvYyh0b19tZGV2KHBkLT5kZXZpY2UpLCB0b19tcGQocGQpLT5wZF9udW0sCiAJCQkgICAgIGNvbnZlcnRfYWNjZXNzKG1yX2FjY2Vzc19mbGFncyksIGZtcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggNmE3ODIyZS4uMzNlM2JhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTM1LDcgKzM1LDYgQEAKICAqICRJZDogbXRoY2FfcXAuYyAxMzU1IDIwMDQtMTItMTcgMTU6MjM6NDNaIHJvbGFuZCAkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTIyNDEsNyArMjI0MCw3IEBACiAJCSpuZXdfd3FlID0gMDsKIH0KIAotaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X3FwX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK2ludCBtdGhjYV9pbml0X3FwX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCXU4IHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYwppbmRleCBmNWQ3Njc3Li4zNGQyYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2Ffc3JxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YgKmNvbnRleHQpOwogCi0JbG9nc2l6ZSA9IGxvbmdfbG9nMihzcnEtPm1heCkgKyBzcnEtPndxZV9zaGlmdDsKKwlsb2dzaXplID0gbG9uZ19sb2cyKHNycS0+bWF4KTsKIAljb250ZXh0LT5zdGF0ZV9sb2dzaXplX3NycW4gPSBjcHVfdG9fYmUzMihsb2dzaXplIDw8IDI0IHwgc3JxLT5zcnFuKTsKIAljb250ZXh0LT5sa2V5ID0gY3B1X3RvX2JlMzIoc3JxLT5tci5pYm1yLmxrZXkpOwogCWNvbnRleHQtPmRiX2luZGV4ID0gY3B1X3RvX2JlMzIoc3JxLT5kYl9pbmRleCk7CkBAIC03MTUsNyArNzE1LDcgQEAKIAkJICAgICBzaXplb2YgKHN0cnVjdCBtdGhjYV9kYXRhX3NlZykpOwogfQogCi1pbnQgX19kZXZpbml0IG10aGNhX2luaXRfc3JxX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK2ludCBtdGhjYV9pbml0X3NycV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCmluZGV4IDBiOGE3OWQuLmYyYjYxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKQEAgLTIzMyw3ICsyMzMsNyBAQAogfQogCiBzdHJ1Y3QgaXBvaWJfbmVpZ2ggKmlwb2liX25laWdoX2FsbG9jKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKTsKLXZvaWQgaXBvaWJfbmVpZ2hfZnJlZShzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoKTsKK3ZvaWQgaXBvaWJfbmVpZ2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoKTsKIAogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICppcG9pYl93b3JrcXVldWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggODU1MjJkYS4uNWJhMzE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQlpZiAobmVpZ2gtPmFoKQogCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAKLQkJaXBvaWJfbmVpZ2hfZnJlZShuZWlnaCk7CisJCWlwb2liX25laWdoX2ZyZWUoZGV2LCBuZWlnaCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtNTI1LDEwICs1MjUsMTEgQEAKIAkJaXBvaWJfc2VuZChkZXYsIHNrYiwgcGF0aC0+YWgsIElQT0lCX1FQTihza2ItPmRzdC0+bmVpZ2hib3VyLT5oYSkpOwogCX0gZWxzZSB7CiAJCW5laWdoLT5haCAgPSBOVUxMOwotCQlfX3NrYl9xdWV1ZV90YWlsKCZuZWlnaC0+cXVldWUsIHNrYik7CiAKIAkJaWYgKCFwYXRoLT5xdWVyeSAmJiBwYXRoX3JlY19zdGFydChkZXYsIHBhdGgpKQogCQkJZ290byBlcnJfbGlzdDsKKworCQlfX3NrYl9xdWV1ZV90YWlsKCZuZWlnaC0+cXVldWUsIHNrYik7CiAJfQogCiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwpAQCAtNTM4LDcgKzUzOSw3IEBACiAJbGlzdF9kZWwoJm5laWdoLT5saXN0KTsKIAogZXJyX3BhdGg6Ci0JaXBvaWJfbmVpZ2hfZnJlZShuZWlnaCk7CisJaXBvaWJfbmVpZ2hfZnJlZShkZXYsIG5laWdoKTsKIAkrK3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQ7CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIApAQCAtNjU1LDcgKzY1Niw3IEBACiAJCQkJICovCiAJCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAJCQkJbGlzdF9kZWwoJm5laWdoLT5saXN0KTsKLQkJCQlpcG9pYl9uZWlnaF9mcmVlKG5laWdoKTsKKwkJCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOwogCQkJCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAkJCQlpcG9pYl9wYXRoX2xvb2t1cChza2IsIGRldik7CiAJCQkJZ290byBvdXQ7CkBAIC03ODYsNyArNzg3LDcgQEAKIAkJaWYgKG5laWdoLT5haCkKIAkJCWFoID0gbmVpZ2gtPmFoOwogCQlsaXN0X2RlbCgmbmVpZ2gtPmxpc3QpOwotCQlpcG9pYl9uZWlnaF9mcmVlKG5laWdoKTsKKwkJaXBvaWJfbmVpZ2hfZnJlZShuLT5kZXYsIG5laWdoKTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC04MDksOSArODEwLDE1IEBACiAJcmV0dXJuIG5laWdoOwogfQogCi12b2lkIGlwb2liX25laWdoX2ZyZWUoc3RydWN0IGlwb2liX25laWdoICpuZWlnaCkKK3ZvaWQgaXBvaWJfbmVpZ2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoKQogeworCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkqdG9faXBvaWJfbmVpZ2gobmVpZ2gtPm5laWdoYm91cikgPSBOVUxMOworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmbmVpZ2gtPnF1ZXVlKSkpIHsKKwkJKytwcml2LT5zdGF0cy50eF9kcm9wcGVkOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KIAlrZnJlZShuZWlnaCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCmluZGV4IDNmYWExODIuLmQyODJkNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCSAqLwogCQlpZiAobmVpZ2gtPmFoKQogCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7Ci0JCWlwb2liX25laWdoX2ZyZWUobmVpZ2gpOworCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oCmluZGV4IDljNTM5MTYuLjIzNGU1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaApAQCAtMjgzLDcgKzI4Myw3IEBACiAJc3RydWN0IG11dGV4ICAgICAgY29ubmxpc3RfbXV0ZXg7CiAJc3RydWN0IGxpc3RfaGVhZCAgY29ubmxpc3Q7CQkvKiBhbGwgaVNFUiBJQiBjb25uZWN0aW9ucyAqLwogCi0Ja21lbV9jYWNoZV90ICpkZXNjX2NhY2hlOworCXN0cnVjdCBrbWVtX2NhY2hlICpkZXNjX2NhY2hlOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBpc2VyX2dsb2JhbCBpZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX21lbW9yeS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKaW5kZXggMDYwNjc0NC4uNWUxMjI1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKaW5kZXggNGIwOTE0Ny4uNjRhYjVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKQEAgLTExNzYsOSArMTE3NiwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQl0YXJnZXQtPnN0YXR1cyA9IHNycF9hbGxvY19pdV9idWZzKHRhcmdldCk7Ci0JCWlmICh0YXJnZXQtPnN0YXR1cykKLQkJCWJyZWFrOworCQlpZiAoIXRhcmdldC0+cnhfcmluZ1swXSkgeworCQkJdGFyZ2V0LT5zdGF0dXMgPSBzcnBfYWxsb2NfaXVfYnVmcyh0YXJnZXQpOworCQkJaWYgKHRhcmdldC0+c3RhdHVzKQorCQkJCWJyZWFrOworCQl9CiAKIAkJcXBfYXR0ciA9IGttYWxsb2Moc2l6ZW9mICpxcF9hdHRyLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFxcF9hdHRyKSB7CkBAIC0xNzE2LDcgKzE3MTgsOCBAQAogCWlmICghdGFyZ2V0X2hvc3QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdGFyZ2V0X2hvc3QtPm1heF9sdW4gPSBTUlBfTUFYX0xVTjsKKwl0YXJnZXRfaG9zdC0+bWF4X2x1biAgICAgPSBTUlBfTUFYX0xVTjsKKwl0YXJnZXRfaG9zdC0+bWF4X2NtZF9sZW4gPSBzaXplb2YgKChzdHJ1Y3Qgc3JwX2NtZCAqKSAodm9pZCAqKSAwTCktPmNkYjsKIAogCXRhcmdldCA9IGhvc3RfdG9fdGFyZ2V0KHRhcmdldF9ob3N0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jCmluZGV4IDEwNTExMmYuLjgwY2RlYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS11c2IuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMKQEAgLTE3OCw5ICsxNzgsOSBAQAogCiBmYWlsOgogCWlmIChpZm9yY2UpIHsKLQkJaWYgKGlmb3JjZS0+aXJxKSB1c2JfZnJlZV91cmIoaWZvcmNlLT5pcnEpOwotCQlpZiAoaWZvcmNlLT5vdXQpIHVzYl9mcmVlX3VyYihpZm9yY2UtPm91dCk7Ci0JCWlmIChpZm9yY2UtPmN0cmwpIHVzYl9mcmVlX3VyYihpZm9yY2UtPmN0cmwpOworCQl1c2JfZnJlZV91cmIoaWZvcmNlLT5pcnEpOworCQl1c2JfZnJlZV91cmIoaWZvcmNlLT5vdXQpOworCQl1c2JfZnJlZV91cmIoaWZvcmNlLT5jdHJsKTsKIAkJa2ZyZWUoaWZvcmNlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvX3Jhdy5jCmluZGV4IGJhMmEyMDMuLjdjOGQwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAKIAlzZXJpb19yYXctPmRldi5taW5vciA9IFBTTU9VU0VfTUlOT1I7CiAJc2VyaW9fcmF3LT5kZXYubmFtZSA9IHNlcmlvX3Jhdy0+bmFtZTsKLQlzZXJpb19yYXctPmRldi5kZXYgPSAmc2VyaW8tPmRldjsKKwlzZXJpb19yYXctPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAlzZXJpb19yYXctPmRldi5mb3BzID0gJnNlcmlvX3Jhd19mb3BzOwogCiAJZXJyID0gbWlzY19yZWdpc3Rlcigmc2VyaW9fcmF3LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2RpdmVydC9pc2RuX2RpdmVydC5jIGIvZHJpdmVycy9pc2RuL2RpdmVydC9pc2RuX2RpdmVydC5jCmluZGV4IDFmNWViZTkuLjAzMzE5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9kaXZlcnQvaXNkbl9kaXZlcnQuYworKysgYi9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2lzZG5fZGl2ZXJ0LmMKQEAgLTEwLDYgKzEwLDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSAiaXNkbl9kaXZlcnQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jb21tb24uYwppbmRleCA1ODAwYmVlZS4uZGVmZDU3NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCkBAIC03MDIsNyArNzAyLDcgQEAKIAljcy0+b3Blbl9jb3VudCA9IDA7CiAJY3MtPmRldiA9IE5VTEw7CiAJY3MtPnR0eSA9IE5VTEw7Ci0JY3MtPmNsYXNzID0gTlVMTDsKKwljcy0+dHR5X2RldiA9IE5VTEw7CiAJY3MtPmNpZG1vZGUgPSBjaWRtb2RlICE9IDA7CiAKIAkvL2lmKG9uZWNoYW5uZWwpIHsgLy9GSVhNRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZ2lnYXNldC5oIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZ2lnYXNldC5oCmluZGV4IDg4NGJkNzIuLjA2Mjk4Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2dpZ2FzZXQuaAorKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9naWdhc2V0LmgKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCXN0cnVjdCBnaWdhc2V0X2RyaXZlciAqZHJpdmVyOwogCXVuc2lnbmVkIG1pbm9yX2luZGV4OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzczsKKwlzdHJ1Y3QgZGV2aWNlICp0dHlfZGV2OwogCiAJY29uc3Qgc3RydWN0IGdpZ2FzZXRfb3BzICpvcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMKaW5kZXggNTk2ZjNhZS4uN2VkZWEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMKQEAgLTYyNSwxMyArNjI1LDEzIEBACiAJCXJldHVybjsKIAogCXRhc2tsZXRfaW5pdCgmY3MtPmlmX3dha2VfdGFza2xldCwgJmlmX3dha2UsICh1bnNpZ25lZCBsb25nKSBjcyk7Ci0JY3MtPmNsYXNzID0gdHR5X3JlZ2lzdGVyX2RldmljZShkcnYtPnR0eSwgY3MtPm1pbm9yX2luZGV4LCBOVUxMKTsKKwljcy0+dHR5X2RldiA9IHR0eV9yZWdpc3Rlcl9kZXZpY2UoZHJ2LT50dHksIGNzLT5taW5vcl9pbmRleCwgTlVMTCk7CiAKLQlpZiAoIUlTX0VSUihjcy0+Y2xhc3MpKQotCQljbGFzc19zZXRfZGV2ZGF0YShjcy0+Y2xhc3MsIGNzKTsKKwlpZiAoIUlTX0VSUihjcy0+dHR5X2RldikpCisJCWRldl9zZXRfZHJ2ZGF0YShjcy0+dHR5X2RldiwgY3MpOwogCWVsc2UgewogCQl3YXJuKCJjb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlIHRvIHRoZSB0dHkgc3Vic3lzdGVtIik7Ci0JCWNzLT5jbGFzcyA9IE5VTEw7CisJCWNzLT50dHlfZGV2ID0gTlVMTDsKIAl9CiB9CiAKQEAgLTY0NSw3ICs2NDUsNyBAQAogCiAJdGFza2xldF9kaXNhYmxlKCZjcy0+aWZfd2FrZV90YXNrbGV0KTsKIAl0YXNrbGV0X2tpbGwoJmNzLT5pZl93YWtlX3Rhc2tsZXQpOwotCWNzLT5jbGFzcyA9IE5VTEw7CisJY3MtPnR0eV9kZXYgPSBOVUxMOwogCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcnYtPnR0eSwgY3MtPm1pbm9yX2luZGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvcHJvYy5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvcHJvYy5jCmluZGV4IDlhZDg0MGUuLmU3NjdhZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Byb2MuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9wcm9jLmMKQEAgLTE2LDExICsxNiwxMiBAQAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCi1zdGF0aWMgc3NpemVfdCBzaG93X2NpZG1vZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2lkbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNhcmRzdGF0ZSAqY3MgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzcyk7CisJc3RydWN0IGNhcmRzdGF0ZSAqY3MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwogCXJldCA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGNzLT5jaWRtb2RlKTsKQEAgLTI5LDEwICszMCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9jaWRtb2RlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzLAorc3RhdGljIHNzaXplX3Qgc2V0X2NpZG1vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3MpOworCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJbG9uZyBpbnQgdmFsdWU7CiAJY2hhciAqZW5kOwogCkBAIC02NCwyNSArNjUsMjUgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjaWRtb2RlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfY2lkbW9kZSwgc2V0X2NpZG1vZGUpOworc3RhdGljIERFVklDRV9BVFRSKGNpZG1vZGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19jaWRtb2RlLCBzZXRfY2lkbW9kZSk7CiAKIC8qIGZyZWUgc3lzZnMgZm9yIGRldmljZSAqLwogdm9pZCBnaWdhc2V0X2ZyZWVfZGV2X3N5c2ZzKHN0cnVjdCBjYXJkc3RhdGUgKmNzKQogewotCWlmICghY3MtPmNsYXNzKQorCWlmICghY3MtPnR0eV9kZXYpCiAJCXJldHVybjsKIAogCWdpZ19kYmcoREVCVUdfSU5JVCwgInJlbW92aW5nIHN5c2ZzIGVudHJpZXMiKTsKLQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY3MtPmNsYXNzLCAmY2xhc3NfZGV2aWNlX2F0dHJfY2lkbW9kZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGNzLT50dHlfZGV2LCAmZGV2X2F0dHJfY2lkbW9kZSk7CiB9CiAKIC8qIGluaXRpYWxpemUgc3lzZnMgZm9yIGRldmljZSAqLwogdm9pZCBnaWdhc2V0X2luaXRfZGV2X3N5c2ZzKHN0cnVjdCBjYXJkc3RhdGUgKmNzKQogewotCWlmICghY3MtPmNsYXNzKQorCWlmICghY3MtPnR0eV9kZXYpCiAJCXJldHVybjsKIAogCWdpZ19kYmcoREVCVUdfSU5JVCwgInNldHRpbmcgdXAgc3lzZnMiKTsKLQlpZiAoY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNzLT5jbGFzcywgJmNsYXNzX2RldmljZV9hdHRyX2NpZG1vZGUpKQorCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoY3MtPnR0eV9kZXYsICZkZXZfYXR0cl9jaWRtb2RlKSkKIAkJZGV2X2Vycihjcy0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzeXNmcyBhdHRyaWJ1dGVcbiIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKaW5kZXggNGZmYTllYi4uNWViZjQ5YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKQEAgLTgxNSwxNCArODE1LDExIEBACiAJcmV0dXJuIDA7CiAKIGVycm9yOgotCWlmICh1Y3MtPnJlYWRfdXJiKQotCQl1c2Jfa2lsbF91cmIodWNzLT5yZWFkX3VyYik7CisJdXNiX2tpbGxfdXJiKHVjcy0+cmVhZF91cmIpOwogCWtmcmVlKHVjcy0+YnVsa19vdXRfYnVmZmVyKTsKLQlpZiAodWNzLT5idWxrX291dF91cmIgIT0gTlVMTCkKLQkJdXNiX2ZyZWVfdXJiKHVjcy0+YnVsa19vdXRfdXJiKTsKKwl1c2JfZnJlZV91cmIodWNzLT5idWxrX291dF91cmIpOwogCWtmcmVlKGNzLT5pbmJ1ZlswXS5yY3ZidWYpOwotCWlmICh1Y3MtPnJlYWRfdXJiICE9IE5VTEwpCi0JCXVzYl9mcmVlX3VyYih1Y3MtPnJlYWRfdXJiKTsKKwl1c2JfZnJlZV91cmIodWNzLT5yZWFkX3VyYik7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCXVjcy0+cmVhZF91cmIgPSB1Y3MtPmJ1bGtfb3V0X3VyYiA9IE5VTEw7CiAJY3MtPmluYnVmWzBdLnJjdmJ1ZiA9IHVjcy0+YnVsa19vdXRfYnVmZmVyID0gTlVMTDsKQEAgLTg1MCwxMSArODQ3LDkgQEAKIAl1c2Jfa2lsbF91cmIodWNzLT5idWxrX291dF91cmIpOwkvKiBGSVhNRTogb25seSBpZiBhY3RpdmU/ICovCiAKIAlrZnJlZSh1Y3MtPmJ1bGtfb3V0X2J1ZmZlcik7Ci0JaWYgKHVjcy0+YnVsa19vdXRfdXJiICE9IE5VTEwpCi0JCXVzYl9mcmVlX3VyYih1Y3MtPmJ1bGtfb3V0X3VyYik7CisJdXNiX2ZyZWVfdXJiKHVjcy0+YnVsa19vdXRfdXJiKTsKIAlrZnJlZShjcy0+aW5idWZbMF0ucmN2YnVmKTsKLQlpZiAodWNzLT5yZWFkX3VyYiAhPSBOVUxMKQotCQl1c2JfZnJlZV91cmIodWNzLT5yZWFkX3VyYik7CisJdXNiX2ZyZWVfdXJiKHVjcy0+cmVhZF91cmIpOwogCXVjcy0+cmVhZF91cmIgPSB1Y3MtPmJ1bGtfb3V0X3VyYiA9IE5VTEw7CiAJY3MtPmluYnVmWzBdLnJjdmJ1ZiA9IHVjcy0+YnVsa19vdXRfYnVmZmVyID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKaW5kZXggN2JiZmQ4NS4uZmQ1ZDczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCkBAIC0xOTQsNDEgKzE5NCwxMSBAQAogCiAgICAgZGV2ID0gbGluay0+cHJpdjsKIAotICAgIC8qCi0gICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICAgcmVnaXN0ZXJzLgotICAgICovCiAgICAgZG8gewotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSBicmVhazsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCWkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSBicmVhazsKLQlpID0gcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSBicmVhazsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICB9IHdoaWxlICgwKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7Ci0JY3NfZXJyb3IobGluaywgUGFyc2VUdXBsZSwgaSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotCi0gICAgZG8gewotCi0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NDsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLQogCWRldm5hbWVbMF0gPSAwOwotCWlmKCAhZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICYmIHBhcnNlLnZlcnNpb25fMS5ucyA+IDEgKSB7Ci0JICAgIHN0cmxjcHkoZGV2bmFtZSxwYXJzZS52ZXJzaW9uXzEuc3RyICsgcGFyc2UudmVyc2lvbl8xLm9mc1sxXSwgCi0JCQlzaXplb2YoZGV2bmFtZSkpOwotCX0KKwlpZiAobGluay0+cHJvZF9pZFsxXSkKKwkJc3RybGNweShkZXZuYW1lLCBsaW5rLT5wcm9kX2lkWzFdLCBzaXplb2YoZGV2bmFtZSkpOworCiAJLyoKICAgICAgICAgICogZmluZCBJTyBwb3J0CiAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMKaW5kZXggMTFlNmY5My4uN2I0ZWMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jCkBAIC00NjQsNyArNDY0LDcgQEAKIAogLyoKICoqICBDbGVhbnVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBtYXN0ZXIgYWRhcHRlciBvbmx5Ci0qKiAgdGhpcyBpcyBnYXJhbnRlZWQgYnkgZGVzaWduOiBjbGVhbnVwIGNhbGxiYWNrIGlzIHNldAorKiogIHRoaXMgaXMgZ3VhcmFudGVlZCBieSBkZXNpZ246IGNsZWFudXAgY2FsbGJhY2sgaXMgc2V0CiAqKiAgYnkgbWFzdGVyIGFkYXB0ZXIgb25seQogKi8KIHN0YXRpYyBpbnQgZGl2YV80YnJpX2NsZWFudXBfYWRhcHRlcihkaXZhX29zX3hkaV9hZGFwdGVyX3QgKiBhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYwppbmRleCBhYzI4ZTMyLi44NzZmZWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYwpAQCAtMjE2LDQxICsyMTYsMTEgQEAKIAogICAgIERFQlVHKDAsICJhdm1hMWNzX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICAvKgotICAgICAgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgotICAgICAgIHJlZ2lzdGVycy4KLSAgICAqLwogICAgIGRvIHsKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCWkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0JdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQlpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0JaSA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0gICAgfSB3aGlsZSAoMCk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgewotCWNzX2Vycm9yKGxpbmssIFBhcnNlVHVwbGUsIGkpOwotCXJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIGRvIHsKLQotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSAyNTQ7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0KIAlkZXZuYW1lWzBdID0gMDsKLQlpZiggIWZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSAmJiBwYXJzZS52ZXJzaW9uXzEubnMgPiAxICkgewotCSAgICBzdHJsY3B5KGRldm5hbWUscGFyc2UudmVyc2lvbl8xLnN0ciArIHBhcnNlLnZlcnNpb25fMS5vZnNbMV0sIAotCQkJc2l6ZW9mKGRldm5hbWUpKTsKLQl9CisJaWYgKGxpbmstPnByb2RfaWRbMV0pCisJCXN0cmxjcHkoZGV2bmFtZSwgbGluay0+cHJvZF9pZFsxXSwgc2l6ZW9mKGRldm5hbWUpKTsKKwogCS8qCiAgICAgICAgICAqIGZpbmQgSU8gcG9ydAogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCmluZGV4IGUxOGU3NWIuLjRlMTgwZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwpAQCAtMjQyLDIzICsyNDIsNiBAQAogICAgIERFQlVHKDAsICJlbHNhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAgICAgZGV2ID0gbGluay0+cHJpdjsKIAotICAgIC8qCi0gICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICAgcmVnaXN0ZXJzLgotICAgICovCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7Ci0gICAgICAgIGxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCWdvdG8gY3NfZmFpbGVkOwotICAgIH0KLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmM0czhzX2wxLmgKaW5kZXggZThmOWMwNy4uOWQ1ZDJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5oCkBAIC0xNiw3ICsxNiw3IEBACiAKIC8qCiAqICBpbmNsdWRlIEdlbmVybyBnZW5lcmF0ZWQgSEZDLTRTLzhTIGhlYWRlciBmaWxlIGhmYzQ4c2N1LmgKLSogIGZvciBjb21sZXRlIHJlZ2lzdGVyIGRlc2NyaXB0aW9uLiBUaGlzIHdpbGwgZGVmaW5lIF9IRkM0OFNDVV9IXworKiAgZm9yIGNvbXBsZXRlIHJlZ2lzdGVyIGRlc2NyaXB0aW9uLiBUaGlzIHdpbGwgZGVmaW5lIF9IRkM0OFNDVV9IXwogKiAgdG8gcHJldmVudCByZWRlZmluaXRpb25zCiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKaW5kZXggNmQwNDMxNy4uY2QzYjVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYwpAQCAtMTQ0Miw3ICsxNDQyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWwyX3N0MTRfcGVyc2lzdGFudF9kYShzdHJ1Y3QgRnNtSW5zdCAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorbDJfc3QxNF9wZXJzaXN0ZW50X2RhKHN0cnVjdCBGc21JbnN0ICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7CiAJc3RydWN0IFBTdGFjayAqc3QgPSBmaS0+dXNlcmRhdGE7CiAJCkBAIC0xNDUzLDcgKzE0NTMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbDJfc3Q1X3BlcnNpc3RhbnRfZGEoc3RydWN0IEZzbUluc3QgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK2wyX3N0NV9wZXJzaXN0ZW50X2RhKHN0cnVjdCBGc21JbnN0ICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7CiAJc3RydWN0IFBTdGFjayAqc3QgPSBmaS0+dXNlcmRhdGE7CiAKQEAgLTE0NjYsNyArMTQ2Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1sMl9zdDZfcGVyc2lzdGFudF9kYShzdHJ1Y3QgRnNtSW5zdCAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorbDJfc3Q2X3BlcnNpc3RlbnRfZGEoc3RydWN0IEZzbUluc3QgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgUFN0YWNrICpzdCA9IGZpLT51c2VyZGF0YTsKIApAQCAtMTQ3Nyw3ICsxNDc3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWwyX3BlcnNpc3RhbnRfZGEoc3RydWN0IEZzbUluc3QgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK2wyX3BlcnNpc3RlbnRfZGEoc3RydWN0IEZzbUluc3QgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgUFN0YWNrICpzdCA9IGZpLT51c2VyZGF0YTsKIApAQCAtMTYxMiwxNCArMTYxMiwxNCBAQAogCXtTVF9MMl82LCBFVl9MMl9GUkFNRV9FUlJPUiwgbDJfZnJhbWVfZXJyb3J9LAogCXtTVF9MMl83LCBFVl9MMl9GUkFNRV9FUlJPUiwgbDJfZnJhbWVfZXJyb3JfcmVlc3R9LAogCXtTVF9MMl84LCBFVl9MMl9GUkFNRV9FUlJPUiwgbDJfZnJhbWVfZXJyb3JfcmVlc3R9LAotCXtTVF9MMl8xLCBFVl9MMV9ERUFDVElWQVRFLCBsMl9zdDE0X3BlcnNpc3RhbnRfZGF9LAorCXtTVF9MMl8xLCBFVl9MMV9ERUFDVElWQVRFLCBsMl9zdDE0X3BlcnNpc3RlbnRfZGF9LAogCXtTVF9MMl8yLCBFVl9MMV9ERUFDVElWQVRFLCBsMl9zdDI0X3RlaV9yZW1vdmV9LAogCXtTVF9MMl8zLCBFVl9MMV9ERUFDVElWQVRFLCBsMl9zdDNfdGVpX3JlbW92ZX0sCi0Je1NUX0wyXzQsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0MTRfcGVyc2lzdGFudF9kYX0sCi0Je1NUX0wyXzUsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0NV9wZXJzaXN0YW50X2RhfSwKLQl7U1RfTDJfNiwgRVZfTDFfREVBQ1RJVkFURSwgbDJfc3Q2X3BlcnNpc3RhbnRfZGF9LAotCXtTVF9MMl83LCBFVl9MMV9ERUFDVElWQVRFLCBsMl9wZXJzaXN0YW50X2RhfSwKLQl7U1RfTDJfOCwgRVZfTDFfREVBQ1RJVkFURSwgbDJfcGVyc2lzdGFudF9kYX0sCisJe1NUX0wyXzQsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0MTRfcGVyc2lzdGVudF9kYX0sCisJe1NUX0wyXzUsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0NV9wZXJzaXN0ZW50X2RhfSwKKwl7U1RfTDJfNiwgRVZfTDFfREVBQ1RJVkFURSwgbDJfc3Q2X3BlcnNpc3RlbnRfZGF9LAorCXtTVF9MMl83LCBFVl9MMV9ERUFDVElWQVRFLCBsMl9wZXJzaXN0ZW50X2RhfSwKKwl7U1RfTDJfOCwgRVZfTDFfREVBQ1RJVkFURSwgbDJfcGVyc2lzdGVudF9kYX0sCiB9OwogCiAjZGVmaW5lIEwyX0ZOX0NPVU5UIChzaXplb2YoTDJGbkxpc3QpL3NpemVvZihzdHJ1Y3QgRnNtTm9kZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKaW5kZXggZjljMTRhMi4uNDZlZDY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYwpAQCAtMjMzLDIwICsyMzMsMTAgQEAKIAogICAgIERFQlVHKDAsICJzZWRsYmF1ZXJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIC8qCi0gICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICAgcmVnaXN0ZXJzLgotICAgICovCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKICAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwogCiAgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKaW5kZXggYWZjYzJhZS4uNmI3NTRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKQEAgLTIzMiwyMyArMjMyLDYgQEAKICAgICBERUJVRygwLCAidGVsZXNfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKICAgICBkZXYgPSBsaW5rLT5wcml2OwogCi0gICAgLyoKLSAgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICAgICByZWdpc3RlcnMuCi0gICAgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICBpID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKLSAgICAgICAgbGFzdF9mbiA9IFBhcnNlVHVwbGU7Ci0JZ290byBjc19mYWlsZWQ7Ci0gICAgfQotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CiAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOyB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkdHJpZy1pZGUtZGlzay5jIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctaWRlLWRpc2suYwppbmRleCBmYTY1MTg4Li41NGIxNTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkdHJpZy1pZGUtZGlzay5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWlkZS1kaXNrLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKaW5kZXggMjlhODgxOGEuLmQ3NTZiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCmluZGV4IDdmODQ3N2QuLjkyY2NlZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwpAQCAtMjI4LDQgKzIyOCwxMSBAQAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBBTlMgTENEIGRpc3BsYXkiCiAJZGVwZW5kcyBvbiBBREJfQ1VEQSAmJiBQUENfUE1BQwogCitjb25maWcgUE1BQ19SQUNLTUVURVIKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQXBwbGUgWFNlcnZlIGZyb250IHBhbmVsIExFRHMiCisJZGVwZW5kcyBvbiBQUENfUE1BQworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb2NpZGVzIHNvbWUgc3VwcG9ydCB0byBjb250cm9sIHRoZSBmcm9udCBwYW5lbAorICAgICAgICAgIGJsdWUgTEVEcyAidnUtbWV0ZXIiIG9mIHRoZSBYU2VydmVyIG1hY3MuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKaW5kZXggYjUzZDQ1Zi4uMmRmYzNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKQEAgLTQyLDMgKzQyLDQgQEAKIAkJCQkgICB3aW5kZmFybV9zbXVfc2Vuc29ycy5vIFwKIAkJCQkgICB3aW5kZmFybV9tYXg2NjkwX3NlbnNvci5vIFwKIAkJCQkgICB3aW5kZmFybV9sbTc1X3NlbnNvci5vIHdpbmRmYXJtX3BpZC5vCitvYmotJChDT05GSUdfUE1BQ19SQUNLTUVURVIpCSs9IHJhY2stbWV0ZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jIGIvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjZmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKQEAgLTAsMCArMSw2MTIgQEAKKy8qCisgKiBSYWNrTWFjIHZ1LW1ldGVyIGRyaXZlcgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqICAgICAgICAgICAgICAgICAgICA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtIG9mIHRoZSBHTlUgR1BMIHYyLgorICoKKyAqIFN1cHBvcnQgdGhlIENQVS1tZXRlciBMRURzIG9mIHRoZSBYc2VydmUgRzUKKyAqCisgKiBUT0RPOiBJbXBsZW1lbnQgUFdNIHRvIGRvIHZhcmlhYmxlIGludGVuc2l0eSBhbmQgcHJvdmlkZSB1c2VybGFuZAorICogaW50ZXJmYWNlIGZvciBmdW4uIEFsc28sIHRoZSBDUFUtbWV0ZXIgY291bGQgYmUgbWFkZSBuaWNlciBieSBiZWluZworICogYSBiaXQgbGVzcyAiaW1tZWRpYXRlIiBidXQgZ2l2aW5nIGluc3RlYWQgYSBtb3JlIGF2ZXJhZ2UgbG9hZCBvdmVyCisgKiB0aW1lLiBQYXRjaGVzIHdlbGNvbWUgOi0pCisgKgorICovCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKyNpbmNsdWRlIDxhc20va2V5bGFyZ28uaD4KKworLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBzYW1wbGUgYnVmZmVyICovCisjZGVmaW5lIFNBTVBMRV9DT1VOVAkJMjU2CisKKy8qIENQVSBtZXRlciBzYW1wbGluZyByYXRlIGluIG1zICovCisjZGVmaW5lIENQVV9TQU1QTElOR19SQVRFCTI1MAorCitzdHJ1Y3QgcmFja21ldGVyX2RtYSB7CisJc3RydWN0IGRiZG1hX2NtZAljbWRbNF0JCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJdTMyCQkJbWFyawkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwl1MzIJCQlidWYxW1NBTVBMRV9DT1VOVF0JX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXUzMgkJCWJ1ZjJbU0FNUExFX0NPVU5UXQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RydWN0IHJhY2ttZXRlcl9jcHUgeworCXN0cnVjdCB3b3JrX3N0cnVjdAlzbmlmZmVyOworCWNwdXRpbWU2NF90CQlwcmV2X3dhbGw7CisJY3B1dGltZTY0X3QJCXByZXZfaWRsZTsKKwlpbnQJCQl6ZXJvOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCByYWNrbWV0ZXIgeworCXN0cnVjdCBtYWNpb19kZXYJCSptZGV2OworCXVuc2lnbmVkIGludAkJCWlycTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSppMnM7CisJdTgJCQkJKnVidWY7CisJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbQkqZG1hX3JlZ3M7CisJdm9pZCBfX2lvbWVtCQkJKmkyc19yZWdzOworCWRtYV9hZGRyX3QJCQlkbWFfYnVmX3A7CisJc3RydWN0IHJhY2ttZXRlcl9kbWEJCSpkbWFfYnVmX3Y7CisJaW50CQkJCXN0YWxlX2lycTsKKwlzdHJ1Y3QgcmFja21ldGVyX2NwdQkJY3B1WzJdOworCWludAkJCQlwYXVzZWQ7CisJc3RydWN0IG11dGV4CQkJc2VtOworfTsKKworLyogVG8gYmUgc2V0IGFzIGEgdHVuYWJsZSAqLworc3RhdGljIGludCByYWNrbWV0ZXJfaWdub3JlX25pY2U7CisKKy8qIFRoaXMgR1BJTyBpcyB3aGFja2VkIGJ5IHRoZSBPUyBYIGRyaXZlciB3aGVuIGluaXRpYWxpemluZyAqLworI2RlZmluZSBSQUNLTUVURVJfTUFHSUNfR1BJTwkweDc4CisKKy8qIFRoaXMgaXMgY29waWVkIGZyb20gY3B1ZnJlcV9vbmRlbWFuZCwgbWF5YmUgd2Ugc2hvdWxkIHB1dCBpdCBpbgorICogYSBjb21tb24gaGVhZGVyIHNvbWV3aGVyZQorICovCitzdGF0aWMgaW5saW5lIGNwdXRpbWU2NF90IGdldF9jcHVfaWRsZV90aW1lKHVuc2lnbmVkIGludCBjcHUpCit7CisJY3B1dGltZTY0X3QgcmV0dmFsOworCisJcmV0dmFsID0gY3B1dGltZTY0X2FkZChrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LmlkbGUsCisJCQlrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lmlvd2FpdCk7CisKKwlpZiAocmFja21ldGVyX2lnbm9yZV9uaWNlKQorCQlyZXR2YWwgPSBjcHV0aW1lNjRfYWRkKHJldHZhbCwga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5uaWNlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJhY2ttZXRlcl9zZXR1cF9pMnMoc3RydWN0IHJhY2ttZXRlciAqcm0pCit7CisJc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvID0gcm0tPm1kZXYtPmJ1cy0+Y2hpcDsKKworCS8qIEZpcnN0IHdoYWNrIG1hZ2ljIEdQSU8gKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9XUklURV9HUElPLCBOVUxMLCBSQUNLTUVURVJfTUFHSUNfR1BJTywgNSk7CisKKworCS8qIENhbGwgZmVhdHVyZSBjb2RlIHRvIGVuYWJsZSB0aGUgc291bmQgY2hhbm5lbCBhbmQgdGhlIHByb3BlcgorCSAqIGNsb2NrIHNvdXJjZXMKKwkgKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwgcm0tPmkycywgMCwgMSk7CisKKwkvKiBQb3dlciBpMnMgYW5kIHN0b3AgaTJzIGNsb2NrLiBXZSB3aGFjayBNYWNJTyBGQ1JzIGRpcmVjdGx5IGZvciBub3cuCisJICogVGhpcyBpcyBhIGJpdCByYWN5LCB0aHVzIHdlIHNob3VsZCBhZGQgbmV3IHBsYXRmb3JtIGZ1bmN0aW9ucyB0bworCSAqIGhhbmRsZSB0aGF0LiBzbmQtYW9hIG5lZWRzIHRoYXQgdG9vCisJICovCisJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEtMMV9JMlMwX0VOQUJMRSk7CisJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjEsIEtMMV9JMlMwX0NMS19FTkFCTEVfQklUKTsKKwkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjEpOworCXVkZWxheSgxMCk7CisKKwkvKiBUaGVuIHNldHVwIGkycy4gRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIG1hZ2ljIHZhbHVlIHRoYXQKKwkgKiB0aGUgT1MgWCBkcml2ZXIgc2VlbXMgdG8gdXNlLiBXZSBtaWdodCB3YW50IHRvIHBsYXkgYXJvdW5kCisJICogd2l0aCB0aGUgY2xvY2sgZGl2aXNvcnMgbGF0ZXIKKwkgKi8KKwlvdXRfbGUzMihybS0+aTJzX3JlZ3MgKyAweDEwLCAweDAxZmEwMDAwKTsKKwkodm9pZClpbl9sZTMyKHJtLT5pMnNfcmVncyArIDB4MTApOworCXVkZWxheSgxMCk7CisKKwkvKiBGdWxseSByZXN0YXJ0IGkycyovCisJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEtMMV9JMlMwX0NFTExfRU5BQkxFIHwKKwkJICBLTDFfSTJTMF9DTEtfRU5BQkxFX0JJVCk7CisJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IxKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCByYWNrbWV0ZXJfc2V0X2RlZmF1bHRfcGF0dGVybihzdHJ1Y3QgcmFja21ldGVyICpybSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChpIDwgOCkKKwkJCXJtLT51YnVmW2ldID0gKGkgJiAxKSAqIDI1NTsKKwkJZWxzZQorCQkJcm0tPnVidWZbaV0gPSAoKH5pKSAmIDEpICogMjU1OworCX0KK30KKworc3RhdGljIHZvaWQgcmFja21ldGVyX2RvX3BhdXNlKHN0cnVjdCByYWNrbWV0ZXIgKnJtLCBpbnQgcGF1c2UpCit7CisJc3RydWN0IHJhY2ttZXRlcl9kbWEgKnJkbWEgPSBybS0+ZG1hX2J1Zl92OworCisJcHJfZGVidWcoInJhY2ttZXRlcjogJXNcbiIsIHBhdXNlID8gInBhdXNlZCIgOiAic3RhcnRlZCIpOworCisJcm0tPnBhdXNlZCA9IHBhdXNlOworCWlmIChwYXVzZSkgeworCQlEQkRNQV9ET19TVE9QKHJtLT5kbWFfcmVncyk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHJkbWEtPmJ1ZjEsIDAsIFNBTVBMRV9DT1VOVCAmIHNpemVvZih1MzIpKTsKKwltZW1zZXQocmRtYS0+YnVmMiwgMCwgU0FNUExFX0NPVU5UICYgc2l6ZW9mKHUzMikpOworCisJcm0tPmRtYV9idWZfdi0+bWFyayA9IDA7CisKKwltYigpOworCW91dF9sZTMyKCZybS0+ZG1hX3JlZ3MtPmNtZHB0cl9oaSwgMCk7CisJb3V0X2xlMzIoJnJtLT5kbWFfcmVncy0+Y21kcHRyLCBybS0+ZG1hX2J1Zl9wKTsKKwlvdXRfbGUzMigmcm0tPmRtYV9yZWdzLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7Cit9CisKK3N0YXRpYyB2b2lkIHJhY2ttZXRlcl9zZXR1cF9kYmRtYShzdHJ1Y3QgcmFja21ldGVyICpybSkKK3sKKwlzdHJ1Y3QgcmFja21ldGVyX2RtYSAqZGIgPSBybS0+ZG1hX2J1Zl92OworCXN0cnVjdCBkYmRtYV9jbWQgKmNtZCA9IGRiLT5jbWQ7CisKKwkvKiBNYWtlIHN1cmUgZGJkbWEgaXMgcmVzZXQgKi8KKwlEQkRNQV9ET19SRVNFVChybS0+ZG1hX3JlZ3MpOworCisJcHJfZGVidWcoInJhY2ttZXRlcjogbWFyayBvZmZzZXQ9MHglbHhcbiIsCisJCSBvZmZzZXRvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSwgbWFyaykpOworCXByX2RlYnVnKCJyYWNrbWV0ZXI6IGJ1ZjEgb2Zmc2V0PTB4JWx4XG4iLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIGJ1ZjEpKTsKKwlwcl9kZWJ1ZygicmFja21ldGVyOiBidWYyIG9mZnNldD0weCVseFxuIiwKKwkJIG9mZnNldG9mKHN0cnVjdCByYWNrbWV0ZXJfZG1hLCBidWYyKSk7CisKKwkvKiBQcmVwYXJlIDQgZGJkbWEgY29tbWFuZHMgZm9yIHRoZSAyIGJ1ZmZlcnMgKi8KKwltZW1zZXQoY21kLCAwLCA0ICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlzdF9sZTE2KCZjbWQtPnJlcV9jb3VudCwgNCk7CisJc3RfbGUxNigmY21kLT5jb21tYW5kLCBTVE9SRV9XT1JEIHwgSU5UUl9BTFdBWVMgfCBLRVlfU1lTVEVNKTsKKwlzdF9sZTMyKCZjbWQtPnBoeV9hZGRyLCBybS0+ZG1hX2J1Zl9wICsKKwkJb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIG1hcmspKTsKKwlzdF9sZTMyKCZjbWQtPmNtZF9kZXAsIDB4MDIwMDAwMDApOworCWNtZCsrOworCisJc3RfbGUxNigmY21kLT5yZXFfY291bnQsIFNBTVBMRV9DT1VOVCAqIDQpOworCXN0X2xlMTYoJmNtZC0+Y29tbWFuZCwgT1VUUFVUX01PUkUpOworCXN0X2xlMzIoJmNtZC0+cGh5X2FkZHIsIHJtLT5kbWFfYnVmX3AgKworCQlvZmZzZXRvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSwgYnVmMSkpOworCWNtZCsrOworCisJc3RfbGUxNigmY21kLT5yZXFfY291bnQsIDQpOworCXN0X2xlMTYoJmNtZC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IElOVFJfQUxXQVlTIHwgS0VZX1NZU1RFTSk7CisJc3RfbGUzMigmY21kLT5waHlfYWRkciwgcm0tPmRtYV9idWZfcCArCisJCW9mZnNldG9mKHN0cnVjdCByYWNrbWV0ZXJfZG1hLCBtYXJrKSk7CisJc3RfbGUzMigmY21kLT5jbWRfZGVwLCAweDAxMDAwMDAwKTsKKwljbWQrKzsKKworCXN0X2xlMTYoJmNtZC0+cmVxX2NvdW50LCBTQU1QTEVfQ09VTlQgKiA0KTsKKwlzdF9sZTE2KCZjbWQtPmNvbW1hbmQsIE9VVFBVVF9NT1JFIHwgQlJfQUxXQVlTKTsKKwlzdF9sZTMyKCZjbWQtPnBoeV9hZGRyLCBybS0+ZG1hX2J1Zl9wICsKKwkJb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIGJ1ZjIpKTsKKwlzdF9sZTMyKCZjbWQtPmNtZF9kZXAsIHJtLT5kbWFfYnVmX3ApOworCisJcmFja21ldGVyX2RvX3BhdXNlKHJtLCAwKTsKK30KKworc3RhdGljIHZvaWQgcmFja21ldGVyX2RvX3RpbWVyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJhY2ttZXRlciAqcm0gPSBkYXRhOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHJhY2ttZXRlcl9jcHUgKnJjcHUgPSAmcm0tPmNwdVtjcHVdOworCWNwdXRpbWU2NF90IGN1cl9qaWZmaWVzLCB0b3RhbF9pZGxlX3RpY2tzOworCXVuc2lnbmVkIGludCB0b3RhbF90aWNrcywgaWRsZV90aWNrczsKKwlpbnQgaSwgb2Zmc2V0LCBsb2FkLCBjdW1tLCBwYXVzZTsKKworCWN1cl9qaWZmaWVzID0gamlmZmllczY0X3RvX2NwdXRpbWU2NChnZXRfamlmZmllc182NCgpKTsKKwl0b3RhbF90aWNrcyA9ICh1bnNpZ25lZCBpbnQpY3B1dGltZTY0X3N1YihjdXJfamlmZmllcywKKwkJCQkJCSAgcmNwdS0+cHJldl93YWxsKTsKKwlyY3B1LT5wcmV2X3dhbGwgPSBjdXJfamlmZmllczsKKworCXRvdGFsX2lkbGVfdGlja3MgPSBnZXRfY3B1X2lkbGVfdGltZShjcHUpOworCWlkbGVfdGlja3MgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKHRvdGFsX2lkbGVfdGlja3MsCisJCQkJcmNwdS0+cHJldl9pZGxlKTsKKwlyY3B1LT5wcmV2X2lkbGUgPSB0b3RhbF9pZGxlX3RpY2tzOworCisJLyogV2UgZG8gYSB2ZXJ5IGR1bWIgY2FsY3VsYXRpb24gdG8gdXBkYXRlIHRoZSBMRURzIGZvciBub3csCisJICogd2UnbGwgZG8gYmV0dGVyIG9uY2Ugd2UgaGF2ZSBhY3R1YWwgUFdNIGltcGxlbWVudGVkCisJICovCisJbG9hZCA9ICg5ICogKHRvdGFsX3RpY2tzIC0gaWRsZV90aWNrcykpIC8gdG90YWxfdGlja3M7CisKKwlvZmZzZXQgPSBjcHUgPDwgMzsKKwljdW1tID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXU4IHViID0gKGxvYWQgPiBpKSA/IDB4ZmYgOiAwOworCQlybS0+dWJ1ZltpICsgb2Zmc2V0XSA9IHViOworCQljdW1tIHw9IHViOworCX0KKwlyY3B1LT56ZXJvID0gKGN1bW0gPT0gMCk7CisKKwkvKiBOb3cgY2hlY2sgaWYgTEVEcyBhcmUgYWxsIDAsIHdlIGNhbiBzdG9wIERNQSAqLworCXBhdXNlID0gKHJtLT5jcHVbMF0uemVybyAmJiBybS0+Y3B1WzFdLnplcm8pOworCWlmIChwYXVzZSAhPSBybS0+cGF1c2VkKSB7CisJCW11dGV4X2xvY2soJnJtLT5zZW0pOworCQlwYXVzZSA9IChybS0+Y3B1WzBdLnplcm8gJiYgcm0tPmNwdVsxXS56ZXJvKTsKKwkJcmFja21ldGVyX2RvX3BhdXNlKHJtLCBwYXVzZSk7CisJCW11dGV4X3VubG9jaygmcm0tPnNlbSk7CisJfQorCXNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihjcHUsICZyY3B1LT5zbmlmZmVyLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKENQVV9TQU1QTElOR19SQVRFKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCByYWNrbWV0ZXJfaW5pdF9jcHVfc25pZmZlcihzdHJ1Y3QgcmFja21ldGVyICpybSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJLyogVGhpcyBkcml2ZXIgd29ya3Mgb25seSB3aXRoIDEgb3IgMiBDUFVzIG51bWJlcmVkIDAgYW5kIDEsCisJICogYnV0IHRoYXQncyByZWFsbHkgYWxsIHdlIGhhdmUgb24gQXBwbGUgWHNlcnZlLiBJdCBkb2Vzbid0CisJICogcGxheSB2ZXJ5IG5pY2Ugd2l0aCBDUFUgaG90cGx1ZyBuZWl0aGVyIGJ1dCB3ZSBkb24ndCBkbyB0aGF0CisJICogb24gdGhvc2UgbWFjaGluZXMgeWV0CisJICovCisKKwlJTklUX1dPUksoJnJtLT5jcHVbMF0uc25pZmZlciwgcmFja21ldGVyX2RvX3RpbWVyLCBybSk7CisJSU5JVF9XT1JLKCZybS0+Y3B1WzFdLnNuaWZmZXIsIHJhY2ttZXRlcl9kb190aW1lciwgcm0pOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0IHJhY2ttZXRlcl9jcHUgKnJjcHU7CisKKwkJaWYgKGNwdSA+IDEpCisJCQljb250aW51ZTsKKwkJcmNwdSA9ICZybS0+Y3B1W2NwdV07OworCQlyY3B1LT5wcmV2X2lkbGUgPSBnZXRfY3B1X2lkbGVfdGltZShjcHUpOworCQlyY3B1LT5wcmV2X3dhbGwgPSBqaWZmaWVzNjRfdG9fY3B1dGltZTY0KGdldF9qaWZmaWVzXzY0KCkpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oY3B1LCAmcm0tPmNwdVtjcHVdLnNuaWZmZXIsCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKENQVV9TQU1QTElOR19SQVRFKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcmFja21ldGVyX3N0b3BfY3B1X3NuaWZmZXIoc3RydWN0IHJhY2ttZXRlciAqcm0pCit7CisJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmcm0tPmNwdVswXS5zbmlmZmVyKTsKKwljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZybS0+Y3B1WzFdLnNuaWZmZXIpOworfQorCitzdGF0aWMgaW50IHJhY2ttZXRlcl9zZXR1cChzdHJ1Y3QgcmFja21ldGVyICpybSkKK3sKKwlwcl9kZWJ1ZygicmFja21ldGVyOiBzZXR0aW5nIHVwIGkycy4uXG4iKTsKKwlyYWNrbWV0ZXJfc2V0dXBfaTJzKHJtKTsKKworCXByX2RlYnVnKCJyYWNrbWV0ZXI6IHNldHRpbmcgdXAgZGVmYXVsdCBwYXR0ZXJuLi5cbiIpOworCXJhY2ttZXRlcl9zZXRfZGVmYXVsdF9wYXR0ZXJuKHJtKTsKKworCXByX2RlYnVnKCJyYWNrbWV0ZXI6IHNldHRpbmcgdXAgZGJkbWEuLlxuIik7CisJcmFja21ldGVyX3NldHVwX2RiZG1hKHJtKTsKKworCXByX2RlYnVnKCJyYWNrbWV0ZXI6IHN0YXJ0IENQVSBtZWFzdXJlbWVudHMuLlxuIik7CisJcmFja21ldGVyX2luaXRfY3B1X3NuaWZmZXIocm0pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUmFja01ldGVyIGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworfQorCisvKiAgWFhYIEZJWE1FOiBObyBQV00geWV0LCB0aGlzIGlzIDAvMSAqLworc3RhdGljIHUzMiByYWNrbWV0ZXJfY2FsY19zYW1wbGUoc3RydWN0IHJhY2ttZXRlciAqcm0sIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlpbnQgbGVkOworCXUzMiBzYW1wbGUgPSAwOworCisJZm9yIChsZWQgPSAwOyBsZWQgPCAxNjsgbGVkKyspIHsKKwkJc2FtcGxlID4+PSAxOworCQlzYW1wbGUgfD0gKChybS0+dWJ1ZltsZWRdID49IDB4ODApIDw8IDE1KTsKKwl9CisJcmV0dXJuIChzYW1wbGUgPDwgMTcpIHwgKHNhbXBsZSA+PiAxNSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByYWNrbWV0ZXJfaXJxKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmFja21ldGVyICpybSA9IGFyZzsKKwlzdHJ1Y3QgcmFja21ldGVyX2RtYSAqZGIgPSBybS0+ZG1hX2J1Zl92OworCXVuc2lnbmVkIGludCBtYXJrLCBpOworCXUzMiAqYnVmOworCisJLyogRmx1c2ggUENJIGJ1ZmZlcnMgd2l0aCBhbiBNTUlPIHJlYWQuIE1heWJlIHdlIGNvdWxkIGFjdHVhbGx5CisJICogY2hlY2sgdGhlIHN0YXR1cyBvbmUgZGF5IC4uLiBpbiBjYXNlIHRoaW5ncyBnbyB3cm9uZywgdGhvdWdoCisJICogdGhpcyBuZXZlciBoYXBwZW5lZCB0byBtZQorCSAqLworCSh2b2lkKWluX2xlMzIoJnJtLT5kbWFfcmVncy0+c3RhdHVzKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgQ1BVIGdldHMgdXMgaW4gb3JkZXIgKi8KKwlybWIoKTsKKworCS8qIFJlYWQgbWFyayAqLworCW1hcmsgPSBkYi0+bWFyazsKKwlpZiAobWFyayAhPSAxICYmIG1hcmsgIT0gMikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYWNrbWV0ZXI6IEluY29ycmVjdCBETUEgbWFyayAweCUwOHhcbiIsCisJCSAgICAgICBtYXJrKTsKKwkJLyogV2UgYWxsb3cgZm9yIDMgZXJyb3JzIGxpa2UgdGhhdCAoc3RhbGUgREJETUEgaXJxcykgKi8KKwkJaWYgKCsrcm0tPnN0YWxlX2lycSA+IDMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicmFja21ldGVyOiBUb28gbWFueSBlcnJvcnMsIgorCQkJICAgICAgICIgc3RvcHBpbmcgRE1BXG4iKTsKKwkJCURCRE1BX0RPX1JFU0VUKHJtLT5kbWFfcmVncyk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIE5leHQgYnVmZmVyIHdlIG5lZWQgdG8gZmlsbCBpcyBtYXJrIHZhbHVlICovCisJYnVmID0gbWFyayA9PSAxID8gZGItPmJ1ZjEgOiBkYi0+YnVmMjsKKworCS8qIEZpbGwgaXQgbm93LiBUaGlzIHJvdXRpbmUgY29udmVydHMgdGhlIDggYml0cyBkZXB0aCBzYW1wbGUgYXJyYXkKKwkgKiBpbnRvIHRoZSBQV00gYml0bWFwIGZvciBlYWNoIExFRC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0FNUExFX0NPVU5UOyBpKyspCisJCWJ1ZltpXSA9IHJhY2ttZXRlcl9jYWxjX3NhbXBsZShybSwgaSk7CisKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcmFja21ldGVyX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYqIG1kZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmkycyA9IE5VTEwsICpucCA9IE5VTEw7CisJc3RydWN0IHJhY2ttZXRlciAqcm0gPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSByaTJzLCByZG1hOworCWludCByYyA9IC1FTk9ERVY7CisKKwlwcl9kZWJ1ZygicmFja21ldGVyX3Byb2JlKClcbiIpOworCisJLyogR2V0IGkycy1hIG5vZGUgKi8KKwl3aGlsZSAoKGkycyA9IG9mX2dldF9uZXh0X2NoaWxkKG1kZXYtPm9mZGV2Lm5vZGUsIGkycykpICE9IE5VTEwpCisJICAgICAgIGlmIChzdHJjbXAoaTJzLT5uYW1lLCAiaTJzLWEiKSA9PSAwKQorCQkgICAgICAgYnJlYWs7CisJaWYgKGkycyA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCIgIGkycy1hIGNoaWxkIG5vdCBmb3VuZFxuIik7CisJCWdvdG8gYmFpbDsKKwl9CisJLyogR2V0IGxpZ2h0c2hvdyBvciB2aXJ0dWFsIHNvdW5kICovCisJd2hpbGUgKChucCA9IG9mX2dldF9uZXh0X2NoaWxkKGkycywgbnApKSAhPSBOVUxMKSB7CisJICAgICAgIGlmIChzdHJjbXAobnAtPm5hbWUsICJsaWdodHNob3ciKSA9PSAwKQorCQkgICAgICAgYnJlYWs7CisJICAgICAgIGlmICgoc3RyY21wKG5wLT5uYW1lLCAic291bmQiKSA9PSAwKSAmJgorCQkgICBnZXRfcHJvcGVydHkobnAsICJ2aXJ0dWFsIiwgTlVMTCkgIT0gTlVMTCkKKwkJICAgICAgIGJyZWFrOworCX0KKwlpZiAobnAgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiICBsaWdodHNob3cgb3Igc291bmQrdmlydHVhbCBjaGlsZCBub3QgZm91bmRcbiIpOworCQlnb3RvIGJhaWw7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIG91ciBpbnN0YW5jZSBkYXRhICovCisJcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFja21ldGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWNrbWV0ZXI6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBiYWlsX3JlbGVhc2U7CisJfQorCXJtLT5tZGV2ID0gbWRldjsKKwlybS0+aTJzID0gaTJzOworCW11dGV4X2luaXQoJnJtLT5zZW0pOworCWRldl9zZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2LCBybSk7CisJLyogQ2hlY2sgcmVzb3VyY2VzIGF2YWlsYWJpbGl0eS4gV2UgbmVlZCBhdCBsZWFzdCByZXNvdXJjZSAwIGFuZCAxICovCisjaWYgMCAvKiBVc2UgdGhhdCB3aGVuIGkycy1hIGlzIGZpbmFsbHkgYW4gbWRldiBwZXItc2UgKi8KKwlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgPCAyIHx8IG1hY2lvX2lycV9jb3VudChtZGV2KSA8IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmFja21ldGVyOiBmb3VuZCBtYXRjaCBidXQgbGFja3MgcmVzb3VyY2VzOiAlcyIKKwkJICAgICAgICIgKCVkIHJlc291cmNlcywgJWQgaW50ZXJydXB0cylcbiIsCisJCSAgICAgICBtZGV2LT5vZmRldi5ub2RlLT5mdWxsX25hbWUpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBiYWlsX2ZyZWU7CisJfQorCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlcyhtZGV2LCAicmFja21ldGVyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmFja21ldGVyOiBmYWlsZWQgdG8gcmVxdWVzdCByZXNvdXJjZXM6ICVzXG4iLAorCQkgICAgICAgbWRldi0+b2ZkZXYubm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gYmFpbF9mcmVlOworCX0KKwlybS0+aXJxID0gbWFjaW9faXJxKG1kZXYsIDEpOworI2Vsc2UKKwlybS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaTJzLCAxKTsKKwlpZiAocm0tPmlycSA9PSBOT19JUlEgfHwKKwkgICAgb2ZfYWRkcmVzc190b19yZXNvdXJjZShpMnMsIDAsICZyaTJzKSB8fAorCSAgICBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGkycywgMSwgJnJkbWEpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInJhY2ttZXRlcjogZm91bmQgbWF0Y2ggYnV0IGxhY2tzIHJlc291cmNlczogJXMiLAorCQkgICAgICAgbWRldi0+b2ZkZXYubm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gYmFpbF9mcmVlOworCX0KKyNlbmRpZgorCisJcHJfZGVidWcoIiAgaTJzIEAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpcmkycy5zdGFydCk7CisJcHJfZGVidWcoIiAgZG1hIEAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpcmRtYS5zdGFydCk7CisJcHJfZGVidWcoIiAgaXJxICVkXG4iLCBybS0+aXJxKTsKKworCXJtLT51YnVmID0gKHU4ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChybS0+dWJ1ZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInJhY2ttZXRlcjogZmFpbGVkIHRvIGFsbG9jYXRlIHNhbXBsZXMgcGFnZSAhXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGJhaWxfcmVsZWFzZTsKKwl9CisKKwlybS0+ZG1hX2J1Zl92ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZtYWNpb19nZXRfcGNpX2RldihtZGV2KS0+ZGV2LAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEpLAorCQkJCQkgICAmcm0tPmRtYV9idWZfcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJtLT5kbWFfYnVmX3YgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJyYWNrbWV0ZXI6IGZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyICFcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gYmFpbF9mcmVlX3NhbXBsZXM7CisJfQorI2lmIDAKKwlybS0+aTJzX3JlZ3MgPSBpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApLCAweDEwMDApOworI2Vsc2UKKwlybS0+aTJzX3JlZ3MgPSBpb3JlbWFwKHJpMnMuc3RhcnQsIDB4MTAwMCk7CisjZW5kaWYKKwlpZiAocm0tPmkyc19yZWdzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmFja21ldGVyOiBmYWlsZWQgdG8gbWFwIGkycyByZWdpc3RlcnMgIVxuIik7CisJCXJjID0gLUVOWElPOworCQlnb3RvIGJhaWxfZnJlZV9kbWE7CisJfQorI2lmIDAKKwlybS0+ZG1hX3JlZ3MgPSBpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDEpLCAweDEwMCk7CisjZWxzZQorCXJtLT5kbWFfcmVncyA9IGlvcmVtYXAocmRtYS5zdGFydCwgMHgxMDApOworI2VuZGlmCisJaWYgKHJtLT5kbWFfcmVncyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInJhY2ttZXRlcjogZmFpbGVkIHRvIG1hcCBkbWEgcmVnaXN0ZXJzICFcbiIpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBiYWlsX3VubWFwX2kyczsKKwl9CisKKwlyYyA9IHJhY2ttZXRlcl9zZXR1cChybSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInJhY2ttZXRlcjogZmFpbGVkIHRvIGluaXRpYWxpemUgIVxuIik7CisJCXJjID0gLUVOWElPOworCQlnb3RvIGJhaWxfdW5tYXBfZG1hOworCX0KKworCXJjID0gcmVxdWVzdF9pcnEocm0tPmlycSwgcmFja21ldGVyX2lycSwgMCwgInJhY2ttZXRlciIsIHJtKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJyYWNrbWV0ZXI6IGZhaWxlZCB0byByZXF1ZXN0IGludGVycnVwdCAhXG4iKTsKKwkJZ290byBiYWlsX3N0b3BfZG1hOworCX0KKwlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIDA7CisKKyBiYWlsX3N0b3BfZG1hOgorCURCRE1BX0RPX1JFU0VUKHJtLT5kbWFfcmVncyk7CisgYmFpbF91bm1hcF9kbWE6CisJaW91bm1hcChybS0+ZG1hX3JlZ3MpOworIGJhaWxfdW5tYXBfaTJzOgorCWlvdW5tYXAocm0tPmkyc19yZWdzKTsKKyBiYWlsX2ZyZWVfZG1hOgorCWRtYV9mcmVlX2NvaGVyZW50KCZtYWNpb19nZXRfcGNpX2RldihtZGV2KS0+ZGV2LAorCQkJICBzaXplb2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEpLAorCQkJICBybS0+ZG1hX2J1Zl92LCBybS0+ZG1hX2J1Zl9wKTsKKyBiYWlsX2ZyZWVfc2FtcGxlczoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcm0tPnVidWYpOworIGJhaWxfcmVsZWFzZToKKyNpZiAwCisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisjZW5kaWYKKyBiYWlsX2ZyZWU6CisJa2ZyZWUocm0pOworIGJhaWw6CisJb2Zfbm9kZV9wdXQoaTJzKTsKKwlvZl9ub2RlX3B1dChucCk7CisJZGV2X3NldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYsIE5VTEwpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcmFja21ldGVyX3JlbW92ZShzdHJ1Y3QgbWFjaW9fZGV2KiBtZGV2KQoreworCXN0cnVjdCByYWNrbWV0ZXIgKnJtID0gZGV2X2dldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYpOworCisJLyogU3RvcCBDUFUgc25pZmZlciB0aW1lciAmIHdvcmsgcXVldWVzICovCisJcmFja21ldGVyX3N0b3BfY3B1X3NuaWZmZXIocm0pOworCisJLyogQ2xlYXIgcmVmZXJlbmNlIHRvIHByaXZhdGUgZGF0YSAqLworCWRldl9zZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2LCBOVUxMKTsKKworCS8qIFN0b3AvcmVzZXQgZGJkbWEgKi8KKwlEQkRNQV9ET19SRVNFVChybS0+ZG1hX3JlZ3MpOworCisJLyogUmVsZWFzZSB0aGUgSVJRICovCisJZnJlZV9pcnEocm0tPmlycSwgcm0pOworCisJLyogVW5tYXAgcmVnaXN0ZXJzICovCisJaW91bm1hcChybS0+ZG1hX3JlZ3MpOworCWlvdW5tYXAocm0tPmkyc19yZWdzKTsKKworCS8qIEZyZWUgRE1BICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJm1hY2lvX2dldF9wY2lfZGV2KG1kZXYpLT5kZXYsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSksCisJCQkgIHJtLT5kbWFfYnVmX3YsIHJtLT5kbWFfYnVmX3ApOworCisJLyogRnJlZSBzYW1wbGVzICovCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXJtLT51YnVmKTsKKworI2lmIDAKKwkvKiBSZWxlYXNlIHJlc291cmNlcyAqLworCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2VzKG1kZXYpOworI2VuZGlmCisKKwkvKiBHZXQgcmlkIG9mIG1lICovCisJa2ZyZWUocm0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFja21ldGVyX3NodXRkb3duKHN0cnVjdCBtYWNpb19kZXYqIG1kZXYpCit7CisJc3RydWN0IHJhY2ttZXRlciAqcm0gPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisKKwlpZiAocm0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBTdG9wIENQVSBzbmlmZmVyIHRpbWVyICYgd29yayBxdWV1ZXMgKi8KKwlyYWNrbWV0ZXJfc3RvcF9jcHVfc25pZmZlcihybSk7CisKKwkvKiBTdG9wL3Jlc2V0IGRiZG1hICovCisJREJETUFfRE9fUkVTRVQocm0tPmRtYV9yZWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCByYWNrbWV0ZXJfbWF0Y2hbXSA9IHsKKwl7IC5uYW1lID0gImkycyIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIHJhY2ttZXRlcl9kcnYgPSB7CisJLm5hbWUgPSAicmFja21ldGVyIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubWF0Y2hfdGFibGUgPSByYWNrbWV0ZXJfbWF0Y2gsCisJLnByb2JlID0gcmFja21ldGVyX3Byb2JlLAorCS5yZW1vdmUgPSByYWNrbWV0ZXJfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHJhY2ttZXRlcl9zaHV0ZG93biwKK307CisKKworc3RhdGljIGludCBfX2luaXQgcmFja21ldGVyX2luaXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygicmFja21ldGVyX2luaXQoKVxuIik7CisKKwlyZXR1cm4gbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZyYWNrbWV0ZXJfZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhY2ttZXRlcl9leGl0KHZvaWQpCit7CisJcHJfZGVidWcoInJhY2ttZXRlcl9leGl0KClcbiIpOworCisJbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnJhY2ttZXRlcl9kcnYpOworfQorCittb2R1bGVfaW5pdChyYWNrbWV0ZXJfaW5pdCk7Cittb2R1bGVfZXhpdChyYWNrbWV0ZXJfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSYWNrTWV0ZXI6IFN1cHBvcnQgdnUtbWV0ZXIgb24gWFNlcnZlIGZyb250IHBhbmVsIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9zbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCmluZGV4IGFkZTI1YjMuLjRmNzI0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAKICNkZWZpbmUgVkVSU0lPTiAiMC43IgogI2RlZmluZSBBVVRIT1IgICIoYykgMjAwNSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4iCkBAIC02NTMsNyArNjU0LDcgQEAKIAkgKiBJJ20gYSBiaXQgdG9vIGZhciBmcm9tIGZpZ3VyaW5nIG91dCBob3cgdGhhdCB3b3JrcyB3aXRoIHRob3NlCiAJICogbmV3IGNoaXBzZXRzLCBidXQgdGhhdCB3aWxsIGNvbWUgYmFjayBhbmQgYml0ZSB1cwogCSAqLwotCW9mX3JlZ2lzdGVyX2RyaXZlcigmc211X29mX3BsYXRmb3JtX2RyaXZlcik7CisJb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZzbXVfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCmluZGV4IGEwZjMwZDAuLjEzYjk1M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjdW5kZWYgREVCVUcKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCmluZGV4IGQwMGMwYzMuLjJlNGFkNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKQEAgLTEyOSw2ICsxMjksNyBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgInRoZXJtX3BtNzIuaCIKIApAQCAtMjIzNiwxNCArMjIzNywxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlvZl9yZWdpc3Rlcl9kcml2ZXIoJmZjdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOworCW9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZmN1X29mX3BsYXRmb3JtX2RyaXZlcik7CiAJCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0aGVybV9wbTcyX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZmN1X29mX3BsYXRmb3JtX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZjdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOwogCiAJaWYgKG9mX2RldikKIAkJb2ZfZGV2aWNlX3VucmVnaXN0ZXIob2ZfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYwppbmRleCA3MzhmYWFiLi5hMWQzYTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCkBAIC0zNiwxMiArMzYsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2lvLmg+CiAKICNkZWZpbmUgTE9HX1RFTVAJCTAJCQkvKiBjb250aW5vdXNseSBsb2cgdGVtcGVyYXR1cmUgKi8KQEAgLTUxMSwxNCArNTEyLDE0IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW9mX3JlZ2lzdGVyX2RyaXZlciggJnRoZXJtX29mX2RyaXZlciApOworCW9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlciggJnRoZXJtX29mX2RyaXZlciApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKIGc0ZmFuX2V4aXQoIHZvaWQgKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCAmdGhlcm1fb2ZfZHJpdmVyICk7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoICZ0aGVybV9vZl9kcml2ZXIgKTsKIAogCWlmKCB4Lm9mX2RldiApCiAJCW9mX2RldmljZV91bnJlZ2lzdGVyKCB4Lm9mX2RldiApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCmluZGV4IGZmN2Q0ZjU2Li44YTdkZDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlICJkbXhkZXYuaCIKICNpbmNsdWRlICJkdmJfZGVtdXguaCIKQEAgLTI3NSw4ICsyNzYsNyBAQAogCWludCBpOwogCiAJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKQotCQlpZiAoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKQotCQkJdXNiX2ZyZWVfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7CisJCXVzYl9mcmVlX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOwogCiAJdXNiX2J1ZmZlcl9mcmVlKGNpbmVyZ3l0Mi0+dWRldiwgU1RSRUFNX1VSQl9DT1VOVCpTVFJFQU1fQlVGX1NJWkUsCiAJCQkgICAgY2luZXJneXQyLT5zdHJlYW1idWYsIGNpbmVyZ3l0Mi0+c3RyZWFtYnVmX2RtYWhhbmRsZSk7CkBAIC0zMjAsOCArMzIwLDcgQEAKIAljaW5lcmd5dDJfY29udHJvbF9zdHJlYW1fdHJhbnNmZXIoY2luZXJneXQyLCAwKTsKIAogCWZvciAoaT0wOyBpPFNUUkVBTV9VUkJfQ09VTlQ7IGkrKykKLQkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSkKLQkJCXVzYl9raWxsX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOworCQl1c2Jfa2lsbF91cmIoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKTsKIH0KIAogc3RhdGljIGludCBjaW5lcmd5dDJfc3RhcnRfc3RyZWFtX3hmZXIgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggNTMzMDRlNi4uYTJhYjJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCiBzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfc3d6aWd6YWcoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0JZmVfc3RhdHVzX3QgczsKKwlmZV9zdGF0dXNfdCBzID0gMDsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCiAJLyogaWYgd2UndmUgZ290IG5vIHBhcmFtZXRlcnMsIGp1c3Qga2VlcCBpZGxpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDg2LmMKaW5kZXggNzQ1NmIwYi4uNGMyN2EyZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5jCkBAIC00NDEsNiArNDQxLDEwIEBACiAKIAlkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKKwkvLyBjaGVjayBmb3IgaW52YWxpZCBzeW1ib2wgcmF0ZQorCWlmIChmZV9wYXJhbXMtPnUucXBzay5zeW1ib2xfcmF0ZSA8IDUwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvLyBjYWxjdWxhdGUgdGhlIHVwZGF0ZWQgZnJlcXVlbmN5IChub3RlOiB3ZSBjb252ZXJ0IGZyb20gSHotPmtIeikKIAl0bXA2NCA9IHRkYTEwMDg2X3JlYWRfYnl0ZShzdGF0ZSwgMHg1Mik7CiAJdG1wNjQgfD0gKHRkYTEwMDg2X3JlYWRfYnl0ZShzdGF0ZSwgMHg1MSkgPDwgOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCmluZGV4IGZjMTI2N2IuLjlhMTU1MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCkBAIC01MDAsMTQgKzUwMCwxNCBAQAogCiAvKiAgICAgIE5ldyBkZXNpZ24gKEJ5IEVtYXJkKQogKiogICAgICB0aGlzIHJwczEgY29kZSB3aWxsIGNvcHkgaW50ZXJuYWwgSFMgZXZlbnQgdG8gR1BJTzMgcGluLgotKiogICAgICBHUElPMyBpcyBpbiBidWRnZXQtcGF0Y2ggaGFyZHdhcmUgY29ubmVjdGQgdG8gcG9ydCBCIFZTWU5DCisqKiAgICAgIEdQSU8zIGlzIGluIGJ1ZGdldC1wYXRjaCBoYXJkd2FyZSBjb25uZWN0ZWQgdG8gcG9ydCBCIFZTWU5DCiAKICoqICAgICAgSFMgaXMgYW4gaW50ZXJuYWwgZXZlbnQgb2YgNzE0NiwgYWNjZXNzaWJsZSB3aXRoIFJQUwogKiogICAgICBhbmQgdGVtcG9yYXJpbHkgcmFpc2VkIGhpZ2ggZXZlcnkgbiBsaW5lcwogKiogICAgICAobiBpbiBkZWZpbmVkIGluIHRoZSBSUFNfVEhSRVNIMSBjb3VudGVyIHRocmVzaG9sZCkKICoqICAgICAgSSB0aGluayBIUyBpcyByYWlzZWQgaGlnaCBvbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuLXRoIGxpbmUKICoqICAgICAgYW5kIHJlbWFpbnMgaGlnaCB1bnRpbCB0aGlzIG4tdGggbGluZSB0aGF0IHRyaWdnZXJlZAotKiogICAgICBpdCBpcyBjb21wbGV0ZWx5IHJlY2VpdmVkLiBXaGVuIHRoZSByZWNlaXB0aW9uIG9mIG4tdGggbGluZQorKiogICAgICBpdCBpcyBjb21wbGV0ZWx5IHJlY2VpdmVkLiBXaGVuIHRoZSByZWNlcHRpb24gb2Ygbi10aCBsaW5lCiAqKiAgICAgIGVuZHMsIEhTIGlzIGxvd2VyZWQuCiAKICoqICAgICAgVG8gdHJhbnNtaXQgZGF0YSBvdmVyIERNQSwgNzE0NiBuZWVkcyBjaGFuZ2luZyBzdGF0ZSBhdApAQCAtNTQxLDcgKzU0MSw3IEBACiAqKiAgICAgIGhhcmR3YXJlIGRlYnVnIG5vdGU6IGEgd29ya2luZyBidWRnZXQgY2FyZCAoaW5jbHVkaW5nIGJ1ZGdldCBwYXRjaCkKICoqICAgICAgd2l0aCB2cGVpcnEoKSBpbnRlcnJ1cHQgc2V0dXAgaW4gbW9kZSAiMHg5MCIgKGV2ZXJ5IDY0Sykgd2lsbAogKiogICAgICBnZW5lcmF0ZSAzIGludGVycnVwdHMgcGVyIDI1LUh6IERNQSBmcmFtZSBvZiAyKjE4OCo1MTIgYnl0ZXMKLSoqICAgICAgYW5kIHRoYXQgbWVhbnMgMyoyNT03NSBIeiBvZiBpbnRlcnJ1cHQgZnJlcWVuY3ksIGFzIHNlZW4gYnkKKyoqICAgICAgYW5kIHRoYXQgbWVhbnMgMyoyNT03NSBIeiBvZiBpbnRlcnJ1cHQgZnJlcXVlbmN5LCBhcyBzZWVuIGJ5CiAqKiAgICAgIHdhdGNoIGNhdCAvcHJvYy9pbnRlcnJ1cHRzCiAqKgogKiogICAgICBJZiB0aGlzIGZyZXF1ZW5jeSBpcyAzeCBsb3dlciAoYW5kIGRhdGEgcmVjZWl2ZWQgaW4gdGhlIERNQQpAQCAtNTUwLDcgKzU1MCw3IEBACiAqKiAgICAgIHRoaXMgbWVhbnMgVlNZTkMgbGluZSBpcyBub3QgY29ubmVjdGVkIGluIHRoZSBoYXJkd2FyZS4KICoqICAgICAgKGNoZWNrIHNvbGRlcmluZyBwY2IgYW5kIHBpbnMpCiAqKiAgICAgIFRoZSBzYW1lIGJlaGF2aW91ciBvZiBtaXNzaW5nIFZTWU5DIGNhbiBiZSBkdXBsaWNhdGVkIG9uIGJ1ZGdldAotKiogICAgICBjYXJkcywgYnkgc2V0aW5nIEREMV9JTklUIHRyaWdnZXIgbW9kZSA3IGluIDNyZCBuaWJibGUuCisqKiAgICAgIGNhcmRzLCBieSBzZXR0aW5nIEREMV9JTklUIHRyaWdnZXIgbW9kZSA3IGluIDNyZCBuaWJibGUuCiAqLwogCiAJLy8gU2V0dXAgUlBTMSAicHJvZ3JhbSIgKHAzNSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKaW5kZXggZTU4ZjAzOS4uNTZmMWM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKQEAgLTQ2LDYgKzQ2LDEwIEBACiAjaW5jbHVkZSAibG5icDIxLmgiCiAjaW5jbHVkZSAiYnNydTYuaCIKIAorc3RhdGljIGludCBkaXNlcWNfbWV0aG9kOworbW9kdWxlX3BhcmFtKGRpc2VxY19tZXRob2QsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2VxY19tZXRob2QsICJTZWxlY3QgRGlTRXFDIG1ldGhvZCBmb3Igc3Vic3lzdGVtIGlkIDEzYzI6MTAwMywgMDogZGVmYXVsdCwgMTogbW9yZSByZWxpYWJsZSAoZm9yIG5ld2VyIHJldmlzaW9ucyBvbmx5KSIpOworCiBzdGF0aWMgdm9pZCBTZXQyMksgKHN0cnVjdCBidWRnZXQgKmJ1ZGdldCwgaW50IHN0YXRlKQogewogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2PWJ1ZGdldC0+ZGV2OwpAQCAtMzgyLDYgKzM4NiwxMSBAQAogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKIAkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnU2X3R1bmVyX3NldF9wYXJhbXM7CiAJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+dHVuZXJfcHJpdiA9ICZidWRnZXQtPmkyY19hZGFwOworCQkJaWYgKGJ1ZGdldC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgxMDAzICYmIGRpc2VxY19tZXRob2QgPT0gMCkgeworCQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOworCQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCmluZGV4IGExYzlmYTkuLjgxMzVmM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKQEAgLTExMzUsOCArMTEzNSw3IEBACiAJZHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSVNPX0JVRl9DT1VOVDsgaSsrKQotCQlpZiAoZGVjLT5pc29fdXJiW2ldKQotCQkJdXNiX2ZyZWVfdXJiKGRlYy0+aXNvX3VyYltpXSk7CisJCXVzYl9mcmVlX3VyYihkZWMtPmlzb191cmJbaV0pOwogCiAJcGNpX2ZyZWVfY29uc2lzdGVudChOVUxMLAogCQkJICAgIElTT19GUkFNRV9TSVpFICogKEZSQU1FU19QRVJfSVNPX0JVRiAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKaW5kZXggYmYyNjc1NS4uYjhmZGU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpAQCAtMjQsNyArMjQsNyBAQAogCSAgZGVjb2RlIGF1ZGlvL3ZpZGVvIHN0YW5kYXJkcy4gVGhpcyBvcHRpb24gd2lsbCBhdXRvc2VsZWN0CiAJICBhbGwgcGVydGluZW50IG1vZHVsZXMgdG8gZWFjaCBzZWxlY3RlZCB2aWRlbyBtb2R1bGUuCiAKLQkgIFVuc2VsZWN0IHRoaXMgb25seSBpZiB5b3Uga25vdyBleGFjbHR5IHdoYXQgeW91IGFyZSBkb2luZywgc2luY2UKKwkgIFVuc2VsZWN0IHRoaXMgb25seSBpZiB5b3Uga25vdyBleGFjdGx5IHdoYXQgeW91IGFyZSBkb2luZywgc2luY2UKIAkgIGl0IG1heSBicmVhayBzdXBwb3J0IG9uIHNvbWUgYm9hcmRzLgogCiAJICBJbiBkb3VidCwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCmluZGV4IGY3ODZhYjEuLjg2ZTM1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCkBAIC0xMTgyLDggKzExODIsNiBAQAogCXZpZGVvX3NldF9kcnZkYXRhKGNhbS0+djRsZGV2LCBOVUxMKTsKIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnY0bGRldik7CiAKLQl1c2JfcHV0X2RldihjYW0tPnVzYmRldik7Ci0KIAltdXRleF91bmxvY2soJmV0NjF4MjUxX3N5c2ZzX2xvY2spOwogCiAJa2ZyZWUoY2FtLT5jb250cm9sX2J1ZmZlcik7CkBAIC0xMjc1LDYgKzEyNzMsNyBAQAogCiAJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7CiAJCWV0NjF4MjUxX3JlbGVhc2VfcmVzb3VyY2VzKGNhbSk7CisJCXVzYl9wdXRfZGV2KGNhbS0+dXNiZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7CiAJCWtmcmVlKGNhbSk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwppbmRleCBmOTIwZTBjLi4xZjc4NzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwpAQCAtMTk1Myw4ICsxOTUzLDggQEAKIAlyZXR1cm4gaGR3OwogIGZhaWw6CiAJaWYgKGhkdykgewotCQlpZiAoaGR3LT5jdGxfcmVhZF91cmIpIHVzYl9mcmVlX3VyYihoZHctPmN0bF9yZWFkX3VyYik7Ci0JCWlmIChoZHctPmN0bF93cml0ZV91cmIpIHVzYl9mcmVlX3VyYihoZHctPmN0bF93cml0ZV91cmIpOworCQl1c2JfZnJlZV91cmIoaGR3LT5jdGxfcmVhZF91cmIpOworCQl1c2JfZnJlZV91cmIoaGR3LT5jdGxfd3JpdGVfdXJiKTsKIAkJaWYgKGhkdy0+Y3RsX3JlYWRfYnVmZmVyKSBrZnJlZShoZHctPmN0bF9yZWFkX2J1ZmZlcik7CiAJCWlmIChoZHctPmN0bF93cml0ZV9idWZmZXIpIGtmcmVlKGhkdy0+Y3RsX3dyaXRlX2J1ZmZlcik7CiAJCWlmIChoZHctPmNvbnRyb2xzKSBrZnJlZShoZHctPmNvbnRyb2xzKTsKQEAgLTI1NzUsMTIgKzI1NzUsMTAgQEAKIAlzdHJ1Y3QgcHZyMl9oZHcgKmhkdyA9IChzdHJ1Y3QgcHZyMl9oZHcgKilkYXRhOwogCWlmIChoZHctPmN0bF93cml0ZV9wZW5kX2ZsYWcgfHwgaGR3LT5jdGxfcmVhZF9wZW5kX2ZsYWcpIHsKIAkJaGR3LT5jdGxfdGltZW91dF9mbGFnID0gITA7Ci0JCWlmIChoZHctPmN0bF93cml0ZV9wZW5kX2ZsYWcgJiYgaGR3LT5jdGxfd3JpdGVfdXJiKSB7CisJCWlmIChoZHctPmN0bF93cml0ZV9wZW5kX2ZsYWcpCiAJCQl1c2JfdW5saW5rX3VyYihoZHctPmN0bF93cml0ZV91cmIpOwotCQl9Ci0JCWlmIChoZHctPmN0bF9yZWFkX3BlbmRfZmxhZyAmJiBoZHctPmN0bF9yZWFkX3VyYikgeworCQlpZiAoaGR3LT5jdGxfcmVhZF9wZW5kX2ZsYWcpCiAJCQl1c2JfdW5saW5rX3VyYihoZHctPmN0bF9yZWFkX3VyYik7Ci0JCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pby5jCmluZGV4IDcwYWE2M2UuLjU3ZmIzMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaW8uYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJcHZyMl9idWZmZXJfc2V0X25vbmUoYnApOwogCWJwLT5zaWduYXR1cmUgPSAwOwogCWJwLT5zdHJlYW0gPSBOVUxMOwotCWlmIChicC0+cHVyYikgdXNiX2ZyZWVfdXJiKGJwLT5wdXJiKTsKKwl1c2JfZnJlZV91cmIoYnAtPnB1cmIpOwogCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9CVUZfUE9PTCwiLyotLS1UUkFDRV9GTE9XLS0tKi8iCiAJCSAgICIgYnVmZmVyRG9uZSAgICAgJXAiLGJwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMKaW5kZXggNDZjMTE0OC4uYTk5NmFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMKQEAgLTg2NiwxMSArODY2LDkgQEAKIAl9CiAJaWYgKHJldCkgewogCQkvKiBEZS1hbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyICovCi0JCXdoaWxlIChpID49IDApIHsKLQkJCWlmIChwZGV2LT5zYnVmW2ldLnVyYiAhPSBOVUxMKQotCQkJCXVzYl9mcmVlX3VyYihwZGV2LT5zYnVmW2ldLnVyYik7CisJCXdoaWxlIChpLS0pIHsKKwkJCXVzYl9mcmVlX3VyYihwZGV2LT5zYnVmW2ldLnVyYik7CiAJCQlwZGV2LT5zYnVmW2ldLnVyYiA9IE5VTEw7Ci0JCQlpLS07CiAJCX0KIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMDk1LDggKzEwOTMsNyBAQAogCVBXQ19ERUJVR19PUEVOKCI+PiB2aWRlb19vcGVuIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OwotCWlmIChwZGV2ID09IE5VTEwpCi0JCUJVRygpOworCUJVR19PTighcGRldik7CiAJaWYgKHBkZXYtPnZvcGVuKSB7CiAJCVBXQ19ERUJVR19PUEVOKCJJJ20gYnVzeSwgc29tZW9uZSBpcyB1c2luZyB0aGUgZGV2aWNlLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTY1ODguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCmluZGV4IGE4MTI4NWMuLjdiOTg1OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCkBAIC0yMTIsOCArMjEyLDEwIEBACiAJaWYgKHJkX2Jsb2NrcyA+IHMtPmJsb2NrX2NvdW50KQogCQlyZF9ibG9ja3MgPSBzLT5ibG9ja19jb3VudDsKIAotCWlmICghcmRfYmxvY2tzKQorCWlmICghcmRfYmxvY2tzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCByZF9ibG9ja3M7IGkrKykgewogCQlpZiAoYmxvY2tfdG9fdXNlcl9idWYocywgYnVmX3B0cikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggYzU3MTlmNy4uZjI4Mzk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTE0NjQsOCArMTQ2NCw2IEBACiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9zYWE3MTF4OwogCXNucHJpbnRmKGNsaWVudC0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkgLSAxLCAic2FhNzExNSIpOwogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGV0ZWN0aW5nIHNhYTcxMTUgY2xpZW50IG9uIGFkZHJlc3MgMHgleFxuIiwgYWRkcmVzcyA8PCAxKTsKLQogCWZvciAoaT0wO2k8MHgwZjtpKyspIHsKIAkJc2FhNzExeF93cml0ZShjbGllbnQsIDAsIGkpOwogCQluYW1lW2ldID0gKHNhYTcxMXhfcmVhZChjbGllbnQsIDApICYweDBmKSArJzAnOwpAQCAtMTQ3Nyw2ICsxNDc1LDEzIEBACiAJc2FhNzExeF93cml0ZShjbGllbnQsIDAsIDUpOwogCWNoaXBfaWQgPSBzYWE3MTF4X3JlYWQoY2xpZW50LCAwKSAmIDB4MGY7CiAKKwkvKiBDaGVjayB3aGV0aGVyIHRoaXMgY2hpcCBpcyBwYXJ0IG9mIHRoZSBzYWE3MTF4IHNlcmllcyAqLworCWlmIChtZW1jbXAobmFtZSwgIjFmNzExIiwgNSkpIHsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JXggKElEICVzKSBkb2VzIG5vdCBtYXRjaCBhIGtub3duIHNhYTcxMXggY2hpcC5cbiIsCisJCQlhZGRyZXNzIDw8IDEsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpIC0gMSwgInNhYTcxMSVkIixjaGlwX2lkKTsKIAl2NGxfaW5mbyhjbGllbnQsICJzYWE3MTElZCBmb3VuZCAoJXMpIEAgMHgleCAoJXMpXG4iLCBjaGlwX2lkLCBuYW1lLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKaW5kZXggYTQ3MDJkMy4uMTg0NThkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwpAQCAtNzc1LDcgKzc3NSw3IEBACiAJcmV0dXJuIDA7CiAKIGZyZWVfdXJiczoKLQlmb3IgKGkgPSAwOyAoaSA8IFNOOUMxMDJfVVJCUykgJiYgIGNhbS0+dXJiW2ldOyBpKyspCisJZm9yIChpID0gMDsgaSA8IFNOOUMxMDJfVVJCUzsgaSsrKQogCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbaV0pOwogCiBmcmVlX2J1ZmZlcnM6CkBAIC0xNDYyLDggKzE0NjIsNiBAQAogCXZpZGVvX3NldF9kcnZkYXRhKGNhbS0+djRsZGV2LCBOVUxMKTsKIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnY0bGRldik7CiAKLQl1c2JfcHV0X2RldihjYW0tPnVzYmRldik7Ci0KIAltdXRleF91bmxvY2soJnNuOWMxMDJfc3lzZnNfbG9jayk7CiAKIAlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKQEAgLTE1NTUsNiArMTU1Myw3IEBACiAKIAlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKIAkJc245YzEwMl9yZWxlYXNlX3Jlc291cmNlcyhjYW0pOworCQl1c2JfcHV0X2RldihjYW0tPnVzYmRldik7CiAJCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOwogCQlrZnJlZShjYW0pOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCmluZGV4IDlhMjZiOTQuLmJiZjJiZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYwpAQCAtMTkwLDggKzE5MCw3IEBACiAKIHN0YXRpYyB2b2lkIHFjbV9mcmVlX2ludChzdHJ1Y3QgcWNtICpjYW0pCiB7Ci0JaWYgKGNhbS0+YnV0dG9uX3VyYikKLQkJdXNiX2ZyZWVfdXJiKGNhbS0+YnV0dG9uX3VyYik7CisJdXNiX2ZyZWVfdXJiKGNhbS0+YnV0dG9uX3VyYik7CiB9CiAjZW5kaWYgLyogQ09ORklHX0lOUFVUICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCmluZGV4IDViNTU2MzQuLjUyZDBmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYwpAQCAtNDg5LDcgKzQ4OSw3IEBACiAJcmV0dXJuIDA7CiAKIGZyZWVfdXJiczoKLQlmb3IgKGkgPSAwOyAoaSA8IFpDMDMwMV9VUkJTKSAmJiAgY2FtLT51cmJbaV07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgWkMwMzAxX1VSQlM7IGkrKykKIAkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKIAogZnJlZV9idWZmZXJzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwppbmRleCBlNWM3MjcxLi4wNTFiN2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwpAQCAtNjE4NSw3ICs2MTg1LDcgQEAKIAkJIkFib3J0IiwJCQkJCS8qIDEyaCAqLwogCQkiSU8gTm90IFlldCBFeGVjdXRlZCIsCQkJCS8qIDEzaCAqLwogCQkiSU8gRXhlY3V0ZWQiLAkJCQkJLyogMTRoICovCi0JCSJQZXJzaXN0YW50IFJlc2VydmF0aW9uIE91dCBOb3QgQWZmaWxpYXRpb24gT3duZXIiLCAvKiAxNWggKi8KKwkJIlBlcnNpc3RlbnQgUmVzZXJ2YXRpb24gT3V0IE5vdCBBZmZpbGlhdGlvbiBPd25lciIsIC8qIDE1aCAqLwogCQkiT3BlbiBUcmFuc21pdCBETUEgQWJvcnQiLAkJCS8qIDE2aCAqLwogCQkiSU8gRGV2aWNlIE1pc3NpbmcgRGVsYXkgUmV0cnkiLAkJLyogMTdoICovCiAJCU5VTEwsCQkJCQkJLyogMThoICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwppbmRleCA2MmYxYWMwLi44Mjg3Zjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKQEAgLTMyMCw3ICszMjAsNiBAQAogCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKIAlpbnQgcmM7CiAJc3RydWN0IHBjaV9kZXYgKmk5NjAgPSBOVUxMOwotCWludCBlbmFibGVkID0gcGRldi0+aXNfZW5hYmxlZDsKIAogCXByaW50ayhLRVJOX0lORk8gImkybzogQ2hlY2tpbmcgZm9yIFBDSSBJMk8gY29udHJvbGxlcnMuLi5cbiIpOwogCkBAIC0zMzAsMTIgKzMyOSwxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoIWVuYWJsZWQpCi0JCWlmICgocmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogY291bGRuJ3QgZW5hYmxlIGRldmljZSAlc1xuIiwKLQkJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KKwlpZiAoKHJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogY291bGRuJ3QgZW5hYmxlIGRldmljZSAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIHJjOworCX0KIAogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IG5vIHN1aXRhYmxlIERNQSBmb3VuZCBmb3IgJXNcbiIsCkBAIC00NDIsOCArNDQwLDcgQEAKIAlpMm9faW9wX2ZyZWUoYyk7CiAKICAgICAgIGRpc2FibGU6Ci0JaWYgKCFlbmFibGVkKQotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL0tjb25maWcKaW5kZXggZWE0MTg1Mi4uZjRmOGNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9LY29uZmlnCkBAIC00MCw3ICs0MCw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgTU1DX1BYQQotCXRyaXN0YXRlICJJbnRlbCBQWEEyNTUgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBzdXBwb3J0IgorCXRyaXN0YXRlICJJbnRlbCBQWEEyNXgvMjZ4LzI3eCBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUkNIX1BYQSAmJiBNTUMKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgdGhlIEludGVsKFIpIFBYQShSKSBNdWx0aW1lZGlhIGNhcmQgSW50ZXJmYWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvYXQ5MV9tY2kuYyBiL2RyaXZlcnMvbW1jL2F0OTFfbWNpLmMKaW5kZXggNDk0YjIzZi4uNjQ5NWNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvYXQ5MV9tY2kuYworKysgYi9kcml2ZXJzL21tYy9hdDkxX21jaS5jCkBAIC03OTMsNyArNzkzLDcgQEAKIAlyZXR1cm4gcmVhZF9vbmx5OwogfQogCi1zdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBhdDkxX21jaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBhdDkxX21jaV9vcHMgPSB7CiAJLnJlcXVlc3QJPSBhdDkxX21jaV9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gYXQ5MV9tY2lfc2V0X2lvcywKIAkuZ2V0X3JvCQk9IGF0OTFfbWNpX2dldF9ybywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2F1MXhtbWMuYyBiL2RyaXZlcnMvbW1jL2F1MXhtbWMuYwppbmRleCA1M2ZmY2JiLi40NDdmYmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9hdTF4bW1jLmMKKysrIGIvZHJpdmVycy9tbWMvYXUxeG1tYy5jCkBAIC04NzUsNyArODc1LDcgQEAKIAlob3N0LT5yeF9jaGFuID0gcnhjaGFuOwogfQogCi1zdHJ1Y3QgbW1jX2hvc3Rfb3BzIGF1MXhtbWNfb3BzID0geworc3RydWN0IGNvbnN0IG1tY19ob3N0X29wcyBhdTF4bW1jX29wcyA9IHsKIAkucmVxdWVzdAk9IGF1MXhtbWNfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IGF1MXhtbWNfc2V0X2lvcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9pbXhtbWMuYyBiL2RyaXZlcnMvbW1jL2lteG1tYy5jCmluZGV4IDY1OWQ0YTguLjA2ZTdmY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2lteG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2lteG1tYy5jCkBAIC04NzcsNyArODc3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGlteG1jaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBpbXhtY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gaW14bWNpX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBpbXhtY2lfc2V0X2lvcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWMuYyBiL2RyaXZlcnMvbW1jL21tYy5jCmluZGV4IDc2NmJjNTQ0Li45ZDE5MDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWMuYworKysgYi9kcml2ZXJzL21tYy9tbWMuYwpAQCAtNCw2ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiAgU0Qgc3VwcG9ydCBDb3B5cmlnaHQgKEMpIDIwMDQgSWFuIE1vbHRvbiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqICBTRCBzdXBwb3J0IENvcHlyaWdodCAoQykgMjAwNSBQaWVycmUgT3NzbWFuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogIE1NQ3Y0IHN1cHBvcnQgQ29weXJpZ2h0IChDKSAyMDA2IFBoaWxpcCBMYW5nZGFsZSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTM5NiwyMyArMzk3LDIzIEBACiAJCXJldHVybiBlcnI7CiAKIAkvKgotCSAqIERlZmF1bHQgYnVzIHdpZHRoIGlzIDEgYml0LgotCSAqLwotCWhvc3QtPmlvcy5idXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzE7Ci0KLQkvKgotCSAqIFdlIGNhbiBvbmx5IGNoYW5nZSB0aGUgYnVzIHdpZHRoIG9mIHRoZSBzZWxlY3RlZAotCSAqIGNhcmQgc28gdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHV0IHRoZSBoYW5kbGluZworCSAqIFdlIGNhbiBvbmx5IGNoYW5nZSB0aGUgYnVzIHdpZHRoIG9mIFNEIGNhcmRzIHdoZW4KKwkgKiB0aGV5IGFyZSBzZWxlY3RlZCBzbyB3ZSBoYXZlIHRvIHB1dCB0aGUgaGFuZGxpbmcKIAkgKiBoZXJlLgorCSAqCisJICogVGhlIGNhcmQgaXMgaW4gMSBiaXQgbW9kZSBieSBkZWZhdWx0IHNvCisJICogd2Ugb25seSBuZWVkIHRvIGNoYW5nZSBpZiBpdCBzdXBwb3J0cyB0aGUKKwkgKiB3aWRlciB2ZXJzaW9uLgogCSAqLwotCWlmIChob3N0LT5jYXBzICYgTU1DX0NBUF80X0JJVF9EQVRBKSB7CisJaWYgKG1tY19jYXJkX3NkKGNhcmQpICYmCisJCShjYXJkLT5zY3IuYnVzX3dpZHRocyAmIFNEX1NDUl9CVVNfV0lEVEhfNCkpIHsKKwogCQkvKgotCQkgKiBUaGUgY2FyZCBpcyBpbiAxIGJpdCBtb2RlIGJ5IGRlZmF1bHQgc28KLQkJICogd2Ugb25seSBuZWVkIHRvIGNoYW5nZSBpZiBpdCBzdXBwb3J0cyB0aGUKLQkJICogd2lkZXIgdmVyc2lvbi4KLQkJICovCi0JCWlmIChtbWNfY2FyZF9zZChjYXJkKSAmJgotCQkJKGNhcmQtPnNjci5idXNfd2lkdGhzICYgU0RfU0NSX0JVU19XSURUSF80KSkgeworCQkqIERlZmF1bHQgYnVzIHdpZHRoIGlzIDEgYml0LgorCQkqLworCQlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF8xOworCisJCWlmIChob3N0LT5jYXBzICYgTU1DX0NBUF80X0JJVF9EQVRBKSB7CiAJCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOwogCQkJY21kLm9wY29kZSA9IFNEX0FQUF9TRVRfQlVTX1dJRFRIOwogCQkJY21kLmFyZyA9IFNEX0JVU19XSURUSF80OwpAQCAtNDUzLDExICs0NTQsMTEgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG1tY19kZWxheSh1bnNpZ25lZCBpbnQgbXMpCiB7Ci0JaWYgKG1zIDwgSFogLyAxMDAwKSB7Ci0JCXlpZWxkKCk7CisJaWYgKG1zIDwgMTAwMCAvIEhaKSB7CisJCWNvbmRfcmVzY2hlZCgpOwogCQltZGVsYXkobXMpOwogCX0gZWxzZSB7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlIChtcyk7CisJCW1zbGVlcChtcyk7CiAJfQogfQogCkBAIC05NTMsNiArOTU0LDEzNyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgbW1jX3Byb2Nlc3NfZXh0X2NzZHMoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCWludCBlcnI7CisJc3RydWN0IG1tY19jYXJkICpjYXJkOworCisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCXN0cnVjdCBtbWNfZGF0YSBkYXRhOworCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJLyoKKwkgKiBBcyB0aGUgZXh0X2NzZCBpcyBzbyBsYXJnZSBhbmQgbW9zdGx5IHVudXNlZCwgd2UgZG9uJ3Qgc3RvcmUgdGhlCisJICogcmF3IGJsb2NrIGluIG1tY19jYXJkLgorCSAqLworCXU4ICpleHRfY3NkOworCWV4dF9jc2QgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFleHRfY3NkKSB7CisJCXByaW50aygiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBleHRfY3NkLiIKKwkJICAgICAgICJtbWMgdjQgY2FyZHMgd2lsbCBiZSB0cmVhdGVkIGFzIHYzLlxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0KSk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhcmQsICZob3N0LT5jYXJkcywgbm9kZSkgeworCQlpZiAoY2FyZC0+c3RhdGUgJiAoTU1DX1NUQVRFX0RFQUR8TU1DX1NUQVRFX1BSRVNFTlQpKQorCQkJY29udGludWU7CisJCWlmIChtbWNfY2FyZF9zZChjYXJkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2FyZC0+Y3NkLm1tY2FfdnNuIDwgQ1NEX1NQRUNfVkVSXzQpCisJCQljb250aW51ZTsKKworCQllcnIgPSBtbWNfc2VsZWN0X2NhcmQoaG9zdCwgY2FyZCk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2NvbW1hbmQpKTsKKworCQljbWQub3Bjb2RlID0gTU1DX1NFTkRfRVhUX0NTRDsKKwkJY21kLmFyZyA9IDA7CisJCWNtZC5mbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FEVEM7CisKKwkJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1tY19kYXRhKSk7CisKKwkJbW1jX3NldF9kYXRhX3RpbWVvdXQoJmRhdGEsIGNhcmQsIDApOworCisJCWRhdGEuYmxrc3ogPSA1MTI7CisJCWRhdGEuYmxvY2tzID0gMTsKKwkJZGF0YS5mbGFncyA9IE1NQ19EQVRBX1JFQUQ7CisJCWRhdGEuc2cgPSAmc2c7CisJCWRhdGEuc2dfbGVuID0gMTsKKworCQltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCisJCW1ycS5jbWQgPSAmY21kOworCQltcnEuZGF0YSA9ICZkYXRhOworCisJCXNnX2luaXRfb25lKCZzZywgZXh0X2NzZCwgNTEyKTsKKworCQltbWNfd2FpdF9mb3JfcmVxKGhvc3QsICZtcnEpOworCisJCWlmIChjbWQuZXJyb3IgIT0gTU1DX0VSUl9OT05FIHx8IGRhdGEuZXJyb3IgIT0gTU1DX0VSUl9OT05FKSB7CisJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChleHRfY3NkW0VYVF9DU0RfQ0FSRF9UWVBFXSkgeworCQljYXNlIEVYVF9DU0RfQ0FSRF9UWVBFXzUyIHwgRVhUX0NTRF9DQVJEX1RZUEVfMjY6CisJCQljYXJkLT5leHRfY3NkLmhzX21heF9kdHIgPSA1MjAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIEVYVF9DU0RfQ0FSRF9UWVBFXzI2OgorCQkJY2FyZC0+ZXh0X2NzZC5oc19tYXhfZHRyID0gMjYwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIE1NQyB2NCBzcGVjIHNheXMgdGhpcyBjYW5ub3QgaGFwcGVuICovCisJCQlwcmludGsoIiVzOiBjYXJkIGlzIG1tYyB2NCBidXQgZG9lc24ndCBzdXBwb3J0ICIKKwkJCSAgICAgICAiYW55IGhpZ2gtc3BlZWQgbW9kZXMuXG4iLAorCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisJCQltbWNfY2FyZF9zZXRfYmFkKGNhcmQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBBY3RpdmF0ZSBoaWdoc3BlZWQgc3VwcG9ydC4gKi8KKwkJY21kLm9wY29kZSA9IE1NQ19TV0lUQ0g7CisJCWNtZC5hcmcgPSAoTU1DX1NXSVRDSF9NT0RFX1dSSVRFX0JZVEUgPDwgMjQpIHwKKwkJCSAgKEVYVF9DU0RfSFNfVElNSU5HIDw8IDE2KSB8CisJCQkgICgxIDw8IDgpIHwKKwkJCSAgRVhUX0NTRF9DTURfU0VUX05PUk1BTDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMUIgfCBNTUNfQ01EX0FDOworCisJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgQ01EX1JFVFJJRVMpOworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkgeworCQkJcHJpbnRrKCIlczogZmFpbGVkIHRvIHN3aXRjaCBjYXJkIHRvIG1tYyB2NCAiCisJCQkgICAgICAgImhpZ2gtc3BlZWQgbW9kZS5cbiIsCisJCQkgICAgICAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbW1jX2NhcmRfc2V0X2hpZ2hzcGVlZChjYXJkKTsKKworCQkvKiBDaGVjayBmb3IgaG9zdCBzdXBwb3J0IGZvciB3aWRlLWJ1cyBtb2Rlcy4gKi8KKwkJaWYgKCEoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfNF9CSVRfREFUQSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQWN0aXZhdGUgNC1iaXQgc3VwcG9ydC4gKi8KKwkJY21kLm9wY29kZSA9IE1NQ19TV0lUQ0g7CisJCWNtZC5hcmcgPSAoTU1DX1NXSVRDSF9NT0RFX1dSSVRFX0JZVEUgPDwgMjQpIHwKKwkJCSAgKEVYVF9DU0RfQlVTX1dJRFRIIDw8IDE2KSB8CisJCQkgIChFWFRfQ1NEX0JVU19XSURUSF80IDw8IDgpIHwKKwkJCSAgRVhUX0NTRF9DTURfU0VUX05PUk1BTDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMUIgfCBNTUNfQ01EX0FDOworCisJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgQ01EX1JFVFJJRVMpOworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkgeworCQkJcHJpbnRrKCIlczogZmFpbGVkIHRvIHN3aXRjaCBjYXJkIHRvICIKKwkJCSAgICAgICAibW1jIHY0IDQtYml0IGJ1cyBtb2RlLlxuIiwKKwkJCSAgICAgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOworCQkJY29udGludWU7CisJCX0KKworCQlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF80OworCX0KKworCWtmcmVlKGV4dF9jc2QpOworCisJbW1jX2Rlc2VsZWN0X2NhcmRzKGhvc3QpOworfQorCiBzdGF0aWMgdm9pZCBtbWNfcmVhZF9zY3JzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKIAlpbnQgZXJyOwpAQCAtMTAyNSwxNCArMTE1NywxMzMgQEAKIAltbWNfZGVzZWxlY3RfY2FyZHMoaG9zdCk7CiB9CiAKK3N0YXRpYyB2b2lkIG1tY19yZWFkX3N3aXRjaF9jYXBzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxOworCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJc3RydWN0IG1tY19kYXRhIGRhdGE7CisJdW5zaWduZWQgY2hhciAqc3RhdHVzOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKworCXN0YXR1cyA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOworCWlmICghc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciAiCisJCQkicmVhZGluZyBzd2l0Y2ggY2FwYWJpbGl0aWVzLlxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0KSk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhcmQsICZob3N0LT5jYXJkcywgbm9kZSkgeworCQlpZiAoY2FyZC0+c3RhdGUgJiAoTU1DX1NUQVRFX0RFQUR8TU1DX1NUQVRFX1BSRVNFTlQpKQorCQkJY29udGludWU7CisJCWlmICghbW1jX2NhcmRfc2QoY2FyZCkpCisJCQljb250aW51ZTsKKwkJaWYgKGNhcmQtPnNjci5zZGFfdnNuIDwgU0NSX1NQRUNfVkVSXzEpCisJCQljb250aW51ZTsKKworCQllcnIgPSBtbWNfc2VsZWN0X2NhcmQoaG9zdCwgY2FyZCk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2NvbW1hbmQpKTsKKworCQljbWQub3Bjb2RlID0gU0RfU1dJVENIOworCQljbWQuYXJnID0gMHgwMEZGRkZGMTsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQURUQzsKKworCQltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2RhdGEpKTsKKworCQltbWNfc2V0X2RhdGFfdGltZW91dCgmZGF0YSwgY2FyZCwgMCk7CisKKwkJZGF0YS5ibGtzeiA9IDY0OworCQlkYXRhLmJsb2NrcyA9IDE7CisJCWRhdGEuZmxhZ3MgPSBNTUNfREFUQV9SRUFEOworCQlkYXRhLnNnID0gJnNnOworCQlkYXRhLnNnX2xlbiA9IDE7CisKKwkJbWVtc2V0KCZtcnEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX3JlcXVlc3QpKTsKKworCQltcnEuY21kID0gJmNtZDsKKwkJbXJxLmRhdGEgPSAmZGF0YTsKKworCQlzZ19pbml0X29uZSgmc2csIHN0YXR1cywgNjQpOworCisJCW1tY193YWl0X2Zvcl9yZXEoaG9zdCwgJm1ycSk7CisKKwkJaWYgKGNtZC5lcnJvciAhPSBNTUNfRVJSX05PTkUgfHwgZGF0YS5lcnJvciAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhdHVzWzEzXSAmIDB4MDIpCisJCQljYXJkLT5zd19jYXBzLmhzX21heF9kdHIgPSA1MDAwMDAwMDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfY29tbWFuZCkpOworCisJCWNtZC5vcGNvZGUgPSBTRF9TV0lUQ0g7CisJCWNtZC5hcmcgPSAweDgwRkZGRkYxOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BRFRDOworCisJCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfZGF0YSkpOworCisJCW1tY19zZXRfZGF0YV90aW1lb3V0KCZkYXRhLCBjYXJkLCAwKTsKKworCQlkYXRhLmJsa3N6ID0gNjQ7CisJCWRhdGEuYmxvY2tzID0gMTsKKwkJZGF0YS5mbGFncyA9IE1NQ19EQVRBX1JFQUQ7CisJCWRhdGEuc2cgPSAmc2c7CisJCWRhdGEuc2dfbGVuID0gMTsKKworCQltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCisJCW1ycS5jbWQgPSAmY21kOworCQltcnEuZGF0YSA9ICZkYXRhOworCisJCXNnX2luaXRfb25lKCZzZywgc3RhdHVzLCA2NCk7CisKKwkJbW1jX3dhaXRfZm9yX3JlcShob3N0LCAmbXJxKTsKKworCQlpZiAoY21kLmVycm9yICE9IE1NQ19FUlJfTk9ORSB8fCBkYXRhLmVycm9yICE9IE1NQ19FUlJfTk9ORSkgeworCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoc3RhdHVzWzE2XSAmIDB4RikgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFByb2JsZW0gc3dpdGNoaW5nIGNhcmQgIgorCQkJCSJpbnRvIGhpZ2gtc3BlZWQgbW9kZSFcbiIsCisJCQkJbW1jX2hvc3RuYW1lKGhvc3QpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbW1jX2NhcmRfc2V0X2hpZ2hzcGVlZChjYXJkKTsKKwl9CisKKwlrZnJlZShzdGF0dXMpOworCisJbW1jX2Rlc2VsZWN0X2NhcmRzKGhvc3QpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IG1tY19jYWxjdWxhdGVfY2xvY2soc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKIAl1bnNpZ25lZCBpbnQgbWF4X2R0ciA9IGhvc3QtPmZfbWF4OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjYXJkLCAmaG9zdC0+Y2FyZHMsIG5vZGUpCi0JCWlmICghbW1jX2NhcmRfZGVhZChjYXJkKSAmJiBtYXhfZHRyID4gY2FyZC0+Y3NkLm1heF9kdHIpCi0JCQltYXhfZHRyID0gY2FyZC0+Y3NkLm1heF9kdHI7CisJCWlmICghbW1jX2NhcmRfZGVhZChjYXJkKSkgeworCQkJaWYgKG1tY19jYXJkX2hpZ2hzcGVlZChjYXJkKSAmJiBtbWNfY2FyZF9zZChjYXJkKSkgeworCQkJCWlmIChtYXhfZHRyID4gY2FyZC0+c3dfY2Fwcy5oc19tYXhfZHRyKQorCQkJCQltYXhfZHRyID0gY2FyZC0+c3dfY2Fwcy5oc19tYXhfZHRyOworCQkJfSBlbHNlIGlmIChtbWNfY2FyZF9oaWdoc3BlZWQoY2FyZCkgJiYgIW1tY19jYXJkX3NkKGNhcmQpKSB7CisJCQkJaWYgKG1heF9kdHIgPiBjYXJkLT5leHRfY3NkLmhzX21heF9kdHIpCisJCQkJCW1heF9kdHIgPSBjYXJkLT5leHRfY3NkLmhzX21heF9kdHI7CisJCQl9IGVsc2UgaWYgKG1heF9kdHIgPiBjYXJkLT5jc2QubWF4X2R0cikgeworCQkJCW1heF9kdHIgPSBjYXJkLT5jc2QubWF4X2R0cjsKKwkJCX0KKwkJfQogCiAJcHJfZGVidWcoIiVzOiBzZWxlY3RlZCAlZC4lMDNkTUh6IHRyYW5zZmVyIHJhdGVcbiIsCiAJCSBtbWNfaG9zdG5hbWUoaG9zdCksCkBAIC0xMTUwLDggKzE0MDEsMTEgQEAKIAogCW1tY19yZWFkX2NzZHMoaG9zdCk7CiAKLQlpZiAoaG9zdC0+bW9kZSA9PSBNTUNfTU9ERV9TRCkKKwlpZiAoaG9zdC0+bW9kZSA9PSBNTUNfTU9ERV9TRCkgewogCQltbWNfcmVhZF9zY3JzKGhvc3QpOworCQltbWNfcmVhZF9zd2l0Y2hfY2Fwcyhob3N0KTsKKwl9IGVsc2UKKwkJbW1jX3Byb2Nlc3NfZXh0X2NzZHMoaG9zdCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwppbmRleCBmOTAyN2M4Li44NzcxMzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwpAQCAtODMsNyArODMsNiBAQAogCW1kLT51c2FnZS0tOwogCWlmIChtZC0+dXNhZ2UgPT0gMCkgewogCQlwdXRfZGlzayhtZC0+ZGlzayk7Ci0JCW1tY19jbGVhbnVwX3F1ZXVlKCZtZC0+cXVldWUpOwogCQlrZnJlZShtZCk7CiAJfQogCW11dGV4X3VubG9jaygmb3Blbl9sb2NrKTsKQEAgLTIyNSwxMCArMjI0LDEwIEBACiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtcS0+ZGF0YTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtZC0+cXVldWUuY2FyZDsKIAlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0IGJycTsKLQlpbnQgcmV0OworCWludCByZXQgPSAxOwogCiAJaWYgKG1tY19jYXJkX2NsYWltX2hvc3QoY2FyZCkpCi0JCWdvdG8gY21kX2VycjsKKwkJZ290byBmbHVzaF9xdWV1ZTsKIAogCWRvIHsKIAkJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKQEAgLTM0NSw4ICszNDQsNiBAQAogCXJldHVybiAxOwogCiAgY21kX2VycjoKLQlyZXQgPSAxOwotCiAgCS8qCiAgCSAqIElmIHRoaXMgaXMgYW4gU0QgY2FyZCBhbmQgd2UncmUgd3JpdGluZywgd2UgY2FuIGZpcnN0CiAgCSAqIG1hcmsgdGhlIGtub3duIGdvb2Qgc2VjdG9ycyBhcyBvay4KQEAgLTM4MCw2ICszNzcsNyBAQAogCiAJbW1jX2NhcmRfcmVsZWFzZV9ob3N0KGNhcmQpOwogCitmbHVzaF9xdWV1ZToKIAlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CiAJd2hpbGUgKHJldCkgewogCQlyZXQgPSBlbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJlcSwgMCwKQEAgLTU1MywxMiArNTUxLDExIEBACiAJaWYgKG1kKSB7CiAJCWludCBkZXZpZHg7CiAKKwkJLyogU3RvcCBuZXcgcmVxdWVzdHMgZnJvbSBnZXR0aW5nIGludG8gdGhlIHF1ZXVlICovCiAJCWRlbF9nZW5kaXNrKG1kLT5kaXNrKTsKIAotCQkvKgotCQkgKiBJIHRoaW5rIHRoaXMgaXMgbmVlZGVkLgotCQkgKi8KLQkJbWQtPmRpc2stPnF1ZXVlID0gTlVMTDsKKwkJLyogVGhlbiBmbHVzaCBvdXQgYW55IGFscmVhZHkgaW4gdGhlcmUgKi8KKwkJbW1jX2NsZWFudXBfcXVldWUoJm1kLT5xdWV1ZSk7CiAKIAkJZGV2aWR4ID0gbWQtPmRpc2stPmZpcnN0X21pbm9yID4+IE1NQ19TSElGVDsKIAkJX19jbGVhcl9iaXQoZGV2aWR4LCBkZXZfdXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY19xdWV1ZS5jIGIvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmMKaW5kZXggNGNjZGQ4Mi4uYTE3NDIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmMKQEAgLTEwLDEzICsxMCwxMyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgIm1tY19xdWV1ZS5oIgogCi0jZGVmaW5lIE1NQ19RVUVVRV9FWElUCQkoMSA8PCAwKQotI2RlZmluZSBNTUNfUVVFVUVfU1VTUEVOREVECSgxIDw8IDEpCisjZGVmaW5lIE1NQ19RVUVVRV9TVVNQRU5ERUQJKDEgPDwgMCkKIAogLyoKICAqIFByZXBhcmUgYSBNTUMgcmVxdWVzdC4gIEVzc2VudGlhbGx5LCB0aGlzIG1lYW5zIHBhc3NpbmcgdGhlCkBAIC01OSw3ICs1OSw2IEBACiB7CiAJc3RydWN0IG1tY19xdWV1ZSAqbXEgPSBkOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbXEtPnF1ZXVlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCiAJLyoKIAkgKiBTZXQgaW90aHJlYWQgdG8gZW5zdXJlIHRoYXQgd2UgYXJlbid0IHB1dCB0byBzbGVlcCBieQpAQCAtNjcsMTIgKzY2LDcgQEAKIAkgKi8KIAljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQ3xQRl9OT0ZSRUVaRTsKIAotCWRhZW1vbml6ZSgibW1jcWQiKTsKLQotCWNvbXBsZXRlKCZtcS0+dGhyZWFkX2NvbXBsZXRlKTsKLQogCWRvd24oJm1xLT50aHJlYWRfc2VtKTsKLQlhZGRfd2FpdF9xdWV1ZSgmbXEtPnRocmVhZF93cSwgJndhaXQpOwogCWRvIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IE5VTEw7CiAKQEAgLTg0LDcgKzc4LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJCWlmICghcmVxKSB7Ci0JCQlpZiAobXEtPmZsYWdzICYgTU1DX1FVRVVFX0VYSVQpCisJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJCWJyZWFrOwogCQkJdXAoJm1xLT50aHJlYWRfc2VtKTsKIAkJCXNjaGVkdWxlKCk7CkBAIC05NSwxMCArODksOCBAQAogCiAJCW1xLT5pc3N1ZV9mbihtcSwgcmVxKTsKIAl9IHdoaWxlICgxKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmbXEtPnRocmVhZF93cSwgJndhaXQpOwogCXVwKCZtcS0+dGhyZWFkX3NlbSk7CiAKLQljb21wbGV0ZV9hbmRfZXhpdCgmbXEtPnRocmVhZF9jb21wbGV0ZSwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMSw5ICsxMDMsMjIgQEAKIHN0YXRpYyB2b2lkIG1tY19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSkKIHsKIAlzdHJ1Y3QgbW1jX3F1ZXVlICptcSA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCWludCByZXQ7CisKKwlpZiAoIW1xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTU1DOiBraWxsaW5nIHJlcXVlc3RzIGZvciBkZWFkIHF1ZXVlXG4iKTsKKwkJd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7CisJCQlkbyB7CisJCQkJcmV0ID0gZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhyZXEsIDAsCisJCQkJCXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDkpOworCQkJfSB3aGlsZSAocmV0KTsKKwkJfQorCQlyZXR1cm47CisJfQogCiAJaWYgKCFtcS0+cmVxKQotCQl3YWtlX3VwKCZtcS0+dGhyZWFkX3dxKTsKKwkJd2FrZV91cF9wcm9jZXNzKG1xLT50aHJlYWQpOwogfQogCiAvKioKQEAgLTEzMCw4ICsxMzUsOCBAQAogCXU2NCBsaW1pdCA9IEJMS19CT1VOQ0VfSElHSDsKIAlpbnQgcmV0OwogCi0JaWYgKGhvc3QtPmRldi0+ZG1hX21hc2sgJiYgKmhvc3QtPmRldi0+ZG1hX21hc2spCi0JCWxpbWl0ID0gKmhvc3QtPmRldi0+ZG1hX21hc2s7CisJaWYgKG1tY19kZXYoaG9zdCktPmRtYV9tYXNrICYmICptbWNfZGV2KGhvc3QpLT5kbWFfbWFzaykKKwkJbGltaXQgPSAqbW1jX2Rldihob3N0KS0+ZG1hX21hc2s7CiAKIAltcS0+Y2FyZCA9IGNhcmQ7CiAJbXEtPnF1ZXVlID0gYmxrX2luaXRfcXVldWUobW1jX3JlcXVlc3QsIGxvY2spOwpAQCAtMTUyLDM2ICsxNTcsNDAgQEAKIAkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIW1xLT5zZykgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXA7CisJCWdvdG8gY2xlYW51cF9xdWV1ZTsKIAl9CiAKLQlpbml0X2NvbXBsZXRpb24oJm1xLT50aHJlYWRfY29tcGxldGUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1xLT50aHJlYWRfd3EpOwogCWluaXRfTVVURVgoJm1xLT50aHJlYWRfc2VtKTsKIAotCXJldCA9IGtlcm5lbF90aHJlYWQobW1jX3F1ZXVlX3RocmVhZCwgbXEsIENMT05FX0tFUk5FTCk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1xLT50aHJlYWRfY29tcGxldGUpOwotCQlpbml0X2NvbXBsZXRpb24oJm1xLT50aHJlYWRfY29tcGxldGUpOwotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKKwltcS0+dGhyZWFkID0ga3RocmVhZF9ydW4obW1jX3F1ZXVlX3RocmVhZCwgbXEsICJtbWNxZCIpOworCWlmIChJU19FUlIobXEtPnRocmVhZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtcS0+dGhyZWFkKTsKKwkJZ290byBmcmVlX3NnOwogCX0KIAotIGNsZWFudXA6CisJcmV0dXJuIDA7CisKKyBmcmVlX3NnOgogCWtmcmVlKG1xLT5zZyk7CiAJbXEtPnNnID0gTlVMTDsKLQorIGNsZWFudXBfcXVldWU6CiAJYmxrX2NsZWFudXBfcXVldWUobXEtPnF1ZXVlKTsKLSBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobW1jX2luaXRfcXVldWUpOwogCiB2b2lkIG1tY19jbGVhbnVwX3F1ZXVlKHN0cnVjdCBtbWNfcXVldWUgKm1xKQogewotCW1xLT5mbGFncyB8PSBNTUNfUVVFVUVfRVhJVDsKLQl3YWtlX3VwKCZtcS0+dGhyZWFkX3dxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtcS0+dGhyZWFkX2NvbXBsZXRlKTsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBtcS0+cXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE1hcmsgdGhhdCB3ZSBzaG91bGQgc3RhcnQgdGhyb3dpbmcgb3V0IHN0cmFnZ2xlcnMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJcS0+cXVldWVkYXRhID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCS8qIFRoZW4gdGVybWluYXRlIG91ciB3b3JrZXIgdGhyZWFkICovCisJa3RocmVhZF9zdG9wKG1xLT50aHJlYWQpOwogCiAJa2ZyZWUobXEtPnNnKTsKIAltcS0+c2cgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmggYi9kcml2ZXJzL21tYy9tbWNfcXVldWUuaAppbmRleCA3MTgyZDJmLi5jOWYxMzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfcXVldWUuaAorKysgYi9kcml2ZXJzL21tYy9tbWNfcXVldWUuaApAQCAtNiw4ICs2LDcgQEAKIAogc3RydWN0IG1tY19xdWV1ZSB7CiAJc3RydWN0IG1tY19jYXJkCQkqY2FyZDsKLQlzdHJ1Y3QgY29tcGxldGlvbgl0aHJlYWRfY29tcGxldGU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJdGhyZWFkX3dxOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkOwogCXN0cnVjdCBzZW1hcGhvcmUJdGhyZWFkX3NlbTsKIAl1bnNpZ25lZCBpbnQJCWZsYWdzOwogCXN0cnVjdCByZXF1ZXN0CQkqcmVxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwppbmRleCAxMGNjOTczLi5hYzUzMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYworKysgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJbWVtc2V0KGNhcmQsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2NhcmQpKTsKIAljYXJkLT5ob3N0ID0gaG9zdDsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmY2FyZC0+ZGV2KTsKLQljYXJkLT5kZXYucGFyZW50ID0gY2FyZC0+aG9zdC0+ZGV2OworCWNhcmQtPmRldi5wYXJlbnQgPSBtbWNfZGV2KGhvc3QpOwogCWNhcmQtPmRldi5idXMgPSAmbW1jX2J1c190eXBlOwogCWNhcmQtPmRldi5yZWxlYXNlID0gbW1jX3JlbGVhc2VfY2FyZDsKIH0KQEAgLTI0Miw3ICsyNDIsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG1tY19ob3N0X2NsYXNzZGV2X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbW1jX2hvc3RfY2xhc3NkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2xzX2Rldl90b19tbWNfaG9zdChkZXYpOwogCWtmcmVlKGhvc3QpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgbW1jX2hvc3RfY2xhc3MgPSB7CiAJLm5hbWUJCT0gIm1tY19ob3N0IiwKLQkucmVsZWFzZQk9IG1tY19ob3N0X2NsYXNzZGV2X3JlbGVhc2UsCisJLmRldl9yZWxlYXNlCT0gbW1jX2hvc3RfY2xhc3NkZXZfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBERUZJTkVfSURSKG1tY19ob3N0X2lkcik7CkBAIC0yNjcsMTAgKzI2NywxMCBAQAogCWlmIChob3N0KSB7CiAJCW1lbXNldChob3N0LCAwLCBzaXplb2Yoc3RydWN0IG1tY19ob3N0KSArIGV4dHJhKTsKIAotCQlob3N0LT5kZXYgPSBkZXY7Ci0JCWhvc3QtPmNsYXNzX2Rldi5kZXYgPSBob3N0LT5kZXY7CisJCWhvc3QtPnBhcmVudCA9IGRldjsKKwkJaG9zdC0+Y2xhc3NfZGV2LnBhcmVudCA9IGRldjsKIAkJaG9zdC0+Y2xhc3NfZGV2LmNsYXNzID0gJm1tY19ob3N0X2NsYXNzOwotCQljbGFzc19kZXZpY2VfaW5pdGlhbGl6ZSgmaG9zdC0+Y2xhc3NfZGV2KTsKKwkJZGV2aWNlX2luaXRpYWxpemUoJmhvc3QtPmNsYXNzX2Rldik7CiAJfQogCiAJcmV0dXJuIGhvc3Q7CkBAIC0yOTIsMTAgKzI5MiwxMCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbnByaW50Zihob3N0LT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLAorCXNucHJpbnRmKGhvc3QtPmNsYXNzX2Rldi5idXNfaWQsIEJVU19JRF9TSVpFLAogCQkgIm1tYyVkIiwgaG9zdC0+aW5kZXgpOwogCi0JcmV0dXJuIGNsYXNzX2RldmljZV9hZGQoJmhvc3QtPmNsYXNzX2Rldik7CisJcmV0dXJuIGRldmljZV9hZGQoJmhvc3QtPmNsYXNzX2Rldik7CiB9CiAKIC8qCkBAIC0zMDMsNyArMzAzLDcgQEAKICAqLwogdm9pZCBtbWNfcmVtb3ZlX2hvc3Rfc3lzZnMoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewotCWNsYXNzX2RldmljZV9kZWwoJmhvc3QtPmNsYXNzX2Rldik7CisJZGV2aWNlX2RlbCgmaG9zdC0+Y2xhc3NfZGV2KTsKIAogCXNwaW5fbG9jaygmbW1jX2hvc3RfbG9jayk7CiAJaWRyX3JlbW92ZSgmbW1jX2hvc3RfaWRyLCBob3N0LT5pbmRleCk7CkBAIC0zMTUsNyArMzE1LDcgQEAKICAqLwogdm9pZCBtbWNfZnJlZV9ob3N0X3N5c2ZzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKLQljbGFzc19kZXZpY2VfcHV0KCZob3N0LT5jbGFzc19kZXYpOworCXB1dF9kZXZpY2UoJmhvc3QtPmNsYXNzX2Rldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jaS5jIGIvZHJpdmVycy9tbWMvbW1jaS5jCmluZGV4IDgyODUwM2MuLmU5YjgwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY2kuYworKysgYi9kcml2ZXJzL21tYy9tbWNpLmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgbW1jaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBtbWNpX29wcyA9IHsKIAkucmVxdWVzdAk9IG1tY2lfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IG1tY2lfc2V0X2lvcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9vbWFwLmMgYi9kcml2ZXJzL21tYy9vbWFwLmMKaW5kZXggNzYyZmEyOC4uNDM1ZDMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvb21hcC5jCisrKyBiL2RyaXZlcnMvbW1jL29tYXAuYwpAQCAtMzgsNyArMzgsNTcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdHBzNjUwMTAuaD4KIAotI2luY2x1ZGUgIm9tYXAuaCIKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0NNRAkweDAwCisjZGVmaW5lCU9NQVBfTU1DX1JFR19BUkdMCTB4MDQKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0FSR0gJMHgwOAorI2RlZmluZQlPTUFQX01NQ19SRUdfQ09OCTB4MGMKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1NUQVQJMHgxMAorI2RlZmluZQlPTUFQX01NQ19SRUdfSUUJCTB4MTQKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0NUTwkweDE4CisjZGVmaW5lCU9NQVBfTU1DX1JFR19EVE8JMHgxYworI2RlZmluZQlPTUFQX01NQ19SRUdfREFUQQkweDIwCisjZGVmaW5lCU9NQVBfTU1DX1JFR19CTEVOCTB4MjQKKyNkZWZpbmUJT01BUF9NTUNfUkVHX05CTEsJMHgyOAorI2RlZmluZQlPTUFQX01NQ19SRUdfQlVGCTB4MmMKKyNkZWZpbmUgT01BUF9NTUNfUkVHX1NESU8JMHgzNAorI2RlZmluZQlPTUFQX01NQ19SRUdfUkVWCTB4M2MKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDAJMHg0MAorI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQMQkweDQ0CisjZGVmaW5lCU9NQVBfTU1DX1JFR19SU1AyCTB4NDgKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDMJMHg0YworI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQNAkweDUwCisjZGVmaW5lCU9NQVBfTU1DX1JFR19SU1A1CTB4NTQKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDYJMHg1OAorI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQNwkweDVjCisjZGVmaW5lCU9NQVBfTU1DX1JFR19JT1NSCTB4NjAKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1NZU0MJMHg2NAorI2RlZmluZQlPTUFQX01NQ19SRUdfU1lTUwkweDY4CisKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9DQVJEX0VSUgkJKDEgPDwgMTQpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfQ0FSRF9JUlEJCSgxIDw8IDEzKQorI2RlZmluZQlPTUFQX01NQ19TVEFUX09DUl9CVVNZCQkoMSA8PCAxMikKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9BX0VNUFRZCQkoMSA8PCAxMSkKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9BX0ZVTEwJCSgxIDw8IDEwKQorI2RlZmluZQlPTUFQX01NQ19TVEFUX0NNRF9DUkMJCSgxIDw8ICA4KQorI2RlZmluZQlPTUFQX01NQ19TVEFUX0NNRF9UT1VUCQkoMSA8PCAgNykKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9EQVRBX0NSQwkJKDEgPDwgIDYpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfREFUQV9UT1VUCQkoMSA8PCAgNSkKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9FTkRfQlVTWQkJKDEgPDwgIDQpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfRU5EX09GX0RBVEEJKDEgPDwgIDMpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfQ0FSRF9CVVNZCQkoMSA8PCAgMikKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9FTkRfT0ZfQ01ECSgxIDw8ICAwKQorCisjZGVmaW5lIE9NQVBfTU1DX1JFQUQoaG9zdCwgcmVnKQlfX3Jhd19yZWFkdygoaG9zdCktPnZpcnRfYmFzZSArIE9NQVBfTU1DX1JFR18jI3JlZykKKyNkZWZpbmUgT01BUF9NTUNfV1JJVEUoaG9zdCwgcmVnLCB2YWwpCV9fcmF3X3dyaXRldygodmFsKSwgKGhvc3QpLT52aXJ0X2Jhc2UgKyBPTUFQX01NQ19SRUdfIyNyZWcpCisKKy8qCisgKiBDb21tYW5kIHR5cGVzCisgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ01EVFlQRV9CQwkwCisjZGVmaW5lIE9NQVBfTU1DX0NNRFRZUEVfQkNSCTEKKyNkZWZpbmUgT01BUF9NTUNfQ01EVFlQRV9BQwkyCisjZGVmaW5lIE9NQVBfTU1DX0NNRFRZUEVfQURUQwkzCisKIAogI2RlZmluZSBEUklWRVJfTkFNRSAibW1jaS1vbWFwIgogI2RlZmluZSBSU1BfVFlQRSh4KQkoKHgpICYgfihNTUNfUlNQX0JVU1l8TU1DX1JTUF9PUENPREUpKQpAQCAtNjAsOCArMTEwLDkgQEAKIAl1bnNpZ25lZCBjaGFyCQlpZDsgLyogMTZ4eCBjaGlwcyBoYXZlIDIgTU1DIGJsb2NrcyAqLwogCXN0cnVjdCBjbGsgKgkJaWNsazsKIAlzdHJ1Y3QgY2xrICoJCWZjbGs7Ci0Jc3RydWN0IHJlc291cmNlCQkqcmVzOwotCXZvaWQgX19pb21lbQkJKmJhc2U7CisJc3RydWN0IHJlc291cmNlCQkqbWVtX3JlczsKKwl2b2lkIF9faW9tZW0JCSp2aXJ0X2Jhc2U7CisJdW5zaWduZWQgaW50CQlwaHlzX2Jhc2U7CiAJaW50CQkJaXJxOwogCXVuc2lnbmVkIGNoYXIJCWJ1c19tb2RlOwogCXVuc2lnbmVkIGNoYXIJCWh3X2J1c19tb2RlOwpAQCAtMTkxLDE2ICsyNDIsMTYgQEAKIAogCWNsa19lbmFibGUoaG9zdC0+ZmNsayk7CiAKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBDVE8sIDIwMCk7Ci0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQVJHTCwgY21kLT5hcmcgJiAweGZmZmYpOwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEFSR0gsIGNtZC0+YXJnID4+IDE2KTsKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBJRSwKKwlPTUFQX01NQ19XUklURShob3N0LCBDVE8sIDIwMCk7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgQVJHTCwgY21kLT5hcmcgJiAweGZmZmYpOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIEFSR0gsIGNtZC0+YXJnID4+IDE2KTsKKwlPTUFQX01NQ19XUklURShob3N0LCBJRSwKIAkJICAgICAgIE9NQVBfTU1DX1NUQVRfQV9FTVBUWSAgICB8IE9NQVBfTU1DX1NUQVRfQV9GVUxMICAgIHwKIAkJICAgICAgIE9NQVBfTU1DX1NUQVRfQ01EX0NSQyAgICB8IE9NQVBfTU1DX1NUQVRfQ01EX1RPVVQgIHwKIAkJICAgICAgIE9NQVBfTU1DX1NUQVRfREFUQV9DUkMgICB8IE9NQVBfTU1DX1NUQVRfREFUQV9UT1VUIHwKIAkJICAgICAgIE9NQVBfTU1DX1NUQVRfRU5EX09GX0NNRCB8IE9NQVBfTU1DX1NUQVRfQ0FSRF9FUlIgIHwKIAkJICAgICAgIE9NQVBfTU1DX1NUQVRfRU5EX09GX0RBVEEpOwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENNRCwgY21kcmVnKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBDTUQsIGNtZHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yOTYsMjIgKzM0NywyMiBAQAogCQlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KSB7CiAJCQkvKiByZXNwb25zZSB0eXBlIDIgKi8KIAkJCWNtZC0+cmVzcFszXSA9Ci0JCQkJT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBSU1AwKSB8Ci0JCQkJKE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQMSkgPDwgMTYpOworCQkJCU9NQVBfTU1DX1JFQUQoaG9zdCwgUlNQMCkgfAorCQkJCShPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDEpIDw8IDE2KTsKIAkJCWNtZC0+cmVzcFsyXSA9Ci0JCQkJT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBSU1AyKSB8Ci0JCQkJKE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQMykgPDwgMTYpOworCQkJCU9NQVBfTU1DX1JFQUQoaG9zdCwgUlNQMikgfAorCQkJCShPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDMpIDw8IDE2KTsKIAkJCWNtZC0+cmVzcFsxXSA9Ci0JCQkJT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBSU1A0KSB8Ci0JCQkJKE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNSkgPDwgMTYpOworCQkJCU9NQVBfTU1DX1JFQUQoaG9zdCwgUlNQNCkgfAorCQkJCShPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDUpIDw8IDE2KTsKIAkJCWNtZC0+cmVzcFswXSA9Ci0JCQkJT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBSU1A2KSB8Ci0JCQkJKE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNykgPDwgMTYpOworCQkJCU9NQVBfTU1DX1JFQUQoaG9zdCwgUlNQNikgfAorCQkJCShPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDcpIDw8IDE2KTsKIAkJfSBlbHNlIHsKIAkJCS8qIHJlc3BvbnNlIHR5cGVzIDEsIDFiLCAzLCA0LCA1LCA2ICovCiAJCQljbWQtPnJlc3BbMF0gPQotCQkJCU9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNikgfAotCQkJCShPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDcpIDw8IDE2KTsKKwkJCQlPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDYpIHwKKwkJCQkoT01BUF9NTUNfUkVBRChob3N0LCBSU1A3KSA8PCAxNik7CiAJCX0KIAl9CiAKQEAgLTM1NCw5ICs0MDUsOSBAQAogCWhvc3QtPmRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuOwogCiAJaWYgKHdyaXRlKSB7Ci0JCV9fcmF3X3dyaXRlc3coaG9zdC0+YmFzZSArIE9NQVBfTU1DX1JFR19EQVRBLCBob3N0LT5idWZmZXIsIG4pOworCQlfX3Jhd193cml0ZXN3KGhvc3QtPnZpcnRfYmFzZSArIE9NQVBfTU1DX1JFR19EQVRBLCBob3N0LT5idWZmZXIsIG4pOwogCX0gZWxzZSB7Ci0JCV9fcmF3X3JlYWRzdyhob3N0LT5iYXNlICsgT01BUF9NTUNfUkVHX0RBVEEsIGhvc3QtPmJ1ZmZlciwgbik7CisJCV9fcmF3X3JlYWRzdyhob3N0LT52aXJ0X2Jhc2UgKyBPTUFQX01NQ19SRUdfREFUQSwgaG9zdC0+YnVmZmVyLCBuKTsKIAl9CiB9CiAKQEAgLTM4NiwxMSArNDM3LDExIEBACiAJaW50IHRyYW5zZmVyX2Vycm9yOwogCiAJaWYgKGhvc3QtPmNtZCA9PSBOVUxMICYmIGhvc3QtPmRhdGEgPT0gTlVMTCkgewotCQlzdGF0dXMgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFNUQVQpOworCQlzdGF0dXMgPSBPTUFQX01NQ19SRUFEKGhvc3QsIFNUQVQpOwogCQlkZXZfaW5mbyhtbWNfZGV2KGhvc3QtPm1tYyksInNwdXJpb3VzIGlycSAweCUwNHhcbiIsIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgIT0gMCkgewotCQkJT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgU1RBVCwgc3RhdHVzKTsKLQkJCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIElFLCAwKTsKKwkJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIFNUQVQsIHN0YXR1cyk7CisJCQlPTUFQX01NQ19XUklURShob3N0LCBJRSwgMCk7CiAJCX0KIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTM5OSw4ICs0NTAsOCBAQAogCWVuZF90cmFuc2ZlciA9IDA7CiAJdHJhbnNmZXJfZXJyb3IgPSAwOwogCi0Jd2hpbGUgKChzdGF0dXMgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFNUQVQpKSAhPSAwKSB7Ci0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNUQVQsIHN0YXR1cyk7CisJd2hpbGUgKChzdGF0dXMgPSBPTUFQX01NQ19SRUFEKGhvc3QsIFNUQVQpKSAhPSAwKSB7CisJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIFNUQVQsIHN0YXR1cyk7CiAjaWZkZWYgQ09ORklHX01NQ19ERUJVRwogCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIk1NQyBJUlEgJTA0eCAoQ01EICVkKTogIiwKIAkJCXN0YXR1cywgaG9zdC0+Y21kICE9IE5VTEwgPyBob3N0LT5jbWQtPm9wY29kZSA6IC0xKTsKQEAgLTQ3MCw4ICs1MjEsOCBAQAogCiAJCWlmIChzdGF0dXMgJiBPTUFQX01NQ19TVEFUX0NBUkRfRVJSKSB7CiAJCQlpZiAoaG9zdC0+Y21kICYmIGhvc3QtPmNtZC0+b3Bjb2RlID09IE1NQ19TVE9QX1RSQU5TTUlTU0lPTikgewotCQkJCXUzMiByZXNwb25zZSA9IE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNikKLQkJCQkJfCAoT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBSU1A3KSA8PCAxNik7CisJCQkJdTMyIHJlc3BvbnNlID0gT01BUF9NTUNfUkVBRChob3N0LCBSU1A2KQorCQkJCQl8IChPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDcpIDw8IDE2KTsKIAkJCQkvKiBTVE9QIHNvbWV0aW1lcyBzZXRzIG11c3QtaWdub3JlIGJpdHMgKi8KIAkJCQlpZiAoIShyZXNwb25zZSAmIChSMV9DQ19FUlJPUgogCQkJCQkJCQl8IFIxX0lMTEVHQUxfQ09NTUFORApAQCAtNTMwLDEyICs1ODEsNiBAQAogCXNjaGVkdWxlX3dvcmsoJmhvc3QtPnN3aXRjaF93b3JrKTsKIH0KIAotLyogRklYTUU6IEhhbmRsZSBjYXJkIGluc2VydGlvbiBhbmQgcmVtb3ZhbCBwcm9wZXJseS4gTWF5YmUgdXNlIGEgbWFzawotICogZm9yIE1NQyBzdGF0ZT8gKi8KLXN0YXRpYyB2b2lkIG1tY19vbWFwX3N3aXRjaF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEsIHU4IG1tY19tYXNrKQotewotfQotCiBzdGF0aWMgdm9pZCBtbWNfb21hcF9zd2l0Y2hfaGFuZGxlcih2b2lkICpkYXRhKQogewogCXN0cnVjdCBtbWNfb21hcF9ob3N0ICpob3N0ID0gKHN0cnVjdCBtbWNfb21hcF9ob3N0ICopIGRhdGE7CkBAIC01ODEsNyArNjI2LDcgQEAKIAlpbnQgZHN0X3BvcnQgPSAwOwogCWludCBzeW5jX2RldiA9IDA7CiAKLQlkYXRhX2FkZHIgPSBpb192MnAoKHUzMikgaG9zdC0+YmFzZSkgKyBPTUFQX01NQ19SRUdfREFUQTsKKwlkYXRhX2FkZHIgPSBob3N0LT5waHlzX2Jhc2UgKyBPTUFQX01NQ19SRUdfREFUQTsKIAlmcmFtZSA9IGRhdGEtPmJsa3N6OwogCWNvdW50ID0gc2dfZG1hX2xlbihzZyk7CiAKQEAgLTY0MCwxMCArNjg1LDkgQEAKIAl9CiAKIAkvKiBNYXggbGltaXQgZm9yIERNQSBmcmFtZSBjb3VudCBpcyAweGZmZmYgKi8KLQlpZiAodW5saWtlbHkoY291bnQgPiAweGZmZmYpKQotCQlCVUcoKTsKKwlCVUdfT04oY291bnQgPiAweGZmZmYpOwogCi0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQlVGLCBidWYpOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIEJVRiwgYnVmKTsKIAlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKGRtYV9jaCwgT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKIAkJCQkgICAgIGZyYW1lLCBjb3VudCwgT01BUF9ETUFfU1lOQ19GUkFNRSwKIAkJCQkgICAgIHN5bmNfZGV2LCAwKTsKQEAgLTcyOCwxMSArNzcyLDExIEBACiB7CiAJdTE2IHJlZzsKIAotCXJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgU0RJTyk7CisJcmVnID0gT01BUF9NTUNfUkVBRChob3N0LCBTRElPKTsKIAlyZWcgJj0gfigxIDw8IDUpOwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNESU8sIHJlZyk7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgU0RJTywgcmVnKTsKIAkvKiBTZXQgbWF4aW11bSB0aW1lb3V0ICovCi0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQ1RPLCAweGZmKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBDVE8sIDB4ZmYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RhdGFfdGltZW91dChzdHJ1Y3QgbW1jX29tYXBfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICpyZXEpCkBAIC03NDYsMTQgKzc5MCwxNCBAQAogCXRpbWVvdXQgPSByZXEtPmRhdGEtPnRpbWVvdXRfY2xrcyArIHJlcS0+ZGF0YS0+dGltZW91dF9ucyAvIDUwMDsKIAogCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gdXNlIHRpbWVvdXQgbXVsdGlwbGllciByZWdpc3RlciAqLwotCXJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgU0RJTyk7CisJcmVnID0gT01BUF9NTUNfUkVBRChob3N0LCBTRElPKTsKIAlpZiAodGltZW91dCA+IDB4ZmZmZikgewogCQlyZWcgfD0gKDEgPDwgNSk7CiAJCXRpbWVvdXQgLz0gMTAyNDsKIAl9IGVsc2UKIAkJcmVnICY9IH4oMSA8PCA1KTsKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBTRElPLCByZWcpOwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIERUTywgdGltZW91dCk7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgU0RJTywgcmVnKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBEVE8sIHRpbWVvdXQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNzY1LDE5ICs4MDksMTggQEAKIAogCWhvc3QtPmRhdGEgPSBkYXRhOwogCWlmIChkYXRhID09IE5VTEwpIHsKLQkJT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQkxFTiwgMCk7Ci0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIE5CTEssIDApOwotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBCVUYsIDApOworCQlPTUFQX01NQ19XUklURShob3N0LCBCTEVOLCAwKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgTkJMSywgMCk7CisJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIEJVRiwgMCk7CiAJCWhvc3QtPmRtYV9pbl91c2UgPSAwOwogCQlzZXRfY21kX3RpbWVvdXQoaG9zdCwgcmVxKTsKIAkJcmV0dXJuOwogCX0KIAotCiAJYmxvY2tfc2l6ZSA9IGRhdGEtPmJsa3N6OwogCi0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgTkJMSywgZGF0YS0+YmxvY2tzIC0gMSk7Ci0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQkxFTiwgYmxvY2tfc2l6ZSAtIDEpOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIE5CTEssIGRhdGEtPmJsb2NrcyAtIDEpOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIEJMRU4sIGJsb2NrX3NpemUgLSAxKTsKIAlzZXRfZGF0YV90aW1lb3V0KGhvc3QsIHJlcSk7CiAKIAkvKiBjb3BlIHdpdGggY2FsbGluZyBsYXllciBjb25mdXNpb247IGl0IGlzc3VlcyAic2luZ2xlCkBAIC04MTksNyArODYyLDcgQEAKIAogCS8qIFJldmVydCB0byBQSU8/ICovCiAJaWYgKCF1c2VfZG1hKSB7Ci0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEJVRiwgMHgxZjFmKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgQlVGLCAweDFmMWYpOwogCQlob3N0LT50b3RhbF9ieXRlc19sZWZ0ID0gZGF0YS0+YmxvY2tzICogYmxvY2tfc2l6ZTsKIAkJaG9zdC0+c2dfbGVuID0gc2dfbGVuOwogCQltbWNfb21hcF9zZ190b19idWYoaG9zdCk7CkBAIC04NDUsNyArODg4LDYgQEAKIHN0YXRpYyB2b2lkIGlubm92YXRvcl9mcGdhX3NvY2tldF9wb3dlcihpbnQgb24pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTVYWCkKLQogCWlmIChvbikgewogCQlmcGdhX3dyaXRlKGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKSB8ICgxIDw8IDMpLAogCQkgICAgIE9NQVAxNTEwX0ZQR0FfUE9XRVIpOwpAQCAtODcxLDggKzkxMyw4IEBACiAJCQkvKiBHUElPIDQgb2YgVFBTNjUwMTAgc2VuZHMgU0RfRU4gc2lnbmFsICovCiAJCQl0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzQsIEhJR0gpOwogCQllbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJdTE2IHJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgQ09OKTsKLQkJCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgcmVnIHwgKDEgPDwgMTEpKTsKKwkJCXUxNiByZWcgPSBPTUFQX01NQ19SRUFEKGhvc3QsIENPTik7CisJCQlPTUFQX01NQ19XUklURShob3N0LCBDT04sIHJlZyB8ICgxIDw8IDExKSk7CiAJCX0gZWxzZQogCQkJaWYgKGhvc3QtPnBvd2VyX3BpbiA+PSAwKQogCQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChob3N0LT5wb3dlcl9waW4sIDEpOwpAQCAtODg0LDggKzkyNiw4IEBACiAJCWVsc2UgaWYgKG1hY2hpbmVfaXNfb21hcF9oMygpKQogCQkJdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU80LCBMT1cpOwogCQllbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJdTE2IHJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgQ09OKTsKLQkJCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgcmVnICYgfigxIDw8IDExKSk7CisJCQl1MTYgcmVnID0gT01BUF9NTUNfUkVBRChob3N0LCBDT04pOworCQkJT01BUF9NTUNfV1JJVEUoaG9zdCwgQ09OLCByZWcgJiB+KDEgPDwgMTEpKTsKIAkJfSBlbHNlCiAJCQlpZiAoaG9zdC0+cG93ZXJfcGluID49IDApCiAJCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGhvc3QtPnBvd2VyX3BpbiwgMCk7CkBAIC05MjcsNyArOTY5LDcgQEAKIAljYXNlIE1NQ19QT1dFUl9VUDoKIAljYXNlIE1NQ19QT1dFUl9PTjoKIAkJbW1jX29tYXBfcG93ZXIoaG9zdCwgMSk7Ci0JCWRzb3IgfD0gMTw8MTE7CisJCWRzb3IgfD0gMSA8PCAxMTsKIAkJYnJlYWs7CiAJfQogCkBAIC05NDEsMTQgKzk4MywxNCBAQAogCSAqIHdoaWNoIHJlc3VsdHMgaW4gdGhlIHdoaWxlIGxvb3AgYmVsb3cgZ2V0dGluZyBzdHVjay4KIAkgKiBXcml0aW5nIHRvIHRoZSBDT04gcmVnaXN0ZXIgdHdpY2Ugc2VlbXMgdG8gZG8gdGhlIHRyaWNrLiAqLwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgZHNvcik7CisJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIENPTiwgZHNvcik7CiAJaWYgKGlvcy0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfVVApIHsKIAkJLyogU2VuZCBjbG9jayBjeWNsZXMsIHBvbGwgY29tcGxldGlvbiAqLwotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBJRSwgMCk7Ci0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNUQVQsIDB4ZmZmZik7Ci0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENNRCwgMTw8Nyk7Ci0JCXdoaWxlICgwID09IChPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFNUQVQpICYgMSkpOwotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBTVEFULCAxKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgSUUsIDApOworCQlPTUFQX01NQ19XUklURShob3N0LCBTVEFULCAweGZmZmYpOworCQlPTUFQX01NQ19XUklURShob3N0LCBDTUQsIDEgPDwgNyk7CisJCXdoaWxlICgoT01BUF9NTUNfUkVBRChob3N0LCBTVEFUKSAmIDEpID09IDApOworCQlPTUFQX01NQ19XUklURShob3N0LCBTVEFULCAxKTsKIAl9CiAJY2xrX2Rpc2FibGUoaG9zdC0+ZmNsayk7CiB9CkBAIC05NjAsNyArMTAwMiw3IEBACiAJcmV0dXJuIGhvc3QtPndwX3BpbiAmJiBvbWFwX2dldF9ncGlvX2RhdGFpbihob3N0LT53cF9waW4pOwogfQogCi1zdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBtbWNfb21hcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBtbWNfb21hcF9vcHMgPSB7CiAJLnJlcXVlc3QJPSBtbWNfb21hcF9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gbW1jX29tYXBfc2V0X2lvcywKIAkuZ2V0X3JvCQk9IG1tY19vbWFwX2dldF9ybywKQEAgLTk3MSwyNSArMTAxMywyOSBAQAogCXN0cnVjdCBvbWFwX21tY19jb25mICptaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBtbWNfaG9zdCAqbW1jOwogCXN0cnVjdCBtbWNfb21hcF9ob3N0ICpob3N0ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCA9IDA7CiAJaW50IGlycTsKLQkKLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmIChtaW5mbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBsYXRmb3JtIGRhdGEgbWlzc2luZ1xuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmICghciB8fCBpcnEgPCAwKQorCWlmIChyZXMgPT0gTlVMTCB8fCBpcnEgPCAwKQogCQlyZXR1cm4gLUVOWElPOwogCi0JciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwKLQkJCQlwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEsCi0JCQkgICAgICAgcGRldi0+bmFtZSk7Ci0JaWYgKCFyKQorCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLAorCQkJICAgICAgICAgcGRldi0+bmFtZSk7CisJaWYgKHJlcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCBtbWNfb21hcF9ob3N0KSwgJnBkZXYtPmRldik7Ci0JaWYgKCFtbWMpIHsKKwlpZiAobW1jID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyX2ZyZWVfbWVtX3JlZ2lvbjsKIAl9CiAKIAlob3N0ID0gbW1jX3ByaXYobW1jKTsKQEAgLTEwMDEsMTMgKzEwNDcsMTMgQEAKIAlob3N0LT5kbWFfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBob3N0OwogCiAJaG9zdC0+aWQgPSBwZGV2LT5pZDsKLQlob3N0LT5yZXMgPSByOworCWhvc3QtPm1lbV9yZXMgPSByZXM7CiAJaG9zdC0+aXJxID0gaXJxOwogCiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CiAJCWhvc3QtPmljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtbWNfaWNrIik7CiAJCWlmIChJU19FUlIoaG9zdC0+aWNsaykpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyX2ZyZWVfbW1jX2hvc3Q7CiAJCWNsa19lbmFibGUoaG9zdC0+aWNsayk7CiAJfQogCkBAIC0xMDE4LDcgKzEwNjQsNyBAQAogCiAJaWYgKElTX0VSUihob3N0LT5mY2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKGhvc3QtPmZjbGspOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfZnJlZV9pY2xrOwogCX0KIAogCS8qIFJFVklTSVQ6CkBAIC0xMDMxLDE0ICsxMDc3LDE1IEBACiAJaG9zdC0+dXNlX2RtYSA9IDE7CiAJaG9zdC0+ZG1hX2NoID0gLTE7CiAKLQlob3N0LT5pcnEgPSBwZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKLQlob3N0LT5iYXNlID0gKHZvaWQgX19pb21lbSopSU9fQUREUkVTUyhyLT5zdGFydCk7CisJaG9zdC0+aXJxID0gaXJxOworCWhvc3QtPnBoeXNfYmFzZSA9IGhvc3QtPm1lbV9yZXMtPnN0YXJ0OworCWhvc3QtPnZpcnRfYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgSU9fQUREUkVTUyhob3N0LT5waHlzX2Jhc2UpOwogCiAJbW1jLT5vcHMgPSAmbW1jX29tYXBfb3BzOwogCW1tYy0+Zl9taW4gPSA0MDAwMDA7CiAJbW1jLT5mX21heCA9IDI0MDAwMDAwOwotCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0OwotCW1tYy0+Y2FwcyA9IE1NQ19DQVBfQllURUJMT0NLOworCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQ7CisJbW1jLT5jYXBzID0gTU1DX0NBUF9NVUxUSVdSSVRFIHwgTU1DX0NBUF9CWVRFQkxPQ0s7CiAKIAlpZiAobWluZm8tPndpcmU0KQogCQkgbW1jLT5jYXBzIHw9IE1NQ19DQVBfNF9CSVRfREFUQTsKQEAgLTEwNTYsMjAgKzExMDMsMTggQEAKIAkJaWYgKChyZXQgPSBvbWFwX3JlcXVlc3RfZ3Bpbyhob3N0LT5wb3dlcl9waW4pKSAhPSAwKSB7CiAJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKIAkJCQkiVW5hYmxlIHRvIGdldCBHUElPIHBpbiBmb3IgTU1DIHBvd2VyXG4iKTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBlcnJfZnJlZV9mY2xrOwogCQl9CiAJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGhvc3QtPnBvd2VyX3BpbiwgMCk7CiAJfQogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBtbWNfb21hcF9pcnEsIDAsIERSSVZFUl9OQU1FLCBob3N0KTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfZnJlZV9wb3dlcl9ncGlvOwogCiAJaG9zdC0+ZGV2ID0gJnBkZXYtPmRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKIAotCW1tY19hZGRfaG9zdChtbWMpOwotCiAJaWYgKGhvc3QtPnN3aXRjaF9waW4gPj0gMCkgewogCQlJTklUX1dPUksoJmhvc3QtPnN3aXRjaF93b3JrLCBtbWNfb21hcF9zd2l0Y2hfaGFuZGxlciwgaG9zdCk7CiAJCWluaXRfdGltZXIoJmhvc3QtPnN3aXRjaF90aW1lcik7CkBAIC0xMTA3LDEwICsxMTUyLDExIEBACiAJCQlzY2hlZHVsZV93b3JrKCZob3N0LT5zd2l0Y2hfd29yayk7CiAJfQogCi1ub19zd2l0Y2g6CisJbW1jX2FkZF9ob3N0KG1tYyk7CisKIAlyZXR1cm4gMDsKIAotb3V0Ogorbm9fc3dpdGNoOgogCS8qIEZJWE1FOiBGcmVlIG90aGVyIHJlc291cmNlcyB0b28uICovCiAJaWYgKGhvc3QpIHsKIAkJaWYgKGhvc3QtPmljbGsgJiYgIUlTX0VSUihob3N0LT5pY2xrKSkKQEAgLTExMTksNiArMTE2NSwyMCBAQAogCQkJY2xrX3B1dChob3N0LT5mY2xrKTsKIAkJbW1jX2ZyZWVfaG9zdChob3N0LT5tbWMpOwogCX0KK2Vycl9mcmVlX3Bvd2VyX2dwaW86CisJaWYgKGhvc3QtPnBvd2VyX3BpbiA+PSAwKQorCQlvbWFwX2ZyZWVfZ3Bpbyhob3N0LT5wb3dlcl9waW4pOworZXJyX2ZyZWVfZmNsazoKKwljbGtfcHV0KGhvc3QtPmZjbGspOworZXJyX2ZyZWVfaWNsazoKKwlpZiAoaG9zdC0+aWNsayAhPSBOVUxMKSB7CisJCWNsa19kaXNhYmxlKGhvc3QtPmljbGspOworCQljbGtfcHV0KGhvc3QtPmljbGspOworCX0KK2Vycl9mcmVlX21tY19ob3N0OgorCW1tY19mcmVlX2hvc3QoaG9zdC0+bW1jKTsKK2Vycl9mcmVlX21lbV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMjgsMzAgKzExODgsMzEgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCi0JaWYgKGhvc3QpIHsKLQkJbW1jX3JlbW92ZV9ob3N0KGhvc3QtPm1tYyk7Ci0JCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJQlVHX09OKGhvc3QgPT0gTlVMTCk7CiAKLQkJaWYgKGhvc3QtPnBvd2VyX3BpbiA+PSAwKQotCQkJb21hcF9mcmVlX2dwaW8oaG9zdC0+cG93ZXJfcGluKTsKLQkJaWYgKGhvc3QtPnN3aXRjaF9waW4gPj0gMCkgewotCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGVfcG9sbCk7Ci0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2NvdmVyX3N3aXRjaCk7Ci0JCQlmcmVlX2lycShPTUFQX0dQSU9fSVJRKGhvc3QtPnN3aXRjaF9waW4pLCBob3N0KTsKLQkJCW9tYXBfZnJlZV9ncGlvKGhvc3QtPnN3aXRjaF9waW4pOwotCQkJaG9zdC0+c3dpdGNoX3BpbiA9IC0xOwotCQkJZGVsX3RpbWVyX3N5bmMoJmhvc3QtPnN3aXRjaF90aW1lcik7Ci0JCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCQl9Ci0JCWlmIChob3N0LT5pY2xrICYmICFJU19FUlIoaG9zdC0+aWNsaykpCi0JCQljbGtfcHV0KGhvc3QtPmljbGspOwotCQlpZiAoaG9zdC0+ZmNsayAmJiAhSVNfRVJSKGhvc3QtPmZjbGspKQotCQkJY2xrX3B1dChob3N0LT5mY2xrKTsKLQkJbW1jX2ZyZWVfaG9zdChob3N0LT5tbWMpOworCW1tY19yZW1vdmVfaG9zdChob3N0LT5tbWMpOworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisKKwlpZiAoaG9zdC0+cG93ZXJfcGluID49IDApCisJCW9tYXBfZnJlZV9ncGlvKGhvc3QtPnBvd2VyX3Bpbik7CisJaWYgKGhvc3QtPnN3aXRjaF9waW4gPj0gMCkgeworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZV9wb2xsKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jb3Zlcl9zd2l0Y2gpOworCQlmcmVlX2lycShPTUFQX0dQSU9fSVJRKGhvc3QtPnN3aXRjaF9waW4pLCBob3N0KTsKKwkJb21hcF9mcmVlX2dwaW8oaG9zdC0+c3dpdGNoX3Bpbik7CisJCWhvc3QtPnN3aXRjaF9waW4gPSAtMTsKKwkJZGVsX3RpbWVyX3N5bmMoJmhvc3QtPnN3aXRjaF90aW1lcik7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJfQorCWlmIChob3N0LT5pY2xrICYmICFJU19FUlIoaG9zdC0+aWNsaykpCisJCWNsa19wdXQoaG9zdC0+aWNsayk7CisJaWYgKGhvc3QtPmZjbGsgJiYgIUlTX0VSUihob3N0LT5mY2xrKSkKKwkJY2xrX3B1dChob3N0LT5mY2xrKTsKIAogCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwKLQkJCXBkZXYtPnJlc291cmNlWzBdLmVuZCAtIHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0ICsgMSk7CisJCQkgICBwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEpOworCisJbW1jX2ZyZWVfaG9zdChob3N0LT5tbWMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9vbWFwLmggYi9kcml2ZXJzL21tYy9vbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTRkMzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tbWMvb21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotI2lmbmRlZglEUklWRVJTX01FRElBX01NQ19PTUFQX0gKLSNkZWZpbmUJRFJJVkVSU19NRURJQV9NTUNfT01BUF9ICi0KLSNkZWZpbmUJT01BUF9NTUNfUkVHX0NNRAkweDAwCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19BUkdMCTB4MDQKLSNkZWZpbmUJT01BUF9NTUNfUkVHX0FSR0gJMHgwOAotI2RlZmluZQlPTUFQX01NQ19SRUdfQ09OCTB4MGMKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1NUQVQJMHgxMAotI2RlZmluZQlPTUFQX01NQ19SRUdfSUUJCTB4MTQKLSNkZWZpbmUJT01BUF9NTUNfUkVHX0NUTwkweDE4Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19EVE8JMHgxYwotI2RlZmluZQlPTUFQX01NQ19SRUdfREFUQQkweDIwCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19CTEVOCTB4MjQKLSNkZWZpbmUJT01BUF9NTUNfUkVHX05CTEsJMHgyOAotI2RlZmluZQlPTUFQX01NQ19SRUdfQlVGCTB4MmMKLSNkZWZpbmUgT01BUF9NTUNfUkVHX1NESU8JMHgzNAotI2RlZmluZQlPTUFQX01NQ19SRUdfUkVWCTB4M2MKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDAJMHg0MAotI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQMQkweDQ0Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19SU1AyCTB4NDgKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDMJMHg0YwotI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQNAkweDUwCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19SU1A1CTB4NTQKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDYJMHg1OAotI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQNwkweDVjCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19JT1NSCTB4NjAKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1NZU0MJMHg2NAotI2RlZmluZQlPTUFQX01NQ19SRUdfU1lTUwkweDY4Ci0KLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9DQVJEX0VSUgkJKDEgPDwgMTQpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfQ0FSRF9JUlEJCSgxIDw8IDEzKQotI2RlZmluZQlPTUFQX01NQ19TVEFUX09DUl9CVVNZCQkoMSA8PCAxMikKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9BX0VNUFRZCQkoMSA8PCAxMSkKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9BX0ZVTEwJCSgxIDw8IDEwKQotI2RlZmluZQlPTUFQX01NQ19TVEFUX0NNRF9DUkMJCSgxIDw8ICA4KQotI2RlZmluZQlPTUFQX01NQ19TVEFUX0NNRF9UT1VUCQkoMSA8PCAgNykKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9EQVRBX0NSQwkJKDEgPDwgIDYpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfREFUQV9UT1VUCQkoMSA8PCAgNSkKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9FTkRfQlVTWQkJKDEgPDwgIDQpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfRU5EX09GX0RBVEEJKDEgPDwgIDMpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfQ0FSRF9CVVNZCQkoMSA8PCAgMikKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9FTkRfT0ZfQ01ECSgxIDw8ICAwKQotCi0jZGVmaW5lIE9NQVBfTU1DX1JFQUQoYmFzZSwgcmVnKQlfX3Jhd19yZWFkdygoYmFzZSkgKyBPTUFQX01NQ19SRUdfIyNyZWcpCi0jZGVmaW5lIE9NQVBfTU1DX1dSSVRFKGJhc2UsIHJlZywgdmFsKQlfX3Jhd193cml0ZXcoKHZhbCksIChiYXNlKSArIE9NQVBfTU1DX1JFR18jI3JlZykKLQotLyoKLSAqIENvbW1hbmQgdHlwZXMKLSAqLwotI2RlZmluZSBPTUFQX01NQ19DTURUWVBFX0JDCTAKLSNkZWZpbmUgT01BUF9NTUNfQ01EVFlQRV9CQ1IJMQotI2RlZmluZSBPTUFQX01NQ19DTURUWVBFX0FDCTIKLSNkZWZpbmUgT01BUF9NTUNfQ01EVFlQRV9BRFRDCTMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9weGFtY2kuYyBiL2RyaXZlcnMvbW1jL3B4YW1jaS5jCmluZGV4IGE1MjY2OTguLjQ3MWU5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL3B4YW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL3B4YW1jaS5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIAkJIGhvc3QtPmNsa3J0LCBob3N0LT5jbWRhdCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHB4YW1jaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBweGFtY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gcHhhbWNpX3JlcXVlc3QsCiAJLmdldF9ybwkJPSBweGFtY2lfZ2V0X3JvLAogCS5zZXRfaW9zCT0gcHhhbWNpX3NldF9pb3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9zZGhjaS5jIGIvZHJpdmVycy9tbWMvc2RoY2kuYwppbmRleCA5YTdkMzliLi5jZDk4MTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9zZGhjaS5jCisrKyBiL2RyaXZlcnMvbW1jL3NkaGNpLmMKQEAgLTYxNiw2ICs2MTYsNyBAQAogc3RhdGljIHZvaWQgc2RoY2lfc2V0X2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgY2xvY2spCiB7CiAJaW50IGRpdjsKKwl1OCBjdHJsOwogCXUxNiBjbGs7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCkBAIC02MjQsNiArNjI1LDEzIEBACiAKIAl3cml0ZXcoMCwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfQ0xPQ0tfQ09OVFJPTCk7CiAKKwljdHJsID0gcmVhZGIoaG9zdC0+aW9hZGRyICsgU0RIQ0lfSE9TVF9DT05UUk9MKTsKKwlpZiAoY2xvY2sgPiAyNTAwMDAwMCkKKwkJY3RybCB8PSBTREhDSV9DVFJMX0hJU1BEOworCWVsc2UKKwkJY3RybCAmPSB+U0RIQ0lfQ1RSTF9ISVNQRDsKKwl3cml0ZWIoY3RybCwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfSE9TVF9DT05UUk9MKTsKKwogCWlmIChjbG9jayA9PSAwKQogCQlnb3RvIG91dDsKIApAQCAtNzg0LDcgKzc5Miw3IEBACiAJcmV0dXJuICEocHJlc2VudCAmIFNESENJX1dSSVRFX1BST1RFQ1QpOwogfQogCi1zdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBzZGhjaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBzZGhjaV9vcHMgPSB7CiAJLnJlcXVlc3QJPSBzZGhjaV9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gc2RoY2lfc2V0X2lvcywKIAkuZ2V0X3JvCQk9IHNkaGNpX2dldF9ybywKQEAgLTEyOTEsNiArMTI5OSwxMyBAQAogCWVsc2UgaWYgKGNhcHMgJiBTREhDSV9DQU5fVkREXzE4MCkKIAkJbW1jLT5vY3JfYXZhaWwgfD0gTU1DX1ZERF8xN18xOHxNTUNfVkREXzE4XzE5OwogCisJaWYgKChob3N0LT5tYXhfY2xrID4gMjUwMDAwMDApICYmICEoY2FwcyAmIFNESENJX0NBTl9ET19ISVNQRCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29udHJvbGxlciByZXBvcnRzID4gMjUgTUh6IGJhc2UgY2xvY2ssIgorCQkJIiBidXQgbm8gaGlnaCBzcGVlZCBzdXBwb3J0LlxuIiwKKwkJCWhvc3QtPnNsb3RfZGVzY3IpOworCQltbWMtPmZfbWF4ID0gMjUwMDAwMDA7CisJfQorCiAJaWYgKG1tYy0+b2NyX2F2YWlsID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZG9lc24ndCByZXBvcnQgYW55ICIKIAkJCSJzdXBwb3J0IHZvbHRhZ2VzLlxuIiwgaG9zdC0+c2xvdF9kZXNjcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9zZGhjaS5oIGIvZHJpdmVycy9tbWMvc2RoY2kuaAppbmRleCA3MmE2NzkzLi5mOWQxYTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9zZGhjaS5oCisrKyBiL2RyaXZlcnMvbW1jL3NkaGNpLmgKQEAgLTcxLDYgKzcxLDcgQEAKICNkZWZpbmUgU0RIQ0lfSE9TVF9DT05UUk9MIAkweDI4CiAjZGVmaW5lICBTREhDSV9DVFJMX0xFRAkJMHgwMQogI2RlZmluZSAgU0RIQ0lfQ1RSTF80QklUQlVTCTB4MDIKKyNkZWZpbmUgIFNESENJX0NUUkxfSElTUEQJMHgwNAogCiAjZGVmaW5lIFNESENJX1BPV0VSX0NPTlRST0wJMHgyOQogI2RlZmluZSAgU0RIQ0lfUE9XRVJfT04JCTB4MDEKQEAgLTEzOCw2ICsxMzksNyBAQAogI2RlZmluZSAgU0RIQ0lfQ0xPQ0tfQkFTRV9TSElGVAk4CiAjZGVmaW5lICBTREhDSV9NQVhfQkxPQ0tfTUFTSwkweDAwMDMwMDAwCiAjZGVmaW5lICBTREhDSV9NQVhfQkxPQ0tfU0hJRlQgIDE2CisjZGVmaW5lICBTREhDSV9DQU5fRE9fSElTUEQJMHgwMDIwMDAwMAogI2RlZmluZSAgU0RIQ0lfQ0FOX0RPX0RNQQkweDAwNDAwMDAwCiAjZGVmaW5lICBTREhDSV9DQU5fVkREXzMzMAkweDAxMDAwMDAwCiAjZGVmaW5lICBTREhDSV9DQU5fVkREXzMwMAkweDAyMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy93YnNkLmMgYi9kcml2ZXJzL21tYy93YnNkLmMKaW5kZXggY2VkMzA5Yi4uN2EyODI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuYwpAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIAlyZXR1cm4gY3NyICYgV0JTRF9XUlBUOwogfQogCi1zdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyB3YnNkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHdic2Rfb3BzID0gewogCS5yZXF1ZXN0CT0gd2JzZF9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gd2JzZF9zZXRfaW9zLAogCS5nZXRfcm8JCT0gd2JzZF9nZXRfcm8sCkBAIC0xNDg4LDcgKzE0ODgsNyBAQAogCS8qCiAJICogVHJhbnNsYXRlIHRoZSBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcy4KIAkgKi8KLQlob3N0LT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYnVmZmVyLAorCWhvc3QtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUobW1jX2Rldihob3N0LT5tbWMpLCBob3N0LT5kbWFfYnVmZmVyLAogCQlXQlNEX0RNQV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CiAKIAkvKgpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIAkgKi8KIAlCVUdfT04oMSk7CiAKLQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwKKwlkbWFfdW5tYXBfc2luZ2xlKG1tY19kZXYoaG9zdC0+bW1jKSwgaG9zdC0+ZG1hX2FkZHIsCiAJCVdCU0RfRE1BX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKIAlob3N0LT5kbWFfYWRkciA9IChkbWFfYWRkcl90KU5VTEw7CiAKQEAgLTE1MzAsNyArMTUzMCw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9yZWxlYXNlX2RtYShzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCWlmIChob3N0LT5kbWFfYWRkcikgewotCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwKKwkJZG1hX3VubWFwX3NpbmdsZShtbWNfZGV2KGhvc3QtPm1tYyksIGhvc3QtPmRtYV9hZGRyLAogCQkJV0JTRF9ETUFfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOwogCX0KIAlrZnJlZShob3N0LT5kbWFfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKaW5kZXggN2VhNDlhMC4uMjk2MTU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKQEAgLTEwODcsNyArMTA4Nyw3IEBACiAJCX0KIAkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAotCQlpZiAoY2hpcC0+c3RhdGUgIT0gY2hpcF9zdGF0ZSkgeworCQl3aGlsZSAoY2hpcC0+c3RhdGUgIT0gY2hpcF9zdGF0ZSkgewogCQkJLyogU29tZW9uZSdzIHN1c3BlbmRlZCB0aGUgb3BlcmF0aW9uOiBzbGVlcCAqLwogCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKaW5kZXggMjQ3NDdiZC4uZDEzMmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwpAQCAtNjA3LDcgKzYwNyw3IEBACiAJZGVmYXVsdCAiNCIKIAogY29uZmlnIE1URF9TSEFSUF9TTAotCWJvb2wgIlJPTSBtYXBlZCBvbiBTaGFycCBTTCBTZXJpZXMiCisJYm9vbCAiUk9NIG1hcHBlZCBvbiBTaGFycCBTTCBTZXJpZXMiCiAJZGVwZW5kcyBvbiBNVEQgJiYgQVJDSF9QWEEKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwIG9uIHRoZSBTaGFycCBTTCBTZXJpZXMgb2YgUERBcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvY2ZpX2ZsYWdhZG0uYyBiL2RyaXZlcnMvbXRkL21hcHMvY2ZpX2ZsYWdhZG0uYwppbmRleCA5MmI1ZDg4Li42NWU1ZWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2NmaV9mbGFnYWRtLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9jZmlfZmxhZ2FkbS5jCkBAIC04MCw3ICs4MCw3IEBACiAJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjJfU0laRQogCX0sCiAJewotCQkubmFtZSA9CQkiUGVyc2lzdGFudCBzdG9yYWdlIiwKKwkJLm5hbWUgPQkJIlBlcnNpc3RlbnQgc3RvcmFnZSIsCiAJCS5vZmZzZXQgPQlGTEFTSF9QQVJUSVRJT04zX0FERFIsCiAJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjNfU0laRQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgzOTAuYyBiL2RyaXZlcnMvbmV0LzgzOTAuYwppbmRleCAzZDFjNTk5Li5hODI4MDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvODM5MC5jCkBAIC0xLDExMDQgKzEsNDAgQEAKLS8qIDgzOTAuYzogQSBnZW5lcmFsIE5TODM5MCBldGhlcm5ldCBkcml2ZXIgY29yZSBmb3IgbGludXguICovCi0vKgotCVdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgotCi0JQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQotCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCi0KLQlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0Jb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLQotCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCi0JU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCi0JNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKLQlBbm5hcG9saXMgTUQgMjE0MDMKLQotCi0gIFRoaXMgaXMgdGhlIGNoaXAtc3BlY2lmaWMgY29kZSBmb3IgbWFueSA4MzkwLWJhc2VkIGV0aGVybmV0IGFkYXB0b3JzLgotICBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGRyaXZlciwgaXQgbXVzdCBiZSBjb21iaW5lZCB3aXRoIGJvYXJkLXNwZWNpZmljCi0gIGNvZGUgc3VjaCBhcyBuZS5jLCB3ZC5jLCAzYzUwMy5jLCBldGMuCi0KLSAgU2VlaW5nIGhvdyBhdCBsZWFzdCBlaWdodCBkcml2ZXJzIHVzZSB0aGlzIGNvZGUsIChub3QgY291bnRpbmcgdGhlCi0gIFBDTUNJQSBvbmVzIGVpdGhlcikgaXQgaXMgZWFzeSB0byBicmVhayBzb21lIGNhcmQgYnkgd2hhdCBzZWVtcyBsaWtlCi0gIGEgc2ltcGxlIGlubm9jZW50IGNoYW5nZS4gUGxlYXNlIGNvbnRhY3QgbWUgb3IgRG9uYWxkIGlmIHlvdSB0aGluawotICB5b3UgaGF2ZSBmb3VuZCBzb21ldGhpbmcgdGhhdCBuZWVkcyBjaGFuZ2luZy4gLS0gUEcKLQotCi0gIENoYW5nZWxvZzoKLQotICBQYXVsIEdvcnRtYWtlcgk6IHJlbW92ZSBzZXRfYml0IGxvY2ssIG90aGVyIGNsZWFudXBzLgotICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBlaV9nZXRfODM5MF9oZHIoKSBzbyB3ZSBjYW4gcGFzcyBza2IncyB0bwotCQkJICBlaV9ibG9ja19pbnB1dCgpIGZvciBldGhfaW9fY29weV9hbmRfc3VtKCkuCi0gIFBhdWwgR29ydG1ha2VyCTogZXhjaGFuZ2Ugc3RhdGljIGludCBlaV9waW5ncG9uZyBmb3IgYSAjZGVmaW5lLAotCQkJICBhbHNvIGFkZCBiZXR0ZXIgVHggZXJyb3IgaGFuZGxpbmcuCi0gIFBhdWwgR29ydG1ha2VyCTogcmV3cml0ZSBSeCBvdmVycnVuIGhhbmRsaW5nIGFzIHBlciBOUyBzcGVjcy4KLSAgQWxleGV5IEt1em5ldHNvdgk6IHVzZSB0aGUgODM5MCdzIHNpeCBiaXQgaGFzaCBtdWx0aWNhc3QgZmlsdGVyLgotICBQYXVsIEdvcnRtYWtlcgk6IHR3ZWFrIEFOSydzIGFib3ZlIG11bHRpY2FzdCBjaGFuZ2VzIGEgYml0LgotICBQYXVsIEdvcnRtYWtlcgk6IHVwZGF0ZSBwYWNrZXQgc3RhdGlzdGljcyBmb3IgdjIuMS54Ci0gIEFsYW4gQ294CQk6IHN1cHBvcnQgYXJiaXRhcnkgc3R1cGlkIHBvcnQgbWFwcGluZ3Mgb24gdGhlCi0gIAkJCSAgNjhLIE1hY2ludG9zaC4gU3VwcG9ydCA+MTZiaXQgSS9PIHNwYWNlcwotICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBrbW9kIHN1cHBvcnQgZm9yIGF1dG8tbG9hZGluZyBvZiB0aGUgODM5MAotCQkJICBtb2R1bGUgYnkgYWxsIGRyaXZlcnMgdGhhdCByZXF1aXJlIGl0LgotICBBbGFuIENveAkJOiBTcGlubG9ja2luZyB3b3JrLCBhZGRlZCAnQlVHXzgzQzY5MCcKLSAgUGF1bCBHb3J0bWFrZXIJOiBTZXBhcmF0ZSBvdXQgVHggdGltZW91dCBjb2RlIGZyb20gVHggcGF0aC4KLSAgUGF1bCBHb3J0bWFrZXIJOiBSZW1vdmUgb2xkIHVudXNlZCBzaW5nbGUgVHggYnVmZmVyIGNvZGUuCi0gIEhheWF0byBGdWppd2FyYQk6IEFkZCBtMzJyIHN1cHBvcnQuCi0gIFBhdWwgR29ydG1ha2VyCTogdXNlIHNrYl9wYWR0bygpIGluc3RlYWQgb2Ygc3RhY2sgc2NyYXRjaCBhcmVhCi0KLSAgU291cmNlczoKLSAgVGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTEFOIERhdGFib29rLCBhbmQgdGhlIDNDb20gM2M1MDMgZGF0YWJvb2suCi0KLSAgKi8KKy8qIDgzOTAgY29yZSBmb3IgdXN1YWwgZHJpdmVycyAqLwogCiBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQogICAgICI4MzkwLmM6djEuMTBjdnMgOS8yMy85NCBEb25hbGQgQmVja2VyIChiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3YpXG4iOwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlICJsaWI4MzkwLmMiCiAKLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotCi0jZGVmaW5lIE5TODM5MF9DT1JFCi0jaW5jbHVkZSAiODM5MC5oIgotCi0jZGVmaW5lIEJVR184M0M2OTAKLQotLyogVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25hbCBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIGJvYXJkLXNwZWNpZmljCi0gICByb3V0aW5lcy4KLQl2b2lkIHJlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLQkJUmVzZXRzIHRoZSBib2FyZCBhc3NvY2lhdGVkIHdpdGggREVWLCBpbmNsdWRpbmcgYSBoYXJkd2FyZSByZXNldCBvZgotCQl0aGUgODM5MC4gIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHRyYW5zbWl0IHRpbWVvdXQsIGFuZAotCQlpdCBpcyBhbHdheXMgZm9sbG93ZWQgYnkgODM5MF9pbml0KCkuCi0Jdm9pZCBibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkJCSAgaW50IHN0YXJ0X3BhZ2UpCi0JCVdyaXRlIHRoZSBDT1VOVCBieXRlcyBvZiBCVUYgdG8gdGhlIHBhY2tldCBidWZmZXIgYXQgU1RBUlRfUEFHRS4gIFRoZQotCQkicGFnZSIgdmFsdWUgdXNlcyB0aGUgODM5MCdzIDI1Ni1ieXRlIHBhZ2VzLgotCXZvaWQgZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKLQkJUmVhZCB0aGUgNCBieXRlLCBwYWdlIGFsaWduZWQgODM5MCBoZWFkZXIuICpJZiogdGhlcmUgaXMgYQotCQlzdWJzZXF1ZW50IHJlYWQsIGl0IHdpbGwgYmUgb2YgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldC4KLQl2b2lkIGJsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQotCQlSZWFkIENPVU5UIGJ5dGVzIGZyb20gdGhlIHBhY2tldCBidWZmZXIgaW50byB0aGUgc2tiIGRhdGEgYXJlYS4gU3RhcnQKLQkJcmVhZGluZyBmcm9tIFJJTkdfT0ZGU0VULCB0aGUgYWRkcmVzcyBhcyB0aGUgODM5MCBzZWVzIGl0LiAgVGhpcyB3aWxsIGFsd2F5cwotCQlmb2xsb3cgdGhlIHJlYWQgb2YgdGhlIDgzOTAgaGVhZGVyLgotKi8KLSNkZWZpbmUgZWlfcmVzZXRfODM5MCAoZWlfbG9jYWwtPnJlc2V0XzgzOTApCi0jZGVmaW5lIGVpX2Jsb2NrX291dHB1dCAoZWlfbG9jYWwtPmJsb2NrX291dHB1dCkKLSNkZWZpbmUgZWlfYmxvY2tfaW5wdXQgKGVpX2xvY2FsLT5ibG9ja19pbnB1dCkKLSNkZWZpbmUgZWlfZ2V0XzgzOTBfaGRyIChlaV9sb2NhbC0+Z2V0XzgzOTBfaGRyKQotCi0vKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KLSNpZm5kZWYgZWlfZGVidWcKLWludCBlaV9kZWJ1ZyA9IDE7Ci0jZW5kaWYKLQotLyogSW5kZXggdG8gZnVuY3Rpb25zLiAqLwotc3RhdGljIHZvaWQgZWlfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGVpX3R4X2VycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgZWlfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotLyogUm91dGluZXMgZ2VuZXJpYyB0byBOUzgzOTAtYmFzZWQgYm9hcmRzLiAqLwotc3RhdGljIHZvaWQgTlM4MzkwX3RyaWdnZXJfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAotCQkJCQkJCQlpbnQgc3RhcnRfcGFnZSk7Ci1zdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBkb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLS8qCi0gKglTTVAgYW5kIHRoZSA4MzkwIHNldHVwLgotICoKLSAqCVRoZSA4MzkwIGlzbnQgZXhhY3RseSBkZXNpZ25lZCB0byBiZSBtdWx0aXRocmVhZGVkIG9uIFJYL1RYLiBUaGVyZSBpcwotICoJYSBwYWdlIHJlZ2lzdGVyIHRoYXQgY29udHJvbHMgYmFuayBhbmQgcGFja2V0IGJ1ZmZlciBhY2Nlc3MuIFdlIGd1YXJkCi0gKgl0aGlzIHdpdGggZWlfbG9jYWwtPnBhZ2VfbG9jay4gTm9ib2R5IHNob3VsZCBhc3N1bWUgb3Igc2V0IHRoZSBwYWdlIG90aGVyCi0gKgl0aGFuIHplcm8gd2hlbiB0aGUgbG9jayBpcyBub3QgaGVsZC4gTG9jayBob2xkZXJzIG11c3QgcmVzdG9yZSBwYWdlIDAKLSAqCWJlZm9yZSB1bmxvY2tpbmcuIEV2ZW4gcHVyZSByZWFkZXJzIG11c3QgdGFrZSB0aGUgbG9jayB0byBwcm90ZWN0IGluCi0gKglwYWdlIDAuCi0gKgotICoJVG8gbWFrZSBsaWZlIGRpZmZpY3VsdCB0aGUgY2hpcCBjYW4gYWxzbyBiZSB2ZXJ5IHNsb3cuIFdlIHRoZXJlZm9yZSBjYW4ndAotICoJanVzdCB1c2Ugc3BpbmxvY2tzLiBGb3IgdGhlIGxvbmdlciBsb2NrdXBzIHdlIGRpc2FibGUgdGhlIGlycSB0aGUgZGV2aWNlCi0gKglzaXRzIG9uIGFuZCBob2xkIHRoZSBsb2NrLiBXZSBtdXN0IGhvbGQgdGhlIGxvY2sgYmVjYXVzZSB0aGVyZSBpcyBhIGR1YWwKLSAqCXByb2Nlc3NvciBjYXNlIG90aGVyIHRoYW4gaW50ZXJydXB0cyAoZ2V0IHN0YXRzL3NldCBtdWx0aWNhc3QgbGlzdCBpbgotICoJcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyIGFuZCB0cmFuc21pdCkuCi0gKgotICoJTm90ZTogaW4gdGhlb3J5IHdlIGNhbiBqdXN0IGRpc2FibGUgdGhlIGlycSBvbiB0aGUgY2FyZCBfYnV0XyB0aGVyZSBpcwotICoJYSBsYXRlbmN5IG9uIFNNUCBpcnEgZGVsaXZlcnkuIFNvIHdlIGNhbiBlYXNpbHkgZ28gImRpc2FibGUgaXJxIiAic3luYyBpcnFzIgotICoJZW50ZXIgbG9jaywgdGFrZSB0aGUgcXVldWVkIGlycS4gU28gd2Ugd2FkZGxlIGluc3RlYWQgb2YgZmx5aW5nLgotICoKLSAqCUZpbmFsbHkgYnkgc3BlY2lhbCBhcnJhbmdlbWVudCBmb3IgdGhlIHB1cnBvc2Ugb2YgYmVpbmcgZ2VuZXJhbGx5Ci0gKglhbm5veWluZyB0aGUgdHJhbnNtaXQgZnVuY3Rpb24gaXMgY2FsbGVkIGJoIGF0b21pYy4gVGhhdCBwbGFjZXMKLSAqCXJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlciBjb250ZXh0IGNhbGxlcnMgYXMgZGlzYWJsZV9pcnEgd29uJ3Qgc2F2ZQotICoJdGhlbS4KLSAqLwotCi0KLQotLyoqCi0gKiBlaV9vcGVuIC0gT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4KLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGluaXRpYWxpemUKLSAqCi0gKiBUaGlzIHJvdXRpbmUgZ29lcyBhbGwtb3V0LCBzZXR0aW5nIGV2ZXJ5dGhpbmcKLSAqIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuIHRob3VnaCBtYW55IG9mIHRoZXNlIHJlZ2lzdGVycyBzaG91bGQgb25seQotICogbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LgotICovCiBpbnQgZWlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCi0JLyogVGhlIGNhcmQgSS9PIHBhcnQgb2YgdGhlIGRyaXZlciAoZS5nLiAzYzUwMykgY2FuIGhvb2sgYSBUeCB0aW1lb3V0Ci0JICAgIHdyYXBwZXIgdGhhdCBkb2VzIGUuZy4gbWVkaWEgY2hlY2sgJiB0aGVuIGNhbGxzIGVpX3R4X3RpbWVvdXQuICovCi0JaWYgKGRldi0+dHhfdGltZW91dCA9PSBOVUxMKQotCQkgZGV2LT50eF90aW1lb3V0ID0gZWlfdHhfdGltZW91dDsKLQlpZiAoZGV2LT53YXRjaGRvZ190aW1lbyA8PSAwKQotCQkgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0KLQkvKgotCSAqCUdyYWIgdGhlIHBhZ2UgbG9jayBzbyB3ZSBvd24gdGhlIHJlZ2lzdGVyIHNldCwgdGhlbiBjYWxsCi0JICoJdGhlIGluaXQgZnVuY3Rpb24uCi0JICovCi0KLSAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCU5TODM5MF9pbml0KGRldiwgMSk7Ci0JLyogU2V0IHRoZSBmbGFnIGJlZm9yZSB3ZSBkcm9wIHRoZSBsb2NrLCBUaGF0IHdheSB0aGUgSVJRIGFycml2ZXMKLQkgICBhZnRlciBpdHMgc2V0IGFuZCB3ZSBnZXQgbm8gc2lsbHkgd2FybmluZ3MgKi8KLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLQllaV9sb2NhbC0+aXJxbG9jayA9IDA7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIF9fZWlfb3BlbihkZXYpOwogfQogCi0vKioKLSAqIGVpX2Nsb3NlIC0gc2h1dCBkb3duIG5ldHdvcmsgZGV2aWNlCi0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBjbG9zZQotICoKLSAqIE9wcG9zaXRlIG9mIGVpX29wZW4oKS4gT25seSB1c2VkIHdoZW4gImlmY29uZmlnIDxkZXZuYW1lPiBkb3duIiBpcyBkb25lLgotICovCiBpbnQgZWlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICoJSG9sZCB0aGUgcGFnZSBsb2NrIGR1cmluZyBjbG9zZQotCSAqLwotCi0gICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLQlOUzgzOTBfaW5pdChkZXYsIDApOwotICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIF9fZWlfY2xvc2UoZGV2KTsKIH0KIAotLyoqCi0gKiBlaV90eF90aW1lb3V0IC0gaGFuZGxlIHRyYW5zbWl0IHRpbWUgb3V0IGNvbmRpdGlvbgotICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggaGFzIGFwcGFyZW50bHkgZmFsbGVuIGFzbGVlcAotICoKLSAqIENhbGxlZCBieSBrZXJuZWwgd2hlbiBkZXZpY2UgbmV2ZXIgYWNrbm93bGVkZ2VzIGEgdHJhbnNtaXQgaGFzCi0gKiBjb21wbGV0ZWQgKG9yIGZhaWxlZCkgLSBpLmUuIG5ldmVyIHBvc3RlZCBhIFR4IHJlbGF0ZWQgaW50ZXJydXB0LgotICovCi0KLXZvaWQgZWlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdHhzciwgaXNyLCB0aWNrc3NvZmFyID0gamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotI2lmIGRlZmluZWQoQ09ORklHX00zMlIpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKLQl1bnNpZ25lZCBsb25nIGljdWNyOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWljdWNyID0gaW5sKE0zMlJfSUNVX0NSMV9QT1JUTCk7Ci0JaWN1Y3IgfD0gTTMyUl9JQ1VDUl9JU01PRDExOwotCW91dGwoaWN1Y3IsIE0zMlJfSUNVX0NSMV9QT1JUTCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotI2VuZGlmCi0JZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCXR4c3IgPSBpbmIoZTgzOTBfYmFzZStFTjBfVFNSKTsKLQlpc3IgPSBpbmIoZTgzOTBfYmFzZStFTjBfSVNSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHRpbWVkIG91dCwgJXMgVFNSPSUjMngsIElTUj0lIzJ4LCB0PSVkLlxuIiwKLQkJZGV2LT5uYW1lLCAodHhzciAmIEVOVFNSX0FCVCkgPyAiZXhjZXNzIGNvbGxpc2lvbnMuIiA6Ci0JCShpc3IpID8gImxvc3QgaW50ZXJydXB0PyIgOiAiY2FibGUgcHJvYmxlbT8iLCB0eHNyLCBpc3IsIHRpY2tzc29mYXIpOwotCi0JaWYgKCFpc3IgJiYgIWVpX2xvY2FsLT5zdGF0LnR4X3BhY2tldHMpCi0JewotCQkvKiBUaGUgODM5MCBwcm9iYWJseSBoYXNuJ3QgZ290dGVuIG9uIHRoZSBjYWJsZSB5ZXQuICovCi0JCWVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtIF49IDE7ICAgLyogVHJ5IGEgZGlmZmVyZW50IHhjdnIuICAqLwotCX0KLQotCS8qIFVnbHkgYnV0IGEgcmVzZXQgY2FuIGJlIHNsb3csIHlldCBtdXN0IGJlIHByb3RlY3RlZCAqLwotCi0JZGlzYWJsZV9pcnFfbm9zeW5jX2xvY2tkZXAoZGV2LT5pcnEpOwotCXNwaW5fbG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci0KLQkvKiBUcnkgdG8gcmVzdGFydCB0aGUgY2FyZC4gIFBlcmhhcHMgdGhlIHVzZXIgaGFzIGZpeGVkIHNvbWV0aGluZy4gKi8KLQllaV9yZXNldF84MzkwKGRldik7Ci0JTlM4MzkwX2luaXQoZGV2LCAxKTsKLQotCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQllbmFibGVfaXJxX2xvY2tkZXAoZGV2LT5pcnEpOwotCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLX0KLQotLyoqCi0gKiBlaV9zdGFydF94bWl0IC0gYmVnaW4gcGFja2V0IHRyYW5zbWlzc2lvbgotICogQHNrYjogcGFja2V0IHRvIGJlIHNlbnQKLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIHdoaWNoIHBhY2tldCBpcyBzZW50Ci0gKgotICogU2VuZHMgYSBwYWNrZXQgdG8gYW4gODM5MCBuZXR3b3JrIGRldmljZS4KLSAqLwotCi1zdGF0aWMgaW50IGVpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JaW50IHNlbmRfbGVuZ3RoID0gc2tiLT5sZW4sIG91dHB1dF9wYWdlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY2hhciBidWZbRVRIX1pMRU5dOwotCWNoYXIgKmRhdGEgPSBza2ItPmRhdGE7Ci0KLQlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewotCQltZW1zZXQoYnVmLCAwLCBFVEhfWkxFTik7CS8qIG1vcmUgZWZmaWNpZW50IHRoYW4gZG9pbmcganVzdCB0aGUgbmVlZGVkIGJpdHMgKi8KLQkJbWVtY3B5KGJ1ZiwgZGF0YSwgc2tiLT5sZW4pOwotCQlzZW5kX2xlbmd0aCA9IEVUSF9aTEVOOwotCQlkYXRhID0gYnVmOwotCX0KLQotCS8qIE1hc2sgaW50ZXJydXB0cyBmcm9tIHRoZSBldGhlcmNhcmQuCi0JICAgU01QOiBXZSBoYXZlIHRvIGdyYWIgdGhlIGxvY2sgaGVyZSBvdGhlcndpc2UgdGhlIElSUSBoYW5kbGVyCi0JICAgb24gYW5vdGhlciBDUFUgY2FuIGZsaXAgd2luZG93IGFuZCByYWNlIHRoZSBJUlEgbWFzayBzZXQuIFdlIGVuZAotCSAgIHVwIHRyYXNoaW5nIHRoZSBtY2FzdCBmaWx0ZXIgbm90IGRpc2FibGluZyBpcnFzIGlmIHdlIGRvbid0IGxvY2sgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0Jb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0KLQotCS8qCi0JICoJU2xvdyBwaGFzZSB3aXRoIGxvY2sgaGVsZC4KLQkgKi8KLQotCWRpc2FibGVfaXJxX25vc3luY19sb2NrZGVwX2lycXNhdmUoZGV2LT5pcnEsICZmbGFncyk7Ci0KLQlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwotCi0JZWlfbG9jYWwtPmlycWxvY2sgPSAxOwotCi0JLyoKLQkgKiBXZSBoYXZlIHR3byBUeCBzbG90cyBhdmFpbGFibGUgZm9yIHVzZS4gRmluZCB0aGUgZmlyc3QgZnJlZQotCSAqIHNsb3QsIGFuZCB0aGVuIHBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLiBXaXRoIHR3byBUeCBidWZzLAotCSAqIHlvdSBnZXQgdmVyeSBjbG9zZSB0byB0cmFuc21pdHRpbmcgYmFjay10by1iYWNrIHBhY2tldHMuIFdpdGgKLQkgKiBvbmx5IG9uZSBUeCBidWYsIHRoZSB0cmFuc21pdHRlciBzaXRzIGlkbGUgd2hpbGUgeW91IHJlbG9hZCB0aGUKLQkgKiBjYXJkLCBsZWF2aW5nIGEgc3Vic3RhbnRpYWwgZ2FwIGJldHdlZW4gZWFjaCB0cmFuc21pdHRlZCBwYWNrZXQuCi0JICovCi0KLQlpZiAoZWlfbG9jYWwtPnR4MSA9PSAwKQotCXsKLQkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZTsKLQkJZWlfbG9jYWwtPnR4MSA9IHNlbmRfbGVuZ3RoOwotCQlpZiAoZWlfZGVidWcgICYmICBlaV9sb2NhbC0+dHgyID4gMCkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaWRsZSB0cmFuc21pdHRlciB0eDI9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAotCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKLQl9Ci0JZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA9PSAwKQotCXsKLQkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIFRYX1BBR0VTLzI7Ci0JCWVpX2xvY2FsLT50eDIgPSBzZW5kX2xlbmd0aDsKLQkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MSA+IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIsIHR4MT0lZCwgbGFzdHR4PSVkLCB0eGluZz0lZC5cbiIsCi0JCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHhpbmcpOwotCX0KLQllbHNlCi0JewkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuICovCi0JCWlmIChlaV9kZWJ1ZykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gVHggYnVmZmVycyBmcmVlISB0eDE9JWQgdHgyPSVkIGxhc3Q9JWRcbiIsCi0JCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+dHgyLCBlaV9sb2NhbC0+bGFzdHR4KTsKLQkJZWlfbG9jYWwtPmlycWxvY2sgPSAwOwotCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKLQkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwotCQllbmFibGVfaXJxX2xvY2tkZXBfaXJxcmVzdG9yZShkZXYtPmlycSwgJmZsYWdzKTsKLQkJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qCi0JICogT2theSwgbm93IHVwbG9hZCB0aGUgcGFja2V0IGFuZCB0cmlnZ2VyIGEgc2VuZCBpZiB0aGUgdHJhbnNtaXR0ZXIKLQkgKiBpc24ndCBhbHJlYWR5IHNlbmRpbmcuIElmIGl0IGlzIGJ1c3ksIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsCi0JICogdHJpZ2dlciB0aGUgc2VuZCBsYXRlciwgdXBvbiByZWNlaXZpbmcgYSBUeCBkb25lIGludGVycnVwdC4KLQkgKi8KLQotCWVpX2Jsb2NrX291dHB1dChkZXYsIHNlbmRfbGVuZ3RoLCBkYXRhLCBvdXRwdXRfcGFnZSk7Ci0KLQlpZiAoISBlaV9sb2NhbC0+dHhpbmcpCi0JewotCQllaV9sb2NhbC0+dHhpbmcgPSAxOwotCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgc2VuZF9sZW5ndGgsIG91dHB1dF9wYWdlKTsKLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWlmIChvdXRwdXRfcGFnZSA9PSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSkKLQkJewotCQkJZWlfbG9jYWwtPnR4MSA9IC0xOwotCQkJZWlfbG9jYWwtPmxhc3R0eCA9IC0xOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZWlfbG9jYWwtPnR4MiA9IC0xOwotCQkJZWlfbG9jYWwtPmxhc3R0eCA9IC0yOwotCQl9Ci0JfQotCWVsc2UgZWlfbG9jYWwtPnR4cXVldWUrKzsKLQotCWlmIChlaV9sb2NhbC0+dHgxICAmJiAgZWlfbG9jYWwtPnR4MikKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCWVsc2UKLQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQotCS8qIFR1cm4gODM5MCBpbnRlcnJ1cHRzIGJhY2sgb24uICovCi0JZWlfbG9jYWwtPmlycWxvY2sgPSAwOwotCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKLQotCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQllbmFibGVfaXJxX2xvY2tkZXBfaXJxcmVzdG9yZShkZXYtPmlycSwgJmZsYWdzKTsKLQotCWRldl9rZnJlZV9za2IgKHNrYik7Ci0JZWlfbG9jYWwtPnN0YXQudHhfYnl0ZXMgKz0gc2VuZF9sZW5ndGg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBlaV9pbnRlcnJ1cHQgLSBoYW5kbGUgdGhlIGludGVycnVwdHMgZnJvbSBhbiA4MzkwCi0gKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAZGV2X2lkOiBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2UKLSAqCi0gKiBIYW5kbGUgdGhlIGV0aGVyIGludGVyZmFjZSBpbnRlcnJ1cHRzLiBXZSBwdWxsIHBhY2tldHMgZnJvbQotICogdGhlIDgzOTAgdmlhIHRoZSBjYXJkIHNwZWNpZmljIGZ1bmN0aW9ucyBhbmQgZmlyZSB0aGVtIGF0IHRoZSBuZXR3b3JraW5nCi0gKiBzdGFjay4gV2UgYWxzbyBoYW5kbGUgdHJhbnNtaXQgY29tcGxldGlvbnMgYW5kIHdha2UgdGhlIHRyYW5zbWl0IHBhdGggaWYKLSAqIG5lY2Vzc2FyeS4gV2UgYWxzbyB1cGRhdGUgdGhlIGNvdW50ZXJzIGFuZCBkbyBvdGhlciBob3VzZWtlZXBpbmcgYXMKLSAqIG5lZWRlZC4KLSAqLwotCiBpcnFyZXR1cm5fdCBlaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7Ci0JbG9uZyBlODM5MF9iYXNlOwotCWludCBpbnRlcnJ1cHRzLCBucl9zZXJ2aWNlZCA9IDA7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWw7Ci0KLQllODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7Ci0JZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JLyoKLQkgKglQcm90ZWN0IHRoZSBpcnEgdGVzdCB0b28uCi0JICovCi0KLQlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwotCi0JaWYgKGVpX2xvY2FsLT5pcnFsb2NrKQotCXsKLSNpZiAxIC8qIFRoaXMgbWlnaHQganVzdCBiZSBhbiBpbnRlcnJ1cHQgZm9yIGEgUENJIGRldmljZSBzaGFyaW5nIHRoaXMgbGluZSAqLwotCQkvKiBUaGUgImlycWxvY2siIGNoZWNrIGlzIG9ubHkgZm9yIHRlc3RpbmcuICovCi0JCXByaW50ayhlaV9sb2NhbC0+aXJxbG9jawotCQkJICAgPyAiJXM6IEludGVycnVwdGVkIHdoaWxlIGludGVycnVwdHMgYXJlIG1hc2tlZCEgaXNyPSUjMnggaW1yPSUjMnguXG4iCi0JCQkgICA6ICIlczogUmVlbnRlcmluZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIiwKLQkJCSAgIGRldi0+bmFtZSwgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpLAotCQkJICAgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JTVIpKTsKLSNlbmRpZgotCQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQkvKiBDaGFuZ2UgdG8gcGFnZSAwIGFuZCByZWFkIHRoZSBpbnRyIHN0YXR1cyByZWcuICovCi0Jb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKLQlpZiAoZWlfZGVidWcgPiAzKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdChpc3I9JSMyLjJ4KS5cbiIsIGRldi0+bmFtZSwKLQkJCSAgIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSk7Ci0KLQkvKiAhIUFzc3VtcHRpb24hISAtLSB3ZSBzdGF5IGluIHBhZ2UgMC4JIERvbid0IGJyZWFrIHRoaXMuICovCi0Jd2hpbGUgKChpbnRlcnJ1cHRzID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKSAhPSAwCi0JCSAgICYmICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkKLQl7Ci0JCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW50ZXJydXB0IGZyb20gc3RvcHBlZCBjYXJkXG4iLCBkZXYtPm5hbWUpOwotCQkJLyogcm1rIC0gYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMgKi8KLQkJCW91dGJfcChpbnRlcnJ1cHRzLCBlODM5MF9iYXNlICsgRU4wX0lTUik7Ci0JCQlpbnRlcnJ1cHRzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfT1ZFUikKLQkJCWVpX3J4X292ZXJydW4oZGV2KTsKLQkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIChFTklTUl9SWCtFTklTUl9SWF9FUlIpKQotCQl7Ci0JCQkvKiBHb3QgYSBnb29kICg/KSBwYWNrZXQuICovCi0JCQllaV9yZWNlaXZlKGRldik7Ci0JCX0KLQkJLyogUHVzaCB0aGUgbmV4dCB0by10cmFuc21pdCBwYWNrZXQgdGhyb3VnaC4gKi8KLQkJaWYgKGludGVycnVwdHMgJiBFTklTUl9UWCkKLQkJCWVpX3R4X2ludHIoZGV2KTsKLQkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIEVOSVNSX1RYX0VSUikKLQkJCWVpX3R4X2VycihkZXYpOwotCi0JCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfQ09VTlRFUlMpCi0JCXsKLQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2ZyYW1lX2Vycm9ycyArPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIwKTsKLQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2NyY19lcnJvcnMgICArPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIxKTsKLQkJCWVpX2xvY2FsLT5zdGF0LnJ4X21pc3NlZF9lcnJvcnMrPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIyKTsKLQkJCW91dGJfcChFTklTUl9DT1VOVEVSUywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2sgaW50ci4gKi8KLQkJfQotCi0JCS8qIElnbm9yZSBhbnkgUkRDIGludGVycnVwdHMgdGhhdCBtYWtlIGl0IGJhY2sgdG8gaGVyZS4gKi8KLQkJaWYgKGludGVycnVwdHMgJiBFTklTUl9SREMpCi0JCXsKLQkJCW91dGJfcChFTklTUl9SREMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKLQkJfQotCi0JCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0JfQotCi0JaWYgKGludGVycnVwdHMgJiYgZWlfZGVidWcpCi0JewotCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCQlpZiAobnJfc2VydmljZWQgPj0gTUFYX1NFUlZJQ0UpCi0JCXsKLQkJCS8qIDB4RkYgaXMgdmFsaWQgZm9yIGEgY2FyZCByZW1vdmFsICovCi0JCQlpZihpbnRlcnJ1cHRzIT0weEZGKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzICUjMi4yeFxuIiwKLQkJCQkgICBkZXYtPm5hbWUsIGludGVycnVwdHMpOwotCQkJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIG1vc3QgaW50cnMuICovCi0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBpbnRlcnJ1cHQgJSMyeFxuIiwgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKLQkJCW91dGJfcCgweGZmLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjay4gYWxsIGludHJzLiAqLwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQlyZXR1cm4gSVJRX1JFVFZBTChucl9zZXJ2aWNlZCA+IDApOworCXJldHVybiBfX2VpX2ludGVycnVwdChpcnEsIGRldl9pZCk7CiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogdm9pZCBlaV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZGlzYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7Ci0JZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYpOwotCWVuYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7CisJX19laV9wb2xsKGRldik7CiB9CiAjZW5kaWYKIAotLyoqCi0gKiBlaV90eF9lcnIgLSBoYW5kbGUgdHJhbnNtaXR0ZXIgZXJyb3IKLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24KLSAqCi0gKiBBIHRyYW5zbWl0dGVyIGVycm9yIGhhcyBoYXBwZW5lZC4gTW9zdCBsaWtlbHkgZXhjZXNzIGNvbGxpc2lvbnMgKHdoaWNoCi0gKiBpcyBhIGZhaXJseSBub3JtYWwgY29uZGl0aW9uKS4gSWYgdGhlIGVycm9yIGlzIG9uZSB3aGVyZSB0aGUgVHggd2lsbAotICogaGF2ZSBiZWVuIGFib3J0ZWQsIHdlIHRyeSBhbmQgc2VuZCBhbm90aGVyIG9uZSByaWdodCBhd2F5LCBpbnN0ZWFkIG9mCi0gKiBsZXR0aW5nIHRoZSBmYWlsZWQgcGFja2V0IHNpdCBhbmQgY29sbGVjdCBkdXN0IGluIHRoZSBUeCBidWZmZXIuIFRoaXMKLSAqIGlzIGEgbXVjaCBiZXR0ZXIgc29sdXRpb24gYXMgaXQgYXZvaWRzIGtlcm5lbCBiYXNlZCBUeCB0aW1lb3V0cywgYW5kCi0gKiBhbiB1bm5lY2Vzc2FyeSBjYXJkIHJlc2V0LgotICoKLSAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBlaV90eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgY2hhciB0eHNyID0gaW5iX3AoZTgzOTBfYmFzZStFTjBfVFNSKTsKLQl1bnNpZ25lZCBjaGFyIHR4X3dhc19hYm9ydGVkID0gdHhzciAmIChFTlRTUl9BQlQrRU5UU1JfRlUpOwotCi0jaWZkZWYgVkVSQk9TRV9FUlJPUl9EVU1QCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0cmFuc21pdHRlciBlcnJvciAoJSMyeCk6ICIsIGRldi0+bmFtZSwgdHhzcik7Ci0JaWYgKHR4c3IgJiBFTlRTUl9BQlQpCi0JCXByaW50aygiZXhjZXNzLWNvbGxpc2lvbnMgIik7Ci0JaWYgKHR4c3IgJiBFTlRTUl9ORCkKLQkJcHJpbnRrKCJub24tZGVmZXJyYWwgIik7Ci0JaWYgKHR4c3IgJiBFTlRTUl9DUlMpCi0JCXByaW50aygibG9zdC1jYXJyaWVyICIpOwotCWlmICh0eHNyICYgRU5UU1JfRlUpCi0JCXByaW50aygiRklGTy11bmRlcnJ1biAiKTsKLQlpZiAodHhzciAmIEVOVFNSX0NESCkKLQkJcHJpbnRrKCJsb3N0LWhlYXJ0YmVhdCAiKTsKLQlwcmludGsoIlxuIik7Ci0jZW5kaWYKLQotCW91dGJfcChFTklTUl9UWF9FUlIsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCi0KLQlpZiAodHhfd2FzX2Fib3J0ZWQpCi0JCWVpX3R4X2ludHIoZGV2KTsKLQllbHNlCi0JewotCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKLQkJaWYgKHR4c3IgJiBFTlRTUl9DUlMpIGVpX2xvY2FsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7Ci0JCWlmICh0eHNyICYgRU5UU1JfQ0RIKSBlaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7Ci0JCWlmICh0eHNyICYgRU5UU1JfT1dDKSBlaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7Ci0JfQotfQotCi0vKioKLSAqIGVpX3R4X2ludHIgLSB0cmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlcgotICogQGRldjogbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHR4IGludHIgaXMgaGFuZGxlZAotICoKLSAqIFdlIGhhdmUgZmluaXNoZWQgYSB0cmFuc21pdDogY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhlbiB0cmlnZ2VyIHRoZSBuZXh0Ci0gKiBwYWNrZXQgdG8gYmUgc2VudC4gQ2FsbGVkIHdpdGggbG9jayBoZWxkLgotICovCi0KLXN0YXRpYyB2b2lkIGVpX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JaW50IHN0YXR1cyA9IGluYihlODM5MF9iYXNlICsgRU4wX1RTUik7Ci0KLQlvdXRiX3AoRU5JU1JfVFgsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCi0KLQkvKgotCSAqIFRoZXJlIGFyZSB0d28gVHggYnVmZmVycywgc2VlIHdoaWNoIG9uZSBmaW5pc2hlZCwgYW5kIHRyaWdnZXIKLQkgKiB0aGUgc2VuZCBvZiBhbm90aGVyIG9uZSBpZiBpdCBleGlzdHMuCi0JICovCi0JZWlfbG9jYWwtPnR4cXVldWUtLTsKLQotCWlmIChlaV9sb2NhbC0+dHgxIDwgMCkKLQl7Ci0JCWlmIChlaV9sb2NhbC0+bGFzdHR4ICE9IDEgJiYgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDE9JWQuXG4iLAotCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgxKTsKLQkJZWlfbG9jYWwtPnR4MSA9IDA7Ci0JCWlmIChlaV9sb2NhbC0+dHgyID4gMCkKLQkJewotCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKLQkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgyLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIDYpOwotCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCQllaV9sb2NhbC0+dHgyID0gLTEsCi0JCQllaV9sb2NhbC0+bGFzdHR4ID0gMjsKLQkJfQotCQllbHNlIGVpX2xvY2FsLT5sYXN0dHggPSAyMCwgZWlfbG9jYWwtPnR4aW5nID0gMDsKLQl9Ci0JZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA8IDApCi0JewotCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAyICAmJiAgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMikKLQkJCXByaW50aygiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDI9JWQuXG4iLAotCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgyKTsKLQkJZWlfbG9jYWwtPnR4MiA9IDA7Ci0JCWlmIChlaV9sb2NhbC0+dHgxID4gMCkKLQkJewotCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKLQkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSk7Ci0JCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJCWVpX2xvY2FsLT50eDEgPSAtMTsKLQkJCWVpX2xvY2FsLT5sYXN0dHggPSAxOwotCQl9Ci0JCWVsc2UKLQkJCWVpX2xvY2FsLT5sYXN0dHggPSAxMCwgZWlfbG9jYWwtPnR4aW5nID0gMDsKLQl9Ci0vLwllbHNlIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmV4cGVjdGVkIFRYLWRvbmUgaW50ZXJydXB0LCBsYXN0dHg9JWQuXG4iLAotLy8JCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT5sYXN0dHgpOwotCi0JLyogTWluaW1pemUgVHggbGF0ZW5jeTogdXBkYXRlIHRoZSBzdGF0aXN0aWNzIGFmdGVyIHdlIHJlc3RhcnQgVFhpbmcuICovCi0JaWYgKHN0YXR1cyAmIEVOVFNSX0NPTCkKLQkJZWlfbG9jYWwtPnN0YXQuY29sbGlzaW9ucysrOwotCWlmIChzdGF0dXMgJiBFTlRTUl9QVFgpCi0JCWVpX2xvY2FsLT5zdGF0LnR4X3BhY2tldHMrKzsKLQllbHNlCi0JewotCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKLQkJaWYgKHN0YXR1cyAmIEVOVFNSX0FCVCkKLQkJewotCQkJZWlfbG9jYWwtPnN0YXQudHhfYWJvcnRlZF9lcnJvcnMrKzsKLQkJCWVpX2xvY2FsLT5zdGF0LmNvbGxpc2lvbnMgKz0gMTY7Ci0JCX0KLQkJaWYgKHN0YXR1cyAmIEVOVFNSX0NSUykKLQkJCWVpX2xvY2FsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBFTlRTUl9GVSkKLQkJCWVpX2xvY2FsLT5zdGF0LnR4X2ZpZm9fZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBFTlRTUl9DREgpCi0JCQllaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBFTlRTUl9PV0MpCi0JCQllaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7Ci0JfQotCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLX0KLQotLyoqCi0gKiBlaV9yZWNlaXZlIC0gcmVjZWl2ZSBzb21lIHBhY2tldHMKLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdpdGggd2hpY2ggcmVjZWl2ZSB3aWxsIGJlIHJ1bgotICoKLSAqIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgotICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLgotICovCi0KLXN0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgY2hhciByeGluZ19wYWdlLCB0aGlzX2ZyYW1lLCBuZXh0X2ZyYW1lOwotCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfb2Zmc2V0OwotCWludCByeF9wa3RfY291bnQgPSAwOwotCXN0cnVjdCBlODM5MF9wa3RfaGRyIHJ4X2ZyYW1lOwotCWludCBudW1fcnhfcGFnZXMgPSBlaV9sb2NhbC0+c3RvcF9wYWdlLWVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOwotCi0Jd2hpbGUgKCsrcnhfcGt0X2NvdW50IDwgMTApCi0JewotCQlpbnQgcGt0X2xlbiwgcGt0X3N0YXQ7Ci0KLQkJLyogR2V0IHRoZSByeCBwYWdlIChpbmNvbWluZyBwYWNrZXQgcG9pbnRlcikuICovCi0JCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0JCXJ4aW5nX3BhZ2UgPSBpbmJfcChlODM5MF9iYXNlICsgRU4xX0NVUlBBRyk7Ci0JCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0KLQkJLyogUmVtb3ZlIG9uZSBmcmFtZSBmcm9tIHRoZSByaW5nLiAgQm91bmRhcnkgaXMgYWx3YXlzIGEgcGFnZSBiZWhpbmQuICovCi0JCXRoaXNfZnJhbWUgPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0JPVU5EQVJZKSArIDE7Ci0JCWlmICh0aGlzX2ZyYW1lID49IGVpX2xvY2FsLT5zdG9wX3BhZ2UpCi0JCQl0aGlzX2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7Ci0KLQkJLyogU29tZWRheSB3ZSdsbCBvbWl0IHRoZSBwcmV2aW91cywgaWZmIHdlIG5ldmVyIGdldCB0aGlzIG1lc3NhZ2UuCi0JCSAgIChUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2xvbmUgY2xhaW1lZCB0byBoYXZlIGEgcHJvYmxlbS4pCi0KLQkJICAgS2VlcCBxdWlldCBpZiBpdCBsb29rcyBsaWtlIGEgY2FyZCByZW1vdmFsLiBPbmUgcHJvYmxlbSBoZXJlCi0JCSAgIGlzIHRoYXQgc29tZSBjbG9uZXMgY3Jhc2ggaW4gcm91Z2hseSB0aGUgc2FtZSB3YXkuCi0JCSAqLwotCQlpZiAoZWlfZGVidWcgPiAwICAmJiAgdGhpc19mcmFtZSAhPSBlaV9sb2NhbC0+Y3VycmVudF9wYWdlICYmICh0aGlzX2ZyYW1lIT0weDAgfHwgcnhpbmdfcGFnZSE9MHhGRikpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtaXNtYXRjaGVkIHJlYWQgcGFnZSBwb2ludGVycyAlMnggdnMgJTJ4LlxuIiwKLQkJCQkgICBkZXYtPm5hbWUsIHRoaXNfZnJhbWUsIGVpX2xvY2FsLT5jdXJyZW50X3BhZ2UpOwotCi0JCWlmICh0aGlzX2ZyYW1lID09IHJ4aW5nX3BhZ2UpCS8qIFJlYWQgYWxsIHRoZSBmcmFtZXM/ICovCi0JCQlicmVhazsJCQkJLyogRG9uZSBmb3Igbm93ICovCi0KLQkJY3VycmVudF9vZmZzZXQgPSB0aGlzX2ZyYW1lIDw8IDg7Ci0JCWVpX2dldF84MzkwX2hkcihkZXYsICZyeF9mcmFtZSwgdGhpc19mcmFtZSk7Ci0KLQkJcGt0X2xlbiA9IHJ4X2ZyYW1lLmNvdW50IC0gc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKTsKLQkJcGt0X3N0YXQgPSByeF9mcmFtZS5zdGF0dXM7Ci0KLQkJbmV4dF9mcmFtZSA9IHRoaXNfZnJhbWUgKyAxICsgKChwa3RfbGVuKzQpPj44KTsKLQotCQkvKiBDaGVjayBmb3IgYm9nb3NpdHkgd2FybmVkIGJ5IDNjNTAzIGJvb2s6IHRoZSBzdGF0dXMgYnl0ZSBpcyBuZXZlcgotCQkgICB3cml0dGVuLiAgVGhpcyBoYXBwZW5lZCBhIGxvdCBkdXJpbmcgdGVzdGluZyEgVGhpcyBjb2RlIHNob3VsZCBiZQotCQkgICBjbGVhbmVkIHVwIHNvbWVkYXkuICovCi0JCWlmIChyeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUKLQkJCSYmIHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZSArIDEKLQkJCSYmIHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZSAtIG51bV9yeF9wYWdlcwotCQkJJiYgcnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lICsgMSAtIG51bV9yeF9wYWdlcykgewotCQkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IHJ4aW5nX3BhZ2U7Ci0JCQlvdXRiKGVpX2xvY2FsLT5jdXJyZW50X3BhZ2UtMSwgZTgzOTBfYmFzZStFTjBfQk9VTkRBUlkpOwotCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChwa3RfbGVuIDwgNjAgIHx8ICBwa3RfbGVuID4gMTUxOCkKLQkJewotCQkJaWYgKGVpX2RlYnVnKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVkLCBzdGF0dXM9JSMyeCBueHBnPSUjMnguXG4iLAotCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLmNvdW50LCByeF9mcmFtZS5zdGF0dXMsCi0JCQkJCSAgIHJ4X2ZyYW1lLm5leHQpOwotCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7Ci0JCQllaV9sb2NhbC0+c3RhdC5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCX0KLQkJIGVsc2UgaWYgKChwa3Rfc3RhdCAmIDB4MEYpID09IEVOUlNSX1JYT0spCi0JCXsKLQkJCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKLQkJCWlmIChza2IgPT0gTlVMTCkKLQkJCXsKLQkJCQlpZiAoZWlfZGVidWcgPiAxKQotCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwKLQkJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7Ci0JCQkJZWlfbG9jYWwtPnN0YXQucnhfZHJvcHBlZCsrOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogSVAgaGVhZGVycyBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KLQkJCQlza2ItPmRldiA9IGRldjsKLQkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLwotCQkJCWVpX2Jsb2NrX2lucHV0KGRldiwgcGt0X2xlbiwgc2tiLCBjdXJyZW50X29mZnNldCArIHNpemVvZihyeF9mcmFtZSkpOwotCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7Ci0JCQkJbmV0aWZfcngoc2tiKTsKLQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X3BhY2tldHMrKzsKLQkJCQllaV9sb2NhbC0+c3RhdC5yeF9ieXRlcyArPSBwa3RfbGVuOwotCQkJCWlmIChwa3Rfc3RhdCAmIEVOUlNSX1BIWSkKLQkJCQkJZWlfbG9jYWwtPnN0YXQubXVsdGljYXN0Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoZWlfZGVidWcpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQ6IHN0YXR1cz0lIzJ4IG54cGc9JSMyeCBzaXplPSVkXG4iLAotCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLnN0YXR1cywgcnhfZnJhbWUubmV4dCwKLQkJCQkJICAgcnhfZnJhbWUuY291bnQpOwotCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7Ci0JCQkvKiBOQjogVGhlIE5JQyBjb3VudHMgQ1JDLCBmcmFtZSBhbmQgbWlzc2VkIGVycm9ycy4gKi8KLQkJCWlmIChwa3Rfc3RhdCAmIEVOUlNSX0ZPKQotCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2ZpZm9fZXJyb3JzKys7Ci0JCX0KLQkJbmV4dF9mcmFtZSA9IHJ4X2ZyYW1lLm5leHQ7Ci0KLQkJLyogVGhpcyBfc2hvdWxkXyBuZXZlciBoYXBwZW46IGl0J3MgaGVyZSBmb3IgYXZvaWRpbmcgYmFkIGNsb25lcy4gKi8KLQkJaWYgKG5leHRfZnJhbWUgPj0gZWlfbG9jYWwtPnN0b3BfcGFnZSkgewotCQkJcHJpbnRrKCIlczogbmV4dCBmcmFtZSBpbmNvbnNpc3RlbmN5LCAlIzJ4XG4iLCBkZXYtPm5hbWUsCi0JCQkJICAgbmV4dF9mcmFtZSk7Ci0JCQluZXh0X2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7Ci0JCX0KLQkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IG5leHRfZnJhbWU7Ci0JCW91dGJfcChuZXh0X2ZyYW1lLTEsIGU4MzkwX2Jhc2UrRU4wX0JPVU5EQVJZKTsKLQl9Ci0KLQkvKiBXZSB1c2VkIHRvIGFsc28gYWNrIEVOSVNSX09WRVIgaGVyZSwgYnV0IHRoYXQgd291bGQgc29tZXRpbWVzIG1hc2sKLQkgICBhIHJlYWwgb3ZlcnJ1biwgbGVhdmluZyB0aGUgODM5MCBpbiBhIHN0b3BwZWQgc3RhdGUgd2l0aCByZWMndnIgb2ZmLiAqLwotCW91dGJfcChFTklTUl9SWCtFTklTUl9SWF9FUlIsIGU4MzkwX2Jhc2UrRU4wX0lTUik7Ci0JcmV0dXJuOwotfQotCi0vKioKLSAqIGVpX3J4X292ZXJydW4gLSBoYW5kbGUgcmVjZWl2ZXIgb3ZlcnJ1bgotICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggdGhyZXcgZXhjZXB0aW9uCi0gKgotICogV2UgaGF2ZSBhIHJlY2VpdmVyIG92ZXJydW46IHdlIGhhdmUgdG8ga2ljayB0aGUgODM5MCB0byBnZXQgaXQgc3RhcnRlZAotICogYWdhaW4uIFByb2JsZW0gaXMgdGhhdCB5b3UgaGF2ZSB0byBraWNrIGl0IGV4YWN0bHkgYXMgTlMgcHJlc2NyaWJlcyBpbgotICogdGhlIHVwZGF0ZWQgZGF0YXNoZWV0cywgb3IgInRoZSBOSUMgbWF5IGFjdCBpbiBhbiB1bnByZWRpY3RhYmxlIG1hbm5lci4iCi0gKiBUaGlzIGluY2x1ZGVzIGNhdXNpbmcgInRoZSBOSUMgdG8gZGVmZXIgaW5kZWZpbml0ZWx5IHdoZW4gaXQgaXMgc3RvcHBlZAotICogb24gYSBidXN5IG5ldHdvcmsuIiAgVWdoLgotICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBEb24ndCBjYWxsIHRoaXMgd2l0aCB0aGUgaW50ZXJydXB0cyBvZmYgb3IgeW91cgotICogY29tcHV0ZXIgd2lsbCBoYXRlIHlvdSAtIGl0IHRha2VzIDEwbXMgb3Igc28uCi0gKi8KLQotc3RhdGljIHZvaWQgZWlfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotCXVuc2lnbmVkIGNoYXIgd2FzX3R4aW5nLCBtdXN0X3Jlc2VuZCA9IDA7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCi0JLyoKLQkgKiBSZWNvcmQgd2hldGhlciBhIFR4IHdhcyBpbiBwcm9ncmVzcyBhbmQgdGhlbiBpc3N1ZSB0aGUKLQkgKiBzdG9wIGNvbW1hbmQuCi0JICovCi0Jd2FzX3R4aW5nID0gaW5iX3AoZTgzOTBfYmFzZStFODM5MF9DTUQpICYgRTgzOTBfVFJBTlM7Ci0Jb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKLQotCWlmIChlaV9kZWJ1ZyA+IDEpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZXIgb3ZlcnJ1bi5cbiIsIGRldi0+bmFtZSk7Ci0JZWlfbG9jYWwtPnN0YXQucnhfb3Zlcl9lcnJvcnMrKzsKLQotCS8qCi0JICogV2FpdCBhIGZ1bGwgVHggdGltZSAoMS4ybXMpICsgc29tZSBndWFyZCB0aW1lLCBOUyBzYXlzIDEuNm1zIHRvdGFsLgotCSAqIEVhcmx5IGRhdGFzaGVldHMgc2FpZCB0byBwb2xsIHRoZSByZXNldCBiaXQsIGJ1dCBub3cgdGhleSBzYXkgdGhhdAotCSAqIGl0ICJpcyBub3QgYSByZWxpYWJsZSBpbmRpY2F0b3IgYW5kIHN1YnNlcXVlbnRseSBzaG91bGQgYmUgaWdub3JlZC4iCi0JICogV2Ugd2FpdCBhdCBsZWFzdCAxMG1zLgotCSAqLwotCi0JbWRlbGF5KDEwKTsKLQotCS8qCi0JICogUmVzZXQgUkJDUlswMV0gYmFjayB0byB6ZXJvIGFzIHBlciBtYWdpYyBpbmNhbnRhdGlvbi4KLQkgKi8KLQlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZStFTjBfUkNOVExPKTsKLQlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZStFTjBfUkNOVEhJKTsKLQotCS8qCi0JICogU2VlIGlmIGFueSBUeCB3YXMgaW50ZXJydXB0ZWQgb3Igbm90LiBBY2NvcmRpbmcgdG8gTlMsIHRoaXMKLQkgKiBzdGVwIGlzIHZpdGFsLCBhbmQgc2tpcHBpbmcgaXQgd2lsbCBjYXVzZSBubyBlbmQgb2YgaGF2b2MuCi0JICovCi0KLQlpZiAod2FzX3R4aW5nKQotCXsKLQkJdW5zaWduZWQgY2hhciB0eF9jb21wbGV0ZWQgPSBpbmJfcChlODM5MF9iYXNlK0VOMF9JU1IpICYgKEVOSVNSX1RYK0VOSVNSX1RYX0VSUik7Ci0JCWlmICghdHhfY29tcGxldGVkKQotCQkJbXVzdF9yZXNlbmQgPSAxOwotCX0KLQotCS8qCi0JICogSGF2ZSB0byBlbnRlciBsb29wYmFjayBtb2RlIGFuZCB0aGVuIHJlc3RhcnQgdGhlIE5JQyBiZWZvcmUKLQkgKiB5b3UgYXJlIGFsbG93ZWQgdG8gc2x1cnAgcGFja2V0cyB1cCBvZmYgdGhlIHJpbmcuCi0JICovCi0Jb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOwotCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgUnggcmluZyBvZiBhbGwgdGhlIGRlYnJpcywgYW5kIGFjayB0aGUgaW50ZXJydXB0LgotCSAqLwotCWVpX3JlY2VpdmUoZGV2KTsKLQlvdXRiX3AoRU5JU1JfT1ZFUiwgZTgzOTBfYmFzZStFTjBfSVNSKTsKLQotCS8qCi0JICogTGVhdmUgbG9vcGJhY2sgbW9kZSwgYW5kIHJlc2VuZCBhbnkgcGFja2V0IHRoYXQgZ290IHN0b3BwZWQuCi0JICovCi0Jb3V0Yl9wKEU4MzkwX1RYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOwotCWlmIChtdXN0X3Jlc2VuZCkKLSAgICAJCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQgKyBFODM5MF9UUkFOUywgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci19Ci0KLS8qCi0gKglDb2xsZWN0IHRoZSBzdGF0cy4gVGhpcyBpcyBjYWxsZWQgdW5sb2NrZWQgYW5kIGZyb20gc2V2ZXJhbCBjb250ZXh0cy4KLSAqLwotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBJZiB0aGUgY2FyZCBpcyBzdG9wcGVkLCBqdXN0IHJldHVybiB0aGUgcHJlc2VudCBzdGF0cy4gKi8KLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLGZsYWdzKTsKLQkvKiBSZWFkIHRoZSBjb3VudGVyIHJlZ2lzdGVycywgYXNzdW1pbmcgd2UgYXJlIGluIHBhZ2UgMC4gKi8KLQllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsKLQllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIxKTsKLQllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gJmVpX2xvY2FsLT5zdGF0OwotfQotCi0vKgotICogRm9ybSB0aGUgNjQgYml0IDgzOTAgbXVsdGljYXN0IHRhYmxlIGZyb20gdGhlIGxpbmtlZCBsaXN0IG9mIGFkZHJlc3NlcwotICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2IHN0cnVjdHVyZS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9tY19iaXRzKHU4ICpiaXRzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOwotCi0JZm9yIChkbWk9ZGV2LT5tY19saXN0OyBkbWk7IGRtaT1kbWktPm5leHQpCi0JewotCQl1MzIgY3JjOwotCQlpZiAoZG1pLT5kbWlfYWRkcmxlbiAhPSBFVEhfQUxFTikKLQkJewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgbXVsdGljYXN0IGFkZHJlc3MgbGVuZ3RoIGdpdmVuLlxuIiwgZGV2LT5uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWNyYyA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgZG1pLT5kbWlfYWRkcik7Ci0JCS8qCi0JCSAqIFRoZSA4MzkwIHVzZXMgdGhlIDYgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZQotCQkgKiBDUkMgdG8gaW5kZXggdGhlIG11bHRpY2FzdCB0YWJsZS4KLQkJICovCi0JCWJpdHNbY3JjPj4yOV0gfD0gKDE8PCgoY3JjPj4yNikmNykpOwotCX0KLX0KLQotLyoqCi0gKiBkb19zZXRfbXVsdGljYXN0X2xpc3QgLSBzZXQvY2xlYXIgbXVsdGljYXN0IGZpbHRlcgotICogQGRldjogbmV0IGRldmljZSBmb3Igd2hpY2ggbXVsdGljYXN0IGZpbHRlciBpcyBhZGp1c3RlZAotICoKLSAqCVNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLiBNYXkgYmUgY2FsbGVkCi0gKglmcm9tIGEgQkggaW4gMi4xLnguIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgotICovCi0KLXN0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotCWludCBpOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UqKW5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoIShkZXYtPmZsYWdzJihJRkZfUFJPTUlTQ3xJRkZfQUxMTVVMVEkpKSkKLQl7Ci0JCW1lbXNldChlaV9sb2NhbC0+bWNmaWx0ZXIsIDAsIDgpOwotCQlpZiAoZGV2LT5tY19saXN0KQotCQkJbWFrZV9tY19iaXRzKGVpX2xvY2FsLT5tY2ZpbHRlciwgZGV2KTsKLQl9Ci0JZWxzZQotCQltZW1zZXQoZWlfbG9jYWwtPm1jZmlsdGVyLCAweEZGLCA4KTsJLyogbWNhc3Qgc2V0IHRvIGFjY2VwdC1hbGwgKi8KLQotCS8qCi0JICogRFA4MzkwIG1hbnVhbHMgZG9uJ3Qgc3BlY2lmeSBhbnkgbWFnaWMgc2VxdWVuY2UgZm9yIGFsdGVyaW5nCi0JICogdGhlIG11bHRpY2FzdCByZWdzIG9uIGFuIGFscmVhZHkgcnVubmluZyBjYXJkLiBUbyBiZSBzYWZlLCB3ZQotCSAqIGVuc3VyZSBtdWx0aWNhc3QgbW9kZSBpcyBvZmYgcHJpb3IgdG8gbG9hZGluZyB1cCB0aGUgbmV3IGhhc2gKLQkgKiB0YWJsZS4gSWYgdGhpcyBwcm92ZXMgdG8gYmUgbm90IGVub3VnaCwgd2UgY2FuIGFsd2F5cyByZXNvcnQKLQkgKiB0byBzdG9wcGluZyB0aGUgTklDLCBsb2FkaW5nIHRoZSB0YWJsZSBhbmQgdGhlbiByZXN0YXJ0aW5nLgotCSAqCi0JICogQnVnIEFsZXJ0ISAgVGhlIE1DIHJlZ3Mgb24gdGhlIFNNQyA4M0M2OTAgKFNNQyBFbGl0ZSBhbmQgU01DCi0JICogRWxpdGUxNikgYXBwZWFyIHRvIGJlIHdyaXRlLW9ubHkuIFRoZSBOUyA4MzkwIGRhdGEgc2hlZXQgbGlzdHMKLQkgKiB0aGVtIGFzIHIvdyBzbyB0aGlzIGlzIGEgYnVnLiAgVGhlIFNNQyA4M0M3OTAgKFNNQyBVbHRyYSBhbmQKLQkgKiBVbHRyYTMyIEVJU0EpIGFwcGVhcnMgdG8gaGF2ZSB0aGlzIGJ1ZyBmaXhlZC4KLQkgKi8KLQotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCW91dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKLQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0JZm9yKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJb3V0Yl9wKGVpX2xvY2FsLT5tY2ZpbHRlcltpXSwgZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKTsKLSNpZm5kZWYgQlVHXzgzQzY5MAotCQlpZihpbmJfcChlODM5MF9iYXNlICsgRU4xX01VTFRfU0hJRlQoaSkpIT1laV9sb2NhbC0+bWNmaWx0ZXJbaV0pCi0JCQlwcmludGsoS0VSTl9FUlIgIk11bHRpY2FzdCBmaWx0ZXIgcmVhZC93cml0ZSBtaXNtYXAgJWRcbiIsaSk7Ci0jZW5kaWYKLQl9Ci0Jb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCi0gIAlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQotICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MTgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7Ci0JZWxzZSBpZihkZXYtPmZsYWdzJklGRl9BTExNVUxUSSB8fCBkZXYtPm1jX2xpc3QpCi0gIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHgwOCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKLSAgCWVsc2UKLSAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7Ci0gfQotCi0vKgotICoJQ2FsbGVkIHdpdGhvdXQgbG9jayBoZWxkLiBUaGlzIGlzIGludm9rZWQgZnJvbSB1c2VyIGNvbnRleHQgYW5kIG1heQotICoJYmUgcGFyYWxsZWwgdG8ganVzdCBhYm91dCBldmVyeXRoaW5nIGVsc2UuIEl0cyBhbHNvIGZhaXJseSBxdWljayBhbmQKLSAqCW5vdCBjYWxsZWQgdG9vIG9mdGVuLiBNdXN0IHByb3RlY3QgYWdhaW5zdCBib3RoIGJoIGFuZCBpcnEgdXNlcnMKLSAqLwotCi1zdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UqKW5ldGRldl9wcml2KGRldik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLX0KLQotLyoqCi0gKiBldGhkZXZfc2V0dXAgLSBpbml0IHJlc3Qgb2YgODM5MCBkZXZpY2Ugc3RydWN0Ci0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgdG8gaW5pdAotICoKLSAqIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIDgzOTAgZGV2aWNlIHN0cnVjdHVyZS4gIERvIE5PVCBfX2luaXQKLSAqIHRoaXMsIGFzIGl0IGlzIHVzZWQgYnkgODM5MCBiYXNlZCBtb2R1bGFyIGRyaXZlcnMgdG9vLgotICovCi0KLXN0YXRpYyB2b2lkIGV0aGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQlpZiAoZWlfZGVidWcgPiAxKQotCQlwcmludGsodmVyc2lvbik7Ci0KLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlaV9zdGFydF94bWl0OwotCWRldi0+Z2V0X3N0YXRzCT0gZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKLQotCWV0aGVyX3NldHVwKGRldik7Ci0KLQlzcGluX2xvY2tfaW5pdCgmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci19Ci0KLS8qKgotICogYWxsb2NfZWlfbmV0ZGV2IC0gYWxsb2NfZXRoZXJkZXYgY291bnRlcnBhcnQgZm9yIDgzOTAKLSAqIEBzaXplOiBleHRyYSBieXRlcyB0byBhbGxvY2F0ZQotICoKLSAqIEFsbG9jYXRlIDgzOTAtc3BlY2lmaWMgbmV0X2RldmljZS4KLSAqLwogc3RydWN0IG5ldF9kZXZpY2UgKl9fYWxsb2NfZWlfbmV0ZGV2KGludCBzaXplKQogewotCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBlaV9kZXZpY2UpICsgc2l6ZSwgImV0aCVkIiwKLQkJCQlldGhkZXZfc2V0dXApOworCXJldHVybiBfX19fYWxsb2NfZWlfbmV0ZGV2KHNpemUpOwogfQogCi0KLQotCi0vKiBUaGlzIHBhZ2Ugb2YgZnVuY3Rpb25zIHNob3VsZCBiZSA4MzkwIGdlbmVyaWMgKi8KLS8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgdGhlICJOSUMiLiAqLwotCi0vKioKLSAqIE5TODM5MF9pbml0IC0gaW5pdGlhbGl6ZSA4MzkwIGhhcmR3YXJlCi0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCi0gKiBAc3RhcnRwOiBib29sZWFuLiAgbm9uLXplcm8gdmFsdWUgdG8gaW5pdGlhdGUgY2hpcCBwcm9jZXNzaW5nCi0gKgotICoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCi0gKi8KLQogdm9pZCBOUzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQogewotCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgaTsKLQlpbnQgZW5kY2ZnID0gZWlfbG9jYWwtPndvcmQxNgotCSAgICA/ICgweDQ4IHwgRU5EQ0ZHX1dUUyB8IChlaV9sb2NhbC0+YmlnZW5kaWFuID8gRU5EQ0ZHX0JPUyA6IDApKQotCSAgICA6IDB4NDg7Ci0KLQlpZihzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpIT00KQotICAgIAkJcGFuaWMoIjgzOTAuYzogaGVhZGVyIHN0cnVjdCBtaXNwYWNrZWRcbiIpOwotCS8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aW5nIHRoZSBEUDgzOTAyLiAqLwotCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7IC8qIDB4MjEgKi8KLQlvdXRiX3AoZW5kY2ZnLCBlODM5MF9iYXNlICsgRU4wX0RDRkcpOwkvKiAweDQ4IG9yIDB4NDkgKi8KLQkvKiBDbGVhciB0aGUgcmVtb3RlIGJ5dGUgY291bnQgcmVnaXN0ZXJzLiAqLwotCW91dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9SQ05UTE8pOwotCW91dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9SQ05USEkpOwotCS8qIFNldCB0byBtb25pdG9yIGFuZCBsb29wYmFjayBtb2RlIC0tIHRoaXMgaXMgdml0YWwhLiAqLwotCW91dGJfcChFODM5MF9SWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsgLyogMHgyMCAqLwotCW91dGJfcChFODM5MF9UWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsgLyogMHgwMiAqLwotCS8qIFNldCB0aGUgdHJhbnNtaXQgcGFnZSBhbmQgcmVjZWl2ZSByaW5nLiAqLwotCW91dGJfcChlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKLQllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7Ci0Jb3V0Yl9wKGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1NUQVJUUEcpOwotCW91dGJfcChlaV9sb2NhbC0+c3RvcF9wYWdlLTEsIGU4MzkwX2Jhc2UgKyBFTjBfQk9VTkRBUlkpOwkvKiAzYzUwMyBzYXlzIDB4M2YsTlMweDI2Ki8KLQllaV9sb2NhbC0+Y3VycmVudF9wYWdlID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CQkvKiBhc3NlcnQgYm91bmRhcnkrMSAqLwotCW91dGJfcChlaV9sb2NhbC0+c3RvcF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1NUT1BQRyk7Ci0JLyogQ2xlYXIgdGhlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgbWFzay4gKi8KLQlvdXRiX3AoMHhGRiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOwotCW91dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9JTVIpOwotCi0JLyogQ29weSB0aGUgc3RhdGlvbiBhZGRyZXNzIGludG8gdGhlIERTODM5MCByZWdpc3RlcnMuICovCi0KLQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHg2MSAqLwotCWZvcihpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JCW91dGJfcChkZXYtPmRldl9hZGRyW2ldLCBlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpOwotCQlpZiAoZWlfZGVidWcgPiAxICYmIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjFfUEhZU19TSElGVChpKSkhPWRldi0+ZGV2X2FkZHJbaV0pCi0JCQlwcmludGsoS0VSTl9FUlIgIkh3LiBhZGRyZXNzIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOwotCX0KLQotCW91dGJfcChlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMV9DVVJQQUcpOwotCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7Ci0KLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotCWVpX2xvY2FsLT50eDEgPSBlaV9sb2NhbC0+dHgyID0gMDsKLQllaV9sb2NhbC0+dHhpbmcgPSAwOwotCi0JaWYgKHN0YXJ0cCkKLQl7Ci0JCW91dGJfcCgweGZmLCAgZTgzOTBfYmFzZSArIEVOMF9JU1IpOwotCQlvdXRiX3AoRU5JU1JfQUxMLCAgZTgzOTBfYmFzZSArIEVOMF9JTVIpOwotCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKLQkJb3V0Yl9wKEU4MzkwX1RYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAvKiB4bWl0IG9uLiAqLwotCQkvKiAzYzUwMyBUZWNoTWFuIHNheXMgcnhjb25maWcgb25seSBhZnRlciB0aGUgTklDIGlzIHN0YXJ0ZWQuICovCi0JCW91dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsgLyogcnggb24sICAqLwotCQlkb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsJLyogKHJlKWxvYWQgdGhlIG1jYXN0IHRhYmxlICovCi0JfQotfQotCi0vKiBUcmlnZ2VyIGEgdHJhbnNtaXQgc3RhcnQsIGFzc3VtaW5nIHRoZSBsZW5ndGggaXMgdmFsaWQuCi0gICBBbHdheXMgY2FsbGVkIHdpdGggdGhlIHBhZ2UgbG9jayBoZWxkICovCi0KLXN0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKLQkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpCi17Ci0JbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7Ci0gCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0KLQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKLQotCWlmIChpbmJfcChlODM5MF9iYXNlICsgRTgzOTBfQ01EKSAmIEU4MzkwX1RSQU5TKQotCXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyaWdnZXJfc2VuZCgpIGNhbGxlZCB3aXRoIHRoZSB0cmFuc21pdHRlciBidXN5LlxuIiwKLQkJCWRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0Jb3V0Yl9wKGxlbmd0aCAmIDB4ZmYsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVExPKTsKLQlvdXRiX3AobGVuZ3RoID4+IDgsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVEhJKTsKLQlvdXRiX3Aoc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKLQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfVFJBTlMrRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKwlyZXR1cm4gX19OUzgzOTBfaW5pdChkZXYsIHN0YXJ0cCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZWlfb3Blbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MzkwLmggYi9kcml2ZXJzL25ldC84MzkwLmgKaW5kZXggZjQ0ZjEyMi4uNDE0ZGU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODM5MC5oCisrKyBiL2RyaXZlcnMvbmV0LzgzOTAuaApAQCAtMTA3LDM1ICsxMDcsMTQgQEAKICAqICAgICAgLSByZW1vdmVkIEFNSUdBX1BDTUNJQSBmcm9tIHRoaXMgbGlzdCwgaGFuZGxlZCBhcyBJU0EgaW8gbm93CiAgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX01BQykgfHwgIFwKLSAgICBkZWZpbmVkKENPTkZJR19aT1JSTzgzOTApIHx8IGRlZmluZWQoQ09ORklHX1pPUlJPODM5MF9NT0RVTEUpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19IWURSQSkgfHwgZGVmaW5lZChDT05GSUdfSFlEUkFfTU9EVUxFKQotI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCi0jdW5kZWYgaW5iCi0jdW5kZWYgaW5iX3AKLSN1bmRlZiBvdXRiCi0jdW5kZWYgb3V0Yl9wCisjaWZuZGVmIGVpX2luYgorI2RlZmluZSBlaV9pbmIoX3ApCWluYihfcCkKKyNkZWZpbmUgZWlfb3V0YihfdixfcCkJb3V0YihfdixfcCkKKyNkZWZpbmUgZWlfaW5iX3AoX3ApCWluYl9wKF9wKQorI2RlZmluZSBlaV9vdXRiX3AoX3YsX3ApIG91dGJfcChfdixfcCkKKyNlbmRpZgogCi0jZGVmaW5lIGluYihwb3J0KSAgIGluXzgocG9ydCkKLSNkZWZpbmUgb3V0Yih2YWwscG9ydCkgIG91dF84KHBvcnQsdmFsKQotI2RlZmluZSBpbmJfcChwb3J0KSAgIGluXzgocG9ydCkKLSNkZWZpbmUgb3V0Yl9wKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSTV9FVEhFUkgpIHx8IGRlZmluZWQoQ09ORklHX0FSTV9FVEhFUkhfTU9EVUxFKQotI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCi0jdW5kZWYgaW5iCi0jdW5kZWYgaW5iX3AKLSN1bmRlZiBvdXRiCi0jdW5kZWYgb3V0Yl9wCi0KLSNkZWZpbmUgaW5iKF9wKQkJcmVhZGIoX3ApCi0jZGVmaW5lIG91dGIoX3YsX3ApCXdyaXRlYihfdixfcCkKLSNkZWZpbmUgaW5iX3AoX3ApCWluYihfcCkKLSNkZWZpbmUgb3V0Yl9wKF92LF9wKQlvdXRiKF92LF9wKQotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19ORV9IODMwMCkgfHwgZGVmaW5lZChDT05GSUdfTkVfSDgzMDBfTU9EVUxFKQotI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCi0jZWxzZQorI2lmbmRlZiBFSV9TSElGVAogI2RlZmluZSBFSV9TSElGVCh4KQkoeCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCA2ZTg2M2FhLi45ZGUwZWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTMyLDcgKzMyLDcgQEAKIAl0cmlzdGF0ZSAiSW50ZXJtZWRpYXRlIEZ1bmN0aW9uYWwgQmxvY2sgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCiAJLS0taGVscC0tLQotCSAgVGhpcyBpcyBhbiBpbnRlcm1pZGlhdGUgZHJpdmVyIHRoYXQgYWxsb3dzIHNoYXJpbmcgb2YKKwkgIFRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIGRyaXZlciB0aGF0IGFsbG93cyBzaGFyaW5nIG9mCiAJICByZXNvdXJjZXMuCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpZmIuICBJZiB5b3Ugd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBpZmIKQEAgLTE4OCw2ICsxODgsMTcgQEAKIAkgIG9yIGludGVybmFsIGRldmljZS4gIEl0IGlzIHNhZmUgdG8gc2F5IFkgb3IgTSBoZXJlIGV2ZW4gaWYgeW91cgogCSAgZXRoZXJuZXQgY2FyZCBsYWNrIE1JSS4KIAorY29uZmlnIE1BQ0IKKwl0cmlzdGF0ZSAiQXRtZWwgTUFDQiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFWUjMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoZSBBdG1lbCBNQUNCIGV0aGVybmV0IGludGVyZmFjZSBpcyBmb3VuZCBvbiBtYW55IEFUMzIgYW5kIEFUOTEKKwkgIHBhcnRzLiBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBNQUNCIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1hY2IuCisKIHNvdXJjZSAiZHJpdmVycy9uZXQvYXJtL0tjb25maWciCiAKIGNvbmZpZyBNQUNFCkBAIC0xNzY5LDggKzE3ODAsOCBAQAogCSAgaW5mb3JtYXRpb24uCiAKIGNvbmZpZyBMQU5fU0FBOTczMAotCWJvb2wgIlBoaWxpcHMgU0FBOTczMCBFdGhlcm5ldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBFWFBFUklNRU5UQUwgJiYgTUlQUworCWJvb2wgIlBoaWxpcHMgU0FBOTczMCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgTUlQU19BVExBUwogCWhlbHAKIAkgIFRoZSBTQUE5NzMwIGlzIGEgY29tYmluZWQgbXVsdGltZWRpYSBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIHVzZWQKIAkgIGluIHRoaW4gY2xpZW50cywgSW50ZXJuZXQgYWNjZXNzIHRlcm1pbmFscywgYW5kIGRpc2tsZXNzCkBAIC0yMTM2LDcgKzIxNDcsNyBAQAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG9yaWdpbmFsIFl1a29uIGNoaXBzZXQuIEEgY2xlYW5lciBkcml2ZXIgaXMgCiAJICBhbHNvIGF2YWlsYWJsZSAoc2tnZSkgd2hpY2ggc2VlbXMgdG8gd29yayBiZXR0ZXIgdGhhbiB0aGlzIG9uZS4KIAotCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbmV3ZXIgWXVrb24yIGNoaXBzZXQuIEEgc2VwZXJhdGUKKwkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG5ld2VyIFl1a29uMiBjaGlwc2V0LiBBIHNlcGFyYXRlCiAJICBkcml2ZXIsIHNreTIsIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgWXVrb24yLWJhc2VkIGFkYXB0ZXJzLgogCiAJICBUaGUgZm9sbG93aW5nIGFkYXB0ZXJzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXI6CkBAIC0yMjUxLDYgKzIyNjIsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBHaWdhYml0IEV0aGVybmV0IGNoaXBzIHByZXNlbnQgb24gdGhlCiAJICBDZWxsIFByb2Nlc3Nvci1CYXNlZCBCbGFkZXMgZnJvbSBJQk0uCiAKK2NvbmZpZyBUU0kxMDhfRVRICisJICAgdHJpc3RhdGUgIlR1bmRyYSBUU0kxMDggZ2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgorCSAgIGRlcGVuZHMgb24gVFNJMTA4X0JSSURHRQorCSAgIGhlbHAKKwkgICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFR1bmRyYSBUU0kxMDggZ2lnYWJpdCBFdGhlcm5ldCBwb3J0cy4KKwkgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgICAgIHdpbGwgYmUgY2FsbGVkIHRzaTEwOF9ldGguCisKIGNvbmZpZyBHSUFORkFSCiAJdHJpc3RhdGUgIkdpYW5mYXIgRXRoZXJuZXQiCiAJZGVwZW5kcyBvbiA4NXh4IHx8IDgzeHggfHwgUFBDXzg2eHgKQEAgLTIzNDEsMTAgKzIzNjAsMTEgQEAKIGNvbmZpZyBDSEVMU0lPX1QxCiAgICAgICAgIHRyaXN0YXRlICJDaGVsc2lvIDEwR2IgRXRoZXJuZXQgc3VwcG9ydCIKICAgICAgICAgZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgQ1JDMzIKICAgICAgICAgaGVscAotICAgICAgICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIENoZWxzaW8gTjExMCBhbmQgTjIxMCBtb2RlbHMgMTBHYiBFdGhlcm5ldAotICAgICAgICAgIGNhcmRzLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGFkYXB0ZXIgZmVhdHVyZXMgYW5kIHBlcmZvcm1hbmNlCi0gICAgICAgICAgdHVuaW5nIGlzIGluIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9jeGdiLnR4dD4uCisgICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQ2hlbHNpbyBnaWdhYml0IGFuZCAxMC1naWdhYml0CisgICAgICAgICAgRXRoZXJuZXQgY2FyZHMuIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYWRhcHRlciBmZWF0dXJlcyBhbmQKKwkgIHBlcmZvcm1hbmNlIHR1bmluZyBpcyBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3hnYi50eHQ+LgogCiAgICAgICAgICAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgQ2hlbHNpbyBhbmQgb3VyIHByb2R1Y3RzLCB2aXNpdAogICAgICAgICAgIG91ciB3ZWJzaXRlIGF0IDxodHRwOi8vd3d3LmNoZWxzaW8uY29tPi4KQEAgLTIzNTcsNiArMjM3NywxMyBAQAogICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBjeGdiLgogCitjb25maWcgQ0hFTFNJT19UMV8xRworICAgICAgICBib29sICJDaGVsc2lvIGdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBDSEVMU0lPX1QxCisgICAgICAgIGhlbHAKKyAgICAgICAgICBFbmFibGVzIHN1cHBvcnQgZm9yIENoZWxzaW8ncyBnaWdhYml0IEV0aGVybmV0IFBDSSBjYXJkcy4gIElmIHlvdQorICAgICAgICAgIGFyZSB1c2luZyBvbmx5IDEwRyBjYXJkcyBzYXkgJ04nIGhlcmUuCisKIGNvbmZpZyBFSEVBCiAJdHJpc3RhdGUgImVIRUEgRXRoZXJuZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElCTUVCVVMKQEAgLTI0NDcsNiArMjQ3NCwxMiBAQAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBteXJpMTBnZS4KIAorY29uZmlnIE5FVFhFTl9OSUMKKwl0cmlzdGF0ZSAiTmV0WGVuIE11bHRpIHBvcnQgKDEvMTApIEdpZ2FiaXQgRXRoZXJuZXQgTklDIgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciBOZXRYZW4ncyBHaWdhYml0IEV0aGVybmV0IGNhcmQuCisKIGVuZG1lbnUKIAogc291cmNlICJkcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggZjI3MGJjNC4uNGMwZDRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTgyLDcgKzgyLDcgQEAKIG9iai0kKENPTkZJR19ORVQpICs9IFNwYWNlLm8gbG9vcGJhY2subwogb2JqLSQoQ09ORklHX1NFRVE4MDA1KSArPSBzZWVxODAwNS5vCiBvYmotJChDT05GSUdfTkVUX1NCMTAwMCkgKz0gc2IxMDAwLm8KLW9iai0kKENPTkZJR19NQUM4MzkwKSArPSBtYWM4MzkwLm8gODM5MC5vCitvYmotJChDT05GSUdfTUFDODM5MCkgKz0gbWFjODM5MC5vCiBvYmotJChDT05GSUdfQVBORSkgKz0gYXBuZS5vIDgzOTAubwogb2JqLSQoQ09ORklHX1BDTUNJQV9QQ05FVCkgKz0gODM5MC5vCiBvYmotJChDT05GSUdfU0hBUEVSKSArPSBzaGFwZXIubwpAQCAtOTAsNyArOTAsNiBAQAogb2JqLSQoQ09ORklHX1NNQzkxOTQpICs9IHNtYzkxOTQubwogb2JqLSQoQ09ORklHX0ZFQykgKz0gZmVjLm8KIG9iai0kKENPTkZJR182ODM2MF9FTkVUKSArPSA2ODM2MGVuZXQubwotb2JqLSQoQ09ORklHX0FSTV9FVEhFUkgpICs9IDgzOTAubwogb2JqLSQoQ09ORklHX1dEODB4MykgKz0gd2QubyA4MzkwLm8KIG9iai0kKENPTkZJR19FTDIpICs9IDNjNTAzLm8gODM5MC5vCiBvYmotJChDT05GSUdfTkUyMDAwKSArPSBuZS5vIDgzOTAubwpAQCAtMTA3LDggKzEwNiw5IEBACiBvYmotJChDT05GSUdfTkVUX1NCMTI1MF9NQUMpICs9IHNiMTI1MC1tYWMubwogb2JqLSQoQ09ORklHX0I0NCkgKz0gYjQ0Lm8KIG9iai0kKENPTkZJR19GT1JDRURFVEgpICs9IGZvcmNlZGV0aC5vCi1vYmotJChDT05GSUdfTkVfSDgzMDApICs9IG5lLWg4MzAwLm8gODM5MC5vCitvYmotJChDT05GSUdfTkVfSDgzMDApICs9IG5lLWg4MzAwLm8KIAorb2JqLSQoQ09ORklHX1RTSTEwOF9FVEgpICs9IHRzaTEwOF9ldGgubwogb2JqLSQoQ09ORklHX01WNjQzWFhfRVRIKSArPSBtdjY0M3h4X2V0aC5vCiBvYmotJChDT05GSUdfUUxBM1hYWCkgKz0gcWxhM3h4eC5vCiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogb2JqLSQoQ09ORklHX0xQNDg2RSkgKz0gbHA0ODZlLm8KIAogb2JqLSQoQ09ORklHX0VUSDE2SSkgKz0gZXRoMTZpLm8KLW9iai0kKENPTkZJR19aT1JSTzgzOTApICs9IHpvcnJvODM5MC5vIDgzOTAubworb2JqLSQoQ09ORklHX1pPUlJPODM5MCkgKz0gem9ycm84MzkwLm8KIG9iai0kKENPTkZJR19IUExBTkNFKSArPSBocGxhbmNlLm8gNzk5MC5vCiBvYmotJChDT05GSUdfTVZNRTE0N19ORVQpICs9IG12bWUxNDcubyA3OTkwLm8KIG9iai0kKENPTkZJR19FUVVBTElaRVIpICs9IGVxbC5vCkBAIC0xNzgsNyArMTc4LDcgQEAKIG9iai0kKENPTkZJR19BVEFSSV9CSU9ORVQpICs9IGF0YXJpX2Jpb25ldC5vCiBvYmotJChDT05GSUdfQVRBUklfUEFNU05FVCkgKz0gYXRhcmlfcGFtc25ldC5vCiBvYmotJChDT05GSUdfQTIwNjUpICs9IGEyMDY1Lm8KLW9iai0kKENPTkZJR19IWURSQSkgKz0gaHlkcmEubyA4MzkwLm8KK29iai0kKENPTkZJR19IWURSQSkgKz0gaHlkcmEubwogb2JqLSQoQ09ORklHX0FSSUFETkUpICs9IGFyaWFkbmUubwogb2JqLSQoQ09ORklHX0NTODl4MCkgKz0gY3M4OXgwLm8KIG9iai0kKENPTkZJR19NQUNTT05JQykgKz0gbWFjc29uaWMubwpAQCAtMTk3LDYgKzE5Nyw4IEBACiBvYmotJChDT05GSUdfRE05MDAwKSArPSBkbTkwMDAubwogb2JqLSQoQ09ORklHX0ZFQ184WFgpICs9IGZlY184eHgvCiAKK29iai0kKENPTkZJR19NQUNCKSArPSBtYWNiLm8KKwogb2JqLSQoQ09ORklHX0FSTSkgKz0gYXJtLwogb2JqLSQoQ09ORklHX0RFVl9BUFBMRVRBTEspICs9IGFwcGxldGFsay8KIG9iai0kKENPTkZJR19UUikgKz0gdG9rZW5yaW5nLwpAQCAtMjE0LDMgKzIxNiw0IEBACiAKIG9iai0kKENPTkZJR19GU19FTkVUKSArPSBmc19lbmV0LwogCitvYmotJChDT05GSUdfTkVUWEVOX05JQykgKz0gbmV0eGVuLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvU3BhY2UuYyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKaW5kZXggYTY3ZjVlZi4uNjAyZWQzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvU3BhY2UuYworKysgYi9kcml2ZXJzL25ldC9TcGFjZS5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L2RpdmVydC5oPgogCiAvKiBBIHVuaWZpZWQgZXRoZXJuZXQgZGV2aWNlIHByb2JlLiAgVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gaGF2ZSBldmVyeQogICAgZXRoZXJuZXQgYWRhcHRvciBoYXZlIHRoZSBuYW1lICJldGhbMDEyMy4uLl0iLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuYyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKaW5kZXggZWY2NWU1OS4uMTg4OTZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCkBAIC0xNDkwLDMyICsxNDkwLDcgQEAKIAlidWZbMTJdID0gcmVhZGwobW1pbyArIFNUQVQwKTsKIH0KIAotLyoKLWFtZDgxMTFlIGNyYyBnZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIGtlcm5lbAotZXRoZXJfY3JjKCkgZnVuY3Rpb24uCi0qLwotc3RhdGljIGludCBhbWQ4MTExZV9ldGhlcl9jcmMoaW50IGxlbiwgY2hhciogbWFjX2FkZHIpCi17Ci0JaW50IGksYnl0ZTsKLQl1bnNpZ25lZCBjaGFyIG9jdGV0OwotCXUzMiBjcmM9IElOSVRDUkM7CiAKLQlmb3IoYnl0ZT0wOyBieXRlIDwgbGVuOyBieXRlKyspewotCQlvY3RldCA9IG1hY19hZGRyW2J5dGVdOwotCQlmb3IoIGk9MDtpIDwgODsgaSsrKXsKLQkJCS8qSWYgdGhlIG5leHQgYml0IGZvcm0gdGhlIGlucHV0IHN0cmVhbSBpcyAxLHN1YnRyYWN0CQkJCSB0aGUgZGl2aXNvciAoQ1JDMzIpIGZyb20gdGhlIGRpdmlkZW5kKGNyYykuKi8KLQkJCWlmKCAob2N0ZXQgJiAweDEpIF4gKGNyYyAmIDB4MSkgKXsKLQkJCQljcmMgPj49IDE7Ci0JCQkJY3JjIF49IENSQzMyOwotCQkJfQotCQkJZWxzZQotCQkJCWNyYyA+Pj0gMTsKLQotCQkJb2N0ZXQgPj49IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNyYzsKLX0KIC8qCiBUaGlzIGZ1bmN0aW9uIHNldHMgcHJvbWlzY3VvcyBtb2RlLCBhbGwtbXVsdGkgbW9kZSBvciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKIGxpc3QgdG8gdGhlIGRldmljZS4KQEAgLTE1NTYsNyArMTUzMSw3IEBACiAJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKIAlmb3IgKGkgPSAwLCBtY19wdHIgPSBkZXYtPm1jX2xpc3Q7IG1jX3B0ciAmJiBpIDwgZGV2LT5tY19jb3VudDsKIAkJICAgICBpKyssIG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgewotCQliaXRfbnVtID0gKCBhbWQ4MTExZV9ldGhlcl9jcmMoRVRIX0FMRU4sbWNfcHRyLT5kbWlfYWRkcikJCQkJCQkJID4+IDI2ICkgJiAweDNmOworCQliaXRfbnVtID0gKGV0aGVyX2NyY19sZShFVEhfQUxFTiwgbWNfcHRyLT5kbWlfYWRkcikgPj4gMjYpICYgMHgzZjsKIAkJbWNfZmlsdGVyW2JpdF9udW0gPj4gNV0gfD0gMSA8PCAoYml0X251bSAmIDMxKTsKIAl9CiAJYW1kODExMWVfd3JpdGVxKCoodTY0KiltY19maWx0ZXIsbHAtPm1taW8rIExBRFJGKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmggYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5oCmluZGV4IDc3MjdkMzIuLjIwMDc1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmgKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuaApAQCAtNjUxLDEwICs2NTEsNiBAQAogLyogZHJpdmVyIGlvY3RsIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgQU1EODExMUVfUkVHX0RVTVBfTEVOCSAxMypzaXplb2YodTMyKQogCi0vKiBjcmMgZ2VuZXJhdG9yIGNvbnN0YW50cyAqLwotI2RlZmluZSBDUkMzMiAweGVkYjg4MzIwCi0jZGVmaW5lIElOSVRDUkMgMHhGRkZGRkZGRgotCiAvKiBhbWQ4MTExZSBkZXNyaXB0b3IgZm9ybWF0ICovCiAKIHN0cnVjdCBhbWQ4MTExZV90eF9kcnsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYwppbmRleCA0YWU5ODk3Li5mM2ZhYTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCkBAIC01Miw3ICs1MiwxMiBAQAogI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSAiLi4vODM5MC5oIgorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisKKyNkZWZpbmUgZWlfaW5iKF9wKQkgcmVhZGIoKHZvaWQgX19pb21lbSAqKV9wKQorI2RlZmluZSBlaV9vdXRiKF92LF9wKQkgd3JpdGViKF92LCh2b2lkIF9faW9tZW0gKilfcCkKKyNkZWZpbmUgZWlfaW5iX3AoX3ApCSByZWFkYigodm9pZCBfX2lvbWVtICopX3ApCisjZGVmaW5lIGVpX291dGJfcChfdixfcCkgd3JpdGViKF92LCh2b2lkIF9faW9tZW0gKilfcCkKIAogI2RlZmluZSBORVRfREVCVUcgIDAKICNkZWZpbmUgREVCVUdfSU5JVCAyCkBAIC02MCw2ICs2NSwxMSBAQAogI2RlZmluZSBEUlZfTkFNRQkiZXRoZXJoIgogI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xMSIKIAorc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorCSJFdGhlckgvRXRoZXJNIERyaXZlciAoYykgMjAwMi0yMDA0IFJ1c3NlbGwgS2luZyAiIERSVl9WRVJTSU9OICJcbiI7CisKKyNpbmNsdWRlICIuLi9saWI4MzkwLmMiCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOwogCiBzdHJ1Y3QgZXRoZXJoX3ByaXYgewpAQCAtODcsOSArOTcsNiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJFdGhlckgvRXRoZXJNIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9Ci0JIkV0aGVySC9FdGhlck0gRHJpdmVyIChjKSAyMDAyLTIwMDQgUnVzc2VsbCBLaW5nICIgRFJWX1ZFUlNJT04gIlxuIjsKLQogI2RlZmluZSBFVEhFUkg1MDBfREFUQVBPUlQJMHg4MDAJLyogTUVNQyAqLwogI2RlZmluZSBFVEhFUkg1MDBfTlM4MzkwCTB4MDAwCS8qIE1FTUMgKi8KICNkZWZpbmUgRVRIRVJINTAwX0NUUkxQT1JUCTB4ODAwCS8qIElPQyAgKi8KQEAgLTE3Nyw3ICsxODQsNyBAQAogCXN3aXRjaCAoZXRoZXJoX3ByaXYoZGV2KS0+aWQpIHsKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDA6CiAJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwQToKLQkJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOworCQlhZGRyID0gKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyICsgRU4wX1JDTlRISTsKIAogCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgewogCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKQEAgLTIxOCw3ICsyMjUsNyBAQAogCXN3aXRjaCAoZXRoZXJoX3ByaXYoZGV2KS0+aWQpIHsKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDA6CiAJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwQToKLQkJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOworCQlhZGRyID0gKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyICsgRU4wX1JDTlRISTsKIAkJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKIAkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6CiAJCQlzdGF0ID0gMTsKQEAgLTI4MSw3ICsyODgsNyBAQAogZXRoZXJoX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CisJdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOwogCiAJd3JpdGViKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGFkZHIpOwogCkBAIC0zMjcsNyArMzM0LDcgQEAKIAogCWVpX2xvY2FsLT5kbWFpbmcgPSAxOwogCi0JYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CisJYWRkciA9ICh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKIAlkbWFfYmFzZSA9IGV0aGVyaF9wcml2KGRldiktPmRtYV9iYXNlOwogCiAJY291bnQgPSAoY291bnQgKyAxKSAmIH4xOwpAQCAtMzYwLDcgKzM2Nyw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFRYIFJEQ1xuIiwKIAkJCQlkZXYtPm5hbWUpOwogCQkJZXRoZXJoX3Jlc2V0IChkZXYpOwotCQkJTlM4MzkwX2luaXQgKGRldiwgMSk7CisJCQlfX05TODM5MF9pbml0IChkZXYsIDEpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMzg3LDcgKzM5NCw3IEBACiAKIAllaV9sb2NhbC0+ZG1haW5nID0gMTsKIAotCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CiAJZG1hX2Jhc2UgPSBldGhlcmhfcHJpdihkZXYpLT5kbWFfYmFzZTsKIAogCWJ1ZiA9IHNrYi0+ZGF0YTsKQEAgLTQyNyw3ICs0MzQsNyBAQAogCiAJZWlfbG9jYWwtPmRtYWluZyA9IDE7CiAKLQlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKKwlhZGRyID0gKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOwogCWRtYV9iYXNlID0gZXRoZXJoX3ByaXYoZGV2KS0+ZG1hX2Jhc2U7CiAKIAl3cml0ZWIgKEU4MzkwX05PRE1BIHwgRTgzOTBfUEFHRTAgfCBFODM5MF9TVEFSVCwgYWRkciArIEU4MzkwX0NNRCk7CkBAIC00NjUsNyArNDcyLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIF9fZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJLyoKQEAgLTQ5MSw3ICs0OTgsNyBAQAogCQlldGhlcmhfc2V0aWYoZGV2KTsKIAogCWV0aGVyaF9yZXNldChkZXYpOwotCWVpX29wZW4oZGV2KTsKKwlfX2VpX29wZW4oZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTAyLDcgKzUwOSw3IEBACiBzdGF0aWMgaW50CiBldGhlcmhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQllaV9jbG9zZSAoZGV2KTsKKwlfX2VpX2Nsb3NlIChkZXYpOwogCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY1MCw3ICs2NTcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JZGV2ID0gX19hbGxvY19laV9uZXRkZXYoc2l6ZW9mKHN0cnVjdCBldGhlcmhfcHJpdikpOworCWRldiA9IF9fX19hbGxvY19laV9uZXRkZXYoc2l6ZW9mKHN0cnVjdCBldGhlcmhfcHJpdikpOwogCWlmICghZGV2KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gcmVsZWFzZTsKQEAgLTczNiw3ICs3NDMsNyBAQAogCWVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtID0gMDsKIAogCWV0aGVyaF9yZXNldChkZXYpOwotCU5TODM5MF9pbml0KGRldiwgMCk7CisJX19OUzgzOTBfaW5pdChkZXYsIDApOwogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYwppbmRleCA3ZGIzYzhhLi5mMGI2ODc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCkBAIC0zNjAsNyArMzYwLDggQEAKIAlCVUdfT04oIXBoeWRldik7CiAJQlVHX09OKHBoeWRldi0+YXR0YWNoZWRfZGV2KTsKIAotCXBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgcGh5ZGV2LT5kZXYuYnVzX2lkLCAmYXUxMDAwX2FkanVzdF9saW5rLCAwKTsKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwgJmF1MTAwMF9hZGp1c3RfbGluaywgMCwKKwkJCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkpOwogCiAJaWYgKElTX0VSUihwaHlkZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iLCBkZXYtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5jIGIvZHJpdmVycy9uZXQvYm54Mi5jCmluZGV4IDAxYjc2ZDNhLi5mYzJmMWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyLmMKKysrIGIvZHJpdmVycy9uZXQvYm54Mi5jCkBAIC01MywxMSArNTMsMTIgQEAKIAogI2luY2x1ZGUgImJueDIuaCIKICNpbmNsdWRlICJibngyX2Z3LmgiCisjaW5jbHVkZSAiYm54Ml9mdzIuaCIKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyIgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjQuNDUiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiU2VwdGVtYmVyIDI5LCAyMDA2IgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuNS4xIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIk5vdmVtYmVyIDE1LCAyMDA2IgogCiAjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKIApAQCAtODUsNiArODYsNyBAQAogCU5DMzcwRiwKIAlCQ001NzA4LAogCUJDTTU3MDhTLAorCUJDTTU3MDksCiB9IGJvYXJkX3Q7CiAKIC8qIGluZGV4ZWQgYnkgYm9hcmRfdCwgYWJvdmUgKi8KQEAgLTk4LDYgKzEwMCw3IEBACiAJeyAiSFAgTkMzNzBGIE11bHRpZnVuY3Rpb24gR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciIgfSwKIAl7ICJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTcwOCAxMDAwQmFzZS1UIiB9LAogCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzA4IDEwMDBCYXNlLVNYIiB9LAorCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzA5IDEwMDBCYXNlLVQiIH0sCiAJfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJueDJfcGNpX3RibFtdID0gewpAQCAtMTE1LDYgKzExOCw4IEBACiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzA2UyB9LAogCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTcwOFMsCiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzA4UyB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTcwOSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDkgfSwKIAl7IDAsIH0KIH07CiAKQEAgLTIzNiw4ICsyNDEsMjMgQEAKIGJueDJfY3R4X3dyKHN0cnVjdCBibngyICpicCwgdTMyIGNpZF9hZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQogewogCW9mZnNldCArPSBjaWRfYWRkcjsKLQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0RBVEFfQURSLCBvZmZzZXQpOwotCVJFR19XUihicCwgQk5YMl9DVFhfREFUQSwgdmFsKTsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKKwkJaW50IGk7CisKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9DVFhfREFUQSwgdmFsKTsKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9DVFhfQ1RSTCwKKwkJICAgICAgIG9mZnNldCB8IEJOWDJfQ1RYX0NUWF9DVFJMX1dSSVRFX1JFUSk7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCXUzMiB2YWw7CisJCQl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfQ1RYX0NUWF9DVFJMKTsKKwkJCWlmICgodmFsICYgQk5YMl9DVFhfQ1RYX0NUUkxfV1JJVEVfUkVRKSA9PSAwKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDUpOworCQl9CisJfSBlbHNlIHsKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9EQVRBX0FEUiwgb2Zmc2V0KTsKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9EQVRBLCB2YWwpOworCX0KIH0KIAogc3RhdGljIGludApAQCAtNDAzLDYgKzQyMywxNCBAQAogewogCWludCBpOwogCisJZm9yIChpID0gMDsgaSA8IGJwLT5jdHhfcGFnZXM7IGkrKykgeworCQlpZiAoYnAtPmN0eF9ibGtbaV0pIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnAtPnBkZXYsIEJDTV9QQUdFX1NJWkUsCisJCQkJCSAgICBicC0+Y3R4X2Jsa1tpXSwKKwkJCQkJICAgIGJwLT5jdHhfYmxrX21hcHBpbmdbaV0pOworCQkJYnAtPmN0eF9ibGtbaV0gPSBOVUxMOworCQl9CisJfQogCWlmIChicC0+c3RhdHVzX2JsaykgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJwLT5wZGV2LCBicC0+c3RhdHVzX3N0YXRzX3NpemUsCiAJCQkJICAgIGJwLT5zdGF0dXNfYmxrLCBicC0+c3RhdHVzX2Jsa19tYXBwaW5nKTsKQEAgLTQ4MSw2ICs1MDksMTggQEAKIAogCWJwLT5zdGF0c19ibGtfbWFwcGluZyA9IGJwLT5zdGF0dXNfYmxrX21hcHBpbmcgKyBzdGF0dXNfYmxrX3NpemU7CiAKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKKwkJYnAtPmN0eF9wYWdlcyA9IDB4MjAwMCAvIEJDTV9QQUdFX1NJWkU7CisJCWlmIChicC0+Y3R4X3BhZ2VzID09IDApCisJCQlicC0+Y3R4X3BhZ2VzID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IGJwLT5jdHhfcGFnZXM7IGkrKykgeworCQkJYnAtPmN0eF9ibGtbaV0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChicC0+cGRldiwKKwkJCQkJCUJDTV9QQUdFX1NJWkUsCisJCQkJCQkmYnAtPmN0eF9ibGtfbWFwcGluZ1tpXSk7CisJCQlpZiAoYnAtPmN0eF9ibGtbaV0gPT0gTlVMTCkKKwkJCQlnb3RvIGFsbG9jX21lbV9lcnI7CisJCX0KKwl9CiAJcmV0dXJuIDA7CiAKIGFsbG9jX21lbV9lcnI6CkBAIC04MDMsMTMgKzg0MywxMyBAQAogCiAJdmFsICY9IH4oQk5YMl9FTUFDX01PREVfUE9SVCB8IEJOWDJfRU1BQ19NT0RFX0hBTEZfRFVQTEVYIHwKIAkJQk5YMl9FTUFDX01PREVfTUFDX0xPT1AgfCBCTlgyX0VNQUNfTU9ERV9GT1JDRV9MSU5LIHwKLQkJQk5YMl9FTUFDX01PREVfMjVHKTsKKwkJQk5YMl9FTUFDX01PREVfMjVHX01PREUpOwogCiAJaWYgKGJwLT5saW5rX3VwKSB7CiAJCXN3aXRjaCAoYnAtPmxpbmVfc3BlZWQpIHsKIAkJCWNhc2UgU1BFRURfMTA6Ci0JCQkJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA4KSB7Ci0JCQkJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV9QT1JUX01JSV8xMDsKKwkJCQlpZiAoQ0hJUF9OVU0oYnApICE9IENISVBfTlVNXzU3MDYpIHsKKwkJCQkJdmFsIHw9IEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJXzEwTTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtODE3LDcgKzg1Nyw3IEBACiAJCQkJdmFsIHw9IEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJOwogCQkJCWJyZWFrOwogCQkJY2FzZSBTUEVFRF8yNTAwOgotCQkJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV8yNUc7CisJCQkJdmFsIHw9IEJOWDJfRU1BQ19NT0RFXzI1R19NT0RFOwogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQkJY2FzZSBTUEVFRF8xMDAwOgogCQkJCXZhbCB8PSBCTlgyX0VNQUNfTU9ERV9QT1JUX0dNSUk7CkBAIC04NjAsNyArOTAwLDcgQEAKIAl1MzIgYm1zcjsKIAl1OCBsaW5rX3VwOwogCi0JaWYgKGJwLT5sb29wYmFjayA9PSBNQUNfTE9PUEJBQ0spIHsKKwlpZiAoYnAtPmxvb3BiYWNrID09IE1BQ19MT09QQkFDSyB8fCBicC0+bG9vcGJhY2sgPT0gUEhZX0xPT1BCQUNLKSB7CiAJCWJwLT5saW5rX3VwID0gMTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTAyLDYgKzk0Miw3IEBACiAJCQl1MzIgYm1jcjsKIAogCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKwkJCWJtY3IgJj0gfkJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMDsKIAkJCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgewogCQkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jciB8CiAJCQkJCUJNQ1JfQU5FTkFCTEUpOwpAQCAtOTg4LDcgKzEwMjksMjEgQEAKIAkJdTMyIG5ld19ibWNyOwogCQlpbnQgZm9yY2VfbGlua19kb3duID0gMDsKIAotCQlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDgpIHsKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0FEVkVSVElTRSwgJmFkdik7CisJCWFkdiAmPSB+KEFEVkVSVElTRV8xMDAwWEZVTEwgfCBBRFZFUlRJU0VfMTAwMFhIQUxGKTsKKworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOworCQluZXdfYm1jciA9IGJtY3IgJiB+KEJNQ1JfQU5FTkFCTEUgfCBCQ001NzA4U19CTUNSX0ZPUkNFXzI1MDApOworCQluZXdfYm1jciB8PSBCTUNSX1NQRUVEMTAwMDsKKwkJaWYgKGJwLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8yNTAwKSB7CisJCQluZXdfYm1jciB8PSBCQ001NzA4U19CTUNSX0ZPUkNFXzI1MDA7CisJCQlibngyX3JlYWRfcGh5KGJwLCBCQ001NzA4U19VUDEsICZ1cDEpOworCQkJaWYgKCEodXAxICYgQkNNNTcwOFNfVVAxXzJHNSkpIHsKKwkJCQl1cDEgfD0gQkNNNTcwOFNfVVAxXzJHNTsKKwkJCQlibngyX3dyaXRlX3BoeShicCwgQkNNNTcwOFNfVVAxLCB1cDEpOworCQkJCWZvcmNlX2xpbmtfZG93biA9IDE7CisJCQl9CisJCX0gZWxzZSBpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDgpIHsKIAkJCWJueDJfcmVhZF9waHkoYnAsIEJDTTU3MDhTX1VQMSwgJnVwMSk7CiAJCQlpZiAodXAxICYgQkNNNTcwOFNfVVAxXzJHNSkgewogCQkJCXVwMSAmPSB+QkNNNTcwOFNfVVAxXzJHNTsKQEAgLTk5NywxMiArMTA1Miw2IEBACiAJCQl9CiAJCX0KIAotCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQURWRVJUSVNFLCAmYWR2KTsKLQkJYWR2ICY9IH4oQURWRVJUSVNFXzEwMDBYRlVMTCB8IEFEVkVSVElTRV8xMDAwWEhBTEYpOwotCi0JCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7Ci0JCW5ld19ibWNyID0gYm1jciAmIH5CTUNSX0FORU5BQkxFOwotCQluZXdfYm1jciB8PSBCTUNSX1NQRUVEMTAwMDsKIAkJaWYgKGJwLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CiAJCQlhZHYgfD0gQURWRVJUSVNFXzEwMDBYRlVMTDsKIAkJCW5ld19ibWNyIHw9IEJNQ1JfRlVMTERQTFg7CkBAIC0xMDIzLDYgKzEwNzIsNyBAQAogCQkJCWJwLT5saW5rX3VwID0gMDsKIAkJCQluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKIAkJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIG5ld19ibWNyKTsKKwkJCQlibngyX3JlcG9ydF9saW5rKGJwKTsKIAkJCX0KIAkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQURWRVJUSVNFLCBhZHYpOwogCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBuZXdfYm1jcik7CkBAIC0xMDQ4LDMwICsxMDk4LDI2IEBACiAJaWYgKChhZHYgIT0gbmV3X2FkdikgfHwgKChibWNyICYgQk1DUl9BTkVOQUJMRSkgPT0gMCkpIHsKIAkJLyogRm9yY2UgYSBsaW5rIGRvd24gdmlzaWJsZSBvbiB0aGUgb3RoZXIgc2lkZSAqLwogCQlpZiAoYnAtPmxpbmtfdXApIHsKLQkJCWludCBpOwotCiAJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIEJNQ1JfTE9PUEJBQ0spOwotCQkJZm9yIChpID0gMDsgaSA8IDExMDsgaSsrKSB7Ci0JCQkJdWRlbGF5KDEwMCk7Ci0JCQl9CisJCQlzcGluX3VubG9ja19iaCgmYnAtPnBoeV9sb2NrKTsKKwkJCW1zbGVlcCgyMCk7CisJCQlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7CiAJCX0KIAogCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CiAJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jciB8IEJNQ1JfQU5SRVNUQVJUIHwKIAkJCUJNQ1JfQU5FTkFCTEUpOwotCQlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDYpIHsKLQkJCS8qIFNwZWVkIHVwIGxpbmstdXAgdGltZSB3aGVuIHRoZSBsaW5rIHBhcnRuZXIKLQkJCSAqIGRvZXMgbm90IGF1dG9uZWdvdGlhdGUgd2hpY2ggaXMgdmVyeSBjb21tb24KLQkJCSAqIGluIGJsYWRlIHNlcnZlcnMuIFNvbWUgYmxhZGUgc2VydmVycyB1c2UKLQkJCSAqIElQTUkgZm9yIGtlcmJvYXJkIGlucHV0IGFuZCBpdCdzIGltcG9ydGFudAotCQkJICogdG8gbWluaW1pemUgbGluayBkaXNydXB0aW9ucy4gQXV0b25lZy4gaW52b2x2ZXMKLQkJCSAqIGV4Y2hhbmdpbmcgYmFzZSBwYWdlcyBwbHVzIDMgbmV4dCBwYWdlcyBhbmQKLQkJCSAqIG5vcm1hbGx5IGNvbXBsZXRlcyBpbiBhYm91dCAxMjAgbXNlYy4KLQkJCSAqLwotCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBTRVJERVNfQU5fVElNRU9VVDsKLQkJCWJwLT5zZXJkZXNfYW5fcGVuZGluZyA9IDE7Ci0JCQltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKLQkJfQorCQkvKiBTcGVlZCB1cCBsaW5rLXVwIHRpbWUgd2hlbiB0aGUgbGluayBwYXJ0bmVyCisJCSAqIGRvZXMgbm90IGF1dG9uZWdvdGlhdGUgd2hpY2ggaXMgdmVyeSBjb21tb24KKwkJICogaW4gYmxhZGUgc2VydmVycy4gU29tZSBibGFkZSBzZXJ2ZXJzIHVzZQorCQkgKiBJUE1JIGZvciBrZXJib2FyZCBpbnB1dCBhbmQgaXQncyBpbXBvcnRhbnQKKwkJICogdG8gbWluaW1pemUgbGluayBkaXNydXB0aW9ucy4gQXV0b25lZy4gaW52b2x2ZXMKKwkJICogZXhjaGFuZ2luZyBiYXNlIHBhZ2VzIHBsdXMgMyBuZXh0IHBhZ2VzIGFuZAorCQkgKiBub3JtYWxseSBjb21wbGV0ZXMgaW4gYWJvdXQgMTIwIG1zZWMuCisJCSAqLworCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IFNFUkRFU19BTl9USU1FT1VUOworCQlicC0+c2VyZGVzX2FuX3BlbmRpbmcgPSAxOworCQltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExNTMsNyArMTE5OSw2IEBACiAJfQogCWlmIChuZXdfYm1jciAhPSBibWNyKSB7CiAJCXUzMiBibXNyOwotCQlpbnQgaSA9IDA7CiAKIAkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKIAkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKQEAgLTExNjEsMTIgKzEyMDYsMTIgQEAKIAkJaWYgKGJtc3IgJiBCTVNSX0xTVEFUVVMpIHsKIAkJCS8qIEZvcmNlIGxpbmsgZG93biAqLwogCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBCTUNSX0xPT1BCQUNLKTsKLQkJCWRvIHsKLQkJCQl1ZGVsYXkoMTAwKTsKLQkJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpOwotCQkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7Ci0JCQkJaSsrOwotCQkJfSB3aGlsZSAoKGJtc3IgJiBCTVNSX0xTVEFUVVMpICYmIChpIDwgNjIwKSk7CisJCQlzcGluX3VubG9ja19iaCgmYnAtPnBoeV9sb2NrKTsKKwkJCW1zbGVlcCg1MCk7CisJCQlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7CisKKwkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7CisJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpOwogCQl9CiAKIAkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBuZXdfYm1jcik7CkBAIC0xMjU4LDkgKzEzMDMsOCBAQAogewogCWJwLT5waHlfZmxhZ3MgJj0gflBIWV9QQVJBTExFTF9ERVRFQ1RfRkxBRzsKIAotCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikgewotICAgICAgICAJUkVHX1dSKGJwLCBCTlgyX01JU0NfVU5VU0VEMCwgMHgzMDApOwotCX0KKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDYpCisgICAgICAgIAlSRUdfV1IoYnAsIEJOWDJfTUlTQ19HUF9IV19DVEwwLCAweDMwMCk7CiAKIAlpZiAoYnAtPmRldi0+bXR1ID4gMTUwMCkgewogCQl1MzIgdmFsOwpAQCAtMTM5NywxMyArMTQ0MSwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAJCWlmIChibngyX3Rlc3RfbGluayhicCkgPT0gMCkKIAkJCWJyZWFrOwotCQl1ZGVsYXkoMTApOworCQltc2xlZXAoMTAwKTsKIAl9CiAKIAltYWNfbW9kZSA9IFJFR19SRChicCwgQk5YMl9FTUFDX01PREUpOwogCW1hY19tb2RlICY9IH4oQk5YMl9FTUFDX01PREVfUE9SVCB8IEJOWDJfRU1BQ19NT0RFX0hBTEZfRFVQTEVYIHwKIAkJICAgICAgQk5YMl9FTUFDX01PREVfTUFDX0xPT1AgfCBCTlgyX0VNQUNfTU9ERV9GT1JDRV9MSU5LIHwKLQkJICAgICAgQk5YMl9FTUFDX01PREVfMjVHKTsKKwkJICAgICAgQk5YMl9FTUFDX01PREVfMjVHX01PREUpOwogCiAJbWFjX21vZGUgfD0gQk5YMl9FTUFDX01PREVfUE9SVF9HTUlJOwogCVJFR19XUihicCwgQk5YMl9FTUFDX01PREUsIG1hY19tb2RlKTsKQEAgLTE0NTQsNiArMTQ5OCw0MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitibngyX2luaXRfNTcwOV9jb250ZXh0KHN0cnVjdCBibngyICpicCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwl1MzIgdmFsOworCisJdmFsID0gQk5YMl9DVFhfQ09NTUFORF9FTkFCTEVEIHwgQk5YMl9DVFhfQ09NTUFORF9NRU1fSU5JVCB8ICgxIDw8IDEyKTsKKwl2YWwgfD0gKEJDTV9QQUdFX0JJVFMgLSA4KSA8PCAxNjsKKwlSRUdfV1IoYnAsIEJOWDJfQ1RYX0NPTU1BTkQsIHZhbCk7CisJZm9yIChpID0gMDsgaSA8IGJwLT5jdHhfcGFnZXM7IGkrKykgeworCQlpbnQgajsKKworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTAsCisJCSAgICAgICAoYnAtPmN0eF9ibGtfbWFwcGluZ1tpXSAmIDB4ZmZmZmZmZmYpIHwKKwkJICAgICAgIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTBfVkFMSUQpOworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTEsCisJCSAgICAgICAodTY0KSBicC0+Y3R4X2Jsa19tYXBwaW5nW2ldID4+IDMyKTsKKwkJUkVHX1dSKGJwLCBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0NUUkwsIGkgfAorCQkgICAgICAgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9DVFJMX1dSSVRFX1JFUSk7CisJCWZvciAoaiA9IDA7IGogPCAxMDsgaisrKSB7CisKKwkJCXZhbCA9IFJFR19SRChicCwgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9DVFJMKTsKKwkJCWlmICghKHZhbCAmIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTF9XUklURV9SRVEpKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDUpOworCQl9CisJCWlmICh2YWwgJiBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0NUUkxfV1JJVEVfUkVRKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZAogYm54Ml9pbml0X2NvbnRleHQoc3RydWN0IGJueDIgKmJwKQogewpAQCAtMTU3Niw5ICsxNjU0LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKHVubGlrZWx5KChhbGlnbiA9ICh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEgJiAweDcpKSkgewotCQlza2JfcmVzZXJ2ZShza2IsIDggLSBhbGlnbik7Ci0JfQorCWlmICh1bmxpa2VseSgoYWxpZ24gPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhICYgKEJOWDJfUlhfQUxJR04gLSAxKSkpKQorCQlza2JfcmVzZXJ2ZShza2IsIEJOWDJfUlhfQUxJR04gLSBhbGlnbik7CiAKIAltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYnAtPnBkZXYsIHNrYi0+ZGF0YSwgYnAtPnJ4X2J1Zl91c2Vfc2l6ZSwKIAkJUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTIwNDAsNyArMjExNyw4IEBACiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewogCQkvKiBQcm9taXNjdW91cyBtb2RlLiAqLwogCQlyeF9tb2RlIHw9IEJOWDJfRU1BQ19SWF9NT0RFX1BST01JU0NVT1VTOwotCQlzb3J0X21vZGUgfD0gQk5YMl9SUE1fU09SVF9VU0VSMF9QUk9NX0VOOworCQlzb3J0X21vZGUgfD0gQk5YMl9SUE1fU09SVF9VU0VSMF9QUk9NX0VOIHwKKwkJCSAgICAgQk5YMl9SUE1fU09SVF9VU0VSMF9QUk9NX1ZMQU47CiAJfQogCWVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKIAkJZm9yIChpID0gMDsgaSA8IE5VTV9NQ19IQVNIX1JFR0lTVEVSUzsgaSsrKSB7CkBAIC0yMjA4LDExICsyMjg2LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogbG9hZF9jcHVfZncoc3RydWN0IGJueDIgKmJwLCBzdHJ1Y3QgY3B1X3JlZyAqY3B1X3JlZywgc3RydWN0IGZ3X2luZm8gKmZ3KQogewogCXUzMiBvZmZzZXQ7CiAJdTMyIHZhbDsKKwlpbnQgcmM7CiAKIAkvKiBIYWx0IHRoZSBDUFUuICovCiAJdmFsID0gUkVHX1JEX0lORChicCwgY3B1X3JlZy0+bW9kZSk7CkBAIC0yMjIyLDcgKzIzMDEsMTggQEAKIAogCS8qIExvYWQgdGhlIFRleHQgYXJlYS4gKi8KIAlvZmZzZXQgPSBjcHVfcmVnLT5zcGFkX2Jhc2UgKyAoZnctPnRleHRfYWRkciAtIGNwdV9yZWctPm1pcHNfdmlld19iYXNlKTsKLQlpZiAoZnctPnRleHQpIHsKKwlpZiAoZnctPmd6X3RleHQpIHsKKwkJdTMyIHRleHRfbGVuOworCQl2b2lkICp0ZXh0OworCisJCXJjID0gYm54Ml9ndW56aXAoYnAsIGZ3LT5nel90ZXh0LCBmdy0+Z3pfdGV4dF9sZW4sICZ0ZXh0LAorCQkJCSAmdGV4dF9sZW4pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJZnctPnRleHQgPSB0ZXh0OworCX0KKwlpZiAoZnctPmd6X3RleHQpIHsKIAkJaW50IGo7CiAKIAkJZm9yIChqID0gMDsgaiA8IChmdy0+dGV4dF9sZW4gLyA0KTsgaisrLCBvZmZzZXQgKz0gNCkgewpAQCAtMjI4MCwxMyArMjM3MCwxNSBAQAogCXZhbCAmPSB+Y3B1X3JlZy0+bW9kZV92YWx1ZV9oYWx0OwogCVJFR19XUl9JTkQoYnAsIGNwdV9yZWctPnN0YXRlLCBjcHVfcmVnLT5zdGF0ZV92YWx1ZV9jbGVhcik7CiAJUkVHX1dSX0lORChicCwgY3B1X3JlZy0+bW9kZSwgdmFsKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBibngyX2luaXRfY3B1cyhzdHJ1Y3QgYm54MiAqYnApCiB7CiAJc3RydWN0IGNwdV9yZWcgY3B1X3JlZzsKLQlzdHJ1Y3QgZndfaW5mbyBmdzsKKwlzdHJ1Y3QgZndfaW5mbyAqZnc7CiAJaW50IHJjID0gMDsKIAl2b2lkICp0ZXh0OwogCXUzMiB0ZXh0X2xlbjsKQEAgLTIzMjMsNDQgKzI0MTUsMTUgQEAKIAljcHVfcmVnLnNwYWRfYmFzZSA9IEJOWDJfUlhQX1NDUkFUQ0g7CiAJY3B1X3JlZy5taXBzX3ZpZXdfYmFzZSA9IDB4ODAwMDAwMDsKIAotCWZ3LnZlcl9tYWpvciA9IGJueDJfUlhQX2IwNkZ3UmVsZWFzZU1ham9yOwotCWZ3LnZlcl9taW5vciA9IGJueDJfUlhQX2IwNkZ3UmVsZWFzZU1pbm9yOwotCWZ3LnZlcl9maXggPSBibngyX1JYUF9iMDZGd1JlbGVhc2VGaXg7Ci0JZncuc3RhcnRfYWRkciA9IGJueDJfUlhQX2IwNkZ3U3RhcnRBZGRyOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkKKwkJZncgPSAmYm54Ml9yeHBfZndfMDk7CisJZWxzZQorCQlmdyA9ICZibngyX3J4cF9md18wNjsKIAotCWZ3LnRleHRfYWRkciA9IGJueDJfUlhQX2IwNkZ3VGV4dEFkZHI7Ci0JZncudGV4dF9sZW4gPSBibngyX1JYUF9iMDZGd1RleHRMZW47Ci0JZncudGV4dF9pbmRleCA9IDA7Ci0KLQlyYyA9IGJueDJfZ3VuemlwKGJwLCBibngyX1JYUF9iMDZGd1RleHQsIHNpemVvZihibngyX1JYUF9iMDZGd1RleHQpLAotCQkJICZ0ZXh0LCAmdGV4dF9sZW4pOworCXJjID0gbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCBmdyk7CiAJaWYgKHJjKQogCQlnb3RvIGluaXRfY3B1X2VycjsKIAotCWZ3LnRleHQgPSB0ZXh0OwotCi0JZncuZGF0YV9hZGRyID0gYm54Ml9SWFBfYjA2RndEYXRhQWRkcjsKLQlmdy5kYXRhX2xlbiA9IGJueDJfUlhQX2IwNkZ3RGF0YUxlbjsKLQlmdy5kYXRhX2luZGV4ID0gMDsKLQlmdy5kYXRhID0gYm54Ml9SWFBfYjA2RndEYXRhOwotCi0JZncuc2Jzc19hZGRyID0gYm54Ml9SWFBfYjA2RndTYnNzQWRkcjsKLQlmdy5zYnNzX2xlbiA9IGJueDJfUlhQX2IwNkZ3U2Jzc0xlbjsKLQlmdy5zYnNzX2luZGV4ID0gMDsKLQlmdy5zYnNzID0gYm54Ml9SWFBfYjA2RndTYnNzOwotCi0JZncuYnNzX2FkZHIgPSBibngyX1JYUF9iMDZGd0Jzc0FkZHI7Ci0JZncuYnNzX2xlbiA9IGJueDJfUlhQX2IwNkZ3QnNzTGVuOwotCWZ3LmJzc19pbmRleCA9IDA7Ci0JZncuYnNzID0gYm54Ml9SWFBfYjA2RndCc3M7Ci0KLQlmdy5yb2RhdGFfYWRkciA9IGJueDJfUlhQX2IwNkZ3Um9kYXRhQWRkcjsKLQlmdy5yb2RhdGFfbGVuID0gYm54Ml9SWFBfYjA2RndSb2RhdGFMZW47Ci0JZncucm9kYXRhX2luZGV4ID0gMDsKLQlmdy5yb2RhdGEgPSBibngyX1JYUF9iMDZGd1JvZGF0YTsKLQotCWxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgJmZ3KTsKLQogCS8qIEluaXRpYWxpemUgdGhlIFRYIFByb2Nlc3Nvci4gKi8KIAljcHVfcmVnLm1vZGUgPSBCTlgyX1RYUF9DUFVfTU9ERTsKIAljcHVfcmVnLm1vZGVfdmFsdWVfaGFsdCA9IEJOWDJfVFhQX0NQVV9NT0RFX1NPRlRfSEFMVDsKQEAgLTIzNzUsNDQgKzI0MzgsMTUgQEAKIAljcHVfcmVnLnNwYWRfYmFzZSA9IEJOWDJfVFhQX1NDUkFUQ0g7CiAJY3B1X3JlZy5taXBzX3ZpZXdfYmFzZSA9IDB4ODAwMDAwMDsKIAotCWZ3LnZlcl9tYWpvciA9IGJueDJfVFhQX2IwNkZ3UmVsZWFzZU1ham9yOwotCWZ3LnZlcl9taW5vciA9IGJueDJfVFhQX2IwNkZ3UmVsZWFzZU1pbm9yOwotCWZ3LnZlcl9maXggPSBibngyX1RYUF9iMDZGd1JlbGVhc2VGaXg7Ci0JZncuc3RhcnRfYWRkciA9IGJueDJfVFhQX2IwNkZ3U3RhcnRBZGRyOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkKKwkJZncgPSAmYm54Ml90eHBfZndfMDk7CisJZWxzZQorCQlmdyA9ICZibngyX3R4cF9md18wNjsKIAotCWZ3LnRleHRfYWRkciA9IGJueDJfVFhQX2IwNkZ3VGV4dEFkZHI7Ci0JZncudGV4dF9sZW4gPSBibngyX1RYUF9iMDZGd1RleHRMZW47Ci0JZncudGV4dF9pbmRleCA9IDA7Ci0KLQlyYyA9IGJueDJfZ3VuemlwKGJwLCBibngyX1RYUF9iMDZGd1RleHQsIHNpemVvZihibngyX1RYUF9iMDZGd1RleHQpLAotCQkJICZ0ZXh0LCAmdGV4dF9sZW4pOworCXJjID0gbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCBmdyk7CiAJaWYgKHJjKQogCQlnb3RvIGluaXRfY3B1X2VycjsKIAotCWZ3LnRleHQgPSB0ZXh0OwotCi0JZncuZGF0YV9hZGRyID0gYm54Ml9UWFBfYjA2RndEYXRhQWRkcjsKLQlmdy5kYXRhX2xlbiA9IGJueDJfVFhQX2IwNkZ3RGF0YUxlbjsKLQlmdy5kYXRhX2luZGV4ID0gMDsKLQlmdy5kYXRhID0gYm54Ml9UWFBfYjA2RndEYXRhOwotCi0JZncuc2Jzc19hZGRyID0gYm54Ml9UWFBfYjA2RndTYnNzQWRkcjsKLQlmdy5zYnNzX2xlbiA9IGJueDJfVFhQX2IwNkZ3U2Jzc0xlbjsKLQlmdy5zYnNzX2luZGV4ID0gMDsKLQlmdy5zYnNzID0gYm54Ml9UWFBfYjA2RndTYnNzOwotCi0JZncuYnNzX2FkZHIgPSBibngyX1RYUF9iMDZGd0Jzc0FkZHI7Ci0JZncuYnNzX2xlbiA9IGJueDJfVFhQX2IwNkZ3QnNzTGVuOwotCWZ3LmJzc19pbmRleCA9IDA7Ci0JZncuYnNzID0gYm54Ml9UWFBfYjA2RndCc3M7Ci0KLQlmdy5yb2RhdGFfYWRkciA9IGJueDJfVFhQX2IwNkZ3Um9kYXRhQWRkcjsKLQlmdy5yb2RhdGFfbGVuID0gYm54Ml9UWFBfYjA2RndSb2RhdGFMZW47Ci0JZncucm9kYXRhX2luZGV4ID0gMDsKLQlmdy5yb2RhdGEgPSBibngyX1RYUF9iMDZGd1JvZGF0YTsKLQotCWxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgJmZ3KTsKLQogCS8qIEluaXRpYWxpemUgdGhlIFRYIFBhdGNoLXVwIFByb2Nlc3Nvci4gKi8KIAljcHVfcmVnLm1vZGUgPSBCTlgyX1RQQVRfQ1BVX01PREU7CiAJY3B1X3JlZy5tb2RlX3ZhbHVlX2hhbHQgPSBCTlgyX1RQQVRfQ1BVX01PREVfU09GVF9IQUxUOwpAQCAtMjQyNyw0NCArMjQ2MSwxNSBAQAogCWNwdV9yZWcuc3BhZF9iYXNlID0gQk5YMl9UUEFUX1NDUkFUQ0g7CiAJY3B1X3JlZy5taXBzX3ZpZXdfYmFzZSA9IDB4ODAwMDAwMDsKIAotCWZ3LnZlcl9tYWpvciA9IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VNYWpvcjsKLQlmdy52ZXJfbWlub3IgPSBibngyX1RQQVRfYjA2RndSZWxlYXNlTWlub3I7Ci0JZncudmVyX2ZpeCA9IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VGaXg7Ci0JZncuc3RhcnRfYWRkciA9IGJueDJfVFBBVF9iMDZGd1N0YXJ0QWRkcjsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpCisJCWZ3ID0gJmJueDJfdHBhdF9md18wOTsKKwllbHNlCisJCWZ3ID0gJmJueDJfdHBhdF9md18wNjsKIAotCWZ3LnRleHRfYWRkciA9IGJueDJfVFBBVF9iMDZGd1RleHRBZGRyOwotCWZ3LnRleHRfbGVuID0gYm54Ml9UUEFUX2IwNkZ3VGV4dExlbjsKLQlmdy50ZXh0X2luZGV4ID0gMDsKLQotCXJjID0gYm54Ml9ndW56aXAoYnAsIGJueDJfVFBBVF9iMDZGd1RleHQsIHNpemVvZihibngyX1RQQVRfYjA2RndUZXh0KSwKLQkJCSAmdGV4dCwgJnRleHRfbGVuKTsKKwlyYyA9IGxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgZncpOwogCWlmIChyYykKIAkJZ290byBpbml0X2NwdV9lcnI7CiAKLQlmdy50ZXh0ID0gdGV4dDsKLQotCWZ3LmRhdGFfYWRkciA9IGJueDJfVFBBVF9iMDZGd0RhdGFBZGRyOwotCWZ3LmRhdGFfbGVuID0gYm54Ml9UUEFUX2IwNkZ3RGF0YUxlbjsKLQlmdy5kYXRhX2luZGV4ID0gMDsKLQlmdy5kYXRhID0gYm54Ml9UUEFUX2IwNkZ3RGF0YTsKLQotCWZ3LnNic3NfYWRkciA9IGJueDJfVFBBVF9iMDZGd1Nic3NBZGRyOwotCWZ3LnNic3NfbGVuID0gYm54Ml9UUEFUX2IwNkZ3U2Jzc0xlbjsKLQlmdy5zYnNzX2luZGV4ID0gMDsKLQlmdy5zYnNzID0gYm54Ml9UUEFUX2IwNkZ3U2JzczsKLQotCWZ3LmJzc19hZGRyID0gYm54Ml9UUEFUX2IwNkZ3QnNzQWRkcjsKLQlmdy5ic3NfbGVuID0gYm54Ml9UUEFUX2IwNkZ3QnNzTGVuOwotCWZ3LmJzc19pbmRleCA9IDA7Ci0JZncuYnNzID0gYm54Ml9UUEFUX2IwNkZ3QnNzOwotCi0JZncucm9kYXRhX2FkZHIgPSBibngyX1RQQVRfYjA2RndSb2RhdGFBZGRyOwotCWZ3LnJvZGF0YV9sZW4gPSBibngyX1RQQVRfYjA2RndSb2RhdGFMZW47Ci0JZncucm9kYXRhX2luZGV4ID0gMDsKLQlmdy5yb2RhdGEgPSBibngyX1RQQVRfYjA2RndSb2RhdGE7Ci0KLQlsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsICZmdyk7Ci0KIAkvKiBJbml0aWFsaXplIHRoZSBDb21wbGV0aW9uIFByb2Nlc3Nvci4gKi8KIAljcHVfcmVnLm1vZGUgPSBCTlgyX0NPTV9DUFVfTU9ERTsKIAljcHVfcmVnLm1vZGVfdmFsdWVfaGFsdCA9IEJOWDJfQ09NX0NQVV9NT0RFX1NPRlRfSEFMVDsKQEAgLTI0NzksNDQgKzI0ODQsMzYgQEAKIAljcHVfcmVnLnNwYWRfYmFzZSA9IEJOWDJfQ09NX1NDUkFUQ0g7CiAJY3B1X3JlZy5taXBzX3ZpZXdfYmFzZSA9IDB4ODAwMDAwMDsKIAotCWZ3LnZlcl9tYWpvciA9IGJueDJfQ09NX2IwNkZ3UmVsZWFzZU1ham9yOwotCWZ3LnZlcl9taW5vciA9IGJueDJfQ09NX2IwNkZ3UmVsZWFzZU1pbm9yOwotCWZ3LnZlcl9maXggPSBibngyX0NPTV9iMDZGd1JlbGVhc2VGaXg7Ci0JZncuc3RhcnRfYWRkciA9IGJueDJfQ09NX2IwNkZ3U3RhcnRBZGRyOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkKKwkJZncgPSAmYm54Ml9jb21fZndfMDk7CisJZWxzZQorCQlmdyA9ICZibngyX2NvbV9md18wNjsKIAotCWZ3LnRleHRfYWRkciA9IGJueDJfQ09NX2IwNkZ3VGV4dEFkZHI7Ci0JZncudGV4dF9sZW4gPSBibngyX0NPTV9iMDZGd1RleHRMZW47Ci0JZncudGV4dF9pbmRleCA9IDA7Ci0KLQlyYyA9IGJueDJfZ3VuemlwKGJwLCBibngyX0NPTV9iMDZGd1RleHQsIHNpemVvZihibngyX0NPTV9iMDZGd1RleHQpLAotCQkJICZ0ZXh0LCAmdGV4dF9sZW4pOworCXJjID0gbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCBmdyk7CiAJaWYgKHJjKQogCQlnb3RvIGluaXRfY3B1X2VycjsKIAotCWZ3LnRleHQgPSB0ZXh0OworCS8qIEluaXRpYWxpemUgdGhlIENvbW1hbmQgUHJvY2Vzc29yLiAqLworCWNwdV9yZWcubW9kZSA9IEJOWDJfQ1BfQ1BVX01PREU7CisJY3B1X3JlZy5tb2RlX3ZhbHVlX2hhbHQgPSBCTlgyX0NQX0NQVV9NT0RFX1NPRlRfSEFMVDsKKwljcHVfcmVnLm1vZGVfdmFsdWVfc3N0ZXAgPSBCTlgyX0NQX0NQVV9NT0RFX1NURVBfRU5BOworCWNwdV9yZWcuc3RhdGUgPSBCTlgyX0NQX0NQVV9TVEFURTsKKwljcHVfcmVnLnN0YXRlX3ZhbHVlX2NsZWFyID0gMHhmZmZmZmY7CisJY3B1X3JlZy5ncHIwID0gQk5YMl9DUF9DUFVfUkVHX0ZJTEU7CisJY3B1X3JlZy5ldm1hc2sgPSBCTlgyX0NQX0NQVV9FVkVOVF9NQVNLOworCWNwdV9yZWcucGMgPSBCTlgyX0NQX0NQVV9QUk9HUkFNX0NPVU5URVI7CisJY3B1X3JlZy5pbnN0ID0gQk5YMl9DUF9DUFVfSU5TVFJVQ1RJT047CisJY3B1X3JlZy5icCA9IEJOWDJfQ1BfQ1BVX0hXX0JSRUFLUE9JTlQ7CisJY3B1X3JlZy5zcGFkX2Jhc2UgPSBCTlgyX0NQX1NDUkFUQ0g7CisJY3B1X3JlZy5taXBzX3ZpZXdfYmFzZSA9IDB4ODAwMDAwMDsKIAotCWZ3LmRhdGFfYWRkciA9IGJueDJfQ09NX2IwNkZ3RGF0YUFkZHI7Ci0JZncuZGF0YV9sZW4gPSBibngyX0NPTV9iMDZGd0RhdGFMZW47Ci0JZncuZGF0YV9pbmRleCA9IDA7Ci0JZncuZGF0YSA9IGJueDJfQ09NX2IwNkZ3RGF0YTsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKKwkJZncgPSAmYm54Ml9jcF9md18wOTsKIAotCWZ3LnNic3NfYWRkciA9IGJueDJfQ09NX2IwNkZ3U2Jzc0FkZHI7Ci0JZncuc2Jzc19sZW4gPSBibngyX0NPTV9iMDZGd1Nic3NMZW47Ci0JZncuc2Jzc19pbmRleCA9IDA7Ci0JZncuc2JzcyA9IGJueDJfQ09NX2IwNkZ3U2JzczsKLQotCWZ3LmJzc19hZGRyID0gYm54Ml9DT01fYjA2RndCc3NBZGRyOwotCWZ3LmJzc19sZW4gPSBibngyX0NPTV9iMDZGd0Jzc0xlbjsKLQlmdy5ic3NfaW5kZXggPSAwOwotCWZ3LmJzcyA9IGJueDJfQ09NX2IwNkZ3QnNzOwotCi0JZncucm9kYXRhX2FkZHIgPSBibngyX0NPTV9iMDZGd1JvZGF0YUFkZHI7Ci0JZncucm9kYXRhX2xlbiA9IGJueDJfQ09NX2IwNkZ3Um9kYXRhTGVuOwotCWZ3LnJvZGF0YV9pbmRleCA9IDA7Ci0JZncucm9kYXRhID0gYm54Ml9DT01fYjA2RndSb2RhdGE7Ci0KLQlsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsICZmdyk7Ci0KKwkJbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCBmdyk7CisJCWlmIChyYykKKwkJCWdvdG8gaW5pdF9jcHVfZXJyOworCX0KIGluaXRfY3B1X2VycjoKIAlibngyX2d1bnppcF9lbmQoYnApOwogCXJldHVybiByYzsKQEAgLTMyODgsMzEgKzMyODUsNDQgQEAKIAkgKiBiZWZvcmUgd2UgaXNzdWUgYSByZXNldC4gKi8KIAl2YWwgPSBSRUdfUkQoYnAsIEJOWDJfTUlTQ19JRCk7CiAKLQl2YWwgPSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9SRVEgfAotCSAgICAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1JFR19XSU5ET1dfRU5BIHwKLQkgICAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfTUJfV09SRF9TV0FQOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgeworCQlSRUdfV1IoYnAsIEJOWDJfTUlTQ19DT01NQU5ELCBCTlgyX01JU0NfQ09NTUFORF9TV19SRVNFVCk7CisJCVJFR19SRChicCwgQk5YMl9NSVNDX0NPTU1BTkQpOworCQl1ZGVsYXkoNSk7CiAKLQkvKiBDaGlwIHJlc2V0LiAqLwotCVJFR19XUihicCwgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcsIHZhbCk7CisJCXZhbCA9IEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1JFR19XSU5ET1dfRU5BIHwKKwkJICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfVEFSR0VUX01CX1dPUkRfU1dBUDsKIAotCWlmICgoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0EwKSB8fAotCSAgICAoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0ExKSkKLQkJbXNsZWVwKDE1KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGRldiwgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcsIHZhbCk7CiAKLQkvKiBSZXNldCB0YWtlcyBhcHByb3hpbWF0ZSAzMCB1c2VjICovCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJdmFsID0gUkVHX1JEKGJwLCBCTlgyX1BDSUNGR19NSVNDX0NPTkZJRyk7Ci0JCWlmICgodmFsICYgKEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX1JFUSB8Ci0JCQkgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfQlNZKSkgPT0gMCkgewotCQkJYnJlYWs7CisJfSBlbHNlIHsKKwkJdmFsID0gQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKKwkJICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfUkVHX1dJTkRPV19FTkEgfAorCQkgICAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfTUJfV09SRF9TV0FQOworCisJCS8qIENoaXAgcmVzZXQuICovCisJCVJFR19XUihicCwgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcsIHZhbCk7CisKKwkJaWYgKChDSElQX0lEKGJwKSA9PSBDSElQX0lEXzU3MDZfQTApIHx8CisJCSAgICAoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0ExKSkgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyA1MCk7CiAJCX0KLQkJdWRlbGF5KDEwKTsKLQl9CiAKLQlpZiAodmFsICYgKEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX1JFUSB8Ci0JCSAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX0JTWSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2hpcCByZXNldCBkaWQgbm90IGNvbXBsZXRlXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJLyogUmVzZXQgdGFrZXMgYXBwcm94aW1hdGUgMzAgdXNlYyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJdmFsID0gUkVHX1JEKGJwLCBCTlgyX1BDSUNGR19NSVNDX0NPTkZJRyk7CisJCQlpZiAoKHZhbCAmIChCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9SRVEgfAorCQkJCSAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9CU1kpKSA9PSAwKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCWlmICh2YWwgJiAoQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKKwkJCSAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX0JTWSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNoaXAgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CiAJfQogCiAJLyogTWFrZSBzdXJlIGJ5dGUgc3dhcHBpbmcgaXMgcHJvcGVybHkgY29uZmlndXJlZC4gKi8KQEAgLTMzOTAsNyArMzQwMCwxMCBAQAogCiAJLyogSW5pdGlhbGl6ZSBjb250ZXh0IG1hcHBpbmcgYW5kIHplcm8gb3V0IHRoZSBxdWljayBjb250ZXh0cy4gIFRoZQogCSAqIGNvbnRleHQgYmxvY2sgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBlbmFibGVkLiAqLwotCWJueDJfaW5pdF9jb250ZXh0KGJwKTsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpCisJCWJueDJfaW5pdF81NzA5X2NvbnRleHQoYnApOworCWVsc2UKKwkJYm54Ml9pbml0X2NvbnRleHQoYnApOwogCiAJaWYgKChyYyA9IGJueDJfaW5pdF9jcHVzKGJwKSkgIT0gMCkKIAkJcmV0dXJuIHJjOwpAQCAtMzUwMSwxMiArMzUxNCw0MCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQKK2JueDJfaW5pdF90eF9jb250ZXh0KHN0cnVjdCBibngyICpicCwgdTMyIGNpZCkKK3sKKwl1MzIgdmFsLCBvZmZzZXQwLCBvZmZzZXQxLCBvZmZzZXQyLCBvZmZzZXQzOworCisJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KSB7CisJCW9mZnNldDAgPSBCTlgyX0wyQ1RYX1RZUEVfWEk7CisJCW9mZnNldDEgPSBCTlgyX0wyQ1RYX0NNRF9UWVBFX1hJOworCQlvZmZzZXQyID0gQk5YMl9MMkNUWF9UQkRSX0JIQUREUl9ISV9YSTsKKwkJb2Zmc2V0MyA9IEJOWDJfTDJDVFhfVEJEUl9CSEFERFJfTE9fWEk7CisJfSBlbHNlIHsKKwkJb2Zmc2V0MCA9IEJOWDJfTDJDVFhfVFlQRTsKKwkJb2Zmc2V0MSA9IEJOWDJfTDJDVFhfQ01EX1RZUEU7CisJCW9mZnNldDIgPSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0hJOworCQlvZmZzZXQzID0gQk5YMl9MMkNUWF9UQkRSX0JIQUREUl9MTzsKKwl9CisJdmFsID0gQk5YMl9MMkNUWF9UWVBFX1RZUEVfTDIgfCBCTlgyX0wyQ1RYX1RZUEVfU0laRV9MMjsKKwlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihjaWQpLCBvZmZzZXQwLCB2YWwpOworCisJdmFsID0gQk5YMl9MMkNUWF9DTURfVFlQRV9UWVBFX0wyIHwgKDggPDwgMTYpOworCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKGNpZCksIG9mZnNldDEsIHZhbCk7CisKKwl2YWwgPSAodTY0KSBicC0+dHhfZGVzY19tYXBwaW5nID4+IDMyOworCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKGNpZCksIG9mZnNldDIsIHZhbCk7CisKKwl2YWwgPSAodTY0KSBicC0+dHhfZGVzY19tYXBwaW5nICYgMHhmZmZmZmZmZjsKKwlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihjaWQpLCBvZmZzZXQzLCB2YWwpOworfQogCiBzdGF0aWMgdm9pZAogYm54Ml9pbml0X3R4X3Jpbmcoc3RydWN0IGJueDIgKmJwKQogewogCXN0cnVjdCB0eF9iZCAqdHhiZDsKLQl1MzIgdmFsOworCXUzMiBjaWQ7CiAKIAlicC0+dHhfd2FrZV90aHJlc2ggPSBicC0+dHhfcmluZ19zaXplIC8gMjsKIApAQCAtMzUyMCwxOSArMzU2MSwxMSBAQAogCWJwLT5od190eF9jb25zID0gMDsKIAlicC0+dHhfcHJvZF9ic2VxID0gMDsKIAotCXZhbCA9IEJOWDJfTDJDVFhfVFlQRV9UWVBFX0wyOwotCXZhbCB8PSBCTlgyX0wyQ1RYX1RZUEVfU0laRV9MMjsKLQlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihUWF9DSUQpLCBCTlgyX0wyQ1RYX1RZUEUsIHZhbCk7CisJY2lkID0gVFhfQ0lEOworCWJwLT50eF9iaWR4X2FkZHIgPSBNQl9HRVRfQ0lEX0FERFIoY2lkKSArIEJOWDJfTDJDVFhfVFhfSE9TVF9CSURYOworCWJwLT50eF9ic2VxX2FkZHIgPSBNQl9HRVRfQ0lEX0FERFIoY2lkKSArIEJOWDJfTDJDVFhfVFhfSE9TVF9CU0VROwogCi0JdmFsID0gQk5YMl9MMkNUWF9DTURfVFlQRV9UWVBFX0wyOwotCXZhbCB8PSA4IDw8IDE2OwotCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKFRYX0NJRCksIEJOWDJfTDJDVFhfQ01EX1RZUEUsIHZhbCk7Ci0KLQl2YWwgPSAodTY0KSBicC0+dHhfZGVzY19tYXBwaW5nID4+IDMyOwotCUNUWF9XUihicCwgR0VUX0NJRF9BRERSKFRYX0NJRCksIEJOWDJfTDJDVFhfVEJEUl9CSEFERFJfSEksIHZhbCk7Ci0KLQl2YWwgPSAodTY0KSBicC0+dHhfZGVzY19tYXBwaW5nICYgMHhmZmZmZmZmZjsKLQlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihUWF9DSUQpLCBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0xPLCB2YWwpOworCWJueDJfaW5pdF90eF9jb250ZXh0KGJwLCBjaWQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzU0NSw4ICszNTc4LDggQEAKIAogCS8qIDggZm9yIENSQyBhbmQgVkxBTiAqLwogCWJwLT5yeF9idWZfdXNlX3NpemUgPSBicC0+ZGV2LT5tdHUgKyBFVEhfSExFTiArIGJwLT5yeF9vZmZzZXQgKyA4OwotCS8qIDggZm9yIGFsaWdubWVudCAqLwotCWJwLT5yeF9idWZfc2l6ZSA9IGJwLT5yeF9idWZfdXNlX3NpemUgKyA4OworCS8qIGh3IGFsaWdubWVudCAqLworCWJwLT5yeF9idWZfc2l6ZSA9IGJwLT5yeF9idWZfdXNlX3NpemUgKyBCTlgyX1JYX0FMSUdOOwogCiAJcmluZ19wcm9kID0gcHJvZCA9IGJwLT5yeF9wcm9kID0gMDsKIAlicC0+cnhfY29ucyA9IDA7CkBAIC0zNzEyLDcgKzM3NDUsOSBAQAogCWlmICgocmMgPSBibngyX3Jlc2V0X25pYyhicCwgQk5YMl9EUlZfTVNHX0NPREVfUkVTRVQpKSAhPSAwKQogCQlyZXR1cm4gcmM7CiAKKwlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7CiAJYm54Ml9pbml0X3BoeShicCk7CisJc3Bpbl91bmxvY2tfYmgoJmJwLT5waHlfbG9jayk7CiAJYm54Ml9zZXRfbGluayhicCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zOTUyLDcgKzM5ODcsNyBAQAogCQlibngyX3NldF9tYWNfbG9vcGJhY2soYnApOwogCX0KIAllbHNlIGlmIChsb29wYmFja19tb2RlID09IEJOWDJfUEhZX0xPT1BCQUNLKSB7Ci0JCWJwLT5sb29wYmFjayA9IDA7CisJCWJwLT5sb29wYmFjayA9IFBIWV9MT09QQkFDSzsKIAkJYm54Ml9zZXRfcGh5X2xvb3BiYWNrKGJwKTsKIAl9CiAJZWxzZQpAQCAtMzk5Miw4ICs0MDI3LDggQEAKIAlicC0+dHhfcHJvZCA9IE5FWFRfVFhfQkQoYnAtPnR4X3Byb2QpOwogCWJwLT50eF9wcm9kX2JzZXEgKz0gcGt0X3NpemU7CiAKLQlSRUdfV1IxNihicCwgTUJfVFhfQ0lEX0FERFIgKyBCTlgyX0wyQ1RYX1RYX0hPU1RfQklEWCwgYnAtPnR4X3Byb2QpOwotCVJFR19XUihicCwgTUJfVFhfQ0lEX0FERFIgKyBCTlgyX0wyQ1RYX1RYX0hPU1RfQlNFUSwgYnAtPnR4X3Byb2RfYnNlcSk7CisJUkVHX1dSMTYoYnAsIGJwLT50eF9iaWR4X2FkZHIsIGJwLT50eF9wcm9kKTsKKwlSRUdfV1IoYnAsIGJwLT50eF9ic2VxX2FkZHIsIGJwLT50eF9wcm9kX2JzZXEpOwogCiAJdWRlbGF5KDEwMCk7CiAKQEAgLTQxNjIsNiArNDE5Nyw5NiBAQAogfQogCiBzdGF0aWMgdm9pZAorYm54Ml81NzA2X3NlcmRlc190aW1lcihzdHJ1Y3QgYm54MiAqYnApCit7CisJc3Bpbl9sb2NrKCZicC0+cGh5X2xvY2spOworCWlmIChicC0+c2VyZGVzX2FuX3BlbmRpbmcpCisJCWJwLT5zZXJkZXNfYW5fcGVuZGluZy0tOworCWVsc2UgaWYgKChicC0+bGlua191cCA9PSAwKSAmJiAoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSkgeworCQl1MzIgYm1jcjsKKworCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IGJwLT50aW1lcl9pbnRlcnZhbDsKKworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOworCisJCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQkJdTMyIHBoeTEsIHBoeTI7CisKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCAweDFjLCAweDdjMDApOworCQkJYm54Ml9yZWFkX3BoeShicCwgMHgxYywgJnBoeTEpOworCisJCQlibngyX3dyaXRlX3BoeShicCwgMHgxNywgMHgwZjAxKTsKKwkJCWJueDJfcmVhZF9waHkoYnAsIDB4MTUsICZwaHkyKTsKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE3LCAweDBmMDEpOworCQkJYm54Ml9yZWFkX3BoeShicCwgMHgxNSwgJnBoeTIpOworCisJCQlpZiAoKHBoeTEgJiAweDEwKSAmJgkvKiBTSUdOQUwgREVURUNUICovCisJCQkJIShwaHkyICYgMHgyMCkpIHsJLyogbm8gQ09ORklHICovCisKKwkJCQlibWNyICY9IH5CTUNSX0FORU5BQkxFOworCQkJCWJtY3IgfD0gQk1DUl9TUEVFRDEwMDAgfCBCTUNSX0ZVTExEUExYOworCQkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jcik7CisJCQkJYnAtPnBoeV9mbGFncyB8PSBQSFlfUEFSQUxMRUxfREVURUNUX0ZMQUc7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoKGJwLT5saW5rX3VwKSAmJiAoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSAmJgorCQkgKGJwLT5waHlfZmxhZ3MgJiBQSFlfUEFSQUxMRUxfREVURUNUX0ZMQUcpKSB7CisJCXUzMiBwaHkyOworCisJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE3LCAweDBmMDEpOworCQlibngyX3JlYWRfcGh5KGJwLCAweDE1LCAmcGh5Mik7CisJCWlmIChwaHkyICYgMHgyMCkgeworCQkJdTMyIGJtY3I7CisKKwkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJCQlibWNyIHw9IEJNQ1JfQU5FTkFCTEU7CisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IpOworCisJCQlicC0+cGh5X2ZsYWdzICY9IH5QSFlfUEFSQUxMRUxfREVURUNUX0ZMQUc7CisJCX0KKwl9IGVsc2UKKwkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7CisKKwlzcGluX3VubG9jaygmYnAtPnBoeV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2JueDJfNTcwOF9zZXJkZXNfdGltZXIoc3RydWN0IGJueDIgKmJwKQoreworCWlmICgoYnAtPnBoeV9mbGFncyAmIFBIWV8yXzVHX0NBUEFCTEVfRkxBRykgPT0gMCkgeworCQlicC0+c2VyZGVzX2FuX3BlbmRpbmcgPSAwOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrKCZicC0+cGh5X2xvY2spOworCWlmIChicC0+c2VyZGVzX2FuX3BlbmRpbmcpCisJCWJwLT5zZXJkZXNfYW5fcGVuZGluZy0tOworCWVsc2UgaWYgKChicC0+bGlua191cCA9PSAwKSAmJiAoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSkgeworCQl1MzIgYm1jcjsKKworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOworCisJCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQkJYm1jciAmPSB+Qk1DUl9BTkVOQUJMRTsKKwkJCWJtY3IgfD0gQk1DUl9GVUxMRFBMWCB8IEJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMDsKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jcik7CisJCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IFNFUkRFU19GT1JDRURfVElNRU9VVDsKKwkJfSBlbHNlIHsKKwkJCWJtY3IgJj0gfihCTUNSX0ZVTExEUExYIHwgQkNNNTcwOFNfQk1DUl9GT1JDRV8yNTAwKTsKKwkJCWJtY3IgfD0gQk1DUl9BTkVOQUJMRTsKKwkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgYm1jcik7CisJCQlicC0+c2VyZGVzX2FuX3BlbmRpbmcgPSAyOworCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7CisJCX0KKworCX0gZWxzZQorCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IGJwLT50aW1lcl9pbnRlcnZhbDsKKworCXNwaW5fdW5sb2NrKCZicC0+cGh5X2xvY2spOworfQorCitzdGF0aWMgdm9pZAogYm54Ml90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGJueDIgKmJwID0gKHN0cnVjdCBibngyICopIGRhdGE7CkBAIC00MTc4LDY0ICs0MzAzLDExIEBACiAKIAlicC0+c3RhdHNfYmxrLT5zdGF0X0Z3UnhEcm9wID0gUkVHX1JEX0lORChicCwgQk5YMl9GV19SWF9EUk9QX0NPVU5UKTsKIAotCWlmICgoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgJiYKLQkgICAgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA2KSkgewotCi0JCXNwaW5fbG9jaygmYnAtPnBoeV9sb2NrKTsKLQkJaWYgKGJwLT5zZXJkZXNfYW5fcGVuZGluZykgewotCQkJYnAtPnNlcmRlc19hbl9wZW5kaW5nLS07Ci0JCX0KLQkJZWxzZSBpZiAoKGJwLT5saW5rX3VwID09IDApICYmIChicC0+YXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpKSB7Ci0JCQl1MzIgYm1jcjsKLQotCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7Ci0KLQkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7Ci0KLQkJCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgewotCQkJCXUzMiBwaHkxLCBwaHkyOwotCi0JCQkJYm54Ml93cml0ZV9waHkoYnAsIDB4MWMsIDB4N2MwMCk7Ci0JCQkJYm54Ml9yZWFkX3BoeShicCwgMHgxYywgJnBoeTEpOwotCi0JCQkJYm54Ml93cml0ZV9waHkoYnAsIDB4MTcsIDB4MGYwMSk7Ci0JCQkJYm54Ml9yZWFkX3BoeShicCwgMHgxNSwgJnBoeTIpOwotCQkJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE3LCAweDBmMDEpOwotCQkJCWJueDJfcmVhZF9waHkoYnAsIDB4MTUsICZwaHkyKTsKLQotCQkJCWlmICgocGh5MSAmIDB4MTApICYmCS8qIFNJR05BTCBERVRFQ1QgKi8KLQkJCQkJIShwaHkyICYgMHgyMCkpIHsJLyogbm8gQ09ORklHICovCi0KLQkJCQkJYm1jciAmPSB+Qk1DUl9BTkVOQUJMRTsKLQkJCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwMCB8Ci0JCQkJCQlCTUNSX0ZVTExEUExYOwotCQkJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IpOwotCQkJCQlicC0+cGh5X2ZsYWdzIHw9Ci0JCQkJCQlQSFlfUEFSQUxMRUxfREVURUNUX0ZMQUc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChicC0+bGlua191cCkgJiYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkgJiYKLQkJCShicC0+cGh5X2ZsYWdzICYgUEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHKSkgewotCQkJdTMyIHBoeTI7Ci0KLQkJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE3LCAweDBmMDEpOwotCQkJYm54Ml9yZWFkX3BoeShicCwgMHgxNSwgJnBoeTIpOwotCQkJaWYgKHBoeTIgJiAweDIwKSB7Ci0JCQkJdTMyIGJtY3I7Ci0KLQkJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOwotCQkJCWJtY3IgfD0gQk1DUl9BTkVOQUJMRTsKLQkJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IpOwotCi0JCQkJYnAtPnBoeV9mbGFncyAmPSB+UEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHOwotCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7Ci0KLQkJc3Bpbl91bmxvY2soJmJwLT5waHlfbG9jayk7CisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfU0VSREVTX0ZMQUcpIHsKKwkJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA2KQorCQkJYm54Ml81NzA2X3NlcmRlc190aW1lcihicCk7CisJCWVsc2UgaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA4KQorCQkJYm54Ml81NzA4X3NlcmRlc190aW1lcihicCk7CiAJfQogCiBibngyX3Jlc3RhcnRfdGltZXI6CkBAIC00NTA4LDggKzQ1ODAsOCBAQAogCXByb2QgPSBORVhUX1RYX0JEKHByb2QpOwogCWJwLT50eF9wcm9kX2JzZXEgKz0gc2tiLT5sZW47CiAKLQlSRUdfV1IxNihicCwgTUJfVFhfQ0lEX0FERFIgKyBCTlgyX0wyQ1RYX1RYX0hPU1RfQklEWCwgcHJvZCk7Ci0JUkVHX1dSKGJwLCBNQl9UWF9DSURfQUREUiArIEJOWDJfTDJDVFhfVFhfSE9TVF9CU0VRLCBicC0+dHhfcHJvZF9ic2VxKTsKKwlSRUdfV1IxNihicCwgYnAtPnR4X2JpZHhfYWRkciwgcHJvZCk7CisJUkVHX1dSKGJwLCBicC0+dHhfYnNlcV9hZGRyLCBicC0+dHhfcHJvZF9ic2VxKTsKIAogCW1taW93YigpOwogCkBAIC00NzQzLDEwICs0ODE1LDE0IEBACiAJfQogCWVsc2UgewogCQlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgewotCQkJaWYgKChjbWQtPnNwZWVkICE9IFNQRUVEXzEwMDApIHx8Ci0JCQkJKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkgeworCQkJaWYgKChjbWQtPnNwZWVkICE9IFNQRUVEXzEwMDAgJiYKKwkJCSAgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8yNTAwKSB8fAorCQkJICAgIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisKKwkJCWlmIChjbWQtPnNwZWVkID09IFNQRUVEXzI1MDAgJiYKKwkJCSAgICAhKGJwLT5waHlfZmxhZ3MgJiBQSFlfMl81R19DQVBBQkxFX0ZMQUcpKQorCQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWVsc2UgaWYgKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCkgewogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC00OTAzLDExICs0OTc5LDEwIEBACiAJCW1zbGVlcCgyMCk7CiAKIAkJc3Bpbl9sb2NrX2JoKCZicC0+cGh5X2xvY2spOwotCQlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDYpIHsKLQkJCWJwLT5jdXJyZW50X2ludGVydmFsID0gU0VSREVTX0FOX1RJTUVPVVQ7Ci0JCQlicC0+c2VyZGVzX2FuX3BlbmRpbmcgPSAxOwotCQkJbW9kX3RpbWVyKCZicC0+dGltZXIsIGppZmZpZXMgKyBicC0+Y3VycmVudF9pbnRlcnZhbCk7Ci0JCX0KKworCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IFNFUkRFU19BTl9USU1FT1VUOworCQlicC0+c2VyZGVzX2FuX3BlbmRpbmcgPSAxOworCQltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKIAl9CiAKIAlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOwpAQCAtNTI4OCw2ICs1MzYzLDggQEAKIAogCW1lbXNldChidWYsIDAsIHNpemVvZih1NjQpICogQk5YMl9OVU1fVEVTVFMpOwogCWlmIChldGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CisJCWludCBpOworCiAJCWJueDJfbmV0aWZfc3RvcChicCk7CiAJCWJueDJfcmVzZXRfY2hpcChicCwgQk5YMl9EUlZfTVNHX0NPREVfRElBRyk7CiAJCWJueDJfZnJlZV9za2JzKGJwKTsKQEAgLTUzMTIsOSArNTM4OSwxMSBAQAogCQl9CiAKIAkJLyogd2FpdCBmb3IgbGluayB1cCAqLwotCQltc2xlZXBfaW50ZXJydXB0aWJsZSgzMDAwKTsKLQkJaWYgKCghYnAtPmxpbmtfdXApICYmICEoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykpCi0JCQltc2xlZXBfaW50ZXJydXB0aWJsZSg0MDAwKTsKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJaWYgKGJwLT5saW5rX3VwKQorCQkJCWJyZWFrOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CisJCX0KIAl9CiAKIAlpZiAoYm54Ml90ZXN0X252cmFtKGJwKSAhPSAwKSB7CkBAIC01NjA0LDEzICs1NjgzLDYgQEAKIAkJZ290byBlcnJfb3V0X3JlbGVhc2U7CiAJfQogCi0JYnAtPnBjaXhfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOwotCWlmIChicC0+cGNpeF9jYXAgPT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZmluZCBQQ0lYIGNhcGFiaWxpdHksIGFib3J0aW5nLlxuIik7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBlcnJfb3V0X3JlbGVhc2U7Ci0JfQotCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spID09IDApIHsKIAkJYnAtPmZsYWdzIHw9IFVTSU5HX0RBQ19GTEFHOwogCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSAhPSAwKSB7CkBAIC01NjMzLDcgKzU3MDUsNyBAQAogCUlOSVRfV09SSygmYnAtPnJlc2V0X3Rhc2ssIGJueDJfcmVzZXRfdGFzaywgYnApOwogCiAJZGV2LT5iYXNlX2FkZHIgPSBkZXYtPm1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKLQltZW1fbGVuID0gTUJfR0VUX0NJRF9BRERSKDE3KTsKKwltZW1fbGVuID0gTUJfR0VUX0NJRF9BRERSKFRYX1RTU19DSUQgKyAxKTsKIAlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIG1lbV9sZW47CiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAKQEAgLTU2NTcsNiArNTcyOSwxNiBAQAogCiAJYnAtPmNoaXBfaWQgPSBSRUdfUkQoYnAsIEJOWDJfTUlTQ19JRCk7CiAKKwlpZiAoQ0hJUF9OVU0oYnApICE9IENISVBfTlVNXzU3MDkpIHsKKwkJYnAtPnBjaXhfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOworCQlpZiAoYnAtPnBjaXhfY2FwID09IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2Fubm90IGZpbmQgUENJWCBjYXBhYmlsaXR5LCBhYm9ydGluZy5cbiIpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X3VubWFwOworCQl9CisJfQorCiAJLyogR2V0IGJ1cyBpbmZvcm1hdGlvbi4gKi8KIAlyZWcgPSBSRUdfUkQoYnAsIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTKTsKIAlpZiAocmVnICYgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfUENJWF9ERVQpIHsKQEAgLTU3NzYsMTAgKzU4NTgsMTUgQEAKIAlicC0+cGh5X2FkZHIgPSAxOwogCiAJLyogRGlzYWJsZSBXT0wgc3VwcG9ydCBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIFNFUkRFUyBjaGlwLiAqLwotCWlmIChDSElQX0JPTkRfSUQoYnApICYgQ0hJUF9CT05EX0lEX1NFUkRFU19CSVQpIHsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKKwkJaWYgKENISVBfQk9ORF9JRChicCkgIT0gQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9CT05EX0lEX0MpCisJCQlicC0+cGh5X2ZsYWdzIHw9IFBIWV9TRVJERVNfRkxBRzsKKwl9IGVsc2UgaWYgKENISVBfQk9ORF9JRChicCkgJiBDSElQX0JPTkRfSURfU0VSREVTX0JJVCkKIAkJYnAtPnBoeV9mbGFncyB8PSBQSFlfU0VSREVTX0ZMQUc7CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgewogCQlicC0+ZmxhZ3MgfD0gTk9fV09MX0ZMQUc7Ci0JCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkgeworCQlpZiAoQ0hJUF9OVU0oYnApICE9IENISVBfTlVNXzU3MDYpIHsKIAkJCWJwLT5waHlfYWRkciA9IDI7CiAJCQlyZWcgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArCiAJCQkJCSBCTlgyX1NIQVJFRF9IV19DRkdfQ09ORklHKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDIuaCBiL2RyaXZlcnMvbmV0L2JueDIuaAppbmRleCBjYTMxOTA0Li4xM2I2ZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyLmgKKysrIGIvZHJpdmVycy9uZXQvYm54Mi5oCkBAIC01Niw2ICs1Niw3IEBACiAKIH07CiAKKyNkZWZpbmUgQk5YMl9SWF9BTElHTgkJCTE2CiAKIC8qCiAgKiAgc3RhdHVzX2Jsb2NrIGRlZmluaXRpb24KQEAgLTkwLDYgKzkxLDcgQEAKIAkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX0RNQUVfQUJPUlQJCSgxTDw8MjUpCiAJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19GTFNIX0FCT1JUCQkoMUw8PDI2KQogCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfR1JDX0FCT1JUCQkoMUw8PDI3KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfRVBCX0VSUk9SCQkoMUw8PDMwKQogCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUEFSSVRZX0VSUk9SCQkoMUw8PDMxKQogCiAJdTMyIHN0YXR1c19hdHRuX2JpdHNfYWNrOwpAQCAtMTE3LDcgKzExOSw4IEBACiAJdTE2IHN0YXR1c19jb21wbGV0aW9uX3Byb2R1Y2VyX2luZGV4OwogCXUxNiBzdGF0dXNfY21kX2NvbnN1bWVyX2luZGV4OwogCXUxNiBzdGF0dXNfaWR4OwotCXUxNiBzdGF0dXNfdW51c2VkOworCXU4IHN0YXR1c191bnVzZWQ7CisJdTggc3RhdHVzX2Jsa19udW07CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTsKIAl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MDsKQEAgLTE0MSw3ICsxNDQsOCBAQAogCXUxNiBzdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgxNDsKIAl1MTYgc3RhdHVzX2NtZF9jb25zdW1lcl9pbmRleDsKIAl1MTYgc3RhdHVzX2NvbXBsZXRpb25fcHJvZHVjZXJfaW5kZXg7Ci0JdTE2IHN0YXR1c191bnVzZWQ7CisJdTggc3RhdHVzX2Jsa19udW07CisJdTggc3RhdHVzX3VudXNlZDsKIAl1MTYgc3RhdHVzX2lkeDsKICNlbmRpZgogfTsKQEAgLTMwMSw2ICszMDUsMTAgQEAKICNkZWZpbmUgQk5YMl9MMkNUWF9UWFBfQklEWAkJCQkweDAwMDAwMGE4CiAjZGVmaW5lIEJOWDJfTDJDVFhfVFhQX0JTRVEJCQkJMHgwMDAwMDBhYwogCisjZGVmaW5lIEJOWDJfTDJDVFhfVFlQRV9YSQkJCQkweDAwMDAwMDgwCisjZGVmaW5lIEJOWDJfTDJDVFhfQ01EX1RZUEVfWEkJCQkJMHgwMDAwMDI0MAorI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0hJX1hJCQkJMHgwMDAwMDI1OAorI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0xPX1hJCQkJMHgwMDAwMDI1YwogCiAvKgogICogIGwyX2JkX2NoYWluX2NvbnRleHQgZGVmaW5pdGlvbgpAQCAtMzI4LDExICszMzYsMTUgQEAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcJCQkJMHgwMDAwMDA2OAogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfQllURV9TV0FQCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1RBUkdFVF9NQl9XT1JEX1NXQVAJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfUkVTRVJWRUQxCQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DTE9DS19DVExfRU5BCQkgKDFMPDw1KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfR1JDX1dPUkRfU1dBUAkgKDFMPDw2KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19SRUdfV0lORE9XX0VOQQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRCQkgKDFMPDw4KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9CU1kJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0dSQ19XSU4xX1NXQVBfRU4JICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0dSQ19XSU4yX1NXQVBfRU4JICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0dSQ19XSU4zX1NXQVBfRU4JICgxTDw8MTIpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0FTSUNfTUVUQUxfUkVWCQkgKDB4ZmZMPDwxNikKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQVNJQ19CQVNFX1JFVgkJICgweGZMPDwyNCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQVNJQ19JRAkJCSAoMHhmTDw8MjgpCkBAIC0zNDcsNiArMzU5LDcgQEAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfUENJWF9TUEVFRF8xMDAJCSAoMUw8PDQpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX1BDSVhfU1BFRURfMTMzCQkgKDJMPDw0KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19QQ0lYX1NQRUVEX1BDSV9NT0RFCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX0JBRF9NRU1fV1JJVEVfQkUJICgxTDw8OCkKIAogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTCQkweDAwMDAwMDcwCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUENJX0NMS19TUERfREVUCSAoMHhmTDw8MCkKQEAgLTM2Niw3ICszNzksNyBAQAogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX0FMVF9TUkNfMTIJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYJICgyTDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYyCSAoNEw8PDgpCi0jZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUExBWV9ERUFECSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX01JTl9QT1dFUgkgKDFMPDwxMSkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRUQJICgweGZMPDwxMikKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfMTAwCSAoMEw8PDEyKQogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF84MAkgKDFMPDwxMikKQEAgLTM3NCwxOCArMzg3LDIxIEBACiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzQwCSAoNEw8PDEyKQogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF8yNQkgKDhMPDwxMikKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1RPUAkgKDFMPDwxNikKLSNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfUExMX1NUT1AJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTcJICgxTDw8MTcpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTgJICgxTDw8MTgpCi0jZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfVVNFX1NQRF9ERVQJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRUQJICgweGZmZkw8PDIwKQogCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1JFR19XSU5ET1dfQUREUkVTUwkJCTB4MDAwMDAwNzgKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUkVHX1dJTkRPV19BRERSRVNTX1ZBTAkJICgweGZmZmZmTDw8MikKKwogI2RlZmluZSBCTlgyX1BDSUNGR19SRUdfV0lORE9XCQkJCTB4MDAwMDAwODAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTUQJCQkJMHgwMDAwMDA4NAogI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9JTkRFWAkJCSAoMHhmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5ERVhfVkFMSUQJCSAoMUw8PDE2KQogI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9VU0VfSU5UX0hDX1BBUkFNCSAoMUw8PDE3KQogI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9NQVNLX0lOVAkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01EX0lOVEVSUlVQVF9OVU0JCSAoMHhmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfU1RBVFVTX0JJVF9TRVRfQ01ECQkJMHgwMDAwMDA4OAogI2RlZmluZSBCTlgyX1BDSUNGR19TVEFUVVNfQklUX0NMRUFSX0NNRAkJMHgwMDAwMDA4YwpAQCAtMzk4LDkgKzQxNCwxMSBAQAogICogIG9mZnNldDogMHg0MDAKICAqLwogI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XX0FERFIJCQkweDAwMDAwNDAwCi0jZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1dfQUREUl9QQ0lfR1JDX1dJTkRPV19BRERSX1ZBTFVFCSAoMHgzZmZmZkw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1dfQUREUl9WQUxVRQkJCSAoMHgxZmZMPDwxMykKKyNkZWZpbmUgQk5YMl9QQ0lfR1JDX1dJTkRPV19BRERSX1NFUF9XSU4JCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xCQkJCTB4MDAwMDA0MDQKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVTRVJWRUQwCQkJICgweGZmTDw8MCkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWQkJCSAoMHg3TDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV9PRkYJCSAoMEw8PDgpCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xX1JFQURfQk9VTkRBUllfMTYJCSAoMUw8PDgpCkBAIC00MTksNiArNDM3LDcgQEAKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMjU2CQkgKDVMPDwxMSkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfNTEyCQkgKDZMPDwxMSkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMTAyNAkJICg3TDw8MTEpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xX1JFU0VSVkVEMQkJCSAoMHgzZmZmZkw8PDE0KQogCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yCQkJCTB4MDAwMDA0MDgKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSMV9TSVpFCQkJICgweGZMPDwwKQpAQCAtNDY4LDkgKzQ4NywxMyBAQAogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9GT1JDRV8zMl9CSVRfTVNUUgkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0ZPUkNFXzMyX0JJVF9UR1QJCSAoMUw8PDI0KQogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9LRUVQX1JFUV9BU1NFUlQJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9SRVNFUlZFRDAJCQkgKDB4M2ZMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSX1BSRUZFVENIX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfUkVTRVJWRUQwX1hJCQkJICgweDdmZmZMPDwxNykKIAogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMwkJCQkweDAwMDAwNDBjCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18zX1NUSUNLWV9CWVRFCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzNfUkVHX1NUSUNLWV9CWVRFCQkgKDB4ZmZMPDw4KQogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19GT1JDRV9QTUUJCQkgKDFMPDwyNCkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzNfUE1FX1NUQVRVUwkJCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19QTUVfRU5BQkxFCQkJICgxTDw8MjYpCkBAIC01MDEsOCArNTI0LDEwIEBACiAjZGVmaW5lIEJOWDJfUENJX1ZQRF9JTlRGX0lOVEZfUkVRCQkJICgxTDw8MCkKIAogI2RlZmluZSBCTlgyX1BDSV9WUERfQUREUl9GTEFHCQkJCTB4MDAwMDA0MmMKLSNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBR19BRERSRVNTCQkJICgweDFmZmY8PDIpCi0jZGVmaW5lIEJOWDJfUENJX1ZQRF9BRERSX0ZMQUdfV1IJCQkgKDE8PDE1KQorI2RlZmluZSBCTlgyX1BDSV9WUERfQUREUl9GTEFHX01TSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBR19TTAkJCTBMCisjZGVmaW5lIEJOWDJfUENJX1ZQRF9BRERSX0ZMQUdfQUREUkVTUwkJCSAoMHgxZmZmTDw8MikKKyNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBR19XUgkJCSAoMUw8PDE1KQogCiAjZGVmaW5lIEJOWDJfUENJX1ZQRF9EQVRBCQkJCTB4MDAwMDA0MzAKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMMQkJCQkweDAwMDAwNDM0CkBAIC01MzUsMTkgKzU2MCwyNiBAQAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfMTMJCQkgKDEzTDw8MCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzE0CQkJICgxNEw8PDApCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV8xNQkJCSAoMTVMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X1JFU0VSVkVEMAkJCSAoMHgzTDw8NCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9QTV9TQ0FMRV9QUkcJCQkgKDB4M0w8PDYpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUE1fU0NBTEVfUFJHXzAJCQkgKDBMPDw2KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X1BNX1NDQUxFX1BSR18xCQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9QTV9TQ0FMRV9QUkdfMgkJCSAoMkw8PDYpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUE1fU0NBTEVfUFJHXzMJCQkgKDNMPDw2KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01TSV9QVl9NQVNLX0NBUAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NU0lfTElNSVQJCQkgKDB4N0w8PDkpCi0jZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTVNJX0FEVkVSVElaRQkJCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTVVMVElfTVNHX0NBUAkJCSAoMHg3TDw8MTIpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTVNJX0VOQUJMRQkJCSAoMUw8PDE1KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF82NF9BRFZFUlRJWkUJCSAoMUw8PDE2KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF8xMzNfQURWRVJUSVpFCQkgKDFMPDwxNykKLSNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfTUVNX1JFQURfU0laRQkJICgweDNMPDwyMSkKLSNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfU1BMSVRfU0laRQkJCSAoMHg3TDw8MjMpCi0jZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTUFYX0NVTVVMQVRJVkVfU0laRQkJICgweDdMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9SRVNFUlZFRDIJCQkgKDB4N0w8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9DVU1VTEFUSVZFX1NJWkVfQjIxCSAoMHgzTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTUFYX1NQTElUX1NJWkVfQjIxCQkgKDB4M0w8PDIzKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9DVU1VTEFUSVZFX1NJWkVfQjAJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9NRU1fUkVBRF9TSVpFX0IxMAkJICgweDNMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfU1BMSVRfU0laRV9CMAkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUkVTRVJWRUQzCQkJICgweDdMPDwyOSkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9SRVNFUlZFRDNfWEkJCQkgKDB4ZmZmZkw8PDE2KQogCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDUJCQkJMHgwMDAwMDQ0NAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X0QxX1NVUFBPUlQJCQkgKDFMPDwwKQpAQCAtNTU2LDYgKzU4OCwxMCBAQAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X1BNRV9JTl9EMQkJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDVfUE1FX0lOX0QyCQkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9QTUVfSU5fRDNfSE9UCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9SRVNFUlZFRDBfVEUJCQkgKDB4M2ZmZmZmZkw8PDYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDVfUE1fVkVSU0lPTl9YSQkJCSAoMHg3TDw8NikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9OT19TT0ZUX1JFU0VUX1hJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X1JFU0VSVkVEMF9YSQkJCSAoMHgzZmZmZmZMPDwxMCkKIAogI2RlZmluZSBCTlgyX1BDSV9QQ0lYX0VYVEVOREVEX1NUQVRVUwkJCTB4MDAwMDA0NDgKICNkZWZpbmUgQk5YMl9QQ0lfUENJWF9FWFRFTkRFRF9TVEFUVVNfTk9fU05PT1AJCSAoMUw8PDgpCkBAIC01NjcsMTIgKzYwMyw5MSBAQAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw2X01BWF9MQVQJCQkgKDB4ZmZMPDwwKQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw2X01JTl9HTlQJCQkgKDB4ZmZMPDw4KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw2X0JJU1QJCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDZfUkVTRVJWRUQwCQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9QQ0lfTVNJX0RBVEEJCQkJMHgwMDAwMDQ1MAotI2RlZmluZSBCTlgyX1BDSV9NU0lfREFUQV9QQ0lfTVNJX0RBVEEJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUENJX01TSV9EQVRBX01TSV9EQVRBCQkJICgweGZmZmZMPDwwKQogCiAjZGVmaW5lIEJOWDJfUENJX01TSV9BRERSX0gJCQkJMHgwMDAwMDQ1NAogI2RlZmluZSBCTlgyX1BDSV9NU0lfQUREUl9MCQkJCTB4MDAwMDA0NTgKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX0FERFJfTF9WQUwJCQkJICgweDNmZmZmZmZmTDw8MikKKworI2RlZmluZSBCTlgyX1BDSV9DRkdfQUNDRVNTX0NNRAkJCQkweDAwMDAwNDVjCisjZGVmaW5lIEJOWDJfUENJX0NGR19BQ0NFU1NfQ01EX0FEUgkJCSAoMHgzZkw8PDIpCisjZGVmaW5lIEJOWDJfUENJX0NGR19BQ0NFU1NfQ01EX1JEX1JFUQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1BDSV9DRkdfQUNDRVNTX0NNRF9XUl9SRVEJCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfUENJX0NGR19BQ0NFU1NfREFUQQkJCTB4MDAwMDA0NjAKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX01BU0sJCQkJMHgwMDAwMDQ2NAorI2RlZmluZSBCTlgyX1BDSV9NU0lfTUFTS19NU0lfTUFTSwkJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX1BFTkQJCQkJMHgwMDAwMDQ2OAorI2RlZmluZSBCTlgyX1BDSV9NU0lfUEVORF9NU0lfUEVORAkJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9DCQkJCTB4MDAwMDA0NmMKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9DX1BNX0RBVEFfOF9QUkcJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUENJX1BNX0RBVEFfQ19SRVNFUlZFRDAJCQkgKDB4ZmZmZmZmTDw8OCkKKworI2RlZmluZSBCTlgyX1BDSV9NU0lYX0NPTlRST0wJCQkJMHgwMDAwMDRjMAorI2RlZmluZSBCTlgyX1BDSV9NU0lYX0NPTlRST0xfTVNJWF9UQkxfU0laCQkgKDB4N2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJWF9DT05UUk9MX1JFU0VSVkVEMAkJCSAoMHgxZmZmZmZMPDwxMSkKKworI2RlZmluZSBCTlgyX1BDSV9NU0lYX1RCTF9PRkZfQklSCQkJMHgwMDAwMDRjNAorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1RCTF9PRkZfQklSX01TSVhfVEJMX0JJUgkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1RCTF9PRkZfQklSX01TSVhfVEJMX09GRgkJICgweDFmZmZmZmZmTDw8MykKKworI2RlZmluZSBCTlgyX1BDSV9NU0lYX1BCQV9PRkZfQklUCQkJMHgwMDAwMDRjOAorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1BCQV9PRkZfQklUX01TSVhfUEJBX0JJUgkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1BCQV9PRkZfQklUX01TSVhfUEJBX09GRgkJICgweDFmZmZmZmZmTDw8MykKKworI2RlZmluZSBCTlgyX1BDSV9QQ0lFX0NBUEFCSUxJVFkJCQkweDAwMDAwNGQwCisjZGVmaW5lIEJOWDJfUENJX1BDSUVfQ0FQQUJJTElUWV9JTlRFUlJVUFRfTVNHX05VTQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9QQ0lFX0NBUEFCSUxJVFlfQ09NUExZX1BDSUVfMV8xCSAoMUw8PDUpCisKKyNkZWZpbmUgQk5YMl9QQ0lfREVWSUNFX0NBUEFCSUxJVFkJCQkweDAwMDAwNGQ0CisjZGVmaW5lIEJOWDJfUENJX0RFVklDRV9DQVBBQklMSVRZX01BWF9QTF9TSVpfU1VQUE9SVEVECSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfREVWSUNFX0NBUEFCSUxJVFlfRVhURU5ERURfVEFHX1NVUFBPUlQJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9QQ0lfREVWSUNFX0NBUEFCSUxJVFlfTDBTX0FDQ0VQVEFCTEVfTEFURU5DWQkgKDB4N0w8PDYpCisjZGVmaW5lIEJOWDJfUENJX0RFVklDRV9DQVBBQklMSVRZX0wxX0FDQ0VQVEFCTEVfTEFURU5DWQkgKDB4N0w8PDkpCisjZGVmaW5lIEJOWDJfUENJX0RFVklDRV9DQVBBQklMSVRZX1JPTEVfQkFTRURfRVJSX1JQVAkgKDFMPDwxNSkKKworI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFkJCQkweDAwMDAwNGRjCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9NQVhfTElOS19TUEVFRAkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTUFYX0xJTktfU1BFRURfMDAwMQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTUFYX0xJTktfU1BFRURfMDAxMAkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTUFYX0xJTktfV0lEVEgJCSAoMHgxZkw8PDQpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9DTEtfUE9XRVJfTUdNVAkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX0FTUE1fU1VQUE9SVAkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX0wwU19FWElUX0xBVAkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX0wwU19FWElUX0xBVF8xMDEJICg1TDw8MTIpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMFNfRVhJVF9MQVRfMTEwCSAoNkw8PDEyKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDFfRVhJVF9MQVQJCSAoMHg3TDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMV9FWElUX0xBVF8wMDEJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMV9FWElUX0xBVF8wMTAJICgyTDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMFNfRVhJVF9DT01NX0xBVAkgKDB4N0w8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDBTX0VYSVRfQ09NTV9MQVRfMTAxCSAoNUw8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDBTX0VYSVRfQ09NTV9MQVRfMTEwCSAoNkw8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDFfRVhJVF9DT01NX0xBVAkgKDB4N0w8PDIxKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDFfRVhJVF9DT01NX0xBVF8wMDEJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMV9FWElUX0NPTU1fTEFUXzAxMAkgKDJMPDwyMSkKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX1BPUlRfTlVNCQkgKDB4ZmZMPDwyNCkKKworI2RlZmluZSBCTlgyX1BDSV9QQ0lFX0RFVklDRV9DQVBBQklMSVRZXzIJCTB4MDAwMDA0ZTQKKyNkZWZpbmUgQk5YMl9QQ0lfUENJRV9ERVZJQ0VfQ0FQQUJJTElUWV8yX0NNUExfVE9fUkFOR0VfU1VQUAkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUENJX1BDSUVfREVWSUNFX0NBUEFCSUxJVFlfMl9DTVBMX1RPX0RJU0FCTF9TVVBQCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUENJX1BDSUVfREVWSUNFX0NBUEFCSUxJVFlfMl9SRVNFUlZFRAkgKDB4N2ZmZmZmZkw8PDUpCisKKyNkZWZpbmUgQk5YMl9QQ0lfUENJRV9MSU5LX0NBUEFCSUxJVFlfMgkJCTB4MDAwMDA0ZTgKKyNkZWZpbmUgQk5YMl9QQ0lfUENJRV9MSU5LX0NBUEFCSUxJVFlfMl9SRVNFUlZFRAkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1cxX0FERFIJCQkweDAwMDAwNjEwCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1cxX0FERFJfVkFMVUUJCQkgKDB4MWZmTDw8MTMpCisKKyNkZWZpbmUgQk5YMl9QQ0lfR1JDX1dJTkRPVzJfQUREUgkJCTB4MDAwMDA2MTQKKyNkZWZpbmUgQk5YMl9QQ0lfR1JDX1dJTkRPVzJfQUREUl9WQUxVRQkJCSAoMHgxZmZMPDwxMykKKworI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XM19BRERSCQkJMHgwMDAwMDYxOAorI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XM19BRERSX1ZBTFVFCQkJICgweDFmZkw8PDEzKQogCiAKIC8qCkBAIC01ODIsMTMgKzY5NywyMyBAQAogI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORAkJCQkweDAwMDAwODAwCiAjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0VOQUJMRV9BTEwJCQkgKDFMPDwwKQogI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9ESVNBQkxFX0FMTAkJCSAoMUw8PDEpCi0jZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0NPUkVfUkVTRVQJCQkgKDFMPDw0KQotI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9IQVJEX1JFU0VUCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfU1dfUkVTRVQJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9QT1JfUkVTRVQJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9IRF9SRVNFVAkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0NNTl9TV19SRVNFVAkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX1BBUl9FUlJPUgkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0NTMTZfRVJSCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfQ1MxNl9FUlJfTE9DCQkJICgweGZMPDwxMikKICNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfUEFSX0VSUl9SQU0JCQkgKDB4N2ZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfUE9XRVJET1dOX0VWRU5UCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfU1dfU0hVVERPV04JCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfU0hVVERPV05fRU4JCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfRElOVEVHX0FUVE5fRU4JCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9QQ0lFX0xJTktfSU5fTDIzCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfUENJRV9ESVMJCQkgKDFMPDwyOCkKIAogI2RlZmluZSBCTlgyX01JU0NfQ0ZHCQkJCQkweDAwMDAwODA0Ci0jZGVmaW5lIEJOWDJfTUlTQ19DRkdfUENJX0dSQ19UTU9VVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfR1JDX1RNT1VUCQkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTlZNX1dSX0VOCQkJCSAoMHgzTDw8MSkKICNkZWZpbmUgQk5YMl9NSVNDX0NGR19OVk1fV1JfRU5fUFJPVEVDVAkJCSAoMEw8PDEpCiAjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTlZNX1dSX0VOX1BDSQkJCSAoMUw8PDEpCkBAIC01OTYsMTYgKzcyMSw0NSBAQAogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX05WTV9XUl9FTl9BTExPVzIJCQkgKDNMPDwxKQogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0JJU1RfRU4JCQkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9NSVNDX0NGR19DSzI1X09VVF9BTFRfU1JDCQkJICgxTDw8NCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NGR19CWVBBU1NfQlNDQU4JCQkgKDFMPDw1KQotI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0JZUEFTU19FSlRBRwkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfUkVTRVJWRUQ1X1RFCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19SRVNFUlZFRDZfVEUJCQkgKDFMPDw2KQogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0NMS19DVExfT1ZFUlJJREUJCQkgKDFMPDw3KQotI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREUJCQkJICgweDNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREUJCQkJICgweDdMPDw4KQogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfTUFDCQkJICgwTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX0dQSFkxCQkJICgxTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX0dQSFkyCQkJICgyTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTFfVEUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZMl9URQkJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFkzX1RFCQkJICgzTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTRfVEUJCQkgKDRMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZNV9URQkJCSAoNUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk2X1RFCQkJICg2TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTdfVEUJCQkgKDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX01DUF9HUkNfVE1PVVRfVEUJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19EQlVfR1JDX1RNT1VUX1RFCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9YSQkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX01BQ19YSQkJCSAoMEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFkxX1hJCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTJfWEkJCQkgKDJMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZM19YSQkJCSAoM0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9NQUMyX1hJCQkJICg0TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTRfWEkJCQkgKDVMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZNV9YSQkJCSAoNkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk2X1hJCQkJICg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX01BQzNfWEkJCQkgKDhMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZN19YSQkJCSAoOUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk4X1hJCQkJICgxMEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk5X1hJCQkJICgxMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9NQUM0X1hJCQkJICgxMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFkxMF9YSQkJCSAoMTNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZMTFfWEkJCQkgKDE0TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1VOVVNFRF9YSQkJCSAoMTVMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX1BPUlRfU0VMRUNUX1hJCQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfUEFSSVRZX01PREVfWEkJCQkgKDFMPDwxNCkKIAogI2RlZmluZSBCTlgyX01JU0NfSUQJCQkJCTB4MDAwMDA4MDgKICNkZWZpbmUgQk5YMl9NSVNDX0lEX0JPTkRfSUQJCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfSURfQk9ORF9JRF9YCQkJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19JRF9CT05EX0lEX0MJCQkJICgzTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0lEX0JPTkRfSURfUwkJCQkgKDEyTDw8MCkKICNkZWZpbmUgQk5YMl9NSVNDX0lEX0NISVBfTUVUQUwJCQkJICgweGZmTDw8NCkKICNkZWZpbmUgQk5YMl9NSVNDX0lEX0NISVBfUkVWCQkJCSAoMHhmTDw8MTIpCiAjZGVmaW5lIEJOWDJfTUlTQ19JRF9DSElQX05VTQkJCQkgKDB4ZmZmZkw8PDE2KQpAQCAtNjM5LDYgKzc5Myw4IEBACiAjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfVElNRVJfRU5BQkxFCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1JWMlBfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUUwkJCTB4MDAwMDA4MTAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDApCkBAIC02NjksNiArODI1LDggQEAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19USU1FUl9FTkFCTEUJCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1JWMlBfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUUwkJCTB4MDAwMDA4MTQKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDApCkBAIC02OTksNiArODU3LDggQEAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19USU1FUl9FTkFCTEUJCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1JWMlBfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUUwkJCTB4MDAwMDA4MTgKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVQJICgweGZMPDwwKQpAQCAtNzE4LDMwICs4NzgsNDEgQEAKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzEyCSAoMUw8PDgpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQ182CSAoMkw8PDgpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQ182MgkgKDRMPDw4KQotI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BMQVlfREVBRAkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRUQwX1hJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19NSU5fUE9XRVIJCSAoMUw8PDExKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRAkgKDB4Zkw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF8xMDAJICgwTDw8MTIpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzgwCSAoMUw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF81MAkgKDJMPDwxMikKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfNDAJICg0TDw8MTIpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzI1CSAoOEw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEMV9YSQkgKDB4Zkw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TVE9QCSAoMUw8PDE2KQotI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9QTExfU1RPUAkgKDFMPDwxNykKLSNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRF8xOAkgKDFMPDwxOCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19VU0VfU1BEX0RFVAkgKDFMPDwxOSkKLSNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRAkJICgweGZmZkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEXzE3X1RFCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEXzE4X1RFCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEXzE5X1RFCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEX1RFCSAoMHhmZmZMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfTUdNVF9YSQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRDJfWEkJICgweDNmTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1ZDT19YSQkgKDB4N0w8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEM19YSQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfWEkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX01JU0NfR1BJTwkJCQkJMHgwMDAwMDgxYwotI2RlZmluZSBCTlgyX01JU0NfR1BJT19WQUxVRQkJCQkgKDB4ZmZMPDwwKQotI2RlZmluZSBCTlgyX01JU0NfR1BJT19TRVQJCQkJICgweGZmTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fQ0xSCQkJCSAoMHhmZkw8PDE2KQotI2RlZmluZSBCTlgyX01JU0NfR1BJT19GTE9BVAkJCQkgKDB4ZmZMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU8JCQkJCTB4MDAwMDA4MWMKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fVkFMVUUJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fU0VUCQkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0NMUgkJCQkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fRkxPQVQJCQkJICgweGZmTDw8MjQpCiAKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UCQkJCTB4MDAwMDA4MjAKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UX0lOVF9TVEFURQkJCSAoMHhmTDw8MCkKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UX09MRF9WQUxVRQkJCSAoMHhmTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UX09MRF9TRVQJCQkgKDB4Zkw8PDE2KQotI2RlZmluZSBCTlgyX01JU0NfR1BJT19JTlRfT0xEX0NMUgkJCSAoMHhmTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVAkJCQkweDAwMDAwODIwCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9JTlRfU1RBVEVfVEUJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfVkFMVUVfVEUJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfU0VUX1RFCQkJICgweGZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fSU5UX09MRF9DTFJfVEUJCQkgKDB4Zkw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfU1BJT19JTlRfSU5UX1NUQVRFX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fSU5UX09MRF9WQUxVRV9YSQkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfU0VUX1hJCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfQ0xSX1hJCQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0NPTkZJR19MRlNSCQkJCTB4MDAwMDA4MjQKICNkZWZpbmUgQk5YMl9NSVNDX0NPTkZJR19MRlNSX0RJVgkJCSAoMHhmZmZmTDw8MCkKQEAgLTc3NSw2ICs5NDYsOCBAQAogI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfVElNRVJfRU5BQkxFCQkgKDFMPDwyNSkKICNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfVU1QX0VOQUJMRQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19SVjJQX0NNRF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVEwCQkJCTB4MDAwMDA4MmMKICNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVExCQkJCTB4MDAwMDA4MzAKQEAgLTgzMSwyMiArMTAwNCwxMiBAQAogI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMzAJCQkJICgweDdMPDwyNCkKICNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQzXzMxCQkJCSAoMHg3TDw8MjgpCiAKLSNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfQ09OVFJPTAkJCQkweDAwMDAwODc4Ci0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfRU4JCQkgKDFMPDwwKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX1JTVEIJCQkgKDFMPDwxKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX0lOVgkJCSAoMUw8PDIpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfRVJSX0NMUgkJCSAoMUw8PDMpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVIJCQkgKDB4M0w8PDQpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVJfN1RICQkgKDBMPDw0KQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX09SREVSXzE1VEgJCSAoMUw8PDQpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVJfMjNSRAkJICgyTDw8NCkKLSNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfQ09OVFJPTF9PUkRFUl8zMVNUCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVJWRUQxCQkJCTB4MDAwMDA4NzgKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VSVkVEMV9NSVNDX1JFU0VSVkVEMV9WQUxVRQkgKDB4M2ZMPDwwKQogCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX1NUQVRVUwkJCQkweDAwMDAwODdjCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX1NUQVRVU19MT0NLCQkJICgxTDw8MCkKLSNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfU1RBVFVTX1NUS1kJCQkgKDFMPDwxKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19TVEFUVVNfRVJST1JTCQkJICgweDNmZmZMPDwyKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19TVEFUVVNfU1RBVEUJCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVJWRUQyCQkJCTB4MDAwMDA4N2MKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VSVkVEMl9QQ0lFX0RJUwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19SRVNFUlZFRDJfTElOS19JTl9MMjMJCQkgKDFMPDwxKQogCiAjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTAkJCTB4MDAwMDA4ODAKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX0FTRl9SU1QJCSAoMUw8PDApCkBAIC04NTcsMTMgKzEwMjAsMTUgQEAKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1BMX1RPCQkJICgxTDw8NSkKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1JUX1RPCQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9FVkVOVAkJICgxTDw8NykKLSNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1JFUwkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NUUkVUQ0hfRU4JCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9TVFJFVENIX1BVTFNFCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfUkVTCQkJICgweDNMPDwxMCkKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9FTgkJCSAoMUw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfU01CX0JCX0VOCQkgKDFMPDwxMykKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9OT19BRERSX0ZJTFQJICgxTDw8MTQpCiAjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9TTUJfQVVUT1JFQUQJCSAoMUw8PDE1KQotI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfTklDX1NNQl9BRERSMQkJICgweDNmTDw8MTYpCi0jZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9OSUNfU01CX0FERFIyCQkgKDB4M2ZMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX05JQ19TTUJfQUREUjEJCSAoMHg3Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfTklDX1NNQl9BRERSMgkJICgweDdmTDw8MjMpCiAjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9FTl9OSUNfU01CX0FERFJfMAkgKDFMPDwzMCkKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9FQVJMWV9BVFROCQkgKDFMPDwzMSkKIApAQCAtODkxLDEzICsxMDU2LDEzIEBACiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTCQkgKDB4Zkw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19PSwkJICgwTDw8MjApCiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX0ZJUlNUX05BQ0sJICgxTDw8MjApCi0jZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX1NVQl9OQUNLCSAoOUw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19VRkxPVwkJICgyTDw8MjApCiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX1NUT1AJCSAoM0w8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19USU1FT1VUCSAoNEw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19GSVJTVF9MT1NUCSAoNUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19CQURBQ0sJCSAoNkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19TVUJfTkFDSwkgKDlMPDwyMCkKICNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9TVEFUVVNfU1VCX0xPU1QJICgweGRMPDwyMCkKLSNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9TVEFUVVNfQkFEQUNLCQkgKDB4Nkw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NMQVZFTU9ERQkJICgxTDw8MjQpCiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfREFUX0VOCQkgKDFMPDwyNSkKICNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9EQVRfSU4JCSAoMUw8PDI2KQpAQCAtOTU1LDYgKzExMjAsMzggQEAKICNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SREVfTUlTQ19SUEMJCSAoMUw8PDI5KQogI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JERV9NSVNDX1JQTQkJICgxTDw8MzApCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfUlYyUF9NSVNDX0NCMFJFR1MJCSAoMUw8PDMxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NPTV9ETUFFX1BFUlJfRU5fWEkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1BfRE1BRV9QRVJSX0VOX1hJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JQTV9BQ1BJQkVNRU1fUEVSUl9FTl9YSQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NUWF9VU0FHRV9DTlRfUEVSUl9FTl9YSQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NUWF9QR1RCTF9QRVJSX0VOX1hJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1RYX0NBQ0hFX1BFUlJfRU5fWEkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlSUk9SX1BFUlJfRU5fWEkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DT01fQ1RYQ19QRVJSX0VOX1hJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NPTV9TQ1BBRF9QRVJSX0VOX1hJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1BfQ1RYQ19QRVJSX0VOX1hJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NQX1NDUEFEX1BFUlJfRU5fWEkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JYUF9SQlVGQ19QRVJSX0VOX1hJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JYUF9DVFhDX1BFUlJfRU5fWEkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JYUF9TQ1BBRF9QRVJSX0VOX1hJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1RQQVRfU0NQQURfUEVSUl9FTl9YSQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9UWFBfQ1RYQ19QRVJSX0VOX1hJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9UWFBfU0NQQURfUEVSUl9FTl9YSQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DU19UTUVNX1BFUlJfRU5fWEkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX01RX0NUWF9QRVJSX0VOX1hJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SUE1fREZJRk9NRU1fUEVSUl9FTl9YSQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SUENfREZJRk9NRU1fUEVSUl9FTl9YSQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SQlVGX1BUUk1FTV9QRVJSX0VOX1hJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JCVUZfREFUQU1FTV9QRVJSX0VOX1hJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JWMlBfUDJJUkFNX1BFUlJfRU5fWEkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfUlYyUF9QMUlSQU1fUEVSUl9FTl9YSQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SVjJQX0NCMVJFR1NfUEVSUl9FTl9YSQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SVjJQX0NCMFJFR1NfUEVSUl9FTl9YSQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9UUEJVRl9QRVJSX0VOX1hJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9USEJVRl9QRVJSX0VOX1hJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9URE1BX1BFUlJfRU5fWEkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1RCRENfUEVSUl9FTl9YSQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfVFNDSF9MUl9QRVJSX0VOX1hJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExCQkJCTB4MDAwMDA4YTgKICNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SVjJQX01JU0NfQ0IxUkVHUwkJICgxTDw8MCkKQEAgLTk4OSw2ICsxMTg2LDM1IEBACiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQUV9NSVNDCQkJICgxTDw8MjkpCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQQ1FfTUlTQwkJCSAoMUw8PDMwKQogI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBRX01JU0MJCQkgKDFMPDwzMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SQkRDX1BFUlJfRU5fWEkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUkRNQV9ERklGT19QRVJSX0VOX1hJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfSENfU1RBVFNfUEVSUl9FTl9YSQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9IQ19NU0lYX1BFUlJfRU5fWEkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfSENfUFJPRFVDU1RCX1BFUlJfRU5fWEkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9IQ19DT05TVU1TVEJfUEVSUl9FTl9YSQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RQQVRRX1BFUlJfRU5fWEkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfTUNQUV9QRVJSX0VOX1hJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RETUFRX1BFUlJfRU5fWEkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFhQUV9QRVJSX0VOX1hJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DT01UUV9QRVJSX0VOX1hJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DT01RX1BFUlJfRU5fWEkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBRX1BFUlJfRU5fWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JYUFFfUEVSUl9FTl9YSQkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUFBRX1BFUlJfRU5fWEkJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JETUFRX1BFUlJfRU5fWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RBU1FfUEVSUl9FTl9YSQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVEJEUlFfUEVSUl9FTl9YSQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFNDSFFfUEVSUl9FTl9YSQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfQ09NWFFfUEVSUl9FTl9YSQkJICgxTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQQ1FfUEVSUl9FTl9YSQkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUFRRX1BFUlJfRU5fWEkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JWMlBNUV9QRVJSX0VOX1hJCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DUFFfUEVSUl9FTl9YSQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfQ1NRX1BFUlJfRU5fWEkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBfQ0lEX1BFUlJfRU5fWEkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JWMlBDU19UTUVNX1BFUlJfRU5fWEkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUENTUV9QRVJSX0VOX1hJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9NUV9JRFhfUEVSUl9FTl9YSQkJICgxTDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMgkJCQkweDAwMDAwOGFjCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfQ09NUV9NSVNDCQkJICgxTDw8MCkKQEAgLTEwMDAsMTkgKzEyMjYsNDk4IEBACiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVERNQVFfTUlTQwkJCSAoMUw8PDYpCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVFBBVFFfTUlTQwkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVEFTUV9NSVNDCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMl9UR1RfRklGT19QRVJSX0VOX1hJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1VNUF9UWF9QRVJSX0VOX1hJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1VNUF9SWF9QRVJSX0VOX1hJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX01DUF9ST01fUEVSUl9FTl9YSQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMl9NQ1BfU0NQQURfUEVSUl9FTl9YSQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX0hCX01FTV9QRVJSX0VOX1hJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1BDSUVfUkVQTEFZX1BFUlJfRU5fWEkJICgxTDw8NikKIAogI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTAkJCTB4MDAwMDA4YjAKICNkZWZpbmUgQk5YMl9NSVNDX0RFQlVHX1ZFQ1RPUl9TRUxfMAkJCSAoMHhmZmZMPDwwKQogI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTF8xCQkJICgweGZmZkw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTF8xX1hJCQkJICgweGZmZkw8PDE1KQogCiAjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0wJCQkJMHgwMDAwMDhiNAogI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMgkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9YSQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMxNF9YSQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMxMl9YSQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMxMF9YSQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVM4X1hJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fUExVUzZfWEkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9QTFVTNF9YSQkgKDVMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMyX1hJCSAoNkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fTk9NX1hJCQkgKDdMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTMl9YSQkgKDhMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTNF9YSQkgKDlMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTNl9YSQkgKDEwTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9NSU5VUzhfWEkJICgxMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fTUlOVVMxMF9YSQkgKDEyTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9NSU5VUzEyX1hJCSAoMTNMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTMTRfWEkJICgxNEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fTUlOVVMxNl9YSQkgKDE1TDw8MCkKICNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzUJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X1BMVVMxNAkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfUExVUzEyCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9QTFVTMTAJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X1BMVVM4CQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9QTFVTNgkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfUExVUzQJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X1BMVVMyCQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9OT00JCQkgKDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9NSU5VUzIJCSAoOEw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X01JTlVTNAkJICg5TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVM2CQkgKDEwTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVM4CQkgKDExTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVMxMAkJICgxMkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X01JTlVTMTIJCSAoMTNMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9NSU5VUzE0CQkgKDE0TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVMxNgkJICgxNUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVQJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzE0CQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX1BMVVMxMgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUdNVF9QTFVTMTAJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzgJCSAoM0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzYJCSAoNEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzQJCSAoNUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzIJCSAoNkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfTk9NCQkgKDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMgkJICg4TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUdNVF9NSU5VUzQJCSAoOUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfTUlOVVM2CQkgKDEwTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUdNVF9NSU5VUzgJCSAoMTFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTAJCSAoMTJMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTIJCSAoMTNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTQJCSAoMTRMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTYJCSAoMTVMPDw4KQogCiAjZGVmaW5lIEJOWDJfTUlTQ19GSU5BTF9DTEtfQ1RMX1ZBTAkJCTB4MDAwMDA4YjgKICNkZWZpbmUgQk5YMl9NSVNDX0ZJTkFMX0NMS19DVExfVkFMX01JU0NfRklOQUxfQ0xLX0NUTF9WQUwJICgweDNmZmZmZmZMPDw2KQogCi0jZGVmaW5lIEJOWDJfTUlTQ19VTlVTRUQwCQkJCTB4MDAwMDA4YmMKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDAJCQkJMHgwMDAwMDhiYworI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9UWF9EUklWRQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX1JNSUlfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX1JNSUlfQ1JTRFZfU0VMCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9SVk1JSV9NT0RFCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfRkxBU0hfU0FNUF9TQ0xLX05FR0VER0VfVEUJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfSElEREVOX1JFVklTSU9OX0lEX1RFCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX0hDX0NOVExfVE1PVVRfQ1RSX1JTVF9URQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9SRVNFUlZFRDFfWEkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfRU5BX0NPUkVfUlNUX09OX01BSU5fUFdSX0dPSU5HX0FXQVkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfRU5BX1NFTF9WQVVYX0JfSU5fTDJfVEUJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfR1JDX0JOS19GUkVFX0ZJWF9URQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9MRURfQUNUX1NFTF9URQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX1JFU0VSVkVEMl9YSQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9VUDFfREVGMAkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9GSUJFUl9NT0RFX0RJU19ERUYJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9GT1JDRTI1MDBfREVGCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfQVVUT0RFVEVDVF9ESVNfREVGCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfUEFSQUxMRUxfREVURUNUX0RFRgkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9EQUkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfREFJXzNNQQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfREFJXzJQNU1BCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9EQUlfMlAwTUEJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0RBSV8xUDVNQQkJICg1TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfREFJXzFQME1BCQkgKDdMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9EQUlfUFdSRE4JCSAoMTVMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QUkUyRElTCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QUkUxRElTCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9DVEFUCQkgKDB4M0w8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0NUQVRfTTZQCQkgKDBMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9DVEFUX00wUAkJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfQ1RBVF9QMFAJCSAoMkw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0NUQVRfUDZQCQkgKDNMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QVEFUCQkgKDB4M0w8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1BUQVRfTTZQCQkgKDBMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QVEFUX00wUAkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfUFRBVF9QMFAJCSAoMkw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1BUQVRfUDZQCQkgKDNMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESgkJICgweDNMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl8yNDBVQQkgKDBMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl8xNjBVQQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl80MDBVQQkgKDJMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl8zMjBVQQkgKDNMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQ0JVRl9BREoJCSAoMHgzTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfSUNCVUZfQURKXzI0MFVBCSAoMEw8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0lDQlVGX0FESl8xNjBVQQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQ0JVRl9BREpfNDAwVUEJICgyTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfSUNCVUZfQURKXzMyMFVBCSAoM0w8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1hUQUxfQURKCQkgKDB4M0w8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1hUQUxfQURKXzFQNTcJICgwTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfWFRBTF9BREpfMVA0NQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9YVEFMX0FESl8xUDYyCSAoMkw8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1hUQUxfQURKXzFQNjYJICgzTDw8MzApCisKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDEJCQkJMHgwMDAwMDhjMAorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMV8xX0FUVE5fQlROX1BSU05UX1RFCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwxXzFfQVRUTl9JTkRfUFJTTlRfVEUJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDFfMV9QV1JfSU5EX1BSU05UX1RFCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMV8wX1BDSUVfTE9PUEJBQ0tfVEUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwxX1JFU0VSVkVEX1NPRlRfWEkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDFfUkVTRVJWRURfSEFSRF9YSQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfTkVXX0hXX0NUTAkJCQkweDAwMDAwOGM0CisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfSFdfQ1RMX01BSU5fUE9SX0JZUEFTUwkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX05FV19IV19DVExfUklOR09TQ19FTkFCTEUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfSFdfQ1RMX1JJTkdPU0NfU0VMMAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX05FV19IV19DVExfUklOR09TQ19TRUwxCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTkVXX0hXX0NUTF9SRVNFUlZFRF9TSEFSRUQJCSAoMHhmZmZMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfTkVXX0hXX0NUTF9SRVNFUlZFRF9TUExJVAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfTkVXX0NPUkVfQ1RMCQkJCTB4MDAwMDA4YzgKKyNkZWZpbmUgQk5YMl9NSVNDX05FV19DT1JFX0NUTF9MSU5LX0hPTERPRkZfU1VDQ0VTUwkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfTkVXX0NPUkVfQ1RMX0xJTktfSE9MRE9GRl9SRVEJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfQ09SRV9DVExfUkVTRVJWRURfQ01OCQkgKDB4M2ZmZkw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfQ09SRV9DVExfUkVTRVJWRURfVEMJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0VDT19IV19DVEwJCQkJMHgwMDAwMDhjYworI2RlZmluZSBCTlgyX01JU0NfRUNPX0hXX0NUTF9MQVJHRV9HUkNfVE1PVVRfRU4JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19FQ09fSFdfQ1RMX1JFU0VSVkVEX1NPRlQJCSAoMHg3ZmZmTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VDT19IV19DVExfUkVTRVJWRURfSEFSRAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfRUNPX0NPUkVfQ1RMCQkJCTB4MDAwMDA4ZDAKKyNkZWZpbmUgQk5YMl9NSVNDX0VDT19DT1JFX0NUTF9SRVNFUlZFRF9TT0ZUCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19FQ09fQ09SRV9DVExfUkVTRVJWRURfSEFSRAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfUFBJTwkJCQkJMHgwMDAwMDhkNAorI2RlZmluZSBCTlgyX01JU0NfUFBJT19WQUxVRQkJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX1NFVAkJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0NMUgkJCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfUFBJT19GTE9BVAkJCQkgKDB4Zkw8PDI0KQorCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVAkJCQkweDAwMDAwOGQ4CisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVF9JTlRfU1RBVEUJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVF9PTERfVkFMVUUJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVF9PTERfU0VUCQkJICgweGZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BQSU9fSU5UX09MRF9DTFIJCQkgKDB4Zkw8PDI0KQorCisjZGVmaW5lIEJOWDJfTUlTQ19SRVNFVF9OVU1TCQkJCTB4MDAwMDA4ZGMKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VUX05VTVNfTlVNX0hBUkRfUkVTRVRTCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19SRVNFVF9OVU1TX05VTV9QQ0lFX1JFU0VUUwkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVRfTlVNU19OVU1fUEVSU1RCX1JFU0VUUwkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVRfTlVNU19OVU1fQ01OX1JFU0VUUwkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VUX05VTVNfTlVNX1BPUlRfUkVTRVRTCQkgKDB4N0w8PDE2KQorCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUgkJCQkweDAwMDAwOGUwCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9FTkFfUENJCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9SRE1BCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9URE1BCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9FTUFDCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9DVFgJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfRU5BX1RCRFIJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfRU5BX1JCREMJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfRU5BX0NPTQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9FTkFfQ1AJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX1BDSQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX1JETUEJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX1NUQV9URE1BCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9TVEFfRU1BQwkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX0NUWAkJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX1RCRFIJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX1NUQV9SQkRDCQkJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9TVEFfQ09NCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9TVEFfQ1AJCQkgKDFMPDwyNCkKKworI2RlZmluZSBCTlgyX01JU0NfU1BJT19FVkVOVAkJCQkweDAwMDAwOGU0CisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0VWRU5UX0VOQUJMRQkJCSAoMHhmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NSVNDX1BQSU9fRVZFTlQJCQkJMHgwMDAwMDhlOAorI2RlZmluZSBCTlgyX01JU0NfUFBJT19FVkVOVF9FTkFCTEUJCQkgKDB4Zkw8PDApCisKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTAkJCTB4MDAwMDA4ZWMKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9CT05EX0lECQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX0JPTkRfSURfWAkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9CT05EX0lEX0MJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfQk9ORF9JRF9TCQkgKDEyTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QSFlfQ1RSTF9TVFJBUAkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUE9SVF9TV0FQX1BJTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfU0VSREVTMV9TSUdERVQJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfU0VSREVTMF9TSUdERVQJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUEhZMV9TSUdERVQJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWTBfU0lHREVUCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9MQ1BMTF9SU1QJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1NFUkRFUzFfUlNUCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9TRVJERVMwX1JTVAkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUEhZMV9SU1QJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWTBfUlNUCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QSFlfQ1RSTAkJICgweDdMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QT1JUX1NXQVAJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1NUUkFQX09WRVJSSURFCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWV9TRVJERVNfSUREUQkgKDB4Zkw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWV9TRVJERVNfSUREUV9TRVIxX0lERFEJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUEhZX1NFUkRFU19JRERRX1NFUjBfSUREUQkgKDJMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QSFlfU0VSREVTX0lERFFfUEhZMV9JRERRCSAoNEw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWV9TRVJERVNfSUREUV9QSFkwX0lERFEJICg4TDw8MjYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxCQkJCTB4MDAwMDA4ZjAKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfRk1PREVfSURMRQkJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9GTU9ERV9XUklURQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9GTU9ERV9JTklUCQkJICgyTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFX1NFVAkJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9GTU9ERV9SU1QJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfRk1PREVfVkVSSUZZCQkJICg1TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFX1JFU0VSVkVEMAkJICg2TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFX1JFU0VSVkVEMQkJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX1VTRVBJTlMJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfUFJPR1NFTAkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9QUk9HU1RBUlQJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX1BDT1VOVAkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9QQllQCQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfVlNFTAkJCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfVE0JCQkJICgweDdMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX1NBREJZUAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfREVCVUcJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDIJCQkJMHgwMDAwMDhmNAorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfT1RQX1JPTV9BRERSCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMl9ET1NFTAkJCSAoMHg3Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfRE9TRUxfMAkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfRE9TRUxfMQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfRE9TRUxfMTI3CQkJICgxMjdMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfT1RQX1NUQVRVUwkJCQkweDAwMDAwOGY4CisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU1RBVFVTX0RBVEEJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NUQVRVU19WQUxJRAkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU1RBVFVTX0JVU1kJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NUQVRVU19CVVNZU00JCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TVEFUVVNfRE9ORQkJCSAoMUw8PDExKQorCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQxX0NNRAkJCTB4MDAwMDA4ZmMKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX1JFU0VUX01PREVfTgkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX1NISUZUX0RPTkUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQxX0NNRF9TSElGVF9TVEFSVAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX0xPQURfREFUQQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX1NISUZUX1NFTEVDVAkJICgweDFmTDw8OCkKKworI2RlZmluZSBCTlgyX01JU0NfT1RQX1NISUZUMV9EQVRBCQkJMHgwMDAwMDkwMAorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NISUZUMl9DTUQJCQkweDAwMDAwOTA0CisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9SRVNFVF9NT0RFX04JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9TSElGVF9ET05FCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NISUZUMl9DTURfU0hJRlRfU1RBUlQJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9MT0FEX0RBVEEJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9TSElGVF9TRUxFQ1QJCSAoMHgxZkw8PDgpCisKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDJfREFUQQkJCTB4MDAwMDA5MDgKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwCQkJCTB4MDAwMDA5MGMKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwX01CSVNUX0VOCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwX0JJU1RfU0VUVVAJCQkgKDB4M0w8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMF9NQklTVF9BU1lOQ19SRVNFVAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwX01CSVNUX0RPTkUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzBfTUJJU1RfR08JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzBfQklTVF9PVkVSUklERQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfTUVNU1RBVFVTMAkJCTB4MDAwMDA5MTAKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxCQkJCTB4MDAwMDA5MTQKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxX01CSVNUX0VOCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxX0JJU1RfU0VUVVAJCQkgKDB4M0w8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMV9NQklTVF9BU1lOQ19SRVNFVAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxX01CSVNUX0RPTkUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzFfTUJJU1RfR08JCQkgKDFMPDw5KQorCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX01FTVNUQVRVUzEJCQkweDAwMDAwOTE4CisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMgkJCQkweDAwMDAwOTFjCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMl9NQklTVF9FTgkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMl9CSVNUX1NFVFVQCQkJICgweDNMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzJfTUJJU1RfQVNZTkNfUkVTRVQJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMl9NQklTVF9ET05FCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MyX01CSVNUX0dPCQkJICgxTDw8OSkKKworI2RlZmluZSBCTlgyX01JU0NfQklTVF9NRU1TVEFUVVMyCQkJMHgwMDAwMDkyMAorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzMJCQkJMHgwMDAwMDkyNAorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzNfTUJJU1RfRU4JCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzNfQklTVF9TRVRVUAkJCSAoMHgzTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MzX01CSVNUX0FTWU5DX1JFU0VUCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzNfTUJJU1RfRE9ORQkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTM19NQklTVF9HTwkJCSAoMUw8PDkpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfTUVNU1RBVFVTMwkJCTB4MDAwMDA5MjgKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0CQkJCTB4MDAwMDA5MmMKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0X01CSVNUX0VOCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0X0JJU1RfU0VUVVAJCQkgKDB4M0w8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNF9NQklTVF9BU1lOQ19SRVNFVAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0X01CSVNUX0RPTkUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzRfTUJJU1RfR08JCQkgKDFMPDw5KQorCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX01FTVNUQVRVUzQJCQkweDAwMDAwOTMwCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNQkJCQkweDAwMDAwOTM0CisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNV9NQklTVF9FTgkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNV9CSVNUX1NFVFVQCQkJICgweDNMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzVfTUJJU1RfQVNZTkNfUkVTRVQJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNV9NQklTVF9ET05FCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M1X01CSVNUX0dPCQkJICgxTDw8OSkKKworI2RlZmluZSBCTlgyX01JU0NfQklTVF9NRU1TVEFUVVM1CQkJMHgwMDAwMDkzOAorI2RlZmluZSBCTlgyX01JU0NfTUVNX1RNMAkJCQkweDAwMDAwOTNjCisjZGVmaW5lIEJOWDJfTUlTQ19NRU1fVE0wX1BDSUVfUkVQTEFZX1RNCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19NRU1fVE0wX01DUF9TQ1BBRAkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX01FTV9UTTBfVU1QX1RNCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19NRU1fVE0wX0hCX01FTV9UTQkJCSAoMHhmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkwJCQkJMHgwMDAwMDk0MAorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9QSF9ERVRfRElTCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfRlJFUV9ERVRfRElTCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9MQ1BYCQkJICgweDNmTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfUlgJCQkJICgweDNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9WQ19FTgkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9WQ09fTUcJCQkgKDB4M0w8PDExKQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9LVkNPX1hGCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfS1ZDT19YUwkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1REX0VOCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1REX1NFTAkJCSAoMHg3TDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1RBX0VOCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1RBX1NFTAkJCSAoMHgzTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX0FUVEVOX0ZSRUYJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfRElHSVRBTF9SU1QJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9BTkFMT0dfUlNUCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX0xPQ0sJCQkgKDFMPDwyOSkKKworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwCQkJCTB4MDAwMDA5NDQKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DT01fRE1BRV9QRVJSCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX0NQX0RNQUVfUEVSUgkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SUE1fQUNQSUJFTUVNX1BFUlIJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfVVNBR0VfQ05UX1BFUlIJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfUEdUQkxfUEVSUgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfQ0FDSEVfUEVSUgkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfTUlSUk9SX1BFUlIJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfQ09NX0NUWENfUEVSUgkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DT01fU0NQQURfUEVSUgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DUF9DVFhDX1BFUlIJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfQ1BfU0NQQURfUEVSUgkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfUlhQX1JCVUZDX1BFUlIJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1JYUF9DVFhDX1BFUlIJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1JYUF9TQ1BBRF9QRVJSCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9UUEFUX1NDUEFEX1BFUlIJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1RYUF9DVFhDX1BFUlIJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1RYUF9TQ1BBRF9QRVJSCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DU19UTUVNX1BFUlIJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX01RX0NUWF9QRVJSCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SUE1fREZJRk9NRU1fUEVSUgkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SUENfREZJRk9NRU1fUEVSUgkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SQlVGX1BUUk1FTV9QRVJSCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SQlVGX0RBVEFNRU1fUEVSUgkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX1AySVJBTV9QRVJSCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX1AxSVJBTV9QRVJSCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX0NCMVJFR1NfUEVSUgkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX0NCMFJFR1NfUEVSUgkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9UUEJVRl9QRVJSCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9USEJVRl9QRVJSCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9URE1BX1BFUlIJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1RCRENfUEVSUgkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfVFNDSF9MUl9QRVJSCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxCQkJCTB4MDAwMDA5NDgKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SQkRDX1BFUlIJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfUkRNQV9ERklGT19QRVJSCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX0hDX1NUQVRTX1BFUlIJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfSENfTVNJWF9QRVJSCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX0hDX1BST0RVQ1NUQl9QRVJSCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfSENfQ09OU1VNU1RCX1BFUlIJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9UUEFUUV9QRVJSCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX01DUFFfUEVSUgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9URE1BUV9QRVJSCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1RYUFFfUEVSUgkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfQ09NVFFfUEVSUgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfQ09NUV9QRVJSCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9STFVQUV9QRVJSCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SWFBRX1BFUlIJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBQUV9QRVJSCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SRE1BUV9QRVJSCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9UQVNRX1BFUlIJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1RCRFJRX1BFUlIJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1RTQ0hRX1BFUlIJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX0NPTVhRX1BFUlIJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JYUENRX1BFUlIJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBUUV9QRVJSCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SVjJQTVFfUEVSUgkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfQ1BRX1BFUlIJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9DU1FfUEVSUgkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JMVVBfQ0lEX1BFUlIJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBDU19UTUVNX1BFUlIJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBDU1FfUEVSUgkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfTVFfSURYX1BFUlIJCSAoMUw8PDI5KQorCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzIJCQkJMHgwMDAwMDk0YworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX1RHVF9GSUZPX1BFUlIJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzJfVU1QX1RYX1BFUlIJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzJfVU1QX1JYX1BFUlIJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzJfTUNQX1JPTV9QRVJSCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX01DUF9TQ1BBRF9QRVJSCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX0hCX01FTV9QRVJSCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX1BDSUVfUkVQTEFZX1BFUlIJCSAoMUw8PDYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwCQkJCTB4MDAwMDA5NTAKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX09BQwkJCSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX09BQ19ORUdUV0VOVFkJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9PQUNfWkVSTwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9PQUNfVFdFTlRZCQkgKDNMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfT0FDX0ZPUlRZCQkJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX0lDUF9DVFJMCQkJICgweDdMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfMzYwCQkgKDBMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfNDgwCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfNjAwCQkgKDNMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfNzIwCQkgKDdMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfQklBU19DVFJMCQkJICgweDNMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMX09CU0VSVkUJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1ZUSF9DVFJMCQkJICgweDNMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1ZUSF9DVFJMXzAJCSAoMEw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfVlRIX0NUUkxfMQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9WVEhfQ1RSTF8yCQkgKDJMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTFNFUVNUQVJUCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1JFU0VSVkVECQkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9DQVBSRVRSWV9FTgkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9GUkVRTU9OSVRPUl9FTgkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9GUkVRREVUUkVTVEFSVF9FTgkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9GUkVRREVUUkVUUllfRU4JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMRk9SQ0VGRE9ORV9FTgkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9QTExGT1JDRUZET05FCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTEZPUkNFRlBBU1MJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMRk9SQ0VDQVBET05FX0VOCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMRk9SQ0VDQVBET05FCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTEZPUkNFQ0FQUEFTU19FTgkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTEZPUkNFQ0FQUEFTUwkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9DQVBSRVNUQVJUCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX0NBUFNFTEVDVE1fRU4JCSAoMUw8PDI3KQorCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMQkJCQkweDAwMDAwOTU0CisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMV9DQVBTRUxFQ1RNCQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDFfQ0FQRk9SQ0VTTE9XRE9XTl9FTgkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDFfQ0FQRk9SQ0VTTE9XRE9XTgkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwxX1NMT1dETl9YT1IJCSAoMUw8PDcpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX1NUQVRVUwkJCQkweDAwMDAwOTU4CisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfRlJFUURPTkVfU00JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfRlJFUVBBU1NfU00JCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfUExMU0VRRE9ORQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX1NUQVRVU19QTExTRVFQQVNTCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX1BMTFNUQVRFCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX0NBUFNUQVRFCQkJICgweDdMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX0NBUFNFTEVDVAkJICgweDFmTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfU0xPV0ROX0lORElDQVRPUgkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfU0xPV0ROX0lORElDQVRPUl8wCSAoMEw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX1NMT1dETl9JTkRJQ0FUT1JfMQkgKDFMPDwxNSkKKworI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTAkJCQkweDAwMDAwOTVjCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0ZSRVFfTU9OCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9GUkVRX01PTl9PRkYJCSAoMEw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0ZSRVFfTU9OX09OCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9YVEFMX0FESkNNCQkgKDB4M0w8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX1hUQUxfQURKQ01fMAkJICgwTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfWFRBTF9BREpDTV8xCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9YVEFMX0FESkNNXzIJCSAoMkw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX1hUQUxfQURKQ01fMwkJICgzTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUNCVUZfQURKCQkgKDB4M0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0lDQlVGX0FESl8wCQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9JQ0JVRl9BREpfMQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUNCVUZfQURKXzIJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0lDQlVGX0FESl8zCQkgKDNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9JQU1QX0FESgkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUFNUF9BREpfMAkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0lBTVBfQURKXzEJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9JQU1QX0FESl8yCQkgKDJMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUFNUF9BREpfMwkJICgzTDw8MTApCiAKIAogLyoKQEAgLTEwMzEsMTEgKzE3MzYsMzUgQEAKICNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9XUkRJCQkJCSAoMUw8PDE3KQogI2RlZmluZSBCTlgyX05WTV9DT01NQU5EX0VXU1IJCQkJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfTlZNX0NPTU1BTkRfV1JTUgkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9SRF9JRAkJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9SRF9TVEFUVVMJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9NT0RFXzI1NgkJCSAoMUw8PDIyKQogCiAjZGVmaW5lIEJOWDJfTlZNX1NUQVRVUwkJCQkJMHgwMDAwNjQwNAogI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfUElfRlNNX1NUQVRFCQkJICgweGZMPDwwKQogI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfRUVfRlNNX1NUQVRFCQkJICgweGZMPDw0KQogI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfRVFfRlNNX1NUQVRFCQkJICgweGZMPDw4KQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9YSQkJICgweDFmTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0lETEVfWEkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NNRDBfWEkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NNRDFfWEkJICgyTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NNRF9GSU5JU0gwX1hJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9DTURfRklOSVNIMV9YSQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfQUREUjBfWEkJICg1TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1dSSVRFX0RBVEEwX1hJCSAoNkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9XUklURV9EQVRBMV9YSQkgKDdMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfV1JJVEVfREFUQTJfWEkJICg4TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1JFQURfREFUQTBfWEkJICg5TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1JFQURfREFUQTFfWEkJICgxMEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9SRUFEX0RBVEEyX1hJCSAoMTFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfUkVBRF9TVEFUVVNfUkRJRDBfWEkJICgxMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9SRUFEX1NUQVRVU19SRElEMV9YSQkgKDEzTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1JFQURfU1RBVFVTX1JESUQyX1hJCSAoMTRMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfUkVBRF9TVEFUVVNfUkRJRDNfWEkJICgxNUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9SRUFEX1NUQVRVU19SRElENF9YSQkgKDE2TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NIRUNLX0JVU1kwX1hJCSAoMTdMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfU1RfV1JFTl9YSQkgKDE4TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1dBSVRfWEkJICgxOUw8PDApCiAKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEUJCQkJCTB4MDAwMDY0MDgKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFCQkJICgweGZmZmZmZmZmTDw8MCkKQEAgLTEwNDYsNiArMTc3NSwxMCBAQAogI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfQ1NfQgkJICg4TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX1NPCQkgKDE2TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX1NJCQkgKDMyTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX1NJX1hJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfU09fWEkJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFX05WTV9XUklURV9WQUxVRV9DU19CX1hJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfU0NMS19YSQkJICg4TDw8MCkKIAogI2RlZmluZSBCTlgyX05WTV9BRERSCQkJCQkweDAwMDA2NDBjCiAjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUUJCQkgKDB4ZmZmZmZmTDw8MCkKQEAgLTEwNTYsNiArMTc4OSwxMCBAQAogI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX0NTX0IJCSAoOEw8PDApCiAjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfU08JCQkgKDE2TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fQUREUl9OVk1fQUREUl9WQUxVRV9TSQkJCSAoMzJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX1NJX1hJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX1NPX1hJCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX0NTX0JfWEkJCSAoNEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfU0NMS19YSQkJICg4TDw8MCkKIAogI2RlZmluZSBCTlgyX05WTV9SRUFECQkJCQkweDAwMDA2NDEwCiAjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUUJCQkgKDB4ZmZmZmZmZmZMPDwwKQpAQCAtMTA2Niw2ICsxODAzLDEwIEBACiAjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfQ1NfQgkJICg4TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9TTwkJCSAoMTZMPDwwKQogI2RlZmluZSBCTlgyX05WTV9SRUFEX05WTV9SRUFEX1ZBTFVFX1NJCQkJICgzMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfU0lfWEkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfU09fWEkJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfQ1NfQl9YSQkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9TQ0xLX1hJCQkgKDhMPDwwKQogCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzEJCQkJCTB4MDAwMDY0MTQKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9GTEFTSF9NT0RFCQkJICgxTDw8MCkKQEAgLTEwNzcsMTQgKzE4MTgsMjEgQEAKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9TVEFUVVNfQklUX0JVRkZFUl9SRFkJCSAoN0w8PDQpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU1BJX0NMS19ESVYJCQkgKDB4Zkw8PDcpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU0VFX0NMS19ESVYJCQkgKDB4N2ZmTDw8MTEpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU1RSQVBfQ09OVFJPTF8wCQkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfUFJPVEVDVF9NT0RFCQkJICgxTDw8MjQpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRkxBU0hfU0laRQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX05WTV9DRkcxX0ZXX1VTVFJBUF8xCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRldfVVNUUkFQXzAJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9GV19VU1RSQVBfMgkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX05WTV9DRkcxX0ZXX1VTVFJBUF8zCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRldfRkxBU0hfVFlQRV9FTgkJCSAoMUw8PDMwKQogI2RlZmluZSBCTlgyX05WTV9DRkcxX0NPTVBBVF9CWVBBU1NTCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMgkJCQkJMHgwMDAwNjQxOAogI2RlZmluZSBCTlgyX05WTV9DRkcyX0VSQVNFX0NNRAkJCQkgKDB4ZmZMPDwwKQogI2RlZmluZSBCTlgyX05WTV9DRkcyX0RVTU1ZCQkJCSAoMHhmZkw8PDgpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzJfU1RBVFVTX0NNRAkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX05WTV9DRkcyX1JFQURfSUQJCQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMwkJCQkJMHgwMDAwNjQxYwogI2RlZmluZSBCTlgyX05WTV9DRkczX0JVRkZFUl9SRF9DTUQJCQkgKDB4ZmZMPDwwKQpAQCAtMTExOSw2ICsxODY3LDM1IEBACiAjZGVmaW5lIEJOWDJfTlZNX1dSSVRFMV9XUkRJX0NNRAkJCSAoMHhmZkw8PDgpCiAjZGVmaW5lIEJOWDJfTlZNX1dSSVRFMV9TUl9EQVRBCQkJCSAoMHhmZkw8PDE2KQogCisjZGVmaW5lIEJOWDJfTlZNX0NGRzQJCQkJCTB4MDAwMDY0MmMKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9GTEFTSF9TSVpFCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMU1CSVQJCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMk1CSVQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfNE1CSVQJCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfOE1CSVQJCQkgKDNMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMTZNQklUCQkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9GTEFTSF9TSVpFXzMyTUJJVAkJCSAoNUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfRkxBU0hfU0laRV82NE1CSVQJCQkgKDZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMTI4TUJJVAkJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9GTEFTSF9WRU5ET1IJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1ZFTkRPUl9TVAkJCSAoMEw8PDMpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfRkxBU0hfVkVORE9SX0FUTUVMCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X01PREVfMjU2X0VNUFRZX0JJVF9MT0MJCSAoMHgzTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9NT0RFXzI1Nl9FTVBUWV9CSVRfTE9DX0JJVDgJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9NT0RFXzI1Nl9FTVBUWV9CSVRfTE9DX0JJVDkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9NT0RFXzI1Nl9FTVBUWV9CSVRfTE9DX0JJVDEwCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfTU9ERV8yNTZfRU1QVFlfQklUX0xPQ19CSVQxMQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX05WTV9DRkc0X1NUQVRVU19CSVRfUE9MQVJJVFkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfUkVTRVJWRUQJCQkJICgweDFmZmZmZmZMPDw3KQorCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHCQkJCTB4MDAwMDY0MzAKKyNkZWZpbmUgQk5YMl9OVk1fUkVDT05GSUdfT1JJR19TVFJBUF9WQUxVRQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9SRUNPTkZJR19PUklHX1NUUkFQX1ZBTFVFX1NUCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX05WTV9SRUNPTkZJR19PUklHX1NUUkFQX1ZBTFVFX0FUTUVMCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHX1JFQ09ORklHX1NUUkFQX1ZBTFVFCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHX1JFU0VSVkVECQkJICgweDdmZmZmZkw8PDgpCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHX1JFQ09ORklHX0RPTkUJCQkgKDFMPDwzMSkKKwogCiAKIC8qCkBAIC0xMTQwLDYgKzE5MTcsOCBAQAogI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfQklHX1dSSVRFX1RSQU5TRkVSU19TVEFUCSAoMUw8PDIzKQogI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfQklHX1dSSVRFX0RFTEFZX1BDSV9DTEtTX1NUQVQJICgxTDw8MjQpCiAjZGVmaW5lIEJOWDJfRE1BX1NUQVRVU19CSUdfV1JJVEVfUkVUUllfQUZURVJfREFUQV9TVEFUCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfR0xPQkFMX0VSUl9YSQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1NUQVRVU19CTUVfWEkJCQkJICgxTDw8NCkKIAogI2RlZmluZSBCTlgyX0RNQV9DT05GSUcJCQkJCTB4MDAwMDBjMDgKICNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0RBVEFfQllURV9TV0FQCQkJICgxTDw8MCkKQEAgLTExNjEsODUgKzE5NDAsMzE1IEBACiAjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19CSUdfU0laRV8xMjgJCQkgKDB4Mkw8PDI0KQogI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQklHX1NJWkVfMjU2CQkJICgweDRMPDwyNCkKICNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0JJR19TSVpFXzUxMgkJCSAoMHg4TDw8MjQpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19EQVRfV0JTV0FQX01PREVfWEkJCSAoMHgzTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0NUTF9XQlNXQVBfTU9ERV9YSQkJICgweDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1BMX1hJCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9QTF8xMjhCX1hJCQkJICgwTDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUExfMjU2Ql9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1BMXzUxMkJfWEkJCQkgKDJMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9QTF9FTl9YSQkJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1JSU19YSQkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUlJTXzEyOEJfWEkJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9SUlNfMjU2Ql9YSQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1JSU181MTJCX1hJCQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUlJTXzEwMjRCX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9SUlNfMjA0OEJfWEkJCSAoNEw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1JSU180MDk2Ql9YSQkJICg1TDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUlJTX0VOX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19OT182NFNXQVBfRU5fWEkJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX0RNQV9CTEFDS09VVAkJCQkweDAwMDAwYzBjCiAjZGVmaW5lIEJOWDJfRE1BX0JMQUNLT1VUX1JEX1JFVFJZX0JMQUNLT1VUCQkgKDB4ZmZMPDwwKQogI2RlZmluZSBCTlgyX0RNQV9CTEFDS09VVF8yTkRfUkRfUkVUUllfQkxBQ0tPVVQJCSAoMHhmZkw8PDgpCiAjZGVmaW5lIEJOWDJfRE1BX0JMQUNLT1VUX1dSX1JFVFJZX0JMQUNLT1VUCQkgKDB4ZmZMPDwxNikKIAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUCQkJCTB4MDAwMDBjMzAKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfMAkJCSAoMHg3TDw8MCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzAJCQkgKDFMPDwzKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV8xCQkJICgweDdMPDw0KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfMQkJCSAoMUw8PDcpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzIJCQkgKDB4N0w8PDgpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl8yCQkJICgxTDw8MTEpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzMJCQkgKDB4N0w8PDEyKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfMwkJCSAoMUw8PDE1KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV80CQkJICgweDdMPDwxNikKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzQJCQkgKDFMPDwxOSkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfNQkJCSAoMHg3TDw8MjApCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl81CQkJICgxTDw8MjMpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzYJCQkgKDB4N0w8PDI0KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfNgkJCSAoMUw8PDI3KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV83CQkJICgweDdMPDwyOCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzcJCQkgKDFMPDwzMSkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wCQkJMHgwMDAwMGMxMAorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19OT19TTk9PUAkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19SRUxBWF9PUkRFUgkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19QUklPUklUWQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19UUkFGRklDX0NMQVNTCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1RCRENfUEFSQU1fRU4JICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfTk9fU05PT1AJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfUkVMQVhfT1JERVIJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfUFJJT1JJVFkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9SQkRDX1RSQUZGSUNfQ0xBU1MJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfUEFSQU1fRU4JICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9URE1BX05PX1NOT09QCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVERNQV9SRUxBWF9PUkRFUgkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1RETUFfUFJJT1JJVFkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9URE1BX1RSQUZGSUNfQ0xBU1MJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1RETUFfUEFSQU1fRU4JICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfTk9fU05PT1AJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfUkVMQVhfT1JERVIJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfUFJJT1JJVFkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfQ1RYX1BBUkFNX0VOCSAoMUw8PDMxKQogCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVQJCQkJMHgwMDAwMGMzNAotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV8wCQkJICgweDdMPDwwKQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfMAkJCSAoMUw8PDMpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzEJCQkgKDB4N0w8PDQpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl8xCQkJICgxTDw8NykKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfMgkJCSAoMHg3TDw8OCkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzIJCQkgKDFMPDwxMSkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfMwkJCSAoMHg3TDw8MTIpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl8zCQkJICgxTDw8MTUpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzQJCQkgKDB4N0w8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfNAkJCSAoMUw8PDE5KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV81CQkJICgweDdMPDwyMCkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzUJCQkgKDFMPDwyMykKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfNgkJCSAoMHg3TDw8MjQpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl82CQkJICgxTDw8MjcpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzcJCQkgKDB4N0w8PDI4KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfNwkJCSAoMUw8PDMxKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzEJCQkweDAwMDAwYzE0CisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DT01fTk9fU05PT1AJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18xX0NPTV9SRUxBWF9PUkRFUgkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzFfQ09NX1BSSU9SSVRZCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DT01fVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DT01fUEFSQU1fRU4JICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18xX0NQX05PX1NOT09QCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DUF9SRUxBWF9PUkRFUgkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzFfQ1BfUFJJT1JJVFkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DUF9UUkFGRklDX0NMQVNTCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DUF9QQVJBTV9FTgkgKDFMPDwxNSkKIAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UCQkJMHgwMDAwMGMzOAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzAJCQkgKDB4Zkw8PDApCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX0FTU0lHTk1FTlRfMQkJCSAoMHhmTDw8NCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF8yCQkJICgweGZMPDw4KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzMJCQkgKDB4Zkw8PDEyKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzQJCQkgKDB4Zkw8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzUJCQkgKDB4Zkw8PDIwKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzYJCQkgKDB4Zkw8PDI0KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzcJCQkgKDB4Zkw8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wCQkJMHgwMDAwMGMxOAorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX05PX1NOT09QCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfSENfUkVMQVhfT1JERVIJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9IQ19QUklPUklUWQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX0NTX1ZMRAkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX1RSQUZGSUNfQ0xBU1MJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX1BBUkFNX0VOCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfUkRNQV9OT19TTk9PUAkgKDFMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfUkVMQVhfT1JERVIJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9SRE1BX1BSSU9SSVRZCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfQ1NfVkxECSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfUEFSQU1fRU4JICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfQ1RYX05PX1NOT09QCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0NUWF9SRUxBWF9PUkRFUgkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9DVFhfUFJJT1JJVFkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfQ1RYX0NTX1ZMRAkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9DVFhfVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0NUWF9QQVJBTV9FTgkgKDFMPDwzMSkKIAotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UCQkJMHgwMDAwMGMzYwotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzAJCQkgKDB4Zkw8PDApCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX0FTU0lHTk1FTlRfMQkJCSAoMHhmTDw8NCkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fQVNTSUdOTUVOVF8yCQkJICgweGZMPDw4KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzMJCQkgKDB4Zkw8PDEyKQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzQJCQkgKDB4Zkw8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzUJCQkgKDB4Zkw8PDIwKQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzYJCQkgKDB4Zkw8PDI0KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzcJCQkgKDB4Zkw8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xCQkJMHgwMDAwMGMxYworI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9OT19TTk9PUAkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9SRUxBWF9PUkRFUgkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9QUklPUklUWQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9DU19WTEQJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMV9DT01fVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzFfQ09NX1BBUkFNX0VOCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzFfQ1BfTk9fU05PT1AJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMV9DUF9SRUxBWF9PUkRFUgkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NQX1BSSU9SSVRZCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NQX0NTX1ZMRAkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMV9DUF9UUkFGRklDX0NMQVNTCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzFfQ1BfUEFSQU1fRU4JICgxTDw8MTUpCiAKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMAkJCQkweDAwMDAwYzQwCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDBfUkNIQU5fU1RBX0hPU1RfQUREUl9MT1cJICgweGZmZmZmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUgkJCQkweDAwMDAwYzIwCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfTlVNX1JFQURTCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJJVEVSX1dSX0FSQl9NT0RFCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9XUl9BUkJfTU9ERV9TVFJJQ1QJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfV1JfQVJCX01PREVfUk5EX1JCTgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SRF9BUkJfTU9ERQkJCSAoMHgzTDw8NSkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SRF9BUkJfTU9ERV9TVFJJQ1QJCSAoMEw8PDUpCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfUkRfQVJCX01PREVfUk5EX1JCTgkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SRF9BUkJfTU9ERV9XR1RfUk5EX1JCTgkgKDJMPDw1KQorI2RlZmluZSBCTlgyX0RNQV9BUkJJVEVSX0FMVF9NT0RFX0VOCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SUl9NT0RFCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9USU1FUl9NT0RFCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfT1VTVERfUkVBRF9SRVEJCQkgKDB4Zkw8PDEyKQogCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDEJCQkJMHgwMDAwMGM0NAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAxX1JDSEFOX1NUQV9IT1NUX0FERFJfSElHSAkgKDB4ZmZmZmZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJfVElNRVJTCQkJCTB4MDAwMDBjMjQKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1RJTUVSU19SRF9EUlJfV0FJVF9USU1FCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJfVElNRVJTX1RNX01JTl9USU1FT1VUCQkgKDB4ZmZMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1RJTUVSU19UTV9NQVhfVElNRU9VVAkJICgweGZmZkw8PDIwKQogCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDIJCQkJMHgwMDAwMGM0OAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAyX0xFTkdUSAkJCSAoMHhmZmZmTDw8MCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMl9XT1JEX1NXQVAJCSAoMUw8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAyX0JZVEVfU1dBUAkJICgxTDw8MTcpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDJfUFJJT1JJVFlfTFZMCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9ETUFfREVCVUdfVkVDVF9QRUVLCQkJMHgwMDAwMGMyYworI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMV9WQUxVRQkJICgweDdmZkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX0RFQlVHX1ZFQ1RfUEVFS18xX1BFRUtfRU4JCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMV9TRUwJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJICgweDdmZkw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMl9QRUVLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9ETUFfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzEwCQkJCTB4MDAwMDBjNGMKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8xMQkJCQkweDAwMDAwYzUwCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMTIJCQkJMHgwMDAwMGM1NAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzIwCQkJCTB4MDAwMDBjNTgKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8yMQkJCQkweDAwMDAwYzVjCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDAJCQkJMHgwMDAwMGMzMAorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMQkJCQkweDAwMDAwYzM0CisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyCQkJCTB4MDAwMDBjMzgKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9WQUxJRAkJCSAoMUw8PDEwKQorCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDMJCQkJMHgwMDAwMGMzYworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNAkJCQkweDAwMDAwYzQwCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1CQkJCTB4MDAwMDBjNDQKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9WQUxJRAkJCSAoMUw8PDEwKQorCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDYJCQkJMHgwMDAwMGM0OAorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNwkJCQkweDAwMDAwYzRjCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4CQkJCTB4MDAwMDBjNTAKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9WQUxJRAkJCSAoMUw8PDEwKQorCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDkJCQkJMHgwMDAwMGM1NAorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMAkJCQkweDAwMDAwYzU4CisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExCQkJCTB4MDAwMDBjNWMKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9WQUxJRAkJCSAoMUw8PDEwKQorCiAjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMjIJCQkJMHgwMDAwMGM2MAogI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzMwCQkJCTB4MDAwMDBjNjQKICNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8zMQkJCQkweDAwMDAwYzY4CkBAIC0xMzM2LDYgKzIzNDUsMjUgQEAKICAqLwogI2RlZmluZSBCTlgyX0NUWF9DT01NQU5ECQkJCTB4MDAwMDEwMDAKICNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9ESVNBQkxFX1VTQUdFX0NOVAkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9ESVNBQkxFX1BMUlUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX0RJU0FCTEVfQ09NQklORV9SRUFECQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX0ZMVVNIX0FIRUFECQkJICgweDFmTDw8OCkKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9NRU1fSU5JVAkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRQkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfQ1RYX0NPTU1BTkRfUEFHRV9TSVpFXzI1NgkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV81MTIJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMUsJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMksJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfNEsJCQkgKDRMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfOEsJCQkgKDVMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMTZLCQkJICg2TDw8MTYpCisjZGVmaW5lIEJOWDJfQ1RYX0NPTU1BTkRfUEFHRV9TSVpFXzMySwkJCSAoN0w8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV82NEsJCQkgKDhMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMTI4SwkJCSAoOUw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV8yNTZLCQkJICgxMEw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV81MTJLCQkJICgxMUw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV8xTQkJCSAoMTJMPDwxNikKIAogI2RlZmluZSBCTlgyX0NUWF9TVEFUVVMJCQkJCTB4MDAwMDEwMDQKICNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0xPQ0tfV0FJVAkJCSAoMUw8PDApCkBAIC0xMzQzLDYgKzIzNzEsMTMgQEAKICNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX1dSSVRFX1NUQVQJCQkgKDFMPDwxNykKICNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0FDQ19TVEFMTF9TVEFUCQkJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19MT0NLX1NUQUxMX1NUQVQJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0VYVF9SRUFEX1NUQVQJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0VYVF9XUklURV9TVEFUCQkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19NSVNTX1NUQVQJCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0hJVF9TVEFUCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19ERUFEX0xPQ0sJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX1VTQUdFX0NOVF9FUlIJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0lOVkFMSURfUEFHRQkJCSAoMUw8PDI2KQogCiAjZGVmaW5lIEJOWDJfQ1RYX1ZJUlRfQUREUgkJCQkweDAwMDAxMDA4CiAjZGVmaW5lIEJOWDJfQ1RYX1ZJUlRfQUREUl9WSVJUX0FERFIJCQkgKDB4N2ZmZkw8PDYpCkBAIC0xMzU3LDEwICsyMzkyLDE1IEBACiAjZGVmaW5lIEJOWDJfQ1RYX0xPQ0sJCQkJCTB4MDAwMDEwMTgKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFCQkJCSAoMHg3TDw8MCkKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX0xPQ0tfVFlQRV9WT0lECQkgKDB4MEw8PDApCi0jZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRV9MT0NLX1RZUEVfQ09NUExFVEUJCSAoMHg3TDw8MCkKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX0xPQ0tfVFlQRV9QUk9UT0NPTAkJICgweDFMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfTE9DS19UWVBFX1RYCQkJICgweDJMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfTE9DS19UWVBFX1RJTUVSCQkgKDB4NEw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRV9MT0NLX1RZUEVfQ09NUExFVEUJCSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX1ZPSURfWEkJCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfUFJPVE9DT0xfWEkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfVFhfWEkJCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfVElNRVJfWEkJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfQ09NUExFVEVfWEkJCQkgKDdMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX0NJRF9WQUxVRQkJCQkgKDB4M2ZmZkw8PDcpCiAjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfR1JBTlRFRAkJCQkgKDFMPDwyNikKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19NT0RFCQkJCSAoMHg3TDw8MjcpCkBAIC0xMzcwLDIxICsyNDEwLDg5IEBACiAjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfU1RBVFVTCQkJCSAoMUw8PDMwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX1JFUQkJCQkgKDFMPDwzMSkKIAorI2RlZmluZSBCTlgyX0NUWF9DVFhfQ1RSTAkJCQkweDAwMDAxMDFjCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX0NUWF9BRERSCQkJICgweDdmZmZmTDw8MikKKyNkZWZpbmUgQk5YMl9DVFhfQ1RYX0NUUkxfTU9EX1VTQUdFX0NOVAkJCSAoMHgzTDw8MjEpCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX05PX1JBTV9BQ0MJCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9DVFhfQ1RYX0NUUkxfUFJFRkVUQ0hfU0laRQkJCSAoMHgzTDw8MjQpCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX0FUVFIJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX1dSSVRFX1JFUQkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NUWF9DVFhfQ1RSTF9SRUFEX1JFUQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9EQVRBCQkJCTB4MDAwMDEwMjAKICNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVUwkJCQkweDAwMDAxMDQwCiAjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVNfTUFTVEVSRU5DT0RFRAkJICgweGZMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX0FDQ0VTU01FTU9SWVNNCQkgKDB4M0w8PDEwKQogI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX1BBR0VUQUJMRUlOSVRTTQkJICgweDNMPDwxMikKICNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVU19BQ0NFU1NNRU1PUllJTklUU00JICgweDNMPDwxNCkKICNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVU19RVUFMSUZJRURfUkVRVUVTVAkgKDB4N2ZmTDw8MTcpCisjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVNfQ0FNTUFTVEVSRU5DT0RFRF9YSQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX0NBQ0hFTUFTVEVSRU5DT0RFRF9YSQkgKDB4MWZMPDw1KQorI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX1JFUVVFU1RfWEkJCSAoMHgzZmZmZmZMPDwxMCkKIAogI2RlZmluZSBCTlgyX0NUWF9EQkdfTE9DS19TVEFUVVMJCQkweDAwMDAxMDQ0CiAjZGVmaW5lIEJOWDJfQ1RYX0RCR19MT0NLX1NUQVRVU19TTQkJCSAoMHgzZmZMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9EQkdfTE9DS19TVEFUVVNfTUFUQ0gJCQkgKDB4M2ZmTDw8MjIpCiAKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVMJCQkweDAwMDAxMDQ4CisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JGSUZPX09WRVJGTE9XCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX0lOVkFMSURfUkVBRF9DT01QCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX0ZMVVNIX1NUQVJUCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19GUkVFX0VOVFJZX0NOVAkgKDB4M2ZMPDw3KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19DQUNIRV9FTlRSWV9ORUVERUQJICgweDNmTDw8MTMpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU4wX0FDVElWRQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjFfQUNUSVZFCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19SRF9DSEFOMl9BQ1RJVkUJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU4zX0FDVElWRQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjRfQUNUSVZFCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19SRF9DSEFONV9BQ1RJVkUJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU42X0FDVElWRQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjdfQUNUSVZFCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19SRF9DSEFOOF9BQ1RJVkUJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU45X0FDVElWRQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjEwX0FDVElWRQkgKDFMPDwyOSkKKworI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NNX1NUQVRVUwkJCTB4MDAwMDEwNGMKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TTV9TVEFUVVNfQ1NfRFdDCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU01fU1RBVFVTX0NTX1dGSUZPQwkJICgweDdMPDwzKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NNX1NUQVRVU19DU19SVEFHQwkJICgweDdMPDw2KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NNX1NUQVRVU19DU19SRklGT0MJCSAoMHg3TDw8OSkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TTV9TVEFUVVNfSU5WQUxJRF9CTEtfQUREUgkgKDB4N2ZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX1NUQVRVUwkJCQkweDAwMDAxMDUwCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX1NUQVRVU19IRUxEX0VOVFJJRVMJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9TVEFUVVNfTUFYX0hFTERfRU5UUklFUwkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfQ1RYX0RNQV9TVEFUVVMJCQkJMHgwMDAwMTA1NAorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4wX1NUQVRVUwkJICgweDNMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4xX1NUQVRVUwkJICgweDNMPDwyKQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4yX1NUQVRVUwkJICgweDNMPDw0KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4zX1NUQVRVUwkJICgweDNMPDw2KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU40X1NUQVRVUwkJICgweDNMPDw4KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU41X1NUQVRVUwkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9DVFhfRE1BX1NUQVRVU19SRF9DSEFONl9TVEFUVVMJCSAoMHgzTDw8MTIpCisjZGVmaW5lIEJOWDJfQ1RYX0RNQV9TVEFUVVNfUkRfQ0hBTjdfU1RBVFVTCQkgKDB4M0w8PDE0KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU44X1NUQVRVUwkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfRE1BX1NUQVRVU19SRF9DSEFOOV9TVEFUVVMJCSAoMHgzTDw8MTgpCisjZGVmaW5lIEJOWDJfQ1RYX0RNQV9TVEFUVVNfUkRfQ0hBTjEwX1NUQVRVUwkJICgweDNMPDwyMCkKKworI2RlZmluZSBCTlgyX0NUWF9SRVBfU1RBVFVTCQkJCTB4MDAwMDEwNTgKKyNkZWZpbmUgQk5YMl9DVFhfUkVQX1NUQVRVU19FUlJPUl9FTlRSWQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9SRVBfU1RBVFVTX0VSUk9SX0NMSUVOVF9JRAkJICgweDFmTDw8MTApCisjZGVmaW5lIEJOWDJfQ1RYX1JFUF9TVEFUVVNfVVNBR0VfQ05UX01BWF9FUlIJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9SRVBfU1RBVFVTX1VTQUdFX0NOVF9NSU5fRVJSCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9DVFhfUkVQX1NUQVRVU19VU0FHRV9DTlRfTUlTU19FUlIJCSAoMUw8PDE4KQorCisjZGVmaW5lIEJOWDJfQ1RYX0NLU1VNX0VSUk9SX1NUQVRVUwkJCTB4MDAwMDEwNWMKKyNkZWZpbmUgQk5YMl9DVFhfQ0tTVU1fRVJST1JfU1RBVFVTX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0tTVU1fRVJST1JfU1RBVFVTX0VYUEVDVEVECQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMAkJCTB4MDAwMDEwODAKICNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18wX0NJRAkJCSAoMHgzZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18wX1RZUEUJCSAoMHgzTDw8MTQpCiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMF9NT0RFCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18wX01PREVfWEkJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzBfVFlQRV9YSQkJICgweDdMPDwxNSkKIAogI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzEJCQkweDAwMDAxMDg0CiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMgkJCTB4MDAwMDEwODgKQEAgLTEzOTQsNiArMjUwMiwyNiBAQAogI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzYJCQkweDAwMDAxMDk4CiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfNwkJCTB4MDAwMDEwOWMKICNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU184CQkJMHgwMDAwMTBhMAorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzkJCQkweDAwMDAxMGE0CisKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfREFUQQkJCQkweDAwMDAxMGM0CisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTAkJCTB4MDAwMDEwYzgKKyNkZWZpbmUgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9DVFJMX1BBR0VfVEJMX0FERFIJICgweDFmZkw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTF9XUklURV9SRVEJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0NUUkxfUkVBRF9SRVEJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTAJCQkweDAwMDAxMGNjCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTBfVkFMSUQJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTBfVkFMVUUJCSAoMHhmZmZmZmZMPDw4KQorCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTEJCQkweDAwMDAxMGQwCisjZGVmaW5lIEJOWDJfQ1RYX0NBTV9DVFJMCQkJCTB4MDAwMDEwZDQKKyNkZWZpbmUgQk5YMl9DVFhfQ0FNX0NUUkxfQ0FNX0FERFIJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FNX0NUUkxfUkVTRVQJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfQ1RYX0NBTV9DVFJMX0lOVkFMSURBVEUJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FNX0NUUkxfU0VBUkNICQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfQ1RYX0NBTV9DVFJMX1dSSVRFX1JFUQkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NUWF9DQU1fQ1RSTF9SRUFEX1JFUQkJCSAoMUw8PDMxKQogCiAKIC8qCkBAIC0xNDA3LDE0ICsyNTM1LDE2IEBACiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfTk9ORQkJCSAoMEw8PDIpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJCQkJCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfR01JSQkJCSAoMkw8PDIpCi0jZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJXzEwCQkJICgzTDw8MikKKyNkZWZpbmUgQk5YMl9FTUFDX01PREVfUE9SVF9NSUlfMTBNCQkJICgzTDw8MikKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTUFDX0xPT1AJCQkJICgxTDw8NCkKLSNkZWZpbmUgQk5YMl9FTUFDX01PREVfMjVHCQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFXzI1R19NT0RFCQkJCSAoMUw8PDUpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1RBR0dFRF9NQUNfQ1RMCQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfVFhfQlVSU1QJCQkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTUFYX0RFRkVSX0RST1BfRU5BCQkgKDFMPDw5KQogI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9FWFRfTElOS19QT0wJCQkgKDFMPDwxMCkKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfRk9SQ0VfTElOSwkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9TRVJERVNfTU9ERQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9CT05EX09WUkQJCQkgKDFMPDwxMykKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTVBLVAkJCQkgKDFMPDwxOCkKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTVBLVF9SQ1ZECQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX0FDUElfUkNWRAkJCSAoMUw8PDIwKQpAQCAtMTQyMiw2ICsyNTUyLDExIEBACiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVMJCQkJMHgwMDAwMTQwNAogI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX0xJTksJCQkJICgxTDw8MTEpCiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfTElOS19DSEFOR0UJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19TRVJERVNfQVVUT05FR19DT01QTEVURQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19TRVJERVNfQVVUT05FR19DSEFOR0UJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX1NFUkRFU19OWFRfUEdfQ0hBTkdFCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19TRVJERVNfUlhfQ09ORklHX0lTXzAJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX1NFUkRFU19SWF9DT05GSUdfSVNfMF9DSEFOR0UJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfTUlfQ09NUExFVEUJCQkgKDFMPDwyMikKICNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19NSV9JTlQJCQkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfQVBfRVJST1IJCQkgKDFMPDwyNCkKQEAgLTE0MjksNiArMjU2NCw5IEBACiAKICNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkEJCQkJMHgwMDAwMTQwOAogI2RlZmluZSBCTlgyX0VNQUNfQVRURU5USU9OX0VOQV9MSU5LCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX0FVVE9ORUdfQ0hBTkdFCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTlhUX1BHX0NIQU5HRQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX1NFUkRFU19SWF9DT05GSUdfSVNfMF9DSEFOR0UJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX01JX0NPTVBMRVRFCQkgKDFMPDwyMikKICNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTUlfSU5UCQkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX0FQX0VSUk9SCQkgKDFMPDwyNCkKQEAgLTE0NDUsNiArMjU4MywxMyBAQAogI2RlZmluZSBCTlgyX0VNQUNfTEVEXzEwME1CCQkJCSAoMUw8PDgpCiAjZGVmaW5lIEJOWDJfRU1BQ19MRURfMTBNQgkJCQkgKDFMPDw5KQogI2RlZmluZSBCTlgyX0VNQUNfTEVEX1RSQUZGSUNfU1RBVAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0VNQUNfTEVEXzI1MDBNQgkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF8yNTAwTUJfT1ZFUlJJREUJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9BQ1RJVklUWV9TRUwJCQkgKDB4M0w8PDE3KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEX0FDVElWSVRZX1NFTF8wCQkJICgwTDw8MTcpCisjZGVmaW5lIEJOWDJfRU1BQ19MRURfQUNUSVZJVFlfU0VMXzEJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9BQ1RJVklUWV9TRUxfMgkJCSAoMkw8PDE3KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEX0FDVElWSVRZX1NFTF8zCQkJICgzTDw8MTcpCiAjZGVmaW5lIEJOWDJfRU1BQ19MRURfQkxOS19SQVRFCQkJCSAoMHhmZmZMPDwxOSkKICNkZWZpbmUgQk5YMl9FTUFDX0xFRF9CTE5LX1JBVEVfRU5BCQkJICgxTDw8MzEpCiAKQEAgLTE1MTUsOSArMjY2MCwxNSBAQAogI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX1BIWV9BRERSCQkJICgweDFmTDw8MjEpCiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORAkJCSAoMHgzTDw8MjYpCiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9VTkRFRklORURfMAkJICgwTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTCQkgKDBMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1dSSVRFCQkgKDFMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQUQJCSAoMkw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfMjJfWEkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfNDVfWEkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfUkVBRF8yMl9YSQkJICgyTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9SRUFEX0lOQ180NV9YSQkgKDJMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1VOREVGSU5FRF8zCQkgKDNMPDwyNikKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQURfNDUJCSAoM0w8PDI2KQogI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0ZBSUwJCQkgKDFMPDwyOCkKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZCQkJICgxTDw8MjkpCiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fRElTRVhUCQkJICgxTDw8MzApCkBAIC0xNTM0LDEzICsyNjg1LDE3IEBACiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX01PREVfTURJT19PRQkJCSAoMUw8PDEwKQogI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX01EQwkJCQkgKDFMPDwxMSkKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fTU9ERV9NRElOVAkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0VYVF9NRElOVAkJCSAoMUw8PDEzKQogI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0NMT0NLX0NOVAkJCSAoMHgxZkw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9YSQkJICgweDNmTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1X1hJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX0VNQUNfTURJT19BVVRPX1NUQVRVUwkJCTB4MDAwMDE0YjgKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQVVUT19TVEFUVVNfQVVUT19FUlIJCSAoMUw8PDApCiAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREUJCQkJMHgwMDAwMTRiYwogI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9SRVNFVAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9DUzE2X1RFU1QJCQkgKDFMPDwyKQogI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9FWFRfUEFVU0VfRU4JCQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9GTE9XX0VOCQkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREVfQklHX0JBQ0tPRkYJCQkgKDFMPDw1KQpAQCAtMTU1Myw2ICsyNzA4LDcgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRVU19YT05fU0VOVAkJCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfTElOS19VUAkJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfVU5ERVJSVU4JCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVFVTX0NTMTZfRVJST1IJCQkgKDFMPDw1KQogCiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9MRU5HVEhTCQkJCTB4MDAwMDE0YzQKICNkZWZpbmUgQk5YMl9FTUFDX1RYX0xFTkdUSFNfU0xPVAkJCSAoMHhmZkw8PDApCkBAIC0xNTg2LDYgKzI3NDIsMTAgQEAKICNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINQkJCTB4MDAwMDE0ZTQKICNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINgkJCTB4MDAwMDE0ZTgKICNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINwkJCTB4MDAwMDE0ZWMKKyNkZWZpbmUgQk5YMl9FTUFDX0NLU1VNX0VSUk9SX1NUQVRVUwkJCTB4MDAwMDE0ZjAKKyNkZWZpbmUgQk5YMl9FTUFDX0NLU1VNX0VSUk9SX1NUQVRVU19DQUxDVUxBVEVECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19DS1NVTV9FUlJPUl9TVEFUVVNfRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfSUZIQ0lOT0NURVRTCQkJMHgwMDAwMTUwMAogI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9JRkhDSU5CQURPQ1RFVFMJCTB4MDAwMDE1MDQKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU0ZSQUdNRU5UUwkJMHgwMDAwMTUwOApAQCAtMTYwOCw3ICsyNzY4LDcgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMyNTZPQ1RFVFNUTzUxMU9DVEVUUwkweDAwMDAxNTRjCiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0VUSEVSU1RBVFNQS1RTNTEyT0NURVRTVE8xMDIzT0NURVRTCTB4MDAwMDE1NTAKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMxMDI0T0NURVRTVE8xNTIyT0NURVRTCTB4MDAwMDE1NTQKLSNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMxNTIzT0NURVRTVE85MDIyT0NURVRTCTB4MDAwMDE1NTgKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFNPVkVSMTUyMk9DVEVUUwkweDAwMDAxNTU4CiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzAJCQkJMHgwMDAwMTU1YwogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcxCQkJCTB4MDAwMDE1NjAKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMV9MRU5HVEhfTkVfQllURV9DT1VOVAkgKDFMPDwwKQpAQCAtMTY2MSw5ICsyODIxLDkgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VNQUMyCQkgKDB4MUw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfVU1BQzMJCSAoMHgyTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9VTkkJCSAoMHgzTDw8MTYpCi0jZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NTUFDMgkJICgweDdMPDwxNikKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01NQUMzCQkgKDB4NUw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfUFNBMQkJICgweDZMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01NQUMyCQkgKDB4N0w8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfUFNBMgkJICgweDdMPDwxNikKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1BTQTMJCSAoMHg4TDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NQzIJCSAoMHg5TDw8MTYpCkBAIC0xNzAxLDcgKzI4NjEsNyBAQAogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X1NMT1RfRklMTEVECQkgKDFMPDwyMykKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GQUxTRV9DQVJSSUVSCQkgKDFMPDwyNCkKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9MQVNUX0RBVEEJCSAoMUw8PDI1KQotI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X3NmZF9GT1VORAkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfU0ZEX0ZPVU5ECQkgKDFMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9BRFZBTkNFCQkJICgxTDw8MjcpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfU1RBUlQJCQkgKDFMPDwyOCkKIApAQCAtMTczMyw2ICsyODkzLDcgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9JRElfUlBNX0FDQ0VQVAkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfRk1MRU4JCQkgKDB4ZmZmTDw8MjApCiAKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRkFMU0VDQVJSSUVSRVJST1JTCQkweDAwMDAxNTc0CiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMAkJCQkweDAwMDAxNTgwCiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMQkJCQkweDAwMDAxNTg0CiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMgkJCQkweDAwMDAxNTg4CkBAIC0xNzU3LDYgKzI5MTgsNyBAQAogI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzIxCQkJCTB4MDAwMDE1ZDQKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUMyMgkJCQkweDAwMDAxNWQ4CiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19TVUNfREJHX09WRVJSVU5WRUMJCTB4MDAwMDE1ZGMKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUNfMjgJCQkJMHgwMDAwMTVmNAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUT0NURVRTCQkJMHgwMDAwMTYwMAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUQkFET0NURVRTCQkweDAwMDAxNjA0CiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0VUSEVSU1RBVFNDT0xMSVNJT05TCQkweDAwMDAxNjA4CkBAIC0xNzc3LDcgKzI5MzksNyBAQAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzI1Nk9DVEVUU1RPNTExT0NURVRTCTB4MDAwMDE2NDQKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRVRIRVJTVEFUU1BLVFM1MTJPQ1RFVFNUTzEwMjNPQ1RFVFMJMHgwMDAwMTY0OAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzEwMjRPQ1RFVFNUTzE1MjJPQ1RFVFMJMHgwMDAwMTY0YwotI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzE1MjNPQ1RFVFNUTzkwMjJPQ1RFVFMJMHgwMDAwMTY1MAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUU09WRVIxNTIyT0NURVRTCTB4MDAwMDE2NTAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRE9UM1NUQVRTSU5URVJOQUxNQUNUUkFOU01JVEVSUk9SUwkweDAwMDAxNjU0CiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzAJCQkJMHgwMDAwMTY1OAogI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxCQkJCTB4MDAwMDE2NWMKQEAgLTE4NDMsMTYgKzMwMDUsMTYgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9JRExFCQkgKDB4MEw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX01DQTEJCSAoMHgyTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfTUNBMgkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9TUkMzCQkgKDB4NEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1NSQzIJCSAoMHg1TDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfTUNBMwkJICgweDZMPDwxNikKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9TUkMxCQkgKDB4N0w8PDE2KQotI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1NSQzIJCSAoMHg1TDw8MTYpCi0jZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfU1JDMwkJICgweDRMPDwxNikKLSNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9UWVBFCQkgKDB4Y0w8PDE2KQotI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX0NNRAkJICgweGVMPDwxNikKLSNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9USU1FCQkgKDB4YUw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX0NSQzEJCSAoMHg4TDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfQ1JDMgkJICgweDlMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9USU1FCQkgKDB4YUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1RZUEUJCSAoMHhjTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfV0FJVAkJICgweGRMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9DTUQJCSAoMHhlTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfU1RBVFMwX1ZBTElECQkgKDFMPDwyMCkKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9BUFBFTkRfQ1JDCQkgKDFMPDwyMSkKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9TTE9UX0ZJTExFRAkJICgxTDw8MjIpCkBAIC0xODg3LDggKzMwNDksMTEgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMxOAkJCQkweDAwMDAxNmM4CiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMTkJCQkJMHgwMDAwMTZjYwogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9BQzIwCQkJCTB4MDAwMDE2ZDAKLSNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMyMQkJCQkweDAwMDAxNmQ0CiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19TVUNfREJHX09WRVJSVU5WRUMJCTB4MDAwMDE2ZDgKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1JBVEVfTElNSVRfQ1RSTAkJCTB4MDAwMDE2ZmMKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1JBVEVfTElNSVRfQ1RSTF9UWF9USFJPVFRMRV9JTkMJICgweDdmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1JBVEVfTElNSVRfQ1RSTF9UWF9USFJPVFRMRV9OVU0JICgweDdmTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9SQVRFX0xJTUlUX0NUUkxfUkFURV9MSU1JVEVSX0VOCSAoMUw8PDMxKQogCiAKIC8qCkBAIC0xOTA5LDggKzMwNzQsMTUgQEAKICNkZWZpbmUgQk5YMl9SUE1fQ09ORklHX0FDUElfS0VFUAkJCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfUlBNX0NPTkZJR19NUF9LRUVQCQkJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfUlBNX0NPTkZJR19TT1JUX1ZFQ1RfVkFMCQkJICgweGZMPDw0KQorI2RlZmluZSBCTlgyX1JQTV9DT05GSUdfRElTQUJMRV9XT0xfQVNTRVJUCQkgKDFMPDwzMCkKICNkZWZpbmUgQk5YMl9SUE1fQ09ORklHX0lHTk9SRV9WTEFOCQkJICgxTDw8MzEpCiAKKyNkZWZpbmUgQk5YMl9SUE1fTUdNVF9QS1RfQ1RSTAkJCQkweDAwMDAxODBjCisjZGVmaW5lIEJOWDJfUlBNX01HTVRfUEtUX0NUUkxfTUdNVF9TT1JUCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX01HTVRfUEtUX0NUUkxfTUdNVF9SVUxFCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfUlBNX01HTVRfUEtUX0NUUkxfTUdNVF9ESVNDQVJEX0VOCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fTUdNVF9QS1RfQ1RSTF9NR01UX0VOCQkJICgxTDw8MzEpCisKICNkZWZpbmUgQk5YMl9SUE1fVkxBTl9NQVRDSDAJCQkJMHgwMDAwMTgxMAogI2RlZmluZSBCTlgyX1JQTV9WTEFOX01BVENIMF9SUE1fVkxBTl9NVENIMF9WQUxVRQkgKDB4ZmZmTDw8MCkKIApAQCAtMTkzMSw2ICszMTAzLDcgQEAKICNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMF9QUk9NX0VOCQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfVkxBTl9FTgkJCSAoMHhmTDw8MjApCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfUFJPTV9WTEFOCQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfVkxBTl9OT1RNQVRDSAkJICgxTDw8MjUpCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfRU5BCQkJCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjEJCQkJMHgwMDAwMTgyNApAQCAtMTk2OCwxMSArMzE0MSwxODcgQEAKICNkZWZpbmUgQk5YMl9SUE1fU1RBVF9JRklORlRRRElTQ0FSRFMJCQkweDAwMDAxODQ4CiAjZGVmaW5lIEJOWDJfUlBNX1NUQVRfSUZJTk1CVUZESVNDQVJECQkJMHgwMDAwMTg0YwogI2RlZmluZSBCTlgyX1JQTV9TVEFUX1JVTEVfQ0hFQ0tFUl9QNF9ISVQJCTB4MDAwMDE4NTAKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMAkJMHgwMDAwMTg1NAorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSX0xFTgkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSX0xFTl9UWVBFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSX0VOCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjEJCTB4MDAwMDE4NTgKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUl9MRU4JICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUgkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUl9MRU5fVFlQRQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUl9FTgkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04yCQkweDAwMDAxODVjCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVJfTEVOCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVIJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVJfTEVOX1RZUEUJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVJfRU4JICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMwkJMHgwMDAwMTg2MAorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSX0xFTgkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSX0xFTl9UWVBFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSX0VOCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjQJCTB4MDAwMDE4NjQKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUl9MRU4JICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUgkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUl9MRU5fVFlQRQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUl9FTgkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT041CQkweDAwMDAxODY4CisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVJfTEVOCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVIJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVJfTEVOX1RZUEUJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVJfRU4JICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONgkJMHgwMDAwMTg2YworI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSX0xFTgkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSX0xFTl9UWVBFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSX0VOCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjcJCTB4MDAwMDE4NzAKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUl9MRU4JICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUgkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUl9MRU5fVFlQRQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUl9FTgkgKDFMPDwzMSkKKwogI2RlZmluZSBCTlgyX1JQTV9TVEFUX0FDMAkJCQkweDAwMDAxODgwCiAjZGVmaW5lIEJOWDJfUlBNX1NUQVRfQUMxCQkJCTB4MDAwMDE4ODQKICNkZWZpbmUgQk5YMl9SUE1fU1RBVF9BQzIJCQkJMHgwMDAwMTg4OAogI2RlZmluZSBCTlgyX1JQTV9TVEFUX0FDMwkJCQkweDAwMDAxODhjCiAjZGVmaW5lIEJOWDJfUlBNX1NUQVRfQUM0CQkJCTB4MDAwMDE4OTAKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNgkJCQkweDAwMDAxOGUwCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfT0ZGU0VUCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DTEFTUwkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QUklPUklUWQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X1A0CQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X0hEUl9UWVBFCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9IRFJfVFlQRV9TVEFSVAkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfSVAJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9IRFJfVFlQRV9UQ1AJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X0hEUl9UWVBFX1VEUAkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfREFUQQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfVENQX1VEUAkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfSUNNUFY2CQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DT01QCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DT01QX0VRVUFMCQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfQ09NUF9ORVFVQUwJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DT01QX0dSRUFURVIJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X0NPTVBfTEVTUwkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X01BUAkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9TQklUCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfQ01EU0VMCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfRElTQ0FSRAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X01BU0sJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QMQkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QMgkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QMwkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9OQklUCQkJICgxTDw8MzApCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNgkJCTB4MDAwMDE4ZTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNl9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNl9NQVNLCQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3CQkJCTB4MDAwMDE4ZTgKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19PRkZTRVQJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NMQVNTCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1BSSU9SSVRZCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfUDQJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfSERSX1RZUEUJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0hEUl9UWVBFX1NUQVJUCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9JUAkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0hEUl9UWVBFX1RDUAkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfSERSX1RZUEVfVURQCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9EQVRBCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9UQ1BfVURQCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9JQ01QVjYJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NPTVAJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NPTVBfRVFVQUwJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19DT01QX05FUVVBTAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NPTVBfR1JFQVRFUgkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfQ09NUF9MRVNTCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfTUFQCQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1NCSVQJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19DTURTRUwJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19ESVNDQVJECQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfTUFTSwkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1AxCQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1AyCQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1AzCQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X05CSVQJCQkgKDFMPDwzMCkKKworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE3CQkJMHgwMDAwMThlYworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE3X1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE3X01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTgJCQkJMHgwMDAwMThmMAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X09GRlNFVAkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ0xBU1MJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUFJJT1JJVFkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9QNAkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9IRFJfVFlQRQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfSERSX1RZUEVfU1RBUlQJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX0lQCQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfSERSX1RZUEVfVENQCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9IRFJfVFlQRV9VRFAJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX0RBVEEJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX1RDUF9VRFAJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX0lDTVBWNgkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ09NUAkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ09NUF9FUVVBTAkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0NPTVBfTkVRVUFMCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ09NUF9HUkVBVEVSCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9DT01QX0xFU1MJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9NQVAJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfU0JJVAkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0NNRFNFTAkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0RJU0NBUkQJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9NQVNLCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUDEJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUDIJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUDMJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfTkJJVAkJCSAoMUw8PDMwKQorCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMTgJCQkweDAwMDAxOGY0CisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMThfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMThfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOQkJCQkweDAwMDAxOGY4CisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfT0ZGU0VUCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DTEFTUwkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QUklPUklUWQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X1A0CQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X0hEUl9UWVBFCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9IRFJfVFlQRV9TVEFSVAkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfSVAJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9IRFJfVFlQRV9UQ1AJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X0hEUl9UWVBFX1VEUAkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfREFUQQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfVENQX1VEUAkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfSUNNUFY2CQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DT01QCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DT01QX0VRVUFMCQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfQ09NUF9ORVFVQUwJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DT01QX0dSRUFURVIJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X0NPTVBfTEVTUwkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X01BUAkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9TQklUCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfQ01EU0VMCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfRElTQ0FSRAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X01BU0sJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QMQkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QMgkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QMwkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9OQklUCQkJICgxTDw8MzApCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xOQkJCTB4MDAwMDE4ZmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xOV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xOV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzAJCQkJMHgwMDAwMTkwMAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfT0ZGU0VUCQkJICgweGZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0NMQVNTCQkJICgweDdMPDw4KQpAQCAtMTk4NCwxNCArMzMzMywxOCBAQAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfSERSX1RZUEVfVENQCQkJICgyTDw8MTMpCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9IRFJfVFlQRV9VRFAJCQkgKDNMPDwxMykKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0hEUl9UWVBFX0RBVEEJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfSERSX1RZUEVfVENQX1VEUAkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9IRFJfVFlQRV9JQ01QVjYJCSAoNkw8PDEzKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUAkJCQkgKDB4M0w8PDE2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9FUVVBTAkJCSAoMEw8PDE2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9ORVFVQUwJCQkgKDFMPDwxNikKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0NPTVBfR1JFQVRFUgkJCSAoMkw8PDE2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9MRVNTCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9NQVBfWEkJCQkgKDFMPDwxOCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX1NCSVQJCQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DTURTRUwJCQkgKDB4Zkw8PDIwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfTUFQCQkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9ESVNDQVJECQkJICgxTDw8MjUpCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9NQVNLCQkJCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfUDEJCQkJICgxTDw8MjcpCkBAIC0yMDA2LDgxICszMzU5LDUxOCBAQAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEJCQkJMHgwMDAwMTkwOAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQQkJCQkgKDB4M2ZmZmZMPDwwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9PRkZTRVRfWEkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQ0xBU1NfWEkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfUDRfWEkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX1hJCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX0lQX1hJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX1RDUF9YSQkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfSERSX1RZUEVfREFUQV9YSQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9IRFJfVFlQRV9UQ1BfVURQX1hJCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9DT01QX1hJCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0NPTVBfRVFVQUxfWEkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQ09NUF9HUkVBVEVSX1hJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0NPTVBfTEVTU19YSQkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfTUFQX1hJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9DTURTRUxfWEkJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0RJU0NBUkRfWEkJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX1AxX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9QMl9YSQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX05CSVRfWEkJCQkgKDFMPDwzMCkKIAogI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzEJCQkweDAwMDAxOTBjCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xX01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMgkJCQkweDAwMDAxOTEwCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9CCQkJCSAoMHhmZmZMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX09GRlNFVF9YSQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX1BSSU9SSVRZX1hJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9QNF9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfU1RBUlRfWEkJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfSVBfWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0hEUl9UWVBFX1VEUF9YSQkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9IRFJfVFlQRV9EQVRBX1hJCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfSUNNUFY2X1hJCQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0NPTVBfWEkJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9DT01QX05FUVVBTF9YSQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9DT01QX0dSRUFURVJfWEkJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfQ09NUF9MRVNTX1hJCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX1NCSVRfWEkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0NNRFNFTF9YSQkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfTUFTS19YSQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfUDFfWEkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9QM19YSQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfTkJJVF9YSQkJCSAoMUw8PDMwKQogCiAjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMgkJCTB4MDAwMDE5MTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18yX1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzJfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zCQkJCTB4MDAwMDE5MTgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0EJCQkJICgweDNmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0IJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0NMQVNTX1hJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfUFJJT1JJVFlfWEkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9TVEFSVF9YSQkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9UQ1BfWEkJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfSERSX1RZUEVfVURQX1hJCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfSERSX1RZUEVfVENQX1VEUF9YSQkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9JQ01QVjZfWEkJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19DT01QX0VRVUFMX1hJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0NPTVBfTkVRVUFMX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19DT01QX0xFU1NfWEkJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX01BUF9YSQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfU0JJVF9YSQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19ESVNDQVJEX1hJCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19NQVNLX1hJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfUDJfWEkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX1AzX1hJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18zCQkJMHgwMDAwMTkxYworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzNfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfM19NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzQJCQkJMHgwMDAwMTkyMAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQQkJCQkgKDB4M2ZmZmZMPDwwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9PRkZTRVRfWEkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQ0xBU1NfWEkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfUDRfWEkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX1hJCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX0lQX1hJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX1RDUF9YSQkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfSERSX1RZUEVfREFUQV9YSQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9IRFJfVFlQRV9UQ1BfVURQX1hJCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9DT01QX1hJCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0NPTVBfRVFVQUxfWEkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQ09NUF9HUkVBVEVSX1hJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0NPTVBfTEVTU19YSQkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfTUFQX1hJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9DTURTRUxfWEkJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0RJU0NBUkRfWEkJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X1AxX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9QMl9YSQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X05CSVRfWEkJCQkgKDFMPDwzMCkKIAogI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzQJCQkweDAwMDAxOTI0CisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfNF9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS180X01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNQkJCQkweDAwMDAxOTI4CiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9CCQkJCSAoMHhmZmZMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X09GRlNFVF9YSQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X1BSSU9SSVRZX1hJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9QNF9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfU1RBUlRfWEkJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfSVBfWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0hEUl9UWVBFX1VEUF9YSQkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9IRFJfVFlQRV9EQVRBX1hJCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfSUNNUFY2X1hJCQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0NPTVBfWEkJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9DT01QX05FUVVBTF9YSQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9DT01QX0dSRUFURVJfWEkJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfQ09NUF9MRVNTX1hJCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X1NCSVRfWEkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0NNRFNFTF9YSQkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfTUFTS19YSQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfUDFfWEkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9QM19YSQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfTkJJVF9YSQkJCSAoMUw8PDMwKQogCiAjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfNQkJCTB4MDAwMDE5MmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS181X1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzVfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82CQkJCTB4MDAwMDE5MzAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0EJCQkJICgweDNmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0IJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0NMQVNTX1hJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfUFJJT1JJVFlfWEkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9TVEFSVF9YSQkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9UQ1BfWEkJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfSERSX1RZUEVfVURQX1hJCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfSERSX1RZUEVfVENQX1VEUF9YSQkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9JQ01QVjZfWEkJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9DT01QX0VRVUFMX1hJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0NPTVBfTkVRVUFMX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9DT01QX0xFU1NfWEkJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X01BUF9YSQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfU0JJVF9YSQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9ESVNDQVJEX1hJCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9NQVNLX1hJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfUDJfWEkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X1AzX1hJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS182CQkJMHgwMDAwMTkzNAorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzZfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfNl9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzcJCQkJMHgwMDAwMTkzOAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQQkJCQkgKDB4M2ZmZmZMPDwwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19PRkZTRVRfWEkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQ0xBU1NfWEkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfUDRfWEkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX1hJCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX0lQX1hJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX1RDUF9YSQkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfSERSX1RZUEVfREFUQV9YSQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19IRFJfVFlQRV9UQ1BfVURQX1hJCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19DT01QX1hJCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0NPTVBfRVFVQUxfWEkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQ09NUF9HUkVBVEVSX1hJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0NPTVBfTEVTU19YSQkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfTUFQX1hJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19DTURTRUxfWEkJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0RJU0NBUkRfWEkJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X1AxX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19QMl9YSQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X05CSVRfWEkJCQkgKDFMPDwzMCkKIAogI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzcJCQkweDAwMDAxOTNjCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfN19WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS183X01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOAkJCQkweDAwMDAxOTQwCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9CCQkJCSAoMHhmZmZMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X09GRlNFVF9YSQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X1BSSU9SSVRZX1hJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9QNF9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfU1RBUlRfWEkJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfSVBfWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0hEUl9UWVBFX1VEUF9YSQkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9IRFJfVFlQRV9EQVRBX1hJCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfSUNNUFY2X1hJCQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0NPTVBfWEkJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9DT01QX05FUVVBTF9YSQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9DT01QX0dSRUFURVJfWEkJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfQ09NUF9MRVNTX1hJCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X1NCSVRfWEkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0NNRFNFTF9YSQkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfTUFTS19YSQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfUDFfWEkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9QM19YSQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfTkJJVF9YSQkJCSAoMUw8PDMwKQogCiAjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfOAkJCTB4MDAwMDE5NDQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS184X1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzhfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85CQkJCTB4MDAwMDE5NDgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0EJCQkJICgweDNmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0IJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0NMQVNTX1hJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfUFJJT1JJVFlfWEkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9TVEFSVF9YSQkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9UQ1BfWEkJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfSERSX1RZUEVfVURQX1hJCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfSERSX1RZUEVfVENQX1VEUF9YSQkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9JQ01QVjZfWEkJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9DT01QX0VRVUFMX1hJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0NPTVBfTkVRVUFMX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9DT01QX0xFU1NfWEkJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X01BUF9YSQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfU0JJVF9YSQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9ESVNDQVJEX1hJCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9NQVNLX1hJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfUDJfWEkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X1AzX1hJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS185CQkJMHgwMDAwMTk0YworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzlfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfOV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwCQkJCTB4MDAwMDE5NTAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMAkJCTB4MDAwMDE5NTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMF9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMF9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExCQkJCTB4MDAwMDE5NTgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMQkJCTB4MDAwMDE5NWMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyCQkJCTB4MDAwMDE5NjAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMgkJCTB4MDAwMDE5NjQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMl9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMl9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzCQkJCTB4MDAwMDE5NjgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMwkJCTB4MDAwMDE5NmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xM19WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xM19NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0CQkJCTB4MDAwMDE5NzAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNAkJCTB4MDAwMDE5NzQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNF9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNF9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1CQkJCTB4MDAwMDE5NzgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNQkJCTB4MDAwMDE5N2MKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DT05GSUcJCQkJMHgwMDAwMTk4MAogI2RlZmluZSBCTlgyX1JQTV9SQ19DT05GSUdfUlVMRV9FTkFCTEUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NPTkZJR19SVUxFX0VOQUJMRV9YSQkJICgweGZmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ09ORklHX0RFRl9DTEFTUwkJCSAoMHg3TDw8MjQpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NPTkZJR19LTlVNX09WRVJXUklURQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9SUE1fREVCVUcwCQkJCQkweDAwMDAxOTg0CiAjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMF9GTV9CQ05UCQkJCSAoMHhmZmZmTDw8MCkKQEAgLTIyMzYsNiArNDAyNiwxNiBAQAogI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfSU5GSUZPX09WRVJSVU5fT0NDVVJSRUQJCSAoMUw8PDI5KQogI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfQUNQSV9NQVRDSF9JTlQJCQkgKDFMPDwzMCkKICNkZWZpbmUgQk5YMl9SUE1fREVCVUc5X0FDUElfRU5BQkxFX1NZTgkJCSAoMUw8PDMxKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfQkVNRU1fUl9YSQkJCSAoMHgxZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9FT19YSQkJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfQUVPRl9ERV9YSQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9TT19YSQkJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfV0Q2NF9DVF9YSQkJCSAoMHgxZkw8PDgpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9FT0ZfVkxEQllURV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9BQ1BJX1JERV9QQVRfSURfWEkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9DQUxDUkNfUkVTVUxUX1hJCQkgKDB4M2ZmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9EQVRBX0lOX1ZMX1hJCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9DQUxDUkNfQlVGRkVSX1ZMRF9YSQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9SUE1fQUNQSV9EQkdfQlVGX1cwMAkJCTB4MDAwMDE5YzAKICNkZWZpbmUgQk5YMl9SUE1fQUNQSV9EQkdfQlVGX1cwMQkJCTB4MDAwMDE5YzQKQEAgLTIyNTMsNiArNDA1Myw1NiBAQAogI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMxCQkJMHgwMDAwMTlmNAogI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMyCQkJMHgwMDAwMTlmOAogI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMzCQkJMHgwMDAwMTlmYworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0JZVEVfRU5BQkxFX0NUUkwJCQkweDAwMDAxYTAwCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfQllURV9FTkFCTEVfQ1RSTF9CWVRFX0FERFJFU1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0JZVEVfRU5BQkxFX0NUUkxfREVCVUdSRAkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfQllURV9FTkFCTEVfQ1RSTF9NT0RFCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9CWVRFX0VOQUJMRV9DVFJMX0lOSVQJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0JZVEVfRU5BQkxFX0NUUkxfV1IJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DVFJMCQkJMHgwMDAwMWEwNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1RSTF9QQVRURVJOX0lECQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DVFJMX0NSQ19TTV9DTFIJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1RSTF9XUgkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfREFUQQkJCQkweDAwMDAxYTA4CisjZGVmaW5lIEJOWDJfUlBNX0FDUElfREFUQV9QQVRURVJOX0JFCQkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMAkJCTB4MDAwMDFhMGMKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0xFTjBfUEFUVEVSTl9MRU4zCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMF9QQVRURVJOX0xFTjIJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9MRU4wX1BBVFRFUk5fTEVOMQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9MRU4wX1BBVFRFUk5fTEVOMAkJICgweGZmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0xFTjEJCQkweDAwMDAxYTEwCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9MRU4xX1BBVFRFUk5fTEVONwkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0xFTjFfUEFUVEVSTl9MRU42CQkgKDB4ZmZMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMV9QQVRURVJOX0xFTjUJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMV9QQVRURVJOX0xFTjQJCSAoMHhmZkw8PDI0KQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkMwCQkJMHgwMDAwMWExOAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDMF9QQVRURVJOX0NSQzAJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzEJCQkweDAwMDAxYTFjCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkMxX1BBVFRFUk5fQ1JDMQkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDMgkJCTB4MDAwMDFhMjAKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzJfUEFUVEVSTl9DUkMyCQkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkMzCQkJMHgwMDAwMWEyNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDM19QQVRURVJOX0NSQzMJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzQJCQkweDAwMDAxYTI4CisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkM0X1BBVFRFUk5fQ1JDNAkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDNQkJCTB4MDAwMDFhMmMKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzVfUEFUVEVSTl9DUkM1CQkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkM2CQkJMHgwMDAwMWEzMAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDNl9QQVRURVJOX0NSQzYJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzcJCQkweDAwMDAxYTM0CisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkM3X1BBVFRFUk5fQ1JDNwkJICgweGZmZmZmZmZmTDw8MCkKIAogCiAvKgpAQCAtMjI2MywxNSArNDExMywyMCBAQAogI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKICNkZWZpbmUgQk5YMl9SQlVGX0NPTU1BTkRfRlJFRV9JTklUCQkJICgxTDw8MSkKICNkZWZpbmUgQk5YMl9SQlVGX0NPTU1BTkRfUkFNX0lOSVQJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORF9QS1RfT0ZGU0VUX09WRkwJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX09WRVJfRlJFRQkJCSAoMUw8PDQpCiAjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0FMTE9DX1JFUQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0VOX1BSSV9DSE5HRV9URQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9SQlVGX0NPTU1BTkRfQ1VfSVNPTEFURV9YSQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0VOX1BSSV9DSEFOR0VfWEkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0dSQ19FTkRJQU5fQ09OVl9ESVNfWEkJICgxTDw8NykKIAogI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMQkJCQkweDAwMjAwMDA0CiAjZGVmaW5lIEJOWDJfUkJVRl9TVEFUVVMxX0ZSRUVfQ09VTlQJCQkgKDB4M2ZmTDw8MCkKIAogI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMgkJCQkweDAwMjAwMDA4Ci0jZGVmaW5lIEJOWDJfUkJVRl9TVEFUVVMyX0ZSRUVfVEFJTAkJCSAoMHgzZmZMPDwwKQotI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMl9GUkVFX0hFQUQJCQkgKDB4M2ZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUkJVRl9TVEFUVVMyX0ZSRUVfVEFJTAkJCSAoMHgxZmZMPDwwKQorI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMl9GUkVFX0hFQUQJCQkgKDB4MWZmTDw8MTYpCiAKICNkZWZpbmUgQk5YMl9SQlVGX0NPTkZJRwkJCQkweDAwMjAwMDBjCiAjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUdfWE9GRl9UUklQCQkJICgweDNmZkw8PDApCkBAIC0yMjc5LDE2ICs0MTM0LDIxIEBACiAKICNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9BTExPQwkJCQkweDAwMjAwMDEwCiAjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfQUxMT0NfVkFMVUUJCQkgKDB4MWZmTDw8NykKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9BTExPQ19UWVBFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfQUxMT0NfQUxMT0NfUkVRCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUUJCQkJMHgwMDIwMDAxNAogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUVfQ09VTlQJCQkgKDB4N2ZMPDwwKQogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUVfVEFJTAkJCSAoMHgxZmZMPDw3KQogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUVfSEVBRAkJCSAoMHgxZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX1RZUEUJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX0ZSRUVfUkVRCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUwJCQkJMHgwMDIwMDAxOAogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX1NFTF9DT1VOVAkJCSAoMHg3Zkw8PDApCiAjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfU0VMX1RBSUwJCQkgKDB4MWZmTDw8NykKICNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUxfSEVBRAkJCSAoMHgxZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUxfU0VMX1JFUQkJCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUcyCQkJCTB4MDAyMDAwMWMKICNkZWZpbmUgQk5YMl9SQlVGX0NPTkZJRzJfTUFDX0RST1BfVFJJUAkJCSAoMHgzZmZMPDwwKQpAQCAtMjM3Niw2ICs0MjM2LDggQEAKICNkZWZpbmUgQk5YMl9SVjJQX0lOU1RSX0hJR0hfSElHSAkJCSAoMHgxZkw8PDApCiAKICNkZWZpbmUgQk5YMl9SVjJQX0lOU1RSX0xPVwkJCQkweDAwMDAyODM0CisjZGVmaW5lIEJOWDJfUlYyUF9JTlNUUl9MT1dfTE9XCQkJCSAoMHhmZmZmZmZmZkw8PDApCisKICNkZWZpbmUgQk5YMl9SVjJQX1BST0MxX0FERFJfQ01ECQkJMHgwMDAwMjgzOAogI2RlZmluZSBCTlgyX1JWMlBfUFJPQzFfQUREUl9DTURfQURECQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlYyUF9QUk9DMV9BRERSX0NNRF9SRFdSCQkJICgxTDw8MzEpCkBAIC0yMzk1LDcgKzQyNTcsMjkgQEAKICNkZWZpbmUgQk5YMl9SVjJQX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQogI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9EQVRBCQkJCTB4MDAwMDJiNDAKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTAkJCQkweDAwMDAyYWZjCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfSU5DX1VTQUdFX0NOVAkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRQkJCSAoMHhmTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8wCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzEJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfMgkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8zCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzQJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfNQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV82CQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzcJCSAoN0w8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfOAkJICg4TDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV85CQkgKDlMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzEwCQkgKDEwTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8xMQkJICgxMUw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfMTIJCSAoMTJMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzEzCQkgKDEzTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8xNAkJICgxNEw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfMTUJCSAoMTVMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9DT1VOVAkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9PRkZTRVQJCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SVjJQX1JWMlBQUQkJCQkweDAwMDAyYjQwCiAjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRAkJCQkweDAwMDAyYjc4CiAjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjQxNiw3ICs0MzAwLDcgQEAKICNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKICNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKIAotI2RlZmluZSBCTlgyX1JWMlBfVEZUUV9EQVRBCQkJCTB4MDAwMDJiODAKKyNkZWZpbmUgQk5YMl9SVjJQX1JWMlBUUQkJCQkweDAwMDAyYjgwCiAjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRAkJCQkweDAwMDAyYmI4CiAjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjQzNyw3ICs0MzIxLDcgQEAKICNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKICNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKIAotI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9EQVRBCQkJCTB4MDAwMDJiYzAKKyNkZWZpbmUgQk5YMl9SVjJQX1JWMlBNUQkJCQkweDAwMDAyYmMwCiAjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRAkJCQkweDAwMDAyYmY4CiAjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjQ2NiwxOCArNDM1MCwyNiBAQAogICovCiAjZGVmaW5lIEJOWDJfTVFfQ09NTUFORAkJCQkJMHgwMDAwM2MwMAogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfRU5BQkxFRAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfSU5JVAkJCQkgKDFMPDwxKQogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfT1ZFUkZMT1cJCQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfV1JfRVJST1IJCQkgKDFMPDw1KQogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfUkRfRVJST1IJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfSURCX0NGR19FUlJPUgkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTVFfQ09NTUFORF9JREJfT1ZFUkZMT1cJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NUV9DT01NQU5EX05PX0JJTl9FUlJPUgkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfTk9fTUFQX0VSUk9SCQkJICgxTDw8MTIpCiAKICNkZWZpbmUgQk5YMl9NUV9TVEFUVVMJCQkJCTB4MDAwMDNjMDQKICNkZWZpbmUgQk5YMl9NUV9TVEFUVVNfQ1RYX0FDQ0VTU19TVEFUCQkJICgxTDw8MTYpCiAjZGVmaW5lIEJOWDJfTVFfU1RBVFVTX0NUWF9BQ0NFU1M2NF9TVEFUCQkgKDFMPDwxNykKICNkZWZpbmUgQk5YMl9NUV9TVEFUVVNfUENJX1NUQUxMX1NUQVQJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NUV9TVEFUVVNfSURCX09GTE9XX1NUQVQJCQkgKDFMPDwxOSkKIAogI2RlZmluZSBCTlgyX01RX0NPTkZJRwkJCQkJMHgwMDAwM2MwOAogI2RlZmluZSBCTlgyX01RX0NPTkZJR19UWF9ISUdIX1BSSQkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0hBTFRfRElTCQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0JJTl9NUV9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NUV9DT05GSUdfRElTX0lEQl9EUk9QCQkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9NUV9DT05GSUdfS05MX0JZUF9CTEtfU0laRQkJCSAoMHg3TDw8NCkKICNkZWZpbmUgQk5YMl9NUV9DT05GSUdfS05MX0JZUF9CTEtfU0laRV8yNTYJCSAoMEw8PDQpCiAjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0tOTF9CWVBfQkxLX1NJWkVfNTEyCQkgKDFMPDw0KQpAQCAtMjUzMyw2ICs0NDI1LDcgQEAKIAogI2RlZmluZSBCTlgyX01RX01FTV9XUl9EQVRBMgkJCQkweDAwMDAzYzgwCiAjZGVmaW5lIEJOWDJfTVFfTUVNX1dSX0RBVEEyX1ZBTFVFCQkJICgweDNmZmZmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NUV9NRU1fV1JfREFUQTJfVkFMVUVfWEkJCQkgKDB4N2ZmZmZmZmZMPDwwKQogCiAjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0FERFIJCQkJMHgwMDAwM2M4NAogI2RlZmluZSBCTlgyX01RX01FTV9SRF9BRERSX1ZBTFVFCQkJICgweDNmTDw8MCkKQEAgLTI1NDUsNiArNDQzOCwxNiBAQAogCiAjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0RBVEEyCQkJCTB4MDAwMDNjOTAKICNkZWZpbmUgQk5YMl9NUV9NRU1fUkRfREFUQTJfVkFMVUUJCQkgKDB4M2ZmZmZmZmZMPDwwKQorI2RlZmluZSBCTlgyX01RX01FTV9SRF9EQVRBMl9WQUxVRV9YSQkJCSAoMHg3ZmZmZmZmZkw8PDApCisKKworLyoKKyAqICB0c2NoX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDRjMDAKKyAqLworI2RlZmluZSBCTlgyX1RTQ0hfVFNTX0NGRwkJCQkweDAwMDA0YzFjCisjZGVmaW5lIEJOWDJfVFNDSF9UU1NfQ0ZHX1RTU19TVEFSVF9DSUQJCQkgKDB4N2ZmTDw8OCkKKyNkZWZpbmUgQk5YMl9UU0NIX1RTU19DRkdfTlVNX09GX1RTU19DT04JCSAoMHhmTDw8MjQpCiAKIAogCkBAIC0yNTk0LDcgKzQ0OTcsMTEgQEAKICNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQogI2RlZmluZSBCTlgyX1RCRFJfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX1RCRFJfRlRRX0RBVEEJCQkJMHgwMDAwNTNjMAorI2RlZmluZSBCTlgyX1RCRFJfQ0tTVU1fRVJST1JfU1RBVFVTCQkJMHgwMDAwNTAxMAorI2RlZmluZSBCTlgyX1RCRFJfQ0tTVU1fRVJST1JfU1RBVFVTX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NLU1VNX0VSUk9SX1NUQVRVU19FWFBFQ1RFRAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1RCRFJfVEJEUlEJCQkJCTB4MDAwMDUzYzAKICNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTUQJCQkJMHgwMDAwNTNmOAogI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0yNjI0LDcgKzQ1MzEsMTUgQEAKICNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkQJCQkJMHgwMDAwNWMwMAogI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKICNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkRfTUFTVEVSX0FCT1JUCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkRfQ1MxNl9FUlIJCQkgKDFMPDw1KQogI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9CQURfTDJfTEVOR1RIX0FCT1JUCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTMQkJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTMgkJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTMwkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTNAkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9GT1JDRV9JTE9DS19DS0VSUgkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT01NQU5EX09GSUZPX0NMUgkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9JRklGT19DTFIJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX1RETUFfU1RBVFVTCQkJCTB4MDAwMDVjMDQKICNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19ETUFfV0FJVAkJCSAoMUw8PDApCkBAIC0yNjMzLDEwICs0NTQ4LDE4IEBACiAjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfTE9DS19XQUlUCQkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19GVFFfRU5UUllfQ05UCQkJICgxTDw8MTYpCiAjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfQlVSU1RfQ05UCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfTUFYX0lGSUZPX0RFUFRICQkgKDB4M2ZMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19PRklGT19PVkVSRkxPVwkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1RETUFfU1RBVFVTX0lGSUZPX09WRVJGTE9XCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9URE1BX0NPTkZJRwkJCQkweDAwMDA1YzA4CiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfT05FX0RNQQkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfT05FX1JFQ09SRAkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTlVNX0RNQV9DSEFOCQkJICgweDNMPDwyKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX05VTV9ETUFfQ0hBTl8wCQkJICgwTDw8MikKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19OVU1fRE1BX0NIQU5fMQkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTlVNX0RNQV9DSEFOXzIJCQkgKDJMPDwyKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX05VTV9ETUFfQ0hBTl8zCQkJICgzTDw8MikKICNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MSU1JVF9TWgkJCSAoMHhmTDw8NCkKICNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MSU1JVF9TWl82NAkJCSAoMEw8PDQpCiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElNSVRfU1pfMTI4CQkJICgweDRMPDw0KQpAQCAtMjY0OSw3ICs0NTcyLDM1IEBACiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElORV9TWl81MTIJCQkgKDhMPDw4KQogI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0FMSUdOX0VOQQkJCSAoMUw8PDE1KQogI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0NIS19MMl9CRAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0NNUExfRU5UUlkJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19PRklGT19DTVAJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19PRklGT19DTVBfMwkJCSAoMEw8PDE5KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX09GSUZPX0NNUF8yCQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfRklGT19DTVAJCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0lGSUZPX0RFUFRIX1hJCQkJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF8wX1hJCQkgKDBMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF80X1hJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF84X1hJCQkgKDJMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF8xNl9YSQkJICgzTDw8MjApCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfSUZJRk9fREVQVEhfMzJfWEkJCSAoNEw8PDIwKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0lGSUZPX0RFUFRIXzY0X1hJCQkgKDVMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19GSUZPX0NNUF9FTl9YSQkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0JZVEVTX09TVF9YSQkJCSAoMHg3TDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQllURVNfT1NUXzUxMl9YSQkJICgwTDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQllURVNfT1NUXzEwMjRfWEkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0JZVEVTX09TVF8yMDQ4X1hJCQkgKDJMPDwyNCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19CWVRFU19PU1RfNDA5Nl9YSQkJICgzTDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQllURVNfT1NUXzgxOTJfWEkJCSAoNEw8PDI0KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0JZVEVTX09TVF8xNjM4NF9YSQkJICg1TDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfSENfQllQQVNTX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTENMX01SUlNfWEkJCQkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzEyOF9YSQkJICgwTDw8MjgpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTENMX01SUlNfMjU2X1hJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MQ0xfTVJSU181MTJfWEkJCSAoMkw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzEwMjRfWEkJCSAoM0w8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzIwNDhfWEkJCSAoNEw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzQwOTZfWEkJCSAoNUw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTX0VOX1hJCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9URE1BX1BBWUxPQURfUFJPRAkJCQkweDAwMDA1YzBjCiAjZGVmaW5lIEJOWDJfVERNQV9QQVlMT0FEX1BST0RfVkFMVUUJCQkgKDB4MWZmZkw8PDMpCkBAIC0yNjg1LDcgKzQ2MzYsMjIgQEAKICNkZWZpbmUgQk5YMl9URE1BX0RSX0lOVEZfU1RBVFVTX05YVF9QTlRSCQkgKDB4Zkw8PDEyKQogI2RlZmluZSBCTlgyX1RETUFfRFJfSU5URl9TVEFUVVNfQllURV9DT1VOVAkJICgweDdMPDwxNikKIAotI2RlZmluZSBCTlgyX1RETUFfRlRRX0RBVEEJCQkJMHgwMDAwNWZjMAorI2RlZmluZSBCTlgyX1RETUFfUFVTSF9GU00JCQkJMHgwMDAwNWM5MAorI2RlZmluZSBCTlgyX1RETUFfQkRfSUZfREVCVUcJCQkJMHgwMDAwNWM5NAorI2RlZmluZSBCTlgyX1RETUFfRE1BRF9JRl9ERUJVRwkJCQkweDAwMDA1Yzk4CisjZGVmaW5lIEJOWDJfVERNQV9DVFhfSUZfREVCVUcJCQkJMHgwMDAwNWM5YworI2RlZmluZSBCTlgyX1RETUFfVFBCVUZfSUZfREVCVUcJCQkweDAwMDA1Y2EwCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JRl9ERUJVRwkJCQkweDAwMDA1Y2E0CisjZGVmaW5lIEJOWDJfVERNQV9UUEFUUV9JRl9ERUJVRwkJCTB4MDAwMDVjYTgKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfSUxPQ0tfQ0tTVU0JCQkweDAwMDA1Y2FjCisjZGVmaW5lIEJOWDJfVERNQV9URE1BX0lMT0NLX0NLU1VNX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfSUxPQ0tfQ0tTVU1fRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfUENJRV9DS1NVTQkJCTB4MDAwMDVjYjAKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfUENJRV9DS1NVTV9DQUxDVUxBVEVECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfVERNQV9URE1BX1BDSUVfQ0tTVU1fRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFRCQkJCQkweDAwMDA1ZmMwCiAjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01ECQkJCTB4MDAwMDVmZjgKICNkZWZpbmUgQk5YMl9URE1BX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjcyNCw2ICs0NjkwLDggQEAKICNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0ZPUkNFX0lOVF9MT1cJCQkgKDJMPDwxOSkKICNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0ZPUkNFX0lOVF9GUkVFCQkJICgzTDw8MTkpCiAjZGVmaW5lIEJOWDJfSENfQ09NTUFORF9DTFJfU1RBVF9OT1cJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX01BSU5fUFdSX0lOVAkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX0hDX0NPTU1BTkRfQ09BTF9PTl9ORVhUX0VWRU5UCQkgKDFMPDwyNykKIAogI2RlZmluZSBCTlgyX0hDX1NUQVRVUwkJCQkJMHgwMDAwNjgwNAogI2RlZmluZSBCTlgyX0hDX1NUQVRVU19NQVNURVJfQUJPUlQJCQkgKDFMPDwwKQpAQCAtMjc0Niw2ICs0NzE0LDIzIEBACiAjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NUQVRJU1RJQ19QUklPUklUWQkJICgxTDw8NSkKICNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU1RBVFVTX1BSSU9SSVRZCQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU1RBVF9NRU1fQUREUgkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1BFUl9NT0RFCQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19PTkVfU0hPVAkJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfVVNFX0lOVF9QQVJBTQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TRVRfTUFTS19BVF9SRAkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkMJCQkgKDB4N0w8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TQl9BRERSX0lOQ182NEIJCQkgKDBMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkNfMTI4QgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TQl9BRERSX0lOQ18yNTZCCQkJICgyTDw8MjQpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NCX0FERFJfSU5DXzUxMkIJCQkgKDNMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkNfMTAyNEIJCSAoNEw8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TQl9BRERSX0lOQ18yMDQ4QgkJICg1TDw8MjQpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NCX0FERFJfSU5DXzQwOTZCCQkgKDZMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkNfODE5MkIJCSAoN0w8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19HRU5fU1RBVF9BVkdfSU5UUgkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1VOTUFTS19BTEwJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfVFhfU0VMCQkJCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfSENfQVRUTl9CSVRTX0VOQUJMRQkJCTB4MDAwMDY4MGMKICNkZWZpbmUgQk5YMl9IQ19TVEFUVVNfQUREUl9MCQkJCTB4MDAwMDY4MTAKQEAgLTI3ODIsNiArNDc2Nyw3IEBACiAKICNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLUwkJCQkweDAwMDA2ODNjCiAjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfSENfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTX0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQogCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9DT0xMRUNUX1RJQ0tTCQkJMHgwMDAwNjg0MAogI2RlZmluZSBCTlgyX0hDX1NUQVRfQ09MTEVDVF9USUNLU19IQ19TVEFUX0NPTExfVElDS1MJICgweGZmTDw8NCkKQEAgLTI3ODksNiArNDc3NSwxMCBAQAogI2RlZmluZSBCTlgyX0hDX1NUQVRTX1RJQ0tTCQkJCTB4MDAwMDY4NDQKICNkZWZpbmUgQk5YMl9IQ19TVEFUU19USUNLU19IQ19TVEFUX1RJQ0tTCQkgKDB4ZmZmZkw8PDgpCiAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUU19JTlRFUlJVUFRfU1RBVFVTCQkJMHgwMDAwNjg0OAorI2RlZmluZSBCTlgyX0hDX1NUQVRTX0lOVEVSUlVQVF9TVEFUVVNfU0JfU1RBVFVTCSAoMHgxZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRTX0lOVEVSUlVQVF9TVEFUVVNfSU5UX1NUQVRVUwkgKDB4MWZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9IQ19TVEFUX01FTV9EQVRBCQkJCTB4MDAwMDY4NGMKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMAkJCQkweDAwMDA2ODUwCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wCQkgKDB4N2ZMPDwwKQpAQCAtMjkxNywyNCArNDkwNywxMDggQEAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzEJCSAoMHg3Zkw8PDgpCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8yCQkgKDB4N2ZMPDwxNikKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzMJCSAoMHg3Zkw8PDI0KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9YSQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU1QX1JYX0ZSQU1FX0RST1BfWEkJICg1Mkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TMF9YSQkgKDU3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1MxX1hJCSAoNThMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9VTlVTRURfUzJfWEkJICg4NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TM19YSQkgKDg2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1M0X1hJCSAoODdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9VTlVTRURfUzVfWEkJICg4OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TNl9YSQkgKDg5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1M3X1hJCSAoOTBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9VTlVTRURfUzhfWEkJICg5MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TOV9YSQkgKDkyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1MxMF9YSQkgKDkzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfTVFfSURCX09GTE9XX1hJCSAoOTRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DVFhfQkxLX1JEX0NOVF9YSQkgKDEyM0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NUWF9CTEtfV1JfQ05UX1hJCSAoMTI0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1RYX0hJVFNfWEkJICgxMjVMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DVFhfTUlTU0VTX1hJCSAoMTI2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX1NUQVRVU19CTE9DS1NfVkVDMV9YSQkgKDEyOEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfR0VOX1ZFQzFfWEkJICgxMjlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX01CT1hfV1JfVkVDMV9YSQkgKDEzMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19IV19JTlRBQ0tfVkVDMV9YSQkgKDEzMUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19TV19JTlRBQ0tfVkVDMV9YSQkgKDEzMkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1ZFQzFfWEkJICgxMzNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fU1RBVFVTX0JMT0NLU19WRUMyX1hJCSAoMTM0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9HRU5fVkVDMl9YSQkgKDEzNUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfTUJPWF9XUl9WRUMyX1hJCSAoMTM2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19WRUMyX1hJCSAoMTM3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX1NXX0lOVEFDS19WRUMyX1hJCSAoMTM4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX0RVUklOR19TV19JTlRBQ0tfVkVDMl9YSQkgKDEzOUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9TVEFUVVNfQkxPQ0tTX1ZFQzNfWEkJICgxNDBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX0dFTl9WRUMzX1hJCSAoMTQxTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9NQk9YX1dSX1ZFQzNfWEkJICgxNDJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fSFdfSU5UQUNLX1ZFQzNfWEkJICgxNDNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fU1dfSU5UQUNLX1ZFQzNfWEkJICgxNDRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfRFVSSU5HX1NXX0lOVEFDS19WRUMzX1hJCSAoMTQ1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX1NUQVRVU19CTE9DS1NfVkVDNF9YSQkgKDE0Nkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfR0VOX1ZFQzRfWEkJICgxNDdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX01CT1hfV1JfVkVDNF9YSQkgKDE0OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19IV19JTlRBQ0tfVkVDNF9YSQkgKDE0OUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19TV19JTlRBQ0tfVkVDNF9YSQkgKDE1MEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1ZFQzRfWEkJICgxNTFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fU1RBVFVTX0JMT0NLU19WRUM1X1hJCSAoMTUyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9HRU5fVkVDNV9YSQkgKDE1M0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfTUJPWF9XUl9WRUM1X1hJCSAoMTU0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19WRUM1X1hJCSAoMTU1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX1NXX0lOVEFDS19WRUM1X1hJCSAoMTU2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX0RVUklOR19TV19JTlRBQ0tfVkVDNV9YSQkgKDE1N0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9TVEFUVVNfQkxPQ0tTX1ZFQzZfWEkJICgxNThMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX0dFTl9WRUM2X1hJCSAoMTU5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9NQk9YX1dSX1ZFQzZfWEkJICgxNjBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fSFdfSU5UQUNLX1ZFQzZfWEkJICgxNjFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fU1dfSU5UQUNLX1ZFQzZfWEkJICgxNjJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfRFVSSU5HX1NXX0lOVEFDS19WRUM2X1hJCSAoMTYzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX1NUQVRVU19CTE9DS1NfVkVDN19YSQkgKDE2NEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfR0VOX1ZFQzdfWEkJICgxNjVMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX01CT1hfV1JfVkVDN19YSQkgKDE2Nkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19IV19JTlRBQ0tfVkVDN19YSQkgKDE2N0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19TV19JTlRBQ0tfVkVDN19YSQkgKDE2OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1ZFQzdfWEkJICgxNjlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fU1RBVFVTX0JMT0NLU19WRUM4X1hJCSAoMTcwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9HRU5fVkVDOF9YSQkgKDE3MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfTUJPWF9XUl9WRUM4X1hJCSAoMTcyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19WRUM4X1hJCSAoMTczTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX1NXX0lOVEFDS19WRUM4X1hJCSAoMTc0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX0RVUklOR19TV19JTlRBQ0tfVkVDOF9YSQkgKDE3NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JWMlBDU19DTURfQ05UX1hJCSAoMTc2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUENTX1NMT1RfQ05UX1hJCSAoMTc3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUENTUV9WQUxJRF9DTlRfWEkJICgxNzhMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMV9YSQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzJfWEkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfM19YSQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMQkJCQkweDAwMDA2ODU0CiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzFfR0VOX1NFTF80CQkgKDB4N2ZMPDwwKQogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNQkJICgweDdmTDw8OCkKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMV9HRU5fU0VMXzYJCSAoMHg3Zkw8PDE2KQogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNwkJICgweDdmTDw8MjQpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzFfR0VOX1NFTF80X1hJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNV9YSQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMV9HRU5fU0VMXzZfWEkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfN19YSQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMgkJCQkweDAwMDA2ODU4CiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzJfR0VOX1NFTF84CQkgKDB4N2ZMPDwwKQogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfOQkJICgweDdmTDw8OCkKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzEwCQkgKDB4N2ZMPDwxNikKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzExCQkgKDB4N2ZMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzhfWEkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzJfR0VOX1NFTF85X1hJCQkgKDB4ZmZMPDw4KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfMTBfWEkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfMTFfWEkJCSAoMHhmZkw8PDI0KQogCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzMJCQkJMHgwMDAwNjg1YwogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8zX0dFTl9TRUxfMTIJCSAoMHg3Zkw8PDApCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xMwkJICgweDdmTDw8OCkKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzE0CQkgKDB4N2ZMPDwxNikKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzE1CQkgKDB4N2ZMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzEyX1hJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8zX0dFTl9TRUxfMTNfWEkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xNF9YSQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xNV9YSQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUMAkJCQkweDAwMDA2ODg4CiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDEJCQkJMHgwMDAwNjg4YwpAQCAtMjk2OCw2ICs1MDQyLDcgQEAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMTMJCQkweDAwMDA2OGZjCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVF9BQzE0CQkJMHgwMDAwNjkwMAogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVRfQUMxNQkJCTB4MDAwMDY5MDQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDCQkJMHgwMDAwNjhjOAogI2RlZmluZSBCTlgyX0hDX1ZJUwkJCQkJMHgwMDAwNjkwOAogI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFCQkJICgweGZMPDwwKQogI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFX0lETEUJCSAoMEw8PDApCkBAIC0zMDM4LDYgKzUxMTMsMzQ5IEBACiAjZGVmaW5lIEJOWDJfSENfREVCVUdfVkVDVF9QRUVLXzJfUEVFS19FTgkJICgxTDw8MjcpCiAjZGVmaW5lIEJOWDJfSENfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAorI2RlZmluZSBCTlgyX0hDX0NPQUxFU0NFX05PVwkJCQkweDAwMDA2OTE0CisjZGVmaW5lIEJOWDJfSENfQ09BTEVTQ0VfTk9XX0NPQUxfTk9XCQkJICgweDFmZkw8PDEpCisjZGVmaW5lIEJOWDJfSENfQ09BTEVTQ0VfTk9XX0NPQUxfTk9XX1dPX0lOVAkJICgweDFmZkw8PDExKQorI2RlZmluZSBCTlgyX0hDX0NPQUxFU0NFX05PV19DT0FMX09OX05YVF9FVkVOVAkJICgweDFmZkw8PDIxKQorCisjZGVmaW5lIEJOWDJfSENfTVNJWF9CSVRfVkVDVE9SCQkJCTB4MDAwMDY5MTgKKyNkZWZpbmUgQk5YMl9IQ19NU0lYX0JJVF9WRUNUT1JfVkFMCQkJICgweDFmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMQkJCQkweDAwMDA2YTAwCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzFfUlhfVE1SX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18xX1RYX1RNUl9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMV9DT01fVE1SX01PREUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzFfQ01EX1RNUl9NT0RFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18xX1BFUl9NT0RFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzFfT05FX1NIT1QJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMV9VU0VfSU5UX1BBUkFNCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMV9QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF8xCQkJMHgwMDAwNmEwNAorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF8xX1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF8xX0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF8xCQkJMHgwMDAwNmEwOAorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzFfVkFMVUUJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzFfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfMQkJCTB4MDAwMDZhMGMKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfMV9WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfMV9JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfMQkJCQkweDAwMDA2YTEwCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfMV9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzFfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzEJCQkJMHgwMDAwNmExNAorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzFfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU18xX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfMQkJCQkweDAwMDA2YTE4CisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzFfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfMV9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzEJCQkJMHgwMDAwNmExYworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU18xX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzFfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzEJCQkweDAwMDA2YTIwCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfMV9IQ19QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfMV9IQ19JTlRfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yCQkJCTB4MDAwMDZhMjQKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMl9SWF9UTVJfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzJfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yX0NPTV9UTVJfTU9ERQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMl9DTURfVE1SX01PREUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzJfUEVSX01PREUJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMl9PTkVfU0hPVAkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yX1VTRV9JTlRfUEFSQU0JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yX1BFUl9DT0xMRUNUX0xJTUlUCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzIJCQkweDAwMDA2YTI4CisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzJfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzJfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzIJCQkweDAwMDA2YTJjCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfMl9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfMl9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF8yCQkJMHgwMDAwNmEzMAorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF8yX1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF8yX0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU18yCQkJCTB4MDAwMDZhMzQKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU18yX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfMl9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfMgkJCQkweDAwMDA2YTM4CisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfMl9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzJfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU18yCQkJCTB4MDAwMDZhM2MKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfMl9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU18yX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfMgkJCQkweDAwMDA2YTQwCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzJfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfMl9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfMgkJCTB4MDAwMDZhNDQKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU18yX0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU18yX0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzMJCQkJMHgwMDAwNmE0OAorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18zX1JYX1RNUl9NT0RFCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfM19UWF9UTVJfTU9ERQkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzNfQ09NX1RNUl9NT0RFCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18zX0NNRF9UTVJfTU9ERQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfM19QRVJfTU9ERQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18zX09ORV9TSE9UCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzNfVVNFX0lOVF9QQVJBTQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzNfUEVSX0NPTExFQ1RfTElNSVQJCSAoMHhmTDw8MjApCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfMwkJCTB4MDAwMDZhNGMKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfM19WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfM19JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfMwkJCTB4MDAwMDZhNTAKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF8zX1ZBTFVFCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF8zX0lOVAkJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzMJCQkweDAwMDA2YTU0CisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzNfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzNfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzMJCQkJMHgwMDAwNmE1OAorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzNfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU18zX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU18zCQkJCTB4MDAwMDZhNWMKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU18zX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfM19JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzMJCQkJMHgwMDAwNmE2MAorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU18zX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzNfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU18zCQkJCTB4MDAwMDZhNjQKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfM19WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU18zX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU18zCQkJMHgwMDAwNmE2OAorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzNfSENfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzNfSENfSU5UX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNAkJCQkweDAwMDA2YTZjCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzRfUlhfVE1SX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR180X1RYX1RNUl9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNF9DT01fVE1SX01PREUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzRfQ01EX1RNUl9NT0RFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR180X1BFUl9NT0RFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzRfT05FX1NIT1QJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNF9VU0VfSU5UX1BBUkFNCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNF9QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF80CQkJMHgwMDAwNmE3MAorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF80X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF80X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF80CQkJMHgwMDAwNmE3NAorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzRfVkFMVUUJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzRfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNAkJCTB4MDAwMDZhNzgKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNF9WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNF9JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNAkJCQkweDAwMDA2YTdjCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNF9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzRfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzQJCQkJMHgwMDAwNmE4MAorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzRfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU180X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNAkJCQkweDAwMDA2YTg0CisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzRfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNF9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzQJCQkJMHgwMDAwNmE4OAorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU180X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzRfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzQJCQkweDAwMDA2YThjCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfNF9IQ19QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfNF9IQ19JTlRfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181CQkJCTB4MDAwMDZhOTAKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNV9SWF9UTVJfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzVfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181X0NPTV9UTVJfTU9ERQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNV9DTURfVE1SX01PREUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzVfUEVSX01PREUJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNV9PTkVfU0hPVAkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181X1VTRV9JTlRfUEFSQU0JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181X1BFUl9DT0xMRUNUX0xJTUlUCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzUJCQkweDAwMDA2YTk0CisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzVfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzVfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzUJCQkweDAwMDA2YTk4CisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfNV9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfNV9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF81CQkJMHgwMDAwNmE5YworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF81X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF81X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU181CQkJCTB4MDAwMDZhYTAKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU181X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNV9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfNQkJCQkweDAwMDA2YWE0CisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfNV9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzVfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU181CQkJCTB4MDAwMDZhYTgKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNV9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU181X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfNQkJCQkweDAwMDA2YWFjCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzVfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfNV9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfNQkJCTB4MDAwMDZhYjAKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU181X0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU181X0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzYJCQkJMHgwMDAwNmFiNAorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR182X1JYX1RNUl9NT0RFCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNl9UWF9UTVJfTU9ERQkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzZfQ09NX1RNUl9NT0RFCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR182X0NNRF9UTVJfTU9ERQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNl9QRVJfTU9ERQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR182X09ORV9TSE9UCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzZfVVNFX0lOVF9QQVJBTQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzZfUEVSX0NPTExFQ1RfTElNSVQJCSAoMHhmTDw8MjApCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfNgkJCTB4MDAwMDZhYjgKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfNl9WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfNl9JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfNgkJCTB4MDAwMDZhYmMKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF82X1ZBTFVFCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF82X0lOVAkJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzYJCQkweDAwMDA2YWMwCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzZfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzZfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzYJCQkJMHgwMDAwNmFjNAorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzZfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU182X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU182CQkJCTB4MDAwMDZhYzgKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU182X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfNl9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzYJCQkJMHgwMDAwNmFjYworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU182X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzZfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU182CQkJCTB4MDAwMDZhZDAKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfNl9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU182X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU182CQkJMHgwMDAwNmFkNAorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzZfSENfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzZfSENfSU5UX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNwkJCQkweDAwMDA2YWQ4CisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzdfUlhfVE1SX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR183X1RYX1RNUl9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfN19DT01fVE1SX01PREUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzdfQ01EX1RNUl9NT0RFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR183X1BFUl9NT0RFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzdfT05FX1NIT1QJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfN19VU0VfSU5UX1BBUkFNCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfN19QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF83CQkJMHgwMDAwNmFkYworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF83X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF83X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF83CQkJMHgwMDAwNmFlMAorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzdfVkFMVUUJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzdfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNwkJCTB4MDAwMDZhZTQKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfN19WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfN19JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNwkJCQkweDAwMDA2YWU4CisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfN19WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzdfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzcJCQkJMHgwMDAwNmFlYworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzdfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU183X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNwkJCQkweDAwMDA2YWYwCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzdfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfN19JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzcJCQkJMHgwMDAwNmFmNAorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU183X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzdfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzcJCQkweDAwMDA2YWY4CisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfN19IQ19QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfN19IQ19JTlRfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184CQkJCTB4MDAwMDZhZmMKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfOF9SWF9UTVJfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzhfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184X0NPTV9UTVJfTU9ERQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfOF9DTURfVE1SX01PREUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzhfUEVSX01PREUJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfOF9PTkVfU0hPVAkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184X1VTRV9JTlRfUEFSQU0JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184X1BFUl9DT0xMRUNUX0xJTUlUCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzgJCQkweDAwMDA2YjAwCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzhfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzhfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzgJCQkweDAwMDA2YjA0CisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfOF9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfOF9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF84CQkJMHgwMDAwNmIwOAorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF84X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF84X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU184CQkJCTB4MDAwMDZiMGMKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU184X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfOF9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfOAkJCQkweDAwMDA2YjEwCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfOF9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzhfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU184CQkJCTB4MDAwMDZiMTQKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfOF9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU184X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfOAkJCQkweDAwMDA2YjE4CisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzhfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfOF9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfOAkJCTB4MDAwMDZiMWMKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU184X0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU184X0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQogCiAKIC8qCkBAIC0zMDYzLDcgKzU0ODEsNyBAQAogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCi0jZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQkFEX1BDX0hBTFRFRAkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9UWFBfQ1BVX1NUQVRFX0FMSUdOX0hBTFRFRAkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9GSU9fQUJPUlRfSEFMVEVECQkgKDFMPDw4KQogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKQEAgLTMxMTEsNyArNTUyOSw3IEBACiAjZGVmaW5lIEJOWDJfVFhQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX1RYUF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDA0NTIwMAotI2RlZmluZSBCTlgyX1RYUF9GVFFfREFUQQkJCQkweDAwMDQ1M2MwCisjZGVmaW5lIEJOWDJfVFhQX1RYUFEJCQkJCTB4MDAwNDUzYzAKICNkZWZpbmUgQk5YMl9UWFBfRlRRX0NNRAkJCQkweDAwMDQ1M2Y4CiAjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DTURfT0ZGU0VUCQkJCSAoMHgzZmZMPDwwKQogI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX1dSX1RPUAkJCQkgKDFMPDwxMCkKQEAgLTMxNTgsNyArNTU3Niw3IEBACiAjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9CQURfREFUQV9BRERSX0hBTFRFRAkgKDFMPDw1KQotI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfQkFEX1BDX0hBTFRFRAkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9BTElHTl9IQUxURUQJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQpAQCAtMzIwNiw3ICs1NjI0LDcgQEAKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1JFR19GSUxFCQkJCTB4MDAwODUyMDAKLSNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9EQVRBCQkJCTB4MDAwODUzYzAKKyNkZWZpbmUgQk5YMl9UUEFUX1RQQVRRCQkJCQkweDAwMDg1M2MwCiAjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01ECQkJCTB4MDAwODUzZjgKICNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMzI1Myw3ICs1NjcxLDcgQEAKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1BBR0VfMF9EQVRBX0hBTFRFRAkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX0JBRF9EQVRBX0FERFJfSEFMVEVECQkgKDFMPDw1KQotI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEVfQkFEX3BjX0hBTFRFRAkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX0JBRF9QQ19IQUxURUQJCSAoMUw8PDYpCiAjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9BTElHTl9IQUxURUQJCQkgKDFMPDw3KQogI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1NPRlRfSEFMVEVECQkJICgxTDw8MTApCkBAIC0zMzAxLDcgKzU3MTksMjkgQEAKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFJfTEJBCQkgKDB4M2ZmZmZmZmZMPDwyKQogCiAjZGVmaW5lIEJOWDJfUlhQX0NQVV9SRUdfRklMRQkJCQkweDAwMGM1MjAwCi0jZGVmaW5lIEJOWDJfUlhQX0NGVFFfREFUQQkJCQkweDAwMGM1MzgwCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMCQkJCTB4MDAwYzUzN2MKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfSU5DX1VTQUdFX0NOVAkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkUJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzAJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV8xCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfMgkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzMJCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV80CQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfNQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzYJCQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV83CQkJICg3TDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfOAkJCSAoOEw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzkJCQkgKDlMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMAkJICgxMEw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzExCQkgKDExTDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTIJCSAoMTJMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMwkJICgxM0w8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzE0CQkgKDE0TDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTUJCSAoMTVMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfQ09VTlQJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9PRkZTRVQJCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SWFBfUlhQQ1EJCQkJCTB4MDAwYzUzODAKICNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTUQJCQkJMHgwMDBjNTNiOAogI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0zMzIyLDcgKzU3NjIsNyBAQAogI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCiAjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKIAotI2RlZmluZSBCTlgyX1JYUF9GVFFfREFUQQkJCQkweDAwMGM1M2MwCisjZGVmaW5lIEJOWDJfUlhQX1JYUFEJCQkJCTB4MDAwYzUzYzAKICNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRAkJCQkweDAwMGM1M2Y4CiAjZGVmaW5lIEJOWDJfUlhQX0ZUUV9DTURfT0ZGU0VUCQkJCSAoMHgzZmZMPDwwKQogI2RlZmluZSBCTlgyX1JYUF9GVFFfQ01EX1dSX1RPUAkJCQkgKDFMPDwxMCkKQEAgLTMzNTAsNiArNTc5MCwxMCBAQAogICogIGNvbV9yZWcgZGVmaW5pdGlvbgogICogIG9mZnNldDogMHgxMDAwMDAKICAqLworI2RlZmluZSBCTlgyX0NPTV9DS1NVTV9FUlJPUl9TVEFUVVMJCQkweDAwMTAwMDAwCisjZGVmaW5lIEJOWDJfQ09NX0NLU1VNX0VSUk9SX1NUQVRVU19DQUxDVUxBVEVECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NLU1VNX0VSUk9SX1NUQVRVU19FWFBFQ1RFRAkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX0NPTV9DUFVfTU9ERQkJCQkweDAwMTA1MDAwCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX0xPQ0FMX1JTVAkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX1NURVBfRU5BCQkJICgxTDw8MSkKQEAgLTMzNjksNyArNTgxMyw3IEBACiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9QQUdFXzBfREFUQV9IQUxURUQJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9QQUdFXzBfSU5TVF9IQUxURUQJCSAoMUw8PDQpCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9CQURfREFUQV9BRERSX0hBTFRFRAkJICgxTDw8NSkKLSNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9CQURfUENfSEFMVEVECQkgKDFMPDw2KQogI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFX0ZJT19BQk9SVF9IQUxURUQJCSAoMUw8PDgpCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQpAQCAtMzQxNyw3ICs1ODYxLDI5IEBACiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX0NPTV9DUFVfUkVHX0ZJTEUJCQkJMHgwMDEwNTIwMAotI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfREFUQQkJCQkweDAwMTA1MzQwCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMCQkJMHgwMDEwNTJiYworI2RlZmluZSBCTlgyX0NPTV9DT01UUV9QRkVfUEZFX0NUTF9JTkNfVVNBR0VfQ05UCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzAJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzEJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzIJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzMJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzQJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzUJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzYJCSAoNkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzcJCSAoN0w8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzgJCSAoOEw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzkJCSAoOUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzEwCQkgKDEwTDw8NCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTEJCSAoMTFMPDw0KQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMgkJICgxMkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzEzCQkgKDEzTDw8NCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTQJCSAoMTRMPDw0KQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xNQkJICgxNUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9DT1VOVAkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfUEZFX1BGRV9DVExfT0ZGU0VUCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFEJCQkJCTB4MDAxMDUzNDAKICNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRAkJCQkweDAwMTA1Mzc4CiAjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0zNDM4LDcgKzU5MDQsNyBAQAogI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ1RMX01BWF9ERVBUSAkJICgweDNmZkw8PDEyKQogI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ1RMX0NVUl9ERVBUSAkJICgweDNmZkw8PDIyKQogCi0jZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9EQVRBCQkJCTB4MDAxMDUzODAKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFEJCQkJCTB4MDAxMDUzODAKICNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRAkJCQkweDAwMTA1M2I4CiAjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0zNDU5LDcgKzU5MjUsNyBAQAogI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ1RMX01BWF9ERVBUSAkJICgweDNmZkw8PDEyKQogI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ1RMX0NVUl9ERVBUSAkJICgweDNmZkw8PDIyKQogCi0jZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0RBVEEJCQkJMHgwMDEwNTNjMAorI2RlZmluZSBCTlgyX0NPTV9DT01RCQkJCQkweDAwMTA1M2MwCiAjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NNRAkJCQkweDAwMTA1M2Y4CiAjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMzQ4OSw2ICs1OTU1LDEwIEBACiAgKiAgY3BfcmVnIGRlZmluaXRpb24KICAqICBvZmZzZXQ6IDB4MTgwMDAwCiAgKi8KKyNkZWZpbmUgQk5YMl9DUF9DS1NVTV9FUlJPUl9TVEFUVVMJCQkweDAwMTgwMDAwCisjZGVmaW5lIEJOWDJfQ1BfQ0tTVU1fRVJST1JfU1RBVFVTX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DUF9DS1NVTV9FUlJPUl9TVEFUVVNfRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERQkJCQkweDAwMTg1MDAwCiAjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfTE9DQUxfUlNUCQkJICgxTDw8MCkKICNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERV9TVEVQX0VOQQkJCSAoMUw8PDEpCkBAIC0zNTA4LDcgKzU5NzgsNyBAQAogI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9QQUdFXzBfREFUQV9IQUxURUQJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCi0jZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9CQURfUENfSEFMVEVECQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKQEAgLTM1NTYsNyArNjAyNiwyOSBAQAogI2RlZmluZSBCTlgyX0NQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX0NQX0NQVV9SRUdfRklMRQkJCQkweDAwMTg1MjAwCi0jZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9EQVRBCQkJCTB4MDAxODUzYzAKKyNkZWZpbmUgQk5YMl9DUF9DUFFfUEZFX1BGRV9DVEwJCQkJMHgwMDE4NTNiYworI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9JTkNfVVNBR0VfQ05UCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRQkJICgweGZMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8wCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8yCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8zCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV80CQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV81CQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV82CQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV83CQkgKDdMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV84CQkgKDhMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV85CQkgKDlMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMAkJICgxMEw8PDQpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzExCQkgKDExTDw8NCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTIJCSAoMTJMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMwkJICgxM0w8PDQpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzE0CQkgKDE0TDw8NCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTUJCSAoMTVMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfQ09VTlQJCSAoMHhmTDw8MTIpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX1BGRV9QRkVfQ1RMX09GRlNFVAkJCSAoMHgxZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0NQX0NQUQkJCQkJMHgwMDE4NTNjMAogI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01ECQkJCTB4MDAxODUzZjgKICNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKQEAgLTM1ODQsNiArNjA3Niw1OSBAQAogICogIG1jcF9yZWcgZGVmaW5pdGlvbgogICogIG9mZnNldDogMHgxNDAwMDAKICAqLworI2RlZmluZSBCTlgyX01DUF9NQ1BfQ09OVFJPTAkJCQkweDAwMTQwMDgwCisjZGVmaW5lIEJOWDJfTUNQX01DUF9DT05UUk9MX1NNQlVTX1NFTAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01DUF9NQ1BfQ09OVFJPTF9NQ1BfSVNPTEFURQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0FUVEVOVElPTl9TVEFUVVMJCQkweDAwMTQwMDg0CisjZGVmaW5lIEJOWDJfTUNQX01DUF9BVFRFTlRJT05fU1RBVFVTX0RSVl9ET09SQkVMTAkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0FUVEVOVElPTl9TVEFUVVNfV0FUQ0hET0dfVElNRU9VVAkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0FUVEVOVElPTl9TVEFUVVNfQ1BVX0VWRU5UCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9NQ1BfSEVBUlRCRUFUX0NPTlRST0wJCQkweDAwMTQwMDg4CisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfQ09OVFJPTF9NQ1BfSEVBUlRCRUFUX0VOQUJMRQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9NQ1BfSEVBUlRCRUFUX1NUQVRVUwkJCTB4MDAxNDAwOGMKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0hFQVJUQkVBVF9TVEFUVVNfTUNQX0hFQVJUQkVBVF9QRVJJT0QJICgweDdmZkw8PDApCisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfU1RBVFVTX1ZBTElECQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9NQ1BfSEVBUlRCRUFUCQkJCTB4MDAxNDAwOTAKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0hFQVJUQkVBVF9NQ1BfSEVBUlRCRUFUX0NPVU5UCSAoMHgzZmZmZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfTUNQX0hFQVJUQkVBVF9JTkMJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfTUNQX0hFQVJUQkVBVF9SRVNFVAkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19SRVNFVAkJCQkweDAwMTQwMDk0CisjZGVmaW5lIEJOWDJfTUNQX1dBVENIRE9HX1JFU0VUX1dBVENIRE9HX1JFU0VUCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MCQkJMHgwMDE0MDA5OAorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX1dBVENIRE9HX1RJTUVPVVQJICgweGZmZmZmZmZMPDwwKQorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX1dBVENIRE9HX0FUVE4JCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX01DUF9SU1RfRU5BQkxFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX1dBVENIRE9HX0VOQUJMRQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9BQ0NFU1NfTE9DSwkJCQkweDAwMTQwMDljCisjZGVmaW5lIEJOWDJfTUNQX0FDQ0VTU19MT0NLX0xPQ0sJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9UT0VfSUQJCQkJCTB4MDAxNDAwYTAKKyNkZWZpbmUgQk5YMl9NQ1BfVE9FX0lEX0ZVTkNUSU9OX0lECQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NQ1BfTUFJTEJPWF9DRkcJCQkJMHgwMDE0MDBhNAorI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19NQUlMQk9YX09GRlNFVAkJICgweDNmZmZMPDwwKQorI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19NQUlMQk9YX1NJWkUJCSAoMHhmZmZMPDwyMCkKKworI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19PVEhFUl9GVU5DCQkJMHgwMDE0MDBhOAorI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19PVEhFUl9GVU5DX01BSUxCT1hfT0ZGU0VUCSAoMHgzZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NQ1BfTUFJTEJPWF9DRkdfT1RIRVJfRlVOQ19NQUlMQk9YX1NJWkUJICgweGZmZkw8PDIwKQorCisjZGVmaW5lIEJOWDJfTUNQX01DUF9ET09SQkVMTAkJCQkweDAwMTQwMGFjCisjZGVmaW5lIEJOWDJfTUNQX01DUF9ET09SQkVMTF9NQ1BfRE9PUkJFTEwJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfTUNQX0RSSVZFUl9ET09SQkVMTAkJCTB4MDAxNDAwYjAKKyNkZWZpbmUgQk5YMl9NQ1BfRFJJVkVSX0RPT1JCRUxMX0RSSVZFUl9ET09SQkVMTAkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9EUklWRVJfRE9PUkJFTExfT1RIRVJfRlVOQwkJMHgwMDE0MDBiNAorI2RlZmluZSBCTlgyX01DUF9EUklWRVJfRE9PUkJFTExfT1RIRVJfRlVOQ19EUklWRVJfRE9PUkJFTEwJICgxTDw8MzEpCisKICNkZWZpbmUgQk5YMl9NQ1BfQ1BVX01PREUJCQkJMHgwMDE0NTAwMAogI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9MT0NBTF9SU1QJCQkgKDFMPDwwKQogI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9TVEVQX0VOQQkJCSAoMUw8PDEpCkBAIC0zNjAzLDcgKzYxNDgsNyBAQAogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCi0jZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfQkFEX1BDX0hBTFRFRAkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0FMSUdOX0hBTFRFRAkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURV9GSU9fQUJPUlRfSEFMVEVECQkgKDFMPDw4KQogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKQEAgLTM2NTEsNyArNjE5Niw3IEBACiAjZGVmaW5lIEJOWDJfTUNQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX01DUF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDE0NTIwMAotI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9EQVRBCQkJCTB4MDAxNDUzYzAKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUQkJCQkJMHgwMDE0NTNjMAogI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTUQJCQkJMHgwMDE0NTNmOAogI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfTUNQX01DUFFfRlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKQEAgLTM2OTYsNiArNjI0MSw4IEBACiAKIC8qIDU3MDggU2VyZGVzIFBIWSByZWdpc3RlcnMgKi8KIAorI2RlZmluZSBCQ001NzA4U19CTUNSX0ZPUkNFXzI1MDAJCTB4MjAKKwogI2RlZmluZSBCQ001NzA4U19VUDEJCQkJMHhiCiAKICNkZWZpbmUgQkNNNTcwOFNfVVAxXzJHNQkJCTB4MQpAQCAtMzgwNCw2ICs2MzUxLDcgQEAKICNkZWZpbmUgSU5WQUxJRF9DSURfQUREUiAgICAgICAgICAgIDB4ZmZmZmZmZmYKIAogI2RlZmluZSBUWF9DSUQJCTE2CisjZGVmaW5lIFRYX1RTU19DSUQJMzIKICNkZWZpbmUgUlhfQ0lECQkwCiAKICNkZWZpbmUgTUJfVFhfQ0lEX0FERFIJTUJfR0VUX0NJRF9BRERSKFRYX0NJRCkKQEAgLTM4ODksNiArNjQzNyw4IEBACiAKIAl1MzIJCXR4X3Byb2RfYnNlcSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKSkpOwogCXUxNgkJdHhfcHJvZDsKKwl1MzIJCXR4X2JpZHhfYWRkcjsKKwl1MzIJCXR4X2JzZXFfYWRkcjsKIAogCXUxNgkJdHhfY29ucyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKSkpOwogCXUxNgkJaHdfdHhfY29uczsKQEAgLTM5NDUsNiArNjQ5NSw3IEBACiAjZGVmaW5lIENISVBfTlVNKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweGZmZmYwMDAwKQogI2RlZmluZSBDSElQX05VTV81NzA2CQkJMHg1NzA2MDAwMAogI2RlZmluZSBDSElQX05VTV81NzA4CQkJMHg1NzA4MDAwMAorI2RlZmluZSBDSElQX05VTV81NzA5CQkJMHg1NzA5MDAwMAogCiAjZGVmaW5lIENISVBfUkVWKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweDAwMDBmMDAwKQogI2RlZmluZSBDSElQX1JFVl9BeAkJCTB4MDAwMDAwMDAKQEAgLTQwMDcsNiArNjU1OCwxMCBAQAogCXN0cnVjdCBzdGF0aXN0aWNzX2Jsb2NrCSpzdGF0c19ibGs7CiAJZG1hX2FkZHJfdAkJc3RhdHNfYmxrX21hcHBpbmc7CiAKKwlpbnQJCQljdHhfcGFnZXM7CisJdm9pZAkJCSpjdHhfYmxrWzRdOworCWRtYV9hZGRyX3QJCWN0eF9ibGtfbWFwcGluZ1s0XTsKKwogCXUzMgkJCWhjX2NtZDsKIAl1MzIJCQlyeF9tb2RlOwogCkBAIC00MDM4LDYgKzY1OTMsNyBAQAogCiAJdTgJCQlzZXJkZXNfYW5fcGVuZGluZzsKICNkZWZpbmUgU0VSREVTX0FOX1RJTUVPVVQJKEhaIC8gMykKKyNkZWZpbmUgU0VSREVTX0ZPUkNFRF9USU1FT1VUCShIWiAvIDEwKQogCiAJdTgJCQltYWNfYWRkcls4XTsKIApAQCAtNDEwNCw0MSArNjY2MCw0MyBAQAogfTsKIAogc3RydWN0IGZ3X2luZm8gewotCXUzMiB2ZXJfbWFqb3I7Ci0JdTMyIHZlcl9taW5vcjsKLQl1MzIgdmVyX2ZpeDsKKwljb25zdCB1MzIgdmVyX21ham9yOworCWNvbnN0IHUzMiB2ZXJfbWlub3I7CisJY29uc3QgdTMyIHZlcl9maXg7CiAKLQl1MzIgc3RhcnRfYWRkcjsKKwljb25zdCB1MzIgc3RhcnRfYWRkcjsKIAogCS8qIFRleHQgc2VjdGlvbi4gKi8KLQl1MzIgdGV4dF9hZGRyOwotCXUzMiB0ZXh0X2xlbjsKLQl1MzIgdGV4dF9pbmRleDsKKwljb25zdCB1MzIgdGV4dF9hZGRyOworCWNvbnN0IHUzMiB0ZXh0X2xlbjsKKwljb25zdCB1MzIgdGV4dF9pbmRleDsKIAl1MzIgKnRleHQ7CisJdTggKmd6X3RleHQ7CisJY29uc3QgdTMyIGd6X3RleHRfbGVuOwogCiAJLyogRGF0YSBzZWN0aW9uLiAqLwotCXUzMiBkYXRhX2FkZHI7Ci0JdTMyIGRhdGFfbGVuOwotCXUzMiBkYXRhX2luZGV4OwotCXUzMiAqZGF0YTsKKwljb25zdCB1MzIgZGF0YV9hZGRyOworCWNvbnN0IHUzMiBkYXRhX2xlbjsKKwljb25zdCB1MzIgZGF0YV9pbmRleDsKKwljb25zdCB1MzIgKmRhdGE7CiAKIAkvKiBTQlNTIHNlY3Rpb24uICovCi0JdTMyIHNic3NfYWRkcjsKLQl1MzIgc2Jzc19sZW47Ci0JdTMyIHNic3NfaW5kZXg7Ci0JdTMyICpzYnNzOworCWNvbnN0IHUzMiBzYnNzX2FkZHI7CisJY29uc3QgdTMyIHNic3NfbGVuOworCWNvbnN0IHUzMiBzYnNzX2luZGV4OworCWNvbnN0IHUzMiAqc2JzczsKIAogCS8qIEJTUyBzZWN0aW9uLiAqLwotCXUzMiBic3NfYWRkcjsKLQl1MzIgYnNzX2xlbjsKLQl1MzIgYnNzX2luZGV4OwotCXUzMiAqYnNzOworCWNvbnN0IHUzMiBic3NfYWRkcjsKKwljb25zdCB1MzIgYnNzX2xlbjsKKwljb25zdCB1MzIgYnNzX2luZGV4OworCWNvbnN0IHUzMiAqYnNzOwogCiAJLyogUmVhZC1vbmx5IHNlY3Rpb24uICovCi0JdTMyIHJvZGF0YV9hZGRyOwotCXUzMiByb2RhdGFfbGVuOwotCXUzMiByb2RhdGFfaW5kZXg7Ci0JdTMyICpyb2RhdGE7CisJY29uc3QgdTMyIHJvZGF0YV9hZGRyOworCWNvbnN0IHUzMiByb2RhdGFfbGVuOworCWNvbnN0IHUzMiByb2RhdGFfaW5kZXg7CisJY29uc3QgdTMyICpyb2RhdGE7CiB9OwogCiAjZGVmaW5lIFJWMlBfUFJPQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyX2Z3LmggYi9kcml2ZXJzL25ldC9ibngyX2Z3LmgKaW5kZXggMmQ3NTNkYy4uMjFkMzY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Ml9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJfZncuaApAQCAtMTQsMjAgKzE0LDYgQEAKICAqIGFjY29tcGFueWluZyBpdC4KICAqLwogCi1zdGF0aWMgY29uc3QgaW50IGJueDJfQ09NX2IwNkZ3UmVsZWFzZU1ham9yID0gMHgxOwotc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndSZWxlYXNlRml4ID0gMHgwOwotc3RhdGljIGNvbnN0IHUzMiBibngyX0NPTV9iMDZGd1N0YXJ0QWRkciA9IDB4MDgwMDA4YjQ7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwMDAwOwotc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd1RleHRMZW4gPSAweDU3YmM7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3RGF0YUFkZHIgPSAweDA4MDA1ODQwOwotc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd0RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDgwMDU3YzA7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfQ09NX2IwNkZ3Um9kYXRhTGVuID0gMHg1ODsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9DT01fYjA2RndCc3NBZGRyID0gMHgwODAwNTg2MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndCc3NMZW4gPSAweDg4Owotc3RhdGljIGNvbnN0IHUzMiBibngyX0NPTV9iMDZGd1Nic3NBZGRyID0gMHgwODAwNTg0MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndTYnNzTGVuID0gMHgxYzsKIHN0YXRpYyB1OCBibngyX0NPTV9iMDZGd1RleHRbXSA9IHsKIAkweDFmLCAweDhiLCAweDA4LCAweDA4LCAweDA5LCAweDgzLCAweDQxLCAweDQ0LCAweDAwLCAweDAzLCAweDc0LCAweDY1LAogCTB4NzMsIDB4NzQsIDB4MzEsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmUsIDB4MDAsIDB4ZWMsIDB4NWIsIDB4N2QsIDB4NmMsCkBAIC02NzMsMzg5ICs2NTksNzUyIEBACiBzdGF0aWMgdTMyIGJueDJfQ09NX2IwNkZ3QnNzWygweDg4LzQpICsgMV0gPSB7IDB4MCB9Owogc3RhdGljIHUzMiBibngyX0NPTV9iMDZGd1Nic3NbKDB4MWMvNCkgKyAxXSA9IHsgMHgwIH07CiAKLXN0YXRpYyBpbnQgYm54Ml9SWFBfYjA2RndSZWxlYXNlTWFqb3IgPSAweDE7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3UmVsZWFzZU1pbm9yID0gMHgwOwotc3RhdGljIGludCBibngyX1JYUF9iMDZGd1JlbGVhc2VGaXggPSAweDA7Ci1zdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3U3RhcnRBZGRyID0gMHgwODAwMzE4NDsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndUZXh0QWRkciA9IDB4MDgwMDAwMDA7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3VGV4dExlbiA9IDB4NTg4YzsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndEYXRhQWRkciA9IDB4MDgwMDU4ZTA7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3RGF0YUxlbiA9IDB4MDsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndSb2RhdGFBZGRyID0gMHgwODAwNTg5MDsKLXN0YXRpYyBpbnQgYm54Ml9SWFBfYjA2RndSb2RhdGFMZW4gPSAweDI4Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd0Jzc0FkZHIgPSAweDA4MDA1OTAwOwotc3RhdGljIGludCBibngyX1JYUF9iMDZGd0Jzc0xlbiA9IDB4MTNhNDsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndTYnNzQWRkciA9IDB4MDgwMDU4ZTA7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3U2Jzc0xlbiA9IDB4MWM7CitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9jb21fZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDA4YjQsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAorCS50ZXh0X2xlbgkJCT0gMHg1N2JjLAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfQ09NX2IwNkZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX0NPTV9iMDZGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNTg0MCwKKwkuZGF0YV9sZW4JCQk9IDB4MCwKKwkuZGF0YV9pbmRleAkJCT0gMHgwLAorCS5kYXRhCQkJCT0gYm54Ml9DT01fYjA2RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNTg0MCwKKwkuc2Jzc19sZW4JCQk9IDB4MWMsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfQ09NX2IwNkZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwNTg2MCwKKwkuYnNzX2xlbgkJCT0gMHg4OCwKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfQ09NX2IwNkZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA1N2MwLAorCS5yb2RhdGFfbGVuCQkJPSAweDU4LAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9DT01fYjA2RndSb2RhdGEsCit9OworCiBzdGF0aWMgdTggYm54Ml9SWFBfYjA2RndUZXh0W10gPSB7Ci0JMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHgwNywgMHg4NywgMHg0MSwgMHg0NCwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKLQkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGVkLCAweDVjLCAweDVkLCAweDZjLAotCTB4MWMsIDB4ZDcsIDB4NzUsIDB4M2UsIDB4ZjMsIDB4NDMsIDB4NzEsIDB4NDksIDB4OTEsIDB4ZDQsIDB4NzAsIDB4YjksCi0JMHg2MiwgMHg1NywgMHgxMiwgMHg2NSwgMHhlZCwgMHg4YSwgMHg0MywgMHg3MSwgMHg2ZCwgMHgzMSwgMHhjZSwgMHg1MCwKLQkweDU4LCAweGRiLCAweDgyLCAweGIxLCAweDQ4LCAweGM3LCAweGIzLCAweGE0LCAweGM4LCAweDI0LCAweDAyLCAweDQyLAotCTB4MWIsIDB4NDIsIDB4YWIsIDB4YTQsIDB4YTksIDB4YzEsIDB4OTAsIDB4NzIsIDB4OTEsIDB4MjIsIDB4MmMsIDB4YTAsCi0JMHgxYSwgMHg3OSwgMHhmMCwgMHg0MywgMHgxMCwgMHgyZiwgMHg1NiwgMHgzZiwgMHhhNiwgMHhkMSwgMHg4ZCwgMHg5NiwKLQkweGI2LCAweDFjLCAweDUzLCAweDA4LCAweDgyLCAweDgyLCAweGU1LCAweDUyLCAweDUyLCAweDBiLCAweDJjLCAweGI0LAotCTB4OTYsIDB4ZWQsIDB4MzYsIDB4N2UsIDB4YTgsIDB4MjMsIDB4OWEsIDB4OTIsIDB4OGQsIDB4YTYsIDB4NjgsIDB4ODEsCi0JMHgyMiwgMHhhZCwgMHhkMSwgMHhmNCwgMHg0ZCwgMHg5NSwgMHg5YSwgMHg0YSwgMHg3NSwgMHg1ZiwgMHhkNCwgMHhhMiwKLQkweDQ4LCAweGRhLCAweDQ2LCAweGNkLCAweGY0LCAweGZiLCAweGVlLCAweGNjLCAweDg4LCAweGQ0LCAweDlhLCAweGIyLAotCTB4MmMsIDB4M2IsIDB4MGQsIDB4NjIsIDB4NzQsIDB4MGUsIDB4MzAsIDB4ZDgsIDB4YjksIDB4N2YsIDB4ZTcsIDB4ZWYsCi0JMHg5ZSwgMHg3MywgMHhlZSwgMHgzOSwgMHg3NywgMHgyOCwgMHg3ZCwgMHhhNSwgMHg0MywgMHhkYSwgMHgyNSwgMHg4NCwKLQkweDRlLCAweDNjLCAweDk5LCAweGMzLCAweGNmLCAweDNjLCAweGZkLCAweGUwLCAweGMzLCAweDBmLCAweGVlLCAweGMxLAotCTB4ZWIsIDB4YjAsIDB4YTEsIDB4NmQsIDB4ZDAsIDB4YTMsIDB4ZmUsIDB4MTgsIDB4NjIsIDB4ODgsIDB4MjEsIDB4ODYsCi0JMHgxOCwgMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwKLQkweDg4LCAweDIxLCAweDg2LCAweDE4LCAweDYyLCAweDg4LCAweDIxLCAweDg2LCAweDE4LCAweDYyLCAweDg4LCAweDIxLAotCTB4ODYsIDB4MTgsIDB4NjIsIDB4ODgsIDB4MjEsIDB4ODYsIDB4MTgsIDB4NjIsIDB4ODgsIDB4MjEsIDB4ODYsIDB4MTgsCi0JMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwgMHg4OCwKLQkweDIxLCAweDg2LCAweDE4LCAweDYyLCAweDg4LCAweDIxLCAweDg2LCAweGZmLCAweGVmLCAweDYwLCAweDg4LCAweDU4LAotCTB4ZmMsIDB4ZWQsIDB4MGMsIDB4MWYsIDB4NDksIDB4ZTgsIDB4ODUsIDB4Y2IsIDB4MDcsIDB4M2QsIDB4NWIsIDB4MTIsCi0JMHg0NiwgMHg2MSwgMHg2OSwgMHg2NiwgMHhkYSwgMHgxNiwgMHg3MSwgMHhlYiwgMHhiYiwgMHgzMywgMHg0NSwgMHhmOSwKLQkweDFmLCAweGJmLCAweDk0LCAweDMyLCAweDg1LCAweGZkLCAweGRiLCAweDBiLCAweDM3LCAweDlmLCAweDdkLCAweGYzLAotCTB4OTEsIDB4ZWMsIDB4OGQsIDB4MDUsIDB4NDMsIDB4MTIsIDB4NTYsIDB4ZTEsIDB4ZTgsIDB4YjAsIDB4YjUsIDB4NGIsCi0JMHgxMiwgMHg3ZCwgMHg1OCwgMHhmMywgMHhkZCwgMHhjMSwgMHhjZiwgMHg1OSwgMHhkMiwgMHgxNSwgMHhlMSwgMHhiYSwKLQkweGVlLCAweGJmLCAweDM5LCAweDY4LCAweGM5LCAweDJiLCAweDhkLCAweDk0LCAweDVjLCAweDY4LCAweDZjLCAweGRmLAotCTB4MjQsIDB4NWQsIDB4ZDksIDB4NTIsIDB4MDksIDB4ZmQsIDB4NmUsIDB4OGEsIDB4ZTMsIDB4OTYsIDB4OTQsIDB4YWIsCi0JMHgyZCwgMHhlMiwgMHgyYSwgMHhiYSwgMHg3ZCwgMHg1YSwgMHg3MSwgMHhmZSwgMHgzZSwgMHhjZCwgMHg5YiwgMHg3ZiwKLQkweDllLCAweGZmLCAweDFlLCAweDI0LCAweGE1LCAweGNiLCAweDdkLCAweDY4LCAweGY3LCAweGExLCAweGNkLCAweGY3LAotCTB4ODEsIDB4ZjQsIDB4OTQsIDB4OTgsIDB4NzIsIDB4YTQsIDB4OTEsIDB4OTAsIDB4YTMsIDB4ZDUsIDB4OGMsIDB4ZTgsCi0JMHgwNSwgMHg3MSwgMHhiZCwgMHhiYywgMHg5ZCwgMHgyZSwgMHhhMywgMHg2ZiwgMHhlYSwgMHgwMCwgMHhkYiwgMHgyOSwKLQkweGUwLCAweGY5LCAweDBlLCAweGQ3LCAweDU5LCAweDVlLCAweDVlLCAweDRhLCAweGI3LCAweGM2LCAweDE0LCAweDBkLAotCTB4OGUsIDB4YjEsIDB4MGYsIDB4YmYsIDB4NTgsIDB4NWYsIDB4YWUsIDB4NzYsIDB4MDAsIDB4NmYsIDB4ZDYsIDB4NzEsCi0JMHg0MSwgMHhkYywgMHg3MywgMHgyYywgMHhkMCwgMHhmNiwgMHhmZCwgMHhkZiwgMHg3NSwgMHgzMiwgMHhiMiwgMHhlMiwKLQkweDc0LCAweDgxLCAweGE3LCAweDE2LCAweDY5LCAweGI1LCAweGM1LCAweGQyLCAweDBiLCAweGI2LCAweGI1LCAweDIyLAotCTB4NmQsIDB4MWMsIDB4ZWIsIDB4MzQsIDB4MGEsIDB4YmUsIDB4M2YsIDB4OWQsIDB4OTcsIDB4YWUsIDB4YTAsIDB4NmYsCi0JMHhiNywgMHhlMiwgMHg2MywgMHg3MiwgMHg0MiwgMHhjMywgMHhiYywgMHg1NywgMHg0OSwgMHgwZiwgMHgzYSwgMHhlMiwKLQkweDNiLCAweDdmLCAweGYzLCAweDUyLCAweGFjLCAweDZjLCAweDk3LCAweGM5LCAweDU0LCAweGY2LCAweGEwLCAweDFiLAotCTB4ZDAsIDB4NzQsIDB4M2QsIDB4NjcsIDB4MmIsIDB4NzAsIDB4NmEsIDB4ZTAsIDB4NGYsIDB4ZGIsIDB4ODEsIDB4ZjUsCi0JMHhlZSwgMHgwYSwgMHg2OCwgMHgxYSwgMHg4NSwgMHhjZCwgMHg2MiwgMHg2YywgMHg2NiwgMHg5ZiwgMHhlOCwgMHgzYiwKLQkweDg3LCAweDkzLCAweGUxLCAweDc4LCAweDk3LCAweDM2LCAweDMyLCAweDZmLCAweDg4LCAweDZlLCAweGZmLCAweDgxLAotCTB4ZTYsIDB4ZDUsIDB4N2EsIDB4ZTUsIDB4ZDgsIDB4YmMsIDB4OGUsIDB4NzcsIDB4NWQsIDB4YWUsIDB4ZTYsIDB4NGIsCi0JMHg5YSwgMHhkYiwgMHhhOCwgMHg2OCwgMHhkZSwgMHhkOSwgMHg1OSwgMHhhZCwgMHg3OCwgMHhkNiwgMHg5NCwgMHhhMywKLQkweGI2LCAweDdmLCAweGUxLCAweGI0LCAweDczLCAweDQyLCAweDFiLCAweDM5LCAweDdiLCAweDQ2LCAweDFiLCAweDNkLAotCTB4ZmIsIDB4ODYsIDB4MzYsIDB4ZGUsIDB4ZDgsIDB4YjIsIDB4NDksIDB4ZGEsIDB4YjMsIDB4ZDAsIDB4MWUsIDB4NzEsCi0JMHg5MCwgMHhiZiwgMHg0ZiwgMHg4NywgMHhiYSwgMHhlYywgMHhhMiwgMHhkZSwgMHg0YSwgMHhlNCwgMHg3ZCwgMHg5ZiwKLQkweGYzLCAweDg2LCAweGU2LCAweDU1LCAweDZkLCAweDhiLCAweGZiLCAweGU2LCAweGE2LCAweDIyLCAweDFhLCAweGVkLAotCTB4NzIsIDB4NzQsIDB4ZGUsIDB4OTQsIDB4NjMsIDB4ZDUsIDB4OTQsIDB4M2MsIDB4NTcsIDB4MmQsIDB4MjksIDB4NWEsCi0JMHg4NiwgMHg1ZCwgMHhkMiwgMHhiYywgMHgwNiwgMHhjNywgMHgyYiwgMHhhMCwgMHg3NSwgMHg0MiwgMHhkYiwgMHgwNywKLQkweDlhLCAweGRlLCAweDU5LCAweDI5LCAweDVkLCAweDcxLCAweGU2LCAweDQwLCAweGFmLCAweDAzLCAweDc4LCAweGZmLAotCTB4NTgsIDB4MWIsIDB4NmQsIDB4ZjQsIDB4NmEsIDB4ZGUsIDB4YzksIDB4OWIsIDB4ZTIsIDB4MzksIDB4NTksIDB4ZWIsCi0JMHg0YiwgMHg2MiwgMHhiYSwgMHhiMCwgMHgwMSwgMHhjOCwgMHgwYywgMHhmZCwgMHgzOCwgMHhkMCwgMHg0OSwgMHhjYSwKLQkweGY3LCAweGY1LCAweDgyLCAweGZmLCAweDJjLCAweDc0LCAweDZmLCAweDVkLCAweGExLCAweGZjLCAweDhkLCAweDVlLAotCTB4MjksIDB4Y2YsIDB4NTMsIDB4ZDcsIDB4YTYsIDB4MzYsIDB4NTIsIDB4ZjUsIDB4MmYsIDB4NzgsIDB4OGUsIDB4ZjQsCi0JMHgxOSwgMHhlMiwgMHhmYiwgMHg0NywgMHg5ZCwgMHg4MSwgMHhmNCwgMHgyMSwgMHgzOSwgMHgwMywgMHhkYywgMHg3NSwKLQkweGFkLCAweGQ4LCAweGEwLCAweGFlLCAweGMxLCAweGRmLCAweDJkLCAweDM5LCAweDAyLCAweGJkLCAweDE1LCAweDlkLAotCTB4NWUsIDB4OTksIDB4YjQsIDB4YjIsIDB4MmUsIDB4ZjYsIDB4NjgsIDB4NTMsIDB4MjAsIDB4NTcsIDB4MzIsIDB4YjQsCi0JMHgxNywgMHhkMiwgMHhlNywgMHhkZSwgMHg2NywgMHhkMywgMHg5ZSwgMHhhMSwgMHhjYiwgMHg1MywgMHgyZiwgMHgzZCwKLQkweGRmLCAweGIzLCAweDM4LCAweGI0LCAweDkxLCAweDMyLCAweDQzLCAweGZmLCAweGYyLCAweDQ1LCAweGNmLCAweGY2LAotCTB4YjYsIDB4YjQsIDB4NDgsIDB4MjksIDB4NmQsIDB4NDgsIDB4MTYsIDB4ZmIsIDB4YjQsIDB4NDMsIDB4NGUsIDB4M2IsCi0JMHgyMiwgMHg4NywgMHgyYSwgMHhkMCwgMHg4ZCwgMHg2ZCwgMHg1YSwgMHg4YiwgMHg2MiwgMHg2NywgMHhjYSwgMHgzMiwKLQkweDUwLCAweDMyLCAweDc1LCAweDc0LCAweDI2LCAweDQ5LCAweDk3LCAweDNhLCAweGQyLCAweGU1LCAweDdhLCAweDllLAotCTB4N2EsIDB4YTIsIDB4M2QsIDB4N2YsIDB4MjgsIDB4NWQsIDB4NjksIDB4YWIsIDB4YmEsIDB4NWEsIDB4ZDUsIDB4ZDMsCi0JMHhmOCwgMHgyZiwgMHg1ZCwgMHg0ZiwgMHhkNCwgMHhjOSwgMHg3MiwgMHgyOCwgMHhiNywgMHgwMywgMHhkYywgMHg4ZiwKLQkweDQwLCAweDVmLCAweGUyLCAweGVhLCAweGMzLCAweDBmLCAweGIxLCAweDZmLCAweDkzLCAweDUxLCAweGIwLCAweGQzLAotCTB4MTcsIDB4NjEsIDB4MTQsIDB4N2EsIDB4NjEsIDB4MzcsIDB4NjQsIDB4MTksIDB4YTYsIDB4ZWUsIDB4ZTAsIDB4YzMsCi0JMHgxZiwgMHg0OSwgMHg1ZSwgMHhmOSwgMHhkNSwgMHg5MCwgMHg5NywgMHhmYywgMHhkYiwgMHgzMiwgMHg1NSwgMHg0OSwKLQkweDgwLCAweDA2LCAweDY1LCAweGQ0LCAweGU1LCAweGJkLCAweDdjLCAweDY0LCAweDFiLCAweDdiLCAweDIwLCAweDVmLAotCTB4NWUsIDB4YTYsIDB4YmUsIDB4NDUsIDB4N2YsIDB4YTIsIDB4ZmQsIDB4ZjMsIDB4OWQsIDB4YjIsIDB4ZmUsIDB4Y2MsCi0JMHhiZiwgMHhlZSwgMHg3YywgMHg5MiwgMHhmNiwgMHg5NiwgMHg3YywgMHgyNywgMHhlNCwgMHg3OCwgMHgzNSwgMHhjOSwKLQkweDNkLCAweGQ0LCAweDU2LCAweDU0LCAweDZjLCAweDhhLCAweDY0LCAweDE0LCAweGRkLCAweDI4LCAweDc0LCAweDQ4LAotCTB4NTEsIDB4ZWQsIDB4ZjcsIDB4NWUsIDB4ZDAsIDB4NDMsIDB4MmMsIDB4YTgsIDB4ZjIsIDB4YmQsIDB4YTAsIDB4NjQsCi0JMHg5YiwgMHhiNiwgMHhlZCwgMHhjYywgMHgxMSwgMHhjOSwgMHhjMiwgMHhiZSwgMHg0NSwgMHg4ZSwgMHhjYywgMHg5OSwKLQkweDMyLCAweDZkLCAweGZmLCAweDYzLCAweGE3LCAweGI0LCAweDJmLCAweGRmLCAweDZmLCAweGE4LCAweGI4LCAweGFlLAotCTB4ZjcsIDB4NmUsIDB4OTAsIDB4NGQsIDB4ZTAsIDB4NzcsIDB4ZjksIDB4N2UsIDB4NWQsIDB4ZTQsIDB4YTYsIDB4NTksCi0JMHhjOCwgMHg1YSwgMHgyMywgMHgwOCwgMHhmNiwgMHg0NiwgMHg4MSwgMHhiMSwgMHg0YywgMHg0MywgMHgyYywgMHg5MywKLQkweDQ0LCAweDhiLCAweDRkLCAweDdkLCAweGY5LCAweGZlLCAweGY4LCAweGYwLCAweGRkLCAweGY1LCAweDc1LCAweDY0LAotCTB4OWUsIDB4YjQsIDB4YTksIDB4MmYsIDB4YzYsIDB4YTgsIDB4MTIsIDB4ZjQsIDB4YzEsIDB4ZjgsIDB4NzQsIDB4YmIsCi0JMHhhZSwgMHg4YSwgMHhhMSwgMHhhZSwgMHg0NiwgMHhmZSwgMHhlZiwgMHhlZCwgMHhjMiwgMHhmNSwgMHhhYSwgMHhhMiwKLQkweDc5LCAweGNlLCAweGJiLCAweGExLCAweDJmLCAweGQ4LCAweDMyLCAweDAyLCAweDdmLCAweDM3LCAweGVjLCAweDRmLAotCTB4Y2IsIDB4OTEsIDB4NTQsIDB4NzYsIDB4YzIsIDB4OTUsIDB4YzAsIDB4ZTYsIDB4YWYsIDB4YWQsIDB4YjEsIDB4ZjksCi0JMHhkMSwgMHhiYiwgMHhjOCwgMHg3NSwgMHgzYywgMHg5NCwgMHhjYiwgMHgwZCwgMHhlNSwgMHgxYSwgMHg4NSwgMHg1YywKLQkweDYzLCAweDkwLCAweDZiLCAweGU1LCAweDIzLCAweGM4LCAweGI1LCAweGYyLCAweDkxLCAweGU1LCAweGQyLCAweGE0LAotCTB4ZWMsIDB4M2MsIDB4MDgsIDB4NWEsIDB4YTYsIDB4ZmMsIDB4YWIsIDB4MTMsIDB4ZDgsIDB4ZjIsIDB4YmYsIDB4MzgsCi0JMHg5ZiwgMHgxNCwgMHgxOSwgMHg3YywgMHg3ZiwgMHg3MCwgMHhkOCwgMHgxNiwgMHhlZiwgMHg1YiwgMHhlMCwgMHhkNSwKLQkweDcxLCAweDQwLCAweDhiLCAweGVmLCAweGVmLCAweDk3LCAweGUxLCAweDZlLCAweGZlLCAweDM4LCAweDhiLCAweDdkLAotCTB4NWQsIDB4Y2YsIDB4MWYsIDB4MjksIDB4ODcsIDB4M2UsIDB4N2MsIDB4ZWYsIDB4ZmUsIDB4YTgsIDB4NmIsIDB4MWYsCi0JMHg1NSwgMHgwZSwgMHhjNiwgMHg5YywgMHg0ZiwgMHgzNSwgMHg5ZCwgMHhhYiwgMHgxZiwgMHg1NiwgMHg4NiwgMHhmNSwKLQkweDYzLCAweGNhLCAweDJmLCAweDRmLCAweDg2LCAweGM3LCAweDY0LCAweDcyLCAweDMzLCAweGVkLCAweGE5LCAweGE0LAotCTB4OGQsIDB4MGMsIDB4OTIsIDB4ZWYsIDB4YjUsIDB4ZmMsIDB4NGEsIDB4MjYsIDB4ZTAsIDB4MGQsIDB4MzksIDB4ZDEsCi0JMHhkMiwgMHg0NiwgMHgzOSwgMHhiMiwgMHg2MCwgMHg0OSwgMHg2OSwgMHhlOSwgMHg0ZSwgMHg3MSwgMHg1NywgMHgwMywKLQkweDZmLCAweGI0LCAweDQ3LCAweGY2LCAweDdkLCAweGQyLCAweDdjLCAweDJhLCAweGM4LCAweDJiLCAweDJlLCAweDU0LAotCTB4OTEsIDB4ODMsIDB4NTYsIDB4MTMsIDB4NzIsIDB4ZDksIDB4NDgsIDB4Y2IsIDB4OWIsIDB4ODMsIDB4ODcsIDB4ZTUsCi0JMHhmMywgMHhkNSwgMHgyNCwgMHhlOCwgMHgzMSwgMHg5ZiwgMHgyYywgMHhlNywgMHgxMCwgMHgxNywgMHhiNSwgMHhiMiwKLQkweDYzLCAweDA4LCAweDc5LCAweGFmLCAweGQ5LCAweDljLCAweDEzLCAweGM0LCAweDk2LCAweDcyLCAweDEwLCAweDgzLAotCTB4NWQsIDB4NmYsIDB4NTAsIDB4ZTUsIDB4MTQsIDB4OTAsIDB4NGYsIDB4NjQsIDB4MGMsIDB4YjEsIDB4YjcsIDB4NjYsCi0JMHhiMywgMHhjZCwgMHhmZSwgMHhhMCwgMHhlZiwgMHhiMywgMHg5NSwgMHg1ZSwgMHhhZCwgMHhjOCwgMHhiYywgMHg2NCwKLQkweGYwLCAweGE2LCAweDRjLCAweDNiLCAweDQxLCAweGRmLCAweGU3LCAweDJhLCAweGEzLCAweDliLCAweDk4LCAweDFmLAotCTB4MWEsIDB4MDUsIDB4YzksIDB4OTQsIDB4OWQsIDB4ZjcsIDB4N2MsIDB4ZDcsIDB4YmEsIDB4N2QsIDB4Y2QsIDB4ZmEsCi0JMHg3OCwgMHhiMiwgMHgxMywgMHg4MSwgMHhjZSwgMHg0NSwgMHhmYiwgMHhhYSwgMHhhZCwgMHhmNywgMHhiNiwgMHg0YSwKLQkweDA5LCAweDI3LCAweDVkLCAweGQ2LCAweDFhLCAweDQ3LCAweGU3LCAweGJlLCAweDRhLCAweDc5LCAweDViLCAweGFiLAotCTB4ZGMsIDB4MzQsIDB4ODAsIDB4M2YsIDB4NmQsIDB4NjgsIDB4NjIsIDB4MWUsIDB4YWEsIDB4OTQsIDB4YmIsIDB4ZDksCi0JMHhhNiwgMHhiZSwgMHg3NCwgMHg0ZCwgMHgxMiwgMHhhMywgMHgxNSwgMHg1ZiwgMHhhZSwgMHgzYSwgMHg0MSwgMHhlZSwKLQkweDYzLCAweDY4LCAweDdhLCAweDZmLCAweDViLCAweGI4LCAweDU2LCAweGQ3LCAweDc2LCAweDM5LCAweDk3LCAweDQ0LAotCTB4M2EsIDB4MGUsIDB4NTUsIDB4YzQsIDB4MmEsIDB4NTYsIDB4NzYsIDB4MzksIDB4NmYsIDB4NGIsIDB4YjksIDB4YTcsCi0JMHg2ZCwgMHg3NSwgMHg1ZCwgMHg4YSwgMHhlYiwgMHg3NiwgMHgwZSwgMHhhZiwgMHg5ZCwgMHhiYiwgMHhjYiwgMHhiOSwKLQkweDI4LCAweGU1LCAweDJkLCAweDZkLCAweGFiLCAweGI0LCAweGQyLCAweDU4LCAweGRiLCAweDE3LCAweGFjLCAweGU1LAotCTB4ZjgsIDB4NjYsIDB4NzEsIDB4YmIsIDB4MzksIDB4NDcsIDB4ZWYsIDB4NmQsIDB4YmYsIDB4NDUsIDB4NDMsIDB4MzIsCi0JMHhjNSwgMHg0YSwgMHhiOSwgMHhhNywgMHg3ZCwgMHgxNSwgMHhhZiwgMHg0ZCwgMHhiYywgMHhkZSwgMHgxYSwgMHhiYywKLQkweGM0LCAweGQ5LCAweGJlLCAweDhhLCAweDMzLCAweDA3LCAweDljLCAweDQzLCAweGFiLCAweDM4LCAweDM5LCAweDdlLAotCTB4NTgsIDB4OGEsIDB4MzgsIDB4ZDMsIDB4NWEsIDB4MGEsIDB4MzIsIDB4YmMsIDB4NTQsIDB4YzksIDB4NDgsIDB4NzksCi0JMHgyOCwgMHgwMSwgMHhkZCwgMHhmNywgMHgxZiwgMHhmYywgMHg5YSwgMHhhYSwgMHg0MywgMHhjYywgMHg2MSwgMHgwZiwKLQkweGJhLCAweDMyLCAweDU1LCAweDVlLCAweDg3LCAweGQ4LCAweDA4LCAweGRiLCAweGY4LCAweDVhLCAweDVkLCAweDg2LAotCTB4MTcsIDB4ZWIsIDB4YTYsIDB4MWMsIDB4NmYsIDB4NzAsIDB4YmYsIDB4OTgsIDB4ZTMsIDB4MDUsIDB4NzUsIDB4YzYsCi0JMHg4NSwgMHg0NiwgMHg0ZSwgMHhkYiwgMHg4NywgMHhiZCwgMHg2NiwgMHg5ZCwgMHhiMCwgMHhhZiwgMHg2MSwgMHg2YSwKLQkweGEzLCAweDNjLCAweDFmLCAweDgwLCAweDk3LCAweDc2LCAweDdlLCAweGFjLCAweDQxLCAweGRiLCAweDc5LCAweDAzLAotCTB4YjYsIDB4NDEsIDB4Y2UsIDB4YTMsIDB4OWMsIDB4YmQsIDB4OTUsIDB4YjksIDB4NTMsIDB4NjYsIDB4ZDEsIDB4NTEsCi0JMHg3NSwgMHg4OCwgMHg1NiwgMHhjYiwgMHg3NywgMHgyMCwgMHgwNywgMHg0ZCwgMHhhMCwgMHhkNiwgMHg4MCwgMHhjZCwKLQkweGRiLCAweDc4LCAweDZmLCAweDcwLCAweGRlLCAweDMyLCAweGU2LCAweDZkLCAweGUwLCAweDNjLCAweGVjLCAweGNkLAotCTB4MjUsIDB4ZTUsIDB4MGYsIDB4YTYsIDB4Y2QsIDB4ZjEsIDB4NzcsIDB4YjEsIDB4YzcsIDB4NjgsIDB4ZDcsIDB4NTksCi0JMHg1NywgMHg1OCwgMHgwMiwgMHg1ZiwgMHhjMSwgMHgzZSwgMHhhMiwgMHg2ZSwgMHg0OCwgMHhlZCwgMHg2MCwgMHg3ZSwKLQkweDhmLCAweGI5LCAweDE5LCAweGNjLCAweGNkLCAweDY2LCAweDE4LCAweGNmLCAweDNkLCAweGZiLCAweDk5LCAweDBlLAotCTB4ZTksIDB4NDIsIDB4YmIsIDB4Y2UsIDB4MzUsIDB4ZDksIDB4MGMsIDB4NzIsIDB4NWIsIDB4ZGYsIDB4Y2IsIDB4YjcsCi0JMHhjOSwgMHg0YSwgMHhjYSwgMHhiZiwgMHg2MCwgMHhkOCwgMHhkMSwgMHhkYywgMHgwOCwgMHg2ZiwgMHhmMywgMHg1YywKLQkweGU2LCAweGM1LCAweGM0LCAweGJkLCAweDIxLCAweGNjLCAweDgzLCAweGM3LCAweGM1LCAweDZkLCAweGZjLCAweDQ5LAotCTB4YjcsIDB4NzQsIDB4YjksIDB4ZjgsIDB4OGQsIDB4ZTYsIDB4NGMsIDB4NmYsIDB4MGUsIDB4NmEsIDB4MmUsIDB4YmUsCi0JMHhiNywgMHg1MCwgMHgzZSwgMHgxNywgMHhlNywgMHhhMSwgMHg1NiwgMHhhYywgMHg2NiwgMHgyNiwgMHg1OSwgMHgxZiwKLQkweDE1LCAweGViLCAweDZjLCAweGVmLCAweDg1LCAweDNmLCAweDA0LCAweDc1LCAweGQ3LCAweDg1LCAweDViLCAweGJlLAotCTB4NzAsIDB4MTksIDB4N2EsIDB4NGIsIDB4NDMsIDB4NmYsIDB4MjksIDB4MzksIDB4ZGYsIDB4NjAsIDB4OWQsIDB4ZTYsCi0JMHg0MiwgMHg1ZiwgMHgxOSwgMHhmMSwgMHgxYSwgMHhlMywgMHg1OCwgMHgyYiwgMHg4NywgMHg4MSwgMHgwMywgMHgzYSwKLQkweDE3LCAweDQ3LCAweDJmLCAweDY0LCAweDY1LCAweGNhLCAweGRhLCAweDFkLCAweGYxLCAweDAwLCAweDVjLCAweDg4LAotCTB4MWYsIDB4ODUsIDB4MzYsIDB4ZjQsIDB4ZjEsIDB4MWQsIDB4OWEsIDB4NTMsIDB4ZmYsIDB4ODYsIDB4N2YsIDB4OTQsCi0JMHhlZCwgMHgwOSwgMHhiZCwgMHgzMCwgMHhkNiwgMHhkNCwgMHhiZiwgMHg2ZSwgMHhmYywgMHhhMSwgMHgxYywgMHg2OCwKLQkweDMzLCAweDA2LCAweDMxLCAweGZlLCAweGU4LCAweGE4LCAweGYzLCAweDE4LCAweDhiLCAweDQ4LCAweGQ3LCAweDkyLAotCTB4MjMsIDB4NGIsIDB4MjMsIDB4ZGMsIDB4MzcsIDB4OGIsIDB4ZjEsIDB4YTcsIDB4NWMsIDB4ZTcsIDB4OWUsIDB4MjksCi0JMHg1YywgMHhjMCwgMHgxOSwgMHhhZCwgMHhmMSwgMHhmZCwgMHgxMSwgMHg4NywgMHg2YiwgMHg3YywgMHg5OSwgMHg3MCwKLQkweDNhLCAweGM0LCAweDQ4LCAweDk2LCAweGI0LCAweGM3LCAweDA3LCAweDExLCAweDdiLCAweDFlLCAweGUwLCAweDNlLAotCTB4MzIsIDB4MDYsIDB4NmQsIDB4MTcsIDB4YjAsIDB4ZWEsIDB4YjQsIDB4M2MsIDB4M2MsIDB4YzgsIDB4NzUsIDB4YTAsCi0JMHhkZCwgMHgyYSwgMHg3YSwgMHg5MiwgMHgzNCwgMHhmMywgMHgyMSwgMHg0ZiwgMHg0MywgMHhkZCwgMHg4MSwgMHhiZSwKLQkweDA2LCAweGFjLCAweDQwLCAweDdmLCAweDlmLCAweGU5LCAweDVlLCAweGQ1LCAweDFmLCAweGQ3LCAweDM1LCAweGYzLAotCTB4Y2IsIDB4MTgsIDB4OTYsIDB4OTAsIDB4ODEsIDB4MzMsIDB4MWIsIDB4NjUsIDB4ZTcsIDB4YTIsIDB4MjUsIDB4ZjYsCi0JMHg5OSwgMHg1NSwgMHhmZSwgMHg3NiwgMHg5ZSwgMHg1YiwgMHhjYiwgMHg1ZiwgMHhmNCwgMHg3ZiwgMHgxNSwgMHg1YywKLQkweGQwLCAweGM1LCAweDhlLCAweGZhLCAweDFlLCAweDRiLCAweDA1LCAweGI4LCAweGEzLCAweGY2LCAweDdiLCAweGUxLAotCTB4NWUsIDB4ZjEsIDB4ZmQsIDB4OTksIDB4NzAsIDB4NGYsIDB4YjAsIDB4MDcsIDB4ODgsIDB4OTUsIDB4ZTcsIDB4NmYsCi0JMHhjNSwgMHhhOSwgMHgwYywgMHhmNiwgMHgwNiwgMHhiNiwgMHhhNywgMHhlMiwgMHgxMSwgMHhlMywgMHgxOCwgMHhlZCwKLQkweGJiLCAweDYzLCAweGQyLCAweDJjLCAweGIwLCAweDhlLCAweGU2LCAweDNlLCAweGM5LCAweDQ0LCAweGI5LCAweDIyLAotCTB4YTUsIDB4YWQsIDB4ODUsIDB4NjcsIDB4N2QsIDB4ZDgsIDB4Y2YsIDB4YTQsIDB4YTUsIDB4NmMsIDB4YWYsIDB4NjMsCi0JMHhhZiwgMHg5NywgMHgzNywgMHhhMCwgMHgxYiwgMHg4YywgMHhjMSwgMHgyNiwgMHhmNSwgMHg0MiwgMHg0MiwgMHg4YSwKLQkweDhkLCAweDQ0LCAweGMyLCAweDNjLCAweDMxLCAweGYwLCAweDIzLCAweGNmLCAweDQ4LCAweDI0LCAweGY0LCAweDEzLAotCTB4ODEsIDB4OWQsIDB4NGQsIDB4ZDYsIDB4NmYsIDB4MjAsIDB4NTYsIDB4NmEsIDB4NzIsIDB4NzQsIDB4ZTgsIDB4ODYsCi0JMHhjZiwgMHgxYSwgMHhkOCwgMHhkYiwgMHgwYiwgMHg5YiwgMHgxYiwgMHg4MiwgMHhjZiwgMHg4MCwgMHg4ZiwgMHg3MiwKLQkweGEzLCAweGEzLCAweDM3LCAweGUwLCAweGVkLCAweDJiLCAweDExLCAweDhmLCAweGE2LCAweDhlLCAweGRjLCAweGQzLAotCTB4Y2IsIDB4ZmIsIDB4YmUsIDB4NTEsIDB4ZDgsIDB4OTAsIDB4OTgsIDB4Y2UsIDB4OGYsIDB4NmYsIDB4ZDEsIDB4Y2YsCi0JMHhlZCwgMHhkZiwgMHg2MiwgMHg5YywgMHgyYiwgMHg2ZCwgMHgwMSwgMHgzZSwgMHhkZCwgMHhjYiwgMHhlMywgMHhmNywKLQkweDljLCAweGM4LCAweDQ0LCAweDE1LCAweDNhLCAweGRmLCAweDAzLCAweDNkLCAweDU5LCAweGYwLCAweGM1LCAweDNkLAotCTB4YTYsIDB4Y2EsIDB4ZDEsIDB4ZjUsIDB4M2QsIDB4MmYsIDB4NmUsIDB4MGEsIDB4NzAsIDB4ZjAsIDB4ZmQsIDB4MjcsCi0JMHg3ZSwgMHg3MCwgMHg4NiwgMHg1ZSwgMHgwZSwgMHhmYiwgMHg3ZSwgMHgzZiwgMHhkYywgMHg4NywgMHg1ZiwgMHg0NSwKLQkweGI5LCAweDc4LCAweDVlLCAweDQ0LCAweGIyLCAweGFkLCAweDNkLCAweDM3LCAweGIyLCAweGUzLCAweDI1LCAweDljLAotCTB4MzMsIDB4YTcsIDB4MWQsIDB4ZGYsIDB4N2YsIDB4MDcsIDB4Y2YsIDB4MzUsIDB4YTcsIDB4ZDksIDB4NDYsIDB4ZGUsCi0JMHg3ZiwgMHhmNiwgMHgzMSwgMHgwNywgMHhmOCwgMHgyYywgMHhjZSwgMHhiZCwgMHhkMSwgMHhhNiwgMHhiMywgMHhmZiwKLQkweDVlLCAweGNmLCAweGJkLCAweDdiLCAweDNmLCAweGZiLCAweGM5LCAweGYzLCAweDFkLCAweDdkLCAweGVmLCAweDAzLAotCTB4Y2UsIDB4ZmUsIDB4MGYsIDB4NWMsIDB4NzcsIDB4MGYsIDB4M2UsIDB4MWIsIDB4ZDgsIDB4NmQsIDB4YjEsIDB4ZDEsCi0JMHgxYywgMHg1ZiwgMHhlZSwgMHhkNSwgMHg3ZiwgMHg3ZiwgMHhhZCwgMHhmYiwgMHg3NiwgMHhmZiwgMHhiNSwgMHhiYiwKLQkweDZmLCAweGY3LCAweGRmLCAweGNkLCAweGRkLCAweGJmLCAweDE4LCAweGZmLCAweGNkLCAweDAxLCAweDBmLCAweDdkLAotCTB4NzAsIDB4YWQsIDB4ZmYsIDB4YWUsIDB4ZTcsIDB4OTMsIDB4ZDQsIDB4ZjcsIDB4ZjMsIDB4M2QsIDB4ZTUsIDB4YTEsCi0JMHhjZSwgMHgzMCwgMHgxZiwgMHg1MiwgMHhlNywgMHhmNSwgMHgxNywgMHhhNywgMHg2ZCwgMHhlZiwgMHg3ZSwgMHg1MywKLQkweDRhLCAweGI5LCAweDE2LCAweGM5LCAweGU2LCAweDZhLCAweGIyLCAweDQzLCAweDhlLCAweDNiLCAweDIyLCAweDRiLAotCTB4YWEsIDB4MTYsIDB4MzEsIDB4NTEsIDB4OGIsIDB4MGYsIDB4YTAsIDB4M2UsIDB4MGIsIDB4ZjQsIDB4YmEsIDB4YTQsCi0JMHhmNCwgMHhmMiwgMHgwMiwgMHg3OCwgMHg4OSwgMHhmMCwgMHg3NCwgMHhkZCwgMHgwNSwgMHgwZiwgMHg3MSwgMHgxMCwKLQkweDE3LCAweGYxLCAweDBjLCAweGUyLCAweDdjLCAweGI3LCAweGQ3LCAweGMxLCAweDg1LCAweDczLCAweGVhLCAweDI1LAotCTB4ZDQsIDB4NjQsIDB4YjYsIDB4ZGUsIDB4YTMsIDB4MDcsIDB4NjcsIDB4YjIsIDB4NWIsIDB4OTYsIDB4ZGQsIDB4ZTksCi0JMHhlYiwgMHhmMiwgMHgwNSwgMHg5ZSwgMHg1OSwgMHgwYSwgMHhhZSwgMHhjZSwgMHgyMSwgMHg1NiwgMHgwZiwgMHg4ZCwKLQkweDg1LCAweDc1LCAweGQyLCAweGRjLCAweDQxLCAweGNmLCAweDhlLCAweGVlLCAweDQ5LCAweDc4LCAweDQ3LCAweDkyLAotCTB4OTAsIDB4OTIsIDB4OWEsIDB4YjUsIDB4MDQsIDB4MWQsIDB4NjgsIDB4NzIsIDB4MGQsIDB4NjcsIDB4ZDAsIDB4ZDUsCi0JMHhiOSwgMHg3NiwgMHhlMCwgMHg0NSwgMHhlZSwgMHg3NywgMHgyMCwgMHhiYiwgMHg1NywgMHhiNCwgMHg3ZSwgMHhhYiwKLQkweDU1LCAweDZiLCAweDg3LCAweDJmLCAweDY1LCAweGM0LCAweDU1LCAweDZkLCAweDllLCAweGQzLCAweGE3LCAweDY2LAotCTB4MTYsIDB4MmIsIDB4YzgsIDB4MDMsIDB4NmQsIDB4OWMsIDB4YWYsIDB4NzksIDB4YmMsIDB4ZDcsIDB4NDksIDB4NDMsCi0JMHg5MywgMHgyYiwgMHg3MywgMHhiYSwgMHhmYywgMHhkMywgMHg5YywgMHgyMSwgMHhmZiwgMHg4YywgMHgzYSwgMHhmNCwKLQkweDlhLCAweDdkLCAweDZhLCAweGU2LCAweGI0LCAweDJkLCAweGY3LCAweDgxLCAweGQ1LCAweGYwLCAweDBlLCAweDRmLAotCTB4NzYsIDB4OWEsIDB4NDIsIDB4NWIsIDB4MWQsIDB4NDgsIDB4ZmYsIDB4OGUsIDB4MjAsIDB4ZmYsIDB4YzEsIDB4OWEsCi0JMHgyYiwgMHg3MywgMHhhNCwgMHhiNSwgMHg3NiwgMHg4ZCwgMHhmNCwgMHgyMiwgMHgxZiwgMHg4MywgMHg1ZCwgMHgwZiwKLQkweDMwLCAweDI3LCAweGUyLCAweDdjLCAweGQ0LCAweGFiLCAweDAzLCAweGQ2LCAweDNlLCAweGM1LCAweDViLCAweDQyLAotCTB4MTYsIDB4ZWIsIDB4OWMsIDB4NmYsIDB4ODIsIDB4YjcsIDB4MmUsIDB4OWMsIDB4MzEsIDB4NTksIDB4NmIsIDB4NTIsCi0JMHhmZSwgMHhiMCwgMHg1YiwgMHhlNSwgMHhhYSwgMHgxYSwgMHhmYiwgMHgwZCwgMHhiNSwgMHhjNywgMHhlZiwgMHhlZiwKLQkweGU3LCAweGRlLCAweDFiLCAweDMyLCAweDk1LCAweDYyLCAweDliLCAweDYzLCAweDU5LCAweGQ0LCAweDljLCAweGM0LAotCTB4OTcsIDB4ZGQsIDB4ZWIsIDB4MGEsIDB4NzksIDB4MGUsIDB4ZGUsIDB4YWYsIDB4MDgsIDB4NjUsIDB4ZGIsIDB4NmQsCi0JMHg1ZCwgMHg5NywgMHhkNywgMHg3ZCwgMHhmNywgMHgwMCwgMHhlNSwgMHg4OSwgMHg3MiwgMHg4YiwgMHgzOSwgMHg5ZiwKLQkweGIxLCAweGQ4LCAweDI4LCAweGNjLCAweGMwLCAweDhlLCAweGJmLCAweDJhLCAweGRmLCAweDZmLCAweDFjLCAweDkyLAotCTB4ZWYsIDB4MzUsIDB4MjYsIDB4ZTUsIDB4Y2YsIDB4MWEsIDB4NWYsIDB4OTYsIDB4M2YsIDB4NmQsIDB4MWMsIDB4OTQsCi0JMHhkNywgMHgxYiwgMHgwNywgMHhlNCwgMHhiNSwgMHhjNiwgMHg4NCwgMHhiYywgMHhkYSwgMHhkOCwgMHgwZiwgMHgxYiwKLQkweDFmLCAweDg3LCAweDhkLCAweDlmLCAweDlhLCAweDk5LCAweGFjLCAweGY3LCAweGNiLCAweGQ0LCAweDQ5LCAweGM0LAotCTB4MjAsIDB4ZTcsIDB4MWIsIDB4YmEsIDB4YmEsIDB4ZTMsIDB4YjMsIDB4ZTksIDB4ZTcsIDB4MmQsIDB4MzIsIDB4YWQsCi0JMHhlZSwgMHhhZiwgMHgzNCwgMHhlNCwgMHg4OSwgMHgyZCwgMHhiYywgMHgyYiwgMHg3YywgMHhjNSwgMHgzMywgMHgyZSwKLQkweDg3LCAweGYxLCAweGU4LCAweGUxLCAweDk0LCAweGI0LCAweDAzLCAweGJmLCAweGNhLCAweDRiLCAweDRkLCAweDllLAotCTB4ZGIsIDB4NjIsIDB4ODYsIDB4ZjcsIDB4OWMsIDB4ODcsIDB4MjQsIDB4YzksIDB4ZmIsIDB4YjAsIDB4OWMsIDB4NjcsCi0JMHhhMCwgMHhkZSwgMHg1ZSwgMHhkNywgMHgyNywgMHg3MywgMHhiNCwgMHg2NSwgMHhlOCwgMHhjNiwgMHg5NSwgMHg0MywKLQkweGIwLCAweDUzLCAweGMzLCAweDdlLCAweGNiLCAweGE1LCAweDFlLCAweDE2LCAweDk3LCAweDI4LCAweGY3LCAweDQ2LAotCTB4NTksIDB4NWMsIDB4YTAsIDB4NmYsIDB4ZmYsIDB4MWIsIDB4NjQsIDB4NmMsIDB4OTcsIDB4ZGEsIDB4ODIsIDB4ODksCi0JMHhiOSwgMHg2ZSwgMHg5OCwgMHhhYiwgMHg2YywgMHhhNywgMHgzZCwgMHgwMCwgMHgxZiwgMHhmMSwgMHg3ZSwgMHgxMCwKLQkweDRlLCAweGFiLCAweDA5LCAweDI3LCAweGYxLCAweDI0LCAweDU0LCAweDBjLCAweDA4LCAweDcwLCAweDViLCAweDUyLAotCTB4NWIsIDB4NGEsIDB4Y2EsIDB4YzIsIDB4NDIsIDB4MGYsIDB4OWUsIDB4OTQsIDB4MmMsIDB4ZDQsIDB4NmQsIDB4M2MsCi0JMHgzOSwgMHgzYywgMHg0MywgMHg3OCwgMHhkMiwgMHhiMCwgMHg1MywgMHhjYSwgMHhjOCwgMHhkOCwgMHgxMiwgMHhjOSwKLQkweDg4LCAweDc4LCAweDVjLCAweGVkLCAweDBkLCAweDZiLCAweDJhLCAweGYyLCAweGEzLCAweDg1LCAweGZjLCAweDc0LAotCTB4ODcsIDB4N2QsIDB4MWQsIDB4NTIsIDB4YWIsIDB4MzgsIDB4MzIsIDB4NTUsIDB4ZmQsIDB4OTQsIDB4M2UsIDB4YTUsCi0JMHg3NCwgMHgwNywgMHhmYywgMHg5NSwgMHgyMSwgMHhiNCwgMHhlZiwgMHgwZiwgMHhkYiwgMHg4ZiwgMHhjYSwgMHhmNCwKLQkweGJjLCAweGM4LCAweGNhLCAweGNiLCAweDAzLCAweDdhLCAweDUxLCAweGI1LCAweGY3LCAweGEyLCAweGFkLCAweGEzLAotCTB4OWQsIDB4MGQsIDB4ZGIsIDB4Y2MsIDB4OGYsIDB4MGUsIDB4ZTAsIDB4NzEsIDB4ZDUsIDB4ZjMsIDB4ZjUsIDB4ZWEsCi0JMHhiOCwgMHgzYywgMHg1NSwgMHhlZCwgMHg3NywgMHg1ZSwgMHg4NywgMHhjZCwgMHhiZCwgMHg2NSwgMHg0NiwgMHhmNywKLQkweGQyLCAweDA0LCAweDI0LCAweDc5LCAweGY2LCAweDU2LCAweDc1LCAweGY3LCAweGYxLCAweDA0LCAweGUyLCAweGFkLAotCTB4OWIsIDB4MzQsIDB4ZTUsIDB4NmYsIDB4NGYsIDB4NjQsIDB4YWQsIDB4YTcsIDB4ZjUsIDB4NWMsIDB4NTIsIDB4ZGEsCi0JMHg3ZCwgMHhmZiwgMHg3MSwgMHgzYiwgMHgzYiwgMHgzYiwgMHhhOSwgMHg3NywgMHhjYSwgMHhkZiwgMHhiZiwgMHg5OCwKLQkweDkxLCAweDg1LCAweGIzLCAweDViLCAweDY1LCAweGExLCAweDA2LCAweDk5LCAweDFhLCAweGJmLCAweDhlLCAweDdkLAotCTB4MzUsIDB4ZTUsIDB4ZWEsIDB4OWUsIDB4NDcsIDB4YjEsIDB4MjcsIDB4OGMsIDB4NWQsIDB4NDksIDB4ZTQsIDB4NmMsCi0JMHgxYiwgMHhjNCwgMHhlYywgMHgyNSwgMHg1ZCwgMHg0OSwgMHg5OCwgMHg4NSwgMHg5YywgMHgxYywgMHg4MSwgMHhkZiwKLQkweDRmLCAweGRiLCAweGI5LCAweDFlLCAweDY5LCAweGM3LCAweDdiLCAweDdkLCAweDA0LCAweDdjLCAweDViLCAweDMyLAotCTB4ZDUsIDB4NmIsIDB4YzksIDB4OTksIDB4YzEsIDB4NjgsIDB4ZmYsIDB4YjYsIDB4NjIsIDB4NmUsIDB4NDYsIDB4MTYsCi0JMHhjZiwgMHg2NiwgMHhmMCwgMHg5YiwgMHg4MywgMHhmZCwgMHhlYywgMHg5NCwgMHg1NywgMHg2YSwgMHhmZCwgMHhiMiwKLQkweDU0LCAweGRiLCAweDJhLCAweDhiLCAweGI1LCAweGU2LCAweDdkLCAweGU4LCAweGVjLCAweDA5LCAweGUyLCAweDFkLAotCTB4ZjEsIDB4ZjQsIDB4NWIsIDB4NTMsIDB4ZmEsIDB4NTYsIDB4NzEsIDB4Y2QsIDB4N2UsIDB4ZWIsIDB4MjksIDB4ZmQsCi0JMHgxZiwgMHhlNCwgMHgzMSwgMHgzMywgMHhhMCwgMHhhOSwgMHgxNywgMHg3ZSwgMHhhNCwgMHhlZSwgMHg4NCwgMHgyNiwKLQkweDc5LCAweGY2LCAweDJhLCAweGJjLCAweDRmLCAweDI2LCAweDQ5LCAweGZiLCAweGY1LCAweGM2LCAweDA3LCAweGQxLAotCTB4NTksIDB4Y2IsIDB4Y2YsIDB4OWQsIDB4NjgsIDB4NTIsIDB4MDYsIDB4ZTIsIDB4ZWMsIDB4YmYsIDB4NzEsIDB4NTIsCi0JMHhlZiwgMHg5NSwgMHhlNSwgMHg2ZCwgMHgwZiwgMHg1OCwgMHg0ZiwgMHhlYSwgMHhhZCwgMHg4OCwgMHgwMSwgMHgzZiwKLQkweDk3LCAweDlmLCAweGVlLCAweGQ5LCAweDI0LCAweDNmLCAweGZjLCAweGNkLCAweGVjLCAweGE5LCAweDZmLCAweDIyLAotCTB4ZDksIDB4YmYsIDB4YjIsIDB4YTcsIDB4ODMsIDB4NzEsIDB4MDEsIDB4ZWYsIDB4ZWMsIDB4Y2YsIDB4ZGUsIDB4NzAsCi0JMHg3NSwgMHhlYSwgMHhlMSwgMHgyZiwgMHhhMCwgMHg4NywgMHhlYywgMHg5YywgMHhiYSwgMHg5YiwgMHg1NiwgMHgzYywKLQkweDkwLCAweDNlLCAweGY1LCAweDUyLCAweDA2LCAweDZmLCAweDE4LCAweGFiLCAweGY3LCAweDAzLCAweDU3LCAweDU5LAotCTB4ZTksIDB4ZjksIDB4MDksIDB4MjcsIDB4N2IsIDB4MDMsIDB4ZTksIDB4YjAsIDB4YmYsIDB4NjgsIDB4ZjcsIDB4YTcsCi0JMHg3NywgMHhlYSwgMHgzYiwgMHg2NCwgMHgzMiwgMHhmZCwgMHg4MCwgMHhmNSwgMHhiNCwgMHg2YywgMHgyMSwgMHhjZSwKLQkweGQ5LCAweDA1LCAweGMxLCAweGRhLCAweDc5LCAweGUyLCAweGZiLCAweDJiLCAweGUwLCAweDBiLCAweDcwLCAweDI4LAotCTB4ZmYsIDB4NTEsIDB4MzgsIDB4NzcsIDB4NTksIDB4NWYsIDB4ZDcsIDB4NzksIDB4YzYsIDB4NjMsIDB4MGMsIDB4NzEsCi0JMHhlMSwgMHhlMiwgMHgxMCwgMHg2NSwgMHg0MCwgMHg4MiwgMHg5NSwgMHhjYSwgMHhhNiwgMHg1ZCwgMHhmZCwgMHhjMywKLQkweGM4LCAweDQ3LCAweGZjLCAweGZkLCAweDU2LCAweDUxLCAweDI3LCAweDBmLCAweGU3LCAweGMwLCAweGNiLCAweDRmLAotCTB4YzAsIDB4N2YsIDB4M2YsIDB4NzAsIDB4YTIsIDB4ZjYsIDB4NDgsIDB4NDcsIDB4NzQsIDB4ZmYsIDB4NGUsIDB4ZDEsCi0JMHg3ZCwgMHhhZCwgMHgyMSwgMHhlNiwgMHgyYSwgMHg1ZCwgMHhmNCwgMHhkNSwgMHg3NSwgMHhjOCwgMHhkZCwgMHgwNywKLQkweDdiLCAweGI1LCAweGYwLCAweGNiLCAweGJkLCAweGU5LCAweDBjLCAweGY3LCAweDk4LCAweGViLCAweDIyLCAweGJhLAotCTB4MTEsIDB4YmYsIDB4NWMsIDB4NzMsIDB4MjcsIDB4MWUsIDB4ZWUsIDB4NzUsIDB4M2UsIDB4ZWEsIDB4ZDQsIDB4MDMsCi0JMHgwOSwgMHg3OSwgMHhmNywgMHg0NCwgMHhiNCwgMHgzNywgMHgwNywgMHg2NCwgMHhiYSwgMHgwYSwgMHhkZCwgMHhlZCwKLQkweGVhLCAweDBmLCAweGZjLCAweDI3LCAweDFkLCAweGYxLCAweDQwLCAweGRlLCAweGZmLCAweDA2LCAweGJjLCAweDA3LAotCTB4YjgsIDB4NWIsIDB4MGIsIDB4Y2QsIDB4YmEsIDB4YzMsIDB4NTgsIDB4M2QsIDB4YTAsIDB4MzEsIDB4YjYsIDB4MGUsCi0JMHg0ZiwgMHg1NywgMHhmNiwgMHg0NCwgMHhiZSwgMHg5OCwgMHg4NCwgMHg1ZiwgMHhlZCwgMHhiNiwgMHg5ZSwgMHgxMCwKLQkweGQ2LCAweDYzLCAweGM0LCAweDliLCAweDk0LCAweDFmLCAweGJlLCAweDBjLCAweDFlLCAweDkyLCAweGY0LCAweDkzLAotCTB4N2YsIDB4NWYsIDB4ZTMsIDB4MjcsIDB4MWMsIDB4ZGIsIDB4MmEsIDB4MzUsIDB4ZDQsIDB4ZDQsIDB4NWUsIDB4ZGUsCi0JMHg5NCwgMHg2OSwgMHgyNSwgMHgwMywgMHhkYSwgMHgzNSwgMHhmYSwgMHg3NywgMHgyOSwgMHhmNCwgMHhlZiwgMHg0NywKLQkweDgwLCAweGEzLCAweDVkLCAweDhjLCAweDQ3LCAweDFmLCAweGM3LCAweDU5LCAweDlkLCAweGNkLCAweDJjLCAweGViLAotCTB4Y2MsIDB4MDMsIDB4NzYsIDB4NGIsIDB4NTEsIDB4ZGQsIDB4NGYsIDB4ZGYsIDB4OGIsIDB4ZWUsIDB4YTIsIDB4ZDgsCi0JMHg5NCwgMHg5NiwgMHg4YiwgMHg5NSwgMHgyOCwgMHgyZSwgMHhhNSwgMHg3MSwgMHg5ZSwgMHhiNCwgMHhjYiwgMHhhNSwKLQkweGI5LCAweDI4LCAweGU2LCAweGI1LCAweGNiLCAweDEyLCAweGYyLCAweDlhLCAweDk1LCAweDk3LCAweDJjLCAweDhjLAotCTB4MjUsIDB4ZTUsIDB4ZTIsIDB4NWMsIDB4MTIsIDB4MzEsIDB4YWIsIDB4NDcsIDB4NTYsIDB4ZTYsIDB4N2EsIDB4MzAsCi0JMHg5NiwgMHhjMiwgMHhiYSwgMHgxNCwgMHhlNiwgMHhkYiwgMHhiMiwgMHg1MiwgMHhiMSwgMHg4MSwgMHgyNywgMHg4NywKLQkweDc2LCAweDBlLCAweGVkLCAweDIxLCAweGI5LCAweGE0LCAweGJlLCAweDE3LCAweDMwLCAweDJmLCAweDE4LCAweDQyLAotCTB4ZGMsIDB4NjIsIDB4NWUsIDB4MzAsIDB4ODIsIDB4MTgsIDB4MzIsIDB4ODEsIDB4MjcsIDB4OGEsIDB4NWQsIDB4YTcsCi0JMHg2NiwgMHhhNiwgMHgyYSwgMHhiYywgMHg3MywgMHg4NCwgMHgwZSwgMHhhYywgMHg1MywgMHgzMywgMHhkMywgMHhiNiwKLQkweDg5LCAweGJhLCAweGVkLCAweDFiLCAweGRhLCAweDU0LCAweDgzLCAweDcyLCAweDQxLCAweGI3LCAweDQzLCAweDFkLAotCTB4YTIsIDB4M2YsIDB4NGEsIDB4OWIsIDB4ZTQsIDB4NzksIDB4NjcsIDB4MjAsIDB4YzYsIDB4NzcsIDB4MDEsIDB4OWYsCi0JMHgyMywgMHhmYSwgMHg2ZiwgMHhkMCwgMHgxNywgMHhhMCwgMHhjMywgMHgyNywgMHhiYSwgMHhlNCwgMHhkMiwgMHhjYiwKLQkweDhjLCAweDM1LCAweGFlLCAweGJjLCAweDdhLCAweDk2LCAweDNhLCAweDJjLCAweGY2LCAweGFjLCAweGVhLCAweDkwLAotCTB4NjMsIDB4MGYsIDB4ZTEsIDB4OGMsIDB4ZDgsIDB4MGYsIDB4N2IsIDB4MzIsIDB4MzMsIDB4ODcsIDB4OTAsIDB4Y2IsCi0JMHg3YywgMHgxYiwgMHhmNiwgMHg1OSwgMHg2NiwgMHhjZCwgMHg5ZCwgMHgwZSwgMHg2YSwgMHg4NCwgMHgyMCwgMHgwNiwKLQkweGEwLCAweGRkLCAweDQ3LCAweDVkLCAweGIxLCAweGRkLCAweDA3LCAweGJiLCAweGUzLCAweDU4LCAweDlmLCAweDFhLAotCTB4NWIsIDB4MDQsIDB4OGUsIDB4NjAsIDB4OGMsIDB4ZWQsIDB4Y2QsIDB4YjIsIDB4YTgsIDB4YzYsIDB4MGUsIDB4YWEsCi0JMHhiMSwgMHhiMiwgMHhiMiwgMHgwZiwgMHg4ZSwgMHgxZCwgMHg1MiwgMHhiMSwgMHhlOSwgMHg3YywgMHgyMywgMHhlYSwKLQkweGRmLCAweDg4LCAweDU4LCAweGMyLCAweDdlLCAweGY2LCAweGU1LCAweDYxLCAweGViLCAweDdiLCAweDcxLCAweGFlLAotCTB4MTUsIDB4NjQsIDB4YTksIDB4ODEsIDB4M2EsIDB4MzAsIDB4ZmYsIDB4N2IsIDB4OTgsIDB4Y2IsIDB4M2QsIDB4YzgsCi0JMHg5ZSwgMHgyYSwgMHhlOSwgMHhlNCwgMHhmMSwgMHgyMCwgMHhjZSwgMHg4MywgMHhmZCwgMHgyMSwgMHhhZCwgMHhiNiwKLQkweDkwLCAweGFmLCAweDAzLCAweDYxLCAweGJiLCAweDI1LCAweGE0LCAweDRkLCAweDNjLCAweDM2LCAweDcwLCAweDFjLAotCTB4YzMsIDB4NWEsIDB4MTcsIDB4MzgsIDB4MTgsIDB4NjMsIDB4MTEsIDB4MjMsIDB4NTIsIDB4MjksIDB4ZTgsIDB4ODIsCi0JMHgzNCwgMHhkYiwgMHhhNCwgMHhhYywgMHhkZSwgMHhmNywgMHhjMywgMHg3NiwgMHhiOSwgMHgxNiwgMHgzYSwgMHhiNCwKLQkweGEyLCAweDc1LCAweGE1LCAweDcwLCAweGNmLCAweDUzLCAweGVhLCAweDljLCAweGQxLCAweDkzLCAweDliLCAweGMzLAotCTB4OWMsIDB4MTAsIDB4N2EsIDB4NDUsIDB4OWMsIDB4ZDUsIDB4OTMsIDB4OGMsIDB4MzcsIDB4ZWYsIDB4ODQsIDB4NzYsCi0JMHhkYSwgMHg4YiwgMHhiZSwgMHg4NywgMHg0NCwgMHhlZiwgMHg2NSwgMHhkZiwgMHg1MSwgMHhlMCwgMHg2MSwgMHhlZCwKLQkweDNjLCAweDBjLCAweDk5LCAweGQ5LCAweGU2LCAweGZhLCAweDZjLCAweGQzLCAweGZhLCAweGM0LCAweDNhLCAweGViLAotCTB4M2IsIDB4OWEsIDB4ZmEsIDB4MzIsIDB4NTIsIDB4OWIsIDB4ZWYsIDB4NTIsIDB4ZjEsIDB4ZjIsIDB4N2MsIDB4MTgsCi0JMHgyZiwgMHgxNywgMHg2YiwgMHg5NCwgMHgwNSwgMHg3ZSwgMHg5NiwgMHg3ZiwgMHg1YiwgMHhlOSwgMHhhMiwgMHg3NiwKLQkweDM2LCAweGIwLCAweGY1LCAweGE1LCAweDkzLCAweDNjLCAweDE3LCAweDU3LCAweGU3LCAweGQ1LCAweGQ0LCAweGJjLAotCTB4ZGYsIDB4MDYsIDB4ZmYsIDB4YmEsIDB4MWMsIDB4NTUsIDB4MzIsIDB4NzAsIDB4M2UsIDB4ZTYsIDB4ZDUsIDB4MDIsCi0JMHhiZiwgMHgzMSwgMHg2YywgMHhjZSwgMHhhMSwgMHg4ZiwgMHg0NCwgMHg2YiwgMHgzOCwgMHhmZiwgMHhlNywgMHhhOCwKLQkweDU1LCAweGJlLCAweGFjLCAweGQ2LCAweGFjLCAweGZhLCAweDBjLCAweGY5LCAweDcxLCAweDQyLCAweDllLCAweDdiLAotCTB4YzAsIDB4NWYsIDB4NjcsIDB4MjgsIDB4NDMsIDB4N2IsIDB4MjgsIDB4MDMsIDB4ZjEsIDB4ZmQsIDB4MjcsIDB4NzAsCi0JMHhiNywgMHg2MSwgMHgxZSwgMHg3OSwgMHhkZCwgMHg4NiwgMHgzZSwgMHhiZSwgMHhmZiwgMHgxNywgMHhmYSwgMHg3NiwKLQkweDIzLCAweGZmLCAweDIzLCAweDZmLCAweDg5LCAweDI2LCAweGRlLCAweGZlLCAweDAzLCAweDYzLCAweDNkLCAweDRhLAotCTB4YjcsIDB4MzUsIDB4ZDQsIDB4MjYsIDB4NTMsIDB4YmMsIDB4ZWYsIDB4NDgsIDB4ZTEsIDB4MWMsIDB4MzgsIDB4YjksCi0JMHg0ZCwgMHhkMSwgMHhhZCwgMHg5ZCwgMHhiZCwgMHg4NiwgMHhmMSwgMHg1ZSwgMHhhYywgMHg4OSwgMHhkYSwgMHhjZCwKLQkweGIyLCAweGU5LCAweDU4LCAweGZiLCAweDUzLCAweDI1LCAweGNmLCAweDYyLCAweGVkLCAweDRlLCAweGYyLCAweDZmLAotCTB4NWIsIDB4MjMsIDB4M2IsIDB4ZTUsIDB4MjYsIDB4NGYsIDB4ZTQsIDB4YTcsIDB4MWYsIDB4NGYsIDB4MmIsIDB4NzIsCi0JMHgyMSwgMHhkOCwgMHg2ZCwgMHhkMiwgMHg5MCwgMHhkMSwgMHg3YywgMHg5YSwgMHhkZiwgMHhmOSwgMHgxMiwgMHhiYywKLQkweDE3LCAweDFkLCAweDE5LCAweGU0LCAweDllLCAweGExLCAweGRkLCAweDYwLCAweDRlLCAweDQ3LCAweDdmLCAweDRiLAotCTB4YzgsIDB4MzEsIDB4ZDQsIDB4MjQsIDB4ZTUsIDB4ODUsIDB4OGMsIDB4NTYsIDB4M2MsIDB4OTksIDB4NDUsIDB4MTYsCi0JMHhhZCwgMHhiZSwgMHhkNSwgMHhjOSwgMHg4YiwgMHg0YiwgMHhiNiwgMHg3YywgMHgxYiwgMHg3ZSwgMHg3YSwgMHhiMiwKLQkweDllLCAweDRkLCAweDdmLCAweDEzLCAweGY5LCAweGMxLCAweDkxLCAweDI1LCAweGU2LCAweDEzLCAweDNkLCAweDI5LAotCTB4NjUsIDB4OWIsIDB4ZjMsIDB4OWEsIDB4NmMsIDB4NjAsIDB4NGMsIDB4OWIsIDB4NDcsIDB4N2UsIDB4NmEsIDB4ZGQsCi0JMHgyZCwgMHg0NywgMHg4MiwgMHg5ZiwgMHg1NywgMHhkNywgMHhjNiwgMHgwYywgMHhjYSwgMHhiMSwgMHgzNiwgMHg2NiwKLQkweDEwLCAweDBmLCAweDYzLCAweGM2LCAweDRlLCAweGVjLCAweDEzLCAweDYzLCAweDA2LCAweGY2LCAweGZmLCAweDI0LAotCTB4NjMsIDB4ODYsIDB4OGQsIDB4NzUsIDB4OGMsIDB4MTksIDB4NzksIDB4NTksIDB4YWMsIDB4MzIsIDB4NjYsIDB4ZWMsCi0JMHg0NSwgMHg5YiwgMHgzMSwgMHhhMywgMHg4MCwgMHg3NiwgMHgxMCwgMHgyZiwgMHgxNiwgMHg1NSwgMHhiYywgMHhjOCwKLQkweDVhLCAweGNiLCAweGMyLCAweDM4LCAweDgxLCAweDNjLCAweGIxLCAweDhhLCAweDNjLCAweGIxLCAweDhhLCAweDNjLAotCTB4YjEsIDB4OGEsIDB4M2MsIDB4YjEsIDB4OGEsIDB4M2MsIDB4MTEsIDB4YjYsIDB4ZmUsIDB4NWEsIDB4MTUsIDB4NzksCi0JMHgyMiwgMHhmYywgMHhlNywgMHgzYywgMHg3MiwgMHg5MiwgMHhhMCwgMHhhNiwgMHgzOCwgMHg4YywgMHg5YSwgMHhjMiwKLQkweGQ1LCAweGM2LCAweGFhLCAweGUzLCAweGRhLCAweGJlLCAweDJhLCAweDZhLCAweDQzLCAweGY1LCAweDlkLCAweDU4LAotCTB4MWYsIDB4ZGEsIDB4ODAsIDB4YmEsIDB4YTgsIDB4ZTYsIDB4NmMsIDB4MDEsIDB4NWYsIDB4ZDcsIDB4ZTAsIDB4MWIsCi0JMHhkNCwgMHhkMywgMHg1NiwgMHg5OSwgMHhjYSwgMHhlZCwgMHg4MCwgMHg3YywgMHhkOCwgMHg3ZiwgMHhmYiwgMHhmYiwKLQkweGU4LCAweDQzLCAweDNlLCAweDlmLCAweDYzLCAweDBkLCAweGMyLCAweDc4LCAweGI1LCAweDBmLCAweDZkLCAweDFkLAotCTB4NmQsIDB4ZWMsIDB4ZTksIDB4MDQsIDB4N2MsIDB4YzQsIDB4N2UsIDB4OTAsIDB4ZjksIDB4NjIsIDB4N2EsIDB4NDEsCi0JMHg5ZSwgMHhkYywgMHgxYywgMHhkOCwgMHhmNCwgMHg2ZiwgMHgzMSwgMHgyNywgMHg1ZSwgMHhkMywgMHhkZSwgMHg4OCwKLQkweDM5LCAweGYwLCAweDE3LCAweGQ4LCAweDk3LCAweDVhLCAweDAzLCAweDVjLCAweGJhLCAweGZkLCAweGU3LCAweGM0LAotCTB4ZDEsIDB4YjcsIDB4ZTEsIDB4ZDYsIDB4MWMsIDB4ZGEsIDB4ZDUsIDB4ZjcsIDB4OWEsIDB4ZmEsIDB4YjIsIDB4OTgsCi0JMHhjZiwgMHhlZiwgMHhlMiwgMHgzYiwgMHhmMCwgMHhmYiwgMHgxNiwgMHg3ZSwgMHg2MSwgMHg3NywgMHhmNiwgMHgwNSwKLQkweGNjLCAweGU5LCAweGMzLCAweGVmLCAweDc3LCAweDlhLCAweGU2LCAweDQyLCAweDBhLCAweGZiLCAweDJmLCAweGQxLAotCTB4NzcsIDB4MzEsIDB4YTQsIDB4YzEsIDB4NmYsIDB4ODksIDB4NWYsIDB4NmEsIDB4ZTIsIDB4ZTMsIDB4MDcsIDB4ZTgsCi0JMHhmYiwgMHg2YiwgMHhmNCwgMHhmOSwgMHhmZSwgMHhkYiwgMHg0ZSwgMHhkNCwgMHgyNywgMHhhNSwgMHg5NiwgMHg3MCwKLQkweGVmLCAweDQ2LCAweGQ1LCAweGRlLCAweDY5LCAweGNhLCAweGU2LCAweDhmLCAweDJjLCAweGU5LCAweGFhLCAweDBlLAotCTB4N2EsIDB4YWUsIDB4OGUsIDB4ZWEsIDB4MDgsIDB4NzEsIDB4YmUsIDB4YmMsIDB4MTAsIDB4ZDQsIDB4YWQsIDB4YzcsCi0JMHg1MSwgMHg3MywgMHgxNiwgMHhhYiwgMHhiNCwgMHg5MSwgMHgxYywgMHhmYSwgMHg2ZCwgMHg5YywgMHg2OSwgMHgzMiwKLQkweDY5LCAweGRjLCAweGFhLCAweDYzLCAweDEzLCAweDg5LCAweGM5LCAweDdhLCAweDliLCAweDQ4LCAweDM3LCAweDY5LAotCTB4MzIsIDB4NGYsIDB4MjIsIDB4OGUsIDB4ZDksIDB4OTksIDB4ZTIsIDB4YzIsIDB4ZWMsIDB4OGMsIDB4MDcsIDB4OWMsCi0JMHg2MywgMHg3NSwgMHhhZSwgMHhlNSwgMHgzYywgMHg5MywgMHhmNywgMHg2MywgMHg0ZCwgMHg3NCwgMHg2OSwgMHgxMywKLQkweDYwLCAweDA2LCAweGY0LCAweDllLCAweGFiLCAweDkzLCAweDdlLCAweDQwLCAweGIzLCAweGFjLCAweDY4LCAweGRhLAotCTB4ZTgsIDB4OGYsIDB4ZWEsIDB4YzcsIDB4MWMsIDB4NmEsIDB4NWQsIDB4OTksIDB4NjQsIDB4ZWQsIDB4NWMsIDB4MGMsCi0JMHg2OSwgMHhiYSwgMHg3NSwgMHg0OSwgMHgyNCwgMHgwYSwgMHhjZCwgMHhmOCwgMHg4MiwgMHg4YywgMHhmMywgMHhiOSwKLQkweGZhLCAweGVjLCAweDhjLCAweGZlLCAweDQyLCAweDM2LCAweGM3LCAweDNiLCAweDExLCAweGQ3LCAweDlhLCAweDlkLAotCTB4NjksIDB4MWQsIDB4NDgsIDB4YzgsIDB4OGYsIDB4OTEsIDB4YmIsIDB4MWQsIDB4NTMsIDB4MzQsIDB4NjYsIDB4NjcsCi0JMHg4YywgMHgxNywgMHgwMiwgMHg1YiwgMHgwYywgMHhlOCwgMHhlMCwgMHgzYywgMHhjOSwgMHhiNywgMHg0MywgMHg0ZSwKLQkweGQyLCAweDYyLCAweDRkLCAweDFkLCAweDhjLCAweDRmLCAweGFhLCAweDdhLCAweGQxLCAweDk0LCAweDJiLCAweDE1LAotCTB4NDUsIDB4M2IsIDB4YWMsIDB4ZGIsIDB4YzksIDB4YzMsIDB4ZWMsIDB4OGMsIDB4ZmMsIDB4ZDEsIDB4MmQsIDB4MWUsCi0JMHhkNiwgMHg5MSwgMHg4NywgMHg3OCwgMHg0OSwgMHgyNywgMHhkMCwgMHg1YiwgMHhjMCwgMHg3ZiwgMHgxMiwgMHhmNSwKLQkweDdiLCAweDU0LCAweGFiLCAweGZiLCAweGZlLCAweDhhLCAweDkzLCAweDQzLCAweDVjLCAweGUwLCAweDNlLCAweGI2LAotCTB4YTgsIDB4M2MsIDB4ZDcsIDB4NzMsIDB4MzIsIDB4YmMsIDB4ZWYsIDB4OWIsIDB4ZTMsIDB4ZGYsIDB4MzksIDB4NzgsCi0JMHhmOSwgMHgwMSwgMHhkNCwgMHg0ZCwgMHhiYywgMHgxYiwgMHhhNCwgMHg3ZiwgMHhlMSwgMHhmNywgMHgzNiwgMHhmZiwKLQkweGUyLCAweDdjLCAweGY2LCAweDkzLCAweGU3LCAweDgxLCAweGY0LCAweDU1LCAweGYwLCAweGU3LCAweGU1LCAweGQxLAotCTB4ODcsIDB4NTgsIDB4NTEsIDB4NmMsIDB4NDQsIDB4YjgsIDB4NzgsIDB4YzcsIDB4Y2UsIDB4MzksIDB4MmEsIDB4ZmYsCi0JMHg2ZSwgMHhmMiwgMHhkMSwgMHg5NiwgMHhmMCwgMHhkYywgMHhhNSwgMHg4ZSwgMHhjOCwgMHgyNywgMHhmOSwgMHhlOSwKLQkweDg0LCAweDRkLCAweDkwLCAweDE3LCAweGNlLCAweDhmLCAweGVlLCAweDI1LCAweGQ4LCAweGZlLCAweGI4LCAweDM2LAotCTB4MTIsIDB4ZGQsIDB4YTksIDB4N2QsIDB4OWMsIDB4M2QsIDB4OGYsIDB4NzQsIDB4NzYsIDB4MzcsIDB4N2UsIDB4ODgsCi0JMHg4MywgMHhiNCwgMHgyMywgMHhiZSwgMHgyMiwgMHg5ZSwgMHg4OCwgMHg4ZiwgMHhmYywgMHg0NCwgMHhiYywgMHgyOCwKLQkweDFiLCAweDVkLCAweDk3LCAweDlmLCAweDYwLCAweDVkLCAweGMwLCAweDRmLCAweDY5LCAweDIxLCAweDBkLCAweDlkLAotCTB4OTAsIDB4YTcsIDB4MTEsIDB4NmQsIDB4YTQsIDB4YmEsIDB4ZGUsIDB4MWQsIDB4YzcsIDB4MGYsIDB4NWMsIDB4YzYsCi0JMHhkNSwgMHhiMSwgMHgwNiwgMHhlZiwgMHhhMSwgMHg0OCwgMHg5NywgMHg3ZiwgMHgzYiwgMHhiMiwgMHhhNCwgMHg4ZCwKLQkweDM0LCAweGY4LCAweDlkLCAweGE5LCAweGFlLCAweGI5LCAweDhkLCAweDg4LCAweGRlLCAweDVhLCAweDlkLCAweDQ2LAotCTB4YmYsIDB4YmMsIDB4MmIsIDB4ZmYsIDB4MGMsIDB4ZjYsIDB4YTksIDB4M2IsIDB4ZjgsIDB4YmIsIDB4MTQsIDB4NTUsCi0JMHg0NywgMHhiMSwgMHg2ZiwgMHhiOSwgMHhkNSwgMHg3MywgMHhhMiwgMHhiZiwgMHhkMywgMHhkOSwgMHgxZiwgMHhlNiwKLQkweDQzLCAweDUxLCAweDZkLCAweDFjLCAweGQ1LCAweDU5LCAweGVhLCAweDllLCAweDdkLCAweGFmLCAweGU3LCAweDY4LAotCTB4YzgsIDB4NGYsIDB4OTksIDB4MzMsIDB4MDUsIDB4M2EsIDB4MDgsIDB4ZjEsIDB4ZGUsIDB4OTEsIDB4Y2YsIDB4OTEsCi0JMHgyNiwgMHgzZSwgMHg0NywgMHhjMSwgMHhlNywgMHgzZSwgMHhmMCwgMHgzOSwgMHg3NiwgMHg4YiwgMHhjZiwgMHg1YiwKLQkweGI2LCAweDk3LCAweDI5LCAweGMzLCAweGY2LCAweDQ2LCAweGQ2LCAweGI1LCAweGJkLCAweDU1LCAweDNhLCAweGFiLAotCTB4NzMsIDB4ODMsIDB4ZmIsIDB4OWEsIDB4OTEsIDB4ODYsIDB4MmYsIDB4YzcsIDB4OWQsIDB4OGYsIDB4NTMsIDB4MzcsCi0JMHhiNywgMHhjYiwgMHg5OSwgMHg4NSwgMHhiYiwgMHhkNSwgMHhiNywgMHgxMSwgMHhhZiwgMHgyYSwgMHg3NywgMHg5NCwKLQkweDRiLCAweGY1LCAweDgwLCAweDlmLCAweDFmLCAweDJmLCAweGIxLCAweDNkLCAweDEyLCAweGVhLCAweDhhLCAweDNhLAotCTB4Y2IsIDB4M2EsIDB4MjUsIDB4YjksIDB4MWIsIDB4MmYsIDB4YmYsIDB4ZjgsIDB4OWMsIDB4NzYsIDB4YTUsIDB4MTIsCi0JMHg5ZCwgMHg0ZiwgMHg1YSwgMHg3OCwgMHhjNiwgMHhhZSwgMHhlNSwgMHgyOSwgMHhmYSwgMHg2ZSwgMHgzMiwgMHg2NiwKLQkweDQ1LCAweGY3LCAweDY3LCAweDIyLCAweGZjLCAweGZlLCAweGMwLCAweGVmLCAweDc1LCAweDZiLCAweGJmLCAweDEzLAotCTB4ZjAsIDB4N2MsIDB4OGEsIDB4NzgsIDB4ZDcsIDB4NTMsIDB4M2MsIDB4OWYsIDB4YzYsIDB4OWMsIDB4NjYsIDB4MTksCi0JMHg1YywgMHhkOCwgMHhhNCwgMHg5ZSwgMHhlNCwgMHg5OCwgMHhlNywgMHhkMCwgMHgyZiwgMHg0YywgMHhkMCwgMHgwYywKLQkweGVlLCAweGRkLCAweDZhLCAweDRiLCAweGJlLCAweDVjLCAweDc0LCAweDM2LCAweDA2LCAweGU3LCAweDI4LCAweDY0LAotCTB4YmEsIDB4NmMsIDB4ZjEsIDB4ZmUsIDB4MGEsIDB4MzEsIDB4OGMsIDB4NjcsIDB4ODMsIDB4YjIsIDB4YjUsIDB4MTYsCi0JMHhmNSwgMHg1YywgMHgzOSwgMHhkMCwgMHgwZSwgMHgxZCwgMHhiMywgMHhkZCwgMHhkNiwgMHhjYiwgMHhmYiwgMHgwYSwKLQkweGNhLCAweGJjLCAweGEwLCAweGY2LCAweDIxLCAweGQyLCAweDcxLCAweGY0LCAweDdkLCAweGFlLCAweDU1LCAweDk2LAotCTB4YzMsIDB4YmIsIDB4YWQsIDB4YzUsIDB4OGEsIDB4ZWYsIDB4YmYsIDB4ODMsIDB4M2MsIDB4ZmMsIDB4MzQsIDB4NzQsCi0JMHg1ZiwgMHhhZSwgMHhmZiwgMHhjYywgMHg1ZiwgMHg0ZSwgMHhmMSwgMHg2ZiwgMHhhNSwgMHgyMiwgMHg5YiwgMHhkOCwKLQkweGQxLCAweGNiLCAweDdiLCAweDIwLCAweGY4LCAweDk2LCAweDFjLCAweGFmLCAweDg3LCAweDY1LCAweGJmLCAweDcwLAotCTB4OWMsIDB4N2QsIDB4ZmYsIDB4MGQsIDB4YmUsIDB4N2QsIDB4ZmYsIDB4ZjQsIDB4YWEsIDB4OWQsIDB4MDIsIDB4ZmUsCi0JMHgxNywgMHgzMywgMHhlMSwgMHg5YiwgMHhkZCwgMHg5MCwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCTB4MWYsIDB4OGIsIDB4MDgsIDB4MDgsIDB4Y2IsIDB4YTMsIDB4NDYsIDB4NDUsIDB4MDAsIDB4MDMsIDB4NzQsIDB4NjUsCisJMHg3MywgMHg3NCwgMHgzMSwgMHgyZSwgMHg2MiwgMHg2OSwgMHg2ZSwgMHgwMCwgMHhlYywgMHg1YywgMHg2ZiwgMHg2YywKKwkweDFjLCAweGM3LCAweDc1LCAweDdmLCAweDNiLCAweGJiLCAweGE0LCAweDRlLCAweGQ0LCAweDkxLCAweDVjLCAweDFlLAorCTB4NGYsIDB4ZjQsIDB4NDksIDB4NjYsIDB4OTQsIDB4NWQsIDB4NzEsIDB4MjUsIDB4NWUsIDB4MmQsIDB4YzYsIDB4NWQsCisJMHgzMSwgMHg1NywgMHg5YiwgMHgwOCwgMHhjZSwgMHhmMSwgMHg3OSwgMHhlZiwgMHg2NCwgMHhiMSwgMHg4NiwgMHgwYSwKKwkweDUxLCAweDBkLCAweDFkLCAweDFiLCAweDg1LCAweDZiLCAweGIwLCAweDQ3LCAweDM5LCAweGFlLCAweGRiLCAweDdlLAorCTB4OTAsIDB4NjUsIDB4MWIsIDB4MzAsIDB4ZGEsIDB4MTAsIDB4YmUsIDB4MWMsIDB4ZTksIDB4NDYsIDB4NzUsIDB4MmYsCisJMHhkYywgMHg4YiwgMHhjNCwgMHg5OCwgMHgwNiwgMHhmYSwgMHgwNywgMHg1NywgMHg5MiwgMHhmYSwgMHg4MywgMHhlMCwKKwkweGEwLCAweDkzLCAweGUyLCAweDI2LCAweGY1LCAweDE3LCAweDU3LCAweDg0LCAweDJhLCAweGM3LCAweGY5LCAweGUwLAorCTB4MDIsIDB4NGUsIDB4NjMsIDB4MjAsIDB4MDYsIDB4ZWEsIDB4MTYsIDB4YWEsIDB4ZWMsIDB4ZDgsIDB4NDYsIDB4ODEsCisJMHhhMiwgMHg0MiwgMHgxYywgMHhkOCwgMHg0NiwgMHhmYywgMHg2NywgMHhmYiwgMHg3YiwgMHgzMywgMHhiYiwgMHhkNCwKKwkweDkxLCAweDk2LCAweDZkLCAweGEwLCAweDFmLCAweGZhLCAweGE1LCAweDNiLCAweGMwLCAweDYxLCAweDY3LCAweDY2LAorCTB4ZTcsIDB4YmQsIDB4NzksIDB4ZjMsIDB4ZmUsIDB4YmYsIDB4NTksIDB4NGEsIDB4N2YsIDB4OTAsIDB4YTQsIDB4MmUsCisJMHgwYSwgMHg1YiwgMHgzNywgMHg3ZSwgMHhkNiwgMHg5MSwgMHhjNywgMHg4ZiwgMHhkZSwgMHgzYywgMHg3NiwgMHhmMywKKwkweDI4LCAweGQxLCAweDk3LCAweDQ3LCAweGY1LCAweDFiLCAweDEyLCAweDIyLCAweDlhLCAweDhmLCAweDViLCAweGRjLAorCTB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsIDB4ZTIsCisJMHgxNiwgMHhiNywgMHhiOCwgMHhjNSwgMHgyZCwgMHg2ZSwgMHg3MSwgMHg4YiwgMHg1YiwgMHhkYywgMHhlMiwgMHgxNiwKKwkweGI3LCAweGI4LCAweGM1LCAweDJkLCAweDZlLCAweDcxLCAweDhiLCAweDViLCAweGRjLCAweGUyLCAweDE2LCAweGI3LAorCTB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsIDB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsCisJMHhjNSwgMHgyZCwgMHg2ZSwgMHg3MSwgMHg4YiwgMHg1YiwgMHhkYywgMHhlMiwgMHgxNiwgMHhiNywgMHhiOCwgMHhjNSwKKwkweDJkLCAweDZlLCAweDcxLCAweGZiLCAweGZmLCAweGRlLCAweDc0LCAweDIyLCAweDkzLCAweDlmLCAweGRkLCAweGUxLAorCTB4OGYsIDB4MTIsIDB4MjIsIDB4YmYsIDB4ZmEsIDB4OTAsIDB4ZTcsIDB4NTAsIDB4NDIsIDB4Y2YsIDB4YmYsIDB4MzQsCisJMHgzMywgMHhlZCwgMHgxMCwgMHgxNSwgMHg5YSwgMHg3YiwgMHhhYywgMHgyMiwgMHg3ZCwgMHgxNCwgMHg1NCwgMHhkMiwKKwkweDA2LCAweGYxLCAweGZjLCAweDE3LCAweGYyLCAweDFmLCAweDNlLCAweGYxLCAweGZjLCAweGFkLCAweGY2LCAweGQ1LAorCTB4ODYsIDB4NGUsIDB4MDksIDB4MzMsIDB4M2YsIDB4YjcsIDB4ZDcsIDB4ZGMsIDB4NGQsIDB4ODksIDB4NDEsIDB4YzAsCisJMHhmYywgMHhmNSwgMHhmMCwgMHg3ZiwgMHhmNCwgMHg1MCwgMHgwZiwgMHg1ZCwgMHhjMywgMHhlMywgMHgyNCwgMHhlOCwKKwkweGIyLCAweGZlLCAweDljLCAweGU2LCAweGI1LCAweDgyLCAweGUwLCAweGE0LCAweDFiLCAweDA0LCAweDNmLCAweGM2LAorCTB4ZWYsIDB4MmQsIDB4MTcsIDB4NjMsIDB4ZmYsIDB4ZTMsIDB4YTAsIDB4NjAsIDB4ZTgsIDB4MjQsIDB4OWMsIDB4YmYsCisJMHhkNCwgMHhiYywgMHhlNSwgMHgyZSwgMHhhYSwgMHgyZSwgMHgxYSwgMHgzNCwgMHhlYiwgMHhhNywgMHhlOSwgMHg5OCwKKwkweDVmLCAweGQxLCAweDRhLCAweGFkLCAweDlhLCAweGI2LCAweGVmLCAweGY0LCAweGJjLCAweDc2LCAweGU3LCAweGU5LAorCTB4NjMsIDB4ZGEsIDB4ZmUsIDB4ZDMsIDB4NzUsIDB4Y2QsIDB4M2IsIDB4NGQsIDB4MTUsIDB4YjEsIDB4MzcsIDB4NDksCisJMHgwNSwgMHhmMywgMHg4YywgMHg1NiwgMHg2YywgMHgwZCwgMHg2OCwgMHhkZSwgMHg4OSwgMHgwZiwgMHhjOSwgMHg3MywKKwkweDZkLCAweGYzLCAweGY3LCAweGM4LCAweDI4LCAweDgwLCAweDE2LCAweGYyLCAweDZhLCAweDQxLCAweGUwLCAweGI5LAorCTB4MDYsIDB4MTUsIDB4ZDIsIDB4NDEsIDB4MjAsIDB4ZjIsIDB4YzEsIDB4MTMsIDB4NWUsIDB4Y2UsIDB4MzEsIDB4ODUsCisJMHg5NiwgMHhhNiwgMHg2YSwgMHg2YiwgMHgwMCwgMHg3OCwgMHg5MywgMHg1YSwgMHg3MSwgMHhkMSwgMHhkMCwgMHg0YSwKKwkweDdlLCAweDcwLCAweGMxLCAweDczLCAweDY5LCAweDUwLCAweGE3LCAweDIwLCAweDk4LCAweDczLCAweDc3LCAweDY1LAorCTB4MGUsIDB4ZDMsIDB4MjksIDB4ZTAsIDB4NmQsIDB4MDIsIDB4MWYsIDB4OTksIDB4MjIsIDB4Y2YsIDB4ZjQsIDB4MzEsCisJMHg5ZCwgMHg0YywgMHg3MiwgMHg0NSwgMHgyYiwgMHgwZSwgMHg0NywgMHhmNCwgMHg5MSwgMHhjNSwgMHhmNCwgMHg5NywKKwkweDU3LCAweDA0LCAweGU4LCAweGRjLCAweDQyLCAweGU1LCAweDg2LCAweDQ5LCAweDUzLCAweDJiLCAweDFiLCAweGQ3LAorCTB4NWYsIDB4MGUsIDB4OWUsIDB4MWYsIDB4MzYsIDB4ZTksIDB4NWMsIDB4Y2IsIDB4YWUsIDB4NTQsIDB4MjgsIDB4NDEsCisJMHg3MywgMHhiZSwgMHg0NSwgMHgyMiwgMHg0ZiwgMHgwNSwgMHgyZiwgMHgzNywgMHg0OCwgMHgxNywgMHg1YSwgMHgxOSwKKwkweGZhLCAweDQxLCAweGNiLCAweGM5LCAweDU0LCAweDY5LCAweDEzLCAweDk1LCAweGQzLCAweDY5LCAweDNhLCAweGRmLAorCTB4NGEsIDB4ZTMsIDB4OGMsIDB4YzEsIDB4MDUsIDB4ZTEsIDB4MzgsIDB4NjYsIDB4MTUsIDB4NmIsIDB4YWIsIDB4YWQsCisJMHg5NywgMHhmOCwgMHhkZiwgMHhiZiwgMHg5OCwgMHhkMywgMHgzOSwgMHgwOSwgMHg1MywgMHgwMSwgMHhkZCwgMHhlMSwKKwkweDVhLCAweDNlLCAweDg3LCAweDVjLCAweDJiLCAweGNmLCAweGEyLCAweGQ2LCAweDUyLCAweDY1LCAweDNhLCAweDg3LAorCTB4YjksIDB4ZDYsIDB4MWQsIDB4NmIsIDB4ZmMsIDB4MmQsIDB4YTQsIDB4ZjksIDB4NjksIDB4NTIsIDB4ZDUsIDB4ZWYsCisJMHgwMCwgMHg2ZiwgMHhiOCwgMHgzZiwgMHg4OCwgMHhiMywgMHhlZSwgMHhkMCwgMHhiYywgMHhjNSwgMHg3ZiwgMHg2NSwKKwkweGJjLCAweDY5LCAweDQxLCAweDNiLCAweDMwLCAweDFlLCAweGM0LCAweDk4LCAweGZiLCAweGJiLCAweDMyLCAweDY1LAorCTB4MDIsIDB4OGYsIDB4NWIsIDB4NDksIDB4OGMsIDB4OTksIDB4Y2UsIDB4MjAsIDB4ZDgsIDB4ZWYsIDB4OTIsIDB4NTksCisJMHg3NSwgMHg3YiwgMHgwMSwgMHg2YiwgMHg1MSwgMHhkNSwgMHhlZCwgMHgwMSwgMHhiZSwgMHgwZSwgMHhlYSwgMHg3MywKKwkweGY4LCAweDdjLCAweGJjLCAweGU3LCAweDY2LCAweGNjLCAweDA3LCAweGRkLCAweDdhLCAweDNlLCAweDA4LCAweGE2LAorCTB4NzMsIDB4ZDQsIDB4YTMsIDB4ZTYsIDB4ZjYsIDB4NDgsIDB4MWMsIDB4NTMsIDB4MTMsIDB4MWEsIDB4ZDYsIDB4YmQsCisJMHhjMywgMHg3YiwgMHgyNCwgMHg1MiwgMHg3OSwgMHhlZSwgMHhmMywgMHgzMywgMHg0NywgMHhkZSwgMHhmYywgMHg4ZSwKKwkweDkwLCAweGE2LCAweDBjLCAweDY4LCAweGJhLCAweDMxLCAweGVjLCAweDQzLCAweDBlLCAweDNlLCAweGY4LCAweGUxLAorCTB4ZGUsIDB4ODAsIDB4YjEsIDB4ZjYsIDB4NDUsIDB4ZTAsIDB4YzksIDB4NTYsIDB4ODksIDB4ZjcsIDB4ZTgsIDB4YTcsCisJMHhhNSwgMHgzNCwgMHg4OSwgMHgyYiwgMHg2ZSwgMHg1ZiwgMHhiOCwgMHhhZSwgMHgwNywgMHhiNCwgMHg0NiwgMHhmYSwKKwkweDMwLCAweDQwLCAweDczLCAweDhiLCAweGNjLCAweGYzLCAweDFhLCAweDY0LCAweDI0LCAweDY4LCAweGU3LCAweDJkLAorCTB4MTUsIDB4YWQsIDB4ZDAsIDB4M2EsIDB4ODYsIDB4YmUsIDB4NDEsIDB4ZDMsIDB4NGUsIDB4NzAsIDB4NjEsIDB4Y2UsCisJMHg5ZCwgMHhkNywgMHg4YSwgMHhhNywgMHg0ZiwgMHg2OSwgMHhhNSwgMHhkMywgMHhjZiwgMHg2OSwgMHhmYiwgMHg1YSwKKwkweDJmLCAweDc2LCAweDUzLCAweDk3LCAweDhkLCAweGQzLCAweDI3LCAweGU4LCAweDQ5LCAweDVmLCAweDIzLCAweGE2LAorCTB4NzMsIDB4MDksIDB4M2MsIDB4MmMsIDB4OTgsIDB4MTUsIDB4MzIsIDB4OWMsIDB4MWUsIDB4ZWQsIDB4NGUsIDB4ZTAsCisJMHhlOSwgMHg3MCwgMHhmZSwgMHgyYywgMHg0OSwgMHgzZCwgMHgzYSwgMHg2ZCwgMHg3MiwgMHhhMiwgMHhiNSwgMHg2OSwKKwkweGZhLCAweDczLCAweGQwLCAweDc0LCAweGQxLCAweGRkLCAweGNhLCAweDdjLCAweGViLCAweDU1LCAweDMwLCAweGE5LAorCTB4OTAsIDB4MGUsIDB4ZDYsIDB4MmYsIDB4OTYsIDB4OWYsIDB4NmQsIDB4N2EsIDB4YmEsIDB4YTAsIDB4ZDIsIDB4YzIsCisJMHg1ZiwgMHhmNCwgMHg1NywgMHg0NywgMHhiNiwgMHhmMCwgMHgzYSwgMHhkOCwgMHhjMiwgMHhkNSwgMHg4NywgMHhhNiwKKwkweDFkLCAweGFmLCAweGNmLCAweGEwLCAweDhhLCAweDI5LCAweGM4LCAweDM2LCAweDhiLCAweGY0LCAweDQ1LCAweDlhLAorCTB4NzMsIDB4ODksIDB4OGEsIDB4MzUsIDB4ZWMsIDB4ZWIsIDB4MTgsIDB4ZTAsIDB4OGYsIDB4MDMsIDB4ZmUsIDB4ZWMsCisJMHhhYSwgMHhlOCwgMHhlMiwgMHgxZSwgMHhhMCwgMHhhOSwgMHg2OCwgMHg0NiwgMHhjOCwgMHhjYiwgMHgyNSwgMHhiYSwKKwkweDRiLCAweGMyLCAweDhiLCAweGJjLCAweDBiLCAweDVkLCAweGVkLCAweGUyLCAweDNlLCAweGY2LCAweDRlLCAweGM4LAorCTB4YmQsIDB4ZjUsIDB4YmMsIDB4OTMsIDB4NTksIDB4MjYsIDB4ZDIsIDB4NDQsIDB4N2UsIDB4MGYsIDB4ZjAsIDB4YjEsCisJMHgwZSwgMHhmMywgMHhiYSwgMHg3OSwgMHhkMCwgMHhjOSwgMHhmNCwgMHg3MywgMHhkZiwgMHgwMSwgMHg0YywgMHgwMiwKKwkweGZhLCAweGRlLCAweGRkLCAweDQ2LCAweDJiLCAweGU4LCAweDQ5LCAweDMzLCAweGJmLCAweDk5LCAweDdmLCAweGYyLAorCTB4YWMsIDB4ZGEsIDB4YjUsIDB4YjMsIDB4N2UsIDB4MTAsIDB4MGMsIDB4OGYsIDB4MWEsIDB4ZjQsIDB4NjMsIDB4NzksCisJMHg2NiwgMHhiNiwgMHgzNywgMHg1ZSwgMHg5NywgMHgwZSwgMHhmNSwgMHgyMywgMHgwMSwgMHg5ZCwgMHgyMiwgMHhhZCwKKwkweGVjLCAweDlhLCAweDZiLCAweGI4LCAweGNhLCAweDQ0LCAweDQyLCAweGNmLCAweDI3LCAweGE5LCAweDI4LCAweGU5LAorCTB4MWIsIDB4YzMsIDB4NWUsIDB4NmMsIDB4ODcsIDB4YjAsIDB4MjcsIDB4ODcsIDB4Y2YsIDB4YzIsIDB4NzMsIDB4NzksCisJMHhkOCwgMHhiYiwgMHhjZCwgMHg3ZCwgMHgyYSwgMHhkNywgMHhkOSwgMHhmNiwgMHg5OSwgMHhiNiwgMHg1NSwgMHg1YiwKKwkweGZlLCAweGQzLCAweDJjLCAweDg5LCAweDRmLCAweDBjLCAweGU4LCAweGQ0LCAweDRiLCAweDEzLCAweGVlLCAweDg3LAorCTB4ODEsIDB4ZDgsIDB4OGQsIDB4ZjcsIDB4MjMsIDB4MTksIDB4ZDAsIDB4NjYsIDB4NWIsIDB4YjAsIDB4Y2EsIDB4OTQsCisJMHg0ZSwgMHgxYSwgMHhlOCwgMHhkZSwgMHg5MywgMHgzMSwgMHhjOSwgMHhjMSwgMHhkOSwgMHhjMCwgMHhkZiwgMHg4OSwKKwkweDU1LCAweDMwLCAweGZmLCAweGQzLCAweGU4LCAweDU0LCAweDc4LCAweDQxLCAweDY2LCAweGMxLCAweDAzLCAweDhkLAorCTB4OWUsIDB4ZmIsIDB4NjUsIDB4YzksIDB4MzMsIDB4MTMsIDB4ZTcsIDB4ZDcsIDB4ZTcsIDB4OTksIDB4YmYsIDB4NWQsCisJMHhiMCwgMHgwYiwgMHg4ZCwgMHhjYSwgMHgyZSwgMHhlMywgMHg4ZSwgMHg3MCwgMHgwOCwgMHgxYSwgMHhiZSwgMHhhNSwKKwkweDFkLCAweDQ3LCAweDI0LCAweDVmLCAweGQ2LCAweDVkLCAweDgzLCAweDQ2LCAweDQ3LCAweDc5LCAweDJkLCAweGFmLAorCTB4ZTMsIDB4ZjUsIDB4ZjYsIDB4OTgsIDB4MjUsIDB4M2UsIDB4MDgsIDB4ZjYsIDB4YWUsIDB4ZGIsIDB4ZDMsIDB4MjEsCisJMHgzMSwgMHgwZiwgMHg5YSwgMHg5NSwgMHgyYywgMHhjMCwgMHhjMywgMHhjZiwgMHg1YiwgMHhjYiwgMHg3MiwgMHhkOCwKKwkweGM4LCAweDZmLCAweDVlLCAweGRiLCAweGJlLCAweDBlLCAweGZhLCAweDNjLCAweGMwLCAweDM0LCAweDljLCAweDRjLAorCTB4MmEsIDB4M2IsIDB4OGQsIDB4NjgsIDB4OGEsIDB4NjQsIDB4YTksIDB4ODUsIDB4MzgsIDB4M2UsIDB4ZWIsIDB4MWMsCisJMHhiYywgMHgxZSwgMHhmZSwgMHhjMywgMHg4NywgMHhmZiwgMHg4MCwgMHg0ZiwgMHgzYywgMHhlZiwgMHhjMywgMHhiZiwKKwkweGY4LCAweGVjLCAweDZmLCAweDJjLCAweDdhLCAweDdlLCAweDE4LCAweGZlLCAweGYxLCAweDlhLCAweDdmLCAweDQyLAorCTB4MWIsIDB4NDcsIDB4NWYsIDB4OTAsIDB4MGUsIDB4ZmYsIDB4MzQsIDB4ZGIsIDB4MTAsIDB4YjAsIDB4NzMsIDB4ZjgsCisJMHg4YSwgMHgxNSwgMHg5ZSwgMHg4MywgMHg1ZiwgMHg1OCwgMHgyOSwgMHhlMSwgMHhlOSwgMHg1MCwgMHhiNSwgMHhjOSwKKwkweDdhLCAweDE4LCAweGY5LCAweDYxLCAweGY2LCAweDU3LCAweDE5LCAweGY4LCAweDI2LCAweGY2LCAweDQ3LCAweGVjLAorCTB4YjcsIDB4NzgsIDB4NmQsIDB4MTAsIDB4OTQsIDB4NWMsIDB4ODYsIDB4MGQsIDB4MjAsIDB4NDcsIDB4YjYsIDB4YmIsCisJMHgyNCwgMHg4OSwgMHg1NCwgMHg0NSwgMHgzYiwgMHgzNCwgMHgwYywgMHg3YiwgMHhiYywgMHg4OSwgMHg3ZCwgMHgwYiwKKwkweGRiLCAweGU1LCAweDhkLCAweDQ0LCAweDlkLCAweGJjLCAweGRmLCAweGFmLCAweGJiLCAweGQ1LCAweGJmLCAweGQ5LAorCTB4ZGIsIDB4ODQsIDB4MzUsIDB4ZjIsIDB4ZDksIDB4YTMsIDB4YzYsIDB4NjYsIDB4ZTgsIDB4OTcsIDB4ZjgsIDB4YmQsCisJMHg2ZCwgMHgxNSwgMHg2OCwgMHg1NywgMHgzOCwgMHhlNiwgMHhmZSwgMHgxYSwgMHhiZCwgMHhhZSwgMHhiOCwgMHgyNSwKKwkweDQxLCAweDNiLCAweDRmLCAweDI5LCAweDdmLCAweGJhLCAweDczLCAweDA5LCAweDlhLCAweDcxLCAweDRhLCAweGQxLAorCTB4YjgsIDB4ZjMsIDB4NmMsIDB4ZTQsIDB4NTcsIDB4OTMsIDB4YzAsIDB4MDcsIDB4ZmEsIDB4ZmMsIDB4YjUsIDB4MTgsCisJMHg4MiwgMHhmNiwgMHg5ZSwgMHgwNiwgMHhkMywgMHhjMiwgMHhkYywgMHg0NiwgMHg1ZSwgMHhiMCwgMHgyZiwgMHg2NywKKwkweGZiLCAweDM0LCAweGRiLCAweGVkLCAweDczLCAweDJmLCAweGVjLCAweGQzLCAweGVkLCAweDI0LCAweGRiLCAweGZkLAorCTB4MjcsIDB4ZDgsIDB4ZTcsIDB4YjcsIDB4NWQsIDB4MGQsIDB4YmMsIDB4MjEsIDB4YmEsIDB4NTQsIDB4Y2IsIDB4YzAsCisJMHgzZiwgMHgxOCwgMHg5OSwgMHhkNywgMHg2OSwgMHg5NywgMHgzNSwgMHgwYiwgMHhiZCwgMHgzYywgMHhjOSwgMHg3MywKKwkweDRkLCAweGNjLCAweDQ5LCAweDNmLCAweGFlLCAweGZjLCAweGM3LCAweDY1LCAweGZkLCAweGJiLCAweGEwLCAweDJiLAorCTB4MDgsIDB4NjYsIDB4ODEsIDB4YjMsIDB4M2MsIDB4YTIsIDB4ODcsIDB4YjYsIDB4MTgsIDB4Y2QsIDB4NWYsIDB4NDUsCisJMHgzYywgMHhmNCwgMHg3ZSwgMHg0MywgMHhhNywgMHg0YSwgMHhiNiwgMHg4MywgMHhlYywgMHhlYywgMHgxMiwgMHg3MCwKKwkweDRmLCAweGJiLCAweGNhLCAweGVlLCAweGQ5LCAweDM2LCAweDk2LCAweDgxLCAweDdmLCAweGNlLCAweDFmLCAweDg2LAorCTB4NWYsIDB4NjAsIDB4YmIsIDB4MDEsIDB4NWQsIDB4YzAsIDB4YmYsIDB4MGMsIDB4ZmMsIDB4NzMsIDB4YWQsIDB4MGUsCisJMHhmYSwgMHg5NiwgMHgxMSwgMHhjNSwgMHhkOSwgMHhlOCwgMHgzYywgMHhkYiwgMHhiMCwgMHgyYywgMHhkYSwgMHhmNywKKwkweDA4LCAweGRkLCAweGU1LCAweGE3LCAweGUwLCAweDczLCAweGQ4LCAweDI3LCAweDU3LCAweGIzLCAweGIwLCAweDJiLAorCTB4YWQsIDB4ZWEsIDB4ZjIsIDB4ZGUsIDB4M2EsIDB4MmQsIDB4YWYsIDB4YWQsIDB4YTEsIDB4NDIsIDB4NTUsIDB4ZDksCisJMHg2YywgMHhjMSwgMHgxYiwgMHhhZSwgMHg2NCwgMHg3NCwgMHhlOSwgMHg3YiwgMHg4OCwgMHhlZSwgMHg4NCwgMHhhZCwKKwkweDJlLCAweDNiLCAweDNjLCAweGU2LCAweDc5LCAweDM1LCAweDM3LCAweDVlLCAweDFiLCAweGQwLCAweDhhLCAweGVjLAorCTB4YmYsIDB4ODYsIDB4M2YsIDB4MDQsIDB4N2QsIDB4NmEsIDB4ZWUsIDB4YjcsIDB4NmIsIDB4MGYsIDB4YjEsIDB4OGMsCisJMHg3MCwgMHgxNiwgMHhiMiwgMHhhYSwgMHhlZSwgMHg3ZiwgMHgwNiwgMHhkMCwgMHhkZiwgMHg3NSwgMHgzMCwgMHhkNywKKwkweGM3LCAweDYzLCAweDhmLCAweDJiLCAweDlkLCAweDI1LCAweDZkLCAweGJmLCAweDIzLCAweDA2LCAweDNhLCAweDQzLAorCTB4OWYsIDB4YjcsIDB4MWYsIDB4OTMsIDB4ZmIsIDB4NmEsIDB4ZDUsIDB4ZmUsIDB4NGUsIDB4ZmEsIDB4NTAsIDB4ZTcsCisJMHgxOCwgMHg3YywgMHg4NSwgMHhjOCwgMHhmMCwgMHg2YSwgMHhiYiwgMHhjMSwgMHg4ZiwgMHg2YSwgMHg1ZiwgMHhkYiwKKwkweDVjLCAweGEyLCAweDU0LCAweDBiLCAweGU4LCAweGEyLCAweGFiLCAweDYwLCAweDMwLCAweDRlLCAweDE2LCAweDZiLAorCTB4NjIsIDB4MjAsIDB4NDEsIDB4NmIsIDB4NjMsIDB4OTMsIDB4NjEsIDB4NTYsIDB4NjgsIDB4NzcsIDB4NzYsIDB4OTksCisJMHgyNCwgMHg2YywgMHg3ZiwgMHhlMiwgMHgxYSwgMHg2YywgMHhiYSwgMHg1NCwgMHhhYiwgMHhmNiwgMHhiNSwgMHg4ZCwKKwkweDMzLCAweDQ1LCAweGUwLCAweDEyLCAweDdiLCAweGQ3LCAweDYwLCAweDA3LCAweGFmLCAweGMxLCAweDZlLCAweDI1LAorCTB4YWIsIDB4OGYsIDB4ZTEsIDB4YzUsIDB4YzAsIDB4ZTYsIDB4NmIsIDB4YjgsIDB4YWQsIDB4OTAsIDB4OWUsIDB4ZmUsCisJMHhjZCwgMHhkNywgMHg3MCwgMHgzOCwgMHg4YywgMHhiMywgMHg2ZCwgMHg5YywgMHg2NSwgMHg5YywgMHgzYiwgMHhhZiwKKwkweGUxLCAweDFjLCAweDU5LCAweDRmLCAweGNmLCAweDExLCAweDgyLCAweDBmLCAweDRhLCAweDc0LCAweGU2LCAweDY5LAorCTB4ZWYsIDB4YTUsIDB4ZGEsIDB4ZDAsIDB4YzQsIDB4NWQsIDB4ODQsIDB4ZjgsIDB4MzgsIDB4YjIsIDB4MjksIDB4ZjQsCisJMHhlMSwgMHhjNiwgMHg1ZSwgMHgwZiwgMHhiYywgMHgzMiwgMHg4OCwgMHg3ZCwgMHhhMiwgMHg0NiwgMHg1NSwgMHhjOCwKKwkweGY5LCAweDhmLCAweDlhLCAweGI0LCAweGY3LCAweDYyLCAweGQzLCAweDA4LCAweDc1LCAweDg5LCAweDc1LCAweGUyLAorCTB4NmQsIDB4ZDgsIDB4NTgsIDB4NzIsIDB4Y2EsIDB4NDAsIDB4MGMsIDB4YmYsIDB4MjAsIDB4NmQsIDB4OGMsIDB4MjYsCisJMHhhYSwgMHgzNSwgMHhhYSwgMHg2YywgMHhjZiwgMHgzZiwgMHgxMSwgMHg0MCwgMHgxNywgMHhhNywgMHhlMCwgMHhkMywKKwkweGMwLCAweGUzLCAweGU0LCAweDk4LCAweDk3LCAweGMzLCAweDdjLCAweDkzLCAweDZkLCAweDBiLCAweDdlLCAweDA1LAorCTB4YjAsIDB4ZDAsIDB4YjUsIDB4ODQsIDB4M2UsIDB4YmYsIDB4ZWIsIDB4NTUsIDB4NGYsIDB4ZTcsIDB4N2QsIDB4MmMsCisJMHhlNCwgMHg1YywgMHg4OSwgMHg4NCwgMHg5OCwgMHhiZiwgMHgxYSwgMHhiMCwgMHg5ZSwgMHg0ZCwgMHg4ZiwgMHg1YywKKwkweDQ1LCAweDhlLCAweDYzLCAweDkyLCAweDM3LCAweDA2LCAweGZmLCAweDAxLCAweDdkLCAweDlmLCAweDZkLCAweDExLAorCTB4NzIsIDB4ODIsIDB4M2YsIDB4ZWQsIDB4NTUsIDB4MzYsIDB4ZjYsIDB4OWQsIDB4YWQsIDB4ZWEsIDB4NDksIDB4MDYsCisJMHhmYiwgMHhmMiwgMHhlOSwgMHgxYywgMHhlNywgMHgwZiwgMHg5ZCwgMHgwOSwgMHgyZiwgMHgzNywgMHhiZSwgMHg0ZCwKKwkweDNmLCAweDdiLCAweDYwLCAweDliLCAweDM4LCAweDViLCAweGQ5LCAweDI2LCAweDEwLCAweDAzLCAweDYwLCAweDUzLAorCTB4YzIsIDB4Y2IsIDB4YTEsIDB4N2YsIDB4MzYsIDB4YjIsIDB4YTEsIDB4MGMsIDB4NmMsIDB4ODgsIDB4NjksIDB4NjUsCisJMHgzYSwgMHg3ZiwgMHgwNCwgMHg3YiwgMHg5NSwgMHhiNCwgMHhkMiwgMHg4NCwgMHgwZiwgMHg5YSwgMHg0NiwgMHgzZiwKKwkweDgyLCAweDllLCAweGUwLCAweDJjLCAweGYwLCAweDgxLCAweDA1LCAweDcwLCAweDQ5LCAweDhjLCAweGZlLCAweDJhLAorCTB4YjQsIDB4NjcsIDB4ZWUsIDB4YmYsIDB4MWIsIDB4YTgsIDB4NzgsIDB4NzIsIDB4MzAsIDB4ZGMsIDB4ZmYsIDB4MTcsCisJMHhhMSwgMHgwZiwgMHg4OCwgMHg3MCwgMHgzMSwgMHg5ZSwgMHhhYywgMHgzNiwgMHg4MSwgMHg1YywgMHg2OCwgMHhhMiwKKwkweDY1LCAweDY4LCAweGVjLCAweGNmLCAweDhiLCAweDNlLCAweGU3LCAweDMwLCAweDljLCAweGJmLCAweDNjLCAweDFlLAorCTB4ZmEsIDB4NDUsIDB4Y2UsIDB4NWIsIDB4OTIsIDB4MjEsIDB4NGYsIDB4NzMsIDB4NTEsIDB4NWMsIDB4OTQsIDB4ZjYsCisJMHg4NiwgMHgxOCwgMHg2NSwgMHg5NSwgMHg1ZCwgMHg5OSwgMHhkMywgMHg2OCwgMHhkMywgMHhiOSwgMHgyNCwgMHhkNiwKKwkweDYxLCAweGFlLCAweDg1LCAweDczLCAweGMzLCAweDJmLCAweDIxLCAweDBmLCAweGUyLCAweGRjLCAweDE0LCAweGViLAorCTB4M2IsIDB4NDMsIDB4OWIsIDB4YmYsIDB4NDQsIDB4NjUsIDB4ZjgsIDB4NTQsIDB4YzMsIDB4ZTEsIDB4ZjcsIDB4NWUsCisJMHgyZiwgMHg3NSwgMHg2MSwgMHhkYywgMHhjNCwgMHg1ZSwgMHhmMCwgMHgxMywgMHhiYSwgMHhlNCwgMHgzMywgMHg2MiwKKwkweDQxLCAweGZhLCAweDA2LCAweGNlLCAweGFmLCAweGIwLCAweGQ2LCAweGMyLCAweDVhLCAweGY2LCAweGJiLCAweGJjLAorCTB4ZjYsIDB4M2MsIDB4ZTgsIDB4YzAsIDB4YjgsIDB4YzksIDB4MzAsIDB4ZWMsIDB4YTMsIDB4ODIsIDB4ZjcsIDB4YmMsCisJMHhkYywgMHgxZSwgMHg3MywgMHg4MiwgMHgxMiwgMHgyMSwgMHg1ZSwgMHhhYiwgMHgwZCwgMHhlZiwgMHhjNiwgMHhiNSwKKwkweDljLCAweGQzLCAweDA0LCAweDE3LCAweDc0LCAweDg3LCAweGYxLCAweDQ3LCAweDc5LCAweDE4LCAweGQxLCAweGY0LAorCTB4MDksIDB4ZTQsIDB4NzEsIDB4NGUsIDB4MDcsIDB4ZTIsIDB4MTQsIDB4OGYsIDB4ODYsIDB4NGMsIDB4NzUsIDB4Y2UsCisJMHgwOCwgMHhlNiwgMHg4MSwgMHhmZSwgMHhmNSwgMHhlMywgMHhiYiwgMHg1MywgMHhkNywgMHhmYywgMHgyMywgMHg1YiwKKwkweDE3LCAweDE1LCAweDEwLCAweDFmLCAweGMwLCAweDI3LCAweDZiLCAweDhhLCAweDczLCAweGJmLCAweDYyLCAweDUzLAorCTB4YTIsIDB4YzQsIDB4ZGMsIDB4MTgsIDB4N2MsIDB4YTIsIDB4Y2EsIDB4YTMsIDB4MmUsIDB4ZjgsIDB4MWIsIDB4ZTUsCisJMHg2NiwgMHg4MiwgMHhkNywgMHgwNSwgMHhmMCwgMHhkNywgMHg4MiwgMHhmZSwgMHg4YywgMHgwMywgMHg5NiwgMHg4ZSwKKwkweDAwLCAweDA3LCAweGM3LCAweDZhLCAweDU3LCAweGU0LCAweDUzLCAweDU0LCAweDM2LCAweDM5LCAweGE3LCAweGU4LAorCTB4NjQsIDB4ZmEsIDB4MGEsIDB4NmMsIDB4ZmIsIDB4MjIsIDB4YmYsIDB4MTksIDB4NzMsIDB4ZGMsIDB4N2YsIDB4YWMsCisJMHg1NywgMHhjOSwgMHhhYiwgMHg5YiwgMHhjNywgMHgxMywgMHgyMiwgMHhkZiwgMHhiYiwgMHg2MSwgMHhmZSwgMHg5ZiwKKwkweGJiLCAweDE1LCAweDZkLCAweDcyLCAweDhjLCAweGY5LCAweDdmLCAweGRiLCAweDMwLCAweGZlLCAweGUzLCAweGQ0LAorCTB4ZmEsIDB4ZjEsIDB4ZGQsIDB4ZGIsIDB4NDIsIDB4ZmQsIDB4NDMsIDB4ZmYsIDB4ZjEsIDB4OTAsIDB4NWUsIDB4ZDAsCisJMHhiNiwgMHg0NiwgMHg2YiwgMHg5NCwgMHgyYiwgMHg1MywgMHg1ZCwgMHgyMCwgMHg1ZiwgMHhmNCwgMHg3MiwgMHhiYiwKKwkweGFjLCAweDJhLCAweDZjLCAweGFhLCAweGQ0LCAweDAyLCAweGRkLCAweDZiLCAweDcxLCAweDZjLCAweDZkLCAweDRkLAorCTB4ZTUsIDB4ZGEsIDB4MWEsIDB4ZTUsIDB4ZTcsIDB4NGIsIDB4YWQsIDB4MDAsIDB4NzksIDB4NTYsIDB4N2IsIDB4Y2MsCisJMHhjYiwgMHhhMiwgMHg1ZiwgMHhjMSwgMHgzZSwgMHgwNSwgMHg5YSwgMHhmNiwgMHgyZiwgMHgxNiwgMHg4NCwgMHg3MywKKwkweDRjLCAweGU2LCAweDg5LCAweGMyLCAweDc5LCAweDRhLCAweDJiLCAweDJkLCAweDczLCAweGZlLCAweDA4LCAweDViLAorCTB4NzIsIDB4NjQsIDB4ZGQsIDB4ODAsIDB4OTgsIDB4NzIsIDB4NWMsIDB4MmIsIDB4OWMsIDB4NWUsIDB4NDAsIDB4ZmUsCisJMHhiOCwgMHg4MiwgMHhkZiwgMHgxOSwgMHhmYywgMHg5YSwgMHhmOCwgMHg0NSwgMHhmOSwgMHhmYiwgMHgzMywgMHhjOCwKKwkweGZmLCAweGE1LCAweDdmLCAweDQ1LCAweDJjLCAweDUwLCAweGZiLCAweGZmLCAweDYyLCAweDA1LCAweDNhLCAweGI2LAorCTB4OTAsIDB4YTYsIDB4NmYsIDB4M2IsIDB4YTIsIDB4NWYsIDB4MjgsIDB4OWYsIDB4NTIsIDB4NDAsIDB4ZGUsIDB4NmIsCisJMHhiZSwgMHg0ZCwgMHhiZiwgMHgxMywgMHhlNiwgMHg1MCwgMHg0NCwgMHhhZiwgMHhkNywgMHhjMSwgMHhjNywgMHg5MSwKKwkweGZkLCAweGExLCAweGJlLCAweDY2LCAweDFmLCAweGY0LCAweGE0LCAweGVmLCAweDBjLCAweDczLCAweDI0LCAweGU0LAorCTB4NmEsIDB4MDUsIDB4YjksIDB4ZWEsIDB4ZmIsIDB4ZTAsIDB4OGQsIDB4NDYsIDB4NmYsIDB4NDEsIDB4N2YsIDB4NWUsCisJMHhhZiwgMHg3NywgMHg4MSwgMHgxZSwgMHg4NywgMHhjYSwgMHg5MywgMHhmNiwgMHgxOCwgMHg2OSwgMHg0MywgMHhlNiwKKwkweDI2LCAweGFkLCAweDBiLCAweDM2LCAweDBjLCAweGZiLCAweDk2LCAweDYzLCAweDRhLCAweDc0LCAweGU0LCAweGNmLAorCTB4Y2QsIDB4MmMsIDB4ZDUsIDB4MDQsIDB4ZDYsIDB4MjIsIDB4ZWYsIDB4YzksIDB4YTEsIDB4MGYsIDB4ZDksIDB4NWYsCisJMHhhOSwgMHgzMywgMHg5YywgMHhhMCwgMHgzNywgMHhlYSwgMHgzYSwgMHhiZCwgMHg4OSwgMHhiYywgMHhlYiwgMHgyZCwKKwkweGU3LCAweGRjLCAweDBjLCAweDYyLCAweGQ2LCAweDAwLCAweGUyLCAweDAzLCAweDZhLCAweDk4LCAweDVkLCAweGVjLAorCTB4YTMsIDB4NzcsIDB4MWEsIDB4NzgsIDB4OTYsIDB4ZjAsIDB4YmIsIDB4MTMsIDB4NzksIDB4ZTMsIDB4ZjUsIDB4NjEsCisJMHgzZSwgMHg2ZCwgMHgzZCwgMHhkMywgMHg5NiwgMHgwMCwgMHgwYywgMHhhZiwgMHgzNywgMHg0MCwgMHg1YiwgMHgwZiwKKwkweGU0LCAweDZmLCAweDliLCAweDUzLCAweGY0LCAweGNiLCAweDVlLCAweDk5LCAweGFiLCAweDY4LCAweDNjLCAweGFmLAorCTB4ZmMsIDB4ZDIsIDB4MjcsIDB4ZTcsIDB4OTksIDB4Y2YsIDB4M2EsIDB4NzQsIDB4OWMsIDB4YzcsIDB4ZmMsIDB4OGUsCisJMHhmZCwgMHgyNywgMHhlMywgMHhiMywgMHhjNywgMHgwYSwgMHgzOCwgMHhjYywgMHg5NSwgMHhiYSwgMHhlYSwgMHg0NywKKwkweDczLCAweGE0LCAweDQ1LCAweDMxLCAweDhjLCAweGZkLCAweDYyLCAweDg5LCAweDBhLCAweDkyLCAweGVmLCAweDEzLAorCTB4MjQsIDB4NjUsIDB4YjAsIDB4NGUsIDB4OWUsIDB4OTQsIDB4MzAsIDB4ZjIsIDB4ZjUsIDB4OTksIDB4MzksIDB4ODcsCisJMHhlNSwgMHgwYSwgMHhmZiwgMHg1NiwgMHg4YiwgMHhlNCwgMHhjYSwgMHgzMiwgMHhlYSwgMHhhNCwgMHg2YSwgMHhmZCwKKwkweDI5LCAweGM4LCAweDU1LCAweDg0LCAweGY1LCAweDAxLCAweGVjLCAweDdiLCAweDgxLCAweGU1LCAweDhiLCAweGJhLAorCTB4YjEsIDB4OGUsIDB4YmMsIDB4YTcsIDB4NGUsIDB4MjksIDB4NTUsIDB4ZGYsIDB4MWMsIDB4NDcsIDB4NWQsIDB4MDAsCisJMHhmOSwgMHhkNSwgMHgxNiwgMHg4MCwgMHgwMywgMHgzNiwgMHg1YSwgMHg1YiwgMHhjMSwgMHgxMywgMHhiNSwgMHg0OCwKKwkweGVkLCAweDBjLCAweDllLCAweDgzLCAweDc4LCAweDM2LCAweDU5LCAweDM3LCAweGMzLCAweDNjLCAweGUzLCAweDEzLAorCTB4ZjQsIDB4YzAsIDB4OWUsIDB4NGEsIDB4NmMsIDB4NGYsIDB4ZjQsIDB4OGYsIDB4YWQsIDB4M2MsIDB4ZmQsIDB4NDMsCisJMHg2YiwgMHg4YywgMHg3ZSwgMHhkNCwgMHhjYSwgMHhkMSwgMHgwZiwgMHg1YiwgMHgyZSwgMHhmZCwgMHg3ZCwgMHg2YiwKKwkweDg0LCAweDllLCAweDZkLCAweDY1LCAweGI5LCAweDk2LCAweDQzLCAweGNlLCAweDY0LCAweDcxLCAweGNlLCAweDQ0LAorCTB4MGYsIDB4ZmEsIDB4YjcsIDB4YzMsIDB4ZGUsIDB4NTksIDB4ZmUsIDB4ZTcsIDB4NjYsIDB4MGEsIDB4Y2QsIDB4MjEsCisJMHgyYSwgMHg5ZiwgMHg4MCwgMHg2ZiwgMHg3NiwgMHg2ZiwgMHhlMywgMHgxYSwgMHg5NCwgMHgxZSwgMHg3MywgMHhiOSwKKwkweDg2LCAweGU4LCAweGUwLCAweGY3LCAweGE4LCAweDIzLCAweGUwLCAweGJiLCAweGUxLCAweGNiLCAweGE2LCAweGQyLAorCTB4ZjYsIDB4MzksIDB4NGYsIDB4MWYsIDB4MDgsIDB4N2QsIDB4YzAsIDB4NWQsIDB4MjksIDB4ZWEsIDB4YzIsIDB4NWUsCisJMHhmMCwgMHg3ZiwgMHgxNywgMHg5ZiwgMHg4NiwgMHgwZCwgMHhjOCwgMHgxYSwgMHgyOCwgMHgwMSwgMHg1ZiwgMHhjMywKKwkweDc5LCAweDgwLCAweGMxLCAweDc2LCAweGNjLCAweGY1LCAweDg3LCAweGU1LCAweGU5LCAweDVjLCAweDE3LCAweGIyLAorCTB4M2QsIDB4ZWIsIDB4MDgsIDB4MWEsIDB4MGMsIDB4MzcsIDB4NjksIDB4YjIsIDB4ZGMsIDB4MGMsIDB4ODcsIDB4N2QsCisJMHg2YSwgMHgyMSwgMHhmNCwgMHg2ZiwgMHg4OSwgMHg1MCwgMHgyZiwgMHg0ZCwgMHhjYywgMHgzZiwgMHgxNSwgMHhmYSwKKwkweGUzLCAweDhkLCAweGZiLCAweDIwLCAweDU2LCAweDIwLCAweDk3LCAweDU0LCAweGViLCAweDE4LCAweDU2LCAweDBiLAorCTB4NjEsIDB4ZmIsIDB4YzMsIDB4YjksIDB4MjQsIDB4ZjgsIDB4ZWQsIDB4NTIsIDB4ZDksIDB4N2YsIDB4NDMsIDB4ZTMsCisJMHgxYywgMHg1YiwgMHgzOCwgMHhjYywgMHhmZiwgMHgxMSwgMHg4YywgMHgyZiwgMHg4NywgMHhlMywgMHhhZiwgMHhkMCwKKwkweGY0LCAweDIyLCAweDgxLCAweGQ2LCAweGQ3LCAweGI0LCAweGEyLCAweDFjLCAweDhmLCAweDYxLCAweDJjLCAweDMwLAorCTB4ZDYsIDB4YjksIDB4NmUsIDB4ZTAsIDB4MGMsIDB4MjMsIDB4YzUsIDB4YmEsIDB4MmUsIDB4OWMsIDB4NzEsIDB4ZjAsCisJMHg3MSwgMHgxMiwgMHhiZiwgMHg4MiwgMHhmYywgMHgzZCwgMHhlMiwgMHgwZiwgMHgxNSwgMHhkZSwgMHg0MSwgMHhiYywKKwkweGQwLCAweDNhLCAweGEyLCAweGRjLCAweDY3LCAweDNiLCAweDZhLCAweGNmLCAweDIwLCAweDM4LCAweDg0LCAweDVhLAorCTB4ZGQsIDB4NGEsIDB4MTksIDB4ZjQsIDB4MmYsIDB4ZjMsIDB4YjYsIDB4NzksIDB4NDgsIDB4Y2MsIDB4ZTEsIDB4NGMsCisJMHg0MSwgMHgzMCwgMHhlMSwgMHhkOCwgMHg5NSwgMHg4MiwgMHhlOCwgMHhhNiwgMHg5ZiwgMHgxZiwgMHhlNywgMHhiOCwKKwkweDViLCAweDlmLCAweDc5LCAweDAxLCAweGJhLCAweGQ3LCAweDU4LCAweGU5LCAweGE0LCAweDQ2LCAweGMzLCAweGEwLAorCTB4MmIsIDB4YTMsIDB4NDMsIDB4YTAsIDB4ZDMsIDB4YTQsIDB4NDYsIDB4MzMsIDB4ODUsIDB4NWMsIDB4NmUsIDB4MzMsCisJMHhhMSwgMHgzYywgMHg5NCwgMHgwZSwgMHg0MywgMHhjZiwgMHg2NywgMHhhNSwgMHg4ZiwgMHhmNiwgMHgxYywgMHgzYywKKwkweDliLCAweDFmLCAweGY0LCAweGFlLCAweDNmLCAweDczLCAweDA5LCAweGY0LCAweGY3LCAweGEwLCAweDBhLCAweGQ5LAorCTB4MmUsIDB4ZTUsIDB4NWMsIDB4ZjYsIDB4ODcsIDB4NGMsIDB4NGYsIDB4MjAsIDB4NmUsIDB4MTksIDB4NDMsIDB4ZTYsCisJMHg3ZSwgMHhmMSwgMHhhYiwgMHhlMCwgMHgwZSwgMHg4MywgMHg2NSwgMHhmNywgMHhhYSwgMHhhYywgMHg3NywgMHg2NCwKKwkweDljLCAweGMzLCAweDdlLCAweDRiLCAweDJiLCAweGFmLCAweDgxLCAweDE2LCAweDkzLCAweDllLCAweDZkLCAweDZlLAorCTB4MGYsIDB4YzcsIDB4OTYsIDB4ZTQsIDB4YzUsIDB4YjMsIDB4Y2QsIDB4MmUsIDB4ZmEsIDB4NjEsIDB4NjMsIDB4MGIsCisJMHgyZCwgMHgzNywgMHhmOCwgMHg3ZCwgMHgyNywgMHgyZCwgMHgzNSwgMHg4NiwgMHhhZSwgMHgxZSwgMHgxNSwgMHgwMywKKwkweGI0LCAweDdhLCAweGUzLCAweDRkLCAweGU2LCAweDU3LCAweDA1LCAweGYyLCAweDgyLCAweGM5LCAweDhmLCAweGU5LAorCTB4YmQsIDB4ZDEsIDB4NWUsIDB4ZmEsIDB4ZTksIDB4M2QsIDB4NzYsIDB4ZmQsIDB4N2UsIDB4MDEsIDB4MWIsIDB4MTgsCisJMHg0ZCwgMHhiMiwgMHg2ZCwgMHhhMywgMHhjZiwgMHhmMywgMHhmNiwgMHg1NSwgMHg0YiwgMHhiMCwgMHg2ZSwgMHhmZiwKKwkweDA0LCAweDNjLCAweGI1LCAweDhmLCAweDI5LCAweDNiLCAweDYwLCAweGRjLCAweDhjLCAweDE3LCAweGJhLCAweGUxLAorCTB4YmMsIDB4MDgsIDB4OWMsIDB4NzgsIDB4ZDcsIDB4MWMsIDB4MDIsIDB4YWUsIDB4MTcsIDB4MjUsIDB4MmYsIDB4MGUsCisJMHhiOSwgMHhmNiwgMHg1NSwgMHg0MiwgMHgwZSwgMHg3OSwgMHhjNSwgMHgxOSwgMHhjYSwgMHgwYSwgMHhiMSwgMHg5ZCwKKwkweDFhLCAweDk5LCAweDliLCAweGNjLCAweGYzLCAweGYwLCAweGZmLCAweGE4LCAweGFiLCAweDJhLCAweDk3LCAweGE5LAorCTB4M2UsIDB4NzMsIDB4YzksIDB4NjEsIDB4ZmQsIDB4NjcsIDB4YmYsIDB4ZjEsIDB4MTIsIDB4ZjIsIDB4NGUsIDB4OTMsCisJMHg0ZSwgMHgzNCwgMHhkOSwgMHg1ZiwgMHgzMiwgMHgyZSwgMHhjZSwgMHhmZCwgMHg3NywgMHg5YiwgMHg1ZiwgMHgxMywKKwkweDljLCAweDIzLCAweGUwLCAweDFkLCAweGU2LCAweGY1LCAweDJmLCAweGIxLCAweDljLCAweDNiLCAweDE4LCAweDM2LAorCTB4NmIsIDB4ODksIDB4NjAsIDB4MDMsIDB4OGYsIDB4ODYsIDB4Y2MsIDB4NWQsIDB4ODIsIDB4ZjcsIDB4ZmIsIDB4NmYsCisJMHhlYywgMHhmYiwgMHgyZSwgMHg2OCwgMHgxZCwgMHgwMiwgMHgyYywgMHhlMiwgMHg2NSwgMHhhNiwgMHg3ZCwgMHg4ZiwKKwkweDU3LCAweGU0LCAweDFlLCAweGM3LCAweDliLCAweGM4LCAweGYzLCAweGQ2LCAweGY2LCAweGMwLCAweDVjLCAweDUzLAorCTB4ZTAsIDB4OWMsIDB4ODYsIDB4OTQsIDB4Y2IsIDB4OTUsIDB4NTEsIDB4ZTYsIDB4ZWYsIDB4NmQsIDB4N2QsIDB4OWMsCisJMHg2MywgMHhlYSwgMHhmOSwgMHhiZiwgMHgwOSwgMHhhMiwgMHg1YSwgMHhmMywgMHg5NSwgMHhmOSwgMHg0OSwgMHhmOCwKKwkweGU3LCAweDIwLCAweGE4LCAweGVlLCAweDFlLCAweDUyLCAweDcxLCAweDY4LCAweDkwLCAweGRmLCAweDFmLCAweDkwLAorCTB4YjIsIDB4YTgsIDB4OGEsIDB4NGUsIDB4YmEsIDB4YzMsIDB4YjAsIDB4MDAsIDB4Y2IsIDB4NzMsIDB4MmYsIDB4ODcsCisJMHg3MiwgMHg4NCwgMHgxMSwgMHg3NSwgMHhhMSwgMHhkZiwgMHg4YywgMHhmNCwgMHgzMiwgMHgwNSwgMHgxZCwgMHhkYiwKKwkweDYzLCAweDFlLCAweDBhLCAweDYzLCAweDMyLCAweGM3LCAweGI0LCAweDlmLCAweDQyLCAweGU3LCAweGFjLCAweDE0LAorCTB4ZWIsIDB4NGQsIDB4YWEsIDB4ZWYsIDB4OWEsIDB4ZGUsIDB4ZjAsIDB4YmIsIDB4ZmEsIDB4OGMsIDB4MDcsIDB4ZGEsCisJMHg4YSwgMHgwYiwgMHg5ZCwgMHg1NCwgMHhhYSwgMHgyNywgMHg5MCwgMHgwMywgMHgxOSwgMHgzNCwgMHg5NywgMHhjMywKKwkweDE4LCAweDNhLCAweDU0LCAweDZhLCAweGIwLCAweGNlLCAweDU3LCAweDQyLCAweDlkLCAweDRmLCAweDg2LCAweGI4LAorCTB4NGYsIDB4ODIsIDB4MTcsIDB4YjYsIDB4YjUsIDB4MmEsIDB4YjgsIDB4NzYsIDB4ZGEsIDB4MjYsIDB4ZWIsIDB4NWYsCisJMHgxZCwgMHhiNiwgMHg1YywgMHhhZSwgMHg3MSwgMHhlZCwgMHg4OSwgMHhmYywgMHhkYiwgMHgzYywgMHgzNywgMHgzMywKKwkweGVkLCAweDE4LCAweGEwLCAweDZiLCAweDQ0LCAweDJiLCAweGI3LCAweDFjLCAweGFkLCAweGVjLCAweDMzLCAweDdkLAorCTB4YmIsIDB4NDEsIDB4YjcsIDB4MjYsIDB4NmIsIDB4ZGMsIDB4YTUsIDB4ZDYsIDB4N2IsIDB4YzEsIDB4ZDIsIDB4ZWUsCisJMHg0ZCwgMHhlOCwgMHg0MywgMHhlNywgMHgyNywgMHg1OCwgMHhhZSwgMHg1ZiwgMHg2MCwgMHhiYSwgMHhhYywgMHg4MiwKKwkweDYwLCAweDNlLCAweGE3LCAweGU5LCAweGQ0LCAweGYwLCAweGRmLCAweGY1LCAweDcyLCAweDNlLCAweDc1LCAweDdhLAorCTB4OTgsIDB4ZjEsIDB4ODMsIDB4OGUsIDB4NzQsIDB4OWEsIDB4OTYsIDB4N2QsIDB4ZGUsIDB4YTMsIDB4M2UsIDB4YzMsCisJMHgzYywgMHgyYywgMHgyZiwgMHg5OCwgMHhmNCwgMHg4OCwgMHg5NCwgMHhkYiwgMHg2YiwgMHhkMiwgMHhhNiwgMHhjYiwKKwkweDJiLCAweGIwLCAweGE1LCAweGQ0LCAweDkwLCAweDc5LCAweDk0LCAweGVjLCAweGFiLCAweDE3LCAweDc1LCAweGJiLAorCTB4M2UsIDB4MDUsIDB4N2IsIDB4NWUsIDB4NWEsIDB4ZDQsIDB4NjksIDB4YTcsIDB4YWMsIDB4YjEsIDB4NTgsIDB4MzYsCisJMHhmNiwgMHgzMSwgMHg1OCwgMHg3YywgMHg3OCwgMHhmNiwgMHg0MywgMHg2ZCwgMHg2NywgMHhlZiwgMHhhMSwgMHg0YiwKKwkweDRmLCAweGZmLCAweDE2LCAweDdjLCAweDBkLCAweGYzLCAweGQ1LCAweGIwLCAweDBlLCAweDIzLCAweDlmLCAweDU4LAorCTB4NDAsIDB4ZWUsIDB4NTEsIDB4NDUsIDB4NmUsIDB4NWMsIDB4YzgsIDB4MzAsIDB4NmMsIDB4YzQsIDB4ZWYsIDB4YWQsCisJMHg5MiwgMHhmZiwgMHg0MiwgMHhmMiwgMHg3ZiwgMHgwNywgMHg1NSwgMHhhNSwgMHgwZCwgMHg2NSwgMHhlNCwgMHgzYiwKKwkweDAxLCAweDFjLCAweGVhLCAweDFkLCAweDhmLCAweDkxLCAweDJiLCAweGM5LCAweDc3LCAweGY3LCAweDJhLCAweDM4LAorCTB4ZjYsIDB4MTEsIDB4MTksIDB4N2UsIDB4NzcsIDB4MTQsIDB4N2IsIDB4MzIsIDB4OGYsIDB4YTMsIDB4ZjksIDB4NmUsCisJMHg1MiwgMHgzNiwgMHgxNCwgMHhmMSwgMHgxZCwgMHg4OSwgMHg0NCwgMHgzMywgMHg0ZCwgMHhiZiwgMHg4YiwgMHg5YSwKKwkweDY3LCAweGIyLCAweDM5LCAweDQ4LCAweGE1LCAweGE2LCAweDA1LCAweDE5LCAweGNjLCAweGY0LCAweGYxLCAweGQ5LAorCTB4OGEsIDB4MmIsIDB4MzgsIDB4OGYsIDB4NjAsIDB4NWEsIDB4ZWYsIDB4YTUsIDB4YzMsIDB4N2UsIDB4NDQsIDB4NGYsCisJMHgzMiwgMHhhNCwgMHg2ZiwgMHgzMiwgMHgxYywgMHgyNywgMHg0MiwgMHgxYSwgMHhkYSwgMHhmMSwgMHgyNSwgMHg4MSwKKwkweDBiLCAweDMxLCAweDNlLCAweGY3LCAweDU3LCAweDIxLCAweDFlLCAweGY2LCAweDFmLCAweGEwLCAweDc1LCAweDMyLAorCTB4NDMsIDB4MmIsIDB4M2UsIDB4ZDMsIDB4YjEsIDB4ODUsIDB4YWEsIDB4NjksIDB4ZWUsIDB4MWYsIDB4ODAsIDB4OWUsCisJMHgzMSwgMHg5ZSwgMHg0ZCwgMHg5YywgMHhjNywgMHhhYywgMHhlMywgMHhmMSwgMHg5MSwgMHg2NiwgMHgwNSwgMHgzYywKKwkweDY2LCAweGZlLCAweGYyLCAweGJhLCAweDI0LCAweDJkLCAweDdkLCAweDg1LCAweGU1LCAweGI3LCAweDA3LCAweGY5LAorCTB4M2IsIDB4ZWIsIDB4YzIsIDB4OTYsIDB4NTAsIDB4YWYsIDB4ZDQsIDB4OWUsIDB4YTUsIDB4ODUsIDB4MWUsIDB4YzgsCisJMHg4YSwgMHhmNywgMHhlZCwgMHhhMiwgMHhiYiwgMHg2MSwgMHhlZiwgMHhjNSwgMHgwNiwgMHhlZiwgMHgzZiwgMHgwOSwKKwkweDNkLCAweDdhLCAweDU5LCAweGVlLCAweDVmLCAweDVhLCAweDE5LCAweDA4LCAweGUxLCAweDE5LCAweGI2LCAweDY3LAorCTB4MDMsIDB4NmMsIDB4MjcsIDB4ZWQsIDB4YWIsIDB4OWIsIDB4ZDcsIDB4ODEsIDB4ZmYsIDB4N2QsIDB4YzAsIDB4MGIsCisJMHgzYSwgMHg5OSwgMHg2MywgMHg3OCwgMHhjNiwgMHg4MywgMHg3NSwgMHg4ZCwgMHhmNCwgMHg2NywgMHhlMCwgMHg0OSwKKwkweGM5LCAweDVhLCAweGJlLCAweGQ4LCAweGU4LCAweGE0LCAweDYyLCAweDNkLCAweGMyLCAweGM1LCAweDc4LCAweDNlLAorCTB4NDYsIDB4YWQsIDB4N2IsIDB4OWYsIDB4YzQsIDB4MzUsIDB4MmQsIDB4NzEsIDB4ZTEsIDB4N2QsIDB4ODMsIDB4N2QsCisJMHhjZCwgMHhhZCwgMHg4MCwgMHg0NywgMHhiZCwgMHhlZSwgMHg4MCwgMHhiNiwgMHg1NCwgMHgzNywgMHgyZCwgMHhjOSwKKwkweDdhLCAweGJkLCAweDRiLCAweGY5LCAweDk4LCAweGQ0LCAweDY2LCAweGJjLCAweGRmLCAweDAyLCAweDViLCAweGRmLAorCTB4ODMsIDB4M2MsIDB4YTYsIDB4MDcsIDB4NzMsIDB4ZDYsIDB4ODYsIDB4YjksIDB4OGQsIDB4ZjQsIDB4MjcsIDB4MzYsCisJMHhkMCwgMHhkZiwgMHg4OSwgMHg3NSwgMHhmZCwgMHhkOCwgMHg1MywgMHhhZCwgMHgyYiwgMHg2MSwgMHhkZCwgMHhlYywKKwkweDAyLCAweDZjLCAweDgyLCAweDczLCAweGYzLCAweDM0LCAweGM3LCAweGU0LCAweDFiLCAweDI1LCAweDJkLCAweGIzLAorCTB4MmIsIDB4ZWYsIDB4ZTEsIDB4NWMsIDB4MDMsIDB4ODAsIDB4OGQsIDB4YzYsIDB4OGEsIDB4MGYsIDB4NzUsIDB4ZTAsCisJMHhmOSwgMHg1ZSwgMHg0MywgMHhkZSwgMHg0YiwgMHg0MCwgMHgwNiwgMHg5YiwgMHg1MywgMHg3YywgMHhmNiwgMHg2YSwKKwkweGUzLCAweGYzLCAweDc4LCAweDc2LCAweDYzLCAweDFiLCAweGJmLCAweDk4LCAweDU3LCAweDRjLCAweDJmLCAweGQzLAorCTB4MGEsIDB4M2QsIDB4MjUsIDB4ZDgsIDB4OWIsIDB4OGIsIDB4OWEsIDB4MmYsIDB4YTUsIDB4NTMsIDB4MjksIDB4ODcsCisJMHg3OCwgMHhlZSwgMHhmMywgMHg1ZCwgMHgyZCwgMHhkYiwgMHhlNSwgMHhhMCwgMHhhYSwgMHgwYiwgMHgxYywgMHg4ZSwKKwkweGViLCAweDg2LCAweDNjLCAweGZiLCAweGUxLCAweDE1LCAweGJlLCAweGFmLCAweGI1LCAweDEwLCAweDRmLCAweGVkLAorCTB4MmMsIDB4ZTEsIDB4ZWMsIDB4MGYsIDB4YWYsIDB4MzgsIDB4ZjQsIDB4NjgsIDB4MzMsIDB4NGIsIDB4NDcsIDB4OWIsCisJMHhiNiwgMHg3OSwgMHgzZiwgMHg3YywgMHg0MCwgMHg3OSwgMHhlZCwgMHgxZSwgMHg3NywgMHg1NywgMHg4YSwgMHhmZCwKKwkweDk2LCAweDgxLCAweDljLCAweGIzLCAweGMzLCAweDUxLCAweDM5LCAweDQ4LCAweDk1LCAweGViLCAweGIxLCAweDA1LAorCTB4OWIsIDB4ZWYsIDB4NjgsIDB4Y2MsIDB4MDYsIDB4NmQsIDB4Y2MsIDB4NTMsIDB4ZmUsIDB4MmYsIDB4NzMsIDB4MTQsCisJMHhkZSwgMHg5ZiwgMHhmZCwgMHgzNCwgMHg3MiwgMHgxMiwgMHgxZiwgMHgzOSwgMHg4OSwgMHg4ZiwgMHg5YywgMHhjNCwKKwkweDQ3LCAweDRlLCAweGUyLCAweDIzLCAweDI3LCAweGYxLCAweDkxLCAweDkzLCAweGY4LCAweGM4LCAweDQ5LCAweDdjLAorCTB4ZTQsIDB4MjQsIDB4YzgsIDB4ZmYsIDB4NTUsIDB4NWQsIDB4MzAsIDB4OGUsIDB4NWMsIDB4MWIsIDB4ZmUsIDB4Y2IsCisJMHhmZiwgMHg2YSwgMHg5OCwgMHg1MywgMHg0NCwgMHgzMSwgMHg5OSwgMHhlNywgMHg1NiwgMHgzNywgMHg3OSwgMHg2ZSwKKwkweDc0LCAweDRmLCAweDdjLCAweDAwLCAweDczLCAweDEzLCAweDYxLCAweGVlLCAweGMzLCAweDZiLCAweGEyLCAweDk4LAorCTB4Y2QsIDB4ZWIsIDB4NjgsIDB4Y2MsIDB4NDMsIDB4YmQsIDB4NTksIDB4OTgsIDB4ZTQsIDB4ZGMsIDB4NDgsIDB4YzUsCisJMHgyYSwgMHg5NSwgMHg5NywgMHhiZiwgMHg4YSwgMHhmYywgMHhjOCwgMHg0MiwgMHg3ZSwgMHgzNCwgMHg4OCwgMHg1YywKKwkweDg4LCAweGVmLCAweGI1LCAweGEzLCAweGZiLCAweGEzLCAweDgyLCAweDc2LCAweGM4LCAweDFmLCAweGQ3LCAweGJlLAorCTB4ZTYsIDB4NzMsIDB4ZGUsIDB4ZWUsIDB4NTgsIDB4NjUsIDB4MjEsIDB4MTYsIDB4ZmEsIDB4MjksIDB4YTAsIDB4ZTIsCisJMHhlOCwgMHhiNywgMHg5MCwgMHgyMywgMHg3ZiwgMHg0ZiwgMHhkZSwgMHg5NSwgMHg0ZCwgMHgwYywgMHhiMywgMHhjYywKKwkweDI3LCAweDNlLCAweDI1LCAweDRmLCAweDhlLCAweGY4LCAweGFiLCAweGVlLCAweGY4LCAweGM0LCAweDEyLCAweGYzLAorCTB4OGYsIDB4YTgsIDB4ZWYsIDB4MmMsIDB4MTgsIDB4N2UsIDB4MzYsIDB4NDEsIDB4YTksIDB4NTMsIDB4NWIsIDB4MzAsCisJMHg2NywgMHg1MiwgMHhiZiwgMHhiYywgMHgyNywgMHg4MiwgMHgyOCwgMHhjZiwgMHhmZSwgMHgxYSwgMHhmMiwgMHg3MiwKKwkweDQ4LCAweDljLCAweGU1LCAweGRiLCAweDA0LCAweGM2LCAweGNiLCAweGZlLCAweGI1LCAweDMyLCAweDUzLCAweDZjLAorCTB4NTQsIDB4YTQsIDB4NGUsIDB4MWQsIDB4NmEsIDB4OTYsIDB4OTAsIDB4M2YsIDB4ZjUsIDB4ZjYsIDB4NTMsIDB4OTcsCisJMHg4MSwgMHgxYSwgMHgyYSwgMHhjMiwgMHhjZCwgMHgzOCwgMHg3ZiwgMHg5OSwgMHg5MiwgMHhiNSwgMHhjZCwgMHhkOSwKKwkweDM1LCAweDc5LCAweDQyLCAweGQ2LCAweGJjLCAweDRmLCAweDY1LCAweGE2LCAweDVhLCAweGI3LCAweDMzLCAweDVjLAorCTB4ZDcsIDB4ODIsIDB4ZDYsIDB4OTksIDB4MjcsIDB4ODEsIDB4NjMsIDB4MTksIDB4MzksIDB4ODEsIDB4MmUsIDB4ZjcsCisJMHhhZSwgMHhjYywgMHhjYywgMHhkNiwgMHhkNSwgMHg1ZCwgMHg5NSwgMHhhMiwgMHgwMSwgMHhmMSwgMHgyZiwgMHhkNywKKwkweDQ1LCAweGZhLCAweDkyLCAweGJhLCAweGIzLCAweDEyLCAweDEyLCAweDk2LCAweGUxLCAweDE4LCAweGRlLCAweDAwLAorCTB4MWMsIDB4Y2IsIDB4MmQsIDB4MGIsIDB4NTgsIDB4OTYsIDB4MWQsIDB4ZDMsIDB4NTAsIDB4OTksIDB4YTksIDB4MzQsCisJMHhkYSwgMHg2OSwgMHg2MCwgMHgzYywgMHg4YywgMHgzNywgMHgzYSwgMHgwZiwgMHg5ZiwgMHgyNSwgMHg0NSwgMHhlMiwKKwkweDU0LCAweDEwLCAweDk0LCAweDQ3LCAweDA3LCAweGMzLCAweDNhLCAweDEyLCAweGY1LCAweGUzLCAweDA5LCAweDQzLAorCTB4ZWEsIDB4YjksIDB4MWEsIDB4N2YsIDB4NTMsIDB4YzYsIDB4MjksIDB4NGIsIDB4ZjAsIDB4M2MsIDB4M2YsIDB4ZjEsCisJMHgyZSwgMHhmNywgMHgyNCwgMHhlNiwgMHgzMCwgMHg1ZSwgMHg4ZSwgMHhkNiwgMHg4YSwgMHg3MCwgMHg2ZCwgMHg3NywKKwkweDFiLCAweDNmLCAweDNiLCAweGMyLCAweGZkLCAweDk4LCAweDI2LCAweDNlLCAweGU3LCAweDY1LCAweGVjLCAweGM1LAorCTB4NzQsIDB4ZjEsIDB4MWEsIDB4MTMsIDB4YjQsIDB4NDEsIDB4OTYsIDB4ZmUsIDB4ZmYsIDB4OTYsIDB4ZjcsIDB4ZWQsCisJMHg2NywgMHg2MiwgMHg5ZSwgMHgxYSwgMHg4MCwgMHhlMSwgMHhmNSwgMHg4YywgMHgyMywgMHg4MiwgMHhjMSwgMHg4YiwKKwkweGIzLCAweDBhLCAweDRlLCAweGFjLCAweGRkLCAweGVkLCAweDdkLCAweGQ2LCAweGJlLCAweGVkLCAweGI0LCAweDQ2LAorCTB4ZmIsIDB4NDcsIDB4NzgsIDB4YjIsIDB4NGEsIDB4NmUsIDB4NmIsIDB4ZjAsIDB4ZjIsIDB4ZmYsIDB4MGEsIDB4YzMsCisJMHgxMywgMHhiYSwgMHhmOCwgMHg4OSwgMHgzYiwgMHhkMiwgMHg2YywgMHg1YiwgMHg2ZCwgMHgxYywgMHhkZCwgMHgzNSwKKwkweDcwLCAweGNkLCAweGNmLCAweDM1LCAweDNjLCAweDdmLCAweDQ3LCAweDY4LCAweGFmLCAweDRiLCAweDRiLCAweDYxLAorCTB4MmMsIDB4ODMsIDB4MmUsIDB4YWEsIDB4YmIsIDB4ZDQsIDB4NzAsIDB4NmMsIDB4NzAsIDB4NmMsIDB4NDMsIDB4ZTMsCisJMHgxYywgMHgzZiwgMHhiMiwgMHg5MSwgMHhmNiwgMHg3YiwgMHg0MiwgMHg5NSwgMHg5YiwgMHg5YywgMHg1OSwgMHg4YywKKwkweDdjLCAweDBlLCAweGZjLCAweGMxLCAweGIwLCAweDExLCAweGZhLCAweGVkLCAweDI0LCAweGZjLCAweDU2LCAweDBmLAorCTB4ZWQsIDB4ODMsIDB4YmYsIDB4YjksIDB4MTMsIDB4ZmUsIDB4NjYsIDB4M2YsIDB4ZWEsIDB4Y2EsIDB4ZjEsIDB4OTUsCisJMHhmNiwgMHhmYiwgMHg1NywgMHhhZSwgMHg2NSwgMHhhYiwgMHg3NCwgMHg1OCwgMHhjYSwgMHhhZSwgMHgxMiwgMHhlOCwKKwkweGNlLCAweGM3LCAweDkwLCAweGRmLCAweDJlLCAweDk5LCAweGEzLCAweDI5LCAweDc5LCAweGMyLCAweDU3LCAweGJhLAorCTB4ZmMsIDB4MmQsIDB4NjIsIDB4ZTMsIDB4M2QsIDB4NmYsIDB4MTYsIDB4N2EsIDB4ZGQsIDB4NTUsIDB4MTAsIDB4MzIsCisJMHhmZiwgMHg1MiwgMHg3YywgMHhhYiwgMHgzNiwgMHgxNCwgMHhkZiwgMHhlMCwgMHg1MywgMHg4MSwgMHhkZiwgMHhhMCwKKwkweDRhLCAweGQzLCAweGE0LCAweDBhLCAweGY2LCAweGFkLCAweDYwLCAweGRmLCAweDBhLCAweGVhLCAweGMxLCAweGQ5LAorCTB4NjYsIDB4ZmIsIDB4NzcsIDB4YWEsIDB4ZWUsIDB4YjAsIDB4YzYsIDB4NjYsIDB4ZDgsIDB4YTgsIDB4NmYsIDB4ODYsCisJMHhlNywgMHhkMiwgMHhkYSwgMHg5ZSwgMHhjNywgMHhjMCwgMHhiYiwgMHg0NywgMHhjMSwgMHhiYiwgMHgyMywgMHhhOCwKKwkweDgzLCAweGZlLCAweDA0LCAweDc1LCAweGQwLCAweDFmLCAweGEyLCAweDBlLCAweDNhLCAweDhjLCAweDNhLCAweDY4LAorCTB4MGEsIDB4NzUsIDB4ZDAsIDB4N2QsIDB4YjAsIDB4ZmQsIDB4N2IsIDB4NjEsIDB4ZmIsIDB4OTMsIDB4YjAsIDB4ZmQsCisJMHgwOSwgMHg3OSwgMHhjNywgMHg3MywgMHhjOCwgMHhkZiwgMHg3OCwgMHhlZiwgMHgxMSwgMHhlZCwgMHhjNSwgMHhlZCwKKwkweDRkLCAweDIyLCAweDg4LCAweGFmLCAweDdjLCAweDYyLCAweDljLCAweDFhLCAweDJkLCAweGFlLCAweDg3LCAweDVjLAorCTB4NzksIDB4N2YsIDB4MzUsIDB4ZWQsIDB4NGUsIDB4NmEsIDB4NTMsIDB4YzgsIDB4YjksIDB4ZWYsIDB4MWYsIDB4ZTEsCisJMHgzYSwgMHgyOSwgMHhhNSwgMHhlZSwgMHgyYiwgMHg3MywgMHhmNiwgMHg3MywgMHgxZSwgMHhkMiwgMHgyZSwgMHhlNCwKKwkweDZkLCAweDM4LCAweGIzLCAweDdkLCAweGE2LCAweGE4LCAweDQ3LCAweDM1LCAweDRhLCAweGRmLCAweDVhLCAweDhkLAorCTB4YjIsIDB4M2MsIDB4Y2YsIDB4MzUsIDB4Y2EsIDB4YWIsIDB4NmIsIDB4MzUsIDB4Y2EsIDB4ZjIsIDB4M2MsIDB4ZDcsCisJMHgyOCwgMHhhZiwgMHhhYywgMHhhYiwgMHg1MSwgMHhhZSwgMHgzYywgMHhmZCwgMHhmMiwgMHhiYSwgMHgxYSwgMHhlNSwKKwkweGNhLCAweGQzLCAweDJmLCAweDg1LCAweDYzLCAweGE2LCAweDAzLCAweDdlLCAweGM5LCAweDBkLCAweDY5LCAweDM1LAorCTB4NWQsIDB4M2MsIDB4N2IsIDB4YzMsIDB4N2MsIDB4ZTEsIDB4ZmIsIDB4ZmQsIDB4ZWIsIDB4ZmYsIDB4MWYsIDB4M2EsCisJMHg2ZSwgMHg5ZCwgMHgxYSwgMHgzOSwgMHhkZiwgMHhkOCwgMHhhYSwgMHhlYSwgMHg5YSwgMHhmNiwgMHhmOSwgMHhkZSwKKwkweGI2LCAweGY5LCAweDU1LCAweGY5LCAweDZkLCAweGI0LCAweDVjLCAweGRiLCAweGZjLCAweDNlLCAweGJjLCAweDI3LAorCTB4YWQsIDB4MGMsIDB4ZGIsIDB4ZjUsIDB4MDIsIDB4N2QsIDB4MWMsIDB4ZjAsIDB4ZjcsIDB4M2QsIDB4NGYsIDB4NzQsCisJMHhjOSwgMHhlZiwgMHg2YSwgMHg5ZSwgMHhjYywgMHg5MSwgMHg2MSwgMHhhMywgMHhhMywgMHg0NywgMHhiNywgMHgyYSwKKwkweDNiLCAweGU2LCAweDdlLCAweDVhLCAweDUzLCAweGJlLCAweGY5LCAweDQxLCAweGUwLCAweDAxLCAweGFmLCAweDdkLAorCTB4NDMsIDB4ZGUsIDB4ZTEsIDB4YTgsIDB4ZjMsIDB4YWEsIDB4YmIsIDB4NmMsIDB4MjMsIDB4YmYsIDB4OGEsIDB4MzgsCisJMHgwMywgMHg1OSwgMHg0YiwgMHhkYywgMHg1YywgMHhmMywgMHg3MSwgMHg5ZCwgMHgxOCwgMHhmOSwgMHhlZiwgMHgwOCwKKwkweGQ3LCAweGNmLCAweGQyLCAweDhhLCAweGVlLCAweGRiLCAweDUwLCAweGVmLCAweGYxLCAweDlhLCAweDY4LCAweGRjLAorCTB4NWUsIDB4MWYsIDB4MjYsIDB4YzMsIDB4ZmIsIDB4YWMsIDB4NTUsIDB4OTUsIDB4MTMsIDB4NDksIDB4N2MsIDB4NDYsCisJMHg4OCwgMHhlZiwgMHhiZiwgMHgwMiwgMHhlNSwgMHgzNywgMHgxOCwgMHhkZSwgMHg2YywgMHg4MywgMHgxZiwgMHg0NywKKwkweDllLCAweGM2LCAweDc3LCAweDJiLCAweDljLCAweDZmLCAweDE5LCAweGY0LCAweGVlLCAweDdjLCAweDM3LCAweGJkLAorCTB4NzMsIDB4MWMsIDB4ZjksIDB4YTYsIDB4NmIsIDB4NjcsIDB4NWYsIDB4NDYsIDB4YmQsIDB4NzAsIDB4OGEsIDB4ZjMsCisJMHhlMiwgMHg1MSwgMHhhNiwgMHg3MywgMHhjOCwgMHg5YSwgMHgyNSwgMHhhYiwgMHg1ZiwgMHhlNSwgMHhkMSwgMHg0NywKKwkweGI0LCAweDRmLCAweGQyLCAweDJkLCAweGMyLCAweDdkLCAweDdlLCAweGQ2LCAweGI2LCAweDhmLCAweGQ1LCAweGI2LAorCTB4NGYsIDB4ODEsIDB4ZWQsIDB4YWQsIDB4ZjEsIDB4NzUsIDB4OWMsIDB4YjksIDB4YjIsIDB4ZmQsIDB4MjYsIDB4MzMsCisJMHgxZCwgMHhkNiwgMHg1MiwgMHg4ZiwgMHg4YywgMHg2ZSwgMHhhNiwgMHhmYSwgMHg4MCwgMHg3ZCwgMHhlZSwgMHgxNSwKKwkweGU0LCAweGRhLCAweGU1LCAweDUxLCAweGNjLCAweGE1LCAweDg3LCAweGYwLCAweDhlLCAweGU3LCAweGVkLCAweDA2LAorCTB4MDksIDB4ZmIsIDB4NWMsIDB4ODMsIDB4OTAsIDB4NGMsIDB4NzcsIDB4ZDksIDB4MTUsIDB4YmUsIDB4NjMsIDB4NGIsCisJMHgwYiwgMHhlZSwgMHg0YiwgMHhkYSwgMHgxYSwgMHhhMSwgMHhmZCwgMHg2NiwgMHgyZSwgMHhlMiwgMHhjYywgMHg1MywKKwkweGE4LCAweDk5LCAweDhlLCAweGE4LCAweGJiLCAweGFmLCAweDcwLCAweDlmLCAweDViLCAweGI0LCAweDhiLCAweDMyLAorCTB4YWYsIDB4Y2QsIDB4NjksIDB4OTUsIDB4YjQsIDB4M2EsIDB4ZTMsIDB4MzcsIDB4NjAsIDB4ZWIsIDB4YmEsIDB4NjAsCisJMHhkOCwgMHg3NywgMHg4MSwgMHg1YiwgMHhhMywgMHhhNSwgMHhlMywgMHhiYSwgMHhiYywgMHhlYiwgMHgyYywgMHg4ZiwKKwkweGIyLCAweGFjLCAweGY5LCAweDc5LCAweDNkLCAweGRlLCAweDQ1LCAweDY3LCAweGZhLCAweGRiLCAweGYwLCAweDRjLAorCTB4NWYsIDB4MGEsIDB4NmIsIDB4ZWQsIDB4ZTgsIDB4NGMsIDB4MDksIDB4N2EsIDB4NjMsIDB4ZGUsIDB4MDQsIDB4ZWMsCisJMHgwOCwgMHhmOCwgMHg1MSwgMHhhMiwgMHg5NSwgMHg5NiwgMHhmNSwgMHgzOSwgMHg3OCwgMHg2YSwgMHg2ZCwgMHhiYywKKwkweDMxLCAweDM2LCAweGM4LCAweDMwLCAweGFhLCAweDU5LCAweGMwLCAweDgzLCAweDg5LCAweDBjLCAweGVjLCAweDcwLAorCTB4YmEsIDB4M2YsIDB4YmEsIDB4ODMsIDB4ZDUsIDB4MWQsIDB4YTEsIDB4YTksIDB4ZGEsIDB4OWIsIDB4ZTcsIDB4MDcsCisJMHg2MSwgMHg4YiwgMHgxNiwgMHhlYywgMHg5MywgMHhmMywgMHg5ZCwgMHgxMiwgMHhkNywgMHgxOSwgMHhlMSwgMHhmNywKKwkweDRiLCAweGRiLCAweDljLCAweGE0LCAweDJjLCAweDZhLCAweDE1LCAweDNlLCAweDdmLCAweDllLCAweDk2LCAweDViLAorCTB4MTEsIDB4MGQsIDB4MzksIDB4ZDgsIDB4ZTMsIDB4MTgsIDB4N2UsIDB4MjMsIDB4NzgsIDB4ZTcsIDB4ZTIsIDB4YzcsCisJMHg3NSwgMHg0ZSwgMHg4MSwgMHgxZSwgMHg5MywgMHg3OSwgMHgzNCwgMHhmMiwgMHhlNCwgMHg2MSwgMHhhNiwgMHhlZiwKKwkweDAwLCAweGQ2LCAweGIzLCAweDNlLCAweGIzLCAweDllLCAweDFlLCAweDIwLCAweDZmLCAweDgwLCAweDdkLCAweDQ1LAorCTB4MDYsIDB4YjgsIDB4MDEsIDB4ZTMsIDB4YmYsIDB4MGUsIDB4NWIsIDB4MWYsIDB4YzQsIDB4ZDMsIDB4MzYsIDB4Y2IsCisJMHhjYywgMHg1YiwgMHg4OSwgMHgzZiwgMHgwOCwgMHhmNCwgMHgxYywgMHg3ZiwgMHgzYiwgMHgxOCwgMHgwZiwgMHhjNywKKwkweDQzLCAweGU2LCAweGRkLCAweGFjLCAweDdiLCAweDk5LCAweDFkLCAweDc0LCAweDZlLCAweDMxLCAweDhhLCAweDYxLAorCTB4MzMsIDB4YjAsIDB4NDEsIDB4YmUsIDB4NTMsIDB4MWQsIDB4MDcsIDB4NWYsIDB4NzgsIDB4YWMsIDB4ODUsIDB4YjEsCisJMHgwYywgMHhmMywgMHhjYiwgMHgwYiwgMHgzOCwgMHg3NywgMHg5ZSwgMHg0ZSwgMHhhMSwgMHg2NiwgMHhhNywgMHgwMSwKKwkweDdlLCAweDIyLCAweDU3LCAweGY1LCAweGI3LCAweDg0LCAweGZhLCAweGJlLCAweDFlLCAweDVlLCAweDc3LCAweGI4LAorCTB4M2YsIDB4MGUsIDB4ZmEsIDB4OGMsIDB4MzYsIDB4NzgsIDB4ODYsIDB4NTEsIDB4YjUsIDB4YzUsIDB4NDUsIDB4NDIsCisJMHgyYywgMHhjZCwgMHgwNCwgMHhiNywgMHg4YiwgMHhmYywgMHg3ZCwgMHhmNCwgMHg4MCwgMHgzYywgMHg1MywgMHg5ZSwKKwkweDBlLCAweDJmLCAweDA2LCAweDgxLCAweDk3LCAweDFiLCAweGNhLCAweDJlLCAweDkzLCAweDlkLCAweDdkLCAweDkyLAorCTB4ZjYsIDB4OTgsIDB4ZmIsIDB4NDgsIDB4OTcsIDB4ZGYsIDB4ZTAsIDB4NTAsIDB4MTMsIDB4ZGYsIDB4ZGUsIDB4OTEsCisJMHgwZiwgMHg4MiwgMHg5MywgMHhhMCwgMHhmZCwgMHgwNSwgMHhiOSwgMHhjZiwgMHg3ZCwgMHhhMCwgMHgxZiwgMHhiYywKKwkweDkyLCAweGY1LCAweDA0LCAweGQzLCAweDBhLCAweGRlLCAweGE0LCAweDk5LCAweGRlLCAweDI0LCAweDFkLCAweDZlLAorCTB4OWQsIDB4MGYsIDB4NjUsIDB4ZjMsIDB4MjgsIDB4NzksIDB4ZmUsIDB4ZGIsIDB4M2EsIDB4ZGYsIDB4NDcsIDB4OTcsCisJMHg1YiwgMHg0ZiwgMHg4NiwgMHhiNCwgMHhlNSwgMHg0MSwgMHgyZiwgMHhmNiwgMHg2ZiwgMHhiZCwgMHg5MCwgMHg2NiwKKwkweGRmLCAweGMwLCAweDMyLCAweGY3LCAweDkwLCAweGYxLCAweDc5LCAweGEzLCAweGNmLCAweDQwLCAweDA3LCAweDNmLAorCTB4Y2QsIDB4MGYsIDB4YTQsIDB4NjgsIDB4YmQsIDB4MWYsIDB4NjAsIDB4YjgsIDB4ZDQsIDB4NzUsIDB4NzQsIDB4ODUsCisJMHhlOSwgMHgyMCwgMHhlOSwgMHgzZiwgMHg4NSwgMHhiMywgMHgxOSwgMHhmNCwgMHgzMCwgMHgzZSwgMHg3ZCwgMHg4MywKKwkweDJmLCAweGE4LCAweGM4LCAweGU3LCAweGFhLCAweGNlLCAweGJlLCAweDg5LCAweGUzLCAweDE0LCAweGViLCAweDcwLAorCTB4MGYsIDB4ZmMsIDB4MWYsIDB4NzQsIDB4MTAsIDB4NzYsIDB4NWMsIDB4NWMsIDB4ZTQsIDB4M2IsIDB4ODUsIDB4NjEsCisJMHhiZSwgMHg4NywgMHgzYSwgMHg1MywgMHg4MiwgMHg2YywgMHg5NywgMHhmOCwgMHhiYiwgMHg2MCwgMHg1YSwgMHhlNSwKKwkweDgyLCAweGFhLCAweDc2LCAweGIyLCAweGQ4LCAweDE3LCAweDMyLCAweGFmLCAweGE1LCAweDlmLCAweDJjLCAweGM5LAorCTB4ZWYsIDB4ODAsIDB4MjksIDB4YWMsIDB4MDksIDB4ZjAsIDB4NmMsIDB4ZmYsIDB4OWIsIDB4ODgsIDB4OWYsIDB4MTQsCisJMHhkNCwgMHhkZiwgMHg0NCwgMHg4NCwgMHhkZiwgMHg2NCwgMHgxYiwgMHgyYSwgMHgwNywgMHg3OCwgMHhiOCwgMHg2OSwKKwkweGQwLCAweDU0LCAweDMzLCAweGZhLCAweDFiLCAweDA5LCAweDk2LCAweDgzLCAweDgzLCAweDNhLCAweDNlLCAweDhhLAorCTB4ZmIsIDB4ODEsIDB4OGMsIDB4MmYsIDB4ZDUsIDB4NzUsIDB4YjIsIDB4ZmMsIDB4NjYsIDB4OTgsIDB4Y2YsIDB4NzAsCisJMHhmZSwgMHhjZSwgMHgzYywgMHhjNCwgMHg3OCwgMHg1OSwgMHhjOSwgMHg2ZiwgMHg0OSwgMHhlYywgMHg4NCwgMHhmYywKKwkweGMwLCAweDczLCAweGRmLCAweDgwLCAweDJkLCAweDY1LCAweGMyLCAweDk4LCAweDZjLCAweDcyLCAweDdkLCAweDE4LAorCTB4ZDYsIDB4YWMsIDB4ZGIsIDB4YTksIDB4M2EsIDB4YzksIDB4ZWYsIDB4MTMsIDB4ZjQsIDB4ZmEsIDB4ZmMsIDB4YTAsCisJMHg3YywgMHg1ZiwgMHhhNiwgMHg0NCwgMHhmOCwgMHg5ZSwgMHhjNywgMHgyOSwgMHgyYSwgMHhjYiwgMHhmNywgMHhmNywKKwkweDg2LCAweGY4LCAweDUwLCAweDYzLCAweGRkLCAweDFiLCAweDhkLCAweDMzLCAweDkwLCAweGEzLCAweDgyLCAweDliLAorCTB4NDYsIDB4MmMsIDB4N2IsIDB4MGMsIDB4NzEsIDB4NmMsIDB4MWEsIDB4N2MsIDB4MmYsIDB4NGUsIDB4NTQsIDB4NjgsCisJMHg4NywgMHhjMywgMHgzYSwgMHgwZSwgMHg5OSwgMHhhNSwgMHg1OCwgMHhjNywgMHg1OCwgMHhiZiwgMHgxOCwgMHhhNiwKKwkweDE3LCAweDc5LCAweDI2LCAweGNlLCAweDNiLCAweDRhLCAweDUzLCAweDdhLCAweGZlLCAweGZkLCAweDgzLCAweGU1LAorCTB4OWEsIDB4NmQsIDB4MTYsIDB4ZTgsIDB4YTMsIDB4YzAsIDB4MzMsIDB4NzgsIDB4YmMsIDB4N2EsIDB4ZjAsIDB4NjEsCisJMHg3NSwgMHg0ZiwgMHgyZiwgMHg0NCwgMHhmZSwgMHhkMiwgMHhjMSwgMHhiMiwgMHhlYSwgMHhlMywgMHhjYywgMHhlZiwKKwkweDg3LCAweDdkLCAweDg2LCAweGQzLCAweGU1LCAweGY3LCAweGQzLCAweDdmLCAweGJmLCAweGQ1LCAweGEwLCAweDhiLAorCTB4YjcsIDB4MDYsIDB4YzEsIDB4ZmQsIDB4ZmMsIDB4MGQsIDB4MjcsIDB4YWMsIDB4NDEsIDB4ZDUsIDB4NzcsIDB4NzEsCisJMHg4ZSwgMHgxMywgMHhhOCwgMHgzNywgMHg0NiwgMHgyZCwgMHhhZCwgMHgwNCwgMHhkYiwgMHgzZCwgMHhlNSwgMHhhMywKKwkweDVlLCAweDExLCAweGY2LCAweGQ4LCAweGFhLCAweDMwLCAweDExLCAweDdmLCAweGI5LCAweDk2LCAweGZmLCAweGNkLAorCTB4N2UsIDB4ZmUsIDB4MjYsIDB4M2MsIDB4ZTcsIDB4ZjIsIDB4OWEsIDB4NmQsIDB4ZWEsIDB4YWUsIDB4ZWEsIDB4ZTYsCisJMHhkYiwgMHhhNCwgMHhjZiwgMHgyNSwgMHgwYSwgMHhlMywgMHhkMCwgMHhjZCwgMHhlZCwgMHhmNiwgMHhkMSwgMHg5ZSwKKwkweDIzLCAweGIyLCAweDVkLCAweGQwLCAweDk0LCAweDAxLCAweDdhLCAweGFhLCAweGI1LCAweDI4LCAweGRmLCAweGUyLAorCTB4ZWYsIDB4ZmQsIDB4YWIsIDB4MDcsIDB4YmYsIDB4ZGIsIDB4YmMsIDB4NzQsIDB4NzAsIDB4MTYsIDB4ZjIsIDB4ZTEsCisJMHgzMywgMHhjZCwgMHgzNiwgMHgyMywgMHhmZCwgMHg4YiwgMHg3MiwgMHg3ZSwgMHhlZSwgMHgyMywgMHhmZSwgMHhmYiwKKwkweDg4LCAweGZmLCAweDNlLCAweGUyLCAweGJmLCAweDhmLCAweGY4LCAweGVmLCAweDIzLCAweGZlLCAweGZiLCAweDg4LAorCTB4ZmYsIDB4ZTAsIDB4ZTEsIDB4MGYsIDB4YTAsIDB4MmYsIDB4ZTcsIDB4ZmQsIDB4ODksIDB4MzAsIDB4ZGYsIDB4N2EsCisJMHg3YywgMHgyZCwgMHhkZiwgMHgzYSwgMHhkNywgMHhlMiwgMHg2ZiwgMHgzZiwgMHg5MiwgMHg5NiwgMHg0YSwgMHg4NSwKKwkweDU0LCAweGJlLCAweDRhLCAweDgyLCAweGYzLCAweDliLCAweDI4LCAweDVmLCAweGJkLCAweGZlLCAweDM3LCAweDBjLAorCTB4MDUsIDB4YzcsIDB4YjksIDB4MWEsIDB4YzMsIDB4NTUsIDB4MzQsIDB4ZTEsIDB4MzAsIDB4OWMsIDB4Y2EsIDB4ZDcsCisJMHhiOCwgMHg0NiwgMHg1YSwgMHgwZiwgMHhjMywgMHhkZiwgMHhjOSwgMHhkOCwgMHhiNywgMHhhOSwgMHg2ZiwgMHgzNCwKKwkweGVhLCAweDdiLCAweGQwLCAweGUzLCAweDVmLCAweGY3LCAweDEwLCAweDhiLCAweGNiLCAweDRkLCAweDE5LCAweDhmLAorCTB4MzEsIDB4N2UsIDB4MDYsIDB4NjMsIDB4ODMsIDB4ZjUsIDB4OGYsIDB4ZGYsIDB4ZGQsIDB4YzMsIDB4NzUsIDB4NDEsCisJMHhiOSwgMHg4OSwgMHhiYywgMHg2OCwgMHgzOSwgMHhjYSwgMHg4NSwgMHgwMCwgMHhlNywgMHhiZiwgMHhhOSwgMHg5NSwKKwkweGVhLCAweDJjLCAweDY3LCAweDQxLCAweGIzLCAweDY5LCAweDMwLCAweGM1LCAweDY5LCAweGFmLCAweDc1LCAweDVlLAorCTB4OTYsIDB4YjUsIDB4OGUsIDB4ZmEsIDB4OWIsIDB4OWUsIDB4MTEsIDB4ZDAsIDB4MTYsIDB4ZGQsIDB4ZmQsIDB4MTIsCisJMHhlOSwgMHhmMywgMHg2OSwgMHhmOSwgMHg3NywgMHgwMCwgMHgyOSwgMHg2NywgMHg1OCwgMHhmZSwgMHgzZCwgMHg0MiwKKwkweDFmLCAweGY2LCAweDExLCAweGYzLCAweDNiLCAweGRiLCAweGVlLCAweDU2LCAweGE5LCAweGEwLCAweDdjLCAweDc2LAorCTB4YTcsIDB4ZmEsIDB4M2IsIDB4MDgsIDB4OTEsIDB4ODYsIDB4ZWQsIDB4ZGUsIDB4YjYsIDB4MGQsIDB4NjcsIDB4ODMsCisJMHg1YywgMHg1ZiwgMHhkZCwgMHgyYSwgMHhmMywgMHg2NywgMHhmOCwgMHhkMSwgMHg5MywgMHhjMywgMHg3ZCwgMHgwMywKKwkweGQ0LCAweGIzLCAweDlkLCAweDRlLCAweDBkLCAweDczLCAweGFkLCAweGI1LCAweDE5LCAweGY4LCAweDc4LCAweGFkLAorCTB4OWQsIDB4MmQsIDB4ODgsIDB4ZWQsIDB4NzQsIDB4N2EsIDB4MTEsIDB4N2UsIDB4NzYsIDB4ZDEsIDB4NzYsIDB4NTksCisJMHg5NywgMHg5NywgMHg4NiwgMHhkMywgMHhmMCwgMHhjZiwgMHg2MywgMHgwMywgMHgxYywgMHg5ZiwgMHg5NywgMHg1YiwKKwkweGFjLCAweDJiLCAweDdkLCAweDgwLCAweDFmLCAweDg0LCAweDVlLCAweDZlLCAweDgyLCAweDNkLCAweDA5LCAweGVjLAorCTB4MWYsIDB4ZTEsIDB4ZmUsIDB4YjksIDB4YzQsIDB4ZGQsIDB4ZTcsIDB4ZWMsIDB4ZDksIDB4MjYsIDB4NzUsIDB4NDMsCisJMHhkOCwgMHhhNiwgMHgyNSwgMHg0MCwgMHhmYiwgMHgyNywgMHg2YSwgMHg0NCwgMHg5NywgMHhmOCwgMHg2YywgMHhiMywKKwkweDdlLCAweGZiLCAweGI3LCAweGJhLCAweDM3LCAweGI1LCAweDcyLCAweDlkLCAweGZmLCAweDBlLCAweDYxLCAweDk4LAorCTB4ZjYsIDB4NDEsIDB4YmYsIDB4NGMsIDB4ZTcsIDB4NGQsIDB4ZWQsIDB4ODEsIDB4YzYsIDB4ZmYsIDB4MTQsIDB4NmUsCisJMHg3NSwgMHhiMSwgMHg3MSwgMHg1YywgMHg1NSwgMHhmOCwgMHhkYywgMHg1OSwgMHhhZiwgMHhlZCwgMHgzOCwgMHg2YiwKKwkweDY3LCAweGUyLCAweDZjLCAweGVjLCAweGI1LCAweDE1LCAweGM0LCAweGNlLCAweDdhLCAweDEyLCAweDRmLCAweGI1LAorCTB4OGUsIDB4M2EsIDB4YjYsIDB4MTIsIDB4YjQsIDB4NDIsIDB4OTYsIDB4NTgsIDB4ZWQsIDB4N2EsIDB4NWQsIDB4ODcsCisJMHg5MiwgMHhiMiwgMHg4NSwgMHg1MCwgMHgwNSwgMHgwOSwgMHg1NSwgMHg5NiwgMHg5ZCwgMHhkMiwgMHg1NCwgMHg4MCwKKwkweDkwLCAweGZhLCAweDgwLCAweDc4LCAweGNiLCAweDZhLCAweDZkLCAweDg3LCAweGE0LCAweGVjLCAweDc2LCAweDZkLAorCTB4NjIsIDB4ZDcsIDB4MmYsIDB4M2MsIDB4MmMsIDB4ZWIsIDB4NzUsIDB4NmEsIDB4YmIsIDB4OWIsIDB4YWMsIDB4NDIsCisJMHhmYiwgMHg1MCwgMHg5ZSwgMHg2MiwgMHg5OSwgMHg5MiwgMHhjMiwgMHg0YiwgMHg4NSwgMHhjNCwgMHgwMywgMHgwMiwKKwkweDU0LCAweGE5LCAweDRhLCAweGRhLCAweDM0LCAweDBmLCAweDI1LCAweDExLCAweGJjLCAweDUwLCAweDBhLCAweGQyLAorCTB4ZjAsIDB4N2QsIDB4NzcsIDB4NjYsIDB4MWQsIDB4MjcsIDB4NTAsIDB4NjEsIDB4NjksIDB4MzUsIDB4NzcsIDB4ZWUsCisJMHhkYywgMHgzYiwgMHg3MywgMHg3ZiwgMHhjZSwgMHhmOSwgMHhjZSwgMHg3NywgMHhjZSwgMHgzZCwgMHg2NiwgMHgxYiwKKwkweDFiLCAweDY1LCAweGZhLCAweGQzLCAweGFiLCAweDZhLCAweGE2LCAweGRhLCAweDJiLCAweDBiLCAweDkwLCAweGUzLAorCTB4ZTIsIDB4NDgsIDB4MzgsIDB4ODgsIDB4OTcsIDB4NzYsIDB4MDUsIDB4ZmEsIDB4MGMsIDB4YzcsIDB4ZGYsIDB4YjcsCisJMHg1NywgMHg5YSwgMHg1NywgMHgxNiwgMHhjZCwgMHg0ZSwgMHhjZCwgMHhhYiwgMHgxZSwgMHg3ZCwgMHg3NiwgMHgwYSwKKwkweDYzLCAweDhhLCAweDYxLCAweDFkLCAweGJhLCAweGZiLCAweDM0LCAweDM2LCAweDE5LCAweGJjLCAweGVmLCAweDdmLAorCTB4ZWMsIDB4YmUsIDB4ZWYsIDB4YjEsIDB4ZmIsIDB4YzMsIDB4ZmYsIDB4YTMsIDB4M2QsIDB4Y2IsIDB4OGYsIDB4Y2IsCisJMHgwMywgMHhjNywgMHg2OSwgMHhhNSwgMHhmOCwgMHg5NSwgMHg2MiwgMHhjOSwgMHgzNiwgMHg2NiwgMHg0YiwgMHg1NiwKKwkweDlhLCAweGJjLCAweDIwLCAweDJiLCAweDllLCAweGNhLCAweGJhLCAweGVkLCAweGMwLCAweGJiLCAweDc2LCAweDk5LAorCTB4NWYsIDB4ODYsIDB4Y2MsIDB4NjMsIDB4MWUsIDB4MWQsIDB4MzYsIDB4Y2YsIDB4YjQsIDB4MTMsIDB4N2QsIDB4ZDQsCisJMHg5OSwgMHg0ZSwgMHg2YywgMHg4MywgMHg2MSwgMHgwZiwgMHhjNSwgMHhkMCwgMHhjZSwgMHg3YiwgMHhjOSwgMHg0ZCwKKwkweDlhLCAweGU3LCAweDc0LCAweDFjLCAweDg2LCAweDdjLCAweGM2LCAweDUzLCAweDQ1LCAweDlkLCAweDlmLCAweGMxLAorCTB4MzYsIDB4NmQsIDB4NzIsIDB4YzcsIDB4Y2UsIDB4ZjQsIDB4MDYsIDB4ZjksIDB4M2UsIDB4ZjAsIDB4NWIsIDB4YzcsCisJMHhmYSwgMHhjOCwgMHgzNSwgMHg1ZSwgMHg3NCwgMHg3NywgMHhlYiwgMHhjYywgMHhkYiwgMHhjMiwgMHgzYywgMHgyYSwKKwkweDA4LCAweGNkLCAweGIzLCAweDIyLCAweGQ1LCAweGJhLCAweGM4LCAweGViLCAweGY4LCAweGZkLCAweGFlLCAweDFlLAorCTB4ZjgsIDB4MGEsIDB4OGEsIDB4M2UsIDB4ZjMsIDB4YjgsIDB4NmMsIDB4NTUsIDB4YmUsIDB4MmMsIDB4MGQsIDB4ZDgsCisJMHg5ZiwgMHg0ZCwgMHhkNywgMHhmMywgMHhlZSwgMHhiOSwgMHg3MSwgMHhiZCwgMHhlNiwgMHgzZiwgMHgyOSwgMHgyOSwKKwkweDQ5LCAweDhjLCAweGQyLCAweGJlLCAweGI1LCAweGNiLCAweDRmLCAweDk3LCAweGRiLCAweDY0LCAweGRiLCAweGI0LAorCTB4Y2MsIDB4N2IsIDB4YzIsIDB4NWMsIDB4YjYsIDB4OTgsIDB4NGMsIDB4NDUsIDB4NDMsIDB4OWEsIDB4YTMsIDB4Y2EsCisJMHhiNywgMHhjMCwgMHhhMCwgMHhmMSwgMHhlYywgMHhlZSwgMHhmMiwgMHgzMywgMHg3ZCwgMHg4YywgMHg5ZCwgMHg3YywKKwkweGI0LCAweGNjLCAweDdiLCAweDAzLCAweDU3LCAweDQzLCAweDc2LCAweGVjLCAweDEwLCAweGI4LCAweDJjLCAweDQwLAorCTB4YzgsIDB4ZTQsIDB4YmEsIDB4NzMsIDB4YmUsIDB4Y2YsIDB4NzEsIDB4NmMsIDB4YTgsIDB4YTMsIDB4MmYsIDB4ZGEsCisJMHgyZSwgMHhjNSwgMHhhMywgMHhjMCwgMHg0NCwgMHgzNSwgMHhhNCwgMHg3MywgMHg4YSwgMHg3NiwgMHhhMiwgMHgxYSwKKwkweGEzLCAweDQzLCAweDM1LCAweGU2LCAweGM4LCAweDk5LCAweGZiLCAweDM1LCAweDVlLCAweDY3LCAweGFlLCAweDdkLAorCTB4NWYsIDB4Y2YsIDB4MDUsIDB4ZTUsIDB4NDIsIDB4Y2QsIDB4YTUsIDB4YWMsIDB4OWEsIDB4YjIsIDB4MDksIDB4NWQsCisJMHhkYiwgMHg2OCwgMHgyZSwgMHhmNSwgMHg3MywgMHhhZiwgMHhiNiwgMHg5YSwgMHgzZiwgMHhlOCwgMHhmMywgMHg3ZCwKKwkweDJkLCAweGQ2LCAweGZkLCAweGIwLCAweGNmLCAweGFmLCAweDhiLCAweDA3LCAweGJlLCAweDEzLCAweDdkLCAweGFjLAorCTB4MmEsIDB4ZTYsIDB4ZjYsIDB4YjIsIDB4MzQsIDB4NTcsIDB4N2YsIDB4MmMsIDB4NmYsIDB4NTcsIDB4N2UsIDB4MjQsCisJMHhiZiwgMHg1YSwgMHgzZCwgMHgwYiwgMHhmZSwgMHg2MSwgMHg1NSwgMHgwYiwgMHhiMCwgMHgyNywgMHgzNywgMHg5YSwKKwkweDllLCAweDc3LCAweGMzLCAweDNkLCAweDAzLCAweDVmLCAweGMxLCAweGYzLCAweGZlLCAweGUwLCAweDZlLCAweDRiLAorCTB4NjIsIDB4ZWMsIDB4M2IsIDB4OTgsIDB4NzMsIDB4MWUsIDB4M2EsIDB4NDQsIDB4MmMsIDB4OWMsIDB4ODIsIDB4YmMsCisJMHgyNSwgMHhmYiwgMHhhNSwgMHgyYiwgMHhhMiwgMHhlNSwgMHg2NCwgMHg2OCwgMHgyYywgMHg4YywgMHgzOSwgMHgxOCwKKwkweDAxLCAweDI3LCAweGU3LCAweDVjLCAweDQ2LCAweGZhLCAweDI5LCAweDMzLCAweDQ2LCAweGYzLCAweDE1LCAweDdjLAorCTB4M2YsIDB4MGMsIDB4YmQsIDB4ZDgsIDB4OGYsIDB4OWYsIDB4OTIsIDB4N2IsIDB4YTMsIDB4MTgsIDB4ZWIsIDB4MjgsCisJMHg2NSwgMHgyZiwgMHgyYywgMHg4OSwgMHgyNywgMHgzMSwgMHg4ZiwgMHg3YywgMHg5YiwgMHhkYywgMHgyZiwgMHg1ZCwKKwkweGU5LCAweDYzLCAweDVjLCAweGVlLCAweDdlLCAweDg5LCAweDY1LCAweGUzLCAweDRiLCAweDNkLCAweGUyLCAweDQ5LAorCTB4MWIsIDB4NmMsIDB4ZjksIDB4ZmMsIDB4MDksIDB4OWYsIDB4MzcsIDB4ZmQsIDB4NWEsIDB4MGQsIDB4YTMsIDB4YmQsCisJMHg1ZCwgMHg3OCwgMHg0NywgMHg5MSwgMHhlNywgMHgxNSwgMHhiYywgMHgzMCwgMHg3OCwgMHg3OSwgMHgwZSwgMHg3YywKKwkweDI4LCAweGQzLCAweGJjLCAweDIwLCAweDNiLCAweGEzLCAweDExLCAweGI0LCAweDIxLCAweDVmLCAweGQxLCAweDU4LAorCTB4MjIsIDB4ZDksIDB4MTIsIDB4NzMsIDB4YjAsIDB4OTgsIDB4MGYsIDB4ODUsIDB4MzEsIDB4OWUsIDB4MjEsIDB4NmUsCisJMHg3MCwgMHg4YywgMHhlZCwgMHgzYywgMHhiNywgMHgwYiwgMHhlYSwgMHg2YywgMHhjOCwgMHgwOCwgMHhlYiwgMHgyOCwKKwkweGRmLCAweDY5LCAweGNkLCAweGE5LCAweDYwLCAweDQzLCAweGYxLCAweGJlLCAweDExLCAweGM5LCAweGU4LCAweDcyLAorCTB4MGYsIDB4ZGUsIDB4NzcsIDB4NDEsIDB4ZTcsIDB4MjUsIDB4ZmEsIDB4ZWYsIDB4NGMsIDB4YTEsIDB4MGQsIDB4NzEsCisJMHgyNiwgMHgwNSwgMHgyZSwgMHhmMSwgMHhhMSwgMHg5YSwgMHgwMCwgMHhiZCwgMHg5OSwgMHgyOSwgMHhmNSwgMHhjOSwKKwkweDg0LCAweGI5LCAweDZmLCAweGNmLCAweDFjLCAweDBiLCAweGRhLCAweDU3LCAweDMwLCAweDhjLCAweDkxLCAweDYwLAorCTB4NGMsIDB4M2QsIDB4N2IsIDB4YzYsIDB4YzQsIDB4ZmUsIDB4ZjgsIDB4YzEsIDB4YzcsIDB4Y2QsIDB4MmMsIDB4MmYsCisJMHgwMiwgMHhhNywgMHgxNiwgMHg3ZiwgMHg5YiwgMHg3MSwgMHg5ZiwgMHg5NywgMHg2YywgMHhiNCwgMHg1ZCwgMHhmYiwKKwkweDM2LCAweDM1LCAweGVjLCAweDRiLCAweGI2LCAweGM0LCAweDc4LCAweGQ0LCAweGI3LCAweDgxLCAweDQzLCAweGZiLAorCTB4ODIsIDB4M2EsIDB4YjYsIDB4MTUsIDB4MjMsIDB4ODMsIDB4YjUsIDB4NGYsIDB4NmIsIDB4M2QsIDB4NjQsIDB4ZGQsCisJMHgxNywgMHgyNSwgMHhiMywgMHg5OCwgMHg5NywgMHg0OSwgMHhkZCwgMHg4ZiwgMHg2YiwgMHgzOCwgMHhhOCwgMHg3OSwKKwkweDA4LCAweDc1LCAweDM1LCAweDcxLCAweDA4LCAweDZiLCAweDk5LCAweDBjLCAweDA3LCAweDZkLCAweGY3LCAweDkxLAorCTB4YzksIDB4ZTMsIDB4ZWYsIDB4ZDMsIDB4NDAsIDB4NjcsIDB4ZjEsIDB4ZWMsIDB4MTAsIDB4ZjcsIDB4YTgsIDB4NWQsCisJMHgxMiwgMHhkZiwgMHg4NCwgMHhiZCwgMHgyYywgMHhiNSwgMHhlYSwgMHgyMywgMHhmMiwgMHg0OSwgMHhlOSwgMHhiMywKKwkweDNlLCAweDllLCAweDkzLCAweGZjLCAweGI1LCAweDY0LCAweGNhLCAweDQ3LCAweDI1LCAweDdkLCAweDdlLCAweDNhLAorCTB4MWQsIDB4MTIsIDB4ZWIsIDB4YmMsIDB4ZWYsIDB4NjcsIDB4MWYsIDB4OWQsIDB4OWUsIDB4NTcsIDB4N2MsIDB4N2UsCisJMHhmNCwgMHhmYywgMHhiYSwgMHhlYSwgMHg0NCwgMHhkYiwgMHgwOCwgMHhkYSwgMHg3MSwgMHgxYywgMHhhNiwgMHhlNCwKKwkweDRhLCAweDdmLCAweGY3LCAweDY2LCAweDhlLCAweDc5LCAweGRlLCAweGE0LCAweGNlLCAweGUxLCAweDRhLCAweDlhLAorCTB4ZjMsIDB4YWEsIDB4YzUsIDB4Y2YsIDB4MWQsIDB4MjksIDB4NDUsIDB4M2IsIDB4ZjAsIDB4YWQsIDB4YTQsIDB4YjksCisJMHhhZSwgMHg4ZSwgMHg2MiwgMHgzYywgMHgyYywgMHgxZiwgMHhhMiwgMHg0ZSwgMHhjNCwgMHhiNiwgMHg4NSwgMHhlZiwKKwkweGI3LCAweGE2LCAweGQ2LCAweDU0LCAweDMyLCAweDNlLCAweGE0LCAweGFjLCAweDc0LCAweDExLCAweGJmLCAweDM2LAorCTB4YTUsIDB4Y2YsIDB4MWUsIDB4NjMsIDB4NzEsIDB4MDUsIDB4ZGQsIDB4YzUsIDB4OWMsIDB4ZWMsIDB4ZTMsIDB4OWUsCisJMHgzNywgMHg2NSwgMHhiMywgMHgzZSwgMHg2OSwgMHg0NiwgMHgxNCwgMHhlMywgMHgyNiwgMHg1ZCwgMHhmYSwgMHg4YywKKwkweGYyLCAweGQyLCAweGUxLCAweGE0LCAweDc5LCAweDVjLCAweDFkLCAweDBjLCAweGVlLCAweDUzLCAweGMwLCAweGNjLAorCTB4ZGQsIDB4ZjcsIDB4OWQsIDB4NWQsIDB4NTMsIDB4YTYsIDB4NWMsIDB4MmUsIDB4MjUsIDB4ZTMsIDB4YjMsIDB4Y2EsCisJMHhjYSwgMHhlMywgMHg5ZCwgMHhmOSwgMHgwOSwgMHg0NSwgMHhkYywgMHg0OCwgMHg5YSwgMHg1ZCwgMHg4YSwgMHhiMSwKKwkweGNkLCAweDBlLCAweDNkLCAweGVmLCAweDI5LCAweGY0LCAweDRmLCAweGFhLCAweGI2LCAweDYwLCAweDNjLCAweGRjLAorCTB4YWYsIDB4Y2IsIDB4ZmQsIDB4YmUsIDB4Y2UsIDB4MTAsIDB4NzMsIDB4MDYsIDB4OGMsIDB4OTksIDB4NDUsIDB4ZTYsCisJMHg4MywgMHhlOSwgMHgzYywgMHg4NCwgMHg3NCwgMHg2MiwgMHg4YywgMHhmNywgMHg4NiwgMHgzYywgMHgzOCwgMHhmOSwKKwkweDBmLCAweGQ0LCAweGExLCAweDVjLCAweDY1LCAweDlkLCAweDEzLCAweGU4LCAweGRiLCAweDMxLCAweGNkLCAweDlmLAorCTB4MWYsIDB4OWMsIDB4MmMsIDB4ZTgsIDB4ZmMsIDB4YzQsIDB4MWQsIDB4OTUsIDB4MDgsIDB4ZTYsIDB4YmQsIDB4YmIsCisJMHg2NywgMHhmMSwgMHg4YywgMHhmYiwgMHgwNSwgMHhiZSwgMHg2NywgMHgzMSwgMHgzNCwgMHhkZSwgMHgyMSwgMHhjYywKKwkweDA3LCAweGNkLCAweDU1LCAweDVhLCAweGIyLCAweGMxLCAweGQ4LCAweDAwLCAweGNmLCAweGY3LCAweDViLCAweDY3LAorCTB4ZTUsIDB4MTcsIDB4YzQsIDB4MTgsIDB4ZWIsIDB4ZGMsIDB4MjMsIDB4MjcsIDB4ZTAsIDB4OWQsIDB4ZTAsIDB4YWIsCisJMHg3NSwgMHhiYywgMHhhNywgMHhiOCwgMHgyYywgMHgwNSwgMHhiZiwgMHhiZiwgMHg3NCwgMHgzMiwgMHhmZiwgMHhiNCwKKwkweDU4LCAweGZmLCAweGJjLCAweDc3LCAweGY4LCAweDM2LCAweDMwLCAweDg3LCAweGZiLCAweDA3LCAweDI3LCAweDI5LAorCTB4OWYsIDB4NWMsIDB4OWIsIDB4YjgsIDB4OWEsIDB4YmMsIDB4YzIsIDB4ZjEsIDB4MGMsIDB4NGEsIDB4NmUsIDB4MTksCisJMHhkYywgMHgwOCwgMHhiZiwgMHhmOSwgMHg2NSwgMHg3ZiwgMHhkZiwgMHhkNiwgMHhjMSwgMHhiMywgMHg3MywgMHgyNSwKKwkweDUzLCAweGViLCAweGViLCAweGFjLCAweGNiLCAweGIzLCAweDBmLCAweGU4LCAweDhhLCAweGNlLCAweDdiLCAweDYyLAorCTB4NWYsIDB4ZTYsIDB4MGEsIDB4MWUsIDB4YTEsIDB4N2QsIDB4NzQsIDB4NmEsIDB4MTIsIDB4NDUsIDB4NWIsIDB4NzIsCisJMHg1NiwgMHhkNiwgMHg4MywgMHhiZiwgMHhjMywgMHg2NiwgMHgxNiwgMHg1ZiwgMHg4ZCwgMHgwOCwgMHgzMCwgMHgzOSwKKwkweDE1LCAweDBmLCAweDFkLCAweDkwLCAweDc5LCAweGQ3LCAweDk1LCAweDQ2LCAweGYzLCAweDg0LCAweDVjLCAweDZiLAorCTB4M2EsIDB4ZmEsIDB4MTksIDB4ZWQsIDB4ZDksIDB4YzIsIDB4NmIsIDB4ZmEsIDB4NWMsIDB4M2EsIDB4ZmUsIDB4YTEsCisJMHhiMiwgMHg5YywgMHhhYiwgMHhmMCwgMHg2YiwgMHhiZSwgMHg3YiwgMHg4YywgMHg3OSwgMHhjMiwgMHhlMSwgMHg4MSwKKwkweDg3LCAweDc5LCAweDcwLCAweGMwLCAweDBlLCAweDcwLCAweDhlLCAweGI3LCAweGMwLCAweDM5LCAweGRlLCAweDA0LAorCTB4ZTcsIDB4ZjgsIDB4MjUsIDB4MzgsIDB4ZjYsIDB4OGQsIDB4Y2EsIDB4NTQsIDB4ODAsIDB4ZmYsIDB4ZDMsIDB4YzAsCisJMHgyMSwgMHhkYSwgMHg2YSwgMHhlYiwgMHgyYywgMHhmNiwgMHg3NCwgMHhiYSwgMHgwMCwgMHgxOSwgMHhmYywgMHgwMCwKKwkweGZlLCAweGM3LCAweDU2LCAweDI1LCAweDIzLCAweDFiLCAweGFiLCAweDkzLCAweGIyLCAweGI5LCAweGVhLCAweGU3LAorCTB4MWMsIDB4YmYsIDB4Y2IsIDB4M2MsIDB4YWQsIDB4NTEsIDB4ZWUsIDB4OTMsIDB4MDMsIDB4MWMsIDB4ZGEsIDB4MjcsCisJMHg4OSwgMHhlMywgMHhjNCwgMHg4ZiwgMHg0ZSwgMHg1OSwgMHgyYiwgMHhhZiwgMHg2OSwgMHgxYywgMHg1YSwgMHgyYiwKKwkweGIzLCAweDFjLCAweDEyLCAweDlkLCAweGYzLCAweDc1LCAweDY2LCAweDViLCAweDZhLCAweGVlLCAweDE2LCAweGVhLAorCTB4YmIsIDB4OTksIDB4ZGIsIDB4MTUsIDB4YzQsIDB4ZDYsIDB4ODksIDB4OTcsIDB4N2YsIDB4MGUsIDB4ZjYsIDB4NWUsCisJMHhlOSwgMHg1YywgMHhiOCwgMHgxOSwgMHhmMywgMHgwMCwgMHhkYSwgMHhiNSwgMHhiMCwgMHg2YiwgMHhjOCwgMHgzZiwKKwkweDI3LCAweDU3LCAweDdmLCAweDQxLCAweDFiLCAweDdjLCAweDAzLCAweDljLCAweGYxLCAweDJhLCAweDZjLCAweGM4LAorCTB4OGUsIDB4NzMsIDB4NDAsIDB4NzMsIDB4YmYsIDB4MWQsIDB4ZTcsIDB4ODgsIDB4Y2UsIDB4YWQsIDB4ZTUsIDB4N2IsCisJMHg4YSwgMHg2NSwgMHg1YiwgMHhlNiwgMHhjYSwgMHg1NiwgMHhiYywgMHgwMCwgMHhmOSwgMHhiYiwgMHgwNiwgMHhiZiwKKwkweDZkLCAweDAzLCAweDdiLCAweGIwLCAweDg5LCAweGI1LCAweGQ4LCAweDZhLCAweGQyLCAweGNlLCAweGJmLCAweGFmLAorCTB4YjEsIDB4NzcsIDB4YWQsIDB4ZjksIDB4MjcsIDB4YmMsIDB4YzcsIDB4M2EsIDB4OWIsIDB4OTYsIDB4M2YsIDB4ZjYsCisJMHgxMywgMHgwMywgMHg5OSwgMHg4ZiwgMHg5NywgMHhkNSwgMHhmZCwgMHhmZCwgMHg3ZSwgMHgxYiwgMHg2OCwgMHhiYiwKKwkweGQ5LCAweDI0LCAweDFlLCAweDhiLCAweDVjLCAweDJjLCAweGQ5LCAweGIwLCAweDI1LCAweDE3LCAweDYzLCAweGU0LAorCTB4MDAsIDB4NTUsIDB4ZDUsIDB4ZWEsIDB4ZTcsIDB4MDUsIDB4NjMsIDB4ZjYsIDB4YmMsIDB4ZmQsIDB4MzYsIDB4YzcsCisJMHhlNSwgMHgwNCwgMHhiOCwgMHg0ZCwgMHhkYiwgMHhiZiwgMHhhZCwgMHhiOSwgMHg0ZCwgMHhhOSwgMHhmMiwgMHhiYywKKwkweDVjLCAweDVmLCAweDRkLCAweDA1LCAweDFjLCAweDI3LCAweDJmLCAweDZmLCAweDgwLCAweGUzLCAweDM1LCAweDJiLAorCTB4YWQsIDB4MWMsIDB4ZWQsIDB4NzEsIDB4YWMsIDB4NTMsIDB4NDUsIDB4Y2QsIDB4MmQsIDB4NzUsIDB4YzksIDB4YTUsCisJMHg5NSwgMHhhMiwgMHhiYSwgMHhiYywgMHg1MiwgMHg1MiwgMHhhZiwgMHgyYywgMHg5NSwgMHg1NSwgMHg3MSwgMHhjOSwKKwkweGYzLCAweGZlLCAweGU5LCAweGNlLCAweGM4LCAweGRiLCAweGFiLCAweDllLCAweDljLCAweDc2LCAweDhkLCAweDgxLAorCTB4OTAsIDB4YjQsIDB4ZjIsIDB4ZGYsIDB4M2MsIDB4YWYsIDB4MTMsIDB4ZDgsIDB4YmMsIDB4NzUsIDB4ZDgsIDB4ZjMsCisJMHg5ZSwgMHgxOCwgMHgxZCwgMHgxNSwgMHhlNywgMHgzMCwgMHgzOSwgMHhjYSwgMHg3MCwgMHg4YywgMHgzOSwgMHhhYywKKwkweGM0LCAweDljLCAweDhjLCAweDZkLCAweDlmLCAweGFmLCAweDI5LCAweDA1LCAweDdjLCAweDNiLCAweGUwLCAweGYzLAorCTB4OTcsIDB4MjcsIDB4YmIsIDB4ODMsIDB4MzMsIDB4OGYsIDB4YjMsIDB4MmYsIDB4MzEsIDB4MjYsIDB4MWMsIDB4ZmIsCisJMHhhZiwgMHg5OCwgMHhiMCwgMHgyOSwgMHhlNywgMHhjYSwgMHg1OCwgMHg4OCwgMHhhZSwgMHhhOCwgMHg3YywgMHhhZiwKKwkweDFjLCAweDc5LCAweGFjLCAweDZjLCAweGUyLCAweGVhLCAweDE4LCAweGM1LCAweGYyLCAweDdkLCAweDZmLCAweDQ4LAorCTB4YzcsIDB4ZmUsIDB4YzEsIDB4NDksIDB4NGMsIDB4Y2YsIDB4OWIsIDB4NzUsIDB4ZjksIDB4YmQsIDB4MDMsIDB4OGMsCisJMHhjOSwgMHg5OCwgMHhkZCwgMHhiMCwgMHhmZiwgMHhhNywgMHhiNSwgMHg3ZCwgMHhhZSwgMHhhYSwgMHg4YywgMHg0ZCwKKwkweGZkLCAweDhlLCAweGNhLCAweDQ0LCAweDE5LCAweDM2LCAweDVlLCAweDMxLCAweDJmLCAweDk0LCAweDVjLCAweGMxLAorCTB4OGEsIDB4Y2QsIDB4MDIsIDB4M2IsIDB4NjYsIDB4ODAsIDB4MzcsIDB4NGYsIDB4ZWIsIDB4YjMsIDB4ZDEsIDB4NDMsCisJMHgxYSwgMHg3YiwgMHhlNiwgMHg1OCwgMHhjZSwgMHg0YiwgMHhiYSwgMHhlNiwgMHhmNiwgMHhlYSwgMHhmNSwgMHhiYiwKKwkweDdkLCAweGFkLCAweDE4LCAweGYzLCAweGY3LCAweDFjLCAweDdhLCAweDljLCAweGU3LCAweGY5LCAweDQwLCAweGFmLAorCTB4NjQsIDB4ZDcsIDB4Y2YsIDB4NDAsIDB4MjcsIDB4NjIsIDB4NTgsIDB4ZGIsIDB4YjAsIDB4ZDYsIDB4ODcsIDB4MWQsCisJMHhkOCwgMHhlZiwgMHgxZCwgMHgyNywgMHgxYywgMHg2MCwgMHg2YSwgMHgyNywgMHhlZSwgMHhkOSwgMHg2ZSwgMHgxMiwKKwkweGZkLCAweDNhLCAweDI0LCAweGIzLCAweGQ0LCAweGFlLCAweDcxLCAweGY1LCAweGQxLCAweGJhLCAweDM0LCAweDc4LAorCTB4NDgsIDB4MGUsIDB4ZTUsIDB4MTAsIDB4ZWEsIDB4ZTIsIDB4NDEsIDB4OTksIDB4ZGMsIDB4NmIsIDB4MWEsIDB4ZTUsCisJMHgzNiwgMHg1YywgMHhkOSwgMHhlNiwgMHgyOCwgMHg3OCwgMHgwNSwgMHhhZSwgMHhiZiwgMHhjMCwgMHhmYiwgMHg0NiwKKwkweDMxLCAweGU2LCAweGJjLCAweDI5LCAweGVmLCAweDlkLCAweGE0LCAweDJkLCAweDcxLCAweDBjLCAweGU2LCAweDFhLAorCTB4Y2YsIDB4ZGEsIDB4YjgsIDB4MzYsIDB4Y2EsIDB4MmEsIDB4YmIsIDB4YzgsIDB4MzIsIDB4YWUsIDB4NTUsIDB4ZmYsCisJMHhmOSwgMHgyMywgMHg5OCwgMHg4NCwgMHgzZSwgMHg5OSwgMHgxNSwgMHgxZiwgMHg5MywgMHhkZSwgMHhkYiwgMHhjNSwKKwkweDI0LCAweGQ2LCAweDc1LCAweGM4LCAweGM0LCAweDUyLCAweDVjLCAweDlkLCAweGJhLCAweDYyLCAweDQyLCAweGRlLAorCTB4YmEsIDB4MjQsIDB4YmIsIDB4MTIsIDB4ZDUsIDB4N2MsIDB4YjQsIDB4MDYsIDB4NTksIDB4NWMsIDB4ODcsIDB4NWMsCisJMHhhZCwgMHg0MSwgMHhhNiwgMHgzMiwgMHg2NSwgMHgyYiwgMHgzNSwgMHhhZCwgMHhlMiwgMHgzYSwgMHgyZSwgMHgzMCwKKwkweDA1LCAweDc5LCAweDBkLCAweGJmLCAweDRhLCAweDJlLCAweDRhLCAweGZkLCAweDc1LCAweGQwLCAweDQ2LCAweDY4LAorCTB4NDcsIDB4ZDMsIDB4NjEsIDB4NjUsIDB4NDMsIDB4MGUsIDB4MjEsIDB4OTcsIDB4NjUsIDB4NWYsIDB4N2YsIDB4ZGYsCisJMHg1MSwgMHgxYSwgMHg1NywgMHg1MywgMHg3NywgMHgyNCwgMHhlOSwgMHhkYywgMHgxMSwgMHhjYiwgMHhkZCwgMHhjMSwKKwkweGVmLCAweDM3LCAweGUyLCAweGNhLCAweDU1LCAweGU4LCAweGZiLCAweGViLCAweGY4LCAweDRlLCAweGY4LCAweDM1LAorCTB4NDMsIDB4OGUsIDB4MGQsIDB4NmIsIDB4OWQsIDB4NGUsIDB4NDksIDB4YzgsIDB4NzIsIDB4MzYsIDB4YzUsIDB4ZDcsCisJMHhmMSwgMHg3NSwgMHhhZCwgMHhlMywgMHg5MCwgMHgzNywgMHg2MCwgMHg5MCwgMHhhZiwgMHhkMywgMHhlOSwgMHg0MCwKKwkweDQ2LCAweGJmLCAweDAxLCAweGZkLCAweGI1LCAweGUwLCAweDk1LCAweGM1LCAweDY1LCAweDFlLCAweGZhLCAweDdmLAorCTB4MTUsIDB4Y2YsIDB4NmYsIDB4MzYsIDB4M2YsIDB4NTYsIDB4NzMsIDB4OGIsIDB4MmEsIDB4YzgsIDB4M2YsIDB4NzksCisJMHgwZSwgMHgzYywgMHhmOSwgMHhmNywgMHg1OCwgMHhiYiwgMHgxZSwgMHhjZCwgMHhkZCwgMHgxMywgMHhhMywgMHgzYywKKwkweDA3LCAweGZiLCAweGI3LCAweGJhLCAweDY0LCAweDFmLCAweDk3LCAweGRiLCAweDIzLCAweDI3LCAweDUwLCAweGVlLAorCTB4YzYsIDB4ZDUsIDB4YzAsIDB4M2EsIDB4NDQsIDB4ZjQsIDB4ZjksIDB4ZjUsIDB4NWEsIDB4NjksIDB4YzQsIDB4MjgsCisJMHhlYSwgMHgzMywgMHhlNiwgMHgzMSwgMHhmNCwgMHgyNSwgMHg5NiwgMHgxZCwgMHhjNiwgMHg3MywgMHhjNiwgMHg2NSwKKwkweDM4LCAweDM3LCAweDcwLCAweDI2LCAweDE1LCAweGQzLCAweDM5LCAweGExLCAweDM1LCAweDcwLCAweDg5LCAweDc1LAorCTB4YmMsIDB4ZWYsIDB4MTYsIDB4ZTMsIDB4N2EsIDB4MGQsIDB4ZTgsIDB4ZjAsIDB4YzgsIDB4NjcsIDB4NWUsIDB4M2EsCisJMHhjYSwgMHhiYywgMHhmMywgMHhmNywgMHg2MywgMHhiZSwgMHhmZCwgMHhmYiwgMHhjNCwgMHhiYiwgMHg2ZCwgMHhjZiwKKwkweGE1LCAweDBjLCAweGRjLCAweDdjLCAweDYwLCAweDAyLCAweGVmLCAweGM4LCAweGRiLCAweDYxLCAweDhiLCAweGFhLAorCTB4NWEsIDB4N2UsIDB4ZDksIDB4Y2UsIDB4ZWYsIDB4NWIsIDB4NmMsIDB4MjQsIDB4Y2QsIDB4NzcsIDB4YzUsIDB4ZWYsCisJMHgzYiwgMHg2ZiwgMHhkMywgMHhlZSwgMHg3NCwgMHgwMCwgMHg1ZiwgMHhlMiwgMHg5YSwgMHg1NywgMHhkZSwgMHhiMiwKKwkweDBiLCAweDQwLCAweDA1LCAweDJiLCAweDNlLCAweDA1LCAweDE5LCAweDZkLCAweDE3LCAweGNiLCAweGM5LCAweGM5LAorCTB4YzMsIDB4ZWYsIDB4Y2UsIDB4ZWEsIDB4YmUsIDB4NmMsIDB4ZGIsIDB4ZWEsIDB4ZGIsIDB4ZmEsIDB4MmUsIDB4YzcsCisJMHhjZiwgMHhiOSwgMHg3MCwgMHgwZSwgMHhmMCwgMHg2ZCwgMHg0YywgMHg1MywgMHhjYiwgMHhlOCwgMHg0ZSwgMHhjMywKKwkweDE4LCAweGYwLCAweDY1LCAweGI0LCAweDM1LCAweDhmLCAweGU4LCAweGZmLCAweDk5LCAweDA3LCAweGU1LCAweDY0LAorCTB4YzQsIDB4ZjAsIDB4Y2YsIDB4ZGIsIDB4NzEsIDB4NmQsIDB4NzAsIDB4M2QsIDB4M2YsIDB4MDYsIDB4YmYsIDB4ZGYsCisJMHgyYiwgMHgzZiwgMHhhZCwgMHgzOCwgMHhhMywgMHgyZiwgMHgzZiwgMHg0ZiwgMHhlYywgMHhjYSwgMHgwZiwgMHg3ZCwKKwkweGQ0LCAweDJlLCAweGM5LCAweGFkLCAweGQ4LCAweDMyLCAweDU5LCAweGQ2LCAweGZiLCAweDBkLCAweGFlLCAweGM5LAorCTB4ZjgsIDB4ZDEsIDB4MDksIDB4YzgsIDB4MGQsIDB4NjUsIDB4OWQsIDB4YmEsIDB4NjUsIDB4NGEsIDB4MTUsIDB4NzIsCisJMHg1NCwgMHgwNSwgMHgzZSwgMHg1NSwgMHgyMSwgMHg1MywgMHhlNCwgMHg0MCwgMHg1NSwgMHhlMCwgMHg1YiwgMHhiNSwKKwkweDY5LCAweDM5LCAweDc1LCAweGNjLCAweDk5LCAweDM2LCAweDdiLCAweDFkLCAweDcyLCAweDc0LCAweGI1LCAweGM5LAorCTB4ZmQsIDB4ZDcsIDB4NjMsIDB4MzYsIDB4NjksIDB4MDcsIDB4NmYsIDB4ZWUsIDB4ZWUsIDB4ZmQsIDB4YTcsIDB4ZDgsCisJMHhmYiwgMHgyMywgMHg3MiwgMHgwZCwgMHg3ZSwgMHhjYiwgMHhmNSwgMHhjYSwgMHgwOCwgMHgzMCwgMHg0OSwgMHg4MCwKKwkweDUxLCAweDJlLCAweDY0LCAweDIzLCAweDI1LCAweDFiLCAweDk1LCAweDcxLCAweGQ5LCAweDg0LCAweDdkLCAweGRhLAorCTB4NWEsIDB4NGQsIDB4ODAsIDB4NGYsIDB4MDMsIDB4NDcsIDB4YWYsIDB4MWMsIDB4OTMsIDB4MzcsIDB4NTYsIDB4OTUsCisJMHhjYywgMHhkOCwgMHhiMCwgMHgzMywgMHg2YiwgMHg4YywgMHhjMSwgMHg0MywgMHg5ZSwgMHhhYiwgMHg1ZCwgMHhmYSwKKwkweGJjLCAweDdkLCAweGEyLCAweGVlLCAweGM3LCAweGUyLCAweDczLCAweGY1LCAweDFlLCAweDk5LCAweGFjLCAweDliLAorCTB4ZjIsIDB4NTQsIDB4YmQsIDB4NTcsIDB4YmUsIDB4NWEsIDB4OGYsIDB4Y2EsIDB4ZTksIDB4NDYsIDB4NGMsIDB4YmUsCisJMHg1NiwgMHgxZiwgMHg5NCwgMHhhNywgMHhlYiwgMHg0NywgMHhlNCwgMHg5OSwgMHg0NiwgMHg1YywgMHhiZSwgMHgwZSwKKwkweGJmLCAweDMwLCAweGRmLCAweDcwLCAweDY0LCAweGFhLCAweDMxLCAweDIyLCAweGE3LCAweDFhLCAweDhjLCAweGIxLAorCTB4ZTMsIDB4N2IsIDB4ZjgsIDB4NjUsIDB4NzcsIDB4NjMsIDB4MTcsIDB4MWMsIDB4NTcsIDB4MjcsIDB4YzYsIDB4ZTUsCisJMHhhOCwgMHg5YywgMHgzZSwgMHg2ZiwgMHg5NCwgMHhiYywgMHgxZiwgMHhmZiwgMHgxMCwgMHg3OSwgMHgwMSwgMHg3ZCwKKwkweDE3LCAweGFlLCAweDI4LCAweGE5LCAweGU5LCAweGVmLCAweGI3LCAweGZlLCAweDQ3LCAweDI0LCAweGEyLCAweDdkLAorCTB4YTMsIDB4MTcsIDB4YWEsIDB4ODMsIDB4NjgsIDB4NjMsIDB4ZDMsIDB4MjcsIDB4MDksIDB4ZTIsIDB4MjAsIDB4YWQsCisJMHhmOCwgMHg3ZiwgMHhjYiwgMHhmNywgMHgzMiwgMHg3NCwgMHgwYywgMHhmYiwgMHgyNiwgMHg3ZCwgMHgyZiwgMHhiZCwKKwkweGY2LCAweGM0LCAweDBmLCAweGZhLCAweDM5LCAweGY0LCAweGI1LCAweGY2LCAweDllLCAweDUxLCAweGI0LCAweGJlLAorCTB4YmIsIDB4OTAsIDB4N2YsIDB4ZjQsIDB4N2YsIDB4NTEsIDB4ZmMsIDB4YjMsIDB4YTYsIDB4NzMsIDB4OGQsIDB4NDEsCisJMHhmZSwgMHg0ZiwgMHgwYSwgMHhjNiwgMHhmMiwgMHhmOSwgMHhmOSwgMHhkZCwgMHg5MywgMHg5NSwgMHgwOSwgMHhmNSwKKwkweDU0LCAweDg1LCAweDhjLCAweGM2LCAweDkzLCAweDg1LCAweGRkLCAweDNjLCAweGJhLCAweGFmLCAweGM4LCAweDlhLAorCTB4MWIsIDB4ZDEsIDB4NjMsIDB4ZjAsIDB4ZTMsIDB4ZjYsIDB4NjksIDB4OWQsIDB4NTMsIDB4MzcsIDB4MzEsIDB4NGMsCisJMHhmOSwgMHhlMywgMHgxOSwgMHg1YSwgMHg0ZiwgMHg3MCwgMHhiNiwgMHgwMCwgMHg2ZSwgMHhlYiwgMHg5YSwgMHg3MiwKKwkweGIxLCAweGVlLCAweGM3LCAweGFmLCAweGU2LCAweGI0LCAweGJjLCAweDVjLCAweDg3LCAweGNjLCAweGYxLCAweGZjLAorCTB4YzEsIDB4YmYsIDB4MTYsIDB4YWEsIDB4N2UsIDB4ZGYsIDB4ZWMsIDB4YjAsIDB4NDMsIDB4N2YsIDB4MWMsIDB4ZjMsCisJMHgzNSwgMHg3YSwgMHhmOSwgMHgyZCwgMHhmZSwgMHg0ZiwgMHgwZSwgMHhjYSwgMHhjMSwgMHg3OCwgMHg5OSwgMHgwZiwKKwkweDZjLCAweDZiLCAweDU5LCAweGY0LCAweGNmLCAweDY3LCAweDFkLCAweDc5LCAweDExLCAweDdiLCAweDUxLCAweDMzLAorCTB4MzksIDB4ZmUsIDB4NGUsIDB4YTksIDB4MzksIDB4ZjQsIDB4NmQsIDB4ODksIDB4ZGYsIDB4YzMsIDB4NTIsIDB4YzUsCisJMHg3NywgMHg2YSwgMHg0ZSwgMHgyYiwgMHgzNiwgMHhlNiwgMHhlMywgMHg2YywgMHhjZCwgMHg3YywgMHhmOCwgMHhkZCwKKwkweGU5LCAweGVhLCAweDQxLCAweGRjLCAweGEzLCAweGNlLCAweDAxLCAweDY3LCAweDNhLCAweGMzLCAweGZiLCAweDA1LAorCTB4OTQsIDB4MTksIDB4MWIsIDB4OTksIDB4YzMsIDB4MzUsIDB4MTYsIDB4ZDQsIDB4ZmQsIDB4N2MsIDB4NDAsIDB4NzMsCisJMHhmNSwgMHhmMSwgMHg4NywgMHhmZCwgMHg2NiwgMHhhYSwgMHg1NiwgMHgyMSwgMHgxMywgMHhiYSwgMHhhYiwgMHg4YywKKwkweDlmLCAweGFkLCAweDBmLCAweDEwLCAweDczLCAweDBmLCAweGRhLCAweGZjLCAweDQ1LCAweGU0LCAweDZmLCAweGE2LAorCTB4OGUsIDB4MjksIDB4MDQsIDB4Y2YsIDB4ZjYsIDB4YzksIDB4YjMsIDB4MjYsIDB4NzMsIDB4Y2QsIDB4ZDMsIDB4NmEsCisJMHhhMiwgMHhmMiwgMHg3MiwgMHg5MCwgMHg1NywgMHg3YiwgMHg1NywgMHgxZCwgMHhhYywgMHgzNSwgMHgwNywgMHhmYywKKwkweGJjLCAweDc0LCAweGJlLCAweDdiLCAweDZmLCAweDJlLCAweGZhLCAweDVlLCAweDM5LCAweDYxLCAweDRlLCAweDdhLAorCTB4MDcsIDB4NzgsIDB4YWIsIDB4MzYsIDB4NjIsIDB4ZDAsIDB4NDEsIDB4ZTAsIDB4OWQsIDB4ZGQsIDB4YTYsIDB4ZjUsCisJMHhiMSwgMHhkOCwgMHhmOCwgMHg5NywgMHhiNywgMHhhZCwgMHhmNSwgMHhiOSwgMHgxNSwgMHg2MywgMHhiOCwgMHgzNSwKKwkweDQwLCAweGRmLCAweDk2LCAweGI4LCAweDcxLCAweGQxLCAweDhmLCAweDFiLCAweDY5LCAweDFmLCAweDFhLCAweDU4LAorCTB4ODEsIDB4M2EsIDB4ZWEsIDB4MmEsIDB4ZjQsIDB4NjQsIDB4YjcsIDB4MmQsIDB4ZmYsIDB4ZmUsIDB4MDMsIDB4N2QsCisJMHhlNywgMHg5NSwgMHhmMCwgMHgyYywgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCB9OwogCiBzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1JvZGF0YVsoMHgyOC80KSArIDFdID0gewotCTB4MDgwMDQ2OGMsIDB4MDgwMDQ1OGMsIDB4MDgwMDQ2MzAsIDB4MDgwMDQ2NDgsIDB4MDgwMDQ2NjAsIDB4MDgwMDQ2ODAsCi0JMHgwODAwNDY4YywgMHgwODAwNDY4YywgMHgwODAwNDU5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd0Jzc1soMHgxM2E0LzQpICsgMV0gPSB7IDB4MCB9Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1Nic3NbKDB4MWMvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3Um9kYXRhWygweDI3OC80KSArIDFdID0geworCTB4MDgwMDNmZGMsIDB4MDgwMDNlZGMsIDB4MDgwMDNmODAsIDB4MDgwMDNmOTgsIDB4MDgwMDNmYjAsIDB4MDgwMDNmZDAsCisJMHgwODAwM2ZkYywgMHgwODAwM2ZkYywgMHgwODAwM2VlNCwgMHgwMDAwMDAwMCwgMHgwODAwNGEwNCwgMHgwODAwNGEzYywKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YTc0LCAweDA4MDA0YzM4LAorCTB4MDgwMDRiODAsIDB4MDgwMDRiYjgsIDB4MDgwMDRjMzgsIDB4MDgwMDRiMDgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGJiOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YmY4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRiZjgsIDB4MDgwMDRiODAsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRiZjgsCisJMHgwODAwNGJmOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YWU0LCAweDAwMDAwMDAwLCAweDA4MDA2MDE4LCAweDA4MDA2MDMwLCAweDA4MDA2MDMwLCAweDA4MDA2MDMwLAorCTB4MDgwMDYwMTgsIDB4MDgwMDYwMzAsIDB4MDgwMDYwMzAsIDB4MDgwMDYwMzAsIDB4MDgwMDYwMTgsIDB4MDgwMDYwMzAsCisJMHgwODAwNjAzMCwgMHgwODAwNjAzMCwgMHgwODAwNjAxOCwgMHgwODAwNjAzMCwgMHgwODAwNjAzMCwgMHgwODAwNjAzMCwKKwkweDA4MDA2MDI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH07CisKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndCc3NbKDB4MTNkYy80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndTYnNzWygweDJjLzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9yeHBfZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgyLAorCS52ZXJfbWlub3IJCQk9IDB4OCwKKwkudmVyX2ZpeAkJCT0gMHgxNywKKworCS5zdGFydF9hZGRyCQkJPSAweDA4MDAzMTg0LAorCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKKwkudGV4dF9sZW4JCQk9IDB4NjcyOCwKKwkudGV4dF9pbmRleAkJCT0gMHgwLAorCS5nel90ZXh0CQkJPSBibngyX1JYUF9iMDZGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9SWFBfYjA2RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDY5YzAsCisJLmRhdGFfbGVuCQkJPSAweDAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfUlhQX2IwNkZ3RGF0YSwKKworCS5zYnNzX2FkZHIJCQk9IDB4MDgwMDY5YzAsCisJLnNic3NfbGVuCQkJPSAweDJjLAorCS5zYnNzX2luZGV4CQkJPSAweDAsCisJLnNic3MJCQkJPSBibngyX1JYUF9iMDZGd1Nic3MsCisKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDY5ZjAsCisJLmJzc19sZW4JCQk9IDB4MTNkYywKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfUlhQX2IwNkZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA2NzI4LAorCS5yb2RhdGFfbGVuCQkJPSAweDI3OCwKKwkucm9kYXRhX2luZGV4CQkJPSAweDAsCisJLnJvZGF0YQkJCQk9IGJueDJfUlhQX2IwNkZ3Um9kYXRhLAorfTsKIAogc3RhdGljIHU4IGJueDJfcnYycF9wcm9jMVtdID0gewogCTB4MWYsIDB4OGIsIDB4MDgsIDB4MDgsIDB4NWUsIDB4ZDAsIDB4NDEsIDB4NDQsIDB4MDAsIDB4MDMsIDB4NzQsIDB4NjUsCkBAIC0xMzE2LDIwICsxNjY1LDYgQEAKIAkweDYzLCAweGQ2LCAweDExLCAweDhmLCAweDQ3LCAweGQ1LCAweDVmLCAweDNmLCAweDk3LCAweDhmLCAweDMxLCAweGQ4LAogCTB4MTcsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndSZWxlYXNlTWFqb3IgPSAweDE7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZUZpeCA9IDB4MDsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3U3RhcnRBZGRyID0gMHgwODAwMDg2MDsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwODAwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndUZXh0TGVuID0gMHgxMjJjOwotc3RhdGljIGNvbnN0IHUzMiBibngyX1RQQVRfYjA2RndEYXRhQWRkciA9IDB4MDgwMDFhNjA7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd0RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFBBVF9iMDZGd1JvZGF0YUFkZHIgPSAweDAwMDAwMDAwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndSb2RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFBBVF9iMDZGd0Jzc0FkZHIgPSAweDA4MDAxYWEwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndCc3NMZW4gPSAweDI1MDsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3U2Jzc0FkZHIgPSAweDA4MDAxYTYwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndTYnNzTGVuID0gMHgzNDsKIHN0YXRpYyB1OCBibngyX1RQQVRfYjA2RndUZXh0W10gPSB7CiAJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHg0NywgMHhkMiwgMHg0MSwgMHg0NCwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKIAkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGM1LCAweDU3LCAweDRkLCAweDY4LApAQCAtMTUyOSwyMCArMTg2NCw0MCBAQAogc3RhdGljIHUzMiBibngyX1RQQVRfYjA2RndCc3NbKDB4MjUwLzQpICsgMV0gPSB7IDB4MCB9Owogc3RhdGljIHUzMiBibngyX1RQQVRfYjA2RndTYnNzWygweDM0LzQpICsgMV0gPSB7IDB4MCB9OwogCi1zdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3UmVsZWFzZU1ham9yID0gMHgxOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9UWFBfYjA2RndSZWxlYXNlRml4ID0gMHgwOwotc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd1N0YXJ0QWRkciA9IDB4MDgwMDM0YjA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwMDAwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd1RleHRMZW4gPSAweDU3NDg7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3RGF0YUFkZHIgPSAweDA4MDA1NzYwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd0RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDAwMDAwMDA7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3Um9kYXRhTGVuID0gMHgwOwotc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd0Jzc0FkZHIgPSAweDA4MDA1N2EwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd0Jzc0xlbiA9IDB4MWM0Owotc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd1Nic3NBZGRyID0gMHgwODAwNTc2MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9UWFBfYjA2RndTYnNzTGVuID0gMHgzODsKK3N0YXRpYyBzdHJ1Y3QgZndfaW5mbyBibngyX3RwYXRfZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDA4NjAsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwODAwLAorCS50ZXh0X2xlbgkJCT0gMHgxMjJjLAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfVFBBVF9iMDZGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9UUEFUX2IwNkZ3VGV4dCksCisKKwkuZGF0YV9hZGRyCQkJPSAweDA4MDAxYTYwLAorCS5kYXRhX2xlbgkJCT0gMHgwLAorCS5kYXRhX2luZGV4CQkJPSAweDAsCisJLmRhdGEJCQkJPSBibngyX1RQQVRfYjA2RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwMWE2MCwKKwkuc2Jzc19sZW4JCQk9IDB4MzQsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfVFBBVF9iMDZGd1Nic3MsCisKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDFhYTAsCisJLmJzc19sZW4JCQk9IDB4MjUwLAorCS5ic3NfaW5kZXgJCQk9IDB4MCwKKwkuYnNzCQkJCT0gYm54Ml9UUEFUX2IwNkZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDAwMDAwMDAwLAorCS5yb2RhdGFfbGVuCQkJPSAweDAsCisJLnJvZGF0YV9pbmRleAkJCT0gMHgwLAorCS5yb2RhdGEJCQkJPSBibngyX1RQQVRfYjA2RndSb2RhdGEsCit9OworCiBzdGF0aWMgdTggYm54Ml9UWFBfYjA2RndUZXh0W10gPSB7CiAJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHgyMSwgMHhkMywgMHg0MSwgMHg0NCwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKIAkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGVkLCAweDVjLCAweDZkLCAweDZjLApAQCAtMTk2NCwzICsyMzE5LDM4IEBACiBzdGF0aWMgdTMyIGJueDJfVFhQX2IwNkZ3Um9kYXRhWygweDAvNCkgKyAxXSA9IHsgMHgwIH07CiBzdGF0aWMgdTMyIGJueDJfVFhQX2IwNkZ3QnNzWygweDFjNC80KSArIDFdID0geyAweDAgfTsKIHN0YXRpYyB1MzIgYm54Ml9UWFBfYjA2RndTYnNzWygweDM4LzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml90eHBfZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDM0YjAsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAorCS50ZXh0X2xlbgkJCT0gMHg1NzQ4LAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfVFhQX2IwNkZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX1RYUF9iMDZGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNTc2MCwKKwkuZGF0YV9sZW4JCQk9IDB4MCwKKwkuZGF0YV9pbmRleAkJCT0gMHgwLAorCS5kYXRhCQkJCT0gYm54Ml9UWFBfYjA2RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNTc2MCwKKwkuc2Jzc19sZW4JCQk9IDB4MzgsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfVFhQX2IwNkZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwNTdhMCwKKwkuYnNzX2xlbgkJCT0gMHgxYzQsCisJLmJzc19pbmRleAkJCT0gMHgwLAorCS5ic3MJCQkJPSBibngyX1RYUF9iMDZGd0JzcywKKworCS5yb2RhdGFfYWRkcgkJCT0gMHgwMDAwMDAwMCwKKwkucm9kYXRhX2xlbgkJCT0gMHgwLAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9UWFBfYjA2RndSb2RhdGEsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyX2Z3Mi5oIGIvZHJpdmVycy9uZXQvYm54Ml9mdzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBjNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm54Ml9mdzIuaApAQCAtMCwwICsxLDQwODYgQEAKKy8qIGJueDJfZncyLmg6IEJyb2FkY29tIE5YMiBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGV4Y2VwdCBhcyBub3RlZCBiZWxvdy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZmlybXdhcmUgZGF0YSBkZXJpdmVkIGZyb20gcHJvcHJpZXRhcnkgdW5wdWJsaXNoZWQKKyAqIHNvdXJjZSBjb2RlLCBDb3B5cmlnaHQgKGMpIDIwMDYgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlIGRhdGEKKyAqIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMKKyAqIGFjY29tcGFueWluZyBpdC4KKyAqLworCitzdGF0aWMgdTggYm54Ml9DT01fYjA5RndUZXh0W10gPSB7CisJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHhhYywgMHhmYiwgMHgyZiwgMHg0NSwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKKwkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGRjLCAweDViLCAweDZiLCAweDcwLAorCTB4MWIsIDB4ZDcsIDB4NzUsIDB4M2UsIDB4ZmIsIDB4MDAsIDB4MDksIDB4OTEsIDB4MTAsIDB4YjUsIDB4YTQsIDB4NjAsCisJMHgxYSwgMHg5NiwgMHg2OCwgMHgwNywgMHgyMCwgMHg1NywgMHgyMiwgMHg2YSwgMHhiMSwgMHgyOSwgMHg0YywgMHgzMywKKwkweDE2LCAweDliLCAweGMyLCAweDEyLCAweDAyLCAweDUwLCAweGFlLCAweDI2LCAweGMzLCAweDNhLCAweDk0LCAweGNkLAorCTB4ZDgsIDB4NGEsIDB4YWEsIDB4YzksIDB4MzAsIDB4MDAsIDB4YTUsIDB4ZjQsIDB4NjEsIDB4YjcsIDB4OTIsIDB4YWIsCisJMHhhOSwgMHg1ZCwgMHhkNywgMHhhYSwgMHgyMSwgMHg5MiwgMHg2YSwgMHhmNSwgMHg4MywgMHhlNSwgMHgyYSwgMHgxNiwKKwkweDQzLCAweGE5LCAweGQzLCAweDc0LCAweGMyLCAweDEyLCAweDU2LCAweGFjLCAweDRlLCAweDMxLCAweDg1LCAweGZjLAorCTB4ZDYsIDB4MzgsIDB4YjEsIDB4YzksIDB4NGEsIDB4NzYsIDB4ZWIsIDB4ZjQsIDB4ZTEsIDB4YTYsIDB4MzMsIDB4Y2QsCisJMHhhMywgMHg5ZCwgMHgzNiwgMHhmNiwgMHhhOCwgMHgzZiwgMHhlYSwgMHhlOSwgMHhkMywgMHgzMywgMHg2ZSwgMHhhNywKKwkweGVhLCAweGQ4LCAweDBlLCAweGZhLCAweDdkLCAweDc3LCAweDc3LCAweDgxLCAweDI1LCAweDQ4LCAweGJkLCAweGZjLAorCTB4YzgsIDB4OGYsIDB4NzAsIDB4MDYsIDB4YjMsIDB4N2IsIDB4ZWYsIDB4ZGUsIDB4YmQsIDB4ZjcsIDB4ZGMsIDB4ZjMsCisJMHhmOCwgMHhjZSwgMHg2MywgMHgyZiwgMHhmYiwgMHg0NCwgMHg1YSwgMHhjNCwgMHhmYiwgMHg1YiwgMHg4YiwgMHg1ZiwKKwkweGZjLCAweGZlLCAweDVmLCAweDJkLCAweDdjLCAweDdjLCAweGYwLCAweGUzLCAweGZkLCAweDIyLCAweGI3LCAweGRjLAorCTB4YTIsIDB4YjcsIDB4ODYsIDB4NzUsIDB4ZjYsIDB4MWIsIDB4ZjgsIDB4NDUsIDB4ZjEsIDB4ZWIsIDB4ZjcsIDB4ZWUsCisJMHg1NywgMHhmYiwgMHhiMywgMHhmMCwgMHg3YiwgMHgxMywgMHgwZiwgMHhjNywgMHhmZSwgMHg1NSwgMHg0NCwgMHhiYiwKKwkweGM0LCAweDk4LCAweGUwLCAweDVmLCAweGI1LCAweDdhLCAweGY5LCAweGU3LCAweDVjLCAweDM4LCAweDdlLCAweDg5LAorCTB4NjcsIDB4ODYsIDB4YmIsIDB4OWMsIDB4YTIsIDB4OTcsIDB4M2YsIDB4MDksIDB4ZWIsIDB4NjksIDB4MzksIDB4OTQsCisJMHhiNSwgMHgyNSwgMHg2YywgMHhhNCwgMHhkZiwgMHgzYywgMHg1NCwgMHhiMCwgMHg0NSwgMHgzMiwgMHhlNSwgMHgyZCwKKwkweGYxLCAweDljLCAweGJjLCAweDU3LCAweDJkLCAweDQ2LCAweDRkLCAweDYxLCAweGZmLCAweDhkLCAweGU5LCAweDc3LAorCTB4YmYsIDB4ZjYsIDB4ZTIsIDB4ZDYsIDB4YzQsIDB4NWIsIDB4ZjMsIDB4ODYsIDB4ODQsIDB4YWQsIDB4ZjQsIDB4MTksCisJMHhiMSwgMHgzNiwgMHg0YiwgMHhiOCwgMHgwYiwgMHhlZiwgMHg3YywgMHhiNSwgMHhmNywgMHgzZCwgMHg5MSwgMHgzNiwKKwkweDdmLCAweGFlLCAweDM3LCAweGFiLCAweDJmLCAweGY2LCAweDRhLCAweDcxLCAweDQzLCAweDNhLCAweDJjLCAweDdhLAorCTB4N2EsIDB4ZDMsIDB4ZjcsIDB4YjMsIDB4ODYsIDB4MzUsIDB4NjYsIDB4YTQsIDB4MmQsIDB4NTksIDB4YWMsIDB4YzgsCisJMHhjOCwgMHhkZSwgMHg2OSwgMHgwOSwgMHg4NywgMHhkMywgMHg0NywgMHg5YiwgMHg5YiwgMHgzNywgMHg0OSwgMHhkOCwKKwkweDRjLCAweDhmLCAweDFkLCAweGZhLCAweDZkLCAweGZiLCAweGQxLCAweGFhLCAweDZlLCAweGRiLCAweGM5LCAweDA1LAorCTB4ODksIDB4MGMsIDB4OWUsIDB4MWEsIDB4YzAsIDB4ZjMsIDB4NzIsIDB4MjIsIDB4MjksIDB4YjIsIDB4NTUsIDB4NzQsCisJMHhiYiwgMHgxOCwgMHgzMSwgMHhlYywgMHhiMCwgMHg2NCwgMHgyYiwgMHhiNiwgMHhlNCwgMHgyYSwgMHgyMiwgMHg3ZiwKKwkweDVlLCAweGQ2LCAweGU0LCAweDk0LCAweGRkLCAweDI5LCAweDBiLCAweDdkLCAweGVmLCAweDU2LCAweDMzLCAweGEwLAorCTB4ZTUsIDB4Y2YsIDB4ZWMsIDB4YjEsIDB4NDMsIDB4NTMsIDB4MzYsIDB4ZTksIDB4OWQsIDB4NmQsIDB4NzYsIDB4ZTksCisJMHg5ZCwgMHg2YSwgMHgyYSwgMHhkOCwgMHhhNiwgMHg0YywgMHg5NCwgMHhkOSwgMHgzNywgMHhhMiwgMHhiMywgMHgyZiwKKwkweDk0LCAweDdlLCAweDY4LCAweGNkLCAweDI5LCAweDNiLCAweGUyLCAweGY1LCAweGVkLCAweGRjLCAweDllLCAweGM1LAorCTB4N2MsIDB4OTMsIDB4NjUsIDB4OGUsIDB4M2QsIDB4OTMsIDB4MmEsIDB4ZDgsIDB4NTEsIDB4YWYsIDB4M2YsIDB4NzksCisJMHg1YiwgMHhkNiwgMHg4ZSwgMHhhMSwgMHhiZiwgMHhjYiwgMHg3YiwgMHg3NiwgMHhmMiwgMHhiZSwgMHg4MiwgMHg2ZCwKKwkweDdiLCAweGNmLCAweGJlLCAweDhhLCAweGI5LCAweDkzLCAweDVlLCAweGZmLCAweDdkLCAweGRiLCAweDBhLCAweDc2LAorCTB4OWYsIDB4ZDcsIDB4M2YsIDB4YmQsIDB4MmQsIDB4NmIsIDB4YTcsIDB4YmMsIDB4ZmUsIDB4ZTQsIDB4ZWUsIDB4ODIsCisJMHgzZCwgMHhlMCwgMHhmNSwgMHg5ZiwgMHhiZCwgMHgzZCwgMHg2YiwgMHgwZiwgMHg3YSwgMHhmZCwgMHgwZiwgMHg2ZCwKKwkweDJkLCAweGQ4LCAweDY5LCAweGY0LCAweDFmLCAweDZkLCAweGQ2LCAweDM3LCAweDU5LCAweDcyLCAweGE0LCAweDFjLAorCTB4YzcsIDB4MmYsIDB4ODMsIDB4NjcsIDB4NDMsIDB4ZTgsIDB4ZGIsIDB4ODksIDB4ZGYsIDB4MzAsIDB4N2UsIDB4YmYsCisJMHhiOCwgMHg0ZSwgMHhkYSwgMHg0NiwgMHg3MCwgMHhmZCwgMHhjNiwgMHg0NiwgMHg5NywgMHg3NywgMHhlMCwgMHg5MSwKKwkweDEzLCAweDk2LCAweDM3LCAweDhjLCAweDk4LCAweGJjLCAweGQ4LCAweGZiLCAweDA2LCAweDc4LCAweDY4LCAweGM5LAorCTB4OTksIDB4OGEsIDB4NjgsIDB4MjMsIDB4YmQsIDB4MzEsIDB4ZjAsIDB4MmUsIDB4MmEsIDB4NGYsIDB4NTYsIDB4NWEsCisJMHhjNSwgMHg3OCwgMHhjYywgMHgwMCwgMHg2ZiwgMHgzZSwgMHgyZiwgMHhmOSwgMHg2OCwgMHg1OCwgMHhkYSwgMHhlNywKKwkweDM0LCAweGU5LCAweGVlLCAweDBmLCAweDRiLCAweGM2LCAweDUyLCAweDcyLCAweDEzLCAweDdkLCAweDI2LCAweDJhLAorCTB4YzYsIDB4NWMsIDB4NjYsIDB4YmQsIDB4MmUsIDB4OWIsIDB4YWMsIDB4OWMsIDB4MTQsIDB4YzEsIDB4YmIsIDB4ZWYsCisJMHg1MSwgMHgyNywgMHhmMSwgMHgyYywgMHgyZSwgMHhiOSwgMHhlOSwgMHg5YiwgMHg2NSwgMHhjYywgMHgyMiwgMHg1ZCwKKwkweDNiLCAweDZmLCAweDc0LCAweGQ3LCAweDBhLCAweDZiLCAweGQ5LCAweDEzLCAweDIzLCAweDcyLCAweGM0LCAweDg5LAorCTB4NjgsIDB4YjksIDB4MTMsIDB4ZGIsIDB4MjQsIDB4OWIsIDB4OTIsIDB4MjgsIDB4ZGUsIDB4OGIsIDB4ZTUsIDB4ZjEsCisJMHhhNCwgMHg1NCwgMHgxZSwgMHg5MSwgMHgyOSwgMHg0NywgMHhiNCwgMHhhYywgMHg0MywgMHg3ZSwgMHg3NiwgMHhlMiwKKwkweDc5LCAweDliLCAweDFhLCAweDhiLCAweGJlLCAweDJlLCAweDQzLCAweGNkLCAweDFkLCAweDQ2LCAweGJmLCAweDg1LAorCTB4ZmUsIDB4MGUsIDB4NmQsIDB4NDgsIDB4Y2QsIDB4YTEsIDB4ZmEsIDB4ZTMsIDB4OTMsIDB4MTIsIDB4OTEsIDB4YzcsCisJMHhjYiwgMHg1MSwgMHg2ZiwgMHg2YywgMHhiNSwgMHg5YSwgMHg0ZCwgMHg1OSwgMHgxOCwgMHgzNywgMHgyMiwgMHg5MywKKwkweDRlLCAweDU0LCAweGM2LCAweDcwLCAweDlkLCAweDcwLCAweGI4LCAweDdlLCAweDBjLCAweDNhLCAweGY1LCAweGRhLAorCTB4YTEsIDB4ZmMsIDB4YWMsIDB4OWEsIDB4MmYsIDB4NmUsIDB4YTQsIDB4MzksIDB4NWYsIDB4MTcsIDB4YzYsIDB4NGQsCisJMHg4MCwgMHgyZSwgMHg0ZCwgMHg0YywgMHgyNSwgMHhjYiwgMHg4YywgMHhlNCwgMHhhNywgMHgzNSwgMHhlOCwgMHgxYiwKKwkweGFlLCAweDhhLCAweGFmLCAweDQzLCAweGEwLCAweGRmLCAweDE0LCAweGJiLCAweDVmLCAweDkzLCAweDAyLCAweDY0LAorCTB4NTUsIDB4YjQsIDB4ZDAsIDB4MmUsIDB4OWYsIDB4ZDUsIDB4YjMsIDB4NGUsIDB4YjMsIDB4ZTQsIDB4Y2MsIDB4YjgsCisJMHgxOCwgMHgzMywgMHg0YSwgMHg5NywgMHg2NCwgMHgxMiwgMHhlZiwgMHhlOCwgMHgzNiwgMHhjNywgMHg1YywgMHhjNCwKKwkweGJlLCAweGM3LCAweDk0LCAweDFjLCAweDlhLCAweGQyLCAweDQ1LCAweDNkLCAweDU3LCAweGU5LCAweDE0LCAweDdkLAorCTB4NmUsIDB4OGYsIDB4YmMsIDB4M2MsIDB4MmQsIDB4OTYsIDB4OTEsIDB4N2UsIDB4YjcsIDB4OWEsIDB4YjUsIDB4YTcsCisJMHhmNCwgMHhlYywgMHgxMywgMHhhNiwgMHg4NCwgMHg2NiwgMHgzNCwgMHg5OSwgMHhiMiwgMHgxMywgMHhiMCwgMHg4MCwKKwkweGEzLCAweGZhLCAweDhlLCAweGNhLCAweDU5LCAweDhjLCAweGUzLCAweDdiLCAweDE4LCAweDU3LCAweGQ2LCAweGMxLAorCTB4NTcsIDB4ZGUsIDB4NmYsIDB4YjEsIDB4NzQsIDB4YTUsIDB4Y2YsIDB4MWMsIDB4MDMsIDB4MTksIDB4NjAsIDB4MWYsCisJMHg0ZiwgMHgzYSwgMHg5MCwgMHg4OSwgMHg5MiwgMHg1MSwgMHgxYywgMHgzMiwgMHg3YSwgMHgxNSwgMHgzMiwgMHgxYSwKKwkweDgwLCAweDZjLCAweDUyLCAweGYyLCAweDUyLCAweGE1LCAweDRmLCAweDllLCAweGFmLCAweDI0LCAweGU1LCAweDM5LAorCTB4ZTgsIDB4ZWIsIDB4YjMsIDB4OTUsIDB4YjgsIDB4M2MsIDB4NTMsIDB4ZTksIDB4OTIsIDB4YTcsIDB4MmIsIDB4MzEsCisJMHg3OSwgMHg0YSwgMHhjOSwgMHgyZCwgMHgwNywgMHhkYiwgMHg1MCwgMHhiMiwgMHgwYywgMHg1ZiwgMHg5ZiwgMHg5NiwKKwkweDcwLCAweDI3LCAweGU0LCAweGQxLCAweDAxLCAweGZkLCAweDY5LCAweDg3LCAweDZlLCAweDdlLCAweGE1LCAweDM3LAorCTB4MmMsIDB4YjMsIDB4YmQsIDB4OTIsIDB4NTksIDB4OGYsIDB4ZmUsIDB4OWIsIDB4ZDIsIDB4YTYsIDB4ZTIsIDB4OTEsCisJMHg4OSwgMHhlNywgMHg5MywgMHhkMywgMHgyMSwgMHhjOSwgMHg1OSwgMHg4ZiwgMHhjYiwgMHg4NSwgMHgxOSwgMHg1MywKKwkweDI2LCAweDJiLCAweGRiLCAweDZmLCAweDcyLCAweDY1LCAweGM2LCAweGY2LCAweGJjLCAweDljLCAweDlmLCAweDY5LAorCTB4YzIsIDB4YjMsIDB4NzksIDB4NzksIDB4NzksIDB4YjMsIDB4MmUsIDB4MTMsIDB4YjMsIDB4NmYsIDB4ODksIDB4MDksCisJMHgxZSwgMHgwZSwgMHgyOSwgMHg3OSwgMHgzZiwgMHgyZSwgMHhmZiwgMHhmYywgMHgyNywgMHgyMiwgMHgyMywgMHhlMCwKKwkweDhiLCAweGRlLCAweGZmLCAweGVmLCAweGQ1LCAweDhjLCAweDA1LCAweDdlLCAweGY0LCAweGY3LCAweDQxLCAweDNmLAorCTB4NzQsIDB4NWMsIDB4MjksIDB4Y2YsIDB4MzgsIDB4YzYsIDB4OTgsIDB4NWEsIDB4Y2UsIDB4MzksIDB4MGQsIDB4OWIsCisJMHg2YSwgMHhkNSwgMHhiMiwgMHhjNywgMHg0NSwgMHgwYSwgMHhjNywgMHhhYiwgMHg1MiwgMHg0OCwgMHg4NSwgMHhlNCwKKwkweDAxLCAweGFiLCAweDJhLCAweDQzLCAweGE5LCAweDI2LCAweDM5LCAweDYwLCAweDc1LCAweGNhLCAweDQ0LCAweGRmLAorCTB4Y2YsIDB4NjgsIDB4M2UsIDB4OTYsIDB4N2QsIDB4YTUsIDB4OTIsIDB4YzYsIDB4M2QsIDB4ZmIsIDB4NDQsIDB4NjYsCisJMHhkNSwgMHhiZCwgMHhkYiwgMHg1ZiwgMHhhYywgMHg4NCwgMHgyNCwgMHgxMywgMHgyZCwgMHhjNiwgMHg0YywgMHhiOSwKKwkweGEwLCAweGI5LCAweGI0LCAweGVkLCAweGY0LCAweDlmLCAweDQxLCAweDVlLCAweDYzLCAweGMwLCAweDkwLCAweDg0LAorCTB4ZDIsIDB4YTUsIDB4ZmMsIDB4ZjQsIDB4OWEsIDB4OGIsIDB4MTksIDB4ZDUsIDB4MWQsIDB4NTIsIDB4N2EsIDB4NmEsCisJMHhhNCwgMHg0ZCwgMHhkMiwgMHgzMSwgMHhhNiwgMHhhNSwgMHhhMywgMHhkMiwgMHhhZCwgMHhlYywgMHg2NCwgMHgwMCwKKwkweDYzLCAweDA2LCAweGI1LCAweGJiLCAweDJiLCAweDk0LCAweDM3LCAweGVlLCAweGNiLCAweGE0LCAweDc1LCAweDAzLAorCTB4YzYsIDB4OWEsIDB4YjgsIDB4NjYsIDB4M2MsIDB4OWEsIDB4ODMsIDB4NzQsIDB4NzIsIDB4MmUsIDB4ZDIsIDB4YzksCisJMHhlYiwgMHhkZSwgMHgwMCwgMHg5ZCwgMHhmYiwgMHg2YSwgMHhmNywgMHhiMywgMHg4MSwgMHhmYiwgMHg2MiwgMHhlNSwKKwkweGQ3LCAweDViLCAweDVjLCAweGZhLCAweGM4LCAweGQ3LCAweDQxLCAweDk5LCAweDk4LCAweDdlLCAweGM4LCAweDViLAorCTB4MGIsIDB4ZjcsIDB4NjUsIDB4YWUsIDB4YjEsIDB4MDAsIDB4M2UsIDB4YTksIDB4OTEsIDB4NTcsIDB4NTgsIDB4YWIsCisJMHgxOCwgMHg1OCwgMHhlYiwgMHg3MCwgMHg2MCwgMHhhZCwgMHhjMywgMHg4MSwgMHhiNSwgMHg4YSwgMHhlMCwgMHhhZCwKKwkweGFjLCAweGQzLCAweDgxLCAweDMzLCAweDc5LCAweGMyLCAweGJjLCAweDFjLCAweGM1LCAweDljLCAweDZmLCAweDg4LAorCTB4OTEsIDB4YTYsIDB4MmQsIDB4ZjgsIDB4MzYsIDB4ZjksIDB4MDcsIDB4MTgsIDB4OWYsIDB4OTYsIDB4NzMsIDB4MGUsCisJMHg3OCwgMHg3MywgMHgzYywgMHgyNCwgMHg3NywgMHhhOSwgMHg3MSwgMHhmZiwgMHhiMSwgMHhjNiwgMHhhNSwgMHgzMSwKKwkweGY4LCAweDJjLCAweDJjLCAweGJiLCAweGEyLCAweGJjLCAweGY3LCAweDlmLCAweDk5LCAweGUwLCAweDM3LCAweGRiLAorCTB4OTMsIDB4MzcsIDB4YjgsIDB4NmQsIDB4ZGUsIDB4OWYsIDB4ZjUsIDB4ZjYsIDB4ZDIsIDB4ZWUsIDB4YmUsIDB4NTcsCisJMHg3OSwgMHg1MywgMHg2MSwgMHhjNiwgMHg2MiwgMHg4NSwgMHhiNiwgMHgyZCwgMHgyOSwgMHhjMywgMHg5NiwgMHhmZCwKKwkweDQzLCAweGE5LCAweDRlLCAweDk5LCAweGI0LCAweGI0LCAweGQ0LCAweDQ0LCAweGIyLCAweDk5LCAweGZjLCAweGNmLAorCTB4ZTgsIDB4NzYsIDB4MmIsIDB4ZWMsIDB4NDcsIDB4ZTIsIDB4M2EsIDB4NzEsIDB4NTEsIDB4ZWQsIDB4ZWIsIDB4NWIsCisJMHgxZSwgMHhmZCwgMHgxNiwgMHhkYiwgMHgyMywgMHhiYSwgMHhkZCwgMHhkMSwgMHhkMCwgMHg0ZiwgMHhmZCwgMHhmZiwKKwkweDRiLCAweGRjLCAweGQzLCAweDA2LCAweGZhLCAweDc1LCAweDc3LCAweGVkLCAweGJmLCAweDQyLCAweDliLCAweDU4LAorCTB4MTUsIDB4ZjEsIDB4ZGEsIDB4ZmUsIDB4ZjMsIDB4ZmYsIDB4MzIsIDB4OTYsIDB4YjcsIDB4OGYsIDB4NmQsIDB4NWMsCisJMHhkZSwgMHhmNiwgMHg2ZCwgMHgyOSwgMHg4OCwgMHg3MywgMHhkYywgMHgyYiwgMHg2YywgMHhkOCwgMHhhNiwgMHhmZSwKKwkweDg1LCAweDQwLCAweDZiLCAweDBhLCAweDM2LCAweGRjLCAweGVjLCAweGQxLCAweGYwLCAweGJhLCAweDQ3LCAweDAzLAorCTB4NjgsIDB4YzUsIDB4YjgsIDB4ODksIDB4MGEsIDB4ZGYsIDB4NTEsIDB4YTIsIDB4NmMsIDB4NjgsIDB4OTMsIDB4ZjcsCisJMHhmZSwgMHhmZCwgMHg1YSwgMHhmNSwgMHhmYywgMHgwZCwgMHg4MywgMHhlYiwgMHhmOCwgMHg1NywgMHhkMSwgMHg4NiwKKwkweDYwLCAweDY3LCAweDkzLCAweGIzLCAweGE2LCAweGU0LCAweDUzLCAweDMxLCAweDY1LCAweDBmLCAweGY5LCAweDU0LAorCTB4MWQsIDB4M2YsIDB4MjYsIDB4YTcsIDB4MWIsIDB4ZjEsIDB4ODMsIDB4ZWYsIDB4MTEsIDB4M2YsIDB4NWMsIDB4ZWMsCisJMHg5OCwgMHg5OCwgMHgyNSwgMHg4ZSwgMHhkNCwgMHg3MSwgMHhlMywgMHhjOCwgMHhiNCwgMHg4ZiwgMHgyNSwgMHg5YywKKwkweDliLCAweDE4LCAweGUyLCAweGUzLCAweDA3LCAweGRmLCAweDIzLCAweDdlLCAweDE4LCAweDkwLCAweDE1LCAweGU3LAorCTB4ZjQsIDB4ZDcsIDB4OWYsIDB4NmEsIDB4OTgsIDB4N2IsIDB4NGEsIDB4NjEsIDB4OTMsIDB4OGIsIDB4Y2IsIDB4NmYsCisJMHgwNiwgMHg3MCwgMHhiZSwgMHgwYiwgMHgxOCwgMHgxZCwgMHg4NSwgMHhmYywgMHg3YywgMHg4YywgMHgyNiwgMHg3NiwKKwkweGM2LCAweDgwLCAweGViLCAweGUwLCAweDkxLCAweGMyLCAweGU0LCAweDA4LCAweDcwLCAweGNjLCAweGY0LCAweDMwLAorCTB4MzUsIDB4ZWMsIDB4NjEsIDB4NmEsIDB4MDQsIDB4NzgsIDB4Y2EsIDB4YjYsIDB4ZTUsIDB4YjUsIDB4YTMsIDB4NWUsCisJMHgzYiwgMHg4NiwgMHgzNiwgMHhmYywgMHhlZiwgMHgxYywgMHg2ZCwgMHhlYywgMHhiNSwgMHg0MywgMHhlMywgMHhiMywKKwkweDBhLCAweGE3LCAweDg5LCAweGYxLCAweGMwLCAweDBhLCAweGUyLCAweDJjLCAweGYxLCAweGI2LCAweDRiLCAweDE2LAorCTB4Y2EsIDB4NTgsIDB4YWYsIDB4ODYsIDB4NjksIDB4OTQsIDB4NDcsIDB4OTAsIDB4MWUsIDB4ZDIsIDB4YjIsIDB4NDYsCisJMHhmNCwgMHhjNywgMHhkYywgMHhmZCwgMHhlOCwgMHhlOSwgMHhjZiwgMHhlYiwgMHhkMiwgMHhjMiwgMHg3ZCwgMHg5MCwKKwkweGVlLCAweDFiLCAweDQxLCAweDJiLCAweGY3LCAweGY2LCAweGEzLCAweGE0LCAweDk1LCAweGViLCAweDM1LCAweGQyLAorCTB4N2IsIDB4MWEsIDB4ZjQsIDB4NjYsIDB4ODAsIDB4YjcsIDB4YTIsIDB4OGQsIDB4ZjYsIDB4OGUsIDB4ODIsIDB4ZGUsCisJMHgxMSwgMHg2MCwgMHhmMSwgMHgzMCwgMHhiMCwgMHg3OCwgMHgyNywgMHhiMCwgMHg3OCwgMHgwOCwgMHg1OCwgMHg5YywKKwkweDA2LCAweDBlLCAweDBmLCAweDAyLCAweDg3LCAweDA3LCAweDgwLCAweGMzLCAweDI5LCAweGVjLCAweDJiLCAweDJhLAorCTB4ZjMsIDB4YzAsIDB4ZTUsIDB4NzksIDB4ZTAsIDB4ZjMsIDB4M2MsIDB4ZTQsIDB4MzUsIDB4MzEsIDB4MjcsIDB4ZGEsCisJMHgxNywgMHhiMCwgMHhmZSwgMHg2MywgMHgzMywgMHg4OSwgMHhkMywgMHhkMCwgMHhjZCwgMHg1OCwgMHg1MSwgMHg4NywKKwkweDNkLCAweGE1LCAweDA2LCAweGExLCAweDIzLCAweDQ5LCAweDI5LCAweDU1LCAweDQ2LCAweGE1LCAweDQwLCAweDNmLAorCTB4YjYsIDB4YjksIDB4MDcsIDB4YjYsIDB4MGIsIDB4ZmIsIDB4ODksIDB4ZjksIDB4NzEsIDB4ZDMsIDB4NWEsIDB4ZWYsCisJMHhmYSwgMHhmNywgMHgyMiwgMHhmNiwgMHgxZiwgMHg4MywgMHgyNywgMHg4OSwgMHhiOCwgMHhjOCwgMHhiMCwgMHhlNCwKKwkweDlkLCAweDFlLCAweDJiLCAweGFiLCAweDI3LCAweDMxLCAweDhlLCAweGVkLCAweGI4LCAweGI2LCAweGY3LCAweDc4LAorCTB4NDIsIDB4MWIsIDB4M2YsIDB4Y2UsIDB4M2QsIDB4NGQsIDB4MDMsIDB4ZTMsIDB4YWEsIDB4MzIsIDB4OTUsIDB4YTIsCisJMHhhZCwgMHg1NiwgMHhlNSwgMHg1NCwgMHgyYSwgMHgzMSwgMHg1OCwgMHg5NCwgMHg1NiwgMHgzOSwgMHgxMiwgMHg5ZCwKKwkweDU2LCAweGZlLCAweGNkLCAweDRjLCAweDFmLCAweDUzLCAweGZhLCAweDUxLCAweGIwLCAweDcxLCAweDJkLCAweDc3LAorCTB4NmIsIDB4ZjksIDB4ZTMsIDB4ZjQsIDB4M2IsIDB4M2QsIDB4ZjgsIDB4ODUsIDB4NDAsIDB4MGIsIDB4ZTcsIDB4MzcsCisJMHg2NSwgMHg2OCwgMHg0MCwgMHhiNCwgMHg3ZCwgMHhiZCwgMHg0NSwgMHhhMCwgMHg2MiwgMHhjMiwgMHgzYSwgMHg4NywKKwkweDk1LCAweDczLCAweGQzLCAweDNkLCAweGIxLCAweDljLCAweDZlLCAweGNhLCAweDk4LCAweGE5LCAweGM5LCAweDA0LAorCTB4ZWMsIDB4NjUsIDB4MjgsIDB4ZjUsIDB4N2YsIDB4ZDUsIDB4MjMsIDB4NTEsIDB4M2UsIDB4NmYsIDB4OTYsIDB4ZGYsCisJMHg1MSwgMHgzOCwgMHg4YiwgMHhiNSwgMHg0YiwgMHhiMywgMHg1OCwgMHgzNywgMHgwNCwgMHhmZSwgMHg3MSwgMHg1ZCwKKwkweGNlLCAweDgzLCAweDM2LCAweDMwLCAweGNmLCAweGI0LCAweDEzLCAweGE3LCAweDhiLCAweGIyLCAweDFkLCAweDc2LAorCTB4YjcsIDB4NGUsIDB4YjIsIDB4N2QsIDB4NGQsIDB4OTIsIDB4MTksIDB4ODksIDB4Y2IsIDB4YzQsIDB4Y2MsIDB4NzYsCisJMHhlMCwgMHgxZSwgMHg2NCwgMHg2MCwgMHhiNywgMHg0OCwgMHg3ZSwgMHgzNCwgMHgyZSwgMHg1ZiwgMHg5ZSwgMHg2MSwKKwkweDVmLCAweDA2LCAweGZiLCAweDRmLCAweDFjLCAweGNkLCAweDA4LCAweGY3LCAweDFmLCAweDUyLCAweGZiLCAweDhhLAorCTB4ZWIsIDB4MTksIDB4MzksIDB4ZTAsIDB4YmMsIDB4YTQsIDB4YmIsIDB4NzYsIDB4ZTksIDB4YjYsIDB4ZjcsIDB4NDIsCisJMHgxZSwgMHhhNywgMHhjMCwgMHhlZiwgMHhiYywgMHg2MywgMHhjYiwgMHgwMiwgMHhmYywgMHg0YSwgMHhlZSwgMHgzOCwKKwkweDcwLCAweGQ1LCAweDZlLCAweDAzLCAweDA2LCAweDI2LCAweGNlLCAweGQyLCAweDNlLCAweDBjLCAweGM0LCAweDVhLAorCTB4MjUsIDB4YzUsIDB4ZWIsIDB4MmUsIDB4MzksIDB4M2UsIDB4YTMsIDB4Y2IsIDB4YjMsIDB4YjcsIDB4YzUsIDB4ZDEsCisJMHgwNiwgMHhkNiwgMHhhNiwgMHgxMiwgMHg2NywgMHhjNiwgMHhmNCwgMHgyZSwgMHhiOSwgMHhiNSwgMHgyMywgMHg4NiwKKwkweGY3LCAweDUyLCAweDVhLCAweGRlLCAweGY5LCAweDM3LCAweGYyLCAweGYyLCAweDY0LCAweDVjLCAweGU3LCAweDU4LAorCTB4NWQsIDB4NzIsIDB4MjksIDB4MDMsIDB4M2EsIDB4NTYsIDB4YzQsIDB4ZjgsIDB4N2YsIDB4NDAsIDB4N2YsIDB4OTcsCisJMHhjYywgMHgyMSwgMHhiZSwgMHg5OSwgMHgwMywgMHg0ZCwgMHhkOSwgMHgxNCwgMHhiMSwgMHgzMCwgMHg3MSwgMHg3MiwKKwkweDQ5LCAweDA3LCAweDY2LCAweGNkLCAweDQxLCAweDM3LCAweDQ3LCAweDExLCAweDNmLCAweGNjLCAweGZjLCAweDM3LAorCTB4YzYsIDB4YzQsIDB4MjEsIDB4ZDMsIDB4MWUsIDB4NmIsIDB4MDIsIDB4ZjgsIDB4OTIsIDB4ZTksIDB4ZTIsIDB4M2QsCisJMHhlNywgMHhiNCwgMHhlNSwgMHg5NCwgMHg0MywgMHgxZCwgMHg4YSwgMHhjYiwgMHhlMywgMHgxNSwgMHhiZSwgMHhkNywKKwkweDczLCAweGY2LCAweDY5LCAweGIxLCAweGU1LCAweDQxLCAweGU3LCAweDdmLCAweDMwLCAweGZlLCAweDFkLCAweGM0LAorCTB4OWUsIDB4OTYsIDB4OTQsIDB4MjAsIDB4YjcsIDB4MDIsIDB4NzgsIDB4OTksIDB4ODksIDB4YjksIDB4ZWQsIDB4ODksCisJMHhiOSwgMHhjNCwgMHhkOSwgMHgwYiwgMHgzYSwgMHhlZiwgMHhlZCwgMHhlMiwgMHg4MiwgMHg3ZSwgMHhiMywgMHg0OCwKKwkweDA3LCAweGY5LCAweDk5LCAweDAyLCAweDJmLCAweDZkLCAweDRiLCAweGQ3LCAweDM3LCAweDdiLCAweGYxLCAweDE2LAorCTB4NmQsIDB4YzAsIDB4MDYsIDB4N2QsIDB4YTYsIDB4MmMsIDB4ZjQsIDB4MDcsIDB4NmQsIDB4ODAsIDB4N2UsIDB4ZDYsCisJMHhiNywgMHg4MSwgMHg0NCwgMHg2YywgMHg0OSwgMHhkNywgMHhmMSwgMHhkYywgMHg5NCwgMHg2MywgMHhhYSwgMHhhZCwKKwkweDgxLCAweGQ2LCAweDQ0LCAweDhjLCAweGZiLCAweDliLCAweDJjLCAweDI3LCAweGU1LCAweDcxLCAweDg3LCAweGUzLAorCTB4YzEsIDB4ZTcsIDB4ZTksIDB4ODgsIDB4MzcsIDB4MWUsIDB4ZjEsIDB4OGUsIDB4YzMsIDB4OTgsIDB4MjksIDB4MDksCisJMHg5YSwgMHg1ZCwgMHhiYiwgMHg1OCwgMHg5OCwgMHg4ZSwgMHhhYSwgMHg2NywgMHg0NywgMHgxYywgMHgzNywgMHgzNiwKKwkweGQyLCAweDExLCAweDNmLCAweGNkLCAweDIzLCAweDdlLCAweGNhLCAweDI5LCAweDFiLCAweGIxLCAweDMyLCAweDg4LAorCTB4YWYsIDB4ZTEsIDB4NjcsIDB4NWQsIDB4ZmIsIDB4MjgsIDB4OTUsIDB4NDksIDB4Y2IsIDB4M2QsIDB4YTAsIDB4MmYsCisJMHg1MSwgMHgwNCwgMHgzMSwgMHhjNywgMHg3NCwgMHhiOCwgMHhlYiwgMHhlYywgMHg4MCwgMHgxNCwgMHgxOSwgMHg2MywKKwkweDlkLCAweDMzLCAweDFlLCAweDkxLCAweGIxLCAweDEyLCAweGZkLCAweDFiLCAweDdlLCAweDhlLCAweDZkLCAweDMxLAorCTB4YTYsIDB4Y2YsIDB4MjgsIDB4ZGYsIDB4ZDMsIDB4MDMsIDB4M2QsIDB4ODAsIDB4NWYsIDB4NGEsIDB4YjUsIDB4OGIsCisJMHhlYiwgMHgwNywgMHhmNywgMHg0MCwgMHg5ZSwgMHhjMywgMHg5MCwgMHg3YiwgMHg1YSwgMHhjNiwgMHg0ZiwgMHg4YywKKwkweDUzLCAweGE3LCAweDkzLCAweDI1LCAweDQ5LCAweDI0LCAweDhmLCAweGM4LCAweDE2LCAweDZiLCAweDAxLCAweGJlLAorCTB4MzAsIDB4MzMsIDB4NWEsIDB4ZGQsIDB4YWUsIDB4YTcsIDB4ZjksIDB4Y2UsIDB4YTMsIDB4NzgsIDB4MDcsIDB4ZDcsCisJMHhkMiwgMHhiOCwgMHgzYywgMHg1MCwgMHg2MSwgMHhkZiwgMHg5ZCwgMHg4NiwgMHhiNCwgMHhjMCwgMHg1NiwgMHgwNiwKKwkweGY2LCAweDc4LCAweDc2LCAweDgwLCAweGY5LCAweDRjLCAweDdmLCAweGJlLCAweDcxLCAweDZmLCAweDNlLCAweDhlLAorCTB4ZTMsIDB4MTgsIDB4YmUsIDB4NTMsIDB4OWYsIDB4NzcsIDB4MDcsIDB4N2QsIDB4MWIsIDB4YjAsIDB4NjQsIDB4ODcsCisJMHg1ZSwgMHhkZCwgMHgxZSwgMHhjMiwgMHhmMywgMHg1MywgMHgwMywgMHhiYywgMHhjNywgMHgzYywgMHhmMCwgMHg2ZCwKKwkweDk2LCAweDNkLCAweDhjLCAweGIxLCAweGEzLCAweDk4LCAweDczLCAweDhkLCAweDY0LCAweDNiLCAweDdkLCAweDdhLAorCTB4YTksIDB4MDMsIDB4OGMsIDB4M2YsIDB4ZDgsIDB4OGUsIDB4YWUsIDB4NzcsIDB4NzksIDB4ZmYsIDB4MjUsIDB4YzMsCisJMHhkNSwgMHhjOSwgMHgxMSwgMHhiNCwgMHg2OSwgMHg3ZiwgMHgwNywgMHgyNSwgMHhlNywgMHgyNCwgMHhiMCwgMHg0ZiwKKwkweGYwLCAweGI2LCAweDMyLCAweGUxLCAweGVkLCAweDExLCAweGZjLCAweDFmLCAweDM5LCAweDBjLCAweDNlLCAweDQ4LAorCTB4ZDEsIDB4ZTUsIDB4MGQsIDB4ZjksIDB4NDIsIDB4OWUsIDB4ZmMsIDB4MTYsIDB4NzQsIDB4ZmYsIDB4NjEsIDB4OGMsCisJMHg4MSwgMHg3ZiwgMHg1MCwgMHgzYywgMHg1OCwgMHhlYSwgMHg3MCwgMHg2MywgMHhkMSwgMHg0NCwgMHgzMSwgMHhjMywKKwkweGZjLCAweGE5LCAweDgzLCAweDk4LCAweDA3LCAweGZjLCAweGE5LCAweDQwLCAweGIxLCAweDMwLCAweGY3LCAweDkyLAorCTB4YmUsIDB4ODYsIDB4ZjQsIDB4YzYsIDB4OTcsIDB4MGMsIDB4ODMsIDB4ZWQsIDB4ZTQsIDB4MTIsIDB4NzQsIDB4YjgsCisJMHgwNCwgMHhmOSwgMHg2NCwgMHhmYiwgMHg2OCwgMHhiMywgMHgzNiwgMHhlNCwgMHgzMSwgMHg2MywgMHg1MCwgMHg1ZiwKKwkweDRiLCAweDg4LCAweDA1LCAweGYzLCAweGNlLCAweDE2LCAweGViLCAweDVlLCAweGYyLCAweGNkLCAweGIyLCAweGU0LAorCTB4NjksIDB4MjcsIDB4ODgsIDB4MWQsIDB4M2IsIDB4MzAsIDB4OTQsIDB4N2EsIDB4MTgsIDB4ODUsIDB4MWUsIDB4OTgsCisJMHhmMCwgMHhjOSwgMHgzMSwgMHhjOCwgMHhmYywgMHhjNSwgMHgwZSwgMHg3NywgMHgyZiwgMHhiYywgMHgzNywgMHg2NSwKKwkweGRlLCAweGMyLCAweDlhLCAweGNlLCAweGVmLCAweGFmLCAweDczLCAweGZiLCAweDc4LCAweGNmLCAweGI4LCAweGM4LAorCTB4OTcsIDB4YWIsIDB4NGYsIDB4M2IsIDB4ZTUsIDB4ZGIsIDB4MjgsIDB4ZDMsIDB4NDMsIDB4ZDgsIDB4MGIsIDB4ZmIsCisJMHg3MSwgMHgyZCwgMHgxZCwgMHg5NCwgMHg3MSwgMHhkMCwgMHg1NiwgMHgxOCwgMHhkOCwgMHgxNCwgMHgzYiwgMHg4ZiwKKwkweGYxLCAweDM5LCAweGUwLCAweDc5LCAweGQxLCAweGU0LCAweGIzLCAweDhiLCAweDVhLCAweGZkLCAweDFkLCAweGM0LAorCTB4NWMsIDB4MzYsIDB4ZmQsIDB4ZDksIDB4OTIsIDB4ZjYsIDB4ODUsIDB4Y2EsIDB4Y2IsIDB4NWEsIDB4YjYsIDB4NzQsCisJMHg1MSwgMHhjYiwgMHg0MSwgMHg0ZiwgMHg0YSwgMHgwZSwgMHg3MywgMHgwNiwgMHhkYSwgMHg4ZiwgMHg4NSwgMHhiNSwKKwkweDEzLCAweGIxLCAweGI3LCAweGY1LCAweDllLCAweGY4LCAweDAyLCAweGIwLCAweDYwLCAweDJmLCAweDZjLCAweDNhLAorCTB4NjcsIDB4ZWUsIDB4OTQsIDB4MDIsIDB4YjAsIDB4MzUsIDB4N2YsIDB4NjIsIDB4MGIsIDB4ZWMsIDB4MmQsIDB4MWUsCisJMHhhMCwgMHg4YiwgMHg3OCwgMHg1NiwgMHhhNCwgMHg0ZiwgMHhkNSwgMHg3NiwgMHgzOCwgMHg1MiwgMHg2YywgMHg0YSwKKwkweDEzLCAweGQ3LCAweDM2LCAweDQxLCAweDc3LCAweGQwLCAweDU3LCAweGFlLCAweGViLCAweGRmLCAweDFkLCAweDJiLAorCTB4NjgsIDB4NDUsIDB4N2UsIDB4MzksIDB4YjAsIDB4OWMsIDB4ZGUsIDB4OTIsIDB4NWMsIDB4OTksIDB4ZGUsIDB4MWQsCisJMHgzNSwgMHg3YSwgMHg4OSwgMHgxOSwgMHhjMCwgMHg3ZiwgMHhkOCwgMHhjZCwgMHg0YiwgMHhkMCwgMHhkZiwgMHhlNywKKwkweDFkLCAweGUwLCAweGJmLCAweDAzLCAweGZjLCAweDg3LCAweDRkLCAweDNkLCAweDAzLCAweGRkLCAweDdiLCAweGRhLAorCTB4ODEsIDB4MGYsIDB4NzAsIDB4ZTAsIDB4MDMsIDB4MWMsIDB4ZjgsIDB4MDAsIDB4MjcsIDB4MGIsIDB4MzksIDB4MTEsCisJMHhlNywgMHhlOSwgMHg0MywgMHg3NiwgMHhkNywgMHg3YywgMHg5ZSwgMHgxYiwgMHgzNywgMHhkZCwgMHhlMCwgMHhjNSwKKwkweDIyLCAweGEzLCAweDg4LCAweDQ1LCAweDM2LCAweGM4LCAweDQ0LCAweGYyLCAweDdhLCAweGVjLCAweGFkLCAweDA1LAorCTB4ZDcsIDB4NTYsIDB4NWMsIDB4YjEsIDB4NDYsIDB4ZjIsIDB4NzYsIDB4Y2YsIDB4NGUsIDB4MWUsIDB4MDYsIDB4NWQsCisJMHg4OCwgMHhiZiwgMHg5MywgMHgzZiwgMHgwZCwgMHgzZCwgMHg2YywgMHgwMiwgMHgzZCwgMHgzZiwgMHhlNSwgMHhjNSwKKwkweDJjLCAweDBmLCAweDlhLCAweGFlLCAweDFlLCAweGI2LCAweGEyLCAweGVmLCAweDkzLCAweGU4LCAweDZiLCAweGM1LAorCTB4OTgsIDB4MDMsIDB4MTgsIDB4YzMsIDB4OTgsIDB4YTcsIDB4Y2QsIDB4ZWIsIDB4MGIsIDB4OGUsIDB4NjMsIDB4ZWMsCisJMHhmMywgMHgxOSwgMHhhYywgMHg5NSwgMHhjMCwgMHhiOCwgMHgzNiwgMHhjYywgMHhkZCwgMHg4NSwgMHgzMSwgMHhkYiwKKwkweDMwLCAweGU2LCAweDQ2LCAweGI0LCAweDE5LCAweDMzLCAweDZmLCAweDQ0LCAweGZiLCAweDEzLCAweDBkLCAweGVmLAorCTB4N2MsIDB4MGMsIDB4N2QsIDB4YjcsIDB4MzcsIDB4ZjQsIDB4OWQsIDB4NDMsIDB4MWYsIDB4ZjIsIDB4NTAsIDB4ZWIsCisJMHhiYywgMHhmNywgMHg1ZSwgMHgxMSwgMHhlZCwgMHhjZSwgMHg4NiwgMHgzMSwgMHhhZiwgMHhhMiwgMHgwZiwgMHg3MSwKKwkweGFmLCAweGY1LCAweDJkLCAweDVjLCAweDkxLCAweDdmLCAweDVhLCAweGE0LCAweGM5LCAweDdmLCAweGM2LCAweGI4LAorCTB4MzcsIDB4OGUsIDB4ZmUsIDB4OTAsIDB4MTcsIDB4YmIsIDB4ZmUsIDB4YTYsIDB4MDksIDB4YmQsIDB4ZDMsIDB4ODYsCisJMHg5YywgMHhkZiwgMHgzMCwgMHhkZCwgMHg1OCwgMHhlZiwgMHg0ZSwgMHhjYiwgMHhkNSwgMHg0MywgMHhiZiwgMHhmZCwKKwkweDcwLCAweDQzLCAweDliLCAweDYzLCAweDE3LCAweDFhLCAweGZhLCAweGZlLCAweGE1LCAweGExLCAweGZkLCAweGRkLAorCTB4ZDAsIDB4Y2EsIDB4NzcsIDB4MDYsIDB4ZGIsIDB4OTcsIDB4ZjcsIDB4MTUsIDB4M2EsIDB4OTYsIDB4YjcsIDB4ZWQsCisJMHhhNiwgMHg5NSwgMHhlZiwgMHhlOCwgMHhlYiwgMHg5NiwgMHhmNywgMHhkZCwgMHhiOCwgMHhiZSwgMHg2MSwgMHgwYywKKwkweDc0LCAweDJhLCAweDhhLCAweDFjLCAweGM5LCAweDFmLCAweDFmLCAweGJlLCAweGNlLCAweDdkLCAweDRlLCAweGZlLAorCTB4MzYsIDB4ZWEsIDB4OTIsIDB4ZGEsIDB4M2EsIDB4ZGEsIDB4M2EsIDB4ZTQsIDB4YjAsIDB4YTQsIDB4YzEsIDB4OWUsCisJMHgyYywgMHgzZCwgMHhmZCwgMHhiMiwgMHg5NiwgMHg4MywgMHg0ZSwgMHg2NSwgMHgyYiwgMHhmZSwgMHg3YywgMHhiNCwKKwkweGQ5LCAweGM2LCAweGRjLCAweGRjLCAweGNmLCAweGM5LCAweDE5LCAweDJiLCAweDQ1LCAweGEwLCAweDM3LCAweGY3LAorCTB4ZDAsIDB4MjcsIDB4MWQsIDB4MmQsIDB4NGEsIDB4ZGQsIDB4M2UsIDB4YmIsIDB4ZjUsIDB4NGIsIDB4ZDksIDB4ZTcsCisJMHhlZCwgMHgxZSwgMHg0NiwgMHgxZCwgMHgwNiwgMHg5ZCwgMHg1NSwgMHgxOSwgMHg0OSwgMHgzNSwgMHhkMywgMHhjNywKKwkweDc4LCAweGQ4LCAweDQ1LCAweGRjLCAweGE5LCAweDU2LCAweDhkLCAweGNkLCAweDU1LCAweGQ5LCAweDlmLCAweDdhLAorCTB4YTcsIDB4MmEsIDB4MGEsIDB4ZjMsIDB4MDYsIDB4MTUsIDB4ZWUsIDB4YzQsIDB4ZjUsIDB4MWUsIDB4YzgsIDB4YzgsCisJMHg0MiwgMHg2ZSwgMHg4MiwgMHg3YywgMHgzYSwgMHg0YSwgMHg5ZiwgMHg3NCwgMHg5MCwgMHhmMSwgMHhjOSwgMHhhMywKKwkweDJlLCAweGE2LCAweDEyLCAweDc3LCAweGQwLCAweDQ2LCAweDVlLCAweDk2LCAweDNmLCAweGNlLCAweGY1LCAweDcxLAorCTB4MmQsIDB4MTEsIDB4YzcsIDB4NDcsIDB4OTUsIDB4NGYsIDB4YzksIDB4NWIsIDB4OWMsIDB4NzcsIDB4MzUsIDB4NmMsCisJMHgzYywgMHg2YiwgMHgzMiwgMHhhNiwgMHgzMywgMHhlZCwgMHhkMywgMHhmMCwgMHg2ZiwgMHg3YywgMHhjNiwgMHg1OCwKKwkweGUxLCAweDM0LCAweGUzLCAweDkyLCAweDAwLCAweDU2LCAweDZkLCAweDM1LCAweGUwLCAweDMyLCAweDhiLCAweGNiLAorCTB4ZjcsIDB4YjUsIDB4ODEsIDB4NzksIDB4YzQsIDB4NTUsIDB4ZWMsIDB4NzUsIDB4NzUsIDB4MmMsIDB4ZWEsIDB4ZDEsCisJMHhhZiwgMHg2YywgMHhkYiwgMHhiYiwgMHg2YSwgMHhiNiwgMHhlZCwgMHhlYiwgMHhkZSwgMHg2YSwgMHgzOSwgMHhmOCwKKwkweGY3LCAweDk1LCAweDJjLCAweDllLCAweGFhLCAweDI0LCAweDhlLCAweDE1LCAweDYxLCAweDRiLCAweDhiLCAweDJhLAorCTB4ZWYsIDB4ZjYsIDB4ZTUsIDB4YzIsIDB4MTgsIDB4MjcsIDB4NzEsIDB4NzIsIDB4MWUsIDB4NmYsIDB4OGUsIDB4YWIsCisJMHgxYywgMHg4MywgMHhmOSwgMHg0NSwgMHg1NSwgMHg3NiwgMHhhNCwgMHg1YSwgMHhhMywgMHhlNCwgMHg0MywgMHg0NiwKKwkweGZmLCAweDc2LCAweDg4LCAweDMxLCAweGMzLCAweGEyLCAweDQzLCAweDllLCAweGE1LCAweGYwLCAweDNjLCAweDA1LAorCTB4NGMsIDB4ZjgsIDB4MjcsIDB4YzksIDB4NDUsIDB4ZDksIDB4ZjcsIDB4NzYsIDB4NzUsIDB4MDEsIDB4NzEsIDB4OTUsCisJMHg4YSwgMHg4ZiwgMHg5NCwgMHhiZiwgMHg2NywgMHg3YywgMHhiNywgMHgxZiwgMHhmYywgMHgyMiwgMHg0ZiwgMHg0NywKKwkweGMwLCAweDY3LCAweDNmLCAweDA2LCAweDc4LCAweDhkLCAweDc1LCAweDE1LCAweDU5LCAweDFlLCAweDA3LCAweDhiLAorCTB4M2MsIDB4NTAsIDB4N2UsIDB4MTksIDB4NzMsIDB4ZWEsIDB4NmUsIDB4YWMsIDB4YzIsIDB4M2MsIDB4ZGMsIDB4NjYsCisJMHg3ZiwgMHg0NywgMHg4OCwgMHhiMSwgMHg5YywgMHhlYiwgMHhlYiwgMHgwZCwgMHhhYywgMHg4NywgMHhkYywgMHhiZSwKKwkweGZjLCAweDhmLCAweDJhLCAweDZlLCAweDJhLCAweDI4LCAweDc5LCAweDIwLCAweDg2LCAweGFhLCAweGYwLCAweDE5LAorCTB4ZmIsIDB4YzIsIDB4NWUsIDB4ZWMsIDB4MWMsIDB4ZjEsIDB4NjIsIDB4NjUsIDB4Y2IsIDB4OGIsIDB4OTUsIDB4NDksCisJMHgwNywgMHg2YiwgMHg2ZiwgMHg3ZSwgMHg1YywgMHg0MCwgMHg5OSwgMHgyZCwgMHgxZCwgMHhkMiwgMHgzNywgMHgzMywKKwkweDJlLCAweDY4LCAweDkzLCAweGQ1LCAweGUzLCAweDAyLCAweDlmLCAweGE2LCAweDZkLCAweGEwLCAweDg5LCAweDcxLAorCTB4OWUsIDB4YWEsIDB4YmQsIDB4NzQsIDB4YjgsIDB4ZjUsIDB4MWUsIDB4ZDIsIDB4ZTAsIDB4ZmIsIDB4NDcsIDB4ZTUsCisJMHg4NywgMHg4ZiwgMHhjMiwgMHhlNSwgMHg2MSwgMHg2ZiwgMHg2OSwgMHhkMCwgMHhiYSwgMHg1MywgMHhiMiwgMHhkMywKKwkweGRiLCAweDNjLCAweDdmLCAweGNiLCAweDFjLCAweDgwLCAweGYxLCAweGI3LCAweGFiLCAweGIzLCAweGQ5LCAweGQ0LAorCTB4ODQsIDB4M2YsIDB4NGYsIDB4MjcsIDB4M2MsIDB4NjQsIDB4YTAsIDB4MmUsIDB4YzQsIDB4YjUsIDB4MTgsIDB4YzcsCisJMHhmOCwgMHgzMSwgMHhjZCwgMHg0ZSwgMHgyZiwgMHhhNiwgMHgxOSwgMHg5NiwgMHhmZCwgMHg4ZSwgMHgxYiwgMHhmMywKKwkweDhmLCAweGEwLCAweDNmLCAweGVmLCAweDI4LCAweGRhLCAweDYzLCAweDhjLCAweDJkLCAweDc1LCAweGM0LCAweGRjLAorCTB4OTksIDB4M2QsIDB4MDksIDB4MjQsIDB4MGYsIDB4ZWUsIDB4NWUsIDB4YmEsIDB4YjEsIDB4OTcsIDB4NTIsIDB4NmQsCisJMHgyZiwgMHhhZCwgMHg0YiwgMHhjYiwgMHhmNywgMHgzMiwgMHhhYSwgMHhkZSwgMHg5ZCwgMHg1YSwgMHhmMSwgMHhhZSwKKwkweDYwLCAweDFmLCAweGJiLCAweDJmLCAweGYxLCAweDhjLCAweDdiLCAweDY0LCAweGRjLCAweDYwLCAweDc5LCAweDdiLAorCTB4ZjQsIDB4ZTUsIDB4NzQsIDB4MDAsIDB4N2IsIDB4NGMsIDB4NmEsIDB4NzksIDB4MTUsIDB4NmIsIDB4ZWQsIDB4NTEsCisJMHgzYywgMHhjZiwgMHg5NywgMHhjNywgMHg3MCwgMHhhNSwgMHg3ZCwgMHhhOCwgMHg3OSwgMHg5NCwgMHg4ZCwgMHg0YywKKwkweDI4LCAweDNlLCAweDhmLCAweGFiLCAweDdkLCAweDJjLCAweDk0LCAweDdmLCAweDQxLCAweDBhLCAweDI3LCAweDdlLAorCTB4MDksIDB4N2UsIDB4MmYsIDB4NTgsIDB4MGYsIDB4NjMsIDB4MmQsIDB4OTEsIDB4ZmMsIDB4MjgsIDB4MDYsIDB4ZjAsCisJMHg5MywgMHg3YiwgMHg2NSwgMHhhZCwgMHhlYiwgMHgwZiwgMHg0MywgMHg2ZSwgMHg3ZSwgMHgxMCwgMHg4MSwgMHg4YywKKwkweDM1LCAweGY3LCAweGI5LCAweDVhLCAweGRmLCAweGU3LCAweDZiLCAweDUzLCAweDgwLCAweDllLCAweDJhLCAweDYyLAorCTB4Y2UsIDB4MTgsIDB4NjgsIDB4MDgsIDB4YmUsIDB4NzMsIDB4NTAsIDB4ODYsIDB4MWMsIDB4Y2EsIDB4YTMsIDB4MjcsCisJMHgzNiwgMHgyZSwgMHhiNiwgMHg5NSwgMHgxNywgMHgzZiwgMHhjZSwgMHhlMCwgMHhmYSwgMHhiNCwgMHhmOSwgMHg1YywKKwkweGNjLCAweDEwLCAweGQ2LCAweDJmLCAweDdkLCAweGRlLCAweGY5LCAweDdjLCAweDhiLCAweDJjLCAweDM1LCAweGVhLAorCTB4YzAsIDB4MTQsIDB4ZTgsIDB4MjksIDB4MzgsIDB4ZTQsIDB4OTMsIDB4YWYsIDB4OWIsIDB4ZmUsIDB4ZGEsIDB4YWYsCisJMHhhYSwgMHhmZCwgMHg0YywgMHhhYSwgMHg5YSwgMHhkZCwgMHg3MywgMHgzNSwgMHgxZCwgMHg5ZCwgMHg0MCwgMHgwYywKKwkweGUyLCAweGVhLCAweGRjLCAweDdkLCAweDFlLCAweDZmLCAweDdjLCAweGRkLCAweDhjLCAweDc4LCAweDcyLCAweDY2LAorCTB4MWUsIDB4NDcsIDB4ZGIsIDB4ZjEsIDB4ZjUsIDB4NjAsIDB4OTMsIDB4NzUsIDB4YjcsIDB4ZTIsIDB4MDUsIDB4OWYsCisJMHgxMSwgMHg1MywgMHg1YywgMHg1OSwgMHg4ZSwgMHhkNSwgMHg2NCwgMHhiOSwgMHhiNiwgMHg0MSwgMHgyZiwgMHhiZiwKKwkweGI3LCAweGNlLCAweGI1LCAweDQzLCAweGRhLCAweDFiLCAweGVjLCAweDE2LCAweGY0LCAweDNkLCAweGI1LCAweGNjLAorCTB4YmUsIDB4OTMsIDB4OTcsIDB4YTgsIDB4ODMsIDB4NDYsIDB4YzQsIDB4OTgsIDB4ZmIsIDB4NTMsIDB4ZjAsIDB4ZjIsCisJMHg2MywgMHhjOCwgMHg1NSwgMHg0NCwgMHhjYywgMHgxOSwgMHhlMiwgMHgxMCwgMHhlMywgMHg4ZCwgMHg3YSwgMHhiYywKKwkweGJiLCAweDIwLCAweGFiLCAweGM1LCAweGJhLCAweDU3LCAweDhhLCAweDM1LCAweDdlLCAweGYyLCAweDJhLCAweDYzLAorCTB4OGQsIDB4NzgsIDB4OTMsIDB4YjQsIDB4MTAsIDB4OGIsIDB4ODYsIDB4MTEsIDB4ZGIsIDB4NmEsIDB4ZDIsIDB4NjQsCisJMHgzZiwgMHgwOCwgMHgxZiwgMHg3NiwgMHhjNiwgMHg2YywgMHhiNiwgMHg3ZCwgMHg0YywgMHg4OCwgMHg0OCwgMHhmYiwKKwkweGRjLCAweDA2LCAweDg1LCAweDBiLCAweGQ2LCAweDRjLCAweDFkLCAweDE3LCAweDI2LCAweGMwLCAweGZiLCAweDExLAorCTB4YjcsIDB4YjYsIDB4MWEsIDB4NmQsIDB4OTcsIDB4YWIsIDB4Y2QsIDB4OGQsIDB4ZWIsIDB4NzEsIDB4ZmYsIDB4NTgsCisJMHgyZCwgMHhlZSwgMHhiZiwgMHhhMSwgMHg4MSwgMHg4ZiwgMHhhYiwgMHhlMSwgMHhlMiwgMHgxOSwgMHhmMCwgMHgyZCwKKwkweDhkLCAweGZjLCAweDk3LCAweDc5LCAweGVkLCAweDEwLCAweGYyLCAweDYxLCAweGU2LCAweDYyLCAweDE5LCAweGU0LAorCTB4YzQsIDB4ODksIDB4MzMsIDB4YzAsIDB4MmEsIDB4ZTQsIDB4YzgsIDB4ODksIDB4YjcsIDB4ZTAsIDB4NTcsIDB4OTAsCisJMHgzNywgMHgyNywgMHhlNiwgMHg5OSwgMHhiYiwgMHgyZSwgMHgyMiwgMHgzZiwgMHg3ZSwgMHgxYSwgMHhmOSwgMHhmMSwKKwkweDUzLCAweDk1LCAweDNlLCAweGYwLCAweDM3LCAweGE5LCAweGIwLCAweDczLCAweGVmLCAweDcxLCAweGQxLCAweGVlLAorCTB4NTIsIDB4ZjUsIDB4NjEsIDB4ZGEsIDB4NzMsIDB4MTQsIDB4N2UsIDB4YjQsIDB4NWEsIDB4M2QsIDB4OTAsIDB4ZWEsCisJMHg0MSwgMHg0ZSwgMHgxZSwgMHg5NywgMHg0ZiwgMHg5OSwgMHhjYywgMHg2MywgMHgzNSwgMHhiMywgMHhiYiwgMHg3ZiwKKwkweGMxLCAweDA4LCAweGM2LCAweGE0LCAweGQ5LCAweDJiLCAweGZhLCAweDgxLCAweDk1LCAweGJjLCAweGNmLCAweDI5LAorCTB4NWYsIDB4NzAsIDB4Y2MsIDB4YjgsIDB4MWMsIDB4ZWYsIDB4ZWYsIDB4YWEsIDB4ZjEsIDB4ZmUsIDB4YzIsIDB4MWEsCisJMHg2OSwgMHgxOSwgMHg1NiwgMHgzNSwgMHg4MCwgMHhlZSwgMHhmZSwgMHgwMywgMHhjNCwgMHhhYiwgMHgxNCwgMHhmYywKKwkweDNhLCAweGZjLCAweDZmLCAweDU1LCAweGVlLCAweDQ4LCAweDVkLCAweGFjLCAweDllLCAweGI3LCAweGQ3LCAweDQ5LAorCTB4YmUsIDB4ZWYsIDB4OGIsIDB4MWUsIDB4NjYsIDB4OGYsIDB4M2QsIDB4OTIsIDB4YjUsIDB4OGIsIDB4YjAsIDB4MGYsCisJMHhiNywgMHgxNiwgMHgzOSwgMHgzZSwgMHgxZCwgMHg0NiwgMHgxNCwgMHhjYSwgMHhiZiwgMHgwZSwgMHg1OSwgMHgxOCwKKwkweGZjLCAweDFiLCAweGM4LCAweDcwLCAweGNiLCAweDY5LCAweDE2LCAweGIwLCAweDc0LCAweGUwLCAweGYwLCAweDQyLAorCTB4MzQsIDB4YTIsIDB4ZWEsIDB4MzMsIDB4ZDcsIDB4ZDksIDB4ZWMsIDB4YjcsIDB4MjAsIDB4ZDMsIDB4NTEsIDB4NTksCisJMHg0MCwgMHhmYywgMHg1MCwgMHgxYSwgMHgwNCwgMHg4ZCwgMHg3ZCwgMHg5ZCwgMHgxOCwgMHg0ZiwgMHhiYiwgMHgyMywKKwkweGNmLCAweDQ3LCAweGUxLCAweDdiLCAweGM5LCAweGQzLCAweDI4LCAweGM2LCAweGVmLCAweGMyLCAweDk4LCAweDBlLAorCTB4NWMsIDB4YmYsIDB4NjgsIDB4MmMsIDB4NTgsIDB4Y2MsIDB4OWQsIDB4N2YsIDB4MGUsIDB4NmQsIDB4Y2UsIDB4MTEsCisJMHhmNCwgMHg5ZCwgMHg5ZiwgMHgwZSwgMHg4OSwgMHg5YSwgMHg5MywgMHhlZiwgMHg3NCwgMHgyYSwgMHhmYiwgMHhhZiwKKwkweGFmLCAweGM1LCAweDc1LCAweGY4LCAweGVjLCAweGJkLCAweGVhLCAweDJkLCAweGZkLCAweDgzLCAweDgxLCAweGY1LAorCTB4ZGEsIDB4MDIsIDB4ZWIsIDB4MGQsIDB4MDYsIDB4ZDYsIDB4MjMsIDB4OWQsIDB4MWQsIDB4MDEsIDB4M2EsIDB4M2IsCisJMHhmMCwgMHg3ZSwgMHgwZSwgMHg2YiwgMHgwZiwgMHhhYiwgMHg5OCwgMHhhNywgMHhiZSwgMHhlNiwgMHhmZCwgMHg4MSwKKwkweDM1LCAweGZkLCAweGZkLCAweDc1LCAweDA2LCAweGRlLCAweDdiLCAweDA3LCAweGViLCAweGIxLCAweDJmLCAweDFhLAorCTB4ZTgsIDB4MjMsIDB4MGQsIDB4ZWIsIDB4ZDEsIDB4YzcsIDB4NzYsIDB4NDcsIDB4ODAsIDB4MmUsIDB4ZDIsIDB4YmEsCisJMHgxNiwgMHhmZCwgMHgyYSwgMHg3ZSwgMHgwMiwgMHg5ZiwgMHg1YiwgMHhlMCwgMHhiNywgMHg3NCwgMHhmOCwgMHgwZSwKKwkweGQ2LCAweGEwLCAweDFiLCAweGY3LCAweGZhLCAweDY1LCAweGFjLCAweGViLCAweGNmLCAweDE3LCAweGM1LCAweDFjLAorCTB4MWMsIDB4Y2YsIDB4YjEsIDB4ODYsIDB4ZjcsIDB4M2UsIDB4ZmIsIDB4ZjksIDB4ZmMsIDB4MWIsIDB4ZDUsIDB4YWYsCisJMHgyYiwgMHhiZSwgMHhhZCwgMHgwNywgMHhlZCwgMHhhYSwgMHhlZSwgMHgyMiwgMHhmMywgMHgxZCwgMHgyNiwgMHhlNCwKKwkweGM5LCAweGZjLCAweDU4LCAweDkzLCAweDliLCAweDZjLCAweDVkLCAweGViLCAweGU5LCAweGE3LCAweGVjLCAweGQ3LAorCTB4NzksIDB4NTgsIDB4ZGEsIDB4YTIsIDB4NjUsIDB4OGYsIDB4YjMsIDB4NWUsIDB4ZDAsIDB4ZWEsIDB4ZTUsIDB4N2MsCisJMHhjOCwgMHgzZCwgMHg5NCwgMHg4ZiwgMHgzMSwgMHhiZCwgMHhlNywgMHhmNCwgMHgzMSwgMHg4YywgMHg1YiwgMHhlOCwKKwkweDNmLCAweDMzLCAweGRlLCAweDNkLCAweGFlLCAweGQwLCAweGUxLCAweDdkLCAweGE1LCAweDBlLCAweDM5LCAweGFmLAorCTB4NzgsIDB4NmEsIDB4YzksIDB4YjksIDB4MWEsIDB4NGYsIDB4NDMsIDB4ZGUsIDB4YjcsIDB4OTAsIDB4ODMsIDB4ZGUsCisJMHg3NywgMHgwNiwgMHgwMywgMHg3MSwgMHgxMSwgMHhlZSwgMHhjYiwgMHgxOSwgMHhkMCwgMHgxMCwgMHg5NywgMHg5ZSwKKwkweDdlLCAweGU2LCAweDZlLCAweDQ1LCAweDVjLCAweDU5LCAweGE3LCAweGQwLCAweDcwLCAweDc1LCAweGViLCAweDE3LAorCTB4M2QsIDB4ZmQsIDB4ZjAsIDB4NGIsIDB4YzAsIDB4YTEsIDB4OWUsIDB4ZmUsIDB4ZWYsIDB4YTgsIDB4N2MsIDB4YWUsCisJMHg1NCwgMHhiMSwgMHhiNCwgMHgzYiwgMHgxYywgMHhiNywgMHg0NiwgMHg3NCwgMHhjZSwgMHhiZSwgMHg1YywgMHg4ZCwKKwkweDY4LCAweGEwLCAweDk5LCAweDc1LCAweDBkLCAweGJmLCAweDQ2LCAweDc0LCAweDRlLCAweDU0LCAweDhkLCAweGU4LAorCTB4ZTQsIDB4MTUsIDB4NmEsIDB4NDQsIDB4OTksIDB4YWIsIDB4YWYsIDB4MTEsIDB4NzEsIDB4N2UsIDB4NTMsIDB4ZWUsCisJMHgxZSwgMHgxMCwgMHhlZCwgMHg0YiwgMHg1ZSwgMHg4ZCwgMHhlOCwgMHg4MiwgMHhiOCwgMHgzNSwgMHhhMiwgMHhmMywKKwkweGIyLCAweDdhLCAweDhkLCAweGU4LCAweDY4LCAweDQzLCAweDhkLCAweDY4LCAweGJkLCAweGFhLCAweDExLCAweDcxLAorCTB4MWUsIDB4YjcsIDB4NDYsIDB4YzQsIDB4NzYsIDB4YmUsIDB4N2YsIDB4MzAsIDB4NTAsIDB4ZWIsIDB4MDAsIDB4ZmUsCisJMHgzYSwgMHhiNywgMHg4MiwgMHg2ZiwgMHg5NiwgMHgzNiwgMHhlYSwgMHhmOCwgMHg5OCwgMHg0NiwgMHhlYywgMHhiZiwKKwkweGJlLCAweGU2LCAweGJmLCAweGVhLCAweGY4LCAweGE2LCAweDI5LCAweDlkLCAweGJiLCAweDEyLCAweGJlLCAweDhkLAorCTB4YmEsIDB4NzEsIDB4YzksIDB4MzIsIDB4NmMsIDB4OWIsIDB4YWEsIDB4YzUsIDB4MmUsIDB4YmYsIDB4ZGMsIDB4Y2MsCisJMHgxYywgMHg3YSwgMHhiMiwgMHg1YywgMHg5ZiwgMHg3NywgMHgxMiwgMHhmMiwgMHgxZSwgMHhhYiwgMHhkNSwgMHg0OSwKKwkweDJlLCAweDE1LCAweDFmLCAweDQ1LCAweGU1LCAweGUwLCAweGFhLCAweGRmLCAweDlhLCAweDYyLCAweDk5LCAweDk1LAorCTB4ZGYsIDB4OWEsIDB4MzQsIDB4ODksIDB4ODIsIDB4Y2UsIDB4N2MsIDB4N2YsIDB4NWUsIDB4ZTUsIDB4NWQsIDB4MGIsCisJMHhjZSwgMHhjZiwgMHhjYiwgMHhkMiwgMHhiZCwgMHgxNiwgMHhmMCwgMHhjNywgMHhhZiwgMHg5ZiwgMHg1MCwgMHhiZSwKKwkweDc1LCAweDlmLCAweDkyLCAweGQ1LCAweDNmLCAweGJhLCAweDFhLCAweGNhLCAweDNlLCAweDU1LCAweDQzLCAweGY5LAorCTB4NWEsIDB4NzMsIDB4YjAsIDB4ODYsIDB4NzIsIDB4NGUsIDB4MmUsIDB4NWYsIDB4NDMsIDB4ZDksIDB4YjcsIDB4NGEsCisJMHgwZCwgMHhlNSwgMHgxNSwgMHhhOSwgMHhkNywgMHg1MCwgMHg1ZSwgMHgxMSwgMHhiZiwgMHg4NiwgMHg2MiwgMHhjOCwKKwkweGQyLCAweDdhLCAweGNlLCAweGIzLCAweDFmLCAweGVmLCAweDhjLCAweGUwLCAweDM3LCAweDhjLCAweDlmLCAweDViLAorCTB4NTMsIDB4MzksIDB4NTcsIDB4YTMsIDB4N2YsIDB4YjUsIDB4OWEsIDB4Y2EsIDB4MzcsIDB4OWIsIDB4ZGYsIDB4NGYsCisJMHg0ZCwgMHhjNSwgMHhmNSwgMHgwMSwgMHg3ZSwgMHg0ZCwgMHhhNSwgMHgwNSwgMHhmMSwgMHgwZSwgMHg3YywgMHg4ZSwKKwkweDFlLCAweGFjLCAweGE5LCAweGZjLCAweDJkLCAweGVkLCAweDAxLCAweDdkLCAweDJhLCAweDQ2LCAweDQwLCAweDNmLAorCTB4ZWMsIDB4MDIsIDB4N2UsIDB4MjksIDB4YTMsIDB4NmEsIDB4MWMsIDB4OWYsIDB4ZjYsIDB4NzgsIDB4YjgsIDB4MWIsCisJMHg3YiwgMHg4ZSwgMHg0MywgMHgxNiwgMHhlNCwgMHg2MywgMHg4ZiwgMHg4YSwgMHgyZCwgMHgzMywgMHg2NiwgMHg0YywKKwkweGNiLCAweGY2LCAweGMyLCAweDliLCAweDRkLCAweGYzLCAweDViLCAweDc0LCAweDRjLCAweGM2LCAweDJiLCAweGQ0LAorCTB4ZjEsIDB4MmUsIDB4YzQsIDB4ZTIsIDB4MjYsIDB4ZmEsIDB4NzYsIDB4YTMsIDB4ZWQsIDB4YzcsIDB4NTQsIDB4ZmQsCisJMHhiNSwgMHgzOSwgMHg2OCwgMHg5YiwgMHgwYiwgMHhjMCwgMHg1OSwgMHhlMCwgMHhjNCwgMHg1NSwgMHhmOCwgMHhhOCwKKwkweDZkLCAweGEwLCAweDM5LCAweGI4LCAweDhmLCAweDIyLCAweGZjLCAweDEzLCAweGZhLCAweDk0LCAweGNjLCAweDE5LAorCTB4NWIsIDB4ZmEsIDB4YjQsIDB4YzQsIDB4NjksIDB4ZTcsIDB4NTcsIDB4MzEsIDB4MWYsIDB4ZmIsIDB4YjYsIDB4YTksCisJMHg3YywgMHhhYywgMHgzMCwgMHhjMCwgMHhiZCwgMHhkMiwgMHhkNywgMHgyZCwgMHg4MiwgMHgzZSwgMHhmNCwgMHg5NSwKKwkweDk4LCAweDAzLCAweGQyLCAweGVmLCAweGY5LCAweDM5LCAweDVhLCAweDQ0LCAweGU1LCAweDY4LCAweDlkLCAweDhhLAorCTB4MWYsIDB4ZTQsIDB4ZjUsIDB4OGQsIDB4NjEsIDB4NjIsIDB4NjUsIDB4YTcsIDB4Y2QsIDB4M2QsIDB4MGMsIDB4N2IsCisJMHg1OCwgMHhjNywgMHhiNiwgMHg5YiwgMHgwYiwgMHg2NiwgMHg3NCwgMHhkZSwgMHgzZiwgMHgwMiwgMHhiOSwgMHhiMiwKKwkweDRlLCAweGUzLCAweGNiLCAweGVmLCAweDIxLCAweDZmLCAweGRmLCAweDgzLCAweDUyLCAweGVjLCAweDk0LCAweGYwLAorCTB4N2EsIDB4ZDAsIDB4OTMsIDB4OWYsIDB4NjEsIDB4ZGMsIDB4ZmQsIDB4MDksIDB4OTUsIDB4ODMsIDB4NDQsIDB4ZWQsCisJMHg0YiwgMHhkYiwgMHhlZCwgMHg1ZCwgMHhkNywgMHg2MCwgMHhiNywgMHgyMywgMHg5NywgMHhiNSwgMHhkYiwgMHhjZiwKKwkweDg1LCAweDgzLCAweDc2LCAweDdiLCAweGQ3LCAweDM1LCAweGQ4LCAweGVkLCAweGZlLCAweDZiLCAweGIyLCAweDViLAorCTB4ZWUsIDB4OGQsIDB4OTgsIDB4ZTQsIDB4ZDcsIDB4YzQsIDB4NTYsIDB4YzYsIDB4NTksIDB4ZmUsIDB4YmEsIDB4MTMsCisJMHg1OCwgMHgzMywgMHg3MywgMHg4OSwgMHgzNSwgMHhjNywgMHgyZSwgMHg1OSwgMHg1YiwgMHg2ZCwgMHg4YywgMHhiMSwKKwkweGFlLCAweDQ2LCAweGRlLCAweGNjLCAweGFkLCAweGU4LCAweDZmLCAweDIzLCAweDllLCAweDVmLCAweGJhLCAweGRkLAorCTB4Y2IsIDB4ZTcsIDB4ZmQsIDB4YmMsIDB4M2UsIDB4NjgsIDB4M2YsIDB4ZDQsIDB4MGIsIDB4ZWEsIDB4YzIsIDB4NjMsCisJMHhlMCwgMHgxNywgMHhmNSwgMHhjMSwgMHhiNywgMHhiOSwgMHg5ZSwgMHgwNiwgMHgxZCwgMHg1YywgMHg0NCwgMHhiZSwKKwkweGRmLCAweGUzLCAweGU5LCAweDIwLCAweDY1LCAweGRkLCAweGFiLCAweGJlLCAweDExLCAweDk1LCAweDljLCAweDQ3LAorCTB4ZGMsIDB4M2MsIDB4MWYsIDB4M2EsIDB4OTAsIDB4MmYsIDB4ZjksIDB4YjYsIDB4MDYsIDB4OWUsIDB4NDQsIDB4ZmQsCisJMHg2NywgMHhlNCwgMHhhMywgMHg4ZCwgMHg5OCwgMHg2NywgMHgwYiwgMHhlMiwgMHgzNSwgMHhmMCwgMHg0OCwgMHhmNSwKKwkweDJmLCAweGFmLCAweDA5LCAweDVmLCAweDFlLCAweGNmLCAweGE0LCAweDE4LCAweGMyLCAweGQ4LCAweDUzLCAweDAzLAorCTB4YjAsIDB4ZjEsIDB4MDEsIDB4NjIsIDB4NTQsIDB4MWEsIDB4NzksIDB4MGYsIDB4ZjUsIDB4OTAsIDB4YmEsIDB4YjksCisJMHgyOSwgMHhiOSwgMHg0MywgMHg2NywgMHg0YywgMHhiNSwgMHgwNywgMHhiNiwgMHg0NywgMHg3ZCwgMHg4ZCwgMHhjYiwKKwkweDhlLCAweGNhLCAweGE2LCAweDMzLCAweGU3LCAweDc0LCAweGFlLCAweDUxLCAweGFkLCAweGU2LCAweDk5LCAweDJiLAorCTB4NWEsIDB4YTIsIDB4NzcsIDB4ZjcsIDB4ZmYsIDB4NDUsIDB4OTgsIDB4N2UsIDB4ZTksIDB4N2EsIDB4ZGIsIDB4ZjAsCisJMHg3NCwgMHgyZCwgMHg4MywgMHg3YiwgMHhlYSwgMHhlZCwgMHhlYiwgMHhmMCwgMHhmNywgMHhmYywgMHhjNiwgMHhmZSwKKwkweDAzLCAweGY0LCAweGM3LCAweDYwLCAweGYzLCAweGY0LCAweGVmLCAweGNjLCAweDQ3LCAweGI2LCAweDdhLCAweGUzLAorCTB4N2EsIDB4ZDQsIDB4ZjcsIDB4Y2YsIDB4NmMsIDB4ZWEsIDB4NTYsIDB4ZWYsIDB4YmIsIDB4MTMsIDB4ZmQsIDB4NGYsCisJMHg4MiwgMHgzZSwgMHg3YiwgMHg5OSwgMHg5YywgMHg3OSwgMHg0NiwgMHgyMSwgMHhhNywgMHhmMiwgMHgxOSwgMHhiZSwKKwkweGFmLCAweDc0LCAweDEyLCAweDM5LCAweDg4LCAweDE5LCAweGE4LCAweGE1LCAweDg3LCAweGJkLCAweGRjLCAweDhkLAorCTB4MzYsIDB4MTYsIDB4ODEsIDB4MGMsIDB4YjcsIDB4N2IsIDB4YjksIDB4MGEsIDB4ZjMsIDB4ZDcsIDB4ZTUsIDB4NjcsCisJMHgxMywgMHg1NiwgMHhkNywgMHg4MSwgMHgwZCwgMHhlZiwgMHg0MywgMHgwNywgMHgxYSwgMHhlNSwgMHgxNywgMHg4NiwKKwkweGVkLCAweGZiLCAweGYyLCAweGYzLCAweGUzLCAweDk4LCAweDc5LCAweDZmLCAweGRmLCAweDNkLCAweGFlLCAweDBjLAorCTB4N2YsIDB4MmMsIDB4ZjYsIDB4YTksIDB4MDUsIDB4ZjYsIDB4ZTksIDB4ZTMsIDB4ZDEsIDB4M2UsIDB4NmYsIDB4OWYsCisJMHg1YiwgMHgxYiwgMHhmMCwgMHg2OCwgMHhhNCwgMHhjMSwgMHg2NiwgMHgzZiwgMHg0YSwgMHgzYywgMHgzYSwgMHhiNCwKKwkweGU2LCAweGEzLCAweGM3LCAweDIzLCAweGVlLCAweDZiLCAweGUzLCAweGFhLCAweDM4LCAweGU0LCAweGVlLCAweGUzLAorCTB4NzcsIDB4NDUsIDB4NGYsIDB4N2YsIDB4OTgsIDB4ZjksIDB4ZGUsIDB4ZmIsIDB4OTEsIDB4NGYsIDB4MTAsIDB4NDcsCisJMHgyOCwgMHg5MywgMHgzNiwgMHgxNSwgMHhjMywgMHhiYSwgMHhiNiwgMHgwNywgMHg1ZiwgMHg1ZSwgMHgwYSwgMHhjOSwKKwkweDFiLCAweGY3LCAweDg0LCAweGU1LCAweDdmLCAweDZmLCAweGUzLCAweGY3LCAweDMwLCAweGQzLCAweGFiLCAweDY5LAorCTB4YjEsIDB4ZmQsIDB4YzIsIDB4MWEsIDB4ZDcsIDB4MGYsIDB4YmQsIDB4ZDAsIDB4ZWUsIDB4ZmEsIDB4MWQsIDB4YmUsCisJMHhlMywgMHhkYiwgMHhiMywgMHg4NSwgMHhlNywgMHg3YywgMHhiNiwgMHg5MSwgMHg1ZiwgMHg0YywgMHhhZSwgMHgyMSwKKwkweDA3LCAweGRjLCAweDY0LCAweDVkLCAweGQwLCAweDU3LCAweGNiLCAweDAxLCAweDJmLCAweDVmLCAweDBmLCAweGFjLAorCTB4ZTcsIDB4ODAsIDB4YzQsIDB4ZDksIDB4MGUsIDB4YTUsIDB4MWIsIDB4ZjksIDB4MjgsIDB4NzMsIDB4MWYsIDB4YzMsCisJMHhjMywgMHg0ZSwgMHhkZSwgMHgyMywgMHhiNywgMHg3NSwgMHg5MCwgMHhlZiwgMHg0MiwgMHhiNiwgMHhjZiwgMHgyMSwKKwkweDVlLCAweDdhLCAweGQ2LCAweDQxLCAweDhlLCAweGViLCAweDIwLCAweGI3LCAweDc1LCAweDkwLCAweGRiLCAweDNhLAorCTB4YzgsIDB4NmQsIDB4OWQsIDB4YTQsIDB4OTcsIDB4MjMsIDB4OGYsIDB4NzgsIDB4NzUsIDB4N2YsIDB4N2UsIDB4ZTMsCisJMHg2NiwgMHg3ZCwgMHhhMSwgMHgwOCwgMHg1ZiwgMHgzMiwgMHhjNSwgMHg3MywgMHgxMywgMHg3YSwgMHgzNiwgMHhiNSwKKwkweGM2LCAweGRiLCAweDlmLCAweDVmLCAweDEzLCAweGVmLCAweGYyLCAweDZhLCAweDM2LCAweGRmLCAweDU0LCAweDc1LAorCTB4NDMsIDB4ZDEsIDB4MWYsIDB4NjgsIDB4NzEsIDB4YmYsIDB4ODMsIDB4ZjMsIDB4N2MsIDB4YzcsIDB4YWYsIDB4MjEsCisJMHgyZSwgMHg1MSwgMHg2NywgMHg4OCwgMHg2OCwgMHhhMywgMHg1NSwgMHgzZCwgMHhjZCwgMHg5YSwgMHg4YywgMHhlOCwKKwkweDdhLCAweGZhLCAweDE2LCAweGJjLCAweGIzLCAweGM1LCAweGNkLCAweDA5LCAweGEyLCAweDYyLCAweGU4LCAweGU5LAorCTB4NTYsIDB4ZjIsIDB4NTQsIDB4ZDMsIDB4ZDMsIDB4NmIsIDB4YmQsIDB4YjksIDB4ZjYsIDB4YjcsIDB4YjgsIDB4YjEsCisJMHg1NSwgMHgyZiwgMHhkYiwgMHhhNiwgMHhjZSwgMHgzOCwgMHg0MSwgMHhjNSwgMHhkYSwgMHg3ZSwgMHhmZiwgMHhjNSwKKwkweGY2LCAweGU1LCAweDZiLCAweDg1LCAweDE0LCAweGJlLCAweDY3LCAweDUzLCAweGY3LCAweDYyLCAweDNlLCAweGI2LAorCTB4ZWIsIDB4ZmMsIDB4ZDYsIDB4MmYsIDB4YzksIDB4ZWYsIDB4OTAsIDB4YzcsIDB4NmYsIDB4OTcsIDB4YzcsIDB4MDYsCisJMHhjNywgMHhhOSwgMHhiYSwgMHgzMCwgMHg3OSwgMHhlZCwgMHhjZiwgMHhhNywgMHhlYSwgMHg3YSwgMHg1OCwgMHg0NywKKwkweDlkLCAweGNkLCAweGMwLCAweGY1LCAweDA3LCAweGE2LCAweGI0LCAweDhkLCAweGVlLCAweDBlLCAweGQ5LCAweGMxLAorCTB4NzUsIDB4ZmQsIDB4NmYsIDB4ZTIsIDB4NTcsIDB4YjMsIDB4NjYsIDB4OGYsIDB4ZmEsIDB4OGUsIDB4ZTYsIDB4ZmEsCisJMHg4YywgMHg5MCwgMHhkMiwgMHg0MSwgMHgzMywgMHhjZCwgMHg3ZCwgMHhmZCwgMHg1MCwgMHg5ZCwgMHhhOSwgMHhhMSwKKwkweGZlLCAweGU1LCAweDkwLCAweGM3LCAweDRjLCAweDBkLCAweDZjLCAweDhhLCAweDliLCAweGZhLCAweDQ4LCAweDBiLAorCTB4ZWIsIDB4YWYsIDB4NDMsIDB4MTUsIDB4MWYsIDB4ZjcsIDB4YjgsIDB4NWUsIDB4YTMsIDB4MWYsIDB4NjcsIDB4NWQsCisJMHhjZCwgMHhjNywgMHgzMywgMHhkOSwgMHhlMCwgMHhkNiwgMHhkYiwgMHgzZSwgMHg4OCwgMHgyZCwgMHhiNSwgMHgzNCwKKwkweGQ4LCAweDkyLCAweGJmLCAweDRmLCAweGVlLCAweDlmLCAweGQ3LCAweGQ1LCAweGNmLCAweDQzLCAweDJjLCAweDU2LAorCTB4MDIsIDB4ZGYsIDB4NDcsIDB4NmEsIDB4YmEsIDB4YzEsIDB4YjMsIDB4MmEsIDB4OWYsIDB4ODUsIDB4MGUsIDB4ZjIsCisJMHhkYiwgMHhjMCwgMHg0ZSwgMHhkOCwgMHg1MSwgMHhiNSwgMHgzYSwgMHhjNCwgMHgxYSwgMHg3MywgMHhkZiwgMHg2NywKKwkweDU0LCAweDdlLCAweGE5LCAweGE3LCAweGU3LCAweDU1LCAweGZkLCAweGMxLCAweDVjLCAweDUxLCAweDdmLCAweDE4LAorCTB4ODIsIDB4YWUsIDB4MjAsIDB4MDYsIDB4NzAsIDB4ZGEsIDB4NTQsIDB4NGMsIDB4YTcsIDB4ZTIsIDB4ODUsIDB4NGEsCisJMHhlMywgMHhmNywgMHg5NywgMHhmYiwgMHg1YiwgMHg1ZCwgMHgzZSwgMHhmYywgMHg1ZCwgMHg4YiwgMHhmYiwgMHgwZCwKKwkweGUyLCAweDhmLCAweGEyLCAweGNiLCAweGRiLCAweDdjLCAweGZmLCAweGFmLCAweDViLCAweGZjLCAweGIzLCAweDNiLAorCTB4ODUsIDB4MTMsIDB4NDMsIDB4ZDAsIDB4NDUsIDB4ZTQsIDB4ZTQsIDB4NmEsIDB4M2UsIDB4YzQsIDB4YmIsIDB4NGYsCisJMHhjYywgMHg3NiwgMHgyYywgMHgxZiwgMHg4ZiwgMHhiZSwgMHgxMywgMHhmZSwgMHhmOCwgMHg4ZSwgMHg4NiwgMHhmMSwKKwkweDFkLCAweDE4LCAweGZmLCAweDdiLCAweDBkLCAweGUzLCAweDNiLCAweDAyLCAweGUzLCAweGEzLCAweDBkLCAweGUzLAorCTB4YTMsIDB4MTgsIDB4ZmYsIDB4N2MsIDB4YzMsIDB4ZjgsIDB4NjgsIDB4NjAsIDB4N2MsIDB4NjcsIDB4YzMsIDB4ZjgsCisJMHg0ZSwgMHg4YywgMHg3ZiwgMHhhMSwgMHg2MSwgMHgzYywgMHhmYSwgMHg0ZSwgMHgzNCwgMHg3OSwgMHhkZiwgMHhjNSwKKwkweDg4LCAweGIxLCAweGZiLCAweGJkLCAweDVjLCAweDFjLCAweGQ3LCAweDcyLCAweGUzLCAweGI3LCAweDE2LCAweGVhLAorCTB4NWQsIDB4MTcsIDB4NjQsIDB4ZTAsIDB4OWYsIDB4YTcsIDB4YTMsIDB4YmQsIDB4NjYsIDB4NjAsIDB4YWYsIDB4ZjUsCisJMHg1OCwgMHhjNiwgMHhkNSwgMHhjNywgMHhhMCwgMHgyZSwgMHgxMiwgMHgxZiwgMHg4YSwgMHg2MiwgMHhkOCwgMHhkMCwKKwkweDlkLCAweDEyLCAweDc0LCAweGE4LCAweGU0LCAweGZiLCAweDI0LCAweDllLCAweDgzLCAweGUyLCAweDE5LCAweDUzLAorCTB4ZDcsIDB4ZjcsIDB4ODYsIDB4ZWMsIDB4NDUsIDB4MmYsIDB4MDcsIDB4N2IsIDB4OWIsIDB4YjQsIDB4MDMsIDB4MmYsCisJMHg3ZCwgMHhjYywgMHg5NCwgMHg2MywgMHhhZSwgMHhkZCwgMHg1MCwgMHg3ZiwgMHgzOSwgMHhiZiwgMHg2NywgMHgzZiwKKwkweGQ0LCAweDU1LCAweDZmLCAweDlkLCAweGExLCAweDE1LCAweGI4LCAweDE2LCAweDVmLCAweDUxLCAweGRiLCAweDMyLAorCTB4YWUsIDB4MDIsIDB4ZDcsIDB4NDYsIDB4NmEsIDB4YjgsIDB4ZjYsIDB4NTksIDB4OTksIDB4YWYsIDB4ZTUsIDB4ZGIsCisJMHhjMywgMHg3MiwgMHhjMCwgMHhkOSwgMHhjNSwgMHgzMywgMHgzNiwgMHhjNywgMHgzMiwgMHhmMiwgMHhlMSwgMHhlNCwKKwkweGRiLCAweGJiLCAweDZhLCAweDdlLCAweDkyLCAweDY3LCAweDNhLCAweDk2LCAweDBlLCAweDMxLCAweDg3LCAweGYyLAorCTB4NmIsIDB4YjMsIDB4NTMsIDB4Y2UsIDB4Y2YsIDB4YjYsIDB4NDIsIDB4MmUsIDB4YjAsIDB4OGQsIDB4NmIsIDB4Y2QsCisJMHhiNywgMHgzOSwgMHg1ZiwgMHg1NCwgMHgwZSwgMHhiOCwgMHhlNywgMHgxZCwgMHg2YSwgMHhmMywgMHgxNiwgMHg2YiwKKwkweGYzLCAweGM2LCAweDNjLCAweDdiLCAweGEzLCAweDBmLCAweGFlLCAweGZiLCAweGNiLCAweDFjLCAweGZjLCAweGU1LAorCTB4MTgsIDB4NzIsIDB4ZWUsIDB4NDUsIDB4NjcsIDB4YjUsIDB4ZmEsIDB4ZTgsIDB4YjUsIDB4ZmEsIDB4Y2IsIDB4YzYsCisJMHgzYSwgMHg3MywgMHhhMywgMHhiZiwgMHhlNCwgMHgzYSwgMHg4ZCwgMHhiNSwgMHhlNSwgMHg3OCwgMHgwMywgMHhmZSwKKwkweDUzLCAweDlmLCAweDBlLCAweDdiLCAweDMxLCAweDM1LCAweGFlLCAweGE1LCAweGMzLCAweGIwLCAweDQ3LCAweDVkLAorCTB4YzYsIDB4OTQsIDB4ZmUsIDB4YjIsIDB4ZWQsIDB4ZTcsIDB4OTYsIDB4YmIsIDB4NmIsIDB4YjksIDB4NjUsIDB4M2QsCisJMHgxZiwgMHg0NCwgMHhlYywgMHg5YSwgMHhmYywgMHhhNCwgMHg4NywgMHg4ZiwgMHg4YywgMHg5MSwgMHhhNywgMHhkMCwKKwkweDdmLCAweDBjLCAweDNhLCAweGMwLCAweDY3LCAweGFjLCAweDk3LCAweGRlLCAweDJjLCAweDlmLCAweDMyLCAweDVkLAorCTB4ZmYsIDB4ZTQsIDB4ZDYsIDB4YTYsIDB4NzYsIDB4YWIsIDB4ZjgsIDB4OWYsIDB4ZGYsIDB4MGIsIDB4MGEsIDB4YTksCisJMHg3NiwgMHgyZiwgMHhkZSwgMHhiYiwgMHgxMiwgMHhhZSwgMHgyZSwgMHhjZiwgMHg0ZCwgMHg3NSwgMHhmZCwgMHg1MSwKKwkweGJjLCAweGNiLCAweGRjLCAweGQ0LCAweDhjLCAweDEwLCAweDQzLCAweGIzLCAweDk1LCAweGNiLCAweGJlLCAweDVmLAorCTB4YTQsIDB4N2YsIDB4MjksIDB4YTgsIDB4ZWYsIDB4ODIsIDB4MmEsIDB4MGYsIDB4YzUsIDB4YjgsIDB4NDUsIDB4ZWYsCisJMHg3ZCwgMHgzNywgMHgwZiwgMHhjZCwgMHg1NiwgMHhiZSwgMHhkZCwgMHhlYSwgMHhlMiwgMHhlMCwgMHhlNSwgMHg3MiwKKwkweDk2LCAweDlmLCAweDg4LCAweGIwLCAweGFlLCAweGI3LCAweGU4LCAweDVjLCAweDg5LCAweGQ2LCAweDk1LCAweDc5LAorCTB4YWYsIDB4YjEsIDB4MjIsIDB4ZWYsIDB4MWQsIDB4ZjUsIDB4ZjIsIDB4ZGEsIDB4Y2YsIDB4YTksIDB4YmMsIDB4ZDcsCisJMHhlNSwgMHgzMSwgMHhmNywgMHgxMiwgMHhjYywgMHhhMywgMHg2YywgMHg2MCwgMHgyMSwgMHhiZiwgMHhhOSwgMHgxMCwKKwkweDFmLCAweDI2LCAweDk0LCAweGRmLCAweGNhLCAweDRmLCAweGRmLCAweDA5LCAweDNlLCAweDQ3LCAweDU3LCAweGQxLAorCTB4OWIsIDB4OGYsIDB4ZGEsIDB4NGYsIDB4ZjgsIDB4N2IsIDB4M2YsIDB4MmMsIDB4NmUsIDB4YmQsIDB4NmUsIDB4MjcsCisJMHg2OCwgMHg2MSwgMHg2ZSwgMHgxNSwgMHhmMiwgMHhmNCwgMHhlMSwgMHhiYiwgMHhkZSwgMHgzOSwgMHg1MywgMHg3ZiwKKwkweDljLCAweDlmLCAweGM3LCAweGQ3LCAweGJlLCAweGJiLCAweDE2LCAweDMzLCAweGNiLCAweGVhLCAweDI3LCAweDFiLAorCTB4MDksIDB4YzMsIDB4OTAsIDB4N2IsIDB4ZTYsIDB4MWEsIDB4YmUsIDB4NWIsIDB4N2MsIDB4OTAsIDB4ZjMsIDB4MTEsCisJMHg4ZCwgMHg3ZSwgMHg4ZCwgMHhkZiwgMHg0ZCwgMHhmOSwgMHhhZCwgMHg1NCwgMHhiNCwgMHhiYiwgMHg3YiwgMHg2ZCwKKwkweGQ4LCAweDAwLCAweGNmLCAweDJjLCAweDA3LCAweGYxLCAweDM1LCAweDJjLCAweGY5LCAweDM5LCAweDA5LCAweDQ3LAorCTB4ZDMsIDB4ZmMsIDB4MDYsIDB4NDAsIDB4ZmYsIDB4ZmYsIDB4YmEsIDB4YjcsIDB4Y2YsIDB4OTgsIDB4ZWMsIDB4OWYsCisJMHg3MSwgMHg2YiwgMHg5ZSwgMHhmYSwgMHg2NSwgMHhjZiwgMHhjNSwgMHgxZCwgMHgwMCwgMHgxZiwgMHgxMiwgMHg0NywKKwkweGZkLCAweDlhLCAweGE3LCAweGVlLCAweDllLCAweDhiLCAweDNiLCAweGZhLCAweGUxLCAweDlkLCAweDhiLCAweGUzLAorCTB4ZmMsIDB4YTYsIDB4ZWMsIDB4NWEsIDB4ZTUsIDB4NWMsIDB4OWMsIDB4NzEsIDB4OTUsIDB4ZTcsIDB4ZTIsIDB4ZGEsCisJMHg1NSwgMHhjZCwgMHg5MywgMHhmMywgMHhiOCwgMHgzNSwgMHg0ZiwgMHhiNiwgMHhiYiwgMHhmYiwgMHg1OSwgMHgyYiwKKwkweGUxLCAweGQ5LCAweGI3LCAweDAxLCAweDc1LCAweDA2LCAweGI5LCAweGJiLCAweGZmLCAweDQ3LCAweDkxLCAweGEzLAorCTB4N2MsIDB4M2QsIDB4ZjIsIDB4ZDEsIDB4ZTcsIDB4MjgsIDB4ZGMsIDB4Y2IsIDB4YWYsIDB4YjgsIDB4ZGYsIDB4NzcsCisJMHhlNSwgMHg1YSwgMHhlYSwgMHgwMCwgMHgxZiwgMHhhYywgMHhhZSwgMHhiOSwgMHg1ZiwgMHhkNSwgMHgzNSwgMHhiZiwKKwkweDEzLCAweDA5LCAweGQ2LCAweDM1LCAweGY1LCAweDJiLCAweDljLCAweDBkLCAweGRiLCAweGJmLCAweDRhLCAweDVkLAorCTB4MzMsIDB4MTQsIDB4MzgsIDB4MWIsIDB4MTYsIDB4ZjIsIDB4Y2UsIDB4ODYsIDB4YjUsIDB4ZGIsIDB4YzgsIDB4MjUsCisJMHhiZCwgMHgzYSwgMHhhNiwgMHg3ZSwgMHhkOSwgMHhiMywgMHg2MSwgMHhmZiwgMHgxOSwgMHhmOSwgMHhlMCwgMHg3NSwKKwkweGNjLCAweDE1LCAweDY3LCAweGMzLCAweGUwLCAweGViLCAweDM2LCAweDQ4LCAweGZjLCAweDlhLCAweGYyLCAweDllLAorCTB4MGYsIDB4OTIsIDB4ZjMsIDB4ZjAsIDB4YmMsIDB4N2UsIDB4MTMsIDB4ZjYsIDB4MWMsIDB4OTIsIDB4NWQsIDB4NTEsCisJMHhlYSwgMHgyNywgMHhjZiwgMHgzNiwgMHhmNiwgMHhjMiwgMHgxNiwgMHg3MCwgMHhhZCwgMHhiMCwgMHg5ZCwgMHhhNCwKKwkweDhjLCAweGI0LCAweDkxLCAweGRlLCAweGU1LCAweGU3LCAweDEwLCAweGVhLCAweGU3LCAweDcxLCAweGMzLCAweGI1LAorCTB4ZjMsIDB4YjgsIDB4NDcsIDB4YTAsIDB4MzcsIDB4ZmEsIDB4NGMsIDB4NTgsIDB4MTYsIDB4MDIsIDB4M2EsIDB4MzUsCisJMHg4NSwgMHg3OCwgMHg0ZiwgMHg5ZiwgMHhiMywgMHhiYywgMHhlNywgMHhmYywgMHg5ZiwgMHg4YSwgMHgyOCwgMHgzMCwKKwkweDhmLCAweDY3LCAweDc4LCAweGRiLCAweGM0LCAweDk4LCAweDczLCAweGJmLCAweDU5LCAweGJhLCAweGZmLCAweDU3LAorCTB4MTIsIDB4YzMsIDB4MTgsIDB4OWUsIDB4ZjEsIDB4MGMsIDB4YzksIDB4MDEsIDB4NTUsIDB4YjMsIDB4ZjAsIDB4NzUsCisJMHg3OSwgMHhjNywgMHg1YSwgMHg2OSwgMHg1OSwgMHg5ZiwgMHhhOSwgMHhiNywgMHhhMywgMHhhYiwgMHhmOCwgMHg3ZCwKKwkweGM0LCAweDkxLCAweDMzLCAweGQ0LCAweGU3LCAweDViLCAweDI1LCAweGU3LCAweGQ1LCAweDgzLCAweDBhLCAweDk1LAorCTB4NmQsIDB4NWUsIDB4N2UsIDB4YTEsIDB4YmUsIDB4ZWQsIDB4ODAsIDB4OTcsIDB4ZGQsIDB4OWUsIDB4MGYsIDB4YzYsCisJMHhiNSwgMHhkNCwgMHg0ZCwgMHg5ZiwgMHg4NywgMHgzNSwgMHg0ZSwgMHhjYSwgMHhkMCwgMHhmNCwgMHg5NiwgMHhkOCwKKwkweDM4LCAweGYwLCAweDZlLCAweDRjLCAweGFkLCAweDc5LCAweDJkLCAweDNjLCAweGQ3LCAweDJlLCAweGYxLCAweGJkLAorCTB4ZjEsIDB4NmEsIDB4ZjksIDB4ZWUsIDB4YzcsIDB4YzcsIDB4OGYsIDB4NjIsIDB4N2YsIDB4ZGQsIDB4ZDAsIDB4OGYsCisJMHg4NywgMHgyNSwgMHg3NywgMHhlMiwgMHg2NiwgMHgxOSwgMHg5YSwgMHg0ZCwgMHg4MCwgMHg5ZSwgMHgxZiwgMHg1NiwKKwkweDBiLCAweDI5LCAweGM0LCAweGQyLCAweDRmLCAweGYwLCAweGRjLCAweDE4LCAweDMwLCAweDE0LCAweDdjLCAweDdiLAorCTB4NjYsIDB4YzUsIDB4NzcsIDB4ZWMsIDB4ZTAsIDB4NTksIDB4YjMsIDB4NjQsIDB4ZWQsIDB4ZWMsIDB4ZDAsIDB4NTMsCisJMHgxNSwgMHgwOSwgMHg3NywgMHg5MCwgMHhlNiwgMHg5OSwgMHhmYSwgMHhkOSwgMHhlZiwgMHhjNSwgMHhjYSwgMHgwZSwKKwkweGU1LCAweGRiLCAweDllLCAweGFjLCAweDJjLCAweGFiLCAweGZkLCAweDI4LCAweDE5LCAweDRlLCAweDk0LCAweDlmLAorCTB4MDQsIDB4MmYsIDB4NWUsIDB4NTEsIDB4ZmUsIDB4ZWQsIDB4ODgsIDB4MjMsIDB4MzcsIDB4MTksIDB4NDIsIDB4NzksCisJMHg4OCwgMHgwNiwgMHgxZSwgMHhhOCwgMHgzMywgMHgxYywgMHhlZSwgMHhmNywgMHhmZCwgMHgyZSwgMHgyNSwgMHg1NywKKwkweDE3LCAweDJiLCAweDc2LCAweDA2LCAweGNlLCAweDYwLCAweGQ0LCAweDY1LCAweGViLCAweDllLCAweGNkLCAweDcwLAorCTB4NjUsIDB4ZTEsIDB4OWUsIDB4MWYsIDB4MjEsIDB4M2YsIDB4OTcsIDB4MGUsIDB4ZWQsIDB4YjIsIDB4ZGQsIDB4ZjMsCisJMHgyMywgMHgzZCwgMHg3MywgMHhlYywgMHhlYiwgMHg2YywgMHhmMCwgMHg3ZCwgMHg2MSwgMHhlOCwgMHgwMCwgMHhjZiwKKwkweDFkLCAweGYxLCAweGNjLCAweDM3LCAweDY5LCAweDU2LCAweGI1LCAweDhlLCAweDU1LCAweGJmLCAweDZkLCAweDVmLAorCTB4NWIsIDB4Y2QsIDB4ZDUsIDB4NWQsIDB4YjMsIDB4NWIsIDB4YWQsIDB4NzksIDB4OWQsIDB4ODcsIDB4NTksIDB4ZmUsCisJMHg1OSwgMHhlZiwgMHg5NCwgMHhmNiwgMHhmZiwgMHhkNCwgMHg1ZCwgMHg3YiwgMHg2YywgMHgxYiwgMHhmNywgMHg3ZCwKKwkweGZmLCAweGYyLCAweDQ4LCAweDNkLCAweGFjLCAweGU3LCAweDQ5LCAweGE2LCAweDY0LCAweDVhLCAweDUyLCAweDk0LAorCTB4M2IsIDB4ZTksIDB4NjQsIDB4MjksIDB4YjEsIDB4MTIsIDB4NzAsIDB4OWUsIDB4YmEsIDB4MGEsIDB4ODgsIDB4OWEsCisJMHhiMCwgMHgyNCwgMHhmZCwgMHg1OCwgMHgxMCwgMHgwYywgMHhiNCwgMHhhZCwgMHg2NCwgMHhlZSwgMHg5MiwgMHhhZCwKKwkweDBlLCAweDI1LCAweGE3LCAweDFkLCAweDMwLCAweDYwLCAweDZlLCAweGQ2LCAweDAyLCAweDY5LCAweDA3LCAweGM3LAorCTB4MGMsIDB4NjUsIDB4MjcsIDB4YzYsIDB4YWEsIDB4ODgsIDB4NGMsIDB4Y2MsIDB4NmEsIDB4MWQsIDB4YjAsIDB4NjIsCisJMHgxYywgMHhhNSwgMHgzOCwgMHg2OSwgMHhhNywgMHg4MCwgMHg2OSwgMHhkYSwgMHgwNCwgMHhjNSwgMHhmZSwgMHhiMSwKKwkweDI2LCAweDNiLCAweDdiLCAweDYxLCAweDdmLCAweDA0LCAweGRiLCAweDgwLCAweDFhLCAweDViLCAweDgxLCAweGJhLAorCTB4NzYsIDB4OGEsIDB4NjUsIDB4MWIsIDB4ZTAsIDB4MzQsIDB4ZGIsIDB4YjAsIDB4NzUsIDB4NTgsIDB4MGIsIDB4ZWUsCisJMHhmYiwgMHhmOSwgMHgzZCwgMHhjOCwgMHgyMywgMHg3OSwgMHhkNCwgMHhjMywgMHg3MSwgMHgwNiwgMHg0YywgMHg4MCwKKwkweDQwLCAweGRlLCAweGYxLCAweDc3LCAweDc3LCAweGJmLCAweGRmLCAweGY3LCAweGY3LCAweDdkLCAweGJmLCAweDZlLAorCTB4MmUsIDB4MzMsIDB4MWUsIDB4ZjIsIDB4MzMsIDB4N2UsIDB4Y2YsIDB4MTUsIDB4NjEsIDB4NWYsIDB4MzcsIDB4ZDIsCisJMHhlMSwgMHgzNiwgMHg4MywgMHg2NywgMHhhNCwgMHgwZSwgMHg5ZSwgMHhkNSwgMHgzNCwgMHhjMSwgMHhmNiwgMHg3OCwKKwkweDk5LCAweDc3LCAweDRiLCAweGQ4LCAweGM5LCAweGYzLCAweGM4LCAweDYzLCAweGQ3LCAweDM5LCAweDBlLCAweDEyLAorCTB4NzYsIDB4NjUsIDB4MWEsIDB4NWEsIDB4NzIsIDB4ZTcsIDB4MzcsIDB4NTQsIDB4NjAsIDB4NzcsIDB4YjIsIDB4MGMsCisJMHhiYiwgMHgzZCwgMHhmZiwgMHg4ZiwgMHg2MCwgMHg3NywgMHg0ZCwgMHhlOCwgMHhiZiwgMHhkZiwgMHgyZSwgMHgyMiwKKwkweDZmLCAweDRkLCAweGViLCAweDAwLCAweGJhLCAweDZlLCAweDA5LCAweDcwLCAweDA0LCAweDNmLCAweGI1LCAweGYzLAorCTB4ZWIsIDB4MDQsIDB4OWUsIDB4OGEsIDB4YmMsIDB4ZTIsIDB4NTIsIDB4ZTksIDB4M2IsIDB4ZTEsIDB4YjIsIDB4OWYsCisJMHg5MiwgMHhlZCwgMHgxMiwgMHhkOCwgMHgyNywgMHhmMCwgMHhlNywgMHgzNSwgMHg5NiwgMHg5MSwgMHg0NywgMHg2ZiwKKwkweDRiLCAweDQ2LCAweDQyLCAweDU3LCAweGFhLCAweGI1LCAweDRmLCAweDdlLCAweGJiLCAweGNiLCAweDZkLCAweDlmLAorCTB4MWMsIDB4ZGQsIDB4YTEsIDB4N2QsIDB4NzIsIDB4NWEsIDB4ZGEsIDB4MjcsIDB4YTksIDB4ZWQsIDB4ZGIsIDB4MjcsCisJMHgwMywgMHg3NSwgMHg3OSwgMHg1ZCwgMHg5NSwgMHhmNSwgMHhlYywgMHhkYywgMHgzZSwgMHgzMSwgMHgzNiwgMHhiNSwKKwkweDRmLCAweDQ2LCAweDVkLCAweGJlLCAweDE4LCAweGNjLCAweGY3LCAweDU3LCAweDI5LCAweDc1LCAweDBjLCAweDNjLAorCTB4NGUsIDB4YzMsIDB4MTksIDB4MzAsIDB4M2UsIDB4NTYsIDB4ZTMsIDB4MTcsIDB4ZmUsIDB4MzgsIDB4NjEsIDB4ZmQsCisJMHhkNywgMHhmZiwgMHhjNywgMHhiMCwgMHgxZSwgMHhhYywgMHhmMywgMHg3OSwgMHg1NywgMHhkNiwgMHgwMywgMHgyMSwKKwkweGZlLCAweDUxLCAweDYwLCAweDNkLCAweGQ4LCAweGQwLCAweDc3LCAweGRhLCAweDM4LCAweDY3LCAweGIxLCAweGRhLAorCTB4NzcsIDB4M2EsIDB4NjIsIDB4MzQsIDB4ZTIsIDB4ZWQsIDB4N2YsIDB4ZTQsIDB4ZjIsIDB4YTksIDB4YmEsIDB4ZjksCisJMHgzYiwgMHg2OCwgMHg4YSwgMHg3YywgMHg0NywgMHhjNywgMHhmNSwgMHhiMywgMHg0MCwgMHg0YiwgMHg3NiwgMHgyYSwKKwkweDQ1LCAweGIwLCAweDk5LCAweGYwLCAweGJjLCAweDkwLCAweGEwLCAweGI1LCAweDFhLCAweDdkLCAweDhiLCAweDlmLAorCTB4YzcsIDB4ZWIsIDB4N2IsIDB4ZjUsIDB4MDksIDB4MjEsIDB4YTcsIDB4YTQsIDB4ZmYsIDB4MDEsIDB4ZTMsIDB4MjcsCisJMHg3YywgMHhmMywgMHg2MiwgMHhhYywgMHhjYywgMHg2ZiwgMHg1MiwgMHhmZSwgMHgwOCwgMHhhNSwgMHhmYiwgMHgzNywKKwkweGYyLCAweDQzLCAweGQ0LCAweGNiLCAweGJjLCAweDlkLCAweGQ5LCAweDBhLCAweDlhLCAweGM2LCAweGVmLCAweGU2LAorCTB4N2QsIDB4MDksIDB4NTUsIDB4ZDksIDB4NWEsIDB4ZTAsIDB4OWYsIDB4YTcsIDB4NTksIDB4MmYsIDB4MTgsIDB4MjksCisJMHhlYiwgMHgwNCwgMHhkNSwgMHg3YiwgMHg3MywgMHg0ZSwgMHhkOCwgMHg3NCwgMHg5YSwgMHg3NywgMHgyNiwgMHg2NCwKKwkweGVlLCAweGE5LCAweDM4LCAweDBmLCAweDNkLCAweDRkLCAweGYzLCAweGNlLCAweDVhLCAweDNkLCAweGY4LCAweDZlLAorCTB4MGYsIDB4YmMsIDB4ZjAsIDB4Y2EsIDB4NjksIDB4MmEsIDB4ZWYsIDB4OWQsIDB4ODUsIDB4OWMsIDB4ZjMsIDB4YjgsCisJMHhlNywgMHhkZSwgMHg5NSwgMHg2YiwgMHhjMiwgMHg1MiwgMHg5NSwgMHhiMSwgMHhmMiwgMHhmYSwgMHhiOCwgMHg1OCwKKwkweGQ3LCAweDBmLCAweDhlLCAweDQ0LCAweDUxLCAweGZiLCAweDU2LCAweGFlLCAweDE3LCAweGFiLCAweGFkLCAweDc3LAorCTB4ODIsIDB4MWMsIDB4ZDAsIDB4NzQsIDB4YTgsIDB4NmIsIDB4YTIsIDB4MDEsIDB4OGIsIDB4NjEsIDB4OGYsIDB4N2EsCisJMHgyNywgMHhiNywgMHgyYywgMHhjMSwgMHg3NSwgMHhiNSwgMHhiMCwgMHhhOCwgMHhjOCwgMHg5MSwgMHhmMywgMHg0YSwKKwkweDhlLCAweDE0LCAweDVjLCAweDdjLCAweGJjLCAweDVlLCAweDZmLCAweGVmLCAweGY1LCAweGQwLCAweGRiLCAweGJkLAorCTB4NmEsIDB4OWUsIDB4MzAsIDB4YTcsIDB4NjcsIDB4NTgsIDB4MGYsIDB4YjksIDB4MWYsIDB4N2EsIDB4ODgsIDB4ODksCisJMHhiYSwgMHgyNSwgMHhhOSwgMHg4YiwgMHhlMCwgMHg3NywgMHg5NiwgMHgzNSwgMHhhZiwgMHg4NiwgMHgxOCwgMHg1NywKKwkweDhlLCAweGQwLCAweDUzLCAweGFjLCAweDZiLCAweDVmLCAweGEyLCAweDdiLCAweDk0LCAweDdkLCAweDE2LCAweDcxLAorCTB4ZTUsIDB4OTksIDB4MjIsIDB4OGYsIDB4ZGYsIDB4NDcsIDB4YTksIDB4MjcsIDB4ZWMsIDB4ODksIDB4MDgsIDB4MWQsCisJMHhhMSwgMHg1MywgMHgyMiwgMHg2NywgMHgwNiwgMHhmMSwgMHgzZCwgMHhlNCwgMHgxYywgMHhkYywgMHgyYiwgMHg5ZSwKKwkweDJmLCAweDdkLCAweDE5LCAweDc3LCAweDIyLCAweGE3LCAweDZlLCAweGZiLCAweGY5LCAweGZiLCAweGJhLCAweDU2LAorCTB4MmYsIDB4MmEsIDB4OWUsIDB4YjksIDB4YWEsIDB4NjgsIDB4NGEsIDB4OWMsIDB4ZTMsIDB4ZWIsIDB4OWYsIDB4MzEsCisJMHhlYSwgMHhhZiwgMHg4ZiwgMHgxOCwgMHhmMSwgMHg2MiwgMHhkYywgMHg4OCwgMHhhZSwgMHg2MCwgMHhkYywgMHgzMywKKwkweDQ2LCAweGFjLCAweDA4LCAweDFiLCAweDUyLCAweGUzLCAweDg4LCAweDFkLCAweDA2LCAweGJkLCAweDZkLCAweGQwLAorCTB4ZDYsIDB4YjEsIDB4ODgsIDB4MDIsIDB4ZDUsIDB4ZDQsIDB4NDksIDB4NmMsIDB4NjMsIDB4ZGUsIDB4ODcsIDB4YWEsCisJMHhlNiwgMHhhZCwgMHhlMSwgMHg4YiwgMHhlZiwgMHhmMCwgMHhmNywgMHg0NCwgMHgxOCwgMHhhNiwgMHg1YSwgMHhhZiwKKwkweDZkLCAweDgzLCAweDdmLCAweDdkLCAweDIyLCAweDQ1LCAweDliLCAweGU5LCAweGI1LCAweDc2LCAweDlkLCAweDVlLAorCTB4NWIsIDB4ZDgsIDB4NzIsIDB4ZGUsIDB4MWYsIDB4OTUsIDB4YzYsIDB4NjUsIDB4M2QsIDB4YTIsIDB4ZGYsIDB4MTEsCisJMHhmYSwgMHgyYiwgMHhjZiwgMHhiYiwgMHg0YSwgMHhiNywgMHhhZCwgMHhjMSwgMHgyOSwgMHg4YywgMHhkMSwgMHg3ZSwKKwkweDcwLCAweGVkLCAweDA3LCAweGViLCAweDUyLCAweGY5LCAweGMwLCAweDNhLCAweDNmLCAweGExLCAweDBkLCAweGY1LAorCTB4NWUsIDB4YTYsIDB4Y2MsIDB4NmIsIDB4ODUsIDB4OGQsIDB4YjUsIDB4Y2UsIDB4ZjMsIDB4ODMsIDB4YmQsIDB4ZjUsCisJMHhhMCwgMHg5OCwgMHgyMywgMHhkYiwgMHg1YiwgMHg1NiwgMHg4YywgMHhhNCwgMHhhZiwgMHg3YiwgMHhiZSwgMHg1OCwKKwkweDU1LCAweGZmLCAweGU5LCAweDUxLCAweDA3LCAweDM5LCAweGUyLCAweDUxLCAweDA3LCAweGU5LCAweGE2LCAweGI1LAorCTB4ODAsIDB4OGIsIDB4ZDYsIDB4NDIsIDB4MmUsIDB4YmQsIDB4NmQsIDB4ODgsIDB4ZWQsIDB4OTYsIDB4MGUsIDB4ZTYsCisJMHgyMSwgMHhiMCwgMHg1YiwgMHhkYSwgMHhjOCwgMHhmZiwgMHhiMiwgMHhkYiwgMHg2ZSwgMHhhOSwgMHhhZCwgMHg0NSwKKwkweDA3LCAweGRkLCAweDQxLCAweDM3LCAweDkzLCAweDM2LCAweDRjLCAweDNjLCAweDU3LCAweGFlLCAweDYzLCAweGU3LAorCTB4NzUsIDB4NTcsIDB4NmEsIDB4MGUsIDB4NTcsIDB4ZWEsIDB4ZWEsIDB4MjMsIDB4YmQsIDB4ZTYsIDB4M2IsIDB4NWMsCisJMHgzNywgMHg1ZiwgMHhjOCwgMHhhZiwgMHg0OCwgMHg0MywgMHg5ZCwgMHhjZSwgMHhjYiwgMHhhZSwgMHhiYSwgMHg1MywKKwkweGYzLCAweGFiLCAweGU1LCAweDY3LCAweDc4LCAweGQ2LCAweDg4LCAweGYwLCAweDc5LCAweGE3LCAweGNhLCAweGJjLAorCTB4NmMsIDB4NWEsIDB4Y2UsIDB4MzcsIDB4NTMsIDB4NmQsIDB4NjcsIDB4ZjgsIDB4OTcsIDB4NDgsIDB4YzEsIDB4Y2UsCisJMHg5YiwgMHhiNywgMHhlZiwgMHhjYywgMHg3ZiwgMHhkNiwgMHg1ZSwgMHgyMywgMHg3NywgMHhkZiwgMHgzMywgMHhhNSwKKwkweDVmLCAweGFjLCAweDQ5LCAweGU1LCAweDYxLCAweGY3LCAweDI5LCAweDdiLCAweDZmLCAweDJiLCAweDdjLCAweGM3LAorCTB4YjksIDB4MjYsIDB4ZTUsIDB4NGIsIDB4YjQsIDB4YWQsIDB4M2MsIDB4MDEsIDB4Y2YsIDB4OGYsIDB4OWQsIDB4NjgsCisJMHg3MiwgMHg0YywgMHgxNSwgMHhjYiwgMHg0MiwgMHhiYywgMHgwYSwgMHg3OCwgMHhhZiwgMHhlZiwgMHgwZiwgMHg5ZSwKKwkweGJkLCAweDlkLCAweDNkLCAweGIzLCAweGVhLCAweGY2LCAweDRjLCAweGUyLCAweDE1LCAweDZjLCAweDJkLCAweGU0LAorCTB4MTcsIDB4NGYsIDB4ZDYsIDB4ZTQsIDB4NzgsIDB4N2YsIDB4MTQsIDB4NTgsIDB4NzQsIDB4NzksIDB4ZTQsIDB4M2QsCisJMHgyMywgMHg2ZiwgMHhiOSwgMHhkMSwgMHgzYywgMHhhZiwgMHhiYiwgMHhmNCwgMHg3MiwgMHhjYywgMHhiNywgMHg1NCwKKwkweDdhLCAweDIzLCAweDNjLCAweDIwLCAweDY1LCAweDcxLCAweGQxLCAweDViLCAweDQ3LCAweDMyLCAweGI3LCAweDNkLAorCTB4YmYsIDB4NWEsIDB4ZDksIDB4YmIsIDB4NzcsIDB4OWIsIDB4YjIsIDB4NTcsIDB4ZjQsIDB4ZjQsIDB4ZjAsIDB4MWQsCisJMHgxNCwgMHgzYywgMHhhMCwgMHg4MywgMHg1NiwgMHg3MiwgMHhjOCwgMHhiZiwgMHhmZSwgMHgwNSwgMHhkMCwgMHgzYywKKwkweGYzLCAweDU5LCAweDU3LCAweDRkLCAweDlhLCAweGY3LCAweDNlLCAweDk2LCAweDYzLCAweDJhLCAweDgxLCAweDE5LAorCTB4YzQsIDB4ZmUsIDB4OTAsIDB4NWIsIDB4ZDIsIDB4Y2IsIDB4YmMsIDB4MDcsIDB4ZTMsIDB4YzcsIDB4YWMsIDB4YWIsCisJMHhmMCwgMHhmNywgMHgyYSwgMHhmZiwgMHg1MywgMHg1YywgMHhjOSwgMHg5NywgMHg4MywgMHhkYiwgMHg4OCwgMHhhZCwKKwkweGVjLCAweDhjLCAweDRmLCAweGRiLCAweGQ2LCAweDNhLCAweDIxLCAweGVlLCAweDgzLCAweDdjLCAweGUxLCAweGZiLAorCTB4YmEsIDB4YTgsIDB4ZWIsIDB4MzMsIDB4MmQsIDB4MmQsIDB4Y2UsIDB4OTcsIDB4N2EsIDB4NjQsIDB4MmMsIDB4MGEsCisJMHhiZiwgMHg3NSwgMHhkMCwgMHgyYiwgMHgzOSwgMHhlNCwgMHg3MiwgMHhlMywgMHhiNywgMHhkZiwgMHhlMCwgMHhkZiwKKwkweGJjLCAweDc4LCAweDk0LCAweGNlLCAweDQ1LCAweDg3LCAweDJlLCAweDI3LCAweGY3LCAweDI3LCAweDRmLCAweGIwLAorCTB4OTUsIDB4NGEsIDB4ZjQsIDB4YjcsIDB4ZTEsIDB4NWYsIDB4OTQsIDB4ZjEsIDB4OGMsIDB4ZTIsIDB4OWQsIDB4OGUsCisJMHhkNSwgMHg3OCwgMHhmOSwgMHgwYiwgMHhkZiwgMHhlYywgMHhiOSwgMHhkZCwgMHhkYywgMHhjOCwgMHgyZiwgMHg2YywKKwkweGNiLCAweDVmLCAweDg4LCAweDM4LCAweGZmLCAweDc2LCAweDYyLCAweDI2LCAweDNhLCAweDM2LCAweDNjLCAweDI1LAorCTB4NmEsIDB4NGUsIDB4ZGQsIDB4NzgsIDB4NzAsIDB4NjcsIDB4ZTIsIDB4YzMsIDB4YzAsIDB4ODcsIDB4ZTEsIDB4M2EsCisJMHg1ZSwgMHhmNSwgMHhkMSwgMHhmZCwgMHhmZCwgMHhiNSwgMHg3MCwgMHg2ZCwgMHhmMywgMHhmNCwgMHg1NSwgMHg3OSwKKwkweGM3LCAweDgxLCAweDExLCAweGYzLCAweDg3LCAweDlmLCAweGZhLCAweDIxLCAweDlhLCAweGJmLCAweDA4LCAweDFjLAorCTB4MzYsIDB4MTgsIDB4ZGIsIDB4NDYsIDB4NjksIDB4MjEsIDB4ODgsIDB4YmEsIDB4MjIsIDB4NTEsIDB4OWIsIDB4YTMsCisJMHhlMiwgMHg4NiwgMHhiMiwgMHg1NiwgMHg2OCwgMHg1ZSwgMHhkNCwgMHg0MCwgMHg4ZSwgMHg4NSwgMHg2ZSwgMHhmMiwKKwkweGJjLCAweGU3LCAweDhiLCAweDI5LCAweDNhLCAweGM1LCAweDMyLCAweGY2LCAweGQ0LCAweDRhLCAweDQ1LCAweDc3LAorCTB4YWYsIDB4YWYsIDB4ODMsIDB4YWMsIDB4YzYsIDB4ZjEsIDB4OWIsIDB4MDIsIDB4YzcsIDB4ODcsIDB4MzYsIDB4YzUsCisJMHhmMSwgMHhjMywgMHg2NSwgMHgxYywgMHhmZiwgMHg0NCwgMHhhZiwgMHhjNCwgMHhlNywgMHg2NywgMHhmOSwgMHg1ZSwKKwkweDVkLCAweDc0LCAweDUwLCAweGRjLCAweDM3LCAweGM1LCAweGRmLCAweGRiLCAweGU5LCAweGEwLCAweGVjLCAweDYxLAorCTB4YzEsIDB4Y2YsIDB4NjYsIDB4MWUsIDB4OWYsIDB4NDksIDB4ZDEsIDB4NTMsIDB4MTcsIDB4NTMsIDB4YmUsIDB4YjgsCisJMHhhOCwgMHg1ZiwgMHg3MCwgMHhmNywgMHhlOCwgMHhkMCwgMHhkNywgMHg2MywgMHg1YywgMHgyMywgMHhmYywgMHhkNywKKwkweDdjLCAweDQ5LCAweGQ2LCAweDVjLCAweGU1LCAweDI1LCAweDdmLCAweGEyLCAweDc3LCAweGMzLCAweDgzLCAweDM1LAorCTB4ZjgsIDB4NWYsIDB4NmQsIDB4M2IsIDB4OWUsIDB4NTYsIDB4MzIsIDB4ZjAsIDB4ZDgsIDB4MjYsIDB4N2UsIDB4OGQsCisJMHg3YSwgMHhiYywgMHhlYywgMHhmMSwgMHhkMCwgMHg4NywgMHg3ZiwgMHhiZCwgMHg1NywgMHhjNiwgMHhhOSwgMHgzNiwKKwkweGYzLCAweDZiLCAweGI4LCAweDcxLCAweGI0LCAweDJhLCAweDZlLCAweGNmLCAweDdjLCAweGZmLCAweGJmLCAweDU1LAorCTB4MWMsIDB4ZmQsIDB4YTUsIDB4NWUsIDB4MjksIDB4MmYsIDB4NTAsIDB4MWYsIDB4OTgsIDB4NjAsIDB4MzgsIDB4OWMsCisJMHg2NCwgMHg1ZCwgMHg2NSwgMHg5MCwgMHg5YSwgMHg1ZiwgMHhkNiwgMHg2YiwgMHgxZCwgMHgxNCwgMHhmYywgMHhkNiwKKwkweGVkLCAweGE3LCAweDM5LCAweGE3LCAweDZhLCAweGJiLCAweGQzLCAweGFlLCAweDM1LCAweDlkLCAweDEzLCAweDM2LAorCTB4NGUsIDB4NjMsIDB4N2EsIDB4NmIsIDB4OWMsIDB4NzMsIDB4MzUsIDB4NTQsIDB4MjMsIDB4MTMsIDB4NmEsIDB4ZjEsCisJMHgwZCwgMHhiZCwgMHg0ZiwgMHhiMCwgMHhiZiwgMHg2NCwgMHg0OCwgMHgzZCwgMHg3OCwgMHg5YSwgMHhmNSwgMHhkYiwKKwkweDlkLCAweGM2LCAweDhiLCAweDNlLCAweGFhLCAweDhlLCAweDU4LCAweGRiLCAweDUzLCAweGEzLCAweGY2LCAweDNiLAorCTB4ZjYsIDB4NDEsIDB4ZGEsIDB4MWMsIDB4YzksIDB4NTcsIDB4MWYsIDB4MTIsIDB4YmMsIDB4ZTAsIDB4ZGMsIDB4NjQsCisJMHg4OSwgMHg2MiwgMHhlMSwgMHg0ZSwgMHg0YSwgMHg0ZSwgMHhmMiwgMHhiMywgMHhhNywgMHgxZCwgMHhiNiwgMHhiZCwKKwkweGZjLCAweDk0LCAweDYyLCAweGZhLCAweDRkLCAweDRlLCAweGVlLCAweDUyLCAweGZhLCAweGEyLCAweGY2LCAweGE3LAorCTB4YjcsIDB4YTgsIDB4M2MsIDB4ODcsIDB4NjcsIDB4NDUsIDB4NWMsIDB4NTIsIDB4ZjYsIDB4YzYsIDB4ZTAsIDB4ZWYsCisJMHgyYiwgMHhmYSwgMHhkZSwgMHhjZiwgMHg4YSwgMHhmOCwgMHg2OCwgMHhmMiwgMHg2MiwgMHhiMywgMHgxYSwgMHhkNywKKwkweGVlLCAweDFhLCAweDg3LCAweDMxLCAweGVkLCAweDZhLCAweDJjLCAweGVlLCAweGE5LCAweDc1LCAweDhhLCAweDU2LAorCTB4YzUsIDB4NmYsIDB4MWYsIDB4MTEsIDB4NzUsIDB4NjAsIDB4YjIsIDB4NTYsIDB4MGYsIDB4YmYsIDB4OWYsIDB4YTYsCisJMHhiOSwgMHhmMiwgMHg1YSwgMHhkYSwgMHg3OSwgMHhlYywgMHhjZiwgMHg0YSwgMHgxMSwgMHg2MSwgMHhjYiwgMHhiNSwKKwkweGIzLCAweGNlLCAweDhiLCAweDc5LCAweGQ3LCAweGNmLCAweDA5LCAweDZiLCAweGYxLCAweDhiLCAweGY4LCAweDEwLAorCTB4N2YsIDB4NTcsIDB4Y2YsIDB4MzksIDB4NTksIDB4OWUsIDB4MTMsIDB4NzIsIDB4MzQsIDB4ZWMsIDB4OTAsIDB4YmMsCisJMHg5NywgMHgxZSwgMHhkNywgMHhlZSwgMHgxYSwgMHhhNywgMHg3OSwgMHg4NSwgMHg4ZSwgMHgzZiwgMHhmYywgMHg4MCwKKwkweGU3LCAweGYxLCAweDM3LCAweDJhLCAweDg3LCAweGQ3LCAweDE0LCAweGYxLCAweDUzLCAweDk5LCAweGEzLCAweGExLAorCTB4YmYsIDB4YzMsIDB4YmYsIDB4OGMsIDB4OWMsIDB4MGEsIDB4ZTQsIDB4NDksIDB4YjgsIDB4ZjksIDB4OGQsIDB4NWMsCisJMHg2ZiwgMHgwMCwgMHhiMiwgMHhhOCwgMHg4OCwgMHhiOCwgMHgyOSwgMHhlMiwgMHgxNSwgMHg4ZCwgMHg3NCwgMHhlNywKKwkweGJkLCAweGM4LCAweGNkLCAweGRmLCAweDgxLCAweDBlLCAweGJhLCAweDFkLCAweGZhLCAweGIzLCAweDNjLCAweGU4LAorCTB4Y2YsIDB4ZmQsIDB4N2MsIDB4ZDQsIDB4YzEsIDB4YTEsIDB4MWUsIDB4MmUsIDB4MzUsIDB4NjEsIDB4NTAsIDB4ODksCisJMHg2ZCwgMHgwNSwgMHg4MywgMHhmMiwgMHhhNiwgMHg4ZiwgMHg5ZSwgMHg3MiwgMHhlYywgMHhmMCwgMHgwYSwgMHhjOSwKKwkweDlhLCAweGM5LCAweGQ4LCAweGEyLCAweDNkLCAweGIxLCAweDRlLCAweGZiLCAweDQ1LCAweGNkLCAweDM4LCAweDdhLAorCTB4MWYsIDB4ZTQsIDB4NTksIDB4MDYsIDB4OWYsIDB4YTQsIDB4MDksIDB4YjYsIDB4OGYsIDB4ZDgsIDB4ZmUsIDB4OWMsCisJMHg0NSwgMHhiYywgMHg0NSwgMHhlZiwgMHgwYiwgMHg2YSwgMHhlMCwgMHhmMSwgMHgzOSwgMHhjMSwgMHg3MCwgMHg3YSwKKwkweDZjLCAweDM3LCAweGI1LCAweDQ1LCAweGY4LCAweDllLCAweDEzLCAweGUwLCAweDRmLCAweGU4LCAweGU3LCAweDQ1LAorCTB4NTEsIDB4YjYsIDB4OTMsIDB4NjAsIDB4YjMsIDB4OWUsIDB4OWMsIDB4YjUsIDB4Y2QsIDB4M2MsIDB4MTksIDB4M2MsCisJMHgxNiwgMHhiNiwgMHgyYiwgMHhlZSwgMHg4MywgMHhlYiwgMHgyMywgMHg2NiwgMHgxMywgMHhkNSwgMHhkNiwgMHhlNCwKKwkweDNlLCAweDJiLCAweGVhLCAweDE0LCAweGRmLCAweDBkLCAweGRmLCAweDQ3LCAweDQ2LCAweDNmLCAweGY4LCAweDE1LAorCTB4ZjYsIDB4ZWQsIDB4NWUsIDB4MTUsIDB4MjcsIDB4M2EsIDB4Y2IsIDB4ZGYsIDB4YzcsIDB4ZDUsIDB4ZjcsIDB4YWYsCisJMHg4OCwgMHhmZCwgMHg5NCwgMHhkZiwgMHgzNSwgMHg3ZSwgMHhlMywgMHhlZiwgMHg1ZiwgMHg1YSwgMHhjOCwgMHhmOSwKKwkweGExLCAweGNhLCAweDU5LCAweGE5LCAweGNhLCAweDA1LCAweDA5LCAweDhkLCAweDFhLCAweDVmLCAweGExLCAweGQzLAorCTB4MmIsIDB4OWIsIDB4ZjksIDB4NWYsIDB4YmMsIDB4NmEsIDB4NWQsIDB4YmIsIDB4YjcsIDB4NTksIDB4ZWIsIDB4ZmEsCisJMHgwNywgMHhiYiwgMHg2NSwgMHg2ZCwgMHg5OSwgMHg3YiwgMHgyZSwgMHhmZiwgMHhjOSwgMHg3MywgMHhmMSwgMHhkMiwKKwkweGM5LCAweGVhLCAweGY0LCAweDQ0LCAweDVlLCAweDZmLCAweDg5LCAweGZlLCAweDI5LCAweGZjLCAweDQ5LCAweGJhLAorCTB4MWUsIDB4MGMsIDB4YTksIDB4OWMsIDB4MjUsIDB4ZTQsIDB4MjgsIDB4ZGQsIDB4YTcsIDB4ZjAsIDB4NWEsIDB4ZjMsCisJMHg3ZSwgMHhmMiwgMHhlMCwgMHhmZCwgMHg4ZiwgMHg4OSwgMHg1YywgMHg0ZCwgMHgyOSwgMHgzYiwgMHgwNiwgMHgxNSwKKwkweDNjLCAweDAwLCAweGIzLCAweDkwLCAweDBiLCAweDY2LCAweDdkLCAweDJlLCAweDk4LCAweDE5LCAweGVhLCAweDdiLAorCTB4YTcsIDB4MzgsIDB4M2UsIDB4YmQsIDB4ZjIsIDB4OTksIDB4NmUsIDB4NTksIDB4MmYsIDB4OGUsIDB4NTgsIDB4ZTIsCisJMHhiYywgMHhmYSwgMHhiZSwgMHhkNSwgMHg3YSwgMHg3ZiwgMHhjZSwgMHg2YiwgMHgxNSwgMHhmZSwgMHgyNiwgMHhkNywKKwkweDVhLCAweDVmLCAweDI3LCAweDcyLCAweDVhLCAweDgyLCAweGY1LCAweDMwLCAweGY4LCAweDhlLCAweGViLCAweDNjLAorCTB4ZTYsIDB4MzgsIDB4ZTYsIDB4OWEsIDB4ZTMsIDB4ODgsIDB4NmIsIDB4OGUsIDB4NzcsIDB4MzcsIDB4OTgsIDB4MjMsCisJMHhmMywgMHhmOCwgMHhlMiwgMHg2OSwgMHhmZSwgMHhiZiwgMHhkZCwgMHhiOSwgMHhjYSwgMHg3OSwgMHhjZSwgMHgwYiwKKwkweDc4LCAweGI2LCAweDUzLCAweDNhLCAweDE4LCAweDUyLCAweGIyLCAweGUzLCAweGZiLCAweGFhLCAweDE2LCAweGRkLAorCTB4NmIsIDB4Y2UsIDB4ZmYsIDB4NDAsIDB4OGQsIDB4ZjcsIDB4Y2QsIDB4OGQsIDB4YWIsIDB4ZWUsIDB4ZmEsIDB4ZTMsCisJMHg5NywgMHgyOCwgMHgyNiwgMHhlYiwgMHhjOCwgMHgxNSwgMHg2ZCwgMHg3ZiwgMHhiNSwgMHg4MSwgMHgxZiwgMHhmYSwKKwkweDQxLCAweGExLCAweGZmLCAweGNjLCAweGNiLCAweDc4LCAweGQwLCAweDgwLCAweGVjLCAweGJmLCAweDE2LCAweGEwLAorCTB4ZDUsIDB4NzIsIDB4MmQsIDB4YWYsIDB4NWYsIDB4ZDUsIDB4ZWUsIDB4ZGMsIDB4MWYsIDB4YmMsIDB4YjMsIDB4NzUsCisJMHhiYywgMHgzOCwgMHhmZiwgMHg4OCwgMHhmMCwgMHhlNSwgMHhjOSwgMHhmOCwgMHg1MSwgMHg0MiwgMHhkNSwgMHgyMywKKwkweGRiLCAweDE2LCAweDcyLCAweDAzLCAweDBhLCAweDZiLCAweGYwLCAweGJmLCAweDM2LCAweGFhLCAweGRkLCAweGM1LAorCTB4YjUsIDB4ZjAsIDB4MDMsIDB4NmEsIDB4M2IsIDB4ZmUsIDB4ODQsIDB4ZTAsIDB4ODksIDB4ZDIsIDB4M2YsIDB4MjYsCisJMHhlYiwgMHg2ZiwgMHgwYiwgMHg2YiwgMHgyNywgMHg0NSwgMHhjZCwgMHg2YiwgMHg1NCwgMHhkNSwgMHhmMSwgMHgyNiwKKwkweGE5LCAweDQzLCAweGU4LCAweGI5LCAweGI3LCAweDVmLCAweDdmLCAweGZiLCAweDVjLCAweDcwLCAweGU3LCAweGY1LAorCTB4YjcsIDB4ZWUsIDB4NmIsIDB4NzYsIDB4NTYsIDB4N2YsIDB4NmIsIDB4ZjIsIDB4ZGEsIDB4OGQsIDB4NjUsIDB4NTksCisJMHg3ZiwgMHg1YiwgMHgxZCwgMHg5MywgMHg5MSwgMHhmZSwgMHhjMCwgMHhhNCwgMHg0YiwgMHg3ZiwgMHg5MCwgMHhmYSwKKwkweGZhLCAweDZmLCAweGI5LCAweGYyLCAweGI3LCAweDY1LCAweDZkLCAweDZkLCAweGExLCAweGFjLCAweGIzLCAweGNhLAorCTB4ZGEsIDB4NWEsIDB4OTksIDB4ZWYsIDB4ZWQsIDB4ZWUsIDB4MDMsIDB4MjMsIDB4NjMsIDB4M2YsIDB4ZjIsIDB4MzksCisJMHg5ZCwgMHgzNSwgMHhiMSwgMHgxZiwgMHg1OSwgMHg1MywgMHg2YiwgMHgxOSwgMHg4ZCwgMHg2YywgMHgzOCwgMHhkMSwKKwkweGU3LCAweGEyLCAweDhmLCAweGJhLCAweDIyLCAweDhjLCAweGJiLCAweGVkLCAweDBkLCAweGZhLCAweDIxLCAweDQ0LAorCTB4MWEsIDB4ZjQsIDB4NDMsIDB4NzAsIDB4ZjMsIDB4N2UsIDB4YjcsIDB4OGUsIDB4MDUsIDB4OWQsIDB4MTgsIDB4YjIsCisJMHgxMSwgMHhiYSwgMHgzMCwgMHhmYSwgMHgxOSwgMHg4NCwgMHhlOSwgMHg3NCwgMHg1OSwgMHhmNywgMHhiYywgMHg4ZiwKKwkweDEyLCAweDRhLCAweGY3LCAweDNjLCAweGJkLCAweGEyLCAweGY5LCAweGQxLCAweDQ4LCAweDBkLCAweDNmLCAweGYyLAorCTB4ZDIsIDB4NDUsIDB4NmQsIDB4OTUsIDB4ZTcsIDB4YTMsIDB4ZTksIDB4MzUsIDB4ZTUsIDB4YTIsIDB4ZDcsIDB4OTQsCisJMHgwNywgMHhiZCwgMHg4YSwgMHg2NywgMHgzNCwgMHg5OCwgMHhmNywgMHhmNywgMHhkNSwgMHgzNSwgMHhmOCwgMHg0ZiwKKwkweDg0LCAweGQwLCAweGIzLCAweDg1LCAweDc5LCAweDZhLCAweDUwLCAweGU5LCAweDdmLCAweDJlLCAweDdhLCAweDNkLAorCTB4YzUsIDB4ZjQsIDB4YWEsIDB4Y2YsIDB4NjMsIDB4YmUsIDB4MGQsIDB4NzMsIDB4NDEsIDB4OTUsIDB4Y2UsIDB4MzgsCisJMHhlOCwgMHgzYiwgMHg3NCwgMHhmMSwgMHgxYiwgMHgyMiwgMHg0ZiwgMHhhYSwgMHhkYSwgMHg1ZSwgMHhkNCwgMHhmYSwKKwkweGM0LCAweDNlLCAweDQxLCAweDRiLCAweGQ3LCAweGZkLCAweGM4LCAweDViLCAweGQxLCAweGU3LCAweDRjLCAweGU1LAorCTB4MjcsIDB4ZDMsIDB4YjAsIDB4NjgsIDB4YWUsIDB4ZDIsIDB4MzksIDB4MmEsIDB4ZmEsIDB4ODYsIDB4YzgsIDB4ZjEsCisJMHg3NSwgMHhjZCwgMHhlZCwgMHg0MywgMHg5ZSwgMHg5YiwgMHgzZSwgMHhhZiwgMHg2NSwgMHhlNiwgMHhiNSwgMHgyYSwKKwkweDdmLCAweGM2LCAweGU1LCAweGFhLCAweDllLCAweDgzLCAweGYwLCAweDFkLCAweDc1LCAweDI2LCAweDBjLCAweDI3LAorCTB4MmUsIDB4NzIsIDB4NGMsIDB4N2IsIDB4MWMsIDB4ZjgsIDB4YzksIDB4YTIsIDB4NGMsIDB4ZmIsIDB4M2QsIDB4MDksCisJMHhlNCwgMHgzMywgMHhmNywgMHgyYywgMHg1OSwgMHg3NCwgMHgzYywgMHg3MywgMHhmZiwgMHg1ZCwgMHgxMiwgMHg1NywKKwkweGNlLCAweDhhLCAweDNlLCAweDkyLCAweGU4LCAweDY3LCAweDE2LCAweDYzLCAweGY5LCAweDFjLCAweGY1LCAweDRmLAorCTB4ZDMsIDB4ZjksIDB4NjIsIDB4MGIsIDB4MTUsIDB4NTgsIDB4YmIsIDB4ZjcsIDB4M2IsIDB4NzksIDB4ZTEsIDB4ZWIsCisJMHg2MywgMHg5ZSwgMHg5NCwgMHg0NSwgMHgyZiwgMHg1MSwgMHg2MywgMHhiOSwgMHg5OSwgMHhlZiwgMHhkYiwgMHg0ZiwKKwkweGFiLCAweGI5LCAweDMxLCAweGQxLCAweDEzLCAweDRhLCAweGY2LCAweDE3LCAweGMxLCAweDU4LCAweDFmLCAweGY1LAorCTB4M2EsIDB4MDcsIDB4ZmIsIDB4YTgsIDB4ZWQsIDB4YjMsIDB4MjIsIDB4YzcsIDB4YjIsIDB4OTAsIDB4M2QsIDB4MmIsCisJMHgzZiwgMHhmMywgMHgwZiwgMHhhOCwgMHg2NywgMHhmMCwgMHhmMywgMHg4YSwgMHg3ZiwgMHg0YSwgMHg5MSwgMHg1ZSwKKwkweGNiLCAweDY1LCAweGNiLCAweGI5LCAweGZmLCAweGJjLCAweGY1LCAweDk1LCAweGEzLCAweDNiLCAweGQyLCAweDU3LAorCTB4NTIsIDB4ODksIDB4OGEsIDB4YmUsIDB4ZTIsIDB4YmUsIDB4NzcsIDB4MzksIDB4MDcsIDB4YTYsIDB4NWYsIDB4ZjYsCisJMHg3YiwgMHgwMCwgMHgwYywgMHhkYSwgMHhhMSwgMHg4YiwgMHgyNSwgMHgwMCwgMHg0YiwgMHg2MywgMHhjNiwgMHgwZSwKKwkweDQ1LCAweGZkLCAweDUzLCAweGI0LCAweDUwLCAweDFjLCAweDMyLCAweDkyLCAweDU5LCAweGU4LCAweGNjLCAweGZjLAorCTB4OTksIDB4OGYsIDB4ZWUsIDB4OTEsIDB4M2UsIDB4MWEsIDB4N2QsIDB4MGQsIDB4ZjgsIDB4Y2EsIDB4NmUsIDB4MWUsCisJMHhmZiwgMHg3YSwgMHhiZiwgMHhjYywgMHhjYiwgMHg3NiwgMHg5ZiwgMHhlZiwgMHhlMiwgMHhmMywgMHg3YiwgMHg0MiwKKwkweGQ1LCAweGU3LCAweDc3LCAweGYxLCAweGY5LCAweGRlLCAweDA0LCAweGY2LCAweGQwLCAweDU4LCAweDgyLCAweDVmLAorCTB4ZDIsIDB4YTEsIDB4MzQsIDB4ZWYsIDB4Y2QsIDB4NDIsIDB4OTEsIDB4NjUsIDB4ZWIsIDB4Y2IsIDB4Y2MsIDB4NDcsCisJMHg1NywgMHhmNCwgMHhiOCwgMHgzZSwgMHhkNCwgMHhlYywgMHg4OCwgMHgzZCwgMHgzMSwgMHg3OCwgMHhjYywgMHhiOSwKKwkweGNjLCAweDA0LCAweDhmLCAweDFiLCAweDI0LCAweGZmLCAweGNiLCAweDZjLCAweDhiLCAweGFlLCAweDY4LCAweDVjLAorCTB4ZDUsIDB4ZjksIDB4ZjYsIDB4ZGYsIDB4ZTgsIDB4OTMsIDB4MzksIDB4NTUsIDB4ZGYsIDB4ZGQsIDB4MjMsIDB4ZTEsCisJMHhlNywgMHgwOCwgMHg5ZSwgMHg3MiwgMHg5ZSwgMHhlMSwgMHhmMiwgMHhiYywgMHhjMCwgMHg0MywgMHg3YiwgMHhkYSwKKwkweDJhLCAweDNmLCAweGJmLCAweDEzLCAweDc4LCAweGQ1LCAweDhhLCAweGJjLCAweGQ5LCAweGMwLCAweDEyLCAweGYzLAorCTB4YzUsIDB4MTksIDB4YzcsIDB4NGMsIDB4OTcsIDB4NzMsIDB4ZDUsIDB4MWUsIDB4MWYsIDB4OTAsIDB4ZDcsIDB4YmYsCisJMHhkOSwgMHgyNywgMHhmYiwgMHg4MywgMHg3ZSwgMHg2YiwgMHg0MCwgMHhmNywgMHg0OCwgMHg5NCwgMHgzMiwgMHgwNywKKwkweGY5LCAweGNiLCAweDNlLCAweDAxLCAweDFiLCAweGZmLCAweDMyLCAweGY4LCAweGE1LCAweGMxLCAweGRmLCAweDc5LAorCTB4M2QsIDB4MDksIDB4Y2MsIDB4ZjEsIDB4NGEsIDB4OWYsIDB4ZWUsIDB4MTcsIDB4MjMsIDB4ZDcsIDB4MTUsIDB4ZTcsCisJMHhmOSwgMHg0NiwgMHg3OCwgMHg1ZCwgMHhmYSwgMHhmYywgMHgwYywgMHgxZiwgMHg3YiwgMHhlZCwgMHgyZiwgMHhlZSwKKwkweGQ1LCAweDk2LCAweDkwLCAweGZkLCAweGM1LCAweGRhLCAweDEyLCAweGM5LCAweDA5LCAweGI5LCAweGNmLCAweDE1LAorCTB4OWYsIDB4NmUsIDB4YTgsIDB4ZWMsIDB4ZDMsIDB4M2QsIDB4OWYsIDB4YjksIDB4ZDUsIDB4MDcsIDB4ZmYsIDB4ODYsCisJMHhiMSwgMHhjNCwgMHhmYiwgMHgxZCwgMHg3YywgMHg5ZSwgMHhjNywgMHhhMiwgMHg1NiwgMHgyMSwgMHhjZCwgMHg5ZiwKKwkweDFkLCAweDJhLCAweGFmLCAweGE3LCAweDFlLCAweDU3LCAweDY0LCAweDllLCAweDg0LCAweDk2LCAweDViLCAweGI4LAorCTB4ZjYsIDB4NDMsIDB4YmUsIDB4ODcsIDB4OTQsIDB4NWQsIDB4OGQsIDB4OWYsIDB4NDMsIDB4NzUsIDB4NzksIDB4MzAsCisJMHhmNSwgMHgzOCwgMHhiNiwgMHg5OSwgMHgxZiwgMHg1NiwgMHhjNCwgMHgxMywgMHgzZCwgMHhmMCwgMHg2YywgMHhiMywKKwkweDdlLCAweDA2LCAweGQ3LCAweDg0LCAweDFmLCAweDJkLCAweDU2LCAweDQ3LCAweGFmLCAweGEwLCAweGUzLCAweDAwLAorCTB4ZmQsIDB4Y2UsIDB4NjIsIDB4OGEsIDB4NzYsIDB4ZjEsIDB4NWUsIDB4ZmQsIDB4YTYsIDB4ZjEsIDB4MDAsIDB4ZTIsCisJMHhlZCwgMHgyNCwgMHg3MywgMHg5ZSwgMHgxOCwgMHhjNiwgMHgxOSwgMHg2NywgMHhlMiwgMHg5NCwgMHgxMSwgMHgwMSwKKwkweGJmLCAweDJjLCAweDA1LCAweDljLCAweDBlLCAweDZhLCAweDY2LCAweDVhLCAweGZkLCAweDY1LCAweDFhLCAweDY1LAorCTB4ZmIsIDB4MGYsIDB4MzQsIDB4ZWIsIDB4ODQsIDB4ZTIsIDB4MDQsIDB4N2EsIDB4YjMsIDB4Y2QsIDB4NDMsIDB4YWMsCisJMHgxMywgMHhjNywgMHg4YSwgMHhjMCwgMHg2NywgMHg4MywgMHgzZSwgMHg5ZiwgMHgyMywgMHhmYSwgMHg1YywgMHg2ZSwKKwkweGQ0LCAweGZjLCAweDI2LCAweDM5LCAweDU2LCAweGU1LCAweDc3LCAweGRiLCAweDhjLCAweGYyLCAweDNjLCAweGUyLAorCTB4YzUsIDB4MmYsIDB4ZDMsIDB4ZmIsIDB4YTIsIDB4Y2YsIDB4MDksIDB4ZTAsIDB4YTgsIDB4ZjcsIDB4ZmQsIDB4NGIsCisJMHg3NCwgMHgzMiwgMHg4MSwgMHg3OSwgMHg2ZiwgMHg5ZiwgMHgzZSwgMHg4ZiwgMHhlZiwgMHg4OCwgMHgzZSwgMHhkYiwKKwkweDNjLCAweGU4LCAweGYzLCAweGM1LCAweDdlLCAweDg5LCAweDM3LCAweDI1LCAweGM2LCAweGQxLCAweDM2LCAweDlhLAorCTB4Y2IsIDB4MjIsIDB4MDcsIDB4ZWMsIDB4ZDMsIDB4ZTgsIDB4M2IsIDB4OTUsIDB4NGQsIDB4MzIsIDB4NWYsIDB4NGEsCisJMHg1NiwgMHhmOCwgMHhkMiwgMHg4NSwgMHgyOCwgMHgxYiwgMHhjMywgMHg0YywgMHhlMywgMHhlOCwgMHhjYiwgMHhhNiwKKwkweGYyLCAweDdlLCAweGIwLCAweDhlLCAweDAxLCAweDFhLCAweDVkLCAweDZlLCAweGU3LCAweDZiLCAweDY5LCAweDNkLAorCTB4M2EsIDB4MTUsIDB4NTEsIDB4YjUsIDB4ZmUsIDB4YjYsIDB4MTUsIDB4NjMsIDB4ZmUsIDB4NzgsIDB4OWUsIDB4NjksCisJMHgzOSwgMHg5ZCwgMHhiZCwgMHg5NywgMHgwYSwgMHhjMSwgMHgyMSwgMHgxYSwgMHg1OSwgMHhkNiwgMHhmZCwgMHg0ZCwKKwkweDQ0LCAweGNlLCAweGM2LCAweGEwLCAweGU0LCAweDQ5LCAweDdhLCAweGRkLCAweDlmLCAweDEwLCAweGJlLCAweDBiLAorCTB4ZWIsIDB4ZDIsIDB4YzcsIDB4YjUsIDB4ZWUsIDB4ZjYsIDB4MmQsIDB4ZjgsIDB4ZDIsIDB4MjUsIDB4NDUsIDB4YjMsCisJMHhhNSwgMHhjYiwgMHhkMSwgMHgzMCwgMHhhNSwgMHhhMiwgMHg1MywgMHhhZiwgMHhmNCwgMHgwMywgMHhmZiwgMHg0NywKKwkweDJlLCAweGMxLCAweDBmLCAweDA3LCAweDFlLCAweDZkLCAweDUxLCAweDIyLCAweDUzLCAweDBiLCAweDhiLCAweDIxLAorCTB4NWUsIDB4MzcsIDB4N2UsIDB4MmYsIDB4N2QsIDB4MzAsIDB4MTcsIDB4N2UsIDB4NDAsIDB4YzgsIDB4ZmUsIDB4ZDEsCisJMHg0YiwgMHgzYywgMHg0ZSwgMHhjYSwgMHgyNiwgMHhjNSwgMHgzNywgMHhiYywgMHhmMCwgMHg1MCwgMHhmNywgMHhjNSwKKwkweGQ0LCAweGI4LCAweDI4LCAweDczLCAweDNkLCAweDU5LCAweDdmLCAweDMzLCAweDEzLCAweGZlLCAweDVhLCAweDljLAorCTB4YmMsIDB4ZTYsIDB4M2IsIDB4YmEsIDB4NjgsIDB4ZDEsIDB4YjEsIDB4OGMsIDB4ZmQsIDB4ZjUsIDB4MTQsIDB4NGQsCisJMHgzMSwgMHg1ZCwgMHhiYiwgMHhlNSwgMHgwNSwgMHg4ZiwgMHgyNywgMHhlMCwgMHhkOSwgMHgzNCwgMHhkMywgMHgzZSwKKwkweGRiLCAweGNkLCAweDU5LCAweDRiLCAweGU2LCAweGRkLCAweDg5LCAweGRlLCAweDczLCAweDM4LCAweDQ2LCAweGRkLAorCTB4ZjEsIDB4NWYsIDB4ZjUsIDB4NmIsIDB4NzksIDB4OTAsIDB4Y2MsIDB4YTIsIDB4OGUsIDB4OTAsIDB4M2YsIDB4ZjMsCisJMHgzYywgMHgxZSwgMHhiOSwgMHhmZiwgMHgzOSwgMHhkYywgMHgwNywgMHhmMiwgMHgwZSwgMHg3MywgMHhlNywgMHhlMywKKwkweDU1LCAweGI5LCAweGFmLCAweDIzLCAweDdjLCAweDZmLCAweGQ0LCAweGRkLCAweDFmLCAweDJiLCAweDRlLCAweGYyLAorCTB4ZmUsIDB4NzYsIDB4MDksIDB4ZGUsIDB4MmMsIDB4ZjcsIDB4NzMsIDB4OWEsIDB4Y2UsIDB4NzksIDB4ZjIsIDB4MTUsCisJMHhiOSwgMHgyZiwgMHg0OSwgMHgxNywgMHg3ZCwgMHgyNywgMHgwNSwgMHg3ZCwgMHg0ZiwgMHg4YiwgMHhmZCwgMHg0OCwKKwkweGU2LCAweDBjLCAweGQ2LCAweGQ3LCAweGI0LCAweGVmLCAweDgxLCAweGVkLCAweGVjLCAweDVjLCAweDQwLCAweGU3LAorCTB4MDYsIDB4ZjIsIDB4ZjcsIDB4MGYsIDB4ZmIsIDB4NDUsIDB4NWUsIDB4MjIsIDB4ZWMsIDB4ZWYsIDB4MWMsIDB4M2UsCisJMHhhNywgMHhlOSwgMHg3OSwgMHg5NiwgMHhlYiwgMHgyZiwgMHg2NCwgMHg1YSwgMHhlOCwgMHg2YSwgMHhiNiwgMHg4NSwKKwkweGRlLCAweGM5LCAweDBlLCAweGQxLCAweDk1LCAweGM1LCAweDZlLCAweDNhLCAweGM3LCAweDNhLCAweGYzLCAweDM5LAorCTB4MjcsIDB4NjAsIDB4YTUsIDB4YTksIDB4MWIsIDB4ZjEsIDB4NDUsIDB4ZTQsIDB4MGMsIDB4MzEsIDB4ZGQsIDB4NjEsCisJMHgzYywgMHhmNCwgMHhiZiwgMHhlOCwgMHg1ZSwgMHhjNiwgMHgzOSwgMHhkNiwgMHhiZCwgMHg1YiwgMHhlOSwgMHgzZCwKKwkweDdlLCAweDY2LCAweDNhLCAweGEzLCAweDczLCAweDFkLCAweGUwLCAweDkzLCAweDFmLCAweDJiLCAweGViLCAweGFmLAorCTB4NWIsIDB4ZTMsIDB4ODgsIDB4YjksIDB4MDUsIDB4OGUsIDB4NGMsIDB4OGIsIDB4ZjgsIDB4ZDYsIDB4YzIsIDB4MjIsCisJMHhmZiwgMHhiZSwgMHgwOCwgMHhmZiwgMHgzOSwgMHhjMywgMHg5YiwgMHhmOSwgMHhmMywgMHg5MywgMHgwMSwgMHg4YywKKwkweGM3LCAweDM5LCAweDQ3LCAweGU2LCAweDRhLCAweDhhLCAweGI1LCAweDg1LCAweGY4LCAweGQ4LCAweDI3LCAweDZhLAorCTB4YTQsIDB4MjUsIDB4MWMsIDB4NWEsIDB4NzksIDB4N2QsIDB4M2UsIDB4MzEsIDB4M2UsIDB4YjksIDB4ZGEsIDB4NGEsCisJMHhmMywgMHgzOSwgMHhkNiwgMHg0MSwgMHg3MiwgMHg3ZSwgMHhiNiwgMHg2MSwgMHgzMCwgMHhmNiwgMHhlZiwgMHg1NCwKKwkweDZmLCAweDYxLCAweGRjLCAweGJmLCAweDhiLCAweGQyLCAweDYyLCAweDFjLCAweDdmLCAweGFlLCAweDc2LCAweGQxLAorCTB4NDIsIDB4YWUsIDB4NDMsIDB4MWQsIDB4ZGYsIDB4MmIsIDB4NzIsIDB4ZGMsIDB4NjUsIDB4MWYsIDB4MjMsIDB4ZmMsCisJMHhiNiwgMHgxOSwgMHg3ZiwgMHg3YiwgMHg5NywgMHg3MSwgMHgwYSwgMHgzMiwgMHg1NSwgMHhkYSwgMHhhNSwgMHhlMCwKKwkweDM1LCAweDk3LCAweGViLCAweDdhLCAweDIyLCAweDAzLCAweGU3LCAweGE2LCAweGU4LCAweDI1LCAweDk2LCAweGI3LAorCTB4MjMsIDB4MmYsIDB4YzMsIDB4N2YsIDB4ZmMsIDB4MzgsIDB4ZjAsIDB4MjYsIDB4OWYsIDB4YTIsIDB4NDEsIDB4M2UsCisJMHg0NiwgMHg1ZiwgMHgyNCwgMHhiZiwgMHhhOCwgMHg3MywgMHg4YSwgMHgwNSwgMHgyNywgMHg0NCwgMHg2ZCwgMHg4OCwKKwkweGE0LCAweGQxLCAweDU5LCAweGQxLCAweDhiLCAweGVlLCAweDJkLCAweGMxLCAweDliLCAweGVjLCAweDk0LCAweDY1LAorCTB4NDAsIDB4MWYsIDB4ODEsIDB4MGYsIDB4NDYsIDB4ZTYsIDB4NjAsIDB4MWQsIDB4NzcsIDB4N2EsIDB4ZGUsIDB4ZWQsCisJMHg5YiwgMHgxOSwgMHhhNywgMHg0OCwgMHgzZiwgMHhmMCwgMHg1ZSwgMHhkMiwgMHhhYywgMHhlYSwgMHgyZiwgMHgyMCwKKwkweGY4LCAweGJkLCAweGI5LCAweDRmLCAweGQ3LCAweDRiLCAweGVhLCAweDYzLCAweDJkLCAweDJiLCAweGY0LCAweDcxLAorCTB4NDcsIDB4Y2QsIDB4ZWYsIDB4NjYsIDB4Y2QsIDB4ZWYsIDB4ZTUsIDB4N2MsIDB4MzksIDB4OTYsIDB4NzksIDB4MmMsCisJMHhlNywgMHg0OSwgMHhmNiwgMHgyOCwgMHg0YSwgMHgyZSwgMHg0YiwgMHhmYywgMHgzMywgMHhmNywgMHg4ZCwgMHg5OSwKKwkweDhmLCAweDJhLCAweDFkLCAweDNjLCAweGI5LCAweDM2LCAweDFhLCAweGVhLCAweDMxLCAweDI2LCAweDhjLCAweGU0LAorCTB4ZTQsIDB4M2YsIDB4OTYsIDB4MjIsIDB4MDksIDB4ZTgsIDB4NDUsIDB4NGYsIDB4ZWUsIDB4NTEsIDB4ZjksIDB4YTcsCisJMHgzYywgMHhhZiwgMHg1NCwgMHgxOCwgMHhhYSwgMHhkYiwgMHhlYywgMHg1YSwgMHgwNywgMHhhZCwgMHg4YiwgMHg5ZSwKKwkweDVjLCAweDQyLCAweGM3LCAweGUwLCAweGViLCAweDcxLCAweDlmLCAweDk0LCAweGQ5LCAweDQ0LCAweGU4LCAweDczLAorCTB4MGUsIDB4MWEsIDB4ZGYsIDB4MWYsIDB4YmEsIDB4YzQsIDB4ZmIsIDB4MTksIDB4NWYsIDB4ZmIsIDB4NjksIDB4ZTksCisJMHhhNCwgMHhlOCwgMHg3MSwgMHg4MywgMHhiMSwgMHg1ZCwgMHgzNCwgMHgyNywgMHg3NCwgMHg3ZSwgMHhkNiwgMHg1ZiwKKwkweGFhLCAweGVjLCAweGFhLCAweDI5LCAweGNjLCAweDMzLCAweDg1LCAweGQ4LCAweDhhLCAweGUxLCAweGZjLCAweGJlLAorCTB4MmYsIDB4OTksIDB4OTcsIDB4YjEsIDB4ZjIsIDB4NzgsIDB4NGQsIDB4YWMsIDB4N2MsIDB4NTYsIDB4YzQsIDB4Y2EsCisJMHgxMSwgMHgyNywgMHgwNywgMHg1YywgMHgwMSwgMHg0YiwgMHhhZiwgMHg5YywgMHgxNiwgMHhlYywgMHg2MywgMHg5OCwKKwkweDkwLCAweDFiLCAweDdlLCAweGVlLCAweGEyLCAweGUwLCAweDM3LCAweGUxLCAweDk4LCAweDVmLCAweGU2LCAweDU3LAorCTB4YzcsIDB4NzksIDB4YzYsIDB4MDYsIDB4NWQsIDB4NjAsIDB4N2MsIDB4YjAsIDB4MjcsIDB4MzYsIDB4NTgsIDB4OTcsCisJMHg1OCwgMHhjOSwgMHg3ZSwgMHg5OSwgMHhhZSwgMHhlNCwgMHg5YiwgMHg1OCwgMHhkNywgMHg1YiwgMHhhMCwgMHg4ZCwKKwkweDNjLCAweGIxLCAweDRlLCAweGQ4LCAweDRkLCAweDBiLCAweDYxLCAweGM2LCAweGIxLCAweDg5LCAweDM2LCAweGRlLAorCTB4NGYsIDB4ZDYsIDB4NmIsIDB4MjcsIDB4OTgsIDB4ZWUsIDB4NzgsIDB4ZWUsIDB4MmIsIDB4YjksIDB4ZDIsIDB4OGYsCisJMHhkMiwgMHhlMSwgMHg4OCwgMHgxNSwgMHg5ZCwgMHhlYSwgMHg2MCwgMHhiYiwgMHhjNSwgMHhlNCwgMHg3ZiwgMHg4NywKKwkweGZmLCAweDc3LCAweDg1LCAweDAwLCAweDkzLCAweGMyLCAweDJhLCAweDdlLCAweDY3LCAweDlkLCAweDI3LCAweDUzLAorCTB4ZmEsIDB4ZDEsIDB4MWMsIDB4OGYsIDB4OTksIDB4OWIsIDB4ODIsIDB4ZmQsIDB4MDMsIDB4M2IsIDB4Y2YsIDB4ZTEsCisJMHg3ZiwgMHgzOSwgMHg2NiwgMHg2NSwgMHg5NSwgMHhmMSwgMHhmYiwgMHg2MiwgMHgyYSwgMHg2NCwgMHgwOCwgMHhkZSwKKwkweGJlLCAweGNlLCAweDNjLCAweGZlLCAweDAyLCAweGNkLCAweGYxLCAweDFjLCAweGFlLCAweDEwLCAweGFlLCAweGI1LAorCTB4MjgsIDB4MTksIDB4ZGUsIDB4YzcsIDB4NzgsIDB4ZGYsIDB4Y2QsIDB4OWYsIDB4YTgsIDB4YmYsIDB4NmEsIDB4YTcsCisJMHg4NSwgMHhjOSwgMHgzMSwgMHg1NSwgMHg3ZiwgMHhmNSwgMHhiZCwgMHgwNiwgMHhmNSwgMHg1NywgMHhiOCwgMHg4ZSwKKwkweGU1LCAweGZlLCAweDYyLCAweGU5LCAweGU2LCAweDVjLCAweGQ4LCAweGZkLCAweDNjLCAweDMyLCAweDkyLCAweGUxLAorCTB4NGUsIDB4YTEsIDB4MjMsIDB4YWQsIDB4YWMsIDB4ZmEsIDB4ZjgsIDB4ZDksIDB4MTEsIDB4MmIsIDB4MzksIDB4YzUsCisJMHg3MywgMHhjYywgMHhiOSwgMHhlNywgMHg1ZCwgMHhiYSwgMHgxOSwgMHgwYiwgMHg2MywgMHg5YywgMHhiZiwgMHg2NiwKKwkweDFjLCAweGRiLCAweGNhLCAweDUzLCAweDcyLCAweDNkLCAweDg1LCAweDVjLCAweGU5LCAweGU3LCAweGQxLCAweGIwLAorCTB4NWUsIDB4OWYsIDB4ZmIsIDB4NWEsIDB4YWMsIDB4MDMsIDB4ZjQsIDB4YzQsIDB4OWYsIDB4MmIsIDB4NWQsIDB4YmUsCisJMHgyYiwgMHg1OSwgMHhkOCwgMHhkZiwgMHgwNiwgMHhlMywgMHgzOSwgMHg2NiwgMHgzNCwgMHg0NCwgMHhhOSwgMHgxNSwKKwkweGE2LCAweGVmLCAweDhiLCAweDFkLCAweGJlLCAweDhkLCAweGVjLCAweDk1LCAweDUyLCAweGIyLCAweDJhLCAweDk3LAorCTB4YTUsIDB4ZGEsIDB4ZWYsIDB4MmUsIDB4NmQsIDB4YWUsIDB4MjEsIDB4NzIsIDB4OTYsIDB4MjAsIDB4MzMsIDB4MjEsCisJMHgyZiwgMHg1MywgMHgyNSwgMHhiZiwgMHgwMywgMHhmZCwgMHgwZSwgMHhiNiwgMHhkMCwgMHg1OSwgMHhlNiwgMHg1NywKKwkweDMyLCAweDFmLCAweDg5LCAweDc5LCAweDI3LCAweGYzLCAweDJjLCAweDQ5LCAweDJmLCAweGYxLCAweGFhLCAweGQ3LAorCTB4MGQsIDB4NDgsIDB4OWMsIDB4MWQsIDB4YTksIDB4ZTQsIDB4NDEsIDB4YmEsIDB4ZTIsIDB4ZTksIDB4MDEsIDB4NTcsCisJMHgzYywgMHhkZCwgMHg3NCwgMHhlNSwgMHg0MSwgMHgwNiwgMHg4NSwgMHgzZSwgMHg1NiwgMHhkMSwgMHhhMSwgMHg4MiwKKwkweDRhLCAweDg3LCAweDgyLCAweGFlLCAweDI1LCAweDc5LCAweDU5LCAweGExLCAweGNjLCAweGNiLCAweDc2LCAweDZmLAorCTB4YzEsIDB4Y2IsIDB4YmMsIDB4NmMsIDB4ZDMsIDB4NzUsIDB4YzUsIDB4MzcsIDB4ZWMsIDB4MzAsIDB4ZTQsIDB4ZmMsCisJMHhlNSwgMHhlMiwgMHgzNCwgMHhiZCwgMHhjZCwgMHgzYywgMHhlMiwgMHhhZCwgMHg2MiwgMHg5OCwgMHhmOSwgMHhjNiwKKwkweDI0LCAweGYzLCAweDhkLCAweDA5LCAweGU2LCAweDFiLCAweDBlLCAweGMzLCAweGMwLCAweGUyLCAweGI1LCAweDVmLAorCTB4ZjMsIDB4NWQsIDB4NTksIDB4ODQsIDB4YmMsIDB4OTgsIDB4YTIsIDB4ZTcsIDB4OGIsIDB4ZTAsIDB4YzEsIDB4OTMsCisJMHhhYywgMHhmMywgMHg1YywgMHhmMywgMHg2ZCwgMHgyYywgMHg3NiwgMHgzMSwgMHhiZSwgMHg0YSwgMHgzZCwgMHhhNywKKwkweGRhLCAweDhlLCAweDQxLCAweGFmLCAweDE1LCAweGY4LCAweDg3LCAweGFmLCAweDgyLCAweGNmLCAweGJjLCAweDkxLAorCTB4YTIsIDB4NGUsIDB4ODYsIDB4M2QsIDB4ZTAsIDB4YmMsIDB4OGUsIDB4ZGUsIDB4MTQsIDB4YWYsIDB4ODEsIDB4OTYsCisJMHhkMSwgMHgxMywgMHhmOCwgMHhiYiwgMHhlMywgMHg1MywgMHgzYywgMHhmNywgMHg0ZSwgMHhkZiwgMHgwMiwgMHhlZiwKKwkweGNiLCAweGQzLCAweGUxLCAweDk0LCAweGQ5LCAweGNiLCAweDM4LCAweDdmLCAweGFjLCAweDgyLCAweGYzLCAweGE5LAorCTB4MzQsIDB4YWYsIDB4YTAsIDB4NjcsIDB4YjksIDB4OWIsIDB4YzYsIDB4MGUsIDB4NDQsIDB4ZjcsIDB4ZjYsIDB4MzAsCisJMHg5ZCwgMHgyMiwgMHgzNywgMHhhMiwgMHhkMiwgMHhhNywgMHhjNywgMHg0ZiwgMHgyNywgMHg4MywgMHg2ZCwgMHhhYSwKKwkweGJmLCAweDhmLCAweGM1LCAweGYyLCAweGYxLCAweDAzLCAweGJlLCAweGNmLCAweDJkLCAweDVmLCAweDNhLCAweGZiLAorCTB4MmEsIDB4M2YsIDB4MDMsIDB4YzcsIDB4NWYsIDB4ODUsIDB4ZmYsIDB4OTMsIDB4ZWQsIDB4ODMsIDB4NTYsIDB4ZTEsCisJMHgzZiwgMHgyYSwgMHg4OCwgMHhiMSwgMHgzOCwgMHhiNiwgMHgyNywgMHg5OCwgMHg5NywgMHg4NSwgMHhkNywgMHgwZCwKKwkweDdiLCAweDNhLCAweDYyLCAweDMwLCAweGQxLCAweDc1LCAweDk5LCAweGJjLCAweGRlLCAweGQyLCAweGEwLCAweDhjLAorCTB4YzEsIDB4ZWQsIDB4ZGQsIDB4MmIsIDB4ZjksIDB4MDYsIDB4ZTMsIDB4NjYsIDB4MzAsIDB4MjIsIDB4NmMsIDB4YjQsCisJMHhhNiwgMHgyNSwgMHgyOSwgMHgyNywgMHgwYiwgMHhiYywgMHhjZiwgMHgyYiwgMHhlMSwgMHgwOSwgMHhkZSwgMHhlNywKKwkweDBlLCAweDI1LCAweDIzLCAweDUzLCAweGZjLCAweGJiLCAweDkwLCAweGJmLCAweDJjLCAweDJiLCAweDg3LCAweGQwLAorCTB4YjMsIDB4ZGEsIDB4MTQsIDB4ZmQsIDB4MjAsIDB4NjYsIDB4ZDEsIDB4NmYsIDB4YTcsIDB4ODMsIDB4ZWYsIDB4NmIsCisJMHgzMywgMHhkNiwgMHg4MiwgMHg0ZiwgMHg3YywgMHhlMCwgMHg0YiwgMHg2NiwgMHhmMSwgMHg1YywgMHhlMCwgMHgyMSwKKwkweDdmLCAweGNmLCAweDRmLCAweGQxLCAweDg1LCAweDhjLCAweDllLCAweGMzLCAweDgwLCAweDYxLCAweGJjLCAweDg0LAorCTB4NzksIDB4ZjgsIDB4NjgsIDB4YjcsIDB4ZjMsIDB4NDMsIDB4ODYsIDB4MTcsIDB4MWYsIDB4ZmYsIDB4NzEsIDB4ZWQsCisJMHg5YywgMHg4NiwgMHhkNSwgMHg5YywgMHhkMCwgMHhkMywgMHhiMiwgMHgwNSwgMHgzZCwgMHg3YywgMHgwOCwgMHhiZCwKKwkweDhmLCAweDBhLCAweGEyLCAweGU3LCAweDY0LCAweGIzLCAweGIwLCAweDRkLCAweDBiLCAweGMyLCAweGM2LCAweDI4LAorCTB4ODUsIDB4MmEsIDB4N2QsIDB4MzAsIDB4ZWYsIDB4YTksIDB4MzksIDB4ZjcsIDB4MTMsIDB4NWYsIDB4N2EsIDB4ZjEsCisJMHhhMCwgMHhkMCwgMHhjNSwgMHg0NiwgMHgwZSwgMHhlYywgMHg1NSwgMHhmNSwgMHhhNywgMHg1ZCwgMHhlMiwgMHhiZSwKKwkweGM2LCAweDMyLCAweDdlLCAweDdiLCAweDUwLCAweGZkLCAweGY2LCAweDQ5LCAweGExLCAweDAzLCAweDIzLCAweDJmLAorCTB4MmUsIDB4YjAsIDB4MjQsIDB4ZjAsIDB4OWMsIDB4ZjcsIDB4ZDcsIDB4OTksIDB4NjAsIDB4M2MsIDB4MGYsIDB4YWQsCisJMHhjMCwgMHg3NywgMHgyZiwgMHhlMCwgMHhhOSwgMHhlMSwgMHgwMSwgMHg1OCwgMHgwMCwgMHhmNywgMHgzYiwgMHgxNCwKKwkweGRlLCAweGRiLCAweDU2LCAweGRjLCAweGFmLCAweGQ3LCAweGRkLCAweDA4LCAweGNlLCAweGFjLCAweGQzLCAweDY0LAorCTB4YjAsIDB4NTYsIDB4YWMsIDB4NjksIDB4OGYsIDB4MmYsIDB4OTIsIDB4YjcsIDB4OGMsIDB4ZjQsIDB4MjIsIDB4NmMsCisJMHgxYSwgMHhkNCwgMHhiNSwgMHhkYywgMHg4NSwgMHhiYywgMHgyOSwgMHg5ZSwgMHhjMywgMHgxZSwgMHg4YSwgMHgyNCwKKwkweDMwLCAweDJmLCAweDhjLCAweGQzLCAweDMwLCAweGY4LCAweGI3LCAweDFhLCAweDU4LCAweGI4LCAweGFmLCAweGViLAorCTB4NTYsIDB4ZDcsIDB4YjUsIDB4OGEsIDB4YmQsIDB4MjAsIDB4MDMsIDB4Y2YsIDB4ZDEsIDB4Y2YsIDB4YzYsIDB4NzMsCisJMHhmMSwgMHg3YywgMHg1YywgMHg4NywgMHhmYiwgMHhjOSwgMHhmYiwgMHhmNiwgMHgzMSwgMHg3ZiwgMHg4ZSwgMHg0ZSwKKwkweGM5LCAweDdiLCAweDE5LCAweDk3LCAweGU0LCAweDZmLCAweDdkLCAweDhlLCAweGY3LCAweDdjLCAweGU1LCAweGZlLAorCTB4ZjksIDB4NTQsIDB4YmYsIDB4MWUsIDB4ZWMsIDB4NWYsIDB4MzcsIDB4ZTUsIDB4ODUsIDB4OGYsIDB4MTMsIDB4YmYsCisJMHg3NSwgMHg4YSwgMHhkZiwgMHhhMiwgMHg0ZSwgMHhhNywgMHhkOCwgMHhkNywgMHhmMywgMHg3YywgMHgzYywgMHg5ZiwKKwkweGVkLCAweGYyLCAweGMxLCAweDM2LCAweDRmLCAweDI3LCAweDNhLCAweDdkLCAweGY5LCAweDNjLCAweGQ2LCAweGRiLAorCTB4ZTksIDB4OGIsIDB4MzMsIDB4ZWUsIDB4YzcsIDB4YjIsIDB4ZjEsIDB4ZDIsIDB4ODIsIDB4ZTAsIDB4MzEsIDB4YWMsCisJMHhkMywgMHhmNiwgMHhkYSwgMHhlNiwgMHg0OSwgMHhlMywgMHg0ZiwgMHg4NiwgMHg2NCwgMHg2ZiwgMHg1YiwgMHg3YywKKwkweDY3LCAweGZhLCAweGNiLCAweDMwLCAweGZkLCAweDY1LCAweDk4LCAweGZlLCAweDMyLCAweDRjLCAweDdmLCAweDE5LAorCTB4YTYsIDB4M2YsIDB4YjYsIDB4NGIsIDB4ZGYsIDB4NjQsIDB4OTksIDB4ZjEsIDB4NmQsIDB4OTYsIDB4MTksIDB4OTIsCisJMHg2NiwgMHgyMywgMHhjYSwgMHg4ZiwgMHhhOSwgMHg2OSwgMHhiNiwgMHhiNiwgMHgzZSwgMHg1MywgMHhkMywgMHgyOCwKKwkweGU0LCAweDM0LCAweGY5LCAweDBlLCAweDhmLCAweDU3LCAweGQzLCAweGVhLCAweDU1LCAweGE2LCAweGQ1LCAweGE2LAorCTB4OTksIDB4N2UsIDB4YmEsIDB4OTEsIDB4YzMsIDB4OWUsIDB4ZDksIDB4ZDYsIDB4NzksIDB4ZTYsIDB4ZDEsIDB4NzEsCisJMHgzZiwgMHg3NCwgMHhhYSwgMHgwMCwgMHhkMywgMHgxMywgMHg3NCwgMHg0YSwgMHg5YiwgMHhlMSwgMHhkZSwgMHg0ZiwKKwkweDM3LCAweDk5LCAweDRmLCAweGRmLCAweGM4LCAweDgxLCAweDc2LCAweGVmLCAweDUyLCAweGM3LCAweDE5LCAweGE2LAorCTB4NWQsIDB4YzgsIDB4YjksIDB4MjUsIDB4ZGYsIDB4ZDUsIDB4YWMsIDB4YzEsIDB4YmEsIDB4NTcsIDB4YzAsIDB4NGMsCisJMHgxMiwgMHhmOCwgMHhhOCwgMHhkMCwgMHhjNywgMHg3OCwgMHhkZiwgMHhkNywgMHg5OSwgMHhkZiwgMHhjMywgMHg1NywKKwkweDg3LCAweGJlLCAweDVmLCAweDc5LCAweDFmLCAweGNiLCAweDg5LCAweGQwLCAweDE1LCAweGU2LCAweGEzLCAweGE3LAorCTB4NzMsIDB4NGIsIDB4NGMsIDB4ZWYsIDB4YmQsIDB4ZjQsIDB4ODUsIDB4MWMsIDB4ZTQsIDB4MzEsIDB4NjAsIDB4YzQsCisJMHhjNywgMHg3OSwgMHgxMiwgMHgzZSwgMHgzMCwgMHg2MywgMHgwNiwgMHg2YiwgMHgxZiwgMHg0YiwgMHgxOSwgMHgwMiwKKwkweDRmLCAweDllLCAweDAxLCAweDFjLCAweDE4LCAweGY2LCAweDY3LCAweGY2LCAweGEyLCAweDY3LCAweDdkLCAweGM0LAorCTB4NjgsIDB4NTYsIDB4M2UsIDB4NDUsIDB4N2MsIDB4YzcsIDB4NzgsIDB4OGMsIDB4MDUsIDB4ZGMsIDB4NzAsIDB4ZGMsCisJMHgyOCwgMHhmZSwgMHg4OCwgMHhmNywgMHg0MiwgMHg4NCwgMHgxOSwgMHgxZSwgMHhiNSwgMHg3YywgMHhlYiwgMHgwMiwKKwkweDdhLCAweDkxLCAweDAyLCAweDVlLCAweGQzLCAweDUxLCAweDNmLCAweDZhLCAweGM1LCAweGU5LCAweDM5LCAweGJjLAorCTB4ZmYsIDB4ZTAsIDB4ODUsIDB4MjIsIDB4ZTYsIDB4YmQsIDB4NDgsIDB4MGIsIDB4NDEsIDB4ZjAsIDB4MjEsIDB4M2IsCisJMHg3YywgMHg5ZCwgMHgyNCwgMHhlYywgMHg1YSwgMHg1OSwgMHhiZiwgMHhmYywgMHhiYywgMHgzNywgMHg2ZiwgMHhiMywKKwkweGEyLCAweDQyLCAweDFmLCAweDZlLCAweDYxLCAweGZiLCAweDA2LCAweGIwLCAweDc5LCAweDhiLCAweDcxLCAweDJkLAorCTB4MGMsIDB4OWIsIDB4NWYsIDB4ZjEsIDB4YjUsIDB4MzcsIDB4OTksIDB4ZTcsIDB4NjAsIDB4Y2YsIDB4M2EsIDB4ODUsCisJMHg4YywgMHhmMSwgMHhlMiwgMHg2NSwgMHgxYiwgMHg4YSwgMHg5NywgMHgzOSwgMHgyZSwgMHg1ZSwgMHg5NiwgMHgyZSwKKwkweGYzLCAweDMyLCAweGM2LCAweDA5LCAweGMxLCAweGMzLCAweGMwLCAweGEzLCAweDY2LCAweDU5LCAweDRmLCAweDk0LAorCTB4ZGYsIDB4YTEsIDB4ZmYsIDB4ZWQsIDB4MTYsIDB4M2MsIDB4OGIsIDB4NzksIDB4M2QsIDB4ZGIsIDB4MGQsIDB4ODUsCisJMHg2MiwgMHhjYSwgMHg3NywgMHg0OCwgMHhmMCwgMHgwZSwgMHg4ZCwgMHhkNywgMHhmZiwgMHhhMywgMHhlOCwgMHhhMSwKKwkweDU1LCAweGYwLCAweDgxLCAweGY0LCAweDJjLCAweGY4LCAweDk1LCAweGQ3LCAweGY4LCAweGZmLCAweDAyLCAweDZjLAorCTB4NzksIDB4YmMsIDB4MTMsIDB4N2EsIDB4OGQsIDB4ZjksIDB4NTgsIDB4MjEsIDB4MGMsIDB4OWIsIDB4YjUsIDB4NDMsCisJMHhkOSwgMHgzNiwgMHhlOCwgMHhiYiwgMHhiNSwgMHgwNywgMHhiOSwgMHg5NiwgMHg1NiwgMHhiNCwgMHhjYywgMHhjNywKKwkweDc2LCAweDJiLCAweGJmLCAweDA1LCAweGZjLCAweDhjLCAweGQ4LCAweGViLCAweDNhLCAweDVkLCAweGMwLCAweDgyLAorCTB4MmUsIDB4YzAsIDB4NjMsIDB4MDMsIDB4MGMsIDB4MWYsIDB4ZDEsIDB4MWIsIDB4OWMsIDB4ZTgsIDB4MTYsIDB4YzMsCisJMHgwMSwgMHhmYiwgMHg3YywgMHgwYiwgMHhmYiwgMHhjYywgMHhiYSwgMHgyYywgMHgwNSwgMHhlNiwgMHhhNiwgMHgwMiwKKwkweDAzLCAweDk4LCAweGRmLCAweGMyLCAweDZhLCAweDg1LCAweDFmLCAweDllLCAweGNmLCAweDBjLCAweDE4LCAweDg1LAorCTB4YWMsIDB4OWMsIDB4ZTMsIDB4Y2EsIDB4YjgsIDB4ZTQsIDB4NzksIDB4ODUsIDB4M2MsIDB4N2EsIDB4N2IsIDB4ODksCisJMHhiOSwgMHhmMiwgMHgxYywgMHhmNSwgMHhmYSwgMHgwNCwgMHhmZiwgMHg1MiwgMHg3NCwgMHhiZiwgMHgxZCwgMHg1YSwKKwkweDRiLCAweDMwLCAweDVkLCAweDYxLCAweDRmLCAweDUyLCAweDJlLCAweDljLCAweDc5LCAweDk0LCAweDlmLCAweDhmLAorCTB4NzMsIDB4OGQsIDB4ZDcsIDB4NzEsIDB4YjMsIDB4YmMsIDB4OGUsIDB4MDgsIDB4YWYsIDB4MDMsIDB4NjMsIDB4NmYsCisJMHhmOSwgMHg2ZSwgMHhhOCwgMHg3NSwgMHhkYywgMHgyOCwgMHhhZiwgMHg2MywgMHg1NiwgMHhhZCwgMHg4MywgMHhkMiwKKwkweGM2LCAweGNjLCAweDZlLCAweGE1LCAweGM3LCAweDZmLCAweDc5LCAweGNmLCAweGQ2LCAweDI4LCAweGViLCAweDI3LAorCTB4ZTksIDB4NTUsIDB4YzAsIDB4ZjMsIDB4MWUsIDB4ODUsIDB4MmYsIDB4NmUsIDB4N2YsIDB4YTgsIDB4N2IsIDB4NmUsCisJMHhmNiwgMHhjNCwgMHg3NSwgMHhmYSwgMHg1ZCwgMHhiYSwgMHgyOSwgMHhmNCwgMHg5MywgMHg2MSwgMHhkNiwgMHg0ZiwKKwkweDcwLCAweDllLCAweDE2LCAweGMwLCAweDg3LCAweGQzLCAweDQxLCAweGY0LCAweDliLCAweDFkLCAweDY0LCAweDk4LAorCTB4YjEsIDB4NWQsIDB4MzUsIDB4YzUsIDB4OWYsIDB4YzIsIDB4NGYsIDB4ODYsIDB4ZmIsIDB4ZTgsIDB4ZWIsIDB4YmYsCisJMHg0OCwgMHgzNywgMHgxNywgMHhjMSwgMHhhYiwgMHhhMSwgMHg4ZiwgMHhjYSwgMHg5ZSwgMHhiNCwgMHgzNywgMHhkNywKKwkweGE0LCAweDlmLCAweDM2LCAweGVlLCAweGU5LCAweGE3LCAweDg1LCAweDhmLCAweDM2LCAweDBjLCAweDdkLCAweGRkLAorCTB4ODQsIDB4M2YsIDB4MzcsIDB4MjYsIDB4ZGUsIDB4NjcsIDB4YzEsIDB4YzcsIDB4NDUsIDB4ZGMsIDB4Y2IsIDB4OGIsCisJMHhlZiwgMHg0YywgMHhiYiwgMHg3MiwgMHhkYywgMHg5MCwgMHg3MywgMHg5MiwgMHg2MiwgMHgzZSwgMHhlMiwgMHg5OCwKKwkweDRkLCAweDg2LCAweGFjLCAweDlkLCAweGI5LCAweDVjLCAweGQ0LCAweDNhLCAweDUxLCAweDljLCAweGY3LCAweGM4LAorCTB4MDksIDB4MWIsIDB4NDYsIDB4NDQsIDB4ZjgsIDB4MGMsIDB4NWEsIDB4OWQsIDB4MGUsIDB4NmEsIDB4NjEsIDB4MzksCisJMHg3OSwgMHg4YSwgMHhkMCwgMHgxMywgMHhjZCwgMHhiNiwgMHhlMCwgMHhjYiwgMHhiZiwgMHhjMCwgMHhiOCwgMHhiNywKKwkweDEwLCAweGI2LCAweDQzLCAweDlmLCAweDEzLCAweGY2LCAweDI1LCAweGU0LCAweDA3LCAweGRlLCAweGE3LCAweDAyLAorCTB4MTgsIDB4NjMsIDB4MGUsIDB4ZmMsIDB4N2QsIDB4MTUsIDB4ZmQsIDB4MzAsIDB4YzMsIDB4YmMsIDB4N2UsIDB4ZjgsCisJMHg4MSwgMHg0NywgMHhhZCwgMHg3NywgMHg1OCwgMHhlZSwgMHg1YywgMHgxMCwgMHhmZSwgMHg5NSwgMHhiMywgMHg5NCwKKwkweDY2LCAweDNhLCAweDNjLCAweDJjLCAweGU4LCAweGQwLCAweDE4LCAweDY2LCAweDZhLCAweDYxLCAweGZhLCAweDQxLAorCTB4OGUsIDB4YzEsIDB4OTgsIDB4ZTgsIDB4YmYsIDB4MjMsIDB4NmQsIDB4MTYsIDB4NWUsIDB4ZTUsIDB4OWEsIDB4ZWEsCisJMHg2YiwgMHg5MCwgMHgwMCwgMHg2ZiwgMHhkOCwgMHhiZSwgMHg2ZiwgMHgyMSwgMHhmMSwgMHg5MSwgMHg3ZCwgMHgyYSwKKwkweDZlLCAweDVkLCAweGFiLCAweGQ2LCAweDg3LCAweDBkLCAweGZiLCAweGNjLCAweDEyLCAweDdkLCAweDFmLCAweDAxLAorCTB4M2IsIDB4ZTEsIDB4MTcsIDB4MzQsIDB4MjYsIDB4MTksIDB4NmUsIDB4ZmEsIDB4ZGQsIDB4MzUsIDB4NmUsIDB4ZmIsCisJMHhmZiwgMHgyOSwgMHg1MSwgMHg5ZiwgMHhmZiwgMHg0NiwgMHg1MSwgMHhjYSwgMHhkOCwgMHgzNCwgMHhkYiwgMHhlNiwKKwkweDBiLCAweDA3LCAweGRjLCAweDNhLCAweDg3LCAweDlkLCAweDhkLCAweDA5LCAweDlmLCAweGNjLCAweDAwLCAweDQ1LAorCTB4OTcsIDB4MjcsIDB4ZTksIDB4YjEsIDB4MGMsIDB4NzgsIDB4MTQsIDB4NWQsIDB4OGYsIDB4M2EsIDB4NzgsIDB4YzMsCisJMHgwNiwgMHg2OCwgMHg3OSwgMHg5MiwgMHhlMiwgMHg0NSwgMHhjMCwgMHhjOCwgMHg0NywgMHgwYiwgMHgyYywgMHgwNSwKKwkweGQyLCAweDU5LCAweGM0LCAweGVlLCAweGY5LCAweDdiLCAweDFlLCAweGVmLCAweDU3LCAweGY5LCAweDE1LCAweGU1LAorCTB4ZjcsIDB4MWUsIDB4YTIsIDB4ZDgsIDB4MzIsIDB4YTUsIDB4OTIsIDB4ZTEsIDB4ODcsIDB4NDUsIDB4Y2YsIDB4ZWEsCisJMHg2NCwgMHg3OCwgMHg1YywgMHhmOSwgMHg2OCwgMHg0MiwgMHg3YywgMHgxZSwgMHg3ZSwgMHgyZiwgMHg4YiwgMHgxZSwKKwkweGNkLCAweGQ4LCAweGE5LCAweDI0LCAweDQ5LCAweGRmLCAweDAzLCAweGYxLCAweDFjLCAweDBjLCAweDk2LCAweGFkLAorCTB4YmIsIDB4OTksIDB4NTcsIDB4MWMsIDB4MTcsIDB4ZmUsIDB4MDcsIDB4ZDYsIDB4NDQsIDB4MTYsIDB4MzEsIDB4MWUsCisJMHhiZSwgMHg4MywgMHg1ZSwgMHg4MiwgMHhiZCwgMHg5NSwgMHhjYywgMHgzZSwgMHhhMCwgMHhjNiwgMHg5NiwgMHhjOCwKKwkweDY0LCAweDVjLCAweDMwLCAweDdmLCAweGM5LCAweDQ5LCAweDg1LCAweDhkLCAweGNhLCAweGY1LCAweGYwLCAweDVkLAorCTB4MWMsIDB4MTcsIDB4ZmEsIDB4ZTEsIDB4MzAsIDB4ZGIsIDB4MzAsIDB4NjIsIDB4NWMsIDB4NjksIDB4NGUsIDB4ZjgsCisJMHgyMSwgMHhmOCwgMHgzOCwgMHhmZiwgMHhkMywgMHgwMSwgMHhmZCwgMHg2ZSwgMHgwMywgMHg5YywgMHg5NywgMHhmZSwKKwkweDA5LCAweGJlLCAweDY3LCAweDllLCAweGU3LCAweDUxLCAweDk1LCAweDE3LCAweDNmLCAweDQ0LCAweDkxLCAweDFkLAorCTB4ZjgsIDB4OGIsIDB4NjYsIDB4ZWYsIDB4YTgsIDB4YmYsIDB4ODgsIDB4NjEsIDB4Y2QsIDB4YjIsIDB4ZTUsIDB4MzIsCisJMHhkMywgMHhjNiwgMHhkYiwgMHg1YiwgMHhkYSwgMHg3MSwgMHhlZiwgMHg2YiwgMHgxOSwgMHhjZCwgMHhiMCwgMHgzMiwKKwkweGM1LCAweGZiLCAweDJmLCAweGQwLCAweGViLCAweDczLCAweGExLCAweGY4LCAweDI5LCAweGJjLCAweDQ3LCAweGM2LAorCTB4OTcsIDB4MTAsIDB4M2EsIDB4NmYsIDB4ODgsIDB4NzUsIDB4MTcsIDB4ZTgsIDB4MzAsIDB4YTMsIDB4MjIsIDB4YmUsCisJMHgxNSwgMHg3OSwgMHhjMiwgMHgzMiwgMHgxNiwgMHhkNiwgMHhmYSwgMHhjOSwgMHgwZiwgMHhiZiwgMHg5YSwgMHhhMywKKwkweDczLCAweDIyLCAweDVhLCAweDQ1LCAweGZlLCAweGJhLCAweDhjLCAweDJiLCAweDQyLCAweGZlLCAweDgyLCAweDA3LAorCTB4ZmUsIDB4YzQsIDB4OTcsIDB4NWMsIDB4ZjMsIDB4ZjcsIDB4ZTksIDB4N2MsIDB4YjcsIDB4NDgsIDB4YjAsIDB4OWMsCisJMHg0ZiwgMHhhMywgMHg3OCwgMHg4YSwgMHhjNiwgMHgzZCwgMHgxZCwgMHhiMywgMHg3MCwgMHhiZiwgMHhkNywgMHgwYSwKKwkweGI0LCAweGViLCAweGQ2LCAweDE5LCAweGUwLCAweDY3LCAweDEyLCAweDdiLCAweDc0LCAweDAxLCAweDcxLCAweDVjLAorCTB4YTMsIDB4MmEsIDB4MWUsIDB4ZDEsIDB4YzIsIDB4ZmIsIDB4MDQsIDB4M2IsIDB4MGYsIDB4ZmUsIDB4YmIsIDB4Y2YsCisJMHhmMiwgMHgyNywgMHhlMiwgMHgwYSwgMHgyNywgMHgwNywgMHhhMSwgMHgyNywgMHhmNSwgMHgzOCwgMHg4YywgMHgzMywKKwkweDUzLCAweDM4LCAweGVlLCAweDY3LCAweGJiLCAweDRiLCAweGViLCAweGI1LCAweGQyLCAweGE3LCAweGM0LCAweGI2LAorCTB4OTgsIDB4ZGEsIDB4MmYsIDB4ZjgsIDB4OTMsIDB4NDYsIDB4NTQsIDB4YmYsIDB4MDEsIDB4OWIsIDB4YWMsIDB4NWUsCisJMHhjMCwgMHhlOSwgMHhlMywgMHhhMiwgMHhjNywgMHhhZCwgMHg2MiwgMHgxMCwgMHhkYiwgMHhjOSwgMHg1OSwgMHhjMiwKKwkweDNiLCAweGI3LCAweGQwLCAweDc3LCAweGYzLCAweDZlLCAweGMwLCAweDllLCAweGY3LCAweGM4LCAweDFkLCAweGEzLAorCTB4ZjgsIDB4OTQsIDB4N2EsIDB4ZmYsIDB4Y2YsIDB4OWQsIDB4ZGEsIDB4YjcsIDB4NWQsIDB4MWUsIDB4ZmIsIDB4ZjYsCisJMHhiZCwgMHg0MSwgMHgxOSwgMHgwMywgMHhiYiwgMHg0YiwgMHg4ZCwgMHhmMSwgMHhjYSwgMHg1MywgMHhmZCwgMHhmYiwKKwkweGE3LCAweGUxLCAweDRmLCAweGFhLCAweGQ0LCAweDUxLCAweDVjLCAweDEzLCAweDdjLCAweGE1LCAweGRlLCAweGE3LAorCTB4MWQsIDB4NjIsIDB4N2UsIDB4MmEsIDB4ZTksIDB4ZjgsIDB4YjgsIDB4MDcsIDB4MWQsIDB4ZjcsIDB4Y2UsIDB4NDAsCisJMHgyZiwgMHhiOSwgMHg3ZCwgMHgzYSwgMHgzZSwgMHhkNiwgMHg5MCwgMHg4ZSwgMHhmZiwgMHg3NSwgMHg1MCwgMHhmYSwKKwkweDU0LCAweGViLCAweGU5LCAweDE4LCAweGI1LCAweDNjLCAweGM3LCAweDhiLCAweDhkLCAweGZjLCAweDU3LCAweGQ4LAorCTB4MDcsIDB4ZDQsIDB4YTQsIDB4YzMsIDB4ZTcsIDB4MDEsIDB4NTgsIDB4NjksIDB4YmYsIDB4MDcsIDB4ZTIsIDB4N2UsCisJMHhjMCwgMHg0NywgMHhjNCwgMHg0ZSwgMHhmZSwgMHg5MCwgMHhlMiwgMHg4YiwgMHhiNSwgMHhiMSwgMHhkMCwgMHhjZCwKKwkweGFlLCAweGY5LCAweDk2LCAweGM3LCAweDM1LCAweGQwLCAweGM1LCAweDQxLCAweDBiLCAweDc2LCAweDQ4LCAweGRhLAorCTB4ZjQsIDB4MWEsIDB4NWUsIDB4ZWYsIDB4ZjksIDB4MGUsIDB4ZTUsIDB4ZWMsIDB4NTQsIDB4OWUsIDB4ZTAsIDB4YTMsCisJMHgwZSwgMHhkMiwgMHg1MywgMHg4OCwgMHgyYiwgMHgyYiwgMHgxZiwgMHhmMCwgMHhkMSwgMHg4YywgMHg1YywgMHhiNywKKwkweDc5LCAweDQwLCAweGUwLCAweDAzLCAweGY0LCAweGQ1LCAweDUwLCAweGMyLCAweDlmLCAweGUwLCAweDNkLCAweDk1LAorCTB4ZmUsIDB4ZGYsIDB4ZTQsIDB4NmEsIDB4NDgsIDB4ZWQsIDB4MTMsIDB4OGYsIDB4YzUsIDB4ZmQsIDB4M2MsIDB4ZWIsCisJMHhmYywgMHhiMCwgMHgzZiwgMHhmNiwgMHhkNywgMHhkNywgMHhjYiwgMHg3OSwgMHhjNSwgMHg5MCwgMHgwNSwgMHgyNSwKKwkweGZhLCAweDBmLCAweDk2LCAweDczLCAweGZlLCAweDAzLCAweGE2LCAweGU4LCAweGI5LCAweDcwLCAweGI5LCAweDc4LAorCTB4ODAsIDB4ZjUsIDB4NDcsIDB4ZWMsIDB4MjEsIDB4N2MsIDB4ODcsIDB4ZGEsIDB4YjcsIDB4ZmIsIDB4ZjYsIDB4MzAsCisJMHg3NSwgMHhlZCwgMHg2NywgMHhhOSwgMHg2ZiwgMHg5MCwgMHhjMywgMHg3YSwgMHhhMywgMHg3MSwgMHgwMCwgMHhmOSwKKwkweGUxLCAweDE2LCAweDVmLCAweDgzLCAweDVlLCAweDUxLCAweDYzLCAweDU2LCAweDljLCAweDNhLCAweGUwLCAweDRmLAorCTB4NDAsIDB4MGYsIDB4NjgsIDB4MmIsIDB4NWQsIDB4NDUsIDB4NTMsIDB4YjMsIDB4ODIsIDB4YTYsIDB4ZTIsIDB4NmIsCisJMHhiMywgMHg4YSwgMHhhNiwgMHg2NiwgMHg5NSwgMHhmZiwgMHg3YywgMHg1NiwgMHhkMSwgMHhkNCwgMHhhYywgMHhhMiwKKwkweGE5LCAweDU5LCAweDQ1LCAweDUzLCAweGIzLCAweDhjLCAweGQ3LCAweGEzLCAweGFjLCAweGFmLCAweDQyLCAweGY3LAorCTB4ZDAsIDB4ZmUsIDB4Y2IsIDB4MmUsIDB4NGEsIDB4ZTYsIDB4NzAsIDB4MWUsIDB4ZjIsIDB4YjgsIDB4OTYsIDB4YWUsCisJMHg3ZSwgMHg2ZCwgMHg1OCwgMHhmYiwgMHg0NywgMHgwYiwgMHgzMiwgMHhjZiwgMHg4ZSwgMHg5ZiwgMHg4NSwgMHgzZCwKKwkweDc4LCAweDk4LCAweGUxLCAweDc3LCAweGNkLCAweDM3LCAweGJmLCAweDg4LCAweGI5LCAweGZhLCAweDI4LCAweDI2LAorCTB4N2EsIDB4YzAsIDB4MzYsIDB4NTEsIDB4ZDQsIDB4YWQsIDB4ZTMsIDB4OWEsIDB4YTgsIDB4ZWIsIDB4OTIsIDB4YjYsCisJMHg1YywgMHhhYSwgMHg2MSwgMHg4ZCwgMHg5NywgMHhjNiwgMHg4YiwgMHg2OSwgMHhiNSwgMHg1ZiwgMHhiNSwgMHg3NiwKKwkweDRlLCAweDBiLCAweDI1LCAweGIyLCAweDgwLCAweDJiLCAweDcyLCAweDIxLCAweDJkLCAweGRlLCAweDFiLCAweDAxLAorCTB4YTcsIDB4OTQsIDB4ZTksIDB4MDEsIDB4ODMsIDB4YTMsIDB4MGEsIDB4MDYsIDB4NGYsIDB4OGIsIDB4MzUsIDB4MjIsCisJMHg5NywgMHgxMCwgMHgzZSwgMHhjOCwgMHhjNiwgMHg3MCwgMHg0OCwgMHg2NywgMHg0NiwgMHhmOSwgMHgzZSwgMHg4YywKKwkweGZiLCAweDA3LCAweDQyLCAweGNjLCAweDgzLCAweGI2LCAweDBiLCAweDA3LCAweGY3LCAweGRhLCAweDFiLCAweGYxLAorCTB4OWEsIDB4ZWQsIDB4ZDYsIDB4ZDMsIDB4NWMsIDB4NzcsIDB4YzksIDB4OGUsIDB4OTAsIDB4OTIsIDB4MWIsIDB4NTIsCisJMHhlZiwgMHhkZCwgMHhlNSwgMHhkOCwgMHg4OSwgMHgxNCwgMHhjZiwgMHhlZCwgMHgyZiwgMHhjMiwgMHg3ZiwgMHgzOSwKKwkweDQ0LCAweDZkLCAweDI1LCAweDNhLCAweDEyLCAweDA2LCAweDNlLCAweDc3LCAweGIxLCAweDVkLCAweGM5LCAweDczLAorCTB4MTgsIDB4MmIsIDB4ZDEsIDB4ODUsIDB4ZjAsIDB4M2UsIDB4YjYsIDB4NWQsIDB4ZjYsIDB4YjMsIDB4MGUsIDB4M2EsCisJMHhjYSwgMHhmZiwgMHg0ZSwgMHhjNCwgMHhlZiwgMHhjMywgMHhiYywgMHgzYSwgMHhmOCwgMHhkYSwgMHg3ZSwgMHgzMiwKKwkweDdhLCAweDUyLCAweDY2LCAweDJiLCAweGViLCAweDA3LCAweDQ3LCAweDJhLCAweGY2LCAweDg4LCAweDA1LCAweGZmLAorCTB4MWMsIDB4ZWIsIDB4YjYsIDB4YzYsIDB4NWMsIDB4YjgsIDB4NWIsIDB4ZDUsIDB4OWMsIDB4YzEsIDB4ODcsIDB4OGQsCisJMHhmOCwgMHhkNiwgMHgzZiwgMHg5NywgMHg2NCwgMHhhZiwgMHg4MCwgMHgyMSwgMHg3NSwgMHhmYywgMHhlMywgMHg1MiwKKwkweDY0LCAweDA4LCAweGM3LCAweDc4LCAweGU3LCAweDkwLCAweDNkLCAweDExLCAweGYxLCAweGZkLCAweDU4LCAweGVhLAorCTB4ZjIsIDB4M2UsIDB4ZmIsIDB4ODgsIDB4N2MsIDB4M2YsIDB4ODAsIDB4NmQsIDB4NWEsIDB4M2UsIDB4MmYsIDB4YmMsCisJMHg5NywgMHgzYSwgMHg0ZiwgMHgyNSwgMHg1ZiwgMHgxNSwgMHg3NCwgMHg1MCwgMHhhMiwgMHg3ZiwgMHg2NywgMHg5YSwKKwkweDM1LCAweDA5LCAweGIxLCAweDhjLCAweDI5LCAweDUxLCAweDBiLCAweDhkLCAweDdjLCAweGU1LCAweGY5LCAweDQ1LAorCTB4M2QsIDB4MmYsIDB4NDcsIDB4ZWQsIDB4ZjUsIDB4ZmQsIDB4YzgsIDB4MzcsIDB4Y2IsIDB4MTYsIDB4NjgsIDB4NzMsCisJMHg5OSwgMHgwMSwgMHgzZiwgMHhkYSwgMHhlOCwgMHhmMiwgMHg0NiwgMHg0ZiwgMHg1MCwgMHhkNCwgMHg2NiwgMHg3NywKKwkweGIzLCAweDhlLCAweGEzLCAweGYzLCAweDkyLCAweGM3LCAweGY4LCAweGZlLCAweDAxLCAweGYxLCAweGJlLCAweGI5LAorCTB4ZDgsIDB4MTIsIDB4YzYsIDB4MzUsIDB4ZDMsIDB4YzgsIDB4NzIsIDB4ZTksIDB4MjEsIDB4ZmUsIDB4NWQsIDB4YzQsCisJMHgxMSwgMHg5MywgMHhkNCwgMHhhYSwgMHg2MiwgMHgwNCwgMHgxZCwgMHgyYSwgMHhhZSwgMHgxNCwgMHg2MiwgMHg1YSwKKwkweGFhLCAweGQ0LCAweDFjLCAweDhmLCAweDk0LCAweDdkLCAweDZkLCAweGMwLCAweGYxLCAweDVhLCAweDVmLCAweGRiLAorCTB4NzMsIDB4NWIsIDB4YzgsIDB4OWIsIDB4YWQsIDB4ZjAsIDB4MWEsIDB4MzksIDB4YTUsIDB4MmQsIDB4YTQsIDB4N2MsCisJMHg4OCwgMHhkNiwgMHgwMiwgMHg2ZCwgMHhiNywgMHhiNiwgMHg2ZSwgMHhjNywgMHhkNywgMHhiNCwgMHgzNiwgMHhjZiwKKwkweGFjLCAweDlmLCAweDc5LCAweGM3LCAweDY5LCAweDUzLCAweGY4LCAweGQ0LCAweDRjLCAweGYzLCAweGI5LCAweDM2LAorCTB4OTYsIDB4ZDksIDB4YTgsIDB4OTcsIDB4MDIsIDB4YmMsIDB4ZmMsIDB4NDMsIDB4YTgsIDB4MzcsIDB4NzksIDB4MzIsCisJMHhkMCwgMHg0YywgMHhhYiwgMHhhYiwgMHhjOCwgMHg3OSwgMHg3OCwgMHhmYywgMHgyZSwgMHg5OSwgMHhlNywgMHhmYiwKKwkweDA4LCAweGMzLCAweDY1LCAweDNmLCAweGNiLCAweDM3LCAweDQzLCAweGM1LCAweDcwLCAweDcwLCAweDBlLCAweGJjLAorCTB4NDEsIDB4ZjQsIDB4ZmQsIDB4MGMsIDB4M2MsIDB4M2MsIDB4ZGUsIDB4YzYsIDB4N2EsIDB4YmQsIDB4OGMsIDB4MDEsCisJMHgxYywgMHhlNCwgMHg3YiwgMHg3ZiwgMHgzMywgMHhmNywgMHgwOCwgMHhmYywgMHg1OSwgMHhlNiwgMHg2MSwgMHhiZSwKKwkweDdmLCAweDhjLCAweGY1LCAweDgxLCAweDA4LCAweDM1LCAweGQzLCAweGNhLCAweDZhLCAweDMzLCAweGViLCAweGY1LAorCTB4Y2QsIDB4YWMsIDB4MGYsIDB4OGMsIDB4OWEsIDB4MjMsIDB4M2UsIDB4ZjEsIDB4MmMsIDB4NTEsIDB4ZGIsIDB4ZjIsCisJMHhlOSwgMHhjMCwgMHg3ZSwgMHhjNiwgMHg0MSwgMHgzYywgMHhlYiwgMHg4YiwgMHhlYSwgMHg1OSwgMHhiNSwgMHhjZiwKKwkweGI4LCAweDU1LCAweGMyLCAweGYxLCAweDYxLCAweGZmLCAweGZhLCAweDk5LCAweGFiLCAweDc4LCAweDJmLCAweGQ0LAorCTB4ZTIsIDB4MzQsIDB4ZWIsIDB4YmUsIDB4NDEsIDB4ZjEsIDB4NmUsIDB4NDYsIDB4NjMsIDB4NjYsIDB4ODYsIDB4ZWQsCisJMHg4MCwgMHgzMCwgMHgxZiwgMHgxZiwgMHhhMSwgMHg1NCwgMHgzMSwgMHg0MSwgMHhiZiwgMHg1NywgMHg3NCwgMHhmYiwKKwkweDZhLCAweDhmLCAweGYwLCAweDljLCAweDY1LCAweDZkLCAweDdkLCAweDBiLCAweGNmLCAweGViLCAweDdkLCAweGE3LAorCTB4OTYsIDB4NjcsIDB4YjQsIDB4OTEsIDB4ZmYsIDB4NmIsIDB4NDEsIDB4NmEsIDB4N2UsIDB4MTEsIDB4YmUsIDB4OTEsCisJMHgxMiwgMHg2NSwgMHhjMywgMHhmNiwgMHg4NSwgMHhlYiwgMHhlMiwgMHhiZCwgMHgxYiwgMHgxNiwgMHhiZCwgMHgyMiwKKwkweGYyLCAweDViLCAweGY5LCAweDdhLCAweGJlLCAweGU3LCAweDc5LCAweDhjLCAweDdiLCAweGM1LCAweGEyLCAweDJiLAorCTB4OGUsIDB4ODQsIDB4ZjcsIDB4OWYsIDB4MDUsIDB4ODIsIDB4ZTQsIDB4N2YsIDB4MWQsIDB4MzksIDB4NDgsIDB4ZDAsCisJMHhiNSwgMHhkNiwgMHhjZiwgMHgzOCwgMHhmYiwgMHg5OCwgMHg1ZiwgMHhiZiwgMHg4OCwgMHhlYiwgMHhmOCwgMHhmMywKKwkweDc1LCAweDFjLCAweGI3LCAweGYxLCAweDNhLCAweDIxLCAweDZmLCAweDkxLCAweDc3LCAweDAyLCAweDNlLCAweGI3LAorCTB4M2YsIDB4NjQsIDB4MGEsIDB4ZmMsIDB4M2IsIDB4YzIsIDB4MzgsIDB4ZDUsIDB4MjQsIDB4N2MsIDB4ODEsIDB4YmQsCisJMHgxOCwgMHhlYiwgMHgwYywgMHhiMiwgMHg2ZSwgMHhiMCwgMHg3ZSwgMHg2NiwgMHg3YywgMHgxZiwgMHg4ZSwgMHgyMywKKwkweDNkLCAweDdlLCAweDg2LCAweDkxLCAweGM0LCAweGExLCAweGIwLCAweDc4LCAweGZmLCAweGExLCAweGViLCAweDJmLAorCTB4NzAsIDB4NzAsIDB4OWMsIDB4NzgsIDB4M2YsIDB4YTEsIDB4M2YsIDB4ZjAsIDB4N2UsIDB4OWEsIDB4ZTgsIDB4YjMsCisJMHhkNCwgMHg0NiwgMHg3MSwgMHg3ZSwgMHg0NiwgMHgyYywgMHgyNywgMHhkNywgMHg3ZCwgMHhiZSwgMHhlOCwgMHgyNywKKwkweGU5LCAweDQ3LCAweDZhLCAweDFlLCAweGQ2LCAweGVmLCAweDI5LCAweGE0LCAweDdlLCAweGRjLCAweDViLCAweGQzLAorCTB4MGEsIDB4YmUsIDB4NzcsIDB4ZDEsIDB4OGQsIDB4NWMsIDB4MDcsIDB4ZGQsIDB4NTQsIDB4YjEsIDB4YTUsIDB4MWIsCisJMHhjMiwgMHhhZSwgMHg2MiwgMHg5ZSwgMHg5YywgMHhlOCwgMHhhMiwgMHhlYiwgMHhhYiwgMHg0ZCwgMHg0NCwgMHhiZCwKKwkweDZkLCAweDIyLCAweGY2LCAweDdiLCAweDIzLCAweDk3LCAweGM3LCAweGYzLCAweDg3LCAweGE1LCAweGRmLCAweGE1LAorCTB4ODIsIDB4MjMsIDB4MzcsIDB4M2MsIDB4NzAsIDB4ZTQsIDB4M2QsIDB4ODEsIDB4MjMsIDB4ZWYsIDB4NmQsIDB4ODEsCisJMHgyMywgMHg3YiwgMHg5NSwgMHgyZCwgMHhkMSwgMHg0NiwgMHhjZCwgMHgwYSwgMHgzZiwgMHg1ZSwgMHg2MywgMHhmYywKKwkweDc4LCAweDgxLCAweGYxLCAweGUzLCAweDUwLCAweDAzLCAweGZjLCAweDMwLCAweDZhLCAweGYwLCAweGUzLCAweGIwLAorCTB4YzAsIDB4OGYsIDB4OWYsIDB4NmQsIDB4OGEsIDB4MWYsIDB4ODcsIDB4ZmMsIDB4OWIsIDB4ZjksIDB4ODIsIDB4MzQsCisJMHg2ZSwgMHgwZSwgMHhkMCwgMHg0YSwgMHhjZSwgMHhhMSwgMHhkNSwgMHg0NSwgMHg5YiwgMHgyZCwgMHg3YiwgMHhkOCwKKwkweGU2LCAweDg4LCAweDE5LCAweGNlLCAweDg4LCAweDdhLCAweDk3LCAweDgyLCAweGMwLCAweDJiLCAweDk2LCAweGUzLAorCTB4MzMsIDB4YTgsIDB4NjksIDB4YWEsIDB4ZGIsIDB4MDMsIDB4MTIsIDB4ZWYsIDB4YTUsIDB4MTQsIDB4ZjAsIDB4OTcsCisJMHg3YiwgMHgxMiwgMHhjYiwgMHhhYywgMHg5ZiwgMHhmOSwgMHg3MywgMHhkZSwgMHhjNywgMHgyYiwgMHg2YiwgMHg4MSwKKwkweDAwLCAweDdlLCAweGYzLCAweGNmLCAweDA0LCAweDY5LCAweDYzLCAweDhkLCAweGVkLCAweDU0LCAweGM2LCAweGIxLAorCTB4YWIsIDB4YjksIDB4MjEsIDB4YmEsIDB4OTIsIDB4MWIsIDB4YTAsIDB4OGQsIDB4ZGMsIDB4MzAsIDB4YmQsIDB4OTMsCisJMHhjMywgMHgzMywgMHgwMCwgMHg3MywgMHgzZSwgMHgxNiwgMHgzMCwgMHgzNywgMHhlOCwgMHg2MCwgMHg5MCwgMHhjNywKKwkweGFjLCAweDBlLCAweGQwLCAweGZhLCAweGFhLCAweGM2LCAweDU3LCAweGUwLCAweDJhLCAweGY2LCAweDNmLCAweGQyLAorCTB4MjMsIDB4ZWIsIDB4ZDAsIDB4ZWEsIDB4NzEsIDB4MjAsIDB4NTYsIDB4ODUsIDB4MDMsIDB4ZjIsIDB4MWEsIDB4ZWMsCisJMHhmZCwgMHg0MiwgMHg3ZCwgMHgwZCwgMHg2ZCwgMHhhYiwgMHgzOSwgMHg4MywgMHgxYywgMHhiOCwgMHgzNiwgMHhiNiwKKwkweGM5LCAweDZkLCAweGUxLCAweDczLCAweDNkLCAweGU4LCAweDg3LCAweDRlLCAweDZiLCAweGRjLCAweDRkLCAweDVkLAorCTB4YmMsIDB4MDcsIDB4MGUsIDB4ZjIsIDB4ODcsIDB4ODYsIDB4NTksIDB4M2YsIDB4ZWQsIDB4MTYsIDB4ZmEsIDB4NjgsCisJMHhkNCwgMHgwOSwgMHg4NCwgMHg2MiwgMHg1NCwgMHgzYSwgMHg2YiwgMHgzOCwgMHhlOCwgMHg5MywgMHhmOCwgMHgwOCwKKwkweGRmLCAweGNmLCAweDUwLCAweDdlLCAweDllLCAweDRlLCAweDE3LCAweDNlLCAweGQ1LCAweGVhLCAweDllLCAweDg4LAorCTB4ZDEsIDB4OWUsIDB4ZTAsIDB4MzksIDB4NDMsIDB4NGUsIDB4NTYsIDB4ZTIsIDB4MjIsIDB4NTQsIDB4OGUsIDB4OGIsCisJMHhiNCwgMHhmMiwgMHhiYSwgMHgyNSwgMHgyZCwgMHhjZCwgMHgzOSwgMHgzYywgMHhhZSwgMHhjOCwgMHhlMywgMHg4YSwKKwkweDg4LCAweGE5LCAweGYxLCAweGY5LCAweDU1LCAweGM0LCAweDczLCAweDg3LCAweDY4LCAweDYzLCAweDExLCAweDM0LAorCTB4MDcsIDB4ZmYsIDB4NDQsIDB4MjUsIDB4ODYsIDB4YmEsIDB4YjEsIDB4ODYsIDB4ZjMsIDB4ZjAsIDB4NTEsIDB4NTQsCisJMHg2MiwgMHhhOCwgMHgxYiwgMHgyYSwgMHg4NiwgMHhiYSwgMHhiMSwgMHgzNiwgMHgyZCwgMHhmOCwgMHhmMCwgMHg0MiwKKwkweDhlLCAweDc5LCAweDQwLCAweGNlLCAweGFmLCAweGYyLCAweDA3LCAweGY3LCAweGE5LCAweDc3LCAweGY2LCAweDljLAorCTB4MTAsIDB4M2UsIDB4ZTQsIDB4MWUsIDB4NjcsIDB4NzMsIDB4MTgsIDB4MWUsIDB4YWMsIDB4ODMsIDB4ZTEsIDB4YjQsCisJMHhkMCwgMHg4MywgMHhlMiwgMHg3YywgMHhjZiwgMHg1OCwgMHhlZSwgMHgwNCwgMHhjMywgMHg3MywgMHg5NiwgMHg2OSwKKwkweDY5LCAweGI3LCAweGEyLCAweDI1LCAweDFkLCAweDkzLCAweGVkLCAweDI2LCAweGY1LCAweGZlLCAweDFmLCAweGExLAorCTB4ZWIsIDB4NGIsIDB4ZmUsIDB4MzMsIDB4NTQsIDB4YzMsIDB4N2YsIDB4MjgsIDB4MTAsIDB4MWQsIDB4OTcsIDB4ZDcsCisJMHhhNywgMHg4YiwgMHhhZiwgMHgwYywgMHg2YiwgMHhmZiwgMHg1YiwgMHg5YSwgMHhlZiwgMHhiYiwgMHg5MCwgMHhkYiwKKwkweDQ5LCAweDRjLCAweDk3LCAweGU1LCAweGE2LCAweDY3LCAweGNlLCAweGUwLCAweDc2LCAweDlmLCAweGFkLCAweDcxLAorCTB4ZTEsIDB4YzQsIDB4NmQsIDB4ZTAsIDB4OTMsIDB4YmMsIDB4NDcsIDB4MDUsIDB4OWYsIDB4ZmUsIDB4NzcsIDB4MTYsCisJMHhjMCwgMHhiMiwgMHg5MywgMHgwNSwgMHg5OCwgMHg1NywgMHg4NCwgMHg4MCwgMHhmNSwgMHgwMywgMHgwMywgMHhiNCwKKwkweDhlLCAweDM5LCAweDAwLCAweDFlLCAweDUzLCAweDY4LCAweDAyLCAweGU2LCAweDE5LCAweGE3LCAweGY1LCAweDQwLAorCTB4ZmIsIDB4ZmIsIDB4OTUsIDB4YzEsIDB4ZWIsIDB4NWQsIDB4MWIsIDB4YTAsIDB4NjcsIDB4NGYsIDB4MmQsIDB4ZWEsCisJMHg3OSwgMHgyYywgMHgwNywgMHhjYSwgMHhhMywgMHg0ZSwgMHgyYSwgMHgwYywgMHgyNCwgMHhlNiwgMHgyNywgMHg5MCwKKwkweGZmLCAweDgwLCAweGZlLCAweDAwLCAweGY5LCAweDExLCAweDk4LCAweDlmLCAweDljLCAweDgxLCAweDcyLCAweGEwLAorCTB4MzUsIDB4NTMsIDB4Y2QsIDB4NmIsIDB4NDAsIDB4ZmEsIDB4NDAsIDB4NjEsIDB4MDgsIDB4MmEsIDB4NTMsIDB4NDEsCisJMHg2MywgMHgxZCwgMHg0MCwgMHhmNiwgMHgxMiwgMHgyMSwgMHg2OCwgMHhkOCwgMHgwMSwgMHg2OSwgMHgyMCwgMHhiYiwKKwkweDc5LCAweDhhLCAweDA4LCAweDk4LCAweDlmLCAweDE0LCAweDIwLCAweGM0LCAweGQwLCAweDAwLCAweGNmLCAweDRmLAorCTB4ZWMsIDB4NDAsIDB4OTcsIDB4YzIsIDB4ZGMsIDB4ZjQsIDB4ZmYsIDB4ZmYsIDB4MzEsIDB4MTUsIDB4MTYsIDB4NjAsCisJMHhkYSwgMHgwMywgMHhhZCwgMHhmOSwgMHhmYywgMHhmZCwgMHhmZiwgMHg4MCwgMHgwOCwgMHgwYiwgMHg0MywgMHgwYiwKKwkweDdjLCAweGVkLCAweDllLCAweGIwLCAweDNjLCAweGE4LCAweDljLCAweDViLCAweDAwLCAweDY0LCAweGI1LCAweGMxLAorCTB4ZWIsIDB4NmQsIDB4MTYsIDB4ZjAsIDB4N2QsIDB4YzQsIDB4MGIsIDB4MTgsIDB4N2UsIDB4MDEsIDB4Y2IsIDB4OTUsCisJMHhmZiwgMHhmZiwgMHg5NywgMHhjMiwgMHhkNSwgMHg4MiwgMHgwMCwgMHgwMCwgMHhkNCwgMHhjMiwgMHhjYiwgMHg0MiwKKwkweDYwLCAweDdjLCAweDAwLCAweDAwLCAweDAwIH07CitzdGF0aWMgdTMyIGJueDJfQ09NX2IwOUZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX0NPTV9iMDlGd1JvZGF0YVsoMHg4OC80KSArIDFdID0geworCTB4MDgwMDFhZDgsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsCisJMHgwODAwMWEyNCwgMHgwODAwMWIxNCwgMHgwODAwMWE5OCwgMHgwODAwMWIxNCwgMHgwODAwMTlhYywgMHgwODAwMWIxNCwKKwkweDA4MDAxYjE0LCAweDA4MDAxYjE0LCAweDA4MDAxOWI4LCAweDAsIDB4MDgwMDJhMmMsIDB4MDgwMDJhN2MsCisJMHgwODAwMmFhYywgMHgwODAwMmFkYywgMHgwODAwMmIwYywgMHgwLCAweDA4MDA1ZmFjLCAweDA4MDA1ZmFjLAorCTB4MDgwMDVmYWMsIDB4MDgwMDVmYWMsIDB4MDgwMDVmYWMsIDB4MDgwMDVmZDgsIDB4MDgwMDVmZDgsIDB4MDgwMDYwMTgsCisJMHgwODAwNjAyNCwgMHgwODAwNjAyNCwgMHgwODAwNWZhYywgMHgwLCAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DT01fYjA5RndCc3NbKDB4ODgvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfQ09NX2IwOUZ3U2Jzc1soMHg1Yy80KSArIDFdID0geyAweDAgfTsKKworc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfY29tX2Z3XzA5ID0geworCS52ZXJfbWFqb3IJCQk9IDB4MSwKKwkudmVyX21pbm9yCQkJPSAweDAsCisJLnZlcl9maXgJCQk9IDB4MCwKKworCS5zdGFydF9hZGRyCQkJPSAweDA4MDAwMGIwLAorCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKKwkudGV4dF9sZW4JCQk9IDB4N2M1YywKKwkudGV4dF9pbmRleAkJCT0gMHgwLAorCS5nel90ZXh0CQkJPSBibngyX0NPTV9iMDlGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9DT01fYjA5RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDdkMDAsCisJLmRhdGFfbGVuCQkJPSAweDAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfQ09NX2IwOUZ3RGF0YSwKKworCS5zYnNzX2FkZHIJCQk9IDB4MDgwMDdkMDAsCisJLnNic3NfbGVuCQkJPSAweDVjLAorCS5zYnNzX2luZGV4CQkJPSAweDAsCisJLnNic3MJCQkJPSBibngyX0NPTV9iMDlGd1Nic3MsCisKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDdkNjAsCisJLmJzc19sZW4JCQk9IDB4ODgsCisJLmJzc19pbmRleAkJCT0gMHgwLAorCS5ic3MJCQkJPSBibngyX0NPTV9iMDlGd0JzcywKKworCS5yb2RhdGFfYWRkcgkJCT0gMHgwODAwN2M2MCwKKwkucm9kYXRhX2xlbgkJCT0gMHg4OCwKKwkucm9kYXRhX2luZGV4CQkJPSAweDAsCisJLnJvZGF0YQkJCQk9IGJueDJfQ09NX2IwOUZ3Um9kYXRhLAorfTsKKworc3RhdGljIHU4IGJueDJfQ1BfYjA5RndUZXh0W10gPSB7CisJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHg4ZSwgMHhmYywgMHgyZiwgMHg0NSwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKKwkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGJkLCAweDdkLCAweDBkLCAweDc0LAorCTB4NWMsIDB4NTcsIDB4N2QsIDB4ZTcsIDB4ZmYsIDB4ZGQsIDB4NzksIDB4OTIsIDB4YzYsIDB4YjIsIDB4MmMsIDB4M2YsCisJMHhjYiwgMHg2MywgMHg2NSwgMHgyMiwgMHgwYiwgMHg3YiwgMHg0NiwgMHg3YSwgMHhiMiwgMHg5NSwgMHg1OCwgMHg2NCwKKwkweGM3LCAweGFlLCAweDAwLCAweDZkLCAweDNiLCAweDg1LCAweGU5LCAweDQ4LCAweGIyLCAweDlkLCAweDBmLCAweDhhLAorCTB4NGMsIDB4NDQsIDB4NGYsIDB4NWEsIDB4ZTgsIDB4MjIsIDB4YzYsIDB4NzYsIDB4NDgsIDB4ODAsIDB4YjIsIDB4NGUsCisJMHgwOSwgMHg2OSwgMHg4MCwgMHgwNCwgMHgwZiwgMHgyMywgMHhmOSwgMHg4MywgMHg3NCwgMHhlYywgMHg1MSwgMHgxMiwKKwkweGM1LCAweDc2LCAweDRmLCAweDczLCAweDU4LCAweDU1LCAweDkyLCAweDFkLCAweDQzLCAweGE3LCAweDFlLCAweDI3LAorCTB4NzEsIDB4NjgsIDB4ZjYsIDB4NmMsIDB4NjgsIDB4YjQsIDB4NGEsIDB4ZTIsIDB4YTYsIDB4M2QsIDB4ZDksIDB4ZDYsCisJMHhmNCwgMHg4NCwgMHg2ZSwgMHhkYSwgMHg0MywgMHg3NywgMHg4NSwgMHg3MSwgMHg4OCwgMHg0YiwgMHhiMywgMHg0YiwKKwkweGY4LCAweDY4LCAweDYxLCAweGExLCAweGU1LCAweGVkLCAweGVmLCAweDc3LCAweGVmLCAweDdkLCAweGQyLCAweGU4LAorCTB4YzMsIDB4MDksIDB4YTEsIDB4YmIsIDB4ZjUsIDB4MzksIDB4Y2YsIDB4NmYsIDB4ZGUsIDB4ZmQsIDB4ZmMsIDB4ZGYsCisJMHhmZiwgMHhmZCwgMHg3ZiwgMHhkZiwgMHgwZiwgMHhhZCwgMHgxNywgMHhhOSwgMHgxNywgMHhmYiwgMHg2ZiwgMHgxNSwKKwkweDllLCAweDZkLCAweDg5LCAweDdkLCAweGJiLCAweGI3LCAweDVlLCAweGQ3LCAweDczLCAweDFkLCAweDdlLCAweDZlLAorCTB4NzUsIDB4NTcsIDB4NDYsIDB4OTUsIDB4YmMsIDB4ODksIDB4N2YsIDB4ODksIDB4OWYsIDB4YTEsIDB4NGMsIDB4NDQsCisJMHhjNCwgMHgwYiwgMHhmYiwgMHhlMiwgMHgyMywgMHg1MSwgMHg5NSwgMHgxZSwgMHhmYywgMHg2NCwgMHhkNiwgMHg5NywKKwkweDY4LCAweDI0LCAweDdkLCAweGY2LCAweGIzLCAweGJiLCAweDdkLCAweDkxLCAweDRjLCAweDc5LCAweDRiLCAweGEyLAorCTB4NTcsIDB4ZmUsIDB4MjUsIDB4YzgsIDB4YzcsIDB4NWMsIDB4NjEsIDB4ZmEsIDB4NWIsIDB4ZDIsIDB4ZmYsIDB4ZmMsCisJMHg5ZiwgMHhiZSwgMHhmMiwgMHg4ZSwgMHhlNCwgMHg2YiwgMHhlMywgMHgxMSwgMHg4OSwgMHg3YSwgMHhlOSwgMHg4ZiwKKwkweDg5LCAweGI3LCAweDQ5LCAweGEyLCAweGFkLCAweGU5LCAweDgxLCAweDRmLCAweDNlLCAweGJjLCAweGY5LCAweDZmLAorCTB4NDQsIDB4MWEsIDB4YzMsIDB4YjYsIDB4MmUsIDB4MDcsIDB4NWYsIDB4ZDksIDB4MmMsIDB4ZjksIDB4OTYsIDB4NzQsCisJMHg3YywgMHhjOCwgMHg0ZCwgMHg3YiwgMHhmMiwgMHg3NCwgMHg0NSwgMHgwNiwgMHgwYSwgMHhjNSwgMHhhOCwgMHg0NCwKKwkweGQyLCAweDFkLCAweDJmLCAweGY1LCAweDQ2LCAweGY2LCAweDA3LCAweDExLCAweGRmLCAweGY3LCAweDdhLCAweGE1LAorCTB4YTEsIDB4MjcsIDB4ZGIsIDB4OGQsIDB4ZjQsIDB4ZjIsIDB4NTYsIDB4NTEsIDB4N2UsIDB4NTQsIDB4YjIsIDB4MTUsCisJMHg2OSwgMHg1MCwgMHhiZSwgMHg4ZiwgMHg3NywgMHhiZCwgMHhhOCwgMHg3NCwgMHhkMiwgMHhjYiwgMHg0NiwgMHg1YywKKwkweDI5LCAweDU0LCAweDJlLCAweGFjLCAweDMwLCAweDZkLCAweDk2LCAweGVjLCAweGZiLCAweDZmLCAweGEyLCAweGU2LAorCTB4OGQsIDB4MzYsIDB4NGIsIDB4NTEsIDB4OTksIDB4OGQsIDB4YzQsIDB4MDUsIDB4ZmQsIDB4MDAsIDB4ZTYsIDB4MDYsCisJMHgxOSwgMHgyZSwgMHgyNSwgMHgyNCwgMHg1YiwgMHg2NCwgMHhiZiwgMHhhZSwgMHhlNCwgMHgzYywgMHhmNiwgMHhkOSwKKwkweDgwLCAweGZhLCAweDJiLCAweDlkLCAweGU1LCAweGNiLCAweGIzLCAweGVjLCAweDRiLCAweDI4LCAweDliLCAweDQwLAorCTB4YjksIDB4NTYsIDB4NzksIDB4YmMsIDB4MTIsIDB4OTcsIDB4YzcsIDB4MmEsIDB4MzEsIDB4NzksIDB4YjQsIDB4NzIsCisJMHg4NywgMHg2NCwgMHg1MCwgMHhmNywgMHg2YywgMHgwNSwgMHg3ZCwgMHg5NywgMHg2YSwgMHhhNSwgMHg3NywgMHhhYywKKwkweDVlLCAweGIyLCAweDYzLCAweGVkLCAweGYxLCAweDljLCAweDA0LCAweGMxLCAweDI3LCAweDUyLCAweDFmLCAweDk1LAorCTB4YTEsIDB4MjYsIDB4OTQsIDB4MmYsIDB4MzEsIDB4MmYsIDB4YmUsIDB4MjAsIDB4MmYsIDB4OTcsIDB4ZGEsIDB4ZTIsCisJMHhlNSwgMHg5NCwgMHgyMywgMHg5OSwgMHhjMSwgMHg2NCwgMHg3YywgMHg0OCwgMHhmMSwgMHhiYiwgMHg0NiwgMHhiMiwKKwkweDVkLCAweGY4LCAweDFlLCAweDcwLCAweDI1LCAweGUyLCAweDA3LCAweGMxLCAweDFkLCAweGE5LCAweDI2LCAweGMwLAorCTB4OTEsIDB4NGMsIDB4MjQsIDB4MTQsIDB4ZWIsIDB4YjIsIDB4NWUsIDB4MzIsIDB4OWYsIDB4NTAsIDB4NTEsIDB4YzksCisJMHg1NywgMHhhZSwgMHg5MywgMHg0NCwgMHg1MywgMHgxMCwgMHhiYywgMHgzNywgMHhlNSwgMHgyMSwgMHg1ZCwgMHhhNCwKKwkweGI3LCAweDI4LCAweGZiLCAweDU0LCAweGRhLCAweDQ3LCAweDliLCAweDkyLCAweDUyLCAweGU5LCAweGI1LCAweDE4LAorCTB4YzcsIDB4MTYsIDB4ZTAsIDB4YTksIDB4NTYsIDB4MzIsIDB4MzEsIDB4YzksIDB4YTgsIDB4YjQsIDB4MjQsIDB4NTQsCisJMHg3YSwgMHgwNSwgMHhkMiwgMHgxYywgMHhhOSwgMHhmMSwgMHhhNywgMHgyYywgMHg5ZCwgMHhhYywgMHhjNiwgMHhiNywKKwkweDBjLCAweGE4LCAweDc0LCAweGQzLCAweGEyLCAweGY0LCAweDY0LCAweDQyLCAweGQ0LCAweDhmLCAweGVhLCAweGQwLAorCTB4NjcsIDB4NjcsIDB4NDYsIDB4MzEsIDB4MGQsIDB4NmYsIDB4OWQsIDB4NzYsIDB4ZmQsIDB4MzIsIDB4NjksIDB4MWYsCisJMHg3NCwgMHgxNiwgMHhhNiwgMHgzZCwgMHhiNSwgMHg4YSwgMHhiMCwgMHg4YSwgMHhlMiwgMHhlZiwgMHgyOCwgMHhlMCwKKwkweDZhLCAweDQxLCAweGZmLCAweGVkLCAweDVlLCAweDBkLCAweGM2LCAweDM1LCAweDkwLCAweDRhLCAweDdhLCAweGZkLAorCTB4ZWEsIDB4YzUsIDB4NDAsIDB4OWEsIDB4MDksIDB4MzMsIDB4ZjMsIDB4MTQsIDB4ZjIsIDB4NTAsIDB4MzQsIDB4OWQsCisJMHhjMiwgMHhiYywgMHhiOSwgMHg3MiwgMHgwOCwgMHg2MywgMHhiYiwgMHgzOCwgMHg5NiwgMHhmNCwgMHhkYSwgMHgxNCwKKwkweGRlLCAweDUzLCAweGZjLCAweGRkLCAweDM0LCAweDE0LCAweDQ5LCAweDA3LCAweDQxLCAweDM2LCAweDM1LCAweDJlLAorCTB4YjksIDB4NzIsIDB4ZDIsIDB4OWIsIDB4MDUsIDB4NzAsIDB4YmQsIDB4NjMsIDB4NzEsIDB4OGMsIDB4MWYsIDB4ZTMsCisJMHg4OCwgMHg2NSwgMHg5MiwgMHg2YiwgMHhhNCwgMHhjYiwgMHhjZSwgMHhjZiwgMHg1ZiwgMHhhMiwgMHhlZiwgMHg3NiwKKwkweGVmLCAweDBlLCAweGQ1LCAweGVlLCAweGE1LCAweDU0LCAweGQyLCAweDliLCAweDkwLCAweDNmLCAweGM0LCAweDc3LAorCTB4MTAsIDB4ZWMsIDB4NGEsIDB4MjUsIDB4ZTMsIDB4NzksIDB4Y2MsIDB4ZGQsIDB4YTUsIDB4NjIsIDB4NGMsIDB4NWUsCisJMHgyZSwgMHgyNiwgMHg0MSwgMHhhOSwgMHhjOSwgMHhjZSwgMHg0OSwgMHhkOSwgMHg5MiwgMHg5YSwgMHgwNCwgMHhkYywKKwkweDA1LCAweDNjLCAweDA3LCAweDk5LCAweDU3LCAweDQ2LCAweDVlLCAweDk5LCAweDc1LCAweDgzLCAweGUwLCAweGU2LAorCTB4ZDQsIDB4ODksIDB4NjAsIDB4YTgsIDB4ZDksIDB4ZDAsIDB4ZmUsIDB4ZDMsIDB4MjUsIDB4Y2MsIDB4MmIsIDB4ZTYsCisJMHhlOSwgMHhiMSwgMHgxMiwgMHhlNiwgMHhiNSwgMHg4NCwgMHgzOSwgMHhkNSwgMHhmMywgMHhkZiwgMHg4OSwgMHhmOSwKKwkweDI3LCAweDhkLCAweDkwLCAweDNlLCAweGI2LCAweDU5LCAweDdhLCAweDdkLCAweGI3LCAweDdkLCAweDhiLCAweDY0LAorCTB4NGIsIDB4OGUsIDB4NjQsIDB4NTMsIDB4M2YsIDB4MDksIDB4MzIsIDB4OWEsIDB4MjcsIDB4YzQsIDB4ZTksIDB4MmQsCisJMHg5MSwgMHgyNiwgMHg2YiwgMHgwMCwgMHgyYiwgMHgzZiwgMHg3ZiwgMHhkZCwgMHg5NiwgMHg4YiwgMHgzYSwgMHgxOCwKKwkweDA2LCAweGU3LCAweDgzLCAweGY5LCAweDUxLCAweGU1LCAweGQ3LCAweGQ5LCAweGZjLCAweDkwLCAweGY2LCAweGY5LAorCTB4MGYsIDB4NzQsIDB4ZTcsIDB4Y2YsIDB4OTcsIDB4Y2IsIDB4OTIsIDB4MzYsIDB4MmIsIDB4MjIsIDB4YjksIDB4MDcsCisJMHgwMywgMHhlOSwgMHg0ZCwgMHgwMSwgMHg1ZiwgMHg2YywgMHhkMywgMHg0YiwgMHg4OSwgMHhhZSwgMHhlYiwgMHhiMSwKKwkweDhjLCAweDJlLCAweDhiLCAweDdmLCAweDNmLCAweGFlLCAweDQxLCAweDFmLCAweDRlLCAweDVmLCAweDY5LCAweGJlLAorCTB4NmUsIDB4NWYsIDB4ZTksIDB4ODUsIDB4OTgsIDB4ODUsIDB4MGYsIDB4ZGYsIDB4M2QsIDB4NGUsIDB4YjYsIDB4ZjIsCisJMHg3NywgMHg3NiwgMHg4ZSwgMHhjMywgMHg3MSwgMHg3NCwgMHgyZCwgMHg0MywgMHhlMywgMHgyZSwgMHhmOCwgMHhjMSwKKwkweDkzLCAweDVjLCAweGIxLCAweDA3LCAweGZkLCAweGM2LCAweGYwLCAweDBlLCAweDgyLCAweDkxLCAweDU0LCAweDI2LAorCTB4ZTksIDB4NGEsIDB4MWEsIDB4ZGYsIDB4MDMsIDB4OTgsIDB4YWYsIDB4MGUsIDB4ZTAsIDB4NGYsIDB4ZGMsIDB4ZWMsCisJMHhlNiwgMHg5NCwgMHhmNCwgMHg1NSwgMHg0MCwgMHg3YiwgMHg5NSwgMHgzNywgMHg5NiwgMHgxNCwgMHg3YSwgMHgwYywKKwkweGE5LCAweDdmLCAweGIxLCAweGI4LCAweDYxLCAweDNmLCAweDdjLCAweGJiLCAweDMyLCAweDAyLCAweGZhLCAweDI4LAorCTB4OGMsIDB4ZjksIDB4MzIsIDB4NWMsIDB4OWMsIDB4ZjYsIDB4OTQsIDB4MjQsIDB4NDEsIDB4YmIsIDB4NjksIDB4ZTksCisJMHhhZCwgMHhmOCwgMHg1MiwgMHgyOCwgMHhlMiwgMHg1ZCwgMHg2YSwgMHgwNywgMHhmZCwgMHhiYSwgMHg5MiwgMHg4OSwKKwkweDliLCAweDM5LCAweDI5LCAweDE0LCAweDdmLCAweDA5LCAweGUzLCAweDAyLCAweDhlLCAweDdkLCAweGZlLCAweGVlLAorCTB4YjEsIDB4YjAsIDB4ODAsIDB4ZjcsIDB4YmIsIDB4NTMsIDB4MWEsIDB4M2YsIDB4NmYsIDB4MGUsIDB4MDYsIDB4ZjYsCisJMHg4ZCwgMHgzMSwgMHg2MCwgMHg5YywgMHg4NSwgMHhiMiwgMHg4YiwgMHg3NywgMHgwYywgMHhlZiwgMHg5MCwgMHgxNiwKKwkweGUzLCAweDgwLCAweGE5LCAweDU1LCAweDg2LCAweDQxLCAweDhiLCAweGJkLCAweDgyLCAweGRmLCAweDUzLCAweDg0LAorCTB4OTEsIDB4ZmQsIDB4YjYsIDB4ZTgsIDB4ZGYsIDB4YzMsIDB4NjMsIDB4MWIsIDB4ZjQsIDB4NzcsIDB4NmUsIDB4YTAsCisJMHg0NSwgMHhmMiwgMHg1MywgMHhlMSwgMHg1OCwgMHgyOCwgMHgwZiwgMHgyOCwgMHgwMywgMHg5MiwgMHg4NywgMHg0NSwKKwkweDI4LCAweDEzLCAweDgyLCAweGUwLCAweGMxLCAweDE0LCAweGU1LCAweDQyLCAweDEwLCAweDNjLCAweDk2LCAweGEyLAorCTB4OWMsIDB4MzgsIDB4MDcsIDB4ZmUsIDB4YTcsIDB4NmMsIDB4MjAsIDB4YWYsIDB4YWUsIDB4NTUsIDB4OWMsIDB4ODMsCisJMHg2YywgMHgxMSwgMHg3ZCwgMHg0MCwgMHg0ZSwgMHhlNCwgMHhiYSwgMHg0ZSwgMHg0MCwgMHg2ZSwgMHg1MCwgMHhhZSwKKwkweDVjLCAweGY4LCAweDQ0LCAweGQ2LCAweGNmLCAweGM3LCAweDIzLCAweDFhLCAweDBmLCAweDk4LCAweDZmLCAweGM4LAorCTB4YmMsIDB4OGMsIDB4ODYsIDB4YmMsIDB4NGQsIDB4MGEsIDB4NWQsIDB4YTMsIDB4YjYsIDB4Y2MsIDB4NjUsIDB4NWQsCisJMHhjNiwgMHg1ZCwgMHg1MiwgMHhlNiwgMHg3NiwgMHg2NSwgMHhmOCwgMHhhZSwgMHgxNSwgMHhmMywgMHhiMSwgMHg0MiwKKwkweDExLCAweDRmLCAweDZkLCAweDliLCAweGY4LCAweDJkLCAweGQxLCAweDlhLCAweGY0LCAweDk3LCAweDkwLCAweDM3LAorCTB4N2QsIDB4ZDcsIDB4NDksIDB4N2YsIDB4YjksIDB4YmMsIDB4NTksIDB4NzcsIDB4NjksIDB4ZGUsIDB4ODgsIDB4YjgsCisJMHg3ZSwgMHhiMiwgMHg3MywgMHg5NywgMHg5YSwgMHgwMSwgMHgzZCwgMHgwNSwgMHhjMSwgMHhjOSwgMHg1NCwgMHg5OCwKKwkweGZlLCAweDhmLCAweGVlLCAweGQyLCAweDNlLCAweDEyLCAweDM1LCAweDRiLCAweGQzLCAweGVlLCAweDVkLCAweDI2LAorCTB4ZWQsIDB4YzQsIDB4MzIsIDB4NjksIDB4MWIsIDB4NmEsIDB4OTcsIDB4YTYsIDB4YmQsIDB4N2YsIDB4OTksIDB4YjQsCisJMHhmYiwgMHg5NywgMHg0OSwgMHhmYiwgMHg1ZiwgMHhjYiwgMHhhNCwgMHg3ZCwgMHg2NywgMHg5OSwgMHhiNCwgMHhlZiwKKwkweDJkLCAweDkzLCAweGQ2LCAweDUyLCAweGI3LCAweDM0LCAweGNkLCAweDA1LCAweDNmLCAweDZkLCAweDkyLCAweDQyLAorCTB4ZWMsIDB4NzMsIDB4MWMsIDB4YmIsIDB4YzUsIDB4Y2QsIDB4ZmUsIDB4YzgsIDB4NTIsIDB4ZGMsIDB4ZDQsIDB4YTAsCisJMHg1YywgMHhlYiwgMHhhMiwgMHg3MiwgMHg1MywgMHhjYiwgMHg5NCwgMHhhYiwgMHg0NSwgMHhiOSwgMHhhNiwgMHg0NSwKKwkweGU1LCAweDkyLCAweGNiLCAweGUwLCAweGJhLCAweDRlLCAweGViLCAweGFmLCAweDg1LCAweGU1LCAweDBhLCAweGNiLAorCTB4OTQsIDB4NjMsIDB4ZmEsIDB4MWUsIDB4ZGIsIDB4Y2YsIDB4MTYsIDB4NjgsIDB4OTksIDB4ZDcsIDB4OWIsIDB4YWYsCisJMHg1YSwgMHg5MSwgMHg2NiwgMHhhNiwgMHhiNywgMHg0MiwgMHg0NywgMHhhYywgMHg1MCwgMHg4NiwgMHhkZiwgMHgyOSwKKwkweDViLCAweDk4LCAweGU2LCAweDgxLCAweGVlLCAweGEzLCAweGEwLCAweDNiLCAweGNhLCAweDQ3LCAweGYwLCAweDkxLAorCTB4NGYsIDB4ZmUsIDB4NWQsIDB4MjUsIDB4NDMsIDB4YjEsIDB4MmQsIDB4ZGUsIDB4MmYsIDB4YTgsIDB4MDYsIDB4ZDAsCisJMHg1OCwgMHhkMiwgMHg0YiwgMHgyOCwgMHhmMiwgMHg5NywgMHhlNCwgMHgyMywgMHg2OSwgMHgzZiwgMHhkZiwgMHgyYiwKKwkweDJhLCAweGE2LCAweDI0LCAweDkwLCAweGJlLCAweDk0LCAweDZhLCAweDUyLCAweGIyLCAweDFmLCAweGZjLCAweDkzLAorCTB4ODEsIDB4NGUsIDB4ZGEsIDB4MTUsIDB4ZjQsIDB4NmEsIDB4MWUsIDB4MzIsIDB4NjUsIDB4YWYsIDB4MmMsIDB4MmIsCisJMHg3ZCwgMHgzOSwgMHg0OCwgMHgxOSwgMHg5NywgMHhjZSwgMHhkYywgMHg5NSwgMHhmNSwgMHhhNywgMHg3YiwgMHg2YSwKKwkweDQxLCAweGIzLCAweDE3LCAweDUxLCAweDY3LCAweDA3LCAweDZhLCAweGVlLCAweDJkLCAweGJiLCAweGQyLCAweDU3LAorCTB4ZWUsIDB4MDQsIDB4MmYsIDB4MzgsIDB4NzIsIDB4ZGUsIDB4NWYsIDB4MmQsIDB4ZTcsIDB4NTMsIDB4MjgsIDB4NWIsCisJMHg4OSwgMHhjOCwgMHg0YywgMHhjYywgMHg5MSwgMHgxOSwgMHg3YywgMHg2NywgMHg1MywgMHhjOCwgMHhhYiwgMHg4NCwKKwkweGJjLCAweGQ1LCAweDI5LCAweDA3LCAweDRhLCAweGJlLCAweDFjLCAweDJlLCAweGZkLCAweDkyLCAweDBhLCAweGY1LAorCTB4NTYsIDB4N2YsIDB4NmEsIDB4YTUsIDB4OWMsIDB4ZjYsIDB4NGMsIDB4ZGIsIDB4M2IsIDB4ZmMsIDB4NjksIDB4NjgsCisJMHg0YywgMHg1NywgMHgyZSwgMHhmYSwgMHhjOSwgMHhmOCwgMHg4YywgMHhlNiwgMHg4OSwgMHgxZiwgMHgwNiwgMHg3ZCwKKwkweDY4LCAweDY3LCAweGMyLCAweDRmLCAweDdhLCAweDdmLCAweDhhLCAweGVmLCAweGExLCAweDMyLCAweGVkLCAweDkwLAorCTB4ZjksIDB4YjYsIDB4ODYsIDB4ZDEsIDB4ZDYsIDB4YTEsIDB4ZDIsIDB4MmEsIDB4ZjksIDB4YjAsIDB4YWQsIDB4YmYsCisJMHhkZCwgMHg5ZiwgMHhlZSwgMHgwNCwgMHhjZiwgMHg3OSwgMHhhNywgMHgyOCwgMHgyMywgMHg4YSwgMHg4MCwgMHg2YiwKKwkweDEwLCAweGJjLCAweDhkLCAweGJhLCAweGNmLCAweDY5LCAweDM5LCAweDA1LCAweGJiLCAweGE1LCAweGI4LCAweDFhLAorCTB4NzIsIDB4ZjcsIDB4MWYsIDB4ODMsIDB4MGYsIDB4YzcsIDB4NTgsIDB4OWUsIDB4NjksIDB4ZDQsIDB4MjUsIDB4MzIsCisJMHhhYSwgMHhkMiwgMHg5MCwgMHgwOSwgMHhkZCwgMHg5NCwgMHg4NSwgMHgwOSwgMHhjOCwgMHg0MSwgMHhjOCwgMHg5NiwKKwkweGQyLCAweDRmLCAweDgzLCAweDhjLCAweDViLCAweDJkLCAweGRmLCAweDI0LCAweDNmLCAweDVmLCAweDg2LCAweDY5LAorCTB4MDksIDB4MjMsIDB4MmYsIDB4NGIsIDB4YjMsIDB4NzMsIDB4YjIsIDB4MjIsIDB4MGYsIDB4ZjksIDB4ZjIsIDB4NzQsCisJMHg4NSwgMHg3MiwgMHhlMSwgMHg3YSwgMHhmMCwgMHg2OCwgMHhhYiwgMHhmNCwgMHgxNSwgMHg5MywgMHhmOSwgMHg4YywKKwkweDZjLCAweGMyLCAweGZjLCAweDdkLCAweDFlLCAweDczLCAweGVhLCAweGUyLCAweGI5LCAweGFmLCAweDVlLCAweDFhLAorCTB4NTMsIDB4ZDAsIDB4Y2QsIDB4NGMsIDB4NDcsIDB4YTMsIDB4Y2QsIDB4NTEsIDB4YzgsIDB4YTgsIDB4ZGYsIDB4MDMsCisJMHgxZSwgMHg4NiwgMHgzOSwgMHhlNywgMHhmMSwgMHg2YywgMHhjNCwgMHgxOSwgMHhhMCwgMHgzZCwgMHgzMiwgMHg0MCwKKwkweGZkLCAweDUwLCAweDY2LCAweGRiLCAweDg0LCAweDM3LCAweDZlLCAweDdmLCAweDQ3LCAweGI1LCAweDhjLCAweDMxLAorCTB4YmYsIDB4MWIsIDB4ZjAsIDB4M2IsIDB4NjEsIDB4N2YsIDB4N2IsIDB4ZjgsIDB4ZWQsIDB4ZGIsIDB4ZGYsIDB4MzEsCisJMHhmYywgMHhlZSwgMHhiNCwgMHhiZiwgMHhhMSwgMHg1YiwgMHg4YiwgMHg1ZCwgMHhmYSwgMHhmNywgMHg0OCwgMHg2OSwKKwkweGZiLCAweDc2LCAweGU1LCAweDVmLCAweDI3LCAweGI5LCAweGE5LCAweDU2LCAweDM5LCAweDUwLCAweGY0LCAweGFkLAorCTB4NmMsIDB4YzEsIDB4MjMsIDB4NGYsIDB4M2EsIDB4NjYsIDB4OWMsIDB4ODAsIDB4OWIsIDB4YjIsIDB4YjMsIDB4OTQsCisJMHg3NywgMHgwNiwgMHgwOCwgMHgzZiwgMHg2OCwgMHhhMCwgMHhiNywgMHhiOCwgMHhjNSwgMHg1YiwgMHgyMywgMHhhNCwKKwkweDgxLCAweDExLCAweGE3LCAweGI3LCAweGUyLCAweDY0LCAweDYwLCAweGFmLCAweGM1LCAweDg3LCAweGU1LCAweDMwLAorCTB4N2UsIDB4OGIsIDB4MTcsIDB4NDksIDB4M2YsIDB4ODksIDB4YjcsIDB4YzEsIDB4MDEsIDB4ZjUsIDB4Y2UsIDB4NzAsCisJMHg4OSwgMHhmMiwgMHhkMiwgMHhjNywgMHhkOCwgMHgxMywgMHg3MiwgMHg2ZSwgMHg4MSwgMHgwZCwgMHg0NSwgMHg1YywKKwkweDI4LCAweGM5LCAweDhkLCAweDI1LCAweDRmLCAweGU0LCAweDI1LCAweDk5LCAweDFmLCAweDA3LCAweDQzLCAweGVjLAorCTB4NGEsIDB4YjksIDB4ZjIsIDB4ZGUsIDB4MTQsIDB4NjgsIDB4ZjcsIDB4M2EsIDB4NDcsIDB4YjYsIDB4NWYsIDB4ZTcsCisJMHhjMiwgMHhlNiwgMHhmMSwgMHhjNywgMHhiNywgMHg4MywgMHhmZSwgMHgzMSwgMHhjZiwgMHg5YSwgMHgxZSwgMHhkNCwKKwkweDE5LCAweDgxLCAweDlkLCAweDA4LCAweDZjLCAweDlmLCAweGU5LCAweGVhLCAweDFiLCAweDJlLCAweGU2LCAweDNlLAorCTB4YTYsIDB4ZDIsIDB4ZmIsIDB4M2UsIDB4OTUsIDB4ZWQsIDB4YmUsIDB4NDYsIDB4NzIsIDB4ODMsIDB4MGEsIDB4MzgsCisJMHg2YSwgMHgxZSwgMHg4MiwgMHgxZSwgMHhjNCwgMHhiOCwgMHg4MiwgMHgwMCwgMHhmNCwgMHgwYywgMHg3OSwgMHg3ZSwKKwkweGYzLCAweGNkLCAweDkxLCAweDc0LCAweDhkLCAweGY0LCAweDBlLCAweDM2LCAweGEzLCAweDBlLCAweGYzLCAweDg4LAorCTB4YWYsIDB4YWYsIDB4YTIsIDB4OWQsIDB4NjQsIDB4YTIsIDB4NGYsIDB4ZTQsIDB4OWUsIDB4OTEsIDB4ZWUsIDB4NTksCisJMHg2NywgMHg3OCwgMHhmNCwgMHgzNywgMHhjMCwgMHg5MywgMHg1YiwgMHg1MSwgMHhmZiwgMHgwMSwgMHhkNCwgMHg3ZiwKKwkweGNkLCAweDI5LCAweDhjLCAweGZkLCAweGM4LCAweDE5LCAweDFlLCAweGZiLCAweDllLCAweDMzLCAweDMyLCAweGI2LAorCTB4NjEsIDB4NDMsIDB4N2YsIDB4Y2YsIDB4ODYsIDB4MGQsIDB4YmIsIDB4N2IsIDB4NWMsIDB4OTksIDB4MDAsIDB4OGYsCisJMHg2NSwgMHhiYywgMHgwZCwgMHgxYiwgMHg0NiwgMHg3YSwgMHhiYSwgMHg4MCwgMHg4MywgMHgyZCwgMHg1ZSwgMHg5ZiwKKwkweGY4LCAweGRlLCAweDc2LCAweDAxLCAweGZmLCAweGM0LCAweGQ4LCAweDY3LCAweDE0LCAweGY5LCAweDQ5LCAweGU0LAorCTB4YjMsIDB4N2UsIDB4NWMsIDB4ZTcsIDB4ZjcsIDB4Y2EsIDB4OTYsIDB4NzgsIDB4OTMsIDB4YjAsIDB4ZmYsIDB4ODgsCisJMHgyZCwgMHg1MywgMHgxMywgMHg5MSwgMHhmYSwgMHgwNywgMHhlYywgMHhmYywgMHg2NiwgMHg5YywgMHgxYSwgMHg5ZiwKKwkweGU5LCAweDFjLCAweDBiLCAweGQzLCAweDM5LCAweGI3LCAweDdmLCAweDY3LCAweDZkLCAweGQ1LCAweGQ1LCAweDQ4LAorCTB4ZTcsIDB4MzcsIDB4NzEsIDB4NDYsIDB4YmMsIDB4ZDAsIDB4YzYsIDB4YTgsIDB4ZDEsIDB4YjYsIDB4NjEsIDB4YWUsCisJMHg0OCwgMHg5YSwgMHg3MSwgMHg2NSwgMHg0ZiwgMHhkMSwgMHg0MSwgMHgxZCwgMHhkMCwgMHhjNSwgMHgxOSwgMHhmYiwKKwkweDFjLCAweDA1LCAweDZjLCAweDgzLCAweDY4LCAweGViLCAweGU4LCAweDIxLCAweGQ0LCAweGEzLCAweGNjLCAweDQ4LAorCTB4NzYsIDB4OGEsIDB4ZmEsIDB4MDAsIDB4Y2EsIDB4NmMsIDB4ZjEsIDB4ZDYsIDB4MGEsIDB4NmQsIDB4ODksIDB4M2IsCisJMHgyNSwgMHg1NywgMHgyMiwgMHg3ZiwgMHg3NywgMHgwMCwgMHg5ZSwgMHhhOCwgMHgyNCwgMHg5YSwgMHhmMSwgMHg1ZCwKKwkweDgxLCAweDRkLCAweGYxLCAweDYwLCAweDhkLCAweDU4LCAweGRiLCAweDQ1LCAweGU2LCAweDZkLCAweDkxLCAweDNiLAorCTB4OTQsIDB4YzAsIDB4ZGUsIDB4MTgsIDB4OWEsIDB4NWMsIDB4OGYsIDB4NzIsIDB4MGUsIDB4ZjAsIDB4NDIsIDB4ZmIsCisJMHgwMywgMHhiNCwgMHgzNiwgMHg5OSwgMHg5MSwgMHhlYywgMHgyNiwgMHhmMCwgMHhjOSwgMHhhNCwgMHg4NywgMHg2ZiwKKwkweGMwLCAweDM1LCAweGY5LCAweDE2LCAweGJjLCAweDIzLCAweGZhLCAweGRiLCAweGMwLCAweDA5LCAweGJjLCAweGE2LAorCTB4MjIsIDB4NTYsIDB4NjcsIDB4NzUsIDB4YTEsIDB4ZWYsIDB4ZjcsIDB4NDgsIDB4NzYsIDB4MzQsIDB4NGUsIDB4NWIsCisJMHg2MiwgMHg3NSwgMHhkNiwgMHhjZiwgMHg0MCwgMHhkNywgMHgyYiwgMHgyOCwgMHg0MSwgMHg4YywgMHg2MSwgMHhkMiwKKwkweDgxLCAweDNjLCAweGE5LCAweDk1LCAweGRkLCAweDhmLCAweGUwLCAweGY3LCAweDgzLCAweGM2LCAweGU2LCAweGRkLAorCTB4M2QsIDB4YzksIDB4N2UsIDB4MWEsIDB4MDAsIDB4MTMsIDB4NmMsIDB4OTAsIDB4NDcsIDB4NjAsIDB4OWIsIDB4M2UsCisJMHgwMiwgMHgxYiwgMHhlNCwgMHg5MSwgMHg2NiwgMHgzYywgMHgxYywgMHgxYiwgMHhkYiwgMHg5ZiwgMHg1OSwgMHgwMywKKwkweDMxLCAweGE5LCAweGJmLCAweDczLCAweGE0LCAweDU3LCAweGQ4LCAweGVhLCAweGI5LCAweDYyLCAweGNhLCAweDk0LAorCTB4MmYsIDB4NzYsIDB4ZWIsIDB4YjcsIDB4YTEsIDB4ZWIsIDB4MWUsIDB4ZmIsIDB4M2IsIDB4YWUsIDB4ZjksIDB4M2EsCisJMHhkZiwgMHgwNCwgMHg5YSwgMHhhZiwgMHg3NCwgMHg2OSwgMHg5OSwgMHg5MywgMHhmNSwgMHhmMSwgMHg4NiwgMHhjZCwKKwkweDk5LCAweDY5LCAweGUyLCAweDE4LCAweGUzLCAweDM2LCAweDJkLCAweGFlLCAweGQzLCAweDEyLCAweDRkLCAweGQ2LAorCTB4ZGUsIDB4MjgsIDB4NTksIDB4NWIsIDB4MDMsIDB4YjgsIDB4MTksIDB4NmEsIDB4MDYsIDB4YzQsIDB4OTQsIDB4Y2YsCisJMHgxMiwgMHhlMiwgMHg5MywgMHgzMiwgMHgwMCwgMHhmNCwgMHgwYiwgMHg5YiwgMHhlMiwgMHhkYywgMHgxNSwgMHhlNSwKKwkweGRmLCAweGFjLCAweGI2LCAweGIxLCAweGNlLCAweDU2LCAweDQ4LCAweGM3LCAweGE0LCAweGVkLCAweDIwLCAweGI4LAorCTB4M2YsIDB4NTUsIDB4ODcsIDB4ZjYsIDB4YzksIDB4ZjMsIDB4YjAsIDB4NDAsIDB4OGUsIDB4MDIsIDB4MjYsIDB4NjAsCisJMHhhMiwgMHhjNiwgMHgzZiwgMHhhYiwgMHg2OSwgMHhhMCwgMHhkNiwgMHgyNywgMHgwZCwgMHg1NywgMHhmMywgMHg5NywKKwkweGU4LCAweGYxLCAweDllLCAweDA1LCAweDhmLCAweGMxLCAweGJlLCAweDgxLCAweGZkLCAweGQ2LCAweDAxLCAweGRiLAorCTB4OTgsIDB4N2QsIDB4MWMsIDB4ZTYsIDB4YjcsIDB4YTcsIDB4YzAsIDB4NTMsIDB4ZDksIDB4MzksIDB4OWUsIDB4MTIsCisJMHg5OSwgMHgyOCwgMHgxMiwgMHgzNywgMHhhMSwgMHg1ZCwgMHhjNywgMHg3OSwgMHgyNiwgMHg3ZSwgMHgzMiwgMHgxOCwKKwkweDMzLCAweGRmLCAweDdkLCAweDE2LCAweDRmLCAweDNiLCAweDJkLCAweDllLCAweDZlLCAweGIyLCAweGVmLCAweDExLAorCTB4YmMsIDB4NjksIDB4ZTMsIDB4MGQsIDB4ZTAsIDB4Y2QsIDB4ZjksIDB4MTksIDB4YzQsIDB4OWIsIDB4YmMsIDB4NzUsCisJMHgwYiwgMHhkZSwgMHgyOCwgMHg1YiwgMHhjYSwgMHhjOCwgMHg2ZSwgMHg2ZCwgMHg4NywgMHg0NSwgMHhlNCwgMHg1NywKKwkweGI0LCAweDZjLCAweGZiLCAweDAyLCAweGU2LCAweGIyLCAweDQ4LCAweGZhLCAweDk1LCAweDdjLCAweDJjLCAweDAyLAorCTB4OWMsIDB4MTQsIDB4ZjAsIDB4ZmIsIDB4NGUsIDB4ZDcsIDB4ZDAsIDB4MmEsIDB4NzEsIDB4YjIsIDB4YzAsIDB4NTcsCisJMHhhYSwgMHg4MiwgMHgyOSwgMHg2NiwgMHhlNSwgMHg1YywgMHg0MiwgMHhkYiwgMHhmYSwgMHhiOSwgMHhlMiwgMHgwNywKKwkweDM0LCAweDVjLCAweGI3LCAweDQyLCAweGRlLCAweGU1LCAweDQ1LCAweDM1LCAweDQzLCAweDM3LCAweDgwLCAweDE2LAorCTB4NTQsIDB4MGMsIDB4OWEsIDB4MmIsIDB4NzgsIDB4MDYsIDB4N2EsIDB4MjksIDB4MzcsIDB4NDksIDB4ZGIsIDB4YjgsCisJMHg4ZCwgMHg3ZSwgMHg0OSwgMHgzNCwgMHhkNywgMHhkNSwgMHg0OCwgMHgzYSwgMHg1MiwgMHgwYSwgMHhmNiwgMHgxNywKKwkweGJlLCAweDU1LCAweGFlLCAweDRiLCAweGQzLCAweGE5LCAweGEzLCAweGZjLCAweDk4LCAweGI2LCAweDdmLCAweDVkLAorCTB4MWYsIDB4ZDIsIDB4ZDYsIDB4ZjgsIDB4YmQsIDB4YWUsIDB4ZjIsIDB4ZDcsIDB4MmUsIDB4NGUsIDB4NGIsIDB4NTAsCisJMHgwZiwgMHhhMywgMHg1ZSwgMHgyMiwgMHhkNywgMHhkNSwgMHg0YywgMHgxZSwgMHhmMywgMHg0MCwgMHhiZiwgMHgxOSwKKwkweGU1LCAweDZiLCAweGRmLCAweDI3LCAweGFmLCAweGJhLCAweDU3LCAweDJmLCAweDJhLCAweGFmLCAweGRmLCAweDhlLAorCTB4ZmQsIDB4NzYsIDB4ZWQsIDB4ZGIsIDB4YjMsIDB4ZWYsIDB4ODQsIDB4N2QsIDB4ZTcsIDB4ZGQsIDB4NmUsIDB4YmUsCisJMHgxZCwgMHg3MSwgMHhkMywgMHg3YywgMHg4MywgMHg5MiwgMHhkMywgMHg2YywgMHg0MywgMHhmMywgMHg5NSwgMHg5NSwKKwkweDMzLCAweDFkLCAweDVlLCAweDQxLCAweGM4LCAweDU3LCAweDlmLCAweDkzLCAweDViLCAweDI3LCAweDhkLCAweGZjLAorCTB4ZGQsIDB4MGUsIDB4MTksIDB4MDQsIDB4ZmYsIDB4Y2MsIDB4OWIsIDB4MTEsIDB4YzAsIDB4M2YsIDB4OTgsIDB4OTYsCisJMHg1YiwgMHgyYiwgMHhjNCwgMHhkYiwgMHhlZiwgMHgwMiwgMHg3ZiwgMHg2MCwgMHhlMiwgMHg3YSwgMHhlYSwgMHg3NCwKKwkweGNhLCAweGRkLCAweDNiLCAweDYxLCAweGY3LCAweGEyLCAweDdjLCAweDkxLCAweDM4LCAweDFmLCAweGQyLCAweDczLAorCTB4NTMsIDB4MjgsIDB4ZWUsIDB4ZDEsIDB4NzMsIDB4NzMsIDB4YjAsIDB4MzgsIDB4MDMsIDB4ZmMsIDB4ZGMsIDB4MDYsCisJMHhiYSwgMHgwZiwgMHg4MiwgMHg5OSwgMHg1NCwgMHgwMSwgMHg5NCwgMHhmMywgMHgxMSwgMHhmYywgMHg4NiwgMHgxZCwKKwkweDUwLCAweGZjLCAweDE4LCAweGYyLCAweDFiLCAweGE1LCAweDMwLCAweDRhLCAweDllLCAweDczLCAweDJkLCAweDBmLAorCTB4YmYsIDB4MTMsIDB4ZmMsIDB4MTQsIDB4NDUsIDB4YmIsIDB4NDgsIDB4ZWIsIDB4ZTYsIDB4ZWYsIDB4OWYsIDB4MjAsCisJMHgwZiwgMHhlZiwgMHg0OSwgMHg0YywgMHg2MiwgMHgzMywgMHg2ZCwgMHgxZCwgMHhmNiwgMHhjZCwgMHhiOSwgMHhlMywKKwkweDljLCAweGM1LCAweGI0LCAweDJjLCAweDNmLCAweDNiLCAweDM3LCAweDZmLCAweDk3LCAweGU3LCAweGU4LCAweDM2LAorCTB4NGYsIDB4MWYsIDB4OGYsIDB4ZjksIDB4MWEsIDB4NTYsIDB4ZDIsIDB4ZmQsIDB4YjcsIDB4YjQsIDB4NWMsIDB4NzIsCisJMHg4ZiwgMHhjZSwgMHhhYywgMHgzMCwgMHhlZiwgMHhjNSwgMHg3NSwgMHgzOSwgMHhlNywgMHhkNSwgMHgzNCwgMHg0OCwKKwkweGJmLCAweDI1LCAweGQ5LCAweDkzLCAweDA3LCAweDNmLCAweDYxLCAweDljLCAweGQyLCAweGE3LCAweDdkLCAweDFkLAorCTB4ZDIsIDB4MDQsIDB4NjksIDB4NjAsIDB4ZGMsIDB4ZDIsIDB4ZTYsIDB4OTQsIDB4YTUsIDB4Y2QsIDB4MjcsIDB4ZjEsCisJMHhjNiwgMHg1MywgMHhiYSwgMHg2MCwgMHg2OSwgMHhmMywgMHgyOSwgMHhiYywgMHhmMSwgMHg5NCwgMHg1ZSwgMHg5YywKKwkweGUzLCAweGUzLCAweDVlLCAweGY4LCAweDcyLCAweGRiLCAweGExLCAweGRmLCAweDc2LCAweDU3LCAweDQwLCAweGJmLAorCTB4ZTAsIDB4YmIsIDB4MWMsIDB4N2MsIDB4ODAsIDB4NWMsIDB4NjksIDB4MWYsIDB4ZGUsIDB4ZWMsIDB4NjcsIDB4YTMsCisJMHg2ZCwgMHgzZiwgMHgyMywgMHg3YiwgMHg0YSwgMHgwMSwgMHhjNiwgMHg3OCwgMHgzNywgMHhjNiwgMHhmYiwgMHgzOSwKKwkweGJjLCAweDNmLCAweGEzLCAweGU1LCAweDhjLCAweGYyLCAweDBmLCAweDViLCAweDc5LCAweGY1LCAweDc5LCAweGJjLAorCTB4ZGIsIDB4ZTMsIDB4MDcsIDB4YTUsIDB4ZGQsIDB4OGIsIDB4YzgsIDB4MzQsIDB4ZGEsIDB4ZmEsIDB4YmEsIDB4ZWMsCisJMHhhOSwgMHhjYywgMHhlMiwgMHhiOSwgMHg4NCwgMHhlNywgMHg1NSwgMHgzYywgMHg5NywgMHhkMSwgMHhkZSwgMHgwYiwKKwkweDQ4LCAweDVmLCAweDI5LCAweGQzLCAweDVlLCAweDNkLCAweGNhLCAweGJmLCAweDg2LCAweGRmLCAweGNmLCAweGNiLAorCTB4ZDAsIDB4MjMsIDB4MmYsIDB4ZTEsIDB4ZjksIDB4MDEsIDB4ZjIsIDB4OWYsIDB4NDUsIDB4ZmQsIDB4NjAsIDB4ZjUsCisJMHg4YywgMHg0ZiwgMHgxOSwgMHhmNiwgMHg5YywgMHg2ZCwgMHgzYiwgMHhlNSwgMHhlNCwgMHgyYSwgMHhhMCwgMHhlOSwKKwkweGQyLCAweDAwLCAweGZhLCAweGRlLCAweGEzLCAweDc5LCAweGE2LCAweDBmLCAweDMyLCAweDNmLCAweDA3LCAweDE5LAorCTB4MzcsIDB4YTQsIDB4NjEsIDB4NmEsIDB4MDcsIDB4N2MsIDB4NzksIDB4Y2MsIDB4MDUsIDB4ZGUsIDB4OTMsIDB4YjUsCisJMHgzMiwgMHgxYiwgMHhhMywgMHgxZCwgMHg3OSwgMHg5MywgMHgyZSwgMHg5ZiwgMHgyYiwgMHgzNSwgMHg2OSwgMHhiYiwKKwkweDdhLCAweDdjLCAweDA5LCAweGZmLCAweGQwLCAweGVmLCAweDBhLCAweGU1LCAweDgxLCAweDkxLCAweGM2LCAweDEzLAorCTB4NDUsIDB4Y2EsIDB4MDIsIDB4ZTgsIDB4OWYsIDB4ZTIsIDB4MDgsIDB4ZGUsIDB4YjUsIDB4NWEsIDB4MjYsIDB4MTQsCisJMHgyNCwgMHg5NCwgMHgwNywgMHhhYywgMHg0NywgMHg5OSwgMHg1MCwgMHgyZCwgMHg3NywgMHgyOCwgMHg2YiwgMHgyOCwKKwkweDdiLCAweDI4LCAweDRiLCAweGNjLCAweDdjLCAweGVjLCAweDdlLCAweDkwLCAweDMyLCAweDFjLCAweGI0LCAweDEwLAorCTB4YTMsIDB4ZmQsIDB4ZTEsIDB4MTksIDB4MWYsIDB4NjQsIDB4ZWMsIDB4M2UsIDB4MmIsIDB4NGYsIDB4NDcsIDB4ZjUsCisJMHg1YywgMHhlYywgMHgyOSwgMHhhYSwgMHg5OCwgMHgyYiwgMHhhNywgMHg5MSwgMHg4NiwgMHhlNywgMHhmOCwgMHhjMywKKwkweDc4LCAweDdmLCAweDQ5LCAweGY2LCAweGUwLCAweGM5LCAweDFkLCAweGZmLCAweDAyLCAweDdlLCAweDczLCAweDZlLAorCTB4Y2EsIDB4MjgsIDB4ODcsIDB4YTcsIDB4NzQsIDB4MDIsIDB4NmYsIDB4M2MsIDB4YTUsIDB4MzEsIDB4MmIsIDB4NDcsCisJMHhjNiwgMHhhZCwgMHgxYywgMHhlMSwgMHg5YywgMHhkZSwgMHgwNCwgMHgzYywgMHg3MCwgMHg3YywgMHg0YSwgMHhjNywKKwkweDE3LCAweGMwLCAweGNmLCAweDRlLCAweDZlLCAweGYyLCAweDVkLCAweGQ2LCAweDhmLCAweDZkLCAweDE0LCAweGMzLAorCTB4ODMsIDB4NzgsIDB4M2EsIDB4YzksIDB4Y2YsIDB4MGQsIDB4ZGEsIDB4MGUsIDB4Y2UsIDB4NjksIDB4ZGEsIDB4ZmQsCisJMHgyYiwgMHhkNywgMHhmMCwgMHg2MiwgMHhjYywgMHhlOCwgMHgxNCwgMHhhZiwgMHg1OSwgMHgzNCwgMHhlZiwgMHhjZiwKKwkweGUxLCAweDMxLCAweDYzLCAweGYxLCAweGM4LCAweGRmLCAweGNhLCAweGZlLCAweDg2LCAweGRjLCAweDgyLCAweDRkLAorCTB4OWIsIDB4ZjUsIDB4N2QsIDB4Y2MsIDB4MDMsIDB4YzYsIDB4NzIsIDB4N2MsIDB4MTQsIDB4N2QsIDB4M2IsIDB4YjIsCisJMHhkYiwgMHhhNywgMHgwYywgMHg2NywgMHgwYywgMHg4MSwgMHhlMywgMHg2MywgMHhiYiwgMHg0OCwgMHhkNywgMHgzOCwKKwkweDQ4LCAweGM5LCAweGJjLCAweDZmLCAweDdlLCAweDEzLCAweGU2LCAweDJjLCAweDIzLCAweDdiLCAweDRiLCAweGY3LAorCTB4NmEsIDB4NWYsIDB4YjksIDB4ZjYsIDB4NjgsIDB4OTMsIDB4ZjUsIDB4NzMsIDB4YzIsIDB4NzIsIDB4YTAsIDB4ZDUsCisJMHgxOCwgMHg2ZCwgMHg5YiwgMHgyZiwgMHhjNSwgMHgwYywgMHhjZCwgMHhmMywgMHgzNywgMHhlNSwgMHg3MywgMHhiNSwKKwkweGJjLCAweDM3LCAweDc2LCAweDRkLCAweDYxLCAweDgxLCAweGFjLCAweGEzLCAweDZkLCAweDgxLCAweDM5LCAweDJiLAorCTB4NTcsIDB4ZTMsIDB4OWQsIDB4YmUsIDB4M2IsIDB4ZjksIDB4OGEsIDB4ZmMsIDB4NzQsIDB4MTAsIDB4M2MsIDB4ZjEsCisJMHg1ZCwgMHhjYiwgMHhmYiwgMHhmNCwgMHgzNSwgMHhkOCwgMHhlNywgMHg2MiwgMHg3ZSwgMHhmMiwgMHg2MCwgMHhmYiwKKwkweGJhLCAweDcyLCAweDBhLCAweGI2LCAweGRiLCAweGY2LCAweGI5LCAweDM2LCAweGFlLCAweDA2LCAweDNjLCAweDUxLAorCTB4NzksIDB4YTQsIDB4ZDgsIDB4MjAsIDB4OTMsIDB4NDUsIDB4ZDUsIDB4MWMsIDB4YjEsIDB4YjIsIDB4MzMsIDB4MjIsCisJMHgwOSwgMHg0ZCwgMHhkZiwgMHhiNCwgMHhlZiwgMHg3YSwgMHhjNywgMHgyMiwgMHg5NiwgMHhlZSwgMHhkNiwgMHhkNSwKKwkweDQ4LCAweGZkLCAweGVmLCAweDQyLCAweGM3LCAweGE2LCAweGExLCAweDYzLCAweDFiLCAweGExLCAweDgzLCAweDE3LAorCTB4Y2IsIDB4ODgsIDB4MzUsIDB4MzUsIDB4NGIsIDB4NjUsIDB4MDQsIDB4ZWIsIDB4MjQsIDB4ZTEsIDB4NzUsIDB4MWYsCisJMHg0NCwgMHhiZCwgMHg5MCwgMHhmZSwgMHhhMiwgMHg5YSwgMHhkNiwgMHg3MiwgMHg5MiwgMHg3NywgMHhiNiwgMHg1NywKKwkweDQ2LCAweDljLCAweDFkLCAweDk1LCAweGM1LCAweDNhLCAweDY4LCAweDhiLCAweGU3LCAweDhhLCAweDgxLCAweGY1LAorCTB4OTEsIDB4MjIsIDB4NmQsIDB4ZDQsIDB4NjQsIDB4MmEsIDB4MGIsIDB4OWMsIDB4ZWMsIDB4MDAsIDB4Y2MsIDB4Y2YsCisJMHg4YywgMHhjMiwgMHg0ZiwgMHhhNywgMHg1YywgMHgwNiwgMHhjYywgMHhhNywgMHgwMSwgMHhmMywgMHhjNCwgMHhhOCwKKwkweDEzLCAweGRhLCAweDA2LCAweGMyLCAweGEwLCAweGM4LCAweGM0LCAweDU4LCAweDk3LCAweGNjLCAweDRjLCAweDkxLAorCTB4MGUsIDB4MjEsIDB4MDMsIDB4NDYsIDB4MzEsIDB4OWYsIDB4YTksIDB4MTUsIDB4YjAsIDB4MDMsIDB4ZDgsIDB4M2YsCisJMHhlNCwgMHhmNiwgMHg1OCwgMHg4YiwgMHhjZSwgMHgzMywgMHhmYSwgMHhiYywgMHg1NSwgMHg2NiwgMHhjYSwgMHg2OSwKKwkweDBiLCAweGRiLCAweGUxLCAweDJhLCAweGQ4LCAweDU2LCAweGNjLCAweGMxLCAweGI2LCAweDAzLCAweGIwLCAweGVkLAorCTB4NWMsIDB4MTYsIDB4YjYsIDB4ZTUsIDB4NzQsIDB4NzEsIDB4MWIsIDB4NmMsIDB4MWEsIDB4YTMsIDB4OGIsIDB4MGQsCisJMHg1ZSwgMHg5YiwgMHgyZCwgMHgzZCwgMHhiYywgMHhkZiwgMHhkYSwgMHhiYiwgMHhiNCwgMHg4OSwgMHg3ZSwgMHgwYSwKKwkweDc4LCAweDQ4LCAweDYzLCAweGY4LCAweDNkLCAweDc5LCAweDJmLCAweDY1LCAweDE5LCAweGQyLCAweGY5LCAweGJkLAorCTB4MDcsIDB4NjUsIDB4ZjAsIDB4M2QsIDB4ZjksIDB4NjcsIDB4MmIsIDB4NGMsIDB4ZDksIDB4YmIsIDB4MmQsIDB4MmMsCisJMHhiNCwgMHgxMywgMHgzMiwgMHhiMCwgMHg4OSwgMHhmYiwgMHg5YywgMHhlYywgMHgyNCwgMHg2MSwgMHhmOCwgMHg4ZiwKKwkweDgwLCAweDE3LCAweDc5LCAweDk1LCAweGVhLCAweDM2LCAweGY5LCAweDY2LCAweGJiLCAweGQ3LCAweGRhLCAweDc2LAorCTB4ZDgsIDB4NzYsIDB4MzgsIDB4OTYsIDB4OTUsIDB4NTYsIDB4Y2YsIDB4ODcsIDB4ZjQsIDB4MTUsIDB4ZGEsIDB4ZDcsCisJMHgyMywgMHg0ZSwgMHg2NiwgMHhjOSwgMHhiOCwgMHhhYSwgMHg2OSwgMHg4ZSwgMHhmMiwgMHhkNiwgMHg5NSwgMHg3ZSwKKwkweGQwLCAweDQ5LCAweGZmLCAweDAyLCAweDVhLCAweDMzLCAweDcyLCAweGMzLCAweGQwLCAweGYxLCAweDBhLCAweDNiLAorCTB4YmUsIDB4MWEsIDB4YzMsIDB4MzcsIDB4YTksIDB4MjgsIDB4ZjQsIDB4MjEsIDB4ZTUsIDB4Y2QsIDB4MGUsIDB4ZTMsCisJMHg5YiwgMHhjYiwgMHg0MywgMHg4MCwgMHgzNSwgMHhmYywgMHgzZSwgMHhhOCwgMHg2ZCwgMHhjZSwgMHhhNywgMHg0YiwKKwkweDk0LCAweDQ5LCAweGYzLCAweGI0LCAweDY4LCAweDdjLCAweDk3LCAweDU2LCAweGY0LCAweDU1LCAweDZkLCAweGFmLAorCTB4YmIsIDB4MzIsIDB4NjAsIDB4ZTYsIDB4ZmMsIDB4MzAsIDB4ZTcsIDB4OWMsIDB4YmUsIDB4NDgsIDB4ZmIsIDB4MDMsCisJMHgwMywgMHg5NiwgMHhiZiwgMHg5MiwgMHhhMywgMHg3OSwgMHg3OSwgMHhiYiwgMHgxZCwgMHhmYiwgMHgxZiwgMHgyZSwKKwkweDMzLCAweDc3LCAweDhkLCAweDczLCAweDczLCAweDM3LCAweDUwLCAweDU5LCAweDNjLCAweDQ2LCAweDkxLCAweGI2LAorCTB4MDcsIDB4NTgsIDB4Y2YsIDB4ODUsIDB4OGQsIDB4OTQsIDB4OTIsIDB4NWEsIDB4OWYsIDB4ZjIsIDB4OTMsIDB4YjYsCisJMHgxMiwgMHhkMiwgMHgyNywgMHhiNiwgMHg3OCwgMHg0ZCwgMHhmMCwgMHgwMSwgMHg5ZSwgMHg1ZSwgMHg2MiwgMHg3NywKKwkweDI1LCAweGFjLCAweGRjLCAweGE0LCAweDFmLCAweDFjLCAweGY2LCAweDkxLCAweGI3LCAweDcyLCAweDMyLCAweDhmLAorCTB4ZjYsIDB4NDcsIDB4OWMsIDB4ZmUsIDB4Y2EsIDB4NzIsIDB4ZjIsIDB4MzIsIDB4OTQsIDB4OTMsIDB4MWMsIDB4OGYsCisJMHgyMywgMHg3NywgMHgzYywgMHg0OCwgMHgxZSwgMHg3ZCwgMHhiZiwgMHhiNiwgMHhhZiwgMHhiNywgMHg2ZSwgMHhhYiwKKwkweDAxLCAweGZlLCAweDA4LCAweGM3LCAweGNjLCAweDFhLCAweGEyLCAweDMzLCAweGY3LCAweDA4LCAweDZjLCAweDIyLAorCTB4M2IsIDB4NmYsIDB4YmIsIDB4ZTcsIDB4ZTYsIDB4NWYsIDB4ZDMsIDB4MDUsIDB4N2UsIDB4MzMsIDB4OGUsIDB4NmEsCisJMHg2OCwgMHhhNCwgMHhjNiwgMHg3NywgMHgzNCwgMHgyZCwgMHhkNCwgMHgyZSwgMHhiMSwgMHg2NSwgMHgzOSwgMHgwNiwKKwkweGRhLCAweGIzLCAweGI1LCAweGM2LCAweDE2LCAweDJjLCAweGQxLCAweGZlLCAweGE0LCAweGVjLCAweGEyLCAweGZkLAorCTB4ZjksIDB4NDMsIDB4ZTAsIDB4ODgsIDB4ZTMsIDB4ZTksIDB4YjIsIDB4NjksIDB4YjQsIDB4NTMsIDB4MTcsIDB4OGYsCisJMHg2ZiwgMHhiMSwgMHhmZiwgMHg0OCwgMHgzOCwgMHgwOSwgMHhiNywgMHhhMSwgMHhhZCwgMHg4NCwgMHgyMiwgMHg2YywKKwkweDgxLCAweDBjLCAweDgwLCAweDk3LCAweDM5LCAweDA3LCAweDhhLCAweGI2LCAweGViLCAweGI2LCAweGJmLCAweGE4LAorCTB4MzEsIDB4MzEsIDB4ZTQsIDB4ZDUsIDB4YjUsIDB4NTIsIDB4Y2YsIDB4M2UsIDB4YzksIDB4N2YsIDB4N2MsIDB4YWYsCisJMHhkMiwgMHhmNiwgMHhlZiwgMHg1MiwgMHg1OSwgMHg1NiwgMHhhZCwgMHg3YiwgMHhhZSwgMHg5ZSwgMHhjMywgMHg1ZiwKKwkweGZmLCAweDgyLCAweDM5LCAweDBhLCAweGYxLCAweDE3LCAweGQyLCAweDQ1LCAweDM1LCAweDBlLCAweDQ5LCAweDEzLAorCTB4ODYsIDB4MTYsIDB4MGMsIDB4MmQsIDB4NmUsIDB4YjQsIDB4ZmEsIDB4MjYsIDB4YTQsIDB4YmQsIDB4YWIsIDB4NDAsCisJMHg3YiwgMHhmNywgMHg4MSwgMHhjNiwgMHgyOCwgMHhjMywgMHgxOSwgMHg5NywgMHg1YiwgMHg4YiwgMHhlZiwgMHgyMywKKwkweGY4LCAweDBlLCAweGY5LCAweGU0LCAweDRhLCAweDMyLCAweDljLCAweGYyLCAweDliLCAweDc1LCAweGIyLCAweDU2LAorCTB4ZWUsIDB4ODcsIDB4N2UsIDB4MmUsIDB4ZWIsIDB4NzAsIDB4ZGMsIDB4OTQsIDB4ZmYsIDB4ZmYsIDB4MTUsIDB4ZWQsCisJMHhhYywgMHhhZCwgMHgzNSwgMHhmNiwgMHhjYSwgMHg4ZCwgMHhiNSwgMHg5NCwgMHhhZiwgMHg2YiwgMHhlNCwgMHg2MCwKKwkweDU1LCAweGRhLCAweDk1LCAweGU0LCAweDc3LCAweGY1LCAweDk4LCAweGQ3LCAweGZmLCAweDNmLCAweDE4LCAweDczLAorCTB4N2MsIDB4ZDEsIDB4OTgsIDB4M2QsIDB4M2IsIDB4ZTYsIDB4NzcsIDB4MjEsIDB4YmYsIDB4YzksIDB4ZjgsIDB4MzgsCisJMHgxZSwgMHhmOSwgMHgyZSwgMHgxYywgMHhiMywgMHhjNSwgMHg4NSwgMHgxZSwgMHg1NywgMHhiNSwgMHg5YywgMHgwOCwKKwkweDY1LCAweDA0LCAweGM3LCAweDM1LCAweDYwLCAweGM3LCAweGYwLCAweGI5LCAweGFhLCAweDcxLCAweDBkLCAweGJjLAorCTB4ODksIDB4NzEsIDB4YjUsIDB4MmUsIDB4MTgsIDB4ZDcsIDB4ZjYsIDB4MmIsIDB4OGUsIDB4NmIsIDB4MzksIDB4MWUsCisJMHgyNywgMHgyZiwgMHg4NywgMHhlMywgMHg4YiwgMHhjYSwgMHhhZSwgMHgyMiwgMHhjNywgMHhkOCwgMHg4ZiwgMHgzMSwKKwkweDFlLCAweGQ0LCAweGZlLCAweDgwLCAweDE5LCAweDYzLCAweGRhLCAweDhlLCAweDUxLCAweDU0LCAweGRiLCAweGI2LAorCTB4N2YsIDB4OGYsIDB4ZGYsIDB4ZDUsIDB4ZTMsIDB4YTMsIDB4ZWUsIDB4ZmYsIDB4M2UsIDB4NjgsIDB4YmEsIDB4NGUsCisJMHhiMiwgMHg1ZCwgMHg3NSwgMHg1NiwgMHhmZSwgMHhkZiwgMHgyNCwgMHgxZiwgMHgyZSwgMHg3MSwgMHhhZSwgMHg5MywKKwkweDE5LCAweDkxLCAweDUxLCAweGU4LCAweGUwLCAweGZmLCAweDVjLCAweGNiLCAweGQ4LCAweGZkLCAweGY2LCAweDk0LAorCTB4ZDUsIDB4NjMsIDB4ZDAsIDB4MTcsIDB4M2IsIDB4NjAsIDB4ZjMsIDB4ZjUsIDB4MTcsIDB4NTUsIDB4NzcsIDB4NDQsCisJMHg4MiwgMHhlMCwgMHhiNiwgMHhkNCwgMHhhNywgMHhkMSwgMHhmNywgMHg3ZSwgMHhlZCwgMHhhYiwgMHgyZSwgMHg4ZCwKKwkweDliLCAweDNmLCAweDU3LCAweDJiLCAweDNlLCAweGVkLCAweDBkLCAweGVhLCAweDczLCAweGU4LCAweGJiLCAweGUzLAorCTB4YjQsIDB4YzEsIDB4YjIsIDB4YjAsIDB4OTMsIDB4MzMsIDB4ZjEsIDB4ODgsIDB4YjYsIDB4YzUsIDB4YTgsIDB4MTMsCisJMHg5MywgMHhmMSwgMHg4YywgMHhhNCwgMHhkMSwgMHg1ZiwgMHgyNiwgMHhhZSwgMHg4NCwgMHg3ZCwgMHhjMCwgMHg1NiwKKwkweDgzLCAweDBkLCAweGY5LCAweGUxLCAweGNhLCAweDNlLCAweDNjLCAweDBmLCAweGNiLCAweGFkLCAweGIwLCAweDc3LAorCTB4NmUsIDB4N2QsIDB4ZTQsIDB4MGIsIDB4NzIsIDB4MWIsIDB4NmMsIDB4OWQsIDB4ZGIsIDB4MWUsIDB4MTksIDB4OTMsCisJMHhiZCwgMHhiMCwgMHg2ZCwgMHhmNiwgMHhjMiwgMHhjZSwgMHhkOSwgMHg1YiwgMHhhMSwgMHhlZCwgMHgzOSwgMHg4ZSwKKwkweGIyLCAweGFkLCAweDU1LCAweGI0LCAweDQ2LCAweDFiLCAweDg3LCAweGUzLCAweDIzLCAweGVlLCAweDBmLCAweDcyLAorCTB4MGUsIDB4NTIsIDB4MDksIDB4ZjUsIDB4OGEsIDB4OWUsIDB4OTcsIDB4YTYsIDB4MDUsIDB4NjksIDB4YWYsIDB4MjcsCisJMHhhYiwgMHg0MiwgMHhmZCwgMHhiNCwgMHhjYSwgMHhjNiwgMHg4ZCwgMHg4YywgMHgwZCwgMHg3OCwgMHg2NSwgMHhkYSwKKwkweDIyLCAweDhkLCAweDc4LCAweGMwLCAweDMzLCAweGYxLCAweDQ3LCAweGRhLCAweGFhLCAweDFlLCAweDdmLCAweDYzLAorCTB4OWQsIDB4ZjgsIDB4MmIsIDB4ZWIsIDB4YTQsIDB4ZmUsIDB4NzMsIDB4OTAsIDB4YWYsIDB4ZDUsIDB4MzQsIDB4YzUsCisJMHhiNywgMHg2NywgMHg3NSwgMHgwZCwgMHg2OSwgMHg4YiwgMHgzMiwgMHgzOCwgMHhhNCwgMHg4NywgMHg4ZCwgMHhhZiwKKwkweDIzLCAweDdmLCAweGFmLCAweDQ4LCAweDRmLCAweGZiLCAweGI5LCAweDJlLCAweGIzLCAweGJiLCAweDViLCAweDU2LAorCTB4MzMsIDB4MWUsIDB4OTAsIDB4YWQsIDB4Y2MsIDB4YzcsIDB4MDQsIDB4OTQsIDB4NWYsIDB4MWQsIDB4MTMsIDB4YTAsCisJMHg5ZiwgMHhmNSwgMHgwMSwgMHhlMCwgMHhlYywgMHgxNiwgMHgzYywgMHhmYiwgMHg2NCwgMHg4OCwgMHg3MSwgMHg4NywKKwkweDRhLCAweDY4LCAweDk3LCAweDdmLCAweGQ1LCAweGRhLCAweGU1LCAweDIxLCAweDFjLCAweDA5LCAweGMwLCAweDYxLAorCTB4ZTQsIDB4ZjMsIDB4NTIsIDB4M2QsIDB4YjcsIDB4NTAsIDB4N2YsIDB4ZTcsIDB4ZTcsIDB4NmMsIDB4ZGEsIDB4ODQsCisJMHhlYywgMHgyYSwgMHg3MSwgMHhkYywgMHg5NCwgMHhjMSwgMHhjNCwgMHg0ZCwgMHhiNSwgMHgwYywgMHg4ZSwgMHg1YiwKKwkweDNiLCAweDBhLCAweDY1LCAweGI0LCAweGZjLCAweDVjLCAweDJhLCAweDNiLCAweDI5LCAweGY3LCAweDE4LCAweDlmLAorCTB4N2YsIDB4MjAsIDB4NDUsIDB4NWEsIDB4N2YsIDB4YjcsIDB4NjQsIDB4ZTYsIDB4ZTIsIDB4ZjMsIDB4MDIsIDB4N2EsCisJMHg5MywgMHg1NCwgMHgyNCwgMHhhZCwgMHhkNywgMHhkMywgMHhiYywgMHgwOSwgMHhkOSwgMHgyMSwgMHhiZCwgMHgzMSwKKwkweGM2LCAweDNhLCAweDE5LCAweGNmLCAweGYzLCAweGYzLCAweDEzLCAweGIwLCAweDFmLCAweDg2LCAweDRiLCAweDBhLAorCTB4MTYsIDB4N2MsIDB4YWQsIDB4MGMsIDB4NzksIDB4ODEsIDB4NmMsIDB4NGYsIDB4MzksIDB4M2EsIDB4NzYsIDB4NmMsCisJMHg3NCwgMHg2ZCwgMHhhOSwgMHhjZSwgMHhkOCwgMHhhZSwgMHg4ZSwgMHg4ZSwgMHhmZiwgMHhjZSwgMHg4MCwgMHhmYSwKKwkweDY2LCAweGI0LCAweDdkLCAweGFiLCAweGI0LCAweGZlLCAweDlkLCAweGQ2LCAweDY1LCAweDQ2LCAweGViLCAweGMyLAorCTB4MzgsIDB4ZTYsIDB4OGMsIDB4MTcsIDB4YjEsIDB4ZTUsIDB4YWEsIDB4ZDMsIDB4YTcsIDB4ZWEsIDB4NDIsIDB4NWIsCisJMHhiMCwgMHg1MCwgMHgwOSwgMHhkMywgMHg5ZSwgMHg1YywgMHgyNiwgMHhlZCwgMHg4NSwgMHg2NSwgMHhkMiwgMHhmZSwKKwkweDc2LCAweDk5LCAweDM0LCAweDEzLCAweDE3LCAweGVjLCAweDJmLCAweDVlLCAweDQ2LCAweGRlLCAweDg4LCAweGU2LAorCTB4NTUsIDB4NjksIDB4MzYsIDB4ZjYsIDB4NzUsIDB4N2UsIDB4YWUsIDB4Y2MsIDB4MmEsIDB4ZWIsIDB4OTcsIDB4MzEsCisJMHg0NiwgMHg2YywgMHg2MiwgMHhjMywgMHgzOSwgMHgxZCwgMHgxYiwgMHhkZSwgMHhlMiwgMHg2ZCwgMHg1MywgMHg4YywKKwkweDc1LCAweDExLCAweDE3LCAweDA5LCAweGQ5LCAweGFiLCAweGYxLCAweDQyLCAweDljLCAweDdjLCAweDg1LCAweDMxLAorCTB4ZTAsIDB4M2MsIDB4ZDcsIDB4NWEsIDB4MTMsIDB4ZWEsIDB4NGEsIDB4YjQsIDB4M2QsIDB4NmYsIDB4OWIsIDB4OTgsCisJMHg3OSwgMHg4YiwgMHhlOSwgMHg3NSwgMHhkNSwgMHgzZSwgMHhkOCwgMHgwYSwgMHhmZCwgMHhjNSwgMHgyNiwgMHhkOSwKKwkweDNlLCAweDk2LCAweDU4LCAweDQxLCAweGJkLCAweGI1LCAweDYzLCAweGNjLCAweGY4LCAweDgzLCAweDdiLCAweGMxLAorCTB4NTcsIDB4MTksIDB4MjEsIDB4OGMsIDB4YzksIDB4OTQsIDB4MDgsIDB4NmQsIDB4ZTIsIDB4YTUsIDB4YjYsIDB4ZjAsCisJMHhlYiwgMHhiNywgMHhkNywgMHg3YiwgMHg4NSwgMHhmNiwgMHgxYywgMHhkOCwgMHgwZSwgMHgzZiwgMHg2YiwgMHg3YiwKKwkweGY1LCAweGQyLCAweDM3LCAweDE2LCAweGUyLCAweDRhLCAweGZkLCAweDljLCAweGY1LCAweDIyLCAweDU3LCAweGE4LAorCTB4YTcsIDB4ZWQsIDB4MTIsIDB4NzksIDB4NjYsIDB4NGUsIDB4MTYsIDB4NmYsIDB4ODQsIDB4Y2QsIDB4MjQsIDB4NDEsCisJMHhiNiwgMHg1YiwgMHg1YSwgMHgyMywgMHhhMiwgMHg2MywgMHgzYywgMHgyOSwgMHgyMywgMHg5YiwgMHgzYiwgMHhiOCwKKwkweGI2LCAweDAzLCAweGZhLCAweDM3LCAweGI2LCAweDhhLCAweDg5LCAweDliLCAweDg2LCAweDc2LCAweGNhLCAweDcyLAorCTB4YjQsIDB4N2IsIDB4YmQsIDB4YTUsIDB4NWQsIDB4YWUsIDB4YTksIDB4ZWUsIDB4YTAsIDB4Y2MsIDB4YzUsIDB4OWMsCisJMHgxOCwgMHgzYSwgMHhkZSwgMHg1ZSwgMHg5NCwgMHg0NCwgMHg0OCwgMHhjNywgMHgzMywgMHhmMCwgMHg4YiwgMHhhYiwKKwkweGU5LCAweDc4LCAweDQ2LCAweDUyLCAweDlhLCAweDhlLCAweDZiLCAweDE3LCAweGQwLCAweDcxLCAweGFiLCAweGE1LAorCTB4ZTMsIDB4NzcsIDB4NDQsIDB4MGQsIDB4NWQsIDB4MjgsIDB4YWQsIDB4YTcsIDB4NDgsIDB4YTcsIDB4ODYsIDB4OGUsCisJMHgxZCwgMHg0ZCwgMHhjNywgMHgzMywgMHg3OCwgMHhiYiwgMHg3ZSwgMHg4ZiwgMHgyZCwgMHgxMywgMHhiMSwgMHg2OSwKKwkweGZjLCAweDFkLCAweGE2LCAweDUxLCAweDJlLCAweGZlLCAweDY2LCAweGQ0LCAweGU4LCAweGE1LCAweDE0LCAweGU4LAorCTB4MjgsIDB4NGMsIDB4ZmYsIDB4NjAsIDB4ZDQsIDB4ZDAsIDB4NjcsIDB4NzUsIDB4OWEsIDB4ODksIDB4OGYsIDB4ZjQsCisJMHgxNywgMHhkZiwgMHgxMywgMHg1ZCwgMHg0OCwgMHg5ZiwgMHgyOSwgMHhkMCwgMHg2NywgMHg1OCwgMHhlNiwgMHhmNSwKKwkweGU4LCAweGIzLCAweGRlLCAweGFlLCAweDViLCAweDQ0LCAweGY1LCAweGJhLCAweDdiLCAweDI2LCAweDY2LCAweDY4LAorCTB4ZjUsIDB4NTYsIDB4M2QsIDB4NzYsIDB4OGUsIDB4ZmIsIDB4ZDksIDB4OWYsIDB4ODEsIDB4NTYsIDB4Y2QsIDB4ZGMsCisJMHg5YywgMHg5ZiwgMHhmNywgMHhiNywgMHgxOSwgMHg4YiwgMHg0YSwgMHg5OCwgMHgxOCwgMHgzNiwgMHhlMywgMHhhNCwKKwkweDU3LCAweGIyLCAweDFkLCAweDhkLCAweDdjLCAweGFhLCAweGQxLCAweGYyLCAweGE5LCAweDcxLCAweDQ4LCAweGE1LAorCTB4YWIsIDB4NjUsIDB4NzYsIDB4MzcsIDB4NzQsIDB4MDUsIDB4NmQsIDB4NmMsIDB4MmQsIDB4YTcsIDB4OTEsIDB4ZDcsCisJMHg5YSwgMHhjOCwgMHgxNiwgMHhmZiwgMHhkOSwgMHhlZSwgMHg1ZiwgMHhlMCwgMHhiYSwgMHg4MCwgMHgwYywgMHgzOSwKKwkweDQ4LCAweDZiLCAweDJiLCAweDliLCAweDcxLCAweDI5LCAweGJmLCAweDExLCAweGRmLCAweGRkLCAweGQyLCAweDU2LAorCTB4NTYsIDB4NzIsIDB4ZmIsIDB4NTgsIDB4ODMsIDB4ZWMsIDB4MmIsIDB4YmEsIDB4ZjIsIDB4NTEsIDB4ZDQsIDB4ZmYsCisJMHg0OCwgMHhkMSwgMHg4MywgMHgzZiwgMHgzZSwgMHgxZSwgMHhhNSwgMHg1ZCwgMHhiOCwgMHhiNywgMHhjOCwgMHhmNSwKKwkweDQ5LCAweGM3LCAweGFjLCAweDE5LCAweDJkLCAweDU4LCAweGYzLCAweDhjLCAweDQ4LCAweDViLCAweDQ3LCAweDAxLAorCTB4OWUsIDB4OGEsIDB4YjgsIDB4M2IsIDB4MDEsIDB4NDcsIDB4NWQsIDB4M2EsIDB4MmQsIDB4YWYsIDB4NzQsIDB4MGYsCisJMHgzOCwgMHhkYSwgMHg5NywgMHg3MCwgMHg3YSwgMHhlNCwgMHhjNiwgMHg0YSwgMHg1YSwgMHg2ZSwgMHhhOCwgMHg5OCwKKwkweDc1LCAweGQyLCAweGY5LCAweDc1LCAweGQwLCAweGE0LCAweDM3LCAweDBkLCAweDlkLCAweDkzLCAweGYxLCAweDgyLAorCTB4ZTAsIDB4M2MsIDB4ZTQsIDB4YjcsIDB4M2EsIDB4ZTIsIDB4NGEsIDB4YjQsIDB4MjMsIDB4MTksIDB4OWYsIDB4MTYsCisJMHhmMywgMHg3ZCwgMHhiMSwgMHhmYywgMHhlMywgMHg2MCwgMHgyOCwgMHhlNiwgMHhjYSwgMHgyYiwgMHgzZSwgMHhjNywKKwkweGQ1LCAweDIzLCAweGQ3LCAweDk3LCAweGFiLCAweGZiLCAweGUzLCAweDVhLCAweGU5LCAweDEzLCAweDUxLCAweGFlLAorCTB4NGQsIDB4NjQsIDB4MmIsIDB4ZTUsIDB4MjgsIDB4ZTMsIDB4ZTcsIDB4MjIsIDB4NzksIDB4NjksIDB4N2IsIDB4MmIsCisJMHg3YywgMHgzNywgMHg0OCwgMHhlYiwgMHhiNiwgMHhiNywgMHg4MiwgMHg1NiwgMHg2MiwgMHhkMCwgMHhmMywgMHg1YiwKKwkweDAxLCAweGQ3LCAweDU2LCAweGM2LCAweGJiLCAweDE4LCAweGU3LCAweGUyLCAweGY3LCAweDVmLCAweGEyLCAweDVmLAorCTB4ZDYsIDB4ZmQsIDB4NWQsIDB4YmQsIDB4NjYsIDB4MjUsIDB4OGEsIDB4NzMsIDB4NmUsIDB4ZjgsIDB4NjUsIDB4NzksCisJMHg1ZCwgMHhkMywgMHgzOCwgMHgxNCwgMHg0ZCwgMHg4YiwgMHgxMywgMHg3ZCwgMHg1YiwgMHg1YywgMHg1NiwgMHhmOCwKKwkweGQ1LCAweGZkLCAweDczLCAweGVkLCAweDU3LCAweDE0LCAweDcwLCAweGU4LCAweGVlLCAweGQ4LCAweGRjLCAweDIzLAorCTB4N2QsIDB4MTgsIDB4NWYsIDB4ZmYsIDB4OTIsIDB4ZjEsIDB4ZWQsIDB4MTcsIDB4YzYsIDB4NTQsIDB4MmYsIDB4MTYsCisJMHgzOSwgMHg4NiwgMHhmOSwgMHg3MSwgMHhhOSwgMHgzZiwgMHgzMiwgMHhlMywgMHg4YSwgMHg3NiwgMHgyYywgMHgxZSwKKwkweDhmLCAweGFlLCAweGFmLCAweDRlLCAweDAxLCAweDk2LCAweGU3LCAweGY0LCAweDFlLCAweDgxLCAweDIwLCAweGI4LAorCTB4YTYsIDB4ZTMsIDB4NjIsIDB4OTAsIDB4NTgsIDB4OTcsIDB4ZWMsIDB4OWMsIDB4OWUsIDB4NWYsIDB4ZDMsIDB4MTksCisJMHg4YSwgMHhhNCwgMHgzMywgMHgxYSwgMHhmZiwgMHhmOCwgMHg0ZSwgMHhlNCwgMHhjYSwgMHhkZCwgMHg5OCwgMHgzYiwKKwkweDcxLCAweDczLCAweDVkLCAweGFlLCAweGU2LCAweDhkLCAweDljLCAweGRmLCAweDZkLCAweGQ3LCAweGFkLCAweDQyLAorCTB4YmYsIDB4MjksIDB4MDgsIDB4OTQsIDB4YmYsIDB4NTgsIDB4NTYsIDB4NTAsIDB4NDcsIDB4NjEsIDB4ZWMsIDB4YjIsCisJMHhkYiwgMHhlZSwgMHg0YiwgMHg0OSwgMHgzMSwgMHg2ZSwgMHgzOCwgMHhlNCwgMHhhNiwgMHhhMywgMHg4OSwgMHg0MiwKKwkweGI5LCAweDBiLCAweGJmLCAweDFiLCAweGYwLCAweGZlLCAweDQ1LCAweGQ4LCAweDI4LCAweDNkLCAweGIwLCAweDYxLAorCTB4MjQsIDB4YTYsIDB4OGMsIDB4M2MsIDB4MDAsIDB4ZmQsIDB4NzYsIDB4ZTQsIDB4OTUsIDB4MjIsIDB4M2YsIDB4N2EsCisJMHg4OSwgMHhlMSwgMHg3MiwgMHgyYywgMHgzMSwgMHg1YSwgMHhkZSwgMHhjYiwgMHhmYSwgMHgyOCwgMHg3YiwgMHhhNSwKKwkweGY4LCAweDFkLCAweGZiLCAweDYyLCAweDFmLCAweGY0LCAweDc5LCAweDdmLCAweDk2LCAweDNlLCAweDVjLCAweGRiLAorCTB4MzYsIDB4ZGIsIDB4MGMsIDB4ZjEsIDB4ZTIsIDB4ZDIsIDB4MGQsIDB4YzcsIDB4YmYsIDB4NmUsIDB4ZWIsIDB4OGYsCisJMHg3MCwgMHg3YywgMHg3YiwgMHgyZCwgMHhkYywgMHg4YiwgMHhmYiwgMHg3ZCwgMHg0OSwgMHhkYiwgMHgyYywgMHg4ZiwKKwkweDU1LCAweDY4LCAweDI3LCAweDcyLCAweDRkLCAweDI3LCAweDc5LCAweDYyLCAweDVjLCAweDA4LCAweDQ3LCAweDEwLAorCTB4NWMsIDB4NDgsIDB4MTksIDB4N2QsIDB4ZmQsIDB4NzQsIDB4ODUsIDB4ZWIsIDB4MWEsIDB4NDEsIDB4ZjAsIDB4NWQsCisJMHhkYSwgMHhjMiwgMHg4MywgMHgyNSwgMHhmNCwgMHgxNywgMHhlMiwgMHg2MCwgMHg2MywgMHhkZSwgMHg4NSwgMHgyYywKKwkweDFjLCAweGU5LCAweDI2LCAweDdlLCAweDA1LCAweDVlLCAweDY5LCAweDg3LCAweGI3LCAweDRiLCAweGEyLCAweDg5LAorCTB4ZGYsIDB4MmUsIDB4MzcsIDB4MjQsIDB4M2UsIDB4NTEsIDB4ZjYsIDB4ODAsIDB4NjcsIDB4OGUsIDB4M2IsIDB4OTYsCisJMHhkOCwgMHg2MywgMHhjNywgMHhjYywgMHhmZCwgMHgyMCwgMHhhZiwgMHhiZiwgMHg0ZiwgMHhlMywgMHhhNSwgMHgwNSwKKwkweDNlLCAweDEyLCAweDYxLCAweDlhLCAweDg3LCAweDg1LCAweGIwLCAweDI1LCAweDJjLCAweDZlLCAweDgyLCAweGUwLAorCTB4ZmIsIDB4MjksIDB4ZjYsIDB4ZDksIDB4Y2QsIDB4ZmQsIDB4MDAsIDB4MjMsIDB4ZTgsIDB4MzcsIDB4YmYsIDB4NTYsCisJMHgxMSwgMHgwZiwgMHhkMSwgMHhjNCwgMHgxZCwgMHhlOCwgMHhmYiwgMHhiNywgMHhkMSwgMHhmNywgMHhiZSwgMHgzMiwKKwkweGZiLCAweDgzLCAweDdjLCAweGMwLCAweGQ4LCAweDQ3LCAweDJhLCAweDIxLCAweGJjLCAweGNiLCAweGY1LCAweDFkLAorCTB4Y2UsIDB4NzksIDB4YTcsIDB4YjUsIDB4ZWIsIDB4YzIsIDB4NmYsIDB4OGQsIDB4NDgsIDB4NGYsIDB4YzEsIDB4OTcsCisJMHhjYiwgMHg1NiwgMHg2NiwgMHhkNiwgMHhiOCwgMHhmMiwgMHgyZSwgMHhjOCwgMHhkYSwgMHg0MCwgMHg0ZSwgMHg0MiwKKwkweDg2LCAweGNkLCAweDY4LCAweGJhLCAweGM5LCAweGFlLCAweGU3LCAweGZmLCAweDExLCAweGY5LCAweGU0LCAweDBhLAorCTB4YzYsIDB4OTQsIDB4N2IsIDB4N2QsIDB4ZGEsIDB4YWIsIDB4YjMsIDB4YzEsIDB4OGMsIDB4NGYsIDB4OTksIDB4YmMsCisJMHg0YSwgMHhjNiwgMHhiZCwgMHg3YywgMHgyNywgMHhmNCwgMHgwMywgMHhkMiwgMHgxYSwgMHhlOSwgMHg2MywgMHgyNywKKwkweGIyLCAweDkxLCAweDY0LCAweDYyLCAweDU4LCAweGI4LCAweGM3LCAweDg5LCAweGZiLCAweDEzLCAweGI4LCAweGVmLAorCTB4ODcsIDB4ZjIsIDB4YzAsIDB4ODUsIDB4OWMsIDB4ZTMsIDB4MWMsIDB4OWEsIDB4ZmUsIDB4ODYsIDB4Y2IsIDB4ZjMsCisJMHg2NSwgMHgwZiwgMHgwOCwgMHhkNywgMHgwOSwgMHg5MywgMHhmMSwgMHhiZCwgMHhkYSwgMHgyNiwgMHgwMSwgMHhkNSwKKwkweDE1LCAweDU5LCAweDc2LCAweDMzLCAweDJjLCAweDEyLCAweGJmLCAweGFhLCAweGJjLCAweGRlLCAweDczLCAweDA1LAorCTB4M2UsIDB4NjcsIDB4MWMsIDB4MjEsIDB4MWEsIDB4Y2QsIDB4MTYsIDB4ZTUsIDB4YjUsIDB4NDgsIDB4YjcsIDB4YmMsCisJMHg5NiwgMHg0ZCwgMHhkNSwgMHg0YiwgMHhhZiwgMHg5NiwgMHhmOSwgMHhjYywgMHhkMywgMHhlOSwgMHhiMywgMHgyNiwKKwkweGRkLCAweDg1LCAweDJlLCAweGUxLCAweDljLCAweGY0LCAweDQwLCAweDQ2LCAweDRmLCAweDAwLCAweDZlLCAweGUyLAorCTB4YjAsIDB4ODcsIDB4MzIsIDB4ODksIDB4ZjMsIDB4YTcsIDB4NTQsIDB4M2EsIDB4MTYsIDB4Y2QsIDB4OTUsIDB4YTUsCisJMHgyZiwgMHg1NywgMHhiNCwgMHhiMSwgMHg5ZSwgMHgwMSwgMHg4ZSwgMHg3ZiwgMHg5NSwgMHhjNSwgMHg0MywgMHhhMywKKwkweGI4LCAweDgwLCAweGFkLCAweDJmLCAweDkyLCAweDcwLCAweGUwLCAweDJiLCAweDQzLCAweGQ3LCAweDNmLCAweGJhLAorCTB4NGEsIDB4MWEsIDB4ODksIDB4OWIsIDB4MWUsIDB4ZjAsIDB4NTIsIDB4MGQsIDB4NzQsIDB4ZDEsIDB4ZmQsIDB4Y2QsCisJMHg1YywgMHgzNywgMHhkNSwgMHgzNiwgMHg2NCwgMHhlYywgMHg2MywgMHhiZiwgMHhhYywgMHhkMiwgMHg3ZiwgMHgxYiwKKwkweDU3LCAweGU5LCAweDUxLCAweDJiLCAweDJmLCAweGEzLCAweDdkLCAweDk0LCAweDk3LCAweDRmLCAweDk3LCAweDA4LAorCTB4OGYsIDB4NzgsIDB4MTEsIDB4M2YsIDB4ZDEsIDB4ZDcsIDB4NWIsIDB4MTYsIDB4MTUsIDB4NDksIDB4N2IsIDB4ZDEsCisJMHhkZSwgMHhmMiwgMHg0MiwgMHhmYSwgMHg3ZiwgMHhiYSwgMHhmMiwgMHg2MSwgMHg2YiwgMHgwYiwgMHg1NiwgMHhjNywKKwkweDU0LCAweGFiLCAweGYzLCAweGM4LCAweDgzLCAweGNiLCAweGU1LCAweDExLCAweDI2LCAweDg5LCAweGFlLCAweDQ4LAorCTB4NWYsIDB4ZjgsIDB4NTQsIDB4N2IsIDB4NDcsIDB4ZGUsIDB4YWIsIDB4MTUsIDB4ZTIsIDB4MzksIDB4ODAsIDB4ZGMsCisJMHgwNiwgMHhhZSwgMHhjYiwgMHg1YywgMHhhZiwgMHhkZSwgMHg4ZiwgMHg3OSwgMHhmYiwgMHgzZiwgMHg0MSwgMHgyNiwKKwkweGM2LCAweDdjLCAweDRmLCAweGVhLCAweGUwLCAweGRiLCAweGJlLCAweDBjLCAweGRkLCAweGY5LCAweDhhLCAweDdmLAorCTB4ZTEsIDB4NTMsIDB4OWQsIDB4MWQsIDB4NDEsIDB4ZjAsIDB4YWMsIDB4OWYsIDB4NGYsIDB4YjgsIDB4OTAsIDB4MWYsCisJMHg4NywgMHgyZCwgMHhiZSwgMHg4NywgMHg4MSwgMHhlZiwgMHg4OSwgMHgzOSwgMHg3YywgMHgyNywgMHhlNCwgMHg2MiwKKwkweGQ3LCAweGY3LCAweDAzLCAweGFlLCAweGY1LCAweDBkLCAweDk3LCAweDZmLCAweGJkLCAweDU1LCAweGE1LCAweDNmLAorCTB4ZmUsIDB4YTEsIDB4NmMsIDB4MzcsIDB4ZmIsIDB4MWIsIDB4OTEsIDB4YzMsIDB4OTUsIDB4OWIsIDB4ODgsIDB4YmYsCisJMHgyOCwgMHhjNiwgMHg3YSwgMHg0ZiwgMHg5ZiwgMHg2ZiwgMHhmYSwgMHhlZCwgMHg1YiwgMHhkMCwgMHgyZiwgMHhlOSwKKwkweGU1LCAweDQ3LCAweGFjLCAweDhiLCAweDMyLCAweGQ1LCAweDc1LCAweDMzLCAweGEwLCAweGNiLCAweGJjLCAweGFkLAorCTB4M2IsIDB4NzAsIDB4ODUsIDB4YmEsIDB4ZGUsIDB4MTUsIDB4ZWEsIDB4MWUsIDB4NDYsIDB4ZGQsIDB4M2QsIDB4YjYsCisJMHhlZSwgMHg4NSwgMHhjZiwgMHhiYywgMHhiOSwgMHg3ZSwgMHgwNywgMHhiOCwgMHhjNywgMHgwZSwgMHgzZSwgMHg4MCwKKwkweGI4LCAweDExLCAweGZmLCAweDM2LCAweGZjLCAweGJlLCAweDg1LCAweGVkLCAweDI4LCAweGRhLCAweGY3LCAweDIzLAorCTB4OTUsIDB4MjEsIDB4MTksIDB4YWUsIDB4ZWMsIDB4YzQsIDB4MzMsIDB4ODgsIDB4YjQsIDB4M2UsIDB4M2MsIDB4ZmIsCisJMHhmMCwgMHgzYiwgMHg4ZCwgMHg0NywgMHhhMiwgMHg2ZSwgMHhmYSwgMHhjMiwgMHg1ZCwgMHhjMywgMHg3ZSwgMHg4OCwKKwkweDU3LCAweGFlLCAweGNkLCAweGIzLCAweDBmLCAweGQ4LCAweDE3LCAweDVkLCAweDNmLCAweDQxLCAweDFmLCAweDYxLAorCTB4ZmEsIDB4MDcsIDB4NTAsIDB4NjcsIDB4MWEsIDB4NjksIDB4MmIsIDB4NjksIDB4N2IsIDB4NjIsIDB4YWUsIDB4YWIsCisJMHhlYiwgMHg1NCwgMHhjMywgMHgzNiwgMHgxZCwgMHhjZSwgMHgwNSwgMHhmMiwgMHgwZCwgMHg4ZCwgMHhmNiwgMHgxNiwKKwkweDQzLCAweDE4LCAweGVmLCAweDQ0LCAweDFiLCAweGUzLCAweDU3LCAweDI5LCAweGZmLCAweDFlLCAweGMyLCAweDE1LAorCTB4NTcsIDB4ZmUsIDB4YzcsIDB4ZjAsIDB4N2UsIDB4MmQsIDB4ZDgsIDB4OWQsIDB4NjIsIDB4NGMsIDB4OWUsIDB4ZjMsCisJMHg3ZSwgMHhkZCwgMHhhYSwgMHhhNSwgMHg3YiwgMHg5ZiwgMHg0MiwgMHgxYSwgMHhlOCwgMHg4NCwgMHg0ZSwgMHg2OSwKKwkweGIwLCAweDc0LCAweDVhLCAweDgwLCAweGU1LCAweDQzLCAweDFhLCAweGU1LCAweDk4LCAweDE3LCAweDk3LCAweDRkLAorCTB4NzYsIDB4ZTYsIDB4YTUsIDB4MDcsIDB4YmEsIDB4OGMsIDB4YjIsIDB4ZjYsIDB4ZDMsIDB4ZjUsIDB4MjYsIDB4MGUsCisJMHgwMywgMHhjYiwgMHhkMSwgMHhlZiwgMHgwNCwgMHgzZCwgMHgzNywgMHg4OCwgMHg4NywgMHhmYSwgMHgwMywgMHgxMSwKKwkweDBmLCAweDM0LCAweDE4LCAweGQ2LCAweDRmLCAweDdhLCAweDAzLCAweDExLCAweDhlLCAweDE5LCAweDFjLCAweDVmLAorCTB4ZTYsIDB4YmEsIDB4MzQsIDB4NmQsIDB4NmIsIDB4ZDYsIDB4MGYsIDB4NmQsIDB4MWMsIDB4ZmUsIDB4N2IsIDB4NTksCisJMHhjNCwgMHg2NywgMHgxYSwgMHhkYiwgMHgwYiwgMHhkZSwgMHg1NSwgMHhlMywgMHgyZiwgMHg1OSwgMHg2MywgMHhjMSwKKwkweDM4LCAweGYzLCAweDQ5LCAweDY4LCAweDMwLCAweGFmLCAweDRmLCAweGNiLCAweGU5LCAweGZjLCAweDM1LCAweDM1LAorCTB4ZDIsIDB4ZTAsIDB4ZjUsIDB4ZWIsIDB4ZGYsIDB4MmMsIDB4ZDMsIDB4ZTAsIDB4ODEsIDB4NGYsIDB4MTcsIDB4OTUsCisJMHg2MSwgMHgxYSwgMHhmMywgMHgwYSwgMHg2YiwgMHg5NCwgMHhkZSwgMHhhYiwgMHhhNCwgMHhmNywgMHgyOCwgMHhjOSwKKwkweDgzLCAweGE5LCAweDY0LCAweDYyLCAweDQ4LCAweDI1LCAweGJkLCAweDcxLCAweGQ5LCAweDBmLCAweGI5LCAweDQzLAorCTB4MzksIDB4MzksIDB4NzMsIDB4N2YsIDB4NDQsIDB4YjgsIDB4OWYsIDB4ZWYsIDB4NWQsIDB4OTIsIDB4ZjUsIDB4MjksCisJMHgzZiwgMHgwYiwgMHg5ZiwgMHg1NywgMHg5NCwgMHg3NSwgMHg5NSwgMHg5NywgMHgxYSwgMHhjYywgMHhkOCwgMHhiOCwKKwkweDBmLCAweDAxLCAweDcwLCAweDM2LCAweGQxLCAweDg2LCAweGJiLCAweGI1LCAweDgxLCAweDNjLCAweDk0LCAweDUwLAorCTB4MTEsIDB4ZDksIDB4NDUsIDB4M2YsIDB4NWYsIDB4N2QsIDB4YjEsIDB4NWUsIDB4ZWEsIDB4YTcsIDB4ZDcsIDB4NzgsCisJMHg1MiwgMHhkMSwgMHhlOSwgMHg2NiwgMHg3ZiwgMHg2MCwgMHhiMiwgMHg3MywgMHg0OCwgMHg4OSwgMHgxZSwgMHg3YiwKKwkweDQ2LCAweGJkLCAweDkxLCAweGNjLCAweDllLCAweGI1LCAweGZhLCAweDIzLCAweDkwLCAweGM3LCAweGI0LCAweGJlLAorCTB4OTgsIDB4ZjksIDB4YmMsIDB4MmIsIDB4MTcsIDB4ODIsIDB4YjYsIDB4NGQsIDB4MTcsIDB4ZGEsIDB4YjMsIDB4NWQsCisJMHhiNCwgMHg3MywgMHg1NywgMHhkOSwgMHhmZCwgMHg5NSwgMHg4YywgMHg2MywgMHhiZCwgMHg0YiwgMHg5ZSwgMHhmMywKKwkweDBiLCAweDE4LCAweGY3LCAweDdlLCAweGI5LCAweGUwLCAweGIzLCAweGJmLCAweDk5LCAweGNmLCAweDc5LCAweGMyLAorCTB4NzQsIDB4YzIsIDB4NmUsIDB4ZmEsIDB4MTMsIDB4ZjUsIDB4YTcsIDB4ODAsIDB4ODcsIDB4N2QsIDB4NTIsIDB4MDcsCisJMHg1ZiwgMHhjOSwgMHhlZSwgMHg0YiwgMHgwZSwgMHhlNCwgMHg0NSwgMHhjZiwgMHg0YiwgMHg4ZiwgMHhhMCwgMHhhZCwKKwkweDE1LCAweDNlLCAweGY4LCAweDEwLCAweDc2LCAweDczLCAweGNkLCAweDkxLCAweGFiLCAweDIxLCAweDc3LCAweDFkLAorCTB4YmQsIDB4YzcsIDB4MDIsIDB4OTMsIDB4ZTEsIDB4NGQsIDB4NjEsIDB4ZGUsIDB4MzMsIDB4MDMsIDB4MmMsIDB4NTcsCisJMHgyZiwgMHhkMywgMHgzMSwgMHhmMiwgMHhiYSwgMHhlNiwgMHg5NywgMHg0ZiwgMHg2NSwgMHhmZCwgMHg3NiwgMHg0ZiwKKwkweDM5LCAweGMzLCAweDhjLCAweDMxLCAweDAwLCAweGFmLCAweGE0LCAweGNkLCAweDU0LCAweDZjLCAweGJiLCAweGNmLAorCTB4YjYsIDB4NTgsIDB4ZTYsIDB4MmEsIDB4ZjksIDB4ZjYsIDB4YzAsIDB4ODUsIDB4N2YsIDB4NzgsIDB4ZDYsIDB4ZmYsCisJMHg3YiwgMHhjMCwgMHg5MSwgMHg4MSwgMHg0YywgMHhlMCwgMHhmMywgMHg2YSwgMHg5MCwgMHg4ZiwgMHgzMSwgMHhhNiwKKwkweGY1LCAweGJmLCAweGViLCAweGFkLCAweDlkLCAweGFjLCAweDc5LCAweDdmLCAweDU4LCAweGVmLCAweDkzLCAweDc5LAorCTB4ZmUsIDB4MzMsIDB4NTksIDB4YWUsIDB4NzcsIDB4YzAsIDB4MzYsIDB4YzksIDB4NjksIDB4YjksIDB4MTgsIDB4ZmQsCisJMHg2OSwgMHgwZSwgMHhmMCwgMHgxNCwgMHgyYSwgMHhiNCwgMHg0MywgMHhmZSwgMHgwNiwgMHg3NiwgMHg4OCwgMHhkNiwKKwkweDkzLCAweGYyLCAweGVkLCAweDQxLCAweGU2LCAweGIxLCAweGRkLCAweGVjLCAweGQ1LCAweGFlLCAweGQ2LCAweDBiLAorCTB4MjEsIDB4MmMsIDB4YzksIDB4Y2UsIDB4MWMsIDB4ZjIsIDB4NDcsIDB4YjQsIDB4MWQsIDB4ZWYsIDB4YzksIDB4YWMsCisJMHhlNywgMHhlYSwgMHg3ZCwgMHgyNywgMHhmOSwgMHhjMSwgMHgyMCwgMHg3OCwgMHhjNSwgMHg3NywgMHhlNSwgMHhhNCwKKwkweDg2LCAweGY5LCAweDA1LCAweGY0LCAweGUxLCAweGM4LCAweGM0LCAweDgwLCAweGZiLCAweGQzLCAweDkzLCAweDNlLAorCTB4YzcsIDB4YzcsIDB4M2MsIDB4YWUsIDB4MmIsIDB4NmQsIDB4OGUsIDB4MWIsIDB4ZjgsIDB4NjgsIDB4OWIsIDB4N2UsCisJMHgyZiwgMHg5OCwgMHg4ZCwgMHg3MSwgMHhkZCwgMHgwMiwgMHgzYywgMHg1ZCwgMHg2YSwgMHhmNywgMHg2ZSwgMHg5MCwKKwkweGRiLCAweGU2LCAweDZjLCAweDlhLCAweDY5LCAweDMxLCAweDM2LCAweGEzLCAweGQxLCAweDY5LCAweDE3LCAweGZlLAorCTB4NjEsIDB4YzQsIDB4YmYsIDB4YjAsIDB4YmEsIDB4ODAsIDB4YjksIDB4ODEsIDB4MGUsIDB4NWIsIDB4MGMsIDB4NGIsCisJMHg4YSwgMHhiMCwgMHgwYywgMHg2YiwgMHg1OCwgMHg2MiwgMHhjMCwgMHhhNSwgMHgwYiwgMHhkOSwgMHg3NywgMHg5YiwKKwkweDFjLCAweDAyLCAweGRlLCAweDg3LCAweDA2LCAweDQ1LCAweDllLCAweDg1LCAweDRkLCAweDc2LCAweGJlLCAweDBhLAorCTB4OWUsIDB4MTksIDB4YzAsIDB4NzMsIDB4ZGUsIDB4ZTcsIDB4NWUsIDB4MDAsIDB4ZTYsIDB4ZjksIDB4ZGUsIDB4YjAsCisJMHg3MCwgMHgyZiwgMHgwMCwgMHg3MSwgMHhkOCwgMHg4MSwgMHhkZiwgMHgyMiwgMHgzMywgMHhkMCwgMHhiZiwgMHgyNywKKwkweGZkLCAweGQ3LCAweDgyLCAweGYxLCAweDE4LCAweDc1LCAweDIzLCAweGRhLCAweDk5LCAweGRiLCAweDFiLCAweDE0LAorCTB4YzgsIDB4ZTcsIDB4NTMsIDB4ZDQsIDB4NDMsIDB4YjUsIDB4ZDIsIDB4YjYsIDB4OGUsIDB4N2UsIDB4ODgsIDB4OTEsCisJMHg5ZiwgMHgzNywgMHhmOCwgMHgxOSwgMHhmNCwgMHhmNSwgMHg1YiwgMHgyYiwgMHhhNSwgMHgzZSwgMHgyZiwgMHhmZCwKKwkweDFkLCAweDc1LCAweGM4LCAweDczLCAweDZkLCAweGRlLCAweDgwLCAweGNlLCAweGViLCAweGVmLCAweDM4LCAweDhjLAorCTB4ZmMsIDB4OGYsIDB4YWYsIDB4NjQsIDB4YmMsIDB4ZGIsIDB4ZjUsIDB4ZDcsIDB4NGIsIDB4ZGIsIDB4MWEsIDB4ZTYsCisJMHg1NSwgMHhmMywgMHhlMCwgMHhhYiwgMHhkYywgMHg4MywgMHg2OSwgMHg3NSwgMHgzOCwgMHg2NCwgMHg1OSwgMHgyOSwKKwkweGVmLCAweDcxLCAweGE3LCAweGRkLCAweDIxLCAweGNjLCAweGM1LCAweDZlLCAweDlmLCAweGIyLCAweGVkLCAweGJmLAorCTB4YTMsIDB4NmUsIDB4NGEsIDB4NmUsIDB4ZjQsIDB4MDcsIDB4OTEsIDB4MzcsIDB4OGQsIDB4YmMsIDB4YzMsIDB4MzYsCisJMHg2ZiwgMHhkMCwgMHhlNiwgMHg2ZCwgMHg0MywgMHhkZSwgMHgzZSwgMHhlMCwgMHhlZiwgMHg2ZSwgMHg5ZCwgMHg5ZSwKKwkweGU1LCAweDZmLCAweDUzLCAweGM3LCAweDViLCAweGQ5LCAweDcxLCAweGUxLCAweDMzLCAweDM3LCAweGY4LCAweDg0LAorCTB4MGIsIDB4NzksIDB4MjUsIDB4YWUsIDB4OGIsIDB4ZGUsIDB4MjYsIDB4NzksIDB4MmYsIDB4NzksIDB4MGIsIDB4N2IsCisJMHhmZCwgMHg2NiwgMHhiMSwgMHgwZSwgMHhiMiwgMHg4OSwgMHg3YiwgMHg4MCwgMHg2OSwgMHhiMywgMHg2ZSwgMHhmMSwKKwkweDVlLCAweDk2LCAweGZmLCAweDQwLCAweGJhLCAweGViLCAweGM5LCAweDM4LCAweDVmLCAweDViLCAweGM5LCAweGI4LAorCTB4ZDgsIDB4ODgsIDB4NGYsIDB4ZmIsIDB4M2EsIDB4OTAsIDB4OWMsIDB4NWUsIDB4M2YsIDB4YTEsIDB4N2YsIDB4NWIsCisJMHg0NCwgMHgzYSwgMHhlOSwgMHg0MSwgMHgzNSwgMHg0NSwgMHhmNCwgMHgzZSwgMHgyZCwgMHg3ZSwgMHg0NywgMHg2MSwKKwkweGY3LCAweDA2LCAweDQyLCAweDlmLCAweDhmLCAweDM2LCAweDVkLCAweGM2LCAweGUzLCAweGRhLCAweDUwLCAweDk4LAorCTB4ZTcsIDB4MjEsIDB4NGYsIDB4NmQsIDB4OGEsIDB4YzAsIDB4MjYsIDB4YWEsIDB4ZjUsIDB4MWQsIDB4MWQsIDB4YTMsCisJMHgyZSwgMHhlOCwgMHg3NSwgMHgwMCwgMHhjNiwgMHhkZiwgMHgzMiwgMHhmMCwgMHg2MywgMHgwMiwgMHhlOSwgMHg0NywKKwkweGRmLCAweGE0LCAweGZkLCAweDY4LCAweDg3LCAweGVmLCAweDFkLCAweDEwLCAweGVlLCAweDY3LCAweDY1LCAweDdhLAorCTB4YmIsIDB4ZjcsIDB4NmQsIDB4OTksIDB4YTcsIDB4ZjMsIDB4MTksIDB4NDksIDB4NjYsIDB4OTQsIDB4MDMsIDB4ZmYsCisJMHg3NSwgMHhhYiwgMHgyMywgMHhmNSwgMHhiMCwgMHgzZCwgMHg2ZSwgMHgzMCwgMHhmYSwgMHhjZCwgMHhlMywgMHg5ZSwKKwkweGM0LCAweDhiLCAweGRhLCAweDU2LCAweDZiLCAweGI0LCAweGYzLCAweDkxLCAweDA1LCAweDZlLCAweGI4LCAweDFmLAorCTB4N2MsIDB4ZTAsIDB4OWUsIDB4ZGQsIDB4N2UsIDB4MjEsIDB4MDksIDB4NmEsIDB4ZDQsIDB4YmEsIDB4NzEsIDB4MTgsCisJMHhiNCwgMHg5MSwgMHg0ZCwgMHgxOSwgMHhkZCwgMHg3OCwgMHhjMywgMHg5YywgMHg2ZSwgMHhmYywgMHhmMywgMHg5NSwKKwkweGU0LCAweDg5LCAweGUxLCAweDcyLCAweDFjLCAweDc1LCAweGY1LCAweDNhLCAweDRhLCAweDgyLCAweDc1LCAweDZiLAorCTB4MzEsIDB4OWYsIDB4ZTcsIDB4ZmQsIDB4ZWMsIDB4MzUsIDB4YTAsIDB4MmYsIDB4YzgsIDB4ZTEsIDB4NjQsIDB4ZTcsCisJMHgyOSwgMHhkNCwgMHgyZCwgMHhhMCwgMHhlZSwgMHhlNCwgMHg1YywgMHg1ZCwgMHg0NywgMHg0NiwgMHg3YywgMHhiZCwKKwkweGVmLCAweDU5LCAweDI2LCAweGNiLCAweDIxLCAweDFkLCAweDI2LCAweGUzLCAweGI3LCAweDZhLCAweDVlLCAweGUwLAorCTB4N2UsIDB4MzAsIDB4MzcsIDB4NzEsIDB4OWYsIDB4NmMsIDB4ZDYsIDB4YjQsIDB4ZGQsIDB4MjcsIDB4ZGMsIDB4MjcsCisJMHhjNSwgMHhiNiwgMHhlZiwgMHgwYiwgMHhkYSwgMHhkNiwgMHgxMCwgMHhiZSwgMHgxMiwgMHhkZSwgMHhhNCwgMHg4ZCwKKwkweDMxLCAweGJjLCAweGMzLCAweGY5LCAweDM3LCAweGYzLCAweDNlLCAweGU0LCAweDEwLCAweGRmLCAweGJmLCAweDFmLAorCTB4ZTQsIDB4MDcsIDB4MzksIDB4MmYsIDB4ZmMsIDB4OWUsIDB4YTcsIDB4YjksIDB4MTEsIDB4ZDAsIDB4NWMsIDB4YzQsCisJMHg3ZiwgMHhiYiwgMHgwYywgMHhlYiwgMHgzZCwgMHgxMCwgMHgyOSwgMHg5OSwgMHhkMCwgMHhmMSwgMHhjYywgMHgwYiwKKwkweGMxLCAweDIzLCAweDBiLCAweGU0LCAweGY4LCAweDQ3LCAweDk0LCAweGExLCAweDIxLCAweGZlLCAweDJlLCAweDI0LAorCTB4ZWEsIDB4NjQsIDB4NjYsIDB4NGQsIDB4OWQsIDB4ZGUsIDB4ZjEsIDB4NDEsIDB4N2MsIDB4OGMsIDB4ZGUsIDB4NzMsCisJMHgzYiwgMHhmOCwgMHhmNSwgMHhmYSwgMHhiOSwgMHhiMSwgMHgwMCwgMHhkZiwgMHhjMCwgMHhlMywgMHg0ZSwgMHg2MywKKwkweGViLCAweDYzLCAweDFjLCAweDE5LCAweGVkLCAweGJmLCAweDY3LCAweDhiLCAweDRhLCAweGVmLCAweDBiLCAweGEyLAorCTB4OGUsIDB4M2YsIDB4MDAsIDB4OWQsIDB4NmEsIDB4ZjYsIDB4YTQsIDB4ZTAsIDB4NWQsIDB4ZTEsIDB4YmMsIDB4MjksCisJMHhlZCwgMHg3MywgMHgxYywgMHgwNCwgMHgwZiwgMHgxZiwgMHhmNCwgMHhiMywgMHg2YiwgMHg2YSwgMHg3NSwgMHhkYiwKKwkweDQ5LCAweGVmLCAweDdhLCAweDZkLCAweDEzLCAweDZlLCAweDk0LCAweDk5LCAweDE0LCAweGRiLCAweDIzLCAweDVlLAorCTB4ZmUsIDB4NDcsIDB4MzAsIDB4ZTQsIDB4Y2QsIDB4YTAsIDB4N2YsIDB4NDMsIDB4ZmYsIDB4NTksIDB4NWYsIDB4YjUsCisJMHhkNCwgMHg0OSwgMHhmNSwgMHgzZSwgMHg1MywgMHhlMiwgMHhjOSwgMHg4NSwgMHhiZCwgMHhkMiwgMHgwMSwgMHhmYywKKwkweDE4LCAweDc4LCAweDczLCAweGU1LCAweGI3LCAweDQ5LCAweDIxLCAweGU2LCAweGRhLCAweGIxLCAweDQ1LCAweGI0LAorCTB4MmYsIDB4MzcsIDB4OTEsIDB4YWEsIDB4ODMsIDB4MmQsIDB4ZjgsIDB4MTcsIDB4YzEsIDB4ZTQsIDB4ODIsIDB4MzEsCisJMHgxZSwgMHhhYywgMHgxYSwgMHhlMywgMHg0YywgMHgwMiwgMHhkOCwgMHg2OCwgMHg4OSwgMHhjYywgMHhjOSwgMHgwMSwKKwkweGY2LCAweDY1LCAweDY0LCAweDUyLCAweDM4LCAweGM2LCAweDNhLCAweDhjLCAweDcxLCAweGM3LCAweGRjLCAweDE4LAorCTB4MGYsIDB4MmYsIDB4MWEsIDB4ZTMsIDB4NjEsIDB4OGMsIDB4MTEsIDB4ZjYsIDB4NDIsIDB4MjksIDB4ZDMsIDB4ZTksCisJMHhjZSwgMHhjZiwgMHhmYiwgMHhkNSwgMHgzNSwgMHg3MywgMHhmMywgMHgyOSwgMHhkYywgMHhlYiwgMHg4NCwgMHhmMSwKKwkweGQzLCAweGE2LCAweGQ4LCAweDA4LCAweDc4LCAweDc0LCAweDViLCAweDkwLCAweDcxLCAweDBlLCAweDY0LCAweDViLAorCTB4NzYsIDB4NGQsIDB4OGQsIDB4MWQsIDB4ZmYsIDB4NzYsIDB4OTYsIDB4MmIsIDB4MWIsIDB4MWMsIDB4OWMsIDB4NGMsCisJMHhiOSwgMHg5ZCwgMHg4ZiwgMHhhMCwgMHhiZiwgMHhiZCwgMHg3NiwgMHg1YywgMHhiZCwgMHhlNSwgMHhhYiwgMHgzMSwKKwkweGFlLCAweDBiLCAweGRmLCAweGMxLCAweDE4LCAweGUwLCAweGIzLCAweDlkLCAweGEwLCAweDBmLCAweDljLCAweDE4LAorCTB4OTIsIDB4MDUsIDB4YjIsIDB4ZWIsIDB4MzMsIDB4ZjMsIDB4NzIsIDB4ZDQsIDB4YzAsIDB4NGMsIDB4ZGIsIDB4YmEsCisJMHgzMCwgMHgwNywgMHhmMywgMHhkZCwgMHg4YiwgMHg2MCwgMHhiZSwgMHgxYiwgMHgzMCwgMHhlZiwgMHhiMywgMHhmMywKKwkweGIyLCAweGFmLCAweDZhLCAweGNmLCAweDYyLCAweDQ4LCAweDQ3LCAweGZjLCAweGZkLCAweGJjLCAweGY1LCAweDQ1LAorCTB4M2UsIDB4MjAsIDB4ZjcsIDB4OTcsIDB4M2EsIDB4ZTUsIDB4Y2IsIDB4OTUsIDB4ZTQsIDB4NTksIDB4YzYsIDB4ZDEsCisJMHhjZiwgMHg1NSwgMHg5MiwgMHhlMywgMHgyMiwgMHg1ZCwgMHhmMiwgMHhjNywgMHhiMCwgMHg3MywgMHhhZSwgMHg4MiwKKwkweDZmLCAweGYxLCAweDM0LCAweGZjLCAweGQ3LCAweDNmLCAweGE5LCAweGY4LCAweGYyLCAweGM0LCAweGRjLCAweDdlLAorCTB4MzgsIDB4ZWEsIDB4YmEsIDB4YjQsIDB4OWMsIDB4ODQsIDB4NGYsIDB4YmIsIDB4ZWQsIDB4NjgsIDB4MWIsIDB4ZjcsCisJMHgyYSwgMHgxMSwgMHhiZSwgMHhiYiwgMHhhOCwgMHg3MywgMHhkYSwgMHg5NCwgMHhlNiwgMHhjNSwgMHhlZiwgMHg2MiwKKwkweGJjLCAweGE3LCAweGE5LCAweDZiLCAweGQ2LCAweGZhLCAweGJlLCAweDc3LCAweGIzLCAweDVhLCAweDQ3LCAweDk5LAorCTB4OTAsIDB4ZmYsIDB4NWEsIDB4ZTQsIDB4MDMsIDB4ZjUsIDB4MjYsIDB4YzYsIDB4OTIsIDB4ZjEsIDB4OWEsIDB4YzksCisJMHgxYiwgMHhkYiwgMHgzYSwgMHgxMiwgMHg3ZCwgMHg0MiwgMHg1YiwgMHg4MiwgMHhmZSwgMHgzNiwgMHg2YywgMHhhMSwKKwkweGQyLCAweGU2LCAweGY4LCAweDVhLCAweGExLCAweDRjLCAweGEyLCAweDVkLCAweDk0LCAweDk2LCAweDA5LCAweGMwLAorCTB4M2UsIDB4MDYsIDB4ODksIDB4NTAsIDB4NjgsIDB4ZjYsIDB4NDcsIDB4N2IsIDB4ZDUsIDB4NDQsIDB4MDMsIDB4NzksCisJMHg3MCwgMHhkYiwgMHgxOSwgMHhkMCwgMHhkNywgMHgzNiwgMHg4YywgMHhhOSwgMHgyYiwgMHg3OSwgMHg3NiwgMHg0NiwKKwkweDY1LCAweDRlLCAweGFjLCAweDk1LCAweDU3LCAweDgyLCAweGExLCAweDY2LCAweDQ3LCAweDllLCAweGQ4LCAweGM0LAorCTB4M2MsIDB4MmQsIDB4YjcsIDB4M2YsIDB4ZDUsIDB4MGIsIDB4ZjksIDB4ZDQsIDB4Y2UsIDB4NzMsIDB4MGIsIDB4MDMsCisJMHhmMiwgMHgyZiwgMHg3NywgMHg4MCwgMHgwNiwgMHg3ZiwgMHhiOCwgMHhlOSwgMHg2YiwgMHhjMSwgMHg2YywgMHhiMywKKwkweDJiLCAweDViLCAweDM3LCAweDI1LCAweGJkLCAweGJjLCAweGMyLCAweDc4LCAweDRhLCAweDE4LCAweDRmLCAweDA5LAorCTB4ZTMsIDB4ZTMsIDB4OTgsIDB4NGIsIDB4MTgsIDB4ZDcsIDB4MTUsIDB4ZjcsIDB4NGEsIDB4ZjUsIDB4MmMsIDB4ODgsCisJMHhjYiwgMHgxYSwgMHgzZiwgMHgyZCwgMHg5MywgMHg3NywgMHg2NSwgMHg4MywgMHhkZCwgMHgyYiwgMHgzNSwgMHg1YywKKwkweDFmLCAweGFlLCAweGIxLCAweDY1LCAweDY0LCAweDNjLCAweDI4LCAweGY4LCAweDdmLCAweDcwLCAweDU1LCAweGI2LAorCTB4MmIsIDB4YjYsIDB4NTgsIDB4ZTcsIDB4ZGMsIDB4MzUsIDB4YWYsIDB4NzMsIDB4NDQsIDB4OWUsIDB4MzMsIDB4ZjMsCisJMHg4NiwgMHgzOSwgMHhmMywgMHhiZCwgMHg0OSwgMHg2ZSwgMHg4NiwgMHg4NywgMHgwZSwgMHhkYywgMHhhYSwgMHhmNywKKwkweDNjLCAweDc3LCAweGUwLCAweDliLCAweDM2LCAweGQ1LCAweGE3LCAweGY1LCAweDNhLCAweGUyLCAweDRjLCAweGY5LAorCTB4MWUsIDB4M2IsIDB4NzcsIDB4ZjcsIDB4NjgsIDB4M2QsIDB4YmIsIDB4NzUsIDB4ZDMsIDB4YTUsIDB4ODAsIDB4ZmIsCisJMHhkYywgMHhiYywgMHg0ZCwgMHhjYiwgMHhjNSwgMHgyMiwgMHg2OCwgMHhlZiwgMHhkNSwgMHg2OSwgMHhkZSwgMHhlNywKKwkweDdhLCAweDc2LCAweDQxLCAweDlmLCAweDEzLCAweDAxLCAweGRlLCAweGU2LCAweGUyLCAweDYyLCAweGY1LCAweDQ4LAorCTB4YTMsIDB4YmUsIDB4ZjgsIDB4NjksIDB4ODMsIDB4NTksIDB4NDcsIDB4YTUsIDB4NmMsIDB4NTgsIDB4ODMsIDB4MzQsCisJMHhkNywgMHhlYywgMHgwNSwgMHg1ZSwgMHg5MCwgMHhmNywgMHhkZiwgMHhlYSwgMHhjZCwgMHg5ZSwgMHg4ZiwgMHhlYSwKKwkweGIyLCAweGUwLCAweDMxLCAweGJkLCAweDJmLCAweDg0LCAweGZiLCAweDAzLCAweDdmLCAweDc5LCAweGE1LCAweGIxLAorCTB4NGQsIDB4YzMsIDB4N2MsIDB4YTYsIDB4ZmYsIDB4MzgsIDB4OTgsIDB4ZDAsIDB4MzEsIDB4MzYsIDB4ZjYsIDB4ZjUsCisJMHg0MywgMHhmYywgMHg1ZSwgMHhiYywgMHg1ZiwgMHgyNCwgMHhiNCwgMHg1ZCwgMHhlYiwgMHg0MCwgMHhmNywgMHhkYSwKKwkweDVmLCAweDE2LCAweDk0LCAweDg5LCAweGU3LCAweDI1LCAweDIyLCAweDEzLCAweDU1LCAweDMwLCAweDRlLCAweDEwLAorCTB4ZWUsIDB4NTIsIDB4ZDcsIDB4YWEsIDB4ZjksIDB4ZDgsIDB4ZGQsIDB4NmEsIDB4YTQsIDB4MTEsIDB4YzYsIDB4NzUsCisJMHg4YiwgMHhmMiwgMHhjOCwgMHgxYiwgMHhhZCwgMHgyYiwgMHg0OSwgMHgzNywgMHhkMywgMHhjMiwgMHhiNCwgMHhmOSwKKwkweDMxLCAweGNkLCAweDY4LCAweGZiLCAweGI5LCAweDZkLCAweDk1LCAweGRlLCAweGZiLCAweGM0LCAweDM1LCAweDQ2LAorCTB4YzYsIDB4MDgsIDB4NjMsIDB4MjYsIDB4ZGYsIDB4ZjUsIDB4ZmYsIDB4NTYsIDB4ZDcsIDB4MTksIDB4OWEsIDB4YWIsCisJMHhhMywgMHhlNywgMHgwMiwgMHhmOSwgMHg2ZSwgMHg1NSwgMHg1ZSwgMHgzNSwgMHhkYywgMHhkNCwgMHg1ZiwgMHg0MywKKwkweDlkLCAweDc1LCAweGQwLCAweDg5LCAweDE3LCAweDUzLCAweGFiLCAweGMzLCAweGJkLCAweGYwLCAweGIwLCAweDIxLAorCTB4YjIsIDB4ZDcsIDB4ZDQsIDB4NWEsIDB4OTksIDB4M2YsIDB4ODEsIDB4NzksIDB4N2QsIDB4MjYsIDB4NjUsIDB4NzgsCisJMHg1MSwgMHhmMywgMHg2MSwgMHhmMSwgMHgzNiwgMHhmOCwgMHhlYiwgMHhhMSwgMHhkZSwgMHhhMCwgMHg5YywgMHgyNiwKKwkweDZmLCAweDIyLCAweGFkLCAweDQyLCAweDlmLCAweGUwLCAweGMyLCAweGVhLCAweDk5LCAweGFlLCAweDU3LCAweDAzLAorCTB4ZWUsIDB4YjMsIDB4N2MsIDB4NDUsIDB4ZGIsIDB4NTEsIDB4NDMsIDB4YjIsIDB4YjAsIDB4ZWQsIDB4ZDEsIDB4N2IsCisJMHg1ZSwgMHhiZiwgMHhlZCwgMHhhMSwgMHg2NSwgMHhkYSwgMHgxZSwgMHhiMiwgMHg2ZCwgMHg4YiwgMHg2YiwgMHhkYSwKKwkweDhlLCAweDVlLCAweGExLCAweGVkLCAweDgxLCAweDM3LCAweDY4LCAweDdiLCAweDcwLCAweDk5LCAweGI2LCAweDA3LAorCTB4YzMsIDB4YjYsIDB4OTUsIDB4NjksIDB4ZGIsIDB4MGIsIDB4ZGIsIDB4NGUsIDB4MmMsIDB4YzIsIDB4YzksIDB4NjcsCisJMHg1ZSwgMHhiZiwgMHhlZCwgMHg3ZCwgMHhjYiwgMHhiNCwgMHhiZCwgMHg2ZiwgMHgxMSwgMHhkYywgMHhjNCwgMHg0OSwKKwkweDJkLCAweDc0LCAweGZmLCAweDNkLCAweGRhLCAweGU2LCAweGFjLCAweDAzLCAweGRmLCAweDVjLCAweDg0LCAweGZjLAorCTB4MzYsIDB4ZmUsIDB4YzgsIDB4ODUsIDB4YmIsIDB4NjYsIDB4Y2IsIDB4ZTAsIDB4MmIsIDB4ZjgsIDB4ZDcsIDB4OTksCisJMHg3MiwgMHgwMywgMHg5ZSwgMHg3MSwgMHhkOCwgMHgzMywgMHgyOCwgMHgwNywgMHg3YiwgMHhiYywgMHgyNiwgMHgxZCwKKwkweGM4LCAweGM5LCAweDZlLCAweDk2LCAweGNkLCAweGM3LCAweDZiLCAweGU3LCAweGY0LCAweGM2LCAweDNkLCAweGU4LAorCTB4OGYsIDB4NmQsIDB4ZmIsIDB4NWUsIDB4YmYsIDB4YmMsIDB4YTYsIDB4ZmIsIDB4Y2IsIDB4OTUsIDB4ZTksIDB4OGYsCisJMHgyMSwgMHhiZCwgMHg0MiwgMHgxZiwgMHg5NywgMHhmNSwgMHg0MiwgMHgxOSwgMHg1OCwgMHg2NywgMHhkNywgMHgzZSwKKwkweDY4LCAweDZiLCAweDMyLCAweDBlLCAweGE3LCAweGVkLCAweDUxLCAweDI5LCAweDk0LCAweDdmLCAweDEyLCAweDRjLAorCTB4ODMsIDB4MmUsIDB4NDYsIDB4ZTYsIDB4NzQsIDB4YzgsIDB4OTMsIDB4YWIsIDB4NjgsIDB4YjMsIDB4OGYsIDB4NTMsCisJMHhiMywgMHg1NCwgMHhjNSwgMHhhMCwgMHg0NiwgMHg3YywgMHhhNiwgMHhmZCwgMHg5OCwgMHg2ZCwgMHhjMiwgMHgwZSwKKwkweDBjLCAweGNiLCAweDMyLCAweDZlLCAweDZjLCAweDYyLCAweDRlLCAweDY3LCAweDIxLCAweDMzLCAweGNkLCAweDllLAorCTB4MGUsIDB4ZmEsIDB4MmEsIDB4NGYsIDB4ODEsIDB4OTcsIDB4ZjcsIDB4NDMsIDB4NzYsIDB4MjQsIDB4ZjMsIDB4MjIsCisJMHgzZCwgMHg4ZCwgMHhlNiwgMHhhYywgMHg0NSwgMHg0YywgMHg3MiwgMHg1ZCwgMHhiZiwgMHg2OSwgMHhmMSwgMHhiOCwKKwkweGVmLCAweGNlLCAweGU1LCAweGNmLCAweDU5LCAweDQwLCAweDNlLCAweDM4LCAweDk0LCAweDkxLCAweGQ3LCAweDM3LAorCTB4OWEsIDB4NzUsIDB4YmIsIDB4YjcsIDB4MzYsIDB4MzIsIDB4MWUsIDB4YTMsIDB4MzYsIDB4NzUsIDB4YWYsIDB4ZDYsCisJMHhmMiwgMHhjNywgMHgwOSwgMHhiZiwgMHhiZiwgMHhiMiwgMHhlOCwgMHgzYiwgMHhhYywgMHhmNywgMHg5MywgMHhkNSwKKwkweDBiLCAweGViLCAweDg1LCAweGU5LCAweDcwLCAweDRkLCAweDE2LCAweGE0LCAweDFmLCAweDU4LCAweGIzLCAweGIwLAorCTB4N2UsIDB4YWMsIDB4NjksIDB4ZTEsIDB4ZjcsIDB4ZTAsIDB4YTIsIDB4ZWYsIDB4Y2YsIDB4MmMsIDB4ZmEsIDB4N2UsCisJMHg2MSwgMHhkMSwgMHhmNywgMHg3NSwgMHg2YiwgMHgxNywgMHg5NSwgMHg1ZiwgMHhmNCwgMHhmZCwgMHhlNSwgMHhiNSwKKwkweGNiLCAweGMzLCAweGZiLCAweDU3LCAweDZiLCAweDE3LCAweGMyLCAweGY1LCAweDk0LCAweDVlLCAweDczLCAweDFkLAorCTB4YWYsIDB4YjgsIDB4YjIsIDB4YmQsIDB4ODgsIDB4N2MsIDB4ZTcsIDB4ZDYsIDB4MTgsIDB4ZjIsIDB4ZTEsIDB4Y2IsCisJMHg1NCwgMHhlNywgMHg3MywgMHg4ZCwgMHhlMywgMHgxZCwgMHhiMSwgMHg4NSwgMHhlZCwgMHhjZCwgMHhkNywgMHhkYiwKKwkweDMxLCAweDVmLCAweDJmLCAweDM1LCAweDVmLCAweGNmLCAweGY4LCAweDIzLCAweDEzLCAweDE1LCAweGU2LCAweDMxLAorCTB4M2QsIDB4NmMsIDB4ZDcsIDB4ZDQsIDB4MWQsIDB4MjksIDB4NzksIDB4ZmEsIDB4M2MsIDB4YzIsIDB4ODAsIDB4M2UsCisJMHg4ZiwgMHg5MCwgMHg4MCwgMHg2ZiwgMHhmNCwgMHg5NCwgMHg4ZSwgMHhlYiwgMHhhZiwgMHg1MSwgMHg0OCwgMHhhZiwKKwkweDM0LCAweGVhLCAweGQ4LCAweGJlLCAweGU4LCAweDMzLCAweDA5LCAweDAzLCAweGIwLCAweGI5LCAweDc4LCAweDBlLAorCTB4MjEsIDB4OTAsIDB4OWQsIDB4MjksIDB4ZjMsIDB4MzYsIDB4ZTcsIDB4MTIsIDB4MGUsIDB4MDcsIDB4YmQsIDB4NWUsCisJMHgxMCwgMHgwYywgMHhmYiwgMHg2NywgMHhhZCwgMHgyYywgMHhjNywgMHhiYiwgMHg2MiwgMHhlYSwgMHhkMCwgMHhkNywKKwkweDdjLCAweDE0LCAweGZhLCAweDY2LCAweGRlLCAweGM3LCAweDdjLCAweDhhLCAweGY2LCAweDNhLCAweDY4LCAweGE2LAorCTB4MWIsIDB4N2EsIDB4MzcsIDB4ZjksIDB4YTQsIDB4NjgsIDB4ZGQsIDB4ZDEsIDB4MDUsIDB4OWQsIDB4ZWIsIDB4ZGQsCisJMHhmYiwgMHgzZSwgMHhkOCwgMHgzYSwgMHg1ZiwgMHgwNiwgMHhhZCwgMHgxZiwgMHg0YiwgMHhmNSwgMHg2OCwgMHhmZiwKKwkweGZmLCAweDFjLCAweDc0LCAweDMxLCAweGUzLCAweDg0LCAweDhmLCAweDY5LCAweGRhLCAweDIyLCAweDhkLCAweDM1LAorCTB4ZTgsIDB4YjMsIDB4NTAsIDB4MjcsIDB4NTMsIDB4NGUsIDB4MzQsIDB4ZGIsIDB4NzUsIDB4ZGUsIDB4YzQsIDB4Y2QsCisJMHg1MywgMHhlZCwgMHhkZSwgMHg3MywgMHhlMCwgMHhiNSwgMHg3ZSwgMHg3ZiwgMHgwMywgMHg2YywgMHg2NiwgMHhkMSwKKwkweDNhLCAweGJmLCAweDUwLCAweDVhLCAweDZmLCAweDZkLCAweDgzLCAweDY2LCAweDE5LCAweDc3LCAweGI5LCAweDU2LAorCTB4OTMsIDB4ZWMsIDB4MTksIDB4MzIsIDB4M2UsIDB4NjYsIDB4M2MsIDB4YTEsIDB4MTgsIDB4MjMsIDB4ZTYsIDB4ZmEsCisJMHgwNSwgMHhjZiwgMHgzOSwgMHg3MCwgMHg5ZCwgMHg5YiwgMHhmMSwgMHg5MCwgMHhmMSwgMHg3YiwgMHg0NywgMHhmYywKKwkweGJjLCAweDE3LCAweGIxLCAweDY3LCAweDIzLCAweGIyLCAweDQ1LCAweDQzLCAweDliLCAweDdiLCAweGI0LCAweGFkLAorCTB4MWEsIDB4MDUsIDB4M2YsIDB4N2QsIDB4MGYsIDB4NzQsIDB4Y2YsIDB4YmEsIDB4YTQsIDB4ZmQsIDB4ZWYsIDB4MDQsCisJMHg5MywgMHhhZSwgMHg4OSwgMHg0ZiwgMHgyOSwgMHhkNCwgMHhjYiwgMHg2YSwgMHg1YywgMHgzZCwgMHgyNSwgMHgwNywKKwkweDRhLCAweGU0LCAweGZmLCAweGE4LCAweDk2LCAweGU1LCAweGJiLCAweDUzLCAweDk0LCAweDA3LCAweDUxLCAweGUwLAorCTB4NzEsIDB4MGEsIDB4ZjgsIDB4NmIsIDB4OTAsIDB4ZGQsIDB4NWQsIDB4NDUsIDB4OTQsIDB4ODksIDB4YzgsIDB4ZDAsCisJMHg0MCwgMHgwMywgMHg3OCwgMHg4ZiwgMHg3NiwgMHgwOSwgMHhkZiwgMHgyZSwgMHhjYSwgMHg3YiwgMHgzMiwgMHg1NSwKKwkweDFjLCAweGQ3LCAweDdiLCAweDllLCAweDFmLCAweDQzLCAweGRkLCAweGM3LCAweGYxLCAweDRjLCAweDE0LCAweGNiLAorCTB4YTgsIDB4ZjMsIDB4YjAsIDB4MmUsIDB4M2YsIDB4MzEsIDB4Y2EsIDB4NzMsIDB4MjIsIDB4MDIsIDB4N2IsIDB4ZmYsCisJMHg0OSwgMHgyOSwgMHg0YywgMHhiNiwgMHhjMSwgMHgyZiwgMHg5OSwgMHgxZSwgMHg3NywgMHhlNywgMHhlMiwgMHhlNCwKKwkweGZmLCAweGE1LCAweDkxLCAweGViLCAweGNjLCAweDg1LCAweGViLCAweGI4LCAweDI3LCAweDQ3LCAweGRjLCAweDgxLAorCTB4Y2QsIDB4YWEsIDB4YjMsIDB4NDksIDB4YWYsIDB4ZjksIDB4ZjQsIDB4NDgsIDB4M2YsIDB4NmMsIDB4OGEsIDB4OWIsCisJMHgyYiwgMHhjZiwgMHhjNCwgMHhjYywgMHhkYSwgMHhjMCwgMHg4MiwgMHhmNSwgMHg4NiwgMHhjMywgMHhjNCwgMHg4YSwKKwkweDNhLCAweGVhLCAweGYyLCAweGRjLCAweGE3LCAweDRjLCAweDljLCAweDgxLCAweGY2LCAweDM5LCAweDFhLCAweGFlLAorCTB4ZTcsIDB4MzAsIDB4Y2QsIDB4OTMsIDB4YjYsIDB4ZWIsIDB4MDAsIDB4ZDcsIDB4OTksIDB4N2YsIDB4ZDIsIDB4ZjIsCisJMHhmNSwgMHg4OSwgMHg0ZCwgMHg2MSwgMHg1ZiwgMHhmOSwgMHg2MCwgMHg2YywgMHg1MywgMHg1ZSwgMHgzZSwgMHg4MSwKKwkweDI3LCAweDc3LCAweDVkLCAweDcyLCAweDM0LCAweGFiLCAweGQ4LCAweGVmLCAweDM3LCAweDAyLCAweGM2LCAweDAyLAorCTB4NTQsIDB4YmEsIDB4NTUsIDB4ZjIsIDB4NGQsIDB4ZDUsIDB4ZmQsIDB4MzMsIDB4YWQsIDB4YzMsIDB4MmIsIDB4YTgsCisJMHhkNywgMHg4MywgMHg2MywgMHgyNiwgMHgxMSwgMHgwMywgMHgwZSwgMHhmMiwgMHg2ZiwgMHgwOCwgMHhjZiwgMHgxNiwKKwkweGNmLCAweDU3LCAweGNiLCAweGMxLCAweDczLCAweGMyLCAweGFlLCAweGQ3LCAweDcwLCAweDBkLCAweDY2LCAweDA1LAorCTB4ZjAsIDB4ZDIsIDB4ODAsIDB4ZjQsIDB4MDksIDB4MTksIDB4MzksIDB4ZmUsIDB4M2IsIDB4MzEsIDB4ZWUsIDB4MTcsCisJMHhhYSwgMHhkMSwgMHg3ZSwgMHhmNSwgMHg3ZCwgMHhmNSwgMHgyNiwgMHgwNiwgMHhmMiwgMHgyYywgMHhjYSwgMHgzMCwKKwkweDdmLCAweDFjLCAweDc1LCAweDkyLCAweGY5LCAweDZjLCAweDY0LCAweGFkLCAweDBjLCAweGU5LCAweDdlLCAweDgzLAorCTB4NDgsIDB4ZGIsIDB4YjYsIDB4N2EsIDB4YmQsIDB4NGYsIDB4NWYsIDB4Y2UsIDB4MzAsIDB4NmUsIDB4MTEsIDB4ZDYsCisJMHg3ZCwgMHg1NiwgMHhlZiwgMHg4MywgMHg3MywgMHhkMywgMHhjOSwgMHg3YywgMHg1ZiwgMHg4NCwgMHhmMiwgMHhhOSwKKwkweDUzLCAweDdhLCAweGI5LCAweGNlLCAweDczLCAweDY2LCAweDVjLCAweGQzLCAweDc2LCAweGZiLCAweDI2LCAweDllLAorCTB4MDcsIDB4ZGQsIDB4MDIsIDB4ZmIsIDB4ZWYsIDB4M2IsIDB4ODAsIDB4ODksIDB4MzAsIDB4OWUsIDB4NDAsIDB4M2EsCisJMHg3YywgMHhjMiwgMHhkNywgMHg4NSwgMHg2MSwgMHhmYSwgMHg0ZCwgMHhjMiwgMHgzMCwgMHhmZCwgMHgyNiwgMHg2MSwKKwkweDIwLCAweDJlLCAweDAwLCAweDQ3LCAweGE1LCAweDdkLCAweDc1LCAweDY4LCAweDUzLCAweDVjLCAweDg1LCAweDcxLAorCTB4MWMsIDB4MmMsIDB4NGQsIDB4YzMsIDB4YmYsIDB4ZDUsIDB4MzEsIDB4OTQsIDB4Y2UsIDB4NjksIDB4NDUsIDB4OWUsCisJMHhmNywgMHhjMCwgMHg3MywgMHhlMCwgMHhhZCwgMHgxMiwgMHg3OCwgMHgwZiwgMHhiNiwgMHhlMSwgMHg5NywgMHg2MSwKKwkweDFiLCAweDNlLCAweDAxLCAweGRiLCAweGYwLCAweDFjLCAweDZjLCAweGMzLCAweGM3LCAweDMxLCAweDM3LCAweDhmLAorCTB4MmQsIDB4ZTAsIDB4ZDUsIDB4OGMsIDB4ZTYsIDB4ZDUsIDB4NDIsIDB4ZTksIDB4MDIsIDB4NzgsIDB4YjUsIDB4ZWIsCisJMHgwYSwgMHhmYywgMHhlOCwgMHhjMiwgMHhjNiwgMHhhNywgMHgwZCwgMHhlZCwgMHhjMCwgMHg5NiwgMHhmZiwgMHhiOCwKKwkweGY2LCAweDhiLCAweDFmLCAweDRjLCAweDhkLCAweGIxLCAweDBlLCAweDY4LCAweDM4LCAweDQ5LCAweDlmLCAweDE2LAorCTB4ZjIsIDB4M2YsIDB4OTksIDB4MDcsIDB4ZWYsIDB4NjEsIDB4YWMsIDB4OGUsIDB4YTMsIDB4YWUsIDB4NWIsIDB4MjMsCisJMHhkNCwgMHgxZiwgMHhlZSwgMHgzNiwgMHhlZSwgMHhlZiwgMHhlNiwgMHg1OCwgMHgxMywgMHg4YiwgMHhmMCwgMHg2NCwKKwkweGY4LCAweDczLCAweDhmLCAweDRmLCAweDNkLCAweDQyLCAweGJlLCAweDRjLCAweDdjLCAweDc2LCAweGM0LCAweGFmLAorCTB4ZTYsIDB4YzUsIDB4MWQsIDB4MWMsIDB4NWYsIDB4ZTAsIDB4NmQsIDB4NWEsIDB4YWUsIDB4ZWUsIDB4N2MsIDB4ZjksCisJMHgzNSwgMHg3MywgMHhlNSwgMHg3NSwgMHhmZiwgMHhhMywgMHhlNCwgMHgzNywgMHhlOCwgMHg2ZSwgMHhlMiwgMHgzZSwKKwkweDkxLCAweDhkLCAweDZjLCAweGIwLCAweGI4LCAweGRmLCAweDJmLCAweDZkLCAweGRiLCAweDYwLCAweGFmLCAweDBmLAorCTB4ODIsIDB4N2UsIDB4YTcsIDB4MDIsIDB4ZjEsIDB4YjcsIDB4ODUsIDB4NmQsIDB4Y2UsIDB4YjcsIDB4ZTMsIDB4ZDksCisJMHg3NiwgMHg3NiwgMHhjMywgMHg5NiwgMHhlZCwgMHhkYiwgMHhjNCwgMHhiNSwgMHg1ZSwgMHhkOCwgMHhmMiwgMHhhOSwKKwkweDcwLCAweDNlLCAweDYwLCAweGY5LCAweGVhLCAweDM5LCAweGE3LCAweDBjLCAweGE1LCAweGVjLCAweDZjLCAweGIwLAorCTB4ZjEsIDB4N2UsIDB4YjYsIDB4NzcsIDB4NjEsIDB4ZDEsIDB4M2MsIDB4NWQsIDB4MGEsIDB4NzgsIDB4Y2UsIDB4NzYsCisJMHhjNCwgMHgxZiwgMHhhYiwgMHhhMiwgMHg5NSwgMHhiZiwgMHhiMiwgMHhiNCwgMHhhMiwgMHgxNiwgMHg4ZCwgMHhlMywKKwkweDljLCAweGE1LCAweDk1LCAweDEwLCAweGRlLCAweDU4LCAweDQ4LCAweDJiLCAweDc1LCAweDIxLCAweGFkLCAweGU0LAorCTB4YzcsIDB4NDMsIDB4NWEsIDB4NjEsIDB4ZGQsIDB4NzMsIDB4MjEsIDB4YWQsIDB4MjQsIDB4YWEsIDB4NjksIDB4MjUsCisJMHgzZiwgMHhlZSwgMHhlMCwgMHg1OSwgMHgwYywgMHgwNywgMHhlOSwgMHg4NSwgMHhlZCwgMHg5MCwgMHg1ZSwgMHgwMCwKKwkweDRiLCAweGE1LCAweDMyLCAweDQ3LCAweDJmLCAweDMxLCAweGI0LCAweDczLCAweGE4LCAweGE0LCAweDM0LCAweGFkLAorCTB4MGMsIDB4YTksIDB4NTAsIDB4NDcsIDB4NzgsIDB4OTgsIDB4NzMsIDB4Y2MsIDB4ZmQsIDB4MTUsIDB4NjksIDB4MjQsCisJMHg2NSwgMHg2OSwgMHg2NCwgMHhmZSwgMHgyYywgMHhkMSwgMHgyMiwgMHhkYSwgMHgwMCwgMHhlZSwgMHg3OSwgMHg1ZSwKKwkweDYwLCAweGIzLCAweGE2LCAweDhkLCAweGZiLCAweDUzLCAweDJmLCAweGEwLCAweGVjLCAweDI4LCAweDY4LCAweDIzLAorCTB4YzQsIDB4YzEsIDB4MDMsIDB4MTYsIDB4MDcsIDB4OGIsIDB4ZTcsIDB4ZjIsIDB4YjQsIDB4YzUsIDB4YzEsIDB4YTgsCisJMHhjNSwgMHg4MSwgMHhlNiwgMHg5NywgMHgzYywgMHhlNywgMHg0YywgMHg2OSwgMHgxYywgMHhkNCwgMHg2OSwgMHgxYywKKwkweDg4LCAweDBhLCAweGViLCAweDllLCAweDVlLCAweDA2LCAweDA3LCAweDJjLCAweDMzLCAweGFhLCAweGM3LCAweDFmLAorCTB4YzEsIDB4ZjgsIDB4ZjcsIDB4NjEsIDB4ZmMsIDB4NGEsIDB4OGYsIDB4OWYsIDB4ZjMsIDB4YzAsIDB4ZjEsIDB4MDMsCisJMHg5NiwgMHhjYSwgMHg3NywgMHhlNiwgMHhjNiwgMHhkZiwgMHg4NCwgMHgzNiwgMHgwZSwgMHg2YSwgMHhkYiwgMHg5OSwKKwkweGYxLCAweDU0LCAweGVhLCAweDQ2LCAweDMzLCAweGZlLCAweGM3LCAweDJhLCAweGU2LCAweDhjLCAweGM5LCAweDYzLAorCTB4NGIsIDB4ZjQsIDB4ZDgsIDB4MGIsIDB4OTYsIDB4MzcsIDB4N2MsIDB4YmQsIDB4Y2UsIDB4YzYsIDB4NzMsIDB4NmQsCisJMHhlNywgMHhhMCwgMHhiYiwgMHhjNiwgMHg1MiwgMHgwOSwgMHg3YiwgMHhlNiwgMHhkNCwgMHhkOCwgMHg0MywgMHg1ZiwKKwkweDRkLCAweDkxLCAweDc3LCAweDNlLCAweGFhLCAweGY3LCAweGZhLCAweDlkLCAweGE1LCAweDVkLCAweDU0LCAweDZhLAorCTB4OTIsIDB4YmUsIDB4YjEsIDB4NmEsIDB4YjgsIDB4MDksIDB4NmYsIDB4M2UsIDB4NTAsIDB4M2UsIDB4NjMsIDB4MzcsCisJMHhmYiwgMHhhMSwgMHgzYiwgMHg0YywgMHhkYywgMHgxYSwgMHhiNCwgMHg4NCwgMHhmNCwgMHg2NCwgMHhiZSwgMHgzNywKKwkweDUyLCAweDI3LCAweGVhLCAweDgxLCAweDBmLCAweDYwLCAweGNjLCAweDJlLCAweDdjLCAweGNjLCAweDc2LCAweDZmLAorCTB4OWIsIDB4YTIsIDB4YWUsIDB4YmIsIDB4YmEsIDB4NGEsIDB4ZDcsIDB4MzUsIDB4NWIsIDB4NWQsIDB4YjcsIDB4ODYsCisJMHhiYSwgMHgwZSwgMHg3MCwgMHgzZiwgMHgyNSwgMHg4NywgMHg0YiwgMHg5YywgMHhiZiwgMHg3YywgMHhhMiwgMHg0ZSwKKwkweGM3LCAweDQwLCAweDFkLCAweDFiLCAweGU3LCAweDRiLCAweGM2LCAweDBmLCAweDZiLCAweDVhLCAweGE2LCAweGNlLAorCTB4NGEsIDB4ZWEsIDB4YjgsIDB4ZTQsIDB4NGMsIDB4ZDcsIDB4M2YsIDB4ZDksIDB4NzUsIDB4MTAsIDB4ZWEsIDB4YjUsCisJMHhlZiwgMHgwNywgMHg3ZiwgMHhiMCwgMHg4YywgMHg1ZSwgMHg4MywgMHhmZSwgMHhkMSwgMHhmNiwgMHg1OSwgMHgwZCwKKwkweDY0LCAweGFkLCAweDljLCAweDZhLCAweGM2LCAweGIzLCAweDlhLCAweGU3LCAweGMxLCAweDNhLCAweDNiLCAweDU0LAorCTB4YmQsIDB4ZDQsIDB4OWMsIDB4NmEsIDB4OTQsIDB4M2QsIDB4NjMsIDB4N2EsIDB4ZGQsIDB4NWMsIDB4ZDQsIDB4MjksCisJMHhlMCwgMHhmZiwgMHgxNCwgMHhjZiwgMHgxNCwgMHg4OCwgMHgzZSwgMHgwMywgMHg5NSwgMHgxYiwgMHg4NSwgMHgzZiwKKwkweDMzLCAweGYxLCAweDk0LCAweGQ5LCAweDFiLCAweDM4LCAweDU2LCAweGEzLCAweDdmLCAweGQzLCAweGM2LCAweDI4LAorCTB4YTQsIDB4MzIsIDB4ZmEsIDB4ZWMsIDB4ZDAsIDB4MWUsIDB4YjQsIDB4ZDksIDB4YmUsIDB4YTksIDB4MTYsIDB4NjMsCisJMHg4ZSwgMHhhMSwgMHgyZSwgMHhmNywgMHgxNiwgMHhhYSwgMHgzNiwgMHg1NywgMHg2YSwgMHhjNSwgMHg5ZCwgMHg4OCwKKwkweGVhLCAweGYzLCAweDRiLCAweDNjLCAweDdmLCAweDlmLCAweGVkLCAweDY5LCAweDQyLCAweDVlLCAweDQ0LCAweGFmLAorCTB4MTUsIDB4ZDQsIDB4OWMsIDB4OWEsIDB4M2YsIDB4YTcsIDB4YWUsIDB4OGUsIDB4OGEsIDB4NWQsIDB4YzMsIDB4NGYsCisJMHg2YiwgMHhiZCwgMHgxMiwgMHgzOSwgMHg0YSwgMHg5ZCwgMHhjMywgMHhmZCwgMHg1NSwgMHgzZCwgMHg5OCwgMHhmNywKKwkweGU1LCAweGY0LCAweDhkLCAweDMxLCAweDYyLCAweGIzLCAweDk4LCAweDNmLCAweDc1LCAweDg2LCAweDY3LCAweDhkLAorCTB4NWIsIDB4ZjEsIDB4MGUsIDB4ZGIsIDB4MGIsIDB4ZjUsIDB4MDgsIDB4NzQsIDB4ZGYsIDB4ZGIsIDB4M2YsIDB4ZTEsCisJMHg0OSwgMHgzZCwgMHhmMCwgMHgzZCwgMHhhMSwgMHg4MCwgMHg2YiwgMHg1NywgMHhkMywgMHg0MiwgMHg1ZSwgMHg4NSwKKwkweGIxLCAweDY5LCAweDQzLCAweDBmLCAweDhmLCAweGJmLCAweDIxLCAweDNmLCAweDkwLCAweDI2LCAweDNhLCAweDZkLAorCTB4NmMsIDB4YzEsIDB4YjcsIDB4MzEsIDB4N2UsIDB4ZDIsIDB4YjYsIDB4YTEsIDB4ODcsIDB4NDcsIDB4NTMsIDB4MTksCisJMHhjNSwgMHhiZCwgMHg1MSwgMHg2NiwgMHgxZCwgMHg5NCwgMHhiNCwgMHg0MSwgMHg5YSwgMHg0ZiwgMHhlOCwgMHhmNSwKKwkweGQxLCAweDhjLCAweGJjLCAweDJjLCAweDk5LCAweGE2LCAweDc2LCAweGQ4LCAweDVkLCAweGZmLCAweGI2LCAweDczLAorCTB4NmMsIDB4ZWUsIDB4MmUsIDB4ZDAsIDB4MzQsIDB4MDcsIDB4ZGQsIDB4YzQsIDB4N2QsIDB4Y2EsIDB4OWQsIDB4ZjIsCisJMHg1ZSwgMHg5ZSwgMHg1NywgMHg5OCwgMHg3MCwgMHhhMCwgMHg5NCwgMHg5ZiwgMHhkMiwgMHg3YiwgMHhiZiwgMHg3NywKKwkweDE0LCAweDU3LCAweGNiLCAweGFkLCAweGE5LCAweGE4LCAweDVkLCAweGU3LCAweGFjLCAweDA1LCAweDFkLCAweDQwLAorCTB4NTAsIDB4OWYsIDB4YWEsIDB4YzUsIDB4MTMsIDB4NzUsIDB4MzgsIDB4N2YsIDB4MTcsIDB4NTMsIDB4OTksIDB4YTQsCisJMHgyMiwgMHhiMywgMHhjMywgMHhlNywgMHg5ZiwgMHg5MSwgMHgyZCwgMHhkZSwgMHgxZSwgMHg3ZCwgMHhjZSwgMHg0ZSwKKwkweDljLCAweGJhLCAweDUzLCAweDdmLCAweGU5LCAweGQxLCAweDA2LCAweDI1LCAweGZkLCAweGNjLCAweGY4LCAweGI1LAorCTB4N2EsIDB4NWQsIDB4YWIsIDB4M2YsIDB4MTUsIDB4MDQsIDB4MzksIDB4Y2MsIDB4NWYsIDB4NDEsIDB4NGMsIDB4ZmMsCisJMHg2YywgMHhjMiwgMHg2NywgMHgxYSwgMHhmZCwgMHhkYSwgMHgwNiwgMHhhNywgMHhmNiwgMHg0YywgMHhhMywgMHg2MywKKwkweDY4LCAweDQ1LCAweDIyLCAweDJhLCAweDVkLCAweGVmLCAweGQ0LCAweDljLCAweGJhLCAweDkzLCAweDczLCAweDA2LAorCTB4YmEsIDB4ZjIsIDB4MWMsIDB4NDMsIDB4NTcsIDB4MzEsIDB4NjcsIDB4OWUsIDB4YWUsIDB4ZDYsIDB4ZDksIDB4ZGYsCisJMHgyYSwgMHg1ZCwgMHgyNywgMHg5OSwgMHg2NCwgMHgxZCwgMHhjNiwgMHhkYiwgMHg1YiwgMHgwYywgMHg2MSwgMHgzYywKKwkweDBjLCAweGI4LCAweDA4LCAweGNmLCAweGRkLCAweDE4LCAweGMzLCAweDMwLCAweDllLCAweDNjLCAweDYwLCAweDAxLAorCTB4YjMsIDB4OWYsIDB4MmEsIDB4MDAsIDB4ZTYsIDB4ODMsIDB4NzgsIDB4MTgsIDB4MjcsIDB4NmIsIDB4NzYsIDB4MjIsCisJMHgxMywgMHhkNSwgMHhmMCwgMHgxMiwgMHhjNiwgMHgxZiwgMHg1YiwgMHg3OCwgMHg1ZiwgMHgwZiwgMHg1NiwgMHg0ZiwKKwkweDY2LCAweGJhLCAweDhiLCAweDgwLCAweDg3LCAweDcwLCAweGRlLCAweDA3LCAweDE4LCAweDY5LCAweDk3LCAweDhlLAorCTB4ZTIsIDB4ZGIsIDB4MDMsIDB4N2MsIDB4NjMsIDB4MTYsIDB4MjYsIDB4ZDAsIDB4ZTMsIDB4ZDgsIDB4NDMsIDB4ZjMsCisJMHhiZiwgMHg4YiwgMHhiNCwgMHg5MywgMHg4ZiwgMHhkOSwgMHhlZiwgMHhkNiwgMHg0NSwgMHgzMiwgMHhlMCwgMHgxNSwKKwkweDg3LCAweDc4LCAweDFlLCAweDI5LCAweGJkLCAweGU2LCAweGMwLCAweDBlLCAweDAwLCAweGRmLCAweGJmLCAweGU0LAorCTB4NDQsIDB4Y2UsIDB4YzQsIDB4ZTUsIDB4NTAsIDB4OTEsIDB4MzEsIDB4ODQsIDB4ZTMsIDB4MGUsIDB4ZTcsIDB4NDEsCisJMHhmOSwgMHg1NywgMHhhMSwgMHg0YywgMHg1YywgMHhjOSwgMHhjNCwgMHhkNSwgMHg3OCwgMHhkZSwgMHg4MiwgMHg2NywKKwkweDAzLCAweDllLCAweDhkLCAweDc4LCAweGQ2LCAweGUzLCAweDY5LCAweGM1LCAweGYzLCAweDJkLCAweDk0LCAweDUzLAorCTB4YjEsIDB4M2EsIDB4ZTEsIDB4N2UsIDB4ZDUsIDB4MTYsIDB4YTUsIDB4MzQsIDB4MWYsIDB4NzEsIDB4Y2YsIDB4YzIsCisJMHg2NSwgMHhjMCwgMHhlNSwgMHgyYiwgMHhkMCwgMHgzYiwgMHgxZSwgMHg5ZSwgMHhmMSwgMHhmOCwgMHgzYSwgMHhmYSwKKwkweDk4LCAweGM1LCAweGQzLCAweGE5LCAweGU0LCAweDRjLCAweDE3LCAweDllLCAweDE0LCAweDllLCAweDZlLCAweDNjLAorCTB4M2QsIDB4NzgsIDB4ZDIsIDB4NzgsIDB4NWUsIDB4NzUsIDB4MGMsIDB4Y2YsIDB4NWQsIDB4MDIsIDB4YmUsIDB4NDIsCisJMHgxZSwgMHgwMSwgMHhjZSwgMHgxNywgMHhmMCwgMHg5YywgMHhlNywgMHhiYywgMHgwOSwgMHg5ZSwgMHg3MywgMHgyYywKKwkweGNmLCAweDM5LCAweGYzLCAweDNjLCAweDU3LCAweGViLCAweGE4LCAweDYzLCAweGY1LCAweDRlLCAweGU0LCAweDE4LAorCTB4N2QsIDB4ODUsIDB4NWEsIDB4YzcsIDB4ZjAsIDB4N2YsIDB4NDQsIDB4N2EsIDB4MDcsIDB4NDEsIDB4NGIsIDB4YzcsCisJMHgzMCwgMHg2NywgMHhjNywgMHg0OCwgMHg1NywgMHgyZSwgMHhkMiwgMHhjNywgMHgxNiwgMHhmNSwgMHgzYiwgMHhmYSwKKwkweDI2LCAweGZhLCAweDNkLCAweDYxLCAweGZiLCAweDdkLCAweGI4LCAweGFhLCAweGRmLCAweDgzLCAweDY4LCAweGZiLAorCTB4M2UsIDB4ZGIsIDB4ZWYsIDB4YzEsIDB4YWEsIDB4N2UsIDB4NDEsIDB4MmIsIDB4YzcsIDB4ZjIsIDB4NzgsIDB4NDgsCisJMHgxNywgMHgyMywgMHg0OCwgMHgwZiwgMHg2NSwgMHhjMiwgMHhkZCwgMHg2YiwgMHhhNCwgMHhiZSwgMHg0NiwgMHg5ZiwKKwkweDI3LCAweDhkLCAweGY5LCAweDM1LCAweDczLCAweGJhLCAweDMxLCAweDUzLCAweGE1LCAweDFmLCAweDdlLCAweDE2LAorCTB4ZmQsIDB4MzgsIDB4NWMsIDB4YTIsIDB4OGQsIDB4MzgsIDB4NWQsIDB4MjUsIDB4MTcsIDB4ZTgsIDB4ZmIsIDB4MDQsCisJMHg3MiwgMHg1YywgMHhmYiwgMHgzOSwgMHhmNCwgMHg3OSwgMHhlOCwgMHhmZiwgMHgyYywgMHhiNiwgMHhhZCwgMHgzZSwKKwkweGFlLCAweGY3LCAweGU3LCAweGRlLCAweDU1LCAweDZjLCAweDk1LCAweDRmLCAweDE0LCAweDY5LCAweDEzLCAweDkyLAorCTB4NWUsIDB4ODIsIDB4NjAsIDB4Y2YsIDB4MzYsIDB4ZGEsIDB4YTcsIDB4ZjksIDB4NjAsIDB4OWQsIDB4OWYsIDB4ZDQsCisJMHhiMSwgMHhiNSwgMHg0ZiwgMHgyZSwgMHhkNSwgMHgxOSwgMHhhMywgMHhiZCwgMHhmMCwgMHhjZCwgMHhiMywgMHg0NywKKwkweDNmLCAweDA4LCAweDlkLCAweDUxLCAweDAzLCAweGI4LCAweDlmLCAweGQyLCAweDc3LCAweDgwLCAweGVjLCAweDFhLAorCTB4NTUsIDB4MjMsIDB4NmIsIDB4MjUsIDB4MmUsIDB4MzcsIDB4MTcsIDB4NmIsIDB4NjEsIDB4ZjcsIDB4MzAsIDB4NTYsCisJMHg1ZSwgMHgyZiwgMHhlZCwgMHhkYiwgMHhhMiwgMHhlNiwgMHg2YywgMHg4ZCwgMHgxNywgMHhjMywgMHg2ZiwgMHhjZiwKKwkweDljLCAweGY1LCAweDg5LCAweGM1LCAweDkxLCAweDFmLCAweDY5LCAweGEyLCAweDFjLCAweDhjLCAweGY5LCAweGVmLAorCTB4ZDQsIDB4ZmIsIDB4MjYsIDB4ZGIsIDB4YjYsIDB4ZDEsIDB4NmUsIDB4YjksIDB4NDEsIDB4ZWIsIDB4NzAsIDB4NzcsCisJMHg4OSwgMHg5ZCwgMHhhNCwgMHg1YSwgMHgzYywgMHg5OSwgMHhiNywgMHhkMSwgMHg3NiwgMHgxNywgMHg5MywgMHgwOSwKKwkweGMyLCAweGY1LCAweDkwLCAweDcwLCAweDNmLCAweGMxLCAweDdlLCAweDI5LCAweGE0LCAweDFhLCAweDI1LCAweDkyLAorCTB4ZTYsIDB4YmEsIDB4NWMsIDB4YjIsIDB4OTMsIDB4YjYsIDB4ZDEsIDB4YzQsIDB4OTgsIDB4NjcsIDB4Y2YsIDB4OWUsCisJMHhhYywgMHg5NiwgMHgwYiwgMHhiYSwgMHg5ZiwgMHg1YSwgMHgwZCwgMHhhMywgMHgzOSwgMHg4ZiwgMHhjNiwgMHgzNSwKKwkweDJmLCAweDllLCAweDgxLCAweDcyLCAweGYxLCAweDZlLCAweGQwLCAweDdhLCAweDY3LCAweGEyLCAweGNjLCAweGIzLAorCTB4NGUsIDB4ZjAsIDB4OTcsIDB4Y2EsIDB4MzEsIDB4N2QsIDB4YzYsIDB4ZDQsIDB4N2IsIDB4M2IsIDB4ZmMsIDB4ZDgsCisJMHhmMiwgMHgwNiwgMHhkOSwgMHgzZCwgMHhiNiwgMHg4MiwgMHhlYiwgMHgyOCwgMHhiMSwgMHhiNSwgMHhkMCwgMHgxZiwKKwkweGFjLCAweGQzLCAweGI2LCAweDBkLCAweGZlLCAweGRmLCAweGY4LCAweDQ2LCAweDc5LCAweDdjLCAweDljLCAweDZkLAorCTB4YjcsIDB4YzgsIDB4ZTQsIDB4OTQsIDB4MzgsIDB4ZGUsIDB4ZGIsIDB4NTcsIDB4YTIsIDB4OGMsIDB4YzcsIDB4ZjEsCisJMHgwOCwgMHhmNywgMHgzYywgMHhiNSwgMHg2ZCwgMHgxMywgMHhlNSwgMHhiZCwgMHhkZCwgMHg5NSwgMHhmMywgMHhkZCwKKwkweDExLCAweGJkLCAweDI2LCAweGUzLCAweDgyLCAweDRlLCAweGQ4LCAweGRlLCAweGY5LCAweGVlLCAweDU2LCAweDM5LAorCTB4M2IsIDB4MDUsIDB4OWEsIDB4ODAsIDB4ZGMsIDB4ZWYsIDB4M2IsIDB4NDUsIDB4OTgsIDB4NDQsIDB4YjYsIDB4NGYsCisJMHhjMCwgMHg1ZSwgMHg5MCwgMHg3NiwgMHgzYywgMHhhMCwgMHgwZiwgMHhjOCwgMHhlZiwgMHg1YiwgMHhiYiwgMHhkOSwKKwkweDE3LCAweGY0LCAweDEyLCAweDc0LCAweDVjLCAweGRiLCAweDM2LCAweDIzLCAweDBiLCAweDMyLCAweDEzLCAweDM1LAorCTB4NDgsIDB4NjcsIDB4YmIsIDB4ZjAsIDB4MGYsIDB4MDcsIDB4ZDksIDB4NGUsIDB4NTgsIDB4NTcsIDB4NjEsIDB4NGMsCisJMHhiNSwgMHg5YSwgMHg1ZSwgMHg2NiwgMHgxNywgMHhlOSwgMHg4ZiwgMHg3MywgMHgzZiwgMHg5NywgMHhmZCwgMHhjZCwKKwkweDM2LCAweDNhLCAweDQxLCAweDJiLCAweGJlLCAweGRlLCAweGMzLCAweDYzLCAweDZjLCAweDJiLCAweGNlLCAweDA5LAorCTB4NmQsIDB4MjIsIDB4ZGEsIDB4NTUsIDB4ZDcsIDB4NmEsIDB4ZmIsIDB4NjIsIDB4YjIsIDB4YzIsIDB4MTksIDB4ZTQsCisJMHhkYSwgMHg0OCwgMHgzOCwgMHg0NywgMHg3MSwgMHgzOSwgMHg1OSwgMHg5YSwgMHg5YiwgMHhhNywgMHgwZCwgMHgzNSwKKwkweDBiLCAweGU3LCAweDg5LCAweGI0LCAweDkyLCAweDFhLCAweGIyLCAweGI2LCAweGM3LCAweDhjLCAweDNjLCAweDBmLAorCTB4YmIsIDB4YWMsIDB4NTMsIDB4Y2YsIDB4ZDksIDB4MGMsIDB4NmMsIDB4NTksIDB4M2IsIDB4NjcsIDB4ZGEsIDB4OWUsCisJMHgyZCwgMHg4NCwgMHg3MywgMHgzNiwgMHgwMCwgMHg4ZCwgMHg1MywgMHhiZSwgMHg0MSwgMHhjZiwgMHg5OSwgMHgwNywKKwkweGJhLCAweGM5LCAweDAzLCAweGVmLCAweDc5LCAweGNjLCAweDUzLCAweDFlLCAweDczLCAweDk0LCAweDJmLCAweGI3LAorCTB4YzgsIDB4YzQsIDB4NzEsIDB4ZDUsIDB4NWEsIDB4MjMsIDB4OTIsIDB4ZDgsIDB4ZWQsIDB4YjcsIDB4YzgsIDB4ZjAsCisJMHgxNCwgMHg2MywgMHgwNSwgMHgxYiwgMHg2MCwgMHg4MywgMHg2ZCwgMHhjNCwgMHhkMywgMHg4YSwgMHg2ZiwgMHhkNiwKKwkweGUzLCAweDFkLCAweDFmLCAweDBhLCAweDc1LCAweGViLCAweDk2LCAweGQ4LCAweDU5LCAweDY3LCAweGQxLCAweGY3LAorCTB4ZDMsIDB4YzAsIDB4YzMsIDB4YTMsIDB4YzAsIDB4YzMsIDB4M2MsIDB4ZWYsIDB4YmMsIDB4NTAsIDB4MTUsIDB4NWYsCisJMHhlMiwgMHg1OCwgMHhiNSwgMHgwZSwgMHhjNSwgMHg3OCwgMHg2MywgMHg3YSwgMHgzZSwgMHg3NSwgMHg5YywgMHhhOSwKKwkweDU0LCAweGZiLCAweDY2LCAweGVjLCAweGE5LCAweDM4LCAweGVkLCAweGE5LCAweGRjLCAweGE4LCAweDY3LCAweGNlLAorCTB4NjAsIDB4MGQsIDB4YzAsIDB4NzcsIDB4ZjIsIDB4ZjcsIDB4NjksIDB4NWEsIDB4MWYsIDB4MWEsIDB4MjcsIDB4NWMsCisJMHhkMSwgMHgxMCwgMHhhZSwgMHgwNSwgMHg3MywgMHhjNiwgMHgzMywgMHhiMywgMHg0YiwgMHhlMywgMHgxOCwgMHgyZiwKKwkweGNjLCAweGVkLCAweDExLCAweDg3LCAweDJlLCAweDk3LCAweGQxLCAweDE0LCAweGUzLCAweDI0LCAweGFkLCAweGNiLAorCTB4YzAsIDB4ZjQsIDB4OTQsIDB4YjYsIDB4NjEsIDB4NDUsIDB4OWQsIDB4OTYsIDB4MDMsIDB4MjUsIDB4OWUsIDB4YjcsCisJMHhlNSwgMHgxYSwgMHhjYywgMHhlZiwgMHgzMSwgMHg3ZSwgMHhkNCwgMHgzOSwgMHgyMSwgMHhjNywgMHhkMCwgMHgzNywKKwkweGQ3LCAweGM1LCAweDk1LCAweDhkLCAweGNmLCAweGFjLCAweGIyLCAweDdiLCAweGYyLCAweGFhLCAweDYzLCAweDM0LAorCTB4NjYsIDB4ZGQsIDB4N2MsIDB4ZTEsIDB4ZDksIDB4OTMsIDB4ZTQsIDB4YzAsIDB4YWMsIDB4NWUsIDB4NzcsIDB4ZTUsCisJMHg5YSwgMHhhMSwgMHg4YywgMHg0NiwgMHhhMCwgMHhmZCwgMHg3NiwgMHg3NywgMHgyNywgMHg3YiwgMHhjYywgMHg1OSwKKwkweGMzLCAweDg0LCAweGY0LCAweDk3LCAweGNjLCAweGY4LCAweDJmLCAweGVhLCAweDdkLCAweDkzLCAweDY2LCAweDdmLAorCTB4YjgsIDB4ZDksIDB4NTMsIDB4YjksIDB4NWYsIDB4MmUsIDB4YTYsIDB4YTIsIDB4NTUsIDB4NzMsIDB4NWIsIDB4MjcsCisJMHhjMywgMHhjMCwgMHg4NSwgMHg1ZSwgMHhjYiwgMHg4NCwgMHg1ZCwgMHg5YywgMHhlYiwgMHg3ZSwgMHhiYywgMHg4OSwKKwkweDY3LCAweGQxLCAweGEyLCAweDk4LCAweDlmLCAweGMyLCAweDM4LCAweGNmLCAweGE3LCAweGIzLCAweGRkLCAweDJiLAorCTB4YjUsIDB4NDUsIDB4MzEsIDB4Y2IsIDB4YjMsIDB4NGUsIDB4OTAsIDB4OTUsIDB4NmYsIDB4ZGQsIDB4MTIsIDB4YWYsCisJMHhkNywgMHhmOSwgMHgyYiwgMHhlYywgMHg5OSwgMHgxNiwgMHhkOCwgMHgwZCwgMHhiYiwgMHgwMiwgMHhmOSwgMHgzMywKKwkweGU4LCAweGM5LCAweGQzLCAweDc2LCAweDRjLCAweDA5LCAweDFkLCAweDkzLCAweDkyLCAweGUwLCAweDdjLCAweDJhLAorCTB4NmUsIDB4ZTMsIDB4Y2UsIDB4MWMsIDB4Y2IsIDB4OTgsIDB4YTUsIDB4NmYsIDB4NjMsIDB4ZmYsIDB4Y2MsIDB4ZGIsCisJMHhkMCwgMHg1ZCwgMHg5YSwgMHhkNiwgMHgxZiwgMHhkNywgMHhiMiwgMHhiMCwgMHhjYiwgMHhkYSwgMHhjZSwgMHgzYSwKKwkweDhlLCAweDczLCAweDQyLCAweGY0LCAweDFlLCAweGFjLCAweGQwLCAweDM3LCAweGVhLCAweGE4LCAweGYyLCAweDBiLAorCTB4OGMsIDB4MmYsIDB4NTcsIDB4MTgsIDB4NWIsIDB4NGUsIDB4NDYsIDB4Y2QsIDB4ZmIsIDB4ODQsIDB4ZjQsIDB4ZTUsCisJMHhmNiwgMHg2YywgMHhlMiwgMHhkZCwgMHgzMCwgMHhhMSwgMHgyZiwgMHhkNywgMHg2NSwgMHg3ZCwgMHhiOSwgMHg0NiwKKwkweGVkLCAweGNiLCAweDk5LCAweGQ4LCAweDQzLCAweGUzLCAweDljLCAweDJmLCAweDU3LCAweDE4LCAweGNiLCAweDgzLAorCTB4NTYsIDB4NmEsIDB4ZWQsIDB4NTksIDB4MDksIDB4NjMsIDB4MGIsIDB4MGQsIDB4MTcsIDB4NWQsIDB4YmQsIDB4NmYsCisJMHgyNCwgMHgzNywgMHhhMCwgMHhlMCwgMHgzNywgMHgxOCwgMHgxZiwgMHg4YiwgMHhiMSwgMHgwYSwgMHhhNSwgMHhmZSwKKwkweGNlLCAweGZhLCAweDE3LCAweDFiLCAweDI0LCAweGQzLCAweGJjLCAweDAyLCAweGUzLCAweDdlLCAweDRhLCAweGNmLAorCTB4YjksIDB4NTksIDB4YzMsIDB4ODIsIDB4NWMsIDB4MWIsIDB4NjQsIDB4Y2MsIDB4ODcsIDB4NjcsIDB4NDcsIDB4MzUsCisJMHg3ZiwgMHgyNSwgMHg3YSwgMHgyMywgMHg5ZCwgMHhjNiwgMHg5ZSwgMHhmNSwgMHgxMywgMHg2YiwgMHhhNSwgMHhmZSwKKwkweGI4LCAweDUzLCAweDE4LCAweDhmLCAweGRhLCAweDdlLCAweDEzLCAweDgwLCAweGE5LCAweDA2LCAweDczLCAweGYzLAorCTB4NGUsIDB4MmIsIDB4OTMsIDB4ZDksIDB4ZjcsIDB4M2IsIDB4ZWEsIDB4MTgsIDB4MWIsIDB4OTgsIDB4MmEsIDB4OWEsCisJMHgxOCwgMHg2MCwgMHg1ZiwgMHgzMSwgMHgxMiwgMHg5ZSwgMHg1YiwgMHg1NywgMHg1YywgMHg0NywgMHhjZSwgMHgwYywKKwkweGFlLCAweDAwLCAweDJjLCAweDJiLCAweDk2LCAweGI1LCAweDU5LCAweDFmLCAweDdiLCAweDQzLCAweDFkLCAweDQ1LAorCTB4OWEsIDB4N2EsIDB4NGEsIDB4ZWYsIDB4MmYsIDB4NWMsIDB4ZDksIDB4OWQsIDB4ZGMsIDB4YTksIDB4Y2YsIDB4MjMsCisJMHhlOSwgMHg1OCwgMHg2MiwgMHg1ZSwgMHhiOCwgMHg3ZiwgMHhmNywgMHg5YiwgMHhmMiwgMHgzNiwgMHgyZCwgMHhmYiwKKwkweDBmLCAweGE0LCAweGE4LCAweGM3LCAweGI2LCAweGU5LCAweGRmLCAweGI1LCAweGU5LCAweDIwLCAweDM4LCAweGRmLAorCTB4ZmQsIDB4MmMsIDB4NmMsIDB4MTYsIDB4ZGYsIDB4ZmIsIDB4OTYsIDB4YjQsIDB4YzcsIDB4N2IsIDB4YjUsIDB4MGQsCisJMHg4NSwgMHhiOSwgMHgxYSwgMHhhYywgMHg5NywgMHgxNSwgMHhmZSwgMHhiOCwgMHhkZCwgMHhhYiwgMHg2OCwgMHhkNiwKKwkweDAzLCAweDBiLCAweGMyLCAweGZiLCAweDE3LCAweDNhLCAweDZjLCAweDVlLCAweDNlLCAweGE4LCAweDA3LCAweDNkLAorCTB4N2QsIDB4NDQsIDB4OGMsIDB4YWMsIDB4YzksIDB4Y2QsIDB4Y2IsIDB4MWEsIDB4ZWUsIDB4YTcsIDB4Y2IsIDB4OTAsCisJMHhhMCwgMHhkZCwgMHgyMywgMHg5MiwgMHhlNCwgMHhkZCwgMHg0OSwgMHhlYywgMHhiYiwgMHgyMCwgMHg1NywgMHg0MSwKKwkweDNmLCAweGIzLCAweDFlLCAweDZkLCAweDU2LCAweDdlLCAweDczLCAweDBmLCAweDhhLCAweGVmLCAweDFkLCAweDg0LAorCTB4OGUsIDB4YjksIDB4NjEsIDB4YTksIDB4OGUsIDB4ODksIDB4ZDMsIDB4YmYsIDB4Y2YsIDB4OGQsIDB4ZDIsIDB4NDcsCisJMHg1YywgMHg4OSwgMHgzYSwgMHgyZCwgMHhmMiwgMHhkMSwgMHhiMSwgMHhkZiwgMHg1YSwgMHg0YiwgMHgxZSwgMHgxYiwKKwkweDgyLCAweDdjLCAweDU3LCAweGY3LCAweDg3LCAweGU3LCAweDJlLCAweDk5LCAweGM2LCAweDdjLCAweGI2LCAweDViLAorCTB4MjcsIDB4ODksIDB4ZjcsIDB4NzksIDB4ZjIsIDB4YzUsIDB4NGEsIDB4MzIsIDB4MzEsIDB4MGIsIDB4MWQsIDB4MzUsCisJMHhlNCwgMHgwYywgMHhiNywgMHg5YSwgMHhkOCwgMHhlOSwgMHhhNywgMHhkNiwgMHg5YSwgMHg3MywgMHg1YSwgMHhmNSwKKwkweGMwLCAweDY5LCAweDE4LCAweDRmLCAweGFkLCAweGE2LCAweGRkLCAweDU5LCAweDJiLCAweDk3LCAweDgzLCAweGEwLAorCTB4YmUsIDB4NWIsIDB4Y2IsIDB4ZTIsIDB4OWQsIDB4OTQsIDB4YzUsIDB4MDcsIDB4NTIsIDB4MWQsIDB4ODYsIDB4MDcsCisJMHhiNCwgMHhlZiwgMHhjNCwgMHgzZCwgMHgwMCwgMHhjMCwgMHg0MywgMHhiNywgMHhjYiwgMHhiZCwgMHhkMCwgMHg5NiwKKwkweDRmLCAweGZkLCAweGNjLCAweDhjLCAweDk1LCAweDRmLCAweGNhLCAweDU5LCAweGNhLCAweDlmLCAweDZhLCAweDZiLAorCTB4NzQsIDB4ODEsIDB4ZWMsIDB4M2QsIDB4MzQsIDB4NDYsIDB4YmQsIDB4OWMsIDB4OWEsIDB4ZmUsIDB4MjYsIDB4ZTQsCisJMHg1NSwgMHg0ZSwgMHhlMywgMHhhMSwgMHg0NSwgMHhlZSwgMHgxYiwgMHg5MywgMHhjYywgMHg0NSwgMHhlOCwgMHhhYywKKwkweGMyLCAweGQ0LCAweDQyLCAweDFlLCAweDVkLCAweGRhLCAweDFlLCAweGM3LCAweDdhLCAweDdhLCAweGFkLCAweGYxLAorCTB4NzEsIDB4MTcsIDB4OGUsIDB4NzUsIDB4OWEsIDB4N2IsIDB4OGMsIDB4ZjQsIDB4NTgsIDB4YjksIDB4MzcsIDB4ZmYsCisJMHg5YywgMHgxZCwgMHhlYiwgMHhjYSwgMHg3MCwgMHhhYywgMHgzZCwgMHgwYiwgMHhjNywgMHgxYSwgMHhmYSwgMHhmOCwKKwkweGExLCAweGZjLCAweDRkLCAweGU4LCAweGIzLCAweDQ5LCAweGZhLCAweDRjLCAweGNjLCAweGQ4LCAweDRhLCAweGU5LAorCTB4MWQsIDB4NmQsIDB4YjQsIDB4NzIsIDB4ZDMsIDB4ODMsIDB4MGUsIDB4ZTIsIDB4NzksIDB4YTEsIDB4ZTksIDB4Y2YsCisJMHg3OSwgMHg2MiwgMHg3MSwgMHhhNiwgMHg4OCwgMHgwNywgMHhjYSwgMHhkYywgMHgyNiwgMHg3ZCwgMHg5ZSwgMHg3MSwKKwkweDAyLCAweDdlLCAweGQ2LCAweDg3LCAweDhiLCAweDJjLCAweDFiLCAweGU2LCAweDVmLCAweDI5LCAweDQ2LCAweDFjLAorCTB4ZmEsIDB4ZDYsIDB4ZjQsIDB4OWYsIDB4M2EsIDB4OTcsIDB4YzQsIDB4MTYsIDB4NGMsIDB4MWMsIDB4OTgsIDB4ZjEsCisJMHg1ZiwgMHg3MywgMHhjZiwgMHgwMiwgMHhmNywgMHg3ZCwgMHhkZiwgMHgwMSwgMHhkZSwgMHhmYSwgMHhlZCwgMHg2MiwKKwkweGIyLCAweDI3LCAweDFiLCAweGExLCAweDNjLCAweDlkLCAweDk1LCAweDQzLCAweDk1LCAweDNlLCAweDY5LCAweGQzLAorCTB4NjcsIDB4ZWQsIDB4ZGYsIDB4MzAsIDB4NDYsIDB4OWMsIDB4YTksIDB4OGUsIDB4MTEsIDB4OGIsIDB4NjMsIDB4NjIsCisJMHhjNCwgMHgzYiwgMHg3ZiwgMHg4ZSwgMHgxOCwgMHhiMSwgMHgzOCwgMHgyNiwgMHg0NiwgMHhiYywgMHg5YywgMHg5ZiwKKwkweDM1LCAweDUyLCAweDlhLCAweGM1LCAweGI4LCAweGVhLCAweDIxLCAweDUzLCAweDk0LCAweDkzLCAweDliLCAweDZhLAorCTB4YzAsIDB4YmIsIDB4MTYsIDB4NmYsIDB4YzAsIDB4MzIsIDB4NTYsIDB4YzAsIDB4ZGIsIDB4YzMsIDB4ZmIsIDB4MjAsCisJMHhkZSwgMHgzMSwgMHgxOSwgMHg5OSwgMHhkMywgMHgxZCwgMHhiMywgMHg5MCwgMHgxZiwgMHhkNCwgMHg2OSwgMHhhYywKKwkweDZiLCAweGZjLCAweDgyLCAweGM5LCAweDcyLCAweDMzLCAweGNhLCAweDVkLCAweDcyLCAweDI2LCAweDU4LCAweGFmLAorCTB4ZDQsIDB4MjgsIDB4YzMsIDB4NjMsIDB4OTQsIDB4ZGQsIDB4NGQsIDB4MzIsIDB4M2EsIDB4MTYsIDB4ZGEsIDB4YjgsCisJMHg5ZiwgMHg1ZCwgMHhjZiwgMHhiNSwgMHg4MSwgMHgyMSwgMHgwOSwgMHg2ZCwgMHhkOCwgMHg2NywgMHhkNiwgMHg5YiwKKwkweGI1LCAweGRiLCAweDJkLCAweDMxLCAweGE5LCAweDVmLCAweDhkLCAweDM5LCAweDM4LCAweGVlLCAweDVjLCAweDFjLAorCTB4NWYsIDB4YmQsIDB4YzAsIDB4OTYsIDB4NGQsIDB4ZDgsIDB4ZDgsIDB4ZTAsIDB4YjgsIDB4ZDUsIDB4YzEsIDB4Y2IsCisJMHhjYiwgMHg4OCwgMHhlYSwgMHhmOSwgMHg4ZiwgMHhkYiwgMHg3MywgMHhiYywgMHg1MSwgMHg3YiwgMHhkNywgMHg1ZiwKKwkweDQyLCAweGNmLCAweGNmLCAweDQwLCAweDY1LCAweDE2LCAweGZkLCAweGFkLCAweDU3LCAweDk5LCAweDcxLCAweDhlLAorCTB4NzMsIDB4ZWUsIDB4N2UsIDB4MWUsIDB4YzgsIDB4YzUsIDB4NTYsIDB4MzUsIDB4MzQsIDB4YmUsIDB4ODAsIDB4MmUsCisJMHg0MSwgMHhiNywgMHgxYywgMHg5YiwgMHgwMywgMHhkYSwgMHhiZCwgMHg1NywgMHgyNiwgMHg0NiwgMHgwOSwgMHg1ZiwKKwkweDQ3LCAweDNjLCAweGEyLCAweGNmLCAweGY1LCAweGUyLCAweDdiLCAweGRjLCAweDljLCAweDI3LCAweGVhLCAweGFkLAorCTB4ODQsIDB4NjcsIDB4N2EsIDB4ZDcsIDB4MDAsIDB4ZGUsIDB4YzUsIDB4ZTcsIDB4N2EsIDB4YWQsIDB4OWUsIDB4ZDYsCisJMHgzNiwgMHgwNCwgMHhjZiwgMHhmNywgMHg4NiwgMHg2MywgMHg1OCwgMHg4ZSwgMHg5ZSwgMHgwMiwgMHgxOSwgMHhkNiwKKwkweGZiLCAweDdkLCAweGQ3LCAweGNhLCAweGU5LCAweDA3LCAweGU3LCAweGNlLCAweDE3LCAweDM0LCAweGMxLCAweDU2LAorCTB4NjksIDB4ODUsIDB4YTksIDB4M2MsIDB4ZTAsIDB4YTYsIDB4YjksIDB4ZWYsIDB4ODIsIDB4ZmIsIDB4MGIsIDB4M2EsCisJMHhlMiwgMHhiNywgMHhlOSwgMHg3MywgMHgxZiwgMHhmMywgMHg2NywgMHhhYywgMHhlNywgMHhjZiwgMHg3ZSwgMHg4NCwKKwkweDY3LCAweDVhLCAweGUzLCAweGQyLCAweDA3LCAweDNhLCAweGVjLCAweGQ3LCAweGU5LCAweDMxLCAweDhjLCAweDg3LAorCTB4NmIsIDB4YmUsIDB4MWEsIDB4MGYsIDB4OTAsIDB4M2QsIDB4NWMsIDB4ZmIsIDB4YzUsIDB4ZDgsIDB4MmIsIDB4MmQsCisJMHgyYSwgMHhhNywgMHhjZiwgMHg1OCwgMHg0NywgMHgyZCwgMHg4ZCwgMHg1ZCwgMHg3NiwgMHhmNiwgMHg5NCwgMHgxMywKKwkweDZhLCAweDRmLCAweGQ5LCAweDU3LCAweDdiLCAweGNiLCAweDM2LCAweGFmLCAweGZiLCAweDAxLCAweGNjLCAweDA3LAorCTB4N2UsIDB4OGYsIDB4MTcsIDB4OWQsIDB4MjEsIDB4ZTAsIDB4YWIsIDB4NTAsIDB4M2EsIDB4ZTIsIDB4NjQsIDB4ZjQsCisJMHhmYiwgMHhhOCwgMHg3ZCwgMHg0MywgMHgwZSwgMHg2MCwgMHhhZSwgMHg3YSwgMHhjNywgMHhhMywgMHg1YSwgMHhkZSwKKwkweGNmLCAweGRmLCAweGQzLCAweDE3LCAweGNlLCAweGViLCAweDBiLCAweDdhLCAweDBkLCAweDY4LCAweDVhLCAweDg4LAorCTB4NmIsIDB4Y2YsIDB4ZGEsIDB4MTAsIDB4YzcsIDB4OWQsIDB4OWMsIDB4YzYsIDB4M2QsIDB4Y2IsIDB4N2MsIDB4NGIsCisJMHhmZiwgMHgwNiwgMHg5ZCwgMHgyYiwgMHhkMywgMHg1ZSwgMHgyYiwgMHhkZSwgMHg4YiwgMHhmNywgMHg0ZCwgMHg4NiwKKwkweGZhLCAweDg2LCAweDcwLCAweGRmLCAweDA5LCAweGJkLCAweDE2LCAweGVjLCAweDM3LCAweGYyLCAweDZhLCAweDU2LAorCTB4NDYsIDB4MmEsIDB4NWMsIDB4YzMsIDB4NjQsIDB4M2IsIDB4NDgsIDB4MmYsIDB4ZDcsIDB4YzAsIDB4MWUsIDB4NTgsCisJMHg3OCwgMHhiZSwgMHhiYSwgMHg3ZiwgMHg3ZSwgMHgxZSwgMHgxMiwgMHhlMywgMHg0MiwgMHg1OCwgMHhlZSwgMHhkNiwKKwkweDY3LCAweDE3LCAweGFiLCAweGVmLCAweDFlLCAweGI5LCAweGYyLCAweGJmLCAweDcwLCAweGZkLCAweGQwLCAweGM4LAorCTB4NTAsIDB4MGIsIDB4NDcsIDB4ODYsIDB4ZjIsIDB4Y2UsIDB4YzgsIDB4OTUsIDB4YWYsIDB4Y2IsIDB4NDEsIDB4ZTAsCisJMHhmMSwgMHgzMCwgMHg2MCwgMHg1MiwgMHhmNywgMHhmMywgMHhjZSwgMHhhYiwgMHg1NywgMHhhNSwgMHgzMCwgMHg1OSwKKwkweDJmLCAweGVhLCAweGExLCAweDgyLCAweGUzLCAweDNlLCAweDU0LCAweDJiLCAweDkxLCAweDg3LCAweDk0LCAweDUzLAorCTB4ZjMsIDB4NTAsIDB4YmIsIDB4ZjYsIDB4Y2YsIDB4NzcsIDB4YTQsIDB4ZGEsIDB4ZTMsIDB4N2IsIDB4ZTUsIDB4YjgsCisJMHhlMywgMHhkZSwgMHhhZiwgMHhmNCwgMHg1OSwgMHhkYiwgMHg4MiwgMHhjNywgMHg1OCwgMHhkZiwgMHg3MSwgMHgyNywKKwkweDcyLCAweDdmLCAweGQ0LCAweDllLCAweGQzLCAweDM3LCAweGYxLCAweGJkLCAweDU5LCAweGNkLCAweGY3LCAweGRmLAorCTB4NTgsIDB4NDcsIDB4OWMsIDB4Y2QsIDB4MGEsIDB4ZjEsIDB4ZjEsIDB4NTksIDB4YzgsIDB4YWQsIDB4NGYsIDB4NGIsCisJMHg3NiwgMHgzNCwgMHgzMSwgMHg1NywgMHhjNiwgMHhlYywgMHhiMywgMHhkZiwgMHhiMCwgMHhjZSwgMHhmMCwgMHgwYiwKKwkweGNiLCAweGJjLCAweGUyLCAweGYwLCAweGNlLCAweDFjLCAweGEzLCAweDMzLCAweDNlLCAweGRmLCAweDEyLCAweGVlLAorCTB4YjksIDB4MzcsIDB4NzMsIDB4Y2EsIDB4ZmMsIDB4YzYsIDB4NzUsIDB4NTIsIDB4ZmYsIDB4MGEsIDB4ZTYsIDB4OGIsCisJMHhmZCwgMHgxMSwgMHg1NywgMHhhYiwgMHhmNCwgMHgzZCwgMHgwNSwgMHg5ZSwgMHg2YywgMHg4OSwgMHhkNywgMHhjZCwKKwkweGQ5LCAweDQzLCAweDQ2LCAweGY2LCAweGQ2LCAweDAxLCAweDZlLCAweGMwLCAweDZmLCAweGVjLCAweDNiLCAweDIxLAorCTB4OWQsIDB4MGEsIDB4MjQsIDB4MzcsIDB4NjksIDB4YjYsIDB4YTMsIDB4NjcsIDB4ODcsIDB4OTgsIDB4MzksIDB4MzMsCisJMHgzNCwgMHhiMywgMHhjMiwgMHhkOCwgMHg5MSwgMHhmOCwgMHgzNiwgMHg3NCwgMHhhMSwgMHg2NCwgMHhmYiwgMHhkOCwKKwkweDRiLCAweDRlLCAweDNmLCAweGNmLCAweDNjLCAweDhhLCAweGI2LCAweDFiLCAweDk3LCAweGIzLCAweDA5LCAweGMxLAorCTB4NGIsIDB4Y2YsIDB4NWIsIDB4ZmYsIDB4MzIsIDB4MDgsIDB4YzYsIDB4NTIsIDB4MjksIDB4ZGUsIDB4MmIsIDB4YjgsCisJMHg4YywgMHg0ZiwgMHhiOSwgMHhjYSwgMHg5OSwgMHgxYywgMHg2ZCwgMHg3MCwgMHgyNiwgMHg0NiwgMHgwMywgMHhkOSwKKwkweDkzLCAweGUyLCAweDlkLCAweDQ5LCAweGRjLCAweDkzLCAweGEwLCAweGUzLCAweGUzLCAweDQ4LCAweDZiLCAweDg3LAorCTB4NmUsIDB4N2QsIDB4YzcsIDB4M2EsIDB4ZWUsIDB4NzEsIDB4YmIsIDB4ZDksIDB4NmYsIDB4YjQsIDB4ZTUsIDB4ODgsCisJMHg2MywgMHhmYSwgMHhjYSwgMHhlZCwgMHgyNywgMHg3MiwgMHhjMiwgMHhiYiwgMHg4YiwgMHhiNiwgMHhjNCwgMHg2MywKKwkweDdhLCAweDdmLCAweGUyLCAweDE3LCAweDUwLCAweDBmLCAweDdkLCAweDk0LCAweGQ4LCAweGFmLCAweGViLCAweDRjLAorCTB4NDAsIDB4OWUsIDB4NGQsIDB4OGUsIDB4ZjEsIDB4YmUsIDB4MTQsIDB4OWUsIDB4NjMsIDB4ODgsIDB4YjQsIDB4MmEsCisJMHhiOSwgMHhkNiwgMHgxYiwgMHhiNiwgMHhmNywgMHg2OSwgMHhlNiwgMHhlMSwgMHgwYSwgMHg0NSwgMHg3NCwgMHhkYSwKKwkweDE2LCAweDZmLCAweGY3LCAweGRjLCAweDFkLCAweDliLCAweDYxLCAweDVhLCAweDc4LCAweGQ3LCAweGE2LCAweGQyLAorCTB4NjcsIDB4NTYsIDB4ZTAsIDB4ZDMsIDB4OWUsIDB4MWUsIDB4OTIsIDB4YjgsIDB4MzMsIDB4NTUsIDB4NmMsIDB4NzUsCisJMHg0ZSwgMHgxNiwgMHgzMywgMHg1YiwgMHhkNywgMHg4MSwgMHgzZSwgMHhjZSwgMHhhNywgMHgzZSwgMHg0NiwgMHhmOSwKKwkweDA1LCAweGRiLCAweGVmLCAweDQ1LCAweGM5LCAweDU3LCAweDNlLCAweDI0LCAweGUzLCAweDJkLCAweGVkLCAweGRlLAorCTB4ZmQsIDB4N2EsIDB4NmUsIDB4MmUsIDB4MDMsIDB4NjcsIDB4MmQsIDB4MmEsIDB4M2IsIDB4ZmEsIDB4YzQsIDB4M2EsCisJMHhlYSwgMHhiNywgMHhkZCwgMHg0NSwgMHgwNSwgMHg1ZSwgMHg1NiwgMHhiZiwgMHg4OCwgMHgwNywgMHgzNiwgMHg2ZSwKKwkweGFkLCAweGI2LCAweDUxLCAweGY2LCAweGE2LCAweDU4LCAweGFlLCAweGMxLCAweGU5LCAweDFkLCAweDVkLCAweDg1LAorCTB4NzksIDB4ZGMsIDB4MDUsIDB4ZmQsIDB4ZTksIDB4YzAsIDB4NDYsIDB4MjIsIDB4YWUsIDB4MWIsIDB4OWMsIDB4M2QsCisJMHhhMywgMHg3OSwgMHhmNCwgMHhjOCwgMHg3ZCwgMHhkNiwgMHhiYywgMHhmNywgMHhmMCwgMHgzMCwgMHhjNiwgMHhhOCwKKwkweGU1LCAweDJiLCAweDc4LCAweGY3LCAweDEyLCAweGQ3LCAweGRiLCAweDgzLCAweDQ5LCAweGQ4LCAweDA2LCAweGI5LAorCTB4YWUsIDB4N2YsIDB4NjcsIDB4ZDcsIDB4YWIsIDB4YTcsIDB4YWYsIDB4YjAsIDB4NWUsIDB4ZWQsIDB4YzksIDB4MjMsCisJMHgxNSwgMHg3ZCwgMHg2ZiwgMHg0OCwgMHhlNywgMHhiOCwgMHhlMiwgMHgzYSwgMHg2ZSwgMHhmMywgMHg1NSwgMHg3YSwKKwkweDdlLCAweDU0LCAweDg3LCAweGRkLCAweDFiLCAweDc4LCAweDcyLCAweDlkLCAweGJkLCAweGQzLCAweDA2LCAweDcwLAorCTB4NWMsIDB4MDUsIDB4MTgsIDB4MzYsIDB4NjIsIDB4ZmMsIDB4ODQsIDB4YzEsIDB4ZDQsIDB4MTEsIDB4NzUsIDB4NGIsCisJMHg5YywgMHgzYSwgMHg3MCwgMHg1NiwgMHg0ZSwgMHhhZiwgMHgwYiwgMHhmNywgMHg3YiwgMHhhMCwgMHgxZCwgMHhjOCwKKwkweGI1LCAweDQ3LCAweGUzLCAweDQ2LCAweDM3LCAweGFlLCAweDVkLCAweGE2LCAweDlkLCAweDcwLCAweDNjLCAweDhlLAorCTB4MWQsIDB4MGYsIDB4NjksIDB4NzUsIDB4NDMsIDB4MGIsIDB4ZmQsIDB4ODksIDB4NTksIDB4YTksIDB4NWIsIDB4NTQsCisJMHg5ZSwgMHhmMSwgMHhmYywgMHg1ZCwgMHhhZCwgMHg2NiwgMHhkZiwgMHgxMSwgMHhjYiwgMHg3YSwgMHhiMCwgMHg0YiwKKwkweDY5LCAweGUzLCAweDEyLCAweDc3LCAweDdhLCAweGFlLCAweDhhLCAweGRjLCAweDViLCAweDljLCAweGYzLCAweDJmLAorCTB4NDMsIDB4OWUsIDB4NWMsIDB4ZWIsIDB4YmQsIDB4NGQsIDB4OTEsIDB4ZjYsIDB4NDIsIDB4ZmMsIDB4MTIsIDB4YjcsCisJMHgwOSwgMHhlMCwgMHg5NSwgMHg3MSwgMHg5NSwgMHhkMywgMHg0MSwgMHg2NiwgMHg4MCwgMHg3YywgMHhjNSwgMHgzNiwKKwkweDk4LCAweGZmLCAweGEyLCAweDhlLCAweGU1LCAweDBlLCAweGE2LCAweDE4LCAweDI3LCAweDZhLCAweDNmLCAweDcxLAorCTB4ODcsIDB4MGEsIDB4NjUsIDB4ZDMsIDB4MmMsIDB4ZDcsIDB4MTAsIDB4MWMsIDB4ZGUsIDB4MjEsIDB4YmEsIDB4MGIsCisJMHgxZCwgMHg1ZSwgMHg5YywgMHg1MiwgMHhjZSwgMHgzNywgMHhjNywgMHg1YywgMHg3YywgMHhkNywgMHhkOCwgMHhmYiwKKwkweDQyLCAweDhkLCAweDZlLCAweDEyLCAweGY5LCAweGViLCAweDcwLCAweGJjLCAweGYxLCAweDNjLCAweGU2LCAweGZiLAorCTB4MTIsIDB4ZTYsIDB4N2IsIDB4ZjksIDB4ZmIsIDB4NDEsIDB4OTEsIDB4NTcsIDB4NDYsIDB4NWUsIDB4ZjksIDB4NDMsCisJMHg0MSwgMHhhNiwgMHg4OSwgMHhmNCwgMHg0NywgMHg5YSwgMHg3YiwgMHgzZCwgMHg5ZiwgMHg1OSwgMHhlZiwgMHg2MywKKwkweDAyLCAweDZjLCAweDY3LCAweGMxLCAweDBiLCAweDE5LCAweGFlLCAweDI1LCAweDA3LCAweGM3LCAweDUyLCAweDM3LAorCTB4ODEsIDB4MTcsIDB4NzYsIDB4Y2EsIDB4OWYsIDB4YzAsIDB4MTYsIDB4ZjgsIDB4ZTMsIDB4NGEsIDB4MWEsIDB4M2MsCisJMHhkMSwgMHgwMywgMHgxZSwgMHhlOSwgMHgwNiwgMHg1ZiwgMHhhNCwgMHhiNCwgMHg1ZCwgMHhmYywgMHgyOCwgMHg3NCwKKwkweGRlLCAweGQ5LCAweDRhLCAweGM5LCAweGQ5LCAweDNiLCAweDVhLCAweDc0LCAweDcyLCAweGEzLCAweDQ3LCAweDQxLAorCTB4MTcsIDB4ZGMsIDB4MDMsIDB4YWIsIDB4YWUsIDB4YTksIDB4MTEsIDB4MzcsIDB4M2UsIDB4MjksIDB4YTQsIDB4ZmYsCisJMHg3NiwgMHhlZSwgMHhlZCwgMHg2OCwgMHgwNiwgMHhhZSwgMHhjZSwgMHgxMCwgMHg1NywgMHg5MywgMHg5NSwgMHgyZCwKKwkweGRlLCAweDNhLCAweGYwLCAweDQxLCAweGIzLCAweGU2LCAweDgzLCAweDQ2LCAweDI3LCAweGUzLCAweGRkLCAweDY0LAorCTB4ZjksIDB4NjAsIDB4MDQsIDB4N2MsIDB4NTAsIDB4NTgsIDB4YzIsIDB4MDcsIDB4Y2YsIDB4NTgsIDB4OWEsIDB4OWYsCisJMHhhZSwgMHhlMiwgMHg4MywgMHg0OSwgMHg5YiwgMHgzNiwgMHg3ZSwgMHgwNSwgMHgzZSwgMHhiOCwgMHhjYSwgMHg0ZiwKKwkweDNlLCAweDM5LCAweDI0LCAweDI3LCAweGMwLCAweDA3LCAweDBmLCAweDZiLCAweDNlLCAweGI4LCAweDRhLCAweGYzLAorCTB4MDEsIDB4ZTMsIDB4NDYsIDB4ZTQsIDB4ODUsIDB4NTYsIDB4YzgsIDB4MGUsIDB4ZjIsIDB4YzIsIDB4YjMsIDB4MzIsCisJMHgwYiwgMHg1ZSwgMHg3OCwgMHg1MSwgMHhiMSwgMHhlZiwgMHhjYiwgMHhiNCwgMHgwZiwgMHg0NiwgMHhlOSwgMHg4ZiwKKwkweDlkLCAweDJhLCAweDE1LCAweGMxLCAweGJiLCAweDRhLCAweGJlLCAweDMwLCAweDE2LCAweDA0LCAweDMzLCAweGYwLAorCTB4ZDEsIDB4MWYsIDB4ODQsIDB4MGQsIDB4ZWYsIDB4ZWEsIDB4M2IsIDB4NjksIDB4YTcsIDB4NjEsIDB4YmIsIDB4MTAsCisJMHgzNiwgMHhkYSwgMHhlNCwgMHhlMywgMHgwZSwgMHhlOCwgMHhmZCwgMHhmMCwgMHgwNCwgMHhjNiwgMHhiMCwgMHg0NywKKwkweGZkLCAweDNlLCAweGZjLCAweDYwLCAweDBmLCAweGYzLCAweDRhLCAweGRiLCAweGZlLCAweGI4LCAweGU2LCAweDliLAorCTB4MWEsIDB4ZTgsIDB4ODAsIDB4OTMsIDB4ZGQsIDB4OGMsIDB4MzMsIDB4ZjksIDB4ZGUsIDB4NWUsIDB4ZDUsIDB4OWUsCisJMHhlZiwgMHgwMywgMHhjYywgMHgxMSwgMHg3NSwgMHhiZiwgMHgzMCwgMHhjNiwgMHhkMSwgMHhiNCwgMHhjOCwgMHhiNiwKKwkweGE3LCAweDVjLCAweDE4LCAweDkwLCAweGZiLCAweDZjLCAweDVlLCAweDNlLCAweGE4LCAweDgzLCAweDFkLCAweDVhLAorCTB4YTcsIDB4OGMsIDB4NWQsIDB4YWUsIDB4YjYsIDB4MjUsIDB4YmQsIDB4ZGYsIDB4ODAsIDB4ZDAsIDB4YWMsIDB4NGQsCisJMHg5YiwgMHgzZCwgMHg4MSwgMHg3ZCwgMHhjNSwgMHg2YSwgMHhiYiwgMHhmZSwgMHg1ZSwgMHhkOCwgMHhmNSwgMHhhYywKKwkweDIzLCAweGFlLCAweGIxLCAweGViLCAweGVmLCAweGIyLCAweGJjLCAweGM2LCAweGRmLCAweDllLCAweGI2LCAweGYxLAorCTB4MGYsIDB4MDAsIDB4YmUsIDB4MWQsIDB4NzMsIDB4MzYsIDB4M2UsIDB4ZGIsIDB4YTAsIDB4YWQsIDB4MjEsIDB4NzIsCisJMHgwMywgMHhlYywgMHhiYywgMHgxYiwgMHhjMSwgMHg4MywgMHgzNywgMHhjMSwgMHg4ZiwgMHg3YSwgMHg3NywgMHhkMSwKKwkweDkzLCAweDlkLCAweGM1LCAweDY2LCAweGY4LCAweGRiLCAweGFkLCAweGYyLCAweGFiLCAweDYzLCAweDFiLCAweGE1LAorCTB4N2YsIDB4ZjQsIDB4NzcsIDB4OWEsIDB4YTEsIDB4NTcsIDB4NjEsIDB4OTcsIDB4YmUsIDB4MDgsIDB4MzgsIDB4MjMsCisJMHg1NiwgMHg1NiwgMHg0NywgMHhjMSwgMHgwMywgMHhlZCwgMHg4OSwgMHgxZiwgMHhhOCwgMHg0NCwgMHhhYiwgMHg5MSwKKwkweGVkLCAweDNjLCAweDRiLCAweGJlLCAweDVjLCAweDNiLCAweDMxLCAweGQ0LCAweDY3LCAweDFjLCAweGE1LCAweDQ1LAorCTB4Y2UsIDB4MWMsIDB4YTcsIDB4ZTcsIDB4OTUsIDB4ODAsIDB4MmQsIDB4OWUsIDB4ODIsIDB4MWQsIDB4YjIsIDB4MDEsCisJMHhlZCwgMHgzMSwgMHg5NiwgMHhiYywgMHg1YSwgMHg5ZSwgMHhkOSwgMHhlYSwgMHhkZSwgMHg5ZCwgMHhkMywgMHg3YywKKwkweDc4LCAweGM5LCAweGM5LCAweDhlLCAweGRkLCAweDI0LCAweDg1LCAweGMxLCAweDI4LCAweGM2LCAweGEwLCAweDlhLAorCTB4ZDcsIDB4Y2EsIDB4ZjUsIDB4ZDIsIDB4YWYsIDB4YzcsIDB4NzMsIDB4NTksIDB4MGUsIDB4NDIsIDB4MWYsIDB4ZmYsCisJMHg2OSwgMHhiMSwgMHg1ZiwgMHg2NiwgMHgwNywgMHg5YSwgMHhmMCwgMHgxZCwgMHg5NSwgMHg2NywgMHg4YSwgMHg1YiwKKwkweGUwLCAweGVmLCAweGZjLCAweDBhLCAweDcwLCAweDU0LCAweDhiLCAweGVmLCAweDVhLCAweGU5LCAweDVkLCAweDQ3LAorCTB4NWUsIDB4NmQsIDB4OTAsIDB4MTksIDB4YTQsIDB4ZGYsIDB4MjgsIDB4YmYsIDB4NjQsIDB4ZDMsIDB4OTksIDB4NDYsCisJMHhkZSwgMHg2OCwgMHg0MCwgMHhkZCwgMHhhOCwgMHg5YywgMHgyZiwgMHhkMiwgMHg5NiwgMHhkNCwgMHgzYywgMHhkMSwKKwkweGYzLCAweGIyLCAweDZjLCAweGM5LCAweGJjLCAweDBjLCAweGRiLCAweGY0LCAweDU5LCAweDNjLCAweGNmLCAweDRiLAorCTB4NzIsIDB4ZTcsIDB4NmUsIDB4NjcsIDB4NGIsIDB4YTIsIDB4ZGQsIDB4ODEsIDB4YmUsIDB4YzQsIDB4ZTMsIDB4M2EsCisJMHg1YiwgMHhiYywgMHg1YSwgMHhlNywgMHg1YSwgMHhkYiwgMHg0NiwgMHg4ZCwgMHgzYywgMHgzZiwgMHhhOCwgMHhlMiwKKwkweDBkLCAweDk4LCAweDkzLCAweGNkLCAweDRlLCAweDg3LCAweDRkLCAweGUzLCAweGI3LCAweGJlLCAweDJmLCAweDUxLAorCTB4ZGEsIDB4Y2YsIDB4YTgsIDB4MGQsIDB4YWIsIDB4NDQsIDB4ZGEsIDB4MWEsIDB4NjAsIDB4ZTcsIDB4ZWMsIDB4MTEsCisJMHhkNSwgMHhkYywgMHgyMCwgMHhhZSwgMHhiNCwgMHg0ZiwgMHhhOCwgMHg1NiwgMHhhNCwgMHhmOSwgMHgzNiwgMHgyZCwKKwkweGQ2LCAweDAwLCAweDlkLCAweDgwLCAweGI0LCAweDE2LCAweGE0LCAweDZkLCAweGIyLCAweDY5LCAweDRkLCAweDBkLAorCTB4NTIsIDB4OGIsIDB4YjQsIDB4Y2IsIDB4OWEsIDB4ZTcsIDB4MmYsIDB4NzYsIDB4ZjgsIDB4NWUsIDB4Y2UsIDB4YTksCisJMHg5NywgMHhiNiwgMHg1MywgMHgwZCwgMHg5MCwgMHgwZCwgMHhhYiwgMHg2NSwgMHg2NiwgMHg2YiwgMHg5ZCwgMHhiNCwKKwkweDIxLCAweDhmLCAweDMxLCAweGVlLCAweGQ0LCAweGE5LCAweGE4LCAweGJjLCAweGYzLCAweDU0LCAweDdiLCAweGZjLAorCTB4YTMsIDB4MTgsIDB4NDMsIDB4ZmIsIDB4MTksIDB4YzYsIDB4YmMsIDB4ZmYsIDB4YWMsIDB4OTksIDB4MzEsIDB4OWYsCisJMHhiNiwgMHgzMywgMHg3YywgMHhkNywgMHg2OSwgMHhmOSwgMHg0MywgMHg3YywgMHg5OCwgMHgzYiwgMHhkZiwgMHg2MCwKKwkweDYzLCAweDk0LCAweDhlLCAweDNiLCAweGMzLCAweGEzLCAweGQ0LCAweGRiLCAweGVkLCAweGY2LCAweDdlLCAweGEyLAorCTB4ZmYsIDB4ZDksIDB4NGMsIDB4NWYsIDB4NmQsIDB4ODIsIDB4MzYsIDB4NTQsIDB4ODksIDB4ZmMsIDB4NDgsIDB4ZGQsCisJMHg4MywgMHhmNywgMHhiOCwgMHgyMywgMHg4NSwgMHg3OSwgMHg5OSwgMHgzNSwgMHg0NSwgMHhiZSwgMHgzYSwgMHhhZSwKKwkweGI4LCAweDRmLCAweDA1LCAweDY5LCAweDk1LCAweDc3LCAweDA1LCAweDY2LCAweDhlLCAweGM5LCAweDBiLCAweDQ2LAorCTB4MmUsIDB4ZmQsIDB4OWEsIDB4OTEsIDB4NGIsIDB4YTcsIDB4Y2YsIDB4MmQsIDB4OTAsIDB4NGIsIDB4MDUsIDB4MmQsCisJMHg5NywgMHgwNiwgMHgwNSwgMHhlZiwgMHhhOSwgMHgwMiwgMHhlNCwgMHhkMiwgMHgwOCwgMHhiZSwgMHgzZCwgMHgyZCwKKwkweDk3LCAweDYyLCAweDYyLCAweDZkLCAweDY0LCAweDg5LCAweDVlLCAweGM1LCAweGZlLCAweDI3LCAweDRiLCAweGFlLAorCTB4YjYsIDB4YTUsIDB4MGEsIDB4ZTMsIDB4YjAsIDB4NDMsIDB4NGEsIDB4MjMsIDB4NTYsIDB4NjcsIDB4NGIsIDB4YmEsCisJMHg0OSwgMHgzYSwgMHg3YSwgMHg3ZSwgMHgyYSwgMHhhMSwgMHg5ZCwgMHgzOSwgMHhkYiwgMHhjYywgMHgzYiwgMHg4ZiwKKwkweDVmLCAweDU0LCAweDk0LCAweDYxLCAweDI3LCAweDIwLCAweGMzLCAweDFlLCAweGJlLCAweDgyLCAweDBjLCAweDQzLAorCTB4NWUsIDB4MTksIDB4NzksIDB4NjUsIDB4YjYsIDB4ZmIsIDB4ZGQsIDB4OWYsIDB4MGUsIDB4NzksIDB4OTQsIDB4MWYsCisJMHg5NCwgMHgxOSwgMHg5MCwgMHg0OSwgMHgyNSwgMHhjOCwgMHhhNCwgMHgxMiwgMHhlNCwgMHg1NCwgMHgwOSwgMHg3MiwKKwkweGE5LCAweDA0LCAweGI5LCAweDU0LCAweDgyLCAweDVjLCAweDJhLCAweDQxLCAweDJlLCAweDQxLCAweGM2LCAweDNkLAorCTB4MGEsIDB4MTksIDB4NjcsIDB4NjQsIDB4ZGEsIDB4MDAsIDB4ZWQsIDB4MzUsIDB4YjksIDB4Y2YsIDB4ZWEsIDB4NzcsCisJMHgxMywgMHgyNywgMHhlOSwgMHhiMiwgMHg3ZSwgMHg5MSwgMHhkOSwgMHhiMywgMHg3YSwgMHhhZSwgMHgyYSwgMHgyZSwKKwkweGI4LCAweGViLCAweDg4LCAweGU2LCAweDc3LCAweGNmLCAweDU3LCAweGQ3LCAweDNhLCAweGRjLCAweDFmLCAweGYzLAorCTB4MDMsIDB4ZWQsIDB4YjMsIDB4NmYsIDB4ZTYsIDB4NmYsIDB4YTksIDB4MDMsIDB4NWYsIDB4YmYsIDB4NjIsIDB4ZjksCisJMHg3YSwgMHhmMywgMHgxYywgMHg1ZiwgMHgyNywgMHgxZCwgMHhjNiwgMHg4OSwgMHg5NywgMHhlNywgMHhlYiwgMHgxNiwKKwkweDliLCAweDk3LCAweDBmLCAweDU2LCAweDgwLCAweGFmLCAweDU3LCAweDJjLCAweGUyLCAweGViLCAweDI4LCAweGY4LAorCTB4N2EsIDB4ZTcsIDB4MTIsIDB4YmUsIDB4NWUsIDB4ZTUsIDB4ZjQsIDB4ZWEsIDB4M2EsIDB4M2MsIDB4ODMsIDB4YzYsCisJMHhlZiwgMHg1YSwgMHg2NywgMHg5ZSwgMHhhZiwgMHhmNywgMHg2YiwgMHhiZSwgMHgzZSwgMHgwNCwgMHhiZSwgMHhiZSwKKwkweGJlLCAweDhhLCAweGFmLCAweDc3LCAweDRhLCAweGYyLCAweDk2LCAweDZjLCAweDY0LCAweGEzLCAweGVjLCAweGJlLAorCTB4NWYsIDB4MzUsIDB4YWYsIDB4OTEsIDB4N2YsIDB4MTEsIDB4NTMsIDB4ZGYsIDB4ZjAsIDB4NTgsIDB4ZWYsIDB4NTgsCisJMHhiMywgMHhlNCwgMHgxZSwgMHhmYSwgMHgxMSwgMHhkNywgMHgwNiwgMHhjOCwgMHgyMywgMHg0MywgMHgxOSwgMHhjNywKKwkweDkzLCAweDgzLCAweDQ3LCAweDdlLCAweDIwLCAweGQzLCAweDlhLCAweGI3LCAweDQ0LCAweGY2LCAweDFjLCAweDg5LAorCTB4Y2EsIDB4ZjAsIDB4MTEsIDB4YzYsIDB4MWUsIDB4YmUsIDB4NjMsIDB4ZTksIDB4YmQsIDB4NGUsIDB4ODYsIDB4MDcsCisJMHhiOSwgMHg1ZiwgMHhkMiwgMHg5NSwgMHhkZCwgMHg0NywgMHhlMCwgMHg2MywgMHgxZCwgMHg2MSwgMHhlYywgMHhlMSwKKwkweGYyLCAweDFjLCAweDhmLCAweDRkLCAweDQzLCAweGI2LCAweGVjLCAweDNlLCAweGEyLCAweGU3LCAweDFhLCAweGVkLAorCTB4MzQsIDB4YzgsIDB4YTEsIDB4MjMsIDB4MjIsIDB4YjcsIDB4MWQsIDB4NzEsIDB4ZTUsIDB4ZjYsIDB4MjMsIDB4NzMsCisJMHhiYywgMHgzNiwgMHgxMCwgMHhmMiwgMHhkYSwgMHg5ZiwgMHg4MywgMHhkNywgMHhkYSwgMHgyZCwgMHhhZiwgMHhhOSwKKwkweDM5LCAweDVlLCAweGZiLCAweDVhLCAweDE1LCAweGFmLCAweGIxLCAweDNlLCAweDc5LCAweGVkLCAweDgyLCAweDRkLAorCTB4ZTMsIDB4YjcsIDB4MmIsIDB4N2IsIDB4OGYsIDB4YjQsIDB4Y2EsIDB4ZWUsIDB4ODcsIDB4ZGUsIDB4MjIsIDB4N2IsCisJMHhlZSwgMHgyNywgMHhhYywgMHhlNiwgMHg5ZSwgMHgzYywgMHhkYSwgMHg1ZiwgMHhlMywgMHg5NSwgMHg3NiwgMHhiNCwKKwkweDFmLCAweGVlLCAweDBmLCAweGQyLCAweDc3LCAweDY1LCAweDc1LCAweDRlLCAweDQ4LCAweDMyLCAweGNmLCAweGZlLAorCTB4NmEsIDB4ZTEsIDB4M2IsIDB4OWYsIDB4ODIsIDB4NGYsIDB4YjEsIDB4MTcsIDB4MzAsIDB4ZGQsIDB4N2EsIDB4NDQsCisJMHg5MiwgMHhhZSwgMHhiYywgMHgyNiwgMHgyMywgMHhhOSwgMHg0NywgMHg1YiwgMHg4ZCwgMHgzZCwgMHg3MSwgMHgwOSwKKwkweGJjLCAweDQyLCAweGZhLCAweGNmLCAweDQ4LCAweGVlLCAweGVkLCAweDgxLCAweGY2LCAweDJiLCAweDQ2LCAweGNiLAorCTB4NDIsIDB4ZmYsIDB4OWYsIDB4MzEsIDB4NzMsIDB4YzcsIDB4ZGMsIDB4NzcsIDB4YzcsIDB4ZjMsIDB4YmUsIDB4MzUsCisJMHhmYSwgMHhiYywgMHg5YiwgMHg4ZSwgMHhkNywgMHg3NiwgMHgzMywgMHhiZiwgMHg0NiwgMHhlZiwgMHgzNywgMHhjZCwKKwkweGU5LCAweGIzLCAweGRjLCAweGFjLCAweGNmLCAweDc2LCAweDYyLCAweDNhLCAweDllLCAweDVlLCAweDI4LCAweGYzLAorCTB4OGUsIDB4MzAsIDB4ZGUsIDB4YmQsIDB4Y2MsIDB4YmIsIDB4MDYsIDB4ZmYsIDB4ZjgsIDB4MmEsIDB4MTMsIDB4OWIsCisJMHgyNSwgMHhkZiwgMHg3ZCwgMHhkZCwgMHhjOSwgMHgxNSwgMHgyZiwgMHhlOSwgMHg3ZCwgMHg4NSwgMHg1OSwgMHgxZiwKKwkweGJmLCAweGNiLCAweGZjLCAweDY2LCAweGY5LCAweDRiLCAweDhjLCAweDcxLCAweDI0LCAweDEyLCAweGVhLCAweDgxLAorCTB4NTYsIDB4ZWUsIDB4M2IsIDB4MTgsIDB4OWMsIDB4MzIsIDB4NzYsIDB4OTQsIDB4ZTEsIDB4ZDEsIDB4MDYsIDB4ZWQsCisJMHg2YiwgMHg4YywgMHhlMCwgMHg3YiwgMHhmNywgMHg2OCwgMHhhMywgMHg1MywgMHhhMCwgMHg2ZCwgMHgzMiwgMHhkMCwKKwkweGUwLCAweGU0LCAweGM3LCAweGY3LCAweGI0LCAweDFhLCAweDliLCAweDc5LCAweDIwLCAweGNlLCAweDNkLCAweDg1LAorCTB4MTksIDB4YjUsIDB4NTQsIDB4MjYsIDB4OWYsIDB4OTIsIDB4NTAsIDB4MjYsIDB4MjcsIDB4NmYsIDB4YzksIDB4YzAsCisJMHhiNiwgMHhjZSwgMHgxZCwgMHhkMSwgMHhmNywgMHhmNywgMHgyNSwgMHhkYSwgMHgxNSwgMHhjNywgMHhmNCwgMHgwOSwKKwkweGM4LCAweGQ3LCAweDkwLCAweDE2LCAweGUyLCAweGYyLCAweGYxLCAweDIzLCAweGE0LCAweDA3LCAweDE1LCAweDZiLAorCTB4OTQsIDB4ZGYsIDB4YjIsIDB4ZjQsIDB4NzAsIDB4NTksIDB4OGEsIDB4OTAsIDB4M2IsIDB4NDcsIDB4OGUsIDB4ZGMsCisJMHgyZSwgMHhlMywgMHhiYiwgMHgxNiwgMHhkMywgMHhjMywgMHg5ZSwgMHg3OSwgMHg3YSwgMHg4OCwgMHhjMSwgMHgzZSwKKwkweDczLCAweGFhLCAweGU5LCAweGUxLCAweDM3LCAweGU3LCAweGU4LCAweDYxLCAweGRjLCAweGY5LCAweGQ3LCAweGQyLAorCTB4YzMsIDB4MGQsIDB4MGIsIDB4ZTgsIDB4NjEsIDB4NDQsIDB4ZDMsIDB4NDMsIDB4ZmYsIDB4MWMsIDB4M2QsIDB4OGMsCisJMHgxYywgMHg2MSwgMHhiZiwgMHg3YSwgMHg1ZCwgMHhkNCwgMHg5YiwgMHg3MSwgMHgzOCwgMHhlNywgMHg3MywgMHhiNCwKKwkweDkwLCAweDE4LCAweGQ2LCAweGZiLCAweDQ0LCAweDkzLCAweDc5LCAweDllLCAweDI1LCAweDVkLCAweGE1LCAweDE4LAorCTB4MWIsIDB4OTksIDB4OWYsIDB4ZmYsIDB4YzYsIDB4N2YsIDB4ZDMsIDB4ZjksIDB4N2YsIDB4NDcsIDB4ZmMsIDB4ZmYsCisJMHhlZiwgMHhmYywgMHg1ZiwgMHg4ZiwgMHhmNiwgMHgyOSwgMHg4YiwgMHg0MywgMHg3OSwgMHgxYywgMHhkMiwgMHhjMywKKwkweDdiLCAweGUyLCAweDQ2LCAweDJmLCAweDcwLCAweDhlLCAweGY5LCAweDZkLCAweGY2LCAweGFjLCAweDlmLCAweDgzLAorCTB4ZmMsIDB4N2IsIDB4MWMsIDB4ZjIsIDB4ZWYsIDB4YjEsIDB4MDUsIDB4ZWIsIDB4MDEsIDB4M2QsIDB4MzYsIDB4MDYsCisJMHgxMSwgMHhjOCwgMHhjMSwgMHhkNCwgMHgzYywgMHgzZSwgMHg2NiwgMHhiYSwgMHg4OSwgMHgwZiwgMHhiMywgMHhmNywKKwkweGU0LCAweDZjLCAweDY1LCAweDMxLCAweDRlLCAweDVjLCAweGJkLCAweGRmLCAweGU4LCAweDY0LCAweGFhLCAweDFhLAorCTB4MjcsIDB4ODQsIDB4N2IsIDB4YjYsIDB4NmEsIDB4OGMsIDB4ZjgsIDB4NWQsIDB4ZTYsIDB4ZjcsIDB4NjUsIDB4YmQsCisJMHg4NywgMHhhNCwgMHhhMCwgMHhkNywgMHg5ZiwgMHg4OCwgMHgxNywgMHhhZSwgMHgzZiwgMHgxMSwgMHgyNywgMHhhZSwKKwkweGI2LCAweGY3LCAweDBiLCAweGU1LCAweDNhLCAweGJkLCAweDJmLCAweGZjLCAweGMwLCAweDU0LCAweDRjLCAweDY2LAorCTB4NjIsIDB4OGMsIDB4ZWIsIDB4ZjEsIDB4ZGUsIDB4NTcsIDB4ZmEsIDB4Y2EsIDB4N2UsIDB4YmMsIDB4MjAsIDB4NzksCisJMHg3YiwgMHhkNiwgMHg2NywgMHg5NSwgMHhhNSwgMHg2ZCwgMHhjNiwgMHgwMywgMHg3OSwgMHgyNywgMHg0MiwgMHhiOCwKKwkweDBlLCAweGQxLCAweDY5LCAweDY1LCAweDVkLCAweDQzLCAweDU1LCAweDljLCAweDEyLCAweDc4LCAweDFmLCAweDkzLAorCTB4NDQsIDB4YjYsIDB4MWIsIDB4ZWYsIDB4MjksIDB4ZjYsIDB4ZmQsIDB4YTQsIDB4OGMsIDB4M2MsIDB4NTgsIDB4ODYsCisJMHgyZCwgMHhmNywgMHgzMCwgMHg3NCwgMHg4ZSwgMHgyMywgMHgxMCwgMHg5MywgMHhmYSwgMHgyZSwgMHgxNCwgMHhjMiwKKwkweDMwLCAweGExLCAweGVmLCAweGY1LCAweGEzLCAweGRmLCAweDQ3LCAweDdhLCAweDg4LCAweGUzLCAweGZiLCAweGIyLAorCTB4OGQsIDB4MjUsIDB4YzUsIDB4YTUsIDB4NTAsIDB4ZmMsIDB4MDEsIDB4ZTAsIDB4ZTcsIDB4MWQsIDB4OTQsIDB4M2YsCisJMHhjMiwgMHhmYiwgMHg4ZCwgMHhlNiwgMHhjMywgMHhmOCwgMHgyMSwgMHgwMywgMHhmYSwgMHhjZCwgMHhiOSwgMHg3OSwKKwkweGNkLCAweGM5LCAweDk0LCAweGNkLCAweGZlLCAweDk2LCAweGFhLCAweGZiLCAweGY1LCAweGU1LCAweGIwLCAweGI2LAorCTB4OWYsIDB4ZDMsIDB4NzYsIDB4NWYsIDB4MGIsIDB4Y2YsIDB4ZTcsIDB4MTksIDB4MWIsIDB4ZmEsIDB4Y2IsIDB4YjAsCisJMHhhMSwgMHg5ZiwgMHhhOCwgMHg2NCwgMHhmNCwgMHgxYSwgMHhkNiwgMHg2MywgMHhiMCwgMHhhMSwgMHgxZiwgMHg4NSwKKwkweGVlLCAweGExLCAweGNlLCAweDg5LCAweDU5LCAweDlkLCAweDMzLCAweGEyLCAweDc2LCAweDY5LCAweDlkLCAweGYzLAorCTB4ZDcsIDB4NWEsIDB4ZTcsIDB4ZmMsIDB4ZWEsIDB4MTIsIDB4OWQsIDB4NzMsIDB4NDgsIDB4YjUsIDB4OGYsIDB4NTIsCisJMHhlNywgMHhmNCwgMHhhYSwgMHg5ZCwgMHgwZSwgMHhlZCwgMHhjNSwgMHhiNSwgMHhjYiwgMHhlOCwgMHg5YywgMHhmNywKKwkweGNhLCAweGFmLCAweGQ4LCAweGJjLCAweGZkLCAweGYyLCAweGJlLCAweDZkLCAweDdhLCAweGRkLCAweGM2LCAweDliLAorCTB4NTAsIDB4YmMsIDB4Y2IsIDB4Y2UsIDB4ZTgsIDB4YTAsIDB4ZWIsIDB4NTUsIDB4YTcsIDB4NWUsIDB4ZWYsIDB4ZmQsCisJMHg2YSwgMHg5NSwgMHhjZSwgMHg2OSwgMHg1MywgMHhkZCwgMHg0ZSwgMHhhZiwgMHhhZSwgMHhjMywgMHg3OCwgMHgwNCwKKwkweGJmLCAweDUzLCAweDRlLCAweDY2LCAweGEwLCAweDBlLCAweGRmLCAweDcxLCAweDg5LCAweDFjLCAweGMxLCAweGQ4LAorCTB4Y2QsIDB4N2QsIDB4N2IsIDB4Y2EsIDB4ZTQsIDB4NWQsIDB4NjMsIDB4ZjMsIDB4NTQsIDB4OTgsIDB4ZWUsIDB4OWEsCisJMHhmNCwgMHg3NiwgMHg5YiwgMHg2ZSwgMHg3NCwgMHg1NSwgMHg5YiwgMHg2YSwgMHhkNSwgMHhiYSwgMHg2YSwgMHgzMywKKwkweDE4LCAweDZhLCAweDAyLCAweGZhLCAweDc1LCAweGEyLCAweDE0LCAweGVhLCAweDJjLCAweGZlLCAweDY2LCAweGJjLAorCTB4OTksIDB4NzEsIDB4ODksIDB4MzAsIDB4NmUsIDB4OWQsIDB4NDAsIDB4MTksIDB4M2MsIDB4YTUsIDB4ZDAsIDB4YTYsCisJMHhlNCwgMHg2ZiwgMHhmOCwgMHgwYSwgMHg3OCwgMHhhNiwgMHg4MCwgMHhkNywgMHg1YiwgMHhjMCwgMHgzZiwgMHhiZiwKKwkweDVlLCAweDY0LCAweGRjLCAweGIzLCAweDU5LCAweDhlLCAweDhlLCAweDU1LCAweGU3LCAweGI1LCAweGNhLCAweGJiLAorCTB4YzcsIDB4MzYsIDB4YzgsIDB4YmUsIDB4NTEsIDB4ZmYsIDB4NmEsIDB4YTksIDB4ZGYsIDB4MjgsIDB4MjMsIDB4YTMsCisJMHgyZiwgMHhlYSwgMHhmYiwgMHg0MCwgMHhkNiwgMHhlOCwgMHg3YiwgMHg5MiwgMHg3OCwgMHg3ZiwgMHg5OCwgMHg5MSwKKwkweDkxLCAweGZkLCAweDhlLCAweDkxLCAweDkxLCAweDE5LCAweDM1LCAweDZmLCAweGIzLCAweDg2LCAweDZkLCAweGYyLAorCTB4NmUsIDB4YTYsIDB4YmUsIDB4ZDEsIDB4YjgsIDB4YmUsIDB4NDMsIDB4N2EsIDB4YTIsIDB4NzIsIDB4YWQsIDB4ZmMsCisJMHhkMSwgMHg3MSwgMHg3NSwgMHhhNywgMHg5YSwgMHhiZiwgMHg0YiwgMHg0MSwgMHhkYiwgMHhhYywgMHg5MywgMHgwYiwKKwkweDZjLCAweGQ2LCAweGJmLCAweDk3LCAweDk5LCAweGY3LCAweDQ1LCAweDMxLCAweDRlLCAweGQwLCAweGYwLCAweDc1LAorCTB4MmYsIDB4NzMsIDB4MWQsIDB4YjQsIDB4MzksIDB4MjYsIDB4OTcsIDB4YTQsIDB4NGYsIDB4ZTMsIDB4OGYsIDB4ZjIsCisJMHhiNCwgMHgwMSwgMHg3MiwgMHg3MCwgMHg1NiwgMHhlYiwgMHhkNywgMHhiNSwgMHhiYywgMHhmMywgMHhmOCwgMHgwOCwKKwkweDZkLCAweGQ3LCAweGFmLCAweDZiLCAweDc5LCAweGI2LCAweGQ2LCAweGRhLCAweGFlLCAweGQzLCAweDkwLCAweGQzLAorCTB4OTQsIDB4YTMsIDB4MzcsIDB4Y2EsIDB4NWYsIDB4ZGIsIDB4NzQsIDB4YTYsIDB4MjUsIDB4ZTMsIDB4YjMsIDB4NDIsCisJMHg3ZCwgMHgxNywgMHg4MywgMHgwYywgMHhhNSwgMHgzYywgMHhmZCwgMHg1OSwgMHg2ZCwgMHhkNywgMHhlNywgMHg2YywKKwkweDFiLCAweDk0LCAweDlmLCAweDQ2LCAweDc2LCAweDZmLCAweDc2LCAweGE2LCAweDZkLCAweDFhLCAweGJmLCAweGMzLAorCTB4MTgsIDB4YmEsIDB4OWYsIDB4YzksIDB4NTksIDB4M2UsIDB4NTMsIDB4Y2UsIDB4OTMsIDB4YzgsIDB4NWYsIDB4ODMsCisJMHg3YywgMHhmMiwgMHhkOSwgMHg2MywgMHg5YSwgMHhjZiwgMHhiNCwgMHg3ZCwgMHhlMiwgMHg3NCwgMHhkOSwgMHgzNSwKKwkweDg1LCAweGI5LCAweGY1LCAweDgwLCAweDNjLCAweGY5LCAweDRjLCAweDFkLCAweGY1LCAweGE2LCAweDhkLCAweDNjLAorCTB4ZjAsIDB4OTAsIDB4ZmUsIDB4NDUsIDB4ZTgsIDB4MGUsIDB4ZDYsIDB4NDUsIDB4ZmEsIDB4YjEsIDB4MGMsIDB4ZTYsCisJMHhmMCwgMHgyNCwgMHhmYywgMHg5ZiwgMHg0NiwgMHg3YywgMHgzNywgMHhlMywgMHg3YiwgMHg0MiwgMHg3ZSwgMHg3NSwKKwkweDMwLCAweGFhLCAweGM3LCAweDNkLCAweDgyLCAweDcxLCAweDFjLCAweDM4LCAweDgyLCAweDMxLCAweDM5LCAweGM2LAorCTB4NzYsIDB4NzYsIDB4Y2YsIDB4YjgsIDB4NTIsIDB4NzMsIDB4ODYsIDB4N2MsIDB4YzcsIDB4MzMsIDB4ODYsIDB4NDEsCisJMHhiMCwgMHhiNywgMHg4YiwgMHg3NCwgMHg5YiwgMHhmNCwgMHhmYSwgMHhmNSwgMHhmOSwgMHhiNywgMHhjZCwgMHhmMSwKKwkweDA4LCAweDcwLCAweDcyLCAweDAwLCAweGYzLCAweDMxLCAweDUyLCAweGY0LCAweGJkLCAweGFjLCAweGUzLCAweGM3LAorCTB4MzEsIDB4NGUsIDB4ZDgsIDB4ODAsIDB4ZWQsIDB4YjAsIDB4MDUsIDB4ZGIsIDB4NjEsIDB4MDcsIDB4YjYsIDB4YzMsCisJMHgwZSwgMHg1YywgMHgyZCwgMHhhNywgMHhiNiwgMHg3MiwgMHg3ZiwgMHg0OSwgMHhmZSwgMHg5ZCwgMHhiYywgMHg3NywKKwkweGY5LCAweDFiLCAweDNhLCAweDM2LCAweDVmLCAweDdiLCAweDRiLCAweDFmLCAweDdjLCAweDc2LCAweGYxLCAweDkyLAorCTB4MDMsIDB4ZGMsIDB4NjMsIDB4M2YsIDB4ZWIsIDB4ZDUsIDB4ZGUsIDB4ZDIsIDB4MmYsIDB4ZWQsIDB4M2QsIDB4YzgsCisJMHhlZiwgMHhiOSwgMHgyNCwgMHgxZCwgMHhiNywgMHg3YywgMHhkOCwgMHhhOSwgMHgxZCwgMHhlOCwgMHgwMywgMHgxZSwKKwkweDMzLCAweDRlLCAweDMyLCAweDNlLCAweGU0LCAweDMwLCAweDRlLCAweDkxLCAweGRkLCAweDFjLCAweGQxLCAweDY3LAorCTB4YzQsIDB4YTYsIDB4MTksIDB4OGIsIDB4YjgsIDB4YTUsIDB4M2QsIDB4YjIsIDB4MjUsIDB4YjEsIDB4ZGIsIDB4NDksCisJMHgwZSwgMHhhOCwgMHg0OCwgMHg3MiwgMHhhMCwgMHhjZiwgMHgwOSwgMHhjYiwgMHhmMSwgMHgwZSwgMHg2YSwgMHhjOCwKKwkweDE5LCAweGMwLCAweDdhLCAweGEwLCAweGY0LCAweDc1LCAweGQwLCAweGQzLCAweDc5LCAweDI5LCAweDFjLCAweDZmLAorCTB4OTAsIDB4YTksIDB4NjIsIDB4YmIsIDB4OTcsIDB4NTUsIDB4MzEsIDB4ZTEsIDB4YmUsIDB4MTIsIDB4NzUsIDB4MGEsCisJMHg0NCwgMHg3ZiwgMHgyNiwgMHgyYSwgMHgxMywgMHhhMywgMHgxYiwgMHg0NSwgMHg2OSwgMHhkYiwgMHhiZCwgMHg0NSwKKwkweGIyLCAweDYzLCAweGEzLCAweDcyLCAweGJlLCAweDViLCAweDlhLCAweDE0LCAweGRhLCAweGU3LCAweGRkLCAweGRlLAorCTB4ZWEsIDB4MTQsIDB4ZDcsIDB4MTEsIDB4NDMsIDB4NWUsIDB4NTgsIDB4NGYsIDB4M2UsIDB4MTksIDB4MDUsIDB4MGUsCisJMHg0MSwgMHhiNywgMHg4YywgMHhlYiwgMHhkNiwgMHgwOSwgMHhlNSwgMHhkZSwgMHhlZCwgMHgzYSwgMHg2NiwgMHhjYSwKKwkweDM4LCAweDZkLCAweGY1LCAweDdhLCAweDAzLCAweGY5LCAweDIzLCAweGJhLCAweDJjLCAweDdmLCAweDRjLCAweDk2LAorCTB4YjgsIDB4MzYsIDB4MjMsIDB4NzksIDB4OTcsIDB4NzEsIDB4NjEsIDB4MWYsIDB4YmYsIDB4YzcsIDB4NTksIDB4YjYsCisJMHg0ZSwgMHg0NiwgMHhiYSwgMHhmMywgMHg3NiwgMHg4ZiwgMHhjNywgMHgzNywgMHhjMSwgMHgwNywgMHgxYywgMHg5ZiwKKwkweDVlLCAweDI3LCAweDAxLCAweGFmLCAweDJmLCAweDVlLCAweGNmLCAweDg4LCAweDU2LCAweGM5LCAweDAzLCAweDQ3LAorCTB4NjYsIDB4NDYsIDB4YzMsIDB4ZjUsIDB4MGYsIDB4YjYsIDB4ODcsIDB4ZWYsIDB4NzEsIDB4MjMsIDB4NmYsIDB4YjMsCisJMHg0YiwgMHhlYSwgMHgxMSwgMHgyZSwgMHhhZSwgMHg1NSwgMHgyZSwgMHg5NCwgMHhiMSwgMHg0YSwgMHg5ZiwgMHgxMywKKwkweGY2LCAweGI0LCAweDdjLCAweDNkLCAweDVkLCAweDMxLCAweGIyLCAweDc1LCAweGJjLCAweDEyLCAweGVhLCAweDk2LAorCTB4YTgsIDB4ZDEsIDB4YTUsIDB4NGIsIDB4ZjQsIDB4ODksIDB4ODksIDB4NjAsIDB4Y2UsIDB4ZWIsIDB4OTMsIDB4NGIsCisJMHgzYSwgMHg0NiwgMHhmNywgMHg2YiwgMHg1MywgMHgyZCwgMHhlMiwgMHgxZSwgMHg5MywgMHhkOSwgMHgxMSwgMHhmZiwKKwkweDU0LCAweDJiLCAweGY3LCAweDY5LCAweDhjLCAweGE0LCAweGRlLCAweDhjLCAweDdlLCAweDhjLCAweGI1LCAweDUwLAorCTB4MWYsIDB4MGUsIDB4YTksIDB4YjUsIDB4NzgsIDB4YWYsIDB4ZDEsIDB4ZjQsIDB4MDcsIDB4OWUsIDB4YzIsIDB4YjcsCisJMHhmMSwgMHgxMywgMHhiZSwgMHgwYywgMHgzZiwgMHhlMSwgMHgwOSwgMHhlOCwgMHhiYSwgMHg3MywgMHhmMCwgMHgxMywKKwkweDFlLCAweDg3LCAweDlmLCAweGYwLCAweDE4LCAweGZjLCAweDg0LCAweDQ3LCAweGExLCAweDI3LCAweGFiLCAweGZkLAorCTB4ODMsIDB4ZTEsIDB4MDUsIDB4ZmUsIDB4NDEsIDB4YTAsIDB4ZjksIDB4OWYsIDB4MzEsIDB4YzAsIDB4YzcsIDB4YWIsCisJMHg3YywgMHg4MywgMHhiZCwgMHg0NiwgMHg1ZiwgMHhjMSwgMHhlZiwgMHgzNywgMHg3YywgMHhkNCwgMHhhNiwgMHg2ZSwKKwkweGQ2LCAweGZhLCAweGQxLCAweGVjLCAweGQ5LCAweDFkLCAweDk4LCAweGQzLCAweDU3LCAweDZkLCAweGNhLCAweGU4LAorCTB4YWIsIDB4ODksIDB4NzksIDB4N2QsIDB4NjUsIDB4ZjgsIDB4ZTgsIDB4ZDgsIDB4YTgsIDB4NDQsIDB4ZmMsIDB4ZDEsCisJMHhlOSwgMHg2YywgMHg2YSwgMHhiYiwgMHhlNiwgMHhhMSwgMHgyNiwgMHg3ZiwgMHhhMywgMHg0NCwgMHgxZSwgMHg1MCwKKwkweGNkLCAweDM1LCAweDkyLCAweGI1LCAweGRmLCAweGEwLCAweGFmLCAweGEzLCAweDVmLCAweDQ3LCAweDViLCAweGVmLAorCTB4OTQsIDB4OWMsIDB4YjYsIDB4Y2YsIDB4YWUsIDB4OGMsIDB4ZWYsIDB4NDcsIDB4MTcsIDB4ZTEsIDB4YmIsIDB4NTAsCisJMHg3YSwgMHg1NiwgMHhlMywgMHhmYywgMHg3ZSwgMHg3ZCwgMHgyNiwgMHhiZiwgMHg0MSwgMHg4NiwgMHhjYiwgMHgyMSwKKwkweGNlLCAweDc5LCAweDA2LCAweDhlLCAweGZiLCAweDMwLCAweDVhLCAweDI1LCAweDcyLCAweGFjLCAweDQ1LCAweGZhLAorCTB4NTMsIDB4YTIsIDB4NzIsIDB4YTksIDB4OTUsIDB4N2EsIDB4ZmYsIDB4Y2EsIDB4YTksIDB4NmUsIDB4ODksIDB4ZTcsCisJMHhiYSwgMHg0OSwgMHhhYiwgMHhmNywgMHhjOSwgMHg4NCwgMHg5ZSwgMHg4YiwgMHgxNiwgMHhhOSwgMHgzOSwgMHg0NiwKKwkweDFiLCAweDI1LCAweDVjLCAweGMzLCAweGJiLCAweGJkLCAweGM1LCAweGRlLCAweDQxLCAweDFkLCAweDM1LCAweGU1LAorCTB4NDQsIDB4MGUsIDB4ZWEsIDB4ZjksIDB4OWEsIDB4ZDUsIDB4N2IsIDB4MGMsIDB4NmYsIDB4OWUsIDB4NjIsIDB4MmMsCisJMHg5ZSwgMHhmNywgMHhmZCwgMHgzMSwgMHgwZSwgMHhmZiwgMHhhZiwgMHg5OSwgMHhiZiwgMHg0MiwgMHg4YiwgMHhiMSwKKwkweDY3LCAweGQ2LCAweDU4LCAweDNiLCAweGM2LCAweGM0LCAweGE5LCAweDk2LCAweGI3LCAweDYxLCAweGQ4LCAweDRlLAorCTB4ZjUsIDB4MWQsIDB4YjUsIDB4YWIsIDB4ZTAsIDB4MDMsIDB4MzcsIDB4YTAsIDB4NGQsIDB4YWUsIDB4NjMsIDB4ZGIsCisJMHhiZiwgMHgxNywgMHhlNCwgMHhmZCwgMHhiMywgMHg3MywgMHhjMCwgMHg1ZiwgMHg4NSwgMHhiNCwgMHgwNiwgMHhlNCwKKwkweDMxLCAweDY2LCAweGYzLCAweDg1LCAweDE2LCAweGM2LCAweDY1LCAweGIzLCAweDdlLCAweGEzLCAweDRkLCAweDViLAorCTB4ZTUsIDB4OGMsIDB4OGMsIDB4YjYsIDB4YzMsIDB4MzcsIDB4ZTcsIDB4MzksIDB4NzYsIDB4ZTYsIDB4ZjcsIDB4NzMsCisJMHhlZSwgMHg4NCwgMHg3ZiwgMHhhYiwgMHg2OSwgMHgxMiwgMHhmMiwgMHg2NywgMHg4ZiwgMHg1YywgMHg2YiwgMHhlMywKKwkweGNlLCAweGQ0LCAweGMzLCAweGJmLCAweGI4LCAweDYwLCAweGJkLCAweGY2LCAweDEwLCAweGY0LCAweGQ4LCAweGFkLAorCTB4OTAsIDB4NDcsIDB4ZDQsIDB4YzMsIDB4ODcsIDB4ZTQsIDB4MTcsIDB4MmMsIDB4M2QsIDB4MmYsIDB4ZDQsIDB4YzMsCisJMHgxNywgMHg4NSwgMHhiMSwgMHhlMSwgMHgyZSwgMHhlNCwgMHhlNSwgMHg4MywgMHgyOCwgMHhlOCwgMHhlMSwgMHg3MCwKKwkweDk1LCAweGFmLCAweDQ2LCAweGJmLCAweGFmLCAweDJlLCAweDZkLCAweGQ2LCAweGMwLCAweDE2LCAweGZhLCAweDdkLAorCTB4OTAsIDB4MDMsIDB4YjEsIDB4ZDAsIDB4Y2YsIDB4YWIsIDB4OWQsIDB4NWIsIDB4YTMsIDB4ZGQsIDB4NjksIDB4ZWIsCisJMHg4ZSwgMHhhNCwgMHg1ZSwgMHgyMiwgMHg4ZSwgMHgxMiwgMHg4NywgMHhlNCwgMHhmNiwgMHhmNSwgMHhiYywgMHgyNiwKKwkweGNmLCAweGY1LCAweGJmLCAweGE1LCAweDcxLCAweDI2LCAweDhhLCAweGI0LCAweGI3LCAweDQ2LCAweGMzLCAweDY4LAorCTB4ZTUsIDB4N2MsIDB4MjIsIDB4ZGMsIDB4YmYsIDB4NTEsIDB4YjAsIDB4NzUsIDB4ZjcsIDB4ZDgsIDB4ZjUsIDB4ZjgsCisJMHg4MiwgMHg3YywgMHg5YiwgMHg3MSwgMHhjZSwgMHg0NCwgMHg1ZiwgMHg2NCwgMHgyNSwgMHhjZiwgMHg2NCwgMHhhMywKKwkweGVlLCAweGVkLCAweGRhLCAweDZmLCAweGNmLCAweDQ4LCAweGQ4LCAweDE2LCAweGJmLCAweDZiLCAweGFhLCAweGRhLAorCTB4YTYsIDB4MWQsIDB4YzUsIDB4ZjcsIDB4ZTIsIDB4ZmIsIDB4MWIsIDB4OWUsIDB4ZDcsIDB4NmIsIDB4OGIsIDB4ZTYsCisJMHg2ZSwgMHg5YSwgMHg5MCwgMHg0ZiwgMHhjOCwgMHgzYiwgMHgwOSwgMHg3ZCwgMHg4ZSwgMHhjOSwgMHgzZiwgMHg0NiwKKwkweGJiLCAweDg3LCAweGViLCAweGFlLCAweGRlLCAweGY0LCAweDcwLCAweGVhLCAweDIzLCAweGZhLCAweDBlLCAweGQ1LAorCTB4NzEsIDB4MTEsIDB4YTcsIDB4OTAsIDB4ZGEsIDB4YWIsIDB4ZjcsIDB4OWQsIDB4MTQsIDB4NzQsIDB4N2MsIDB4MzksCisJMHg4ZiwgMHhmNywgMHhiYywgMHg4ZiwgMHhkYSwgMHg3NiwgMHg4YywgMHg3ZiwgMHgwYiwgMHg4OCwgMHg2OSwgMHgxZiwKKwkweDA0LCAweDZjLCAweGQ0LCAweDIxLCAweDk0LCAweGJkLCAweDMxLCAweDY5LCAweDNiLCAweGZhLCAweDdlLCAweGNkLAorCTB4MGIsIDB4NmIsIDB4ZTEsIDB4MGIsIDB4ZjQsIDB4MWUsIDB4ODUsIDB4YWUsIDB4M2UsIDB4MWEsIDB4OTcsIDB4ZmUsCisJMHhhMywgMHg1YSwgMHgzNywgMHg2NiwgMHg5NiwgMHhjNiwgMHgwYSwgMHhiNiwgMHg3OCwgMHgyZSwgMHhmZCwgMHg4OSwKKwkweDk4LCAweDI3LCAweGQ3LCAweDFjLCAweDhkLCAweGM4LCAweGUxLCAweGQ4LCAweDE2LCAweGFmLCAweGMzLCAweGI5LAorCTB4ZDEsIDB4ZWEsIDB4NDIsIDB4NDMsIDB4N2YsIDB4YTAsIDB4MTUsIDB4ZDQsIDB4MzcsIDB4ZWIsIDB4OTAsIDB4YmQsCisJMHhmMywgMHhiMSwgMHg2YiwgMHhkNCwgMHg3ZiwgMHg0OSwgMHg0NiwgMHhjOCwgMHg0YiwgMHg5NSwgMHg4OCwgMHg4YywKKwkweDBmLCAweGI2LCAweDAyLCAweDllLCAweGI3LCAweGFlLCAweDA3LCAweDBlLCAweDQwLCAweDUzLCAweDk4LCAweDFmLAorCTB4ZmQsIDB4ZjcsIDB4M2MsIDB4ZGMsIDB4MzgsIDB4ZTUsIDB4NTcsIDB4MWIsIDB4ZmEsIDB4ZWYsIDB4M2IsIDB4NGEsCisJMHgxZCwgMHhlNiwgMHg2YiwgMHhiZSwgMHg0NiwgMHhiZiwgMHg1ZSwgMHg4ZCwgMHhmNiwgMHgzZCwgMHhjOCwgMHg4YiwKKwkweDZmLCAweDExLCAweGZmLCAweDAxLCAweGM4LCAweGI1LCAweGEzLCAweDUxLCAweGU5LCAweDM4LCAweGRhLCAweDIwLAorCTB4OWIsIDB4OGUsIDB4ZDIsIDB4ZjcsIDB4YTgsIDB4ZjYsIDB4NDUsIDB4NjksIDB4OGIsIDB4NWUsIDB4YzIsIDB4YjgsCisJMHg2ZSwgMHgzNCwgMHhmNywgMHgwZCwgMHg0ZSwgMHg0NSwgMHg2NSwgMHgxZiwgMHhmOSwgMHgxNSwgMHg2NSwgMHg3MywKKwkweGIwLCAweDkzLCAweGIzLCAweDQ3LCAweDNkLCAweGJkLCAweDE2LCAweDlhLCAweGM1LCAweDM4LCAweGY5LCAweDM3LAorCTB4MmMsIDB4ZmEsIDB4OGUsIDB4MWEsIDB4MzksIDB4NTMsIDB4YTAsIDB4NmYsIDB4MzIsIDB4ZDAsIDB4MDIsIDB4YmMsCisJMHgzZSwgMHg2MCwgMHhmOSwgMHhlNSwgMHgzZCwgMHhlYiwgMHgyZCwgMHg1ZiwgMHhmZSwgMHg5YywgMHhmYywgMHg5NiwKKwkweDViLCAweDZmLCAweGU0LCAweGU1LCAweDg3LCAweGQ2LCAweDczLCAweDJmLCAweGQyLCAweDVhLCAweDlmLCAweGVmLAorCTB4M2EsIDB4NmQsIDB4NDMsIDB4MTgsIDB4YjksIDB4ZjksIDB4N2EsIDB4ZmMsIDB4MjcsIDB4YzAsIDB4NTEsIDB4YjgsCisJMHhmZSwgMHg0NCwgMHgzZSwgMHhlNCwgMHgxYSwgMHhiMiwgMHgzZSwgMHhiMywgMHg5MiwgMHg5YSwgMHhkMSwgMHg3ZiwKKwkweDUzLCAweDg5LCAweDZiLCAweDYxLCAweGYzLCAweGY3LCAweDU5LCAweDZkLCAweGFmLCAweDMwLCAweDM2LCAweGZlLAorCTB4NGMsIDB4ZjgsIDB4MzcsIDB4OWMsIDB4YWEsIDB4ZjYsIDB4MTksIDB4NTYsIDB4YWYsIDB4NzUsIDB4MzEsIDB4YmUsCisJMHgzNCwgMHhiNywgMHgxNywgMHgyOCwgMHgxOCwgMHhkNSwgMHg3NywgMHhjMiwgMHhjNSwgMHg5YywgMHg4YiwgMHhjNSwKKwkweDVhLCAweGU3LCAweDliLCAweDYzLCAweDEyLCAweGI4LCAweDdlLCAweGRjLCAweGY5LCAweDk2LCAweGNmLCAweGI1LAorCTB4NzEsIDB4Y2YsIDB4NzksIDB4YjksIDB4ZTgsIDB4ODMsIDB4ZjcsIDB4ZmUsIDB4MDIsIDB4ZTMsIDB4NjgsIDB4NzUsCisJMHg1ZSwgMHhjMSwgMHg5YywgMHgxZSwgMHgyYywgMHg2NSwgMHg5MiwgMHg5ZSwgMHg4ZCwgMHg4MywgMHgzZiwgMHg1YiwKKwkweDZjLCAweDc1LCAweDllLCAweDliLCAweDhmLCAweDIxLCAweGY1LCAweDg0LCAweDc0LCAweDcxLCAweDg4LCAweDc5LAorCTB4NjUsIDB4ZTQsIDB4OTUsIDB4MTksIDB4ZWIsIDB4YWQsIDB4NzcsIDB4MjYsIDB4YzcsIDB4ZWMsIDB4N2UsIDB4MTIsCisJMHhhMywgMHg4YiwgMHhlNiwgMHhkNiwgMHg1ZiwgMHgwNiwgMHhmNCwgMHhmYSwgMHg4NCwgMHhlYiwgMHg0YywgMHg0ZSwKKwkweDRkLCAweGFmLCAweDM3LCAweGZiLCAweDhhLCAweDZhLCAweDkxLCAweDY3LCAweGY2LCAweDU4LCAweDRlLCAweDRjLAorCTB4ZDUsIDB4YTIsIDB4NGMsIDB4YmQsIDB4MzMsIDB4YTEsIDB4NjMsIDB4NWUsIDB4ZGEsIDB4ZjYsIDB4NzAsIDB4YzYsCisJMHhhNywgMHhlYSwgMHg5ZCwgMHgyOSwgMHhiZCwgMHhkNiwgMHgxYywgMHg3NSwgMHg0ZSwgMHg4ZSwgMHhiMSwgMHhlZCwKKwkweDI4LCAweGNhLCAweDg4LCAweDczLCAweDBhLCAweGVkLCAweDRkLCAweDhkLCAweGI1LCAweGM3LCAweGY3LCAweDQ5LAorCTB4M2IsIDB4NmMsIDB4MDEsIDB4ZmUsIDB4OGQsIDB4MzQsIDB4ZGUsIDB4MTcsIDB4ZTAsIDB4M2EsIDB4NTMsIDB4NzMsCisJMHhlZCwgMHgyYSwgMHhiNCwgMHhjMywgMHhiMiwgMHhhNCwgMHg0MSwgMHhmNiwgMHhlYiwgMHhhMiwgMHhmZCwgMHhhNSwKKwkweDZiLCAweDUyLCAweDRiLCAweDcxLCAweDMyLCAweDA2LCAweDljLCAweDFjLCAweGI0LCAweDM4LCAweDM5LCAweDYxLAorCTB4NzEsIDB4MzIsIDB4NWEsIDB4ODUsIDB4OTMsIDB4ODcsIDB4MTcsIDB4ZTEsIDB4ZTQsIDB4MDQsIDB4NzAsIDB4ZjIsCisJMHhmMCwgMHgxNSwgMHg3MCwgMHg4MiwgMHhiYywgMHhmMiwgMHhjMywgMHgxNiwgMHgyNywgMHhmNywgMHgyZCwgMHhjMiwKKwkweDQ5LCAweDdlLCAweDJlLCAweDE2LCAweDZmLCAweDcwLCAweDMyLCAweDAyLCAweDljLCAweGQ0LCAweGI0LCAweDFhLAorCTB4ZDgsIDB4MGYsIDB4NWEsIDB4OWMsIDB4ZTAsIDB4M2QsIDB4NzUsIDB4MTAsIDB4NjUsIDB4ZWUsIDB4YWIsIDB4YzIsCisJMHhjOSwgMHg0MSwgMHhlMCwgMHhlNCwgMHgzZSwgMHg4YiwgMHg5MywgMHhjMywgMHgxNiwgMHgyNywgMHg4NywgMHg1MSwKKwkweDI2LCAweDBmLCAweDljLCAweDE0LCAweDk2LCAweGMxLCAweGM5LCAweDA4LCAweDcwLCAweDEyLCAweGI2LCAweDViLAorCTB4NDAsIDB4M2IsIDB4ODcsIDB4YWIsIDB4NzAsIDB4MzIsIDB4YjIsIDB4MGMsIDB4NGUsIDB4YjgsIDB4ZTYsIDB4MWEsCisJMHhlZSwgMHhlMSwgMHhiZSwgMHhmYywgMHgwNiwgMHg3YiwgMHhiOCwgMHg1MywgMHg5ZiwgMHg3ZCwgMHhlMywgMHgzZCwKKwkweGRjLCAweDJjLCAweDczLCAweGI5LCAweGVhLCAweGNjLCAweGZiLCAweGIzLCAweDc2LCAweDRmLCAweDlhLCAweGQ5LAorCTB4ZmIsIDB4MzcsIDB4N2YsIDB4MGYsIDB4NWUsIDB4M2IsIDB4ZjgsIDB4YmMsIDB4OTAsIDB4ZjcsIDB4YzQsIDB4ZWMsCisJMHgyMSwgMHg3NSwgMHhiNywgMHg0ZCwgMHg4MSwgMHhkNywgMHg4ZSwgMHhjYSwgMHg4MSwgMHhlMywgMHhiNSwgMHg4NywKKwkweDczLCAweDM2LCAweGNkLCAweGRmLCAweGQ2LCAweDllLCAweDU3LCAweDhhLCAweDc5LCAweGUxLCAweGRlLCAweDgzLAorCTB4MTcsIDB4Y2QsIDB4NWQsIDB4NTAsIDB4MzEsIDB4OWUsIDB4YzcsIDB4YTgsIDB4NWUsIDB4N2IsIDB4N2UsIDB4ZDEsCisJMHhkZSwgMHg1NSwgMHhlNCwgMHhkZCwgMHg5YiwgMHhmNSwgMHhhNywgMHgxMywgMHhkYywgMHg1NywgMHg1NSwgMHhkMCwKKwkweGYwLCAweDcyLCAweDJkLCAweGFkLCAweDQ3LCAweGVmLCAweGE1LCAweGNhLCAweDE2LCAweDY5LCAweDY3LCAweDI3LAorCTB4YjgsIDB4MjcsIDB4MGQsIDB4ZjYsIDB4MzEsIDB4ZjcsIDB4ZWQsIDB4OWEsIDB4N2QsIDB4YmEsIDB4YmQsIDB4MGIsCisJMHhmNiwgMHhlOSwgMHg1NiwgMHg5ZiwgMHhlZiwgMHgyNiwgMHhkZiwgMHhjZCwgMHhkMywgMHhjZCwgMHhjMSwgMHhiOSwKKwkweGJiLCAweDU3LCAweDhmLCAweDNiLCAweGNmLCAweGU4LCAweGY4LCAweDcwLCAweDNkLCAweGU2LCAweDI3LCAweDA4LAorCTB4NGUsIDB4YTcsIDB4NGMsIDB4NWMsIDB4NzYsIDB4NDYsIDB4YzcsIDB4NjUsIDB4MDUsIDB4MWUsIDB4ZjgsIDB4YjAsCisJMHg4ZCwgMHhjZCwgMHg3NiwgMHhmNCwgMHg1YywgMHg5ZSwgMHg4YiwgMHhjYiwgMHgyZSwgMHhkOCwgMHhhMywgMHhhMywKKwkweGVmLCAweGZmLCAweGM4LCAweDhlLCAweDVlLCAweGQyLCAweDdiLCAweDcxLCAweGZhLCAweDUyLCAweDhlLCAweDE0LAorCTB4MjAsIDB4MjMsIDB4ZjYsIDB4OGMsIDB4YmYsIDB4MmEsIDB4YzMsIDB4MGYsIDB4ZjIsIDB4OWIsIDB4M2EsIDB4MmQsCisJMHgwMiwgMHhiZCwgMHg0NSwgMHhiOSwgMHg5ZCwgMHg5NywgMHg2YywgMHgwZiwgMHhkMywgMHg0YywgMHg5ZCwgMHgzZSwKKwkweGVkLCAweDIzLCAweDFmLCAweDc3LCAweDdhLCAweGU3LCAweGZhLCAweDI3LCAweDdlLCAweGMzLCAweDM1LCAweDcwLAorCTB4ZmUsIDB4YTYsIDB4OWQsIDB4OTMsIDB4NzEsIDB4YjIsIDB4MTUsIDB4ZTYsIDB4ODcsIDB4NmIsIDB4ZTEsIDB4NzcsCisJMHhkYiwgMHhmYiwgMHgwOCwgMHg5OSwgMHg1ZiwgMHg3ZCwgMHhmZiwgMHhiNSwgMHhlMSwgMHhkMywgMHhhYywgMHhmZSwKKwkweDNiLCAweDIyLCAweDIzLCAweDRlLCAweDFmLCAweGVhLCAweDRjLCAweDdiLCAweDBkLCAweDAzLCAweDJhLCAweDdkLAorCTB4ZDMsIDB4MDAsIDB4Y2YsIDB4Y2EsIDB4NGQsIDB4MmMsIDB4ZjksIDB4ZmIsIDB4MDEsIDB4ZjMsIDB4YmEsIDB4YjAsCisJMHhhMCwgMHhlNywgMHg5NCwgMHhmYiwgMHhiMCwgMHhhNiwgMHg0MSwgMHg4YiwgMHg5YSwgMHhiNiwgMHgzNCwgMHhmZCwKKwkweDFmLCAweDk4LCAweGQzLCAweDkxLCAweGQ0LCAweGFkLCAweGQ0LCAweDkzLCAweGExLCAweDhlLCAweDRjLCAweGM2LAorCTB4ZmIsIDB4NzgsIDB4N2YsIDB4ODQsIDB4YTYsIDB4NzEsIDB4N2IsIDB4OTcsIDB4YzQsIDB4ZDQsIDB4MzksIDB4YWQsCisJMHhkZiwgMHg0NywgMHg1MiwgMHhiYywgMHg1ZiwgMHg2NiwgMHg5OSwgMHhiMiwgMHhhMywgMHg1NSwgMHg2NSwgMHhmNSwKKwkweGI4LCAweDNkLCAweGY5LCAweDQzLCAweGNjLCAweGNkLCAweDE3LCAweDYxLCAweDZmLCAweGY2LCAweDhlLCAweGJkLAorCTB4MGEsIDB4OWYsIDB4MzEsIDB4MmUsIDB4NWYsIDB4MmEsIDB4YmQsIDB4MDQsIDB4N2EsIDB4Y2QsIDB4YWYsIDB4YjUsCisJMHg3NywgMHhlMSwgMHg2NSwgMHgwMSwgMHgzNywgMHhjZiwgMHgzOCwgMHhlYiwgMHhmZCwgMHhjMywgMHg5MSwgMHgzZiwKKwkweDAyLCAweDVkLCAweGZjLCAweGMxLCAweDRiLCAweGVjLCAweDAzLCAweGIwLCAweDQ0LCAweDYwLCAweGNmLCAweGMzLAorCTB4MzYsIDB4MTgsIDB4N2YsIDB4NDksIDB4ZWYsIDB4OTUsIDB4YmIsIDB4YmUsIDB4ZmMsIDB4OTIsIDB4OGUsIDB4NTMsCisJMHhmNCwgMHg5NywgMHg1YiwgMHg2NSwgMHg3YiwgMHhiOSwgMHg0MSwgMHg3NiwgMHg0MCwgMHgyZiwgMHhlYywgMHgyOCwKKwkweGZiLCAweDc4LCAweGEyLCAweDcyLCAweDYzLCAweGQ5LCAweGNjLCAweGQzLCAweDQ3LCAweGNhLCAweDljLCAweGVmLAorCTB4NmQsIDB4MzIsIDB4NzEsIDB4YmMsIDB4OWEsIDB4NjYsIDB4YTcsIDB4ZWQsIDB4ZGUsIDB4MzEsIDB4ZDIsIDB4MGYsCisJMHg5ZSwgMHg1MiwgMHgzMiwgMHgzZiwgMHhhZCwgMHhjNywgMHhjZSwgMHg1ZCwgMHhhYywgMHhjOSwgMHhjMywgMHhiMywKKwkweGMyLCAweGJkLCAweGY4LCAweGZjLCAweDFiLCAweDc0LCAweGRmLCAweDY4LCAweGU1LCAweDE5LCAweDc3LCAweGRlLAorCTB4OGYsIDB4ZDgsIDB4NWYsIDB4MDksIDB4ZjcsIDB4ODYsIDB4YmYsIDB4ZmUsIDB4MTksIDB4MTAsIDB4ZmQsIDB4NzcsCisJMHg1ZCwgMHhmNCwgMHhkZSwgMHg3MCwgMHg0ZCwgMHg3YiwgMHhkMiwgMHg3NiwgMHgyNiwgMHhhNiwgMHg3NSwgMHg4NCwKKwkweGExLCAweGYxLCAweGY5LCAweGJmLCAweGU3LCAweDIyLCAweGYyLCAweDdmLCAweDAxLCAweDk1LCAweGY2LCAweDJkLAorCTB4NTgsIDB4ZDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DUF9iMDlGd0RhdGFbKDB4NTAvNCkgKyAxXSA9IHsKKwkweDAwMDEwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDEwZmQwLCAweDAwMDAwZmQwLAorCTB4MDAwMDE0MzAsIDB4MDAwMDAwN2YsIDB4MDAwMzA0MDAsIDB4MDAwMDEwMDAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMjAsCisJMHgwMDA1MDIwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAxMCwgMHgwMDAxMDQwMCwgMHgwMDAwMDQwMCwKKwkweDAwMDAxMDMwLCAweDAwMDAwMDIwLCAweDAwMDAwMDAwIH07CitzdGF0aWMgdTMyIGJueDJfQ1BfYjA5RndSb2RhdGFbKDB4MTE4LzQpICsgMV0gPSB7CisJMHgwODAwMDVkOCwgMHgwODAwMDdmOCwgMHgwODAwMDczYywgMHgwODAwMDc2NCwgMHgwODAwMDc4YywgMHgwODAwMDdiNCwKKwkweDA4MDAwNjEwLCAweDA4MDAwNWZjLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwNjJjLCAweDA4MDAwNjQ4LAorCTB4MDgwMDA2NDgsIDB4MDgwMDA4MjAsIDB4MDgwMDA2NjAsIDB4MDgwMDA2NzQsIDB4MDgwMDA4MjAsIDB4MDgwMDA2ODgsCisJMHgwODAwMDgyMCwgMHgwODAwMDgyMCwgMHgwODAwMDY5YywgMHgwODAwMDgyMCwgMHgwODAwMDgyMCwgMHgwODAwMDgyMCwKKwkweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLAorCTB4MDgwMDA4MjAsIDB4MDgwMDA2YjAsIDB4MDgwMDA4MjAsIDB4MDgwMDA2YzQsIDB4MDgwMDA2ZDgsIDB4MDgwMDA2ZWMsCisJMHgwODAwMDgyMCwgMHgwODAwMDcwMCwgMHgwODAwMDcxNCwgMHgwODAwMDcyOCwgMHgwODAwMzc0MCwgMHgwODAwMzc1OCwKKwkweDA4MDAzNzY4LCAweDA4MDAzNzc4LCAweDA4MDAzNzkwLCAweDA4MDAzN2E4LCAweDA4MDAzN2I4LCAweDA4MDAzN2M4LAorCTB4MDgwMDM3ZTgsIDB4MDgwMDM3ZjgsIDB4MDgwMDM4MDgsIDB4MDgwMDM4OTgsIDB4MDgwMDM3ZDgsIDB4MDgwMDM4MTgsCisJMHgwODAwMzgyOCwgMHgwODAwMzg0MCwgMHgwODAwMzg2MCwgMHgwODAwMzg5OCwgMHgwODAwMzg3OCwgMHgwODAwMzg3OCwKKwkweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NjE4LAorCTB4MDgwMDU2MTgsIDB4MDgwMDU2NDAsIDB4MDgwMDU2OTAsIDB4MDgwMDU2NjAsIDB4MDAwMDAwMDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DUF9iMDlGd0Jzc1soMHg4NzAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfQ1BfYjA5RndTYnNzWygweGU5LzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9jcF9md18wOSA9IHsKKwkudmVyX21ham9yCQkJPSAweDEsCisJLnZlcl9taW5vcgkJCT0gMHgwLAorCS52ZXJfZml4CQkJPSAweDAsCisKKwkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDA2YywKKworCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDAwMDAsCisJLnRleHRfbGVuCQkJPSAweDczY2MsCisJLnRleHRfaW5kZXgJCQk9IDB4MCwKKwkuZ3pfdGV4dAkJCT0gYm54Ml9DUF9iMDlGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9DUF9iMDlGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNzUwMCwKKwkuZGF0YV9sZW4JCQk9IDB4NTAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfQ1BfYjA5RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNzU1NCwKKwkuc2Jzc19sZW4JCQk9IDB4ZTksCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfQ1BfYjA5RndTYnNzLAorCisJLmJzc19hZGRyCQkJPSAweDA4MDA3NjQwLAorCS5ic3NfbGVuCQkJPSAweDg3MCwKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfQ1BfYjA5RndCc3MsCisKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDczZDAsCisJLnJvZGF0YV9sZW4JCQk9IDB4MTE4LAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9DUF9iMDlGd1JvZGF0YSwKK307CisKK3N0YXRpYyB1OCBibngyX1JYUF9iMDlGd1RleHRbXSA9IHsKKwkweDFmLCAweDhiLCAweDA4LCAweDA4LCAweDE5LCAweGZkLCAweDJmLCAweDQ1LCAweDAwLCAweDAzLCAweDc0LCAweDY1LAorCTB4NzMsIDB4NzQsIDB4MzEsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmUsIDB4MDAsIDB4ZWMsIDB4NWMsIDB4NmIsIDB4NmMsCisJMHgxYywgMHhkNywgMHg3NSwgMHgzZSwgMHhmMywgMHgyMCwgMHhiNSwgMHhhMiwgMHhmOCwgMHgxOCwgMHgyZSwgMHg1NywKKwkweGNjLCAweDRhLCAweDY2LCAweGVjLCAweDVkLCAweDcxLCAweDI0LCAweGIyLCAweDE2LCAweDZiLCAweDhjLCAweGQ4LAorCTB4YWQsIDB4NGQsIDB4MDQsIDB4NmIsIDB4N2IsIDB4MzMsIDB4YmIsIDB4OTIsIDB4OTgsIDB4NTQsIDB4ODUsIDB4MjksCisJMHg4NywgMHg3NSwgMHgwYywgMHhjMywgMHg3NSwgMHhkOSwgMHhhNSwgMHgxYSwgMHhiYiwgMHhhZSwgMHg1MSwgMHhjOCwKKwkweDhmLCAweGM0LCAweDA2LCAweDZhLCAweGQ2LCAweDliLCAweDI1LCAweGRkLCAweGE4LCAweGU5LCAweDgyLCAweDQzLAorCTB4NGIsIDB4YWEsIDB4ZTksIDB4MDIsIDB4NjksIDB4YmIsIDB4MjAsIDB4YTksIDB4YzcsIDB4OGYsIDB4ODUsIDB4NTYsCisJMHg3NiwgMHg1MiwgMHhjNywgMHhmOSwgMHhlMSwgMHg0OCwgMHg1MCwgMHg5NSwgMHgyMCwgMHgyOCwgMHgwYywgMHg0MywKKwkweDQ4LCAweDhkLCAweGQ2LCAweDNmLCAweGRhLCAweDQwLCAweDk1LCAweDlmLCAweDY4LCAweDkyLCAweDQyLCAweDQxLAorCTB4MGIsIDB4YzcsIDB4NjgsIDB4NmMsIDB4NGYsIDB4YmYsIDB4ZWYsIDB4Y2UsIDB4MGMsIDB4YjksIDB4YTQsIDB4NWYsCisJMHg0MCwgMHg3ZiwgMHhmNCwgMHg0ZiwgMHhlNywgMHgwMiwgMHg4YiwgMHhiOSwgMHhmNywgMHhjZSwgMHgzZCwgMHhlNywKKwkweDllLCAweDdiLCAweGRlLCAweGU3LCAweDBlLCAweGE1LCAweGRmLCAweGVmLCAweDk0LCAweDBlLCAweDA5LCAweDViLAorCTB4MTcsIDB4N2UsIDB4OTksIDB4YzMsIDB4OGYsIDB4M2QsIDB4NzQsIDB4YzMsIDB4ZDgsIDB4MGQsIDB4YTMsIDB4MjIsCisJMHg3YiwgMHhmNiwgMHgxOCwgMHg1YiwgMHgxMiwgMHg3YSwgMHgzNCwgMHgxZiwgMHhiNywgMHhiOCwgMHhjNSwgMHgyZCwKKwkweDZlLCAweDcxLCAweDhiLCAweDViLCAweGRjLCAweGUyLCAweDE2LCAweGI3LCAweGI4LCAweGM1LCAweDJkLCAweDZlLAorCTB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsIDB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsCisJMHg4YiwgMHg1YiwgMHhkYywgMHhlMiwgMHgxNiwgMHhiNywgMHhiOCwgMHhjNSwgMHgyZCwgMHg2ZSwgMHg3MSwgMHg4YiwKKwkweDViLCAweGRjLCAweGUyLCAweDE2LCAweGI3LCAweGI4LCAweGM1LCAweDJkLCAweDZlLCAweDcxLCAweDhiLCAweDViLAorCTB4ZGMsIDB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsCisJMHhlMiwgMHhmNiwgMHhmZiwgMHhiZCwgMHgxOSwgMHgyMiwgMHgxNiwgMHg5ZiwgMHg1ZCwgMHhlMSwgMHg0ZiwgMHgxMiwKKwkweDdhLCAweGZlLCAweGYyLCAweDFmLCAweGJhLCAweGI2LCAweDI0LCAweDhjLCAweGZjLCAweGNmLCAweDY2LCAweGE2LAorCTB4NmQsIDB4OTEsIDB4NDIsIDB4NjMsIDB4NzcsIDB4YTYsIDB4MjgsIDB4ZWYsIDB4ZmIsIDB4OTUsIDB4OTQsIDB4MjksCisJMHg5YywgMHhmZiwgMHg2YywgMHhmZSwgMHhiZCwgMHhiZiwgMHg3ZCwgMHhmMSwgMHhhNiwgMHhlYywgMHhkNSwgMHhiYSwKKwkweDIxLCAweDA5LCAweDJiLCAweDNmLCAweGI3LCAweGM3LCAweGRhLCAweDI1LCAweDg5LCAweDAxLCAweGMwLCAweDdjLAorCTB4NmIsIDB4ZTgsIDB4YzcsIDB4ZGQsIDB4ZDIsIDB4MmQsIDB4NmIsIDB4NzgsIDB4ZWMsIDB4ODQsIDB4NWMsIDB4MzYsCisJMHg1ZSwgMHhkMCwgMHhkYywgMHhhNiwgMHhlZiwgMHg5ZiwgMHg3MCwgMHg3YywgMHhmZiwgMHg4NywgMHhmOCwgMHhiZCwKKwkweGU1LCAweDYwLCAweGVjLCAweDdkLCAweGUwLCAweDE3LCAweDRjLCAweDQzLCAweDc0LCAweGZiLCAweDJmLCAweDM0LAorCTB4NzcsIDB4YjksIDB4NDMsIDB4YWEsIDB4OGIsIDB4YTYsIDB4Y2MsIDB4N2EsIDB4MjksIDB4MzksIDB4ZTIsIDB4NTUsCisJMHhiNCwgMHg1MiwgMHhiMywgMHhhNiwgMHhlZCwgMHgzZCwgMHgzNSwgMHhhZiwgMHhlZCwgMHgzYiwgMHg3NSwgMHg0NCwKKwkweGRiLCAweDdmLCAweDZhLCAweDQxLCAweDczLCAweDRmLCAweDQ5LCAweDQ1LCAweGRmLCAweGQzLCAweDI5LCAweDA1LAorCTB4ZWIsIDB4YjQsIDB4NTYsIDB4NmMsIDB4ZjYsIDB4NmIsIDB4ZWUsIDB4ZTIsIDB4N2IsIDB4YmUsIDB4ZWIsIDB4NjQsCisJMHhhZCwgMHhiYiwgMHhjNCwgMHgyYywgMHg4MCwgMHgxNiwgMHg3MSwgMHg2YiwgMHgzZSwgMHhjNiwgMHhhNiwgMHgxNCwKKwkweDUyLCAweGJlLCAweGFmLCAweGU3LCAweGZkLCAweDI3LCAweGRjLCAweDljLCAweDZkLCAweGU5LCAweDVhLCAweDRhLAorCTB4YWEsIDB4Y2QsIDB4N2UsIDB4ZTAsIDB4ZWQsIDB4ZDQsIDB4OGEsIDB4OGIsIDB4YTYsIDB4NTYsIDB4ZjIsIDB4ZmMsCisJMHg3MywgMHhhZSwgMHgyMywgMHgwMywgMHg4NiwgMHhmOCwgMHhmZSwgMHg5YywgMHhiMywgMHgzMywgMHg3ZCwgMHg0OCwKKwkweDRlLCAweDAyLCAweDZmLCAweDAzLCAweGY4LCAweGM0LCAweGQyLCAweGYzLCAweGE0LCAweDhmLCAweDc0LCAweDkyLAorCTB4ZTQsIDB4OGEsIDB4NTYsIDB4MWMsIDB4OGEsIDB4ZTgsIDB4OTMsIDB4MGMsIDB4ZTksIDB4MmYsIDB4YWYsIDB4ZTgsCisJMHhhMCwgMHg3MywgMHg4YiwgMHg5NCwgMHhlYiwgMHg5NiwgMHg0YywgMHhhZCwgMHg2YywgMHg1YywgMHg3ZiwgMHhkOSwKKwkweDdmLCAweDcxLCAweDI4LCAweDI1LCAweGNmLCAweDM2LCAweGIzLCAweDQ3LCAweDJhLCAweDkyLCAweDkwLCAweDM5LAorCTB4MmYsIDB4MjMsIDB4N2EsIDB4NWUsIDB4MGEsIDB4NmUsIDB4NmUsIDB4NDAsIDB4Y2UsIDB4MzUsIDB4ZDMsIDB4ZjIsCisJMHg1YywgMHhkMywgMHg0ZSwgMHg1NywgMHg2NSwgMHg5MywgMHg5NCwgMHg1MywgMHg5NiwgMHg5YywgMHg2ZCwgMHhhNiwKKwkweDcwLCAweDQ2LCAweGZmLCAweDljLCAweDZlLCAweGRiLCAweDU2LCAweDE1LCAweDZiLCAweGFiLCAweGNkLCAweDk3LAorCTB4ZjgsIDB4ZWYsIDB4NWYsIDB4YWMsIDB4ZTksIDB4OWMsIDB4ODIsIDB4YTksIDB4ODAsIDB4ZWUsIDB4NzAsIDB4MmQsCisJMHhjZiwgMHhhMSwgMHhkNiwgMHhhYSwgMHhiMywgMHgwNCwgMHg2YiwgMHhhNSwgMHgzMiwgMHg5ZCwgMHhjMywgMHg1YywKKwkweDczLCAweDM0LCAweGU0LCAweGVmLCAweDE2LCAweDljLCAweDk3LCAweDRmLCAweDRiLCAweGFhLCAweDllLCAweDAxLAorCTB4ZGUsIDB4YjAsIDB4ZmYsIDB4Y2YsIDB4YzAsIDB4MzcsIDB4ODAsIDB4ZjMsIDB4NWUsIDB4YWIsIDB4N2UsIDB4ZWUsCisJMHhhMiwgMHhhNCwgMHg3NCwgMHhkOSwgMHg5OSwgMHgyZSwgMHgwYiwgMHg3OCwgMHhkYiwgMHhlYywgMHhjNCwgMHg5OCwKKwkweGY0LCAweGY5LCAweGZlLCAweDdlLCAweDQ3LCAweGFjLCAweGFhLCAweGQzLCAweDAzLCAweDk4LCAweDhjLCAweDU0LAorCTB4OWQsIDB4NmUsIDB4ZTAsIDB4NjksIDB4MTMsIDB4Y2IsIDB4ZTYsIDB4YjksIDB4YjgsIDB4ZDcsIDB4NjYsIDB4Y2MsCisJMHhmYiwgMHg1ZCwgMHg0NiwgMHhkZSwgMHhmNywgMHhhNywgMHg3MywgMHhkMiwgMHgxZCwgMHhjYywgMHhlZCwgMHg1NiwKKwkweDM4LCAweGE2LCAweDI2LCAweDM0LCAweGFjLCAweGZiLCAweDA1LCAweDY5LCAweDRlLCAweDI0LCAweGYzLCAweGVjLAorCTB4ZjMsIDB4OTksIDB4MTMsIDB4NzcsIDB4ZmUsIDB4ZGEsIDB4OTAsIDB4OTYsIDB4MzQsIDB4NjgsIDB4YjksIDB4MjYsCisJMHhlYywgMHg4MywgMHhmZiwgMHgxZSwgMHhmOCwgMHhlMCwgMHg3YywgMHgwNiwgMHg2MywgMHhlZCwgMHgzYSwgMHhlMCwKKwkweDE5LCAweGFlLCAweDBhLCAweGY3LCAweGU4LCAweDkzLCAweGE1LCAweDk0LCAweGU4LCAweDU3LCAweDljLCAweGRlLAorCTB4NzAsIDB4NWQsIDB4MzcsIDB4NjgsIDB4OGQsIDB4ZjQsIDB4YTAsIDB4NWYsIDB4ZTYsIDB4MTYsIDB4YzksIDB4ZWIsCisJMHgxYSwgMHg2NCwgMHg4MywgMHhlNywgMHg4ZCwgMHgxNSwgMHhhZCwgMHhkMCwgMHgzYywgMHg4MiwgMHhiZSwgMHgyOSwKKwkweGQzLCAweGI2LCAweDdmLCAweDZlLCAweGNlLCAweDk5LCAweGQ3LCAweDhhLCAweGE3LCAweDRlLCAweDZhLCAweGE1LAorCTB4NTMsIDB4MmYsIDB4NjgsIDB4N2IsIDB4OWIsIDB4MmYsIDB4NzQsIDB4NDksIDB4NDcsIDB4MTYsIDB4YTcsIDB4NGUsCisJMHhjOCwgMHg5MywgMHg5ZSwgMHgyNiwgMHhhNCwgMHg3MywgMHgwOSwgMHhiYywgMHgyYiwgMHg1OCwgMHgxNSwgMHgzMSwKKwkweGVkLCAweDZlLCAweDZkLCAweDFmLCAweGYwLCAweGI0LCAweGQ5LCAweDdmLCAweGQyLCAweDI5LCAweGRkLCAweDg2LAorCTB4NmMsIDB4YjIsIDB4YTMsIDB4YjUsIDB4MjksIDB4ZjksIDB4MzMsIDB4ZDAsIDB4NzQsIDB4YzEsIDB4NDksIDB4OTEsCisJMHg1ZiwgMHgzZCwgMHgwMSwgMHg0YywgMHg0NCwgMHgwNywgMHhmNSwgMHg4YSwgMHgzYSwgMHhhNSwgMHgxNywgMHg0YSwKKwkweGM3LCAweGZmLCAweGJjLCAweGFmLCAweDNhLCAweGIyLCAweDg1LCAweDZiLCAweGEwLCAweGZmLCAweGQ2LCAweGZkLAorCTB4ZDMsIDB4YjYsIDB4ZGIsIDB4NmIsIDB4NGEsIDB4YzUsIDB4ZDIsIDB4MjUsIDB4NmIsIDB4MTUsIDB4ZTUsIDB4M2EsCisJMHg5OSwgMHg3MywgMHg0NCwgMHg4YSwgMHgzNSwgMHhlYywgMHg2OSwgMHg5YiwgMHhlMCwgMHg4ZCwgMHgwZCwgMHhkZSwKKwkweGVjLCAweDNjLCAweDMyLCAweGE4LCAweGZmLCAweDk2LCAweDY0LCAweGZhLCAweDJiLCAweDlhLCAweDE5LCAweGYyLAorCTB4NzEsIDB4NDksIDB4NmUsIDB4NTEsIDB4ZjAsIDB4N2EsIDB4ZGUsIDB4ODEsIDB4N2UsIDB4NzYsIDB4YjAsIDB4OGYsCisJMHg3ZCwgMHgxMywgMHg2YSwgMHg1ZiwgMHgyMywgMHg2ZiwgMHhhNywgMHg5NywgMHg0NSwgMHgzNCwgMHgzZCwgMHhiZiwKKwkweDFiLCAweGY4LCAweGE4LCAweGI3LCAweDVjLCAweGY3LCAweDA0LCAweDY4LCAweDI0LCAweGVkLCAweGVjLCAweGRiLAorCTB4ODAsIDB4NDksIDB4ODgsIDB4ZWIsIDB4NzQsIDB4YjUsIDB4ZDAsIDB4NDksIDB4NzksIDB4OTMsIDB4ZDcsIDB4ZTQsCisJMHg5ZCwgMHgzYSwgMHhhNywgMHhiNiwgMHg3NiwgMHhjZSwgMHg1ZiwgMHhmOSwgMHg5YiwgMHg0NiwgMHg0ZCwgMHhmOSwKKwkweGExLCAweDNhLCAweDJmLCAweDZkLCAweDhjLCAweGViLCAweDUyLCAweGExLCAweDRlLCAweDI0LCAweGEwLCAweDQ3LAorCTB4YTIsIDB4OTUsIDB4MWQsIDB4NmIsIDB4MTUsIDB4NTcsIDB4NTksIDB4NDQsIDB4MzcsIDB4ZjIsIDB4OWQsIDB4NTIsCisJMHg1NCwgMHhmNCwgMHg4ZCwgMHg2MSwgMHgyZiwgMHhkYSwgMHgxZSwgMHg2YywgMHhjOCwgMHhlNiwgMHg1OSwgMHgzOCwKKwkweDk3LCAweDg3LCAweDhkLCAweDY3LCAweGQ5LCAweDk3LCAweGYyLCAweDAyLCAweGVkLCAweDlkLCAweGI0LCAweDlkLAorCTB4Y2YsIDB4YWEsIDB4N2YsIDB4OGUsIDB4NDUsIDB4NWQsIDB4M2MsIDB4ZDYsIDB4MDMsIDB4ZGEsIDB4MzgsIDB4ODYsCisJMHgxZCwgMHhkYSwgMHg3OCwgMHgzZiwgMHhhMiwgMHg4OSwgMHgzYiwgMHgzNiwgMHgwOCwgMHhmZSwgMHg3MCwgMHg5ZCwKKwkweDlkLCAweDgxLCAweDljLCAweDBiLCAweDJlLCAweGY2LCAweDc0LCAweDlkLCAweGRmLCAweDUwLCAweDNjLCAweGU4LAorCTB4YzUsIDB4NzksIDB4MDYsIDB4ZTcsIDB4YzksIDB4YWYsIDB4MGUsIDB4ZTgsIDB4YjYsIDB4MjYsIDB4NjUsIDB4MjcsCisJMHg5YiwgMHhhMSwgMHhkYywgMHgwMywgMHhkYSwgMHg3NSwgMHhkOSwgMHg3NCwgMHg2MywgMHgyYiwgMHhlZCwgMHg5MSwKKwkweGFjLCAweGE4LCAweDg3LCAweGE2LCAweDI0LCAweDQ3LCAweGI5LCAweDk2LCAweGViLCAweGI4LCAweDNlLCAweDNiLAorCTB4MjYsIDB4ZmEsIDB4YWYsIDB4N2MsIDB4NmIsIDB4ZGQsIDB4NTksIDB4NmQsIDB4ZDksIDB4MzEsIDB4MGYsIDB4MWEsCisJMHgwMiwgMHhkZSwgMHg4MiwgMHgyNywgMHg5ZiwgMHhiNiwgMHg5NiwgMHg3YywgMHhkZCwgMHhjOCwgMHgzZiwgMHhhZSwKKwkweDZkLCAweDVkLCAweDA3LCAweDlkLCAweGU4LCAweDI3LCAweDBkLCAweDI3LCAweDNhLCAweDAzLCAweDViLCAweDhiLAorCTB4NjgsIDB4OGEsIDB4NjQsIDB4YTMsIDB4ODUsIDB4MzgsIDB4M2UsIDB4ZTksIDB4MWMsIDB4NWMsIDB4MGYsIDB4MWYsCisJMHhlMCwgMHhjMSwgMHgwNywgMHhjMCwgMHhhZiwgMHgzZCwgMHhlYiwgMHhjMSwgMHhmZSwgMHgzZCwgMHhmYSwgMHg4YywKKwkweDhjLCAweGJjLCAweDM4LCAweDA0LCAweDFmLCAweGI3LCAweGU2LCAweDYzLCAweGQwLCAweGM2LCAweGQxLCAweGQ3LAorCTB4YzUsIDB4ODAsIDB4OGYsIDB4OTksIDB4YWQsIDB4ZWIsIDB4YjAsIDB4NTksIDB4ZjAsIDB4NzgsIDB4ODUsIDB4NzMsCisJMHhiMCwgMHhlZCwgMHg5NSwgMHgxMiwgMHg5ZSwgMHhiNiwgMHg1NCwgMHgxYiwgMHhkNCwgMHhhYiwgMHhjOCwgMHg5NywKKwkweGQyLCAweGU3LCAweGE0LCAweGUxLCAweDVmLCAweGU4LCAweDc3LCAweGU4LCAweDU3LCAweGI4LCAweGQ2LCAweGY3LAorCTB4NGIsIDB4MGUsIDB4NjEsIDB4N2QsIDB4OTksIDB4NzAsIDB4NjgsIDB4NDMsIDB4OWQsIDB4YTIsIDB4MjcsIDB4MmIsCisJMHhkYSwgMHhjMSwgMHgyMSwgMHhkOCwgMHhkNiwgMHhmNSwgMHg2ZCwgMHhhMCwgMHg5NSwgMHgzNiwgMHg3NiwgMHg4ZCwKKwkweDQ4LCAweDNiLCAweGY3LCAweGZiLCAweDY5LCAweDU3LCAweGYwLCAweGVmLCAweGVlLCAweDM2LCAweDYxLCAweDBkLAorCTB4OWYsIDB4ZWYsIDB4ODYsIDB4NjMsIDB4MmQsIDB4ZjQsIDB4MmQsIDB4N2MsIDB4OWYsIDB4Y2QsIDB4MTQsIDB4YTQsCisJMHgzZiwgMHgxYywgMHhiMywgMHhiZiwgMHg0YSwgMHhhZiwgMHhhMywgMHhkZiwgMHg5OCwgMHg5MCwgMHgxZCwgMHgyNywKKwkweDAzLCAweDlmLCAweGI4LCAweDYzLCAweGM5LCAweDEyLCAweGZiLCAweDY0LCAweDQwLCAweGUzLCAweDhlLCAweDMzLAorCTB4OTEsIDB4NmYsIDB4N2MsIDB4MWYsIDB4ZjAsIDB4YTAsIDB4Y2YsIDB4NWIsIDB4OGQsIDB4MDMsIDB4NjgsIDB4M2YsCisJMHhkMywgMHg2MCwgMHgyYSwgMHg5OCwgMHhkYiwgMHhjOCwgMHgwYiwgMHhmYSwgMHg2MywgMHhkYSwgMHg5YiwgMHhkNSwKKwkweDZhLCAweDZmLCAweDdiLCAweDYwLCAweDZmLCAweDRlLCAweGJiLCAweDY0LCAweDlkLCAweGJmLCAweDg3LCAweGJkLAorCTB4N2QsIDB4YzMsIDB4ZDEsIDB4YzAsIDB4MWIsIDB4OTEsIDB4OGIsIDB4YjUsIDB4MzQsIDB4NmMsIDB4ZGQsIDB4NGMsCisJMHhiZiwgMHgyNiwgMHgzYiwgMHgzMywgMHhiMywgMHhhMiwgMHhjOSwgMHgwOSwgMHhjZSwgMHgzNSwgMHgzMCwgMHhhNywKKwkweDdjLCAweDcxLCAweGUwLCAweDBiLCAweDJlLCAweDFiLCAweDRmLCAweDgxLCAweDJlLCAweGRmLCAweDlmLCAweDA1LAorCTB4Y2UsIDB4ZjIsIDB4ODgsIDB4MTEsIDB4ZGEsIDB4NTYsIDB4MzQsIDB4NmYsIDB4ZGQsIDB4ZWYsIDB4ZGEsIDB4ZWUsCisJMHhhZiwgMHgxOSwgMHg1MiwgMHgxOSwgMHg2ZSwgMHg5MywgMHhlYywgMHhmMCwgMHgxMiwgMHg3MCwgMHg0ZiwgMHgzYiwKKwkweDgxLCAweDFkLCAweDUzLCAweGQ3LCAweDk3LCAweDgxLCAweDdmLCAweGNlLCAweDFiLCAweDgyLCAweDFlLCAweGQzLAorCTB4MGUsIDB4NDAsIDB4MTcsIDB4ZjAsIDB4MmYsIDB4MDMsIDB4ZmYsIDB4NWMsIDB4YjMsIDB4NGQsIDB4YmUsIDB4NmUsCisJMHg0NiwgMHhiMSwgMHgzMiwgMHgzYSwgMHg0ZiwgMHgzNywgMHg5NiwgMHg0NSwgMHhmYiwgMHgxZSwgMHg5NiwgMHgyZiwKKwkweDdhLCAweDQ5LCAweGNkLCAweDNkLCAweDQ2LCAweGZmLCAweDVhLCAweDFkLCAweDg2LCAweDlkLCAweDY4LCAweDU1LAorCTB4ODcsIDB4N2IsIDB4MWIsIDB4YjIsIDB4YmMsIDB4YmEsIDB4NDYsIDB4MGEsIDB4ZDUsIDB4YzAsIDB4MDYsIDB4MGIsCisJMHhlZSwgMHg1MCwgMHgyNSwgMHg2ZCwgMHgyOCwgMHg1ZiwgMHgyMiwgMHhiMiwgMHgwZiwgMHhiNiwgMHhiNywgMHg2YywKKwkweDczLCAweGNjLCAweGY5LCAweDYwLCAweDZlLCAweGJjLCAweGQ2LCAweDBmLCAweDlmLCAweGM4LCAweGYxLCAweDdiLAorCTB4ZmUsIDB4YjQsIDB4MTMsIDB4Y2MsIDB4N2QsIDB4YTEsIDB4NzYsIDB4NTcsIDB4MzcsIDB4ZmQsIDB4MmUsIDB4ZTIsCisJMHg0NCwgMHhhNiwgMHhlYSwgMHhmYywgMHhiYiwgMHgwZiwgMHhmZCwgMHg1ZCwgMHgwNywgMHhmMywgMHhkMSwgMHg3OCwKKwkweGIyLCAweGUzLCAweDgxLCAweGNlLCAweDhhLCAweGI2LCAweGRmLCAweGQ2LCAweGZiLCAweGRiLCAweDQzLCAweDFmLAorCTB4YjYsIDB4MWYsIDB4OTMsIDB4N2IsIDB4NmIsIDB4ZDUsIDB4YmUsIDB4NzYsIDB4NzksIDB4Y2YsIDB4NjAsIDB4MWMsCisJMHhiZCwgMHgyMiwgMHg2MiwgMHhiYSwgMHhiNSwgMHg1ZCwgMHhlMCwgMHg0NywgMHhiNSwgMHhiNywgMHg2NSwgMHgyZSwKKwkweDUxLCAweGFhLCAweGY5LCAweDcyLCAweGMxLCAweDA5LCAweDYwLCAweDMwLCAweGVlLCAweDJjLCAweGQ2LCAweGY0LAorCTB4ZmUsIDB4ODQsIDB4YWMsIDB4OGUsIDB4MmQsIDB4YzIsIDB4YWMsIDB4YzgsIDB4YWUsIDB4ZTEsIDB4NjUsIDB4NTEsCisJMHhiMCwgMHg3ZCwgMHg4OSwgMHgzNSwgMHhkOCwgMHg1NCwgMHhhOSwgMHg1NiwgMHhlZCwgMHg2ZCwgMHgxOSwgMHhhNywKKwkweDhiLCAweGMwLCAweGE1LCAweGVmLCAweDU5LCAweDg1LCAweDFkLCAweDU4LCAweDgzLCAweGRkLCAweDJhLCAweDk5LAorCTB4NWUsIDB4YzIsIDB4ZWIsIDB4ZmQsIDB4OWIsIDB4ZDcsIDB4NzAsIDB4NjcsIDB4NDIsIDB4N2EsIDB4ZmEsIDB4MzYsCisJMHhhZiwgMHhlMSwgMHhiMCwgMHg4OSwgMHhiMywgMHg2NSwgMHgzYywgMHg0YywgMHg5YywgMHgzYiwgMHhkNiwgMHg3MCwKKwkweDhlLCAweGFjLCAweGE3LCAweGU3LCAweGIwLCAweGMwLCAweDA3LCAweDI1LCAweGRhLCAweGYzLCAweGIyLCAweGU3LAorCTB4NjIsIDB4NmQsIDB4NzAsIDB4ZTIsIDB4OGIsIDB4ODIsIDB4NTgsIDB4MzcsIDB4YjIsIDB4MjksIDB4ZjQsIDB4YzksCisJMHhlNiwgMHgxZSwgMHgxNywgMHhiYywgMHgzMiwgMHg4NSwgMHgzZSwgMHg0ZSwgMHg5MywgMHgyYSwgMHhlNCwgMHg3YywKKwkweDdmLCAweDQzLCAweGY2LCAweDVjLCAweDY4LCAweDk4LCAweGExLCAweDJlLCAweDUxLCAweDI3LCAweGRlLCAweDg2LAorCTB4OGQsIDB4NzUsIDB4NGUsIDB4OTksIDB4ODgsIDB4YzMsIDB4ZTcsIDB4OTQsIDB4OGQsIDB4YzksIDB4NDQsIDB4YjUsCisJMHgyNiwgMHg5NSwgMHhlZCwgMHhmOSwgMHgyNywgMHg3YywgMHhlOCwgMHhlMiwgMHg5NCwgMHgwNSwgMHgzZiwgMHg1YSwKKwkweDk0LCAweGNlLCAweDMxLCAweDM3LCAweDg3LCAweGY5LCAweDA2LCAweDZkLCAweDBiLCAweDdlLCAweDA1LCAweGIwLAorCTB4ZDAsIDB4YjUsIDB4ODQsIDB4MzEsIDB4YmYsIDB4ZjMsIDB4NTUsIDB4ZDcsIDB4ZTAsIDB4M2UsIDB4MTksIDB4ZTQsCisJMHg0ZCwgMHg4OSwgMHg4NCwgMHgzZSwgMHg3ZiwgMHhkNSwgMHhhNywgMHg5ZSwgMHg0ZCwgMHg4ZiwgMHg1YywgMHg0NSwKKwkweDllLCAweDYyLCAweGMxLCAweDU3LCAweGMyLCAweDdmLCAweDQwLCAweGRmLCAweDY3LCAweDliLCAweDgyLCAweGI4LAorCTB4ZmUsIDB4NDAsIDB4NGYsIDB4NjAsIDB4NjMsIDB4NDcsIDB4YjcsIDB4MDYsIDB4NGYsIDB4MzEsIDB4ZTksIDB4OWIsCisJMHhhNywgMHg3MywgMHhjYywgMHgwMSwgMHhkYSwgMHgxMywgMHg2ZSwgMHg2ZSwgMHg3YywgMHg5YiwgMHg3MSwgMHhlNiwKKwkweGMwLCAweDM2LCAweGZkLCAweDRjLCAweDY1LCAweDliLCAweDBlLCAweDlmLCAweDBlLCAweDliLCAweGQyLCAweGRkLAorCTB4MWMsIDB4ZmEsIDB4NjcsIDB4MjIsIDB4MWIsIDB4NGEsIDB4YzMsIDB4ODYsIDB4ZGUsIDB4NTYsIDB4MzksIDB4YzgsCisJMHhiOSwgMHhlNiwgMHgyOSwgMHhkOCwgMHhhYiwgMHhhMiwgMHg1NSwgMHgyNiwgMHg5MCwgMHgxMywgMHhlOCwgMHhhMywKKwkweGVmLCAweDQzLCAweDRmLCAweDcwLCAweDE2LCAweGY4LCAweGMwLCAweDAyLCAweGI4LCAweGE0LCAweDhmLCAweGJlLAorCTB4MTEsIDB4ZGEsIDB4MzMsIDB4ZmIsIDB4ZWYsIDB4ZjgsIDB4NDEsIDB4N2MsIDB4ZjgsIDB4N2MsIDB4YjgsIDB4ZmYsCisJMHgzZiwgMHg3NSwgMHgwNywgMHgzZSwgMHgyMCwgMHhjMiwgMHg0NSwgMHgzYywgMHhjMywgMHhkYSwgMHgwNCwgMHhmMiwKKwkweDk5LCAweDg5LCAweGE2LCAweGE5LCAweGQxLCAweDlmLCAweDE3LCAweDNkLCAweGU2LCAweDIxLCAweGNjLCAweDQxLAorCTB4MWUsIDB4MGIsIDB4ZmQsIDB4MjIsIDB4NzMsIDB4OGYsIDB4Y2UsIDB4OTAsIDB4YTcsIDB4YjksIDB4MjgsIDB4Y2UsCisJMHgyOSwgMHg3YiwgMHg0MywgMHhjYywgMHhjOSwgMHg5NCwgMHg5ZCwgMHgzNiwgMHhlNSwgMHg5MywgMHhhNywgMHg3MywKKwkweDlkLCAweDU4LCAweDg3LCAweGI5LCAweDI2LCAweGNlLCAweDBkLCAweGJmLCAweDg0LCAweDVjLCAweDA2LCAweDZiLAorCTB4Y2UsIDB4NjMsIDB4N2QsIDB4N2IsIDB4NjgsIDB4ZjMsIDB4MTcsIDB4YTUsIDB4MGMsIDB4OWYsIDB4NmEsIDB4ZGEsCisJMHg3YywgMHg5ZiwgMHhlYiwgMHg5MSwgMHgwZSwgMHg4YywgMHgxYiwgMHhkOCwgMHgwYiwgMHg3ZSwgMHhjMiwgMHg1MCwKKwkweDdjLCAweDQ2LCAweDJjLCAweDQ4LCAweDVkLCAweGM3LCAweDFjLCAweDA5LCAweDZiLCAweDMzLCAweDU4LCAweDRiLAorCTB4YmYsIDB4Y2IsIDB4YjUsIDB4Y2YsIDB4ODIsIDB4MGUsIDB4OGMsIDB4MWIsIDB4ODQsIDB4YTEsIDB4OGYsIDB4MTIsCisJMHhkZiwgMHhjZCwgMHg2ZCwgMHg4NiwgMHgyNiwgMHhmOSwgMHhlNywgMHgwYywgMHgzYiwgMHg1YSwgMHgxYiwgMHhlMSwKKwkweGRkLCAweGI4LCAweDk2LCAweGY5LCAweDA5LCAweDcxLCAweGY3LCAweDg0LCAweGYxLCAweDdmLCAweDVjLCAweDBhLAorCTB4Y2QsIDB4MDIsIDB4N2UsIDB4MjIsIDB4ZDMsIDB4YzcsIDB4OTAsIDB4OGYsIDB4ZDksIDB4NmQsIDB4ODgsIDB4NTUsCisJMHg5YywgMHhkZiwgMHg2YSwgMHgwNSwgMHg2NywgMHg4ZCwgMHhlMCwgMHhlZSwgMHhlZiwgMHg1YiwgMHgzZiwgMHhmZSwKKwkweDQyLCAweDcyLCAweGNkLCAweDQ3LCAweGQyLCAweGMyLCAweGE0LCAweDgwLCAweDE4LCAweDAxLCAweDVlLCAweDY1LAorCTB4YTYsIDB4OTgsIDB4YzMsIDB4MTUsIDB4MWIsIDB4NGEsIDB4YTYsIDB4OTgsIDB4MWIsIDB4ODMsIDB4NWYsIDB4MGMsCisJMHhmMiwgMHhhMiwgMHg3MywgMHhkZSwgMHg0NiwgMHhkOSwgMHg1OSwgMHhlMCwgMHg3NywgMHgwMSwgMHgzYywgMHhjZSwKKwkweDQwLCAweDg3LCAweGM2LCAweDAxLCAweDJiLCAweDg3LCAweDgxLCAweDgzLCAweGYxLCAweGQ3LCAweGQxLCAweGYzLAorCTB4NDksIDB4MjksIDB4NWIsIDB4Y2MsIDB4MTMsIDB4ZGEsIDB4NDksIDB4NjcsIDB4ODEsIDB4ZjYsIDB4YWYsIDB4ZTcsCisJMHgzNywgMHg2MywgMHg4ZSwgMHhmZCwgMHg3YiwgMHg3YiwgMHgwMiwgMHg5OSwgMHg3NSwgMHg3MSwgMHgzYywgMHhhMSwKKwkweGU3LCAweDdiLCAweDM2LCAweGNjLCAweDdmLCAweGJmLCAweDJiLCAweGEwLCAweDRkLCAweDhkLCAweDMxLCAweGZmLAorCTB4ZjIsIDB4ODYsIDB4ZjEsIDB4ZWYsIDB4MjUsIDB4ZDcsIDB4OGYsIDB4ZWYsIDB4ZGEsIDB4MTYsIDB4ZWEsIDB4MjAsCisJMHhmYSwgMHg4ZiwgMHg4NSwgMHhmNCwgMHg4MiwgMHhiNiwgMHg1NSwgMHg1YSwgMHhhMywgMHg5YywgMHg1NywgMHgxNiwKKwkweDc0LCAweGU0LCAweDdmLCAweDZlLCAweDZlLCAweDI3LCAweDYyLCAweDdkLCAweDQ2LCAweDRhLCAweDRkLCAweGQwLAorCTB4YmQsIDB4MWEsIDB4Y2IsIDB4NTYsIDB4ZDcsIDB4NTQsIDB4ZDYsIDB4ZDYsIDB4MDQsIDB4YmUsIDB4YmUsIDB4ZDQsCisJMHhmNCwgMHg5MSwgMHgzYiwgMHhiNSwgMHhjNiwgMHhiZCwgMHg2MSwgMHhmNCwgMHgyYiwgMHhkOCwgMHhhNywgMHgyMCwKKwkweGQzLCAweGRlLCAweDg1LCAweDgyLCAweDZlLCAweDFmLCAweDA5LCAweGYyLCAweDNlLCAweGZiLCAweDliLCAweDVhLAorCTB4NjksIDB4OTksIDB4ZjksIDB4MjAsIDB4ZWMsIDB4YzksIDB4NTYsIDB4ZjksIDB4M2YsIDB4ZTIsIDB4Y2EsIDB4NTEsCisJMHhhZCwgMHg3MCwgMHhlYSwgMHgzOCwgMHhmMiwgMHhjMSwgMHgxNSwgMHhmYywgMHg0ZSwgMHhlMywgMHhkNywgMHhjMCwKKwkweDJmLCAweGNhLCAweGMzLCAweDlmLCAweDQxLCAweDFlLCAweGFmLCAweDdjLCAweDJjLCAweGUyLCAweDQxLCAweGIwLAorCTB4ZmYsIDB4MWIsIDB4MmIsIDB4ZDAsIDB4YjMsIDB4ZTMsIDB4MjksIDB4ZjksIDB4ODYsIDB4YWQsIDB4ZjcsIDB4ZTksCisJMHg4MSwgMHg1ZiwgMHgyOSwgMHgyMCwgMHg4ZiwgMHhiNSwgMHhkZSwgMHg5NiwgMHhkZiwgMHgwZSwgMHhmMywgMHgyMiwKKwkweDkxLCAweGQ3LCAweDE2LCAweGMwLCAweGM3LCAweDkxLCAweGZkLCAweGExLCAweGNlLCAweDE2LCAweGVlLCAweDc1LAorCTB4OTUsIDB4ZmYsIDB4MGMsIDB4ZjMsIDB4MWUsIDB4ZTQsIDB4NWYsIDB4MDUsIDB4YjUsIDB4ZWEsIDB4NWIsIDB4ZTAsCisJMHg4ZCwgMHgyNiwgMHg2ZiwgMHg0MSwgMHg4NywgMHg1ZSwgMHg1YiwgMHhlOCwgMHgwMCwgMHgzZCwgMHhiNiwgMHg5NCwKKwkweDI3LCAweDkxLCAweDJmLCAweDY4LCAweDgzLCAweGQ2LCAweDI2LCAweGFkLCAweDAzLCAweDc2LCAweDBjLCAweDFiLAorCTB4NTcsIDB4NjMsIDB4NDksIDB4YjQsIDB4ZTUsIDB4MmYsIDB4Y2QsIDB4MmMsIDB4ZDUsIDB4NzQsIDB4YWMsIDB4NDUsCisJMHhlZSwgMHg5MywgMHg0MywgMHgxZiwgMHhiMiwgMHhiZiwgMHhiMiwgMHg0MCwgMHgzOCwgMHg1ZCwgMHg1ZSwgMHg1ZiwKKwkweDMwLCAweGU0LCAweDRkLCAweGU0LCAweDUyLCAweDZmLCAweGQ5LCAweDk3LCAweDY2LCAweDEwLCAweGI3LCAweGZhLAorCTB4MTEsIDB4MjMsIDB4NTAsIDB4OGIsIDB4ZWMsIDB4YTQsIDB4OWYsIDB4ZGUsIDB4NjEsIDB4ZTIsIDB4NTksIDB4YzIsCisJMHg2ZiwgMHgxZiwgMHg3MiwgMHhjMSwgMHg4ZiwgMHg4NiwgMHhmOSwgMHhiOCwgMHhmNSwgMHhhNCwgMHgyZCwgMHgwMSwKKwkweDE4LCAweGFlLCAweDM3LCAweDQxLCAweDViLCAweDM3LCAweGU0LCAweDlmLCAweGI1LCAweGE2LCAweGU0LCAweGY1LAorCTB4MWUsIDB4OTUsIDB4YWYsIDB4NjgsIDB4OWMsIDB4MGYsIDB4N2MsIDB4ZDMsIDB4ODcsIDB4ZTcsIDB4YzksIDB4NjcsCisJMHgwMywgMHgzYSwgMHhjZSwgMHgzMSwgMHhkZiwgMHhkMSwgMHg4NywgMHgxMiwgMHg1ZiwgMHg3NiwgMHhhYywgMHg4MCwKKwkweGMzLCAweDVjLCAweDU5LCAweDA4LCAweGZhLCAweGQxLCAweDljLCAweDY4LCAweDUxLCAweDFjLCAweGEzLCAweDZmLAorCTB4MmMsIDB4YzEsIDB4NGUsIDB4MzgsIDB4OWUsIDB4MTAsIDB4MjUsIDB4ODMsIDB4NzUsIDB4ZjIsIDB4OTQsIDB4ODQsCisJMHg5OSwgMHgzZiwgMHgzYiwgMHgzMywgMHg2NywgMHg1MywgMHhhZSwgMHhmMCwgMHg3MSwgMHhiNSwgMHg0OCwgMHhhZSwKKwkweDk0LCAweDUxLCAweGJiLCAweDU0LCAweDE3LCAweGJlLCAweDA5LCAweGI5LCAweGVhLCAweDYxLCAweGJlLCAweDBmLAorCTB4MWIsIDB4M2YsIDB4NGUsIDB4ZjksIDB4YTIsIDB4ZmUsIDB4NWIsIDB4NDAsIDB4ZWUsIDB4YjMsIDB4MjAsIDB4YzksCisJMHhhMCwgMHg1ZSwgMHgzOSwgMHg4YSwgMHgzYywgMHgxZiwgMHhmMiwgMHhhYiwgMHgxZCwgMHgwNywgMHgwZSwgMHhkOCwKKwkweDY5LCAweDZkLCAweDA1LCAweDRmLCAweGQ0LCAweDE2LCAweGI1LCAweGQzLCAweDc4LCAweDBlLCAweGUwLCAweGQ5LAorCTB4YTAsIDB4NmUsIDB4ODYsIDB4YjksIDB4YzYsIDB4ODcsIDB4ZTgsIDB4ODEsIDB4M2QsIDB4OTUsIDB4NjgsIDB4NGYsCisJMHhmMiwgMHhmZCwgMHg2NiwgMHg1ZSwgMHhiZSwgMHhkYiwgMHgxYywgMHg5MywgMHhlNywgMHg5YiwgMHgzOSwgMHhmOSwKKwkweGJiLCAweGE2LCAweDIzLCAweGRmLCAweDY5LCAweDhlLCAweGM4LCAweGI3LCAweDliLCAweGMzLCAweGFjLCAweGM5LAorCTB4OTAsIDB4MzcsIDB4NjUsIDB4OTgsIDB4MzcsIDB4YzksIDB4YmQsIDB4ZGUsIDB4YWQsIDB4YjAsIDB4NzcsIDB4Y2EsCisJMHhmZiwgMHhkMiwgMHg0YywgMHhhMSwgMHgzMSwgMHgyOCwgMHhlNSwgMHg2MywgMHhmMCwgMHhjZiwgMHhjZSwgMHhjZCwKKwkweGFjLCAweDI1LCAweGU1LCAweDExLCAweDg3LCAweDM1LCAweDQxLCAweDFiLCAweGRmLCAweGEzLCAweGNlLCAweDg0LAorCTB4ZmYsIDB4ODYsIDB4M2YsIDB4OWIsIDB4NGEsIDB4NjUsIDB4NGYsIDB4YmIsIDB4NDYsIDB4NDcsIDB4ZTgsIDB4MDMsCisJMHg2ZSwgMHg0OSwgMHg0YSwgMHgwNywgMHhmNiwgMHg4MiwgMHgwZiwgMHg1YywgMHg3YSwgMHgxYSwgMHgzNiwgMHhhMCwKKwkweDZhLCAweDlhLCAweDA0LCAweGZjLCAweDBkLCAweDczLCAweDAxLCAweDkzLCAweDc2LCAweDhjLCAweDNhLCAweDMwLAorCTB4OWIsIDB4NzEsIDB4MGQsIDB4ZDYsIDB4NzcsIDB4YjQsIDB4NjcsIDB4MDMsIDB4ODEsIDB4ODMsIDB4NzAsIDB4ZmIsCisJMHgyYywgMHhjYSwgMHhjZCwgMHhiNCwgMHhlOSwgMHg1NywgMHgwYiwgMHhhMSwgMHg4ZiwgMHg0YiwgMHg4NCwgMHg3YSwKKwkweDY5LCAweDYxLCAweGZlLCAweGYxLCAweGQwLCAweDI3LCAweDZmLCAweGRjLCAweDA3LCAweGYxLCAweDAyLCAweGY5LAorCTB4NjQsIDB4YjAsIDB4OGUsIDB4YjAsIDB4NWEsIDB4MDgsIDB4ZGIsIDB4MTcsIDB4Y2UsIDB4NzUsIDB4ODIsIDB4ZGYsCisJMHg4ZSwgMHg5NCwgMHhiZCwgMHgzNywgMHgzNSwgMHhlNiwgMHhkOSwgMHhjOCwgMHg3NywgMHgzMCwgMHgxZSwgMHhjMSwKKwkweGY4LCAweDRhLCAweDM4LCAweGZlLCAweDljLCAweDRjLCAweDJmLCAweDBhLCAweDY4LCAweGZkLCAweDg5LCAweDU2LAorCTB4NTQsIDB4ZTMsIDB4MzEsIDB4OGMsIDB4NzUsIDB4OGMsIDB4MGQsIDB4ZDYsIDB4MDIsIDB4NjgsIDB4MzcsIDB4MjcsCisJMHhhOSwgMHhlYiwgMHhiYSwgMHg0ZCwgMHg1ZiwgMHgzOCwgMHgxOSwgMHhmYSwgMHhjMywgMHg4MiwgMHgxYywgMHhmNiwKKwkweDA2LCAweDBiLCAweDU3LCAweDExLCAweDMzLCAweGI0LCAweGI2LCAweDI4LCAweGZmLCAweGQ5LCAweDBlLCAweGJlLAorCTB4ZjgsIDB4ZmUsIDB4ZWQsIDB4YWMsIDB4YjksIDB4OTMsIDB4YTYsIDB4N2MsIDB4N2IsIDB4M2UsIDB4NmIsIDB4M2QsCisJMHhhNCwgMHg3ZiwgMHgwZCwgMHg2NywgMHhmMiwgMHhmZCwgMHg4MywgMHg3NiwgMHhmNiwgMHhjOCwgMHg5NCwgMHhkZSwKKwkweDI1LCAweGRmLCAweDNkLCAweGNhLCAweGQ4LCAweDdiLCAweDc2LCAweGU2LCAweDA3LCAweGQwLCAweGJkLCAweGZhLAorCTB4NGEsIDB4YmIsIDB4ZDQsIDB4ZWIsIDB4YTYsIDB4NWMsIDB4MTksIDB4MWQsIDB4MDQsIDB4OWQsIDB4OTYsIDB4ZDQsCisJMHgxYiwgMHg0OSwgMHhlNCwgMHg3MywgMHg5YiwgMHg2NSwgMHhiNiwgMHg1ZiwgMHgxOSwgMHgxOCwgMHhmYywgMHhmNCwKKwkweGIwLCAweGYyLCAweGQzLCAweGFlLCAweDhkLCAweDY3LCAweGUzLCAweGU3LCAweDNkLCAweGViLCAweGNmLCAweDVjLAorCTB4MDIsIDB4ZmQsIDB4ZDAsIDB4ZWIsIDB4ZTQsIDB4NzYsIDB4MjUsIDB4ZTcsIDB4YjIsIDB4MzcsIDB4NjgsIDB4OTUsCisJMHg3NSwgMHhjNCwgMHgyZSwgMHg3MywgMHhkMCwgMHhiYSwgMHg1NywgMHhmZiwgMHgyZiwgMHhmZiwgMHhmMywgMHgyNiwKKwkweDY1LCAweGY3LCAweGFhLCAweGFhLCAweDYxLCAweDU0LCAweGFjLCAweGMzLCAweDdlLCAweDRiLCAweDJiLCAweDJmLAorCTB4ODMsIDB4MTYsIDB4ZjgsIDB4ZDgsIDB4YzYsIDB4ZjYsIDB4NzAsIDB4OWMsIDB4NTEsIDB4YmMsIDB4MzgsIDB4ZGIsCisJMHhlOCwgMHg5MCwgMHhlZiwgMHhkNCwgMHhiNywgMHhjOCwgMHg3MiwgMHg5ZCwgMHhlZiwgMHhkYiwgMHg2NSwgMHhhOSwKKwkweDNlLCAweDc4LCAweGI1LCAweDRmLCAweGVmLCAweDk3LCAweGYzLCAweGQ3LCAweDVjLCAweDZmLCAweGRkLCAweGEzLAorCTB4MjMsIDB4MzcsIDB4OTgsIDB4ZmMsIDB4NDAsIDB4N2UsIDB4MzksIDB4ZGEsIDB4MjMsIDB4M2YsIDB4ZmUsIDB4NzIsCisJMHhmNiwgMHg5OSwgMHgzZiwgMHhkNSwgMHg2MSwgMHgwMywgMHhhMywgMHg5ZCwgMHhiNCwgMHg2ZCwgMHhmNCwgMHgzOSwKKwkweDlmLCAweGJkLCAweDVhLCAweGQwLCAweGE5LCAweGRiLCAweDNmLCAweDAyLCAweDRmLCAweGIzLCAweDBiLCAweDgxLAorCTB4MWQsIDB4MTAsIDB4MzcsIDB4ZjEsIDB4NDIsIDB4MzcsIDB4ZWMsIDB4ZWYsIDB4MDEsIDB4MjcsIDB4ZGUsIDB4MzUsCisJMHgwNiwgMHg4MSwgMHhlYiwgMHg3YiwgMHg4YSwgMHgxNywgMHhiNywgMHgzYiwgMHhkOSwgMHhhYiwgMHgwOCwgMHg0OSwKKwkweGZlLCAweDE1LCAweDdiLCAweDcwLCAweDc4LCAweDg3LCAweGJlLCAweDVkLCAweGVhLCAweGU5LCAweGViLCAweGFkLAorCTB4ZTcsIDB4ZTAsIDB4ZmYsIDB4MGIsIDB4YTksIDB4ZWMsIDB4OTEsIDB4Y2IsIDB4NzIsIDB4NzYsIDB4ZTYsIDB4YTIsCisJMHg0ZCwgMHhmZCwgMHhhNywgMHhkZiwgMHg3OCwgMHgwOSwgMHhiOSwgMHhhNywgMHgyNSwgMHgwYiwgMHgwZCwgMHhmYSwKKwkweDRiLCAweGUyLCAweDYyLCAweGZlLCAweGJmLCAweGNiLCAweDNhLCAweGFjLCAweDMzLCAweDRmLCAweGMwLCAweDNiLAorCTB4Y2MsIDB4MWIsIDB4YmYsIDB4NGUsIDB4MzksIDB4YjcsIDB4MTEsIDB4NzYsIDB4YjgsIDB4YTAsIDB4ZmYsIDB4NjIsCisJMHgwMywgMHg4ZiwgMHgwNiwgMHhhZCwgMHhiZCwgMHgzYSwgMHhmNywgMHhmYiwgMHgzNywgMHhlYywgMHhmYiwgMHgwZSwKKwkweDY4LCAweDFkLCAweDA0LCAweDJjLCAweDYyLCAweDY2LCAweGJhLCAweDc1LCAweDhmLCAweDU3LCAweGQ0LCAweDFlLAorCTB4YzcsIDB4MWEsIDB4YzgsIDB4ZjUsIDB4NTYsIDB4ZjcsIDB4YzAsIDB4NWMsIDB4NDMsIDB4YzcsIDB4MzksIDB4NGQsCisJMHgyNSwgMHg5NywgMHgyYiwgMHhhMywgMHhlNCwgMHhlZiwgMHg5ZSwgMHg1ZSwgMHhlNiwgMHg5OSwgMHg0NiwgMHhmZSwKKwkweGFmLCAweGZkLCAweGE4LCAweDdlLCAweDdjLCAweDdlLCAweDdlLCAweDEyLCAweGZlLCAweGQ5LCAweGY3LCAweDJmLAorCTB4ZWMsIDB4MWEsIDB4MDQsIDB4MGQsIDB4YTgsIDB4NDMsIDB4ZDMsIDB4ZTQsIDB4ZjksIDB4ZDksIDB4MTksIDB4MTcsCisJMHgzOCwgMHg4YSwgMHgwYSwgMHhmNywgMHgyNSwgMHg1OSwgMHgwMSwgMHhlZSwgMHgwOSwgMHhmMiwgMHgwMSwgMHhiOCwKKwkweGU3LCAweDM4LCAweGFmLCAweDY0LCAweDgwLCAweGY5LCAweDQ2LCAweDA2LCAweDc4LCAweDIzLCAweGZkLCAweDRjLAorCTB4NDIsIDB4ZDcsIDB4NzYsIDB4NWIsIDB4YjcsIDB4MDcsIDB4YmEsIDB4OWUsIDB4NjAsIDB4NmMsIDB4N2IsIDB4MGUsCisJMHhiYSwgMHg1NywgMHg0OCwgMHg1MiwgMHg3ZiwgMHhkYSwgMHg3YiwgMHhkNywgMHhmNCwgMHhhNywgMHgxNSwgMHg3ZiwKKwkweGJiLCAweDk0LCAweDE2LCAweDEyLCAweGMwLCAweDZiLCAweGNhLCAweDVjLCAweDhlLCAweDc4LCAweDMxLCAweGFlLAorCTB4NTMsIDB4ZjcsIDB4MmIsIDB4YTEsIDB4ZWUsIDB4NzcsIDB4ODYsIDB4YjgsIDB4MTcsIDB4YzEsIDB4OTMsIDB4NmMsCisJMHhhNiwgMHhhZSwgMHhiMywgMHg4ZSwgMHhkYSwgMHhhNiwgMHg2YSwgMHg1YiwgMHgwMywgMHgzNiwgMHg1ZCwgMHhhZSwKKwkweGIxLCAweDBlLCAweGU1LCAweGZkLCAweGM4LCAweGE1LCAweDk5LCAweDY5LCAweGQ0LCAweGFhLCAweGU1LCAweGRhLAorCTB4ODgsIDB4NTYsIDB4NmUsIDB4ZGEsIDB4NWEsIDB4ZDksIDB4YTMsIDB4YmUsIDB4ZWQsIDB4YjIsIDB4MmUsIDB4MjgsCisJMHgxZSwgMHhhNywgMHg2NSwgMHhhOSwgMHhmOSwgMHg0YiwgMHhiZiwgMHhiYSwgMHg2YiwgMHgxMywgMHhmYSwgMHhkMCwKKwkweGZkLCAweDA5LCAweGNhLCAweGY3LCAweGIzLCAweGE0LCAweDBiLCAweDQxLCAweDljLCAweGZjLCAweDRlLCAweGM5LAorCTB4YzksIDB4MjEsIDB4MTQsIDB4YmQsIDB4YzgsIDB4YWQsIDB4NGUsIDB4MGQsIDB4MTEsIDB4M2YsIDB4ZTgsIDB4NDgsCisJMHhhNSwgMHg2NCwgMHhkOSwgMHhlMywgMHgxZSwgMHg2NywgMHg2NywgMHhjOCwgMHhjYiwgMHhmMiwgMHg3MSwgMHg0YiwKKwkweDBlLCAweDJiLCAweGY5LCAweGJkLCAweGFjLCAweDZjLCAweGJiLCAweGJjLCAweDYyLCAweGM4LCAweDc0LCAweDcyLAorCTB4ZDAsIDB4N2EsIDB4NTgsIDB4YjIsIDB4NTcsIDB4MmYsIDB4MTgsIDB4ZDksIDB4NjcsIDB4YTYsIDB4NjAsIDB4ZDcsCisJMHg0YiwgMHg4YiwgMHg4NiwgMHhiOCwgMHhhYSwgMHhkZSwgMHhhMiwgMHg4YywgMHhiMiwgMHgwYiwgMHhiMCwgMHhmYywKKwkweGYwLCAweGVjLCAweDdiLCAweDViLCAweGNlLCAweGRlLCAweDJkLCAweDJiLCAweDRmLCAweGZmLCAweDI2LCAweDdjLAorCTB4Y2UsIDB4MDEsIDB4YzgsIDB4YzIsIDB4Y2MsIDB4MWMsIDB4NDIsIDB4NWUsIDB4ZjEsIDB4YjQsIDB4MGMsIDB4NWEsCisJMHg1NSwgMHhlNCwgMHhjOSwgMHhlMCwgMHgzYiwgMHhkYSwgMHgwMSwgMHg2NSwgMHgwMywgMHgxNywgMHg3NCwgMHg4YywKKwkweDA3LCAweGM4LCAweDI3LCAweDhlLCAweGFmLCAweDk1LCAweDBiLCAweGNhLCAweDk2LCAweGQyLCAweGVhLCAweGRkLAorCTB4MGUsIDB4ZTAsIDB4MDgsIDB4ZGUsIDB4NzEsIDB4ZmMsIDB4MTksIDB4ZDksIDB4YTEsIDB4ZGUsIDB4ZGQsIDB4YTksCisJMHhkZSwgMHg1NSwgMHhlOSwgMHgyYiwgMHg5NCwgMHhmYywgMHhiZSwgMHg4MiwgMHgzZCwgMHhjOSwgMHhlMywgMHg2OCwKKwkweGJlLCAweDRiLCAweDAyLCAweDViLCAweDhhLCAweGY4LCAweDZlLCAweGM5LCAweGMxLCAweDQ2LCAweDRhLCAweGJlLAorCTB4ODQsIDB4ZmEsIDB4ZTcsIDB4OGUsIDB4YzYsIDB4ODAsIDB4OTQsIDB4MjAsIDB4YzcsIDB4ZTksIDB4ZGMsIDB4ODMsCisJMHhiZCwgMHgzYywgMHg1YiwgMHg3MSwgMHgyNSwgMHhmYiwgMHg4YywgMHhlOCwgMHhhNCwgMHhmNSwgMHg0ZSwgMHgzOSwKKwkweGU0LCAweDQ1LCAweGY0LCAweDc0LCAweDg2LCAweGY0LCAweDRkLCAweDg2LCAweGUzLCAweDQ0LCAweDQ4LCAweDQzLAorCTB4MmIsIDB4YmUsIDB4NGUsIDB4ZTAsIDB4NDIsIDB4YWMsIDB4Y2YsIDB4NzksIDB4MjEsIDB4MWUsIDB4ZmEsIDB4MTEsCisJMHhkMCwgMHgzYSwgMHg5OSwgMHg5NiwgMHgxNSwgMHg4ZiwgMHg3NCwgMHg2YywgMHg5MSwgMHg2YSwgMHg4YSwgMHhmZCwKKwkweDAzLCAweGQwLCAweDM3LCAweGUyLCAweGQ5LCAweGM0LCAweDdjLCAweDY2LCAweDFkLCAweDhmLCAweDFmLCAweDZjLAorCTB4NTQsIDB4YzAsIDB4NjMsIDB4ZjIsIDB4OTcsIDB4ZWIsIDB4MTAsIDB4MjMsIDB4M2UsIDB4NDcsIDB4ZjksIDB4ZWQsCisJMHg0NiwgMHgyZSwgMHg2ZiwgMHgwNywgMHhiYSwgMHg2OSwgMHhhZCwgMHhlZCwgMHg1OSwgMHgzYSwgMHhkZSwgMHgwZCwKKwkweDU5LCAweDcxLCAweGRmLCAweDBlLCAweDk5LCAweDg0LCAweGRkLCAweDE3LCAweGViLCAweGRjLCAweDdmLCAweDEyLAorCTB4N2EsIDB4NzQsIDB4NTEsIDB4ZWQsIDB4NWYsIDB4NWEsIDB4ZTksIDB4MGYsIDB4ZTEsIDB4MDksIDB4ZGIsIDB4YmQsCisJMHgwMSwgMHhiNiwgMHg1ZCwgMHhmNiwgMHgyZSwgMHg1OCwgMHgxZiwgMHgwMSwgMHhmZiwgMHhiYiwgMHg4MCwgMHhkNywKKwkweGU1LCAweDQ0LCAweDhlLCAweGYwLCAweGM0LCAweDgzLCAweDc1LCAweGY1LCAweGQ0LCAweDI3LCAweGUwLCAweDQ5LAorCTB4YWEsIDB4YmEsIDB4YmUsIDB4NTgsIDB4NmYsIDB4OTcsIDB4ZTIsIDB4NDIsIDB4ODQsIDB4OGIsIDB4NzgsIDB4M2UsCisJMHg0MCwgMHhkZCwgMHg3YiwgMHhiNywgMHhjMiwgMHgzNSwgMHhhZCwgMHg3MCwgMHhlMSwgMHg3ZCwgMHg5ZCwgMHgzZSwKKwkweGU3LCAweDI2LCAweGMwLCAweGEzLCAweDc2LCAweGI3LCAweDQxLCAweDViLCAweGIyLCAweDRiLCAweGFhLCAweGFhLAorCTB4NzYsIDB4ZWYsIDB4NTAsIDB4YmUsIDB4YTYsIDB4OWEsIDB4ZGMsIDB4OGMsIDB4ZjcsIDB4M2UsIDB4ZjYsIDB4ZGMsCisJMHg4ZCwgMHg3YywgMHhhNiwgMHgxYiwgMHg3MywgMHg5OSwgMHgwZCwgMHg3MywgMHgxYiwgMHhlOSwgMHg0ZiwgMHg2YywKKwkweGEwLCAweGZmLCAweGJmLCAweDdiLCAweDE5LCAweDUyLCAweGU2LCAweDcyLCAweGMxLCAweGJhLCAweDEyLCAweGQ2LAorCTB4Y2QsIDB4MWUsIDB4ODcsIDB4NGQsIDB4MzAsIDB4NGYsIDB4NGYsIDB4MzEsIDB4MzYsIDB4NWYsIDB4YTMsIDB4NjgsCisJMHg5OSwgMHg1ZCwgMHhmOSwgMHgyOSwgMHhkNiwgMHhmNSwgMHgwMywgMHgzNiwgMHgxYSwgMHgwNywgMHg3YywgMHg3OCwKKwkweDBhLCAweDc4LCAweDhlLCAweGQ3LCAweGQ1LCAweDFkLCAweDA1LCAweDY0LCAweGYwLCAweGJlLCAweDNhLCAweDdiLAorCTB4YjUsIDB4ZmUsIDB4NjksIDB4M2MsIDB4YmIsIDB4YTYsIDB4ODUsIDB4NWYsIDB4ZTQsIDB4MTUsIDB4ZTksIDB4MjUsCisJMHhhZCwgMHhiYywgMHgyZiwgMHg4MiwgMHhiZCwgMHgzOSwgMHhkMCwgMHhlMywgMHhhNCwgMHgyMSwgMHhhNSwgMHgxYywKKwkweGUyLCAweGJhLCAweGM3LCAweGJiLCAweDU3LCAweGRhLCAweGU1LCAweDQwLCAweDUwLCAweDIzLCAweGQ4LCAweDhjLAorCTB4ZWYsIDB4YTYsIDB4M2EsIDB4ZmIsIDB4YTEsIDB4MTUsIDB4ZGUsIDB4YmYsIDB4NjYsIDB4NzgsIDB4NDcsIDB4MzcsCisJMHg4YywgMHhkYSwgMHg1YiwgMHgxZSwgMHg1YSwgMHhiMSwgMHhlNSwgMHg2YiwgMHg4ZCwgMHg2MSwgMHg3OSwgMHhiOCwKKwkweDkxLCAweGI1LCAweGVlLCAweDgxLCAweDBmLCAweDI4LCAweGFmLCAweGRlLCAweGNiLCAweDZlLCAweDRiLCAweGQyLAorCTB4N2YsIDB4OTksIDB4YzgsIDB4M2QsIDB4ZGIsIDB4ZWMsIDB4MjAsIDB4MTcsIDB4YTksIDB4YjIsIDB4MzYsIDB4M2IsCisJMHg5ZSwgMHhlNSwgMHg3ZCwgMHg4ZCwgMHg1NSwgMHg5NywgMHg4ZCwgMHhmOSwgMHhjYSwgMHhmZiwgMHg2NSwgMHhhZSwKKwkweGMyLCAweGZkLCAweGU5LCAweGFmLCAweDkxLCAweDliLCAweDc4LCAweGM4LCAweDRkLCAweDNjLCAweGU0LCAweDI2LAorCTB4MWUsIDB4NzIsIDB4MTMsIDB4MGYsIDB4YjksIDB4ODksIDB4ODcsIDB4ZGMsIDB4YzQsIDB4NDMsIDB4NmUsIDB4ZTIsCisJMHgyMSwgMHgzNywgMHg0MSwgMHgxZCwgMHgxMCwgMHhkNCwgMHgwNywgMHhlMywgMHhjOCwgMHhiOSwgMHhlMSwgMHhiZiwKKwkweGJjLCAweDViLCAweGMyLCAweGRjLCAweDIyLCAweDhhLCAweGNkLCAweDljLCAweDNiLCAweGJmLCAweGM5LCAweDBkLAorCTB4ZWEsIDB4MmIsIDB4ZTUsIDB4MTMsIDB4MGEsIDB4Y2QsIDB4ODksIDB4MzAsIDB4MDcsIDB4ZTIsIDB4OWEsIDB4MjgsCisJMHg3NiwgMHg3MywgMHg5ZCwgMHg4YywgMHhiOSwgMHhhOCwgMHgzZCwgMHgwYiwgMHg5MywgMHhjYywgMHg5MSwgMHg4MiwKKwkweDk4LCAweDE1LCAweGU0LCAweGU3LCAweGFmLCAweDIyLCAweDRmLCAweGNhLCAweDIwLCAweDRmLCAweDFhLCAweDQwLAorCTB4NGUsIDB4YzQsIDB4N2IsIDB4ZWEsIDB4ZTgsIDB4MmUsIDB4YTksIDB4YTAsIDB4MWQsIDB4ZjQsIDB4YzYsIDB4YjUsCisJMHgyZiwgMHg3OSwgMHhjYywgMHhkZiwgMHhlZCwgMHg0YywgMHg1OSwgMHhkNywgMHg4ZiwgMHhmNywgMHg4OSwgMHgyZiwKKwkweGM1LCAweGQxLCAweGFmLCAweDIzLCAweDU3LCAweGZlLCAweDRiLCAweDc1LCAweDZmLCAweDM2LCAweDMxLCAweDQ0LAorCTB4OTksIDB4ZGYsIDB4ZjcsIDB4MzEsIDB4ZjksIDB4NzIsIDB4YzQsIDB4ZGYsIDB4ZTAsIDB4YmUsIDB4NGYsIDB4NWYsCisJMHgyMiwgMHhmZiwgMHg0NCwgMHg3YSwgMHhjZiwgMHg4MCwgMHhlMSwgMHg2NywgMHgxMiwgMHg5MiwgMHgzYywgMHhiOSwKKwkweDA1LCAweDczLCAweDk2LCAweGY0LCAweGE5LCAweDNiLCAweDIzLCAweDg4LCAweGYyLCAweGNjLCAweDdmLCAweDQwLAorCTB4NWUsIDB4YjYsIDB4ZTgsIDB4NjcsIDB4NzgsIDB4YjMsIDB4NDAsIDB4YmMsIDB4ZjQsIDB4YWYsIDB4ZjUsIDB4OTksCisJMHg2MiwgMHhiZCwgMHhhZSwgMHg3NCwgMHhlYSwgMHg2MCwgMHhhMywgMHg4NCwgMHgzYywgMHhjYSwgMHhlOCwgMHg5MywKKwkweDBlLCAweDEzLCAweGI1LCAweDU0LCAweDg0LCAweDliLCAweDM4LCAweGRmLCAweDRjLCAweGFhLCAweDFhLCAweGU3LAorCTB4Y2MsIDB4YWEsIDB4M2MsIDB4MjEsIDB4NmIsIDB4ZWUsIDB4NTMsIDB4OWYsIDB4YTksIDB4MmUsIDB4NjQsIDB4ZDMsCisJMHhhYywgMHg3MSwgMHgwYiwgMHg1NiwgMHg3ZCwgMHhlNiwgMHg0OSwgMHhlMCwgMHg1OCwgMHg0NiwgMHg2ZSwgMHg2MCwKKwkweGE4LCAweGJkLCAweGViLCAweDMzLCAweGIzLCAweDBiLCAweGMxLCAweGJkLCAweDU1LCAweDQwLCAweDAzLCAweGUzLAorCTB4NTUsIDB4ODcsIDB4MTgsIDB4NGIsIDB4YzEsIDB4ZmQsIDB4OTUsIDB4YWUsIDB4NjAsIDB4MDksIDB4NDcsIDB4NzgsCisJMHgxMywgMHg3MCwgMHg5NCwgMHhkYiwgMHgzMCwgMHg2MCwgMHgyOSwgMHgzYiwgMHhkMiwgMHg1MCwgMHg5ZiwgMHhhOSwKKwkweGQ0LCAweDViLCAweDY5LCAweDIwLCAweDFlLCAweGUyLCAweDhkLCAweGNlLCAweGMzLCAweGIzLCAweDI0LCAweDQ1LAorCTB4M2YsIDB4ZTksIDB4ZmIsIDB4ZTUsIDB4ZDEsIDB4ODEsIDB4YjAsIDB4YWUsIDB4NDQsIDB4MWQsIDB4NzksIDB4Y2MsCisJMHgwYywgMHhmNCwgMHg1YywgMHg4ZCwgMHhmZiwgMHg1OCwgMHhjNSwgMHhhOSwgMHg4YywgMHhjZSwgMHg3OSwgMHgzZSwKKwkweGYxLCAweDJlLCAweGY3LCAweDI4LCAweGU2LCAweDMwLCAweDVlLCAweDhlLCAweGQ2LCAweGVhLCAweGUxLCAweGRhLAorCTB4YWUsIDB4MTYsIDB4N2UsIDB4YjYsIDB4ODUsIDB4ZmIsIDB4OTEsIDB4MjYsIDB4OWUsIDB4ZjMsIDB4MTUsIDB4ZWMsCisJMHg0NSwgMHhiYSwgMHhiOCwgMHhjNiwgMHgwNCwgMHg2ZCwgMHg5MCwgMHhhNSwgMHhmNywgMHhiZiwgMHhlNSwgMHg3ZCwKKwkweGViLCAweDk5LCAweGM4LCAweDUzLCAweDEzLCAweDMwLCAweDVjLCAweDRmLCAweDFjLCAweDExLCAweDBjLCAweDVlLAorCTB4OWMsIDB4MDksIDB4ZTAsIDB4ZjQsIDB4ZDUsIDB4N2IsIDB4YmUsIDB4NGYsIDB4ZGEsIDB4YjcsIDB4OTUsIDB4ZDYsCisJMHg2OCwgMHhmZiwgMHgwOCwgMHhjZiwgMHg3MCwgMHgyMCwgMHhiNywgMHg1NSwgMHg3OCwgMHhmNSwgMHg3ZiwgMHg3ZiwKKwkweGUxLCAweDA5LCAweDVkLCAweGZjLCAweGQwLCAweDdkLCAweGU5LCAweDcwLCAweDRiLCAweDhkLCAweDFjLCAweGRkLAorCTB4M2IsIDB4YjAsIDB4ZmUsIDB4NjcsIDB4M2QsIDB4Y2YsIDB4ZWYsIDB4MDMsIDB4YWQsIDB4ZjUsIDB4NjksIDB4MjksCisJMHg4YywgMHg2NSwgMHhkYiwgMHhhNCwgMHg2MCwgMHhiMiwgMHg1NiwgMHgxOSwgMHgwZiwgMHhjNywgMHg1YiwgMHgxMSwKKwkweGRiLCAweDM4LCAweGJlLCAweDE1LCAweGZjLCAweDg1LCAweDJlLCAweDNiLCAweDFkLCAweDYxLCAweGFkLCAweDk0LAorCTB4MGMsIDB4YmUsIDB4ZWIsIDB4MGMsIDB4ZDMsIDB4OGUsIDB4NTgsIDB4NmIsIDB4NmUsIDB4MGUsIDB4ZTcsIDB4MjIsCisJMHgzYiwgMHhhMiwgMHgxZiwgMHgzNiwgMHhjMywgMHgzOSwgMHhmYSwgMHg1YiwgMHgxZCwgMHhmNSwgMHgxMiwgMHhmYiwKKwkweGMwLCAweGIzLCAweGRjLCAweDZhLCAweDRiLCAweGQxLCAweDMzLCAweDI5LCAweGE3LCAweDE3LCAweDIzLCAweGJmLAorCTB4MDUsIDB4OWYsIDB4MzIsIDB4NjQsIDB4ODYsIDB4YmUsIDB4YmYsIDB4MTMsIDB4YmUsIDB4YWYsIDB4NWIsIDB4ZjYsCisJMHhjMiwgMHg2NywgMHhlZCwgMHg4MywgMHhjZiwgMHhkYSwgMHg4ZiwgMHgxYSwgMHg3NSwgMHg3YywgMHhhNSwgMHhmNSwKKwkweDNlLCAweDk3LCAweDc1LCAweDcxLCAweDU1LCAweDBlLCAweDI5LCAweGY5LCAweDU3LCAweDdjLCAweGMzLCAweGZlLAorCTB4MDAsIDB4M2EsIDB4YjAsIDB4NTMsIDB4ZTUsIDB4N2IsIDB4ODEsIDB4NGUsIDB4YzAsIDB4ZGYsIDB4M2EsIDB4NDksCisJMHhlOCwgMHhjNCwgMHhjNiwgMHg3YiwgMHhlMywgMHg2MSwgMHhkOCwgMHg0NiwgMHg0NywgMHg0MSwgMHhjNSwgMHg4NiwKKwkweDk1LCAweDgwLCAweGY3LCAweGQ1LCAweDdhLCAweGMwLCAweDdiLCAweGY4LCAweDY1LCAweGUwLCAweDM3LCAweGE1LAorCTB4ZDIsIDB4YjAsIDB4YTQsIDB4ODIsIDB4N2QsIDB4MmIsIDB4ZDgsIDB4YjcsIDB4ODIsIDB4ZGEsIDB4NzIsIDB4YjYsCisJMHhkMSwgMHhmYSwgMHhlZCwgMHhhYSwgMHgyYiwgMHhhNCwgMHg5ZCwgMHhiMCwgMHg1MSwgMHhkZiwgMHg2YSwgMHgzOSwKKwkweDdmLCAweGY0LCAweDNjLCAweDAyLCAweGZlLCAweDNmLCAweDAyLCAweGZlLCAweDFmLCAweDQ2LCAweDRkLCAweGY1LAorCTB4MDAsIDB4NmEsIDB4YWEsIDB4ZmIsIDB4NTAsIDB4NTMsIDB4MWQsIDB4NDIsIDB4NGQsIDB4MzUsIDB4ODUsIDB4OWEsCisJMHhlYSwgMHg2ZSwgMHhmOCwgMHg4ZiwgMHgzYiwgMHhlMSwgMHgzZiwgMHgyNiwgMHhlMSwgMHgzZiwgMHgyNiwgMHhkNCwKKwkweDlkLCAweGQxLCAweDQxLCAweDZmLCAweGUzLCAweDFkLCAweDRhLCAweGI0LCAweDE3LCAweGRiLCAweDFiLCAweDIyLAorCTB4NTAsIDB4ODEsIDB4ZjIsIDB4YjEsIDB4NzEsIDB4YTksIDB4MzcsIDB4NTksIDB4NWIsIDB4MzksIDB4ZWEsIDB4M2UsCisJMHg2YywgMHhkYSwgMHg5OSwgMHhkNCwgMHhhNiwgMHg5MCwgMHhiZiwgMHhkZiwgMHgzMywgMHhjMiwgMHg5YSwgMHgyYiwKKwkweGE5LCAweDE1LCAweDU1LCAweGNkLCAweDk1LCAweDdkLCAweGMxLCAweDQ1LCAweDhhLCAweDg0LCAweGRjLCAweDBmLAorCTB4NjcsIDB4Y2UsIDB4OWUsIDB4MmUsIDB4MWEsIDB4NTEsIDB4YmQsIDB4ZDMsIDB4YmIsIDB4NWEsIDB4ZWYsIDB4MmMsCisJMHhjZiwgMHhiMywgMHhkZSwgMHg3OSwgMHg3NSwgMHhiNSwgMHhkZSwgMHg1OSwgMHg5ZSwgMHg2NywgMHhiZCwgMHhmMywKKwkweGNhLCAweGJhLCAweDdhLCAweGU3LCAweGNhLCAweGQzLCAweDk3LCAweGQ2LCAweGQ1LCAweDNiLCAweDU3LCAweDllLAorCTB4N2UsIDB4MjksIDB4MWMsIDB4NGIsIDB4YTgsIDB4MGYsIDB4MjEsIDB4YWQsIDB4OTYsIDB4ODMsIDB4NjcsIDB4NGYsCisJMHg5OCwgMHg3MywgMHgzNCwgMHhmYiwgMHhkNiwgMHhmZiwgMHhkZiwgMHg3NCwgMHhjYSwgMHg5NiwgMHgzNSwgMHhiMSwKKwkweGZmLCAweDY4LCAweDZiLCAweDUwLCAweDIzLCAweGI1LCAweGNlLCAweDc3LCAweGI3LCAweGNjLCAweDVmLCAweDU2LAorCTB4ZGYsIDB4NGIsIDB4Y2IsIDB4YjUsIDB4Y2QsIDB4ZWYsIDB4YzIsIDB4MDMsIDB4Y2IsIDB4Y2EsIDB4MTAsIDB4ZjMsCisJMHhiYywgMHgwZiwgMHg3YywgMHg3ZSwgMHhmMywgMHg3MywgMHhmNSwgMHgwZSwgMHhmNSwgMHhjZCwgMHhjZCwgMHg1NSwKKwkweGY5LCAweDM2LCAweGVjLCAweDdjLCAweGY0LCAweGQxLCAweGFkLCAweDgxLCAweDJmLCAweDYwLCAweDNmLCAweGE1LAorCTB4MDUsIDB4ZmUsIDB4ZmQsIDB4MDEsIDB4ZTAsIDB4MDEsIDB4YWYsIDB4M2QsIDB4NTMsIDB4ZGQsIDB4MDcsIDB4MDUsCisJMHhlNywgMHgwZCwgMHhlZSwgMHhjNiwgMHhjZCwgMHhmYywgMHhlNSwgMHgxOSwgMHhlNiwgMHhkNiwgMHg1NSwgMHg4NSwKKwkweDliLCAweGY1LCAweDIzLCAweDZiLCAweGNlLCAweDI4LCAweDA2LCAweDQ0LCAweGI4LCAweDVlLCAweDRkLCAweDA1LAorCTB4NzQsIDB4YmIsIDB4YTgsIDB4MWQsIDB4YjksIDB4MjYsIDB4MWEsIDB4YjcsIDB4ZDYsIDB4OWEsIDB4OWQsIDB4ZTEsCisJMHhiZCwgMHhkYiwgMHhlNSwgMHgyMCwgMHhhZiwgMHg1MiwgMHhmOCwgMHhjYywgMHgxMCwgMHhkZiwgMHhjZiwgMHhmZCwKKwkweGMwLCAweGY3LCAweDEwLCAweGRlLCAweDZhLCAweDgxLCAweDFmLCAweDQ3LCAweGFlLCAweGM3LCAweDdiLCAweDFhLAorCTB4ZTYsIDB4NmMsIDB4YTYsIDB4YmMsIDB4MzMsIDB4ZGYsIDB4MjUsIDB4ZmYsIDB4NzksIDB4ZDQsIDB4ZjcsIDB4MjcsCisJMHg5YywgMHhlYywgMHhmMCwgMHgyNSwgMHhkNCwgMHgxZSwgMHgyNywgMHg2OSwgMHgyNywgMHhhMywgMHhhNCwgMHg3MywKKwkweDMwLCAweDMzLCAweDJiLCAweGE5LCAweDNlLCAweGQyLCAweDcyLCAweDVlLCAweDNmLCAweGFjLCAweDdkLCAweDk4LAorCTB4NmUsIDB4M2QsIDB4ZGMsIDB4ZTcsIDB4MWYsIDB4NWIsIDB4ZjYsIDB4YzksIDB4YjQsIDB4ZWMsIDB4NTMsIDB4YTAsCisJMHhjZCwgMHhkNiwgMHhlZiwgMHhjMCwgMHg5OSwgMHgyYiwgMHhkYiwgMHhhZiwgMHhiNywgMHg1MiwgMHg2MSwgMHg1ZCwKKwkweGY2LCAweGYwLCAweGU4LCAweDY2LCAweDU5LCAweGU4LCAweGNmLCAweDllLCAweDdkLCAweDA1LCAweGY5LCAweDdhLAorCTB4NzksIDB4MTQsIDB4NzMsIDB4YTksIDB4NDEsIDB4YmMsIDB4ZTMsIDB4N2MsIDB4YjYsIDB4OGUsIDB4NWMsIDB4ZjQsCisJMHg2YywgMHg1ZCwgMHhiNiwgMHgwMSwgMHgzZSwgMHg1YiwgMHgxMSwgMHhlMSwgMHgzYywgMHhmYiwgMHg4YSwgMHhiNiwKKwkweDdhLCAweGU4LCAweDAzLCAweGQyLCAweDE3LCAweDcwLCAweGU2LCAweDI5LCAweGQ0LCAweDVmLCAweDg3LCAweDgzLAorCTB4N2IsIDB4YjQsIDB4NzAsIDB4OWYsIDB4MWIsIDB4YjUsIDB4MjAsIDB4NmYsIDB4Y2UsIDB4NjksIDB4OTUsIDB4ZjAsCisJMHgwZSwgMHhmMCwgMHgyYiwgMHhmMCwgMHgxNywgMHg4NiwgMHg0ZSwgMHhkOCwgMHg3NywgMHg4MCwgMHg1YiwgMHg5MywKKwkweGE1LCAweGEzLCAweDg2LCAweGJhLCAweDNiLCAweDJkLCAweDhmLCAweDUyLCAweGQ2LCAweDdjLCAweDdlLCAweDE0LAorCTB4ZWYsIDB4YTIsIDB4MzMsIDB4ZmQsIDB4NGQsIDB4NzgsIDB4YTYsIDB4ZDEsIDB4YjAsIDB4NmUsIDB4OGYsIDB4Y2UsCisJMHg5NCwgMHg5MCwgMHhkNywgMHhlNywgMHgyZCwgMHhjMCwgMHg4ZSwgMHg4MCwgMHgxZiwgMHgyNSwgMHg1OSwgMHg2OSwKKwkweDY2LCAweDNlLCAweDA1LCAweDRmLCAweGFkLCAweDg1LCAweDM3LCAweGU2LCAweDA2LCAweDE5LCAweDQ2LCAweDc1LAorCTB4MGYsIDB4NzgsIDB4MzAsIDB4OTEsIDB4ODYsIDB4MWQsIDB4ZGUsIDB4ZDcsIDB4MTcsIDB4ZGQsIDB4ZTksIDB4MWEsCisJMHhiNiwgMHhhZSwgMHgwNSwgMHg3NSwgMHgzYywgMHhlNywgMHgwNywgMHg2MCwgMHg4YiwgMHgxOSwgMHhkOCwgMHgyNywKKwkweDczLCAweGE2LCAweDEyLCAweDZiLCAweDE1LCAweGRhLCAweDkzLCAweGU1LCAweDFhLCAweDU5LCAweDZiLCAweDUyLAorCTB4ODYsIDB4NTEsIDB4ZWYsIDB4ZjAsIDB4ZmMsIDB4NzksIDB4NTksIDB4NmUsIDB4NDYsIDB4MzQsIDB4ZTQsIDB4NjAsCisJMHg4ZiwgMHg2MywgMHhmOCwgMHg4ZCwgMHhlMCwgMHg5ZCwgMHg4MywgMHgxZiwgMHg2YiwgMHhhNSwgMHg4MiwgMHg3YywKKwkweDU1LCAweGU1LCAweGUyLCAweGM4LCAweGI1LCAweDg3LCAweDQ4LCAweGRmLCAweDAxLCAweGFjLCAweGE3LCAweDNlLAorCTB4NTMsIDB4NGYsIDB4MGYsIDB4ODgsIDB4ZGIsIDB4NGYsIDB4NWYsIDB4OTEsIDB4MDYsIDB4NmUsIDB4YzAsIDB4NzgsCisJMHhhZiwgMHhjMSwgMHhkNiwgMHgwNywgMHhmMCwgMHhjYywgMHg1YSwgMHg2NSwgMHhmMiwgMHg1NiwgMHhlMSwgMHhmNywKKwkweDdkLCAweDIzLCAweGM3LCAweDZmLCAweDExLCAweGUzLCAweGUxLCAweDc4LCAweGQwLCAweGZhLCAweDFkLCAweGVhLAorCTB4NWUsIDB4ZmEsIDB4NWEsIDB4MzksIDB4YmIsIDB4MTgsIDB4YzUsIDB4YzEsIDB4MTksIDB4ZDgsIDB4MjAsIDB4ZWYsCisJMHg2OCwgMHhjNywgMHhjMSwgMHgxNywgMHg4ZSwgMHhiNSwgMHgzMCwgMHgxZSwgMHg2MiwgMHg3ZSwgMHhmOSwgMHhhZiwKKwkweDcwLCAweGVlLCAweGJjLCAweDljLCAweDQ0LCAweGZkLCAweDJmLCAweGZkLCAweDdjLCAweDY2LCAweDgwLCAweDdmLAorCTB4NGIsIDB4YTgsIDB4ZWYsIDB4ZWIsIDB4ZTEsIDB4MGQsIDB4OWIsIDB4ZmQsIDB4NzEsIDB4ZDAsIDB4NjcsIDB4YjYsCisJMHhjMCwgMHgxMywgMHgyNiwgMHhhYywgMHg0ZiwgMHgwNCwgMHhmMSwgMHgzOCwgMHhlZCwgMHhkZiwgMHhhYSwgMHhlNywKKwkweGVmLCAweDk2LCAweDNmLCAweDUwLCAweDY3LCAweGNhLCAweGNiLCAweGExLCAweDQ1LCAweGRmLCAweDc3LCAweDczLAorCTB4ODMsIDB4YzMsIDB4Y2IsIDB4OTIsIDB4MWQsIDB4N2UsIDB4NTIsIDB4NzYsIDB4NWIsIDB4N2IsIDB4NTksIDB4OGYsCisJMHg1OSwgMHhjNCwgMHhlMywgMHhkZiwgMHhkYSwgMHg5NiwgMHhmNywgMHhmZCwgMHgxMywgMHhhMCwgMHhmZCwgMHgwNywKKwkweDZhLCAweDlmLCAweGJiLCAweDQxLCAweDNmLCAweDc4LCAweGE1LCAweDZhLCAweDEyLCAweGQyLCAweDBhLCAweGRlLAorCTB4YTQsIDB4NDgsIDB4NmYsIDB4YTcsIDB4MWMsIDB4NmEsIDB4M2UsIDB4MWYsIDB4Y2EsIDB4ZTYsIDB4MTEsIDB4NzEsCisJMHhiZCwgMHhiNywgMHgwZCwgMHhkZSwgMHg2ZiwgMHg5NywgMHg5YiwgMHg4ZiwgMHg4NiwgMHhiNCwgMHhlNSwgMHg0MSwKKwkweDJmLCAweGY2LCAweDZmLCAweGZlLCAweDQzLCAweDhhLCAweGJlLCAweDgxLCAweDMyLCAweDc3LCAweDkxLCAweDM1LAorCTB4YmEsIDB4YTMsIDB4Y2YsIDB4NDAsIDB4MDcsIDB4M2YsIDB4Y2UsIDB4MGYsIDB4MjQsIDB4NjUsIDB4YmQsIDB4MWYsCisJMHgyMCwgMHg1YywgMHhmMiwgMHgyMywgMHg3NCwgMHg4NSwgMHg3NCwgMHg4OCwgMHhmMiwgMHg5ZiwgMHgyYSwgMHg2ZSwKKwkweDI5LCAweDdjLCAweGM2LCAweDA2LCAweDVmLCAweGYwLCAweGE0LCAweDdhLCAweDllLCAweDM3LCAweGU4LCAweDliLAorCTB4MTgsIDB4ZmYsIDB4YTgsIDB4YzMsIDB4ZGQsIDB4ZjAsIDB4N2YsIDB4ZDAsIDB4NDEsIDB4ZDgsIDB4NzEsIDB4NzEsCisJMHg5MSwgMHhmNywgMHgxMywgMHg0MywgMHhlYSwgMHg0ZSwgMHhhYiwgMHgwNCwgMHhkOSwgMHgyZSwgMHhmMSwgMHgzYiwKKwkweDYzLCAweDJhLCAweGM4LCAweDI3LCAweDgzLCAweGZhLCAweDJiLCAweDQzLCAweDVmLCAweDg4LCAweGY2LCAweGI4LAorCTB4ZjIsIDB4OTMsIDB4MjUsIDB4ZjUsIDB4NWQsIDB4MzEsIDB4ODksIDB4MzUsIDB4M2UsIDB4OWUsIDB4YWQsIDB4N2YsCisJMHgyNywgMHhmMSwgMHhhMywgMHg0MiwgMHhmMCwgMHg3NywgMHgxMiwgMHhlMSwgMHgzNywgMHhkZSwgMHg3YSwgMHg5MCwKKwkweDQ3LCAweDNjLCAweGQ4LCAweDMwLCAweDY1LCAweGFhLCAweDExLCAweGZkLCAweGRkLCAweDA0LCAweGU1LCAweDYwLAorCTB4NGIsIDB4YjksIDB4MTEsIDB4ZTUsIDB4MGUsIDB4N2UsIDB4NTAsIDB4ZDMsIDB4YWMsIDB4OTMsIDB4ZTUsIDB4ZTMsCisJMHg2MSwgMHg0ZSwgMHhjNCwgMHgxYSwgMHg4MCwgMHgzYywgMHhjNCwgMHg3OCwgMHgzOSwgMHg5MCwgMHhkZiwgMHg5MiwKKwkweGJlLCAweDAzLCAweGYyLCAweDAzLCAweGNmLCAweDNkLCAweDEzLCAweGI2LCAweDk0LCAweDBlLCAweGUzLCAweGJhLAorCTB4YzUsIDB4MWEsIDB4MzMsIDB4YWMsIDB4N2IsIDB4YjcsIDB4NGIsIDB4NzUsIDB4OTIsIDB4ZWYsIDB4MTMsIDB4ZjIsCisJMHhkYSwgMHhmYywgMHg0MCwgMHg3MCwgMHg0ZiwgMHgyNCwgMHg4OSwgMHhmMCwgMHgzZCwgMHhjNywgMHg0OSwgMHgyOSwKKwkweGFiLCAweGY3LCAweDc3LCAweDg2LCAweGY4LCAweDUwLCAweGE3LCAweGRkLCAweDE5LCAweDhkLCAweGQzLCAweDkwLAorCTB4NjMsIDB4MDAsIDB4MzcsIDB4OGQsIDB4NTgsIDB4ZjYsIDB4NTUsIDB4YzQsIDB4YjEsIDB4NjksIDB4ZjAsIDB4YmQsCisJMHgzOCwgMHg1MSwgMHg5MSwgMHg2YiwgMHg2ZCwgMHg0YiwgMHhjNSwgMHg3ZCwgMHgzNywgMHg0OSwgMHgxZCwgMHhhMywKKwkweDdlLCAweDExLCAweGE2LCAweDA3LCAweGI5LCAweDJhLCAweGNlLCAweDNiLCAweDJhLCAweDUzLCAweDQ2LCAweGZlLAorCTB4ZGQsIDB4ZGIsIDB4Y2EsIDB4YjUsIDB4YWMsIDB4NTUsIDB4OTAsIDB4ZjcsIDB4N2QsIDB4ZDcsIDB4ZTQsIDB4ZjgsCisJMHhmYywgMHg2ZCwgMHgwZiwgMHgwNiwgMHg3NywgMHhmZSwgMHhiYSwgMHg5ZSwgMHhiZiwgMHg3OCwgMHg1YiwgMHgzOSwKKwkweGU4LCAweGUzLCAweGNjLCAweGVmLCAweDg2LCAweDdkLCAweGMyLCAweDE5LCAweGVhLCAweDdiLCAweGVjLCAweDRmLAorCTB4NmUsIDB4MzIsIDB4ZTUsIDB4YzIsIDB4NGQsIDB4YmUsIDB4N2YsIDB4MGYsIDB4YmYsIDB4MDksIDB4ODUsIDB4NzUsCisJMHhhYywgMHhhNSwgMHhlYSwgMHhkOCwgMHgwZSwgMHg5NSwgMHg4ZiwgMHhiOCwgMHhhMywgMHgxOSwgMHhhZCwgMHgwNCwKKwkweGRiLCAweDNkLCAweGU5LCAweGExLCAweGU2LCAweGQxLCAweGIzLCAweDYzLCAweGU3LCAweDc1LCAweDBiLCAweGYxLAorCTB4MzcsIDB4OWIsIDB4MzksIDB4MmUsIDB4YjksIDB4M2UsIDB4N2UsIDB4NjMsIDB4OWUsIDB4NzMsIDB4YjgsIDB4NjYsCisJMHg1YiwgMHg3MCwgMHhlZiwgMHg3NSwgMHg4MywgMHhhYiwgMHg3YywgMHhhZSwgMHg0OCwgMHgxOCwgMHg4NywgMHg2ZSwKKwkweDY4LCAweGI1LCAweDhmLCAweGQ2LCAweDNjLCAweDkzLCAweDc2LCAweDIxLCAweDUzLCAweDI2LCAweGU4LCAweGE5LAorCTB4ZDYsIDB4YTIsIDB4OWMsIDB4OGQsIDB4N2YsIDB4MGYsIDB4NzAsIDB4ZmUsIDB4YjYsIDB4YTcsIDB4MWEsIDB4MTcsCisJMHg2ZiwgMHg5YiwgMHg4NSwgMHg3YywgMHg3OCwgMHhhNiwgMHhkOSwgMHg0NiwgMHhhNCwgMHg3ZiwgMHg1MSwgMHhkZCwKKwkweGMwLCAweDNlLCAweGUyLCAweGJmLCAweDg3LCAweGY4LCAweGVmLCAweDIxLCAweGZlLCAweDdiLCAweDg4LCAweGZmLAorCTB4MWUsIDB4ZTIsIDB4YmYsIDB4ODcsIDB4ZjgsIDB4MGYsIDB4MWUsIDB4M2UsIDB4MDcsIDB4N2QsIDB4NzksIDB4ZDYsCisJMHg5YiwgMHgwOCwgMHg3MywgMHhiNiwgMHhjNywgMHg1NiwgMHg3MywgMHgzNiwgMHhmZSwgMHhjZCwgMHhjYiwgMHhiOSwKKwkweGE2LCAweGEyLCAweGE1LCAweDUyLCAweDkxLCAweDIwLCAweGU3LCAweDE1LCAweDlkLCAweGY5LCAweDRkLCAweDk0LAorCTB4ZjMsIDB4N2UsIDB4ZjQsIDB4ZjcsIDB4OTAsIDB4MDAsIDB4OGUsIDB4ZjksIDB4MWUsIDB4ZTEsIDB4MmEsIDB4OWEsCisJMHg2ZSwgMHgxMywgMHgyZSwgMHhjOCwgMHhmOSwgMHg1OCwgMHg2NywgMHhhZCwgMHg4NywgMHhlMSwgMHg3NywgMHgzNywKKwkweGZhLCAweGI2LCAweGUwLCAweDliLCAweDRmLCAweGYwLCAweDdkLCAweGE5LCAweDc2LCAweDg3LCAweDhiLCAweDU4LAorCTB4NWMsIDB4NmUsIDB4YTgsIDB4NzgsIDB4OGMsIDB4NzEsIDB4ZTMsIDB4MGUsIDB4ZmUsIDB4YWQsIDB4MDIsIDB4NjQsCisJMHhjMCwgMHg3NywgMHg1ZiwgMHg2NiwgMHg2ZCwgMHg1MSwgMHg2ZSwgMHgyMCwgMHgyZiwgMHg1YSwgMHg4ZSwgMHg3MiwKKwkweDIxLCAweGMwLCAweDc5LCAweDZmLCAweDZhLCAweGE1LCAweDA1LCAweGNhLCAweDU5LCAweDk3LCAweGQ5LCAweDE0LAorCTB4OTgsIDB4NjIsIDB4YjcsIDB4ZTYsIDB4NzgsIDB4OTcsIDB4NTQsIDB4YmQsIDB4NzQsIDB4YjYsIDB4NDksIDB4N2EsCisJMHg0NiwgMHg0MCwgMHg1YiwgMHg3NCwgMHg4ZiwgMHgyYywgMHg2MiwgMHhjYywgMHhhNywgMHg0NCwgMHg5ZiwgMHg0NywKKwkweDdlLCAweDZiLCAweDBmLCAweGE5LCAweGJmLCAweDZmLCAweGU4LCAweGM1LCAweDNlLCAweGZhLCAweGZjLCAweDhlLAorCTB4OTYsIDB4N2IsIDB4NWEsIDB4MjksIDB4MDQsIDB4M2UsIDB4OWIsIDB4YjEsIDB4ODcsIDB4ZTcsIDB4NDgsIDB4YzEsCisJMHg3NiwgMHhkZCwgMHg2ZCwgMHgzOCwgMHgxYiwgMHhlNCwgMHhmYSwgMHhhZiwgMHg1YiwgMHg1NSwgMHgwZSwgMHgwZSwKKwkweDNmLCAweDdhLCAweDYyLCAweGE4LCAweGJmLCAweDVmLCAweGJhLCAweGI3LCAweGNiLCAweGM5LCAweDIxLCAweGQ2LAorCTB4NmIsIDB4OWIsIDB4ODEsIDB4OGYsIDB4NmIsIDB4NzksIDB4ZmYsIDB4YjQsIDB4NWQsIDB4NGUsIDB4MmQsIDB4YzIsCisJMHhjZiwgMHgyZSwgMHg2NiwgMHgxZCwgMHhlYSwgMHhmMiwgMHhkMiwgMHg1MCwgMHgwYSwgMHhmZSwgMHhmOSwgMHhlNiwKKwkweDdlLCAweGM2LCAweGU3LCAweGU1LCAweDI2LCAweDc1LCAweGE1LCAweDE3LCAweGYwLCAweDAzLCAweGQwLCAweGNiLAorCTB4NGQsIDB4YjAsIDB4MjcsIDB4MWQsIDB4ZmIsIDB4NDcsIDB4YjgsIDB4ZmYsIDB4NDUsIDB4ZTEsIDB4ZWUsIDB4YjUsCisJMHg5ZCwgMHg2ZCwgMHg0YSwgMHgzNywgMHhmNCwgMHhhYywgMHg5NSwgMHhkMSwgMHg0MSwgMHhmYiwgMHhmZiwgMHgxNCwKKwkweDZlLCAweDZkLCAweDMxLCAweDcxLCAweDVjLCAweDY3LCAweGY4LCAweDNmLCAweGIzLCAweGRjLCAweDhjLCAweGQ3LAorCTB4MzAsIDB4ODYsIDB4ZjUsIDB4YjIsIDB4NTgsIDB4YWUsIDB4YmEsIDB4MDMsIDB4NjMsIDB4MzMsIDB4ZDEsIDB4NjIsCisJMHg2NSwgMHhiMCwgMHhlYywgMHgxNiwgMHg1NSwgMHg5NiwgMHhiYSwgMHhkYSwgMHgwNSwgMHg0MiwgMHhlMiwgMHgzYSwKKwkweGRkLCAweDI0LCAweGI0LCAweDcyLCAweGQ1LCAweDJhLCAweDQyLCAweDYwLCAweDM3LCAweDhlLCAweGZhLCAweGQyLAorCTB4NDYsIDB4NTUsIDB4ZGIsIDB4MzcsIDB4YWYsIDB4MTYsIDB4ZWMsIDB4MzgsIDB4Y2QsIDB4YWMsIDB4MTcsIDB4MzcsCisJMHgzOCwgMHhmNCwgMHg3MSwgMHhiMywgMHgyYywgMHgwZSwgMHg5MCwgMHg3NSwgMHg1NiwgMHg2ZSwgMHhmMiwgMHg5MCwKKwkweDNlLCAweDE5LCAweDZkLCAweGEyLCAweDI0LCAweDU1LCAweGE1LCAweGJjLCAweDU0LCAweDdkLCAweGFiLCAweDVhLAorCTB4MGIsIDB4MjcsIDB4YzQsIDB4MGYsIDB4YTksIDB4YWQsIDB4ZjYsIDB4YTUsIDB4NzcsIDB4NGQsIDB4YmYsIDB4ZWYsCisJMHhjYywgMHgyYywgMHhjNiwgMHhhNCwgMHg1MSwgMHg5MSwgMHg1NiwgMHg3MywgMHhlNiwgMHhjYywgMHhiOSwgMHg5ZiwKKwkweGZmLCAweGYyLCAweGZkLCAweDE3LCAweDNlLCAweDY3LCAweDY3LCAweGJhLCAweGMyLCAweGJkLCAweGNkLCAweDk1LAorCTB4NzYsIDB4YzYsIDB4ZmUsIDB4YjYsIDB4ZDQsIDB4Y2MsIDB4MDIsIDB4ZjMsIDB4MWEsIDB4ODYsIDB4NjQsIDB4ZGMsCisJMHg2NCwgMHhhZSwgMHhjZiwgMHg5NiwgMHgzYSwgMHg1NywgMHg2NiwgMHgxYiwgMHgxYiwgMHg2NSwgMHhkYSwgMHhlNCwKKwkweDRiLCAweDZhLCAweGE2LCAweGRjLCAweDIzLCAweDE3LCAweDQxLCAweGM3LCAweDg1LCAweGUxLCAweGQ2LCAweGQwLAorCTB4ZjcsIDB4ZGEsIDB4MTksIDB4ZjIsIDB4NzMsIDB4NzcsIDB4M2MsIDB4ZDQsIDB4NTcsIDB4MWEsIDB4NTcsIDB4MTYsCisJMHgzNCwgMHhiNiwgMHhlZSwgMHhkZSwgMHhmNSwgMHhlZCwgMHg0OSwgMHhhYywgMHgyOSwgMHg0MSwgMHg1ZiwgMHg3OSwKKwkweDVjLCAweGNiLCAweDI2LCAweDgzLCAweGVmLCAweDdkLCAweGJiLCAweGRlLCAweGUzLCAweGJiLCAweGRlLCAweDBmLAorCTB4ZmMsIDB4OGYsIDB4ZjYsIDB4MmMsIDB4ZWYsIDB4YTYsIDB4MDcsIDB4YWUsIDB4ZDMsIDB4MWEsIDB4ZTUsIDB4MmMsCisJMHgwNSwgMHhjZiwgMHgzNiwgMHg2NiwgMHgzZCwgMHgyYiwgMHg0ZCwgMHg1YywgMHg5MCwgMHgxNSwgMHg1ZiwgMHg2NSwKKwkweGRkLCAweDM2LCAweGM4LCAweGJiLCAweDM2LCAweDk5LCAweDVmLCAweDA0LCAweGNkLCAweDYzLCAweDFmLCAweGVkLAorCTB4MzYsIDB4NjMsIDB4ZTQsIDB4NDMsIDB4NzEsIDB4ZjIsIDB4NGMsIDB4MDcsIDB4YWUsIDB4YzEsIDB4YjAsIDB4MDcsCisJMHgxMywgMHg2OCwgMHhlNywgMHgzZiwgMHhlZiwgMHhhNiwgMHhjYywgMHhiMywgMHhkYSwgMHg5NywgMHg0MywgMHgzYywKKwkweGUzLCAweGFiLCAweDgyLCAweGNlLCAweGY3LCAweDYwLCAweDliLCAweDE2LCAweGI5LCAweDYzLCAweDY3LCAweDdhLAorCTB4YzIsIDB4N2MsIDB4MjAsIDB4ZDgsIDB4YmUsIDB4NWYsIDB4OGQsIDB4MTMsIDB4NmIsIDB4M2MsIDB4ZTcsIDB4NmUsCisJMHhkNywgMHg5OSwgMHg5YiwgMHhjMiwgMHgxYywgMHgyYiwgMHgxMCwgMHhjZCwgMHg1MywgMHgyMiwgMHhlNSwgMHhhYSwKKwkweGM4LCAweGViLCAweGY4LCAweGZkLCAweGE2LCAweDFhLCAweGM2LCAweDRmLCAweDE0LCAweGVkLCAweGVlLCAweDkzLAorCTB4YjIsIDB4NWUsIDB4ZmEsIDB4OWEsIDB4ZDQsIDB4YTAsIDB4N2YsIDB4ZDYsIDB4NWMsIDB4ZGYsIDB4YmYsIDB4ZWIsCisJMHgyNiwgMHhmNSwgMHg5OSwgMHhiZiwgMHhlOCwgMHgyOSwgMHgxOSwgMHgxOCwgMHhhMSwgMHg3ZSwgMHg2YiwgMHg5MywKKwkweDk3LCAweDE3LCAweDViLCAweDY0LCAweGMzLCAweGI0LCAweGNjLCAweGJiLCAweDQ0LCAweDAxLCAweDVlLCAweDQyLAorCTB4MjYsIDB4NjMsIDB4MTEsIDB4OGQsIDB4NTEsIDB4ZTUsIDB4NWIsIDB4MjIsIDB4NWIsIDB4ZjgsIDB4YjYsIDB4YjUsCisJMHhmOCwgMHg0YywgMHg5YywgMHhmZSwgMHg5NywgMHg0ZiwgMHgxNiwgMHhmOSwgMHg2ZSwgMHhlMCwgMHg2OSwgMHg0OCwKKwkweGMzLCAweDhlLCAweDAwLCAweGNiLCAweDQyLCAweDA4LCAweDk5LCAweDNjLCAweDc3LCAweGVlLCAweGY3LCAweGJiLAorCTB4NWMsIDB4MWIsIDB4ZWEsIDB4NjgsIDB4Y2YsIDB4YjYsIDB4NDksIDB4ZTEsIDB4MzAsIDB4NjQsIDB4YTIsIDB4MWEsCisJMHhkNCwgMHgzOSwgMHg0NywgMHg4ZCwgMHg5OCwgMHg5NiwgMHhkMSwgMHg5MSwgMHgwYSwgMHg3ZCwgMHhmOCwgMHhlNiwKKwkweDVlLCAweDJkLCAweGFmLCAweDMzLCAweDM3LCAweDdlLCAweGE0LCAweGY3LCAweDgyLCAweDcyLCAweGJlLCAweGUyLAorCTB4OTIsIDB4NTYsIDB4NGQsIDB4NTksIDB4MDMsIDB4YWYsIDB4YWQsIDB4ZDYsIDB4NWYsIDB4ZWQsIDB4ZTMsIDB4NWQsCisJMHhhZCwgMHhkNywgMHg1ZiwgMHg4OCwgMHgwNywgMHhmNiwgMHgxYSwgMHhlYiwgMHg3ZSwgMHgxYywgMHgwZiwgMHhlYSwKKwkweDkyLCAweGExLCAweGZkLCAweDQ1LCAweDNiLCAweGFkLCAweDhjLCAweGJkLCAweGJkLCAweDIwLCAweGY1LCAweGE1LAorCTB4OWYsIDB4YzksIDB4M2IsIDB4YTUsIDB4OWYsIDB4YzgsIDB4YWYsIDB4OTcsIDB4Y2UsIDB4MDAsIDB4N2YsIDB4NTgsCisJMHhlNSwgMHgzYywgMHhmNCwgMHhjOSwgMHhjZCwgMHhiYSwgMHhlZiwgMHhkZiwgMHg3NCwgMHhhNywgMHg2MCwgMHgyYiwKKwkweGY4LCAweGZlLCAweGVmLCAweGRjLCAweDBkLCAweDE5LCAweDM4LCAweGY2LCAweDNkLCAweGVjLCAweDM5LCAweDA3LAorCTB4MWUsIDB4YTIsIDB4MmMsIDB4OWMsIDB4MDQsIDB4YmQsIDB4YjksIDB4N2QsIDB4ZDIsIDB4MTksIDB4ZDUsIDB4NzQsCisJMHgzMiwgMHg3OCwgMHhhYywgMHgxNSwgMHg3YiwgMHgzMCwgMHg0MiwgMHg0YywgMHhjZSwgMHhiZCwgMHg4YywgMHhmNCwKKwkweDkxLCAweDY2LCAweDhjLCAweDdhLCAweDA5LCAweGYzLCAweGI3LCAweDgyLCAweDJmLCAweGY2LCAweGUyLCAweGE3LAorCTB4ZTQsIDB4ZWUsIDB4MDgsIDB4ZDYsIDB4M2EsIDB4NDIsIDB4ZGEsIDB4NmIsIDB4OTUsIDB4ODEsIDB4NDcsIDB4YjEsCisJMHg4ZiwgMHg1YywgMHg4YiwgMHhkYywgMHhmMywgMHg3ZSwgMHgxOSwgMHhhNywgMHg2ZiwgMHhlZiwgMHg5ZSwgMHhjNywKKwkweGIyLCAweGYxLCAweDk1LCAweDJlLCAweGYxLCAweGE1LCAweDA1LCAweGJhLCAweDdjLCAweGZlLCAweDc4LCAweDgwLAorCTB4OWIsIDB4ZGUsIDB4NTUsIDB4NDMsIDB4NjgsIDB4NmYsIDB4ZTcsIDB4ZGYsIDB4NTMsIDB4YzQsIDB4NzksIDB4NzksCisJMHhiZiwgMHgxNSwgMHhiOCwgMHg3YywgMHgxYywgMHg3OCwgMHgyOCwgMHg1MywgMHhiZiwgMHgyMCwgMHg4ZCwgMHg5MSwKKwkweDI4LCAweGRhLCAweDEwLCAweGFmLCAweDY4LCAweDU5LCAweDIyLCAweDU5LCAweDhmLCAweDM5LCAweDVhLCAweGNjLAorCTB4OTcsIDB4YzIsIDB4MWEsIDB4YTcsIDB4NzQsIDB4MmUsIDB4NTcsIDB4MWYsIDB4Y2YsIDB4OWMsIDB4NTgsIDB4M2UsCisJMHhhOCwgMHhiMywgMHg0MSwgMHgyMywgMHhhYywgMHgyMywgMHg3ZCwgMHhhNywgMHgzNSwgMHhhNiwgMHg4MiwgMHgwZSwKKwkweGM1LCAweDc4LCAweGMzLCAweDkyLCAweGQxLCAweGU1LCAweDJlLCAweDhjLCAweDc3LCAweDQxLCAweDMyLCAweDZlLAorCTB4NzMsIDB4Y2MsIDB4NTEsIDB4YjQsIDB4YTEsIDB4OWMsIDB4MTksIDB4MDUsIDB4OTYsIDB4ZjgsIDB4NTgsIDB4OGQsCisJMHgyZCwgMHhjNiwgMHhhMCwgMHhjYiwgMHhlMywgMHgzMiwgMHg2NiwgMHhlZSwgMHhkOSwgMHhiMSwgMHhjNywgMHhiYywKKwkweGI2LCAweDE1LCAweDBjLCAweDYzLCAweDM4LCAweDVjLCAweDUzLCAweGQ3LCAweDhlLCAweDM1LCAweGIxLCAweDNmLAorCTB4N2UsIDB4YjAsIDB4OTMsIDB4MzMsIDB4OGIsIDB4MGIsIDB4OTAsIDB4NTMsIDB4MGIsIDB4MWYsIDB4NjYsIDB4ZGMsCisJMHg2NywgMHgyNSwgMHgxYiwgMHg2YiwgMHhkMywgMHhiNiwgMHg0ZCwgMHgwNSwgMHhmNywgMHg5MiwgMHhmNSwgMHhlOCwKKwkweGQzLCAweGZhLCAweDBlLCAweGU0LCAweGQwLCAweDllLCAweGIwLCAweDhlLCAweDZkLCAweGM1LCAweGM4LCAweGUwLAorCTB4ZWMsIDB4MDMsIDB4MWIsIDB4OTcsIDB4NzUsIDB4NWYsIDB4OTYsIDB4Y2MsIDB4NDIsIDB4NGUsIDB4MjYsIDB4NzQsCisJMHgzZiwgMHg5ZSwgMHhlMSwgMHg0MSwgMHg4ZCwgMHg0MywgMHhjOCwgMHhhYiwgMHgwMywgMHhiZCwgMHgzOCwgMHhjYiwKKwkweGQ0LCAweDAzLCAweDdiLCAweDM4LCAweGQ5LCAweDRiLCAweDJlLCAweGZhLCAweDRmLCAweGM4LCAweGIzLCAweGY4LAorCTB4ZDYsIDB4Y2IsIDB4M2IsIDB4NmEsIDB4OTMsIDB4ODEsIDB4NjcsIDB4YTAsIDB4MmYsIDB4YmQsIDB4NjYsIDB4N2QsCisJMHg1NCwgMHgzZSwgMHhmMywgMHhmYywgMHgzOCwgMHg2MywgMHgyZSwgMHg3ZiwgMHhmNiwgMHg0YywgMHhmOSwgMHhjNCwKKwkweGQzLCAweGIxLCAweGQ4LCAweGU5LCAweDg4LCAweDU4LCAweGU3LCAweDAzLCAweDViLCAweGZkLCAweGYwLCAweGY0LAorCTB4YmMsIDB4ZTIsIDB4ZjcsIDB4YzMsIDB4ZTcsIDB4NTcsIDB4NTQsIDB4MDcsIDB4ZGEsIDB4NDYsIDB4ZDEsIDB4OGUsCisJMHhlYiwgMHgzMCwgMHg2NSwgMHhkYywgMHhmYiwgMHhhYiwgMHgzZiwgMHg3MywgMHhjNCwgMHhmNywgMHgyNywgMHg3NCwKKwkweDRlLCAweDU4LCAweGNhLCAweDljLCAweDU3LCAweDRkLCAweDdjLCAweGVlLCAweDg4LCAweDE3LCAweDZiLCAweGM3LAorCTB4NWMsIDB4MjksIDB4NzMsIDB4NDUsIDB4MWQsIDB4YzYsIDB4N2EsIDB4NTgsIDB4ZWUsIDB4MjUsIDB4NGYsIDB4MjQsCisJMHgzNiwgMHg4NCwgMHhlMywgMHg1YiwgMHg5MywgMHhjYiwgMHgyYSwgMHg5NSwgMHgxYywgMHg1NCwgMHg1NiwgMHhiYSwKKwkweDgwLCAweDVmLCAweDhiLCAweGQyLCAweDcxLCAweGNjLCAweDQ0LCAweDUyLCAweDgxLCAweDc3LCAweGIxLCAweDI3LAorCTB4ZmIsIDB4YTgsIDB4ZWYsIDB4NGYsIDB4ZGEsIDB4YWMsIDB4NGYsIDB4OTksIDB4NTEsIDB4NDUsIDB4ZGYsIDB4NGIsCisJMHhhNywgMHg4ZSwgMHg3NywgMHg1ZSwgMHgzZSwgMHg5MCwgMHgzMiwgMHg4ZiwgMHhhYSwgMHhmZCwgMHhlMSwgMHhmYiwKKwkweDI4LCAweDY0LCAweGU2LCAweGY2LCAweDc4LCAweDY3LCAweDk2LCAweDk1LCAweDI5LCAweDJmLCAweDc5LCAweGE5LAorCTB4ZTQsIDB4YWMsIDB4YjIsIDB4NzIsIDB4MTgsIDB4MzMsIDB4MzcsIDB4YTYsIDB4MjgsIDB4MzcsIDB4NTIsIDB4NjYsCisJMHhhNywgMHhhMiwgMHg3ZiwgMHhiNCwgMHg1ZCwgMHhlZiwgMHg3YiwgMHgxMiwgMHhmZCwgMHg1MywgMHhhYSwgMHgyNSwKKwkweDVjLCAweDBmLCAweGVmLCAweGViLCAweDRhLCAweDVmLCAweGMwLCAweDMzLCAweDk0LCAweDM5LCAweGZkLCAweGM2LAorCTB4Y2MsIDB4MDIsIDB4ZjMsIDB4Y2IsIDB4NzQsIDB4NWUsIDB4NDMsIDB4N2EsIDB4ZTAsIDB4MTgsIDB4ZGYsIDB4MGQsCisJMHhiOSwgMHg3ZiwgMHhlMiwgMHg2ZiwgMHhhOCwgMHg0MywgMHhiOSwgMHhjYywgMHgzYSwgMHgyNywgMHhlNCwgMHhiNywKKwkweDIzLCAweDFhLCAweDNmLCAweGRmLCAweDNmLCAweDkxLCAweGQ3LCAweGI5LCAweDhiLCAweDBkLCAweDM1LCAweDEwLAorCTB4ZWUsIDB4N2IsIDB4ZmIsIDB4Y2UsIDB4OTIsIDB4MTksIDB4ZjcsIDB4NGIsIDB4MWMsIDB4NjcsIDB4MjEsIDB4NzIsCisJMHhiMiwgMHg1ZCwgMHg5OCwgMHgyMywgMHgzYSwgMHg1ZSwgMHg2YSwgMHhkMiwgMHgwNiwgMHg3ZCwgMHgwMywgMHhjYywKKwkweDE1LCAweDY4LCAweGM2LCAweGRkLCAweDJmLCAweDg4LCAweDcxLCAweGFjLCAweDYzLCAweDA3LCAweDlkLCAweDAwLAorCTB4NzcsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MzEsIDB4NGUsIDB4NjEsIDB4NTEsIDB4ZjIsIDB4NDEsIDB4N2YsIDB4ZTksCisJMHg2MCwgMHg0ZSwgMHg2YSwgMHhhMSwgMHhmYSwgMHg0NSwgMHg2MywgMHgwNCwgMHgzYSwgMHg3MCwgMHgxYywgMHhlZiwKKwkweGY3LCAweDRmLCAweDkwLCAweDNlLCAweDc5LCAweDM2LCAweDQ5LCAweDM1LCAweGJlLCAweGM0LCAweGY1LCAweDFjLAorCTB4OTQsIDB4ODksIDB4NDUsIDB4NjAsIDB4MjMsIDB4ZmMsIDB4ZTYsIDB4MTcsIDB4ODMsIDB4N2IsIDB4YmIsIDB4MGUsCisJMHg5YywgMHgzZCwgMHhlMSwgMHg5OSwgMHg5YSwgMHg1ZiwgMHg2NywgMHg1ZCwgMHhjNiwgMHg0ZiwgMHhjMCwgMHgyYiwKKwkweDNhLCAweDhmLCAweDhhLCAweDdkLCAweDk5LCAweDRiLCAweDc4LCAweDg4LCAweGZhLCAweGQxLCAweDZkLCAweDQ4LAorCTB4MGMsIDB4NmQsIDB4ODksIDB4NTksIDB4NTksIDB4NmYsIDB4OGQsIDB4MjYsIDB4MjMsIDB4ZGQsIDB4MzIsIDB4MGYsCisJMHg3OSwgMHg1NywgMHg4MSwgMHhlZSwgMHgyYywgMHg1YywgMHg4OSwgMHhjYSwgMHhhYywgMHhhNywgMHhlMywgMHhkOSwKKwkweGM5LCAweDhmLCAweDk1LCAweDJiLCAweGI1LCAweGZhLCAweDcxLCAweGI5LCAweDUxLCAweDc3LCAweGY0LCAweDM3LAorCTB4ZWEsIDB4YjUsIDB4YzIsIDB4YWIsIDB4ODYsIDB4N2MsIDB4ZmYsIDB4ODgsIDB4Y2UsIDB4YTUsIDB4NzMsIDB4MmEsCisJMHhkMiwgMHhkOSwgMHg0ZiwgMHhjYywgMHhiMywgMHhhMiwgMHhmMywgMHhlYSwgMHgyMCwgMHgzYiwgMHg4MCwgMHgzOSwKKwkweGRlLCAweDA2LCAweGU2LCAweDc4LCAweDBiLCAweDk4LCAweGUzLCAweDU3LCAweGMwLCAweGQ4LCAweDM3LCAweDRiLAorCTB4OTMsIDB4YTEsIDB4ZmMsIDB4OWYsIDB4ODYsIDB4MWMsIDB4YTIsIDB4YWUsIDB4YjYsIDB4Y2UsIDB4ZTAsIDB4NGUsCisJMHhhNywgMHhmMywgMHhhMCwgMHhjMSwgMHhkYiwgMHhiMCwgMHgzZiwgMHhkNiwgMHg0YiwgMHgxOSwgMHg1OSwgMHg1ZCwKKwkweDlhLCAweDkwLCAweGI1LCAweGE1LCAweDIwLCAweDBmLCAweGY5LCAweDAzLCAweGU2LCAweDdkLCAweDhkLCAweGYwLAorCTB4OWUsIDB4MWMsIDB4YzgsIDB4YTEsIDB4M2QsIDB4MzIsIDB4NzAsIDB4OTQsIDB4ZjIsIDB4YTMsIDB4NDMsIDB4OTYsCisJMHg4YiwgMHhhYiwgMHg1YSwgMHgwZSwgMHgyZCwgMHgxNywgMHg1OSwgMHg4ZSwgMHg4OCwgMHhjZSwgMHgyMSwgMHg5YiwKKwkweGRhLCAweDkwLCAweDhhLCAweDViLCAweDQ3LCAweGZkLCAweDNlLCAweGVkLCAweDBmLCAweDBhLCAweGZjLCAweGYzLAorCTB4OTQsIDB4OTcsIDB4N2YsIDB4MGEsIDB4ZWYsIDB4NWUsIDB4ZTksIDB4ZGMsIDB4YmEsIDB4MTksIDB4YjMsIDB4MWIsCisJMHhlZCwgMHg5YSwgMHhiMiwgMHg2YiwgMHgzMCwgMHg4OCwgMHhiOSwgMHhhYiwgMHhkYiwgMHg2OCwgMHg4MywgMHgzOSwKKwkweDgwLCAweDE5LCAweGFmLCAweDQzLCAweDg3LCAweDM0LCAweDljLCAweDZlLCAweDhkLCAweGZkLCAweDFhLCAweGNlLAorCTB4MjEsIDB4OWQsIDB4NzcsIDB4Y2IsIDB4NzEsIDB4MGEsIDB4NDUsIDB4NWIsIDB4ZTYsIDB4OGEsIDB4NTYsIDB4MzIsCisJMHgwZiwgMHhmYSwgMHhiYiwgMHgwMSwgMHhiYiwgMHg2ZCwgMHgxNSwgMHg3NywgMHhiMCwgMHg4NiwgMHgzMywgMHg1OCwKKwkweGFmLCAweDUzLCAweGNmLCAweDZmLCAweDZhLCAweGQ5LCAweGJiLCAweDVjLCAweGZmLCAweDIzLCAweGM2LCAweGIxLAorCTB4Y2UsIDB4YTQsIDB4ZTUsIDB4MGYsIDB4N2QsIDB4OTQsIDB4ODEsIDB4ZjQsIDB4NGQsIDB4NjUsIDB4NzUsIDB4ZmYsCisJMHhhMCwgMHhkZiwgMHgyYSwgMHhkYSwgMHhhZSwgMHhkNSwgMHgyOSwgMHg4ZiwgMHg0NSwgMHgyZSwgMHg3OSwgMHgzNiwKKwkweDc0LCAweGM5LCAweGNiLCAweDA5LCAweDYyLCAweDgwLCAweGIyLCAweDZhLCAweGY2LCAweGYzLCAweGMzLCAweDM1LAorCTB4ZmIsIDB4ZmUsIDB4NWUsIDB4OWIsIDB4ZWIsIDB4NzIsIDB4NDIsIDB4YjksIDB4NGQsIDB4ZGQsIDB4YmYsIDB4YTEsCisJMHhiMSwgMHg4ZCwgMHg1NywgMHg3YSwgMHg1NiwgMHhkZSwgMHhjNCwgMHg3ZCwgMHgwNywgMHgxOCwgMHgyNywgMHgyNywKKwkweDZmLCAweDAwLCAweGUzLCAweGQ1LCAweDRiLCAweGNkLCAweGJjLCAweGVkLCAweDkzLCAweDM4LCAweGE3LCAweDkyLAorCTB4OWEsIDB4YmIsIDB4ZGEsIDB4MjksIDB4OTcsIDB4YWYsIDB4MTUsIDB4ZDQsIDB4NGIsIDB4ZDcsIDB4M2MsIDB4ZjUsCisJMHhmMywgMHhhYiwgMHg0NSwgMHg1NSwgMHhiOCwgMHhlYSwgMHhmYiwgMHhmZiwgMHg3MCwgMHg2NywgMHhlNCwgMHg5ZCwKKwkweDI1LCAweDVmLCAweDRlLCAweGJiLCAweDQ2LCAweDdmLCAweDQ0LCAweDlhLCAweGY5LCAweDc0LCAweGJlLCAweGRmLAorCTB4MDEsIDB4ZDksIDB4YmMsIDB4N2UsIDB4YzAsIDB4ZjcsIDB4MWYsIDB4MTksIDB4MTksIDB4MTEsIDB4ZTcsIDB4MDAsCisJMHgzMSwgMHhjYSwgMHg3MCwgMHg4MiwgMHgzOSwgMHhhZSwgMHg5NCwgMHgzOSwgMHgxOSwgMHhkYiwgMHgzZSwgMHg1ZiwKKwkweDUxLCAweDBhLCAweGYyLCAweGFkLCAweDNiLCAweGMwLCAweDJmLCAweDhmLCAweGVlLCAweDBiLCAweGUzLCAweDI2LAorCTB4M2YsIDB4N2MsIDB4OWUsIDB4N2UsIDB4ZTUsIDB4YzQsIDB4ZTcsIDB4ZmMsIDB4Y2EsIDB4YTYsIDB4OWMsIDB4MmQsCisJMHhmNiwgMHhhMiwgMHg3ZiwgMHg0YywgMHg3ZSwgMHg1MCwgMHg4YywgMHhlZSwgMHgyYSwgMHg5YiwgMHg3OCwgMHgzYSwKKwkweDQ2LCAweGExLCAweDc4LCAweGNmLCAweDFmLCAweGQ0LCAweGYxLCAweDAzLCAweDYwLCAweDEyLCAweGQzLCAweGY3LAorCTB4NjcsIDB4NWQsIDB4Y2UsIDB4ZDcsIDB4OGQsIDB4ZjksIDB4MzYsIDB4Y2MsIDB4N2QsIDB4ZDAsIDB4ZmYsIDB4YTcsCisJMHhiNSwgMHg3ZSwgMHgyZSwgMHgyYiwgMHhkOCwgMHhjMSwgMHhlMCwgMHhlZiwgMHg5OCwgMHg4YywgMHgxNSwgMHhhMSwKKwkweGUzLCAweDE1LCAweGYzLCAweDRjLCAweDg5LCAweDE1LCAweGFjLCAweGM0LCAweDJjLCAweDY0LCAweGM3LCAweDBjLAorCTB4ZTQsIDB4Y2QsIDB4MjksIDB4MWQsIDB4NjcsIDB4ZWQsIDB4ZDUsIDB4YjIsIDB4NjcsIDB4OGUsIDB4ZTUsIDB4OWMsCisJMHhhNCwgMHgyYiwgMHg2ZSwgMHg4ZiwgMHgzZSwgMHhiZiwgMHhjZCwgMHgxYiwgMHgyZiwgMHgyNiwgMHg4MiwgMHgzYiwKKwkweDA3LCAweDFmLCAweGU3LCAweDk0LCAweGI0LCAweGMxLCAweDFlLCAweGNhLCAweGFlLCAweDRjLCAweDgxLCAweDI3LAorCTB4MTIsIDB4MzgsIDB4ZGIsIDB4NTYsIDB4Y2QsIDB4MGYsIDB4MGQsIDB4ZTgsIDB4ZWYsIDB4ODYsIDB4ZjYsIDB4MjksCisJMHgwNiwgMHhiMSwgMHg4YiwgMHg4NiwgMHhjOSwgMHg3NiwgMHhhNywgMHhkMCwgMHhhZiwgMHg1ZCwgMHgzMiwgMHg1NywKKwkweGRiLCAweGI0LCAweDVjLCAweDdkLCAweGI4LCAweDJlLCAweDBkLCAweDFjLCAweGYyLCAweDA0LCAweGNhLCAweDExLAorCTB4ZDQsIDB4MjUsIDB4YzMsIDB4YjIsIDB4ODEsIDB4ZjIsIDB4MzQsIDB4Y2EsIDB4MmQsIDB4NzgsIDB4YjIsIDB4Y2QsCisJMHg2MSwgMHhlMCwgMHgwYSwgMHgzYywgMHg1ZiwgMHhjMywgMHg3OCwgMHgyMywgMHg1OCwgMHg3MywgMHhjZSwgMHg5NCwKKwkweDhmLCAweDRlLCAweDUwLCAweDk3LCAweDM4LCAweDA2LCAweDczLCAweDkxLCAweDY3LCAweDZkLCAweDNjLCAweDZiLAorCTB4NDUsIDB4OTUsIDB4NWQsIDB4NjAsIDB4MTksIDB4Y2YsIDB4NzIsIDB4ZjAsIDB4ZmQsIDB4MjEsIDB4OTksIDB4ODQsCisJMHgzZSwgMHg5OSwgMHg2YiwgMHg4MSwgMHg0YywgMHhmYSwgMHg2OCwgMHg1YiwgMHgyNiwgMHhiMSwgMHhhZSwgMHg1ZCwKKwkweGM2LCAweGFlLCAweDkyLCAweGQ3LCAweDRkLCAweGQwLCAweDViLCAweGE3LCAweDY0LCAweGFmLCAweGM1LCAweDM0LAorCTB4MWUsIDB4YWQsIDB4ODAsIDB4MTYsIDB4YWYsIDB4ODMsIDB4YWUsIDB4OTYsIDB4NDEsIDB4NTMsIDB4OTksIDB4YTIsCisJMHgzNSwgMHgzYSwgMHhhZCwgMHg5MiwgMHhkYSwgMHgyZiwgMHhmMCwgMHgzOCwgMHhlOCwgMHhiNSwgMHhlMywgMHgwYSwKKwkweGIxLCAweDI4LCAweDc5LCAweGQ5LCAweDAxLCAweGVkLCAweDg5LCAweGRmLCAweDYxLCAweGRiLCAweDkzLCAweDhlLAorCTB4YjIsIDB4NDEsIDB4ODMsIDB4YTAsIDB4Y2IsIDB4NjIsIDB4YzAsIDB4ZDMsIDB4ZWYsIDB4MjksIDB4MmQsIDB4NTcsCisJMHg0NywgMHhlZiwgMHg0OCwgMHgyYSwgMHg3ZCwgMHg0NywgMHgyYywgMHhjOCwgMHgwMiwgMHhjYiwgMHhmZCwgMHg1MCwKKwkweDVjLCAweDhjLCAweDc5LCAweDVjLCAweDVlLCAweGM3LCAweDNjLCAweDA2LCAweGY4LCAweGZiLCAweGM4LCAweDkwLAorCTB4ZTYsIDB4ZWYsIDB4NTEsIDB4ODksIDB4ZWMsIDB4ZTYsIDB4NzEsIDB4ZDAsIDB4MWIsIDB4NjQsIDB4NTAsIDB4YzAsCisJMHhkMywgMHhlOSwgMHg5MCwgMHg0NiwgMHg5ZiwgMHgwNiwgMHhmZiwgMHg1YSwgMHhiMCwgMHhjYSwgMHg5MiwgMHgzMiwKKwkweDBmLCAweGZlLCAweGJmLCAweDhlLCAweGVmLCAweGI3LCAweGVhLCAweDlmLCAweGFhLCAweGI5LCAweDA1LCAweDE1LAorCTB4ZTYsIDB4YjIsIDB4N2MsIDB4MWIsIDB4MzgsIDB4ZjksIDB4ZjcsIDB4MzgsIDB4YmIsIDB4MmUsIDB4OGQsIDB4ZGQsCisJMHgwNywgMHg0NiwgMHgxOCwgMHg0YiwgMHhmYiwgMHhiNywgMHhiYSwgMHg2YywgMHgxZiwgMHg5NSwgMHhjZCwgMHhlMSwKKwkweGUzLCAweDI4LCAweGVmLCAweGMzLCAweGQzLCAweGMwLCAweDM5LCAweDQ0LCAweDc1LCAweDJjLCAweDdjLCAweGQ5LAorCTB4MWIsIDB4MzYsIDB4MGEsIDB4M2EsIDB4ZWYsIDB4ZTAsIDB4OTgsIDB4Y2UsIDB4Y2YsIDB4MzcsIDB4ZWMsIDB4MDMsCisJMHhmOCwgMHg0ZSwgMHhiZiwgMHgwYywgMHhmNywgMHgwNiwgMHhjYywgMHhhNCwgMHgxMiwgMHgzYSwgMHhjNywgMHhiNCwKKwkweDAyLCAweDJjLCAweGIxLCAweDgyLCAweGYxLCAweGRlLCAweGE3LCAweDVmLCAweGFmLCAweDA2LCAweDFlLCAweDFlLAorCTB4ZmUsIDB4YTcsIDB4OWYsIDB4OGUsIDB4MzEsIDB4MjcsIDB4N2QsIDB4MzMsIDB4MTEsIDB4ZTgsIDB4YmYsIDB4Y2YsCisJMHhmYywgMHg0ZCwgMHg3YiwgMHg2ZSwgMHhkNCwgMHhjMCwgMHhjYiwgMHg2ZCwgMHgzMywgMHg4NiwgMHhiNiwgMHhkMCwKKwkweDY1LCAweGQwLCAweDQ1LCAweDY1LCAweDRkLCAweGJmLCAweDZjLCAweDE3LCAweGY0LCAweDJkLCAweGQ0LCAweDUyLAorCTB4ZTYsIDB4MDcsIDB4MTIsIDB4ZjQsIDB4OWQsIDB4YjcsIDB4YTksIDB4NzcsIDB4ZGEsIDB4MjEsIDB4NWYsIDB4OTIsCisJMHgxYSwgMHg1NywgMHhiZSwgMHg2ZiwgMHhlNywgMHgyMSwgMHgxNSwgMHhhYywgMHhlNCwgMHgyNCwgMHg2OCwgMHhiNCwKKwkweDRkLCAweDJjLCAweDY3LCAweDVjLCAweDFlLCAweGNjLCAweDNiLCAweGFiLCAweGZiLCAweGIyLCAweDZkLCAweGIzLAorCTB4NmYsIDB4NzMsIDB4NWUsIDB4YWUsIDB4OWYsIDB4N2IsIDB4ZTEsIDB4MWUsIDB4ZTgsIDB4YTcsIDB4MzYsIDB4MzUsCisJMHg4ZCwgMHgzNiwgMHg2YSwgMHhlZCwgMHhmZCwgMHgwMSwgMHg4ZCwgMHgzNiwgMHhmNywgMHgxMSwgMHhmYiwgMHgzZiwKKwkweGZiLCAweDIwLCAweDlkLCAweDBjLCAweDFiLCAweDQxLCAweDBlLCAweDA2LCAweDllLCAweDM1LCAweDllLCAweGU3LAorCTB4YTcsIDB4YzAsIDB4ZjcsIDB4M2IsIDB4ZTksIDB4YTcsIDB4ZTksIDB4NjcsIDB4MGMsIDB4ZTgsIDB4ZTcsIDB4OTEsCisJMHg2ZCwgMHhmYSwgMHgyMSwgMHhkZCwgMHg3NCwgMHhjYSwgMHhkOCwgMHgzNSwgMHg1YiwgMHgyNiwgMHg4YSwgMHhmYSwKKwkweGJlLCAweDgxLCAweDM1LCAweGU5LCAweDNmLCAweDNhLCAweDBlLCAweGJhLCAweDIxLCAweGFkLCAweDkzLCAweGI3LAorCTB4NGMsIDB4MjksIDB4ODMsIDB4OGUsIDB4Y2EsIDB4OTAsIDB4NGYsIDB4NjUsIDB4ZDAsIDB4MTQsIDB4MzEsIDB4NTAsCisJMHgxOSwgMHhmMiwgMHhhZCwgMHg1YywgMHhiNywgMHg5YywgMHgyYSwgMHhmNiwgMHg0YywgMHg5ZCwgMHhiZCwgMHgwMiwKKwkweDNhLCAweGJhLCAweDVlLCAweGU3LCAweGZkLCAweGViLCAweDM1LCAweDliLCAweGQ0LCAweDgzLCAweGI3LCAweGI2LAorCTB4ZWYsIDB4ZmUsIDB4ZWYsIDB4YjgsIDB4ZmIsIDB4NDMsIDB4NzIsIDB4MDMsIDB4NzYsIDB4Y2IsIDB4OWIsIDB4YTUsCisJMHg2MSwgMHhjOCwgMHgyNCwgMHgyMSwgMHg1ZSwgMHgwNCwgMHg2ZCwgMHg4YywgMHhjYSwgMHg2YSwgMHhlOSwgMHhhNCwKKwkweGFjLCAweDQxLCAweDNmLCAweGFkLCAweDJmLCAweDBkLCAweDAwLCAweDRmLCAweDQzLCAweDhlLCAweGJlLCAweDcyLAorCTB4NDQsIDB4ZGUsIDB4NTgsIDB4NTIsIDB4MzIsIDB4NjMsIDB4NDMsIDB4YmYsIDB4MmMsIDB4ZDMsIDB4MDcsIDB4MGYsCisJMHg3YSwgMHgyZSwgMHg3NywgMHhlYSwgMHg5OCwgMHhmZCwgMHg1OCwgMHgzNSwgMHhmMCwgMHhjNSwgMHg4ZiwgMHg1NywKKwkweGJiLCAweDY0LCAweGEyLCAweDZhLCAweGNhLCAweDYzLCAweGQ1LCAweDFlLCAweDc5LCAweGEyLCAweDFhLCAweDkzLAorCTB4ZDMsIDB4YjUsIDB4ODQsIDB4N2MsIDB4YTMsIDB4N2EsIDB4NTAsIDB4NGUsIDB4NTUsIDB4MGYsIDB4YzksIDB4OTMsCisJMHhiNSwgMHhhNCwgMHg3YywgMHgxMywgMHg3NiwgMHg2MSwgMHhhZSwgMHhlNiwgMHhjOCwgMHg2NCwgMHg2ZCwgMHg1OCwKKwkweDFlLCAweGFmLCAweGQxLCAweGM3LCAweDhlLCAweGY5LCAweGYwLCAweGNiLCAweDZlLCAweGZiLCAweDJlLCAweGI4LAorCTB4YWUsIDB4MGUsIDB4YWMsIDB4Y2IsIDB4NTEsIDB4ZTMsIDB4M2EsIDB4NjYsIDB4MjksIDB4YjksIDB4YzAsIDB4ZmYsCisJMHgyMSwgMHg3MiwgMHgwZSwgMHg3ZCwgMHgyZiwgMHhiZSwgMHhhMiwgMHhhNCwgMHhhMiwgMHhlNywgMHg2ZiwgMHhmZSwKKwkweGRmLCAweDQ4LCAweDU0LCAweGRiLCAweDQ2LCAweGU3LCAweGNhLCAweDA3LCAweGQxLCAweGM2LCAweGE2LCAweDRkLAorCTB4MTIsIDB4ZmEsIDB4NDEsIDB4OWEsIDB4ZmUsIDB4ZmYsIDB4YTYsIDB4ZWQsIDB4NjUsIDB4NjgsIDB4MWYsIDB4ZjYsCisJMHgyZCwgMHhkYSwgMHg1ZSwgMHhmYSwgMHhlYywgMHgyOSwgMHgzZiwgMHg2OCwgMHhlNywgMHhkMCwgMHhkNiwgMHhkYSwKKwkweDE5LCAweGU3LCAweDY4LCAweGNlLCAweDdiLCAweDMxLCAweGY3LCAweGYwLCAweGZmLCAweGE3LCAweDA0LCAweGYxLAorCTB4YWEsIDB4YjMsIDB4YjUsIDB4ODMsIDB4ZmMsIDB4M2YsIDB4MTUsIDB4YWMsIDB4ZTUsIDB4OGIsIDB4ZjMsIDB4YzUsCisJMHgyNywgMHg0YSwgMHg2MywgMHhlYSwgMHhiMSwgMHgxMiwgMHgxMSwgMHg4ZCwgMHgyZiwgMHgxNywgMHhiNywgMHg3MywKKwkweGYyLCAweGJlLCAweDJlLCAweGNiLCAweDZlLCAweDU0LCAweGFmLCAweDIxLCAweGYwLCAweGRiLCAweGE3LCAweDc1LAorCTB4N2UsIDB4ZGUsIDB4ZDgsIDB4MTAsIDB4ZTksIDB4OGYsIDB4NzEsIDB4YjgsIDB4YWUsIDB4MzAsIDB4YjYsIDB4MDAsCisJMHg2YywgMHhlYiwgMHg5YSwgMHg3MiwgMHhhOSwgMHgxYSwgMHhmOCwgMHhhZiwgMHhlNiwgMHgzNCwgMHhiZCwgMHhiYywKKwkweDA1LCAweDlhLCAweDYzLCAweGZjLCAweDIxLCAweDc4LCAweGU2LCAweGNiLCAweDQxLCAweGRmLCAweGVjLCAweDkwLAorCTB4NDMsIDB4N2IsIDB4MWMsIDB4ZmIsIDB4MzUsIDB4N2EsIDB4MzgsIDB4MTcsIDB4ZmYsIDB4NGYsIDB4MDcsIDB4ZTUsCisJMHg3MCwgMHhiZCwgMHhjYywgMHgyZiwgMHhiNiwgMHgzNSwgMHgyZCwgMHgwNiwgMHgzMSwgMHg1ZSwgMHg0NywgMHg5ZSwKKwkweGMzLCAweDVkLCAweDU0LCAweDRjLCAweGFlLCAweGJmLCAweDQzLCAweDJhLCAweDBlLCAweDZkLCAweDViLCAweGNhLAorCTB4ZWYsIDB4MjEsIDB4MjksIDB4NjMsIDB4OWUsIDB4OGEsIDB4ZDMsIDB4ZjQsIDB4OGQsIDB4MDUsIDB4NzIsIDB4YjYsCisJMHg2MiwgMHgzZSwgMHg5OCwgMHg3NywgMHhiYSwgMHhiYywgMHgxZiwgMHhlZiwgMHhhOCwgMHg3MywgMHg4MCwgMHg5OSwKKwkweGE2LCAweGY4LCAweDdlLCAweDExLCAweDY1LCAweGZhLCAweDQ2LCAweGU2LCAweGYwLCAweDRjLCAweDg0LCAweDc1LAorCTB4YWYsIDB4ZjUsIDB4NmIsIDB4YWMsIDB4N2UsIDB4ZjIsIDB4NDEsIDB4YmYsIDB4OTksIDB4YjIsIDB4OTUsIDB4Y2YsCisJMHg0NCwgMHhiNiwgMHg5NCwgMHhmMSwgMHg4YiwgMHhmNSwgMHg3ZSwgMHhjYSwgMHhkYywgMHhmZCwgMHgzNiwgMHg3ZiwKKwkweDUxLCAweGY5LCAweDhiLCAweGE5LCAweDdkLCAweDBhLCAweGUxLCAweGI3LCAweDNkLCAweGYyLCAweDk0LCAweGM5LAorCTB4ZGMsIDB4ZjUsIDB4YjQsIDB4MWEsIDB4MmIsIDB4ZmQsIDB4MzQsIDB4Y2MsIDB4ZDMsIDB4ZGQsIDB4NTIsIDB4ZmIsCisJMHgyYiwgMHg2ZiwgMHhmNywgMHgwNywgMHg3OSwgMHhlZSwgMHgxYywgMHg3YiwgMHg2NywgMHg2ZSwgMHhmYiwgMHg0ZSwKKwkweDNhLCAweDYxLCAweDhlLCAweDdiLCAweDNiLCAweDcwLCAweGFiLCAweDU2LCAweDYyLCAweGUwLCAweDQxLCAweGM4LAorCTB4M2IsIDB4YmIsIDB4NDUsIDB4ZjMsIDB4NjMsIDB4YTEsIDB4ZjYsIDB4MmYsIDB4N2YsIDB4NDMsIDB4ZjMsIDB4NzMsCisJMHhkMywgMHhjNywgMHhmMCwgMHhkYiwgMHg3ZSwgMHhkYSwgMHhiNiwgMHg5NCwgMHgxYiwgMHg5NywgMHgwMiwgMHhiZiwKKwkweDkxLCAweGI2LCAweGExLCAweDIxLCAweDJiLCAweDUwLCAweDQ3LCAweDVlLCAweDA1LCAweDlmLCAweDZjLCAweGI3LAorCTB4ZTUsIDB4ZGYsIDB4N2YsIDB4MDEsIDB4OTksIDB4ZTcsIDB4ZDMsIDB4NDYsIDB4NDAsIDB4NjcsIDB4MDAsIDB4MDAsCisJMHgwMCB9Oworc3RhdGljIHUzMiBibngyX1JYUF9iMDlGd0RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA5RndSb2RhdGFbKDB4Mjc4LzQpICsgMV0gPSB7CisJMHgwODAwM2ZhNCwgMHgwODAwM2VhNCwgMHgwODAwM2Y0OCwgMHgwODAwM2Y2MCwgMHgwODAwM2Y3OCwgMHgwODAwM2Y5OCwKKwkweDA4MDAzZmE0LCAweDA4MDAzZmE0LCAweDA4MDAzZWFjLCAweDAwMDAwMDAwLCAweDA4MDA0OWQ0LCAweDA4MDA0YTBjLAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRhNDQsIDB4MDgwMDRjMDgsCisJMHgwODAwNGI1MCwgMHgwODAwNGI4OCwgMHgwODAwNGMwOCwgMHgwODAwNGFkOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0Yjg4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRiYzgsCisJMHgwODAwNGMwOCwgMHgwODAwNGJjOCwgMHgwODAwNGI1MCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGJjOCwKKwkweDA4MDA0YmM4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRhYjQsIDB4MDAwMDAwMDAsIDB4MDgwMDYwMmMsIDB4MDgwMDYwNDQsIDB4MDgwMDYwNDQsIDB4MDgwMDYwNDQsCisJMHgwODAwNjAyYywgMHgwODAwNjA0NCwgMHgwODAwNjA0NCwgMHgwODAwNjA0NCwgMHgwODAwNjAyYywgMHgwODAwNjA0NCwKKwkweDA4MDA2MDQ0LCAweDA4MDA2MDQ0LCAweDA4MDA2MDJjLCAweDA4MDA2MDQ0LCAweDA4MDA2MDQ0LCAweDA4MDA2MDQ0LAorCTB4MDgwMDYwMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA5RndCc3NbKDB4MTNkYy80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA5RndTYnNzWygweDJjLzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9yeHBfZndfMDkgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDMxODQsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAorCS50ZXh0X2xlbgkJCT0gMHg2NzNjLAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfUlhQX2IwOUZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX1JYUF9iMDlGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNjllMCwKKwkuZGF0YV9sZW4JCQk9IDB4MCwKKwkuZGF0YV9pbmRleAkJCT0gMHgwLAorCS5kYXRhCQkJCT0gYm54Ml9SWFBfYjA5RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNjllMCwKKwkuc2Jzc19sZW4JCQk9IDB4MmMsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfUlhQX2IwOUZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwNmExMCwKKwkuYnNzX2xlbgkJCT0gMHgxM2RjLAorCS5ic3NfaW5kZXgJCQk9IDB4MCwKKwkuYnNzCQkJCT0gYm54Ml9SWFBfYjA5RndCc3MsCisKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDY3NDAsCisJLnJvZGF0YV9sZW4JCQk9IDB4Mjc4LAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9SWFBfYjA5RndSb2RhdGEsCit9OworCitzdGF0aWMgdTggYm54Ml9UUEFUX2IwOUZ3VGV4dFtdID0geworCTB4MWYsIDB4OGIsIDB4MDgsIDB4MDgsIDB4ZGIsIDB4ZmQsIDB4MmYsIDB4NDUsIDB4MDAsIDB4MDMsIDB4NzQsIDB4NjUsCisJMHg3MywgMHg3NCwgMHgzMSwgMHgyZSwgMHg2MiwgMHg2OSwgMHg2ZSwgMHgwMCwgMHhjNSwgMHg1OCwgMHg1ZCwgMHg2YywKKwkweDFjLCAweDU3LCAweDE1LCAweDNlLCAweGYzLCAweGJiLCAweDEzLCAweDc3LCAweGVkLCAweGJkLCAweDQ5LCAweDk3LAorCTB4NmEsIDB4MTMsIDB4YjksIDB4NzQsIDB4YzYsIDB4MWUsIDB4M2IsIDB4OGIsIDB4MWMsIDB4MzUsIDB4OTMsIDB4YjAsCisJMHgyNCwgMHgxNiwgMHg1YSwgMHhkMSwgMHhjOSwgMHhjYywgMHhhZSwgMHg2YiwgMHhlNSwgMHgyOSwgMHg4NiwgMHhiYywKKwkweGYxLCAweGIyLCAweGFjLCAweGVkLCAweDQ2LCAweDU0LCAweDQ4LCAweDRkLCAweDUxLCAweDg0LCAweDIyLCAweDgxLAorCTB4OTQsIDB4NjUsIDB4NzYsIDB4NTMsIDB4NDAsIDB4NWEsIDB4NjUsIDB4YzEsIDB4YTAsIDB4MDQsIDB4MjEsIDB4ODQsCisJMHgyMiwgMHg5YiwgMHg2NiwgMHg5MSwgMHg1OCwgMHgzYywgMHg0ZCwgMHhlOSwgMHg2YiwgMHg5NCwgMHhiYywgMHg5MCwKKwkweDk2LCAweDE3LCAweDllLCAweDRiLCAweDllLCAweGFjLCAweDAyLCAweDEyLCAweDBmLCAweGE4LCAweDhhLCAweDc4LAorCTB4NDAsIDB4MTUsIDB4MGQsIDB4MWUsIDB4YmUsIDB4MzMsIDB4M2YsIDB4OWIsIDB4NWQsIDB4ZDcsIDB4MjksIDB4NzksCisJMHhhOCwgMHg4NCwgMHhhNSwgMHhmMSwgMHhjYywgMHhmZCwgMHgzOSwgMHhmNywgMHhlNywgMHg3YywgMHhkZiwgMHg3NywKKwkweGVlLCAweGI5LCAweDViLCAweDkyLCAweDY5LCAweDgyLCAweGQyLCAweGJmLCAweDQ5LCAweDNjLCAweDk3LCAweGJlLAorCTB4NzEsIDB4ZjEsIDB4ZDIsIDB4ZTIsIDB4OGIsIDB4MjcsIDB4NGQsIDB4M2EsIDB4NzEsIDB4ZTIsIDB4NDUsIDB4ZTksCisJMHgxOSwgMHg0MywgMHhhNiwgMHhjZiwgMHhlMCwgMHg0ZiwgMHgyMSwgMHgxMiwgMHhkOSwgMHhmOCwgMHhmYywgMHg5MCwKKwkweDIxLCAweDU3LCAweDZmLCAweDRlLCAweDdiLCAweDM2LCAweDE5LCAweDRhLCAweGQ1LCAweDc5LCAweDYxLCAweGQ1LAorCTB4MjYsIDB4NzIsIDB4MDcsIDB4MGIsIDB4YTYsIDB4NGYsIDB4ZmYsIDB4ODksIDB4NWEsIDB4NDUsIDB4OTUsIDB4YjgsCisJMHhmZSwgMHhmOSwgMHhlYSwgMHhhMywgMHhlMywgMHg3NywgMHg0ZSwgMHg1YiwgMHgwZiwgMHg2ZiwgMHgyYSwgMHg2NCwKKwkweDg4LCAweDZhLCAweGMzLCAweDEwLCAweGYzLCAweDY0LCAweDRjLCAweGMzLCAweGU2LCAweDk3LCAweDQ3LCAweDU3LAorCTB4MzQsIDB4OWEsIDB4Y2EsIDB4YzYsIDB4MTIsIDB4MTQsIDB4ZjQsIDB4MGMsIDB4YWEsIDB4NzcsIDB4MzEsIDB4OGUsCisJMHg3ZCwgMHg1OSwgMHhmMiwgMHg0MywgMHg1NSwgMHhmMiwgMHg2ZiwgMHgxOCwgMHgyNCwgMHg1NywgMHg1ZCwgMHhjOSwKKwkweDBiLCAweDZkLCAweGI0LCAweDQ5LCAweGU0LCAweDM5LCAweDM5LCAweDcyLCAweDQ1LCAweDE0LCAweDdkLCAweGQzLAorCTB4OTEsIDB4NDksIDB4YjYsIDB4NzcsIDB4YTMsIDB4ZDksIDB4YjksIDB4MjUsIDB4YzksIDB4ZWIsIDB4MmYsIDB4NGIsCisJMHg3ZSwgMHhkZiwgMHhlMywgMHg3ZCwgMHg2MywgMHgxZCwgMHg0YiwgMHg5MiwgMHhkYiwgMHhlNywgMHg3NywgMHhkNSwKKwkweGYwLCAweGJiLCAweDUzLCAweGQ0LCAweDI4LCAweDUyLCAweDQxLCAweGI2LCAweGQ5LCAweGQ2LCAweDI0LCAweGRmLAorCTB4NTksIDB4MjgsIDB4MjksIDB4MzQsIDB4OGIsIDB4ZTcsIDB4MDAsIDB4YWQsIDB4M2IsIDB4OTQsIDB4ZjcsIDB4MWMsCisJMHg1MiwgMHgxNSwgMHg1YiwgMHgyNiwgMHhiZiwgMHgyOCwgMHhkMSwgMHhhZiwgMHgyYiwgMHgxYSwgMHg5ZSwgMHhiMywKKwkweDUyLCAweGFkLCAweGJmLCAweDk2LCAweDhlLCAweDUzLCAweGE0LCAweDM2LCAweGQ2LCAweGQyLCAweDJjLCAweGYyLAorCTB4ZGEsIDB4MTIsIDB4N2IsIDB4Y2YsIDB4NTksIDB4MTAsIDB4MzIsIDB4Y2QsIDB4ZTIsIDB4OTksIDB4YzQsIDB4NzcsCisJMHgxMywgMHhmZCwgMHgzNCwgMHhmMiwgMHgyYSwgMHg3YiwgMHhkYiwgMHgwZSwgMHhlMCwgMHgxYiwgMHhlYiwgMHhjNCwKKwkweDU4LCAweDVlLCAweGJjLCAweDBlLCAweDEzLCAweGViLCAweGIwLCAweGE5LCAweGQzLCAweDViLCAweGM2LCAweDNlLAorCTB4ZTYsIDB4NGEsIDB4NGQsIDB4ZDIsIDB4YTksIDB4MTMsIDB4YWYsIDB4N2QsIDB4OTIsIDB4MDIsIDB4YTEsIDB4NTAsCisJMHg3MCwgMHg0YywgMHgyMywgMHhmNywgMHg5YywgMHg4YSwgMHhmMiwgMHgyMSwgMHg2YSwgMHgwOSwgMHgwOSwgMHg3ZCwKKwkweDNhLCAweDI5LCAweDdlLCAweDM5LCAweGI0LCAweGViLCAweGE4LCAweDJmLCAweDUwLCAweDUwLCAweDNjLCAweDI4LAorCTB4YzksIDB4ZDUsIDB4ZWYsIDB4YTEsIDB4N2UsIDB4NGUsIDB4MzQsIDB4ZTksIDB4YmIsIDB4NzgsIDB4NGIsIDB4MjgsCisJMHgxZiwgMHhlNCwgMHhmMSwgMHg1MCwgMHg5NiwgMHg0OCwgMHhiMSwgMHg0OSwgMHg3OCwgMHhhMSwgMHg0OSwgMHhlZCwKKwkweDMwLCAweGIzLCAweGU1LCAweGZhLCAweGE0LCAweGFlLCAweDE1LCAweGVlLCAweGM1LCAweDBlLCAweGZkLCAweDdhLAorCTB4NzUsIDB4NmEsIDB4MDgsIDB4NmEsIDB4YTksIDB4NTUsIDB4ZjQsIDB4ZTksIDB4ZDksIDB4YTIsIDB4MDYsIDB4OWMsCisJMHhkYywgMHgxOCwgMHhjZiwgMHg5NywgMHhiOCwgMHg5ZSwgMHhmZiwgMHg1MCwgMHg2ZiwgMHg5MiwgMHg1MiwgMHhiNSwKKwkweDg1LCAweDRmLCAweDVmLCAweGE2LCAweGE0LCAweDhkLCAweGY3LCAweDI5LCAweDYzLCAweDZmLCAweGE3LCAweGQyLAorCTB4NzIsIDB4NTEsIDB4NzgsIDB4MzcsIDB4YmUsIDB4NDgsIDB4NmUsIDB4ZWMsIDB4MWYsIDB4MDMsIDB4ZGYsIDB4MDIsCisJMHg3YiwgMHhkNCwgMHg4MSwgMHg3NSwgMHhlMCwgMHhjYSwgMHhkNCwgMHgyYSwgMHgxOSwgMHg2NCwgMHgyZCwgMHhhZSwKKwkweGExLCAweGU1LCAweDZmLCAweDVkLCAweDA1LCAweDdlLCAweDY3LCAweGRjLCAweGQ0LCAweGQ0LCAweDhlLCAweDcxLAorCTB4ZmUsIDB4MjMsIDB4ZDYsIDB4ZDksIDB4MTIsIDB4MDYsIDB4ZjAsIDB4NmUsIDB4OWMsIDB4OGYsIDB4YTIsIDB4MzcsCisJMHg5ZCwgMHgyOCwgMHhkMiwgMHhhYiwgMHg3NiwgMHhmOSwgMHgxNiwgMHgyZCwgMHg5NCwgMHgzNCwgMHg5YSwgMHgxNywKKwkweDc4LCAweGMzLCAweDhmLCAweDM2LCAweDdjLCAweGE1LCAweDY1LCAweGViLCAweGM5LCAweDc4LCAweDg2LCAweGJmLAorCTB4Y2IsIDB4MTIsIDB4OTYsIDB4NDIsIDB4MWYsIDB4NzQsIDB4ZGYsIDB4NjMsIDB4N2YsIDB4OTQsIDB4OTcsIDB4NjIsCisJMHg5YiwgMHgyOCwgMHhkYSwgMHg1YywgMHhmYywgMHgzNCwgMHg5YiwgMHhlZiwgMHhhNywgMHgzNiwgMHg1MSwgMHg1NCwKKwkweGFmLCAweGYwLCAweGJjLCAweDE2LCAweGY2LCAweGNjLCAweDVjLCAweDI1LCAweGFhLCAweDBmLCAweDFjLCAweGEzLAorCTB4ZDksIDB4YzUsIDB4ZmEsIDB4NmMsIDB4YmMsIDB4MDcsIDB4MjUsIDB4ZWMsIDB4YzEsIDB4MmEsIDB4OWIsIDB4OTIsCisJMHg0MSwgMHg4MSwgMHgxZCwgMHhiZCwgMHgwMCwgMHg3ZSwgMHhiOCwgMHhiZSwgMHg2ZCwgMHhiZCwgMHhlZiwgMHgyYiwKKwkweDA1LCAweGRhLCAweDcyLCAweGYyLCAweGQ0LCAweDA5LCAweDRiLCAweDE0LCAweDg0LCAweDFkLCAweGYyLCAweDQyLAorCTB4MTksIDB4NzMsIDB4MTQsIDB4NjgsIDB4ZDMsIDB4N2UsIDB4MTgsIDB4ZDUsIDB4MWQsIDB4MDcsIDB4N2UsIDB4MjEsCisJMHhiNiwgMHgyYiwgMHhkNSwgMHg2OSwgMHgxYSwgMHhlZCwgMHgwYiwgMHg2MiwgMHg4ZCwgMHgxYywgMHg2MCwgMHgyMSwKKwkweGMzLCAweDM3LCAweGIzLCAweGYxLCAweDc3LCAweDEwLCAweDNhLCAweDY4LCAweGE3LCAweDk2LCAweDVjLCAweGIxLAorCTB4NDQsIDB4NDAsIDB4NTYsIDB4YzksIDB4NTMsIDB4NDgsIDB4YzgsIDB4NTUsIDB4ODEsIDB4M2UsIDB4MmQsIDB4YWEsCisJMHg4NSwgMHgwNiwgMHhlZCwgMHgyOCwgMHg5NywgMHg2MywgMHg3ZSwgMHhiNywgMHg3YiwgMHgzYiwgMHhkMSwgMHg5ZCwKKwkweGEzLCAweDI1LCAweGJhLCAweDFiLCAweDE2LCAweGU5LCAweDc2LCAweDQ4LCAweDcyLCAweGQzLCAweDAxLCAweDM3LAorCTB4OGEsIDB4ODIsIDB4ZGUsIDB4MGEsIDB4NDcsIDB4ZjcsIDB4ZjIsIDB4MWIsIDB4ZWMsIDB4MjUsIDB4MzgsIDB4YTIsCisJMHg0MCwgMHg4MywgMHhhYiwgMHhjZSwgMHgzZCwgMHgzMCwgMHhjOCwgMHgwMiwgMHg0NiwgMHgyZCwgMHhlYywgMHgzZCwKKwkweDdiLCAweGYzLCAweGJlLCAweDc2LCAweGE2LCAweDU3LCAweDZkLCAweGViLCAweDg3LCAweDNlLCAweGEzLCAweDc2LAorCTB4NGQsIDB4NDMsIDB4ZWQsIDB4NWUsIDB4N2YsIDB4MGMsIDB4MzAsIDB4ODYsIDB4YTAsIDB4YWIsIDB4ZDAsIDB4OTMsCisJMHgwYywgMHhiZiwgMHhjYywgMHg2YywgMHgxYiwgMHhkNCwgMHhlZiwgMHhlNiwgMHhjOCwgMHhkYywgMHg1NCwgMHhhOSwKKwkweGQ5LCAweDJiLCAweDkyLCAweDMzLCAweDZmLCAweDk5LCAweDI0LCAweGNiLCAweDQ1LCAweDk5LCAweDU0LCAweDlhLAorCTB4ZDksIDB4OGMsIDB4NjgsIDB4MDksIDB4ZWIsIDB4YjgsIDB4NmYsIDB4ZmYsIDB4NDgsIDB4YTcsIDB4YTksIDB4YzAsCisJMHhkMSwgMHg4OSwgMHhmYiwgMHgxOCwgMHgzNCwgMHg3MywgMHhjYiwgMHg5MCwgMHhmYywgMHgxZSwgMHhlZiwgMHg4MywKKwkweDdkLCAweDZlLCAweGE0LCAweDNlLCAweDU3LCAweDI1LCAweGVmLCAweDQ2LCAweDhlLCAweDY2LCAweDM3LCAweGZlLAorCTB4MTEsIDB4NzksIDB4MzYsIDB4N2MsIDB4MGQsIDB4OWUsIDB4YWYsIDB4NTYsIDB4YmUsIDB4YTAsIDB4ZDAsIDB4MDQsCisJMHhlYSwgMHgzNiwgMHhiOSwgMHhlZCwgMHg2MSwgMHg1YSwgMHhjZiwgMHg2MywgMHg0NCwgMHg5MSwgMHhlNywgMHgzYywKKwkweDRiLCAweDFlLCAweGYzLCAweGZmLCAweDNjLCAweGRiLCAweGU0LCAweDY4LCAweDY2LCAweDgzLCAweDc1LCAweDgzLAorCTB4ZjcsIDB4MjYsIDB4OTcsIDB4NzksIDB4NmQsIDB4MDcsIDB4YTgsIDB4ODksIDB4MWQsIDB4MzUsIDB4Y2IsIDB4NDUsCisJMHhmOCwgMHg0MSwgMHg4ZSwgMHgzNSwgMHhkMiwgMHhjNCwgMHg4ZSwgMHg2NSwgMHg3YiwgMHgwMiwgMHg2ZiwgMHg5ZSwKKwkweGVmLCAweGFjLCAweDkyLCAweGYwLCAweDlkLCAweGUzLCAweDQ2LCAweDllLCAweDdjLCAweGUwLCAweGFiLCAweDYyLAorCTB4M2QsIDB4NmIsIDB4MzQsIDB4NTcsIDB4NWEsIDB4OGYsIDB4ZGIsIDB4NTAsIDB4MzcsIDB4ZTAsIDB4MzYsIDB4YjEsCisJMHhhNywgMHgwZCwgMHhlNSwgMHg0MSwgMHhiNiwgMHgwNiwgMHg3MCwgMHhkYSwgMHg2ZSwgMHg2MywgMHgxNiwgMHgyZCwKKwkweGRlLCAweDZiLCAweGRkLCAweGUxLCAweGZlLCAweGRjLCAweGI3LCAweDU1LCAweGQ2LCAweGM4LCAweDJhLCAweDZmLAorCTB4NjIsIDB4ZjQsIDB4N2UsIDB4MTcsIDB4ZmIsIDB4YmQsIDB4Y2UsIDB4YjEsIDB4YzgsIDB4MzYsIDB4ZmYsIDB4NGEsCisJMHhkYywgMHg3ZiwgMHgxNiwgMHg3YiwgMHg5ZSwgMHg1YiwgMHg2YywgMHg3MywgMHhkYiwgMHg0MCwgMHgyMywgMHg3YiwKKwkweGEzLCAweDI1LCAweDU0LCAweGY4LCAweDVmLCAweDg2LCAweGYzLCAweGZkLCAweDFmLCAweGZmLCAweDJiLCAweGQyLAorCTB4YWEsIDB4ZTAsIDB4NzQsIDB4YTUsIDB4MDAsIDB4N2MsIDB4MmMsIDB4YjMsIDB4MGQsIDB4YmQsIDB4ZGIsIDB4MTgsCisJMHgzNywgMHg3MCwgMHgxNCwgMHhkOCwgMHgyNSwgMHgzOCwgMHg3MSwgMHhiZiwgMHhhNSwgMHg2ZSwgMHg0NCwgMHhlZCwKKwkweDc4LCAweGFlLCAweDJiLCAweDNjLCAweDE3LCAweDYyLCAweDkyLCAweGJkLCAweGY4LCAweDA3LCAweDcwLCAweGEzLAorCTB4NDksIDB4NzksIDB4OWEsIDB4ZGYsIDB4Y2UsIDB4ZDMsIDB4ODUsIDB4NDEsIDB4OWUsIDB4NjYsIDB4YWUsIDB4ZTksCisJMHhmMCwgMHg0MywgMHgxNCwgMHg3NSwgMHgyYSwgMHhhYywgMHg1MSwgMHhlMCwgMHg2ZCwgMHg3MywgMHgzZiwgMHhhYiwKKwkweGE0LCAweGM4LCAweGJjLCAweDBlLCAweGI0LCAweDZmLCAweDEzLCAweGFkLCAweDBkLCAweDc0LCAweGY4LCAweDRkLAorCTB4MWQsIDB4MTksIDB4NWIsIDB4YTYsIDB4OTcsIDB4N2YsIDB4NDYsIDB4ZjQsIDB4ZjIsIDB4ODAsIDB4NmQsIDB4NzksCisJMHhmYywgMHhjNCwgMHhhNiwgMHg4OSwgMHgzZCwgMHhjYiwgMHhjMCwgMHhmYywgMHhjMiwgMHg0MCwgMHg0NiwgMHhiYywKKwkweDQwLCAweDNjLCAweGVkLCAweDdiLCAweDg4LCAweDkzLCAweDM1LCAweDNjLCAweDRiLCAweDg4LCAweDlkLCAweDhjLAorCTB4MGQsIDB4YzcsIDB4OTEsIDB4NWQsIDB4ZTAsIDB4YjMsIDB4OGMsIDB4YjYsIDB4YjMsIDB4YTgsIDB4NGIsIDB4ZjQsCisJMHhhZSwgMHhkOCwgMHgzYSwgMHhkNSwgMHg5YywgMHg0OSwgMHg2YSwgMHg2NywgMHhiMSwgMHg0YSwgMHg3MCwgMHhhYywKKwkweDNhLCAweDA4LCAweDRlLCAweDFkLCAweDQwLCAweGZjLCAweGY5LCAweDlkLCAweDMyLCAweDFlLCAweGFiLCAweDEwLAorCTB4ZDMsIDB4OGEsIDB4ODcsIDB4MTEsIDB4OWIsIDB4ZmEsIDB4YTgsIDB4ZTcsIDB4ZjEsIDB4NmUsIDB4ZTEsIDB4N2QsCisJMHgwMCwgMHhlNSwgMHhjMywgMHhlOCwgMHgzYiwgMHgxYSwgMHhhNywgMHgzMiwgMHhiYiwgMHgyNywgMHhjNSwgMHgyOCwKKwkweGYwLCAweDZlLCAweGMzLCAweDQwLCAweDdmLCAweDEzLCAweGJhLCAweDYxLCAweDdmLCAweGU3LCAweDEwLCAweDNmLAorCTB4ZDgsIDB4ZTcsIDB4MzksIDB4ZjgsIDB4NTQsIDB4YzcsIDB4ZGMsIDB4ODIsIDB4NjYsIDB4YjcsIDB4YTksIDB4YTUsCisJMHhhNCwgMHhmMSwgMHhjYiwgMHgxZiwgMHhjNiwgMHhhZiwgMHg1MiwgMHhjYywgMHg4MywgMHgyMCwgMHgxNCwgMHhiMCwKKwkweDYxLCAweGZkLCAweDY2LCAweDdhLCAweDY1LCAweGVjLCAweGM4LCAweGY1LCAweGEwLCAweDY1LCAweDRmLCAweDg5LAorCTB4YTIsIDB4NTUsIDB4YTcsIDB4NDAsIDB4NGQsIDB4ZTAsIDB4ZWUsIDB4NDIsIDB4YzMsIDB4NGQsIDB4NjgsIDB4ZDgsCisJMHgxZiwgMHhkMSwgMHhiMCwgMHhmZiwgMHgzZiwgMHgzNSwgMHgwYywgMHg3ZCwgMHg0MiwgMHgyMywgMHhiNywgMHhjMSwKKwkweGE5LCAweGI3LCAweDdhLCAweGZiLCAweGU5LCAweDk5LCAweGI1LCAweGNjLCAweDlhLCAweDM2LCAweGU5LCAweGNlLAorCTB4ZDEsIDB4YTcsIDB4ZDUsIDB4NzQsIDB4NDksIDB4N2UsIDB4NGEsIDB4NGQsIDB4YjcsIDB4NTgsIDB4ZDMsIDB4MmEsCisJMHg2YiwgMHhiYSwgMHhiOCwgMHg1NywgMHhkMywgMHhkMywgMHgxOCwgMHgyMywgMHhkMSwgMHhlNiwgMHgxOSwgMHhiNSwKKwkweDQ4LCAweGRhLCAweDNjLCAweGYwLCAweGQ4LCAweGM4LCAweDkzLCAweDcyLCAweGVkLCAweDMxLCAweGVmLCAweDk4LAorCTB4Y2IsIDB4ZmUsIDB4MDAsIDB4ZmYsIDB4YjYsIDB4MzUsIDB4YjQsIDB4NDksIDB4ZTMsIDB4ZjUsIDB4ODgsIDB4ODEsCisJMHg2YSwgMHhkNSwgMHgyYSwgMHhhZCwgMHhjNSwgMHg3ZCwgMHg1NCwgMHhkMiwgMHhlMSwgMHhmZiwgMHhkNywgMHg4ZiwKKwkweDVhLCAweGE2LCAweDI5LCAweDhmLCAweDZhLCAweDFmLCAweGVhLCAweGRmLCAweDg4LCAweGFlLCAweDY4LCAweDU1LAorCTB4OWUsIDB4YTcsIDB4NjUsIDB4ODIsIDB4ZjMsIDB4ZTYsIDB4NGYsIDB4ODAsIDB4NTUsIDB4YmIsIDB4Y2IsIDB4N2MsCisJMHhiNywgMHg0NSwgMHgzZCwgMHhlNiwgMHgxOSwgMHhjYSwgMHhkMCwgMHg4NCwgMHgwNiwgMHhkZSwgMHhlNiwgMHhkMCwKKwkweDRmLCAweGRkLCAweDQ4LCAweDc0LCAweDc0LCAweDFiLCAweGUzLCAweDZlLCAweDc1LCAweDk5LCAweDY3LCAweDA2LAorCTB4ZTksIDB4ZDcsIDB4ZWQsIDB4ZDIsIDB4ODUsIDB4MzgsIDB4MDYsIDB4Y2YsIDB4OGEsIDB4MjUsIDB4NjIsIDB4MGQsCisJMHhmMiwgMHhiOSwgMHg4OCwgMHhmNiwgMHg0MSwgMHg4ZSwgMHg5NCwgMHg1OCwgMHhmNywgMHgxMywgMHhhOSwgMHhlZSwKKwkweDlmLCAweDg3LCAweGFmLCAweDI2LCAweDUwLCAweDY2LCAweGVkLCAweDFmLCAweDRlLCAweGI1LCAweDNmLCAweDg1LAorCTB4MzcsIDB4ZDcsIDB4YWQsIDB4YTgsIDB4MDksIDB4ODcsIDB4YzAsIDB4YzcsIDB4MGQsIDB4YzYsIDB4MzcsIDB4OGYsCisJMHg1OCwgMHhjNywgMHhmMywgMHhmZiwgMHgzMywgMHg1YSwgMHhiNSwgMHgxOSwgMHg2MywgMHhkYiwgMHhmYywgMHgwMSwKKwkweGNkLCAweDQxLCAweDdmLCAweGE4LCAweGRmLCAweGU2LCAweGJlLCAweDZjLCAweDkzLCAweGY1LCAweDE1LCAweDY5LAorCTB4ZGYsIDB4MGYsIDB4ZjcsIDB4ZjQsIDB4NDUsIDB4ZmQsIDB4MzYsIDB4ZjcsIDB4NjMsIDB4N2QsIDB4MWMsIDB4MjIsCisJMHhlNSwgMHgzYSwgMHg5ZiwgMHhkYiwgMHgxZSwgMHhlYiwgMHgwMywgMHg3NiwgMHgzNSwgMHhkNCwgMHg3MSwgMHg2ZSwKKwkweGMxLCAweGY2LCAweDdjLCAweDg2LCAweGYzLCAweDNhLCAweDM5LCAweGVmLCAweGUwLCAweDczLCAweDdlLCAweGNmLAorCTB4NzksIDB4M2UsIDB4ZDQsIDB4YzgsIDB4MTksIDB4ZjAsIDB4ZmUsIDB4M2IsIDB4ZWEsIDB4MjcsIDB4MzUsIDB4YjIsCisJMHgwMiwgMHg0ZCwgMHg1YywgMHg1NCwgMHgxMywgMHg4ZCwgMHhiYywgMHg4NiwgMHhmNywgMHgxOSwgMHg5NCwgMHg1NywKKwkweGY2LCAweDY4LCAweDI0LCAweGIzLCAweDdiLCAweGYyLCAweDM5LCAweDFlLCAweGY0LCAweDRhLCAweGYxLCAweDk5LAorCTB4Y2IsIDB4ZjMsIDB4MjksIDB4MWIsIDB4ZDQsIDB4ZDIsIDB4NTIsIDB4M2QsIDB4ZDQsIDB4ODcsIDB4N2EsIDB4OTgsCisJMHg0MCwgMHhjYywgMHhjOCwgMHhhNSwgMHg1YywgMHhjNywgMHhkYiwgMHhmZSwgMHg0OCwgMHhmMSwgMHgxZCwgMHg0YiwKKwkweGI0LCAweDg5LCAweGI1LCAweDMxLCAweDdhLCAweDllLCAweGZkLCAweGJmLCAweGY0LCAweDQxLCAweGUwLCAweDUxLAorCTB4M2MsIDB4MzcsIDB4NzIsIDB4MTEsIDB4M2UsIDB4MTcsIDB4YTIsIDB4ZTgsIDB4MTUsIDB4MDcsIDB4ZWQsIDB4NTksCisJMHg0ZSwgMHgxMiwgMHg2MywgMHg5ZiwgMHhjMywgMHhkOSwgMHhjYiwgMHg3OCwgMHgyMCwgMHgwZiwgMHhiNCwgMHg2NywKKwkweGExLCAweDA3LCAweDhlLCAweDA1LCAweGJiLCAweGQxLCAweDk2LCAweGVkLCAweGExLCAweGFlLCAweDA2LCAweGZmLAorCTB4MzMsIDB4MjYsIDB4Y2IsIDB4ZDIsIDB4NTIsIDB4ZGYsIDB4NjAsIDB4M2IsIDB4ZTgsIDB4NmQsIDB4YmYsIDB4NWMsCisJMHg0YywgMHg4NywgMHhhZSwgMHgxZSwgMHhlMywgMHhjNCwgMHgzYywgMHg2YSwgMHg4ZSwgMHhlMCwgMHhkNCwgMHg4OCwKKwkweDcxLCAweGRhLCAweDE5LCAweGUyLCAweGQ0LCAweDRjLCAweDcxLCAweDZhLCAweGM2LCAweDM4LCAweDNkLCAweDQ4LAorCTB4NzEsIDB4ZmEsIDB4ZjMsIDB4MTMsIDB4NzAsIDB4ZGEsIDB4NzksIDB4MGEsIDB4OWMsIDB4MGMsIDB4ZGEsIDB4YjIsCisJMHg0YiwgMHgzOCwgMHg2ZiwgMHhmNSwgMHgzOCwgMHg3NywgMHhiZCwgMHhlZiwgMHhlYywgMHg5NywgMHg3YiwgMHhiMSwKKwkweGRmLCAweGM3LCAweGIwLCAweDhhLCAweDE4LCAweGFiLCAweDJkLCAweDFhLCAweGNkLCAweDQzLCAweDJjLCAweGYzLAorCTB4MWUsIDB4MTUsIDB4NzAsIDB4NmUsIDB4ZTQsIDB4ZTksIDB4ZWEsIDB4OWUsIDB4NWMsIDB4MjQsIDB4MDAsIDB4NGUsCisJMHhiNSwgMHgxNCwgMHhhNywgMHhhYiwgMHhjMCwgMHhhOSwgMHg5NiwgMHhlMiwgMHhiNCwgMHgzZSwgMHg4MiwgMHhkMywKKwkweGZhLCAweDE4LCAweDRlLCAweDFjLCAweDUzLCAweDJhLCAweGM2LCAweDdhLCAweDM3LCAweGMzLCAweDI4LCAweGMzLAorCTB4NDcsIDB4YTcsIDB4OWIsIDB4NjIsIDB4MGEsIDB4ZmIsIDB4M2YsIDB4NGUsIDB4ZWQsIDB4OWYsIDB4YWEsIDB4OWMsCisJMHhmZiwgMHgwMiwgMHhiYiwgMHg5NywgMHg1NCwgMHgzOSwgMHgzZSwgMHgxNywgMHhmOCwgMHhmYiwgMHg3MSwgMHhiZSwKKwkweDgyLCAweGI5LCAweDVjLCAweGNmLCAweGUxLCAweDNkLCAweDIxLCAweGNmLCAweGI1LCAweDQ3LCAweDYzLCAweGQxLAorCTB4MDcsIDB4ODgsIDB4NDUsIDB4NWMsIDB4YzcsIDB4ZmQsIDB4NTQsIDB4YTksIDB4MDYsIDB4Y2QsIDB4MmIsIDB4YzgsCisJMHhlMSwgMHhmZCwgMHg2MSwgMHgwZSwgMHg5ZiwgMHhmOCwgMHhlMSwgMHg2YSwgMHg5YSwgMHhjMywgMHg2ZiwgMHhkOSwKKwkweDljLCAweGMzLCAweDlmLCAweGQwLCAweDY4LCAweDYyLCAweDM5LCAweGM1LCAweDkzLCAweDc5LCAweDNkLCAweDg5LAorCTB4YjYsIDB4YjMsIDB4MzEsIDB4ZWUsIDB4NmQsIDB4YzQsIDB4ZjIsIDB4NTUsIDB4ZjgsIDB4YTAsIDB4MTksIDB4ZjMsCisJMHgxMywgMHg3OSwgMHg1NywgMHhjYSwgMHg1ZCwgMHhlNCwgMHhiYiwgMHhlNCwgMHg4NywgMHgwOSwgMHg0ZiwgMHgzZiwKKwkweGRiLCAweDVjLCAweGVjLCAweGVmLCAweDg4LCAweGQ5LCAweDQ2LCAweDQzLCAweGM1LCAweDFkLCAweGUwLCAweDZlLAorCTB4MTgsIDB4YzcsIDB4ZWEsIDB4NzMsIDB4NDEsIDB4OTcsIDB4NWEsIDB4NDcsIDB4YWEsIDB4NTcsIDB4MjIsIDB4ZTAsCisJMHhlZSwgMHg3ZSwgMHhmZCwgMHgzNCwgMHg5ZiwgMHgzOSwgMHhmOSwgMHg0NSwgMHhhZiwgMHg4MiwgMHhmYSwgMHg4MSwKKwkweDQxLCAweGM4LCAweDgzLCAweDcwLCAweGE3LCAweGExLCAweDk2LCAweDc3LCAweDVhLCAweDQyLCAweGJlLCAweDgzLAorCTB4MzIsIDB4NmMsIDB4ODIsIDB4NzAsIDB4YmEsIDB4MjEsIDB4NTcsIDB4NGIsIDB4ZTAsIDB4NDMsIDB4OGIsIDB4NWMsCisJMHhhYywgMHhkMywgMHgwZCwgMHhlMywgMHg3YiwgMHg0ZCwgMHg0MywgMHhhOSwgMHgxYSwgMHhjOCwgMHgzNywgMHhjOSwKKwkweGMwLCAweDk5LCAweDBmLCAweDlmLCAweDk4LCAweDQ2LCAweDdiLCAweDgwLCAweDljLCAweDA4LCAweDc5LCAweDgwLAorCTB4YjcsIDB4MDgsIDB4YmYsIDB4MWMsIDB4MDMsIDB4NzYsIDB4YTEsIDB4MGEsIDB4ZGIsIDB4NmYsIDB4ZTksIDB4YzksCisJMHg5ZCwgMHg4OCwgMHhjOCwgMHg4YiwgMHhmZCwgMHhmNSwgMHg3MSwgMHhjYSwgMHg5MSwgMHgzOCwgMHhlNywgMHg5MiwKKwkweDZhLCAweDNkLCAweDMyLCAweDliLCAweDBlLCAweGI4LCAweDhlLCAweDMzLCAweGE1LCAweDEzLCAweDcyLCAweDVlLAorCTB4N2QsIDB4Y2MsIDB4OTAsIDB4YWYsIDB4NzEsIDB4M2MsIDB4N2YsIDB4MDAsIDB4MWYsIDB4ZTIsIDB4N2IsIDB4OWIsCisJMHhjZiwgMHgxOSwgMHg4NSwgMHg3MywgMHg3MywgMHhkYywgMHg3ZCwgMHhjYSwgMHg4OCwgMHgzNywgMHgzNCwgMHg4OSwKKwkweGQ4LCAweDg3LCAweGQ4LCAweDNiLCAweGNkLCAweDU4LCAweGI5LCAweGM5LCAweDE5LCAweGM0LCAweGUzLCAweDFkLAorCTB4OTcsIDB4OTMsIDB4NzksIDB4ZmUsIDB4YTQsIDB4MjUsIDB4MWMsIDB4YzYsIDB4N2QsIDB4MDcsIDB4ZmUsIDB4NWIsCisJMHhlZCwgMHgzOSwgMHgxYywgMHg3MywgMHgzZiwgMHhhZiwgMHhkMCwgMHg0MywgMHg4YSwgMHgzOSwgMHgyOSwgMHg0ZSwKKwkweDIwLCAweDE2LCAweDlmLCAweDg2LCAweDhkLCAweDFiLCAweGViLCAweDMxLCAweGM5LCAweGJkLCAweDMyLCAweDliLAorCTB4MGYsIDB4ZjcsIDB4OGMsIDB4ZjEsIDB4MTcsIDB4NjUsIDB4YmMsIDB4ZWMsIDB4ODIsIDB4ZDMsIDB4OTUsIDB4NzQsCisJMHhiZSwgMHg1MSwgMHg4ZSwgMHgyYywgMHgyMCwgMHhlNSwgMHg3OSwgMHhhMCwgMHgwZCwgMHhmMywgMHhiNywgMHhhMiwKKwkweDhlLCAweDdlLCAweGJjLCAweDQ2LCAweGQ2LCAweDI1LCAweGRiLCAweDFjLCAweGQxLCAweGM2LCAweGM3LCAweDk5LAorCTB4ZGQsIDB4NjcsIDB4OGMsIDB4ZWEsIDB4YzgsIDB4MTgsIDB4NDUsIDB4ZGUsIDB4OWIsIDB4NjgsIDB4M2EsIDB4Y2YsCisJMHhhNCwgMHhmNywgMHgwYywgMHg4ZSwgMHgyZCwgMHgwMiwgMHgzYSwgMHg5NSwgMHg5ZiwgMHg5MywgMHhiMSwgMHgwZiwKKwkweDBmLCAweDdiLCAweGY2LCAweGUzLCAweGZhLCAweDVmLCAweGU5LCAweGUzLCAweGUzLCAweGZlLCAweDU2LCAweDRkLAorCTB4Y2EsIDB4YzcsIDB4MTIsIDB4NmUsIDB4ZGEsIDB4NzgsIDB4ODcsIDB4MGYsIDB4NDYsIDB4ZDYsIDB4YWUsIDB4ZWQsCisJMHgzMywgMHhlZiwgMHhkNywgMHgzOCwgMHg1ZCwgMHg0MywgMHhiYywgMHgyMSwgMHg1NywgMHhjMSwgMHgxZCwgMHhjYywKKwkweDI3LCAweDdjLCAweDg3LCAweGFmLCAweDY3LCAweDNlLCAweDA0LCAweDZmLCAweGU4LCAweDVjLCAweDNiLCAweGU1LAorCTB4OGIsIDB4OWMsIDB4ZjAsIDB4ODUsIDB4ZjMsIDB4YmEsIDB4YzUsIDB4NTUsIDB4ZjAsIDB4YTUsIDB4MGQsIDB4YmUsCisJMHhjMCwgMHhhZSwgMHhhMSwgMHg1NSwgMHhhNywgMHhjMSwgMHgwNSwgMHg4ZSwgMHg0ZCwgMHgyOCwgMHg4NywgMHhjYywKKwkweDFkLCAweGU2LCAweDBhLCAweGYzLCAweGU2LCAweDMxLCAweDVmLCAweDVlLCAweGU5LCAweDFhLCAweGM2LCAweGU2LAorCTB4YTcsIDB4NzAsIDB4ZTUsIDB4OGQsIDB4OTgsIDB4MmIsIDB4Y2MsIDB4ZDksIDB4MjQsIDB4N2UsIDB4NzQsIDB4ODAsCisJMHg1NSwgMHg5MCwgMHhjNiwgMHg4ZiwgMHgwMCwgMHhmMSwgMHhhMywgMHhjNiwgMHhmOSwgMHg0ZiwgMHgxYywgMHgwYiwKKwkweDEyLCAweGZkLCAweGFjLCAweDQxLCAweDNmLCAweDM1LCAweDg1LCAweGYzLCAweDIzLCAweGQ2LCAweDBlLCAweGRiLAorCTB4YjEsIDB4N2UsIDB4ZDgsIDB4YWUsIDB4OTAsIDB4ZGEsIDB4OGQsIDB4YzcsIDB4OTEsIDB4NzYsIDB4Y2YsIDB4MzIsCisJMHhiMywgMHgzOCwgMHhkMiwgMHg4NiwgMHg3NiwgMHgzYSwgMHhhOSwgMHg4ZSwgMHhkYSwgMHhhOSwgMHg4ZSwgMHhkMCwKKwkweGE3LCAweGE1LCAweDU0LCAweGY4LCAweDRjLCAweGIwLCAweDRjLCAweDFmLCAweGYxLCAweGEzLCAweDEzLCAweDhmLAorCTB4ZDksIDB4YTIsIDB4ZTQsIDB4MmUsIDB4YzMsIDB4ZGEsIDB4ZTYsIDB4YjgsIDB4M2IsIDB4MTIsIDB4NmYsIDB4ZDMsCisJMHg3YiwgMHg2ZSwgMHgyMywgMHhiZSwgMHhlNywgMHg3ZSwgMHg0NSwgMHgxZiwgMHg4ZiwgMHhiNywgMHgzOCwgMHg2YiwKKwkweGUyLCAweDdiLCAweGVlLCAweDI5LCAweDlkLCAweGVmLCAweGI5LCAweDAxLCAweDdkLCAweDQ5LCAweDFmLCAweGJkLAorCTB4ZTcsIDB4MDYsIDB4NjMsIDB4ZjcsIDB4ZGMsIDB4Y2MsIDB4OTYsIDB4ZWIsIDB4ZjcsIDB4OGIsIDB4YmIsIDB4OTksCisJMHg0ZiwgMHgzOCwgMHhmNiwgMHgzMiwgMHg5ZiwgMHhmNiwgMHhjYiwgMHgxNSwgMHhiMywgMHgzZSwgMHgxYywgMHg5MywKKwkweDU4LCAweGVmLCAweDFjLCAweGNiLCAweDkyLCAweGRjLCAweGVjLCAweDZlLCAweDk4LCAweGU5LCAweGUyLCAweDU1LAorCTB4Y2MsIDB4ODMsIDB4NzIsIDB4NmYsIDB4M2YsIDB4NWQsIDB4MTgsIDB4YTksIDB4MmUsIDB4MjYsIDB4MTMsIDB4OWIsCisJMHhkZSwgMHhhOCwgMHgzNiwgMHg1ZSwgMHhkNSwgMHhjNywgMHhiNSwgMHg5MSwgMHg4ZCwgMHg5MywgMHg2OSwgMHgyMywKKwkweDE5LCAweDczLCAweDQ3LCAweDI5LCAweGUxLCAweDBjLCAweDJjLCAweDIzLCAweDFlLCAweDA5LCAweGJlLCAweGEzLAorCTB4MjEsIDB4NWUsIDB4NTQsIDB4ZjMsIDB4YjgsIDB4YTcsIDB4MTQsIDB4NzgsIDB4ZWMsIDB4NzYsIDB4ZjgsIDB4MmMsCisJMHgzNSwgMHg4YSwgMHg4YywgMHgwYiwgMHhhZiwgMHhmZiwgMHg2MSwgMHg3YywgMHg3ZiwgMHhjMCwgMHhiYSwgMHgwYiwKKwkweDAxLCAweGZmLCAweGZlLCAweGYxLCAweDA5LCAweDNlLCAweGJlLCAweDA2LCAweDNlLCAweDY2LCAweGZiLCAweDE5LAorCTB4YWQsIDB4YmYsIDB4MzQsIDB4NTIsIDB4NWYsIDB4NGUsIDB4MzEsIDB4NGYsIDB4N2MsIDB4N2UsIDB4MmYsIDB4ZDUsCisJMHhjOCwgMHgyNiwgMHg3MiwgMHhiNywgMHhmYiwgMHhjOCwgMHg4YiwgMHhkZSwgMHg0NCwgMHhmYywgMHgwZSwgMHgwNiwKKwkweDFmLCAweDQ3LCAweGY3LCAweDhhLCAweDJhLCAweDc1LCAweDg2LCAweDM2LCAweGJmLCAweGMwLCAweGJhLCAweDJkLAorCTB4NzEsIDB4MTMsIDB4NWYsIDB4NmYsIDB4MGMsIDB4YjIsIDB4YjEsIDB4YjksIDB4OWQsIDB4ZWIsIDB4ZmUsIDB4OGQsCisJMHhmMywgMHgxOSwgMHg3OSwgMHhkZiwgMHhiMCwgMHhlZiwgMHhmYiwgMHgxMSwgMHhlNywgMHhiYiwgMHg3NywgMHg4MSwKKwkweGM1LCAweDNiLCAweGUxLCAweDM0LCAweGZkLCAweDFlLCAweDFjLCAweDdiLCAweDNiLCAweGNlLCAweDc5LCAweDkzLAorCTB4NWMsIDB4MTcsIDB4ZmUsIDB4YzMsIDB4OTksIDB4YzcsIDB4NjcsIDB4YmQsIDB4ZjcsIDB4MzksIDB4OTksIDB4MmUsCisJMHhkMywgMHg1NywgMHgxZCwgMHhhZSwgMHg5MywgMHhhOSwgMHg3ZSwgMHgyYSwgMHg4YSwgMHgyZSwgMHhlMiwgMHhkYywKKwkweDVmLCAweDE5LCAweDNiLCAweGY3LCAweDcxLCAweDA3LCAweDNjLCAweGM5LCAweGY5LCAweDdmLCAweDk2LCAweGYzLAorCTB4ZWYsIDB4NDYsIDB4MzMsIDB4ZjMsIDB4ZDYsIDB4NGQsIDB4OTcsIDB4NWMsIDB4YTksIDB4ZGUsIDB4ZTcsIDB4N2MsCisJMHg2YywgMHg5OCwgMHg4YiwgMHgxMSwgMHgxZCwgMHg3YSwgMHgxNCwgMHhjOSwgMHhmMywgMHg3YywgMHgzNiwgMHhiZCwKKwkweDliLCAweGZhLCAweDFjLCAweDZkLCAweDM3LCAweDFlLCAweGUxLCAweDFlLCAweDUzLCAweDhiLCAweDdmLCAweDE3LAorCTB4NzIsIDB4ZmIsIDB4M2MsIDB4MGYsIDB4OTcsIDB4ZjEsIDB4MGUsIDB4MzksIDB4NDcsIDB4NzgsIDB4ZDIsIDB4NmYsCisJMHgzNSwgMHgyYSwgMHhmMCwgMHhiNSwgMHhjYywgMHg3NSwgMHg4NSwgMHhlMiwgMHg3YiwgMHgyMSwgMHhlZSwgMHg2ZSwKKwkweDNmLCAweDZmLCAweDUzLCAweDEyLCAweDNiLCAweDZhLCAweGNlLCAweDM5LCAweGFjLCAweDA1LCAweDk4LCAweDg4LAorCTB4MDYsIDB4MzAsIDB4OWUsIDB4NDcsIDB4YWMsIDB4YjIsIDB4Y2MsIDB4OTMsIDB4NzIsIDB4ZjIsIDB4NWIsIDB4ZDUsCisJMHgxYSwgMHhjNiwgMHg1NiwgMHg0ZSwgMHg3MiwgMHgyZSwgMHhmOSwgMHg1MSwgMHhiNCwgMHgzNiwgMHg4OCwgMHhjZiwKKwkweDQ0LCAweDg3LCAweGI5LCAweGU2LCAweDg3LCAweDA3LCAweDY1LCAweDdlLCAweGJiLCAweDIxLCAweDdmLCAweGViLAorCTB4OTgsIDB4YzcsIDB4N2MsIDB4MDIsIDB4MGYsIDB4OGIsIDB4YTIsIDB4NzYsIDB4YzMsIDB4MTQsIDB4ZjUsIDB4OWUsCisJMHgyOSwgMHg5NiwgMHg3YSwgMHgzMiwgMHg1NCwgMHg1MiwgMHhjOCwgMHhkMSwgMHgxNCwgMHhlNywgMHgwOCwgMHgzYSwKKwkweGQxLCAweDczLCAweDU4LCAweGNiLCAweDJkLCAweDUzLCAweGY4LCAweGM4LCAweGEzLCAweGJlLCAweGFkLCAweDU4LAorCTB4NjIsIDB4ODUsIDB4NzYsIDB4YjEsIDB4YzcsIDB4NDcsIDB4NTEsIDB4NzIsIDB4YTcsIDB4MzUsIDB4NDUsIDB4NmQsCisJMHgzOCwgMHhmNywgMHgyMywgMHhjYywgMHhjZCwgMHg2YiwgMHg2MiwgMHgyZCwgMHhmMywgMHg3OSwgMHhiNiwgMHgyYywKKwkweDlkLCAweDgzLCAweDhmLCAweGNlLCAweGY3LCAweDc3LCAweDExLCAweDQzLCAweGY5LCAweDNjLCAweGNiLCAweDIzLAorCTB4ZTYsIDB4NTksIDB4MjYsIDB4NWYsIDB4ZjYsIDB4ZWYsIDB4NjIsIDB4ZmYsIDB4ZWYsIDB4ZjQsIDB4ODAsIDB4MGYsCisJMHg3MiwgMHhjNywgMHhiNywgMHg4NywgMHg3OSwgMHgxYSwgMHg2MywgMHg1OCwgMHgwNiwgMHgxNywgMHhkOSwgMHgzZSwKKwkweDhhLCAweDgyLCAweGM1LCAweDM4LCAweDQ3LCAweGMxLCAweDVhLCAweGU2LCAweGNhLCAweGI3LCAweDkwLCAweGE3LAorCTB4ZDcsIDB4NjksIDB4YTEsIDB4NWMsIDB4OGYsIDB4ZGYsIDB4MTEsIDB4NzIsIDB4MTIsIDB4ZmUsIDB4NWQsIDB4YzAsCisJMHgxMiwgMHg0ZCwgMHg3YywgMHhkNywgMHhkMiwgMHhlZiwgMHg4MCwgMHg3MywgMHhmOCwgMHg0NSwgMHgxZSwgMHg4MywKKwkweDczLCAweDc5LCAweGQ2LCAweGUxLCAweDdmLCAweDAxLCAweDE3LCAweGM2LCAweGYxLCAweGIyLCAweDg0LCAweDE0LAorCTB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwOUZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX1RQQVRfYjA5RndSb2RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwOUZ3QnNzWygweDI1MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwOUZ3U2Jzc1soMHgzNC80KSArIDFdID0geyAweDAgfTsKKworc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfdHBhdF9md18wOSA9IHsKKwkudmVyX21ham9yCQkJPSAweDEsCisJLnZlcl9taW5vcgkJCT0gMHgwLAorCS52ZXJfZml4CQkJPSAweDAsCisKKwkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDg2MCwKKworCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDA4MDAsCisJLnRleHRfbGVuCQkJPSAweDE0ODAsCisJLnRleHRfaW5kZXgJCQk9IDB4MCwKKwkuZ3pfdGV4dAkJCT0gYm54Ml9UUEFUX2IwOUZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX1RQQVRfYjA5RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDFjYTAsCisJLmRhdGFfbGVuCQkJPSAweDAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfVFBBVF9iMDlGd0RhdGEsCisKKwkuc2Jzc19hZGRyCQkJPSAweDA4MDAxY2EwLAorCS5zYnNzX2xlbgkJCT0gMHgzNCwKKwkuc2Jzc19pbmRleAkJCT0gMHgwLAorCS5zYnNzCQkJCT0gYm54Ml9UUEFUX2IwOUZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwMWNlMCwKKwkuYnNzX2xlbgkJCT0gMHgyNTAsCisJLmJzc19pbmRleAkJCT0gMHgwLAorCS5ic3MJCQkJPSBibngyX1RQQVRfYjA5RndCc3MsCisKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDAwMDAwMDAsCisJLnJvZGF0YV9sZW4JCQk9IDB4MCwKKwkucm9kYXRhX2luZGV4CQkJPSAweDAsCisJLnJvZGF0YQkJCQk9IGJueDJfVFBBVF9iMDlGd1JvZGF0YSwKK307CisKK3N0YXRpYyB1OCBibngyX1RYUF9iMDlGd1RleHRbXSA9IHsKKwkweDFmLCAweDhiLCAweDA4LCAweDA4LCAweDUxLCAweGZlLCAweDJmLCAweDQ1LCAweDAwLCAweDAzLCAweDc0LCAweDY1LAorCTB4NzMsIDB4NzQsIDB4MzEsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmUsIDB4MDAsIDB4Y2QsIDB4N2IsIDB4N2YsIDB4NzAsCisJMHgxYiwgMHhlNywgMHg5OSwgMHhkZSwgMHhiYiwgMHgwYiwgMHg4MCwgMHgwNCwgMHgyOSwgMHg4YSwgMHg1YSwgMHgzMSwKKwkweDMwLCAweDgzLCAweDM4LCAweGI0LCAweDhkLCAweDE1LCAweDE3LCAweDM0LCAweDZkLCAweGYyLCAweDFjLCAweDU4LAorCTB4ZTUsIDB4ZjksIDB4ZDgsIDB4MDYsIDB4YjUsIDB4ZDcsIDB4YzAsIDB4OTIsIDB4YTIsIDB4NjMsIDB4MjYsIDB4NDcsCisJMHhiYiwgMHhjYywgMHg5ZCwgMHg5MiwgMHg1MSwgMHg3ZCwgMHgyOCwgMHg0OCwgMHgyOSwgMHg2ZSwgMHhlMywgMHhiNCwKKwkweGFhLCAweGUzLCAweDNmLCAweDM0LCAweDRkLCAweDViLCAweGMzLCAweDAwLCAweDI1LCAweGNiLCAweDJlLCAweDQ0LAorCTB4ZDAsIDB4MTYsIDB4NjMsIDB4YTUsIDB4MzMsIDB4MzcsIDB4NTMsIDB4MTgsIDB4ODAsIDB4MjgsIDB4ZTcsIDB4YmEsCisJMHgyNCwgMHhkYywgMHhlNCwgMHgyZSwgMHhlOSwgMHgxZiwgMHhjOSwgMHg5OSwgMHhhNSwgMHg2YywgMHhjNSwgMHg2ZCwKKwkweGFlLCAweDMzLCAweGJlLCAweDNmLCAweGRhLCAweGE2LCAweDM3LCAweGQ3LCAweDE5LCAweDhkLCAweGZjLCAweDIzLAorCTB4Y2UsIDB4OGYsIDB4YjksIDB4YjgsIDB4NjksIDB4N2EsIDB4NTYsIDB4NWIsIDB4ZDksIDB4ZTgsIDB4ZjMsIDB4N2MsCisJMHhiYiwgMHg0YiwgMHg4MiwgMHgzMiwgMHgxNSwgMHg1YiwgMHhkNywgMHg3NiwgMHhhNiwgMHg5YywgMHhjMSwgMHgxMCwKKwkweGZiLCAweGVkLCAweGI3LCAweGRmLCAweGY3LCAweGZlLCAweDdlLCAweGRmLCAweGU3LCAweGZkLCAweDE2LCAweDcxLAorCTB4OTEsIDB4NmUsIDB4ZjEsIDB4ZmYsIDB4NzYsIDB4ZTMsIDB4OTMsIDB4MzgsIDB4N2EsIDB4ZWMsIDB4YjEsIDB4M2IsCisJMHhjNiwgMHhlZiwgMHhkOCwgMHgyZiwgMHg3MiwgMHhlNywgMHg5ZCwgMHhiMiwgMHgyYiwgMHhhYSwgMHhmMywgMHhlNiwKKwkweGRiLCAweDIxLCAweDkxLCAweGRjLCAweDRmLCAweGU1LCAweGFmLCAweGZjLCAweDg3LCAweGM3LCAweDhkLCAweDYwLAorCTB4N2QsIDB4N2UsIDB4MjQsIDB4YWEsIDB4YTcsIDB4NWYsIDB4Y2MsIDB4NjQsIDB4MmMsIDB4ODksIDB4ODYsIDB4ZDIsCisJMHgzMywgMHg5ZiwgMHg5ZCwgMHhiMywgMHg0NCwgMHg2YywgMHg3NywgMHgyNCwgMHg5MSwgMHg5NSwgMHhmNywgMHg1YSwKKwkweDg1LCAweDU4LCAweDU4LCAweDM4LCAweDdlLCAweDUzLCAweGZhLCAweGNhLCAweGUzLCAweGRmLCAweGZmLCAweDJkLAorCTB4ZjMsIDB4OWQsIDB4NmEsIDB4NDgsIDB4YTIsIDB4NDYsIDB4M2EsIDB4MjcsIDB4YzYsIDB4OTAsIDB4NDQsIDB4MDcsCisJMHhmMCwgMHhjYywgMHhlZiwgMHhkZiwgMHgzYSwgMHhhNSwgMHg0YiwgMHg2ZiwgMHhiMCwgMHg1NiwgMHg1YywgMHgxNiwKKwkweDJhLCAweDZmLCAweGI3LCAweGJlLCAweDdmLCAweDZiLCAweDRjLCAweGZlLCAweDU1LCAweGQzLCAweDkwLCAweDE3LAorCTB4OWIsIDB4NjEsIDB4NmQsIDB4YjIsIDB4ZDIsIDB4MjMsIDB4YTUsIDB4OGEsIDB4MmIsIDB4YzcsIDB4Y2IsIDB4MDUsCisJMHhjOSwgMHgzNiwgMHg1ZiwgMHg5MCwgMHhlMiwgMHhiMiwgMHhkMSwgMHg5YiwgMHgzOSwgMHhmNywgMHgwNywgMHg1MiwKKwkweDVhLCAweGVlLCAweGViLCAweGNkLCAweDllLCAweDczLCAweGE1LCAweDU4LCAweDhlLCAweGY3LCAweDY2LCAweDlhLAorCTB4NDYsIDB4NmYsIDB4ZjYsIDB4NGMsIDB4MGMsIDB4ZDcsIDB4N2QsIDB4YmQsIDB4OTksIDB4MzMsIDB4NjYsIDB4NDEsCisJMHhhNCwgMHgxZiwgMHg3MywgMHhlMiwgMHhiZCwgMHhkOSwgMHg4YSwgMHg5OSwgMHgxMywgMHgxOSwgMHg0YywgMHhiZCwKKwkweDIyLCAweDAzLCAweGJkLCAweGQ5LCAweDY2LCAweDRkLCAweDViLCAweDM3LCAweDM0LCAweDI5LCAweGZlLCAweDg2LAorCTB4MTgsIDB4YmQsIDB4ZTksIDB4Y2IsIDB4YWQsIDB4NGYsIDB4NTgsIDB4ODYsIDB4ZWMsIDB4YjUsIDB4NjQsIDB4Y2YsCisJMHgxZSwgMHg0YiwgMHg5ZSwgMHg4OCwgMHhhNywgMHhhMywgMHg5MiwgMHgzZiwgMHhkZCwgMHgyNSwgMHhiNiwgMHhlMiwKKwkweGM5LCAweDkwLCAweGZjLCAweDk5LCAweDExLCAweDYzLCAweDQzLCAweDIyLCAweDYyLCAweGM3LCAweDgyLCAweGViLAorCTB4NTYsIDB4MmIsIDB4OTMsIDB4ZmEsIDB4MDIsIDB4ZTUsIDB4OGEsIDB4YmQsIDB4YTQsIDB4NzcsIDB4YjIsIDB4MjksCisJMHg5MiwgMHhhOSwgMHg0NCwgMHgyNSwgMHg5MywgMHg3YSwgMHhhZiwgMHhlNSwgMHgzZCwgMHgxMywgMHhjNSwgMHhiZSwKKwkweGUxLCAweGRlLCAweDg5LCAweDRhLCAweGFiLCAweGU1LCAweGE0LCAweGIwLCAweDQ3LCAweDJhLCAweDc4LCAweDM2LAorCTB4MjIsIDB4ZDUsIDB4OTgsIDB4NWQsIDB4MmQsIDB4YTUsIDB4NGMsIDB4ZGQsIDB4ZDMsIDB4MDksIDB4NzksIDB4ZTQsCisJMHhiNSwgMHgyZCwgMHhiYSwgMHhmNSwgMHhkYiwgMHg5MiwgMHg4ZiwgMHg0OSwgMHhiNSwgMHg5OCwgMHhiYSwgMHg0YiwKKwkweDllLCAweDRlLCAweDE5LCAweDcyLCAweDEyLCAweGViLCAweDNkLCAweDk1LCAweDgyLCAweDFjLCAweGFkLCAweDYzLAorCTB4NWEsIDB4YTYsIDB4NjksIDB4YzYsIDB4NDUsIDB4N2IsIDB4NWEsIDB4MzIsIDB4NjcsIDB4MDYsIDB4OGQsIDB4YWMsCisJMHg2MCwgMHg2ZiwgMHhhYiwgMHg3NSwgMHg0YiwgMHgyNiwgMHg4NSwgMHhmZCwgMHg0NiwgMHhmZiwgMHg2NywgMHhjYiwKKwkweDhlLCAweDk5LCAweGI5LCAweGFhLCAweDBjLCAweDQ4LCAweGIxLCAweDMyLCAweDk4LCAweGZhLCAweDEzLCAweGQxLAorCTB4YTQsIDB4ZDMsIDB4YTIsIDB4N2MsIDB4NWEsIDB4NzIsIDB4M2YsIDB4ZjYsIDB4Y2QsIDB4NTgsIDB4MTgsIDB4NmYsCisJMHg4YSwgMHhhZCwgMHgyNywgMHgyMywgMHhmMiwgMHgwZiwgMHgwYywgMHgzMywgMHg5MSwgMHgwOSwgMHhmNSwgMHg0YiwKKwkweGYxLCAweDc0LCAweDI3LCAweGU4LCAweGI0LCAweGZiLCAweDc0LCAweGNjLCAweDNkLCAweDMwLCAweDI2LCAweGIxLAorCTB4NWQsIDB4MjIsIDB4NWEsIDB4MjgsIDB4OWQsIDB4YzQsIDB4YmEsIDB4MjIsIDB4NDUsIDB4NzcsIDB4MDAsIDB4Y2YsCisJMHgyNiwgMHhjNywgMHg3ZiwgMHgyYSwgMHg3YiwgMHgyNCwgMHhiMSwgMHgzNywgMHgyYywgMHgyNSwgMHhiNywgMHgxYiwKKwkweDcyLCAweDM0LCAweGEwLCAweDgzLCAweGU0LCAweGY4LCAweDVmLCAweDQwLCAweDI5LCAweGJhLCAweDk1LCAweDhjLAorCTB4MWYsIDB4OTMsIDB4OWMsIDB4OTYsIDB4NmQsIDB4NzYsIDB4NDgsIDB4MjksIDB4MTksIDB4OTUsIDB4MDUsIDB4ZDAsCisJMHhiMSwgMHg5MCwgMHhmYSwgMHhhMiwgMHg5NiwgMHgzOSwgMHg3NywgMHg1MCwgMHhjYiwgMHg5ZSwgMHhjMywgMHhiYywKKwkweDY2LCAweGRkLCAweGI3LCAweDM1LCAweDAzLCAweGViLCAweGU4LCAweDUyLCAweDRjLCAweDFlLCAweGM0LCAweGJkLAorCTB4YTgsIDB4Y2MsIDB4NjEsIDB4ZGUsIDB4MWMsIDB4NzgsIDB4MmEsIDB4MzUsIDB4ZjcsIDB4YzgsIDB4ZmEsIDB4NmMsCisJMHhhYywgMHgzNywgMHgwMywgMHgxZCwgMHgxNiwgMHg3MSwgMHhmZiwgMHhiNywgMHg2NywgMHgzNCwgMHgzMSwgMHgyYywKKwkweDViLCAweDdlLCAweDNjLCAweDA2LCAweDFkLCAweDllLCAweDgxLCAweGZlLCAweGNlLCAweGM0LCAweGU1LCAweDc4LAorCTB4NDUsIDB4NjIsIDB4YmEsIDB4MjQsIDB4ZTMsIDB4NzksIDB4NzksIDB4NDEsIDB4ZWEsIDB4MmUsIDB4ZjUsIDB4MGYsCisJMHg3ZCwgMHg0MiwgMHhkZiwgMHg0NSwgMHg5NywgMHhjZiwgMHg0MSwgMHg2ZiwgMHgxNSwgMHgwNywgMHhmMiwgMHg5OCwKKwkweDAyLCAweDBkLCAweDBmLCAweDZhLCAweGY3LCAweGQ3LCAweDY3LCAweGI1LCAweDAzLCAweGNkLCAweDFmLCAweDZiLAorCTB4ZDIsIDB4N2QsIDB4NGMsIDB4ZmIsIDB4NWMsIDB4ZjMsIDB4ODgsIDB4ZTYsIDB4Y2IsIDB4MWUsIDB4YmEsIDB4OGIsCisJMHg4YSwgMHgzZCwgMHgxMywgMHg5NSwgMHg5NSwgMHhhNiwgMHhhNywgMHhiYiwgMHgxYSwgMHhlYywgMHhkMywgMHgzNiwKKwkweDZjLCAweGU4LCAweGUxLCAweDZmLCAweDZmLCAweGNlLCAweDU5LCAweDY5LCAweGM2LCAweDY0LCAweDAxLCAweGI0LAorCTB4MWQsIDB4NmYsIDB4NzIsIDB4ZmUsIDB4ZWYsIDB4NDEsIDB4M2YsIDB4NTEsIDB4NzEsIDB4NmYsIDB4ZWQsIDB4OTEsCisJMHgxYywgMHhjNiwgMHg4YiwgMHg2NywgMHhjNCwgMHhjZSwgMHhhNCwgMHg3NCwgMHgzYywgMHhkMywgMHgyYiwgMHgyMSwKKwkweGFiLCAweDFmLCAweDlmLCAweDZlLCAweDk5LCAweGFiLCAweDc3LCAweGRhLCAweDIxLCAweDJiLCAweDI2LCAweDczLAorCTB4NGQsIDB4Y2EsIDB4MTAsIDB4ZmYsIDB4MmIsIDB4ODEsIDB4MWMsIDB4NDksIDB4MmIsIDB4YzcsIDB4ZjksIDB4MWMsCisJMHhjNywgMHgwZCwgMHg4YywgMHhiNywgMHg4ZiwgMHhkMSwgMHgyZSwgMHg3YSwgMHg0MSwgMHg4ZiwgMHgzOSwgMHgyYywKKwkweDE4LCAweGNiLCAweDU3LCAweDkyLCAweGM2LCAweGU3LCAweGY4LCAweGJmLCAweDQ5LCAweGQ5LCAweDA2LCAweDMyLAorCTB4MGQsIDB4NjMsIDB4YWUsIDB4MmUsIDB4ZjksIDB4M2EsIDB4ZjYsIDB4MzksIDB4N2QsIDB4YTUsIDB4MTUsIDB4MTksCisJMHhjMywgMHhiNSwgMHhmNSwgMHg0YiwgMHhjOCwgMHg5MiwgMHhmYiwgMHg4NiwgMHg0MSwgMHg5MywgMHgyZSwgMHhiOSwKKwkweDNhLCAweGQ3LCAweGUyLCAweDdkLCAweDgxLCAweGVlLCAweDhiLCAweDdiLCAweDc1LCAweDE5LCAweDg2LCAweDdlLAorCTB4NGQsIDB4ZWMsIDB4ZDMsIDB4ODUsIDB4MzksIDB4M2QsIDB4OTAsIDB4MWYsIDB4NzgsIDB4M2QsIDB4ODcsIDB4ZWYsCisJMHhlMCwgMHg1ZCwgMHhiNywgMHg3NCwgMHgzYywgMHhkZiwgMHgyOSwgMHg3MywgMHgyOSwgMHhkYSwgMHgwYiwgMHhlOSwKKwkweGRjLCAweDg1LCAweGI1LCAweGJiLCAweDY0LCAweGZlLCAweDM0LCAweGU1LCAweDAxLCAweGJiLCAweGFhLCAweGM0LAorCTB4YTQsIDB4NzQsIDB4YzYsIDB4MzQsIDB4MWMsIDB4MzEsIDB4MjEsIDB4MWIsIDB4MWIsIDB4ZjMsIDB4M2EsIDB4MjUsCisJMHg2NywgMHhiNCwgMHg1YSwgMHgxMywgMHhhOSwgMHgxMSwgMHhlMywgMHg5YiwgMHhjYSwgMHhjZSwgMHg0NywgMHg4YywKKwkweGE0LCAweDI2LCAweDg1LCAweDhlLCAweGY0LCAweDEwLCAweDY0LCAweDZiLCAweDFlLCAweDE0LCAweGUxLCAweGY1LAorCTB4MGYsIDB4YzQsIDB4OWUsIDB4YTUsIDB4ZmYsIDB4YzQsIDB4YjgsIDB4MTcsIDB4ZmMsIDB4YTksIDB4MWYsIDB4ZjQsCisJMHhkMywgMHhlNywgMHgwNiwgMHhhMCwgMHg5NywgMHhiOCwgMHhmMiwgMHg4MywgMHg4OSwgMHgxZCwgMHhmZCwgMHhjMCwKKwkweDljLCAweGFhLCAweDgyLCAweGRmLCAweGUyLCAweGI5LCAweDMwLCAweGZkLCAweDJmLCAweDA1LCAweDczLCAweDkzLAorCTB4NWQsIDB4NTYsIDB4MTQsIDB4YjYsIDB4NDAsIDB4NWEsIDB4YzYsIDB4YjEsIDB4N2UsIDB4YWIsIDB4ZjUsIDB4ZDksCisJMHg5NCwgMHg0NywgMHg1MywgMHhmMSwgMHg4YywgMHg4ZCwgMHg2NywgMHhjMywgMHg5MCwgMHhiYiwgMHhmOSwgMHg3MCwKKwkweDQyLCAweGVkLCAweDNmLCAweGVlLCAweGVmLCAweDZmLCAweGM4LCAweDFjLCAweGU4LCAweDJlLCAweDU2LCAweDQyLAorCTB4OTIsIDB4MzUsIDB4YjgsIDB4YzYsIDB4OWYsIDB4NzEsIDB4M2MsIDB4ZTcsIDB4YWQsIDB4MDUsIDB4YmIsIDB4M2QsCisJMHgzNSwgMHg2OCwgMHhkYywgMHgwNywgMHg1ZiwgMHhhMiwgMHg4ZiwgMHgxNSwgMHg1NywgMHgyOSwgMHg2MywgMHhhYywKKwkweDMzLCAweDQ2LCAweDE5LCAweDFiLCAweDhhLCAweGM2LCAweGNjLCAweDE5LCAweGRhLCAweDkxLCAweDBjLCAweDg0LAorCTB4ODQsIDB4NzYsIDB4OGUsIDB4OTgsIDB4MDEsIDB4YmIsIDB4MmEsIDB4ZjksIDB4NzYsIDB4OTUsIDB4NzcsIDB4YTksCisJMHhmZiwgMHhiYiwgMHg3ZCwgMHhmZiwgMHhkNCwgMHg2NSwgMHgyOCwgMHg0OSwgMHg3YiwgMHg3ZiwgMHg1YSwgMHhiMiwKKwkweGYwLCAweGYxLCAweDM5LCAweGVjLCAweDU0LCAweDA3LCAweDRmLCAweGI1LCAweGNhLCAweDIwLCAweDY0LCAweDE1LAorCTB4ZjgsIDB4MWQsIDB4ZjQsIDB4M2IsIDB4ZmEsIDB4NmUsIDB4MmIsIDB4ODgsIDB4MDUsIDB4YzUsIDB4MGEsIDB4N2QsCisJMHhhNiwgMHg2OCwgMHhlOCwgMHg1MiwgMHhjMCwgMHgwNywgMHg3NiwgMHg2MywgMHg5OSwgMHhjMywgMHg5OSwgMHg5MCwKKwkweDM5LCAweDkzLCAweDAzLCAweDZkLCAweGIwLCAweDdiLCAweGM5LCAweGRjLCAweDQ5LCAweDdiLCAweGM2LCAweDljLAorCTB4YTYsIDB4ZWMsIDB4MGYsIDB4ZmMsIDB4YWMsIDB4ZTYsIDB4NTIsIDB4NGYsIDB4ZGQsIDB4ZDgsIDB4MzcsIDB4YTAsCisJMHgyOSwgMHg4YywgMHgzMSwgMHhhZSwgMHgxMywgMHg4NSwgMHhjZCwgMHgwNywgMHgzNiwgMHg0MywgMHhmYiwgMHgzMywKKwkweGVkLCAweDc1LCAweGU5LCAweDkwLCAweGUxLCAweDI0LCAweDYyLCAweGQ5LCAweDE5LCAweDFkLCAweGZhLCAweDFiLAorCTB4NDAsIDB4NGMsIDB4MDksIDB4Y2IsIDB4MTEsIDB4YzgsIDB4ZWEsIDB4NGIsIDB4MTUsIDB4ZDIsIDB4ZTcsIDB4YzAsCisJMHhlZiwgMHgxMCwgMHhkYiwgMHhjZSwgMHg0YywgMHhjMiwgMHhjZiwgMHhhNiwgMHhiNCwgMHgwOSwgMHhmOCwgMHhjNCwKKwkweDY3LCAweGVhLCAweGE0LCAweGE5LCAweDI1LCAweGY0LCAweDRiLCAweGU3LCAweDVjLCAweDRlLCAweDliLCAweDZjLAorCTB4MWUsIDB4ZDQsIDB4YTYsIDB4Y2UsIDB4ZDEsIDB4NGYsIDB4ZTgsIDB4MjMsIDB4YTYsIDB4ZjEsIDB4ODAsIDB4NzgsCisJMHgzYywgMHgxNCwgMHg5YiwgMHhhZiwgMHg2OCwgMHhmNCwgMHhkNSwgMHhlMiwgMHhhOSwgMHgyZSwgMHhkMCwgMHhiMSwKKwkweDBiLCAweGY0LCAweDE4LCAweGYwLCAweDNkLCAweGQ4LCAweDk3LCAweDY1LCAweGNlLCAweGQwLCAweDY2LCAweDljLAorCTB4YTQsIDB4OTUsIDB4ZjgsIDB4ZTcsIDB4ZjIsIDB4NDEsIDB4MzksIDB4NGMsIDB4NmMsIDB4Y2EsIDB4NjEsIDB4MDQsCisJMHgzMiwgMHhkOSwgMHgyZSwgMHg4NywgMHg4NSwgMHgwZiwgMHhjYSwgMHhjMSwgMHgyZSwgMHg0MCwgMHgwZSwgMHgwYiwKKwkweDg4LCAweDQzLCAweDBiLCAweDRkLCAweGYyLCAweGRjLCAweDEyLCAweGZkLCAweDRlLCAweDgxLCAweDc1LCAweGNhLAorCTB4YmQsIDB4N2EsIDB4OWEsIDB4MzYsIDB4NGEsIDB4M2YsIDB4NDksIDB4MjYsIDB4NGEsIDB4NTgsIDB4YTEsIDB4ZTEsCisJMHhmNiwgMHgyOCwgMHhkZiwgMHg5OCwgMHg1NCwgMHhiMiwgMHhmOCwgMHgzMCwgMHg3ZSwgMHhjOSwgMHhkZiwgMHgxNiwKKwkweGNmLCAweDUzLCAweDc1LCAweGM2LCAweDFiLCAweGQ4LCAweDc5LCAweGQyLCAweDMyLCAweGJlLCAweDIwLCAweDViLAorCTB4N2MsIDB4ZGYsIDB4YjcsIDB4YzUsIDB4MzcsIDB4ZjYsIDB4MDksIDB4NjIsIDB4MTAsIDB4NzksIDB4MGUsIDB4ZTIsCisJMHgzMSwgMHg2ZCwgMHhlNSwgMHhhNSwgMHg1NiwgMHhjOCwgMHhiMiwgMHhhMCwgMHgwMywgMHhkYSwgMHgwYiwgMHg2OSwKKwkweDMwLCAweDhkLCAweGNmLCAweDBhLCAweGZlLCAweDIzLCAweDJlLCAweGQwLCAweDk3LCAweDcyLCAweDZhLCAweDVlLAorCTB4ODcsIDB4ZTQsIDB4ZjYsIDB4N2EsIDB4ZjMsIDB4ZTcsIDB4MmEsIDB4YWQsIDB4NWYsIDB4ZTgsIDB4ZTksIDB4ZjcsCisJMHg1YiwgMHg5OSwgMHgzMSwgMHhjYiwgMHhmNywgMHhmMSwgMHhhOCwgMHg3YywgMHhiOSwgMHg2ZSwgMHhlNiwgMHgxMiwKKwkweDVhLCAweDhmLCAweDE0LCAweDZlLCAweDQwLCAweDVjLCAweGE5LCAweGQwLCAweDNmLCAweGZhLCAweGFmLCAweDExLAorCTB4Y2IsIDB4MDYsIDB4ZmMsIDB4NTgsIDB4ZjYsIDB4MTMsIDB4YzgsIDB4OWUsIDB4YjksIDB4ZTcsIDB4ZjAsIDB4ZmIsCisJMHhlYiwgMHgzMSwgMHhmZSwgMHg0ZiwgMHgxYSwgMHgzMywgMHhmMiwgMHgwNSwgMHhlNiwgMHg5YiwgMHgzZCwgMHhiYSwKKwkweDhhLCAweGRmLCAweDE2LCAweDczLCAweDQxLCAweDIxLCAweDljLCAweGVlLCAweDk2LCAweGMyLCAweDVlLCAweDI5LAorCTB4ODQsIDB4ZDIsIDB4ZjQsIDB4MjMsIDB4ZmEsIDB4NDYsIDB4ODcsIDB4NGYsIDB4NzcsIDB4OTAsIDB4M2IsIDB4ZjgsCisJMHg3NywgMHg0YywgMHgxNywgMHg4YiwgMHg3MywgMHg5MCwgMHgyNywgMHgyYSwgMHhlNCwgMHhlMywgMHhiZCwgMHg0MCwKKwkweDI3LCAweDc4LCAweDQ2LCAweDIyLCAweDllLCAweGNkLCAweDRkLCAweDIzLCAweDY2LCAweDUyLCAweGE2LCAweGVkLAorCTB4ZjYsIDB4YzIsIDB4NTgsIDB4MmEsIDB4MDksIDB4ZGQsIDB4NjIsIDB4MmMsIDB4MTUsIDB4MjMsIDB4OTQsIDB4N2UsCisJMHg1MCwgMHhiMywgMHhlYiwgMHg1ZiwgMHhkNCwgMHg2YywgMHhjOCwgMHhjZSwgMHg4NiwgMHhlYywgMHg2YywgMHhjOCwKKwkweDJlLCAweDAzLCAweGQ5LCAweDY1LCAweDliLCAweGE0LCAweDg3LCAweGI0LCAweDc4LCAweGViLCAweDNiLCAweGRlLAorCTB4ZmEsIDB4YTAsIDB4YjMsIDB4NWYsIDB4ZjIsIDB4Y2EsIDB4YzcsIDB4YzksIDB4MmYsIDB4NjIsIDB4YjIsIDB4OGEsCisJMHgwNywgMHg5MywgMHg5YSwgMHgxNywgMHgwZiwgMHhiOCwgMHhkZSwgMHgxNCwgMHg5ZSwgMHhiZiwgMHgxYiwgMHg3OSwKKwkweGNlLCAweGQ2LCAweDc1LCAweDZiLCAweDRiLCAweDI2LCAweDBiLCAweDZkLCAweDMyLCAweDI5LCAweGI5LCAweDk0LAorCTB4MTEsIDB4ZTcsIDB4ZDMsIDB4OTcsIDB4NWQsIDB4ZTgsIDB4M2QsIDB4OTAsIDB4Y2IsIDB4MzQsIDB4NjgsIDB4ZTgsCisJMHgyNCwgMHhlZiwgMHgzZSwgMHgxZiwgMHg1YywgMHhiZiwgMHhjZiwgMHg1ZiwgMHhmZiwgMHhkMywgMHg1OCwgMHg5MywKKwkweGJlLCAweGJiLCAweGQzLCAweGJlLCAweGRjLCAweDkzLCAweGI5LCAweGY0LCAweGQ3LCAweGYxLCAweDgzLCAweDVhLAorCTB4MDIsIDB4MzEsIDB4ZmEsIDB4NDUsIDB4ZjgsIDB4ZGEsIDB4YzUsIDB4NTAsIDB4NWMsIDB4YmUsIDB4N2YsIDB4ZWIsCisJMHg2YiwgMHhhOCwgMHgyZiwgMHhhNCwgMHg3MCwgMHg2MywgMHhiYSwgMHg5NSwgMHgwOCwgMHhhNywgMHhkZiwgMHg2YiwKKwkweDJkLCAweDhjLCAweDIxLCAweDdlLCAweGE2LCAweGNkLCAweDc4LCAweDI2LCAweDM0LCAweDJhLCAweDJmLCAweDM1LAorCTB4ODcsIDB4ZTUsIDB4M2IsIDB4NGQsIDB4NGIsIDB4ZmUsIDB4YTgsIDB4OTksIDB4OTAsIDB4M2YsIDB4NmMsIDB4MGUsCisJMHhjOCwgMHhiNywgMHg5YiwgMHg3MSwgMHhmOSwgMHg1NiwgMHgzMywgMHhhOCwgMHg0NSwgMHhlMiwgMHhiNCwgMHhhNSwKKwkweDVlLCAweGE3LCAweGI5LCAweDUzLCAweDNkLCAweDA0LCAweDNiLCAweGM3LCAweDVhLCAweDk5LCAweGIxLCAweDcwLAorCTB4MmUsIDB4OTQsIDB4NTYsIDB4MzUsIDB4YzIsIDB4Y2MsIDB4ZDEsIDB4ZjIsIDB4ZTMsIDB4MmQsIDB4ZGQsIDB4YjIsCisJMHgwYSwgMHhiYSwgMHhkZSwgMHgzMywgMHg2ZSwgMHhkYywgMHgyNSwgMHgzOSwgMHgzZCwgMHg4ZCwgMHgzMSwgMHg3NywKKwkweDNjLCAweGVjLCAweDk0LCAweGJiLCAweDkwLCAweDVmLCAweGEyLCAweGE4LCAweDY1LCAweDA2LCAweGE0LCAweDgwLAorCTB4NzUsIDB4MGIsIDB4Y2QsIDB4NTYsIDB4NmIsIDB4MjksIDB4ZjUsIDB4MGYsIDB4M2YsIDB4NjUsIDB4ZmMsIDB4OGQsCisJMHg3ZiwgMHhkOSwgMHgyOSwgMHhiZCwgMHhkZiwgMHg1ZSwgMHgzNywgMHg4NiwgMHhmZSwgMHhiYiwgMHg1ZiwgMHgwZiwKKwkweGExLCAweGM2LCAweGVhLCAweDU3LCAweDhiLCAweGU3LCAweGI0LCAweGY0LCAweGE4LCAweDkzLCAweDcwLCAweDM3LAorCTB4NzAsIDB4NWYsIDB4YTIsIDB4ZmQsIDB4ZDYsIDB4Y2YsIDB4NTEsIDB4ODUsIDB4YzgsIDB4ZWUsIDB4OTgsIDB4YzUsCisJMHg5YSwgMHg2YiwgMHgyNiwgMHhmYiwgMHg3OSwgMHhmYywgMHhmZiwgMHg1OCwgMHg1YSwgMHhmNiwgMHhmNCwgMHhlMSwKKwkweGZmLCAweGRlLCAweDM0LCAweDRjLCAweDJhLCAweGNkLCAweDk4LCAweGFjLCAweGI1LCAweGM1LCAweDY0LCAweGQxLAorCTB4MWMsIDB4ZTQsIDB4ZGYsIDB4MDUsIDB4ZjAsIDB4ZTQsIDB4NDAsIDB4MWUsIDB4YmYsIDB4ZDMsIDB4OGMsIDB4NmEsCisJMHhkOSwgMHhkMywgMHhmZCwgMHg1MiwgMHhhYSwgMHgzMywgMHhhZiwgMHg3MSwgMHg1ZSwgMHhkNCwgMHhhZiwgMHg3YiwKKwkweDc4LCAweGRkLCAweDgxLCAweDZiLCAweDQxLCAweGFlLCAweGY5LCAweDk0LCAweDQ4LCAweGFmLCAweGY5LCAweGEzLAorCTB4Y2YsIDB4NGIsIDB4ZGQsIDB4YWYsIDB4NWIsIDB4MjIsIDB4YjIsIDB4YWMsIDB4NmMsIDB4OGMsIDB4ZTMsIDB4YWYsCisJMHg2NSwgMHhiZiwgMHgzNiwgMHhiNCwgMHgzNSwgMHhmZSwgMHhlYywgMHhlNiwgMHhmOCwgMHgzYiwgMHhkOSwgMHg0ZiwKKwkweDZmLCAweDhlLCAweDc3LCAweDg3LCAweDNkLCAweDFlLCAweGM2LCAweGI1LCAweDk5LCAweDY2LCAweGMxLCAweDFmLAorCTB4YmIsIDB4MGMsIDB4YjksIDB4YjcsIDB4NWEsIDB4MGIsIDB4YzgsIDB4M2QsIDB4NDUsIDB4ZWIsIDB4MzIsIDB4ZWEsCisJMHgyNCwgMHhjNiwgMHg5ZiwgMHhlYiwgMHg4OSwgMHgzNywgMHhkYiwgMHg2MiwgMHg4ZCwgMHg5MSwgMHgwOSwgMHg1MSwKKwkweDlmLCAweDUxLCAweGYxLCAweGQ2LCAweGU0LCAweGZkLCAweDRlLCAweGM0LCAweDlkLCAweGNiLCAweGY4LCAweGNlLAorCTB4M2MsIDB4MTcsIDB4YzQsIDB4M2MsIDB4Y2UsIDB4ZTEsIDB4ZjMsIDB4NmYsIDB4NWYsIDB4NDMsIDB4ZTcsIDB4MzEsCisJMHhlOCwgMHhmYywgMHhmZiwgMHgxYiwgMHhkZCwgMHhlMiwgMHg0ZiwgMHhlOSwgMHg1NiwgMHhjNSwgMHg5ZCwgMHg5NywKKwkweGI2LCAweGQ5LCAweDJjLCAweGU5LCAweGVmLCAweGY2LCAweDY5LCAweDk2LCAweDY4LCAweDM4LCAweDZkLCAweDM4LAorCTB4MGIsIDB4ZDYsIDB4OGQsIDB4MTIsIDB4NDEsIDB4MGQsIDB4NGIsIDB4OWIsIDB4MmQsIDB4MzUsIDB4YmYsIDB4OGIsCisJMHhlNywgMHg5OSwgMHgyNywgMHgyNSwgMHgxYSwgMHg0OSwgMHhkMywgMHgyZSwgMHhkNiwgMHgwNywgMHgzMiwgMHhkNiwKKwkweDMxLCAweGE3LCAweGU2LCAweDFlLCAweDczLCAweGNlLCAweDJhLCAweDNiLCAweDU5LCAweGJmLCAweGM5LCAweGFiLAorCTB4Y2QsIDB4N2YsIDB4NzQsIDB4MTMsIDB4NmEsIDB4NzMsIDB4M2MsIDB4Y2YsIDB4OTgsIDB4Y2IsIDB4ZjEsIDB4NDYsCisJMHg0ZiwgMHhjNiwgMHg2MiwgMHgwZSwgMHg1YSwgMHg3MiwgMHg4YSwgMHhmOCwgMHgyYywgMHhhOCwgMHhiOSwgMHhhZiwKKwkweDBlLCAweDcwLCAweDZlLCAweDY3LCAweDNhLCAweDc2LCAweGQzLCAweDhmLCAweGYxLCAweGJmLCAweDIzLCAweGZkLAorCTB4Y2UsIDB4NGQsIDB4MTcsIDB4MmMsIDB4YWUsIDB4M2IsIDB4NzUsIDB4ZDMsIDB4NTksIDB4YjUsIDB4NDYsIDB4MTgsCisJMHhmMSwgMHg4YywgMHhmMywgMHgyZSwgMHhkZiwgMHhjNCwgMHg2NywgMHg5ZiwgMHg0NCwgMHgxYywgMHgzZiwgMHhlMSwKKwkweDQyLCAweDk3LCAweGVlLCAweDhiLCAweDRlLCAweDFlLCAweDlmLCAweDM5LCAweGQyLCAweDU0LCAweGUxLCAweDdkLAorCTB4ZTMsIDB4ZTYsIDB4OGMsIDB4MTUsIDB4NTYsIDB4ZjksIDB4ZjYsIDB4NGIsIDB4OTgsIDB4NzMsIDB4MDQsIDB4NzMsCisJMHgwZSwgMHhiYiwgMHgwMSwgMHgzZiwgMHhlYSwgMHhiZSwgMHg5MywgMHhjNSwgMHhmZCwgMHhjMywgMHg2NSwgMHhjMywKKwkweDcxLCAweGNhLCAweGU2LCAweDM4LCAweDZhLCAweDhlLCAweGY4LCAweDcxLCAweGU0LCAweGUzLCAweDFjLCAweDcyLAorCTB4YTAsIDB4MmQsIDB4ZTYsIDB4NzAsIDB4NDEsIDB4ZDIsIDB4NWQsIDB4OTMsIDB4YTgsIDB4ZTUsIDB4NTYsIDB4OTAsCisJMHg0ZiwgMHg1MCwgMHg4NywgMHhhNCwgMHhhYSwgMHgzMiwgMHhkOCwgMHg5NSwgMHgzOSwgMHhhZCwgMHhjMywgMHgzZSwKKwkweGVmLCAweDgwLCAweGJkLCAweDFhLCAweDhlLCAweDllLCAweDQ0LCAweDVjLCAweDQ3LCAweGRjLCAweDVjLCAweGE4LAorCTB4NTgsIDB4NWEsIDB4YjYsIDB4M2MsIDB4NjgsIDB4OTQsIDB4ZTQsIDB4NTYsIDB4NTksIDB4MzcsIDB4Y2MsIDB4ZjgsCisJMHhhNCwgMHhlYywgMHg5MiwgMHg2YywgMHgxOCwgMHhmMywgMHg4NiwgMHgzZiwgMHgyZSwgMHhiOSwgMHhiOCwgMHg4NiwKKwkweGQ4LCAweDcwLCAweDAzLCAweGUyLCAweDE2LCAweGViLCAweGU0LCAweGY2LCAweDE4LCAweGZhLCAweDBiLCAweDExLAorCTB4ZWIsIDB4OGIsIDB4MjEsIDB4YzYsIDB4OWUsIDB4NGUsIDB4OGIsIDB4NzUsIDB4M2YsIDB4ZTcsIDB4ZWQsIDB4OTIsCisJMHg4ZCwgMHgwZiwgMHhjYywgMHg3YiwgMHhiNywgMHg2ZCwgMHg1ZSwgMHhmYiwgMHhmOCwgMHg3YiwgMHgxOCwgMHhkZiwKKwkweDI1LCAweDE3LCAweDQxLCAweDQ3LCAweDM4LCAweDM5LCAweDI2LCAweDI1LCAweGYwLCAweDEwLCAweDM5LCAweGQ1LAorCTB4NmEsIDB4NWQsIDB4MDAsIDB4M2YsIDB4M2EsIDB4ZjgsIDB4MmYsIDB4NTYsIDB4NTksIDB4MGIsIDB4ODQsIDB4YTQsCisJMHg2YSwgMHhlMCwgMHg5ZSwgMHhkYiwgMHg2YSwgMHhkNSwgMHgxMCwgMHg0NiwgMHhmNSwgMHg1NSwgMHhkMiwgMHgxYywKKwkweDk1LCAweDQ5LCAweDc3LCAweDQ4LCAweGVjLCAweDA2LCAweGU1LCAweDYwLCAweGMyLCAweGViLCAweGZlLCAweGFjLAorCTB4MmIsIDB4N2IsIDB4ODYsIDB4MzksIDB4MTMsIDB4MTYsIDB4YjEsIDB4ZmEsIDB4ZTcsIDB4NWQsIDB4MTksIDB4ZTQsCisJMHgzZSwgMHg3ZCwgMHhmNSwgMHg2MiwgMHg1NywgMHgxNiwgMHg3YSwgMHgwZiwgMHhhZCwgMHhmZSwgMHhlNywgMHgyZSwKKwkweGU3LCAweDM0LCAweGU5LCAweDBhLCAweDIxLCAweGY3LCAweGRkLCAweDIyLCAweDQ1LCAweGEzLCAweDI1LCAweGRmLAorCTB4NDQsIDB4OGQsIDB4NTAsIDB4MWMsIDB4NDYsIDB4MmUsIDB4ODMsIDB4MTcsIDB4ZTgsIDB4YTAsIDB4YmIsIDB4NjAsCisJMHg0OCwgMHhiNCwgMHgzYiwgMHhmZCwgMHg3ZCwgMHhkMCwgMHgzNywgMHgwNiwgMHhkOSwgMHhlYywgMHhjMiwgMHg5YywKKwkweDEwLCAweGM2LCAweDg3LCAweGYwLCAweGJmLCAweDdkLCAweGZjLCAweDhkLCAweDJlLCAweGU0LCAweDA1LCAweGM0LAorCTB4NjAsIDB4ODksIDB4NjYsIDB4YzYsIDB4N2EsIDB4YjAsIDB4ZmUsIDB4ZjcsIDB4MzAsIDB4OGUsIDB4MDksIDB4YzksCisJMHhjZCwgMHhmMSwgMHgyNywgMHhiYywgMHhmMSwgMHhiNywgMHg0MSwgMHgwYiwgMHg5ZiwgMHg2MywgMHg4ZCwgMHgyMiwKKwkweGQxLCAweGI5LCAweDMxLCAweDAzLCAweDM0LCAweDcwLCAweDZlLCAweDRjLCAweGNkLCAweDc1LCAweGNlLCAweGQwLAorCTB4MDYsIDB4MGMsIDB4YTcsIDB4NjYsIDB4ZGQsIDB4MmMsIDB4ZDksIDB4ZTUsIDB4N2UsIDB4OTksIDB4NWMsIDB4ZWUsCisJMHg5MywgMHgwMywgMHhjYiwgMHhlNiwgMHg0YywgMHg5NSwgMHhkOCwgMHgwZiwgMHgzYywgMHgwYiwgMHhlYSwgMHgzMCwKKwkweDdkLCAweDU1LCAweDIwLCAweDAxLCAweDMzLCAweDdlLCAweDQ0LCAweDA2LCAweGUzLCAweDVmLCAweDkyLCAweDVmLAorCTB4YjYsIDB4OTAsIDB4ZWYsIDB4OTEsIDB4ZWIsIDB4N2IsIDB4MjQsIDB4YWMsIDB4ZDYsIDB4ODksIDB4MDcsIDB4N2IsCisJMHhkMiwgMHg0NiwgMHhiNywgMHhlZCwgMHhlYiwgMHg5YywgMHhiOSwgMHhkNiwgMHhiYSwgMHg3MCwgMHhmZSwgMHhkNSwKKwkweGY4LCAweDU1LCAweGViLCAweGZlLCAweDg1LCAweGJmLCAweGFlLCAweDgxLCAweDc1LCAweDA3LCAweGIwLCAweDI2LAorCTB4NzksIDB4MzQsIDB4YmIsIDB4MjYsIDB4NGUsIDB4OGIsIDB4ZGQsIDB4MDksIDB4ZmEsIDB4OWMsIDB4ZTQsIDB4OGQsCisJMHhjMCwgMHg4NiwgMHhmZCwgMHg3MiwgMHg2MiwgMHg5OSwgMHhmMSwgMHg0MiwgMHhmYSwgMHhmMSwgMHgxOSwgMHg4ZCwKKwkweDQ4LCAweDcyLCAweGY4LCAweDFjLCAweGVhLCAweGFlLCAweDA5LCAweGI1LCAweDg2LCAweDU3LCAweDkzLCAweGU5LAorCTB4YWIsIDB4MjksIDB4ZDQsIDB4YzQsIDB4M2YsIDB4MDUsIDB4M2QsIDB4YWMsIDB4MTUsIDB4YzgsIDB4NzMsIDB4MTgsCisJMHhmYywgMHhhNiwgMHg1MCwgMHg4YiwgMHgxMSwgMHg0NywgMHhiNSwgMHgxZSwgMHhjZiwgMHhhNCwgMHhmMCwgMHhmZCwKKwkweDVjLCAweGEyLCAweDJiLCAweDhiLCAweDk4LCAweDA4LCAweGZmLCAweGJlLCAweDM5LCAweGE0LCAweDcyLCAweDE4LAorCTB4ZjUsIDB4MzIsIDB4ZGEsIDB4NDUsIDB4M2MsIDB4ODMsIDB4ZTcsIDB4YTEsIDB4MjcsIDB4Y2EsIDB4NjgsIDB4YmMsCisJMHhjYiwgMHhhOSwgMHg1MCwgMHg0NiwgMHgwMiwgMHg3YSwgMHgyYywgMHhkOCwgMHg2NCwgMHg1OCwgMHg2MSwgMHgyOSwKKwkweDdkLCAweGQ1LCAweGM2LCAweGJjLCAweGI3LCAweDQyLCAweGFjLCAweDc3LCAweDMzLCAweDE2LCAweGJmLCAweDIzLAorCTB4ZTYsIDB4YWMsIDB4NGUsIDB4NjEsIDB4MmUsIDB4YmYsIDB4ZGYsIDB4ODUsIDB4NzUsIDB4MDcsIDB4ODcsIDB4OGIsCisJMHhkMiwgMHgzMSwgMHg3YywgMHgxOCwgMHhmMSwgMHg0ZSwgMHgxZiwgMHgxYiwgMHgwMSwgMHg2ZCwgMHhiNCwgMHhmMywKKwkweDE2LCAweGIwLCAweGMwLCAweDZmLCAweDgxLCAweDFmLCAweGY4LCAweDQ2LCAweGQyLCAweDkyLCAweGY5LCAweDI1LAorCTB4Y2EsIDB4NTUsIDB4M2UsIDB4MGUsIDB4MWUsIDB4YzAsIDB4N2YsIDB4MTIsIDB4NzEsIDB4OGQsIDB4M2MsIDB4NzAsCisJMHg2ZiwgMHg0MSwgMHg4ZSwgMHhiZSwgMHg1YiwgMHhmMiwgMHg0YiwgMHg1MSwgMHg1NSwgMHhlYiwgMHhkYiwgMHgwNiwKKwkweGY3LCAweGQ3LCAweDM0LCAweDNkLCAweGRkLCAweDBkLCAweDFkLCAweDkzLCAweGI3LCAweDFjLCAweDY4LCAweDdiLAorCTB4MGMsIDB4NzksIDB4ODAsIDB4YmMsIDB4OTEsIDB4MmYsIDB4ZmEsIDB4Y2EsIDB4MjgsIDB4ZmMsIDB4ODQsIDB4ZjQsCisJMHhmYiwgMHhiNiwgMHhhNywgMHhhZCwgMHgyMywgMHhhNiwgMHhhOCwgMHgzOCwgMHg5OCwgMHhjYSwgMHgyMCwgMHhiMCwKKwkweGJkLCAweGQ0LCAweDFjLCAweDk3LCAweDNmLCAweDZlLCAweDhlLCAweGM5LCAweDc3LCAweDliLCAweDI5LCAweGU0LAorCTB4YzAsIDB4NTEsIDB4ZTQsIDB4YzAsIDB4NjEsIDB4ZTQsIDB4NDAsIDB4MGIsIDB4MzksIDB4MzAsIDB4ODEsIDB4MWMsCisJMHgzOCwgMHg4MCwgMHgxYywgMHgxOCwgMHg0NywgMHg5YywgMHgxNCwgMHgzOSwgMHhhMSwgMHhmMiwgMHg2ZCwgMHgyYywKKwkweDBhLCAweGNjLCAweDFkLCAweGI1LCAweDliLCAweDBlLCAweDc4LCAweDk5LCAweGMxLCAweDVlLCAweGIzLCAweGUwLAorCTB4ZWIsIDB4NTAsIDB4ZDcsIDB4NDQsIDB4NjUsIDB4MWMsIDB4MzEsIDB4ZDcsIDB4NDIsIDB4M2MsIDB4NGEsIDB4MjAsCisJMHhkZiwgMHg4YywgMHgwMSwgMHg2YiwgMHg4OSwgMHg2YywgMHgyYywgMHgyNSwgMHgxMCwgMHgxMywgMHg1YiwgMHhlMiwKKwkweDAwLCAweDEzLCAweDk3LCAweDhjLCAweDE0LCAweDllLCAweGRkLCAweGFiLCAweGVjLCAweDMzLCAweDk0LCAweGJlLAorCTB4M2IsIDB4MmMsIDB4ZGQsIDB4YTMsIDB4OTIsIDB4MmYsIDB4OWYsIDB4YzQsIDB4NTgsIDB4MWMsIDB4ZWIsIDB4NzUsCisJMHgyMSwgMHgyZiwgMHgzMSwgMHgyZSwgMHgzMCwgMHgwNiwgMHgyYywgMHgzOSwgMHhiZiwgMHg2YiwgMHhkMSwgMHhkNywKKwkweGJhLCAweGI1LCAweGNjLCAweGU5LCAweDgyLCAweDMwLCAweDk2LCAweDIzLCAweDBmLCAweGMwLCAweDFlLCAweDM4LAorCTB4MzYsIDB4ODksIDB4ZTcsIDB4ZjgsIDB4ZmQsIDB4MmYsIDB4ZmQsIDB4OTgsIDB4ZjksIDB4YjEsIDB4NGUsIDB4ODEsCisJMHhkMSwgMHhiZSwgMHhjNCwgMHg5YywgMHg2NywgMHg2MSwgMHgzZCwgMHhiNywgMHhkZCwgMHg0ZiwgMHg5ZiwgMHg0NywKKwkweGFkLCAweDE0LCAweGRjLCAweDI3LCAweGFlLCAweDY2LCAweDNmLCAweGUxLCAweDI0LCAweDY4LCAweDFlLCAweDA0LAorCTB4YmUsIDB4NDcsIDB4NmQsIDB4NzUsIDB4YjAsIDB4OGEsIDB4ZWYsIDB4ZWQsIDB4ZjMsIDB4NWQsIDB4Y2MsIDB4NTcsCisJMHg2MywgMHg1MSwgMHgyMywgMHg2ZCwgMHhiMSwgMHg5ZSwgMHg0MywgMHhhYywgMHgzYywgMHg4NiwgMHhiOCwgMHg2OCwKKwkweDNiLCAweGZhLCAweDVhLCAweDAzLCAweDdjLCAweDQyLCAweDhlLCAweDY1LCAweGRiLCAweDA5LCAweDBmLCAweGJkLAorCTB4ZDYsIDB4N2EsIDB4ZDYsIDB4MWEsIDB4OTYsIDB4ODksIDB4YjUsIDB4MzEsIDB4YzksIDB4YWUsIDB4MGQsIDB4YzYsCisJMHhjZiwgMHg0YiwgMHhkNywgMHg2NSwgMHg1YiwgMHg1ZSwgMHg2YiwgMHg5NSwgMHg1YywgMHhmMywgMHhhNCwgMHgwZCwKKwkweGJiLCAweGRjLCAweGI3LCAweGRmLCAweDkwLCAweDFhLCAweDMwLCAweGRjLCAweGJlLCAweGZkLCAweDlkLCAweGFjLAorCTB4ZTksIDB4NWYsIDB4MTQsIDB4M2QsIDB4MjEsIDB4OTksIDB4NDUsIDB4NWIsIDB4YzYsIDB4ZjYsIDB4MDcsIDB4YjUsCisJMHhlNywgMHgyZiwgMHgzYiwgMHhhNCwgMHgxYiwgMHg2MywgMHg2YiwgMHgwOSwgMHhjYywgMHg2MSwgMHhkZCwgMHhhZiwKKwkweGZhLCAweDI3LCAweGUwLCAweDU5LCAweGYzLCAweDllLCAweDUxLCAweDM5LCAweDhmLCAweDk4LCAweDE5LCAweGJjLAorCTB4MzcsIDB4NmQsIDB4ZTcsIDB4ZmMsIDB4MjIsIDB4NzAsIDB4MGQsIDB4ZTQsIDB4OTksIDB4NTksIDB4MjQsIDB4ZWUsCisJMHhkYSwgMHgwNSwgMHgzOSwgMHg0NSwgMHg2MCwgMHgyMywgMHhkNCwgMHhmZCwgMHgyMCwgMHg5ZSwgMHg2ZCwgMHhjOSwKKwkweDU3LCAweDUzLCAweGI0LCAweDg3LCAweGM3LCAweDIwLCAweDRiLCAweGFjLCAweDE1LCAweDBlLCAweGY4LCAweGY5LAorCTB4OWEsIDB4Y2MsIDB4MmQsIDB4NTEsIDB4N2UsIDB4NzEsIDB4ZDQsIDB4OTYsIDB4ZGMsIDB4NWIsIDB4YTIsIDB4NWQsCisJMHhlOSwgMHhhYiwgMHhlYiwgMHg0NiwgMHhkYiwgMHhkOSwgMHg1OCwgMHhjNCwgMHhmYSwgMHg0MywgMHhjNCwgMHhkOCwKKwkweDg4LCAweGQ1LCAweDY1LCAweGY2LCAweDA2LCAweDU4LCAweDUzLCAweDFkLCAweDgwLCAweDRlLCAweGE2LCAweDE1LAorCTB4ZTYsIDB4Y2UsIDB4ZDQsIDB4NTMsIDB4NjIsIDB4OWQsIDB4NjIsIDB4YWMsIDB4OTIsIDB4NDQsIDB4YzgsIDB4MjIsCisJMHhiZSwgMHgxNywgMHg0MywgMHg0ZiwgMHhjZiwgMHhlMiwgMHgxZSwgMHhlNSwgMHhjOSwgMHg1YSwgMHgxZiwgMHhmNywKKwkweDU3LCAweGZmLCAweGEzLCAweGQyLCAweDQ5LCAweDA4LCAweGJhLCAweGNiLCAweGVmLCAweDY3LCAweDExLCAweDIyLAorCTB4NGIsIDB4YTEsIDB4MzQsIDB4NjIsIDB4ZTAsIDB4MTgsIDB4NzksIDB4NTAsIDB4N2IsIDB4YTMsIDB4OWUsIDB4YTQsCisJMHhkZiwgMHg4MSwgMHg2NywgMHhkOCwgMHg0NiwgMHg1YiwgMHg1ZCwgMHhhOSwgMHhmZSwgMHg0YSwgMHg5NSwgMHgwOCwKKwkweDZjLCAweDU5LCAweDBhLCAweDkxLCAweDM0LCAweDc4LCAweDFhLCAweGMzLCAweDc3LCAweDM4LCAweGZmLCAweDA5LAorCTB4ZTgsIDB4ZjMsIDB4MmMsIDB4OWUsIDB4NWYsIDB4MDAsIDB4NWYsIDB4MWIsIDB4NjUsIDB4ZDIsIDB4OWQsIDB4NGMsCisJMHgxYywgMHg1NywgMHhiZSwgMHg4YiwgMHg2YiwgMHg5NywgMHhiNSwgMHhjYywgMHhkNywgMHhlNCwgMHhiYywgMHhlMiwKKwkweGVmLCAweDEzLCAweGFjLCAweDlkLCAweGExLCAweGE3LCAweGViLCAweGUxLCAweDZmLCAweGYyLCAweDNhLCAweGY5LAorCTB4ZjMsIDB4ZDYsIDB4NjcsIDB4Y2UsIDB4Y2EsIDB4NTgsIDB4MDksIDB4YzksIDB4OTYsIDB4NWYsIDB4NmEsIDB4ODUsCisJMHgyZCwgMHgyYiwgMHgzZSwgMHhlZiwgMHhlYiwgMHgzMSwgMHhlYiwgMHg0NiwgMHg0MSwgMHgwNywgMHhmYiwgMHgwMCwKKwkweGZiLCAweDk1LCAweDJlLCAweDQxLCAweDA3LCAweDZkLCAweGE3LCAweDEwLCAweDRkLCAweDNmLCAweDJlLCAweDJiLAorCTB4NGIsIDB4ZmYsIDB4NTQsIDB4NmEsIDB4NGIsIDB4MDUsIDB4YTksIDB4MmYsIDB4ZmQsIDB4MjMsIDB4MzksIDB4YjcsCisJMHhkNCwgMHg5MiwgMHgwYiwgMHgyOSwgMHgxNSwgMHg5MywgMHhhYywgMHgwZSwgMHhlNSwgMHhjZiwgMHg3MiwgMHhhMywKKwkweDg3LCAweDA3LCAweDkzLCAweGUzLCAweDk3LCAweDIwLCAweGMwLCAweDk1LCAweGFhLCAweDQ3LCAweGZiLCAweDU0LAorCTB4MWIsIDB4ZWQsIDB4MTcsIDB4NjAsIDB4NmIsIDB4YWYsIDB4NTgsIDB4YTQsIDB4N2YsIDB4NGMsIDB4NmEsIDB4NjUsCisJMHhkMiwgMHhmZSwgMHhhMCwgMHhhMiwgMHhmZCwgMHhjMCwgMHgyNiwgMHhlZCwgMHg5MiwgMHgwYiwgMHg1OSwgMHhhNCwKKwkweDdmLCAweDI3LCAweGRhLCAweDgxLCAweGYzLCAweGZiLCAweDQ5LCAweDdmLCAweDAyLCAweGNmLCAweDdlLCAweGQwLAorCTB4ZmUsIDB4NmEsIDB4ZWUsIDB4NmIsIDB4YWQsIDB4OGQsIDB4NzIsIDB4NDQsIDB4ZDEsIDB4MWMsIDB4NGEsIDB4OGYsCisJMHg0MSwgMHgzZSwgMHhhZiwgMHhiNSwgMHhkNiwgMHg1ZCwgMHhmYSwgMHgxMSwgMHhiZSwgMHhiYiwgMHhmNywgMHgyMCwKKwkweDQ2LCAweGY1LCAweDYxLCAweGFmLCAweDVlLCAweGM5LCAweGNmLCAweDQ2LCAweDExLCAweDI3LCAweGM3LCAweGExLAorCTB4ZGIsIDB4MmUsIDB4ZTUsIDB4ODcsIDB4MDgsIDB4MTcsIDB4ZDAsIDB4ZDksIDB4MzQsIDB4ZTYsIDB4MWYsIDB4YTIsCisJMHhiZiwgMHgyOSwgMHhiOSwgMHgzOCwgMHg5MCwgMHg0YiwgMHhiMSwgMHg5YywgMHg4ZSwgMHhhMCwgMHhmZSwgMHhjNywKKwkweDNlLCAweDg2LCAweDkzLCAweDczLCAweGY5LCAweGNjLCAweDAwLCAweDYyLCAweDFhLCAweGZmLCAweDdmLCAweDY0LAorCTB4N2IsIDB4MjgsIDB4MjAsIDB4ZDYsIDB4NDIsIDB4ZTcsIDB4M2QsIDB4OTAsIDB4MWYsIDB4ZTgsIDB4MTgsIDB4OWIsCisJMHg0MSwgMHg2ZSwgMHg0ZCwgMHgwZSwgMHhkNywgMHg1NCwgMHg3ZiwgMHg5MSwgMHg3MSwgMHhlNSwgMHgyOCwgMHhmMiwKKwkweGU5LCAweDIxLCAweDdjLCAweGJjLCAweGZkLCAweDI2LCAweDlhLCAweGRjLCAweDczLCAweDNiLCAweDRmLCAweDQ1LAorCTB4NzcsIDB4N2QsIDB4MmYsIDB4MDEsIDB4NTIsIDB4YTYsIDB4YzksIDB4N2QsIDB4MGIsIDB4MTIsIDB4NGEsIDB4ODcsCisJMHhiMCwgMHgyZiwgMHhjNywgMHg3YSwgMHgxMCwgMHg2MywgMHgwNiwgMHhhMiwgMHhkOSwgMHhlNiwgMHhjZiwgMHgzMSwKKwkweDRlLCAweDVmLCAweDY2LCAweDdjLCAweDBmLCAweDY4LCAweDFmLCAweGM1LCAweDlhLCAweDhjLCAweGJiLCAweDYzLAorCTB4ZTAsIDB4OTksIDB4MzUsIDB4MjYsIDB4ZTMsIDB4MjYsIDB4ZjIsIDB4NDgsIDB4ZTMsIDB4NDcsIDB4Y2MsIDB4MmQsCisJMHhmOCwgMHgzZSwgMHhlMCwgMHg3ZiwgMHhlNywgMHg3ZCwgMHg4OSwgMHhkZSwgMHg5YywgMHgzNiwgMHhhYiwgMHgwNSwKKwkweDMxLCAweGIxLCAweDI3LCAweDc0LCAweDZlLCAweGM1LCAweGE1LCAweGQ4LCAweDMwLCAweDVmLCAweDIwLCAweDY2LAorCTB4ZDQsIDB4MjksIDB4ODMsIDB4MzUsIDB4Y2EsIDB4ODksIDB4ZmQsIDB4MjcsIDB4ZDQsIDB4N2YsIDB4YjUsIDB4ZTcsCisJMHgyMSwgMHg4ZiwgMHhhOCwgMHhlYywgMHhiNSwgMHgwZSwgMHgyMiwgMHhhNiwgMHg4MCwgMHhmZSwgMHhjYSwgMHgxOCwKKwkweDc4LCAweDYzLCAweDhmLCAweDY2LCAweDEwLCAweGY5LCAweDJiLCAweDA0LCAweDIxLCAweGEwLCAweDk2LCAweDVhLAorCTB4MGIsIDB4YzksIDB4YmQsIDB4ZTEsIDB4MTEsIDB4YTMsIDB4MjgsIDB4OGYsIDB4NDYsIDB4NTgsIDB4MzYsIDB4MTcsCisJMHhkNiwgMHg5OCwgMHgwNywgMHhjMiwgMHhiMiwgMHhiMCwgMHgyNiwgMHg3MiwgMHg2OSwgMHg5MSwgMHg3MSwgMHg0NSwKKwkweGZkLCAweDQxLCAweGU2LCAweDg2LCAweDMzLCAweDhmLCAweDNjLCAweDViLCAweDVhLCAweDYyLCAweDhjLCAweDYxLAorCTB4OWMsIDB4YjgsIDB4MDEsIDB4YmEsIDB4NDgsIDB4N2UsIDB4ZTMsIDB4YWIsIDB4YzgsIDB4NDksIDB4YTUsIDB4ZjIsCisJMHgyMCwgMHg2MiwgMHhhNiwgMHhhYywgMHhlYiwgMHg5MCwgMHgyOSwgMHg3MiwgMHgxOSwgMHg2YiwgMHhkNCwgMHgxZCwKKwkweGZhLCAweDMyLCAweDQxLCAweDRmLCAweDI2LCAweDJhLCAweGM1LCAweDQ1LCAweGY2LCAweDYzLCAweGEyLCAweGEwLAorCTB4ODUsIDB4MzUsIDB4NzYsIDB4NDgsIDB4ZDUsIDB4M2YsIDB4MzcsIDB4YTgsIDB4ZDgsIDB4Y2EsIDB4ZmYsIDB4ZTEsCisJMHhiNiwgMHg3ZCwgMHg5MywgMHgyNywgMHhmNywgMHhlOSwgMHg4YywgMHg2MywgMHgzNywgMHg4YiwgMHgzZCwgMHg2MywKKwkweDc3LCAweDFkLCAweGE4LCAweDc0LCAweDQ4LCAweGI1LCAweDhmLCAweDc2LCAweDQ5LCAweGZkLCAweGJmLCAweGEwLAorCTB4NjIsIDB4ZWQsIDB4MDIsIDB4NzgsIDB4MmEsIDB4MmUsIDB4MTIsIDB4ZTMsIDB4ODYsIDB4MzEsIDB4MmYsIDB4ZTYsCisJMHhjZiwgMHhhMywgMHg1YywgMHhmZiwgMHg4OSwgMHhjYywgMHhlZCwgMHg3ZiwgMHgxNywgMHg3NCwgMHg3OSwgMHg3MSwKKwkweDJkLCAweGJmLCAweDFmLCAweGYxLCAweDc2LCAweDQ2LCAweDk3LCAweDNiLCAweGVmLCAweDFhLCAweGM3LCAweGIzLAorCTB4Y2MsIDB4ODEsIDB4ZWYsIDB4ZjgsIDB4NzgsIDB4OTIsIDB4NjMsIDB4ZWMsIDB4NjEsIDB4ODEsIDB4YmUsIDB4MTUsCisJMHgwMywgMHhmZiwgMHhmYiwgMHhhNCwgMHhiMCwgMHgxMiwgMHg4NSwgMHgxYywgMHg5MCwgMHg0YiwgMHg2YiwgMHhkZSwKKwkweDVhLCAweGFjLCAweDc3LCAweDRmLCAweDQyLCAweDQ3LCAweGZhLCAweGE5LCAweGE4LCAweDQ0LCAweDRlLCAweGY1LAorCTB4NDksIDB4ZjgsIDB4ZWIsIDB4ZGQsIDB4ZDIsIDB4ZjEsIDB4ZjUsIDB4MjEsIDB4MDksIDB4N2QsIDB4ZGQsIDB4NjQsCisJMHg0ZSwgMHg0ZiwgMHg5YywgMHg4MCwgMHhiZSwgMHhlNiwgMHg2NSwgMHg1YywgMHg5ZSwgMHg0NCwgMHhkZSwgMHg2MiwKKwkweDVlLCAweDU3LCAweDc2LCAweDZhLCAweGY0LCAweDRiLCAweDA4LCAweDA1LCAweGFiLCAweGZlLCAweDhjLCAweDJkLAorCTB4OGYsIDB4ZWUsIDB4ZmYsIDB4ODUsIDB4ZWEsIDB4MzMsIDB4MDEsIDB4YzMsIDB4OGIsIDB4ZmUsIDB4ZmMsIDB4OTQsCisJMHhkOCwgMHhjZCwgMHg3NywgMHgyMSwgMHg2YiwgMHhjMywgMHg3OSwgMHhlZCwgMHhkNiwgMHhhMCwgMHhhNiwgMHgxYywKKwkweDU2LCAweGZkLCAweGMyLCAweDQ3LCAweGY3LCAweDdiLCAweDM1LCAweDI1LCAweGYwLCAweGI4LCAweGU2LCAweGE4LAorCTB4OWEsIDB4MTIsIDB4ZjEsIDB4MzUsIDB4Y2MsIDB4NzksIDB4ZmQsIDB4YTIsIDB4NjMsIDB4YWYsIDB4YmMsIDB4MGMsCisJMHg0MiwgMHg0ZiwgMHhiNywgMHg4OCwgMHg3ZCwgMHgwOCwgMHg3ZSwgMHhmMSwgMHg5YywgMHgyYywgMHhlOSwgMHg2OSwKKwkweDRkLCAweGFkLCAweDE5LCAweDdhLCAweDg2LCAweDcxLCAweDhhLCAweGYxLCAweDhiLCAweDM2LCAweDllLCAweDRjLAorCTB4MTQsIDB4NjEsIDB4N2YsIDB4YTEsIDB4ZTcsIDB4MTksIDB4YTMsIDB4M2MsIDB4ZGIsIDB4OWUsIDB4NjgsIDB4OGIsCisJMHg3NSwgMHgwYiwgMHg5NSwgMHg3YiwgMHhhMCwgMHg0MywgMHhkNCwgMHhmMiwgMHgxNiwgMHhlMiwgMHg5YywgMHg4MSwKKwkweDVjLCAweDZlLCAweGYxLCAweGRhLCAweGViLCAweGUxLCAweGU1LCAweDYzLCAweDMxLCAweDc1LCAweDVkLCAweGFjLAorCTB4N2EsIDB4MTgsIDB4ZGMsIDB4NWIsIDB4OWYsIDB4NzUsIDB4MDcsIDB4NjIsIDB4NGMsIDB4OTMsIDB4NzQsIDB4NzAsCisJMHhkZiwgMHgwMSwgMHgwOSwgMHgzZCwgMHgxNywgMHg5MywgMHhmMCwgMHg3MywgMHhiNCwgMHgzZiwgMHgzMywgMHhlMSwKKwkweDQwLCAweDdlLCAweDBiLCAweDE2LCAweDMxLCAweGQwLCAweDBhLCAweGIwLCAweGM1LCAweGNkLCAweGEyLCAweGFmLAorCTB4MGMsIDB4YzAsIDB4NzcsIDB4Y2MsIDB4NzgsIDB4NTUsIDB4OTIsIDB4MTIsIDB4YWEsIDB4NDUsIDB4ZTUsIDB4YWQsCisJMHg0NSwgMHgzMywgMHg0MSwgMHg3YiwgMHgzOSwgMHg2YiwgMHg2MSwgMHhiYywgMHhkOSwgMHg3NSwgMHg3OSwgMHg1ZCwKKwkweDUxLCAweGMxLCAweGIxLCAweDJmLCAweDg3LCAweDgwLCAweDE5LCAweDg2LCAweDZkLCAweGJkLCAweDQ3LCAweDVlLAorCTB4ODcsIDB4YmUsIDB4NzMsIDB4NmEsIDB4ZWMsIDB4NjYsIDB4YWMsIDB4MGIsIDB4MWEsIDB4OWUsIDB4MzMsIDB4YzEsCisJMHgwMywgMHhkNywgMHhmZCwgMHgxZSwgMHhkNiwgMHg1NCwgMHhmOCwgMHhjYSwgMHhkOSwgMHg2MCwgMHg0ZCwgMHhiYSwKKwkweDQ4LCAweGRiLCAweGVkLCAweDgzLCAweGRkLCAweGUxLCAweGJhLCAweGQ5LCAweDIxLCAweGI5LCAweGQ5LCAweDg0LAorCTB4ZTgsIDB4OGIsIDB4OWYsIDB4OTEsIDB4YzEsIDB4ZmQsIDB4YmEsIDB4YzcsIDB4OGYsIDB4ZTIsIDB4OTEsIDB4NjMsCisJMHhlYywgMHhjNywgMHhkZCwgMHhhZSwgMHhmYywgMHg1MSwgMHg1ZiwgMHg4MywgMHhjZCwgMHgzYywgMHg0OCwgMHgxZCwKKwkweDIzLCAweGY3LCAweDIzLCAweDhmLCAweDMxLCAweDhlLCAweDg1LCAweDkwLCAweGM3LCAweGIyLCAweDRkLCAweDRmLAorCTB4ZWYsIDB4ZDUsIDB4MDcsIDB4ZmIsIDB4ZTUsIDB4YzksIDB4ZTcsIDB4NjgsIDB4NGYsIDB4YjgsIDB4YjcsIDB4NjksCisJMHg1MywgMHg0MSwgMHgwZiwgMHg5OCwgMHhmNywgMHgyYywgMHgzOSwgMHhmOSwgMHg2YywgMHg1MCwgMHg3MywgMHhiMCwKKwkweGJlLCAweDMyLCAweGUzLCAweDA3LCAweGMwLCAweDhmLCAweDdlLCAweDI3LCAweGUzLCAweDgxLCAweGFlLCAweDZjLAorCTB4MzcsIDB4NmYsIDB4NTksIDB4NWUsIDB4ZGQsIDB4NTEsIDB4NDksIDB4YjAsIDB4MmYsIDB4NmUsIDB4YjAsIDB4NGUsCisJMHhiMywgMHhlMywgMHg5ZSwgMHhiYywgMHg4YiwgMHgxOCwgMHgyYiwgMHgzNSwgMHg2NywgMHgxMSwgMHhhMywgMHgyMywKKwkweDcyLCAweDcxLCAweGQ2LCAweDg2LCAweGVlLCAweDNmLCAweDBiLCAweGJhLCAweDBlLCAweDc1LCAweDExLCAweDIzLAorCTB4NWYsIDB4OWMsIDB4NzUsIDB4NzAsIDB4N2QsIDB4NDgsIDB4ZDUsIDB4NjYsIDB4YTEsIDB4M2IsIDB4NjEsIDB4YzcsCisJMHhjZCwgMHg3ZSwgMHhmYSwgMHg5MSwgMHhhZiwgMHhhNywgMHg4NCwgMHg1NiwgMHg1YywgMHgzMiwgMHhiNSwgMHgxMiwKKwkweDYyLCAweGY2LCAweDY0LCAweDhhLCAweDM5LCAweGJlLCAweDUzLCAweGY1LCAweDRkLCAweGQ5LCAweGFmLCAweGM5LAorCTB4MmIsIDB4YmMsIDB4YjAsIDB4NGYsIDB4MmIsIDB4NTYsIDB4MTksIDB4ZTcsIDB4MGIsIDB4ZjEsIDB4MGUsIDB4MjEsCisJMHgwZSwgMHgxMSwgMHhhZCwgMHg2NiwgMHg1MSwgMHgyNywgMHg5YSwgMHg5YywgMHg1NywgMHhiZCwgMHg1OCwgMHgxMSwKKwkweGM3LCAweDNkLCAweDQyLCAweDE5LCAweDY4LCAweGY1LCAweGVhLCAweDNlLCAweGFkLCAweDUwLCAweDBkLCAweGM5LAorCTB4YzUsIDB4MTgsIDB4ZTksIDB4NGUsIDB4YTgsIDB4ZmEsIDB4N2QsIDB4YmYsIDB4YjIsIDB4YjUsIDB4MWUsIDB4ZTQsCisJMHgxMiwgMHhkOCwgMHg0YywgMHhlYSwgMHg5MywgMHhkOCwgMHg1NywgMHg4ZCwgMHhjMSwgMHhhNiwgMHhhOCwgMHg3YiwKKwkweGVhLCAweDVkLCAweGM1LCAweDQ4LCAweDVmLCAweGY3LCAweDNiLCAweGU1LCAweDRjLCAweGQwLCAweDUxLCAweDI2LAorCTB4N2UsIDB4ZWYsIDB4ZjQsIDB4ZjEsIDB4ZmIsIDB4YTIsIDB4NWYsIDB4MGYsIDB4M2QsIDB4MjYsIDB4YWMsIDB4NTMsCisJMHgxNiwgMHgyYSwgMHhhNCwgMHgwNSwgMHhmMSwgMHhkNiwgMHhkZCwgMHhjOSwgMHg5NiwgMHgyOCwgMHg0NywgMHgyZiwKKwkweGE2LCAweDFjLCAweDQ1LCAweDFkLCAweGEzLCAweGFmLCAweDE5LCAweGJlLCAweDBkLCAweGYwLCAweDZmLCAweDE0LAorCTB4ZjcsIDB4YmMsIDB4NWEsIDB4YWEsIDB4ZDgsIDB4OGMsIDB4YzAsIDB4ZGYsIDB4YTcsIDB4MjEsIDB4MjMsIDB4ZWEsCisJMHgwNiwgMHhmYSwgMHg1YiwgMHhlMywgMHg5OSwgMHgwYSwgMHhmNCwgMHhiNywgMHhmNiwgMHhmMiwgMHhmYiwgMHg3NiwKKwkweDFmLCAweDYzLCAweGRlLCAweGIwLCAweDNjLCAweDg5LCAweGYxLCAweDEzLCAweDY3LCAweDQ4LCAweGNmLCAweGI4LAorCTB4OGYsIDB4YzcsIDB4MTIsIDB4OTAsIDB4MDksIDB4NjMsIDB4ZmMsIDB4YTgsIDB4YmMsIDB4ZDUsIDB4NzAsIDB4MTQsCisJMHhmZSwgMHhkYiwgMHhiNywgMHg3ZiwgMHg0NiwgMHhlNiwgMHhkZCwgMHg1OSwgMHhlMCwgMHgzZiwgMHhjOCwgMHhkZiwKKwkweDQ4LCAweGMwLCAweDNmLCAweGUzLCAweDJhLCAweDNlLCAweDFlLCAweGZlLCAweDY4LCAweDM1LCAweDQ5LCAweGQ4LAorCTB4Y2IsIDB4ZDksIDB4ZjcsIDB4NWUsIDB4NjcsIDB4Y2UsIDB4ZGUsIDB4MGQsIDB4ZmMsIDB4ZjUsIDB4OTEsIDB4ZDYsCisJMHgwZiwgMHg3OSwgMHhlYiwgMHhmZiwgMHgxNywgMHhlOCwgMHhlYSwgMHg3MywgMHhkOCwgMHgyMywgMHgwYSwgMHhmYSwKKwkweGZhLCAweDI5LCAweGQzLCAweDBmLCAweDdiLCAweDRlLCAweGY3LCAweDllLCAweGJiLCAweGZmLCAweDNhLCAweGU5LAorCTB4MzIsIDB4YTQsIDB4MDEsIDB4OGMsIDB4NTAsIDB4NTAsIDB4NzksIDB4OTQsIDB4YjUsIDB4NjIsIDB4YzQsIDB4ZDcsCisJMHhkZiwgMHgzMSwgMHg2MCwgMHg2NywgMHhhZSwgMHgxYiwgMHhjNCwgMHhkZSwgMHg0ZSwgMHgyOSwgMHhmNCwgMHgwNSwKKwkweGY1LCAweDI3LCAweDYyLCAweGY2LCAweGU2LCAweDc4LCAweDUwLCAweGNmLCAweGYyLCAweGY5LCAweDk0LCAweDkzLAorCTB4MmYsIDB4YjMsIDB4NGYsIDB4YzgsIDB4NWMsIDB4YzAsIDB4MzEsIDB4NjUsIDB4ODcsIDB4MWYsIDB4NDIsIDB4YjcsCisJMHgwOSwgMHhjZiwgMHgyMCwgMHhkZCwgMHhmNywgMHgyOSwgMHhiYSwgMHgxZCwgMHg0NSwgMHgzNywgMHhmZCwgMHg4YiwKKwkweDY3LCAweDNhLCAweGVjLCAweGEzLCAweDA1LCAweDdkLCAweDMzLCAweGFlLCAweDA3LCAweDRjLCAweDAwLCAweDdkLAorCTB4N2YsIDB4MTcsIDB4M2EsIDB4ZmUsIDB4NGUsIDB4MDUsIDB4OTgsIDB4YTAsIDB4MDIsIDB4NGMsIDB4ODAsIDB4M2QsCisJMHhiZSwgMHgwZCwgMHgxZCwgMHg3ZiwgMHhhYiwgMHgwMiwgMHg0YywgMHg1MCwgMHg4OSwgMHhmYiwgMHgzZCwgMHgwYSwKKwkweDliLCAweDk4LCAweGZlLCAweDIzLCAweGRhLCAweDZlLCAweGQwLCAweDkzLCAweGI5LCAweGRhLCAweDJlLCAweDM5LAorCTB4Y2UsIDB4ZjksIDB4MDEsIDB4MzYsIDB4OGUsIDB4YzIsIDB4OGUsIDB4NzgsIDB4NmUsIDB4MTEsIDB4ZjQsIDB4M2IsCisJMHhmYywgMHgxYywgMHhkMSwgMHhlMCwgMHhiOSwgMHgwMCwgMHg3MiwgMHg0NCwgMHg4MywgMHhlNywgMHgxOCwgMHgyMywKKwkweGYxLCAweDEwLCAweDMwLCAweDYxLCAweDQ4LCAweGUyLCAweGMyLCAweDVlLCAweGVmLCAweGRjLCAweDE4LCAweGQ2LAorCTB4MWEsIDB4MWQsIDB4ODQsIDB4MjcsIDB4NzUsIDB4YTgsIDB4YmUsIDB4ZDYsIDB4NzEsIDB4ZDUsIDB4NmYsIDB4NDAsCisJMHg1YywgMHhhOCwgMHgwNiwgMHhiNSwgMHg1YiwgMHg1MiwgMHgyNiwgMHg5NiwgMHg4OCwgMHgzMywgMHg2NSwgMHhhZiwKKwkweDllLCAweDg2LCAweDBlLCAweDVjLCAweDYyLCAweGMzLCAweGNkLCAweGJlLCAweGY0LCAweDcwLCAweDFkLCAweDdiLAorCTB4MTYsIDB4MmQsIDB4OGYsIDB4YmUsIDB4ZTMsIDB4ZWUsIDB4ZDYsIDB4MzMsIDB4MDcsIDB4MTAsIDB4OWYsIDB4YTcsCisJMHhjYSwgMHgwOSwgMHg5OSwgMHgyYywgMHg3YiwgMHg5OCwgMHgwMCwgMHhmNSwgMHhjZiwgMHg1NSwgMHhmZCwgMHg1MSwKKwkweDliLCAweDdhLCAweDgwLCAweGZlLCAweDM2LCAweDZkLCAweDIzLCAweDcxLCAweDNlLCAweDQ1LCAweDE5LCAweDUzLAorCTB4ZmYsIDB4ZDMsIDB4YWEsIDB4NjcsIDB4N2QsIDB4YTAsIDB4ZWUsIDB4ZjUsIDB4ZTUsIDB4MjcsIDB4OTUsIDB4MmQsCisJMHg4NCwgMHgxOSwgMHg2NywgMHhhOCwgMHgzZiwgMHhjZiwgMHg4NywgMHg2MSwgMHgxNywgMHg3OSwgMHgzNywgMHg5MCwKKwkweDRiLCAweDNiLCAweDFlLCAweGY5LCAweGJjLCAweDI2LCAweGQ2LCAweDRlLCAweGUzLCAweGI5LCAweGI2LCAweGYxLAorCTB4Y2QsIDB4ZmIsIDB4M2UsIDB4YmQsIDB4ODgsIDB4N2QsIDB4OWIsIDB4M2QsIDB4MDYsIDB4YzYsIDB4YTksIDB4YWQsCisJMHhmMSwgMHgxMCwgMHhlYSwgMHg4NywgMHhiMCwgMHhiYSwgMHg4ZiwgMHgxOCwgMHhkZSwgMHg4OCwgMHg0OSwgMHhiNiwKKwkweDYxLCAweDg5LCAweDUzLCAweGU1LCAweDNjLCAweGY2LCAweDJkLCAweDE4LCAweDhmLCAweDllLCAweDkwLCAweGVjLAorCTB4NTIsIDB4YWYsIDB4ZTQsIDB4NjIsIDB4NjYsIDB4Y2EsIDB4OTYsIDB4YmYsIDB4MjcsIDB4MWIsIDB4Y2IsIDB4ODUsCisJMHgwNCwgMHhjZiwgMHgwZCwgMHgwYiwgMHgzMywgMHgxYSwgMHg5ZSwgMHg3YiwgMHgxOCwgMHhkNywgMHhhNCwgMHhkOSwKKwkweDkyLCAweGMzLCAweDY1LCAweGU2LCAweDlkLCAweDkxLCAweDc4LCAweDAzLCAweGY3LCAweDcyLCAweGIzLCAweGVjLAorCTB4ZDUsIDB4NTQsIDB4NjEsIDB4OTMsIDB4NjYsIDB4YTIsIDB4OGEsIDB4NzgsIDB4ZjAsIDB4NzIsIDB4OTksIDB4ZmIsCisJMHgwMSwgMHgxYiwgMHg5NSwgMHhkOSwgMHhjZiwgMHgwOSwgMHhlZSwgMHgzZiwgMHgwMSwgMHgxYywgMHg4OCwgMHg1OCwKKwkweDFkLCAweGYzLCAweGU3LCAweDI4LCAweDVlLCAweDZkLCAweDIzLCAweDJjLCAweDgxLCAweGFlLCAweDNiLCAweDY1LAorCTB4ZGQsIDB4OGYsIDB4YmIsIDB4YjUsIDB4YjIsIDB4ZDcsIDB4NDcsIDB4MzksIDB4NGIsIDB4N2EsIDB4ZGMsIDB4ZmYsCisJMHhkNSwgMHg1YSwgMHg4ZiwgMHhhMSwgMHgxNiwgMHhkYSwgMHhlNCwgMHhmNSwgMHg4ZiwgMHhiOSwgMHg4ZiwgMHg4MSwKKwkweGIwLCAweDJiLCAweDI3LCAweGRjLCAweDQwLCAweDI2LCAweGJjLCAweGNmLCAweDMxLCAweDllLCAweDhkLCAweGI2LAorCTB4NWEsIDB4NjcsIDB4YWQsIDB4ZjYsIDB4OWUsIDB4ZGYsIDB4ZjUsIDB4ZjQsIDB4Y2MsIDB4ZGUsIDB4YjgsIDB4MmQsCisJMHg2MywgMHhiZCwgMHhlNiwgMHhhMCwgMHgyNiwgMHhmNiwgMHg3YiwgMHg2NiwgMHg4NywgMHg0NiwgMHhiYywgMHg5ZSwKKwkweGQ5LCAweGZjLCAweGM4LCAweGY2LCAweDllLCAweGQ5LCAweGNmLCAweDZmLCAweGYzLCAweDdhLCAweDY2LCAweDE3LAorCTB4OWQsIDB4MjIsIDB4M2UsIDB4NWUsIDB4Y2YsIDB4NmMsIDB4ZjgsIDB4NzYsIDB4YWYsIDB4NjcsIDB4ZjYsIDB4ZjAsCisJMHhlZCwgMHg1ZSwgMHhjZiwgMHhlYywgMHg5MSwgMHgxMSwgMHhhZiwgMHg2NywgMHhmNiwgMHhmYiwgMHhiNywgMHg2ZiwKKwkweGVmLCAweDk5LCAweDNkLCAweDM2LCAweGIyLCAweGJkLCAweDY3LCAweDI2LCAweDEzLCAweGM4LCAweDc3LCAweDEzLAorCTB4NWIsIDB4M2QsIDB4YjMsIDB4ZjIsIDB4YzgsIDB4YjUsIDB4N2IsIDB4NjYsIDB4YWYsIDB4MDYsIDB4NzgsIDB4MWQsCisJMHhmYywgMHg4YywgMHg4MSwgMHg4NywgMHgxNCwgMHhmMCwgMHhmYSwgMHgyOCwgMHhmMCwgMHhmYSwgMHhhZiwgMHhlYiwKKwkweDU5LCAweDg3LCAweGMxLCAweGU3LCAweGNkLCAweDdlLCAweDVlLCAweGI4LCAweDFlLCAweGRjLCAweDdlLCAweGJiLAorCTB4ZmYsIDB4OGMsIDB4YTAsIDB4ZGUsIDB4NGQsIDB4ZjgsIDB4YjUsIDB4MGEsIDB4YjEsIDB4ZmIsIDB4MWUsIDB4YmYsCisJMHg2NiwgMHhmYiwgMHg2YiwgMHhkMSwgMHhhZCwgMHhmMywgMHhlYywgMHhmNiwgMHhmZiwgMHgzNywgMHhhMCwgMHhmNCwKKwkweDBlLCAweGYwLCAweDNjLCAweGY5LCAweDc5LCAweDBkLCAweGI1LCAweDFmLCAweGY5LCAweDQ3LCAweGEyLCAweGVmLAorCTB4YmUsIDB4ZTgsIDB4N2MsIDB4ZDUsIDB4MjIsIDB4YzYsIDB4N2YsIDB4MWMsIDB4YmUsIDB4NmEsIDB4ZWYsIDB4MGQsCisJMHhjOSwgMHgzYSwgMHhmYywgMHg5NiwgMHgzOSwgMHhlYSwgMHhhNCwgMHg2NCwgMHgzMSwgMHgzZiwgMHhhYiwgMHhlNiwKKwkweDI3LCAweDI2LCAweGI2LCAweGU2LCAweGE3LCAweDI2LCAweGJlLCAweGFhLCAweDZhLCAweDUyLCAweGYzLCAweDVmLAorCTB4ZTMsIDB4ZjMsIDB4MGQsIDB4NjUsIDB4ZGYsIDB4OTYsIDB4ODcsIDB4ZTEsIDB4OWQsIDB4NGEsIDB4ODAsIDB4YjcsCisJMHhjMiwgMHgzZSwgMHg3NiwgMHgzNiwgMHgxYywgMHhkYiwgMHg5ZCwgMHhjMCwgMHgzMywgMHhlNiwgMHg4YiwgMHhiNiwKKwkweDM0LCAweDE0LCAweDdlLCAweDBmLCAweGE1LCAweGNkLCAweDE3LCAweDczLCAweGFhLCAweDVlLCAweDMzLCAweDljLAorCTB4YmMsIDB4MWIsIDB4ZDQsIDB4ZGYsIDB4YTgsIDB4YTEsIDB4ODYsIDB4MDYsIDB4ZDUsIDB4ZjksIDB4OWIsIDB4YmUsCisJMHgzNiwgMHg4YywgMHgzYywgMHhkNiwgMHg1ZSwgMHg2MywgMHhiMywgMHhhZSwgMHhkNiwgMHhmZCwgMHhiYSwgMHhkYSwKKwkweDkwLCAweGJiLCAweGY3LCAweGI3LCAweDYzLCAweDczLCAweDk5LCAweGY4LCAweDViLCAweDBhLCAweDliLCAweGVmLAorCTB4NDIsIDB4NmQsIDB4NGUsIDB4ZWMsIDB4NGQsIDB4MWMsIDB4NDMsIDB4MGMsIDB4NDEsIDB4N2MsIDB4Y2UsIDB4N2UsCisJMHgwMSwgMHhlYiwgMHgxOSwgMHhlNiwgMHg0NiwgMHhkNiwgMHgzNywgMHgzMSwgMHg3YywgMHhmOCwgMHhiZSwgMHg0MSwKKwkweDgwLCAweGQxLCAweDNiLCAweGZjLCAweGY4LCAweGNlLCAweGJhLCAweDI4LCAweGMwLCAweDJhLCAweDc3LCAweDc1LAorCTB4N2IsIDB4YjUsIDB4ZDEsIDB4MmUsIDB4Y2QsIDB4YWIsIDB4M2YsIDB4MTMsIDB4ZmUsIDB4OWMsIDB4ZjAsIDB4MjYsCisJMHgxNiwgMHgwZSwgMHg2ZiwgMHg2MiwgMHhlMSwgMHg2ZCwgMHhlNywgMHgzMCwgMHhhMiwgMHhkZSwgMHg2ZCwgMHg1MCwKKwkweGU3LCAweDM5LCAweDNjLCAweGRmLCAweDExLCAweDRkLCAweDRmLCAweGYzLCAweDhjLCAweDA3LCAweDM4LCAweGM3LAorCTB4ZTIsIDB4OTksIDB4MGYsIDB4N2QsIDB4ZTksIDB4NDEsIDB4MmQsIDB4NWIsIDB4MzcsIDB4MTAsIDB4ZWYsIDB4OTksCisJMHg3ZiwgMHg5MCwgMHg2YiwgMHhjYiwgMHhjMSwgMHhkOSwgMHg2MiwgMHhhMCwgMHgyNywgMHhjYSwgMHg4ZSwgMHg2MywKKwkweDdmLCAweGFhLCAweGExLCAweGU2LCAweDRkLCAweDQ1LCAweGFjLCAweDQzLCAweGEwLCAweDY1LCAweDBhLCAweGZmLAorCTB4MDMsIDB4OTksIDB4ZGUsIDB4YTMsIDB4NzIsIDB4NWYsIDB4MjcsIDB4NmMsIDB4ZjYsIDB4NzgsIDB4ODUsIDB4ZDgsCisJMHhmNSwgMHg3MSwgMHg2OSwgMHhmOCwgMHhmOCwgMHg3NSwgMHg2NSwgMHhjOSwgMHhjMywgMHhhZSwgMHhlMSwgMHhlZCwKKwkweGQ4LCAweDM1LCAweGI1LCAweDIxLCAweDFlLCAweDhkLCAweDA3LCAweDc2LCAweGE0LCAweGQxLCAweDcwLCAweDVlLAorCTB4MTksIDB4MjIsIDB4NjYsIDB4MjUsIDB4OWQsIDB4Y2MsIDB4M2QsIDB4ZDMsIDB4ODgsIDB4ODEsIDB4Y2MsIDB4MzksCisJMHhjYywgMHgzNywgMHhjNCwgMHhhNSwgMHhkNywgMHhhMiwgMHg0ZiwgMHg4ZCwgMHgxZCwgMHhlZCwgMHhiMCwgMHhhMiwKKwkweGY4LCAweGNjLCAweDgzLCAweDhlLCAweDE5LCAweDNjLCAweDkzLCAweDk2LCAweDg1LCAweGQzLCAweDVmLCAweGQxLAorCTB4OWMsIDB4ZmEsIDB4M2MsIDB4ZTgsIDB4OTksIDB4NDIsIDB4YWUsIDB4YTMsIDB4MmQsIDB4MTUsIDB4MGMsIDB4Y2YsCisJMHg4ZSwgMHhkNiwgMHgxMSwgMHhmNywgMHg1ZCwgMHhjNiwgMHgwMiwgMHhkNCwgMHhhZSwgMHhhOCwgMHg0NywgMHhjYSwKKwkweDhjLCAweGJkLCAweDNjLCAweGViLCAweDBhLCAweDYyLCAweDJlLCAweGZiLCAweDI2LCAweGE4LCAweDU5LCAweDU5LAorCTB4YmIsIDB4MmUsIDB4NzIsIDB4ZGYsIDB4ZWQsIDB4YmEsIDB4YTgsIDB4YjksIDB4YzQsIDB4NWQsIDB4ODYsIDB4YjMsCisJMHhiZSwgMHg0NiwgMHhkYywgMHhmOCwgMHg1MSwgMHgzMSwgMHhhNCwgMHhlMSwgMHhiYywgMHgzYywgMHg0NCwgMHgxYywKKwkweDc5LCAweDNkLCAweGY4LCAweGQxLCAweDg0LCAweDM0LCAweGNkLCAweDE3LCAweGQ2LCAweGY1LCAweDc2LCAweGZjLAorCTB4ZTgsIDB4NjEsIDB4YzcsIDB4Y2MsIDB4ZGEsIDB4NDEsIDB4YWMsIDB4YzksIDB4ZGEsIDB4OGMsIDB4MzgsIDB4ZDEsCisJMHg0NCwgMHg5OCwgMHgxYiwgMHhjNCwgMHhiMywgMHg4MywgMHhlMCwgMHhjNywgMHhjMywgMHg4YSwgMHg1OSwgMHg2MCwKKwkweGM1LCAweGJmLCAweDAzLCAweGFjLCAweDU4LCAweDkyLCAweGY3LCAweGEyLCAweGM0LCAweDhhLCAweGI2LCAweDhmLAorCTB4MTUsIDB4MWQsIDB4ZDgsIDB4NzEsIDB4N2UsIDB4OWIsIDB4MWQsIDB4NmIsIDB4YWEsIDB4MDcsIDB4YzUsIDB4N2IsCisJMHg3OSwgMHg2MCwgMHhiZCwgMHhlYywgMHhhMiwgMHg3OSwgMHgxZCwgMHhmOCwgMHg1MCwgMHg5MywgMHg5OCwgMHgzYSwKKwkweGFmLCAweDBmLCAweGI3LCAweGFkLCAweDE5LCAweGUwLCAweGMwLCAweDdkLCAweDBhLCAweGRmLCAweGRkLCAweDU3LAorCTB4ZDksIDB4ODUsIDB4ZGEsIDB4NDQsIDB4ZTEsIDB4M2QsIDB4ZmYsIDB4OWMsIDB4MmYsIDB4N2MsIDB4ZDUsIDB4ZDksCisJMHg2NywgMHhiOCwgMHhlZCwgMHhlYywgMHg3MywgMHgwYiwgMHgxNywgMHhlMiwgMHgzOSwgMHhiZiwgMHhjNywgMHgxNywKKwkweDgxLCAweGRlLCAweGZlLCAweDA3LCAweDY5LCAweDgyLCAweDVmLCAweGQxLCAweDA3LCAweDM0LCAweGNmLCAweDRmLAorCTB4YjYsIDB4ZTEsIDB4YzMsIDB4ZmYsIDB4N2EsIDB4MTUsIDB4M2UsIDB4NDQsIDB4Y2UsIDB4NWEsIDB4ODksIDB4NDksCisJMHgwNiwgMHhkOCwgMHhkMCwgMHg1ZSwgMHhlMywgMHg1YSwgMHhmNCwgMHhlNSwgMHg1MSwgMHhlOSwgMHgwMCwgMHg3ZiwKKwkweDlkLCAweDhiLCAweDdkLCAweGMwLCAweDQ0LCAweGRkLCAweDEyLCAweDA1LCAweDM2LCAweDhhLCAweDI4LCAweDZjLAorCTB4MzQsIDB4NDQsIDB4MGMsIDB4MzMsIDB4N2MsIDB4MTgsIDB4OTgsIDB4YTYsIDB4YjEsIDB4ODksIDB4OGYsIDB4Y2MsCisJMHhkNCwgMHgwZiwgMHhhMCwgMHg5NywgMHg4NywgMHg5NSwgMHhhZCwgMHg4YywgMHhjYiwgMHg1MywgMHg4OCwgMHg5ZCwKKwkweDFkLCAweDZiLCAweGMwLCAweDc1LCAweDJiLCAweDFlLCAweDZlLCAweDhhLCAweDVjLCAweDg1LCAweDliLCAweDhlLAorCTB4ZWMsIDB4ODgsIDB4OWIsIDB4NTQsIDB4YmYsIDB4N2UsIDB4OWMsIDB4MzIsIDB4NzksIDB4ZGQsIDB4ZjUsIDB4ZmEsCisJMHhmNSwgMHg5NywgMHg1YywgMHhhZiwgMHg1ZiwgMHhmZiwgMHhiYSwgMHhkYiwgMHhkZSwgMHhhZiwgMHhiZiwgMHg0OSwKKwkweDhhLCAweDg2LCAweDY5LCAweDVmLCAweDk0LCAweGFiLCAweGZhLCAweGY1LCAweDMzLCAweGVjLCAweDdmLCAweDU3LAorCTB4YmIsIDB4YmMsIDB4YmUsIDB4N2MsIDB4YjcsIDB4ZGYsIDB4YWYsIDB4MzcsIDB4YTUsIDB4YjgsIDB4NmQsIDB4ZGMsCisJMHg5MCwgMHhiNywgMHhhZCwgMHhhMCwgMHg1ZiwgMHhmZiwgMHgyZiwgMHgzMCwgMHhkNiwgMHg4MywgMHgzZCwgMHhiNiwKKwkweGY3LCAweGVhLCAweDJmLCAweGI5LCAweGVjLCAweGQ1LCAweGM3LCAweDM4LCAweGNmLCAweGVmLCAweGQ1LCAweDczLAorCTB4MWUsIDB4NmEsIDB4NzgsIDB4OTcsIDB4N2QsIDB4ZmEsIDB4OWIsIDB4MjEsIDB4OGIsIDB4N2UsIDB4YzgsIDB4YTEsCisJMHg0ZiwgMHgzYSwgMHg5ZSwgMHg4YiwgMHg3MywgMHg4ZSwgMHhlYSwgMHhjZiwgMHg1ZiwgMHg3NCwgMHg2MywgMHg3OCwKKwkweGNlLCAweGViLCAweGEzLCAweDFmLCAweDg2LCAweDVkLCAweDFkLCAweGQ5LCAweGVjLCAweGNmLCAweDdiLCAweDdiLAorCTB4YmMsIDB4ZTEsIDB4NmUsIDB4NWYsIDB4N2YsIDB4ZmIsIDB4M2EsIDB4MDMsIDB4ZmUsIDB4M2EsIDB4MzEsIDB4YWMsCisJMHgxMywgMHhiZiwgMHg2YSwgMHg5ZCwgMHhhZCwgMHg3ZSwgMHhmYywgMHgxYiwgMHhhZSwgMHhkNywgMHg4YiwgMHg3NywKKwkweDRlLCAweDhiLCAweGRkLCAweDgxLCAweDk4LCAweGZjLCAweGUyLCAweGQwLCAweDhkLCAweGZlLCAweDFhLCAweDliLAorCTB4YmQsIDB4NzgsIDB4YzYsIDB4MGUsIDB4ZTAsIDB4NzUsIDB4YzYsIDB4MGYsIDB4M2UsIDB4ZmYsIDB4ZmYsIDB4YmUsCisJMHgxNywgMHhjZiwgMHgzZSwgMHhiYywgMHg3NywgMHg5ZSwgMHg0MiwgMHhmZiwgMHgwNCwgMHgyZSwgMHg3ZiwgMHhkNiwKKwkweGViLCAweGMxLCAweDRmLCAweDU0LCAweDgyLCAweGRlLCAweDNhLCAweGViLCAweGM2LCAweGUwLCAweGJkLCAweDhjLAorCTB4YzEsIDB4YzQsIDB4NzEsIDB4YTEsIDB4YWQsIDB4OTAsIDB4M2UsIDB4YWUsIDB4ZGIsIDB4MjMsIDB4NzMsIDB4MGEsCisJMHgxNywgMHhjMSwgMHhhNiwgMHg5MiwgMHhkNywgMHhjNiwgMHhjNiwgMHhiNSwgMHhjNSwgMHgwMCwgMHgxYiwgMHhjNywKKwkweDE0LCAweDM2LCAweGFlLCAweGFkLCAweDA1LCAweGQ4LCAweDM4LCAweDczLCAweDBkLCAweDZjLCAweGZjLCAweGRmLAorCTB4YmEsIDB4YmMsIDB4ZjgsIDB4MWYsIDB4OTUsIDB4ODIsIDB4YzIsIDB4YzYsIDB4ZDcsIDB4N2EsIDB4YzcsIDB4ODYsCisJMHhmNywgMHhiYSwgMHg4OSwgMHgwMywgMHhjNCwgMHgzYiwgMHgxNywgMHhlZiwgMHhiYiwgMHg4NiwgMHhhZiwgMHgwNSwKKwkweDc4LCAweDk5LCAweGI5LCAweGJlLCAweDVmLCAweDY2LCAweDllLCAweGRiLCAweGMyLCAweGNiLCAweDFlLCAweDI2LAorCTB4MzYsIDB4MTMsIDB4NDcsIDB4NTUsIDB4MmUsIDB4MDQsIDB4M2UsIDB4NjgsIDB4YjIsIDB4ZWYsIDB4N2QsIDB4NDgsCisJMHhkOSwgMHg2ZSwgMHhhOSwgMHgzMiwgMHhhYiwgMHg3MCwgMHg1OSwgMHgxZSwgMHhiNSwgMHg2ZCwgMHg1MSwgMHhlMSwKKwkweDYwLCAweDYyLCAweGUwLCAweDJlLCAweDkxLCAweGJlLCAweDIwLCAweDE3LCAweDA1LCAweDE4LCAweDMzLCAweGVjLAorCTB4YzcsIDB4NjcsIDB4OWUsIDB4MjksIDB4YmMsIDB4MWQsIDB4Y2EsIDB4MTAsIDB4MDMsIDB4YmIsIDB4NDEsIDB4OGQsCisJMHg0MCwgMHgzOSwgMHgwZiwgMHgyMywgMHg3NiwgMHgxOSwgMHhiZSwgMHhhYywgMHgzYywgMHg5ZiwgMHhkZCwgMHhiNywKKwkweGZmLCAweDg3LCAweGVmLCAweGRiLCAweDA2LCAweGUzLCAweDVhLCAweDgwLCAweDExLCAweDUxLCAweDAzLCAweDU1LAorCTB4YzYsIDB4ZDUsIDB4YmIsIDB4MGUsIDB4MWUsIDB4NDYsIDB4ZjQsIDB4ZjAsIDB4NjEsIDB4ZDYsIDB4OWQsIDB4MDEsCisJMHg0ZSwgMHg5ZSwgMHg5NSwgMHgwOSwgMHhlMCwgMHhmMywgMHhmNSwgMHhkZiwgMHg2NSwgMHhlZiwgMHgyOSwgMHhjMCwKKwkweDQ0LCAweDM2LCAweGZlLCAweGI3LCAweGY3LCAweGEyLCAweDc4LCAweGRkLCAweGExLCAweGNlLCAweGZlLCAweGNlLAorCTB4MGYsIDB4NDUsIDB4ZGIsIDB4YzYsIDB4ZmYsIDB4M2UsIDB4ZTIsIDB4MzcsIDB4ZWEsIDB4YTEsIDB4MGEsIDB4NzMsCisJMHgxZCwgMHhiMSwgMHhkMCwgMHg2ZiwgMHg0MCwgMHgwNywgMHg2MywgMHhkNywgMHhjMCwgMHg0MiwgMHg1NywgMHhlNywKKwkweDI2LCAweGU2LCAweGNiLCAweGFkLCAweGJjLCAweGU0LCAweDZjLCAweGU2LCAweDI1LCAweGVlLCAweGYxLCAweGViLAorCTB4NzIsIDB4MjcsIDB4YzcsIDB4NmMsIDB4MjMsIDB4NjIsIDB4NGQsIDB4ZTEsIDB4MzMsIDB4OGYsIDB4N2MsIDB4YmQsCisJMHgzZCwgMHgzNywgMHhjZCwgMHg1ZCwgMHg0NywgMHg2ZSwgMHg5YSwgMHg1MCwgMHhiOSwgMHg4OSwgMHhmNCwgMHhhMiwKKwkweDllLCAweDgzLCAweDRjLCAweGJlLCAweDBiLCAweDU5LCAweDdlLCAweDA3LCAweGI0LCAweGZmLCAweDExLCAweGY4LAorCTB4ZjksIDB4NDMsIDB4NjAsIDB4YWMsIDB4NmYsIDB4MDMsIDB4NjMsIDB4N2QsIDB4YWIsIDB4ZDIsIDB4ZmUsIDB4MGUsCisJMHhjMywgMHhiOCwgMHhiMCwgMHgwZSwgMHhmNCwgMHhlYSwgMHg2NiwgMHgwZiwgMHhjMywgMHgxZiwgMHg4NiwgMHg1NywKKwkweDM1LCAweGNhLCAweDg2LCAweDMzLCAweDU3LCAweDFlLCAweDMxLCAweGU2LCAweGJkLCAweGYzLCAweGQyLCAweDQ0LAorCTB4NGUsIDB4ZDIsIDB4ODgsIDB4MTEsIDB4Y2MsIDB4MTUsIDB4ZWEsIDB4M2EsIDB4Y2UsIDB4N2UsIDB4MjUsIDB4YjEsCisJMHg0MiwgMHg1ZCwgMHhkNSwgMHg5MywgMHg0MywgMHg1MiwgMHg2ZCwgMHg3OCwgMHhmOCwgMHg2YSwgMHhlMSwgMHg4YywKKwkweGI3LCAweGM2LCAweDljLCAweDhmLCAweGFmLCAweGYyLCAweDNlLCAweGJlLCAweGNhLCAweDM1LCAweDM2LCAweDEyLAorCTB4YWMsIDB4Y2YsIDB4MTcsIDB4NTIsIDB4ZGIsIDB4MzEsIDB4ZDUsIDB4NjEsIDB4MWYsIDB4NTMsIDB4Y2QsIDB4ZmYsCisJMHgxNSwgMHgzMSwgMHgxNSwgMHhmNywgMHhjYSwgMHhlMywgMHg5OSwgMHhjOSwgMHhhNSwgMHg4NCwgMHgxYywgMHg4MCwKKwkweDdjLCAweDI3LCAweGNhLCAweGQ0LCAweDkzLCAweDY5LCAweGMzLCAweDZlLCAweDNlLCAweDQ0LCAweDU3LCAweDhlLAorCTB4ZDIsIDB4NGIsIDB4MjgsIDB4ZTksIDB4ZTksIDB4NjksIDB4MTIsIDB4N2EsIDB4OWEsIDB4ZjgsIDB4YjUsIDB4ZjUsCisJMHg4ZCwgMHgxYSwgMHgzMywgMHhkZSwgMHgxYywgMHg4YiwgMHhlMiwgMHhmMywgMHg3ZiwgMHhhYSwgMHgyMywgMHhkMiwKKwkweDRmLCAweDNkLCAweDVkLCAweDhkLCAweGI5LCAweGFlLCAweDA3LCAweDdiLCAweDZkLCAweGM3LCAweDVkLCAweGI2LAorCTB4YzIsIDB4NWQsIDB4MWQsIDB4ZmUsIDB4OWMsIDB4OTksIDB4ODksIDB4NDksIDB4ZTgsIDB4ZjAsIDB4ZGYsIDB4NjMsCisJMHhjZSwgMHg5ZiwgMHhjMCwgMHhiNywgMHg3ZSwgMHg4OCwgMHg3OCwgMHhmZCwgMHhlZiwgMHhhMCwgMHg4YiwgMHg3ZiwKKwkweDhiLCAweGRhLCAweGUwLCAweDU1LCAweGU0LCAweDlmLCAweDFmLCAweDYwLCAweDZjLCAweDBiLCAweGM3LCAweGE4LAorCTB4MzMsIDB4ZmEsIDB4ZDEsIDB4OGMsIDB4OTUsIDB4OTgsIDB4MjgsIDB4YmEsIDB4ODksIDB4MDksIDB4MGYsIDB4N2YsCisJMHhmYywgMHhlYSwgMHg2ZiwgMHg2NiwgMHhhYywgMHgyOSwgMHhiZSwgMHhjMywgMHgwMCwgMHhmOSwgMHhmZSwgMHhmOSwKKwkweGRkLCAweDczLCAweDBhLCAweDdiLCAweDA0LCAweDk4LCAweDIzLCAweDY3LCAweDczLCAweGZmLCAweDkyLCAweDliLAorCTB4OWEsIDB4YTgsIDB4ZTEsIDB4ZTMsIDB4NjEsIDB4OWIsIDB4ZWYsIDB4ZDksIDB4MWUsIDB4YjYsIDB4NTksIDB4ZmEsCisJMHhlYiwgMHhkNCwgMHhiYiwgMHg4NywgMHg2YiwgMHgxZSwgMHg0ZSwgMHhkMywgMHhhZiwgMHhlYiwgMHhjMCwgMHgxYywKKwkweDM1LCAweGY4LCAweDY0LCAweGExLCAweDY5LCAweGFiLCAweGNmLCAweGYxLCAweDhhLCAweDZkLCAweDQ2LCAweDIwLAorCTB4MWYsIDB4ZjYsIDB4NTgsIDB4NGYsIDB4ZDEsIDB4MGIsIDB4NWQsIDB4ZDMsIDB4MjgsIDB4MTMsIDB4ODEsIDB4YmEsCisJMHg2NiwgMHhmYywgMHg5ZiwgMHhmOSwgMHhkNywgMHg0ZiwgMHhmYiwgMHhkNywgMHg0ZiwgMHhmOSwgMHhkNywgMHgyNywKKwkweDkxLCAweDc3LCAweDlmLCAweDU0LCAweGI5LCAweDkzLCAweGUzLCAweDFjLCAweDgzLCAweDcyLCAweDVkLCAweGFjLAorCTB4ODUsIDB4ZjUsIDB4Y2UsIDB4OGUsIDB4ZmUsIDB4YjQsIDB4NTUsIDB4OGQsIDB4NzksIDB4ZmUsIDB4NWMsIDB4NjgsCisJMHgzYSwgMHhmOCwgMHhmYywgMHg2MywgMHg3YywgMHgwZSwgMHhlMiwgMHgzMywgMHg4ZCwgMHhjZiwgMHg2MywgMHhmOCwKKwkweDZjLCAweGNhLCAweDU0LCAweGNiLCAweDU2LCAweGE4LCAweGEzLCAweDYxLCAweGM5LCAweDYyLCAweGJjLCAweDg4LAorCTB4M2EsIDB4MzQsIDB4OTMsIDB4N2EsIDB4NDQsIDB4OGEsIDB4ZjUsIDB4OTIsIDB4OTQsIDB4OTYsIDB4MzQsIDB4ZTksCisJMHhiNiwgMHhkMiwgMHg1MiwgMHhhYSwgMHgxZiwgMHg5MywgMHhlMywgMHg0YiwgMHhkZSwgMHhiOSwgMHg2MSwgMHg1NywKKwkweGRhLCAweGM2LCAweGRjLCAweDk2LCAweDNjLCAweDljLCAweDdhLCAweDVjLCAweGY0LCAweDNiLCAweDhmLCAweDYxLAorCTB4OWUsIDB4ZTgsIDB4YzUsIDB4ZDEsIDB4ZGIsIDB4ZDQsIDB4ZjksIDB4NTgsIDB4M2QsIDB4ZTUsIDB4YzksIDB4ZjgsCisJMHg4MCwgMHg2NSwgMHg5YiwgMHhjOCwgMHg1YiwgMHhjMywgMHg0ZiwgMHg2MiwgMHhlZCwgMHg4YywgMHg3YSwgMHgzZiwKKwkweDMwLCAweDJkLCAweDI3LCAweDRlLCAweDZmLCAweGVjLCAweGY1LCAweDYyLCAweGE5LCAweDY5LCAweGJjLCAweDgxLAorCTB4NGQsIDB4ZWIsIDB4ZTAsIDB4YzMsIDB4NDYsIDB4ZWMsIDB4OWIsIDB4ODIsIDB4OWQsIDB4MWYsIDB4NzEsIDB4YzMsCisJMHhkYSwgMHgwNCwgMHg2MiwgMHhlMCwgMHg4NCwgMHhhYiwgMHg2YSwgMHgzZCwgMHhjNCwgMHgyYSwgMHhjMywgMHg0OSwKKwkweDllLCAweDhhLCAweGUxLCAweDlhLCAweGVmLCAweGQwLCAweDIwLCAweDBmLCAweDJhLCAweDViLCAweGQ5LCAweDAwLAorCTB4OGUsIDB4ZDEsIDB4NTQsIDB4YmYsIDB4YWYsIDB4YjQsIDB4NzksIDB4MGUsIDB4YTQsIDB4ZmEsIDB4ZmYsIDB4NGUsCisJMHgzMiwgMHhhOSwgMHg0YiwgMHg3ZSwgMHg4YywgMHgzOCwgMHhkNiwgMHg1NiwgMHhiOSwgMHhhOCwgMHg1MSwgMHhiNiwKKwkweDNmLCAweGMxLCAweGRhLCAweGYwLCAweDc1LCAweDYxLCAweDVlLCAweGJiLCAweDA3LCAweGYzLCAweDA2LCAweDEwLAorCTB4N2YsIDB4NzEsIDB4YWYsIDB4MDksIDB4NWUsIDB4NGUsIDB4OTMsIDB4NTcsIDB4M2UsIDB4ODMsIDB4ZGEsIDB4YjYsCisJMHhmYSwgMHg0OSwgMHhiZCwgMHhiOCwgMHhlNCwgMHhkNywgMHg0NCwgMHhhYSwgMHg3NiwgMHg0OCwgMHg0OCwgMHg3ZCwKKwkweGYzLCAweGNjLCAweGM5LCAweGViLCAweDkzLCAweGQ0LCAweGRkLCAweDAwLCAweDNiLCAweGY0LCAweDYwLCAweDBlLAorCTB4ZWIsIDB4MDgsIDB4YzgsIDB4YzgsIDB4M2IsIDB4MjcsIDB4NTMsIDB4NjcsIDB4NjQsIDB4NDUsIDB4ZjcsIDB4OTMsCisJMHg3YSwgMHg2OSwgMHgyOSwgMHg4MywgMHg3MSwgMHhmNiwgMHhhNCwgMHhmMSwgMHhiZCwgMHhhYSwgMHgyYiwgMHhlYywKKwkweDdmLCAweDMxLCAweDc0LCAweDU4LCAweDFhLCAweGQ1LCAweDE2LCAweGU4LCAweDQ1LCAweDhlLCAweGRkLCAweDdiLAorCTB4NTgsIDB4NmEsIDB4ZDUsIDB4NzksIDB4NzksIDB4YTEsIDB4YmEsIDB4YjEsIDB4MGIsIDB4ZDgsIDB4MDksIDB4MzIsCisJMHgyNSwgMHhmZCwgMHgzZCwgMHgzZSwgMHhmZCwgMHg1NCwgMHg0MSwgMHgzMCwgMHgwZSwgMHg3OSwgMHg5ZSwgMHgyZSwKKwkweGM0LCAweGJkLCAweGJhLCAweDk2LCAweGI4LCAweGVkLCAweDI0LCAweGRmLCAweDFiLCAweDhjLCAweGYzLCAweDNkLAorCTB4YmUsIDB4MjMsIDB4Y2IsIDB4YjQsIDB4YzksIDB4OGIsIDB4ZjcsIDB4MmUsIDB4NTgsIDB4OWYsIDB4OTIsIDB4MGIsCisJMHhhOSwgMHgzZCwgMHhiMiwgMHg5MSwgMHg1MiwgMHhmNSwgMHgyZiwgMHhmMSwgMHgwMSwgMHg3YywgMHhkYiwgMHgzNCwKKwkweGQ2LCAweGU1LCAweDZlLCAweDM5LCAweDAxLCAweDNmLCAweGJkLCAweDkwLCAweGNhLCAweGE5LCAweGYzLCAweDliLAorCTB4ZTMsIDB4NGQsIDB4NjIsIDB4ZmIsIDB4NzksIDB4ZDYsIDB4NTQsIDB4YjIsIDB4YWUsIDB4N2EsIDB4NjAsIDB4YWQsCisJMHhkNiwgMHg2NCwgMHg4YSwgMHhiMSwgMHhhNywgMHg0MywgMHgzNiwgMHgxNCwgMHhkNiwgMHhmMiwgMHg3YSwgMHhlMywKKwkweDFiLCAweGIzLCAweDllLCAweDZmLCAweDg0LCAweDk0LCAweGJkLCAweGZmLCAweDFiLCAweGQwLCAweDcxLCAweDBjLAorCTB4MzYsIDB4MWIsIDB4NTEsIDB4NzMsIDB4NDIsIDB4ZTksIDB4NGUsIDB4N2YsIDB4OGUsIDB4YzIsIDB4NjYsIDB4NmQsCisJMHg3MywgMHhjNiwgMHhjNywgMHgzMywgMHg5NiwgMHhmMSwgMHhhOSwgMHg4YywgMHgzNSwgMHgzNiwgMHhlMSwgMHhmNSwKKwkweDUzLCAweDRjLCAweGMzLCAweGQ2LCAweDJlLCAweGI2LCAweDgyLCAweGY3LCAweDRkLCAweGE2LCAweGUwLCAweDRmLAorCTB4MmYsIDB4NmQsIDB4NjIsIDB4NjMsIDB4MTgsIDB4ZTcsIDB4ZjMsIDB4MGIsIDB4ZDAsIDB4NmIsIDB4NTgsIDB4M2EsCisJMHg0ZSwgMHhiNSwgMHhlZSwgMHg5OSwgMHg0YiwgMHg4ZCwgMHgyNCwgMHg4ZSwgMHgwOCwgMHhkZiwgMHgzMCwgMHg2MiwKKwkweGZkLCAweDZjLCAweDgyLCAweGRhLCAweDA1LCAweGU0LCAweGMzLCAweDJiLCAweGM0LCAweDA4LCAweGMzLCAweGU3LAorCTB4ZTUsIDB4Y2EsIDB4M2QsIDB4OTksIDB4ZDQsIDB4N2UsIDB4YWQsIDB4MzYsIDB4OGIsIDB4ZWEsIDB4ZTQsIDB4ZjksCisJMHgyOSwgMHhlNiwgMHhkMywgMHhhMywgMHhlYywgMHg3ZCwgMHg4NiwgMHg0ZSwgMHhiZCwgMHhhZCwgMHgzOSwgMHg2NSwKKwkweGY1LCAweDhlLCAweDM5LCAweGY0LCAweGQyLCAweGQyLCAweGU2LCAweDIxLCAweDM3LCAweDNjLCAweDNmLCAweGMzLAorCTB4MDQsIDB4YTgsIDB4NWIsIDB4ODMsIDB4MDksIDB4NDcsIDB4NzIsIDB4ZWMsIDB4NzEsIDB4NDksIDB4N2UsIDB4NTksCisJMHhmNiwgMHg2NSwgMHgxMCwgMHg0NywgMHhlZCwgMHg5OSwgMHgwZSwgMHg5OSwgMHg2ZiwgMHgxOCwgMHhjZSwgMHhlMCwKKwkweGUyLCAweDUxLCAweGFjLCAweDMxLCAweDg3LCAweGI1LCAweGE2LCAweDUxLCAweDgzLCAweGNjLCAweDIyLCAweDI3LAorCTB4NTMsIDB4YWUsIDB4OGMsIDB4ZDUsIDB4MGYsIDB4NDMsIDB4NDYsIDB4MzcsIDB4ZjEsIDB4Y2MsIDB4NzgsIDB4M2MsCisJMHgyNywgMHhlNiwgMHg0YywgMHg0MSwgMHhhZCwgMHhmYiwgMHg5ZSwgMHg5NiwgMHgxZiwgMHhmZCwgMHgxOCwgMHg3MiwKKwkweDVhLCAweDU4LCAweDBlLCAweDI0LCAweDQ1LCAweDlmLCAweDRlLCAweDg2LCAweGRmLCAweDlmLCAweGIzLCAweDM4LAorCTB4MTYsIDB4ZTUsIDB4OTgsIDB4OGUsIDB4YjEsIDB4ZjAsIDB4ZTcsIDB4OTIsIDB4NTEsIDB4M2QsIDB4OTMsIDB4MzQsCisJMHhjNywgMHhkOSwgMHhlZiwgMHgwZCwgMHg1OSwgMHg3MywgMHgxMiwgMHg3YSwgMHhiZSwgMHhiNywgMHg0NywgMHhiYSwKKwkweGE3LCAweGE1LCAweDc3LCAweGQ1LCAweDFjLCAweDdmLCAweDFkLCAweGI0LCAweDg0LCAweDU1LCAweDZjLCAweDlmLAorCTB4MTMsIDB4ZGQsIDB4MWYsIDB4ZWYsIDB4ZDksIDB4MWMsIDB4MGYsIDB4ZmIsIDB4ZTMsIDB4ZDMsIDB4ZDIsIDB4YmQsCisJMHgzYSwgMHg2MiwgMHhiYywgMHgyOSwgMHg4NywgMHhiMSwgMHg2NiwgMHg0OCwgMHgyZSwgMHhhMSwgMHhhNiwgMHhiMSwKKwkweDg2LCAweGU2LCAweGUwLCAweDczLCAweDBmLCAweDkxLCAweDk2LCAweDgzLCAweGMwLCAweDE0LCAweGYwLCAweDA5LAorCTB4ZDQsIDB4ZDksIDB4ZDYsIDB4MjcsIDB4ZTUsIDB4NGIsIDB4NDYsIDB4OTcsIDB4ZTQsIDB4NTUsIDB4NGQsIDB4MWIsCisJMHhmNiwgMHg3YSwgMHhhNSwgMHhiMCwgMHhmMywgMHg1YiwgMHg4NywgMHhhNiwgMHg3NywgMHg3YiwgMHhmZCwgMHgwMCwKKwkweDllLCAweDY3LCAweDhjLCAweDYyLCAweGVjLCAweDRhLCAweDZiLCAweGM1LCAweGUyLCAweDE4LCAweGVmLCAweDVkLAorCTB4NjksIDB4ZDUsIDB4YWQsIDB4MTEsIDB4MjMsIDB4YWIsIDB4NDUsIDB4ZmQsIDB4NzMsIDB4ZWQsIDB4NzksIDB4YzUsCisJMHg3YiwgMHhhMSwgMHgzYSwgMHg2OCwgMHhkNCwgMHhlNCwgMHgxNiwgMHgyZCwgMHg3YiwgMHgwMywgMHhmMiwgMHg4MywKKwkweGZiLCAweDE5LCAweGNjLCAweGJkLCAweGQyLCAweGNhLCAweDU4LCAweGYzLCAweGFhLCAweDdmLCAweDVmLCAweDkzLAorCTB4ZTAsIDB4OWEsIDB4ZWIsIDB4OGMsIDB4MTgsIDB4OTMsIDB4ZWEsIDB4ZDksIDB4MTEsIDB4ZTMsIDB4ODQsIDB4ZDYsCisJMHhmZSwgMHhhYywgMHhhMSwgMHg0ZCwgMHg2ZSwgMHg3YiwgMHhiNiwgMHg1YiwgMHhjOSwgMHgyOCwgMHg2NCwgMHg3OSwKKwkweDczLCAweDRhLCAweGQ1LCAweDY5LCAweDc5LCAweGRhLCAweGU1LCAweGJjLCAweDJiLCAweGFkLCAweGFjLCAweDE1LAorCTB4ZDEsIDB4NGUsIDB4ZGMsIDB4YzAsIDB4MTgsIDB4YzgsIDB4YjksIDB4OTcsIDB4YWYsIDB4ZGEsIDB4ODcsIDB4ZDcsCisJMHhkNywgMHhkYSwgMHhlMywgMHg1ZCwgMHhkOSwgMHhiZSwgMHhjNywgMHgyZSwgMHgzNSwgMHhlNywgMHg4MiwgMHg5YSwKKwkweDEzLCAweDU2LCAweGIyLCAweGRlLCAweGJlLCAweGNmLCAweGNmLCAweDY0LCAweGZiLCAweDNlLCAweGRkLCAweDliLAorCTB4M2MsIDB4OTcsIDB4YjAsIDB4ZTYsIDB4OTMsIDB4OTgsIDB4NWIsIDB4NzYsIDB4MDcsIDB4ZTMsIDB4NzUsIDB4YjksCisJMHhkYywgMHhjYSwgMHg1YiwgMHgxNywgMHhlNSwgMHhjMiwgMHhlNiwgMHhkYSwgMHhiZiwgMHhjMiwgMHg3NSwgMHgzYiwKKwkweDRkLCAweGJmLCAweGYyLCAweDY5LCAweGU0LCAweDc3LCAweDhlLCAweDNkLCAweGFhLCAweGU0LCAweGJkLCAweGRiLAorCTB4MWEsIDB4M2MsIDB4NTgsIDB4ZDMsIDB4Y2MsIDB4ZjEsIDB4OWYsIDB4MDksIDB4NzUsIDB4NzUsIDB4NDQsIDB4YzUsCisJMHg5OCwgMHhkYiwgMHhhMCwgMHhhNywgMHg3ZCwgMHhjZiwgMHhjMCwgMHg2NywgMHg0NywgMHg2ZCwgMHgzNSwgMHhlNywKKwkweDkyLCAweDM1LCAweDJkLCAweGZiLCAweDRlLCAweDBkLCAweDFhLCAweDk3LCAweDEwLCAweGRiLCAweDljLCAweDE4LAorCTB4YWYsIDB4NTEsIDB4MmIsIDB4NTksIDB4N2MsIDB4MjcsIDB4ZmUsIDB4NGUsIDB4ZDYsIDB4MDEsIDB4ZDAsIDB4ZTUsCisJMHhlMCwgMHhmMCwgMHhjZiwgMHhlNCwgMHhhOCwgMHg5YywgMHhhOCwgMHgxYywgMHg0MywgMHgyZSwgMHg5YywgMHg5MywKKwkweGUxLCAweDY3LCAweDkwLCAweDM3LCAweDJhLCAweDA1LCAweDNjLCAweDQ5LCAweDlmLCAweGY1LCAweDcyLCAweGUwLAorCTB4OWMsIDB4N2EsIDB4Y2YsIDB4ZmMsIDB4MjQsIDB4ZWEsIDB4NjQsIDB4ZDgsIDB4NmUsIDB4NzksIDB4NzAsIDB4NzgsCisJMHgwNSwgMHhjZiwgMHhiYywgMHhhMCwgMHg3MCwgMHhhOCwgMHgyYiwgMHgwZCwgMHhmOCwgMHg0MCwgMHhlMiwgMHhmOSwKKwkweDNkLCAweGIyLCAweGZiLCAweDAxLCAweGRhLCAweDIyLCAweDMyLCAweGZkLCAweDZkLCAweDExLCAweGY1LCAweGVlLAorCTB4YmQsIDB4NmUsIDB4NzUsIDB4OGEsIDB4ZWMsIDB4YTUsIDB4ZGQsIDB4MzQsIDB4NjEsIDB4NjMsIDB4NzMsIDB4ZGUsCisJMHg5OSwgMHhkNiwgMHhiNiwgMHg2YiwgMHg3MywgMHhlNiwgMHhhMiwgMHhhYywgMHgyYSwgMHhmYiwgMHhiYiwgMHg3ZCwKKwkweGQ1LCAweGZiLCAweDNmLCAweGJhLCAweDhhLCAweDcyLCAweDM4LCAweDM5LCAweDJkLCAweDc3LCAweGFjLCAweDdhLAorCTB4ZjYsIDB4NTYsIDB4NWEsIDB4M2EsIDB4YWEsIDB4ZTQsIDB4M2EsIDB4YTcsIDB4ZTQsIDB4ZGEsIDB4OTIsIDB4YzMsCisJMHgyOSwgMHhjYSwgMHg5YywgMHhiYywgMHhmMCwgMHhiZCwgMHg0MCwgMHg0ZiwgMHgxNiwgMHhmNywgMHhmYiwgMHhmNiwKKwkweDMzLCAweGY4LCAweDBjLCAweDdmLCAweDU3LCAweDQyLCAweGQ5LCAweGIwLCAweGVlLCAweGJlLCAweDdmLCAweDM3LAorCTB4Y2YsIDB4NTksIDB4ZjcsIDB4YWQsIDB4OTIsIDB4Y2YsIDB4MWIsIDB4YjcsIDB4ZjEsIDB4ZjksIDB4MTQsIDB4NjIsCisJMHhlYSwgMHhkMCwgMHg5MCwgMHhjNywgMHhlYiwgMHhhYiwgMHg0YiwgMHgxZiwgMHhjZSwgMHhlYiwgMHgzNywgMHgzNywKKwkweDc5LCAweDBkLCAweDQ5LCAweDQzLCAweGQ1LCAweGFmLCAweDVkLCAweGJkLCAweGQyLCAweDhkLCAweGE4LCAweDA3LAorCTB4N2IsIDB4ZjgsIDB4MDksIDB4ZjYsIDB4OWEsIDB4MTIsIDB4ZDIsIDB4ZTAsIDB4ZWQsIDB4YjcsIDB4ZTEsIDB4OTIsCisJMHg5NiwgMHg4MCwgMHg3NiwgMHhkMiwgMHg3MywgMHg5ZiwgMHhhZiwgMHgyZiwgMHhlZSwgMHg3ZiwgMHg3NCwgMHhjNywKKwkweDdiLCAweDk3LCAweGM0LCAweDcwLCAweDg2LCAweDMxLCAweGE2LCAweDJiLCAweDlkLCAweDY1LCAweDdkLCAweGZmLAorCTB4OWEsIDB4MTYsIDB4NWQsIDB4ZTksIDB4Y2MsIDB4ZGUsIDB4ZDQsIDB4ZDksIDB4ZWIsIDB4ZDAsIDB4NTksIDB4NWQsCisJMHg3ZSwgMHgxMywgMHhiYywgMHhjMCwgMHg5ZiwgMHg5ZiwgMHgxOSwgMHgzMSwgMHgwZSwgMHgxMywgMHg1YiwgMHgxOCwKKwkweDVjLCAweDBmLCAweDMxLCAweGQ0LCAweGQ3LCAweDVkLCAweGM3LCAweDQ3LCAweGQwLCAweGRkLCAweDliLCAweGEyLAorCTB4ZjQsIDB4MDcsIDB4N2UsIDB4OTAsIDB4N2YsIDB4ZDQsIDB4ZjMsIDB4OGMsIDB4NjEsIDB4ZTQsIDB4YTksIDB4NDMsCisJMHhmOSwgMHgzZSwgMHg2OSwgMHg1MywgMHg2NywgMHhmYywgMHgzMywgMHg5ZSwgMHgzZSwgMHg5NSwgMHg2ZiwgMHhmYiwKKwkweGZhLCAweGNjLCAweGNkLCAweDUwLCAweDY3LCAweGU2LCAweDZlLCAweDRmLCAweDdmLCAweDlkLCAweDZhLCAweGNlLAorCTB4NjIsIDB4MzIsIDB4YTEsIDB4ZmMsIDB4ZGEsIDB4MWEsIDB4YmEsIDB4NjUsIDB4MzcsIDB4NzUsIDB4ZjgsIDB4YjQsCisJMHhlYiwgMHhmZCwgMHgyZiwgMHhiYiwgMHhkMywgMHhiMiwgMHhlOCwgMHg3ZSwgMHg5OCwgMHgxZSwgMHgzZCwgMHgxZCwKKwkweDRlLCAweDg4LCAweGU3LCAweDNmLCAweDU3LCAweGViLCAweDRmLCAweDVmLCAweDBkLCAweDJiLCAweDViLCAweDlkLAorCTB4ODAsIDB4ZWMsIDB4NGUsIDB4NTYsIDB4M2UsIDB4ZTYsIDB4ZGIsIDB4YjcsIDB4YzcsIDB4ZWIsIDB4ZDAsIDB4ODcsCisJMHhmMCwgMHg3YSwgMHhiOCwgMHgzYywgMHg2OCwgMHhiYywgMHg4ZCwgMHhiNSwgMHgyNiwgMHgxNSwgMHg4NiwgMHg4YiwKKwkweDg4LCAweGUzLCAweGYzLCAweDlhLCAweGQ4LCAweGU0LCAweDM1LCAweGEwLCAweGNkLCAweDliLCAweDk3LCAweDY1LAorCTB4NWQsIDB4ZWEsIDB4MzIsIDB4M2UsIDB4M2QsIDB4YWEsIDB4ZGUsIDB4YmYsIDB4N2YsIDB4YTMsIDB4Y2MsIDB4YjgsCisJMHgwYywgMHhjYywgMHgxMywgMHhlYiwgMHg5MywgMHg0YiwgMHg4ZCwgMHg4NCwgMHg1YywgMHgyMiwgMHg5NiwgMHgxOCwKKwkweGMzLCAweDdmLCAweGY3LCAweDk4LCAweDlmLCAweDliLCAweGEzLCAweGYyLCAweDY2LCAweGI5LCAweGJkLCAweDU2LAorCTB4MWMsIDB4OTUsIDB4ZDcsIDB4Y2IsIDB4NDEsIDB4YmQsIDB4NDgsIDB4MmMsIDB4Y2IsIDB4ZmMsIDB4M2YsIDB4MjcsCisJMHg2ZiwgMHgyZCwgMHgwZCwgMHhjYSwgMHhmYSwgMHgwYywgMHhmMiwgMHhmOCwgMHgxMCwgMHg2NSwgMHgzMCwgMHg2MiwKKwkweDdjLCAweDQ2LCAweGZkLCAweGJlLCAweGUyLCAweDRhLCAweGViLCAweGJjLCAweDg1LCAweDc1LCAweDk3LCAweDViLAorCTB4NzIsIDB4ODQsIDB4ZTcsIDB4ZDAsIDB4ZmMsIDB4ZGUsIDB4ZjgsIDB4MDQsIDB4NTYsIDB4ZTEsIDB4YmMsIDB4M2UsCisJMHhhOSwgMHgyZCwgMHhhMywgMHgyZSwgMHgyZiwgMHg3MywgMHg1ZCwgMHhjYSwgMHg2OSwgMHg1YSwgMHg3ZCwgMHg5ZiwKKwkweGM0LCAweDNlLCAweGY3LCAweGYzLCAweGJkLCAweGY0LCAweDE4LCAweDc1LCAweDcxLCAweGE1LCAweGI1LCAweDYxLAorCTB4ZjEsIDB4MWMsIDB4NzIsIDB4NGUsIDB4MWEsIDB4ZDAsIDB4ZDcsIDB4OTcsIDB4OTMsIDB4M2MsIDB4MjcsIDB4Y2YsCisJMHgwYiwgMHg3ZiwgMHg5ZiwgMHg1MiwgMHg2YiwgMHhjYywgMHhhMCwgMHgxNiwgMHhiOCwgMHhkMiwgMHg1YSwgMHhiMCwKKwkweDllLCAweDUyLCAweDdhLCAweDZhLCAweDU0LCAweDFmLCAweGYwLCAweGM3LCAweDc5LCAweGNkLCAweDdiLCAweDg2LAorCTB4YjMsIDB4NmYsIDB4ODgsIDB4ZjUsIDB4ZTcsIDB4MDMsIDB4YzgsIDB4ZmYsIDB4YWMsIDB4M2QsIDB4ODksIDB4YjcsCisJMHgyOCwgMHg4YiwgMHgwNCwgMHg2YSwgMHg1YywgMHhhZSwgMHhjNSwgMHhkZiwgMHgwNCwgMHgyNSwgMHg4NywgMHhmMywKKwkweDMyLCAweDA5LCAweDdhLCAweDgwLCAweGNiLCAweDVjLCAweGM2LCAweGZkLCAweDViLCAweDY1LCAweDIzLCAweGU2LAorCTB4YzUsIDB4NzcsIDB4YmUsIDB4YWYsIDB4YjUsIDB4ODEsIDB4OTgsIDB4YmYsIDB4YjEsIDB4MTksIDB4ZjMsIDB4ZmIsCisJMHg3MSwgMHg2ZCwgMHgzOCwgMHhhOSwgMHhhMSwgMHhmZiwgMHg4NCwgMHhmNSwgMHhkOSwgMHg3NywgMHg2MSwgMHhjYywKKwkweDFmLCAweGM3LCAweDdjLCAweDhlLCAweGY1LCAweDQ5LCAweDY5LCAweDU5LCAweDZjLCAweGY2LCAweDk5LCAweDZhLAorCTB4YzIsIDB4NzcsIDB4MzEsIDB4NzIsIDB4YjIsIDB4ZDgsIDB4MTgsIDB4OGMsIDB4OWYsIDB4ZDcsIDB4MWMsIDB4ZjUsCisJMHhjZSwgMHg0NiwgMHg3MiwgMHg4OCwgMHg3ZCwgMHhiNywgMHgzZSwgMHg2OSwgMHgyYywgMHg0YiwgMHgyMiwgMHg5NCwKKwkweDdlLCAweDQ4LCAweGRjLCAweDg2LCAweDg3LCAweGI5LCAweDE3LCAweDM0LCAweGY2LCAweGRmLCAweDZjLCAweDY5LAorCTB4NmMsIDB4OWYsIDB4NjMsIDB4ODQsIDB4ZDIsIDB4ODcsIDB4ZTQsIDB4MGYsIDB4ZmMsIDB4MzksIDB4OGUsIDB4OWEsCisJMHhmMywgMHgxZiwgMHg3NiwgMHhmMywgMHhlYywgMHhhYiwgMHhlMSwgMHhmNiwgMHg4MiwgMHgwNiwgMHhkMiwgMHg3NiwKKwkweDYzLCAweGZiLCAweGJlLCAweDg5LCAweGFkLCAweDdkLCAweGI5LCAweDI3LCAweDZhLCAweDk4LCAweGJkLCAweDM2LAorCTB4ZjYsIDB4N2QsIDB4MTUsIDB4Y2YsIDB4M2MsIDB4MDQsIDB4M2EsIDB4YWUsIDB4ODQsIDB4NzQsIDB4ZWIsIDB4MjEsCisJMHgyOSwgMHgzNiwgMHhhZSwgMHhkZSwgMHhhMywgMHg5ZCwgMHgwNiwgMHgzZSwgMHhjMywgMHhmNSwgMHhiOSwgMHhjZiwKKwkweDIxLCAweGQwLCAweDc3LCAweDQ1LCAweGQzLCAweGFkLCAweDQzLCAweDkwLCAweGE1LCAweGI3LCAweDQ3LCAweGU4LAorCTB4MzksIDB4ZDMsIDB4ZjgsIDB4YTEsIDB4MGMsIDB4ODksIDB4YmUsIDB4YTIsIDB4MjksIDB4ZjksIDB4ZWIsIDB4YjUsCisJMHg1MSwgMHgzOCwgMHhjNCwgMHg5NCwgMHg3NCwgMHhhZiwgMHhjZCwgMHg0YSwgMHg2OCwgMHg4ZCwgMHgzZCwgMHgwMCwKKwkweGRhLCAweDIyLCAweGY1LCAweGI4LCAweDBiLCAweDdlLCAweDJjLCAweDc2LCAweGQ4LCAweDIyLCAweGRlLCAweDY3LAorCTB4MWYsIDB4NzcsIDB4YjUsIDB4NTcsIDB4N2EsIDB4ODksIDB4ZjcsIDB4NTksIDB4MGYsIDB4MWMsIDB4YzQsIDB4N2YsCisJMHhkNiwgMHgwNCwgMHgyZiwgMHhiNSwgMHgzMiwgMHhhOSwgMHg3NywgMHg1NCwgMHhkZSwgMHhjYywgMHgzNywgMHg3OCwKKwkweGRmLCAweDRjLCAweDg4LCAweGYwLCAweDFlLCAweGUzLCAweDQzLCAweDlmLCAweDQ0LCAweGJlLCAweDNlLCAweDhjLAorCTB4OTgsIDB4OTAsIDB4MDMsIDB4NzYsIDB4YzYsIDB4YmEsIDB4YTcsIDB4ODYsIDB4MjQsIDB4ZWMsIDB4YmQsIDB4ZWIsCisJMHhhMCwgMHhmYSwgMHgyNSwgMHg2ZiwgMHgyZCwgMHg5YiwgMHhmZSwgMHhlZiwgMHg1MywgMHg2NCwgMHhkZiwgMHhmOSwKKwkweDE0LCAweDdiLCAweDlhLCAweDAzLCAweGIwLCAweDUzLCAweGQ2LCAweDIzLCAweGEyLCAweDZmLCAweGEwLCAweGRlLAorCTB4YmMsIDB4ZDQsIDB4ODgsIDB4ZjYsIDB4ZjIsIDB4N2QsIDB4Y2IsIDB4ZDcsIDB4NWQsIDB4NWMsIDB4MTMsIDB4YmIsCisJMHhjNywgMHgxNCwgMHg1NiwgMHhmNCwgMHhlZiwgMHhmMSwgMHgzYiwgMHhlYSwgMHhhMCwgMHg2ZCwgMHg5OCwgMHgzMiwKKwkweDAxLCAweDRjLCAweGM5LCAweDNhLCAweDY5LCAweGNhLCAweDdmLCAweGU3LCAweGNkLCAweDcwLCAweDRlLCAweDZjLAorCTB4YWIsIDB4OTUsIDB4ODYsIDB4NjUsIDB4MDMsIDB4MzgsIDB4NmIsIDB4ZGQsIDB4YjUsIDB4MTAsIDB4MDcsIDB4ZGYsCisJMHhkNiwgMHhlYSwgMHg2NSwgMHhmNSwgMHhiYiwgMHgzNCwgMHhlZCwgMHgwMSwgMHg2MCwgMHhhYywgMHg0NCwgMHg5ZiwKKwkweGFhLCAweDc1LCAweDRlLCAweDNlLCAweDIwLCAweDllLCAweGJkLCAweGMzLCAweGNhLCAweDU0LCAweGNjLCAweDVhLAorCTB4YWYsIDB4N2EsIDB4YjUsIDB4YzUsIDB4NDYsIDB4NzUsIDB4NGEsIDB4ZmUsIDB4ZDQsIDB4NWQsIDB4NTAsIDB4YmQsCisJMHhkMiwgMHgyNSwgMHhkNCwgMHgxYiwgMHhlMSwgMHg0NSwgMHg1NSwgMHg2YiwgMHhiNSwgMHhlMSwgMHg1NCwgMHhjNCwKKwkweGI3LCAweDY3LCAweDhmLCAweGMwLCAweDA3LCAweDRkLCAweGY1LCAweDZlLCAweDgxLCAweGJlLCAweGQyLCAweDZhLAorCTB4NjUsIDB4MTEsIDB4MmYsIDB4NzQsIDB4Y2IsIDB4MzIsIDB4OGEsIDB4YzgsIDB4NzMsIDB4NTksIDB4ZjUsIDB4N2UsCisJMHgwYSwgMHhmZCwgMHhmNywgMHhmNywgMHg1NCwgMHgxYywgMHg5NiwgMHgxYSwgMHg2NCwgMHhmMywgMHg1YywgMHgwMiwKKwkweGViLCAweDY4LCAweGNhLCAweDNlLCAweDQzLCAweDRhLCAweDBmLCAweDBmLCAweDI4LCAweGVjLCAweDFhLCAweDVhLAorCTB4NDEsIDB4ODAsIDB4NWEsIDB4MWIsIDB4MTIsIDB4NTksIDB4ODEsIDB4YmYsIDB4YzIsIDB4NzcsIDB4YzMsIDB4NmIsCisJMHhkNCwgMHgwMSwgMHg2NSwgMHgzYiwgMHgyYiwgMHgxMSwgMHhjOCwgMHg5ZSwgMHg1OCwgMHgyMiwgMHhiNCwgMHg0OCwKKwkweDE5LCAweGM3LCAweDYxLCAweDE3LCAweDVjLCAweDA3LCAweDMyLCAweGU2LCAweGJiLCAweDJjLCAweGNiLCAweDFkLAorCTB4ZjIsIDB4NGMsIDB4YzMsIDB4ZjQsIDB4ZGYsIDB4M2QsIDB4N2YsIDB4ODksIDB4ZWYsIDB4YTMsIDB4ZWIsIDB4NzMsCisJMHg2MywgMHgwMywgMHhjNCwgMHg0ZiwgMHg1MiwgMHg2YSwgMHgwMCwgMHg2MywgMHg5YywgMHg2NiwgMHgwZCwgMHhjZSwKKwkweDE4LCAweDUwLCAweDg4LCAweDQ3LCAweDk0LCAweGFmLCAweGIzLCAweDA2LCAweGY2LCAweDdjLCAweDlmLCAweGY4LAorCTB4M2EsIDB4NjIsIDB4MTEsIDB4ZGIsIDB4OGUsIDB4NjIsIDB4OGYsIDB4OWQsIDB4ZTQsIDB4ZWEsIDB4ZDUsIDB4OWUsCisJMHg5MywgMHhhMCwgMHhmMywgMHhmYywgMHg5MiwgMHgzOSwgMHg1NSwgMHg5MCwgMHgxNCwgMHhkZiwgMHg3MSwgMHg5ZSwKKwkweGIxLCAweGMxLCAweGY3LCAweDA2LCAweGUyLCAweGU0LCAweDQyLCAweDg1LCAweGVmLCAweDMzLCAweDE3LCAweGUxLAorCTB4NTksIDB4NTMsIDB4NzIsIDB4YmUsIDB4Y2MsIDB4MWEsIDB4ZjAsIDB4NzYsIDB4ZTgsIDB4OGIsIDB4ZDcsIDB4YzUsCisJMHhmMSwgMHgxMCwgMHhmYywgMHhmZiwgMHhhMiwgMHhjMSwgMHhkZiwgMHg5MSwgMHhmMSwgMHg3NywgMHg0MSwgMHg2NiwKKwkweDJhLCAweGExLCAweDFkLCAweDg0LCAweDhlLCAweDBiLCAweDQ2LCAweGM0LCAweGI3LCAweDAzLCAweGE3LCAweDRjLAorCTB4OGMsIDB4MzUsIDB4NjIsIDB4OWMsIDB4YzMsIDB4ZjcsIDB4OTcsIDB4ZGQsIDB4Y2IsIDB4MmQsIDB4ZDYsIDB4M2YsCisJMHgxNywgMHgxMCwgMHhlNywgMHhhNiwgMHg5MiwgMHg1MywgMHhiMCwgMHg5ZCwgMHg0MiwgMHhiYywgMHgxMywgMHhiNCwKKwkweGZlLCAweDVkLCAweGRjLCAweGNiLCAweGJiLCAweGRjLCAweGM3LCAweDRjLCAweDVkLCAweDk0LCAweDIyLCAweDMwLAorCTB4ZmQsIDB4NDgsIDB4ZTIsIDB4NjUsIDB4ZDksIDB4ODMsIDB4M2EsIDB4NTUsIDB4OTMsIDB4MzcsIDB4MmQsIDB4NzMsCisJMHg1YywgMHgzNCwgMHhiNSwgMHhkZSwgMHhmMCwgMHg3ZCwgMHhiMCwgMHhiZCwgMHgzNywgMHgxMCwgMHhkZiwgMHgzYSwKKwkweGZjLCAweGRhLCAweDNkLCAweDViLCAweDI2LCAweDE2LCAweDNhLCAweGFhLCAweGRlLCAweDA1LCAweGI4LCAweDYwLAorCTB4YjEsIDB4N2YsIDB4YzcsIDB4ZGYsIDB4NDQsIDB4ZmUsIDB4YTUsIDB4ZGEsIDB4NjMsIDB4ZWIsIDB4OGMsIDB4OGQsCisJMHhmZCwgMHg2MywgMHhkMiwgMHhlNywgMHhmMSwgMHg3OCwgMHhjMCwgMHhmMiwgMHg2OCwgMHhlNCwgMHgzYSwgMHg5MSwKKwkweGI2LCAweDc1LCAweGNlLCAweGZiLCAweGViLCAweDljLCAweGY1LCAweGQ3LCAweGE5LCAweGY5LCAweGViLCAweDVjLAorCTB4ZDgsIDB4NWMsIDB4ZTcsIDB4NmUsIDB4ZTgsIDB4YmYsIDB4ZDUsIDB4N2EsIDB4MGEsIDB4ZjgsIDB4MjEsIDB4OTMsCisJMHg2YSwgMHhiNSwgMHgxYywgMHhkNCwgMHg1OSwgMHhhNSwgMHhkMSwgMHg3OSwgMHg3NSwgMHg0NiwgMHhhYSwgMHhhNywKKwkweGJmLCAweDcxLCAweDZmLCAweGM2LCAweDJhLCAweGM0LCAweGMzLCAweDBhLCAweDdiLCAweGEwLCAweDkyLCAweDgyLAorCTB4MWQsIDB4MTYsIDB4YzQsIDB4YzMsIDB4ZGMsIDB4M2MsIDB4YjcsIDB4ZjMsIDB4Y2UsIDB4ZjUsIDB4YmEsIDB4YTEsCisJMHhjMywgMHgxYywgMHg3MiwgMHg4NiwgMHg5MSwgMHgzOSwgMHg2NywgMHg0OSwgMHg2MSwgMHhkZiwgMHg2ZiwgMHhlYSwKKwkweGIwLCAweGYzLCAweDVlLCAweGU0LCAweDg3LCAweDlmLCAweGMwLCAweDY2LCAweDhjLCAweDRjLCAweGJkLCAweDkxLAorCTB4NDMsIDB4YmQsIDB4YzMsIDB4ZjksIDB4NzcsIDB4NDAsIDB4OGYsIDB4ODUsIDB4NGMsIDB4YWQsIDB4NTEsIDB4YzgsCisJMHg5YywgMHhlNSwgMHg3OSwgMHgwZSwgMHhlNiwgMHhkNSwgMHgxYSwgMHgzZCwgMHg5MCwgMHg3YiwgMHg4ZiwgMHhlYSwKKwkweDhiLCAweGJjLCAweDVjLCAweDhlLCAweDMxLCAweDA2LCAweGMxLCAweGQ2LCAweDYzLCAweDE4LCAweDhiLCAweGFiLAorCTB4ZGYsIDB4NjgsIDB4ZDUsIDB4ZGQsIDB4NjUsIDB4ZjgsIDB4NzQsIDB4MDIsIDB4ZTMsIDB4ZDUsIDB4YWUsIDB4NDksCisJMHg4NSwgMHg0NywgMHgyZCwgMHg1OSwgMHg3MSwgMHg3ZiwgMHhhNSwgMHgxNSwgMHhjYiwgMHg5NywgMHhiNSwgMHg1MiwKKwkweDc5LCAweDE4LCAweDczLCAweDQ2LCAweGY5LCAweDViLCAweDlmLCAweDNkLCAweGMwLCAweDQ5LCAweDUzLCAweGQ1LAorCTB4MWQsIDB4NjksIDB4NGEsIDB4ODAsIDB4MjYsIDB4YmQsIDB4OGQsIDB4YTYsIDB4MDQsIDB4ZTgsIDB4NDEsIDB4Y2MsCisJMHgzYywgMHhjNSwgMHhkZSwgMHhmMSwgMHhhOCwgMHg5YywgMHgyOCwgMHhmMywgMHg5ZCwgMHgyNiwgMHhmZSwgMHg0NiwKKwkweGQ1LCAweDkwLCAweDMwLCAweGIwLCAweDY1LCAweGU0LCAweDk0LCAweDE5LCAweDVmLCAweDU3LCAweGJkLCAweDFhLAorCTB4NzMsIDB4YjgsIDB4MmUsIDB4MjMsIDB4YTksIDB4YmEsIDB4YTgsIDB4ZmMsIDB4OTIsIDB4MzgsIDB4ODEsIDB4N2MsCisJMHhmNSwgMHg4NiwgMHhkYiwgMHgyMywgMHg2ZiwgMHhmYSwgMHg3YiwgMHg1ZCwgMHgxNCwgMHg5ZSwgMHgzMywgMHg2ZSwKKwkweGRmLCAweGViLCAweGM5LCAweDRhLCAweDJhLCAweGYzLCAweDhhLCAweDE1LCAweGYyLCAweGY5LCAweGVhLCAweGMzLAorCTB4NWUsIDB4N2IsIDB4MzAsIDB4MzcsIDB4OTUsIDB4MzksIDB4ZGYsIDB4ZDgsIDB4NjksIDB4YWUsIDB4ODMsIDB4YjksCisJMHg5MSwgMHhiNiwgMHhiOSwgMHgwZSwgMHhlNiwgMHhmNSwgMHgyMCwgMHhlZiwgMHhmNSwgMHgyOCwgMHg5ZSwgMHg0YSwKKwkweGEwLCAweGViLCAweDUyLCAweDk5LCAweDNjLCAweGYxLCAweDBjLCAweDgyLCAweDdiLCAweDFhLCAweGM0LCAweGM2LAorCTB4NTMsIDB4ZTIsIDB4OWYsIDB4ZDksIDB4ZjIsIDB4ZjcsIDB4N2EsIDB4NTcsIDB4ZjUsIDB4NmIsIDB4OTQsIDB4MGQsCisJMHg0YywgMHg1OCwgMHgzYywgMHg5YiwgMHg5OSwgMHhkMSwgMHhiMiwgMHhmNSwgMHgzYywgMHg3MiwgMHhkNSwgMHg4ZCwKKwkweGM0LCAweDQzLCAweDI5LCAweDFiLCAweGI5LCAweDkyLCAweGU3LCAweDNjLCAweDhkLCAweDcyLCAweDgxLCAweGVmLAorCTB4M2QsIDB4YzMsIDB4MmUsIDB4ZGUsIDB4MjEsIDB4NWUsIDB4YmUsIDB4MzEsIDB4YTQsIDB4ZGUsIDB4NDMsIDB4NzAsCisJMHhmYywgMHg3MywgMHgyMCwgMHgzMSwgMHgzMiwgMHg2MywgMHg3YywgMHhmNywgMHhlMCwgMHg2ZSwgMHhhOSwgMHgyZiwKKwkweDdmLCAweDExLCAweDYzLCAweDE5LCAweGU0LCAweGM1LCAweDQzLCAweDVhLCAweGU2LCAweGRjLCAweDI0LCAweGFlLAorCTB4MWYsIDB4YzIsIDB4MzUsIDB4ZTIsIDB4ZjAsIDB4NzIsIDB4MGUsIDB4ZjcsIDB4MWYsIDB4YzIsIDB4ZjUsIDB4YmMsCisJMHg5NiwgMHg2ZCwgMHhlNiwgMHg3MCwgMHhmZCwgMHgzMCwgMHhhZSwgMHgyNywgMHg0OCwgMHg5YiwgMHhmMywgMHg4YSwKKwkweDM1LCAweGE1LCAweGQ5LCAweDU4LCAweGNiLCAweDNlLCAweDM3LCAweDg5LCAweDRmLCAweGZiLCAweDdhLCAweGJjLAorCTB4MDcsIDB4M2QsIDB4OTUsIDB4NzksIDB4M2UsIDB4OTYsIDB4MDQsIDB4NGQsIDB4MGYsIDB4NmEsIDB4NGUsIDB4YmQsCisJMHgxYiwgMHg2YiwgMHgwYywgMHhlMSwgMHg3OSwgMHhkYSwgMHg1NCwgMHhmYiwgMHgzOSwgMHhkNCwgMHg2ZCwgMHhhYSwKKwkweDY3LCAweDE0LCAweDRhLCAweGE3LCAweDgxLCAweDc3LCAweDFmLCAweDQxLCAweGRlLCAweGQ3LCAweGM0LCAweGIxLAorCTB4MWUsIDB4OTcsIDB4NjIsIDB4MmEsIDB4MmQsIDB4MGIsIDB4ZjUsIDB4OTAsIDB4NjQsIDB4NjMsIDB4MDUsIDB4N2MsCisJMHgyZiwgMHg0OCwgMHg2NiwgMHgxYywgMHhmNywgMHhlYiwgMHhiNCwgMHgwNSwgMHhjZSwgMHgyYiwgMHg0OSwgMHhiMSwKKwkweDRhLCAweGZjLCAweGNlLCAweDdlLCAweGQxLCAweDU3LCAweGMwLCAweDM3LCAweGZiLCAweDQ0LCAweDc5LCAweGM4LAorCTB4MjAsIDB4NDYsIDB4ZmIsIDB4ZGQsIDB4YTEsIDB4YTcsIDB4ZTUsIDB4YmQsIDB4ZDMsIDB4OGMsIDB4N2MsIDB4YWMsCisJMHg2NSwgMHhlYSwgMHhmZSwgMHg1OSwgMHg5ZCwgMHhjNSwgMHhkZiwgMHgyYiwgMHhiMSwgMHg0NywgMHgyNSwgMHhjNSwKKwkweDUwLCAweDlhLCAweDdkLCAweDBlLCAweGQ1LCAweDE3LCAweDRmLCAweDc5LCAweDY3LCAweDdhLCAweGVkLCAweGVmLAorCTB4OTAsIDB4MDQsIDB4ZmUsIDB4YzIsIDB4N2QsIDB4YmYsIDB4ODIsIDB4ZTcsIDB4YmQsIDB4YmUsIDB4NTQsIDB4YjYsCisJMHhmOSwgMHg0MSwgMHg1ZCwgMHhmMCwgMHg1ZCwgMHhmZCwgMHgxNSwgMHhlOCwgMHhlMiwgMHhmYywgMHg4NywgMHhmNiwKKwkweGI5LCAweGQ4LCAweGUzLCAweDlhLCAweDQ3LCAweDJjLCAweDYyLCAweDdmLCAweDJjLCAweDkwLCAweGRmLCAweGQ1LAorCTB4MzQsIDB4OTIsIDB4YmUsIDB4YzMsIDB4NTgsIDB4NGIsIDB4NTIsIDB4OGMsIDB4YjMsIDB4YjksIDB4NTgsIDB4NDIsCisJMHhkNSwgMHhiZSwgMHgxYiwgMHg0YiwgMHhmMiwgMHhjNCwgMHgxNiwgMHhiZCwgMHhhNCwgMHg5NSwgMHg3MiwgMHg3OCwKKwkweDA0LCAweGY1LCAweDFhLCAweDdmLCAweGZmLCAweGYwLCAweGI4LCAweGU0LCAweDUzLCAweGVjLCAweGQxLCAweDg0LAorCTB4OTAsIDB4MGIsIDB4MGIsIDB4ZjgsIDB4YmUsIDB4MjUsIDB4YjcsIDB4OTIsIDB4MmYsIDB4YjcsIDB4N2MsIDB4ZjUsCisJMHg1YiwgMHg0YSwgMHg3NywgMHgzNSwgMHg4YiwgMHhmYiwgMHgwNSwgMHhiZCwgMHg4YiwgMHg2OSwgMHhhNSwgMHhiMywKKwkweDlhLCAweDdhLCAweGNmLCAweDM2LCAweGUwLCAweDNkLCAweGU4LCAweGJmLCAweGVkLCAweDZjLCAweDczLCAweDkzLAorCTB4MTYsIDB4NjksIDB4ZmIsIDB4MzgsIDB4ZGYsIDB4NWIsIDB4MTgsIDB4YjYsIDB4ODUsIDB4ZjQsIDB4OTMsIDB4MGYsCisJMHhlNiwgMHhhYywgMHhlMCwgMHg1YywgMHgzNCwgMHhlMCwgMHgyMSwgMHhlMCwgMHhmMywgMHhhMywgMHhjYSwgMHg4NSwKKwkweDc0LCAweGVlLCAweDMxLCAweGE0LCAweDdiLCAweGNhLCAweDA4LCAweDU5LCAweGNjLCAweDAxLCAweDlmLCAweGY2LAorCTB4ZmIsIDB4ZjgsIDB4ZmYsIDB4MzcsIDB4ZTUsIDB4ZWEsIDB4ZjEsIDB4MWUsIDB4ODYsIDB4YTgsIDB4ZmMsIDB4ZGYsCisJMHg4YiwgMHhlZSwgMHhhMCwgMHhmNywgMHhhYiwgMHhjZiwgMHg4MCwgMHgwZCwgMHhlNywgMHhhYywgMHhiNSwgMHhjNSwKKwkweDY3LCAweDZkLCAweDA3LCAweDNlLCAweDZiLCAweDNlLCAweDlmLCAweDFmLCAweDdlLCAweDRlLCAweGVhLCAweGQxLAorCTB4NTksIDB4NWIsIDB4YjIsIDB4YzEsIDB4MjMsIDB4NmQsIDB4NmEsIDB4MjcsIDB4N2IsIDB4ZTMsIDB4NmYsIDB4OWMsCisJMHhkNCwgMHhlZiwgMHhhZCwgMHhhMiwgMHhiNiwgMHg3YiwgMHhhZCwgMHg1ZSwgMHgyNywgMHhlYiwgMHg2NCwgMHhjZiwKKwkweGVlLCAweGNlLCAweDIyLCAweGQ3LCAweDU1LCAweGFiLCAweDVlLCAweGNkLCAweDVjLCAweDc1LCAweGQ5LCAweDZiLAorCTB4ZGUsIDB4NjksIDB4NmYsIDB4MGQsIDB4MzQsIDB4ZmYsIDB4OGUsIDB4N2EsIDB4ZWYsIDB4YTQsIDB4ZTQsIDB4N2EsCisJMHg3ZCwgMHhhOSwgMHg2YSwgMHhiNSwgMHgzZCwgMHg1NywgMHhkZSwgMHhjMCwgMHgzYywgMHgzOSwgMHg1YywgMHg5MCwKKwkweDE5LCAweGU4LCAweDMxLCAweDg5LCAweGViLCAweDliLCAweGU1LCAweGU1LCAweDY1LCAweDc1LCAweDg2LCAweGU0LAorCTB4OWYsIDB4ZDUsIDB4ZjAsIDB4MGMsIDB4NDYsIDB4OWQsIDB4NDMsIDB4MjMsIDB4NWUsIDB4Y2QsIDB4YWEsIDB4NzgsCisJMHhiZCwgMHhiMSwgMHhhYywgMHhlZSwgMHhhOSwgMHhkZiwgMHgzYywgMHhkNCwgMHhkZCwgMHgxOSwgMHhjNCwgMHg3MywKKwkweGQ0LCAweDA2LCAweGQ2LCAweDZlLCAweDI5LCAweGEyLCAweDg2LCAweDNlLCAweDZiLCAweGNkLCAweDE4LCAweGM0LAorCTB4MjksIDB4NWMsIDB4NmIsIDB4MDMsIDB4NmIsIDB4OWQsIDB4NWYsIDB4OTYsIDB4YmQsIDB4N2MsIDB4YTcsIDB4YTMsCisJMHhhYSwgMHhjZSwgMHhiZCwgMHhiYywgMHg3ZSwgMHhmNSwgMHhiYywgMHgwNCwgMHhiZiwgMHhkNywgMHg4ZCwgMHhmYSwKKwkweDM5LCAweDhlLCAweGVmLCAweDk1LCAweGYwLCAweGI3LCAweGE3LCAweDhjLCAweDAxLCAweGE4LCAweDZiLCAweDY2LAorCTB4MGEsIDB4NTgsIDB4YWYsIDB4ZDUsIDB4ZjIsIDB4ZmEsIDB4ZDksIDB4MmQsIDB4ZDgsIDB4N2QsIDB4ODQsIDB4YmYsCisJMHg2NSwgMHhjMCwgMHhkZiwgMHgyMywgMHhiMCwgMHgxMywgMHhmOCwgMHhjMSwgMHhlNiwgMHgzOCwgMHhhZiwgMHg1OSwKKwkweDRiLCAweDA0LCAweGQ3LCAweDRjLCAweDU4LCAweGZmLCAweDFiLCAweGVkLCAweGNjLCAweGZhLCAweGExLCAweDk4LAorCTB4NDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UWFBfYjA5RndEYXRhWygweGQwLzQpICsgMV0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxMCwKKwkweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLAorCTB4MDAwMDgwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgwMDIsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDA1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UWFBfYjA5RndSb2RhdGFbKDB4MzAvNCkgKyAxXSA9IHsKKwkweDA4MDAzYmU4LCAweDA4MDAzYzE0LCAweDA4MDAzYzVjLCAweDA4MDAzYzVjLCAweDA4MDAzYWU4LCAweDA4MDAzYjE0LAorCTB4MDgwMDNiMTQsIDB4MDgwMDNjNWMsIDB4MDgwMDNjNWMsIDB4MDgwMDNjNWMsIDB4MDgwMDNiN2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCB9Oworc3RhdGljIHUzMiBibngyX1RYUF9iMDlGd0Jzc1soMHhhMjAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfVFhQX2IwOUZ3U2Jzc1soMHg4MC80KSArIDFdID0geyAweDAgfTsKKworc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfdHhwX2Z3XzA5ID0geworCS52ZXJfbWFqb3IJCQk9IDB4MSwKKwkudmVyX21pbm9yCQkJPSAweDAsCisJLnZlcl9maXgJCQk9IDB4MCwKKworCS5zdGFydF9hZGRyCQkJPSAweDA4MDAwMDYwLAorCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKKwkudGV4dF9sZW4JCQk9IDB4NDE5NCwKKwkudGV4dF9pbmRleAkJCT0gMHgwLAorCS5nel90ZXh0CQkJPSBibngyX1RYUF9iMDlGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9UWFBfYjA5RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDQxZTAsCisJLmRhdGFfbGVuCQkJPSAweGQwLAorCS5kYXRhX2luZGV4CQkJPSAweDAsCisJLmRhdGEJCQkJPSBibngyX1RYUF9iMDlGd0RhdGEsCisKKwkuc2Jzc19hZGRyCQkJPSAweDA4MDA0MmIwLAorCS5zYnNzX2xlbgkJCT0gMHg4MCwKKwkuc2Jzc19pbmRleAkJCT0gMHgwLAorCS5zYnNzCQkJCT0gYm54Ml9UWFBfYjA5RndTYnNzLAorCisJLmJzc19hZGRyCQkJPSAweDA4MDA0MzMwLAorCS5ic3NfbGVuCQkJPSAweGEyMCwKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfVFhQX2IwOUZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA0MTk4LAorCS5yb2RhdGFfbGVuCQkJPSAweDMwLAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9UWFBfYjA5RndSb2RhdGEsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCAxN2E0NjExLi40ODhkOGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTEzMzYsNiArMTMzNiwxMyBAQAogCQlnb3RvIGVycl91bmRvX2ZsYWdzOwogCX0KIAorCWlmIChzbGF2ZV9kZXYtPmdldF9zdGF0cyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSBEUlZfTkFNRQorCQkJIjogJXM6IHRoZSBkcml2ZXIgZm9yIHNsYXZlIGRldmljZSAlcyBkb2VzIG5vdCBwcm92aWRlICIKKwkJCSJnZXRfc3RhdHMgZnVuY3Rpb24sIG5ldHdvcmsgc3RhdGlzdGljcyB3aWxsIGJlICIKKwkJCSJpbmFjY3VyYXRlLlxuIiwgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSk7CisJfQorCiAJbmV3X3NsYXZlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNsYXZlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfc2xhdmUpIHsKIAkJcmVzID0gLUVOT01FTTsKQEAgLTM2MDUsMzMgKzM2MTIsMzUgQEAKIAlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewotCQlzc3RhdHMgPSBzbGF2ZS0+ZGV2LT5nZXRfc3RhdHMoc2xhdmUtPmRldik7CisJCWlmIChzbGF2ZS0+ZGV2LT5nZXRfc3RhdHMpIHsKKwkJCXNzdGF0cyA9IHNsYXZlLT5kZXYtPmdldF9zdGF0cyhzbGF2ZS0+ZGV2KTsKIAotCQlzdGF0cy0+cnhfcGFja2V0cyArPSBzc3RhdHMtPnJ4X3BhY2tldHM7Ci0JCXN0YXRzLT5yeF9ieXRlcyArPSBzc3RhdHMtPnJ4X2J5dGVzOwotCQlzdGF0cy0+cnhfZXJyb3JzICs9IHNzdGF0cy0+cnhfZXJyb3JzOwotCQlzdGF0cy0+cnhfZHJvcHBlZCArPSBzc3RhdHMtPnJ4X2Ryb3BwZWQ7CisJCQlzdGF0cy0+cnhfcGFja2V0cyArPSBzc3RhdHMtPnJ4X3BhY2tldHM7CisJCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc3N0YXRzLT5yeF9ieXRlczsKKwkJCXN0YXRzLT5yeF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9lcnJvcnM7CisJCQlzdGF0cy0+cnhfZHJvcHBlZCArPSBzc3RhdHMtPnJ4X2Ryb3BwZWQ7CiAKLQkJc3RhdHMtPnR4X3BhY2tldHMgKz0gc3N0YXRzLT50eF9wYWNrZXRzOwotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc3N0YXRzLT50eF9ieXRlczsKLQkJc3RhdHMtPnR4X2Vycm9ycyArPSBzc3RhdHMtPnR4X2Vycm9yczsKLQkJc3RhdHMtPnR4X2Ryb3BwZWQgKz0gc3N0YXRzLT50eF9kcm9wcGVkOworCQkJc3RhdHMtPnR4X3BhY2tldHMgKz0gc3N0YXRzLT50eF9wYWNrZXRzOworCQkJc3RhdHMtPnR4X2J5dGVzICs9IHNzdGF0cy0+dHhfYnl0ZXM7CisJCQlzdGF0cy0+dHhfZXJyb3JzICs9IHNzdGF0cy0+dHhfZXJyb3JzOworCQkJc3RhdHMtPnR4X2Ryb3BwZWQgKz0gc3N0YXRzLT50eF9kcm9wcGVkOwogCi0JCXN0YXRzLT5tdWx0aWNhc3QgKz0gc3N0YXRzLT5tdWx0aWNhc3Q7Ci0JCXN0YXRzLT5jb2xsaXNpb25zICs9IHNzdGF0cy0+Y29sbGlzaW9uczsKKwkJCXN0YXRzLT5tdWx0aWNhc3QgKz0gc3N0YXRzLT5tdWx0aWNhc3Q7CisJCQlzdGF0cy0+Y29sbGlzaW9ucyArPSBzc3RhdHMtPmNvbGxpc2lvbnM7CiAKLQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOwotCQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKz0gc3N0YXRzLT5yeF9vdmVyX2Vycm9yczsKLQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMgKz0gc3N0YXRzLT5yeF9jcmNfZXJyb3JzOwotCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IHNzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOwotCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMgKz0gc3N0YXRzLT5yeF9maWZvX2Vycm9yczsKLQkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOworCQkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IHNzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7CisJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2NyY19lcnJvcnM7CisJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IHNzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOworCQkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+cnhfZmlmb19lcnJvcnM7CisJCQlzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyArPSBzc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CiAKLQkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICs9IHNzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnM7Ci0JCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycyArPSBzc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzOwotCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMgKz0gc3N0YXRzLT50eF9maWZvX2Vycm9yczsKLQkJc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnMgKz0gc3N0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzOwotCQlzdGF0cy0+dHhfd2luZG93X2Vycm9ycyArPSBzc3RhdHMtPnR4X3dpbmRvd19lcnJvcnM7CisJCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gc3N0YXRzLT50eF9hYm9ydGVkX2Vycm9yczsKKwkJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycyArPSBzc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzOworCQkJc3RhdHMtPnR4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJCQlzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycyArPSBzc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJCQlzdGF0cy0+dHhfd2luZG93X2Vycm9ycyArPSBzc3RhdHMtPnR4X3dpbmRvd19lcnJvcnM7CisJCX0KIAl9CiAKIAlyZWFkX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKaW5kZXggNTIxYzViNy4uZmQyY2MxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwpAQCAtMjgyNSw3ICsyODI1LDcgQEAKIAkJdTY0IGNzdW1fc3RhcnRfb2ZmLCBjc3VtX3N0dWZmX29mZjsKIAogCQljc3VtX3N0YXJ0X29mZiA9ICh1NjQpIChza2ItPmgucmF3IC0gc2tiLT5kYXRhKTsKLQkJY3N1bV9zdHVmZl9vZmYgPSAodTY0KSAoKHNrYi0+aC5yYXcgKyBza2ItPmNzdW0pIC0gc2tiLT5kYXRhKTsKKwkJY3N1bV9zdHVmZl9vZmYgPSBjc3VtX3N0YXJ0X29mZiArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAKIAkJY3RybCA9ICBUWF9ERVNDX0NTVU1fRU4gfAogCQkJQ0FTX0JBU0UoVFhfREVTQ19DU1VNX1NUQVJULCBjc3VtX3N0YXJ0X29mZikgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vTWFrZWZpbGUKaW5kZXggNTRjNzhkOS4uMzgyZDIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL01ha2VmaWxlCkBAIC0xLDExICsxLDExIEBACiAjCi0jIENoZWxzaW8gMTBHYiBOSUMgZHJpdmVyIGZvciBMaW51eC4KKyMgQ2hlbHNpbyBUMSBkcml2ZXIKICMKIAogb2JqLSQoQ09ORklHX0NIRUxTSU9fVDEpICs9IGN4Z2IubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL25ldC9jaGVsc2lvICQoREVCVUdfRkxBR1MpCitjeGdiLSQoQ09ORklHX0NIRUxTSU9fVDFfMUcpICs9IGl4ZjEwMTAubyBtYWMubyBtdjg4ZTF4eHgubyB2c2M3MzI2Lm8gdnNjODI0NC5vCitjeGdiLW9ianMgOj0gY3hnYjIubyBlc3BpLm8gdHAubyBwbTMzOTMubyBzZ2UubyBzdWJyLm8gXAorCSAgICAgbXY4OHgyMDF4Lm8gbXkzMTI2Lm8gJChjeGdiLXkpCiAKIAotY3hnYi1vYmpzIDo9IGN4Z2IyLm8gZXNwaS5vIHBtMzM5My5vIHNnZS5vIHN1YnIubyBtdjg4eDIwMXgubwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaAppbmRleCA1ZDlkZDE0Li5iMjY1OTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01MywxMyArNTQsMzAgQEAKIAogI2RlZmluZSBEUlZfREVTQ1JJUFRJT04gIkNoZWxzaW8gMTBHYiBFdGhlcm5ldCBEcml2ZXIiCiAjZGVmaW5lIERSVl9OQU1FICJjeGdiIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4xLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjIiCiAjZGVmaW5lIFBGWCAgICAgIERSVl9OQU1FICI6ICIKIAogI2RlZmluZSBDSF9FUlIoZm10LCAuLi4pICAgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjIF9fVkFfQVJHU19fKQogI2RlZmluZSBDSF9XQVJOKGZtdCwgLi4uKSAgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggZm10LCAjIyBfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ0hfQUxFUlQoZm10LCAuLi4pIHByaW50ayhLRVJOX0FMRVJUIFBGWCBmbXQsICMjIF9fVkFfQVJHU19fKQogCisvKgorICogTW9yZSBwb3dlcmZ1bCBtYWNybyB0aGF0IHNlbGVjdGl2ZWx5IHByaW50cyBtZXNzYWdlcyBiYXNlZCBvbiBtc2dfZW5hYmxlLgorICogRm9yIGluZm8gYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyAqLworI2RlZmluZSBDSF9NU0coYWRhcHRlciwgbGV2ZWwsIGNhdGVnb3J5LCBmbXQsIC4uLikgZG8geyBcCisJaWYgKChhZGFwdGVyKS0+bXNnX2VuYWJsZSAmIE5FVElGX01TR18jI2NhdGVnb3J5KSBcCisJCXByaW50ayhLRVJOXyMjbGV2ZWwgUEZYICIlczogIiBmbXQsIChhZGFwdGVyKS0+bmFtZSwgXAorCQkgICAgICAgIyMgX19WQV9BUkdTX18pOyBcCit9IHdoaWxlICgwKQorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIENIX0RCRyhhZGFwdGVyLCBjYXRlZ29yeSwgZm10LCAuLi4pIFwKKwlDSF9NU0coYWRhcHRlciwgREVCVUcsIGNhdGVnb3J5LCBmbXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIENIX0RCRyhmbXQsIC4uLikKKyNlbmRpZgorCiAjZGVmaW5lIENIX0RFVklDRShkZXZpZCwgc3NpZCwgaWR4KSBcCiAJeyBQQ0lfVkVORE9SX0lEX0NIRUxTSU8sIGRldmlkLCBQQ0lfQU5ZX0lELCBzc2lkLCAwLCAwLCBpZHggfQogCkBAIC03MSwxMCArODksNiBAQAogCiB0eXBlZGVmIHN0cnVjdCBhZGFwdGVyIGFkYXB0ZXJfdDsKIAotdm9pZCB0MV9lbG1lcjBfZXh0X2ludHIoYWRhcHRlcl90ICphZGFwdGVyKTsKLXZvaWQgdDFfbGlua19jaGFuZ2VkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXR1cywKLQkJCWludCBzcGVlZCwgaW50IGR1cGxleCwgaW50IGZjKTsKLQogc3RydWN0IHQxX3J4X21vZGUgewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdTMyIGlkeDsKQEAgLTk3LDI2ICsxMTEsNTMgQEAKIH0KIAogI2RlZmluZQlNQVhfTlBPUlRTIDQKKyNkZWZpbmUgUE9SVF9NQVNLICgoMSA8PCBNQVhfTlBPUlRTKSAtIDEpCisjZGVmaW5lIE5NVFVTICAgICAgOAorI2RlZmluZSBUQ0JfU0laRSAgIDEyOAogCiAjZGVmaW5lIFNQRUVEX0lOVkFMSUQgMHhmZmZmCiAjZGVmaW5lIERVUExFWF9JTlZBTElEIDB4ZmYKIAogZW51bSB7CiAJQ0hCVF9CT0FSRF9OMTEwLAotCUNIQlRfQk9BUkRfTjIxMAorCUNIQlRfQk9BUkRfTjIxMCwKKwlDSEJUX0JPQVJEXzc1MDAsCisJQ0hCVF9CT0FSRF84MDAwLAorCUNIQlRfQk9BUkRfQ0hUMTAxLAorCUNIQlRfQk9BUkRfQ0hUMTEwLAorCUNIQlRfQk9BUkRfQ0hUMjEwLAorCUNIQlRfQk9BUkRfQ0hUMjA0LAorCUNIQlRfQk9BUkRfQ0hUMjA0ViwKKwlDSEJUX0JPQVJEX0NIVDIwNEUsCisJQ0hCVF9CT0FSRF9DSE4yMDQsCisJQ0hCVF9CT0FSRF9DT1VHQVIsCisJQ0hCVF9CT0FSRF82ODAwLAorCUNIQlRfQk9BUkRfU0lNVUwsCiB9OwogCiBlbnVtIHsKKwlDSEJUX1RFUk1fRlBHQSwKIAlDSEJUX1RFUk1fVDEsCi0JQ0hCVF9URVJNX1QyCisJQ0hCVF9URVJNX1QyLAorCUNIQlRfVEVSTV9UMwogfTsKIAogZW51bSB7CisJQ0hCVF9NQUNfQ0hFTFNJT19BLAorCUNIQlRfTUFDX0lYRjEwMTAsCiAJQ0hCVF9NQUNfUE0zMzkzLAorCUNIQlRfTUFDX1ZTQzczMjEsCisJQ0hCVF9NQUNfRFVNTVkKIH07CiAKIGVudW0geworCUNIQlRfUEhZXzg4RTEwNDEsCisJQ0hCVF9QSFlfODhFMTExMSwKIAlDSEJUX1BIWV84OFgyMDEwLAorCUNIQlRfUEhZX1hQQUssCisJQ0hCVF9QSFlfTVkzMTI2LAorCUNIQlRfUEhZXzgyNDQsCisJQ0hCVF9QSFlfRFVNTVkKIH07CiAKIGVudW0gewpAQCAtMTUwLDE2ICsxOTEsNDQgQEAKIAl1bnNpZ25lZCBjaGFyICBpc19wY2l4OwogfTsKIAorc3RydWN0IHRwX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IHBtX3NpemU7CisJdW5zaWduZWQgaW50IGNtX3NpemU7CisJdW5zaWduZWQgaW50IHBtX3J4X2Jhc2U7CisJdW5zaWduZWQgaW50IHBtX3R4X2Jhc2U7CisJdW5zaWduZWQgaW50IHBtX3J4X3BnX3NpemU7CisJdW5zaWduZWQgaW50IHBtX3R4X3BnX3NpemU7CisJdW5zaWduZWQgaW50IHBtX3J4X251bV9wZ3M7CisJdW5zaWduZWQgaW50IHBtX3R4X251bV9wZ3M7CisJdW5zaWduZWQgaW50IHJ4X2NvYWxlc2Npbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdXNlXzV0dXBsZV9tb2RlOworfTsKKworc3RydWN0IG1jNV9wYXJhbXMgeworCXVuc2lnbmVkIGludCBtb2RlOyAgICAgICAvKiBzZWxlY3RzIE1DNSB3aWR0aCAqLworCXVuc2lnbmVkIGludCBuc2VydmVyczsgICAvKiBzaXplIG9mIHNlcnZlciByZWdpb24gKi8KKwl1bnNpZ25lZCBpbnQgbnJvdXRlczsgICAgLyogc2l6ZSBvZiByb3V0aW5nIHJlZ2lvbiAqLworfTsKKworLyogRGVmYXVsdCBNQzUgcmVnaW9uIHNpemVzICovCisjZGVmaW5lIERFRkFVTFRfU0VSVkVSX1JFR0lPTl9MRU4gMjU2CisjZGVmaW5lIERFRkFVTFRfUlRfUkVHSU9OX0xFTiAxMDI0CisKIHN0cnVjdCBhZGFwdGVyX3BhcmFtcyB7CiAJc3RydWN0IHNnZV9wYXJhbXMgc2dlOworCXN0cnVjdCBtYzVfcGFyYW1zIG1jNTsKKwlzdHJ1Y3QgdHBfcGFyYW1zICB0cDsKIAlzdHJ1Y3QgY2hlbHNpb19wY2lfcGFyYW1zIHBjaTsKIAogCWNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpicmRfaW5mbzsKIAorCXVuc2lnbmVkIHNob3J0IG10dXNbTk1UVVNdOwogCXVuc2lnbmVkIGludCAgIG5wb3J0czsgICAgICAgICAgLyogIyBvZiBldGhlcm5ldCBwb3J0cyAqLwogCXVuc2lnbmVkIGludCAgIHN0YXRzX3VwZGF0ZV9wZXJpb2Q7CiAJdW5zaWduZWQgc2hvcnQgY2hpcF9yZXZpc2lvbjsKIAl1bnNpZ25lZCBjaGFyICBjaGlwX3ZlcnNpb247CisJdW5zaWduZWQgY2hhciAgaXNfYXNpYzsKKwl1bnNpZ25lZCBjaGFyICBoYXNfbXNpOwogfTsKIAogc3RydWN0IGxpbmtfY29uZmlnIHsKQEAgLTIwNywxNyArMjc2LDIwIEBACiAJLyogVGVybWluYXRvciBtb2R1bGVzLiAqLwogCXN0cnVjdCBzZ2UgICAgKnNnZTsKIAlzdHJ1Y3QgcGVlc3BpICplc3BpOworCXN0cnVjdCBwZXRwICAgKnRwOwogCiAJc3RydWN0IHBvcnRfaW5mbyBwb3J0W01BWF9OUE9SVFNdOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGF0c191cGRhdGVfdGFzazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c191cGRhdGVfdGltZXI7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIG1pYl9tdXRleDsKIAlzcGlubG9ja190IHRwaV9sb2NrOwogCXNwaW5sb2NrX3Qgd29ya19sb2NrOworCXNwaW5sb2NrX3QgbWFjX2xvY2s7CisKIAkvKiBndWFyZHMgYXN5bmMgb3BlcmF0aW9ucyAqLwogCXNwaW5sb2NrX3QgYXN5bmNfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJdTMyIHNsb3dfaW50cl9tYXNrOworCWludCB0MXBvd2Vyc2F2ZTsKIH07CiAKIGVudW0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGVyIGZsYWdzICovCkBAIC0yNTYsNiArMzI4LDExIEBACiAJY29uc3QgY2hhciAgICAgICAgICAgICAqZGVzYzsKIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50IHQxX2lzX2FzaWMoY29uc3QgYWRhcHRlcl90ICphZGFwdGVyKQoreworCXJldHVybiBhZGFwdGVyLT5wYXJhbXMuaXNfYXNpYzsKK30KKwogZXh0ZXJuIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHQxX3BjaV90YmxbXTsKIAogc3RhdGljIGlubGluZSBpbnQgYWRhcHRlcl9tYXRjaGVzX3R5cGUoY29uc3QgYWRhcHRlcl90ICphZGFwdGVyLApAQCAtMjg1LDEzICszNjIsMTUgQEAKIAlyZXR1cm4gYm9hcmRfaW5mbyhhZGFwKS0+Y2xvY2tfY29yZSAvIDEwMDAwMDA7CiB9CiAKK2V4dGVybiBpbnQgX190MV90cGlfcmVhZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKnZhbHApOworZXh0ZXJuIGludCBfX3QxX3RwaV93cml0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgdmFsdWUpOwogZXh0ZXJuIGludCB0MV90cGlfd3JpdGUoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIHZhbHVlKTsKIGV4dGVybiBpbnQgdDFfdHBpX3JlYWQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyICp2YWx1ZSk7CiAKIGV4dGVybiB2b2lkIHQxX2ludGVycnVwdHNfZW5hYmxlKGFkYXB0ZXJfdCAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCB0MV9pbnRlcnJ1cHRzX2Rpc2FibGUoYWRhcHRlcl90ICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIHQxX2ludGVycnVwdHNfY2xlYXIoYWRhcHRlcl90ICphZGFwdGVyKTsKLWV4dGVybiBpbnQgZWxtZXIwX2V4dF9pbnRyX2hhbmRsZXIoYWRhcHRlcl90ICphZGFwdGVyKTsKK2V4dGVybiBpbnQgdDFfZWxtZXIwX2V4dF9pbnRyX2hhbmRsZXIoYWRhcHRlcl90ICphZGFwdGVyKTsKIGV4dGVybiBpbnQgdDFfc2xvd19pbnRyX2hhbmRsZXIoYWRhcHRlcl90ICphZGFwdGVyKTsKIAogZXh0ZXJuIGludCB0MV9saW5rX3N0YXJ0KHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBjbWFjICptYWMsIHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMpOwpAQCAtMzA1LDkgKzM4NCw3IEBACiBleHRlcm4gaW50IHQxX2luaXRfc3dfbW9kdWxlcyhhZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpiaSk7CiBleHRlcm4gdm9pZCB0MV9mcmVlX3N3X21vZHVsZXMoYWRhcHRlcl90ICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIHQxX2ZhdGFsX2VycihhZGFwdGVyX3QgKmFkYXB0ZXIpOwotCi1leHRlcm4gdm9pZCB0MV90cF9zZXRfdWRwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKTsKLWV4dGVybiB2b2lkIHQxX3RwX3NldF90Y3BfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBlbmFibGUpOwotZXh0ZXJuIHZvaWQgdDFfdHBfc2V0X2lwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKTsKLQorZXh0ZXJuIHZvaWQgdDFfbGlua19jaGFuZ2VkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBvcnRfaWQpOworZXh0ZXJuIHZvaWQgdDFfbGlua19uZWdvdGlhdGVkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQsCisJCQkgICAgaW50IHNwZWVkLCBpbnQgZHVwbGV4LCBpbnQgcGF1c2UpOwogI2VuZGlmIC8qIF9DWEdCX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NwaHkuaAppbmRleCAzNDEyMzQyLi42MDkwMWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2NwaHkuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NwaHkuaApAQCAtNTIsNyArNTIsMTQgQEAKIC8qIFBIWSBpbnRlcnJ1cHQgdHlwZXMgKi8KIGVudW0gewogCWNwaHlfY2F1c2VfbGlua19jaGFuZ2UgPSAweDEsCi0JY3BoeV9jYXVzZV9lcnJvciA9IDB4MgorCWNwaHlfY2F1c2VfZXJyb3IgPSAweDIsCisJY3BoeV9jYXVzZV9maWZvX2Vycm9yID0gMHgzCit9OworCitlbnVtIHsKKwlQSFlfTElOS19VUCA9IDB4MSwKKwlQSFlfQVVUT05FR19SRFkgPSAweDIsCisJUEhZX0FVVE9ORUdfRU4gPSAweDQKIH07CiAKIHN0cnVjdCBjcGh5OwpAQCAtODEsNyArODgsMTggQEAKIC8qIEEgUEhZIGluc3RhbmNlICovCiBzdHJ1Y3QgY3BoeSB7CiAJaW50IGFkZHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBIWSBhZGRyZXNzICovCisJaW50IHN0YXRlOwkvKiBMaW5rIHN0YXR1cyBzdGF0ZSBtYWNoaW5lICovCiAJYWRhcHRlcl90ICphZGFwdGVyOyAgICAgICAgICAgICAgICAgIC8qIGFzc29jaWF0ZWQgYWRhcHRlciAqLworCisJc3RydWN0IHdvcmtfc3RydWN0IHBoeV91cGRhdGU7CisKKwl1MTYgYm1zcjsKKwlpbnQgY291bnQ7CisJaW50IGFjdF9jb3VudDsKKwlpbnQgYWN0X29uOworCisJdTMyIGVsbWVyX2dwbzsKKwogCXN0cnVjdCBjcGh5X29wcyAqb3BzOyAgICAgICAgICAgICAgICAvKiBQSFkgb3BlcmF0aW9ucyAqLwogCWludCAoKm1kaW9fcmVhZCkoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKIAkJCSBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCAqdmFsKTsKQEAgLTE0Miw2ICsxNjAsMTAgQEAKIAlpbnQgKCpyZXNldCkoYWRhcHRlcl90ICphZGFwdGVyKTsKIH07CiAKK2V4dGVybiBzdHJ1Y3QgZ3BoeSB0MV9teTMxMjZfb3BzOworZXh0ZXJuIHN0cnVjdCBncGh5IHQxX212ODhlMXh4eF9vcHM7CitleHRlcm4gc3RydWN0IGdwaHkgdDFfdnNjODI0NF9vcHM7CitleHRlcm4gc3RydWN0IGdwaHkgdDFfeHBha19vcHM7CiBleHRlcm4gc3RydWN0IGdwaHkgdDFfbXY4OHgyMDF4X29wczsKIGV4dGVybiBzdHJ1Y3QgZ3BoeSB0MV9kdW1teV9waHlfb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2NwbDVfY21kLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NwbDVfY21kLmgKaW5kZXggNWIzNTdkOS4uMzVmNTY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jcGw1X2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaApAQCAtNDYsMjQgKzQ2LDM4NSBAQAogI2VuZGlmCiAKIGVudW0gQ1BMX29wY29kZSB7CisJQ1BMX1BBU1NfT1BFTl9SRVEgICAgID0gMHgxLAorCUNQTF9QQVNTX09QRU5fUlBMICAgICA9IDB4MiwKKwlDUExfUEFTU19FU1RBQkxJU0ggICAgPSAweDMsCisJQ1BMX1BBU1NfQUNDRVBUX1JFUSAgID0gMHhFLAorCUNQTF9QQVNTX0FDQ0VQVF9SUEwgICA9IDB4NCwKKwlDUExfQUNUX09QRU5fUkVRICAgICAgPSAweDUsCisJQ1BMX0FDVF9PUEVOX1JQTCAgICAgID0gMHg2LAorCUNQTF9DTE9TRV9DT05fUkVRICAgICA9IDB4NywKKwlDUExfQ0xPU0VfQ09OX1JQTCAgICAgPSAweDgsCisJQ1BMX0NMT1NFX0xJU1RTUlZfUkVRID0gMHg5LAorCUNQTF9DTE9TRV9MSVNUU1JWX1JQTCA9IDB4QSwKKwlDUExfQUJPUlRfUkVRICAgICAgICAgPSAweEIsCisJQ1BMX0FCT1JUX1JQTCAgICAgICAgID0gMHhDLAorCUNQTF9QRUVSX0NMT1NFICAgICAgICA9IDB4RCwKKwlDUExfQUNUX0VTVEFCTElTSCAgICAgPSAweDE3LAorCisJQ1BMX0dFVF9UQ0IgICAgICAgICAgID0gMHgyNCwKKwlDUExfR0VUX1RDQl9SUEwgICAgICAgPSAweDI1LAorCUNQTF9TRVRfVENCICAgICAgICAgICA9IDB4MjYsCisJQ1BMX1NFVF9UQ0JfRklFTEQgICAgID0gMHgyNywKKwlDUExfU0VUX1RDQl9SUEwgICAgICAgPSAweDI4LAorCUNQTF9QQ01EICAgICAgICAgICAgICA9IDB4MjksCisKKwlDUExfUENNRF9SRUFEICAgICAgICAgPSAweDMxLAorCUNQTF9QQ01EX1JFQURfUlBMICAgICA9IDB4MzIsCisKKworCUNQTF9SWF9EQVRBICAgICAgICAgICA9IDB4QTAsCisJQ1BMX1JYX0RBVEFfRERQICAgICAgID0gMHhBMSwKKwlDUExfUlhfREFUQV9BQ0sgICAgICAgPSAweEEzLAogCUNQTF9SWF9QS1QgICAgICAgICAgICA9IDB4QUQsCisJQ1BMX1JYX0lTQ1NJX0hEUiAgICAgID0gMHhBRiwKKwlDUExfVFhfREFUQV9BQ0sgICAgICAgPSAweEIwLAorCUNQTF9UWF9EQVRBICAgICAgICAgICA9IDB4QjEsCiAJQ1BMX1RYX1BLVCAgICAgICAgICAgID0gMHhCMiwKIAlDUExfVFhfUEtUX0xTTyAgICAgICAgPSAweEI2LAorCisJQ1BMX1JURV9ERUxFVEVfUkVRICAgID0gMHhDMCwKKwlDUExfUlRFX0RFTEVURV9SUEwgICAgPSAweEMxLAorCUNQTF9SVEVfV1JJVEVfUkVRICAgICA9IDB4QzIsCisJQ1BMX1JURV9XUklURV9SUEwgICAgID0gMHhEMywKKwlDUExfUlRFX1JFQURfUkVRICAgICAgPSAweEMzLAorCUNQTF9SVEVfUkVBRF9SUEwgICAgICA9IDB4QzQsCisJQ1BMX0wyVF9XUklURV9SRVEgICAgID0gMHhDNSwKKwlDUExfTDJUX1dSSVRFX1JQTCAgICAgPSAweEQ0LAorCUNQTF9MMlRfUkVBRF9SRVEgICAgICA9IDB4QzYsCisJQ1BMX0wyVF9SRUFEX1JQTCAgICAgID0gMHhDNywKKwlDUExfU01UX1dSSVRFX1JFUSAgICAgPSAweEM4LAorCUNQTF9TTVRfV1JJVEVfUlBMICAgICA9IDB4RDUsCisJQ1BMX1NNVF9SRUFEX1JFUSAgICAgID0gMHhDOSwKKwlDUExfU01UX1JFQURfUlBMICAgICAgPSAweENBLAorCUNQTF9BUlBfTUlTU19SRVEgICAgICA9IDB4Q0QsCisJQ1BMX0FSUF9NSVNTX1JQTCAgICAgID0gMHhDRSwKKwlDUExfTUlHUkFURV9DMlRfUkVRICAgPSAweERDLAorCUNQTF9NSUdSQVRFX0MyVF9SUEwgICA9IDB4REQsCisJQ1BMX0VSUk9SICAgICAgICAgICAgID0gMHhENywKKworICAgIC8qIGludGVybmFsOiBkcml2ZXIgLT4gVE9NICovCisJQ1BMX01TU19DSEFOR0UgICAgICAgID0gMHhFMQogfTsKIAotZW51bSB7ICAgICAgICAgICAgICAgIC8qIFRYX1BLVF9MU08gZXRoZXJuZXQgdHlwZXMgKi8KKyNkZWZpbmUgTlVNX0NQTF9DTURTIDI1NgorCitlbnVtIENQTF9lcnJvciB7CisJQ1BMX0VSUl9OT05FICAgICAgICAgICAgICAgPSAwLAorCUNQTF9FUlJfVENBTV9QQVJJVFkgICAgICAgID0gMSwKKwlDUExfRVJSX1RDQU1fRlVMTCAgICAgICAgICA9IDMsCisJQ1BMX0VSUl9DT05OX1JFU0VUICAgICAgICAgPSAyMCwKKwlDUExfRVJSX0NPTk5fRVhJU1QgICAgICAgICA9IDIyLAorCUNQTF9FUlJfQVJQX01JU1MgICAgICAgICAgID0gMjMsCisJQ1BMX0VSUl9CQURfU1lOICAgICAgICAgICAgPSAyNCwKKwlDUExfRVJSX0NPTk5fVElNRURPVVQgICAgICA9IDMwLAorCUNQTF9FUlJfWE1JVF9USU1FRE9VVCAgICAgID0gMzEsCisJQ1BMX0VSUl9QRVJTSVNUX1RJTUVET1VUICAgPSAzMiwKKwlDUExfRVJSX0ZJTldBSVQyX1RJTUVET1VUICA9IDMzLAorCUNQTF9FUlJfS0VFUEFMSVZFX1RJTUVET1VUID0gMzQsCisJQ1BMX0VSUl9BQk9SVF9GQUlMRUQgICAgICAgPSA0MiwKKwlDUExfRVJSX0dFTkVSQUwgICAgICAgICAgICA9IDk5Cit9OworCitlbnVtIHsKKwlDUExfQ09OTl9QT0xJQ1lfQVVUTyA9IDAsCisJQ1BMX0NPTk5fUE9MSUNZX0FTSyAgPSAxLAorCUNQTF9DT05OX1BPTElDWV9ERU5ZID0gMworfTsKKworZW51bSB7CisJVUxQX01PREVfTk9ORSAgID0gMCwKKwlVTFBfTU9ERV9UQ1BERFAgPSAxLAorCVVMUF9NT0RFX0lTQ1NJICA9IDIsCisJVUxQX01PREVfSVdBUlAgID0gMywKKwlVTFBfTU9ERV9TU0wgICAgPSA0Cit9OworCitlbnVtIHsKKwlDUExfUEFTU19PUEVOX0FDQ0VQVCwKKwlDUExfUEFTU19PUEVOX1JFSkVDVAorfTsKKworZW51bSB7CisJQ1BMX0FCT1JUX1NFTkRfUlNUID0gMCwKKwlDUExfQUJPUlRfTk9fUlNULAorCUNQTF9BQk9SVF9QT1NUX0NMT1NFX1JFUSA9IDIKK307CisKK2VudW0geyAgICAgICAgICAgICAgICAvLyBUWF9QS1RfTFNPIGV0aGVybmV0IHR5cGVzCiAJQ1BMX0VUSF9JSSwKIAlDUExfRVRIX0lJX1ZMQU4sCiAJQ1BMX0VUSF84MDJfMywKIAlDUExfRVRIXzgwMl8zX1ZMQU4KIH07CiAKLXN0cnVjdCBjcGxfcnhfZGF0YSB7Cit1bmlvbiBvcGNvZGVfdGlkIHsKKyAgICB1MzIgb3Bjb2RlX3RpZDsKKyAgICB1OCBvcGNvZGU7Cit9OworCisjZGVmaW5lIFNfT1BDT0RFIDI0CisjZGVmaW5lIFZfT1BDT0RFKHgpICgoeCkgPDwgU19PUENPREUpCisjZGVmaW5lIEdfT1BDT0RFKHgpICgoKHgpID4+IFNfT1BDT0RFKSAmIDB4RkYpCisjZGVmaW5lIEdfVElEKHgpICAgICgoeCkgJiAweEZGRkZGRikKKworLyogdGlkIGlzIGFzc3VtZWQgdG8gYmUgMjQtYml0cyAqLworI2RlZmluZSBNS19PUENPREVfVElEKG9wY29kZSwgdGlkKSAoVl9PUENPREUob3Bjb2RlKSB8ICh0aWQpKQorCisjZGVmaW5lIE9QQ09ERV9USUQoY21kKSAoKGNtZCktPm90Lm9wY29kZV90aWQpCisKKy8qIGV4dHJhY3QgdGhlIFRJRCBmcm9tIGEgQ1BMIGNvbW1hbmQgKi8KKyNkZWZpbmUgR0VUX1RJRChjbWQpIChHX1RJRChudG9obChPUENPREVfVElEKGNtZCkpKSkKKworc3RydWN0IHRjcF9vcHRpb25zIHsKKwl1MTYgbXNzOworCXU4IHdzZjsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1OCByc3ZkOjQ7CisJdTggZWNuOjE7CisJdTggc2FjazoxOworCXU4IHRzdGFtcDoxOworI2Vsc2UKKwl1OCB0c3RhbXA6MTsKKwl1OCBzYWNrOjE7CisJdTggZWNuOjE7CisJdTggcnN2ZDo0OworI2VuZGlmCit9OworCitzdHJ1Y3QgY3BsX3Bhc3Nfb3Blbl9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxvY2FsX3BvcnQ7CisJdTE2IHBlZXJfcG9ydDsKKwl1MzIgbG9jYWxfaXA7CisJdTMyIHBlZXJfaXA7CisJdTMyIG9wdDBoOworCXUzMiBvcHQwbDsKKwl1MzIgcGVlcl9uZXRtYXNrOworCXUzMiBvcHQxOworfTsKKworc3RydWN0IGNwbF9wYXNzX29wZW5fcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBsb2NhbF9wb3J0OworCXUxNiBwZWVyX3BvcnQ7CisJdTMyIGxvY2FsX2lwOworCXUzMiBwZWVyX2lwOworCXU4IHJlc3ZkWzddOworCXU4IHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfcGFzc19lc3RhYmxpc2ggeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxvY2FsX3BvcnQ7CisJdTE2IHBlZXJfcG9ydDsKKwl1MzIgbG9jYWxfaXA7CisJdTMyIHBlZXJfaXA7CisJdTMyIHRvc190aWQ7CisJdTggIGwydF9pZHg7CisJdTggIHJzdmRbM107CisJdTMyIHNuZF9pc247CisJdTMyIHJjdl9pc247Cit9OworCitzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbG9jYWxfcG9ydDsKKwl1MTYgcGVlcl9wb3J0OworCXUzMiBsb2NhbF9pcDsKKwl1MzIgcGVlcl9pcDsKKwl1MzIgdG9zX3RpZDsKKyAgICBzdHJ1Y3QgdGNwX29wdGlvbnMgdGNwX29wdGlvbnM7CisJdTggIGRzdF9tYWNbNl07CisJdTE2IHZsYW5fdGFnOworCXU4ICBzcmNfbWFjWzZdOworCXU4ICByc3ZkWzJdOworCXUzMiByY3ZfaXNuOworCXUzMiB1bmtub3duX3RjcF9vcHRpb25zOworfTsKKworc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CiAJdTMyIHJzdmQwOworCXUzMiByc3ZkMTsKKwl1MzIgcGVlcl9pcDsKKwl1MzIgb3B0MGg7CisJdW5pb24geworCXUzMiBvcHQwbDsKKwlzdHJ1Y3QgeworCSAgICB1OCByc3ZkWzNdOworCSAgICB1OCBzdGF0dXM7CisJfTsKKyAgICB9OworfTsKKworc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxvY2FsX3BvcnQ7CisJdTE2IHBlZXJfcG9ydDsKKwl1MzIgbG9jYWxfaXA7CisJdTMyIHBlZXJfaXA7CisJdTMyIG9wdDBoOworCXUzMiBvcHQwbDsKKwl1MzIgaWZmX3ZsYW50YWc7CisJdTMyIHJzdmQ7Cit9OworCitzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbG9jYWxfcG9ydDsKKwl1MTYgcGVlcl9wb3J0OworCXUzMiBsb2NhbF9pcDsKKwl1MzIgcGVlcl9pcDsKKwl1MzIgbmV3X3RpZDsKKwl1OCAgcnN2ZFszXTsKKwl1OCAgc3RhdHVzOworfTsKKworc3RydWN0IGNwbF9hY3RfZXN0YWJsaXNoIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBsb2NhbF9wb3J0OworCXUxNiBwZWVyX3BvcnQ7CisJdTMyIGxvY2FsX2lwOworCXUzMiBwZWVyX2lwOworCXUzMiB0b3NfdGlkOworCXUzMiByc3ZkOworCXUzMiBzbmRfaXNuOworCXUzMiByY3ZfaXNuOworfTsKKworc3RydWN0IGNwbF9nZXRfdGNiIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiByc3ZkOworfTsKKworc3RydWN0IGNwbF9nZXRfdGNiX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbGVuOworCXU4IHJzdmQ7CisJdTggc3RhdHVzOworfTsKKworc3RydWN0IGNwbF9zZXRfdGNiIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBsZW47CisJdTE2IHJzdmQ7Cit9OworCitzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggcnN2ZFszXTsKKwl1OCBvZmZzZXQ7CisJdTMyIG1hc2s7CisJdTMyIHZhbDsKK307CisKK3N0cnVjdCBjcGxfc2V0X3RjYl9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggcnN2ZFszXTsKKwl1OCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX3BjbWQgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGRsZW5faW47CisJdTE2IGRsZW5fb3V0OworCXUzMiBwY21kX3Bhcm1bMl07Cit9OworCitzdHJ1Y3QgY3BsX3BjbWRfcmVhZCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcnN2ZDE7CisJdTE2IHJzdmQyOworCXUzMiBhZGRyOworCXUxNiBsZW47Cit9OworCitzdHJ1Y3QgY3BsX3BjbWRfcmVhZF9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxlbjsKK307CisKK3N0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcnN2ZDsKK307CisKK3N0cnVjdCBjcGxfY2xvc2VfY29uX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCByc3ZkWzNdOworCXU4IHN0YXR1czsKKwl1MzIgc25kX254dDsKKwl1MzIgcmN2X254dDsKK307CisKK3N0cnVjdCBjcGxfY2xvc2VfbGlzdHNlcnZfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiByc3ZkOworfTsKKworc3RydWN0IGNwbF9jbG9zZV9saXN0c2Vydl9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggcnN2ZFszXTsKKwl1OCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX2Fib3J0X3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcnN2ZDA7CisJdTggIHJzdmQxOworCXU4ICBjbWQ7CisJdTggIHJzdmQyWzZdOworfTsKKworc3RydWN0IGNwbF9hYm9ydF9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIHJzdmQwOworCXU4ICByc3ZkMTsKKwl1OCAgc3RhdHVzOworCXU4ICByc3ZkMls2XTsKK307CisKK3N0cnVjdCBjcGxfcGVlcl9jbG9zZSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcnN2ZDsKK307CisKK3N0cnVjdCBjcGxfdHhfZGF0YSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgbGVuOworCXUzMiByc3ZkMDsKKwl1MTYgdXJnOworCXUxNiBmbGFnczsKK307CisKK3N0cnVjdCBjcGxfdHhfZGF0YV9hY2sgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIGFja19zZXE7Cit9OworCitzdHJ1Y3QgY3BsX3J4X2RhdGEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CiAJdTMyIGxlbjsKIAl1MzIgc2VxOwogCXUxNiB1cmc7Ci0JdTggIHJzdmQxOworCXU4ICByc3ZkOworCXU4ICBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiBjcmVkaXQ7Cit9OworCitzdHJ1Y3QgY3BsX3J4X2RhdGFfZGRwIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiBsZW47CisJdTMyIHNlcTsKKwl1MzIgbnh0X3NlcTsKKwl1MzIgdWxwX2NyYzsKKwl1MTYgZGRwX3N0YXR1czsKKwl1OCAgcnN2ZDsKIAl1OCAgc3RhdHVzOwogfTsKIApAQCAtOTksOSArNDYwLDkgQEAKIAl1OCBpcF9jc3VtX2RpczoxOwogCXU4IGw0X2NzdW1fZGlzOjE7CiAJdTggdmxhbl92YWxpZDoxOwotCXU4IHJzdmQ6MTsKKwl1OCA6MTsKICNlbHNlCi0JdTggcnN2ZDoxOworCXU4IDoxOwogCXU4IHZsYW5fdmFsaWQ6MTsKIAl1OCBsNF9jc3VtX2RpczoxOwogCXU4IGlwX2NzdW1fZGlzOjE7CkBAIC0xMTAsOCArNDcxLDcgQEAKIAl1MTYgdmxhbjsKIAlfX2JlMzIgbGVuOwogCi0JdTMyIHJzdmQyOwotCXU4IHJzdmQzOworCXU4IHJzdmRbNV07CiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCiAJdTggdGNwX2hkcl93b3Jkczo0OwogCXU4IGlwX2hkcl93b3Jkczo0OwpAQCAtMTM4LDggKzQ5OCwxNDIgQEAKIAl1OCBpZmY6NDsKICNlbmRpZgogCXUxNiBjc3VtOwotCV9fYmUxNiB2bGFuOworCXUxNiB2bGFuOwogCXUxNiBsZW47CiB9OwogCitzdHJ1Y3QgY3BsX2wydF93cml0ZV9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIHBhcmFtczsKKwl1OCByc3ZkMVsyXTsKKwl1OCBkc3RfbWFjWzZdOworfTsKKworc3RydWN0IGNwbF9sMnRfd3JpdGVfcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHN0YXR1czsKKwl1OCByc3ZkWzNdOworfTsKKworc3RydWN0IGNwbF9sMnRfcmVhZF9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggcnN2ZFszXTsKKwl1OCBsMnRfaWR4OworfTsKKworc3RydWN0IGNwbF9sMnRfcmVhZF9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIHBhcmFtczsKKwl1OCByc3ZkMVsyXTsKKwl1OCBkc3RfbWFjWzZdOworfTsKKworc3RydWN0IGNwbF9zbXRfd3JpdGVfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHJzdmQwOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXU4IHJzdmQxOjE7CisJdTggbXR1X2lkeDozOworCXU4IGlmZjo0OworI2Vsc2UKKwl1OCBpZmY6NDsKKwl1OCBtdHVfaWR4OjM7CisJdTggcnN2ZDE6MTsKKyNlbmRpZgorCXUxNiByc3ZkMjsKKwl1MTYgcnN2ZDM7CisJdTggIHNyY19tYWMxWzZdOworCXUxNiByc3ZkNDsKKwl1OCAgc3JjX21hYzBbNl07Cit9OworCitzdHJ1Y3QgY3BsX3NtdF93cml0ZV9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggc3RhdHVzOworCXU4IHJzdmRbM107Cit9OworCitzdHJ1Y3QgY3BsX3NtdF9yZWFkX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCByc3ZkMDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1OCByc3ZkMTo0OworCXU4IGlmZjo0OworI2Vsc2UKKwl1OCBpZmY6NDsKKwl1OCByc3ZkMTo0OworI2VuZGlmCisJdTE2IHJzdmQyOworfTsKKworc3RydWN0IGNwbF9zbXRfcmVhZF9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggc3RhdHVzOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXU4IHJzdmQxOjE7CisJdTggbXR1X2lkeDozOworCXU4IHJzdmQwOjQ7CisjZWxzZQorCXU4IHJzdmQwOjQ7CisJdTggbXR1X2lkeDozOworCXU4IHJzdmQxOjE7CisjZW5kaWYKKwl1MTYgcnN2ZDI7CisJdTE2IHJzdmQzOworCXU4ICBzcmNfbWFjMVs2XTsKKwl1MTYgcnN2ZDQ7CisJdTggIHNyY19tYWMwWzZdOworfTsKKworc3RydWN0IGNwbF9ydGVfZGVsZXRlX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcGFyYW1zOworfTsKKworc3RydWN0IGNwbF9ydGVfZGVsZXRlX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCBzdGF0dXM7CisJdTggcnN2ZFszXTsKK307CisKK3N0cnVjdCBjcGxfcnRlX3dyaXRlX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcGFyYW1zOworCXUzMiBuZXRtYXNrOworCXUzMiBmYWRkcjsKK307CisKK3N0cnVjdCBjcGxfcnRlX3dyaXRlX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCBzdGF0dXM7CisJdTggcnN2ZFszXTsKK307CisKK3N0cnVjdCBjcGxfcnRlX3JlYWRfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiBwYXJhbXM7Cit9OworCitzdHJ1Y3QgY3BsX3J0ZV9yZWFkX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCBzdGF0dXM7CisJdTggcnN2ZDBbMl07CisJdTggbDJ0X2lkeDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1OCByc3ZkMTo3OworCXU4IHNlbGVjdDoxOworI2Vsc2UKKwl1OCBzZWxlY3Q6MTsKKwl1OCByc3ZkMTo3OworI2VuZGlmCisJdTggcnN2ZDJbM107CisJdTMyIGFkZHI7Cit9OworCitzdHJ1Y3QgY3BsX21zc19jaGFuZ2UgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIG1zczsKK307CisKICNlbmRpZiAvKiBfQ1hHQl9DUEw1X0NNRF9IXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMKaW5kZXggYWQ3ZmY5Ni4uNTNiZWM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNTQsMzYgKzUzLDEwIEBACiAjaW5jbHVkZSAiZ21hYy5oIgogI2luY2x1ZGUgImNwaHkuaCIKICNpbmNsdWRlICJzZ2UuaCIKKyNpbmNsdWRlICJ0cC5oIgogI2luY2x1ZGUgImVzcGkuaCIKKyNpbmNsdWRlICJlbG1lcjAuaCIKIAotI2lmZGVmIHdvcmtfc3RydWN0Ci0jaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+Ci0jZGVmaW5lIElOSVRfV09SSyBJTklUX1RRVUVVRQotI2RlZmluZSBzY2hlZHVsZV93b3JrIHNjaGVkdWxlX3Rhc2sKLSNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgZmx1c2hfc2NoZWR1bGVkX3Rhc2tzCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZHVsZV9tYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphcCwgaW50IHNlY3MpCi17Ci0JbW9kX3RpbWVyKCZhcC0+c3RhdHNfdXBkYXRlX3RpbWVyLCBqaWZmaWVzICsgc2VjcyAqIEhaKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNhbmNlbF9tYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphcCkKLXsKLQlkZWxfdGltZXJfc3luYygmYXAtPnN0YXRzX3VwZGF0ZV90aW1lcik7Ci0JZmx1c2hfc2NoZWR1bGVkX3Rhc2tzKCk7Ci19Ci0KLS8qCi0gKiBTdGF0cyB1cGRhdGUgdGltZXIgZm9yIDIuNC4gIEl0IHNjaGVkdWxlcyBhIHRhc2sgdG8gZG8gdGhlIGFjdHVhbCB1cGRhdGUgYXMKLSAqIHdlIG5lZWQgdG8gYWNjZXNzIE1BQyBzdGF0aXN0aWNzIGluIHByb2Nlc3MgY29udGV4dC4KLSAqLwotc3RhdGljIHZvaWQgbWFjX3N0YXRzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYXAgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwotCi0Jc2NoZWR1bGVfdGFzaygmYXAtPnN0YXRzX3VwZGF0ZV90YXNrKTsKLX0KLSNlbHNlCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZHVsZV9tYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphcCwgaW50IHNlY3MpCkBAIC05NSw3ICs2OCw2IEBACiB7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmYXAtPnN0YXRzX3VwZGF0ZV90YXNrKTsKIH0KLSNlbmRpZgogCiAjZGVmaW5lIE1BWF9DTURRX0VOVFJJRVMgMTYzODQKICNkZWZpbmUgTUFYX0NNRFExX0VOVFJJRVMgMTAyNApAQCAtMTAzLDEwICs3NSw5IEBACiAjZGVmaW5lIE1BWF9SWF9KVU1CT19CVUZGRVJTIDE2Mzg0CiAjZGVmaW5lIE1BWF9UWF9CVUZGRVJTX0hJR0gJMTYzODRVCiAjZGVmaW5lIE1BWF9UWF9CVUZGRVJTX0xPVwkxNTM2VQorI2RlZmluZSBNQVhfVFhfQlVGRkVSUwkJMTQ2MFUKICNkZWZpbmUgTUlOX0ZMX0VOVFJJRVMgMzIKIAotI2RlZmluZSBQT1JUX01BU0sgKCgxIDw8IE1BWF9OUE9SVFMpIC0gMSkKLQogI2RlZmluZSBERkxUX01TR19FTkFCTEUgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyB8IFwKIAkJCSBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lGVVAgfFwKIAkJCSBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKQEAgLTEyNCw4ICs5NSwyMSBAQAogc3RhdGljIGludCBkZmx0X21zZ19lbmFibGUgPSBERkxUX01TR19FTkFCTEU7CiAKIG1vZHVsZV9wYXJhbShkZmx0X21zZ19lbmFibGUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRmbHRfbXNnX2VuYWJsZSwgIkNoZWxzaW8gVDEgbWVzc2FnZSBlbmFibGUgYml0bWFwIik7CitNT0RVTEVfUEFSTV9ERVNDKGRmbHRfbXNnX2VuYWJsZSwgIkNoZWxzaW8gVDEgZGVmYXVsdCBtZXNzYWdlIGVuYWJsZSBiaXRtYXAiKTsKIAorI2RlZmluZSBIQ0xPQ0sgMHgwCisjZGVmaW5lIExDTE9DSyAweDEKKworLyogVDEgY2FyZHMgcG93ZXJzYXZlIG1vZGUgKi8KK3N0YXRpYyBpbnQgdDFfY2xvY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgdDFwb3dlcnNhdmUgPSAxOwkvKiBIVyBkZWZhdWx0IGlzIHBvd2Vyc2F2ZSBtb2RlLiAqLworCittb2R1bGVfcGFyYW0odDFwb3dlcnNhdmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHQxcG93ZXJzYXZlLCAiRW5hYmxlL0Rpc2FibGUgVDEgcG93ZXJzYXZpbmcgbW9kZSIpOworCitzdGF0aWMgaW50IGRpc2FibGVfbXNpID0gMDsKK21vZHVsZV9wYXJhbShkaXNhYmxlX21zaSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9tc2ksICJEaXNhYmxlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0IChNU0kpIik7CiAKIHN0YXRpYyBjb25zdCBjaGFyIHBjaV9zcGVlZFtdWzRdID0gewogCSIzMyIsICI2NiIsICIxMDAiLCAiMTMzIgpAQCAtMTQ5LDcgKzEzMyw3IEBACiBzdGF0aWMgdm9pZCBsaW5rX3JlcG9ydChzdHJ1Y3QgcG9ydF9pbmZvICpwKQogewogCWlmICghbmV0aWZfY2Fycmllcl9vayhwLT5kZXYpKQotICAgICAgICAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgcC0+ZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgcC0+ZGV2LT5uYW1lKTsKIAllbHNlIHsKIAkJY29uc3QgY2hhciAqcyA9ICIxME1icHMiOwogCkBAIC0xNTksMTMgKzE0MywxMyBAQAogCQkJY2FzZSBTUEVFRF8xMDA6ICAgcyA9ICIxMDBNYnBzIjsgYnJlYWs7CiAJCX0KIAotICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXMsICVzLWR1cGxleFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXMsICVzLWR1cGxleFxuIiwKIAkJICAgICAgIHAtPmRldi0+bmFtZSwgcywKIAkJICAgICAgIHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCA/ICJmdWxsIiA6ICJoYWxmIik7CiAJfQogfQogCi12b2lkIHQxX2xpbmtfY2hhbmdlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQsCit2b2lkIHQxX2xpbmtfbmVnb3RpYXRlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQsCiAJCQlpbnQgc3BlZWQsIGludCBkdXBsZXgsIGludCBwYXVzZSkKIHsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gJmFkYXB0ZXItPnBvcnRbcG9ydF9pZF07CkBAIC0xNzcsNiArMTYxLDIyIEBACiAJCQluZXRpZl9jYXJyaWVyX29mZihwLT5kZXYpOwogCQlsaW5rX3JlcG9ydChwKTsKIAorCQkvKiBtdWx0aS1wb3J0czogaW5mb3JtIHRvZSAqLworCQlpZiAoKHNwZWVkID4gMCkgJiYgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPiAxKSkgeworCQkJdW5zaWduZWQgaW50IHNjaGVkX3NwZWVkID0gMTA7CisJCQlzd2l0Y2ggKHNwZWVkKSB7CisJCQljYXNlIFNQRUVEXzEwMDA6CisJCQkJc2NoZWRfc3BlZWQgPSAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBTUEVFRF8xMDA6CisJCQkJc2NoZWRfc3BlZWQgPSAxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNQRUVEXzEwOgorCQkJCXNjaGVkX3NwZWVkID0gMTA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0MV9zY2hlZF91cGRhdGVfcGFybXMoYWRhcHRlci0+c2dlLCBwb3J0X2lkLCAwLCBzY2hlZF9zcGVlZCk7CisJCX0KIAl9CiB9CiAKQEAgLTE5NSw4ICsxOTUsMTAgQEAKIHN0YXRpYyB2b2lkIGVuYWJsZV9od19jc3VtKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWlmIChhZGFwdGVyLT5mbGFncyAmIFRTT19DQVBBQkxFKQotCQl0MV90cF9zZXRfaXBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyLCAxKTsgLyogZm9yIFRTTyBvbmx5ICovCi0JdDFfdHBfc2V0X3RjcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXIsIDEpOworCQl0MV90cF9zZXRfaXBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyLT50cCwgMSk7CS8qIGZvciBUU08gb25seSAqLworCWlmIChhZGFwdGVyLT5mbGFncyAmIFVEUF9DU1VNX0NBUEFCTEUpCisJCXQxX3RwX3NldF91ZHBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyLT50cCwgMSk7CisJdDFfdHBfc2V0X3RjcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXItPnRwLCAxKTsKIH0KIAogLyoKQEAgLTIxNywxMSArMjE5LDE5IEBACiAJfQogCiAJdDFfaW50ZXJydXB0c19jbGVhcihhZGFwdGVyKTsKLQlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwKLQkJCSAgICAgICB0MV9zZWxlY3RfaW50cl9oYW5kbGVyKGFkYXB0ZXIpLCBJUlFGX1NIQVJFRCwKLQkJCSAgICAgICBhZGFwdGVyLT5uYW1lLCBhZGFwdGVyKSkpIHsKKworCWFkYXB0ZXItPnBhcmFtcy5oYXNfbXNpID0gIWRpc2FibGVfbXNpICYmIHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpID09IDA7CisJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+cGRldi0+aXJxLAorCQkJICB0MV9zZWxlY3RfaW50cl9oYW5kbGVyKGFkYXB0ZXIpLAorCQkJICBhZGFwdGVyLT5wYXJhbXMuaGFzX21zaSA/IDAgOiBJUlFGX1NIQVJFRCwKKwkJCSAgYWRhcHRlci0+bmFtZSwgYWRhcHRlcik7CisJaWYgKGVycikgeworCQlpZiAoYWRhcHRlci0+cGFyYW1zLmhhc19tc2kpCisJCQlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisKIAkJZ290byBvdXRfZXJyOwogCX0KKwogCXQxX3NnZV9zdGFydChhZGFwdGVyLT5zZ2UpOwogCXQxX2ludGVycnVwdHNfZW5hYmxlKGFkYXB0ZXIpOwogIG91dF9lcnI6CkBAIC0yMzYsNiArMjQ2LDggQEAKIAl0MV9zZ2Vfc3RvcChhZGFwdGVyLT5zZ2UpOwogCXQxX2ludGVycnVwdHNfZGlzYWJsZShhZGFwdGVyKTsKIAlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5wYXJhbXMuaGFzX21zaSkKKwkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwogfQogCiBzdGF0aWMgaW50IGN4Z2Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjkwLDcgKzMwMiw3IEBACiAKIAkvKiBEbyBhIGZ1bGwgdXBkYXRlIG9mIHRoZSBNQUMgc3RhdHMgKi8KIAlwc3RhdHMgPSBwLT5tYWMtPm9wcy0+c3RhdGlzdGljc191cGRhdGUocC0+bWFjLAotCQkJCQkJICAgICAgTUFDX1NUQVRTX1VQREFURV9GVUxMKTsKKwkJCQkJCU1BQ19TVEFUU19VUERBVEVfRlVMTCk7CiAKIAlucy0+dHhfcGFja2V0cyA9IHBzdGF0cy0+VHhVbmljYXN0RnJhbWVzT0sgKwogCQlwc3RhdHMtPlR4TXVsdGljYXN0RnJhbWVzT0sgKyBwc3RhdHMtPlR4QnJvYWRjYXN0RnJhbWVzT0s7CkBAIC0zNDQsNDcgKzM1Niw1MyBAQAogfQogCiBzdGF0aWMgY2hhciBzdGF0c19zdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKLSAgICAgICAgIlR4T2N0ZXRzT0siLAotICAgICAgICAiVHhPY3RldHNCYWQiLAotICAgICAgICAiVHhVbmljYXN0RnJhbWVzT0siLAotICAgICAgICAiVHhNdWx0aWNhc3RGcmFtZXNPSyIsCi0gICAgICAgICJUeEJyb2FkY2FzdEZyYW1lc09LIiwKLSAgICAgICAgIlR4UGF1c2VGcmFtZXMiLAotICAgICAgICAiVHhGcmFtZXNXaXRoRGVmZXJyZWRYbWlzc2lvbnMiLAotICAgICAgICAiVHhMYXRlQ29sbGlzaW9ucyIsCi0gICAgICAgICJUeFRvdGFsQ29sbGlzaW9ucyIsCi0gICAgICAgICJUeEZyYW1lc0Fib3J0ZWREdWVUb1hTQ29sbGlzaW9ucyIsCi0gICAgICAgICJUeFVuZGVycnVuIiwKLSAgICAgICAgIlR4TGVuZ3RoRXJyb3JzIiwKLSAgICAgICAgIlR4SW50ZXJuYWxNQUNYbWl0RXJyb3IiLAotICAgICAgICAiVHhGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWwiLAotICAgICAgICAiVHhGQ1NFcnJvcnMiLAorCSJUeE9jdGV0c09LIiwKKwkiVHhPY3RldHNCYWQiLAorCSJUeFVuaWNhc3RGcmFtZXNPSyIsCisJIlR4TXVsdGljYXN0RnJhbWVzT0siLAorCSJUeEJyb2FkY2FzdEZyYW1lc09LIiwKKwkiVHhQYXVzZUZyYW1lcyIsCisJIlR4RnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zIiwKKwkiVHhMYXRlQ29sbGlzaW9ucyIsCisJIlR4VG90YWxDb2xsaXNpb25zIiwKKwkiVHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnMiLAorCSJUeFVuZGVycnVuIiwKKwkiVHhMZW5ndGhFcnJvcnMiLAorCSJUeEludGVybmFsTUFDWG1pdEVycm9yIiwKKwkiVHhGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWwiLAorCSJUeEZDU0Vycm9ycyIsCiAKLSAgICAgICAgIlJ4T2N0ZXRzT0siLAotICAgICAgICAiUnhPY3RldHNCYWQiLAotICAgICAgICAiUnhVbmljYXN0RnJhbWVzT0siLAotICAgICAgICAiUnhNdWx0aWNhc3RGcmFtZXNPSyIsCi0gICAgICAgICJSeEJyb2FkY2FzdEZyYW1lc09LIiwKLSAgICAgICAgIlJ4UGF1c2VGcmFtZXMiLAotICAgICAgICAiUnhGQ1NFcnJvcnMiLAotICAgICAgICAiUnhBbGlnbkVycm9ycyIsCi0gICAgICAgICJSeFN5bWJvbEVycm9ycyIsCi0gICAgICAgICJSeERhdGFFcnJvcnMiLAotICAgICAgICAiUnhTZXF1ZW5jZUVycm9ycyIsCi0gICAgICAgICJSeFJ1bnRFcnJvcnMiLAotICAgICAgICAiUnhKYWJiZXJFcnJvcnMiLAotICAgICAgICAiUnhJbnRlcm5hbE1BQ1JjdkVycm9yIiwKLSAgICAgICAgIlJ4SW5SYW5nZUxlbmd0aEVycm9ycyIsCi0gICAgICAgICJSeE91dE9mUmFuZ2VMZW5ndGhGaWVsZCIsCi0gICAgICAgICJSeEZyYW1lVG9vTG9uZ0Vycm9ycyIsCisJIlJ4T2N0ZXRzT0siLAorCSJSeE9jdGV0c0JhZCIsCisJIlJ4VW5pY2FzdEZyYW1lc09LIiwKKwkiUnhNdWx0aWNhc3RGcmFtZXNPSyIsCisJIlJ4QnJvYWRjYXN0RnJhbWVzT0siLAorCSJSeFBhdXNlRnJhbWVzIiwKKwkiUnhGQ1NFcnJvcnMiLAorCSJSeEFsaWduRXJyb3JzIiwKKwkiUnhTeW1ib2xFcnJvcnMiLAorCSJSeERhdGFFcnJvcnMiLAorCSJSeFNlcXVlbmNlRXJyb3JzIiwKKwkiUnhSdW50RXJyb3JzIiwKKwkiUnhKYWJiZXJFcnJvcnMiLAorCSJSeEludGVybmFsTUFDUmN2RXJyb3IiLAorCSJSeEluUmFuZ2VMZW5ndGhFcnJvcnMiLAorCSJSeE91dE9mUmFuZ2VMZW5ndGhGaWVsZCIsCisJIlJ4RnJhbWVUb29Mb25nRXJyb3JzIiwKIAotCSJUU08iLAotCSJWTEFOZXh0cmFjdGlvbnMiLAotCSJWTEFOaW5zZXJ0aW9ucyIsCisJLyogUG9ydCBzdGF0cyAqLworCSJSeFBhY2tldHMiLAogCSJSeENzdW1Hb29kIiwKKwkiVHhQYWNrZXRzIiwKIAkiVHhDc3VtT2ZmbG9hZCIsCi0JIlJ4RHJvcHMiCisJIlR4VHNvIiwKKwkiUnhWbGFuIiwKKwkiVHhWbGFuIiwKIAorCS8qIEludGVycnVwdCBzdGF0cyAqLworCSJyeCBkcm9wcyIsCisJInB1cmVfcnNwcyIsCisJInVuaGFuZGxlZCBpcnFzIiwKIAkicmVzcFFfZW1wdHkiLAogCSJyZXNwUV9vdmVyZmxvdyIsCiAJImZyZWVsaXN0UV9lbXB0eSIsCkBAIC0zOTIsMTEgKzQxMCw3IEBACiAJInBrdF9taXNtYXRjaCIsCiAJImNtZFFfZnVsbDAiLAogCSJjbWRRX2Z1bGwxIiwKLQkidHhfaXBmcmFncyIsCi0JInR4X3JlZ19wa3RzIiwKLQkidHhfbHNvX3BrdHMiLAotCSJ0eF9kb19ja3N1bSIsCi0JCisKIAkiZXNwaV9ESVAyUGFyaXR5RXJyIiwKIAkiZXNwaV9ESVA0RXJyIiwKIAkiZXNwaV9SeERyb3BzIiwKQEAgLTQwNCw3ICs0MTgsNyBAQAogCSJlc3BpX1J4T3ZmbCIsCiAJImVzcGlfUGFyaXR5RXJyIgogfTsKLSAKKwogI2RlZmluZSBUMl9SRUdNQVBfU0laRSAoMyAqIDEwMjQpCiAKIHN0YXRpYyBpbnQgZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC00MzksNjUgKzQ1Myw3NyBAQAogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwogCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ubWFjOwogCWNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKnM7Ci0JY29uc3Qgc3RydWN0IHNnZV9wb3J0X3N0YXRzICpzczsKIAljb25zdCBzdHJ1Y3Qgc2dlX2ludHJfY291bnRzICp0OworCXN0cnVjdCBzZ2VfcG9ydF9zdGF0cyBzczsKIAogCXMgPSBtYWMtPm9wcy0+c3RhdGlzdGljc191cGRhdGUobWFjLCBNQUNfU1RBVFNfVVBEQVRFX0ZVTEwpOwotCXNzID0gdDFfc2dlX2dldF9wb3J0X3N0YXRzKGFkYXB0ZXItPnNnZSwgZGV2LT5pZl9wb3J0KTsKKworCSpkYXRhKysgPSBzLT5UeE9jdGV0c09LOworCSpkYXRhKysgPSBzLT5UeE9jdGV0c0JhZDsKKwkqZGF0YSsrID0gcy0+VHhVbmljYXN0RnJhbWVzT0s7CisJKmRhdGErKyA9IHMtPlR4TXVsdGljYXN0RnJhbWVzT0s7CisJKmRhdGErKyA9IHMtPlR4QnJvYWRjYXN0RnJhbWVzT0s7CisJKmRhdGErKyA9IHMtPlR4UGF1c2VGcmFtZXM7CisJKmRhdGErKyA9IHMtPlR4RnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zOworCSpkYXRhKysgPSBzLT5UeExhdGVDb2xsaXNpb25zOworCSpkYXRhKysgPSBzLT5UeFRvdGFsQ29sbGlzaW9uczsKKwkqZGF0YSsrID0gcy0+VHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnM7CisJKmRhdGErKyA9IHMtPlR4VW5kZXJydW47CisJKmRhdGErKyA9IHMtPlR4TGVuZ3RoRXJyb3JzOworCSpkYXRhKysgPSBzLT5UeEludGVybmFsTUFDWG1pdEVycm9yOworCSpkYXRhKysgPSBzLT5UeEZyYW1lc1dpdGhFeGNlc3NpdmVEZWZlcnJhbDsKKwkqZGF0YSsrID0gcy0+VHhGQ1NFcnJvcnM7CisKKwkqZGF0YSsrID0gcy0+UnhPY3RldHNPSzsKKwkqZGF0YSsrID0gcy0+UnhPY3RldHNCYWQ7CisJKmRhdGErKyA9IHMtPlJ4VW5pY2FzdEZyYW1lc09LOworCSpkYXRhKysgPSBzLT5SeE11bHRpY2FzdEZyYW1lc09LOworCSpkYXRhKysgPSBzLT5SeEJyb2FkY2FzdEZyYW1lc09LOworCSpkYXRhKysgPSBzLT5SeFBhdXNlRnJhbWVzOworCSpkYXRhKysgPSBzLT5SeEZDU0Vycm9yczsKKwkqZGF0YSsrID0gcy0+UnhBbGlnbkVycm9yczsKKwkqZGF0YSsrID0gcy0+UnhTeW1ib2xFcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4RGF0YUVycm9yczsKKwkqZGF0YSsrID0gcy0+UnhTZXF1ZW5jZUVycm9yczsKKwkqZGF0YSsrID0gcy0+UnhSdW50RXJyb3JzOworCSpkYXRhKysgPSBzLT5SeEphYmJlckVycm9yczsKKwkqZGF0YSsrID0gcy0+UnhJbnRlcm5hbE1BQ1JjdkVycm9yOworCSpkYXRhKysgPSBzLT5SeEluUmFuZ2VMZW5ndGhFcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4T3V0T2ZSYW5nZUxlbmd0aEZpZWxkOworCSpkYXRhKysgPSBzLT5SeEZyYW1lVG9vTG9uZ0Vycm9yczsKKworCXQxX3NnZV9nZXRfcG9ydF9zdGF0cyhhZGFwdGVyLT5zZ2UsIGRldi0+aWZfcG9ydCwgJnNzKTsKKwkqZGF0YSsrID0gc3MucnhfcGFja2V0czsKKwkqZGF0YSsrID0gc3MucnhfY3NvX2dvb2Q7CisJKmRhdGErKyA9IHNzLnR4X3BhY2tldHM7CisJKmRhdGErKyA9IHNzLnR4X2NzbzsKKwkqZGF0YSsrID0gc3MudHhfdHNvOworCSpkYXRhKysgPSBzcy52bGFuX3h0cmFjdDsKKwkqZGF0YSsrID0gc3Mudmxhbl9pbnNlcnQ7CisKIAl0ID0gdDFfc2dlX2dldF9pbnRyX2NvdW50cyhhZGFwdGVyLT5zZ2UpOworCSpkYXRhKysgPSB0LT5yeF9kcm9wczsKKwkqZGF0YSsrID0gdC0+cHVyZV9yc3BzOworCSpkYXRhKysgPSB0LT51bmhhbmRsZWRfaXJxczsKKwkqZGF0YSsrID0gdC0+cmVzcFFfZW1wdHk7CisJKmRhdGErKyA9IHQtPnJlc3BRX292ZXJmbG93OworCSpkYXRhKysgPSB0LT5mcmVlbGlzdFFfZW1wdHk7CisJKmRhdGErKyA9IHQtPnBrdF90b29fYmlnOworCSpkYXRhKysgPSB0LT5wa3RfbWlzbWF0Y2g7CisJKmRhdGErKyA9IHQtPmNtZFFfZnVsbFswXTsKKwkqZGF0YSsrID0gdC0+Y21kUV9mdWxsWzFdOwogCi0gICAgICAgICpkYXRhKysgPSBzLT5UeE9jdGV0c09LOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhPY3RldHNCYWQ7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeFVuaWNhc3RGcmFtZXNPSzsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4TXVsdGljYXN0RnJhbWVzT0s7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeEJyb2FkY2FzdEZyYW1lc09LOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhQYXVzZUZyYW1lczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4RnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhMYXRlQ29sbGlzaW9uczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4VG90YWxDb2xsaXNpb25zOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeFVuZGVycnVuOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhMZW5ndGhFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeEludGVybmFsTUFDWG1pdEVycm9yOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWw7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeEZDU0Vycm9yczsKKwlpZiAoYWRhcHRlci0+ZXNwaSkgeworCQljb25zdCBzdHJ1Y3QgZXNwaV9pbnRyX2NvdW50cyAqZTsKIAotICAgICAgICAqZGF0YSsrID0gcy0+UnhPY3RldHNPSzsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4T2N0ZXRzQmFkOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhVbmljYXN0RnJhbWVzT0s7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeE11bHRpY2FzdEZyYW1lc09LOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhCcm9hZGNhc3RGcmFtZXNPSzsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4UGF1c2VGcmFtZXM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeEZDU0Vycm9yczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4QWxpZ25FcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeFN5bWJvbEVycm9yczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4RGF0YUVycm9yczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4U2VxdWVuY2VFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeFJ1bnRFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeEphYmJlckVycm9yczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4SW50ZXJuYWxNQUNSY3ZFcnJvcjsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4SW5SYW5nZUxlbmd0aEVycm9yczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4T3V0T2ZSYW5nZUxlbmd0aEZpZWxkOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhGcmFtZVRvb0xvbmdFcnJvcnM7Ci0KLQkqZGF0YSsrID0gc3MtPnRzbzsKLQkqZGF0YSsrID0gc3MtPnZsYW5feHRyYWN0OwotCSpkYXRhKysgPSBzcy0+dmxhbl9pbnNlcnQ7Ci0JKmRhdGErKyA9IHNzLT5yeF9jc29fZ29vZDsKLQkqZGF0YSsrID0gc3MtPnR4X2NzbzsKLQkqZGF0YSsrID0gc3MtPnJ4X2Ryb3BzOwotCi0JKmRhdGErKyA9ICh1NjQpdC0+cmVzcFFfZW1wdHk7Ci0JKmRhdGErKyA9ICh1NjQpdC0+cmVzcFFfb3ZlcmZsb3c7Ci0JKmRhdGErKyA9ICh1NjQpdC0+ZnJlZWxpc3RRX2VtcHR5OwotCSpkYXRhKysgPSAodTY0KXQtPnBrdF90b29fYmlnOwotCSpkYXRhKysgPSAodTY0KXQtPnBrdF9taXNtYXRjaDsKLQkqZGF0YSsrID0gKHU2NCl0LT5jbWRRX2Z1bGxbMF07Ci0JKmRhdGErKyA9ICh1NjQpdC0+Y21kUV9mdWxsWzFdOwotCSpkYXRhKysgPSAodTY0KXQtPnR4X2lwZnJhZ3M7Ci0JKmRhdGErKyA9ICh1NjQpdC0+dHhfcmVnX3BrdHM7Ci0JKmRhdGErKyA9ICh1NjQpdC0+dHhfbHNvX3BrdHM7Ci0JKmRhdGErKyA9ICh1NjQpdC0+dHhfZG9fY2tzdW07CisJCWUgPSB0MV9lc3BpX2dldF9pbnRyX2NvdW50cyhhZGFwdGVyLT5lc3BpKTsKKwkJKmRhdGErKyA9IGUtPkRJUDJfcGFyaXR5X2VycjsKKwkJKmRhdGErKyA9IGUtPkRJUDRfZXJyOworCQkqZGF0YSsrID0gZS0+cnhfZHJvcHM7CisJCSpkYXRhKysgPSBlLT50eF9kcm9wczsKKwkJKmRhdGErKyA9IGUtPnJ4X292Zmx3OworCQkqZGF0YSsrID0gZS0+cGFyaXR5X2VycjsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWdfYmxvY2tfZHVtcChzdHJ1Y3QgYWRhcHRlciAqYXAsIHZvaWQgKmJ1ZiwKQEAgLTUyMSw2ICs1NDcsMTUgQEAKIAogCW1lbXNldChidWYsIDAsIFQyX1JFR01BUF9TSVpFKTsKIAlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCAwLCBBX1NHX1JFU1BBQ0NVVElNRVIpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfTUMzX0NGRywgQV9NQzRfSU5UX0NBVVNFKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX1RQSV9BRERSLCBBX1RQSV9QQVIpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfVFBfSU5fQ09ORklHLCBBX1RQX1RYX0RST1BfQ09VTlQpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfUkFUX1JPVVRFX0NPTlRST0wsIEFfUkFUX0lOVFJfQ0FVU0UpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfQ1NQSV9SWF9BRV9XTSwgQV9DU1BJX0lOVFJfRU5BQkxFKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX0VTUElfU0NIX1RPS0VOMCwgQV9FU1BJX0dPU1RBVCk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9VTFBfVUxJTUlULCBBX1VMUF9QSU9fQ1RSTCk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9QTF9FTkFCTEUsIEFfUExfQ0FVU0UpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfTUM1X0NPTkZJRywgQV9NQzVfTUFTS19XUklURV9DTUQpOwogfQogCiBzdGF0aWMgaW50IGdldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKQEAgLTUzOSwxMiArNTc0LDEyIEBACiAJCWNtZC0+ZHVwbGV4ID0gLTE7CiAJfQogCi0gICAgICAgIGNtZC0+cG9ydCA9IChjbWQtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9UUCkgPyBQT1JUX1RQIDogUE9SVF9GSUJSRTsKLSAgICAgICAgY21kLT5waHlfYWRkcmVzcyA9IHAtPnBoeS0+YWRkcjsKLSAgICAgICAgY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7Ci0gICAgICAgIGNtZC0+YXV0b25lZyA9IHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7Ci0gICAgICAgIGNtZC0+bWF4dHhwa3QgPSAwOwotICAgICAgICBjbWQtPm1heHJ4cGt0ID0gMDsKKwljbWQtPnBvcnQgPSAoY21kLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfVFApID8gUE9SVF9UUCA6IFBPUlRfRklCUkU7CisJY21kLT5waHlfYWRkcmVzcyA9IHAtPnBoeS0+YWRkcjsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwljbWQtPmF1dG9uZWcgPSBwLT5saW5rX2NvbmZpZy5hdXRvbmVnOworCWNtZC0+bWF4dHhwa3QgPSAwOworCWNtZC0+bWF4cnhwa3QgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC03MTUsNyArNzUwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKLSAgICAgICAgcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gLUVCVVNZOwogCiAJYWRhcHRlci0+cGFyYW1zLnNnZS5mcmVlbFFfc2l6ZVshanVtYm9fZmxdID0gZS0+cnhfcGVuZGluZzsKIAlhZGFwdGVyLT5wYXJhbXMuc2dlLmZyZWVsUV9zaXplW2p1bWJvX2ZsXSA9IGUtPnJ4X2p1bWJvX3BlbmRpbmc7CkBAIC03NTksNyArNzk0LDkgQEAKIAogc3RhdGljIGludCBnZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIHJldHVybiBFRVBST01fU0laRTsKKyAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKyAJcmV0dXJuIHQxX2lzX2FzaWMoYWRhcHRlcikgPyBFRVBST01fU0laRSA6IDA7CiB9CiAKICNkZWZpbmUgRUVQUk9NX01BR0lDKGFwKSBcCkBAIC04MDksNDcgKzg0NiwzNiBAQAogCS5zZXRfdHNvICAgICAgICAgICA9IHNldF90c28sCiB9OwogCi1zdGF0aWMgdm9pZCBjeGdiX3Byb2NfY2xlYW51cChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIpCi17Ci0JY29uc3QgY2hhciAqbmFtZTsKLQluYW1lID0gYWRhcHRlci0+bmFtZTsKLQlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBkaXIpOwotfQotLy8jZGVmaW5lIGNodG9lX3NldHVwX3RvZWRldihhZGFwdGVyKSBOVUxMCi0jZGVmaW5lIHVwZGF0ZV9tdHVfdGFiKGFkYXB0ZXIpCi0jZGVmaW5lIHdyaXRlX3NtdF9lbnRyeShhZGFwdGVyLCBpZHgpCi0KIHN0YXRpYyBpbnQgdDFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpyZXEsIGludCBjbWQpCiB7Ci0gICAgICAgIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwotICAgICAgICBzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocmVxKTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocmVxKTsKIAogCXN3aXRjaCAoY21kKSB7Ci0gICAgICAgIGNhc2UgU0lPQ0dNSUlQSFk6Ci0gICAgICAgICAgICAgICAgZGF0YS0+cGh5X2lkID0gYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdLnBoeS0+YWRkcjsKLSAgICAgICAgICAgICAgICAvKiBGQUxMVEhSVSAqLwotICAgICAgICBjYXNlIFNJT0NHTUlJUkVHOiB7CisJY2FzZSBTSU9DR01JSVBIWToKKwkJZGF0YS0+cGh5X2lkID0gYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdLnBoeS0+YWRkcjsKKwkJLyogRkFMTFRIUlUgKi8KKwljYXNlIFNJT0NHTUlJUkVHOiB7CiAJCXN0cnVjdCBjcGh5ICpwaHkgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ucGh5OwogCQl1MzIgdmFsOwogCiAJCWlmICghcGh5LT5tZGlvX3JlYWQpCi0gICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJICAgIHJldHVybiAtRU9QTk9UU1VQUDsKIAkJcGh5LT5tZGlvX3JlYWQoYWRhcHRlciwgZGF0YS0+cGh5X2lkLCAwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKIAkJCSAgICAgICAmdmFsKTsKLSAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0gdmFsOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlkYXRhLT52YWxfb3V0ID0gdmFsOworCQlicmVhazsKIAl9Ci0gICAgICAgIGNhc2UgU0lPQ1NNSUlSRUc6IHsKKwljYXNlIFNJT0NTTUlJUkVHOiB7CiAJCXN0cnVjdCBjcGh5ICpwaHkgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ucGh5OwogCi0gICAgICAgICAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCSAgICByZXR1cm4gLUVQRVJNOwogCQlpZiAoIXBoeS0+bWRpb193cml0ZSkKLSAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwogCQlwaHktPm1kaW9fd3JpdGUoYWRhcHRlciwgZGF0YS0+cGh5X2lkLCAwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKIAkJCSAgICAgICAgZGF0YS0+dmFsX2luKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJYnJlYWs7CiAJfQogCiAJZGVmYXVsdDoKQEAgLTg2NSw5ICs4OTEsOSBAQAogCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ubWFjOwogCiAJaWYgKCFtYWMtPm9wcy0+c2V0X210dSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiAtRU9QTk9UU1VQUDsKIAlpZiAobmV3X210dSA8IDY4KQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKHJldCA9IG1hYy0+b3BzLT5zZXRfbXR1KG1hYywgbmV3X210dSkpKQogCQlyZXR1cm4gcmV0OwogCWRldi0+bXR1ID0gbmV3X210dTsKQEAgLTkxOCw3ICs5NDQsNyBAQAogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotICAgICAgICB0MV9zZWxlY3RfaW50cl9oYW5kbGVyKGFkYXB0ZXIpKGFkYXB0ZXItPnBkZXYtPmlycSwgYWRhcHRlcik7CisJdDFfc2VsZWN0X2ludHJfaGFuZGxlcihhZGFwdGVyKShhZGFwdGVyLT5wZGV2LT5pcnEsIGFkYXB0ZXIpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KICNlbmRpZgpAQCAtOTU1LDE0ICs5ODEsMTQgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRhdGE7CiAKLQllbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKwl0MV9lbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKIAogCS8qIE5vdyByZWVuYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHRzICovCiAJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7CiAJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfD0gRl9QTF9JTlRSX0VYVDsKIAl3cml0ZWwoRl9QTF9JTlRSX0VYVCwgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOwogCXdyaXRlbChhZGFwdGVyLT5zbG93X2ludHJfbWFzayB8IEZfUExfSU5UUl9TR0VfREFUQSwKLSAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCQkgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOwogCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7CiB9CiAKQEAgLTk3OCw3ICsxMDA0LDcgQEAKIAkgKi8KIAlhZGFwdGVyLT5zbG93X2ludHJfbWFzayAmPSB+Rl9QTF9JTlRSX0VYVDsKIAl3cml0ZWwoYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfCBGX1BMX0lOVFJfU0dFX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwkJICAgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKIAlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5leHRfaW50cl9oYW5kbGVyX3Rhc2spOwogfQogCkBAIC0xMDExLDcgKzEwMzcsNyBAQAogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKKwkJcmV0dXJuIGVycjsKIAogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgewogCQlDSF9FUlIoIiVzOiBjYW5ub3QgZmluZCBQQ0kgZGV2aWNlIG1lbW9yeSBiYXNlIGFkZHJlc3NcbiIsCkBAIC0xMDQzLDcgKzEwNjksNyBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLSAgICBtbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwogCWJpID0gdDFfZ2V0X2JvYXJkX2luZm8oZW50LT5kcml2ZXJfZGF0YSk7CiAKQEAgLTEwODEsMjEgKzExMDcsMTUgQEAKIAkJCWFkYXB0ZXItPm1zZ19lbmFibGUgPSBkZmx0X21zZ19lbmFibGU7CiAJCQlhZGFwdGVyLT5tbWlvX2xlbiA9IG1taW9fbGVuOwogCi0JCQlpbml0X01VVEVYKCZhZGFwdGVyLT5taWJfbXV0ZXgpOwogCQkJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRwaV9sb2NrKTsKIAkJCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT53b3JrX2xvY2spOwogCQkJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmFzeW5jX2xvY2spOworCQkJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm1hY19sb2NrKTsKIAogCQkJSU5JVF9XT1JLKCZhZGFwdGVyLT5leHRfaW50cl9oYW5kbGVyX3Rhc2ssCiAJCQkJICBleHRfaW50cl90YXNrLCBhZGFwdGVyKTsKIAkJCUlOSVRfV09SSygmYWRhcHRlci0+c3RhdHNfdXBkYXRlX3Rhc2ssIG1hY19zdGF0c190YXNrLAogCQkJCSAgYWRhcHRlcik7Ci0jaWZkZWYgd29ya19zdHJ1Y3QKLQkJCWluaXRfdGltZXIoJmFkYXB0ZXItPnN0YXRzX3VwZGF0ZV90aW1lcik7Ci0JCQlhZGFwdGVyLT5zdGF0c191cGRhdGVfdGltZXIuZnVuY3Rpb24gPSBtYWNfc3RhdHNfdGltZXI7Ci0JCQlhZGFwdGVyLT5zdGF0c191cGRhdGVfdGltZXIuZGF0YSA9Ci0JCQkJKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKLSNlbmRpZgogCiAJCQlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKIAkJfQpAQCAtMTEyMiwxNiArMTE0MiwxOSBAQAogCQkJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gdmxhbl9yeF9yZWdpc3RlcjsKIAkJCW5ldGRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IHZsYW5fcnhfa2lsbF92aWQ7CiAjZW5kaWYKLQkJCWFkYXB0ZXItPmZsYWdzIHw9IFRTT19DQVBBQkxFOwotCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworCQkJLyogVDIwNDogZGlzYWJsZSBUU08gKi8KKwkJCWlmICghKGlzX1QyKGFkYXB0ZXIpKSB8fCBiaS0+cG9ydF9udW1iZXIgIT0gNCkgeworCQkJCWFkYXB0ZXItPmZsYWdzIHw9IFRTT19DQVBBQkxFOworCQkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisJCQl9CiAJCX0KIAogCQluZXRkZXYtPm9wZW4gPSBjeGdiX29wZW47CiAJCW5ldGRldi0+c3RvcCA9IGN4Z2JfY2xvc2U7CiAJCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gdDFfc3RhcnRfeG1pdDsKIAkJbmV0ZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gKGFkYXB0ZXItPmZsYWdzICYgVFNPX0NBUEFCTEUpID8KLQkJCXNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdF9sc28pIDoKLQkJCXNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCk7CisJCQlzaXplb2Yoc3RydWN0IGNwbF90eF9wa3RfbHNvKSA6IHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCk7CiAJCW5ldGRldi0+Z2V0X3N0YXRzID0gdDFfZ2V0X3N0YXRzOwogCQluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHQxX3NldF9yeG1vZGU7CiAJCW5ldGRldi0+ZG9faW9jdGwgPSB0MV9pb2N0bDsKQEAgLTExNDIsNyArMTE2NSw3IEBACiAjZW5kaWYKIAkJbmV0ZGV2LT53ZWlnaHQgPSA2NDsKIAotICAgICAgICBTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmdDFfZXRodG9vbF9vcHMpOworCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmdDFfZXRodG9vbF9vcHMpOwogCX0KIAogCWlmICh0MV9pbml0X3N3X21vZHVsZXMoYWRhcHRlciwgYmkpIDwgMCkgewpAQCAtMTE2OSw3ICsxMTkyLDcgQEAKIAkJCWlmICghYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwKQogCQkJCWFkYXB0ZXItPm5hbWUgPSBhZGFwdGVyLT5wb3J0W2ldLmRldi0+bmFtZTsKIAotICAgICAgICAgICAgICAgIF9fc2V0X2JpdChpLCAmYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwKTsKKwkJCV9fc2V0X2JpdChpLCAmYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwKTsKIAkJfQogCX0KIAlpZiAoIWFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkgewpAQCAtMTE4MiwxOCArMTIwNSwyOCBAQAogCSAgICAgICBiaS0+ZGVzYywgYWRhcHRlci0+cGFyYW1zLmNoaXBfcmV2aXNpb24sCiAJICAgICAgIGFkYXB0ZXItPnBhcmFtcy5wY2kuaXNfcGNpeCA/ICJQQ0lYIiA6ICJQQ0kiLAogCSAgICAgICBhZGFwdGVyLT5wYXJhbXMucGNpLnNwZWVkLCBhZGFwdGVyLT5wYXJhbXMucGNpLndpZHRoKTsKKworCS8qCisJICogU2V0IHRoZSBUMUIgQVNJQyBhbmQgbWVtb3J5IGNsb2Nrcy4KKwkgKi8KKwlpZiAodDFwb3dlcnNhdmUpCisJCWFkYXB0ZXItPnQxcG93ZXJzYXZlID0gTENMT0NLOwkvKiBIVyBkZWZhdWx0IGlzIHBvd2Vyc2F2ZSBtb2RlLiAqLworCWVsc2UKKwkJYWRhcHRlci0+dDFwb3dlcnNhdmUgPSBIQ0xPQ0s7CisJaWYgKHQxX2lzX1QxQihhZGFwdGVyKSkKKwkJdDFfY2xvY2soYWRhcHRlciwgdDFwb3dlcnNhdmUpOworCiAJcmV0dXJuIDA7CiAKICBvdXRfcmVsZWFzZV9hZGFwdGVyX3JlczoKIAl0MV9mcmVlX3N3X21vZHVsZXMoYWRhcHRlcik7CiAgb3V0X2ZyZWVfZGV2OgogCWlmIChhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyLT5yZWdzKSBpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCQlpZiAoYWRhcHRlci0+cmVncykKKwkJCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CiAJCWZvciAoaSA9IGJpLT5wb3J0X251bWJlciAtIDE7IGkgPj0gMDsgLS1pKQotCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0uZGV2KSB7Ci0JCQkJY3hnYl9wcm9jX2NsZWFudXAoYWRhcHRlciwgcHJvY19yb290X2RyaXZlcik7Ci0JCQkJa2ZyZWUoYWRhcHRlci0+cG9ydFtpXS5kZXYpOwotCQkJfQorCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0uZGV2KQorCQkJCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0uZGV2KTsKIAl9CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKICBvdXRfZGlzYWJsZV9wZGV2OgpAQCAtMTIwMiw2ICsxMjM1LDE1NSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIGJpdF9iYW5nKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgYml0ZGF0YSwgaW50IG5iaXRzKQoreworCWludCBkYXRhOworCWludCBpOworCXUzMiB2YWw7CisKKwllbnVtIHsKKwkJU19DTE9DSyA9IDEgPDwgMywKKwkJU19EQVRBID0gMSA8PCA0CisJfTsKKworCWZvciAoaSA9IChuYml0cyAtIDEpOyBpID4gLTE7IGktLSkgeworCisJCXVkZWxheSg1MCk7CisKKwkJZGF0YSA9ICgoYml0ZGF0YSA+PiBpKSAmIDB4MSk7CisJCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKworCQlpZiAoZGF0YSkKKwkJCXZhbCB8PSBTX0RBVEE7CisJCWVsc2UKKwkJCXZhbCAmPSB+U19EQVRBOworCisJCXVkZWxheSg1MCk7CisKKwkJLyogU2V0IFNDTE9DSyBsb3cgKi8KKwkJdmFsICY9IH5TX0NMT0NLOworCQlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisKKwkJdWRlbGF5KDUwKTsKKworCQkvKiBXcml0ZSBTQ0xPQ0sgaGlnaCAqLworCQl2YWwgfD0gU19DTE9DSzsKKwkJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCisJfQorfQorCitzdGF0aWMgaW50IHQxX2Nsb2NrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgbW9kZSkKK3sKKwl1MzIgdmFsOworCWludCBNX0NPUkVfVkFMOworCWludCBNX01FTV9WQUw7CisKKwllbnVtIHsKKwkJTV9DT1JFX0JJVFMgPSA5LAorCQlUX0NPUkVfVkFMID0gMCwKKwkJVF9DT1JFX0JJVFMgPSAyLAorCQlOX0NPUkVfVkFMID0gMCwKKwkJTl9DT1JFX0JJVFMgPSAyLAorCQlNX01FTV9CSVRTID0gOSwKKwkJVF9NRU1fVkFMID0gMCwKKwkJVF9NRU1fQklUUyA9IDIsCisJCU5fTUVNX1ZBTCA9IDAsCisJCU5fTUVNX0JJVFMgPSAyLAorCQlOUF9MT0FEID0gMSA8PCAxNywKKwkJU19MT0FEX01FTSA9IDEgPDwgNSwKKwkJU19MT0FEX0NPUkUgPSAxIDw8IDYsCisJCVNfQ0xPQ0sgPSAxIDw8IDMKKwl9OworCisJaWYgKCF0MV9pc19UMUIoYWRhcHRlcikpCisJCXJldHVybiAtRU5PREVWOwkvKiBDYW4ndCByZS1jbG9jayB0aGlzIGNoaXAuICovCisKKwlpZiAobW9kZSAmIDIpIHsKKwkJcmV0dXJuIDA7CS8qIHNob3cgY3VycmVudCBtb2RlLiAqLworCX0KKworCWlmICgoYWRhcHRlci0+dDFwb3dlcnNhdmUgJiAxKSA9PSAobW9kZSAmIDEpKQorCQlyZXR1cm4gLUVBTFJFQURZOwkvKiBBU0lDIGFscmVhZHkgcnVubmluZyBpbiBtb2RlLiAqLworCisJaWYgKChtb2RlICYgMSkgPT0gSENMT0NLKSB7CisJCU1fQ09SRV9WQUwgPSAweDE0OworCQlNX01FTV9WQUwgPSAweDE4OworCQlhZGFwdGVyLT50MXBvd2Vyc2F2ZSA9IEhDTE9DSzsJLyogb3ZlcmNsb2NrICovCisJfSBlbHNlIHsKKwkJTV9DT1JFX1ZBTCA9IDB4ZTsKKwkJTV9NRU1fVkFMID0gMHgxMDsKKwkJYWRhcHRlci0+dDFwb3dlcnNhdmUgPSBMQ0xPQ0s7CS8qIHVuZGVyY2xvY2sgKi8KKwl9CisKKwkvKiBEb24ndCBpbnRlcnJ1cHQgdGhpcyBzZXJpYWwgc3RyZWFtISAqLworCXNwaW5fbG9jaygmYWRhcHRlci0+dHBpX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSBmb3IgQVNJQyBjb3JlICovCisJX190MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCXZhbCB8PSBOUF9MT0FEOworCXVkZWxheSg1MCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCXVkZWxheSg1MCk7CisJX190MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCXZhbCAmPSB+U19MT0FEX0NPUkU7CisJdmFsICY9IH5TX0NMT0NLOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwl1ZGVsYXkoNTApOworCisJLyogU2VyaWFsIHByb2dyYW0gdGhlIEFTSUMgY2xvY2sgc3ludGhlc2l6ZXIgKi8KKwliaXRfYmFuZyhhZGFwdGVyLCBUX0NPUkVfVkFMLCBUX0NPUkVfQklUUyk7CisJYml0X2JhbmcoYWRhcHRlciwgTl9DT1JFX1ZBTCwgTl9DT1JFX0JJVFMpOworCWJpdF9iYW5nKGFkYXB0ZXIsIE1fQ09SRV9WQUwsIE1fQ09SRV9CSVRTKTsKKwl1ZGVsYXkoNTApOworCisJLyogRmluaXNoIEFTSUMgY29yZSAqLworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgfD0gU19MT0FEX0NPUkU7CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJdmFsICY9IH5TX0xPQURfQ09SRTsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwl1ZGVsYXkoNTApOworCisJLyogSW5pdGlhbGl6ZSBmb3IgbWVtb3J5ICovCisJX190MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCXZhbCB8PSBOUF9MT0FEOworCXVkZWxheSg1MCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCXVkZWxheSg1MCk7CisJX190MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCXZhbCAmPSB+U19MT0FEX01FTTsKKwl2YWwgJj0gflNfQ0xPQ0s7CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDUwKTsKKworCS8qIFNlcmlhbCBwcm9ncmFtIHRoZSBtZW1vcnkgY2xvY2sgc3ludGhlc2l6ZXIgKi8KKwliaXRfYmFuZyhhZGFwdGVyLCBUX01FTV9WQUwsIFRfTUVNX0JJVFMpOworCWJpdF9iYW5nKGFkYXB0ZXIsIE5fTUVNX1ZBTCwgTl9NRU1fQklUUyk7CisJYml0X2JhbmcoYWRhcHRlciwgTV9NRU1fVkFMLCBNX01FTV9CSVRTKTsKKwl1ZGVsYXkoNTApOworCisJLyogRmluaXNoIG1lbW9yeSAqLworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgfD0gU19MT0FEX01FTTsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgJj0gflNfTE9BRF9NRU07CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHBpX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB0MV9zd19yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIEFfUENJQ0ZHX1BNX0NTUiwgMyk7CkBAIC0xMjIzLDEwICsxNDA1LDkgQEAKIAkJdDFfZnJlZV9zd19tb2R1bGVzKGFkYXB0ZXIpOwogCQlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOwogCQl3aGlsZSAoLS1pID49IDApCi0JCQlpZiAoYWRhcHRlci0+cG9ydFtpXS5kZXYpIHsKLQkJCQljeGdiX3Byb2NfY2xlYW51cChhZGFwdGVyLCBwcm9jX3Jvb3RfZHJpdmVyKTsKLQkJCQlrZnJlZShhZGFwdGVyLT5wb3J0W2ldLmRldik7Ci0JCQl9CisJCQlpZiAoYWRhcHRlci0+cG9ydFtpXS5kZXYpCisJCQkJZnJlZV9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXS5kZXYpOworCiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9lbG1lcjAuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZWxtZXIwLmgKaW5kZXggNTU5MGNiMi4uOWViZWNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9lbG1lcjAuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VsbWVyMC5oCkBAIC0zOSw2ICszOSwxMiBAQAogI2lmbmRlZiBfQ1hHQl9FTE1FUjBfSF8KICNkZWZpbmUgX0NYR0JfRUxNRVIwX0hfCiAKKy8qIEVMTUVSMCBmbGF2b3JzICovCitlbnVtIHsKKwlFTE1FUjBfWEMyUzMwMEVfNkZUMjU2X0MsCisJRUxNRVIwX1hDMlMxMDBFXzZUUTE0NF9DCit9OworCiAvKiBFTE1FUjAgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFfRUxNRVIwX1ZFUlNJT04gMHgxMDAwMDAKICNkZWZpbmUgQV9FTE1FUjBfUEhZX0NGRyAweDEwMDAwNApAQCAtMTQ5LDMgKzE1NSw0IEBACiAjZGVmaW5lIE1JMV9PUF9JTkRJUkVDVF9SRUFEICAgICAzCiAKICNlbmRpZiAvKiBfQ1hHQl9FTE1FUjBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuYwppbmRleCA1NDJlNWUwLi40MTkyZjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuYwpAQCAtODEsNDYgKzgxLDM2IEBACiAJcmV0dXJuIGJ1c3k7CiB9CiAKLS8qIDEuIERlYXNzZXJ0IHJ4X3Jlc2V0X2NvcmUuICovCi0vKiAyLiBQcm9ncmFtIFRSSUNOX0NORkcgcmVnaXN0ZXJzLiAqLwotLyogMy4gRGVhc3NlcnQgcnhfcmVzZXRfbGluayAqLwogc3RhdGljIGludCB0cmljbl9pbml0KGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlpbnQgICAgIGkgICAgICAgICAgICAgICA9IDA7Ci0JaW50ICAgICBzdGF0ICAgICAgICAgICAgPSAwOwotCWludCAgICAgdGltZW91dCAgICAgICAgID0gMDsKLQlpbnQgICAgIGlzX3JlYWR5ICAgICAgICA9IDA7CisJaW50IGksIHNtZSA9IDE7CiAKLQkvKiAxICovCi0JdGltZW91dD0xMDAwOwotCWRvIHsKLQkJc3RhdCA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfUkVTRVQpOwotCQlpc19yZWFkeSA9IChzdGF0ICYgMHg0KTsKLQkJdGltZW91dC0tOwotCQl1ZGVsYXkoNSk7Ci0JfSB3aGlsZSAoIWlzX3JlYWR5IHx8ICh0aW1lb3V0PT0wKSk7Ci0Jd3JpdGVsKDB4MiwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9SRVNFVCk7Ci0JaWYgKHRpbWVvdXQ9PTApCi0JewotCQlDSF9FUlIoIkVTUEkgOiBFUlJPUiA6IFRpbWVvdXQgdHJpY25faW5pdCgpIFxuIik7Ci0JCXQxX2ZhdGFsX2VycihhZGFwdGVyKTsKKwlpZiAoIShyZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKSAgJiBGX1JYX0NMS19TVEFUVVMpKSB7CisJCUNIX0VSUigiJXM6IEVTUEkgY2xvY2sgbm90IHJlYWR5XG4iLCBhZGFwdGVyLT5uYW1lKTsKKwkJcmV0dXJuIC0xOwogCX0KIAotCS8qIDIgKi8KLQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAwLCAwLCBUUklDTl9DTkZHLCAweDgxKTsKLQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAxLCAwLCBUUklDTl9DTkZHLCAweDgxKTsKLQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCAwLCBUUklDTl9DTkZHLCAweDgxKTsKLQlmb3IgKGk9MTsgaTw9IDg7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMCwgaSwgVFJJQ05fQ05GRywgMHhmMSk7Ci0JZm9yIChpPTE7IGk8PSAyOyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDEsIGksIFRSSUNOX0NORkcsIDB4ZjEpOwotCWZvciAoaT0xOyBpPD0gMzsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCBpLCBUUklDTl9DTkZHLCAweGUxKTsKLQlmb3IgKGk9NDsgaTw9IDQ7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHhmMSk7Ci0JZm9yIChpPTU7IGk8PSA1OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ZTEpOwotCWZvciAoaT02OyBpPD0gNjsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKLQlmb3IgKGk9NzsgaTw9IDc7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHg4MCk7Ci0JZm9yIChpPTg7IGk8PSA4OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ZjEpOworCXdyaXRlbChGX0VTUElfUlhfQ09SRV9SU1QsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfUkVTRVQpOwogCi0JLyogMyAqLwotCXdyaXRlbCgweDMsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfUkVTRVQpOworCWlmIChzbWUpIHsKKwkJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMCwgMCwgVFJJQ05fQ05GRywgMHg4MSk7CisJCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDEsIDAsIFRSSUNOX0NORkcsIDB4ODEpOworCQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCAwLCBUUklDTl9DTkZHLCAweDgxKTsKKwl9CisJZm9yIChpID0gMTsgaSA8PSA4OyBpKyspCisJCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDAsIGksIFRSSUNOX0NORkcsIDB4ZjEpOworCWZvciAoaSA9IDE7IGkgPD0gMjsgaSsrKQorCQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAxLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKKwlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykKKwkJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHhlMSk7CisJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgNCwgVFJJQ05fQ05GRywgMHhmMSk7CisJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgNSwgVFJJQ05fQ05GRywgMHhlMSk7CisJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgNiwgVFJJQ05fQ05GRywgMHhmMSk7CisJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgNywgVFJJQ05fQ05GRywgMHg4MCk7CisJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgOCwgVFJJQ05fQ05GRywgMHhmMSk7CisKKwl3cml0ZWwoRl9FU1BJX1JYX0NPUkVfUlNUIHwgRl9FU1BJX1JYX0xOS19SU1QsCisJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfUkVTRVQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDMsNiArMTMzLDcgQEAKIAogdm9pZCB0MV9lc3BpX2ludHJfY2xlYXIoc3RydWN0IHBlZXNwaSAqZXNwaSkKIHsKKwlyZWFkbChlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0RJUDJfRVJSX0NPVU5UKTsKIAl3cml0ZWwoMHhmZmZmZmZmZiwgZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX1NUQVRVUyk7CiAJd3JpdGVsKEZfUExfSU5UUl9FU1BJLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CiB9CkBAIC0xNTcsNyArMTQ4LDYgQEAKIAogaW50IHQxX2VzcGlfaW50cl9oYW5kbGVyKHN0cnVjdCBwZWVzcGkgKmVzcGkpCiB7Ci0JdTMyIGNudDsKIAl1MzIgc3RhdHVzID0gcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX1NUQVRVUyk7CiAKIAlpZiAoc3RhdHVzICYgRl9ESVA0RVJSKQpAQCAtMTc3LDcgKzE2Nyw3IEBACiAJCSAqIE11c3QgcmVhZCB0aGUgZXJyb3IgY291bnQgdG8gY2xlYXIgdGhlIGludGVycnVwdAogCQkgKiB0aGF0IGl0IGNhdXNlcy4KIAkJICovCi0JCWNudCA9IHJlYWRsKGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfRElQMl9FUlJfQ09VTlQpOworCQlyZWFkbChlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0RJUDJfRVJSX0NPVU5UKTsKIAl9CiAKIAkvKgpAQCAtMTkyLDcgKzE4Miw3IEBACiAKIGNvbnN0IHN0cnVjdCBlc3BpX2ludHJfY291bnRzICp0MV9lc3BpX2dldF9pbnRyX2NvdW50cyhzdHJ1Y3QgcGVlc3BpICplc3BpKQogewotICAgIHJldHVybiAmZXNwaS0+aW50cl9jbnQ7CisJcmV0dXJuICZlc3BpLT5pbnRyX2NudDsKIH0KIAogc3RhdGljIHZvaWQgZXNwaV9zZXR1cF9mb3JfcG0zMzkzKGFkYXB0ZXJfdCAqYWRhcHRlcikKQEAgLTIxMCwxNyArMjAwLDQ1IEBACiAJd3JpdGVsKFZfUlhfTlBPUlRTKDEpIHwgVl9UWF9OUE9SVFMoMSksIGFkYXB0ZXItPnJlZ3MgKyBBX1BPUlRfQ09ORklHKTsKIH0KIAotLyogVDIgSW5pdCBwYXJ0IC0tICAqLwotLyogMS4gU2V0IFRfRVNQSV9NSVNDQ1RSTF9BRERSICovCi0vKiAyLiBJbml0IEVTUEkgcmVnaXN0ZXJzLiAqLwotLyogMy4gSW5pdCBUcmlDTiBIYXJkIE1hY3JvICovCitzdGF0aWMgdm9pZCBlc3BpX3NldHVwX2Zvcl92c2M3MzIxKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKyAgICAgICAgd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjApOworICAgICAgICB3cml0ZWwoMHgxZjQwMWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjEpOworICAgICAgICB3cml0ZWwoMHgxZjQsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMik7CisJd3JpdGVsKDB4YTAwLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0ZVTExfV0FURVJNQVJLKTsKKwl3cml0ZWwoMHgxZmYsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRU1QVFlfV0FURVJNQVJLKTsKKwl3cml0ZWwoMSwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9DQUxFTkRBUl9MRU5HVEgpOworCXdyaXRlbChWX1JYX05QT1JUUyg0KSB8IFZfVFhfTlBPUlRTKDQpLCBhZGFwdGVyLT5yZWdzICsgQV9QT1JUX0NPTkZJRyk7CisKKwl3cml0ZWwoMHgwODAwMDAwOCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9UUkFJTik7Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgVDFCIHJlcXVpcmVzIGF0IGxlYXN0IDIgcG9ydHMgZm9yIElYRjEwMTAgZHVlIHRvIGEgSFcgYnVnLgorICovCitzdGF0aWMgdm9pZCBlc3BpX3NldHVwX2Zvcl9peGYxMDEwKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IG5wb3J0cykKK3sKKwl3cml0ZWwoMSwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9DQUxFTkRBUl9MRU5HVEgpOworCWlmIChucG9ydHMgPT0gNCkgeworCQlpZiAoaXNfVDIoYWRhcHRlcikpIHsKKwkJCXdyaXRlbCgweGYwMCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9GSUZPX0FMTU9TVF9GVUxMX1dBVEVSTUFSSyk7CisJCQl3cml0ZWwoMHgzYzAsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRU1QVFlfV0FURVJNQVJLKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlbCgweDdmZiwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9GSUZPX0FMTU9TVF9GVUxMX1dBVEVSTUFSSyk7CisJCQl3cml0ZWwoMHgxZmYsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRU1QVFlfV0FURVJNQVJLKTsKKwkJfQorCX0gZWxzZSB7CisJCXdyaXRlbCgweDFmZmYsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRlVMTF9XQVRFUk1BUkspOworCQl3cml0ZWwoMHg3ZmYsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRU1QVFlfV0FURVJNQVJLKTsKKwl9CisJd3JpdGVsKFZfUlhfTlBPUlRTKG5wb3J0cykgfCBWX1RYX05QT1JUUyhucG9ydHMpLCBhZGFwdGVyLT5yZWdzICsgQV9QT1JUX0NPTkZJRyk7CisKK30KKwogaW50IHQxX2VzcGlfaW5pdChzdHJ1Y3QgcGVlc3BpICplc3BpLCBpbnQgbWFjX3R5cGUsIGludCBucG9ydHMpCiB7Ci0JdTMyIGNudDsKLQogCXUzMiBzdGF0dXNfZW5hYmxlX2V4dHJhID0gMDsKIAlhZGFwdGVyX3QgKmFkYXB0ZXIgPSBlc3BpLT5hZGFwdGVyOwotCXUzMiBzdGF0dXMsIGJ1cnN0dmFsID0gMHg4MDAxMDA7CiAKIAkvKiBEaXNhYmxlIEVTUEkgdHJhaW5pbmcuICBNQUNzIHRoYXQgY2FuIGhhbmRsZSBpdCBlbmFibGUgaXQgYmVsb3cuICovCiAJd3JpdGVsKDAsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfVFJBSU4pOwpAQCAtMjI5LDM4ICsyNDcsMjAgQEAKIAkJd3JpdGVsKFZfT1VUX09GX1NZTkNfQ09VTlQoNCkgfAogCQkgICAgICAgVl9ESVAyX1BBUklUWV9FUlJfVEhSRVMoMykgfAogCQkgICAgICAgVl9ESVA0X1RIUkVTKDEpLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7Ci0JCWlmIChucG9ydHMgPT0gNCkgewotCQkJLyogVDIwNDogbWF4YnVyc3QxID0gMHg0MCwgbWF4YnVyc3QyID0gMHgyMCAqLwotCQkJYnVyc3R2YWwgPSAweDIwMDA0MDsKLQkJfQotCX0KLQl3cml0ZWwoYnVyc3R2YWwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUFYQlVSU1QxX01BWEJVUlNUMik7CisgICAgICAgIAl3cml0ZWwobnBvcnRzID09IDQgPyAweDIwMDA0MCA6IDB4MTAwMDA4MCwKKwkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUFYQlVSU1QxX01BWEJVUlNUMik7CisJfSBlbHNlCisgICAgICAgIAl3cml0ZWwoMHg4MDAxMDAsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUFYQlVSU1QxX01BWEJVUlNUMik7CiAKLQlzd2l0Y2ggKG1hY190eXBlKSB7Ci0JY2FzZSBDSEJUX01BQ19QTTMzOTM6CisJaWYgKG1hY190eXBlID09IENIQlRfTUFDX1BNMzM5MykKIAkJZXNwaV9zZXR1cF9mb3JfcG0zMzkzKGFkYXB0ZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgorCWVsc2UgaWYgKG1hY190eXBlID09IENIQlRfTUFDX1ZTQzczMjEpCisJCWVzcGlfc2V0dXBfZm9yX3ZzYzczMjEoYWRhcHRlcik7CisJZWxzZSBpZiAobWFjX3R5cGUgPT0gQ0hCVF9NQUNfSVhGMTAxMCkgeworCQlzdGF0dXNfZW5hYmxlX2V4dHJhID0gRl9JTlRFTDEwMTBNT0RFOworCQllc3BpX3NldHVwX2Zvcl9peGYxMDEwKGFkYXB0ZXIsIG5wb3J0cyk7CisJfSBlbHNlCiAJCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzIGZyb20gdGhlIFNQSSBhcmUKLQkgKiBDbGVhcmVkIGJlZm9yZSBlbmFibGluZyB0aGUgaW50ZXJydXB0LgotCSAqLwotCXdyaXRlbChFU1BJX0lOVFJfTUFTSywgZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX0VOQUJMRSk7Ci0Jc3RhdHVzID0gcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX1NUQVRVUyk7Ci0JaWYgKHN0YXR1cyAmIEZfRElQMlBBUklUWUVSUikgewotCQljbnQgPSByZWFkbChlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0RJUDJfRVJSX0NPVU5UKTsKLQl9Ci0KLQkvKgotCSAqIEZvciBUMUIgd2UgbmVlZCB0byB3cml0ZSAxIHRvIGNsZWFyIEVTUEkgaW50ZXJydXB0cy4gIEZvciBUMisgd2UKLQkgKiB3cml0ZSB0aGUgc3RhdHVzIGFzIGlzLgotCSAqLwotCWlmIChzdGF0dXMgJiYgdDFfaXNfVDFCKGVzcGktPmFkYXB0ZXIpKQotCQlzdGF0dXMgPSAxOwotCXdyaXRlbChzdGF0dXMsIGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfSU5UUl9TVEFUVVMpOwogCiAJd3JpdGVsKHN0YXR1c19lbmFibGVfZXh0cmEgfCBGX1JYU1RBVFVTRU5BQkxFLAogCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX0ZJRk9fU1RBVFVTX0VOQUJMRSk7CkBAIC0yNzEsOSArMjcxLDExIEBACiAJCSAqIEFsd2F5cyBwb3NpdGlvbiB0aGUgY29udHJvbCBhdCB0aGUgMXN0IHBvcnQgZWdyZXNzIElOCiAJCSAqIChzb3AsZW9wKSBjb3VudGVyIHRvIHJlZHVjZSBQSU9zIGZvciBUL04yMTAgd29ya2Fyb3VuZC4KIAkJICovCi0JCWVzcGktPm1pc2NfY3RybCA9IChyZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCkKLQkJCQkgICAmIH5NT05fTUFTSykgfCAoRl9NT05JVE9SRURfRElSRUNUSU9OCi0JCQkJICAgfCBGX01PTklUT1JFRF9JTlRFUkZBQ0UpOworCQllc3BpLT5taXNjX2N0cmwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CisJCWVzcGktPm1pc2NfY3RybCAmPSB+TU9OX01BU0s7CisJCWVzcGktPm1pc2NfY3RybCB8PSBGX01PTklUT1JFRF9ESVJFQ1RJT047CisJCWlmIChhZGFwdGVyLT5wYXJhbXMubnBvcnRzID09IDEpCisJCQllc3BpLT5taXNjX2N0cmwgfD0gRl9NT05JVE9SRURfSU5URVJGQUNFOwogCQl3cml0ZWwoZXNwaS0+bWlzY19jdHJsLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CiAJCXNwaW5fbG9ja19pbml0KCZlc3BpLT5sb2NrKTsKIAl9CkBAIC0yOTksOCArMzAxLDcgQEAKIHsKIAlzdHJ1Y3QgcGVlc3BpICplc3BpID0gYWRhcHRlci0+ZXNwaTsKIAotCWlmICghaXNfVDIoYWRhcHRlcikpCi0JCXJldHVybjsKKwlpZiAoIWlzX1QyKGFkYXB0ZXIpKSByZXR1cm47CiAJc3Bpbl9sb2NrKCZlc3BpLT5sb2NrKTsKIAllc3BpLT5taXNjX2N0cmwgPSAodmFsICYgfk1PTl9NQVNLKSB8CiAJCQkgIChlc3BpLT5taXNjX2N0cmwgJiBNT05fTUFTSyk7CkBAIC0zMTAsMjcgKzMxMSw2MSBAQAogCiB1MzIgdDFfZXNwaV9nZXRfbW9uKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHU4IHdhaXQpCiB7Ci0JdTMyIHNlbDsKLQogCXN0cnVjdCBwZWVzcGkgKmVzcGkgPSBhZGFwdGVyLT5lc3BpOworCXUzMiBzZWw7CiAKIAlpZiAoIWlzX1QyKGFkYXB0ZXIpKQogCQlyZXR1cm4gMDsKKwogCXNlbCA9IFZfTU9OSVRPUkVEX1BPUlRfTlVNKChhZGRyICYgMHgzYykgPj4gMik7CiAJaWYgKCF3YWl0KSB7CiAJCWlmICghc3Bpbl90cnlsb2NrKCZlc3BpLT5sb2NrKSkKIAkJCXJldHVybiAwOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXNwaW5fbG9jaygmZXNwaS0+bG9jayk7CisKIAlpZiAoKHNlbCAhPSAoZXNwaS0+bWlzY19jdHJsICYgTU9OX01BU0spKSkgewogCQl3cml0ZWwoKChlc3BpLT5taXNjX2N0cmwgJiB+TU9OX01BU0spIHwgc2VsKSwKIAkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKIAkJc2VsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4zKTsKIAkJd3JpdGVsKGVzcGktPm1pc2NfY3RybCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXNlbCA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMyk7CiAJc3Bpbl91bmxvY2soJmVzcGktPmxvY2spOwogCXJldHVybiBzZWw7CiB9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBUMjA0IG9ubHkuCisgKiBjb21wYXJlIHdpdGggdDFfZXNwaV9nZXRfbW9uKCksIGl0IHJlYWRzIGVzcGlJblR4U29wWzAgfiAzXSBpbgorICogb25lIHNob3QsIHNpbmNlIHRoZXJlIGlzIG5vIHBlciBwb3J0IGNvdW50ZXIgb24gdGhlIG91dCBzaWRlLgorICovCitpbnQKK3QxX2VzcGlfZ2V0X21vbl90MjA0KGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyICp2YWxwLCB1OCB3YWl0KQoreworICAgICAgICBzdHJ1Y3QgcGVlc3BpICplc3BpID0gYWRhcHRlci0+ZXNwaTsKKwl1OCBpLCBucG9ydCA9ICh1OClhZGFwdGVyLT5wYXJhbXMubnBvcnRzOworCisgICAgICAgIGlmICghd2FpdCkgeworICAgICAgICAgICAgICAgIGlmICghc3Bpbl90cnlsb2NrKCZlc3BpLT5sb2NrKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZlc3BpLT5sb2NrKTsKKworCWlmICggKGVzcGktPm1pc2NfY3RybCAmIE1PTl9NQVNLKSAhPSBGX01PTklUT1JFRF9ESVJFQ1RJT04gKSB7CisJCWVzcGktPm1pc2NfY3RybCA9IChlc3BpLT5taXNjX2N0cmwgJiB+TU9OX01BU0spIHwKKwkJCQkJRl9NT05JVE9SRURfRElSRUNUSU9OOworICAgICAgICAgICAgICAgIHdyaXRlbChlc3BpLT5taXNjX2N0cmwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKKyAJfQorCWZvciAoaSA9IDAgOyBpIDwgbnBvcnQ7IGkrKywgdmFscCsrKSB7CisJCWlmIChpKSB7CisJCQl3cml0ZWwoZXNwaS0+bWlzY19jdHJsIHwgVl9NT05JVE9SRURfUE9SVF9OVU0oaSksCisJCQkgICAgICAgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOworCQl9CisgICAgICAgICAgICAgICAgKnZhbHAgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjMpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVsKGVzcGktPm1pc2NfY3RybCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOworICAgICAgICBzcGluX3VubG9jaygmZXNwaS0+bG9jayk7CisgICAgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuaAppbmRleCBjOTBlMzdmLi44NGYyYzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuaApAQCAtNjQsNSArNjQsNiBAQAogCiB2b2lkIHQxX2VzcGlfc2V0X21pc2NfY3RybChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiB2YWwpOwogdTMyIHQxX2VzcGlfZ2V0X21vbihhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCB3YWl0KTsKK2ludCB0MV9lc3BpX2dldF9tb25fdDIwNChhZGFwdGVyX3QgKiwgdTMyICosIHU4KTsKIAogI2VuZGlmIC8qIF9DWEdCX0VTUElfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZnBnYV9kZWZzLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2ZwZ2FfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTNjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2ZwZ2FfZGVmcy5oCkBAIC0wLDAgKzEsMjMyIEBACisvKiAkRGF0ZTogMjAwNS8wMy8wNyAyMzo1OTowNSAkICRSQ1NmaWxlOiBmcGdhX2RlZnMuaCx2ICQgJFJldmlzaW9uOiAxLjQgJCAqLworCisvKgorICogRlBHQSBzcGVjaWZpYyBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYgX19DSEVMU0lPX0ZQR0FfREVGU19IX18KKyNkZWZpbmUgX19DSEVMU0lPX0ZQR0FfREVGU19IX18KKworI2RlZmluZSBGUEdBX1BDSVhfQUREUl9WRVJTSU9OICAgICAgICAgICAgICAgMHhBMDgKKyNkZWZpbmUgRlBHQV9QQ0lYX0FERFJfU1RBVCAgICAgICAgICAgICAgICAgIDB4QTBDCisKKy8qIEZQR0EgbWFzdGVyIGludGVycnVwdCBDYXVzZS9FbmFibGUgYml0cyAqLworI2RlZmluZSBGUEdBX1BDSVhfSU5URVJSVVBUX1NHRV9FUlJPUiAgICAgICAgMHgxCisjZGVmaW5lIEZQR0FfUENJWF9JTlRFUlJVUFRfU0dFX0RBVEEgICAgICAgICAweDIKKyNkZWZpbmUgRlBHQV9QQ0lYX0lOVEVSUlVQVF9UUCAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBGUEdBX1BDSVhfSU5URVJSVVBUX01DMyAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIEZQR0FfUENJWF9JTlRFUlJVUFRfR01BQyAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEZQR0FfUENJWF9JTlRFUlJVUFRfUENJWCAgICAgICAgICAgICAweDIwCisKKy8qIFRQIGludGVycnVwdCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgRlBHQV9UUF9BRERSX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgIDB4QTEwCisjZGVmaW5lIEZQR0FfVFBfQUREUl9JTlRFUlJVUFRfQ0FVU0UgICAgICAgICAweEExNAorI2RlZmluZSBGUEdBX1RQX0FERFJfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHhBMTgKKworLyogVFAgaW50ZXJydXB0IENhdXNlL0VuYWJsZSBiaXRzICovCisjZGVmaW5lIEZQR0FfVFBfSU5URVJSVVBUX01DNCAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgRlBHQV9UUF9JTlRFUlJVUFRfTUM1ICAgICAgICAgICAgICAgIDB4MgorCisvKgorICogUE0gaW50ZXJydXB0IHJlZ2lzdGVyIGFkZHJlc3NlcworICovCisjZGVmaW5lIEZQR0FfTUMzX1JFR19JTlRSRU5BQkxFICAgICAgICAgICAgICAweEEyMAorI2RlZmluZSBGUEdBX01DM19SRUdfSU5UUkNBVVNFICAgICAgICAgICAgICAgMHhBMjQKKyNkZWZpbmUgRlBHQV9NQzNfUkVHX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4QTI4CisKKy8qCisgKiBHTUFDIGludGVycnVwdCByZWdpc3RlciBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBGUEdBX0dNQUNfQUREUl9JTlRFUlJVUFRfRU5BQkxFICAgICAgMHhBMzAKKyNkZWZpbmUgRlBHQV9HTUFDX0FERFJfSU5URVJSVVBUX0NBVVNFICAgICAgIDB4QTM0CisjZGVmaW5lIEZQR0FfR01BQ19BRERSX1ZFUlNJT04gICAgICAgICAgICAgICAweEEzOAorCisvKiBHTUFDIENhdXNlL0VuYWJsZSBiaXRzICovCisjZGVmaW5lIEZQR0FfR01BQ19JTlRFUlJVUFRfUE9SVDAgICAgICAgICAgICAweDEKKyNkZWZpbmUgRlBHQV9HTUFDX0lOVEVSUlVQVF9QT1JUMSAgICAgICAgICAgIDB4MgorI2RlZmluZSBGUEdBX0dNQUNfSU5URVJSVVBUX1BPUlQyICAgICAgICAgICAgMHg0CisjZGVmaW5lIEZQR0FfR01BQ19JTlRFUlJVUFRfUE9SVDMgICAgICAgICAgICAweDgKKworLyogTUkwIHJlZ2lzdGVycyAqLworI2RlZmluZSBBX01JMF9DTEsgMHhiMDAKKworI2RlZmluZSBTX01JMF9DTEtfRElWICAgIDAKKyNkZWZpbmUgTV9NSTBfQ0xLX0RJViAgICAweGZmCisjZGVmaW5lIFZfTUkwX0NMS19ESVYoeCkgKCh4KSA8PCBTX01JMF9DTEtfRElWKQorI2RlZmluZSBHX01JMF9DTEtfRElWKHgpICgoKHgpID4+IFNfTUkwX0NMS19ESVYpICYgTV9NSTBfQ0xLX0RJVikKKworI2RlZmluZSBTX01JMF9DTEtfQ05UICAgIDgKKyNkZWZpbmUgTV9NSTBfQ0xLX0NOVCAgICAweGZmCisjZGVmaW5lIFZfTUkwX0NMS19DTlQoeCkgKCh4KSA8PCBTX01JMF9DTEtfQ05UKQorI2RlZmluZSBHX01JMF9DTEtfQ05UKHgpICgoKHgpID4+IFNfTUkwX0NMS19DTlQpICYgTV9NSTBfQ0xLX0NOVCkKKworI2RlZmluZSBBX01JMF9DU1IgMHhiMDQKKworI2RlZmluZSBTX01JMF9DU1JfUE9MTCAgICAwCisjZGVmaW5lIFZfTUkwX0NTUl9QT0xMKHgpICgoeCkgPDwgU19NSTBfQ1NSX1BPTEwpCisjZGVmaW5lIEZfTUkwX0NTUl9QT0xMICAgIFZfTUkwX0NTUl9QT0xMKDFVKQorCisjZGVmaW5lIFNfTUkwX1BSRUFNQkxFICAgIDEKKyNkZWZpbmUgVl9NSTBfUFJFQU1CTEUoeCkgKCh4KSA8PCBTX01JMF9QUkVBTUJMRSkKKyNkZWZpbmUgRl9NSTBfUFJFQU1CTEUgICAgVl9NSTBfUFJFQU1CTEUoMVUpCisKKyNkZWZpbmUgU19NSTBfSU5UUl9FTkFCTEUgICAgMgorI2RlZmluZSBWX01JMF9JTlRSX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUkwX0lOVFJfRU5BQkxFKQorI2RlZmluZSBGX01JMF9JTlRSX0VOQUJMRSAgICBWX01JMF9JTlRSX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01JMF9CVVNZICAgIDMKKyNkZWZpbmUgVl9NSTBfQlVTWSh4KSAoKHgpIDw8IFNfTUkwX0JVU1kpCisjZGVmaW5lIEZfTUkwX0JVU1kgICAgVl9NSTBfQlVTWSgxVSkKKworI2RlZmluZSBTX01JMF9NRElPICAgIDQKKyNkZWZpbmUgVl9NSTBfTURJTyh4KSAoKHgpIDw8IFNfTUkwX01ESU8pCisjZGVmaW5lIEZfTUkwX01ESU8gICAgVl9NSTBfTURJTygxVSkKKworI2RlZmluZSBBX01JMF9BRERSIDB4YjA4CisKKyNkZWZpbmUgU19NSTBfUEhZX1JFR19BRERSICAgIDAKKyNkZWZpbmUgTV9NSTBfUEhZX1JFR19BRERSICAgIDB4MWYKKyNkZWZpbmUgVl9NSTBfUEhZX1JFR19BRERSKHgpICgoeCkgPDwgU19NSTBfUEhZX1JFR19BRERSKQorI2RlZmluZSBHX01JMF9QSFlfUkVHX0FERFIoeCkgKCgoeCkgPj4gU19NSTBfUEhZX1JFR19BRERSKSAmIE1fTUkwX1BIWV9SRUdfQUREUikKKworI2RlZmluZSBTX01JMF9QSFlfQUREUiAgICA1CisjZGVmaW5lIE1fTUkwX1BIWV9BRERSICAgIDB4MWYKKyNkZWZpbmUgVl9NSTBfUEhZX0FERFIoeCkgKCh4KSA8PCBTX01JMF9QSFlfQUREUikKKyNkZWZpbmUgR19NSTBfUEhZX0FERFIoeCkgKCgoeCkgPj4gU19NSTBfUEhZX0FERFIpICYgTV9NSTBfUEhZX0FERFIpCisKKyNkZWZpbmUgQV9NSTBfREFUQV9FWFQgMHhiMGMKKyNkZWZpbmUgQV9NSTBfREFUQV9JTlQgMHhiMTAKKworLyogR01BQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQV9HTUFDX01BQ0lEX0xPIDB4MjgKKyNkZWZpbmUgQV9HTUFDX01BQ0lEX0hJIDB4MmMKKyNkZWZpbmUgQV9HTUFDX0NTUiAweDMwCisKKyNkZWZpbmUgU19JTlRFUkZBQ0UgICAgMAorI2RlZmluZSBNX0lOVEVSRkFDRSAgICAweDMKKyNkZWZpbmUgVl9JTlRFUkZBQ0UoeCkgKCh4KSA8PCBTX0lOVEVSRkFDRSkKKyNkZWZpbmUgR19JTlRFUkZBQ0UoeCkgKCgoeCkgPj4gU19JTlRFUkZBQ0UpICYgTV9JTlRFUkZBQ0UpCisKKyNkZWZpbmUgU19NQUNfVFhfRU5BQkxFICAgIDIKKyNkZWZpbmUgVl9NQUNfVFhfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfVFhfRU5BQkxFKQorI2RlZmluZSBGX01BQ19UWF9FTkFCTEUgICAgVl9NQUNfVFhfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX1JYX0VOQUJMRSAgICAzCisjZGVmaW5lIFZfTUFDX1JYX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX1JYX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfUlhfRU5BQkxFICAgIFZfTUFDX1JYX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19MQl9FTkFCTEUgICAgNAorI2RlZmluZSBWX01BQ19MQl9FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19MQl9FTkFCTEUpCisjZGVmaW5lIEZfTUFDX0xCX0VOQUJMRSAgICBWX01BQ19MQl9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfU1BFRUQgICAgNQorI2RlZmluZSBNX01BQ19TUEVFRCAgICAweDMKKyNkZWZpbmUgVl9NQUNfU1BFRUQoeCkgKCh4KSA8PCBTX01BQ19TUEVFRCkKKyNkZWZpbmUgR19NQUNfU1BFRUQoeCkgKCgoeCkgPj4gU19NQUNfU1BFRUQpICYgTV9NQUNfU1BFRUQpCisKKyNkZWZpbmUgU19NQUNfSERfRkNfRU5BQkxFICAgIDcKKyNkZWZpbmUgVl9NQUNfSERfRkNfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfSERfRkNfRU5BQkxFKQorI2RlZmluZSBGX01BQ19IRF9GQ19FTkFCTEUgICAgVl9NQUNfSERfRkNfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX0hBTEZfRFVQTEVYICAgIDgKKyNkZWZpbmUgVl9NQUNfSEFMRl9EVVBMRVgoeCkgKCh4KSA8PCBTX01BQ19IQUxGX0RVUExFWCkKKyNkZWZpbmUgRl9NQUNfSEFMRl9EVVBMRVggICAgVl9NQUNfSEFMRl9EVVBMRVgoMVUpCisKKyNkZWZpbmUgU19NQUNfUFJPTUlTQyAgICA5CisjZGVmaW5lIFZfTUFDX1BST01JU0MoeCkgKCh4KSA8PCBTX01BQ19QUk9NSVNDKQorI2RlZmluZSBGX01BQ19QUk9NSVNDICAgIFZfTUFDX1BST01JU0MoMVUpCisKKyNkZWZpbmUgU19NQUNfTUNfRU5BQkxFICAgIDEwCisjZGVmaW5lIFZfTUFDX01DX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX01DX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfTUNfRU5BQkxFICAgIFZfTUFDX01DX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19SRVNFVCAgICAxMQorI2RlZmluZSBWX01BQ19SRVNFVCh4KSAoKHgpIDw8IFNfTUFDX1JFU0VUKQorI2RlZmluZSBGX01BQ19SRVNFVCAgICBWX01BQ19SRVNFVCgxVSkKKworI2RlZmluZSBTX01BQ19SWF9QQVVTRV9FTkFCTEUgICAgMTIKKyNkZWZpbmUgVl9NQUNfUlhfUEFVU0VfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfUlhfUEFVU0VfRU5BQkxFKQorI2RlZmluZSBGX01BQ19SWF9QQVVTRV9FTkFCTEUgICAgVl9NQUNfUlhfUEFVU0VfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX1RYX1BBVVNFX0VOQUJMRSAgICAxMworI2RlZmluZSBWX01BQ19UWF9QQVVTRV9FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19UWF9QQVVTRV9FTkFCTEUpCisjZGVmaW5lIEZfTUFDX1RYX1BBVVNFX0VOQUJMRSAgICBWX01BQ19UWF9QQVVTRV9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfTFdNX0VOQUJMRSAgICAxNAorI2RlZmluZSBWX01BQ19MV01fRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfTFdNX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfTFdNX0VOQUJMRSAgICBWX01BQ19MV01fRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX01BR0lDX1BLVF9FTkFCTEUgICAgMTUKKyNkZWZpbmUgVl9NQUNfTUFHSUNfUEtUX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX01BR0lDX1BLVF9FTkFCTEUpCisjZGVmaW5lIEZfTUFDX01BR0lDX1BLVF9FTkFCTEUgICAgVl9NQUNfTUFHSUNfUEtUX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19JU0xfRU5BQkxFICAgIDE2CisjZGVmaW5lIFZfTUFDX0lTTF9FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19JU0xfRU5BQkxFKQorI2RlZmluZSBGX01BQ19JU0xfRU5BQkxFICAgIFZfTUFDX0lTTF9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfSlVNQk9fRU5BQkxFICAgIDE3CisjZGVmaW5lIFZfTUFDX0pVTUJPX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX0pVTUJPX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfSlVNQk9fRU5BQkxFICAgIFZfTUFDX0pVTUJPX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19SWF9QQURfRU5BQkxFICAgIDE4CisjZGVmaW5lIFZfTUFDX1JYX1BBRF9FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19SWF9QQURfRU5BQkxFKQorI2RlZmluZSBGX01BQ19SWF9QQURfRU5BQkxFICAgIFZfTUFDX1JYX1BBRF9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfUlhfQ1JDX0VOQUJMRSAgICAxOQorI2RlZmluZSBWX01BQ19SWF9DUkNfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfUlhfQ1JDX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfUlhfQ1JDX0VOQUJMRSAgICBWX01BQ19SWF9DUkNfRU5BQkxFKDFVKQorCisjZGVmaW5lIEFfR01BQ19JRlMgMHgzNAorCisjZGVmaW5lIFNfTUFDX0lGUzIgICAgMAorI2RlZmluZSBNX01BQ19JRlMyICAgIDB4M2YKKyNkZWZpbmUgVl9NQUNfSUZTMih4KSAoKHgpIDw8IFNfTUFDX0lGUzIpCisjZGVmaW5lIEdfTUFDX0lGUzIoeCkgKCgoeCkgPj4gU19NQUNfSUZTMikgJiBNX01BQ19JRlMyKQorCisjZGVmaW5lIFNfTUFDX0lGUzEgICAgOAorI2RlZmluZSBNX01BQ19JRlMxICAgIDB4N2YKKyNkZWZpbmUgVl9NQUNfSUZTMSh4KSAoKHgpIDw8IFNfTUFDX0lGUzEpCisjZGVmaW5lIEdfTUFDX0lGUzEoeCkgKCgoeCkgPj4gU19NQUNfSUZTMSkgJiBNX01BQ19JRlMxKQorCisjZGVmaW5lIEFfR01BQ19KVU1CT19GUkFNRV9MRU4gMHgzOAorI2RlZmluZSBBX0dNQUNfTE5LX0RMWSAweDNjCisjZGVmaW5lIEFfR01BQ19QQVVTRVRJTUUgMHg0MAorI2RlZmluZSBBX0dNQUNfTUNBU1RfTE8gMHg0NAorI2RlZmluZSBBX0dNQUNfTUNBU1RfSEkgMHg0OAorI2RlZmluZSBBX0dNQUNfTUNBU1RfTUFTS19MTyAweDRjCisjZGVmaW5lIEFfR01BQ19NQ0FTVF9NQVNLX0hJIDB4NTAKKyNkZWZpbmUgQV9HTUFDX1JNVF9DTlQgMHg1NAorI2RlZmluZSBBX0dNQUNfUk1UX0RBVEEgMHg1OAorI2RlZmluZSBBX0dNQUNfQkFDS09GRl9TRUVEIDB4NWMKKyNkZWZpbmUgQV9HTUFDX1RYRl9USFJFUyAweDYwCisKKyNkZWZpbmUgU19UWEZfUkVBRF9USFJFU0hPTEQgICAgMAorI2RlZmluZSBNX1RYRl9SRUFEX1RIUkVTSE9MRCAgICAweGZmCisjZGVmaW5lIFZfVFhGX1JFQURfVEhSRVNIT0xEKHgpICgoeCkgPDwgU19UWEZfUkVBRF9USFJFU0hPTEQpCisjZGVmaW5lIEdfVFhGX1JFQURfVEhSRVNIT0xEKHgpICgoKHgpID4+IFNfVFhGX1JFQURfVEhSRVNIT0xEKSAmIE1fVFhGX1JFQURfVEhSRVNIT0xEKQorCisjZGVmaW5lIFNfVFhGX1dSSVRFX1RIUkVTSE9MRCAgICAxNgorI2RlZmluZSBNX1RYRl9XUklURV9USFJFU0hPTEQgICAgMHhmZgorI2RlZmluZSBWX1RYRl9XUklURV9USFJFU0hPTEQoeCkgKCh4KSA8PCBTX1RYRl9XUklURV9USFJFU0hPTEQpCisjZGVmaW5lIEdfVFhGX1dSSVRFX1RIUkVTSE9MRCh4KSAoKCh4KSA+PiBTX1RYRl9XUklURV9USFJFU0hPTEQpICYgTV9UWEZfV1JJVEVfVEhSRVNIT0xEKQorCisjZGVmaW5lIE1BQ19SRUdfQkFTRSAweDYwMAorI2RlZmluZSBNQUNfUkVHX0FERFIoaWR4LCByZWcpIChNQUNfUkVHX0JBU0UgKyAoaWR4KSAqIDEyOCArIChyZWcpKQorCisjZGVmaW5lIE1BQ19SRUdfSURMTyhpZHgpICAgICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfTUFDSURfTE8pCisjZGVmaW5lIE1BQ19SRUdfSURISShpZHgpICAgICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfTUFDSURfSEkpCisjZGVmaW5lIE1BQ19SRUdfQ1NSKGlkeCkgICAgICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfQ1NSKQorI2RlZmluZSBNQUNfUkVHX0lGUyhpZHgpICAgICAgICAgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX0lGUykKKyNkZWZpbmUgTUFDX1JFR19MQVJHRUZSQU1FTEVOR1RIKGlkeCkgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX0pVTUJPX0ZSQU1FX0xFTikKKyNkZWZpbmUgTUFDX1JFR19MSU5LRExZKGlkeCkgICAgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19MTktfRExZKQorI2RlZmluZSBNQUNfUkVHX1BBVVNFVElNRShpZHgpICAgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX1BBVVNFVElNRSkKKyNkZWZpbmUgTUFDX1JFR19DQVNUTE8oaWR4KSAgICAgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19NQ0FTVF9MTykKKyNkZWZpbmUgTUFDX1JFR19NQ0FTVEhJKGlkeCkgICAgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19NQ0FTVF9ISSkKKyNkZWZpbmUgTUFDX1JFR19DQVNUTUFTS0xPKGlkeCkgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19NQ0FTVF9NQVNLX0xPKQorI2RlZmluZSBNQUNfUkVHX01DQVNUTUFTS0hJKGlkeCkgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX01DQVNUX01BU0tfSEkpCisjZGVmaW5lIE1BQ19SRUdfUk1DTlQoaWR4KSAgICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfUk1UX0NOVCkKKyNkZWZpbmUgTUFDX1JFR19STURBVEEoaWR4KSAgICAgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19STVRfREFUQSkKKyNkZWZpbmUgTUFDX1JFR19HTVJBTkRCQUNLT0ZGU0VFRChpZHgpIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19CQUNLT0ZGX1NFRUQpCisjZGVmaW5lIE1BQ19SRUdfVFhGVEhSRVNIT0xEUyhpZHgpICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfVFhGX1RIUkVTKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZ21hYy5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmgKaW5kZXggNzQ2YjBlZS4uYTJiOGFkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmgKQEAgLTYyLDYgKzYyLDggQEAKIAl1NjQgVHhJbnRlcm5hbE1BQ1htaXRFcnJvcjsKIAl1NjQgVHhGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWw7CiAJdTY0IFR4RkNTRXJyb3JzOworCXU2NCBUeEp1bWJvRnJhbWVzT0s7CisJdTY0IFR4SnVtYm9PY3RldHNPSzsKIAogCS8qIFJlY2VpdmUgKi8KIAl1NjQgUnhPY3RldHNPSzsKQEAgLTgxLDYgKzgzLDggQEAKIAl1NjQgUnhJblJhbmdlTGVuZ3RoRXJyb3JzOwogCXU2NCBSeE91dE9mUmFuZ2VMZW5ndGhGaWVsZDsKIAl1NjQgUnhGcmFtZVRvb0xvbmdFcnJvcnM7CisJdTY0IFJ4SnVtYm9GcmFtZXNPSzsKKwl1NjQgUnhKdW1ib09jdGV0c09LOwogfTsKIAogc3RydWN0IGNtYWNfb3BzIHsKQEAgLTEyOCw2ICsxMzIsNyBAQAogZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX3BtMzM5M19vcHM7CiBleHRlcm4gc3RydWN0IGdtYWMgdDFfY2hlbHNpb19tYWNfb3BzOwogZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX3ZzYzczMjFfb3BzOworZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX3ZzYzczMjZfb3BzOwogZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX2l4ZjEwMTBfb3BzOwogZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX2R1bW15X21hY19vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vaXhmMTAxMC5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9peGYxMDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4ZjE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vaXhmMTAxMC5jCkBAIC0wLDAgKzEsNDg1IEBACisvKiAkRGF0ZTogMjAwNS8xMS8xMiAwMjoxMzo0OSAkICRSQ1NmaWxlOiBpeGYxMDEwLmMsdiAkICRSZXZpc2lvbjogMS4zNiAkICovCisjaW5jbHVkZSAiZ21hYy5oIgorI2luY2x1ZGUgImVsbWVyMC5oIgorCisvKiBVcGRhdGUgZmFzdCBjaGFuZ2luZyBzdGF0aXN0aWNzIGV2ZXJ5IDE1IHNlY29uZHMgKi8KKyNkZWZpbmUgU1RBVFNfVElDS19TRUNTIDE1CisvKiAzMCBtaW51dGVzIGZvciBmdWxsIHN0YXRpc3RpY3MgdXBkYXRlICovCisjZGVmaW5lIE1BSk9SX1VQREFURV9USUNLUyAoMTgwMCAvIFNUQVRTX1RJQ0tfU0VDUykKKworLyoKKyAqIFRoZSBJWEYxMDEwIGNhbiBoYW5kbGUgZnJhbWVzIHVwIHRvIDE2MzgzIGJ5dGVzIGJ1dCBpdCdzIG9wdGltaXplZCBmb3IKKyAqIGZyYW1lcyB1cCB0byA5ODMxICgweDI2NjcpIGJ5dGVzLCBzbyB3ZSBsaW1pdCBqdW1ibyBmcmFtZSBzaXplIHRvIHRoaXMuCisgKiBUaGlzIGxlbmd0aCBpbmNsdWRlcyBldGhlcm5ldCBoZWFkZXIgYW5kIEZDUy4KKyAqLworI2RlZmluZSBNQVhfRlJBTUVfU0laRSAweDI2NjcKKworLyogTUFDIHJlZ2lzdGVycyAqLworZW51bSB7CisJLyogUGVyLXBvcnQgcmVnaXN0ZXJzICovCisJUkVHX01BQ0FERFJfTE9XID0gMCwKKwlSRUdfTUFDQUREUl9ISUdIID0gMHg0LAorCVJFR19GREZDX1RZUEUgPSAweEMsCisJUkVHX0ZDX1RYX1RJTUVSX1ZBTFVFID0gMHgxYywKKwlSRUdfSVBHX1JYX1RJTUUxID0gMHgyOCwKKwlSRUdfSVBHX1JYX1RJTUUyID0gMHgyYywKKwlSRUdfSVBHX1RYX1RJTUUgPSAweDMwLAorCVJFR19QQVVTRV9USFJFUyA9IDB4MzgsCisJUkVHX01BWF9GUkFNRV9TSVpFID0gMHgzYywKKwlSRUdfUkdNSUlfU1BFRUQgPSAweDQwLAorCVJFR19GQ19FTkFCTEUgPSAweDQ4LAorCVJFR19ESVNDQVJEX0NUUkxfRlJBTUVTID0gMHg1NCwKKwlSRUdfRElWRVJTRV9DT05GSUcgPSAweDYwLAorCVJFR19SWF9GSUxURVIgPSAweDY0LAorCVJFR19NQ19BRERSX0xPVyA9IDB4NjgsCisJUkVHX01DX0FERFJfSElHSCA9IDB4NmMsCisKKwlSRUdfUlhfT0NURVRTX09LID0gMHg4MCwKKwlSRUdfUlhfT0NURVRTX0JBRCA9IDB4ODQsCisJUkVHX1JYX1VDX1BLVFMgPSAweDg4LAorCVJFR19SWF9NQ19QS1RTID0gMHg4YywKKwlSRUdfUlhfQkNfUEtUUyA9IDB4OTAsCisJUkVHX1JYX0ZDU19FUlIgPSAweGIwLAorCVJFR19SWF9UQUdHRUQgPSAweGI0LAorCVJFR19SWF9EQVRBX0VSUiA9IDB4YjgsCisJUkVHX1JYX0FMSUdOX0VSUiA9IDB4YmMsCisJUkVHX1JYX0xPTkdfRVJSID0gMHhjMCwKKwlSRUdfUlhfSkFCQkVSX0VSUiA9IDB4YzQsCisJUkVHX1JYX1BBVVNFX0ZSQU1FUyA9IDB4YzgsCisJUkVHX1JYX1VOS05PV05fQ1RSTF9GUkFNRVMgPSAweGNjLAorCVJFR19SWF9WRVJZX0xPTkdfRVJSID0gMHhkMCwKKwlSRUdfUlhfUlVOVF9FUlIgPSAweGQ0LAorCVJFR19SWF9TSE9SVF9FUlIgPSAweGQ4LAorCVJFR19SWF9TWU1CT0xfRVJSID0gMHhlNCwKKworCVJFR19UWF9PQ1RFVFNfT0sgPSAweDEwMCwKKwlSRUdfVFhfT0NURVRTX0JBRCA9IDB4MTA0LAorCVJFR19UWF9VQ19QS1RTID0gMHgxMDgsCisJUkVHX1RYX01DX1BLVFMgPSAweDEwYywKKwlSRUdfVFhfQkNfUEtUUyA9IDB4MTEwLAorCVJFR19UWF9FWENFU1NJVkVfTEVOX0RST1AgPSAweDE0YywKKwlSRUdfVFhfVU5ERVJSVU4gPSAweDE1MCwKKwlSRUdfVFhfVEFHR0VEID0gMHgxNTQsCisJUkVHX1RYX1BBVVNFX0ZSQU1FUyA9IDB4MTVDLAorCisJLyogR2xvYmFsIHJlZ2lzdGVycyAqLworCVJFR19QT1JUX0VOQUJMRSA9IDB4MTQwMCwKKworCVJFR19KVEFHX0lEID0gMHgxNDMwLAorCisJUlhfRklGT19ISUdIX1dBVEVSTUFSS19CQVNFID0gMHgxNjAwLAorCVJYX0ZJRk9fTE9XX1dBVEVSTUFSS19CQVNFID0gMHgxNjI4LAorCVJYX0ZJRk9fRlJBTUVTX1JFTU9WRURfQkFTRSA9IDB4MTY1MCwKKworCVJFR19SWF9FUlJfRFJPUCA9IDB4MTY3YywKKwlSRUdfUlhfRklGT19PVkVSRkxPV19FVkVOVCA9IDB4MTY4MCwKKworCVRYX0ZJRk9fSElHSF9XQVRFUk1BUktfQkFTRSA9IDB4MTgwMCwKKwlUWF9GSUZPX0xPV19XQVRFUk1BUktfQkFTRSA9IDB4MTgyOCwKKwlUWF9GSUZPX1hGRVJfVEhSRVNfQkFTRSA9IDB4MTg1MCwKKworCVJFR19UWF9GSUZPX09WRVJGTE9XX0VWRU5UID0gMHgxODc4LAorCVJFR19UWF9GSUZPX09PU19FVkVOVCA9IDB4MTg4NCwKKworCVRYX0ZJRk9fRlJBTUVTX1JFTU9WRURfQkFTRSA9IDB4MTg4OCwKKworCVJFR19TUElfUlhfQlVSU1QgPSAweDFjMDAsCisJUkVHX1NQSV9SWF9UUkFJTklORyA9IDB4MWMwNCwKKwlSRUdfU1BJX1JYX0NBTEVOREFSID0gMHgxYzA4LAorCVJFR19TUElfVFhfU1lOQyA9IDB4MWMwYworfTsKKworZW51bSB7ICAgICAgICAgICAgICAgICAgICAgLyogUk1PTiByZWdpc3RlcnMgKi8KKwlSRUdfUnhPY3RldHNUb3RhbE9LID0gMHg4MCwKKwlSRUdfUnhPY3RldHNCYWQgPSAweDg0LAorCVJFR19SeFVDUGt0cyA9IDB4ODgsCisJUkVHX1J4TUNQa3RzID0gMHg4YywKKwlSRUdfUnhCQ1BrdHMgPSAweDkwLAorCVJFR19SeEp1bWJvUGt0cyA9IDB4YWMsCisJUkVHX1J4RkNTRXJyb3JzID0gMHhiMCwKKwlSRUdfUnhEYXRhRXJyb3JzID0gMHhiOCwKKwlSRUdfUnhBbGlnbkVycm9ycyA9IDB4YmMsCisJUkVHX1J4TG9uZ0Vycm9ycyA9IDB4YzAsCisJUkVHX1J4SmFiYmVyRXJyb3JzID0gMHhjNCwKKwlSRUdfUnhQYXVzZU1hY0NvbnRyb2xDb3VudGVyID0gMHhjOCwKKwlSRUdfUnhWZXJ5TG9uZ0Vycm9ycyA9IDB4ZDAsCisJUkVHX1J4UnVudEVycm9ycyA9IDB4ZDQsCisJUkVHX1J4U2hvcnRFcnJvcnMgPSAweGQ4LAorCVJFR19SeFNlcXVlbmNlRXJyb3JzID0gMHhlMCwKKwlSRUdfUnhTeW1ib2xFcnJvcnMgPSAweGU0LAorCisJUkVHX1R4T2N0ZXRzVG90YWxPSyA9IDB4MTAwLAorCVJFR19UeE9jdGV0c0JhZCA9IDB4MTA0LAorCVJFR19UeFVDUGt0cyA9IDB4MTA4LAorCVJFR19UeE1DUGt0cyA9IDB4MTBjLAorCVJFR19UeEJDUGt0cyA9IDB4MTEwLAorCVJFR19UeEp1bWJvUGt0cyA9IDB4MTJDLAorCVJFR19UeFRvdGFsQ29sbGlzaW9ucyA9IDB4MTM0LAorCVJFR19UeEV4Y2Vzc2l2ZUxlbmd0aERyb3AgPSAweDE0YywKKwlSRUdfVHhVbmRlcnJ1biA9IDB4MTUwLAorCVJFR19UeENSQ0Vycm9ycyA9IDB4MTU4LAorCVJFR19UeFBhdXNlRnJhbWVzID0gMHgxNWMKK307CisKK2VudW0geworCURJVkVSU0VfQ09ORklHX1BBRF9FTkFCTEUgPSAweDgwLAorCURJVkVSU0VfQ09ORklHX0NSQ19BREQgPSAweDQwCit9OworCisjZGVmaW5lIE1BQ1JFR19CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBNQUNSRUcobWFjLCBtYWNfcmVnKSAgICgobWFjKS0+aW5zdGFuY2UtPm1hY19iYXNlICsgKG1hY19yZWcpKQorCitzdHJ1Y3QgX2NtYWNfaW5zdGFuY2UgeworCXUzMiBtYWNfYmFzZTsKKwl1MzIgaW5kZXg7CisJdTMyIHZlcnNpb247CisJdTMyIHRpY2tzOworfTsKKworc3RhdGljIHZvaWQgZGlzYWJsZV9wb3J0KHN0cnVjdCBjbWFjICptYWMpCit7CisJdTMyIHZhbDsKKworCXQxX3RwaV9yZWFkKG1hYy0+YWRhcHRlciwgUkVHX1BPUlRfRU5BQkxFLCAmdmFsKTsKKwl2YWwgJj0gfigxIDw8IG1hYy0+aW5zdGFuY2UtPmluZGV4KTsKKwl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBSRUdfUE9SVF9FTkFCTEUsIHZhbCk7Cit9CisKKyNkZWZpbmUgUk1PTl9VUERBVEUobWFjLCBuYW1lLCBzdGF0X25hbWUpIFwKKwl0MV90cGlfcmVhZCgobWFjKS0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHXyMjbmFtZSksICZ2YWwpOyBcCisJKG1hYyktPnN0YXRzLnN0YXRfbmFtZSArPSB2YWw7CisKKy8qCisgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgUk1PTiBjb3VudGVycyBhbmQgYWRkIHRoZW0gdG8gdGhlIGN1bXVsYXRpdmUKKyAqIHBvcnQgc3RhdGlzdGljcy4gIFRoZSBIVyBSTU9OIGNvdW50ZXJzIGFyZSBjbGVhcmVkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICovCitzdGF0aWMgdm9pZCBwb3J0X3N0YXRzX3VwZGF0ZShzdHJ1Y3QgY21hYyAqbWFjKQoreworCXUzMiB2YWw7CisKKwkvKiBSeCBzdGF0cyAqLworCVJNT05fVVBEQVRFKG1hYywgUnhPY3RldHNUb3RhbE9LLCBSeE9jdGV0c09LKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4T2N0ZXRzQmFkLCBSeE9jdGV0c0JhZCk7CisJUk1PTl9VUERBVEUobWFjLCBSeFVDUGt0cywgUnhVbmljYXN0RnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgUnhNQ1BrdHMsIFJ4TXVsdGljYXN0RnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgUnhCQ1BrdHMsIFJ4QnJvYWRjYXN0RnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgUnhKdW1ib1BrdHMsIFJ4SnVtYm9GcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBSeEZDU0Vycm9ycywgUnhGQ1NFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhBbGlnbkVycm9ycywgUnhBbGlnbkVycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBSeExvbmdFcnJvcnMsIFJ4RnJhbWVUb29Mb25nRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4VmVyeUxvbmdFcnJvcnMsIFJ4RnJhbWVUb29Mb25nRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4UGF1c2VNYWNDb250cm9sQ291bnRlciwgUnhQYXVzZUZyYW1lcyk7CisJUk1PTl9VUERBVEUobWFjLCBSeERhdGFFcnJvcnMsIFJ4RGF0YUVycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBSeEphYmJlckVycm9ycywgUnhKYWJiZXJFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhSdW50RXJyb3JzLCBSeFJ1bnRFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhTaG9ydEVycm9ycywgUnhSdW50RXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4U2VxdWVuY2VFcnJvcnMsIFJ4U2VxdWVuY2VFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhTeW1ib2xFcnJvcnMsIFJ4U3ltYm9sRXJyb3JzKTsKKworCS8qIFR4IHN0YXRzIChza2lwIGNvbGxpc2lvbiBzdGF0cyBhcyB3ZSBhcmUgZnVsbC1kdXBsZXggb25seSkgKi8KKwlSTU9OX1VQREFURShtYWMsIFR4T2N0ZXRzVG90YWxPSywgVHhPY3RldHNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBUeE9jdGV0c0JhZCwgVHhPY3RldHNCYWQpOworCVJNT05fVVBEQVRFKG1hYywgVHhVQ1BrdHMsIFR4VW5pY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFR4TUNQa3RzLCBUeE11bHRpY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFR4QkNQa3RzLCBUeEJyb2FkY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFR4SnVtYm9Qa3RzLCBUeEp1bWJvRnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgVHhQYXVzZUZyYW1lcywgVHhQYXVzZUZyYW1lcyk7CisJUk1PTl9VUERBVEUobWFjLCBUeEV4Y2Vzc2l2ZUxlbmd0aERyb3AsIFR4TGVuZ3RoRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFR4VW5kZXJydW4sIFR4VW5kZXJydW4pOworCVJNT05fVVBEQVRFKG1hYywgVHhDUkNFcnJvcnMsIFR4RkNTRXJyb3JzKTsKK30KKworLyogTm8tb3AgaW50ZXJydXB0IG9wZXJhdGlvbiBhcyB0aGlzIE1BQyBkb2VzIG5vdCBzdXBwb3J0IGludGVycnVwdHMgKi8KK3N0YXRpYyBpbnQgbWFjX2ludHJfb3Aoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlyZXR1cm4gMDsKK30KKworLyogRXhwZWN0IE1BQyBhZGRyZXNzIHRvIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gKi8KK3N0YXRpYyBpbnQgbWFjX3NldF9hZGRyZXNzKHN0cnVjdCBjbWFjICptYWMsIHU4IGFkZHJbNl0pCit7CisJdTMyIGFkZHJfbG8sIGFkZHJfaGk7CisKKwlhZGRyX2xvID0gYWRkclsyXTsKKwlhZGRyX2xvID0gKGFkZHJfbG8gPDwgOCkgfCBhZGRyWzNdOworCWFkZHJfbG8gPSAoYWRkcl9sbyA8PCA4KSB8IGFkZHJbNF07CisJYWRkcl9sbyA9IChhZGRyX2xvIDw8IDgpIHwgYWRkcls1XTsKKworCWFkZHJfaGkgPSBhZGRyWzBdOworCWFkZHJfaGkgPSAoYWRkcl9oaSA8PCA4KSB8IGFkZHJbMV07CisKKwl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUFDQUREUl9MT1cpLCBhZGRyX2xvKTsKKwl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUFDQUREUl9ISUdIKSwgYWRkcl9oaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2dldF9hZGRyZXNzKHN0cnVjdCBjbWFjICptYWMsIHU4IGFkZHJbNl0pCit7CisJdTMyIGFkZHJfbG8sIGFkZHJfaGk7CisKKwl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQUNBRERSX0xPVyksICZhZGRyX2xvKTsKKwl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQUNBRERSX0hJR0gpLCAmYWRkcl9oaSk7CisKKwlhZGRyWzBdID0gKHU4KSAoYWRkcl9oaSA+PiA4KTsKKwlhZGRyWzFdID0gKHU4KSBhZGRyX2hpOworCWFkZHJbMl0gPSAodTgpIChhZGRyX2xvID4+IDI0KTsKKwlhZGRyWzNdID0gKHU4KSAoYWRkcl9sbyA+PiAxNik7CisJYWRkcls0XSA9ICh1OCkgKGFkZHJfbG8gPj4gOCk7CisJYWRkcls1XSA9ICh1OCkgYWRkcl9sbzsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyBpbnRlbmRlZCB0byByZXNldCBhIHBvcnQsIG5vdCB0aGUgd2hvbGUgTUFDICovCitzdGF0aWMgaW50IG1hY19yZXNldChzdHJ1Y3QgY21hYyAqbWFjKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgdDFfcnhfbW9kZSAqcm0pCit7CisJdTMyIHZhbCwgbmV3X21vZGU7CisJYWRhcHRlcl90ICphZGFwdGVyID0gbWFjLT5hZGFwdGVyOworCXUzMiBhZGRyX2xvLCBhZGRyX2hpOworCXU4ICphZGRyOworCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX1JYX0ZJTFRFUiksICZ2YWwpOworCW5ld19tb2RlID0gdmFsICYgfjc7CisJaWYgKCF0MV9yeF9tb2RlX3Byb21pc2Mocm0pICYmIG1hYy0+aW5zdGFuY2UtPnZlcnNpb24gPiAwKQorCQluZXdfbW9kZSB8PSAxOyAgICAgLyogb25seSBzZXQgaWYgdmVyc2lvbiA+IDAgZHVlIHRvIGVycmF0dW0gKi8KKwlpZiAoIXQxX3J4X21vZGVfcHJvbWlzYyhybSkgJiYgIXQxX3J4X21vZGVfYWxsbXVsdGkocm0pCisJICAgICAmJiB0MV9yeF9tb2RlX21jX2NudChybSkgPD0gMSkKKwkJbmV3X21vZGUgfD0gMjsKKwlpZiAobmV3X21vZGUgIT0gdmFsKQorCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX1JYX0ZJTFRFUiksIG5ld19tb2RlKTsKKwlzd2l0Y2ggKHQxX3J4X21vZGVfbWNfY250KHJtKSkgeworCWNhc2UgMDoKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQ19BRERSX0xPVyksIDApOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01DX0FERFJfSElHSCksIDApOworCQlicmVhazsKKwljYXNlIDE6CisJCWFkZHIgPSB0MV9nZXRfbmV4dF9tY2FkZHIocm0pOworCQlhZGRyX2xvID0gKGFkZHJbMl0gPDwgMjQpIHwgKGFkZHJbM10gPDwgMTYpIHwgKGFkZHJbNF0gPDwgOCkgfAorCQkJYWRkcls1XTsKKwkJYWRkcl9oaSA9IChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQ19BRERSX0xPVyksIGFkZHJfbG8pOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01DX0FERFJfSElHSCksIGFkZHJfaGkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX3NldF9tdHUoc3RydWN0IGNtYWMgKm1hYywgaW50IG10dSkKK3sKKwkvKiBNQVhfRlJBTUVfU0laRSBpbmx1ZGVzIGhlYWRlciArIEZDUywgbXR1IGRvZXNuJ3QgKi8KKwlpZiAobXR1ID4gKE1BWF9GUkFNRV9TSVpFIC0gMTQgLSA0KSkgcmV0dXJuIC1FSU5WQUw7CisJdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01BWF9GUkFNRV9TSVpFKSwKKwkJICAgICBtdHUgKyAxNCArIDQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19zZXRfc3BlZWRfZHVwbGV4X2ZjKHN0cnVjdCBjbWFjICptYWMsIGludCBzcGVlZCwgaW50IGR1cGxleCwKKwkJCQkgICBpbnQgZmMpCit7CisJdTMyIHZhbDsKKworCWlmIChzcGVlZCA+PSAwICYmIHNwZWVkICE9IFNQRUVEXzEwMCAmJiBzcGVlZCAhPSBTUEVFRF8xMDAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGR1cGxleCA+PSAwICYmIGR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNwZWVkID49IDApIHsKKwkJdmFsID0gc3BlZWQgPT0gU1BFRURfMTAwID8gMSA6IDI7CisJCXQxX3RwaV93cml0ZShtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SR01JSV9TUEVFRCksIHZhbCk7CisJfQorCisJdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfRkNfRU5BQkxFKSwgJnZhbCk7CisJdmFsICY9IH4zOworCWlmIChmYyAmIFBBVVNFX1JYKQorCQl2YWwgfD0gMTsKKwlpZiAoZmMgJiBQQVVTRV9UWCkKKwkJdmFsIHw9IDI7CisJdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX0ZDX0VOQUJMRSksIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2dldF9zcGVlZF9kdXBsZXhfZmMoc3RydWN0IGNtYWMgKm1hYywgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsCisJCQkJICAgaW50ICpmYykKK3sKKwl1MzIgdmFsOworCisJaWYgKGR1cGxleCkKKwkJKmR1cGxleCA9IERVUExFWF9GVUxMOworCWlmIChzcGVlZCkgeworCQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SR01JSV9TUEVFRCksCisJCQkgJnZhbCk7CisJCSpzcGVlZCA9ICh2YWwgJiAyKSA/IFNQRUVEXzEwMDAgOiBTUEVFRF8xMDA7CisJfQorCWlmIChmYykgeworCQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19GQ19FTkFCTEUpLCAmdmFsKTsKKwkJKmZjID0gMDsKKwkJaWYgKHZhbCAmIDEpCisJCQkqZmMgfD0gUEFVU0VfUlg7CisJCWlmICh2YWwgJiAyKQorCQkJKmZjIHw9IFBBVVNFX1RYOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3BvcnQoc3RydWN0IGNtYWMgKm1hYykKK3sKKwl1MzIgdmFsOworCXUzMiBpbmRleCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IG1hYy0+YWRhcHRlcjsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19ESVZFUlNFX0NPTkZJRyksICZ2YWwpOworCXZhbCB8PSBESVZFUlNFX0NPTkZJR19DUkNfQUREIHwgRElWRVJTRV9DT05GSUdfUEFEX0VOQUJMRTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX0RJVkVSU0VfQ09ORklHKSwgdmFsKTsKKwlpZiAobWFjLT5pbnN0YW5jZS0+dmVyc2lvbiA+IDApCisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfUlhfRklMVEVSKSwgMyk7CisJZWxzZSAvKiBEb24ndCBlbmFibGUgdW5pY2FzdCBhZGRyZXNzIGZpbHRlcmluZyBkdWUgdG8gSVhGMTAxMCBidWcgKi8KKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SWF9GSUxURVIpLCAyKTsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIFJFR19SWF9FUlJfRFJPUCwgJnZhbCk7CisJdmFsIHw9ICgxIDw8IGluZGV4KTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgUkVHX1JYX0VSUl9EUk9QLCB2YWwpOworCisJLyoKKwkgKiBDbGVhciB0aGUgcG9ydCBSTU9OIHJlZ2lzdGVycyBieSBhZGRpbmcgdGhlaXIgY3VycmVudCB2YWx1ZXMgdG8gdGhlCisJICogY3VtdWxhdGljZSBwb3J0IHN0YXRzIGFuZCB0aGVuIGNsZWFyaW5nIHRoZSBzdGF0cy4gIFJlYWxseS4KKwkgKi8KKwlwb3J0X3N0YXRzX3VwZGF0ZShtYWMpOworCW1lbXNldCgmbWFjLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MpKTsKKwltYWMtPmluc3RhbmNlLT50aWNrcyA9IDA7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfUE9SVF9FTkFCTEUsICZ2YWwpOworCXZhbCB8PSAoMSA8PCBpbmRleCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgdmFsKTsKKworICAgICAgIAlpbmRleCA8PD0gMjsKKyAgICAgICAgaWYgKGlzX1QyKGFkYXB0ZXIpKSB7CisJCS8qIFQyMDQ6IHNldCB0aGUgRmlmbyB3YXRlciBsZXZlbCAmIHRocmVzaG9sZCAqLworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgUlhfRklGT19ISUdIX1dBVEVSTUFSS19CQVNFICsgaW5kZXgsIDB4NzQwKTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJYX0ZJRk9fTE9XX1dBVEVSTUFSS19CQVNFICsgaW5kZXgsIDB4NzMwKTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFRYX0ZJRk9fSElHSF9XQVRFUk1BUktfQkFTRSArIGluZGV4LCAweDYwMCk7CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBUWF9GSUZPX0xPV19XQVRFUk1BUktfQkFTRSArIGluZGV4LCAweDFkMCk7CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBUWF9GSUZPX1hGRVJfVEhSRVNfQkFTRSArIGluZGV4LCAweDExMDApOworCX0gZWxzZSB7CisJLyoKKwkgKiBTZXQgdGhlIFRYIEZpZm8gVGhyZXNob2xkIHRvIDB4NDAwIGluc3RlYWQgb2YgMHgxMDAgdG8gd29yayBhcm91bmQKKwkgKiBVbmRlcnJ1biBwcm9ibGVtLiBJbnRlbCBoYXMgYmxlc3NlZCB0aGlzIHNvbHV0aW9uLgorCSAqLworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgVFhfRklGT19YRkVSX1RIUkVTX0JBU0UgKyBpbmRleCwgMHg0MDApOworCX0KK30KKworLyogSVhGMTAxMCBwb3J0cyBkbyBub3QgaGF2ZSBzZXBhcmF0ZSBlbmFibGVzIGZvciBUWCBhbmQgUlggKi8KK3N0YXRpYyBpbnQgbWFjX2VuYWJsZShzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgd2hpY2gpCit7CisJaWYgKHdoaWNoICYgKE1BQ19ESVJFQ1RJT05fUlggfCBNQUNfRElSRUNUSU9OX1RYKSkKKwkJZW5hYmxlX3BvcnQobWFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfZGlzYWJsZShzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgd2hpY2gpCit7CisJaWYgKHdoaWNoICYgKE1BQ19ESVJFQ1RJT05fUlggfCBNQUNfRElSRUNUSU9OX1RYKSkKKwkJZGlzYWJsZV9wb3J0KG1hYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gYWNjdW11bGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlCisgKiBSTU9OIGNvdW50ZXJzIGludG8gdGhlIHBvcnQgc3RhdGlzdGljcy4gIFNpbmNlIHRoZSBjb3VudGVycyBhcmUgb25seSAzMiBiaXRzCisgKiBzb21lIG9mIHRoZW0gY2FuIG92ZXJmbG93IGluIGxlc3MgdGhhbiBhIG1pbnV0ZSBhdCBHaWdFIHNwZWVkcywgc28gdGhpcworICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSAzMCBzZWNvbmRzIG9yIHNvLgorICoKKyAqIFRvIGN1dCBkb3duIG9uIHJlYWRpbmcgY29zdHMgd2UgdXBkYXRlIG9ubHkgdGhlIG9jdGV0IGNvdW50ZXJzIGF0IGVhY2ggdGljaworICogYW5kIGRvIGEgZnVsbCB1cGRhdGUgYXQgbWFqb3IgdGlja3MsIHdoaWNoIGNhbiBiZSBldmVyeSAzMCBtaW51dGVzIG9yIG1vcmUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21hY19zdGF0aXN0aWNzICptYWNfdXBkYXRlX3N0YXRpc3RpY3Moc3RydWN0IGNtYWMgKm1hYywKKwkJCQkJCQkgICBpbnQgZmxhZykKK3sKKwlpZiAoZmxhZyA9PSBNQUNfU1RBVFNfVVBEQVRFX0ZVTEwgfHwKKwkgICAgTUFKT1JfVVBEQVRFX1RJQ0tTIDw9IG1hYy0+aW5zdGFuY2UtPnRpY2tzKSB7CisJCXBvcnRfc3RhdHNfdXBkYXRlKG1hYyk7CisJCW1hYy0+aW5zdGFuY2UtPnRpY2tzID0gMDsKKwl9IGVsc2UgeworCQl1MzIgdmFsOworCisJCVJNT05fVVBEQVRFKG1hYywgUnhPY3RldHNUb3RhbE9LLCBSeE9jdGV0c09LKTsKKwkJUk1PTl9VUERBVEUobWFjLCBUeE9jdGV0c1RvdGFsT0ssIFR4T2N0ZXRzT0spOworCQltYWMtPmluc3RhbmNlLT50aWNrcysrOworCX0KKwlyZXR1cm4gJm1hYy0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19kZXN0cm95KHN0cnVjdCBjbWFjICptYWMpCit7CisJa2ZyZWUobWFjKTsKK30KKworc3RhdGljIHN0cnVjdCBjbWFjX29wcyBpeGYxMDEwX29wcyA9IHsKKwkuZGVzdHJveSAgICAgICAgICAgICAgICAgID0gbWFjX2Rlc3Ryb3ksCisJLnJlc2V0ICAgICAgICAgICAgICAgICAgICA9IG1hY19yZXNldCwKKwkuaW50ZXJydXB0X2VuYWJsZSAgICAgICAgID0gbWFjX2ludHJfb3AsCisJLmludGVycnVwdF9kaXNhYmxlICAgICAgICA9IG1hY19pbnRyX29wLAorCS5pbnRlcnJ1cHRfY2xlYXIgICAgICAgICAgPSBtYWNfaW50cl9vcCwKKwkuZW5hYmxlICAgICAgICAgICAgICAgICAgID0gbWFjX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICAgICAgICAgICAgID0gbWFjX2Rpc2FibGUsCisJLnNldF9tdHUgICAgICAgICAgICAgICAgICA9IG1hY19zZXRfbXR1LAorCS5zZXRfcnhfbW9kZSAgICAgICAgICAgICAgPSBtYWNfc2V0X3J4X21vZGUsCisJLnNldF9zcGVlZF9kdXBsZXhfZmMgICAgICA9IG1hY19zZXRfc3BlZWRfZHVwbGV4X2ZjLAorCS5nZXRfc3BlZWRfZHVwbGV4X2ZjICAgICAgPSBtYWNfZ2V0X3NwZWVkX2R1cGxleF9mYywKKwkuc3RhdGlzdGljc191cGRhdGUgICAgICAgID0gbWFjX3VwZGF0ZV9zdGF0aXN0aWNzLAorCS5tYWNhZGRyZXNzX2dldCAgICAgICAgICAgPSBtYWNfZ2V0X2FkZHJlc3MsCisJLm1hY2FkZHJlc3Nfc2V0ICAgICAgICAgICA9IG1hY19zZXRfYWRkcmVzcywKK307CisKK3N0YXRpYyBpbnQgaXhmMTAxMF9tYWNfcmVzZXQoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXUzMiB2YWw7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCWlmICgodmFsICYgMSkgIT0gMCkgeworCQl2YWwgJj0gfjE7CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJCXVkZWxheSgyKTsKKwl9CisJdmFsIHw9IDE7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwl1ZGVsYXkoMik7CisKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgUkVHX1BPUlRfRU5BQkxFLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbWFjICppeGYxMDEwX21hY19jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGNtYWMgKm1hYzsKKwl1MzIgdmFsOworCisJaWYgKGluZGV4ID4gOSkgcmV0dXJuIE5VTEw7CisKKwltYWMgPSBremFsbG9jKHNpemVvZigqbWFjKSArIHNpemVvZihjbWFjX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYWMpIHJldHVybiBOVUxMOworCisJbWFjLT5vcHMgPSAmaXhmMTAxMF9vcHM7CisJbWFjLT5pbnN0YW5jZSA9IChjbWFjX2luc3RhbmNlICopKG1hYyArIDEpOworCisJbWFjLT5pbnN0YW5jZS0+bWFjX2Jhc2UgPSBNQUNSRUdfQkFTRSArIChpbmRleCAqIDB4MjAwKTsKKwltYWMtPmluc3RhbmNlLT5pbmRleCAgICA9IGluZGV4OworCW1hYy0+YWRhcHRlciAgPSBhZGFwdGVyOworCW1hYy0+aW5zdGFuY2UtPnRpY2tzICAgID0gMDsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIFJFR19KVEFHX0lELCAmdmFsKTsKKwltYWMtPmluc3RhbmNlLT52ZXJzaW9uID0gdmFsID4+IDI4OworCXJldHVybiBtYWM7Cit9CisKK3N0cnVjdCBnbWFjIHQxX2l4ZjEwMTBfb3BzID0geworCVNUQVRTX1RJQ0tfU0VDUywKKwlpeGYxMDEwX21hY19jcmVhdGUsCisJaXhmMTAxMF9tYWNfcmVzZXQKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL21hYy5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWYzOWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tYWMuYwpAQCAtMCwwICsxLDM2OCBAQAorLyogJERhdGU6IDIwMDUvMTAvMjIgMDA6NDI6NTkgJCAkUkNTZmlsZTogbWFjLmMsdiAkICRSZXZpc2lvbjogMS4zMiAkICovCisjaW5jbHVkZSAiZ21hYy5oIgorI2luY2x1ZGUgInJlZ3MuaCIKKyNpbmNsdWRlICJmcGdhX2RlZnMuaCIKKworI2RlZmluZSBNQUNfQ1NSX0lOVEVSRkFDRV9HTUlJICAgICAgMHgwCisjZGVmaW5lIE1BQ19DU1JfSU5URVJGQUNFX1RCSSAgICAgICAweDEKKyNkZWZpbmUgTUFDX0NTUl9JTlRFUkZBQ0VfTUlJICAgICAgIDB4MgorI2RlZmluZSBNQUNfQ1NSX0lOVEVSRkFDRV9STUlJICAgICAgMHgzCisKKy8qIENoZWxzaW8ncyBNQUMgc3RhdGlzdGljcy4gKi8KK3N0cnVjdCBtYWNfc3RhdGlzdGljcyB7CisKKwkvKiBUcmFuc21pdCAqLworCXUzMiBUeEZyYW1lc1RyYW5zbWl0dGVkT0s7CisJdTMyIFR4UmVzZXJ2ZWQxOworCXUzMiBUeFJlc2VydmVkMjsKKwl1MzIgVHhPY3RldHNUcmFuc21pdHRlZE9LOworCXUzMiBUeEZyYW1lc1dpdGhEZWZlcnJlZFhtaXNzaW9uczsKKwl1MzIgVHhMYXRlQ29sbGlzaW9uczsKKwl1MzIgVHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnM7CisJdTMyIFR4RnJhbWVzTG9zdER1ZVRvSW50TUFDWG1pdEVycm9yOworCXUzMiBUeFJlc2VydmVkMzsKKwl1MzIgVHhNdWx0aWNhc3RGcmFtZVhtaXR0ZWRPSzsKKwl1MzIgVHhCcm9hZGNhc3RGcmFtZXNYbWl0dGVkT0s7CisJdTMyIFR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsOworCXUzMiBUeFBBVVNFTUFDQ3RybEZyYW1lc1RyYW5zbWl0dGVkOworCisJLyogUmVjZWl2ZSAqLworCXUzMiBSeEZyYW1lc1JlY2VpdmVkT0s7CisJdTMyIFJ4RnJhbWVDaGVja1NlcXVlbmNlRXJyb3JzOworCXUzMiBSeEFsaWdubWVudEVycm9yczsKKwl1MzIgUnhPY3RldHNSZWNlaXZlZE9LOworCXUzMiBSeEZyYW1lc0xvc3REdWVUb0ludE1BQ1JjdkVycm9yOworCXUzMiBSeE11bHRpY2FzdEZyYW1lc1JlY2VpdmVkT0s7CisJdTMyIFJ4QnJvYWRjYXN0RnJhbWVzUmVjZWl2ZWRPSzsKKwl1MzIgUnhJblJhbmdlTGVuZ3RoRXJyb3JzOworCXUzMiBSeFR4T3V0T2ZSYW5nZUxlbmd0aEZpZWxkOworCXUzMiBSeEZyYW1lVG9vTG9uZ0Vycm9yczsKKwl1MzIgUnhQQVVTRU1BQ0N0cmxGcmFtZXNSZWNlaXZlZDsKK307CisKK3N0YXRpYyBpbnQgc3RhdGljX2FQb3J0c1tdID0geworCUZQR0FfR01BQ19JTlRFUlJVUFRfUE9SVDAsCisJRlBHQV9HTUFDX0lOVEVSUlVQVF9QT1JUMSwKKwlGUEdBX0dNQUNfSU5URVJSVVBUX1BPUlQyLAorCUZQR0FfR01BQ19JTlRFUlJVUFRfUE9SVDMKK307CisKK3N0cnVjdCBfY21hY19pbnN0YW5jZSB7CisJdTMyIGluZGV4OworfTsKKworc3RhdGljIGludCBtYWNfaW50cl9lbmFibGUoc3RydWN0IGNtYWMgKm1hYykKK3sKKwl1MzIgbWFjX2ludHI7CisKKwlpZiAodDFfaXNfYXNpYyhtYWMtPmFkYXB0ZXIpKSB7CisJCS8qIEFTSUMgKi8KKworCQkvKiBXZSBkb24ndCB1c2UgdGhlIG9uIGNoaXAgTUFDIGZvciBBU0lDIHByb2R1Y3RzLiAqLworCX0gZWxzZSB7CisJCS8qIEZQR0EgKi8KKworCQkvKiBTZXQgcGFyZW50IGdtYWMgaW50ZXJydXB0LiAqLworCQltYWNfaW50ciA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwkJbWFjX2ludHIgfD0gRlBHQV9QQ0lYX0lOVEVSUlVQVF9HTUFDOworCQl3cml0ZWwobWFjX2ludHIsIG1hYy0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCQltYWNfaW50ciA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncyArIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9FTkFCTEUpOworCQltYWNfaW50ciB8PSBzdGF0aWNfYVBvcnRzW21hYy0+aW5zdGFuY2UtPmluZGV4XTsKKwkJd3JpdGVsKG1hY19pbnRyLAorCQkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgRlBHQV9HTUFDX0FERFJfSU5URVJSVVBUX0VOQUJMRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2ludHJfZGlzYWJsZShzdHJ1Y3QgY21hYyAqbWFjKQoreworCXUzMiBtYWNfaW50cjsKKworCWlmICh0MV9pc19hc2ljKG1hYy0+YWRhcHRlcikpIHsKKwkJLyogQVNJQyAqLworCisJCS8qIFdlIGRvbid0IHVzZSB0aGUgb24gY2hpcCBNQUMgZm9yIEFTSUMgcHJvZHVjdHMuICovCisJfSBlbHNlIHsKKwkJLyogRlBHQSAqLworCisJCS8qIFNldCBwYXJlbnQgZ21hYyBpbnRlcnJ1cHQuICovCisJCW1hY19pbnRyID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCQltYWNfaW50ciAmPSB+RlBHQV9QQ0lYX0lOVEVSUlVQVF9HTUFDOworCQl3cml0ZWwobWFjX2ludHIsIG1hYy0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCQltYWNfaW50ciA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncyArIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9FTkFCTEUpOworCQltYWNfaW50ciAmPSB+KHN0YXRpY19hUG9ydHNbbWFjLT5pbnN0YW5jZS0+aW5kZXhdKTsKKwkJd3JpdGVsKG1hY19pbnRyLAorCQkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgRlBHQV9HTUFDX0FERFJfSU5URVJSVVBUX0VOQUJMRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2ludHJfY2xlYXIoc3RydWN0IGNtYWMgKm1hYykKK3sKKwl1MzIgbWFjX2ludHI7CisKKwlpZiAodDFfaXNfYXNpYyhtYWMtPmFkYXB0ZXIpKSB7CisJCS8qIEFTSUMgKi8KKworCQkvKiBXZSBkb24ndCB1c2UgdGhlIG9uIGNoaXAgTUFDIGZvciBBU0lDIHByb2R1Y3RzLiAqLworCX0gZWxzZSB7CisJCS8qIEZQR0EgKi8KKworCQkvKiBTZXQgcGFyZW50IGdtYWMgaW50ZXJydXB0LiAqLworCQl3cml0ZWwoRlBHQV9QQ0lYX0lOVEVSUlVQVF9HTUFDLAorCQkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgIEFfUExfQ0FVU0UpOworCQltYWNfaW50ciA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncyArIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9DQVVTRSk7CisJCW1hY19pbnRyIHw9IChzdGF0aWNfYVBvcnRzW21hYy0+aW5zdGFuY2UtPmluZGV4XSk7CisJCXdyaXRlbChtYWNfaW50ciwKKwkJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9DQVVTRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2dldF9hZGRyZXNzKHN0cnVjdCBjbWFjICptYWMsIHU4IGFkZHJbNl0pCit7CisJdTMyIGRhdGEzMl9sbywgZGF0YTMyX2hpOworCisJZGF0YTMyX2xvID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzCisJCQkgICsgTUFDX1JFR19JRExPKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJZGF0YTMyX2hpID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzCisJCQkgICsgTUFDX1JFR19JREhJKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisKKwlhZGRyWzBdID0gKHU4KSAoKGRhdGEzMl9oaSA+PiA4KSAmIDB4RkYpOworCWFkZHJbMV0gPSAodTgpICgoZGF0YTMyX2hpKSAmIDB4RkYpOworCWFkZHJbMl0gPSAodTgpICgoZGF0YTMyX2xvID4+IDI0KSAmIDB4RkYpOworCWFkZHJbM10gPSAodTgpICgoZGF0YTMyX2xvID4+IDE2KSAmIDB4RkYpOworCWFkZHJbNF0gPSAodTgpICgoZGF0YTMyX2xvID4+IDgpICYgMHhGRik7CisJYWRkcls1XSA9ICh1OCkgKChkYXRhMzJfbG8pICYgMHhGRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX3Jlc2V0KHN0cnVjdCBjbWFjICptYWMpCit7CisJdTMyIGRhdGEzMjsKKwlpbnQgbWFjX2luX3Jlc2V0LCB0aW1lX291dCA9IDEwMDsKKwlpbnQgaWR4ID0gbWFjLT5pbnN0YW5jZS0+aW5kZXg7CisKKwlkYXRhMzIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihpZHgpKTsKKwl3cml0ZWwoZGF0YTMyIHwgRl9NQUNfUkVTRVQsCisJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIE1BQ19SRUdfQ1NSKGlkeCkpOworCisJZG8geworCQlkYXRhMzIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihpZHgpKTsKKworCQltYWNfaW5fcmVzZXQgPSBkYXRhMzIgJiBGX01BQ19SRVNFVDsKKwkJaWYgKG1hY19pbl9yZXNldCkKKwkJCXVkZWxheSgxKTsKKwl9IHdoaWxlIChtYWNfaW5fcmVzZXQgJiYgLS10aW1lX291dCk7CisKKwlpZiAobWFjX2luX3Jlc2V0KSB7CisJCUNIX0VSUigiJXM6IE1BQyAlZCByZXNldCB0aW1lZCBvdXRcbiIsCisJCSAgICAgICBtYWMtPmFkYXB0ZXItPm5hbWUsIGlkeCk7CisJCXJldHVybiAyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgdDFfcnhfbW9kZSAqcm0pCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncworCQkJICAgICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwl2YWwgJj0gfihGX01BQ19QUk9NSVNDIHwgRl9NQUNfTUNfRU5BQkxFKTsKKwl2YWwgfD0gVl9NQUNfUFJPTUlTQyh0MV9yeF9tb2RlX3Byb21pc2Mocm0pICE9IDApOworCXZhbCB8PSBWX01BQ19NQ19FTkFCTEUodDFfcnhfbW9kZV9hbGxtdWx0aShybSkgIT0gMCk7CisJd3JpdGVsKHZhbCwKKwkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19zZXRfc3BlZWRfZHVwbGV4X2ZjKHN0cnVjdCBjbWFjICptYWMsIGludCBzcGVlZCwgaW50IGR1cGxleCwKKwkJCQkgICBpbnQgZmMpCit7CisJdTMyIGRhdGEzMjsKKworCWRhdGEzMiA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncworCQkJICAgICAgICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwlkYXRhMzIgJj0gfihGX01BQ19IQUxGX0RVUExFWCB8IFZfTUFDX1NQRUVEKE1fTUFDX1NQRUVEKSB8CisJCVZfSU5URVJGQUNFKE1fSU5URVJGQUNFKSB8IEZfTUFDX1RYX1BBVVNFX0VOQUJMRSB8CisJCUZfTUFDX1JYX1BBVVNFX0VOQUJMRSk7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDoKKwljYXNlIFNQRUVEXzEwMDoKKwkJZGF0YTMyIHw9IFZfSU5URVJGQUNFKE1BQ19DU1JfSU5URVJGQUNFX01JSSk7CisJCWRhdGEzMiB8PSBWX01BQ19TUEVFRChzcGVlZCA9PSBTUEVFRF8xMCA/IDAgOiAxKTsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwOgorCQlkYXRhMzIgfD0gVl9JTlRFUkZBQ0UoTUFDX0NTUl9JTlRFUkZBQ0VfR01JSSk7CisJCWRhdGEzMiB8PSBWX01BQ19TUEVFRCgyKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGR1cGxleCA+PSAwKQorCQlkYXRhMzIgfD0gVl9NQUNfSEFMRl9EVVBMRVgoZHVwbGV4ID09IERVUExFWF9IQUxGKTsKKworCWlmIChmYyA+PSAwKSB7CisJCWRhdGEzMiB8PSBWX01BQ19SWF9QQVVTRV9FTkFCTEUoKGZjICYgUEFVU0VfUlgpICE9IDApOworCQlkYXRhMzIgfD0gVl9NQUNfVFhfUEFVU0VfRU5BQkxFKChmYyAmIFBBVVNFX1RYKSAhPSAwKTsKKwl9CisKKwl3cml0ZWwoZGF0YTMyLAorCSAgICAgICBtYWMtPmFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19lbmFibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MKKwkJCSAgICArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9SWCkKKwkJdmFsIHw9IEZfTUFDX1JYX0VOQUJMRTsKKwlpZiAod2hpY2ggJiBNQUNfRElSRUNUSU9OX1RYKQorCQl2YWwgfD0gRl9NQUNfVFhfRU5BQkxFOworCXdyaXRlbCh2YWwsCisJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2Rpc2FibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MKKwkJCSAgICArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9SWCkKKwkJdmFsICY9IH5GX01BQ19SWF9FTkFCTEU7CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9UWCkKKwkJdmFsICY9IH5GX01BQ19UWF9FTkFCTEU7CisJd3JpdGVsKHZhbCwKKwkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgbWFjX3NldF9pZnMoc3RydWN0IGNtYWMgKm1hYywgdTMyIG1vZGUpCit7CisJdDFfd3JpdGVfcmVnXzQobWFjLT5hZGFwdGVyLAorCQkgICAgICAgTUFDX1JFR19JRlMobWFjLT5pbnN0YW5jZS0+aW5kZXgpLAorCQkgICAgICAgbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2VuYWJsZV9pc2woc3RydWN0IGNtYWMgKm1hYykKK3sKKwl1MzIgZGF0YTMyID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzCisJCQkJICAgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCWRhdGEzMiB8PSBGX01BQ19SWF9FTkFCTEUgfCBGX01BQ19UWF9FTkFCTEU7CisJdDFfd3JpdGVfcmVnXzQobWFjLT5hZGFwdGVyLAorCQkgICAgICAgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpLAorCQkgICAgICAgZGF0YTMyKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG1hY19zZXRfbXR1KHN0cnVjdCBjbWFjICptYWMsIGludCBtdHUpCit7CisJaWYgKG10dSA+IDk2MDApCisJCXJldHVybiAtRUlOVkFMOworCXdyaXRlbChtdHUgKyBFVEhfSExFTiArIFZMQU5fSExFTiwKKwkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19MQVJHRUZSQU1FTEVOR1RIKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKm1hY191cGRhdGVfc3RhdGlzdGljcyhzdHJ1Y3QgY21hYyAqbWFjLAorCQkJCQkJCSAgIGludCBmbGFnKQoreworCXN0cnVjdCBtYWNfc3RhdGlzdGljcyBzdDsKKwl1MzIgKnAgPSAodTMyICopICYgc3QsIGk7CisKKwl3cml0ZWwoMCwKKwkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19STUNOVChtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdCkgLyBzaXplb2YodTMyKTsgaSsrKQorCQkqcCsrID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzCisJCQkgICAgICsgTUFDX1JFR19STURBVEEobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKworCS8qIFhYWCBjb252ZXJ0IHN0YXRzICovCisJcmV0dXJuICZtYWMtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBtYWNfZGVzdHJveShzdHJ1Y3QgY21hYyAqbWFjKQoreworCWtmcmVlKG1hYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY21hY19vcHMgY2hlbHNpb19tYWNfb3BzID0geworCS5kZXN0cm95ICAgICAgICAgICAgICAgICA9IG1hY19kZXN0cm95LAorCS5yZXNldCAgICAgICAgICAgICAgICAgICA9IG1hY19yZXNldCwKKwkuaW50ZXJydXB0X2VuYWJsZSAgICAgICAgPSBtYWNfaW50cl9lbmFibGUsCisJLmludGVycnVwdF9kaXNhYmxlICAgICAgID0gbWFjX2ludHJfZGlzYWJsZSwKKwkuaW50ZXJydXB0X2NsZWFyICAgICAgICAgPSBtYWNfaW50cl9jbGVhciwKKwkuZW5hYmxlICAgICAgICAgICAgICAgICAgPSBtYWNfZW5hYmxlLAorCS5kaXNhYmxlICAgICAgICAgICAgICAgICA9IG1hY19kaXNhYmxlLAorCS5zZXRfbXR1ICAgICAgICAgICAgICAgICA9IG1hY19zZXRfbXR1LAorCS5zZXRfcnhfbW9kZSAgICAgICAgICAgICA9IG1hY19zZXRfcnhfbW9kZSwKKwkuc2V0X3NwZWVkX2R1cGxleF9mYyAgICAgPSBtYWNfc2V0X3NwZWVkX2R1cGxleF9mYywKKwkubWFjYWRkcmVzc19nZXQgICAgICAgICAgPSBtYWNfZ2V0X2FkZHJlc3MsCisJLnN0YXRpc3RpY3NfdXBkYXRlICAgICAgID0gbWFjX3VwZGF0ZV9zdGF0aXN0aWNzLAorfTsKKworc3RhdGljIHN0cnVjdCBjbWFjICptYWNfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGluZGV4KQoreworCXN0cnVjdCBjbWFjICptYWM7CisJdTMyIGRhdGEzMjsKKworCWlmIChpbmRleCA+PSA0KQorCQlyZXR1cm4gTlVMTDsKKworCW1hYyA9IGt6YWxsb2Moc2l6ZW9mKCptYWMpICsgc2l6ZW9mKGNtYWNfaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hYykKKwkJcmV0dXJuIE5VTEw7CisKKwltYWMtPm9wcyA9ICZjaGVsc2lvX21hY19vcHM7CisJbWFjLT5pbnN0YW5jZSA9IChjbWFjX2luc3RhbmNlICopIChtYWMgKyAxKTsKKworCW1hYy0+aW5zdGFuY2UtPmluZGV4ID0gaW5kZXg7CisJbWFjLT5hZGFwdGVyID0gYWRhcHRlcjsKKworCWRhdGEzMiA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCWRhdGEzMiAmPSB+KEZfTUFDX1JFU0VUIHwgRl9NQUNfUFJPTUlTQyB8IEZfTUFDX1BST01JU0MgfAorCQkgICAgRl9NQUNfTEJfRU5BQkxFIHwgRl9NQUNfUlhfRU5BQkxFIHwgRl9NQUNfVFhfRU5BQkxFKTsKKwlkYXRhMzIgfD0gRl9NQUNfSlVNQk9fRU5BQkxFOworCXdyaXRlbChkYXRhMzIsIGFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIGJhY2tvZmYgc2VlZC4gKi8KKwlkYXRhMzIgPSAweDU1YWEgKyAoMyAqIGluZGV4KTsKKwl3cml0ZWwoZGF0YTMyLAorCSAgICAgICBhZGFwdGVyLT5yZWdzICsgTUFDX1JFR19HTVJBTkRCQUNLT0ZGU0VFRChtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWMgYWRkcmVzcyBuZWVkcyB0byBiZSBzZXQgbWFudWFsbHkuICovCisJZGF0YTMyID0gcmVhZGwoYWRhcHRlci0+cmVncyArIE1BQ19SRUdfSURMTyhtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCWlmIChkYXRhMzIgPT0gMCB8fCBkYXRhMzIgPT0gMHhmZmZmZmZmZikgeworCQkvKgorCQkgKiBBZGQgYSBkZWZhdWx0IE1BQyBhZGRyZXNzIGlmIHdlIGNhbid0IHJlYWQgb25lLgorCQkgKi8KKwkJd3JpdGVsKDB4NDNGRkZGRkYgLSBpbmRleCwKKwkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0lETE8obWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwkJd3JpdGVsKDB4MDAwNywKKwkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0lESEkobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwl9CisKKwkodm9pZCkgbWFjX3NldF9tdHUobWFjLCAxNTAwKTsKKwlyZXR1cm4gbWFjOworfQorCitzdHJ1Y3QgZ21hYyB0MV9jaGVsc2lvX21hY19vcHMgPSB7CisJLmNyZWF0ZSA9IG1hY19jcmVhdGUKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODhlMXh4eC5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFjOTNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguYwpAQCAtMCwwICsxLDM5NyBAQAorLyogJERhdGU6IDIwMDUvMTAvMjQgMjM6MTg6MTMgJCAkUkNTZmlsZTogbXY4OGUxeHh4LmMsdiAkICRSZXZpc2lvbjogMS40OSAkICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAibXY4OGUxeHh4LmgiCisjaW5jbHVkZSAiY3BoeS5oIgorI2luY2x1ZGUgImVsbWVyMC5oIgorCisvKiBNVjg4RTFYWFggTURJIGNyb3Nzb3ZlciByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgQ1JPU1NPVkVSX01ESSAgIDAKKyNkZWZpbmUgQ1JPU1NPVkVSX01ESVggIDEKKyNkZWZpbmUgQ1JPU1NPVkVSX0FVVE8gIDMKKworI2RlZmluZSBJTlRSX0VOQUJMRV9NQVNLIDB4NkNBMAorCisvKgorICogU2V0IHRoZSBiaXRzIGdpdmVuIGJ5ICdiaXR2YWwnIGluIFBIWSByZWdpc3RlciAncmVnJy4KKyAqLworc3RhdGljIHZvaWQgbWRpb19zZXRfYml0KHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgcmVnLCB1MzIgYml0dmFsKQoreworCXUzMiB2YWw7CisKKwkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LCByZWcsICZ2YWwpOworCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LCByZWcsIHZhbCB8IGJpdHZhbCk7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgYml0cyBnaXZlbiBieSAnYml0dmFsJyBpbiBQSFkgcmVnaXN0ZXIgJ3JlZycuCisgKi8KK3N0YXRpYyB2b2lkIG1kaW9fY2xlYXJfYml0KHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgcmVnLCB1MzIgYml0dmFsKQoreworCXUzMiB2YWw7CisKKwkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LCByZWcsICZ2YWwpOworCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LCByZWcsIHZhbCAmIH5iaXR2YWwpOworfQorCisvKgorICogTkFNRTogICBwaHlfcmVzZXQKKyAqCisgKiBERVNDOiAgIFJlc2V0IHRoZSBnaXZlbiBQSFkncyBwb3J0LiBOT1RFOiBUaGlzIGlzIG5vdCBhIGdsb2JhbAorICogICAgICAgICBjaGlwIHJlc2V0LgorICoKKyAqIFBBUkFNUzogY3BoeSAgICAgLSBQb2ludGVyIHRvIFBIWSBpbnN0YW5jZSBkYXRhLgorICoKKyAqIFJFVFVSTjogIDAgLSBTdWNjZXNzZnVsbCByZXNldC4KKyAqICAgICAgICAgLTEgLSBUaW1lb3V0LgorICovCitzdGF0aWMgaW50IG12ODhlMXh4eF9yZXNldChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IHdhaXQpCit7CisJdTMyIGN0bDsKKwlpbnQgdGltZV9vdXQgPSAxMDAwOworCisJbWRpb19zZXRfYml0KGNwaHksIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCWRvIHsKKwkJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgTUlJX0JNQ1IsICZjdGwpOworCQljdGwgJj0gQk1DUl9SRVNFVDsKKwkJaWYgKGN0bCkKKwkJCXVkZWxheSgxKTsKKwl9IHdoaWxlIChjdGwgJiYgLS10aW1lX291dCk7CisKKwlyZXR1cm4gY3RsID8gLTEgOiAwOworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCS8qIEVuYWJsZSBQSFkgaW50ZXJydXB0cy4gKi8KKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwgTVY4OEUxWFhYX0lOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsCisJCSAgIElOVFJfRU5BQkxFX01BU0spOworCisJLyogRW5hYmxlIE1hcnZlbGwgaW50ZXJydXB0cyB0aHJvdWdoIEVsbWVyMC4gKi8KKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl1MzIgZWxtZXI7CisKKwkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKKwkJZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDE7CisJCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkgeworCQkgICAgZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDJ8RUxNRVIwX0dQX0JJVDN8RUxNRVIwX0dQX0JJVDQ7CisgICAgICAgICAgICAgICAgfQorCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfaW50ZXJydXB0X2Rpc2FibGUoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJLyogRGlzYWJsZSBhbGwgcGh5IGludGVycnVwdHMuICovCisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksIE1WODhFMVhYWF9JTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSLCAwKTsKKworCS8qIERpc2FibGUgTWFydmVsbCBpbnRlcnJ1cHRzIHRocm91Z2ggRWxtZXIwLiAqLworCWlmICh0MV9pc19hc2ljKGNwaHktPmFkYXB0ZXIpKSB7CisJCXUzMiBlbG1lcjsKKworCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCAmZWxtZXIpOworCQllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDE7CisJCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkgeworCQkgICAgZWxtZXIgJj0gfihFTE1FUjBfR1BfQklUMnxFTE1FUjBfR1BfQklUM3xFTE1FUjBfR1BfQklUNCk7CisgICAgICAgICAgICAgICAgfQorCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfaW50ZXJydXB0X2NsZWFyKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXUzMiBlbG1lcjsKKworCS8qIENsZWFyIFBIWSBpbnRlcnJ1cHRzIGJ5IHJlYWRpbmcgdGhlIHJlZ2lzdGVyLiAqLworCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksCisJCQlNVjg4RTFYWFhfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUiwgJmVsbWVyKTsKKworCS8qIENsZWFyIE1hcnZlbGwgaW50ZXJydXB0cyB0aHJvdWdoIEVsbWVyMC4gKi8KKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsICZlbG1lcik7CisJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKKwkJICAgIGVsbWVyIHw9IEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0OworICAgICAgICAgICAgICAgIH0KKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgZWxtZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgUEhZIHNwZWVkIGFuZCBkdXBsZXguICBUaGlzIGFsc28gZGlzYWJsZXMgYXV0by1uZWdvdGlhdGlvbiwgZXhjZXB0CisgKiBmb3IgMUdiL3MsIHdoZXJlIGF1dG8tbmVnb3RpYXRpb24gaXMgbWFuZGF0b3J5LgorICovCitzdGF0aWMgaW50IG12ODhlMXh4eF9zZXRfc3BlZWRfZHVwbGV4KHN0cnVjdCBjcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGR1cGxleCkKK3sKKwl1MzIgY3RsOworCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQocGh5LCBNSUlfQk1DUiwgJmN0bCk7CisJaWYgKHNwZWVkID49IDApIHsKKwkJY3RsICY9IH4oQk1DUl9TUEVFRDEwMCB8IEJNQ1JfU1BFRUQxMDAwIHwgQk1DUl9BTkVOQUJMRSk7CisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMDApCisJCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCWN0bCB8PSBCTUNSX1NQRUVEMTAwMDsKKwl9CisJaWYgKGR1cGxleCA+PSAwKSB7CisJCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFggfCBCTUNSX0FORU5BQkxFKTsKKwkJaWYgKGR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCX0KKwlpZiAoY3RsICYgQk1DUl9TUEVFRDEwMDApICAvKiBhdXRvLW5lZ290aWF0aW9uIHJlcXVpcmVkIGZvciAxR2IvcyAqLworCQljdGwgfD0gQk1DUl9BTkVOQUJMRTsKKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfY3Jvc3NvdmVyX3NldChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IGNyb3Nzb3ZlcikKK3sKKwl1MzIgZGF0YTMyOworCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwKKwkJCU1WODhFMVhYWF9TUEVDSUZJQ19DTlRSTF9SRUdJU1RFUiwgJmRhdGEzMik7CisJZGF0YTMyICY9IH5WX1BTQ1JfTURJX1hPVkVSX01PREUoTV9QU0NSX01ESV9YT1ZFUl9NT0RFKTsKKwlkYXRhMzIgfD0gVl9QU0NSX01ESV9YT1ZFUl9NT0RFKGNyb3Nzb3Zlcik7CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksCisJCQlNVjg4RTFYWFhfU1BFQ0lGSUNfQ05UUkxfUkVHSVNURVIsIGRhdGEzMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2F1dG9uZWdfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXUzMiBjdGw7CisKKwkodm9pZCkgbXY4OGUxeHh4X2Nyb3Nzb3Zlcl9zZXQoY3BoeSwgQ1JPU1NPVkVSX0FVVE8pOworCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgTUlJX0JNQ1IsICZjdGwpOworCS8qIHJlc3RhcnQgYXV0b25lZyBmb3IgY2hhbmdlIHRvIHRha2UgZWZmZWN0ICovCisJY3RsIHw9IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwgTUlJX0JNQ1IsIGN0bCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2F1dG9uZWdfZGlzYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgY3RsOworCisJLyoKKwkgKiBDcm9zc292ZXIgKm11c3QqIGJlIHNldCB0byBtYW51YWwgaW4gb3JkZXIgdG8gZGlzYWJsZSBhdXRvLW5lZy4KKwkgKiBUaGUgQWxhc2thIEZBUXMgZG9jdW1lbnQgaGlnaGxpZ2h0cyB0aGlzIHBvaW50LgorCSAqLworCSh2b2lkKSBtdjg4ZTF4eHhfY3Jvc3NvdmVyX3NldChjcGh5LCBDUk9TU09WRVJfTURJKTsKKworCS8qCisJICogTXVzdCBpbmNsdWRlIGF1dG9uZWcgcmVzZXQgd2hlbiBkaXNhYmxpbmcgYXV0by1uZWcuIFRoaXMKKwkgKiBpcyBkZXNjcmliZWQgaW4gdGhlIEFsYXNrYSBGQVEgZG9jdW1lbnQuCisJICovCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgTUlJX0JNQ1IsICZjdGwpOworCWN0bCAmPSB+Qk1DUl9BTkVOQUJMRTsKKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwgTUlJX0JNQ1IsIGN0bCB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfYXV0b25lZ19yZXN0YXJ0KHN0cnVjdCBjcGh5ICpjcGh5KQoreworCW1kaW9fc2V0X2JpdChjcGh5LCBNSUlfQk1DUiwgQk1DUl9BTlJFU1RBUlQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9hZHZlcnRpc2Uoc3RydWN0IGNwaHkgKnBoeSwgdW5zaWduZWQgaW50IGFkdmVydGlzZV9tYXApCit7CisJdTMyIHZhbCA9IDA7CisKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmCisJICAgIChBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpIHsKKwkJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQocGh5LCBNSUlfR0JDUiwgJnZhbCk7CisJCXZhbCAmPSB+KEdCQ1JfQURWXzEwMDBIQUxGIHwgR0JDUl9BRFZfMTAwMEZVTEwpOworCQlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCQl2YWwgfD0gR0JDUl9BRFZfMTAwMEhBTEY7CisJCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCXZhbCB8PSBHQkNSX0FEVl8xMDAwRlVMTDsKKwl9CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKHBoeSwgTUlJX0dCQ1IsIHZhbCk7CisKKwl2YWwgPSAxOworCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTBGVUxMOworCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfUEFVU0UpCisJCXZhbCB8PSBBRFZFUlRJU0VfUEFVU0U7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEX0FTWU1fUEFVU0UpCisJCXZhbCB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9zZXRfbG9vcGJhY2soc3RydWN0IGNwaHkgKmNwaHksIGludCBvbikKK3sKKwlpZiAob24pCisJCW1kaW9fc2V0X2JpdChjcGh5LCBNSUlfQk1DUiwgQk1DUl9MT09QQkFDSyk7CisJZWxzZQorCQltZGlvX2NsZWFyX2JpdChjcGh5LCBNSUlfQk1DUiwgQk1DUl9MT09QQkFDSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2dldF9saW5rX3N0YXR1cyhzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50ICpsaW5rX29rLAorCQkJCSAgICAgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJdTMyIHN0YXR1czsKKwlpbnQgc3AgPSAtMSwgZHBseCA9IC0xLCBwYXVzZSA9IDA7CisKKwkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LAorCQkJTVY4OEUxWFhYX1NQRUNJRklDX1NUQVRVU19SRUdJU1RFUiwgJnN0YXR1cyk7CisJaWYgKChzdGF0dXMgJiBWX1BTU1JfU1RBVFVTX1JFU09MVkVEKSAhPSAwKSB7CisJCWlmIChzdGF0dXMgJiBWX1BTU1JfUlhfUEFVU0UpCisJCQlwYXVzZSB8PSBQQVVTRV9SWDsKKwkJaWYgKHN0YXR1cyAmIFZfUFNTUl9UWF9QQVVTRSkKKwkJCXBhdXNlIHw9IFBBVVNFX1RYOworCQlkcGx4ID0gKHN0YXR1cyAmIFZfUFNTUl9EVVBMRVgpID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwkJc3AgPSBHX1BTU1JfU1BFRUQoc3RhdHVzKTsKKwkJaWYgKHNwID09IDApCisJCQlzcCA9IFNQRUVEXzEwOworCQllbHNlIGlmIChzcCA9PSAxKQorCQkJc3AgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXNwID0gU1BFRURfMTAwMDsKKwl9CisJaWYgKGxpbmtfb2spCisJCSpsaW5rX29rID0gKHN0YXR1cyAmIFZfUFNTUl9MSU5LKSAhPSAwOworCWlmIChzcGVlZCkKKwkJKnNwZWVkID0gc3A7CisJaWYgKGR1cGxleCkKKwkJKmR1cGxleCA9IGRwbHg7CisJaWYgKGZjKQorCQkqZmMgPSBwYXVzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfZG93bnNoaWZ0X3NldChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IGRvd25zaGlmdF9lbmFibGUpCit7CisJdTMyIHZhbDsKKworCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksCisJCU1WODhFMVhYWF9FWFRfUEhZX1NQRUNJRklDX0NOVFJMX1JFR0lTVEVSLCAmdmFsKTsKKworCS8qCisJICogU2V0IHRoZSBkb3duc2hpZnQgY291bnRlciB0byAyIHNvIHdlIHRyeSB0byBlc3RhYmxpc2ggR2IgbGluaworCSAqIHR3aWNlIGJlZm9yZSBkb3duc2hpZnRpbmcuCisJICovCisJdmFsICY9IH4oVl9ET1dOU0hJRlRfRU5BQkxFIHwgVl9ET1dOU0hJRlRfQ05UKE1fRE9XTlNISUZUX0NOVCkpOworCisJaWYgKGRvd25zaGlmdF9lbmFibGUpCisJCXZhbCB8PSBWX0RPV05TSElGVF9FTkFCTEUgfCBWX0RPV05TSElGVF9DTlQoMik7CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksCisJCQlNVjg4RTFYWFhfRVhUX1BIWV9TUEVDSUZJQ19DTlRSTF9SRUdJU1RFUiwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJaW50IGNwaHlfY2F1c2UgPSAwOworCXUzMiBzdGF0dXM7CisKKwkvKgorCSAqIExvb3AgdW50aWwgY2F1c2UgcmVhZHMgemVyby4gTmVlZCB0byBoYW5kbGUgYm91bmNpbmcgaW50ZXJydXB0cy4KKyAgICAgICAgICovCisJd2hpbGUgKDEpIHsKKwkJdTMyIGNhdXNlOworCisJCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksCisJCQkJTVY4OEUxWFhYX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIsCisJCQkJJmNhdXNlKTsKKwkJY2F1c2UgJj0gSU5UUl9FTkFCTEVfTUFTSzsKKwkJaWYgKCFjYXVzZSkgYnJlYWs7CisKKwkJaWYgKGNhdXNlICYgTVY4OEUxWFhYX0lOVFJfTElOS19DSE5HKSB7CisJCQkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LAorCQkJCU1WODhFMVhYWF9TUEVDSUZJQ19TVEFUVVNfUkVHSVNURVIsICZzdGF0dXMpOworCisJCQlpZiAoc3RhdHVzICYgTVY4OEUxWFhYX0lOVFJfTElOS19DSE5HKSB7CisJCQkJY3BoeS0+c3RhdGUgfD0gUEhZX0xJTktfVVA7CisJCQl9IGVsc2UgeworCQkJCWNwaHktPnN0YXRlICY9IH5QSFlfTElOS19VUDsKKwkJCQlpZiAoY3BoeS0+c3RhdGUgJiBQSFlfQVVUT05FR19FTikKKwkJCQkJY3BoeS0+c3RhdGUgJj0gflBIWV9BVVRPTkVHX1JEWTsKKwkJCQljcGh5X2NhdXNlIHw9IGNwaHlfY2F1c2VfbGlua19jaGFuZ2U7CisJCQl9CisJCX0KKworCQlpZiAoY2F1c2UgJiBNVjg4RTFYWFhfSU5UUl9BVVRPTkVHX0RPTkUpCisJCQljcGh5LT5zdGF0ZSB8PSBQSFlfQVVUT05FR19SRFk7CisKKwkJaWYgKChjcGh5LT5zdGF0ZSAmIChQSFlfTElOS19VUCB8IFBIWV9BVVRPTkVHX1JEWSkpID09CisJCQkoUEhZX0xJTktfVVAgfCBQSFlfQVVUT05FR19SRFkpKQorCQkJCWNwaHlfY2F1c2UgfD0gY3BoeV9jYXVzZV9saW5rX2NoYW5nZTsKKwl9CisJcmV0dXJuIGNwaHlfY2F1c2U7Cit9CisKK3N0YXRpYyB2b2lkIG12ODhlMXh4eF9kZXN0cm95KHN0cnVjdCBjcGh5ICpjcGh5KQoreworCWtmcmVlKGNwaHkpOworfQorCitzdGF0aWMgc3RydWN0IGNwaHlfb3BzIG12ODhlMXh4eF9vcHMgPSB7CisJLmRlc3Ryb3kgICAgICAgICAgICAgID0gbXY4OGUxeHh4X2Rlc3Ryb3ksCisJLnJlc2V0ICAgICAgICAgICAgICAgID0gbXY4OGUxeHh4X3Jlc2V0LAorCS5pbnRlcnJ1cHRfZW5hYmxlICAgICA9IG12ODhlMXh4eF9pbnRlcnJ1cHRfZW5hYmxlLAorCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICA9IG12ODhlMXh4eF9pbnRlcnJ1cHRfZGlzYWJsZSwKKwkuaW50ZXJydXB0X2NsZWFyICAgICAgPSBtdjg4ZTF4eHhfaW50ZXJydXB0X2NsZWFyLAorCS5pbnRlcnJ1cHRfaGFuZGxlciAgICA9IG12ODhlMXh4eF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkuYXV0b25lZ19lbmFibGUgICAgICAgPSBtdjg4ZTF4eHhfYXV0b25lZ19lbmFibGUsCisJLmF1dG9uZWdfZGlzYWJsZSAgICAgID0gbXY4OGUxeHh4X2F1dG9uZWdfZGlzYWJsZSwKKwkuYXV0b25lZ19yZXN0YXJ0ICAgICAgPSBtdjg4ZTF4eHhfYXV0b25lZ19yZXN0YXJ0LAorCS5hZHZlcnRpc2UgICAgICAgICAgICA9IG12ODhlMXh4eF9hZHZlcnRpc2UsCisJLnNldF9sb29wYmFjayAgICAgICAgID0gbXY4OGUxeHh4X3NldF9sb29wYmFjaywKKwkuc2V0X3NwZWVkX2R1cGxleCAgICAgPSBtdjg4ZTF4eHhfc2V0X3NwZWVkX2R1cGxleCwKKwkuZ2V0X2xpbmtfc3RhdHVzICAgICAgPSBtdjg4ZTF4eHhfZ2V0X2xpbmtfc3RhdHVzLAorfTsKKworc3RhdGljIHN0cnVjdCBjcGh5ICptdjg4ZTF4eHhfcGh5X2NyZWF0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwKKwkJCQkJIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCit7CisJc3RydWN0IGNwaHkgKmNwaHkgPSBremFsbG9jKHNpemVvZigqY3BoeSksIEdGUF9LRVJORUwpOworCisJaWYgKCFjcGh5KSByZXR1cm4gTlVMTDsKKworCWNwaHlfaW5pdChjcGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJm12ODhlMXh4eF9vcHMsIG1kaW9fb3BzKTsKKworCS8qIENvbmZpZ3VyZSBwYXJ0aWN1bGFyIFBIWSdzIHRvIHJ1biBpbiBhIGRpZmZlcmVudCBtb2RlLiAqLworCWlmICgoYm9hcmRfaW5mbyhhZGFwdGVyKS0+Y2FwcyAmIFNVUFBPUlRFRF9UUCkgJiYKKwkgICAgYm9hcmRfaW5mbyhhZGFwdGVyKS0+Y2hpcF9waHkgPT0gQ0hCVF9QSFlfODhFMTExMSkgeworCQkvKgorCQkgKiBDb25maWd1cmUgdGhlIFBIWSB0cmFuc21pdHRlciBhcyBjbGFzcyBBIHRvIHJlZHVjZSBFTUkuCisJCSAqLworCQkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwKKwkJCQlNVjg4RTFYWFhfRVhURU5ERURfQUREUl9SRUdJU1RFUiwgMHhCKTsKKwkJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksCisJCQkJTVY4OEUxWFhYX0VYVEVOREVEX1JFR0lTVEVSLCAweDgwMDQpOworCX0KKwkodm9pZCkgbXY4OGUxeHh4X2Rvd25zaGlmdF9zZXQoY3BoeSwgMSk7ICAgLyogRW5hYmxlIGRvd25zaGlmdCAqLworCisgICAgICAgIC8qIExFRCAqLworCWlmIChpc19UMihhZGFwdGVyKSkgeworCQkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwKKwkJCQlNVjg4RTFYWFhfTEVEX0NPTlRST0xfUkVHSVNURVIsIDB4MSk7CisgICAgICAgIH0KKworCXJldHVybiBjcGh5OworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9waHlfcmVzZXQoYWRhcHRlcl90KiBhZGFwdGVyKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3BoeSB0MV9tdjg4ZTF4eHhfb3BzID0geworCW12ODhlMXh4eF9waHlfY3JlYXRlLAorCW12ODhlMXh4eF9waHlfcmVzZXQKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODhlMXh4eC5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdjYzQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguaApAQCAtMCwwICsxLDEyNyBAQAorLyogJERhdGU6IDIwMDUvMDMvMDcgMjM6NTk6MDUgJCAkUkNTZmlsZTogbXY4OGUxeHh4LmgsdiAkICRSZXZpc2lvbjogMS4xMyAkICovCisjaWZuZGVmIENIRUxTSU9fTVY4RTFYWFhfSAorI2RlZmluZSBDSEVMU0lPX01WOEUxWFhYX0gKKworI2lmbmRlZiBCTUNSX1NQRUVEMTAwMAorIyBkZWZpbmUgQk1DUl9TUEVFRDEwMDAgMHg0MAorI2VuZGlmCisKKyNpZm5kZWYgQURWRVJUSVNFX1BBVVNFCisjIGRlZmluZSBBRFZFUlRJU0VfUEFVU0UgMHg0MDAKKyNlbmRpZgorI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0VfQVNZTQorIyBkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0FTWU0gMHg4MDAKKyNlbmRpZgorCisvKiBHaWdhYml0IE1JSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUlJX0dCQ1IgOSAgICAgICAvKiAxMDAwQmFzZS1UIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0dCU1IgMTAgICAgICAvKiAxMDAwQmFzZS1UIHN0YXR1cyByZWdpc3RlciAqLworCisvKiAxMDAwQmFzZS1UIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEdCQ1JfQURWXzEwMDBIQUxGICAgICAgICAgMHgxMDAKKyNkZWZpbmUgR0JDUl9BRFZfMTAwMEZVTEwgICAgICAgICAweDIwMAorI2RlZmluZSBHQkNSX1BSRUZFUl9NQVNURVIgICAgICAgIDB4NDAwCisjZGVmaW5lIEdCQ1JfTUFOVUFMX0FTX01BU1RFUiAgICAgMHg4MDAKKyNkZWZpbmUgR0JDUl9NQU5VQUxfQ09ORklHX0VOQUJMRSAweDEwMDAKKworLyogMTAwMEJhc2UtVCBzdGF0dXMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEdCU1JfTFBfMTAwMEhBTEYgIDB4NDAwCisjZGVmaW5lIEdCU1JfTFBfMTAwMEZVTEwgIDB4ODAwCisjZGVmaW5lIEdCU1JfUkVNT1RFX09LICAgIDB4MTAwMAorI2RlZmluZSBHQlNSX0xPQ0FMX09LICAgICAweDIwMDAKKyNkZWZpbmUgR0JTUl9MT0NBTF9NQVNURVIgMHg0MDAwCisjZGVmaW5lIEdCU1JfTUFTVEVSX0ZBVUxUIDB4ODAwMAorCisvKiBNYXJ2ZWxsIFBIWSBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX0pBQkJFUiAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfUE9MQVJJVFlfQ0hORyAgIDB4MDAwMgorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9FTkdfREVURUNUX0NITkcgMHgwMDEwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX0RPV05TSElGVCAgICAgICAweDAwMjAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfTURJX1hPVkVSX0NITkcgIDB4MDA0MAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9GSUZPX09WRVJfVU5ERVIgMHgwMDgwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX0ZBTFNFX0NBUlJJRVIgICAweDAxMDAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfU1lNQk9MX0VSUk9SICAgIDB4MDIwMAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9MSU5LX0NITkcgICAgICAgMHgwNDAwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX0FVVE9ORUdfRE9ORSAgICAweDA4MDAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfUEFHRV9SRUNWICAgICAgIDB4MTAwMAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9EVVBMRVhfQ0hORyAgICAgMHgyMDAwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX1NQRUVEX0NITkcgICAgICAweDQwMDAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfQVVUT05FR19FUlIgICAgIDB4ODAwMAorCisvKiBNYXJ2ZWxsIFBIWSBzcGVjaWZpYyByZWdpc3RlcnMuICovCisjZGVmaW5lIE1WODhFMVhYWF9TUEVDSUZJQ19DTlRSTF9SRUdJU1RFUiAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1WODhFMVhYWF9TUEVDSUZJQ19TVEFUVVNfUkVHSVNURVIgICAgICAgICAgICAgIDE3CisjZGVmaW5lIE1WODhFMVhYWF9JTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSICAgICAgICAgICAgIDE4CisjZGVmaW5lIE1WODhFMVhYWF9JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSICAgICAgICAgICAgIDE5CisjZGVmaW5lIE1WODhFMVhYWF9FWFRfUEhZX1NQRUNJRklDX0NOVFJMX1JFR0lTVEVSICAgICAgIDIwCisjZGVmaW5lIE1WODhFMVhYWF9SRUNWX0VSUl9DTlRSX1JFR0lTVEVSICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIE1WODhFMVhYWF9SRVNfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIE1WODhFMVhYWF9HTE9CQUxfU1RBVFVTX1JFR0lTVEVSICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIE1WODhFMVhYWF9MRURfQ09OVFJPTF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIE1WODhFMVhYWF9NQU5VQUxfTEVEX09WRVJSSURFX1JFR0lTVEVSICAgICAgICAgIDI1CisjZGVmaW5lIE1WODhFMVhYWF9FWFRfUEhZX1NQRUNJRklDX0NOVFJMXzJfUkVHSVNURVIgICAgIDI2CisjZGVmaW5lIE1WODhFMVhYWF9FWFRfUEhZX1NQRUNJRklDX1NUQVRVU19SRUdJU1RFUiAgICAgIDI3CisjZGVmaW5lIE1WODhFMVhYWF9WSVJUVUFMX0NBQkxFX1RFU1RFUl9SRUdJU1RFUiAgICAgICAgIDI4CisjZGVmaW5lIE1WODhFMVhYWF9FWFRFTkRFRF9BRERSX1JFR0lTVEVSICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIE1WODhFMVhYWF9FWFRFTkRFRF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDMwCisKKy8qIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBTX1BTQ1JfTURJX1hPVkVSX01PREUgICAgNQorI2RlZmluZSBNX1BTQ1JfTURJX1hPVkVSX01PREUgICAgMHgzCisjZGVmaW5lIFZfUFNDUl9NRElfWE9WRVJfTU9ERSh4KSAoKHgpIDw8IFNfUFNDUl9NRElfWE9WRVJfTU9ERSkKKyNkZWZpbmUgR19QU0NSX01ESV9YT1ZFUl9NT0RFKHgpICgoKHgpID4+IFNfUFNDUl9NRElfWE9WRVJfTU9ERSkgJiBNX1BTQ1JfTURJX1hPVkVSX01PREUpCisKKy8qIEV4dGVuZGVkIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBTX0RPV05TSElGVF9FTkFCTEUgOAorI2RlZmluZSBWX0RPV05TSElGVF9FTkFCTEUgKDEgPDwgU19ET1dOU0hJRlRfRU5BQkxFKQorCisjZGVmaW5lIFNfRE9XTlNISUZUX0NOVCAgICA5CisjZGVmaW5lIE1fRE9XTlNISUZUX0NOVCAgICAweDcKKyNkZWZpbmUgVl9ET1dOU0hJRlRfQ05UKHgpICgoeCkgPDwgU19ET1dOU0hJRlRfQ05UKQorI2RlZmluZSBHX0RPV05TSElGVF9DTlQoeCkgKCgoeCkgPj4gU19ET1dOU0hJRlRfQ05UKSAmIE1fRE9XTlNISUZUX0NOVCkKKworLyogUEhZIHNwZWNpZmljIHN0YXR1cyByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgU19QU1NSX0pBQkJFUiAwCisjZGVmaW5lIFZfUFNTUl9KQUJCRVIgKDEgPDwgU19QU1NSX0pBQkJFUikKKworI2RlZmluZSBTX1BTU1JfUE9MQVJJVFkgMQorI2RlZmluZSBWX1BTU1JfUE9MQVJJVFkgKDEgPDwgU19QU1NSX1BPTEFSSVRZKQorCisjZGVmaW5lIFNfUFNTUl9SWF9QQVVTRSAyCisjZGVmaW5lIFZfUFNTUl9SWF9QQVVTRSAoMSA8PCBTX1BTU1JfUlhfUEFVU0UpCisKKyNkZWZpbmUgU19QU1NSX1RYX1BBVVNFIDMKKyNkZWZpbmUgVl9QU1NSX1RYX1BBVVNFICgxIDw8IFNfUFNTUl9UWF9QQVVTRSkKKworI2RlZmluZSBTX1BTU1JfRU5FUkdZX0RFVEVDVCA0CisjZGVmaW5lIFZfUFNTUl9FTkVSR1lfREVURUNUICgxIDw8IFNfUFNTUl9FTkVSR1lfREVURUNUKQorCisjZGVmaW5lIFNfUFNTUl9ET1dOU0hJRlRfU1RBVFVTIDUKKyNkZWZpbmUgVl9QU1NSX0RPV05TSElGVF9TVEFUVVMgKDEgPDwgU19QU1NSX0RPV05TSElGVF9TVEFUVVMpCisKKyNkZWZpbmUgU19QU1NSX01ESSA2CisjZGVmaW5lIFZfUFNTUl9NREkgKDEgPDwgU19QU1NSX01ESSkKKworI2RlZmluZSBTX1BTU1JfQ0FCTEVfTEVOICAgIDcKKyNkZWZpbmUgTV9QU1NSX0NBQkxFX0xFTiAgICAweDcKKyNkZWZpbmUgVl9QU1NSX0NBQkxFX0xFTih4KSAoKHgpIDw8IFNfUFNTUl9DQUJMRV9MRU4pCisjZGVmaW5lIEdfUFNTUl9DQUJMRV9MRU4oeCkgKCgoeCkgPj4gU19QU1NSX0NBQkxFX0xFTikgJiBNX1BTU1JfQ0FCTEVfTEVOKQorCisjZGVmaW5lIFNfUFNTUl9MSU5LIDEwCisjZGVmaW5lIFZfUFNTUl9MSU5LICgxIDw8IFNfUFNTUl9MSU5LKQorCisjZGVmaW5lIFNfUFNTUl9TVEFUVVNfUkVTT0xWRUQgMTEKKyNkZWZpbmUgVl9QU1NSX1NUQVRVU19SRVNPTFZFRCAoMSA8PCBTX1BTU1JfU1RBVFVTX1JFU09MVkVEKQorCisjZGVmaW5lIFNfUFNTUl9QQUdFX1JFQ0VJVkVEIDEyCisjZGVmaW5lIFZfUFNTUl9QQUdFX1JFQ0VJVkVEICgxIDw8IFNfUFNTUl9QQUdFX1JFQ0VJVkVEKQorCisjZGVmaW5lIFNfUFNTUl9EVVBMRVggMTMKKyNkZWZpbmUgVl9QU1NSX0RVUExFWCAoMSA8PCBTX1BTU1JfRFVQTEVYKQorCisjZGVmaW5lIFNfUFNTUl9TUEVFRCAgICAxNAorI2RlZmluZSBNX1BTU1JfU1BFRUQgICAgMHgzCisjZGVmaW5lIFZfUFNTUl9TUEVFRCh4KSAoKHgpIDw8IFNfUFNTUl9TUEVFRCkKKyNkZWZpbmUgR19QU1NSX1NQRUVEKHgpICgoKHgpID4+IFNfUFNTUl9TUEVFRCkgJiBNX1BTU1JfU1BFRUQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4eDIwMXguYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OHgyMDF4LmMKaW5kZXggZGI1MDM0MjguLmM4ZTg5NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OHgyMDF4LmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4eDIwMXguYwpAQCAtODUsMjkgKzg1LDMzIEBACiAKIHN0YXRpYyBpbnQgbXY4OHgyMDF4X2ludGVycnVwdF9lbmFibGUoc3RydWN0IGNwaHkgKmNwaHkpCiB7Ci0JdTMyIGVsbWVyOwotCiAJLyogRW5hYmxlIFBIWSBMQVNJIGludGVycnVwdHMuICovCiAJbWRpb193cml0ZShjcGh5LCAweDEsIDB4OTAwMiwgMHgxKTsKIAogCS8qIEVuYWJsZSBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCi0JdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKLQllbG1lciB8PSBFTE1FUjBfR1BfQklUNjsKLQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOworCWlmICh0MV9pc19hc2ljKGNwaHktPmFkYXB0ZXIpKSB7CisJCXUzMiBlbG1lcjsKKworCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCAmZWxtZXIpOworCQllbG1lciB8PSBFTE1FUjBfR1BfQklUNjsKKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OHgyMDF4X2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQogewotCXUzMiBlbG1lcjsKLQogCS8qIERpc2FibGUgUEhZIExBU0kgaW50ZXJydXB0cy4gKi8KIAltZGlvX3dyaXRlKGNwaHksIDB4MSwgMHg5MDAyLCAweDApOwogCiAJLyogRGlzYWJsZSBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCi0JdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKLQllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDY7Ci0JdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl1MzIgZWxtZXI7CisKKwkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKKwkJZWxtZXIgJj0gfkVMTUVSMF9HUF9CSVQ2OworCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQwLDkgKzE0NCwxMSBAQAogI2VuZGlmCiAKIAkvKiBDbGVhciBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCi0JdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCAmZWxtZXIpOwotCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQ2OwotCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsIGVsbWVyKTsKKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsICZlbG1lcik7CisJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQ2OworCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCBlbG1lcik7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0yMDUsMTEgKzIxMSwxMSBAQAogCQkJCQkgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKIHsKIAl1MzIgdmFsOwotCXN0cnVjdCBjcGh5ICpjcGh5ID0ga21hbGxvYyhzaXplb2YoKmNwaHkpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgY3BoeSAqY3BoeSA9IGt6YWxsb2Moc2l6ZW9mKCpjcGh5KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWNwaHkpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChjcGh5LCAwLCBzaXplb2YoKmNwaHkpKTsKKwogCWNwaHlfaW5pdChjcGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJm12ODh4MjAxeF9vcHMsIG1kaW9fb3BzKTsKIAogCS8qIENvbW1hbmRzIHRoZSBQSFkgdG8gZW5hYmxlIFhGUCdzIGNsb2NrLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9teTMxMjYuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXkzMTI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5MDAxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXkzMTI2LmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qICREYXRlOiAyMDA1LzExLzEyIDAyOjEzOjQ5ICQgJFJDU2ZpbGU6IG15MzEyNi5jLHYgJCAkUmV2aXNpb246IDEuMTUgJCAqLworI2luY2x1ZGUgImNwaHkuaCIKKyNpbmNsdWRlICJlbG1lcjAuaCIKKyNpbmNsdWRlICJzdW5pMXgxMGdleHBfcmVncy5oIgorCisvKiBQb3J0IFJlc2V0ICovCitzdGF0aWMgaW50IG15MzEyNl9yZXNldChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IHdhaXQpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBkb25lIHRocm91Z2ggcmVnaXN0ZXJzLiAgSXQgaXMgbm90IHJlcXVpcmVkIHNpbmNlCisJICogYSBmdWxsIGNoaXAgcmVzZXQgaXMgdXNlZC4KKwkgKi8KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IG15MzEyNl9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY3BoeS0+cGh5X3VwZGF0ZSwgSFovMzApOworCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJmNwaHktPmVsbWVyX2dwbyk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBteTMxMjZfaW50ZXJydXB0X2Rpc2FibGUoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmY3BoeS0+cGh5X3VwZGF0ZSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBteTMxMjZfaW50ZXJydXB0X2NsZWFyKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXJldHVybiAoMCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKFJFR19BRERSKSAgICAoUkVHX0FERFIgPDwgMikKKworc3RhdGljIGludCBteTMxMjZfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJdTMyIHZhbDsKKwl1MTYgdmFsMTY7CisJdTE2IHN0YXR1czsKKwl1MzIgYWN0X2NvdW50OworCWFkYXB0ZXJfdCAqYWRhcHRlcjsKKwlhZGFwdGVyID0gY3BoeS0+YWRhcHRlcjsKKworCWlmIChjcGh5LT5jb3VudCA9PSA1MCkgeworCQltZGlvX3JlYWQoY3BoeSwgMHgxLCAweDEsICZ2YWwpOworCQl2YWwxNiA9ICh1MTYpIHZhbDsKKwkJc3RhdHVzID0gY3BoeS0+Ym1zciBeIHZhbDE2OworCisJCWlmIChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpCisJCQl0MV9saW5rX2NoYW5nZWQoYWRhcHRlciwgMCk7CisJCWNwaHktPmJtc3IgPSB2YWwxNjsKKworCQkvKiBXZSBoYXZlIG9ubHkgZW5hYmxlZCBsaW5rIGNoYW5nZSBpbnRlcnJ1cHRzIHNvIGl0CisJCSAgIG11c3QgYmUgdGhhdAorCQkgKi8KKwkJY3BoeS0+Y291bnQgPSAwOworCX0KKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT05UUk9MKSwKKwkJU1VOSTF4MTBHRVhQX0JJVE1TS19NU1RBVF9TTkFQKTsKKwl0MV90cGlfcmVhZChhZGFwdGVyLAorCQlPRkZTRVQoU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzFfTE9XKSwgJmFjdF9jb3VudCk7CisJdDFfdHBpX3JlYWQoYWRhcHRlciwKKwkJT0ZGU0VUKFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zM19MT1cpLCAmdmFsKTsKKwlhY3RfY291bnQgKz0gdmFsOworCisJLyogUG9wdWxhdGUgZWxtZXJfZ3BvIHdpdGggdGhlIHJlZ2lzdGVyIHZhbHVlICovCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwljcGh5LT5lbG1lcl9ncG8gPSB2YWw7CisKKwlpZiAoICh2YWwgJiAoMSA8PCA4KSkgfHwgKHZhbCAmICgxIDw8IDE5KSkgfHwKKwkgICAgIChjcGh5LT5hY3RfY291bnQgPT0gYWN0X2NvdW50KSB8fCBjcGh5LT5hY3Rfb24gKSB7CisJCWlmIChpc19UMihhZGFwdGVyKSkKKwkJCXZhbCB8PSAoMSA8PCA5KTsKKwkJZWxzZSBpZiAodDFfaXNfVDFCKGFkYXB0ZXIpKQorCQkJdmFsIHw9ICgxIDw8IDIwKTsKKwkJY3BoeS0+YWN0X29uID0gMDsKKwl9IGVsc2UgeworCQlpZiAoaXNfVDIoYWRhcHRlcikpCisJCQl2YWwgJj0gfigxIDw8IDkpOworCQllbHNlIGlmICh0MV9pc19UMUIoYWRhcHRlcikpCisJCQl2YWwgJj0gfigxIDw8IDIwKTsKKwkJY3BoeS0+YWN0X29uID0gMTsKKwl9CisKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCisJY3BoeS0+ZWxtZXJfZ3BvID0gdmFsOworCWNwaHktPmFjdF9jb3VudCA9IGFjdF9jb3VudDsKKwljcGh5LT5jb3VudCsrOworCisJcmV0dXJuIGNwaHlfY2F1c2VfbGlua19jaGFuZ2U7Cit9CisKK3N0YXRpYyB2b2lkIG15MzIxNl9wb2xsKHZvaWQgKmFyZykKK3sKKwlteTMxMjZfaW50ZXJydXB0X2hhbmRsZXIoYXJnKTsKK30KKworc3RhdGljIGludCBteTMxMjZfc2V0X2xvb3BiYWNrKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgb24pCit7CisJcmV0dXJuICgwKTsKK30KKworLyogVG8gY2hlY2sgdGhlIGFjdGl2aXR5IExFRCAqLworc3RhdGljIGludCBteTMxMjZfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBjcGh5ICpjcGh5LAorCQkJaW50ICpsaW5rX29rLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCwgaW50ICpmYykKK3sKKwl1MzIgdmFsOworCXUxNiB2YWwxNjsKKwlhZGFwdGVyX3QgKmFkYXB0ZXI7CisKKwlhZGFwdGVyID0gY3BoeS0+YWRhcHRlcjsKKwltZGlvX3JlYWQoY3BoeSwgMHgxLCAweDEsICZ2YWwpOworCXZhbDE2ID0gKHUxNikgdmFsOworCisJLyogUG9wdWxhdGUgZWxtZXJfZ3BvIHdpdGggdGhlIHJlZ2lzdGVyIHZhbHVlICovCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwljcGh5LT5lbG1lcl9ncG8gPSB2YWw7CisKKwkqbGlua19vayA9ICh2YWwxNiAmIEJNU1JfTFNUQVRVUyk7CisKKwlpZiAoKmxpbmtfb2spIHsKKwkJLyogVHVybiBvbiB0aGUgTEVELiAqLworCQlpZiAoaXNfVDIoYWRhcHRlcikpCisJCQkgdmFsICY9IH4oMSA8PCA4KTsKKwkJZWxzZSBpZiAodDFfaXNfVDFCKGFkYXB0ZXIpKQorCQkJIHZhbCAmPSB+KDEgPDwgMTkpOworCX0gZWxzZSB7CisJCS8qIFR1cm4gb2ZmIHRoZSBMRUQuICovCisJCWlmIChpc19UMihhZGFwdGVyKSkKKwkJCSB2YWwgfD0gKDEgPDwgOCk7CisJCWVsc2UgaWYgKHQxX2lzX1QxQihhZGFwdGVyKSkKKwkJCSB2YWwgfD0gKDEgPDwgMTkpOworCX0KKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJY3BoeS0+ZWxtZXJfZ3BvID0gdmFsOworCSpzcGVlZCA9IFNQRUVEXzEwMDAwOworCSpkdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCS8qIG5lZWQgdG8gYWRkIGZsb3cgY29udHJvbCAqLworCWlmIChmYykKKwkJKmZjID0gUEFVU0VfUlggfCBQQVVTRV9UWDsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIG15MzEyNl9kZXN0cm95KHN0cnVjdCBjcGh5ICpjcGh5KQoreworCWtmcmVlKGNwaHkpOworfQorCitzdGF0aWMgc3RydWN0IGNwaHlfb3BzIG15MzEyNl9vcHMgPSB7CisJLmRlc3Ryb3kJCT0gbXkzMTI2X2Rlc3Ryb3ksCisJLnJlc2V0CQkJPSBteTMxMjZfcmVzZXQsCisJLmludGVycnVwdF9lbmFibGUJPSBteTMxMjZfaW50ZXJydXB0X2VuYWJsZSwKKwkuaW50ZXJydXB0X2Rpc2FibGUJPSBteTMxMjZfaW50ZXJydXB0X2Rpc2FibGUsCisJLmludGVycnVwdF9jbGVhcgk9IG15MzEyNl9pbnRlcnJ1cHRfY2xlYXIsCisJLmludGVycnVwdF9oYW5kbGVyCT0gbXkzMTI2X2ludGVycnVwdF9oYW5kbGVyLAorCS5nZXRfbGlua19zdGF0dXMJPSBteTMxMjZfZ2V0X2xpbmtfc3RhdHVzLAorCS5zZXRfbG9vcGJhY2sJCT0gbXkzMTI2X3NldF9sb29wYmFjaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeSAqbXkzMTI2X3BoeV9jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLAorCQkJaW50IHBoeV9hZGRyLCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoreworCXN0cnVjdCBjcGh5ICpjcGh5ID0ga3phbGxvYyhzaXplb2YgKCpjcGh5KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY3BoeSkKKwkJY3BoeV9pbml0KGNwaHksIGFkYXB0ZXIsIHBoeV9hZGRyLCAmbXkzMTI2X29wcywgbWRpb19vcHMpOworCisJSU5JVF9XT1JLKCZjcGh5LT5waHlfdXBkYXRlLCBteTMyMTZfcG9sbCwgY3BoeSk7CisJY3BoeS0+Ym1zciA9IDA7CisKKwlyZXR1cm4gKGNwaHkpOworfQorCisvKiBDaGlwIFJlc2V0ICovCitzdGF0aWMgaW50IG15MzEyNl9waHlfcmVzZXQoYWRhcHRlcl90ICogYWRhcHRlcikKK3sKKwl1MzIgdmFsOworCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgJj0gfjQ7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwltc2xlZXAoMTAwKTsKKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCB8IDQpOworCW1zbGVlcCgxMDAwKTsKKworCS8qIE5vdyBsZXRzIGVuYWJsZSB0aGUgTGFzZXIuIERlbGF5IDEwMHVzICovCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgfD0gMHg4MDAwOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDEwMCk7CisJcmV0dXJuICgwKTsKK30KKworc3RydWN0IGdwaHkgdDFfbXkzMTI2X29wcyA9IHsKKwlteTMxMjZfcGh5X2NyZWF0ZSwKKwlteTMxMjZfcGh5X3Jlc2V0Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vcG0zMzkzLmMKaW5kZXggMDRhMTQwNC4uNjNjYWJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3BtMzM5My5jCkBAIC00MywyMSArNDMsNyBAQAogI2luY2x1ZGUgImVsbWVyMC5oIgogI2luY2x1ZGUgInN1bmkxeDEwZ2V4cF9yZWdzLmgiCiAKLS8qIDgwMi4zYWUgMTBHYi9zIE1ESU8gTWFuYWdlYWJsZSBEZXZpY2UoTU1EKQotICovCi1lbnVtIHsKLSAgICBNTURfUkVTRVJWRUQsCi0gICAgTU1EX1BNQVBNRCwKLSAgICBNTURfV0lTLAotICAgIE1NRF9QQ1MsCi0gICAgTU1EX1BIWV9YR1hTLAkvKiBYR01JSSBFeHRlbmRlciBTdWJsYXllciAqLwotICAgIE1NRF9EVEVfWEdYUywKLX07Ci0KLWVudW0gewotICAgIFBIWV9YR1hTX0NUUkxfMSwKLSAgICBQSFlfWEdYU19TVEFUVVNfMQotfTsKKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogCiAjZGVmaW5lIE9GRlNFVChSRUdfQUREUikgICAgKFJFR19BRERSIDw8IDIpCiAKQEAgLTg4LDYgKzc0LDggQEAKIAlSeEphYmJlcnMgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTZfTE9XLAogCVJ4RnJhZ21lbnRzID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzE3X0xPVywKIAlSeFVuZGVyc2l6ZWRGcmFtZXMgPSAgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzE4X0xPVywKKwlSeEp1bWJvRnJhbWVzUmVjZWl2ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNV9MT1csCisJUnhKdW1ib09jdGV0c1JlY2VpdmVkT0sgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMjZfTE9XLAogCiAJVHhPY3RldHNUcmFuc21pdHRlZE9LID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzMzX0xPVywKIAlUeEZyYW1lc0xvc3REdWVUb0ludGVybmFsTUFDVHJhbnNtaXNzaW9uRXJyb3IgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzVfTE9XLApAQCAtOTUsNyArODMsOSBAQAogCVR4VW5pY2FzdEZyYW1lc1RyYW5zbWl0dGVkT0sgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzhfTE9XLAogCVR4TXVsdGljYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MF9MT1csCiAJVHhCcm9hZGNhc3RGcmFtZXNUcmFuc21pdHRlZE9LID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzQyX0xPVywKLQlUeFBBVVNFTUFDQ3RybEZyYW1lc1RyYW5zbWl0dGVkID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzQzX0xPVworCVR4UEFVU0VNQUNDdHJsRnJhbWVzVHJhbnNtaXR0ZWQgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNDNfTE9XLAorCVR4SnVtYm9GcmFtZXNSZWNlaXZlZE9LID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzUxX0xPVywKKwlUeEp1bWJvT2N0ZXRzUmVjZWl2ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81Ml9MT1cKIH07CiAKIHN0cnVjdCBfY21hY19pbnN0YW5jZSB7CkBAIC0xMjQsMTIgKzExNCwxMiBAQAogCiAvKgogICogRW5hYmxlIGludGVycnVwdHMgZm9yIHRoZSBQTTMzOTMKLQotCTEuIEVuYWJsZSBQTTMzOTMgQkxPQ0sgaW50ZXJydXB0cy4KLQkyLiBFbmFibGUgUE0zMzkzIE1hc3RlciBJbnRlcnJ1cHQgYml0KElOVEUpCi0JMy4gRW5hYmxlIEVMTUVSJ3MgUE0zMzkzIGJpdC4KLQk0LiBFbmFibGUgVGVybWluYXRvciBleHRlcm5hbCBpbnRlcnJ1cHQuCi0qLworICoKKyAqCTEuIEVuYWJsZSBQTTMzOTMgQkxPQ0sgaW50ZXJydXB0cy4KKyAqCTIuIEVuYWJsZSBQTTMzOTMgTWFzdGVyIEludGVycnVwdCBiaXQoSU5URSkKKyAqCTMuIEVuYWJsZSBFTE1FUidzIFBNMzM5MyBiaXQuCisgKgk0LiBFbmFibGUgVGVybWluYXRvciBleHRlcm5hbCBpbnRlcnJ1cHQuCisgKi8KIHN0YXRpYyBpbnQgcG0zMzkzX2ludGVycnVwdF9lbmFibGUoc3RydWN0IGNtYWMgKmNtYWMpCiB7CiAJdTMyIHBsX2ludHI7CkBAIC0yNTcsMTQgKzI0NywxMiBAQAogc3RhdGljIGludCBwbTMzOTNfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IGNtYWMgKmNtYWMpCiB7CiAJdTMyIG1hc3Rlcl9pbnRyX3N0YXR1czsKLS8qCi0JMS4gUmVhZCBtYXN0ZXIgaW50ZXJydXB0IHJlZ2lzdGVyLgotCTIuIFJlYWQgQkxPQ0sncyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4KLQkzLiBIYW5kbGUgQkxPQ0sgaW50ZXJydXB0cy4KLSovCisKIAkvKiBSZWFkIHRoZSBtYXN0ZXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4gKi8KIAlwbXJlYWQoY21hYywgU1VOSTF4MTBHRVhQX1JFR19NQVNURVJfSU5URVJSVVBUX1NUQVRVUywKIAkgICAgICAgJm1hc3Rlcl9pbnRyX3N0YXR1cyk7CisJQ0hfREJHKGNtYWMtPmFkYXB0ZXIsIElOVFIsICJQTTMzOTMgaW50ciBjYXVzZSAweCV4XG4iLAorCSAgICAgICBtYXN0ZXJfaW50cl9zdGF0dXMpOwogCiAJLyogVEJEIFhYWCBMZXRzIGp1c3QgY2xlYXIgZXZlcnl0aGluZyBmb3Igbm93ICovCiAJcG0zMzkzX2ludGVycnVwdF9jbGVhcihjbWFjKTsKQEAgLTMwNywxMSArMjk1LDcgQEAKIAkgKiBUaGUgUEhZIGRvZXNuJ3QgZ2l2ZSB1cyBsaW5rIHN0YXR1cyBpbmRpY2F0aW9uIG9uIGl0cyBvd24gc28gaGF2ZQogCSAqIHRoZSBsaW5rIG1hbmFnZW1lbnQgY29kZSBxdWVyeSBpdCBpbnN0ZWFkLgogCSAqLwotCXsKLQkJZXh0ZXJuIHZvaWQgbGlua19jaGFuZ2VkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBvcnRfaWQpOwotCi0JCWxpbmtfY2hhbmdlZChjbWFjLT5hZGFwdGVyLCAwKTsKLQl9CisJdDFfbGlua19jaGFuZ2VkKGNtYWMtPmFkYXB0ZXIsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0zNjMsMzMgKzM0Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgY2FsY19jcmModTggKmIsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0JdTMyIGNyYyA9ICh1MzIpfjA7Ci0KLQkvKiBjYWxjdWxhdGUgY3JjIG9uZSBiaXQgYXQgYSB0aW1lICovCi0Jd2hpbGUgKGxlbi0tKSB7Ci0JCWNyYyBePSAqYisrOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZiAoY3JjICYgMHgxKQotCQkJCWNyYyA9IChjcmMgPj4gMSkgXiAweGVkYjg4MzIwOwotCQkJZWxzZQotCQkJCWNyYyA9IChjcmMgPj4gMSk7Ci0JCX0KLQl9Ci0KLQkvKiByZXZlcnNlIGJpdHMgKi8KLQljcmMgPSAoKGNyYyA+PiA0KSAmIDB4MGYwZjBmMGYpIHwgKChjcmMgPDwgNCkgJiAweGYwZjBmMGYwKTsKLQljcmMgPSAoKGNyYyA+PiAyKSAmIDB4MzMzMzMzMzMpIHwgKChjcmMgPDwgMikgJiAweGNjY2NjY2NjKTsKLQljcmMgPSAoKGNyYyA+PiAxKSAmIDB4NTU1NTU1NTUpIHwgKChjcmMgPDwgMSkgJiAweGFhYWFhYWFhKTsKLQkvKiBzd2FwIGJ5dGVzICovCi0JY3JjID0gKGNyYyA+PiAxNikgfCAoY3JjIDw8IDE2KTsKLQljcmMgPSAoY3JjID4+IDggJiAweDAwZmYwMGZmKSB8IChjcmMgPDwgOCAmIDB4ZmYwMGZmMDApOwotCi0JcmV0dXJuIGNyYzsKLX0KLQogc3RhdGljIGludCBwbTMzOTNfc2V0X3J4X21vZGUoc3RydWN0IGNtYWMgKmNtYWMsIHN0cnVjdCB0MV9yeF9tb2RlICpybSkKIHsKIAlpbnQgZW5hYmxlZCA9IGNtYWMtPmluc3RhbmNlLT5lbmFibGVkICYgTUFDX0RJUkVDVElPTl9SWDsKQEAgLTQyMyw3ICszODAsNyBAQAogCQl1MTYgbWNfZmlsdGVyWzRdID0geyAwLCB9OwogCiAJCXdoaWxlICgoYWRkciA9IHQxX2dldF9uZXh0X21jYWRkcihybSkpKSB7Ci0JCQliaXQgPSAoY2FsY19jcmMoYWRkciwgRVRIX0FMRU4pID4+IDIzKSAmIDB4M2Y7CS8qIGJpdFsyMzoyOF0gKi8KKwkJCWJpdCA9IChldGhlcl9jcmMoRVRIX0FMRU4sIGFkZHIpID4+IDIzKSAmIDB4M2Y7CS8qIGJpdFsyMzoyOF0gKi8KIAkJCW1jX2ZpbHRlcltiaXQgPj4gNF0gfD0gMSA8PCAoYml0ICYgMHhmKTsKIAkJfQogCQlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19NVUxUSUNBU1RfSEFTSF9MT1csIG1jX2ZpbHRlclswXSk7CkBAIC00NzEsMjAgKzQyOCwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBwbTMzOTNfcm1vbl91cGRhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvZmZzLCB1NjQgKnZhbCwKKwkJCSAgICAgICBpbnQgb3ZlcikKK3sKKwl1MzIgdmFsMCwgdmFsMSwgdmFsMjsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIG9mZnMsICZ2YWwwKTsKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBvZmZzICsgNCwgJnZhbDEpOworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIG9mZnMgKyA4LCAmdmFsMik7CisKKwkqdmFsICY9IH4wdWxsIDw8IDQwOworCSp2YWwgfD0gdmFsMCAmIDB4ZmZmZjsKKwkqdmFsIHw9ICh2YWwxICYgMHhmZmZmKSA8PCAxNjsKKwkqdmFsIHw9ICh1NjQpKHZhbDIgJiAweGZmKSA8PCAzMjsKKworCWlmIChvdmVyKQorCQkqdmFsICs9IDF1bGwgPDwgNDA7Cit9CisKICNkZWZpbmUgUk1PTl9VUERBVEUobWFjLCBuYW1lLCBzdGF0X25hbWUpIFwKLQl7IFwKLQkJdDFfdHBpX3JlYWQoKG1hYyktPmFkYXB0ZXIsIE9GRlNFVChuYW1lKSwgJnZhbDApOwlcCi0JCXQxX3RwaV9yZWFkKChtYWMpLT5hZGFwdGVyLCBPRkZTRVQoKChuYW1lKSsxKSksICZ2YWwxKTsgXAotCQl0MV90cGlfcmVhZCgobWFjKS0+YWRhcHRlciwgT0ZGU0VUKCgobmFtZSkrMikpLCAmdmFsMik7IFwKLQkJKG1hYyktPnN0YXRzLnN0YXRfbmFtZSA9ICgodTY0KXZhbDAgJiAweGZmZmYpIHwgXAotCQkJCQkJKCgodTY0KXZhbDEgJiAweGZmZmYpIDw8IDE2KSB8IFwKLQkJCQkJCSgoKHU2NCl2YWwyICYgMHhmZikgPDwgMzIpIHwgXAotCQkJCQkJKChtYWMpLT5zdGF0cy5zdGF0X25hbWUgJiBcCi0JCQkJCQkJKH4odTY0KTAgPDwgNDApKTsgXAotCQlpZiAocm8gJglcCi0JCQkoKG5hbWUgLSAgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzBfTE9XKSA+PiAyKSkgXAotCQkJKG1hYyktPnN0YXRzLnN0YXRfbmFtZSArPSAoKHU2NCkxIDw8IDQwKTsgXAotCX0KKwlwbTMzOTNfcm1vbl91cGRhdGUoKG1hYyktPmFkYXB0ZXIsIE9GRlNFVChuYW1lKSwgCQlcCisJCQkgICAmKG1hYyktPnN0YXRzLnN0YXRfbmFtZSwJCQlcCisJCSAgIChybyAmKChuYW1lIC0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzBfTE9XKSA+PiAyKSkpCisKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKnBtMzM5M191cGRhdGVfc3RhdGlzdGljcyhzdHJ1Y3QgY21hYyAqbWFjLAogCQkJCQkJCSAgICAgIGludCBmbGFnKQpAQCAtNTE5LDYgKzQ4NSw4IEBACiAJUk1PTl9VUERBVEUobWFjLCBSeEphYmJlcnMsIFJ4SmFiYmVyRXJyb3JzKTsKIAlSTU9OX1VQREFURShtYWMsIFJ4RnJhZ21lbnRzLCBSeFJ1bnRFcnJvcnMpOwogCVJNT05fVVBEQVRFKG1hYywgUnhVbmRlcnNpemVkRnJhbWVzLCBSeFJ1bnRFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhKdW1ib0ZyYW1lc1JlY2VpdmVkT0ssIFJ4SnVtYm9GcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBSeEp1bWJvT2N0ZXRzUmVjZWl2ZWRPSywgUnhKdW1ib09jdGV0c09LKTsKIAogCS8qIFR4IHN0YXRzICovCiAJUk1PTl9VUERBVEUobWFjLCBUeE9jdGV0c1RyYW5zbWl0dGVkT0ssIFR4T2N0ZXRzT0spOwpAQCAtNTI5LDYgKzQ5Nyw4IEBACiAJUk1PTl9VUERBVEUobWFjLCBUeE11bHRpY2FzdEZyYW1lc1RyYW5zbWl0dGVkT0ssIFR4TXVsdGljYXN0RnJhbWVzT0spOwogCVJNT05fVVBEQVRFKG1hYywgVHhCcm9hZGNhc3RGcmFtZXNUcmFuc21pdHRlZE9LLCBUeEJyb2FkY2FzdEZyYW1lc09LKTsKIAlSTU9OX1VQREFURShtYWMsIFR4UEFVU0VNQUNDdHJsRnJhbWVzVHJhbnNtaXR0ZWQsIFR4UGF1c2VGcmFtZXMpOworCVJNT05fVVBEQVRFKG1hYywgVHhKdW1ib0ZyYW1lc1JlY2VpdmVkT0ssIFR4SnVtYm9GcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBUeEp1bWJvT2N0ZXRzUmVjZWl2ZWRPSywgVHhKdW1ib09jdGV0c09LKTsKIAogCXJldHVybiAmbWFjLT5zdGF0czsKIH0KQEAgLTYzMSwxMCArNjAxLDkgQEAKIHsKIAlzdHJ1Y3QgY21hYyAqY21hYzsKIAotCWNtYWMgPSBrbWFsbG9jKHNpemVvZigqY21hYykgKyBzaXplb2YoY21hY19pbnN0YW5jZSksIEdGUF9LRVJORUwpOworCWNtYWMgPSBremFsbG9jKHNpemVvZigqY21hYykgKyBzaXplb2YoY21hY19pbnN0YW5jZSksIEdGUF9LRVJORUwpOwogCWlmICghY21hYykKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KGNtYWMsIDAsIHNpemVvZigqY21hYykpOwogCiAJY21hYy0+b3BzID0gJnBtMzM5M19vcHM7CiAJY21hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKSAoY21hYyArIDEpOwpAQCAtODE1LDYgKzc4NCwxMiBAQAogCiAJCXN1Y2Nlc3NmdWxfcmVzZXQgPSAoaXNfcGw0X3Jlc2V0X2ZpbmlzaGVkICYmICFpc19wbDRfb3V0b2ZfbG9jawogCQkJCSAgICAmJiBpc194YXVpX21hYmNfcGxsX2xvY2tlZCk7CisKKwkJQ0hfREJHKGFkYXB0ZXIsIEhXLAorCQkgICAgICAgIlBNMzM5MyBIVyByZXNldCAlZDogcGw0X3Jlc2V0IDB4JXgsIHZhbCAweCV4LCAiCisJCSAgICAgICAiaXNfcGw0X291dG9mX2xvY2sgMHgleCwgeGF1aV9sb2NrZWQgMHgleFxuIiwKKwkJICAgICAgIGksIGlzX3BsNF9yZXNldF9maW5pc2hlZCwgdmFsLCBpc19wbDRfb3V0b2ZfbG9jaywKKwkJICAgICAgIGlzX3hhdWlfbWFiY19wbGxfbG9ja2VkKTsKIAl9CiAJcmV0dXJuIHN1Y2Nlc3NmdWxfcmVzZXQgPyAwIDogMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vcmVncy5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9yZWdzLmgKaW5kZXggYjkwZTExZi4uYzgwYmY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9yZWdzLmgKQEAgLTcxLDYgKzcxLDEwIEBACiAjZGVmaW5lIFZfQ01EUV9QUklPUklUWSh4KSAoKHgpIDw8IFNfQ01EUV9QUklPUklUWSkKICNkZWZpbmUgR19DTURRX1BSSU9SSVRZKHgpICgoKHgpID4+IFNfQ01EUV9QUklPUklUWSkgJiBNX0NNRFFfUFJJT1JJVFkpCiAKKyNkZWZpbmUgU19ESVNBQkxFX0NNRFEwX0dUUyAgICA4CisjZGVmaW5lIFZfRElTQUJMRV9DTURRMF9HVFMoeCkgKCh4KSA8PCBTX0RJU0FCTEVfQ01EUTBfR1RTKQorI2RlZmluZSBGX0RJU0FCTEVfQ01EUTBfR1RTICAgIFZfRElTQUJMRV9DTURRMF9HVFMoMVUpCisKICNkZWZpbmUgU19ESVNBQkxFX0NNRFExX0dUUyAgICA5CiAjZGVmaW5lIFZfRElTQUJMRV9DTURRMV9HVFMoeCkgKCh4KSA8PCBTX0RJU0FCTEVfQ01EUTFfR1RTKQogI2RlZmluZSBGX0RJU0FCTEVfQ01EUTFfR1RTICAgIFZfRElTQUJMRV9DTURRMV9HVFMoMVUpCkBAIC04NywxMiArOTEsMTggQEAKICNkZWZpbmUgVl9FTkFCTEVfQklHX0VORElBTih4KSAoKHgpIDw8IFNfRU5BQkxFX0JJR19FTkRJQU4pCiAjZGVmaW5lIEZfRU5BQkxFX0JJR19FTkRJQU4gICAgVl9FTkFCTEVfQklHX0VORElBTigxVSkKIAorI2RlZmluZSBTX0ZMX1NFTEVDVElPTl9DUklURVJJQSAgICAxMworI2RlZmluZSBWX0ZMX1NFTEVDVElPTl9DUklURVJJQSh4KSAoKHgpIDw8IFNfRkxfU0VMRUNUSU9OX0NSSVRFUklBKQorI2RlZmluZSBGX0ZMX1NFTEVDVElPTl9DUklURVJJQSAgICBWX0ZMX1NFTEVDVElPTl9DUklURVJJQSgxVSkKKwogI2RlZmluZSBTX0lTQ1NJX0NPQUxFU0NFICAgIDE0CiAjZGVmaW5lIFZfSVNDU0lfQ09BTEVTQ0UoeCkgKCh4KSA8PCBTX0lTQ1NJX0NPQUxFU0NFKQogI2RlZmluZSBGX0lTQ1NJX0NPQUxFU0NFICAgIFZfSVNDU0lfQ09BTEVTQ0UoMVUpCiAKICNkZWZpbmUgU19SWF9QS1RfT0ZGU0VUICAgIDE1CisjZGVmaW5lIE1fUlhfUEtUX09GRlNFVCAgICAweDcKICNkZWZpbmUgVl9SWF9QS1RfT0ZGU0VUKHgpICgoeCkgPDwgU19SWF9QS1RfT0ZGU0VUKQorI2RlZmluZSBHX1JYX1BLVF9PRkZTRVQoeCkgKCgoeCkgPj4gU19SWF9QS1RfT0ZGU0VUKSAmIE1fUlhfUEtUX09GRlNFVCkKIAogI2RlZmluZSBTX1ZMQU5fWFRSQUNUICAgIDE4CiAjZGVmaW5lIFZfVkxBTl9YVFJBQ1QoeCkgKCh4KSA8PCBTX1ZMQU5fWFRSQUNUKQpAQCAtMTA4LDE2ICsxMTgsMTE0IEBACiAjZGVmaW5lIEFfU0dfRkwxQkFTRUxXUiAweDIwCiAjZGVmaW5lIEFfU0dfRkwxQkFTRVVQUiAweDI0CiAjZGVmaW5lIEFfU0dfQ01EMFNJWkUgMHgyOAorCisjZGVmaW5lIFNfQ01EUTBfU0laRSAgICAwCisjZGVmaW5lIE1fQ01EUTBfU0laRSAgICAweDFmZmZmCisjZGVmaW5lIFZfQ01EUTBfU0laRSh4KSAoKHgpIDw8IFNfQ01EUTBfU0laRSkKKyNkZWZpbmUgR19DTURRMF9TSVpFKHgpICgoKHgpID4+IFNfQ01EUTBfU0laRSkgJiBNX0NNRFEwX1NJWkUpCisKICNkZWZpbmUgQV9TR19GTDBTSVpFIDB4MmMKKworI2RlZmluZSBTX0ZMMF9TSVpFICAgIDAKKyNkZWZpbmUgTV9GTDBfU0laRSAgICAweDFmZmZmCisjZGVmaW5lIFZfRkwwX1NJWkUoeCkgKCh4KSA8PCBTX0ZMMF9TSVpFKQorI2RlZmluZSBHX0ZMMF9TSVpFKHgpICgoKHgpID4+IFNfRkwwX1NJWkUpICYgTV9GTDBfU0laRSkKKwogI2RlZmluZSBBX1NHX1JTUFNJWkUgMHgzMAorCisjZGVmaW5lIFNfUkVTUFFfU0laRSAgICAwCisjZGVmaW5lIE1fUkVTUFFfU0laRSAgICAweDFmZmZmCisjZGVmaW5lIFZfUkVTUFFfU0laRSh4KSAoKHgpIDw8IFNfUkVTUFFfU0laRSkKKyNkZWZpbmUgR19SRVNQUV9TSVpFKHgpICgoKHgpID4+IFNfUkVTUFFfU0laRSkgJiBNX1JFU1BRX1NJWkUpCisKICNkZWZpbmUgQV9TR19SU1BCQVNFTFdSIDB4MzQKICNkZWZpbmUgQV9TR19SU1BCQVNFVVBSIDB4MzgKICNkZWZpbmUgQV9TR19GTFRIUkVTSE9MRCAweDNjCisKKyNkZWZpbmUgU19GTF9USFJFU0hPTEQgICAgMAorI2RlZmluZSBNX0ZMX1RIUkVTSE9MRCAgICAweGZmZmYKKyNkZWZpbmUgVl9GTF9USFJFU0hPTEQoeCkgKCh4KSA8PCBTX0ZMX1RIUkVTSE9MRCkKKyNkZWZpbmUgR19GTF9USFJFU0hPTEQoeCkgKCgoeCkgPj4gU19GTF9USFJFU0hPTEQpICYgTV9GTF9USFJFU0hPTEQpCisKICNkZWZpbmUgQV9TR19SU1BRVUVVRUNSRURJVCAweDQwCisKKyNkZWZpbmUgU19SRVNQUV9DUkVESVQgICAgMAorI2RlZmluZSBNX1JFU1BRX0NSRURJVCAgICAweDFmZmZmCisjZGVmaW5lIFZfUkVTUFFfQ1JFRElUKHgpICgoeCkgPDwgU19SRVNQUV9DUkVESVQpCisjZGVmaW5lIEdfUkVTUFFfQ1JFRElUKHgpICgoKHgpID4+IFNfUkVTUFFfQ1JFRElUKSAmIE1fUkVTUFFfQ1JFRElUKQorCiAjZGVmaW5lIEFfU0dfU0xFRVBJTkcgMHg0OAorCisjZGVmaW5lIFNfU0xFRVBJTkcgICAgMAorI2RlZmluZSBNX1NMRUVQSU5HICAgIDB4ZmZmZgorI2RlZmluZSBWX1NMRUVQSU5HKHgpICgoeCkgPDwgU19TTEVFUElORykKKyNkZWZpbmUgR19TTEVFUElORyh4KSAoKCh4KSA+PiBTX1NMRUVQSU5HKSAmIE1fU0xFRVBJTkcpCisKICNkZWZpbmUgQV9TR19JTlRSVElNRVIgMHg0YworCisjZGVmaW5lIFNfSU5URVJSVVBUX1RJTUVSX0NPVU5UICAgIDAKKyNkZWZpbmUgTV9JTlRFUlJVUFRfVElNRVJfQ09VTlQgICAgMHhmZmZmZmYKKyNkZWZpbmUgVl9JTlRFUlJVUFRfVElNRVJfQ09VTlQoeCkgKCh4KSA8PCBTX0lOVEVSUlVQVF9USU1FUl9DT1VOVCkKKyNkZWZpbmUgR19JTlRFUlJVUFRfVElNRVJfQ09VTlQoeCkgKCgoeCkgPj4gU19JTlRFUlJVUFRfVElNRVJfQ09VTlQpICYgTV9JTlRFUlJVUFRfVElNRVJfQ09VTlQpCisKKyNkZWZpbmUgQV9TR19DTUQwUFRSIDB4NTAKKworI2RlZmluZSBTX0NNRFEwX1BPSU5URVIgICAgMAorI2RlZmluZSBNX0NNRFEwX1BPSU5URVIgICAgMHhmZmZmCisjZGVmaW5lIFZfQ01EUTBfUE9JTlRFUih4KSAoKHgpIDw8IFNfQ01EUTBfUE9JTlRFUikKKyNkZWZpbmUgR19DTURRMF9QT0lOVEVSKHgpICgoKHgpID4+IFNfQ01EUTBfUE9JTlRFUikgJiBNX0NNRFEwX1BPSU5URVIpCisKKyNkZWZpbmUgU19DVVJSRU5UX0dFTkVSQVRJT05fQklUICAgIDE2CisjZGVmaW5lIFZfQ1VSUkVOVF9HRU5FUkFUSU9OX0JJVCh4KSAoKHgpIDw8IFNfQ1VSUkVOVF9HRU5FUkFUSU9OX0JJVCkKKyNkZWZpbmUgRl9DVVJSRU5UX0dFTkVSQVRJT05fQklUICAgIFZfQ1VSUkVOVF9HRU5FUkFUSU9OX0JJVCgxVSkKKworI2RlZmluZSBBX1NHX0NNRDFQVFIgMHg1NAorCisjZGVmaW5lIFNfQ01EUTFfUE9JTlRFUiAgICAwCisjZGVmaW5lIE1fQ01EUTFfUE9JTlRFUiAgICAweGZmZmYKKyNkZWZpbmUgVl9DTURRMV9QT0lOVEVSKHgpICgoeCkgPDwgU19DTURRMV9QT0lOVEVSKQorI2RlZmluZSBHX0NNRFExX1BPSU5URVIoeCkgKCgoeCkgPj4gU19DTURRMV9QT0lOVEVSKSAmIE1fQ01EUTFfUE9JTlRFUikKKworI2RlZmluZSBBX1NHX0ZMMFBUUiAweDU4CisKKyNkZWZpbmUgU19GTDBfUE9JTlRFUiAgICAwCisjZGVmaW5lIE1fRkwwX1BPSU5URVIgICAgMHhmZmZmCisjZGVmaW5lIFZfRkwwX1BPSU5URVIoeCkgKCh4KSA8PCBTX0ZMMF9QT0lOVEVSKQorI2RlZmluZSBHX0ZMMF9QT0lOVEVSKHgpICgoKHgpID4+IFNfRkwwX1BPSU5URVIpICYgTV9GTDBfUE9JTlRFUikKKworI2RlZmluZSBBX1NHX0ZMMVBUUiAweDVjCisKKyNkZWZpbmUgU19GTDFfUE9JTlRFUiAgICAwCisjZGVmaW5lIE1fRkwxX1BPSU5URVIgICAgMHhmZmZmCisjZGVmaW5lIFZfRkwxX1BPSU5URVIoeCkgKCh4KSA8PCBTX0ZMMV9QT0lOVEVSKQorI2RlZmluZSBHX0ZMMV9QT0lOVEVSKHgpICgoKHgpID4+IFNfRkwxX1BPSU5URVIpICYgTV9GTDFfUE9JTlRFUikKKworI2RlZmluZSBBX1NHX1ZFUlNJT04gMHg2YworCisjZGVmaW5lIFNfREFZICAgIDAKKyNkZWZpbmUgTV9EQVkgICAgMHgxZgorI2RlZmluZSBWX0RBWSh4KSAoKHgpIDw8IFNfREFZKQorI2RlZmluZSBHX0RBWSh4KSAoKCh4KSA+PiBTX0RBWSkgJiBNX0RBWSkKKworI2RlZmluZSBTX01PTlRIICAgIDUKKyNkZWZpbmUgTV9NT05USCAgICAweGYKKyNkZWZpbmUgVl9NT05USCh4KSAoKHgpIDw8IFNfTU9OVEgpCisjZGVmaW5lIEdfTU9OVEgoeCkgKCgoeCkgPj4gU19NT05USCkgJiBNX01PTlRIKQorCiAjZGVmaW5lIEFfU0dfQ01EMVNJWkUgMHhiMAorCisjZGVmaW5lIFNfQ01EUTFfU0laRSAgICAwCisjZGVmaW5lIE1fQ01EUTFfU0laRSAgICAweDFmZmZmCisjZGVmaW5lIFZfQ01EUTFfU0laRSh4KSAoKHgpIDw8IFNfQ01EUTFfU0laRSkKKyNkZWZpbmUgR19DTURRMV9TSVpFKHgpICgoKHgpID4+IFNfQ01EUTFfU0laRSkgJiBNX0NNRFExX1NJWkUpCisKICNkZWZpbmUgQV9TR19GTDFTSVpFIDB4YjQKKworI2RlZmluZSBTX0ZMMV9TSVpFICAgIDAKKyNkZWZpbmUgTV9GTDFfU0laRSAgICAweDFmZmZmCisjZGVmaW5lIFZfRkwxX1NJWkUoeCkgKCh4KSA8PCBTX0ZMMV9TSVpFKQorI2RlZmluZSBHX0ZMMV9TSVpFKHgpICgoKHgpID4+IFNfRkwxX1NJWkUpICYgTV9GTDFfU0laRSkKKwogI2RlZmluZSBBX1NHX0lOVF9FTkFCTEUgMHhiOAogCiAjZGVmaW5lIFNfUkVTUFFfRVhIQVVTVEVEICAgIDAKQEAgLTE0NCwyMSArMjUyLDM2OSBAQAogI2RlZmluZSBBX1NHX1JFU1BBQ0NVVElNRVIgMHhjMAogCiAvKiBNQzMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFfTUMzX0NGRyAweDEwMAorCisjZGVmaW5lIFNfQ0xLX0VOQUJMRSAgICAwCisjZGVmaW5lIFZfQ0xLX0VOQUJMRSh4KSAoKHgpIDw8IFNfQ0xLX0VOQUJMRSkKKyNkZWZpbmUgRl9DTEtfRU5BQkxFICAgIFZfQ0xLX0VOQUJMRSgxVSkKIAogI2RlZmluZSBTX1JFQURZICAgIDEKICNkZWZpbmUgVl9SRUFEWSh4KSAoKHgpIDw8IFNfUkVBRFkpCiAjZGVmaW5lIEZfUkVBRFkgICAgVl9SRUFEWSgxVSkKIAotLyogTUM0IHJlZ2lzdGVycyAqLworI2RlZmluZSBTX1JFQURfVE9fV1JJVEVfREVMQVkgICAgMgorI2RlZmluZSBNX1JFQURfVE9fV1JJVEVfREVMQVkgICAgMHg3CisjZGVmaW5lIFZfUkVBRF9UT19XUklURV9ERUxBWSh4KSAoKHgpIDw8IFNfUkVBRF9UT19XUklURV9ERUxBWSkKKyNkZWZpbmUgR19SRUFEX1RPX1dSSVRFX0RFTEFZKHgpICgoKHgpID4+IFNfUkVBRF9UT19XUklURV9ERUxBWSkgJiBNX1JFQURfVE9fV1JJVEVfREVMQVkpCiAKKyNkZWZpbmUgU19XUklURV9UT19SRUFEX0RFTEFZICAgIDUKKyNkZWZpbmUgTV9XUklURV9UT19SRUFEX0RFTEFZICAgIDB4NworI2RlZmluZSBWX1dSSVRFX1RPX1JFQURfREVMQVkoeCkgKCh4KSA8PCBTX1dSSVRFX1RPX1JFQURfREVMQVkpCisjZGVmaW5lIEdfV1JJVEVfVE9fUkVBRF9ERUxBWSh4KSAoKCh4KSA+PiBTX1dSSVRFX1RPX1JFQURfREVMQVkpICYgTV9XUklURV9UT19SRUFEX0RFTEFZKQorCisjZGVmaW5lIFNfTUMzX0JBTktfQ1lDTEUgICAgOAorI2RlZmluZSBNX01DM19CQU5LX0NZQ0xFICAgIDB4ZgorI2RlZmluZSBWX01DM19CQU5LX0NZQ0xFKHgpICgoeCkgPDwgU19NQzNfQkFOS19DWUNMRSkKKyNkZWZpbmUgR19NQzNfQkFOS19DWUNMRSh4KSAoKCh4KSA+PiBTX01DM19CQU5LX0NZQ0xFKSAmIE1fTUMzX0JBTktfQ1lDTEUpCisKKyNkZWZpbmUgU19SRUZSRVNIX0NZQ0xFICAgIDEyCisjZGVmaW5lIE1fUkVGUkVTSF9DWUNMRSAgICAweGYKKyNkZWZpbmUgVl9SRUZSRVNIX0NZQ0xFKHgpICgoeCkgPDwgU19SRUZSRVNIX0NZQ0xFKQorI2RlZmluZSBHX1JFRlJFU0hfQ1lDTEUoeCkgKCgoeCkgPj4gU19SRUZSRVNIX0NZQ0xFKSAmIE1fUkVGUkVTSF9DWUNMRSkKKworI2RlZmluZSBTX1BSRUNIQVJHRV9DWUNMRSAgICAxNgorI2RlZmluZSBNX1BSRUNIQVJHRV9DWUNMRSAgICAweDMKKyNkZWZpbmUgVl9QUkVDSEFSR0VfQ1lDTEUoeCkgKCh4KSA8PCBTX1BSRUNIQVJHRV9DWUNMRSkKKyNkZWZpbmUgR19QUkVDSEFSR0VfQ1lDTEUoeCkgKCgoeCkgPj4gU19QUkVDSEFSR0VfQ1lDTEUpICYgTV9QUkVDSEFSR0VfQ1lDTEUpCisKKyNkZWZpbmUgU19BQ1RJVkVfVE9fUkVBRF9XUklURV9ERUxBWSAgICAxOAorI2RlZmluZSBWX0FDVElWRV9UT19SRUFEX1dSSVRFX0RFTEFZKHgpICgoeCkgPDwgU19BQ1RJVkVfVE9fUkVBRF9XUklURV9ERUxBWSkKKyNkZWZpbmUgRl9BQ1RJVkVfVE9fUkVBRF9XUklURV9ERUxBWSAgICBWX0FDVElWRV9UT19SRUFEX1dSSVRFX0RFTEFZKDFVKQorCisjZGVmaW5lIFNfQUNUSVZFX1RPX1BSRUNIQVJHRV9ERUxBWSAgICAxOQorI2RlZmluZSBNX0FDVElWRV9UT19QUkVDSEFSR0VfREVMQVkgICAgMHg3CisjZGVmaW5lIFZfQUNUSVZFX1RPX1BSRUNIQVJHRV9ERUxBWSh4KSAoKHgpIDw8IFNfQUNUSVZFX1RPX1BSRUNIQVJHRV9ERUxBWSkKKyNkZWZpbmUgR19BQ1RJVkVfVE9fUFJFQ0hBUkdFX0RFTEFZKHgpICgoKHgpID4+IFNfQUNUSVZFX1RPX1BSRUNIQVJHRV9ERUxBWSkgJiBNX0FDVElWRV9UT19QUkVDSEFSR0VfREVMQVkpCisKKyNkZWZpbmUgU19XUklURV9SRUNPVkVSWV9ERUxBWSAgICAyMgorI2RlZmluZSBNX1dSSVRFX1JFQ09WRVJZX0RFTEFZICAgIDB4MworI2RlZmluZSBWX1dSSVRFX1JFQ09WRVJZX0RFTEFZKHgpICgoeCkgPDwgU19XUklURV9SRUNPVkVSWV9ERUxBWSkKKyNkZWZpbmUgR19XUklURV9SRUNPVkVSWV9ERUxBWSh4KSAoKCh4KSA+PiBTX1dSSVRFX1JFQ09WRVJZX0RFTEFZKSAmIE1fV1JJVEVfUkVDT1ZFUllfREVMQVkpCisKKyNkZWZpbmUgU19ERU5TSVRZICAgIDI0CisjZGVmaW5lIE1fREVOU0lUWSAgICAweDMKKyNkZWZpbmUgVl9ERU5TSVRZKHgpICgoeCkgPDwgU19ERU5TSVRZKQorI2RlZmluZSBHX0RFTlNJVFkoeCkgKCgoeCkgPj4gU19ERU5TSVRZKSAmIE1fREVOU0lUWSkKKworI2RlZmluZSBTX09SR0FOSVpBVElPTiAgICAyNgorI2RlZmluZSBWX09SR0FOSVpBVElPTih4KSAoKHgpIDw8IFNfT1JHQU5JWkFUSU9OKQorI2RlZmluZSBGX09SR0FOSVpBVElPTiAgICBWX09SR0FOSVpBVElPTigxVSkKKworI2RlZmluZSBTX0JBTktTICAgIDI3CisjZGVmaW5lIFZfQkFOS1MoeCkgKCh4KSA8PCBTX0JBTktTKQorI2RlZmluZSBGX0JBTktTICAgIFZfQkFOS1MoMVUpCisKKyNkZWZpbmUgU19VTlJFR0lTVEVSRUQgICAgMjgKKyNkZWZpbmUgVl9VTlJFR0lTVEVSRUQoeCkgKCh4KSA8PCBTX1VOUkVHSVNURVJFRCkKKyNkZWZpbmUgRl9VTlJFR0lTVEVSRUQgICAgVl9VTlJFR0lTVEVSRUQoMVUpCisKKyNkZWZpbmUgU19NQzNfV0lEVEggICAgMjkKKyNkZWZpbmUgTV9NQzNfV0lEVEggICAgMHgzCisjZGVmaW5lIFZfTUMzX1dJRFRIKHgpICgoeCkgPDwgU19NQzNfV0lEVEgpCisjZGVmaW5lIEdfTUMzX1dJRFRIKHgpICgoKHgpID4+IFNfTUMzX1dJRFRIKSAmIE1fTUMzX1dJRFRIKQorCisjZGVmaW5lIFNfTUMzX1NMT1cgICAgMzEKKyNkZWZpbmUgVl9NQzNfU0xPVyh4KSAoKHgpIDw8IFNfTUMzX1NMT1cpCisjZGVmaW5lIEZfTUMzX1NMT1cgICAgVl9NQzNfU0xPVygxVSkKKworI2RlZmluZSBBX01DM19NT0RFIDB4MTA0CisKKyNkZWZpbmUgU19NQzNfTU9ERSAgICAwCisjZGVmaW5lIE1fTUMzX01PREUgICAgMHgzZmZmCisjZGVmaW5lIFZfTUMzX01PREUoeCkgKCh4KSA8PCBTX01DM19NT0RFKQorI2RlZmluZSBHX01DM19NT0RFKHgpICgoKHgpID4+IFNfTUMzX01PREUpICYgTV9NQzNfTU9ERSkKKworI2RlZmluZSBTX0JVU1kgICAgMzEKKyNkZWZpbmUgVl9CVVNZKHgpICgoeCkgPDwgU19CVVNZKQorI2RlZmluZSBGX0JVU1kgICAgVl9CVVNZKDFVKQorCisjZGVmaW5lIEFfTUMzX0VYVF9NT0RFIDB4MTA4CisKKyNkZWZpbmUgU19NQzNfRVhURU5ERURfTU9ERSAgICAwCisjZGVmaW5lIE1fTUMzX0VYVEVOREVEX01PREUgICAgMHgzZmZmCisjZGVmaW5lIFZfTUMzX0VYVEVOREVEX01PREUoeCkgKCh4KSA8PCBTX01DM19FWFRFTkRFRF9NT0RFKQorI2RlZmluZSBHX01DM19FWFRFTkRFRF9NT0RFKHgpICgoKHgpID4+IFNfTUMzX0VYVEVOREVEX01PREUpICYgTV9NQzNfRVhURU5ERURfTU9ERSkKKworI2RlZmluZSBBX01DM19QUkVDSEFSRyAweDEwYworI2RlZmluZSBBX01DM19SRUZSRVNIIDB4MTEwCisKKyNkZWZpbmUgU19SRUZSRVNIX0VOQUJMRSAgICAwCisjZGVmaW5lIFZfUkVGUkVTSF9FTkFCTEUoeCkgKCh4KSA8PCBTX1JFRlJFU0hfRU5BQkxFKQorI2RlZmluZSBGX1JFRlJFU0hfRU5BQkxFICAgIFZfUkVGUkVTSF9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19SRUZSRVNIX0RJVklTT1IgICAgMQorI2RlZmluZSBNX1JFRlJFU0hfRElWSVNPUiAgICAweDNmZmYKKyNkZWZpbmUgVl9SRUZSRVNIX0RJVklTT1IoeCkgKCh4KSA8PCBTX1JFRlJFU0hfRElWSVNPUikKKyNkZWZpbmUgR19SRUZSRVNIX0RJVklTT1IoeCkgKCgoeCkgPj4gU19SRUZSRVNIX0RJVklTT1IpICYgTV9SRUZSRVNIX0RJVklTT1IpCisKKyNkZWZpbmUgQV9NQzNfU1RST0JFIDB4MTE0CisKKyNkZWZpbmUgU19NQVNURVJfRExMX1JFU0VUICAgIDAKKyNkZWZpbmUgVl9NQVNURVJfRExMX1JFU0VUKHgpICgoeCkgPDwgU19NQVNURVJfRExMX1JFU0VUKQorI2RlZmluZSBGX01BU1RFUl9ETExfUkVTRVQgICAgVl9NQVNURVJfRExMX1JFU0VUKDFVKQorCisjZGVmaW5lIFNfTUFTVEVSX0RMTF9UQVBfQ09VTlQgICAgMQorI2RlZmluZSBNX01BU1RFUl9ETExfVEFQX0NPVU5UICAgIDB4ZmYKKyNkZWZpbmUgVl9NQVNURVJfRExMX1RBUF9DT1VOVCh4KSAoKHgpIDw8IFNfTUFTVEVSX0RMTF9UQVBfQ09VTlQpCisjZGVmaW5lIEdfTUFTVEVSX0RMTF9UQVBfQ09VTlQoeCkgKCgoeCkgPj4gU19NQVNURVJfRExMX1RBUF9DT1VOVCkgJiBNX01BU1RFUl9ETExfVEFQX0NPVU5UKQorCisjZGVmaW5lIFNfTUFTVEVSX0RMTF9MT0NLRUQgICAgOQorI2RlZmluZSBWX01BU1RFUl9ETExfTE9DS0VEKHgpICgoeCkgPDwgU19NQVNURVJfRExMX0xPQ0tFRCkKKyNkZWZpbmUgRl9NQVNURVJfRExMX0xPQ0tFRCAgICBWX01BU1RFUl9ETExfTE9DS0VEKDFVKQorCisjZGVmaW5lIFNfTUFTVEVSX0RMTF9NQVhfVEFQX0NPVU5UICAgIDEwCisjZGVmaW5lIFZfTUFTVEVSX0RMTF9NQVhfVEFQX0NPVU5UKHgpICgoeCkgPDwgU19NQVNURVJfRExMX01BWF9UQVBfQ09VTlQpCisjZGVmaW5lIEZfTUFTVEVSX0RMTF9NQVhfVEFQX0NPVU5UICAgIFZfTUFTVEVSX0RMTF9NQVhfVEFQX0NPVU5UKDFVKQorCisjZGVmaW5lIFNfTUFTVEVSX0RMTF9UQVBfQ09VTlRfT0ZGU0VUICAgIDExCisjZGVmaW5lIE1fTUFTVEVSX0RMTF9UQVBfQ09VTlRfT0ZGU0VUICAgIDB4M2YKKyNkZWZpbmUgVl9NQVNURVJfRExMX1RBUF9DT1VOVF9PRkZTRVQoeCkgKCh4KSA8PCBTX01BU1RFUl9ETExfVEFQX0NPVU5UX09GRlNFVCkKKyNkZWZpbmUgR19NQVNURVJfRExMX1RBUF9DT1VOVF9PRkZTRVQoeCkgKCgoeCkgPj4gU19NQVNURVJfRExMX1RBUF9DT1VOVF9PRkZTRVQpICYgTV9NQVNURVJfRExMX1RBUF9DT1VOVF9PRkZTRVQpCisKKyNkZWZpbmUgU19TTEFWRV9ETExfUkVTRVQgICAgMTEKKyNkZWZpbmUgVl9TTEFWRV9ETExfUkVTRVQoeCkgKCh4KSA8PCBTX1NMQVZFX0RMTF9SRVNFVCkKKyNkZWZpbmUgRl9TTEFWRV9ETExfUkVTRVQgICAgVl9TTEFWRV9ETExfUkVTRVQoMVUpCisKKyNkZWZpbmUgU19TTEFWRV9ETExfREVMVEEgICAgMTIKKyNkZWZpbmUgTV9TTEFWRV9ETExfREVMVEEgICAgMHhmCisjZGVmaW5lIFZfU0xBVkVfRExMX0RFTFRBKHgpICgoeCkgPDwgU19TTEFWRV9ETExfREVMVEEpCisjZGVmaW5lIEdfU0xBVkVfRExMX0RFTFRBKHgpICgoKHgpID4+IFNfU0xBVkVfRExMX0RFTFRBKSAmIE1fU0xBVkVfRExMX0RFTFRBKQorCisjZGVmaW5lIFNfU0xBVkVfREVMQVlfTElORV9NQU5VQUxfVEFQX0NPVU5UICAgIDE3CisjZGVmaW5lIE1fU0xBVkVfREVMQVlfTElORV9NQU5VQUxfVEFQX0NPVU5UICAgIDB4M2YKKyNkZWZpbmUgVl9TTEFWRV9ERUxBWV9MSU5FX01BTlVBTF9UQVBfQ09VTlQoeCkgKCh4KSA8PCBTX1NMQVZFX0RFTEFZX0xJTkVfTUFOVUFMX1RBUF9DT1VOVCkKKyNkZWZpbmUgR19TTEFWRV9ERUxBWV9MSU5FX01BTlVBTF9UQVBfQ09VTlQoeCkgKCgoeCkgPj4gU19TTEFWRV9ERUxBWV9MSU5FX01BTlVBTF9UQVBfQ09VTlQpICYgTV9TTEFWRV9ERUxBWV9MSU5FX01BTlVBTF9UQVBfQ09VTlQpCisKKyNkZWZpbmUgU19TTEFWRV9ERUxBWV9MSU5FX01BTlVBTF9UQVBfQ09VTlRfRU5BQkxFICAgIDIzCisjZGVmaW5lIFZfU0xBVkVfREVMQVlfTElORV9NQU5VQUxfVEFQX0NPVU5UX0VOQUJMRSh4KSAoKHgpIDw8IFNfU0xBVkVfREVMQVlfTElORV9NQU5VQUxfVEFQX0NPVU5UX0VOQUJMRSkKKyNkZWZpbmUgRl9TTEFWRV9ERUxBWV9MSU5FX01BTlVBTF9UQVBfQ09VTlRfRU5BQkxFICAgIFZfU0xBVkVfREVMQVlfTElORV9NQU5VQUxfVEFQX0NPVU5UX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX1NMQVZFX0RFTEFZX0xJTkVfVEFQX0NPVU5UICAgIDI0CisjZGVmaW5lIE1fU0xBVkVfREVMQVlfTElORV9UQVBfQ09VTlQgICAgMHgzZgorI2RlZmluZSBWX1NMQVZFX0RFTEFZX0xJTkVfVEFQX0NPVU5UKHgpICgoeCkgPDwgU19TTEFWRV9ERUxBWV9MSU5FX1RBUF9DT1VOVCkKKyNkZWZpbmUgR19TTEFWRV9ERUxBWV9MSU5FX1RBUF9DT1VOVCh4KSAoKCh4KSA+PiBTX1NMQVZFX0RFTEFZX0xJTkVfVEFQX0NPVU5UKSAmIE1fU0xBVkVfREVMQVlfTElORV9UQVBfQ09VTlQpCisKKyNkZWZpbmUgQV9NQzNfRUNDX0NOVEwgMHgxMTgKKworI2RlZmluZSBTX0VDQ19HRU5FUkFUSU9OX0VOQUJMRSAgICAwCisjZGVmaW5lIFZfRUNDX0dFTkVSQVRJT05fRU5BQkxFKHgpICgoeCkgPDwgU19FQ0NfR0VORVJBVElPTl9FTkFCTEUpCisjZGVmaW5lIEZfRUNDX0dFTkVSQVRJT05fRU5BQkxFICAgIFZfRUNDX0dFTkVSQVRJT05fRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfRUNDX0NIRUNLX0VOQUJMRSAgICAxCisjZGVmaW5lIFZfRUNDX0NIRUNLX0VOQUJMRSh4KSAoKHgpIDw8IFNfRUNDX0NIRUNLX0VOQUJMRSkKKyNkZWZpbmUgRl9FQ0NfQ0hFQ0tfRU5BQkxFICAgIFZfRUNDX0NIRUNLX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX0NPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UICAgIDIKKyNkZWZpbmUgTV9DT1JSRUNUQUJMRV9FUlJPUl9DT1VOVCAgICAweGZmCisjZGVmaW5lIFZfQ09SUkVDVEFCTEVfRVJST1JfQ09VTlQoeCkgKCh4KSA8PCBTX0NPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UKQorI2RlZmluZSBHX0NPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UKHgpICgoKHgpID4+IFNfQ09SUkVDVEFCTEVfRVJST1JfQ09VTlQpICYgTV9DT1JSRUNUQUJMRV9FUlJPUl9DT1VOVCkKKworI2RlZmluZSBTX1VOQ09SUkVDVEFCTEVfRVJST1JfQ09VTlQgICAgMTAKKyNkZWZpbmUgTV9VTkNPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UICAgIDB4ZmYKKyNkZWZpbmUgVl9VTkNPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UKHgpICgoeCkgPDwgU19VTkNPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UKQorI2RlZmluZSBHX1VOQ09SUkVDVEFCTEVfRVJST1JfQ09VTlQoeCkgKCgoeCkgPj4gU19VTkNPUlJFQ1RBQkxFX0VSUk9SX0NPVU5UKSAmIE1fVU5DT1JSRUNUQUJMRV9FUlJPUl9DT1VOVCkKKworI2RlZmluZSBBX01DM19DRV9BRERSIDB4MTFjCisKKyNkZWZpbmUgU19NQzNfQ0VfQUREUiAgICA0CisjZGVmaW5lIE1fTUMzX0NFX0FERFIgICAgMHhmZmZmZmZmCisjZGVmaW5lIFZfTUMzX0NFX0FERFIoeCkgKCh4KSA8PCBTX01DM19DRV9BRERSKQorI2RlZmluZSBHX01DM19DRV9BRERSKHgpICgoKHgpID4+IFNfTUMzX0NFX0FERFIpICYgTV9NQzNfQ0VfQUREUikKKworI2RlZmluZSBBX01DM19DRV9EQVRBMCAweDEyMAorI2RlZmluZSBBX01DM19DRV9EQVRBMSAweDEyNAorI2RlZmluZSBBX01DM19DRV9EQVRBMiAweDEyOAorI2RlZmluZSBBX01DM19DRV9EQVRBMyAweDEyYworI2RlZmluZSBBX01DM19DRV9EQVRBNCAweDEzMAorI2RlZmluZSBBX01DM19VRV9BRERSIDB4MTM0CisKKyNkZWZpbmUgU19NQzNfVUVfQUREUiAgICA0CisjZGVmaW5lIE1fTUMzX1VFX0FERFIgICAgMHhmZmZmZmZmCisjZGVmaW5lIFZfTUMzX1VFX0FERFIoeCkgKCh4KSA8PCBTX01DM19VRV9BRERSKQorI2RlZmluZSBHX01DM19VRV9BRERSKHgpICgoKHgpID4+IFNfTUMzX1VFX0FERFIpICYgTV9NQzNfVUVfQUREUikKKworI2RlZmluZSBBX01DM19VRV9EQVRBMCAweDEzOAorI2RlZmluZSBBX01DM19VRV9EQVRBMSAweDEzYworI2RlZmluZSBBX01DM19VRV9EQVRBMiAweDE0MAorI2RlZmluZSBBX01DM19VRV9EQVRBMyAweDE0NAorI2RlZmluZSBBX01DM19VRV9EQVRBNCAweDE0OAorI2RlZmluZSBBX01DM19CRF9BRERSIDB4MTRjCisjZGVmaW5lIEFfTUMzX0JEX0RBVEEwIDB4MTUwCisjZGVmaW5lIEFfTUMzX0JEX0RBVEExIDB4MTU0CisjZGVmaW5lIEFfTUMzX0JEX0RBVEEyIDB4MTU4CisjZGVmaW5lIEFfTUMzX0JEX0RBVEEzIDB4MTVjCisjZGVmaW5lIEFfTUMzX0JEX0RBVEE0IDB4MTYwCisjZGVmaW5lIEFfTUMzX0JEX09QIDB4MTY0CisKKyNkZWZpbmUgU19CQUNLX0RPT1JfT1BFUkFUSU9OICAgIDAKKyNkZWZpbmUgVl9CQUNLX0RPT1JfT1BFUkFUSU9OKHgpICgoeCkgPDwgU19CQUNLX0RPT1JfT1BFUkFUSU9OKQorI2RlZmluZSBGX0JBQ0tfRE9PUl9PUEVSQVRJT04gICAgVl9CQUNLX0RPT1JfT1BFUkFUSU9OKDFVKQorCisjZGVmaW5lIEFfTUMzX0JJU1RfQUREUl9CRUcgMHgxNjgKKyNkZWZpbmUgQV9NQzNfQklTVF9BRERSX0VORCAweDE2YworI2RlZmluZSBBX01DM19CSVNUX0RBVEEgMHgxNzAKKyNkZWZpbmUgQV9NQzNfQklTVF9PUCAweDE3NAorCisjZGVmaW5lIFNfT1AgICAgMAorI2RlZmluZSBWX09QKHgpICgoeCkgPDwgU19PUCkKKyNkZWZpbmUgRl9PUCAgICBWX09QKDFVKQorCisjZGVmaW5lIFNfREFUQV9QQVRURVJOICAgIDEKKyNkZWZpbmUgTV9EQVRBX1BBVFRFUk4gICAgMHgzCisjZGVmaW5lIFZfREFUQV9QQVRURVJOKHgpICgoeCkgPDwgU19EQVRBX1BBVFRFUk4pCisjZGVmaW5lIEdfREFUQV9QQVRURVJOKHgpICgoKHgpID4+IFNfREFUQV9QQVRURVJOKSAmIE1fREFUQV9QQVRURVJOKQorCisjZGVmaW5lIFNfQ09OVElOVU9VUyAgICAzCisjZGVmaW5lIFZfQ09OVElOVU9VUyh4KSAoKHgpIDw8IFNfQ09OVElOVU9VUykKKyNkZWZpbmUgRl9DT05USU5VT1VTICAgIFZfQ09OVElOVU9VUygxVSkKKworI2RlZmluZSBBX01DM19JTlRfRU5BQkxFIDB4MTc4CisKKyNkZWZpbmUgU19NQzNfQ09SUl9FUlIgICAgMAorI2RlZmluZSBWX01DM19DT1JSX0VSUih4KSAoKHgpIDw8IFNfTUMzX0NPUlJfRVJSKQorI2RlZmluZSBGX01DM19DT1JSX0VSUiAgICBWX01DM19DT1JSX0VSUigxVSkKKworI2RlZmluZSBTX01DM19VTkNPUlJfRVJSICAgIDEKKyNkZWZpbmUgVl9NQzNfVU5DT1JSX0VSUih4KSAoKHgpIDw8IFNfTUMzX1VOQ09SUl9FUlIpCisjZGVmaW5lIEZfTUMzX1VOQ09SUl9FUlIgICAgVl9NQzNfVU5DT1JSX0VSUigxVSkKKworI2RlZmluZSBTX01DM19QQVJJVFlfRVJSICAgIDIKKyNkZWZpbmUgTV9NQzNfUEFSSVRZX0VSUiAgICAweGZmCisjZGVmaW5lIFZfTUMzX1BBUklUWV9FUlIoeCkgKCh4KSA8PCBTX01DM19QQVJJVFlfRVJSKQorI2RlZmluZSBHX01DM19QQVJJVFlfRVJSKHgpICgoKHgpID4+IFNfTUMzX1BBUklUWV9FUlIpICYgTV9NQzNfUEFSSVRZX0VSUikKKworI2RlZmluZSBTX01DM19BRERSX0VSUiAgICAxMAorI2RlZmluZSBWX01DM19BRERSX0VSUih4KSAoKHgpIDw8IFNfTUMzX0FERFJfRVJSKQorI2RlZmluZSBGX01DM19BRERSX0VSUiAgICBWX01DM19BRERSX0VSUigxVSkKKworI2RlZmluZSBBX01DM19JTlRfQ0FVU0UgMHgxN2MKKworLyogTUM0IHJlZ2lzdGVycyAqLwogI2RlZmluZSBBX01DNF9DRkcgMHgxODAKKworI2RlZmluZSBTX1BPV0VSX1VQICAgIDAKKyNkZWZpbmUgVl9QT1dFUl9VUCh4KSAoKHgpIDw8IFNfUE9XRVJfVVApCisjZGVmaW5lIEZfUE9XRVJfVVAgICAgVl9QT1dFUl9VUCgxVSkKKworI2RlZmluZSBTX01DNF9CQU5LX0NZQ0xFICAgIDgKKyNkZWZpbmUgTV9NQzRfQkFOS19DWUNMRSAgICAweDcKKyNkZWZpbmUgVl9NQzRfQkFOS19DWUNMRSh4KSAoKHgpIDw8IFNfTUM0X0JBTktfQ1lDTEUpCisjZGVmaW5lIEdfTUM0X0JBTktfQ1lDTEUoeCkgKCgoeCkgPj4gU19NQzRfQkFOS19DWUNMRSkgJiBNX01DNF9CQU5LX0NZQ0xFKQorCisjZGVmaW5lIFNfTUM0X05BUlJPVyAgICAyNAorI2RlZmluZSBWX01DNF9OQVJST1coeCkgKCh4KSA8PCBTX01DNF9OQVJST1cpCisjZGVmaW5lIEZfTUM0X05BUlJPVyAgICBWX01DNF9OQVJST1coMVUpCisKICNkZWZpbmUgU19NQzRfU0xPVyAgICAyNQogI2RlZmluZSBWX01DNF9TTE9XKHgpICgoeCkgPDwgU19NQzRfU0xPVykKICNkZWZpbmUgRl9NQzRfU0xPVyAgICBWX01DNF9TTE9XKDFVKQogCi0vKiBUUEkgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNfTUM0QV9XSURUSCAgICAyNAorI2RlZmluZSBNX01DNEFfV0lEVEggICAgMHgzCisjZGVmaW5lIFZfTUM0QV9XSURUSCh4KSAoKHgpIDw8IFNfTUM0QV9XSURUSCkKKyNkZWZpbmUgR19NQzRBX1dJRFRIKHgpICgoKHgpID4+IFNfTUM0QV9XSURUSCkgJiBNX01DNEFfV0lEVEgpCiAKKyNkZWZpbmUgU19NQzRBX1NMT1cgICAgMjYKKyNkZWZpbmUgVl9NQzRBX1NMT1coeCkgKCh4KSA8PCBTX01DNEFfU0xPVykKKyNkZWZpbmUgRl9NQzRBX1NMT1cgICAgVl9NQzRBX1NMT1coMVUpCisKKyNkZWZpbmUgQV9NQzRfTU9ERSAweDE4NAorCisjZGVmaW5lIFNfTUM0X01PREUgICAgMAorI2RlZmluZSBNX01DNF9NT0RFICAgIDB4N2ZmZgorI2RlZmluZSBWX01DNF9NT0RFKHgpICgoeCkgPDwgU19NQzRfTU9ERSkKKyNkZWZpbmUgR19NQzRfTU9ERSh4KSAoKCh4KSA+PiBTX01DNF9NT0RFKSAmIE1fTUM0X01PREUpCisKKyNkZWZpbmUgQV9NQzRfRVhUX01PREUgMHgxODgKKworI2RlZmluZSBTX01DNF9FWFRFTkRFRF9NT0RFICAgIDAKKyNkZWZpbmUgTV9NQzRfRVhURU5ERURfTU9ERSAgICAweDdmZmYKKyNkZWZpbmUgVl9NQzRfRVhURU5ERURfTU9ERSh4KSAoKHgpIDw8IFNfTUM0X0VYVEVOREVEX01PREUpCisjZGVmaW5lIEdfTUM0X0VYVEVOREVEX01PREUoeCkgKCgoeCkgPj4gU19NQzRfRVhURU5ERURfTU9ERSkgJiBNX01DNF9FWFRFTkRFRF9NT0RFKQorCisjZGVmaW5lIEFfTUM0X1JFRlJFU0ggMHgxOTAKKyNkZWZpbmUgQV9NQzRfU1RST0JFIDB4MTk0CisjZGVmaW5lIEFfTUM0X0VDQ19DTlRMIDB4MTk4CisjZGVmaW5lIEFfTUM0X0NFX0FERFIgMHgxOWMKKworI2RlZmluZSBTX01DNF9DRV9BRERSICAgIDQKKyNkZWZpbmUgTV9NQzRfQ0VfQUREUiAgICAweGZmZmZmZgorI2RlZmluZSBWX01DNF9DRV9BRERSKHgpICgoeCkgPDwgU19NQzRfQ0VfQUREUikKKyNkZWZpbmUgR19NQzRfQ0VfQUREUih4KSAoKCh4KSA+PiBTX01DNF9DRV9BRERSKSAmIE1fTUM0X0NFX0FERFIpCisKKyNkZWZpbmUgQV9NQzRfQ0VfREFUQTAgMHgxYTAKKyNkZWZpbmUgQV9NQzRfQ0VfREFUQTEgMHgxYTQKKyNkZWZpbmUgQV9NQzRfQ0VfREFUQTIgMHgxYTgKKyNkZWZpbmUgQV9NQzRfQ0VfREFUQTMgMHgxYWMKKyNkZWZpbmUgQV9NQzRfQ0VfREFUQTQgMHgxYjAKKyNkZWZpbmUgQV9NQzRfVUVfQUREUiAweDFiNAorCisjZGVmaW5lIFNfTUM0X1VFX0FERFIgICAgNAorI2RlZmluZSBNX01DNF9VRV9BRERSICAgIDB4ZmZmZmZmCisjZGVmaW5lIFZfTUM0X1VFX0FERFIoeCkgKCh4KSA8PCBTX01DNF9VRV9BRERSKQorI2RlZmluZSBHX01DNF9VRV9BRERSKHgpICgoKHgpID4+IFNfTUM0X1VFX0FERFIpICYgTV9NQzRfVUVfQUREUikKKworI2RlZmluZSBBX01DNF9VRV9EQVRBMCAweDFiOAorI2RlZmluZSBBX01DNF9VRV9EQVRBMSAweDFiYworI2RlZmluZSBBX01DNF9VRV9EQVRBMiAweDFjMAorI2RlZmluZSBBX01DNF9VRV9EQVRBMyAweDFjNAorI2RlZmluZSBBX01DNF9VRV9EQVRBNCAweDFjOAorI2RlZmluZSBBX01DNF9CRF9BRERSIDB4MWNjCisKKyNkZWZpbmUgU19NQzRfQkFDS19ET09SX0FERFIgICAgMAorI2RlZmluZSBNX01DNF9CQUNLX0RPT1JfQUREUiAgICAweGZmZmZmZmYKKyNkZWZpbmUgVl9NQzRfQkFDS19ET09SX0FERFIoeCkgKCh4KSA8PCBTX01DNF9CQUNLX0RPT1JfQUREUikKKyNkZWZpbmUgR19NQzRfQkFDS19ET09SX0FERFIoeCkgKCgoeCkgPj4gU19NQzRfQkFDS19ET09SX0FERFIpICYgTV9NQzRfQkFDS19ET09SX0FERFIpCisKKyNkZWZpbmUgQV9NQzRfQkRfREFUQTAgMHgxZDAKKyNkZWZpbmUgQV9NQzRfQkRfREFUQTEgMHgxZDQKKyNkZWZpbmUgQV9NQzRfQkRfREFUQTIgMHgxZDgKKyNkZWZpbmUgQV9NQzRfQkRfREFUQTMgMHgxZGMKKyNkZWZpbmUgQV9NQzRfQkRfREFUQTQgMHgxZTAKKyNkZWZpbmUgQV9NQzRfQkRfT1AgMHgxZTQKKworI2RlZmluZSBTX09QRVJBVElPTiAgICAwCisjZGVmaW5lIFZfT1BFUkFUSU9OKHgpICgoeCkgPDwgU19PUEVSQVRJT04pCisjZGVmaW5lIEZfT1BFUkFUSU9OICAgIFZfT1BFUkFUSU9OKDFVKQorCisjZGVmaW5lIEFfTUM0X0JJU1RfQUREUl9CRUcgMHgxZTgKKyNkZWZpbmUgQV9NQzRfQklTVF9BRERSX0VORCAweDFlYworI2RlZmluZSBBX01DNF9CSVNUX0RBVEEgMHgxZjAKKyNkZWZpbmUgQV9NQzRfQklTVF9PUCAweDFmNAorI2RlZmluZSBBX01DNF9JTlRfRU5BQkxFIDB4MWY4CisKKyNkZWZpbmUgU19NQzRfQ09SUl9FUlIgICAgMAorI2RlZmluZSBWX01DNF9DT1JSX0VSUih4KSAoKHgpIDw8IFNfTUM0X0NPUlJfRVJSKQorI2RlZmluZSBGX01DNF9DT1JSX0VSUiAgICBWX01DNF9DT1JSX0VSUigxVSkKKworI2RlZmluZSBTX01DNF9VTkNPUlJfRVJSICAgIDEKKyNkZWZpbmUgVl9NQzRfVU5DT1JSX0VSUih4KSAoKHgpIDw8IFNfTUM0X1VOQ09SUl9FUlIpCisjZGVmaW5lIEZfTUM0X1VOQ09SUl9FUlIgICAgVl9NQzRfVU5DT1JSX0VSUigxVSkKKworI2RlZmluZSBTX01DNF9BRERSX0VSUiAgICAyCisjZGVmaW5lIFZfTUM0X0FERFJfRVJSKHgpICgoeCkgPDwgU19NQzRfQUREUl9FUlIpCisjZGVmaW5lIEZfTUM0X0FERFJfRVJSICAgIFZfTUM0X0FERFJfRVJSKDFVKQorCisjZGVmaW5lIEFfTUM0X0lOVF9DQVVTRSAweDFmYworCisvKiBUUEkgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFfVFBJX0FERFIgMHgyODAKKworI2RlZmluZSBTX1RQSV9BRERSRVNTICAgIDAKKyNkZWZpbmUgTV9UUElfQUREUkVTUyAgICAweGZmZmZmZgorI2RlZmluZSBWX1RQSV9BRERSRVNTKHgpICgoeCkgPDwgU19UUElfQUREUkVTUykKKyNkZWZpbmUgR19UUElfQUREUkVTUyh4KSAoKCh4KSA+PiBTX1RQSV9BRERSRVNTKSAmIE1fVFBJX0FERFJFU1MpCisKICNkZWZpbmUgQV9UUElfV1JfREFUQSAweDI4NAogI2RlZmluZSBBX1RQSV9SRF9EQVRBIDB4Mjg4CiAjZGVmaW5lIEFfVFBJX0NTUiAweDI4YwpAQCAtMTcxLDYgKzYyNywxMCBAQAogI2RlZmluZSBWX1RQSVJEWSh4KSAoKHgpIDw8IFNfVFBJUkRZKQogI2RlZmluZSBGX1RQSVJEWSAgICBWX1RQSVJEWSgxVSkKIAorI2RlZmluZSBTX0lOVF9ESVIgICAgMzEKKyNkZWZpbmUgVl9JTlRfRElSKHgpICgoeCkgPDwgU19JTlRfRElSKQorI2RlZmluZSBGX0lOVF9ESVIgICAgVl9JTlRfRElSKDFVKQorCiAjZGVmaW5lIEFfVFBJX1BBUiAweDI5YwogCiAjZGVmaW5lIFNfVFBJUEFSICAgIDAKQEAgLTE3OCwxNCArNjM4LDI2IEBACiAjZGVmaW5lIFZfVFBJUEFSKHgpICgoeCkgPDwgU19UUElQQVIpCiAjZGVmaW5lIEdfVFBJUEFSKHgpICgoKHgpID4+IFNfVFBJUEFSKSAmIE1fVFBJUEFSKQogCi0vKiBUUCByZWdpc3RlcnMgKi8KIAorLyogVFAgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFfVFBfSU5fQ09ORklHIDB4MzAwCiAKKyNkZWZpbmUgU19UUF9JTl9DU1BJX1RVTk5FTCAgICAwCisjZGVmaW5lIFZfVFBfSU5fQ1NQSV9UVU5ORUwoeCkgKCh4KSA8PCBTX1RQX0lOX0NTUElfVFVOTkVMKQorI2RlZmluZSBGX1RQX0lOX0NTUElfVFVOTkVMICAgIFZfVFBfSU5fQ1NQSV9UVU5ORUwoMVUpCisKKyNkZWZpbmUgU19UUF9JTl9DU1BJX0VUSEVSTkVUICAgIDEKKyNkZWZpbmUgVl9UUF9JTl9DU1BJX0VUSEVSTkVUKHgpICgoeCkgPDwgU19UUF9JTl9DU1BJX0VUSEVSTkVUKQorI2RlZmluZSBGX1RQX0lOX0NTUElfRVRIRVJORVQgICAgVl9UUF9JTl9DU1BJX0VUSEVSTkVUKDFVKQorCiAjZGVmaW5lIFNfVFBfSU5fQ1NQSV9DUEwgICAgMwogI2RlZmluZSBWX1RQX0lOX0NTUElfQ1BMKHgpICgoeCkgPDwgU19UUF9JTl9DU1BJX0NQTCkKICNkZWZpbmUgRl9UUF9JTl9DU1BJX0NQTCAgICBWX1RQX0lOX0NTUElfQ1BMKDFVKQogCisjZGVmaW5lIFNfVFBfSU5fQ1NQSV9QT1MgICAgNAorI2RlZmluZSBWX1RQX0lOX0NTUElfUE9TKHgpICgoeCkgPDwgU19UUF9JTl9DU1BJX1BPUykKKyNkZWZpbmUgRl9UUF9JTl9DU1BJX1BPUyAgICBWX1RQX0lOX0NTUElfUE9TKDFVKQorCiAjZGVmaW5lIFNfVFBfSU5fQ1NQSV9DSEVDS19JUF9DU1VNICAgIDUKICNkZWZpbmUgVl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0oeCkgKCh4KSA8PCBTX1RQX0lOX0NTUElfQ0hFQ0tfSVBfQ1NVTSkKICNkZWZpbmUgRl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0gICAgVl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0oMVUpCkBAIC0xOTQsMTAgKzY2NiwyMiBAQAogI2RlZmluZSBWX1RQX0lOX0NTUElfQ0hFQ0tfVENQX0NTVU0oeCkgKCh4KSA8PCBTX1RQX0lOX0NTUElfQ0hFQ0tfVENQX0NTVU0pCiAjZGVmaW5lIEZfVFBfSU5fQ1NQSV9DSEVDS19UQ1BfQ1NVTSAgICBWX1RQX0lOX0NTUElfQ0hFQ0tfVENQX0NTVU0oMVUpCiAKKyNkZWZpbmUgU19UUF9JTl9FU1BJX1RVTk5FTCAgICA3CisjZGVmaW5lIFZfVFBfSU5fRVNQSV9UVU5ORUwoeCkgKCh4KSA8PCBTX1RQX0lOX0VTUElfVFVOTkVMKQorI2RlZmluZSBGX1RQX0lOX0VTUElfVFVOTkVMICAgIFZfVFBfSU5fRVNQSV9UVU5ORUwoMVUpCisKICNkZWZpbmUgU19UUF9JTl9FU1BJX0VUSEVSTkVUICAgIDgKICNkZWZpbmUgVl9UUF9JTl9FU1BJX0VUSEVSTkVUKHgpICgoeCkgPDwgU19UUF9JTl9FU1BJX0VUSEVSTkVUKQogI2RlZmluZSBGX1RQX0lOX0VTUElfRVRIRVJORVQgICAgVl9UUF9JTl9FU1BJX0VUSEVSTkVUKDFVKQogCisjZGVmaW5lIFNfVFBfSU5fRVNQSV9DUEwgICAgMTAKKyNkZWZpbmUgVl9UUF9JTl9FU1BJX0NQTCh4KSAoKHgpIDw8IFNfVFBfSU5fRVNQSV9DUEwpCisjZGVmaW5lIEZfVFBfSU5fRVNQSV9DUEwgICAgVl9UUF9JTl9FU1BJX0NQTCgxVSkKKworI2RlZmluZSBTX1RQX0lOX0VTUElfUE9TICAgIDExCisjZGVmaW5lIFZfVFBfSU5fRVNQSV9QT1MoeCkgKCh4KSA8PCBTX1RQX0lOX0VTUElfUE9TKQorI2RlZmluZSBGX1RQX0lOX0VTUElfUE9TICAgIFZfVFBfSU5fRVNQSV9QT1MoMVUpCisKICNkZWZpbmUgU19UUF9JTl9FU1BJX0NIRUNLX0lQX0NTVU0gICAgMTIKICNkZWZpbmUgVl9UUF9JTl9FU1BJX0NIRUNLX0lQX0NTVU0oeCkgKCh4KSA8PCBTX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSkKICNkZWZpbmUgRl9UUF9JTl9FU1BJX0NIRUNLX0lQX0NTVU0gICAgVl9UUF9JTl9FU1BJX0NIRUNLX0lQX0NTVU0oMVUpCkBAIC0yMTIsMTQgKzY5Niw0MiBAQAogCiAjZGVmaW5lIEFfVFBfT1VUX0NPTkZJRyAweDMwNAogCisjZGVmaW5lIFNfVFBfT1VUX0NfRVRIICAgIDAKKyNkZWZpbmUgVl9UUF9PVVRfQ19FVEgoeCkgKCh4KSA8PCBTX1RQX09VVF9DX0VUSCkKKyNkZWZpbmUgRl9UUF9PVVRfQ19FVEggICAgVl9UUF9PVVRfQ19FVEgoMVUpCisKICNkZWZpbmUgU19UUF9PVVRfQ1NQSV9DUEwgICAgMgogI2RlZmluZSBWX1RQX09VVF9DU1BJX0NQTCh4KSAoKHgpIDw8IFNfVFBfT1VUX0NTUElfQ1BMKQogI2RlZmluZSBGX1RQX09VVF9DU1BJX0NQTCAgICBWX1RQX09VVF9DU1BJX0NQTCgxVSkKIAorI2RlZmluZSBTX1RQX09VVF9DU1BJX1BPUyAgICAzCisjZGVmaW5lIFZfVFBfT1VUX0NTUElfUE9TKHgpICgoeCkgPDwgU19UUF9PVVRfQ1NQSV9QT1MpCisjZGVmaW5lIEZfVFBfT1VUX0NTUElfUE9TICAgIFZfVFBfT1VUX0NTUElfUE9TKDFVKQorCisjZGVmaW5lIFNfVFBfT1VUX0NTUElfR0VORVJBVEVfSVBfQ1NVTSAgICA0CisjZGVmaW5lIFZfVFBfT1VUX0NTUElfR0VORVJBVEVfSVBfQ1NVTSh4KSAoKHgpIDw8IFNfVFBfT1VUX0NTUElfR0VORVJBVEVfSVBfQ1NVTSkKKyNkZWZpbmUgRl9UUF9PVVRfQ1NQSV9HRU5FUkFURV9JUF9DU1VNICAgIFZfVFBfT1VUX0NTUElfR0VORVJBVEVfSVBfQ1NVTSgxVSkKKworI2RlZmluZSBTX1RQX09VVF9DU1BJX0dFTkVSQVRFX1RDUF9DU1VNICAgIDUKKyNkZWZpbmUgVl9UUF9PVVRfQ1NQSV9HRU5FUkFURV9UQ1BfQ1NVTSh4KSAoKHgpIDw8IFNfVFBfT1VUX0NTUElfR0VORVJBVEVfVENQX0NTVU0pCisjZGVmaW5lIEZfVFBfT1VUX0NTUElfR0VORVJBVEVfVENQX0NTVU0gICAgVl9UUF9PVVRfQ1NQSV9HRU5FUkFURV9UQ1BfQ1NVTSgxVSkKKwogI2RlZmluZSBTX1RQX09VVF9FU1BJX0VUSEVSTkVUICAgIDYKICNkZWZpbmUgVl9UUF9PVVRfRVNQSV9FVEhFUk5FVCh4KSAoKHgpIDw8IFNfVFBfT1VUX0VTUElfRVRIRVJORVQpCiAjZGVmaW5lIEZfVFBfT1VUX0VTUElfRVRIRVJORVQgICAgVl9UUF9PVVRfRVNQSV9FVEhFUk5FVCgxVSkKIAorI2RlZmluZSBTX1RQX09VVF9FU1BJX1RBR19FVEhFUk5FVCAgICA3CisjZGVmaW5lIFZfVFBfT1VUX0VTUElfVEFHX0VUSEVSTkVUKHgpICgoeCkgPDwgU19UUF9PVVRfRVNQSV9UQUdfRVRIRVJORVQpCisjZGVmaW5lIEZfVFBfT1VUX0VTUElfVEFHX0VUSEVSTkVUICAgIFZfVFBfT1VUX0VTUElfVEFHX0VUSEVSTkVUKDFVKQorCisjZGVmaW5lIFNfVFBfT1VUX0VTUElfQ1BMICAgIDgKKyNkZWZpbmUgVl9UUF9PVVRfRVNQSV9DUEwoeCkgKCh4KSA8PCBTX1RQX09VVF9FU1BJX0NQTCkKKyNkZWZpbmUgRl9UUF9PVVRfRVNQSV9DUEwgICAgVl9UUF9PVVRfRVNQSV9DUEwoMVUpCisKKyNkZWZpbmUgU19UUF9PVVRfRVNQSV9QT1MgICAgOQorI2RlZmluZSBWX1RQX09VVF9FU1BJX1BPUyh4KSAoKHgpIDw8IFNfVFBfT1VUX0VTUElfUE9TKQorI2RlZmluZSBGX1RQX09VVF9FU1BJX1BPUyAgICBWX1RQX09VVF9FU1BJX1BPUygxVSkKKwogI2RlZmluZSBTX1RQX09VVF9FU1BJX0dFTkVSQVRFX0lQX0NTVU0gICAgMTAKICNkZWZpbmUgVl9UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNKHgpICgoeCkgPDwgU19UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNKQogI2RlZmluZSBGX1RQX09VVF9FU1BJX0dFTkVSQVRFX0lQX0NTVU0gICAgVl9UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNKDFVKQpAQCAtMjMzLDYgKzc0NSwxNiBAQAogI2RlZmluZSBTX0lQX1RUTCAgICAwCiAjZGVmaW5lIE1fSVBfVFRMICAgIDB4ZmYKICNkZWZpbmUgVl9JUF9UVEwoeCkgKCh4KSA8PCBTX0lQX1RUTCkKKyNkZWZpbmUgR19JUF9UVEwoeCkgKCgoeCkgPj4gU19JUF9UVEwpICYgTV9JUF9UVEwpCisKKyNkZWZpbmUgU19UQ0FNX1NFUlZFUl9SRUdJT05fVVNBR0UgICAgOAorI2RlZmluZSBNX1RDQU1fU0VSVkVSX1JFR0lPTl9VU0FHRSAgICAweDMKKyNkZWZpbmUgVl9UQ0FNX1NFUlZFUl9SRUdJT05fVVNBR0UoeCkgKCh4KSA8PCBTX1RDQU1fU0VSVkVSX1JFR0lPTl9VU0FHRSkKKyNkZWZpbmUgR19UQ0FNX1NFUlZFUl9SRUdJT05fVVNBR0UoeCkgKCgoeCkgPj4gU19UQ0FNX1NFUlZFUl9SRUdJT05fVVNBR0UpICYgTV9UQ0FNX1NFUlZFUl9SRUdJT05fVVNBR0UpCisKKyNkZWZpbmUgU19RT1NfTUFQUElORyAgICAxMAorI2RlZmluZSBWX1FPU19NQVBQSU5HKHgpICgoeCkgPDwgU19RT1NfTUFQUElORykKKyNkZWZpbmUgRl9RT1NfTUFQUElORyAgICBWX1FPU19NQVBQSU5HKDFVKQogCiAjZGVmaW5lIFNfVENQX0NTVU0gICAgMTEKICNkZWZpbmUgVl9UQ1BfQ1NVTSh4KSAoKHgpIDw8IFNfVENQX0NTVU0pCkBAIC0yNDYsMzEgKzc2OCw0NzYgQEAKICNkZWZpbmUgVl9JUF9DU1VNKHgpICgoeCkgPDwgU19JUF9DU1VNKQogI2RlZmluZSBGX0lQX0NTVU0gICAgVl9JUF9DU1VNKDFVKQogCisjZGVmaW5lIFNfSVBfSURfU1BMSVQgICAgMTQKKyNkZWZpbmUgVl9JUF9JRF9TUExJVCh4KSAoKHgpIDw8IFNfSVBfSURfU1BMSVQpCisjZGVmaW5lIEZfSVBfSURfU1BMSVQgICAgVl9JUF9JRF9TUExJVCgxVSkKKwogI2RlZmluZSBTX1BBVEhfTVRVICAgIDE1CiAjZGVmaW5lIFZfUEFUSF9NVFUoeCkgKCh4KSA8PCBTX1BBVEhfTVRVKQogI2RlZmluZSBGX1BBVEhfTVRVICAgIFZfUEFUSF9NVFUoMVUpCiAKICNkZWZpbmUgU181VFVQTEVfTE9PS1VQICAgIDE3CisjZGVmaW5lIE1fNVRVUExFX0xPT0tVUCAgICAweDMKICNkZWZpbmUgVl81VFVQTEVfTE9PS1VQKHgpICgoeCkgPDwgU181VFVQTEVfTE9PS1VQKQorI2RlZmluZSBHXzVUVVBMRV9MT09LVVAoeCkgKCgoeCkgPj4gU181VFVQTEVfTE9PS1VQKSAmIE1fNVRVUExFX0xPT0tVUCkKKworI2RlZmluZSBTX0lQX0ZSQUdNRU5UX0RST1AgICAgMTkKKyNkZWZpbmUgVl9JUF9GUkFHTUVOVF9EUk9QKHgpICgoeCkgPDwgU19JUF9GUkFHTUVOVF9EUk9QKQorI2RlZmluZSBGX0lQX0ZSQUdNRU5UX0RST1AgICAgVl9JUF9GUkFHTUVOVF9EUk9QKDFVKQorCisjZGVmaW5lIFNfUElOR19EUk9QICAgIDIwCisjZGVmaW5lIFZfUElOR19EUk9QKHgpICgoeCkgPDwgU19QSU5HX0RST1ApCisjZGVmaW5lIEZfUElOR19EUk9QICAgIFZfUElOR19EUk9QKDFVKQorCisjZGVmaW5lIFNfUFJPVEVDVF9NT0RFICAgIDIxCisjZGVmaW5lIFZfUFJPVEVDVF9NT0RFKHgpICgoeCkgPDwgU19QUk9URUNUX01PREUpCisjZGVmaW5lIEZfUFJPVEVDVF9NT0RFICAgIFZfUFJPVEVDVF9NT0RFKDFVKQorCisjZGVmaW5lIFNfU1lOX0NPT0tJRV9BTEdPUklUSE0gICAgMjIKKyNkZWZpbmUgVl9TWU5fQ09PS0lFX0FMR09SSVRITSh4KSAoKHgpIDw8IFNfU1lOX0NPT0tJRV9BTEdPUklUSE0pCisjZGVmaW5lIEZfU1lOX0NPT0tJRV9BTEdPUklUSE0gICAgVl9TWU5fQ09PS0lFX0FMR09SSVRITSgxVSkKKworI2RlZmluZSBTX0FUVEFDS19GSUxURVIgICAgMjMKKyNkZWZpbmUgVl9BVFRBQ0tfRklMVEVSKHgpICgoeCkgPDwgU19BVFRBQ0tfRklMVEVSKQorI2RlZmluZSBGX0FUVEFDS19GSUxURVIgICAgVl9BVFRBQ0tfRklMVEVSKDFVKQorCisjZGVmaW5lIFNfSU5URVJGQUNFX1RZUEUgICAgMjQKKyNkZWZpbmUgVl9JTlRFUkZBQ0VfVFlQRSh4KSAoKHgpIDw8IFNfSU5URVJGQUNFX1RZUEUpCisjZGVmaW5lIEZfSU5URVJGQUNFX1RZUEUgICAgVl9JTlRFUkZBQ0VfVFlQRSgxVSkKKworI2RlZmluZSBTX0RJU0FCTEVfUlhfRkxPV19DT05UUk9MICAgIDI1CisjZGVmaW5lIFZfRElTQUJMRV9SWF9GTE9XX0NPTlRST0woeCkgKCh4KSA8PCBTX0RJU0FCTEVfUlhfRkxPV19DT05UUk9MKQorI2RlZmluZSBGX0RJU0FCTEVfUlhfRkxPV19DT05UUk9MICAgIFZfRElTQUJMRV9SWF9GTE9XX0NPTlRST0woMVUpCiAKICNkZWZpbmUgU19TWU5fQ09PS0lFX1BBUkFNRVRFUiAgICAyNgorI2RlZmluZSBNX1NZTl9DT09LSUVfUEFSQU1FVEVSICAgIDB4M2YKICNkZWZpbmUgVl9TWU5fQ09PS0lFX1BBUkFNRVRFUih4KSAoKHgpIDw8IFNfU1lOX0NPT0tJRV9QQVJBTUVURVIpCisjZGVmaW5lIEdfU1lOX0NPT0tJRV9QQVJBTUVURVIoeCkgKCgoeCkgPj4gU19TWU5fQ09PS0lFX1BBUkFNRVRFUikgJiBNX1NZTl9DT09LSUVfUEFSQU1FVEVSKQorCisjZGVmaW5lIEFfVFBfR0xPQkFMX1JYX0NSRURJVFMgMHgzMGMKKyNkZWZpbmUgQV9UUF9DTV9TSVpFIDB4MzEwCisjZGVmaW5lIEFfVFBfQ01fTU1fQkFTRSAweDMxNAorCisjZGVmaW5lIFNfQ01fTUVNTUdSX0JBU0UgICAgMAorI2RlZmluZSBNX0NNX01FTU1HUl9CQVNFICAgIDB4ZmZmZmZmZgorI2RlZmluZSBWX0NNX01FTU1HUl9CQVNFKHgpICgoeCkgPDwgU19DTV9NRU1NR1JfQkFTRSkKKyNkZWZpbmUgR19DTV9NRU1NR1JfQkFTRSh4KSAoKCh4KSA+PiBTX0NNX01FTU1HUl9CQVNFKSAmIE1fQ01fTUVNTUdSX0JBU0UpCisKKyNkZWZpbmUgQV9UUF9DTV9USU1FUl9CQVNFIDB4MzE4CisKKyNkZWZpbmUgU19DTV9USU1FUl9CQVNFICAgIDAKKyNkZWZpbmUgTV9DTV9USU1FUl9CQVNFICAgIDB4ZmZmZmZmZgorI2RlZmluZSBWX0NNX1RJTUVSX0JBU0UoeCkgKCh4KSA8PCBTX0NNX1RJTUVSX0JBU0UpCisjZGVmaW5lIEdfQ01fVElNRVJfQkFTRSh4KSAoKCh4KSA+PiBTX0NNX1RJTUVSX0JBU0UpICYgTV9DTV9USU1FUl9CQVNFKQorCisjZGVmaW5lIEFfVFBfUE1fU0laRSAweDMxYworI2RlZmluZSBBX1RQX1BNX1RYX0JBU0UgMHgzMjAKKyNkZWZpbmUgQV9UUF9QTV9ERUZSQUdfQkFTRSAweDMyNAorI2RlZmluZSBBX1RQX1BNX1JYX0JBU0UgMHgzMjgKKyNkZWZpbmUgQV9UUF9QTV9SWF9QR19TSVpFIDB4MzJjCisjZGVmaW5lIEFfVFBfUE1fUlhfTUFYX1BHUyAweDMzMAorI2RlZmluZSBBX1RQX1BNX1RYX1BHX1NJWkUgMHgzMzQKKyNkZWZpbmUgQV9UUF9QTV9UWF9NQVhfUEdTIDB4MzM4CisjZGVmaW5lIEFfVFBfVENQX09QVElPTlMgMHgzNDAKKworI2RlZmluZSBTX1RJTUVTVEFNUCAgICAwCisjZGVmaW5lIE1fVElNRVNUQU1QICAgIDB4MworI2RlZmluZSBWX1RJTUVTVEFNUCh4KSAoKHgpIDw8IFNfVElNRVNUQU1QKQorI2RlZmluZSBHX1RJTUVTVEFNUCh4KSAoKCh4KSA+PiBTX1RJTUVTVEFNUCkgJiBNX1RJTUVTVEFNUCkKKworI2RlZmluZSBTX1dJTkRPV19TQ0FMRSAgICAyCisjZGVmaW5lIE1fV0lORE9XX1NDQUxFICAgIDB4MworI2RlZmluZSBWX1dJTkRPV19TQ0FMRSh4KSAoKHgpIDw8IFNfV0lORE9XX1NDQUxFKQorI2RlZmluZSBHX1dJTkRPV19TQ0FMRSh4KSAoKCh4KSA+PiBTX1dJTkRPV19TQ0FMRSkgJiBNX1dJTkRPV19TQ0FMRSkKKworI2RlZmluZSBTX1NBQ0sgICAgNAorI2RlZmluZSBNX1NBQ0sgICAgMHgzCisjZGVmaW5lIFZfU0FDSyh4KSAoKHgpIDw8IFNfU0FDSykKKyNkZWZpbmUgR19TQUNLKHgpICgoKHgpID4+IFNfU0FDSykgJiBNX1NBQ0spCisKKyNkZWZpbmUgU19FQ04gICAgNgorI2RlZmluZSBNX0VDTiAgICAweDMKKyNkZWZpbmUgVl9FQ04oeCkgKCh4KSA8PCBTX0VDTikKKyNkZWZpbmUgR19FQ04oeCkgKCgoeCkgPj4gU19FQ04pICYgTV9FQ04pCisKKyNkZWZpbmUgU19TQUNLX0FMR09SSVRITSAgICA4CisjZGVmaW5lIE1fU0FDS19BTEdPUklUSE0gICAgMHgzCisjZGVmaW5lIFZfU0FDS19BTEdPUklUSE0oeCkgKCh4KSA8PCBTX1NBQ0tfQUxHT1JJVEhNKQorI2RlZmluZSBHX1NBQ0tfQUxHT1JJVEhNKHgpICgoKHgpID4+IFNfU0FDS19BTEdPUklUSE0pICYgTV9TQUNLX0FMR09SSVRITSkKKworI2RlZmluZSBTX01TUyAgICAxMAorI2RlZmluZSBWX01TUyh4KSAoKHgpIDw8IFNfTVNTKQorI2RlZmluZSBGX01TUyAgICBWX01TUygxVSkKKworI2RlZmluZSBTX0RFRkFVTFRfUEVFUl9NU1MgICAgMTYKKyNkZWZpbmUgTV9ERUZBVUxUX1BFRVJfTVNTICAgIDB4ZmZmZgorI2RlZmluZSBWX0RFRkFVTFRfUEVFUl9NU1MoeCkgKCh4KSA8PCBTX0RFRkFVTFRfUEVFUl9NU1MpCisjZGVmaW5lIEdfREVGQVVMVF9QRUVSX01TUyh4KSAoKCh4KSA+PiBTX0RFRkFVTFRfUEVFUl9NU1MpICYgTV9ERUZBVUxUX1BFRVJfTVNTKQorCisjZGVmaW5lIEFfVFBfREFDS19DT05GSUcgMHgzNDQKKworI2RlZmluZSBTX0RBQ0tfTU9ERSAgICAwCisjZGVmaW5lIFZfREFDS19NT0RFKHgpICgoeCkgPDwgU19EQUNLX01PREUpCisjZGVmaW5lIEZfREFDS19NT0RFICAgIFZfREFDS19NT0RFKDFVKQorCisjZGVmaW5lIFNfREFDS19BVVRPX01HTVQgICAgMQorI2RlZmluZSBWX0RBQ0tfQVVUT19NR01UKHgpICgoeCkgPDwgU19EQUNLX0FVVE9fTUdNVCkKKyNkZWZpbmUgRl9EQUNLX0FVVE9fTUdNVCAgICBWX0RBQ0tfQVVUT19NR01UKDFVKQorCisjZGVmaW5lIFNfREFDS19BVVRPX0NBUkVGVUwgICAgMgorI2RlZmluZSBWX0RBQ0tfQVVUT19DQVJFRlVMKHgpICgoeCkgPDwgU19EQUNLX0FVVE9fQ0FSRUZVTCkKKyNkZWZpbmUgRl9EQUNLX0FVVE9fQ0FSRUZVTCAgICBWX0RBQ0tfQVVUT19DQVJFRlVMKDFVKQorCisjZGVmaW5lIFNfREFDS19NU1NfU0VMRUNUT1IgICAgMworI2RlZmluZSBNX0RBQ0tfTVNTX1NFTEVDVE9SICAgIDB4MworI2RlZmluZSBWX0RBQ0tfTVNTX1NFTEVDVE9SKHgpICgoeCkgPDwgU19EQUNLX01TU19TRUxFQ1RPUikKKyNkZWZpbmUgR19EQUNLX01TU19TRUxFQ1RPUih4KSAoKCh4KSA+PiBTX0RBQ0tfTVNTX1NFTEVDVE9SKSAmIE1fREFDS19NU1NfU0VMRUNUT1IpCisKKyNkZWZpbmUgU19EQUNLX0JZVEVfVEhSRVNIT0xEICAgIDUKKyNkZWZpbmUgTV9EQUNLX0JZVEVfVEhSRVNIT0xEICAgIDB4ZmZmZmYKKyNkZWZpbmUgVl9EQUNLX0JZVEVfVEhSRVNIT0xEKHgpICgoeCkgPDwgU19EQUNLX0JZVEVfVEhSRVNIT0xEKQorI2RlZmluZSBHX0RBQ0tfQllURV9USFJFU0hPTEQoeCkgKCgoeCkgPj4gU19EQUNLX0JZVEVfVEhSRVNIT0xEKSAmIE1fREFDS19CWVRFX1RIUkVTSE9MRCkKIAogI2RlZmluZSBBX1RQX1BDX0NPTkZJRyAweDM0OAorCisjZGVmaW5lIFNfVFBfQUNDRVNTX0xBVEVOQ1kgICAgMAorI2RlZmluZSBNX1RQX0FDQ0VTU19MQVRFTkNZICAgIDB4ZgorI2RlZmluZSBWX1RQX0FDQ0VTU19MQVRFTkNZKHgpICgoeCkgPDwgU19UUF9BQ0NFU1NfTEFURU5DWSkKKyNkZWZpbmUgR19UUF9BQ0NFU1NfTEFURU5DWSh4KSAoKCh4KSA+PiBTX1RQX0FDQ0VTU19MQVRFTkNZKSAmIE1fVFBfQUNDRVNTX0xBVEVOQ1kpCisKKyNkZWZpbmUgU19IRUxEX0ZJTl9ESVNBQkxFICAgIDQKKyNkZWZpbmUgVl9IRUxEX0ZJTl9ESVNBQkxFKHgpICgoeCkgPDwgU19IRUxEX0ZJTl9ESVNBQkxFKQorI2RlZmluZSBGX0hFTERfRklOX0RJU0FCTEUgICAgVl9IRUxEX0ZJTl9ESVNBQkxFKDFVKQorCisjZGVmaW5lIFNfRERQX0ZDX0VOQUJMRSAgICA1CisjZGVmaW5lIFZfRERQX0ZDX0VOQUJMRSh4KSAoKHgpIDw8IFNfRERQX0ZDX0VOQUJMRSkKKyNkZWZpbmUgRl9ERFBfRkNfRU5BQkxFICAgIFZfRERQX0ZDX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX1JETUFfRVJSX0VOQUJMRSAgICA2CisjZGVmaW5lIFZfUkRNQV9FUlJfRU5BQkxFKHgpICgoeCkgPDwgU19SRE1BX0VSUl9FTkFCTEUpCisjZGVmaW5lIEZfUkRNQV9FUlJfRU5BQkxFICAgIFZfUkRNQV9FUlJfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfRkFTVF9QRFVfREVMSVZFUlkgICAgNworI2RlZmluZSBWX0ZBU1RfUERVX0RFTElWRVJZKHgpICgoeCkgPDwgU19GQVNUX1BEVV9ERUxJVkVSWSkKKyNkZWZpbmUgRl9GQVNUX1BEVV9ERUxJVkVSWSAgICBWX0ZBU1RfUERVX0RFTElWRVJZKDFVKQorCisjZGVmaW5lIFNfQ0xFQVJfRklOICAgIDgKKyNkZWZpbmUgVl9DTEVBUl9GSU4oeCkgKCh4KSA8PCBTX0NMRUFSX0ZJTikKKyNkZWZpbmUgRl9DTEVBUl9GSU4gICAgVl9DTEVBUl9GSU4oMVUpCisKICNkZWZpbmUgU19ESVNfVFhfRklMTF9XSU5fUFVTSCAgICAxMgogI2RlZmluZSBWX0RJU19UWF9GSUxMX1dJTl9QVVNIKHgpICgoeCkgPDwgU19ESVNfVFhfRklMTF9XSU5fUFVTSCkKICNkZWZpbmUgRl9ESVNfVFhfRklMTF9XSU5fUFVTSCAgICBWX0RJU19UWF9GSUxMX1dJTl9QVVNIKDFVKQogCiAjZGVmaW5lIFNfVFBfUENfUkVWICAgIDMwCiAjZGVmaW5lIE1fVFBfUENfUkVWICAgIDB4MworI2RlZmluZSBWX1RQX1BDX1JFVih4KSAoKHgpIDw8IFNfVFBfUENfUkVWKQogI2RlZmluZSBHX1RQX1BDX1JFVih4KSAoKCh4KSA+PiBTX1RQX1BDX1JFVikgJiBNX1RQX1BDX1JFVikKKworI2RlZmluZSBBX1RQX0JBQ0tPRkYwIDB4MzUwCisKKyNkZWZpbmUgU19FTEVNRU5UMCAgICAwCisjZGVmaW5lIE1fRUxFTUVOVDAgICAgMHhmZgorI2RlZmluZSBWX0VMRU1FTlQwKHgpICgoeCkgPDwgU19FTEVNRU5UMCkKKyNkZWZpbmUgR19FTEVNRU5UMCh4KSAoKCh4KSA+PiBTX0VMRU1FTlQwKSAmIE1fRUxFTUVOVDApCisKKyNkZWZpbmUgU19FTEVNRU5UMSAgICA4CisjZGVmaW5lIE1fRUxFTUVOVDEgICAgMHhmZgorI2RlZmluZSBWX0VMRU1FTlQxKHgpICgoeCkgPDwgU19FTEVNRU5UMSkKKyNkZWZpbmUgR19FTEVNRU5UMSh4KSAoKCh4KSA+PiBTX0VMRU1FTlQxKSAmIE1fRUxFTUVOVDEpCisKKyNkZWZpbmUgU19FTEVNRU5UMiAgICAxNgorI2RlZmluZSBNX0VMRU1FTlQyICAgIDB4ZmYKKyNkZWZpbmUgVl9FTEVNRU5UMih4KSAoKHgpIDw8IFNfRUxFTUVOVDIpCisjZGVmaW5lIEdfRUxFTUVOVDIoeCkgKCgoeCkgPj4gU19FTEVNRU5UMikgJiBNX0VMRU1FTlQyKQorCisjZGVmaW5lIFNfRUxFTUVOVDMgICAgMjQKKyNkZWZpbmUgTV9FTEVNRU5UMyAgICAweGZmCisjZGVmaW5lIFZfRUxFTUVOVDMoeCkgKCh4KSA8PCBTX0VMRU1FTlQzKQorI2RlZmluZSBHX0VMRU1FTlQzKHgpICgoKHgpID4+IFNfRUxFTUVOVDMpICYgTV9FTEVNRU5UMykKKworI2RlZmluZSBBX1RQX0JBQ0tPRkYxIDB4MzU0CisjZGVmaW5lIEFfVFBfQkFDS09GRjIgMHgzNTgKKyNkZWZpbmUgQV9UUF9CQUNLT0ZGMyAweDM1YworI2RlZmluZSBBX1RQX1BBUkFfUkVHMCAweDM2MAorCisjZGVmaW5lIFNfVkFSX01VTFQgICAgMAorI2RlZmluZSBNX1ZBUl9NVUxUICAgIDB4ZgorI2RlZmluZSBWX1ZBUl9NVUxUKHgpICgoeCkgPDwgU19WQVJfTVVMVCkKKyNkZWZpbmUgR19WQVJfTVVMVCh4KSAoKCh4KSA+PiBTX1ZBUl9NVUxUKSAmIE1fVkFSX01VTFQpCisKKyNkZWZpbmUgU19WQVJfR0FJTiAgICA0CisjZGVmaW5lIE1fVkFSX0dBSU4gICAgMHhmCisjZGVmaW5lIFZfVkFSX0dBSU4oeCkgKCh4KSA8PCBTX1ZBUl9HQUlOKQorI2RlZmluZSBHX1ZBUl9HQUlOKHgpICgoKHgpID4+IFNfVkFSX0dBSU4pICYgTV9WQVJfR0FJTikKKworI2RlZmluZSBTX1NSVFRfR0FJTiAgICA4CisjZGVmaW5lIE1fU1JUVF9HQUlOICAgIDB4ZgorI2RlZmluZSBWX1NSVFRfR0FJTih4KSAoKHgpIDw8IFNfU1JUVF9HQUlOKQorI2RlZmluZSBHX1NSVFRfR0FJTih4KSAoKCh4KSA+PiBTX1NSVFRfR0FJTikgJiBNX1NSVFRfR0FJTikKKworI2RlZmluZSBTX1JUVFZBUl9JTklUICAgIDEyCisjZGVmaW5lIE1fUlRUVkFSX0lOSVQgICAgMHhmCisjZGVmaW5lIFZfUlRUVkFSX0lOSVQoeCkgKCh4KSA8PCBTX1JUVFZBUl9JTklUKQorI2RlZmluZSBHX1JUVFZBUl9JTklUKHgpICgoKHgpID4+IFNfUlRUVkFSX0lOSVQpICYgTV9SVFRWQVJfSU5JVCkKKworI2RlZmluZSBTX0RVUF9USFJFU0ggICAgMjAKKyNkZWZpbmUgTV9EVVBfVEhSRVNIICAgIDB4ZgorI2RlZmluZSBWX0RVUF9USFJFU0goeCkgKCh4KSA8PCBTX0RVUF9USFJFU0gpCisjZGVmaW5lIEdfRFVQX1RIUkVTSCh4KSAoKCh4KSA+PiBTX0RVUF9USFJFU0gpICYgTV9EVVBfVEhSRVNIKQorCisjZGVmaW5lIFNfSU5JVF9DT05HX1dJTiAgICAyNAorI2RlZmluZSBNX0lOSVRfQ09OR19XSU4gICAgMHg3CisjZGVmaW5lIFZfSU5JVF9DT05HX1dJTih4KSAoKHgpIDw8IFNfSU5JVF9DT05HX1dJTikKKyNkZWZpbmUgR19JTklUX0NPTkdfV0lOKHgpICgoKHgpID4+IFNfSU5JVF9DT05HX1dJTikgJiBNX0lOSVRfQ09OR19XSU4pCisKKyNkZWZpbmUgQV9UUF9QQVJBX1JFRzEgMHgzNjQKKworI2RlZmluZSBTX0lOSVRJQUxfU0xPV19TVEFSVF9USFJFU0hPTEQgICAgMAorI2RlZmluZSBNX0lOSVRJQUxfU0xPV19TVEFSVF9USFJFU0hPTEQgICAgMHhmZmZmCisjZGVmaW5lIFZfSU5JVElBTF9TTE9XX1NUQVJUX1RIUkVTSE9MRCh4KSAoKHgpIDw8IFNfSU5JVElBTF9TTE9XX1NUQVJUX1RIUkVTSE9MRCkKKyNkZWZpbmUgR19JTklUSUFMX1NMT1dfU1RBUlRfVEhSRVNIT0xEKHgpICgoKHgpID4+IFNfSU5JVElBTF9TTE9XX1NUQVJUX1RIUkVTSE9MRCkgJiBNX0lOSVRJQUxfU0xPV19TVEFSVF9USFJFU0hPTEQpCisKKyNkZWZpbmUgU19SRUNFSVZFX0JVRkZFUl9TSVpFICAgIDE2CisjZGVmaW5lIE1fUkVDRUlWRV9CVUZGRVJfU0laRSAgICAweGZmZmYKKyNkZWZpbmUgVl9SRUNFSVZFX0JVRkZFUl9TSVpFKHgpICgoeCkgPDwgU19SRUNFSVZFX0JVRkZFUl9TSVpFKQorI2RlZmluZSBHX1JFQ0VJVkVfQlVGRkVSX1NJWkUoeCkgKCgoeCkgPj4gU19SRUNFSVZFX0JVRkZFUl9TSVpFKSAmIE1fUkVDRUlWRV9CVUZGRVJfU0laRSkKKworI2RlZmluZSBBX1RQX1BBUkFfUkVHMiAweDM2OAorCisjZGVmaW5lIFNfUlhfQ09BTEVTQ0VfU0laRSAgICAwCisjZGVmaW5lIE1fUlhfQ09BTEVTQ0VfU0laRSAgICAweGZmZmYKKyNkZWZpbmUgVl9SWF9DT0FMRVNDRV9TSVpFKHgpICgoeCkgPDwgU19SWF9DT0FMRVNDRV9TSVpFKQorI2RlZmluZSBHX1JYX0NPQUxFU0NFX1NJWkUoeCkgKCgoeCkgPj4gU19SWF9DT0FMRVNDRV9TSVpFKSAmIE1fUlhfQ09BTEVTQ0VfU0laRSkKKworI2RlZmluZSBTX01BWF9SWF9TSVpFICAgIDE2CisjZGVmaW5lIE1fTUFYX1JYX1NJWkUgICAgMHhmZmZmCisjZGVmaW5lIFZfTUFYX1JYX1NJWkUoeCkgKCh4KSA8PCBTX01BWF9SWF9TSVpFKQorI2RlZmluZSBHX01BWF9SWF9TSVpFKHgpICgoKHgpID4+IFNfTUFYX1JYX1NJWkUpICYgTV9NQVhfUlhfU0laRSkKKworI2RlZmluZSBBX1RQX1BBUkFfUkVHMyAweDM2YworCisjZGVmaW5lIFNfUlhfQ09BTEVTQ0lOR19QU0hfREVMSVZFUiAgICAwCisjZGVmaW5lIFZfUlhfQ09BTEVTQ0lOR19QU0hfREVMSVZFUih4KSAoKHgpIDw8IFNfUlhfQ09BTEVTQ0lOR19QU0hfREVMSVZFUikKKyNkZWZpbmUgRl9SWF9DT0FMRVNDSU5HX1BTSF9ERUxJVkVSICAgIFZfUlhfQ09BTEVTQ0lOR19QU0hfREVMSVZFUigxVSkKKworI2RlZmluZSBTX1JYX0NPQUxFU0NJTkdfRU5BQkxFICAgIDEKKyNkZWZpbmUgVl9SWF9DT0FMRVNDSU5HX0VOQUJMRSh4KSAoKHgpIDw8IFNfUlhfQ09BTEVTQ0lOR19FTkFCTEUpCisjZGVmaW5lIEZfUlhfQ09BTEVTQ0lOR19FTkFCTEUgICAgVl9SWF9DT0FMRVNDSU5HX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX1RBSE9FX0VOQUJMRSAgICAyCisjZGVmaW5lIFZfVEFIT0VfRU5BQkxFKHgpICgoeCkgPDwgU19UQUhPRV9FTkFCTEUpCisjZGVmaW5lIEZfVEFIT0VfRU5BQkxFICAgIFZfVEFIT0VfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFYX1JFT1JERVJfRlJBR01FTlRTICAgIDEyCisjZGVmaW5lIE1fTUFYX1JFT1JERVJfRlJBR01FTlRTICAgIDB4NworI2RlZmluZSBWX01BWF9SRU9SREVSX0ZSQUdNRU5UUyh4KSAoKHgpIDw8IFNfTUFYX1JFT1JERVJfRlJBR01FTlRTKQorI2RlZmluZSBHX01BWF9SRU9SREVSX0ZSQUdNRU5UUyh4KSAoKCh4KSA+PiBTX01BWF9SRU9SREVSX0ZSQUdNRU5UUykgJiBNX01BWF9SRU9SREVSX0ZSQUdNRU5UUykKKworI2RlZmluZSBBX1RQX1RJTUVSX1JFU09MVVRJT04gMHgzOTAKKworI2RlZmluZSBTX0RFTEFZRURfQUNLX1RJTUVSX1JFU09MVVRJT04gICAgMAorI2RlZmluZSBNX0RFTEFZRURfQUNLX1RJTUVSX1JFU09MVVRJT04gICAgMHgzZgorI2RlZmluZSBWX0RFTEFZRURfQUNLX1RJTUVSX1JFU09MVVRJT04oeCkgKCh4KSA8PCBTX0RFTEFZRURfQUNLX1RJTUVSX1JFU09MVVRJT04pCisjZGVmaW5lIEdfREVMQVlFRF9BQ0tfVElNRVJfUkVTT0xVVElPTih4KSAoKCh4KSA+PiBTX0RFTEFZRURfQUNLX1RJTUVSX1JFU09MVVRJT04pICYgTV9ERUxBWUVEX0FDS19USU1FUl9SRVNPTFVUSU9OKQorCisjZGVmaW5lIFNfR0VORVJJQ19USU1FUl9SRVNPTFVUSU9OICAgIDE2CisjZGVmaW5lIE1fR0VORVJJQ19USU1FUl9SRVNPTFVUSU9OICAgIDB4M2YKKyNkZWZpbmUgVl9HRU5FUklDX1RJTUVSX1JFU09MVVRJT04oeCkgKCh4KSA8PCBTX0dFTkVSSUNfVElNRVJfUkVTT0xVVElPTikKKyNkZWZpbmUgR19HRU5FUklDX1RJTUVSX1JFU09MVVRJT04oeCkgKCgoeCkgPj4gU19HRU5FUklDX1RJTUVSX1JFU09MVVRJT04pICYgTV9HRU5FUklDX1RJTUVSX1JFU09MVVRJT04pCisKKyNkZWZpbmUgQV9UUF8yTVNMIDB4Mzk0CisKKyNkZWZpbmUgU18yTVNMICAgIDAKKyNkZWZpbmUgTV8yTVNMICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgVl8yTVNMKHgpICgoeCkgPDwgU18yTVNMKQorI2RlZmluZSBHXzJNU0woeCkgKCgoeCkgPj4gU18yTVNMKSAmIE1fMk1TTCkKKworI2RlZmluZSBBX1RQX1JYVF9NSU4gMHgzOTgKKworI2RlZmluZSBTX1JFVFJBTlNNSVRfVElNRVJfTUlOICAgIDAKKyNkZWZpbmUgTV9SRVRSQU5TTUlUX1RJTUVSX01JTiAgICAweGZmZmYKKyNkZWZpbmUgVl9SRVRSQU5TTUlUX1RJTUVSX01JTih4KSAoKHgpIDw8IFNfUkVUUkFOU01JVF9USU1FUl9NSU4pCisjZGVmaW5lIEdfUkVUUkFOU01JVF9USU1FUl9NSU4oeCkgKCgoeCkgPj4gU19SRVRSQU5TTUlUX1RJTUVSX01JTikgJiBNX1JFVFJBTlNNSVRfVElNRVJfTUlOKQorCisjZGVmaW5lIEFfVFBfUlhUX01BWCAweDM5YworCisjZGVmaW5lIFNfUkVUUkFOU01JVF9USU1FUl9NQVggICAgMAorI2RlZmluZSBNX1JFVFJBTlNNSVRfVElNRVJfTUFYICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgVl9SRVRSQU5TTUlUX1RJTUVSX01BWCh4KSAoKHgpIDw8IFNfUkVUUkFOU01JVF9USU1FUl9NQVgpCisjZGVmaW5lIEdfUkVUUkFOU01JVF9USU1FUl9NQVgoeCkgKCgoeCkgPj4gU19SRVRSQU5TTUlUX1RJTUVSX01BWCkgJiBNX1JFVFJBTlNNSVRfVElNRVJfTUFYKQorCisjZGVmaW5lIEFfVFBfUEVSU19NSU4gMHgzYTAKKworI2RlZmluZSBTX1BFUlNJU1RfVElNRVJfTUlOICAgIDAKKyNkZWZpbmUgTV9QRVJTSVNUX1RJTUVSX01JTiAgICAweGZmZmYKKyNkZWZpbmUgVl9QRVJTSVNUX1RJTUVSX01JTih4KSAoKHgpIDw8IFNfUEVSU0lTVF9USU1FUl9NSU4pCisjZGVmaW5lIEdfUEVSU0lTVF9USU1FUl9NSU4oeCkgKCgoeCkgPj4gU19QRVJTSVNUX1RJTUVSX01JTikgJiBNX1BFUlNJU1RfVElNRVJfTUlOKQorCisjZGVmaW5lIEFfVFBfUEVSU19NQVggMHgzYTQKKworI2RlZmluZSBTX1BFUlNJU1RfVElNRVJfTUFYICAgIDAKKyNkZWZpbmUgTV9QRVJTSVNUX1RJTUVSX01BWCAgICAweDNmZmZmZmZmCisjZGVmaW5lIFZfUEVSU0lTVF9USU1FUl9NQVgoeCkgKCh4KSA8PCBTX1BFUlNJU1RfVElNRVJfTUFYKQorI2RlZmluZSBHX1BFUlNJU1RfVElNRVJfTUFYKHgpICgoKHgpID4+IFNfUEVSU0lTVF9USU1FUl9NQVgpICYgTV9QRVJTSVNUX1RJTUVSX01BWCkKKworI2RlZmluZSBBX1RQX0tFRVBfSURMRSAweDNhYworCisjZGVmaW5lIFNfS0VFUF9BTElWRV9JRExFX1RJTUUgICAgMAorI2RlZmluZSBNX0tFRVBfQUxJVkVfSURMRV9USU1FICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgVl9LRUVQX0FMSVZFX0lETEVfVElNRSh4KSAoKHgpIDw8IFNfS0VFUF9BTElWRV9JRExFX1RJTUUpCisjZGVmaW5lIEdfS0VFUF9BTElWRV9JRExFX1RJTUUoeCkgKCgoeCkgPj4gU19LRUVQX0FMSVZFX0lETEVfVElNRSkgJiBNX0tFRVBfQUxJVkVfSURMRV9USU1FKQorCisjZGVmaW5lIEFfVFBfS0VFUF9JTlRWTCAweDNiMAorCisjZGVmaW5lIFNfS0VFUF9BTElWRV9JTlRFUlZBTF9USU1FICAgIDAKKyNkZWZpbmUgTV9LRUVQX0FMSVZFX0lOVEVSVkFMX1RJTUUgICAgMHgzZmZmZmZmZgorI2RlZmluZSBWX0tFRVBfQUxJVkVfSU5URVJWQUxfVElNRSh4KSAoKHgpIDw8IFNfS0VFUF9BTElWRV9JTlRFUlZBTF9USU1FKQorI2RlZmluZSBHX0tFRVBfQUxJVkVfSU5URVJWQUxfVElNRSh4KSAoKCh4KSA+PiBTX0tFRVBfQUxJVkVfSU5URVJWQUxfVElNRSkgJiBNX0tFRVBfQUxJVkVfSU5URVJWQUxfVElNRSkKKworI2RlZmluZSBBX1RQX0lOSVRfU1JUVCAweDNiNAorCisjZGVmaW5lIFNfSU5JVElBTF9TUlRUICAgIDAKKyNkZWZpbmUgTV9JTklUSUFMX1NSVFQgICAgMHhmZmZmCisjZGVmaW5lIFZfSU5JVElBTF9TUlRUKHgpICgoeCkgPDwgU19JTklUSUFMX1NSVFQpCisjZGVmaW5lIEdfSU5JVElBTF9TUlRUKHgpICgoKHgpID4+IFNfSU5JVElBTF9TUlRUKSAmIE1fSU5JVElBTF9TUlRUKQorCisjZGVmaW5lIEFfVFBfREFDS19USU1FIDB4M2I4CisKKyNkZWZpbmUgU19ERUxBWUVEX0FDS19USU1FICAgIDAKKyNkZWZpbmUgTV9ERUxBWUVEX0FDS19USU1FICAgIDB4N2ZmCisjZGVmaW5lIFZfREVMQVlFRF9BQ0tfVElNRSh4KSAoKHgpIDw8IFNfREVMQVlFRF9BQ0tfVElNRSkKKyNkZWZpbmUgR19ERUxBWUVEX0FDS19USU1FKHgpICgoKHgpID4+IFNfREVMQVlFRF9BQ0tfVElNRSkgJiBNX0RFTEFZRURfQUNLX1RJTUUpCisKKyNkZWZpbmUgQV9UUF9GSU5XQUlUMl9USU1FIDB4M2JjCisKKyNkZWZpbmUgU19GSU5XQUlUMl9USU1FICAgIDAKKyNkZWZpbmUgTV9GSU5XQUlUMl9USU1FICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgVl9GSU5XQUlUMl9USU1FKHgpICgoeCkgPDwgU19GSU5XQUlUMl9USU1FKQorI2RlZmluZSBHX0ZJTldBSVQyX1RJTUUoeCkgKCgoeCkgPj4gU19GSU5XQUlUMl9USU1FKSAmIE1fRklOV0FJVDJfVElNRSkKKworI2RlZmluZSBBX1RQX0ZBU1RfRklOV0FJVDJfVElNRSAweDNjMAorCisjZGVmaW5lIFNfRkFTVF9GSU5XQUlUMl9USU1FICAgIDAKKyNkZWZpbmUgTV9GQVNUX0ZJTldBSVQyX1RJTUUgICAgMHgzZmZmZmZmZgorI2RlZmluZSBWX0ZBU1RfRklOV0FJVDJfVElNRSh4KSAoKHgpIDw8IFNfRkFTVF9GSU5XQUlUMl9USU1FKQorI2RlZmluZSBHX0ZBU1RfRklOV0FJVDJfVElNRSh4KSAoKCh4KSA+PiBTX0ZBU1RfRklOV0FJVDJfVElNRSkgJiBNX0ZBU1RfRklOV0FJVDJfVElNRSkKKworI2RlZmluZSBBX1RQX1NISUZUX0NOVCAweDNjNAorCisjZGVmaW5lIFNfS0VFUEFMSVZFX01BWCAgICAwCisjZGVmaW5lIE1fS0VFUEFMSVZFX01BWCAgICAweGZmCisjZGVmaW5lIFZfS0VFUEFMSVZFX01BWCh4KSAoKHgpIDw8IFNfS0VFUEFMSVZFX01BWCkKKyNkZWZpbmUgR19LRUVQQUxJVkVfTUFYKHgpICgoKHgpID4+IFNfS0VFUEFMSVZFX01BWCkgJiBNX0tFRVBBTElWRV9NQVgpCisKKyNkZWZpbmUgU19XSU5ET1dQUk9CRV9NQVggICAgOAorI2RlZmluZSBNX1dJTkRPV1BST0JFX01BWCAgICAweGZmCisjZGVmaW5lIFZfV0lORE9XUFJPQkVfTUFYKHgpICgoeCkgPDwgU19XSU5ET1dQUk9CRV9NQVgpCisjZGVmaW5lIEdfV0lORE9XUFJPQkVfTUFYKHgpICgoKHgpID4+IFNfV0lORE9XUFJPQkVfTUFYKSAmIE1fV0lORE9XUFJPQkVfTUFYKQorCisjZGVmaW5lIFNfUkVUUkFOU01JU1NJT05fTUFYICAgIDE2CisjZGVmaW5lIE1fUkVUUkFOU01JU1NJT05fTUFYICAgIDB4ZmYKKyNkZWZpbmUgVl9SRVRSQU5TTUlTU0lPTl9NQVgoeCkgKCh4KSA8PCBTX1JFVFJBTlNNSVNTSU9OX01BWCkKKyNkZWZpbmUgR19SRVRSQU5TTUlTU0lPTl9NQVgoeCkgKCgoeCkgPj4gU19SRVRSQU5TTUlTU0lPTl9NQVgpICYgTV9SRVRSQU5TTUlTU0lPTl9NQVgpCisKKyNkZWZpbmUgU19TWU5fTUFYICAgIDI0CisjZGVmaW5lIE1fU1lOX01BWCAgICAweGZmCisjZGVmaW5lIFZfU1lOX01BWCh4KSAoKHgpIDw8IFNfU1lOX01BWCkKKyNkZWZpbmUgR19TWU5fTUFYKHgpICgoKHgpID4+IFNfU1lOX01BWCkgJiBNX1NZTl9NQVgpCisKKyNkZWZpbmUgQV9UUF9RT1NfUkVHMCAweDNlMAorCisjZGVmaW5lIFNfTDNfVkFMVUUgICAgMAorI2RlZmluZSBNX0wzX1ZBTFVFICAgIDB4M2YKKyNkZWZpbmUgVl9MM19WQUxVRSh4KSAoKHgpIDw8IFNfTDNfVkFMVUUpCisjZGVmaW5lIEdfTDNfVkFMVUUoeCkgKCgoeCkgPj4gU19MM19WQUxVRSkgJiBNX0wzX1ZBTFVFKQorCisjZGVmaW5lIEFfVFBfUU9TX1JFRzEgMHgzZTQKKyNkZWZpbmUgQV9UUF9RT1NfUkVHMiAweDNlOAorI2RlZmluZSBBX1RQX1FPU19SRUczIDB4M2VjCisjZGVmaW5lIEFfVFBfUU9TX1JFRzQgMHgzZjAKKyNkZWZpbmUgQV9UUF9RT1NfUkVHNSAweDNmNAorI2RlZmluZSBBX1RQX1FPU19SRUc2IDB4M2Y4CisjZGVmaW5lIEFfVFBfUU9TX1JFRzcgMHgzZmMKKyNkZWZpbmUgQV9UUF9NVFVfUkVHMCAweDQwNAorI2RlZmluZSBBX1RQX01UVV9SRUcxIDB4NDA4CisjZGVmaW5lIEFfVFBfTVRVX1JFRzIgMHg0MGMKKyNkZWZpbmUgQV9UUF9NVFVfUkVHMyAweDQxMAorI2RlZmluZSBBX1RQX01UVV9SRUc0IDB4NDE0CisjZGVmaW5lIEFfVFBfTVRVX1JFRzUgMHg0MTgKKyNkZWZpbmUgQV9UUF9NVFVfUkVHNiAweDQxYworI2RlZmluZSBBX1RQX01UVV9SRUc3IDB4NDIwCiAjZGVmaW5lIEFfVFBfUkVTRVQgMHg0NGMKKwogI2RlZmluZSBTX1RQX1JFU0VUICAgIDAKICNkZWZpbmUgVl9UUF9SRVNFVCh4KSAoKHgpIDw8IFNfVFBfUkVTRVQpCiAjZGVmaW5lIEZfVFBfUkVTRVQgICAgVl9UUF9SRVNFVCgxVSkKIAorI2RlZmluZSBTX0NNX01FTU1HUl9JTklUICAgIDEKKyNkZWZpbmUgVl9DTV9NRU1NR1JfSU5JVCh4KSAoKHgpIDw8IFNfQ01fTUVNTUdSX0lOSVQpCisjZGVmaW5lIEZfQ01fTUVNTUdSX0lOSVQgICAgVl9DTV9NRU1NR1JfSU5JVCgxVSkKKworI2RlZmluZSBBX1RQX01JQl9JTkRFWCAweDQ1MAorI2RlZmluZSBBX1RQX01JQl9EQVRBIDB4NDU0CisjZGVmaW5lIEFfVFBfU1lOQ19USU1FX0hJIDB4NDU4CisjZGVmaW5lIEFfVFBfU1lOQ19USU1FX0xPIDB4NDVjCisjZGVmaW5lIEFfVFBfQ01fTU1fUlhfRkxTVF9CQVNFIDB4NDYwCisKKyNkZWZpbmUgU19DTV9NRU1NR1JfUlhfRlJFRV9MSVNUX0JBU0UgICAgMAorI2RlZmluZSBNX0NNX01FTU1HUl9SWF9GUkVFX0xJU1RfQkFTRSAgICAweGZmZmZmZmYKKyNkZWZpbmUgVl9DTV9NRU1NR1JfUlhfRlJFRV9MSVNUX0JBU0UoeCkgKCh4KSA8PCBTX0NNX01FTU1HUl9SWF9GUkVFX0xJU1RfQkFTRSkKKyNkZWZpbmUgR19DTV9NRU1NR1JfUlhfRlJFRV9MSVNUX0JBU0UoeCkgKCgoeCkgPj4gU19DTV9NRU1NR1JfUlhfRlJFRV9MSVNUX0JBU0UpICYgTV9DTV9NRU1NR1JfUlhfRlJFRV9MSVNUX0JBU0UpCisKKyNkZWZpbmUgQV9UUF9DTV9NTV9UWF9GTFNUX0JBU0UgMHg0NjQKKworI2RlZmluZSBTX0NNX01FTU1HUl9UWF9GUkVFX0xJU1RfQkFTRSAgICAwCisjZGVmaW5lIE1fQ01fTUVNTUdSX1RYX0ZSRUVfTElTVF9CQVNFICAgIDB4ZmZmZmZmZgorI2RlZmluZSBWX0NNX01FTU1HUl9UWF9GUkVFX0xJU1RfQkFTRSh4KSAoKHgpIDw8IFNfQ01fTUVNTUdSX1RYX0ZSRUVfTElTVF9CQVNFKQorI2RlZmluZSBHX0NNX01FTU1HUl9UWF9GUkVFX0xJU1RfQkFTRSh4KSAoKCh4KSA+PiBTX0NNX01FTU1HUl9UWF9GUkVFX0xJU1RfQkFTRSkgJiBNX0NNX01FTU1HUl9UWF9GUkVFX0xJU1RfQkFTRSkKKworI2RlZmluZSBBX1RQX0NNX01NX1BfRkxTVF9CQVNFIDB4NDY4CisKKyNkZWZpbmUgU19DTV9NRU1NR1JfUFNUUlVDVF9GUkVFX0xJU1RfQkFTRSAgICAwCisjZGVmaW5lIE1fQ01fTUVNTUdSX1BTVFJVQ1RfRlJFRV9MSVNUX0JBU0UgICAgMHhmZmZmZmZmCisjZGVmaW5lIFZfQ01fTUVNTUdSX1BTVFJVQ1RfRlJFRV9MSVNUX0JBU0UoeCkgKCh4KSA8PCBTX0NNX01FTU1HUl9QU1RSVUNUX0ZSRUVfTElTVF9CQVNFKQorI2RlZmluZSBHX0NNX01FTU1HUl9QU1RSVUNUX0ZSRUVfTElTVF9CQVNFKHgpICgoKHgpID4+IFNfQ01fTUVNTUdSX1BTVFJVQ1RfRlJFRV9MSVNUX0JBU0UpICYgTV9DTV9NRU1NR1JfUFNUUlVDVF9GUkVFX0xJU1RfQkFTRSkKKworI2RlZmluZSBBX1RQX0NNX01NX01BWF9QIDB4NDZjCisKKyNkZWZpbmUgU19DTV9NRU1NR1JfTUFYX1BTVFJVQ1QgICAgMAorI2RlZmluZSBNX0NNX01FTU1HUl9NQVhfUFNUUlVDVCAgICAweGZmZmZmZmYKKyNkZWZpbmUgVl9DTV9NRU1NR1JfTUFYX1BTVFJVQ1QoeCkgKCh4KSA8PCBTX0NNX01FTU1HUl9NQVhfUFNUUlVDVCkKKyNkZWZpbmUgR19DTV9NRU1NR1JfTUFYX1BTVFJVQ1QoeCkgKCgoeCkgPj4gU19DTV9NRU1NR1JfTUFYX1BTVFJVQ1QpICYgTV9DTV9NRU1NR1JfTUFYX1BTVFJVQ1QpCisKICNkZWZpbmUgQV9UUF9JTlRfRU5BQkxFIDB4NDcwCisKKyNkZWZpbmUgU19UWF9GUkVFX0xJU1RfRU1QVFkgICAgMAorI2RlZmluZSBWX1RYX0ZSRUVfTElTVF9FTVBUWSh4KSAoKHgpIDw8IFNfVFhfRlJFRV9MSVNUX0VNUFRZKQorI2RlZmluZSBGX1RYX0ZSRUVfTElTVF9FTVBUWSAgICBWX1RYX0ZSRUVfTElTVF9FTVBUWSgxVSkKKworI2RlZmluZSBTX1JYX0ZSRUVfTElTVF9FTVBUWSAgICAxCisjZGVmaW5lIFZfUlhfRlJFRV9MSVNUX0VNUFRZKHgpICgoeCkgPDwgU19SWF9GUkVFX0xJU1RfRU1QVFkpCisjZGVmaW5lIEZfUlhfRlJFRV9MSVNUX0VNUFRZICAgIFZfUlhfRlJFRV9MSVNUX0VNUFRZKDFVKQorCiAjZGVmaW5lIEFfVFBfSU5UX0NBVVNFIDB4NDc0CisjZGVmaW5lIEFfVFBfVElNRVJfU0VQQVJBVE9SIDB4NGE0CisKKyNkZWZpbmUgU19ESVNBQkxFX1BBU1RfVElNRVJfSU5TRVJUSU9OICAgIDAKKyNkZWZpbmUgVl9ESVNBQkxFX1BBU1RfVElNRVJfSU5TRVJUSU9OKHgpICgoeCkgPDwgU19ESVNBQkxFX1BBU1RfVElNRVJfSU5TRVJUSU9OKQorI2RlZmluZSBGX0RJU0FCTEVfUEFTVF9USU1FUl9JTlNFUlRJT04gICAgVl9ESVNBQkxFX1BBU1RfVElNRVJfSU5TRVJUSU9OKDFVKQorCisjZGVmaW5lIFNfTU9EVUxBVElPTl9USU1FUl9TRVBBUkFUT1IgICAgMQorI2RlZmluZSBNX01PRFVMQVRJT05fVElNRVJfU0VQQVJBVE9SICAgIDB4N2ZmZgorI2RlZmluZSBWX01PRFVMQVRJT05fVElNRVJfU0VQQVJBVE9SKHgpICgoeCkgPDwgU19NT0RVTEFUSU9OX1RJTUVSX1NFUEFSQVRPUikKKyNkZWZpbmUgR19NT0RVTEFUSU9OX1RJTUVSX1NFUEFSQVRPUih4KSAoKCh4KSA+PiBTX01PRFVMQVRJT05fVElNRVJfU0VQQVJBVE9SKSAmIE1fTU9EVUxBVElPTl9USU1FUl9TRVBBUkFUT1IpCisKKyNkZWZpbmUgU19HTE9CQUxfVElNRVJfU0VQQVJBVE9SICAgIDE2CisjZGVmaW5lIE1fR0xPQkFMX1RJTUVSX1NFUEFSQVRPUiAgICAweGZmZmYKKyNkZWZpbmUgVl9HTE9CQUxfVElNRVJfU0VQQVJBVE9SKHgpICgoeCkgPDwgU19HTE9CQUxfVElNRVJfU0VQQVJBVE9SKQorI2RlZmluZSBHX0dMT0JBTF9USU1FUl9TRVBBUkFUT1IoeCkgKCgoeCkgPj4gU19HTE9CQUxfVElNRVJfU0VQQVJBVE9SKSAmIE1fR0xPQkFMX1RJTUVSX1NFUEFSQVRPUikKKworI2RlZmluZSBBX1RQX0NNX0ZDX01PREUgMHg0YjAKKyNkZWZpbmUgQV9UUF9QQ19DT05HRVNUSU9OX0NOVEwgMHg0YjQKICNkZWZpbmUgQV9UUF9UWF9EUk9QX0NPTkZJRyAweDRiOAogCiAjZGVmaW5lIFNfRU5BQkxFX1RYX0RST1AgICAgMzEKQEAgLTI4MiwxMiArMTI0OSwxMDggQEAKICNkZWZpbmUgRl9FTkFCTEVfVFhfRVJST1IgICAgVl9FTkFCTEVfVFhfRVJST1IoMVUpCiAKICNkZWZpbmUgU19EUk9QX1RJQ0tTX0NOVCAgICA0CisjZGVmaW5lIE1fRFJPUF9USUNLU19DTlQgICAgMHgzZmZmZmZmCiAjZGVmaW5lIFZfRFJPUF9USUNLU19DTlQoeCkgKCh4KSA8PCBTX0RST1BfVElDS1NfQ05UKQorI2RlZmluZSBHX0RST1BfVElDS1NfQ05UKHgpICgoKHgpID4+IFNfRFJPUF9USUNLU19DTlQpICYgTV9EUk9QX1RJQ0tTX0NOVCkKIAogI2RlZmluZSBTX05VTV9QS1RTX0RST1BQRUQgICAgMAorI2RlZmluZSBNX05VTV9QS1RTX0RST1BQRUQgICAgMHhmCiAjZGVmaW5lIFZfTlVNX1BLVFNfRFJPUFBFRCh4KSAoKHgpIDw8IFNfTlVNX1BLVFNfRFJPUFBFRCkKKyNkZWZpbmUgR19OVU1fUEtUU19EUk9QUEVEKHgpICgoKHgpID4+IFNfTlVNX1BLVFNfRFJPUFBFRCkgJiBNX05VTV9QS1RTX0RST1BQRUQpCisKKyNkZWZpbmUgQV9UUF9UWF9EUk9QX0NPVU5UIDB4NGJjCisKKy8qIFJBVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQV9SQVRfUk9VVEVfQ09OVFJPTCAweDU4MAorCisjZGVmaW5lIFNfVVNFX1JPVVRFX1RBQkxFICAgIDAKKyNkZWZpbmUgVl9VU0VfUk9VVEVfVEFCTEUoeCkgKCh4KSA8PCBTX1VTRV9ST1VURV9UQUJMRSkKKyNkZWZpbmUgRl9VU0VfUk9VVEVfVEFCTEUgICAgVl9VU0VfUk9VVEVfVEFCTEUoMVUpCisKKyNkZWZpbmUgU19FTkFCTEVfQ1NQSSAgICAxCisjZGVmaW5lIFZfRU5BQkxFX0NTUEkoeCkgKCh4KSA8PCBTX0VOQUJMRV9DU1BJKQorI2RlZmluZSBGX0VOQUJMRV9DU1BJICAgIFZfRU5BQkxFX0NTUEkoMVUpCisKKyNkZWZpbmUgU19FTkFCTEVfUENJWCAgICAyCisjZGVmaW5lIFZfRU5BQkxFX1BDSVgoeCkgKCh4KSA8PCBTX0VOQUJMRV9QQ0lYKQorI2RlZmluZSBGX0VOQUJMRV9QQ0lYICAgIFZfRU5BQkxFX1BDSVgoMVUpCisKKyNkZWZpbmUgQV9SQVRfUk9VVEVfVEFCTEVfSU5ERVggMHg1ODQKKworI2RlZmluZSBTX1JPVVRFX1RBQkxFX0lOREVYICAgIDAKKyNkZWZpbmUgTV9ST1VURV9UQUJMRV9JTkRFWCAgICAweGYKKyNkZWZpbmUgVl9ST1VURV9UQUJMRV9JTkRFWCh4KSAoKHgpIDw8IFNfUk9VVEVfVEFCTEVfSU5ERVgpCisjZGVmaW5lIEdfUk9VVEVfVEFCTEVfSU5ERVgoeCkgKCgoeCkgPj4gU19ST1VURV9UQUJMRV9JTkRFWCkgJiBNX1JPVVRFX1RBQkxFX0lOREVYKQorCisjZGVmaW5lIEFfUkFUX1JPVVRFX1RBQkxFX0RBVEEgMHg1ODgKKyNkZWZpbmUgQV9SQVRfTk9fUk9VVEUgMHg1OGMKKworI2RlZmluZSBTX0NQTF9PUENPREUgICAgMAorI2RlZmluZSBNX0NQTF9PUENPREUgICAgMHhmZgorI2RlZmluZSBWX0NQTF9PUENPREUoeCkgKCh4KSA8PCBTX0NQTF9PUENPREUpCisjZGVmaW5lIEdfQ1BMX09QQ09ERSh4KSAoKCh4KSA+PiBTX0NQTF9PUENPREUpICYgTV9DUExfT1BDT0RFKQorCisjZGVmaW5lIEFfUkFUX0lOVFJfRU5BQkxFIDB4NTkwCisKKyNkZWZpbmUgU19aRVJPUk9VVEVFUlJPUiAgICAwCisjZGVmaW5lIFZfWkVST1JPVVRFRVJST1IoeCkgKCh4KSA8PCBTX1pFUk9ST1VURUVSUk9SKQorI2RlZmluZSBGX1pFUk9ST1VURUVSUk9SICAgIFZfWkVST1JPVVRFRVJST1IoMVUpCisKKyNkZWZpbmUgU19DU1BJRlJBTUlOR0VSUk9SICAgIDEKKyNkZWZpbmUgVl9DU1BJRlJBTUlOR0VSUk9SKHgpICgoeCkgPDwgU19DU1BJRlJBTUlOR0VSUk9SKQorI2RlZmluZSBGX0NTUElGUkFNSU5HRVJST1IgICAgVl9DU1BJRlJBTUlOR0VSUk9SKDFVKQorCisjZGVmaW5lIFNfU0dFRlJBTUlOR0VSUk9SICAgIDIKKyNkZWZpbmUgVl9TR0VGUkFNSU5HRVJST1IoeCkgKCh4KSA8PCBTX1NHRUZSQU1JTkdFUlJPUikKKyNkZWZpbmUgRl9TR0VGUkFNSU5HRVJST1IgICAgVl9TR0VGUkFNSU5HRVJST1IoMVUpCisKKyNkZWZpbmUgU19UUEZSQU1JTkdFUlJPUiAgICAzCisjZGVmaW5lIFZfVFBGUkFNSU5HRVJST1IoeCkgKCh4KSA8PCBTX1RQRlJBTUlOR0VSUk9SKQorI2RlZmluZSBGX1RQRlJBTUlOR0VSUk9SICAgIFZfVFBGUkFNSU5HRVJST1IoMVUpCisKKyNkZWZpbmUgQV9SQVRfSU5UUl9DQVVTRSAweDU5NAogCiAvKiBDU1BJIHJlZ2lzdGVycyAqLworI2RlZmluZSBBX0NTUElfUlhfQUVfV00gMHg4MTAKKyNkZWZpbmUgQV9DU1BJX1JYX0FGX1dNIDB4ODE0CisjZGVmaW5lIEFfQ1NQSV9DQUxFTkRBUl9MRU4gMHg4MTgKKworI2RlZmluZSBTX0NBTEVOREFSTEVOR1RIICAgIDAKKyNkZWZpbmUgTV9DQUxFTkRBUkxFTkdUSCAgICAweGZmZmYKKyNkZWZpbmUgVl9DQUxFTkRBUkxFTkdUSCh4KSAoKHgpIDw8IFNfQ0FMRU5EQVJMRU5HVEgpCisjZGVmaW5lIEdfQ0FMRU5EQVJMRU5HVEgoeCkgKCgoeCkgPj4gU19DQUxFTkRBUkxFTkdUSCkgJiBNX0NBTEVOREFSTEVOR1RIKQorCisjZGVmaW5lIEFfQ1NQSV9GSUZPX1NUQVRVU19FTkFCTEUgMHg4MjAKKworI2RlZmluZSBTX0ZJRk9TVEFUVVNFTkFCTEUgICAgMAorI2RlZmluZSBWX0ZJRk9TVEFUVVNFTkFCTEUoeCkgKCh4KSA8PCBTX0ZJRk9TVEFUVVNFTkFCTEUpCisjZGVmaW5lIEZfRklGT1NUQVRVU0VOQUJMRSAgICBWX0ZJRk9TVEFUVVNFTkFCTEUoMVUpCisKKyNkZWZpbmUgQV9DU1BJX01BWEJVUlNUMV9NQVhCVVJTVDIgMHg4MjgKKworI2RlZmluZSBTX01BWEJVUlNUMSAgICAwCisjZGVmaW5lIE1fTUFYQlVSU1QxICAgIDB4ZmZmZgorI2RlZmluZSBWX01BWEJVUlNUMSh4KSAoKHgpIDw8IFNfTUFYQlVSU1QxKQorI2RlZmluZSBHX01BWEJVUlNUMSh4KSAoKCh4KSA+PiBTX01BWEJVUlNUMSkgJiBNX01BWEJVUlNUMSkKKworI2RlZmluZSBTX01BWEJVUlNUMiAgICAxNgorI2RlZmluZSBNX01BWEJVUlNUMiAgICAweGZmZmYKKyNkZWZpbmUgVl9NQVhCVVJTVDIoeCkgKCh4KSA8PCBTX01BWEJVUlNUMikKKyNkZWZpbmUgR19NQVhCVVJTVDIoeCkgKCgoeCkgPj4gU19NQVhCVVJTVDIpICYgTV9NQVhCVVJTVDIpCisKKyNkZWZpbmUgQV9DU1BJX1RSQUlOIDB4ODJjCisKKyNkZWZpbmUgU19DU1BJX1RSQUlOX0FMUEhBICAgIDAKKyNkZWZpbmUgTV9DU1BJX1RSQUlOX0FMUEhBICAgIDB4ZmZmZgorI2RlZmluZSBWX0NTUElfVFJBSU5fQUxQSEEoeCkgKCh4KSA8PCBTX0NTUElfVFJBSU5fQUxQSEEpCisjZGVmaW5lIEdfQ1NQSV9UUkFJTl9BTFBIQSh4KSAoKCh4KSA+PiBTX0NTUElfVFJBSU5fQUxQSEEpICYgTV9DU1BJX1RSQUlOX0FMUEhBKQorCisjZGVmaW5lIFNfQ1NQSV9UUkFJTl9EQVRBX01BWFQgICAgMTYKKyNkZWZpbmUgTV9DU1BJX1RSQUlOX0RBVEFfTUFYVCAgICAweGZmZmYKKyNkZWZpbmUgVl9DU1BJX1RSQUlOX0RBVEFfTUFYVCh4KSAoKHgpIDw8IFNfQ1NQSV9UUkFJTl9EQVRBX01BWFQpCisjZGVmaW5lIEdfQ1NQSV9UUkFJTl9EQVRBX01BWFQoeCkgKCgoeCkgPj4gU19DU1BJX1RSQUlOX0RBVEFfTUFYVCkgJiBNX0NTUElfVFJBSU5fREFUQV9NQVhUKQorCisjZGVmaW5lIEFfQ1NQSV9JTlRSX1NUQVRVUyAweDg0OAogCiAjZGVmaW5lIFNfRElQNEVSUiAgICAwCiAjZGVmaW5lIFZfRElQNEVSUih4KSAoKHgpIDw8IFNfRElQNEVSUikKQEAgLTMwOSwyMiArMTM3Miw2MyBAQAogI2RlZmluZSBWX1JBTVBBUklUWUVSUih4KSAoKHgpIDw8IFNfUkFNUEFSSVRZRVJSKQogI2RlZmluZSBGX1JBTVBBUklUWUVSUiAgICBWX1JBTVBBUklUWUVSUigxVSkKIAotLyogRVNQSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQV9DU1BJX0lOVFJfRU5BQkxFIDB4ODRjCiAKKy8qIEVTUEkgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFfRVNQSV9TQ0hfVE9LRU4wIDB4ODgwCisKKyNkZWZpbmUgU19TQ0hUT0tFTjAgICAgMAorI2RlZmluZSBNX1NDSFRPS0VOMCAgICAweGZmZmYKKyNkZWZpbmUgVl9TQ0hUT0tFTjAoeCkgKCh4KSA8PCBTX1NDSFRPS0VOMCkKKyNkZWZpbmUgR19TQ0hUT0tFTjAoeCkgKCgoeCkgPj4gU19TQ0hUT0tFTjApICYgTV9TQ0hUT0tFTjApCisKICNkZWZpbmUgQV9FU1BJX1NDSF9UT0tFTjEgMHg4ODQKKworI2RlZmluZSBTX1NDSFRPS0VOMSAgICAwCisjZGVmaW5lIE1fU0NIVE9LRU4xICAgIDB4ZmZmZgorI2RlZmluZSBWX1NDSFRPS0VOMSh4KSAoKHgpIDw8IFNfU0NIVE9LRU4xKQorI2RlZmluZSBHX1NDSFRPS0VOMSh4KSAoKCh4KSA+PiBTX1NDSFRPS0VOMSkgJiBNX1NDSFRPS0VOMSkKKwogI2RlZmluZSBBX0VTUElfU0NIX1RPS0VOMiAweDg4OAorCisjZGVmaW5lIFNfU0NIVE9LRU4yICAgIDAKKyNkZWZpbmUgTV9TQ0hUT0tFTjIgICAgMHhmZmZmCisjZGVmaW5lIFZfU0NIVE9LRU4yKHgpICgoeCkgPDwgU19TQ0hUT0tFTjIpCisjZGVmaW5lIEdfU0NIVE9LRU4yKHgpICgoKHgpID4+IFNfU0NIVE9LRU4yKSAmIE1fU0NIVE9LRU4yKQorCiAjZGVmaW5lIEFfRVNQSV9TQ0hfVE9LRU4zIDB4ODhjCisKKyNkZWZpbmUgU19TQ0hUT0tFTjMgICAgMAorI2RlZmluZSBNX1NDSFRPS0VOMyAgICAweGZmZmYKKyNkZWZpbmUgVl9TQ0hUT0tFTjMoeCkgKCh4KSA8PCBTX1NDSFRPS0VOMykKKyNkZWZpbmUgR19TQ0hUT0tFTjMoeCkgKCgoeCkgPj4gU19TQ0hUT0tFTjMpICYgTV9TQ0hUT0tFTjMpCisKICNkZWZpbmUgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyAweDg5MAorCisjZGVmaW5lIFNfQUxNT1NURU1QVFkgICAgMAorI2RlZmluZSBNX0FMTU9TVEVNUFRZICAgIDB4ZmZmZgorI2RlZmluZSBWX0FMTU9TVEVNUFRZKHgpICgoeCkgPDwgU19BTE1PU1RFTVBUWSkKKyNkZWZpbmUgR19BTE1PU1RFTVBUWSh4KSAoKCh4KSA+PiBTX0FMTU9TVEVNUFRZKSAmIE1fQUxNT1NURU1QVFkpCisKICNkZWZpbmUgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0ZVTExfV0FURVJNQVJLIDB4ODk0CisKKyNkZWZpbmUgU19BTE1PU1RGVUxMICAgIDAKKyNkZWZpbmUgTV9BTE1PU1RGVUxMICAgIDB4ZmZmZgorI2RlZmluZSBWX0FMTU9TVEZVTEwoeCkgKCh4KSA8PCBTX0FMTU9TVEZVTEwpCisjZGVmaW5lIEdfQUxNT1NURlVMTCh4KSAoKCh4KSA+PiBTX0FMTU9TVEZVTEwpICYgTV9BTE1PU1RGVUxMKQorCiAjZGVmaW5lIEFfRVNQSV9DQUxFTkRBUl9MRU5HVEggMHg4OTgKICNkZWZpbmUgQV9QT1JUX0NPTkZJRyAweDg5YwogCiAjZGVmaW5lIFNfUlhfTlBPUlRTICAgIDAKKyNkZWZpbmUgTV9SWF9OUE9SVFMgICAgMHhmZgogI2RlZmluZSBWX1JYX05QT1JUUyh4KSAoKHgpIDw8IFNfUlhfTlBPUlRTKQorI2RlZmluZSBHX1JYX05QT1JUUyh4KSAoKCh4KSA+PiBTX1JYX05QT1JUUykgJiBNX1JYX05QT1JUUykKIAogI2RlZmluZSBTX1RYX05QT1JUUyAgICA4CisjZGVmaW5lIE1fVFhfTlBPUlRTICAgIDB4ZmYKICNkZWZpbmUgVl9UWF9OUE9SVFMoeCkgKCh4KSA8PCBTX1RYX05QT1JUUykKKyNkZWZpbmUgR19UWF9OUE9SVFMoeCkgKCgoeCkgPj4gU19UWF9OUE9SVFMpICYgTV9UWF9OUE9SVFMpCiAKICNkZWZpbmUgQV9FU1BJX0ZJRk9fU1RBVFVTX0VOQUJMRSAweDhhMAogCkBAIC0zMzIsMTIgKzE0MzYsMTI0IEBACiAjZGVmaW5lIFZfUlhTVEFUVVNFTkFCTEUoeCkgKCh4KSA8PCBTX1JYU1RBVFVTRU5BQkxFKQogI2RlZmluZSBGX1JYU1RBVFVTRU5BQkxFICAgIFZfUlhTVEFUVVNFTkFCTEUoMVUpCiAKKyNkZWZpbmUgU19UWERST1BFTkFCTEUgICAgMQorI2RlZmluZSBWX1RYRFJPUEVOQUJMRSh4KSAoKHgpIDw8IFNfVFhEUk9QRU5BQkxFKQorI2RlZmluZSBGX1RYRFJPUEVOQUJMRSAgICBWX1RYRFJPUEVOQUJMRSgxVSkKKworI2RlZmluZSBTX1JYRU5ESUFOTU9ERSAgICAyCisjZGVmaW5lIFZfUlhFTkRJQU5NT0RFKHgpICgoeCkgPDwgU19SWEVORElBTk1PREUpCisjZGVmaW5lIEZfUlhFTkRJQU5NT0RFICAgIFZfUlhFTkRJQU5NT0RFKDFVKQorCisjZGVmaW5lIFNfVFhFTkRJQU5NT0RFICAgIDMKKyNkZWZpbmUgVl9UWEVORElBTk1PREUoeCkgKCh4KSA8PCBTX1RYRU5ESUFOTU9ERSkKKyNkZWZpbmUgRl9UWEVORElBTk1PREUgICAgVl9UWEVORElBTk1PREUoMVUpCisKICNkZWZpbmUgU19JTlRFTDEwMTBNT0RFICAgIDQKICNkZWZpbmUgVl9JTlRFTDEwMTBNT0RFKHgpICgoeCkgPDwgU19JTlRFTDEwMTBNT0RFKQogI2RlZmluZSBGX0lOVEVMMTAxME1PREUgICAgVl9JTlRFTDEwMTBNT0RFKDFVKQogCiAjZGVmaW5lIEFfRVNQSV9NQVhCVVJTVDFfTUFYQlVSU1QyIDB4OGE4CiAjZGVmaW5lIEFfRVNQSV9UUkFJTiAweDhhYworCisjZGVmaW5lIFNfTUFYVFJBSU5BTFBIQSAgICAwCisjZGVmaW5lIE1fTUFYVFJBSU5BTFBIQSAgICAweGZmZmYKKyNkZWZpbmUgVl9NQVhUUkFJTkFMUEhBKHgpICgoeCkgPDwgU19NQVhUUkFJTkFMUEhBKQorI2RlZmluZSBHX01BWFRSQUlOQUxQSEEoeCkgKCgoeCkgPj4gU19NQVhUUkFJTkFMUEhBKSAmIE1fTUFYVFJBSU5BTFBIQSkKKworI2RlZmluZSBTX01BWFRSQUlOREFUQSAgICAxNgorI2RlZmluZSBNX01BWFRSQUlOREFUQSAgICAweGZmZmYKKyNkZWZpbmUgVl9NQVhUUkFJTkRBVEEoeCkgKCh4KSA8PCBTX01BWFRSQUlOREFUQSkKKyNkZWZpbmUgR19NQVhUUkFJTkRBVEEoeCkgKCgoeCkgPj4gU19NQVhUUkFJTkRBVEEpICYgTV9NQVhUUkFJTkRBVEEpCisKKyNkZWZpbmUgQV9SQU1fU1RBVFVTIDB4OGIwCisKKyNkZWZpbmUgU19SWEZJRk9QQVJJVFlFUlJPUiAgICAwCisjZGVmaW5lIE1fUlhGSUZPUEFSSVRZRVJST1IgICAgMHgzZmYKKyNkZWZpbmUgVl9SWEZJRk9QQVJJVFlFUlJPUih4KSAoKHgpIDw8IFNfUlhGSUZPUEFSSVRZRVJST1IpCisjZGVmaW5lIEdfUlhGSUZPUEFSSVRZRVJST1IoeCkgKCgoeCkgPj4gU19SWEZJRk9QQVJJVFlFUlJPUikgJiBNX1JYRklGT1BBUklUWUVSUk9SKQorCisjZGVmaW5lIFNfVFhGSUZPUEFSSVRZRVJST1IgICAgMTAKKyNkZWZpbmUgTV9UWEZJRk9QQVJJVFlFUlJPUiAgICAweDNmZgorI2RlZmluZSBWX1RYRklGT1BBUklUWUVSUk9SKHgpICgoeCkgPDwgU19UWEZJRk9QQVJJVFlFUlJPUikKKyNkZWZpbmUgR19UWEZJRk9QQVJJVFlFUlJPUih4KSAoKCh4KSA+PiBTX1RYRklGT1BBUklUWUVSUk9SKSAmIE1fVFhGSUZPUEFSSVRZRVJST1IpCisKKyNkZWZpbmUgU19SWEZJRk9PVkVSRkxPVyAgICAyMAorI2RlZmluZSBNX1JYRklGT09WRVJGTE9XICAgIDB4M2ZmCisjZGVmaW5lIFZfUlhGSUZPT1ZFUkZMT1coeCkgKCh4KSA8PCBTX1JYRklGT09WRVJGTE9XKQorI2RlZmluZSBHX1JYRklGT09WRVJGTE9XKHgpICgoKHgpID4+IFNfUlhGSUZPT1ZFUkZMT1cpICYgTV9SWEZJRk9PVkVSRkxPVykKKworI2RlZmluZSBBX1RYX0RST1BfQ09VTlQwIDB4OGI0CisKKyNkZWZpbmUgU19UWFBPUlQwRFJPUENOVCAgICAwCisjZGVmaW5lIE1fVFhQT1JUMERST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfVFhQT1JUMERST1BDTlQoeCkgKCh4KSA8PCBTX1RYUE9SVDBEUk9QQ05UKQorI2RlZmluZSBHX1RYUE9SVDBEUk9QQ05UKHgpICgoKHgpID4+IFNfVFhQT1JUMERST1BDTlQpICYgTV9UWFBPUlQwRFJPUENOVCkKKworI2RlZmluZSBTX1RYUE9SVDFEUk9QQ05UICAgIDE2CisjZGVmaW5lIE1fVFhQT1JUMURST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfVFhQT1JUMURST1BDTlQoeCkgKCh4KSA8PCBTX1RYUE9SVDFEUk9QQ05UKQorI2RlZmluZSBHX1RYUE9SVDFEUk9QQ05UKHgpICgoKHgpID4+IFNfVFhQT1JUMURST1BDTlQpICYgTV9UWFBPUlQxRFJPUENOVCkKKworI2RlZmluZSBBX1RYX0RST1BfQ09VTlQxIDB4OGI4CisKKyNkZWZpbmUgU19UWFBPUlQyRFJPUENOVCAgICAwCisjZGVmaW5lIE1fVFhQT1JUMkRST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfVFhQT1JUMkRST1BDTlQoeCkgKCh4KSA8PCBTX1RYUE9SVDJEUk9QQ05UKQorI2RlZmluZSBHX1RYUE9SVDJEUk9QQ05UKHgpICgoKHgpID4+IFNfVFhQT1JUMkRST1BDTlQpICYgTV9UWFBPUlQyRFJPUENOVCkKKworI2RlZmluZSBTX1RYUE9SVDNEUk9QQ05UICAgIDE2CisjZGVmaW5lIE1fVFhQT1JUM0RST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfVFhQT1JUM0RST1BDTlQoeCkgKCh4KSA8PCBTX1RYUE9SVDNEUk9QQ05UKQorI2RlZmluZSBHX1RYUE9SVDNEUk9QQ05UKHgpICgoKHgpID4+IFNfVFhQT1JUM0RST1BDTlQpICYgTV9UWFBPUlQzRFJPUENOVCkKKworI2RlZmluZSBBX1JYX0RST1BfQ09VTlQwIDB4OGJjCisKKyNkZWZpbmUgU19SWFBPUlQwRFJPUENOVCAgICAwCisjZGVmaW5lIE1fUlhQT1JUMERST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfUlhQT1JUMERST1BDTlQoeCkgKCh4KSA8PCBTX1JYUE9SVDBEUk9QQ05UKQorI2RlZmluZSBHX1JYUE9SVDBEUk9QQ05UKHgpICgoKHgpID4+IFNfUlhQT1JUMERST1BDTlQpICYgTV9SWFBPUlQwRFJPUENOVCkKKworI2RlZmluZSBTX1JYUE9SVDFEUk9QQ05UICAgIDE2CisjZGVmaW5lIE1fUlhQT1JUMURST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfUlhQT1JUMURST1BDTlQoeCkgKCh4KSA8PCBTX1JYUE9SVDFEUk9QQ05UKQorI2RlZmluZSBHX1JYUE9SVDFEUk9QQ05UKHgpICgoKHgpID4+IFNfUlhQT1JUMURST1BDTlQpICYgTV9SWFBPUlQxRFJPUENOVCkKKworI2RlZmluZSBBX1JYX0RST1BfQ09VTlQxIDB4OGMwCisKKyNkZWZpbmUgU19SWFBPUlQyRFJPUENOVCAgICAwCisjZGVmaW5lIE1fUlhQT1JUMkRST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfUlhQT1JUMkRST1BDTlQoeCkgKCh4KSA8PCBTX1JYUE9SVDJEUk9QQ05UKQorI2RlZmluZSBHX1JYUE9SVDJEUk9QQ05UKHgpICgoKHgpID4+IFNfUlhQT1JUMkRST1BDTlQpICYgTV9SWFBPUlQyRFJPUENOVCkKKworI2RlZmluZSBTX1JYUE9SVDNEUk9QQ05UICAgIDE2CisjZGVmaW5lIE1fUlhQT1JUM0RST1BDTlQgICAgMHhmZmZmCisjZGVmaW5lIFZfUlhQT1JUM0RST1BDTlQoeCkgKCh4KSA8PCBTX1JYUE9SVDNEUk9QQ05UKQorI2RlZmluZSBHX1JYUE9SVDNEUk9QQ05UKHgpICgoKHgpID4+IFNfUlhQT1JUM0RST1BDTlQpICYgTV9SWFBPUlQzRFJPUENOVCkKKworI2RlZmluZSBBX0RJUDRfRVJST1JfQ09VTlQgMHg4YzQKKworI2RlZmluZSBTX0RJUDRFUlJPUkNOVCAgICAwCisjZGVmaW5lIE1fRElQNEVSUk9SQ05UICAgIDB4ZmZmCisjZGVmaW5lIFZfRElQNEVSUk9SQ05UKHgpICgoeCkgPDwgU19ESVA0RVJST1JDTlQpCisjZGVmaW5lIEdfRElQNEVSUk9SQ05UKHgpICgoKHgpID4+IFNfRElQNEVSUk9SQ05UKSAmIE1fRElQNEVSUk9SQ05UKQorCisjZGVmaW5lIFNfRElQNEVSUk9SQ05UU0hBRE9XICAgIDEyCisjZGVmaW5lIE1fRElQNEVSUk9SQ05UU0hBRE9XICAgIDB4ZmZmCisjZGVmaW5lIFZfRElQNEVSUk9SQ05UU0hBRE9XKHgpICgoeCkgPDwgU19ESVA0RVJST1JDTlRTSEFET1cpCisjZGVmaW5lIEdfRElQNEVSUk9SQ05UU0hBRE9XKHgpICgoKHgpID4+IFNfRElQNEVSUk9SQ05UU0hBRE9XKSAmIE1fRElQNEVSUk9SQ05UU0hBRE9XKQorCisjZGVmaW5lIFNfVFJJQ05fUlhfVFJBSU5fRVJSICAgIDI0CisjZGVmaW5lIFZfVFJJQ05fUlhfVFJBSU5fRVJSKHgpICgoeCkgPDwgU19UUklDTl9SWF9UUkFJTl9FUlIpCisjZGVmaW5lIEZfVFJJQ05fUlhfVFJBSU5fRVJSICAgIFZfVFJJQ05fUlhfVFJBSU5fRVJSKDFVKQorCisjZGVmaW5lIFNfVFJJQ05fUlhfVFJBSU5JTkcgICAgMjUKKyNkZWZpbmUgVl9UUklDTl9SWF9UUkFJTklORyh4KSAoKHgpIDw8IFNfVFJJQ05fUlhfVFJBSU5JTkcpCisjZGVmaW5lIEZfVFJJQ05fUlhfVFJBSU5JTkcgICAgVl9UUklDTl9SWF9UUkFJTklORygxVSkKKworI2RlZmluZSBTX1RSSUNOX1JYX1RSQUlOX09LICAgIDI2CisjZGVmaW5lIFZfVFJJQ05fUlhfVFJBSU5fT0soeCkgKCh4KSA8PCBTX1RSSUNOX1JYX1RSQUlOX09LKQorI2RlZmluZSBGX1RSSUNOX1JYX1RSQUlOX09LICAgIFZfVFJJQ05fUlhfVFJBSU5fT0soMVUpCisKICNkZWZpbmUgQV9FU1BJX0lOVFJfU1RBVFVTIDB4OGM4CiAKICNkZWZpbmUgU19ESVAyUEFSSVRZRVJSICAgIDUKQEAgLTM0NywxOSArMTU2Myw1NiBAQAogI2RlZmluZSBBX0VTUElfSU5UUl9FTkFCTEUgMHg4Y2MKICNkZWZpbmUgQV9SWF9EUk9QX1RIUkVTSE9MRCAweDhkMAogI2RlZmluZSBBX0VTUElfUlhfUkVTRVQgMHg4ZWMKKworI2RlZmluZSBTX0VTUElfUlhfTE5LX1JTVCAgICAwCisjZGVmaW5lIFZfRVNQSV9SWF9MTktfUlNUKHgpICgoeCkgPDwgU19FU1BJX1JYX0xOS19SU1QpCisjZGVmaW5lIEZfRVNQSV9SWF9MTktfUlNUICAgIFZfRVNQSV9SWF9MTktfUlNUKDFVKQorCisjZGVmaW5lIFNfRVNQSV9SWF9DT1JFX1JTVCAgICAxCisjZGVmaW5lIFZfRVNQSV9SWF9DT1JFX1JTVCh4KSAoKHgpIDw8IFNfRVNQSV9SWF9DT1JFX1JTVCkKKyNkZWZpbmUgRl9FU1BJX1JYX0NPUkVfUlNUICAgIFZfRVNQSV9SWF9DT1JFX1JTVCgxVSkKKworI2RlZmluZSBTX1JYX0NMS19TVEFUVVMgICAgMgorI2RlZmluZSBWX1JYX0NMS19TVEFUVVMoeCkgKCh4KSA8PCBTX1JYX0NMS19TVEFUVVMpCisjZGVmaW5lIEZfUlhfQ0xLX1NUQVRVUyAgICBWX1JYX0NMS19TVEFUVVMoMVUpCisKICNkZWZpbmUgQV9FU1BJX01JU0NfQ09OVFJPTCAweDhmMAogCiAjZGVmaW5lIFNfT1VUX09GX1NZTkNfQ09VTlQgICAgMAorI2RlZmluZSBNX09VVF9PRl9TWU5DX0NPVU5UICAgIDB4ZgogI2RlZmluZSBWX09VVF9PRl9TWU5DX0NPVU5UKHgpICgoeCkgPDwgU19PVVRfT0ZfU1lOQ19DT1VOVCkKKyNkZWZpbmUgR19PVVRfT0ZfU1lOQ19DT1VOVCh4KSAoKCh4KSA+PiBTX09VVF9PRl9TWU5DX0NPVU5UKSAmIE1fT1VUX09GX1NZTkNfQ09VTlQpCisKKyNkZWZpbmUgU19ESVAyX0NPVU5UX01PREVfRU5BQkxFICAgIDQKKyNkZWZpbmUgVl9ESVAyX0NPVU5UX01PREVfRU5BQkxFKHgpICgoeCkgPDwgU19ESVAyX0NPVU5UX01PREVfRU5BQkxFKQorI2RlZmluZSBGX0RJUDJfQ09VTlRfTU9ERV9FTkFCTEUgICAgVl9ESVAyX0NPVU5UX01PREVfRU5BQkxFKDFVKQogCiAjZGVmaW5lIFNfRElQMl9QQVJJVFlfRVJSX1RIUkVTICAgIDUKKyNkZWZpbmUgTV9ESVAyX1BBUklUWV9FUlJfVEhSRVMgICAgMHhmCiAjZGVmaW5lIFZfRElQMl9QQVJJVFlfRVJSX1RIUkVTKHgpICgoeCkgPDwgU19ESVAyX1BBUklUWV9FUlJfVEhSRVMpCisjZGVmaW5lIEdfRElQMl9QQVJJVFlfRVJSX1RIUkVTKHgpICgoKHgpID4+IFNfRElQMl9QQVJJVFlfRVJSX1RIUkVTKSAmIE1fRElQMl9QQVJJVFlfRVJSX1RIUkVTKQogCiAjZGVmaW5lIFNfRElQNF9USFJFUyAgICA5CisjZGVmaW5lIE1fRElQNF9USFJFUyAgICAweGZmZgogI2RlZmluZSBWX0RJUDRfVEhSRVMoeCkgKCh4KSA8PCBTX0RJUDRfVEhSRVMpCisjZGVmaW5lIEdfRElQNF9USFJFUyh4KSAoKCh4KSA+PiBTX0RJUDRfVEhSRVMpICYgTV9ESVA0X1RIUkVTKQorCisjZGVmaW5lIFNfRElQNF9USFJFU19FTkFCTEUgICAgMjEKKyNkZWZpbmUgVl9ESVA0X1RIUkVTX0VOQUJMRSh4KSAoKHgpIDw8IFNfRElQNF9USFJFU19FTkFCTEUpCisjZGVmaW5lIEZfRElQNF9USFJFU19FTkFCTEUgICAgVl9ESVA0X1RIUkVTX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX0ZPUkNFX0RJU0FCTEVfU1RBVFVTICAgIDIyCisjZGVmaW5lIFZfRk9SQ0VfRElTQUJMRV9TVEFUVVMoeCkgKCh4KSA8PCBTX0ZPUkNFX0RJU0FCTEVfU1RBVFVTKQorI2RlZmluZSBGX0ZPUkNFX0RJU0FCTEVfU1RBVFVTICAgIFZfRk9SQ0VfRElTQUJMRV9TVEFUVVMoMVUpCisKKyNkZWZpbmUgU19EWU5BTUlDX0RFU0tFVyAgICAyMworI2RlZmluZSBWX0RZTkFNSUNfREVTS0VXKHgpICgoeCkgPDwgU19EWU5BTUlDX0RFU0tFVykKKyNkZWZpbmUgRl9EWU5BTUlDX0RFU0tFVyAgICBWX0RZTkFNSUNfREVTS0VXKDFVKQogCiAjZGVmaW5lIFNfTU9OSVRPUkVEX1BPUlRfTlVNICAgIDI1CisjZGVmaW5lIE1fTU9OSVRPUkVEX1BPUlRfTlVNICAgIDB4MwogI2RlZmluZSBWX01PTklUT1JFRF9QT1JUX05VTSh4KSAoKHgpIDw8IFNfTU9OSVRPUkVEX1BPUlRfTlVNKQorI2RlZmluZSBHX01PTklUT1JFRF9QT1JUX05VTSh4KSAoKCh4KSA+PiBTX01PTklUT1JFRF9QT1JUX05VTSkgJiBNX01PTklUT1JFRF9QT1JUX05VTSkKIAogI2RlZmluZSBTX01PTklUT1JFRF9ESVJFQ1RJT04gICAgMjcKICNkZWZpbmUgVl9NT05JVE9SRURfRElSRUNUSU9OKHgpICgoeCkgPDwgU19NT05JVE9SRURfRElSRUNUSU9OKQpAQCAtMzcwLDMzICsxNjIzLDEyNSBAQAogI2RlZmluZSBGX01PTklUT1JFRF9JTlRFUkZBQ0UgICAgVl9NT05JVE9SRURfSU5URVJGQUNFKDFVKQogCiAjZGVmaW5lIEFfRVNQSV9ESVAyX0VSUl9DT1VOVCAweDhmNAorCisjZGVmaW5lIFNfRElQMl9FUlJfQ05UICAgIDAKKyNkZWZpbmUgTV9ESVAyX0VSUl9DTlQgICAgMHhmCisjZGVmaW5lIFZfRElQMl9FUlJfQ05UKHgpICgoeCkgPDwgU19ESVAyX0VSUl9DTlQpCisjZGVmaW5lIEdfRElQMl9FUlJfQ05UKHgpICgoKHgpID4+IFNfRElQMl9FUlJfQ05UKSAmIE1fRElQMl9FUlJfQ05UKQorCiAjZGVmaW5lIEFfRVNQSV9DTURfQUREUiAweDhmOAogCiAjZGVmaW5lIFNfV1JJVEVfREFUQSAgICAwCisjZGVmaW5lIE1fV1JJVEVfREFUQSAgICAweGZmCiAjZGVmaW5lIFZfV1JJVEVfREFUQSh4KSAoKHgpIDw8IFNfV1JJVEVfREFUQSkKKyNkZWZpbmUgR19XUklURV9EQVRBKHgpICgoKHgpID4+IFNfV1JJVEVfREFUQSkgJiBNX1dSSVRFX0RBVEEpCiAKICNkZWZpbmUgU19SRUdJU1RFUl9PRkZTRVQgICAgOAorI2RlZmluZSBNX1JFR0lTVEVSX09GRlNFVCAgICAweGYKICNkZWZpbmUgVl9SRUdJU1RFUl9PRkZTRVQoeCkgKCh4KSA8PCBTX1JFR0lTVEVSX09GRlNFVCkKKyNkZWZpbmUgR19SRUdJU1RFUl9PRkZTRVQoeCkgKCgoeCkgPj4gU19SRUdJU1RFUl9PRkZTRVQpICYgTV9SRUdJU1RFUl9PRkZTRVQpCiAKICNkZWZpbmUgU19DSEFOTkVMX0FERFIgICAgMTIKKyNkZWZpbmUgTV9DSEFOTkVMX0FERFIgICAgMHhmCiAjZGVmaW5lIFZfQ0hBTk5FTF9BRERSKHgpICgoeCkgPDwgU19DSEFOTkVMX0FERFIpCisjZGVmaW5lIEdfQ0hBTk5FTF9BRERSKHgpICgoKHgpID4+IFNfQ0hBTk5FTF9BRERSKSAmIE1fQ0hBTk5FTF9BRERSKQogCiAjZGVmaW5lIFNfTU9EVUxFX0FERFIgICAgMTYKKyNkZWZpbmUgTV9NT0RVTEVfQUREUiAgICAweDMKICNkZWZpbmUgVl9NT0RVTEVfQUREUih4KSAoKHgpIDw8IFNfTU9EVUxFX0FERFIpCisjZGVmaW5lIEdfTU9EVUxFX0FERFIoeCkgKCgoeCkgPj4gU19NT0RVTEVfQUREUikgJiBNX01PRFVMRV9BRERSKQogCiAjZGVmaW5lIFNfQlVORExFX0FERFIgICAgMjAKKyNkZWZpbmUgTV9CVU5ETEVfQUREUiAgICAweDMKICNkZWZpbmUgVl9CVU5ETEVfQUREUih4KSAoKHgpIDw8IFNfQlVORExFX0FERFIpCisjZGVmaW5lIEdfQlVORExFX0FERFIoeCkgKCgoeCkgPj4gU19CVU5ETEVfQUREUikgJiBNX0JVTkRMRV9BRERSKQogCiAjZGVmaW5lIFNfU1BJNF9DT01NQU5EICAgIDI0CisjZGVmaW5lIE1fU1BJNF9DT01NQU5EICAgIDB4ZmYKICNkZWZpbmUgVl9TUEk0X0NPTU1BTkQoeCkgKCh4KSA8PCBTX1NQSTRfQ09NTUFORCkKKyNkZWZpbmUgR19TUEk0X0NPTU1BTkQoeCkgKCgoeCkgPj4gU19TUEk0X0NPTU1BTkQpICYgTV9TUEk0X0NPTU1BTkQpCiAKICNkZWZpbmUgQV9FU1BJX0dPU1RBVCAweDhmYworCisjZGVmaW5lIFNfUkVBRF9EQVRBICAgIDAKKyNkZWZpbmUgTV9SRUFEX0RBVEEgICAgMHhmZgorI2RlZmluZSBWX1JFQURfREFUQSh4KSAoKHgpIDw8IFNfUkVBRF9EQVRBKQorI2RlZmluZSBHX1JFQURfREFUQSh4KSAoKCh4KSA+PiBTX1JFQURfREFUQSkgJiBNX1JFQURfREFUQSkKKwogI2RlZmluZSBTX0VTUElfQ01EX0JVU1kgICAgOAogI2RlZmluZSBWX0VTUElfQ01EX0JVU1koeCkgKCh4KSA8PCBTX0VTUElfQ01EX0JVU1kpCiAjZGVmaW5lIEZfRVNQSV9DTURfQlVTWSAgICBWX0VTUElfQ01EX0JVU1koMVUpCiAKLS8qIFBMIHJlZ2lzdGVycyAqLworI2RlZmluZSBTX0VSUk9SX0FDSyAgICA5CisjZGVmaW5lIFZfRVJST1JfQUNLKHgpICgoeCkgPDwgU19FUlJPUl9BQ0spCisjZGVmaW5lIEZfRVJST1JfQUNLICAgIFZfRVJST1JfQUNLKDFVKQogCisjZGVmaW5lIFNfVU5NQVBQRURfRVJSICAgIDEwCisjZGVmaW5lIFZfVU5NQVBQRURfRVJSKHgpICgoeCkgPDwgU19VTk1BUFBFRF9FUlIpCisjZGVmaW5lIEZfVU5NQVBQRURfRVJSICAgIFZfVU5NQVBQRURfRVJSKDFVKQorCisjZGVmaW5lIFNfVFJBTlNBQ1RJT05fVElNRVIgICAgMTYKKyNkZWZpbmUgTV9UUkFOU0FDVElPTl9USU1FUiAgICAweGZmCisjZGVmaW5lIFZfVFJBTlNBQ1RJT05fVElNRVIoeCkgKCh4KSA8PCBTX1RSQU5TQUNUSU9OX1RJTUVSKQorI2RlZmluZSBHX1RSQU5TQUNUSU9OX1RJTUVSKHgpICgoKHgpID4+IFNfVFJBTlNBQ1RJT05fVElNRVIpICYgTV9UUkFOU0FDVElPTl9USU1FUikKKworCisvKiBVTFAgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFfVUxQX1VMSU1JVCAweDk4MAorI2RlZmluZSBBX1VMUF9UQUdNQVNLIDB4OTg0CisjZGVmaW5lIEFfVUxQX0hSRUdfSU5ERVggMHg5ODgKKyNkZWZpbmUgQV9VTFBfSFJFR19EQVRBIDB4OThjCisjZGVmaW5lIEFfVUxQX0lOVF9FTkFCTEUgMHg5OTAKKyNkZWZpbmUgQV9VTFBfSU5UX0NBVVNFIDB4OTk0CisKKyNkZWZpbmUgU19IUkVHX1BBUl9FUlIgICAgMAorI2RlZmluZSBWX0hSRUdfUEFSX0VSUih4KSAoKHgpIDw8IFNfSFJFR19QQVJfRVJSKQorI2RlZmluZSBGX0hSRUdfUEFSX0VSUiAgICBWX0hSRUdfUEFSX0VSUigxVSkKKworI2RlZmluZSBTX0VHUlNfREFUQV9QQVJfRVJSICAgIDEKKyNkZWZpbmUgVl9FR1JTX0RBVEFfUEFSX0VSUih4KSAoKHgpIDw8IFNfRUdSU19EQVRBX1BBUl9FUlIpCisjZGVmaW5lIEZfRUdSU19EQVRBX1BBUl9FUlIgICAgVl9FR1JTX0RBVEFfUEFSX0VSUigxVSkKKworI2RlZmluZSBTX0lOR1JTX0RBVEFfUEFSX0VSUiAgICAyCisjZGVmaW5lIFZfSU5HUlNfREFUQV9QQVJfRVJSKHgpICgoeCkgPDwgU19JTkdSU19EQVRBX1BBUl9FUlIpCisjZGVmaW5lIEZfSU5HUlNfREFUQV9QQVJfRVJSICAgIFZfSU5HUlNfREFUQV9QQVJfRVJSKDFVKQorCisjZGVmaW5lIFNfUE1fSU5UUiAgICAzCisjZGVmaW5lIFZfUE1fSU5UUih4KSAoKHgpIDw8IFNfUE1fSU5UUikKKyNkZWZpbmUgRl9QTV9JTlRSICAgIFZfUE1fSU5UUigxVSkKKworI2RlZmluZSBTX1BNX0UyQ19TWU5DX0VSUiAgICA0CisjZGVmaW5lIFZfUE1fRTJDX1NZTkNfRVJSKHgpICgoeCkgPDwgU19QTV9FMkNfU1lOQ19FUlIpCisjZGVmaW5lIEZfUE1fRTJDX1NZTkNfRVJSICAgIFZfUE1fRTJDX1NZTkNfRVJSKDFVKQorCisjZGVmaW5lIFNfUE1fQzJFX1NZTkNfRVJSICAgIDUKKyNkZWZpbmUgVl9QTV9DMkVfU1lOQ19FUlIoeCkgKCh4KSA8PCBTX1BNX0MyRV9TWU5DX0VSUikKKyNkZWZpbmUgRl9QTV9DMkVfU1lOQ19FUlIgICAgVl9QTV9DMkVfU1lOQ19FUlIoMVUpCisKKyNkZWZpbmUgU19QTV9FMkNfRU1QVFlfRVJSICAgIDYKKyNkZWZpbmUgVl9QTV9FMkNfRU1QVFlfRVJSKHgpICgoeCkgPDwgU19QTV9FMkNfRU1QVFlfRVJSKQorI2RlZmluZSBGX1BNX0UyQ19FTVBUWV9FUlIgICAgVl9QTV9FMkNfRU1QVFlfRVJSKDFVKQorCisjZGVmaW5lIFNfUE1fQzJFX0VNUFRZX0VSUiAgICA3CisjZGVmaW5lIFZfUE1fQzJFX0VNUFRZX0VSUih4KSAoKHgpIDw8IFNfUE1fQzJFX0VNUFRZX0VSUikKKyNkZWZpbmUgRl9QTV9DMkVfRU1QVFlfRVJSICAgIFZfUE1fQzJFX0VNUFRZX0VSUigxVSkKKworI2RlZmluZSBTX1BNX1BBUl9FUlIgICAgOAorI2RlZmluZSBNX1BNX1BBUl9FUlIgICAgMHhmZmZmCisjZGVmaW5lIFZfUE1fUEFSX0VSUih4KSAoKHgpIDw8IFNfUE1fUEFSX0VSUikKKyNkZWZpbmUgR19QTV9QQVJfRVJSKHgpICgoKHgpID4+IFNfUE1fUEFSX0VSUikgJiBNX1BNX1BBUl9FUlIpCisKKyNkZWZpbmUgU19QTV9FMkNfV1JUX0ZVTEwgICAgMjQKKyNkZWZpbmUgVl9QTV9FMkNfV1JUX0ZVTEwoeCkgKCh4KSA8PCBTX1BNX0UyQ19XUlRfRlVMTCkKKyNkZWZpbmUgRl9QTV9FMkNfV1JUX0ZVTEwgICAgVl9QTV9FMkNfV1JUX0ZVTEwoMVUpCisKKyNkZWZpbmUgU19QTV9DMkVfV1JUX0ZVTEwgICAgMjUKKyNkZWZpbmUgVl9QTV9DMkVfV1JUX0ZVTEwoeCkgKCh4KSA8PCBTX1BNX0MyRV9XUlRfRlVMTCkKKyNkZWZpbmUgRl9QTV9DMkVfV1JUX0ZVTEwgICAgVl9QTV9DMkVfV1JUX0ZVTEwoMVUpCisKKyNkZWZpbmUgQV9VTFBfUElPX0NUUkwgMHg5OTgKKworLyogUEwgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFfUExfRU5BQkxFIDB4YTAwCiAKICNkZWZpbmUgU19QTF9JTlRSX1NHRV9FUlIgICAgMApAQCAtNDA3LDE0ICsxNzUyLDM4IEBACiAjZGVmaW5lIFZfUExfSU5UUl9TR0VfREFUQSh4KSAoKHgpIDw8IFNfUExfSU5UUl9TR0VfREFUQSkKICNkZWZpbmUgRl9QTF9JTlRSX1NHRV9EQVRBICAgIFZfUExfSU5UUl9TR0VfREFUQSgxVSkKIAorI2RlZmluZSBTX1BMX0lOVFJfTUMzICAgIDIKKyNkZWZpbmUgVl9QTF9JTlRSX01DMyh4KSAoKHgpIDw8IFNfUExfSU5UUl9NQzMpCisjZGVmaW5lIEZfUExfSU5UUl9NQzMgICAgVl9QTF9JTlRSX01DMygxVSkKKworI2RlZmluZSBTX1BMX0lOVFJfTUM0ICAgIDMKKyNkZWZpbmUgVl9QTF9JTlRSX01DNCh4KSAoKHgpIDw8IFNfUExfSU5UUl9NQzQpCisjZGVmaW5lIEZfUExfSU5UUl9NQzQgICAgVl9QTF9JTlRSX01DNCgxVSkKKworI2RlZmluZSBTX1BMX0lOVFJfTUM1ICAgIDQKKyNkZWZpbmUgVl9QTF9JTlRSX01DNSh4KSAoKHgpIDw8IFNfUExfSU5UUl9NQzUpCisjZGVmaW5lIEZfUExfSU5UUl9NQzUgICAgVl9QTF9JTlRSX01DNSgxVSkKKworI2RlZmluZSBTX1BMX0lOVFJfUkFUICAgIDUKKyNkZWZpbmUgVl9QTF9JTlRSX1JBVCh4KSAoKHgpIDw8IFNfUExfSU5UUl9SQVQpCisjZGVmaW5lIEZfUExfSU5UUl9SQVQgICAgVl9QTF9JTlRSX1JBVCgxVSkKKwogI2RlZmluZSBTX1BMX0lOVFJfVFAgICAgNgogI2RlZmluZSBWX1BMX0lOVFJfVFAoeCkgKCh4KSA8PCBTX1BMX0lOVFJfVFApCiAjZGVmaW5lIEZfUExfSU5UUl9UUCAgICBWX1BMX0lOVFJfVFAoMVUpCiAKKyNkZWZpbmUgU19QTF9JTlRSX1VMUCAgICA3CisjZGVmaW5lIFZfUExfSU5UUl9VTFAoeCkgKCh4KSA8PCBTX1BMX0lOVFJfVUxQKQorI2RlZmluZSBGX1BMX0lOVFJfVUxQICAgIFZfUExfSU5UUl9VTFAoMVUpCisKICNkZWZpbmUgU19QTF9JTlRSX0VTUEkgICAgOAogI2RlZmluZSBWX1BMX0lOVFJfRVNQSSh4KSAoKHgpIDw8IFNfUExfSU5UUl9FU1BJKQogI2RlZmluZSBGX1BMX0lOVFJfRVNQSSAgICBWX1BMX0lOVFJfRVNQSSgxVSkKIAorI2RlZmluZSBTX1BMX0lOVFJfQ1NQSSAgICA5CisjZGVmaW5lIFZfUExfSU5UUl9DU1BJKHgpICgoeCkgPDwgU19QTF9JTlRSX0NTUEkpCisjZGVmaW5lIEZfUExfSU5UUl9DU1BJICAgIFZfUExfSU5UUl9DU1BJKDFVKQorCiAjZGVmaW5lIFNfUExfSU5UUl9QQ0lYICAgIDEwCiAjZGVmaW5lIFZfUExfSU5UUl9QQ0lYKHgpICgoeCkgPDwgU19QTF9JTlRSX1BDSVgpCiAjZGVmaW5lIEZfUExfSU5UUl9QQ0lYICAgIFZfUExfSU5UUl9QQ0lYKDFVKQpAQCAtNDI2LDQzICsxNzk1LDM3NCBAQAogI2RlZmluZSBBX1BMX0NBVVNFIDB4YTA0CiAKIC8qIE1DNSByZWdpc3RlcnMgKi8KLQogI2RlZmluZSBBX01DNV9DT05GSUcgMHhjMDQKIAorI2RlZmluZSBTX01PREUgICAgMAorI2RlZmluZSBWX01PREUoeCkgKCh4KSA8PCBTX01PREUpCisjZGVmaW5lIEZfTU9ERSAgICBWX01PREUoMVUpCisKICNkZWZpbmUgU19UQ0FNX1JFU0VUICAgIDEKICNkZWZpbmUgVl9UQ0FNX1JFU0VUKHgpICgoeCkgPDwgU19UQ0FNX1JFU0VUKQogI2RlZmluZSBGX1RDQU1fUkVTRVQgICAgVl9UQ0FNX1JFU0VUKDFVKQogCisjZGVmaW5lIFNfVENBTV9SRUFEWSAgICAyCisjZGVmaW5lIFZfVENBTV9SRUFEWSh4KSAoKHgpIDw8IFNfVENBTV9SRUFEWSkKKyNkZWZpbmUgRl9UQ0FNX1JFQURZICAgIFZfVENBTV9SRUFEWSgxVSkKKworI2RlZmluZSBTX0RCR0lfRU5BQkxFICAgIDQKKyNkZWZpbmUgVl9EQkdJX0VOQUJMRSh4KSAoKHgpIDw8IFNfREJHSV9FTkFCTEUpCisjZGVmaW5lIEZfREJHSV9FTkFCTEUgICAgVl9EQkdJX0VOQUJMRSgxVSkKKwogI2RlZmluZSBTX01fQlVTX0VOQUJMRSAgICA1CiAjZGVmaW5lIFZfTV9CVVNfRU5BQkxFKHgpICgoeCkgPDwgU19NX0JVU19FTkFCTEUpCiAjZGVmaW5lIEZfTV9CVVNfRU5BQkxFICAgIFZfTV9CVVNfRU5BQkxFKDFVKQogCi0vKiBQQ0lDRkcgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNfUEFSSVRZX0VOQUJMRSAgICA2CisjZGVmaW5lIFZfUEFSSVRZX0VOQUJMRSh4KSAoKHgpIDw8IFNfUEFSSVRZX0VOQUJMRSkKKyNkZWZpbmUgRl9QQVJJVFlfRU5BQkxFICAgIFZfUEFSSVRZX0VOQUJMRSgxVSkKIAorI2RlZmluZSBTX1NZTl9JU1NVRV9NT0RFICAgIDcKKyNkZWZpbmUgTV9TWU5fSVNTVUVfTU9ERSAgICAweDMKKyNkZWZpbmUgVl9TWU5fSVNTVUVfTU9ERSh4KSAoKHgpIDw8IFNfU1lOX0lTU1VFX01PREUpCisjZGVmaW5lIEdfU1lOX0lTU1VFX01PREUoeCkgKCgoeCkgPj4gU19TWU5fSVNTVUVfTU9ERSkgJiBNX1NZTl9JU1NVRV9NT0RFKQorCisjZGVmaW5lIFNfQlVJTEQgICAgMTYKKyNkZWZpbmUgVl9CVUlMRCh4KSAoKHgpIDw8IFNfQlVJTEQpCisjZGVmaW5lIEZfQlVJTEQgICAgVl9CVUlMRCgxVSkKKworI2RlZmluZSBTX0NPTVBSRVNTSU9OX0VOQUJMRSAgICAxNworI2RlZmluZSBWX0NPTVBSRVNTSU9OX0VOQUJMRSh4KSAoKHgpIDw8IFNfQ09NUFJFU1NJT05fRU5BQkxFKQorI2RlZmluZSBGX0NPTVBSRVNTSU9OX0VOQUJMRSAgICBWX0NPTVBSRVNTSU9OX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX05VTV9MSVAgICAgMTgKKyNkZWZpbmUgTV9OVU1fTElQICAgIDB4M2YKKyNkZWZpbmUgVl9OVU1fTElQKHgpICgoeCkgPDwgU19OVU1fTElQKQorI2RlZmluZSBHX05VTV9MSVAoeCkgKCgoeCkgPj4gU19OVU1fTElQKSAmIE1fTlVNX0xJUCkKKworI2RlZmluZSBTX1RDQU1fUEFSVF9DTlQgICAgMjQKKyNkZWZpbmUgTV9UQ0FNX1BBUlRfQ05UICAgIDB4MworI2RlZmluZSBWX1RDQU1fUEFSVF9DTlQoeCkgKCh4KSA8PCBTX1RDQU1fUEFSVF9DTlQpCisjZGVmaW5lIEdfVENBTV9QQVJUX0NOVCh4KSAoKCh4KSA+PiBTX1RDQU1fUEFSVF9DTlQpICYgTV9UQ0FNX1BBUlRfQ05UKQorCisjZGVmaW5lIFNfVENBTV9QQVJUX1RZUEUgICAgMjYKKyNkZWZpbmUgTV9UQ0FNX1BBUlRfVFlQRSAgICAweDMKKyNkZWZpbmUgVl9UQ0FNX1BBUlRfVFlQRSh4KSAoKHgpIDw8IFNfVENBTV9QQVJUX1RZUEUpCisjZGVmaW5lIEdfVENBTV9QQVJUX1RZUEUoeCkgKCgoeCkgPj4gU19UQ0FNX1BBUlRfVFlQRSkgJiBNX1RDQU1fUEFSVF9UWVBFKQorCisjZGVmaW5lIFNfVENBTV9QQVJUX1NJWkUgICAgMjgKKyNkZWZpbmUgTV9UQ0FNX1BBUlRfU0laRSAgICAweDMKKyNkZWZpbmUgVl9UQ0FNX1BBUlRfU0laRSh4KSAoKHgpIDw8IFNfVENBTV9QQVJUX1NJWkUpCisjZGVmaW5lIEdfVENBTV9QQVJUX1NJWkUoeCkgKCgoeCkgPj4gU19UQ0FNX1BBUlRfU0laRSkgJiBNX1RDQU1fUEFSVF9TSVpFKQorCisjZGVmaW5lIFNfVENBTV9QQVJUX1RZUEVfSEkgICAgMzAKKyNkZWZpbmUgVl9UQ0FNX1BBUlRfVFlQRV9ISSh4KSAoKHgpIDw8IFNfVENBTV9QQVJUX1RZUEVfSEkpCisjZGVmaW5lIEZfVENBTV9QQVJUX1RZUEVfSEkgICAgVl9UQ0FNX1BBUlRfVFlQRV9ISSgxVSkKKworI2RlZmluZSBBX01DNV9TSVpFIDB4YzA4CisKKyNkZWZpbmUgU19TSVpFICAgIDAKKyNkZWZpbmUgTV9TSVpFICAgIDB4M2ZmZmZmCisjZGVmaW5lIFZfU0laRSh4KSAoKHgpIDw8IFNfU0laRSkKKyNkZWZpbmUgR19TSVpFKHgpICgoKHgpID4+IFNfU0laRSkgJiBNX1NJWkUpCisKKyNkZWZpbmUgQV9NQzVfUk9VVElOR19UQUJMRV9JTkRFWCAweGMwYworCisjZGVmaW5lIFNfU1RBUlRfT0ZfUk9VVElOR19UQUJMRSAgICAwCisjZGVmaW5lIE1fU1RBUlRfT0ZfUk9VVElOR19UQUJMRSAgICAweDNmZmZmZgorI2RlZmluZSBWX1NUQVJUX09GX1JPVVRJTkdfVEFCTEUoeCkgKCh4KSA8PCBTX1NUQVJUX09GX1JPVVRJTkdfVEFCTEUpCisjZGVmaW5lIEdfU1RBUlRfT0ZfUk9VVElOR19UQUJMRSh4KSAoKCh4KSA+PiBTX1NUQVJUX09GX1JPVVRJTkdfVEFCTEUpICYgTV9TVEFSVF9PRl9ST1VUSU5HX1RBQkxFKQorCisjZGVmaW5lIEFfTUM1X1NFUlZFUl9JTkRFWCAweGMxNAorCisjZGVmaW5lIFNfU1RBUlRfT0ZfU0VSVkVSX0lOREVYICAgIDAKKyNkZWZpbmUgTV9TVEFSVF9PRl9TRVJWRVJfSU5ERVggICAgMHgzZmZmZmYKKyNkZWZpbmUgVl9TVEFSVF9PRl9TRVJWRVJfSU5ERVgoeCkgKCh4KSA8PCBTX1NUQVJUX09GX1NFUlZFUl9JTkRFWCkKKyNkZWZpbmUgR19TVEFSVF9PRl9TRVJWRVJfSU5ERVgoeCkgKCgoeCkgPj4gU19TVEFSVF9PRl9TRVJWRVJfSU5ERVgpICYgTV9TVEFSVF9PRl9TRVJWRVJfSU5ERVgpCisKKyNkZWZpbmUgQV9NQzVfTElQX1JBTV9BRERSIDB4YzE4CisKKyNkZWZpbmUgU19MT0NBTF9JUF9SQU1fQUREUiAgICAwCisjZGVmaW5lIE1fTE9DQUxfSVBfUkFNX0FERFIgICAgMHgzZgorI2RlZmluZSBWX0xPQ0FMX0lQX1JBTV9BRERSKHgpICgoeCkgPDwgU19MT0NBTF9JUF9SQU1fQUREUikKKyNkZWZpbmUgR19MT0NBTF9JUF9SQU1fQUREUih4KSAoKCh4KSA+PiBTX0xPQ0FMX0lQX1JBTV9BRERSKSAmIE1fTE9DQUxfSVBfUkFNX0FERFIpCisKKyNkZWZpbmUgU19SQU1fV1JJVEVfRU5BQkxFICAgIDgKKyNkZWZpbmUgVl9SQU1fV1JJVEVfRU5BQkxFKHgpICgoeCkgPDwgU19SQU1fV1JJVEVfRU5BQkxFKQorI2RlZmluZSBGX1JBTV9XUklURV9FTkFCTEUgICAgVl9SQU1fV1JJVEVfRU5BQkxFKDFVKQorCisjZGVmaW5lIEFfTUM1X0xJUF9SQU1fREFUQSAweGMxYworI2RlZmluZSBBX01DNV9SU1BfTEFURU5DWSAweGMyMAorCisjZGVmaW5lIFNfU0VBUkNIX1JFU1BPTlNFX0xBVEVOQ1kgICAgMAorI2RlZmluZSBNX1NFQVJDSF9SRVNQT05TRV9MQVRFTkNZICAgIDB4MWYKKyNkZWZpbmUgVl9TRUFSQ0hfUkVTUE9OU0VfTEFURU5DWSh4KSAoKHgpIDw8IFNfU0VBUkNIX1JFU1BPTlNFX0xBVEVOQ1kpCisjZGVmaW5lIEdfU0VBUkNIX1JFU1BPTlNFX0xBVEVOQ1koeCkgKCgoeCkgPj4gU19TRUFSQ0hfUkVTUE9OU0VfTEFURU5DWSkgJiBNX1NFQVJDSF9SRVNQT05TRV9MQVRFTkNZKQorCisjZGVmaW5lIFNfTEVBUk5fUkVTUE9OU0VfTEFURU5DWSAgICA4CisjZGVmaW5lIE1fTEVBUk5fUkVTUE9OU0VfTEFURU5DWSAgICAweDFmCisjZGVmaW5lIFZfTEVBUk5fUkVTUE9OU0VfTEFURU5DWSh4KSAoKHgpIDw8IFNfTEVBUk5fUkVTUE9OU0VfTEFURU5DWSkKKyNkZWZpbmUgR19MRUFSTl9SRVNQT05TRV9MQVRFTkNZKHgpICgoKHgpID4+IFNfTEVBUk5fUkVTUE9OU0VfTEFURU5DWSkgJiBNX0xFQVJOX1JFU1BPTlNFX0xBVEVOQ1kpCisKKyNkZWZpbmUgQV9NQzVfUEFSSVRZX0xBVEVOQ1kgMHhjMjQKKworI2RlZmluZSBTX1NSQ0hMQVQgICAgMAorI2RlZmluZSBNX1NSQ0hMQVQgICAgMHgxZgorI2RlZmluZSBWX1NSQ0hMQVQoeCkgKCh4KSA8PCBTX1NSQ0hMQVQpCisjZGVmaW5lIEdfU1JDSExBVCh4KSAoKCh4KSA+PiBTX1NSQ0hMQVQpICYgTV9TUkNITEFUKQorCisjZGVmaW5lIFNfUEFSTEFUICAgIDgKKyNkZWZpbmUgTV9QQVJMQVQgICAgMHgxZgorI2RlZmluZSBWX1BBUkxBVCh4KSAoKHgpIDw8IFNfUEFSTEFUKQorI2RlZmluZSBHX1BBUkxBVCh4KSAoKCh4KSA+PiBTX1BBUkxBVCkgJiBNX1BBUkxBVCkKKworI2RlZmluZSBBX01DNV9XUl9MUk5fVkVSSUZZIDB4YzI4CisKKyNkZWZpbmUgU19QT1ZFUkVOICAgIDAKKyNkZWZpbmUgVl9QT1ZFUkVOKHgpICgoeCkgPDwgU19QT1ZFUkVOKQorI2RlZmluZSBGX1BPVkVSRU4gICAgVl9QT1ZFUkVOKDFVKQorCisjZGVmaW5lIFNfTFJOVkVSRU4gICAgMQorI2RlZmluZSBWX0xSTlZFUkVOKHgpICgoeCkgPDwgU19MUk5WRVJFTikKKyNkZWZpbmUgRl9MUk5WRVJFTiAgICBWX0xSTlZFUkVOKDFVKQorCisjZGVmaW5lIFNfVldWRVJFTiAgICAyCisjZGVmaW5lIFZfVldWRVJFTih4KSAoKHgpIDw8IFNfVldWRVJFTikKKyNkZWZpbmUgRl9WV1ZFUkVOICAgIFZfVldWRVJFTigxVSkKKworI2RlZmluZSBBX01DNV9QQVJUX0lEX0lOREVYIDB4YzJjCisKKyNkZWZpbmUgU19JRElOREVYICAgIDAKKyNkZWZpbmUgTV9JRElOREVYICAgIDB4ZgorI2RlZmluZSBWX0lESU5ERVgoeCkgKCh4KSA8PCBTX0lESU5ERVgpCisjZGVmaW5lIEdfSURJTkRFWCh4KSAoKCh4KSA+PiBTX0lESU5ERVgpICYgTV9JRElOREVYKQorCisjZGVmaW5lIEFfTUM1X1JFU0VUX01BWCAweGMzMAorCisjZGVmaW5lIFNfUlNUTUFYICAgIDAKKyNkZWZpbmUgTV9SU1RNQVggICAgMHgxZmYKKyNkZWZpbmUgVl9SU1RNQVgoeCkgKCh4KSA8PCBTX1JTVE1BWCkKKyNkZWZpbmUgR19SU1RNQVgoeCkgKCgoeCkgPj4gU19SU1RNQVgpICYgTV9SU1RNQVgpCisKKyNkZWZpbmUgQV9NQzVfSU5UX0VOQUJMRSAweGM0MAorCisjZGVmaW5lIFNfTUM1X0lOVF9ISVRfT1VUX0FDVElWRV9SRUdJT05fRVJSICAgIDAKKyNkZWZpbmUgVl9NQzVfSU5UX0hJVF9PVVRfQUNUSVZFX1JFR0lPTl9FUlIoeCkgKCh4KSA8PCBTX01DNV9JTlRfSElUX09VVF9BQ1RJVkVfUkVHSU9OX0VSUikKKyNkZWZpbmUgRl9NQzVfSU5UX0hJVF9PVVRfQUNUSVZFX1JFR0lPTl9FUlIgICAgVl9NQzVfSU5UX0hJVF9PVVRfQUNUSVZFX1JFR0lPTl9FUlIoMVUpCisKKyNkZWZpbmUgU19NQzVfSU5UX0hJVF9JTl9BQ1RJVkVfUkVHSU9OX0VSUiAgICAxCisjZGVmaW5lIFZfTUM1X0lOVF9ISVRfSU5fQUNUSVZFX1JFR0lPTl9FUlIoeCkgKCh4KSA8PCBTX01DNV9JTlRfSElUX0lOX0FDVElWRV9SRUdJT05fRVJSKQorI2RlZmluZSBGX01DNV9JTlRfSElUX0lOX0FDVElWRV9SRUdJT05fRVJSICAgIFZfTUM1X0lOVF9ISVRfSU5fQUNUSVZFX1JFR0lPTl9FUlIoMVUpCisKKyNkZWZpbmUgU19NQzVfSU5UX0hJVF9JTl9SVF9SRUdJT05fRVJSICAgIDIKKyNkZWZpbmUgVl9NQzVfSU5UX0hJVF9JTl9SVF9SRUdJT05fRVJSKHgpICgoeCkgPDwgU19NQzVfSU5UX0hJVF9JTl9SVF9SRUdJT05fRVJSKQorI2RlZmluZSBGX01DNV9JTlRfSElUX0lOX1JUX1JFR0lPTl9FUlIgICAgVl9NQzVfSU5UX0hJVF9JTl9SVF9SRUdJT05fRVJSKDFVKQorCisjZGVmaW5lIFNfTUM1X0lOVF9NSVNTX0VSUiAgICAzCisjZGVmaW5lIFZfTUM1X0lOVF9NSVNTX0VSUih4KSAoKHgpIDw8IFNfTUM1X0lOVF9NSVNTX0VSUikKKyNkZWZpbmUgRl9NQzVfSU5UX01JU1NfRVJSICAgIFZfTUM1X0lOVF9NSVNTX0VSUigxVSkKKworI2RlZmluZSBTX01DNV9JTlRfTElQMF9FUlIgICAgNAorI2RlZmluZSBWX01DNV9JTlRfTElQMF9FUlIoeCkgKCh4KSA8PCBTX01DNV9JTlRfTElQMF9FUlIpCisjZGVmaW5lIEZfTUM1X0lOVF9MSVAwX0VSUiAgICBWX01DNV9JTlRfTElQMF9FUlIoMVUpCisKKyNkZWZpbmUgU19NQzVfSU5UX0xJUF9NSVNTX0VSUiAgICA1CisjZGVmaW5lIFZfTUM1X0lOVF9MSVBfTUlTU19FUlIoeCkgKCh4KSA8PCBTX01DNV9JTlRfTElQX01JU1NfRVJSKQorI2RlZmluZSBGX01DNV9JTlRfTElQX01JU1NfRVJSICAgIFZfTUM1X0lOVF9MSVBfTUlTU19FUlIoMVUpCisKKyNkZWZpbmUgU19NQzVfSU5UX1BBUklUWV9FUlIgICAgNgorI2RlZmluZSBWX01DNV9JTlRfUEFSSVRZX0VSUih4KSAoKHgpIDw8IFNfTUM1X0lOVF9QQVJJVFlfRVJSKQorI2RlZmluZSBGX01DNV9JTlRfUEFSSVRZX0VSUiAgICBWX01DNV9JTlRfUEFSSVRZX0VSUigxVSkKKworI2RlZmluZSBTX01DNV9JTlRfQUNUSVZFX1JFR0lPTl9GVUxMICAgIDcKKyNkZWZpbmUgVl9NQzVfSU5UX0FDVElWRV9SRUdJT05fRlVMTCh4KSAoKHgpIDw8IFNfTUM1X0lOVF9BQ1RJVkVfUkVHSU9OX0ZVTEwpCisjZGVmaW5lIEZfTUM1X0lOVF9BQ1RJVkVfUkVHSU9OX0ZVTEwgICAgVl9NQzVfSU5UX0FDVElWRV9SRUdJT05fRlVMTCgxVSkKKworI2RlZmluZSBTX01DNV9JTlRfTkZBX1NSQ0hfRVJSICAgIDgKKyNkZWZpbmUgVl9NQzVfSU5UX05GQV9TUkNIX0VSUih4KSAoKHgpIDw8IFNfTUM1X0lOVF9ORkFfU1JDSF9FUlIpCisjZGVmaW5lIEZfTUM1X0lOVF9ORkFfU1JDSF9FUlIgICAgVl9NQzVfSU5UX05GQV9TUkNIX0VSUigxVSkKKworI2RlZmluZSBTX01DNV9JTlRfU1lOX0NPT0tJRSAgICA5CisjZGVmaW5lIFZfTUM1X0lOVF9TWU5fQ09PS0lFKHgpICgoeCkgPDwgU19NQzVfSU5UX1NZTl9DT09LSUUpCisjZGVmaW5lIEZfTUM1X0lOVF9TWU5fQ09PS0lFICAgIFZfTUM1X0lOVF9TWU5fQ09PS0lFKDFVKQorCisjZGVmaW5lIFNfTUM1X0lOVF9TWU5fQ09PS0lFX0JBRCAgICAxMAorI2RlZmluZSBWX01DNV9JTlRfU1lOX0NPT0tJRV9CQUQoeCkgKCh4KSA8PCBTX01DNV9JTlRfU1lOX0NPT0tJRV9CQUQpCisjZGVmaW5lIEZfTUM1X0lOVF9TWU5fQ09PS0lFX0JBRCAgICBWX01DNV9JTlRfU1lOX0NPT0tJRV9CQUQoMVUpCisKKyNkZWZpbmUgU19NQzVfSU5UX1NZTl9DT09LSUVfT0ZGICAgIDExCisjZGVmaW5lIFZfTUM1X0lOVF9TWU5fQ09PS0lFX09GRih4KSAoKHgpIDw8IFNfTUM1X0lOVF9TWU5fQ09PS0lFX09GRikKKyNkZWZpbmUgRl9NQzVfSU5UX1NZTl9DT09LSUVfT0ZGICAgIFZfTUM1X0lOVF9TWU5fQ09PS0lFX09GRigxVSkKKworI2RlZmluZSBTX01DNV9JTlRfVU5LTk9XTl9DTUQgICAgMTUKKyNkZWZpbmUgVl9NQzVfSU5UX1VOS05PV05fQ01EKHgpICgoeCkgPDwgU19NQzVfSU5UX1VOS05PV05fQ01EKQorI2RlZmluZSBGX01DNV9JTlRfVU5LTk9XTl9DTUQgICAgVl9NQzVfSU5UX1VOS05PV05fQ01EKDFVKQorCisjZGVmaW5lIFNfTUM1X0lOVF9SRVFVRVNUUV9QQVJJVFlfRVJSICAgIDE2CisjZGVmaW5lIFZfTUM1X0lOVF9SRVFVRVNUUV9QQVJJVFlfRVJSKHgpICgoeCkgPDwgU19NQzVfSU5UX1JFUVVFU1RRX1BBUklUWV9FUlIpCisjZGVmaW5lIEZfTUM1X0lOVF9SRVFVRVNUUV9QQVJJVFlfRVJSICAgIFZfTUM1X0lOVF9SRVFVRVNUUV9QQVJJVFlfRVJSKDFVKQorCisjZGVmaW5lIFNfTUM1X0lOVF9ESVNQQVRDSFFfUEFSSVRZX0VSUiAgICAxNworI2RlZmluZSBWX01DNV9JTlRfRElTUEFUQ0hRX1BBUklUWV9FUlIoeCkgKCh4KSA8PCBTX01DNV9JTlRfRElTUEFUQ0hRX1BBUklUWV9FUlIpCisjZGVmaW5lIEZfTUM1X0lOVF9ESVNQQVRDSFFfUEFSSVRZX0VSUiAgICBWX01DNV9JTlRfRElTUEFUQ0hRX1BBUklUWV9FUlIoMVUpCisKKyNkZWZpbmUgU19NQzVfSU5UX0RFTF9BQ1RfRU1QVFkgICAgMTgKKyNkZWZpbmUgVl9NQzVfSU5UX0RFTF9BQ1RfRU1QVFkoeCkgKCh4KSA8PCBTX01DNV9JTlRfREVMX0FDVF9FTVBUWSkKKyNkZWZpbmUgRl9NQzVfSU5UX0RFTF9BQ1RfRU1QVFkgICAgVl9NQzVfSU5UX0RFTF9BQ1RfRU1QVFkoMVUpCisKKyNkZWZpbmUgQV9NQzVfSU5UX0NBVVNFIDB4YzQ0CisjZGVmaW5lIEFfTUM1X0lOVF9USUQgMHhjNDgKKyNkZWZpbmUgQV9NQzVfSU5UX1BUSUQgMHhjNGMKKyNkZWZpbmUgQV9NQzVfREJHSV9DT05GSUcgMHhjNzQKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfQ01EIDB4Yzc4CisKKyNkZWZpbmUgU19DTURNT0RFICAgIDAKKyNkZWZpbmUgTV9DTURNT0RFICAgIDB4NworI2RlZmluZSBWX0NNRE1PREUoeCkgKCh4KSA8PCBTX0NNRE1PREUpCisjZGVmaW5lIEdfQ01ETU9ERSh4KSAoKCh4KSA+PiBTX0NNRE1PREUpICYgTV9DTURNT0RFKQorCisjZGVmaW5lIFNfU0FEUlNFTCAgICA0CisjZGVmaW5lIFZfU0FEUlNFTCh4KSAoKHgpIDw8IFNfU0FEUlNFTCkKKyNkZWZpbmUgRl9TQURSU0VMICAgIFZfU0FEUlNFTCgxVSkKKworI2RlZmluZSBTX1dSSVRFX0JVUlNUX1NJWkUgICAgMjIKKyNkZWZpbmUgTV9XUklURV9CVVJTVF9TSVpFICAgIDB4M2ZmCisjZGVmaW5lIFZfV1JJVEVfQlVSU1RfU0laRSh4KSAoKHgpIDw8IFNfV1JJVEVfQlVSU1RfU0laRSkKKyNkZWZpbmUgR19XUklURV9CVVJTVF9TSVpFKHgpICgoKHgpID4+IFNfV1JJVEVfQlVSU1RfU0laRSkgJiBNX1dSSVRFX0JVUlNUX1NJWkUpCisKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfQUREUjAgMHhjN2MKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfQUREUjEgMHhjODAKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfQUREUjIgMHhjODQKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfREFUQTAgMHhjODgKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfREFUQTEgMHhjOGMKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfREFUQTIgMHhjOTAKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfREFUQTMgMHhjOTQKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfREFUQTQgMHhjOTgKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfTUFTSzAgMHhjOWMKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfTUFTSzEgMHhjYTAKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfTUFTSzIgMHhjYTQKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfTUFTSzMgMHhjYTgKKyNkZWZpbmUgQV9NQzVfREJHSV9SRVFfTUFTSzQgMHhjYWMKKyNkZWZpbmUgQV9NQzVfREJHSV9SU1BfU1RBVFVTIDB4Y2IwCisKKyNkZWZpbmUgU19EQkdJX1JTUF9WQUxJRCAgICAwCisjZGVmaW5lIFZfREJHSV9SU1BfVkFMSUQoeCkgKCh4KSA8PCBTX0RCR0lfUlNQX1ZBTElEKQorI2RlZmluZSBGX0RCR0lfUlNQX1ZBTElEICAgIFZfREJHSV9SU1BfVkFMSUQoMVUpCisKKyNkZWZpbmUgU19EQkdJX1JTUF9ISVQgICAgMQorI2RlZmluZSBWX0RCR0lfUlNQX0hJVCh4KSAoKHgpIDw8IFNfREJHSV9SU1BfSElUKQorI2RlZmluZSBGX0RCR0lfUlNQX0hJVCAgICBWX0RCR0lfUlNQX0hJVCgxVSkKKworI2RlZmluZSBTX0RCR0lfUlNQX0VSUiAgICAyCisjZGVmaW5lIFZfREJHSV9SU1BfRVJSKHgpICgoeCkgPDwgU19EQkdJX1JTUF9FUlIpCisjZGVmaW5lIEZfREJHSV9SU1BfRVJSICAgIFZfREJHSV9SU1BfRVJSKDFVKQorCisjZGVmaW5lIFNfREJHSV9SU1BfRVJSX1JFQVNPTiAgICA4CisjZGVmaW5lIE1fREJHSV9SU1BfRVJSX1JFQVNPTiAgICAweDcKKyNkZWZpbmUgVl9EQkdJX1JTUF9FUlJfUkVBU09OKHgpICgoeCkgPDwgU19EQkdJX1JTUF9FUlJfUkVBU09OKQorI2RlZmluZSBHX0RCR0lfUlNQX0VSUl9SRUFTT04oeCkgKCgoeCkgPj4gU19EQkdJX1JTUF9FUlJfUkVBU09OKSAmIE1fREJHSV9SU1BfRVJSX1JFQVNPTikKKworI2RlZmluZSBBX01DNV9EQkdJX1JTUF9EQVRBMCAweGNiNAorI2RlZmluZSBBX01DNV9EQkdJX1JTUF9EQVRBMSAweGNiOAorI2RlZmluZSBBX01DNV9EQkdJX1JTUF9EQVRBMiAweGNiYworI2RlZmluZSBBX01DNV9EQkdJX1JTUF9EQVRBMyAweGNjMAorI2RlZmluZSBBX01DNV9EQkdJX1JTUF9EQVRBNCAweGNjNAorI2RlZmluZSBBX01DNV9EQkdJX1JTUF9MQVNUX0NNRCAweGNjOAorI2RlZmluZSBBX01DNV9QT1BFTl9EQVRBX1dSX0NNRCAweGNjYworI2RlZmluZSBBX01DNV9QT1BFTl9NQVNLX1dSX0NNRCAweGNkMAorI2RlZmluZSBBX01DNV9BT1BFTl9TUkNIX0NNRCAweGNkNAorI2RlZmluZSBBX01DNV9BT1BFTl9MUk5fQ01EIDB4Y2Q4CisjZGVmaW5lIEFfTUM1X1NZTl9TUkNIX0NNRCAweGNkYworI2RlZmluZSBBX01DNV9TWU5fTFJOX0NNRCAweGNlMAorI2RlZmluZSBBX01DNV9BQ0tfU1JDSF9DTUQgMHhjZTQKKyNkZWZpbmUgQV9NQzVfQUNLX0xSTl9DTUQgMHhjZTgKKyNkZWZpbmUgQV9NQzVfSUxPT0tVUF9DTUQgMHhjZWMKKyNkZWZpbmUgQV9NQzVfRUxPT0tVUF9DTUQgMHhjZjAKKyNkZWZpbmUgQV9NQzVfREFUQV9XUklURV9DTUQgMHhjZjQKKyNkZWZpbmUgQV9NQzVfREFUQV9SRUFEX0NNRCAweGNmOAorI2RlZmluZSBBX01DNV9NQVNLX1dSSVRFX0NNRCAweGNmYworCisvKiBQQ0lDRkcgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFfUENJQ0ZHX1BNX0NTUiAweDQ0CiAjZGVmaW5lIEFfUENJQ0ZHX1ZQRF9BRERSIDB4NGEKIAorI2RlZmluZSBTX1ZQRF9BRERSICAgIDAKKyNkZWZpbmUgTV9WUERfQUREUiAgICAweDdmZmYKKyNkZWZpbmUgVl9WUERfQUREUih4KSAoKHgpIDw8IFNfVlBEX0FERFIpCisjZGVmaW5lIEdfVlBEX0FERFIoeCkgKCgoeCkgPj4gU19WUERfQUREUikgJiBNX1ZQRF9BRERSKQorCiAjZGVmaW5lIFNfVlBEX09QX0ZMQUcgICAgMTUKICNkZWZpbmUgVl9WUERfT1BfRkxBRyh4KSAoKHgpIDw8IFNfVlBEX09QX0ZMQUcpCiAjZGVmaW5lIEZfVlBEX09QX0ZMQUcgICAgVl9WUERfT1BfRkxBRygxVSkKIAogI2RlZmluZSBBX1BDSUNGR19WUERfREFUQSAweDRjCi0KKyNkZWZpbmUgQV9QQ0lDRkdfUENJWF9DTUQgMHg2MAogI2RlZmluZSBBX1BDSUNGR19JTlRSX0VOQUJMRSAweGY0Ci0jZGVmaW5lIEFfUENJQ0ZHX0lOVFJfQ0FVU0UgMHhmOAogCisjZGVmaW5lIFNfTUFTVEVSX1BBUklUWV9FUlIgICAgMAorI2RlZmluZSBWX01BU1RFUl9QQVJJVFlfRVJSKHgpICgoeCkgPDwgU19NQVNURVJfUEFSSVRZX0VSUikKKyNkZWZpbmUgRl9NQVNURVJfUEFSSVRZX0VSUiAgICBWX01BU1RFUl9QQVJJVFlfRVJSKDFVKQorCisjZGVmaW5lIFNfU0lHX1RBUkdFVF9BQk9SVCAgICAxCisjZGVmaW5lIFZfU0lHX1RBUkdFVF9BQk9SVCh4KSAoKHgpIDw8IFNfU0lHX1RBUkdFVF9BQk9SVCkKKyNkZWZpbmUgRl9TSUdfVEFSR0VUX0FCT1JUICAgIFZfU0lHX1RBUkdFVF9BQk9SVCgxVSkKKworI2RlZmluZSBTX1JDVl9UQVJHRVRfQUJPUlQgICAgMgorI2RlZmluZSBWX1JDVl9UQVJHRVRfQUJPUlQoeCkgKCh4KSA8PCBTX1JDVl9UQVJHRVRfQUJPUlQpCisjZGVmaW5lIEZfUkNWX1RBUkdFVF9BQk9SVCAgICBWX1JDVl9UQVJHRVRfQUJPUlQoMVUpCisKKyNkZWZpbmUgU19SQ1ZfTUFTVEVSX0FCT1JUICAgIDMKKyNkZWZpbmUgVl9SQ1ZfTUFTVEVSX0FCT1JUKHgpICgoeCkgPDwgU19SQ1ZfTUFTVEVSX0FCT1JUKQorI2RlZmluZSBGX1JDVl9NQVNURVJfQUJPUlQgICAgVl9SQ1ZfTUFTVEVSX0FCT1JUKDFVKQorCisjZGVmaW5lIFNfU0lHX1NZU19FUlIgICAgNAorI2RlZmluZSBWX1NJR19TWVNfRVJSKHgpICgoeCkgPDwgU19TSUdfU1lTX0VSUikKKyNkZWZpbmUgRl9TSUdfU1lTX0VSUiAgICBWX1NJR19TWVNfRVJSKDFVKQorCisjZGVmaW5lIFNfREVUX1BBUklUWV9FUlIgICAgNQorI2RlZmluZSBWX0RFVF9QQVJJVFlfRVJSKHgpICgoeCkgPDwgU19ERVRfUEFSSVRZX0VSUikKKyNkZWZpbmUgRl9ERVRfUEFSSVRZX0VSUiAgICBWX0RFVF9QQVJJVFlfRVJSKDFVKQorCisjZGVmaW5lIFNfUElPX1BBUklUWV9FUlIgICAgNgorI2RlZmluZSBWX1BJT19QQVJJVFlfRVJSKHgpICgoeCkgPDwgU19QSU9fUEFSSVRZX0VSUikKKyNkZWZpbmUgRl9QSU9fUEFSSVRZX0VSUiAgICBWX1BJT19QQVJJVFlfRVJSKDFVKQorCisjZGVmaW5lIFNfV0ZfUEFSSVRZX0VSUiAgICA3CisjZGVmaW5lIFZfV0ZfUEFSSVRZX0VSUih4KSAoKHgpIDw8IFNfV0ZfUEFSSVRZX0VSUikKKyNkZWZpbmUgRl9XRl9QQVJJVFlfRVJSICAgIFZfV0ZfUEFSSVRZX0VSUigxVSkKKworI2RlZmluZSBTX1JGX1BBUklUWV9FUlIgICAgOAorI2RlZmluZSBNX1JGX1BBUklUWV9FUlIgICAgMHgzCisjZGVmaW5lIFZfUkZfUEFSSVRZX0VSUih4KSAoKHgpIDw8IFNfUkZfUEFSSVRZX0VSUikKKyNkZWZpbmUgR19SRl9QQVJJVFlfRVJSKHgpICgoKHgpID4+IFNfUkZfUEFSSVRZX0VSUikgJiBNX1JGX1BBUklUWV9FUlIpCisKKyNkZWZpbmUgU19DRl9QQVJJVFlfRVJSICAgIDEwCisjZGVmaW5lIE1fQ0ZfUEFSSVRZX0VSUiAgICAweDMKKyNkZWZpbmUgVl9DRl9QQVJJVFlfRVJSKHgpICgoeCkgPDwgU19DRl9QQVJJVFlfRVJSKQorI2RlZmluZSBHX0NGX1BBUklUWV9FUlIoeCkgKCgoeCkgPj4gU19DRl9QQVJJVFlfRVJSKSAmIE1fQ0ZfUEFSSVRZX0VSUikKKworI2RlZmluZSBBX1BDSUNGR19JTlRSX0NBVVNFIDB4ZjgKICNkZWZpbmUgQV9QQ0lDRkdfTU9ERSAweGZjCiAKICNkZWZpbmUgU19QQ0lfTU9ERV82NEJJVCAgICAwCiAjZGVmaW5lIFZfUENJX01PREVfNjRCSVQoeCkgKCh4KSA8PCBTX1BDSV9NT0RFXzY0QklUKQogI2RlZmluZSBGX1BDSV9NT0RFXzY0QklUICAgIFZfUENJX01PREVfNjRCSVQoMVUpCiAKKyNkZWZpbmUgU19QQ0lfTU9ERV82Nk1IWiAgICAxCisjZGVmaW5lIFZfUENJX01PREVfNjZNSFooeCkgKCh4KSA8PCBTX1BDSV9NT0RFXzY2TUhaKQorI2RlZmluZSBGX1BDSV9NT0RFXzY2TUhaICAgIFZfUENJX01PREVfNjZNSFooMVUpCisKKyNkZWZpbmUgU19QQ0lfTU9ERV9QQ0lYX0lOSVRQQVQgICAgMgorI2RlZmluZSBNX1BDSV9NT0RFX1BDSVhfSU5JVFBBVCAgICAweDcKKyNkZWZpbmUgVl9QQ0lfTU9ERV9QQ0lYX0lOSVRQQVQoeCkgKCh4KSA8PCBTX1BDSV9NT0RFX1BDSVhfSU5JVFBBVCkKKyNkZWZpbmUgR19QQ0lfTU9ERV9QQ0lYX0lOSVRQQVQoeCkgKCgoeCkgPj4gU19QQ0lfTU9ERV9QQ0lYX0lOSVRQQVQpICYgTV9QQ0lfTU9ERV9QQ0lYX0lOSVRQQVQpCisKICNkZWZpbmUgU19QQ0lfTU9ERV9QQ0lYICAgIDUKICNkZWZpbmUgVl9QQ0lfTU9ERV9QQ0lYKHgpICgoeCkgPDwgU19QQ0lfTU9ERV9QQ0lYKQogI2RlZmluZSBGX1BDSV9NT0RFX1BDSVggICAgVl9QQ0lfTU9ERV9QQ0lYKDFVKQogCiAjZGVmaW5lIFNfUENJX01PREVfQ0xLICAgIDYKICNkZWZpbmUgTV9QQ0lfTU9ERV9DTEsgICAgMHgzCisjZGVmaW5lIFZfUENJX01PREVfQ0xLKHgpICgoeCkgPDwgU19QQ0lfTU9ERV9DTEspCiAjZGVmaW5lIEdfUENJX01PREVfQ0xLKHgpICgoKHgpID4+IFNfUENJX01PREVfQ0xLKSAmIE1fUENJX01PREVfQ0xLKQogCiAjZW5kaWYgLyogX0NYR0JfUkVHU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKaW5kZXggOTc5OWMxMi4uMGNhOGQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCkBAIC00MiwxMiArNDIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CkBAIC01NywxMCArNTksOCBAQAogI2luY2x1ZGUgInJlZ3MuaCIKICNpbmNsdWRlICJlc3BpLmgiCiAKLQotI2lmZGVmIE5FVElGX0ZfVFNPCi0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jZW5kaWYKKy8qIFRoaXMgYmVsb25ncyBpbiBpZl9ldGhlci5oICovCisjZGVmaW5lIEVUSF9QX0NQTDUgMHhmCiAKICNkZWZpbmUgU0dFX0NNRFFfTgkJMgogI2RlZmluZSBTR0VfRlJFRUxRX04JCTIKQEAgLTczLDYgKzczLDcgQEAKICNkZWZpbmUgU0dFX0lOVFJUSU1FUl9OUkVTCTEwMDAKICNkZWZpbmUgU0dFX1JYX0NPUFlfVEhSRVMJMjU2CiAjZGVmaW5lIFNHRV9SWF9TTV9CVUZfU0laRQkxNTM2CisjZGVmaW5lIFNHRV9UWF9ERVNDX01BWF9QTEVOCTE2Mzg0CiAKICMgZGVmaW5lIFNHRV9SWF9EUk9QX1RIUkVTIDIKIApAQCAtMTg0LDE3ICsxODUsMTcgQEAKIAl1bnNpZ25lZCBsb25nICAgc3RhdHVzOyAgICAgICAgIC8qIEhXIERNQSBmZXRjaCBzdGF0dXMgKi8KIAl1bnNpZ25lZCBpbnQgICAgaW5fdXNlOyAgICAgICAgIC8qICMgb2YgaW4tdXNlIGNvbW1hbmQgZGVzY3JpcHRvcnMgKi8KIAl1bnNpZ25lZCBpbnQJc2l6ZTsJICAgICAgICAvKiAjIG9mIGRlc2NyaXB0b3JzICovCi0JdW5zaWduZWQgaW50CXByb2Nlc3NlZDsgICAgICAvKiB0b3RhbCAjIG9mIGRlc2NzIEhXIGhhcyBwcm9jZXNzZWQgKi8KLQl1bnNpZ25lZCBpbnQJY2xlYW5lZDsgICAgICAgIC8qIHRvdGFsICMgb2YgZGVzY3MgU1cgaGFzIHJlY2xhaW1lZCAqLwotCXVuc2lnbmVkIGludAlzdG9wX3RocmVzOyAgICAgLyogU1cgVFggcXVldWUgc3VzcGVuZCB0aHJlc2hvbGQgKi8KKwl1bnNpZ25lZCBpbnQgICAgcHJvY2Vzc2VkOyAgICAgIC8qIHRvdGFsICMgb2YgZGVzY3MgSFcgaGFzIHByb2Nlc3NlZCAqLworCXVuc2lnbmVkIGludCAgICBjbGVhbmVkOyAgICAgICAgLyogdG90YWwgIyBvZiBkZXNjcyBTVyBoYXMgcmVjbGFpbWVkICovCisJdW5zaWduZWQgaW50ICAgIHN0b3BfdGhyZXM7ICAgICAvKiBTVyBUWCBxdWV1ZSBzdXNwZW5kIHRocmVzaG9sZCAqLwogCXUxNgkJcGlkeDsgICAgICAgICAgIC8qIHByb2R1Y2VyIGluZGV4IChTVykgKi8KIAl1MTYJCWNpZHg7ICAgICAgICAgICAvKiBjb25zdW1lciBpbmRleCAoSFcpICovCiAJdTgJCWdlbmJpdDsgICAgICAgICAvKiBjdXJyZW50IGdlbmVyYXRpb24gKD12YWxpZCkgYml0ICovCi0JdTgJCXNvcDsgICAgICAgICAgICAvKiBpcyBuZXh0IGVudHJ5IHN0YXJ0IG9mIHBhY2tldD8gKi8KKwl1OCAgICAgICAgICAgICAgc29wOyAgICAgICAgICAgIC8qIGlzIG5leHQgZW50cnkgc3RhcnQgb2YgcGFja2V0PyAqLwogCXN0cnVjdCBjbWRRX2UgICplbnRyaWVzOyAgICAgICAgLyogSFcgY29tbWFuZCBkZXNjcmlwdG9yIFEgKi8KIAlzdHJ1Y3QgY21kUV9jZSAqY2VudHJpZXM7ICAgICAgIC8qIFNXIGNvbW1hbmQgY29udGV4dCBkZXNjcmlwdG9yIFEgKi8KLQlzcGlubG9ja190CWxvY2s7ICAgICAgICAgICAvKiBMb2NrIHRvIHByb3RlY3QgY21kUSBlbnF1ZXVpbmcgKi8KIAlkbWFfYWRkcl90CWRtYV9hZGRyOyAgICAgICAvKiBETUEgYWRkciBIVyBjb21tYW5kIGRlc2NyaXB0b3IgUSAqLworIAlzcGlubG9ja190CWxvY2s7ICAgICAgICAgICAvKiBMb2NrIHRvIHByb3RlY3QgY21kUSBlbnF1ZXVpbmcgKi8KIH07CiAKIHN0cnVjdCBmcmVlbFEgewpAQCAtMjAzLDggKzIwNCw4IEBACiAJdTE2CQlwaWR4OyAgICAgICAgICAgLyogcHJvZHVjZXIgaW5kZXggKFNXKSAqLwogCXUxNgkJY2lkeDsgICAgICAgICAgIC8qIGNvbnN1bWVyIGluZGV4IChIVykgKi8KIAl1MTYJCXJ4X2J1ZmZlcl9zaXplOyAvKiBCdWZmZXIgc2l6ZSBvbiB0aGlzIGZyZWUgbGlzdCAqLwotCXUxNgkJZG1hX29mZnNldDsgICAgIC8qIERNQSBvZmZzZXQgdG8gYWxpZ24gSVAgaGVhZGVycyAqLwotCXUxNgkJcmVjeWNsZXFfaWR4OyAgIC8qIHNrYiByZWN5Y2xlIHEgdG8gdXNlICovCisJdTE2ICAgICAgICAgICAgIGRtYV9vZmZzZXQ7ICAgICAvKiBETUEgb2Zmc2V0IHRvIGFsaWduIElQIGhlYWRlcnMgKi8KKwl1MTYgICAgICAgICAgICAgcmVjeWNsZXFfaWR4OyAgIC8qIHNrYiByZWN5Y2xlIHEgdG8gdXNlICovCiAJdTgJCWdlbmJpdDsJICAgICAgICAvKiBjdXJyZW50IGdlbmVyYXRpb24gKD12YWxpZCkgYml0ICovCiAJc3RydWN0IGZyZWVsUV9lCSplbnRyaWVzOyAgICAgICAvKiBIVyBmcmVlbGlzdCBkZXNjcmlwdG9yIFEgKi8KIAlzdHJ1Y3QgZnJlZWxRX2NlICpjZW50cmllczsgICAgIC8qIFNXIGZyZWVsaXN0IGNvbnRleHQgZGVzY3JpcHRvciBRICovCkBAIC0yMjYsNiArMjI3LDI5IEBACiAJQ01EUV9TVEFUX0xBU1RfUEtUX0RCID0gMiAgICAgICAvKiBsYXN0IHBhY2tldCBydW5nIHRoZSBkb29yYmVsbCAqLwogfTsKIAorLyogVDIwNCBUWCBTVyBzY2hlZHVsZXIgKi8KKworLyogUGVyIFQyMDQgVFggcG9ydCAqLworc3RydWN0IHNjaGVkX3BvcnQgeworCXVuc2lnbmVkIGludAlhdmFpbDsJCS8qIGF2YWlsYWJsZSBiaXRzIC0gcXVvdGEgKi8KKwl1bnNpZ25lZCBpbnQJZHJhaW5fYml0c19wZXJfMTAyNG5zOyAvKiBkcmFpbiByYXRlICovCisJdW5zaWduZWQgaW50CXNwZWVkOwkJLyogZHJhaW4gcmF0ZSwgbWJwcyAqLworCXVuc2lnbmVkIGludAltdHU7CQkvKiBtdHUgc2l6ZSAqLworCXN0cnVjdCBza19idWZmX2hlYWQgc2ticTsJLyogcGVuZGluZyBza2JzICovCit9OworCisvKiBQZXIgVDIwNCBkZXZpY2UgKi8KK3N0cnVjdCBzY2hlZCB7CisJa3RpbWVfdCAgICAgICAgIGxhc3RfdXBkYXRlZDsgICAvKiBsYXN0IHRpbWUgcXVvdGFzIHdlcmUgY29tcHV0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgCW1heF9hdmFpbDsJLyogbWF4IGJpdHMgdG8gYmUgc2VudCB0byBhbnkgcG9ydCAqLworCXVuc2lnbmVkIGludCAJcG9ydDsJCS8qIHBvcnQgaW5kZXggKHJvdW5kIHJvYmluIHBvcnRzKSAqLworCXVuc2lnbmVkIGludCAJbnVtOwkJLyogbnVtIHNrYnMgaW4gcGVyIHBvcnQgcXVldWVzICovCisJc3RydWN0IHNjaGVkX3BvcnQgcFtNQVhfTlBPUlRTXTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc2NoZWRfdHNrOy8qIHRhc2tsZXQgdXNlZCB0byBydW4gc2NoZWR1bGVyICovCit9Oworc3RhdGljIHZvaWQgcmVzdGFydF9zY2hlZCh1bnNpZ25lZCBsb25nKTsKKworCiAvKgogICogTWFpbiBTR0UgZGF0YSBzdHJ1Y3R1cmUKICAqCkBAIC0yNDMsMTggKzI2NywyNDAgQEAKIAl1bnNpZ25lZCBpbnQJcnhfcGt0X3BhZDsgICAgIC8qIFJYIHBhZGRpbmcgZm9yIEwyIHBhY2tldHMgKi8KIAl1bnNpZ25lZCBpbnQJanVtYm9fZmw7ICAgICAgIC8qIGp1bWJvIGZyZWVsaXN0IFEgaW5kZXggKi8KIAl1bnNpZ25lZCBpbnQJaW50cnRpbWVyX25yZXM7CS8qIG5vLXJlc291cmNlIGludGVycnVwdCB0aW1lciAqLwotCXVuc2lnbmVkIGludAlmaXhlZF9pbnRydGltZXI7Lyogbm9uLWFkYXB0aXZlIGludGVycnVwdCB0aW1lciAqLworCXVuc2lnbmVkIGludCAgICBmaXhlZF9pbnRydGltZXI7Lyogbm9uLWFkYXB0aXZlIGludGVycnVwdCB0aW1lciAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHR4X3JlY2xhaW1fdGltZXI7IC8qIHJlY2xhaW1zIFRYIGJ1ZmZlcnMgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBlc3BpYnVnX3RpbWVyOwotCXVuc2lnbmVkIGludAllc3BpYnVnX3RpbWVvdXQ7Ci0Jc3RydWN0IHNrX2J1ZmYJKmVzcGlidWdfc2tiOworCXVuc2lnbmVkIGxvbmcJZXNwaWJ1Z190aW1lb3V0OworCXN0cnVjdCBza19idWZmCSplc3BpYnVnX3NrYltNQVhfTlBPUlRTXTsKIAl1MzIJCXNnZV9jb250cm9sOwkvKiBzaGFkb3cgdmFsdWUgb2Ygc2dlIGNvbnRyb2wgcmVnICovCiAJc3RydWN0IHNnZV9pbnRyX2NvdW50cyBzdGF0czsKLQlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgcG9ydF9zdGF0c1tNQVhfTlBPUlRTXTsKKwlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgKnBvcnRfc3RhdHNbTUFYX05QT1JUU107CisJc3RydWN0IHNjaGVkCSp0eF9zY2hlZDsKIAlzdHJ1Y3QgY21kUSBjbWRRW1NHRV9DTURRX05dIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiB9OwogCiAvKgorICogc3RvcCB0YXNrbGV0IGFuZCBmcmVlIGFsbCBwZW5kaW5nIHNrYidzCisgKi8KK3N0YXRpYyB2b2lkIHR4X3NjaGVkX3N0b3Aoc3RydWN0IHNnZSAqc2dlKQoreworCXN0cnVjdCBzY2hlZCAqcyA9IHNnZS0+dHhfc2NoZWQ7CisJaW50IGk7CisKKwl0YXNrbGV0X2tpbGwoJnMtPnNjaGVkX3Rzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05QT1JUUzsgaSsrKQorCQlfX3NrYl9xdWV1ZV9wdXJnZSgmcy0+cFtzLT5wb3J0XS5za2JxKTsKK30KKworLyoKKyAqIHQxX3NjaGVkX3VwZGF0ZV9wYXJtcygpIGlzIGNhbGxlZCB3aGVuIHRoZSBNVFUgb3IgbGluayBzcGVlZCBjaGFuZ2VzLiBJdAorICogcmUtY29tcHV0ZXMgc2NoZWR1bGVyIHBhcmFtZXRlcnMgdG8gc2NvcGUgd2l0aCB0aGUgY2hhbmdlLgorICovCit1bnNpZ25lZCBpbnQgdDFfc2NoZWRfdXBkYXRlX3Bhcm1zKHN0cnVjdCBzZ2UgKnNnZSwgdW5zaWduZWQgaW50IHBvcnQsCisJCQkJICAgdW5zaWduZWQgaW50IG10dSwgdW5zaWduZWQgaW50IHNwZWVkKQoreworCXN0cnVjdCBzY2hlZCAqcyA9IHNnZS0+dHhfc2NoZWQ7CisJc3RydWN0IHNjaGVkX3BvcnQgKnAgPSAmcy0+cFtwb3J0XTsKKwl1bnNpZ25lZCBpbnQgbWF4X2F2YWlsX3NlZ3M7CisKKwlwcl9kZWJ1ZygidDFfc2NoZWRfdXBkYXRlX3BhcmFtcyBtdHU9JWQgc3BlZWQ9JWRcbiIsIG10dSwgc3BlZWQpOworCWlmIChzcGVlZCkKKwkJcC0+c3BlZWQgPSBzcGVlZDsKKwlpZiAobXR1KQorCQlwLT5tdHUgPSBtdHU7CisKKwlpZiAoc3BlZWQgfHwgbXR1KSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBkcmFpbiA9IDEwMjRVTEwgKiBwLT5zcGVlZCAqIChwLT5tdHUgLSA0MCk7CisJCWRvX2RpdihkcmFpbiwgKHAtPm10dSArIDUwKSAqIDEwMDApOworCQlwLT5kcmFpbl9iaXRzX3Blcl8xMDI0bnMgPSAodW5zaWduZWQgaW50KSBkcmFpbjsKKworCQlpZiAocC0+c3BlZWQgPCAxMDAwKQorCQkJcC0+ZHJhaW5fYml0c19wZXJfMTAyNG5zID0KKwkJCQk5MCAqIHAtPmRyYWluX2JpdHNfcGVyXzEwMjRucyAvIDEwMDsKKwl9CisKKwlpZiAoYm9hcmRfaW5mbyhzZ2UtPmFkYXB0ZXIpLT5ib2FyZCA9PSBDSEJUX0JPQVJEX0NIVDIwNCkgeworCQlwLT5kcmFpbl9iaXRzX3Blcl8xMDI0bnMgLT0gMTY7CisJCXMtPm1heF9hdmFpbCA9IG1heCg0MDk2VSwgcC0+bXR1ICsgMTYgKyAxNCArIDQpOworCQltYXhfYXZhaWxfc2VncyA9IG1heCgxVSwgNDA5NiAvIChwLT5tdHUgLSA0MCkpOworCX0gZWxzZSB7CisJCXMtPm1heF9hdmFpbCA9IDE2Mzg0OworCQltYXhfYXZhaWxfc2VncyA9IG1heCgxVSwgOTAwMCAvIChwLT5tdHUgLSA0MCkpOworCX0KKworCXByX2RlYnVnKCJ0MV9zY2hlZF91cGRhdGVfcGFybXM6IG10dSAldSBzcGVlZCAldSBtYXhfYXZhaWwgJXUgIgorCQkgIm1heF9hdmFpbF9zZWdzICV1IGRyYWluX2JpdHNfcGVyXzEwMjRucyAldVxuIiwgcC0+bXR1LAorCQkgcC0+c3BlZWQsIHMtPm1heF9hdmFpbCwgbWF4X2F2YWlsX3NlZ3MsCisJCSBwLT5kcmFpbl9iaXRzX3Blcl8xMDI0bnMpOworCisJcmV0dXJuIG1heF9hdmFpbF9zZWdzICogKHAtPm10dSAtIDQwKTsKK30KKworLyoKKyAqIHQxX3NjaGVkX21heF9hdmFpbF9ieXRlcygpIHRlbGxzIHRoZSBzY2hlZHVsZXIgdGhlIG1heGltdW0gYW1vdW50IG9mCisgKiBkYXRhIHRoYXQgY2FuIGJlIHB1c2hlZCBwZXIgcG9ydC4KKyAqLwordm9pZCB0MV9zY2hlZF9zZXRfbWF4X2F2YWlsX2J5dGVzKHN0cnVjdCBzZ2UgKnNnZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgc2NoZWQgKnMgPSBzZ2UtPnR4X3NjaGVkOworCXVuc2lnbmVkIGludCBpOworCisJcy0+bWF4X2F2YWlsID0gdmFsOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlBPUlRTOyBpKyspCisJCXQxX3NjaGVkX3VwZGF0ZV9wYXJtcyhzZ2UsIGksIDAsIDApOworfQorCisvKgorICogdDFfc2NoZWRfc2V0X2RyYWluX2JpdHNfcGVyX3VzKCkgdGVsbHMgdGhlIHNjaGVkdWxlciBhdCB3aGljaCByYXRlIGEgcG9ydAorICogaXMgZHJhaW5pbmcuCisgKi8KK3ZvaWQgdDFfc2NoZWRfc2V0X2RyYWluX2JpdHNfcGVyX3VzKHN0cnVjdCBzZ2UgKnNnZSwgdW5zaWduZWQgaW50IHBvcnQsCisJCQkJCSB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCBzY2hlZCAqcyA9IHNnZS0+dHhfc2NoZWQ7CisJc3RydWN0IHNjaGVkX3BvcnQgKnAgPSAmcy0+cFtwb3J0XTsKKwlwLT5kcmFpbl9iaXRzX3Blcl8xMDI0bnMgPSB2YWwgKiAxMDI0IC8gMTAwMDsKKwl0MV9zY2hlZF91cGRhdGVfcGFybXMoc2dlLCBwb3J0LCAwLCAwKTsKK30KKworCisvKgorICogZ2V0X2Nsb2NrKCkgaW1wbGVtZW50cyBhIG5zIGNsb2NrIChzZWUga3RpbWVfZ2V0KQorICovCitzdGF0aWMgaW5saW5lIGt0aW1lX3QgZ2V0X2Nsb2NrKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJa3RpbWVfZ2V0X3RzKCZ0cyk7CisJcmV0dXJuIHRpbWVzcGVjX3RvX2t0aW1lKHRzKTsKK30KKworLyoKKyAqIHR4X3NjaGVkX2luaXQoKSBhbGxvY2F0ZXMgcmVzb3VyY2VzIGFuZCBkb2VzIGJhc2ljIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgaW50IHR4X3NjaGVkX2luaXQoc3RydWN0IHNnZSAqc2dlKQoreworCXN0cnVjdCBzY2hlZCAqczsKKwlpbnQgaTsKKworCXMgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IHNjaGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2RlYnVnKCJ0eF9zY2hlZF9pbml0XG4iKTsKKwl0YXNrbGV0X2luaXQoJnMtPnNjaGVkX3RzaywgcmVzdGFydF9zY2hlZCwgKHVuc2lnbmVkIGxvbmcpIHNnZSk7CisJc2dlLT50eF9zY2hlZCA9IHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05QT1JUUzsgaSsrKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnMtPnBbaV0uc2ticSk7CisJCXQxX3NjaGVkX3VwZGF0ZV9wYXJtcyhzZ2UsIGksIDE1MDAsIDEwMDApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogc2NoZWRfdXBkYXRlX2F2YWlsKCkgY29tcHV0ZXMgdGhlIGRlbHRhIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGNhbGxlZAorICogYW5kIHVwZGF0ZXMgdGhlIHBlciBwb3J0IHF1b3RhIChudW1iZXIgb2YgYml0cyB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBhbnkKKyAqIHBvcnQpLgorICovCitzdGF0aWMgaW5saW5lIGludCBzY2hlZF91cGRhdGVfYXZhaWwoc3RydWN0IHNnZSAqc2dlKQoreworCXN0cnVjdCBzY2hlZCAqcyA9IHNnZS0+dHhfc2NoZWQ7CisJa3RpbWVfdCBub3cgPSBnZXRfY2xvY2soKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlsb25nIGxvbmcgZGVsdGFfdGltZV9uczsKKworCWRlbHRhX3RpbWVfbnMgPSBrdGltZV90b19ucyhrdGltZV9zdWIobm93LCBzLT5sYXN0X3VwZGF0ZWQpKTsKKworCXByX2RlYnVnKCJzY2hlZF91cGRhdGVfYXZhaWwgZGVsdGE9JWxsZFxuIiwgZGVsdGFfdGltZV9ucyk7CisJaWYgKGRlbHRhX3RpbWVfbnMgPCAxNTAwMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBzY2hlZF9wb3J0ICpwID0gJnMtPnBbaV07CisJCXVuc2lnbmVkIGludCBkZWx0YV9hdmFpbDsKKworCQlkZWx0YV9hdmFpbCA9IChwLT5kcmFpbl9iaXRzX3Blcl8xMDI0bnMgKiBkZWx0YV90aW1lX25zKSA+PiAxMzsKKwkJcC0+YXZhaWwgPSBtaW4ocC0+YXZhaWwgKyBkZWx0YV9hdmFpbCwgcy0+bWF4X2F2YWlsKTsKKwl9CisKKwlzLT5sYXN0X3VwZGF0ZWQgPSBub3c7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHNjaGVkX3NrYigpIGlzIGNhbGxlZCBmcm9tIHR3byBkaWZmZXJlbnQgcGxhY2VzLiBJbiB0aGUgdHggcGF0aCwgYW55CisgKiBwYWNrZXQgZ2VuZXJhdGluZyBsb2FkIG9uIGFuIG91dHB1dCBwb3J0IHdpbGwgY2FsbCBzY2hlZF9za2IoKQorICogKHNrYiAhPSBOVUxMKS4gSW4gYWRkaXRpb24sIHNjaGVkX3NrYigpIGlzIGNhbGxlZCBmcm9tIHRoZSBpcnEvc29mdCBpcnEKKyAqIGNvbnRleHQgKHNrYiA9PSBOVUxMKS4KKyAqIFRoZSBzY2hlZHVsZXIgb25seSByZXR1cm5zIGEgc2tiICh3aGljaCB3aWxsIHRoZW4gYmUgc2VudCkgaWYgdGhlCisgKiBsZW5ndGggb2YgdGhlIHNrYiBpcyA8PSB0aGUgY3VycmVudCBxdW90YSBvZiB0aGUgb3V0cHV0IHBvcnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2NoZWRfc2tiKHN0cnVjdCBzZ2UgKnNnZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQl1bnNpZ25lZCBpbnQgY3JlZGl0cykKK3sKKwlzdHJ1Y3Qgc2NoZWQgKnMgPSBzZ2UtPnR4X3NjaGVkOworCXN0cnVjdCBza19idWZmX2hlYWQgKnNrYnE7CisJdW5zaWduZWQgaW50IGksIGxlbiwgdXBkYXRlID0gMTsKKworCXByX2RlYnVnKCJzY2hlZF9za2IgJXBcbiIsIHNrYik7CisJaWYgKCFza2IpIHsKKwkJaWYgKCFzLT5udW0pCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlza2JxID0gJnMtPnBbc2tiLT5kZXYtPmlmX3BvcnRdLnNrYnE7CisJCV9fc2tiX3F1ZXVlX3RhaWwoc2ticSwgc2tiKTsKKwkJcy0+bnVtKys7CisJCXNrYiA9IE5VTEw7CisJfQorCisJaWYgKGNyZWRpdHMgPCBNQVhfU0tCX0ZSQUdTICsgMSkKKwkJZ290byBvdXQ7CisKKyBhZ2FpbjoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05QT1JUUzsgaSsrKSB7CisJCXMtPnBvcnQgPSArK3MtPnBvcnQgJiAoTUFYX05QT1JUUyAtIDEpOworCQlza2JxID0gJnMtPnBbcy0+cG9ydF0uc2ticTsKKworCQlza2IgPSBza2JfcGVlayhza2JxKTsKKworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IHNrYi0+bGVuOworCQlpZiAobGVuIDw9IHMtPnBbcy0+cG9ydF0uYXZhaWwpIHsKKwkJCXMtPnBbcy0+cG9ydF0uYXZhaWwgLT0gbGVuOworCQkJcy0+bnVtLS07CisJCQlfX3NrYl91bmxpbmsoc2tiLCBza2JxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNrYiA9IE5VTEw7CisJfQorCisJaWYgKHVwZGF0ZS0tICYmIHNjaGVkX3VwZGF0ZV9hdmFpbChzZ2UpKQorCQlnb3RvIGFnYWluOworCisgb3V0OgorIAkvKiBJZiB0aGVyZSBhcmUgbW9yZSBwZW5kaW5nIHNrYnMsIHdlIHVzZSB0aGUgaGFyZHdhcmUgdG8gc2NoZWR1bGUgdXMKKwkgKiBhZ2Fpbi4KKwkgKi8KKwlpZiAocy0+bnVtICYmICFza2IpIHsKKwkJc3RydWN0IGNtZFEgKnEgPSAmc2dlLT5jbWRRWzBdOworCQljbGVhcl9iaXQoQ01EUV9TVEFUX0xBU1RfUEtUX0RCLCAmcS0+c3RhdHVzKTsKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQ01EUV9TVEFUX1JVTk5JTkcsICZxLT5zdGF0dXMpID09IDApIHsKKwkJCXNldF9iaXQoQ01EUV9TVEFUX0xBU1RfUEtUX0RCLCAmcS0+c3RhdHVzKTsKKwkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwgc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19ET09SQkVMTCk7CisJCX0KKwl9CisJcHJfZGVidWcoInNjaGVkX3NrYiByZXQgJXBcbiIsIHNrYik7CisKKwlyZXR1cm4gc2tiOworfQorCisvKgogICogUElPIHRvIGluZGljYXRlIHRoYXQgbWVtb3J5IG1hcHBlZCBRIGNvbnRhaW5zIHZhbGlkIGRlc2NyaXB0b3IocykuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkb29yYmVsbF9waW8oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB2YWwpCkBAIC0zMzUsMTAgKzU4MSw5IEBACiAJCQlnb3RvIGVycl9ub19tZW07CiAJCW1lbXNldChxLT5lbnRyaWVzLCAwLCBzaXplKTsKIAkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnJlZWxRX2NlKSAqIHEtPnNpemU7Ci0JCXEtPmNlbnRyaWVzID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJcS0+Y2VudHJpZXMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXEtPmNlbnRyaWVzKQogCQkJZ290byBlcnJfbm9fbWVtOwotCQltZW1zZXQocS0+Y2VudHJpZXMsIDAsIHNpemUpOwogCX0KIAogCS8qCkBAIC0zNTEsOCArNTk2LDExIEBACiAJc2dlLT5mcmVlbFFbIXNnZS0+anVtYm9fZmxdLnJ4X2J1ZmZlcl9zaXplID0gU0dFX1JYX1NNX0JVRl9TSVpFICsKIAkJc2l6ZW9mKHN0cnVjdCBjcGxfcnhfZGF0YSkgKwogCQlzZ2UtPmZyZWVsUVshc2dlLT5qdW1ib19mbF0uZG1hX29mZnNldDsKLQlzZ2UtPmZyZWVsUVtzZ2UtPmp1bWJvX2ZsXS5yeF9idWZmZXJfc2l6ZSA9ICgxNiAqIDEwMjQpIC0KLQkJU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKKworCQlzaXplID0gKDE2ICogMTAyNCkgLQorCQkgICAgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKKworCXNnZS0+ZnJlZWxRW3NnZS0+anVtYm9fZmxdLnJ4X2J1ZmZlcl9zaXplID0gc2l6ZTsKIAogCS8qCiAJICogU2V0dXAgd2hpY2ggc2tiIHJlY3ljbGUgUSBzaG91bGQgYmUgdXNlZCB3aGVuIHJlY3ljbGluZyBidWZmZXJzIGZyb20KQEAgLTM4OSwxNyArNjM3LDIzIEBACiAJcS0+aW5fdXNlIC09IG47CiAJY2UgPSAmcS0+Y2VudHJpZXNbY2lkeF07CiAJd2hpbGUgKG4tLSkgewotCQlpZiAocS0+c29wKQotCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAotCQkJIAkJIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAotCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7Ci0JCWVsc2UKLQkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCi0JCQkgCSAgICAgICBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKLQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXEtPnNvcCA9IDA7CisJCWlmIChxLT5zb3ApIHsKKwkJCWlmIChsaWtlbHkocGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbikpKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCQkJIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCisJCQkgCQkJIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCXEtPnNvcCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobGlrZWx5KHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pKSkgeworCQkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCisJCQkgCQkgICAgICAgcGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbiksCisJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0KKwkJfQogCQlpZiAoY2UtPnNrYikgewotCQkJZGV2X2tmcmVlX3NrYihjZS0+c2tiKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGNlLT5za2IpOwogCQkJcS0+c29wID0gMTsKIAkJfQogCQljZSsrOwpAQCAtNDYzLDEwICs3MTcsOSBAQAogCQkJZ290byBlcnJfbm9fbWVtOwogCQltZW1zZXQocS0+ZW50cmllcywgMCwgc2l6ZSk7CiAJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtZFFfY2UpICogcS0+c2l6ZTsKLQkJcS0+Y2VudHJpZXMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlxLT5jZW50cmllcyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcS0+Y2VudHJpZXMpCiAJCQlnb3RvIGVycl9ub19tZW07Ci0JCW1lbXNldChxLT5jZW50cmllcywgMCwgc2l6ZSk7CiAJfQogCiAJLyoKQEAgLTUwNiw3ICs3NTksNyBAQAogCQlzZ2UtPnNnZV9jb250cm9sIHw9IEZfVkxBTl9YVFJBQ1Q7CiAJaWYgKGFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCkgewogCQl3cml0ZWwoc2dlLT5zZ2VfY29udHJvbCwgYWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7Ci0JCXJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOyAvKiBmbHVzaCAqLworCQlyZWFkbChhZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsgICAvKiBmbHVzaCAqLwogCX0KIH0KIApAQCAtNTQwLDcgKzc5Myw2IEBACiAJc2dlLT5zZ2VfY29udHJvbCA9IEZfQ01EUTBfRU5BQkxFIHwgRl9DTURRMV9FTkFCTEUgfCBGX0ZMMF9FTkFCTEUgfAogCQlGX0ZMMV9FTkFCTEUgfCBGX0NQTF9FTkFCTEUgfCBGX1JFU1BPTlNFX1FVRVVFX0VOQUJMRSB8CiAJCVZfQ01EUV9QUklPUklUWSgyKSB8IEZfRElTQUJMRV9DTURRMV9HVFMgfCBGX0lTQ1NJX0NPQUxFU0NFIHwKLQkJRl9ESVNBQkxFX0ZMMF9HVFMgfCBGX0RJU0FCTEVfRkwxX0dUUyB8CiAJCVZfUlhfUEtUX09GRlNFVChzZ2UtPnJ4X3BrdF9wYWQpOwogCiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCkBAIC01NjgsOSArODIwLDEyIEBACiAgKi8KIHZvaWQgdDFfc2dlX2Rlc3Ryb3koc3RydWN0IHNnZSAqc2dlKQogewotCWlmIChzZ2UtPmVzcGlidWdfc2tiKQotCQlrZnJlZV9za2Ioc2dlLT5lc3BpYnVnX3NrYik7CisJaW50IGk7CiAKKwlmb3JfZWFjaF9wb3J0KHNnZS0+YWRhcHRlciwgaSkKKwkJZnJlZV9wZXJjcHUoc2dlLT5wb3J0X3N0YXRzW2ldKTsKKworCWtmcmVlKHNnZS0+dHhfc2NoZWQpOwogCWZyZWVfdHhfcmVzb3VyY2VzKHNnZSk7CiAJZnJlZV9yeF9yZXNvdXJjZXMoc2dlKTsKIAlrZnJlZShzZ2UpOwpAQCAtNzM1LDE0ICs5OTAsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotY29uc3Qgc3RydWN0IHNnZV9pbnRyX2NvdW50cyAqdDFfc2dlX2dldF9pbnRyX2NvdW50cyhzdHJ1Y3Qgc2dlICpzZ2UpCitjb25zdCBzdHJ1Y3Qgc2dlX2ludHJfY291bnRzICp0MV9zZ2VfZ2V0X2ludHJfY291bnRzKGNvbnN0IHN0cnVjdCBzZ2UgKnNnZSkKIHsKIAlyZXR1cm4gJnNnZS0+c3RhdHM7CiB9CiAKLWNvbnN0IHN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqdDFfc2dlX2dldF9wb3J0X3N0YXRzKHN0cnVjdCBzZ2UgKnNnZSwgaW50IHBvcnQpCit2b2lkIHQxX3NnZV9nZXRfcG9ydF9zdGF0cyhjb25zdCBzdHJ1Y3Qgc2dlICpzZ2UsIGludCBwb3J0LAorCQkJICAgc3RydWN0IHNnZV9wb3J0X3N0YXRzICpzcykKIHsKLQlyZXR1cm4gJnNnZS0+cG9ydF9zdGF0c1twb3J0XTsKKwlpbnQgY3B1OworCisJbWVtc2V0KHNzLCAwLCBzaXplb2YoKnNzKSk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgKnN0ID0gcGVyX2NwdV9wdHIoc2dlLT5wb3J0X3N0YXRzW3BvcnRdLCBjcHUpOworCisJCXNzLT5yeF9wYWNrZXRzICs9IHN0LT5yeF9wYWNrZXRzOworCQlzcy0+cnhfY3NvX2dvb2QgKz0gc3QtPnJ4X2Nzb19nb29kOworCQlzcy0+dHhfcGFja2V0cyArPSBzdC0+dHhfcGFja2V0czsKKwkJc3MtPnR4X2NzbyArPSBzdC0+dHhfY3NvOworCQlzcy0+dHhfdHNvICs9IHN0LT50eF90c287CisJCXNzLT52bGFuX3h0cmFjdCArPSBzdC0+dmxhbl94dHJhY3Q7CisJCXNzLT52bGFuX2luc2VydCArPSBzdC0+dmxhbl9pbnNlcnQ7CisJfQogfQogCiAvKioKQEAgLTg1Niw2ICsxMTI1LDk5IEBACiB9CiAKIC8qCisgKiBUMS9UMiBTR0UgbGltaXRzIHRoZSBtYXhpbXVtIERNQSBzaXplIHBlciBUWCBkZXNjcmlwdG9yIHRvCisgKiBTR0VfVFhfREVTQ19NQVhfUExFTiAoMTZLQikuIElmIHRoZSBQQUdFX1NJWkUgaXMgbGFyZ2VyIHRoYW4gMTZLQiwgdGhlCisgKiBzdGFjayBtaWdodCBzZW5kIG1vcmUgdGhhbiBTR0VfVFhfREVTQ19NQVhfUExFTiBpbiBhIGNvbnRpZ3VvdXMgbWFubmVyLgorICogTm90ZSB0aGF0IHRoZSAqX2xhcmdlX3BhZ2VfdHhfZGVzY3Mgc3R1ZmYgd2lsbCBiZSBvcHRpbWl6ZWQgb3V0IHdoZW4KKyAqIFBBR0VfU0laRSA8PSBTR0VfVFhfREVTQ19NQVhfUExFTi4KKyAqCisgKiBjb21wdXRlX2xhcmdlX3BhZ2VfZGVzY3MoKSBjb21wdXRlcyBob3cgbWFueSBhZGRpdGlvbmFsIGRlc2NyaXB0b3JzIGFyZQorICogcmVxdWlyZWQgdG8gYnJlYWsgZG93biB0aGUgc3RhY2sncyByZXF1ZXN0LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb21wdXRlX2xhcmdlX3BhZ2VfdHhfZGVzY3Moc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCWlmIChQQUdFX1NJWkUgPiBTR0VfVFhfREVTQ19NQVhfUExFTikgeworCQl1bnNpZ25lZCBpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJdW5zaWduZWQgaW50IGksIGxlbiA9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKKwkJd2hpbGUgKGxlbiA+IFNHRV9UWF9ERVNDX01BWF9QTEVOKSB7CisJCQljb3VudCsrOworCQkJbGVuIC09IFNHRV9UWF9ERVNDX01BWF9QTEVOOworCQl9CisJCWZvciAoaSA9IDA7IG5mcmFncy0tOyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCWxlbiA9IGZyYWctPnNpemU7CisJCQl3aGlsZSAobGVuID4gU0dFX1RYX0RFU0NfTUFYX1BMRU4pIHsKKwkJCQljb3VudCsrOworCQkJCWxlbiAtPSBTR0VfVFhfREVTQ19NQVhfUExFTjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBXcml0ZSBhIGNtZFEgZW50cnkuCisgKgorICogU2luY2UgdGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlICdmbGFncycgZmllbGQsIGl0IG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqIHdyaXRlIHRoZSBmaXJzdCBjbWRRIGVudHJ5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdHhfZGVzYyhzdHJ1Y3QgY21kUV9lICplLCBkbWFfYWRkcl90IG1hcHBpbmcsCisJCQkJIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBnZW4sCisJCQkJIHVuc2lnbmVkIGludCBlb3ApCit7CisJaWYgKHVubGlrZWx5KGxlbiA+IFNHRV9UWF9ERVNDX01BWF9QTEVOKSkKKwkJQlVHKCk7CisJZS0+YWRkcl9sbyA9ICh1MzIpbWFwcGluZzsKKwllLT5hZGRyX2hpID0gKHU2NCltYXBwaW5nID4+IDMyOworCWUtPmxlbl9nZW4gPSBWX0NNRF9MRU4obGVuKSB8IFZfQ01EX0dFTjEoZ2VuKTsKKwllLT5mbGFncyA9IEZfQ01EX0RBVEFWQUxJRCB8IFZfQ01EX0VPUChlb3ApIHwgVl9DTURfR0VOMihnZW4pOworfQorCisvKgorICogU2VlIGNvbW1lbnQgZm9yIHByZXZpb3VzIGZ1bmN0aW9uLgorICoKKyAqIHdyaXRlX3R4X2Rlc2NzX2xhcmdlX3BhZ2UoKSB3cml0ZXMgYWRkaXRpb25hbCBTR0UgdHggZGVzY3JpcHRvcnMgaWYKKyAqICpkZXNjX2xlbiBleGNlZWRzIEhXJ3MgY2FwYWJpbGl0eS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd3JpdGVfbGFyZ2VfcGFnZV90eF9kZXNjcyh1bnNpZ25lZCBpbnQgcGlkeCwKKwkJCQkJCSAgICAgc3RydWN0IGNtZFFfZSAqKmUsCisJCQkJCQkgICAgIHN0cnVjdCBjbWRRX2NlICoqY2UsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqZ2VuLAorCQkJCQkJICAgICBkbWFfYWRkcl90ICpkZXNjX21hcHBpbmcsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqZGVzY19sZW4sCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCBuZnJhZ3MsCisJCQkJCQkgICAgIHN0cnVjdCBjbWRRICpxKQoreworCWlmIChQQUdFX1NJWkUgPiBTR0VfVFhfREVTQ19NQVhfUExFTikgeworCQlzdHJ1Y3QgY21kUV9lICplMSA9ICplOworCQlzdHJ1Y3QgY21kUV9jZSAqY2UxID0gKmNlOworCisJCXdoaWxlICgqZGVzY19sZW4gPiBTR0VfVFhfREVTQ19NQVhfUExFTikgeworCQkJKmRlc2NfbGVuIC09IFNHRV9UWF9ERVNDX01BWF9QTEVOOworCQkJd3JpdGVfdHhfZGVzYyhlMSwgKmRlc2NfbWFwcGluZywgU0dFX1RYX0RFU0NfTUFYX1BMRU4sCisJCQkJICAgICAgKmdlbiwgbmZyYWdzID09IDAgJiYgKmRlc2NfbGVuID09IDApOworCQkJY2UxLT5za2IgPSBOVUxMOworCQkJcGNpX3VubWFwX2xlbl9zZXQoY2UxLCBkbWFfbGVuLCAwKTsKKwkJCSpkZXNjX21hcHBpbmcgKz0gU0dFX1RYX0RFU0NfTUFYX1BMRU47CisJCQlpZiAoKmRlc2NfbGVuKSB7CisJCQkJY2UxKys7CisJCQkJZTErKzsKKwkJCQlpZiAoKytwaWR4ID09IHEtPnNpemUpIHsKKwkJCQkJcGlkeCA9IDA7CisJCQkJCSpnZW4gXj0gMTsKKwkJCQkJY2UxID0gcS0+Y2VudHJpZXM7CisJCQkJCWUxID0gcS0+ZW50cmllczsKKwkJCQl9CisJCQl9CisJCX0KKwkJKmUgPSBlMTsKKwkJKmNlID0gY2UxOworCX0KKwlyZXR1cm4gcGlkeDsKK30KKworLyoKICAqIFdyaXRlIHRoZSBjb21tYW5kIGRlc2NyaXB0b3JzIHRvIHRyYW5zbWl0IHRoZSBnaXZlbiBza2Igc3RhcnRpbmcgYXQKICAqIGRlc2NyaXB0b3IgcGlkeCB3aXRoIHRoZSBnaXZlbiBnZW5lcmF0aW9uLgogICovCkBAIC04NjMsNTAgKzEyMjUsODQgQEAKIAkJCQkgIHVuc2lnbmVkIGludCBwaWR4LCB1bnNpZ25lZCBpbnQgZ2VuLAogCQkJCSAgc3RydWN0IGNtZFEgKnEpCiB7Ci0JZG1hX2FkZHJfdCBtYXBwaW5nOworCWRtYV9hZGRyX3QgbWFwcGluZywgZGVzY19tYXBwaW5nOwogCXN0cnVjdCBjbWRRX2UgKmUsICplMTsKIAlzdHJ1Y3QgY21kUV9jZSAqY2U7Ci0JdW5zaWduZWQgaW50IGksIGZsYWdzLCBuZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCXVuc2lnbmVkIGludCBpLCBmbGFncywgZmlyc3RfZGVzY19sZW4sIGRlc2NfbGVuLAorCSAgICBuZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCisJZSA9IGUxID0gJnEtPmVudHJpZXNbcGlkeF07CisJY2UgPSAmcS0+Y2VudHJpZXNbcGlkeF07CiAKIAltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgc2tiLT5kYXRhLAotCQkJCSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWNlID0gJnEtPmNlbnRyaWVzW3BpZHhdOworCQkJCXNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlkZXNjX21hcHBpbmcgPSBtYXBwaW5nOworCWRlc2NfbGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOworCisJZmxhZ3MgPSBGX0NNRF9EQVRBVkFMSUQgfCBGX0NNRF9TT1AgfAorCSAgICBWX0NNRF9FT1AobmZyYWdzID09IDAgJiYgZGVzY19sZW4gPD0gU0dFX1RYX0RFU0NfTUFYX1BMRU4pIHwKKwkgICAgVl9DTURfR0VOMihnZW4pOworCWZpcnN0X2Rlc2NfbGVuID0gKGRlc2NfbGVuIDw9IFNHRV9UWF9ERVNDX01BWF9QTEVOKSA/CisJICAgIGRlc2NfbGVuIDogU0dFX1RYX0RFU0NfTUFYX1BMRU47CisJZS0+YWRkcl9sbyA9ICh1MzIpZGVzY19tYXBwaW5nOworCWUtPmFkZHJfaGkgPSAodTY0KWRlc2NfbWFwcGluZyA+PiAzMjsKKwllLT5sZW5fZ2VuID0gVl9DTURfTEVOKGZpcnN0X2Rlc2NfbGVuKSB8IFZfQ01EX0dFTjEoZ2VuKTsKKwljZS0+c2tiID0gTlVMTDsKKwlwY2lfdW5tYXBfbGVuX3NldChjZSwgZG1hX2xlbiwgMCk7CisKKwlpZiAoUEFHRV9TSVpFID4gU0dFX1RYX0RFU0NfTUFYX1BMRU4gJiYKKwkgICAgZGVzY19sZW4gPiBTR0VfVFhfREVTQ19NQVhfUExFTikgeworCQlkZXNjX21hcHBpbmcgKz0gZmlyc3RfZGVzY19sZW47CisJCWRlc2NfbGVuIC09IGZpcnN0X2Rlc2NfbGVuOworCQllMSsrOworCQljZSsrOworCQlpZiAoKytwaWR4ID09IHEtPnNpemUpIHsKKwkJCXBpZHggPSAwOworCQkJZ2VuIF49IDE7CisJCQllMSA9IHEtPmVudHJpZXM7CisJCQljZSA9IHEtPmNlbnRyaWVzOworCQl9CisJCXBpZHggPSB3cml0ZV9sYXJnZV9wYWdlX3R4X2Rlc2NzKHBpZHgsICZlMSwgJmNlLCAmZ2VuLAorCQkJCQkJICZkZXNjX21hcHBpbmcsICZkZXNjX2xlbiwKKwkJCQkJCSBuZnJhZ3MsIHEpOworCisJCWlmIChsaWtlbHkoZGVzY19sZW4pKQorCQkJd3JpdGVfdHhfZGVzYyhlMSwgZGVzY19tYXBwaW5nLCBkZXNjX2xlbiwgZ2VuLAorCQkJCSAgICAgIG5mcmFncyA9PSAwKTsKKwl9CisKIAljZS0+c2tiID0gTlVMTDsKIAlwY2lfdW5tYXBfYWRkcl9zZXQoY2UsIGRtYV9hZGRyLCBtYXBwaW5nKTsKIAlwY2lfdW5tYXBfbGVuX3NldChjZSwgZG1hX2xlbiwgc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKTsKIAotCWZsYWdzID0gRl9DTURfREFUQVZBTElEIHwgRl9DTURfU09QIHwgVl9DTURfRU9QKG5mcmFncyA9PSAwKSB8Ci0JCVZfQ01EX0dFTjIoZ2VuKTsKLQllID0gJnEtPmVudHJpZXNbcGlkeF07Ci0JZS0+YWRkcl9sbyA9ICh1MzIpbWFwcGluZzsKLQllLT5hZGRyX2hpID0gKHU2NCltYXBwaW5nID4+IDMyOwotCWUtPmxlbl9nZW4gPSBWX0NNRF9MRU4oc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSB8IFZfQ01EX0dFTjEoZ2VuKTsKLQlmb3IgKGUxID0gZSwgaSA9IDA7IG5mcmFncy0tOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBuZnJhZ3MtLTsgaSsrKSB7CiAJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQotCQljZSsrOwogCQllMSsrOworCQljZSsrOwogCQlpZiAoKytwaWR4ID09IHEtPnNpemUpIHsKIAkJCXBpZHggPSAwOwogCQkJZ2VuIF49IDE7Ci0JCQljZSA9IHEtPmNlbnRyaWVzOwogCQkJZTEgPSBxLT5lbnRyaWVzOworCQkJY2UgPSBxLT5jZW50cmllczsKIAkJfQogCiAJCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgZnJhZy0+cGFnZSwKIAkJCQkgICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCiAJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXNjX21hcHBpbmcgPSBtYXBwaW5nOworCQlkZXNjX2xlbiA9IGZyYWctPnNpemU7CisKKwkJcGlkeCA9IHdyaXRlX2xhcmdlX3BhZ2VfdHhfZGVzY3MocGlkeCwgJmUxLCAmY2UsICZnZW4sCisJCQkJCQkgJmRlc2NfbWFwcGluZywgJmRlc2NfbGVuLAorCQkJCQkJIG5mcmFncywgcSk7CisJCWlmIChsaWtlbHkoZGVzY19sZW4pKQorCQkJd3JpdGVfdHhfZGVzYyhlMSwgZGVzY19tYXBwaW5nLCBkZXNjX2xlbiwgZ2VuLAorCQkJCSAgICAgIG5mcmFncyA9PSAwKTsKIAkJY2UtPnNrYiA9IE5VTEw7CiAJCXBjaV91bm1hcF9hZGRyX3NldChjZSwgZG1hX2FkZHIsIG1hcHBpbmcpOwogCQlwY2lfdW5tYXBfbGVuX3NldChjZSwgZG1hX2xlbiwgZnJhZy0+c2l6ZSk7Ci0KLQkJZTEtPmFkZHJfbG8gPSAodTMyKW1hcHBpbmc7Ci0JCWUxLT5hZGRyX2hpID0gKHU2NCltYXBwaW5nID4+IDMyOwotCQllMS0+bGVuX2dlbiA9IFZfQ01EX0xFTihmcmFnLT5zaXplKSB8IFZfQ01EX0dFTjEoZ2VuKTsKLQkJZTEtPmZsYWdzID0gRl9DTURfREFUQVZBTElEIHwgVl9DTURfRU9QKG5mcmFncyA9PSAwKSB8Ci0JCQkgICAgVl9DTURfR0VOMihnZW4pOwogCX0KLQogCWNlLT5za2IgPSBza2I7CiAJd21iKCk7CiAJZS0+ZmxhZ3MgPSBmbGFnczsKQEAgLTkyMCwyNiArMTMxNiw1NiBAQAogCXVuc2lnbmVkIGludCByZWNsYWltID0gcS0+cHJvY2Vzc2VkIC0gcS0+Y2xlYW5lZDsKIAogCWlmIChyZWNsYWltKSB7CisJCXByX2RlYnVnKCJyZWNsYWltX2NvbXBsZXRlZF90eCBwcm9jZXNzZWQ6JWQgY2xlYW5lZDolZFxuIiwKKwkJCSBxLT5wcm9jZXNzZWQsIHEtPmNsZWFuZWQpOwogCQlmcmVlX2NtZFFfYnVmZmVycyhzZ2UsIHEsIHJlY2xhaW0pOwogCQlxLT5jbGVhbmVkICs9IHJlY2xhaW07CiAJfQogfQogCi0jaWZuZGVmIFNFVF9FVEhUT09MX09QUwotIyBkZWZpbmUgX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpIG5ldGlmX3J4X2NvbXBsZXRlKGRldikKLSNlbmRpZgotCiAvKgotICogV2UgY2Fubm90IHVzZSB0aGUgc3RhbmRhcmQgbmV0aWZfcnhfc2NoZWR1bGVfcHJlcCgpIGJlY2F1c2Ugd2UgaGF2ZSBtdWx0aXBsZQotICogcG9ydHMgcGx1cyB0aGUgVE9FIGFsbCBtdWx0aXBsZXhpbmcgb250byBhIHNpbmdsZSByZXNwb25zZSBxdWV1ZSwgdGhlcmVmb3JlCi0gKiBhY2NlcHRpbmcgbmV3IHJlc3BvbnNlcyBjYW5ub3QgZGVwZW5kIG9uIHRoZSBzdGF0ZSBvZiBhbnkgcGFydGljdWxhciBwb3J0LgotICogU28gZGVmaW5lIG91ciBvd24gZXF1aXZhbGVudCB0aGF0IG9taXRzIHRoZSBuZXRpZl9ydW5uaW5nKCkgdGVzdC4KKyAqIENhbGxlZCBmcm9tIHRhc2tsZXQuIENoZWNrcyB0aGUgc2NoZWR1bGVyIGZvciBhbnkKKyAqIHBlbmRpbmcgc2ticyB0aGF0IGNhbiBiZSBzZW50LgogICovCi1zdGF0aWMgaW5saW5lIGludCBuYXBpX3NjaGVkdWxlX3ByZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJlc3RhcnRfc2NoZWQodW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JcmV0dXJuICF0ZXN0X2FuZF9zZXRfYml0KF9fTElOS19TVEFURV9SWF9TQ0hFRCwgJmRldi0+c3RhdGUpOwotfQorCXN0cnVjdCBzZ2UgKnNnZSA9IChzdHJ1Y3Qgc2dlICopIGFyZzsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHNnZS0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kUSAqcSA9ICZzZ2UtPmNtZFFbMF07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgY3JlZGl0cywgcXVldWVkX3NrYiA9IDA7CiAKKwlzcGluX2xvY2soJnEtPmxvY2spOworCXJlY2xhaW1fY29tcGxldGVkX3R4KHNnZSwgcSk7CisKKwljcmVkaXRzID0gcS0+c2l6ZSAtIHEtPmluX3VzZTsKKwlwcl9kZWJ1ZygicmVzdGFydF9zY2hlZCBjcmVkaXRzPSVkXG4iLCBjcmVkaXRzKTsKKwl3aGlsZSAoKHNrYiA9IHNjaGVkX3NrYihzZ2UsIE5VTEwsIGNyZWRpdHMpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGludCBnZW5iaXQsIHBpZHgsIGNvdW50OworCSAgICAgICAgY291bnQgPSAxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKyAgICAgICAJCWNvdW50ICs9IGNvbXB1dGVfbGFyZ2VfcGFnZV90eF9kZXNjcyhza2IpOworCQlxLT5pbl91c2UgKz0gY291bnQ7CisJCWdlbmJpdCA9IHEtPmdlbmJpdDsKKwkJcGlkeCA9IHEtPnBpZHg7CisJCXEtPnBpZHggKz0gY291bnQ7CisJCWlmIChxLT5waWR4ID49IHEtPnNpemUpIHsKKwkJCXEtPnBpZHggLT0gcS0+c2l6ZTsKKwkJCXEtPmdlbmJpdCBePSAxOworCQl9CisJCXdyaXRlX3R4X2Rlc2NzKGFkYXB0ZXIsIHNrYiwgcGlkeCwgZ2VuYml0LCBxKTsKKwkgICAgICAgIGNyZWRpdHMgPSBxLT5zaXplIC0gcS0+aW5fdXNlOworCQlxdWV1ZWRfc2tiID0gMTsKKwl9CisKKwlpZiAocXVldWVkX3NrYikgeworCQljbGVhcl9iaXQoQ01EUV9TVEFUX0xBU1RfUEtUX0RCLCAmcS0+c3RhdHVzKTsKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQ01EUV9TVEFUX1JVTk5JTkcsICZxLT5zdGF0dXMpID09IDApIHsKKwkJCXNldF9iaXQoQ01EUV9TVEFUX0xBU1RfUEtUX0RCLCAmcS0+c3RhdHVzKTsKKwkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwgYWRhcHRlci0+cmVncyArIEFfU0dfRE9PUkJFTEwpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKK30KIAogLyoqCiAgKglzZ2VfcnggLSBwcm9jZXNzIGFuIGluZ3Jlc3MgZXRoZXJuZXQgcGFja2V0CkBAIC05NTQsMzEgKzEzODAsMzkgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBjcGxfcnhfcGt0ICpwOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gc2dlLT5hZGFwdGVyOworCXN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqc3Q7CiAKLQlzZ2UtPnN0YXRzLmV0aGVybmV0X3BrdHMrKzsKIAlza2IgPSBnZXRfcGFja2V0KGFkYXB0ZXItPnBkZXYsIGZsLCBsZW4gLSBzZ2UtPnJ4X3BrdF9wYWQsCiAJCQkgc2dlLT5yeF9wa3RfcGFkLCAyLCBTR0VfUlhfQ09QWV9USFJFUywKIAkJCSBTR0VfUlhfRFJPUF9USFJFUyk7Ci0JaWYgKCFza2IpIHsKLQkJc2dlLT5wb3J0X3N0YXRzWzBdLnJ4X2Ryb3BzKys7IC8qIGNoYXJnZSBvbmx5IHBvcnQgMCBmb3Igbm93ICovCisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCXNnZS0+c3RhdHMucnhfZHJvcHMrKzsKIAkJcmV0dXJuIDA7CiAJfQogCiAJcCA9IChzdHJ1Y3QgY3BsX3J4X3BrdCAqKXNrYi0+ZGF0YTsKIAlza2JfcHVsbChza2IsIHNpemVvZigqcCkpOworCWlmIChwLT5pZmYgPj0gYWRhcHRlci0+cGFyYW1zLm5wb3J0cykgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc2tiLT5kZXYgPSBhZGFwdGVyLT5wb3J0W3AtPmlmZl0uZGV2OwogCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzdCA9IHBlcl9jcHVfcHRyKHNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXN0LT5yeF9wYWNrZXRzKys7CisKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIFJYX0NTVU1fRU5BQkxFRCkgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKIAkgICAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgJiYKIAkgICAgKHNrYi0+ZGF0YVs5XSA9PSBJUFBST1RPX1RDUCB8fCBza2ItPmRhdGFbOV0gPT0gSVBQUk9UT19VRFApKSB7Ci0JCXNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLnJ4X2Nzb19nb29kKys7CisJCSsrc3QtPnJ4X2Nzb19nb29kOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0gZWxzZQogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAlpZiAodW5saWtlbHkoYWRhcHRlci0+dmxhbl9ncnAgJiYgcC0+dmxhbl92YWxpZCkpIHsKLQkJc2dlLT5wb3J0X3N0YXRzW3AtPmlmZl0udmxhbl94dHJhY3QrKzsKKwkJc3QtPnZsYW5feHRyYWN0Kys7CiAJCWlmIChhZGFwdGVyLT5wYXJhbXMuc2dlLnBvbGxpbmcpCiAJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGFuX2dycCwKIAkJCQkJCSBudG9ocyhwLT52bGFuKSk7CkBAIC0xMDM5LDE4ICsxNDczLDI0IEBACiAJc3RydWN0IGNtZFEgKmNtZHEgPSAmc2dlLT5jbWRRWzBdOwogCiAJY21kcS0+cHJvY2Vzc2VkICs9IHByMDsKLQorCWlmIChmbGFncyAmIChGX0ZMMF9FTkFCTEUgfCBGX0ZMMV9FTkFCTEUpKSB7CisJCWZyZWVsUXNfZW1wdHkoc2dlKTsKKwkJZmxhZ3MgJj0gfihGX0ZMMF9FTkFCTEUgfCBGX0ZMMV9FTkFCTEUpOworCX0KIAlpZiAoZmxhZ3MgJiBGX0NNRFEwX0VOQUJMRSkgewogCQljbGVhcl9iaXQoQ01EUV9TVEFUX1JVTk5JTkcsICZjbWRxLT5zdGF0dXMpOwotCQorCiAJCWlmIChjbWRxLT5jbGVhbmVkICsgY21kcS0+aW5fdXNlICE9IGNtZHEtPnByb2Nlc3NlZCAmJgogCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoQ01EUV9TVEFUX0xBU1RfUEtUX0RCLCAmY21kcS0+c3RhdHVzKSkgewogCQkJc2V0X2JpdChDTURRX1NUQVRfUlVOTklORywgJmNtZHEtPnN0YXR1cyk7CiAJCQl3cml0ZWwoRl9DTURRMF9FTkFCTEUsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0RPT1JCRUxMKTsKIAkJfQotCSAJZmxhZ3MgJj0gfkZfQ01EUTBfRU5BQkxFOworCQlpZiAoc2dlLT50eF9zY2hlZCkKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnNnZS0+dHhfc2NoZWQtPnNjaGVkX3Rzayk7CisKKwkJZmxhZ3MgJj0gfkZfQ01EUTBfRU5BQkxFOwogCX0KLQkKKwogCWlmICh1bmxpa2VseShzZ2UtPnN0b3BwZWRfdHhfcXVldWVzICE9IDApKQogCQlyZXN0YXJ0X3R4X3F1ZXVlcyhzZ2UpOwogCkBAIC0xMjQxLDIwICsxNjgxLDIxIEBACiAJCWlmIChlLT5HZW5lcmF0aW9uQml0ID09IHEtPmdlbmJpdCkgewogCQkJaWYgKGUtPkRhdGFWYWxpZCB8fAogCQkJICAgIHByb2Nlc3NfcHVyZV9yZXNwb25zZXMoYWRhcHRlciwgZSkpIHsKLQkJCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcChzZ2UtPm5ldGRldikpKQorCQkJCWlmIChsaWtlbHkoX19uZXRpZl9yeF9zY2hlZHVsZV9wcmVwKHNnZS0+bmV0ZGV2KSkpCiAJCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoc2dlLT5uZXRkZXYpOwotCQkJCWVsc2UKLQkJCQkJcHJpbnRrKEtFUk5fQ1JJVAorCQkJCWVsc2UgaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkgICAgICAgIk5BUEkgc2NoZWR1bGUgZmFpbHVyZSFcbiIpOwogCQkJfSBlbHNlCi0JCQl3cml0ZWwocS0+Y2lkeCwgYWRhcHRlci0+cmVncyArIEFfU0dfU0xFRVBJTkcpOworCQkJCXdyaXRlbChxLT5jaWR4LCBhZGFwdGVyLT5yZWdzICsgQV9TR19TTEVFUElORyk7CisKIAkJCWhhbmRsZWQgPSAxOwogCQkJZ290byB1bmxvY2s7CiAJCX0gZWxzZQotCQl3cml0ZWwocS0+Y2lkeCwgYWRhcHRlci0+cmVncyArIEFfU0dfU0xFRVBJTkcpOwotCX0gIGVsc2UKLQlpZiAocmVhZGwoYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpICYgRl9QTF9JTlRSX1NHRV9EQVRBKQotCQlwcmludGsoS0VSTl9FUlIgImRhdGEgaW50ZXJydXB0IHdoaWxlIE5BUEkgcnVubmluZ1xuIik7CisJCQl3cml0ZWwocS0+Y2lkeCwgYWRhcHRlci0+cmVncyArIEFfU0dfU0xFRVBJTkcpOworCX0gIGVsc2UgaWYgKHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKSAmIEZfUExfSU5UUl9TR0VfREFUQSkgeworCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkYXRhIGludGVycnVwdCB3aGlsZSBOQVBJIHJ1bm5pbmdcbiIpOworCX0KIAkKIAloYW5kbGVkID0gdDFfc2xvd19pbnRyX2hhbmRsZXIoYWRhcHRlcik7CiAJaWYgKCFoYW5kbGVkKQpAQCAtMTMzNSwzNCArMTc3Niw1OSBAQAogewogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKIAlzdHJ1Y3QgY21kUSAqcSA9ICZzZ2UtPmNtZFFbcWlkXTsKLQl1bnNpZ25lZCBpbnQgY3JlZGl0cywgcGlkeCwgZ2VuYml0LCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgY3JlZGl0cywgcGlkeCwgZ2VuYml0LCBjb3VudCwgdXNlX3NjaGVkX3NrYiA9IDA7CiAKLQlzcGluX2xvY2soJnEtPmxvY2spOworCWlmICghc3Bpbl90cnlsb2NrKCZxLT5sb2NrKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7CisKIAlyZWNsYWltX2NvbXBsZXRlZF90eChzZ2UsIHEpOwogCiAJcGlkeCA9IHEtPnBpZHg7CiAJY3JlZGl0cyA9IHEtPnNpemUgLSBxLT5pbl91c2U7CiAJY291bnQgPSAxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwljb3VudCArPSBjb21wdXRlX2xhcmdlX3BhZ2VfdHhfZGVzY3Moc2tiKTsKIAotCXsJLyogRXRoZXJuZXQgcGFja2V0ICovCi0JIAlpZiAodW5saWtlbHkoY3JlZGl0cyA8IGNvdW50KSkgeworCS8qIEV0aGVybmV0IHBhY2tldCAqLworCWlmICh1bmxpa2VseShjcmVkaXRzIDwgY291bnQpKSB7CisJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CiAJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJCQlzZXRfYml0KGRldi0+aWZfcG9ydCwgJnNnZS0+c3RvcHBlZF90eF9xdWV1ZXMpOwogCQkJc2dlLT5zdGF0cy5jbWRRX2Z1bGxbMl0rKzsKLQkJCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKLQkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQotCQkJCUNIX0VSUigiJXM6IFR4IHJpbmcgZnVsbCB3aGlsZSBxdWV1ZSBhd2FrZSFcbiIsCi0JCQkJICAgICAgIGFkYXB0ZXItPm5hbWUpOwotCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCQkJQ0hfRVJSKCIlczogVHggcmluZyBmdWxsIHdoaWxlIHF1ZXVlIGF3YWtlIVxuIiwKKwkJCSAgICAgICBhZGFwdGVyLT5uYW1lKTsKIAkJfQotCQlpZiAodW5saWtlbHkoY3JlZGl0cyAtIGNvdW50IDwgcS0+c3RvcF90aHJlcykpIHsKLQkJCXNnZS0+c3RhdHMuY21kUV9mdWxsWzJdKys7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCQlzZXRfYml0KGRldi0+aWZfcG9ydCwgJnNnZS0+c3RvcHBlZF90eF9xdWV1ZXMpOwotCQl9CisJCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KKworCWlmICh1bmxpa2VseShjcmVkaXRzIC0gY291bnQgPCBxLT5zdG9wX3RocmVzKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNldF9iaXQoZGV2LT5pZl9wb3J0LCAmc2dlLT5zdG9wcGVkX3R4X3F1ZXVlcyk7CisJCXNnZS0+c3RhdHMuY21kUV9mdWxsWzJdKys7CisJfQorCisJLyogVDIwNCBjbWRRMCBza2JzIHRoYXQgYXJlIGRlc3RpbmVkIGZvciBhIGNlcnRhaW4gcG9ydCBoYXZlIHRvIGdvCisJICogdGhyb3VnaCB0aGUgc2NoZWR1bGVyLgorCSAqLworCWlmIChzZ2UtPnR4X3NjaGVkICYmICFxaWQgJiYgc2tiLT5kZXYpIHsKKwl1c2Vfc2NoZWQ6CisJCXVzZV9zY2hlZF9za2IgPSAxOworCQkvKiBOb3RlIHRoYXQgdGhlIHNjaGVkdWxlciBtaWdodCByZXR1cm4gYSBkaWZmZXJlbnQgc2tiIHRoYW4KKwkJICogdGhlIG9uZSBwYXNzZWQgaW4uCisJCSAqLworCQlza2IgPSBzY2hlZF9za2Ioc2dlLCBza2IsIGNyZWRpdHMpOworCQlpZiAoIXNrYikgeworCQkJc3Bpbl91bmxvY2soJnEtPmxvY2spOworCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwkJfQorCQlwaWR4ID0gcS0+cGlkeDsKKwkJY291bnQgPSAxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJY291bnQgKz0gY29tcHV0ZV9sYXJnZV9wYWdlX3R4X2Rlc2NzKHNrYik7CisJfQorCiAJcS0+aW5fdXNlICs9IGNvdW50OwogCWdlbmJpdCA9IHEtPmdlbmJpdDsKKwlwaWR4ID0gcS0+cGlkeDsKIAlxLT5waWR4ICs9IGNvdW50OwogCWlmIChxLT5waWR4ID49IHEtPnNpemUpIHsKIAkJcS0+cGlkeCAtPSBxLT5zaXplOwpAQCAtMTM4OCw2ICsxODU0LDE0IEBACiAJCQl3cml0ZWwoRl9DTURRMF9FTkFCTEUsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0RPT1JCRUxMKTsKIAkJfQogCX0KKworCWlmICh1c2Vfc2NoZWRfc2tiKSB7CisJCWlmIChzcGluX3RyeWxvY2soJnEtPmxvY2spKSB7CisJCQljcmVkaXRzID0gcS0+c2l6ZSAtIHEtPmluX3VzZTsKKwkJCXNrYiA9IE5VTEw7CisJCQlnb3RvIHVzZV9zY2hlZDsKKwkJfQorCX0KIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCkBAIC0xNDEyLDE2ICsxODg2LDIwIEBACiBpbnQgdDFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwotCXN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqc3QgPSAmYWRhcHRlci0+c2dlLT5wb3J0X3N0YXRzW2Rldi0+aWZfcG9ydF07CiAJc3RydWN0IHNnZSAqc2dlID0gYWRhcHRlci0+c2dlOworCXN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqc3QgPSBwZXJfY3B1X3B0cihzZ2UtPnBvcnRfc3RhdHNbZGV2LT5pZl9wb3J0XSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzdHJ1Y3QgY3BsX3R4X3BrdCAqY3BsOworCXN0cnVjdCBza19idWZmICpvcmlnX3NrYiA9IHNrYjsKKwlpbnQgcmV0OwogCi0jaWZkZWYgTkVUSUZfRl9UU08KLQlpZiAoc2tiX2lzX2dzbyhza2IpKSB7CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfQ1BMNSkpCisJCWdvdG8gc2VuZDsKKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CiAJCWludCBldGhfdHlwZTsKIAkJc3RydWN0IGNwbF90eF9wa3RfbHNvICpoZHI7CiAKLQkJc3QtPnRzbysrOworCQkrK3N0LT50eF90c287CiAKIAkJZXRoX3R5cGUgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSA9PSBFVEhfSExFTiA/CiAJCQlDUExfRVRIX0lJIDogQ1BMX0VUSF9JSV9WTEFOOwpAQCAtMTQzMiwxMyArMTkxMCwxMCBAQAogCQloZHItPmlwX2hkcl93b3JkcyA9IHNrYi0+bmguaXBoLT5paGw7CiAJCWhkci0+dGNwX2hkcl93b3JkcyA9IHNrYi0+aC50aC0+ZG9mZjsKIAkJaGRyLT5ldGhfdHlwZV9tc3MgPSBodG9ucyhNS19FVEhfVFlQRV9NU1MoZXRoX3R5cGUsCi0JCQkJCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSk7CisJCQkJCQkJICBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSk7CiAJCWhkci0+bGVuID0gaHRvbmwoc2tiLT5sZW4gLSBzaXplb2YoKmhkcikpOwogCQljcGwgPSAoc3RydWN0IGNwbF90eF9wa3QgKiloZHI7Ci0JCXNnZS0+c3RhdHMudHhfbHNvX3BrdHMrKzsKLQl9IGVsc2UKLSNlbmRpZgotCXsKKwl9IGVsc2UgewogCQkvKgogCSAJICogUGFja2V0cyBzaG9ydGVyIHRoYW4gRVRIX0hMRU4gY2FuIGJyZWFrIHRoZSBNQUMsIGRyb3AgdGhlbQogCQkgKiBlYXJseS4gIEFsc28sIHdlIG1heSBnZXQgb3ZlcnNpemVkIHBhY2tldHMgYmVjYXVzZSBzb21lCkBAIC0xNDQ3LDYgKzE5MjIsOCBAQAogCQkgKi8KIAkJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgRVRIX0hMRU4gfHwKIAkJCSAgICAgc2tiLT5sZW4gPiBkZXYtPm10dSArIGV0aF9oZHJfbGVuKHNrYi0+ZGF0YSkpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHBhY2tldCBzaXplICVkIGhkciAlZCBtdHUlZFxuIiwgZGV2LT5uYW1lLAorCQkJCSBza2ItPmxlbiwgZXRoX2hkcl9sZW4oc2tiLT5kYXRhKSwgZGV2LT5tdHUpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCXJldHVybiBORVRERVZfVFhfT0s7CiAJCX0KQEAgLTE0NTYsOSArMTkzMyw5IEBACiAJCSAqIGNvbXBvbmVudHMsIHN1Y2ggYXMgcGt0Z2VuLCBkbyBub3QgaGFuZGxlIGl0IHJpZ2h0LgogCQkgKiBDb21wbGFpbiB3aGVuIHRoaXMgaGFwcGVucyBidXQgdHJ5IHRvIGZpeCB0aGluZ3MgdXAuCiAJCSAqLwotCQlpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPAotCQkJICAgICBkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIEVUSF9ITEVOKSkgewotCQkJc3RydWN0IHNrX2J1ZmYgKm9yaWdfc2tiID0gc2tiOworCQlpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIEVUSF9ITEVOKSkgeworCQkJcHJfZGVidWcoIiVzOiBoZWFkcm9vbSAlZCBoZWFkZXJfbGVuICVkXG4iLCBkZXYtPm5hbWUsCisJCQkJIHNrYl9oZWFkcm9vbShza2IpLCBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CiAKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW5hZGVxdWF0ZSBoZWFkcm9vbSBpbiAiCkBAIC0xNDcxLDE5ICsxOTQ4LDIxIEBACiAKIAkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBVRFBfQ1NVTV9DQVBBQkxFKSAmJgogCQkgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgICAgc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKQorCQkgICAgc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CiAJCQlpZiAodW5saWtlbHkoc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSkpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IHVuYWJsZSB0byBkbyB1ZHAgY2hlY2tzdW1cbiIsIGRldi0+bmFtZSk7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCQkJfQorCQl9CiAKIAkJLyogSG1tbSwgYXNzdW1pbmcgdG8gY2F0Y2ggdGhlIGdyYXRpb3VzIGFycC4uLiBhbmQgd2UnbGwgdXNlCiAJCSAqIGl0IHRvIGZsdXNoIG91dCBzdHVjayBlc3BpIHBhY2tldHMuLi4KLQkJICAqLwotCQlpZiAodW5saWtlbHkoIWFkYXB0ZXItPnNnZS0+ZXNwaWJ1Z19za2IpKSB7CisJCSAqLworCQlpZiAoKHVubGlrZWx5KCFhZGFwdGVyLT5zZ2UtPmVzcGlidWdfc2tiW2Rldi0+aWZfcG9ydF0pKSkgewogCQkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfQVJQKSAmJgogCQkJICAgIHNrYi0+bmguYXJwaC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpIHsKLQkJCQlhZGFwdGVyLT5zZ2UtPmVzcGlidWdfc2tiID0gc2tiOworCQkJCWFkYXB0ZXItPnNnZS0+ZXNwaWJ1Z19za2JbZGV2LT5pZl9wb3J0XSA9IHNrYjsKIAkJCQkvKiBXZSB3YW50IHRvIHJlLXVzZSB0aGlzIHNrYiBsYXRlci4gV2UKIAkJCQkgKiBzaW1wbHkgYnVtcCB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCBpdAogCQkJCSAqIHdpbGwgbm90IGJlIGZyZWVkLi4uCkBAIC0xNDk5LDggKzE5NzgsNiBAQAogCQkvKiB0aGUgbGVuZ3RoIGZpZWxkIGlzbid0IHVzZWQgc28gZG9uJ3QgYm90aGVyIHNldHRpbmcgaXQgKi8KIAogCQlzdC0+dHhfY3NvICs9IChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKTsKLQkJc2dlLT5zdGF0cy50eF9kb19ja3N1bSArPSAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCk7Ci0JCXNnZS0+c3RhdHMudHhfcmVnX3BrdHMrKzsKIAl9CiAJY3BsLT5pZmYgPSBkZXYtPmlmX3BvcnQ7CiAKQEAgLTE1MTMsOCArMTk5MCwxOSBAQAogI2VuZGlmCiAJCWNwbC0+dmxhbl92YWxpZCA9IDA7CiAKK3NlbmQ6CisJc3QtPnR4X3BhY2tldHMrKzsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQlyZXR1cm4gdDFfc2dlX3R4KHNrYiwgYWRhcHRlciwgMCwgZGV2KTsKKwlyZXQgPSB0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBkZXYpOworCisJLyogSWYgdHJhbnNtaXQgYnVzeSwgYW5kIHdlIHJlYWxsb2NhdGVkIHNrYidzIGR1ZSB0byBoZWFkcm9vbSBsaW1pdCwKKwkgKiB0aGVuIHNpbGVudGx5IGRpc2NhcmQgdG8gYXZvaWQgbGVhay4KKwkgKi8KKwlpZiAodW5saWtlbHkocmV0ICE9IE5FVERFVl9UWF9PSyAmJiBza2IgIT0gb3JpZ19za2IpKSB7CisgCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXQgPSBORVRERVZfVFhfT0s7CisgCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTUzMiwxMCArMjAyMCw5IEBACiAJCQljb250aW51ZTsKIAogCQlyZWNsYWltX2NvbXBsZXRlZF90eChzZ2UsIHEpOwotCQlpZiAoaSA9PSAwICYmIHEtPmluX3VzZSkgICAvKiBmbHVzaCBwZW5kaW5nIGNyZWRpdHMgKi8KLQkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwKLQkJCQlzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0RPT1JCRUxMKTsKLQorCQlpZiAoaSA9PSAwICYmIHEtPmluX3VzZSkgeyAgICAvKiBmbHVzaCBwZW5kaW5nIGNyZWRpdHMgKi8KKwkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwgc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19ET09SQkVMTCk7CisJCX0KIAkJc3Bpbl91bmxvY2soJnEtPmxvY2spOwogCX0KIAltb2RfdGltZXIoJnNnZS0+dHhfcmVjbGFpbV90aW1lciwgamlmZmllcyArIFRYX1JFQ0xBSU1fUEVSSU9EKTsKQEAgLTE1ODIsMTEgKzIwNjksMjAgQEAKICAqLwogdm9pZCB0MV9zZ2Vfc3RvcChzdHJ1Y3Qgc2dlICpzZ2UpCiB7CisJaW50IGk7CiAJd3JpdGVsKDAsIHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7Ci0JKHZvaWQpIHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7IC8qIGZsdXNoICovCisJcmVhZGwoc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsgLyogZmx1c2ggKi8KKwogCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKQogCQlkZWxfdGltZXJfc3luYygmc2dlLT5lc3BpYnVnX3RpbWVyKTsKKwogCWRlbF90aW1lcl9zeW5jKCZzZ2UtPnR4X3JlY2xhaW1fdGltZXIpOworCWlmIChzZ2UtPnR4X3NjaGVkKQorCQl0eF9zY2hlZF9zdG9wKHNnZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05QT1JUUzsgaSsrKQorCQlpZiAoc2dlLT5lc3BpYnVnX3NrYltpXSkKKwkJCWtmcmVlX3NrYihzZ2UtPmVzcGlidWdfc2tiW2ldKTsKIH0KIAogLyoKQEAgLTE1OTksNDQgKzIwOTUsODIgQEAKIAogCXdyaXRlbChzZ2UtPnNnZV9jb250cm9sLCBzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOwogCWRvb3JiZWxsX3BpbyhzZ2UtPmFkYXB0ZXIsIEZfRkwwX0VOQUJMRSB8IEZfRkwxX0VOQUJMRSk7Ci0JKHZvaWQpIHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7IC8qIGZsdXNoICovCisJcmVhZGwoc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsgLyogZmx1c2ggKi8KIAogCW1vZF90aW1lcigmc2dlLT50eF9yZWNsYWltX3RpbWVyLCBqaWZmaWVzICsgVFhfUkVDTEFJTV9QRVJJT0QpOwogCi0JaWYgKGlzX1QyKHNnZS0+YWRhcHRlcikpIAorCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKQogCQltb2RfdGltZXIoJnNnZS0+ZXNwaWJ1Z190aW1lciwgamlmZmllcyArIHNnZS0+ZXNwaWJ1Z190aW1lb3V0KTsKIH0KIAogLyoKICAqIENhbGxiYWNrIGZvciB0aGUgVDIgRVNQSSAnc3R1Y2sgcGFja2V0IGZlYXR1cmUnIHdvcmthb3J1bmQKICAqLwotc3RhdGljIHZvaWQgZXNwaWJ1Z193b3JrYXJvdW5kKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBlc3BpYnVnX3dvcmthcm91bmRfdDIwNCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOworCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwl1bnNpZ25lZCBpbnQgbnBvcnRzID0gYWRhcHRlci0+cGFyYW1zLm5wb3J0czsKKwl1MzIgc2VvcFtNQVhfTlBPUlRTXTsKKworCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0spIHsKKwkJaW50IGk7CisJCWlmICh0MV9lc3BpX2dldF9tb25fdDIwNChhZGFwdGVyLCAmKHNlb3BbMF0pLCAwKSA8IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnBvcnRzOyBpKyspIHsKKwkgICAgICAgIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2dlLT5lc3BpYnVnX3NrYltpXTsKKwkJCWlmICggKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+cG9ydFtpXS5kZXYpKSAmJgorCQkJICAgICAhKG5ldGlmX3F1ZXVlX3N0b3BwZWQoYWRhcHRlci0+cG9ydFtpXS5kZXYpKSAmJgorCQkJICAgICAoc2VvcFtpXSAmJiAoKHNlb3BbaV0gJiAweGZmZikgPT0gMCkpICYmCisJCQkgICAgIHNrYiApIHsKKwkgICAgICAgICAgICAgICAgCWlmICghc2tiLT5jYlswXSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgIAl1OCBjaF9tYWNfYWRkcltFVEhfQUxFTl0gPQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljaF9tYWNfYWRkciwgRVRIX0FMRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgIAltZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwKKwkJCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgCXNrYi0+Y2JbMF0gPSAweGZmOworCSAgICAgICAgICAgICAgICAJfQorCisJICAgICAgICAgICAgICAgIAkvKiBidW1wIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgZnJlZWluZyBvZgorCSAgICAgICAgICAgICAgICAgCSAqIHRoZSBza2Igb25jZSB0aGUgRE1BIGhhcyBjb21wbGV0ZWQuCisJICAgICAgICAgICAgICAgICAJICovCisJICAgICAgICAgICAgICAgIAlza2IgPSBza2JfZ2V0KHNrYik7CisJICAgICAgICAgICAgICAgIAl0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBhZGFwdGVyLT5wb3J0W2ldLmRldik7CisJCQl9CisJCX0KKwl9CisJbW9kX3RpbWVyKCZzZ2UtPmVzcGlidWdfdGltZXIsIGppZmZpZXMgKyBzZ2UtPmVzcGlidWdfdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcGlidWdfd29ya2Fyb3VuZCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPnBvcnRbMF0uZGV2KSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2dlLT5lc3BpYnVnX3NrYjsKKwkgICAgICAgIHN0cnVjdCBza19idWZmICpza2IgPSBzZ2UtPmVzcGlidWdfc2tiWzBdOworCSAgICAgICAgdTMyIHNlb3AgPSB0MV9lc3BpX2dldF9tb24oYWRhcHRlciwgMHg5MzAsIDApOwogCi0JCXUzMiBzZW9wID0gdDFfZXNwaV9nZXRfbW9uKGFkYXB0ZXIsIDB4OTMwLCAwKTsKKwkgICAgICAgIGlmICgoc2VvcCAmIDB4ZmZmMGZmZikgPT0gMHhmZmYgJiYgc2tiKSB7CisJICAgICAgICAgICAgICAgIGlmICghc2tiLT5jYlswXSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNoX21hY19hZGRyW0VUSF9BTEVOXSA9CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAsIDB4NywgMHg0MywgMHgwLCAweDAsIDB4MH07CisJICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gMTAsIGNoX21hY19hZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5jYlswXSA9IDB4ZmY7CisJICAgICAgICAgICAgICAgIH0KIAotCQlpZiAoKHNlb3AgJiAweGZmZjBmZmYpID09IDB4ZmZmICYmIHNrYikgewotCQkJaWYgKCFza2ItPmNiWzBdKSB7Ci0JCQkJdTggY2hfbWFjX2FkZHJbRVRIX0FMRU5dID0KLQkJCQkgICAgezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KSwKLQkJCQkgICAgY2hfbWFjX2FkZHIsIEVUSF9BTEVOKTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwgY2hfbWFjX2FkZHIsCi0JCQkJICAgIEVUSF9BTEVOKTsKLQkJCQlza2ItPmNiWzBdID0gMHhmZjsKLQkJCX0KLQotCQkJLyogYnVtcCB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIGF2b2lkIGZyZWVpbmcgb2YgdGhlCi0JCQkgKiBza2Igb25jZSB0aGUgRE1BIGhhcyBjb21wbGV0ZWQuCi0JCQkgKi8KLQkJCXNrYiA9IHNrYl9nZXQoc2tiKTsKLQkJCXQxX3NnZV90eChza2IsIGFkYXB0ZXIsIDAsIGFkYXB0ZXItPnBvcnRbMF0uZGV2KTsKLQkJfQorCSAgICAgICAgICAgICAgICAvKiBidW1wIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgZnJlZWluZyBvZiB0aGUKKwkgICAgICAgICAgICAgICAgICogc2tiIG9uY2UgdGhlIERNQSBoYXMgY29tcGxldGVkLgorCSAgICAgICAgICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgc2tiID0gc2tiX2dldChza2IpOworCSAgICAgICAgICAgICAgICB0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBhZGFwdGVyLT5wb3J0WzBdLmRldik7CisJICAgICAgICB9CiAJfQogCW1vZF90aW1lcigmc2dlLT5lc3BpYnVnX3RpbWVyLCBqaWZmaWVzICsgc2dlLT5lc3BpYnVnX3RpbWVvdXQpOwogfQpAQCAtMTY0NywyNiArMjE4MSw0MiBAQAogc3RydWN0IHNnZSAqIF9fZGV2aW5pdCB0MV9zZ2VfY3JlYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgc3RydWN0IHNnZV9wYXJhbXMgKnApCiB7Ci0Jc3RydWN0IHNnZSAqc2dlID0ga21hbGxvYyhzaXplb2YoKnNnZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCBzZ2UgKnNnZSA9IGt6YWxsb2Moc2l6ZW9mKCpzZ2UpLCBHRlBfS0VSTkVMKTsKKwlpbnQgaTsKIAogCWlmICghc2dlKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoc2dlLCAwLCBzaXplb2YoKnNnZSkpOwogCiAJc2dlLT5hZGFwdGVyID0gYWRhcHRlcjsKIAlzZ2UtPm5ldGRldiA9IGFkYXB0ZXItPnBvcnRbMF0uZGV2OwogCXNnZS0+cnhfcGt0X3BhZCA9IHQxX2lzX1QxQihhZGFwdGVyKSA/IDAgOiAyOwogCXNnZS0+anVtYm9fZmwgPSB0MV9pc19UMUIoYWRhcHRlcikgPyAxIDogMDsKIAorCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQlzZ2UtPnBvcnRfc3RhdHNbaV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHNnZV9wb3J0X3N0YXRzKTsKKwkJaWYgKCFzZ2UtPnBvcnRfc3RhdHNbaV0pCisJCQlnb3RvIG5vbWVtX3BvcnQ7CisJfQorCiAJaW5pdF90aW1lcigmc2dlLT50eF9yZWNsYWltX3RpbWVyKTsKIAlzZ2UtPnR4X3JlY2xhaW1fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNnZTsKIAlzZ2UtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24gPSBzZ2VfdHhfcmVjbGFpbV9jYjsKIAogCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKSB7CiAJCWluaXRfdGltZXIoJnNnZS0+ZXNwaWJ1Z190aW1lcik7Ci0JCXNnZS0+ZXNwaWJ1Z190aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJmVzcGlidWdfd29ya2Fyb3VuZDsKKworCQlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA+IDEpIHsKKwkJCXR4X3NjaGVkX2luaXQoc2dlKTsKKwkJCXNnZS0+ZXNwaWJ1Z190aW1lci5mdW5jdGlvbiA9IGVzcGlidWdfd29ya2Fyb3VuZF90MjA0OworCQl9IGVsc2UgeworCQkJc2dlLT5lc3BpYnVnX3RpbWVyLmZ1bmN0aW9uID0gZXNwaWJ1Z193b3JrYXJvdW5kOworCQl9CiAJCXNnZS0+ZXNwaWJ1Z190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2dlLT5hZGFwdGVyOworCiAJCXNnZS0+ZXNwaWJ1Z190aW1lb3V0ID0gMTsKKwkJLyogZm9yIFQyMDQsIGV2ZXJ5IDEwbXMgKi8KKwkJaWYgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPiAxKQorCQkJc2dlLT5lc3BpYnVnX3RpbWVvdXQgPSBIWi8xMDA7CiAJfQogCSAKIApAQCAtMTY3NCwxMCArMjIyNCwyNSBAQAogCXAtPmNtZFFfc2l6ZVsxXSA9IFNHRV9DTURRMV9FX047CiAJcC0+ZnJlZWxRX3NpemVbIXNnZS0+anVtYm9fZmxdID0gU0dFX0ZSRUVMX1NJWkU7CiAJcC0+ZnJlZWxRX3NpemVbc2dlLT5qdW1ib19mbF0gPSBTR0VfSlVNQk9fRlJFRUxfU0laRTsKLQlwLT5yeF9jb2FsZXNjZV91c2VjcyA9ICA1MDsKKwlpZiAoc2dlLT50eF9zY2hlZCkgeworCQlpZiAoYm9hcmRfaW5mbyhzZ2UtPmFkYXB0ZXIpLT5ib2FyZCA9PSBDSEJUX0JPQVJEX0NIVDIwNCkKKwkJCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTU7CisJCWVsc2UKKwkJCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gNTA7CisJfSBlbHNlCisJCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gNTA7CisKIAlwLT5jb2FsZXNjZV9lbmFibGUgPSAwOwogCXAtPnNhbXBsZV9pbnRlcnZhbF91c2VjcyA9IDA7CiAJcC0+cG9sbGluZyA9IDA7CiAKIAlyZXR1cm4gc2dlOworbm9tZW1fcG9ydDoKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWZyZWVfcGVyY3B1KHNnZS0+cG9ydF9zdGF0c1tpXSk7CisJCS0taTsKKwl9CisJa2ZyZWUoc2dlKTsKKwlyZXR1cm4gTlVMTDsKKwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmgKaW5kZXggOTFhZjQ3Yi4uN2NlYjAxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5oCkBAIC00NCw2ICs0NCw5IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiBzdHJ1Y3Qgc2dlX2ludHJfY291bnRzIHsKKwl1bnNpZ25lZCBpbnQgcnhfZHJvcHM7ICAgICAgICAvKiAjIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbm8gbWVtICovCisJdW5zaWduZWQgaW50IHB1cmVfcnNwczsgICAgICAgIC8qICMgb2Ygbm9uLXBheWxvYWQgcmVzcG9uc2VzICovCisJdW5zaWduZWQgaW50IHVuaGFuZGxlZF9pcnFzOyAgIC8qICMgb2YgdW5oYW5kbGVkIGludGVycnVwdHMgKi8KIAl1bnNpZ25lZCBpbnQgcmVzcFFfZW1wdHk7ICAgICAgLyogIyB0aW1lcyByZXNwUSBlbXB0eSAqLwogCXVuc2lnbmVkIGludCByZXNwUV9vdmVyZmxvdzsgICAvKiAjIHJlc3BRIG92ZXJmbG93IChmYXRhbCkgKi8KIAl1bnNpZ25lZCBpbnQgZnJlZWxpc3RRX2VtcHR5OyAgLyogIyB0aW1lcyBmcmVlbGlzdCBlbXB0eSAqLwpAQCAtNTEsMjQgKzU0LDE2IEBACiAJdW5zaWduZWQgaW50IHBrdF9taXNtYXRjaDsKIAl1bnNpZ25lZCBpbnQgY21kUV9mdWxsWzNdOyAgICAgLyogbm90IEhXIElSUSwgaG9zdCBjbWRRW10gZnVsbCAqLwogCXVuc2lnbmVkIGludCBjbWRRX3Jlc3RhcnRlZFszXTsvKiAjIG9mIHRpbWVzIGNtZFEgWCB3YXMgcmVzdGFydGVkICovCi0JdW5zaWduZWQgaW50IGV0aGVybmV0X3BrdHM7ICAgIC8qICMgb2YgRXRoZXJuZXQgcGFja2V0cyByZWNlaXZlZCAqLwotCXVuc2lnbmVkIGludCBvZmZsb2FkX3BrdHM7ICAgICAvKiAjIG9mIG9mZmxvYWQgcGFja2V0cyByZWNlaXZlZCAqLwotCXVuc2lnbmVkIGludCBvZmZsb2FkX2J1bmRsZXM7ICAvKiAjIG9mIG9mZmxvYWQgcGt0IGJ1bmRsZXMgZGVsaXZlcmVkICovCi0JdW5zaWduZWQgaW50IHB1cmVfcnNwczsgICAgICAgIC8qICMgb2Ygbm9uLXBheWxvYWQgcmVzcG9uc2VzICovCi0JdW5zaWduZWQgaW50IHVuaGFuZGxlZF9pcnFzOyAgIC8qICMgb2YgdW5oYW5kbGVkIGludGVycnVwdHMgKi8KLQl1bnNpZ25lZCBpbnQgdHhfaXBmcmFnczsKLQl1bnNpZ25lZCBpbnQgdHhfcmVnX3BrdHM7Ci0JdW5zaWduZWQgaW50IHR4X2xzb19wa3RzOwotCXVuc2lnbmVkIGludCB0eF9kb19ja3N1bTsKIH07CiAKIHN0cnVjdCBzZ2VfcG9ydF9zdGF0cyB7Ci0JdW5zaWduZWQgbG9uZyByeF9jc29fZ29vZDsgICAgIC8qICMgb2Ygc3VjY2Vzc2Z1bCBSWCBjc3VtIG9mZmxvYWRzICovCi0JdW5zaWduZWQgbG9uZyB0eF9jc287ICAgICAgICAgIC8qICMgb2YgVFggY2hlY2tzdW0gb2ZmbG9hZHMgKi8KLQl1bnNpZ25lZCBsb25nIHZsYW5feHRyYWN0OyAgICAgLyogIyBvZiBWTEFOIHRhZyBleHRyYWN0aW9ucyAqLwotCXVuc2lnbmVkIGxvbmcgdmxhbl9pbnNlcnQ7ICAgICAvKiAjIG9mIFZMQU4gdGFnIGV4dHJhY3Rpb25zICovCi0JdW5zaWduZWQgbG9uZyB0c287ICAgICAgICAgICAgIC8qICMgb2YgVFNPIHJlcXVlc3RzICovCi0JdW5zaWduZWQgbG9uZyByeF9kcm9wczsgICAgICAgIC8qICMgb2YgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBubyBtZW0gKi8KKwl1NjQgcnhfcGFja2V0czsgICAgICAvKiAjIG9mIEV0aGVybmV0IHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1NjQgcnhfY3NvX2dvb2Q7ICAgICAvKiAjIG9mIHN1Y2Nlc3NmdWwgUlggY3N1bSBvZmZsb2FkcyAqLworCXU2NCB0eF9wYWNrZXRzOyAgICAgIC8qICMgb2YgVFggcGFja2V0cyAqLworCXU2NCB0eF9jc287ICAgICAgICAgIC8qICMgb2YgVFggY2hlY2tzdW0gb2ZmbG9hZHMgKi8KKwl1NjQgdHhfdHNvOyAgICAgICAgICAvKiAjIG9mIFRTTyByZXF1ZXN0cyAqLworCXU2NCB2bGFuX3h0cmFjdDsgICAgIC8qICMgb2YgVkxBTiB0YWcgZXh0cmFjdGlvbnMgKi8KKwl1NjQgdmxhbl9pbnNlcnQ7ICAgICAvKiAjIG9mIFZMQU4gdGFnIGluc2VydGlvbnMgKi8KIH07CiAKIHN0cnVjdCBza19idWZmOwpAQCAtOTAsNyArODUsMTEgQEAKIHZvaWQgdDFfc2dlX2ludHJfZW5hYmxlKHN0cnVjdCBzZ2UgKik7CiB2b2lkIHQxX3NnZV9pbnRyX2Rpc2FibGUoc3RydWN0IHNnZSAqKTsKIHZvaWQgdDFfc2dlX2ludHJfY2xlYXIoc3RydWN0IHNnZSAqKTsKLWNvbnN0IHN0cnVjdCBzZ2VfaW50cl9jb3VudHMgKnQxX3NnZV9nZXRfaW50cl9jb3VudHMoc3RydWN0IHNnZSAqc2dlKTsKLWNvbnN0IHN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqdDFfc2dlX2dldF9wb3J0X3N0YXRzKHN0cnVjdCBzZ2UgKnNnZSwgaW50IHBvcnQpOworY29uc3Qgc3RydWN0IHNnZV9pbnRyX2NvdW50cyAqdDFfc2dlX2dldF9pbnRyX2NvdW50cyhjb25zdCBzdHJ1Y3Qgc2dlICpzZ2UpOwordm9pZCB0MV9zZ2VfZ2V0X3BvcnRfc3RhdHMoY29uc3Qgc3RydWN0IHNnZSAqc2dlLCBpbnQgcG9ydCwgc3RydWN0IHNnZV9wb3J0X3N0YXRzICopOwordm9pZCB0MV9zY2hlZF9zZXRfbWF4X2F2YWlsX2J5dGVzKHN0cnVjdCBzZ2UgKiwgdW5zaWduZWQgaW50KTsKK3ZvaWQgdDFfc2NoZWRfc2V0X2RyYWluX2JpdHNfcGVyX3VzKHN0cnVjdCBzZ2UgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordW5zaWduZWQgaW50IHQxX3NjaGVkX3VwZGF0ZV9wYXJtcyhzdHJ1Y3Qgc2dlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQkJICAgdW5zaWduZWQgaW50KTsKIAogI2VuZGlmIC8qIF9DWEdCX1NHRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zdWJyLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYwppbmRleCAxMmU0ZTk2Li4yMmVkOWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgImdtYWMuaCIKICNpbmNsdWRlICJjcGh5LmgiCiAjaW5jbHVkZSAic2dlLmgiCisjaW5jbHVkZSAidHAuaCIKICNpbmNsdWRlICJlc3BpLmgiCiAKIC8qKgpAQCAtNTksNyArNjAsNyBAQAogICoJb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50IHQxX3dhaXRfb3BfZG9uZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCByZWcsIHUzMiBtYXNrLCBpbnQgcG9sYXJpdHksCi0JCSAgICBpbnQgYXR0ZW1wdHMsIGludCBkZWxheSkKKwkJCSAgIGludCBhdHRlbXB0cywgaW50IGRlbGF5KQogewogCXdoaWxlICgxKSB7CiAJCXUzMiB2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgcmVnKSAmIG1hc2s7CkBAIC03OCw3ICs3OSw3IEBACiAvKgogICogV3JpdGUgYSByZWdpc3RlciBvdmVyIHRoZSBUUEkgaW50ZXJmYWNlICh1bmxvY2tlZCBhbmQgbG9ja2VkIHZlcnNpb25zKS4KICAqLwotc3RhdGljIGludCBfX3QxX3RwaV93cml0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgdmFsdWUpCitpbnQgX190MV90cGlfd3JpdGUoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIHZhbHVlKQogewogCWludCB0cGlfYnVzeTsKIApAQCAtOTgsMTYgKzk5LDE2IEBACiB7CiAJaW50IHJldDsKIAotCXNwaW5fbG9jaygmKGFkYXB0ZXIpLT50cGlfbG9jayk7CisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50cGlfbG9jayk7CiAJcmV0ID0gX190MV90cGlfd3JpdGUoYWRhcHRlciwgYWRkciwgdmFsdWUpOwotCXNwaW5fdW5sb2NrKCYoYWRhcHRlciktPnRwaV9sb2NrKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHBpX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCiAgKiBSZWFkIGEgcmVnaXN0ZXIgb3ZlciB0aGUgVFBJIGludGVyZmFjZSAodW5sb2NrZWQgYW5kIGxvY2tlZCB2ZXJzaW9ucykuCiAgKi8KLXN0YXRpYyBpbnQgX190MV90cGlfcmVhZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKnZhbHApCitpbnQgX190MV90cGlfcmVhZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKnZhbHApCiB7CiAJaW50IHRwaV9idXN5OwogCkBAIC0xMjgsMTggKzEyOSwyNiBAQAogewogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCXNwaW5fbG9jaygmYWRhcHRlci0+dHBpX2xvY2spOwogCXJldCA9IF9fdDFfdHBpX3JlYWQoYWRhcHRlciwgYWRkciwgdmFscCk7Ci0Jc3Bpbl91bmxvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50cGlfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyoKKyAqIFNldCBhIFRQSSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHQxX3RwaV9wYXIoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKFZfVFBJUEFSKHZhbHVlKSwgYWRhcHRlci0+cmVncyArIEFfVFBJX1BBUik7Cit9CisKKy8qCiAgKiBDYWxsZWQgd2hlbiBhIHBvcnQncyBsaW5rIHNldHRpbmdzIGNoYW5nZSB0byBwcm9wYWdhdGUgdGhlIG5ldyB2YWx1ZXMgdG8gdGhlCiAgKiBhc3NvY2lhdGVkIFBIWSBhbmQgTUFDLiAgQWZ0ZXIgcGVyZm9ybWluZyB0aGUgY29tbW9uIHRhc2tzIGl0IGludm9rZXMgYW4KICAqIE9TLXNwZWNpZmljIGhhbmRsZXIuCiAgKi8KLS8qIHN0YXRpYyAqLyB2b2lkIGxpbmtfY2hhbmdlZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwb3J0X2lkKQordm9pZCB0MV9saW5rX2NoYW5nZWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcG9ydF9pZCkKIHsKIAlpbnQgbGlua19vaywgc3BlZWQsIGR1cGxleCwgZmM7CiAJc3RydWN0IGNwaHkgKnBoeSA9IGFkYXB0ZXItPnBvcnRbcG9ydF9pZF0ucGh5OwpAQCAtMTU5LDIzICsxNjgsODMgQEAKIAkJbWFjLT5vcHMtPnNldF9zcGVlZF9kdXBsZXhfZmMobWFjLCBzcGVlZCwgZHVwbGV4LCBmYyk7CiAJCWxjLT5mYyA9ICh1bnNpZ25lZCBjaGFyKWZjOwogCX0KLQl0MV9saW5rX2NoYW5nZWQoYWRhcHRlciwgcG9ydF9pZCwgbGlua19vaywgc3BlZWQsIGR1cGxleCwgZmMpOworCXQxX2xpbmtfbmVnb3RpYXRlZChhZGFwdGVyLCBwb3J0X2lkLCBsaW5rX29rLCBzcGVlZCwgZHVwbGV4LCBmYyk7CiB9CiAKIHN0YXRpYyBpbnQgdDFfcGNpX2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJdTMyIHBjaXhfY2F1c2U7CiAKLSAgICAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX0lOVFJfQ0FVU0UsICZwY2l4X2NhdXNlKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwgQV9QQ0lDRkdfSU5UUl9DQVVTRSwgJnBjaXhfY2F1c2UpOwogCiAJaWYgKHBjaXhfY2F1c2UpIHsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBBX1BDSUNGR19JTlRSX0NBVVNFLAotCQkJCQkgcGNpeF9jYXVzZSk7CisJCQkJICAgICAgIHBjaXhfY2F1c2UpOwogCQl0MV9mYXRhbF9lcnIoYWRhcHRlcik7ICAgIC8qIFBDSSBlcnJvcnMgYXJlIGZhdGFsICovCiAJfQogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCisjaW5jbHVkZSAiY3NwaS5oIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKKyNpbmNsdWRlICJmcGdhX2RlZnMuaCIKKworLyoKKyAqIFBIWSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgRlBHQSBib2FyZHMuCisgKi8KK3N0YXRpYyBpbnQgZnBnYV9waHlfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpbnQgcDsKKwl1MzIgY2F1c2UgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgRlBHQV9HTUFDX0FERFJfSU5URVJSVVBUX0NBVVNFKTsKKworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcCkKKwkJaWYgKGNhdXNlICYgKDEgPDwgcCkpIHsKKwkJCXN0cnVjdCBjcGh5ICpwaHkgPSBhZGFwdGVyLT5wb3J0W3BdLnBoeTsKKwkJCWludCBwaHlfY2F1c2UgPSBwaHktPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIocGh5KTsKKworCQkJaWYgKHBoeV9jYXVzZSAmIGNwaHlfY2F1c2VfbGlua19jaGFuZ2UpCisJCQkJdDFfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIHApOworCQl9CisJd3JpdGVsKGNhdXNlLCBhZGFwdGVyLT5yZWdzICsgRlBHQV9HTUFDX0FERFJfSU5URVJSVVBUX0NBVVNFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNsb3cgcGF0aCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgRlBHQXMuCisgKi8KK3N0YXRpYyBpbnQgZnBnYV9zbG93X2ludHIoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXUzMiBjYXVzZSA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKKworCWNhdXNlICY9IH5GX1BMX0lOVFJfU0dFX0RBVEE7CisJaWYgKGNhdXNlICYgRl9QTF9JTlRSX1NHRV9FUlIpCisJCXQxX3NnZV9pbnRyX2Vycm9yX2hhbmRsZXIoYWRhcHRlci0+c2dlKTsKKworCWlmIChjYXVzZSAmIEZQR0FfUENJWF9JTlRFUlJVUFRfR01BQykKKyAgICAgICAgICAgICAgICBmcGdhX3BoeV9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisKKwlpZiAoY2F1c2UgJiBGUEdBX1BDSVhfSU5URVJSVVBUX1RQKSB7CisgICAgICAgICAgICAgICAgLyoKKwkJICogRlBHQSBkb2Vzbid0IHN1cHBvcnQgTUM0IGludGVycnVwdHMgYW5kIGl0IHJlcXVpcmVzCisJCSAqIHRoaXMgb2RkIGxheWVyIG9mIGluZGlyZWN0aW9uIGZvciBNQzUuCisgICAgICAgICAgICAgICAgICovCisJCXUzMiB0cF9jYXVzZSA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBGUEdBX1RQX0FERFJfSU5URVJSVVBUX0NBVVNFKTsKKworCQkvKiBDbGVhciBUUCBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKHRwX2NhdXNlLCBhZGFwdGVyLT5yZWdzICsgRlBHQV9UUF9BRERSX0lOVEVSUlVQVF9DQVVTRSk7CisJfQorCWlmIChjYXVzZSAmIEZQR0FfUENJWF9JTlRFUlJVUFRfUENJWCkKKwkJdDFfcGNpX2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIGp1c3QgcHJvY2Vzc2VkLiAqLworCWlmIChjYXVzZSkKKwkJd3JpdGVsKGNhdXNlLCBhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisKKwlyZXR1cm4gY2F1c2UgIT0gMDsKK30KKyNlbmRpZgogCiAvKgogICogV2FpdCB1bnRpbCBFbG1lcidzIE1JMSBpbnRlcmZhY2UgaXMgcmVhZHkgZm9yIG5ldyBvcGVyYXRpb25zLgpAQCAtMjEyLDEyICsyODEsNjIgQEAKIAl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX0NGRywgdmFsKTsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX0NIRUxTSU9fVDFfMUcpIHx8IGRlZmluZWQoQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSKQorLyoKKyAqIEVsbWVyIE1JMSBNRElPIHJlYWQvd3JpdGUgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBtaTFfbWRpb19yZWFkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCQkgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbHApCit7CisJdTMyIGFkZHIgPSBWX01JMV9SRUdfQUREUihyZWdfYWRkcikgfCBWX01JMV9QSFlfQUREUihwaHlfYWRkcik7CisKKwlpZiAobW1kX2FkZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50cGlfbG9jayk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX0FERFIsIGFkZHIpOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsCisJCQlBX0VMTUVSMF9QT1JUMF9NSTFfT1AsIE1JMV9PUF9ESVJFQ1RfUkVBRCk7CisJbWkxX3dhaXRfdW50aWxfcmVhZHkoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX09QKTsKKwlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9EQVRBLCB2YWxwKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHBpX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pMV9tZGlvX3dyaXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCQkgIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1MzIgYWRkciA9IFZfTUkxX1JFR19BRERSKHJlZ19hZGRyKSB8IFZfTUkxX1BIWV9BRERSKHBoeV9hZGRyKTsKKworCWlmIChtbWRfYWRkcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPnRwaV9sb2NrKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfQUREUiwgYWRkcik7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX0RBVEEsIHZhbCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwKKwkJCUFfRUxNRVIwX1BPUlQwX01JMV9PUCwgTUkxX09QX0RJUkVDVF9XUklURSk7CisJbWkxX3dhaXRfdW50aWxfcmVhZHkoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX09QKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHBpX2xvY2spOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV8xRykgfHwgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV9DT1VHQVIpCitzdGF0aWMgc3RydWN0IG1kaW9fb3BzIG1pMV9tZGlvX29wcyA9IHsKKwltaTFfbWRpb19pbml0LAorCW1pMV9tZGlvX3JlYWQsCisJbWkxX21kaW9fd3JpdGUKK307CisjZW5kaWYKKworI2VuZGlmCisKIHN0YXRpYyBpbnQgbWkxX21kaW9fZXh0X3JlYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKIAkJCSAgICAgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbHApCiB7CiAJdTMyIGFkZHIgPSBWX01JMV9SRUdfQUREUihtbWRfYWRkcikgfCBWX01JMV9QSFlfQUREUihwaHlfYWRkcik7CiAKLQlzcGluX2xvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCXNwaW5fbG9jaygmYWRhcHRlci0+dHBpX2xvY2spOwogCiAJLyogV3JpdGUgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gKi8KIAlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfQUREUiwgYWRkcik7CkBAIC0yMjcsMTIgKzM0NiwxMyBAQAogCW1pMV93YWl0X3VudGlsX3JlYWR5KGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9PUCk7CiAKIAkvKiBXcml0ZSB0aGUgb3BlcmF0aW9uIHdlIHdhbnQuICovCi0JX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX09QLCBNSTFfT1BfSU5ESVJFQ1RfUkVBRCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwKKwkJCUFfRUxNRVIwX1BPUlQwX01JMV9PUCwgTUkxX09QX0lORElSRUNUX1JFQUQpOwogCW1pMV93YWl0X3VudGlsX3JlYWR5KGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9PUCk7CiAKIAkvKiBSZWFkIHRoZSBkYXRhLiAqLwogCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX0RBVEEsIHZhbHApOwotCXNwaW5fdW5sb2NrKCYoYWRhcHRlciktPnRwaV9sb2NrKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHBpX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0yNDEsNyArMzYxLDcgQEAKIHsKIAl1MzIgYWRkciA9IFZfTUkxX1JFR19BRERSKG1tZF9hZGRyKSB8IFZfTUkxX1BIWV9BRERSKHBoeV9hZGRyKTsKIAotCXNwaW5fbG9jaygmKGFkYXB0ZXIpLT50cGlfbG9jayk7CisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50cGlfbG9jayk7CiAKIAkvKiBXcml0ZSB0aGUgYWRkcmVzcyB3ZSB3YW50LiAqLwogCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9BRERSLCBhZGRyKTsKQEAgLTI1NCw3ICszNzQsNyBAQAogCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9EQVRBLCB2YWwpOwogCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9PUCwgTUkxX09QX0lORElSRUNUX1dSSVRFKTsKIAltaTFfd2FpdF91bnRpbF9yZWFkeShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfT1ApOwotCXNwaW5fdW5sb2NrKCYoYWRhcHRlciktPnRwaV9sb2NrKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHBpX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0yNjUsMTIgKzM4NSwyNSBAQAogfTsKIAogZW51bSB7CisJQ0hfQlJEX1QxMTBfMUNVLAogCUNIX0JSRF9OMTEwXzFGLAogCUNIX0JSRF9OMjEwXzFGLAorCUNIX0JSRF9UMjEwXzFGLAorCUNIX0JSRF9UMjEwXzFDVSwKKwlDSF9CUkRfTjIwNF80Q1UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGJvYXJkX2luZm8gdDFfYm9hcmRbXSA9IHsKIAoreyBDSEJUX0JPQVJEX0NIVDExMCwgMS8qcG9ydHMjKi8sCisgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgLypjYXBzKi8sIENIQlRfVEVSTV9UMSwKKyAgQ0hCVF9NQUNfUE0zMzkzLCBDSEJUX1BIWV9NWTMxMjYsCisgIDEyNTAwMDAwMC8qY2xrLWNvcmUqLywgMTUwMDAwMDAwLypjbGstbWMzKi8sIDEyNTAwMDAwMC8qY2xrLW1jNCovLAorICAxLyplc3BpLXBvcnRzKi8sIDAvKmNsay1jc3BpKi8sIDQ0LypjbGstZWxtZXIwKi8sIDEvKm1kaWVuKi8sCisgIDEvKm1kaWludiovLCAxLyptZGMqLywgMS8qcGh5YmFzZWFkZHIqLywgJnQxX3BtMzM5M19vcHMsCisgICZ0MV9teTMxMjZfb3BzLCAmbWkxX21kaW9fZXh0X29wcywKKyAgIkNoZWxzaW8gVDExMCAxeDEwR0Jhc2UtQ1g0IFRPRSIgfSwKKwogeyBDSEJUX0JPQVJEX04xMTAsIDEvKnBvcnRzIyovLAogICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFIC8qY2FwcyovLCBDSEJUX1RFUk1fVDEsCiAgIENIQlRfTUFDX1BNMzM5MywgQ0hCVF9QSFlfODhYMjAxMCwKQEAgLTI4OSwxMiArNDIyLDQ3IEBACiAgICZ0MV9tdjg4eDIwMXhfb3BzLCAmbWkxX21kaW9fZXh0X29wcywKICAgIkNoZWxzaW8gTjIxMCAxeDEwR0Jhc2VYIE5JQyIgfSwKIAoreyBDSEJUX0JPQVJEX0NIVDIxMCwgMS8qcG9ydHMjKi8sCisgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgLypjYXBzKi8sIENIQlRfVEVSTV9UMiwKKyAgQ0hCVF9NQUNfUE0zMzkzLCBDSEJUX1BIWV84OFgyMDEwLAorICAxMjUwMDAwMDAvKmNsay1jb3JlKi8sIDEzMzAwMDAwMC8qY2xrLW1jMyovLCAxMjUwMDAwMDAvKmNsay1tYzQqLywKKyAgMS8qZXNwaS1wb3J0cyovLCAwLypjbGstY3NwaSovLCA0NC8qY2xrLWVsbWVyMCovLCAwLyptZGllbiovLAorICAwLyptZGlpbnYqLywgMS8qbWRjKi8sIDAvKnBoeWJhc2VhZGRyKi8sICZ0MV9wbTMzOTNfb3BzLAorICAmdDFfbXY4OHgyMDF4X29wcywgJm1pMV9tZGlvX2V4dF9vcHMsCisgICJDaGVsc2lvIFQyMTAgMXgxMEdCYXNlWCBUT0UiIH0sCisKK3sgQ0hCVF9CT0FSRF9DSFQyMTAsIDEvKnBvcnRzIyovLAorICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIC8qY2FwcyovLCBDSEJUX1RFUk1fVDIsCisgIENIQlRfTUFDX1BNMzM5MywgQ0hCVF9QSFlfTVkzMTI2LAorICAxMjUwMDAwMDAvKmNsay1jb3JlKi8sIDEzMzAwMDAwMC8qY2xrLW1jMyovLCAxMjUwMDAwMDAvKmNsay1tYzQqLywKKyAgMS8qZXNwaS1wb3J0cyovLCAwLypjbGstY3NwaSovLCA0NC8qY2xrLWVsbWVyMCovLCAxLyptZGllbiovLAorICAxLyptZGlpbnYqLywgMS8qbWRjKi8sIDEvKnBoeWJhc2VhZGRyKi8sICZ0MV9wbTMzOTNfb3BzLAorICAmdDFfbXkzMTI2X29wcywgJm1pMV9tZGlvX2V4dF9vcHMsCisgICJDaGVsc2lvIFQyMTAgMXgxMEdCYXNlLUNYNCBUT0UiIH0sCisKKyNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV8xRworeyBDSEJUX0JPQVJEX0NITjIwNCwgNC8qcG9ydHMjKi8sCisgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwKKyAgU1VQUE9SVEVEX1BBVVNFIHwgU1VQUE9SVEVEX1RQIC8qY2FwcyovLCBDSEJUX1RFUk1fVDIsIENIQlRfTUFDX1ZTQzczMjEsIENIQlRfUEhZXzg4RTExMTEsCisgIDEwMDAwMDAwMC8qY2xrLWNvcmUqLywgMC8qY2xrLW1jMyovLCAwLypjbGstbWM0Ki8sCisgIDQvKmVzcGktcG9ydHMqLywgMC8qY2xrLWNzcGkqLywgNDQvKmNsay1lbG1lcjAqLywgMC8qbWRpZW4qLywKKyAgMC8qbWRpaW52Ki8sIDEvKm1kYyovLCA0LypwaHliYXNlYWRkciovLCAmdDFfdnNjNzMyNl9vcHMsCisgICZ0MV9tdjg4ZTF4eHhfb3BzLCAmbWkxX21kaW9fb3BzLAorICAiQ2hlbHNpbyBOMjA0IDR4MTAwLzEwMDBCYXNlVCBOSUMiIH0sCisjZW5kaWYKKwogfTsKIAogc3RydWN0IHBjaV9kZXZpY2VfaWQgdDFfcGNpX3RibFtdID0geworCUNIX0RFVklDRSg4LCAwLCBDSF9CUkRfVDExMF8xQ1UpLAorCUNIX0RFVklDRSg4LCAxLCBDSF9CUkRfVDExMF8xQ1UpLAogCUNIX0RFVklDRSg3LCAwLCBDSF9CUkRfTjExMF8xRiksCiAJQ0hfREVWSUNFKDEwLCAxLCBDSF9CUkRfTjIxMF8xRiksCi0JeyAwLCB9CisJQ0hfREVWSUNFKDExLCAxLCBDSF9CUkRfVDIxMF8xRiksCisJQ0hfREVWSUNFKDE0LCAxLCBDSF9CUkRfVDIxMF8xQ1UpLAorCUNIX0RFVklDRSgxNiwgMSwgQ0hfQlJEX04yMDRfNENVKSwKKwl7IDAgfQogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHQxX3BjaV90YmwpOwpAQCAtMzkwLDkgKzU1OCwxNCBAQAogCWlmIChsYy0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpIHsKIAkJbGMtPmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF9BU1lNX1BBVVNFIHwgQURWRVJUSVNFRF9QQVVTRSk7CiAJCWlmIChmYykgewotCQkJbGMtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQVNZTV9QQVVTRTsKLQkJCWlmIChmYyA9PSAoUEFVU0VfUlggfCBQQVVTRV9UWCkpCisJCQlpZiAoZmMgPT0gKChQQVVTRV9SWCB8IFBBVVNFX1RYKSAmCisJCQkJICAgKG1hYy0+YWRhcHRlci0+cGFyYW1zLm5wb3J0cyA8IDIpKSkKIAkJCQlsYy0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QQVVTRTsKKwkJCWVsc2UgeworCQkJCWxjLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FTWU1fUEFVU0U7CisJCQkJaWYgKGZjID09IFBBVVNFX1JYKQorCQkJCQlsYy0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QQVVTRTsKKwkJCX0KIAkJfQogCQlwaHktPm9wcy0+YWR2ZXJ0aXNlKHBoeSwgbGMtPmFkdmVydGlzaW5nKTsKIApAQCAtNDAzLDExICs1NzYsMTUgQEAKIAkJCW1hYy0+b3BzLT5zZXRfc3BlZWRfZHVwbGV4X2ZjKG1hYywgbGMtPnNwZWVkLAogCQkJCQkJICAgICAgbGMtPmR1cGxleCwgZmMpOwogCQkJLyogQWxzbyBkaXNhYmxlcyBhdXRvbmVnICovCisJCQlwaHktPnN0YXRlID0gUEhZX0FVVE9ORUdfUkRZOwogCQkJcGh5LT5vcHMtPnNldF9zcGVlZF9kdXBsZXgocGh5LCBsYy0+c3BlZWQsIGxjLT5kdXBsZXgpOwogCQkJcGh5LT5vcHMtPnJlc2V0KHBoeSwgMCk7Ci0JCX0gZWxzZQorCQl9IGVsc2UgeworCQkJcGh5LT5zdGF0ZSA9IFBIWV9BVVRPTkVHX0VOOwogCQkJcGh5LT5vcHMtPmF1dG9uZWdfZW5hYmxlKHBoeSk7IC8qIGFsc28gcmVzZXRzIFBIWSAqLworCQl9CiAJfSBlbHNlIHsKKwkJcGh5LT5zdGF0ZSA9IFBIWV9BVVRPTkVHX1JEWTsKIAkJbWFjLT5vcHMtPnNldF9zcGVlZF9kdXBsZXhfZmMobWFjLCAtMSwgLTEsIGZjKTsKIAkJbGMtPmZjID0gKHVuc2lnbmVkIGNoYXIpZmM7CiAJCXBoeS0+b3BzLT5yZXNldChwaHksIDApOwpAQCAtNDE4LDI0ICs1OTUsMTA5IEBACiAvKgogICogRXh0ZXJuYWwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGJvYXJkcyB1c2luZyBlbG1lcjAuCiAgKi8KLWludCBlbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCitpbnQgdDFfZWxtZXIwX2V4dF9pbnRyX2hhbmRsZXIoYWRhcHRlcl90ICphZGFwdGVyKQogewotICAgIAlzdHJ1Y3QgY3BoeSAqcGh5OworCXN0cnVjdCBjcGh5ICpwaHk7CiAJaW50IHBoeV9jYXVzZTsKLSAgICAJdTMyIGNhdXNlOworCXUzMiBjYXVzZTsKIAogCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgJmNhdXNlKTsKIAogCXN3aXRjaCAoYm9hcmRfaW5mbyhhZGFwdGVyKS0+Ym9hcmQpIHsKKyNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV8xRworICAgICAgICBjYXNlIENIQlRfQk9BUkRfQ0hUMjA0OgorICAgICAgICBjYXNlIENIQlRfQk9BUkRfQ0hUMjA0RToKKyAgICAgICAgY2FzZSBDSEJUX0JPQVJEX0NITjIwNDoKKyAgICAgICAgY2FzZSBDSEJUX0JPQVJEX0NIVDIwNFY6IHsKKyAgICAgICAgICAgICAgICBpbnQgaSwgcG9ydF9iaXQ7CisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQkJcG9ydF9iaXQgPSBpICsgMTsKKwkJCWlmICghKGNhdXNlICYgKDEgPDwgcG9ydF9iaXQpKSkgY29udGludWU7CisKKwkgICAgICAgICAgICAgICAgcGh5ID0gYWRhcHRlci0+cG9ydFtpXS5waHk7CisJCQlwaHlfY2F1c2UgPSBwaHktPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIocGh5KTsKKwkJCWlmIChwaHlfY2F1c2UgJiBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlKQorCQkJCXQxX2xpbmtfY2hhbmdlZChhZGFwdGVyLCBpKTsKKwkJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJY2FzZSBDSEJUX0JPQVJEX0NIVDEwMToKKwkJaWYgKGNhdXNlICYgRUxNRVIwX0dQX0JJVDEpIHsgLyogTWFydmVsbCA4OEUxMTExIGludGVycnVwdCAqLworCQkJcGh5ID0gYWRhcHRlci0+cG9ydFswXS5waHk7CisJCQlwaHlfY2F1c2UgPSBwaHktPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIocGh5KTsKKwkJCWlmIChwaHlfY2F1c2UgJiBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlKQorCQkJCXQxX2xpbmtfY2hhbmdlZChhZGFwdGVyLCAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENIQlRfQk9BUkRfNzUwMDogeworCQlpbnQgcDsKKyAgICAJCS8qCisJCSAqIEVsbWVyMCdzIGludGVycnVwdCBjYXVzZSBpc24ndCB1c2VmdWwgaGVyZSBiZWNhdXNlIHRoZXJlIGlzCisJCSAqIG9ubHkgb25lIGJpdCB0aGF0IGNhbiBiZSBzZXQgZm9yIGFsbCA0IHBvcnRzLiAgVGhpcyBtZWFucworCQkgKiB3ZSBhcmUgZm9yY2VkIHRvIGNoZWNrIGV2ZXJ5IFBIWSdzIGludGVycnVwdCBzdGF0dXMKKwkJICogcmVnaXN0ZXIgdG8gc2VlIHdobyBpbml0aWF0ZWQgdGhlIGludGVycnVwdC4KKyAgICAgCQkgKi8KKyAgICAJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcCkgeworCQkJcGh5ID0gYWRhcHRlci0+cG9ydFtwXS5waHk7CisJCQlwaHlfY2F1c2UgPSBwaHktPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIocGh5KTsKKwkJCWlmIChwaHlfY2F1c2UgJiBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlKQorCQkJICAgIHQxX2xpbmtfY2hhbmdlZChhZGFwdGVyLCBwKTsKKwkJfQorCQlicmVhazsKKwl9CisjZW5kaWYKKwljYXNlIENIQlRfQk9BUkRfQ0hUMjEwOgogCWNhc2UgQ0hCVF9CT0FSRF9OMjEwOgogCWNhc2UgQ0hCVF9CT0FSRF9OMTEwOgogCQlpZiAoY2F1c2UgJiBFTE1FUjBfR1BfQklUNikgeyAvKiBNYXJ2ZWxsIDg4eDIwMTAgaW50ZXJydXB0ICovCiAJCQlwaHkgPSBhZGFwdGVyLT5wb3J0WzBdLnBoeTsKIAkJCXBoeV9jYXVzZSA9IHBoeS0+b3BzLT5pbnRlcnJ1cHRfaGFuZGxlcihwaHkpOwogCQkJaWYgKHBoeV9jYXVzZSAmIGNwaHlfY2F1c2VfbGlua19jaGFuZ2UpCi0JCQkJbGlua19jaGFuZ2VkKGFkYXB0ZXIsIDApOworCQkJCXQxX2xpbmtfY2hhbmdlZChhZGFwdGVyLCAwKTsKIAkJfQogCQlicmVhazsKKwljYXNlIENIQlRfQk9BUkRfODAwMDoKKwljYXNlIENIQlRfQk9BUkRfQ0hUMTEwOgorICAgIAkJQ0hfREJHKGFkYXB0ZXIsIElOVFIsICJFeHRlcm5hbCBpbnRlcnJ1cHQgY2F1c2UgMHgleFxuIiwKKwkJICAgICAgIGNhdXNlKTsKKwkJaWYgKGNhdXNlICYgRUxNRVIwX0dQX0JJVDEpIHsgICAgICAgIC8qIFBNQzMzOTMgSU5UQiAqLworCQkJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbMF0ubWFjOworCisJCQltYWMtPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIobWFjKTsKKwkJfQorCQlpZiAoY2F1c2UgJiBFTE1FUjBfR1BfQklUNSkgeyAgICAgICAgLyogWFBBSyBNT0RfREVURUNUICovCisJCQl1MzIgbW9kX2RldGVjdDsKKworCQkJdDFfdHBpX3JlYWQoYWRhcHRlciwKKwkJCQkJQV9FTE1FUjBfR1BJX1NUQVQsICZtb2RfZGV0ZWN0KTsKKwkgICAgCQlDSF9NU0coYWRhcHRlciwgSU5GTywgTElOSywgIlhQQUsgJXNcbiIsCisJCQkgICAgICAgbW9kX2RldGVjdCA/ICJyZW1vdmVkIiA6ICJpbnNlcnRlZCIpOworICAgIAkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV9DT1VHQVIKKwljYXNlIENIQlRfQk9BUkRfQ09VR0FSOgorCQlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA9PSAxKSB7CisJCQlpZiAoY2F1c2UgJiBFTE1FUjBfR1BfQklUMSkgeyAgICAgICAgIC8qIFZpdGVzc2UgTUFDICovCisJCQkJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbMF0ubWFjOworCQkJCW1hYy0+b3BzLT5pbnRlcnJ1cHRfaGFuZGxlcihtYWMpOworCQkJfQorCQkJaWYgKGNhdXNlICYgRUxNRVIwX0dQX0JJVDUpIHsgICAgIC8qIFhQQUsgTU9EX0RFVEVDVCAqLworCQkJfQorCQl9IGVsc2UgeworCQkJaW50IGksIHBvcnRfYml0OworCisJCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJCQlwb3J0X2JpdCA9IGkgPyBpICsgMSA6IDA7CisJCQkJaWYgKCEoY2F1c2UgJiAoMSA8PCBwb3J0X2JpdCkpKSBjb250aW51ZTsKKworCQkJCXBoeSA9IGFkYXB0ZXItPnBvcnRbaV0ucGh5OworCQkJCXBoeV9jYXVzZSA9IHBoeS0+b3BzLT5pbnRlcnJ1cHRfaGFuZGxlcihwaHkpOworCQkJCWlmIChwaHlfY2F1c2UgJiBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlKQorCQkJCQl0MV9saW5rX2NoYW5nZWQoYWRhcHRlciwgaSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKIAl9CiAJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgY2F1c2UpOwogCXJldHVybiAwOwpAQCAtNDQ1LDExICs3MDcsMTEgQEAKIHZvaWQgdDFfaW50ZXJydXB0c19lbmFibGUoYWRhcHRlcl90ICphZGFwdGVyKQogewogCXVuc2lnbmVkIGludCBpOwotCXUzMiBwbF9pbnRyOwogCi0JYWRhcHRlci0+c2xvd19pbnRyX21hc2sgPSBGX1BMX0lOVFJfU0dFX0VSUjsKKwlhZGFwdGVyLT5zbG93X2ludHJfbWFzayA9IEZfUExfSU5UUl9TR0VfRVJSIHwgRl9QTF9JTlRSX1RQOwogCiAJdDFfc2dlX2ludHJfZW5hYmxlKGFkYXB0ZXItPnNnZSk7CisJdDFfdHBfaW50cl9lbmFibGUoYWRhcHRlci0+dHApOwogCWlmIChhZGFwdGVyLT5lc3BpKSB7CiAJCWFkYXB0ZXItPnNsb3dfaW50cl9tYXNrIHw9IEZfUExfSU5UUl9FU1BJOwogCQl0MV9lc3BpX2ludHJfZW5hYmxlKGFkYXB0ZXItPmVzcGkpOwpAQCAtNDYyLDE1ICs3MjQsMTcgQEAKIAl9CiAKIAkvKiBFbmFibGUgUENJWCAmIGV4dGVybmFsIGNoaXAgaW50ZXJydXB0cyBvbiBBU0lDIGJvYXJkcy4gKi8KLQlwbF9pbnRyID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwlpZiAodDFfaXNfYXNpYyhhZGFwdGVyKSkgeworCQl1MzIgcGxfaW50ciA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CiAKLQkvKiBQQ0ktWCBpbnRlcnJ1cHRzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBBX1BDSUNGR19JTlRSX0VOQUJMRSwKLQkJCSAgICAgICAweGZmZmZmZmZmKTsKKwkJLyogUENJLVggaW50ZXJydXB0cyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX0lOVFJfRU5BQkxFLAorCQkJCSAgICAgICAweGZmZmZmZmZmKTsKIAotCWFkYXB0ZXItPnNsb3dfaW50cl9tYXNrIHw9IEZfUExfSU5UUl9FWFQgfCBGX1BMX0lOVFJfUENJWDsKLQlwbF9pbnRyIHw9IEZfUExfSU5UUl9FWFQgfCBGX1BMX0lOVFJfUENJWDsKLQl3cml0ZWwocGxfaW50ciwgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwkJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfD0gRl9QTF9JTlRSX0VYVCB8IEZfUExfSU5UUl9QQ0lYOworCQlwbF9pbnRyIHw9IEZfUExfSU5UUl9FWFQgfCBGX1BMX0lOVFJfUENJWDsKKwkJd3JpdGVsKHBsX2ludHIsIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisJfQogfQogCiAvKiBEaXNhYmxlcyBhbGwgaW50ZXJydXB0cy4gKi8KQEAgLTQ3OSw2ICs3NDMsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJdDFfc2dlX2ludHJfZGlzYWJsZShhZGFwdGVyLT5zZ2UpOworCXQxX3RwX2ludHJfZGlzYWJsZShhZGFwdGVyLT50cCk7CiAJaWYgKGFkYXB0ZXItPmVzcGkpCiAJCXQxX2VzcGlfaW50cl9kaXNhYmxlKGFkYXB0ZXItPmVzcGkpOwogCkBAIC00ODksNyArNzU0LDggQEAKIAl9CiAKIAkvKiBEaXNhYmxlIFBDSVggJiBleHRlcm5hbCBjaGlwIGludGVycnVwdHMuICovCi0Jd3JpdGVsKDAsIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisJaWYgKHQxX2lzX2FzaWMoYWRhcHRlcikpCisJICAgIAl3cml0ZWwoMCwgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKIAogCS8qIFBDSS1YIGludGVycnVwdHMgKi8KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX0lOVFJfRU5BQkxFLCAwKTsKQEAgLTUwMSwxMCArNzY3LDkgQEAKIHZvaWQgdDFfaW50ZXJydXB0c19jbGVhcihhZGFwdGVyX3QqIGFkYXB0ZXIpCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JdTMyIHBsX2ludHI7Ci0KIAogCXQxX3NnZV9pbnRyX2NsZWFyKGFkYXB0ZXItPnNnZSk7CisJdDFfdHBfaW50cl9jbGVhcihhZGFwdGVyLT50cCk7CiAJaWYgKGFkYXB0ZXItPmVzcGkpCiAJCXQxX2VzcGlfaW50cl9jbGVhcihhZGFwdGVyLT5lc3BpKTsKIApAQCAtNTE1LDEwICs3ODAsMTIgQEAKIAl9CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgZXh0ZXJuYWwgZGV2aWNlcy4gKi8KLSAgICAJcGxfaW50ciA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKKwlpZiAodDFfaXNfYXNpYyhhZGFwdGVyKSkgeworCQl1MzIgcGxfaW50ciA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKIAotCXdyaXRlbChwbF9pbnRyIHwgRl9QTF9JTlRSX0VYVCB8IEZfUExfSU5UUl9QQ0lYLAotCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisJCXdyaXRlbChwbF9pbnRyIHwgRl9QTF9JTlRSX0VYVCB8IEZfUExfSU5UUl9QQ0lYLAorCQkgICAgICAgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOworCX0KIAogCS8qIFBDSS1YIGludGVycnVwdHMgKi8KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX0lOVFJfQ0FVU0UsIDB4ZmZmZmZmZmYpOwpAQCAtNTI3LDcgKzc5NCw3IEBACiAvKgogICogU2xvdyBwYXRoIGludGVycnVwdCBoYW5kbGVyIGZvciBBU0lDcy4KICAqLwotaW50IHQxX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3N0YXRpYyBpbnQgYXNpY19zbG93X2ludHIoYWRhcHRlcl90ICphZGFwdGVyKQogewogCXUzMiBjYXVzZSA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKIApAQCAtNTM2LDg5ICs4MDMsNTQgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKGNhdXNlICYgRl9QTF9JTlRSX1NHRV9FUlIpCiAJCXQxX3NnZV9pbnRyX2Vycm9yX2hhbmRsZXIoYWRhcHRlci0+c2dlKTsKKwlpZiAoY2F1c2UgJiBGX1BMX0lOVFJfVFApCisJCXQxX3RwX2ludHJfaGFuZGxlcihhZGFwdGVyLT50cCk7CiAJaWYgKGNhdXNlICYgRl9QTF9JTlRSX0VTUEkpCiAJCXQxX2VzcGlfaW50cl9oYW5kbGVyKGFkYXB0ZXItPmVzcGkpOwogCWlmIChjYXVzZSAmIEZfUExfSU5UUl9QQ0lYKQogCQl0MV9wY2lfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOwogCWlmIChjYXVzZSAmIEZfUExfSU5UUl9FWFQpCi0JCXQxX2VsbWVyMF9leHRfaW50cihhZGFwdGVyKTsKKwkJdDFfZWxtZXIwX2V4dF9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CiAKIAkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBqdXN0IHByb2Nlc3NlZC4gKi8KIAl3cml0ZWwoY2F1c2UsIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKLQkodm9pZClyZWFkbChhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7IC8qIGZsdXNoIHdyaXRlcyAqLworCXJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsgLyogZmx1c2ggd3JpdGVzICovCiAJcmV0dXJuIDE7CiB9CiAKLS8qIFBhdXNlIGRlYWRsb2NrIGF2b2lkYW5jZSBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIERST1BfTVNFQyAxNgotI2RlZmluZSBEUk9QX1BLVFNfQ05UICAxCi0KLXN0YXRpYyB2b2lkIHNldF9jc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgY3N1bV9iaXQsIGludCBlbmFibGUpCitpbnQgdDFfc2xvd19pbnRyX2hhbmRsZXIoYWRhcHRlcl90ICphZGFwdGVyKQogewotCXUzMiB2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9UUF9HTE9CQUxfQ09ORklHKTsKLQotCWlmIChlbmFibGUpCi0JCXZhbCB8PSBjc3VtX2JpdDsKLQllbHNlCi0JCXZhbCAmPSB+Y3N1bV9iaXQ7Ci0Jd3JpdGVsKHZhbCwgYWRhcHRlci0+cmVncyArIEFfVFBfR0xPQkFMX0NPTkZJRyk7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKKwlpZiAoIXQxX2lzX2FzaWMoYWRhcHRlcikpCisJCXJldHVybiBmcGdhX3Nsb3dfaW50cihhZGFwdGVyKTsKKyNlbmRpZgorCXJldHVybiBhc2ljX3Nsb3dfaW50cihhZGFwdGVyKTsKIH0KIAotdm9pZCB0MV90cF9zZXRfaXBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBlbmFibGUpCisvKiBQb3dlciBzZXF1ZW5jaW5nIGlzIGEgd29yay1hcm91bmQgZm9yIEludGVsJ3MgWFBBS3MuICovCitzdGF0aWMgdm9pZCBwb3dlcl9zZXF1ZW5jZV94cGFrKGFkYXB0ZXJfdCogYWRhcHRlcikKIHsKLQlzZXRfY3N1bV9vZmZsb2FkKGFkYXB0ZXIsIEZfSVBfQ1NVTSwgZW5hYmxlKTsKLX0KKyAgICAJdTMyIG1vZF9kZXRlY3Q7CisgICAgCXUzMiBncG87CiAKLXZvaWQgdDFfdHBfc2V0X3VkcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGVuYWJsZSkKLXsKLQlzZXRfY3N1bV9vZmZsb2FkKGFkYXB0ZXIsIEZfVURQX0NTVU0sIGVuYWJsZSk7Ci19Ci0KLXZvaWQgdDFfdHBfc2V0X3RjcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGVuYWJsZSkKLXsKLQlzZXRfY3N1bV9vZmZsb2FkKGFkYXB0ZXIsIEZfVENQX0NTVU0sIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHQxX3RwX3Jlc2V0KGFkYXB0ZXJfdCAqYWRhcHRlciwgdW5zaWduZWQgaW50IHRwX2NsaykKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gRl9UUF9JTl9DU1BJX0NQTCB8IEZfVFBfSU5fQ1NQSV9DSEVDS19JUF9DU1VNIHwKLQkgICAgICBGX1RQX0lOX0NTUElfQ0hFQ0tfVENQX0NTVU0gfCBGX1RQX0lOX0VTUElfRVRIRVJORVQ7Ci0JdmFsIHw9IEZfVFBfSU5fRVNQSV9DSEVDS19JUF9DU1VNIHwKLQkgICAgICAgRl9UUF9JTl9FU1BJX0NIRUNLX1RDUF9DU1VNOwotCXdyaXRlbCh2YWwsIGFkYXB0ZXItPnJlZ3MgKyBBX1RQX0lOX0NPTkZJRyk7Ci0Jd3JpdGVsKEZfVFBfT1VUX0NTUElfQ1BMIHwKLQkgICAgICAgRl9UUF9PVVRfRVNQSV9FVEhFUk5FVCB8Ci0JICAgICAgIEZfVFBfT1VUX0VTUElfR0VORVJBVEVfSVBfQ1NVTSB8Ci0JICAgICAgIEZfVFBfT1VUX0VTUElfR0VORVJBVEVfVENQX0NTVU0sCi0JICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX1RQX09VVF9DT05GSUcpOwotCi0JdmFsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfVFBfR0xPQkFMX0NPTkZJRyk7Ci0JdmFsICY9IH4oRl9JUF9DU1VNIHwgRl9VRFBfQ1NVTSB8IEZfVENQX0NTVU0pOwotCXdyaXRlbCh2YWwsIGFkYXB0ZXItPnJlZ3MgKyBBX1RQX0dMT0JBTF9DT05GSUcpOwotCi0JLyoKLQkgKiBFbmFibGUgcGF1c2UgZnJhbWUgZGVhZGxvY2sgcHJldmVudGlvbi4KLQkgKi8KLQlpZiAoaXNfVDIoYWRhcHRlcikpIHsKLQkJdTMyIGRyb3BfdGlja3MgPSBEUk9QX01TRUMgKiAodHBfY2xrIC8gMTAwMCk7Ci0KLQkJd3JpdGVsKEZfRU5BQkxFX1RYX0RST1AgfCBGX0VOQUJMRV9UWF9FUlJPUiB8Ci0JCSAgICAgICBWX0RST1BfVElDS1NfQ05UKGRyb3BfdGlja3MpIHwKLQkJICAgICAgIFZfTlVNX1BLVFNfRFJPUFBFRChEUk9QX1BLVFNfQ05UKSwKLQkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX1RQX1RYX0RST1BfQ09ORklHKTsKKyAgICAJLyogQ2hlY2sgZm9yIFhQQUsgKi8KKyAgICAJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BJX1NUQVQsICZtb2RfZGV0ZWN0KTsKKwlpZiAoIShFTE1FUjBfR1BfQklUNSAmIG1vZF9kZXRlY3QpKSB7CisJCS8qIFhQQUsgaXMgcHJlc2VudCAqLworCQl0MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZncG8pOworCQlncG8gfD0gRUxNRVIwX0dQX0JJVDE4OworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCBncG8pOwogCX0KLQotCXdyaXRlbChGX1RQX1JFU0VULCBhZGFwdGVyLT5yZWdzICsgQV9UUF9SRVNFVCk7CiB9CiAKIGludCBfX2RldmluaXQgdDFfZ2V0X2JvYXJkX3JldihhZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpiaSwKIAkJCSAgICAgICBzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgKnApCiB7CiAJcC0+Y2hpcF92ZXJzaW9uID0gYmktPmNoaXBfdGVybTsKKwlwLT5pc19hc2ljID0gKHAtPmNoaXBfdmVyc2lvbiAhPSBDSEJUX1RFUk1fRlBHQSk7CiAJaWYgKHAtPmNoaXBfdmVyc2lvbiA9PSBDSEJUX1RFUk1fVDEgfHwKLQkgICAgcC0+Y2hpcF92ZXJzaW9uID09IENIQlRfVEVSTV9UMikgeworCSAgICBwLT5jaGlwX3ZlcnNpb24gPT0gQ0hCVF9URVJNX1QyIHx8CisJICAgIHAtPmNoaXBfdmVyc2lvbiA9PSBDSEJUX1RFUk1fRlBHQSkgewogCQl1MzIgdmFsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfVFBfUENfQ09ORklHKTsKIAogCQl2YWwgPSBHX1RQX1BDX1JFVih2YWwpOwpAQCAtNjQwLDExICs4NzIsMzggQEAKIHN0YXRpYyBpbnQgYm9hcmRfaW5pdChhZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpiaSkKIHsKIAlzd2l0Y2ggKGJpLT5ib2FyZCkgeworCWNhc2UgQ0hCVF9CT0FSRF84MDAwOgogCWNhc2UgQ0hCVF9CT0FSRF9OMTEwOgogCWNhc2UgQ0hCVF9CT0FSRF9OMjEwOgotCQl3cml0ZWwoVl9UUElQQVIoMHhmKSwgYWRhcHRlci0+cmVncyArIEFfVFBJX1BBUik7CisJY2FzZSBDSEJUX0JPQVJEX0NIVDIxMDoKKwljYXNlIENIQlRfQk9BUkRfQ09VR0FSOgorICAgIAkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOwogICAgIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHg4MDApOwogCQlicmVhazsKKwljYXNlIENIQlRfQk9BUkRfQ0hUMTEwOgorICAgIAkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOworICAgIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHgxODAwKTsKKworICAgIAkJLyogVEJEIFhYWCBNaWdodCBub3QgbmVlZC4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCisgICAgIAkJICogICAgICAgICBkZXNjcmliZWQgaW4gdGhlIEludGVsIFNSIFhQQUsgZXJyYXRhLgorICAgICAJCSAqLworICAgIAkJcG93ZXJfc2VxdWVuY2VfeHBhayhhZGFwdGVyKTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKKyAgICBjYXNlIENIQlRfQk9BUkRfQ0hUMjA0RToKKwkJICAgICAgICAvKiBhZGQgY29uZmlnIHNwYWNlIHdyaXRlIGhlcmUgKi8KKwljYXNlIENIQlRfQk9BUkRfQ0hUMjA0OgorCWNhc2UgQ0hCVF9CT0FSRF9DSFQyMDRWOgorCWNhc2UgQ0hCVF9CT0FSRF9DSE4yMDQ6CisgICAgICAgICAgICAgICAgdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOworICAgICAgICAgICAgICAgIHQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIDB4ODA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIENIQlRfQk9BUkRfQ0hUMTAxOgorCWNhc2UgQ0hCVF9CT0FSRF83NTAwOgorICAgIAkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOworICAgIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHgxODA0KTsKKwkJYnJlYWs7CisjZW5kaWYKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC02NjYsMTEgKzkyNSwxNiBAQAogCQkgICAgICAgYWRhcHRlci0+cmVncyArIEFfTUM1X0NPTkZJRyk7CiAJfQogCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCisJaWYgKGFkYXB0ZXItPmNzcGkgJiYgdDFfY3NwaV9pbml0KGFkYXB0ZXItPmNzcGkpKQorCQlnb3RvIG91dF9lcnI7CisjZW5kaWYKIAlpZiAoYWRhcHRlci0+ZXNwaSAmJiB0MV9lc3BpX2luaXQoYWRhcHRlci0+ZXNwaSwgYmktPmNoaXBfbWFjLAogCQkJCQkgIGJpLT5lc3BpX25wb3J0cykpCiAJCWdvdG8gb3V0X2VycjsKIAotCXQxX3RwX3Jlc2V0KGFkYXB0ZXIsIGJpLT5jbG9ja19jb3JlKTsKKwlpZiAodDFfdHBfcmVzZXQoYWRhcHRlci0+dHAsICZhZGFwdGVyLT5wYXJhbXMudHAsIGJpLT5jbG9ja19jb3JlKSkKKwkJZ290byBvdXRfZXJyOwogCiAJZXJyID0gdDFfc2dlX2NvbmZpZ3VyZShhZGFwdGVyLT5zZ2UsICZhZGFwdGVyLT5wYXJhbXMuc2dlKTsKIAlpZiAoZXJyKQpAQCAtNzE0LDggKzk3OCwxNCBAQAogCiAJaWYgKGFkYXB0ZXItPnNnZSkKIAkJdDFfc2dlX2Rlc3Ryb3koYWRhcHRlci0+c2dlKTsKKwlpZiAoYWRhcHRlci0+dHApCisJCXQxX3RwX2Rlc3Ryb3koYWRhcHRlci0+dHApOwogCWlmIChhZGFwdGVyLT5lc3BpKQogCQl0MV9lc3BpX2Rlc3Ryb3koYWRhcHRlci0+ZXNwaSk7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCisgICAgICAgIGlmIChhZGFwdGVyLT5jc3BpKQorCQl0MV9jc3BpX2Rlc3Ryb3koYWRhcHRlci0+Y3NwaSk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfbGlua19jb25maWcoc3RydWN0IGxpbmtfY29uZmlnICpsYywKQEAgLTczNSw2ICsxMDA1LDEzIEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCisJaWYgKGJpLT5jbG9ja19jc3BpICYmICEoYWRhcHRlci0+Y3NwaSA9IHQxX2NzcGlfY3JlYXRlKGFkYXB0ZXIpKSkgeworCQlDSF9FUlIoIiVzOiBDU1BJIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5hbWUpOworCQlnb3RvIGVycm9yOworICAgICAgICB9CisjZW5kaWYKIAogLyoKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBob2xkIHRoZSBTVyBzdGF0ZSBvZgpAQCAtNzYyLDYgKzEwMzksMTMgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlhZGFwdGVyLT50cCA9IHQxX3RwX2NyZWF0ZShhZGFwdGVyLCAmYWRhcHRlci0+cGFyYW1zLnRwKTsKKwlpZiAoIWFkYXB0ZXItPnRwKSB7CisJCUNIX0VSUigiJXM6IFRQIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5hbWUpOworCQlnb3RvIGVycm9yOworCX0KKwogCWJvYXJkX2luaXQoYWRhcHRlciwgYmkpOwogCWJpLT5tZGlvX29wcy0+aW5pdChhZGFwdGVyLCBiaSk7CiAJaWYgKGJpLT5ncGh5LT5yZXNldCkKQEAgLTc5Myw3ICsxMDc3LDkgQEAKIAkJICogR2V0IHRoZSBwb3J0J3MgTUFDIGFkZHJlc3NlcyBlaXRoZXIgZnJvbSB0aGUgRUVQUk9NIGlmIG9uZQogCQkgKiBleGlzdHMgb3IgdGhlIG9uZSBoYXJkY29kZWQgaW4gdGhlIE1BQy4KIAkJICovCi0JCWlmICh2cGRfbWFjYWRkcmVzc19nZXQoYWRhcHRlciwgaSwgaHdfYWRkcikpIHsKKwkJaWYgKCF0MV9pc19hc2ljKGFkYXB0ZXIpIHx8IGJpLT5jaGlwX21hYyA9PSBDSEJUX01BQ19EVU1NWSkKKwkJCW1hYy0+b3BzLT5tYWNhZGRyZXNzX2dldChtYWMsIGh3X2FkZHIpOworCQllbHNlIGlmICh2cGRfbWFjYWRkcmVzc19nZXQoYWRhcHRlciwgaSwgaHdfYWRkcikpIHsKIAkJCUNIX0VSUigiJXM6IGNvdWxkIG5vdCByZWFkIE1BQyBhZGRyZXNzIGZyb20gVlBEIFJPTVxuIiwKIAkJCSAgICAgICBhZGFwdGVyLT5wb3J0W2ldLmRldi0+bmFtZSk7CiAJCQlnb3RvIGVycm9yOwpAQCAtODA2LDcgKzEwOTIsNyBAQAogCXQxX2ludGVycnVwdHNfY2xlYXIoYWRhcHRlcik7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcjoKK2Vycm9yOgogCXQxX2ZyZWVfc3dfbW9kdWxlcyhhZGFwdGVyKTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1bmkxeDEwZ2V4cF9yZWdzLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1bmkxeDEwZ2V4cF9yZWdzLmgKaW5kZXggODE4MTZjMi4uMjY5ZDA5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9zdW5pMXgxMGdleHBfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3VuaTF4MTBnZXhwX3JlZ3MuaApAQCAtMzIsNiArMzIsMzAgQEAKICNpZm5kZWYgX0NYR0JfU1VOSTF4MTBHRVhQX1JFR1NfSF8KICNkZWZpbmUgX0NYR0JfU1VOSTF4MTBHRVhQX1JFR1NfSF8KIAorLyoKKyoqIFNwYWNlIGFsbG9jYXRlZCBmb3IgZWFjaCBFeGFjdCBNYXRjaCBGaWx0ZXIKKyoqICAgICBUaGVyZSBhcmUgOCBmaWx0ZXIgY29uZmlndXJhdGlvbnMKKyovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfU0laRU9GX01BQ19GSUxURVIgMHgwMDAzCisKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9NQUNfRklMVEVSX09GRlNFVChmaWx0ZXJJZCkgICAgICAgKCAoZmlsdGVySWQpICogU1VOSTF4MTBHRVhQX1JFR19TSVpFT0ZfTUFDX0ZJTFRFUiApCisKKy8qCisqKiBTcGFjZSBhbGxvY2F0ZWQgZm9yIFZMQU4tSWQgRmlsdGVyCisqKiAgICAgIFRoZXJlIGFyZSA4IGZpbHRlciBjb25maWd1cmF0aW9ucworKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19TSVpFT0ZfTUFDX1ZJRF9GSUxURVIgMHgwMDAxCisKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9NQUNfVklEX0ZJTFRFUl9PRkZTRVQoZmlsdGVySWQpICAgKCAoZmlsdGVySWQpICogU1VOSTF4MTBHRVhQX1JFR19TSVpFT0ZfTUFDX1ZJRF9GSUxURVIgKQorCisvKgorKiogU3BhY2UgYWxsb2NhdGVkIGZvciBlYWNoIE1TVEFUIENvdW50ZXIKKyovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfU0laRU9GX01TVEFUX0NPVU5UIDB4MDAwNAorCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfTVNUQVRfQ09VTlRfT0ZGU0VUKGNvdW50SWQpICAgICAgICggKGNvdW50SWQpICogU1VOSTF4MTBHRVhQX1JFR19TSVpFT0ZfTVNUQVRfQ09VTlQgKQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiogUy9VTkktMXgxMEdFLVhQIFJFR0lTVEVSIEFERFJFU1MgTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM5LDMzICs2MywxMjUgQEAKIC8qIHRvIHRoZSBTL1VOSS0xeDEwR0UtWFAgRGF0YSBTaGVldCBmb3IgdGhlIHNpZ25pZmljYXRpb24gb2YgZWFjaCBiaXQgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19JREVOVElGSUNBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19QUk9EVUNUX1JFVklTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19DT05GSUdfQU5EX1JFU0VUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19MT09QQkFDS19NSVNDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19ERVZJQ0VfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19HTE9CQUxfUEVSRk9STUFOQ0VfTU9OSVRPUl9VUERBVEUgICAgICAgICAgICAgICAweDAwMDUKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01ESU9fQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01ESU9fSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01ESU9fSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01NRF9QSFlfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01NRF9DT05UUk9MX0FERFJFU1NfREFUQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01ESU9fUkVBRF9TVEFUVVNfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQgorCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfT0FNX0lOVEZfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBDCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTUFTVEVSX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBECiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfR0xPQkFMX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGCisKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19YVEVGX01JU0NfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19YUkZfTUlTQ19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTEKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0NPTkZJR18xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0NPTkZJR18yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgIDB4MDEwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0lOVEVSUlVQVF9WSVNJQkxFICAgICAgICAgICAgICAgICAgIDB4MDEwMwogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X1RFU1RfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNworCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19DT05GSUdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19DT05GSUdfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQxCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19DT05GSUdfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQyCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQzCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19NQVhfRlJBTUVfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQ1CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19TQV8xNV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQ2CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19TQV8zMV8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQ3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19TQV80N18zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQ4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19SRUNFSVZFX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgMHgyMDQ5CisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfQUREUl9MT1coZmlsdGVySWQpICgweDIwNEEgKyBtU1VOSTF4MTBHRVhQX01BQ19GSUxURVJfT0ZGU0VUKGZpbHRlcklkKSkKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9SRUdfUlhYR19FWEFDVF9NQVRDSF9BRERSX01JRChmaWx0ZXJJZCkgKDB4MjA0QiArIG1TVU5JMXgxMEdFWFBfTUFDX0ZJTFRFUl9PRkZTRVQoZmlsdGVySWQpKQorI2RlZmluZSBtU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfSElHSChmaWx0ZXJJZCkoMHgyMDRDICsgbVNVTkkxeDEwR0VYUF9NQUNfRklMVEVSX09GRlNFVChmaWx0ZXJJZCkpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfVklEKGZpbHRlcklkKSAgICAgICgweDIwNjIgKyBtU1VOSTF4MTBHRVhQX01BQ19WSURfRklMVEVSX09GRlNFVChmaWx0ZXJJZCkKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNEEKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMF9NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNEIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMF9ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNEMKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMV9MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNEQKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMV9NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNEUKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMV9ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNEYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMl9MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMl9NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNTEKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMl9ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNTIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfM19MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNTMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfM19NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNTQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfM19ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNTUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNF9MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNTYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNF9NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNTcKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNF9ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNTgKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNV9MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNTkKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNV9NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNUEKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNV9ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNUIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNl9MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNUMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNl9NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNUQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfNl9ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNUUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfN19MT1cgICAgICAgICAgICAgICAgICAgICAweDIwNUYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfN19NSUQgICAgICAgICAgICAgICAgICAgICAweDIwNjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfN19ISUdIICAgICAgICAgICAgICAgICAgICAweDIwNjEKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF8wICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF80ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF81ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjcKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF82ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjgKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX1ZJRF83ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNjkKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNkEKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX01JRExPVyAgICAgICAgICAgICAgICAgICAgICAweDIwNkIKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX01JREhJR0ggICAgICAgICAgICAgICAgICAgICAweDIwNkMKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAweDIwNkQKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0FERFJFU1NfRklMVEVSX0NPTlRST0xfMCAgICAgICAgICAgICAgICAgICAweDIwNkUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0FERFJFU1NfRklMVEVSX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDIwNkYKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0FERFJFU1NfRklMVEVSX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgICAweDIwNzAKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9QQVRURVJOX0dFTl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4MQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl84QlRCX0VSUl9DT1VOVF9MQU5FXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4NAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl84QlRCX0VSUl9DT1VOVF9MQU5FXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4NQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl84QlRCX0VSUl9DT1VOVF9MQU5FXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4NgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl84QlRCX0VSUl9DT1VOVF9MQU5FXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4NwogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9JTlRFUlJVUFRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4OAogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4OQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9FUlJfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4QQogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9ESUFHX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4QgogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9ESUFHX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4QworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9DT0RFX0VSUl9USFJFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA5MgorCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEMwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSXzFfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEMxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSXzJfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEMyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fQ09ORklHXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEMzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSEVDX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEM0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSEVDX0VSUl9USFJFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEM1CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEM3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEM4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMEM5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSEVDX0VSUl9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMENBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklGT19PVkVSRkxPV19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMENCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSX01JU01BVENIX0NPVU5UX0xTQiAgICAgICAgICAgICAgICAgMHgyMENDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSX01JU01BVENIX0NPVU5UX01TQiAgICAgICAgICAgICAgICAgMHgyMENECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSXzFfTUlTTUFUQ0hfQ09VTlRfTFNCICAgICAgICAgICAgICAgMHgyMENFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSXzFfTUlTTUFUQ0hfQ09VTlRfTVNCICAgICAgICAgICAgICAgMHgyMENGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSXzJfTUlTTUFUQ0hfQ09VTlRfTFNCICAgICAgICAgICAgICAgMHgyMEQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSXzJfTUlTTUFUQ0hfQ09VTlRfTVNCICAgICAgICAgICAgICAgMHgyMEQxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fT0FNX0VYVFJBQ1RfQ09VTlRfTFNCICAgICAgICAgICAgICAgICAgICAgMHgyMEQyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fT0FNX0VYVFJBQ1RfQ09VTlRfTVNCICAgICAgICAgICAgICAgICAgICAgMHgyMEQzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fTUlOSV9QQUNLRVRfQ09VTlRfTFNCICAgICAgICAgICAgICAgICAgICAgMHgyMEQ0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fTUlOSV9QQUNLRVRfQ09VTlRfTVNCICAgICAgICAgICAgICAgICAgICAgMHgyMEQ1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSX01JU01BVENIX1RIUkVTX0xTQiAgICAgICAgICAgICAgICAgMHgyMEQ2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fRklMVEVSX01JU01BVENIX1RIUkVTX01TQiAgICAgICAgICAgICAgICAgMHgyMEQ3CisKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSX1JPTExPVkVSXzAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSX1JPTExPVkVSXzEgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDIKQEAgLTc1LDUwICsxOTEsMzIxIEBACiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfSU5URVJSVVBUX01BU0tfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTA2CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfSU5URVJSVVBUX01BU0tfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTA3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfSU5URVJSVVBUX01BU0tfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl9XUklURV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgMHgyMTA5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl9XUklURV9EQVRBX0xPVyAgICAgICAgICAgICAgICAgICAgMHgyMTBBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl9XUklURV9EQVRBX01JRERMRSAgICAgICAgICAgICAgICAgMHgyMTBCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl9XUklURV9EQVRBX0hJR0ggICAgICAgICAgICAgICAgICAgMHgyMTBDCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfTE9XKGNvdW50SWQpICAgKDB4MjExMCArIG1TVU5JMXgxMEdFWFBfTVNUQVRfQ09VTlRfT0ZGU0VUKGNvdW50SWQpKQorI2RlZmluZSBtU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSX01JRChjb3VudElkKSAgICgweDIxMTEgKyBtU1VOSTF4MTBHRVhQX01TVEFUX0NPVU5UX09GRlNFVChjb3VudElkKSkKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl9ISUdIKGNvdW50SWQpICAoMHgyMTEyICsgbVNVTkkxeDEwR0VYUF9NU1RBVF9DT1VOVF9PRkZTRVQoY291bnRJZCkpCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8wX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8wX01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTExCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8wX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTEyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8wX1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTEzCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTE0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xX01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTE1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTE2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xX1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTE3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTE4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yX01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTE5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTFBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yX1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTFCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTFDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zX01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTFECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTFFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zX1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTFGCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80X0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTIwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80X01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTIxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80X0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTIyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80X1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTIzCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81X0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTI0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81X01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTI1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81X0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTI2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81X1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTI3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl82X0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTI4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl82X01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTI5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl82X0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTJBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl82X1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTJCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl83X0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTJDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl83X01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTJECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl83X0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTJFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl83X1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTJGCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl84X0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTMwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl84X01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTMxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl84X0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTMyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl84X1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTMzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl85X0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTM0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl85X01JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTM1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl85X0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTM2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl85X1JFU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTM3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTM4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTM5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTNBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTNCCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTNDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTNECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTNFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTNGCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQzCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xM19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQ0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xM19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQ1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xM19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQ2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xM19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQ3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQ4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTQ5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTRBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTRCCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTRDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTRECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTRFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTRGCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTUwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTUxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTUyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xNl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTUzCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xN19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTU0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xN19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTU1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xN19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTU2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xN19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTU3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTU4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTU5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTVBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTVCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTVDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTVECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTVFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xOV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTVGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTYwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTYxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTYyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTYzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTY0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTY1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTY2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTY3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTY4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTY5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTZBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yMl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTZCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yM19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTZDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yM19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTZECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yM19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTZFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yM19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTcwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTcxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTcyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTczCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTc0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTc1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTc2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTc3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTc4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTc5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTdhCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yNl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTdiCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yN19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTdjCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yN19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTdkCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yN19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTdlCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yN19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTdmCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTgwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTgxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTgyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTgzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTg0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTg1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTg2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8yOV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTg3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTg4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTg5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMThBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMThCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMThDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMThECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMThFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMThGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTkwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTkxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTkyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zMl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTkzCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zM19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTk0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zM19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTk1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zM19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTk2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zM19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTk3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTk4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTk5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTlBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTlCCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTlDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTlECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTlFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTlGCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUExCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUEyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zNl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUEzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zN19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUE0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zN19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUE1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zN19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUE2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zN19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUE3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUE4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUE5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUFBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUFCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUFDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUFECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUFFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zOV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUFGCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUIwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUIxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUIyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUIzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUI0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUI1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUI2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUI3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Ml9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUI4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Ml9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUI5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Ml9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUJBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Ml9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUJCCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80M19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUJDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80M19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUJECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80M19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUJFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80M19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUJGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUMwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUMxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUMyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUMzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUM0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUM1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUM2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80NV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUM3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Nl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUM4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Nl9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUM5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Nl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUNBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80Nl9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUNCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80N19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUNDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80N19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUNECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80N19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUNFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80N19SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUNGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQ0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQ1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQ2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80OV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQ3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQ4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MF9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUQ5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMURBCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MF9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMURCCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMURDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MV9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMURECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMURFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81MV9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMURGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81Ml9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUUwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81Ml9NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUUxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81Ml9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUUyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81Ml9SRVNWRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUUzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81M19MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUU0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81M19NSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUU1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81M19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMUU2CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9DTlRSX01BQ19FVEhFUk5FVF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfR0xPQkFMX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjIwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfQ0hBTk5FTF9QUk9WSVNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjIwMQogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfRklGT19PVkVSRkxPV19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjIwOQogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfRklGT19PVkVSRkxPV19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgIDB4MjIwQQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfSU5ESVJfQ0hBTk5FTF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDB4MjIwRAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfSU5ESVJfTE9HSUNBTF9GSUZPX0xPV19MSU1JVF9QUk9WSVNJT04gICAgIDB4MjIwRQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfSU5ESVJfTE9HSUNBTF9GSUZPX0hJR0hfTElNSVQgICAgICAgICAgICAgIDB4MjIwRgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfSU5ESVJfRlVMTF9BTE1PU1RfRlVMTF9TVEFUVVNfTElNSVQgICAgICAgIDB4MjIxMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfSU5ESVJfRU1QVFlfQUxNT1NUX0VNUFRZX1NUQVRVU19MSU1JVCAgICAgIDB4MjIxMQorCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUEw0TU9TX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMjQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUEw0TU9TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMjQxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUEw0TU9TX0ZBSVJORVNTX01BU0tJTkcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMjQyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUEw0TU9TX01BWEJVUlNUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMjQzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUEw0TU9TX01BWEJVUlNUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMjQ0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfUEw0TU9TX1RSQU5TRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMjQ1CisKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19QTDRPRFBfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyODAKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19QTDRPRFBfSU5URVJSVVBUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyODIKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19QTDRPRFBfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyODMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19QTDRPRFBfQ09ORklHX01BWF9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyODQKKwogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMAogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMQogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX0xJTUlUUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0NBTEVOREFSX1JFUEVUSVRJT05TICAgICAgICAgICAgICAgICAgICAgIDB4MjMwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwNQorCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19DT05GSUdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19DT05GSUdfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQxCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19DT05GSUdfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQyCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQzCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQ0CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19NQVhfRlJBTUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQ1CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19NSU5fRlJBTUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQ2CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19TQV8xNV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQ3CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19TQV8zMV8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQ4CiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19TQV80N18zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQ5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19QQVVTRV9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDRECisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19QQVVTRV9USU1FUl9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgICAgMHgzMDRFCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19GSUxURVJfRVJST1JfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgMHgzMDUxCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19QQVVTRV9RVUFOVFVNX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgMHgzMDUyCisKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19YVEVGX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwODAKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19YVEVGX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwODQKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19YVEVGX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwODUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19YVEVGX1ZJU0lCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwODYKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX09BTV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX01JTklfUkFURV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDMQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX01JTklfR0FQX0ZJRk9fQ09ORklHICAgICAgICAgICAgICAgICAgICAgIDB4MzBDMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1AxUDJfU1RBVElDX1ZBTFVFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDMworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1AzUDRfU1RBVElDX1ZBTFVFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1A1UDZfU1RBVElDX1ZBTFVFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDNQogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDNgogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDNworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0lOU0VSVF9DT1VOVF9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0lOU0VSVF9DT1VOVF9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDOQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX09BTV9NSU5JX0NPVU5UX0xTQiAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDQQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX09BTV9NSU5JX0NPVU5UX01TQiAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDQgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1AxUDJfTUlOSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDQworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1AzUDRfTUlOSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDRAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1A1UDZfTUlOSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDRQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0NPU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDRgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0VNUFRZX0ZJRk9fSU5TX09QX0NOVF9MU0IgICAgICAgICAgICAgICAgIDB4MzBEMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0VNUFRZX0ZJRk9fSU5TX09QX0NOVF9NU0IgICAgICAgICAgICAgICAgIDB4MzBEMQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1NUQVRJQ19WQUxVRV9NSU5JX0NPVU5UX0xTQiAgICAgICAgICAgICAgIDB4MzBEMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX1NUQVRJQ19WQUxVRV9NSU5JX0NPVU5UX01TQiAgICAgICAgICAgICAgIDB4MzBEMworCisKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0dMT0JBTF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMyMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0VSQ1VfR0xPQkFMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDMyMDEKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0lORElSX0NIQU5ORUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAweDMyMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0lORElSX0ZJRk9fTE9XX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAweDMyMDMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0lORElSX0ZJRk9fSElHSF9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAweDMyMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0lORElSX0ZVTExfQUxNT1NUX0ZVTExfU1RBVFVTX0FORF9MSU1JVCAgICAweDMyMDUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0lORElSX0VNUFRZX0FMTU9TVF9FTVBUWV9TVEFUVVNfQU5EX0xJTUlUICAweDMyMDYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0lORElSX0ZJRk9fQ1VUX1RIUk9VR0hfVEhSRVNIT0xEICAgICAgICAgICAweDMyMDcKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0ZJRk9fT1ZFUkZMT1dfRVJST1JfRU5BQkxFICAgICAgICAgICAgICAgICAweDMyMEMKICNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0ZJRk9fT1ZFUkZMT1dfRVJST1JfSU5ESUNBVElPTiAgICAgICAgICAgICAweDMyMEQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0NIQU5ORUxfUFJPVklTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDMyMTAKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI4MAogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI4MgogI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI4MwogCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9SRUdfTUFYX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNDgwCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgLS0gRW5kIHJlZ2lzdGVyIG9mZnNldCBkZWZpbml0aW9ucyAtLSAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNyw2ICs1MTQsODEgQEAKIC8qKiBTVU5JLTF4MTBHRS1YUCBSRUdJU1RFUiBCSVQgTUFTS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU18xICAgMHgwMDAwMQorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfMiAgIDB4MDAwMDMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzMgICAweDAwMDA3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU180ICAgMHgwMDAwZgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfNSAgIDB4MDAwMWYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzYgICAweDAwMDNmCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU183ICAgMHgwMDA3ZgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfOCAgIDB4MDAwZmYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzkgICAweDAwMWZmCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU18xMCAgMHgwMDNmZgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfMTEgIDB4MDA3ZmYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzEyICAweDAwZmZmCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU18xMyAgMHgwMWZmZgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfMTQgIDB4MDNmZmYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzE1ICAweDA3ZmZmCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU18xNiAgMHgwZmZmZgorCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xKHYpICAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzE1KQorI2RlZmluZSBtU1VOSTF4MTBHRVhQX0NMUl9NU0JJVFNfMih2KSAgKCh2KSAmIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU18xNCkKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9DTFJfTVNCSVRTXzModikgICgodikgJiBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfMTMpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU180KHYpICAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzEyKQorI2RlZmluZSBtU1VOSTF4MTBHRVhQX0NMUl9NU0JJVFNfNSh2KSAgKCh2KSAmIFNVTkkxeDEwR0VYUF9CSVRNU0tfQklUU18xMSkKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9DTFJfTVNCSVRTXzYodikgICgodikgJiBTVU5JMXgxMEdFWFBfQklUTVNLX0JJVFNfMTApCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU183KHYpICAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzkpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU184KHYpICAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzgpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU185KHYpICAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzcpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xMCh2KSAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzYpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xMSh2KSAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzUpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xMih2KSAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzQpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xMyh2KSAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzMpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xNCh2KSAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzIpCisjZGVmaW5lIG1TVU5JMXgxMEdFWFBfQ0xSX01TQklUU18xNSh2KSAoKHYpICYgU1VOSTF4MTBHRVhQX0JJVE1TS19CSVRTXzEpCisKKyNkZWZpbmUgbVNVTkkxeDEwR0VYUF9HRVRfQklUKHZhbCwgYml0TXNrKSAoKCh2YWwpJihiaXRNc2spKSA/IDE6MCkKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDAxOiBTL1VOSS0xeDEwR0UtWFAgUHJvZHVjdCBSZXZpc2lvbgorICogICAgQml0IDMtMCAgUkVWSVNJT04KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUkVWSVNJT04gIDB4MDAwRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MDAwMjogUy9VTkktMXgxMEdFLVhQIENvbmZpZ3VyYXRpb24gYW5kIFJlc2V0IENvbnRyb2wKKyAqICAgIEJpdCAyICBYQVVJX0FSRVNFVEIKKyAqICAgIEJpdCAxICBQTDRfQVJFU0VUQgorICogICAgQml0IDAgIERSRVNFVEIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfWEFVSV9BUkVTRVQgIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNF9BUkVTRVQgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19EUkVTRVRCICAgICAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDAzOiBTL1VOSS0xeDEwR0UtWFAgTG9vcCBCYWNrIGFuZCBNaXNjZWxsYW5lb3VzIENvbnRyb2wKKyAqICAgIEJpdCAxMSAgUEw0SU9fT1VUQ0xLU0VMCisgKiAgICBCaXQgOSAgIFNZU1BDU0xCCisgKiAgICBCaXQgOCAgIExJTkVQQ1NMQgorICogICAgQml0IDcgICBNU1RBVF9CWVBBU1MKKyAqICAgIEJpdCA2ICAgUlhYR19CWVBBU1MKKyAqICAgIEJpdCA1ICAgVFhYR19CWVBBU1MKKyAqICAgIEJpdCA0ICAgU09QX1BBRF9FTgorICogICAgQml0IDEgICBMT1NfSU5WCisgKiAgICBCaXQgMCAgIE9WRVJSSURFX0xPUworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19PVVRDTEtTRUwgIDB4MDgwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1NZU1BDU0xCICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTElORVBDU0xCICAgICAgICAweDAxMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NU1RBVF9CWVBBU1MgICAgIDB4MDA4MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfQllQQVNTICAgICAgMHgwMDQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19CWVBBU1MgICAgICAweDAwMjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19TT1BfUEFEX0VOICAgICAgIDB4MDAxMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0xPU19JTlYgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfT1ZFUlJJREVfTE9TICAgICAweDAwMDEKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBSZWdpc3RlciAweDAwMDQ6IFMvVU5JLTF4MTBHRS1YUCBEZXZpY2UgU3RhdHVzCiAgKiAgICBCaXQgOSBUT1BfU1hSQV9FWFBJUkVECkBAIC0xNDEsNyArNjAzLDEwIEBACiAgKiAgICBCaXQgMCBUT1BfUEw0X09VVF9ST09MCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9TWFJBX0VYUElSRUQgIDB4MDIwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9NRElPX0JVU1kgICAgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9EVFJCICAgICAgICAgIDB4MDA4MAogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9FWFBJUkVEICAgICAgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9QQVVTRUQgICAgICAgIDB4MDAyMAogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9QTDRfSURfRE9PTCAgIDB4MDAxMAogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9QTDRfSVNfRE9PTCAgIDB4MDAwOAogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9QTDRfSURfUk9PTCAgIDB4MDAwNApAQCAtMTQ5LDEyICs2MTQsMjE5IEBACiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1BMNF9PVVRfUk9PTCAgMHgwMDAxCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDA1OiBHbG9iYWwgUGVyZm9ybWFuY2UgVXBkYXRlIGFuZCBDbG9jayBNb25pdG9ycworICogICAgQml0IDE1IFRJUAorICogICAgQml0IDggIFhBVUlfUkVGX0NMS0EKKyAqICAgIEJpdCA3ICBSWExBTkUzQ0xLQQorICogICAgQml0IDYgIFJYTEFORTJDTEtBCisgKiAgICBCaXQgNSAgUlhMQU5FMUNMS0EKKyAqICAgIEJpdCA0ICBSWExBTkUwQ0xLQQorICogICAgQml0IDMgIENTVUNMS0EKKyAqICAgIEJpdCAyICBURENMS0EKKyAqICAgIEJpdCAxICBSU0NMS0EKKyAqICAgIEJpdCAwICBSRENMS0EKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVElQICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfWEFVSV9SRUZfQ0xLQSAgMHgwMTAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhMQU5FM0NMS0EgICAgMHgwMDgwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhMQU5FMkNMS0EgICAgMHgwMDQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhMQU5FMUNMS0EgICAgMHgwMDIwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhMQU5FMENMS0EgICAgMHgwMDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfQ1NVQ0xLQSAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVERDTEtBICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlNDTEtBICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUkRDTEtBICAgICAgICAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDA2OiBNRElPIENvbW1hbmQKKyAqICAgIEJpdCA0IE1ESU9fUkRJTkMKKyAqICAgIEJpdCAzIE1ESU9fUlNUQVQKKyAqICAgIEJpdCAyIE1ESU9fTENUTEQKKyAqICAgIEJpdCAxIE1ESU9fTENUTEEKKyAqICAgIEJpdCAwIE1ESU9fU1BSRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NRElPX1JESU5DICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NRElPX1JTVEFUICAweDAwMDgKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NRElPX0xDVExEICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NRElPX0xDVExBICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NRElPX1NQUkUgICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDAwMDc6IE1ESU8gSW50ZXJydXB0IEVuYWJsZQorICogICAgQml0IDAgTURJT19CVVNZX0VOCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01ESU9fQlVTWV9FTiAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDA4OiBNRElPIEludGVycnVwdCBTdGF0dXMKKyAqICAgIEJpdCAwIE1ESU9fQlVTWUkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTURJT19CVVNZSSAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDA5OiBNTUQgUEhZIEFkZHJlc3MKKyAqICAgIEJpdCAxMi04IE1ESU9fREVWQURSCisgKiAgICBCaXQgNC0wIE1ESU9fUFJUQURSCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01ESU9fREVWQURSICAweDFGMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9NRElPX0RFVkFEUiAgOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01ESU9fUFJUQURSICAweDAwMUYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9NRElPX1BSVEFEUiAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MDAwQzogT0FNIEludGVyZmFjZSBDb250cm9sCisgKiAgICBCaXQgNiBNRE9fT0RfRU5CCisgKiAgICBCaXQgNSBNRElfSU5WCisgKiAgICBCaXQgNCBNRElfU0VMCisgKiAgICBCaXQgMyBSWE9BTUVOCisgKiAgICBCaXQgMiBSWE9BTUNMS0VOCisgKiAgICBCaXQgMSBUWE9BTUVOCisgKiAgICBCaXQgMCBUWE9BTUNMS0VOCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01ET19PRF9FTkIgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01ESV9JTlYgICAgIDB4MDAyMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01ESV9TRUwgICAgIDB4MDAxMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNRU4gICAgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNQ0xLRU4gIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNRU4gICAgIDB4MDAwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNQ0xLRU4gIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MDAwRDogUy9VTkktMXgxMEdFLVhQIE1hc3RlciBJbnRlcnJ1cHQgU3RhdHVzCisgKiAgICBCaXQgMTUgVE9QX1BMNElPX0lOVAorICogICAgQml0IDE0IFRPUF9JUkFNX0lOVAorICogICAgQml0IDEzIFRPUF9FUkFNX0lOVAorICogICAgQml0IDEyIFRPUF9YQVVJX0lOVAorICogICAgQml0IDExIFRPUF9NU1RBVF9JTlQKKyAqICAgIEJpdCAxMCBUT1BfUlhYR19JTlQKKyAqICAgIEJpdCA5IFRPUF9UWFhHX0lOVAorICogICAgQml0IDggVE9QX1hSRl9JTlQKKyAqICAgIEJpdCA3IFRPUF9YVEVGX0lOVAorICogICAgQml0IDYgVE9QX01ESU9fQlVTWV9JTlQKKyAqICAgIEJpdCA1IFRPUF9SWE9BTV9JTlQKKyAqICAgIEJpdCA0IFRPUF9UWE9BTV9JTlQKKyAqICAgIEJpdCAzIFRPUF9JRkxYX0lOVAorICogICAgQml0IDIgVE9QX0VGTFhfSU5UCisgKiAgICBCaXQgMSBUT1BfUEw0T0RQX0lOVAorICogICAgQml0IDAgVE9QX1BMNElEVV9JTlQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1BMNElPX0lOVCAgICAgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9JUkFNX0lOVCAgICAgICAweDQwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfRVJBTV9JTlQgICAgICAgMHgyMDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1hBVUlfSU5UICAgICAgIDB4MTAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9NU1RBVF9JTlQgICAgICAweDA4MDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUlhYR19JTlQgICAgICAgMHgwNDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1RYWEdfSU5UICAgICAgIDB4MDIwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9YUkZfSU5UICAgICAgICAweDAxMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfWFRFRl9JTlQgICAgICAgMHgwMDgwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX01ESU9fQlVTWV9JTlQgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9SWE9BTV9JTlQgICAgICAweDAwMjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfVFhPQU1fSU5UICAgICAgMHgwMDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX0lGTFhfSU5UICAgICAgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9FRkxYX0lOVCAgICAgICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0T0RQX0lOVCAgICAgMHgwMDAyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1BMNElEVV9JTlQgICAgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFJlZ2lzdGVyIDB4MDAwRTpQTTMzOTMgR2xvYmFsIGludGVycnVwdCBlbmFibGUKICAqICAgIEJpdCAxNSBUT1BfSU5URQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfSU5URSAgMHg4MDAwCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMDEwOiBYVEVGIE1pc2NlbGxhbmVvdXMgQ29udHJvbAorICogICAgQml0IDcgUkZfVkFMCisgKiAgICBCaXQgNiBSRl9PVkVSUklERQorICogICAgQml0IDUgTEZfVkFMCisgKiAgICBCaXQgNCBMRl9PVkVSUklERQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SRl9WQUwgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUkZfT1ZFUlJJREUgICAgICAgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0xGX1ZBTCAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MRl9PVkVSUklERSAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTEZSRl9PVkVSUklERV9WQUwgIDB4MDBGMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MDAxMTogWFJGIE1pc2NlbGxhbmVvdXMgQ29udHJvbAorICogICAgQml0IDYtNCBFTl9JRExFX1JFUAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FTl9JRExFX1JFUCAgMHgwMDcwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMTAwOiBTRVJERVMgMzEyNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEKKyAqICAgIEJpdCAxMCBSWEVRQl8zCisgKiAgICBCaXQgOCAgUlhFUUJfMgorICogICAgQml0IDYgIFJYRVFCXzEKKyAqICAgIEJpdCA0ICBSWEVRQl8wCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYRVFCICAgIDB4MEZGMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1JYRVFCXzMgIDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUlhFUUJfMiAgOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1JYRVFCXzEgIDYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9SWEVRQl8wICA0CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMTAxOiBTRVJERVMgMzEyNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIKKyAqICAgIEJpdCAxMiBZU0VMCisgKiAgICBCaXQgIDcgUFJFX0VNUEhfMworICogICAgQml0ICA2IFBSRV9FTVBIXzIKKyAqICAgIEJpdCAgNSBQUkVfRU1QSF8xCisgKiAgICBCaXQgIDQgUFJFX0VNUEhfMAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19ZU0VMICAgICAgICAweDEwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QUkVfRU1QSCAgICAweDAwRjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QUkVfRU1QSF8zICAweDAwODAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QUkVfRU1QSF8yICAweDAwNDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QUkVfRU1QSF8xICAweDAwMjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QUkVfRU1QSF8wICAweDAwMTAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDAxMDI6IFNFUkRFUyAzMTI1IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIKKyAqICAgIEJpdCAzIExBU0lFCisgKiAgICBCaXQgMiBTUExMX1JBRQorICogICAgQml0IDEgTVBMTF9SQUUKKyAqICAgIEJpdCAwIFBMTF9MT0NLRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQVNJRSAgICAgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1NQTExfUkFFICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTVBMTF9SQUUgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTExfTE9DS0UgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MDEwMzogU0VSREVTIDMxMjUgSW50ZXJydXB0IFZpc2liaWxpdHkgUmVnaXN0ZXIKKyAqICAgIEJpdCAzIExBU0lWCisgKiAgICBCaXQgMiBTUExMX1JBVgorICogICAgQml0IDEgTVBMTF9SQVYKKyAqICAgIEJpdCAwIFBMTF9MT0NLVgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQVNJViAgICAgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1NQTExfUkFWICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTVBMTF9SQVYgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTExfTE9DS1YgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MDEwNDogU0VSREVTIDMxMjUgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgorICogICAgQml0IDMgTEFTSUkKKyAqICAgIEJpdCAyIFNQTExfUkFJCisgKiAgICBCaXQgMSBNUExMX1JBSQorICogICAgQml0IDAgUExMX0xPQ0tJCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0xBU0lJICAgICAgMHgwMDA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfU1BMTF9SQUkgICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NUExMX1JBSSAgIDB4MDAwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMTF9MT0NLSSAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMTA3OiBTRVJERVMgMzEyNSBUZXN0IENvbmZpZ3VyYXRpb24KKyAqICAgIEJpdCAxMiBEVUFMVFgKKyAqICAgIEJpdCAxMCBIQ18xCisgKiAgICBCaXQgIDkgSENfMAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19EVUFMVFggIDB4MTAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0hDICAgICAgMHgwNjAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfSENfMCAgICA5CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUmVnaXN0ZXIgMHgyMDQwOiBSWFhHIENvbmZpZ3VyYXRpb24gMQogICogICAgQml0IDE1ICBSWFhHX1JYRU4KICAqICAgIEJpdCAxNCAgUlhYR19ST0NGCkBAIC0xNjgsMTEgKzg0MCw4NCBAQAogICogICAgQml0IDItMCBSWFhHX01JRkcKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19SWEVOICAgICAgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUk9DRiAgICAgICAweDQwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1BBRF9TVFJJUCAgMHgyMDAwCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19QVVJFUCAgICAgIDB4MDQwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTE9OR1AgICAgICAweDAyMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1BBUkYgICAgICAgMHgwMTAwCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19GTENISyAgICAgIDB4MDA4MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUEFTU19DVFJMICAweDAwMjAKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX0NSQ19TVFJJUCAgMHgwMDA4CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgwMjA0MTogUlhYRyBDb25maWd1cmF0aW9uIDIKKyAqICAgIEJpdCA3LTAgUlhYR19IRFJTSVpFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfSERSU0laRSAgMHgwMEZGCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMDQyOiBSWFhHIENvbmZpZ3VyYXRpb24gMworICogICAgQml0IDE1IFJYWEdfTUlOX0xFUlJFCisgKiAgICBCaXQgMTQgUlhYR19NQVhfTEVSUkUKKyAqICAgIEJpdCAxMiBSWFhHX0xJTkVfRVJSRQorICogICAgQml0IDEwIFJYWEdfUlhfT1ZSRQorICogICAgQml0IDkgIFJYWEdfQURSX0ZJTFRFUkUKKyAqICAgIEJpdCA4ICBSWFhHX0VSUl9GSUxURVJFCisgKiAgICBCaXQgNSAgUlhYR19QUk1CX0VSUkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19NSU5fTEVSUkUgICAgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUFYX0xFUlJFICAgICAweDQwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX0xJTkVfRVJSRSAgICAgMHgxMDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19SWF9PVlJFICAgICAgIDB4MDQwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfQURSX0ZJTFRFUkUgICAweDAyMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX0VSUl9GSUxURVJSRSAgMHgwMTAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19QUk1CX0VSUkUgICAgIDB4MDAyMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjA0MzogUlhYRyBJbnRlcnJ1cHQKKyAqICAgIEJpdCAxNSBSWFhHX01JTl9MRVJSSQorICogICAgQml0IDE0IFJYWEdfTUFYX0xFUlJJCisgKiAgICBCaXQgMTIgUlhYR19MSU5FX0VSUkkKKyAqICAgIEJpdCAxMCBSWFhHX1JYX09WUkkKKyAqICAgIEJpdCA5ICBSWFhHX0FEUl9GSUxURVJJCisgKiAgICBCaXQgOCAgUlhYR19FUlJfRklMVEVSSQorICogICAgQml0IDUgIFJYWEdfUFJNQl9FUlJFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUlOX0xFUlJJICAgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUFYX0xFUlJJICAgIDB4NDAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTElORV9FUlJJICAgIDB4MTAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUlhfT1ZSSSAgICAgIDB4MDQwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfQURSX0ZJTFRFUkkgIDB4MDIwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfRVJSX0ZJTFRFUkkgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUFJNQl9FUlJFICAgIDB4MDAyMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjA0OTogUlhYRyBSZWNlaXZlIEZJRk8gVGhyZXNob2xkCisgKiAgICBCaXQgMi0wIFJYWEdfQ1VUX1RIUlUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19DVVRfVEhSVSAgMHgwMDA3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUlhYR19DVVRfVEhSVSAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjA2MkggLSAweDIwNjk6IFJYWEcgRXhhY3QgTWF0Y2ggVklECisgKiAgICBCaXQgMTEtMCBSWFhHX1ZJRF9NQVRDSAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1ZJRF9NQVRDSCAgMHgwRkZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUlhYR19WSURfTUFUQ0ggIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwNkVIIC0gMHgyMDZGOiBSWFhHIEFkZHJlc3MgRmlsdGVyIENvbnRyb2wKKyAqICAgIEJpdCAzIFJYWEdfRk9SV0FSRF9FTkFCTEUKKyAqICAgIEJpdCAyIFJYWEdfVkxBTl9FTkFCTEUKKyAqICAgIEJpdCAxIFJYWEdfU1JDX0FERFIKKyAqICAgIEJpdCAwIFJYWEdfTUFUQ0hfRU5BQkxFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfRk9SV0FSRF9FTkFCTEUgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfVkxBTl9FTkFCTEUgICAgIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfU1JDX0FERFIgICAgICAgIDB4MDAwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUFUQ0hfRU5BQkxFICAgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFJlZ2lzdGVyIDB4MjA3MDogUlhYRyBBZGRyZXNzIEZpbHRlciBDb250cm9sIDIKICAqICAgIEJpdCAxIFJYWEdfUE1PREUKICAqICAgIEJpdCAwIFJYWEdfTUhBU0hfRU4KQEAgLTE4MSwxNSArOTI2LDQ0NiBAQAogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUhBU0hfRU4gIDB4MDAwMQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjA4MTogWFJGIENvbnRyb2wgUmVnaXN0ZXIgMgorICogICAgQml0IDYgICBFTl9QS1RfR0VOCisgKiAgICBCaXQgNC0yIFBBVFQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRU5fUEtUX0dFTiAgMHgwMDQwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEFUVCAgICAgICAgMHgwMDFDCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUEFUVCAgICAgICAgMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjA4ODogWFJGIEludGVycnVwdCBFbmFibGUKKyAqICAgIEJpdCAxMi05IExBTkVfSElDRVJFCisgKiAgICBCaXQgOC01ICBIU19TRF9MQU5FRQorICogICAgQml0IDQgICAgQUxJR05fU1RBVFVTX0VSUkUKKyAqICAgIEJpdCAzLTAgIExBTkVfU1lOQ19TVEFUX0VSUkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTEFORV9ISUNFUkUgICAgICAgICAgMHgxRTAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfTEFORV9ISUNFUkUgICAgICAgICAgOQorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0hTX1NEX0xBTkVFICAgICAgICAgIDB4MDFFMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX0hTX1NEX0xBTkVFICAgICAgICAgIDUKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19BTElHTl9TVEFUVVNfRVJSRSAgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FX1NZTkNfU1RBVF9FUlJFICAweDAwMEYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9MQU5FX1NZTkNfU1RBVF9FUlJFICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMDg5OiBYUkYgSW50ZXJydXB0IFN0YXR1cworICogICAgQml0IDEyLTkgTEFORV9ISUNFUkkKKyAqICAgIEJpdCA4LTUgIEhTX1NEX0xBTkVJCisgKiAgICBCaXQgNCAgICBBTElHTl9TVEFUVVNfRVJSSQorICogICAgQml0IDMtMCAgTEFORV9TWU5DX1NUQVRfRVJSSQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FX0hJQ0VSSSAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9MQU5FX0hJQ0VSSSAgICAgICAgICA5CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfSFNfU0RfTEFORUkgICAgICAgICAgMHgwMUUwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfSFNfU0RfTEFORUkgICAgICAgICAgNQorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0FMSUdOX1NUQVRVU19FUlJJICAgIDB4MDAxMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0xBTkVfU1lOQ19TVEFUX0VSUkkgIDB4MDAwRgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX0xBTkVfU1lOQ19TVEFUX0VSUkkgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwOEE6IFhSRiBFcnJvciBTdGF0dXMKKyAqICAgIEJpdCA4LTUgIEhTX1NEX0xBTkUKKyAqICAgIEJpdCA0ICAgIEFMSUdOX1NUQVRVU19FUlIKKyAqICAgIEJpdCAzLTAgIExBTkVfU1lOQ19TVEFUX0VSUgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19IU19TRF9MQU5FMyAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19IU19TRF9MQU5FMiAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19IU19TRF9MQU5FMSAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19IU19TRF9MQU5FMCAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19BTElHTl9TVEFUVVNfRVJSICAgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FM19TWU5DX1NUQVRfRVJSICAweDAwMDgKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FMl9TWU5DX1NUQVRfRVJSICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FMV9TWU5DX1NUQVRfRVJSICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FMF9TWU5DX1NUQVRfRVJSICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwOEI6IFhSRiBEaWFnbm9zdGljIEludGVycnVwdCBFbmFibGUKKyAqICAgIEJpdCA3LTQgTEFORV9PVkVSUlVORQorICogICAgQml0IDMtMCBMQU5FX1VOREVSUlVORQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FX09WRVJSVU5FICAgMHgwMEYwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfTEFORV9PVkVSUlVORSAgIDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FX1VOREVSUlVORSAgMHgwMDBGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfTEFORV9VTkRFUlJVTkUgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwOEM6IFhSRiBEaWFnbm9zdGljIEludGVycnVwdCBTdGF0dXMKKyAqICAgIEJpdCA3LTQgTEFORV9PVkVSUlVOSQorICogICAgQml0IDMtMCBMQU5FX1VOREVSUlVOSQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FX09WRVJSVU5JICAgMHgwMEYwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfTEFORV9PVkVSUlVOSSAgIDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19MQU5FX1VOREVSUlVOSSAgMHgwMDBGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfTEFORV9VTkRFUlJVTkkgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwQzA6IFJYT0FNIENvbmZpZ3VyYXRpb24KKyAqICAgIEJpdCAxNSAgICBSWE9BTV9CVVNZCisgKiAgICBCaXQgMTQtMTIgUlhPQU1fRjJfU0VMCisgKiAgICBCaXQgMTAtOCAgUlhPQU1fRjFfU0VMCisgKiAgICBCaXQgNy02ICAgUlhPQU1fRklMVEVSX0NUUkwKKyAqICAgIEJpdCA1LTAgICBSWE9BTV9QWF9FTgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9CVVNZICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhPQU1fRjJfU0VMICAgICAgIDB4NzAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1JYT0FNX0YyX1NFTCAgICAgICAxMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0YxX1NFTCAgICAgICAweDA3MDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9SWE9BTV9GMV9TRUwgICAgICAgOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0ZJTFRFUl9DVFJMICAweDAwQzAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9SWE9BTV9GSUxURVJfQ1RSTCAgNgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX1BYX0VOICAgICAgICAweDAwM0YKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9SWE9BTV9QWF9FTiAgICAgICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjBDMSwweDIwQzI6IFJYT0FNIEZpbHRlciBDb25maWd1cmF0aW9uCisgKiAgICBCaXQgMTUtOCBSWE9BTV9GWF9NQVNLCisgKiAgICBCaXQgNy0wICBSWE9BTV9GWF9WQUwKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhPQU1fRlhfTUFTSyAgMHhGRjAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUlhPQU1fRlhfTUFTSyAgOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0ZYX1ZBTCAgIDB4MDBGRgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1JYT0FNX0ZYX1ZBbCAgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwQzM6IFJYT0FNIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgorICogICAgQml0IDEzICAgIFJYT0FNX1JFQ19CWVRFX1ZBTAorICogICAgQml0IDExLTEwIFJYT0FNX0JZUEFTU19NT0RFCisgKiAgICBCaXQgNS0wICAgUlhPQU1fUFhfQ0xFQVIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhPQU1fUkVDX0JZVEVfVkFMICAweDIwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9CWVBBU1NfTU9ERSAgIDB4MEMwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1JYT0FNX0JZUEFTU19NT0RFICAgMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9QWF9DTEVBUiAgICAgIDB4MDAzRgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1JYT0FNX1BYX0NMRUFSICAgICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjBDNDogUlhPQU0gSEVDIENvbmZpZ3VyYXRpb24KKyAqICAgIEJpdCAxNS04IFJYT0FNX0NPU0VUCisgKiAgICBCaXQgMiAgICBSWE9BTV9IRUNfRVJSX1BLVAorICogICAgQml0IDAgICAgUlhPQU1fSEVDX0VOCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0NPU0VUICAgICAgICAweEZGMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9SWE9BTV9DT1NFVCAgICAgICAgOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0hFQ19FUlJfUEtUICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9IRUNfRU4gICAgICAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMEM3OiBSWE9BTSBJbnRlcnJ1cHQgRW5hYmxlCisgKiAgICBCaXQgMTAgUlhPQU1fRklMVEVSX1RIUlNIRQorICogICAgQml0IDkgIFJYT0FNX09BTV9FUlJFCisgKiAgICBCaXQgOCAgUlhPQU1fSEVDRV9USFJTSEUKKyAqICAgIEJpdCA3ICBSWE9BTV9TT1BFCisgKiAgICBCaXQgNiAgUlhPQU1fUkZFCisgKiAgICBCaXQgNSAgUlhPQU1fTEZFCisgKiAgICBCaXQgNCAgUlhPQU1fRFZfRVJSRQorICogICAgQml0IDMgIFJYT0FNX0RBVEFfSU5WQUxJREUKKyAqICAgIEJpdCAyICBSWE9BTV9GSUxURVJfRFJPUEUKKyAqICAgIEJpdCAxICBSWE9BTV9IRUNFCisgKiAgICBCaXQgMCAgUlhPQU1fT0ZMRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9GSUxURVJfVEhSU0hFICAweDA0MDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9PQU1fRVJSRSAgICAgICAweDAyMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9IRUNFX1RIUlNIRSAgICAweDAxMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9TT1BFICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9SRkUgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9MRkUgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9EVl9FUlJFICAgICAgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9EQVRBX0lOVkFMSURFICAweDAwMDgKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9GSUxURVJfRFJPUEUgICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9IRUNFICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWE9BTV9PRkxFICAgICAgICAgICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwQzg6IFJYT0FNIEludGVycnVwdCBTdGF0dXMKKyAqICAgIEJpdCAxMCBSWE9BTV9GSUxURVJfVEhSU0hJCisgKiAgICBCaXQgOSAgUlhPQU1fT0FNX0VSUkkKKyAqICAgIEJpdCA4ICBSWE9BTV9IRUNFX1RIUlNISQorICogICAgQml0IDcgIFJYT0FNX1NPUEkKKyAqICAgIEJpdCA2ICBSWE9BTV9SRkkKKyAqICAgIEJpdCA1ICBSWE9BTV9MRkkKKyAqICAgIEJpdCA0ICBSWE9BTV9EVl9FUlJJCisgKiAgICBCaXQgMyAgUlhPQU1fREFUQV9JTlZBTElESQorICogICAgQml0IDIgIFJYT0FNX0ZJTFRFUl9EUk9QSQorICogICAgQml0IDEgIFJYT0FNX0hFQ0kKKyAqICAgIEJpdCAwICBSWE9BTV9PRkxJCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0ZJTFRFUl9USFJTSEkgIDB4MDQwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX09BTV9FUlJJICAgICAgIDB4MDIwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0hFQ0VfVEhSU0hJICAgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX1NPUEkgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX1JGSSAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0xGSSAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0RWX0VSUkkgICAgICAgIDB4MDAxMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0RBVEFfSU5WQUxJREkgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0ZJTFRFUl9EUk9QSSAgIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0hFQ0kgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX09GTEkgICAgICAgICAgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjBDOTogUlhPQU0gU3RhdHVzCisgKiAgICBCaXQgMTAgUlhPQU1fRklMVEVSX1RIUlNIVgorICogICAgQml0IDggIFJYT0FNX0hFQ0VfVEhSU0hWCisgKiAgICBCaXQgNiAgUlhPQU1fUkZWCisgKiAgICBCaXQgNSAgUlhPQU1fTEZWCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0ZJTFRFUl9USFJTSFYgIDB4MDQwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0hFQ0VfVEhSU0hWICAgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX1JGViAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYT0FNX0xGViAgICAgICAgICAgIDB4MDAyMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFJlZ2lzdGVyIDB4MjEwMDogTVNUQVQgQ29udHJvbAogICogICAgQml0IDIgTVNUQVRfV1JJVEUKICAqICAgIEJpdCAxIE1TVEFUX0NMRUFSCiAgKiAgICBCaXQgMCBNU1RBVF9TTkFQCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01TVEFUX1dSSVRFICAweDAwMDQKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NU1RBVF9DTEVBUiAgMHgwMDAyCiAjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTVNUQVRfU05BUCAgIDB4MDAwMQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjEwOTogTVNUQVQgQ291bnRlciBXcml0ZSBBZGRyZXNzCisgKiAgICBCaXQgNS0wIE1TVEFUX1dSSVRFX0FERFJFU1MKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfTVNUQVRfV1JJVEVfQUREUkVTUyAweDAwM0YKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9NU1RBVF9XUklURV9BRERSRVNTIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIyMDA6IElGTFggR2xvYmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqICAgIEJpdCAxNSAgIElGTFhfSVJDVV9FTkFCTEUKKyAqICAgIEJpdCAxNCAgIElGTFhfSURTV1RfRU5BQkxFCisgKiAgICBCaXQgMTMtMCBJRkxYX0lGRF9DTlQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfSUZMWF9JUkNVX0VOQUJMRSAgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0lGTFhfSURTV1RfRU5BQkxFICAweDQwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0lGRF9DTlQgICAgICAgMHgzRkZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfSUZMWF9JRkRfQ05UICAgICAgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIyMDk6IElGTFggRklGTyBPdmVyZmxvdyBFbmFibGUKKyAqICAgIEJpdCAwIElGTFhfT1ZGRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX09WRkUgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjBBOiBJRkxYIEZJRk8gT3ZlcmZsb3cgSW50ZXJydXB0CisgKiAgICBCaXQgMCBJRkxYX09WRkkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfSUZMWF9PVkZJIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjIwRDogSUZMWCBJbmRpcmVjdCBDaGFubmVsIEFkZHJlc3MKKyAqICAgIEJpdCAxNSBJRkxYX0JVU1kKKyAqICAgIEJpdCAxNCBJRkxYX1JXQgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0JVU1kgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0lGTFhfUldCICAgMHg0MDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjBFOiBJRkxYIEluZGlyZWN0IExvZ2ljYWwgRklGTyBMb3cgTGltaXQgJiBQcm92aXNpb24KKyAqICAgIEJpdCA5LTAgSUZMWF9MT0xJTQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0xPTElNICAweDAzRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9JRkxYX0xPTElNICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjBGOiBJRkxYIEluZGlyZWN0IExvZ2ljYWwgRklGTyBIaWdoIExpbWl0CisgKiAgICBCaXQgOS0wIElGTFhfSElMSU0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfSUZMWF9ISUxJTSAgMHgwM0ZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfSUZMWF9ISUxJTSAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjIxMDogSUZMWCBJbmRpcmVjdCBGdWxsL0FsbW9zdCBGdWxsIFN0YXR1cyAmIExpbWl0CisgKiAgICBCaXQgMTUgICBJRkxYX0ZVTEwKKyAqICAgIEJpdCAxNCAgIElGTFhfQUZVTEwKKyAqICAgIEJpdCAxMy0wIElGTFhfQUZUSAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0ZVTEwgICAweDgwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0FGVUxMICAweDQwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0FGVEggICAweDNGRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9JRkxYX0FGVEggICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjExOiBJRkxYIEluZGlyZWN0IEVtcHR5L0FsbW9zdCBFbXB0eSBTdGF0dXMgJiBMaW1pdAorICogICAgQml0IDE1ICAgSUZMWF9FTVBUWQorICogICAgQml0IDE0ICAgSUZMWF9BRU1QVFkKKyAqICAgIEJpdCAxMy0wIElGTFhfQUVUSAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19JRkxYX0VNUFRZICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfSUZMWF9BRU1QVFkgIDB4NDAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0lGTFhfQUVUSCAgICAweDNGRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9JRkxYX0FFVEggICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjI0MDogUEw0TU9TIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqICAgIEJpdCAzIFBMNE1PU19SRV9JTklUCisgKiAgICBCaXQgMiBQTDRNT1NfRU4KKyAqICAgIEJpdCAxIFBMNE1PU19OT19TVEFUVVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0TU9TX1JFX0lOSVQgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0TU9TX0VOICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0TU9TX05PX1NUQVRVUyAgICAgICAgMHgwMDAyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjQzOiBQTDRNT1MgTWF4QnVyc3QxIFJlZ2lzdGVyCisgKiAgICBCaXQgMTEtMCBQTDRNT1NfTUFYX0JVUlNUMQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRNT1NfTUFYX0JVUlNUMSAgMHgwRkZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUEw0TU9TX01BWF9CVVJTVDEgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIyNDQ6IFBMNE1PUyBNYXhCdXJzdDIgUmVnaXN0ZXIKKyAqICAgIEJpdCAxMS0wIFBMNE1PU19NQVhfQlVSU1QyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNE1PU19NQVhfQlVSU1QyICAweDBGRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9QTDRNT1NfTUFYX0JVUlNUMiAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjI0NTogUEw0TU9TIFRyYW5zZmVyIFNpemUgUmVnaXN0ZXIKKyAqICAgIEJpdCA3LTAgUEw0TU9TX01BWF9UUkFOU0ZFUgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRNT1NfTUFYX1RSQU5TRkVSICAweDAwRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9QTDRNT1NfTUFYX1RSQU5TRkVSICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjgwOiBQTDRPRFAgQ29uZmlndXJhdGlvbgorICogICAgQml0IDE1LTEyIFBMNE9EUF9SRVBFQVRfVAorICogICAgQml0IDggICAgIFBMNE9EUF9TT1BfUlVMRQorICogICAgQml0IDEgICAgIFBMNE9EUF9FTl9QT1JUUworICogICAgQml0IDAgICAgIFBMNE9EUF9FTl9ERldECisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNE9EUF9SRVBFQVRfVCAgIDB4RjAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1BMNE9EUF9SRVBFQVRfVCAgIDEyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX1NPUF9SVUxFICAgMHgwMTAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX0VOX1BPUlRTICAgMHgwMDAyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX0VOX0RGV0QgICAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgyMjgyOiBQTDRPRFAgSW50ZXJydXB0IE1hc2sKKyAqICAgIEJpdCAwIFBMNE9EUF9PVVRfRElTRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRPRFBfT1VUX0RJU0UgICAgIDB4MDAwMQorCisKKworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNE9EUF9QUEVfRU9QRU9CRSAgMHgwMDgwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX1BQRV9FUlJFT1BFICAweDAwNDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRPRFBfUFBFX01FT1BFICAgIDB4MDAwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNE9EUF9QUEVfTVNPUEUgICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX0VTX09WUkUgICAgICAweDAwMDIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjI4MzogUEw0T0RQIEludGVycnVwdAorICogICAgQml0IDAgUEw0T0RQX09VVF9ESVNJCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNE9EUF9PVVRfRElTSSAgICAgMHgwMDAxCisKKworCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX1BQRV9FT1BFT0JJICAweDAwODAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRPRFBfUFBFX0VSUkVPUEkgIDB4MDA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNE9EUF9QUEVfTUVPUEkgICAgMHgwMDA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0T0RQX1BQRV9NU09QSSAgICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRPRFBfRVNfT1ZSSSAgICAgIDB4MDAwMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjMwMDogIFBMNElPIExvY2sgRGV0ZWN0IFN0YXR1cworICogICAgQml0IDE1IFBMNElPX09VVF9ST09MVgorICogICAgQml0IDEyIFBMNElPX0lTX1JPT0xWCisgKiAgICBCaXQgMTEgUEw0SU9fRElQMl9FUlJWCisgKiAgICBCaXQgOCAgUEw0SU9fSURfUk9PTFYKKyAqICAgIEJpdCA0ICBQTDRJT19JU19ET09MVgorICogICAgQml0IDAgIFBMNElPX0lEX0RPT0xWCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX09VVF9ST09MViAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fSVNfUk9PTFYgICAweDEwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19ESVAyX0VSUlYgIDB4MDgwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX0lEX1JPT0xWICAgMHgwMTAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fSVNfRE9PTFYgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19JRF9ET09MViAgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjMwMTogIFBMNElPIExvY2sgRGV0ZWN0IENoYW5nZQorICogICAgQml0IDE1IFBMNElPX09VVF9ST09MSQorICogICAgQml0IDEyIFBMNElPX0lTX1JPT0xJCisgKiAgICBCaXQgMTEgUEw0SU9fRElQMl9FUlJJCisgKiAgICBCaXQgOCAgUEw0SU9fSURfUk9PTEkKKyAqICAgIEJpdCA0ICBQTDRJT19JU19ET09MSQorICogICAgQml0IDAgIFBMNElPX0lEX0RPT0xJCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX09VVF9ST09MSSAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fSVNfUk9PTEkgICAweDEwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19ESVAyX0VSUkkgIDB4MDgwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX0lEX1JPT0xJICAgMHgwMTAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fSVNfRE9PTEkgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19JRF9ET09MSSAgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjMwMjogIFBMNElPIExvY2sgRGV0ZWN0IE1hc2sKKyAqICAgIEJpdCAxNSBQTDRJT19PVVRfUk9PTEUKKyAqICAgIEJpdCAxMiBQTDRJT19JU19ST09MRQorICogICAgQml0IDExIFBMNElPX0RJUDJfRVJSRQorICogICAgQml0IDggIFBMNElPX0lEX1JPT0xFCisgKiAgICBCaXQgNCAgUEw0SU9fSVNfRE9PTEUKKyAqICAgIEJpdCAwICBQTDRJT19JRF9ET09MRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19PVVRfUk9PTEUgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX0lTX1JPT0xFICAgMHgxMDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fRElQMl9FUlJFICAweDA4MDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19JRF9ST09MRSAgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX0lTX0RPT0xFICAgMHgwMDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fSURfRE9PTEUgICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIzMDM6ICBQTDRJTyBMb2NrIERldGVjdCBMaW1pdHMKKyAqICAgIEJpdCAxNS04IFBMNElPX1JFRl9MSU1JVAorICogICAgQml0IDctMCAgUEw0SU9fVFJBTl9MSU1JVAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19SRUZfTElNSVQgICAweEZGMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9QTDRJT19SRUZfTElNSVQgICA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fVFJBTl9MSU1JVCAgMHgwMEZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUEw0SU9fVFJBTl9MSU1JVCAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjMwNDogIFBMNElPIENhbGVuZGFyIFJlcGV0aXRpb25zCisgKiAgICBCaXQgMTUtOCBQTDRJT19JTl9NVUwKKyAqICAgIEJpdCA3LTAgIFBMNElPX09VVF9NVUwKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fSU5fTVVMICAgMHhGRjAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfUEw0SU9fSU5fTVVMICAgOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX09VVF9NVUwgIDB4MDBGRgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1BMNElPX09VVF9NVUwgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIzMDU6ICBQTDRJTyBDb25maWd1cmF0aW9uCisgKiAgICBCaXQgMTUgIFBMNElPX0RJUDJfRVJSX0NISworICogICAgQml0IDExICBQTDRJT19PREFUX0RJUworICogICAgQml0IDEwICBQTDRJT19UUkFJTl9ESVMKKyAqICAgIEJpdCA5ICAgUEw0SU9fT1NUQVRfRElTCisgKiAgICBCaXQgOCAgIFBMNElPX0lTVEFUX0RJUworICogICAgQml0IDcgICBQTDRJT19OT19JU1RBVAorICogICAgQml0IDYgICBQTDRJT19TVEFUX09VVFNFTAorICogICAgQml0IDUgICBQTDRJT19JTlNFTAorICogICAgQml0IDQgICBQTDRJT19ETFNFTAorICogICAgQml0IDEtMCBQTDRJT19PVVRTRUwKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fRElQMl9FUlJfQ0hLICAweDgwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19PREFUX0RJUyAgICAgIDB4MDgwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX1RSQUlOX0RJUyAgICAgMHgwNDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fT1NUQVRfRElTICAgICAweDAyMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19JU1RBVF9ESVMgICAgIDB4MDEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX05PX0lTVEFUICAgICAgMHgwMDgwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fU1RBVF9PVVRTRUwgICAweDAwNDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJT19JTlNFTCAgICAgICAgIDB4MDAyMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElPX0RMU0VMICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SU9fT1VUU0VMICAgICAgICAweDAwMDMKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9QTDRJT19PVVRTRUwgICAgICAgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBSZWdpc3RlciAweDMwNDA6IFRYWEcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCiAgKiAgICBCaXQgMTUgICBUWFhHX1RYRU4wCiAgKiAgICBCaXQgMTMgICBUWFhHX0hPU1RQQVVTRQpAQCAtMjAyLDEyICsxMzc4LDI2NiBAQAogICogICAgQml0IDAgICAgVFhYR19TUFJFCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfVFhFTjAgICAgICAgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfSE9TVFBBVVNFICAgIDB4MjAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfSVBHVCAgICAgICAgIDB4MUY4MAogI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1RYWEdfSVBHVCAgICAgICAgIDcKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHXzMyQklUX0FMSUdOICAweDAwMjAKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX0NSQ0VOICAgICAgICAweDAwMTAKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX0ZDVFggICAgICAgICAweDAwMDgKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX0ZDUlggICAgICAgICAweDAwMDQKICNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1BBREVOICAgICAgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1NQUkUgICAgICAgICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwNDE6IFRYWEcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCisgKiAgICBCaXQgNy0wICAgVFhYR19IRFJTSVpFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfSERSU0laRSAgMHgwMEZGCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMDQyOiBUWFhHIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMworICogICAgQml0IDE1IFRYWEdfRklGT19FUlJFCisgKiAgICBCaXQgMTQgVFhYR19GSUZPX1VEUkUKKyAqICAgIEJpdCAxMyBUWFhHX01BWF9MRVJSRQorICogICAgQml0IDEyIFRYWEdfTUlOX0xFUlJFCisgKiAgICBCaXQgMTEgVFhYR19YRkVSRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX0ZJRk9fRVJSRSAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19GSUZPX1VEUkUgIDB4NDAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfTUFYX0xFUlJFICAweDIwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX01JTl9MRVJSRSAgMHgxMDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19YRkVSRSAgICAgIDB4MDgwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzA0MzogVFhYRyBJbnRlcnJ1cHQKKyAqICAgIEJpdCAxNSBUWFhHX0ZJRk9fRVJSSQorICogICAgQml0IDE0IFRYWEdfRklGT19VRFJJCisgKiAgICBCaXQgMTMgVFhYR19NQVhfTEVSUkkKKyAqICAgIEJpdCAxMiBUWFhHX01JTl9MRVJSSQorICogICAgQml0IDExIFRYWEdfWEZFUkkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19GSUZPX0VSUkkgIDB4ODAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfRklGT19VRFJJICAweDQwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX01BWF9MRVJSSSAgMHgyMDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19NSU5fTEVSUkkgIDB4MTAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfWEZFUkkgICAgICAweDA4MDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwNDQ6IFRYWEcgU3RhdHVzIFJlZ2lzdGVyCisgKiAgICBCaXQgMSBUWFhHX1RYQUNUSVZFCisgKiAgICBCaXQgMCBUWFhHX1BBVVNFRAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1RYQUNUSVZFICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1BBVVNFRCAgICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwNDY6IFRYWEcgVFhfTUlORlIgLSAgVHJhbnNtaXQgTWluIEZyYW1lIFNpemUgUmVnaXN0ZXIKKyAqICAgIEJpdCA3LTAgVFhYR19UWF9NSU5GUgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1RYX01JTkZSICAweDAwRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9UWFhHX1RYX01JTkZSICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMDUyOiBUWFhHIFBhdXNlIFF1YW50dW0gVmFsdWUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICogICAgQml0IDctMCBUWFhHX0ZDX1BBVVNFX1FOVE0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19GQ19QQVVTRV9RTlRNICAweDAwRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9UWFhHX0ZDX1BBVVNFX1FOVE0gIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwODA6IFhURUYgQ29udHJvbAorICogICAgQml0IDMtMCBYVEVGX0ZPUkNFX1BBUklUWV9FUlIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfWFRFRl9GT1JDRV9QQVJJVFlfRVJSICAweDAwMEYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9YVEVGX0ZPUkNFX1BBUklUWV9FUlIgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwODQ6IFhURUYgSW50ZXJydXB0IEV2ZW50IFJlZ2lzdGVyCisgKiAgICBCaXQgMCBYVEVGX0xPU1RfU1lOQ0kKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfWFRFRl9MT1NUX1NZTkNJICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwODU6IFhURUYgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgorICogICAgQml0IDAgWFRFRl9MT1NUX1NZTkNFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1hURUZfTE9TVF9TWU5DRSAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMDg2OiBYVEVGIFZpc2liaWxpdHkgUmVnaXN0ZXIKKyAqICAgIEJpdCAwIFhURUZfTE9TVF9TWU5DVgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19YVEVGX0xPU1RfU1lOQ1YgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzBDMDogVFhPQU0gT0FNIENvbmZpZ3VyYXRpb24KKyAqICAgIEJpdCAxNSAgIFRYT0FNX0hFQ19FTgorICogICAgQml0IDE0ICAgVFhPQU1fRU1QVFlDT0RFX0VOCisgKiAgICBCaXQgMTMgICBUWE9BTV9GT1JDRV9JRExFCisgKiAgICBCaXQgMTIgICBUWE9BTV9JR05PUkVfSURMRQorICogICAgQml0IDExLTYgVFhPQU1fUFhfT1ZFUldSSVRFCisgKiAgICBCaXQgNS0wICBUWE9BTV9QWF9TRUwKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fSEVDX0VOICAgICAgICAweDgwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWE9BTV9FTVBUWUNPREVfRU4gIDB4NDAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX0ZPUkNFX0lETEUgICAgMHgyMDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fSUdOT1JFX0lETEUgICAweDEwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWE9BTV9QWF9PVkVSV1JJVEUgIDB4MEZDMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1RYT0FNX1BYX09WRVJXUklURSAgNgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX1BYX1NFTCAgICAgICAgMHgwMDNGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfVFhPQU1fUFhfU0VMICAgICAgICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMEMxOiBUWE9BTSBNaW5pLVBhY2tldCBSYXRlIENvbmZpZ3VyYXRpb24KKyAqICAgIEJpdCAxNSAgIFRYT0FNX01JTklESVMKKyAqICAgIEJpdCAxNCAgIFRYT0FNX0JVU1kKKyAqICAgIEJpdCAxMyAgIFRYT0FNX1RSQU5TX0VOCisgKiAgICBCaXQgMTAtMCBUWE9BTV9NSU5JUkFURQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWE9BTV9NSU5JRElTICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fQlVTWSAgICAgIDB4NDAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX1RSQU5TX0VOICAweDIwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWE9BTV9NSU5JUkFURSAgMHgwN0ZGCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMEMyOiBUWE9BTSBNaW5pLVBhY2tldCBHYXAgYW5kIEZJRk8gQ29uZmlndXJhdGlvbgorICogICAgQml0IDEzLTEwIFRYT0FNX0ZUSFJFU0gKKyAqICAgIEJpdCA5LTYgICBUWE9BTV9NSU5JUE9TVAorICogICAgQml0IDUtMCAgIFRYT0FNX01JTklQUkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fRlRIUkVTSCAgIDB4M0MwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUT0ZGX1RYT0FNX0ZUSFJFU0ggICAxMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX01JTklQT1NUICAweDAzQzAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9UWE9BTV9NSU5JUE9TVCAgNgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX01JTklQUkUgICAweDAwM0YKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMwQzY6IFRYT0FNIEludGVycnVwdCBFbmFibGUKKyAqICAgIEJpdCAyIFRYT0FNX1NPUF9FUlJFCisgKiAgICBCaXQgMSBUWE9BTV9PRkxFCisgKiAgICBCaXQgMCBUWE9BTV9FUlJFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX1NPUF9FUlJFICAgIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX09GTEUgICAgICAgIDB4MDAwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYT0FNX0VSUkUgICAgICAgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzBDNzogVFhPQU0gSW50ZXJydXB0IFN0YXR1cworICogICAgQml0IDIgVFhPQU1fU09QX0VSUkkKKyAqICAgIEJpdCAxIFRYT0FNX09GTEkKKyAqICAgIEJpdCAwIFRYT0FNX0VSUkkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fU09QX0VSUkkgICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fT0ZMSSAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhPQU1fRVJSSSAgICAgICAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMENGOiBUWE9BTSBDb3NldAorICogICAgQml0IDctMCBUWE9BTV9DT1NFVAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWE9BTV9DT1NFVCAgMHgwMEZGCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMjAwOiBFRkxYIEdsb2JhbCBDb25maWd1cmF0aW9uCisgKiAgICBCaXQgMTUgRUZMWF9FUkNVX0VOCisgKiAgICBCaXQgNyAgRUZMWF9FTl9FRFNXVAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FRkxYX0VSQ1VfRU4gICAweDgwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FRkxYX0VOX0VEU1dUICAweDAwODAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMyMDE6IEVGTFggRVJDVSBHbG9iYWwgU3RhdHVzCisgKiAgICBCaXQgMTMgRUZMWF9PVkZfRVJSCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0VGTFhfT1ZGX0VSUiAgMHgyMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMjAyOiBFRkxYIEluZGlyZWN0IENoYW5uZWwgQWRkcmVzcworICogICAgQml0IDE1IEVGTFhfQlVTWQorICogICAgQml0IDE0IEVGTFhfUkRXUkIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9CVVNZICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9SRFdSQiAgMHg0MDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMjAzOiBFRkxYIEluZGlyZWN0IExvZ2ljYWwgRklGTyBMb3cgTGltaXQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9MT0xJTSAgICAgICAgICAgICAgICAgICAgMHgwM0ZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfRUZMWF9MT0xJTSAgICAgICAgICAgICAgICAgICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzIwNDogRUZMWCBJbmRpcmVjdCBMb2dpY2FsIEZJRk8gSGlnaCBMaW1pdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FRkxYX0hJTElNICAgICAgICAgICAgICAgICAgICAweDAzRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9FRkxYX0hJTElNICAgICAgICAgICAgICAgICAgICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMjA1OiBFRkxYIEluZGlyZWN0IEZ1bGwvQWxtb3N0LUZ1bGwgU3RhdHVzIGFuZCBMaW1pdAorICogICAgQml0IDE1ICAgRUZMWF9GVUxMCisgKiAgICBCaXQgMTQgICBFRkxYX0FGVUxMCisgKiAgICBCaXQgMTMtMCBFRkxYX0FGVEgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9GVUxMICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9BRlVMTCAgMHg0MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9BRlRIICAgMHgzRkZGCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRPRkZfRUZMWF9BRlRIICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzIwNjogRUZMWCBJbmRpcmVjdCBFbXB0eS9BbG1vc3QtRW1wdHkgU3RhdHVzIGFuZCBMaW1pdAorICogICAgQml0IDE1ICAgRUZMWF9FTVBUWQorICogICAgQml0IDE0ICAgRUZMWF9BRU1QVFkKKyAqICAgIEJpdCAxMy0wIEVGTFhfQUVUSAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FRkxYX0VNUFRZICAgMHg4MDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9BRU1QVFkgIDB4NDAwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX0VGTFhfQUVUSCAgICAweDNGRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9FRkxYX0FFVEggICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzIwNzogRUZMWCBJbmRpcmVjdCBGSUZPIEN1dC1UaHJvdWdoIFRocmVzaG9sZAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FRkxYX0NVVF9USFJVICAgICAgICAgICAgICAgICAweDNGRkYKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9FRkxYX0NVVF9USFJVICAgICAgICAgICAgICAgICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMjBDOiBFRkxYIEZJRk8gT3ZlcmZsb3cgRXJyb3IgRW5hYmxlCisgKiAgICBCaXQgMCBFRkxYX09WRkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9PVkZFICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMyMEQ6IEVGTFggRklGTyBPdmVyZmxvdyBFcnJvciBJbmRpY2F0aW9uCisgKiAgICBCaXQgMCBFRkxYX09WRkkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfRUZMWF9PVkZJICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMyMTA6IEVGTFggQ2hhbm5lbCBQcm92aXNpb24KKyAqICAgIEJpdCAwIEVGTFhfUFJPVgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19FRkxYX1BST1YgIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MzI4MDogUEw0SURVIENvbmZpZ3VyYXRpb24KKyAqICAgIEJpdCAyIFBMNElEVV9TWU5DSF9PTl9UUkFJTgorICogICAgQml0IDEgUEw0SURVX0VOX1BPUlRTCisgKiAgICBCaXQgMCBQTDRJRFVfRU5fREZXRAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJRFVfU1lOQ0hfT05fVFJBSU4gIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElEVV9FTl9QT1JUUyAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUEw0SURVX0VOX0RGV0QgICAgICAgICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMyODI6IFBMNElEVSBJbnRlcnJ1cHQgTWFzaworICogICAgQml0IDEgUEw0SURVX0RJUDRFCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1BMNElEVV9ESVA0RSAgICAgICAweDAwMDIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDMyODM6IFBMNElEVSBJbnRlcnJ1cHQKKyAqICAgIEJpdCAxIFBMNElEVV9ESVA0SQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19QTDRJRFVfRElQNEkgICAgICAgMHgwMDAyCiAKICNlbmRpZiAvKiBfQ1hHQl9TVU5JMXgxMEdFWFBfUkVHU19IXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3RwLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdHAuYwpAQCAtMCwwICsxLDE3OCBAQAorLyogJERhdGU6IDIwMDYvMDIvMDcgMDQ6MjE6NTQgJCAkUkNTZmlsZTogdHAuYyx2ICQgJFJldmlzaW9uOiAxLjczICQgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAidHAuaCIKKyNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV8xRworI2luY2x1ZGUgImZwZ2FfZGVmcy5oIgorI2VuZGlmCisKK3N0cnVjdCBwZXRwIHsKKwlhZGFwdGVyX3QgKmFkYXB0ZXI7Cit9OworCisvKiBQYXVzZSBkZWFkbG9jayBhdm9pZGFuY2UgcGFyYW1ldGVycyAqLworI2RlZmluZSBEUk9QX01TRUMgMTYKKyNkZWZpbmUgRFJPUF9QS1RTX0NOVCAgMQorCitzdGF0aWMgdm9pZCB0cF9pbml0KGFkYXB0ZXJfdCAqIGFwLCBjb25zdCBzdHJ1Y3QgdHBfcGFyYW1zICpwLAorCQkgICAgdW5zaWduZWQgaW50IHRwX2NsaykKK3sKKwlpZiAodDFfaXNfYXNpYyhhcCkpIHsKKwkJdTMyIHZhbDsKKworCQl2YWwgPSBGX1RQX0lOX0NTUElfQ1BMIHwgRl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0gfAorCQkgICAgRl9UUF9JTl9DU1BJX0NIRUNLX1RDUF9DU1VNIHwgRl9UUF9JTl9FU1BJX0VUSEVSTkVUOworCQlpZiAoIXAtPnBtX3NpemUpCisJCQl2YWwgfD0gRl9PRkZMT0FEX0RJU0FCTEU7CisJCWVsc2UKKwkJCXZhbCB8PSBGX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSB8CisJCQkgICAgRl9UUF9JTl9FU1BJX0NIRUNLX1RDUF9DU1VNOworCQl3cml0ZWwodmFsLCBhcC0+cmVncyArIEFfVFBfSU5fQ09ORklHKTsKKwkJd3JpdGVsKEZfVFBfT1VUX0NTUElfQ1BMIHwKKwkJICAgICAgIEZfVFBfT1VUX0VTUElfRVRIRVJORVQgfAorCQkgICAgICAgRl9UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNIHwKKwkJICAgICAgIEZfVFBfT1VUX0VTUElfR0VORVJBVEVfVENQX0NTVU0sCisJCSAgICAgICBhcC0+cmVncyArIEFfVFBfT1VUX0NPTkZJRyk7CisJCXdyaXRlbChWX0lQX1RUTCg2NCkgfAorCQkgICAgICAgRl9QQVRIX01UVSAvKiBJUCBERiBiaXQgKi8gIHwKKwkJICAgICAgIFZfNVRVUExFX0xPT0tVUChwLT51c2VfNXR1cGxlX21vZGUpIHwKKwkJICAgICAgIFZfU1lOX0NPT0tJRV9QQVJBTUVURVIoMjkpLAorCQkgICAgICAgYXAtPnJlZ3MgKyBBX1RQX0dMT0JBTF9DT05GSUcpOworCQkvKgorCQkgKiBFbmFibGUgcGF1c2UgZnJhbWUgZGVhZGxvY2sgcHJldmVudGlvbi4KKwkJICovCisJCWlmIChpc19UMihhcCkgJiYgYXAtPnBhcmFtcy5ucG9ydHMgPiAxKSB7CisJCQl1MzIgZHJvcF90aWNrcyA9IERST1BfTVNFQyAqICh0cF9jbGsgLyAxMDAwKTsKKworCQkJd3JpdGVsKEZfRU5BQkxFX1RYX0RST1AgfCBGX0VOQUJMRV9UWF9FUlJPUiB8CisJCQkgICAgICAgVl9EUk9QX1RJQ0tTX0NOVChkcm9wX3RpY2tzKSB8CisJCQkgICAgICAgVl9OVU1fUEtUU19EUk9QUEVEKERST1BfUEtUU19DTlQpLAorCQkJICAgICAgIGFwLT5yZWdzICsgQV9UUF9UWF9EUk9QX0NPTkZJRyk7CisJCX0KKworCX0KK30KKwordm9pZCB0MV90cF9kZXN0cm95KHN0cnVjdCBwZXRwICp0cCkKK3sKKwlrZnJlZSh0cCk7Cit9CisKK3N0cnVjdCBwZXRwICpfX2RldmluaXQgdDFfdHBfY3JlYXRlKGFkYXB0ZXJfdCAqIGFkYXB0ZXIsIHN0cnVjdCB0cF9wYXJhbXMgKnApCit7CisJc3RydWN0IHBldHAgKnRwID0ga3phbGxvYyhzaXplb2YoKnRwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0cC0+YWRhcHRlciA9IGFkYXB0ZXI7CisKKwlyZXR1cm4gdHA7Cit9CisKK3ZvaWQgdDFfdHBfaW50cl9lbmFibGUoc3RydWN0IHBldHAgKnRwKQoreworCXUzMiB0cF9pbnRyID0gcmVhZGwodHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisKKyNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV8xRworCWlmICghdDFfaXNfYXNpYyh0cC0+YWRhcHRlcikpIHsKKwkJLyogRlBHQSAqLworCQl3cml0ZWwoMHhmZmZmZmZmZiwKKwkJICAgICAgIHRwLT5hZGFwdGVyLT5yZWdzICsgRlBHQV9UUF9BRERSX0lOVEVSUlVQVF9FTkFCTEUpOworCQl3cml0ZWwodHBfaW50ciB8IEZQR0FfUENJWF9JTlRFUlJVUFRfVFAsCisJCSAgICAgICB0cC0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyogV2UgZG9uJ3QgdXNlIGFueSBUUCBpbnRlcnJ1cHRzICovCisJCXdyaXRlbCgwLCB0cC0+YWRhcHRlci0+cmVncyArIEFfVFBfSU5UX0VOQUJMRSk7CisJCXdyaXRlbCh0cF9pbnRyIHwgRl9QTF9JTlRSX1RQLAorCQkgICAgICAgdHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisJfQorfQorCit2b2lkIHQxX3RwX2ludHJfZGlzYWJsZShzdHJ1Y3QgcGV0cCAqdHApCit7CisJdTMyIHRwX2ludHIgPSByZWFkbCh0cC0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworI2lmZGVmIENPTkZJR19DSEVMU0lPX1QxXzFHCisJaWYgKCF0MV9pc19hc2ljKHRwLT5hZGFwdGVyKSkgeworCQkvKiBGUEdBICovCisJCXdyaXRlbCgwLCB0cC0+YWRhcHRlci0+cmVncyArIEZQR0FfVFBfQUREUl9JTlRFUlJVUFRfRU5BQkxFKTsKKwkJd3JpdGVsKHRwX2ludHIgJiB+RlBHQV9QQ0lYX0lOVEVSUlVQVF9UUCwKKwkJICAgICAgIHRwLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCX0gZWxzZQorI2VuZGlmCisJeworCQl3cml0ZWwoMCwgdHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1RQX0lOVF9FTkFCTEUpOworCQl3cml0ZWwodHBfaW50ciAmIH5GX1BMX0lOVFJfVFAsCisJCSAgICAgICB0cC0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwl9Cit9CisKK3ZvaWQgdDFfdHBfaW50cl9jbGVhcihzdHJ1Y3QgcGV0cCAqdHApCit7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKKwlpZiAoIXQxX2lzX2FzaWModHAtPmFkYXB0ZXIpKSB7CisJCXdyaXRlbCgweGZmZmZmZmZmLAorCQkgICAgICAgdHAtPmFkYXB0ZXItPnJlZ3MgKyBGUEdBX1RQX0FERFJfSU5URVJSVVBUX0NBVVNFKTsKKwkJd3JpdGVsKEZQR0FfUENJWF9JTlRFUlJVUFRfVFAsIHRwLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwl3cml0ZWwoMHhmZmZmZmZmZiwgdHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1RQX0lOVF9DQVVTRSk7CisJd3JpdGVsKEZfUExfSU5UUl9UUCwgdHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKK30KKworaW50IHQxX3RwX2ludHJfaGFuZGxlcihzdHJ1Y3QgcGV0cCAqdHApCit7CisJdTMyIGNhdXNlOworCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKKwkvKiBGUEdBIGRvZXNuJ3Qgc3VwcG9ydCBUUCBpbnRlcnJ1cHRzLiAqLworCWlmICghdDFfaXNfYXNpYyh0cC0+YWRhcHRlcikpCisJCXJldHVybiAxOworI2VuZGlmCisKKwljYXVzZSA9IHJlYWRsKHRwLT5hZGFwdGVyLT5yZWdzICsgQV9UUF9JTlRfQ0FVU0UpOworCXdyaXRlbChjYXVzZSwgdHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1RQX0lOVF9DQVVTRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jc3VtX29mZmxvYWQoc3RydWN0IHBldHAgKnRwLCB1MzIgY3N1bV9iaXQsIGludCBlbmFibGUpCit7CisJdTMyIHZhbCA9IHJlYWRsKHRwLT5hZGFwdGVyLT5yZWdzICsgQV9UUF9HTE9CQUxfQ09ORklHKTsKKworCWlmIChlbmFibGUpCisJCXZhbCB8PSBjc3VtX2JpdDsKKwllbHNlCisJCXZhbCAmPSB+Y3N1bV9iaXQ7CisJd3JpdGVsKHZhbCwgdHAtPmFkYXB0ZXItPnJlZ3MgKyBBX1RQX0dMT0JBTF9DT05GSUcpOworfQorCit2b2lkIHQxX3RwX3NldF9pcF9jaGVja3N1bV9vZmZsb2FkKHN0cnVjdCBwZXRwICp0cCwgaW50IGVuYWJsZSkKK3sKKwlzZXRfY3N1bV9vZmZsb2FkKHRwLCBGX0lQX0NTVU0sIGVuYWJsZSk7Cit9CisKK3ZvaWQgdDFfdHBfc2V0X3VkcF9jaGVja3N1bV9vZmZsb2FkKHN0cnVjdCBwZXRwICp0cCwgaW50IGVuYWJsZSkKK3sKKwlzZXRfY3N1bV9vZmZsb2FkKHRwLCBGX1VEUF9DU1VNLCBlbmFibGUpOworfQorCit2b2lkIHQxX3RwX3NldF90Y3BfY2hlY2tzdW1fb2ZmbG9hZChzdHJ1Y3QgcGV0cCAqdHAsIGludCBlbmFibGUpCit7CisJc2V0X2NzdW1fb2ZmbG9hZCh0cCwgRl9UQ1BfQ1NVTSwgZW5hYmxlKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgVFAgc3RhdGUuICB0cF9wYXJhbXMgY29udGFpbnMgaW5pdGlhbCBzZXR0aW5ncyBmb3Igc29tZSBUUAorICogcGFyYW1ldGVycywgcGFydGljdWxhcmx5IHRoZSBvbmUtdGltZSBQTSBhbmQgQ00gc2V0dGluZ3MuCisgKi8KK2ludCB0MV90cF9yZXNldChzdHJ1Y3QgcGV0cCAqdHAsIHN0cnVjdCB0cF9wYXJhbXMgKnAsIHVuc2lnbmVkIGludCB0cF9jbGspCit7CisJYWRhcHRlcl90ICphZGFwdGVyID0gdHAtPmFkYXB0ZXI7CisKKwl0cF9pbml0KGFkYXB0ZXIsIHAsIHRwX2Nsayk7CisJd3JpdGVsKEZfVFBfUkVTRVQsIGFkYXB0ZXItPnJlZ3MgKyAgQV9UUF9SRVNFVCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3RwLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL3RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmYzcxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdHAuaApAQCAtMCwwICsxLDczIEBACisvKiAkRGF0ZTogMjAwNS8wMy8wNyAyMzo1OTowNSAkICRSQ1NmaWxlOiB0cC5oLHYgJCAkUmV2aXNpb246IDEuMjAgJCAqLworI2lmbmRlZiBDSEVMU0lPX1RQX0gKKyNkZWZpbmUgQ0hFTFNJT19UUF9ICisKKyNpbmNsdWRlICJjb21tb24uaCIKKworI2RlZmluZSBUUF9NQVhfUlhfQ09BTEVTQ0lOR19TSVpFIDE2MjI0VQorCitzdHJ1Y3QgdHBfbWliX3N0YXRpc3RpY3MgeworCisJLyogSVAgKi8KKwl1MzIgaXBJblJlY2VpdmVfaGk7CisJdTMyIGlwSW5SZWNlaXZlX2xvOworCXUzMiBpcEluSGRyRXJyb3JzX2hpOworCXUzMiBpcEluSGRyRXJyb3JzX2xvOworCXUzMiBpcEluQWRkckVycm9yc19oaTsKKwl1MzIgaXBJbkFkZHJFcnJvcnNfbG87CisJdTMyIGlwSW5Vbmtub3duUHJvdG9zX2hpOworCXUzMiBpcEluVW5rbm93blByb3Rvc19sbzsKKwl1MzIgaXBJbkRpc2NhcmRzX2hpOworCXUzMiBpcEluRGlzY2FyZHNfbG87CisJdTMyIGlwSW5EZWxpdmVyc19oaTsKKwl1MzIgaXBJbkRlbGl2ZXJzX2xvOworCXUzMiBpcE91dFJlcXVlc3RzX2hpOworCXUzMiBpcE91dFJlcXVlc3RzX2xvOworCXUzMiBpcE91dERpc2NhcmRzX2hpOworCXUzMiBpcE91dERpc2NhcmRzX2xvOworCXUzMiBpcE91dE5vUm91dGVzX2hpOworCXUzMiBpcE91dE5vUm91dGVzX2xvOworCXUzMiBpcFJlYXNtVGltZW91dDsKKwl1MzIgaXBSZWFzbVJlcWRzOworCXUzMiBpcFJlYXNtT0tzOworCXUzMiBpcFJlYXNtRmFpbHM7CisKKwl1MzIgcmVzZXJ2ZWRbOF07CisKKwkvKiBUQ1AgKi8KKwl1MzIgdGNwQWN0aXZlT3BlbnM7CisJdTMyIHRjcFBhc3NpdmVPcGVuczsKKwl1MzIgdGNwQXR0ZW1wdEZhaWxzOworCXUzMiB0Y3BFc3RhYlJlc2V0czsKKwl1MzIgdGNwT3V0UnN0czsKKwl1MzIgdGNwQ3VyckVzdGFiOworCXUzMiB0Y3BJblNlZ3NfaGk7CisJdTMyIHRjcEluU2Vnc19sbzsKKwl1MzIgdGNwT3V0U2Vnc19oaTsKKwl1MzIgdGNwT3V0U2Vnc19sbzsKKwl1MzIgdGNwUmV0cmFuc1NlZ19oaTsKKwl1MzIgdGNwUmV0cmFuc1NlZ19sbzsKKwl1MzIgdGNwSW5FcnJzX2hpOworCXUzMiB0Y3BJbkVycnNfbG87CisJdTMyIHRjcFJ0b01pbjsKKwl1MzIgdGNwUnRvTWF4OworfTsKKworc3RydWN0IHBldHA7CitzdHJ1Y3QgdHBfcGFyYW1zOworCitzdHJ1Y3QgcGV0cCAqdDFfdHBfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHRwX3BhcmFtcyAqcCk7Cit2b2lkIHQxX3RwX2Rlc3Ryb3koc3RydWN0IHBldHAgKnRwKTsKKwordm9pZCB0MV90cF9pbnRyX2Rpc2FibGUoc3RydWN0IHBldHAgKnRwKTsKK3ZvaWQgdDFfdHBfaW50cl9lbmFibGUoc3RydWN0IHBldHAgKnRwKTsKK3ZvaWQgdDFfdHBfaW50cl9jbGVhcihzdHJ1Y3QgcGV0cCAqdHApOworaW50IHQxX3RwX2ludHJfaGFuZGxlcihzdHJ1Y3QgcGV0cCAqdHApOworCit2b2lkIHQxX3RwX2dldF9taWJfc3RhdGlzdGljcyhhZGFwdGVyX3QgKmFkYXAsIHN0cnVjdCB0cF9taWJfc3RhdGlzdGljcyAqdHBzKTsKK3ZvaWQgdDFfdHBfc2V0X3VkcF9jaGVja3N1bV9vZmZsb2FkKHN0cnVjdCBwZXRwICp0cCwgaW50IGVuYWJsZSk7Cit2b2lkIHQxX3RwX3NldF90Y3BfY2hlY2tzdW1fb2ZmbG9hZChzdHJ1Y3QgcGV0cCAqdHAsIGludCBlbmFibGUpOwordm9pZCB0MV90cF9zZXRfaXBfY2hlY2tzdW1fb2ZmbG9hZChzdHJ1Y3QgcGV0cCAqdHAsIGludCBlbmFibGUpOworaW50IHQxX3RwX3NldF9jb2FsZXNjaW5nX3NpemUoc3RydWN0IHBldHAgKnRwLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitpbnQgdDFfdHBfcmVzZXQoc3RydWN0IHBldHAgKnRwLCBzdHJ1Y3QgdHBfcGFyYW1zICpwLCB1bnNpZ25lZCBpbnQgdHBfY2xrKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M3MzI2LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRjM2IxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M3MzI2LmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qICREYXRlOiAyMDA2LzA0LzI4IDE5OjIwOjA2ICQgJFJDU2ZpbGU6IHZzYzczMjYuYyx2ICQgJFJldmlzaW9uOiAxLjE5ICQgKi8KKworLyogRHJpdmVyIGZvciBWaXRlc3NlIFZTQzczMjYgKFNjaGF1bWJ1cmcpIE1BQyAqLworCisjaW5jbHVkZSAiZ21hYy5oIgorI2luY2x1ZGUgImVsbWVyMC5oIgorI2luY2x1ZGUgInZzYzczMjZfcmVnLmgiCisKKy8qIFVwZGF0ZSBmYXN0IGNoYW5naW5nIHN0YXRpc3RpY3MgZXZlcnkgMTUgc2Vjb25kcyAqLworI2RlZmluZSBTVEFUU19USUNLX1NFQ1MgMTUKKy8qIDMwIG1pbnV0ZXMgZm9yIGZ1bGwgc3RhdGlzdGljcyB1cGRhdGUgKi8KKyNkZWZpbmUgTUFKT1JfVVBEQVRFX1RJQ0tTICgxODAwIC8gU1RBVFNfVElDS19TRUNTKQorCisjZGVmaW5lIE1BWF9NVFUgOTYwMAorCisvKiBUaGUgZWdyZXNzIFdNIHZhbHVlIDB4MDFhMDFmZmYgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHRoZQorICogaW50ZXJmYWNlIGlzIGRvd24gKE1BQyBwb3J0IGRpc2FibGVkKS4gVGhpcyBpcyBhIHdvcmthcm91bmQKKyAqIGZvciBkaXNhYmxpbmcgdGhlIFQyL01BQyBmbG93LWNvbnRyb2wuIFdoZW4gdGhlIGludGVyZmFjZSBpcworICogZW5hYmxlZCwgdGhlIFdNIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gMHgwMTRhMDNGMC4KKyAqLworI2RlZmluZSBXTV9ESVNBQkxFCTB4MDFhMDFmZmYKKyNkZWZpbmUgV01fRU5BQkxFCTB4MDE0YTAzRjAKKworc3RydWN0IGluaXRfdGFibGUgeworCXUzMiBhZGRyOworCXUzMiBkYXRhOworfTsKKworc3RydWN0IF9jbWFjX2luc3RhbmNlIHsKKwl1MzIgaW5kZXg7CisJdTMyIHRpY2tzOworfTsKKworI2RlZmluZSBJTklUQkxPQ0tfU0xFRVAJMHhmZmZmZmZmZgorCitzdGF0aWMgdm9pZCB2c2NfcmVhZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKnZhbCkKK3sKKwl1MzIgc3RhdHVzLCB2bG8sIHZoaTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWFjX2xvY2spOworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIChhZGRyIDw8IDIpICsgNCwgJnZsbyk7CisJaSA9IDA7CisJZG8geworCQl0MV90cGlfcmVhZChhZGFwdGVyLCAoUkVHX0xPQ0FMX1NUQVRVUyA8PCAyKSArIDQsICZ2bG8pOworCQl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfTE9DQUxfU1RBVFVTIDw8IDIsICZ2aGkpOworCQlzdGF0dXMgPSAodmhpIDw8IDE2KSB8IHZsbzsKKwkJaSsrOworCX0gd2hpbGUgKCgoc3RhdHVzICYgMSkgPT0gMCkgJiYgKGkgPCA1MCkpOworCWlmIChpID09IDUwKQorCQlDSF9FUlIoIkludmFsaWQgdHBpIHJlYWQgZnJvbSBNQUMsIGJyZWFraW5nIGxvb3AuXG4iKTsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIChSRUdfTE9DQUxfREFUQSA8PCAyKSArIDQsICZ2bG8pOworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIFJFR19MT0NBTF9EQVRBIDw8IDIsICZ2aGkpOworCisJKnZhbCA9ICh2aGkgPDwgMTYpIHwgdmxvOworCisJLyogQ0hfRVJSKCJyZDogYmxvY2s6IDB4JXggIHN1YmxvY2s6IDB4JXggIHJlZzogMHgleCAgZGF0YTogMHgleFxuIiwKKwkJKChhZGRyJjB4ZTAwMCk+PjEzKSwgKChhZGRyJjB4MWUwMCk+PjkpLAorCQkoKGFkZHImMHgwMWZlKT4+MSksICp2YWwpOyAqLworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tYWNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHZzY193cml0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgZGF0YSkKK3sKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1hY19sb2NrKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgKGFkZHIgPDwgMikgKyA0LCBkYXRhICYgMHhGRkZGKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgYWRkciA8PCAyLCAoZGF0YSA+PiAxNikgJiAweEZGRkYpOworCS8qIENIX0VSUigid3I6IGJsb2NrOiAweCV4ICBzdWJsb2NrOiAweCV4ICByZWc6IDB4JXggIGRhdGE6IDB4JXhcbiIsCisJCSgoYWRkciYweGUwMDApPj4xMyksICgoYWRkciYweDFlMDApPj45KSwKKwkJKChhZGRyJjB4MDFmZSk+PjEpLCBkYXRhKTsgKi8KKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWFjX2xvY2spOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBNQUMuICBUaGlzIHdpcGVzIG91dCAqYWxsKiBjb25maWd1cmF0aW9uLiAqLworc3RhdGljIHZvaWQgdnNjNzMyNl9mdWxsX3Jlc2V0KGFkYXB0ZXJfdCogYWRhcHRlcikKK3sKKwl1MzIgdmFsOworCXUzMiByZXN1bHQgPSAweGZmZmY7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCXZhbCAmPSB+MTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCXVkZWxheSgyKTsKKwl2YWwgfD0gMHgxOwkvKiBFbmFibGUgbWFjIE1BQyBpdHNlbGYgKi8KKwl2YWwgfD0gMHg4MDA7CS8qIFR1cm4gb2ZmIHRoZSByZWQgTEVEICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwltZGVsYXkoMSk7CisJdnNjX3dyaXRlKGFkYXB0ZXIsIFJFR19TV19SRVNFVCwgMHg4MDAwMDAwMSk7CisJZG8geworCQltZGVsYXkoMSk7CisJCXZzY19yZWFkKGFkYXB0ZXIsIFJFR19TV19SRVNFVCwgJnJlc3VsdCk7CisJfSB3aGlsZSAocmVzdWx0ICE9IDB4MCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5pdF90YWJsZSB2c2M3MzI2X3Jlc2V0W10gPSB7CisJeyAgICAgIFJFR19JRkFDRV9NT0RFLCAweDAwMDAwMDAwIH0sCisJeyAgICAgICAgIFJFR19DUkNfQ0ZHLCAweDAwMDAwMDIwIH0sCisJeyAgIFJFR19QTExfQ0xLX1NQRUVELCAweDAwMDUwYzAwIH0sCisJeyAgIFJFR19QTExfQ0xLX1NQRUVELCAweDAwMDUwYzAwIH0sCisJeyAgICAgICAgICAgIFJFR19NU0NILCAweDAwMDAyZjE0IH0sCisJeyAgICAgICBSRUdfU1BJNF9NSVNDLCAweDAwMDQwNDA5IH0sCisJeyAgICAgUkVHX1NQSTRfREVTS0VXLCAweDAwMDgwMDAwIH0sCisJeyBSRUdfU1BJNF9JTkdfU0VUVVAyLCAweDA4MDgwMDA0IH0sCisJeyBSRUdfU1BJNF9JTkdfU0VUVVAwLCAweDA0MTExMDA0IH0sCisJeyBSRUdfU1BJNF9FR1JfU0VUVVAwLCAweDgwMDAxYTA0IH0sCisJeyBSRUdfU1BJNF9JTkdfU0VUVVAxLCAweDAyMDEwMDAwIH0sCisJeyAgICAgIFJFR19BR0VfSU5DKDApLCAweDAwMDAwMDAwIH0sCisJeyAgICAgIFJFR19BR0VfSU5DKDEpLCAweDAwMDAwMDAwIH0sCisJeyAgICAgUkVHX0lOR19DT05UUk9MLCAweDBhMjAwMDExIH0sCisJeyAgICAgUkVHX0VHUl9DT05UUk9MLCAweGEwMDEwMDkxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGluaXRfdGFibGUgdnNjNzMyNl9wb3J0aW5pdFs0XVsyMl0gPSB7CisJewkvKiBQb3J0IDAgKi8KKwkJCS8qIEZJRk8gc2V0dXAgKi8KKwkJeyAgICAgICAgICAgUkVHX0RCRygwKSwgMHgwMDAwMDRmMCB9LAorCQl7ICAgICAgICAgICBSRUdfSERYKDApLCAweDAwMDczMTAxIH0sCisJCXsgICAgICAgIFJFR19URVNUKDAsMCksIDB4MDAwMDAwMjIgfSwKKwkJeyAgICAgICAgUkVHX1RFU1QoMSwwKSwgMHgwMDAwMDAyMiB9LAorCQl7ICBSRUdfVE9QX0JPVFRPTSgwLDApLCAweDAwM2YwMDAwIH0sCisJCXsgIFJFR19UT1BfQk9UVE9NKDEsMCksIDB4MDAxMjAwMDAgfSwKKwkJeyBSRUdfSElHSF9MT1dfV00oMCwwKSwgMHgwNzQ2MDc1NyB9LAorCQl7IFJFR19ISUdIX0xPV19XTSgxLDApLCBXTV9ESVNBQkxFIH0sCisJCXsgICBSRUdfQ1RfVEhSSExEKDAsMCksIDB4MDAwMDAwMDAgfSwKKwkJeyAgIFJFR19DVF9USFJITEQoMSwwKSwgMHgwMDAwMDAwMCB9LAorCQl7ICAgICAgICAgUkVHX0JVQ0tFKDApLCAweDAwMDJmZmZmIH0sCisJCXsgICAgICAgICBSRUdfQlVDS0koMCksIDB4MDAwMmZmZmYgfSwKKwkJeyAgICAgICAgUkVHX1RFU1QoMCwwKSwgMHgwMDAwMDAyMCB9LAorCQl7ICAgICAgICBSRUdfVEVTVCgxLDApLCAweDAwMDAwMDIwIH0sCisJCQkvKiBQb3J0IGNvbmZpZyAqLworCQl7ICAgICAgIFJFR19NQVhfTEVOKDApLCAweDAwMDAyNzEwIH0sCisJCXsgICAgIFJFR19QT1JUX0ZBSUwoMCksIDB4MDAwMDAwMDIgfSwKKwkJeyAgICBSRUdfTk9STUFMSVpFUigwKSwgMHgwMDAwMGE2NCB9LAorCQl7ICAgICAgICBSRUdfREVOT1JNKDApLCAweDAwMDAwMDEwIH0sCisJCXsgICAgIFJFR19TVElDS19CSVQoMCksIDB4MDNiYWEzNzAgfSwKKwkJeyAgICAgUkVHX0RFVl9TRVRVUCgwKSwgMHgwMDAwMDA4MyB9LAorCQl7ICAgICBSRUdfREVWX1NFVFVQKDApLCAweDAwMDAwMDgyIH0sCisJCXsgICAgICBSRUdfTU9ERV9DRkcoMCksIDB4MDIwMDI1OWYgfSwKKwl9LAorCXsJLyogUG9ydCAxICovCisJCQkvKiBGSUZPIHNldHVwICovCisJCXsgICAgICAgICAgIFJFR19EQkcoMSksIDB4MDAwMDA0ZjAgfSwKKwkJeyAgICAgICAgICAgUkVHX0hEWCgxKSwgMHgwMDA3MzEwMSB9LAorCQl7ICAgICAgICBSRUdfVEVTVCgwLDEpLCAweDAwMDAwMDIyIH0sCisJCXsgICAgICAgIFJFR19URVNUKDEsMSksIDB4MDAwMDAwMjIgfSwKKwkJeyAgUkVHX1RPUF9CT1RUT00oMCwxKSwgMHgwMDdlMDAzZiB9LAorCQl7ICBSRUdfVE9QX0JPVFRPTSgxLDEpLCAweDAwMjQwMDEyIH0sCisJCXsgUkVHX0hJR0hfTE9XX1dNKDAsMSksIDB4MDc0NjA3NTcgfSwKKwkJeyBSRUdfSElHSF9MT1dfV00oMSwxKSwgV01fRElTQUJMRSB9LAorCQl7ICAgUkVHX0NUX1RIUkhMRCgwLDEpLCAweDAwMDAwMDAwIH0sCisJCXsgICBSRUdfQ1RfVEhSSExEKDEsMSksIDB4MDAwMDAwMDAgfSwKKwkJeyAgICAgICAgIFJFR19CVUNLRSgxKSwgMHgwMDAyZmZmZiB9LAorCQl7ICAgICAgICAgUkVHX0JVQ0tJKDEpLCAweDAwMDJmZmZmIH0sCisJCXsgICAgICAgIFJFR19URVNUKDAsMSksIDB4MDAwMDAwMjAgfSwKKwkJeyAgICAgICAgUkVHX1RFU1QoMSwxKSwgMHgwMDAwMDAyMCB9LAorCQkJLyogUG9ydCBjb25maWcgKi8KKwkJeyAgICAgICBSRUdfTUFYX0xFTigxKSwgMHgwMDAwMjcxMCB9LAorCQl7ICAgICBSRUdfUE9SVF9GQUlMKDEpLCAweDAwMDAwMDAyIH0sCisJCXsgICAgUkVHX05PUk1BTElaRVIoMSksIDB4MDAwMDBhNjQgfSwKKwkJeyAgICAgICAgUkVHX0RFTk9STSgxKSwgMHgwMDAwMDAxMCB9LAorCQl7ICAgICBSRUdfU1RJQ0tfQklUKDEpLCAweDAzYmFhMzcwIH0sCisJCXsgICAgIFJFR19ERVZfU0VUVVAoMSksIDB4MDAwMDAwODMgfSwKKwkJeyAgICAgUkVHX0RFVl9TRVRVUCgxKSwgMHgwMDAwMDA4MiB9LAorCQl7ICAgICAgUkVHX01PREVfQ0ZHKDEpLCAweDAyMDAyNTlmIH0sCisJfSwKKwl7CS8qIFBvcnQgMiAqLworCQkJLyogRklGTyBzZXR1cCAqLworCQl7ICAgICAgICAgICBSRUdfREJHKDIpLCAweDAwMDAwNGYwIH0sCisJCXsgICAgICAgICAgIFJFR19IRFgoMiksIDB4MDAwNzMxMDEgfSwKKwkJeyAgICAgICAgUkVHX1RFU1QoMCwyKSwgMHgwMDAwMDAyMiB9LAorCQl7ICAgICAgICBSRUdfVEVTVCgxLDIpLCAweDAwMDAwMDIyIH0sCisJCXsgIFJFR19UT1BfQk9UVE9NKDAsMiksIDB4MDBiZDAwN2UgfSwKKwkJeyAgUkVHX1RPUF9CT1RUT00oMSwyKSwgMHgwMDM2MDAyNCB9LAorCQl7IFJFR19ISUdIX0xPV19XTSgwLDIpLCAweDA3NDYwNzU3IH0sCisJCXsgUkVHX0hJR0hfTE9XX1dNKDEsMiksIFdNX0RJU0FCTEUgfSwKKwkJeyAgIFJFR19DVF9USFJITEQoMCwyKSwgMHgwMDAwMDAwMCB9LAorCQl7ICAgUkVHX0NUX1RIUkhMRCgxLDIpLCAweDAwMDAwMDAwIH0sCisJCXsgICAgICAgICBSRUdfQlVDS0UoMiksIDB4MDAwMmZmZmYgfSwKKwkJeyAgICAgICAgIFJFR19CVUNLSSgyKSwgMHgwMDAyZmZmZiB9LAorCQl7ICAgICAgICBSRUdfVEVTVCgwLDIpLCAweDAwMDAwMDIwIH0sCisJCXsgICAgICAgIFJFR19URVNUKDEsMiksIDB4MDAwMDAwMjAgfSwKKwkJCS8qIFBvcnQgY29uZmlnICovCisJCXsgICAgICAgUkVHX01BWF9MRU4oMiksIDB4MDAwMDI3MTAgfSwKKwkJeyAgICAgUkVHX1BPUlRfRkFJTCgyKSwgMHgwMDAwMDAwMiB9LAorCQl7ICAgIFJFR19OT1JNQUxJWkVSKDIpLCAweDAwMDAwYTY0IH0sCisJCXsgICAgICAgIFJFR19ERU5PUk0oMiksIDB4MDAwMDAwMTAgfSwKKwkJeyAgICAgUkVHX1NUSUNLX0JJVCgyKSwgMHgwM2JhYTM3MCB9LAorCQl7ICAgICBSRUdfREVWX1NFVFVQKDIpLCAweDAwMDAwMDgzIH0sCisJCXsgICAgIFJFR19ERVZfU0VUVVAoMiksIDB4MDAwMDAwODIgfSwKKwkJeyAgICAgIFJFR19NT0RFX0NGRygyKSwgMHgwMjAwMjU5ZiB9LAorCX0sCisJewkvKiBQb3J0IDMgKi8KKwkJCS8qIEZJRk8gc2V0dXAgKi8KKwkJeyAgICAgICAgICAgUkVHX0RCRygzKSwgMHgwMDAwMDRmMCB9LAorCQl7ICAgICAgICAgICBSRUdfSERYKDMpLCAweDAwMDczMTAxIH0sCisJCXsgICAgICAgIFJFR19URVNUKDAsMyksIDB4MDAwMDAwMjIgfSwKKwkJeyAgICAgICAgUkVHX1RFU1QoMSwzKSwgMHgwMDAwMDAyMiB9LAorCQl7ICBSRUdfVE9QX0JPVFRPTSgwLDMpLCAweDAwZmMwMGJkIH0sCisJCXsgIFJFR19UT1BfQk9UVE9NKDEsMyksIDB4MDA0ODAwMzYgfSwKKwkJeyBSRUdfSElHSF9MT1dfV00oMCwzKSwgMHgwNzQ2MDc1NyB9LAorCQl7IFJFR19ISUdIX0xPV19XTSgxLDMpLCBXTV9ESVNBQkxFIH0sCisJCXsgICBSRUdfQ1RfVEhSSExEKDAsMyksIDB4MDAwMDAwMDAgfSwKKwkJeyAgIFJFR19DVF9USFJITEQoMSwzKSwgMHgwMDAwMDAwMCB9LAorCQl7ICAgICAgICAgUkVHX0JVQ0tFKDMpLCAweDAwMDJmZmZmIH0sCisJCXsgICAgICAgICBSRUdfQlVDS0koMyksIDB4MDAwMmZmZmYgfSwKKwkJeyAgICAgICAgUkVHX1RFU1QoMCwzKSwgMHgwMDAwMDAyMCB9LAorCQl7ICAgICAgICBSRUdfVEVTVCgxLDMpLCAweDAwMDAwMDIwIH0sCisJCQkvKiBQb3J0IGNvbmZpZyAqLworCQl7ICAgICAgIFJFR19NQVhfTEVOKDMpLCAweDAwMDAyNzEwIH0sCisJCXsgICAgIFJFR19QT1JUX0ZBSUwoMyksIDB4MDAwMDAwMDIgfSwKKwkJeyAgICBSRUdfTk9STUFMSVpFUigzKSwgMHgwMDAwMGE2NCB9LAorCQl7ICAgICAgICBSRUdfREVOT1JNKDMpLCAweDAwMDAwMDEwIH0sCisJCXsgICAgIFJFR19TVElDS19CSVQoMyksIDB4MDNiYWEzNzAgfSwKKwkJeyAgICAgUkVHX0RFVl9TRVRVUCgzKSwgMHgwMDAwMDA4MyB9LAorCQl7ICAgICBSRUdfREVWX1NFVFVQKDMpLCAweDAwMDAwMDgyIH0sCisJCXsgICAgICBSRUdfTU9ERV9DRkcoMyksIDB4MDIwMDI1OWYgfSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgcnVuX3RhYmxlKGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGluaXRfdGFibGUgKmliLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpYltpXS5hZGRyID09IElOSVRCTE9DS19TTEVFUCkgeworCQkJdWRlbGF5KCBpYltpXS5kYXRhICk7CisJCQlDSF9FUlIoInNsZWVwICVkIHVzXG4iLGliW2ldLmRhdGEpOworCQl9IGVsc2UgeworCQkJdnNjX3dyaXRlKCBhZGFwdGVyLCBpYltpXS5hZGRyLCBpYltpXS5kYXRhICk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYmlzdF9yZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBtb2R1bGVpZCwgaW50IGFkZHJlc3MpCit7CisJaW50IGRhdGE9MDsKKwl1MzIgcmVzdWx0PTA7CisKKwlpZigJKGFkZHJlc3MgIT0gMHgwKSAmJgorCQkoYWRkcmVzcyAhPSAweDEpICYmCisJCShhZGRyZXNzICE9IDB4MikgJiYKKwkJKGFkZHJlc3MgIT0gMHhkKSAmJgorCQkoYWRkcmVzcyAhPSAweGUpKQorCQkJQ0hfRVJSKCJObyBiaXN0IGFkZHJlc3M6IDB4JXhcbiIsIGFkZHJlc3MpOworCisJZGF0YSA9ICgoMHgwMCA8PCAyNCkgfCAoKGFkZHJlc3MgJiAweGZmKSA8PCAxNikgfCAoMHgwMCA8PCA4KSB8CisJCSgobW9kdWxlaWQgJiAweGZmKSA8PCAwKSk7CisJdnNjX3dyaXRlKGFkYXB0ZXIsIFJFR19SQU1fQklTVF9DTUQsIGRhdGEpOworCisJdWRlbGF5KDEwKTsKKworCXZzY19yZWFkKGFkYXB0ZXIsIFJFR19SQU1fQklTVF9SRVNVTFQsICZyZXN1bHQpOworCWlmKChyZXN1bHQgJiAoMTw8OSkpICE9IDB4MCkKKwkJQ0hfRVJSKCJTdGlsbCBpbiBiaXN0IHJlYWQ6IDB4JXhcbiIsIHJlc3VsdCk7CisJZWxzZSBpZigocmVzdWx0ICYgKDE8PDgpKSAhPSAweDApCisJCUNIX0VSUigiYmlzdCByZWFkIGVycm9yOiAweCV4XG4iLCByZXN1bHQpOworCisJcmV0dXJuKHJlc3VsdCAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGJpc3Rfd3IoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgbW9kdWxlaWQsIGludCBhZGRyZXNzLCBpbnQgdmFsdWUpCit7CisJaW50IGRhdGE9MDsKKwl1MzIgcmVzdWx0PTA7CisKKwlpZigJKGFkZHJlc3MgIT0gMHgwKSAmJgorCQkoYWRkcmVzcyAhPSAweDEpICYmCisJCShhZGRyZXNzICE9IDB4MikgJiYKKwkJKGFkZHJlc3MgIT0gMHhkKSAmJgorCQkoYWRkcmVzcyAhPSAweGUpKQorCQkJQ0hfRVJSKCJObyBiaXN0IGFkZHJlc3M6IDB4JXhcbiIsIGFkZHJlc3MpOworCisJaWYoIHZhbHVlPjI1NSApCisJCUNIX0VSUigiU3VzcGljaW91cyB3cml0ZSBvdXQgb2YgcmFuZ2UgdmFsdWU6IDB4JXhcbiIsIHZhbHVlKTsKKworCWRhdGEgPSAoKDB4MDEgPDwgMjQpIHwgKChhZGRyZXNzICYgMHhmZikgPDwgMTYpIHwgKHZhbHVlIDw8IDgpIHwKKwkJKChtb2R1bGVpZCAmIDB4ZmYpIDw8IDApKTsKKwl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX1JBTV9CSVNUX0NNRCwgZGF0YSk7CisKKwl1ZGVsYXkoNSk7CisKKwl2c2NfcmVhZChhZGFwdGVyLCBSRUdfUkFNX0JJU1RfQ01ELCAmcmVzdWx0KTsKKwlpZigocmVzdWx0ICYgKDE8PDI3KSkgIT0gMHgwKQorCQlDSF9FUlIoIlN0aWxsIGluIGJpc3Qgd3JpdGU6IDB4JXhcbiIsIHJlc3VsdCk7CisJZWxzZSBpZigocmVzdWx0ICYgKDE8PDI2KSkgIT0gMHgwKQorCQlDSF9FUlIoImJpc3Qgd3JpdGUgZXJyb3I6IDB4JXhcbiIsIHJlc3VsdCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX2Jpc3QoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgbW9kdWxlaWQpCit7CisJLypydW4gYmlzdCovCisJKHZvaWQpIGJpc3Rfd3IoYWRhcHRlcixtb2R1bGVpZCwgMHgwMCwgMHgwMik7CisJKHZvaWQpIGJpc3Rfd3IoYWRhcHRlcixtb2R1bGVpZCwgMHgwMSwgMHgwMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYmlzdChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBtb2R1bGVpZCkKK3sKKwlpbnQgcmVzdWx0PTA7CisJaW50IGNvbHVtbj0wOworCS8qY2hlY2sgYmlzdCovCisJcmVzdWx0ID0gYmlzdF9yZChhZGFwdGVyLG1vZHVsZWlkLCAweDAyKTsKKwljb2x1bW4gPSAoKGJpc3RfcmQoYWRhcHRlcixtb2R1bGVpZCwgMHgwZSk8PDgpICsKKwkJCShiaXN0X3JkKGFkYXB0ZXIsbW9kdWxlaWQsIDB4MGQpKSk7CisJaWYgKChyZXN1bHQgJiAzKSAhPSAweDMpCisJCUNIX0VSUigiUmVzdWx0OiAweCV4ICBCSVNUIGVycm9yIGluIHJhbSAlZCwgY29sdW1uOiAweCUwNHhcbiIsCisJCQlyZXN1bHQsIG1vZHVsZWlkLCBjb2x1bW4pOworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBlbmFibGVfbWVtKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IG1vZHVsZWlkKQoreworCS8qZW5hYmxlIG1lbSovCisJKHZvaWQpIGJpc3Rfd3IoYWRhcHRlcixtb2R1bGVpZCwgMHgwMCwgMHgwMCk7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHJ1bl9iaXN0X2FsbChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJaW50IHBvcnQ9MDsKKwl1MzIgdmFsPTA7CisKKwl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX01FTV9CSVNULCAweDUpOworCXZzY19yZWFkKGFkYXB0ZXIsIFJFR19NRU1fQklTVCwgJnZhbCk7CisKKwlmb3IocG9ydD0wOyBwb3J0PDEyOyBwb3J0KyspeworCQl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX0RFVl9TRVRVUChwb3J0KSwgMHgwKTsKKwl9CisKKwl1ZGVsYXkoMzAwKTsKKwl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX1NQSTRfTUlTQywgMHgwMDA0MDQwOSk7CisJdWRlbGF5KDMwMCk7CisKKwkodm9pZCkgcnVuX2Jpc3QoYWRhcHRlciwxMyk7CisJKHZvaWQpIHJ1bl9iaXN0KGFkYXB0ZXIsMTQpOworCSh2b2lkKSBydW5fYmlzdChhZGFwdGVyLDIwKTsKKwkodm9pZCkgcnVuX2Jpc3QoYWRhcHRlciwyMSk7CisJbWRlbGF5KDIwMCk7CisJKHZvaWQpIGNoZWNrX2Jpc3QoYWRhcHRlciwxMyk7CisJKHZvaWQpIGNoZWNrX2Jpc3QoYWRhcHRlciwxNCk7CisJKHZvaWQpIGNoZWNrX2Jpc3QoYWRhcHRlciwyMCk7CisJKHZvaWQpIGNoZWNrX2Jpc3QoYWRhcHRlciwyMSk7CisJdWRlbGF5KDEwMCk7CisJKHZvaWQpIGVuYWJsZV9tZW0oYWRhcHRlciwxMyk7CisJKHZvaWQpIGVuYWJsZV9tZW0oYWRhcHRlciwxNCk7CisJKHZvaWQpIGVuYWJsZV9tZW0oYWRhcHRlciwyMCk7CisJKHZvaWQpIGVuYWJsZV9tZW0oYWRhcHRlciwyMSk7CisJdWRlbGF5KDMwMCk7CisJdnNjX3dyaXRlKGFkYXB0ZXIsIFJFR19TUEk0X01JU0MsIDB4NjAwNDA0MDApOworCXVkZWxheSgzMDApOworCWZvcihwb3J0PTA7IHBvcnQ8MTI7IHBvcnQrKyl7CisJCXZzY193cml0ZShhZGFwdGVyLCBSRUdfREVWX1NFVFVQKHBvcnQpLCAweDEpOworCX0KKwl1ZGVsYXkoMzAwKTsKKwl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX01FTV9CSVNULCAweDApOworCW1kZWxheSgxMCk7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IG1hY19pbnRyX2hhbmRsZXIoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfaW50cl9lbmFibGUoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfaW50cl9kaXNhYmxlKHN0cnVjdCBjbWFjICptYWMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2ludHJfY2xlYXIoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlyZXR1cm4gMDsKK30KKworLyogRXhwZWN0IE1BQyBhZGRyZXNzIHRvIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gKi8KK3N0YXRpYyBpbnQgbWFjX3NldF9hZGRyZXNzKHN0cnVjdCBjbWFjKiBtYWMsIHU4IGFkZHJbNl0pCit7CisJdTMyIHZhbDsKKwlpbnQgcG9ydCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCisJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX01BQ19MT1dfQUREUihwb3J0KSwKKwkJICAoYWRkclszXSA8PCAxNikgfCAoYWRkcls0XSA8PCA4KSB8IGFkZHJbNV0pOworCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19NQUNfSElHSF9BRERSKHBvcnQpLAorCQkgIChhZGRyWzBdIDw8IDE2KSB8IChhZGRyWzFdIDw8IDgpIHwgYWRkclsyXSk7CisKKwl2c2NfcmVhZChtYWMtPmFkYXB0ZXIsIFJFR19JTkdfRkZJTFRfVU1fRU4sICZ2YWwpOworCXZhbCAmPSB+MHhmMDAwMDAwMDsKKwl2c2Nfd3JpdGUobWFjLT5hZGFwdGVyLCBSRUdfSU5HX0ZGSUxUX1VNX0VOLCB2YWwgfCAocG9ydCA8PCAyOCkpOworCisJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX0lOR19GRklMVF9NQVNLMCwKKwkJICAweGZmZmYwMDAwIHwgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKwl2c2Nfd3JpdGUobWFjLT5hZGFwdGVyLCBSRUdfSU5HX0ZGSUxUX01BU0sxLAorCQkgIDB4ZmZmZjAwMDAgfCAoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10pOworCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19JTkdfRkZJTFRfTUFTSzIsCisJCSAgMHhmZmZmMDAwMCB8IChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2dldF9hZGRyZXNzKHN0cnVjdCBjbWFjICptYWMsIHU4IGFkZHJbNl0pCit7CisJdTMyIGFkZHJfbG8sIGFkZHJfaGk7CisJaW50IHBvcnQgPSBtYWMtPmluc3RhbmNlLT5pbmRleDsKKworCXZzY19yZWFkKG1hYy0+YWRhcHRlciwgUkVHX01BQ19MT1dfQUREUihwb3J0KSwgJmFkZHJfbG8pOworCXZzY19yZWFkKG1hYy0+YWRhcHRlciwgUkVHX01BQ19ISUdIX0FERFIocG9ydCksICZhZGRyX2hpKTsKKworCWFkZHJbMF0gPSAodTgpIChhZGRyX2hpID4+IDE2KTsKKwlhZGRyWzFdID0gKHU4KSAoYWRkcl9oaSA+PiA4KTsKKwlhZGRyWzJdID0gKHU4KSBhZGRyX2hpOworCWFkZHJbM10gPSAodTgpIChhZGRyX2xvID4+IDE2KTsKKwlhZGRyWzRdID0gKHU4KSAoYWRkcl9sbyA+PiA4KTsKKwlhZGRyWzVdID0gKHU4KSBhZGRyX2xvOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGlzIGludGVuZGVkIHRvIHJlc2V0IGEgcG9ydCwgbm90IHRoZSB3aG9sZSBNQUMgKi8KK3N0YXRpYyBpbnQgbWFjX3Jlc2V0KHN0cnVjdCBjbWFjICptYWMpCit7CisJaW50IGluZGV4ID0gbWFjLT5pbnN0YW5jZS0+aW5kZXg7CisKKwlydW5fdGFibGUobWFjLT5hZGFwdGVyLCB2c2M3MzI2X3BvcnRpbml0W2luZGV4XSwKKwkJICBBUlJBWV9TSVpFKHZzYzczMjZfcG9ydGluaXRbaW5kZXhdKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfc2V0X3J4X21vZGUoc3RydWN0IGNtYWMgKm1hYywgc3RydWN0IHQxX3J4X21vZGUgKnJtKQoreworCXUzMiB2OworCWludCBwb3J0ID0gbWFjLT5pbnN0YW5jZS0+aW5kZXg7CisKKwl2c2NfcmVhZChtYWMtPmFkYXB0ZXIsIFJFR19JTkdfRkZJTFRfVU1fRU4sICZ2KTsKKwl2IHw9IDEgPDwgMTI7CisKKwlpZiAodDFfcnhfbW9kZV9wcm9taXNjKHJtKSkKKwkJdiAmPSB+KDEgPDwgKHBvcnQgKyAxNikpOworCWVsc2UKKwkJdiB8PSAxIDw8IChwb3J0ICsgMTYpOworCisJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX0lOR19GRklMVF9VTV9FTiwgdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX3NldF9tdHUoc3RydWN0IGNtYWMgKm1hYywgaW50IG10dSkKK3sKKwlpbnQgcG9ydCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCisJaWYgKG10dSA+IE1BWF9NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbWF4X2xlbiBpbmNsdWRlcyBoZWFkZXIgYW5kIEZDUyAqLworCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19NQVhfTEVOKHBvcnQpLCBtdHUgKyAxNCArIDQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19zZXRfc3BlZWRfZHVwbGV4X2ZjKHN0cnVjdCBjbWFjICptYWMsIGludCBzcGVlZCwgaW50IGR1cGxleCwKKwkJCQkgICBpbnQgZmMpCit7CisJdTMyIHY7CisJaW50IGVuYWJsZSwgcG9ydCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCisJaWYgKHNwZWVkID49IDAgJiYgc3BlZWQgIT0gU1BFRURfMTAgJiYgc3BlZWQgIT0gU1BFRURfMTAwICYmCisJICAgIHNwZWVkICE9IFNQRUVEXzEwMDApCisJCXJldHVybiAtMTsKKwlpZiAoZHVwbGV4ID4gMCAmJiBkdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtMTsKKworCWlmIChzcGVlZCA+PSAwKSB7CisJCXZzY19yZWFkKG1hYy0+YWRhcHRlciwgUkVHX01PREVfQ0ZHKHBvcnQpLCAmdik7CisJCWVuYWJsZSA9IHYgJiAzOyAgICAgICAgICAgICAvKiBzYXZlIHR4L3J4IGVuYWJsZXMgKi8KKwkJdiAmPSB+MHhmOworCQl2IHw9IDQ7ICAgICAgICAgICAgICAgICAgICAgLyogZnVsbCBkdXBsZXggKi8KKwkJaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQl2IHw9IDg7ICAgICAgICAgICAgIC8qIEdpZ0UgKi8KKwkJZW5hYmxlIHw9IHY7CisJCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19NT0RFX0NGRyhwb3J0KSwgdik7CisKKwkJaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQl2ID0gMHg4MjsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJdiA9IDB4ODQ7CisJCWVsc2UJLyogU1BFRURfMTAgKi8KKwkJCXYgPSAweDg2OworCQl2c2Nfd3JpdGUobWFjLT5hZGFwdGVyLCBSRUdfREVWX1NFVFVQKHBvcnQpLCB2IHwgMSk7IC8qIHJlc2V0ICovCisJCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19ERVZfU0VUVVAocG9ydCksIHYpOworCQl2c2NfcmVhZChtYWMtPmFkYXB0ZXIsIFJFR19EQkcocG9ydCksICZ2KTsKKwkJdiAmPSB+MHhmZjAwOworCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCXYgfD0gMHg0MDA7CisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMCkKKwkJCXYgfD0gMHgyMDAwOworCQllbHNlCS8qIFNQRUVEXzEwICovCisJCQl2IHw9IDB4ZmYwMDsKKwkJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX0RCRyhwb3J0KSwgdik7CisKKwkJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX1RYX0lGRyhwb3J0KSwKKwkJCSAgc3BlZWQgPT0gU1BFRURfMTAwMCA/IDUgOiAweDExKTsKKwkJaWYgKGR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCWVuYWJsZSA9IDB4MDsJLyogMTAwIG9yIDEwICovCisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQllbmFibGUgPSAweGM7CisJCWVsc2UJLyogU1BFRURfMTAwIG9yIDEwICovCisJCQllbmFibGUgPSAweDQ7CisJCWVuYWJsZSB8PSAweDkgPDwgMTA7CS8qIElGRzEgKi8KKwkJZW5hYmxlIHw9IDB4NiA8PCA2OwkvKiBJRkcyICovCisJCWVuYWJsZSB8PSAweDEgPDwgNDsJLyogVkxBTiAqLworCQllbmFibGUgfD0gMHgzOwkJLyogUlgvVFggRU4gKi8KKwkJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX01PREVfQ0ZHKHBvcnQpLCBlbmFibGUpOworCisJfQorCisJdnNjX3JlYWQobWFjLT5hZGFwdGVyLCBSRUdfUEFVU0VfQ0ZHKHBvcnQpLCAmdik7CisJdiAmPSAweGZmZjBmZmZmOworCXYgfD0gMHgyMDAwMDsgICAgICAvKiB4b24veG9mZiAqLworCWlmIChmYyAmIFBBVVNFX1JYKQorCQl2IHw9IDB4NDAwMDA7CisJaWYgKGZjICYgUEFVU0VfVFgpCisJCXYgfD0gMHg4MDAwMDsKKwlpZiAoZmMgPT0gKFBBVVNFX1JYIHwgUEFVU0VfVFgpKQorCQl2IHw9IDB4MTAwMDA7CisJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX1BBVVNFX0NGRyhwb3J0KSwgdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2VuYWJsZShzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgd2hpY2gpCit7CisJdTMyIHZhbDsKKwlpbnQgcG9ydCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCisJLyogV3JpdGUgdGhlIGNvcnJlY3QgV00gdmFsdWUgd2hlbiB0aGUgcG9ydCBpcyBlbmFibGVkLiAqLworCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19ISUdIX0xPV19XTSgxLHBvcnQpLCBXTV9FTkFCTEUpOworCisJdnNjX3JlYWQobWFjLT5hZGFwdGVyLCBSRUdfTU9ERV9DRkcocG9ydCksICZ2YWwpOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fUlgpCisJCXZhbCB8PSAweDI7CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9UWCkKKwkJdmFsIHw9IDE7CisJdnNjX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX01PREVfQ0ZHKHBvcnQpLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19kaXNhYmxlKHN0cnVjdCBjbWFjICptYWMsIGludCB3aGljaCkKK3sKKwl1MzIgdmFsOworCWludCBpLCBwb3J0ID0gbWFjLT5pbnN0YW5jZS0+aW5kZXg7CisKKwkvKiBSZXNldCB0aGUgcG9ydCwgdGhpcyBhbHNvIHdyaXRlcyB0aGUgY29ycmVjdCBXTSB2YWx1ZSAqLworCW1hY19yZXNldChtYWMpOworCisJdnNjX3JlYWQobWFjLT5hZGFwdGVyLCBSRUdfTU9ERV9DRkcocG9ydCksICZ2YWwpOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fUlgpCisJCXZhbCAmPSB+MHgyOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fVFgpCisJCXZhbCAmPSB+MHgxOworCXZzY193cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19NT0RFX0NGRyhwb3J0KSwgdmFsKTsKKwl2c2NfcmVhZChtYWMtPmFkYXB0ZXIsIFJFR19NT0RFX0NGRyhwb3J0KSwgJnZhbCk7CisKKwkvKiBDbGVhciBzdGF0cyAqLworCWZvciAoaSA9IDA7IGkgPD0gMHgzYTsgKytpKQorCQl2c2Nfd3JpdGUobWFjLT5hZGFwdGVyLCBDUkEoNCwgcG9ydCwgaSksIDApOworCisJLyogQ2xlYXIgc29md2FyZSBjb3VudGVycyAqLworCW1lbXNldCgmbWFjLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBybW9uX3VwZGF0ZShzdHJ1Y3QgY21hYyAqbWFjLCB1bnNpZ25lZCBpbnQgYWRkciwgdTY0ICpzdGF0KQoreworCXUzMiB2LCBsbzsKKworCXZzY19yZWFkKG1hYy0+YWRhcHRlciwgYWRkciwgJnYpOworCWxvID0gKnN0YXQ7CisJKnN0YXQgPSAqc3RhdCAtIGxvICsgdjsKKworCWlmICh2ID09IDApCisJCXJldHVybjsKKworCWlmICh2IDwgbG8pCisJCSpzdGF0ICs9ICgxVUxMIDw8IDMyKTsKK30KKworc3RhdGljIHZvaWQgcG9ydF9zdGF0c191cGRhdGUoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlpbnQgcG9ydCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCisJLyogUnggc3RhdHMgKi8KKwlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9PS19CWVRFUyhwb3J0KSwgJm1hYy0+c3RhdHMuUnhPY3RldHNPSyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfQkFEX0JZVEVTKHBvcnQpLCAmbWFjLT5zdGF0cy5SeE9jdGV0c0JhZCk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfVU5JQ0FTVChwb3J0KSwgJm1hYy0+c3RhdHMuUnhVbmljYXN0RnJhbWVzT0spOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX01VTFRJQ0FTVChwb3J0KSwKKwkJICAgICZtYWMtPnN0YXRzLlJ4TXVsdGljYXN0RnJhbWVzT0spOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX0JST0FEQ0FTVChwb3J0KSwKKwkJICAgICZtYWMtPnN0YXRzLlJ4QnJvYWRjYXN0RnJhbWVzT0spOworCXJtb25fdXBkYXRlKG1hYywgUkVHX0NSQyhwb3J0KSwgJm1hYy0+c3RhdHMuUnhGQ1NFcnJvcnMpOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX0FMSUdOTUVOVChwb3J0KSwgJm1hYy0+c3RhdHMuUnhBbGlnbkVycm9ycyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfT1ZFUlNJWkUocG9ydCksCisJCSAgICAmbWFjLT5zdGF0cy5SeEZyYW1lVG9vTG9uZ0Vycm9ycyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfUEFVU0UocG9ydCksICZtYWMtPnN0YXRzLlJ4UGF1c2VGcmFtZXMpOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX0pBQkJFUlMocG9ydCksICZtYWMtPnN0YXRzLlJ4SmFiYmVyRXJyb3JzKTsKKwlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9GUkFHTUVOVFMocG9ydCksICZtYWMtPnN0YXRzLlJ4UnVudEVycm9ycyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfVU5ERVJTSVpFKHBvcnQpLCAmbWFjLT5zdGF0cy5SeFJ1bnRFcnJvcnMpOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX1NZTUJPTF9DQVJSSUVSKHBvcnQpLAorCQkgICAgJm1hYy0+c3RhdHMuUnhTeW1ib2xFcnJvcnMpOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX1NJWkVfMTUxOV9UT19NQVgocG9ydCksCisgICAgICAgICAgICAmbWFjLT5zdGF0cy5SeEp1bWJvRnJhbWVzT0spOworCisJLyogVHggc3RhdHMgKHNraXAgY29sbGlzaW9uIHN0YXRzIGFzIHdlIGFyZSBmdWxsLWR1cGxleCBvbmx5KSAqLworCXJtb25fdXBkYXRlKG1hYywgUkVHX1RYX09LX0JZVEVTKHBvcnQpLCAmbWFjLT5zdGF0cy5UeE9jdGV0c09LKTsKKwlybW9uX3VwZGF0ZShtYWMsIFJFR19UWF9VTklDQVNUKHBvcnQpLCAmbWFjLT5zdGF0cy5UeFVuaWNhc3RGcmFtZXNPSyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfVFhfTVVMVElDQVNUKHBvcnQpLAorCQkgICAgJm1hYy0+c3RhdHMuVHhNdWx0aWNhc3RGcmFtZXNPSyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfVFhfQlJPQURDQVNUKHBvcnQpLAorCQkgICAgJm1hYy0+c3RhdHMuVHhCcm9hZGNhc3RGcmFtZXNPSyk7CisJcm1vbl91cGRhdGUobWFjLCBSRUdfVFhfUEFVU0UocG9ydCksICZtYWMtPnN0YXRzLlR4UGF1c2VGcmFtZXMpOworCXJtb25fdXBkYXRlKG1hYywgUkVHX1RYX1VOREVSUlVOKHBvcnQpLCAmbWFjLT5zdGF0cy5UeFVuZGVycnVuKTsKKwlybW9uX3VwZGF0ZShtYWMsIFJFR19UWF9TSVpFXzE1MTlfVE9fTUFYKHBvcnQpLAorICAgICAgICAgICAgJm1hYy0+c3RhdHMuVHhKdW1ib0ZyYW1lc09LKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBhY2N1bXVsYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUKKyAqIFJNT04gY291bnRlcnMgaW50byB0aGUgcG9ydCBzdGF0aXN0aWNzLiAgU2luY2UgdGhlIGNvdW50ZXJzIGFyZSBvbmx5IDMyIGJpdHMKKyAqIHNvbWUgb2YgdGhlbSBjYW4gb3ZlcmZsb3cgaW4gbGVzcyB0aGFuIGEgbWludXRlIGF0IEdpZ0Ugc3BlZWRzLCBzbyB0aGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IDMwIHNlY29uZHMgb3Igc28uCisgKgorICogVG8gY3V0IGRvd24gb24gcmVhZGluZyBjb3N0cyB3ZSB1cGRhdGUgb25seSB0aGUgb2N0ZXQgY291bnRlcnMgYXQgZWFjaCB0aWNrCisgKiBhbmQgZG8gYSBmdWxsIHVwZGF0ZSBhdCBtYWpvciB0aWNrcywgd2hpY2ggY2FuIGJlIGV2ZXJ5IDMwIG1pbnV0ZXMgb3IgbW9yZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKm1hY191cGRhdGVfc3RhdGlzdGljcyhzdHJ1Y3QgY21hYyAqbWFjLAorCQkJCQkJCSAgIGludCBmbGFnKQoreworCWlmIChmbGFnID09IE1BQ19TVEFUU19VUERBVEVfRlVMTCB8fAorCSAgICBtYWMtPmluc3RhbmNlLT50aWNrcyA+PSBNQUpPUl9VUERBVEVfVElDS1MpIHsKKwkJcG9ydF9zdGF0c191cGRhdGUobWFjKTsKKwkJbWFjLT5pbnN0YW5jZS0+dGlja3MgPSAwOworCX0gZWxzZSB7CisJCWludCBwb3J0ID0gbWFjLT5pbnN0YW5jZS0+aW5kZXg7CisKKwkJcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfT0tfQllURVMocG9ydCksCisJCQkgICAgJm1hYy0+c3RhdHMuUnhPY3RldHNPSyk7CisJCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX0JBRF9CWVRFUyhwb3J0KSwKKwkJCSAgICAmbWFjLT5zdGF0cy5SeE9jdGV0c0JhZCk7CisJCXJtb25fdXBkYXRlKG1hYywgUkVHX1RYX09LX0JZVEVTKHBvcnQpLAorCQkJICAgICZtYWMtPnN0YXRzLlR4T2N0ZXRzT0spOworCQltYWMtPmluc3RhbmNlLT50aWNrcysrOworCX0KKwlyZXR1cm4gJm1hYy0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19kZXN0cm95KHN0cnVjdCBjbWFjICptYWMpCit7CisJa2ZyZWUobWFjKTsKK30KKworc3RhdGljIHN0cnVjdCBjbWFjX29wcyB2c2M3MzI2X29wcyA9IHsKKwkuZGVzdHJveSAgICAgICAgICAgICAgICAgID0gbWFjX2Rlc3Ryb3ksCisJLnJlc2V0ICAgICAgICAgICAgICAgICAgICA9IG1hY19yZXNldCwKKwkuaW50ZXJydXB0X2hhbmRsZXIgICAgICAgID0gbWFjX2ludHJfaGFuZGxlciwKKwkuaW50ZXJydXB0X2VuYWJsZSAgICAgICAgID0gbWFjX2ludHJfZW5hYmxlLAorCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICAgICAgPSBtYWNfaW50cl9kaXNhYmxlLAorCS5pbnRlcnJ1cHRfY2xlYXIgICAgICAgICAgPSBtYWNfaW50cl9jbGVhciwKKwkuZW5hYmxlICAgICAgICAgICAgICAgICAgID0gbWFjX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICAgICAgICAgICAgID0gbWFjX2Rpc2FibGUsCisJLnNldF9tdHUgICAgICAgICAgICAgICAgICA9IG1hY19zZXRfbXR1LAorCS5zZXRfcnhfbW9kZSAgICAgICAgICAgICAgPSBtYWNfc2V0X3J4X21vZGUsCisJLnNldF9zcGVlZF9kdXBsZXhfZmMgICAgICA9IG1hY19zZXRfc3BlZWRfZHVwbGV4X2ZjLAorCS5zdGF0aXN0aWNzX3VwZGF0ZSAgICAgICAgPSBtYWNfdXBkYXRlX3N0YXRpc3RpY3MsCisJLm1hY2FkZHJlc3NfZ2V0ICAgICAgICAgICA9IG1hY19nZXRfYWRkcmVzcywKKwkubWFjYWRkcmVzc19zZXQgICAgICAgICAgID0gbWFjX3NldF9hZGRyZXNzLAorfTsKKworc3RhdGljIHN0cnVjdCBjbWFjICp2c2M3MzI2X21hY19jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGNtYWMgKm1hYzsKKwl1MzIgdmFsOworCWludCBpOworCisJbWFjID0ga3phbGxvYyhzaXplb2YoKm1hYykgKyBzaXplb2YoY21hY19pbnN0YW5jZSksIEdGUF9LRVJORUwpOworCWlmICghbWFjKSByZXR1cm4gTlVMTDsKKworCW1hYy0+b3BzID0gJnZzYzczMjZfb3BzOworCW1hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKShtYWMgKyAxKTsKKwltYWMtPmFkYXB0ZXIgID0gYWRhcHRlcjsKKworCW1hYy0+aW5zdGFuY2UtPmluZGV4ID0gaW5kZXg7CisJbWFjLT5pbnN0YW5jZS0+dGlja3MgPSAwOworCisJaSA9IDA7CisJZG8geworCQl1MzIgdmhpLCB2bG87CisKKwkJdmhpID0gdmxvID0gMDsKKwkJdDFfdHBpX3JlYWQoYWRhcHRlciwgKFJFR19MT0NBTF9TVEFUVVMgPDwgMikgKyA0LCAmdmxvKTsKKwkJdWRlbGF5KDEpOworCQl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfTE9DQUxfU1RBVFVTIDw8IDIsICZ2aGkpOworCQl1ZGVsYXkoNSk7CisJCXZhbCA9ICh2aGkgPDwgMTYpIHwgdmxvOworCX0gd2hpbGUgKCgrK2kgPCAxMDAwMCkgJiYgKHZhbCA9PSAweGZmZmZmZmZmKSk7CisKKwlyZXR1cm4gbWFjOworfQorCitzdGF0aWMgaW50IHZzYzczMjZfbWFjX3Jlc2V0KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl2c2M3MzI2X2Z1bGxfcmVzZXQoYWRhcHRlcik7CisJKHZvaWQpIHJ1bl9iaXN0X2FsbChhZGFwdGVyKTsKKwlydW5fdGFibGUoYWRhcHRlciwgdnNjNzMyNl9yZXNldCwgQVJSQVlfU0laRSh2c2M3MzI2X3Jlc2V0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnbWFjIHQxX3ZzYzczMjZfb3BzID0geworCS5zdGF0c191cGRhdGVfcGVyaW9kID0gU1RBVFNfVElDS19TRUNTLAorCS5jcmVhdGUgICAgICAgICAgICAgID0gdnNjNzMyNl9tYWNfY3JlYXRlLAorCS5yZXNldCAgICAgICAgICAgICAgID0gdnNjNzMyNl9tYWNfcmVzZXQsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M3MzI2X3JlZy5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M3MzI2X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MWJjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjZfcmVnLmgKQEAgLTAsMCArMSwyODYgQEAKKy8qICREYXRlOiAyMDA2LzA0LzI4IDE5OjIwOjE3ICQgJFJDU2ZpbGU6IHZzYzczMjZfcmVnLmgsdiAkICRSZXZpc2lvbjogMS41ICQgKi8KKyNpZm5kZWYgX1ZTQzczMjFfUkVHX0hfCisjZGVmaW5lIF9WU0M3MzIxX1JFR19IXworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgVml0ZXNzZSBWU0M3MzIxIChNZWlncyBJSSkgTUFDCisgKgorICogU3RyYWlnaHQgb2ZmIHRoZSBkYXRhIHNoZWV0LCBWTURTLTEwMDM4IFJldiAyLjAgYW5kCisgKiBQRDAwMTEtMDEtMTQtTWVpZ3MtSUkgMjAwMi0xMi0xMgorICovCisKKy8qIEp1c3QgJ2NhdXNlIGl0J3MgaW4gaGVyZSBkb2Vzbid0IG1lYW4gaXQncyB1c2VkLiAqLworCisjZGVmaW5lIENSQShibGssc3ViLGFkcikgKCgoKGJsaykgJiAweDcpIDw8IDEzKSB8ICgoKHN1YikgJiAweGYpIDw8IDkpIHwgKCgoYWRyKSAmIDB4ZmYpIDw8IDEpKQorCisvKiBTeXN0ZW0gYW5kIENQVSBjb21tJ3MgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19DSElQX0lECQlDUkEoMHg3LDB4ZiwweDAwKQkvKiBDaGlwIElEICovCisjZGVmaW5lIFJFR19CTEFERV9JRAkJQ1JBKDB4NywweGYsMHgwMSkJLyogQmxhZGUgSUQgKi8KKyNkZWZpbmUgUkVHX1NXX1JFU0VUCQlDUkEoMHg3LDB4ZiwweDAyKQkvKiBHbG9iYWwgU29mdCBSZXNldCAqLworI2RlZmluZSBSRUdfTUVNX0JJU1QJCUNSQSgweDcsMHhmLDB4MDQpCS8qIG1lbSAqLworI2RlZmluZSBSRUdfSUZBQ0VfTU9ERQkJQ1JBKDB4NywweGYsMHgwNykJLyogSW50ZXJmYWNlIG1vZGUgKi8KKyNkZWZpbmUgUkVHX01TQ0gJCUNSQSgweDcsMHgyLDB4MDYpCS8qIENSQyBlcnJvciBjb3VudCAqLworI2RlZmluZSBSRUdfQ1JDX0NOVAkJQ1JBKDB4NywweDIsMHgwYSkJLyogQ1JDIGVycm9yIGNvdW50ICovCisjZGVmaW5lIFJFR19DUkNfQ0ZHCQlDUkEoMHg3LDB4MiwweDBiKQkvKiBDUkMgY29uZmlnICovCisjZGVmaW5lIFJFR19TSV9UUkFOU0ZFUl9TRUwJQ1JBKDB4NywweGYsMHgxOCkJLyogU0kgVHJhbnNmZXIgU2VsZWN0ICovCisjZGVmaW5lIFJFR19QTExfQ0xLX1NQRUVECUNSQSgweDcsMHhmLDB4MTkpCS8qIENsb2NrIFNwZWVkIFNlbGVjdGlvbiAqLworI2RlZmluZSBSRUdfU1lTX0NMS19TRUxFQ1QJQ1JBKDB4NywweGYsMHgxYykJLyogU3lzdGVtIENsb2NrIFNlbGVjdCAqLworI2RlZmluZSBSRUdfR1BJT19DVFJMCQlDUkEoMHg3LDB4ZiwweDFkKQkvKiBHUElPIENvbnRyb2wgKi8KKyNkZWZpbmUgUkVHX0dQSU9fT1VUCQlDUkEoMHg3LDB4ZiwweDFlKQkvKiBHUElPIE91dCAqLworI2RlZmluZSBSRUdfR1BJT19JTgkJQ1JBKDB4NywweGYsMHgxZikJLyogR1BJTyBJbiAqLworI2RlZmluZSBSRUdfQ1BVX1RSQU5TRkVSX1NFTAlDUkEoMHg3LDB4ZiwweDIwKQkvKiBDUFUgVHJhbnNmZXIgU2VsZWN0ICovCisjZGVmaW5lIFJFR19MT0NBTF9EQVRBCQlDUkEoMHg3LDB4ZiwweGZlKQkvKiBMb2NhbCBDUFUgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTE9DQUxfU1RBVFVTCUNSQSgweDcsMHhmLDB4ZmYpCS8qIExvY2FsIENQVSBTdGF0dXMgUmVnaXN0ZXIgKi8KKworLyogQWdncmVnYXRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX0FHR1JfU0VUVVAJCUNSQSgweDcsMHgxLDB4MDApCS8qIEFnZ3JlZ2F0b3IgU2V0dXAgKi8KKyNkZWZpbmUgUkVHX1BNQVBfVEFCTEUJCUNSQSgweDcsMHgxLDB4MDEpCS8qIFBvcnQgbWFwIHRhYmxlICovCisjZGVmaW5lIFJFR19NUExTX0JJVDAJCUNSQSgweDcsMHgxLDB4MDgpCS8qIE1QTFMgYml0MCBwb3NpdGlvbiAqLworI2RlZmluZSBSRUdfTVBMU19CSVQxCQlDUkEoMHg3LDB4MSwweDA5KQkvKiBNUExTIGJpdDEgcG9zaXRpb24gKi8KKyNkZWZpbmUgUkVHX01QTFNfQklUMgkJQ1JBKDB4NywweDEsMHgwYSkJLyogTVBMUyBiaXQyIHBvc2l0aW9uICovCisjZGVmaW5lIFJFR19NUExTX0JJVDMJCUNSQSgweDcsMHgxLDB4MGIpCS8qIE1QTFMgYml0MyBwb3NpdGlvbiAqLworI2RlZmluZSBSRUdfTVBMU19CSVRNQVNLCUNSQSgweDcsMHgxLDB4MGMpCS8qIE1QTFMgYml0IG1hc2sgKi8KKyNkZWZpbmUgUkVHX1BSRV9CSVQwUE9TCQlDUkEoMHg3LDB4MSwweDEwKQkvKiBQcmVhbWJsZSBiaXQwIHBvc2l0aW9uICovCisjZGVmaW5lIFJFR19QUkVfQklUMVBPUwkJQ1JBKDB4NywweDEsMHgxMSkJLyogUHJlYW1ibGUgYml0MSBwb3NpdGlvbiAqLworI2RlZmluZSBSRUdfUFJFX0JJVDJQT1MJCUNSQSgweDcsMHgxLDB4MTIpCS8qIFByZWFtYmxlIGJpdDIgcG9zaXRpb24gKi8KKyNkZWZpbmUgUkVHX1BSRV9CSVQzUE9TCQlDUkEoMHg3LDB4MSwweDEzKQkvKiBQcmVhbWJsZSBiaXQzIHBvc2l0aW9uICovCisjZGVmaW5lIFJFR19QUkVfRVJSX0NOVAkJQ1JBKDB4NywweDEsMHgxNCkJLyogUHJlYW1ibGUgcGFyaXR5IGVycm9yIGNvdW50ICovCisKKy8qIEJJU1QgcmVnaXN0ZXJzICovCisvKiNkZWZpbmUgUkVHX1JBTV9CSVNUX0NNRAlDUkEoMHg3LDB4MiwweDAwKSovCS8qIFJBTSBCSVNUIENvbW1hbmQgUmVnaXN0ZXIgKi8KKy8qI2RlZmluZSBSRUdfUkFNX0JJU1RfUkVTVUxUCUNSQSgweDcsMHgyLDB4MDEpKi8JLyogUkFNIEJJU1QgUmVhZCBTdGF0dXMvUmVzdWx0ICovCisjZGVmaW5lIFJFR19SQU1fQklTVF9DTUQJQ1JBKDB4NywweDEsMHgwMCkJLyogUkFNIEJJU1QgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfUkFNX0JJU1RfUkVTVUxUCUNSQSgweDcsMHgxLDB4MDEpCS8qIFJBTSBCSVNUIFJlYWQgU3RhdHVzL1Jlc3VsdCAqLworI2RlZmluZSAgIEJJU1RfUE9SVF9TRUxFQ1QJMHgwMAkJCS8qIEJJU1QgcG9ydCBzZWxlY3QgKi8KKyNkZWZpbmUgICBCSVNUX0NPTU1BTkQJCTB4MDEJCQkvKiBCSVNUIGVuYWJsZS9kaXNhYmxlICovCisjZGVmaW5lICAgQklTVF9TVEFUVVMJCTB4MDIJCQkvKiBCSVNUIG9wZXJhdGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgICBCSVNUX0VSUl9DTlRfTFNCCTB4MDMJCQkvKiBCSVNUIGVycm9yIGNvdW50IGxvIDhiICovCisjZGVmaW5lICAgQklTVF9FUlJfQ05UX01TQgkweDA0CQkJLyogQklTVCBlcnJvciBjb3VudCBoaSA4YiAqLworI2RlZmluZSAgIEJJU1RfRVJSX1NFTF9MU0IJMHgwNQkJCS8qIEJJU1QgZXJyb3Igc2VsZWN0IGxvIDhiICovCisjZGVmaW5lICAgQklTVF9FUlJfU0VMX01TQgkweDA2CQkJLyogQklTVCBlcnJvciBzZWxlY3QgaGkgOGIgKi8KKyNkZWZpbmUgICBCSVNUX0VSUk9SX1NUQVRFCTB4MDcJCQkvKiBCSVNUIGVuZ2luZSBpbnRlcm5hbCBzdGF0ZSAqLworI2RlZmluZSAgIEJJU1RfRVJSX0FEUjAJCTB4MDgJCQkvKiBCSVNUIGVycm9yIGFkZHJlc3MgbG8gOGIgKi8KKyNkZWZpbmUgICBCSVNUX0VSUl9BRFIxCQkweDA5CQkJLyogQklTVCBlcnJvciBhZGRyZXNzIGxvbWlkIDhiICovCisjZGVmaW5lICAgQklTVF9FUlJfQURSMgkJMHgwYQkJCS8qIEJJU1QgZXJyb3IgYWRkcmVzcyBoaW1pZCA4YiAqLworI2RlZmluZSAgIEJJU1RfRVJSX0FEUjMJCTB4MGIJCQkvKiBCSVNUIGVycm9yIGFkZHJlc3MgaGkgOGIgKi8KKworLyogRklGTyByZWdpc3RlcnMKKyAqICAgaWUgPSAwIGZvciBpbmdyZXNzLCAxIGZvciBlZ3Jlc3MKKyAqICAgZm4gPSBGSUZPIG51bWJlciwgMC05CisgKi8KKyNkZWZpbmUgUkVHX1RFU1QoaWUsZm4pCQlDUkEoMHgyLGllJjEsMHgwMCtmbikJLyogTW9kZSAmIFRlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RPUF9CT1RUT00oaWUsZm4pCUNSQSgweDIsaWUmMSwweDEwK2ZuKQkvKiBGSUZPIEJ1ZmZlciBUb3AgJiBCb3R0b20gKi8KKyNkZWZpbmUgUkVHX1RBSUwoaWUsZm4pCQlDUkEoMHgyLGllJjEsMHgyMCtmbikJLyogRklGTyBXcml0ZSBQb2ludGVyICovCisjZGVmaW5lIFJFR19IRUFEKGllLGZuKQkJQ1JBKDB4MixpZSYxLDB4MzArZm4pCS8qIEZJRk8gUmVhZCBQb2ludGVyICovCisjZGVmaW5lIFJFR19ISUdIX0xPV19XTShpZSxmbikJQ1JBKDB4MixpZSYxLDB4NDArZm4pCS8qIEZsb3cgQ29udHJvbCBXYXRlciBNYXJrcyAqLworI2RlZmluZSBSRUdfQ1RfVEhSSExEKGllLGZuKQlDUkEoMHgyLGllJjEsMHg1MCtmbikJLyogQ3V0IFRocm91Z2ggVGhyZXNob2xkICovCisjZGVmaW5lIFJFR19GSUZPX0RST1BfQ05UKGllLGZuKSBDUkEoMHgyLGllJjEsMHg2MCtmbikJLyogRHJvcCAmIENSQyBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIFJFR19ERUJVR19CVUZfQ05UKGllLGZuKSBDUkEoMHgyLGllJjEsMHg3MCtmbikJLyogSW5wdXQgU2lkZSBEZWJ1ZyBDb3VudGVyICovCisjZGVmaW5lIFJFR19CVUNLSShmbikgQ1JBKDB4MiwyLDB4MjArZm4pCS8qIElucHV0IFNpZGUgRGVidWcgQ291bnRlciAqLworI2RlZmluZSBSRUdfQlVDS0UoZm4pIENSQSgweDIsMywweDIwK2ZuKQkvKiBJbnB1dCBTaWRlIERlYnVnIENvdW50ZXIgKi8KKworLyogVHJhZmZpYyBzaGFwZXIgYnVja2V0cworICogICBpZSA9IDAgZm9yIGluZ3Jlc3MsIDEgZm9yIGVncmVzcworICogICBibiA9IGJ1Y2tldCBudW1iZXIgMC0xMCAoeWVzLCAxMSBidWNrZXRzKQorICovCisvKiBPSywgdGhpcyBvbmUncyBraW5kYSB1Z2x5LiAgU29tZSBoYXJkd2FyZSBkZXNpZ25lcnMgYXJlIHBlcnZlcnNlLiAqLworI2RlZmluZSBSRUdfVFJBRkZJQ19TSEFQRVJfQlVDS0VUKGllLGJuKSBDUkEoMHgyLGllJjEsMHgwYSArIChibj43KSB8ICgoYm4mNyk8PDQpKQorI2RlZmluZSBSRUdfVFJBRkZJQ19TSEFQRVJfQ09OVFJPTChpZSkJQ1JBKDB4MixpZSYxLDB4M2IpCisKKyNkZWZpbmUgUkVHX1NSQU1fQURSKGllKQlDUkEoMHgyLGllJjEsMHgwZSkJLyogRklGTyBTUkFNIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX1NSQU1fV1JfU1RSQihpZSkJQ1JBKDB4MixpZSYxLDB4MWUpCS8qIEZJRk8gU1JBTSB3cml0ZSBzdHJvYmUgKi8KKyNkZWZpbmUgUkVHX1NSQU1fUkRfU1RSQihpZSkJQ1JBKDB4MixpZSYxLDB4MmUpCS8qIEZJRk8gU1JBTSByZWFkIHN0cm9iZSAqLworI2RlZmluZSBSRUdfU1JBTV9EQVRBXzAoaWUpCUNSQSgweDIsaWUmMSwweDNlKQkvKiBGSUZPIFNSQU0gZGF0YSBsbyA4YiAqLworI2RlZmluZSBSRUdfU1JBTV9EQVRBXzEoaWUpCUNSQSgweDIsaWUmMSwweDRlKQkvKiBGSUZPIFNSQU0gZGF0YSBsb21pZCA4YiAqLworI2RlZmluZSBSRUdfU1JBTV9EQVRBXzIoaWUpCUNSQSgweDIsaWUmMSwweDVlKQkvKiBGSUZPIFNSQU0gZGF0YSBoaW1pZCA4YiAqLworI2RlZmluZSBSRUdfU1JBTV9EQVRBXzMoaWUpCUNSQSgweDIsaWUmMSwweDZlKQkvKiBGSUZPIFNSQU0gZGF0YSBoaSA4YiAqLworI2RlZmluZSBSRUdfU1JBTV9EQVRBX0JMS19UWVBFKGllKSBDUkEoMHgyLGllJjEsMHg3ZSkJLyogRklGTyBTUkFNIHRhZyAqLworLyogUkVHX0lOR19DT05UUk9MIGVxdWFscyBSRUdfQ09OVFJPTCB3aXRoIGllID0gMCwgbGlrZXdpc2UgUkVHX0VHUl9DT05UUk9MIGlzIGllID0gMSAqLworI2RlZmluZSBSRUdfQ09OVFJPTChpZSkJCUNSQSgweDIsaWUmMSwweDBmKQkvKiBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUkVHX0lOR19DT05UUk9MCQlDUkEoMHgyLDB4MCwweDBmKQkvKiBJbmdyZXNzIGNvbnRyb2wgKGFsaWFzKSAqLworI2RlZmluZSBSRUdfRUdSX0NPTlRST0wJCUNSQSgweDIsMHgxLDB4MGYpCS8qIEVncmVzcyBjb250cm9sIChhbGlhcykgKi8KKyNkZWZpbmUgUkVHX0FHRV9USU1FUihpZSkJQ1JBKDB4MixpZSYxLDB4MWYpCS8qIEFnaW5nIHRpbWVyICovCisjZGVmaW5lIFJFR19BR0VfSU5DKGllKQkJQ1JBKDB4MixpZSYxLDB4MmYpCS8qIEFnaW5nIGluY3JlbWVudCAqLworI2RlZmluZSBERUJVR19PVVQoaWUpCQlDUkEoMHgyLGllJjEsMHgzZikJLyogT3V0cHV0IGRlYnVnIGNvdW50ZXIgY29udHJvbCAqLworI2RlZmluZSBERUJVR19DTlQoaWUpCQlDUkEoMHgyLGllJjEsMHg0ZikJLyogT3V0cHV0IGRlYnVnIGNvdW50ZXIgKi8KKworLyogU1BJNCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgUkVHX1NQSTRfTUlTQwkJQ1JBKDB4NSwweDAsMHgwMCkJLyogTWlzYyBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfU1BJNF9TVEFUVVMJCUNSQSgweDUsMHgwLDB4MDEpCS8qIENNTCBTdGF0dXMgKi8KKyNkZWZpbmUgUkVHX1NQSTRfSU5HX1NFVFVQMAlDUkEoMHg1LDB4MCwweDAyKQkvKiBJbmdyZXNzIFN0YXR1cyBDaGFubmVsIFNldHVwICovCisjZGVmaW5lIFJFR19TUEk0X0lOR19TRVRVUDEJQ1JBKDB4NSwweDAsMHgwMykJLyogSW5ncmVzcyBEYXRhIFRyYWluaW5nIFNldHVwICovCisjZGVmaW5lIFJFR19TUEk0X0lOR19TRVRVUDIJQ1JBKDB4NSwweDAsMHgwNCkJLyogSW5ncmVzcyBEYXRhIEJ1cnN0IFNpemUgU2V0dXAgKi8KKyNkZWZpbmUgUkVHX1NQSTRfRUdSX1NFVFVQMAlDUkEoMHg1LDB4MCwweDA1KQkvKiBFZ3Jlc3MgU3RhdHVzIENoYW5uZWwgU2V0dXAgKi8KKyNkZWZpbmUgUkVHX1NQSTRfREJHX0NOVChuKQlDUkEoMHg1LDB4MCwweDEwK24pCS8qIERlYnVnIGNvdW50ZXJzIDAtOSAqLworI2RlZmluZSBSRUdfU1BJNF9EQkdfU0VUVVAJQ1JBKDB4NSwweDAsMHgxQSkJLyogRGVidWcgY291bnRlcnMgc2V0dXAgKi8KKyNkZWZpbmUgUkVHX1NQSTRfVEVTVAkJQ1JBKDB4NSwweDAsMHgyMCkJLyogVGVzdCBTZXR1cCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfVFBHRU5fVVAwCQlDUkEoMHg1LDB4MCwweDIxKQkvKiBUZXN0IFBhdHRlcm4gZ2VuZXJhdG9yIHVzZXIgcGF0dGVybiAwICovCisjZGVmaW5lIFJFR19UUEdFTl9VUDEJCUNSQSgweDUsMHgwLDB4MjIpCS8qIFRlc3QgUGF0dGVybiBnZW5lcmF0b3IgdXNlciBwYXR0ZXJuIDEgKi8KKyNkZWZpbmUgUkVHX1RQQ0hLX1VQMAkJQ1JBKDB4NSwweDAsMHgyMykJLyogVGVzdCBQYXR0ZXJuIGNoZWNrZXIgdXNlciBwYXR0ZXJuIDAgKi8KKyNkZWZpbmUgUkVHX1RQQ0hLX1VQMQkJQ1JBKDB4NSwweDAsMHgyNCkJLyogVGVzdCBQYXR0ZXJuIGNoZWNrZXIgdXNlciBwYXR0ZXJuIDEgKi8KKyNkZWZpbmUgUkVHX1RQU0FNX1AwCQlDUkEoMHg1LDB4MCwweDI1KQkvKiBTYW1wbGVkIHBhdHRlcm4gMCAqLworI2RlZmluZSBSRUdfVFBTQU1fUDEJCUNSQSgweDUsMHgwLDB4MjYpCS8qIFNhbXBsZWQgcGF0dGVybiAxICovCisjZGVmaW5lIFJFR19UUEVSUl9DTlQJCUNSQSgweDUsMHgwLDB4MjcpCS8qIFBhdHRlcm4gY2hlY2tlciBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIFJFR19TUEk0X1NUSUNLWQkJQ1JBKDB4NSwweDAsMHgzMCkJLyogU3RpY2t5IGJpdHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1NQSTRfREJHX0lOSAlDUkEoMHg1LDB4MCwweDMxKQkvKiBDb3JlIGVncmVzcyAmIGluZ3Jlc3MgaW5oaWJpdCAqLworI2RlZmluZSBSRUdfU1BJNF9EQkdfU1RBVFVTCUNSQSgweDUsMHgwLDB4MzIpCS8qIFNhbXBsZWQgaW5ncmVzcyBzdGF0dXMgKi8KKyNkZWZpbmUgUkVHX1NQSTRfREJHX0dSQU5UCUNSQSgweDUsMHgwLDB4MzMpCS8qIEluZ3Jlc3MgY3JhbnRlZCBjcmVkaXQgdmFsdWUgKi8KKworI2RlZmluZSBSRUdfU1BJNF9ERVNLRVcgCUNSQSgweDUsMHgwLDB4NDMpCS8qIEluZ3Jlc3MgY3JhbnRlZCBjcmVkaXQgdmFsdWUgKi8KKworLyogMTBHYkUgTUFDIEJsb2NrIFJlZ2lzdGVycyAqLworLyogTm90ZSB0aGF0IHRob3NlIHJlZ2lzdGVycyB0aGF0IGFyZSBleGFjdGx5IHRoZSBzYW1lIGZvciAxMEdiRSBhcyBmb3IKKyAqIHRyaS1zcGVlZCBhcmUgb25seSBkZWZpbmVkIHdpdGggdGhlIHZlcnNpb24gdGhhdCBuZWVkcyBhIHBvcnQgbnVtYmVyLgorICogUGFzcyAweGEgaW4gdGhvc2UgY2FzZXMuCisgKgorICogQWxzbyBub3RlIHRoYXQgZGVzcGl0ZSB0aGUgcHJlc2VuY2Ugb2YgYSBNQUMgYWRkcmVzcyByZWdpc3RlciwgdGhpcyBwYXJ0CisgKiBkb2VzIG5vIGluZ3Jlc3MgTUFDIGFkZHJlc3MgZmlsdGVyaW5nLiAgVGhhdCByZWdpc3RlciBpcyB1c2VkIG9ubHkgZm9yCisgKiBwYXVzZSBmcmFtZSBkZXRlY3Rpb24gYW5kIGdlbmVyYXRpb24uCisgKi8KKy8qIDEwR2JFIHNwZWNpZmljLCBhbmQgZGlmZmVyZW50IGZyb20gdHJpLXNwZWVkICovCisjZGVmaW5lIFJFR19NSVNDXzEwRwkJQ1JBKDB4MSwweGEsMHgwMCkJLyogTWlzYyAxMEdiRSBzZXR1cCAqLworI2RlZmluZSBSRUdfUEFVU0VfMTBHCQlDUkEoMHgxLDB4YSwweDAxKQkvKiBQYXVzZSByZWdpc3RlciAqLworI2RlZmluZSBSRUdfTk9STUFMSVpFUl8xMEcJQ1JBKDB4MSwweGEsMHgwNSkJLyogMTBHIG5vcm1hbGl6ZXIgKi8KKyNkZWZpbmUgUkVHX1NUSUNLWV9SWAkJQ1JBKDB4MSwweGEsMHgwNikJLyogUlggZGVidWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0RFTk9STV8xMEcJCUNSQSgweDEsMHhhLDB4MDcpCS8qIERlbm9ybWFsaXplciAgKi8KKyNkZWZpbmUgUkVHX1NUSUNLWV9UWAkJQ1JBKDB4MSwweGEsMHgwOCkJLyogVFggc3RpY2t5IGJpdHMgKi8KKyNkZWZpbmUgUkVHX01BWF9SWEhJR0gJCUNSQSgweDEsMHhhLDB4MGEpCS8qIFhHTUlJIGxhbmUgMC0zIGRlYnVnICovCisjZGVmaW5lIFJFR19NQVhfUlhMT1cJCUNSQSgweDEsMHhhLDB4MGIpCS8qIFhHTUlJIGxhbmUgNC03IGRlYnVnICovCisjZGVmaW5lIFJFR19NQUNfVFhfU1RJQ0tZCUNSQSgweDEsMHhhLDB4MGMpCS8qIE1BQyBUeCBzdGF0ZSBzdGlja3kgZGVidWcgKi8KKyNkZWZpbmUgUkVHX01BQ19UWF9SVU5OSU5HCUNSQSgweDEsMHhhLDB4MGQpCS8qIE1BQyBUeCBzdGF0ZSBydW5uaW5nIGRlYnVnICovCisjZGVmaW5lIFJFR19UWF9BQk9SVF9BR0UJQ1JBKDB4MSwweGEsMHgxNCkJLyogQWdlZCBUeCBmcmFtZXMgZGlzY2FyZGVkICovCisjZGVmaW5lIFJFR19UWF9BQk9SVF9TSE9SVAlDUkEoMHgxLDB4YSwweDE1KQkvKiBTaG9ydCBUeCBmcmFtZXMgZGlzY2FyZGVkICovCisjZGVmaW5lIFJFR19UWF9BQk9SVF9UQVhJCUNSQSgweDEsMHhhLDB4MTYpCS8qIFRheGkgZXJyb3IgZnJhbWVzIGRpc2NhcmRlZCAqLworI2RlZmluZSBSRUdfVFhfQUJPUlRfVU5ERVJSVU4JQ1JBKDB4MSwweGEsMHgxNykJLyogVHggVW5kZXJydW4gYWJvcnQgY291bnRlciAqLworI2RlZmluZSBSRUdfVFhfREVOT1JNX0RJU0NBUkQJQ1JBKDB4MSwweGEsMHgxOCkJLyogVHggZGVub3JtYWxpemVyIGRpc2NhcmRzICovCisjZGVmaW5lIFJFR19YQVVJX1NUQVRfQQkJQ1JBKDB4MSwweGEsMHgyMCkJLyogWEFVSSBzdGF0dXMgQSAqLworI2RlZmluZSBSRUdfWEFVSV9TVEFUX0IJCUNSQSgweDEsMHhhLDB4MjEpCS8qIFhBVUkgc3RhdHVzIEIgKi8KKyNkZWZpbmUgUkVHX1hBVUlfU1RBVF9DCQlDUkEoMHgxLDB4YSwweDIyKQkvKiBYQVVJIHN0YXR1cyBDICovCisjZGVmaW5lIFJFR19YQVVJX0NPTkZfQQkJQ1JBKDB4MSwweGEsMHgyMykJLyogWEFVSSBjb25maWd1cmF0aW9uIEEgKi8KKyNkZWZpbmUgUkVHX1hBVUlfQ09ORl9CCQlDUkEoMHgxLDB4YSwweDI0KQkvKiBYQVVJIGNvbmZpZ3VyYXRpb24gQiAqLworI2RlZmluZSBSRUdfWEFVSV9DT0RFX0dSUF9DTlQJQ1JBKDB4MSwweGEsMHgyNSkJLyogWEFVSSBjb2RlIGdyb3VwIGVycm9yIGNvdW50ICovCisjZGVmaW5lIFJFR19YQVVJX0NPTkZfVEVTVF9BCUNSQSgweDEsMHhhLDB4MjYpCS8qIFhBVUkgdGVzdCByZWdpc3RlciBBICovCisjZGVmaW5lIFJFR19QREVSUkNOVAkJQ1JBKDB4MSwweGEsMHgyNykJLyogWEFVSSB0ZXN0IHJlZ2lzdGVyIEIgKi8KKworLyogcG4gPSBwb3J0IG51bWJlciAwLTkgZm9yIHRyaS1zcGVlZCwgMTAgZm9yIDEwR2JFICovCisvKiBCb3RoIHRyaS1zcGVlZCBhbmQgMTBHYkUgKi8KKyNkZWZpbmUgUkVHX01BWF9MRU4ocG4pCQlDUkEoMHgxLHBuLDB4MDIpCS8qIE1heCBsZW5ndGggKi8KKyNkZWZpbmUgUkVHX01BQ19ISUdIX0FERFIocG4pCUNSQSgweDEscG4sMHgwMykJLyogVXBwZXIgMjQgYml0cyBvZiBNQUMgYWRkciAqLworI2RlZmluZSBSRUdfTUFDX0xPV19BRERSKHBuKQlDUkEoMHgxLHBuLDB4MDQpCS8qIExvd2VyIDI0IGJpdHMgb2YgTUFDIGFkZHIgKi8KKworLyogdHJpLXNwZWVkIG9ubHkKKyAqIHBuID0gcG9ydCBudW1iZXIsIDAtOQorICovCisjZGVmaW5lIFJFR19NT0RFX0NGRyhwbikJQ1JBKDB4MSxwbiwweDAwKQkvKiBNb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUkVHX1BBVVNFX0NGRyhwbikJQ1JBKDB4MSxwbiwweDAxKQkvKiBQYXVzZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFJFR19OT1JNQUxJWkVSKHBuKQlDUkEoMHgxLHBuLDB4MDUpCS8qIE5vcm1hbGl6ZXIgKi8KKyNkZWZpbmUgUkVHX1RCSV9TVEFUVVMocG4pCUNSQSgweDEscG4sMHgwNikJLyogVEJJIHN0YXR1cyAqLworI2RlZmluZSBSRUdfUENTX1NUQVRVU19EQkcocG4pCUNSQSgweDEscG4sMHgwNykJLyogUENTIHN0YXR1cyBkZWJ1ZyAqLworI2RlZmluZSBSRUdfUENTX0NUUkwocG4pCUNSQSgweDEscG4sMHgwOCkJLyogUENTIGNvbnRyb2wgKi8KKyNkZWZpbmUgUkVHX1RCSV9DT05GSUcocG4pCUNSQSgweDEscG4sMHgwOSkJLyogVEJJIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUkVHX1NUSUNLX0JJVChwbikJQ1JBKDB4MSxwbiwweDBhKQkvKiBTdGlja3kgYml0cyAqLworI2RlZmluZSBSRUdfREVWX1NFVFVQKHBuKQlDUkEoMHgxLHBuLDB4MGIpCS8qIE1BQyBjbG9jay9yZXNldCBzZXR1cCAqLworI2RlZmluZSBSRUdfRFJPUF9DTlQocG4pCUNSQSgweDEscG4sMHgwYykJLyogRHJvcCBjb3VudGVyICovCisjZGVmaW5lIFJFR19QT1JUX1BPUyhwbikJQ1JBKDB4MSxwbiwweDBkKQkvKiBQcmVhbWJsZSBwb3J0IHBvc2l0aW9uICovCisjZGVmaW5lIFJFR19QT1JUX0ZBSUwocG4pCUNSQSgweDEscG4sMHgwZSkJLyogUHJlYW1ibGUgcG9ydCBwb3NpdGlvbiAqLworI2RlZmluZSBSRUdfU0VSREVTX0NPTkYocG4pCUNSQSgweDEscG4sMHgwZikJLyogU2VyRGVzIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUkVHX1NFUkRFU19URVNUKHBuKQlDUkEoMHgxLHBuLDB4MTApCS8qIFNlckRlcyB0ZXN0ICovCisjZGVmaW5lIFJFR19TRVJERVNfU1RBVChwbikJQ1JBKDB4MSxwbiwweDExKQkvKiBTZXJEZXMgc3RhdHVzICovCisjZGVmaW5lIFJFR19TRVJERVNfQ09NX0NOVChwbikJQ1JBKDB4MSxwbiwweDEyKQkvKiBTZXJEZXMgY29tbWEgY291bnRlciAqLworI2RlZmluZSBSRUdfREVOT1JNKHBuKQkJQ1JBKDB4MSxwbiwweDE1KQkvKiBGcmFtZSBkZW5vcm1hbGl6YXRpb24gKi8KKyNkZWZpbmUgUkVHX0RCRyhwbikJCUNSQSgweDEscG4sMHgxNikJLyogRGV2aWNlIDFHIGRlYnVnICovCisjZGVmaW5lIFJFR19UWF9JRkcocG4pCQlDUkEoMHgxLHBuLDB4MTgpCS8qIFR4IElGRyBjb25maWcgKi8KKyNkZWZpbmUgUkVHX0hEWChwbikJCUNSQSgweDEscG4sMHgxOSkJLyogSGFsZi1kdXBsZXggY29uZmlnICovCisKKy8qIFN0YXRpc3RpY3MgKi8KKy8qIHBuID0gcG9ydCBudW1iZXIsIDAtYSwgYSA9IDEwR2JFICovCisjZGVmaW5lIFJFR19SWF9JTl9CWVRFUyhwbikJQ1JBKDB4NCxwbiwweDAwKQkvKiAjIFJ4IGluIG9jdGV0cyAqLworI2RlZmluZSBSRUdfUlhfU1lNQk9MX0NBUlJJRVIocG4pIENSQSgweDQscG4sMHgwMSkJLyogRnJhbWVzIHcvIHN5bWJvbCBlcnJvcnMgKi8KKyNkZWZpbmUgUkVHX1JYX1BBVVNFKHBuKQlDUkEoMHg0LHBuLDB4MDIpCS8qICMgcGF1c2UgZnJhbWVzIHJlY2VpdmVkICovCisjZGVmaW5lIFJFR19SWF9VTlNVUF9PUENPREUocG4pCUNSQSgweDQscG4sMHgwMykJLyogIyBjb250cm9sIGZyYW1lcyB3aXRoIHVuc3VwcG9ydGVkIG9wY29kZSAqLworI2RlZmluZSBSRUdfUlhfT0tfQllURVMocG4pCUNSQSgweDQscG4sMHgwNCkJLyogIyBvY3RldHMgaW4gZ29vZCBmcmFtZXMgKi8KKyNkZWZpbmUgUkVHX1JYX0JBRF9CWVRFUyhwbikJQ1JBKDB4NCxwbiwweDA1KQkvKiAjIG9jdGV0cyBpbiBiYWQgZnJhbWVzICovCisjZGVmaW5lIFJFR19SWF9VTklDQVNUKHBuKQlDUkEoMHg0LHBuLDB4MDYpCS8qICMgZ29vZCB1bmljYXN0IGZyYW1lcyAqLworI2RlZmluZSBSRUdfUlhfTVVMVElDQVNUKHBuKQlDUkEoMHg0LHBuLDB4MDcpCS8qICMgZ29vZCBtdWx0aWNhc3QgZnJhbWVzICovCisjZGVmaW5lIFJFR19SWF9CUk9BRENBU1QocG4pCUNSQSgweDQscG4sMHgwOCkJLyogIyBnb29kIGJyb2FkY2FzdCBmcmFtZXMgKi8KKyNkZWZpbmUgUkVHX0NSQyhwbikJCUNSQSgweDQscG4sMHgwOSkJLyogIyBmcmFtZXMgdy8gYmFkIENSQyBvbmx5ICovCisjZGVmaW5lIFJFR19SWF9BTElHTk1FTlQocG4pCUNSQSgweDQscG4sMHgwYSkJLyogIyBmcmFtZXMgdy8gYWxpZ25tZW50IGVyciAqLworI2RlZmluZSBSRUdfUlhfVU5ERVJTSVpFKHBuKQlDUkEoMHg0LHBuLDB4MGIpCS8qICMgZnJhbWVzIHVuZGVyc2l6ZSAqLworI2RlZmluZSBSRUdfUlhfRlJBR01FTlRTKHBuKQlDUkEoMHg0LHBuLDB4MGMpCS8qICMgZnJhbWVzIHVuZGVyc2l6ZSB3LyBjcmMgZXJyICovCisjZGVmaW5lIFJFR19SWF9JTl9SQU5HRV9MRU5HVEhfRVJST1IocG4pIENSQSgweDQscG4sMHgwZCkJLyogIyBmcmFtZXMgd2l0aCBsZW5ndGggZXJyb3IgKi8KKyNkZWZpbmUgUkVHX1JYX09VVF9PRl9SQU5HRV9FUlJPUihwbikgQ1JBKDB4NCxwbiwweDBlKQkvKiAjIGZyYW1lcyB3aXRoIGlsbGVnYWwgbGVuZ3RoIGZpZWxkICovCisjZGVmaW5lIFJFR19SWF9PVkVSU0laRShwbikJQ1JBKDB4NCxwbiwweDBmKQkvKiAjIGZyYW1lcyBvdmVyc2l6ZSAqLworI2RlZmluZSBSRUdfUlhfSkFCQkVSUyhwbikJQ1JBKDB4NCxwbiwweDEwKQkvKiAjIGZyYW1lcyBvdmVyc2l6ZSB3LyBjcmMgZXJyICovCisjZGVmaW5lIFJFR19SWF9TSVpFXzY0KHBuKQlDUkEoMHg0LHBuLDB4MTEpCS8qICMgZnJhbWVzIDY0IG9jdGV0cyBsb25nICovCisjZGVmaW5lIFJFR19SWF9TSVpFXzY1X1RPXzEyNyhwbikgQ1JBKDB4NCxwbiwweDEyKQkvKiAjIGZyYW1lcyA2NS0xMjcgb2N0ZXRzICovCisjZGVmaW5lIFJFR19SWF9TSVpFXzEyOF9UT18yNTUocG4pIENSQSgweDQscG4sMHgxMykJLyogIyBmcmFtZXMgMTI4LTI1NSAqLworI2RlZmluZSBSRUdfUlhfU0laRV8yNTZfVE9fNTExKHBuKSBDUkEoMHg0LHBuLDB4MTQpCS8qICMgZnJhbWVzIDI1Ni01MTEgKi8KKyNkZWZpbmUgUkVHX1JYX1NJWkVfNTEyX1RPXzEwMjMocG4pIENSQSgweDQscG4sMHgxNSkJLyogIyBmcmFtZXMgNTEyLTEwMjMgKi8KKyNkZWZpbmUgUkVHX1JYX1NJWkVfMTAyNF9UT18xNTE4KHBuKSBDUkEoMHg0LHBuLDB4MTYpCS8qICMgZnJhbWVzIDEwMjQtMTUxOCAqLworI2RlZmluZSBSRUdfUlhfU0laRV8xNTE5X1RPX01BWChwbikgQ1JBKDB4NCxwbiwweDE3KQkvKiAjIGZyYW1lcyAxNTE5LW1heCAqLworCisjZGVmaW5lIFJFR19UWF9PVVRfQllURVMocG4pCUNSQSgweDQscG4sMHgxOCkJLyogIyBvY3RldHMgdHggKi8KKyNkZWZpbmUgUkVHX1RYX1BBVVNFKHBuKQlDUkEoMHg0LHBuLDB4MTkpCS8qICMgcGF1c2UgZnJhbWVzIHNlbnQgKi8KKyNkZWZpbmUgUkVHX1RYX09LX0JZVEVTKHBuKQlDUkEoMHg0LHBuLDB4MWEpCS8qICMgb2N0ZXRzIHR4IE9LICovCisjZGVmaW5lIFJFR19UWF9VTklDQVNUKHBuKQlDUkEoMHg0LHBuLDB4MWIpCS8qICMgZnJhbWVzIHVuaWNhc3QgKi8KKyNkZWZpbmUgUkVHX1RYX01VTFRJQ0FTVChwbikJQ1JBKDB4NCxwbiwweDFjKQkvKiAjIGZyYW1lcyBtdWx0aWNhc3QgKi8KKyNkZWZpbmUgUkVHX1RYX0JST0FEQ0FTVChwbikJQ1JBKDB4NCxwbiwweDFkKQkvKiAjIGZyYW1lcyBicm9hZGNhc3QgKi8KKyNkZWZpbmUgUkVHX1RYX01VTFRJUExFX0NPTEwocG4pIENSQSgweDQscG4sMHgxZSkJLyogIyBmcmFtZXMgdHggYWZ0ZXIgbXVsdGlwbGUgY29sbGlzaW9ucyAqLworI2RlZmluZSBSRUdfVFhfTEFURV9DT0xMKHBuKQlDUkEoMHg0LHBuLDB4MWYpCS8qICMgbGF0ZSBjb2xsaXNpb25zIGRldGVjdGVkICovCisjZGVmaW5lIFJFR19UWF9YQ09MTChwbikJQ1JBKDB4NCxwbiwweDIwKQkvKiAjIGZyYW1lcyBsb3N0LCBleGNlc3NpdmUgY29sbGlzaW9ucyAqLworI2RlZmluZSBSRUdfVFhfREVGRVIocG4pCUNSQSgweDQscG4sMHgyMSkJLyogIyBmcmFtZXMgZGVmZXJyZWQgb24gZmlyc3QgdHggYXR0ZW1wdCAqLworI2RlZmluZSBSRUdfVFhfWERFRkVSKHBuKQlDUkEoMHg0LHBuLDB4MjIpCS8qICMgZnJhbWVzIGV4Y2Vzc2l2ZWx5IGRlZmVycmVkICovCisjZGVmaW5lIFJFR19UWF9DU0VOU0UocG4pCUNSQSgweDQscG4sMHgyMykJLyogY2FycmllciBzZW5zZSBlcnJvcnMgYXQgZnJhbWUgZW5kICovCisjZGVmaW5lIFJFR19UWF9TSVpFXzY0KHBuKQlDUkEoMHg0LHBuLDB4MjQpCS8qICMgZnJhbWVzIDY0IG9jdGV0cyBsb25nICovCisjZGVmaW5lIFJFR19UWF9TSVpFXzY1X1RPXzEyNyhwbikgQ1JBKDB4NCxwbiwweDI1KQkvKiAjIGZyYW1lcyA2NS0xMjcgb2N0ZXRzICovCisjZGVmaW5lIFJFR19UWF9TSVpFXzEyOF9UT18yNTUocG4pIENSQSgweDQscG4sMHgyNikJLyogIyBmcmFtZXMgMTI4LTI1NSAqLworI2RlZmluZSBSRUdfVFhfU0laRV8yNTZfVE9fNTExKHBuKSBDUkEoMHg0LHBuLDB4MjcpCS8qICMgZnJhbWVzIDI1Ni01MTEgKi8KKyNkZWZpbmUgUkVHX1RYX1NJWkVfNTEyX1RPXzEwMjMocG4pIENSQSgweDQscG4sMHgyOCkJLyogIyBmcmFtZXMgNTEyLTEwMjMgKi8KKyNkZWZpbmUgUkVHX1RYX1NJWkVfMTAyNF9UT18xNTE4KHBuKSBDUkEoMHg0LHBuLDB4MjkpCS8qICMgZnJhbWVzIDEwMjQtMTUxOCAqLworI2RlZmluZSBSRUdfVFhfU0laRV8xNTE5X1RPX01BWChwbikgQ1JBKDB4NCxwbiwweDJhKQkvKiAjIGZyYW1lcyAxNTE5LW1heCAqLworI2RlZmluZSBSRUdfVFhfU0lOR0xFX0NPTEwocG4pCUNSQSgweDQscG4sMHgyYikJLyogIyBmcmFtZXMgdHggYWZ0ZXIgc2luZ2xlIGNvbGxpc2lvbiAqLworI2RlZmluZSBSRUdfVFhfQkFDS09GRjIocG4pCUNSQSgweDQscG4sMHgyYykJLyogIyBmcmFtZXMgdHggb2sgYWZ0ZXIgMiBiYWNrb2Zmcy9jb2xsaXNpb25zICovCisjZGVmaW5lIFJFR19UWF9CQUNLT0ZGMyhwbikJQ1JBKDB4NCxwbiwweDJkKQkvKiAgIGFmdGVyIDMgYmFja29mZnMvY29sbGlzaW9ucyAqLworI2RlZmluZSBSRUdfVFhfQkFDS09GRjQocG4pCUNSQSgweDQscG4sMHgyZSkJLyogICBhZnRlciA0ICovCisjZGVmaW5lIFJFR19UWF9CQUNLT0ZGNShwbikJQ1JBKDB4NCxwbiwweDJmKQkvKiAgIGFmdGVyIDUgKi8KKyNkZWZpbmUgUkVHX1RYX0JBQ0tPRkY2KHBuKQlDUkEoMHg0LHBuLDB4MzApCS8qICAgYWZ0ZXIgNiAqLworI2RlZmluZSBSRUdfVFhfQkFDS09GRjcocG4pCUNSQSgweDQscG4sMHgzMSkJLyogICBhZnRlciA3ICovCisjZGVmaW5lIFJFR19UWF9CQUNLT0ZGOChwbikJQ1JBKDB4NCxwbiwweDMyKQkvKiAgIGFmdGVyIDggKi8KKyNkZWZpbmUgUkVHX1RYX0JBQ0tPRkY5KHBuKQlDUkEoMHg0LHBuLDB4MzMpCS8qICAgYWZ0ZXIgOSAqLworI2RlZmluZSBSRUdfVFhfQkFDS09GRjEwKHBuKQlDUkEoMHg0LHBuLDB4MzQpCS8qICAgYWZ0ZXIgMTAgKi8KKyNkZWZpbmUgUkVHX1RYX0JBQ0tPRkYxMShwbikJQ1JBKDB4NCxwbiwweDM1KQkvKiAgIGFmdGVyIDExICovCisjZGVmaW5lIFJFR19UWF9CQUNLT0ZGMTIocG4pCUNSQSgweDQscG4sMHgzNikJLyogICBhZnRlciAxMiAqLworI2RlZmluZSBSRUdfVFhfQkFDS09GRjEzKHBuKQlDUkEoMHg0LHBuLDB4MzcpCS8qICAgYWZ0ZXIgMTMgKi8KKyNkZWZpbmUgUkVHX1RYX0JBQ0tPRkYxNChwbikJQ1JBKDB4NCxwbiwweDM4KQkvKiAgIGFmdGVyIDE0ICovCisjZGVmaW5lIFJFR19UWF9CQUNLT0ZGMTUocG4pCUNSQSgweDQscG4sMHgzOSkJLyogICBhZnRlciAxNSAqLworI2RlZmluZSBSRUdfVFhfVU5ERVJSVU4ocG4pCUNSQSgweDQscG4sMHgzYSkJLyogIyBmcmFtZXMgZHJvcHBlZCBmcm9tIHVuZGVycnVuICovCisjZGVmaW5lIFJFR19SWF9YR01JSV9QUk9UX0VSUglDUkEoMHg0LDB4YSwweDNiKQkvKiAjIHByb3RvY29sIGVycm9ycyBkZXRlY3RlZCBvbiBYR01JSSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgUkVHX1JYX0lQR19TSFJJTksocG4pCUNSQSgweDQscG4sMHgzYykJLyogIyBvZiBJUEcgc2hyaW5rcyBkZXRlY3RlZCAqLworCisjZGVmaW5lIFJFR19TVEFUX1NUSUNLWTFHKHBuKQlDUkEoMHg0LHBuLDB4M2UpCS8qIHRyaS1zcGVlZCBzdGlja3kgYml0cyAqLworI2RlZmluZSBSRUdfU1RBVF9TVElDS1kxMEcJQ1JBKDB4NCwweGEsMHgzZSkJLyogMTBHYkUgc3RpY2t5IGJpdHMgKi8KKyNkZWZpbmUgUkVHX1NUQVRfSU5JVChwbikJQ1JBKDB4NCxwbiwweDNmKQkvKiBDbGVhciBhbGwgc3RhdGlzdGljcyAqLworCisvKiBNSUktTWFuYWdlbWVudCBCbG9jayByZWdpc3RlcnMgKi8KKy8qIFRoZXNlIGFyZSBmb3IgTUlJLU0gaW50ZXJmYWNlIDAsIHdoaWNoIGlzIHRoZSBiaWRpcmVjdGlvbmFsIExWVFRMIG9uZS4gIElmCisgKiB3ZSBob29rZWQgdXAgdG8gdGhlIG9uZSB3aXRoIHNlcGFyYXRlIGRpcmVjdGlvbnMsIHRoZSBtaWRkbGUgMHgwIG5lZWRzIHRvCisgKiBjaGFuZ2UgdG8gMHgxLiAgQW5kIHRoZSBjdXJyZW50IGVycmF0YSBzdGF0ZXMgdGhhdCBNSUktTSAxIGRvZXNuJ3Qgd29yay4KKyAqLworCisjZGVmaW5lIFJFR19NSUlNX1NUQVRVUwkJQ1JBKDB4MywweDAsMHgwMCkJLyogTUlJLU0gU3RhdHVzICovCisjZGVmaW5lIFJFR19NSUlNX0NNRAkJQ1JBKDB4MywweDAsMHgwMSkJLyogTUlJLU0gQ29tbWFuZCAqLworI2RlZmluZSBSRUdfTUlJTV9EQVRBCQlDUkEoMHgzLDB4MCwweDAyKQkvKiBNSUktTSBEYXRhICovCisjZGVmaW5lIFJFR19NSUlNX1BSRVNDQUxFCUNSQSgweDMsMHgwLDB4MDMpCS8qIE1JSS1NIE1EQyBQcmVzY2FsZSAqLworCisjZGVmaW5lIFJFR19JTkdfRkZJTFRfVU1fRU4JQ1JBKDB4MiwgMCwgMHhkKQorI2RlZmluZSBSRUdfSU5HX0ZGSUxUX0JFX0VOCUNSQSgweDIsIDAsIDB4MWQpCisjZGVmaW5lIFJFR19JTkdfRkZJTFRfVkFMMAlDUkEoMHgyLCAwLCAweDJkKQorI2RlZmluZSBSRUdfSU5HX0ZGSUxUX1ZBTDEJQ1JBKDB4MiwgMCwgMHgzZCkKKyNkZWZpbmUgUkVHX0lOR19GRklMVF9NQVNLMAlDUkEoMHgyLCAwLCAweDRkKQorI2RlZmluZSBSRUdfSU5HX0ZGSUxUX01BU0sxCUNSQSgweDIsIDAsIDB4NWQpCisjZGVmaW5lIFJFR19JTkdfRkZJTFRfTUFTSzIJQ1JBKDB4MiwgMCwgMHg2ZCkKKyNkZWZpbmUgUkVHX0lOR19GRklMVF9FVFlQRQlDUkEoMHgyLCAwLCAweDdkKQorCisKKy8qIFdoZXcuICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzgyNDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDkzZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0LmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUMiBFdGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluY2x1ZGVkIGluIHRoaXMKKyAqIHJlbGVhc2UgZm9yIGxpY2Vuc2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY3BoeS5oIgorI2luY2x1ZGUgImVsbWVyMC5oIgorCisjaWZuZGVmIEFEVkVSVElTRV9QQVVTRV9DQVAKKyMgZGVmaW5lIEFEVkVSVElTRV9QQVVTRV9DQVAgMHg0MDAKKyNlbmRpZgorI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0VfQVNZTQorIyBkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0FTWU0gMHg4MDAKKyNlbmRpZgorCisvKiBHaWdhYml0IE1JSSByZWdpc3RlcnMgKi8KKyNpZm5kZWYgTUlJX0NUUkwxMDAwCisjIGRlZmluZSBNSUlfQ1RSTDEwMDAgOQorI2VuZGlmCisKKyNpZm5kZWYgQURWRVJUSVNFXzEwMDBGVUxMCisjIGRlZmluZSBBRFZFUlRJU0VfMTAwMEZVTEwgMHgyMDAKKyMgZGVmaW5lIEFEVkVSVElTRV8xMDAwSEFMRiAweDEwMAorI2VuZGlmCisKKy8qIFZTQzgyNDQgUEhZIHNwZWNpZmljIHJlZ2lzdGVycy4gKi8KK2VudW0geworCVZTQzgyNDRfSU5UUl9FTkFCTEUgICA9IDI1LAorCVZTQzgyNDRfSU5UUl9TVEFUVVMgICA9IDI2LAorCVZTQzgyNDRfQVVYX0NUUkxfU1RBVCA9IDI4LAorfTsKKworZW51bSB7CisJVlNDX0lOVFJfUlhfRVJSICAgICA9IDEgPDwgMCwKKwlWU0NfSU5UUl9NU19FUlIgICAgID0gMSA8PCAxLCAgLyogbWFzdGVyL3NsYXZlIHJlc29sdXRpb24gZXJyb3IgKi8KKwlWU0NfSU5UUl9DQUJMRSAgICAgID0gMSA8PCAyLCAgLyogY2FibGUgaW1wYWlybWVudCAqLworCVZTQ19JTlRSX0ZBTFNFX0NBUlIgPSAxIDw8IDMsICAvKiBmYWxzZSBjYXJyaWVyICovCisJVlNDX0lOVFJfTUVESUFfQ0hHICA9IDEgPDwgNCwgIC8qIEFNUyBtZWRpYSBjaGFuZ2UgKi8KKwlWU0NfSU5UUl9SWF9GSUZPICAgID0gMSA8PCA1LCAgLyogUnggRklGTyBvdmVyL3VuZGVyZmxvdyAqLworCVZTQ19JTlRSX1RYX0ZJRk8gICAgPSAxIDw8IDYsICAvKiBUeCBGSUZPIG92ZXIvdW5kZXJmbG93ICovCisJVlNDX0lOVFJfREVTQ1JBTUJMICA9IDEgPDwgNywgIC8qIGRlc2NyYW1ibGVyIGxvY2stbG9zdCAqLworCVZTQ19JTlRSX1NZTUJPTF9FUlIgPSAxIDw8IDgsICAvKiBzeW1ib2wgZXJyb3IgKi8KKwlWU0NfSU5UUl9ORUdfRE9ORSAgID0gMSA8PCAxMCwgLyogYXV0b25lZyBkb25lICovCisJVlNDX0lOVFJfTkVHX0VSUiAgICA9IDEgPDwgMTEsIC8qIGF1dG9uZWcgZXJyb3IgKi8KKwlWU0NfSU5UUl9MSU5LX0NIRyAgID0gMSA8PCAxMywgLyogbGluayBjaGFuZ2UgKi8KKwlWU0NfSU5UUl9FTkFCTEUgICAgID0gMSA8PCAxNSwgLyogaW50ZXJydXB0IGVuYWJsZSAqLworfTsKKworI2RlZmluZSBDRkdfQ0hHX0lOVFJfTUFTSyAoVlNDX0lOVFJfTElOS19DSEcgfCBWU0NfSU5UUl9ORUdfRVJSIHwgXAorCSAJCSAgIFZTQ19JTlRSX05FR19ET05FKQorI2RlZmluZSBJTlRSX01BU0sgKENGR19DSEdfSU5UUl9NQVNLIHwgVlNDX0lOVFJfVFhfRklGTyB8IFZTQ19JTlRSX1JYX0ZJRk8gfCBcCisJCSAgIFZTQ19JTlRSX0VOQUJMRSkKKworLyogUEhZIHNwZWNpZmljIGF1eGlsaWFyeSBjb250cm9sICYgc3RhdHVzIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBTX0FDU1JfQUNUSVBIWV9UTVIgICAgMAorI2RlZmluZSBNX0FDU1JfQUNUSVBIWV9UTVIgICAgMHgzCisjZGVmaW5lIFZfQUNTUl9BQ1RJUEhZX1RNUih4KSAoKHgpIDw8IFNfQUNTUl9BQ1RJUEhZX1RNUikKKworI2RlZmluZSBTX0FDU1JfU1BFRUQgICAgMworI2RlZmluZSBNX0FDU1JfU1BFRUQgICAgMHgzCisjZGVmaW5lIEdfQUNTUl9TUEVFRCh4KSAoKCh4KSA+PiBTX0FDU1JfU1BFRUQpICYgTV9BQ1NSX1NQRUVEKQorCisjZGVmaW5lIFNfQUNTUl9EVVBMRVggNQorI2RlZmluZSBGX0FDU1JfRFVQTEVYICgxIDw8IFNfQUNTUl9EVVBMRVgpCisKKyNkZWZpbmUgU19BQ1NSX0FDVElQSFkgNgorI2RlZmluZSBGX0FDU1JfQUNUSVBIWSAoMSA8PCBTX0FDU1JfQUNUSVBIWSkKKworLyoKKyAqIFJlc2V0IHRoZSBQSFkuICBUaGlzIFBIWSBjb21wbGV0ZXMgcmVzZXQgaW1tZWRpYXRlbHkgc28gd2UgbmV2ZXIgd2FpdC4KKyAqLworc3RhdGljIGludCB2c2M4MjQ0X3Jlc2V0KHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgd2FpdCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBjdGw7CisKKwllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTUNSLCAmY3RsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJY3RsICY9IH5CTUNSX1BET1dOOworCWN0bCB8PSBCTUNSX1JFU0VUOworCXJldHVybiBzaW1wbGVfbWRpb193cml0ZShjcGh5LCBNSUlfQk1DUiwgY3RsKTsKK30KKworc3RhdGljIGludCB2c2M4MjQ0X2ludHJfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXNpbXBsZV9tZGlvX3dyaXRlKGNwaHksIFZTQzgyNDRfSU5UUl9FTkFCTEUsIElOVFJfTUFTSyk7CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0cyB0aHJvdWdoIEVsbWVyICovCisJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKKwkJdTMyIGVsbWVyOworCisJCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7CisJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKKwkJICAgIGVsbWVyIHw9IEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0OworICAgICAgICAgICAgICAgIH0KKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwl9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2c2M4MjQ0X2ludHJfZGlzYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlzaW1wbGVfbWRpb193cml0ZShjcGh5LCBWU0M4MjQ0X0lOVFJfRU5BQkxFLCAwKTsKKworCWlmICh0MV9pc19hc2ljKGNwaHktPmFkYXB0ZXIpKSB7CisJCXUzMiBlbG1lcjsKKworCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCAmZWxtZXIpOworCQllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDE7CisJCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkgeworCQkgICAgZWxtZXIgJj0gfihFTE1FUjBfR1BfQklUMnxFTE1FUjBfR1BfQklUM3xFTE1FUjBfR1BfQklUNCk7CisgICAgICAgICAgICAgICAgfQorCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOworCX0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZzYzgyNDRfaW50cl9jbGVhcihzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgdmFsOworICAgIHUzMiBlbG1lcjsKKworCS8qIENsZWFyIFBIWSBpbnRlcnJ1cHRzIGJ5IHJlYWRpbmcgdGhlIHJlZ2lzdGVyLiAqLworCXNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgVlNDODI0NF9JTlRSX0VOQUJMRSwgJnZhbCk7CisKKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsICZlbG1lcik7CisJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKKwkJICAgIGVsbWVyIHw9IEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0OworICAgICAgICAgICAgICAgIH0KKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgZWxtZXIpOworCX0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogRm9yY2UgdGhlIFBIWSBzcGVlZCBhbmQgZHVwbGV4LiAgVGhpcyBhbHNvIGRpc2FibGVzIGF1dG8tbmVnb3RpYXRpb24sIGV4Y2VwdAorICogZm9yIDFHYi9zLCB3aGVyZSBhdXRvLW5lZ290aWF0aW9uIGlzIG1hbmRhdG9yeS4KKyAqLworc3RhdGljIGludCB2c2M4MjQ0X3NldF9zcGVlZF9kdXBsZXgoc3RydWN0IGNwaHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGN0bDsKKworCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQocGh5LCBNSUlfQk1DUiwgJmN0bCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChzcGVlZCA+PSAwKSB7CisJCWN0bCAmPSB+KEJNQ1JfU1BFRUQxMDAgfCBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfQU5FTkFCTEUpOworCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQljdGwgfD0gQk1DUl9TUEVFRDEwMDA7CisJfQorCWlmIChkdXBsZXggPj0gMCkgeworCQljdGwgJj0gfihCTUNSX0ZVTExEUExYIHwgQk1DUl9BTkVOQUJMRSk7CisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKwl9CisJaWYgKGN0bCAmIEJNQ1JfU1BFRUQxMDAwKSAgLyogYXV0by1uZWdvdGlhdGlvbiByZXF1aXJlZCBmb3IgMUdiL3MgKi8KKwkJY3RsIHw9IEJNQ1JfQU5FTkFCTEU7CisJcmV0dXJuIHNpbXBsZV9tZGlvX3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7Cit9CisKK2ludCB0MV9tZGlvX3NldF9iaXRzKHN0cnVjdCBjcGh5ICpwaHksIGludCBtbWQsIGludCByZWcsIHVuc2lnbmVkIGludCBiaXRzKQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKworICAgIHJldCA9IG1kaW9fcmVhZChwaHksIG1tZCwgcmVnLCAmdmFsKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0ID0gbWRpb193cml0ZShwaHksIG1tZCwgcmVnLCB2YWwgfCBiaXRzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZzYzgyNDRfYXV0b25lZ19lbmFibGUoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJcmV0dXJuIHQxX21kaW9fc2V0X2JpdHMoY3BoeSwgMCwgTUlJX0JNQ1IsCisJCQkJQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKK30KKworc3RhdGljIGludCB2c2M4MjQ0X2F1dG9uZWdfcmVzdGFydChzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlyZXR1cm4gdDFfbWRpb19zZXRfYml0cyhjcGh5LCAwLCBNSUlfQk1DUiwgQk1DUl9BTlJFU1RBUlQpOworfQorCitzdGF0aWMgaW50IHZzYzgyNDRfYWR2ZXJ0aXNlKHN0cnVjdCBjcGh5ICpwaHksIHVuc2lnbmVkIGludCBhZHZlcnRpc2VfbWFwKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwllcnIgPSBzaW1wbGVfbWRpb19yZWFkKHBoeSwgTUlJX0NUUkwxMDAwLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdmFsICY9IH4oQURWRVJUSVNFXzEwMDBIQUxGIHwgQURWRVJUSVNFXzEwMDBGVUxMKTsKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTAwMEhBTEY7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCisJZXJyID0gc2ltcGxlX21kaW9fd3JpdGUocGh5LCBNSUlfQ1RSTDEwMDAsIHZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXZhbCA9IDE7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJdmFsIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJdmFsIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJdmFsIHw9IEFEVkVSVElTRV8xMDBGVUxMOworCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF9QQVVTRSkKKwkJdmFsIHw9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEX0FTWU1fUEFVU0UpCisJCXZhbCB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwlyZXR1cm4gc2ltcGxlX21kaW9fd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCB2YWwpOworfQorCitzdGF0aWMgaW50IHZzYzgyNDRfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgKmxpbmtfb2ssCisJCQkJICAgICBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCwgaW50ICpmYykKK3sKKwl1bnNpZ25lZCBpbnQgYm1jciwgc3RhdHVzLCBscGEsIGFkdjsKKwlpbnQgZXJyLCBzcCA9IC0xLCBkcGx4ID0gLTEsIHBhdXNlID0gMDsKKworCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgTUlJX0JNQ1IsICZibWNyKTsKKwlpZiAoIWVycikKKwkJZXJyID0gc2ltcGxlX21kaW9fcmVhZChjcGh5LCBNSUlfQk1TUiwgJnN0YXR1cyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChsaW5rX29rKSB7CisJCS8qCisJCSAqIEJNU1JfTFNUQVRVUyBpcyBsYXRjaC1sb3csIHNvIGlmIGl0IGlzIDAgd2UgbmVlZCB0byByZWFkIGl0CisJCSAqIG9uY2UgbW9yZSB0byBnZXQgdGhlIGN1cnJlbnQgbGluayBzdGF0ZS4KKwkJICovCisJCWlmICghKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykpCisJCQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTVNSLCAmc3RhdHVzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCSpsaW5rX29rID0gKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgIT0gMDsKKwl9CisJaWYgKCEoYm1jciAmIEJNQ1JfQU5FTkFCTEUpKSB7CisJCWRwbHggPSAoYm1jciAmIEJNQ1JfRlVMTERQTFgpID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwkJaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwMCkKKwkJCXNwID0gU1BFRURfMTAwMDsKKwkJZWxzZSBpZiAoYm1jciAmIEJNQ1JfU1BFRUQxMDApCisJCQlzcCA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJc3AgPSBTUEVFRF8xMDsKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSB7CisJCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgVlNDODI0NF9BVVhfQ1RSTF9TVEFULCAmc3RhdHVzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZHBseCA9IChzdGF0dXMgJiBGX0FDU1JfRFVQTEVYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCXNwID0gR19BQ1NSX1NQRUVEKHN0YXR1cyk7CisJCWlmIChzcCA9PSAwKQorCQkJc3AgPSBTUEVFRF8xMDsKKwkJZWxzZSBpZiAoc3AgPT0gMSkKKwkJCXNwID0gU1BFRURfMTAwOworCQllbHNlCisJCQlzcCA9IFNQRUVEXzEwMDA7CisKKwkJaWYgKGZjICYmIGRwbHggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgTUlJX0xQQSwgJmxwYSk7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9BRFZFUlRJU0UsCisJCQkJCQkgICAgICAgJmFkdik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCWlmIChscGEgJiBhZHYgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKQorCQkJCXBhdXNlID0gUEFVU0VfUlggfCBQQVVTRV9UWDsKKwkJCWVsc2UgaWYgKChscGEgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSAmJgorCQkJCSAobHBhICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pICYmCisJCQkJIChhZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkpCisJCQkJcGF1c2UgPSBQQVVTRV9UWDsKKwkJCWVsc2UgaWYgKChscGEgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgJiYKKwkJCQkgKGFkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApKQorCQkJCXBhdXNlID0gUEFVU0VfUlg7CisJCX0KKwl9CisJaWYgKHNwZWVkKQorCQkqc3BlZWQgPSBzcDsKKwlpZiAoZHVwbGV4KQorCQkqZHVwbGV4ID0gZHBseDsKKwlpZiAoZmMpCisJCSpmYyA9IHBhdXNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZzYzgyNDRfaW50cl9oYW5kbGVyKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXVuc2lnbmVkIGludCBjYXVzZTsKKwlpbnQgZXJyLCBjcGh5X2NhdXNlID0gMDsKKworCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgVlNDODI0NF9JTlRSX1NUQVRVUywgJmNhdXNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJY2F1c2UgJj0gSU5UUl9NQVNLOworCWlmIChjYXVzZSAmIENGR19DSEdfSU5UUl9NQVNLKQorCQljcGh5X2NhdXNlIHw9IGNwaHlfY2F1c2VfbGlua19jaGFuZ2U7CisJaWYgKGNhdXNlICYgKFZTQ19JTlRSX1JYX0ZJRk8gfCBWU0NfSU5UUl9UWF9GSUZPKSkKKwkJY3BoeV9jYXVzZSB8PSBjcGh5X2NhdXNlX2ZpZm9fZXJyb3I7CisJcmV0dXJuIGNwaHlfY2F1c2U7Cit9CisKK3N0YXRpYyB2b2lkIHZzYzgyNDRfZGVzdHJveShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlrZnJlZShjcGh5KTsKK30KKworc3RhdGljIHN0cnVjdCBjcGh5X29wcyB2c2M4MjQ0X29wcyA9IHsKKwkuZGVzdHJveSAgICAgICAgICAgICAgPSB2c2M4MjQ0X2Rlc3Ryb3ksCisJLnJlc2V0ICAgICAgICAgICAgICAgID0gdnNjODI0NF9yZXNldCwKKwkuaW50ZXJydXB0X2VuYWJsZSAgICAgPSB2c2M4MjQ0X2ludHJfZW5hYmxlLAorCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICA9IHZzYzgyNDRfaW50cl9kaXNhYmxlLAorCS5pbnRlcnJ1cHRfY2xlYXIgICAgICA9IHZzYzgyNDRfaW50cl9jbGVhciwKKwkuaW50ZXJydXB0X2hhbmRsZXIgICAgPSB2c2M4MjQ0X2ludHJfaGFuZGxlciwKKwkuYXV0b25lZ19lbmFibGUgICAgICAgPSB2c2M4MjQ0X2F1dG9uZWdfZW5hYmxlLAorCS5hdXRvbmVnX3Jlc3RhcnQgICAgICA9IHZzYzgyNDRfYXV0b25lZ19yZXN0YXJ0LAorCS5hZHZlcnRpc2UgICAgICAgICAgICA9IHZzYzgyNDRfYWR2ZXJ0aXNlLAorCS5zZXRfc3BlZWRfZHVwbGV4ICAgICA9IHZzYzgyNDRfc2V0X3NwZWVkX2R1cGxleCwKKwkuZ2V0X2xpbmtfc3RhdHVzICAgICAgPSB2c2M4MjQ0X2dldF9saW5rX3N0YXR1cworfTsKKworc3RhdGljIHN0cnVjdCBjcGh5KiB2c2M4MjQ0X3BoeV9jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCit7CisJc3RydWN0IGNwaHkgKmNwaHkgPSBremFsbG9jKHNpemVvZigqY3BoeSksIEdGUF9LRVJORUwpOworCisJaWYgKCFjcGh5KSByZXR1cm4gTlVMTDsKKworCWNwaHlfaW5pdChjcGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJnZzYzgyNDRfb3BzLCBtZGlvX29wcyk7CisKKwlyZXR1cm4gY3BoeTsKK30KKworCitzdGF0aWMgaW50IHZzYzgyNDRfcGh5X3Jlc2V0KGFkYXB0ZXJfdCogYWRhcHRlcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdwaHkgdDFfdnNjODI0NF9vcHMgPSB7CisJdnNjODI0NF9waHlfY3JlYXRlLAorCXZzYzgyNDRfcGh5X3Jlc2V0Cit9OworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjODI0NF9yZWcuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjODI0NF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2MxODI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0X3JlZy5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiAkRGF0ZTogMjAwNS8xMS8yMyAxNjoyODo1MyAkICRSQ1NmaWxlOiB2c2M4MjQ0X3JlZy5oLHYgJCAkUmV2aXNpb246IDEuMSAkICovCisjaWZuZGVmIENIRUxTSU9fTVY4RTFYWFhfSAorI2RlZmluZSBDSEVMU0lPX01WOEUxWFhYX0gKKworI2lmbmRlZiBCTUNSX1NQRUVEMTAwMAorIyBkZWZpbmUgQk1DUl9TUEVFRDEwMDAgMHg0MAorI2VuZGlmCisKKyNpZm5kZWYgQURWRVJUSVNFX1BBVVNFCisjIGRlZmluZSBBRFZFUlRJU0VfUEFVU0UgMHg0MDAKKyNlbmRpZgorI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0VfQVNZTQorIyBkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0FTWU0gMHg4MDAKKyNlbmRpZgorCisvKiBHaWdhYml0IE1JSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUlJX0dCTVIgMSAgICAgICAvKiAxMDAwQmFzZS1UIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0dCQ1IgOSAgICAgICAvKiAxMDAwQmFzZS1UIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0dCU1IgMTAgICAgICAvKiAxMDAwQmFzZS1UIHN0YXR1cyByZWdpc3RlciAqLworCisvKiAxMDAwQmFzZS1UIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEdCQ1JfQURWXzEwMDBIQUxGICAgICAgICAgMHgxMDAKKyNkZWZpbmUgR0JDUl9BRFZfMTAwMEZVTEwgICAgICAgICAweDIwMAorI2RlZmluZSBHQkNSX1BSRUZFUl9NQVNURVIgICAgICAgIDB4NDAwCisjZGVmaW5lIEdCQ1JfTUFOVUFMX0FTX01BU1RFUiAgICAgMHg4MDAKKyNkZWZpbmUgR0JDUl9NQU5VQUxfQ09ORklHX0VOQUJMRSAweDEwMDAKKworLyogMTAwMEJhc2UtVCBzdGF0dXMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEdCU1JfTFBfMTAwMEhBTEYgIDB4NDAwCisjZGVmaW5lIEdCU1JfTFBfMTAwMEZVTEwgIDB4ODAwCisjZGVmaW5lIEdCU1JfUkVNT1RFX09LICAgIDB4MTAwMAorI2RlZmluZSBHQlNSX0xPQ0FMX09LICAgICAweDIwMDAKKyNkZWZpbmUgR0JTUl9MT0NBTF9NQVNURVIgMHg0MDAwCisjZGVmaW5lIEdCU1JfTUFTVEVSX0ZBVUxUIDB4ODAwMAorCisvKiBWaXRlc3NlIFBIWSBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMuICovCisjaWYgMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfSkFCQkVSICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBWU0M4MjQ0X0lOVFJfUE9MQVJJVFlfQ0hORyAgIDB4MDAwMgorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRU5HX0RFVEVDVF9DSE5HIDB4MDAxMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRE9XTlNISUZUICAgICAgIDB4MDAyMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfTURJX1hPVkVSX0NITkcgIDB4MDA0MAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRklGT19PVkVSX1VOREVSIDB4MDA4MAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRkFMU0VfQ0FSUklFUiAgIDB4MDEwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1lNQk9MX0VSUk9SICAgIDB4MDIwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfTElOS19DSE5HICAgICAgIDB4MDQwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfQVVUT05FR19ET05FICAgIDB4MDgwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfUEFHRV9SRUNWICAgICAgIDB4MTAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRFVQTEVYX0NITkcgICAgIDB4MjAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1BFRURfQ0hORyAgICAgIDB4NDAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfQVVUT05FR19FUlIgICAgIDB4ODAwMAorI2Vsc2UKKy8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfSkFCQkVSICAgICAgICAgIDB4MDAwMQorLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9QT0xBUklUWV9DSE5HICAgMHgwMDAyCisvLyNkZWZpbmUgVlNDODI0NF9JTlRSX0JJVDIgICAgICAgICAgICAweDAwMDQKKy8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfQklUMyAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfUlhfRVJSICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBWU0M4MjQ0X0lOVFJfTUFTVEVSX1NMQVZFICAgIDB4MDAwMgorI2RlZmluZSBWU0M4MjQ0X0lOVFJfQ0FCTEVfSU1QQUlSRUQgIDB4MDAwNAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRkFMU0VfQ0FSUklFUiAgIDB4MDAwOAorLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9FTkdfREVURUNUX0NITkcgMHgwMDEwCisvLyNkZWZpbmUgVlNDODI0NF9JTlRSX0RPV05TSElGVCAgICAgICAweDAwMjAKKy8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfTURJX1hPVkVSX0NITkcgIDB4MDA0MAorLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9GSUZPX09WRVJfVU5ERVIgMHgwMDgwCisjZGVmaW5lIFZTQzgyNDRfSU5UUl9CSVQ0ICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFZTQzgyNDRfSU5UUl9GSUZPX1JYICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFZTQzgyNDRfSU5UUl9GSUZPX09WRVJfVU5ERVIgMHgwMDQwCisjZGVmaW5lIFZTQzgyNDRfSU5UUl9MT0NLX0xPU1QgICAgICAgMHgwMDgwCisvLyNkZWZpbmUgVlNDODI0NF9JTlRSX0ZBTFNFX0NBUlJJRVIgICAweDAxMDAKKy8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1lNQk9MX0VSUk9SICAgIDB4MDIwMAorLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9MSU5LX0NITkcgICAgICAgMHgwNDAwCisvLyNkZWZpbmUgVlNDODI0NF9JTlRSX0FVVE9ORUdfRE9ORSAgICAweDA4MDAKKyNkZWZpbmUgVlNDODI0NF9JTlRSX1NZTUJPTF9FUlJPUiAgICAweDAxMDAKKyNkZWZpbmUgVlNDODI0NF9JTlRSX0VOR19ERVRFQ1RfQ0hORyAweDAyMDAKKyNkZWZpbmUgVlNDODI0NF9JTlRSX0FVVE9ORUdfRE9ORSAgICAweDA0MDAKKyNkZWZpbmUgVlNDODI0NF9JTlRSX0FVVE9ORUdfRVJSICAgICAweDA4MDAKKy8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfUEFHRV9SRUNWICAgICAgIDB4MTAwMAorLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9EVVBMRVhfQ0hORyAgICAgMHgyMDAwCisvLyNkZWZpbmUgVlNDODI0NF9JTlRSX1NQRUVEX0NITkcgICAgICAweDQwMDAKKy8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfQVVUT05FR19FUlIgICAgIDB4ODAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfRFVQTEVYX0NITkcgICAgIDB4MTAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfTElOS19DSE5HICAgICAgIDB4MjAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1BFRURfQ0hORyAgICAgIDB4NDAwMAorI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1RBVFVTICAgICAgICAgIDB4ODAwMAorI2VuZGlmCisKKworLyogVml0ZXNzZSBQSFkgc3BlY2lmaWMgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBWU0M4MjQ0X1NQRUNJRklDX0NOVFJMX1JFR0lTVEVSICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVlNDODI0NF9TUEVDSUZJQ19TVEFUVVNfUkVHSVNURVIgICAgICAgICAgICAgIDB4MWMKKyNkZWZpbmUgVlNDODI0NF9JTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgVlNDODI0NF9JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSICAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgVlNDODI0NF9FWFRfUEhZX1NQRUNJRklDX0NOVFJMX1JFR0lTVEVSICAgICAgIDIwCisjZGVmaW5lIFZTQzgyNDRfUkVDVl9FUlJfQ05UUl9SRUdJU1RFUiAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBWU0M4MjQ0X1JFU19SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgVlNDODI0NF9HTE9CQUxfU1RBVFVTX1JFR0lTVEVSICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFZTQzgyNDRfTEVEX0NPTlRST0xfUkVHSVNURVIgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBWU0M4MjQ0X01BTlVBTF9MRURfT1ZFUlJJREVfUkVHSVNURVIgICAgICAgICAgMjUKKyNkZWZpbmUgVlNDODI0NF9FWFRfUEhZX1NQRUNJRklDX0NOVFJMXzJfUkVHSVNURVIgICAgIDI2CisjZGVmaW5lIFZTQzgyNDRfRVhUX1BIWV9TUEVDSUZJQ19TVEFUVVNfUkVHSVNURVIgICAgICAyNworI2RlZmluZSBWU0M4MjQ0X1ZJUlRVQUxfQ0FCTEVfVEVTVEVSX1JFR0lTVEVSICAgICAgICAgMjgKKyNkZWZpbmUgVlNDODI0NF9FWFRFTkRFRF9BRERSX1JFR0lTVEVSICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFZTQzgyNDRfRVhURU5ERURfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAzMAorCisvKiBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgU19QU0NSX01ESV9YT1ZFUl9NT0RFICAgIDUKKyNkZWZpbmUgTV9QU0NSX01ESV9YT1ZFUl9NT0RFICAgIDB4MworI2RlZmluZSBWX1BTQ1JfTURJX1hPVkVSX01PREUoeCkgKCh4KSA8PCBTX1BTQ1JfTURJX1hPVkVSX01PREUpCisjZGVmaW5lIEdfUFNDUl9NRElfWE9WRVJfTU9ERSh4KSAoKCh4KSA+PiBTX1BTQ1JfTURJX1hPVkVSX01PREUpICYgTV9QU0NSX01ESV9YT1ZFUl9NT0RFKQorCisvKiBFeHRlbmRlZCBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgU19ET1dOU0hJRlRfRU5BQkxFIDgKKyNkZWZpbmUgVl9ET1dOU0hJRlRfRU5BQkxFICgxIDw8IFNfRE9XTlNISUZUX0VOQUJMRSkKKworI2RlZmluZSBTX0RPV05TSElGVF9DTlQgICAgOQorI2RlZmluZSBNX0RPV05TSElGVF9DTlQgICAgMHg3CisjZGVmaW5lIFZfRE9XTlNISUZUX0NOVCh4KSAoKHgpIDw8IFNfRE9XTlNISUZUX0NOVCkKKyNkZWZpbmUgR19ET1dOU0hJRlRfQ05UKHgpICgoKHgpID4+IFNfRE9XTlNISUZUX0NOVCkgJiBNX0RPV05TSElGVF9DTlQpCisKKy8qIFBIWSBzcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIFNfUFNTUl9KQUJCRVIgMAorI2RlZmluZSBWX1BTU1JfSkFCQkVSICgxIDw8IFNfUFNTUl9KQUJCRVIpCisKKyNkZWZpbmUgU19QU1NSX1BPTEFSSVRZIDEKKyNkZWZpbmUgVl9QU1NSX1BPTEFSSVRZICgxIDw8IFNfUFNTUl9QT0xBUklUWSkKKworI2RlZmluZSBTX1BTU1JfUlhfUEFVU0UgMgorI2RlZmluZSBWX1BTU1JfUlhfUEFVU0UgKDEgPDwgU19QU1NSX1JYX1BBVVNFKQorCisjZGVmaW5lIFNfUFNTUl9UWF9QQVVTRSAzCisjZGVmaW5lIFZfUFNTUl9UWF9QQVVTRSAoMSA8PCBTX1BTU1JfVFhfUEFVU0UpCisKKyNkZWZpbmUgU19QU1NSX0VORVJHWV9ERVRFQ1QgNAorI2RlZmluZSBWX1BTU1JfRU5FUkdZX0RFVEVDVCAoMSA8PCBTX1BTU1JfRU5FUkdZX0RFVEVDVCkKKworI2RlZmluZSBTX1BTU1JfRE9XTlNISUZUX1NUQVRVUyA1CisjZGVmaW5lIFZfUFNTUl9ET1dOU0hJRlRfU1RBVFVTICgxIDw8IFNfUFNTUl9ET1dOU0hJRlRfU1RBVFVTKQorCisjZGVmaW5lIFNfUFNTUl9NREkgNgorI2RlZmluZSBWX1BTU1JfTURJICgxIDw8IFNfUFNTUl9NREkpCisKKyNkZWZpbmUgU19QU1NSX0NBQkxFX0xFTiAgICA3CisjZGVmaW5lIE1fUFNTUl9DQUJMRV9MRU4gICAgMHg3CisjZGVmaW5lIFZfUFNTUl9DQUJMRV9MRU4oeCkgKCh4KSA8PCBTX1BTU1JfQ0FCTEVfTEVOKQorI2RlZmluZSBHX1BTU1JfQ0FCTEVfTEVOKHgpICgoKHgpID4+IFNfUFNTUl9DQUJMRV9MRU4pICYgTV9QU1NSX0NBQkxFX0xFTikKKworLy8jZGVmaW5lIFNfUFNTUl9MSU5LIDEwCisvLyNkZWZpbmUgU19QU1NSX0xJTksgMTMKKyNkZWZpbmUgU19QU1NSX0xJTksgMgorI2RlZmluZSBWX1BTU1JfTElOSyAoMSA8PCBTX1BTU1JfTElOSykKKworLy8jZGVmaW5lIFNfUFNTUl9TVEFUVVNfUkVTT0xWRUQgMTEKKy8vI2RlZmluZSBTX1BTU1JfU1RBVFVTX1JFU09MVkVEIDEwCisjZGVmaW5lIFNfUFNTUl9TVEFUVVNfUkVTT0xWRUQgMTUKKyNkZWZpbmUgVl9QU1NSX1NUQVRVU19SRVNPTFZFRCAoMSA8PCBTX1BTU1JfU1RBVFVTX1JFU09MVkVEKQorCisjZGVmaW5lIFNfUFNTUl9QQUdFX1JFQ0VJVkVEIDEyCisjZGVmaW5lIFZfUFNTUl9QQUdFX1JFQ0VJVkVEICgxIDw8IFNfUFNTUl9QQUdFX1JFQ0VJVkVEKQorCisvLyNkZWZpbmUgU19QU1NSX0RVUExFWCAxMworLy8jZGVmaW5lIFNfUFNTUl9EVVBMRVggMTIKKyNkZWZpbmUgU19QU1NSX0RVUExFWCA1CisjZGVmaW5lIFZfUFNTUl9EVVBMRVggKDEgPDwgU19QU1NSX0RVUExFWCkKKworLy8jZGVmaW5lIFNfUFNTUl9TUEVFRCAgICAxNAorLy8jZGVmaW5lIFNfUFNTUl9TUEVFRCAgICAxNAorI2RlZmluZSBTX1BTU1JfU1BFRUQgICAgMworI2RlZmluZSBNX1BTU1JfU1BFRUQgICAgMHgzCisjZGVmaW5lIFZfUFNTUl9TUEVFRCh4KSAoKHgpIDw8IFNfUFNTUl9TUEVFRCkKKyNkZWZpbmUgR19QU1NSX1NQRUVEKHgpICgoKHgpID4+IFNfUFNTUl9TUEVFRCkgJiBNX1BTU1JfU1BFRUQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmMgYi9kcml2ZXJzL25ldC9jczg5eDAuYwppbmRleCA0ZmZjOWI0Li5kZWM3MGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jczg5eDAuYworKysgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpAQCAtNTg4LDEwICs1ODgsMTAgQEAKIAkJCQlnb3RvIG91dDI7CiAJCQl9CiAJfQotCXByaW50ayhLRVJOX0RFQlVHICJQUF9hZGRyIGF0ICV4WyV4XTogMHgleFxuIiwKLQkJCWlvYWRkciwgQUREX1BPUlQsIHJlYWR3b3JkKGlvYWRkciwgQUREX1BPUlQpKTsKIAogCWlvYWRkciAmPSB+MzsKKwlwcmludGsoS0VSTl9ERUJVRyAiUFBfYWRkciBhdCAleFsleF06IDB4JXhcbiIsCisJCQlpb2FkZHIsIEFERF9QT1JULCByZWFkd29yZChpb2FkZHIsIEFERF9QT1JUKSk7CiAJd3JpdGV3b3JkKGlvYWRkciwgQUREX1BPUlQsIFBQX0NoaXBJRCk7CiAKIAl0bXAgPSByZWFkd29yZChpb2FkZHIsIERBVEFfUE9SVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwppbmRleCA4ZjUxNGNjLi5kYzNhYjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKQEAgLTE5Miw2ICsxOTIsNyBAQAogICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCiAgKgkJMTQgQXVnIDIwMDQJbWFjcm8JCUZpeCBkZXZpY2UgbmFtZXMgcmVwb3J0ZWQuCiAgKgkJMTQgSnVuIDIwMDUJbWFjcm8JCVVzZSBpcnFyZXR1cm5fdC4KKyAqCQkyMyBPY3QgMjAwNgltYWNybwkJQmlnLWVuZGlhbiBob3N0IHN1cHBvcnQuCiAgKi8KIAogLyogSW5jbHVkZSBmaWxlcyAqLwpAQCAtMjE4LDggKzIxOSw4IEBACiAKIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gc3RyaW5nIHNob3VsZCBiZSB1cGRhdGVkIHByaW9yIHRvIGVhY2ggbmV3IHJlbGVhc2UhICAqLwogI2RlZmluZSBEUlZfTkFNRSAiZGVmeHgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICJ2MS4wOCIKLSNkZWZpbmUgRFJWX1JFTERBVEUgIjIwMDUvMDYvMTQiCisjZGVmaW5lIERSVl9WRVJTSU9OICJ2MS4wOSIKKyNkZWZpbmUgRFJWX1JFTERBVEUgIjIwMDYvMTAvMjMiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAlEUlZfTkFNRSAiOiAiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURQpAQCAtODU5LDYgKzg2MCw3IEBACiAJCSAgICAgICBwcmludF9uYW1lKTsKIAkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOwogCX0KKwlkYXRhID0gY3B1X3RvX2xlMzIoZGF0YSk7CiAJbWVtY3B5KCZicC0+ZmFjdG9yeV9tYWNfYWRkclswXSwgJmRhdGEsIHNpemVvZih1MzIpKTsKIAogCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwgUElfUENUUkxfTV9NTEEsIFBJX1BEQVRBX0FfTUxBX0tfSEksIDAsCkBAIC04NjcsNiArODY5LDcgQEAKIAkJICAgICAgIHByaW50X25hbWUpOwogCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CiAJfQorCWRhdGEgPSBjcHVfdG9fbGUzMihkYXRhKTsKIAltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzRdLCAmZGF0YSwgc2l6ZW9mKHUxNikpOwogCiAJLyoKQEAgLTEwODUsMjcgKzEwODgsMjMgQEAKIAkJfQogCiAJLyoKLQkgKiBTZXQgYmFzZSBhZGRyZXNzIG9mIERlc2NyaXB0b3IgQmxvY2sgYW5kIGJyaW5nIGFkYXB0ZXIgdG8gRE1BX0FWQUlMQUJMRSBzdGF0ZQorCSAqIFNldCB0aGUgYmFzZSBhZGRyZXNzIG9mIERlc2NyaXB0b3IgQmxvY2sgYW5kIGJyaW5nIGFkYXB0ZXIKKwkgKiB0byBETUFfQVZBSUxBQkxFIHN0YXRlLgogCSAqCi0JICogTm90ZTogV2UgYWxzbyBzZXQgdGhlIGxpdGVyYWwgYW5kIGRhdGEgc3dhcHBpbmcgcmVxdWlyZW1lbnRzIGluIHRoaXMKLQkgKgkgICAgIGNvbW1hbmQuICBTaW5jZSB0aGlzIGRyaXZlciBwcmVzZW50bHkgcnVucyBvbiBJbnRlbCBwbGF0Zm9ybXMKLQkgKgkJIHdoaWNoIGFyZSBMaXR0bGUgRW5kaWFuLCB3ZSdsbCB0ZWxsIHRoZSBhZGFwdGVyIHRvIGJ5dGUgc3dhcAotCSAqCQkgZGF0YSBvbmx5LiAgVGhpcyBjb2RlIHdpbGwgbmVlZCB0byBjaGFuZ2Ugd2hlbiB3ZSBzdXBwb3J0Ci0JICoJCSBCaWcgRW5kaWFuIHN5c3RlbXMgKGVnLiBQb3dlclBDKS4KKwkgKiBOb3RlOiBXZSBhbHNvIHNldCB0aGUgbGl0ZXJhbCBhbmQgZGF0YSBzd2FwcGluZyByZXF1aXJlbWVudHMKKwkgKiAgICAgICBpbiB0aGlzIGNvbW1hbmQuCiAJICoKLQkgKiBBc3N1bXB0aW9uOiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIGJsb2NrIGlzIDhLYnl0ZQotCSAqICAgICAgICAgICAgIGFsaWduZWQuICBUaGF0IGlzLCBiaXRzIDAtMTIgb2YgdGhlIGFkZHJlc3MgbXVzdCBiZSB6ZXJvLgorCSAqIEFzc3VtcHRpb246IDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgYmxvY2sKKwkgKiAgICAgICBpcyA4S2J5dGUgYWxpZ25lZC4KIAkgKi8KLQotCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwKLQkJCQkJCQlQSV9QQ1RSTF9NX0lOSVQsCi0JCQkJCQkJKHUzMikgKGJwLT5kZXNjcl9ibG9ja19waHlzIHwgUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSksCi0JCQkJCQkJMCwKLQkJCQkJCQlOVUxMKSAhPSBERlhfS19TVUNDRVNTKQotCQl7Ci0JCXByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgZGVzY3JpcHRvciBibG9jayBhZGRyZXNzIVxuIiwgYnAtPmRldi0+bmFtZSk7Ci0JCXJldHVybihERlhfS19GQUlMVVJFKTsKLQkJfQorCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwgUElfUENUUkxfTV9JTklULAorCQkJCSAodTMyKShicC0+ZGVzY3JfYmxvY2tfcGh5cyB8CisJCQkJICAgICAgIFBJX1BEQVRBX0FfSU5JVF9NX0JTV0FQX0lOSVQpLAorCQkJCSAwLCBOVUxMKSAhPSBERlhfS19TVUNDRVNTKSB7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgZGVzY3JpcHRvciBibG9jayBhZGRyZXNzIVxuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gREZYX0tfRkFJTFVSRTsKKwl9CiAKIAkvKiBTZXQgdHJhbnNtaXQgZmx1c2ggdGltZW91dCB2YWx1ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5oIGIvZHJpdmVycy9uZXQvZGVmeHguaAppbmRleCA4YjFlOWExLi4yY2U4Zjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5oCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmgKQEAgLTI1LDYgKzI1LDcgQEAKICAqCQkJCQkJCW1hY3JvcyB0byBERUZYWC5DLgogICoJCTEyLVNlcC05NglMVlMJCVJlbW92ZWQgcGFja2V0IHJlcXVlc3QgaGVhZGVyIHBvaW50ZXJzLgogICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCisgKgkJMjMgT2N0IDIwMDYJbWFjcm8JCUJpZy1lbmRpYW4gaG9zdCBzdXBwb3J0LgogICovCiAKICNpZm5kZWYgX0RFRlhYX0hfCkBAIC0xMzQ0LDcgKzEzNDUsNyBAQAogCiAvKiBSZWdpc3RlciBkZWZpbml0aW9uIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgZm9yIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHN5c3RlbXMgKi8KIAotI2lmbmRlZiAgQklHX0VORElBTgorI2lmbmRlZiBfX0JJR19FTkRJQU4KIAogLyogTGl0dGxlIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAxIFByb2R1Y2VyIHJlZ2lzdGVyICovCiAKQEAgLTE0MDIsNyArMTQwMywxMSBAQAogCQl9IGluZGV4OwogCX0gUElfVFlQRV8yX0NPTlNVTUVSOwogCi0jZWxzZQorLyogRGVmaW5lIHN3YXBwaW5nIHJlcXVpcmVkIGJ5IERNQSB0cmFuc2ZlcnMuICAqLworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9CU1dBUF9JTklUCVwKKwkoUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSkKKworI2Vsc2UgLyogX19CSUdfRU5ESUFOICovCiAKIC8qIEJpZyBlbmRpYW4gZm9ybWF0IG9mIFR5cGUgMSBQcm9kdWNlciByZWdpc3RlciAqLwogCkBAIC0xNDYwLDcgKzE0NjUsMTEgQEAKIAkJfSBpbmRleDsKIAl9IFBJX1RZUEVfMl9DT05TVU1FUjsKIAotI2VuZGlmCS8qICNpZm5kZWYgQklHX0VORElBTiAqLworLyogRGVmaW5lIHN3YXBwaW5nIHJlcXVpcmVkIGJ5IERNQSB0cmFuc2ZlcnMuICAqLworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9CU1dBUF9JTklUCVwKKwkoUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSB8IFBJX1BEQVRBX0FfSU5JVF9NX0JTV0FQX0xJVEVSQUwpCisKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KIAogLyogRGVmaW5lIEVJU0EgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXRzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IGY4N2Y2ZTMuLjUxMTNlZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtMTI1MiwyNCArMTI1MiwyMiBAQAogCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CiAJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwogCi0JaWYgKGRldikgewotCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCXdoaWxlIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpOwkvKiBXYWl0IGZvciB0aGUgcmluZyB0byBlbXB0eSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3aGlsZSAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KTsJLyogV2FpdCBmb3IgdGhlIHJpbmcgdG8gZW1wdHkgKi8KIAotCQlTVE9QX0RFUENBOwkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBkZXBjYS4gICovCi0JCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCisJU1RPUF9ERVBDQTsJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgZGVwY2EuICAqLworCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCiAKLQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwotCQkJbHAtPmluaXRfYmxvY2subW9kZSB8PSBQUk9NOwotCQl9IGVsc2UgewotCQkJU2V0TXVsdGljYXN0RmlsdGVyKGRldik7Ci0JCQlscC0+aW5pdF9ibG9jay5tb2RlICY9IH5QUk9NOwkvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCi0JCX0KLQotCQlMb2FkQ1NScyhkZXYpOwkvKiBSZWxvYWQgQ1NSMyAqLwotCQlJbml0UmVzdGFydERlcGNhKGRldik7CS8qIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uLiAqLwotCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkvKiBVbmxvY2sgdGhlIFRYIHJpbmcgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisJCWxwLT5pbml0X2Jsb2NrLm1vZGUgfD0gUFJPTTsKKwl9IGVsc2UgeworCQlTZXRNdWx0aWNhc3RGaWx0ZXIoZGV2KTsKKwkJbHAtPmluaXRfYmxvY2subW9kZSAmPSB+UFJPTTsJLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwogCX0KKworCUxvYWRDU1JzKGRldik7CS8qIFJlbG9hZCBDU1IzICovCisJSW5pdFJlc3RhcnREZXBjYShkZXYpOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkvKiBVbmxvY2sgdGhlIFRYIHJpbmcgKi8KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCAxOWFiMzQ0Li4zYThkZjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0xMjE1LDcgKzEyMTUsNyBAQAogKiAgdGhlIGxpdGVyYWwgaW4gdGhlIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgY29kZSBpcyBsb2FkZWQsIHRoZQogKiAgZHJpdmVyIGNhbiBjaGFuZ2UgdGhlIGFsZ29yaXRobS4KICoKLSogIElOVERFTEFZIC0gVGhpcyBsb2FkcyB0aGUgZGVhZC1tYW4gdGltZXIgd2l0aCBpdHMgaW5pdGFsIHZhbHVlLgorKiAgSU5UREVMQVkgLSBUaGlzIGxvYWRzIHRoZSBkZWFkLW1hbiB0aW1lciB3aXRoIGl0cyBpbml0aWFsIHZhbHVlLgogKiAgICBXaGVuIHRoaXMgdGltZXIgZXhwaXJlcyB0aGUgaW50ZXJydXB0IGlzIGFzc2VydGVkLCBhbmQgdGhlCiAqICAgIHRpbWVyIGlzIHJlc2V0IGVhY2ggdGltZSBhIG5ldyBwYWNrZXQgaXMgcmVjZWl2ZWQuICAoc2VlCiAqICAgIEJVTkRMRU1BWCBiZWxvdyB0byBzZXQgdGhlIGxpbWl0IG9uIG51bWJlciBvZiBjaGFpbmVkIHBhY2tldHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAppbmRleCA3ZWNjZTQzLi5mMDkxMDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTU5LDYgKzU5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2lmZGVmIE5FVElGX0ZfVFNPNgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KQEAgLTI1NCw2ICsyNTcsMTcgQEAKIAlzcGlubG9ja190IHR4X3F1ZXVlX2xvY2s7CiAjZW5kaWYKIAlhdG9taWNfdCBpcnFfc2VtOworCXVuc2lnbmVkIGludCBkZXRlY3RfbGluazsKKwl1bnNpZ25lZCBpbnQgdG90YWxfdHhfYnl0ZXM7CisJdW5zaWduZWQgaW50IHRvdGFsX3R4X3BhY2tldHM7CisJdW5zaWduZWQgaW50IHRvdGFsX3J4X2J5dGVzOworCXVuc2lnbmVkIGludCB0b3RhbF9yeF9wYWNrZXRzOworCS8qIEludGVycnVwdCBUaHJvdHRsZSBSYXRlICovCisJdWludDMyX3QgaXRyOworCXVpbnQzMl90IGl0cl9zZXR0aW5nOworCXVpbnQxNl90IHR4X2l0cjsKKwl1aW50MTZfdCByeF9pdHI7CisKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKIAl1aW50OF90IGZjX2F1dG9uZWc7CiAKQEAgLTI2Miw2ICsyNzYsNyBAQAogCiAJLyogVFggKi8KIAlzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqdHhfcmluZzsgICAgICAvKiBPbmUgcGVyIGFjdGl2ZSBxdWV1ZSAqLworCXVuc2lnbmVkIGludCByZXN0YXJ0X3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgdHhfcXVldWVfbGVuOwogCXVpbnQzMl90IHR4ZF9jbWQ7CiAJdWludDMyX3QgdHhfaW50X2RlbGF5OwpAQCAtMzEwLDggKzMyNSw2IEBACiAJdWludDY0X3QgZ29yY2xfb2xkOwogCXVpbnQxNl90IHJ4X3BzX2JzaXplMDsKIAotCS8qIEludGVycnVwdCBUaHJvdHRsZSBSYXRlICovCi0JdWludDMyX3QgaXRyOwogCiAJLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwppbmRleCBjNTY0YWRiLi5kYTQ1OWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCkBAIC04NSw2ICs4NSw3IEBACiAJeyAidHhfc2luZ2xlX2NvbGxfb2siLCBFMTAwMF9TVEFUKHN0YXRzLnNjYykgfSwKIAl7ICJ0eF9tdWx0aV9jb2xsX29rIiwgRTEwMDBfU1RBVChzdGF0cy5tY2MpIH0sCiAJeyAidHhfdGltZW91dF9jb3VudCIsIEUxMDAwX1NUQVQodHhfdGltZW91dF9jb3VudCkgfSwKKwl7ICJ0eF9yZXN0YXJ0X3F1ZXVlIiwgRTEwMDBfU1RBVChyZXN0YXJ0X3F1ZXVlKSB9LAogCXsgInJ4X2xvbmdfbGVuZ3RoX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMucm9jKSB9LAogCXsgInJ4X3Nob3J0X2xlbmd0aF9lcnJvcnMiLCBFMTAwMF9TVEFUKHN0YXRzLnJ1YykgfSwKIAl7ICJyeF9hbGlnbl9lcnJvcnMiLCBFMTAwMF9TVEFUKHN0YXRzLmFsZ25lcnJjKSB9LApAQCAtMTMzLDkgKzEzNCw3IEBACiAKIAkJaWYgKGh3LT5hdXRvbmVnID09IDEpIHsKIAkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKLQogCQkJLyogdGhlIGUxMDAwIGF1dG9uZWcgc2VlbXMgdG8gbWF0Y2ggZXRodG9vbCBuaWNlbHkgKi8KLQogCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZDsKIAkJfQogCkBAIC0yODUsNyArMjg0LDcgQEAKIAkJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCX0gZWxzZQogCQlyZXR2YWwgPSAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpID8KLQkJCSAgIGUxMDAwX3NldHVwX2xpbmsoaHcpIDogZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KSk7CisJCQkgIGUxMDAwX3NldHVwX2xpbmsoaHcpIDogZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KSk7CiAKIAljbGVhcl9iaXQoX19FMTAwMF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTM1MCw2ICszNDksMTMgQEAKIAllbHNlCiAJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwogCisjaWZkZWYgTkVUSUZfRl9UU082CisJaWYgKGRhdGEpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU082OworI2VuZGlmCisKIAlEUFJJTlRLKFBST0JFLCBJTkZPLCAiVFNPIGlzICVzXG4iLCBkYXRhID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CiAJYWRhcHRlci0+dHNvX2ZvcmNlID0gVFJVRTsKIAlyZXR1cm4gMDsKQEAgLTc3NCw3ICs3ODAsNyBAQAogCS8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgUmVhZCBPbmx5LCBzbyBhIHdyaXRlIHNob3VsZCBmYWlsLgogCSAqIFNvbWUgYml0cyB0aGF0IGdldCB0b2dnbGVkIGFyZSBpZ25vcmVkLgogCSAqLwotICAgICAgICBzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CisJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgewogCS8qIHRoZXJlIGFyZSBzZXZlcmFsIGJpdHMgb24gbmV3ZXIgaGFyZHdhcmUgdGhhdCBhcmUgci93ICovCiAJY2FzZSBlMTAwMF84MjU3MToKIAljYXNlIGUxMDAwXzgyNTcyOgpAQCAtODAyLDEyICs4MDgsMTQgQEAKIAl9CiAJLyogcmVzdG9yZSBwcmV2aW91cyBzdGF0dXMgKi8KIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMsIGJlZm9yZSk7CisKIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewogCQlSRUdfUEFUVEVSTl9URVNUKEZDQUwsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKEZDQUgsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKEZDVCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CiAJCVJFR19QQVRURVJOX1RFU1QoVkVULCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKIAl9CisKIAlSRUdfUEFUVEVSTl9URVNUKFJEVFIsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOwogCVJFR19QQVRURVJOX1RFU1QoUkRCQUgsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOwogCVJFR19QQVRURVJOX1RFU1QoUkRMRU4sIDB4MDAwRkZGODAsIDB4MDAwRkZGRkYpOwpAQCAtODIwLDggKzgyOCw5IEBACiAJUkVHX1BBVFRFUk5fVEVTVChURExFTiwgMHgwMDBGRkY4MCwgMHgwMDBGRkZGRik7CiAKIAlSRUdfU0VUX0FORF9DSEVDSyhSQ1RMLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwKTsKKwogCWJlZm9yZSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuID8KLQkJCTB4MDZDM0IzM0UgOiAweDA2REZCM0ZFKTsKKwkgICAgICAgICAgMHgwNkMzQjMzRSA6IDB4MDZERkIzRkUpOwogCVJFR19TRVRfQU5EX0NIRUNLKFJDVEwsIGJlZm9yZSwgMHgwMDNGRkZGQik7CiAJUkVHX1NFVF9BTkRfQ0hFQ0soVENUTCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCk7CiAKQEAgLTgzNCwxMCArODQzLDEwIEBACiAJCVJFR19QQVRURVJOX1RFU1QoVERCQUwsIDB4RkZGRkZGRjAsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKFRJRFYsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYpOwogCQl2YWx1ZSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuID8KLQkJCQlFMTAwMF9SQVJfRU5UUklFU19JQ0g4TEFOIDogRTEwMDBfUkFSX0VOVFJJRVMpOworCQkgICAgICAgICBFMTAwMF9SQVJfRU5UUklFU19JQ0g4TEFOIDogRTEwMDBfUkFSX0VOVFJJRVMpOwogCQlmb3IgKGkgPSAwOyBpIDwgdmFsdWU7IGkrKykgewogCQkJUkVHX1BBVFRFUk5fVEVTVChSQSArICgoKGkgPDwgMSkgKyAxKSA8PCAyKSwgMHg4MDAzRkZGRiwKLQkJCQkJIDB4RkZGRkZGRkYpOworCQkJICAgICAgICAgICAgICAgICAweEZGRkZGRkZGKTsKIAkJfQogCiAJfSBlbHNlIHsKQEAgLTg4Myw4ICs4OTIsNyBAQAogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLWUxMDAwX3Rlc3RfaW50cihpbnQgaXJxLAotCQl2b2lkICpkYXRhKQorZTEwMDBfdGVzdF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOwogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTkwNSwxMSArOTEzLDExIEBACiAKIAkvKiBOT1RFOiB3ZSBkb24ndCB0ZXN0IE1TSSBpbnRlcnJ1cHRzIGhlcmUsIHlldCAqLwogCS8qIEhvb2sgdXAgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciBqdXN0IGZvciB0aGlzIHRlc3QgKi8KLQlpZiAoIXJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgSVJRRl9QUk9CRV9TSEFSRUQsCi0JCQkgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKQorCWlmICghcmVxdWVzdF9pcnEoaXJxLCAmZTEwMDBfdGVzdF9pbnRyLCBJUlFGX1BST0JFX1NIQVJFRCwgbmV0ZGV2LT5uYW1lLAorCSAgICAgICAgICAgICAgICAgbmV0ZGV2KSkKIAkJc2hhcmVkX2ludCA9IEZBTFNFOwogCWVsc2UgaWYgKHJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgSVJRRl9TSEFSRUQsCi0JCQkgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKKwkgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtOTI1LDYgKzkzMyw3IEBACiAKIAkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4gJiYgaSA9PSA4KQogCQkJY29udGludWU7CisKIAkJLyogSW50ZXJydXB0IHRvIHRlc3QgKi8KIAkJbWFzayA9IDEgPDwgaTsKIApAQCAtMTY3NCw3ICsxNjgzLDcgQEAKIAkJaWYgKGUxMDAwX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCi0JCS8qIE9mZmxpbmUgdGVzdHMgYXJlbid0IHJ1bjsgcGFzcyBieSBkZWZhdWx0ICovCisJCS8qIE9ubGluZSB0ZXN0cyBhcmVuJ3QgcnVuOyBwYXNzIGJ5IGRlZmF1bHQgKi8KIAkJZGF0YVswXSA9IDA7CiAJCWRhdGFbMV0gPSAwOwogCQlkYXRhWzJdID0gMDsKQEAgLTE3MTcsNiArMTcyNiw3IEBACiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUl9MT1dQUk9GSUxFOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMzoKIAkJLyogcXVhZCBwb3J0IGFkYXB0ZXJzIG9ubHkgc3VwcG9ydCBXb0wgb24gcG9ydCBBICovCiAJCWlmICghYWRhcHRlci0+cXVhZF9wb3J0X2EpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCmluZGV4IDY1MDc3ZjMuLjM2NTVkOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtMzg1LDYgKzM4NSw3IEBACiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVJfTE9XUFJPRklMRToKICAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTcxOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MkVJX0NPUFBFUjoKQEAgLTQwOCw2ICs0MDksOCBAQAogICAgIGNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUdQX0FNVDoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9DOgogICAgIGNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUZFOgorICAgIGNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0dUOgorICAgIGNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0c6CiAgICAgY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTToKICAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfaWNoOGxhbjsKICAgICAgICAgYnJlYWs7CkBAIC0yMzY3LDYgKzIzNzAsNyBAQAogCiAgICAgICAgIC8qIE5lZWQgdG8gcmVzZXQgdGhlIFBIWSBvciB0aGVzZSBjaGFuZ2VzIHdpbGwgYmUgaWdub3JlZCAqLwogICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX1JFU0VUOworCiAgICAgLyogRGlzYWJsZSBNREktWCBzdXBwb3J0IGZvciAxMC8xMDAgKi8KICAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElGRV9QSFlfTURJWF9DT05UUk9MLCAmcGh5X2RhdGEpOwpAQCAtMjM3OSw2ICsyMzgzLDcgQEAKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElGRV9QSFlfTURJWF9DT05UUk9MLCBwaHlfZGF0YSk7CiAgICAgICAgIGlmIChyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKICAgICB9IGVsc2UgewogICAgICAgICAvKiBDbGVhciBBdXRvLUNyb3Nzb3ZlciB0byBmb3JjZSBNREkgbWFudWFsbHkuICBJR1AgcmVxdWlyZXMgTURJCiAgICAgICAgICAqIGZvcmNlZCB3aGVuZXZlciBzcGVlZCBvciBkdXBsZXggYXJlIGZvcmNlZC4KQEAgLTM4NjgsNyArMzg3Myw3IEBACiAqCiAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCiAqCi0qIFNldHMgYml0IDE1IG9mIHRoZSBNSUkgQ29udHJvbCByZWdpc2VyCisqIFNldHMgYml0IDE1IG9mIHRoZSBNSUkgQ29udHJvbCByZWdpc3RlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50MzJfdAogZTEwMDBfcGh5X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpCkBAIC0zOTQwLDE0ICszOTQ1LDE1IEBACiAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUEhZX0NUUkwsIHJlZyB8IEUxMDAwX1BIWV9DVFJMX0dCRV9ESVNBQkxFIHwKICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX1BIWV9DVFJMX05PTkQwQV9HQkVfRElTQUJMRSk7CiAKLSAgICAgICAgLyogV3JpdGUgVlIgcG93ZXItZG93biBlbmFibGUgKi8KKyAgICAgICAgLyogV3JpdGUgVlIgcG93ZXItZG93biBlbmFibGUgLSBiaXRzIDk6OCBzaG91bGQgYmUgMTBiICovCiAgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQM19WUl9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AzX1ZSX0NUUkwsIHBoeV9kYXRhIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AzX1ZSX0NUUkxfTU9ERV9TSFVUKTsKKyAgICAgICAgcGh5X2RhdGEgfD0gKDEgPDwgOSk7CisgICAgICAgIHBoeV9kYXRhICY9IH4oMSA8PCA4KTsKKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQM19WUl9DVFJMLCBwaHlfZGF0YSk7CiAKICAgICAgICAgLyogUmVhZCBpdCBiYWNrIGFuZCB0ZXN0ICovCiAgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQM19WUl9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAoKHBoeV9kYXRhICYgSUdQM19WUl9DVFJMX01PREVfU0hVVCkgfHwgcmV0cnkpCisgICAgICAgIGlmICgoKHBoeV9kYXRhICYgSUdQM19WUl9DVFJMX01PREVfTUFTSykgPT0gSUdQM19WUl9DVFJMX01PREVfU0hVVCkgfHwgcmV0cnkpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAvKiBJc3N1ZSBQSFkgcmVzZXQgYW5kIHJlcGVhdCBhdCBtb3N0IG9uZSBtb3JlIHRpbWUgKi8KQEAgLTQ1NDksNyArNDU1NSw3IEBACiAgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgogICAgICAgICB7CiAgICAgICAgIGludDMyX3QgIGkgPSAwOwotICAgICAgICB1aW50MzJfdCBmbGFzaF9zaXplID0gRTEwMDBfUkVBRF9JQ0g4X1JFRyhodywgSUNIOF9GTEFTSF9HRlBSRUcpOworICAgICAgICB1aW50MzJfdCBmbGFzaF9zaXplID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfR0ZQUkVHKTsKIAogICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21faWNoODsKICAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IEZBTFNFOwpAQCAtNDU2NSwxMiArNDU3MSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaHctPmZsYXNoX2Jhc2VfYWRkciA9IChmbGFzaF9zaXplICYgSUNIOF9HRlBSRUdfQkFTRV9NQVNLKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0g4X0ZMQVNIX1NFQ1RPUl9TSVpFOworICAgICAgICBody0+Zmxhc2hfYmFzZV9hZGRyID0gKGZsYXNoX3NpemUgJiBJQ0hfR0ZQUkVHX0JBU0VfTUFTSykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFOwogCi0gICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgPSAoKGZsYXNoX3NpemUgPj4gMTYpICYgSUNIOF9HRlBSRUdfQkFTRV9NQVNLKSArIDE7Ci0gICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgLT0gKGZsYXNoX3NpemUgJiBJQ0g4X0dGUFJFR19CQVNFX01BU0spOwotICAgICAgICBody0+Zmxhc2hfYmFua19zaXplICo9IElDSDhfRkxBU0hfU0VDVE9SX1NJWkU7CisgICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgPSAoKGZsYXNoX3NpemUgPj4gMTYpICYgSUNIX0dGUFJFR19CQVNFX01BU0spICsgMTsKKyAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSAtPSAoZmxhc2hfc2l6ZSAmIElDSF9HRlBSRUdfQkFTRV9NQVNLKTsKKworICAgICAgICBody0+Zmxhc2hfYmFua19zaXplICo9IElDSF9GTEFTSF9TRUNUT1JfU0laRTsKKwogICAgICAgICBody0+Zmxhc2hfYmFua19zaXplIC89IDIgKiBzaXplb2YodWludDE2X3QpOwogCiAgICAgICAgIGJyZWFrOwpAQCAtNTYyMCw4ICs1NjI4LDggQEAKICAgICAgICAgICAgICAgICAgKiBzaWduYXR1cmUgaXMgdmFsaWQuICBXZSB3YW50IHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIHdyaXRlCiAgICAgICAgICAgICAgICAgICogaGFzIGNvbXBsZXRlZCBzbyB0aGF0IHdlIGRvbid0IG1hcmsgdGhlIHNlZ21lbnQgdmFsaWQKICAgICAgICAgICAgICAgICAgKiB3aGlsZSB0aGUgd3JpdGUgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgKi8KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBFMTAwMF9JQ0g4X05WTV9TSUdfV09SRCkKLSAgICAgICAgICAgICAgICAgICAgaGlnaF9ieXRlID0gRTEwMDBfSUNIOF9OVk1fU0lHX01BU0sgfCBoaWdoX2J5dGU7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gRTEwMDBfSUNIX05WTV9TSUdfV09SRCkKKyAgICAgICAgICAgICAgICAgICAgaGlnaF9ieXRlID0gRTEwMDBfSUNIX05WTV9TSUdfTUFTSyB8IGhpZ2hfYnl0ZTsKIAogICAgICAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8PCAxKSArIG5ld19iYW5rX29mZnNldCArIDEsIGhpZ2hfYnl0ZSk7CkBAIC01NjQzLDE4ICs1NjUxLDE4IEBACiAgICAgICAgICAgICAgKiBlcmFzZSBhcyB3ZWxsIHNpbmNlIHRoZXNlIGJpdHMgYXJlIDExIHRvIHN0YXJ0IHdpdGgKICAgICAgICAgICAgICAqIGFuZCB3ZSBuZWVkIHRvIGNoYW5nZSBiaXQgMTQgdG8gMGIgKi8KICAgICAgICAgICAgIGUxMDAwX3JlYWRfaWNoOF9ieXRlKGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIOF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG5ld19iYW5rX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG5ld19iYW5rX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWdoX2J5dGUpOwogICAgICAgICAgICAgaGlnaF9ieXRlICY9IDB4QkY7CiAgICAgICAgICAgICBlcnJvciA9IGUxMDAwX3ZlcmlmeV93cml0ZV9pY2g4X2J5dGUoaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9JQ0g4X05WTV9TSUdfV09SRCAqIDIgKyAxICsgbmV3X2Jhbmtfb2Zmc2V0LCBoaWdoX2J5dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIX05WTV9TSUdfV09SRCAqIDIgKyAxICsgbmV3X2Jhbmtfb2Zmc2V0LCBoaWdoX2J5dGUpOwogICAgICAgICAgICAgLyogQW5kIGludmFsaWRhdGUgdGhlIHByZXZpb3VzbHkgdmFsaWQgc2VnbWVudCBieSBzZXR0aW5nCiAgICAgICAgICAgICAgKiBpdHMgc2lnbmF0dXJlIHdvcmQgKDB4MTMpIGhpZ2hfYnl0ZSB0byAwYi4gVGhpcyBjYW4gYmUKICAgICAgICAgICAgICAqIGRvbmUgd2l0aG91dCBhbiBlcmFzZSBiZWNhdXNlIGZsYXNoIGVyYXNlIHNldHMgYWxsIGJpdHMKICAgICAgICAgICAgICAqIHRvIDEncy4gV2UgY2FuIHdyaXRlIDEncyB0byAwJ3Mgd2l0aG91dCBhbiBlcmFzZSAqLwogICAgICAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICBlcnJvciA9IGUxMDAwX3ZlcmlmeV93cml0ZV9pY2g4X2J5dGUoaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIOF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG9sZF9iYW5rX29mZnNldCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIX05WTV9TSUdfV09SRCAqIDIgKyAxICsgb2xkX2Jhbmtfb2Zmc2V0LCAwKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogQ2xlYXIgdGhlIG5vdyBub3QgdXNlZCBlbnRyeSBpbiB0aGUgY2FjaGUgKi8KQEAgLTU4NDEsNiArNTg0OSw3IEBACiAgICAgaGFzaF9yZWcgPSAoaGFzaF92YWx1ZSA+PiA1KSAmIDB4N0Y7CiAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQogICAgICAgICBoYXNoX3JlZyAmPSAweDFGOworCiAgICAgaGFzaF9iaXQgPSBoYXNoX3ZhbHVlICYgMHgxRjsKIAogICAgIG10YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnKTsKQEAgLTYwMjYsNiArNjAzNSw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGVlcHJvbV9kYXRhID0gSURfTEVEX0RFRkFVTFQ7CiAgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICB0ZW1wID0gKGVlcHJvbV9kYXRhID4+IChpIDw8IDIpKSAmIGxlZF9tYXNrOwogICAgICAgICBzd2l0Y2ggKHRlbXApIHsKQEAgLTg0ODYsNyArODQ5Niw3IEBACiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2ljaDhfY3ljbGVfaW5pdCIpOwogCi0gICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMpOworICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CiAKICAgICAvKiBNYXkgYmUgY2hlY2sgdGhlIEZsYXNoIERlcyBWYWxpZCBiaXQgaW4gSHcgc3RhdHVzICovCiAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsZGVzdmFsaWQgPT0gMCkgewpAQCAtODQ5OSw3ICs4NTA5LDcgQEAKICAgICBoc2ZzdHMuaHNmX3N0YXR1cy5mbGNlcnIgPSAxOwogICAgIGhzZnN0cy5oc2Zfc3RhdHVzLmRhZWwgPSAxOwogCi0gICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOworICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CiAKICAgICAvKiBFaXRoZXIgd2Ugc2hvdWxkIGhhdmUgYSBoYXJkd2FyZSBTUEkgY3ljbGUgaW4gcHJvZ3Jlc3MgYml0IHRvIGNoZWNrCiAgICAgICogYWdhaW5zdCwgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgY3ljbGUgb3IgRkRPTkUgYml0IHNob3VsZCBiZSBjaGFuZ2VkCkBAIC04NTE0LDEzICs4NTI0LDEzIEBACiAgICAgICAgIC8qIFRoZXJlIGlzIG5vIGN5Y2xlIHJ1bm5pbmcgYXQgcHJlc2VudCwgc28gd2UgY2FuIHN0YXJ0IGEgY3ljbGUgKi8KICAgICAgICAgLyogQmVnaW4gYnkgc2V0dGluZyBGbGFzaCBDeWNsZSBEb25lLiAqLwogICAgICAgICBoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID0gMTsKLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOworICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOwogICAgICAgICBlcnJvciA9IEUxMDAwX1NVQ0NFU1M7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogb3RoZXJ3aXNlIHBvbGwgZm9yIHNvbWV0aW1lIHNvIHRoZSBjdXJyZW50IGN5Y2xlIGhhcyBhIGNoYW5jZQogICAgICAgICAgKiB0byBlbmQgYmVmb3JlIGdpdmluZyB1cC4gKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IElDSDhfRkxBU0hfQ09NTUFORF9USU1FT1VUOyBpKyspIHsKLSAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IElDSF9GTEFTSF9DT01NQU5EX1RJTUVPVVQ7IGkrKykgeworICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKICAgICAgICAgICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNpbnByb2cgPT0gMCkgewogICAgICAgICAgICAgICAgIGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg1MzEsNyArODU0MSw3IEBACiAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIGluIHdhaXRpbmcgZm9yIHByZXZpb3VzIGN5Y2xlIHRvIHRpbWVvdXQsCiAgICAgICAgICAgICAgKiBub3cgc2V0IHRoZSBGbGFzaCBDeWNsZSBEb25lLiAqLwogICAgICAgICAgICAgaHNmc3RzLmhzZl9zdGF0dXMuZmxjZG9uZSA9IDE7Ci0gICAgICAgICAgICBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgREVCVUdPVVQoIkZsYXNoIGNvbnRyb2xsZXIgYnVzeSwgY2Fubm90IGdldCBhY2Nlc3MiKTsKICAgICAgICAgfQpAQCAtODU1MywxMyArODU2MywxMyBAQAogICAgIHVpbnQzMl90IGkgPSAwOwogCiAgICAgLyogU3RhcnQgYSBjeWNsZSBieSB3cml0aW5nIDEgaW4gRmxhc2ggQ3ljbGUgR28gaW4gSHcgRmxhc2ggQ29udHJvbCAqLwotICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCk7CisgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCk7CiAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGNnbyA9IDE7Ci0gICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKKyAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKIAogICAgIC8qIHdhaXQgdGlsbCBGRE9ORSBiaXQgaXMgc2V0IHRvIDEgKi8KICAgICBkbyB7Ci0gICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKICAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPT0gMSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB1ZGVsYXkoMSk7CkBAIC04NTkzLDEwICs4NjAzLDEwIEBACiAgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX2ljaDhfZGF0YSIpOwogCiAgICAgaWYgKHNpemUgPCAxICB8fCBzaXplID4gMiB8fCBkYXRhID09IDB4MCB8fAotICAgICAgICBpbmRleCA+IElDSDhfRkxBU0hfTElORUFSX0FERFJfTUFTSykKKyAgICAgICAgaW5kZXggPiBJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSykKICAgICAgICAgcmV0dXJuIGVycm9yOwogCi0gICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgPSAoSUNIOF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLICYgaW5kZXgpICsKKyAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IChJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyAmIGluZGV4KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+Zmxhc2hfYmFzZV9hZGRyOwogCiAgICAgZG8gewpAQCAtODYwNiwyNSArODYxNiwyNSBAQAogICAgICAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCk7CisgICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwpOwogICAgICAgICAvKiAwYi8xYiBjb3JyZXNwb25kcyB0byAxIG9yIDIgYnl0ZSBzaXplLCByZXNwZWN0aXZlbHkuICovCiAgICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxkYmNvdW50ID0gc2l6ZSAtIDE7Ci0gICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxjeWNsZSA9IElDSDhfQ1lDTEVfUkVBRDsKLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKKyAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX1JFQUQ7CisgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOwogCiAgICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IDI0IGJpdHMgb2YgaW5kZXggaW50byBGbGFzaCBMaW5lYXIgYWRkcmVzcyBmaWVsZCBpbgogICAgICAgICAgKiBGbGFzaCBBZGRyZXNzICovCiAgICAgICAgIC8qIFRPRE86IFRCRCBtYXliZSBjaGVjayB0aGUgaW5kZXggYWdhaW5zdCB0aGUgc2l6ZSBvZiBmbGFzaCAqLwogCi0gICAgICAgIEUxMDAwX1dSSVRFX0lDSDhfUkVHKGh3LCBJQ0g4X0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CisgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9GQUREUiwgZmxhc2hfbGluZWFyX2FkZHJlc3MpOwogCi0gICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIOF9GTEFTSF9DT01NQU5EX1RJTUVPVVQpOworICAgICAgICBlcnJvciA9IGUxMDAwX2ljaDhfZmxhc2hfY3ljbGUoaHcsIElDSF9GTEFTSF9DT01NQU5EX1RJTUVPVVQpOwogCiAgICAgICAgIC8qIENoZWNrIGlmIEZDRVJSIGlzIHNldCB0byAxLCBpZiBzZXQgdG8gMSwgY2xlYXIgaXQgYW5kIHRyeSB0aGUgd2hvbGUKICAgICAgICAgICogc2VxdWVuY2UgYSBmZXcgbW9yZSB0aW1lcywgZWxzZSByZWFkIGluIChzaGlmdCBpbikgdGhlIEZsYXNoIERhdGEwLAogICAgICAgICAgKiB0aGUgb3JkZXIgaXMgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCBtc2IgdG8gbHNiICovCiAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBmbGFzaF9kYXRhID0gRTEwMDBfUkVBRF9JQ0g4X1JFRyhodywgSUNIOF9GTEFTSF9GREFUQTApOworICAgICAgICAgICAgZmxhc2hfZGF0YSA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZEQVRBMCk7CiAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgKmRhdGEgPSAodWludDhfdCkoZmxhc2hfZGF0YSAmIDB4MDAwMDAwRkYpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDIpIHsKQEAgLTg2MzQsOSArODY0NCw5IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gaGVyZSwgdGhlbiB0aGluZ3MgYXJlIHByb2JhYmx5IGNvbXBsZXRlbHkgaG9zZWQsCiAgICAgICAgICAgICAgKiBidXQgaWYgdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCwgaXQgd29uJ3QgaHVydCB0byBnaXZlCi0gICAgICAgICAgICAgKiBpdCBhbm90aGVyIHRyeS4uLklDSDhfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UIHRpbWVzLgorICAgICAgICAgICAgICogaXQgYW5vdGhlciB0cnkuLi5JQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UIHRpbWVzLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRlNUUyk7CisgICAgICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOwogICAgICAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2VyciA9PSAxKSB7CiAgICAgICAgICAgICAgICAgLyogUmVwZWF0IGZvciBzb21lIHRpbWUgYmVmb3JlIGdpdmluZyB1cC4gKi8KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTg2NDUsNyArODY1NSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IHdoaWxlIChjb3VudCsrIDwgSUNIOF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQpOworICAgIH0gd2hpbGUgKGNvdW50KysgPCBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKTsKIAogICAgIHJldHVybiBlcnJvcjsKIH0KQEAgLTg2NzIsMTAgKzg2ODIsMTAgQEAKICAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX2ljaDhfZGF0YSIpOwogCiAgICAgaWYgKHNpemUgPCAxICB8fCBzaXplID4gMiB8fCBkYXRhID4gc2l6ZSAqIDB4ZmYgfHwKLSAgICAgICAgaW5kZXggPiBJQ0g4X0ZMQVNIX0xJTkVBUl9BRERSX01BU0spCisgICAgICAgIGluZGV4ID4gSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0spCiAgICAgICAgIHJldHVybiBlcnJvcjsKIAotICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzID0gKElDSDhfRkxBU0hfTElORUFSX0FERFJfTUFTSyAmIGluZGV4KSArCisgICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgPSAoSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgJiBpbmRleCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPmZsYXNoX2Jhc2VfYWRkcjsKIAogICAgIGRvIHsKQEAgLTg2ODUsMzQgKzg2OTUsMzQgQEAKICAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBoc2ZsY3RsLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZDVEwpOworICAgICAgICBoc2ZsY3RsLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMKTsKICAgICAgICAgLyogMGIvMWIgY29ycmVzcG9uZHMgdG8gMSBvciAyIGJ5dGUgc2l6ZSwgcmVzcGVjdGl2ZWx5LiAqLwogICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsZGJjb3VudCA9IHNpemUgLTE7Ci0gICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxjeWNsZSA9IElDSDhfQ1lDTEVfV1JJVEU7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CisgICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxjeWNsZSA9IElDSF9DWUNMRV9XUklURTsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CiAKICAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBpbmRleCBpbnRvIEZsYXNoIExpbmVhciBhZGRyZXNzIGZpZWxkIGluCiAgICAgICAgICAqIEZsYXNoIEFkZHJlc3MgKi8KLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcoaHcsIElDSDhfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CiAKICAgICAgICAgaWYgKHNpemUgPT0gMSkKICAgICAgICAgICAgIGZsYXNoX2RhdGEgPSAodWludDMyX3QpZGF0YSAmIDB4MDBGRjsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgZmxhc2hfZGF0YSA9ICh1aW50MzJfdClkYXRhOwogCi0gICAgICAgIEUxMDAwX1dSSVRFX0lDSDhfUkVHKGh3LCBJQ0g4X0ZMQVNIX0ZEQVRBMCwgZmxhc2hfZGF0YSk7CisgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9GREFUQTAsIGZsYXNoX2RhdGEpOwogCiAgICAgICAgIC8qIGNoZWNrIGlmIEZDRVJSIGlzIHNldCB0byAxICwgaWYgc2V0IHRvIDEsIGNsZWFyIGl0IGFuZCB0cnkgdGhlIHdob2xlCiAgICAgICAgICAqIHNlcXVlbmNlIGEgZmV3IG1vcmUgdGltZXMgZWxzZSBkb25lICovCi0gICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIOF9GTEFTSF9DT01NQU5EX1RJTUVPVVQpOworICAgICAgICBlcnJvciA9IGUxMDAwX2ljaDhfZmxhc2hfY3ljbGUoaHcsIElDSF9GTEFTSF9DT01NQU5EX1RJTUVPVVQpOwogICAgICAgICBpZiAoZXJyb3IgPT0gRTEwMDBfU1VDQ0VTUykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBJZiB3ZSdyZSBoZXJlLCB0aGVuIHRoaW5ncyBhcmUgbW9zdCBsaWtlbHkgY29tcGxldGVseSBob3NlZCwKICAgICAgICAgICAgICAqIGJ1dCBpZiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIGRldGVjdGVkLCBpdCB3b24ndCBodXJ0IHRvIGdpdmUKLSAgICAgICAgICAgICAqIGl0IGFub3RoZXIgdHJ5Li4uSUNIOF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCisgICAgICAgICAgICAgKiBpdCBhbm90aGVyIHRyeS4uLklDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CiAgICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDEpIHsKICAgICAgICAgICAgICAgICAvKiBSZXBlYXQgZm9yIHNvbWUgdGltZSBiZWZvcmUgZ2l2aW5nIHVwLiAqLwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtODcyMSw3ICs4NzMxLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gd2hpbGUgKGNvdW50KysgPCBJQ0g4X0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCk7CisgICAgfSB3aGlsZSAoY291bnQrKyA8IElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQpOwogCiAgICAgcmV0dXJuIGVycm9yOwogfQpAQCAtODg0MCw3ICs4ODUwLDcgQEAKICAgICBpbnQzMl90ICBqID0gMDsKICAgICBpbnQzMl90ICBlcnJvcl9mbGFnID0gMDsKIAotICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTKTsKKyAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOwogCiAgICAgLyogRGV0ZXJtaW5lIEhXIFNlY3RvciBzaXplOiBSZWFkIEJFUkFTRSBiaXRzIG9mIEh3IGZsYXNoIFN0YXR1cyByZWdpc3RlciAqLwogICAgIC8qIDAwOiBUaGUgSHcgc2VjdG9yIGlzIDI1NiBieXRlcywgaGVuY2Ugd2UgbmVlZCB0byBlcmFzZSAxNgpAQCAtODg1MywxOSArODg2MywxNCBAQAogICAgICAqIDExOiBUaGUgSHcgc2VjdG9yIHNpemUgaXMgNjRLIGJ5dGVzICovCiAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmJlcmFzZXN6ID09IDB4MCkgewogICAgICAgICAvKiBIdyBzZWN0b3Igc2l6ZSAyNTYgKi8KLSAgICAgICAgc3ViX3NlY3Rvcl9zaXplID0gSUNIOF9GTEFTSF9TRUdfU0laRV8yNTY7Ci0gICAgICAgIGJhbmtfc2l6ZSA9IElDSDhfRkxBU0hfU0VDVE9SX1NJWkU7Ci0gICAgICAgIGl0ZXJhdGlvbiA9IElDSDhfRkxBU0hfU0VDVE9SX1NJWkUgLyBJQ0g4X0ZMQVNIX1NFR19TSVpFXzI1NjsKKyAgICAgICAgc3ViX3NlY3Rvcl9zaXplID0gSUNIX0ZMQVNIX1NFR19TSVpFXzI1NjsKKyAgICAgICAgYmFua19zaXplID0gSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFOworICAgICAgICBpdGVyYXRpb24gPSBJQ0hfRkxBU0hfU0VDVE9SX1NJWkUgLyBJQ0hfRkxBU0hfU0VHX1NJWkVfMjU2OwogICAgIH0gZWxzZSBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuYmVyYXNlc3ogPT0gMHgxKSB7Ci0gICAgICAgIGJhbmtfc2l6ZSA9IElDSDhfRkxBU0hfU0VHX1NJWkVfNEs7Ci0gICAgICAgIGl0ZXJhdGlvbiA9IDE7Ci0gICAgfSBlbHNlIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbiAmJgotICAgICAgICAgICAgICAgaHNmc3RzLmhzZl9zdGF0dXMuYmVyYXNlc3ogPT0gMHgyKSB7Ci0gICAgICAgIC8qIDhLIGVyYXNlIHNpemUgaW52YWxpZCBmb3IgSUNIOCAtIGFkZGVkIGluIGZvciBJQ0g5ICovCi0gICAgICAgIGJhbmtfc2l6ZSA9IElDSDlfRkxBU0hfU0VHX1NJWkVfOEs7CisgICAgICAgIGJhbmtfc2l6ZSA9IElDSF9GTEFTSF9TRUdfU0laRV80SzsKICAgICAgICAgaXRlcmF0aW9uID0gMTsKICAgICB9IGVsc2UgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmJlcmFzZXN6ID09IDB4MykgewotICAgICAgICBiYW5rX3NpemUgPSBJQ0g4X0ZMQVNIX1NFR19TSVpFXzY0SzsKKyAgICAgICAgYmFua19zaXplID0gSUNIX0ZMQVNIX1NFR19TSVpFXzY0SzsKICAgICAgICAgaXRlcmF0aW9uID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZXJyb3I7CkBAIC04ODgzLDkgKzg4ODgsOSBAQAogCiAgICAgICAgICAgICAvKiBXcml0ZSBhIHZhbHVlIDExIChibG9jayBFcmFzZSkgaW4gRmxhc2ggQ3ljbGUgZmllbGQgaW4gSHcgZmxhc2gKICAgICAgICAgICAgICAqIENvbnRyb2wgKi8KLSAgICAgICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCk7Ci0gICAgICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0g4X0NZQ0xFX0VSQVNFOwotICAgICAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKKyAgICAgICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwpOworICAgICAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX0VSQVNFOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CiAKICAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IDI0IGJpdHMgb2YgYW4gaW5kZXggd2l0aGluIHRoZSBibG9jayBpbnRvIEZsYXNoCiAgICAgICAgICAgICAgKiBMaW5lYXIgYWRkcmVzcyBmaWVsZCBpbiBGbGFzaCBBZGRyZXNzLiAgVGhpcyBwcm9iYWJseSBuZWVkcyB0bwpAQCAtODg5MywxNyArODg5OCwxNyBAQAogICAgICAgICAgICAgICogdGhlIHNvZnR3YXJlIGJhbmsgc2l6ZSAoNCwgOCBvciA2NCBLQnl0ZXMpICovCiAgICAgICAgICAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IGJhbmsgKiBiYW5rX3NpemUgKyBqICogc3ViX3NlY3Rvcl9zaXplOwogICAgICAgICAgICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgKz0gaHctPmZsYXNoX2Jhc2VfYWRkcjsKLSAgICAgICAgICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzICY9IElDSDhfRkxBU0hfTElORUFSX0FERFJfTUFTSzsKKyAgICAgICAgICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzICY9IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLOwogCi0gICAgICAgICAgICBFMTAwMF9XUklURV9JQ0g4X1JFRyhodywgSUNIOF9GTEFTSF9GQUREUiwgZmxhc2hfbGluZWFyX2FkZHJlc3MpOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CiAKLSAgICAgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIOF9GTEFTSF9FUkFTRV9USU1FT1VUKTsKKyAgICAgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIX0ZMQVNIX0VSQVNFX1RJTUVPVVQpOwogICAgICAgICAgICAgLyogQ2hlY2sgaWYgRkNFUlIgaXMgc2V0IHRvIDEuICBJZiAxLCBjbGVhciBpdCBhbmQgdHJ5IHRoZSB3aG9sZQogICAgICAgICAgICAgICogc2VxdWVuY2UgYSBmZXcgbW9yZSB0aW1lcyBlbHNlIERvbmUgKi8KICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOwogICAgICAgICAgICAgICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNlcnIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXQgZm9yIHNvbWUgdGltZSBiZWZvcmUgZ2l2aW5nIHVwICovCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtODkxMiw3ICs4OTE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgoY291bnQgPCBJQ0g4X0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCkgJiYgIWVycm9yX2ZsYWcpOworICAgICAgICB9IHdoaWxlICgoY291bnQgPCBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKSAmJiAhZXJyb3JfZmxhZyk7CiAgICAgICAgIGlmIChlcnJvcl9mbGFnID09IDEpCiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC05MDEzLDUgKzkwMTgsMyBAQAogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKaW5kZXggNDQ5YTYwMy4uMzMyMWZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCkBAIC0xMjgsMTEgKzEyOCwxMyBAQAogLyogUENJIGJ1cyB3aWR0aHMgKi8KIHR5cGVkZWYgZW51bSB7CiAgICAgZTEwMDBfYnVzX3dpZHRoX3Vua25vd24gPSAwLAorICAgIC8qIFRoZXNlIFBDSWUgdmFsdWVzIHNob3VsZCBsaXRlcmFsbHkgbWF0Y2ggdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMKKyAgICAgKiBmcm9tIGNvbmZpZyBzcGFjZSAqLworICAgIGUxMDAwX2J1c193aWR0aF9wY2lleF8xID0gMSwKKyAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfMiA9IDIsCisgICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzQgPSA0LAogICAgIGUxMDAwX2J1c193aWR0aF8zMiwKICAgICBlMTAwMF9idXNfd2lkdGhfNjQsCi0gICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzEsCi0gICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzIsCi0gICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzQsCiAgICAgZTEwMDBfYnVzX3dpZHRoX3Jlc2VydmVkCiB9IGUxMDAwX2J1c193aWR0aDsKIApAQCAtMzI2LDYgKzMyOCw3IEBACiBpbnQzMl90IGUxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGludDMyX3QgZTEwMDBfcGh5X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pOwogaW50MzJfdCBlMTAwMF92YWxpZGF0ZV9tZGlfc2V0dGluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKwogdm9pZCBlMTAwMF9waHlfcG93ZXJkb3duX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKIC8qIEVFUFJPTSBGdW5jdGlvbnMgKi8KQEAgLTM5MCw3ICszOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCk7CiBib29sZWFuX3QgZTEwMDBfY2hlY2tfbW5nX21vZGUoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBib29sZWFuX3QgZTEwMDBfZW5hYmxlX3R4X3BrdF9maWx0ZXJpbmcoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci0KIGludDMyX3QgZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgcmVnLCB1aW50MTZfdCB3b3JkcywgdWludDE2X3QgKmRhdGEpOwogaW50MzJfdCBlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CiBpbnQzMl90IGUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CkBAIC00NzMsNiArNDc1LDcgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfRklCRVIgICAgICAgMHgxMDVGCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUyAgICAgIDB4MTA2MAogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUiAweDEwQTQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVJfTE9XUFJPRklMRSAgMHgxMEJDCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MkVJX0NPUFBFUiAgICAgIDB4MTA3RAogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzJFSV9GSUJFUiAgICAgICAweDEwN0UKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcyRUlfU0VSREVTICAgICAgMHgxMDdGCkBAIC00OTAsNiArNDkzLDggQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUdQX0FNVCAgICAgICAgMHgxMDRBCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9DICAgICAgICAgIDB4MTA0QgogI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JRkUgICAgICAgICAgICAweDEwNEMKKyNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0dUICAgICAgICAgMHgxMEM0CisjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRV9HICAgICAgICAgIDB4MTBDNQogI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTSAgICAgICAgICAweDEwNEQKIAogCkBAIC01NzYsNiArNTgxLDcgQEAKICAqIEUxMDAwX1JBUl9FTlRSSUVTIC0gMSBtdWx0aWNhc3QgYWRkcmVzc2VzLgogICovCiAjZGVmaW5lIEUxMDAwX1JBUl9FTlRSSUVTIDE1CisKICNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVNfSUNIOExBTiAgNgogCiAjZGVmaW5lIE1JTl9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgIDgKQEAgLTEzMzUsOSArMTM0MSw5IEBACiAgICAgdWludDY0X3QgZ290Y2g7CiAgICAgdWludDY0X3Qgcm5iYzsKICAgICB1aW50NjRfdCBydWM7CisgICAgdWludDY0X3QgcmZjOwogICAgIHVpbnQ2NF90IHJvYzsKICAgICB1aW50NjRfdCBybGVycmM7Ci0gICAgdWludDY0X3QgcmZjOwogICAgIHVpbnQ2NF90IHJqYzsKICAgICB1aW50NjRfdCBtZ3ByYzsKICAgICB1aW50NjRfdCBtZ3BkYzsKQEAgLTE1NzcsOCArMTU4Myw4IEBACiAjZGVmaW5lIEUxMDAwX0hJQ1JfRldfUkVTRVQgIDB4QzAKIAogI2RlZmluZSBFMTAwMF9TSEFET1dfUkFNX1dPUkRTICAgICAyMDQ4Ci0jZGVmaW5lIEUxMDAwX0lDSDhfTlZNX1NJR19XT1JEICAgIDB4MTMKLSNkZWZpbmUgRTEwMDBfSUNIOF9OVk1fU0lHX01BU0sgICAgMHhDMAorI2RlZmluZSBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEICAgICAweDEzCisjZGVmaW5lIEUxMDAwX0lDSF9OVk1fU0lHX01BU0sgICAgIDB4QzAKIAogLyogRUVQUk9NIFJlYWQgKi8KICNkZWZpbmUgRTEwMDBfRUVSRF9TVEFSVCAgICAgIDB4MDAwMDAwMDEgLyogU3RhcnQgUmVhZCAqLwpAQCAtMzE3Miw2ICszMTc4LDcgQEAKICNkZWZpbmUgSUdQM19WUl9DVFJMIFwKICAgICAgICAgUEhZX1JFRyg3NzYsIDE4KSAvKiBWb2x0YWdlIHJlZ3VsYXRvciBjb250cm9sIHJlZ2lzdGVyICovCiAjZGVmaW5lIElHUDNfVlJfQ1RSTF9NT0RFX1NIVVQgICAgICAgMHgwMjAwIC8qIEVudGVyIHBvd2VyZG93biwgc2h1dGRvd24gVlJzICovCisjZGVmaW5lIElHUDNfVlJfQ1RSTF9NT0RFX01BU0sgICAgICAgMHgwMzAwIC8qIFNodXRkb3duIFZSIE1hc2sgKi8KIAogI2RlZmluZSBJR1AzX0NBUEFCSUxJVFkgXAogICAgICAgICBQSFlfUkVHKDc3NiwgMTkpIC8qIElHUDMgQ2FwYWJpbGl0eSBSZWdpc3RlciAqLwpAQCAtMzI1Niw0MSArMzI2Myw0MCBAQAogI2RlZmluZSBJRkVfUFNDTF9QUk9CRV9MRURTX09GRiAgICAgICAgICAgICAgMHgwMDA2ICAvKiBGb3JjZSBMRURzIDAgYW5kIDIgb2ZmICovCiAjZGVmaW5lIElGRV9QU0NMX1BST0JFX0xFRFNfT04gICAgICAgICAgICAgICAweDAwMDcgIC8qIEZvcmNlIExFRHMgMCBhbmQgMiBvbiAqLwogCi0jZGVmaW5lIElDSDhfRkxBU0hfQ09NTUFORF9USU1FT1VUICAgICAgICAgICA1MDAwICAgIC8qIDUwMDAgdVNlY3MgLSBhZGp1c3RlZCAqLwotI2RlZmluZSBJQ0g4X0ZMQVNIX0VSQVNFX1RJTUVPVVQgICAgICAgICAgICAgMzAwMDAwMCAvKiBVcCB0byAzIHNlY29uZHMgLSB3b3JzdCBjYXNlICovCi0jZGVmaW5lIElDSDhfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UICAgICAgICAxMCAgICAgIC8qIDEwIGN5Y2xlcyAqLwotI2RlZmluZSBJQ0g4X0ZMQVNIX1NFR19TSVpFXzI1NiAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIElDSDhfRkxBU0hfU0VHX1NJWkVfNEsgICAgICAgICAgICAgICA0MDk2Ci0jZGVmaW5lIElDSDlfRkxBU0hfU0VHX1NJWkVfOEsgICAgICAgICAgICAgICA4MTkyCi0jZGVmaW5lIElDSDhfRkxBU0hfU0VHX1NJWkVfNjRLICAgICAgICAgICAgICA2NTUzNgorI2RlZmluZSBJQ0hfRkxBU0hfQ09NTUFORF9USU1FT1VUICAgICAgICAgICAgNTAwMCAgICAvKiA1MDAwIHVTZWNzIC0gYWRqdXN0ZWQgKi8KKyNkZWZpbmUgSUNIX0ZMQVNIX0VSQVNFX1RJTUVPVVQgICAgICAgICAgICAgIDMwMDAwMDAgLyogVXAgdG8gMyBzZWNvbmRzIC0gd29yc3QgY2FzZSAqLworI2RlZmluZSBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UICAgICAgICAgMTAgICAgICAvKiAxMCBjeWNsZXMgKi8KKyNkZWZpbmUgSUNIX0ZMQVNIX1NFR19TSVpFXzI1NiAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBJQ0hfRkxBU0hfU0VHX1NJWkVfNEsgICAgICAgICAgICAgICAgNDA5NgorI2RlZmluZSBJQ0hfRkxBU0hfU0VHX1NJWkVfNjRLICAgICAgICAgICAgICAgNjU1MzYKIAotI2RlZmluZSBJQ0g4X0NZQ0xFX1JFQUQgICAgICAgICAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIElDSDhfQ1lDTEVfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgSUNIOF9DWUNMRV9XUklURSAgICAgICAgICAgICAgICAgICAgIDB4MgotI2RlZmluZSBJQ0g4X0NZQ0xFX0VSQVNFICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIElDSF9DWUNMRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSUNIX0NZQ0xFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBJQ0hfQ1lDTEVfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElDSF9DWUNMRV9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAweDMKIAotI2RlZmluZSBJQ0g4X0ZMQVNIX0dGUFJFRyAgIDB4MDAwMAotI2RlZmluZSBJQ0g4X0ZMQVNIX0hTRlNUUyAgIDB4MDAwNAotI2RlZmluZSBJQ0g4X0ZMQVNIX0hTRkNUTCAgIDB4MDAwNgotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZBRERSICAgIDB4MDAwOAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZEQVRBMCAgIDB4MDAxMAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZSQUNDICAgIDB4MDA1MAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZSRUcwICAgIDB4MDA1NAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZSRUcxICAgIDB4MDA1OAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZSRUcyICAgIDB4MDA1QwotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZSRUczICAgIDB4MDA2MAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZQUjAgICAgIDB4MDA3NAotI2RlZmluZSBJQ0g4X0ZMQVNIX0ZQUjEgICAgIDB4MDA3OAotI2RlZmluZSBJQ0g4X0ZMQVNIX1NTRlNUUyAgIDB4MDA5MAotI2RlZmluZSBJQ0g4X0ZMQVNIX1NTRkNUTCAgIDB4MDA5MgotI2RlZmluZSBJQ0g4X0ZMQVNIX1BSRU9QICAgIDB4MDA5NAotI2RlZmluZSBJQ0g4X0ZMQVNIX09QVFlQRSAgIDB4MDA5NgotI2RlZmluZSBJQ0g4X0ZMQVNIX09QTUVOVSAgIDB4MDA5OAorI2RlZmluZSBJQ0hfRkxBU0hfR0ZQUkVHICAgMHgwMDAwCisjZGVmaW5lIElDSF9GTEFTSF9IU0ZTVFMgICAweDAwMDQKKyNkZWZpbmUgSUNIX0ZMQVNIX0hTRkNUTCAgIDB4MDAwNgorI2RlZmluZSBJQ0hfRkxBU0hfRkFERFIgICAgMHgwMDA4CisjZGVmaW5lIElDSF9GTEFTSF9GREFUQTAgICAweDAwMTAKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZSQUNDICAgIDB4MDA1MAorI2RlZmluZSBJQ0hfRkxBU0hfRlJFRzAgICAgMHgwMDU0CisjZGVmaW5lIElDSF9GTEFTSF9GUkVHMSAgICAweDAwNTgKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZSRUcyICAgIDB4MDA1QworI2RlZmluZSBJQ0hfRkxBU0hfRlJFRzMgICAgMHgwMDYwCisjZGVmaW5lIElDSF9GTEFTSF9GUFIwICAgICAweDAwNzQKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZQUjEgICAgIDB4MDA3OAorI2RlZmluZSBJQ0hfRkxBU0hfU1NGU1RTICAgMHgwMDkwCisjZGVmaW5lIElDSF9GTEFTSF9TU0ZDVEwgICAweDAwOTIKKyNkZWZpbmUgSUNIX0ZMQVNIX1BSRU9QICAgIDB4MDA5NAorI2RlZmluZSBJQ0hfRkxBU0hfT1BUWVBFICAgMHgwMDk2CisjZGVmaW5lIElDSF9GTEFTSF9PUE1FTlUgICAweDAwOTgKIAotI2RlZmluZSBJQ0g4X0ZMQVNIX1JFR19NQVBTSVpFICAgICAgMHgwMEEwCi0jZGVmaW5lIElDSDhfRkxBU0hfU0VDVE9SX1NJWkUgICAgICA0MDk2Ci0jZGVmaW5lIElDSDhfR0ZQUkVHX0JBU0VfTUFTSyAgICAgICAweDFGRkYKLSNkZWZpbmUgSUNIOF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLIDB4MDBGRkZGRkYKKyNkZWZpbmUgSUNIX0ZMQVNIX1JFR19NQVBTSVpFICAgICAgMHgwMEEwCisjZGVmaW5lIElDSF9GTEFTSF9TRUNUT1JfU0laRSAgICAgIDQwOTYKKyNkZWZpbmUgSUNIX0dGUFJFR19CQVNFX01BU0sgICAgICAgMHgxRkZGCisjZGVmaW5lIElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLIDB4MDBGRkZGRkYKIAogLyogSUNIOCBHYkUgRmxhc2ggSGFyZHdhcmUgU2VxdWVuY2luZyBGbGFzaCBTdGF0dXMgUmVnaXN0ZXIgYml0IGJyZWFrZG93biAqLwogLyogT2Zmc2V0IDA0aCBIU0ZTVFMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCA3MjZlYzVlLi4zMmRkZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZTEwMDAuaCIKKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CiAKIGNoYXIgZTEwMDBfZHJpdmVyX25hbWVbXSA9ICJlMTAwMCI7CiBzdGF0aWMgY2hhciBlMTAwMF9kcml2ZXJfc3RyaW5nW10gPSAiSW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBEcml2ZXIiOwpAQCAtMzUsNyArMzYsNyBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSSAiLU5BUEkiCiAjZW5kaWYKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjcuMi45LWs0IkRSSVZFUk5BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjcuMy4xNS1rMiJEUklWRVJOQVBJCiBjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uLiI7CiAKQEAgLTEwMyw2ICsxMDQsOSBAQAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQjkpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQkEpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQkIpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQkMpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQzQpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQzUpLAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCx9CiB9OwpAQCAtMTU0LDYgKzE1OCw5IEBACiBzdGF0aWMgaW50IGUxMDAwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpOwogc3RhdGljIGludCBlMTAwMF9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApOwogc3RhdGljIGlycXJldHVybl90IGUxMDAwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSk7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyBpcnFyZXR1cm5fdCBlMTAwMF9pbnRyX21zaShpbnQgaXJxLCB2b2lkICpkYXRhKTsKKyNlbmRpZgogc3RhdGljIGJvb2xlYW5fdCBlMTAwMF9jbGVhbl90eF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqdHhfcmluZyk7CiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKQEAgLTI4NSw3ICsyOTIsNyBAQAogCiAJZmxhZ3MgPSBJUlFGX1NIQVJFRDsKICNpZmRlZiBDT05GSUdfUENJX01TSQotCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTcxKSB7CiAJCWFkYXB0ZXItPmhhdmVfbXNpID0gVFJVRTsKIAkJaWYgKChlcnIgPSBwY2lfZW5hYmxlX21zaShhZGFwdGVyLT5wZGV2KSkpIHsKIAkJCURQUklOVEsoUFJPQkUsIEVSUiwKQEAgLTI5Myw4ICszMDAsMTQgQEAKIAkJCWFkYXB0ZXItPmhhdmVfbXNpID0gRkFMU0U7CiAJCX0KIAl9Ci0JaWYgKGFkYXB0ZXItPmhhdmVfbXNpKQorCWlmIChhZGFwdGVyLT5oYXZlX21zaSkgewogCQlmbGFncyAmPSB+SVJRRl9TSEFSRUQ7CisJCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJmUxMDAwX2ludHJfbXNpLCBmbGFncywKKwkJICAgICAgICAgICAgICAgICAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAoZXJyKQorCQkJRFBSSU5USyhQUk9CRSwgRVJSLAorCQkJICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0IEVycm9yOiAlZFxuIiwgZXJyKTsKKwl9IGVsc2UKICNlbmRpZgogCWlmICgoZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCAmZTEwMDBfaW50ciwgZmxhZ3MsCiAJICAgICAgICAgICAgICAgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpKQpAQCAtMzc1LDcgKzM4OCw3IEBACiAgKiBlMTAwMF9yZWxlYXNlX2h3X2NvbnRyb2wgcmVzZXRzIHtDVFJMX0VYVHxGV1NNfTpEUlZfTE9BRCBiaXQuCiAgKiBGb3IgQVNGIGFuZCBQYXNzIFRocm91Z2ggdmVyc2lvbnMgb2YgZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUKICAqIGRyaXZlciBpcyBubyBsb25nZXIgbG9hZGVkLiBGb3IgQU1UIHZlcnNpb24gKG9ubHkgd2l0aCA4MjU3MykgaQotICogb2YgdGhlIGYvdyB0aGlzIG1lYW5zIHRoYXQgdGhlIG5ldG93cmsgaS9mIGlzIGNsb3NlZC4KKyAqIG9mIHRoZSBmL3cgdGhpcyBtZWFucyB0aGF0IHRoZSBuZXR3b3JrIGkvZiBpcyBjbG9zZWQuCiAgKgogICoqLwogCkBAIC00MTYsNyArNDI5LDcgQEAKICAqIGUxMDAwX2dldF9od19jb250cm9sIHNldHMge0NUUkxfRVhUfEZXU019OkRSVl9MT0FEIGJpdC4KICAqIEZvciBBU0YgYW5kIFBhc3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBmL3cgdGhpcyBtZWFucyB0aGF0CiAgKiB0aGUgZHJpdmVyIGlzIGxvYWRlZC4gRm9yIEFNVCB2ZXJzaW9uIChvbmx5IHdpdGggODI1NzMpCi0gKiBvZiB0aGUgZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUgbmV0b3dyayBpL2YgaXMgb3Blbi4KKyAqIG9mIHRoZSBmL3cgdGhpcyBtZWFucyB0aGF0IHRoZSBuZXR3b3JrIGkvZiBpcyBvcGVuLgogICoKICAqKi8KIApAQCAtNDI2LDYgKzQzOSw3IEBACiAJdWludDMyX3QgY3RybF9leHQ7CiAJdWludDMyX3Qgc3dzbTsKIAl1aW50MzJfdCBleHRjbmY7CisKIAkvKiBMZXQgZmlybXdhcmUga25vdyB0aGUgZHJpdmVyIGhhcyB0YWtlbiBvdmVyICovCiAJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgewogCWNhc2UgZTEwMDBfODI1NzE6CkBAIC02MDEsOSArNjE1LDYgQEAKIGUxMDAwX3Jlc2V0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewogCXVpbnQzMl90IHBiYSwgbWFuYzsKLSNpZmRlZiBESVNBQkxFX01VTFIKLQl1aW50MzJfdCB0Y3RsOwotI2VuZGlmCiAJdWludDE2X3QgZmNfaGlnaF93YXRlcl9tYXJrID0gRTEwMDBfRkNfSElHSF9ESUZGOwogCiAJLyogUmVwYXJ0aXRpb24gUGJhIGZvciBncmVhdGVyIHRoYW4gOWsgbXR1CkBAIC02NzAsMTIgKzY4MSw3IEBACiAJZTEwMDBfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVQywgMCk7Ci0jaWZkZWYgRElTQUJMRV9NVUxSCi0JLyogZGlzYWJsZSBNdWx0aXBsZSBSZWFkcyBpbiBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyIGZvciBkZWJ1Z2dpbmcgKi8KLQl0Y3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRDVEwpOwotCUUxMDAwX1dSSVRFX1JFRyhodywgVENUTCwgdGN0bCAmIH5FMTAwMF9UQ1RMX01VTFIpOwogCi0jZW5kaWYKIAlpZiAoZTEwMDBfaW5pdF9odygmYWRhcHRlci0+aHcpKQogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJIYXJkd2FyZSBFcnJvclxuIik7CiAJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOwpAQCAtODUxLDkgKzg1Nyw5IEBACiAJICAgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwXzgyNTQ3KSkKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKIAotI2lmZGVmIE5FVElGX0ZfVFNPX0lQVjYKKyNpZmRlZiBORVRJRl9GX1RTTzYKIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTT19JUFY2OworCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKICNlbmRpZgogI2VuZGlmCiAJaWYgKHBjaV91c2luZ19kYWMpCkBAIC05NjgsNiArOTc0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUl9MT1dQUk9GSUxFOgogCQkvKiBpZiBxdWFkIHBvcnQgYWRhcHRlciwgZGlzYWJsZSBXb0wgb24gYWxsIGJ1dCBwb3J0IEEgKi8KIAkJaWYgKGdsb2JhbF9xdWFkX3BvcnRfYSAhPSAwKQogCQkJYWRhcHRlci0+ZWVwcm9tX3dvbCA9IDA7CkBAIC0xMjc5LDEyICsxMjg2LDEwIEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLwotCiAJaWYgKChlcnIgPSBlMTAwMF9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKIAkJZ290byBlcnJfc2V0dXBfdHg7CiAKIAkvKiBhbGxvY2F0ZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCi0KIAlpZiAoKGVyciA9IGUxMDAwX3NldHVwX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcikpKQogCQlnb3RvIGVycl9zZXR1cF9yeDsKIApAQCAtMTU2OSw2ICsxNTc0LDggQEAKIAogCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcyKSB7CiAJCXRhcmMgPSBFMTAwMF9SRUFEX1JFRyhodywgVEFSQzApOworCQkvKiBzZXQgdGhlIHNwZWVkIG1vZGUgYml0LCB3ZSdsbCBjbGVhciBpdCBpZiB3ZSdyZSBub3QgYXQKKwkJICogZ2lnYWJpdCBsaW5rIGxhdGVyICovCiAJCXRhcmMgfD0gKDEgPDwgMjEpOwogCQlFMTAwMF9XUklURV9SRUcoaHcsIFRBUkMwLCB0YXJjKTsKIAl9IGVsc2UgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgewpAQCAtMTU4Myw4ICsxNTkwLDExIEBACiAJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKIAogCS8qIFNldHVwIFRyYW5zbWl0IERlc2NyaXB0b3IgU2V0dGluZ3MgZm9yIGVvcCBkZXNjcmlwdG9yICovCi0JYWRhcHRlci0+dHhkX2NtZCA9IEUxMDAwX1RYRF9DTURfSURFIHwgRTEwMDBfVFhEX0NNRF9FT1AgfAotCQlFMTAwMF9UWERfQ01EX0lGQ1M7CisJYWRhcHRlci0+dHhkX2NtZCA9IEUxMDAwX1RYRF9DTURfRU9QIHwgRTEwMDBfVFhEX0NNRF9JRkNTOworCisJLyogb25seSBzZXQgSURFIGlmIHdlIGFyZSBkZWxheWluZyBpbnRlcnJ1cHRzIHVzaW5nIHRoZSB0aW1lcnMgKi8KKwlpZiAoYWRhcHRlci0+dHhfaW50X2RlbGF5KQorCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9DTURfSURFOwogCiAJaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQogCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9DTURfUlBTOwpAQCAtMTgyMSw4ICsxODMxLDExIEBACiAJCS8qIENvbmZpZ3VyZSBleHRyYSBwYWNrZXQtc3BsaXQgcmVnaXN0ZXJzICovCiAJCXJmY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSRkNUTCk7CiAJCXJmY3RsIHw9IEUxMDAwX1JGQ1RMX0VYVEVOOwotCQkvKiBkaXNhYmxlIElQdjYgcGFja2V0IHNwbGl0IHN1cHBvcnQgKi8KLQkJcmZjdGwgfD0gRTEwMDBfUkZDVExfSVBWNl9ESVM7CisJCS8qIGRpc2FibGUgcGFja2V0IHNwbGl0IHN1cHBvcnQgZm9yIElQdjYgZXh0ZW5zaW9uIGhlYWRlcnMsCisJCSAqIGJlY2F1c2Ugc29tZSBtYWxmb3JtZWQgSVB2NiBoZWFkZXJzIGNhbiBoYW5nIHRoZSBSWCAqLworCQlyZmN0bCB8PSAoRTEwMDBfUkZDVExfSVBWNl9FWF9ESVMgfAorCQkgICAgICAgICAgRTEwMDBfUkZDVExfTkVXX0lQVjZfRVhUX0RJUyk7CisKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkZDVEwsIHJmY3RsKTsKIAogCQlyY3RsIHw9IEUxMDAwX1JDVExfRFRZUF9QUzsKQEAgLTE4ODUsNyArMTg5OCw3IEBACiAKIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CiAJCUUxMDAwX1dSSVRFX1JFRyhodywgUkFEViwgYWRhcHRlci0+cnhfYWJzX2ludF9kZWxheSk7Ci0JCWlmIChhZGFwdGVyLT5pdHIgPiAxKQorCQlpZiAoYWRhcHRlci0+aXRyX3NldHRpbmcgIT0gMCkKIAkJCUUxMDAwX1dSSVRFX1JFRyhodywgSVRSLAogCQkJCTEwMDAwMDAwMDAgLyAoYWRhcHRlci0+aXRyICogMjU2KSk7CiAJfQpAQCAtMTg5NSwxMSArMTkwOCwxMSBAQAogCQkvKiBSZXNldCBkZWxheSB0aW1lcnMgYWZ0ZXIgZXZlcnkgaW50ZXJydXB0ICovCiAJCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX0lOVF9USU1FUl9DTFI7CiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQkJLyogQXV0by1NYXNrIGludGVycnVwdHMgdXBvbiBJQ1IgcmVhZC4gKi8KKwkJLyogQXV0by1NYXNrIGludGVycnVwdHMgdXBvbiBJQ1IgYWNjZXNzICovCiAJCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX0lBTUU7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgSUFNLCAweGZmZmZmZmZmKTsKICNlbmRpZgogCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7Ci0JCUUxMDAwX1dSSVRFX1JFRyhodywgSUFNLCB+MCk7CiAJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKIAl9CiAKQEAgLTE5MzgsNiArMTk1MSwxMiBAQAogCQlFMTAwMF9XUklURV9SRUcoaHcsIFJYQ1NVTSwgcnhjc3VtKTsKIAl9CiAKKwkvKiBlbmFibGUgZWFybHkgcmVjZWl2ZXMgb24gODI1NzMsIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHVzaW5nID4gMjA0OAorCSAqIGJ5dGUgdG90YWwgZnJhbWUgc2l6ZS4gIGZvciBleGFtcGxlIG9ubHkgZm9yIGp1bWJvIGZyYW1lcyAqLworI2RlZmluZSBFMTAwMF9FUlRfMjA0OCAweDEwMAorCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpCisJCUUxMDAwX1dSSVRFX1JFRyhodywgRVJULCBFMTAwMF9FUlRfMjA0OCk7CisKIAkvKiBFbmFibGUgUmVjZWl2ZXMgKi8KIAlFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOwogfQpAQCAtMTk5MSwxMCArMjAxMCwxMyBAQAogCQkJCWJ1ZmZlcl9pbmZvLT5kbWEsCiAJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKIAkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CiAJfQotCWlmIChidWZmZXJfaW5mby0+c2tiKQorCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CiAJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOwotCW1lbXNldChidWZmZXJfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpKTsKKwkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJfQorCS8qIGJ1ZmZlcl9pbmZvIG11c3QgYmUgY29tcGxldGVseSBzZXQgdXAgaW4gdGhlIHRyYW5zbWl0IHBhdGggKi8KIH0KIAogLyoqCkBAIC0yNDE4LDYgKzI0NDAsNyBAQAogCQlEUFJJTlRLKExJTkssIElORk8sCiAJCQkiR2lnYWJpdCBoYXMgYmVlbiBkaXNhYmxlZCwgZG93bmdyYWRpbmcgc3BlZWRcbiIpOwogCX0KKwogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgewogCQllMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZygmYWRhcHRlci0+aHcpOwogCQlpZiAoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0gYWRhcHRlci0+aHcubW5nX2Nvb2tpZS52bGFuX2lkKQpAQCAtMjQ2MiwxMyArMjQ4NSwxMiBAQAogCQkJaWYgKChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSB8fAogCQkJICAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MikgJiYKIAkJCSAgICB0eGIyYiA9PSAwKSB7Ci0jZGVmaW5lIFNQRUVEX01PREVfQklUICgxIDw8IDIxKQogCQkJCXVpbnQzMl90IHRhcmMwOwogCQkJCXRhcmMwID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUQVJDMCk7Ci0JCQkJdGFyYzAgJj0gflNQRUVEX01PREVfQklUOworCQkJCXRhcmMwICY9IH4oMSA8PCAyMSk7CiAJCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVEFSQzAsIHRhcmMwKTsKIAkJCX0KLQkJCQkKKwogI2lmZGVmIE5FVElGX0ZfVFNPCiAJCQkvKiBkaXNhYmxlIFRTTyBmb3IgcGNpZSBhbmQgMTAvMTAwIHNwZWVkcywgdG8gYXZvaWQKIAkJCSAqIHNvbWUgaGFyZHdhcmUgaXNzdWVzICovCkBAIC0yNDgwLDkgKzI1MDIsMTUgQEAKIAkJCQkJRFBSSU5USyhQUk9CRSxJTkZPLAogCQkJCSAgICAgICAgIjEwLzEwMCBzcGVlZDogZGlzYWJsaW5nIFRTT1xuIik7CiAJCQkJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOworI2lmZGVmIE5FVElGX0ZfVFNPNgorCQkJCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7CisjZW5kaWYKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBTUEVFRF8xMDAwOgogCQkJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworI2lmZGVmIE5FVElGX0ZfVFNPNgorCQkJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKKyNlbmRpZgogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQkvKiBvb3BzICovCkBAIC0yNTQ5LDE5ICsyNTc3LDYgQEAKIAkJfQogCX0KIAotCS8qIER5bmFtaWMgbW9kZSBmb3IgSW50ZXJydXB0IFRocm90dGxlIFJhdGUgKElUUikgKi8KLQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYgYWRhcHRlci0+aXRyID09IDEpIHsKLQkJLyogU3ltbWV0cmljIFR4L1J4IGdldHMgYSByZWR1Y2VkIElUUj0yMDAwOyBUb3RhbAotCQkgKiBhc3ltbWV0cmljYWwgVHggb3IgUnggZ2V0cyBJVFI9ODAwMDsgZXZlcnlvbmUKLQkJICogZWxzZSBpcyBiZXR3ZWVuIDIwMDAtODAwMC4gKi8KLQkJdWludDMyX3QgZ29jID0gKGFkYXB0ZXItPmdvdGNsICsgYWRhcHRlci0+Z29yY2wpIC8gMTAwMDA7Ci0JCXVpbnQzMl90IGRpZiA9IChhZGFwdGVyLT5nb3RjbCA+IGFkYXB0ZXItPmdvcmNsID8KLQkJCWFkYXB0ZXItPmdvdGNsIC0gYWRhcHRlci0+Z29yY2wgOgotCQkJYWRhcHRlci0+Z29yY2wgLSBhZGFwdGVyLT5nb3RjbCkgLyAxMDAwMDsKLQkJdWludDMyX3QgaXRyID0gZ29jID4gMCA/IChkaWYgKiA2MDAwIC8gZ29jICsgMjAwMCkgOiA4MDAwOwotCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJVFIsIDEwMDAwMDAwMDAgLyAoaXRyICogMjU2KSk7Ci0JfQotCiAJLyogQ2F1c2Ugc29mdHdhcmUgaW50ZXJydXB0IHRvIGVuc3VyZSByeCByaW5nIGlzIGNsZWFuZWQgKi8KIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIEUxMDAwX0lDU19SWERNVDApOwogCkBAIC0yNTc3LDYgKzI1OTIsMTM1IEBACiAJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7CiB9CiAKK2VudW0gbGF0ZW5jeV9yYW5nZSB7CisJbG93ZXN0X2xhdGVuY3kgPSAwLAorCWxvd19sYXRlbmN5ID0gMSwKKwlidWxrX2xhdGVuY3kgPSAyLAorCWxhdGVuY3lfaW52YWxpZCA9IDI1NQorfTsKKworLyoqCisgKiBlMTAwMF91cGRhdGVfaXRyIC0gdXBkYXRlIHRoZSBkeW5hbWljIElUUiB2YWx1ZSBiYXNlZCBvbiBzdGF0aXN0aWNzCisgKiAgICAgIFN0b3JlcyBhIG5ldyBJVFIgdmFsdWUgYmFzZWQgb24gcGFja2V0cyBhbmQgYnl0ZQorICogICAgICBjb3VudHMgZHVyaW5nIHRoZSBsYXN0IGludGVycnVwdC4gIFRoZSBhZHZhbnRhZ2Ugb2YgcGVyIGludGVycnVwdAorICogICAgICBjb21wdXRhdGlvbiBpcyBmYXN0ZXIgdXBkYXRlcyBhbmQgbW9yZSBhY2N1cmF0ZSBJVFIgZm9yIHRoZSBjdXJyZW50CisgKiAgICAgIHRyYWZmaWMgcGF0dGVybi4gIENvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIHdlcmUgY29tcHV0ZWQKKyAqICAgICAgYmFzZWQgb24gdGhlb3JldGljYWwgbWF4aW11bSB3aXJlIHNwZWVkIGFuZCB0aHJlc2hvbGRzIHdlcmUgc2V0IGJhc2VkCisgKiAgICAgIG9uIHRlc3RpbmcgZGF0YSBhcyB3ZWxsIGFzIGF0dGVtcHRpbmcgdG8gbWluaW1pemUgcmVzcG9uc2UgdGltZQorICogICAgICB3aGlsZSBpbmNyZWFzaW5nIGJ1bGsgdGhyb3VnaHB1dC4KKyAqICAgICAgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNvbnRyb2xsZWQgYnkgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSBtb2R1bGUKKyAqICAgICAgcGFyYW1ldGVyIChzZWUgZTEwMDBfcGFyYW0uYykKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBpdHJfc2V0dGluZzogY3VycmVudCBhZGFwdGVyLT5pdHIKKyAqIEBwYWNrZXRzOiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgZHVyaW5nIHRoaXMgbWVhc3VyZW1lbnQgaW50ZXJ2YWwKKyAqIEBieXRlczogdGhlIG51bWJlciBvZiBieXRlcyBkdXJpbmcgdGhpcyBtZWFzdXJlbWVudCBpbnRlcnZhbAorICoqLworc3RhdGljIHVuc2lnbmVkIGludCBlMTAwMF91cGRhdGVfaXRyKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpdHJfc2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gaXRyX3NldHRpbmc7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCWlmICh1bmxpa2VseShody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MCkpCisJCWdvdG8gdXBkYXRlX2l0cl9kb25lOworCisJaWYgKHBhY2tldHMgPT0gMCkKKwkJZ290byB1cGRhdGVfaXRyX2RvbmU7CisKKworCXN3aXRjaCAoaXRyX3NldHRpbmcpIHsKKwljYXNlIGxvd2VzdF9sYXRlbmN5OgorCQlpZiAoKHBhY2tldHMgPCA1KSAmJiAoYnl0ZXMgPiA1MTIpKQorCQkJcmV0dmFsID0gbG93X2xhdGVuY3k7CisJCWJyZWFrOworCWNhc2UgbG93X2xhdGVuY3k6ICAvKiA1MCB1c2VjIGFrYSAyMDAwMCBpbnRzL3MgKi8KKwkJaWYgKGJ5dGVzID4gMTAwMDApIHsKKwkJCWlmICgocGFja2V0cyA8IDEwKSB8fAorCQkJICAgICAoKGJ5dGVzL3BhY2tldHMpID4gMTIwMCkpCisJCQkJcmV0dmFsID0gYnVsa19sYXRlbmN5OworCQkJZWxzZSBpZiAoKHBhY2tldHMgPiAzNSkpCisJCQkJcmV0dmFsID0gbG93ZXN0X2xhdGVuY3k7CisJCX0gZWxzZSBpZiAocGFja2V0cyA8PSAyICYmIGJ5dGVzIDwgNTEyKQorCQkJcmV0dmFsID0gbG93ZXN0X2xhdGVuY3k7CisJCWJyZWFrOworCWNhc2UgYnVsa19sYXRlbmN5OiAvKiAyNTAgdXNlYyBha2EgNDAwMCBpbnRzL3MgKi8KKwkJaWYgKGJ5dGVzID4gMjUwMDApIHsKKwkJCWlmIChwYWNrZXRzID4gMzUpCisJCQkJcmV0dmFsID0gbG93X2xhdGVuY3k7CisJCX0gZWxzZSB7CisJCQlpZiAoYnl0ZXMgPCA2MDAwKQorCQkJCXJldHZhbCA9IGxvd19sYXRlbmN5OworCQl9CisJCWJyZWFrOworCX0KKwordXBkYXRlX2l0cl9kb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDAwX3NldF9pdHIoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MTZfdCBjdXJyZW50X2l0cjsKKwl1aW50MzJfdCBuZXdfaXRyID0gYWRhcHRlci0+aXRyOworCisJaWYgKHVubGlrZWx5KGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQwKSkKKwkJcmV0dXJuOworCisJLyogZm9yIG5vbi1naWdhYml0IHNwZWVkcywganVzdCBmaXggdGhlIGludGVycnVwdCByYXRlIGF0IDQwMDAgKi8KKwlpZiAodW5saWtlbHkoYWRhcHRlci0+bGlua19zcGVlZCAhPSBTUEVFRF8xMDAwKSkgeworCQljdXJyZW50X2l0ciA9IDA7CisJCW5ld19pdHIgPSA0MDAwOworCQlnb3RvIHNldF9pdHJfbm93OworCX0KKworCWFkYXB0ZXItPnR4X2l0ciA9IGUxMDAwX3VwZGF0ZV9pdHIoYWRhcHRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+dHhfaXRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT50b3RhbF90eF9ieXRlcyk7CisJYWRhcHRlci0+cnhfaXRyID0gZTEwMDBfdXBkYXRlX2l0cihhZGFwdGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5yeF9pdHIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzKTsKKworCWN1cnJlbnRfaXRyID0gbWF4KGFkYXB0ZXItPnJ4X2l0ciwgYWRhcHRlci0+dHhfaXRyKTsKKworCS8qIGNvbnNlcnZhdGl2ZSBtb2RlIGVsaW1pbmF0ZXMgdGhlIGxvd2VzdF9sYXRlbmN5IHNldHRpbmcgKi8KKwlpZiAoY3VycmVudF9pdHIgPT0gbG93ZXN0X2xhdGVuY3kgJiYgKGFkYXB0ZXItPml0cl9zZXR0aW5nID09IDMpKQorCQljdXJyZW50X2l0ciA9IGxvd19sYXRlbmN5OworCisJc3dpdGNoIChjdXJyZW50X2l0cikgeworCS8qIGNvdW50cyBhbmQgcGFja2V0cyBpbiB1cGRhdGVfaXRyIGFyZSBkZXBlbmRlbnQgb24gdGhlc2UgbnVtYmVycyAqLworCWNhc2UgbG93ZXN0X2xhdGVuY3k6CisJCW5ld19pdHIgPSA3MDAwMDsKKwkJYnJlYWs7CisJY2FzZSBsb3dfbGF0ZW5jeToKKwkJbmV3X2l0ciA9IDIwMDAwOyAvKiBha2EgaHdpdHIgPSB+MjAwICovCisJCWJyZWFrOworCWNhc2UgYnVsa19sYXRlbmN5OgorCQluZXdfaXRyID0gNDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCitzZXRfaXRyX25vdzoKKwlpZiAobmV3X2l0ciAhPSBhZGFwdGVyLT5pdHIpIHsKKwkJLyogdGhpcyBhdHRlbXB0cyB0byBiaWFzIHRoZSBpbnRlcnJ1cHQgcmF0ZSB0b3dhcmRzIEJ1bGsKKwkJICogYnkgYWRkaW5nIGludGVybWVkaWF0ZSBzdGVwcyB3aGVuIGludGVycnVwdCByYXRlIGlzCisJCSAqIGluY3JlYXNpbmcgKi8KKwkJbmV3X2l0ciA9IG5ld19pdHIgPiBhZGFwdGVyLT5pdHIgPworCQkgICAgICAgICAgICAgbWluKGFkYXB0ZXItPml0ciArIChuZXdfaXRyID4+IDIpLCBuZXdfaXRyKSA6CisJCSAgICAgICAgICAgICBuZXdfaXRyOworCQlhZGFwdGVyLT5pdHIgPSBuZXdfaXRyOworCQlFMTAwMF9XUklURV9SRUcoaHcsIElUUiwgMTAwMDAwMDAwMCAvIChuZXdfaXRyICogMjU2KSk7CisJfQorCisJcmV0dXJuOworfQorCiAjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX0NTVU0JCTB4MDAwMDAwMDEKICNkZWZpbmUgRTEwMDBfVFhfRkxBR1NfVkxBTgkJMHgwMDAwMDAwMgogI2RlZmluZSBFMTAwMF9UWF9GTEFHU19UU08JCTB4MDAwMDAwMDQKQEAgLTI2MTcsNyArMjc2MSw3IEBACiAJCQkJCQkgICAwKTsKIAkJCWNtZF9sZW5ndGggPSBFMTAwMF9UWERfQ01EX0lQOwogCQkJaXBjc2UgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gMTsKLSNpZmRlZiBORVRJRl9GX1RTT19JUFY2CisjaWZkZWYgTkVUSUZfRl9UU082CiAJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewogCQkJc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSAwOwogCQkJc2tiLT5oLnRoLT5jaGVjayA9CkBAIC0yNjUzLDYgKzI3OTcsNyBAQAogCQljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoY21kX2xlbmd0aCk7CiAKIAkJYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCQlidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7CiAKIAkJaWYgKCsraSA9PSB0eF9yaW5nLT5jb3VudCkgaSA9IDA7CiAJCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKQEAgLTI2ODEsMTIgKzI4MjYsMTMgQEAKIAkJY29udGV4dF9kZXNjID0gRTEwMDBfQ09OVEVYVF9ERVNDKCp0eF9yaW5nLCBpKTsKIAogCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBjc3M7Ci0JCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzbyA9IGNzcyArIHNrYi0+Y3N1bTsKKwkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0gY3NzICsgc2tiLT5jc3VtX29mZnNldDsKIAkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NlID0gMDsKIAkJY29udGV4dF9kZXNjLT50Y3Bfc2VnX3NldHVwLmRhdGEgPSAwOwogCQljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoRTEwMDBfVFhEX0NNRF9ERVhUKTsKIAogCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCWJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoID0gaTsKIAogCQlpZiAodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAJCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKQEAgLTI3NTUsNiArMjkwMSw3IEBACiAJCQkJc2l6ZSwKIAkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAkJYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCQlidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7CiAKIAkJbGVuIC09IHNpemU7CiAJCW9mZnNldCArPSBzaXplOwpAQCAtMjc5NCw2ICsyOTQxLDcgQEAKIAkJCQkJc2l6ZSwKIAkJCQkJUENJX0RNQV9UT0RFVklDRSk7CiAJCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCQlidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7CiAKIAkJCWxlbiAtPSBzaXplOwogCQkJb2Zmc2V0ICs9IHNpemU7CkBAIC0yODU5LDYgKzMwMDcsOSBAQAogCiAJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOwogCXdyaXRlbChpLCBhZGFwdGVyLT5ody5od19hZGRyICsgdHhfcmluZy0+dGR0KTsKKwkvKiB3ZSBuZWVkIHRoaXMgaWYgbW9yZSB0aGFuIG9uZSBwcm9jZXNzb3IgY2FuIHdyaXRlIHRvIG91ciB0YWlsCisJICogYXQgYSB0aW1lLCBpdCBzeW5jcm9uaXplcyBJTyBvbiBJQTY0L0FsdGl4IHN5c3RlbXMgKi8KKwltbWlvd2IoKTsKIH0KIAogLyoqCkBAIC0yOTUyLDYgKzMxMDMsNyBAQAogCiAJLyogQSByZXByaWV2ZSEgKi8KIAluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCSsrYWRhcHRlci0+cmVzdGFydF9xdWV1ZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAxMCw5ICszMTYyLDkgQEAKIAkJbWF4X3Blcl90eGQgPSBtaW4obXNzIDw8IDIsIG1heF9wZXJfdHhkKTsKIAkJbWF4X3R4ZF9wd3IgPSBmbHMobWF4X3Blcl90eGQpIC0gMTsKIAotCS8qIFRTTyBXb3JrYXJvdW5kIGZvciA4MjU3MS8yLzMgQ29udHJvbGxlcnMgLS0gaWYgc2tiLT5kYXRhCi0JICogcG9pbnRzIHRvIGp1c3QgaGVhZGVyLCBwdWxsIGEgZmV3IGJ5dGVzIG9mIHBheWxvYWQgZnJvbQotCSAqIGZyYWdzIGludG8gc2tiLT5kYXRhICovCisJCS8qIFRTTyBXb3JrYXJvdW5kIGZvciA4MjU3MS8yLzMgQ29udHJvbGxlcnMgLS0gaWYgc2tiLT5kYXRhCisJCSogcG9pbnRzIHRvIGp1c3QgaGVhZGVyLCBwdWxsIGEgZmV3IGJ5dGVzIG9mIHBheWxvYWQgZnJvbQorCQkqIGZyYWdzIGludG8gc2tiLT5kYXRhICovCiAJCWhkcl9sZW4gPSAoKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSk7CiAJCWlmIChza2ItPmRhdGFfbGVuICYmIChoZHJfbGVuID09IChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pKSkgewogCQkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgewpAQCAtMzMxNiwxMiArMzQ2OCwxMiBAQAogCWFkYXB0ZXItPnN0YXRzLnJvYyArPSBFMTAwMF9SRUFEX1JFRyhodywgUk9DKTsKIAogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JYWRhcHRlci0+c3RhdHMucHJjNjQgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzY0KTsKLQlhZGFwdGVyLT5zdGF0cy5wcmMxMjcgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzEyNyk7Ci0JYWRhcHRlci0+c3RhdHMucHJjMjU1ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMyNTUpOwotCWFkYXB0ZXItPnN0YXRzLnByYzUxMSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNTExKTsKLQlhZGFwdGVyLT5zdGF0cy5wcmMxMDIzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxMDIzKTsKLQlhZGFwdGVyLT5zdGF0cy5wcmMxNTIyICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxNTIyKTsKKwkJYWRhcHRlci0+c3RhdHMucHJjNjQgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzY0KTsKKwkJYWRhcHRlci0+c3RhdHMucHJjMTI3ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxMjcpOworCQlhZGFwdGVyLT5zdGF0cy5wcmMyNTUgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzI1NSk7CisJCWFkYXB0ZXItPnN0YXRzLnByYzUxMSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNTExKTsKKwkJYWRhcHRlci0+c3RhdHMucHJjMTAyMyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTAyMyk7CisJCWFkYXB0ZXItPnN0YXRzLnByYzE1MjIgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzE1MjIpOwogCX0KIAogCWFkYXB0ZXItPnN0YXRzLnN5bWVycnMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFNZTUVSUlMpOwpAQCAtMzM1MiwxMiArMzUwNCwxMiBAQAogCWFkYXB0ZXItPnN0YXRzLnRwciArPSBFMTAwMF9SRUFEX1JFRyhodywgVFBSKTsKIAogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JYWRhcHRlci0+c3RhdHMucHRjNjQgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzY0KTsKLQlhZGFwdGVyLT5zdGF0cy5wdGMxMjcgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzEyNyk7Ci0JYWRhcHRlci0+c3RhdHMucHRjMjU1ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMyNTUpOwotCWFkYXB0ZXItPnN0YXRzLnB0YzUxMSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNTExKTsKLQlhZGFwdGVyLT5zdGF0cy5wdGMxMDIzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxMDIzKTsKLQlhZGFwdGVyLT5zdGF0cy5wdGMxNTIyICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxNTIyKTsKKwkJYWRhcHRlci0+c3RhdHMucHRjNjQgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzY0KTsKKwkJYWRhcHRlci0+c3RhdHMucHRjMTI3ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxMjcpOworCQlhZGFwdGVyLT5zdGF0cy5wdGMyNTUgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzI1NSk7CisJCWFkYXB0ZXItPnN0YXRzLnB0YzUxMSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNTExKTsKKwkJYWRhcHRlci0+c3RhdHMucHRjMTAyMyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTAyMyk7CisJCWFkYXB0ZXItPnN0YXRzLnB0YzE1MjIgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzE1MjIpOwogCX0KIAogCWFkYXB0ZXItPnN0YXRzLm1wdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIE1QVEMpOwpAQCAtMzM4MywxOCArMzUzNSwxNyBAQAogCQlhZGFwdGVyLT5zdGF0cy5pY3J4b2MgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhPQyk7CiAKIAkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pIHsKLQkJYWRhcHRlci0+c3RhdHMuaWNyeHB0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWFBUQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljcnhhdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhBVEMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3R4cHRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUFRDKTsKLQkJYWRhcHRlci0+c3RhdHMuaWN0eGF0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWEFUQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljdHhxZWMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhRRUMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3R4cW10YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFFNVEMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3J4ZG10YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWERNVEMpOworCQkJYWRhcHRlci0+c3RhdHMuaWNyeHB0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWFBUQyk7CisJCQlhZGFwdGVyLT5zdGF0cy5pY3J4YXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYQVRDKTsKKwkJCWFkYXB0ZXItPnN0YXRzLmljdHhwdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhQVEMpOworCQkJYWRhcHRlci0+c3RhdHMuaWN0eGF0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWEFUQyk7CisJCQlhZGFwdGVyLT5zdGF0cy5pY3R4cWVjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUUVDKTsKKwkJCWFkYXB0ZXItPnN0YXRzLmljdHhxbXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUU1UQyk7CisJCQlhZGFwdGVyLT5zdGF0cy5pY3J4ZG10YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWERNVEMpOwogCQl9CiAJfQogCiAJLyogRmlsbCBvdXQgdGhlIE9TIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCi0KIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfcGFja2V0cyA9IGFkYXB0ZXItPnN0YXRzLmdwcmM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy5ncHRjOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvcmNsOwpAQCAtMzQyNiw3ICszNTc3LDYgQEAKIAkvKiBUeCBEcm9wcGVkIG5lZWRzIHRvIGJlIG1haW50YWluZWQgZWxzZXdoZXJlICovCiAKIAkvKiBQaHkgU3RhdHMgKi8KLQogCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQlpZiAoKGFkYXB0ZXItPmxpbmtfc3BlZWQgPT0gU1BFRURfMTAwMCkgJiYKIAkJICAgKCFlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfdG1wKSkpIHsKQEAgLTM0NDIsNiArMzU5Miw5NSBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogfQorI2lmZGVmIENPTkZJR19QQ0lfTVNJCisKKy8qKgorICogZTEwMDBfaW50cl9tc2kgLSBJbnRlcnJ1cHQgSGFuZGxlcgorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRhdGE6IHBvaW50ZXIgdG8gYSBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiovCisKK3N0YXRpYworaXJxcmV0dXJuX3QgZTEwMDBfaW50cl9tc2koaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKyNpZm5kZWYgQ09ORklHX0UxMDAwX05BUEkKKwlpbnQgaTsKKyNlbmRpZgorCisJLyogdGhpcyBjb2RlIGF2b2lkcyB0aGUgcmVhZCBvZiBJQ1IgYnV0IGhhcyB0byBnZXQgMTAwMCBpbnRlcnJ1cHRzCisJICogYXQgZXZlcnkgbGluayBjaGFuZ2UgZXZlbnQgYmVmb3JlIGl0IHdpbGwgbm90aWNlIHRoZSBjaGFuZ2UgKi8KKwlpZiAoKythZGFwdGVyLT5kZXRlY3RfbGluayA+PSAxMDAwKSB7CisJCXVpbnQzMl90IGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJCS8qIHJlYWQgSUNSIGRpc2FibGVzIGludGVycnVwdHMgdXNpbmcgSUFNLCBzbyBrZWVwIHVwIHdpdGggb3VyCisJCSAqIGVuYWJsZS9kaXNhYmxlIGFjY291bnRpbmcgKi8KKwkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CisjZW5kaWYKKwkJYWRhcHRlci0+ZGV0ZWN0X2xpbmsgPSAwOworCQlpZiAoKGljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkgJiYKKwkJICAgIChpY3IgJiBFMTAwMF9JQ1JfSU5UX0FTU0VSVEVEKSkgeworCQkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7CisJCQkvKiA4MDAwM0VTMkxBTiB3b3JrYXJvdW5kLS0KKwkJCSogRm9yIHBhY2tldCBidWZmZXIgd29yay1hcm91bmQgb24gbGluayBkb3duIGV2ZW50OworCQkJKiBkaXNhYmxlIHJlY2VpdmVzIGhlcmUgaW4gdGhlIElTUiBhbmQKKwkJCSogcmVzZXQgYWRhcHRlciBpbiB3YXRjaGRvZworCQkJKi8KKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKKwkJCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pKSB7CisJCQkJLyogZGlzYWJsZSByZWNlaXZlcyAqLworCQkJCXVpbnQzMl90IHJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgUkNUTCk7CisJCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsICYgfkUxMDAwX1JDVExfRU4pOworCQkJfQorCQkJLyogZ3VhcmQgYWdhaW5zdCBpbnRlcnJ1cHQgd2hlbiB3ZSdyZSBnb2luZyBkb3duICovCisJCQlpZiAoIXRlc3RfYml0KF9fRTEwMDBfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJCQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLAorCQkJCSAgICAgICAgICBqaWZmaWVzICsgMSk7CisJCX0KKwl9IGVsc2UgeworCQlFMTAwMF9XUklURV9SRUcoaHcsIElDUiwgKDB4ZmZmZmZmZmYgJiB+KEUxMDAwX0lDUl9SWFNFUSB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNSX0xTQykpKTsKKwkJLyogYnVtbWVyIHdlIGhhdmUgdG8gZmx1c2ggaGVyZSwgYnV0IHRoaW5ncyBicmVhayBvdGhlcndpc2UgYXMKKwkJICogc29tZSBldmVudCBhcHBlYXJzIHRvIGJlIGxvc3Qgb3IgZGVsYXllZCBhbmQgdGhyb3VnaHB1dAorCQkgKiBkcm9wcy4gIEluIGFsbW9zdCBhbGwgdGVzdHMgdGhpcyBmbHVzaCBpcyB1bi1uZWNlc3NhcnkgKi8KKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJCS8qIEludGVycnVwdCBBdXRvLU1hc2sgKElBTSkuLi51cG9uIHdyaXRpbmcgSUNSLCBpbnRlcnJ1cHRzIGFyZQorCQkgKiBtYXNrZWQuICBObyBuZWVkIGZvciB0aGUgSU1DIHdyaXRlLCBidXQgaXQgZG9lcyBtZWFuIHdlCisJCSAqIHNob3VsZCBhY2NvdW50IGZvciBpdCBBU0FQLiAqLworCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpKSB7CisJCWFkYXB0ZXItPnRvdGFsX3R4X2J5dGVzID0gMDsKKwkJYWRhcHRlci0+dG90YWxfdHhfcGFja2V0cyA9IDA7CisJCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzID0gMDsKKwkJYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyA9IDA7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKwl9IGVsc2UKKwkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKKyNlbHNlCisJYWRhcHRlci0+dG90YWxfdHhfYnl0ZXMgPSAwOworCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzID0gMDsKKwlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzID0gMDsKKwlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9NQVhfSU5UUjsgaSsrKQorCQlpZiAodW5saWtlbHkoIWFkYXB0ZXItPmNsZWFuX3J4KGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3JpbmcpICYKKwkJICAgIWUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyLCBhZGFwdGVyLT50eF9yaW5nKSkpCisJCQlicmVhazsKKworCWlmIChsaWtlbHkoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKSkKKwkJZTEwMDBfc2V0X2l0cihhZGFwdGVyKTsKKyNlbmRpZgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCiAKIC8qKgogICogZTEwMDBfaW50ciAtIEludGVycnVwdCBIYW5kbGVyCkBAIC0zNDU4LDcgKzM2OTcsMTcgQEAKIAl1aW50MzJfdCByY3RsLCBpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSKTsKICNpZm5kZWYgQ09ORklHX0UxMDAwX05BUEkKIAlpbnQgaTsKLSNlbHNlCisjZW5kaWYKKwlpZiAodW5saWtlbHkoIWljcikpCisJCXJldHVybiBJUlFfTk9ORTsgIC8qIE5vdCBvdXIgaW50ZXJydXB0ICovCisKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCS8qIElNUyB3aWxsIG5vdCBhdXRvLW1hc2sgaWYgSU5UX0FTU0VSVEVEIGlzIG5vdCBzZXQsIGFuZCBpZiBpdCBpcworCSAqIG5vdCBzZXQsIHRoZW4gdGhlIGFkYXB0ZXIgZGlkbid0IHNlbmQgYW4gaW50ZXJydXB0ICovCisJaWYgKHVubGlrZWx5KGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSAmJgorCSAgICAgICAgICAgICAhKGljciAmIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCiAJLyogSW50ZXJydXB0IEF1dG8tTWFzay4uLnVwb24gcmVhZGluZyBJQ1IsCiAJICogaW50ZXJydXB0cyBhcmUgbWFza2VkLiAgTm8gbmVlZCBmb3IgdGhlCiAJICogSU1DIHdyaXRlLCBidXQgaXQgZG9lcyBtZWFuIHdlIHNob3VsZApAQCAtMzQ2NywxNCArMzcxNiw2IEBACiAJCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOwogI2VuZGlmCiAKLQlpZiAodW5saWtlbHkoIWljcikpIHsKLSNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQotCQlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxKQotCQkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKLSNlbmRpZgotCQlyZXR1cm4gSVJRX05PTkU7ICAvKiBOb3Qgb3VyIGludGVycnVwdCAqLwotCX0KLQogCWlmICh1bmxpa2VseShpY3IgJiAoRTEwMDBfSUNSX1JYU0VRIHwgRTEwMDBfSUNSX0xTQykpKSB7CiAJCWh3LT5nZXRfbGlua19zdGF0dXMgPSAxOwogCQkvKiA4MDAwM0VTMkxBTiB3b3JrYXJvdW5kLS0KQEAgLTM0OTUsMTMgKzM3MzYsMjAgQEAKIAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCiAJaWYgKHVubGlrZWx5KGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxKSkgeworCQkvKiBkaXNhYmxlIGludGVycnVwdHMsIHdpdGhvdXQgdGhlIHN5bmNocm9uaXplX2lycSBiaXQgKi8KIAkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CiAJCUUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCB+MCk7CiAJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKIAl9Ci0JaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpKQorCWlmIChsaWtlbHkobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChuZXRkZXYpKSkgeworCQlhZGFwdGVyLT50b3RhbF90eF9ieXRlcyA9IDA7CisJCWFkYXB0ZXItPnRvdGFsX3R4X3BhY2tldHMgPSAwOworCQlhZGFwdGVyLT50b3RhbF9yeF9ieXRlcyA9IDA7CisJCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgPSAwOwogCQlfX25ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7Ci0JZWxzZQorCX0gZWxzZQorCQkvKiB0aGlzIHJlYWxseSBzaG91bGQgbm90IGhhcHBlbiEgaWYgaXQgZG9lcyBpdCBpcyBiYXNpY2FsbHkgYQorCQkgKiBidWcsIGJ1dCBub3QgYSBoYXJkIGVycm9yLCBzbyBlbmFibGUgaW50cyBhbmQgY29udGludWUgKi8KIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKICNlbHNlCiAJLyogV3JpdGluZyBJTUMgYW5kIElNUyBpcyBuZWVkZWQgZm9yIDgyNTQ3LgpAQCAtMzUxOSwxNiArMzc2NywyMyBAQAogCQlFMTAwMF9XUklURV9SRUcoaHcsIElNQywgfjApOwogCX0KIAorCWFkYXB0ZXItPnRvdGFsX3R4X2J5dGVzID0gMDsKKwlhZGFwdGVyLT50b3RhbF9yeF9ieXRlcyA9IDA7CisJYWRhcHRlci0+dG90YWxfdHhfcGFja2V0cyA9IDA7CisJYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyA9IDA7CisKIAlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTUFYX0lOVFI7IGkrKykKIAkJaWYgKHVubGlrZWx5KCFhZGFwdGVyLT5jbGVhbl9yeChhZGFwdGVyLCBhZGFwdGVyLT5yeF9yaW5nKSAmCiAJCSAgICFlMTAwMF9jbGVhbl90eF9pcnEoYWRhcHRlciwgYWRhcHRlci0+dHhfcmluZykpKQogCQkJYnJlYWs7CiAKKwlpZiAobGlrZWx5KGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMykpCisJCWUxMDAwX3NldF9pdHIoYWRhcHRlcik7CisKIAlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAogI2VuZGlmCi0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTM1NzIsNiArMzgyNyw4IEBACiAJaWYgKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lID09IDApKSB8fAogCSAgICFuZXRpZl9ydW5uaW5nKHBvbGxfZGV2KSkgewogcXVpdF9wb2xsaW5nOgorCQlpZiAobGlrZWx5KGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMykpCisJCQllMTAwMF9zZXRfaXRyKGFkYXB0ZXIpOwogCQluZXRpZl9yeF9jb21wbGV0ZShwb2xsX2Rldik7CiAJCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CiAJCXJldHVybiAwOwpAQCAtMzU5OCw2ICszODU1LDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogI2VuZGlmCiAJYm9vbGVhbl90IGNsZWFuZWQgPSBGQUxTRTsKKwl1bnNpZ25lZCBpbnQgdG90YWxfdHhfYnl0ZXM9MCwgdG90YWxfdHhfcGFja2V0cz0wOwogCiAJaSA9IHR4X3JpbmctPm5leHRfdG9fY2xlYW47CiAJZW9wID0gdHhfcmluZy0+YnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKQEAgLTM2MDksMTMgKzM4NjcsMTkgQEAKIAkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCQkJY2xlYW5lZCA9IChpID09IGVvcCk7CiAKKwkJCWlmIChjbGVhbmVkKSB7CisJCQkJLyogdGhpcyBwYWNrZXQgY291bnQgaXMgd3JvbmcgZm9yIFRTTyBidXQgaGFzIGEKKwkJCQkgKiB0ZW5kZW5jeSB0byBtYWtlIGR5bmFtaWMgSVRSIGNoYW5nZSBtb3JlCisJCQkJICogdG93YXJkcyBidWxrICovCisJCQkJdG90YWxfdHhfcGFja2V0cysrOworCQkJCXRvdGFsX3R4X2J5dGVzICs9IGJ1ZmZlcl9pbmZvLT5za2ItPmxlbjsKKwkJCX0KIAkJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIGJ1ZmZlcl9pbmZvKTsKLQkJCW1lbXNldCh0eF9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpKTsKKwkJCXR4X2Rlc2MtPnVwcGVyLmRhdGEgPSAwOwogCiAJCQlpZiAodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAJCX0KIAotCiAJCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CiAJCWVvcF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgZW9wKTsKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQpAQCAtMzYzNCw4ICszODk4LDEwIEBACiAJCSAqIHNlZXMgdGhlIG5ldyBuZXh0X3RvX2NsZWFuLgogCQkgKi8KIAkJc21wX21iKCk7Ci0JCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpIHsKIAkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwkJCSsrYWRhcHRlci0+cmVzdGFydF9xdWV1ZTsKKwkJfQogCX0KIAogCWlmIChhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZykgewpAQCAtMzY3Myw2ICszOTM5LDggQEAKIAkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJfQogCX0KKwlhZGFwdGVyLT50b3RhbF90eF9ieXRlcyArPSB0b3RhbF90eF9ieXRlczsKKwlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzICs9IHRvdGFsX3R4X3BhY2tldHM7CiAJcmV0dXJuIGNsZWFuZWQ7CiB9CiAKQEAgLTM3NTIsNiArNDAyMCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGNsZWFuZWRfY291bnQgPSAwOwogCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CisJdW5zaWduZWQgaW50IHRvdGFsX3J4X2J5dGVzPTAsIHRvdGFsX3J4X3BhY2tldHM9MDsKIAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuOwogCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDKCpyeF9yaW5nLCBpKTsKQEAgLTM3NjAsNiArNDAyOSw3IEBACiAJd2hpbGUgKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX0REKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCXU4IHN0YXR1czsKKwogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCiAJCWlmICgqd29ya19kb25lID49IHdvcmtfdG9fZG8pCiAJCQlicmVhazsKQEAgLTM4MTcsNiArNDA4NywxMCBAQAogCQkgKiBkb25lIGFmdGVyIHRoZSBUQklfQUNDRVBUIHdvcmthcm91bmQgYWJvdmUgKi8KIAkJbGVuZ3RoIC09IDQ7CiAKKwkJLyogcHJvYmFibHkgYSBsaXR0bGUgc2tld2VkIGR1ZSB0byByZW1vdmluZyBDUkMgKi8KKwkJdG90YWxfcnhfYnl0ZXMgKz0gbGVuZ3RoOworCQl0b3RhbF9yeF9wYWNrZXRzKys7CisKIAkJLyogY29kZSBhZGRlZCBmb3IgY29weWJyZWFrLCB0aGlzIHNob3VsZCBpbXByb3ZlCiAJCSAqIHBlcmZvcm1hbmNlIGZvciBzbWFsbCBwYWNrZXRzIHdpdGggbGFyZ2UgYW1vdW50cwogCQkgKiBvZiByZWFzc2VtYmx5IGJlaW5nIGRvbmUgaW4gdGhlIHN0YWNrICovCkBAIC0zODMyLDEyICs0MTA2LDExIEBACiAJCQkJLyogc2F2ZSB0aGUgc2tiIGluIGJ1ZmZlcl9pbmZvIGFzIGdvb2QgKi8KIAkJCQlidWZmZXJfaW5mby0+c2tiID0gc2tiOwogCQkJCXNrYiA9IG5ld19za2I7Ci0JCQkJc2tiX3B1dChza2IsIGxlbmd0aCk7CiAJCQl9Ci0JCX0gZWxzZQotCQkJc2tiX3B1dChza2IsIGxlbmd0aCk7Ci0KKwkJCS8qIGVsc2UganVzdCBjb250aW51ZSB3aXRoIHRoZSBvbGQgb25lICovCisJCX0KIAkJLyogZW5kIGNvcHlicmVhayBjb2RlICovCisJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCiAJCS8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCAqLwogCQllMTAwMF9yeF9jaGVja3N1bShhZGFwdGVyLApAQCAtMzg4Niw2ICs0MTU5LDggQEAKIAlpZiAoY2xlYW5lZF9jb3VudCkKIAkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOwogCisJYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOworCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzICs9IHRvdGFsX3J4X2J5dGVzOwogCXJldHVybiBjbGVhbmVkOwogfQogCkBAIC0zOTE1LDYgKzQxOTAsNyBAQAogCXVpbnQzMl90IGxlbmd0aCwgc3RhdGVycjsKIAlpbnQgY2xlYW5lZF9jb3VudCA9IDA7CiAJYm9vbGVhbl90IGNsZWFuZWQgPSBGQUxTRTsKKwl1bnNpZ25lZCBpbnQgdG90YWxfcnhfYnl0ZXM9MCwgdG90YWxfcnhfcGFja2V0cz0wOwogCiAJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CiAJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOwpAQCAtMzk5OSw3ICs0Mjc1LDcgQEAKIAkJCWdvdG8gY29weWRvbmU7CiAJCX0gLyogaWYgKi8KIAkJfQotCQkKKwogCQlmb3IgKGogPSAwOyBqIDwgYWRhcHRlci0+cnhfcHNfcGFnZXM7IGorKykgewogCQkJaWYgKCEobGVuZ3RoPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5sZW5ndGhbal0pKSkKIAkJCQlicmVhazsKQEAgLTQwMTksNiArNDI5NSw5IEBACiAJCXBza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7CiAKIGNvcHlkb25lOgorCQl0b3RhbF9yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJdG90YWxfcnhfcGFja2V0cysrOworCiAJCWUxMDAwX3J4X2NoZWNrc3VtKGFkYXB0ZXIsIHN0YXRlcnIsCiAJCQkJICBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5sb3dlci5oaV9kd29yZC5jc3VtX2lwLmNzdW0pLCBza2IpOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwpAQCAtNDA2Nyw2ICs0MzQ2LDggQEAKIAlpZiAoY2xlYW5lZF9jb3VudCkKIAkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOwogCisJYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOworCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzICs9IHRvdGFsX3J4X2J5dGVzOwogCXJldHVybiBjbGVhbmVkOwogfQogCkBAIC00MjM0LDcgKzQ1MTUsNyBAQAogCQl9CiAKIAkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuZXRkZXYsCi0JCQkJICAgICAgIGFkYXB0ZXItPnJ4X3BzX2JzaXplMCArIE5FVF9JUF9BTElHTik7CisJCSAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cnhfcHNfYnNpemUwICsgTkVUX0lQX0FMSUdOKTsKIAogCQlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7CkBAIC00NTExLDcgKzQ3OTIsNiBAQAogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0KIHZvaWQKIGUxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcG9ydCwgdWludDMyX3QgdmFsdWUpCiB7CkBAIC00NTM0LDEyICs0ODE0LDEyIEBACiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmwpOwogCiAJCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JCS8qIGVuYWJsZSBWTEFOIHJlY2VpdmUgZmlsdGVyaW5nICovCi0JCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOwotCQlyY3RsIHw9IEUxMDAwX1JDVExfVkZFOwotCQlyY3RsICY9IH5FMTAwMF9SQ1RMX0NGSUVOOwotCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKLQkJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOworCQkJLyogZW5hYmxlIFZMQU4gcmVjZWl2ZSBmaWx0ZXJpbmcgKi8KKwkJCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1ZGRTsKKwkJCXJjdGwgJj0gfkUxMDAwX1JDVExfQ0ZJRU47CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwkJCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCkBAIC00NTQ4LDE0ICs0ODI4LDE2IEBACiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmwpOwogCiAJCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JCS8qIGRpc2FibGUgVkxBTiBmaWx0ZXJpbmcgKi8KLQkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7Ci0JCXJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOwotCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKLQkJaWYgKGFkYXB0ZXItPm1uZ192bGFuX2lkICE9ICh1aW50MTZfdClFMTAwMF9NTkdfVkxBTl9OT05FKSB7Ci0JCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwgYWRhcHRlci0+bW5nX3ZsYW5faWQpOwotCQkJYWRhcHRlci0+bW5nX3ZsYW5faWQgPSBFMTAwMF9NTkdfVkxBTl9OT05FOwotCQl9CisJCQkvKiBkaXNhYmxlIFZMQU4gZmlsdGVyaW5nICovCisJCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJCXJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7CisJCQlpZiAoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0KKwkJCSAgICAodWludDE2X3QpRTEwMDBfTU5HX1ZMQU5fTk9ORSkgeworCQkJCWUxMDAwX3ZsYW5fcnhfa2lsbF92aWQobmV0ZGV2LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+bW5nX3ZsYW5faWQpOworCQkJCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gRTEwMDBfTU5HX1ZMQU5fTk9ORTsKKwkJCX0KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmgKaW5kZXggYTQ2NGNiMi4uMThhZmMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCkBAIC0xMDcsMTcgKzEwNywxNiBAQAogCiAjZGVmaW5lIEUxMDAwX1dSSVRFX0ZMVVNIKGEpIEUxMDAwX1JFQURfUkVHKGEsIFNUQVRVUykKIAotI2RlZmluZSBFMTAwMF9XUklURV9JQ0g4X1JFRyhhLCByZWcsIHZhbHVlKSAoIFwKKyNkZWZpbmUgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhhLCByZWcsIHZhbHVlKSAoIFwKICAgICB3cml0ZWwoKHZhbHVlKSwgKChhKS0+Zmxhc2hfYWRkcmVzcyArIHJlZykpKQogCi0jZGVmaW5lIEUxMDAwX1JFQURfSUNIOF9SRUcoYSwgcmVnKSAoIFwKKyNkZWZpbmUgRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHKGEsIHJlZykgKCBcCiAgICAgcmVhZGwoKGEpLT5mbGFzaF9hZGRyZXNzICsgcmVnKSkKIAotI2RlZmluZSBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGEsIHJlZywgdmFsdWUpICggXAorI2RlZmluZSBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoYSwgcmVnLCB2YWx1ZSkgKCBcCiAgICAgd3JpdGV3KCh2YWx1ZSksICgoYSktPmZsYXNoX2FkZHJlc3MgKyByZWcpKSkKIAotI2RlZmluZSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoYSwgcmVnKSAoIFwKKyNkZWZpbmUgRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoYSwgcmVnKSAoIFwKICAgICByZWFkdygoYSktPmZsYXNoX2FkZHJlc3MgKyByZWcpKQogCi0KICNlbmRpZiAvKiBfRTEwMDBfT1NERVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCmluZGV4IDljM2MxYWMuLmNiZmNkN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpAQCAtNDQsMTYgKzQ0LDYgQEAKICAqLwogCiAjZGVmaW5lIEUxMDAwX1BBUkFNX0lOSVQgeyBbMCAuLi4gRTEwMDBfTUFYX05JQ10gPSBPUFRJT05fVU5TRVQgfQotLyogTW9kdWxlIFBhcmFtZXRlcnMgYXJlIGFsd2F5cyBpbml0aWFsaXplZCB0byAtMSwgc28gdGhhdCB0aGUgZHJpdmVyCi0gKiBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vIHVzZXIgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZQotICogdXNlciBhc2tpbmcgZm9yIHRoZSBkZWZhdWx0IHZhbHVlLgotICogVGhlIHRydWUgZGVmYXVsdCB2YWx1ZXMgYXJlIGxvYWRlZCBpbiB3aGVuIGUxMDAwX2NoZWNrX29wdGlvbnMgaXMgY2FsbGVkLgotICoKLSAqIFRoaXMgaXMgYSBHQ0MgZXh0ZW5zaW9uIHRvIEFOU0kgQy4KLSAqIFNlZSB0aGUgaXRlbSAiTGFiZWxlZCBFbGVtZW50cyBpbiBJbml0aWFsaXplcnMiIGluIHRoZSBzZWN0aW9uCi0gKiAiRXh0ZW5zaW9ucyB0byB0aGUgQyBMYW5ndWFnZSBGYW1pbHkiIG9mIHRoZSBHQ0MgZG9jdW1lbnRhdGlvbi4KLSAqLwotCiAjZGVmaW5lIEUxMDAwX1BBUkFNKFgsIGRlc2MpIFwKIAlzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgWFtFMTAwMF9NQVhfTklDKzFdID0gRTEwMDBfUEFSQU1fSU5JVDsgXAogCXN0YXRpYyBpbnQgbnVtXyMjWCA9IDA7IFwKQEAgLTY3LDcgKzU3LDYgQEAKICAqCiAgKiBEZWZhdWx0IFZhbHVlOiAyNTYKICAqLwotCiBFMTAwMF9QQVJBTShUeERlc2NyaXB0b3JzLCAiTnVtYmVyIG9mIHRyYW5zbWl0IGRlc2NyaXB0b3JzIik7CiAKIC8qIFJlY2VpdmUgRGVzY3JpcHRvciBDb3VudApAQCAtNzcsNyArNjYsNiBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDI1NgogICovCi0KIEUxMDAwX1BBUkFNKFJ4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyIpOwogCiAvKiBVc2VyIFNwZWNpZmllZCBTcGVlZCBPdmVycmlkZQpAQCAtOTAsNyArNzgsNiBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDAKICAqLwotCiBFMTAwMF9QQVJBTShTcGVlZCwgIlNwZWVkIHNldHRpbmciKTsKIAogLyogVXNlciBTcGVjaWZpZWQgRHVwbGV4IE92ZXJyaWRlCkBAIC0xMDIsNyArODksNiBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDAKICAqLwotCiBFMTAwMF9QQVJBTShEdXBsZXgsICJEdXBsZXggc2V0dGluZyIpOwogCiAvKiBBdXRvLW5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgT3ZlcnJpZGUKQEAgLTExOSw4ICsxMDUsOSBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDB4MkYgKGNvcHBlcik7IDB4MjAgKGZpYmVyKQogICovCi0KIEUxMDAwX1BBUkFNKEF1dG9OZWcsICJBZHZlcnRpc2VkIGF1dG8tbmVnb3RpYXRpb24gc2V0dGluZyIpOworI2RlZmluZSBBVVRPTkVHX0FEVl9ERUZBVUxUICAweDJGCisjZGVmaW5lIEFVVE9ORUdfQURWX01BU0sgICAgIDB4MkYKIAogLyogVXNlciBTcGVjaWZpZWQgRmxvdyBDb250cm9sIE92ZXJyaWRlCiAgKgpAQCAtMTMyLDggKzExOSw4IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogUmVhZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgZnJvbSB0aGUgRUVQUk9NCiAgKi8KLQogRTEwMDBfUEFSQU0oRmxvd0NvbnRyb2wsICJGbG93IENvbnRyb2wgc2V0dGluZyIpOworI2RlZmluZSBGTE9XX0NPTlRST0xfREVGQVVMVCBGTE9XX0NPTlRST0xfRlVMTAogCiAvKiBYc3VtUlggLSBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlL0Rpc2FibGUKICAqCkBAIC0xNDQsNTMgKzEzMSw1NCBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDEKICAqLwotCiBFMTAwMF9QQVJBTShYc3VtUlgsICJEaXNhYmxlIG9yIGVuYWJsZSBSZWNlaXZlIENoZWNrc3VtIG9mZmxvYWQiKTsKIAogLyogVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcworICogIFR4IGludGVycnVwdCBkZWxheSBuZWVkcyB0byB0eXBpY2FsbHkgYmUgc2V0IHRvIHNvbWV0aGluZyBub24gemVybwogICoKICAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1Ci0gKgotICogRGVmYXVsdCBWYWx1ZTogNjQKICAqLwotCiBFMTAwMF9QQVJBTShUeEludERlbGF5LCAiVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5Iik7CisjZGVmaW5lIERFRkFVTFRfVElEViAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9UWERFTEFZICAgICAgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1JTl9UWERFTEFZICAgICAgICAgICAgICAgICAgICAwCiAKIC8qIFRyYW5zbWl0IEFic29sdXRlIEludGVycnVwdCBEZWxheSBpbiB1bml0cyBvZiAxLjAyNCBtaWNyb3NlY29uZHMKICAqCiAgKiBWYWxpZCBSYW5nZTogMC02NTUzNQotICoKLSAqIERlZmF1bHQgVmFsdWU6IDAKICAqLwotCiBFMTAwMF9QQVJBTShUeEFic0ludERlbGF5LCAiVHJhbnNtaXQgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5Iik7CisjZGVmaW5lIERFRkFVTFRfVEFEViAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1BWF9UWEFCU0RFTEFZICAgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1JTl9UWEFCU0RFTEFZICAgICAgICAgICAgICAgICAwCiAKIC8qIFJlY2VpdmUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcworICogICBoYXJkd2FyZSB3aWxsIGxpa2VseSBoYW5nIGlmIHlvdSBzZXQgdGhpcyB0byBhbnl0aGluZyBidXQgemVyby4KICAqCiAgKiBWYWxpZCBSYW5nZTogMC02NTUzNQotICoKLSAqIERlZmF1bHQgVmFsdWU6IDAKICAqLwotCiBFMTAwMF9QQVJBTShSeEludERlbGF5LCAiUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkiKTsKKyNkZWZpbmUgREVGQVVMVF9SRFRSICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX1JYREVMQVkgICAgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUlOX1JYREVMQVkgICAgICAgICAgICAgICAgICAgIDAKIAogLyogUmVjZWl2ZSBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzCiAgKgogICogVmFsaWQgUmFuZ2U6IDAtNjU1MzUKLSAqCi0gKiBEZWZhdWx0IFZhbHVlOiAxMjgKICAqLwotCiBFMTAwMF9QQVJBTShSeEFic0ludERlbGF5LCAiUmVjZWl2ZSBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkiKTsKKyNkZWZpbmUgREVGQVVMVF9SQURWICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTUFYX1JYQUJTREVMQVkgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUlOX1JYQUJTREVMQVkgICAgICAgICAgICAgICAgIDAKIAogLyogSW50ZXJydXB0IFRocm90dGxlIFJhdGUgKGludGVycnVwdHMvc2VjKQogICoKLSAqIFZhbGlkIFJhbmdlOiAxMDAtMTAwMDAwICgwPW9mZiwgMT1keW5hbWljKQotICoKLSAqIERlZmF1bHQgVmFsdWU6IDgwMDAKKyAqIFZhbGlkIFJhbmdlOiAxMDAtMTAwMDAwICgwPW9mZiwgMT1keW5hbWljLCAzPWR5bmFtaWMgY29uc2VydmF0aXZlKQogICovCi0KIEUxMDAwX1BBUkFNKEludGVycnVwdFRocm90dGxlUmF0ZSwgIkludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUiKTsKKyNkZWZpbmUgREVGQVVMVF9JVFIgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX0lUUiAgICAgICAgICAgICAgICAgICAxMDAwMDAKKyNkZWZpbmUgTUlOX0lUUiAgICAgICAgICAgICAgICAgICAgICAxMDAKIAogLyogRW5hYmxlIFNtYXJ0IFBvd2VyIERvd24gb2YgdGhlIFBIWQogICoKQEAgLTE5OCw3ICsxODYsNiBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDAgKGRpc2FibGVkKQogICovCi0KIEUxMDAwX1BBUkFNKFNtYXJ0UG93ZXJEb3duRW5hYmxlLCAiRW5hYmxlIFBIWSBzbWFydCBwb3dlciBkb3duIik7CiAKIC8qIEVuYWJsZSBLdW1lcmFuIExvY2sgTG9zcyB3b3JrYXJvdW5kCkBAIC0yMDcsMzMgKzE5NCw4IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMSAoZW5hYmxlZCkKICAqLwotCiBFMTAwMF9QQVJBTShLdW1lcmFuTG9ja0xvc3MsICJFbmFibGUgS3VtZXJhbiBsb2NrIGxvc3Mgd29ya2Fyb3VuZCIpOwogCi0jZGVmaW5lIEFVVE9ORUdfQURWX0RFRkFVTFQgIDB4MkYKLSNkZWZpbmUgQVVUT05FR19BRFZfTUFTSyAgICAgMHgyRgotI2RlZmluZSBGTE9XX0NPTlRST0xfREVGQVVMVCBGTE9XX0NPTlRST0xfRlVMTAotCi0jZGVmaW5lIERFRkFVTFRfUkRUUiAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1BWF9SWERFTEFZICAgICAgICAgICAgICAgMHhGRkZGCi0jZGVmaW5lIE1JTl9SWERFTEFZICAgICAgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUgREVGQVVMVF9SQURWICAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgTUFYX1JYQUJTREVMQVkgICAgICAgICAgICAweEZGRkYKLSNkZWZpbmUgTUlOX1JYQUJTREVMQVkgICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBERUZBVUxUX1RJRFYgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBNQVhfVFhERUxBWSAgICAgICAgICAgICAgIDB4RkZGRgotI2RlZmluZSBNSU5fVFhERUxBWSAgICAgICAgICAgICAgICAgICAgMAotCi0jZGVmaW5lIERFRkFVTFRfVEFEViAgICAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIE1BWF9UWEFCU0RFTEFZICAgICAgICAgICAgMHhGRkZGCi0jZGVmaW5lIE1JTl9UWEFCU0RFTEFZICAgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUgREVGQVVMVF9JVFIgICAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgTUFYX0lUUiAgICAgICAgICAgICAgICAgICAxMDAwMDAKLSNkZWZpbmUgTUlOX0lUUiAgICAgICAgICAgICAgICAgICAgICAxMDAKLQogc3RydWN0IGUxMDAwX29wdGlvbiB7CiAJZW51bSB7IGVuYWJsZV9vcHRpb24sIHJhbmdlX29wdGlvbiwgbGlzdF9vcHRpb24gfSB0eXBlOwogCWNoYXIgKm5hbWU7CkBAIC01MTAsMTUgKzQ3MiwyNyBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSAxOgogCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBzZXQgdG8gZHluYW1pYyBtb2RlXG4iLAotCQkJCSAgICAgICAgb3B0Lm5hbWUpOworCQkJCQlvcHQubmFtZSk7CisJCQkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBhZGFwdGVyLT5pdHI7CisJCQkJYWRhcHRlci0+aXRyID0gMjAwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJRFBSSU5USyhQUk9CRSwgSU5GTywKKwkJCQkgICAgICAgICIlcyBzZXQgdG8gZHluYW1pYyBjb25zZXJ2YXRpdmUgbW9kZVxuIiwKKwkJCQkJb3B0Lm5hbWUpOworCQkJCWFkYXB0ZXItPml0cl9zZXR0aW5nID0gYWRhcHRlci0+aXRyOworCQkJCWFkYXB0ZXItPml0ciA9IDIwMDAwOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPml0ciwgJm9wdCwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7CisJCQkJICAgICAgICBhZGFwdGVyKTsKKwkJCQkvKiBzYXZlIHRoZSBzZXR0aW5nLCBiZWNhdXNlIHRoZSBkeW5hbWljIGJpdHMgY2hhbmdlIGl0ciAqLworCQkJCWFkYXB0ZXItPml0cl9zZXR0aW5nID0gYWRhcHRlci0+aXRyOwogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewotCQkJYWRhcHRlci0+aXRyID0gb3B0LmRlZjsKKwkJCWFkYXB0ZXItPml0cl9zZXR0aW5nID0gb3B0LmRlZjsKKwkJCWFkYXB0ZXItPml0ciA9IDIwMDAwOwogCQl9CiAJfQogCXsgLyogU21hcnQgUG93ZXIgRG93biAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCmluZGV4IDcyZWY3YmQuLmYxNDNlMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKQEAgLTI2LDYgKzI2LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgImVoZWEuaCIKICNpbmNsdWRlICJlaGVhX3BoeXAuaCIKICNpbmNsdWRlICJlaGVhX3Ftci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCBjNWVkNjM1Li40MzlmNDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTEwLDYgKzExMCw4IEBACiAgKgkwLjU1OiAyMiBNYXIgMjAwNjogQWRkIGZsb3cgY29udHJvbCAocGF1c2UgZnJhbWUpLgogICoJMC41NjogMjIgTWFyIDIwMDY6IEFkZGl0aW9uYWwgZXRodG9vbCBjb25maWcgYW5kIG1vZHVsZXBhcmFtIHN1cHBvcnQuCiAgKgkwLjU3OiAxNCBNYXkgMjAwNjogTWFjIGFkZHJlc3Mgc2V0IGluIHByb2JlL3JlbW92ZSBhbmQgb3JkZXIgY29ycmVjdGlvbnMuCisgKgkwLjU4OiAzMCBPY3QgMjAwNjogQWRkZWQgc3VwcG9ydCBmb3Igc2lkZWJhbmQgbWFuYWdlbWVudCB1bml0LgorICoJMC41OTogMzAgT2N0IDIwMDY6IEFkZGVkIHN1cHBvcnQgZm9yIHJlY292ZXJhYmxlIGVycm9yLgogICoKICAqIEtub3duIGJ1Z3M6CiAgKiBXZSBzdXNwZWN0IHRoYXQgb24gc29tZSBoYXJkd2FyZSBubyBUWCBkb25lIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4KQEAgLTEyNiw3ICsxMjgsNyBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSQogI2VuZGlmCi0jZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC41NyIKKyNkZWZpbmUgRk9SQ0VERVRIX1ZFUlNJT04JCSIwLjU5IgogI2RlZmluZSBEUlZfTkFNRQkJCSJmb3JjZWRldGgiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE3NCwxMSArMTc2LDEyIEBACiAjZGVmaW5lIERFVl9IQVNfUEFVU0VGUkFNRV9UWCAgIDB4MDIwMCAgLyogZGV2aWNlIHN1cHBvcnRzIHR4IHBhdXNlIGZyYW1lcyAqLwogI2RlZmluZSBERVZfSEFTX1NUQVRJU1RJQ1MgICAgICAweDA0MDAgIC8qIGRldmljZSBzdXBwb3J0cyBodyBzdGF0aXN0aWNzICovCiAjZGVmaW5lIERFVl9IQVNfVEVTVF9FWFRFTkRFRCAgIDB4MDgwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGV4dGVuZGVkIGRpYWdub3N0aWMgdGVzdCAqLworI2RlZmluZSBERVZfSEFTX01HTVRfVU5JVCAgICAgICAweDEwMDAgIC8qIGRldmljZSBzdXBwb3J0cyBtYW5hZ2VtZW50IHVuaXQgKi8KIAogZW51bSB7CiAJTnZSZWdJcnFTdGF0dXMgPSAweDAwMCwKICNkZWZpbmUgTlZSRUdfSVJRU1RBVF9NSUlFVkVOVAkweDA0MAotI2RlZmluZSBOVlJFR19JUlFTVEFUX01BU0sJCTB4MWZmCisjZGVmaW5lIE5WUkVHX0lSUVNUQVRfTUFTSwkJMHg4MWZmCiAJTnZSZWdJcnFNYXNrID0gMHgwMDQsCiAjZGVmaW5lIE5WUkVHX0lSUV9SWF9FUlJPUgkJMHgwMDAxCiAjZGVmaW5lIE5WUkVHX0lSUV9SWAkJCTB4MDAwMgpAQCAtMTg5LDE1ICsxOTIsMTYgQEAKICNkZWZpbmUgTlZSRUdfSVJRX0xJTksJCQkweDAwNDAKICNkZWZpbmUgTlZSRUdfSVJRX1JYX0ZPUkNFRAkJMHgwMDgwCiAjZGVmaW5lIE5WUkVHX0lSUV9UWF9GT1JDRUQJCTB4MDEwMAorI2RlZmluZSBOVlJFR19JUlFfUkVDT1ZFUl9FUlJPUgkJMHg4MDAwCiAjZGVmaW5lIE5WUkVHX0lSUU1BU0tfVEhST1VHSFBVVAkweDAwZGYKICNkZWZpbmUgTlZSRUdfSVJRTUFTS19DUFUJCTB4MDA0MAogI2RlZmluZSBOVlJFR19JUlFfVFhfQUxMCQkoTlZSRUdfSVJRX1RYX0VSUnxOVlJFR19JUlFfVFhfT0t8TlZSRUdfSVJRX1RYX0ZPUkNFRCkKICNkZWZpbmUgTlZSRUdfSVJRX1JYX0FMTAkJKE5WUkVHX0lSUV9SWF9FUlJPUnxOVlJFR19JUlFfUlh8TlZSRUdfSVJRX1JYX05PQlVGfE5WUkVHX0lSUV9SWF9GT1JDRUQpCi0jZGVmaW5lIE5WUkVHX0lSUV9PVEhFUgkJCShOVlJFR19JUlFfVElNRVJ8TlZSRUdfSVJRX0xJTkspCisjZGVmaW5lIE5WUkVHX0lSUV9PVEhFUgkJCShOVlJFR19JUlFfVElNRVJ8TlZSRUdfSVJRX0xJTkt8TlZSRUdfSVJRX1JFQ09WRVJfRVJST1IpCiAKICNkZWZpbmUgTlZSRUdfSVJRX1VOS05PV04JKH4oTlZSRUdfSVJRX1JYX0VSUk9SfE5WUkVHX0lSUV9SWHxOVlJFR19JUlFfUlhfTk9CVUZ8TlZSRUdfSVJRX1RYX0VSUnwgXAogCQkJCQlOVlJFR19JUlFfVFhfT0t8TlZSRUdfSVJRX1RJTUVSfE5WUkVHX0lSUV9MSU5LfE5WUkVHX0lSUV9SWF9GT1JDRUR8IFwKLQkJCQkJTlZSRUdfSVJRX1RYX0ZPUkNFRCkpCisJCQkJCU5WUkVHX0lSUV9UWF9GT1JDRUR8TlZSRUdfSVJRX1JFQ09WRVJfRVJST1IpKQogCiAJTnZSZWdVbmtub3duU2V0dXBSZWc2ID0gMHgwMDgsCiAjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNl9WQUwJCTMKQEAgLTIyMiw2ICsyMjYsMTUgQEAKICNkZWZpbmUgTlZSRUdfTUFDX1JFU0VUX0FTU0VSVAkweDBGMwogCU52UmVnVHJhbnNtaXR0ZXJDb250cm9sID0gMHgwODQsCiAjZGVmaW5lIE5WUkVHX1hNSVRDVExfU1RBUlQJMHgwMQorI2RlZmluZSBOVlJFR19YTUlUQ1RMX01HTVRfU1QJMHg0MDAwMDAwMAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NZTkNfTUFTSwkJMHgwMDBmMDAwMAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NZTkNfTk9UX1JFQURZCTB4MAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NZTkNfUEhZX0lOSVQJMHgwMDA0MDAwMAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX01HTVRfU0VNQV9NQVNLCTB4MDAwMDBmMDAKKyNkZWZpbmUgTlZSRUdfWE1JVENUTF9NR01UX1NFTUFfRlJFRQkweDAKKyNkZWZpbmUgTlZSRUdfWE1JVENUTF9IT1NUX1NFTUFfTUFTSwkweDAwMDBmMDAwCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfSE9TVF9TRU1BX0FDUQkweDAwMDBmMDAwCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfSE9TVF9MT0FERUQJMHgwMDAwNDAwMAogCU52UmVnVHJhbnNtaXR0ZXJTdGF0dXMgPSAweDA4OCwKICNkZWZpbmUgTlZSRUdfWE1JVFNUQVRfQlVTWQkweDAxCiAKQEAgLTMwNCw4ICszMTcsOCBAQAogI2RlZmluZSBOVlJFR19NSUlTVEFUX0xJTktDSEFOR0UJMHgwMDA4CiAjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSwkJMHgwMDBmCiAjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSzIJCTB4MDAwZgotCU52UmVnVW5rbm93blNldHVwUmVnNCA9IDB4MTg0LAotI2RlZmluZSBOVlJFR19VTktTRVRVUDRfVkFMCTgKKwlOdlJlZ01JSU1hc2sgPSAweDE4NCwKKyNkZWZpbmUgTlZSRUdfTUlJX0xJTktDSEFOR0UJCTB4MDAwOAogCiAJTnZSZWdBZGFwdGVyQ29udHJvbCA9IDB4MTg4LAogI2RlZmluZSBOVlJFR19BREFQVENUTF9TVEFSVAkweDAyCkBAIC03MDcsNiArNzIwLDcgQEAKIAl1bnNpZ25lZCBpbnQgcGh5X21vZGVsOwogCXUxNiBnaWdhYml0OwogCWludCBpbnRyX3Rlc3Q7CisJaW50IHJlY292ZXJfZXJyb3I7CiAKIAkvKiBHZW5lcmFsIGRhdGE6IFJPIGZpZWxkcyAqLwogCWRtYV9hZGRyX3QgcmluZ19hZGRyOwpAQCAtNzE5LDYgKzczMyw3IEBACiAJdTMyIGRyaXZlcl9kYXRhOwogCXUzMiByZWdpc3Rlcl9zaXplOwogCWludCByeF9jc3VtOworCXUzMiBtYWNfaW5fdXNlOwogCiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCkBAIC0yNDQzLDYgKzI0NTgsMjMgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggdW5rbm93biBldmVudHMgMHgleC4gUGxlYXNlIHJlcG9ydFxuIiwKIAkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKIAkJfQorCQlpZiAodW5saWtlbHkoZXZlbnRzICYgTlZSRUdfSVJRX1JFQ09WRVJfRVJST1IpKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljICovCisJCQlpZiAoIShucC0+bXNpX2ZsYWdzICYgTlZfTVNJX1hfRU5BQkxFRCkpCisJCQkJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCQkJZWxzZQorCQkJCXdyaXRlbChucC0+aXJxbWFzaywgYmFzZSArIE52UmVnSXJxTWFzayk7CisJCQlwY2lfcHVzaChiYXNlKTsKKworCQkJaWYgKCFucC0+aW5fc2h1dGRvd24pIHsKKwkJCQlucC0+bmljX3BvbGxfaXJxID0gbnAtPmlycW1hc2s7CisJCQkJbnAtPnJlY292ZXJfZXJyb3IgPSAxOworCQkJCW1vZF90aW1lcigmbnAtPm5pY19wb2xsLCBqaWZmaWVzICsgUE9MTF9XQUlUKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQlicmVhazsKKwkJfQogI2lmZGVmIENPTkZJR19GT1JDRURFVEhfTkFQSQogCQlpZiAoZXZlbnRzICYgTlZSRUdfSVJRX1JYX0FMTCkgewogCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKQEAgLTI2NzMsNiArMjcwNSwyMCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJCW5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOwogCQl9CisJCWlmIChldmVudHMgJiBOVlJFR19JUlFfUkVDT1ZFUl9FUlJPUikgeworCQkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KKwkJCXdyaXRlbChOVlJFR19JUlFfT1RIRVIsIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCQkJcGNpX3B1c2goYmFzZSk7CisKKwkJCWlmICghbnAtPmluX3NodXRkb3duKSB7CisJCQkJbnAtPm5pY19wb2xsX2lycSB8PSBOVlJFR19JUlFfT1RIRVI7CisJCQkJbnAtPnJlY292ZXJfZXJyb3IgPSAxOworCQkJCW1vZF90aW1lcigmbnAtPm5pY19wb2xsLCBqaWZmaWVzICsgUE9MTF9XQUlUKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQkJYnJlYWs7CisJCX0KIAkJaWYgKGV2ZW50cyAmIChOVlJFR19JUlFfVU5LTk9XTikpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggdW5rbm93biBldmVudHMgMHgleC4gUGxlYXNlIHJlcG9ydFxuIiwKIAkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKQEAgLTI5MDIsNiArMjk0OCw0MiBAQAogCX0KIAlucC0+bmljX3BvbGxfaXJxID0gMDsKIAorCWlmIChucC0+cmVjb3Zlcl9lcnJvcikgeworCQlucC0+cmVjb3Zlcl9lcnJvciA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aDogTUFDIGluIHJlY292ZXJhYmxlIGVycm9yIHN0YXRlXG4iKTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJbmV0aWZfdHhfbG9ja19iaChkZXYpOworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQkvKiBzdG9wIGVuZ2luZXMgKi8KKwkJCW52X3N0b3BfcngoZGV2KTsKKwkJCW52X3N0b3BfdHgoZGV2KTsKKwkJCW52X3R4cnhfcmVzZXQoZGV2KTsKKwkJCS8qIGRyYWluIHJ4IHF1ZXVlICovCisJCQludl9kcmFpbl9yeChkZXYpOworCQkJbnZfZHJhaW5fdHgoZGV2KTsKKwkJCS8qIHJlaW5pdCBkcml2ZXIgdmlldyBvZiB0aGUgcnggcXVldWUgKi8KKwkJCXNldF9idWZzaXplKGRldik7CisJCQlpZiAobnZfaW5pdF9yaW5nKGRldikpIHsKKwkJCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKKwkJCQkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKKwkJCX0KKwkJCS8qIHJlaW5pdCBuaWMgdmlldyBvZiB0aGUgcnggcXVldWUgKi8KKwkJCXdyaXRlbChucC0+cnhfYnVmX3N6LCBiYXNlICsgTnZSZWdPZmZsb2FkQ29uZmlnKTsKKwkJCXNldHVwX2h3X3JpbmdzKGRldiwgTlZfU0VUVVBfUlhfUklORyB8IE5WX1NFVFVQX1RYX1JJTkcpOworCQkJd3JpdGVsKCAoKG5wLT5yeF9yaW5nX3NpemUtMSkgPDwgTlZSRUdfUklOR1NaX1JYU0hJRlQpICsgKChucC0+dHhfcmluZ19zaXplLTEpIDw8IE5WUkVHX1JJTkdTWl9UWFNISUZUKSwKKwkJCQliYXNlICsgTnZSZWdSaW5nU2l6ZXMpOworCQkJcGNpX3B1c2goYmFzZSk7CisJCQl3cml0ZWwoTlZSRUdfVFhSWENUTF9LSUNLfG5wLT50eHJ4Y3RsX2JpdHMsIGdldF9od2Jhc2UoZGV2KSArIE52UmVnVHhSeENvbnRyb2wpOworCQkJcGNpX3B1c2goYmFzZSk7CisKKwkJCS8qIHJlc3RhcnQgcnggZW5naW5lICovCisJCQludl9zdGFydF9yeChkZXYpOworCQkJbnZfc3RhcnRfdHgoZGV2KTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKKwkJfQorCX0KKwogCS8qIEZJWE1FOiBEbyB3ZSBuZWVkIHN5bmNocm9uaXplX2lycShkZXYtPmlycSkgaGVyZT8gKi8KIAogCXdyaXRlbChtYXNrLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKQEAgLTQwMzAsNiArNDExMiw1NCBAQAogCS8qIG5vdGhpbmcgdG8gZG8gKi8KIH07CiAKKy8qIFRoZSBtZ210IHVuaXQgYW5kIGRyaXZlciB1c2UgYSBzZW1hcGhvcmUgdG8gYWNjZXNzIHRoZSBwaHkgZHVyaW5nIGluaXQgKi8KK3N0YXRpYyBpbnQgbnZfbWdtdF9hY3F1aXJlX3NlbWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCWludCBpOworCXUzMiB0eF9jdHJsLCBtZ210X3NlbWE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQltZ210X3NlbWEgPSByZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpICYgTlZSRUdfWE1JVENUTF9NR01UX1NFTUFfTUFTSzsKKwkJaWYgKG1nbXRfc2VtYSA9PSBOVlJFR19YTUlUQ1RMX01HTVRfU0VNQV9GUkVFKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1MDApOworCX0KKworCWlmIChtZ210X3NlbWEgIT0gTlZSRUdfWE1JVENUTF9NR01UX1NFTUFfRlJFRSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXR4X2N0cmwgPSByZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpOworCQl0eF9jdHJsIHw9IE5WUkVHX1hNSVRDVExfSE9TVF9TRU1BX0FDUTsKKwkJd3JpdGVsKHR4X2N0cmwsIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCk7CisKKwkJLyogdmVyaWZ5IHRoYXQgc2VtYXBob3JlIHdhcyBhY3F1aXJlZCAqLworCQl0eF9jdHJsID0gcmVhZGwoYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKTsKKwkJaWYgKCgodHhfY3RybCAmIE5WUkVHX1hNSVRDVExfSE9TVF9TRU1BX01BU0spID09IE5WUkVHX1hNSVRDVExfSE9TVF9TRU1BX0FDUSkgJiYKKwkJICAgICgodHhfY3RybCAmIE5WUkVHX1hNSVRDVExfTUdNVF9TRU1BX01BU0spID09IE5WUkVHX1hNSVRDVExfTUdNVF9TRU1BX0ZSRUUpKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXVkZWxheSg1MCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEluZGljYXRlIHRvIG1nbXQgdW5pdCB3aGV0aGVyIGRyaXZlciBpcyBsb2FkZWQgb3Igbm90ICovCitzdGF0aWMgdm9pZCBudl9tZ210X2RyaXZlcl9sb2FkZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxvYWRlZCkKK3sKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCXUzMiB0eF9jdHJsOworCisJdHhfY3RybCA9IHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCk7CisJaWYgKGxvYWRlZCkKKwkJdHhfY3RybCB8PSBOVlJFR19YTUlUQ1RMX0hPU1RfTE9BREVEOworCWVsc2UKKwkJdHhfY3RybCAmPSB+TlZSRUdfWE1JVENUTF9IT1NUX0xPQURFRDsKKwl3cml0ZWwodHhfY3RybCwgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKTsKK30KKwogc3RhdGljIGludCBudl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTQwODUsNyArNDIxNSw3IEBACiAJCQlOVl9TRVRVUDVfREVMQVksIE5WX1NFVFVQNV9ERUxBWU1BWCwKIAkJCUtFUk5fSU5GTyAib3BlbjogU2V0dXBSZWc1LCBCaXQgMzEgcmVtYWluZWQgb2ZmXG4iKTsKIAotCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWc0KTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTUlJTWFzayk7CiAJd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKIAl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLMiwgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKIApAQCAtNDExMSw3ICs0MjQxLDcgQEAKIAl3cml0ZWwoKG5wLT5waHlhZGRyIDw8IE5WUkVHX0FEQVBUQ1RMX1BIWVNISUZUKXxOVlJFR19BREFQVENUTF9QSFlWQUxJRHxOVlJFR19BREFQVENUTF9SVU5OSU5HLAogCQkJYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOwogCXdyaXRlbChOVlJFR19NSUlTUEVFRF9CSVQ4fE5WUkVHX01JSURFTEFZLCBiYXNlICsgTnZSZWdNSUlTcGVlZCk7Ci0Jd3JpdGVsKE5WUkVHX1VOS1NFVFVQNF9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzQpOworCXdyaXRlbChOVlJFR19NSUlfTElOS0NIQU5HRSwgYmFzZSArIE52UmVnTUlJTWFzayk7CiAJaWYgKG5wLT53b2xlbmFibGVkKQogCQl3cml0ZWwoTlZSRUdfV0FLRVVQRkxBR1NfRU5BQkxFICwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOwogCkBAIC00MjMwLDYgKzQzNjAsOCBAQAogCXU4IF9faW9tZW0gKmJhc2U7CiAJaW50IGVyciwgaTsKIAl1MzIgcG93ZXJzdGF0ZSwgdHhyZWc7CisJdTMyIHBoeXN0YXRlX29yaWcgPSAwLCBwaHlzdGF0ZTsKKwlpbnQgcGh5aW5pdGlhbGl6ZWQgPSAwOwogCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBmZV9wcml2KSk7CiAJZXJyID0gLUVOT01FTTsKQEAgLTQ1MTQsNiArNDY0Niw0OCBAQAogCQlucC0+bmVlZF9saW5rdGltZXIgPSAwOwogCX0KIAorCS8qIGNsZWFyIHBoeSBzdGF0ZSBhbmQgdGVtcG9yYXJpbHkgaGFsdCBwaHkgaW50ZXJydXB0cyAqLworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNSUlNYXNrKTsKKwlwaHlzdGF0ZSA9IHJlYWRsKGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKwlpZiAocGh5c3RhdGUgJiBOVlJFR19BREFQVENUTF9SVU5OSU5HKSB7CisJCXBoeXN0YXRlX29yaWcgPSAxOworCQlwaHlzdGF0ZSAmPSB+TlZSRUdfQURBUFRDVExfUlVOTklORzsKKwkJd3JpdGVsKHBoeXN0YXRlLCBiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJfQorCXdyaXRlbChOVlJFR19NSUlTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisKKwlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX0hBU19NR01UX1VOSVQpIHsKKwkJd3JpdGVsKDB4MSwgYmFzZSArIDB4MjA0KTsgcGNpX3B1c2goYmFzZSk7CisJCW1zbGVlcCg1MDApOworCQkvKiBtYW5hZ2VtZW50IHVuaXQgcnVubmluZyBvbiB0aGUgbWFjPyAqLworCQlucC0+bWFjX2luX3VzZSA9IHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCkgJiBOVlJFR19YTUlUQ1RMX01HTVRfU1Q7CisJCWlmIChucC0+bWFjX2luX3VzZSkgeworCQkJdTMyIG1nbXRfc3luYzsKKwkJCS8qIG1hbmFnZW1lbnQgdW5pdCBzZXR1cCB0aGUgcGh5IGFscmVhZHk/ICovCisJCQltZ210X3N5bmMgPSByZWFkbChiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpICYgTlZSRUdfWE1JVENUTF9TWU5DX01BU0s7CisJCQlpZiAobWdtdF9zeW5jID09IE5WUkVHX1hNSVRDVExfU1lOQ19OT1RfUkVBRFkpIHsKKwkJCQlpZiAoIW52X21nbXRfYWNxdWlyZV9zZW1hKGRldikpIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IDUwMDA7IGkrKykgeworCQkJCQkJbXNsZWVwKDEpOworCQkJCQkJbWdtdF9zeW5jID0gcmVhZGwoYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKSAmIE5WUkVHX1hNSVRDVExfU1lOQ19NQVNLOworCQkJCQkJaWYgKG1nbXRfc3luYyA9PSBOVlJFR19YTUlUQ1RMX1NZTkNfTk9UX1JFQURZKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJaWYgKG1nbXRfc3luYyA9PSBOVlJFR19YTUlUQ1RMX1NZTkNfUEhZX0lOSVQpCisJCQkJCQkJcGh5aW5pdGlhbGl6ZWQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3ZSBuZWVkIHRvIGluaXQgdGhlIHBoeSAqLworCQkJCX0KKwkJCX0gZWxzZSBpZiAobWdtdF9zeW5jID09IE5WUkVHX1hNSVRDVExfU1lOQ19QSFlfSU5JVCkgeworCQkJCS8qIHBoeSBpcyBpbml0ZWQgYnkgU01VICovCisJCQkJcGh5aW5pdGlhbGl6ZWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiB3ZSBuZWVkIHRvIGluaXQgdGhlIHBoeSAqLworCQkJfQorCQl9CisJfQorCiAJLyogZmluZCBhIHN1aXRhYmxlIHBoeSAqLwogCWZvciAoaSA9IDE7IGkgPD0gMzI7IGkrKykgewogCQlpbnQgaWQxLCBpZDI7CkBAIC00NTQ1LDggKzQ3MTksMTQgQEAKIAkJZ290byBvdXRfZXJyb3I7CiAJfQogCi0JLyogcmVzZXQgaXQgKi8KLQlwaHlfaW5pdChkZXYpOworCWlmICghcGh5aW5pdGlhbGl6ZWQpIHsKKwkJLyogcmVzZXQgaXQgKi8KKwkJcGh5X2luaXQoZGV2KTsKKwl9CisKKwlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX0hBU19NR01UX1VOSVQpIHsKKwkJbnZfbWdtdF9kcml2ZXJfbG9hZGVkKGRldiwgMSk7CisJfQogCiAJLyogc2V0IGRlZmF1bHQgbGluayBzcGVlZCBzZXR0aW5ncyAqLwogCW5wLT5saW5rc3BlZWQgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwOwpAQCAtNDU2NSw2ICs0NzQ1LDEwIEBACiAJcmV0dXJuIDA7CiAKIG91dF9lcnJvcjoKKwlpZiAocGh5c3RhdGVfb3JpZykKKwkJd3JpdGVsKHBoeXN0YXRlfE5WUkVHX0FEQVBUQ1RMX1JVTk5JTkcsIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKwlpZiAobnAtPm1hY19pbl91c2UpCisJCW52X21nbXRfZHJpdmVyX2xvYWRlZChkZXYsIDApOwogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKIG91dF9mcmVlcmluZzoKIAlmcmVlX3JpbmdzKGRldik7CkBAIC00NTk0LDYgKzQ3NzgsOSBAQAogCXdyaXRlbChucC0+b3JpZ19tYWNbMF0sIGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKIAl3cml0ZWwobnAtPm9yaWdfbWFjWzFdLCBiYXNlICsgTnZSZWdNYWNBZGRyQik7CiAKKwlpZiAobnAtPm1hY19pbl91c2UpCisJCW52X21nbXRfZHJpdmVyX2xvYWRlZChkZXYsIDApOworCiAJLyogZnJlZSBhbGwgc3RydWN0dXJlcyAqLwogCWZyZWVfcmluZ3MoZGV2KTsKIAlpb3VubWFwKGdldF9od2Jhc2UoZGV2KSk7CkBAIC00NjAzLDYgKzQ3OTAsNTAgQEAKIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbnZfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIG91dDsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCS8vIEdyb3NzLgorCW52X2Nsb3NlKGRldik7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIG5wLT53b2xlbmFibGVkKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCWdvdG8gb3V0OworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDAsIDApOworCisJcmMgPSBudl9vcGVuKGRldik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgbnZfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG52X3Jlc3VtZSBOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7CiAJewkvKiBuRm9yY2UgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMSksCkBAIC00NjU4LDQzICs0ODg5LDU5IEBACiAJfSwKIAl7CS8qIE1DUDU1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE0KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1ZMQU58REVWX0hBU19NU0l8REVWX0hBU19NU0lfWHxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfVkxBTnxERVZfSEFTX01TSXxERVZfSEFTX01TSV9YfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCiAJfSwKIAl7CS8qIE1DUDU1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE1KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1ZMQU58REVWX0hBU19NU0l8REVWX0hBU19NU0lfWHxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfVkxBTnxERVZfSEFTX01TSXxERVZfSEFTX01TSV9YfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE2KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTcpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2MSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xOCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE5KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjApLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjEpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjIpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjMpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwl9LAorCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjQpLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCX0sCisJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNSksCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJfSwKKwl7CS8qIE1DUDY3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzI2KSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwl9LAorCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjcpLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJezAsfSwKIH07CkBAIC00NzA0LDkgKzQ5NTEsMTAgQEAKIAkuaWRfdGFibGUgPSBwY2lfdGJsLAogCS5wcm9iZSA9IG52X3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChudl9yZW1vdmUpLAorCS5zdXNwZW5kID0gbnZfc3VzcGVuZCwKKwkucmVzdW1lCT0gbnZfcmVzdW1lLAogfTsKIAotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X25pYyh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aC5jOiBSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIGV0aGVybmV0IGRyaXZlci4gVmVyc2lvbiAlcy5cbiIsIEZPUkNFREVUSF9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IGNiMzk1ODcuLjg4OWQzYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwpAQCAtNzc5LDcgKzc3OSw4IEBACiAJZmVwLT5vbGRzcGVlZCA9IDA7CiAJZmVwLT5vbGRkdXBsZXggPSAtMTsKIAlpZihmZXAtPmZwaS0+YnVzX2lkKQotCQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIGZlcC0+ZnBpLT5idXNfaWQsICZmc19hZGp1c3RfbGluaywgMCk7CisJCXBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgZmVwLT5mcGktPmJ1c19pZCwgJmZzX2FkanVzdF9saW5rLCAwLAorCQkJCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkpOwogCWVsc2UgewogCQlwcmludGsoIk5vIHBoeSBidXMgSUQgc3BlY2lmaWVkIGluIEJTUCBjb2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKaW5kZXggYTA2ZDhkMS4uYmFhMzUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpAQCAtOSw3ICs5LDcgQEAKICAqIEF1dGhvcjogQW5keSBGbGVtaW5nCiAgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTEzMyw2ICsxMzMsOSBAQAogI2lmZGVmIENPTkZJR19HRkFSX05BUEkKIHN0YXRpYyBpbnQgZ2Zhcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBnZmFyX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKIGludCBnZmFyX2NsZWFuX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJ4X3dvcmtfbGltaXQpOwogc3RhdGljIGludCBnZmFyX3Byb2Nlc3NfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbmd0aCk7CiBzdGF0aWMgdm9pZCBnZmFyX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKQEAgLTI2MCw2ICsyNjMsOSBAQAogCWRldi0+cG9sbCA9IGdmYXJfcG9sbDsKIAlkZXYtPndlaWdodCA9IEdGQVJfREVWX1dFSUdIVDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBnZmFyX25ldHBvbGw7CisjZW5kaWYKIAlkZXYtPnN0b3AgPSBnZmFyX2Nsb3NlOwogCWRldi0+Z2V0X3N0YXRzID0gZ2Zhcl9nZXRfc3RhdHM7CiAJZGV2LT5jaGFuZ2VfbXR1ID0gZ2Zhcl9jaGFuZ2VfbXR1OwpAQCAtMzkyLDYgKzM5OCwzOCBAQAogfQogCiAKKy8qIFJlYWRzIHRoZSBjb250cm9sbGVyJ3MgcmVnaXN0ZXJzIHRvIGRldGVybWluZSB3aGF0IGludGVyZmFjZQorICogY29ubmVjdHMgaXQgdG8gdGhlIFBIWS4KKyAqLworc3RhdGljIHBoeV9pbnRlcmZhY2VfdCBnZmFyX2dldF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgZWNudHJsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5lY250cmwpOworCisJaWYgKGVjbnRybCAmIEVDTlRSTF9TR01JSV9NT0RFKQorCQlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJOworCisJaWYgKGVjbnRybCAmIEVDTlRSTF9UQklfTU9ERSkgeworCQlpZiAoZWNudHJsICYgRUNOVFJMX1JFRFVDRURfTU9ERSkKKwkJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfUlRCSTsKKwkJZWxzZQorCQkJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9UQkk7CisJfQorCisJaWYgKGVjbnRybCAmIEVDTlRSTF9SRURVQ0VEX01PREUpIHsKKwkJaWYgKGVjbnRybCAmIEVDTlRSTF9SRURVQ0VEX01JSV9NT0RFKQorCQkJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOworCQllbHNlCisJCQlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOworCX0KKworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19HSUdBQklUKQorCQlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUk7CisKKwlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX01JSTsKK30KKworCiAvKiBJbml0aWFsaXplcyBkcml2ZXIncyBQSFkgc3RhdGUsIGFuZCBhdHRhY2hlcyB0byB0aGUgUEhZLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KQEAgLTQwMyw2ICs0NDEsNyBAQAogCQlTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgOiAwOwogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJY2hhciBwaHlfaWRbQlVTX0lEX1NJWkVdOworCXBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2U7CiAKIAlwcml2LT5vbGRsaW5rID0gMDsKIAlwcml2LT5vbGRzcGVlZCA9IDA7CkBAIC00MTAsNyArNDQ5LDkgQEAKIAogCXNucHJpbnRmKHBoeV9pZCwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIHByaXYtPmVpbmZvLT5idXNfaWQsIHByaXYtPmVpbmZvLT5waHlfaWQpOwogCi0JcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlfaWQsICZhZGp1c3RfbGluaywgMCk7CisJaW50ZXJmYWNlID0gZ2Zhcl9nZXRfaW50ZXJmYWNlKGRldik7CisKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeV9pZCwgJmFkanVzdF9saW5rLCAwLCBpbnRlcmZhY2UpOwogCiAJaWYgKElTX0VSUihwaHlkZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iLCBkZXYtPm5hbWUpOwpAQCAtMTUzNiw2ICsxNTc3LDMzIEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGdmYXJfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogSWYgdGhlIGRldmljZSBoYXMgbXVsdGlwbGUgaW50ZXJydXB0cywgcnVuIHR4L3J4ICovCisJaWYgKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX01VTFRJX0lOVFIpIHsKKwkJZGlzYWJsZV9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQpOworCQlkaXNhYmxlX2lycShwcml2LT5pbnRlcnJ1cHRSZWNlaXZlKTsKKwkJZGlzYWJsZV9pcnEocHJpdi0+aW50ZXJydXB0RXJyb3IpOworCQlnZmFyX2ludGVycnVwdChwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCwgZGV2KTsKKwkJZW5hYmxlX2lycShwcml2LT5pbnRlcnJ1cHRFcnJvcik7CisJCWVuYWJsZV9pcnEocHJpdi0+aW50ZXJydXB0UmVjZWl2ZSk7CisJCWVuYWJsZV9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQpOworCX0gZWxzZSB7CisJCWRpc2FibGVfaXJxKHByaXYtPmludGVycnVwdFRyYW5zbWl0KTsKKwkJZ2Zhcl9pbnRlcnJ1cHQocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGRldik7CisJCWVuYWJsZV9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQpOworCX0KK30KKyNlbmRpZgorCiAvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGRldmljZXMgd2l0aCBvbmUgaW50ZXJydXB0ICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCmluZGV4IDllODFhNTAuLjM5ZTllMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKQEAgLTE2MCw3ICsxNjAsMTAgQEAKIAogI2RlZmluZSBFQ05UUkxfSU5JVF9TRVRUSU5HUwkweDAwMDAxMDAwCiAjZGVmaW5lIEVDTlRSTF9UQklfTU9ERSAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUNOVFJMX1JFRFVDRURfTU9ERQkweDAwMDAwMDEwCiAjZGVmaW5lIEVDTlRSTF9SMTAwCQkweDAwMDAwMDA4CisjZGVmaW5lIEVDTlRSTF9SRURVQ0VEX01JSV9NT0RFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRUNOVFJMX1NHTUlJX01PREUJMHgwMDAwMDAwMgogCiAjZGVmaW5lIE1SQkxSX0lOSVRfU0VUVElOR1MJREVGQVVMVF9SWF9CVUZGRVJfU0laRQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwppbmRleCA4NmIzYmI5Li45MjQyMGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKQEAgLTkxNCw3ICs5MTQsNyBAQAogCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiNnBhY2s6IHByb3RvY29sIHZpb2xhdGlvblxuIik7CiAJCQkJZWxzZQogCQkJCQlzcC0+c3RhdHVzID0gMDsKLQkJCQljbWQgJj0gIVNJWFBfUlhfRENEX01BU0s7CisJCQkJY21kICY9IH5TSVhQX1JYX0RDRF9NQVNLOwogCQl9CiAJCXNwLT5zdGF0dXMgPSBjbWQgJiBTSVhQX1BSSU9fREFUQV9NQVNLOwogCX0gZWxzZSB7IC8qIG91dHB1dCB3YXRjaGRvZyBjaGFyIGlmIGlkbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5ZHJhLmMgYi9kcml2ZXJzL25ldC9oeWRyYS5jCmluZGV4IDkxMzI2ZWEuLmY5NzBiZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2h5ZHJhLmMKKysrIGIvZHJpdmVycy9uZXQvaHlkcmEuYwpAQCAtMzEsNyArMzEsMTYgQEAKICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CiAKLSNpbmNsdWRlICI4MzkwLmgiCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKyNkZWZpbmUgZWlfaW5iKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBlaV9vdXRiKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCisjZGVmaW5lIGVpX2luYl9wKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBlaV9vdXRiX3AodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKyAgICAiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgImxpYjgzOTAuYyIKIAogI2RlZmluZSBORV9FTjBfRENGRyAgICAgKDB4MGUqMikKIApAQCAtMTAwLDcgKzEwOSw3IEBACiAJMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxYSwgMHgxYywgMHgxZSwKICAgICB9OwogCi0gICAgZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisgICAgZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldigwKTsKICAgICBpZiAoIWRldikKIAlyZXR1cm4gLUVOT01FTTsKICAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CkBAIC0xMTcsNyArMTI2LDcgQEAKICAgICBkZXYtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKIAogICAgIC8qIEluc3RhbGwgdGhlIEludGVycnVwdCBoYW5kbGVyICovCi0gICAgaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZWlfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgIkh5ZHJhIEV0aGVybmV0IiwKKyAgICBpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBfX2VpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJIeWRyYSBFdGhlcm5ldCIsCiAJCSAgICBkZXYpKSB7CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gLUVBR0FJTjsKQEAgLTEzOSwxMCArMTQ4LDEwIEBACiAgICAgZGV2LT5vcGVuID0gJmh5ZHJhX29wZW47CiAgICAgZGV2LT5zdG9wID0gJmh5ZHJhX2Nsb3NlOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0gICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gX19laV9wb2xsOwogI2VuZGlmCiAKLSAgICBOUzgzOTBfaW5pdChkZXYsIDApOworICAgIF9fTlM4MzkwX2luaXQoZGV2LCAwKTsKIAogICAgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogICAgIGlmIChlcnIpIHsKQEAgLTE2NCw3ICsxNzMsNyBAQAogCiBzdGF0aWMgaW50IGh5ZHJhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBlaV9vcGVuKGRldik7CisgICAgX19laV9vcGVuKGRldik7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE3Miw3ICsxODEsNyBAQAogewogICAgIGlmIChlaV9kZWJ1ZyA+IDEpCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7Ci0gICAgZWlfY2xvc2UoZGV2KTsKKyAgICBfX2VpX2Nsb3NlKGRldik7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmgKaW5kZXggZjczZjEwYS4uNDA3ZDJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmgKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KIAogLyoKICAqIFRoZXNlIE1BTCAidmVyc2lvbnMiIHByb2JhYmx5IGFyZW4ndCB0aGUgcmVhbCB2ZXJzaW9ucyBJQk0gdXNlcyBmb3IgdGhlc2UgCkBAIC0xOTEsNiArMTkyLDcgQEAKIAogc3RydWN0IGlibV9vY3BfbWFsIHsKIAlpbnQJCQlkY3JiYXNlOworCWRjcl9ob3N0X3QJCWRjcmhvc3Q7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXBvbGxfbGlzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZQlwb2xsX2RldjsKQEAgLTIwNywxMiArMjA5LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdldF9tYWxfZGNybihzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCwgaW50IHJlZykKIHsKLQlyZXR1cm4gbWZkY3IobWFsLT5kY3JiYXNlICsgcmVnKTsKKwlyZXR1cm4gZGNyX3JlYWQobWFsLT5kY3Job3N0LCBtYWwtPmRjcmJhc2UgKyByZWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21hbF9kY3JuKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCBpbnQgcmVnLCB1MzIgdmFsKQogewotCW10ZGNyKG1hbC0+ZGNyYmFzZSArIHJlZywgdmFsKTsKKwlkY3Jfd3JpdGUobWFsLT5kY3Job3N0LCBtYWwtPmRjcmJhc2UgKyByZWcsIHZhbCk7CiB9CiAKIC8qIFJlZ2lzdGVyIE1BTCBkZXZpY2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKaW5kZXggNDRjOWY5OS4uOTkzNDNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS92aW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0xMDAwLDggKzk5OSw2IEBACiAJYWRhcHRlci0+bWFjX2FkZHIgPSAwOwogCW1lbWNweSgmYWRhcHRlci0+bWFjX2FkZHIsIG1hY19hZGRyX3AsIDYpOwogCi0JYWRhcHRlci0+bGlvYm4gPSBkZXYtPmlvbW11X3RhYmxlLT5pdF9pbmRleDsKLQogCW5ldGRldi0+aXJxID0gZGV2LT5pcnE7CiAJbmV0ZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBpYm12ZXRoX29wZW47CiAJbmV0ZGV2LT5wb2xsICAgICAgICAgICAgICAgPSBpYm12ZXRoX3BvbGw7CkBAIC0xMTE1LDcgKzExMTIsNiBAQAogCXNlcV9wcmludGYoc2VxLCAiJXMgJXNcblxuIiwgaWJtdmV0aF9kcml2ZXJfc3RyaW5nLCBpYm12ZXRoX2RyaXZlcl92ZXJzaW9uKTsKIAogCXNlcV9wcmludGYoc2VxLCAiVW5pdCBBZGRyZXNzOiAgICAweCV4XG4iLCBhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MpOwotCXNlcV9wcmludGYoc2VxLCAiTElPQk46ICAgICAgICAgICAweCVseFxuIiwgYWRhcHRlci0+bGlvYm4pOwogCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBNQUM6ICAgICAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKIAkJICAgY3VycmVudF9tYWNbMF0sIGN1cnJlbnRfbWFjWzFdLCBjdXJyZW50X21hY1syXSwKIAkJICAgY3VycmVudF9tYWNbM10sIGN1cnJlbnRfbWFjWzRdLCBjdXJyZW50X21hY1s1XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmggYi9kcml2ZXJzL25ldC9pYm12ZXRoLmgKaW5kZXggZjViMjViZi4uYmI2OWNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtdmV0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguaApAQCAtMTE4LDcgKzExOCw2IEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAgICAgdW5zaWduZWQgaW50IG1jYXN0RmlsdGVyU2l6ZTsKICAgICB1bnNpZ25lZCBsb25nIG1hY19hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgbGlvYm47CiAgICAgdm9pZCAqIGJ1ZmZlcl9saXN0X2FkZHI7CiAgICAgdm9pZCAqIGZpbHRlcl9saXN0X2FkZHI7CiAgICAgZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jIGIvZHJpdmVycy9uZXQvaW9jMy1ldGguYwppbmRleCBmNTZiMDBlLi5mMGQzMGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTU3LDcgKzU3LDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKaW5kZXggMTRiZGE3Ni4uNmU5NTY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwpAQCAtMTc5MywxMCArMTc5Myw4IEBACiBlcnJfb3V0XzI6CiAJdXNiX2ZyZWVfdXJiKHNlbGYtPnR4X3VyYik7CiBlcnJfb3V0XzE6Ci0JZm9yIChpID0gMDsgaSA8IHNlbGYtPm1heF9yeF91cmI7IGkrKykgewotCQlpZiAoc2VsZi0+cnhfdXJiW2ldKQotCQkJdXNiX2ZyZWVfdXJiKHNlbGYtPnJ4X3VyYltpXSk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBzZWxmLT5tYXhfcnhfdXJiOyBpKyspCisJCXVzYl9mcmVlX3VyYihzZWxmLT5yeF91cmJbaV0pOwogCWZyZWVfbmV0ZGV2KG5ldCk7CiBlcnJfb3V0OgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYwppbmRleCBlMDlmNTc1Li43YjEyNzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTEyNDksNyArMTI0OSw3IEBACiAJaWYobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7CiAJCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm87CiAJCWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7Ci0JCWNzbyA9IChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YTsKKwkJY3NvID0gY3NzICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKIAkJY29udGV4dF9kZXNjID0gSVhHQl9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYW5jZS5jIGIvZHJpdmVycy9uZXQvbGFuY2UuYwppbmRleCA2ZWZiZDQ5Li40MjU2YzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI2YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC0wLDAgKzEsMTA5NyBAQAorLyogODM5MC5jOiBBIGdlbmVyYWwgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBjb3JlIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkyLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisKKyAgVGhpcyBpcyB0aGUgY2hpcC1zcGVjaWZpYyBjb2RlIGZvciBtYW55IDgzOTAtYmFzZWQgZXRoZXJuZXQgYWRhcHRvcnMuCisgIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBpdCBtdXN0IGJlIGNvbWJpbmVkIHdpdGggYm9hcmQtc3BlY2lmaWMKKyAgY29kZSBzdWNoIGFzIG5lLmMsIHdkLmMsIDNjNTAzLmMsIGV0Yy4KKworICBTZWVpbmcgaG93IGF0IGxlYXN0IGVpZ2h0IGRyaXZlcnMgdXNlIHRoaXMgY29kZSwgKG5vdCBjb3VudGluZyB0aGUKKyAgUENNQ0lBIG9uZXMgZWl0aGVyKSBpdCBpcyBlYXN5IHRvIGJyZWFrIHNvbWUgY2FyZCBieSB3aGF0IHNlZW1zIGxpa2UKKyAgYSBzaW1wbGUgaW5ub2NlbnQgY2hhbmdlLiBQbGVhc2UgY29udGFjdCBtZSBvciBEb25hbGQgaWYgeW91IHRoaW5rCisgIHlvdSBoYXZlIGZvdW5kIHNvbWV0aGluZyB0aGF0IG5lZWRzIGNoYW5naW5nLiAtLSBQRworCisKKyAgQ2hhbmdlbG9nOgorCisgIFBhdWwgR29ydG1ha2VyCTogcmVtb3ZlIHNldF9iaXQgbG9jaywgb3RoZXIgY2xlYW51cHMuCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGVpX2dldF84MzkwX2hkcigpIHNvIHdlIGNhbiBwYXNzIHNrYidzIHRvCisJCQkgIGVpX2Jsb2NrX2lucHV0KCkgZm9yIGV0aF9pb19jb3B5X2FuZF9zdW0oKS4KKyAgUGF1bCBHb3J0bWFrZXIJOiBleGNoYW5nZSBzdGF0aWMgaW50IGVpX3Bpbmdwb25nIGZvciBhICNkZWZpbmUsCisJCQkgIGFsc28gYWRkIGJldHRlciBUeCBlcnJvciBoYW5kbGluZy4KKyAgUGF1bCBHb3J0bWFrZXIJOiByZXdyaXRlIFJ4IG92ZXJydW4gaGFuZGxpbmcgYXMgcGVyIE5TIHNwZWNzLgorICBBbGV4ZXkgS3V6bmV0c292CTogdXNlIHRoZSA4MzkwJ3Mgc2l4IGJpdCBoYXNoIG11bHRpY2FzdCBmaWx0ZXIuCisgIFBhdWwgR29ydG1ha2VyCTogdHdlYWsgQU5LJ3MgYWJvdmUgbXVsdGljYXN0IGNoYW5nZXMgYSBiaXQuCisgIFBhdWwgR29ydG1ha2VyCTogdXBkYXRlIHBhY2tldCBzdGF0aXN0aWNzIGZvciB2Mi4xLngKKyAgQWxhbiBDb3gJCTogc3VwcG9ydCBhcmJpdGFyeSBzdHVwaWQgcG9ydCBtYXBwaW5ncyBvbiB0aGUKKyAgCQkJICA2OEsgTWFjaW50b3NoLiBTdXBwb3J0ID4xNmJpdCBJL08gc3BhY2VzCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGttb2Qgc3VwcG9ydCBmb3IgYXV0by1sb2FkaW5nIG9mIHRoZSA4MzkwCisJCQkgIG1vZHVsZSBieSBhbGwgZHJpdmVycyB0aGF0IHJlcXVpcmUgaXQuCisgIEFsYW4gQ294CQk6IFNwaW5sb2NraW5nIHdvcmssIGFkZGVkICdCVUdfODNDNjkwJworICBQYXVsIEdvcnRtYWtlcgk6IFNlcGFyYXRlIG91dCBUeCB0aW1lb3V0IGNvZGUgZnJvbSBUeCBwYXRoLgorICBQYXVsIEdvcnRtYWtlcgk6IFJlbW92ZSBvbGQgdW51c2VkIHNpbmdsZSBUeCBidWZmZXIgY29kZS4KKyAgSGF5YXRvIEZ1aml3YXJhCTogQWRkIG0zMnIgc3VwcG9ydC4KKyAgUGF1bCBHb3J0bWFrZXIJOiB1c2Ugc2tiX3BhZHRvKCkgaW5zdGVhZCBvZiBzdGFjayBzY3JhdGNoIGFyZWEKKworICBTb3VyY2VzOgorICBUaGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMQU4gRGF0YWJvb2ssIGFuZCB0aGUgM0NvbSAzYzUwMyBkYXRhYm9vay4KKworICAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNkZWZpbmUgTlM4MzkwX0NPUkUKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgQlVHXzgzQzY5MAorCisvKiBUaGVzZSBhcmUgdGhlIG9wZXJhdGlvbmFsIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gYm9hcmQtc3BlY2lmaWMKKyAgIHJvdXRpbmVzLgorCXZvaWQgcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCQlSZXNldHMgdGhlIGJvYXJkIGFzc29jaWF0ZWQgd2l0aCBERVYsIGluY2x1ZGluZyBhIGhhcmR3YXJlIHJlc2V0IG9mCisJCXRoZSA4MzkwLiAgVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgdHJhbnNtaXQgdGltZW91dCwgYW5kCisJCWl0IGlzIGFsd2F5cyBmb2xsb3dlZCBieSA4MzkwX2luaXQoKS4KKwl2b2lkIGJsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkJICBpbnQgc3RhcnRfcGFnZSkKKwkJV3JpdGUgdGhlIENPVU5UIGJ5dGVzIG9mIEJVRiB0byB0aGUgcGFja2V0IGJ1ZmZlciBhdCBTVEFSVF9QQUdFLiAgVGhlCisJCSJwYWdlIiB2YWx1ZSB1c2VzIHRoZSA4MzkwJ3MgMjU2LWJ5dGUgcGFnZXMuCisJdm9pZCBnZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQorCQlSZWFkIHRoZSA0IGJ5dGUsIHBhZ2UgYWxpZ25lZCA4MzkwIGhlYWRlci4gKklmKiB0aGVyZSBpcyBhCisJCXN1YnNlcXVlbnQgcmVhZCwgaXQgd2lsbCBiZSBvZiB0aGUgcmVzdCBvZiB0aGUgcGFja2V0LgorCXZvaWQgYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCisJCVJlYWQgQ09VTlQgYnl0ZXMgZnJvbSB0aGUgcGFja2V0IGJ1ZmZlciBpbnRvIHRoZSBza2IgZGF0YSBhcmVhLiBTdGFydAorCQlyZWFkaW5nIGZyb20gUklOR19PRkZTRVQsIHRoZSBhZGRyZXNzIGFzIHRoZSA4MzkwIHNlZXMgaXQuICBUaGlzIHdpbGwgYWx3YXlzCisJCWZvbGxvdyB0aGUgcmVhZCBvZiB0aGUgODM5MCBoZWFkZXIuCisqLworI2RlZmluZSBlaV9yZXNldF84MzkwIChlaV9sb2NhbC0+cmVzZXRfODM5MCkKKyNkZWZpbmUgZWlfYmxvY2tfb3V0cHV0IChlaV9sb2NhbC0+YmxvY2tfb3V0cHV0KQorI2RlZmluZSBlaV9ibG9ja19pbnB1dCAoZWlfbG9jYWwtPmJsb2NrX2lucHV0KQorI2RlZmluZSBlaV9nZXRfODM5MF9oZHIgKGVpX2xvY2FsLT5nZXRfODM5MF9oZHIpCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBlaV9kZWJ1ZworaW50IGVpX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMuICovCitzdGF0aWMgdm9pZCBlaV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV9yeF9vdmVycnVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBSb3V0aW5lcyBnZW5lcmljIHRvIE5TODM5MC1iYXNlZCBib2FyZHMuICovCitzdGF0aWMgdm9pZCBOUzgzOTBfdHJpZ2dlcl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQkJCWludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIF9fTlM4MzkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCk7CisKKy8qCisgKglTTVAgYW5kIHRoZSA4MzkwIHNldHVwLgorICoKKyAqCVRoZSA4MzkwIGlzbnQgZXhhY3RseSBkZXNpZ25lZCB0byBiZSBtdWx0aXRocmVhZGVkIG9uIFJYL1RYLiBUaGVyZSBpcworICoJYSBwYWdlIHJlZ2lzdGVyIHRoYXQgY29udHJvbHMgYmFuayBhbmQgcGFja2V0IGJ1ZmZlciBhY2Nlc3MuIFdlIGd1YXJkCisgKgl0aGlzIHdpdGggZWlfbG9jYWwtPnBhZ2VfbG9jay4gTm9ib2R5IHNob3VsZCBhc3N1bWUgb3Igc2V0IHRoZSBwYWdlIG90aGVyCisgKgl0aGFuIHplcm8gd2hlbiB0aGUgbG9jayBpcyBub3QgaGVsZC4gTG9jayBob2xkZXJzIG11c3QgcmVzdG9yZSBwYWdlIDAKKyAqCWJlZm9yZSB1bmxvY2tpbmcuIEV2ZW4gcHVyZSByZWFkZXJzIG11c3QgdGFrZSB0aGUgbG9jayB0byBwcm90ZWN0IGluCisgKglwYWdlIDAuCisgKgorICoJVG8gbWFrZSBsaWZlIGRpZmZpY3VsdCB0aGUgY2hpcCBjYW4gYWxzbyBiZSB2ZXJ5IHNsb3cuIFdlIHRoZXJlZm9yZSBjYW4ndAorICoJanVzdCB1c2Ugc3BpbmxvY2tzLiBGb3IgdGhlIGxvbmdlciBsb2NrdXBzIHdlIGRpc2FibGUgdGhlIGlycSB0aGUgZGV2aWNlCisgKglzaXRzIG9uIGFuZCBob2xkIHRoZSBsb2NrLiBXZSBtdXN0IGhvbGQgdGhlIGxvY2sgYmVjYXVzZSB0aGVyZSBpcyBhIGR1YWwKKyAqCXByb2Nlc3NvciBjYXNlIG90aGVyIHRoYW4gaW50ZXJydXB0cyAoZ2V0IHN0YXRzL3NldCBtdWx0aWNhc3QgbGlzdCBpbgorICoJcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyIGFuZCB0cmFuc21pdCkuCisgKgorICoJTm90ZTogaW4gdGhlb3J5IHdlIGNhbiBqdXN0IGRpc2FibGUgdGhlIGlycSBvbiB0aGUgY2FyZCBfYnV0XyB0aGVyZSBpcworICoJYSBsYXRlbmN5IG9uIFNNUCBpcnEgZGVsaXZlcnkuIFNvIHdlIGNhbiBlYXNpbHkgZ28gImRpc2FibGUgaXJxIiAic3luYyBpcnFzIgorICoJZW50ZXIgbG9jaywgdGFrZSB0aGUgcXVldWVkIGlycS4gU28gd2Ugd2FkZGxlIGluc3RlYWQgb2YgZmx5aW5nLgorICoKKyAqCUZpbmFsbHkgYnkgc3BlY2lhbCBhcnJhbmdlbWVudCBmb3IgdGhlIHB1cnBvc2Ugb2YgYmVpbmcgZ2VuZXJhbGx5CisgKglhbm5veWluZyB0aGUgdHJhbnNtaXQgZnVuY3Rpb24gaXMgY2FsbGVkIGJoIGF0b21pYy4gVGhhdCBwbGFjZXMKKyAqCXJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlciBjb250ZXh0IGNhbGxlcnMgYXMgZGlzYWJsZV9pcnEgd29uJ3Qgc2F2ZQorICoJdGhlbS4KKyAqLworCisKKworLyoqCisgKiBlaV9vcGVuIC0gT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGluaXRpYWxpemUKKyAqCisgKiBUaGlzIHJvdXRpbmUgZ29lcyBhbGwtb3V0LCBzZXR0aW5nIGV2ZXJ5dGhpbmcKKyAqIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuIHRob3VnaCBtYW55IG9mIHRoZXNlIHJlZ2lzdGVycyBzaG91bGQgb25seQorICogbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LgorICovCitzdGF0aWMgaW50IF9fZWlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVGhlIGNhcmQgSS9PIHBhcnQgb2YgdGhlIGRyaXZlciAoZS5nLiAzYzUwMykgY2FuIGhvb2sgYSBUeCB0aW1lb3V0CisJICAgIHdyYXBwZXIgdGhhdCBkb2VzIGUuZy4gbWVkaWEgY2hlY2sgJiB0aGVuIGNhbGxzIGVpX3R4X3RpbWVvdXQuICovCisJaWYgKGRldi0+dHhfdGltZW91dCA9PSBOVUxMKQorCQkgZGV2LT50eF90aW1lb3V0ID0gZWlfdHhfdGltZW91dDsKKwlpZiAoZGV2LT53YXRjaGRvZ190aW1lbyA8PSAwKQorCQkgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwkvKgorCSAqCUdyYWIgdGhlIHBhZ2UgbG9jayBzbyB3ZSBvd24gdGhlIHJlZ2lzdGVyIHNldCwgdGhlbiBjYWxsCisJICoJdGhlIGluaXQgZnVuY3Rpb24uCisJICovCisKKyAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCV9fTlM4MzkwX2luaXQoZGV2LCAxKTsKKwkvKiBTZXQgdGhlIGZsYWcgYmVmb3JlIHdlIGRyb3AgdGhlIGxvY2ssIFRoYXQgd2F5IHRoZSBJUlEgYXJyaXZlcworCSAgIGFmdGVyIGl0cyBzZXQgYW5kIHdlIGdldCBubyBzaWxseSB3YXJuaW5ncyAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlaV9jbG9zZSAtIHNodXQgZG93biBuZXR3b3JrIGRldmljZQorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gY2xvc2UKKyAqCisgKiBPcHBvc2l0ZSBvZiBlaV9vcGVuKCkuIE9ubHkgdXNlZCB3aGVuICJpZmNvbmZpZyA8ZGV2bmFtZT4gZG93biIgaXMgZG9uZS4KKyAqLworc3RhdGljIGludCBfX2VpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqCUhvbGQgdGhlIHBhZ2UgbG9jayBkdXJpbmcgY2xvc2UKKwkgKi8KKworICAgICAgCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJX19OUzgzOTBfaW5pdChkZXYsIDApOworICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWlfdHhfdGltZW91dCAtIGhhbmRsZSB0cmFuc21pdCB0aW1lIG91dCBjb25kaXRpb24KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGhhcyBhcHBhcmVudGx5IGZhbGxlbiBhc2xlZXAKKyAqCisgKiBDYWxsZWQgYnkga2VybmVsIHdoZW4gZGV2aWNlIG5ldmVyIGFja25vd2xlZGdlcyBhIHRyYW5zbWl0IGhhcworICogY29tcGxldGVkIChvciBmYWlsZWQpIC0gaS5lLiBuZXZlciBwb3N0ZWQgYSBUeCByZWxhdGVkIGludGVycnVwdC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0eHNyLCBpc3IsIHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWYgZGVmaW5lZChDT05GSUdfTTMyUikgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCXVuc2lnbmVkIGxvbmcgaWN1Y3I7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWN1Y3IgPSBpbmwoTTMyUl9JQ1VfQ1IxX1BPUlRMKTsKKwlpY3VjciB8PSBNMzJSX0lDVUNSX0lTTU9EMTE7CisJb3V0bChpY3VjciwgTTMyUl9JQ1VfQ1IxX1BPUlRMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKKwllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJdHhzciA9IGVpX2luYihlODM5MF9iYXNlK0VOMF9UU1IpOworCWlzciA9IGVpX2luYihlODM5MF9iYXNlK0VOMF9JU1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggdGltZWQgb3V0LCAlcyBUU1I9JSMyeCwgSVNSPSUjMngsIHQ9JWQuXG4iLAorCQlkZXYtPm5hbWUsICh0eHNyICYgRU5UU1JfQUJUKSA/ICJleGNlc3MgY29sbGlzaW9ucy4iIDoKKwkJKGlzcikgPyAibG9zdCBpbnRlcnJ1cHQ/IiA6ICJjYWJsZSBwcm9ibGVtPyIsIHR4c3IsIGlzciwgdGlja3Nzb2Zhcik7CisKKwlpZiAoIWlzciAmJiAhZWlfbG9jYWwtPnN0YXQudHhfcGFja2V0cykKKwl7CisJCS8qIFRoZSA4MzkwIHByb2JhYmx5IGhhc24ndCBnb3R0ZW4gb24gdGhlIGNhYmxlIHlldC4gKi8KKwkJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gXj0gMTsgICAvKiBUcnkgYSBkaWZmZXJlbnQgeGN2ci4gICovCisJfQorCisJLyogVWdseSBidXQgYSByZXNldCBjYW4gYmUgc2xvdywgeWV0IG11c3QgYmUgcHJvdGVjdGVkICovCisKKwlkaXNhYmxlX2lycV9ub3N5bmNfbG9ja2RlcChkZXYtPmlycSk7CisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBjYXJkLiAgUGVyaGFwcyB0aGUgdXNlciBoYXMgZml4ZWQgc29tZXRoaW5nLiAqLworCWVpX3Jlc2V0XzgzOTAoZGV2KTsKKwlfX05TODM5MF9pbml0KGRldiwgMSk7CisKKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJZW5hYmxlX2lycV9sb2NrZGVwKGRldi0+aXJxKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKgorICogZWlfc3RhcnRfeG1pdCAtIGJlZ2luIHBhY2tldCB0cmFuc21pc3Npb24KKyAqIEBza2I6IHBhY2tldCB0byBiZSBzZW50CisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byB3aGljaCBwYWNrZXQgaXMgc2VudAorICoKKyAqIFNlbmRzIGEgcGFja2V0IHRvIGFuIDgzOTAgbmV0d29yayBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCBlaV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzZW5kX2xlbmd0aCA9IHNrYi0+bGVuLCBvdXRwdXRfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgYnVmW0VUSF9aTEVOXTsKKwljaGFyICpkYXRhID0gc2tiLT5kYXRhOworCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgRVRIX1pMRU4pOwkvKiBtb3JlIGVmZmljaWVudCB0aGFuIGRvaW5nIGp1c3QgdGhlIG5lZWRlZCBiaXRzICovCisJCW1lbWNweShidWYsIGRhdGEsIHNrYi0+bGVuKTsKKwkJc2VuZF9sZW5ndGggPSBFVEhfWkxFTjsKKwkJZGF0YSA9IGJ1ZjsKKwl9CisKKwkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgZXRoZXJjYXJkLgorCSAgIFNNUDogV2UgaGF2ZSB0byBncmFiIHRoZSBsb2NrIGhlcmUgb3RoZXJ3aXNlIHRoZSBJUlEgaGFuZGxlcgorCSAgIG9uIGFub3RoZXIgQ1BVIGNhbiBmbGlwIHdpbmRvdyBhbmQgcmFjZSB0aGUgSVJRIG1hc2sgc2V0LiBXZSBlbmQKKwkgICB1cCB0cmFzaGluZyB0aGUgbWNhc3QgZmlsdGVyIG5vdCBkaXNhYmxpbmcgaXJxcyBpZiB3ZSBkb24ndCBsb2NrICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCWVpX291dGJfcCgweDAwLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCisKKwkvKgorCSAqCVNsb3cgcGhhc2Ugd2l0aCBsb2NrIGhlbGQuCisJICovCisKKwlkaXNhYmxlX2lycV9ub3N5bmNfbG9ja2RlcF9pcnFzYXZlKGRldi0+aXJxLCAmZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKworCWVpX2xvY2FsLT5pcnFsb2NrID0gMTsKKworCS8qCisJICogV2UgaGF2ZSB0d28gVHggc2xvdHMgYXZhaWxhYmxlIGZvciB1c2UuIEZpbmQgdGhlIGZpcnN0IGZyZWUKKwkgKiBzbG90LCBhbmQgdGhlbiBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gV2l0aCB0d28gVHggYnVmcywKKwkgKiB5b3UgZ2V0IHZlcnkgY2xvc2UgdG8gdHJhbnNtaXR0aW5nIGJhY2stdG8tYmFjayBwYWNrZXRzLiBXaXRoCisJICogb25seSBvbmUgVHggYnVmLCB0aGUgdHJhbnNtaXR0ZXIgc2l0cyBpZGxlIHdoaWxlIHlvdSByZWxvYWQgdGhlCisJICogY2FyZCwgbGVhdmluZyBhIHN1YnN0YW50aWFsIGdhcCBiZXR3ZWVuIGVhY2ggdHJhbnNtaXR0ZWQgcGFja2V0LgorCSAqLworCisJaWYgKGVpX2xvY2FsLT50eDEgPT0gMCkKKwl7CisJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2U7CisJCWVpX2xvY2FsLT50eDEgPSBzZW5kX2xlbmd0aDsKKwkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MiA+IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIgdHgyPSVkLCBsYXN0dHg9JWQsIHR4aW5nPSVkLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eGluZyk7CisJfQorCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPT0gMCkKKwl7CisJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyBUWF9QQUdFUy8yOworCQllaV9sb2NhbC0+dHgyID0gc2VuZF9sZW5ndGg7CisJCWlmIChlaV9kZWJ1ZyAgJiYgIGVpX2xvY2FsLT50eDEgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZGxlIHRyYW5zbWl0dGVyLCB0eDE9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZQorCXsJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworCQlpZiAoZWlfZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCk7CisJCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQllaV9vdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJZW5hYmxlX2lycV9sb2NrZGVwX2lycXJlc3RvcmUoZGV2LT5pcnEsICZmbGFncyk7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE9rYXksIG5vdyB1cGxvYWQgdGhlIHBhY2tldCBhbmQgdHJpZ2dlciBhIHNlbmQgaWYgdGhlIHRyYW5zbWl0dGVyCisJICogaXNuJ3QgYWxyZWFkeSBzZW5kaW5nLiBJZiBpdCBpcyBidXN5LCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbAorCSAqIHRyaWdnZXIgdGhlIHNlbmQgbGF0ZXIsIHVwb24gcmVjZWl2aW5nIGEgVHggZG9uZSBpbnRlcnJ1cHQuCisJICovCisKKwllaV9ibG9ja19vdXRwdXQoZGV2LCBzZW5kX2xlbmd0aCwgZGF0YSwgb3V0cHV0X3BhZ2UpOworCisJaWYgKCEgZWlfbG9jYWwtPnR4aW5nKQorCXsKKwkJZWlfbG9jYWwtPnR4aW5nID0gMTsKKwkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIHNlbmRfbGVuZ3RoLCBvdXRwdXRfcGFnZSk7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZiAob3V0cHV0X3BhZ2UgPT0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UpCisJCXsKKwkJCWVpX2xvY2FsLT50eDEgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMjsKKwkJfQorCX0KKwllbHNlIGVpX2xvY2FsLT50eHF1ZXVlKys7CisKKwlpZiAoZWlfbG9jYWwtPnR4MSAgJiYgIGVpX2xvY2FsLT50eDIpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBUdXJuIDgzOTAgaW50ZXJydXB0cyBiYWNrIG9uLiAqLworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwllaV9vdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisKKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJZW5hYmxlX2lycV9sb2NrZGVwX2lycXJlc3RvcmUoZGV2LT5pcnEsICZmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCWVpX2xvY2FsLT5zdGF0LnR4X2J5dGVzICs9IHNlbmRfbGVuZ3RoOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWlfaW50ZXJydXB0IC0gaGFuZGxlIHRoZSBpbnRlcnJ1cHRzIGZyb20gYW4gODM5MAorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZDogYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlCisgKgorICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gV2UgcHVsbCBwYWNrZXRzIGZyb20KKyAqIHRoZSA4MzkwIHZpYSB0aGUgY2FyZCBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGZpcmUgdGhlbSBhdCB0aGUgbmV0d29ya2luZworICogc3RhY2suIFdlIGFsc28gaGFuZGxlIHRyYW5zbWl0IGNvbXBsZXRpb25zIGFuZCB3YWtlIHRoZSB0cmFuc21pdCBwYXRoIGlmCisgKiBuZWNlc3NhcnkuIFdlIGFsc28gdXBkYXRlIHRoZSBjb3VudGVycyBhbmQgZG8gb3RoZXIgaG91c2VrZWVwaW5nIGFzCisgKiBuZWVkZWQuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IF9fZWlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBpbnRlcnJ1cHRzLCBucl9zZXJ2aWNlZCA9IDA7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKglQcm90ZWN0IHRoZSBpcnEgdGVzdCB0b28uCisJICovCisKKwlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCisJaWYgKGVpX2xvY2FsLT5pcnFsb2NrKQorCXsKKyNpZiAxIC8qIFRoaXMgbWlnaHQganVzdCBiZSBhbiBpbnRlcnJ1cHQgZm9yIGEgUENJIGRldmljZSBzaGFyaW5nIHRoaXMgbGluZSAqLworCQkvKiBUaGUgImlycWxvY2siIGNoZWNrIGlzIG9ubHkgZm9yIHRlc3RpbmcuICovCisJCXByaW50ayhlaV9sb2NhbC0+aXJxbG9jaworCQkJICAgPyAiJXM6IEludGVycnVwdGVkIHdoaWxlIGludGVycnVwdHMgYXJlIG1hc2tlZCEgaXNyPSUjMnggaW1yPSUjMnguXG4iCisJCQkgICA6ICIlczogUmVlbnRlcmluZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpLAorCQkJICAgZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JTVIpKTsKKyNlbmRpZgorCQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBDaGFuZ2UgdG8gcGFnZSAwIGFuZCByZWFkIHRoZSBpbnRyIHN0YXR1cyByZWcuICovCisJZWlfb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKwlpZiAoZWlfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdChpc3I9JSMyLjJ4KS5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIGVpX2luYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSk7CisKKwkvKiAhIUFzc3VtcHRpb24hISAtLSB3ZSBzdGF5IGluIHBhZ2UgMC4JIERvbid0IGJyZWFrIHRoaXMuICovCisJd2hpbGUgKChpbnRlcnJ1cHRzID0gZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKSAhPSAwCisJCSAgICYmICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkKKwl7CisJCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW50ZXJydXB0IGZyb20gc3RvcHBlZCBjYXJkXG4iLCBkZXYtPm5hbWUpOworCQkJLyogcm1rIC0gYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMgKi8KKwkJCWVpX291dGJfcChpbnRlcnJ1cHRzLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCQlpbnRlcnJ1cHRzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfT1ZFUikKKwkJCWVpX3J4X292ZXJydW4oZGV2KTsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIChFTklTUl9SWCtFTklTUl9SWF9FUlIpKQorCQl7CisJCQkvKiBHb3QgYSBnb29kICg/KSBwYWNrZXQuICovCisJCQllaV9yZWNlaXZlKGRldik7CisJCX0KKwkJLyogUHVzaCB0aGUgbmV4dCB0by10cmFuc21pdCBwYWNrZXQgdGhyb3VnaC4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9UWCkKKwkJCWVpX3R4X2ludHIoZGV2KTsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIEVOSVNSX1RYX0VSUikKKwkJCWVpX3R4X2VycihkZXYpOworCisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfQ09VTlRFUlMpCisJCXsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2ZyYW1lX2Vycm9ycyArPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIwKTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2NyY19lcnJvcnMgICArPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIxKTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X21pc3NlZF9lcnJvcnMrPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIyKTsKKwkJCWVpX291dGJfcChFTklTUl9DT1VOVEVSUywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2sgaW50ci4gKi8KKwkJfQorCisJCS8qIElnbm9yZSBhbnkgUkRDIGludGVycnVwdHMgdGhhdCBtYWtlIGl0IGJhY2sgdG8gaGVyZS4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9SREMpCisJCXsKKwkJCWVpX291dGJfcChFTklTUl9SREMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwkJfQorCisJCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisJfQorCisJaWYgKGludGVycnVwdHMgJiYgZWlfZGVidWcpCisJeworCQllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCQlpZiAobnJfc2VydmljZWQgPj0gTUFYX1NFUlZJQ0UpCisJCXsKKwkJCS8qIDB4RkYgaXMgdmFsaWQgZm9yIGEgY2FyZCByZW1vdmFsICovCisJCQlpZihpbnRlcnJ1cHRzIT0weEZGKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzICUjMi4yeFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGludGVycnVwdHMpOworCQkJZWlfb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIG1vc3QgaW50cnMuICovCisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBpbnRlcnJ1cHQgJSMyeFxuIiwgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKKwkJCWVpX291dGJfcCgweGZmLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjay4gYWxsIGludHJzLiAqLworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChucl9zZXJ2aWNlZCA+IDApOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIF9fZWlfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxX2xvY2tkZXAoZGV2LT5pcnEpOworCV9fZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYpOworCWVuYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoqCisgKiBlaV90eF9lcnIgLSBoYW5kbGUgdHJhbnNtaXR0ZXIgZXJyb3IKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24KKyAqCisgKiBBIHRyYW5zbWl0dGVyIGVycm9yIGhhcyBoYXBwZW5lZC4gTW9zdCBsaWtlbHkgZXhjZXNzIGNvbGxpc2lvbnMgKHdoaWNoCisgKiBpcyBhIGZhaXJseSBub3JtYWwgY29uZGl0aW9uKS4gSWYgdGhlIGVycm9yIGlzIG9uZSB3aGVyZSB0aGUgVHggd2lsbAorICogaGF2ZSBiZWVuIGFib3J0ZWQsIHdlIHRyeSBhbmQgc2VuZCBhbm90aGVyIG9uZSByaWdodCBhd2F5LCBpbnN0ZWFkIG9mCisgKiBsZXR0aW5nIHRoZSBmYWlsZWQgcGFja2V0IHNpdCBhbmQgY29sbGVjdCBkdXN0IGluIHRoZSBUeCBidWZmZXIuIFRoaXMKKyAqIGlzIGEgbXVjaCBiZXR0ZXIgc29sdXRpb24gYXMgaXQgYXZvaWRzIGtlcm5lbCBiYXNlZCBUeCB0aW1lb3V0cywgYW5kCisgKiBhbiB1bm5lY2Vzc2FyeSBjYXJkIHJlc2V0LgorICoKKyAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV90eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciB0eHNyID0gZWlfaW5iX3AoZTgzOTBfYmFzZStFTjBfVFNSKTsKKwl1bnNpZ25lZCBjaGFyIHR4X3dhc19hYm9ydGVkID0gdHhzciAmIChFTlRTUl9BQlQrRU5UU1JfRlUpOworCisjaWZkZWYgVkVSQk9TRV9FUlJPUl9EVU1QCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0cmFuc21pdHRlciBlcnJvciAoJSMyeCk6ICIsIGRldi0+bmFtZSwgdHhzcik7CisJaWYgKHR4c3IgJiBFTlRTUl9BQlQpCisJCXByaW50aygiZXhjZXNzLWNvbGxpc2lvbnMgIik7CisJaWYgKHR4c3IgJiBFTlRTUl9ORCkKKwkJcHJpbnRrKCJub24tZGVmZXJyYWwgIik7CisJaWYgKHR4c3IgJiBFTlRTUl9DUlMpCisJCXByaW50aygibG9zdC1jYXJyaWVyICIpOworCWlmICh0eHNyICYgRU5UU1JfRlUpCisJCXByaW50aygiRklGTy11bmRlcnJ1biAiKTsKKwlpZiAodHhzciAmIEVOVFNSX0NESCkKKwkJcHJpbnRrKCJsb3N0LWhlYXJ0YmVhdCAiKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCWVpX291dGJfcChFTklTUl9UWF9FUlIsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisKKwlpZiAodHhfd2FzX2Fib3J0ZWQpCisJCWVpX3R4X2ludHIoZGV2KTsKKwllbHNlCisJeworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9DUlMpIGVpX2xvY2FsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfQ0RIKSBlaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfT1dDKSBlaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJfQorfQorCisvKioKKyAqIGVpX3R4X2ludHIgLSB0cmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGRldjogbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHR4IGludHIgaXMgaGFuZGxlZAorICoKKyAqIFdlIGhhdmUgZmluaXNoZWQgYSB0cmFuc21pdDogY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhlbiB0cmlnZ2VyIHRoZSBuZXh0CisgKiBwYWNrZXQgdG8gYmUgc2VudC4gQ2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGVpX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHN0YXR1cyA9IGVpX2luYihlODM5MF9iYXNlICsgRU4wX1RTUik7CisKKwllaV9vdXRiX3AoRU5JU1JfVFgsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisKKwkvKgorCSAqIFRoZXJlIGFyZSB0d28gVHggYnVmZmVycywgc2VlIHdoaWNoIG9uZSBmaW5pc2hlZCwgYW5kIHRyaWdnZXIKKwkgKiB0aGUgc2VuZCBvZiBhbm90aGVyIG9uZSBpZiBpdCBleGlzdHMuCisJICovCisJZWlfbG9jYWwtPnR4cXVldWUtLTsKKworCWlmIChlaV9sb2NhbC0+dHgxIDwgMCkKKwl7CisJCWlmIChlaV9sb2NhbC0+bGFzdHR4ICE9IDEgJiYgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDE9JWQuXG4iLAorCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgxKTsKKwkJZWlfbG9jYWwtPnR4MSA9IDA7CisJCWlmIChlaV9sb2NhbC0+dHgyID4gMCkKKwkJeworCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKKwkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgyLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIDYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQllaV9sb2NhbC0+dHgyID0gLTEsCisJCQllaV9sb2NhbC0+bGFzdHR4ID0gMjsKKwkJfQorCQllbHNlIGVpX2xvY2FsLT5sYXN0dHggPSAyMCwgZWlfbG9jYWwtPnR4aW5nID0gMDsKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA8IDApCisJeworCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAyICAmJiAgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMikKKwkJCXByaW50aygiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDI9JWQuXG4iLAorCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgyKTsKKwkJZWlfbG9jYWwtPnR4MiA9IDA7CisJCWlmIChlaV9sb2NhbC0+dHgxID4gMCkKKwkJeworCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKKwkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWVpX2xvY2FsLT50eDEgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAxOworCQl9CisJCWVsc2UKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAxMCwgZWlfbG9jYWwtPnR4aW5nID0gMDsKKwl9CisvLwllbHNlIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmV4cGVjdGVkIFRYLWRvbmUgaW50ZXJydXB0LCBsYXN0dHg9JWQuXG4iLAorLy8JCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT5sYXN0dHgpOworCisJLyogTWluaW1pemUgVHggbGF0ZW5jeTogdXBkYXRlIHRoZSBzdGF0aXN0aWNzIGFmdGVyIHdlIHJlc3RhcnQgVFhpbmcuICovCisJaWYgKHN0YXR1cyAmIEVOVFNSX0NPTCkKKwkJZWlfbG9jYWwtPnN0YXQuY29sbGlzaW9ucysrOworCWlmIChzdGF0dXMgJiBFTlRTUl9QVFgpCisJCWVpX2xvY2FsLT5zdGF0LnR4X3BhY2tldHMrKzsKKwllbHNlCisJeworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0FCVCkKKwkJeworCQkJZWlfbG9jYWwtPnN0YXQudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWVpX2xvY2FsLT5zdGF0LmNvbGxpc2lvbnMgKz0gMTY7CisJCX0KKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0NSUykKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9GVSkKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DREgpCisJCQllaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9PV0MpCisJCQllaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqCisgKiBlaV9yZWNlaXZlIC0gcmVjZWl2ZSBzb21lIHBhY2tldHMKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdpdGggd2hpY2ggcmVjZWl2ZSB3aWxsIGJlIHJ1bgorICoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciByeGluZ19wYWdlLCB0aGlzX2ZyYW1lLCBuZXh0X2ZyYW1lOworCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfb2Zmc2V0OworCWludCByeF9wa3RfY291bnQgPSAwOworCXN0cnVjdCBlODM5MF9wa3RfaGRyIHJ4X2ZyYW1lOworCWludCBudW1fcnhfcGFnZXMgPSBlaV9sb2NhbC0+c3RvcF9wYWdlLWVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOworCisJd2hpbGUgKCsrcnhfcGt0X2NvdW50IDwgMTApCisJeworCQlpbnQgcGt0X2xlbiwgcGt0X3N0YXQ7CisKKwkJLyogR2V0IHRoZSByeCBwYWdlIChpbmNvbWluZyBwYWNrZXQgcG9pbnRlcikuICovCisJCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisJCXJ4aW5nX3BhZ2UgPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4xX0NVUlBBRyk7CisJCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisKKwkJLyogUmVtb3ZlIG9uZSBmcmFtZSBmcm9tIHRoZSByaW5nLiAgQm91bmRhcnkgaXMgYWx3YXlzIGEgcGFnZSBiZWhpbmQuICovCisJCXRoaXNfZnJhbWUgPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4wX0JPVU5EQVJZKSArIDE7CisJCWlmICh0aGlzX2ZyYW1lID49IGVpX2xvY2FsLT5zdG9wX3BhZ2UpCisJCQl0aGlzX2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CisKKwkJLyogU29tZWRheSB3ZSdsbCBvbWl0IHRoZSBwcmV2aW91cywgaWZmIHdlIG5ldmVyIGdldCB0aGlzIG1lc3NhZ2UuCisJCSAgIChUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2xvbmUgY2xhaW1lZCB0byBoYXZlIGEgcHJvYmxlbS4pCisKKwkJICAgS2VlcCBxdWlldCBpZiBpdCBsb29rcyBsaWtlIGEgY2FyZCByZW1vdmFsLiBPbmUgcHJvYmxlbSBoZXJlCisJCSAgIGlzIHRoYXQgc29tZSBjbG9uZXMgY3Jhc2ggaW4gcm91Z2hseSB0aGUgc2FtZSB3YXkuCisJCSAqLworCQlpZiAoZWlfZGVidWcgPiAwICAmJiAgdGhpc19mcmFtZSAhPSBlaV9sb2NhbC0+Y3VycmVudF9wYWdlICYmICh0aGlzX2ZyYW1lIT0weDAgfHwgcnhpbmdfcGFnZSE9MHhGRikpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtaXNtYXRjaGVkIHJlYWQgcGFnZSBwb2ludGVycyAlMnggdnMgJTJ4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHRoaXNfZnJhbWUsIGVpX2xvY2FsLT5jdXJyZW50X3BhZ2UpOworCisJCWlmICh0aGlzX2ZyYW1lID09IHJ4aW5nX3BhZ2UpCS8qIFJlYWQgYWxsIHRoZSBmcmFtZXM/ICovCisJCQlicmVhazsJCQkJLyogRG9uZSBmb3Igbm93ICovCisKKwkJY3VycmVudF9vZmZzZXQgPSB0aGlzX2ZyYW1lIDw8IDg7CisJCWVpX2dldF84MzkwX2hkcihkZXYsICZyeF9mcmFtZSwgdGhpc19mcmFtZSk7CisKKwkJcGt0X2xlbiA9IHJ4X2ZyYW1lLmNvdW50IC0gc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKTsKKwkJcGt0X3N0YXQgPSByeF9mcmFtZS5zdGF0dXM7CisKKwkJbmV4dF9mcmFtZSA9IHRoaXNfZnJhbWUgKyAxICsgKChwa3RfbGVuKzQpPj44KTsKKworCQkvKiBDaGVjayBmb3IgYm9nb3NpdHkgd2FybmVkIGJ5IDNjNTAzIGJvb2s6IHRoZSBzdGF0dXMgYnl0ZSBpcyBuZXZlcgorCQkgICB3cml0dGVuLiAgVGhpcyBoYXBwZW5lZCBhIGxvdCBkdXJpbmcgdGVzdGluZyEgVGhpcyBjb2RlIHNob3VsZCBiZQorCQkgICBjbGVhbmVkIHVwIHNvbWVkYXkuICovCisJCWlmIChyeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUKKwkJCSYmIHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZSArIDEKKwkJCSYmIHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZSAtIG51bV9yeF9wYWdlcworCQkJJiYgcnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lICsgMSAtIG51bV9yeF9wYWdlcykgeworCQkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IHJ4aW5nX3BhZ2U7CisJCQllaV9vdXRiKGVpX2xvY2FsLT5jdXJyZW50X3BhZ2UtMSwgZTgzOTBfYmFzZStFTjBfQk9VTkRBUlkpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwa3RfbGVuIDwgNjAgIHx8ICBwa3RfbGVuID4gMTUxOCkKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVkLCBzdGF0dXM9JSMyeCBueHBnPSUjMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLmNvdW50LCByeF9mcmFtZS5zdGF0dXMsCisJCQkJCSAgIHJ4X2ZyYW1lLm5leHQpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKwkJIGVsc2UgaWYgKChwa3Rfc3RhdCAmIDB4MEYpID09IEVOUlNSX1JYT0spCisJCXsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCXsKKwkJCQlpZiAoZWlfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJZWlfbG9jYWwtPnN0YXQucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogSVAgaGVhZGVycyBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLworCQkJCWVpX2Jsb2NrX2lucHV0KGRldiwgcGt0X2xlbiwgc2tiLCBjdXJyZW50X29mZnNldCArIHNpemVvZihyeF9mcmFtZSkpOworCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X3BhY2tldHMrKzsKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJCWlmIChwa3Rfc3RhdCAmIEVOUlNSX1BIWSkKKwkJCQkJZWlfbG9jYWwtPnN0YXQubXVsdGljYXN0Kys7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoZWlfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQ6IHN0YXR1cz0lIzJ4IG54cGc9JSMyeCBzaXplPSVkXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLnN0YXR1cywgcnhfZnJhbWUubmV4dCwKKwkJCQkJICAgcnhfZnJhbWUuY291bnQpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQkvKiBOQjogVGhlIE5JQyBjb3VudHMgQ1JDLCBmcmFtZSBhbmQgbWlzc2VkIGVycm9ycy4gKi8KKwkJCWlmIChwa3Rfc3RhdCAmIEVOUlNSX0ZPKQorCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2ZpZm9fZXJyb3JzKys7CisJCX0KKwkJbmV4dF9mcmFtZSA9IHJ4X2ZyYW1lLm5leHQ7CisKKwkJLyogVGhpcyBfc2hvdWxkXyBuZXZlciBoYXBwZW46IGl0J3MgaGVyZSBmb3IgYXZvaWRpbmcgYmFkIGNsb25lcy4gKi8KKwkJaWYgKG5leHRfZnJhbWUgPj0gZWlfbG9jYWwtPnN0b3BfcGFnZSkgeworCQkJcHJpbnRrKCIlczogbmV4dCBmcmFtZSBpbmNvbnNpc3RlbmN5LCAlIzJ4XG4iLCBkZXYtPm5hbWUsCisJCQkJICAgbmV4dF9mcmFtZSk7CisJCQluZXh0X2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CisJCX0KKwkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IG5leHRfZnJhbWU7CisJCWVpX291dGJfcChuZXh0X2ZyYW1lLTEsIGU4MzkwX2Jhc2UrRU4wX0JPVU5EQVJZKTsKKwl9CisKKwkvKiBXZSB1c2VkIHRvIGFsc28gYWNrIEVOSVNSX09WRVIgaGVyZSwgYnV0IHRoYXQgd291bGQgc29tZXRpbWVzIG1hc2sKKwkgICBhIHJlYWwgb3ZlcnJ1biwgbGVhdmluZyB0aGUgODM5MCBpbiBhIHN0b3BwZWQgc3RhdGUgd2l0aCByZWMndnIgb2ZmLiAqLworCWVpX291dGJfcChFTklTUl9SWCtFTklTUl9SWF9FUlIsIGU4MzkwX2Jhc2UrRU4wX0lTUik7CisJcmV0dXJuOworfQorCisvKioKKyAqIGVpX3J4X292ZXJydW4gLSBoYW5kbGUgcmVjZWl2ZXIgb3ZlcnJ1bgorICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggdGhyZXcgZXhjZXB0aW9uCisgKgorICogV2UgaGF2ZSBhIHJlY2VpdmVyIG92ZXJydW46IHdlIGhhdmUgdG8ga2ljayB0aGUgODM5MCB0byBnZXQgaXQgc3RhcnRlZAorICogYWdhaW4uIFByb2JsZW0gaXMgdGhhdCB5b3UgaGF2ZSB0byBraWNrIGl0IGV4YWN0bHkgYXMgTlMgcHJlc2NyaWJlcyBpbgorICogdGhlIHVwZGF0ZWQgZGF0YXNoZWV0cywgb3IgInRoZSBOSUMgbWF5IGFjdCBpbiBhbiB1bnByZWRpY3RhYmxlIG1hbm5lci4iCisgKiBUaGlzIGluY2x1ZGVzIGNhdXNpbmcgInRoZSBOSUMgdG8gZGVmZXIgaW5kZWZpbml0ZWx5IHdoZW4gaXQgaXMgc3RvcHBlZAorICogb24gYSBidXN5IG5ldHdvcmsuIiAgVWdoLgorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBEb24ndCBjYWxsIHRoaXMgd2l0aCB0aGUgaW50ZXJydXB0cyBvZmYgb3IgeW91cgorICogY29tcHV0ZXIgd2lsbCBoYXRlIHlvdSAtIGl0IHRha2VzIDEwbXMgb3Igc28uCisgKi8KKworc3RhdGljIHZvaWQgZWlfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgd2FzX3R4aW5nLCBtdXN0X3Jlc2VuZCA9IDA7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKiBSZWNvcmQgd2hldGhlciBhIFR4IHdhcyBpbiBwcm9ncmVzcyBhbmQgdGhlbiBpc3N1ZSB0aGUKKwkgKiBzdG9wIGNvbW1hbmQuCisJICovCisJd2FzX3R4aW5nID0gZWlfaW5iX3AoZTgzOTBfYmFzZStFODM5MF9DTUQpICYgRTgzOTBfVFJBTlM7CisJZWlfb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZXIgb3ZlcnJ1bi5cbiIsIGRldi0+bmFtZSk7CisJZWlfbG9jYWwtPnN0YXQucnhfb3Zlcl9lcnJvcnMrKzsKKworCS8qCisJICogV2FpdCBhIGZ1bGwgVHggdGltZSAoMS4ybXMpICsgc29tZSBndWFyZCB0aW1lLCBOUyBzYXlzIDEuNm1zIHRvdGFsLgorCSAqIEVhcmx5IGRhdGFzaGVldHMgc2FpZCB0byBwb2xsIHRoZSByZXNldCBiaXQsIGJ1dCBub3cgdGhleSBzYXkgdGhhdAorCSAqIGl0ICJpcyBub3QgYSByZWxpYWJsZSBpbmRpY2F0b3IgYW5kIHN1YnNlcXVlbnRseSBzaG91bGQgYmUgaWdub3JlZC4iCisJICogV2Ugd2FpdCBhdCBsZWFzdCAxMG1zLgorCSAqLworCisJbWRlbGF5KDEwKTsKKworCS8qCisJICogUmVzZXQgUkJDUlswMV0gYmFjayB0byB6ZXJvIGFzIHBlciBtYWdpYyBpbmNhbnRhdGlvbi4KKwkgKi8KKwllaV9vdXRiX3AoMHgwMCwgZTgzOTBfYmFzZStFTjBfUkNOVExPKTsKKwllaV9vdXRiX3AoMHgwMCwgZTgzOTBfYmFzZStFTjBfUkNOVEhJKTsKKworCS8qCisJICogU2VlIGlmIGFueSBUeCB3YXMgaW50ZXJydXB0ZWQgb3Igbm90LiBBY2NvcmRpbmcgdG8gTlMsIHRoaXMKKwkgKiBzdGVwIGlzIHZpdGFsLCBhbmQgc2tpcHBpbmcgaXQgd2lsbCBjYXVzZSBubyBlbmQgb2YgaGF2b2MuCisJICovCisKKwlpZiAod2FzX3R4aW5nKQorCXsKKwkJdW5zaWduZWQgY2hhciB0eF9jb21wbGV0ZWQgPSBlaV9pbmJfcChlODM5MF9iYXNlK0VOMF9JU1IpICYgKEVOSVNSX1RYK0VOSVNSX1RYX0VSUik7CisJCWlmICghdHhfY29tcGxldGVkKQorCQkJbXVzdF9yZXNlbmQgPSAxOworCX0KKworCS8qCisJICogSGF2ZSB0byBlbnRlciBsb29wYmFjayBtb2RlIGFuZCB0aGVuIHJlc3RhcnQgdGhlIE5JQyBiZWZvcmUKKwkgKiB5b3UgYXJlIGFsbG93ZWQgdG8gc2x1cnAgcGFja2V0cyB1cCBvZmYgdGhlIHJpbmcuCisJICovCisJZWlfb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOworCWVpX291dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCisJLyoKKwkgKiBDbGVhciB0aGUgUnggcmluZyBvZiBhbGwgdGhlIGRlYnJpcywgYW5kIGFjayB0aGUgaW50ZXJydXB0LgorCSAqLworCWVpX3JlY2VpdmUoZGV2KTsKKwllaV9vdXRiX3AoRU5JU1JfT1ZFUiwgZTgzOTBfYmFzZStFTjBfSVNSKTsKKworCS8qCisJICogTGVhdmUgbG9vcGJhY2sgbW9kZSwgYW5kIHJlc2VuZCBhbnkgcGFja2V0IHRoYXQgZ290IHN0b3BwZWQuCisJICovCisJZWlfb3V0Yl9wKEU4MzkwX1RYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOworCWlmIChtdXN0X3Jlc2VuZCkKKyAgICAJCWVpX291dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQgKyBFODM5MF9UUkFOUywgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Cit9CisKKy8qCisgKglDb2xsZWN0IHRoZSBzdGF0cy4gVGhpcyBpcyBjYWxsZWQgdW5sb2NrZWQgYW5kIGZyb20gc2V2ZXJhbCBjb250ZXh0cy4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJZiB0aGUgY2FyZCBpcyBzdG9wcGVkLCBqdXN0IHJldHVybiB0aGUgcHJlc2VudCBzdGF0cy4gKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLGZsYWdzKTsKKwkvKiBSZWFkIHRoZSBjb3VudGVyIHJlZ2lzdGVycywgYXNzdW1pbmcgd2UgYXJlIGluIHBhZ2UgMC4gKi8KKwllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gZWlfaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gZWlfaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIxKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gZWlfaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gJmVpX2xvY2FsLT5zdGF0OworfQorCisvKgorICogRm9ybSB0aGUgNjQgYml0IDgzOTAgbXVsdGljYXN0IHRhYmxlIGZyb20gdGhlIGxpbmtlZCBsaXN0IG9mIGFkZHJlc3NlcworICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2IHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9tY19iaXRzKHU4ICpiaXRzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisJZm9yIChkbWk9ZGV2LT5tY19saXN0OyBkbWk7IGRtaT1kbWktPm5leHQpCisJeworCQl1MzIgY3JjOworCQlpZiAoZG1pLT5kbWlfYWRkcmxlbiAhPSBFVEhfQUxFTikKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgbXVsdGljYXN0IGFkZHJlc3MgbGVuZ3RoIGdpdmVuLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNyYyA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgZG1pLT5kbWlfYWRkcik7CisJCS8qCisJCSAqIFRoZSA4MzkwIHVzZXMgdGhlIDYgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZQorCQkgKiBDUkMgdG8gaW5kZXggdGhlIG11bHRpY2FzdCB0YWJsZS4KKwkJICovCisJCWJpdHNbY3JjPj4yOV0gfD0gKDE8PCgoY3JjPj4yNikmNykpOworCX0KK30KKworLyoqCisgKiBkb19zZXRfbXVsdGljYXN0X2xpc3QgLSBzZXQvY2xlYXIgbXVsdGljYXN0IGZpbHRlcgorICogQGRldjogbmV0IGRldmljZSBmb3Igd2hpY2ggbXVsdGljYXN0IGZpbHRlciBpcyBhZGp1c3RlZAorICoKKyAqCVNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLiBNYXkgYmUgY2FsbGVkCisgKglmcm9tIGEgQkggaW4gMi4xLnguIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UqKW5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIShkZXYtPmZsYWdzJihJRkZfUFJPTUlTQ3xJRkZfQUxMTVVMVEkpKSkKKwl7CisJCW1lbXNldChlaV9sb2NhbC0+bWNmaWx0ZXIsIDAsIDgpOworCQlpZiAoZGV2LT5tY19saXN0KQorCQkJbWFrZV9tY19iaXRzKGVpX2xvY2FsLT5tY2ZpbHRlciwgZGV2KTsKKwl9CisJZWxzZQorCQltZW1zZXQoZWlfbG9jYWwtPm1jZmlsdGVyLCAweEZGLCA4KTsJLyogbWNhc3Qgc2V0IHRvIGFjY2VwdC1hbGwgKi8KKworCS8qCisJICogRFA4MzkwIG1hbnVhbHMgZG9uJ3Qgc3BlY2lmeSBhbnkgbWFnaWMgc2VxdWVuY2UgZm9yIGFsdGVyaW5nCisJICogdGhlIG11bHRpY2FzdCByZWdzIG9uIGFuIGFscmVhZHkgcnVubmluZyBjYXJkLiBUbyBiZSBzYWZlLCB3ZQorCSAqIGVuc3VyZSBtdWx0aWNhc3QgbW9kZSBpcyBvZmYgcHJpb3IgdG8gbG9hZGluZyB1cCB0aGUgbmV3IGhhc2gKKwkgKiB0YWJsZS4gSWYgdGhpcyBwcm92ZXMgdG8gYmUgbm90IGVub3VnaCwgd2UgY2FuIGFsd2F5cyByZXNvcnQKKwkgKiB0byBzdG9wcGluZyB0aGUgTklDLCBsb2FkaW5nIHRoZSB0YWJsZSBhbmQgdGhlbiByZXN0YXJ0aW5nLgorCSAqCisJICogQnVnIEFsZXJ0ISAgVGhlIE1DIHJlZ3Mgb24gdGhlIFNNQyA4M0M2OTAgKFNNQyBFbGl0ZSBhbmQgU01DCisJICogRWxpdGUxNikgYXBwZWFyIHRvIGJlIHdyaXRlLW9ubHkuIFRoZSBOUyA4MzkwIGRhdGEgc2hlZXQgbGlzdHMKKwkgKiB0aGVtIGFzIHIvdyBzbyB0aGlzIGlzIGEgYnVnLiAgVGhlIFNNQyA4M0M3OTAgKFNNQyBVbHRyYSBhbmQKKwkgKiBVbHRyYTMyIEVJU0EpIGFwcGVhcnMgdG8gaGF2ZSB0aGlzIGJ1ZyBmaXhlZC4KKwkgKi8KKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCWVpX291dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKKwllaV9vdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJZWlfb3V0Yl9wKGVpX2xvY2FsLT5tY2ZpbHRlcltpXSwgZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKTsKKyNpZm5kZWYgQlVHXzgzQzY5MAorCQlpZihlaV9pbmJfcChlODM5MF9iYXNlICsgRU4xX01VTFRfU0hJRlQoaSkpIT1laV9sb2NhbC0+bWNmaWx0ZXJbaV0pCisJCQlwcmludGsoS0VSTl9FUlIgIk11bHRpY2FzdCBmaWx0ZXIgcmVhZC93cml0ZSBtaXNtYXAgJWRcbiIsaSk7CisjZW5kaWYKKwl9CisJZWlfb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCisgIAlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorICAJCWVpX291dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MTgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisJZWxzZSBpZihkZXYtPmZsYWdzJklGRl9BTExNVUxUSSB8fCBkZXYtPm1jX2xpc3QpCisgIAkJZWlfb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHgwOCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKKyAgCWVsc2UKKyAgCQllaV9vdXRiX3AoRTgzOTBfUlhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisgfQorCisvKgorICoJQ2FsbGVkIHdpdGhvdXQgbG9jayBoZWxkLiBUaGlzIGlzIGludm9rZWQgZnJvbSB1c2VyIGNvbnRleHQgYW5kIG1heQorICoJYmUgcGFyYWxsZWwgdG8ganVzdCBhYm91dCBldmVyeXRoaW5nIGVsc2UuIEl0cyBhbHNvIGZhaXJseSBxdWljayBhbmQKKyAqCW5vdCBjYWxsZWQgdG9vIG9mdGVuLiBNdXN0IHByb3RlY3QgYWdhaW5zdCBib3RoIGJoIGFuZCBpcnEgdXNlcnMKKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UqKW5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBldGhkZXZfc2V0dXAgLSBpbml0IHJlc3Qgb2YgODM5MCBkZXZpY2Ugc3RydWN0CisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgdG8gaW5pdAorICoKKyAqIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIDgzOTAgZGV2aWNlIHN0cnVjdHVyZS4gIERvIE5PVCBfX2luaXQKKyAqIHRoaXMsIGFzIGl0IGlzIHVzZWQgYnkgODM5MCBiYXNlZCBtb2R1bGFyIGRyaXZlcnMgdG9vLgorICovCisKK3N0YXRpYyB2b2lkIGV0aGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsodmVyc2lvbik7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlaV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzCT0gZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKworCWV0aGVyX3NldHVwKGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Cit9CisKKy8qKgorICogYWxsb2NfZWlfbmV0ZGV2IC0gYWxsb2NfZXRoZXJkZXYgY291bnRlcnBhcnQgZm9yIDgzOTAKKyAqIEBzaXplOiBleHRyYSBieXRlcyB0byBhbGxvY2F0ZQorICoKKyAqIEFsbG9jYXRlIDgzOTAtc3BlY2lmaWMgbmV0X2RldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpfX19fYWxsb2NfZWlfbmV0ZGV2KGludCBzaXplKQoreworCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBlaV9kZXZpY2UpICsgc2l6ZSwgImV0aCVkIiwKKwkJCQlldGhkZXZfc2V0dXApOworfQorCisKKworCisvKiBUaGlzIHBhZ2Ugb2YgZnVuY3Rpb25zIHNob3VsZCBiZSA4MzkwIGdlbmVyaWMgKi8KKy8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgdGhlICJOSUMiLiAqLworCisvKioKKyAqIE5TODM5MF9pbml0IC0gaW5pdGlhbGl6ZSA4MzkwIGhhcmR3YXJlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCisgKiBAc3RhcnRwOiBib29sZWFuLiAgbm9uLXplcm8gdmFsdWUgdG8gaW5pdGlhdGUgY2hpcCBwcm9jZXNzaW5nCisgKgorICoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgX19OUzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQoreworCXVuc2lnbmVkIGxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgZW5kY2ZnID0gZWlfbG9jYWwtPndvcmQxNgorCSAgICA/ICgweDQ4IHwgRU5EQ0ZHX1dUUyB8IChlaV9sb2NhbC0+YmlnZW5kaWFuID8gRU5EQ0ZHX0JPUyA6IDApKQorCSAgICA6IDB4NDg7CisKKwlpZihzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpIT00KQorICAgIAkJcGFuaWMoIjgzOTAuYzogaGVhZGVyIHN0cnVjdCBtaXNwYWNrZWRcbiIpOworCS8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aW5nIHRoZSBEUDgzOTAyLiAqLworCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7IC8qIDB4MjEgKi8KKwllaV9vdXRiX3AoZW5kY2ZnLCBlODM5MF9iYXNlICsgRU4wX0RDRkcpOwkvKiAweDQ4IG9yIDB4NDkgKi8KKwkvKiBDbGVhciB0aGUgcmVtb3RlIGJ5dGUgY291bnQgcmVnaXN0ZXJzLiAqLworCWVpX291dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9SQ05UTE8pOworCWVpX291dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9SQ05USEkpOworCS8qIFNldCB0byBtb25pdG9yIGFuZCBsb29wYmFjayBtb2RlIC0tIHRoaXMgaXMgdml0YWwhLiAqLworCWVpX291dGJfcChFODM5MF9SWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsgLyogMHgyMCAqLworCWVpX291dGJfcChFODM5MF9UWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsgLyogMHgwMiAqLworCS8qIFNldCB0aGUgdHJhbnNtaXQgcGFnZSBhbmQgcmVjZWl2ZSByaW5nLiAqLworCWVpX291dGJfcChlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKKwllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7CisJZWlfb3V0Yl9wKGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1NUQVJUUEcpOworCWVpX291dGJfcChlaV9sb2NhbC0+c3RvcF9wYWdlLTEsIGU4MzkwX2Jhc2UgKyBFTjBfQk9VTkRBUlkpOwkvKiAzYzUwMyBzYXlzIDB4M2YsTlMweDI2Ki8KKwllaV9sb2NhbC0+Y3VycmVudF9wYWdlID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CQkvKiBhc3NlcnQgYm91bmRhcnkrMSAqLworCWVpX291dGJfcChlaV9sb2NhbC0+c3RvcF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1NUT1BQRyk7CisJLyogQ2xlYXIgdGhlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgbWFzay4gKi8KKwllaV9vdXRiX3AoMHhGRiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCWVpX291dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCisJLyogQ29weSB0aGUgc3RhdGlvbiBhZGRyZXNzIGludG8gdGhlIERTODM5MCByZWdpc3RlcnMuICovCisKKwllaV9vdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHg2MSAqLworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwl7CisJCWVpX291dGJfcChkZXYtPmRldl9hZGRyW2ldLCBlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpOworCQlpZiAoZWlfZGVidWcgPiAxICYmIGVpX2luYl9wKGU4MzkwX2Jhc2UgKyBFTjFfUEhZU19TSElGVChpKSkhPWRldi0+ZGV2X2FkZHJbaV0pCisJCQlwcmludGsoS0VSTl9FUlIgIkh3LiBhZGRyZXNzIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOworCX0KKworCWVpX291dGJfcChlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMV9DVVJQQUcpOworCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWVpX2xvY2FsLT50eDEgPSBlaV9sb2NhbC0+dHgyID0gMDsKKwllaV9sb2NhbC0+dHhpbmcgPSAwOworCisJaWYgKHN0YXJ0cCkKKwl7CisJCWVpX291dGJfcCgweGZmLCAgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQllaV9vdXRiX3AoRU5JU1JfQUxMLCAgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCQllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKwkJZWlfb3V0Yl9wKEU4MzkwX1RYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAvKiB4bWl0IG9uLiAqLworCQkvKiAzYzUwMyBUZWNoTWFuIHNheXMgcnhjb25maWcgb25seSBhZnRlciB0aGUgTklDIGlzIHN0YXJ0ZWQuICovCisJCWVpX291dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsgLyogcnggb24sICAqLworCQlkb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsJLyogKHJlKWxvYWQgdGhlIG1jYXN0IHRhYmxlICovCisJfQorfQorCisvKiBUcmlnZ2VyIGEgdHJhbnNtaXQgc3RhcnQsIGFzc3VtaW5nIHRoZSBsZW5ndGggaXMgdmFsaWQuCisgICBBbHdheXMgY2FsbGVkIHdpdGggdGhlIHBhZ2UgbG9jayBoZWxkICovCisKK3N0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpCit7CisJdW5zaWduZWQgbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisKKwllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKworCWlmIChlaV9pbmJfcChlODM5MF9iYXNlICsgRTgzOTBfQ01EKSAmIEU4MzkwX1RSQU5TKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyaWdnZXJfc2VuZCgpIGNhbGxlZCB3aXRoIHRoZSB0cmFuc21pdHRlciBidXN5LlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJZWlfb3V0Yl9wKGxlbmd0aCAmIDB4ZmYsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVExPKTsKKwllaV9vdXRiX3AobGVuZ3RoID4+IDgsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVEhJKTsKKwllaV9vdXRiX3Aoc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKKwllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfVFJBTlMrRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hYzgzOTAuYyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwppbmRleCBhZGU2ZmY4Li5hMTJiYjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjODM5MC5jCkBAIC0zOSw3ICszOSwxNiBAQAogI2luY2x1ZGUgPGFzbS9od3Rlc3QuaD4KICNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgogCi0jaW5jbHVkZSAiODM5MC5oIgorc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKwkibWFjODM5MC5jOiB2MC40IDIwMDEtMDUtMTUgRGF2aWQgSHVnZ2lucy1EYWluZXMgPGRoZEBkZWJpYW4ub3JnPiBhbmQgb3RoZXJzXG4iOworCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKyNkZWZpbmUgZWlfaW5iKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBlaV9vdXRiKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCisjZGVmaW5lIGVpX2luYl9wKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBlaV9vdXRiX3AodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKKworI2luY2x1ZGUgImxpYjgzOTAuYyIKIAogI2RlZmluZSBXRF9TVEFSVF9QRwkJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KICNkZWZpbmUgQ0FCTEVUUk9OX1JYX1NUQVJUX1BHCQkweDAwICAgIC8qIEZpcnN0IHBhZ2Ugb2YgUlggYnVmZmVyICovCkBAIC0xMTYsOSArMTI1LDYgQEAKIAkxLCAvKiBkYXluYS1sYyAqLwogfTsKIAotc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQotCSJtYWM4MzkwLmM6IHYwLjQgMjAwMS0wNS0xNSBEYXZpZCBIdWdnaW5zLURhaW5lcyA8ZGhkQGRlYmlhbi5vcmc+IGFuZCBvdGhlcnNcbiI7Ci0KIGV4dGVybiBlbnVtIG1hYzgzOTBfdHlwZSBtYWM4MzkwX2lkZW50KHN0cnVjdCBudWJ1c19kZXYgKiBkZXYpOwogZXh0ZXJuIGludCBtYWM4MzkwX21lbXNpemUodW5zaWduZWQgbG9uZyBtZW1iYXNlKTsKIGV4dGVybiBpbnQgbWFjODM5MF9tZW10ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKQEAgLTIzNyw3ICsyNDMsNyBAQAogCWlmICghTUFDSF9JU19NQUMpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCi0JZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldigwKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKQEAgLTQzOCw3ICs0NDQsNyBAQAogCWRldi0+b3BlbiA9ICZtYWM4MzkwX29wZW47CiAJZGV2LT5zdG9wID0gJm1hYzgzOTBfY2xvc2U7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBfX2VpX3BvbGw7CiAjZW5kaWYKIAogCS8qIEdBUiwgZWlfc3RhdHVzIGlzIGFjdHVhbGx5IGEgbWFjcm8gZXZlbiB0aG91Z2ggaXQgbG9va3MgZ2xvYmFsICovCkBAIC01MTAsNyArNTE2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlfX05TODM5MF9pbml0KGRldiwgMCk7CiAKIAkvKiBHb29kLCBkb25lLCBub3cgc3BpdCBvdXQgc29tZSBtZXNzYWdlcyAqLwogCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBpbiBzbG90ICVYICh0eXBlICVzKVxuIiwKQEAgLTUzMiw4ICs1MzgsOCBAQAogCiBzdGF0aWMgaW50IG1hYzgzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWVpX29wZW4oZGV2KTsKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgIjgzOTAgRXRoZXJuZXQiLCBkZXYpKSB7CisJX19laV9vcGVuKGRldik7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBfX2VpX2ludGVycnVwdCwgMCwgIjgzOTAgRXRoZXJuZXQiLCBkZXYpKSB7CiAJCXByaW50ayAoIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC01NDMsNyArNTQ5LDcgQEAKIHN0YXRpYyBpbnQgbWFjODM5MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCWVpX2Nsb3NlKGRldik7CisJX19laV9jbG9zZShkZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmMgYi9kcml2ZXJzL25ldC9tYWNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwY2U5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuYwpAQCAtMCwwICsxLDEyMTAgQEAKKy8qCisgKiBBdG1lbCBNQUNCIEV0aGVybmV0IENvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorCisjaW5jbHVkZSAibWFjYi5oIgorCisjZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKKworI2RlZmluZSBSWF9CVUZGRVJfU0laRQkJMTI4CisjZGVmaW5lIFJYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIFJYX1JJTkdfQllURVMJCShzaXplb2Yoc3RydWN0IGRtYV9kZXNjKSAqIFJYX1JJTkdfU0laRSkKKworLyogTWFrZSB0aGUgSVAgaGVhZGVyIHdvcmQtYWxpZ25lZCAodGhlIGV0aGVybmV0IGhlYWRlciBpcyAxNCBieXRlcykgKi8KKyNkZWZpbmUgUlhfT0ZGU0VUCQkyCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkxMjgKKyNkZWZpbmUgREVGX1RYX1JJTkdfUEVORElORwkoVFhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgVFhfUklOR19CWVRFUwkJKHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpICogVFhfUklOR19TSVpFKQorCisjZGVmaW5lIFRYX1JJTkdfR0FQKGJwKQkJCQkJCVwKKwkoVFhfUklOR19TSVpFIC0gKGJwKS0+dHhfcGVuZGluZykKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoYnApCQkJCQlcCisJKCgoYnApLT50eF90YWlsIDw9IChicCktPnR4X2hlYWQpID8JCQlcCisJIChicCktPnR4X3RhaWwgKyAoYnApLT50eF9wZW5kaW5nIC0gKGJwKS0+dHhfaGVhZCA6CVwKKwkgKGJwKS0+dHhfdGFpbCAtIChicCktPnR4X2hlYWQgLSBUWF9SSU5HX0dBUChicCkpCisjZGVmaW5lIE5FWFRfVFgobikJCSgoKG4pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgTkVYVF9SWChuKQkJKCgobikgKyAxKSAmIChSWF9SSU5HX1NJWkUgLSAxKSkKKworLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyBiZWZvcmUgd2FraW5nIHVwIFRYIHByb2Nlc3MgKi8KKyNkZWZpbmUgTUFDQl9UWF9XQUtFVVBfVEhSRVNICShUWF9SSU5HX1NJWkUgLyA0KQorCisjZGVmaW5lIE1BQ0JfUlhfSU5UX0ZMQUdTCShNQUNCX0JJVChSQ09NUCkgfCBNQUNCX0JJVChSWFVCUikJXAorCQkJCSB8IE1BQ0JfQklUKElTUl9ST1ZSKSkKKworc3RhdGljIHZvaWQgX19tYWNiX3NldF9od2FkZHIoc3RydWN0IG1hY2IgKmJwKQoreworCXUzMiBib3R0b207CisJdTE2IHRvcDsKKworCWJvdHRvbSA9IGNwdV90b19sZTMyKCooKHUzMiAqKWJwLT5kZXYtPmRldl9hZGRyKSk7CisJbWFjYl93cml0ZWwoYnAsIFNBMUIsIGJvdHRvbSk7CisJdG9wID0gY3B1X3RvX2xlMTYoKigodTE2ICopKGJwLT5kZXYtPmRldl9hZGRyICsgNCkpKTsKKwltYWNiX3dyaXRlbChicCwgU0ExVCwgdG9wKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1hY2JfZ2V0X2h3YWRkcihzdHJ1Y3QgbWFjYiAqYnApCit7CisJdTMyIGJvdHRvbTsKKwl1MTYgdG9wOworCXU4IGFkZHJbNl07CisKKwlib3R0b20gPSBtYWNiX3JlYWRsKGJwLCBTQTFCKTsKKwl0b3AgPSBtYWNiX3JlYWRsKGJwLCBTQTFUKTsKKworCWFkZHJbMF0gPSBib3R0b20gJiAweGZmOworCWFkZHJbMV0gPSAoYm90dG9tID4+IDgpICYgMHhmZjsKKwlhZGRyWzJdID0gKGJvdHRvbSA+PiAxNikgJiAweGZmOworCWFkZHJbM10gPSAoYm90dG9tID4+IDI0KSAmIDB4ZmY7CisJYWRkcls0XSA9IHRvcCAmIDB4ZmY7CisJYWRkcls1XSA9ICh0b3AgPj4gOCkgJiAweGZmOworCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcikpCisJCW1lbWNweShicC0+ZGV2LT5kZXZfYWRkciwgYWRkciwgc2l6ZW9mKGFkZHIpKTsKK30KKworc3RhdGljIHZvaWQgbWFjYl9lbmFibGVfbWRpbyhzdHJ1Y3QgbWFjYiAqYnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcmVnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJcmVnID0gbWFjYl9yZWFkbChicCwgTkNSKTsKKwlyZWcgfD0gTUFDQl9CSVQoTVBFKTsKKwltYWNiX3dyaXRlbChicCwgTkNSLCByZWcpOworCW1hY2Jfd3JpdGVsKGJwLCBJRVIsIE1BQ0JfQklUKE1GRCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2JfZGlzYWJsZV9tZGlvKHN0cnVjdCBtYWNiICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByZWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlyZWcgPSBtYWNiX3JlYWRsKGJwLCBOQ1IpOworCXJlZyAmPSB+TUFDQl9CSVQoTVBFKTsKKwltYWNiX3dyaXRlbChicCwgTkNSLCByZWcpOworCW1hY2Jfd3JpdGVsKGJwLCBJRFIsIE1BQ0JfQklUKE1GRCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbWFjYl9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbHVlOworCisJbXV0ZXhfbG9jaygmYnAtPm1kaW9fbXV0ZXgpOworCisJbWFjYl9lbmFibGVfbWRpbyhicCk7CisJbWFjYl93cml0ZWwoYnAsIE1BTiwgKE1BQ0JfQkYoU09GLCBNQUNCX01BTl9TT0YpCisJCQkgICAgICB8IE1BQ0JfQkYoUlcsIE1BQ0JfTUFOX1JFQUQpCisJCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgcGh5X2lkKQorCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIGxvY2F0aW9uKQorCQkJICAgICAgfCBNQUNCX0JGKENPREUsIE1BQ0JfTUFOX0NPREUpKSk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisKKwl2YWx1ZSA9IE1BQ0JfQkZFWFQoREFUQSwgbWFjYl9yZWFkbChicCwgTUFOKSk7CisJbWFjYl9kaXNhYmxlX21kaW8oYnApOworCW11dGV4X3VubG9jaygmYnAtPm1kaW9fbXV0ZXgpOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBtYWNiX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwKKwkJCSAgICBpbnQgbG9jYXRpb24sIGludCB2YWwpCit7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJtZGlvX3dyaXRlICUwMng6JTAyeCA8LSAlMDR4XG4iLAorCQlwaHlfaWQsIGxvY2F0aW9uLCB2YWwpOworCisJbXV0ZXhfbG9jaygmYnAtPm1kaW9fbXV0ZXgpOworCW1hY2JfZW5hYmxlX21kaW8oYnApOworCisJbWFjYl93cml0ZWwoYnAsIE1BTiwgKE1BQ0JfQkYoU09GLCBNQUNCX01BTl9TT0YpCisJCQkgICAgICB8IE1BQ0JfQkYoUlcsIE1BQ0JfTUFOX1dSSVRFKQorCQkJICAgICAgfCBNQUNCX0JGKFBIWUEsIHBoeV9pZCkKKwkJCSAgICAgIHwgTUFDQl9CRihSRUdBLCBsb2NhdGlvbikKKwkJCSAgICAgIHwgTUFDQl9CRihDT0RFLCBNQUNCX01BTl9DT0RFKQorCQkJICAgICAgfCBNQUNCX0JGKERBVEEsIHZhbCkpKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJwLT5tZGlvX2NvbXBsZXRlKTsKKworCW1hY2JfZGlzYWJsZV9tZGlvKGJwKTsKKwltdXRleF91bmxvY2soJmJwLT5tZGlvX211dGV4KTsKK30KKworc3RhdGljIGludCBtYWNiX3BoeV9wcm9iZShzdHJ1Y3QgbWFjYiAqYnApCit7CisJaW50IHBoeV9hZGRyZXNzOworCXUxNiBwaHlpZDEsIHBoeWlkMjsKKworCWZvciAocGh5X2FkZHJlc3MgPSAwOyBwaHlfYWRkcmVzcyA8IDMyOyBwaHlfYWRkcmVzcysrKSB7CisJCXBoeWlkMSA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMSk7CisJCXBoeWlkMiA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMik7CisKKwkJaWYgKHBoeWlkMSAhPSAweGZmZmYgJiYgcGh5aWQxICE9IDB4MDAwMAorCQkgICAgJiYgcGh5aWQyICE9IDB4ZmZmZiAmJiBwaHlpZDIgIT0gMHgwMDAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBoeV9hZGRyZXNzID09IDMyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9pbmZvKCZicC0+cGRldi0+ZGV2LAorCQkgImRldGVjdGVkIFBIWSBhdCBhZGRyZXNzICVkIChJRCAlMDR4OiUwNHgpXG4iLAorCQkgcGh5X2FkZHJlc3MsIHBoeWlkMSwgcGh5aWQyKTsKKworCWJwLT5taWkucGh5X2lkID0gcGh5X2FkZHJlc3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2Jfc2V0X21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG1lZGlhKQoreworCXUzMiByZWc7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJcmVnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOworCXJlZyAmPSB+KE1BQ0JfQklUKFNQRCkgfCBNQUNCX0JJVChGRCkpOworCWlmIChtZWRpYSAmIChBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKSkKKwkJcmVnIHw9IE1BQ0JfQklUKFNQRCk7CisJaWYgKG1lZGlhICYgQURWRVJUSVNFX0ZVTEwpCisJCXJlZyB8PSBNQUNCX0JJVChGRCk7CisJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCByZWcpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBtYWNiX2NoZWNrX21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG9rX3RvX3ByaW50LCBpbnQgaW5pdF9tZWRpYSkKK3sKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSA9ICZicC0+bWlpOworCXVuc2lnbmVkIGludCBvbGRfY2FycmllciwgbmV3X2NhcnJpZXI7CisJaW50IGFkdmVydGlzZSwgbHBhLCBtZWRpYSwgZHVwbGV4OworCisJLyogaWYgZm9yY2VkIG1lZGlhLCBnbyBubyBmdXJ0aGVyICovCisJaWYgKG1paS0+Zm9yY2VfbWVkaWEpCisJCXJldHVybjsKKworCS8qIGNoZWNrIGN1cnJlbnQgYW5kIG9sZCBsaW5rIHN0YXR1cyAqLworCW9sZF9jYXJyaWVyID0gbmV0aWZfY2Fycmllcl9vayhtaWktPmRldikgPyAxIDogMDsKKwluZXdfY2FycmllciA9ICh1bnNpZ25lZCBpbnQpIG1paV9saW5rX29rKG1paSk7CisKKwkvKiBpZiBjYXJyaWVyIHN0YXRlIGRpZCBub3QgY2hhbmdlLCBhc3N1bWUgbm90aGluZyBlbHNlIGRpZCAqLworCWlmICghaW5pdF9tZWRpYSAmJiBvbGRfY2FycmllciA9PSBuZXdfY2FycmllcikKKwkJcmV0dXJuOworCisJLyogbm8gY2Fycmllciwgbm90aGluZyBtdWNoIHRvIGRvICovCisJaWYgKCFuZXdfY2FycmllcikgeworCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIG1paS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogd2UgaGF2ZSBjYXJyaWVyLCBzZWUgd2hvJ3Mgb24gdGhlIG90aGVyIGVuZAorCSAqLworCW5ldGlmX2NhcnJpZXJfb24obWlpLT5kZXYpOworCisJLyogZ2V0IE1JSSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KKwlpZiAoIWluaXRfbWVkaWEgJiYgbWlpLT5hZHZlcnRpc2luZykgeworCQlhZHZlcnRpc2UgPSBtaWktPmFkdmVydGlzaW5nOworCX0gZWxzZSB7CisJCWFkdmVydGlzZSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7CisJCW1paS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisJfQorCWxwYSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CisKKwkvKiBmaWd1cmUgb3V0IG1lZGlhIGFuZCBkdXBsZXggZnJvbSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KKwltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHZlcnRpc2UpOworCWR1cGxleCA9IChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKSA/IDEgOiAwOworCisJaWYgKG9rX3RvX3ByaW50KQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXNNYnBzLCAlcy1kdXBsZXgsIGxwYSAweCUwNFhcbiIsCisJCSAgICAgICBtaWktPmRldi0+bmFtZSwKKwkJICAgICAgIG1lZGlhICYgKEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwMEhBTEYpID8gIjEwMCIgOiAiMTAiLAorCQkgICAgICAgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLCBscGEpOworCisJbWlpLT5mdWxsX2R1cGxleCA9IGR1cGxleDsKKworCS8qIExldCB0aGUgTUFDIGtub3cgYWJvdXQgdGhlIG5ldyBsaW5rIHN0YXRlICovCisJbWFjYl9zZXRfbWVkaWEoYnAsIG1lZGlhKTsKK30KKworc3RhdGljIHZvaWQgbWFjYl91cGRhdGVfc3RhdHMoc3RydWN0IG1hY2IgKmJwKQoreworCXUzMiBfX2lvbWVtICpyZWcgPSBicC0+cmVncyArIE1BQ0JfUEZSOworCXUzMiAqcCA9ICZicC0+aHdfc3RhdHMucnhfcGF1c2VfZnJhbWVzOworCXUzMiAqZW5kID0gJmJwLT5od19zdGF0cy50eF9wYXVzZV9mcmFtZXMgKyAxOworCisJV0FSTl9PTigodW5zaWduZWQgbG9uZykoZW5kIC0gcCAtIDEpICE9IChNQUNCX1RQRiAtIE1BQ0JfUEZSKSAvIDQpOworCisJZm9yKDsgcCA8IGVuZDsgcCsrLCByZWcrKykKKwkJKnAgKz0gcmVhZGwocmVnKTsKK30KKworc3RhdGljIHZvaWQgbWFjYl9wZXJpb2RpY190YXNrKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBhcmc7CisKKwltYWNiX3VwZGF0ZV9zdGF0cyhicCk7CisJbWFjYl9jaGVja19tZWRpYShicCwgMSwgMCk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2JfdHgoc3RydWN0IG1hY2IgKmJwKQoreworCXVuc2lnbmVkIGludCB0YWlsOworCXVuc2lnbmVkIGludCBoZWFkOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBtYWNiX3JlYWRsKGJwLCBUU1IpOworCW1hY2Jfd3JpdGVsKGJwLCBUU1IsIHN0YXR1cyk7CisKKwlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAibWFjYl90eCBzdGF0dXMgPSAlMDJseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBNQUNCX0JJVChVTkQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRYIHVuZGVycnVuLCByZXNldHRpbmcgYnVmZmVyc1xuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQlicC0+dHhfaGVhZCA9IGJwLT50eF90YWlsID0gMDsKKwl9CisKKwlpZiAoIShzdGF0dXMgJiBNQUNCX0JJVChDT01QKSkpCisJCS8qCisJCSAqIFRoaXMgbWF5IGhhcHBlbiB3aGVuIGEgYnVmZmVyIGJlY29tZXMgY29tcGxldGUKKwkJICogYmV0d2VlbiByZWFkaW5nIHRoZSBJU1IgYW5kIHNjYW5uaW5nIHRoZQorCQkgKiBkZXNjcmlwdG9ycy4gIE5vdGhpbmcgdG8gd29ycnkgYWJvdXQuCisJCSAqLworCQlyZXR1cm47CisKKwloZWFkID0gYnAtPnR4X2hlYWQ7CisJZm9yICh0YWlsID0gYnAtPnR4X3RhaWw7IHRhaWwgIT0gaGVhZDsgdGFpbCA9IE5FWFRfVFgodGFpbCkpIHsKKwkJc3RydWN0IHJpbmdfaW5mbyAqcnAgPSAmYnAtPnR4X3NrYlt0YWlsXTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJwLT5za2I7CisJCXUzMiBidWZzdGF0OworCisJCUJVR19PTihza2IgPT0gTlVMTCk7CisKKwkJcm1iKCk7CisJCWJ1ZnN0YXQgPSBicC0+dHhfcmluZ1t0YWlsXS5jdHJsOworCisJCWlmICghKGJ1ZnN0YXQgJiBNQUNCX0JJVChUWF9VU0VEKSkpCisJCQlicmVhazsKKworCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAic2tiICV1IChkYXRhICVwKSBUWCBjb21wbGV0ZVxuIiwKKwkJCXRhaWwsIHNrYi0+ZGF0YSk7CisJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIHJwLT5tYXBwaW5nLCBza2ItPmxlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisJCWJwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWJwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcnAtPnNrYiA9IE5VTEw7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorCisJYnAtPnR4X3RhaWwgPSB0YWlsOworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGJwLT5kZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMKGJwKSA+IE1BQ0JfVFhfV0FLRVVQX1RIUkVTSCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShicC0+ZGV2KTsKK30KKworc3RhdGljIGludCBtYWNiX3J4X2ZyYW1lKHN0cnVjdCBtYWNiICpicCwgdW5zaWduZWQgaW50IGZpcnN0X2ZyYWcsCisJCQkgdW5zaWduZWQgaW50IGxhc3RfZnJhZykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBmcmFnOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlsZW4gPSBNQUNCX0JGRVhUKFJYX0ZSTUxFTiwgYnAtPnJ4X3JpbmdbbGFzdF9mcmFnXS5jdHJsKTsKKworCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJtYWNiX3J4X2ZyYW1lIGZyYWdzICV1IC0gJXUgKGxlbiAldSlcbiIsCisJCWZpcnN0X2ZyYWcsIGxhc3RfZnJhZywgbGVuKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgUlhfT0ZGU0VUKTsKKwlpZiAoIXNrYikgeworCQlicC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlmb3IgKGZyYWcgPSBmaXJzdF9mcmFnOyA7IGZyYWcgPSBORVhUX1JYKGZyYWcpKSB7CisJCQlicC0+cnhfcmluZ1tmcmFnXS5hZGRyICY9IH5NQUNCX0JJVChSWF9VU0VEKTsKKwkJCWlmIChmcmFnID09IGxhc3RfZnJhZykKKwkJCQlicmVhazsKKwkJfQorCQl3bWIoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOworCXNrYi0+ZGV2ID0gYnAtPmRldjsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJc2tiX3B1dChza2IsIGxlbik7CisKKwlmb3IgKGZyYWcgPSBmaXJzdF9mcmFnOyA7IGZyYWcgPSBORVhUX1JYKGZyYWcpKSB7CisJCXVuc2lnbmVkIGludCBmcmFnX2xlbiA9IFJYX0JVRkZFUl9TSVpFOworCisJCWlmIChvZmZzZXQgKyBmcmFnX2xlbiA+IGxlbikgeworCQkJQlVHX09OKGZyYWcgIT0gbGFzdF9mcmFnKTsKKwkJCWZyYWdfbGVuID0gbGVuIC0gb2Zmc2V0OworCQl9CisJCW1lbWNweShza2ItPmRhdGEgKyBvZmZzZXQsCisJCSAgICAgICBicC0+cnhfYnVmZmVycyArIChSWF9CVUZGRVJfU0laRSAqIGZyYWcpLAorCQkgICAgICAgZnJhZ19sZW4pOworCQlvZmZzZXQgKz0gUlhfQlVGRkVSX1NJWkU7CisJCWJwLT5yeF9yaW5nW2ZyYWddLmFkZHIgJj0gfk1BQ0JfQklUKFJYX1VTRUQpOworCQl3bWIoKTsKKworCQlpZiAoZnJhZyA9PSBsYXN0X2ZyYWcpCisJCQlicmVhazsKKwl9CisKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBicC0+ZGV2KTsKKworCWJwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJYnAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAicmVjZWl2ZWQgc2tiIG9mIGxlbmd0aCAldSwgY3N1bTogJTA4eFxuIiwKKwkJc2tiLT5sZW4sIHNrYi0+Y3N1bSk7CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKiBNYXJrIERNQSBkZXNjcmlwdG9ycyBmcm9tIGJlZ2luIHVwIHRvIGFuZCBub3QgaW5jbHVkaW5nIGVuZCBhcyB1bnVzZWQgKi8KK3N0YXRpYyB2b2lkIGRpc2NhcmRfcGFydGlhbF9mcmFtZShzdHJ1Y3QgbWFjYiAqYnAsIHVuc2lnbmVkIGludCBiZWdpbiwKKwkJCQkgIHVuc2lnbmVkIGludCBlbmQpCit7CisJdW5zaWduZWQgaW50IGZyYWc7CisKKwlmb3IgKGZyYWcgPSBiZWdpbjsgZnJhZyAhPSBlbmQ7IGZyYWcgPSBORVhUX1JYKGZyYWcpKQorCQlicC0+cnhfcmluZ1tmcmFnXS5hZGRyICY9IH5NQUNCX0JJVChSWF9VU0VEKTsKKwl3bWIoKTsKKworCS8qCisJICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBoYXJkd2FyZSBzdGF0cyByZWdpc3RlcnMgZm9yCisJICogd2hhdGV2ZXIgY2F1c2VkIHRoaXMgaXMgdXBkYXRlZCwgc28gd2UgZG9uJ3QgaGF2ZSB0byByZWNvcmQKKwkgKiBhbnl0aGluZy4KKwkgKi8KK30KKworc3RhdGljIGludCBtYWNiX3J4KHN0cnVjdCBtYWNiICpicCwgaW50IGJ1ZGdldCkKK3sKKwlpbnQgcmVjZWl2ZWQgPSAwOworCXVuc2lnbmVkIGludCB0YWlsID0gYnAtPnJ4X3RhaWw7CisJaW50IGZpcnN0X2ZyYWcgPSAtMTsKKworCWZvciAoOyBidWRnZXQgPiAwOyB0YWlsID0gTkVYVF9SWCh0YWlsKSkgeworCQl1MzIgYWRkciwgY3RybDsKKworCQlybWIoKTsKKwkJYWRkciA9IGJwLT5yeF9yaW5nW3RhaWxdLmFkZHI7CisJCWN0cmwgPSBicC0+cnhfcmluZ1t0YWlsXS5jdHJsOworCisJCWlmICghKGFkZHIgJiBNQUNCX0JJVChSWF9VU0VEKSkpCisJCQlicmVhazsKKworCQlpZiAoY3RybCAmIE1BQ0JfQklUKFJYX1NPRikpIHsKKwkJCWlmIChmaXJzdF9mcmFnICE9IC0xKQorCQkJCWRpc2NhcmRfcGFydGlhbF9mcmFtZShicCwgZmlyc3RfZnJhZywgdGFpbCk7CisJCQlmaXJzdF9mcmFnID0gdGFpbDsKKwkJfQorCisJCWlmIChjdHJsICYgTUFDQl9CSVQoUlhfRU9GKSkgeworCQkJaW50IGRyb3BwZWQ7CisJCQlCVUdfT04oZmlyc3RfZnJhZyA9PSAtMSk7CisKKwkJCWRyb3BwZWQgPSBtYWNiX3J4X2ZyYW1lKGJwLCBmaXJzdF9mcmFnLCB0YWlsKTsKKwkJCWZpcnN0X2ZyYWcgPSAtMTsKKwkJCWlmICghZHJvcHBlZCkgeworCQkJCXJlY2VpdmVkKys7CisJCQkJYnVkZ2V0LS07CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZmlyc3RfZnJhZyAhPSAtMSkKKwkJYnAtPnJ4X3RhaWwgPSBmaXJzdF9mcmFnOworCWVsc2UKKwkJYnAtPnJ4X3RhaWwgPSB0YWlsOworCisJcmV0dXJuIHJlY2VpdmVkOworfQorCitzdGF0aWMgaW50IG1hY2JfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBvcmlnX2J1ZGdldCwgd29ya19kb25lLCByZXR2YWwgPSAwOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBtYWNiX3JlYWRsKGJwLCBSU1IpOworCW1hY2Jfd3JpdGVsKGJwLCBSU1IsIHN0YXR1cyk7CisKKwlpZiAoIXN0YXR1cykgeworCQkvKgorCQkgKiBUaGlzIG1heSBoYXBwZW4gaWYgYW4gaW50ZXJydXB0IHdhcyBwZW5kaW5nIGJlZm9yZQorCQkgKiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgbGFzdCB0aW1lLCBhbmQgbm8gcGFja2V0cworCQkgKiBoYXZlIGJlZW4gcmVjZWl2ZWQgc2luY2UuCisJCSAqLworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAicG9sbDogc3RhdHVzID0gJTA4bHgsIGJ1ZGdldCA9ICVkXG4iLAorCQkodW5zaWduZWQgbG9uZylzdGF0dXMsICpidWRnZXQpOworCisJaWYgKCEoc3RhdHVzICYgTUFDQl9CSVQoUkVDKSkpIHsKKwkJZGV2X3dhcm4oJmJwLT5wZGV2LT5kZXYsCisJCQkgIk5vIFJYIGJ1ZmZlcnMgY29tcGxldGUsIHN0YXR1cyA9ICUwMmx4XG4iLAorCQkJICh1bnNpZ25lZCBsb25nKXN0YXR1cyk7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCWdvdG8gb3V0OworCX0KKworCW9yaWdfYnVkZ2V0ID0gKmJ1ZGdldDsKKwlpZiAob3JpZ19idWRnZXQgPiBkZXYtPnF1b3RhKQorCQlvcmlnX2J1ZGdldCA9IGRldi0+cXVvdGE7CisKKwl3b3JrX2RvbmUgPSBtYWNiX3J4KGJwLCBvcmlnX2J1ZGdldCk7CisJaWYgKHdvcmtfZG9uZSA8IG9yaWdfYnVkZ2V0KSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCXJldHZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gMTsKKwl9CisKKwkvKgorCSAqIFdlJ3ZlIGRvbmUgd2hhdCB3ZSBjYW4gdG8gY2xlYW4gdGhlIGJ1ZmZlcnMuIE1ha2Ugc3VyZSB3ZQorCSAqIGdldCBub3RpZmllZCB3aGVuIG5ldyBwYWNrZXRzIGFycml2ZS4KKwkgKi8KK291dDoKKwltYWNiX3dyaXRlbChicCwgSUVSLCBNQUNCX1JYX0lOVF9GTEFHUyk7CisKKwkvKiBUT0RPOiBIYW5kbGUgZXJyb3JzICovCisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjYl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gbWFjYl9yZWFkbChicCwgSVNSKTsKKworCWlmICh1bmxpa2VseSghc3RhdHVzKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZicC0+bG9jayk7CisKKwl3aGlsZSAoc3RhdHVzKSB7CisJCWlmIChzdGF0dXMgJiBNQUNCX0JJVChNRkQpKQorCQkJY29tcGxldGUoJmJwLT5tZGlvX2NvbXBsZXRlKTsKKworCQkvKiBjbG9zZSBwb3NzaWJsZSByYWNlIHdpdGggZGV2X2Nsb3NlICovCisJCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgeworCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgfjBVTCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBNQUNCX1JYX0lOVF9GTEFHUykgeworCQkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJCS8qCisJCQkJICogVGhlcmUncyBubyBwb2ludCB0YWtpbmcgYW55IG1vcmUgaW50ZXJydXB0cworCQkJCSAqIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBidWZmZXJzCisJCQkJICovCisJCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgTUFDQl9SWF9JTlRfRkxBR1MpOworCQkJCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJzY2hlZHVsaW5nIFJYIHNvZnRpcnFcbiIpOworCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJCX0KKwkJfQorCisJCWlmIChzdGF0dXMgJiAoTUFDQl9CSVQoVENPTVApIHwgTUFDQl9CSVQoSVNSX1RVTkQpKSkKKwkJCW1hY2JfdHgoYnApOworCisJCS8qCisJCSAqIExpbmsgY2hhbmdlIGRldGVjdGlvbiBpc24ndCBwb3NzaWJsZSB3aXRoIFJNSUksIHNvIHdlJ2xsCisJCSAqIGFkZCB0aGF0IGlmL3doZW4gd2UgZ2V0IG91ciBoYW5kcyBvbiBhIGZ1bGwtYmxvd24gTUlJIFBIWS4KKwkJICovCisKKwkJaWYgKHN0YXR1cyAmIE1BQ0JfQklUKEhSRVNQKSkgeworCQkJLyoKKwkJCSAqIFRPRE86IFJlc2V0IHRoZSBoYXJkd2FyZSwgYW5kIG1heWJlIG1vdmUgdGhlIHByaW50aworCQkJICogdG8gYSBsb3dlci1wcmlvcml0eSBjb250ZXh0IGFzIHdlbGwgKHdvcmsgcXVldWU/KQorCQkJICovCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgYnVzIGVycm9yOiBIUkVTUCBub3QgT0tcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJfQorCisJCXN0YXR1cyA9IG1hY2JfcmVhZGwoYnAsIElTUik7CisJfQorCisJc3Bpbl91bmxvY2soJmJwLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBtYWNiX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwl1bnNpZ25lZCBpbnQgbGVuLCBlbnRyeTsKKwl1MzIgY3RybDsKKworI2lmZGVmIERFQlVHCisJaW50IGk7CisJZGV2X2RiZygmYnAtPnBkZXYtPmRldiwKKwkJInN0YXJ0X3htaXQ6IGxlbiAldSBoZWFkICVwIGRhdGEgJXAgdGFpbCAlcCBlbmQgJXBcbiIsCisJCXNrYi0+bGVuLCBza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT50YWlsLCBza2ItPmVuZCk7CisJZGV2X2RiZygmYnAtPnBkZXYtPmRldiwKKwkJImRhdGE6Iik7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXByaW50aygiICUwMngiLCAodW5zaWduZWQgaW50KXNrYi0+ZGF0YVtpXSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlsZW4gPSBza2ItPmxlbjsKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCWlmIChUWF9CVUZGU19BVkFJTChicCkgPCAxKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCisJCQkiQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIpOworCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAidHhfaGVhZCA9ICV1LCB0eF90YWlsID0gJXVcbiIsCisJCQlicC0+dHhfaGVhZCwgYnAtPnR4X3RhaWwpOworCQlyZXR1cm4gMTsKKwl9CisKKwllbnRyeSA9IGJwLT50eF9oZWFkOworCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJBbGxvY2F0ZWQgcmluZyBlbnRyeSAldVxuIiwgZW50cnkpOworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgc2tiLT5kYXRhLAorCQkJCSBsZW4sIERNQV9UT19ERVZJQ0UpOworCWJwLT50eF9za2JbZW50cnldLnNrYiA9IHNrYjsKKwlicC0+dHhfc2tiW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZzsKKwlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAiTWFwcGVkIHNrYiBkYXRhICVwIHRvIERNQSBhZGRyICUwOGx4XG4iLAorCQlza2ItPmRhdGEsICh1bnNpZ25lZCBsb25nKW1hcHBpbmcpOworCisJY3RybCA9IE1BQ0JfQkYoVFhfRlJNTEVOLCBsZW4pOworCWN0cmwgfD0gTUFDQl9CSVQoVFhfTEFTVCk7CisJaWYgKGVudHJ5ID09IChUWF9SSU5HX1NJWkUgLSAxKSkKKwkJY3RybCB8PSBNQUNCX0JJVChUWF9XUkFQKTsKKworCWJwLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gbWFwcGluZzsKKwlicC0+dHhfcmluZ1tlbnRyeV0uY3RybCA9IGN0cmw7CisJd21iKCk7CisKKwllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCWJwLT50eF9oZWFkID0gZW50cnk7CisKKwltYWNiX3dyaXRlbChicCwgTkNSLCBtYWNiX3JlYWRsKGJwLCBOQ1IpIHwgTUFDQl9CSVQoVFNUQVJUKSk7CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwoYnApIDwgMSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYWNiX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgbWFjYiAqYnApCit7CisJaWYgKGJwLT50eF9za2IpIHsKKwkJa2ZyZWUoYnAtPnR4X3NrYik7CisJCWJwLT50eF9za2IgPSBOVUxMOworCX0KKwlpZiAoYnAtPnJ4X3JpbmcpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIFJYX1JJTkdfQllURVMsCisJCQkJICBicC0+cnhfcmluZywgYnAtPnJ4X3JpbmdfZG1hKTsKKwkJYnAtPnJ4X3JpbmcgPSBOVUxMOworCX0KKwlpZiAoYnAtPnR4X3JpbmcpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIFRYX1JJTkdfQllURVMsCisJCQkJICBicC0+dHhfcmluZywgYnAtPnR4X3JpbmdfZG1hKTsKKwkJYnAtPnR4X3JpbmcgPSBOVUxMOworCX0KKwlpZiAoYnAtPnJ4X2J1ZmZlcnMpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsCisJCQkJICBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGRVJfU0laRSwKKwkJCQkgIGJwLT5yeF9idWZmZXJzLCBicC0+cnhfYnVmZmVyc19kbWEpOworCQlicC0+cnhfYnVmZmVycyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IG1hY2JfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3QgbWFjYiAqYnApCit7CisJaW50IHNpemU7CisKKwlzaXplID0gVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pOworCWJwLT50eF9za2IgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnAtPnR4X3NrYikKKwkJZ290byBvdXRfZXJyOworCisJc2l6ZSA9IFJYX1JJTkdfQllURVM7CisJYnAtPnJ4X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIHNpemUsCisJCQkJCSAmYnAtPnJ4X3JpbmdfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwLT5yeF9yaW5nKQorCQlnb3RvIG91dF9lcnI7CisJZGV2X2RiZygmYnAtPnBkZXYtPmRldiwKKwkJIkFsbG9jYXRlZCBSWCByaW5nIG9mICVkIGJ5dGVzIGF0ICUwOGx4IChtYXBwZWQgJXApXG4iLAorCQlzaXplLCAodW5zaWduZWQgbG9uZylicC0+cnhfcmluZ19kbWEsIGJwLT5yeF9yaW5nKTsKKworCXNpemUgPSBUWF9SSU5HX0JZVEVTOworCWJwLT50eF9yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBzaXplLAorCQkJCQkgJmJwLT50eF9yaW5nX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicC0+dHhfcmluZykKKwkJZ290byBvdXRfZXJyOworCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsCisJCSJBbGxvY2F0ZWQgVFggcmluZyBvZiAlZCBieXRlcyBhdCAlMDhseCAobWFwcGVkICVwKVxuIiwKKwkJc2l6ZSwgKHVuc2lnbmVkIGxvbmcpYnAtPnR4X3JpbmdfZG1hLCBicC0+dHhfcmluZyk7CisKKwlzaXplID0gUlhfUklOR19TSVpFICogUlhfQlVGRkVSX1NJWkU7CisJYnAtPnJ4X2J1ZmZlcnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIHNpemUsCisJCQkJCSAgICAmYnAtPnJ4X2J1ZmZlcnNfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwLT5yeF9idWZmZXJzKQorCQlnb3RvIG91dF9lcnI7CisJZGV2X2RiZygmYnAtPnBkZXYtPmRldiwKKwkJIkFsbG9jYXRlZCBSWCBidWZmZXJzIG9mICVkIGJ5dGVzIGF0ICUwOGx4IChtYXBwZWQgJXApXG4iLAorCQlzaXplLCAodW5zaWduZWQgbG9uZylicC0+cnhfYnVmZmVyc19kbWEsIGJwLT5yeF9idWZmZXJzKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCW1hY2JfZnJlZV9jb25zaXN0ZW50KGJwKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgbWFjYl9pbml0X3JpbmdzKHN0cnVjdCBtYWNiICpicCkKK3sKKwlpbnQgaTsKKwlkbWFfYWRkcl90IGFkZHI7CisKKwlhZGRyID0gYnAtPnJ4X2J1ZmZlcnNfZG1hOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlicC0+cnhfcmluZ1tpXS5hZGRyID0gYWRkcjsKKwkJYnAtPnJ4X3JpbmdbaV0uY3RybCA9IDA7CisJCWFkZHIgKz0gUlhfQlVGRkVSX1NJWkU7CisJfQorCWJwLT5yeF9yaW5nW1JYX1JJTkdfU0laRSAtIDFdLmFkZHIgfD0gTUFDQl9CSVQoUlhfV1JBUCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJYnAtPnR4X3JpbmdbaV0uYWRkciA9IDA7CisJCWJwLT50eF9yaW5nW2ldLmN0cmwgPSBNQUNCX0JJVChUWF9VU0VEKTsKKwl9CisJYnAtPnR4X3JpbmdbVFhfUklOR19TSVpFIC0gMV0uY3RybCB8PSBNQUNCX0JJVChUWF9XUkFQKTsKKworCWJwLT5yeF90YWlsID0gYnAtPnR4X2hlYWQgPSBicC0+dHhfdGFpbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2JfcmVzZXRfaHcoc3RydWN0IG1hY2IgKmJwKQoreworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSB3cml0ZSBidWZmZXIgZm9yIG91cnNlbHZlcyAqLworCXdtYigpOworCisJLyoKKwkgKiBEaXNhYmxlIFJYIGFuZCBUWCAoWFhYOiBTaG91bGQgd2UgaGFsdCB0aGUgdHJhbnNtaXNzaW9uCisJICogbW9yZSBncmFjZWZ1bGx5PykKKwkgKi8KKwltYWNiX3dyaXRlbChicCwgTkNSLCAwKTsKKworCS8qIENsZWFyIHRoZSBzdGF0cyByZWdpc3RlcnMgKFhYWDogVXBkYXRlIHN0YXRzIGZpcnN0PykgKi8KKwltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChDTFJTVEFUKSk7CisKKwkvKiBDbGVhciBhbGwgc3RhdHVzIGZsYWdzICovCisJbWFjYl93cml0ZWwoYnAsIFRTUiwgfjBVTCk7CisJbWFjYl93cml0ZWwoYnAsIFJTUiwgfjBVTCk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJbWFjYl93cml0ZWwoYnAsIElEUiwgfjBVTCk7CisJbWFjYl9yZWFkbChicCwgSVNSKTsKK30KKworc3RhdGljIHZvaWQgbWFjYl9pbml0X2h3KHN0cnVjdCBtYWNiICpicCkKK3sKKwl1MzIgY29uZmlnOworCisJbWFjYl9yZXNldF9odyhicCk7CisJX19tYWNiX3NldF9od2FkZHIoYnApOworCisJY29uZmlnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpICYgTUFDQl9CRihDTEssIC0xTCk7CisJY29uZmlnIHw9IE1BQ0JfQklUKFBBRSk7CQkvKiBQQXVzZSBFbmFibGUgKi8KKwljb25maWcgfD0gTUFDQl9CSVQoRFJGQ1MpOwkJLyogRGlzY2FyZCBSeCBGQ1MgKi8KKwlpZiAoYnAtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJY29uZmlnIHw9IE1BQ0JfQklUKENBRik7CS8qIENvcHkgQWxsIEZyYW1lcyAqLworCWlmICghKGJwLT5kZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkpCisJCWNvbmZpZyB8PSBNQUNCX0JJVChOQkMpOwkvKiBObyBCcm9hZENhc3QgKi8KKwltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNvbmZpZyk7CisKKwkvKiBJbml0aWFsaXplIFRYIGFuZCBSWCBidWZmZXJzICovCisJbWFjYl93cml0ZWwoYnAsIFJCUVAsIGJwLT5yeF9yaW5nX2RtYSk7CisJbWFjYl93cml0ZWwoYnAsIFRCUVAsIGJwLT50eF9yaW5nX2RtYSk7CisKKwkvKiBFbmFibGUgVFggYW5kIFJYICovCisJbWFjYl93cml0ZWwoYnAsIE5DUiwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJbWFjYl93cml0ZWwoYnAsIElFUiwgKE1BQ0JfQklUKFJDT01QKQorCQkJICAgICAgfCBNQUNCX0JJVChSWFVCUikKKwkJCSAgICAgIHwgTUFDQl9CSVQoSVNSX1RVTkQpCisJCQkgICAgICB8IE1BQ0JfQklUKElTUl9STEUpCisJCQkgICAgICB8IE1BQ0JfQklUKFRYRVJSKQorCQkJICAgICAgfCBNQUNCX0JJVChUQ09NUCkKKwkJCSAgICAgIHwgTUFDQl9CSVQoSVNSX1JPVlIpCisJCQkgICAgICB8IE1BQ0JfQklUKEhSRVNQKSkpOworfQorCitzdGF0aWMgdm9pZCBtYWNiX2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFNldCBzb21lIHJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncyAqLworCW1hY2JfbWRpb193cml0ZShkZXYsIGJwLT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAorCQkJQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfQUxMKTsKKwltYWNiX21kaW9fd3JpdGUoZGV2LCBicC0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCisJCQkoQk1DUl9TUEVFRDEwMCB8IEJNQ1JfQU5FTkFCTEUKKwkJCSB8IEJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9GVUxMRFBMWCkpOworfQorCitzdGF0aWMgaW50IG1hY2Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJvcGVuXG4iKTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJZXJyID0gbWFjYl9hbGxvY19jb25zaXN0ZW50KGJwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgRE1BIG1lbW9yeSAoZXJyb3IgJWQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCW1hY2JfaW5pdF9yaW5ncyhicCk7CisJbWFjYl9pbml0X2h3KGJwKTsKKwltYWNiX2luaXRfcGh5KGRldik7CisKKwltYWNiX2NoZWNrX21lZGlhKGJwLCAxLCAxKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kaWNfdGFzaywgSFopOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjYl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCW1hY2JfcmVzZXRfaHcoYnApOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCW1hY2JfZnJlZV9jb25zaXN0ZW50KGJwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2JfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXQgPSAmYnAtPnN0YXRzOworCXN0cnVjdCBtYWNiX3N0YXRzICpod3N0YXQgPSAmYnAtPmh3X3N0YXRzOworCisJLyogQ29udmVydCBIVyBzdGF0cyBpbnRvIG5ldGRldmljZSBzdGF0cyAqLworCW5zdGF0LT5yeF9lcnJvcnMgPSAoaHdzdGF0LT5yeF9mY3NfZXJyb3JzICsKKwkJCSAgICBod3N0YXQtPnJ4X2FsaWduX2Vycm9ycyArCisJCQkgICAgaHdzdGF0LT5yeF9yZXNvdXJjZV9lcnJvcnMgKworCQkJICAgIGh3c3RhdC0+cnhfb3ZlcnJ1bnMgKworCQkJICAgIGh3c3RhdC0+cnhfb3ZlcnNpemVfcGt0cyArCisJCQkgICAgaHdzdGF0LT5yeF9qYWJiZXJzICsKKwkJCSAgICBod3N0YXQtPnJ4X3VuZGVyc2l6ZV9wa3RzICsKKwkJCSAgICBod3N0YXQtPnNxZV90ZXN0X2Vycm9ycyArCisJCQkgICAgaHdzdGF0LT5yeF9sZW5ndGhfbWlzbWF0Y2gpOworCW5zdGF0LT50eF9lcnJvcnMgPSAoaHdzdGF0LT50eF9sYXRlX2NvbHMgKworCQkJICAgIGh3c3RhdC0+dHhfZXhjZXNzaXZlX2NvbHMgKworCQkJICAgIGh3c3RhdC0+dHhfdW5kZXJydW5zICsKKwkJCSAgICBod3N0YXQtPnR4X2NhcnJpZXJfZXJyb3JzKTsKKwluc3RhdC0+Y29sbGlzaW9ucyA9IChod3N0YXQtPnR4X3NpbmdsZV9jb2xzICsKKwkJCSAgICAgaHdzdGF0LT50eF9tdWx0aXBsZV9jb2xzICsKKwkJCSAgICAgaHdzdGF0LT50eF9leGNlc3NpdmVfY29scyk7CisJbnN0YXQtPnJ4X2xlbmd0aF9lcnJvcnMgPSAoaHdzdGF0LT5yeF9vdmVyc2l6ZV9wa3RzICsKKwkJCQkgICBod3N0YXQtPnJ4X2phYmJlcnMgKworCQkJCSAgIGh3c3RhdC0+cnhfdW5kZXJzaXplX3BrdHMgKworCQkJCSAgIGh3c3RhdC0+cnhfbGVuZ3RoX21pc21hdGNoKTsKKwluc3RhdC0+cnhfb3Zlcl9lcnJvcnMgPSBod3N0YXQtPnJ4X3Jlc291cmNlX2Vycm9yczsKKwluc3RhdC0+cnhfY3JjX2Vycm9ycyA9IGh3c3RhdC0+cnhfZmNzX2Vycm9yczsKKwluc3RhdC0+cnhfZnJhbWVfZXJyb3JzID0gaHdzdGF0LT5yeF9hbGlnbl9lcnJvcnM7CisJbnN0YXQtPnJ4X2ZpZm9fZXJyb3JzID0gaHdzdGF0LT5yeF9vdmVycnVuczsKKwkvKiBYWFg6IFdoYXQgZG9lcyAibWlzc2VkIiBtZWFuPyAqLworCW5zdGF0LT50eF9hYm9ydGVkX2Vycm9ycyA9IGh3c3RhdC0+dHhfZXhjZXNzaXZlX2NvbHM7CisJbnN0YXQtPnR4X2NhcnJpZXJfZXJyb3JzID0gaHdzdGF0LT50eF9jYXJyaWVyX2Vycm9yczsKKwluc3RhdC0+dHhfZmlmb19lcnJvcnMgPSBod3N0YXQtPnR4X3VuZGVycnVuczsKKwkvKiBEb24ndCBrbm93IGFib3V0IGhlYXJ0YmVhdCBvciB3aW5kb3cgZXJyb3JzLi4uICovCisKKwlyZXR1cm4gbnN0YXQ7Cit9CisKK3N0YXRpYyBpbnQgbWFjYl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBtaWlfZXRodG9vbF9nc2V0KCZicC0+bWlpLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1hY2Jfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gbWlpX2V0aHRvb2xfc3NldCgmYnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWFjYl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBicC0+cGRldi0+ZGV2LmRyaXZlci0+bmFtZSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sICIkUmV2aXNpb246IDEuMTQgJCIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgYnAtPnBkZXYtPmRldi5idXNfaWQpOworfQorCitzdGF0aWMgaW50IG1hY2JfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmJwLT5taWkpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG1hY2JfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBtYWNiX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IG1hY2Jfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBtYWNiX2dldF9kcnZpbmZvLAorCS5ud2F5X3Jlc2V0CQk9IG1hY2JfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKK307CisKK3N0YXRpYyBpbnQgbWFjYl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gZ2VuZXJpY19taWlfaW9jdGwoJmJwLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1hY2JfbWlpX3Nob3coY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZiwKKwkJCXVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihjZCk7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWludCB2YWx1ZTsKKwkJdmFsdWUgPSBtYWNiX21kaW9fcmVhZChkZXYsIGJwLT5taWkucGh5X2lkLCBhZGRyKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIweCUwNHhcbiIsICh1aW50MTZfdCl2YWx1ZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBNSUlfRU5UUlkobmFtZSwgYWRkcikJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gbWFjYl9taWlfc2hvdyhjZCwgYnVmLCBhZGRyKTsJCQlcCit9CQkJCQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCisKK01JSV9FTlRSWShibWNyLCBNSUlfQk1DUik7CitNSUlfRU5UUlkoYm1zciwgTUlJX0JNU1IpOworTUlJX0VOVFJZKHBoeXNpZDEsIE1JSV9QSFlTSUQxKTsKK01JSV9FTlRSWShwaHlzaWQyLCBNSUlfUEhZU0lEMik7CitNSUlfRU5UUlkoYWR2ZXJ0aXNlLCBNSUlfQURWRVJUSVNFKTsKK01JSV9FTlRSWShscGEsIE1JSV9MUEEpOworTUlJX0VOVFJZKGV4cGFuc2lvbiwgTUlJX0VYUEFOU0lPTik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYWNiX21paV9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9ibWNyLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2Jtc3IuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcGh5c2lkMS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9waHlzaWQyLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2FkdmVydGlzZS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9scGEuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfZXhwYW5zaW9uLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1hY2JfbWlpX2dyb3VwID0geworCS5uYW1lCT0gIm1paSIsCisJLmF0dHJzCT0gbWFjYl9taWlfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBtYWNiX3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSAmbmV0LT5jbGFzc19kZXY7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsYXNzX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKK30KKworc3RhdGljIGludCBtYWNiX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0gJm5ldC0+Y2xhc3NfZGV2OworCWludCByZXQ7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsYXNzX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHN5c2ZzIG1paSBhdHRyaWJ1dGUgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBuZXQtPm5hbWUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hY2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtYWNiICpicDsKKwl1bnNpZ25lZCBsb25nIHBjbGtfaHo7CisJdTMyIGNvbmZpZzsKKwlpbnQgZXJyID0gLUVOWElPOworCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYnApKTsKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJldGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qIFRPRE86IEFjdHVhbGx5LCB3ZSBoYXZlIHNvbWUgaW50ZXJlc3RpbmcgZmVhdHVyZXMuLi4gKi8KKwlkZXYtPmZlYXR1cmVzIHw9IDA7CisKKwlicCA9IG5ldGRldl9wcml2KGRldik7CisJYnAtPnBkZXYgPSBwZGV2OworCWJwLT5kZXYgPSBkZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOworCisJYnAtPnBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7CisJaWYgKElTX0VSUihicC0+cGNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwY2xrXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKwlicC0+aGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKKwlpZiAoSVNfRVJSKGJwLT5oY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGhjbGtcbiIpOworCQlnb3RvIGVycl9vdXRfcHV0X3BjbGs7CisJfQorCisJY2xrX2VuYWJsZShicC0+cGNsayk7CisJY2xrX2VuYWJsZShicC0+aGNsayk7CisKKwlicC0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlZ3MtPmVuZCAtIHJlZ3MtPnN0YXJ0ICsgMSk7CisJaWYgKCFicC0+cmVncykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVycywgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfY2xvY2tzOworCX0KKworCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbWFjYl9pbnRlcnJ1cHQsIFNBX1NBTVBMRV9SQU5ET00sCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWQgKGVycm9yICVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGVycik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWRldi0+b3BlbiA9IG1hY2Jfb3BlbjsKKwlkZXYtPnN0b3AgPSBtYWNiX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbWFjYl9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gbWFjYl9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IG1hY2JfaW9jdGw7CisJZGV2LT5wb2xsID0gbWFjYl9wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZtYWNiX2V0aHRvb2xfb3BzOworCisJZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKKworCUlOSVRfV09SSygmYnAtPnBlcmlvZGljX3Rhc2ssIG1hY2JfcGVyaW9kaWNfdGFzaywgYnApOworCW11dGV4X2luaXQoJmJwLT5tZGlvX211dGV4KTsKKwlpbml0X2NvbXBsZXRpb24oJmJwLT5tZGlvX2NvbXBsZXRlKTsKKworCS8qIFNldCBNSUkgbWFuYWdlbWVudCBjbG9jayBkaXZpZGVyICovCisJcGNsa19oeiA9IGNsa19nZXRfcmF0ZShicC0+cGNsayk7CisJaWYgKHBjbGtfaHogPD0gMjAwMDAwMDApCisJCWNvbmZpZyA9IE1BQ0JfQkYoQ0xLLCBNQUNCX0NMS19ESVY4KTsKKwllbHNlIGlmIChwY2xrX2h6IDw9IDQwMDAwMDAwKQorCQljb25maWcgPSBNQUNCX0JGKENMSywgTUFDQl9DTEtfRElWMTYpOworCWVsc2UgaWYgKHBjbGtfaHogPD0gODAwMDAwMDApCisJCWNvbmZpZyA9IE1BQ0JfQkYoQ0xLLCBNQUNCX0NMS19ESVYzMik7CisJZWxzZQorCQljb25maWcgPSBNQUNCX0JGKENMSywgTUFDQl9DTEtfRElWNjQpOworCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgY29uZmlnKTsKKworCWJwLT5taWkuZGV2ID0gZGV2OworCWJwLT5taWkubWRpb19yZWFkID0gbWFjYl9tZGlvX3JlYWQ7CisJYnAtPm1paS5tZGlvX3dyaXRlID0gbWFjYl9tZGlvX3dyaXRlOworCWJwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCWJwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKworCW1hY2JfZ2V0X2h3YWRkcihicCk7CisJZXJyID0gbWFjYl9waHlfcHJvYmUoYnApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGRldGVjdCBQSFksIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2lycTsKKwl9CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSAmJiBwZGF0YS0+aXNfcm1paSkKKwkJbWFjYl93cml0ZWwoYnAsIFVTUklPLCAwKTsKKwllbHNlCisJCW1hY2Jfd3JpdGVsKGJwLCBVU1JJTywgTUFDQl9CSVQoTUlJKSk7CisKKwlicC0+dHhfcGVuZGluZyA9IERFRl9UWF9SSU5HX1BFTkRJTkc7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCW1hY2JfcmVnaXN0ZXJfc3lzZnMoZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdG1lbCBNQUNCIGF0IDB4JTA4bHggaXJxICVkICIKKwkgICAgICAgIiglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoYnAtPnJlZ3MpOworZXJyX291dF9kaXNhYmxlX2Nsb2NrczoKKwljbGtfZGlzYWJsZShicC0+aGNsayk7CisJY2xrX2Rpc2FibGUoYnAtPnBjbGspOworCWNsa19wdXQoYnAtPmhjbGspOworZXJyX291dF9wdXRfcGNsazoKKwljbGtfcHV0KGJwLT5wY2xrKTsKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2Vycl9vdXQ6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWFjYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtYWNiICpicDsKKworCWRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlicCA9IG5ldGRldl9wcml2KGRldik7CisJCW1hY2JfdW5yZWdpc3Rlcl9zeXNmcyhkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJaW91bm1hcChicC0+cmVncyk7CisJCWNsa19kaXNhYmxlKGJwLT5oY2xrKTsKKwkJY2xrX2Rpc2FibGUoYnAtPnBjbGspOworCQljbGtfcHV0KGJwLT5oY2xrKTsKKwkJY2xrX3B1dChicC0+cGNsayk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYWNiX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbWFjYl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1hY2JfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gIm1hY2IiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYWNiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtYWNiX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYWNiX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWFjYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtYWNiX2luaXQpOworbW9kdWxlX2V4aXQobWFjYl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBNQUNCIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmggYi9kcml2ZXJzL25ldC9tYWNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyNTNkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuaApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIEF0bWVsIE1BQ0IgRXRoZXJuZXQgQ29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX01BQ0JfSAorI2RlZmluZSBfTUFDQl9ICisKKy8qIE1BQ0IgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNQUNCX05DUgkJCQkweDAwMDAKKyNkZWZpbmUgTUFDQl9OQ0ZHUgkJCQkweDAwMDQKKyNkZWZpbmUgTUFDQl9OU1IJCQkJMHgwMDA4CisjZGVmaW5lIE1BQ0JfVFNSCQkJCTB4MDAxNAorI2RlZmluZSBNQUNCX1JCUVAJCQkJMHgwMDE4CisjZGVmaW5lIE1BQ0JfVEJRUAkJCQkweDAwMWMKKyNkZWZpbmUgTUFDQl9SU1IJCQkJMHgwMDIwCisjZGVmaW5lIE1BQ0JfSVNSCQkJCTB4MDAyNAorI2RlZmluZSBNQUNCX0lFUgkJCQkweDAwMjgKKyNkZWZpbmUgTUFDQl9JRFIJCQkJMHgwMDJjCisjZGVmaW5lIE1BQ0JfSU1SCQkJCTB4MDAzMAorI2RlZmluZSBNQUNCX01BTgkJCQkweDAwMzQKKyNkZWZpbmUgTUFDQl9QVFIJCQkJMHgwMDM4CisjZGVmaW5lIE1BQ0JfUEZSCQkJCTB4MDAzYworI2RlZmluZSBNQUNCX0ZUTwkJCQkweDAwNDAKKyNkZWZpbmUgTUFDQl9TQ0YJCQkJMHgwMDQ0CisjZGVmaW5lIE1BQ0JfTUNGCQkJCTB4MDA0OAorI2RlZmluZSBNQUNCX0ZSTwkJCQkweDAwNGMKKyNkZWZpbmUgTUFDQl9GQ1NFCQkJCTB4MDA1MAorI2RlZmluZSBNQUNCX0FMRQkJCQkweDAwNTQKKyNkZWZpbmUgTUFDQl9EVEYJCQkJMHgwMDU4CisjZGVmaW5lIE1BQ0JfTENPTAkJCQkweDAwNWMKKyNkZWZpbmUgTUFDQl9FWENPTAkJCQkweDAwNjAKKyNkZWZpbmUgTUFDQl9UVU5ECQkJCTB4MDA2NAorI2RlZmluZSBNQUNCX0NTRQkJCQkweDAwNjgKKyNkZWZpbmUgTUFDQl9SUkUJCQkJMHgwMDZjCisjZGVmaW5lIE1BQ0JfUk9WUgkJCQkweDAwNzAKKyNkZWZpbmUgTUFDQl9SU0UJCQkJMHgwMDc0CisjZGVmaW5lIE1BQ0JfRUxFCQkJCTB4MDA3OAorI2RlZmluZSBNQUNCX1JKQQkJCQkweDAwN2MKKyNkZWZpbmUgTUFDQl9VU0YJCQkJMHgwMDgwCisjZGVmaW5lIE1BQ0JfU1RFCQkJCTB4MDA4NAorI2RlZmluZSBNQUNCX1JMRQkJCQkweDAwODgKKyNkZWZpbmUgTUFDQl9UUEYJCQkJMHgwMDhjCisjZGVmaW5lIE1BQ0JfSFJCCQkJCTB4MDA5MAorI2RlZmluZSBNQUNCX0hSVAkJCQkweDAwOTQKKyNkZWZpbmUgTUFDQl9TQTFCCQkJCTB4MDA5OAorI2RlZmluZSBNQUNCX1NBMVQJCQkJMHgwMDljCisjZGVmaW5lIE1BQ0JfU0EyQgkJCQkweDAwYTAKKyNkZWZpbmUgTUFDQl9TQTJUCQkJCTB4MDBhNAorI2RlZmluZSBNQUNCX1NBM0IJCQkJMHgwMGE4CisjZGVmaW5lIE1BQ0JfU0EzVAkJCQkweDAwYWMKKyNkZWZpbmUgTUFDQl9TQTRCCQkJCTB4MDBiMAorI2RlZmluZSBNQUNCX1NBNFQJCQkJMHgwMGI0CisjZGVmaW5lIE1BQ0JfVElECQkJCTB4MDBiOAorI2RlZmluZSBNQUNCX1RQUQkJCQkweDAwYmMKKyNkZWZpbmUgTUFDQl9VU1JJTwkJCQkweDAwYzAKKyNkZWZpbmUgTUFDQl9XT0wJCQkJMHgwMGM0CisKKy8qIEJpdGZpZWxkcyBpbiBOQ1IgKi8KKyNkZWZpbmUgTUFDQl9MQl9PRkZTRVQJCQkJMAorI2RlZmluZSBNQUNCX0xCX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0xMQl9PRkZTRVQJCQkJMQorI2RlZmluZSBNQUNCX0xMQl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9SRV9PRkZTRVQJCQkJMgorI2RlZmluZSBNQUNCX1JFX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1RFX09GRlNFVAkJCQkzCisjZGVmaW5lIE1BQ0JfVEVfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfTVBFX09GRlNFVAkJCQk0CisjZGVmaW5lIE1BQ0JfTVBFX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0NMUlNUQVRfT0ZGU0VUCQkJNQorI2RlZmluZSBNQUNCX0NMUlNUQVRfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9JTkNTVEFUX09GRlNFVAkJCTYKKyNkZWZpbmUgTUFDQl9JTkNTVEFUX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfV0VTVEFUX09GRlNFVAkJCTcKKyNkZWZpbmUgTUFDQl9XRVNUQVRfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9CUF9PRkZTRVQJCQkJOAorI2RlZmluZSBNQUNCX0JQX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1RTVEFSVF9PRkZTRVQJCQk5CisjZGVmaW5lIE1BQ0JfVFNUQVJUX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfVEhBTFRfT0ZGU0VUCQkJMTAKKyNkZWZpbmUgTUFDQl9USEFMVF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9OQ1JfVFBGX09GRlNFVAkJCTExCisjZGVmaW5lIE1BQ0JfTkNSX1RQRl9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RaUV9PRkZTRVQJCQkJMTIKKyNkZWZpbmUgTUFDQl9UWlFfU0laRQkJCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBOQ0ZHUiAqLworI2RlZmluZSBNQUNCX1NQRF9PRkZTRVQJCQkJMAorI2RlZmluZSBNQUNCX1NQRF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9GRF9PRkZTRVQJCQkJMQorI2RlZmluZSBNQUNCX0ZEX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0JJVF9SQVRFX09GRlNFVAkJCTIKKyNkZWZpbmUgTUFDQl9CSVRfUkFURV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX0pGUkFNRV9PRkZTRVQJCQkzCisjZGVmaW5lIE1BQ0JfSkZSQU1FX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfQ0FGX09GRlNFVAkJCQk0CisjZGVmaW5lIE1BQ0JfQ0FGX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX05CQ19PRkZTRVQJCQkJNQorI2RlZmluZSBNQUNCX05CQ19TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9OQ0ZHUl9NVElfT0ZGU0VUCQkJNgorI2RlZmluZSBNQUNCX05DRkdSX01USV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1VOSV9PRkZTRVQJCQkJNworI2RlZmluZSBNQUNCX1VOSV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9CSUdfT0ZGU0VUCQkJCTgKKyNkZWZpbmUgTUFDQl9CSUdfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfRUFFX09GRlNFVAkJCQk5CisjZGVmaW5lIE1BQ0JfRUFFX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0NMS19PRkZTRVQJCQkJMTAKKyNkZWZpbmUgTUFDQl9DTEtfU0laRQkJCQkyCisjZGVmaW5lIE1BQ0JfUlRZX09GRlNFVAkJCQkxMgorI2RlZmluZSBNQUNCX1JUWV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9QQUVfT0ZGU0VUCQkJCTEzCisjZGVmaW5lIE1BQ0JfUEFFX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1JCT0ZfT0ZGU0VUCQkJMTQKKyNkZWZpbmUgTUFDQl9SQk9GX1NJWkUJCQkJMgorI2RlZmluZSBNQUNCX1JMQ0VfT0ZGU0VUCQkJMTYKKyNkZWZpbmUgTUFDQl9STENFX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0RSRkNTX09GRlNFVAkJCTE3CisjZGVmaW5lIE1BQ0JfRFJGQ1NfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfRUZSSERfT0ZGU0VUCQkJMTgKKyNkZWZpbmUgTUFDQl9FRlJIRF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9JUlhGQ1NfT0ZGU0VUCQkJMTkKKyNkZWZpbmUgTUFDQl9JUlhGQ1NfU0laRQkJCTEKKworLyogQml0ZmllbGRzIGluIE5TUiAqLworI2RlZmluZSBNQUNCX05TUl9MSU5LX09GRlNFVAkJCTAKKyNkZWZpbmUgTUFDQl9OU1JfTElOS19TSVpFCQkJMQorI2RlZmluZSBNQUNCX01ESU9fT0ZGU0VUCQkJMQorI2RlZmluZSBNQUNCX01ESU9fU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfSURMRV9PRkZTRVQJCQkyCisjZGVmaW5lIE1BQ0JfSURMRV9TSVpFCQkJCTEKKworLyogQml0ZmllbGRzIGluIFRTUiAqLworI2RlZmluZSBNQUNCX1VCUl9PRkZTRVQJCQkJMAorI2RlZmluZSBNQUNCX1VCUl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9DT0xfT0ZGU0VUCQkJCTEKKyNkZWZpbmUgTUFDQl9DT0xfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfVFNSX1JMRV9PRkZTRVQJCQkyCisjZGVmaW5lIE1BQ0JfVFNSX1JMRV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RHT19PRkZTRVQJCQkJMworI2RlZmluZSBNQUNCX1RHT19TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9CRVhfT0ZGU0VUCQkJCTQKKyNkZWZpbmUgTUFDQl9CRVhfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfQ09NUF9PRkZTRVQJCQk1CisjZGVmaW5lIE1BQ0JfQ09NUF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9VTkRfT0ZGU0VUCQkJCTYKKyNkZWZpbmUgTUFDQl9VTkRfU0laRQkJCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBSU1IgKi8KKyNkZWZpbmUgTUFDQl9CTkFfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9CTkFfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfUkVDX09GRlNFVAkJCQkxCisjZGVmaW5lIE1BQ0JfUkVDX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX09WUl9PRkZTRVQJCQkJMgorI2RlZmluZSBNQUNCX09WUl9TSVpFCQkJCTEKKworLyogQml0ZmllbGRzIGluIElTUi9JRVIvSURSL0lNUiAqLworI2RlZmluZSBNQUNCX01GRF9PRkZTRVQJCQkJMAorI2RlZmluZSBNQUNCX01GRF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9SQ09NUF9PRkZTRVQJCQkxCisjZGVmaW5lIE1BQ0JfUkNPTVBfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfUlhVQlJfT0ZGU0VUCQkJMgorI2RlZmluZSBNQUNCX1JYVUJSX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1RYVUJSX09GRlNFVAkJCTMKKyNkZWZpbmUgTUFDQl9UWFVCUl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9JU1JfVFVORF9PRkZTRVQJCQk0CisjZGVmaW5lIE1BQ0JfSVNSX1RVTkRfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9JU1JfUkxFX09GRlNFVAkJCTUKKyNkZWZpbmUgTUFDQl9JU1JfUkxFX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfVFhFUlJfT0ZGU0VUCQkJNgorI2RlZmluZSBNQUNCX1RYRVJSX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1RDT01QX09GRlNFVAkJCTcKKyNkZWZpbmUgTUFDQl9UQ09NUF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9JU1JfTElOS19PRkZTRVQJCQk5CisjZGVmaW5lIE1BQ0JfSVNSX0xJTktfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9JU1JfUk9WUl9PRkZTRVQJCQkxMAorI2RlZmluZSBNQUNCX0lTUl9ST1ZSX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfSFJFU1BfT0ZGU0VUCQkJMTEKKyNkZWZpbmUgTUFDQl9IUkVTUF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9QRlJfT0ZGU0VUCQkJCTEyCisjZGVmaW5lIE1BQ0JfUEZSX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1BUWl9PRkZTRVQJCQkJMTMKKyNkZWZpbmUgTUFDQl9QVFpfU0laRQkJCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBNQU4gKi8KKyNkZWZpbmUgTUFDQl9EQVRBX09GRlNFVAkJCTAKKyNkZWZpbmUgTUFDQl9EQVRBX1NJWkUJCQkJMTYKKyNkZWZpbmUgTUFDQl9DT0RFX09GRlNFVAkJCTE2CisjZGVmaW5lIE1BQ0JfQ09ERV9TSVpFCQkJCTIKKyNkZWZpbmUgTUFDQl9SRUdBX09GRlNFVAkJCTE4CisjZGVmaW5lIE1BQ0JfUkVHQV9TSVpFCQkJCTUKKyNkZWZpbmUgTUFDQl9QSFlBX09GRlNFVAkJCTIzCisjZGVmaW5lIE1BQ0JfUEhZQV9TSVpFCQkJCTUKKyNkZWZpbmUgTUFDQl9SV19PRkZTRVQJCQkJMjgKKyNkZWZpbmUgTUFDQl9SV19TSVpFCQkJCTIKKyNkZWZpbmUgTUFDQl9TT0ZfT0ZGU0VUCQkJCTMwCisjZGVmaW5lIE1BQ0JfU09GX1NJWkUJCQkJMgorCisvKiBCaXRmaWVsZHMgaW4gVVNSSU8gKi8KKyNkZWZpbmUgTUFDQl9NSUlfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9NSUlfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfRUFNX09GRlNFVAkJCQkxCisjZGVmaW5lIE1BQ0JfRUFNX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1RYX1BBVVNFX09GRlNFVAkJCTIKKyNkZWZpbmUgTUFDQl9UWF9QQVVTRV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RYX1BBVVNFX1pFUk9fT0ZGU0VUCQkzCisjZGVmaW5lIE1BQ0JfVFhfUEFVU0VfWkVST19TSVpFCQkJMQorCisvKiBCaXRmaWVsZHMgaW4gV09MICovCisjZGVmaW5lIE1BQ0JfSVBfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9JUF9TSVpFCQkJCTE2CisjZGVmaW5lIE1BQ0JfTUFHX09GRlNFVAkJCQkxNgorI2RlZmluZSBNQUNCX01BR19TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9BUlBfT0ZGU0VUCQkJCTE3CisjZGVmaW5lIE1BQ0JfQVJQX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1NBMV9PRkZTRVQJCQkJMTgKKyNkZWZpbmUgTUFDQl9TQTFfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfV09MX01USV9PRkZTRVQJCQkxOQorI2RlZmluZSBNQUNCX1dPTF9NVElfU0laRQkJCTEKKworLyogQ29uc3RhbnRzIGZvciBDTEsgKi8KKyNkZWZpbmUgTUFDQl9DTEtfRElWOAkJCQkwCisjZGVmaW5lIE1BQ0JfQ0xLX0RJVjE2CQkJCTEKKyNkZWZpbmUgTUFDQl9DTEtfRElWMzIJCQkJMgorI2RlZmluZSBNQUNCX0NMS19ESVY2NAkJCQkzCisKKy8qIENvbnN0YW50cyBmb3IgTUFOIHJlZ2lzdGVyICovCisjZGVmaW5lIE1BQ0JfTUFOX1NPRgkJCQkxCisjZGVmaW5lIE1BQ0JfTUFOX1dSSVRFCQkJCTEKKyNkZWZpbmUgTUFDQl9NQU5fUkVBRAkJCQkyCisjZGVmaW5lIE1BQ0JfTUFOX0NPREUJCQkJMgorCisvKiBCaXQgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBNQUNCX0JJVChuYW1lKQkJCQkJXAorCSgxIDw8IE1BQ0JfIyNuYW1lIyNfT0ZGU0VUKQorI2RlZmluZSBNQUNCX0JGKG5hbWUsdmFsdWUpCQkJCVwKKwkoKCh2YWx1ZSkgJiAoKDEgPDwgTUFDQl8jI25hbWUjI19TSVpFKSAtIDEpKQlcCisJIDw8IE1BQ0JfIyNuYW1lIyNfT0ZGU0VUKQorI2RlZmluZSBNQUNCX0JGRVhUKG5hbWUsdmFsdWUpXAorCSgoKHZhbHVlKSA+PiBNQUNCXyMjbmFtZSMjX09GRlNFVCkJCVwKKwkgJiAoKDEgPDwgTUFDQl8jI25hbWUjI19TSVpFKSAtIDEpKQorI2RlZmluZSBNQUNCX0JGSU5TKG5hbWUsdmFsdWUsb2xkKQkJCVwKKwkoKChvbGQpICYgfigoKDEgPDwgTUFDQl8jI25hbWUjI19TSVpFKSAtIDEpCVwKKwkJICAgIDw8IE1BQ0JfIyNuYW1lIyNfT0ZGU0VUKSkJCVwKKwkgfCBNQUNCX0JGKG5hbWUsdmFsdWUpKQorCisvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIG1hY2JfcmVhZGwocG9ydCxyZWcpCQkJCVwKKwlyZWFkbCgocG9ydCktPnJlZ3MgKyBNQUNCXyMjcmVnKQorI2RlZmluZSBtYWNiX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkJCQlcCisJd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIE1BQ0JfIyNyZWcpCisKK3N0cnVjdCBkbWFfZGVzYyB7CisJdTMyCWFkZHI7CisJdTMyCWN0cmw7Cit9OworCisvKiBETUEgZGVzY3JpcHRvciBiaXRmaWVsZHMgKi8KKyNkZWZpbmUgTUFDQl9SWF9VU0VEX09GRlNFVAkJCTAKKyNkZWZpbmUgTUFDQl9SWF9VU0VEX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfUlhfV1JBUF9PRkZTRVQJCQkxCisjZGVmaW5lIE1BQ0JfUlhfV1JBUF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1dBRERSX09GRlNFVAkJCTIKKyNkZWZpbmUgTUFDQl9SWF9XQUREUl9TSVpFCQkJMzAKKworI2RlZmluZSBNQUNCX1JYX0ZSTUxFTl9PRkZTRVQJCQkwCisjZGVmaW5lIE1BQ0JfUlhfRlJNTEVOX1NJWkUJCQkxMgorI2RlZmluZSBNQUNCX1JYX09GRlNFVF9PRkZTRVQJCQkxMgorI2RlZmluZSBNQUNCX1JYX09GRlNFVF9TSVpFCQkJMgorI2RlZmluZSBNQUNCX1JYX1NPRl9PRkZTRVQJCQkxNAorI2RlZmluZSBNQUNCX1JYX1NPRl9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX0VPRl9PRkZTRVQJCQkxNQorI2RlZmluZSBNQUNCX1JYX0VPRl9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX0NGSV9PRkZTRVQJCQkxNgorI2RlZmluZSBNQUNCX1JYX0NGSV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1ZMQU5fUFJJX09GRlNFVAkJCTE3CisjZGVmaW5lIE1BQ0JfUlhfVkxBTl9QUklfU0laRQkJCTMKKyNkZWZpbmUgTUFDQl9SWF9QUklfVEFHX09GRlNFVAkJCTIwCisjZGVmaW5lIE1BQ0JfUlhfUFJJX1RBR19TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1ZMQU5fVEFHX09GRlNFVAkJCTIxCisjZGVmaW5lIE1BQ0JfUlhfVkxBTl9UQUdfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9UWVBFSURfTUFUQ0hfT0ZGU0VUCQkyMgorI2RlZmluZSBNQUNCX1JYX1RZUEVJRF9NQVRDSF9TSVpFCQkxCisjZGVmaW5lIE1BQ0JfUlhfU0E0X01BVENIX09GRlNFVAkJMjMKKyNkZWZpbmUgTUFDQl9SWF9TQTRfTUFUQ0hfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9TQTNfTUFUQ0hfT0ZGU0VUCQkyNAorI2RlZmluZSBNQUNCX1JYX1NBM19NQVRDSF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1NBMl9NQVRDSF9PRkZTRVQJCTI1CisjZGVmaW5lIE1BQ0JfUlhfU0EyX01BVENIX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfUlhfU0ExX01BVENIX09GRlNFVAkJMjYKKyNkZWZpbmUgTUFDQl9SWF9TQTFfTUFUQ0hfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9FWFRfTUFUQ0hfT0ZGU0VUCQkyOAorI2RlZmluZSBNQUNCX1JYX0VYVF9NQVRDSF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1VIQVNIX01BVENIX09GRlNFVAkJMjkKKyNkZWZpbmUgTUFDQl9SWF9VSEFTSF9NQVRDSF9TSVpFCQkxCisjZGVmaW5lIE1BQ0JfUlhfTUhBU0hfTUFUQ0hfT0ZGU0VUCQkzMAorI2RlZmluZSBNQUNCX1JYX01IQVNIX01BVENIX1NJWkUJCTEKKyNkZWZpbmUgTUFDQl9SWF9CUk9BRENBU1RfT0ZGU0VUCQkzMQorI2RlZmluZSBNQUNCX1JYX0JST0FEQ0FTVF9TSVpFCQkJMQorCisjZGVmaW5lIE1BQ0JfVFhfRlJNTEVOX09GRlNFVAkJCTAKKyNkZWZpbmUgTUFDQl9UWF9GUk1MRU5fU0laRQkJCTExCisjZGVmaW5lIE1BQ0JfVFhfTEFTVF9PRkZTRVQJCQkxNQorI2RlZmluZSBNQUNCX1RYX0xBU1RfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UWF9OT0NSQ19PRkZTRVQJCQkxNgorI2RlZmluZSBNQUNCX1RYX05PQ1JDX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfVFhfQlVGX0VYSEFVU1RFRF9PRkZTRVQJCTI3CisjZGVmaW5lIE1BQ0JfVFhfQlVGX0VYSEFVU1RFRF9TSVpFCQkxCisjZGVmaW5lIE1BQ0JfVFhfVU5ERVJSVU5fT0ZGU0VUCQkJMjgKKyNkZWZpbmUgTUFDQl9UWF9VTkRFUlJVTl9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RYX0VSUk9SX09GRlNFVAkJCTI5CisjZGVmaW5lIE1BQ0JfVFhfRVJST1JfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UWF9XUkFQX09GRlNFVAkJCTMwCisjZGVmaW5lIE1BQ0JfVFhfV1JBUF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RYX1VTRURfT0ZGU0VUCQkJMzEKKyNkZWZpbmUgTUFDQl9UWF9VU0VEX1NJWkUJCQkxCisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkqc2tiOworCWRtYV9hZGRyX3QJCW1hcHBpbmc7Cit9OworCisvKgorICogSGFyZHdhcmUtY29sbGVjdGVkIHN0YXRpc3RpY3MuIFVzZWQgd2hlbiB1cGRhdGluZyB0aGUgbmV0d29yaworICogZGV2aWNlIHN0YXRzIGJ5IGEgcGVyaW9kaWMgdGltZXIuCisgKi8KK3N0cnVjdCBtYWNiX3N0YXRzIHsKKwl1MzIJcnhfcGF1c2VfZnJhbWVzOworCXUzMgl0eF9vazsKKwl1MzIJdHhfc2luZ2xlX2NvbHM7CisJdTMyCXR4X211bHRpcGxlX2NvbHM7CisJdTMyCXJ4X29rOworCXUzMglyeF9mY3NfZXJyb3JzOworCXUzMglyeF9hbGlnbl9lcnJvcnM7CisJdTMyCXR4X2RlZmVycmVkOworCXUzMgl0eF9sYXRlX2NvbHM7CisJdTMyCXR4X2V4Y2Vzc2l2ZV9jb2xzOworCXUzMgl0eF91bmRlcnJ1bnM7CisJdTMyCXR4X2NhcnJpZXJfZXJyb3JzOworCXUzMglyeF9yZXNvdXJjZV9lcnJvcnM7CisJdTMyCXJ4X292ZXJydW5zOworCXUzMglyeF9zeW1ib2xfZXJyb3JzOworCXUzMglyeF9vdmVyc2l6ZV9wa3RzOworCXUzMglyeF9qYWJiZXJzOworCXUzMglyeF91bmRlcnNpemVfcGt0czsKKwl1MzIJc3FlX3Rlc3RfZXJyb3JzOworCXUzMglyeF9sZW5ndGhfbWlzbWF0Y2g7CisJdTMyCXR4X3BhdXNlX2ZyYW1lczsKK307CisKK3N0cnVjdCBtYWNiIHsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCisJdW5zaWduZWQgaW50CQlyeF90YWlsOworCXN0cnVjdCBkbWFfZGVzYwkJKnJ4X3Jpbmc7CisJdm9pZAkJCSpyeF9idWZmZXJzOworCisJdW5zaWduZWQgaW50CQl0eF9oZWFkLCB0eF90YWlsOworCXN0cnVjdCBkbWFfZGVzYwkJKnR4X3Jpbmc7CisJc3RydWN0IHJpbmdfaW5mbwkqdHhfc2tiOworCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXN0cnVjdCBjbGsJCSpwY2xrOworCXN0cnVjdCBjbGsJCSpoY2xrOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IG1hY2Jfc3RhdHMJaHdfc3RhdHM7CisKKwlkbWFfYWRkcl90CQlyeF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90CQl0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90CQlyeF9idWZmZXJzX2RtYTsKKworCXVuc2lnbmVkIGludAkJcnhfcGVuZGluZywgdHhfcGVuZGluZzsKKworCXN0cnVjdCB3b3JrX3N0cnVjdAlwZXJpb2RpY190YXNrOworCisJc3RydWN0IG11dGV4CQltZGlvX211dGV4OworCXN0cnVjdCBjb21wbGV0aW9uCW1kaW9fY29tcGxldGU7CisJc3RydWN0IG1paV9pZl9pbmZvCW1paTsKK307CisKKyNlbmRpZiAvKiBfTUFDQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tZXRoLmMgYi9kcml2ZXJzL25ldC9tZXRoLmMKaW5kZXggYzFhYTYwYi4uZTFkOTdjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L21ldGguYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGFzbS9pcDMyL2lwMzJfaW50cy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggODA2MDgxYi4uMzYzNTBlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC0xOTU1LDcgKzE5NTUsNyBAQAogCWZsYWdzID0gKE1YR0VGV19GTEFHU19OT19UU08gfCBNWEdFRldfRkxBR1NfRklSU1QpOwogCWlmIChsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKIAkJY2tzdW1fb2Zmc2V0ID0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOwotCQlwc2V1ZG9faGRyX29mZnNldCA9IChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YTsKKwkJcHNldWRvX2hkcl9vZmZzZXQgPSBja3N1bV9vZmZzZXQgKyBza2ItPmNzdW1fb2Zmc2V0OwogCQkvKiBJZiB0aGUgaGVhZGVycyBhcmUgZXhjZXNzaXZlbHkgbGFyZ2UsIHRoZW4gd2UgbXVzdAogCQkgKiBmYWxsIGJhY2sgdG8gYSBzb2Z0d2FyZSBjaGVja3N1bSAqLwogCQlpZiAodW5saWtlbHkoY2tzdW1fb2Zmc2V0ID4gMjU1IHx8IHBzZXVkb19oZHJfb2Zmc2V0ID4gMTI3KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwppbmRleCA3NzQ3YmZkLi5lZTI2ZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYworKysgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCiAjaW5jbHVkZSAibXlyaV9zYnVzLmgiCiAjaW5jbHVkZSAibXlyaV9jb2RlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZS1oODMwMC5jIGIvZHJpdmVycy9uZXQvbmUtaDgzMDAuYwppbmRleCBlYjg5M2Q3Li4zOGZkNTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZS1oODMwMC5jCisrKyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKKyNkZWZpbmUgRUlfU0hJRlQoeCkJKGVpX2xvY2FsLT5yZWdfb2Zmc2V0W3hdKQorCiAjaW5jbHVkZSAiODM5MC5oIgogCiAjZGVmaW5lIERSVl9OQU1FICJuZS1oODMwMCIKQEAgLTUyLDYgKzU0LDExIEBACiAKIC8qIC0tLS0gTm8gdXNlci1zZXJ2aWNlYWJsZSBwYXJ0cyBiZWxvdyAtLS0tICovCiAKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgIjgzOTAuYzp2MS4xMGN2cyA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlICJsaWI4MzkwLmMiCisKICNkZWZpbmUgTkVfQkFTRQkgKGRldi0+YmFzZV9hZGRyKQogI2RlZmluZSBORV9DTUQJIAkweDAwCiAjZGVmaW5lIE5FX0RBVEFQT1JUCShlaV9zdGF0dXMud29yZDE2PzB4MjA6MHgxMCkJLyogTmF0U2VtaS1kZWZpbmVkIHBvcnQgd2luZG93IG9mZnNldC4gKi8KQEAgLTE2Miw3ICsxNjksNyBAQAogI2lmbmRlZiBNT0RVTEUKIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5lX3Byb2JlKGludCB1bml0KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldigwKTsKIAlpbnQgZXJyOwogCiAJaWYgKCFkZXYpCkBAIC0yODMsNyArMjkwLDcgQEAKIAogCS8qIFNuYXJmIHRoZSBpbnRlcnJ1cHQgbm93LiAgVGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nIHNpbmNlIHdlIGNhbm5vdAogCSAgIHNoYXJlIGFuZCB0aGUgYm9hcmQgd2lsbCB1c3VhbGx5IGJlIGVuYWJsZWQuICovCi0JcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgbmFtZSwgZGV2KTsKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgX19laV9pbnRlcnJ1cHQsIDAsIG5hbWUsIGRldik7CiAJaWYgKHJldCkgewogCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQgKGVycm5vPSVkKS5cbiIsIGRldi0+aXJxLCByZXQpOwogCQlnb3RvIGVycl9vdXQ7CkBAIC0zMTgsOSArMzI1LDkgQEAKIAlkZXYtPm9wZW4gPSAmbmVfb3BlbjsKIAlkZXYtPnN0b3AgPSAmbmVfY2xvc2U7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBfX2VpX3BvbGw7CiAjZW5kaWYKLQlOUzgzOTBfaW5pdChkZXYsIDApOworCV9fTlM4MzkwX2luaXQoZGV2LCAwKTsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChyZXQpCkBAIC0zMzUsNyArMzQyLDcgQEAKIAogc3RhdGljIGludCBuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZWlfb3BlbihkZXYpOworCV9fZWlfb3BlbihkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0zNDMsNyArMzUwLDcgQEAKIHsKIAlpZiAoZWlfZGVidWcgPiAxKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKLQllaV9jbG9zZShkZXYpOworCV9fZWlfY2xvc2UoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTg0LDcgKzU5MSw3IEBACiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRtYV9zdGFydCArIDIqSFovMTAwKSkgewkJLyogMjBtcyAqLwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwgZGV2LT5uYW1lKTsKIAkJCW5lX3Jlc2V0XzgzOTAoZGV2KTsKLQkJCU5TODM5MF9pbml0KGRldiwxKTsKKwkJCV9fTlM4MzkwX2luaXQoZGV2LDEpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNjIwLDcgKzYyNyw3IEBACiAJaW50IGVycjsKIAogCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9ORV9DQVJEUzsgdGhpc19kZXYrKykgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBfX19fYWxsb2NfZWlfbmV0ZGV2KDApOwogCQlpZiAoIWRldikKIAkJCWJyZWFrOwogCQlpZiAoaW9bdGhpc19kZXZdKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTMyMTAuYyBiL2RyaXZlcnMvbmV0L25lMzIxMC5jCmluZGV4IGQ2NjMyODkuLjFhNmZlZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25lMzIxMC5jCisrKyBiL2RyaXZlcnMvbmV0L25lMzIxMC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jIGIvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCmluZGV4IGJmNThkYjIuLjY5MjMzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldGNvbnNvbGUuYworKysgYi9kcml2ZXJzL25ldC9uZXRjb25zb2xlLmMKQEAgLTYwLDcgKzYwLDYgQEAKIAkubG9jYWxfcG9ydCA9IDY2NjUsCiAJLnJlbW90ZV9wb3J0ID0gNjY2NiwKIAkucmVtb3RlX21hYyA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKLQkuZHJvcCA9IG5ldHBvbGxfcXVldWUsCiB9Owogc3RhdGljIGludCBjb25maWd1cmVkID0gMDsKIApAQCAtMTAyLDYgKzEwMSw4IEBACiAKIHN0YXRpYyBpbnQgaW5pdF9uZXRjb25zb2xlKHZvaWQpCiB7CisJaW50IGVycjsKKwogCWlmKHN0cmxlbihjb25maWcpKQogCQlvcHRpb25fc2V0dXAoY29uZmlnKTsKIApAQCAtMTEwLDggKzExMSw5IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmKG5ldHBvbGxfc2V0dXAoJm5wKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gbmV0cG9sbF9zZXR1cCgmbnApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZWdpc3Rlcl9jb25zb2xlKCZuZXRjb25zb2xlKTsKIAlwcmludGsoS0VSTl9JTkZPICJuZXRjb25zb2xlOiBuZXR3b3JrIGxvZ2dpbmcgc3RhcnRlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9uZXR4ZW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3Y2RjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9NYWtlZmlsZQpAQCAtMCwwICsxLDM1IEBACisjIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisjIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyMgCisjIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisjIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorIyAKKyMgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyMgICAgaW5mb0BuZXR4ZW4uY29tCisjIE5ldFhlbiwKKyMgMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorIyBTYW50YSBDbGFyYSwgQ0EgOTUwNTQKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBOZXRYZW4gTklDIERyaXZlcgorIworCisKK29iai0kKENPTkZJR19ORVRYRU5fTklDKSA6PSBuZXR4ZW5fbmljLm8KKworbmV0eGVuX25pYy15IDo9IG5ldHhlbl9uaWNfaHcubyBuZXR4ZW5fbmljX21haW4ubyBuZXR4ZW5fbmljX2luaXQubyBcCisJbmV0eGVuX25pY19pc3IubyBuZXR4ZW5fbmljX2V0aHRvb2wubyBuZXR4ZW5fbmljX25pdS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI1MDUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaApAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAgMDIxMTEtMTMwNywgVVNBLgorICogCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKiAKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICovCisKKyNpZm5kZWYgX05FVFhFTl9OSUNfSF8KKyNkZWZpbmUgX05FVFhFTl9OSUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgorCisjZGVmaW5lIE5FVFhFTl9OSUNfQlVJTERfTk8gICAgICI1IgorI2RlZmluZSBfTkVUWEVOX05JQ19MSU5VWF9NQUpPUiAyCisjZGVmaW5lIF9ORVRYRU5fTklDX0xJTlVYX01JTk9SIDMKKyNkZWZpbmUgX05FVFhFTl9OSUNfTElOVVhfU1VCVkVSU0lPTiA1OQorI2RlZmluZSBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCAgIjIuMy41OSIgIi0iIE5FVFhFTl9OSUNfQlVJTERfTk8KKyNkZWZpbmUgTkVUWEVOX05JQ19GV19WRVJTSU9OSUQgIjIuMy41OSIKKworI2RlZmluZSBSQ1ZfREVTQ19SSU5HU0laRQlcCisJKHNpemVvZihzdHJ1Y3QgcmN2X2Rlc2MpICogYWRhcHRlci0+bWF4X3J4X2Rlc2NfY291bnQpCisjZGVmaW5lIFNUQVRVU19ERVNDX1JJTkdTSVpFCVwKKwkoc2l6ZW9mKHN0cnVjdCBzdGF0dXNfZGVzYykqIGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50KQorI2RlZmluZSBUWF9SSU5HU0laRQlcCisJKHNpemVvZihzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIpICogYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQpCisjZGVmaW5lIFJDVl9CVUZGU0laRQlcCisJKHNpemVvZihzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlcikgKiByY3ZfZGVzYy0+bWF4X3J4X2Rlc2NfY291bnQpCisjZGVmaW5lIGZpbmRfZGlmZl9hbW9uZyhhLGIscmFuZ2UpICgoYSk8KGIpPygoYiktKGEpKTooKGIpKyhyYW5nZSktKGEpKSkKKworI2RlZmluZSBORVRYRU5fTkVUREVWX1NUQVRVUyAweDEKKworI2RlZmluZSBBRERSX0lOX1dJTkRPVzEob2ZmKQlcCisJKChvZmYgPiBORVRYRU5fQ1JCX1BDSVhfSE9TVDIpICYmIChvZmYgPCBORVRYRU5fQ1JCX01BWCkpID8gMSA6IDAKKworLyogCisgKiBub3JtYWxpemUgYSA2NE1CIGNyYiBhZGRyZXNzIHRvIDMyTUIgUENJIHdpbmRvdyAKKyAqIFRvIHVzZSBORVRYRU5fQ1JCX05PUk1BTElaRSwgd2luZG93IF9tdXN0XyBiZSBzZXQgdG8gMQorICovCisjZGVmaW5lIE5FVFhFTl9DUkJfTk9STUFMKHJlZykgICAgICAgIFwKKwkocmVnKSAtIE5FVFhFTl9DUkJfUENJWF9IT1NUMiArIE5FVFhFTl9DUkJfUENJWF9IT1NUCisKKyNkZWZpbmUgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgcmVnKSBcCisJcGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIE5FVFhFTl9DUkJfTk9STUFMKHJlZykpCisKKyNkZWZpbmUgRklSU1RfUEFHRV9HUk9VUF9TVEFSVAkwCisjZGVmaW5lIEZJUlNUX1BBR0VfR1JPVVBfRU5ECTB4NDAwMDAwCisKKyNkZWZpbmUgU0VDT05EX1BBR0VfR1JPVVBfU1RBUlQJMHg0MDAwMDAwCisjZGVmaW5lIFNFQ09ORF9QQUdFX0dST1VQX0VORAkweDY2QkMwMDAKKworI2RlZmluZSBUSElSRF9QQUdFX0dST1VQX1NUQVJUCTB4NzBFNDAwMAorI2RlZmluZSBUSElSRF9QQUdFX0dST1VQX0VORAkweDgwMDAwMDAKKworI2RlZmluZSBGSVJTVF9QQUdFX0dST1VQX1NJWkUgIEZJUlNUX1BBR0VfR1JPVVBfRU5EIC0gRklSU1RfUEFHRV9HUk9VUF9TVEFSVAorI2RlZmluZSBTRUNPTkRfUEFHRV9HUk9VUF9TSVpFIFNFQ09ORF9QQUdFX0dST1VQX0VORCAtIFNFQ09ORF9QQUdFX0dST1VQX1NUQVJUCisjZGVmaW5lIFRISVJEX1BBR0VfR1JPVVBfU0laRSAgVEhJUkRfUEFHRV9HUk9VUF9FTkQgLSBUSElSRF9QQUdFX0dST1VQX1NUQVJUCisKKyNkZWZpbmUgTUFYX1JYX0JVRkZFUl9MRU5HVEgJCTIwMDAKKyNkZWZpbmUgTUFYX1JYX0pVTUJPX0JVRkZFUl9MRU5HVEggCTkwNDYKKyNkZWZpbmUgUlhfRE1BX01BUF9MRU4JCQkoTUFYX1JYX0JVRkZFUl9MRU5HVEggLSBORVRfSVBfQUxJR04pCisjZGVmaW5lIFJYX0pVTUJPX0RNQV9NQVBfTEVOCVwKKwkoTUFYX1JYX0pVTUJPX0JVRkZFUl9MRU5HVEggLSBORVRfSVBfQUxJR04pCisjZGVmaW5lIE5FVFhFTl9ST01fUk9VTkRVUAkJMHg4MDAwMDAwMFVMTAorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgcmluZyBjb250ZXh0cworICovCisjZGVmaW5lIE1BWF9SSU5HX0NUWCAxCisKKy8qIE9wY29kZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBjb21tYW5kcyAqLworZW51bSB7CisJVFhfRVRIRVJfUEtUID0gMHgwMSwKKy8qIFRoZSBmb2xsb3dpbmcgb3Bjb2RlcyBhcmUgZm9yIElQIGNoZWNrc3VtCSovCisJVFhfVENQX1BLVCwKKwlUWF9VRFBfUEtULAorCVRYX0lQX1BLVCwKKwlUWF9UQ1BfTFNPLAorCVRYX0lQU0VDLAorCVRYX0lQU0VDX0NNRAorfTsKKworLyogVGhlIGZvbGxvd2luZyBvcGNvZGVzIGFyZSBmb3IgaW50ZXJuYWwgY29uc3VtcHRpb24uICovCisjZGVmaW5lIE5FVFhFTl9DT05UUk9MX09QCTB4MTAKKyNkZWZpbmUgUEVHTkVUX1JFUVVFU1QJCTB4MTEKKworI2RlZmluZQlNQVhfTlVNX0NBUkRTCQk0CisKKyNkZWZpbmUgTUFYX0JVRkZFUlNfUEVSX0NNRAkzMgorCisvKgorICogRm9sbG93aW5nIGFyZSB0aGUgc3RhdGVzIG9mIHRoZSBQaGFudG9tLiBQaGFudG9tIHdpbGwgc2V0IHRoZW0gYW5kCisgKiBIb3N0IHdpbGwgcmVhZCB0byBjaGVjayBpZiB0aGUgZmllbGRzIGFyZSBjb3JyZWN0LgorICovCisjZGVmaW5lIFBIQU5fSU5JVElBTElaRV9TVEFSVAkJMHhmZjAwCisjZGVmaW5lIFBIQU5fSU5JVElBTElaRV9GQUlMRUQJCTB4ZmZmZgorI2RlZmluZSBQSEFOX0lOSVRJQUxJWkVfQ09NUExFVEUJMHhmZjAxCisKKy8qIEhvc3Qgd3JpdGVzIHRoZSBmb2xsb3dpbmcgdG8gbm90aWZ5IHRoYXQgaXQgaGFzIGRvbmUgdGhlIGluaXQtaGFuZHNoYWtlICovCisjZGVmaW5lIFBIQU5fSU5JVElBTElaRV9BQ0sJMHhmMDBmCisKKyNkZWZpbmUgTlVNX1JDVl9ERVNDX1JJTkdTCTIJLyogTm8gb2YgUmN2IERlc2NyaXB0b3IgY29udGV4dHMgKi8KKworLyogZGVzY3JpcHRvciB0eXBlcyAqLworI2RlZmluZSBSQ1ZfREVTQ19OT1JNQUwJCTB4MDEKKyNkZWZpbmUgUkNWX0RFU0NfSlVNQk8JCTB4MDIKKyNkZWZpbmUgUkNWX0RFU0NfTk9STUFMX0NUWElECTAKKyNkZWZpbmUgUkNWX0RFU0NfSlVNQk9fQ1RYSUQJMQorCisjZGVmaW5lIFJDVl9ERVNDX1RZUEUoSUQpIFwKKwkoKElEID09IFJDVl9ERVNDX0pVTUJPX0NUWElEKSA/IFJDVl9ERVNDX0pVTUJPIDogUkNWX0RFU0NfTk9STUFMKQorCisjZGVmaW5lIE1BWF9DTURfREVTQ1JJUFRPUlMJCTEwMjQKKyNkZWZpbmUgTUFYX1JDVl9ERVNDUklQVE9SUwkJMzI3NjgKKyNkZWZpbmUgTUFYX0pVTUJPX1JDVl9ERVNDUklQVE9SUwkxMDI0CisjZGVmaW5lIE1BWF9SQ1ZTVEFUVVNfREVTQ1JJUFRPUlMJTUFYX1JDVl9ERVNDUklQVE9SUworI2RlZmluZSBNQVhfSlVNQk9fUkNWX0RFU0MJTUFYX0pVTUJPX1JDVl9ERVNDUklQVE9SUworI2RlZmluZSBNQVhfUkNWX0RFU0MJCU1BWF9SQ1ZfREVTQ1JJUFRPUlMKKyNkZWZpbmUgTUFYX1JDVlNUQVRVU19ERVNDCU1BWF9SQ1ZfREVTQ1JJUFRPUlMKKyNkZWZpbmUgTlVNX1JDVl9ERVNDCQkoTUFYX1JDVl9ERVNDICsgTUFYX0pVTUJPX1JDVl9ERVNDUklQVE9SUykKKyNkZWZpbmUgTUFYX0VQR19ERVNDUklQVE9SUwkoTUFYX0NNRF9ERVNDUklQVE9SUyAqIDgpCisKKyNkZWZpbmUgTUlOX1RYX0NPVU5UCTQwOTYKKyNkZWZpbmUgTUlOX1JYX0NPVU5UCTQwOTYKKworI2RlZmluZSBNQVhfRlJBTUVfU0laRQkweDEwMDAwCS8qIDY0SyBNQVggc2l6ZSBmb3IgTFNPICovCisKKyNkZWZpbmUgUEhBTl9QRUdfUkNWX0lOSVRJQUxJWkVECTB4ZmYwMQorI2RlZmluZSBQSEFOX1BFR19SQ1ZfU1RBUlRfSU5JVElBTElaRQkweGZmMDAKKworI2RlZmluZSBnZXRfbmV4dF9pbmRleChpbmRleCwgbGVuZ3RoKQlcCisJKCgoaW5kZXgpICsgMSkgJiAoKGxlbmd0aCkgLSAxKSkKKworI2RlZmluZSBnZXRfaW5kZXhfcmFuZ2UoaW5kZXgsbGVuZ3RoLGNvdW50KQlcCisJKCgoaW5kZXgpICsgKGNvdW50KSkgJiAoKGxlbmd0aCkgLSAxKSkKKworLyoKKyAqIEZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXMgZGVzY3JpYmUgdGhlIGRlc2NyaXB0b3JzIHRoYXQgd2lsbCBiZSB1c2VkLgorICogQWRkZWQgZmlsZWRzIG9mIHRjcEhkclNpemUgYW5kIGlwSGRyU2l6ZSwgVGhlIGRyaXZlciBuZWVkcyB0byBkbyBpdCBvbmx5IHdoZW4KKyAqIHdlIGFyZSBkb2luZyBMU08gKGFib3ZlIHRoZSAxNTAwIHNpemUgcGFja2V0KSBvbmx5LgorICovCisKKy8qCisgKiBUaGUgc2l6ZSBvZiByZWZlcmVuY2UgaGFuZGxlIGJlZW4gY2hhbmdlZCB0byAxNiBiaXRzIHRvIHBhc3MgdGhlIE1TUyBmaWVsZHMKKyAqIGZvciB0aGUgTFNPIHBhY2tldAorICovCisKKyNkZWZpbmUgRkxBR1NfQ0hFQ0tTVU1fRU5BQkxFRAkweDAxCisjZGVmaW5lIEZMQUdTX0xTT19FTkFCTEVECTB4MDIKKyNkZWZpbmUgRkxBR1NfSVBTRUNfU0FfQURECTB4MDQKKyNkZWZpbmUgRkxBR1NfSVBTRUNfU0FfREVMRVRFCTB4MDgKKyNkZWZpbmUgRkxBR1NfVkxBTl9UQUdHRUQJMHgxMAorCisjZGVmaW5lIENNRF9ERVNDX1RPVEFMX0xFTkdUSChjbWRfZGVzYykJXAorCQkoKGNtZF9kZXNjKS0+bGVuZ3RoX3RjcF9oZHIgJiAweDAwRkZGRkZGKQorI2RlZmluZSBDTURfREVTQ19UQ1BfSERSX09GRlNFVChjbWRfZGVzYykJXAorCQkoKChjbWRfZGVzYyktPmxlbmd0aF90Y3BfaGRyID4+IDI0KSAmIDB4MEZGKQorI2RlZmluZSBDTURfREVTQ19QT1JUKGNtZF9kZXNjKQkJKChjbWRfZGVzYyktPnBvcnRfY3R4aWQgJiAweDBGKQorI2RlZmluZSBDTURfREVTQ19DVFhfSUQoY21kX2Rlc2MpCSgoKGNtZF9kZXNjKS0+cG9ydF9jdHhpZCA+PiA0KSAmIDB4MEYpCisKKyNkZWZpbmUgQ01EX0RFU0NfVE9UQUxfTEVOR1RIX1dSVChjbWRfZGVzYywgdmFyKQlcCisJCSgoY21kX2Rlc2MpLT5sZW5ndGhfdGNwX2hkciB8PSAoKHZhcikgJiAweDAwRkZGRkZGKSkKKyNkZWZpbmUgQ01EX0RFU0NfVENQX0hEUl9PRkZTRVRfV1JUKGNtZF9kZXNjLCB2YXIpCVwKKwkJKChjbWRfZGVzYyktPmxlbmd0aF90Y3BfaGRyIHw9ICgoKHZhcikgPDwgMjQpICYgMHhGRjAwMDAwMCkpCisjZGVmaW5lIENNRF9ERVNDX1BPUlRfV1JUKGNtZF9kZXNjLCB2YXIpCVwKKwkJKChjbWRfZGVzYyktPnBvcnRfY3R4aWQgfD0gKCh2YXIpICYgMHgwRikpCisKK3N0cnVjdCBjbWRfZGVzY190eXBlMCB7CisJdTY0IG5ldHhlbl9uZXh0OwkvKiBmb3IgZnJhZ21lbnRzIGhhbmRsZWQgYnkgUGhhbnRvbSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhZGRyX2xvd19wYXJ0MjsKKwkJCXUzMiBhZGRyX2hpZ2hfcGFydDI7CisJCX07CisJCXU2NCBhZGRyX2J1ZmZlcjI7CisJfTsKKworCS8qIEJpdCBwYXR0ZXJuOiAwLTIzIHRvdGFsIGxlbmd0aCwgMjQtMzIgdGNwIGhlYWRlciBvZmZzZXQgKi8KKwl1MzIgbGVuZ3RoX3RjcF9oZHI7CisJdTggaXBfaGRyX29mZnNldDsJLyogRm9yIExTTyBvbmx5ICovCisJdTggbnVtX29mX2J1ZmZlcnM7CS8qIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyAqLworCXU4IGZsYWdzOwkJLyogYXMgZGVmaW5lZCBhYm92ZSAqLworCXU4IG9wY29kZTsKKworCXUxNiByZWZlcmVuY2VfaGFuZGxlOwkvKiBjaGFuZ2VkIHRvIHUxNiB0byBhZGQgbXNzICovCisJdTE2IG1zczsJCS8qIHBhc3NlZCBieSBORElTX1BBQ0tFVCBmb3IgTFNPICovCisJLyogQml0IHBhdHRlcm4gMC0zIHBvcnQsIDAtMyBjdHggaWQgKi8KKwl1OCBwb3J0X2N0eGlkOworCXU4IHRvdGFsX2hkcl9sZW5ndGg7CS8qIExTTyBvbmx5IDogTUFDK0lQK1RDUCBIZHIgc2l6ZSAqLworCXUxNiBjb25uX2lkOwkJLyogSVBTZWMgb2Zmb2FkIG9ubHkgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhZGRyX2xvd19wYXJ0MzsKKwkJCXUzMiBhZGRyX2hpZ2hfcGFydDM7CisJCX07CisJCXU2NCBhZGRyX2J1ZmZlcjM7CisJfTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhZGRyX2xvd19wYXJ0MTsKKwkJCXUzMiBhZGRyX2hpZ2hfcGFydDE7CisJCX07CisJCXU2NCBhZGRyX2J1ZmZlcjE7CisJfTsKKworCXUxNiBidWZmZXIxX2xlbmd0aDsKKwl1MTYgYnVmZmVyMl9sZW5ndGg7CisJdTE2IGJ1ZmZlcjNfbGVuZ3RoOworCXUxNiBidWZmZXI0X2xlbmd0aDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhZGRyX2xvd19wYXJ0NDsKKwkJCXUzMiBhZGRyX2hpZ2hfcGFydDQ7CisJCX07CisJCXU2NCBhZGRyX2J1ZmZlcjQ7CisJfTsKKworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg2NCkpKTsKKworLyogTm90ZTogc2l6ZW9mKHJjdl9kZXNjKSBzaG91bGQgYWx3YXlzIGJlIGEgbXV0bGlwbGUgb2YgMiAqLworc3RydWN0IHJjdl9kZXNjIHsKKwl1MTYgcmVmZXJlbmNlX2hhbmRsZTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIGJ1ZmZlcl9sZW5ndGg7CS8qIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoICh1c3VhbGx5IDJLKSAqLworCXU2NCBhZGRyX2J1ZmZlcjsKK307CisKKy8qIG9wY29kZSBmaWVsZCBpbiBzdGF0dXNfZGVzYyAqLworI2RlZmluZSBSQ1ZfTklDX1BLVAkoMHhBKQorI2RlZmluZSBTVEFUVVNfTklDX1BLVAkoKFJDVl9OSUNfUEtUKSA8PCAxMikKKworLyogZm9yIHN0YXR1cyBmaWVsZCBpbiBzdGF0dXNfZGVzYyAqLworI2RlZmluZSBTVEFUVVNfTkVFRF9DS1NVTQkoMSkKKyNkZWZpbmUgU1RBVFVTX0NLU1VNX09LCQkoMikKKworLyogb3duZXIgYml0cyBvZiBzdGF0dXNfZGVzYyAqLworI2RlZmluZSBTVEFUVVNfT1dORVJfSE9TVAkoMHgxKQorI2RlZmluZSBTVEFUVVNfT1dORVJfUEhBTlRPTQkoMHgyKQorCisjZGVmaW5lIE5FVFhFTl9QUk9UX0lQCQkoMSkKKyNkZWZpbmUgTkVUWEVOX1BST1RfVU5LTk9XTgkoMCkKKworLyogTm90ZTogc2l6ZW9mKHN0YXR1c19kZXNjKSBzaG91bGQgYWx3YXlzIGJlIGEgbXV0bGlwbGUgb2YgMiAqLworI2RlZmluZSBTVEFUVVNfREVTQ19QT1JUKHN0YXR1c19kZXNjKQlcCisJCSgoc3RhdHVzX2Rlc2MpLT5wb3J0X3N0YXR1c190eXBlX29wICYgMHgwRikKKyNkZWZpbmUgU1RBVFVTX0RFU0NfU1RBVFVTKHN0YXR1c19kZXNjKQlcCisJCSgoKHN0YXR1c19kZXNjKS0+cG9ydF9zdGF0dXNfdHlwZV9vcCA+PiA0KSAmIDB4MEYpCisjZGVmaW5lIFNUQVRVU19ERVNDX1RZUEUoc3RhdHVzX2Rlc2MpCVwKKwkJKCgoc3RhdHVzX2Rlc2MpLT5wb3J0X3N0YXR1c190eXBlX29wID4+IDgpICYgMHgwRikKKyNkZWZpbmUgU1RBVFVTX0RFU0NfT1BDT0RFKHN0YXR1c19kZXNjKQlcCisJCSgoKHN0YXR1c19kZXNjKS0+cG9ydF9zdGF0dXNfdHlwZV9vcCA+PiAxMikgJiAweDBGKQorCitzdHJ1Y3Qgc3RhdHVzX2Rlc2MgeworCS8qIEJpdCBwYXR0ZXJuOiAwLTMgcG9ydCwgNC03IHN0YXR1cywgOC0xMSB0eXBlLCAxMi0xNSBvcGNvZGUgKi8KKwl1MTYgcG9ydF9zdGF0dXNfdHlwZV9vcDsKKwl1MTYgdG90YWxfbGVuZ3RoOwkvKiBOSUMgbW9kZSAqLworCXUxNiByZWZlcmVuY2VfaGFuZGxlOwkvKiBoYW5kbGUgZm9yIHRoZSBhc3NvY2lhdGVkIHBhY2tldCAqLworCS8qIEJpdCBwYXR0ZXJuOiAwLTEgb3duZXIsIDItNSBwcm90b2NvbCAqLworCXUxNiBvd25lcjsJCS8qIE93bmVyIG9mIHRoZSBkZXNjcmlwdG9yICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisKK2VudW0geworCU5FVFhFTl9SQ1ZfUEVHXzAgPSAwLAorCU5FVFhFTl9SQ1ZfUEVHXzEKK307CisvKiBUaGUgdmVyc2lvbiBvZiB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZQlORVRYRU5fQkRJTkZPX1ZFUlNJT04gMQorCisvKiBNYWdpYyBudW1iZXIgdG8gbGV0IHVzZXIga25vdyBmbGFzaCBpcyBwcm9ncmFtbWVkICovCisjZGVmaW5lCU5FVFhFTl9CRElORk9fTUFHSUMgMHgxMjM0NTY3OAorCisvKiBNYXggbnVtYmVyIG9mIEdpZyBwb3J0cyBvbiBhIFBoYW50b20gYm9hcmQgKi8KKyNkZWZpbmUgTkVUWEVOX01BWF9QT1JUUyA0CisKK3R5cGVkZWYgZW51bSB7CisJTkVUWEVOX0JSRFRZUEVfUDFfQkQgPSAweDAwMDAsCisJTkVUWEVOX0JSRFRZUEVfUDFfU0IgPSAweDAwMDEsCisJTkVUWEVOX0JSRFRZUEVfUDFfU01BWCA9IDB4MDAwMiwKKwlORVRYRU5fQlJEVFlQRV9QMV9TT0NLID0gMHgwMDAzLAorCisJTkVUWEVOX0JSRFRZUEVfUDJfU09DS18zMSA9IDB4MDAwOCwKKwlORVRYRU5fQlJEVFlQRV9QMl9TT0NLXzM1ID0gMHgwMDA5LAorCU5FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEcgPSAweDAwMGEsCisJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEcgPSAweDAwMGIsCisJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8yRyA9IDB4MDAwYywKKworCU5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVogPSAweDAwMGQsCisJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSE1FWiA9IDB4MDAwZSwKKwlORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQgPSAweDAwMGYKK30gbmV0eGVuX2JyZHR5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlORVRYRU5fQlJETUZHX0lOVkVOVEVDID0gMQorfSBuZXR4ZW5fYnJkbWZnOworCit0eXBlZGVmIGVudW0geworCU1FTV9PUkdfMTI4TWJ4NCA9IDB4MCwJLyogRERSMSBvbmx5ICovCisJTUVNX09SR18xMjhNYng4ID0gMHgxLAkvKiBERFIxIG9ubHkgKi8KKwlNRU1fT1JHXzEyOE1ieDE2ID0gMHgyLAkvKiBERFIxIG9ubHkgKi8KKwlNRU1fT1JHXzI1Nk1ieDQgPSAweDMsCisJTUVNX09SR18yNTZNYng4ID0gMHg0LAorCU1FTV9PUkdfMjU2TWJ4MTYgPSAweDUsCisJTUVNX09SR181MTJNYng0ID0gMHg2LAorCU1FTV9PUkdfNTEyTWJ4OCA9IDB4NywKKwlNRU1fT1JHXzUxMk1ieDE2ID0gMHg4LAorCU1FTV9PUkdfMUdieDQgPSAweDksCisJTUVNX09SR18xR2J4OCA9IDB4YSwKKwlNRU1fT1JHXzFHYngxNiA9IDB4YiwKKwlNRU1fT1JHXzJHYng0ID0gMHhjLAorCU1FTV9PUkdfMkdieDggPSAweGQsCisJTUVNX09SR18yR2J4MTYgPSAweGUsCisJTUVNX09SR18xMjhNYngzMiA9IDB4MTAwMDIsCS8qIEdERFIgb25seSAqLworCU1FTV9PUkdfMjU2TWJ4MzIgPSAweDEwMDA1CS8qIEdERFIgb25seSAqLworfSBuZXR4ZW5fbW5fbWVtX29yZ190OworCit0eXBlZGVmIGVudW0geworCU1FTV9PUkdfNTEyS3gzNiA9IDB4MCwKKwlNRU1fT1JHXzFNeDM2ID0gMHgxLAorCU1FTV9PUkdfMk14MzYgPSAweDIKK30gbmV0eGVuX3NuX21lbV9vcmdfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlNRU1fREVQVEhfNE1CID0gMHgxLAorCU1FTV9ERVBUSF84TUIgPSAweDIsCisJTUVNX0RFUFRIXzE2TUIgPSAweDMsCisJTUVNX0RFUFRIXzMyTUIgPSAweDQsCisJTUVNX0RFUFRIXzY0TUIgPSAweDUsCisJTUVNX0RFUFRIXzEyOE1CID0gMHg2LAorCU1FTV9ERVBUSF8yNTZNQiA9IDB4NywKKwlNRU1fREVQVEhfNTEyTUIgPSAweDgsCisJTUVNX0RFUFRIXzFHQiA9IDB4OSwKKwlNRU1fREVQVEhfMkdCID0gMHhhLAorCU1FTV9ERVBUSF80R0IgPSAweGIsCisJTUVNX0RFUFRIXzhHQiA9IDB4YywKKwlNRU1fREVQVEhfMTZHQiA9IDB4ZCwKKwlNRU1fREVQVEhfMzJHQiA9IDB4ZQorfSBuZXR4ZW5fbWVtX2RlcHRoX3Q7CisKK3N0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyB7CisJdTMyIGhlYWRlcl92ZXJzaW9uOworCisJdTMyIGJvYXJkX21mZzsKKwl1MzIgYm9hcmRfdHlwZTsKKwl1MzIgYm9hcmRfbnVtOworCXUzMiBjaGlwX2lkOworCXUzMiBjaGlwX21pbm9yOworCXUzMiBjaGlwX21ham9yOworCXUzMiBjaGlwX3BrZzsKKwl1MzIgY2hpcF9sb3Q7CisKKwl1MzIgcG9ydF9tYXNrOwkJLyogYXZhaWxhYmxlIG5pdSBwb3J0cyAqLworCXUzMiBwZWdfbWFzazsJCS8qIGF2YWlsYWJsZSBwZWdzICovCisJdTMyIGljYWNoZV9vazsJCS8qIGNhbiB3ZSBydW4gd2l0aCBpY2FjaGU/ICovCisJdTMyIGRjYWNoZV9vazsJCS8qIGNhbiB3ZSBydW4gd2l0aCBkY2FjaGU/ICovCisJdTMyIGNhc3Blcl9vazsKKworCXUzMiBtYWNfYWRkcl9sb18wOworCXUzMiBtYWNfYWRkcl9sb18xOworCXUzMiBtYWNfYWRkcl9sb18yOworCXUzMiBtYWNfYWRkcl9sb18zOworCisJLyogTU4tcmVsYXRlZCBjb25maWcgKi8KKwl1MzIgbW5fc3luY19tb2RlOwkvKiBlbmFibGUvIHN5bmMgc2hpZnQgY2Nsay8gc3luYyBzaGlmdCBtY2xrICovCisJdTMyIG1uX3N5bmNfc2hpZnRfY2NsazsKKwl1MzIgbW5fc3luY19zaGlmdF9tY2xrOworCXUzMiBtbl93Yl9lbjsKKwl1MzIgbW5fY3J5c3RhbF9mcmVxOwkvKiBpbiBNSHogKi8KKwl1MzIgbW5fc3BlZWQ7CQkvKiBpbiBNSHogKi8KKwl1MzIgbW5fb3JnOworCXUzMiBtbl9kZXB0aDsKKwl1MzIgbW5fcmFua3NfMDsJCS8qIHJhbmtzIHBlciBzbG90ICovCisJdTMyIG1uX3JhbmtzXzE7CQkvKiByYW5rcyBwZXIgc2xvdCAqLworCXUzMiBtbl9yZF9sYXRlbmN5XzA7CisJdTMyIG1uX3JkX2xhdGVuY3lfMTsKKwl1MzIgbW5fcmRfbGF0ZW5jeV8yOworCXUzMiBtbl9yZF9sYXRlbmN5XzM7CisJdTMyIG1uX3JkX2xhdGVuY3lfNDsKKwl1MzIgbW5fcmRfbGF0ZW5jeV81OworCXUzMiBtbl9yZF9sYXRlbmN5XzY7CisJdTMyIG1uX3JkX2xhdGVuY3lfNzsKKwl1MzIgbW5fcmRfbGF0ZW5jeV84OworCXUzMiBtbl9kbGxfdmFsWzE4XTsKKwl1MzIgbW5fbW9kZV9yZWc7CS8qIE1JVSBERFIgTW9kZSBSZWdpc3RlciAqLworCXUzMiBtbl9leHRfbW9kZV9yZWc7CS8qIE1JVSBERFIgRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciAqLworCXUzMiBtbl90aW1pbmdfMDsJLyogTUlVIE1lbW9yeSBDb250cm9sIFRpbWluZyBSZ2lzdGVyICovCisJdTMyIG1uX3RpbWluZ18xOwkvKiBNSVUgRXh0ZW5kZWQgTWVtb3J5IEN0cmwgVGltaW5nIFJlZ2lzdGVyICovCisJdTMyIG1uX3RpbWluZ18yOwkvKiBNSVUgRXh0ZW5kZWQgTWVtb3J5IEN0cmwgVGltaW5nMiBSZWdpc3RlciAqLworCisJLyogU04tcmVsYXRlZCBjb25maWcgKi8KKwl1MzIgc25fc3luY19tb2RlOwkvKiBlbmFibGUvIHN5bmMgc2hpZnQgY2NsayAvIHN5bmMgc2hpZnQgbWNsayAqLworCXUzMiBzbl9wdF9tb2RlOwkJLyogcGFzcyB0aHJvdWdoIG1vZGUgKi8KKwl1MzIgc25fZWNjX2VuOworCXUzMiBzbl93Yl9lbjsKKwl1MzIgc25fY3J5c3RhbF9mcmVxOworCXUzMiBzbl9zcGVlZDsKKwl1MzIgc25fb3JnOworCXUzMiBzbl9kZXB0aDsKKwl1MzIgc25fZGxsX3RhcDsKKwl1MzIgc25fcmRfbGF0ZW5jeTsKKworCXUzMiBtYWNfYWRkcl9oaV8wOworCXUzMiBtYWNfYWRkcl9oaV8xOworCXUzMiBtYWNfYWRkcl9oaV8yOworCXUzMiBtYWNfYWRkcl9oaV8zOworCisJdTMyIG1hZ2ljOwkJLyogaW5kaWNhdGVzIGZsYXNoIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisKKwl1MzIgbW5fcmRpbW07CisJdTMyIG1uX2RsbF9vdmVycmlkZTsKKworfTsKKworI2RlZmluZSBGTEFTSF9OVU1fUE9SVFMJCSg0KQorCitzdHJ1Y3QgbmV0eGVuX2ZsYXNoX21hY19hZGRyIHsKKwl1MzIgZmxhc2hfYWRkclszMl07Cit9OworCitzdHJ1Y3QgbmV0eGVuX3VzZXJfb2xkX2luZm8geworCXU4IGZsYXNoX21kNVsxNl07CisJdTggY3JiaW5pdF9tZDVbMTZdOworCXU4IGJyZGNmZ19tZDVbMTZdOworCS8qIGJvb3Rsb2FkZXIgKi8KKwl1MzIgYm9vdGxkX3ZlcnNpb247CisJdTMyIGJvb3RsZF9zaXplOworCXU4IGJvb3RsZF9tZDVbMTZdOworCS8qIGltYWdlICovCisJdTMyIGltYWdlX3ZlcnNpb247CisJdTMyIGltYWdlX3NpemU7CisJdTggaW1hZ2VfbWQ1WzE2XTsKKwkvKiBwcmltYXJ5IGltYWdlIHN0YXR1cyAqLworCXUzMiBwcmltYXJ5X3N0YXR1czsKKwl1MzIgc2Vjb25kYXJ5X3ByZXNlbnQ7CisKKwkvKiBNQUMgYWRkcmVzcyAsIDQgcG9ydHMgKi8KKwlzdHJ1Y3QgbmV0eGVuX2ZsYXNoX21hY19hZGRyIG1hY19hZGRyW0ZMQVNIX05VTV9QT1JUU107Cit9OworI2RlZmluZSBGTEFTSF9OVU1fTUFDX1BFUl9QT1JUCTMyCitzdHJ1Y3QgbmV0eGVuX3VzZXJfaW5mbyB7CisJdTggZmxhc2hfbWQ1WzE2ICogNjRdOworCS8qIGJvb3Rsb2FkZXIgKi8KKwl1MzIgYm9vdGxkX3ZlcnNpb247CisJdTMyIGJvb3RsZF9zaXplOworCS8qIGltYWdlICovCisJdTMyIGltYWdlX3ZlcnNpb247CisJdTMyIGltYWdlX3NpemU7CisJLyogcHJpbWFyeSBpbWFnZSBzdGF0dXMgKi8KKwl1MzIgcHJpbWFyeV9zdGF0dXM7CisJdTMyIHNlY29uZGFyeV9wcmVzZW50OworCisJLyogTUFDIGFkZHJlc3MgLCA0IHBvcnRzLCAzMiBhZGRyZXNzIHBlciBwb3J0ICovCisJdTY0IG1hY19hZGRyW0ZMQVNIX05VTV9QT1JUUyAqIEZMQVNIX05VTV9NQUNfUEVSX1BPUlRdOworCXUzMiBzdWJfc3lzX2lkOworCXU4IHNlcmlhbF9udW1bMzJdOworCisJLyogQW55IHVzZXIgZGVmaW5lZCBkYXRhICovCit9OworCisvKgorICogRmxhc2ggTGF5b3V0IC0gbmV3IGZvcm1hdC4KKyAqLworc3RydWN0IG5ldHhlbl9uZXdfdXNlcl9pbmZvIHsKKwl1OCBmbGFzaF9tZDVbMTYgKiA2NF07CisJLyogYm9vdGxvYWRlciAqLworCXUzMiBib290bGRfdmVyc2lvbjsKKwl1MzIgYm9vdGxkX3NpemU7CisJLyogaW1hZ2UgKi8KKwl1MzIgaW1hZ2VfdmVyc2lvbjsKKwl1MzIgaW1hZ2Vfc2l6ZTsKKwkvKiBwcmltYXJ5IGltYWdlIHN0YXR1cyAqLworCXUzMiBwcmltYXJ5X3N0YXR1czsKKwl1MzIgc2Vjb25kYXJ5X3ByZXNlbnQ7CisKKwkvKiBNQUMgYWRkcmVzcyAsIDQgcG9ydHMsIDMyIGFkZHJlc3MgcGVyIHBvcnQgKi8KKwl1NjQgbWFjX2FkZHJbRkxBU0hfTlVNX1BPUlRTICogRkxBU0hfTlVNX01BQ19QRVJfUE9SVF07CisJdTMyIHN1Yl9zeXNfaWQ7CisJdTggc2VyaWFsX251bVszMl07CisKKwkvKiBBbnkgdXNlciBkZWZpbmVkIGRhdGEgKi8KK307CisKKyNkZWZpbmUgU0VDT05EQVJZX0lNQUdFX1BSRVNFTlQgMHhiM2I0YjViNgorI2RlZmluZSBTRUNPTkRBUllfSU1BR0VfQUJTRU5UCTB4ZmZmZmZmZmYKKyNkZWZpbmUgUFJJTUFSWV9JTUFHRV9HT09ECTB4NWE1YTVhNWEKKyNkZWZpbmUgUFJJTUFSWV9JTUFHRV9CQUQJMHhmZmZmZmZmZgorCisvKiBGbGFzaCBtZW1vcnkgbWFwICovCit0eXBlZGVmIGVudW0geworCUNSQklOSVRfU1RBUlQgPSAwLAkvKiBDcmJpbml0IHNlY3Rpb24gKi8KKwlCUkRDRkdfU1RBUlQgPSAweDQwMDAsCS8qIGJvYXJkIGNvbmZpZyAqLworCUlOSVRDT0RFX1NUQVJUID0gMHg2MDAwLAkvKiBwZWd0dW5lIGNvZGUgKi8KKwlCT09UTERfU1RBUlQgPSAweDEwMDAwLAkvKiBib290bGQgKi8KKwlJTUFHRV9TVEFSVCA9IDB4NDMwMDAsCS8qIGNvbXByZXNzZWQgaW1hZ2UgKi8KKwlTRUNPTkRBUllfU1RBUlQgPSAweDIwMDAwMCwJLyogYmFja3VwIGltYWdlcyAqLworCVBYRV9TVEFSVCA9IDB4M0UwMDAwLAkvKiB1c2VyIGRlZmluZWQgcmVnaW9uICovCisJVVNFUl9TVEFSVCA9IDB4M0U4MDAwLAkvKiBVc2VyIGRlZmluZWQgcmVnaW9uIGZvciBuZXcgYm9hcmRzICovCisJRklYRURfU1RBUlQgPSAweDNGMDAwMAkvKiBiYWNrdXAgb2YgY3JiaW5pdCAqLworfSBuZXR4ZW5fZmxhc2hfbWFwX3Q7CisKKyNkZWZpbmUgVVNFUl9TVEFSVF9PTEQgUFhFX1NUQVJUCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisKKyNkZWZpbmUgRkxBU0hfU1RBUlQJCShDUkJJTklUX1NUQVJUKQorI2RlZmluZSBJTklUX1NFQ1RPUgkJKDApCisjZGVmaW5lIFBSSU1BUllfU1RBUlQgCQkoQk9PVExEX1NUQVJUKQorI2RlZmluZSBGTEFTSF9DUkJJTklUX1NJWkUgCSgweDQwMDApCisjZGVmaW5lIEZMQVNIX0JSRENGR19TSVpFIAkoc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbykpCisjZGVmaW5lIEZMQVNIX1VTRVJfU0laRQkJKHNpemVvZihuZXR4ZW5fdXNlcl9pbmZvKS9zaXplb2YodTMyKSkKKyNkZWZpbmUgRkxBU0hfU0VDT05EQVJZX1NJWkUgCShVU0VSX1NUQVJULVNFQ09OREFSWV9TVEFSVCkKKyNkZWZpbmUgTlVNX1BSSU1BUllfU0VDVE9SUwkoMHgyMCkKKyNkZWZpbmUgTlVNX0NPTkZJR19TRUNUT1JTIAkoMSkKKyNkZWZpbmUgUEZYICJuZXR4ZW46ICIKKworLyogTm90ZTogTWFrZSBzdXJlIHRvIG5vdCBjYWxsIHRoaXMgYmVmb3JlIGFkYXB0ZXItPnBvcnQgaXMgdmFsaWQgKi8KKyNpZiAhZGVmaW5lZChORVRYRU5fREVCVUcpCisjZGVmaW5lIERQUklOVEsoa2xldmVsLCBmbXQsIGFyZ3MuLi4pCWRvIHsgXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGtsZXZlbCwgZm10LCBhcmdzLi4uKQlkbyB7IFwKKwlwcmludGsoS0VSTl8jI2tsZXZlbCBQRlggIiVzOiAlczogIiBmbXQsIF9fRlVOQ1RJT05fXyxcCisJCShhZGFwdGVyICE9IE5VTEwgJiYgYWRhcHRlci0+cG9ydCAhPSBOVUxMICYmIFwKKwkJYWRhcHRlci0+cG9ydFswXSAhPSBOVUxMICYmIFwKKwkJYWRhcHRlci0+cG9ydFswXS0+bmV0ZGV2ICE9IE5VTEwpID8gXAorCQlhZGFwdGVyLT5wb3J0WzBdLT5uZXRkZXYtPm5hbWUgOiBOVUxMLCBcCisJCSMjIGFyZ3MpOyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogTnVtYmVyIG9mIHN0YXR1cyBkZXNjcmlwdG9ycyB0byBoYW5kbGUgcGVyIGludGVycnVwdCAqLworI2RlZmluZSBNQVhfU1RBVFVTX0hBTkRMRQkoMTI4KQorCisvKgorICogbmV0eGVuX3NrYl9mcmFne30gaXMgdG8gY29udGFpbiBtYXBwaW5nIGluZm8gZm9yIGVhY2ggU0cgbGlzdC4gVGhpcworICogaGFzIHRvIGJlIGZyZWVkIHdoZW4gRE1BIGlzIGNvbXBsZXRlLiBUaGlzIGlzIHBhcnQgb2YgbmV0eGVuX3R4X2J1ZmZlcnt9LgorICovCitzdHJ1Y3QgbmV0eGVuX3NrYl9mcmFnIHsKKwl1NjQgZG1hOworCXUzMiBsZW5ndGg7Cit9OworCisvKiAgICBGb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVycyAgICAqLworI2RlZmluZQlORVRYRU5fQlVGRkVSX0ZSRUUJMAorI2RlZmluZQlORVRYRU5fQlVGRkVSX0JVU1kJMQorCisvKgorICogVGhlcmUgd2lsbCBiZSBvbmUgbmV0eGVuX2J1ZmZlciBwZXIgc2tiIHBhY2tldC4gICAgVGhlc2Ugd2lsbCBiZQorICogdXNlZCB0byBzYXZlIHRoZSBkbWEgaW5mbyBmb3IgcGNpX3VubWFwX3BhZ2UoKQorICovCitzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldHhlbl9za2JfZnJhZyBmcmFnX2FycmF5W01BWF9CVUZGRVJTX1BFUl9DTUQgKyAxXTsKKwl1MzIgdG90YWxfbGVuZ3RoOworCXUzMiBtc3M7CisJdTE2IHBvcnQ7CisJdTggY21kOworCXU4IGZyYWdfY291bnQ7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOworCXUzMiBzdGF0ZTsKKwl1MzIgbm9fb2ZfZGVzY3JpcHRvcnM7Cit9OworCisvKiBJbiByeF9idWZmZXIsIHdlIGRvIG5vdCBuZWVkIG11bHRpcGxlIGZyYWdtZW50cyBhcyBpcyBhIHNpbmdsZSBidWZmZXIgKi8KK3N0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU2NCBkbWE7CisJdTE2IHJlZl9oYW5kbGU7CisJdTE2IHN0YXRlOworfTsKKworLyogQm9hcmQgdHlwZXMgKi8KKyNkZWZpbmUJTkVUWEVOX05JQ19HQkUJMHgwMQorI2RlZmluZQlORVRYRU5fTklDX1hHQkUJMHgwMgorCisvKgorICogT25lIGhhcmR3YXJlX2NvbnRleHR7fSBwZXIgYWRhcHRlcgorICogY29udGFpbnMgaW50ZXJydXB0IGluZm8gYXMgd2VsbCBzaGFyZWQgaGFyZHdhcmUgaW5mby4KKyAqLworc3RydWN0IG5ldHhlbl9oYXJkd2FyZV9jb250ZXh0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl2b2lkIF9faW9tZW0gKnBjaV9iYXNlMDsKKwl2b2lkIF9faW9tZW0gKnBjaV9iYXNlMTsKKwl2b2lkIF9faW9tZW0gKnBjaV9iYXNlMjsKKworCXU4IHJldmlzaW9uX2lkOworCXUxNiBib2FyZF90eXBlOworCXUxNiBtYXhfcG9ydHM7CisJc3RydWN0IG5ldHhlbl9ib2FyZF9pbmZvIGJvYXJkY2ZnOworCXUzMiB4Z19saW5rdXA7CisJdTMyIHFnX2xpbmtzdXA7CisJLyogQWRkcmVzcyBvZiBjbWQgcmluZyBpbiBQaGFudG9tICovCisJc3RydWN0IGNtZF9kZXNjX3R5cGUwICpjbWRfZGVzY19oZWFkOworCWNoYXIgKnBhdXNlYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqY21kX2Rlc2NfcGRldjsKKwlkbWFfYWRkcl90IGNtZF9kZXNjX3BoeXNfYWRkcjsKKwlkbWFfYWRkcl90IHBhdXNlX3BoeXNhZGRyOworCXN0cnVjdCBwY2lfZGV2ICpwYXVzZV9wZGV2OworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcjsKK307CisKKyNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFCTY0CS8qIFdpdGggRkNTICovCisjZGVmaW5lIEVUSEVSTkVUX0ZDU19TSVpFCQk0CisKK3N0cnVjdCBuZXR4ZW5fYWRhcHRlcl9zdGF0cyB7CisJdTY0IGludHM7CisJdTY0IGhvc3RpbnRzOworCXU2NCBvdGhlcmludHM7CisJdTY0IHByb2Nlc3NfcmN2OworCXU2NCBwcm9jZXNzX3htaXQ7CisJdTY0IG5veG1pdGRvbmU7CisJdTY0IHhtaXRjc3VtbWVkOworCXU2NCBwb3N0X2NhbGxlZDsKKwl1NjQgcG9zdGVkOworCXU2NCBsYXN0cG9zdGVkOworCXU2NCBnb29kc2ticG9zdHM7Cit9OworCisvKgorICogUmN2IERlc2NyaXB0b3IgQ29udGV4dC4gT25lIHN1Y2ggcGVyIFJjdiBEZXNjcmlwdG9yLiBUaGVyZSBtYXkKKyAqIGJlIG9uZSBSY3YgRGVzY3JpcHRvciBmb3Igbm9ybWFsIHBhY2tldHMsIG9uZSBmb3IganVtYm8gYW5kIG1heSBiZSBvdGhlcnMuCisgKi8KK3N0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4IHsKKwl1MzIgZmxhZ3M7CisJdTMyIHByb2R1Y2VyOworCXUzMiByY3ZfcGVuZGluZzsJLyogTnVtIG9mIGJ1ZnMgcG9zdGVkIGluIHBoYW50b20gKi8KKwl1MzIgcmN2X2ZyZWU7CQkvKiBOdW0gb2YgYnVmcyBpbiBmcmVlIGxpc3QgKi8KKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGh5c19wZGV2OworCXN0cnVjdCByY3ZfZGVzYyAqZGVzY19oZWFkOwkvKiBhZGRyZXNzIG9mIHJ4IHJpbmcgaW4gUGhhbnRvbSAqLworCXUzMiBtYXhfcnhfZGVzY19jb3VudDsKKwl1MzIgZG1hX3NpemU7CisJdTMyIHNrYl9zaXplOworCXN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyICpyeF9idWZfYXJyOwkvKiByeCBidWZmZXJzIGZvciByZWNlaXZlICAgKi8KKwlpbnQgYmVnaW5fYWxsb2M7Cit9OworCisvKgorICogUmVjZWl2ZSBjb250ZXh0LiBUaGVyZSBpcyBvbmUgc3VjaCBzdHJ1Y3R1cmUgcGVyIGluc3RhbmNlIG9mIHRoZQorICogcmVjZWl2ZSBwcm9jZXNzaW5nLiBBbnkgc3RhdGUgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxldmFudCB0bworICogdGhlIHJlY2VpdmUsIGFuZCBpcyBtdXN0IGJlIGluIHRoaXMgc3RydWN0dXJlLiBUaGUgZ2xvYmFsIGRhdGEgbWF5IGJlCisgKiBwcmVzZW50IGVsc2V3aGVyZS4KKyAqLworc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgeworCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4IHJjdl9kZXNjW05VTV9SQ1ZfREVTQ19SSU5HU107CisJdTMyIHN0YXR1c19yeF9wcm9kdWNlcjsKKwl1MzIgc3RhdHVzX3J4X2NvbnN1bWVyOworCWRtYV9hZGRyX3QgcmN2X3N0YXR1c19kZXNjX3BoeXNfYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcmN2X3N0YXR1c19kZXNjX3BkZXY7CisJc3RydWN0IHN0YXR1c19kZXNjICpyY3Zfc3RhdHVzX2Rlc2NfaGVhZDsKK307CisKKyNkZWZpbmUgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCAweDAyCisKK3N0cnVjdCBuZXR4ZW5fZHJ2b3BzOworCitzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgeworCXN0cnVjdCBuZXR4ZW5faGFyZHdhcmVfY29udGV4dCBhaHc7CisJaW50IHBvcnRfY291bnQ7CQkvKiBOdW1iZXIgb2YgY29uZmlndXJlZCBwb3J0cyAgKi8KKwlpbnQgYWN0aXZlX3BvcnRzOwkvKiBOdW1iZXIgb2Ygb3BlbiBwb3J0cyAqLworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydFtORVRYRU5fTUFYX1BPUlRTXTsJLyogcHRyIHRvIGVhY2ggcG9ydCAgKi8KKwlzcGlubG9ja190IHR4X2xvY2s7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ190YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisKKwl1MzIgY3Vycl93aW5kb3c7CisKKwl1MzIgY21kX3Byb2R1Y2VyOworCXUzMiBjbWRfY29uc3VtZXI7CisKKwl1MzIgbGFzdF9jbWRfY29uc3VtZXI7CisJdTMyIG1heF90eF9kZXNjX2NvdW50OworCXUzMiBtYXhfcnhfZGVzY19jb3VudDsKKwl1MzIgbWF4X2p1bWJvX3J4X2Rlc2NfY291bnQ7CisJLyogTnVtIG9mIGluc3RhbmNlcyBhY3RpdmUgb24gY21kIGJ1ZmZlciByaW5nICovCisJdTMyIHByb2NfY21kX2J1Zl9jb3VudGVyOworCisJdTMyIG51bV90aHJlYWRzLCB0b3RhbF90aHJlYWRzOwkvKlVzZSB0byBrZWVwIHRyYWNrIG9mIHhtaXQgdGhyZWFkcyAqLworCisJdTMyIGZsYWdzOworCXUzMiBpcnE7CisJaW50IGRyaXZlcl9taXNtYXRjaDsKKwl1MzIgdGVtcDsKKworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlcl9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqY21kX2J1Zl9hcnI7CS8qIENvbW1hbmQgYnVmZmVycyBmb3IgeG1pdCAqLworCisJLyoKKwkgKiBSZWNlaXZlIGluc3RhbmNlcy4gVGhlc2UgY2FuIGJlIGVpdGhlciBvbmUgcGVyIHBvcnQsCisJICogb3Igb25lIHBlciBwZWcsIGV0Yy4KKwkgKi8KKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCByZWN2X2N0eFtNQVhfUkNWX0NUWF07CisKKwlpbnQgaXNfdXA7CisJaW50IHdvcmtfZG9uZTsKKwlzdHJ1Y3QgbmV0eGVuX2Rydm9wcyAqb3BzOworfTsJCQkJLyogbmV0eGVuX2FkYXB0ZXIgc3RydWN0dXJlICovCisKKy8qIE1heCBudW1iZXIgb2YgeG1pdCBwcm9kdWNlciB0aHJlYWRzIHRoYXQgY2FuIHJ1biBzaW11bHRhbmVvdXNseSAqLworI2RlZmluZQlNQVhfWE1JVF9QUk9EVUNFUlMJCTE2CisKK3N0cnVjdCBuZXR4ZW5fcG9ydF9zdGF0cyB7CisJdTY0IHJjdmRiYWRza2I7CisJdTY0IHhtaXRjYWxsZWQ7CisJdTY0IHhtaXRlZGZyYW1lczsKKwl1NjQgeG1pdGZpbmlzaGVkOworCXU2NCBiYWRza2JsZW47CisJdTY0IG5vY21kZGVzY3JpcHRvcjsKKwl1NjQgcG9sbGVkOworCXU2NCB1cGhhcHB5OworCXU2NCB1cGRyb3BwZWQ7CisJdTY0IHVwbGNvbmc7CisJdTY0IHVwaGNvbmc7CisJdTY0IHVwbWNvbmc7CisJdTY0IHVwZHVubm87CisJdTY0IHNrYmZyZWVkOworCXU2NCB0eGRyb3BwZWQ7CisJdTY0IHR4bnVsbHNrYjsKKwl1NjQgY3N1bW1lZDsKKwl1NjQgbm9fcmN2OworCXU2NCByeGJ5dGVzOworCXU2NCB0eGJ5dGVzOworfTsKKworc3RydWN0IG5ldHhlbl9wb3J0IHsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwl1MTYgcG9ydG51bTsJCS8qIEdCRSBwb3J0IG51bWJlciAqLworCXUxNiBsaW5rX3NwZWVkOworCXUxNiBsaW5rX2R1cGxleDsKKwl1MTYgbGlua19hdXRvbmVnOworCisJaW50IGZsYWdzOworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJc3RydWN0IG5ldHhlbl9wb3J0X3N0YXRzIHN0YXRzOworfTsKKworI2RlZmluZSBQQ0lfT0ZGU0VUX0ZJUlNUX1JBTkdFKGFkYXB0ZXIsIG9mZikgICAgXAorCSgoYWRhcHRlciktPmFody5wY2lfYmFzZTAgKyAob2ZmKSkKKyNkZWZpbmUgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwgb2ZmKSAgIFwKKwkoKGFkYXB0ZXIpLT5haHcucGNpX2Jhc2UxICsgKG9mZikgLSBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCkKKyNkZWZpbmUgUENJX09GRlNFVF9USElSRF9SQU5HRShhZGFwdGVyLCBvZmYpICAgIFwKKwkoKGFkYXB0ZXIpLT5haHcucGNpX2Jhc2UyICsgKG9mZikgLSBUSElSRF9QQUdFX0dST1VQX1NUQVJUKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGNpX2Jhc2Vfb2Zmc2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWlmICgob2ZmIDwgRklSU1RfUEFHRV9HUk9VUF9FTkQpICYmIChvZmYgPj0gRklSU1RfUEFHRV9HUk9VUF9TVEFSVCkpIHsKKwkJcmV0dXJuIChhZGFwdGVyLT5haHcucGNpX2Jhc2UwICsgb2ZmKTsKKwl9IGVsc2UgaWYgKChvZmYgPCBTRUNPTkRfUEFHRV9HUk9VUF9FTkQpICYmCisJCSAgIChvZmYgPj0gU0VDT05EX1BBR0VfR1JPVVBfU1RBUlQpKSB7CisJCXJldHVybiAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMSArIG9mZiAtIFNFQ09ORF9QQUdFX0dST1VQX1NUQVJUKTsKKwl9IGVsc2UgaWYgKChvZmYgPCBUSElSRF9QQUdFX0dST1VQX0VORCkgJiYKKwkJICAgKG9mZiA+PSBUSElSRF9QQUdFX0dST1VQX1NUQVJUKSkgeworCQlyZXR1cm4gKGFkYXB0ZXItPmFody5wY2lfYmFzZTIgKyBvZmYgLSBUSElSRF9QQUdFX0dST1VQX1NUQVJUKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpwY2lfYmFzZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoKG9mZiA8IEZJUlNUX1BBR0VfR1JPVVBfRU5EKSAmJiAob2ZmID49IEZJUlNUX1BBR0VfR1JPVVBfU1RBUlQpKSB7CisJCXJldHVybiBhZGFwdGVyLT5haHcucGNpX2Jhc2UwOworCX0gZWxzZSBpZiAoKG9mZiA8IFNFQ09ORF9QQUdFX0dST1VQX0VORCkgJiYKKwkJICAgKG9mZiA+PSBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCkpIHsKKwkJcmV0dXJuIGFkYXB0ZXItPmFody5wY2lfYmFzZTE7CisJfSBlbHNlIGlmICgob2ZmIDwgVEhJUkRfUEFHRV9HUk9VUF9FTkQpICYmCisJCSAgIChvZmYgPj0gVEhJUkRfUEFHRV9HUk9VUF9TVEFSVCkpIHsKKwkJcmV0dXJuIGFkYXB0ZXItPmFody5wY2lfYmFzZTI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbmV0eGVuX2Rydm9wcyB7CisJaW50ICgqZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGludCk7CisJaW50ICgqZGlzYWJsZV9waHlfaW50ZXJydXB0cykgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqLCBpbnQpOworCXZvaWQgKCpoYW5kbGVfcGh5X2ludHIpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKik7CisJaW50ICgqbWFjYWRkcl9zZXQpIChzdHJ1Y3QgbmV0eGVuX3BvcnQgKiwgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCk7CisJaW50ICgqc2V0X210dSkgKHN0cnVjdCBuZXR4ZW5fcG9ydCAqLCBpbnQpOworCWludCAoKnNldF9wcm9taXNjKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGludCwKKwkJCSAgICBuZXR4ZW5fbml1X3Byb21fbW9kZV90KTsKKwlpbnQgKCp1bnNldF9wcm9taXNjKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGludCwKKwkJCSAgICAgIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QpOworCWludCAoKnBoeV9yZWFkKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGxvbmcgcGh5LCBsb25nIHJlZywgdTMyICopOworCWludCAoKnBoeV93cml0ZSkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqLCBsb25nIHBoeSwgbG9uZyByZWcsIHUzMiB2YWwpOworCWludCAoKmluaXRfcG9ydCkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqLCBpbnQpOworCXZvaWQgKCppbml0X25pdSkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqKTsKKwlpbnQgKCpzdG9wX3BvcnQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50KTsKK307CisKK2V4dGVybiBjaGFyIG5ldHhlbl9uaWNfZHJpdmVyX25hbWVbXTsKKworaW50IG5ldHhlbl9uaXVfeGdiZV9lbmFibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgIGludCBwb3J0KTsKK2ludCBuZXR4ZW5fbml1X2diZV9lbmFibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgaW50IHBvcnQpOworaW50IG5ldHhlbl9uaXVfeGdiZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgaW50IHBvcnQpOworaW50IG5ldHhlbl9uaXVfZ2JlX2Rpc2FibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgIGludCBwb3J0KTsKK2ludCBuZXR4ZW5fbml1X3hnYmVfY2xlYXJfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgaW50IHBvcnQpOworaW50IG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJaW50IHBvcnQpOwordm9pZCBuZXR4ZW5fbmljX3hnYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl9uaWNfZ2JlX2hhbmRsZV9waHlfaW50cihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBuZXR4ZW5fbml1X2diZV9zZXRfbWlpX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKKwkJCQkgbG9uZyBlbmFibGUpOwordm9pZCBuZXR4ZW5fbml1X2diZV9zZXRfZ21paV9tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQsCisJCQkJICBsb25nIGVuYWJsZSk7CitpbnQgbmV0eGVuX25pdV9nYmVfcGh5X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBsb25nIHBoeSwgbG9uZyByZWcsCisJCQkgICAgX19sZTMyICogcmVhZHZhbCk7CitpbnQgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgbG9uZyBwaHksCisJCQkgICAgIGxvbmcgcmVnLCBfX2xlMzIgdmFsKTsKKworLyogRnVuY3Rpb25zIGF2YWlsYWJsZSBmcm9tIG5ldHhlbl9uaWNfaHcuYyAqLworaW50IG5ldHhlbl9uaWNfc2V0X210dV94Z2Ioc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LCBpbnQgbmV3X210dSk7CitpbnQgbmV0eGVuX25pY19zZXRfbXR1X2diKHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwgaW50IG5ld19tdHUpOwordm9pZCBuZXR4ZW5fbmljX2luaXRfbml1X2diKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgd25kdyk7Cit2b2lkIG5ldHhlbl9uaWNfcmVnX3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwgdTMyIHZhbCk7CitpbnQgbmV0eGVuX25pY19yZWdfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYpOwordm9pZCBuZXR4ZW5fbmljX3dyaXRlX3cwKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIGluZGV4LCB1MzIgdmFsdWUpOwordm9pZCBuZXR4ZW5fbmljX3JlYWRfdzAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgaW5kZXgsIHUzMiAqIHZhbHVlKTsKKworaW50IG5ldHhlbl9uaWNfZ2V0X2JvYXJkX2luZm8oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBuZXR4ZW5fbmljX2h3X3JlYWRfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLCB2b2lkICpkYXRhLAorCQkJICBpbnQgbGVuKTsKK2ludCBuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwgdm9pZCAqZGF0YSwKKwkJCSAgIGludCBsZW4pOwordm9pZCBuZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZiwgaW50IGRhdGEpOworCisvKiBGdW5jdGlvbnMgZnJvbSBuZXR4ZW5fbmljX2luaXQuYyAqLwordm9pZCBuZXR4ZW5fcGhhbnRvbV9pbml0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBlZ3R1bmVfdmFsKTsKK3ZvaWQgbmV0eGVuX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBuZXR4ZW5fcGluaXRfZnJvbV9yb20oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgdmVyYm9zZSk7CitpbnQgbmV0eGVuX3JvbV9mYXN0X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50ICp2YWxwKTsKK2ludCBuZXR4ZW5fcm9tX2Zhc3Rfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGRhdGEpOworaW50IG5ldHhlbl9yb21fc2Uoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcik7CitpbnQgbmV0eGVuX2RvX3JvbV9zZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyKTsKKworLyogRnVuY3Rpb25zIGZyb20gbmV0eGVuX25pY19pc3IuYyAqLwordm9pZCBuZXR4ZW5fbmljX2lzcl9vdGhlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBuZXR4ZW5faW5kaWNhdGVfbGlua19zdGF0dXMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgcG9ydCwKKwkJCQkgdTMyIGxpbmspOwordm9pZCBuZXR4ZW5faGFuZGxlX3BvcnRfaW50KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHBvcnQsCisJCQkgICAgdTMyIGVuYWJsZSk7Cit2b2lkIG5ldHhlbl9uaWNfc3RvcF9hbGxfcG9ydHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9zdyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX2h3KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkICpuZXR4ZW5fYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzeiwgZG1hX2FkZHJfdCAqIHB0ciwKKwkJICAgc3RydWN0IHBjaV9kZXYgKip1c2VkX2Rldik7Cit2b2lkIG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb3BzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CitpbnQgbmV0eGVuX2luaXRfZmlybXdhcmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl90c29fY2hlY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IG5ldHhlbl9uaWNfaHdfcmVzb3VyY2VzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK2ludAorbmV0eGVuX25pY19kb19pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKnVfZGF0YSwKKwkJICAgIHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCk7CitpbnQgbmV0eGVuX25pY19yeF9oYXNfd29yayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaWNfdHhfaGFzX3dvcmsoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX3dhdGNoZG9nX3Rhc2sodW5zaWduZWQgbG9uZyB2KTsKK3ZvaWQgbmV0eGVuX3Bvc3RfcnhfYnVmZmVycyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjdHgsCisJCQkgICAgdTMyIHJpbmdpZCk7Cit2b2lkIG5ldHhlbl9wcm9jZXNzX2NtZF9yaW5nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit1MzIgbmV0eGVuX3Byb2Nlc3NfcmN2X3Jpbmcoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgY3R4LCBpbnQgbWF4KTsKK3ZvaWQgbmV0eGVuX25pY19zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitpbnQgbmV0eGVuX25pY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KTsKK2ludCBuZXR4ZW5fbmljX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCk7CitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0eGVuX25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR4ZW5fbmljX2Rpc2FibGVfaW50KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKgorCSAqIElTUl9JTlRfTUFTSzogQ2FuIGJlIHJlYWQgZnJvbSB3aW5kb3cgMCBvciAxLgorCSAqLworCXdyaXRlbCgweDdmZiwgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwgSVNSX0lOVF9NQVNLKSk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHhlbl9uaWNfZW5hYmxlX2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIG1hc2s7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmFody5ib2FyZF90eXBlKSB7CisJY2FzZSBORVRYRU5fTklDX0dCRToKKwkJbWFzayA9IDB4NzdiOworCQlicmVhazsKKwljYXNlIE5FVFhFTl9OSUNfWEdCRToKKwkJbWFzayA9IDB4NzdmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYXNrID0gMHg3ZmY7CisJCWJyZWFrOworCX0KKworCXdyaXRlbChtYXNrLCBQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLCBJU1JfSU5UX01BU0spKTsKKworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkpIHsKKwkJbWFzayA9IDB4YmZmOworCQl3cml0ZWwobWFzaywgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCSAgICAgSVNSX0lOVF9UQVJHRVRfTUFTSykpOworCX0KK30KKworLyoKKyAqIE5ldFhlbiBCb2FyZCBpbmZvcm1hdGlvbgorICovCisKKyNkZWZpbmUgTkVUWEVOX01BWF9TSE9SVF9OQU1FIDE2CitzdHJ1Y3QgbmV0eGVuX2JyZGluZm8geworCW5ldHhlbl9icmR0eXBlX3QgYnJkdHlwZTsJLyogdHlwZSBvZiBib2FyZCAqLworCWxvbmcgcG9ydHM7CQkvKiBtYXggbm8gb2YgcGh5c2ljYWwgcG9ydHMgKi8KKwljaGFyIHNob3J0X25hbWVbTkVUWEVOX01BWF9TSE9SVF9OQU1FXTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0eGVuX2JyZGluZm8gbmV0eGVuX2JvYXJkc1tdID0geworCXtORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQsIDEsICJYR2IgQ1g0In0sCisJe05FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0hNRVosIDEsICJYR2IgSE1FWiJ9LAorCXtORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaLCAyLCAiWEdiIElNRVoifSwKKwl7TkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEcsIDEsICJYR2IgWEZQIn0sCisJe05FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEcsIDQsICJRdWFkIEdiIn0sCisJe05FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMkcsIDIsICJEdWFsIEdiIn0sCit9OworCisjZGVmaW5lIE5VTV9TVVBQT1JURURfQk9BUkRTIChzaXplb2YobmV0eGVuX2JvYXJkcykvc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYnJkaW5mbykpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYnJkX3BvcnRfYnlfdHlwZSh1MzIgdHlwZSwgaW50ICpwb3J0cykKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fU1VQUE9SVEVEX0JPQVJEUzsgKytpKSB7CisJCWlmIChuZXR4ZW5fYm9hcmRzW2ldLmJyZHR5cGUgPT0gdHlwZSkgeworCQkJKnBvcnRzID0gbmV0eGVuX2JvYXJkc1tpXS5wb3J0czsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCSpwb3J0cyA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYnJkX25hbWVfYnlfdHlwZSh1MzIgdHlwZSwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fU1VQUE9SVEVEX0JPQVJEUzsgKytpKSB7CisJCWlmIChuZXR4ZW5fYm9hcmRzW2ldLmJyZHR5cGUgPT0gdHlwZSkgeworCQkJc3RyY3B5KG5hbWUsIG5ldHhlbl9ib2FyZHNbaV0uc2hvcnRfbmFtZSk7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJfQorCWlmICghZm91bmQpCisJCW5hbWUgPSAiVW5rbm93biI7Cit9CisKK2ludCBuZXR4ZW5faXNfZmxhc2hfc3VwcG9ydGVkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CitpbnQgbmV0eGVuX2dldF9mbGFzaF9tYWNfYWRkcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBtYWNbXSk7CisKK2V4dGVybiB2b2lkIG5ldHhlbl9jaGFuZ2VfcmluZ3BhcmFtKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gaW50IG5ldHhlbl9yb21fZmFzdF9yZWFkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsCisJCQkJaW50ICp2YWxwKTsKKworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBuZXR4ZW5fbmljX2V0aHRvb2xfb3BzOworCisjZW5kaWYJCQkJLyogX19ORVRYRU5fTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5MTRhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYwpAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKiAKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqIAorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqIGV0aHRvb2wgc3VwcG9ydCBmb3IgbmV0eGVuIG5pYworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2h3LmgiCisjaW5jbHVkZSAibmV0eGVuX25pYy5oIgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfcGhhbl9yZWcuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2lvY3RsLmgiCisKK3N0cnVjdCBuZXR4ZW5fbmljX3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHNpemVvZl9zdGF0OworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgTkVUWEVOX05JQ19TVEFUKG0pIHNpemVvZigoKHN0cnVjdCBuZXR4ZW5fcG9ydCAqKTApLT5tKSwgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IG5ldHhlbl9wb3J0LCBtKQorCisjZGVmaW5lIE5FVFhFTl9OSUNfUE9SVF9XSU5ET1cgMHgxMDAwMAorI2RlZmluZSBORVRYRU5fTklDX0lOVkFMSURfREFUQSAweERFQURCRUVGCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0eGVuX25pY19zdGF0cyBuZXR4ZW5fbmljX2dzdHJpbmdzX3N0YXRzW10gPSB7CisJeyJyY3ZkX2JhZF9za2IiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMucmN2ZGJhZHNrYil9LAorCXsieG1pdF9jYWxsZWQiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMueG1pdGNhbGxlZCl9LAorCXsieG1pdGVkX2ZyYW1lcyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy54bWl0ZWRmcmFtZXMpfSwKKwl7InhtaXRfZmluaXNoZWQiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMueG1pdGZpbmlzaGVkKX0sCisJeyJiYWRfc2tiX2xlbiIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy5iYWRza2JsZW4pfSwKKwl7Im5vX2NtZF9kZXNjIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLm5vY21kZGVzY3JpcHRvcil9LAorCXsicG9sbGVkIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnBvbGxlZCl9LAorCXsidXBoYXBweSIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy51cGhhcHB5KX0sCisJeyJ1cGRyb3BwZWQiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMudXBkcm9wcGVkKX0sCisJeyJ1cGxjb25nIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnVwbGNvbmcpfSwKKwl7InVwaGNvbmciLCBORVRYRU5fTklDX1NUQVQoc3RhdHMudXBoY29uZyl9LAorCXsidXBtY29uZyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy51cG1jb25nKX0sCisJeyJ1cGR1bm5vIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnVwZHVubm8pfSwKKwl7InNrYl9mcmVlZCIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy5za2JmcmVlZCl9LAorCXsidHhfZHJvcHBlZCIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy50eGRyb3BwZWQpfSwKKwl7InR4X251bGxfc2tiIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnR4bnVsbHNrYil9LAorCXsiY3N1bW1lZCIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy5jc3VtbWVkKX0sCisJeyJub19yY3YiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMubm9fcmN2KX0sCisJeyJyeF9ieXRlcyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy5yeGJ5dGVzKX0sCisJeyJ0eF9ieXRlcyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy50eGJ5dGVzKX0sCit9OworCisjZGVmaW5lIE5FVFhFTl9OSUNfU1RBVFNfTEVOCVwKKwlzaXplb2YobmV0eGVuX25pY19nc3RyaW5nc19zdGF0cykgLyBzaXplb2Yoc3RydWN0IG5ldHhlbl9uaWNfc3RhdHMpCisKK3N0YXRpYyBjb25zdCBjaGFyIG5ldHhlbl9uaWNfZ3N0cmluZ3NfdGVzdFtdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJIlJlZ2lzdGVyX1Rlc3Rfb2ZmbGluZSIsICJFRVBST01fVGVzdF9vZmZsaW5lIiwKKwkiSW50ZXJydXB0X1Rlc3Rfb2ZmbGluZSIsICJMb29wYmFja19UZXN0X29mZmxpbmUiLAorCSJMaW5rX1Rlc3Rfb25fb2ZmbGluZSIKK307CisKKyNkZWZpbmUgTkVUWEVOX05JQ19URVNUX0xFTiBzaXplb2YobmV0eGVuX25pY19nc3RyaW5nc190ZXN0KSAvIEVUSF9HU1RSSU5HX0xFTgorCisjZGVmaW5lIE5FVFhFTl9OSUNfUkVHU19DT1VOVCA0MgorI2RlZmluZSBORVRYRU5fTklDX1JFR1NfTEVOIChORVRYRU5fTklDX1JFR1NfQ09VTlQgKiBzaXplb2YoX19sZTMyKSkKKyNkZWZpbmUgTkVUWEVOX01BWF9FRVBST01fTEVOICAgMTAyNAorCitzdGF0aWMgaW50IG5ldHhlbl9uaWNfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IG47CisKKwlpZiAoKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIDAsICZuKSA9PSAwKQorCSAgICAmJiAobiAmIE5FVFhFTl9ST01fUk9VTkRVUCkpIHsKKwkJbiAmPSB+TkVUWEVOX1JPTV9ST1VORFVQOworCQlpZiAobiA8IE5FVFhFTl9NQVhfRUVQUk9NX0xFTikKKwkJCXJldHVybiBuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25ldHhlbl9uaWNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJdTMyIGZ3X21ham9yID0gMDsKKwl1MzIgZndfbWlub3IgPSAwOworCXUzMiBmd19idWlsZCA9IDA7CisKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIm5ldHhlbl9uaWMiLCAzMik7CisJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCwgMzIpOworCWZ3X21ham9yID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJICAgICAgTkVUWEVOX0ZXX1ZFUlNJT05fTUFKT1IpKTsKKwlmd19taW5vciA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCisJCQkJCSAgICAgIE5FVFhFTl9GV19WRVJTSU9OX01JTk9SKSk7CisJZndfYnVpbGQgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fRldfVkVSU0lPTl9TVUIpKTsKKwlzcHJpbnRmKGRydmluZm8tPmZ3X3ZlcnNpb24sICIlZC4lZC4lZCIsIGZ3X21ham9yLCBmd19taW5vciwgZndfYnVpbGQpOworCisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocG9ydC0+cGRldiksIDMyKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gTkVUWEVOX05JQ19TVEFUU19MRU47CisJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gTkVUWEVOX05JQ19URVNUX0xFTjsKKwlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IE5FVFhFTl9OSUNfUkVHU19MRU47CisJZHJ2aW5mby0+ZWVkdW1wX2xlbiA9IG5ldHhlbl9uaWNfZ2V0X2VlcHJvbV9sZW4oZGV2KTsKK30KKworc3RhdGljIGludAorbmV0eGVuX25pY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2JvYXJkX2luZm8gKmJvYXJkaW5mbyA9ICZhZGFwdGVyLT5haHcuYm9hcmRjZmc7CisKKwkvKiByZWFkIHdoaWNoIG1vZGUgKi8KKwlpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19HQkUpIHsKKwkJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCSAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCSAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOworCisJCWVjbWQtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJICAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkJICAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKKworCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQllY21kLT5zcGVlZCA9IHBvcnQtPmxpbmtfc3BlZWQ7CisJCQllY21kLT5kdXBsZXggPSBwb3J0LT5saW5rX2R1cGxleDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTzsJLyogbGluayBhYnNlbnQgKi8KKwl9IGVsc2UgaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgeworCQllY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX1RQIHwKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwpOworCQllY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEX1RQIHwKKwkJCQkgICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwpOworCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKworCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDAwOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU87CisKKwllY21kLT5waHlfYWRkcmVzcyA9IHBvcnQtPnBvcnRudW07CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCisJc3dpdGNoICgobmV0eGVuX2JyZHR5cGVfdCkgYm9hcmRpbmZvLT5ib2FyZF90eXBlKSB7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjM1XzRHOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8yRzoKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9BdXRvbmVnOworCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQ6CisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFA7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfVFA7CisJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCQllY21kLT5hdXRvbmVnID0gKGJvYXJkaW5mby0+Ym9hcmRfdHlwZSA9PQorCQkJCSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQpID8KKwkJICAgIChBVVRPTkVHX0RJU0FCTEUpIDogKHBvcnQtPmxpbmtfYXV0b25lZyk7CisJCWJyZWFrOworCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSE1FWjoKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVo6CisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfTUlJOworCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX01JSTsKKwkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCWJyZWFrOworCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEc6CisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfRklCUkU7CisJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm5ldHhlbi1uaWM6IFVuc3VwcG9ydGVkIGJvYXJkIG1vZGVsICVkXG4iLAorCQkgICAgICAgKG5ldHhlbl9icmR0eXBlX3QpIGJvYXJkaW5mby0+Ym9hcmRfdHlwZSk7CisJCXJldHVybiAtRUlPOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25ldHhlbl9uaWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJX19sZTMyIHN0YXR1czsKKworCS8qIHJlYWQgd2hpY2ggbW9kZSAqLworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgeworCQkvKiBhdXRvbmVnb3RpYXRpb24gKi8KKwkJaWYgKGFkYXB0ZXItPm9wcy0+cGh5X3dyaXRlCisJCSAgICAmJiBhZGFwdGVyLT5vcHMtPnBoeV93cml0ZShhZGFwdGVyLCBwb3J0LT5wb3J0bnVtLAorCQkJCQkgICAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0FVVE9ORUcsCisJCQkJCSAgICAgICAoX19sZTMyKSBlY21kLT5hdXRvbmVnKSAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCXBvcnQtPmxpbmtfYXV0b25lZyA9IGVjbWQtPmF1dG9uZWc7CisKKwkJaWYgKGFkYXB0ZXItPm9wcy0+cGh5X3JlYWQKKwkJICAgICYmIGFkYXB0ZXItPm9wcy0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJICAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9TVEFUVVMsCisJCQkJCSAgICAgICZzdGF0dXMpICE9IDApCisJCQlyZXR1cm4gLUVJTzsKKworCQkvKiBzcGVlZCAqLworCQlzd2l0Y2ggKGVjbWQtPnNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTA6CisJCQluZXR4ZW5fc2V0X3BoeV9zcGVlZChzdGF0dXMsIDApOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJbmV0eGVuX3NldF9waHlfc3BlZWQoc3RhdHVzLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQluZXR4ZW5fc2V0X3BoeV9zcGVlZChzdGF0dXMsIDIpOworCQkJYnJlYWs7CisJCX0KKwkJLyogc2V0IGR1cGxleCBtb2RlICovCisJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQluZXR4ZW5fY2xlYXJfcGh5X2R1cGxleChzdGF0dXMpOworCQlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJbmV0eGVuX3NldF9waHlfZHVwbGV4KHN0YXR1cyk7CisJCWlmIChhZGFwdGVyLT5vcHMtPnBoeV93cml0ZQorCQkgICAgJiYgYWRhcHRlci0+b3BzLT5waHlfd3JpdGUoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJICAgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAorCQkJCQkgICAgICAgKigoaW50ICopJnN0YXR1cykpICE9IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJZWxzZSB7CisJCQlwb3J0LT5saW5rX3NwZWVkID0gZWNtZC0+c3BlZWQ7CisJCQlwb3J0LT5saW5rX2R1cGxleCA9IGVjbWQtPmR1cGxleDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWRldi0+c3RvcChkZXYpOworCQlkZXYtPm9wZW4oZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gTkVUWEVOX05JQ19SRUdTX0xFTjsKK30KKworc3RydWN0IG5ldHhlbl9uaXVfcmVncyB7CisJX19sZTMyIHJlZ1tORVRYRU5fTklDX1JFR1NfQ09VTlRdOworfTsKKworc3RhdGljIHN0cnVjdCBuZXR4ZW5fbml1X3JlZ3Mgbml1X3JlZ2lzdGVyc1tdID0geworCXsKKwkgLyogR0IgTW9kZSAqLworCSB7CisJICBORVRYRU5fTklVX0dCX1NFUkRFU19SRVNFVCwKKwkgIE5FVFhFTl9OSVVfR0IwX01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjFfTUlJX01PREUsCisJICBORVRYRU5fTklVX0dCMl9NSUlfTU9ERSwKKwkgIE5FVFhFTl9OSVVfR0IzX01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjBfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjFfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjJfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjNfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9SRU1PVEVfTE9PUEJBQ0ssCisJICBORVRYRU5fTklVX0dCMF9IQUxGX0RVUExFWCwKKwkgIE5FVFhFTl9OSVVfR0IxX0hBTEZfRFVQTEVYLAorCSAgTkVUWEVOX05JVV9SRVNFVF9TWVNfRklGT1MsCisJICBORVRYRU5fTklVX0dCX0NSQ19EUk9QLAorCSAgTkVUWEVOX05JVV9HQl9EUk9QX1dST05HQUREUiwKKwkgIE5FVFhFTl9OSVVfVEVTVF9NVVhfQ1RMLAorCisJICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMCgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18xKDApLAorCSAgTkVUWEVOX05JVV9HQl9IQUxGX0RVUExFWF9DVFJMKDApLAorCSAgTkVUWEVOX05JVV9HQl9NQVhfRlJBTUVfU0laRSgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfVEVTVF9SRUcoMCksCisJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0NPTkZJRygwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUigwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ1RSTCgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfU1RBVFVTKDApLAorCSAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURSgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfSU5URVJGQUNFX0NUUkwoMCksCisJICBORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9TVEFUVVMoMCksCisJICBORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8wKDApLAorCSAgTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMSgwKSwKKwkgIC0xLAorCSAgfQorCSB9LAorCXsKKwkgLyogWEcgTW9kZSAqLworCSB7CisJICBORVRYRU5fTklVX1hHX1NJTkdMRV9URVJNLAorCSAgTkVUWEVOX05JVV9YR19EUklWRV9ISSwKKwkgIE5FVFhFTl9OSVVfWEdfRFJJVkVfTE8sCisJICBORVRYRU5fTklVX1hHX0RUWCwKKwkgIE5FVFhFTl9OSVVfWEdfREVRLAorCSAgTkVUWEVOX05JVV9YR19XT1JEX0FMSUdOLAorCSAgTkVUWEVOX05JVV9YR19SRVNFVCwKKwkgIE5FVFhFTl9OSVVfWEdfUE9XRVJfRE9XTiwKKwkgIE5FVFhFTl9OSVVfWEdfUkVTRVRfUExMLAorCSAgTkVUWEVOX05JVV9YR19TRVJERVNfTE9PUEJBQ0ssCisJICBORVRYRU5fTklVX1hHX0RPX0JZVEVfQUxJR04sCisJICBORVRYRU5fTklVX1hHX1RYX0VOQUJMRSwKKwkgIE5FVFhFTl9OSVVfWEdfUlhfRU5BQkxFLAorCSAgTkVUWEVOX05JVV9YR19TVEFUVVMsCisJICBORVRYRU5fTklVX1hHX1BBVVNFX1RIUkVTSE9MRCwKKwkgIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18wLAorCSAgTkVUWEVOX05JVV9YR0VfQ09ORklHXzEsCisJICBORVRYRU5fTklVX1hHRV9JUEcsCisJICBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISSwKKwkgIE5FVFhFTl9OSVVfWEdFX1NUQVRJT05fQUREUl8wXzEsCisJICBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMV9MTywKKwkgIE5FVFhFTl9OSVVfWEdFX1NUQVRVUywKKwkgIE5FVFhFTl9OSVVfWEdFX01BWF9GUkFNRV9TSVpFLAorCSAgTkVUWEVOX05JVV9YR0VfUEFVU0VfRlJBTUVfVkFMVUUsCisJICBORVRYRU5fTklVX1hHRV9UWF9CWVRFX0NOVCwKKwkgIE5FVFhFTl9OSVVfWEdFX1RYX0ZSQU1FX0NOVCwKKwkgIE5FVFhFTl9OSVVfWEdFX1JYX0JZVEVfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfUlhfRlJBTUVfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfQUdHUl9FUlJPUl9DTlQsCisJICBORVRYRU5fTklVX1hHRV9NVUxUSUNBU1RfRlJBTUVfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfVU5JQ0FTVF9GUkFNRV9DTlQsCisJICBORVRYRU5fTklVX1hHRV9DUkNfRVJST1JfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfT1ZFUlNJWkVfRlJBTUVfRVJSLAorCSAgTkVUWEVOX05JVV9YR0VfVU5ERVJTSVpFX0ZSQU1FX0VSUiwKKwkgIE5FVFhFTl9OSVVfWEdFX0xPQ0FMX0VSUk9SX0NOVCwKKwkgIE5FVFhFTl9OSVVfWEdFX1JFTU9URV9FUlJPUl9DTlQsCisJICBORVRYRU5fTklVX1hHRV9DT05UUk9MX0NIQVJfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfUEFVU0VfRlJBTUVfQ05ULAorCSAgLTEsCisJICB9CisJIH0KK307CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCV9fbGUzMiBtb2RlLCAqcmVnc19idWZmID0gcDsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJaW50IGksIHdpbmRvdzsKKworCW1lbXNldChwLCAwLCBORVRYRU5fTklDX1JFR1NfTEVOKTsKKwlyZWdzLT52ZXJzaW9uID0gKDEgPDwgMjQpIHwgKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCA8PCAxNikgfAorCSAgICAocG9ydC0+cGRldiktPmRldmljZTsKKwkvKiB3aGljaCBtb2RlICovCisJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9NT0RFLCAmcmVnc19idWZmWzBdKTsKKwltb2RlID0gcmVnc19idWZmWzBdOworCisJLyogQ29tbW9uIHJlZ2lzdGVycyB0byBhbGwgdGhlIG1vZGVzICovCisJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9TVFJBUF9WQUxVRV9TQVZFX0hJR0hFUiwKKwkJCQkgICAmcmVnc19idWZmWzJdKTsKKwkvKiBHQi9YR0IgTW9kZSAqLworCW1vZGUgPSAobW9kZSAvIDIpIC0gMTsKKwl3aW5kb3cgPSAwOworCWlmIChtb2RlIDw9IDEpIHsKKwkJZm9yIChpID0gMzsgbml1X3JlZ2lzdGVyc1ttb2RlXS5yZWdbaSAtIDNdICE9IC0xOyBpKyspIHsKKwkJCS8qIEdCOiBwb3J0IHNwZWNpZmljIHJlZ2lzdGVycyAqLworCQkJaWYgKG1vZGUgPT0gMCAmJiBpID49IDE5KQorCQkJCXdpbmRvdyA9IHBvcnQtPnBvcnRudW0gKiBORVRYRU5fTklDX1BPUlRfV0lORE9XOworCisJCQlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhuaXVfcmVnaXN0ZXJzW21vZGVdLgorCQkJCQkJICAgcmVnW2kgLSAzXSArIHdpbmRvdywKKwkJCQkJCSAgICZyZWdzX2J1ZmZbaV0pOworCQl9CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUIHwgV0FLRV9NQUdJQzsKKwkvKiBvcHRpb25zIGNhbiBiZSBhZGRlZCBkZXBlbmRpbmcgdXBvbiB0aGUgbW9kZSAqLworCXdvbC0+d29sb3B0cyA9IDA7Cit9CisKK3N0YXRpYyB1MzIgbmV0eGVuX25pY19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlfX2xlMzIgc3RhdHVzOworCisJLyogcmVhZCB3aGljaCBtb2RlICovCisJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfR0JFKSB7CisJCWlmIChhZGFwdGVyLT5vcHMtPnBoeV9yZWFkCisJCSAgICAmJiBhZGFwdGVyLT5vcHMtPnBoeV9yZWFkKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCQkJCSAgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAorCQkJCQkgICAgICAmc3RhdHVzKSAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCXJldHVybiAobmV0eGVuX2dldF9waHlfbGluayhzdGF0dXMpKTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgeworCQlpbnQgdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1hHX1NUQVRFKSk7CisJCXJldHVybiB2YWwgPT0gWEdfTElOS19VUDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQKK25ldHhlbl9uaWNfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKKwkJICAgICAgdTggKiBieXRlcykKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IG9mZnNldDsKKworCWlmIChlZXByb20tPmxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVlcHJvbS0+bWFnaWMgPSAocG9ydC0+cGRldiktPnZlbmRvciB8ICgocG9ydC0+cGRldiktPmRldmljZSA8PCAxNik7CisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBlZXByb20tPmxlbjsgb2Zmc2V0KyspCisJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZAorCQkgICAgKGFkYXB0ZXIsICg4ICogb2Zmc2V0KSArIDgsIChpbnQgKillZXByb20tPmRhdGEpID09IC0xKQorCQkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlpbnQgaSwgajsKKworCXJpbmctPnJ4X3BlbmRpbmcgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkNWX0NUWDsgKytpKSB7CisJCWZvciAoaiA9IDA7IGogPCBOVU1fUkNWX0RFU0NfUklOR1M7IGorKykKKwkJCXJpbmctPnJ4X3BlbmRpbmcgKz0KKwkJCSAgICBhZGFwdGVyLT5yZWN2X2N0eFtpXS5yY3ZfZGVzY1tqXS5yY3ZfcGVuZGluZzsKKwl9CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50OworCXJpbmctPnR4X21heF9wZW5kaW5nID0gYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQ7CisJcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlfX2xlMzIgdmFsOworCisJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfR0JFKSB7CisJCS8qIGdldCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgKi8KKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydC0+cG9ydG51bSksCisJCQkJICAgKHUzMiAqKSAmIHZhbCk7CisJCXBhdXNlLT5yeF9wYXVzZSA9IG5ldHhlbl9nYl9nZXRfcnhfZmxvd2N0bCh2YWwpOworCQlwYXVzZS0+dHhfcGF1c2UgPSBuZXR4ZW5fZ2JfZ2V0X3R4X2Zsb3djdGwodmFsKTsKKwkJLyogZ2V0IGF1dG9uZWcgc2V0dGluZ3MgKi8KKwkJcGF1c2UtPmF1dG9uZWcgPSBwb3J0LT5saW5rX2F1dG9uZWc7CisJfQorfQorCitzdGF0aWMgaW50CituZXR4ZW5fbmljX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlfX2xlMzIgdmFsOworCXVuc2lnbmVkIGludCBhdXRvbmVnOworCisJLyogcmVhZCBtb2RlICovCisJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfR0JFKSB7CisJCS8qIHNldCBmbG93IGNvbnRyb2wgKi8KKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydC0+cG9ydG51bSksCisJCQkJICAgKHUzMiAqKSAmIHZhbCk7CisJCWlmIChwYXVzZS0+dHhfcGF1c2UpCisJCQluZXR4ZW5fZ2JfdHhfZmxvd2N0bCh2YWwpOworCQllbHNlCisJCQluZXR4ZW5fZ2JfdW5zZXRfdHhfZmxvd2N0bCh2YWwpOworCQlpZiAocGF1c2UtPnJ4X3BhdXNlKQorCQkJbmV0eGVuX2diX3J4X2Zsb3djdGwodmFsKTsKKwkJZWxzZQorCQkJbmV0eGVuX2diX3Vuc2V0X3J4X2Zsb3djdGwodmFsKTsKKworCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsCisJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQtPnBvcnRudW0pLAorCQkJCSAgICAqKHUzMiAqKSAoJnZhbCkpOworCQkvKiBzZXQgYXV0b25lZyAqLworCQlhdXRvbmVnID0gcGF1c2UtPmF1dG9uZWc7CisJCWlmIChhZGFwdGVyLT5vcHMtPnBoeV93cml0ZQorCQkgICAgJiYgYWRhcHRlci0+b3BzLT5waHlfd3JpdGUoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJICAgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9BVVRPTkVHLAorCQkJCQkgICAgICAgKF9fbGUzMikgYXV0b25lZykgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQllbHNlIHsKKwkJCXBvcnQtPmxpbmtfYXV0b25lZyA9IHBhdXNlLT5hdXRvbmVnOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IG5ldHhlbl9uaWNfcmVnX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJdTMyIGRhdGFfcmVhZCwgZGF0YV93cml0dGVuLCBzYXZlOworCV9fbGUzMiBtb2RlOworCisJLyogCisJICogZmlyc3QgdGVzdCB0aGUgIlJlYWQgT25seSIgcmVnaXN0ZXJzIGJ5IHdyaXRpbmcgd2hpY2ggbW9kZQorCSAqLworCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLCBORVRYRU5fTklVX01PREUsICZtb2RlKTsKKwlpZiAobmV0eGVuX2dldF9uaXVfZW5hYmxlX2dlKG1vZGUpKSB7CS8qIEdCIE1vZGUgKi8KKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9TVEFUVVMocG9ydC0+cG9ydG51bSksCisJCQkJICAgJmRhdGFfcmVhZCk7CisKKwkJc2F2ZSA9IGRhdGFfcmVhZDsKKwkJaWYgKGRhdGFfcmVhZCkKKwkJCWRhdGFfd3JpdHRlbiA9IGRhdGFfcmVhZCAmIE5FVFhFTl9OSUNfSU5WQUxJRF9EQVRBOworCQllbHNlCisJCQlkYXRhX3dyaXR0ZW4gPSBORVRYRU5fTklDX0lOVkFMSURfREFUQTsKKwkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX1NUQVRVUyhwb3J0LT4KKwkJCQkJCQkJICBwb3J0bnVtKSwKKwkJCQkgICAgZGF0YV93cml0dGVuKTsKKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9TVEFUVVMocG9ydC0+cG9ydG51bSksCisJCQkJICAgJmRhdGFfcmVhZCk7CisKKwkJaWYgKGRhdGFfd3JpdHRlbiA9PSBkYXRhX3JlYWQpIHsKKwkJCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfU1RBVFVTKHBvcnQtPgorCQkJCQkJCQkJICBwb3J0bnVtKSwKKwkJCQkJICAgIHNhdmUpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIG5ldHhlbl9uaXVfZ2JfbWlpX21nbXRfaW5kaWNhdG9ycyBpcyByZWFkIG9ubHkgKi8KKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURShwb3J0LT4KKwkJCQkJCQkJICAgcG9ydG51bSksCisJCQkJICAgJmRhdGFfcmVhZCk7CisKKwkJc2F2ZSA9IGRhdGFfcmVhZDsKKwkJaWYgKGRhdGFfcmVhZCkKKwkJCWRhdGFfd3JpdHRlbiA9IGRhdGFfcmVhZCAmIE5FVFhFTl9OSUNfSU5WQUxJRF9EQVRBOworCQllbHNlCisJCQlkYXRhX3dyaXR0ZW4gPSBORVRYRU5fTklDX0lOVkFMSURfREFUQTsKKwkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKHBvcnQtPgorCQkJCQkJCQkgICAgcG9ydG51bSksCisJCQkJICAgIGRhdGFfd3JpdHRlbik7CisKKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURShwb3J0LT4KKwkJCQkJCQkJICAgcG9ydG51bSksCisJCQkJICAgJmRhdGFfcmVhZCk7CisKKwkJaWYgKGRhdGFfd3JpdHRlbiA9PSBkYXRhX3JlYWQpIHsKKwkJCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfSU5ESUNBVEUKKwkJCQkJICAgIChwb3J0LT5wb3J0bnVtKSwgc2F2ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIG5ldHhlbl9uaXVfZ2JfaW50ZXJmYWNlX3N0YXR1cyBpcyByZWFkIG9ubHkgKi8KKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsCisJCQkJICAgTkVUWEVOX05JVV9HQl9JTlRFUkZBQ0VfU1RBVFVTKHBvcnQtPgorCQkJCQkJCQkgIHBvcnRudW0pLAorCQkJCSAgICZkYXRhX3JlYWQpOworCisJCXNhdmUgPSBkYXRhX3JlYWQ7CisJCWlmIChkYXRhX3JlYWQpCisJCQlkYXRhX3dyaXR0ZW4gPSBkYXRhX3JlYWQgJiBORVRYRU5fTklDX0lOVkFMSURfREFUQTsKKwkJZWxzZQorCQkJZGF0YV93cml0dGVuID0gTkVUWEVOX05JQ19JTlZBTElEX0RBVEE7CisJCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwKKwkJCQkgICAgTkVUWEVOX05JVV9HQl9JTlRFUkZBQ0VfU1RBVFVTKHBvcnQtPgorCQkJCQkJCQkgICBwb3J0bnVtKSwKKwkJCQkgICAgZGF0YV93cml0dGVuKTsKKworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwKKwkJCQkgICBORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9TVEFUVVMocG9ydC0+CisJCQkJCQkJCSAgcG9ydG51bSksCisJCQkJICAgJmRhdGFfcmVhZCk7CisKKwkJaWYgKGRhdGFfd3JpdHRlbiA9PSBkYXRhX3JlYWQpIHsKKwkJCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9OSVVfR0JfSU5URVJGQUNFX1NUQVRVUworCQkJCQkgICAgKHBvcnQtPnBvcnRudW0pLCBzYXZlKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CQkJLyogR0IgTW9kZSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG5ldHhlbl9uaWNfZGlhZ190ZXN0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5FVFhFTl9OSUNfVEVTVF9MRU47Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2RpYWdfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF90ZXN0ICpldGhfdGVzdCwKKwkJICAgICB1NjQgKiBkYXRhKQoreworCWlmIChldGhfdGVzdC0+ZmxhZ3MgPT0gRVRIX1RFU1RfRkxfT0ZGTElORSkgewkvKiBvZmZsaW5lIHRlc3RzICovCisJCS8qIGxpbmsgdGVzdCAqLworCQlpZiAoIShkYXRhWzRdID0gKHU2NCkgbmV0eGVuX25pY19nZXRfbGluayhkZXYpKSkKKwkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCWRldi0+c3RvcChkZXYpOworCisJCS8qIHJlZ2lzdGVyIHRlc3RzICovCisJCWlmICghKGRhdGFbMF0gPSBuZXR4ZW5fbmljX3JlZ190ZXN0KGRldikpKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKwkJLyogb3RoZXIgdGVzdHMgcGFzcyBhcyBvZiBub3cgKi8KKwkJZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gMTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCWRldi0+b3BlbihkZXYpOworCX0gZWxzZSB7CQkvKiBvbmxpbmUgdGVzdHMgKi8KKwkJLyogbGluayB0ZXN0ICovCisJCWlmICghKGRhdGFbNF0gPSAodTY0KSBuZXR4ZW5fbmljX2dldF9saW5rKGRldikpKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQkvKiBvdGhlciB0ZXN0cyBwYXNzIGJ5IGRlZmF1bHQgKi8KKwkJZGF0YVswXSA9IGRhdGFbMV0gPSBkYXRhWzJdID0gZGF0YVszXSA9IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmV0eGVuX25pY19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGRhdGEpCit7CisJaW50IGluZGV4OworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19URVNUOgorCQltZW1jcHkoZGF0YSwgKm5ldHhlbl9uaWNfZ3N0cmluZ3NfdGVzdCwKKwkJICAgICAgIE5FVFhFTl9OSUNfVEVTVF9MRU4gKiBFVEhfR1NUUklOR19MRU4pOworCQlicmVhazsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTkVUWEVOX05JQ19TVEFUU19MRU47IGluZGV4KyspIHsKKwkJCW1lbWNweShkYXRhICsgaW5kZXggKiBFVEhfR1NUUklOR19MRU4sCisJCQkgICAgICAgbmV0eGVuX25pY19nc3RyaW5nc19zdGF0c1tpbmRleF0uc3RhdF9zdHJpbmcsCisJCQkgICAgICAgRVRIX0dTVFJJTkdfTEVOKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gTkVUWEVOX05JQ19TVEFUU19MRU47Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICogZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5FVFhFTl9OSUNfU1RBVFNfTEVOOyBpbmRleCsrKSB7CisJCWNoYXIgKnAgPQorCQkgICAgKGNoYXIgKilwb3J0ICsgbmV0eGVuX25pY19nc3RyaW5nc19zdGF0c1tpbmRleF0uc3RhdF9vZmZzZXQ7CisJCWRhdGFbaW5kZXhdID0KKwkJICAgIChuZXR4ZW5fbmljX2dzdHJpbmdzX3N0YXRzW2luZGV4XS5zaXplb2Zfc3RhdCA9PQorCQkgICAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopIHAgOiAqKHUzMiAqKSBwOworCX0KKworfQorCitzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0eGVuX25pY19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gbmV0eGVuX25pY19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IG5ldHhlbl9uaWNfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IG5ldHhlbl9uaWNfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IG5ldHhlbl9uaWNfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncyA9IG5ldHhlbl9uaWNfZ2V0X3JlZ3MsCisJLmdldF93b2wgPSBuZXR4ZW5fbmljX2dldF93b2wsCisJLmdldF9saW5rID0gbmV0eGVuX25pY19nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4gPSBuZXR4ZW5fbmljX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tID0gbmV0eGVuX25pY19nZXRfZWVwcm9tLAorCS5nZXRfcmluZ3BhcmFtID0gbmV0eGVuX25pY19nZXRfcmluZ3BhcmFtLAorCS5nZXRfcGF1c2VwYXJhbSA9IG5ldHhlbl9uaWNfZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtID0gbmV0eGVuX25pY19zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLmdldF9zZyA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKwkuc2VsZl90ZXN0X2NvdW50ID0gbmV0eGVuX25pY19kaWFnX3Rlc3RfY291bnQsCisJLnNlbGZfdGVzdCA9IG5ldHhlbl9uaWNfZGlhZ190ZXN0LAorCS5nZXRfc3RyaW5ncyA9IG5ldHhlbl9uaWNfZ2V0X3N0cmluZ3MsCisJLmdldF9zdGF0c19jb3VudCA9IG5ldHhlbl9uaWNfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IG5ldHhlbl9uaWNfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9wZXJtX2FkZHIgPSBldGh0b29sX29wX2dldF9wZXJtX2FkZHIsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaGRyLmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19oZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM2ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaGRyLmgKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAgMDIxMTEtMTMwNywgVVNBLgorICogCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKiAKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICovCisKKyNpZm5kZWYgX19ORVRYRU5fTklDX0hEUl9IXworI2RlZmluZSBfX05FVFhFTl9OSUNfSERSX0hfCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4JCS8qIGZvciBtZW1zZXQgKi8KKworLyoKKyAqIFRoZSBiYXNpYyB1bml0IG9mIGFjY2VzcyB3aGVuIHJlYWRpbmcvd3JpdGluZyBjb250cm9sIHJlZ2lzdGVycy4KKyAqLworCit0eXBlZGVmIF9fbGUzMiBuZXR4ZW5fY3Jid29yZF90OwkvKiBzaW5nbGUgd29yZCBpbiBDUkIgc3BhY2UgKi8KKworZW51bSB7CisJTkVUWEVOX0hXX0gwX0NIX0hVQl9BRFIgPSAweDA1LAorCU5FVFhFTl9IV19IMV9DSF9IVUJfQURSID0gMHgwRSwKKwlORVRYRU5fSFdfSDJfQ0hfSFVCX0FEUiA9IDB4MDMsCisJTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPSAweDAxLAorCU5FVFhFTl9IV19INF9DSF9IVUJfQURSID0gMHgwNiwKKwlORVRYRU5fSFdfSDVfQ0hfSFVCX0FEUiA9IDB4MDcsCisJTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPSAweDA4Cit9OworCisvKiAgSHViIDAgKi8KK2VudW0geworCU5FVFhFTl9IV19NTl9DUkJfQUdUX0FEUiA9IDB4MTUsCisJTkVUWEVOX0hXX01TX0NSQl9BR1RfQURSID0gMHgyNQorfTsKKworLyogIEh1YiAxICovCitlbnVtIHsKKwlORVRYRU5fSFdfUFNfQ1JCX0FHVF9BRFIgPSAweDczLAorCU5FVFhFTl9IV19TU19DUkJfQUdUX0FEUiA9IDB4MjAsCisJTkVUWEVOX0hXX1JQTVgzX0NSQl9BR1RfQURSID0gMHgwYiwKKwlORVRYRU5fSFdfUU1TX0NSQl9BR1RfQURSID0gMHgwMCwKKwlORVRYRU5fSFdfU1FHUzBfQ1JCX0FHVF9BRFIgPSAweDAxLAorCU5FVFhFTl9IV19TUUdTMV9DUkJfQUdUX0FEUiA9IDB4MDIsCisJTkVUWEVOX0hXX1NRR1MyX0NSQl9BR1RfQURSID0gMHgwMywKKwlORVRYRU5fSFdfU1FHUzNfQ1JCX0FHVF9BRFIgPSAweDA0LAorCU5FVFhFTl9IV19DMkMwX0NSQl9BR1RfQURSID0gMHg1OCwKKwlORVRYRU5fSFdfQzJDMV9DUkJfQUdUX0FEUiA9IDB4NTksCisJTkVUWEVOX0hXX0MyQzJfQ1JCX0FHVF9BRFIgPSAweDVhLAorCU5FVFhFTl9IV19SUE1YMl9DUkJfQUdUX0FEUiA9IDB4MGEsCisJTkVUWEVOX0hXX1JQTVg0X0NSQl9BR1RfQURSID0gMHgwYywKKwlORVRYRU5fSFdfUlBNWDdfQ1JCX0FHVF9BRFIgPSAweDBmLAorCU5FVFhFTl9IV19SUE1YOV9DUkJfQUdUX0FEUiA9IDB4MTIsCisJTkVUWEVOX0hXX1NNQl9DUkJfQUdUX0FEUiA9IDB4MTgKK307CisKKy8qICBIdWIgMiAqLworZW51bSB7CisJTkVUWEVOX0hXX05JVV9DUkJfQUdUX0FEUiA9IDB4MzEsCisJTkVUWEVOX0hXX0kyQzBfQ1JCX0FHVF9BRFIgPSAweDE5LAorCU5FVFhFTl9IV19JMkMxX0NSQl9BR1RfQURSID0gMHgyOSwKKworCU5FVFhFTl9IV19TTl9DUkJfQUdUX0FEUiA9IDB4MTAsCisJTkVUWEVOX0hXX0kyUV9DUkJfQUdUX0FEUiA9IDB4MjAsCisJTkVUWEVOX0hXX0xQQ19DUkJfQUdUX0FEUiA9IDB4MjIsCisJTkVUWEVOX0hXX1JPTVVTQl9DUkJfQUdUX0FEUiA9IDB4MjEsCisJTkVUWEVOX0hXX1FNX0NSQl9BR1RfQURSID0gMHg2NiwKKwlORVRYRU5fSFdfU1FHMF9DUkJfQUdUX0FEUiA9IDB4NjAsCisJTkVUWEVOX0hXX1NRRzFfQ1JCX0FHVF9BRFIgPSAweDYxLAorCU5FVFhFTl9IV19TUUcyX0NSQl9BR1RfQURSID0gMHg2MiwKKwlORVRYRU5fSFdfU1FHM19DUkJfQUdUX0FEUiA9IDB4NjMsCisJTkVUWEVOX0hXX1JQTVgxX0NSQl9BR1RfQURSID0gMHgwOSwKKwlORVRYRU5fSFdfUlBNWDVfQ1JCX0FHVF9BRFIgPSAweDBkLAorCU5FVFhFTl9IV19SUE1YNl9DUkJfQUdUX0FEUiA9IDB4MGUsCisJTkVUWEVOX0hXX1JQTVg4X0NSQl9BR1RfQURSID0gMHgxMQorfTsKKworLyogIEh1YiAzICovCitlbnVtIHsKKwlORVRYRU5fSFdfUEhfQ1JCX0FHVF9BRFIgPSAweDFBLAorCU5FVFhFTl9IV19TUkVfQ1JCX0FHVF9BRFIgPSAweDUwLAorCU5FVFhFTl9IV19FR19DUkJfQUdUX0FEUiA9IDB4NTEsCisJTkVUWEVOX0hXX1JQTVgwX0NSQl9BR1RfQURSID0gMHgwOAorfTsKKworLyogIEh1YiA0ICovCitlbnVtIHsKKwlORVRYRU5fSFdfUEVHTjBfQ1JCX0FHVF9BRFIgPSAweDQwLAorCU5FVFhFTl9IV19QRUdOMV9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHTjJfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR04zX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdOSV9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHTkRfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR05DX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdSMF9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHUjFfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR1IyX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdSM19DUkJfQUdUX0FEUgorfTsKKworLyogIEh1YiA1ICovCitlbnVtIHsKKwlORVRYRU5fSFdfUEVHUzBfQ1JCX0FHVF9BRFIgPSAweDQwLAorCU5FVFhFTl9IV19QRUdTMV9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHUzJfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR1MzX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdTSV9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHU0RfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR1NDX0NSQl9BR1RfQURSCit9OworCisvKiAgSHViIDYgKi8KK2VudW0geworCU5FVFhFTl9IV19DQVMwX0NSQl9BR1RfQURSID0gMHg0NiwKKwlORVRYRU5fSFdfQ0FTMV9DUkJfQUdUX0FEUiA9IDB4NDcsCisJTkVUWEVOX0hXX0NBUzJfQ1JCX0FHVF9BRFIgPSAweDQ4LAorCU5FVFhFTl9IV19DQVMzX0NSQl9BR1RfQURSID0gMHg0OSwKKwlORVRYRU5fSFdfTkNNX0NSQl9BR1RfQURSID0gMHgxNiwKKwlORVRYRU5fSFdfVE1SX0NSQl9BR1RfQURSID0gMHgxNywKKwlORVRYRU5fSFdfWERNQV9DUkJfQUdUX0FEUiA9IDB4MDUsCisJTkVUWEVOX0hXX09DTTBfQ1JCX0FHVF9BRFIgPSAweDA2LAorCU5FVFhFTl9IV19PQ00xX0NSQl9BR1RfQURSID0gMHgwNworfTsKKworLyogIEZsb2F0ZXJzIC0gbm9uIGV4aXN0ZW50IG1vZHVsZXMgKi8KKyNkZWZpbmUgTkVUWEVOX0hXX0VGQ19SUE1YMF9DUkJfQUdUX0FEUgkweDY3CisKKy8qICBUaGlzIGZpZWxkIGRlZmluZXMgUENJL1ggYWRyIFsyNToyMF0gb2YgYWdlbnRzIG9uIHRoZSBDUkIgKi8KK2VudW0geworCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BIID0gMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QUywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9NTiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9NUywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1IxLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NSRSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9OSVUsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUU1OLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NRTjAsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1FOMSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9TUU4yLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NRTjMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUU1TLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NRUzAsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1FTMSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9TUVMyLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NRUzMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR04xLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTjIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOMywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR05ELAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTkksCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdTMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1MxLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHUzIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdTMywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1NELAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHU0ksCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU04sCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdSMiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9FRywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QSDIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUFMyLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0NBTSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9DQVMwLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0NBUzEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfQ0FTMiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9DMkMwLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0MyQzEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfVElNUiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1IzLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVgxLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVgyLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVgzLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVg0LAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVg1LAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVg2LAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVg3LAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1hETUEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfSTJRLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JPTVVTQiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9DQVMzLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVgwLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVg4LAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1JQTVg5LAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX09DTTAsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfT0NNMSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9TTUIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfSTJDMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9JMkMxLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0xQQywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR05DLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHUjAKK307CisKKy8qICBUaGlzIGZpZWxkIGRlZmluZXMgQ1JCIGFkciBbMzE6MjBdIG9mIHRoZSBhZ2VudHMgKi8KKworI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX01OCVwKKwkoKE5FVFhFTl9IV19IMF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX01OX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BICVwKKwkoKE5FVFhFTl9IV19IMF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BIX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX01TCVwKKwkoKE5FVFhFTl9IV19IMF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX01TX0NSQl9BR1RfQURSKQorCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUFMJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUFNfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1MJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1NfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDMJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUlBNWDNfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUU1TCVwKKwkoKE5FVFhFTl9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1FNU19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TUVMwCVwKKwkoKE5FVFhFTl9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NRR1MwX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NRUzEJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1FHUzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1FTMglcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TUUdTMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TUVMzCVwKKwkoKE5FVFhFTl9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NRR1MzX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX0MyQzAJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfQzJDMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9DMkMxCVwKKwkoKE5FVFhFTl9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0MyQzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDIJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUlBNWDJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDQJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUlBNWDRfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDcJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUlBNWDdfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDkJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUlBNWDlfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU01CCVwKKwkoKE5FVFhFTl9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NNQl9DUkJfQUdUX0FEUikKKworI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX05JVQlcCisJKChORVRYRU5fSFdfSDJfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19OSVVfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfSTJDMAlcCisJKChORVRYRU5fSFdfSDJfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19JMkMwX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX0kyQzEJXAorCSgoTkVUWEVOX0hXX0gyX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfSTJDMV9DUkJfQUdUX0FEUikKKworI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NSRQlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TUkVfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfRUcJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfRUdfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDAJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUlBNWDBfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUU1OCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1FNX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NRTjAJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1FHMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TUU4xCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NRRzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1FOMglcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TUUcyX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NRTjMJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1FHM19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMQlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNQlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YNV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNglcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YNl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YOAlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YOF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9DQVMwCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0NBUzBfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfQ0FTMQlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19DQVMxX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX0NBUzIJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfQ0FTMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9DQVMzCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0NBUzNfQ1JCX0FHVF9BRFIpCisKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR05JCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR05JX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHTkQJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHTkRfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdOMAlcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdOMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR04xCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR04xX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHTjIJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHTjJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdOMwlcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdOM19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR05DCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR05DX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHUjAJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHUjBfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdSMQlcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdSMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1IyCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1IyX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHUjMJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHUjNfQ1JCX0FHVF9BRFIpCisKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1NJCVwKKwkoKE5FVFhFTl9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1NJX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHU0QJXAorCSgoTkVUWEVOX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHU0RfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdTMAlcCisJKChORVRYRU5fSFdfSDVfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdTMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1MxCVwKKwkoKE5FVFhFTl9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1MxX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHUzIJXAorCSgoTkVUWEVOX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHUzJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdTMwlcCisJKChORVRYRU5fSFdfSDVfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdTM19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1NDCVwKKwkoKE5FVFhFTl9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1NDX0NSQl9BR1RfQURSKQorCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfQ0FNCVwKKwkoKE5FVFhFTl9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX05DTV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9USU1SCVwKKwkoKE5FVFhFTl9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1RNUl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9YRE1BCVwKKwkoKE5FVFhFTl9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1hETUFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU04JXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU05fQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfSTJRCVwKKwkoKE5FVFhFTl9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0kyUV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9ST01VU0IJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUk9NVVNCX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX09DTTAJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfT0NNMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9PQ00xCVwKKwkoKE5FVFhFTl9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX09DTTFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfTFBDCVwKKwkoKE5FVFhFTl9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0xQQ19DUkJfQUdUX0FEUikKKworLyoKKyAqIE1BWF9SQ1ZfQ1RYIDogVGhlIG51bWJlciBvZiByZWNlaXZlIGNvbnRleHRzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbgorICogdGhlIHBoYW50b20uCisgKi8KKyNkZWZpbmUgTUFYX1JDVl9DVFgJCQkxCisKKyNkZWZpbmUgTkVUWEVOX1NSRV9JTlRfU1RBVFVTCQkoTkVUWEVOX0NSQl9TUkUgKyAweDAwMDM0KQorI2RlZmluZSBORVRYRU5fU1JFX1BCSV9BQ1RJVkVfU1RBVFVTCShORVRYRU5fQ1JCX1NSRSArIDB4MDEwMTQpCisjZGVmaW5lIE5FVFhFTl9TUkVfTDFSRV9DVEwJCShORVRYRU5fQ1JCX1NSRSArIDB4MDMwMDApCisjZGVmaW5lIE5FVFhFTl9TUkVfTDJSRV9DVEwJCShORVRYRU5fQ1JCX1NSRSArIDB4MDUwMDApCisjZGVmaW5lIE5FVFhFTl9TUkVfQlVGX0NUTAkJKE5FVFhFTl9DUkJfU1JFICsgMHgwMTAwMCkKKworI2RlZmluZQlORVRYRU5fRE1BX0JBU0UoVSkJKE5FVFhFTl9DUkJfUENJWF9NRCArIDB4MjAwMDAgKyAoKFUpPDwxNikpCisjZGVmaW5lCU5FVFhFTl9ETUFfQ09NTUFORChVKQkoTkVUWEVOX0RNQV9CQVNFKFUpICsgMHgwMDAwOCkKKworI2RlZmluZSBORVRYRU5fSTJRX0NMUl9QQ0lfSEkJKE5FVFhFTl9DUkJfSTJRICsgMHgwMDAzNCkKKworI2RlZmluZSBQRUdfTkVUV09SS19CQVNFKE4pCShORVRYRU5fQ1JCX1BFR19ORVRfMCArICgoKE4pJjMpIDw8IDIwKSkKKyNkZWZpbmUgQ1JCX1JFR19FWF9QQwkJMHgzYworCisjZGVmaW5lIFJPTVVTQl9HTEIJKE5FVFhFTl9DUkJfUk9NVVNCICsgMHgwMDAwMCkKKyNkZWZpbmUgUk9NVVNCX1JPTQkoTkVUWEVOX0NSQl9ST01VU0IgKyAweDEwMDAwKQorCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfR0xCX1NUQVRVUwkoUk9NVVNCX0dMQiArIDB4MDAwNCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HTEJfU1dfUkVTRVQJKFJPTVVTQl9HTEIgKyAweDAwMDgpCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfR0xCX1BBRF9HUElPX0kJKFJPTVVTQl9HTEIgKyAweDAwMGMpCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfR0xCX0NBU19SU1QJKFJPTVVTQl9HTEIgKyAweDAwMzgpCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfR0xCX1RFU1RfTVVYX1NFTAkoUk9NVVNCX0dMQiArIDB4MDA0NCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HTEJfUEVHVFVORV9ET05FCShST01VU0JfR0xCICsgMHgwMDVjKQorI2RlZmluZSBORVRYRU5fUk9NVVNCX0dMQl9DSElQX0NMS19DVFJMCShST01VU0JfR0xCICsgMHgwMEE4KQorCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfR1BJTyhuKQkJKFJPTVVTQl9HTEIgKyAweDYwICsgKDQgKiAobikpKQorCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfUk9NX0lOU1RSX09QQ09ERQkoUk9NVVNCX1JPTSArIDB4MDAwNCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9ST01fQUREUkVTUwkoUk9NVVNCX1JPTSArIDB4MDAwOCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9ST01fV0RBVEEJCShST01VU0JfUk9NICsgMHgwMDBjKQorI2RlZmluZSBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQJKFJPTVVTQl9ST00gKyAweDAwMTApCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfUk9NX0RVTU1ZX0JZVEVfQ05UIChST01VU0JfUk9NICsgMHgwMDE0KQorI2RlZmluZSBORVRYRU5fUk9NVVNCX1JPTV9SREFUQQkJKFJPTVVTQl9ST00gKyAweDAwMTgpCisKKy8qIExvY2sgSURzIGZvciBST00gbG9jayAqLworI2RlZmluZSBST01fTE9DS19EUklWRVIJMHgwZDQxNzM0MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgIERlZmluaXRpb25zIHNwZWNpZmljIHRvIE0yNVAgZmxhc2gKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBJbnN0cnVjdGlvbnMKKyovCisjZGVmaW5lIE0yNVBfSU5TVFJfV1JFTgkJMHgwNgorI2RlZmluZSBNMjVQX0lOU1RSX1dSREkJCTB4MDQKKyNkZWZpbmUgTTI1UF9JTlNUUl9SRElECQkweDlmCisjZGVmaW5lIE0yNVBfSU5TVFJfUkRTUgkJMHgwNQorI2RlZmluZSBNMjVQX0lOU1RSX1dSU1IJCTB4MDEKKyNkZWZpbmUgTTI1UF9JTlNUUl9SRUFECQkweDAzCisjZGVmaW5lIE0yNVBfSU5TVFJfRkFTVF9SRUFECTB4MGIKKyNkZWZpbmUgTTI1UF9JTlNUUl9QUAkJMHgwMgorI2RlZmluZSBNMjVQX0lOU1RSX1NFCQkweGQ4CisjZGVmaW5lIE0yNVBfSU5TVFJfQkUJCTB4YzcKKyNkZWZpbmUgTTI1UF9JTlNUUl9EUAkJMHhiOQorI2RlZmluZSBNMjVQX0lOU1RSX1JFUwkJMHhhYgorCisvKiBhbGwgYXJlIDFNQiB3aW5kb3dzICovCisKKyNkZWZpbmUgTkVUWEVOX1BDSV9DUkJfV0lORE9XU0laRQkweDAwMTAwMDAwCisjZGVmaW5lIE5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhBKQlcCisJKE5FVFhFTl9QQ0lfQ1JCU1BBQ0UgKyAoQSkqTkVUWEVOX1BDSV9DUkJfV0lORE9XU0laRSkKKworI2RlZmluZSBORVRYRU5fQ1JCX05JVQkJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX05JVSkKKyNkZWZpbmUgTkVUWEVOX0NSQl9TUkUJCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9TUkUpCisjZGVmaW5lIE5FVFhFTl9DUkJfUk9NVVNCCVwKKwlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUk9NVVNCKQorI2RlZmluZSBORVRYRU5fQ1JCX0kyUQkJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX0kyUSkKKyNkZWZpbmUgTkVUWEVOX0NSQl9NQVgJCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyg2NCkKKworI2RlZmluZSBORVRYRU5fQ1JCX1BDSVhfSE9TVAlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUEgpCisjZGVmaW5lIE5FVFhFTl9DUkJfUENJWF9IT1NUMglORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUEgyKQorI2RlZmluZSBORVRYRU5fQ1JCX1BFR19ORVRfMAlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOMCkKKyNkZWZpbmUgTkVUWEVOX0NSQl9QRUdfTkVUXzEJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTjEpCisjZGVmaW5lIE5FVFhFTl9DUkJfUEVHX05FVF8yCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QR04yKQorI2RlZmluZSBORVRYRU5fQ1JCX1BFR19ORVRfMwlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOMykKKyNkZWZpbmUgTkVUWEVOX0NSQl9QRUdfTkVUX0QJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTkQpCisjZGVmaW5lIE5FVFhFTl9DUkJfUEVHX05FVF9JCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QR05JKQorI2RlZmluZSBORVRYRU5fQ1JCX0REUl9ORVQJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX01OKQorCisjZGVmaW5lIE5FVFhFTl9DUkJfUENJWF9NRAlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUFMpCisjZGVmaW5lIE5FVFhFTl9DUkJfUENJRQkJTkVUWEVOX0NSQl9QQ0lYX01ECisKKyNkZWZpbmUgSVNSX0lOVF9WRUNUT1IJCShORVRYRU5fUENJWF9QU19SRUcoUENJWF9JTlRfVkVDVE9SKSkKKyNkZWZpbmUgSVNSX0lOVF9NQVNLCQkoTkVUWEVOX1BDSVhfUFNfUkVHKFBDSVhfSU5UX01BU0spKQorI2RlZmluZSBJU1JfSU5UX01BU0tfU0xPVwkoTkVUWEVOX1BDSVhfUFNfUkVHKFBDSVhfSU5UX01BU0spKQorI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9TVEFUVVMJKE5FVFhFTl9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9TVEFUVVMpKQorI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9NQVNLCShORVRYRU5fUENJWF9QU19SRUcoUENJWF9UQVJHRVRfTUFTSykpCisKKyNkZWZpbmUgTkVUWEVOX1BDSV9NQVBTSVpFCTEyOAorI2RlZmluZSBORVRYRU5fUENJX0REUl9ORVQJKDB4MDAwMDAwMDBVTCkKKyNkZWZpbmUgTkVUWEVOX1BDSV9RRFJfTkVUCSgweDA0MDAwMDAwVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfRElSRUNUX0NSQgkoMHgwNDQwMDAwMFVMKQorI2RlZmluZSBORVRYRU5fUENJX0NBTVFNX01BWAkoMHgwNGZmZmZmZlVMKQorI2RlZmluZSBORVRYRU5fUENJX09DTTAJCSgweDA1MDAwMDAwVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfT0NNMF9NQVgJKDB4MDUwZmZmZmZVTCkKKyNkZWZpbmUgTkVUWEVOX1BDSV9PQ00xCQkoMHgwNTEwMDAwMFVMKQorI2RlZmluZSBORVRYRU5fUENJX09DTTFfTUFYCSgweDA1MWZmZmZmVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfQ1JCU1BBQ0UJKDB4MDYwMDAwMDBVTCkKKworI2RlZmluZSBORVRYRU5fQ1JCX0NBTQlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfQ0FNKQorCisjZGVmaW5lIE5FVFhFTl9BRERSX0REUl9ORVQJKDB4MDAwMDAwMDAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgTkVUWEVOX0FERFJfRERSX05FVF9NQVggKDB4MDAwMDAwMDAwZmZmZmZmZlVMTCkKKyNkZWZpbmUgTkVUWEVOX0FERFJfT0NNMAkoMHgwMDAwMDAwMjAwMDAwMDAwVUxMKQorI2RlZmluZSBORVRYRU5fQUREUl9PQ00wX01BWAkoMHgwMDAwMDAwMjAwMGZmZmZmVUxMKQorI2RlZmluZSBORVRYRU5fQUREUl9PQ00xCSgweDAwMDAwMDAyMDA0MDAwMDBVTEwpCisjZGVmaW5lIE5FVFhFTl9BRERSX09DTTFfTUFYCSgweDAwMDAwMDAyMDA0ZmZmZmZVTEwpCisjZGVmaW5lIE5FVFhFTl9BRERSX1FEUl9ORVQJKDB4MDAwMDAwMDMwMDAwMDAwMFVMTCkKKyNkZWZpbmUgTkVUWEVOX0FERFJfUURSX05FVF9NQVggKDB4MDAwMDAwMDMwMDNmZmZmZlVMTCkKKworCS8qIDIwMG1zIGRlbGF5IGluIGVhY2ggbG9vcCAqLworI2RlZmluZQlORVRYRU5fTklVX1BIWV9XQUlUTEVOCQkyMDAwMDAKKwkvKiAxMCBzZWNvbmRzIGJlZm9yZSB3ZSBnaXZlIHVwICovCisjZGVmaW5lCU5FVFhFTl9OSVVfUEhZX1dBSVRNQVgJCTUwCisjZGVmaW5lCU5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUwk0CisKKyNkZWZpbmUJTkVUWEVOX05JVV9NT0RFCQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAwMCkKKworI2RlZmluZQlORVRYRU5fTklVX1hHX1NJTkdMRV9URVJNCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMDQpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfRFJJVkVfSEkJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMDgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfRFJJVkVfTE8JCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMGMpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfRFRYCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDEwKQorI2RlZmluZQlORVRYRU5fTklVX1hHX0RFUQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAxNCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19XT1JEX0FMSUdOCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMTgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUkVTRVQJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMWMpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUE9XRVJfRE9XTgkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDIwKQorI2RlZmluZQlORVRYRU5fTklVX1hHX1JFU0VUX1BMTAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAyNCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19TRVJERVNfTE9PUEJBQ0sJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAyOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19ET19CWVRFX0FMSUdOCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMmMpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfVFhfRU5BQkxFCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDMwKQorI2RlZmluZQlORVRYRU5fTklVX1hHX1JYX0VOQUJMRQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAzNCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19TVEFUVVMJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMzgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUEFVU0VfVEhSRVNIT0xECShORVRYRU5fQ1JCX05JVSArIDB4MDAwM2MpCisjZGVmaW5lCU5FVFhFTl9OSVVfSU5UX01BU0sJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNDApCisjZGVmaW5lCU5FVFhFTl9OSVVfQUNUSVZFX0lOVAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA0NCkKKyNkZWZpbmUJTkVUWEVOX05JVV9NQVNLQUJMRV9JTlQJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNDgpCisKKyNkZWZpbmUgTkVUWEVOX05JVV9TVFJBUF9WQUxVRV9TQVZFX0hJR0hFUgkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDRjKQorCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfU0VSREVTX1JFU0VUCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNTApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0IwX0dNSUlfTU9ERQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDU0KQorI2RlZmluZQlORVRYRU5fTklVX0dCMF9NSUlfTU9ERQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA1OCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjFfR01JSV9NT0RFCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNWMpCisjZGVmaW5lCU5FVFhFTl9OSVVfR0IxX01JSV9NT0RFCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDYwKQorI2RlZmluZQlORVRYRU5fTklVX0dCMl9HTUlJX01PREUJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA2NCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjJfTUlJX01PREUJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNjgpCisjZGVmaW5lCU5FVFhFTl9OSVVfR0IzX0dNSUlfTU9ERQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDZjKQorI2RlZmluZQlORVRYRU5fTklVX0dCM19NSUlfTU9ERQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA3MCkKKyNkZWZpbmUJTkVUWEVOX05JVV9SRU1PVEVfTE9PUEJBQ0sJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA3NCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjBfSEFMRl9EVVBMRVgJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA3OCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjFfSEFMRl9EVVBMRVgJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA3YykKKyNkZWZpbmUJTkVUWEVOX05JVV9SRVNFVF9TWVNfRklGT1MJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA4OCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9DUkNfRFJPUAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA4YykKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9EUk9QX1dST05HQUREUgkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDkwKQorI2RlZmluZQlORVRYRU5fTklVX1RFU1RfTVVYX0NUTAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA5NCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19QQVVTRV9DVEwJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwOTgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUEFVU0VfTEVWRUwJKE5FVFhFTl9DUkJfTklVICsgMHgwMDBkYykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19TRUwJCShORVRYRU5fQ1JCX05JVSArIDB4MDAxMjgpCisKKyNkZWZpbmUgTkVUWEVOX05JVV9GVUxMX0xFVkVMX1hHCShORVRYRU5fQ1JCX05JVSArIDB4MDA0NTApCisKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUkVTRVQJICAgIAkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMTFjKQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9QT1dFUl9ET1dOCShORVRYRU5fQ1JCX05JVSArIDB4MDAxMjApCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1JFU0VUX1BMTAkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMTI0KQorCisjZGVmaW5lIE5FVFhFTl9NQUNfQUREUl9DTlRMX1JFRwkoTkVUWEVOX0NSQl9OSVUgKyAweDEwMDApCisKKyNkZWZpbmUJTkVUWEVOX01VTFRJQ0FTVF9BRERSX0hJXzAJKE5FVFhFTl9DUkJfTklVICsgMHgxMDEwKQorI2RlZmluZSBORVRYRU5fTVVMVElDQVNUX0FERFJfSElfMQkoTkVUWEVOX0NSQl9OSVUgKyAweDEwMTQpCisjZGVmaW5lIE5FVFhFTl9NVUxUSUNBU1RfQUREUl9ISV8yCShORVRYRU5fQ1JCX05JVSArIDB4MTAxOCkKKyNkZWZpbmUgTkVUWEVOX01VTFRJQ0FTVF9BRERSX0hJXzMJKE5FVFhFTl9DUkJfTklVICsgMHgxMDFjKQorCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAwMCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMShJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMDQgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NQUNfSVBHX0lGRyhJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMDggKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9IQUxGX0RVUExFWF9DVFJMKEkpCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDBjICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUFYX0ZSQU1FX1NJWkUoSSkJCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDEwICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfVEVTVF9SRUcoSSkJCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDFjICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09ORklHKEkpCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDIwICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORChJKQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAyNCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFIoSSkJCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDI4ICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ1RSTChJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMmMgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9TVEFUVVMoSSkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMzAgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURShJKQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAzNCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9DVFJMKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAzOCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9TVEFUVVMoSSkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwM2MgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMChJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwNDAgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMShJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwNDQgKyAoSSkqMHgxMDAwMCkKKworI2RlZmluZQlORVRYRU5fTklVX1hHRV9DT05GSUdfMAkJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX0NPTkZJR18xCQkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAwNCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfSVBHCQkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAwOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfSEkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAwYykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfMQkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAxMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzFfTE8JKE5FVFhFTl9DUkJfTklVICsgMHg3MDAxNCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfU1RBVFVTCQkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAxOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfTUFYX0ZSQU1FX1NJWkUJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMWMpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1BBVVNFX0ZSQU1FX1ZBTFVFCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMjApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1RYX0JZVEVfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDI0KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9UWF9GUkFNRV9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMjgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1JYX0JZVEVfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDJjKQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9SWF9GUkFNRV9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMzApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX0FHR1JfRVJST1JfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDM0KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9NVUxUSUNBU1RfRlJBTUVfQ05UIAkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDM4KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9VTklDQVNUX0ZSQU1FX0NOVAkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDNjKQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9DUkNfRVJST1JfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDQwKQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9PVkVSU0laRV9GUkFNRV9FUlIJKE5FVFhFTl9DUkJfTklVICsgMHg3MDA0NCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfVU5ERVJTSVpFX0ZSQU1FX0VSUgkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDQ4KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9MT0NBTF9FUlJPUl9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwNGMpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1JFTU9URV9FUlJPUl9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwNTApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX0NPTlRST0xfQ0hBUl9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwNTQpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1BBVVNFX0ZSQU1FX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDA1OCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfQ09ORklHXzAJCQkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDAwKQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9DT05GSUdfMQkJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMDQpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX0lQRwkJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMDgpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1NUQVRJT05fQUREUl8wX0hJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMGMpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1NUQVRJT05fQUREUl8wXzEJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMTApCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1NUQVRJT05fQUREUl8xX0xPCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMTQpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1NUQVRVUwkJICAgIAkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDE4KQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9NQVhfRlJBTUVfU0laRQkgICAJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAxYykKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUEFVU0VfRlJBTUVfVkFMVUUJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAyMCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfVFhfQllURV9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMjQpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1RYX0ZSQU1FX0NOVAkgCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMjgpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1JYX0JZVEVfQ05UCSAgCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMmMpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1JYX0ZSQU1FX0NOVAkgCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMzApCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX0FHR1JfRVJST1JfQ05UCSAgIAkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDM0KQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9NVUxUSUNBU1RfRlJBTUVfQ05UCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMzgpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1VOSUNBU1RfRlJBTUVfQ05UCShORVRYRU5fQ1JCX05JVSArIDB4ODAwM2MpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX0NSQ19FUlJPUl9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwNDApCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX09WRVJTSVpFX0ZSQU1FX0VSUgkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDQ0KQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9VTkRFUlNJWkVfRlJBTUVfRVJSCShORVRYRU5fQ1JCX05JVSArIDB4ODAwNDgpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX0xPQ0FMX0VSUk9SX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDA0YykKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUkVNT1RFX0VSUk9SX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDA1MCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfQ09OVFJPTF9DSEFSX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDA1NCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUEFVU0VfRlJBTUVfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDU4KQorCisvKiBYRyBMaW5rIHN0YXR1cyAqLworI2RlZmluZSBYR19MSU5LX1VQCTB4MTAKKyNkZWZpbmUgWEdfTElOS19ET1dOCTB4MjAKKworI2RlZmluZSBORVRYRU5fQ0FNX1JBTV9CQVNFCShORVRYRU5fQ1JCX0NBTSArIDB4MDIwMDApCisjZGVmaW5lIE5FVFhFTl9DQU1fUkFNKHJlZykJKE5FVFhFTl9DQU1fUkFNX0JBU0UgKyAocmVnKSkKKyNkZWZpbmUgTkVUWEVOX0ZXX1ZFUlNJT05fTUFKT1IgKE5FVFhFTl9DQU1fUkFNKDB4MTUwKSkKKyNkZWZpbmUgTkVUWEVOX0ZXX1ZFUlNJT05fTUlOT1IgKE5FVFhFTl9DQU1fUkFNKDB4MTU0KSkKKyNkZWZpbmUgTkVUWEVOX0ZXX1ZFUlNJT05fU1VCCShORVRYRU5fQ0FNX1JBTSgweDE1OCkpCisjZGVmaW5lIE5FVFhFTl9ST01fTE9DS19JRAkoTkVUWEVOX0NBTV9SQU0oMHgxMDApKQorCisjZGVmaW5lIE5FVFhFTl9QSFlfTE9DS19JRAkoTkVUWEVOX0NBTV9SQU0oMHgxMjApKQorCisvKiBMb2NrIElEcyBmb3IgUEhZIGxvY2sgKi8KKyNkZWZpbmUgUEhZX0xPQ0tfRFJJVkVSCQkweDQ0NTI0OTU2CisKKy8qIFVzZWQgZm9yIFBTIFBDSSBNZW1vcnkgYWNjZXNzICovCisjZGVmaW5lIFBDSVhfUFNfT1BfQUREUl9MTwkoMHgxMDAwMCkKKy8qICAgdmlhIENSQiAgKFBTIHNpZGUgb25seSkgICAgICovCisjZGVmaW5lIFBDSVhfUFNfT1BfQUREUl9ISQkoMHgxMDAwNCkKKworI2RlZmluZSBQQ0lYX0lOVF9WRUNUT1IJCSgweDEwMTAwKQorI2RlZmluZSBQQ0lYX0lOVF9NQVNLCQkoMHgxMDEwNCkKKworI2RlZmluZSBQQ0lYX01OX1dJTkRPVwkJKDB4MTAyMDApCisjZGVmaW5lIFBDSVhfTVNfV0lORE9XCQkoMHgxMDIwNCkKKyNkZWZpbmUgUENJWF9TTl9XSU5ET1cJCSgweDEwMjA4KQorI2RlZmluZSBQQ0lYX0NSQl9XSU5ET1cJCSgweDEwMjEwKQorCisjZGVmaW5lIFBDSVhfVEFSR0VUX1NUQVRVUwkoMHgxMDExOCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTSwkoMHgxMDEyOCkKKworI2RlZmluZSBQQ0lYX01TSV9GMAkJKDB4MTMwMDApCisKKyNkZWZpbmUgUENJWF9QU19NRU1fU1BBQ0UJKDB4OTAwMDApCisKKyNkZWZpbmUgTkVUWEVOX1BDSVhfUEhfUkVHKHJlZykJKE5FVFhFTl9DUkJfUENJRSArIChyZWcpKQorI2RlZmluZSBORVRYRU5fUENJWF9QU19SRUcocmVnKQkoTkVUWEVOX0NSQl9QQ0lYX01EICsgKHJlZykpCisKKyNkZWZpbmUgTkVUWEVOX1BDSUVfUkVHKHJlZykJKE5FVFhFTl9DUkJfUENJRSArIChyZWcpKQorCisjZGVmaW5lIFBDSUVfTUFYX0RNQV9YRkVSX1NJWkUJKDB4MTQwNGMpCisKKyNkZWZpbmUgUENJRV9EQ1IJCTB4MDBkOAorCisjZGVmaW5lIFBDSUVfU0VNMl9MT0NLCQkoMHgxYzAxMCkJLyogRmxhc2ggbG9jayAgICovCisjZGVmaW5lIFBDSUVfU0VNMl9VTkxPQ0sJKDB4MWMwMTQpCS8qIEZsYXNoIHVubG9jayAqLworI2RlZmluZSBQQ0lFX1NFTTNfTE9DSwkgIAkoMHgxYzAxOCkJLyogUGh5IGxvY2sgICAgICovCisjZGVmaW5lIFBDSUVfU0VNM19VTkxPQ0sJKDB4MWMwMWMpCS8qIFBoeSB1bmxvY2sgICAqLworCisjZGVmaW5lIFBDSUVfVEdUX1NQTElUX0NISUNLRU4JKDB4MTIwODApCisKKyNkZWZpbmUgUENJRV9NQVhfTUFTVEVSX1NQTElUCSgweDE0MDQ4KQorCisjZW5kaWYJCQkJLyogX19ORVRYRU5fTklDX0hEUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1YzI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKQEAgLTAsMCArMSwxMDEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiBOZXRYZW4sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqIAorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICogCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogICAgaW5mb0BuZXR4ZW4uY29tCisgKiBOZXRYZW4sCisgKiAzOTY1IEZyZWVkb20gQ2lyY2xlLCBGb3VydGggZmxvb3IsCisgKiBTYW50YSBDbGFyYSwgQ0EgOTUwNTQKKyAqCisgKgorICogU291cmNlIGZpbGUgZm9yIE5JQyByb3V0aW5lcyB0byBhY2Nlc3MgdGhlIFBoYW50b20gaGFyZHdhcmUKKyAqCisgKi8KKworI2luY2x1ZGUgIm5ldHhlbl9uaWMuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2h3LmgiCisjaW5jbHVkZSAibmV0eGVuX25pY19waGFuX3JlZy5oIgorCisvKiAgUENJIFdpbmRvd2luZyBmb3IgRERSIHJlZ2lvbnMuICAqLworCisjZGVmaW5lIEFERFJfSU5fUkFOR0UoYWRkciwgbG93LCBoaWdoKQlcCisJKCgoYWRkcikgPD0gKGhpZ2gpKSAmJiAoKGFkZHIpID49IChsb3cpKSkKKworI2RlZmluZSBORVRYRU5fRkxBU0hfQkFTRQkoQk9PVExEX1NUQVJUKQorI2RlZmluZSBORVRYRU5fUEhBTlRPTV9NRU1fQkFTRQkoTkVUWEVOX0ZMQVNIX0JBU0UpCisjZGVmaW5lIE5FVFhFTl9NQVhfTVRVCQk4MDAwCisjZGVmaW5lIE5FVFhFTl9NSU5fTVRVCQk2NAorI2RlZmluZSBORVRYRU5fRVRIX0ZDU19TSVpFICAgICA0CisjZGVmaW5lIE5FVFhFTl9FTkVUX0hFQURFUl9TSVpFIDE0CisjZGVmaW5lIE5FVFhFTl9XSU5ET1dfT05FIAkweDIwMDAwMDAJLypDUkIgV2luZG93OiBiaXQgMjUgb2YgQ1JCIGFkZHJlc3MgKi8KKyNkZWZpbmUgTkVUWEVOX0ZJUk1XQVJFX0xFTiAJKCgxNiAqIDEwMjQpIC8gNCkKKyNkZWZpbmUgTkVUWEVOX05JVV9IRFJTSVpFCSgweDEgPDwgNikKKyNkZWZpbmUgTkVUWEVOX05JVV9UTFJTSVpFCSgweDEgPDwgNSkKKworI2RlZmluZSBsb3dlcjMyKHgpCQkoKHUzMikoKHgpICYgMHhmZmZmZmZmZikpCisjZGVmaW5lIHVwcGVyMzIoeCkJCQlcCisJKCh1MzIpKCgodW5zaWduZWQgbG9uZyBsb25nKSh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkKKworI2RlZmluZSBORVRYRU5fTklDX1pFUk9fUEFVU0VfQUREUiAgICAgMFVMTAorI2RlZmluZSBORVRYRU5fTklDX1VOSVRfUEFVU0VfQUREUiAgICAgMHgyMDBVTEwKKyNkZWZpbmUgTkVUWEVOX05JQ19FUEdfUEFVU0VfQUREUjEgICAgIDB4MjIwMDAxMDAwMGMyODAwMVVMTAorI2RlZmluZSBORVRYRU5fTklDX0VQR19QQVVTRV9BRERSMiAgICAgMHgwMTAwMDg4ODY2NTU0NDMzVUxMCisKKyNkZWZpbmUgTkVUWEVOX05JQ19XSU5ET1dfTUFSR0lOIDB4MTAwMDAwCisKK3Vuc2lnbmVkIGxvbmcgbmV0eGVuX25pY19wY2lfc2V0X3dpbmRvdyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyKTsKK3ZvaWQgbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CisKK2ludCBuZXR4ZW5fbmljX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCURQUklOVEsoSU5GTywgInZhbGlkIGV0aGVyIGFkZHJcbiIpOworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCWlmIChhZGFwdGVyLT5vcHMtPm1hY2FkZHJfc2V0KQorCQlhZGFwdGVyLT5vcHMtPm1hY2FkZHJfc2V0KHBvcnQsIGFkZHItPnNhX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBuZXR4ZW5fbmljX3NldF9tdWx0aSAtIE11bHRpY2FzdAorICovCit2b2lkIG5ldHhlbl9uaWNfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCV9fbGUzMiBuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhID0gMDsKKworCW1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWlmIChhZGFwdGVyLT5vcHMtPnNldF9wcm9taXNjKQorCQkJYWRhcHRlci0+b3BzLT5zZXRfcHJvbWlzYyhhZGFwdGVyLAorCQkJCQkJICBwb3J0LT5wb3J0bnVtLAorCQkJCQkJICBORVRYRU5fTklVX1BST01JU0NfTU9ERSk7CisJfSBlbHNlIHsKKwkJaWYgKGFkYXB0ZXItPm9wcy0+dW5zZXRfcHJvbWlzYyAmJgorCQkgICAgYWRhcHRlci0+YWh3LmJvYXJkY2ZnLmJvYXJkX3R5cGUKKwkJICAgICE9IE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVopCisJCQlhZGFwdGVyLT5vcHMtPnVuc2V0X3Byb21pc2MoYWRhcHRlciwKKwkJCQkJCSAgICBwb3J0LT5wb3J0bnVtLAorCQkJCQkJICAgIE5FVFhFTl9OSVVfTk9OX1BST01JU0NfTU9ERSk7CisJfQorCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX1hHQkUpIHsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X21vZGVfc2VsZWN0KG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDMpOworCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDAobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMCk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMShuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAwKTsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wyKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOworCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDMobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMCk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9lbmFibGVfeHRuZDAobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9lbmFibGVfeHRuZDEobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9lbmFibGVfeHRuZDIobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9lbmFibGVfeHRuZDMobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSk7CisJfSBlbHNlIHsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X21vZGVfc2VsZWN0KG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOworCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDAobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMCk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMShuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAxKTsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wyKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDIpOworCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDMobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMyk7CisJfQorCXdyaXRlbChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLAorCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fTUFDX0FERFJfQ05UTF9SRUcpKTsKKwlpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19YR0JFKSB7CisJCXdyaXRlbChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLAorCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9NVUxUSUNBU1RfQUREUl9ISV8wKSk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsCisJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX01VTFRJQ0FTVF9BRERSX0hJXzEpKTsKKwl9CisJbmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSA9IDA7CisJd3JpdGVsKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfRFJPUF9XUk9OR0FERFIpKTsKK30KKworLyoKKyAqIG5ldHhlbl9uaWNfY2hhbmdlX210dSAtIENoYW5nZSB0aGUgTWF4aW11bSBUcmFuc2ZlciBVbml0CisgKiBAcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworaW50IG5ldHhlbl9uaWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbXR1KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlpbnQgZWZmX210dSA9IG10dSArIE5FVFhFTl9FTkVUX0hFQURFUl9TSVpFICsgTkVUWEVOX0VUSF9GQ1NfU0laRTsKKworCWlmICgoZWZmX210dSA+IE5FVFhFTl9NQVhfTVRVKSB8fCAoZWZmX210dSA8IE5FVFhFTl9NSU5fTVRVKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyAlZCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSwgbXR1KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkYXB0ZXItPm9wcy0+c2V0X210dSkKKwkJYWRhcHRlci0+b3BzLT5zZXRfbXR1KHBvcnQsIG10dSk7CisJbmV0ZGV2LT5tdHUgPSBtdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNoZWNrIGlmIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBkb3dubG9hZGVkIGFuZCByZWFkeSB0byBydW4gIGFuZAorICogc2V0dXAgdGhlIGFkZHJlc3MgZm9yIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgYWRhcHRlcgorICovCitpbnQgbmV0eGVuX25pY19od19yZXNvdXJjZXMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXR4ZW5faGFyZHdhcmVfY29udGV4dCAqaHcgPSAmYWRhcHRlci0+YWh3OworCXUzMiBzdGF0ZSA9IDA7CisJdm9pZCAqYWRkcjsKKwl2b2lkICpwYXVzZV9hZGRyOworCWludCBsb29wcyA9IDAsIGVyciA9IDA7CisJaW50IGN0eCwgcmluZzsKKwl1MzIgY2FyZF9jbWRyaW5nID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2NyYiAqcmN2X2Rlc2NfY3JiID0gTlVMTDsKKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCAqcmVjdl9jdHg7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jdHggKnJjdl9kZXNjOworCisJRFBSSU5USyhJTkZPLCAiY3JiX2Jhc2U6ICVseCAlbHgiLCBORVRYRU5fUENJX0NSQlNQQUNFLAorCQlQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLCBORVRYRU5fUENJX0NSQlNQQUNFKSk7CisJRFBSSU5USyhJTkZPLCAiY2FtIGJhc2U6ICVseCAlbHgiLCBORVRYRU5fQ1JCX0NBTSwKKwkJcGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIE5FVFhFTl9DUkJfQ0FNKSk7CisJRFBSSU5USyhJTkZPLCAiY2FtIFJBTTogJWx4ICVseCIsIE5FVFhFTl9DQU1fUkFNX0JBU0UsCisJCXBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBORVRYRU5fQ0FNX1JBTV9CQVNFKSk7CisJRFBSSU5USyhJTkZPLCAiTklDIGJhc2U6JWx4ICVseFxuIiwgTklDX0NSQl9CQVNFX1BPUlQxLAorCQlwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgTklDX0NSQl9CQVNFX1BPUlQxKSk7CisKKwkvKiBXaW5kb3cgMSBjYWxsICovCisJY2FyZF9jbWRyaW5nID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19DTURSSU5HKSk7CisKKwlEUFJJTlRLKElORk8sICJDb21tYW5kIFBlZyBzZW5kcyAweCV4IGZvciBjbWRyaW5nIGJhc2VcbiIsCisJCWNhcmRfY21kcmluZyk7CisKKwlmb3IgKGN0eCA9IDA7IGN0eCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eCkgeworCQlEUFJJTlRLKElORk8sICJDb21tYW5kIFBlZyByZWFkeS4ud2FpdGluZyBmb3IgcmN2IHBlZ1xuIik7CisJCWxvb3BzID0gMDsKKwkJc3RhdGUgPSAwOworCQkvKiBXaW5kb3cgMSBjYWxsICovCisJCXN0YXRlID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCSAgIHJlY3ZfY3JiX3JlZ2lzdGVyc1tjdHhdLgorCQkJCQkJICAgY3JiX3JjdnBlZ19zdGF0ZSkpOworCQl3aGlsZSAoc3RhdGUgIT0gUEhBTl9QRUdfUkNWX0lOSVRJQUxJWkVEICYmIGxvb3BzIDwgMjApIHsKKwkJCXVkZWxheSgxMDApOworCQkJLyogV2luZG93IDEgY2FsbCAqLworCQkJc3RhdGUgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkJCSAgIHJlY3ZfY3JiX3JlZ2lzdGVycworCQkJCQkJCSAgIFtjdHhdLgorCQkJCQkJCSAgIGNyYl9yY3ZwZWdfc3RhdGUpKTsKKwkJCWxvb3BzKys7CisJCX0KKwkJaWYgKGxvb3BzID49IDIwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlJjdiBQZWcgaW5pdGlhbGl6YXRpb24gbm90IGNvbXBsZXRlOiIKKwkJCSAgICAgICAiJXguXG4iLCBzdGF0ZSk7CisJCQllcnIgPSAtRUlPOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlEUFJJTlRLKElORk8sICJSZWNpZXZlIFBlZyByZWFkeSB0b28uIHN0YXJ0aW5nIHN0dWZmXG4iKTsKKworCWFkZHIgPSBuZXR4ZW5fYWxsb2MoYWRhcHRlci0+YWh3LnBkZXYsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgKgorCQkJICAgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50LAorCQkJICAgICZody0+Y21kX2Rlc2NfcGh5c19hZGRyLCAmaHctPmNtZF9kZXNjX3BkZXYpOworCisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQlEUFJJTlRLKEVSUiwgImJhZCByZXR1cm4gZnJvbSBwY2lfYWxsb2NfY29uc2lzdGVudFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBhdXNlX2FkZHIgPSBuZXR4ZW5fYWxsb2MoYWRhcHRlci0+YWh3LnBkZXYsIDUxMiwKKwkJCQkgIChkbWFfYWRkcl90ICopICYgaHctPnBhdXNlX3BoeXNhZGRyLAorCQkJCSAgJmh3LT5wYXVzZV9wZGV2KTsKKwlpZiAocGF1c2VfYWRkciA9PSBOVUxMKSB7CisJCURQUklOVEsoMSwgRVJSLCAiYmFkIHJldHVybiBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaHctPnBhdXNlYWRkciA9IChjaGFyICopcGF1c2VfYWRkcjsKKwl7CisJCXU2NCAqcHRyID0gKHU2NCAqKSBwYXVzZV9hZGRyOworCQkqcHRyKysgPSBORVRYRU5fTklDX1pFUk9fUEFVU0VfQUREUjsKKwkJKnB0cisrID0gTkVUWEVOX05JQ19aRVJPX1BBVVNFX0FERFI7CisJCSpwdHIrKyA9IE5FVFhFTl9OSUNfVU5JVF9QQVVTRV9BRERSOworCQkqcHRyKysgPSBORVRYRU5fTklDX1pFUk9fUEFVU0VfQUREUjsKKwkJKnB0cisrID0gTkVUWEVOX05JQ19FUEdfUEFVU0VfQUREUjE7CisJCSpwdHIrKyA9IE5FVFhFTl9OSUNfRVBHX1BBVVNFX0FERFIyOworCX0KKworCWh3LT5jbWRfZGVzY19oZWFkID0gKHN0cnVjdCBjbWRfZGVzY190eXBlMCAqKWFkZHI7CisKKwlmb3IgKGN0eCA9IDA7IGN0eCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eCkgeworCQlyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eFtjdHhdOworCisJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykgeworCQkJcmN2X2Rlc2MgPSAmcmVjdl9jdHgtPnJjdl9kZXNjW3JpbmddOworCQkJYWRkciA9IG5ldHhlbl9hbGxvYyhhZGFwdGVyLT5haHcucGRldiwKKwkJCQkJICAgIFJDVl9ERVNDX1JJTkdTSVpFLAorCQkJCQkgICAgJnJjdl9kZXNjLT5waHlzX2FkZHIsCisJCQkJCSAgICAmcmN2X2Rlc2MtPnBoeXNfcGRldik7CisJCQlpZiAoYWRkciA9PSBOVUxMKSB7CisJCQkJRFBSSU5USyhFUlIsICJiYWQgcmV0dXJuIGZyb20gIgorCQkJCQkicGNpX2FsbG9jX2NvbnNpc3RlbnRcbiIpOworCQkJCW5ldHhlbl9mcmVlX2h3X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlyY3ZfZGVzYy0+ZGVzY19oZWFkID0gKHN0cnVjdCByY3ZfZGVzYyAqKWFkZHI7CisJCX0KKworCQlhZGRyID0gbmV0eGVuX2FsbG9jKGFkYXB0ZXItPmFody5wZGV2LCBTVEFUVVNfREVTQ19SSU5HU0laRSwKKwkJCQkgICAgJnJlY3ZfY3R4LT5yY3Zfc3RhdHVzX2Rlc2NfcGh5c19hZGRyLAorCQkJCSAgICAmcmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19wZGV2KTsKKwkJaWYgKGFkZHIgPT0gTlVMTCkgeworCQkJRFBSSU5USyhFUlIsICJiYWQgcmV0dXJuIGZyb20iCisJCQkJIiBwY2lfYWxsb2NfY29uc2lzdGVudFxuIik7CisJCQluZXR4ZW5fZnJlZV9od19yZXNvdXJjZXMoYWRhcHRlcik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQgPSAoc3RydWN0IHN0YXR1c19kZXNjICopYWRkcjsKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ107CisJCQlyY3ZfZGVzY19jcmIgPQorCQkJICAgICZyZWN2X2NyYl9yZWdpc3RlcnNbY3R4XS5yY3ZfZGVzY19jcmJbcmluZ107CisJCQlEUFJJTlRLKElORk8sICJyaW5nICMlZCBjcmIgZ2xvYmFsIHJpbmcgcmVnIDB4JXhcbiIsCisJCQkJcmluZywgcmN2X2Rlc2NfY3JiLT5jcmJfZ2xvYmFscmN2X3JpbmcpOworCQkJLyogV2luZG93ID0gMSAqLworCQkJd3JpdGVsKGxvd2VyMzIocmN2X2Rlc2MtPnBoeXNfYWRkciksCisJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCSAgICByY3ZfZGVzY19jcmItPgorCQkJCQkJICAgIGNyYl9nbG9iYWxyY3ZfcmluZykpOworCQkJRFBSSU5USyhJTkZPLCAiR0xPQkFMX1JDVl9SSU5HIGN0eCAlZCwgYWRkciAweCV4IgorCQkJCSIgdmFsIDB4JWxseCwiCisJCQkJIiB2aXJ0ICVwXG4iLCBjdHgsCisJCQkJcmN2X2Rlc2NfY3JiLT5jcmJfZ2xvYmFscmN2X3JpbmcsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyY3ZfZGVzYy0+cGh5c19hZGRyLAorCQkJCStyY3ZfZGVzYy0+ZGVzY19oZWFkKTsKKwkJfQorCisJCS8qIFdpbmRvdyA9IDEgKi8KKwkJd3JpdGVsKGxvd2VyMzIocmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19waHlzX2FkZHIpLAorCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJICAgIHJlY3ZfY3JiX3JlZ2lzdGVyc1tjdHhdLgorCQkJCQkgICAgY3JiX3JjdnN0YXR1c19yaW5nKSk7CisJCURQUklOVEsoSU5GTywgIlJDVlNUQVRVU19SSU5HLCBjdHggJWQsIGFkZHIgMHgleCwiCisJCQkiIHZhbCAweCV4LHZpcnQlcFxuIiwKKwkJCWN0eCwKKwkJCXJlY3ZfY3JiX3JlZ2lzdGVyc1tjdHhdLmNyYl9yY3ZzdGF0dXNfcmluZywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19waHlzX2FkZHIsCisJCQlyZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQpOworCX0KKwkvKiBXaW5kb3cgPSAxICovCisJd3JpdGVsKGxvd2VyMzIoaHctPnBhdXNlX3BoeXNhZGRyKSwKKwkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1BBVVNFX0FERFJfTE8pKTsKKwl3cml0ZWwodXBwZXIzMihody0+cGF1c2VfcGh5c2FkZHIpLAorCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfUEFVU0VfQUREUl9ISSkpOworCisJd3JpdGVsKGxvd2VyMzIoaHctPmNtZF9kZXNjX3BoeXNfYWRkciksCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9IT1NUX0NNRF9BRERSX0xPKSk7CisJd3JpdGVsKHVwcGVyMzIoaHctPmNtZF9kZXNjX3BoeXNfYWRkciksCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9IT1NUX0NNRF9BRERSX0hJKSk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBuZXR4ZW5fZnJlZV9od19yZXNvdXJjZXMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eDsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2M7CisJaW50IGN0eCwgcmluZzsKKworCWlmIChhZGFwdGVyLT5haHcuY21kX2Rlc2NfaGVhZCAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+YWh3LmNtZF9kZXNjX3BkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2NfdHlwZTApICoKKwkJCQkgICAgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQsCisJCQkJICAgIGFkYXB0ZXItPmFody5jbWRfZGVzY19oZWFkLAorCQkJCSAgICBhZGFwdGVyLT5haHcuY21kX2Rlc2NfcGh5c19hZGRyKTsKKwkJYWRhcHRlci0+YWh3LmNtZF9kZXNjX2hlYWQgPSBOVUxMOworCX0KKwlpZiAoYWRhcHRlci0+YWh3LnBhdXNlYWRkciAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+YWh3LnBhdXNlX3BkZXYsIDUxMiwKKwkJCQkgICAgYWRhcHRlci0+YWh3LnBhdXNlYWRkciwKKwkJCQkgICAgYWRhcHRlci0+YWh3LnBhdXNlX3BoeXNhZGRyKTsKKwkJYWRhcHRlci0+YWh3LnBhdXNlYWRkciA9IE5VTEw7CisJfQorCisJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKKwkJcmVjdl9jdHggPSAmYWRhcHRlci0+cmVjdl9jdHhbY3R4XTsKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ107CisKKwkJCWlmIChyY3ZfZGVzYy0+ZGVzY19oZWFkICE9IE5VTEwpIHsKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJjdl9kZXNjLT5waHlzX3BkZXYsCisJCQkJCQkgICAgUkNWX0RFU0NfUklOR1NJWkUsCisJCQkJCQkgICAgcmN2X2Rlc2MtPmRlc2NfaGVhZCwKKwkJCQkJCSAgICByY3ZfZGVzYy0+cGh5c19hZGRyKTsKKwkJCQlyY3ZfZGVzYy0+ZGVzY19oZWFkID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCWlmIChyZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQgIT0gTlVMTCkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChyZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX3BkZXYsCisJCQkJCSAgICBTVEFUVVNfREVTQ19SSU5HU0laRSwKKwkJCQkJICAgIHJlY3ZfY3R4LT5yY3Zfc3RhdHVzX2Rlc2NfaGVhZCwKKwkJCQkJICAgIHJlY3ZfY3R4LT4KKwkJCQkJICAgIHJjdl9zdGF0dXNfZGVzY19waHlzX2FkZHIpOworCQkJcmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19oZWFkID0gTlVMTDsKKwkJfQorCX0KK30KKwordm9pZCBuZXR4ZW5fdHNvX2NoZWNrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgc3RydWN0IGNtZF9kZXNjX3R5cGUwICpkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChkZXNjLT5tc3MpIHsKKwkJZGVzYy0+dG90YWxfaGRyX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArCisJCSAgICAoKHNrYi0+bmguaXBoKS0+aWhsICogc2l6ZW9mKHUzMikpICsKKwkJICAgICgoc2tiLT5oLnRoKS0+ZG9mZiAqIHNpemVvZih1MzIpKTsKKwkJZGVzYy0+b3Bjb2RlID0gVFhfVENQX0xTTzsKKwl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7CisJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJCWRlc2MtPm9wY29kZSA9IFRYX1RDUF9QS1Q7CisJCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCQlkZXNjLT5vcGNvZGUgPSBUWF9VRFBfUEtUOworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisJfQorCWFkYXB0ZXItPnN0YXRzLnhtaXRjc3VtbWVkKys7CisJQ01EX0RFU0NfVENQX0hEUl9PRkZTRVRfV1JUKGRlc2MsIHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCWRlc2MtPmxlbmd0aF90Y3BfaGRyID0gY3B1X3RvX2xlMzIoZGVzYy0+bGVuZ3RoX3RjcF9oZHIpOworCWRlc2MtPmlwX2hkcl9vZmZzZXQgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKK30KKworaW50IG5ldHhlbl9pc19mbGFzaF9zdXBwb3J0ZWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWNvbnN0IGludCBsb2NzW10gPSB7IDAsIDB4NCwgMHgxMDAsIDB4NDAwMCwgMHg0MTI4IH07CisJaW50IGFkZHIsIHZhbDAxLCB2YWwwMiwgaSwgajsKKworCS8qIGlmIHRoZSBmbGFzaCBzaXplIGxlc3MgdGhhbiA0TWIsIG1ha2UgaHVnZSB3YXIgY3J5IGFuZCBkaWUgKi8KKwlmb3IgKGogPSAxOyBqIDwgNDsgaisrKSB7CisJCWFkZHIgPSBqICogTkVUWEVOX05JQ19XSU5ET1dfTUFSR0lOOworCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihsb2NzKSAvIHNpemVvZihsb2NzWzBdKSk7IGkrKykgeworCQkJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGxvY3NbaV0sICZ2YWwwMSkgPT0gMAorCQkJICAgICYmIG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIChhZGRyICsgbG9jc1tpXSksCisJCQkJCQkgICAgJnZhbDAyKSA9PSAwKSB7CisJCQkJaWYgKHZhbDAxID09IHZhbDAyKQorCQkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXR4ZW5fZ2V0X2ZsYXNoX2Jsb2NrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGJhc2UsCisJCQkJICBpbnQgc2l6ZSwgdTMyICogYnVmKQoreworCWludCBpLCBhZGRyOworCXUzMiAqcHRyMzI7CisKKwlhZGRyID0gYmFzZTsKKwlwdHIzMiA9IGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZih1MzIpOyBpKyspIHsKKwkJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGFkZHIsIHB0cjMyKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJcHRyMzIrKzsKKwkJYWRkciArPSBzaXplb2YodTMyKTsKKwl9CisJaWYgKChjaGFyICopYnVmICsgc2l6ZSA+IChjaGFyICopcHRyMzIpIHsKKwkJdTMyIGxvY2FsOworCisJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBhZGRyLCAmbG9jYWwpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQltZW1jcHkocHRyMzIsICZsb2NhbCwgKGNoYXIgKilidWYgKyBzaXplIC0gKGNoYXIgKilwdHIzMik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXR4ZW5fZ2V0X2ZsYXNoX21hY19hZGRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG1hY1tdKQoreworCXUzMiAqcG1hYyA9ICh1MzIgKikgJiBtYWNbMF07CisKKwlpZiAobmV0eGVuX2dldF9mbGFzaF9ibG9jayhhZGFwdGVyLAorCQkJCSAgIFVTRVJfU1RBUlQgKworCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBuZXR4ZW5fbmV3X3VzZXJfaW5mbywKKwkJCQkJICAgIG1hY19hZGRyKSwKKwkJCQkgICBGTEFTSF9OVU1fUE9SVFMgKiBzaXplb2YodTY0KSwgcG1hYykgPT0gLTEpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKm1hYyA9PSB+MFVMTCkgeworCQlpZiAobmV0eGVuX2dldF9mbGFzaF9ibG9jayhhZGFwdGVyLAorCQkJCQkgICBVU0VSX1NUQVJUX09MRCArCisJCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBuZXR4ZW5fdXNlcl9vbGRfaW5mbywKKwkJCQkJCSAgICBtYWNfYWRkciksCisJCQkJCSAgIEZMQVNIX05VTV9QT1JUUyAqIHNpemVvZih1NjQpLAorCQkJCQkgICBwbWFjKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCptYWMgPT0gfjBVTEwpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ2hhbmdlcyB0aGUgQ1JCIHdpbmRvdyB0byB0aGUgc3BlY2lmaWVkIHdpbmRvdy4KKyAqLwordm9pZCBuZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHduZHcpCit7CisJdm9pZCBfX2lvbWVtICpvZmZzZXQ7CisJdTMyIHRtcDsKKwlpbnQgY291bnQgPSAwOworCisJaWYgKGFkYXB0ZXItPmN1cnJfd2luZG93ID09IHduZHcpCisJCXJldHVybjsKKworCS8qCisJICogTW92ZSB0aGUgQ1JCIHdpbmRvdy4KKwkgKiBXZSBuZWVkIHRvIHdyaXRlIHRvIHRoZSAiZGlyZWN0IGFjY2VzcyIgcmVnaW9uIG9mIFBDSQorCSAqIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIHdpbmRvdyByZWdpc3RlciBoYXMKKwkgKiBub3QgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbiBhY3Jvc3MgQ1JCIGJlZm9yZSB0aGUgdGFyZ2V0CisJICogcmVnaXN0ZXIgYWRkcmVzcyBpcyByZWNlaXZlZCBieSBQQ0kuIFRoZSBkaXJlY3QgcmVnaW9uIGJ5cGFzc2VzCisJICogdGhlIENSQiBidXMuCisJICovCisJb2Zmc2V0ID0KKwkgICAgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkgICAgTkVUWEVOX1BDSVhfUEhfUkVHKFBDSVhfQ1JCX1dJTkRPVykpOworCisJaWYgKHduZHcgJiAweDEpCisJCXduZHcgPSBORVRYRU5fV0lORE9XX09ORTsKKworCXdyaXRlbCh3bmR3LCBvZmZzZXQpOworCisJLyogTVVTVCBtYWtlIHN1cmUgd2luZG93IGlzIHNldCBiZWZvcmUgd2UgZm9yZ2Ugb24uLi4gKi8KKwl3aGlsZSAoKHRtcCA9IHJlYWRsKG9mZnNldCkpICE9IHduZHcpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzIFdBUk5JTkc6IENSQiB3aW5kb3cgdmFsdWUgbm90ICIKKwkJICAgICAgICJyZWdpc3RlcmVkIHByb3Blcmx5OiAweCUwOHguXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgX19GVU5DVElPTl9fLCB0bXApOworCQltZGVsYXkoMSk7CisJCWlmIChjb3VudCA+PSAxMCkKKwkJCWJyZWFrOworCQljb3VudCsrOworCX0KKworCWFkYXB0ZXItPmN1cnJfd2luZG93ID0gd25kdzsKK30KKwordm9pZCBuZXR4ZW5fbG9hZF9maXJtd2FyZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisJbG9uZyBkYXRhLCBzaXplID0gMDsKKwlsb25nIGZsYXNoYWRkciA9IE5FVFhFTl9GTEFTSF9CQVNFLCBtZW1hZGRyID0gTkVUWEVOX1BIQU5UT01fTUVNX0JBU0U7CisJdTY0IG9mZjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlzaXplID0gTkVUWEVOX0ZJUk1XQVJFX0xFTjsKKwl3cml0ZWwoMSwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9HTEJfQ0FTX1JTVCkpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgZmxhc2hhZGRyLCAoaW50ICopJmRhdGEpICE9IDApIHsKKwkJCURQUklOVEsoRVJSLAorCQkJCSJFcnJvciBpbiBuZXR4ZW5fcm9tX2Zhc3RfcmVhZCgpLiBXaWxsIHNraXAiCisJCQkJImxvYWRpbmcgZmxhc2ggaW1hZ2VcbiIpOworCQkJcmV0dXJuOworCQl9CisJCW9mZiA9IG5ldHhlbl9uaWNfcGNpX3NldF93aW5kb3coYWRhcHRlciwgbWVtYWRkcik7CisJCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwkJd3JpdGVsKGRhdGEsIGFkZHIpOworCQlmbGFzaGFkZHIgKz0gNDsKKwkJbWVtYWRkciArPSA0OworCX0KKwl1ZGVsYXkoMTAwKTsKKwkvKiBtYWtlIHN1cmUgQ2FzcGVyIGlzIHBvd2VyZWQgb24gKi8KKwl3cml0ZWwoMHgzZmZmLAorCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX0dMQl9DSElQX0NMS19DVFJMKSk7CisJd3JpdGVsKDAsIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX0NBU19SU1QpKTsKKworCXVkZWxheSgxMDApOworfQorCitpbnQKK25ldHhlbl9uaWNfaHdfd3JpdGVfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLCB2b2lkICpkYXRhLAorCQkgICAgICAgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlpZiAoQUREUl9JTl9XSU5ET1cxKG9mZikpIHsKKwkJYWRkciA9IE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIG9mZik7CisJfSBlbHNlIHsJCS8qIFdpbmRvdyAwICovCisJCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwl9CisKKwlEUFJJTlRLKElORk8sICJ3cml0aW5nIHRvIGJhc2UgJWx4IG9mZnNldCAlbGx4IGFkZHIgJXAiCisJCSIgZGF0YSAlbGx4IGxlbiAlZFxuIiwKKwkJcGNpX2Jhc2UoYWRhcHRlciwgb2ZmKSwgb2ZmLCBhZGRyLAorCQkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWRhdGEsIGxlbik7CisJaWYgKCFhZGRyKSB7CisJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisJCXJldHVybiAxOworCX0KKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQl3cml0ZWIoKih1OCAqKSBkYXRhLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl3cml0ZXcoKih1MTYgKikgZGF0YSwgYWRkcik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJd3JpdGVsKCoodTMyICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDg6CisJCXdyaXRlcSgqKHU2NCAqKSBkYXRhLCBhZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFBSSU5USyhJTkZPLAorCQkJIndyaXRpbmcgZGF0YSAlbHggdG8gb2Zmc2V0ICVsbHgsIG51bSB3b3Jkcz0lZFxuIiwKKwkJCSoodW5zaWduZWQgbG9uZyAqKWRhdGEsIG9mZiwgKGxlbiA+PiAzKSk7CisKKwkJbmV0eGVuX25pY19od19ibG9ja193cml0ZTY0KCh1NjQgX19pb21lbSAqKSBkYXRhLCBhZGRyLAorCQkJCQkgICAgKGxlbiA+PiAzKSk7CisJCWJyZWFrOworCX0KKwlpZiAoIUFERFJfSU5fV0lORE9XMShvZmYpKQorCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbmV0eGVuX25pY19od19yZWFkX3d4KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwgdm9pZCAqZGF0YSwKKwkJICAgICAgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlpZiAoQUREUl9JTl9XSU5ET1cxKG9mZikpIHsJLyogV2luZG93IDEgKi8KKwkJYWRkciA9IE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIG9mZik7CisJfSBlbHNlIHsJCS8qIFdpbmRvdyAwICovCisJCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwl9CisKKwlEUFJJTlRLKElORk8sICJyZWFkaW5nIGZyb20gYmFzZSAlbHggb2Zmc2V0ICVsbHggYWRkciAlcFxuIiwKKwkJcGNpX2Jhc2UoYWRhcHRlciwgb2ZmKSwgb2ZmLCBhZGRyKTsKKwlpZiAoIWFkZHIpIHsKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqKHU4ICopIGRhdGEgPSByZWFkYihhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqKHUxNiAqKSBkYXRhID0gcmVhZHcoYWRkcik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKih1MzIgKikgZGF0YSA9IHJlYWRsKGFkZHIpOworCQlicmVhazsKKwljYXNlIDg6CisJCSoodTY0ICopIGRhdGEgPSByZWFkcShhZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmV0eGVuX25pY19od19ibG9ja19yZWFkNjQoKHU2NCBfX2lvbWVtICopIGRhdGEsIGFkZHIsCisJCQkJCSAgIChsZW4gPj4gMykpOworCQlicmVhazsKKwl9CisJRFBSSU5USyhJTkZPLCAicmVhZCAlbHhcbiIsICoodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCisJaWYgKCFBRERSX0lOX1dJTkRPVzEob2ZmKSkKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAxKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG5ldHhlbl9uaWNfcmVnX3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwgdTMyIHZhbCkKK3sJCQkJLyogT25seSBmb3Igd2luZG93IDEgKi8KKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlhZGRyID0gTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKTsKKwlEUFJJTlRLKElORk8sICJ3cml0aW5nIHRvIGJhc2UgJWx4IG9mZnNldCAlbGx4IGFkZHIgJXAgZGF0YSAleFxuIiwKKwkJcGNpX2Jhc2UoYWRhcHRlciwgb2ZmKSwgb2ZmLCBhZGRyKTsKKwl3cml0ZWwodmFsLCBhZGRyKTsKKworfQorCitpbnQgbmV0eGVuX25pY19yZWdfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYpCit7CQkJCS8qIE9ubHkgZm9yIHdpbmRvdyAxICovCisJdm9pZCBfX2lvbWVtICphZGRyOworCWludCB2YWw7CisKKwlhZGRyID0gTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKTsKKwlEUFJJTlRLKElORk8sICJyZWFkaW5nIGZyb20gYmFzZSAlbHggb2Zmc2V0ICVsbHggYWRkciAlcFxuIiwKKwkJYWRhcHRlci0+YWh3LnBjaV9iYXNlLCBvZmYsIGFkZHIpOworCXZhbCA9IHJlYWRsKGFkZHIpOworCXdyaXRlbCh2YWwsIGFkZHIpOworCisJcmV0dXJuIHZhbDsKK30KKworLyogQ2hhbmdlIHRoZSB3aW5kb3cgdG8gMCwgd3JpdGUgYW5kIGNoYW5nZSBiYWNrIHRvIHdpbmRvdyAxLiAqLwordm9pZCBuZXR4ZW5fbmljX3dyaXRlX3cwKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIGluZGV4LCB1MzIgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwlhZGRyID0gcGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIGluZGV4KTsKKwl3cml0ZWwodmFsdWUsIGFkZHIpOworCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7Cit9CisKKy8qIENoYW5nZSB0aGUgd2luZG93IHRvIDAsIHJlYWQgYW5kIGNoYW5nZSBiYWNrIHRvIHdpbmRvdyAxLiAqLwordm9pZCBuZXR4ZW5fbmljX3JlYWRfdzAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgaW5kZXgsIHUzMiAqIHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgaW5kZXgpOworCisJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwkqdmFsdWUgPSByZWFkbChhZGRyKTsKKwluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworfQorCitpbnQgbmV0eGVuX3BjaV9zZXRfd2luZG93X3dhcm5pbmdfY291bnQgPSAwOworCit1bnNpZ25lZCBsb25nCituZXR4ZW5fbmljX3BjaV9zZXRfd2luZG93KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIpCit7CisJc3RhdGljIGludCBkZHJfbW5fd2luZG93ID0gLTE7CisJc3RhdGljIGludCBxZHJfc25fd2luZG93ID0gLTE7CisJaW50IHdpbmRvdzsKKworCWlmIChBRERSX0lOX1JBTkdFKGFkZHIsIE5FVFhFTl9BRERSX0REUl9ORVQsIE5FVFhFTl9BRERSX0REUl9ORVRfTUFYKSkgeworCQkvKiBERFIgbmV0d29yayBzaWRlICovCisJCWFkZHIgLT0gTkVUWEVOX0FERFJfRERSX05FVDsKKwkJd2luZG93ID0gKGFkZHIgPj4gMjUpICYgMHgzZmY7CisJCWlmIChkZHJfbW5fd2luZG93ICE9IHdpbmRvdykgeworCQkJZGRyX21uX3dpbmRvdyA9IHdpbmRvdzsKKwkJCXdyaXRlbCh3aW5kb3csIFBDSV9PRkZTRVRfU0VDT05EX1JBTkdFKGFkYXB0ZXIsCisJCQkJCQkJICAgICAgIE5FVFhFTl9QQ0lYX1BIX1JFRworCQkJCQkJCSAgICAgICAoUENJWF9NTl9XSU5ET1cpKSk7CisJCQkvKiBNVVNUIG1ha2Ugc3VyZSB3aW5kb3cgaXMgc2V0IGJlZm9yZSB3ZSBmb3JnZSBvbi4uLiAqLworCQkJcmVhZGwoUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCSAgICAgIE5FVFhFTl9QQ0lYX1BIX1JFRworCQkJCQkJICAgICAgKFBDSVhfTU5fV0lORE9XKSkpOworCQl9CisJCWFkZHIgLT0gKHdpbmRvdyAqIE5FVFhFTl9XSU5ET1dfT05FKTsKKwkJYWRkciArPSBORVRYRU5fUENJX0REUl9ORVQ7CisJfSBlbHNlIGlmIChBRERSX0lOX1JBTkdFKGFkZHIsIE5FVFhFTl9BRERSX09DTTAsIE5FVFhFTl9BRERSX09DTTBfTUFYKSkgeworCQlhZGRyIC09IE5FVFhFTl9BRERSX09DTTA7CisJCWFkZHIgKz0gTkVUWEVOX1BDSV9PQ00wOworCX0gZWxzZSBpZiAoQUREUl9JTl9SQU5HRShhZGRyLCBORVRYRU5fQUREUl9PQ00xLCBORVRYRU5fQUREUl9PQ00xX01BWCkpIHsKKwkJYWRkciAtPSBORVRYRU5fQUREUl9PQ00xOworCQlhZGRyICs9IE5FVFhFTl9QQ0lfT0NNMTsKKwl9IGVsc2UKKwkgICAgaWYgKEFERFJfSU5fUkFOR0UKKwkJKGFkZHIsIE5FVFhFTl9BRERSX1FEUl9ORVQsIE5FVFhFTl9BRERSX1FEUl9ORVRfTUFYKSkgeworCQkvKiBRRFIgbmV0d29yayBzaWRlICovCisJCWFkZHIgLT0gTkVUWEVOX0FERFJfUURSX05FVDsKKwkJd2luZG93ID0gKGFkZHIgPj4gMjIpICYgMHgzZjsKKwkJaWYgKHFkcl9zbl93aW5kb3cgIT0gd2luZG93KSB7CisJCQlxZHJfc25fd2luZG93ID0gd2luZG93OworCQkJd3JpdGVsKCh3aW5kb3cgPDwgMjIpLAorCQkJICAgICAgIFBDSV9PRkZTRVRfU0VDT05EX1JBTkdFKGFkYXB0ZXIsCisJCQkJCQkgICAgICAgTkVUWEVOX1BDSVhfUEhfUkVHCisJCQkJCQkgICAgICAgKFBDSVhfU05fV0lORE9XKSkpOworCQkJLyogTVVTVCBtYWtlIHN1cmUgd2luZG93IGlzIHNldCBiZWZvcmUgd2UgZm9yZ2Ugb24uLi4gKi8KKwkJCXJlYWRsKFBDSV9PRkZTRVRfU0VDT05EX1JBTkdFKGFkYXB0ZXIsCisJCQkJCQkgICAgICBORVRYRU5fUENJWF9QSF9SRUcKKwkJCQkJCSAgICAgIChQQ0lYX1NOX1dJTkRPVykpKTsKKwkJfQorCQlhZGRyIC09ICh3aW5kb3cgKiAweDQwMDAwMCk7CisJCWFkZHIgKz0gTkVUWEVOX1BDSV9RRFJfTkVUOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHBlZyBnZGIgZnJlcXVlbnRseSBhY2Nlc3NlcyBtZW1vcnkgdGhhdCBkb2Vzbid0IGV4aXN0LAorCQkgKiB0aGlzIGxpbWl0cyB0aGUgY2hpdCBjaGF0IHNvIGRlYnVnZ2luZyBpc24ndCBzbG93ZWQgZG93bi4KKwkJICovCisJCWlmICgobmV0eGVuX3BjaV9zZXRfd2luZG93X3dhcm5pbmdfY291bnQrKyA8IDgpCisJCSAgICB8fCAobmV0eGVuX3BjaV9zZXRfd2luZG93X3dhcm5pbmdfY291bnQgJSA2NCA9PSAwKSkKKwkJCXByaW50aygiJXM6IFdhcm5pbmc6bmV0eGVuX25pY19wY2lfc2V0X3dpbmRvdygpIgorCQkJICAgICAgICIgVW5rbm93biBhZGRyZXNzIHJhbmdlIVxuIiwKKwkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKworCX0KKwlyZXR1cm4gYWRkcjsKK30KKworaW50IG5ldHhlbl9uaWNfZ2V0X2JvYXJkX2luZm8oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBydiA9IDA7CisJaW50IGFkZHIgPSBCUkRDRkdfU1RBUlQ7CisJc3RydWN0IG5ldHhlbl9ib2FyZF9pbmZvICpib2FyZGluZm87CisJaW50IGluZGV4OworCXUzMiAqcHRyMzI7CisKKwlib2FyZGluZm8gPSAmYWRhcHRlci0+YWh3LmJvYXJkY2ZnOworCXB0cjMyID0gKHUzMiAqKSBib2FyZGluZm87CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaXplb2Yoc3RydWN0IG5ldHhlbl9ib2FyZF9pbmZvKSAvIHNpemVvZih1MzIpOworCSAgICAgaW5kZXgrKykgeworCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgYWRkciwgcHRyMzIpID09IC0xKSB7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlwdHIzMisrOworCQlhZGRyICs9IHNpemVvZih1MzIpOworCX0KKwlpZiAoYm9hcmRpbmZvLT5tYWdpYyAhPSBORVRYRU5fQkRJTkZPX01BR0lDKSB7CisJCXByaW50aygiJXM6IEVSUk9SIHJlYWRpbmcgJXMgYm9hcmQgY29uZmlnLiIKKwkJICAgICAgICIgUmVhZCAleCwgZXhwZWN0ZWQgJXhcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQkgICAgICAgYm9hcmRpbmZvLT5tYWdpYywgTkVUWEVOX0JESU5GT19NQUdJQyk7CisJCXJ2ID0gLTE7CisJfQorCWlmIChib2FyZGluZm8tPmhlYWRlcl92ZXJzaW9uICE9IE5FVFhFTl9CRElORk9fVkVSU0lPTikgeworCQlwcmludGsoIiVzOiBVbmtub3duIGJvYXJkIGNvbmZpZyB2ZXJzaW9uLiIKKwkJICAgICAgICIgUmVhZCAleCwgZXhwZWN0ZWQgJXhcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCSAgICAgICBib2FyZGluZm8tPmhlYWRlcl92ZXJzaW9uLCBORVRYRU5fQkRJTkZPX1ZFUlNJT04pOworCQlydiA9IC0xOworCX0KKworCURQUklOVEsoSU5GTywgIkRpc2NvdmVyZWQgYm9hcmQgdHlwZToweCV4ICAiLCBib2FyZGluZm8tPmJvYXJkX3R5cGUpOworCXN3aXRjaCAoKG5ldHhlbl9icmR0eXBlX3QpIGJvYXJkaW5mby0+Ym9hcmRfdHlwZSkgeworCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzNV80RzoKKwkJYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPSBORVRYRU5fTklDX0dCRTsKKwkJYnJlYWs7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwRzoKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVo6CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19ITUVaOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfQ1g0OgorCQlhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9IE5FVFhFTl9OSUNfWEdCRTsKKwkJYnJlYWs7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMV9CRDoKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AxX1NCOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDFfU01BWDoKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AxX1NPQ0s6CisJCWFkYXB0ZXItPmFody5ib2FyZF90eXBlID0gTkVUWEVOX05JQ19HQkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiJXM6IFVua25vd24oJXgpXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQkgICAgICAgYm9hcmRpbmZvLT5ib2FyZF90eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJ2OworfQorCisvKiBOSVUgYWNjZXNzIHNlY3Rpb25zICovCisKK2ludCBuZXR4ZW5fbmljX3NldF9tdHVfZ2Ioc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwKKwkJCSAgICBORVRYRU5fTklVX0dCX01BWF9GUkFNRV9TSVpFKHBvcnQtPnBvcnRudW0pLAorCQkJICAgIG5ld19tdHUpOworCXJldHVybiAwOworfQorCitpbnQgbmV0eGVuX25pY19zZXRfbXR1X3hnYihzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJbmV3X210dSArPSBORVRYRU5fTklVX0hEUlNJWkUgKyBORVRYRU5fTklVX1RMUlNJWkU7CisJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9NQVhfRlJBTUVfU0laRSwgbmV3X210dSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmV0eGVuX25pY19pbml0X25pdV9nYihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHBvcnRubzsKKwlmb3IgKHBvcnRubyA9IDA7IHBvcnRubyA8IE5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUzsgcG9ydG5vKyspCisJCW5ldHhlbl9uaXVfZ2JlX2luaXRfcG9ydChhZGFwdGVyLCBwb3J0bm8pOworfQorCit2b2lkIG5ldHhlbl9uaWNfc3RvcF9hbGxfcG9ydHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBwb3J0X25yOworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKKworCWZvciAocG9ydF9uciA9IDA7IHBvcnRfbnIgPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBwb3J0X25yKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydF9ucl07CisJCWlmIChhZGFwdGVyLT5vcHMtPnN0b3BfcG9ydCkKKwkJCWFkYXB0ZXItPm9wcy0+c3RvcF9wb3J0KGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0pOworCX0KK30KKwordm9pZAorbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgbG9uZyBvZmYsCisJCQkgICAgaW50IGRhdGEpCit7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJaWYgKEFERFJfSU5fV0lORE9XMShvZmYpKSB7CisJCXdyaXRlbChkYXRhLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBvZmYpKTsKKwl9IGVsc2UgeworCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCQlhZGRyID0gcGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIG9mZik7CisJCXdyaXRlbChkYXRhLCBhZGRyKTsKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAxKTsKKwl9Cit9CisKK3ZvaWQgbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCV9fbGUzMiBzdGF0dXM7CisJdTE2IGF1dG9uZWc7CisJX19sZTMyIG1vZGU7CisKKwluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9NT0RFLCAmbW9kZSk7CisJaWYgKG5ldHhlbl9nZXRfbml1X2VuYWJsZV9nZShtb2RlKSkgewkvKiBHYiAxMC8xMDAvMTAwMCBNYnBzIG1vZGUgKi8KKwkJaWYgKGFkYXB0ZXItPm9wcy0+cGh5X3JlYWQKKwkJICAgICYmIGFkYXB0ZXItPm9wcy0+CisJCSAgICBwaHlfcmVhZChhZGFwdGVyLCBwb3J0LT5wb3J0bnVtLAorCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKKwkJCSAgICAgJnN0YXR1cykgPT0gMCkgeworCQkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgeworCQkJCXN3aXRjaCAobmV0eGVuX2dldF9waHlfc3BlZWQoc3RhdHVzKSkgeworCQkJCWNhc2UgMDoKKwkJCQkJcG9ydC0+bGlua19zcGVlZCA9IFNQRUVEXzEwOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXBvcnQtPmxpbmtfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJcG9ydC0+bGlua19zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXBvcnQtPmxpbmtfc3BlZWQgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXN3aXRjaCAobmV0eGVuX2dldF9waHlfZHVwbGV4KHN0YXR1cykpIHsKKwkJCQljYXNlIDA6CisJCQkJCXBvcnQtPmxpbmtfZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJcG9ydC0+bGlua19kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcG9ydC0+bGlua19kdXBsZXggPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChhZGFwdGVyLT5vcHMtPnBoeV9yZWFkCisJCQkJICAgICYmIGFkYXB0ZXItPm9wcy0+CisJCQkJICAgIHBoeV9yZWFkKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCQkJCSAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0FVVE9ORUcsCisJCQkJCSAgICAgKF9fbGUzMiAqKSAmIGF1dG9uZWcpICE9IDApCisJCQkJCXBvcnQtPmxpbmtfYXV0b25lZyA9IGF1dG9uZWc7CisJCQl9IGVsc2UKKwkJCQlnb3RvIGxpbmtfZG93bjsKKwkJfSBlbHNlIHsKKwkJICAgICAgbGlua19kb3duOgorCQkJcG9ydC0+bGlua19zcGVlZCA9IC0xOworCQkJcG9ydC0+bGlua19kdXBsZXggPSAtMTsKKwkJfQorCX0KK30KKwordm9pZCBuZXR4ZW5fbmljX2ZsYXNoX3ByaW50KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgdmFsaWQgPSAxOworCXUzMiBmd19tYWpvciA9IDA7CisJdTMyIGZ3X21pbm9yID0gMDsKKwl1MzIgZndfYnVpbGQgPSAwOworCWNoYXIgYnJkX25hbWVbTkVUWEVOX01BWF9TSE9SVF9OQU1FXTsKKwlzdHJ1Y3QgbmV0eGVuX25ld191c2VyX2luZm8gdXNlcl9pbmZvOworCWludCBpLCBhZGRyID0gVVNFUl9TVEFSVDsKKwl1MzIgKnB0cjMyOworCisJc3RydWN0IG5ldHhlbl9ib2FyZF9pbmZvICpib2FyZF9pbmZvID0gJihhZGFwdGVyLT5haHcuYm9hcmRjZmcpOworCWlmIChib2FyZF9pbmZvLT5tYWdpYyAhPSBORVRYRU5fQkRJTkZPX01BR0lDKSB7CisJCXByaW50aworCQkgICAgKCJOZXRYZW4gVW5rbm93biBib2FyZCBjb25maWcsIFJlYWQgMHgleCBleHBlY3RlZCBhcyAweCV4XG4iLAorCQkgICAgIGJvYXJkX2luZm8tPm1hZ2ljLCBORVRYRU5fQkRJTkZPX01BR0lDKTsKKwkJdmFsaWQgPSAwOworCX0KKwlpZiAoYm9hcmRfaW5mby0+aGVhZGVyX3ZlcnNpb24gIT0gTkVUWEVOX0JESU5GT19WRVJTSU9OKSB7CisJCXByaW50aygiTmV0WGVuIFVua25vd24gYm9hcmQgY29uZmlnIHZlcnNpb24uIgorCQkgICAgICAgIiBSZWFkICV4LCBleHBlY3RlZCAleFxuIiwKKwkJICAgICAgIGJvYXJkX2luZm8tPmhlYWRlcl92ZXJzaW9uLCBORVRYRU5fQkRJTkZPX1ZFUlNJT04pOworCQl2YWxpZCA9IDA7CisJfQorCWlmICh2YWxpZCkgeworCQlwdHIzMiA9ICh1MzIgKikgJiB1c2VyX2luZm87CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IHNpemVvZihzdHJ1Y3QgbmV0eGVuX25ld191c2VyX2luZm8pIC8gc2l6ZW9mKHUzMik7CisJCSAgICAgaSsrKSB7CisJCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgYWRkciwgcHRyMzIpID09IC0xKSB7CisJCQkJcHJpbnRrKCIlczogRVJST1IgcmVhZGluZyAlcyBib2FyZCB1c2VyYXJlYS5cbiIsCisJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXB0cjMyKys7CisJCQlhZGRyICs9IHNpemVvZih1MzIpOworCQl9CisJCWdldF9icmRfbmFtZV9ieV90eXBlKGJvYXJkX2luZm8tPmJvYXJkX3R5cGUsIGJyZF9uYW1lKTsKKworCQlwcmludGsoIk5ldFhlbiAlcyBCb2FyZCBTL04gJXMgIENoaXAgaWQgMHgleFxuIiwKKwkJICAgICAgIGJyZF9uYW1lLCB1c2VyX2luZm8uc2VyaWFsX251bSwgYm9hcmRfaW5mby0+Y2hpcF9pZCk7CisKKwkJcHJpbnRrKCJOZXRYZW4gJXMgQm9hcmQgIyVkLCBDaGlwIGlkIDB4JXhcbiIsCisJCSAgICAgICBib2FyZF9pbmZvLT5ib2FyZF90eXBlID09IDB4MGIgPyAiWEdCIiA6ICJHQkUiLAorCQkgICAgICAgYm9hcmRfaW5mby0+Ym9hcmRfbnVtLCBib2FyZF9pbmZvLT5jaGlwX2lkKTsKKwkJZndfbWFqb3IgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkJICAgICAgTkVUWEVOX0ZXX1ZFUlNJT05fTUFKT1IpKTsKKwkJZndfbWlub3IgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkJICAgICAgTkVUWEVOX0ZXX1ZFUlNJT05fTUlOT1IpKTsKKwkJZndfYnVpbGQgPQorCQkgICAgcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgTkVUWEVOX0ZXX1ZFUlNJT05fU1VCKSk7CisKKwkJcHJpbnRrKCJOZXRYZW4gRmlybXdhcmUgdmVyc2lvbiAlZC4lZC4lZFxuIiwgZndfbWFqb3IsIGZ3X21pbm9yLAorCQkgICAgICAgZndfYnVpbGQpOworCX0KKwlpZiAoZndfbWFqb3IgIT0gX05FVFhFTl9OSUNfTElOVVhfTUFKT1IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUaGUgbWlzbWF0Y2ggaW4gZHJpdmVyIHZlcnNpb24gYW5kIGZpcm13YXJlICIKKwkJICAgICAgICJ2ZXJzaW9uIG1ham9yIG51bWJlclxuIgorCQkgICAgICAgIkRyaXZlciB2ZXJzaW9uIG1ham9yIG51bWJlciA9ICVkIFx0IgorCQkgICAgICAgIkZpcm13YXJlIHZlcnNpb24gbWFqb3IgbnVtYmVyID0gJWQgXG4iLAorCQkgICAgICAgX05FVFhFTl9OSUNfTElOVVhfTUFKT1IsIGZ3X21ham9yKTsKKwkJYWRhcHRlci0+ZHJpdmVyX21pc21hdGNoID0gMTsKKwl9CisJaWYgKGZ3X21pbm9yICE9IF9ORVRYRU5fTklDX0xJTlVYX01JTk9SKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhlIG1pc21hdGNoIGluIGRyaXZlciB2ZXJzaW9uIGFuZCBmaXJtd2FyZSAiCisJCSAgICAgICAidmVyc2lvbiBtaW5vciBudW1iZXJcbiIKKwkJICAgICAgICJEcml2ZXIgdmVyc2lvbiBtaW5vciBudW1iZXIgPSAlZCBcdCIKKwkJICAgICAgICJGaXJtd2FyZSB2ZXJzaW9uIG1pbm9yIG51bWJlciA9ICVkIFxuIiwKKwkJICAgICAgIF9ORVRYRU5fTklDX0xJTlVYX01JTk9SLCBmd19taW5vcik7CisJCWFkYXB0ZXItPmRyaXZlcl9taXNtYXRjaCA9IDE7CisJfQorCWlmIChhZGFwdGVyLT5kcml2ZXJfbWlzbWF0Y2gpCisJCXByaW50ayhLRVJOX0lORk8gIlVzZSB0aGUgZHJpdmVyIHdpdGggdmVyc2lvbiBubyAlZC4lZC54eHhcbiIsCisJCSAgICAgICBmd19tYWpvciwgZndfbWlub3IpOworfQorCitpbnQgbmV0eGVuX2NyYl9yZWFkX3ZhbChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWludCBkYXRhOworCW5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBvZmYsICZkYXRhLCA0KTsKKwlyZXR1cm4gZGF0YTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWE2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5oCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiBOZXRYZW4sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqIAorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICogCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogICAgaW5mb0BuZXR4ZW4uY29tCisgKiBOZXRYZW4sCisgKiAzOTY1IEZyZWVkb20gQ2lyY2xlLCBGb3VydGggZmxvb3IsCisgKiBTYW50YSBDbGFyYSwgQ0EgOTUwNTQKKyAqCisgKgorICogU3RydWN0dXJlcywgZW51bXMsIGFuZCBtYWNyb3MgZm9yIHRoZSBNQUMKKyAqCisgKi8KKworI2lmbmRlZiBfX05FVFhFTl9OSUNfSFdfSF8KKyNkZWZpbmUgX19ORVRYRU5fTklDX0hXX0hfCisKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2hkci5oIgorCisvKiBIYXJkd2FyZSBtZW1vcnkgc2l6ZSBvZiAxMjggbWVnICovCisjZGVmaW5lIE5FVFhFTl9NRU1BRERSX01BWCAoMTI4ICogMTAyNCAqIDEwMjQpCisKKyNpZm5kZWYgcmVhZHEKK3N0YXRpYyBpbmxpbmUgdTY0IHJlYWRxKHZvaWQgX19pb21lbSAqIGFkZHIpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIpIHwgKCgodTY0KSByZWFkbChhZGRyICsgNCkpIDw8IDMyTEwpOworfQorI2VuZGlmCisKKyNpZm5kZWYgd3JpdGVxCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVxKHU2NCB2YWwsIHZvaWQgX19pb21lbSAqIGFkZHIpCit7CisJd3JpdGVsKCgodTMyKSAodmFsKSksIChhZGRyKSk7CisJd3JpdGVsKCgodTMyKSAodmFsID4+IDMyKSksIChhZGRyICsgNCkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR4ZW5fbmljX2h3X2Jsb2NrX3dyaXRlNjQodTY0IF9faW9tZW0gKiBkYXRhX3B0ciwKKwkJCQkJICAgICAgIHU2NCBfX2lvbWVtICogYWRkciwKKwkJCQkJICAgICAgIGludCBudW1fd29yZHMpCit7CisJaW50IG51bTsKKwlmb3IgKG51bSA9IDA7IG51bSA8IG51bV93b3JkczsgbnVtKyspIHsKKwkJd3JpdGVxKHJlYWRxKCh2b2lkIF9faW9tZW0gKilkYXRhX3B0ciksIGFkZHIpOworCQlhZGRyKys7CisJCWRhdGFfcHRyKys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0eGVuX25pY19od19ibG9ja19yZWFkNjQodTY0IF9faW9tZW0gKiBkYXRhX3B0ciwKKwkJCQkJICAgICAgdTY0IF9faW9tZW0gKiBhZGRyLCBpbnQgbnVtX3dvcmRzKQoreworCWludCBudW07CisJZm9yIChudW0gPSAwOyBudW0gPCBudW1fd29yZHM7IG51bSsrKSB7CisJCXdyaXRlcShyZWFkcSgodm9pZCBfX2lvbWVtICopYWRkciksIGRhdGFfcHRyKTsKKwkJYWRkcisrOworCQlkYXRhX3B0cisrOworCX0KKworfQorCitzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXI7CisKKyNkZWZpbmUgTkVUWEVOX1BDSV9NQVBTSVpFX0JZVEVTICAoTkVUWEVOX1BDSV9NQVBTSVpFIDw8IDIwKQorCisjZGVmaW5lIE5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKFgsIFkpCVwKKwlhZGRyID0gcGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIChYKSk7CVwKKwkqKHUzMiAqKVkgPSByZWFkbChhZGRyKTsKKworc3RydWN0IG5ldHhlbl9wb3J0Owordm9pZCBuZXR4ZW5fbmljX3NldF9saW5rX3BhcmFtZXRlcnMoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0KTsKK3ZvaWQgbmV0eGVuX25pY19mbGFzaF9wcmludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLAorCQkJICAgdm9pZCAqZGF0YSwgaW50IGxlbik7Cit2b2lkIG5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2ZmLCBpbnQgZGF0YSk7CitpbnQgbmV0eGVuX25pY19od19yZWFkX3d4KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwKKwkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbik7CisKK3R5cGVkZWYgdTggbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdFs2XTsKKworLyogTmliYmxlIG9yIEJ5dGUgbW9kZSBmb3IgcGh5IGludGVyZmFjZSAoR2JFIG1vZGUgb25seSkgKi8KK3R5cGVkZWYgZW51bSB7CisJTkVUWEVOX05JVV8xMF8xMDBfTUIgPSAwLAorCU5FVFhFTl9OSVVfMTAwMF9NQgorfSBuZXR4ZW5fbml1X2diZV9pZm1vZGVfdDsKKworI2RlZmluZSBfbmV0eGVuX2NyYl9nZXRfYml0KHZhciwgYml0KSAgKCh2YXIgPj4gYml0KSAmIDB4MSkKKworLyoKKyAqIE5JVSBHQiBNQUMgQ29uZmlnIFJlZ2lzdGVyIDAgKGFwcGxpZXMgdG8gR0IwLCBHQjEsIEdCMiwgR0IzKQorICoKKyAqCUJpdCAwIDogZW5hYmxlX3R4ID0+IDE6ZW5hYmxlIGZyYW1lIHhtaXQsIDA6ZGlzYWJsZQorICoJQml0IDEgOiB0eF9zeW5jZWQgPT4gUi9POiB4bWl0IGVuYWJsZSBzeW5jaGVkIHRvIHhtaXQgc3RyZWFtCisgKglCaXQgMiA6IGVuYWJsZV9yeCA9PiAxOmVuYWJsZSBmcmFtZSByZWN2LCAwOmRpc2FibGUKKyAqCUJpdCAzIDogcnhfc3luY2VkID0+IFIvTzogcmVjdiBlbmFibGUgc3luY2hlZCB0byByZWN2IHN0cmVhbQorICoJQml0IDQgOiB0eF9mbG93Y3RsID0+IDE6ZW5hYmxlIHBhdXNlIGZyYW1lIGdlbmVyYXRpb24sIDA6ZGlzYWJsZQorICoJQml0IDUgOiByeF9mbG93Y3RsID0+IDE6YWN0IG9uIHJlY3YnZCBwYXVzZSBmcmFtZXMsIDA6aWdub3JlCisgKglCaXQgOCA6IGxvb3BiYWNrID0+IDE6bG9vcCBNQUMgeG1pdHMgdG8gTUFDIHJlY3ZzLCAwOm5vcm1hbAorICoJQml0IDE2OiB0eF9yZXNldF9wYiA9PiAxOnJlc2V0IGZyYW1lIHhtaXQgcHJvdG9jb2wgYmxrLCAwOm5vLW9wCisgKglCaXQgMTc6IHJ4X3Jlc2V0X3BiID0+IDE6cmVzZXQgZnJhbWUgcmVjdiBwcm90b2NvbCBibGssIDA6bm8tb3AKKyAqCUJpdCAxODogdHhfcmVzZXRfbWFjID0+IDE6cmVzZXQgZGF0YS9jdGwgbXVsdGlwbGV4ZXIgYmxrLCAwOm5vLW9wCisgKglCaXQgMTk6IHJ4X3Jlc2V0X21hYyA9PiAxOnJlc2V0IGN0bCBmcmFtZXMgJiB0aW1lcnMgYmxrLCAwOm5vLW9wCisgKglCaXQgMzE6IHNvZnRfcmVzZXQgPT4gMTpyZXNldCB0aGUgTUFDIGFuZCB0aGUgU0VSREVTLCAwOm5vLW9wCisgKi8KKworI2RlZmluZSBuZXR4ZW5fZ2JfZW5hYmxlX3R4KGNvbmZpZ193b3JkKQlcCisJc2V0X2JpdCgwLCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisjZGVmaW5lIG5ldHhlbl9nYl9lbmFibGVfcngoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDIsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3R4X2Zsb3djdGwoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDQsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3J4X2Zsb3djdGwoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDUsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3R4X3Jlc2V0X3BiKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMTYsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3J4X3Jlc2V0X3BiKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMTcsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3R4X3Jlc2V0X21hYyhjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDE4LCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisjZGVmaW5lIG5ldHhlbl9nYl9yeF9yZXNldF9tYWMoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxOSwgKHVuc2lnbmVkIGxvbmcqKSgmY29uZmlnX3dvcmQpKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc29mdF9yZXNldChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDMxLCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisKKyNkZWZpbmUgbmV0eGVuX2diX3Vuc2V0X3R4X2Zsb3djdGwoY29uZmlnX3dvcmQpCVwKKwkJY2xlYXJfYml0KDQsICh1bnNpZ25lZCBsb25nICopKCZjb25maWdfd29yZCkpCisjZGVmaW5lIG5ldHhlbl9nYl91bnNldF9yeF9mbG93Y3RsKGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCg1LCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisKKyNkZWZpbmUgbmV0eGVuX2diX2dldF90eF9zeW5jZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdCgoY29uZmlnX3dvcmQpLCAxKQorI2RlZmluZSBuZXR4ZW5fZ2JfZ2V0X3J4X3N5bmNlZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDMpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfdHhfZmxvd2N0bChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDQpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfcnhfZmxvd2N0bChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDUpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfc29mdF9yZXNldChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDMxKQorCisvKgorICogTklVIEdCIE1BQyBDb25maWcgUmVnaXN0ZXIgMSAoYXBwbGllcyB0byBHQjAsIEdCMSwgR0IyLCBHQjMpCisgKgorICoJQml0IDAJICAgIDogZHVwbGV4ID0+IDE6ZnVsbCBkdXBsZXggbW9kZSwgMDpoYWxmIGR1cGxleAorICoJQml0IDEJICAgIDogY3JjX2VuYWJsZSA9PiAxOmFwcGVuZCBDUkMgdG8geG1pdCBmcmFtZXMsIDA6ZG9udCBhcHBlbmQKKyAqCUJpdCAyCSAgICA6IHBhZHNob3J0ID0+IDE6cGFkIHNob3J0IGZyYW1lcyBhbmQgYWRkIENSQywgMDpkb250IHBhZAorICoJQml0IDQJICAgIDogY2hlY2tsZW5ndGggPT4gMTpjaGVjayBmcmFtZWxlbiB3aXRoIGFjdHVhbCwwOmRvbnQgY2hlY2sKKyAqCUJpdCA1CSAgICA6IGh1Z2VmcmFtZXMgPT4gMTphbGxvdyBvdmVyc2l6ZSB4bWl0IGZyYW1lcywgMDpkb250IGFsbG93CisgKglCaXRzIDgtOSAgICA6IGludGZtb2RlID0+IDAxOm5pYmJsZSAoMTAvMTAwKSwgMTA6Ynl0ZSAoMTAwMCkKKyAqCUJpdHMgMTItMTUgIDogcHJlYW1ibGVsZW4gPT4gcHJlYW1ibGUgZmllbGQgbGVuZ3RoIGluIGJ5dGVzLCBkZWZhdWx0IDcKKyAqLworCisjZGVmaW5lIG5ldHhlbl9nYl9zZXRfZHVwbGV4KGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9jcmNfZW5hYmxlKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9wYWRzaG9ydChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDIsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9nYl9zZXRfY2hlY2tsZW5ndGgoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCg0LCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X2h1Z2VmcmFtZXMoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCg1LCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X3ByZWFtYmxlbGVuKGNvbmZpZ193b3JkLCB2YWwpCVwKKwkJKChjb25maWdfd29yZCkgfD0gKCh2YWwpIDw8IDEyKSAmIDB4RjAwMCkKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9pbnRmbW9kZShjb25maWdfd29yZCwgdmFsKQkJXAorCQkoKGNvbmZpZ193b3JkKSB8PSAoKHZhbCkgPDwgOCkgJiAweDMwMCkKKworI2RlZmluZSBuZXR4ZW5fZ2JfZ2V0X3N0YXRpb25hZGRyZXNzX2xvdyhjb25maWdfd29yZCkgKChjb25maWdfd29yZCkgPj4gMTYpCisKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9taWlfbWdtdF9jbG9ja3NlbGVjdChjb25maWdfd29yZCwgdmFsKQlcCisJCSgoY29uZmlnX3dvcmQpIHw9ICgodmFsKSAmIDB4MDcpKQorI2RlZmluZSBuZXR4ZW5fZ2JfbWlpX21nbXRfcmVzZXQoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgzMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX21paV9tZ210X3Vuc2V0KGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCgzMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKworLyoKKyAqIE5JVSBHQiBNSUkgTWdtdCBDb21tYW5kIFJlZ2lzdGVyIChhcHBsaWVzIHRvIEdCMCwgR0IxLCBHQjIsIEdCMykKKyAqIEJpdCAwIDogcmVhZF9jeWNsZSA9PiAxOnBlcmZvcm0gc2luZ2xlIHJlYWQgY3ljbGUsIDA6bm8tb3AKKyAqIEJpdCAxIDogc2Nhbl9jeWNsZSA9PiAxOnBlcmZvcm0gY29udGludW91cyByZWFkIGN5Y2xlcywgMDpuby1vcAorICovCisKKyNkZWZpbmUgbmV0eGVuX2diX21paV9tZ210X3NldF9yZWFkX2N5Y2xlKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX21paV9tZ210X3JlZ19hZGRyKGNvbmZpZ193b3JkLCB2YWwpCVwKKwkJKChjb25maWdfd29yZCkgfD0gKCh2YWwpICYgMHgxRikpCisjZGVmaW5lIG5ldHhlbl9nYl9taWlfbWdtdF9waHlfYWRkcihjb25maWdfd29yZCwgdmFsKQlcCisJCSgoY29uZmlnX3dvcmQpIHw9ICgoKHZhbCkgJiAweDFGKSA8PCA4KSkKKworLyoKKyAqIE5JVSBHQiBNSUkgTWdtdCBJbmRpY2F0b3JzIFJlZ2lzdGVyIChhcHBsaWVzIHRvIEdCMCwgR0IxLCBHQjIsIEdCMykKKyAqIFJlYWQtb25seSByZWdpc3Rlci4KKyAqIEJpdCAwIDogYnVzeSA9PiAxOnBlcmZvcm1pbmcgYW4gTUlJIG1nbXQgY3ljbGUsIDA6aWRsZQorICogQml0IDEgOiBzY2FubmluZyA9PiAxOnNjYW4gb3BlcmF0aW9uIGluIHByb2dyZXNzLCAwOmlkbGUKKyAqIEJpdCAyIDogbm90dmFsaWQgPT4gOm1nbXQgcmVzdWx0IGRhdGEgbm90IHlldCB2YWxpZCwgMDppZGxlCisgKi8KKyNkZWZpbmUgbmV0eGVuX2dldF9nYl9taWlfbWdtdF9idXN5KGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDApCisjZGVmaW5lIG5ldHhlbl9nZXRfZ2JfbWlpX21nbXRfc2Nhbm5pbmcoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMSkKKyNkZWZpbmUgbmV0eGVuX2dldF9nYl9taWlfbWdtdF9ub3R2YWxpZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAyKQorCisvKgorICogUEhZLVNwZWNpZmljIE1JSSBjb250cm9sL3N0YXR1cyByZWdpc3RlcnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0NPTlRST0wgPSAwLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9TVEFUVVMgPSAxLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfSURfMCA9IDIsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9JRF8xID0gMywKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfQVVUT05FRyA9IDQsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0xOS1BBUlQgPSA1LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9BVVRPTkVHX01PUkUgPSA2LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9ORVhUUEFHRV9YTUlUID0gNywKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfTE5LUEFSVF9ORVhUUEFHRSA9IDgsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSXzEwMDBCVF9DT05UUk9MID0gOSwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfMTAwMEJUX1NUQVRVUyA9IDEwLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9FWFRFTkRFRF9TVEFUVVMgPSAxNSwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX0NPTlRST0wgPSAxNiwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUyA9IDE3LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9JTlRfRU5BQkxFID0gMTgsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9TVEFUVVMgPSAxOSwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX0NPTlRST0xfTU9SRSA9IDIwLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9SRUNWX0VSUk9SX0NPVU5UID0gMjEsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0xFRF9DT05UUk9MID0gMjQsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0xFRF9PVkVSUklERSA9IDI1LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfQ09OVFJPTF9NT1JFX1lFVCA9IDI2LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTX01PUkUgPSAyNworfSBuZXR4ZW5fbml1X3BoeV9yZWdpc3Rlcl90OworCisvKgorICogUEhZLVNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAocmVnIDE3KS4KKyAqCisgKiBCaXQgMCAgICAgIDogamFiYmVyID0+IDE6amFiYmVyIGRldGVjdGVkLCAwOm5vdAorICogQml0IDEgICAgICA6IHBvbGFyaXR5ID0+IDE6cG9sYXJpdHkgcmV2ZXJzZWQsIDA6bm9ybWFsCisgKiBCaXQgMiAgICAgIDogcmVjdnBhdXNlID0+IDE6cmVjZWl2ZSBwYXVzZSBlbmFibGVkLCAwOmRpc2FibGVkCisgKiBCaXQgMyAgICAgIDogeG1pdHBhdXNlID0+IDE6dHJhbnNtaXQgcGF1c2UgZW5hYmxlZCwgMDpkaXNhYmxlZAorICogQml0IDQgICAgICA6IGVuZXJneWRldGVjdCA9PiAxOnNsZWVwLCAwOmFjdGl2ZQorICogQml0IDUgICAgICA6IGRvd25zaGlmdCA9PiAxOmRvd25zaGlmdCwgMDpubyBkb3duc2hpZnQKKyAqIEJpdCA2ICAgICAgOiBjcm9zc292ZXIgPT4gMTpNRElYIChjcm9zc292ZXIpLCAwOk1ESSAobm8gY3Jvc3NvdmVyKQorICogQml0cyA3LTkgICA6IGNhYmxlbGVuID0+IG5vdCB2YWxpZCBpbiAxME1iL3MgbW9kZQorICoJCQkwOjw1MG0sIDE6NTAtODBtLCAyOjgwLTExMG0sIDM6MTEwLTE0MG0sIDQ6PjE0MG0KKyAqIEJpdCAxMCAgICAgOiBsaW5rID0+IDE6bGluayB1cCwgMDpsaW5rIGRvd24KKyAqIEJpdCAxMSAgICAgOiByZXNvbHZlZCA9PiAxOnNwZWVkIGFuZCBkdXBsZXggcmVzb2x2ZWQsIDA6bm90IHlldAorICogQml0IDEyICAgICA6IHBhZ2VyY3ZkID0+IDE6cGFnZSByZWNlaXZlZCwgMDpwYWdlIG5vdCByZWNlaXZlZAorICogQml0IDEzICAgICA6IGR1cGxleCA9PiAxOmZ1bGwgZHVwbGV4LCAwOmhhbGYgZHVwbGV4CisgKiBCaXRzIDE0LTE1IDogc3BlZWQgPT4gMDoxME1iL3MsIDE6MTAwTWIvcywgMjoxMDAwTWIvcywgMzpyc3ZkCisgKi8KKworI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9jYWJsZWxlbihjb25maWdfd29yZCkgKCgoY29uZmlnX3dvcmQpID4+IDcpICYgMHgwNykKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfc3BlZWQoY29uZmlnX3dvcmQpICgoKGNvbmZpZ193b3JkKSA+PiAxNCkgJiAweDAzKQorCisjZGVmaW5lIG5ldHhlbl9zZXRfcGh5X3NwZWVkKGNvbmZpZ193b3JkLCB2YWwpCVwKKwkJKChjb25maWdfd29yZCkgfD0gKCh2YWwgJiAweDAzKSA8PCAxNCkpCisjZGVmaW5lIG5ldHhlbl9zZXRfcGh5X2R1cGxleChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDEzLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fY2xlYXJfcGh5X2R1cGxleChjb25maWdfd29yZCkJXAorCQljbGVhcl9iaXQoMTMsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfamFiYmVyKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDApCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X3BvbGFyaXR5KGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X3JlY3ZwYXVzZShjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAyKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV94bWl0cGF1c2UoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMykKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfZW5lcmd5ZGV0ZWN0KGNvbmZpZ193b3JkKSBcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDQpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2Rvd25zaGlmdChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA1KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9jcm9zc292ZXIoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgNikKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfbGluayhjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAxMCkKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfcmVzb2x2ZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTEpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X3BhZ2VyY3ZkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEyKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9kdXBsZXgoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTMpCisKKy8qCisgKiBJbnRlcnJ1cHQgUmVnaXN0ZXIgZGVmaW5pdGlvbgorICogVGhpcyBkZWZpbml0aW9uIGFwcGxpZXMgdG8gcmVnaXN0ZXJzIDE4IGFuZCAxOSAoaW50IGVuYWJsZSBhbmQgaW50IHN0YXR1cykuCisgKiBCaXQgMCA6IGphYmJlcgorICogQml0IDEgOiBwb2xhcml0eV9jaGFuZ2VkCisgKiBCaXQgNCA6IGVuZXJneV9kZXRlY3QKKyAqIEJpdCA1IDogZG93bnNoaWZ0CisgKiBCaXQgNiA6IG1kaV94b3Zlcl9jaGFuZ2VkCisgKiBCaXQgNyA6IGZpZm9fb3Zlcl91bmRlcmZsb3cKKyAqIEJpdCA4IDogZmFsc2VfY2FycmllcgorICogQml0IDkgOiBzeW1ib2xfZXJyb3IKKyAqIEJpdCAxMDogbGlua19zdGF0dXNfY2hhbmdlZAorICogQml0IDExOiBhdXRvbmVnX2NvbXBsZXRlZAorICogQml0IDEyOiBwYWdlX3JlY2VpdmVkCisgKiBCaXQgMTM6IGR1cGxleF9jaGFuZ2VkCisgKiBCaXQgMTQ6IHNwZWVkX2NoYW5nZWQKKyAqIEJpdCAxNTogYXV0b25lZ19lcnJvcgorICovCisKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfaW50X2phYmJlcihjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAwKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfcG9sYXJpdHlfY2hhbmdlZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAxKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZW5lcmd5X2RldGVjdChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA0KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZG93bnNoaWZ0KGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDUpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9tZGlfeG92ZXJfY2hhbmdlZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA2KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZmlmb19vdmVyX3VuZGVyZmxvdyhjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA3KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZmFsc2VfY2Fycmllcihjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA4KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfc3ltYm9sX2Vycm9yKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDkpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEwKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfYXV0b25lZ19jb21wbGV0ZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTEpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9wYWdlX3JlY2VpdmVkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEyKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZHVwbGV4X2NoYW5nZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTMpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9zcGVlZF9jaGFuZ2VkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDE0KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfYXV0b25lZ19lcnJvcihjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAxNSkKKworI2RlZmluZSBuZXR4ZW5fc2V0X3BoeV9pbnRfbGlua19zdGF0dXNfY2hhbmdlZChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDEwLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fc2V0X3BoeV9pbnRfYXV0b25lZ19jb21wbGV0ZWQoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX3NldF9waHlfaW50X3NwZWVkX2NoYW5nZWQoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxNCwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKworLyoKKyAqIE5JVSBNb2RlIFJlZ2lzdGVyLgorICogQml0IDAgOiBlbmFibGUgRmlicmVDaGFubmVsCisgKiBCaXQgMSA6IGVuYWJsZSAxMC8xMDAvMTAwMCBFdGhlcm5ldAorICogQml0IDIgOiBlbmFibGUgMTBHYiBFdGhlcm5ldAorICovCisKKyNkZWZpbmUgbmV0eGVuX2dldF9uaXVfZW5hYmxlX2dlKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEpCisKKy8qIFByb21pc2NvdXMgbW9kZSBvcHRpb25zIChHYkUgbW9kZSBvbmx5KSAqLwordHlwZWRlZiBlbnVtIHsKKwlORVRYRU5fTklVX1BST01JU0NfTU9ERSA9IDAsCisJTkVUWEVOX05JVV9OT05fUFJPTUlTQ19NT0RFCit9IG5ldHhlbl9uaXVfcHJvbV9tb2RlX3Q7CisKKy8qCisgKiBOSVUgR0IgRHJvcCBDUkMgUmVnaXN0ZXIKKyAqIAorICogQml0IDAgOiBkcm9wX2diMCA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICogQml0IDEgOiBkcm9wX2diMSA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICogQml0IDIgOiBkcm9wX2diMiA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICogQml0IDMgOiBkcm9wX2diMyA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICovCisKKyNkZWZpbmUgbmV0eGVuX3NldF9nYl9kcm9wX2diMChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDAsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9zZXRfZ2JfZHJvcF9nYjEoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fc2V0X2diX2Ryb3BfZ2IyKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMiwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX3NldF9nYl9kcm9wX2diMyhjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDMsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisKKyNkZWZpbmUgbmV0eGVuX2NsZWFyX2diX2Ryb3BfZ2IwKGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCgwLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fY2xlYXJfZ2JfZHJvcF9nYjEoY29uZmlnX3dvcmQpCVwKKwkJY2xlYXJfYml0KDEsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9jbGVhcl9nYl9kcm9wX2diMihjb25maWdfd29yZCkJXAorCQljbGVhcl9iaXQoMiwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2NsZWFyX2diX2Ryb3BfZ2IzKGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCgzLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorCisvKgorICogTklVIFhHIE1BQyBDb25maWcgUmVnaXN0ZXIKKyAqCisgKiBCaXQgMCA6IHR4X2VuYWJsZSA9PiAxOmVuYWJsZSBmcmFtZSB4bWl0LCAwOmRpc2FibGUKKyAqIEJpdCAyIDogcnhfZW5hYmxlID0+IDE6ZW5hYmxlIGZyYW1lIHJlY3YsIDA6ZGlzYWJsZQorICogQml0IDQgOiBzb2Z0X3Jlc2V0ID0+IDE6cmVzZXQgdGhlIE1BQyAsIDA6bm8tb3AKKyAqIEJpdCAyNzogeGF1aV9mcmFtZXJfcmVzZXQKKyAqIEJpdCAyODogeGF1aV9yeF9yZXNldAorICogQml0IDI5OiB4YXVpX3R4X3Jlc2V0CisgKiBCaXQgMzA6IHhnX2luZ3Jlc3NfYWZpZm9fcmVzZXQKKyAqIEJpdCAzMTogeGdfZWdyZXNzX2FmaWZvX3Jlc2V0CisgKi8KKworI2RlZmluZSBuZXR4ZW5feGdfc29mdF9yZXNldChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDQsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisKKy8qCisgKiBNQUMgQ29udHJvbCBSZWdpc3RlcgorICogCisgKiBCaXQgMC0xICAgOiBpZF9wb29sMAorICogQml0IDIgICAgIDogZW5hYmxlX3h0bmQwCisgKiBCaXQgNC01ICAgOiBpZF9wb29sMQorICogQml0IDYgICAgIDogZW5hYmxlX3h0bmQxCisgKiBCaXQgOC05ICAgOiBpZF9wb29sMgorICogQml0IDEwICAgIDogZW5hYmxlX3h0bmQyCisgKiBCaXQgMTItMTMgOiBpZF9wb29sMworICogQml0IDE0ICAgIDogZW5hYmxlX3h0bmQzCisgKiBCaXQgMjQtMjUgOiBtb2RlX3NlbGVjdAorICogQml0IDI4LTMxIDogZW5hYmxlX3Bvb2wKKyAqLworCisjZGVmaW5lIG5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMChjb25maWcsIHZhbCkJXAorCQkoKGNvbmZpZykgfD0gKCh2YWwpICYweDAzKSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2VuYWJsZV94dG5kMChjb25maWcpCVwKKwkJKHNldF9iaXQoMywgKHVuc2lnbmVkIGxvbmcgKikmKGNvbmZpZykpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDEoY29uZmlnLCB2YWwpCVwKKwkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDAzKSA8PCA0KSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2VuYWJsZV94dG5kMShjb25maWcpCVwKKwkJKHNldF9iaXQoNiwgKHVuc2lnbmVkIGxvbmcgKikmKGNvbmZpZykpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDIoY29uZmlnLCB2YWwpCVwKKwkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDAzKSA8PCA4KSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2VuYWJsZV94dG5kMihjb25maWcpCVwKKwkJKHNldF9iaXQoMTAsICh1bnNpZ25lZCBsb25nICopJihjb25maWcpKSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wzKGNvbmZpZywgdmFsKQlcCisJCSgoY29uZmlnKSB8PSAoKCh2YWwpICYgMHgwMykgPDwgMTIpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQzKGNvbmZpZykJXAorCQkoc2V0X2JpdCgxNCwgKHVuc2lnbmVkIGxvbmcgKikmKGNvbmZpZykpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfbW9kZV9zZWxlY3QoY29uZmlnLCB2YWwpCVwKKwkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDAzKSA8PCAyNCkpCisjZGVmaW5lIG5ldHhlbl9uaWNfbWNyX3NldF9lbmFibGVfcG9vbChjb25maWcsIHZhbCkJXAorCQkoKGNvbmZpZykgfD0gKCgodmFsKSAmIDB4MGYpIDw8IDI4KSkKKworLyogU2V0IHByb21pc2N1b3VzIG1vZGUgZm9yIGEgR2JFIGludGVyZmFjZSAqLworaW50IG5ldHhlbl9uaXVfc2V0X3Byb21pc2N1b3VzX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKKwkJCQkgICAgbmV0eGVuX25pdV9wcm9tX21vZGVfdCBtb2RlKTsKK2ludCBuZXR4ZW5fbml1X3hnX3NldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgICAgaW50IHBvcnQsIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QgbW9kZSk7CisKKy8qIGdldC9zZXQgdGhlIE1BQyBhZGRyZXNzIGZvciBhIGdpdmVuIE1BQyAqLworaW50IG5ldHhlbl9uaXVfbWFjYWRkcl9nZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKKwkJCSAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKTsKK2ludCBuZXR4ZW5fbml1X21hY2FkZHJfc2V0KHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwKKwkJCSAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgYWRkcik7CisKKy8qIFhHIHZlcnNvbnMgKi8KK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQsCisJCQkgICAgICBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90ICogYWRkcik7CitpbnQgbmV0eGVuX25pdV94Z19tYWNhZGRyX3NldChzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsCisJCQkgICAgICBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90IGFkZHIpOworCisvKiBHZW5lcmljIGVuYWJsZSBmb3IgR2JFIHBvcnRzLiBXaWxsIGRldGVjdCB0aGUgc3BlZWQgb2YgdGhlIGxpbmsuICovCitpbnQgbmV0eGVuX25pdV9nYmVfaW5pdF9wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpOworCitpbnQgbmV0eGVuX25pdV94Z19pbml0X3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCk7CisKKy8qIERpc2FibGUgYSBHYkUgaW50ZXJmYWNlICovCitpbnQgbmV0eGVuX25pdV9kaXNhYmxlX2diZV9wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpOworCitpbnQgbmV0eGVuX25pdV9kaXNhYmxlX3hnX3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCk7CisKKyNlbmRpZgkJCQkvKiBfX05FVFhFTl9OSUNfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNhMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCkBAIC0wLDAgKzEsMTMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKiAKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqIAorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqIFNvdXJjZSBmaWxlIGZvciBOSUMgcm91dGluZXMgdG8gaW5pdGlhbGl6ZSB0aGUgUGhhbnRvbSBIYXJkd2FyZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJuZXR4ZW5fbmljLmgiCisjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfaW9jdGwuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX3BoYW5fcmVnLmgiCisKK3N0cnVjdCBjcmJfYWRkcl9wYWlyIHsKKwlsb25nIGFkZHI7CisJbG9uZyBkYXRhOworfTsKKworI2RlZmluZSBORVRYRU5fTUFYX0NSQl9YRk9STSA2MAorc3RhdGljIHVuc2lnbmVkIGludCBjcmJfYWRkcl94Zm9ybVtORVRYRU5fTUFYX0NSQl9YRk9STV07CisjZGVmaW5lIE5FVFhFTl9BRERSX0VSUk9SICgodW5zaWduZWQgbG9uZyApIDB4ZmZmZmZmZmYgKQorCisjZGVmaW5lIGNyYl9hZGRyX3RyYW5zZm9ybShuYW1lKSBcCisJY3JiX2FkZHJfeGZvcm1bTkVUWEVOX0hXX1BYX01BUF9DUkJfIyNuYW1lXSA9IFwKKwlORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSXyMjbmFtZSA8PCAyMAorCisjZGVmaW5lIE5FVFhFTl9OSUNfWERNQV9SRVNFVCAweDgwMDBmZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK25ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBvZmYsIGludCAqZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwl3cml0ZWwoKmRhdGEsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBjcmJfYWRkcl90cmFuc2Zvcm1fc2V0dXAodm9pZCkKK3sKKwljcmJfYWRkcl90cmFuc2Zvcm0oWERNQSk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFRJTVIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUkUpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUU4zKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU1FOMik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFNRTjEpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUU4wKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU1FTMyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFNRUzIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUVMxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU1FTMCk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg3KTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUlBNWDYpOworCWNyYl9hZGRyX3RyYW5zZm9ybShSUE1YNSk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg0KTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUlBNWDMpOworCWNyYl9hZGRyX3RyYW5zZm9ybShSUE1YMik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVgxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUlBNWDApOworCWNyYl9hZGRyX3RyYW5zZm9ybShST01VU0IpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTTik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFFNTik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFFNUyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHTkkpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR05EKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdOMyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHTjIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR04xKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdOMCk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHU0kpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR1NEKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdTMyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHUzIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR1MxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdTMCk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBTKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEgpOworCWNyYl9hZGRyX3RyYW5zZm9ybShOSVUpOworCWNyYl9hZGRyX3RyYW5zZm9ybShJMlEpOworCWNyYl9hZGRyX3RyYW5zZm9ybShFRyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKE1OKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oTVMpOworCWNyYl9hZGRyX3RyYW5zZm9ybShDQVMyKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oQ0FTMSk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKENBUzApOworCWNyYl9hZGRyX3RyYW5zZm9ybShDQU0pOworCWNyYl9hZGRyX3RyYW5zZm9ybShDMkMxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oQzJDMCk7Cit9CisKK2ludCBuZXR4ZW5faW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHN0YXRlID0gMCwgbG9vcHMgPSAwLCBlcnIgPSAwOworCisJLyogV2luZG93IDEgY2FsbCAqLworCXN0YXRlID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOworCisJaWYgKHN0YXRlID09IFBIQU5fSU5JVElBTElaRV9BQ0spCisJCXJldHVybiAwOworCisJd2hpbGUgKHN0YXRlICE9IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSAmJiBsb29wcyA8IDIwMDApIHsKKwkJdWRlbGF5KDEwMCk7CisJCS8qIFdpbmRvdyAxIGNhbGwgKi8KKwkJc3RhdGUgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSk7CisKKwkJbG9vcHMrKzsKKwl9CisJaWYgKGxvb3BzID49IDIwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDbWQgUGVnIGluaXRpYWxpemF0aW9uIG5vdCBjb21wbGV0ZToleC5cbiIsCisJCSAgICAgICBzdGF0ZSk7CisJCWVyciA9IC1FSU87CisJCXJldHVybiBlcnI7CisJfQorCS8qIFdpbmRvdyAxIGNhbGwgKi8KKwl3cml0ZWwoUEhBTl9JTklUSUFMSVpFX0FDSywKKwkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOworCisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBORVRYRU5fQUREUl9MSU1JVCAweGZmZmZmZmZmVUxMCisKK3ZvaWQgKm5ldHhlbl9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHN6LCBkbWFfYWRkcl90ICogcHRyLAorCQkgICBzdHJ1Y3QgcGNpX2RldiAqKnVzZWRfZGV2KQoreworCXZvaWQgKmFkZHI7CisKKwlhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc3osIHB0cik7CisJaWYgKCh1bnNpZ25lZCBsb25nIGxvbmcpKCpwdHIpIDwgTkVUWEVOX0FERFJfTElNSVQpIHsKKwkJKnVzZWRfZGV2ID0gcGRldjsKKwkJcmV0dXJuIGFkZHI7CisJfQorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc3osIGFkZHIsICpwdHIpOworCWFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChOVUxMLCBzeiwgcHRyKTsKKwkqdXNlZF9kZXYgPSBOVUxMOworCXJldHVybiBhZGRyOworfQorCit2b2lkIG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfc3coc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBjdHhpZCwgcmluZzsKKwl1MzIgaTsKKwl1MzIgbnVtX3J4X2J1ZnMgPSAwOworCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4ICpyY3ZfZGVzYzsKKworCURQUklOVEsoSU5GTywgImluaXRpYWxpemluZyBzb21lIHF1ZXVlczogJXBcbiIsIGFkYXB0ZXIpOworCWZvciAoY3R4aWQgPSAwOyBjdHhpZCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eGlkKSB7CisJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykgeworCQkJc3RydWN0IG5ldHhlbl9yeF9idWZmZXIgKnJ4X2J1ZjsKKwkJCXJjdl9kZXNjID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2N0eGlkXS5yY3ZfZGVzY1tyaW5nXTsKKwkJCXJjdl9kZXNjLT5yY3ZfZnJlZSA9IHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudDsKKwkJCXJjdl9kZXNjLT5iZWdpbl9hbGxvYyA9IDA7CisJCQlyeF9idWYgPSByY3ZfZGVzYy0+cnhfYnVmX2FycjsKKwkJCW51bV9yeF9idWZzID0gcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50OworCQkJLyoKKwkJCSAqIE5vdyBnbyB0aHJvdWdoIGFsbCBvZiB0aGVtLCBzZXQgcmVmZXJlbmNlIGhhbmRsZXMKKwkJCSAqIGFuZCBwdXQgdGhlbSBpbiB0aGUgcXVldWVzLgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3J4X2J1ZnM7IGkrKykgeworCQkJCXJ4X2J1Zi0+cmVmX2hhbmRsZSA9IGk7CisJCQkJcnhfYnVmLT5zdGF0ZSA9IE5FVFhFTl9CVUZGRVJfRlJFRTsKKworCQkJCURQUklOVEsoSU5GTywgIlJ4IGJ1ZjpjdHglZCBpKCVkKSByeF9idWY6IgorCQkJCQkiJXBcbiIsIGN0eGlkLCBpLCByeF9idWYpOworCQkJCXJ4X2J1ZisrOworCQkJfQorCQl9CisJfQorCURQUklOVEsoSU5GTywgImluaXRpYWxpemVkIGJ1ZmZlcnMgZm9yICVzIGFuZCAlc1xuIiwKKwkJImFkYXB0ZXItPmZyZWVfY21kX2J1Zl9saXN0IiwgImFkYXB0ZXItPmZyZWVfcnhidWYiKTsKK30KKwordm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX2h3KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcG9ydHMgPSAwOworCXN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICYoYWRhcHRlci0+YWh3LmJvYXJkY2ZnKTsKKworCWlmIChuZXR4ZW5fbmljX2dldF9ib2FyZF9pbmZvKGFkYXB0ZXIpICE9IDApCisJCXByaW50aygiJXM6IEVycm9yIGdldHRpbmcgYm9hcmQgY29uZmlnIGluZm8uXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJZ2V0X2JyZF9wb3J0X2J5X3R5cGUoYm9hcmRfaW5mby0+Ym9hcmRfdHlwZSwgJnBvcnRzKTsKKwlpZiAocG9ydHMgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5rbm93biBib2FyZCB0eXBlXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJYWRhcHRlci0+YWh3Lm1heF9wb3J0cyA9IHBvcnRzOworfQorCit2b2lkIG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb3BzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0eGVuX2Rydm9wcyAqb3BzID0gYWRhcHRlci0+b3BzOworCXN3aXRjaCAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUpIHsKKwljYXNlIE5FVFhFTl9OSUNfR0JFOgorCQlvcHMtPmVuYWJsZV9waHlfaW50ZXJydXB0cyA9CisJCSAgICBuZXR4ZW5fbml1X2diZV9lbmFibGVfcGh5X2ludGVycnVwdHM7CisJCW9wcy0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyA9CisJCSAgICBuZXR4ZW5fbml1X2diZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzOworCQlvcHMtPmhhbmRsZV9waHlfaW50ciA9IG5ldHhlbl9uaWNfZ2JlX2hhbmRsZV9waHlfaW50cjsKKwkJb3BzLT5tYWNhZGRyX3NldCA9IG5ldHhlbl9uaXVfbWFjYWRkcl9zZXQ7CisJCW9wcy0+c2V0X210dSA9IG5ldHhlbl9uaWNfc2V0X210dV9nYjsKKwkJb3BzLT5zZXRfcHJvbWlzYyA9IG5ldHhlbl9uaXVfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJCW9wcy0+dW5zZXRfcHJvbWlzYyA9IG5ldHhlbl9uaXVfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJCW9wcy0+cGh5X3JlYWQgPSBuZXR4ZW5fbml1X2diZV9waHlfcmVhZDsKKwkJb3BzLT5waHlfd3JpdGUgPSBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGU7CisJCW9wcy0+aW5pdF9wb3J0ID0gbmV0eGVuX25pdV9nYmVfaW5pdF9wb3J0OworCQlvcHMtPmluaXRfbml1ID0gbmV0eGVuX25pY19pbml0X25pdV9nYjsKKwkJb3BzLT5zdG9wX3BvcnQgPSBuZXR4ZW5fbml1X2Rpc2FibGVfZ2JlX3BvcnQ7CisJCWJyZWFrOworCisJY2FzZSBORVRYRU5fTklDX1hHQkU6CisJCW9wcy0+ZW5hYmxlX3BoeV9pbnRlcnJ1cHRzID0KKwkJICAgIG5ldHhlbl9uaXVfeGdiZV9lbmFibGVfcGh5X2ludGVycnVwdHM7CisJCW9wcy0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyA9CisJCSAgICBuZXR4ZW5fbml1X3hnYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0czsKKwkJb3BzLT5oYW5kbGVfcGh5X2ludHIgPSBuZXR4ZW5fbmljX3hnYmVfaGFuZGxlX3BoeV9pbnRyOworCQlvcHMtPm1hY2FkZHJfc2V0ID0gbmV0eGVuX25pdV94Z19tYWNhZGRyX3NldDsKKwkJb3BzLT5zZXRfbXR1ID0gbmV0eGVuX25pY19zZXRfbXR1X3hnYjsKKwkJb3BzLT5pbml0X3BvcnQgPSBuZXR4ZW5fbml1X3hnX2luaXRfcG9ydDsKKwkJb3BzLT5zZXRfcHJvbWlzYyA9IG5ldHhlbl9uaXVfeGdfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJCW9wcy0+dW5zZXRfcHJvbWlzYyA9IG5ldHhlbl9uaXVfeGdfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJCW9wcy0+c3RvcF9wb3J0ID0gbmV0eGVuX25pdV9kaXNhYmxlX3hnX3BvcnQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogbmV0eGVuX2RlY29kZV9jcmJfYWRkcigwIC0gdXRpbGl0eSB0byB0cmFuc2xhdGUgZnJvbSBpbnRlcm5hbCBQaGFudG9tIENSQgorICogYWRkcmVzcyB0byBleHRlcm5hbCBQQ0kgQ1JCIGFkZHJlc3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbmV0eGVuX2RlY29kZV9jcmJfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIG9mZnNldCwgcGNpX2Jhc2U7CisKKwljcmJfYWRkcl90cmFuc2Zvcm1fc2V0dXAoKTsKKworCXBjaV9iYXNlID0gTkVUWEVOX0FERFJfRVJST1I7CisJYmFzZV9hZGRyID0gYWRkciAmIDB4ZmZmMDAwMDA7CisJb2Zmc2V0ID0gYWRkciAmIDB4MDAwZmZmZmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkVUWEVOX01BWF9DUkJfWEZPUk07IGkrKykgeworCQlpZiAoY3JiX2FkZHJfeGZvcm1baV0gPT0gYmFzZV9hZGRyKSB7CisJCQlwY2lfYmFzZSA9IGkgPDwgMjA7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocGNpX2Jhc2UgPT0gTkVUWEVOX0FERFJfRVJST1IpCisJCXJldHVybiBwY2lfYmFzZTsKKwllbHNlCisJCXJldHVybiAocGNpX2Jhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgbG9uZyByb21fbWF4X3RpbWVvdXQgPSAxMDAwMDsKK3N0YXRpYyBsb25nIHJvbV9sb2NrX3RpbWVvdXQgPSAxMDAwMDAwOworCitzdGF0aWMgaW5saW5lIGludCByb21fbG9jayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGl0ZXI7CisJdTMyIGRvbmUgPSAwOworCWludCB0aW1lb3V0ID0gMDsKKworCXdoaWxlICghZG9uZSkgeworCQkvKiBhY3F1aXJlIHNlbWFwaG9yZTIgZnJvbSBQQ0kgSFcgYmxvY2sgKi8KKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9QQ0lFX1JFRyhQQ0lFX1NFTTJfTE9DSyksCisJCQkJICAgJmRvbmUpOworCQlpZiAoZG9uZSA9PSAxKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ID49IHJvbV9sb2NrX3RpbWVvdXQpCisJCQlyZXR1cm4gLUVJTzsKKworCQl0aW1lb3V0Kys7CisJCS8qCisJCSAqIFlpZWxkIENQVQorCQkgKi8KKwkJaWYgKCFpbl9hdG9taWMoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpdGVyID0gMDsgaXRlciA8IDIwOyBpdGVyKyspCisJCQkJY3B1X3JlbGF4KCk7CS8qVGhpcyBhIG5vcCBpbnN0ciBvbiBpMzg2ICovCisJCX0KKwl9CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTV9MT0NLX0lELCBST01fTE9DS19EUklWRVIpOworCXJldHVybiAwOworfQorCitpbnQgbmV0eGVuX3dhaXRfcm9tX2RvbmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWxvbmcgdGltZW91dCA9IDA7CisJbG9uZyBkb25lID0gMDsKKworCXdoaWxlIChkb25lID09IDApIHsKKwkJZG9uZSA9IG5ldHhlbl9uaWNfcmVnX3JlYWQoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9HTEJfU1RBVFVTKTsKKwkJZG9uZSAmPSAyOworCQl0aW1lb3V0Kys7CisJCWlmICh0aW1lb3V0ID49IHJvbV9tYXhfdGltZW91dCkgeworCQkJcHJpbnRrKCJUaW1lb3V0IHJlYWNoZWQgIHdhaXRpbmcgZm9yIHJvbSBkb25lIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0eGVuX3JvbV93cmVuKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBTZXQgd3JpdGUgZW5hYmxlIGxhdGNoIGluIFJPTSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDApOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwKKwkJCSAgICAgTTI1UF9JTlNUUl9XUkVOKTsKKwlpZiAobmV0eGVuX3dhaXRfcm9tX2RvbmUoYWRhcHRlcikpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbmV0eGVuX3JkY3JicmVnKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgdW5zaWduZWQgaW50IGFkZHIpCit7CisJdW5zaWduZWQgaW50IGRhdGEgPSAweGRlYWRkZWFkOworCWRhdGEgPSBuZXR4ZW5fbmljX3JlZ19yZWFkKGFkYXB0ZXIsIGFkZHIpOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXR4ZW5fZG9fcm9tX3Jkc3Ioc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwKKwkJCSAgICAgTTI1UF9JTlNUUl9SRFNSKTsKKwlpZiAobmV0eGVuX3dhaXRfcm9tX2RvbmUoYWRhcHRlcikpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gbmV0eGVuX3JkY3JicmVnKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX1JEQVRBKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHhlbl9yb21fdW5sb2NrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsOworCisJLyogcmVsZWFzZSBzZW1hcGhvcmUyICovCisJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9QQ0lFX1JFRyhQQ0lFX1NFTTJfVU5MT0NLKSwgJnZhbCk7CisKK30KKworaW50IG5ldHhlbl9yb21fd2lwX3BvbGwoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWxvbmcgdGltZW91dCA9IDA7CisJbG9uZyB3aXAgPSAxOworCWludCB2YWw7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAwKTsKKwl3aGlsZSAod2lwICE9IDApIHsKKwkJdmFsID0gbmV0eGVuX2RvX3JvbV9yZHNyKGFkYXB0ZXIpOworCQl3aXAgPSB2YWwgJiAxOworCQl0aW1lb3V0Kys7CisJCWlmICh0aW1lb3V0ID4gcm9tX21heF90aW1lb3V0KSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvX3JvbV9mYXN0X3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgaW50IGFkZHIsIGludCBkYXRhKQoreworCWlmIChuZXR4ZW5fcm9tX3dyZW4oYWRhcHRlcikpIHsKKwkJcmV0dXJuIC0xOworCX0KKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9XREFUQSwgZGF0YSk7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUREUkVTUywgYWRkcik7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAzKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsCisJCQkgICAgIE0yNVBfSU5TVFJfUFApOworCWlmIChuZXR4ZW5fd2FpdF9yb21fZG9uZShhZGFwdGVyKSkgeworCQluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDApOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIG5ldHhlbl9yb21fd2lwX3BvbGwoYWRhcHRlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb19yb21fZmFzdF9yZWFkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCAqdmFscCkKK3sKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BRERSRVNTLCBhZGRyKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDMpOworCXVkZWxheSgxMDApOwkJLyogcHJldmVudCBidXJzdGluZyBvbiBDUkIgKi8KKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9EVU1NWV9CWVRFX0NOVCwgMCk7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCAweGIpOworCWlmIChuZXR4ZW5fd2FpdF9yb21fZG9uZShhZGFwdGVyKSkgeworCQlwcmludGsoIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIHJlc2V0IGFieXRlX2NudCBhbmQgZHVtbXlfYnl0ZV9jbnQgKi8KKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDApOworCXVkZWxheSgxMDApOwkJLyogcHJldmVudCBidXJzdGluZyBvbiBDUkIgKi8KKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9EVU1NWV9CWVRFX0NOVCwgMCk7CisKKwkqdmFscCA9IG5ldHhlbl9uaWNfcmVnX3JlYWQoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fUkRBVEEpOworCXJldHVybiAwOworfQorCitpbnQgbmV0eGVuX3JvbV9mYXN0X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50ICp2YWxwKQoreworCWludCByZXQ7CisKKwlpZiAocm9tX2xvY2soYWRhcHRlcikgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBkb19yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGFkZHIsIHZhbHApOworCW5ldHhlbl9yb21fdW5sb2NrKGFkYXB0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBuZXR4ZW5fcm9tX2Zhc3Rfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocm9tX2xvY2soYWRhcHRlcikgIT0gMCkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldCA9IGRvX3JvbV9mYXN0X3dyaXRlKGFkYXB0ZXIsIGFkZHIsIGRhdGEpOworCW5ldHhlbl9yb21fdW5sb2NrKGFkYXB0ZXIpOworCXJldHVybiByZXQ7Cit9CitpbnQgbmV0eGVuX2RvX3JvbV9zZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyKQoreworCW5ldHhlbl9yb21fd3JlbihhZGFwdGVyKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BRERSRVNTLCBhZGRyKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDMpOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwKKwkJCSAgICAgTTI1UF9JTlNUUl9TRSk7CisJaWYgKG5ldHhlbl93YWl0X3JvbV9kb25lKGFkYXB0ZXIpKSB7CisJCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIG5ldHhlbl9yb21fd2lwX3BvbGwoYWRhcHRlcik7Cit9CisKK2ludCBuZXR4ZW5fcm9tX3NlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpCit7CisJaW50IHJldCA9IDA7CisJaWYgKHJvbV9sb2NrKGFkYXB0ZXIpICE9IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXQgPSBuZXR4ZW5fZG9fcm9tX3NlKGFkYXB0ZXIsIGFkZHIpOworCW5ldHhlbl9yb21fdW5sb2NrKGFkYXB0ZXIpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgTkVUWEVOX0JPQVJEVFlQRQkJMHg0MDA4CisjZGVmaW5lIE5FVFhFTl9CT0FSRE5VTSAJCTB4NDAwYworI2RlZmluZSBORVRYRU5fQ0hJUE5VTQkJCTB4NDAxMAorI2RlZmluZSBORVRYRU5fUk9NQlVTX1JFU0VUCQkweEZGRkZGRkZGCisjZGVmaW5lIE5FVFhFTl9ST01fRklSU1RfQkFSUklFUgkweDgwMDAwMDAwMFVMTAorI2RlZmluZSBORVRYRU5fUk9NX0ZPVU5EX0lOSVQJCTB4NDAwCisKK2ludCBuZXR4ZW5fcGluaXRfZnJvbV9yb20oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlpbnQgYWRkciwgdmFsLCBzdGF0dXM7CisJaW50IG4sIGk7CisJaW50IGluaXRfZGVsYXkgPSAwOworCXN0cnVjdCBjcmJfYWRkcl9wYWlyICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmY7CisKKwkvKiByZXNldGFsbCAqLworCXN0YXR1cyA9IG5ldHhlbl9uaWNfZ2V0X2JvYXJkX2luZm8oYWRhcHRlcik7CisJaWYgKHN0YXR1cykKKwkJcHJpbnRrKCIlczogbmV0eGVuX3Bpbml0X2Zyb21fcm9tOiBFcnJvciBnZXR0aW5nIGJvYXJkIGluZm9cbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fUk9NVVNCX0dMQl9TV19SRVNFVCwKKwkJCQkgICAgTkVUWEVOX1JPTUJVU19SRVNFVCk7CisKKwlpZiAodmVyYm9zZSkgeworCQlpbnQgdmFsOworCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgTkVUWEVOX0JPQVJEVFlQRSwgJnZhbCkgPT0gMCkKKwkJCXByaW50aygiUDIgUk9NIGJvYXJkIHR5cGU6IDB4JTA4eFxuIiwgdmFsKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJDb3VsZCBub3QgcmVhZCBib2FyZCB0eXBlXG4iKTsKKwkJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIE5FVFhFTl9CT0FSRE5VTSwgJnZhbCkgPT0gMCkKKwkJCXByaW50aygiUDIgUk9NIGJvYXJkICBudW06IDB4JTA4eFxuIiwgdmFsKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJDb3VsZCBub3QgcmVhZCBib2FyZCBudW1iZXJcbiIpOworCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgTkVUWEVOX0NISVBOVU0sICZ2YWwpID09IDApCisJCQlwcmludGsoIlAyIFJPTSBjaGlwICAgbnVtOiAweCUwOHhcbiIsIHZhbCk7CisJCWVsc2UKKwkJCXByaW50aygiQ291bGQgbm90IHJlYWQgY2hpcCBudW1iZXJcbiIpOworCX0KKworCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCAwLCAmbikgPT0gMAorCSAgICAmJiAobiAmIE5FVFhFTl9ST01fRklSU1RfQkFSUklFUikpIHsKKwkJbiAmPSB+TkVUWEVOX1JPTV9ST1VORFVQOworCQlpZiAobiA8IE5FVFhFTl9ST01fRk9VTkRfSU5JVCkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRrKCIlczogJWQgQ1JCIGluaXQgdmFsdWVzIGZvdW5kIgorCQkJCSAgICAgICAiIGluIFJPTS5cbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG4pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlczpuPTB4JXggRXJyb3IhIE5ldFhlbiBjYXJkIGZsYXNoIG5vdCIKKwkJCSAgICAgICAiIGluaXRpYWxpemVkLlxuIiwgX19GVU5DVElPTl9fLCBuKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJ1ZiA9IGtjYWxsb2Mobiwgc2l6ZW9mKHN0cnVjdCBjcmJfYWRkcl9wYWlyKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIlczogbmV0eGVuX3Bpbml0X2Zyb21fcm9tOiBVbmFibGUgdG8gY2FsbG9jICIKKwkJCSAgICAgICAibWVtb3J5LlxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgOCAqIGkgKyA0LCAmdmFsKSAhPSAwCisJCQkgICAgfHwgbmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgOCAqIGkgKyA4LAorCQkJCQkJICAgICZhZGRyKSAhPSAwKQorCQkJCXJldHVybiAtRUlPOworCisJCQlidWZbaV0uYWRkciA9IGFkZHI7CisJCQlidWZbaV0uZGF0YSA9IHZhbDsKKworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRrKCIlczogUENJOiAgICAgMHglMDh4ID09IDB4JTA4eFxuIiwKKwkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgKHVuc2lnbmVkIGludCkKKwkJCQkgICAgICAgbmV0eGVuX2RlY29kZV9jcmJfYWRkcigodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgICAgICBhZGRyKSwgdmFsKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisKKwkJCW9mZiA9CisJCQkgICAgbmV0eGVuX2RlY29kZV9jcmJfYWRkcigodW5zaWduZWQgbG9uZylidWZbaV0uYWRkcikgKworCQkJICAgIE5FVFhFTl9QQ0lfQ1JCU1BBQ0U7CisJCQkvKiBza2lwcGluZyBjb2xkIHJlYm9vdCBNQUdJQyAqLworCQkJaWYgKG9mZiA9PSBORVRYRU5fQ0FNX1JBTSgweDFmYykpCisJCQkJY29udGludWU7CisKKwkJCS8qIEFmdGVyIHdyaXRpbmcgdGhpcyByZWdpc3RlciwgSFcgbmVlZHMgdGltZSBmb3IgQ1JCICovCisJCQkvKiB0byBxdWlldCBkb3duIChlbHNlIGNyYl93aW5kb3cgcmV0dXJucyAweGZmZmZmZmZmKSAqLworCQkJaWYgKG9mZiA9PSBORVRYRU5fUk9NVVNCX0dMQl9TV19SRVNFVCkgeworCQkJCWluaXRfZGVsYXkgPSAxOworCQkJCS8qIGhvbGQgeGRtYSBpbiByZXNldCBhbHNvICovCisJCQkJYnVmW2ldLmRhdGEgPSBORVRYRU5fTklDX1hETUFfUkVTRVQ7CisJCQl9CisKKwkJCWlmIChBRERSX0lOX1dJTkRPVzEob2ZmKSkgeworCQkJCXdyaXRlbChidWZbaV0uZGF0YSwKKwkJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKSk7CisJCQl9IGVsc2UgeworCQkJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMCk7CisJCQkJd3JpdGVsKGJ1ZltpXS5kYXRhLAorCQkJCSAgICAgICBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKSk7CisKKwkJCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworCQkJfQorCQkJaWYgKGluaXRfZGVsYXkgPT0gMSkgeworCQkJCXNzbGVlcCgxKTsKKwkJCQlpbml0X2RlbGF5ID0gMDsKKwkJCX0KKwkJCW1zbGVlcCgxKTsKKwkJfQorCQlrZnJlZShidWYpOworCisJCS8qIGRpc2FibGVfcGVnX2NhY2hlX2FsbCAqLworCisJCS8qIHVucmVzZXRfbmV0X2NhY2hlICovCisJCW5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fUk9NVVNCX0dMQl9TV19SRVNFVCwgJnZhbCwKKwkJCQkgICAgICA0KTsKKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX1NXX1JFU0VULAorCQkJCQkgICAgKHZhbCAmIDB4ZmZmZmZmMGYpKTsKKwkJLyogcDJkbiByZXBseUNvdW50ICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX0NSQl9QRUdfTkVUX0QgKyAweGVjLCAweDFlKTsKKwkJLyogZGlzYWJsZV9wZWdfY2FjaGUgMCAqLworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9DUkJfUEVHX05FVF9EICsgMHg0YywgOCk7CisJCS8qIGRpc2FibGVfcGVnX2NhY2hlIDEgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fQ1JCX1BFR19ORVRfSSArIDB4NGMsIDgpOworCisJCS8qIHBlZ19jbHJfYWxsICovCisKKwkJLyogcGVnX2NsciAwICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMCArIDB4OCwKKwkJCQkJICAgIDApOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX0NSQl9QRUdfTkVUXzAgKyAweGMsCisJCQkJCSAgICAwKTsKKwkJLyogcGVnX2NsciAxICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMSArIDB4OCwKKwkJCQkJICAgIDApOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX0NSQl9QRUdfTkVUXzEgKyAweGMsCisJCQkJCSAgICAwKTsKKwkJLyogcGVnX2NsciAyICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMiArIDB4OCwKKwkJCQkJICAgIDApOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX0NSQl9QRUdfTkVUXzIgKyAweGMsCisJCQkJCSAgICAwKTsKKwkJLyogcGVnX2NsciAzICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMyArIDB4OCwKKwkJCQkJICAgIDApOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX0NSQl9QRUdfTkVUXzMgKyAweGMsCisJCQkJCSAgICAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmV0eGVuX3BoYW50b21faW5pdChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwZWd0dW5lX3ZhbCkKK3sKKwl1MzIgdmFsID0gMDsKKwlpbnQgbG9vcHMgPSAwOworCisJaWYgKCFwZWd0dW5lX3ZhbCkgeworCQl3aGlsZSAodmFsICE9IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSAmJiBsb29wcyA8IDIwMDAwMCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlzY2hlZHVsZSgpOworCQkJdmFsID0KKwkJCSAgICByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJCSAgKGFkYXB0ZXIsIENSQl9DTURQRUdfU1RBVEUpKTsKKwkJCWxvb3BzKys7CisJCX0KKwkJaWYgKHZhbCAhPSBQSEFOX0lOSVRJQUxJWkVfQ09NUExFVEUpCisJCQlwcmludGsoIldBUk5JTkc6IEluaXRpYWwgYm9vdCB3YWl0IGxvb3AgZmFpbGVkLi4uXG4iKTsKKwl9Cit9CisKK2ludCBuZXR4ZW5fbmljX3J4X2hhc193b3JrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgY3R4OworCisJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKKwkJc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgKnJlY3ZfY3R4ID0KKwkJICAgICYoYWRhcHRlci0+cmVjdl9jdHhbY3R4XSk7CisJCXUzMiBjb25zdW1lcjsKKwkJc3RydWN0IHN0YXR1c19kZXNjICpkZXNjX2hlYWQ7CisJCXN0cnVjdCBzdGF0dXNfZGVzYyAqZGVzYzsKKworCQljb25zdW1lciA9IHJlY3ZfY3R4LT5zdGF0dXNfcnhfY29uc3VtZXI7CisJCWRlc2NfaGVhZCA9IHJlY3ZfY3R4LT5yY3Zfc3RhdHVzX2Rlc2NfaGVhZDsKKwkJZGVzYyA9ICZkZXNjX2hlYWRbY29uc3VtZXJdOworCisJCWlmICgoKGxlMTZfdG9fY3B1KGRlc2MtPm93bmVyKSkgJiBTVEFUVVNfT1dORVJfSE9TVCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0eGVuX25pY19jaGVja190ZW1wKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcG9ydF9udW07CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJdWludDMyX3QgdGVtcCwgdGVtcF9zdGF0ZSwgdGVtcF92YWw7CisJaW50IHJ2ID0gMDsKKworCXRlbXAgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfVEVNUF9TVEFURSkpOworCisJdGVtcF9zdGF0ZSA9IG54X2dldF90ZW1wX3N0YXRlKHRlbXApOworCXRlbXBfdmFsID0gbnhfZ2V0X3RlbXBfdmFsKHRlbXApOworCisJaWYgKHRlbXBfc3RhdGUgPT0gTlhfVEVNUF9QQU5JQykgeworCQlwcmludGsoS0VSTl9BTEVSVAorCQkgICAgICAgIiVzOiBEZXZpY2UgdGVtcGVyYXR1cmUgJWQgZGVncmVlcyBDIGV4Y2VlZHMiCisJCSAgICAgICAiIG1heGltdW0gYWxsb3dlZC4gSGFyZHdhcmUgaGFzIGJlZW4gc2h1dCBkb3duLlxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHRlbXBfdmFsKTsKKwkJZm9yIChwb3J0X251bSA9IDA7IHBvcnRfbnVtIDwgYWRhcHRlci0+YWh3Lm1heF9wb3J0czsKKwkJICAgICBwb3J0X251bSsrKSB7CisJCQlwb3J0ID0gYWRhcHRlci0+cG9ydFtwb3J0X251bV07CisJCQluZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCX0KKwkJcnYgPSAxOworCX0gZWxzZSBpZiAodGVtcF9zdGF0ZSA9PSBOWF9URU1QX1dBUk4pIHsKKwkJaWYgKGFkYXB0ZXItPnRlbXAgPT0gTlhfVEVNUF9OT1JNQUwpIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUCisJCQkgICAgICAgIiVzOiBEZXZpY2UgdGVtcGVyYXR1cmUgJWQgZGVncmVlcyBDICIKKwkJCSAgICAgICAiZXhjZWVkcyBvcGVyYXRpbmcgcmFuZ2UuIgorCQkJICAgICAgICIgSW1tZWRpYXRlIGFjdGlvbiBuZWVkZWQuXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHRlbXBfdmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhZGFwdGVyLT50ZW1wID09IE5YX1RFTVBfV0FSTikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlczogRGV2aWNlIHRlbXBlcmF0dXJlIGlzIG5vdyAlZCBkZWdyZWVzIEMiCisJCQkgICAgICAgIiBpbiBub3JtYWwgcmFuZ2UuXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQkJICAgICAgIHRlbXBfdmFsKTsKKwkJfQorCX0KKwlhZGFwdGVyLT50ZW1wID0gdGVtcF9zdGF0ZTsKKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQgbmV0eGVuX3dhdGNoZG9nX3Rhc2sodW5zaWduZWQgbG9uZyB2KQoreworCWludCBwb3J0X251bTsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICopdjsKKworCWlmIChuZXR4ZW5fbmljX2NoZWNrX3RlbXAoYWRhcHRlcikpCisJCXJldHVybjsKKworCWZvciAocG9ydF9udW0gPSAwOyBwb3J0X251bSA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IHBvcnRfbnVtKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydF9udW1dOworCQluZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisKKwkJaWYgKChuZXRpZl9ydW5uaW5nKG5ldGRldikpICYmICFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIHBvcnQgJWQsICVzIGNhcnJpZXIgaXMgbm93IG9rXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnRfbnVtLCBuZXRkZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQl9CisKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwl9CisKKwlpZiAoYWRhcHRlci0+b3BzLT5oYW5kbGVfcGh5X2ludHIpCisJCWFkYXB0ZXItPm9wcy0+aGFuZGxlX3BoeV9pbnRyKGFkYXB0ZXIpOworCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAyICogSFopOworfQorCisvKgorICogbmV0eGVuX3Byb2Nlc3NfcmN2KCkgc2VuZCB0aGUgcmVjZWl2ZWQgcGFja2V0IHRvIHRoZSBwcm90b2NvbCBzdGFjay4KKyAqIGFuZCBpZiB0aGUgbnVtYmVyIG9mIHJlY2VpdmVzIGV4Y2VlZHMgUlhfQlVGRkVSU19SRUZJTEwsIHRoZW4gd2UKKyAqIGludm9rZSB0aGUgcm91dGluZSB0byBzZW5kIG1vcmUgcnggYnVmZmVycyB0byB0aGUgUGhhbnRvbS4uLgorICovCit2b2lkCituZXR4ZW5fcHJvY2Vzc19yY3Yoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgY3R4aWQsCisJCSAgIHN0cnVjdCBzdGF0dXNfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBhZGFwdGVyLT5wb3J0W1NUQVRVU19ERVNDX1BPUlQoZGVzYyldOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcG9ydC0+cGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG9ydC0+bmV0ZGV2OworCWludCBpbmRleCA9IGxlMTZfdG9fY3B1KGRlc2MtPnJlZmVyZW5jZV9oYW5kbGUpOworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9ICYoYWRhcHRlci0+cmVjdl9jdHhbY3R4aWRdKTsKKwlzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGxlbmd0aCA9IGxlMTZfdG9fY3B1KGRlc2MtPnRvdGFsX2xlbmd0aCk7CisJdTMyIGRlc2NfY3R4OworCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4ICpyY3ZfZGVzYzsKKwlpbnQgcmV0OworCisJZGVzY19jdHggPSBTVEFUVVNfREVTQ19UWVBFKGRlc2MpOworCWlmICh1bmxpa2VseShkZXNjX2N0eCA+PSBOVU1fUkNWX0RFU0NfUklOR1MpKSB7CisJCXByaW50aygiJXM6ICVzIEJhZCBSY3YgZGVzY3JpcHRvciByaW5nXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXJjdl9kZXNjID0gJnJlY3ZfY3R4LT5yY3ZfZGVzY1tkZXNjX2N0eF07CisJYnVmZmVyID0gJnJjdl9kZXNjLT5yeF9idWZfYXJyW2luZGV4XTsKKworCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVmZmVyLT5kbWEsIHJjdl9kZXNjLT5kbWFfc2l6ZSwKKwkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJc2tiID0gKHN0cnVjdCBza19idWZmICopYnVmZmVyLT5za2I7CisKKwlpZiAobGlrZWx5KFNUQVRVU19ERVNDX1NUQVRVUyhkZXNjKSA9PSBTVEFUVVNfQ0tTVU1fT0spKSB7CisJCXBvcnQtPnN0YXRzLmNzdW1tZWQrKzsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9IGVsc2UKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCXNrYi0+ZGV2ID0gbmV0ZGV2OworCXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisKKwlyZXQgPSBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJLyoKKwkgKiBSSDogRG8gd2UgbmVlZCB0aGVzZSBzdGF0cyBvbiBhIHJlZ3VsYXIgYmFzaXMuIENhbiB3ZSBnZXQgaXQgZnJvbQorCSAqIExpbnV4IHN0YXRzLgorCSAqLworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBORVRfUlhfU1VDQ0VTUzoKKwkJcG9ydC0+c3RhdHMudXBoYXBweSsrOworCQlicmVhazsKKworCWNhc2UgTkVUX1JYX0NOX0xPVzoKKwkJcG9ydC0+c3RhdHMudXBsY29uZysrOworCQlicmVhazsKKworCWNhc2UgTkVUX1JYX0NOX01PRDoKKwkJcG9ydC0+c3RhdHMudXBtY29uZysrOworCQlicmVhazsKKworCWNhc2UgTkVUX1JYX0NOX0hJR0g6CisJCXBvcnQtPnN0YXRzLnVwaGNvbmcrKzsKKwkJYnJlYWs7CisKKwljYXNlIE5FVF9SWF9EUk9QOgorCQlwb3J0LT5zdGF0cy51cGRyb3BwZWQrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwb3J0LT5zdGF0cy51cGR1bm5vKys7CisJCWJyZWFrOworCX0KKworCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwlyY3ZfZGVzYy0+cmN2X2ZyZWUrKzsKKwlyY3ZfZGVzYy0+cmN2X3BlbmRpbmctLTsKKworCS8qCisJICogV2UganVzdCBjb25zdW1lZCBvbmUgYnVmZmVyIHNvIHBvc3QgYSBidWZmZXIuCisJICovCisJYWRhcHRlci0+c3RhdHMucG9zdF9jYWxsZWQrKzsKKwlidWZmZXItPnNrYiA9IE5VTEw7CisJYnVmZmVyLT5zdGF0ZSA9IE5FVFhFTl9CVUZGRVJfRlJFRTsKKworCXBvcnQtPnN0YXRzLm5vX3JjdisrOworCXBvcnQtPnN0YXRzLnJ4Ynl0ZXMgKz0gbGVuZ3RoOworfQorCisvKiBQcm9jZXNzIFJlY2VpdmUgc3RhdHVzIHJpbmcgKi8KK3UzMiBuZXR4ZW5fcHJvY2Vzc19yY3ZfcmluZyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjdHhpZCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCAqcmVjdl9jdHggPSAmKGFkYXB0ZXItPnJlY3ZfY3R4W2N0eGlkXSk7CisJc3RydWN0IHN0YXR1c19kZXNjICpkZXNjX2hlYWQgPSByZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQ7CisJc3RydWN0IHN0YXR1c19kZXNjICpkZXNjOwkvKiB1c2VkIHRvIHJlYWQgc3RhdHVzIGRlc2MgaGVyZSAqLworCXUzMiBjb25zdW1lciA9IHJlY3ZfY3R4LT5zdGF0dXNfcnhfY29uc3VtZXI7CisJaW50IGNvdW50ID0gMCwgcmluZzsKKworCURQUklOVEsoSU5GTywgInByb2Nlc2luZyByZWNlaXZlXG4iKTsKKwkvKgorCSAqIHdlIGFzc3VtZSBpbiB0aGlzIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBwb3J0IGFuZCB0aGF0IGlzCisJICogcG9ydCAjMS4uLmNoYW5nZXMgbmVlZCB0byBiZSBkb25lIGluIGZpcm13YXJlIHRvIGluZGljYXRlIHBvcnQKKwkgKiBudW1iZXIgYXMgcGFydCBvZiB0aGUgZGVzY3JpcHRvci4gVGhpcyB3YXkgd2Ugd2lsbCBiZSBhYmxlIHRvIGdldAorCSAqIHRoZSBuZXRkZXYgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZGV2aWNlLgorCSAqLworCXdoaWxlIChjb3VudCA8IG1heCkgeworCQlkZXNjID0gJmRlc2NfaGVhZFtjb25zdW1lcl07CisJCWlmICghKChsZTE2X3RvX2NwdShkZXNjLT5vd25lcikpICYgU1RBVFVTX09XTkVSX0hPU1QpKSB7CisJCQlEUFJJTlRLKEVSUiwgImRlc2MgJXAgb3duZWRieSAleFxuIiwgZGVzYywgZGVzYy0+b3duZXIpOworCQkJYnJlYWs7CisJCX0KKwkJbmV0eGVuX3Byb2Nlc3NfcmN2KGFkYXB0ZXIsIGN0eGlkLCBkZXNjKTsKKwkJZGVzYy0+b3duZXIgPSBTVEFUVVNfT1dORVJfUEhBTlRPTTsKKwkJY29uc3VtZXIgPSAoY29uc3VtZXIgKyAxKSAmIChhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCAtIDEpOworCQljb3VudCsrOworCX0KKwlpZiAoY291bnQpIHsKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQluZXR4ZW5fcG9zdF9yeF9idWZmZXJzKGFkYXB0ZXIsIGN0eGlkLCByaW5nKTsKKwkJfQorCX0KKworCS8qIHVwZGF0ZSB0aGUgY29uc3VtZXIgaW5kZXggaW4gcGhhbnRvbSAqLworCWlmIChjb3VudCkgeworCQlhZGFwdGVyLT5zdGF0cy5wcm9jZXNzX3JjdisrOworCQlyZWN2X2N0eC0+c3RhdHVzX3J4X2NvbnN1bWVyID0gY29uc3VtZXI7CisKKwkJLyogV2luZG93ID0gMSAqLworCQl3cml0ZWwoY29uc3VtZXIsCisJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkgICAgcmVjdl9jcmJfcmVnaXN0ZXJzW2N0eGlkXS4KKwkJCQkJICAgIGNyYl9yY3Zfc3RhdHVzX2NvbnN1bWVyKSk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKiBQcm9jZXNzIENvbW1hbmQgc3RhdHVzIHJpbmcgKi8KK3ZvaWQgbmV0eGVuX3Byb2Nlc3NfY21kX3JpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXUzMiBsYXN0X2NvbnN1bWVyOworCXUzMiBjb25zdW1lcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICopZGF0YTsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsJLyogcG9ydCAjMSAqLworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqbnBvcnQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5ldHhlbl9za2JfZnJhZyAqZnJhZzsKKwl1MzIgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgcDsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+dHhfbG9jayk7CisJbGFzdF9jb25zdW1lciA9IGFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyOworCURQUklOVEsoSU5GTywgInByb2Nlc2luZyB4bWl0IGNvbXBsZXRlXG4iKTsKKwkvKiB3ZSBhc3N1bWUgaW4gdGhpcyBjYXNlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgcG9ydCBhbmQgdGhhdCBpcworCSAqIHBvcnQgIzEuLi5jaGFuZ2VzIG5lZWQgdG8gYmUgZG9uZSBpbiBmaXJtd2FyZSB0byBpbmRpY2F0ZSBwb3J0CisJICogbnVtYmVyIGFzIHBhcnQgb2YgdGhlIGRlc2NyaXB0b3IuIFRoaXMgd2F5IHdlIHdpbGwgYmUgYWJsZSB0byBnZXQKKwkgKiB0aGUgbmV0ZGV2IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGRldmljZS4KKwkgKi8KKwljb25zdW1lciA9CisJICAgIHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURfQ09OU1VNRVJfT0ZGU0VUKSk7CisKKwlpZiAobGFzdF9jb25zdW1lciA9PSBjb25zdW1lcikgewkvKiBSaW5nIGlzIGVtcHR5ICAgICovCisJCURQUklOVEsoSU5GTywgImxhc3RfY29uc3VtZXIgJWQgPT0gY29uc3VtZXIgJWRcbiIsCisJCQlsYXN0X2NvbnN1bWVyLCBjb25zdW1lcik7CisJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWFkYXB0ZXItPnByb2NfY21kX2J1Zl9jb3VudGVyKys7CisJYWRhcHRlci0+c3RhdHMucHJvY2Vzc194bWl0Kys7CisJLyoKKwkgKiBOb3QgbmVlZGVkIC0gZG9lcyBub3Qgc2VlbSB0byBiZSB1c2VkIGFueXdoZXJlLgorCSAqIGFkYXB0ZXItPmNtZF9jb25zdW1lciA9IGNvbnN1bWVyOworCSAqLworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKworCXdoaWxlICgobGFzdF9jb25zdW1lciAhPSBjb25zdW1lcikgJiYgKGNvdW50IDwgTUFYX1NUQVRVU19IQU5ETEUpKSB7CisJCWJ1ZmZlciA9ICZhZGFwdGVyLT5jbWRfYnVmX2FycltsYXN0X2NvbnN1bWVyXTsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbYnVmZmVyLT5wb3J0XTsKKwkJcGRldiA9IHBvcnQtPnBkZXY7CisJCWZyYWcgPSAmYnVmZmVyLT5mcmFnX2FycmF5WzBdOworCQlza2IgPSBidWZmZXItPnNrYjsKKwkJaWYgKHNrYiAmJiAoY21weGNoZygmYnVmZmVyLT5za2IsIHNrYiwgMCkgPT0gc2tiKSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBmcmFnLT5kbWEsIGZyYWctPmxlbmd0aCwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZm9yIChpID0gMTsgaSA8IGJ1ZmZlci0+ZnJhZ19jb3VudDsgaSsrKSB7CisJCQkJRFBSSU5USyhJTkZPLCAiZ2V0dGluZyBmcmFnbWVudCBubyAlZFxuIiwgaSk7CisJCQkJZnJhZysrOwkvKiBHZXQgdGhlIG5leHQgZnJhZyAqLworCQkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGZyYWctPmRtYSwgZnJhZy0+bGVuZ3RoLAorCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQl9CisKKwkJCXBvcnQtPnN0YXRzLnNrYmZyZWVkKys7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJc2tiID0gTlVMTDsKKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5wcm9jX2NtZF9idWZfY291bnRlciA9PSAxKSB7CisJCQlwb3J0LT5zdGF0cy50eG51bGxza2IrKzsKKwkJfQorCQlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChwb3J0LT5uZXRkZXYpCisJCQkgICAgICYmIG5ldGlmX2NhcnJpZXJfb2socG9ydC0+bmV0ZGV2KSkKKwkJICAgICYmICgoamlmZmllcyAtIHBvcnQtPm5ldGRldi0+dHJhbnNfc3RhcnQpID4KKwkJCXBvcnQtPm5ldGRldi0+d2F0Y2hkb2dfdGltZW8pKSB7CisJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5hZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworCQl9CisKKwkJbGFzdF9jb25zdW1lciA9IGdldF9uZXh0X2luZGV4KGxhc3RfY29uc3VtZXIsCisJCQkJCSAgICAgICBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCk7CisJCWNvdW50Kys7CisJfQorCWFkYXB0ZXItPnN0YXRzLm5veG1pdGRvbmUgKz0gY291bnQ7CisKKwljb3VudCA9IDA7CisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKwlpZiAoKC0tYWRhcHRlci0+cHJvY19jbWRfYnVmX2NvdW50ZXIpID09IDApIHsKKwkJYWRhcHRlci0+bGFzdF9jbWRfY29uc3VtZXIgPSBsYXN0X2NvbnN1bWVyOworCQl3aGlsZSAoKGFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyICE9IGNvbnN1bWVyKQorCQkgICAgICAgJiYgKGNvdW50IDwgTUFYX1NUQVRVU19IQU5ETEUpKSB7CisJCQlidWZmZXIgPQorCQkJICAgICZhZGFwdGVyLT5jbWRfYnVmX2FyclthZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lcl07CisJCQljb3VudCsrOworCQkJaWYgKGJ1ZmZlci0+c2tiKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCWFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyID0KKwkJCQkgICAgZ2V0X25leHRfaW5kZXgoYWRhcHRlci0+bGFzdF9jbWRfY29uc3VtZXIsCisJCQkJCQkgICBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCk7CisJCX0KKwl9CisJaWYgKGNvdW50KSB7CisJCWZvciAocCA9IDA7IHAgPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBwKyspIHsKKwkJCW5wb3J0ID0gYWRhcHRlci0+cG9ydFtwXTsKKwkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5wb3J0LT5uZXRkZXYpCisJCQkgICAgJiYgKG5wb3J0LT5mbGFncyAmIE5FVFhFTl9ORVRERVZfU1RBVFVTKSkgeworCQkJCW5ldGlmX3dha2VfcXVldWUobnBvcnQtPm5ldGRldik7CisJCQkJbnBvcnQtPmZsYWdzICY9IH5ORVRYRU5fTkVUREVWX1NUQVRVUzsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKwlEUFJJTlRLKElORk8sICJsYXN0IGNvbnN1bWVyIGlzICVkIGluICVzXG4iLCBsYXN0X2NvbnN1bWVyLAorCQlfX0ZVTkNUSU9OX18pOworfQorCisvKgorICogbmV0eGVuX3Bvc3RfcnhfYnVmZmVycyBwdXRzIGJ1ZmZlciBpbiB0aGUgUGhhbnRvbSBtZW1vcnkKKyAqLwordm9pZCBuZXR4ZW5fcG9zdF9yeF9idWZmZXJzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIGN0eCwgdTMyIHJpbmdpZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPmFody5wZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgKnJlY3ZfY3R4ID0gJihhZGFwdGVyLT5yZWN2X2N0eFtjdHhdKTsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2MgPSBOVUxMOworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jcmIgKmNyYmFyZWEgPSAmcmVjdl9jcmJfcmVnaXN0ZXJzW2N0eF07CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jcmIgKnJjdl9kZXNjX2NyYiA9IE5VTEw7CisJdTMyIHByb2R1Y2VyOworCXN0cnVjdCByY3ZfZGVzYyAqcGRlc2M7CisJc3RydWN0IG5ldHhlbl9yeF9idWZmZXIgKmJ1ZmZlcjsKKwlpbnQgY291bnQgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlhZGFwdGVyLT5zdGF0cy5wb3N0X2NhbGxlZCsrOworCXJjdl9kZXNjID0gJnJlY3ZfY3R4LT5yY3ZfZGVzY1tyaW5naWRdOworCXJjdl9kZXNjX2NyYiA9ICZjcmJhcmVhLT5yY3ZfZGVzY19jcmJbcmluZ2lkXTsKKworCXByb2R1Y2VyID0gcmN2X2Rlc2MtPnByb2R1Y2VyOworCWluZGV4ID0gcmN2X2Rlc2MtPmJlZ2luX2FsbG9jOworCWJ1ZmZlciA9ICZyY3ZfZGVzYy0+cnhfYnVmX2FycltpbmRleF07CisJLyogV2UgY2FuIHN0YXJ0IHdyaXRpbmcgcnggZGVzY3JpcHRvcnMgaW50byB0aGUgcGhhbnRvbSBtZW1vcnkuICovCisJd2hpbGUgKGJ1ZmZlci0+c3RhdGUgPT0gTkVUWEVOX0JVRkZFUl9GUkVFKSB7CisJCXNrYiA9IGRldl9hbGxvY19za2IocmN2X2Rlc2MtPnNrYl9zaXplKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgcG9zdGluZyBvZiBidWZmZXJzIHRvIHRoZSBwZWdzLgorCQkJICovCisJCQlyY3ZfZGVzYy0+YmVnaW5fYWxsb2MgPSBpbmRleDsKKwkJCURQUklOVEsoRVJSLCAibmV0eGVuX3Bvc3RfcnhfYnVmZmVyczogIgorCQkJCSIgYWxsb2NhdGVkIG9ubHkgJWQgYnVmZmVyc1xuIiwgY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQrKzsJLyogbm93IHRoZXJlIHNob3VsZCBiZSBubyBmYWlsdXJlICovCisJCXBkZXNjID0gJnJjdl9kZXNjLT5kZXNjX2hlYWRbcHJvZHVjZXJdOworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCS8qIAorCQkgKiBUaGlzIHdpbGwgYmUgc2V0dXAgd2hlbiB3ZSByZWNlaXZlIHRoZQorCQkgKiBidWZmZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkCisJCSAqIHNrYi0+ZGV2ID0gbmV0ZGV2OworCQkgKi8KKwkJYnVmZmVyLT5za2IgPSBza2I7CisJCWJ1ZmZlci0+c3RhdGUgPSBORVRYRU5fQlVGRkVSX0JVU1k7CisJCWJ1ZmZlci0+ZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLAorCQkJCQkgICAgIHJjdl9kZXNjLT5kbWFfc2l6ZSwKKwkJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkvKiBtYWtlIGEgcmN2IGRlc2NyaXB0b3IgICovCisJCXBkZXNjLT5yZWZlcmVuY2VfaGFuZGxlID0gbGUxNl90b19jcHUoYnVmZmVyLT5yZWZfaGFuZGxlKTsKKwkJcGRlc2MtPmJ1ZmZlcl9sZW5ndGggPSBsZTE2X3RvX2NwdShyY3ZfZGVzYy0+ZG1hX3NpemUpOworCQlwZGVzYy0+YWRkcl9idWZmZXIgPSBjcHVfdG9fbGU2NChidWZmZXItPmRtYSk7CisJCURQUklOVEsoSU5GTywgImRvbmUgd3JpdGluZyBkZXNjcmlwdGVyXG4iKTsKKwkJcHJvZHVjZXIgPQorCQkgICAgZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudCk7CisJCWluZGV4ID0gZ2V0X25leHRfaW5kZXgoaW5kZXgsIHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudCk7CisJCWJ1ZmZlciA9ICZyY3ZfZGVzYy0+cnhfYnVmX2FycltpbmRleF07CisJfQorCisJLyogaWYgd2UgZGlkIGFsbG9jYXRlIGJ1ZmZlcnMsIHRoZW4gd3JpdGUgdGhlIGNvdW50IHRvIFBoYW50b20gKi8KKwlpZiAoY291bnQpIHsKKwkJcmN2X2Rlc2MtPmJlZ2luX2FsbG9jID0gaW5kZXg7CisJCXJjdl9kZXNjLT5yY3ZfcGVuZGluZyArPSBjb3VudDsKKwkJYWRhcHRlci0+c3RhdHMubGFzdHBvc3RlZCA9IGNvdW50OworCQlhZGFwdGVyLT5zdGF0cy5wb3N0ZWQgKz0gY291bnQ7CisJCXJjdl9kZXNjLT5wcm9kdWNlciA9IHByb2R1Y2VyOworCQlpZiAocmN2X2Rlc2MtPnJjdl9mcmVlID49IDMyKSB7CisJCQlyY3ZfZGVzYy0+cmN2X2ZyZWUgPSAwOworCQkJLyogV2luZG93ID0gMSAqLworCQkJd3JpdGVsKChwcm9kdWNlciAtIDEpICYKKwkJCSAgICAgICAocmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50IC0gMSksCisJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCSAgICByY3ZfZGVzY19jcmItPgorCQkJCQkJICAgIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0KSk7CisJCQl3bWIoKTsKKwkJfQorCX0KK30KKworaW50IG5ldHhlbl9uaWNfdHhfaGFzX3dvcmsoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChmaW5kX2RpZmZfYW1vbmcoYWRhcHRlci0+bGFzdF9jbWRfY29uc3VtZXIsCisJCQkgICAgYWRhcHRlci0+Y21kX3Byb2R1Y2VyLAorCQkJICAgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50KSA+IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbmV0eGVuX25pY19maWxsX3N0YXRpc3RpY3Moc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LAorCQkJICAgc3RydWN0IG5ldHhlbl9zdGF0aXN0aWNzICpuZXR4ZW5fc3RhdHMpCit7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgeworCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCQlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhORVRYRU5fTklVX1hHRV9UWF9CWVRFX0NOVCwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPnR4X2J5dGVzKSk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX1RYX0ZSQU1FX0NOVCwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPnR4X3BhY2tldHMpKTsKKwkJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9YR0VfUlhfQllURV9DTlQsCisJCQkJCSAgICYobmV0eGVuX3N0YXRzLT5yeF9ieXRlcykpOworCQlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhORVRYRU5fTklVX1hHRV9SWF9GUkFNRV9DTlQsCisJCQkJCSAgICYobmV0eGVuX3N0YXRzLT5yeF9wYWNrZXRzKSk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX0FHR1JfRVJST1JfQ05ULAorCQkJCQkgICAmKG5ldHhlbl9zdGF0cy0+cnhfZXJyb3JzKSk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX0NSQ19FUlJPUl9DTlQsCisJCQkJCSAgICYobmV0eGVuX3N0YXRzLT5yeF9jcmNfZXJyb3JzKSk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX09WRVJTSVpFX0ZSQU1FX0VSUiwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPgorCQkJCQkgICAgIHJ4X2xvbmdfbGVuZ3RoX2Vycm9yKSk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX1VOREVSU0laRV9GUkFNRV9FUlIsCisJCQkJCSAgICYobmV0eGVuX3N0YXRzLT4KKwkJCQkJICAgICByeF9zaG9ydF9sZW5ndGhfZXJyb3IpKTsKKworCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisJCW5ldHhlbl9zdGF0cy0+dHhfYnl0ZXMgPSBwb3J0LT5zdGF0cy50eGJ5dGVzOworCQluZXR4ZW5fc3RhdHMtPnR4X3BhY2tldHMgPSBwb3J0LT5zdGF0cy54bWl0ZWRmcmFtZXMgKworCQkgICAgcG9ydC0+c3RhdHMueG1pdGZpbmlzaGVkOworCQluZXR4ZW5fc3RhdHMtPnJ4X2J5dGVzID0gcG9ydC0+c3RhdHMucnhieXRlczsKKwkJbmV0eGVuX3N0YXRzLT5yeF9wYWNrZXRzID0gcG9ydC0+c3RhdHMubm9fcmN2OworCQluZXR4ZW5fc3RhdHMtPnJ4X2Vycm9ycyA9IHBvcnQtPnN0YXRzLnJjdmRiYWRza2I7CisJCW5ldHhlbl9zdGF0cy0+dHhfZXJyb3JzID0gcG9ydC0+c3RhdHMubm9jbWRkZXNjcmlwdG9yOworCQluZXR4ZW5fc3RhdHMtPnJ4X3Nob3J0X2xlbmd0aF9lcnJvciA9IHBvcnQtPnN0YXRzLnVwbGNvbmc7CisJCW5ldHhlbl9zdGF0cy0+cnhfbG9uZ19sZW5ndGhfZXJyb3IgPSBwb3J0LT5zdGF0cy51cGhjb25nOworCQluZXR4ZW5fc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSAwOworCQluZXR4ZW5fc3RhdHMtPnJ4X21hY19lcnJvcnMgPSAwOworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKKwlpbnQgcG9ydF9udW07CisKKwltZW1zZXQoJmFkYXB0ZXItPnN0YXRzLCAwLCBzaXplb2YoYWRhcHRlci0+c3RhdHMpKTsKKwlmb3IgKHBvcnRfbnVtID0gMDsgcG9ydF9udW0gPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBwb3J0X251bSsrKSB7CisJCXBvcnQgPSBhZGFwdGVyLT5wb3J0W3BvcnRfbnVtXTsKKwkJbWVtc2V0KCZwb3J0LT5zdGF0cywgMCwgc2l6ZW9mKHBvcnQtPnN0YXRzKSk7CisJfQorfQorCitpbnQKK25ldHhlbl9uaWNfY2xlYXJfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0KQoreworCWludCBkYXRhID0gMDsKKworCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMCk7CisKKwluZXR4ZW5fbmljX2xvY2tlZF93cml0ZV9yZWcoYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfVFhfQllURV9DTlQsICZkYXRhKTsKKwluZXR4ZW5fbmljX2xvY2tlZF93cml0ZV9yZWcoYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfVFhfRlJBTUVfQ05ULAorCQkJCSAgICAmZGF0YSk7CisJbmV0eGVuX25pY19sb2NrZWRfd3JpdGVfcmVnKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX1JYX0JZVEVfQ05ULCAmZGF0YSk7CisJbmV0eGVuX25pY19sb2NrZWRfd3JpdGVfcmVnKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX1JYX0ZSQU1FX0NOVCwKKwkJCQkgICAgJmRhdGEpOworCW5ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9BR0dSX0VSUk9SX0NOVCwKKwkJCQkgICAgJmRhdGEpOworCW5ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9DUkNfRVJST1JfQ05ULAorCQkJCSAgICAmZGF0YSk7CisJbmV0eGVuX25pY19sb2NrZWRfd3JpdGVfcmVnKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX09WRVJTSVpFX0ZSQU1FX0VSUiwKKwkJCQkgICAgJmRhdGEpOworCW5ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9VTkRFUlNJWkVfRlJBTUVfRVJSLAorCQkJCSAgICAmZGF0YSk7CisKKwluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworCW5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbmV0eGVuX25pY19kb19pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKnVfZGF0YSwKKwkJICAgIHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX25pY19pb2N0bF9kYXRhIGRhdGE7CisJc3RydWN0IG5ldHhlbl9uaWNfaW9jdGxfZGF0YSAqdXBfZGF0YTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX3N0YXRpc3RpY3MgbmV0eGVuX3N0YXRzOworCisJdXBfZGF0YSA9ICh2b2lkICopdV9kYXRhOworCisJRFBSSU5USyhJTkZPLCAiZG9pbmcgaW9jdGwgZm9yICVwXG4iLCBhZGFwdGVyKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsICh2b2lkIF9fdXNlciAqKXVwX2RhdGEsIHNpemVvZihkYXRhKSkpIHsKKwkJLyogZXZpbCB1c2VyIHRyaWVkIHRvIGNyYXNoIHRoZSBrZXJuZWwgKi8KKwkJRFBSSU5USyhFUlIsICJiYWQgY29weSBmcm9tIHVzZXJsYW5kOiAlZFxuIiwgKGludClzaXplb2YoZGF0YSkpOworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwkvKiBTaG91bGRuJ3QgYWNjZXNzIGJleW9uZCBsZWdhbCBsaW1pdHMgb2YgICJjaGFyIHVbNjRdOyIgbWVtYmVyICovCisJaWYgKCFkYXRhLnB0ciAmJiAoZGF0YS5zaXplID4gc2l6ZW9mKGRhdGEudSkpKSB7CisJCS8qIGV2aWwgdXNlciB0cmllZCB0byBjcmFzaCB0aGUga2VybmVsICovCisJCURQUklOVEsoRVJSLCAiYmFkIHNpemU6ICVkXG4iLCBkYXRhLnNpemUpOworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlzd2l0Y2ggKGRhdGEuY21kKSB7CisJY2FzZSBuZXR4ZW5fbmljX2NtZF9wY2lfcmVhZDoKKwkJaWYgKChyZXR2YWwgPSBuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgZGF0YS5vZmYsCisJCQkJCQkgICAgJihkYXRhLnUpLCBkYXRhLnNpemUpKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopJih1cF9kYXRhLT51KSwgJihkYXRhLnUpLCBkYXRhLnNpemUpKSB7CisJCQlEUFJJTlRLKEVSUiwgImJhZCBjb3B5IHRvIHVzZXJsYW5kOiAlZFxuIiwKKwkJCQkoaW50KXNpemVvZihkYXRhKSk7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJZGF0YS5ydiA9IDA7CisJCWJyZWFrOworCisJY2FzZSBuZXR4ZW5fbmljX2NtZF9wY2lfd3JpdGU6CisJCWRhdGEucnYgPSBuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIGRhdGEub2ZmLCAmKGRhdGEudSksCisJCQkJCQkgZGF0YS5zaXplKTsKKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX3BjaV9jb25maWdfcmVhZDoKKwkJc3dpdGNoIChkYXRhLnNpemUpIHsKKwkJY2FzZSAxOgorCQkJZGF0YS5ydiA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJICAgICAgIGRhdGEub2ZmLAorCQkJCQkJICAgICAgIChjaGFyICopJihkYXRhLnUpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhLnJ2ID0gcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcHRlci0+YWh3LnBkZXYsCisJCQkJCQkgICAgICAgZGF0YS5vZmYsCisJCQkJCQkgICAgICAgKHNob3J0ICopJihkYXRhLnUpKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlkYXRhLnJ2ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJCWRhdGEub2ZmLAorCQkJCQkJCSh1MzIgKikgJiAoZGF0YS51KSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopJih1cF9kYXRhLT51KSwgJihkYXRhLnUpLCBkYXRhLnNpemUpKSB7CisJCQlEUFJJTlRLKEVSUiwgImJhZCBjb3B5IHRvIHVzZXJsYW5kOiAlZFxuIiwKKwkJCQkoaW50KXNpemVvZihkYXRhKSk7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX3BjaV9jb25maWdfd3JpdGU6CisJCXN3aXRjaCAoZGF0YS5zaXplKSB7CisJCWNhc2UgMToKKwkJCWRhdGEucnYgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWRhcHRlci0+YWh3LnBkZXYsCisJCQkJCQkJZGF0YS5vZmYsCisJCQkJCQkJKihjaGFyICopJihkYXRhLnUpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhLnJ2ID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJCWRhdGEub2ZmLAorCQkJCQkJCSooc2hvcnQgKikmKGRhdGEudSkpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWRhdGEucnYgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJCSBkYXRhLm9mZiwKKwkJCQkJCQkgKih1MzIgKikgJiAoZGF0YS51KSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgbmV0eGVuX25pY19jbWRfZ2V0X3N0YXRzOgorCQlkYXRhLnJ2ID0KKwkJICAgIG5ldHhlbl9uaWNfZmlsbF9zdGF0aXN0aWNzKGFkYXB0ZXIsIHBvcnQsICZuZXR4ZW5fc3RhdHMpOworCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopKHVwX2RhdGEtPnB0ciksICh2b2lkICopJm5ldHhlbl9zdGF0cywKKwkJICAgICBzaXplb2Yoc3RydWN0IG5ldHhlbl9zdGF0aXN0aWNzKSkpIHsKKwkJCURQUklOVEsoRVJSLCAiYmFkIGNvcHkgdG8gdXNlcmxhbmQ6ICVkXG4iLAorCQkJCShpbnQpc2l6ZW9mKG5ldHhlbl9zdGF0cykpOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCXVwX2RhdGEtPnJ2ID0gZGF0YS5ydjsKKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX2NsZWFyX3N0YXRzOgorCQlkYXRhLnJ2ID0gbmV0eGVuX25pY19jbGVhcl9zdGF0aXN0aWNzKGFkYXB0ZXIsIHBvcnQpOworCQl1cF9kYXRhLT5ydiA9IGRhdGEucnY7CisJCWJyZWFrOworCisJY2FzZSBuZXR4ZW5fbmljX2NtZF9nZXRfdmVyc2lvbjoKKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKCh2b2lkIF9fdXNlciAqKSYodXBfZGF0YS0+dSksIE5FVFhFTl9OSUNfTElOVVhfVkVSU0lPTklELAorCQkgICAgIHNpemVvZihORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCkpKSB7CisJCQlEUFJJTlRLKEVSUiwgImJhZCBjb3B5IHRvIHVzZXJsYW5kOiAlZFxuIiwKKwkJCQkoaW50KXNpemVvZihkYXRhKSk7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sICJiYWQgY29tbWFuZCAlZCBmb3IgJXBcbiIsIGRhdGEuY21kLCBhZGFwdGVyKTsKKwkJcmV0dmFsID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlwdXRfdXNlcihkYXRhLnJ2LCAodTE2IF9fdXNlciAqKSAoJih1cF9kYXRhLT5ydikpKTsKKwlEUFJJTlRLKElORk8sICJkb25lIGlvY3RsIGZvciAlcCB3ZWxsLlxuIiwgYWRhcHRlcik7CisKKyAgICAgIGVycm9yX291dDoKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW9jdGwuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2lvY3RsLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKiAKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqIAorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKi8KKworI2lmbmRlZiBfX05FVFhFTl9OSUNfSU9DVExfSF9fCisjZGVmaW5lIF9fTkVUWEVOX05JQ19JT0NUTF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2RlZmluZSBORVRYRU5fQ01EX1NUQVJUCVNJT0NERVZQUklWQVRFCisjZGVmaW5lIE5FVFhFTl9OSUNfQ01ECQkoTkVUWEVOX0NNRF9TVEFSVCArIDEpCisjZGVmaW5lIE5FVFhFTl9OSUNfTkFNRQkJKE5FVFhFTl9DTURfU1RBUlQgKyAyKQorI2RlZmluZSBORVRYRU5fTklDX05BTUVfTEVOCTE2CisjZGVmaW5lIE5FVFhFTl9OSUNfTkFNRV9SU1AJIk5FVFhFTiIKKwordHlwZWRlZiBlbnVtIHsKKwluZXR4ZW5fbmljX2NtZF9ub25lID0gMCwKKwluZXR4ZW5fbmljX2NtZF9wY2lfcmVhZCwKKwluZXR4ZW5fbmljX2NtZF9wY2lfd3JpdGUsCisJbmV0eGVuX25pY19jbWRfcGNpX21lbV9yZWFkLAorCW5ldHhlbl9uaWNfY21kX3BjaV9tZW1fd3JpdGUsCisJbmV0eGVuX25pY19jbWRfcGNpX2NvbmZpZ19yZWFkLAorCW5ldHhlbl9uaWNfY21kX3BjaV9jb25maWdfd3JpdGUsCisJbmV0eGVuX25pY19jbWRfZ2V0X3N0YXRzLAorCW5ldHhlbl9uaWNfY21kX2NsZWFyX3N0YXRzLAorCW5ldHhlbl9uaWNfY21kX2dldF92ZXJzaW9uCit9IG5ldHhlbl9uaWNfaW9jdGxfY21kX3Q7CisKK3N0cnVjdCBuZXR4ZW5fbmljX2lvY3RsX2RhdGEgeworCXUzMiBjbWQ7CisJdTMyIHVudXNlZDE7CisJdTY0IG9mZjsKKwl1MzIgc2l6ZTsKKwl1MzIgcnY7CisJY2hhciB1WzY0XTsKKwl2b2lkICpwdHI7Cit9OworCitzdHJ1Y3QgbmV0eGVuX3N0YXRpc3RpY3MgeworCXU2NCByeF9wYWNrZXRzOworCXU2NCB0eF9wYWNrZXRzOworCXU2NCByeF9ieXRlczsKKwl1NjQgcnhfZXJyb3JzOworCXU2NCB0eF9ieXRlczsKKwl1NjQgdHhfZXJyb3JzOworCXU2NCByeF9jcmNfZXJyb3JzOworCXU2NCByeF9zaG9ydF9sZW5ndGhfZXJyb3I7CisJdTY0IHJ4X2xvbmdfbGVuZ3RoX2Vycm9yOworCXU2NCByeF9tYWNfZXJyb3JzOworfTsKKworI2VuZGlmCQkJCS8qIF9fTkVUWEVOX05JQ19JT0NUTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaXNyLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE4MGZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaXNyLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAgMDIxMTEtMTMwNywgVVNBLgorICogCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKiAKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibmV0eGVuX25pYy5oIgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfaHcuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX3BoYW5fcmVnLmgiCisKKy8qCisgKiBuZXR4ZW5fbmljX2dldF9zdGF0cyAtIEdldCBTeXN0ZW0gTmV0d29yayBTdGF0aXN0aWNzCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR4ZW5fbmljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnBvcnQtPm5ldF9zdGF0czsKKworCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworCisJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAgICovCisJc3RhdHMtPnJ4X3BhY2tldHMgPSBwb3J0LT5zdGF0cy5ub19yY3Y7CisJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZCAgICAqLworCXN0YXRzLT50eF9wYWNrZXRzID0gcG9ydC0+c3RhdHMueG1pdGVkZnJhbWVzICsgcG9ydC0+c3RhdHMueG1pdGZpbmlzaGVkOworCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICAgICAqLworCXN0YXRzLT5yeF9ieXRlcyA9IHBvcnQtPnN0YXRzLnJ4Ynl0ZXM7CisJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgICovCisJc3RhdHMtPnR4X2J5dGVzID0gcG9ydC0+c3RhdHMudHhieXRlczsKKwkvKiBiYWQgcGFja2V0cyByZWNlaXZlZCAgICAgKi8KKwlzdGF0cy0+cnhfZXJyb3JzID0gcG9ydC0+c3RhdHMucmN2ZGJhZHNrYjsKKwkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMgKi8KKwlzdGF0cy0+dHhfZXJyb3JzID0gcG9ydC0+c3RhdHMubm9jbWRkZXNjcmlwdG9yOworCS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMgICAgKi8KKwlzdGF0cy0+cnhfZHJvcHBlZCA9IHBvcnQtPnN0YXRzLnVwZHJvcHBlZDsKKwkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXggICovCisJc3RhdHMtPnR4X2Ryb3BwZWQgPSBwb3J0LT5zdGF0cy50eGRyb3BwZWQ7CisKKwlyZXR1cm4gc3RhdHM7Cit9CisKK3ZvaWQgbmV0eGVuX2luZGljYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHBvcnRubywKKwkJCQkgdTMyIGxpbmspCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydG5vXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHBvcnQtPm5ldGRldjsKKworCWlmIChsaW5rKQorCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworfQorCit2b2lkIG5ldHhlbl9oYW5kbGVfcG9ydF9pbnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgcG9ydG5vLAorCQkJICAgIHUzMiBlbmFibGUpCit7CisJX19sZTMyIGludF9zcmM7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0OworCisJLyogIFRoaXMgc2hvdWxkIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc291cmNlICovCisJaWYgKGFkYXB0ZXItPm9wcy0+cGh5X3JlYWQpCisJCWFkYXB0ZXItPm9wcy0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydG5vLAorCQkJCSAgICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfSU5UX1NUQVRVUywKKwkJCQkgICAgICAgJmludF9zcmMpOworCWlmIChpbnRfc3JjID09IDApIHsKKwkJRFBSSU5USyhJTkZPLCAiTm8gcGh5IGludGVycnVwdHMgZm9yIHBvcnQgIyVkXG4iLCBwb3J0bm8pOworCQlyZXR1cm47CisJfQorCWlmIChhZGFwdGVyLT5vcHMtPmRpc2FibGVfcGh5X2ludGVycnVwdHMpCisJCWFkYXB0ZXItPm9wcy0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0bm8pOworCisJcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydG5vXTsKKworCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfamFiYmVyKGludF9zcmMpKQorCQlEUFJJTlRLKElORk8sICJOZXRYZW46ICVzIEphYmJlciBpbnRlcnJ1cHQgXG4iLAorCQkJcG9ydC0+bmV0ZGV2LT5uYW1lKTsKKworCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfcG9sYXJpdHlfY2hhbmdlZChpbnRfc3JjKSkKKwkJRFBSSU5USyhJTkZPLCAiTmV0WGVuOiAlcyBQT0xBUklUWSBDSEFOR0VEIGludCBcbiIsCisJCQlwb3J0LT5uZXRkZXYtPm5hbWUpOworCisJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9lbmVyZ3lfZGV0ZWN0KGludF9zcmMpKQorCQlEUFJJTlRLKElORk8sICJOZXRYZW46ICVzIEVORVJHWSBERVRFQ1QgSU5UIFxuIiwKKwkJCXBvcnQtPm5ldGRldi0+bmFtZSk7CisKKwlpZiAobmV0eGVuX2dldF9waHlfaW50X2Rvd25zaGlmdChpbnRfc3JjKSkKKwkJRFBSSU5USyhJTkZPLCAiTmV0WGVuOiAlcyBET1dOU0hJRlQgSU5UIFxuIiwKKwkJCXBvcnQtPm5ldGRldi0+bmFtZSk7CisJLyogd3JpdGUgaXQgZG93biBsYXRlci4uICovCisJaWYgKChuZXR4ZW5fZ2V0X3BoeV9pbnRfc3BlZWRfY2hhbmdlZChpbnRfc3JjKSkKKwkgICAgfHwgKG5ldHhlbl9nZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGludF9zcmMpKSkgeworCQlfX2xlMzIgc3RhdHVzOworCisJCURQUklOVEsoSU5GTywgIk5ldFhlbjogJXMgU1BFRUQgQ0hBTkdFRCBPUiIKKwkJCSIgTElOSyBTVEFUVVMgQ0hBTkdFRCBcbiIsIHBvcnQtPm5ldGRldi0+bmFtZSk7CisKKwkJaWYgKGFkYXB0ZXItPm9wcy0+cGh5X3JlYWQKKwkJICAgICYmIGFkYXB0ZXItPm9wcy0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydG5vLAorCQkJCQkgICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKKwkJCQkJICAgICAgJnN0YXR1cykgPT0gMCkgeworCQkJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGludF9zcmMpKSB7CisJCQkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgeworCQkJCQluZXR4ZW5fbml1X2diZV9pbml0X3BvcnQoYWRhcHRlciwKKwkJCQkJCQkJIHBvcnRubyk7CisJCQkJCXByaW50aygiJXM6ICVzIExpbmsgVVBcbiIsCisJCQkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQkJCQkgICAgICAgcG9ydC0+bmV0ZGV2LT5uYW1lKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50aygiJXM6ICVzIExpbmsgRE9XTlxuIiwKKwkJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCQkJCSAgICAgICBwb3J0LT5uZXRkZXYtPm5hbWUpOworCQkJCX0KKwkJCQluZXR4ZW5faW5kaWNhdGVfbGlua19zdGF0dXMoYWRhcHRlciwgcG9ydG5vLAorCQkJCQkJCSAgICBuZXR4ZW5fZ2V0X3BoeV9saW5rCisJCQkJCQkJICAgIChzdGF0dXMpKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYWRhcHRlci0+b3BzLT5lbmFibGVfcGh5X2ludGVycnVwdHMpCisJCWFkYXB0ZXItPm9wcy0+ZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnRubyk7Cit9CisKK3ZvaWQgbmV0eGVuX25pY19pc3Jfb3RoZXIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBwb3J0bm87CisJdTMyIHZhbCwgbGlua3VwLCBxZ19saW5rc3VwOworCisJLyogdmVyaWZ5IHRoZSBvZmZzZXQgKi8KKwl2YWwgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfWEdfU1RBVEUpKTsKKwlpZiAodmFsID09IGFkYXB0ZXItPmFody5xZ19saW5rc3VwKQorCQlyZXR1cm47CisKKwlxZ19saW5rc3VwID0gYWRhcHRlci0+YWh3LnFnX2xpbmtzdXA7CisJYWRhcHRlci0+YWh3LnFnX2xpbmtzdXAgPSB2YWw7CisJRFBSSU5USygxLCBJTkZPLCAiJXM6IGxpbmsgdXBkYXRlIDB4JTA4eFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJdmFsKTsKKwlmb3IgKHBvcnRubyA9IDA7IHBvcnRubyA8IE5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUzsgcG9ydG5vKyspIHsKKwkJbGlua3VwID0gdmFsICYgMTsKKwkJaWYgKGxpbmt1cCAhPSAocWdfbGlua3N1cCAmIDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUE9SVCAlZCBsaW5rICVzXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnRubywKKwkJCSAgICAgICAoKGxpbmt1cCA9PSAwKSA/ICJkb3duIiA6ICJ1cCIpKTsKKwkJCW5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhhZGFwdGVyLCBwb3J0bm8sIGxpbmt1cCk7CisJCQlpZiAobGlua3VwKQorCQkJCW5ldHhlbl9uaWNfc2V0X2xpbmtfcGFyYW1ldGVycyhhZGFwdGVyLT4KKwkJCQkJCQkgICAgICAgcG9ydFtwb3J0bm9dKTsKKworCQl9CisJCXZhbCA9IHZhbCA+PiAxOworCQlxZ19saW5rc3VwID0gcWdfbGlua3N1cCA+PiAxOworCX0KKworCWFkYXB0ZXItPnN0YXRzLm90aGVyaW50cysrOworCit9CisKK3ZvaWQgbmV0eGVuX25pY19nYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwluZXR4ZW5fbmljX2lzcl9vdGhlcihhZGFwdGVyKTsKK30KKwordm9pZCBuZXR4ZW5fbmljX3hnYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+cG9ydFswXS0+bmV0ZGV2OworCXUzMiB2YWw7CisKKwkvKiBXSU5ET1cgPSAxICovCisJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1hHX1NUQVRFKSk7CisKKwlpZiAoYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9PSAxICYmIHZhbCAhPSBYR19MSU5LX1VQKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyBkb3duXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKwkJYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9IDA7CisJCS8qIHJlYWQgdHdpY2UgdG8gY2xlYXIgc3RpY2t5IGJpdHMgKi8KKwkJLyogV0lORE9XID0gMCAqLworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwpOworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwpOworCisJCWlmICgodmFsICYgMHhmZmIpICE9IDB4ZmZiKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBJU1I6IFN5bmMvQWxpZ24gQkFEOiAweCUwOHhcbiIsCisJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgdmFsKTsKKwkJfQorCX0gZWxzZSBpZiAoYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9PSAwICYmIHZhbCA9PSBYR19MSU5LX1VQKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyB1cFxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSk7CisJCWFkYXB0ZXItPmFody54Z19saW5rdXAgPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2I2NjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC0wLDAgKzEsMTE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKiAKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqIAorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqICBNYWluIHNvdXJjZSBmaWxlIGZvciBOZXRYZW4gTklDIERyaXZlciBvbiBMaW51eAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfaHcuaCIKKworI2luY2x1ZGUgIm5ldHhlbl9uaWMuaCIKKyNkZWZpbmUgREVGSU5FX0dMT0JBTF9SRUNWX0NSQgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfcGhhbl9yZWcuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2lvY3RsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2RlZmluZSBQSEFOX1ZFTkRPUl9JRCAweDQwNDAKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRYZW4gTXVsdGkgcG9ydCAoMS8xMCkgR2lnYWJpdCBOZXR3b3JrIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oTkVUWEVOX05JQ19MSU5VWF9WRVJTSU9OSUQpOworCitjaGFyIG5ldHhlbl9uaWNfZHJpdmVyX25hbWVbXSA9ICJuZXR4ZW4iOworc3RhdGljIGNoYXIgbmV0eGVuX25pY19kcml2ZXJfc3RyaW5nW10gPSAiTmV0WGVuIE5ldHdvcmsgRHJpdmVyIHZlcnNpb24gIgorICAgIE5FVFhFTl9OSUNfTElOVVhfVkVSU0lPTklEOworCisjZGVmaW5lIE5FVFhFTl9ORVRERVZfV0VJR0hUIDEyMAorI2RlZmluZSBORVRYRU5fQURBUFRFUl9VUF9NQUdJQyA3NzcKKyNkZWZpbmUgTkVUWEVOX05JQ19QRUdfVFVORSAwCisKKy8qIExvY2FsIGZ1bmN0aW9ucyB0byBOZXRYZW4gTklDIGRyaXZlciAqLworc3RhdGljIGludCBfX2RldmluaXQgbmV0eGVuX25pY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuZXR4ZW5fbmljX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaW50IG5ldHhlbl9uaWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgbmV0eGVuX25pY194bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgbmV0eGVuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBuZXR4ZW5fdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIHZvaWQgbmV0eGVuX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCBuZXR4ZW5faGFuZGxlX2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IG5ldHhlbl9uaWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IG5ldHhlbl9uaWNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCk7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIG5ldHhlbl9uaWNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworI2VuZGlmCitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0eGVuX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSk7CisKKy8qICBQQ0kgRGV2aWNlIElEIFRhYmxlICAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5ldHhlbl9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX0RFVklDRSgweDQwNDAsIDB4MDAwMSl9LAorCXtQQ0lfREVWSUNFKDB4NDA0MCwgMHgwMDAyKX0sCisJe1BDSV9ERVZJQ0UoMHg0MDQwLCAweDAwMDMpfSwKKwl7UENJX0RFVklDRSgweDQwNDAsIDB4MDAwNCl9LAorCXtQQ0lfREVWSUNFKDB4NDA0MCwgMHgwMDA1KX0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5ldHhlbl9wY2lfdGJsKTsKKworLyoKKyAqIG5ldHhlbl9uaWNfcHJvYmUoKQorICoKKyAqIFRoZSBMaW51eCBzeXN0ZW0gd2lsbCBpbnZva2UgdGhpcyBhZnRlciBpZGVudGlmeWluZyB0aGUgdmVuZG9yIElEIGFuZAorICogZGV2aWNlIElkIGluIHRoZSBwY2lfdGJsIHN1cHBvcnRlZCBieSB0aGlzIG1vZHVsZS4KKyAqCisgKiBBIHF1YWQgcG9ydCBjYXJkIGhhcyBvbmUgb3BlcmF0aW9uYWwgUENJIGNvbmZpZyBzcGFjZSwgKGZ1bmN0aW9uIDApLAorICogd2hpY2ggaXMgdXNlZCB0byBhY2Nlc3MgYWxsIGZvdXIgcG9ydHMuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgaW5pdGlhbGl6ZSB0aGUgYWRhcHRlciwgYW5kIHNldHVwIHRoZSBnbG9iYWwgcGFyYW1ldGVycworICogYWxvbmcgd2l0aCB0aGUgcG9ydCdzIHNwZWNpZmljIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK25ldHhlbl9uaWNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IE5VTEw7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBOVUxMOworCXU4ICptZW1fcHRyMCA9IE5VTEw7CisJdTggKm1lbV9wdHIxID0gTlVMTDsKKwl1OCAqbWVtX3B0cjIgPSBOVUxMOworCisJdW5zaWduZWQgbG9uZyBtZW1fYmFzZSwgbWVtX2xlbjsKKwlpbnQgcGNpX3VzaW5nX2RhYywgaSwgZXJyOworCWludCByaW5nOworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9IE5VTEw7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jdHggKnJjdl9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgKmNtZF9idWZfYXJyID0gTlVMTDsKKwl1NjQgbWFjX2FkZHJbRkxBU0hfTlVNX1BPUlRTICsgMV07CisJaW50IHZhbGlkX21hYzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIFxuIiwgbmV0eGVuX25pY19kcml2ZXJfc3RyaW5nKTsKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSkpKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJaWYgKChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSA9PSAwKSAmJgorCSAgICAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSA9PSAwKSkKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJZWxzZSB7CisJCWlmICgoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHx8CisJCSAgICAoZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpCisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisKKwkJcGNpX3VzaW5nX2RhYyA9IDA7CisJfQorCisJLyogcmVtYXAgcGh5cyBhZGRyZXNzICovCisJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CS8qIDAgaXMgZm9yIEJBUiAwICovCisJbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwkvKiAxMjggTWVnIG9mIG1lbW9yeSAqLworCW1lbV9wdHIwID0gaW9yZW1hcChtZW1fYmFzZSwgRklSU1RfUEFHRV9HUk9VUF9TSVpFKTsKKwltZW1fcHRyMSA9CisJICAgIGlvcmVtYXAobWVtX2Jhc2UgKyBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCwgU0VDT05EX1BBR0VfR1JPVVBfU0laRSk7CisJbWVtX3B0cjIgPQorCSAgICBpb3JlbWFwKG1lbV9iYXNlICsgVEhJUkRfUEFHRV9HUk9VUF9TVEFSVCwgVEhJUkRfUEFHRV9HUk9VUF9TSVpFKTsKKworCWlmICgobWVtX3B0cjAgPT0gMFVMKSB8fCAobWVtX3B0cjEgPT0gMFVMKSB8fCAobWVtX3B0cjIgPT0gMFVMKSkgeworCQlEUFJJTlRLKDEsIEVSUiwKKwkJCSJDYW5ub3QgcmVtYXAgYWRhcHRlciBtZW1vcnkgYWJvcnRpbmcuOiIKKwkJCSIwIC0+ICVwLCAxIC0+ICVwLCAyIC0+ICVwXG4iLAorCQkJbWVtX3B0cjAsIG1lbV9wdHIxLCBtZW1fcHRyMik7CisKKwkJZXJyID0gLUVJTzsKKwkJaWYgKG1lbV9wdHIwKQorCQkJaW91bm1hcChtZW1fcHRyMCk7CisJCWlmIChtZW1fcHRyMSkKKwkJCWlvdW5tYXAobWVtX3B0cjEpOworCQlpZiAobWVtX3B0cjIpCisJCQlpb3VubWFwKG1lbV9wdHIyKTsKKworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisvKgorICogICAgICBBbGxvY2F0ZSBhIGFkYXB0ZXIgc3RydWN0dXJlIHdoaWNoIHdpbGwgbWFuYWdlIGFsbCB0aGUgaW5pdGlhbGl6YXRpb24KKyAqICAgICAgYXMgd2VsbCBhcyB0aGUgY29tbW9uIHJlc291cmNlcyBmb3IgYWxsIHBvcnRzLi4uCisgKiAgICAgIGFsbCB0aGUgcG9ydHMgd2lsbCBoYXZlIHBvaW50ZXIgdG8gdGhpcyBhZGFwdGVyIGFzIHdlbGwgYXMgQWRhcHRlcgorICogICAgICB3aWxsIGhhdmUgcG9pbnRlcnMgb2YgYWxsIHRoZSBwb3J0cyBzdHJ1Y3R1cmVzLgorICovCisKKwkvKiBPbmUgYWRhcHRlciBzdHJ1Y3R1cmUgZm9yIGFsbCA0IHBvcnRzLi4uLiAgICovCisJYWRhcHRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciksIEdGUF9LRVJORUwpOworCWlmIChhZGFwdGVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIGFkYXB0ZXIgbWVtb3J5OiVkXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJICAgICAgIChpbnQpc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYWRhcHRlcikpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCA9IE1BWF9DTURfREVTQ1JJUFRPUlM7CisJYWRhcHRlci0+bWF4X3J4X2Rlc2NfY291bnQgPSBNQVhfUkNWX0RFU0NSSVBUT1JTOworCWFkYXB0ZXItPm1heF9qdW1ib19yeF9kZXNjX2NvdW50ID0gTUFYX0pVTUJPX1JDVl9ERVNDUklQVE9SUzsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhZGFwdGVyKTsKKworCWNtZF9idWZfYXJyID0gKHN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqKXZtYWxsb2MoVFhfUklOR1NJWkUpOworCWlmIChjbWRfYnVmX2FyciA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2FkYXB0ZXI7CisJfQorCW1lbXNldChjbWRfYnVmX2FyciwgMCwgVFhfUklOR1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9SQ1ZfQ1RYOyArK2kpIHsKKwkJcmVjdl9jdHggPSAmYWRhcHRlci0+cmVjdl9jdHhbaV07CisJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykgeworCQkJcmN2X2Rlc2MgPSAmcmVjdl9jdHgtPnJjdl9kZXNjW3JpbmddOworCQkJc3dpdGNoIChSQ1ZfREVTQ19UWVBFKHJpbmcpKSB7CisJCQljYXNlIFJDVl9ERVNDX05PUk1BTDoKKwkJCQlyY3ZfZGVzYy0+bWF4X3J4X2Rlc2NfY291bnQgPQorCQkJCSAgICBhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudDsKKwkJCQlyY3ZfZGVzYy0+ZmxhZ3MgPSBSQ1ZfREVTQ19OT1JNQUw7CisJCQkJcmN2X2Rlc2MtPmRtYV9zaXplID0gUlhfRE1BX01BUF9MRU47CisJCQkJcmN2X2Rlc2MtPnNrYl9zaXplID0gTUFYX1JYX0JVRkZFUl9MRU5HVEg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkNWX0RFU0NfSlVNQk86CisJCQkJcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50ID0KKwkJCQkgICAgYWRhcHRlci0+bWF4X2p1bWJvX3J4X2Rlc2NfY291bnQ7CisJCQkJcmN2X2Rlc2MtPmZsYWdzID0gUkNWX0RFU0NfSlVNQk87CisJCQkJcmN2X2Rlc2MtPmRtYV9zaXplID0gUlhfSlVNQk9fRE1BX01BUF9MRU47CisJCQkJcmN2X2Rlc2MtPnNrYl9zaXplID0gTUFYX1JYX0pVTUJPX0JVRkZFUl9MRU5HVEg7CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJCXJjdl9kZXNjLT5yeF9idWZfYXJyID0gKHN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyICopCisJCQkgICAgdm1hbGxvYyhSQ1ZfQlVGRlNJWkUpOworCisJCQlpZiAocmN2X2Rlc2MtPnJ4X2J1Zl9hcnIgPT0gTlVMTCkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBlcnJfb3V0X2ZyZWVfcnhfYnVmZmVyOworCQkJfQorCQkJbWVtc2V0KHJjdl9kZXNjLT5yeF9idWZfYXJyLCAwLCBSQ1ZfQlVGRlNJWkUpOworCQl9CisKKwl9CisKKwlhZGFwdGVyLT5vcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0eGVuX2Rydm9wcyksIEdGUF9LRVJORUwpOworCWlmIChhZGFwdGVyLT5vcHMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlci0+b3BzOiVkXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJICAgICAgIChpbnQpc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYWRhcHRlcikpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9yeF9idWZmZXI7CisJfQorCisJYWRhcHRlci0+Y21kX2J1Zl9hcnIgPSBjbWRfYnVmX2FycjsKKwlhZGFwdGVyLT5haHcucGNpX2Jhc2UwID0gbWVtX3B0cjA7CisJYWRhcHRlci0+YWh3LnBjaV9iYXNlMSA9IG1lbV9wdHIxOworCWFkYXB0ZXItPmFody5wY2lfYmFzZTIgPSBtZW1fcHRyMjsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOworI2lmZGVmIENPTkZJR19JQTY0CisJbmV0eGVuX3Bpbml0X2Zyb21fcm9tKGFkYXB0ZXIsIDApOworCXVkZWxheSg1MDApOworCW5ldHhlbl9sb2FkX2Zpcm13YXJlKGFkYXB0ZXIpOworI2VuZGlmCisKKwkvKiBpbml0aWFsaXplIHRoZSBidWZmZXJzIGluIGFkYXB0ZXIgKi8KKwluZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX3N3KGFkYXB0ZXIpOworCS8qCisJICogU2V0IHRoZSBDUkIgd2luZG93IHRvIGludmFsaWQuIElmIGFueSByZWdpc3RlciBpbiB3aW5kb3cgMCBpcworCSAqIGFjY2Vzc2VkIGl0IHNob3VsZCBzZXQgdGhlIHdpbmRvdyB0byAwIGFuZCB0aGVuIHJlc2V0IGl0IHRvIDEuCisJICovCisJYWRhcHRlci0+Y3Vycl93aW5kb3cgPSAyNTU7CisJLyoKKwkgKiAgQWRhcHRlciBpbiBvdXIgY2FzZSBpcyBxdWFkIHBvcnQgc28gaW5pdGlhbGl6ZSBpdCBiZWZvcmUKKwkgKiAgaW5pdGlhbGl6aW5nIHRoZSBwb3J0cworCSAqLworCW5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfaHcoYWRhcHRlcik7CS8qIGluaXRpYWxpemUgdGhlIGFkYXB0ZXIgKi8KKworCW5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb3BzKGFkYXB0ZXIpOworCisJaW5pdF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOworCWFkYXB0ZXItPmFody54Z19saW5rdXAgPSAwOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gJm5ldHhlbl93YXRjaGRvZzsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKKwlJTklUX1dPUksoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2ssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpbmV0eGVuX3dhdGNoZG9nX3Rhc2ssIGFkYXB0ZXIpOworCWFkYXB0ZXItPmFody5wZGV2ID0gcGRldjsKKwlhZGFwdGVyLT5wcm9jX2NtZF9idWZfY291bnRlciA9IDA7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKTsKKworCWlmIChwY2lfZW5hYmxlX21zaShwZGV2KSkgeworCQlhZGFwdGVyLT5mbGFncyAmPSB+TkVUWEVOX05JQ19NU0lfRU5BQkxFRDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBNU0kgaW50ZXJydXB0IgorCQkgICAgICAgIiBlcnJvclxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJfSBlbHNlCisJCWFkYXB0ZXItPmZsYWdzIHw9IE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQ7CisKKwlpZiAobmV0eGVuX2lzX2ZsYXNoX3N1cHBvcnRlZChhZGFwdGVyKSA9PSAwICYmCisJICAgIG5ldHhlbl9nZXRfZmxhc2hfbWFjX2FkZHIoYWRhcHRlciwgbWFjX2FkZHIpID09IDApCisJCXZhbGlkX21hYyA9IDE7CisJZWxzZQorCQl2YWxpZF9tYWMgPSAwOworCisJLyoKKwkgKiBJbml0aWFsaXplIGFsbCB0aGUgQ1JCIHJlZ2lzdGVycyBoZXJlLgorCSAqLworCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVCkpOworCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EX0NPTlNVTUVSX09GRlNFVCkpOworCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfSE9TVF9DTURfQUREUl9MTykpOworCisJLyogVW5sb2NrIHRoZSBIVywgcHJvbXB0aW5nIHRoZSBib290IHNlcXVlbmNlICovCisJd3JpdGVsKDEsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSkpOworCisJLyogSGFuZHNoYWtlIHdpdGggdGhlIGNhcmQgYmVmb3JlIHdlIHJlZ2lzdGVyIHRoZSBkZXZpY2VzLiAqLworCW5ldHhlbl9waGFudG9tX2luaXQoYWRhcHRlciwgTkVUWEVOX05JQ19QRUdfVFVORSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBhbGwgdGhlIHBvcnRzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+YWh3Lm1heF9wb3J0czsgaSsrKSB7CisJCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0eGVuX3BvcnQpKTsKKwkJaWYgKCFuZXRkZXYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXRkZXYgZm9yIHBvcnQiCisJCQkgICAgICAgIiAlZFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgaSArIDEpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCQl9CisKKwkJU0VUX01PRFVMRV9PV05FUihuZXRkZXYpOworCQlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJCXBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCQlwb3J0LT5uZXRkZXYgPSBuZXRkZXY7CisJCXBvcnQtPnBkZXYgPSBwZGV2OworCQlwb3J0LT5hZGFwdGVyID0gYWRhcHRlcjsKKwkJcG9ydC0+cG9ydG51bSA9IGk7CS8qIEdpZ2FiaXQgcG9ydCBudW1iZXIgZnJvbSAwLTMgKi8KKworCQluZXRkZXYtPm9wZW4gPSBuZXR4ZW5fbmljX29wZW47CisJCW5ldGRldi0+c3RvcCA9IG5ldHhlbl9uaWNfY2xvc2U7CisJCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gbmV0eGVuX25pY194bWl0X2ZyYW1lOworCQluZXRkZXYtPmdldF9zdGF0cyA9IG5ldHhlbl9uaWNfZ2V0X3N0YXRzOworCQluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG5ldHhlbl9uaWNfc2V0X211bHRpOworCQluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9IG5ldHhlbl9uaWNfc2V0X21hYzsKKwkJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gbmV0eGVuX25pY19jaGFuZ2VfbXR1OworCQluZXRkZXYtPmRvX2lvY3RsID0gbmV0eGVuX25pY19pb2N0bDsKKwkJbmV0ZGV2LT50eF90aW1lb3V0ID0gbmV0eGVuX3R4X3RpbWVvdXQ7CisJCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWjsKKworCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmbmV0eGVuX25pY19ldGh0b29sX29wcyk7CisJCW5ldGRldi0+cG9sbCA9IG5ldHhlbl9uaWNfcG9sbDsKKwkJbmV0ZGV2LT53ZWlnaHQgPSBORVRYRU5fTkVUREVWX1dFSUdIVDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCQluZXRkZXYtPnBvbGxfY29udHJvbGxlciA9IG5ldHhlbl9uaWNfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisJCS8qIFNjYXR0ZXJHYXRoZXIgc3VwcG9ydCAqLworCQluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRzsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisKKwkJaWYgKHBjaV91c2luZ19kYWMpCisJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCQlpZiAodmFsaWRfbWFjKSB7CisJCQl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikmbWFjX2FkZHJbaV07CisJCQluZXRkZXYtPmRldl9hZGRyWzBdID0gKihwICsgNSk7CisJCQluZXRkZXYtPmRldl9hZGRyWzFdID0gKihwICsgNCk7CisJCQluZXRkZXYtPmRldl9hZGRyWzJdID0gKihwICsgMyk7CisJCQluZXRkZXYtPmRldl9hZGRyWzNdID0gKihwICsgMik7CisJCQluZXRkZXYtPmRldl9hZGRyWzRdID0gKihwICsgMSk7CisJCQluZXRkZXYtPmRldl9hZGRyWzVdID0gKihwICsgMCk7CisKKwkJCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgbmV0ZGV2LT5kZXZfYWRkciwKKwkJCSAgICAgICBuZXRkZXYtPmFkZHJfbGVuKTsKKwkJCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCYWQgTUFDIGFkZHJlc3MgIgorCQkJCSAgICAgICAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAorCQkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQkJCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzBdLAorCQkJCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzFdLAorCQkJCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzJdLAorCQkJCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzNdLAorCQkJCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzRdLAorCQkJCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzVdKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGFkYXB0ZXItPm9wcy0+bWFjYWRkcl9zZXQpCisJCQkJCWFkYXB0ZXItPm9wcy0+bWFjYWRkcl9zZXQocG9ydCwKKwkJCQkJCQkJICBuZXRkZXYtPgorCQkJCQkJCQkgIGRldl9hZGRyKTsKKwkJCX0KKwkJfQorCQlJTklUX1dPUksoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzaywKKwkJCSAgKHZvaWQgKCopKHZvaWQgKikpbmV0eGVuX3R4X3RpbWVvdXRfdGFzaywgbmV0ZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJCWlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkIHBvcnQgIyVkIgorCQkJICAgICAgICIgYWJvcnRpbmdcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGkgKyAxKTsKKwkJCWVyciA9IC1FSU87CisJCQlmcmVlX25ldGRldihuZXRkZXYpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCQl9CisJCWFkYXB0ZXItPnBvcnRfY291bnQrKzsKKwkJYWRhcHRlci0+YWN0aXZlX3BvcnRzID0gMDsKKwkJYWRhcHRlci0+cG9ydFtpXSA9IHBvcnQ7CisJfQorCisJLyoKKwkgKiBkZWxheSBhIHdoaWxlIHRvIGVuc3VyZSB0aGF0IHRoZSBQZWdzIGFyZSB1cCAmIHJ1bm5pbmcuCisJICogT3RoZXJ3aXNlLCB3ZSBtaWdodCBzZWUgc29tZSBmbGFreSBiZWhhdmlvdXIuCisJICovCisJdWRlbGF5KDEwMCk7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmFody5ib2FyZF90eXBlKSB7CisJY2FzZSBORVRYRU5fTklDX0dCRToKKwkJcHJpbnRrKCIlczogUVVBRCBHYkUgYm9hcmQgaW5pdGlhbGl6ZWRcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVFhFTl9OSUNfWEdCRToKKwkJcHJpbnRrKCIlczogWEdiRSBib2FyZCBpbml0aWFsaXplZFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCWJyZWFrOworCX0KKworCWFkYXB0ZXItPmRyaXZlcl9taXNtYXRjaCA9IDA7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX291dF9mcmVlX2RldjoKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKQorCQlwY2lfZGlzYWJsZV9tc2kocGRldik7CisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnBvcnRfY291bnQ7IGkrKykgeworCQlwb3J0ID0gYWRhcHRlci0+cG9ydFtpXTsKKwkJaWYgKChwb3J0KSAmJiAocG9ydC0+bmV0ZGV2KSkgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYocG9ydC0+bmV0ZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KHBvcnQtPm5ldGRldik7CisJCX0KKwl9CisJa2ZyZWUoYWRhcHRlci0+b3BzKTsKKworICAgICAgZXJyX291dF9mcmVlX3J4X2J1ZmZlcjoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JDVl9DVFg7ICsraSkgeworCQlyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eFtpXTsKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ107CisJCQlpZiAocmN2X2Rlc2MtPnJ4X2J1Zl9hcnIgIT0gTlVMTCkgeworCQkJCXZmcmVlKHJjdl9kZXNjLT5yeF9idWZfYXJyKTsKKwkJCQlyY3ZfZGVzYy0+cnhfYnVmX2FyciA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwl2ZnJlZShjbWRfYnVmX2Fycik7CisKKwlrZnJlZShhZGFwdGVyLT5wb3J0KTsKKworICAgICAgZXJyX291dF9mcmVlX2FkYXB0ZXI6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGFkYXB0ZXIpOworCisgICAgICBlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcChtZW1fcHRyMCk7CisJaW91bm1hcChtZW1fcHRyMSk7CisJaW91bm1hcChtZW1fcHRyMik7CisKKyAgICAgIGVycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyAgICAgIGVycl9vdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbmV0eGVuX25pY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eDsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2M7CisJaW50IGk7CisJaW50IGN0eGlkLCByaW5nOworCisJYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwluZXR4ZW5fbmljX3N0b3BfYWxsX3BvcnRzKGFkYXB0ZXIpOworCS8qIGxlYXZlIHRoZSBodyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyByZWJvb3QgKi8KKwluZXR4ZW5fcGluaXRfZnJvbV9yb20oYWRhcHRlciwgMCk7CisJdWRlbGF5KDUwMCk7CisJbmV0eGVuX2xvYWRfZmlybXdhcmUoYWRhcHRlcik7CisKKwlpZiAoKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkpCisJCW5ldHhlbl9uaWNfZGlzYWJsZV9pbnQoYWRhcHRlcik7CisKKwl1ZGVsYXkoNTAwKTsJCS8qIERlbGF5IGZvciBhIHdoaWxlIHRvIGRyYWluIHRoZSBETUEgZW5naW5lcyAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wb3J0X2NvdW50OyBpKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisJCWlmICgocG9ydCkgJiYgKHBvcnQtPm5ldGRldikpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBvcnQtPm5ldGRldik7CisJCQlmcmVlX25ldGRldihwb3J0LT5uZXRkZXYpOworCQl9CisJfQorCisJaWYgKChhZGFwdGVyLT5mbGFncyAmIE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQpKQorCQlwY2lfZGlzYWJsZV9tc2kocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlmIChhZGFwdGVyLT5pc191cCA9PSBORVRYRU5fQURBUFRFUl9VUF9NQUdJQykKKwkJbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCisJaW91bm1hcChhZGFwdGVyLT5haHcucGNpX2Jhc2UwKTsKKwlpb3VubWFwKGFkYXB0ZXItPmFody5wY2lfYmFzZTEpOworCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMik7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWZvciAoY3R4aWQgPSAwOyBjdHhpZCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eGlkKSB7CisJCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2N0eGlkXTsKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ107CisJCQlmb3IgKGkgPSAwOyBpIDwgcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50OyArK2kpIHsKKwkJCQlidWZmZXIgPSAmKHJjdl9kZXNjLT5yeF9idWZfYXJyW2ldKTsKKwkJCQlpZiAoYnVmZmVyLT5zdGF0ZSA9PSBORVRYRU5fQlVGRkVSX0ZSRUUpCisJCQkJCWNvbnRpbnVlOworCQkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVmZmVyLT5kbWEsCisJCQkJCQkgcmN2X2Rlc2MtPmRtYV9zaXplLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJaWYgKGJ1ZmZlci0+c2tiICE9IE5VTEwpCisJCQkJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlci0+c2tiKTsKKwkJCX0KKwkJCXZmcmVlKHJjdl9kZXNjLT5yeF9idWZfYXJyKTsKKwkJfQorCX0KKworCXZmcmVlKGFkYXB0ZXItPmNtZF9idWZfYXJyKTsKKwlrZnJlZShhZGFwdGVyLT5vcHMpOworCWtmcmVlKGFkYXB0ZXIpOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQorICogQHJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgbmV0eGVuX25pY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBlcnIgPSAwOworCWludCBjdHgsIHJpbmc7CisKKwlpZiAoYWRhcHRlci0+aXNfdXAgIT0gTkVUWEVOX0FEQVBURVJfVVBfTUFHSUMpIHsKKwkJZXJyID0gbmV0eGVuX2luaXRfZmlybXdhcmUoYWRhcHRlcik7CisJCWlmIChlcnIgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gaW5pdCBmaXJtd2FyZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQluZXR4ZW5fbmljX2ZsYXNoX3ByaW50KGFkYXB0ZXIpOworCisJCS8qIHNldHVwIGFsbCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgUGhhbnRvbS4uLiAqLworCQkvKiB0aGlzIGluY2x1ZGUgdGhlIGRlc2NyaXB0b3JzIGZvciByY3YsIHR4LCBhbmQgc3RhdHVzICovCisJCW5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoYWRhcHRlcik7CisJCWVyciA9IG5ldHhlbl9uaWNfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIHNldHRpbmcgaHcgcmVzb3VyY2VzOiVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChhZGFwdGVyLT5vcHMtPmluaXRfcG9ydAorCQkgICAgJiYgYWRhcHRlci0+b3BzLT5pbml0X3BvcnQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgcG9ydCAlZFxuIiwKKwkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBwb3J0LT5wb3J0bnVtKTsKKwkJCW5ldHhlbl9mcmVlX2h3X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChhZGFwdGVyLT5vcHMtPmluaXRfbml1KQorCQkJYWRhcHRlci0+b3BzLT5pbml0X25pdShhZGFwdGVyKTsKKwkJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKKwkJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykKKwkJCQluZXR4ZW5fcG9zdF9yeF9idWZmZXJzKGFkYXB0ZXIsIGN0eCwgcmluZyk7CisJCX0KKwkJYWRhcHRlci0+aXNfdXAgPSBORVRYRU5fQURBUFRFUl9VUF9NQUdJQzsKKwl9CisJYWRhcHRlci0+YWN0aXZlX3BvcnRzKys7CisJaWYgKGFkYXB0ZXItPmFjdGl2ZV9wb3J0cyA9PSAxKSB7CisJCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPmFody5wZGV2LT5pcnEsICZuZXR4ZW5faW50ciwKKwkJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwgbmV0ZGV2LT5uYW1lLAorCQkJCSAgYWRhcHRlcik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicmVxdWVzdF9pcnEgZmFpbGVkIHdpdGg6ICVkXG4iLCBlcnIpOworCQkJYWRhcHRlci0+YWN0aXZlX3BvcnRzLS07CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWFkYXB0ZXItPmlycSA9IGFkYXB0ZXItPmFody5wZGV2LT5pcnE7CisJCWlmICghYWRhcHRlci0+ZHJpdmVyX21pc21hdGNoKQorCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7CisKKwkJbmV0eGVuX25pY19lbmFibGVfaW50KGFkYXB0ZXIpOworCX0KKworCS8qIERvbmUgaGVyZSBhZ2FpbiBzbyB0aGF0IGV2ZW4gaWYgcGhhbnRvbSBzdyBvdmVyd3JvdGUgaXQsCisJICogd2Ugc2V0IGl0ICovCisJaWYgKGFkYXB0ZXItPm9wcy0+bWFjYWRkcl9zZXQpCisJCWFkYXB0ZXItPm9wcy0+bWFjYWRkcl9zZXQocG9ydCwgbmV0ZGV2LT5kZXZfYWRkcik7CisJbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKHBvcnQpOworCisJbmV0eGVuX25pY19zZXRfbXVsdGkobmV0ZGV2KTsKKwlpZiAoIWFkYXB0ZXItPmRyaXZlcl9taXNtYXRjaCkKKwkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogbmV0eGVuX25pY19jbG9zZSAtIERpc2FibGVzIGEgbmV0d29yayBpbnRlcmZhY2UgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIGludCBuZXR4ZW5fbmljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBpLCBqOworCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqY21kX2J1ZmY7CisJc3RydWN0IG5ldHhlbl9za2JfZnJhZyAqYnVmZnJhZzsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJYWRhcHRlci0+YWN0aXZlX3BvcnRzLS07CisKKwlpZiAoIWFkYXB0ZXItPmFjdGl2ZV9wb3J0cykgeworCQluZXR4ZW5fbmljX2Rpc2FibGVfaW50KGFkYXB0ZXIpOworCQlpZiAoYWRhcHRlci0+aXJxKQorCQkJZnJlZV9pcnEoYWRhcHRlci0+aXJxLCBhZGFwdGVyKTsKKwkJY21kX2J1ZmYgPSBhZGFwdGVyLT5jbWRfYnVmX2FycjsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50OyBpKyspIHsKKwkJCWJ1ZmZyYWcgPSBjbWRfYnVmZi0+ZnJhZ19hcnJheTsKKwkJCWlmIChidWZmcmFnLT5kbWEpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHBvcnQtPnBkZXYsIGJ1ZmZyYWctPmRtYSwKKwkJCQkJCSBidWZmcmFnLT5sZW5ndGgsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJYnVmZnJhZy0+ZG1hID0gKHU2NCkgTlVMTDsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBjbWRfYnVmZi0+ZnJhZ19jb3VudDsgaisrKSB7CisJCQkJYnVmZnJhZysrOworCQkJCWlmIChidWZmcmFnLT5kbWEpIHsKKwkJCQkJcGNpX3VubWFwX3BhZ2UocG9ydC0+cGRldiwKKwkJCQkJCSAgICAgICBidWZmcmFnLT5kbWEsCisJCQkJCQkgICAgICAgYnVmZnJhZy0+bGVuZ3RoLAorCQkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlidWZmcmFnLT5kbWEgPSAodTY0KSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCS8qIEZyZWUgdGhlIHNrYiB3ZSByZWNlaXZlZCBpbiBuZXR4ZW5fbmljX3htaXRfZnJhbWUgKi8KKwkJCWlmIChjbWRfYnVmZi0+c2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoY21kX2J1ZmYtPnNrYik7CisJCQkJY21kX2J1ZmYtPnNrYiA9IE5VTEw7CisJCQl9CisJCQljbWRfYnVmZisrOworCQl9CisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY194bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5faGFyZHdhcmVfY29udGV4dCAqaHcgPSAmYWRhcHRlci0+YWh3OworCXVuc2lnbmVkIGludCBmaXJzdF9zZWdfbGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOworCXN0cnVjdCBuZXR4ZW5fc2tiX2ZyYWcgKmJ1ZmZyYWc7CisJdW5zaWduZWQgaW50IGk7CisKKwl1MzIgcHJvZHVjZXIgPSAwOworCXUzMiBzYXZlZF9wcm9kdWNlciA9IDA7CisJc3RydWN0IGNtZF9kZXNjX3R5cGUwICpod2Rlc2M7CisJaW50IGs7CisJc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICpwYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgdHJpZXMgPSAwOworCXN0YXRpYyBpbnQgZHJvcHBlZF9wYWNrZXQgPSAwOworCWludCBmcmFnX2NvdW50OworCXUzMiBsb2NhbF9wcm9kdWNlciA9IDA7CisJdTMyIG1heF90eF9kZXNjX2NvdW50ID0gMDsKKwl1MzIgbGFzdF9jbWRfY29uc3VtZXIgPSAwOworCWludCBub19vZl9kZXNjOworCisJcG9ydC0+c3RhdHMueG1pdGNhbGxlZCsrOworCWZyYWdfY291bnQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKworCWlmICh1bmxpa2VseShza2ItPmxlbiA8PSAwKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlwb3J0LT5zdGF0cy5iYWRza2JsZW4rKzsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlpZiAoZnJhZ19jb3VudCA+IE1BWF9CVUZGRVJTX1BFUl9DTUQpIHsKKwkJcHJpbnRrKCIlczogJXMgbmV0eGVuX25pY194bWl0X2ZyYW1lOiBmcmFnX2NvdW50ICglZCkiCisJCSAgICAgICAidG9vIGxhcmdlLCBjYW4gaGFuZGxlIG9ubHkgJWQgZnJhZ3NcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBuZXRkZXYtPm5hbWUsCisJCSAgICAgICBmcmFnX2NvdW50LCBNQVhfQlVGRkVSU19QRVJfQ01EKTsKKwkJcG9ydC0+c3RhdHMudHhkcm9wcGVkKys7CisJCWlmICgoKytkcm9wcGVkX3BhY2tldCAmIDB4ZmYpID09IDB4ZmYpCisJCQlwcmludGsoIiVzOiAlcyBkcm9wcHBlZCBwYWNrZXRzID0gJWRcbiIsCisJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lLAorCQkJICAgICAgIGRyb3BwZWRfcGFja2V0KTsKKworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCS8qCisJICogRXZlcnl0aGluZyBpcyBzZXQgdXAuIE5vdywgd2UganVzdCBuZWVkIHRvIHRyYW5zbWl0IGl0IG91dC4KKwkgKiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBjb3B5IHRoZSBjb250ZW50cyBvZiBidWZmZXIgb3ZlciB0bworCSAqIHJpZ2h0IHBsYWNlLiBMYXRlciBvbiwgdGhpcyBjYW4gYmUgb3B0aW1pemVkIG91dCBieSBkZS1jb3VwbGluZyB0aGUKKwkgKiBwcm9kdWNlciBpbmRleCBmcm9tIHRoZSBidWZmZXIgaW5kZXguCisJICovCisgICAgICByZXRyeV9nZXR0aW5nX3dpbmRvdzoKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOworCWlmIChhZGFwdGVyLT50b3RhbF90aHJlYWRzID09IE1BWF9YTUlUX1BST0RVQ0VSUykgeworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisJCS8qCisJCSAqIFlpZWxkIENQVQorCQkgKi8KKwkJaWYgKCFpbl9hdG9taWMoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCQkJY3B1X3JlbGF4KCk7CS8qVGhpcyBhIG5vcCBpbnN0ciBvbiBpMzg2ICovCisJCX0KKwkJZ290byByZXRyeV9nZXR0aW5nX3dpbmRvdzsKKwl9CisJbG9jYWxfcHJvZHVjZXIgPSBhZGFwdGVyLT5jbWRfcHJvZHVjZXI7CisJLyogVGhlcmUgNCBmcmFnbWVudHMgcGVyIGRlc2NyaXB0b3IgKi8KKwlub19vZl9kZXNjID0gKGZyYWdfY291bnQgKyAzKSA+PiAyOworCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9UU08pIHsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPiAwKSB7CisKKwkJCW5vX29mX2Rlc2MrKzsKKwkJCWlmICgoKHNrYi0+bmguaXBoKS0+aWhsICogc2l6ZW9mKHUzMikpICsKKwkJCSAgICAoKHNrYi0+aC50aCktPmRvZmYgKiBzaXplb2YodTMyKSkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSA+CisJCQkgICAgKHNpemVvZihzdHJ1Y3QgY21kX2Rlc2NfdHlwZTApIC0gTkVUX0lQX0FMSUdOKSkgeworCQkJCW5vX29mX2Rlc2MrKzsKKwkJCX0KKwkJfQorCX0KKwlrID0gYWRhcHRlci0+Y21kX3Byb2R1Y2VyOworCW1heF90eF9kZXNjX2NvdW50ID0gYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQ7CisJbGFzdF9jbWRfY29uc3VtZXIgPSBhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lcjsKKwlpZiAoKGsgKyBub19vZl9kZXNjKSA+PQorCSAgICAoKGxhc3RfY21kX2NvbnN1bWVyIDw9IGspID8gbGFzdF9jbWRfY29uc3VtZXIgKyBtYXhfdHhfZGVzY19jb3VudCA6CisJICAgICBsYXN0X2NtZF9jb25zdW1lcikpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOworCQlpZiAodHJpZXMgPT0gMCkgeworCQkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQkJbmV0eGVuX3Byb2Nlc3NfY21kX3JpbmcoKHVuc2lnbmVkIGxvbmcpYWRhcHRlcik7CisJCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJCSsrdHJpZXM7CisJCQlnb3RvIHJldHJ5X2dldHRpbmdfd2luZG93OworCQl9IGVsc2UgeworCQkJcG9ydC0+c3RhdHMubm9jbWRkZXNjcmlwdG9yKys7CisJCQlEUFJJTlRLKEVSUiwgIk5vIGNvbW1hbmQgZGVzY3JpcHRvcnMgYXZhaWxhYmxlLCIKKwkJCQkiIHByb2R1Y2VyID0gJWQsIGNvbnN1bWVyID0gJWQgY291bnQ9JWxsdSwiCisJCQkJIiBkcm9wcGluZyBwYWNrZXRcbiIsIHByb2R1Y2VyLAorCQkJCWFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyLAorCQkJCXBvcnQtPnN0YXRzLm5vY21kZGVzY3JpcHRvcik7CisKKwkJCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCQlwb3J0LT5mbGFncyB8PSBORVRYRU5fTkVUREVWX1NUQVRVUzsKKwkJCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwkJfQorCX0KKwlrID0gZ2V0X2luZGV4X3JhbmdlKGssIG1heF90eF9kZXNjX2NvdW50LCBub19vZl9kZXNjKTsKKwlhZGFwdGVyLT5jbWRfcHJvZHVjZXIgPSBrOworCWFkYXB0ZXItPnRvdGFsX3RocmVhZHMrKzsKKwlhZGFwdGVyLT5udW1fdGhyZWFkcysrOworCisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOworCS8qIENvcHkgdGhlIGRlc2NyaXB0b3JzIGludG8gdGhlIGhhcmR3YXJlICAgICovCisJcHJvZHVjZXIgPSBsb2NhbF9wcm9kdWNlcjsKKwlzYXZlZF9wcm9kdWNlciA9IHByb2R1Y2VyOworCWh3ZGVzYyA9ICZody0+Y21kX2Rlc2NfaGVhZFtwcm9kdWNlcl07CisJbWVtc2V0KGh3ZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkpOworCS8qIFRha2Ugc2tiLT5kYXRhIGl0c2VsZiAqLworCXBidWYgPSAmYWRhcHRlci0+Y21kX2J1Zl9hcnJbcHJvZHVjZXJdOworCWlmICgobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVFNPKSAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID4gMCkgeworCQlwYnVmLT5tc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCQlod2Rlc2MtPm1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CisJfSBlbHNlIHsKKwkJcGJ1Zi0+bXNzID0gMDsKKwkJaHdkZXNjLT5tc3MgPSAwOworCX0KKwlwYnVmLT5ub19vZl9kZXNjcmlwdG9ycyA9IG5vX29mX2Rlc2M7CisJcGJ1Zi0+dG90YWxfbGVuZ3RoID0gc2tiLT5sZW47CisJcGJ1Zi0+c2tiID0gc2tiOworCXBidWYtPmNtZCA9IFRYX0VUSEVSX1BLVDsKKwlwYnVmLT5mcmFnX2NvdW50ID0gZnJhZ19jb3VudDsKKwlwYnVmLT5wb3J0ID0gcG9ydC0+cG9ydG51bTsKKwlidWZmcmFnID0gJnBidWYtPmZyYWdfYXJyYXlbMF07CisJYnVmZnJhZy0+ZG1hID0gcGNpX21hcF9zaW5nbGUocG9ydC0+cGRldiwgc2tiLT5kYXRhLCBmaXJzdF9zZWdfbGVuLAorCQkJCSAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCWJ1ZmZyYWctPmxlbmd0aCA9IGZpcnN0X3NlZ19sZW47CisJQ01EX0RFU0NfVE9UQUxfTEVOR1RIX1dSVChod2Rlc2MsIHNrYi0+bGVuKTsKKwlod2Rlc2MtPm51bV9vZl9idWZmZXJzID0gZnJhZ19jb3VudDsKKwlod2Rlc2MtPm9wY29kZSA9IFRYX0VUSEVSX1BLVDsKKworCUNNRF9ERVNDX1BPUlRfV1JUKGh3ZGVzYywgcG9ydC0+cG9ydG51bSk7CisJaHdkZXNjLT5idWZmZXIxX2xlbmd0aCA9IGNwdV90b19sZTE2KGZpcnN0X3NlZ19sZW4pOworCWh3ZGVzYy0+YWRkcl9idWZmZXIxID0gY3B1X3RvX2xlNjQoYnVmZnJhZy0+ZG1hKTsKKworCWZvciAoaSA9IDEsIGsgPSAxOyBpIDwgZnJhZ19jb3VudDsgaSsrLCBrKyspIHsKKwkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwkJaW50IGxlbiwgdGVtcF9sZW47CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCQlkbWFfYWRkcl90IHRlbXBfZG1hOworCisJCS8qIG1vdmUgdG8gbmV4dCBkZXNjLiBpZiB0aGVyZSBpcyBhIG5lZWQgKi8KKwkJaWYgKChpICYgMHgzKSA9PSAwKSB7CisJCQlrID0gMDsKKwkJCXByb2R1Y2VyID0gZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsCisJCQkJCQkgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50KTsKKwkJCWh3ZGVzYyA9ICZody0+Y21kX2Rlc2NfaGVhZFtwcm9kdWNlcl07CisJCQltZW1zZXQoaHdkZXNjLCAwLCBzaXplb2Yoc3RydWN0IGNtZF9kZXNjX3R5cGUwKSk7CisJCX0KKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQ7CisKKwkJdGVtcF9sZW4gPSBsZW47CisJCXRlbXBfZG1hID0gcGNpX21hcF9wYWdlKHBvcnQtPnBkZXYsIGZyYWctPnBhZ2UsIG9mZnNldCwKKwkJCQkJbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlidWZmcmFnKys7CisJCWJ1ZmZyYWctPmRtYSA9IHRlbXBfZG1hOworCQlidWZmcmFnLT5sZW5ndGggPSB0ZW1wX2xlbjsKKworCQlEUFJJTlRLKElORk8sICJmb3IgbG9vcC4gaT0lZCBrPSVkXG4iLCBpLCBrKTsKKwkJc3dpdGNoIChrKSB7CisJCWNhc2UgMDoKKwkJCWh3ZGVzYy0+YnVmZmVyMV9sZW5ndGggPSBjcHVfdG9fbGUxNih0ZW1wX2xlbik7CisJCQlod2Rlc2MtPmFkZHJfYnVmZmVyMSA9IGNwdV90b19sZTY0KHRlbXBfZG1hKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlod2Rlc2MtPmJ1ZmZlcjJfbGVuZ3RoID0gY3B1X3RvX2xlMTYodGVtcF9sZW4pOworCQkJaHdkZXNjLT5hZGRyX2J1ZmZlcjIgPSBjcHVfdG9fbGU2NCh0ZW1wX2RtYSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaHdkZXNjLT5idWZmZXIzX2xlbmd0aCA9IGNwdV90b19sZTE2KHRlbXBfbGVuKTsKKwkJCWh3ZGVzYy0+YWRkcl9idWZmZXIzID0gY3B1X3RvX2xlNjQodGVtcF9kbWEpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWh3ZGVzYy0+YnVmZmVyNF9sZW5ndGggPSB0ZW1wX2xlbjsKKwkJCWh3ZGVzYy0+YWRkcl9idWZmZXI0ID0gY3B1X3RvX2xlNjQodGVtcF9kbWEpOworCQkJYnJlYWs7CisJCX0KKwkJZnJhZysrOworCX0KKwlwcm9kdWNlciA9IGdldF9uZXh0X2luZGV4KHByb2R1Y2VyLCBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCk7CisKKwkvKiBtaWdodCBjaGFuZ2Ugb3Bjb2RlIHRvIFRYX1RDUF9MU08gKi8KKwluZXR4ZW5fdHNvX2NoZWNrKGFkYXB0ZXIsICZody0+Y21kX2Rlc2NfaGVhZFtzYXZlZF9wcm9kdWNlcl0sIHNrYik7CisKKwkvKiBGb3IgTFNPLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIE1BQy9JUC9UQ1AgaGVhZGVycyBpbnRvCisJICogdGhlIGRlc2NyaXB0b3IgcmluZworCSAqLworCWlmIChody0+Y21kX2Rlc2NfaGVhZFtzYXZlZF9wcm9kdWNlcl0ub3Bjb2RlID09IFRYX1RDUF9MU08pIHsKKwkJaW50IGhkcl9sZW4sIGZpcnN0X2hkcl9sZW4sIG1vcmVfaGRyOworCQloZHJfbGVuID0gaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdLnRvdGFsX2hkcl9sZW5ndGg7CisJCWlmIChoZHJfbGVuID4gKHNpemVvZihzdHJ1Y3QgY21kX2Rlc2NfdHlwZTApIC0gTkVUX0lQX0FMSUdOKSkgeworCQkJZmlyc3RfaGRyX2xlbiA9CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgLSBORVRfSVBfQUxJR047CisJCQltb3JlX2hkciA9IDE7CisJCX0gZWxzZSB7CisJCQlmaXJzdF9oZHJfbGVuID0gaGRyX2xlbjsKKwkJCW1vcmVfaGRyID0gMDsKKwkJfQorCQkvKiBjb3B5IHRoZSBNQUMvSVAvVENQIGhlYWRlcnMgdG8gdGhlIGNtZCBkZXNjcmlwdG9yIGxpc3QgKi8KKwkJaHdkZXNjID0gJmh3LT5jbWRfZGVzY19oZWFkW3Byb2R1Y2VyXTsKKworCQkvKiBjb3B5IHRoZSBmaXJzdCA2NCBieXRlcyAqLworCQltZW1jcHkoKCh2b2lkICopaHdkZXNjKSArIE5FVF9JUF9BTElHTiwKKwkJICAgICAgICh2b2lkICopKHNrYi0+ZGF0YSksIGZpcnN0X2hkcl9sZW4pOworCQlwcm9kdWNlciA9IGdldF9uZXh0X2luZGV4KHByb2R1Y2VyLCBtYXhfdHhfZGVzY19jb3VudCk7CisKKwkJaWYgKG1vcmVfaGRyKSB7CisJCQlod2Rlc2MgPSAmaHctPmNtZF9kZXNjX2hlYWRbcHJvZHVjZXJdOworCQkJLyogY29weSB0aGUgbmV4dCA2NCBieXRlcyAtIHNob3VsZCBiZSBlbm91Z2ggZXhjZXB0CisJCQkgKiBmb3IgcGF0aG9sb2dpY2FsIGNhc2UKKwkJCSAqLworCQkJbWVtY3B5KCh2b2lkICopaHdkZXNjLCAodm9pZCAqKShza2ItPmRhdGEpICsKKwkJCSAgICAgICBmaXJzdF9oZHJfbGVuLCBoZHJfbGVuIC0gZmlyc3RfaGRyX2xlbik7CisJCQlwcm9kdWNlciA9IGdldF9uZXh0X2luZGV4KHByb2R1Y2VyLCBtYXhfdHhfZGVzY19jb3VudCk7CisJCX0KKwl9CisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKKwlwb3J0LT5zdGF0cy50eGJ5dGVzICs9CisJICAgIENNRF9ERVNDX1RPVEFMX0xFTkdUSCgmaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdKTsKKwkvKiBDb2RlIHRvIHVwZGF0ZSB0aGUgYWRhcHRlciBjb25zaWRlcmluZyBob3cgbWFueSBwcm9kdWNlciB0aHJlYWRzCisJICAgYXJlIGN1cnJlbnRseSB3b3JraW5nICovCisJaWYgKCgtLWFkYXB0ZXItPm51bV90aHJlYWRzKSA9PSAwKSB7CisJCS8qIFRoaXMgaXMgdGhlIGxhc3QgdGhyZWFkICovCisJCXUzMiBjcmJfcHJvZHVjZXIgPSBhZGFwdGVyLT5jbWRfcHJvZHVjZXI7CisJCXdyaXRlbChjcmJfcHJvZHVjZXIsCisJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVCkpOworCQl3bWIoKTsKKwkJYWRhcHRlci0+dG90YWxfdGhyZWFkcyA9IDA7CisJfSBlbHNlIHsKKwkJdTMyIGNyYl9wcm9kdWNlciA9IDA7CisJCWNyYl9wcm9kdWNlciA9CisJCSAgICByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJICAoYWRhcHRlciwgQ1JCX0NNRF9QUk9EVUNFUl9PRkZTRVQpKTsKKwkJaWYgKGNyYl9wcm9kdWNlciA9PSBsb2NhbF9wcm9kdWNlcikgeworCQkJY3JiX3Byb2R1Y2VyID0gZ2V0X2luZGV4X3JhbmdlKGNyYl9wcm9kdWNlciwKKwkJCQkJCSAgICAgICBtYXhfdHhfZGVzY19jb3VudCwKKwkJCQkJCSAgICAgICBub19vZl9kZXNjKTsKKwkJCXdyaXRlbChjcmJfcHJvZHVjZXIsCisJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCSAgICBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVCkpOworCQkJd21iKCk7CisJCX0KKwl9CisKKwlwb3J0LT5zdGF0cy54bWl0ZmluaXNoZWQrKzsKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCURQUklOVEsoSU5GTywgIndyb3RlIENNRCBwcm9kdWNlciAleCB0byBwaGFudG9tXG4iLCBwcm9kdWNlcik7CisKKwlEUFJJTlRLKElORk8sICJEb25lLiBTZW5kXG4iKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgdm9pZCBuZXR4ZW5fd2F0Y2hkb2codW5zaWduZWQgbG9uZyB2KQoreworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKil2OworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2spOworfQorCitzdGF0aWMgdm9pZCBuZXR4ZW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgbmV0eGVuX3BvcnQgKiluZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisKKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworfQorCitzdGF0aWMgdm9pZCBuZXR4ZW5fdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gKHN0cnVjdCBuZXR4ZW5fcG9ydCAqKW5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaW50ayhLRVJOX0VSUiAiJXMgJXM6IHRyYW5zbWl0IHRpbWVvdXQsIHJlc2V0dGluZy5cbiIsCisJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+YWRhcHRlci0+bG9jaywgZmxhZ3MpOworCW5ldHhlbl9uaWNfY2xvc2UobmV0ZGV2KTsKKwluZXR4ZW5fbmljX29wZW4obmV0ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5hZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworfQorCitzdGF0aWMgaW50CituZXR4ZW5faGFuZGxlX2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJdTMyIHJldCA9IDA7CisKKwlEUFJJTlRLKElORk8sICJFbnRlcmVkIGhhbmRsZSBJU1JcbiIpOworCisJYWRhcHRlci0+c3RhdHMuaW50cysrOworCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKSkgeworCQlpbnQgY291bnQgPSAwOworCQl1MzIgbWFzazsKKwkJbmV0eGVuX25pY19kaXNhYmxlX2ludChhZGFwdGVyKTsKKwkJLyogV2luZG93ID0gMCBvciAxICovCisJCWRvIHsKKwkJCXdyaXRlbCgweGZmZmZmZmZmLCBQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLAorCQkJCQkJSVNSX0lOVF9UQVJHRVRfU1RBVFVTKSk7CisJCQltYXNrID0gcmVhZGwocGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIElTUl9JTlRfVkVDVE9SKSk7CisJCX0gd2hpbGUgKCgobWFzayAmIDB4ODApICE9IDApICYmICgrK2NvdW50IDwgMzIpKTsKKwkJaWYgKChtYXNrICYgMHg4MCkgIT0gMCkKKwkJCXByaW50aygiQ291bGQgbm90IGRpc2FibGUgaW50ZXJydXB0IGNvbXBsZXRlbHlcbiIpOworCisJfQorCWFkYXB0ZXItPnN0YXRzLmhvc3RpbnRzKys7CisKKwlpZiAobmV0eGVuX25pY19yeF9oYXNfd29yayhhZGFwdGVyKSB8fCBuZXR4ZW5fbmljX3R4X2hhc193b3JrKGFkYXB0ZXIpKSB7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpIHsKKwkJCS8qCisJCQkgKiBJbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IGRpc2FibGVkLgorCQkJICovCisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CisJCX0gZWxzZSB7CisJCQlzdGF0aWMgdW5zaWduZWQgaW50IGludGNvdW50ID0gMDsKKwkJCWlmICgoKytpbnRjb3VudCAmIDB4ZmZmKSA9PSAweGZmZikKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiVzOiAlcyBpbnRlcnJ1cHQgJWQgd2hpbGUgaW4gcG9sbFxuIiwKKwkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lLAorCQkJCSAgICAgICBpbnRjb3VudCk7CisJCX0KKwkJcmV0ID0gMTsKKwl9CisKKwlpZiAocmV0ID09IDApIHsKKwkJbmV0eGVuX25pY19lbmFibGVfaW50KGFkYXB0ZXIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBuZXR4ZW5faW50ciAtIEludGVycnVwdCBIYW5kbGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBkYXRhIHBvaW50cyB0byBhZGFwdGVyIHN0dWN0dXJlICh3aGljaCBtYXkgYmUgaGFuZGxpbmcgbW9yZSB0aGFuIDEgcG9ydAorICovCitpcnFyZXR1cm5fdCBuZXR4ZW5faW50cihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgaTsKKworCWlmICh1bmxpa2VseSghaXJxKSkgeworCQlyZXR1cm4gSVJRX05PTkU7CS8qIE5vdCBvdXIgaW50ZXJydXB0ICovCisJfQorCisJYWRhcHRlciA9IChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKilkYXRhOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBpKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisJCW5ldGRldiA9IHBvcnQtPm5ldGRldjsKKworCQkvKiBwcm9jZXNzIG91ciBzdGF0dXMgcXVldWUgKGZvciBhbGwgNCBwb3J0cykgKi8KKwkJbmV0eGVuX2hhbmRsZV9pbnQoYWRhcHRlciwgbmV0ZGV2KTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgbmV0eGVuX3BvcnQgKiluZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IHdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgbmV0ZGV2LT5xdW90YSk7CisJaW50IGRvbmUgPSAxOworCWludCBjdHg7CisJaW50IHRoaXNfd29ya19kb25lOworCisJRFBSSU5USyhJTkZPLCAicG9sbGluZyBmb3IgJWQgZGVzY3JpcHRvcnNcbiIsICpidWRnZXQpOworCXBvcnQtPnN0YXRzLnBvbGxlZCsrOworCisJYWRhcHRlci0+d29ya19kb25lID0gMDsKKwlmb3IgKGN0eCA9IDA7IGN0eCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eCkgeworCQkvKgorCQkgKiBGYWlybmVzcyBpc3N1ZS4gVGhpcyB3aWxsIGdpdmUgdW5kdWUgd2VpZ2h0IHRvIHRoZQorCQkgKiByZWNlaXZlIGNvbnRleHQgMC4KKwkJICovCisKKwkJLyoKKwkJICogVG8gYXZvaWQgc3RhcnZhdGlvbiwgd2UgZ2l2ZSBlYWNoIG9mIG91ciByZWNlaXZlcnMsCisJCSAqIGEgZnJhY3Rpb24gb2YgdGhlIHF1b3RhLiBTb21ldGltZXMsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IHdlCisJCSAqIGhhdmUgZW5vdWdoIHF1b3RhIHRvIHByb2Nlc3MgZXZlcnkgcGFja2V0LCBidXQgc2luY2UgYWxsIHRoZQorCQkgKiBwYWNrZXRzIGFyZSBvbiBvbmUgY29udGV4dCwgaXQgZ2V0cyBvbmx5IGhhbGYgb2YgdGhlIHF1b3RhLAorCQkgKiBhbmQgZW5kcyB1cCBub3QgcHJvY2Vzc2luZyBpdC4KKwkJICovCisJCXRoaXNfd29ya19kb25lID0gbmV0eGVuX3Byb2Nlc3NfcmN2X3JpbmcoYWRhcHRlciwgY3R4LAorCQkJCQkJCSB3b3JrX3RvX2RvIC8KKwkJCQkJCQkgTUFYX1JDVl9DVFgpOworCQlhZGFwdGVyLT53b3JrX2RvbmUgKz0gdGhpc193b3JrX2RvbmU7CisJfQorCisJbmV0ZGV2LT5xdW90YSAtPSBhZGFwdGVyLT53b3JrX2RvbmU7CisJKmJ1ZGdldCAtPSBhZGFwdGVyLT53b3JrX2RvbmU7CisKKwlpZiAoYWRhcHRlci0+d29ya19kb25lID49IHdvcmtfdG9fZG8KKwkgICAgJiYgbmV0eGVuX25pY19yeF9oYXNfd29yayhhZGFwdGVyKSAhPSAwKQorCQlkb25lID0gMDsKKworCW5ldHhlbl9wcm9jZXNzX2NtZF9yaW5nKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpOworCisJRFBSSU5USyhJTkZPLCAibmV3IHdvcmtfZG9uZTogJWQgd29ya190b19kbzogJWRcbiIsCisJCWFkYXB0ZXItPndvcmtfZG9uZSwgd29ya190b19kbyk7CisJaWYgKGRvbmUpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJbmV0eGVuX25pY19lbmFibGVfaW50KGFkYXB0ZXIpOworCX0KKworCXJldHVybiAhZG9uZTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuZXR4ZW5fbmljX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlkaXNhYmxlX2lycShhZGFwdGVyLT5pcnEpOworCW5ldHhlbl9pbnRyKGFkYXB0ZXItPmlycSwgYWRhcHRlcik7CisJZW5hYmxlX2lycShhZGFwdGVyLT5pcnEpOworfQorI2VuZGlmCisvKgorICogbmV0eGVuX25pY19pb2N0bCAoKSAgICBXZSBwcm92aWRlIHRoZSB0Y2wvcGhhbm1vbiBzdXBwb3J0IHRocm91Z2ggdGhlc2UKKyAqIGlvY3Rscy4KKyAqLworc3RhdGljIGludAorbmV0eGVuX25pY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIG5yX2J5dGVzID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJY2hhciBkZXZfbmFtZVtORVRYRU5fTklDX05BTUVfTEVOXTsKKworCURQUklOVEsoSU5GTywgImRvaW5nIGlvY3RsIGZvciAlc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTkVUWEVOX05JQ19DTUQ6CisJCWVyciA9IG5ldHhlbl9uaWNfZG9faW9jdGwoYWRhcHRlciwgKHZvaWQgKilpZnItPmlmcl9kYXRhLCBwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVFhFTl9OSUNfTkFNRToKKwkJRFBSSU5USyhJTkZPLCAiaW9jdGwgY21kIGZvciBOZXRYZW5cbiIpOworCQlpZiAoaWZyLT5pZnJfZGF0YSkgeworCQkJc3ByaW50ZihkZXZfbmFtZSwgIiVzLSVkIiwgTkVUWEVOX05JQ19OQU1FX1JTUCwKKwkJCQlwb3J0LT5wb3J0bnVtKTsKKwkJCW5yX2J5dGVzID0gY29weV90b191c2VyKChjaGFyICopaWZyLT5pZnJfZGF0YSwgZGV2X25hbWUsCisJCQkJCQlORVRYRU5fTklDX05BTUVfTEVOKTsKKwkJCWlmIChucl9ieXRlcykKKwkJCQllcnIgPSAtRUlPOworCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sICJpb2N0bCBjbWQgJXggbm90IHN1cHBvcnRlZFxuIiwgY21kKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuZXR4ZW5fZHJpdmVyID0geworCS5uYW1lID0gbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBuZXR4ZW5fcGNpX3RibCwKKwkucHJvYmUgPSBuZXR4ZW5fbmljX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChuZXR4ZW5fbmljX3JlbW92ZSkKK307CisKKy8qIERyaXZlciBSZWdpc3RyYXRpb24gb24gTmV0WGVuIGNhcmQgICAgKi8KKworc3RhdGljIGludCBfX2luaXQgbmV0eGVuX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbmV0eGVuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5ldHhlbl9pbml0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXR4ZW5fZXhpdF9tb2R1bGUodm9pZCkKK3sKKwkvKgorCSAqIFdhaXQgZm9yIHNvbWUgdGltZSB0byBhbGxvdyB0aGUgZG1hIHRvIGRyYWluLCBpZiBhbnkuCisJICovCisJbWRlbGF5KDUpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbmV0eGVuX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KG5ldHhlbl9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19uaXUuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX25pdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTBhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19uaXUuYwpAQCAtMCwwICsxLDg5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKiAKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqIAorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmV0d29yayBJbnRlcmZhY2UgVW5pdCBoL3cgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJuZXR4ZW5fbmljLmgiCisKKyNkZWZpbmUgTkVUWEVOX0dCX01BQ19TT0ZUX1JFU0VUCTB4ODAwMDAwMDAKKyNkZWZpbmUgTkVUWEVOX0dCX01BQ19SRVNFVF9QUk9UX0JMSyAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgTkVUWEVOX0dCX01BQ19FTkFCTEVfVFhfUlggICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgTkVUWEVOX0dCX01BQ19QQVVTRURfRlJNUyAgICAgIDB4MDAwMDAwMjAKKworc3RhdGljIGxvbmcgcGh5X2xvY2tfdGltZW91dCA9IDEwMDAwMDAwMDsKKworc3RhdGljIGlubGluZSBpbnQgcGh5X2xvY2sodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgZG9uZSA9IDAsIHRpbWVvdXQgPSAwOworCisJd2hpbGUgKCFkb25lKSB7CisJCWRvbmUgPSByZWFkbCgodm9pZCBfX2lvbWVtICopTkVUWEVOX1BDSUVfUkVHKFBDSUVfU0VNM19MT0NLKSk7CisJCWlmIChkb25lID09IDEpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgPj0gcGh5X2xvY2tfdGltZW91dCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXRpbWVvdXQrKzsKKwkJaWYgKCFpbl9hdG9taWMoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9CisKKwl3cml0ZWwoTkVUWEVOX1BIWV9MT0NLX0lELCAodm9pZCBfX2lvbWVtICopUEhZX0xPQ0tfRFJJVkVSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGh5X3VubG9jayh2b2lkKQoreworCXJlYWRsKCh2b2lkIF9faW9tZW0gKilORVRYRU5fUENJRV9SRUcoUENJRV9TRU0zX1VOTE9DSykpOworCXJldHVybiAwOworfQorCisvKiAKKyAqIG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkIC0gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEdiRSBQSFkgdmlhCisgKiBtaWkgbWFuYWdlbWVudCBpbnRlcmZhY2UuCisgKgorICogTm90ZTogVGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBnb2VzIHRocm91Z2ggcG9ydCAwLgorICoJSW5kaXZpZHVhbCBwaHlzIGFyZSBhZGRyZXNzZWQgYXMgZm9sbG93czoKKyAqIEBwYXJhbSBwaHkgIFsxNTo4XSAgcGh5IGlkCisgKiBAcGFyYW0gcmVnICBbNzowXSAgIHJlZ2lzdGVyIG51bWJlcgorICoKKyAqIEByZXR1cm5zICAwIG9uIHN1Y2Nlc3MKKyAqCSAgLTEgb24gZXJyb3IKKyAqCisgKi8KK2ludCBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGxvbmcgcGh5LAorCQkJICAgIGxvbmcgcmVnLCBfX2xlMzIgKiByZWFkdmFsKQoreworCWxvbmcgdGltZW91dCA9IDA7CisJbG9uZyByZXN1bHQgPSAwOworCWxvbmcgcmVzdG9yZSA9IDA7CisJX19sZTMyIGFkZHJlc3M7CisJX19sZTMyIGNvbW1hbmQ7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlMzIgbWFjX2NmZzA7CisKKwlpZiAocGh5X2xvY2soKSAhPSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIE1JSSBtZ210IGFsbCBnb2VzIHRocm91Z2ggcG9ydCAwIE1BQyBpbnRlcmZhY2UsCisJICogc28gaXQgY2Fubm90IGJlIGluIHJlc2V0CisJICovCisKKwlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKDApLAorCQkJCSAgJm1hY19jZmcwLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG5ldHhlbl9nYl9nZXRfc29mdF9yZXNldChtYWNfY2ZnMCkpIHsKKwkJX19sZTMyIHRlbXA7CisJCXRlbXAgPSAwOworCQluZXR4ZW5fZ2JfdHhfcmVzZXRfcGIodGVtcCk7CisJCW5ldHhlbl9nYl9yeF9yZXNldF9wYih0ZW1wKTsKKwkJbmV0eGVuX2diX3R4X3Jlc2V0X21hYyh0ZW1wKTsKKwkJbmV0eGVuX2diX3J4X3Jlc2V0X21hYyh0ZW1wKTsKKwkJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwKKwkJCQkJICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAoMCksCisJCQkJCSAgICZ0ZW1wLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQlyZXN0b3JlID0gMTsKKwl9CisKKwlhZGRyZXNzID0gMDsKKwluZXR4ZW5fZ2JfbWlpX21nbXRfcmVnX2FkZHIoYWRkcmVzcywgcmVnKTsKKwluZXR4ZW5fZ2JfbWlpX21nbXRfcGh5X2FkZHIoYWRkcmVzcywgcGh5KTsKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFIoMCksCisJCQkJICAgJmFkZHJlc3MsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwljb21tYW5kID0gMDsJCS8qIHR1cm4gb2ZmIGFueSBwcmlvciBhY3Rpdml0eSAqLworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkJCQkgICAmY29tbWFuZCwgNCkpCisJCXJldHVybiAtRUlPOworCS8qIHNlbmQgcmVhZCBjb21tYW5kICovCisJbmV0eGVuX2diX21paV9tZ210X3NldF9yZWFkX2N5Y2xlKGNvbW1hbmQpOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkJCQkgICAmY29tbWFuZCwgNCkpCisJCXJldHVybiAtRUlPOworCisJc3RhdHVzID0gMDsKKwlkbyB7CisJCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKKwkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKDApLAorCQkJCQkgICZzdGF0dXMsIDQpKQorCQkJcmV0dXJuIC1FSU87CisJCXRpbWVvdXQrKzsKKwl9IHdoaWxlICgobmV0eGVuX2dldF9nYl9taWlfbWdtdF9idXN5KHN0YXR1cykKKwkJICB8fCBuZXR4ZW5fZ2V0X2diX21paV9tZ210X25vdHZhbGlkKHN0YXR1cykpCisJCSAmJiAodGltZW91dCsrIDwgTkVUWEVOX05JVV9QSFlfV0FJVE1BWCkpOworCisJaWYgKHRpbWVvdXQgPCBORVRYRU5fTklVX1BIWV9XQUlUTUFYKSB7CisJCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKKwkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX1NUQVRVUygwKSwKKwkJCQkJICByZWFkdmFsLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQlyZXN1bHQgPSAwOworCX0gZWxzZQorCQlyZXN1bHQgPSAtMTsKKworCWlmIChyZXN0b3JlKQorCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLAorCQkJCQkgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMCgwKSwKKwkJCQkJICAgJm1hY19jZmcwLCA0KSkKKwkJCXJldHVybiAtRUlPOworCXBoeV91bmxvY2soKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiAKKyAqIG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZSAtIHdyaXRlIGEgcmVnaXN0ZXIgdG8gdGhlIEdiRSBQSFkgdmlhCisgKiBtaWkgbWFuYWdlbWVudCBpbnRlcmZhY2UuCisgKgorICogTm90ZTogVGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBnb2VzIHRocm91Z2ggcG9ydCAwLgorICoJSW5kaXZpZHVhbCBwaHlzIGFyZSBhZGRyZXNzZWQgYXMgZm9sbG93czoKKyAqIEBwYXJhbSBwaHkgICAgICBbMTU6OF0gIHBoeSBpZAorICogQHBhcmFtIHJlZyAgICAgIFs3OjBdICAgcmVnaXN0ZXIgbnVtYmVyCisgKgorICogQHJldHVybnMgIDAgb24gc3VjY2VzcworICoJICAtMSBvbiBlcnJvcgorICoKKyAqLworaW50IG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIGxvbmcgcGh5LCBsb25nIHJlZywgX19sZTMyIHZhbCkKK3sKKwlsb25nIHRpbWVvdXQgPSAwOworCWxvbmcgcmVzdWx0ID0gMDsKKwlsb25nIHJlc3RvcmUgPSAwOworCV9fbGUzMiBhZGRyZXNzOworCV9fbGUzMiBjb21tYW5kOworCV9fbGUzMiBzdGF0dXM7CisJX19sZTMyIG1hY19jZmcwOworCisJLyoKKwkgKiBNSUkgbWdtdCBhbGwgZ29lcyB0aHJvdWdoIHBvcnQgMCBNQUMgaW50ZXJmYWNlLCBzbyBpdAorCSAqIGNhbm5vdCBiZSBpbiByZXNldAorCSAqLworCisJaWYgKG5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMCgwKSwKKwkJCQkgICZtYWNfY2ZnMCwgNCkpCisJCXJldHVybiAtRUlPOworCWlmIChuZXR4ZW5fZ2JfZ2V0X3NvZnRfcmVzZXQobWFjX2NmZzApKSB7CisJCV9fbGUzMiB0ZW1wOworCQl0ZW1wID0gMDsKKwkJbmV0eGVuX2diX3R4X3Jlc2V0X3BiKHRlbXApOworCQluZXR4ZW5fZ2JfcnhfcmVzZXRfcGIodGVtcCk7CisJCW5ldHhlbl9nYl90eF9yZXNldF9tYWModGVtcCk7CisJCW5ldHhlbl9nYl9yeF9yZXNldF9tYWModGVtcCk7CisKKwkJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwKKwkJCQkJICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAoMCksCisJCQkJCSAgICZ0ZW1wLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQlyZXN0b3JlID0gMTsKKwl9CisKKwljb21tYW5kID0gMDsJCS8qIHR1cm4gb2ZmIGFueSBwcmlvciBhY3Rpdml0eSAqLworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkJCQkgICAmY29tbWFuZCwgNCkpCisJCXJldHVybiAtRUlPOworCisJYWRkcmVzcyA9IDA7CisJbmV0eGVuX2diX21paV9tZ210X3JlZ19hZGRyKGFkZHJlc3MsIHJlZyk7CisJbmV0eGVuX2diX21paV9tZ210X3BoeV9hZGRyKGFkZHJlc3MsIHBoeSk7CisJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSKDApLAorCQkJCSAgICZhZGRyZXNzLCA0KSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01JSV9NR01UX0NUUkwoMCksCisJCQkJICAgJnZhbCwgNCkpCisJCXJldHVybiAtRUlPOworCisJc3RhdHVzID0gMDsKKwlkbyB7CisJCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKKwkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKDApLAorCQkJCQkgICZzdGF0dXMsIDQpKQorCQkJcmV0dXJuIC1FSU87CisJCXRpbWVvdXQrKzsKKwl9IHdoaWxlICgobmV0eGVuX2dldF9nYl9taWlfbWdtdF9idXN5KHN0YXR1cykpCisJCSAmJiAodGltZW91dCsrIDwgTkVUWEVOX05JVV9QSFlfV0FJVE1BWCkpOworCisJaWYgKHRpbWVvdXQgPCBORVRYRU5fTklVX1BIWV9XQUlUTUFYKQorCQlyZXN1bHQgPSAwOworCWVsc2UKKwkJcmVzdWx0ID0gLUVJTzsKKworCS8qIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHBvcnQgMCBNQUMgaW4gY2FzZSB3ZSB0YW1wZXJlZCB3aXRoIGl0ICovCisJaWYgKHJlc3RvcmUpCisJCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsCisJCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKDApLAorCQkJCQkgICAmbWFjX2NmZzAsIDQpKQorCQkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmV0eGVuX25pdV94Z2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgaW50IHBvcnQpCit7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfSU5UX01BU0ssIDB4M2YpOworCXJldHVybiAwOworfQorCitpbnQgbmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJIGludCBwb3J0KQoreworCWludCByZXN1bHQgPSAwOworCV9fbGUzMiBlbmFibGUgPSAwOworCW5ldHhlbl9zZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGVuYWJsZSk7CisJbmV0eGVuX3NldF9waHlfaW50X2F1dG9uZWdfY29tcGxldGVkKGVuYWJsZSk7CisJbmV0eGVuX3NldF9waHlfaW50X3NwZWVkX2NoYW5nZWQoZW5hYmxlKTsKKworCWlmICgwICE9CisJICAgIG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZShhZGFwdGVyLCBwb3J0LAorCQkJCSAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9FTkFCTEUsCisJCQkJICAgICBlbmFibGUpKQorCQlyZXN1bHQgPSAtRUlPOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5ldHhlbl9uaXVfeGdiZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgaW50IHBvcnQpCit7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfSU5UX01BU0ssIDB4N2YpOworCXJldHVybiAwOworfQorCitpbnQgbmV0eGVuX25pdV9nYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgaW50IHBvcnQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaWYgKDAgIT0KKwkgICAgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQsCisJCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfSU5UX0VOQUJMRSwgMCkpCisJCXJlc3VsdCA9IC1FSU87CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmV0eGVuX25pdV94Z2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJIGludCBwb3J0KQoreworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0FDVElWRV9JTlQsIC0xKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJaW50IHBvcnQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaWYgKDAgIT0KKwkgICAgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQsCisJCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfSU5UX1NUQVRVUywKKwkJCQkgICAgIC1FSU8pKQorCQlyZXN1bHQgPSAtRUlPOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogCisgKiBuZXR4ZW5fbml1X2diZV9zZXRfbWlpX21vZGUtIFNldCAxMC8xMDAgTWJpdCBNb2RlIGZvciBHYkUgTUFDCisgKgorICovCit2b2lkIG5ldHhlbl9uaXVfZ2JlX3NldF9taWlfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJIGludCBwb3J0LCBsb25nIGVuYWJsZSkKK3sKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9NT0RFLCAweDIpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkgICAgMHg4MDAwMDAwMCk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICAweDAwMDBmMDAyNSk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18xKHBvcnQpLAorCQkJCSAgICAweGYxZmYpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCMF9HTUlJX01PREUgKyAocG9ydCA8PCAzKSwgMCk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJICAgIE5FVFhFTl9OSVVfR0IwX01JSV9NT0RFICsgKHBvcnQgPDwgMyksIDEpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICAoTkVUWEVOX05JVV9HQjBfSEFMRl9EVVBMRVggKyBwb3J0ICogNCksIDApOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0NPTkZJRyhwb3J0KSwgMHg3KTsKKworCWlmIChlbmFibGUpIHsKKwkJLyogCisJCSAqIERvIE5PVCBlbmFibGUgZmxvdyBjb250cm9sIHVudGlsIGEgc3VpdGFibGUgc29sdXRpb24gZm9yIAorCQkgKiAgc2h1dHRpbmcgZG93biBwYXVzZSBmcmFtZXMgaXMgZm91bmQuIAorCQkgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkJICAgIDB4NSk7CisJfQorCisJaWYgKG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1IgZW5hYmxpbmcgUEhZIGludGVycnVwdHNcbiIpOworCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1IgY2xlYXJpbmcgUEhZIGludGVycnVwdHNcbiIpOworfQorCisvKiAKKyAqIG5ldHhlbl9uaXVfZ2JlX3NldF9nbWlpX21vZGUtIFNldCBHYkUgTW9kZSBmb3IgR2JFIE1BQworICovCit2b2lkIG5ldHhlbl9uaXVfZ2JlX3NldF9nbWlpX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgaW50IHBvcnQsIGxvbmcgZW5hYmxlKQoreworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX01PREUsIDB4Mik7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICAweDgwMDAwMDAwKTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydCksCisJCQkJICAgIDB4MDAwMGYwMDI1KTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzEocG9ydCksCisJCQkJICAgIDB4ZjJmZik7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJICAgIE5FVFhFTl9OSVVfR0IwX01JSV9NT0RFICsgKHBvcnQgPDwgMyksIDApOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCMF9HTUlJX01PREUgKyAocG9ydCA8PCAzKSwgMSk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJICAgIChORVRYRU5fTklVX0dCMF9IQUxGX0RVUExFWCArIHBvcnQgKiA0KSwgMCk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09ORklHKHBvcnQpLCAweDcpOworCisJaWYgKGVuYWJsZSkgeworCQkvKiAKKwkJICogRG8gTk9UIGVuYWJsZSBmbG93IGNvbnRyb2wgdW50aWwgYSBzdWl0YWJsZSBzb2x1dGlvbiBmb3IgCisJCSAqICBzaHV0dGluZyBkb3duIHBhdXNlIGZyYW1lcyBpcyBmb3VuZC4gCisJCSAqLworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCQkgICAgMHg1KTsKKwl9CisKKwlpZiAobmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUiBlbmFibGluZyBQSFkgaW50ZXJydXB0c1xuIik7CisJaWYgKG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUiBjbGVhcmluZyBQSFkgaW50ZXJydXB0c1xuIik7Cit9CisKK2ludCBuZXR4ZW5fbml1X2diZV9pbml0X3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlfX2xlMzIgc3RhdHVzOworCWlmIChhZGFwdGVyLT5vcHMtPmRpc2FibGVfcGh5X2ludGVycnVwdHMpCisJCWFkYXB0ZXItPm9wcy0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KTsKKwltZGVsYXkoMik7CisKKwlpZiAoMCA9PQorCSAgICBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChhZGFwdGVyLCBwb3J0LAorCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKKwkJCQkgICAgKF9fbGUzMiAqKSAmIHN0YXR1cykpIHsKKwkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgeworCQkJaWYgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMikgeworCQkJCW5ldHhlbl9uaXVfZ2JlX3NldF9nbWlpX21vZGUoYWRhcHRlciwgcG9ydCwgMSk7CisJCQl9IGVsc2UgaWYgKChuZXR4ZW5fZ2V0X3BoeV9zcGVlZChzdGF0dXMpID09IDEpCisJCQkJICAgfHwgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMCkpIHsKKwkJCQluZXR4ZW5fbml1X2diZV9zZXRfbWlpX21vZGUoYWRhcHRlciwgcG9ydCwgMSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IC0xOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3QgaGF2ZSBsaW5rLiBDYWJsZSAgbXVzdCBiZSB1bmNvbm5lY3RlZC4KKwkJCSAqIEVuYWJsZSBwaHkgaW50ZXJydXB0cyBzbyB3ZSB0YWtlIGFjdGlvbiB3aGVuCisJCQkgKiBwbHVnZ2VkIGluLgorCQkJICovCisKKwkJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wCisJCQkJCQkgICAgKHBvcnQpLAorCQkJCQkJICAgIE5FVFhFTl9HQl9NQUNfU09GVF9SRVNFVCk7CisJCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJCSAgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMAorCQkJCQkJICAgIChwb3J0KSwKKwkJCQkJCSAgICBORVRYRU5fR0JfTUFDX1JFU0VUX1BST1RfQkxLCisJCQkJCQkgICAgfCBORVRYRU5fR0JfTUFDX0VOQUJMRV9UWF9SWAorCQkJCQkJICAgIHwKKwkJCQkJCSAgICBORVRYRU5fR0JfTUFDX1BBVVNFRF9GUk1TKTsKKwkJCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICJFUlJPUiBjbGVhcmluZyBQSFkgaW50ZXJydXB0c1xuIik7CisJCQlpZiAobmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkgICAgICAgIkVSUk9SIGVuYWJsaW5nIFBIWSBpbnRlcnJ1cHRzXG4iKTsKKwkJCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICJFUlJPUiBjbGVhcmluZyBQSFkgaW50ZXJydXB0c1xuIik7CisJCQlyZXN1bHQgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCXJlc3VsdCA9IC1FSU87CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBuZXR4ZW5fbml1X3hnX2luaXRfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KQoreworCWxvbmcgcmVnID0gMCwgcmV0ID0gMDsKKworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRjZmcuYm9hcmRfdHlwZSA9PSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaKSB7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX05JVV9YRzFfQ09ORklHXzAsIDB4NSk7CisJCS8qIFhYWCBoYWNrIGZvciBNZXogY2FyZHM6IGJvdGggcG9ydHMgaW4gcHJvbWlzYyBtb2RlICovCisJCW5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLAorCQkJCSAgICAgIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18xLCAmcmVnLCA0KTsKKwkJcmVnID0gKHJlZyB8IDB4MjAwMFVMKTsKKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fTklVX1hHRV9DT05GSUdfMSwgcmVnKTsKKwkJcmVnID0gMDsKKwkJbmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsCisJCQkJICAgICAgTkVUWEVOX05JVV9YRzFfQ09ORklHXzEsICZyZWcsIDQpOworCQlyZWcgPSAocmVnIHwgMHgyMDAwVUwpOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9OSVVfWEcxX0NPTkZJR18xLCByZWcpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIAorICogbmV0eGVuX25pdV9nYmVfaGFuZGxlX3BoeV9pbnRlcnJ1cHQgLSBIYW5kbGVzIEdiRSBQSFkgaW50ZXJydXB0cworICogQHBhcmFtIGVuYWJsZSAwIG1lYW5zIGRvbid0IGVuYWJsZSB0aGUgcG9ydAorICoJCSAxIG1lYW5zIGVuYWJsZSAob3IgcmUtZW5hYmxlKSB0aGUgcG9ydAorICovCitpbnQgbmV0eGVuX25pdV9nYmVfaGFuZGxlX3BoeV9pbnRlcnJ1cHQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlpbnQgcG9ydCwgbG9uZyBlbmFibGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJX19sZTMyIGludF9zcmM7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTkVUWEVOOiBIYW5kbGluZyBQSFkgaW50ZXJydXB0IG9uIHBvcnQgJWQiCisJICAgICAgICIgKGRldmljZSBlbmFibGUgPSAlZClcbiIsIChpbnQpcG9ydCwgKGludCllbmFibGUpOworCisJLyoKKwkgKiBUaGUgcmVhZCBvZiB0aGUgUEhZIElOVCBzdGF0dXMgd2lsbCBjbGVhciB0aGUgcGVuZGluZworCSAqIGludGVycnVwdCBzdGF0dXMKKwkgKi8KKwlpZiAobmV0eGVuX25pdV9nYmVfcGh5X3JlYWQoYWRhcHRlciwgcG9ydCwKKwkJCQkgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9TVEFUVVMsCisJCQkJICAgICZpbnRfc3JjKSAhPSAwKQorCQlyZXN1bHQgPSAtRUlOVkFMOworCWVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUEhZIEludGVycnVwdCBzb3VyY2UgPSAweCV4IFxuIiwgaW50X3NyYyk7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfamFiYmVyKGludF9zcmMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImphYmJlciBJbnRlcnJ1cHQgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfcG9sYXJpdHlfY2hhbmdlZChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJwb2xhcml0eSBjaGFuZ2VkICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2VuZXJneV9kZXRlY3QoaW50X3NyYykpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZW5lcmd5IGRldGVjdCBcbiIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2Rvd25zaGlmdChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJkb3duc2hpZnQgXG4iKTsKKwkJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9tZGlfeG92ZXJfY2hhbmdlZChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJtZGlfeG92ZXJfY2hhbmdlZCAiKTsKKwkJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9maWZvX292ZXJfdW5kZXJmbG93KGludF9zcmMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZpZm9fb3Zlcl91bmRlcmZsb3cgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfZmFsc2VfY2FycmllcihpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWxzZV9jYXJyaWVyICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X3N5bWJvbF9lcnJvcihpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJzeW1ib2xfZXJyb3IgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfYXV0b25lZ19jb21wbGV0ZWQoaW50X3NyYykpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYXV0b25lZ19jb21wbGV0ZWQgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfcGFnZV9yZWNlaXZlZChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJwYWdlX3JlY2VpdmVkICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2R1cGxleF9jaGFuZ2VkKGludF9zcmMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImR1cGxleF9jaGFuZ2VkICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2F1dG9uZWdfZXJyb3IoaW50X3NyYykpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYXV0b25lZ19lcnJvciAiKTsKKwkJaWYgKChuZXR4ZW5fZ2V0X3BoeV9pbnRfc3BlZWRfY2hhbmdlZChpbnRfc3JjKSkKKwkJICAgIHx8IChuZXR4ZW5fZ2V0X3BoeV9pbnRfbGlua19zdGF0dXNfY2hhbmdlZChpbnRfc3JjKSkpIHsKKwkJCV9fbGUzMiBzdGF0dXM7CisKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkgICAgICAgInNwZWVkX2NoYW5nZWQgb3IgbGluayBzdGF0dXMgY2hhbmdlZCIpOworCQkJaWYgKG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkCisJCQkgICAgKGFkYXB0ZXIsIHBvcnQsCisJCQkgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAorCQkJICAgICAmc3RhdHVzKSA9PSAwKSB7CisJCQkJaWYgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMikgeworCQkJCQlwcmludGsKKwkJCQkJICAgIChLRVJOX0lORk8gUEZYICJMaW5rIHNwZWVkIGNoYW5nZWQiCisJCQkJCSAgICAgIiB0byAxMDAwIE1icHNcbiIpOworCQkJCQluZXR4ZW5fbml1X2diZV9zZXRfZ21paV9tb2RlKGFkYXB0ZXIsCisJCQkJCQkJCSAgICAgcG9ydCwKKwkJCQkJCQkJICAgICBlbmFibGUpOworCQkJCX0gZWxzZSBpZiAobmV0eGVuX2dldF9waHlfc3BlZWQoc3RhdHVzKSA9PSAxKSB7CisJCQkJCXByaW50aworCQkJCQkgICAgKEtFUk5fSU5GTyBQRlggIkxpbmsgc3BlZWQgY2hhbmdlZCIKKwkJCQkJICAgICAiIHRvIDEwMCBNYnBzXG4iKTsKKwkJCQkJbmV0eGVuX25pdV9nYmVfc2V0X21paV9tb2RlKGFkYXB0ZXIsCisJCQkJCQkJCSAgICBwb3J0LAorCQkJCQkJCQkgICAgZW5hYmxlKTsKKwkJCQl9IGVsc2UgaWYgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMCkgeworCQkJCQlwcmludGsKKwkJCQkJICAgIChLRVJOX0lORk8gUEZYICJMaW5rIHNwZWVkIGNoYW5nZWQiCisJCQkJCSAgICAgIiB0byAxMCBNYnBzXG4iKTsKKwkJCQkJbmV0eGVuX25pdV9nYmVfc2V0X21paV9tb2RlKGFkYXB0ZXIsCisJCQkJCQkJCSAgICBwb3J0LAorCQkJCQkJCQkgICAgZW5hYmxlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUiByZWFkaW5nIgorCQkJCQkgICAgICAgIlBIWSBzdGF0dXMuIElsbGVnYWwgc3BlZWQuXG4iKTsKKwkJCQkJcmVzdWx0ID0gLTE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICJFUlJPUiByZWFkaW5nIFBIWSBzdGF0dXMuXG4iKTsKKwkJCQlyZXN1bHQgPSAtMTsKKwkJCX0KKworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KKyAqIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHZhbHVlIG11c3QgYWxyZWFkeSBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK2ludCBuZXR4ZW5fbml1X21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgIGludCBwaHksIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKQoreworCXU2NCByZXN1bHQgPSAwOworCV9fbGUzMiBzdGF0aW9uaGlnaDsKKwlfX2xlMzIgc3RhdGlvbmxvdzsKKworCWlmIChhZGRyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgocGh5IDwgMCkgfHwgKHBoeSA+IDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMChwaHkpLAorCQkJCSAgJnN0YXRpb25oaWdoLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8xKHBoeSksCisJCQkJICAmc3RhdGlvbmxvdywgNCkpCisJCXJldHVybiAtRUlPOworCisJcmVzdWx0ID0gKHU2NCkgbmV0eGVuX2diX2dldF9zdGF0aW9uYWRkcmVzc19sb3coc3RhdGlvbmxvdyk7CisJcmVzdWx0IHw9ICh1NjQpIHN0YXRpb25oaWdoIDw8IDE2OworCW1lbWNweSgqYWRkciwgJnJlc3VsdCwgc2l6ZW9mKG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBzdGF0aW9uIE1BQyBhZGRyZXNzLgorICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworaW50IG5ldHhlbl9uaXVfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LAorCQkJICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCBhZGRyKQoreworCV9fbGUzMiB0ZW1wID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBwaHkgPSBwb3J0LT5wb3J0bnVtOworCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbTUFYX0FERFJfTEVOXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCW1lbWNweSgmdGVtcCwgYWRkciwgMik7CisJCXRlbXAgPDw9IDE2OworCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eAorCQkgICAgKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfU1RBVElPTl9BRERSXzEocGh5KSwgJnRlbXAsIDQpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJdGVtcCA9IDA7CisKKwkJbWVtY3B5KCZ0ZW1wLCAoKHU4ICopIGFkZHIpICsgMiwgc2l6ZW9mKF9fbGUzMikpOworCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eAorCQkgICAgKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfU1RBVElPTl9BRERSXzAocGh5KSwgJnRlbXAsIDQpKQorCQkJcmV0dXJuIC0yOworCisJCW5ldHhlbl9uaXVfbWFjYWRkcl9nZXQoYWRhcHRlciwgcGh5LAorCQkJCSAgICAgICAobmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCAqKSBtYWNfYWRkcik7CisJCWlmIChtZW1jbXAobWFjX2FkZHIsIGFkZHIsIE1BWF9BRERSX0xFTiA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDEwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBzZXQgTWFjIGFkZHIgZm9yICVzXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgcG9ydC0+bmV0ZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUMgYWRkcmVzcyBzZXQ6ICIKKwkJICAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC5cbiIsCisJCSAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworCQlwcmludGsoS0VSTl9FUlIgIk1BQyBhZGRyZXNzIGdldDogIgorCQkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKKwkJICAgICAgIG1hY19hZGRyWzBdLAorCQkgICAgICAgbWFjX2FkZHJbMV0sCisJCSAgICAgICBtYWNfYWRkclsyXSwgbWFjX2FkZHJbM10sIG1hY19hZGRyWzRdLCBtYWNfYWRkcls1XSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBFbmFibGUgYSBHYkUgaW50ZXJmYWNlICovCitpbnQgbmV0eGVuX25pdV9lbmFibGVfZ2JlX3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIGludCBwb3J0LCBuZXR4ZW5fbml1X2diZV9pZm1vZGVfdCBtb2RlKQoreworCV9fbGUzMiBtYWNfY2ZnMDsKKwlfX2xlMzIgbWFjX2NmZzE7CisJX19sZTMyIG1paV9jZmc7CisKKwlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+IE5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFjX2NmZzAgPSAwOworCW5ldHhlbl9nYl9zb2Z0X3Jlc2V0KG1hY19jZmcwKTsKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkgICAmbWFjX2NmZzAsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwltYWNfY2ZnMCA9IDA7CisJbmV0eGVuX2diX2VuYWJsZV90eChtYWNfY2ZnMCk7CisJbmV0eGVuX2diX2VuYWJsZV9yeChtYWNfY2ZnMCk7CisJbmV0eGVuX2diX3Vuc2V0X3J4X2Zsb3djdGwobWFjX2NmZzApOworCW5ldHhlbl9nYl90eF9yZXNldF9wYihtYWNfY2ZnMCk7CisJbmV0eGVuX2diX3J4X3Jlc2V0X3BiKG1hY19jZmcwKTsKKwluZXR4ZW5fZ2JfdHhfcmVzZXRfbWFjKG1hY19jZmcwKTsKKwluZXR4ZW5fZ2JfcnhfcmVzZXRfbWFjKG1hY19jZmcwKTsKKworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICZtYWNfY2ZnMCwgNCkpCisJCXJldHVybiAtRUlPOworCW1hY19jZmcxID0gMDsKKwluZXR4ZW5fZ2Jfc2V0X3ByZWFtYmxlbGVuKG1hY19jZmcxLCAweGYpOworCW5ldHhlbl9nYl9zZXRfZHVwbGV4KG1hY19jZmcxKTsKKwluZXR4ZW5fZ2Jfc2V0X2NyY19lbmFibGUobWFjX2NmZzEpOworCW5ldHhlbl9nYl9zZXRfcGFkc2hvcnQobWFjX2NmZzEpOworCW5ldHhlbl9nYl9zZXRfY2hlY2tsZW5ndGgobWFjX2NmZzEpOworCW5ldHhlbl9nYl9zZXRfaHVnZWZyYW1lcyhtYWNfY2ZnMSk7CisKKwlpZiAobW9kZSA9PSBORVRYRU5fTklVXzEwXzEwMF9NQikgeworCQluZXR4ZW5fZ2Jfc2V0X2ludGZtb2RlKG1hY19jZmcxLCAxKTsKKwkJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwKKwkJCQkJICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzEocG9ydCksCisJCQkJCSAgICZtYWNfY2ZnMSwgNCkpCisJCQlyZXR1cm4gLUVJTzsKKworCQkvKiBzZXQgbWlpIG1vZGUgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0IwX0dNSUlfTU9ERSArCisJCQkJCSAgICAocG9ydCA8PCAzKSwgMCk7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCMF9NSUlfTU9ERSArCisJCQkJCSAgICAocG9ydCA8PCAzKSwgMSk7CisKKwl9IGVsc2UgaWYgKG1vZGUgPT0gTkVUWEVOX05JVV8xMDAwX01CKSB7CisJCW5ldHhlbl9nYl9zZXRfaW50Zm1vZGUobWFjX2NmZzEsIDIpOworCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLAorCQkJCQkgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMShwb3J0KSwKKwkJCQkJICAgJm1hY19jZmcxLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQkvKiBzZXQgZ21paSBtb2RlICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCMF9NSUlfTU9ERSArCisJCQkJCSAgICAocG9ydCA8PCAzKSwgMCk7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCMF9HTUlJX01PREUgKworCQkJCQkgICAgKHBvcnQgPDwgMyksIDEpOworCX0KKwltaWlfY2ZnID0gMDsKKwluZXR4ZW5fZ2Jfc2V0X21paV9tZ210X2Nsb2Nrc2VsZWN0KG1paV9jZmcsIDcpOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09ORklHKHBvcnQpLAorCQkJCSAgICZtaWlfY2ZnLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJbWFjX2NmZzAgPSAwOworCW5ldHhlbl9nYl9lbmFibGVfdHgobWFjX2NmZzApOworCW5ldHhlbl9nYl9lbmFibGVfcngobWFjX2NmZzApOworCW5ldHhlbl9nYl91bnNldF9yeF9mbG93Y3RsKG1hY19jZmcwKTsKKwluZXR4ZW5fZ2JfdW5zZXRfdHhfZmxvd2N0bChtYWNfY2ZnMCk7CisKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkgICAmbWFjX2NmZzAsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworLyogRGlzYWJsZSBhIEdiRSBpbnRlcmZhY2UgKi8KK2ludCBuZXR4ZW5fbml1X2Rpc2FibGVfZ2JlX3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCkKK3sKKwlfX2xlMzIgbWFjX2NmZzA7CisKKwlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+IE5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFjX2NmZzAgPSAwOworCW5ldHhlbl9nYl9zb2Z0X3Jlc2V0KG1hY19jZmcwKTsKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkgICAmbWFjX2NmZzAsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworLyogRGlzYWJsZSBhbiBYRyBpbnRlcmZhY2UgKi8KK2ludCBuZXR4ZW5fbml1X2Rpc2FibGVfeGdfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KQoreworCV9fbGUzMiBtYWNfY2ZnOworCisJaWYgKHBvcnQgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWNfY2ZnID0gMDsKKwluZXR4ZW5feGdfc29mdF9yZXNldChtYWNfY2ZnKTsKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9DT05GSUdfMCwKKwkJCQkgICAmbWFjX2NmZywgNCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSBmb3IgYSBHYkUgaW50ZXJmYWNlICovCitpbnQgbmV0eGVuX25pdV9zZXRfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0LAorCQkJCSAgICBuZXR4ZW5fbml1X3Byb21fbW9kZV90IG1vZGUpCit7CisJX19sZTMyIHJlZzsKKworCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzYXZlIHByZXZpb3VzIGNvbnRlbnRzICovCisJaWYgKG5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX0RST1BfV1JPTkdBRERSLAorCQkJCSAgJnJlZywgNCkpCisJCXJldHVybiAtRUlPOworCWlmIChtb2RlID09IE5FVFhFTl9OSVVfUFJPTUlTQ19NT0RFKSB7CisJCXN3aXRjaCAocG9ydCkgeworCQljYXNlIDA6CisJCQluZXR4ZW5fY2xlYXJfZ2JfZHJvcF9nYjAocmVnKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQluZXR4ZW5fY2xlYXJfZ2JfZHJvcF9nYjEocmVnKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQluZXR4ZW5fY2xlYXJfZ2JfZHJvcF9nYjIocmVnKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQluZXR4ZW5fY2xlYXJfZ2JfZHJvcF9nYjMocmVnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBvcnQpIHsKKwkJY2FzZSAwOgorCQkJbmV0eGVuX3NldF9nYl9kcm9wX2diMChyZWcpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW5ldHhlbl9zZXRfZ2JfZHJvcF9nYjEocmVnKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQluZXR4ZW5fc2V0X2diX2Ryb3BfZ2IyKHJlZyk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJbmV0eGVuX3NldF9nYl9kcm9wX2diMyhyZWcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX0RST1BfV1JPTkdBRERSLAorCQkJCSAgICZyZWcsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgTUFDIGFkZHJlc3MgZm9yIGFuIFhHIHBvcnQKKyAqIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHZhbHVlIG11c3QgYWxyZWFkeSBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfc2V0KHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwKKwkJCSAgICAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgYWRkcikKK3sKKwlfX2xlMzIgdGVtcCA9IDA7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKworCW1lbWNweSgmdGVtcCwgYWRkciwgMik7CisJdGVtcCA9IGNwdV90b19sZTMyKHRlbXApOworCXRlbXAgPDw9IDE2OworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX1NUQVRJT05fQUREUl8wXzEsCisJCQkJICAgJnRlbXAsIDQpKQorCQlyZXR1cm4gLUVJTzsKKworCXRlbXAgPSAwOworCisJbWVtY3B5KCZ0ZW1wLCAoKHU4ICopIGFkZHIpICsgMiwgc2l6ZW9mKF9fbGUzMikpOworCXRlbXAgPSBjcHVfdG9fbGUzMih0ZW1wKTsKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISSwKKwkJCQkgICAmdGVtcCwgNCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KKyAqIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHZhbHVlIG11c3QgYWxyZWFkeSBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeSwKKwkJCSAgICAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKQoreworCV9fbGUzMiBzdGF0aW9uaGlnaDsKKwlfX2xlMzIgc3RhdGlvbmxvdzsKKwl1NjQgcmVzdWx0OworCisJaWYgKGFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBoeSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfSEksCisJCQkJICAmc3RhdGlvbmhpZ2gsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX1NUQVRJT05fQUREUl8wXzEsCisJCQkJICAmc3RhdGlvbmxvdywgNCkpCisJCXJldHVybiAtRUlPOworCisJcmVzdWx0ID0gKCh1NjQpIHN0YXRpb25sb3cpID4+IDE2OworCXJlc3VsdCB8PSAodTY0KSBzdGF0aW9uaGlnaCA8PCAxNjsKKwltZW1jcHkoKmFkZHIsICZyZXN1bHQsIHNpemVvZihuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9uaXVfeGdfc2V0X3Byb21pc2N1b3VzX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgICBpbnQgcG9ydCwgbmV0eGVuX25pdV9wcm9tX21vZGVfdCBtb2RlKQoreworCV9fbGUzMiByZWc7CisKKwlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+IE5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9DT05GSUdfMSwgJnJlZywgNCkpCisJCXJldHVybiAtRUlPOworCWlmIChtb2RlID09IE5FVFhFTl9OSVVfUFJPTUlTQ19NT0RFKQorCQlyZWcgPSAocmVnIHwgMHgyMDAwVUwpOworCWVsc2UKKwkJcmVnID0gKHJlZyAmIH4weDIwMDBVTCk7CisKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfQ09ORklHXzEsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX3BoYW5fcmVnLmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19waGFuX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODFkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19waGFuX3JlZy5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiBOZXRYZW4sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqIAorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICogCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogICAgaW5mb0BuZXR4ZW4uY29tCisgKiBOZXRYZW4sCisgKiAzOTY1IEZyZWVkb20gQ2lyY2xlLCBGb3VydGggZmxvb3IsCisgKiBTYW50YSBDbGFyYSwgQ0EgOTUwNTQKKyAqLworCisjaWZuZGVmIF9fTklDX1BIQU5fUkVHX0hfCisjZGVmaW5lIF9fTklDX1BIQU5fUkVHX0hfCisKKy8qIAorICogQ1JCIFJlZ2lzdGVycyBvciBxdWV1ZSBtZXNzYWdlIGRvbmUgb25seSBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIDIgYXJlIHRoZSBiYXNlIGFkcmVzc2VzIGZvciB0aGUgQ1JCIHJlZ2lzdGVycyBhbmQgdGhlaXIKKyAqIG9mZnNldHMgd2lsbCBiZSBhZGRlZCB0byBnZXQgYWRkcmVzc2VzIGZvciB0aGUgaW5kZXggYWRkcmVzc2VzLgorICovCisjZGVmaW5lIE5JQ19DUkJfQkFTRV9QT1JUMQlORVRYRU5fQ0FNX1JBTSgweDIwMCkKKyNkZWZpbmUgTklDX0NSQl9CQVNFX1BPUlQyCU5FVFhFTl9DQU1fUkFNKDB4MjUwKQorCisjZGVmaW5lIE5FVFhFTl9OSUNfUkVHKFgpCShOSUNfQ1JCX0JBU0VfUE9SVDErKFgpKQorCisvKgorICogQ3JiUG9ydFBoYW5DbnRySGkvTG8gaXMgdXNlZCB0byBwYXNzIHRoZSBhZGRyZXNzIG9mIEhvc3RQaGFudG9tSW5kZXggYWRkcmVzcworICogd2hpY2ggY2FuIGJlIHJlYWQgYnkgdGhlIFBoYW50b20gaG9zdCB0byBnZXQgcHJvZHVjZXIvY29uc3VtZXIgaW5kZXhlcyBmcm9tCisgKiBQaGFudG9tL0Nhc3Blci4gSWYgaXQgaXMgbm90IEhPU1RfU0hBUkVEX01FTU9SWSwgdGhlbiB0aGUgZm9sbG93aW5nCisgKiByZWdpc3RlcnMgd2lsbCBiZSB1c2VkIGZvciB0aGUgYWRkcmVzc2VzIG9mIHRoZSByaW5nJ3Mgc2hhcmVkIG1lbW9yeQorICogb24gdGhlIFBoYW50b20uCisgKi8KKworI2RlZmluZSBDUkJfUEhBTl9DTlRSTF9MT19PRkZTRVQJTkVUWEVOX05JQ19SRUcoMHgwMCkKKyNkZWZpbmUgQ1JCX1BIQU5fQ05UUkxfSElfT0ZGU0VUCU5FVFhFTl9OSUNfUkVHKDB4MDQpCisKKy8qIHBvaW50IHRvIHRoZSBpbmRleGVzICovCisjZGVmaW5lIENSQl9DTURfUFJPRFVDRVJfT0ZGU0VUCQlORVRYRU5fTklDX1JFRygweDA4KQorI2RlZmluZSBDUkJfQ01EX0NPTlNVTUVSX09GRlNFVAkJTkVUWEVOX05JQ19SRUcoMHgwYykKKworI2RlZmluZSBDUkJfUEFVU0VfQUREUl9MTwkJTkVUWEVOX05JQ19SRUcoMHgxMCkKKyNkZWZpbmUgQ1JCX1BBVVNFX0FERFJfSEkJCU5FVFhFTl9OSUNfUkVHKDB4MTQpCisKKy8qIGFkZHJlc3Mgb2YgY29tbWFuZCBkZXNjcmlwdG9ycyBpbiB0aGUgaG9zdCBtZW1vcnkgKi8KKyNkZWZpbmUgQ1JCX0hPU1RfQ01EX0FERFJfSEkJCU5FVFhFTl9OSUNfUkVHKDB4MzApCisjZGVmaW5lIENSQl9IT1NUX0NNRF9BRERSX0xPCQlORVRYRU5fTklDX1JFRygweDM0KQorCisvKiBUaGUgZm9sbG93aW5nIDQgQ1JCIHJlZ2lzdGVycyBhcmUgZm9yIGRvaW5nIHBlcmZvcm1hbmNlIGNvYWwgKi8KKyNkZWZpbmUgQ1JCX0NNRF9JTlRSX0xPT1AJCU5FVFhFTl9OSUNfUkVHKDB4MzgpCisjZGVmaW5lIENSQl9DTURfRE1BX0xPT1AJCU5FVFhFTl9OSUNfUkVHKDB4M2MpCisjZGVmaW5lIENSQl9SQ1ZfSU5UUl9MT09QCQlORVRYRU5fTklDX1JFRygweDQwKQorI2RlZmluZSBDUkJfUkNWX0RNQV9MT09QCQlORVRYRU5fTklDX1JFRygweDQ0KQorCisvKiBOZWVkZWQgYnkgdGhlIGhvc3QgdG8gZmluZCBvdXQgdGhlIHN0YXRlIG9mIFBoYW50b20ncyBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBDUkJfRU5BQkxFX1RYX0lOVFIJCU5FVFhFTl9OSUNfUkVHKDB4NGMpCisjZGVmaW5lIENSQl9DTURQRUdfU1RBVEUJCU5FVFhFTl9OSUNfUkVHKDB4NTApCisjZGVmaW5lIENSQl9DTURQRUdfQ01EUklORwkJTkVUWEVOX05JQ19SRUcoMHg1NCkKKworLyogSW50ZXJydXB0IGNvYWxlc2NpbmcgcGFyYW1ldGVycyAqLworI2RlZmluZSBDUkJfR0xPQkFMX0lOVF9DT0FMCQlORVRYRU5fTklDX1JFRygweDgwKQorI2RlZmluZSBDUkJfSU5UX0NPQUxfTU9ERQkJTkVUWEVOX05JQ19SRUcoMHg4NCkKKyNkZWZpbmUgQ1JCX01BWF9SQ1ZfQlVGUwkJTkVUWEVOX05JQ19SRUcoMHg4OCkKKyNkZWZpbmUgQ1JCX1RYX0lOVF9USFJFU0hPTEQJCU5FVFhFTl9OSUNfUkVHKDB4OGMpCisjZGVmaW5lIENSQl9SWF9QS1RfVElNRVIJCU5FVFhFTl9OSUNfUkVHKDB4OTApCisjZGVmaW5lIENSQl9UWF9QS1RfVElNRVIJCU5FVFhFTl9OSUNfUkVHKDB4OTQpCisjZGVmaW5lIENSQl9SWF9QS1RfQ05UCQkJTkVUWEVOX05JQ19SRUcoMHg5OCkKKyNkZWZpbmUgQ1JCX1JYX1RNUl9DTlQJCQlORVRYRU5fTklDX1JFRygweDljKQorI2RlZmluZSBDUkJfSU5UX1RIUkVTSAkJIE5FVFhFTl9OSUNfUkVHKDB4YTQpCisKKy8qIFJlZ2lzdGVyIGZvciBjb21tdW5pY2F0aW5nIFhHIGxpbmsgc3RhdHVzICovCisjZGVmaW5lIENSQl9YR19TVEFURQkJCU5FVFhFTl9OSUNfUkVHKDB4YTApCisKKy8qIFJlZ2lzdGVyIGZvciBjb21tdW5pY2F0aW5nIGNhcmQgdGVtcGVyYXR1cmUgKi8KKy8qIFVwcGVyIDE2IGJpdHMgYXJlIHRlbXBlcmF0dXJlIHZhbHVlLiBMb3dlciAxNiBiaXRzIGFyZSB0aGUgc3RhdGUgKi8KKyNkZWZpbmUgQ1JCX1RFTVBfU1RBVEUJCSBORVRYRU5fTklDX1JFRygweGE4KQorI2RlZmluZSBueF9nZXRfdGVtcF92YWwoeCkJICAgICAoKHgpID4+IDE2KQorI2RlZmluZSBueF9nZXRfdGVtcF9zdGF0ZSh4KQkgICAoKHgpICYgMHhmZmZmKQorI2RlZmluZSBueF9lbmNvZGVfdGVtcCh2YWwsIHN0YXRlKSAgICAgKCgodmFsKSA8PCAxNikgfCAoc3RhdGUpKQorCisvKiBEZWJ1ZyByZWdpc3RlcnMgZm9yIGNvbnRyb2xsaW5nIE5JQyBwa3QgZ2VuIGFnZW50ICovCisjZGVmaW5lIENSQl9BR0VOVF9HTwkJCU5FVFhFTl9OSUNfUkVHKDB4YjApCisjZGVmaW5lIENSQl9BR0VOVF9UWF9TSVpFCQlORVRYRU5fTklDX1JFRygweGI0KQorI2RlZmluZSBDUkJfQUdFTlRfVFhfVFlQRQkJTkVUWEVOX05JQ19SRUcoMHhiOCkKKyNkZWZpbmUgQ1JCX0FHRU5UX1RYX0FERFIJCU5FVFhFTl9OSUNfUkVHKDB4YmMpCisjZGVmaW5lIENSQl9BR0VOVF9UWF9NU1MJCU5FVFhFTl9OSUNfUkVHKDB4YzApCisKKy8qIERlYnVnIHJlZ2lzdGVycyBmb3Igb2JzZXJ2aW5nIE5JQyBwZXJmb3JtYW5jZSAqLworI2RlZmluZSBDUkJfVFhfU1RBVEUJCQlORVRYRU5fTklDX1JFRygweGQwKQorI2RlZmluZSBDUkJfVFhfQ09VTlQJCQlORVRYRU5fTklDX1JFRygweGQ0KQorI2RlZmluZSBDUkJfUlhfU1RBVEUJCQlORVRYRU5fTklDX1JFRygweGQ4KQorCisvKiBDUkIgcmVnaXN0ZXJzIHBlciBSY3YgRGVzY3JpcHRvciByaW5nICovCitzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2NyYiB7CisJdTMyIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDUxMikpKTsKKwl1MzIgY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ7CisJdTMyIGNyYl9nbG9iYWxyY3ZfcmluZzsKK307CisKKy8qCisgKiBDUkIgcmVnaXN0ZXJzIHVzZWQgYnkgdGhlIHJlY2VpdmUgcGVnIGxvZ2ljLiBPbmUgaW5zdGFuY2Ugb2YgdGhlc2UKKyAqIG5lZWRzIHRvIGJlIGluc3RhbnRpYXRlZCBwZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmUgcGVnLgorICovCisKK3N0cnVjdCBuZXR4ZW5fcmVjdl9jcmIgeworCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3JiIHJjdl9kZXNjX2NyYltOVU1fUkNWX0RFU0NfUklOR1NdOworCXUzMiBjcmJfcmN2c3RhdHVzX3Jpbmc7CisJdTMyIGNyYl9yY3Zfc3RhdHVzX3Byb2R1Y2VyOworCXUzMiBjcmJfcmN2X3N0YXR1c19jb25zdW1lcjsKKwl1MzIgY3JiX3JjdnBlZ19zdGF0ZTsKK307CisKKyNpZiBkZWZpbmVkKERFRklORV9HTE9CQUxfUkVDVl9DUkIpCitzdHJ1Y3QgbmV0eGVuX3JlY3ZfY3JiIHJlY3ZfY3JiX3JlZ2lzdGVyc1tdID0geworCS8qCisJICogSW5zdGFuY2UgMC4KKwkgKi8KKwl7CisJIC8qIHJjdl9kZXNjX2NyYjogKi8KKwkgeworCSAgeworCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTgpLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MWMpLAorCSAgIC8qIGNyYl9nbG9hYmxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDIwKSwKKwkgICB9LAorCSAgLyogSnVtYm8gZnJhbWVzICovCisJICB7CisJICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMDApLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTA0KSwKKwkgICAvKiBjcmJfZ2xvYWJscmN2X3Jpbmc6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMDgpLAorCSAgIH0KKwkgIH0sCisJIC8qIGNyYl9yY3ZzdGF0dXNfcmluZzogKi8KKwkgTkVUWEVOX05JQ19SRUcoMHgyNCksCisJIC8qIGNyYl9yY3Zfc3RhdHVzX3Byb2R1Y2VyOiAqLworCSBORVRYRU5fTklDX1JFRygweDI4KSwKKwkgLyogY3JiX3Jjdl9zdGF0dXNfY29uc3VtZXI6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MmMpLAorCSAvKiBjcmJfcmN2cGVnX3N0YXRlOiAqLworCSBORVRYRU5fTklDX1JFRygweDQ4KSwKKworCSB9LAorCS8qCisJICogSW5zdGFuY2UgMSwKKwkgKi8KKwl7CisJIC8qIHJjdl9kZXNjX2NyYjogKi8KKwkgeworCSAgeworCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4ODApLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4ODQpLAorCSAgIC8qIGNyYl9nbG9iYWxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDg4KSwKKwkgICB9LAorCSAgLyogSnVtYm8gZnJhbWVzICovCisJICB7CisJICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMEMpLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTEwKSwKKwkgICAvKiBjcmJfZ2xvYmFscmN2X3Jpbmc6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMTQpLAorCSAgIH0KKwkgIH0sCisJIC8qIGNyYl9yY3ZzdGF0dXNfcmluZzogKi8KKwkgTkVUWEVOX05JQ19SRUcoMHg4YyksCisJIC8qIGNyYl9yY3Zfc3RhdHVzX3Byb2R1Y2VyOiAqLworCSBORVRYRU5fTklDX1JFRygweDkwKSwKKwkgLyogY3JiX3Jjdl9zdGF0dXNfY29uc3VtZXI6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4OTQpLAorCSAvKiBjcmJfcmN2cGVnX3N0YXRlOiAqLworCSBORVRYRU5fTklDX1JFRygweDk4KSwKKwkgfSwKK307CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBuZXR4ZW5fcmVjdl9jcmIgcmVjdl9jcmJfcmVnaXN0ZXJzW107CisjZW5kaWYJCQkJLyogREVGSU5FX0dMT0JBTF9SRUNFSVZFX0NSQiAqLworCisvKgorICogVGVtcGVyYXR1cmUgY29udHJvbC4KKyAqLworZW51bSB7CisJTlhfVEVNUF9OT1JNQUwgPSAweDEsCS8qIE5vcm1hbCBvcGVyYXRpbmcgcmFuZ2UgKi8KKwlOWF9URU1QX1dBUk4sCQkvKiBTb3VuZCBhbGVydCwgdGVtcGVyYXR1cmUgZ2V0dGluZyBoaWdoICovCisJTlhfVEVNUF9QQU5JQwkJLyogRmF0YWwgZXJyb3IsIGhhcmR3YXJlIGhhcyBzaHV0IGRvd24uICovCit9OworCisjZW5kaWYJCQkJLyogX19OSUNfUEhBTl9SRUdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKaW5kZXggMDQ2MDA5OS4uNzk0Y2M2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKQEAgLTMzOCw3ICszMzgsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXR1cGxlX3QgdHVwbGU7Ci0JY2lzcGFyc2VfdCBwYXJzZTsKIAl1bnNpZ25lZCBzaG9ydCBidWZbMzJdOwogCWludCBsYXN0X2ZuLCBsYXN0X3JldCwgaSwgajsKIAlraW9fYWRkcl90IGlvYWRkcjsKQEAgLTM1MCwxNyArMzQ5LDYgQEAKIAogCURFQlVHKDAsICIzYzU3NF9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CiAJZm9yIChpID0gaiA9IDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CiAJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKQEAgLTM4Miw2ICszNzAsMTAgQEAKIAkvKiBUaGUgM2M1NzQgbm9ybWFsbHkgdXNlcyBhbiBFRVBST00gZm9yIGNvbmZpZ3VyYXRpb24gaW5mbywgaW5jbHVkaW5nCiAJICAgdGhlIGhhcmR3YXJlIGFkZHJlc3MuICBUaGUgZnV0dXJlIHByb2R1Y3RzIG1heSBpbmNsdWRlIGEgbW9kZW0gY2hpcAogCSAgIGFuZCBwdXQgdGhlIGFkZHJlc3MgaW4gdGhlIENJUy4gKi8KKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKIAl0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDg4OwogCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgewogCQlwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKQEAgLTM5NywxMiArMzg5LDkgQEAKIAkJCWdvdG8gZmFpbGVkOwogCQl9CiAJfQotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0JaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTICYmCi0JCXBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MgJiYKLQkJcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSA9PSBDU19TVUNDRVNTKSB7Ci0JCWNhcmRuYW1lID0gcGFyc2UudmVyc2lvbl8xLnN0ciArIHBhcnNlLnZlcnNpb25fMS5vZnNbMV07Ci0JfSBlbHNlCisJaWYgKGxpbmstPnByb2RfaWRbMV0pCisJCWNhcmRuYW1lID0gbGluay0+cHJvZF9pZFsxXTsKKwllbHNlCiAJCWNhcmRuYW1lID0gIjNDb20gM2M1NzQiOwogCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwppbmRleCAyMzFmYTJjLi4xZTczZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwpAQCAtMjUzLDcgKzI1Myw2IEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAgICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIHUxNiBidWZbMzJdLCAqcGh5c19hZGRyOwogICAgIGludCBsYXN0X2ZuLCBsYXN0X3JldCwgaSwgaiwgbXVsdGkgPSAwLCBmaWZvOwogICAgIGtpb19hZGRyX3QgaW9hZGRyOwpAQCAtMjYzLDI2ICsyNjIsMTYgQEAKIAogICAgIHBoeXNfYWRkciA9ICh1MTYgKilkZXYtPmRldl9hZGRyOwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0gICAgCi0gICAgLyogSXMgdGhpcyBhIDNjNTYyPyAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047Ci0gICAgaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYKLQkocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpIHsKLQlpZiAobGUxNl90b19jcHUoYnVmWzBdKSAhPSBNQU5GSURfM0NPTSkKKworICAgIC8qIElzIHRoaXMgYSAzYzU2Mj8gKi8KKyAgICBpZiAobGluay0+bWFuZl9pZCAhPSBNQU5GSURfM0NPTSkKIAkgICAgcHJpbnRrKEtFUk5fSU5GTyAiM2M1ODlfY3M6IGhtbW0sIGlzIHRoaXMgcmVhbGx5IGEgIgogCQkgICAiM0NvbSBjYXJkPz9cbiIpOwotCW11bHRpID0gKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEXzNDT01fM0M1NjIpOwotICAgIH0KKyAgICBtdWx0aSA9IChsaW5rLT5jYXJkX2lkID09IFBST0RJRF8zQ09NXzNDNTYyKTsKIAogICAgIC8qIEZvciB0aGUgM2M1NjIsIHRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSB4eDAwLXh4N2YgKi8KICAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYwppbmRleCA1ZGRkNTc0Li42MTM5MDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYwpAQCAtMjk5LDExICsyOTksNyBAQAogICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CiAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKwogICAgIC8qIGRvbid0IHRydXN0IHRoZSBDSVMgb24gdGhpczsgTGlua3N5cyBnb3QgaXQgd3JvbmcgKi8KICAgICBsaW5rLT5jb25mLlByZXNlbnQgPSAweDYzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCmluZGV4IDQ4NDM0ZDc5Li45MWY2NWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwpAQCAtMjQ5LDEyICsyNDksOSBAQAogc3RhdGljIGludCBjb20yMDAyMF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAgICAgc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIGNvbTIwMDIwX2Rldl90ICppbmZvOwogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOwotICAgIHVfY2hhciBidWZbNjRdOwogICAgIGludCBpb2FkZHI7CiAKICAgICBpbmZvID0gbGluay0+cHJpdjsKQEAgLTI2NCwxNiArMjYxLDYgQEAKIAogICAgIERFQlVHKDAsICJjb20yMDAyMF9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0KICAgICBERUJVRygxLCJhcmNuZXQ6IGJhc2Vwb3J0MSBpcyAlWGhcbiIsIGxpbmstPmlvLkJhc2VQb3J0MSk7CiAgICAgaSA9ICFDU19TVUNDRVNTOwogICAgIGlmICghbGluay0+aW8uQmFzZVBvcnQxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKaW5kZXggNjVmNmZkZi4uMGQ3ZGU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICB0dXBsZV90IHR1cGxlOwogICAgIGNpc3BhcnNlX3QgcGFyc2U7CiAgICAgdV9zaG9ydCBidWZbMzJdOwotICAgIGludCBpLCBsYXN0X2ZuLCBsYXN0X3JldCwgcmV0OworICAgIGludCBpLCBsYXN0X2ZuID0gMCwgbGFzdF9yZXQgPSAwLCByZXQ7CiAgICAga2lvX2FkZHJfdCBpb2FkZHI7CiAgICAgY2FyZHR5cGVfdCBjYXJkdHlwZTsKICAgICBjaGFyICpjYXJkX25hbWUgPSAidW5rbm93biI7CkBAIC0zNTAsMjEgKzM1MCw5IEBACiAKICAgICBERUJVRygwLCAiZm12ajE4eF9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgLyoKLSAgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICAgICByZWdpc3RlcnMuCi0gICAgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAgICAgdHVwbGUuVHVwbGVEYXRhID0gKHVfY2hhciAqKWJ1ZjsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0KLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsgCi0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKICAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKQEAgLTM3NCwxNyArMzYyLDEyIEBACiAJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7CiAJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7CiAJbGluay0+Y29uZi5Db25maWdJbmRleCA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW5kZXg7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKLQlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpCi0JICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCWVsc2UKLQkgICAgYnVmWzBdID0gMHhmZmZmOwotCXN3aXRjaCAobGUxNl90b19jcHUoYnVmWzBdKSkgeworCXN3aXRjaCAobGluay0+bWFuZl9pZCkgewogCWNhc2UgTUFORklEX1RESzoKIAkgICAgY2FyZHR5cGUgPSBUREs7Ci0JICAgIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfR04zNDEwCi0JCQl8fCBsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfTlA5NjEwCi0JCQl8fCBsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfTU4zMjAwKSB7CisJICAgIGlmIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9UREtfR04zNDEwCisJCQl8fCBsaW5rLT5jYXJkX2lkID09IFBST0RJRF9UREtfTlA5NjEwCisJCQl8fCBsaW5rLT5jYXJkX2lkID09IFBST0RJRF9UREtfTU4zMjAwKSB7CiAJCS8qIE11bHRpRnVuY3Rpb24gQ2FyZCAqLwogCQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSAweDgwMDsKIAkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NDc7CkBAIC0zOTUsMTEgKzM3OCwxMSBAQAogCSAgICBjYXJkdHlwZSA9IENPTlRFQzsKIAkgICAgYnJlYWs7CiAJY2FzZSBNQU5GSURfRlVKSVRTVToKLQkgICAgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX0ZVSklUU1VfTUJIMTAzMDIpCisJICAgIGlmIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzAyKQogICAgICAgICAgICAgICAgIC8qIFJBVE9DIFJFWC01NTg4Lzk4MjIvNDg4NidzIFBST0RJRCBhcmUgMDAwNCg9TUJIMTAzMDIpLAogICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVzZSBhcmUgTUJIMTAzMDQgYmFzZWQgY2FyZC4gKi8gCiAJCWNhcmR0eXBlID0gTUJIMTAzMDQ7Ci0JICAgIGVsc2UgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX0ZVSklUU1VfTUJIMTAzMDQpCisJICAgIGVsc2UgaWYgKGxpbmstPmNhcmRfaWQgPT0gUFJPRElEX0ZVSklUU1VfTUJIMTAzMDQpCiAJCWNhcmR0eXBlID0gTUJIMTAzMDQ7CiAJICAgIGVsc2UKIAkJY2FyZHR5cGUgPSBMQTUwMTsKQEAgLTQwOSwxNCArMzkyLDkgQEAKIAl9CiAgICAgfSBlbHNlIHsKIAkvKiBvbGQgdHlwZSBjYXJkICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKLQlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpCi0JICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCWVsc2UKLQkgICAgYnVmWzBdID0gMHhmZmZmOwotCXN3aXRjaCAobGUxNl90b19jcHUoYnVmWzBdKSkgeworCXN3aXRjaCAobGluay0+bWFuZl9pZCkgewogCWNhc2UgTUFORklEX0ZVSklUU1U6Ci0JICAgIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzA0KSB7CisJICAgIGlmIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzA0KSB7CiAJCWNhcmR0eXBlID0gWFhYMTAzMDQ7ICAgIC8qIE1CSDEwMzA0IHdpdGggYnVnZ3kgQ0lTICovCiAJICAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHgyMDsKIAkgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKaW5kZXggYmMwY2E0MS4uYTk1NmE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKQEAgLTIyMiwyNCArMjIyLDEyIEBACiAgICAgaWJtdHJfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OwogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CiAgICAgc3RydWN0IHRva19pbmZvICp0aSA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIHdpbl9yZXFfdCByZXE7CiAgICAgbWVtcmVxX3QgbWVtOwogICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKLSAgICB1X2NoYXIgYnVmWzY0XTsKIAogICAgIERFQlVHKDAsICJpYm10cl9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CiAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NjE7CiAKICAgICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBQUklNQVJZIG9yIEFMVEVSTkFURS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwppbmRleCBlNzcxMTBlLi4zYjcwNzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCkBAIC02NTYsMjMgKzY1NiwxMiBAQAogICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAgIHR1cGxlX3QgdHVwbGU7Ci0gIGNpc3BhcnNlX3QgcGFyc2U7CiAgIHVfY2hhciBidWZbNjRdOwogICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CiAgIGtpb19hZGRyX3QgaW9hZGRyOwogCiAgIERFQlVHKDAsICJubWNsYW5fY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLSAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCiAgIENTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSk7CiAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CiAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSk7CkBAIC02ODYsNiArNjc1LDcgQEAKICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwogICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7CiAgIG1lbWNweShkZXYtPmRldl9hZGRyLCB0dXBsZS5UdXBsZURhdGEsIEVUSEVSX0FERFJfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKaW5kZXggMGMwMGQxOC4uMmIxMjM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTUxOSwzMSArNTE5LDE1IEBACiAgICAgdHVwbGVfdCB0dXBsZTsKICAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbiwgc3RhcnRfcGcsIHN0b3BfcGcsIGNtX29mZnNldDsKLSAgICBpbnQgbWFuZmlkID0gMCwgcHJvZGlkID0gMCwgaGFzX3NobWVtID0gMDsKKyAgICBpbnQgaGFzX3NobWVtID0gMDsKICAgICB1X3Nob3J0IGJ1Zls2NF07CiAgICAgaHdfaW5mb190ICpod19pbmZvOwogCiAgICAgREVCVUcoMCwgInBjbmV0X2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKLSAgICBpZiAoKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJgotIAkocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpIHsKLQltYW5maWQgPSBsZTE2X3RvX2NwdShidWZbMF0pOwotCXByb2RpZCA9IGxlMTZfdG9fY3B1KGJ1ZlsxXSk7Ci0gICAgfQotCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKQEAgLTU4OSw4ICs1NzMsOCBAQAogCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwogCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CiAgICAgfQotICAgIGlmICgobWFuZmlkID09IE1BTkZJRF9JQk0pICYmCi0JKHByb2RpZCA9PSBQUk9ESURfSUJNX0hPTUVfQU5EX0FXQVkpKQorICAgIGlmICgobGluay0+bWFuZl9pZCA9PSBNQU5GSURfSUJNKSAmJgorCShsaW5rLT5jYXJkX2lkID09IFBST0RJRF9JQk1fSE9NRV9BTkRfQVdBWSkpCiAJbGluay0+Y29uZi5Db25maWdJbmRleCB8PSAweDEwOwogCiAgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKQEAgLTYyNCwxMCArNjA4LDEwIEBACiAgICAgaW5mby0+ZmxhZ3MgPSBod19pbmZvLT5mbGFnczsKICAgICAvKiBDaGVjayBmb3IgdXNlciBvdmVycmlkZXMgKi8KICAgICBpbmZvLT5mbGFncyB8PSAoZGVsYXlfb3V0cHV0KSA/IERFTEFZX09VVFBVVCA6IDA7Ci0gICAgaWYgKChtYW5maWQgPT0gTUFORklEX1NPQ0tFVCkgJiYKLQkoKHByb2RpZCA9PSBQUk9ESURfU09DS0VUX0xQRSkgfHwKLQkgKHByb2RpZCA9PSBQUk9ESURfU09DS0VUX0xQRV9DRikgfHwKLQkgKHByb2RpZCA9PSBQUk9ESURfU09DS0VUX0VJTykpKQorICAgIGlmICgobGluay0+bWFuZl9pZCA9PSBNQU5GSURfU09DS0VUKSAmJgorCSgobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfU09DS0VUX0xQRSkgfHwKKwkgKGxpbmstPmNhcmRfaWQgPT0gUFJPRElEX1NPQ0tFVF9MUEVfQ0YpIHx8CisJIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9TT0NLRVRfRUlPKSkpCiAJaW5mby0+ZmxhZ3MgJj0gflVTRV9CSUdfQlVGOwogICAgIGlmICghdXNlX2JpZ19idWYpCiAJaW5mby0+ZmxhZ3MgJj0gflVTRV9CSUdfQlVGOwpAQCAtMTA5Niw3ICsxMDgwLDYgQEAKIAogICAgIC8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCB3aXRoIGV4cGlyZWQgbGF0ZW5jeSB0aW1lcjogd2l0aAogICAgICAgIHRoaXMsIHdlIGNhbiBsaW1wIGFsb25nIGV2ZW4gaWYgdGhlIGludGVycnVwdCBpcyBibG9ja2VkICovCi0gICAgb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBuaWNfYmFzZSArIEU4MzkwX0NNRCk7CiAgICAgaWYgKGluZm8tPnN0YWxlKysgJiYgKGluYl9wKG5pY19iYXNlICsgRU4wX0lTUikgJiBFTklTUl9BTEwpKSB7CiAJaWYgKCFpbmZvLT5mYXN0X3BvbGwpCiAJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcnJ1cHQocykgZHJvcHBlZCFcbiIsIGRldi0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCmluZGV4IDIwZmNjMzUuLjUzMGRmODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC01NjAsMTYgKzU2MCw4IEBACiAKICAgICAvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgQ0lTLiAgSXQgaXMgc3RvcmVkIGFzIHRoZSBsYXN0CiAgICAgICAgKGZvdXJ0aCkgc3RyaW5nIGluIHRoZSBWZXJzaW9uIDEgVmVyc2lvbi9JRCB0dXBsZS4gKi8KLSAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLSAgICBpZiAoZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSAhPSBDU19TVUNDRVNTKSB7Ci0JcmMgPSAtMTsKLQlnb3RvIGZyZWVfY2ZnX21lbTsKLSAgICB9Ci0gICAgLyogVWdoIC0tIHRoZSBFTTExNDQgY2FyZCBoYXMgdHdvIFZFUlNfMSB0dXBsZXMhPyEgKi8KLSAgICBpZiAobmV4dF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpCi0JZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKLSAgICBpZiAocGFyc2UtPnZlcnNpb25fMS5ucyA+IDMpIHsKLQlzdGF0aW9uX2FkZHIgPSBwYXJzZS0+dmVyc2lvbl8xLnN0ciArIHBhcnNlLT52ZXJzaW9uXzEub2ZzWzNdOworICAgIGlmIChsaW5rLT5wcm9kX2lkWzNdKSB7CisJc3RhdGlvbl9hZGRyID0gbGluay0+cHJvZF9pZFszXTsKIAlpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBzdGF0aW9uX2FkZHIpID09IDApIHsKIAkJcmMgPSAwOwogCQlnb3RvIGZyZWVfY2ZnX21lbTsKQEAgLTc0NCwxNSArNzM2LDEyIEBACiAJfQogICAgIH0KICAgICAvKiBUcnkgdGhlIHRoaXJkIHN0cmluZyBpbiB0aGUgVmVyc2lvbiAxIFZlcnNpb24vSUQgdHVwbGUuICovCi0gICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0gICAgaWYgKGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSkgIT0gQ1NfU1VDQ0VTUykgewotCXJjID0gLTE7Ci0JZ290byBmcmVlX2NmZ19tZW07Ci0gICAgfQotICAgIHN0YXRpb25fYWRkciA9IHBhcnNlLT52ZXJzaW9uXzEuc3RyICsgcGFyc2UtPnZlcnNpb25fMS5vZnNbMl07Ci0gICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7Ci0JcmMgPSAwOwotCWdvdG8gZnJlZV9jZmdfbWVtOworICAgIGlmIChsaW5rLT5wcm9kX2lkWzJdKSB7CisJc3RhdGlvbl9hZGRyID0gbGluay0+cHJvZF9pZFsyXTsKKwlpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBzdGF0aW9uX2FkZHIpID09IDApIHsKKwkJcmMgPSAwOworCQlnb3RvIGZyZWVfY2ZnX21lbTsKKwl9CiAgICAgfQogCiAgICAgcmMgPSAtMTsKQEAgLTk3MCwxMCArOTU5LDYgQEAKIHsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgc3RydWN0IHNtY19jZmdfbWVtICpjZmdfbWVtOwotICAgIHR1cGxlX3QgKnR1cGxlOwotICAgIGNpc3BhcnNlX3QgKnBhcnNlOwotICAgIHVfY2hhciAqYnVmOwogICAgIGNoYXIgKm5hbWU7CiAgICAgaW50IGksIGosIHJldjsKICAgICBraW9fYWRkcl90IGlvYWRkcjsKQEAgLTk4MSwzMCArOTY2LDggQEAKIAogICAgIERFQlVHKDAsICJzbWM5MWM5Ml9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOwotICAgIGlmICghY2ZnX21lbSkKLQlnb3RvIGNvbmZpZ19mYWlsZWQ7Ci0KLSAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKLSAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKLSAgICBidWYgPSBjZmdfbWVtLT5idWY7Ci0KLSAgICB0dXBsZS0+QXR0cmlidXRlcyA9IHR1cGxlLT5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUtPlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUtPlR1cGxlRGF0YU1heCA9IDY0OwotCi0gICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0gICAgQ1NfRVhJVF9URVNUKGksIFBhcnNlVHVwbGUsIGNvbmZpZ19mYWlsZWQpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLT5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS0+Y29uZmlnLnJtYXNrWzBdOwotCi0gICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0gICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwotICAgIGlmIChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpID09IENTX1NVQ0NFU1MpIHsKLQlzbWMtPm1hbmZpZCA9IHBhcnNlLT5tYW5maWQubWFuZjsKLQlzbWMtPmNhcmRpZCA9IHBhcnNlLT5tYW5maWQuY2FyZDsKLSAgICB9CisgICAgc21jLT5tYW5maWQgPSBsaW5rLT5tYW5mX2lkOworICAgIHNtYy0+Y2FyZGlkID0gbGluay0+Y2FyZF9pZDsKIAogICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCiAJKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgewpAQCAtMTEzNCwxNCArMTA5NywxMiBAQAogICAgIAkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIgIE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iKTsKIAl9CiAgICAgfQotICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybiAwOwogCiBjb25maWdfdW5kbzoKICAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogY29uZmlnX2ZhaWxlZDoJCQkvKiBDU19FWElUX1RFU1QoKSBjYWxscyBqdW1wIHRvIGhlcmUuLi4gKi8KICAgICBzbWM5MWM5Ml9yZWxlYXNlKGxpbmspOwotICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybiAtRU5PREVWOwogfSAvKiBzbWM5MWM5Ml9jb25maWcgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKaW5kZXggZjM5MTRmNS4uNjk4MTM0MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpAQCAtNzA3LDIyICs3MDcsMTEgQEAKICAqIFJldHVybnM6IHRydWUgaWYgdGhpcyBpcyBhIENFMgogICovCiBzdGF0aWMgaW50Ci1oYXNfY2UyX3N0cmluZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIGxpbmspCitoYXNfY2UyX3N0cmluZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBfZGV2KQogewotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICB1X2NoYXIgYnVmWzI1Nl07Ci0KLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotICAgIGlmICghZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICYmIHBhcnNlLnZlcnNpb25fMS5ucyA+IDIpIHsKLQlpZiAoc3Ryc3RyKHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzJdLCAiQ0UyIikpCi0JICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlpZiAocF9kZXYtPnByb2RfaWRbMl0gJiYgc3Ryc3RyKHBfZGV2LT5wcm9kX2lkWzJdLCAiQ0UyIikpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKgpAQCAtNzkyLDEzICs3ODEsNiBAQAogCWdvdG8gZmFpbHVyZTsKICAgICB9CiAKLSAgICAvKiBnZXQgY29uZmlndXJhdGlvbiBzdHVmZiAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgaWYgKChlcnI9Zmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKSkKLQlnb3RvIGNpc19lcnJvcjsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSAgICBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KICAgICAvKiBnZXQgdGhlIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgQ0lTICovCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOwogICAgIGZvciAoZXJyID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOwpAQCAtMTA2Miw4ICsxMDQ0LDYgQEAKICAgICB4aXJjMnBzX3JlbGVhc2UobGluayk7CiAgICAgcmV0dXJuIC1FTk9ERVY7CiAKLSAgY2lzX2Vycm9yOgotICAgIHByaW50ayhLTk9UX1hJUkMgInVuYWJsZSB0byBwYXJzZSBDSVNcbiIpOwogICBmYWlsdXJlOgogICAgIHJldHVybiAtRU5PREVWOwogfSAvKiB4aXJjMnBzX2NvbmZpZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwppbmRleCBiNzllYzBkLi5mOTk0ZjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwpAQCAtNTYsMTMgKzU2LDE5IEBACiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBMQU44M0MxODUgUEhZCiAKK2NvbmZpZyBCUk9BRENPTV9QSFkKKwl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gUEhZcyIKKwlkZXBlbmRzIG9uIFBIWUxJQgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQkNNNTQxMSwgQkNNNTQyMSBhbmQgQkNNNTQ2MSBQSFlzLgorCiBjb25maWcgRklYRURfUEhZCiAJdHJpc3RhdGUgIkRyaXZlcnMgZm9yIFBIWSBlbXVsYXRpb24gb24gZml4ZWQgc3BlZWQvbGluayIKIAlkZXBlbmRzIG9uIFBIWUxJQgogCS0tLWhlbHAtLS0KIAkgIEFkZHMgdGhlIGRyaXZlciB0byBQSFkgbGF5ZXIgdG8gY292ZXIgdGhlIGJvYXJkcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBQSFkgYm91bmQsCi0JICBidXQgd2l0aCB0aGUgYWJpbGl0eSB0byBtYW5pcHVsYXRlIHdpdGggc3BlZWQvbGluayBpbiBzb2Z0d2FyZS4gVGhlIHJlbGF2YW50IE1JSQotCSAgc3BlZWQvZHVwbGV4IHBhcmFtZXRlcnMgY291bGQgYmUgZWZmZWN0aXZlbHkgaGFuZGxlZCBpbiB1c2VyLXNwZWNpZmllZCAgZnVjdGlvbi4KKwkgIGJ1dCB3aXRoIHRoZSBhYmlsaXR5IHRvIG1hbmlwdWxhdGUgdGhlIHNwZWVkL2xpbmsgaW4gc29mdHdhcmUuIFRoZSByZWxldmFudCBNSUkKKwkgIHNwZWVkL2R1cGxleCBwYXJhbWV0ZXJzIGNvdWxkIGJlIGVmZmVjdGl2ZWx5IGhhbmRsZWQgaW4gYSB1c2VyLXNwZWNpZmllZCBmdW5jdGlvbi4KIAkgIEN1cnJlbnRseSB0ZXN0ZWQgd2l0aCBtcGM4NjZhZHMuCiAKIGNvbmZpZyBGSVhFRF9NSUlfMTBfRkRYCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKaW5kZXggMzIwZjgzMi4uYmNkMWVmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQpAQCAtMTAsNCArMTAsNSBAQAogb2JqLSQoQ09ORklHX1FTRU1JX1BIWSkJCSs9IHFzZW1pLm8KIG9iai0kKENPTkZJR19TTVNDX1BIWSkJCSs9IHNtc2Mubwogb2JqLSQoQ09ORklHX1ZJVEVTU0VfUEhZKQkrPSB2aXRlc3NlLm8KK29iai0kKENPTkZJR19CUk9BRENPTV9QSFkpCSs9IGJyb2FkY29tLm8KIG9iai0kKENPTkZJR19GSVhFRF9QSFkpCQkrPSBmaXhlZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvYnJvYWRjb20uYyBiL2RyaXZlcnMvbmV0L3BoeS9icm9hZGNvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjY2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9waHkvYnJvYWRjb20uYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqCWRyaXZlcnMvbmV0L3BoeS9icm9hZGNvbS5jCisgKgorICoJQnJvYWRjb20gQkNNNTQxMSwgQkNNNTQyMSBhbmQgQkNNNTQ2MSBHaWdhYml0IEV0aGVybmV0CisgKgl0cmFuc2NlaXZlcnMuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA2ICBNYWNpZWogVy4gUm96eWNraQorICoKKyAqCUluc3BpcmVkIGJ5IGNvZGUgd3JpdHRlbiBieSBBbXkgRm9uZy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2RlZmluZSBNSUlfQkNNNTRYWF9FQ1IJCTB4MTAJLyogQkNNNTR4eCBleHRlbmRlZCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0VDUl9JTQkweDEwMDAJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfRUNSX0lGCTB4MDgwMAkvKiBJbnRlcnJ1cHQgZm9yY2UgKi8KKworI2RlZmluZSBNSUlfQkNNNTRYWF9FU1IJCTB4MTEJLyogQkNNNTR4eCBleHRlbmRlZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfRVNSX0lTCTB4MTAwMAkvKiBJbnRlcnJ1cHQgc3RhdHVzICovCisKKyNkZWZpbmUgTUlJX0JDTTU0WFhfSVNSCQkweDFhCS8qIEJDTTU0eHggaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTVIJCTB4MWIJLyogQkNNNTR4eCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfQ1JDRVJSCTB4MDAwMQkvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX0xJTksJMHgwMDAyCS8qIExpbmsgc3RhdHVzIGNoYW5nZWQgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX1NQRUVECTB4MDAwNAkvKiBMaW5rIHNwZWVkIGNoYW5nZSAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfRFVQTEVYCTB4MDAwOAkvKiBEdXBsZXggbW9kZSBjaGFuZ2VkICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9MUlMJMHgwMDEwCS8qIExvY2FsIHJlY2VpdmVyIHN0YXR1cyBjaGFuZ2VkICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9SUlMJMHgwMDIwCS8qIFJlbW90ZSByZWNlaXZlciBzdGF0dXMgY2hhbmdlZCAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfU1NFUlIJMHgwMDQwCS8qIFNjcmFtYmxlciBzeW5jaHJvbml6YXRpb24gZXJyb3IgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX1VIQ0QJMHgwMDgwCS8qIFVuc3VwcG9ydGVkIEhDRCBuZWdvdGlhdGVkICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9OSENECTB4MDEwMAkvKiBObyBIQ0QgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX05IQ0RMCTB4MDIwMAkvKiBObyBIQ0QgbGluayAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfQU5QUgkweDA0MDAJLyogQXV0by1uZWdvdGlhdGlvbiBwYWdlIHJlY2VpdmVkICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9MQwkweDA4MDAJLyogQWxsIGNvdW50ZXJzIGJlbG93IDEyOCAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfSEMJMHgxMDAwCS8qIENvdW50ZXIgYWJvdmUgMzI3NjggKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX01ESVgJMHgyMDAwCS8qIE1ESVggc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfUFNFUlIJMHg0MDAwCS8qIFBhaXIgc3dhcCBlcnJvciAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hY2llaiBXLiBSb3p5Y2tpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgYmNtNTR4eF9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZWcsIGVycjsKKworCXJlZyA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0JDTTU0WFhfRUNSKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCS8qIE1hc2sgaW50ZXJydXB0cyBnbG9iYWxseS4gICovCisJcmVnIHw9IE1JSV9CQ001NFhYX0VDUl9JTTsKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQkNNNTRYWF9FQ1IsIHJlZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBVbm1hc2sgZXZlbnRzIHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgKi8KKwlyZWcgPSB+KE1JSV9CQ001NFhYX0lOVF9EVVBMRVggfAorCQlNSUlfQkNNNTRYWF9JTlRfU1BFRUQgfAorCQlNSUlfQkNNNTRYWF9JTlRfTElOSyk7CisJZXJyID0gcGh5X3dyaXRlKHBoeWRldiwgTUlJX0JDTTU0WFhfSU1SLCByZWcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0eHhfYWNrX2ludGVycnVwdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZWc7CisKKwkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMuICAqLworCXJlZyA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0JDTTU0WFhfSVNSKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0eHhfY29uZmlnX2ludHIoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmVnLCBlcnI7CisKKwlyZWcgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9CQ001NFhYX0VDUik7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisKKwlpZiAocGh5ZGV2LT5pbnRlcnJ1cHRzID09IFBIWV9JTlRFUlJVUFRfRU5BQkxFRCkKKwkJcmVnICY9IH5NSUlfQkNNNTRYWF9FQ1JfSU07CisJZWxzZQorCQlyZWcgfD0gTUlJX0JDTTU0WFhfRUNSX0lNOworCisJZXJyID0gcGh5X3dyaXRlKHBoeWRldiwgTUlJX0JDTTU0WFhfRUNSLCByZWcpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBiY201NDExX2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwNzAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQxMSIsCisJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCisJLmZsYWdzCQk9IFBIWV9IQVNfTUFHSUNBTkVHIHwgUEhZX0hBU19JTlRFUlJVUFQsCisJLmNvbmZpZ19pbml0CT0gYmNtNTR4eF9jb25maWdfaW5pdCwKKwkuY29uZmlnX2FuZWcJPSBnZW5waHlfY29uZmlnX2FuZWcsCisJLnJlYWRfc3RhdHVzCT0gZ2VucGh5X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0gYmNtNTR4eF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9IGJjbTU0eHhfY29uZmlnX2ludHIsCisJLmRyaXZlciAJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQyMV9kcml2ZXIgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MGUwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJyb2FkY29tIEJDTTU0MjEiLAorCS5mZWF0dXJlcwk9IFBIWV9HQklUX0ZFQVRVUkVTLAorCS5mbGFncwkJPSBQSFlfSEFTX01BR0lDQU5FRyB8IFBIWV9IQVNfSU5URVJSVVBULAorCS5jb25maWdfaW5pdAk9IGJjbTU0eHhfY29uZmlnX2luaXQsCisJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdAk9IGJjbTU0eHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIJPSBiY201NHh4X2NvbmZpZ19pbnRyLAorCS5kcml2ZXIgCT0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIGJjbTU0NjFfZHJpdmVyID0geworCS5waHlfaWQJCT0gMHgwMDIwNjBjMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCcm9hZGNvbSBCQ001NDYxIiwKKwkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKKwkuZmxhZ3MJCT0gUEhZX0hBU19NQUdJQ0FORUcgfCBQSFlfSEFTX0lOVEVSUlVQVCwKKwkuY29uZmlnX2luaXQJPSBiY201NHh4X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZwk9IGdlbnBoeV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSBiY201NHh4X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0gYmNtNTR4eF9jb25maWdfaW50ciwKKwkuZHJpdmVyIAk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJyb2FkY29tX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3RlcigmYmNtNTQxMV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0XzU0MTE7CisJcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3RlcigmYmNtNTQyMV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0XzU0MjE7CisJcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3RlcigmYmNtNTQ2MV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0XzU0NjE7CisJcmV0dXJuIHJldDsKKworb3V0XzU0NjE6CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZiY201NDIxX2RyaXZlcik7CitvdXRfNTQyMToKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTU0MTFfZHJpdmVyKTsKK291dF81NDExOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBicm9hZGNvbV9leGl0KHZvaWQpCit7CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZiY201NDYxX2RyaXZlcik7CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZiY201NDIxX2RyaXZlcik7CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZiY201NDExX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGJyb2FkY29tX2luaXQpOworbW9kdWxlX2V4aXQoYnJvYWRjb21fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvZml4ZWQuYyBiL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCmluZGV4IGYxNGU5OTIuLjA5NmQ0YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCkBAIC0yNTQsNyArMjU0LDcgQEAKIAkJZ290byBkZXZpY2VfY3JlYXRlX2ZhaWw7CiAJfQogCi0JcGh5ZGV2LT5pcnEgPSAtMTsKKwlwaHlkZXYtPmlycSA9IFBIWV9JR05PUkVfSU5URVJSVVBUOwogCXBoeWRldi0+ZGV2LmJ1cyA9ICZtZGlvX2J1c190eXBlOwogCiAJaWYobnVtYmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IDNhZjlmY2YuLjg4MjM3YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKQEAgLTcsNiArNyw3IEBACiAgKiBBdXRob3I6IEFuZHkgRmxlbWluZwogICoKICAqIENvcHlyaWdodCAoYykgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA2ICBNYWNpZWogVy4gUm96eWNraQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0zMiw2ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC00ODQsNiArNDg3LDkgQEAKIHsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcGh5X2RhdDsKIAorCWlmIChQSFlfSEFMVEVEID09IHBoeWRldi0+c3RhdGUpCisJCXJldHVybiBJUlFfTk9ORTsJCS8qIEl0IGNhbid0IGJlIG91cnMuICAqLworCiAJLyogVGhlIE1ESU8gYnVzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIHdyaXR0ZW4gaW4gaW50ZXJydXB0CiAJICogY29udGV4dCwgc28gd2UgbmVlZCB0byBkaXNhYmxlIHRoZSBpcnEgaGVyZS4gIEEgd29yawogCSAqIHF1ZXVlIHdpbGwgd3JpdGUgdGhlIFBIWSB0byBkaXNhYmxlIGFuZCBjbGVhciB0aGUKQEAgLTU3Nyw2ICs1ODMsMTMgQEAKIAlpZiAoZXJyKQogCQlwaHlfZXJyb3IocGh5ZGV2KTsKIAorCS8qCisJICogRmluaXNoIGFueSBwZW5kaW5nIHdvcms7IHdlIG1pZ2h0IGhhdmUgYmVlbiBzY2hlZHVsZWQKKwkgKiB0byBiZSBjYWxsZWQgZnJvbSBrZXZlbnRkIG91cnNlbHZlcywgdGhvdWdoLgorCSAqLworCWlmICghY3VycmVudF9pc19rZXZlbnRkKCkpCisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKIAlmcmVlX2lycShwaHlkZXYtPmlycSwgcGh5ZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC02MDMsNyArNjE2LDggQEAKIAllbmFibGVfaXJxKHBoeWRldi0+aXJxKTsKIAogCS8qIFJlZW5hYmxlIGludGVycnVwdHMgKi8KLQllcnIgPSBwaHlfY29uZmlnX2ludGVycnVwdChwaHlkZXYsIFBIWV9JTlRFUlJVUFRfRU5BQkxFRCk7CisJaWYgKFBIWV9IQUxURUQgIT0gcGh5ZGV2LT5zdGF0ZSkKKwkJZXJyID0gcGh5X2NvbmZpZ19pbnRlcnJ1cHQocGh5ZGV2LCBQSFlfSU5URVJSVVBUX0VOQUJMRUQpOwogCiAJaWYgKGVycikKIAkJZ290byBpcnFfZW5hYmxlX2VycjsKQEAgLTYyNCwxOCArNjM4LDI0IEBACiAJaWYgKFBIWV9IQUxURUQgPT0gcGh5ZGV2LT5zdGF0ZSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JaWYgKHBoeWRldi0+aXJxICE9IFBIWV9QT0xMKSB7Ci0JCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KLQkJcGh5X2NsZWFyX2ludGVycnVwdChwaHlkZXYpOworCXBoeWRldi0+c3RhdGUgPSBQSFlfSEFMVEVEOwogCisJaWYgKHBoeWRldi0+aXJxICE9IFBIWV9QT0xMKSB7CiAJCS8qIERpc2FibGUgUEhZIEludGVycnVwdHMgKi8KIAkJcGh5X2NvbmZpZ19pbnRlcnJ1cHQocGh5ZGV2LCBQSFlfSU5URVJSVVBUX0RJU0FCTEVEKTsKLQl9CiAKLQlwaHlkZXYtPnN0YXRlID0gUEhZX0hBTFRFRDsKKwkJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCQlwaHlfY2xlYXJfaW50ZXJydXB0KHBoeWRldik7CisJfQogCiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZwaHlkZXYtPmxvY2spOworCisJLyoKKwkgKiBDYW5ub3QgY2FsbCBmbHVzaF9zY2hlZHVsZWRfd29yaygpIGhlcmUgYXMgZGVzaXJlZCBiZWNhdXNlCisJICogb2YgcnRubF9sb2NrKCksIGJ1dCBQSFlfSEFMVEVEIHNoYWxsIGd1YXJhbnRlZSBwaHlfY2hhbmdlKCkKKwkgKiB3aWxsIG5vdCByZWVuYWJsZSBpbnRlcnJ1cHRzLgorCSAqLwogfQogCiAKQEAgLTY5Myw2MCArNzEzLDU3IEBACiAKIAkJCWJyZWFrOwogCQljYXNlIFBIWV9BTjoKKwkJCWVyciA9IHBoeV9yZWFkX3N0YXR1cyhwaHlkZXYpOworCisJCQlpZiAoZXJyIDwgMCkKKwkJCQlicmVhazsKKworCQkJLyogSWYgdGhlIGxpbmsgaXMgZG93biwgZ2l2ZSB1cCBvbgorCQkJICogbmVnb3RpYXRpb24gZm9yIG5vdyAqLworCQkJaWYgKCFwaHlkZXYtPmxpbmspIHsKKwkJCQlwaHlkZXYtPnN0YXRlID0gUEhZX05PTElOSzsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihwaHlkZXYtPmF0dGFjaGVkX2Rldik7CisJCQkJcGh5ZGV2LT5hZGp1c3RfbGluayhwaHlkZXYtPmF0dGFjaGVkX2Rldik7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCS8qIENoZWNrIGlmIG5lZ290aWF0aW9uIGlzIGRvbmUuICBCcmVhawogCQkJICogaWYgdGhlcmUncyBhbiBlcnJvciAqLwogCQkJZXJyID0gcGh5X2FuZWdfZG9uZShwaHlkZXYpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJYnJlYWs7CiAKLQkJCS8qIElmIGF1dG8tbmVnb3RpYXRpb24gaXMgZG9uZSwgd2UgY2hhbmdlIHRvCi0JCQkgKiBlaXRoZXIgUlVOTklORywgb3IgTk9MSU5LICovCisJCQkvKiBJZiBBTiBpcyBkb25lLCB3ZSdyZSBydW5uaW5nICovCiAJCQlpZiAoZXJyID4gMCkgewotCQkJCWVyciA9IHBoeV9yZWFkX3N0YXR1cyhwaHlkZXYpOwotCi0JCQkJaWYgKGVycikKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAocGh5ZGV2LT5saW5rKSB7Ci0JCQkJCXBoeWRldi0+c3RhdGUgPSBQSFlfUlVOTklORzsKLQkJCQkJbmV0aWZfY2Fycmllcl9vbihwaHlkZXYtPmF0dGFjaGVkX2Rldik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGh5ZGV2LT5zdGF0ZSA9IFBIWV9OT0xJTks7Ci0JCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBoeWRldi0+YXR0YWNoZWRfZGV2KTsKLQkJCQl9Ci0KKwkJCQlwaHlkZXYtPnN0YXRlID0gUEhZX1JVTk5JTkc7CisJCQkJbmV0aWZfY2Fycmllcl9vbihwaHlkZXYtPmF0dGFjaGVkX2Rldik7CiAJCQkJcGh5ZGV2LT5hZGp1c3RfbGluayhwaHlkZXYtPmF0dGFjaGVkX2Rldik7CiAKIAkJCX0gZWxzZSBpZiAoMCA9PSBwaHlkZXYtPmxpbmtfdGltZW91dC0tKSB7Ci0JCQkJLyogVGhlIGNvdW50ZXIgZXhwaXJlZCwgc28gZWl0aGVyIHdlCi0JCQkJICogc3dpdGNoIHRvIGZvcmNlZCBtb2RlLCBvciB0aGUKLQkJCQkgKiBtYWdpY19hbmVnIGJpdCBleGlzdHMsIGFuZCB3ZSB0cnkgYW5lZwotCQkJCSAqIGFnYWluICovCi0JCQkJaWYgKCEocGh5ZGV2LT5kcnYtPmZsYWdzICYgUEhZX0hBU19NQUdJQ0FORUcpKSB7Ci0JCQkJCWludCBpZHg7Ci0KLQkJCQkJLyogV2UnbGwgc3RhcnQgZnJvbSB0aGUKLQkJCQkJICogZmFzdGVzdCBzcGVlZCwgYW5kIHdvcmsKLQkJCQkJICogb3VyIHdheSBkb3duICovCi0JCQkJCWlkeCA9IHBoeV9maW5kX3ZhbGlkKDAsCi0JCQkJCQkJcGh5ZGV2LT5zdXBwb3J0ZWQpOwotCi0JCQkJCXBoeWRldi0+c3BlZWQgPSBzZXR0aW5nc1tpZHhdLnNwZWVkOwotCQkJCQlwaHlkZXYtPmR1cGxleCA9IHNldHRpbmdzW2lkeF0uZHVwbGV4OwotCQkJCQkKLQkJCQkJcGh5ZGV2LT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwotCQkJCQlwaHlkZXYtPnN0YXRlID0gUEhZX0ZPUkNJTkc7Ci0JCQkJCXBoeWRldi0+bGlua190aW1lb3V0ID0KLQkJCQkJCVBIWV9GT1JDRV9USU1FT1VUOwotCi0JCQkJCXByX2luZm8oIlRyeWluZyAlZC8lc1xuIiwKLQkJCQkJCQlwaHlkZXYtPnNwZWVkLAotCQkJCQkJCURVUExFWF9GVUxMID09Ci0JCQkJCQkJcGh5ZGV2LT5kdXBsZXggPwotCQkJCQkJCSJGVUxMIiA6ICJIQUxGIik7Ci0JCQkJfQorCQkJCWludCBpZHg7CiAKIAkJCQluZWVkc19hbmVnID0gMTsKKwkJCQkvKiBJZiB3ZSBoYXZlIHRoZSBtYWdpY19hbmVnIGJpdCwKKwkJCQkgKiB3ZSB0cnkgYWdhaW4gKi8KKwkJCQlpZiAocGh5ZGV2LT5kcnYtPmZsYWdzICYgUEhZX0hBU19NQUdJQ0FORUcpCisJCQkJCWJyZWFrOworCisJCQkJLyogVGhlIHRpbWVyIGV4cGlyZWQsIGFuZCB3ZSBzdGlsbAorCQkJCSAqIGRvbid0IGhhdmUgYSBzZXR0aW5nLCBzbyB3ZSB0cnkKKwkJCQkgKiBmb3JjaW5nIGl0IHVudGlsIHdlIGZpbmQgb25lIHRoYXQKKwkJCQkgKiB3b3Jrcywgc3RhcnRpbmcgZnJvbSB0aGUgZmFzdGVzdCBzcGVlZCwKKwkJCQkgKiBhbmQgd29ya2luZyBvdXIgd2F5IGRvd24gKi8KKwkJCQlpZHggPSBwaHlfZmluZF92YWxpZCgwLCBwaHlkZXYtPnN1cHBvcnRlZCk7CisKKwkJCQlwaHlkZXYtPnNwZWVkID0gc2V0dGluZ3NbaWR4XS5zcGVlZDsKKwkJCQlwaHlkZXYtPmR1cGxleCA9IHNldHRpbmdzW2lkeF0uZHVwbGV4OworCisJCQkJcGh5ZGV2LT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisJCQkJcHJfaW5mbygiVHJ5aW5nICVkLyVzXG4iLCBwaHlkZXYtPnNwZWVkLAorCQkJCQkJRFVQTEVYX0ZVTEwgPT0KKwkJCQkJCXBoeWRldi0+ZHVwbGV4ID8KKwkJCQkJCSJGVUxMIiA6ICJIQUxGIik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfTk9MSU5LOgpAQCAtNzYyLDcgKzc3OSw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfRk9SQ0lORzoKLQkJCWVyciA9IHBoeV9yZWFkX3N0YXR1cyhwaHlkZXYpOworCQkJZXJyID0gZ2VucGh5X3VwZGF0ZV9saW5rKHBoeWRldik7CiAKIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwppbmRleCAzYmJkNWU3Li5iMDFmYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAlkZXYtPmR1cGxleCA9IC0xOwogCWRldi0+cGF1c2UgPSBkZXYtPmFzeW1fcGF1c2UgPSAwOwogCWRldi0+bGluayA9IDE7CisJZGV2LT5pbnRlcmZhY2UgPSBQSFlfSU5URVJGQUNFX01PREVfR01JSTsKIAogCWRldi0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwogCkBAIC0xMzcsMTEgKzEzOCwxMiBAQAogICogICB0aGUgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LgogICovCiBzdHJ1Y3QgcGh5X2RldmljZSAqIHBoeV9jb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnBoeV9pZCwKLQkJdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICopLCB1MzIgZmxhZ3MpCisJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwgdTMyIGZsYWdzLAorCQl1MzIgaW50ZXJmYWNlKQogewogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAKLQlwaHlkZXYgPSBwaHlfYXR0YWNoKGRldiwgcGh5X2lkLCBmbGFncyk7CisJcGh5ZGV2ID0gcGh5X2F0dGFjaChkZXYsIHBoeV9pZCwgZmxhZ3MsIGludGVyZmFjZSk7CiAKIAlpZiAoSVNfRVJSKHBoeWRldikpCiAJCXJldHVybiBwaHlkZXY7CkBAIC0xODYsNyArMTg4LDcgQEAKIH0KIAogc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJY29uc3QgY2hhciAqcGh5X2lkLCB1MzIgZmxhZ3MpCisJCWNvbnN0IGNoYXIgKnBoeV9pZCwgdTMyIGZsYWdzLCB1MzIgaW50ZXJmYWNlKQogewogCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gJm1kaW9fYnVzX3R5cGU7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKQEAgLTIzMSw2ICsyMzMsMjAgQEAKIAogCXBoeWRldi0+ZGV2X2ZsYWdzID0gZmxhZ3M7CiAKKwlwaHlkZXYtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKworCS8qIERvIGluaXRpYWwgY29uZmlndXJhdGlvbiBoZXJlLCBub3cgdGhhdAorCSAqIHdlIGhhdmUgY2VydGFpbiBrZXkgcGFyYW1ldGVycworCSAqIChkZXZfZmxhZ3MgYW5kIGludGVyZmFjZSkgKi8KKwlpZiAocGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gcGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KHBoeWRldik7CisKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKwogCXJldHVybiBwaHlkZXY7CiB9CiBFWFBPUlRfU1lNQk9MKHBoeV9hdHRhY2gpOwpAQCAtNDI3LDYgKzQ0Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZ2VucGh5X3VwZGF0ZV9saW5rKTsKIAogLyogZ2VucGh5X3JlYWRfc3RhdHVzCiAgKgpAQCAtNjExLDEzICs2MjgsOCBAQAogCiAJc3Bpbl91bmxvY2soJnBoeWRldi0+bG9jayk7CiAKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmIChwaHlkZXYtPmRydi0+Y29uZmlnX2luaXQpCi0JCWVyciA9IHBoeWRldi0+ZHJ2LT5jb25maWdfaW5pdChwaHlkZXYpOwotCiAJcmV0dXJuIGVycjsKKwogfQogCiBzdGF0aWMgaW50IHBoeV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKaW5kZXggZjU4MDJlNy4uYzZkZTU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCkBAIC04NjAsNyArODYwLDcgQEAKIAkJCWVyciA9IFBUUl9FUlIocHBwX2NsYXNzKTsKIAkJCWdvdG8gb3V0X2NocmRldjsKIAkJfQotCQljbGFzc19kZXZpY2VfY3JlYXRlKHBwcF9jbGFzcywgTlVMTCwgTUtERVYoUFBQX01BSk9SLCAwKSwgTlVMTCwgInBwcCIpOworCQlkZXZpY2VfY3JlYXRlKHBwcF9jbGFzcywgTlVMTCwgTUtERVYoUFBQX01BSk9SLCAwKSwgInBwcCIpOwogCX0KIAogb3V0OgpAQCAtMjY3NSw3ICsyNjc1LDcgQEAKIAljYXJkbWFwX2Rlc3Ryb3koJmFsbF9wcHBfdW5pdHMpOwogCWlmICh1bnJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiKSAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgIlBQUDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgUFBQIGRldmljZVxuIik7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3kocHBwX2NsYXNzLCBNS0RFVihQUFBfTUFKT1IsIDApKTsKKwlkZXZpY2VfZGVzdHJveShwcHBfY2xhc3MsIE1LREVWKFBQUF9NQUpPUiwgMCkpOwogCWNsYXNzX2Rlc3Ryb3kocHBwX2NsYXNzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb2UuYyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKaW5kZXggMGFkZWU3My4uMzE1ZDVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwb2UuYworKysgYi9kcml2ZXJzL25ldC9wcHBvZS5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIAogCXBvID0gZ2V0X2l0ZW0oKHVuc2lnbmVkIGxvbmcpIHBoLT5zaWQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpOwogCWlmIChwbyAhPSBOVUxMKQotCQlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2tfcHBwb3gocG8pLCBza2IpOworCQlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2tfcHBwb3gocG8pLCBza2IsIDApOwogZHJvcDoKIAlrZnJlZV9za2Ioc2tiKTsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IDI3ZjkwYjIuLjQ1ZDNjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtNTcxLDggKzU3MSw4IEBACiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCXZhbCA9IChtZGlvX3JlYWQoaW9hZGRyLCBNSUlfQk1DUikgfCBCTUNSX1JFU0VUKSAmIDB4ZmZmZjsKLQltZGlvX3dyaXRlKGlvYWRkciwgTUlJX0JNQ1IsIHZhbCk7CisJbWRpb193cml0ZShpb2FkZHIsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwl2YWwgPSBtZGlvX3JlYWQoaW9hZGRyLCBNSUlfQk1DUik7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxNjlfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTE0MDYsNiArMTQwNiwyMiBAQAogCWZyZWVfbmV0ZGV2KGRldik7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcGh5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IGk7CisKKwl0cC0+cGh5X3Jlc2V0X2VuYWJsZShpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIXRwLT5waHlfcmVzZXRfcGVuZGluZyhpb2FkZHIpKQorCQkJcmV0dXJuOworCQltc2xlZXAoMSk7CisJfQorCWlmIChuZXRpZl9tc2dfbGluayh0cCkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBIWSByZXNldCBmYWlsZWQuXG4iLCBkZXYtPm5hbWUpOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTY5X2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQogewogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKQEAgLTE0MzQsNiArMTQ1MCw4IEBACiAKIAlydGw4MTY5X2xpbmtfb3B0aW9uKGJvYXJkX2lkeCwgJmF1dG9uZWcsICZzcGVlZCwgJmR1cGxleCk7CiAKKwlydGw4MTY5X3BoeV9yZXNldChkZXYsIHRwKTsKKwogCXJ0bDgxNjlfc2V0X3NwZWVkKGRldiwgYXV0b25lZywgc3BlZWQsIGR1cGxleCk7CiAKIAlpZiAoKFJUTF9SOChQSFlzdGF0dXMpICYgVEJJX0VuYWJsZSkgJiYgbmV0aWZfbXNnX2xpbmsodHApKQpAQCAtMTQ3Myw4ICsxNDkxLDggQEAKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXZvaWQgX19pb21lbSAqaW9hZGRyOwotCXVuc2lnbmVkIGludCBpLCBwbV9jYXA7Ci0JaW50IHJjOworCXVuc2lnbmVkIGludCBwbV9jYXA7CisJaW50IGksIHJjOwogCiAJaWYgKG5ldGlmX21zZ19kcnYoJmRlYnVnKSkgewogCQlwcmludGsoS0VSTl9JTkZPICIlcyBHaWdhYml0IEV0aGVybmV0IGRyaXZlciAlcyBsb2FkZWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkcnYybmQuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oCmluZGV4IDc3OGQ5ZTYuLjNmYTY3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogLyoKICoqIEludGVyaW0gZGVmaW5pdGlvbiBvZiBTS19EUlZfVElNRVIgcGxhY2VkIGluIHRoaXMgZmlsZSB1bnRpbCAKLSoqIGNvbW1vbiBtb2R1bGVzIGhhdmUgYm9vbiBmaW5hbGxpemVkCisqKiBjb21tb24gbW9kdWxlcyBoYXZlIGJlZW4gZmluYWxpemVkCiAqLwogI2RlZmluZSBTS19EUlZfVElNRVIJCQkxMSAKICNkZWZpbmUJU0tfRFJWX01PREVSQVRJT05fVElNRVIJCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tkaW0uYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tkaW0uYwppbmRleCAwN2MxYjRjLi4zN2NlMDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jCkBAIC0yNTIsNyArMjUyLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqIEZ1bmN0aW9uICAgICA6IFNrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncwotKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MgcmVnYXJpbmcgaW50ZXJydXB0IG1vZGVyYXRpb24KKyoqIERlc2NyaXB0aW9uICA6IERpc3BsYXlzIHRoZSBjdXJyZW50IHNldHRpbmdzIHJlZ2FyZGluZyBpbnRlcnJ1cHQgbW9kZXJhdGlvbgogKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgogKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCiAqKiBSZXR1cm5zICAgICAgOiB2b2lkICghKQpAQCAtNTEwLDcgKzUxMCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiBGdW5jdGlvbiAgICAgOiBEaXNhYmxlSW50TW9kKCkKLSoqIERlc2NyaXB0aW9uICA6IERpc2JsZXMgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIGluZGVwZW5kZW50IG9mIHdoYXQgaW50ZXItCisqKiBEZXNjcmlwdGlvbiAgOiBEaXNhYmxlcyB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gaW5kZXBlbmRlbnQgb2Ygd2hhdCBpbnRlci0KICoqICAgICAgICAgICAgICAgIHJ1cHRzIGFyZSBydW5uaW5nIG9yIG5vdAogKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgogKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2V0aHRvb2wuYwppbmRleCBlNWNiNWI1Li4zNjQ2MDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tldGh0b29sLmMKQEAgLTU4MSw2ICs1ODEsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBnZXRSZWdzTGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDB4NDAwMDsKK30KKworLyoKKyAqIFJldHVybnMgY29weSBvZiB3aG9sZSBjb250cm9sIHJlZ2lzdGVyIHJlZ2lvbgorICogTm90ZTogc2tpcCBSQU0gYWRkcmVzcyByZWdpc3RlciBiZWNhdXNlIGFjY2Vzc2luZyBpdCB3aWxsCisgKiAJIGNhdXNlIGJ1cyBoYW5ncyEKKyAqLworc3RhdGljIHZvaWQgZ2V0UmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkJICB2b2lkICpwKQoreworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHZvaWQgX19pb21lbSAqaW8gPSBwTmV0LT5wQUMtPklvQmFzZTsKKworCXJlZ3MtPnZlcnNpb24gPSAxOworCW1lbXNldChwLCAwLCByZWdzLT5sZW4pOworCW1lbWNweV9mcm9taW8ocCwgaW8sIEIzX1JBTV9BRERSKTsKKworCW1lbWNweV9mcm9taW8ocCArIEIzX1JJX1dUT19SMSwgaW8gKyBCM19SSV9XVE9fUjEsCisJCSAgICAgIHJlZ3MtPmxlbiAtIEIzX1JJX1dUT19SMSk7Cit9CisKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBTa0dlRXRodG9vbE9wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IGdldFNldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MJCT0gc2V0U2V0dGluZ3MsCkBAIC01OTksNCArNjIzLDYgQEAKIAkuc2V0X3R4X2NzdW0JCT0gc2V0VHhDc3VtLAogCS5nZXRfcnhfY3N1bQkJPSBnZXRSeENzdW0sCiAJLnNldF9yeF9jc3VtCQk9IHNldFJ4Q3N1bSwKKwkuZ2V0X3JlZ3MJCT0gZ2V0UmVncywKKwkuZ2V0X3JlZ3NfbGVuCQk9IGdldFJlZ3NMZW4sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwppbmRleCBkNDkxM2MzLi45MmQxMWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpAQCAtMTEzLDYgKzExMyw4IEBACiAjaW5jbHVkZQk8bGludXgvaW5pdC5oPgogI2luY2x1ZGUJPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZQk8bGludXgvaXAuaD4KKyNpbmNsdWRlCTxsaW51eC9taWkuaD4KKyNpbmNsdWRlCTxsaW51eC9tbS5oPgogCiAjaW5jbHVkZQkiaC9za2RydjFzdC5oIgogI2luY2x1ZGUJImgvc2tkcnYybmQuaCIKQEAgLTE1NjEsNyArMTU2Myw3IEBACiAKIAlpZiAocE1lc3NhZ2UtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCXUxNiBoZHJsZW4gPSBwTWVzc2FnZS0+aC5yYXcgLSBwTWVzc2FnZS0+ZGF0YTsKLQkJdTE2IG9mZnNldCA9IGhkcmxlbiArIHBNZXNzYWdlLT5jc3VtOworCQl1MTYgb2Zmc2V0ID0gaGRybGVuICsgcE1lc3NhZ2UtPmNzdW1fb2Zmc2V0OwogCiAJCWlmICgocE1lc3NhZ2UtPmguaXBpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQICkgJiYKIAkJCShwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApICYmCkBAIC0xNjgwLDcgKzE2ODIsNyBAQAogCSovCiAJaWYgKHBNZXNzYWdlLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQl1MTYgaGRybGVuID0gcE1lc3NhZ2UtPmgucmF3IC0gcE1lc3NhZ2UtPmRhdGE7Ci0JCXUxNiBvZmZzZXQgPSBoZHJsZW4gKyBwTWVzc2FnZS0+Y3N1bTsKKwkJdTE2IG9mZnNldCA9IGhkcmxlbiArIHBNZXNzYWdlLT5jc3VtX29mZnNldDsKIAogCQlDb250cm9sID0gQk1VX1NURldEOwogCkBAIC0yODQzLDYgKzI4NDUsNTYgQEAKIAlyZXR1cm4oJnBBQy0+c3RhdHMpOwogfSAvKiBTa0dlU3RhdHMgKi8KIAorLyoKKyAqIEJhc2ljIE1JSSByZWdpc3RlciBhY2Nlc3MKKyAqLworc3RhdGljIGludCBTa0dlTWlpSW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSwgaW50IGNtZCkKK3sKKwlERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCVNLX0lPQyBJb0MgPSBwQUMtPklvQmFzZTsKKwlpbnQgUG9ydCA9IHBOZXQtPlBvcnROcjsKKwlTS19HRVBPUlQgKnBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCXVuc2lnbmVkIGxvbmcgRmxhZ3M7CisJaW50IGVyciA9IDA7CisJaW50IHJlZyA9IGRhdGEtPnJlZ19udW0gJiAweDFmOworCVNLX1UxNiB2YWwgPSBkYXRhLT52YWxfaW47CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CS8qIFBoeSBzdGlsbCBpbiByZXNldCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJCWRhdGEtPnBoeV9pZCA9IHBQcnQtPlBoeUFkZHI7CisKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIFNJT0NHTUlJUkVHOgorCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykKKwkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCByZWcsICZ2YWwpOworCQllbHNlCisJCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgcmVnLCAmdmFsKTsKKworCQlkYXRhLT52YWxfb3V0ID0gdmFsOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWVyciA9IC1FUEVSTTsKKworCQllbHNlIGlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKQorCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCByZWcsIHZhbCk7CisJCWVsc2UKKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgcmVnLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwl9CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJcmV0dXJuIGVycjsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yODc2LDYgKzI5MjgsOSBAQAogCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXBBQyA9IHBOZXQtPnBBQzsKIAkKKwlpZiAoY21kID09IFNJT0NHTUlJUEhZIHx8IGNtZCA9PSBTSU9DU01JSVJFRyB8fCBjbWQgPT0gU0lPQ0dNSUlSRUcpCisJICAgIHJldHVybiBTa0dlTWlpSW9jdGwoZGV2LCBpZl9taWkocnEpLCBjbWQpOworCiAJaWYoY29weV9mcm9tX3VzZXIoJklvY3RsLCBycS0+aWZyX2RhdGEsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCBiMjk0OTAzLi41NTEzOTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC0yMTU0LDggKzIxNTQsNiBAQAogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKIAl1MTYgY3RybDsKIAotCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIDApOwotCiAJY3RybCA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpOwogCWN0cmwgJj0gfihHTV9HUENSX1JYX0VOQSB8IEdNX0dQQ1JfVFhfRU5BKTsKIAlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgY3RybCk7CkBAIC0yMTY3LDcgKzIxNjUsNiBAQAogCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLCBjdHJsKTsKIAl9CiAKLQl5dWtvbl9yZXNldChodywgcG9ydCk7CiAJc2tnZV9saW5rX2Rvd24oc2tnZSk7CiAKIAl5dWtvbl9pbml0KGh3LCBwb3J0KTsKQEAgLTIyNTUsNiArMjI1Miw3IEBACiB7CiAJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CiAJaW50IHBvcnQgPSBza2dlLT5wb3J0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W3BvcnRdOwogCiAJbmV0aWZfc3RvcF9xdWV1ZShza2dlLT5uZXRkZXYpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKHNrZ2UtPm5ldGRldik7CkBAIC0yMjY4LDYgKzIyNjYsOCBAQAogCQl5dWtvbl9pbml0KGh3LCBwb3J0KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZody0+cGh5X211dGV4KTsKKworCWRldi0+c2V0X211bHRpY2FzdF9saXN0KGRldik7CiB9CiAKIC8qIEJhc2ljIE1JSSBzdXBwb3J0ICovCkBAIC0yNTY1LDcgKzI1NjUsNyBAQAogCiAJCXRkLT5jc3VtX29mZnMgPSAwOwogCQl0ZC0+Y3N1bV9zdGFydCA9IG9mZnNldDsKLQkJdGQtPmNzdW1fd3JpdGUgPSBvZmZzZXQgKyBza2ItPmNzdW07CisJCXRkLT5jc3VtX3dyaXRlID0gb2Zmc2V0ICsgc2tiLT5jc3VtX29mZnNldDsKIAl9IGVsc2UKIAkJY29udHJvbCA9IEJNVV9DSEVDSzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5jIGIvZHJpdmVycy9uZXQvc2t5Mi5jCmluZGV4IDE2NjE2ZjUuLjg0MmFiZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuYworKysgYi9kcml2ZXJzL25ldC9za3kyLmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4OUUwMCkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0YjAwKSB9LAkvKiBER0UtNTYwVCAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDQwMDEpIH0sIAkvKiBER0UtNTUwU1ggKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0QjAyKSB9LAkvKiBER0UtNTYwU1ggKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNDApIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQxKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0MikgfSwKQEAgLTY3NiwxNyArNjc3LDE1IEBACiAJLyogRmx1c2ggUnggTUFDIEZJRk8gb24gYW55IGZsb3cgY29udHJvbCBvciBlcnJvciAqLwogCXNreTJfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9NU0spLCBHTVJfRlNfQU5ZX0VSUik7CiAKLQkvKiBTZXQgdGhyZXNob2xkIHRvIDB4YSAoNjQgYnl0ZXMpCi0JICogIEFTRiBkaXNhYmxlZCBzbyBubyBuZWVkIHRvIGRvIFdBIGRldiAjNC4zMAotCSAqLwotCXNreTJfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9USFIpLCBSWF9HTUZfRkxfVEhSX0RFRik7CisJLyogU2V0IHRocmVzaG9sZCB0byAweGEgKDY0IGJ5dGVzKSArIDEgdG8gd29ya2Fyb3VuZCBwYXVzZSBidWcgICovCisJc2t5Ml93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0ZMX1RIUiksIFJYX0dNRl9GTF9USFJfREVGKzEpOwogCiAJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCiAJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9DTFIpOwogCXNreTJfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfT1BFUl9PTik7CiAKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSB7Ci0JCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0xQX1RIUiksIDUxMi84KTsKKwkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfTFBfVEhSKSwgNzY4LzgpOwogCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9VUF9USFIpLCAxMDI0LzgpOwogCQlpZiAoaHctPmRldltwb3J0XS0+bXR1ID4gRVRIX0RBVEFfTEVOKSB7CiAJCQkvKiBzZXQgVHggR01BQyBGSUZPIEFsbW9zdCBFbXB0eSBUaHJlc2hvbGQgKi8KQEAgLTEwNjAsNyArMTA1OSw4IEBACiAJc2t5Mi0+cnhfcHV0ID0gc2t5Mi0+cnhfbmV4dCA9IDA7CiAJc2t5Ml9xc2V0KGh3LCByeHEpOwogCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSAmJiBody0+Y2hpcF9yZXYgPj0gMikgeworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UgJiYKKwkgICAgKGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19VX0ExIHx8IGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19VX0IwKSkgewogCQkvKiBNQUMgUnggUkFNIFJlYWQgaXMgY29udHJvbGxlZCBieSBoYXJkd2FyZSAqLwogCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihyeHEsIFFfRiksIEZfTV9SWF9SQU1fRElTKTsKIAl9CkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogCQl1MzIgdGNwc3VtOwogCiAJCXRjcHN1bSA9IG9mZnNldCA8PCAxNjsJCS8qIHN1bSBzdGFydCAqLwotCQl0Y3BzdW0gfD0gb2Zmc2V0ICsgc2tiLT5jc3VtOwkvKiBzdW0gd3JpdGUgKi8KKwkJdGNwc3VtIHw9IG9mZnNldCArIHNrYi0+Y3N1bV9vZmZzZXQ7CS8qIHN1bSB3cml0ZSAqLwogCiAJCWN0cmwgPSBDQUxTVU0gfCBXUl9TVU0gfCBJTklUX1NVTSB8IExPQ0tfU1VNOwogCQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKQpAQCAtMTQ1Myw3ICsxNDUzLDcgQEAKIAkJCWlmICh1bmxpa2VseShuZXRpZl9tc2dfdHhfZG9uZShza3kyKSkpCiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBkb25lICV1XG4iLAogCQkJCSAgICAgICBkZXYtPm5hbWUsIGlkeCk7Ci0JCQlkZXZfa2ZyZWVfc2tiKHJlLT5za2IpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkocmUtPnNrYik7CiAJCX0KIAogCQlsZS0+b3Bjb2RlID0gMDsJLyogcGFyYW5vaWEgKi8KQEAgLTE1MDksNyArMTUwOSw3IEBACiAKIAkvKiBXQSBmb3IgZGV2LiAjNC4yMDkgKi8KIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VCi0JICAgICYmIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19VX0ExKQorCSAgICAmJiAoaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0VDX1VfQTEgfHwgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0VDX1VfQjApKQogCQlza3kyX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwKIAkJCSAgICAgc2t5Mi0+c3BlZWQgIT0gU1BFRURfMTAwMCA/CiAJCQkgICAgIFRYX1NURldfRU5BIDogVFhfU1RGV19ESVMpOwpAQCAtMjA2NSw3ICsyMDY1LDcgQEAKIAkJY2FzZSBPUF9SWFNUQVQ6CiAJCQlza2IgPSBza3kyX3JlY2VpdmUoZGV2LCBsZW5ndGgsIHN0YXR1cyk7CiAJCQlpZiAoIXNrYikKLQkJCQlicmVhazsKKwkJCQlnb3RvIGZvcmNlX3VwZGF0ZTsKIAogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CkBAIC0yMDgxLDggKzIwODEsOCBAQAogCiAJCQkvKiBVcGRhdGUgcmVjZWl2ZXIgYWZ0ZXIgMTYgZnJhbWVzICovCiAJCQlpZiAoKytidWZfd3JpdGVbbGUtPmxpbmtdID09IFJYX0JVRl9XUklURSkgewotCQkJCXNreTJfcHV0X2lkeChodywgcnhxYWRkcltsZS0+bGlua10sCi0JCQkJCSAgICAgc2t5Mi0+cnhfcHV0KTsKK2ZvcmNlX3VwZGF0ZToKKwkJCQlza3kyX3B1dF9pZHgoaHcsIHJ4cWFkZHJbbGUtPmxpbmtdLCBza3kyLT5yeF9wdXQpOwogCQkJCWJ1Zl93cml0ZVtsZS0+bGlua10gPSAwOwogCQkJfQogCkBAIC0zMzExLDcgKzMzMTEsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlpZiAoc3RhdHVzICYgWTJfSVNfSVJRX1NXKSB7Ci0JCWh3LT5tc2lfZGV0ZWN0ZWQgPSAxOworCQlody0+bXNpID0gMTsKIAkJd2FrZV91cCgmaHctPm1zaV93YWl0KTsKIAkJc2t5Ml93cml0ZTgoaHcsIEIwX0NUU1QsIENTX0NMX1NXX0lSUSk7CiAJfQpAQCAtMzMzMCw3ICszMzMwLDcgQEAKIAogCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgWTJfSVNfSVJRX1NXKTsKIAotCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2t5Ml90ZXN0X2ludHIsIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgaHcpOworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2t5Ml90ZXN0X2ludHIsIDAsIERSVl9OQU1FLCBodyk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKQEAgLTMzNDAsOSArMzM0MCw5IEBACiAJc2t5Ml93cml0ZTgoaHcsIEIwX0NUU1QsIENTX1NUX1NXX0lSUSk7CiAJc2t5Ml9yZWFkOChodywgQjBfQ1RTVCk7CiAKLQl3YWl0X2V2ZW50X3RpbWVvdXQoaHctPm1zaV93YWl0LCBody0+bXNpX2RldGVjdGVkLCBIWi8xMCk7CisJd2FpdF9ldmVudF90aW1lb3V0KGh3LT5tc2lfd2FpdCwgaHctPm1zaSwgSFovMTApOwogCi0JaWYgKCFody0+bXNpX2RldGVjdGVkKSB7CisJaWYgKCFody0+bXNpKSB7CiAJCS8qIE1TSSB0ZXN0IGZhaWxlZCwgZ28gYmFjayB0byBJTlR4IG1vZGUgKi8KIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBObyBpbnRlcnJ1cHQgZ2VuZXJhdGVkIHVzaW5nIE1TSSwgIgogCQkgICAgICAgInN3aXRjaGluZyB0byBJTlR4IG1vZGUuXG4iLApAQCAtMzQ3NSw3ICszNDc1LDggQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwogCX0KIAotCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgIHNreTJfaW50ciwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgaHcpOworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgIHNreTJfaW50ciwgaHctPm1zaSA/IDAgOiBJUlFGX1NIQVJFRCwKKwkJCSAgZGV2LT5uYW1lLCBodyk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKQEAgLTM1MDUsNyArMzUwNiw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfdW5yZWdpc3RlcjoKLQlwY2lfZGlzYWJsZV9tc2kocGRldik7CisJaWYgKGh3LT5tc2kpCisJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogZXJyX291dF9mcmVlX25ldGRldjoKIAlmcmVlX25ldGRldihkZXYpOwpAQCAtMzU0OCw3ICszNTUwLDggQEAKIAlza3kyX3JlYWQ4KGh3LCBCMF9DVFNUKTsKIAogCWZyZWVfaXJxKHBkZXYtPmlycSwgaHcpOwotCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKwlpZiAoaHctPm1zaSkKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgU1RBVFVTX0xFX0JZVEVTLCBody0+c3RfbGUsIGh3LT5zdF9kbWEpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5oIGIvZHJpdmVycy9uZXQvc2t5Mi5oCmluZGV4IDZkMmEyM2YuLjc3NjA1NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuaAorKysgYi9kcml2ZXJzL25ldC9za3kyLmgKQEAgLTM4Myw4ICszODMsMTMgQEAKIAlDSElQX1JFVl9ZVV9FQ19BMiAgICA9IDEsICAvKiBDaGlwIFJldi4gZm9yIFl1a29uLUVDIEEyICovCiAJQ0hJUF9SRVZfWVVfRUNfQTMgICAgPSAyLCAgLyogQ2hpcCBSZXYuIGZvciBZdWtvbi1FQyBBMyAqLwogCi0JQ0hJUF9SRVZfWVVfRUNfVV9BMCAgPSAwLAotCUNISVBfUkVWX1lVX0VDX1VfQTEgID0gMSwKKwlDSElQX1JFVl9ZVV9FQ19VX0EwICA9IDEsCisJQ0hJUF9SRVZfWVVfRUNfVV9BMSAgPSAyLAorCUNISVBfUkVWX1lVX0VDX1VfQjAgID0gMywKKworCUNISVBfUkVWX1lVX0ZFX0ExICAgID0gMSwKKwlDSElQX1JFVl9ZVV9GRV9BMiAgICA9IDIsCisKIH07CiAKIC8qCUIyX1kyX0NMS19HQVRFCSA4IGJpdAlDbG9jayBHYXRpbmcgKFl1a29uLTIgb25seSkgKi8KQEAgLTE4OTUsNyArMTkwMCw3IEBACiAJZG1hX2FkZHJfdCAgIAkgICAgIHN0X2RtYTsKIAogCXN0cnVjdCB0aW1lcl9saXN0ICAgIGlkbGVfdGltZXI7Ci0JaW50CQkgICAgIG1zaV9kZXRlY3RlZDsKKwlpbnQJCSAgICAgbXNpOwogCXdhaXRfcXVldWVfaGVhZF90ICAgIG1zaV93YWl0OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCmluZGV4IDQxODEzOGQuLjEzZTBhNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYworKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKQEAgLTg4LDEyICs4OCwxMSBAQAogc3RhdGljIGlubGluZSB1MzIKIHNwaWRlcl9uZXRfcmVhZF9yZWcoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgdTMyIHJlZykKIHsKLQl1MzIgdmFsdWU7Ci0KLQl2YWx1ZSA9IHJlYWRsKGNhcmQtPnJlZ3MgKyByZWcpOwotCXZhbHVlID0gbGUzMl90b19jcHUodmFsdWUpOwotCi0JcmV0dXJuIHZhbHVlOworCS8qIFdlIHVzZSB0aGUgcG93ZXJwYyBzcGVjaWZpYyB2YXJpYW50cyBpbnN0ZWFkIG9mIHJlYWRsX2JlKCkgYmVjYXVzZQorCSAqIHdlIGtub3cgc3BpZGVybmV0IGlzIG5vdCBhIHJlYWwgUENJIGRldmljZSBhbmQgd2UgY2FuIHRodXMgYXZvaWQgdGhlCisJICogcGVyZm9ybWFuY2UgaGl0IGNhdXNlZCBieSB0aGUgUENJIHdvcmthcm91bmRzLgorCSAqLworCXJldHVybiBpbl9iZTMyKGNhcmQtPnJlZ3MgKyByZWcpOwogfQogCiAvKioKQEAgLTEwNSw4ICsxMDQsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc3BpZGVyX25ldF93cml0ZV9yZWcoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIHZhbHVlKQogewotCXZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOwotCXdyaXRlbCh2YWx1ZSwgY2FyZC0+cmVncyArIHJlZyk7CisJLyogV2UgdXNlIHRoZSBwb3dlcnBjIHNwZWNpZmljIHZhcmlhbnRzIGluc3RlYWQgb2Ygd3JpdGVsX2JlKCkgYmVjYXVzZQorCSAqIHdlIGtub3cgc3BpZGVybmV0IGlzIG5vdCBhIHJlYWwgUENJIGRldmljZSBhbmQgd2UgY2FuIHRodXMgYXZvaWQgdGhlCisJICogcGVyZm9ybWFuY2UgaGl0IGNhdXNlZCBieSB0aGUgUENJIHdvcmthcm91bmRzLgorCSAqLworCW91dF9iZTMyKGNhcmQtPnJlZ3MgKyByZWcsIHZhbHVlKTsKIH0KIAogLyoqIHNwaWRlcl9uZXRfd3JpdGVfcGh5IC0gd3JpdGUgdG8gcGh5IHJlZ2lzdGVyCkBAIC02NDQsMjAgKzY0NiwxMiBAQAogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcjsKIAlkbWFfYWRkcl90IGJ1ZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBsZW5ndGg7CiAKLQlsZW5ndGggPSBza2ItPmxlbjsKLQlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKLQkJaWYgKHNrYl9wYWQoc2tiLCBFVEhfWkxFTi1sZW5ndGgpKQotCQkJcmV0dXJuIDA7Ci0JCWxlbmd0aCA9IEVUSF9aTEVOOwotCX0KLQotCWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwgbGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlidWYgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGJ1ZikpIHsKIAkJaWYgKG5ldGlmX21zZ190eF9lcnIoY2FyZCkgJiYgbmV0X3JhdGVsaW1pdCgpKQogCQkJcHJfZXJyKCJjb3VsZCBub3QgaW9tbXUtbWFwIHBhY2tldCAoJXAsICVpKS4gIgotCQkJCSAgIkRyb3BwaW5nIHBhY2tldFxuIiwgc2tiLT5kYXRhLCBsZW5ndGgpOworCQkJCSAgIkRyb3BwaW5nIHBhY2tldFxuIiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJCWNhcmQtPnNwaWRlcl9zdGF0cy50eF9pb21tdV9tYXBfZXJyb3IrKzsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNjY3LDcgKzY2MSw3IEBACiAJY2FyZC0+dHhfY2hhaW4uaGVhZCA9IGRlc2NyLT5uZXh0OwogCiAJZGVzY3ItPmJ1Zl9hZGRyID0gYnVmOwotCWRlc2NyLT5idWZfc2l6ZSA9IGxlbmd0aDsKKwlkZXNjci0+YnVmX3NpemUgPSBza2ItPmxlbjsKIAlkZXNjci0+bmV4dF9kZXNjcl9hZGRyID0gMDsKIAlkZXNjci0+c2tiID0gc2tiOwogCWRlc2NyLT5kYXRhX3N0YXR1cyA9IDA7CkBAIC04MDIsOCArNzk2LDggQEAKIAogCQkvKiB1bm1hcCB0aGUgc2tiICovCiAJCWlmIChza2IpIHsKLQkJCWludCBsZW4gPSBza2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBza2ItPmxlbjsKLQkJCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGRldiwgYnVmX2FkZHIsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGJ1Zl9hZGRyLCBza2ItPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCX0KIAl9CkBAIC0xNjQxLDcgKzE2MzUsNyBAQAogCQkJICAgICBTUElERVJfTkVUX0lOVDJfTUFTS19WQUxVRSk7CiAKIAlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEVERNQUNDTlRSLAotCQkJICAgICBTUElERVJfTkVUX0dEVEJTVEEgfCBTUElERVJfTkVUX0dEVERDRUlESVMpOworCQkJICAgICBTUElERVJfTkVUX0dEVEJTVEEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaCBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaAppbmRleCBiM2I0NjExLi4zZTE5NmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaWZuZGVmIF9TUElERVJfTkVUX0gKICNkZWZpbmUgX1NQSURFUl9ORVRfSAogCi0jZGVmaW5lIFZFUlNJT04gIjEuMSBBIgorI2RlZmluZSBWRVJTSU9OICIxLjYgQSIKIAogI2luY2x1ZGUgInN1bmdlbV9waHkuaCIKIApAQCAtMjE3LDggKzIxNyw3IEBACiAjZGVmaW5lIFNQSURFUl9ORVRfR0RUQlNUQSAgICAgICAgICAgICAweDAwMDAwMzAwCiAjZGVmaW5lIFNQSURFUl9ORVRfR0RURENFSURJUyAgICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIFNQSURFUl9ORVRfRE1BX1RYX1ZBTFVFICAgICAgICBTUElERVJfTkVUX1RYX0RNQV9FTiB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSURFUl9ORVRfR0RUQlNUQSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSURFUl9ORVRfR0RURENFSURJUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJREVSX05FVF9HRFRCU1RBCiAKICNkZWZpbmUgU1BJREVSX05FVF9ETUFfVFhfRkVORF9WQUxVRQkweDAwMDMwMDAzCiAKQEAgLTMyOCw3ICszMjcsOCBAQAogCVNQSURFUl9ORVRfR1JJU1BETkdJTlQKIH07CiAKLSNkZWZpbmUgU1BJREVSX05FVF9UWElOVAkoICgxIDw8IFNQSURFUl9ORVRfR0RURkRDSU5UKSApCisjZGVmaW5lIFNQSURFUl9ORVRfVFhJTlQJKCAoMSA8PCBTUElERVJfTkVUX0dEVEZEQ0lOVCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFNQSURFUl9ORVRfR0RURENFSU5UKSApCiAKIC8qIFdlIHJlbHkgb24gZmxhZ2dlZCBkZXNjcmlwdG9yIGludGVycnVwdHMgKi8KICNkZWZpbmUgU1BJREVSX05FVF9SWElOVAkoICgxIDw8IFNQSURFUl9ORVRfR0RBRkRDSU5UKSApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwppbmRleCA3YTBhZWU2Li5iZjg3M2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwppbmRleCBiODY1ZGIzLi40N2ExYzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwppbmRleCA0MWM1MDNkLi5jMDZlY2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTI2NCw4ICsyNjQsNiBAQAogCUFTSUNDdHJsID0gMHgzMCwKIAlFRURhdGEgPSAweDM0LAogCUVFQ3RybCA9IDB4MzYsCi0JVHhTdGFydFRocmVzaCA9IDB4M2MsCi0JUnhFYXJseVRocmVzaCA9IDB4M2UsCiAJRmxhc2hBZGRyID0gMHg0MCwKIAlGbGFzaERhdGEgPSAweDQ0LAogCVR4U3RhdHVzID0gMHg0NiwKQEAgLTc5MCw2ICs3ODgsNyBAQAogewogCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKIAogCS8qIERvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoaXA/Pz8gKi8KQEAgLTgzNCw2ICs4MzMsMTAgQEAKIAkJaW93cml0ZTgoMHgwMSwgaW9hZGRyICsgRGVidWdDdHJsMSk7CiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOworCXJlc2V0X3R4KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKKwogCWlvd3JpdGUxNiAoU3RhdHNFbmFibGUgfCBSeEVuYWJsZSB8IFR4RW5hYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CiAKIAlpZiAobmV0aWZfbXNnX2lmdXAobnApKQpAQCAtMTA4MSw2ICsxMDg0LDggQEAKIAogCS8qIGZyZWUgYWxsIHR4IHNrYnVmZiAqLwogCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSAwOworCiAJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07CiAJCWlmIChza2IpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCkBAIC0xMDk2LDYgKzExMDEsMTAgQEAKIAl9CiAJbnAtPmN1cl90eCA9IG5wLT5kaXJ0eV90eCA9IDA7CiAJbnAtPmN1cl90YXNrID0gMDsKKworCW5wLT5sYXN0X3R4ID0gTlVMTDsKKwlpb3dyaXRlOCgxMjcsIGlvYWRkciArIFR4RE1BUG9sbFBlcmlvZCk7CisKIAlpb3dyaXRlMTYgKFN0YXRzRW5hYmxlIHwgUnhFbmFibGUgfCBUeEVuYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOwogCXJldHVybiAwOwogfQpAQCAtMTExMSw2ICsxMTIwLDcgQEAKIAlpbnQgdHhfY250OwogCWludCB0eF9zdGF0dXM7CiAJaW50IGhhbmRsZWQgPSAwOworCWludCBpOwogCiAKIAlkbyB7CkBAIC0xMTUzLDIxICsxMTYzLDI0IEBACiAJCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDIpCiAJCQkJCQlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCiAJCQkJCS8qCiAJCQkJCSoqIFRoaXMgcmVzZXQgaGFzIGJlZW4gdmVyaWZpZWQgb24KIAkJCQkJKiogREZFLTU4MFRYIGJvYXJkcyAhIHBoZG1AbWFjcWVsLmJlLgogCQkJCQkqLwogCQkJCQlpZiAodHhfc3RhdHVzICYgMHgxMCkgewkvKiBUeFVuZGVycnVuICovCi0JCQkJCQl1bnNpZ25lZCBzaG9ydCB0eHRocmVzaG9sZDsKLQotCQkJCQkJdHh0aHJlc2hvbGQgPSBpb3JlYWQxNiAoaW9hZGRyICsgVHhTdGFydFRocmVzaCk7CiAJCQkJCQkvKiBSZXN0YXJ0IFR4IEZJRk8gYW5kIHRyYW5zbWl0dGVyICovCiAJCQkJCQlzdW5kYW5jZV9yZXNldChkZXYsIChOZXR3b3JrUmVzZXR8RklGT1Jlc2V0fFR4UmVzZXQpIDw8IDE2KTsKLQkJCQkJCWlvd3JpdGUxNiAodHh0aHJlc2hvbGQsIGlvYWRkciArIFR4U3RhcnRUaHJlc2gpOwogCQkJCQkJLyogTm8gbmVlZCB0byByZXNldCB0aGUgVHggcG9pbnRlciBoZXJlICovCiAJCQkJCX0KLQkJCQkJLyogUmVzdGFydCB0aGUgVHguICovCi0JCQkJCWlvd3JpdGUxNiAoVHhFbmFibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKKwkJCQkJLyogUmVzdGFydCB0aGUgVHguIE5lZWQgdG8gbWFrZSBzdXJlIHR4IGVuYWJsZWQgKi8KKwkJCQkJaSA9IDEwOworCQkJCQlkbyB7CisJCQkJCQlpb3dyaXRlMTYoaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDEpIHwgVHhFbmFibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKKwkJCQkJCWlmIChpb3JlYWQxNihpb2FkZHIgKyBNQUNDdHJsMSkgJiBUeEVuYWJsZWQpCisJCQkJCQkJYnJlYWs7CisJCQkJCQltZGVsYXkoMSk7CisJCQkJCX0gd2hpbGUgKC0taSk7CiAJCQkJfQogCQkJCS8qIFl1cCwgdGhpcyBpcyBhIGRvY3VtZW50YXRpb24gYnVnLiAgSXQgY29zdCBtZSAqaG91cnMqLiAqLwogCQkJCWlvd3JpdGUxNiAoMCwgaW9hZGRyICsgVHhTdGF0dXMpOwpAQCAtMTYyOSw2ICsxNjQyLDE0IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaTsKIAorCS8qIFdhaXQgYW5kIGtpbGwgdGFza2xldCAqLworCXRhc2tsZXRfa2lsbCgmbnAtPnJ4X3Rhc2tsZXQpOworCXRhc2tsZXRfa2lsbCgmbnAtPnR4X3Rhc2tsZXQpOworCW5wLT5jdXJfdHggPSAwOworCW5wLT5kaXJ0eV90eCA9IDA7CisJbnAtPmN1cl90YXNrID0gMDsKKwlucC0+bGFzdF90eCA9IE5VTEw7CisKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAlpZiAobmV0aWZfbXNnX2lmZG93bihucCkpIHsKQEAgLTE2NDMsMTIgKzE2NjQsMjYgQEAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLwogCWlvd3JpdGUxNigweDAwMDAsIGlvYWRkciArIEludHJFbmFibGUpOwogCisJLyogRGlzYWJsZSBSeCBhbmQgVHggRE1BIGZvciBzYWZlbHkgcmVsZWFzZSByZXNvdXJjZSAqLworCWlvd3JpdGUzMigweDUwMCwgaW9hZGRyICsgRE1BQ3RybCk7CisKIAkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KIAlpb3dyaXRlMTYoVHhEaXNhYmxlIHwgUnhEaXNhYmxlIHwgU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CiAKLQkvKiBXYWl0IGFuZCBraWxsIHRhc2tsZXQgKi8KLQl0YXNrbGV0X2tpbGwoJm5wLT5yeF90YXNrbGV0KTsKLQl0YXNrbGV0X2tpbGwoJm5wLT50eF90YXNrbGV0KTsKKyAgICAJZm9yIChpID0gMjAwMDsgaSA+IDA7IGktLSkgeworIAkJaWYgKChpb3JlYWQzMihpb2FkZHIgKyBETUFDdHJsKSAmIDB4YzAwMCkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisgICAgCX0KKworICAgIAlpb3dyaXRlMTYoR2xvYmFsUmVzZXQgfCBETUFSZXNldCB8IEZJRk9SZXNldCB8IE5ldHdvcmtSZXNldCwKKwkJCWlvYWRkciArQVNJQ0N0cmwgKyAyKTsKKworICAgIAlmb3IgKGkgPSAyMDAwOyBpID4gMDsgaS0tKSB7CisgCQlpZiAoKGlvcmVhZDE2KGlvYWRkciArIEFTSUNDdHJsICsyKSAmIFJlc2V0QnVzeSkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisgICAgCX0KIAogI2lmZGVmIF9faTM4Nl9fCiAJaWYgKG5ldGlmX21zZ19odyhucCkpIHsKQEAgLTE2ODYsNiArMTcyMSw3IEBACiAJCX0KIAl9CiAJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT50eF9yaW5nW2ldLm5leHRfZGVzYyA9IDA7CiAJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07CiAJCWlmIChza2IpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW0uYyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCmluZGV4IDI1M2U5NmUuLmNmNDRlNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTEwMzAsNyArMTAzMSw3IEBACiAJCXU2NCBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7CiAKIAkJY3N1bV9zdGFydF9vZmYgPSAodTY0KSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCWNzdW1fc3R1ZmZfb2ZmID0gKHU2NCkgKChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YSk7CisJCWNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OwogCiAJCWN0cmwgPSAoVFhEQ1RSTF9DRU5BQiB8CiAJCQkoY3N1bV9zdGFydF9vZmYgPDwgMTUpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKaW5kZXggOWQ3Y2QxMy4uZWY2NzE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuaG1lLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0yMjcyLDcgKzIyNzMsNyBAQAogCQl1MzIgY3N1bV9zdGFydF9vZmYsIGNzdW1fc3R1ZmZfb2ZmOwogCiAJCWNzdW1fc3RhcnRfb2ZmID0gKHUzMikgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOwotCQljc3VtX3N0dWZmX29mZiA9ICh1MzIpICgoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGEpOworCQljc3VtX3N0dWZmX29mZiA9IGNzdW1fc3RhcnRfb2ZmICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQl0eF9mbGFncyA9IChUWEZMQUdfT1dOIHwgVFhGTEFHX0NTRU5BQkxFIHwKIAkJCSAgICAoKGNzdW1fc3RhcnRfb2ZmIDw8IDE0KSAmIFRYRkxBR19DU0JVRkJFR0lOKSB8CkBAIC0zMDEyLDYgKzMwMTMsMTEgQEAKICNlbmRpZgogCiAJZXJyID0gLUVOT0RFVjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBlcnJfb3V0OworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCiAJaWYgKCFzdHJjbXAocHJvbV9uYW1lLCAiU1VOVyxxZmUiKSB8fCAhc3RyY21wKHByb21fbmFtZSwgInFmZSIpKSB7CiAJCXFwID0gcXVhdHRyb19wY2lfZmluZChwZGV2KTsKIAkJaWYgKHFwID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCmluZGV4IGJmZTU5ODYuLjBkOTdlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCkBAIC0xODI2LDcgKzE4MjYsNyBAQAogCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAlpZiAoSVB2NF9wKSB7CiAJCXNrYi0+Y3N1bSA9IGNoa3N1bTsKLQkJc2tiLT5pcF9zdW1tZWQgPSAxOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwogCX0KIAluZXRpZl9yeChza2IpOwogCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYwppbmRleCBjZDE0MmQwLi44ZjRlY2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmMKQEAgLTE3NzEsNyArMTc3MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9seW1waWNfcGNpX2luaXQodm9pZCkgCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJm9seW1waWNfZHJpdmVyKSA7IAorCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZvbHltcGljX2RyaXZlcikgOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgb2x5bXBpY19wY2lfY2xlYW51cCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jIGIvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzgwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKQEAgLTAsMCArMSwxNzA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA2IFR1bmRyYSBTZW1pY29uZHVjdG9yIENvcnBvcmF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIGRyaXZlciBjb2RlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkCisgKiBmb3IgdGhlIEludGVsIElPQzgwMzE0IChGb3Jlc3RMYWtlKSBHaWdhYml0IEV0aGVybmV0IGJ5CisgKiBzY290dC53b29kQHRpbWVzeXMuY29tICAqIENvcHlyaWdodCAoQykgMjAwMyBUaW1lU3lzIENvcnBvcmF0aW9uCisgKgorICogQ3VycmVudGx5IGNoYW5nZXMgZnJvbSBvcmlnaW5hbCB2ZXJzaW9uIGFyZToKKyAqIC0gcG9ydGluZyB0byBUc2kxMDgtYmFzZWQgcGxhdGZvcm0gYW5kIGtlcm5lbCAyLjYgKGtvbmcubGFpQHR1bmRyYS5jb20pCisgKiAtIG1vZGlmaWNhdGlvbnMgdG8gaGFuZGxlIHR3byBwb3J0cyBpbmRlcGVuZGVudGx5IGFuZCBzdXBwb3J0IGZvcgorICogICBhZGRpdGlvbmFsIFBIWSBkZXZpY2VzIChhbGV4YW5kcmUuYm91bmluZUB0dW5kcmEuY29tKQorICogLSBHZXQgaGFyZHdhcmUgaW5mb3JtYXRpb24gZnJvbSBwbGF0Zm9ybSBkZXZpY2UuICh0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90c2kxMDguaD4KKworI2luY2x1ZGUgInRzaTEwOF9ldGguaCIKKworI2RlZmluZSBNSUlfUkVBRF9ERUxBWSAxMDAwMAkvKiBtYXggbGluayB3YWl0IHRpbWUgaW4gbXNlYyAqLworCisjZGVmaW5lIFRTSTEwOF9SWFJJTkdfTEVOICAgICAyNTYKKworLyogTk9URTogVGhlIGRyaXZlciBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCByZWNlaXZpbmcgcGFja2V0cworICogbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplLCBzbyBkb24ndCBkZWNyZWFzZSB0aGlzICh1bmxlc3MgeW91CisgKiB3YW50IHRvIGFkZCBzdWNoIHN1cHBvcnQpLgorICovCisjZGVmaW5lIFRTSTEwOF9SWEJVRl9TSVpFICAgICAxNTM2CisKKyNkZWZpbmUgVFNJMTA4X1RYUklOR19MRU4gICAgIDI1NgorCisjZGVmaW5lIFRTSTEwOF9UWF9JTlRfRlJFUSAgICA2NAorCisvKiBDaGVjayB0aGUgcGh5IHN0YXR1cyBldmVyeSBoYWxmIGEgc2Vjb25kLiAqLworI2RlZmluZSBDSEVDS19QSFlfSU5URVJWQUwgKEhaLzIpCisKK3N0YXRpYyBpbnQgdHNpMTA4X2luaXRfb25lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworc3RhdGljIGludCB0c2kxMDhfZXRoZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCitzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhIHsKKwl2b2lkICBfX2lvbWVtICpyZWdzOwkvKiBCYXNlIG9mIG5vcm1hbCByZWdzICovCisJdm9pZCAgX19pb21lbSAqcGh5cmVnczsJLyogQmFzZSBvZiByZWdpc3RlciBiYW5rIHVzZWQgZm9yIFBIWSBhY2Nlc3MgKi8KKworCXVuc2lnbmVkIGludCBwaHk7CQkvKiBJbmRleCBvZiBQSFkgZm9yIHRoaXMgaW50ZXJmYWNlICovCisJdW5zaWduZWQgaW50IGlycV9udW07CisJdW5zaWduZWQgaW50IGlkOworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7LyogVGltZXIgdGhhdCB0cmlnZ2VycyB0aGUgY2hlY2sgcGh5IGZ1bmN0aW9uICovCisJdW5zaWduZWQgaW50IHJ4dGFpbDsJLyogTmV4dCBlbnRyeSBpbiByeHJpbmcgdG8gcmVhZCAqLworCXVuc2lnbmVkIGludCByeGhlYWQ7CS8qIE5leHQgZW50cnkgaW4gcnhyaW5nIHRvIGdpdmUgYSBuZXcgYnVmZmVyICovCisJdW5zaWduZWQgaW50IHJ4ZnJlZTsJLyogTnVtYmVyIG9mIGZyZWUsIGFsbG9jYXRlZCBSWCBidWZmZXJzICovCisKKwl1bnNpZ25lZCBpbnQgcnhwZW5kaW5nOwkvKiBOb24temVybyBpZiB0aGVyZSBhcmUgc3RpbGwgZGVzY3JpcHRvcnMKKwkJCQkgKiB0byBiZSBwcm9jZXNzZWQgZnJvbSBhIHByZXZpb3VzIGRlc2NyaXB0b3IKKwkJCQkgKiBpbnRlcnJ1cHQgY29uZGl0aW9uIHRoYXQgaGFzIGJlZW4gY2xlYXJlZCAqLworCisJdW5zaWduZWQgaW50IHR4dGFpbDsJLyogTmV4dCBUWCBkZXNjcmlwdG9yIHRvIGNoZWNrIHN0YXR1cyBvbiAqLworCXVuc2lnbmVkIGludCB0eGhlYWQ7CS8qIE5leHQgVFggZGVzY3JpcHRvciB0byB1c2UgKi8KKworCS8qIE51bWJlciBvZiBmcmVlIFRYIGRlc2NyaXB0b3JzLiAgVGhpcyBjb3VsZCBiZSBjYWxjdWxhdGVkIGZyb20KKwkgKiByeGhlYWQgYW5kIHJ4dGFpbCBpZiBvbmUgZGVzY3JpcHRvciB3ZXJlIGxlZnQgdW51c2VkIHRvIGRpc2FtYmlndWF0ZQorCSAqIGZ1bGwgYW5kIGVtcHR5IGNvbmRpdGlvbnMsIGJ1dCBpdCdzIHNpbXBsZXIgdG8ganVzdCBrZWVwIHRyYWNrCisJICogZXhwbGljaXRseS4gKi8KKworCXVuc2lnbmVkIGludCB0eGZyZWU7CisKKwl1bnNpZ25lZCBpbnQgcGh5X29rOwkJLyogVGhlIFBIWSBpcyBjdXJyZW50bHkgcG93ZXJlZCBvbi4gKi8KKworCS8qIFBIWSBzdGF0dXMgKGR1cGxleCBpcyAxIGZvciBoYWxmLCAyIGZvciBmdWxsLAorCSAqIHNvIHRoYXQgdGhlIGRlZmF1bHQgMCBpbmRpY2F0ZXMgdGhhdCBuZWl0aGVyIGhhcworCSAqIHlldCBiZWVuIGNvbmZpZ3VyZWQpLiAqLworCisJdW5zaWduZWQgaW50IGxpbmtfdXA7CisJdW5zaWduZWQgaW50IHNwZWVkOworCXVuc2lnbmVkIGludCBkdXBsZXg7CisKKwl0eF9kZXNjICp0eHJpbmc7CisJcnhfZGVzYyAqcnhyaW5nOworCXN0cnVjdCBza19idWZmICp0eHNrYnNbVFNJMTA4X1RYUklOR19MRU5dOworCXN0cnVjdCBza19idWZmICpyeHNrYnNbVFNJMTA4X1JYUklOR19MRU5dOworCisJZG1hX2FkZHJfdCB0eGRtYSwgcnhkbWE7CisKKwkvKiB0eGxvY2sgbmVzdHMgaW4gbWlzY2xvY2sgYW5kIHBoeV9sb2NrICovCisKKwlzcGlubG9ja190IHR4bG9jaywgbWlzY2xvY2s7CisKKwkvKiBzdGF0cyBpcyB1c2VkIHRvIGhvbGQgdGhlIHVwcGVyIGJpdHMgb2YgZWFjaCBoYXJkd2FyZSBjb3VudGVyLAorCSAqIGFuZCB0bXBzdGF0cyBpcyB1c2VkIHRvIGhvbGQgdGhlIGZ1bGwgdmFsdWVzIGZvciByZXR1cm5pbmcKKwkgKiB0byB0aGUgY2FsbGVyIG9mIGdldF9zdGF0cygpLiAgVGhleSBtdXN0IGJlIHNlcGFyYXRlIGluIGNhc2UKKwkgKiBhbiBvdmVyZmxvdyBpbnRlcnJ1cHQgb2NjdXJzIGJlZm9yZSB0aGUgc3RhdHMgYXJlIGNvbnN1bWVkLgorCSAqLworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgdG1wc3RhdHM7CisKKwkvKiBUaGVzZSBzdGF0cyBhcmUga2VwdCBzZXBhcmF0ZSBpbiBoYXJkd2FyZSwgdGh1cyByZXF1aXJlIGluZGl2aWR1YWwKKwkgKiBmaWVsZHMgZm9yIGhhbmRsaW5nIGNhcnJ5LiAgVGhleSBhcmUgY29tYmluZWQgaW4gZ2V0X3N0YXRzLgorCSAqLworCisJdW5zaWduZWQgbG9uZyByeF9mY3M7CS8qIEFkZCB0byByeF9mcmFtZV9lcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3Nob3J0X2ZjczsJLyogQWRkIHRvIHJ4X2ZyYW1lX2Vycm9ycyAqLworCXVuc2lnbmVkIGxvbmcgcnhfbG9uZ19mY3M7CS8qIEFkZCB0byByeF9mcmFtZV9lcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3VuZGVycnVuczsJLyogQWRkIHRvIHJ4X2xlbmd0aF9lcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X292ZXJydW5zOwkvKiBBZGQgdG8gcnhfbGVuZ3RoX2Vycm9ycyAqLworCisJdW5zaWduZWQgbG9uZyB0eF9jb2xsX2Fib3J0OwkvKiBBZGQgdG8gdHhfYWJvcnRlZF9lcnJvcnMvY29sbGlzaW9ucyAqLworCXVuc2lnbmVkIGxvbmcgdHhfcGF1c2VfZHJvcDsJLyogQWRkIHRvIHR4X2Fib3J0ZWRfZXJyb3JzICovCisKKwl1bnNpZ25lZCBsb25nIG1jX2hhc2hbMTZdOworCXUzMiBtc2dfZW5hYmxlOwkJCS8qIGRlYnVnIG1lc3NhZ2UgbGV2ZWwgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXVuc2lnbmVkIGludCBpbml0X21lZGlhOworfTsKKworLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHNpX2V0aF9kcml2ZXIgPSB7CisJLnByb2JlID0gdHNpMTA4X2luaXRfb25lLAorCS5yZW1vdmUgPSB0c2kxMDhfZXRoZXJfcmVtb3ZlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lID0gInRzaS1ldGhlcm5ldCIsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHRzaTEwOF90aW1lZF9jaGVja2VyKHVuc2lnbmVkIGxvbmcgZGV2X3B0cik7CisKK3N0YXRpYyB2b2lkIGR1bXBfZXRoX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKCJEdW1waW5nICVzLi4uXG4iLCBkZXYtPm5hbWUpOworCXByaW50aygiaW50c3RhdCAleCBpbnRtYXNrICV4IHBoeV9vayAlZCIKKwkgICAgICAgIiBsaW5rICVkIHNwZWVkICVkIGR1cGxleCAlZFxuIiwKKwkgICAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX0lOVFNUQVQpLAorCSAgICAgICBUU0lfUkVBRChUU0kxMDhfRUNfSU5UTUFTSyksIGRhdGEtPnBoeV9vaywKKwkgICAgICAgZGF0YS0+bGlua191cCwgZGF0YS0+c3BlZWQsIGRhdGEtPmR1cGxleCk7CisKKwlwcmludGsoIlRYOiBoZWFkICVkLCB0YWlsICVkLCBmcmVlICVkLCBzdGF0ICV4LCBlc3RhdCAleCwgZXJyICV4XG4iLAorCSAgICAgICBkYXRhLT50eGhlYWQsIGRhdGEtPnR4dGFpbCwgZGF0YS0+dHhmcmVlLAorCSAgICAgICBUU0lfUkVBRChUU0kxMDhfRUNfVFhTVEFUKSwKKwkgICAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX1RYRVNUQVQpLAorCSAgICAgICBUU0lfUkVBRChUU0kxMDhfRUNfVFhFUlIpKTsKKworCXByaW50aygiUlg6IGhlYWQgJWQsIHRhaWwgJWQsIGZyZWUgJWQsIHN0YXQgJXgsIgorCSAgICAgICAiIGVzdGF0ICV4LCBlcnIgJXgsIHBlbmRpbmcgJWRcblxuIiwKKwkgICAgICAgZGF0YS0+cnhoZWFkLCBkYXRhLT5yeHRhaWwsIGRhdGEtPnJ4ZnJlZSwKKwkgICAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX1JYU1RBVCksCisJICAgICAgIFRTSV9SRUFEKFRTSTEwOF9FQ19SWEVTVEFUKSwKKwkgICAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX1JYRVJSKSwgZGF0YS0+cnhwZW5kaW5nKTsKK30KKworLyogU3luY2hyb25pemF0aW9uIGlzIG5lZWRlZCBiZXR3ZWVuIHRoZSB0aHJlYWQgYW5kIHVwL2Rvd24gZXZlbnRzLgorICogTm90ZSB0aGF0IHRoZSBQSFkgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgc2FtZSByZWdpc3RlcnMgZm9yIGJvdGgKKyAqIGludGVyZmFjZXMsIHNvIHRoaXMgY2FuJ3QgYmUgbWFkZSBpbnRlcmZhY2Utc3BlY2lmaWMuCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhwaHlfbG9jayk7CisKK3N0YXRpYyBpbnQgdHNpMTA4X3JlYWRfbWlpKHN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEsIGludCByZWcpCit7CisJdW5zaWduZWQgaTsKKworCVRTSV9XUklURV9QSFkoVFNJMTA4X01BQ19NSUlfQUREUiwKKwkJCQkoZGF0YS0+cGh5IDw8IFRTSTEwOF9NQUNfTUlJX0FERFJfUEhZKSB8CisJCQkJKHJlZyA8PCBUU0kxMDhfTUFDX01JSV9BRERSX1JFRykpOworCVRTSV9XUklURV9QSFkoVFNJMTA4X01BQ19NSUlfQ01ELCAwKTsKKwlUU0lfV1JJVEVfUEhZKFRTSTEwOF9NQUNfTUlJX0NNRCwgVFNJMTA4X01BQ19NSUlfQ01EX1JFQUQpOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShUU0lfUkVBRF9QSFkoVFNJMTA4X01BQ19NSUlfSU5EKSAmCisJCSAgICAgIChUU0kxMDhfTUFDX01JSV9JTkRfTk9UVkFMSUQgfCBUU0kxMDhfTUFDX01JSV9JTkRfQlVTWSkpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPT0gMTAwKQorCQlyZXR1cm4gMHhmZmZmOworCWVsc2UKKwkJcmV0dXJuIChUU0lfUkVBRF9QSFkoVFNJMTA4X01BQ19NSUlfREFUQUlOKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTEwOF93cml0ZV9taWkoc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSwKKwkJCQlpbnQgcmVnLCB1MTYgdmFsKQoreworCXVuc2lnbmVkIGkgPSAxMDA7CisJVFNJX1dSSVRFX1BIWShUU0kxMDhfTUFDX01JSV9BRERSLAorCQkJCShkYXRhLT5waHkgPDwgVFNJMTA4X01BQ19NSUlfQUREUl9QSFkpIHwKKwkJCQkocmVnIDw8IFRTSTEwOF9NQUNfTUlJX0FERFJfUkVHKSk7CisJVFNJX1dSSVRFX1BIWShUU0kxMDhfTUFDX01JSV9EQVRBT1VULCB2YWwpOworCXdoaWxlIChpLS0pIHsKKwkJaWYoIShUU0lfUkVBRF9QSFkoVFNJMTA4X01BQ19NSUlfSU5EKSAmCisJCQlUU0kxMDhfTUFDX01JSV9JTkRfQlVTWSkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdHNpMTA4X21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkciwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gdHNpMTA4X3JlYWRfbWlpKGRhdGEsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTEwOF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCXRzaTEwOF93cml0ZV9taWkoZGF0YSwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHNpMTA4X3dyaXRlX3RiaShzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhLAorCQkJCQlpbnQgcmVnLCB1MTYgdmFsKQoreworCXVuc2lnbmVkIGkgPSAxMDAwOworCVRTSV9XUklURShUU0kxMDhfTUFDX01JSV9BRERSLAorCQkJICAgICAoMHgxZSA8PCBUU0kxMDhfTUFDX01JSV9BRERSX1BIWSkKKwkJCSAgICAgfCAocmVnIDw8IFRTSTEwOF9NQUNfTUlJX0FERFJfUkVHKSk7CisJVFNJX1dSSVRFKFRTSTEwOF9NQUNfTUlJX0RBVEFPVVQsIHZhbCk7CisJd2hpbGUoaS0tKSB7CisJCWlmKCEoVFNJX1JFQUQoVFNJMTA4X01BQ19NSUlfSU5EKSAmIFRTSTEwOF9NQUNfTUlJX0lORF9CVVNZKSkKKwkJCXJldHVybjsKKwkJdWRlbGF5KDEwKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICIlcyBmdW5jdGlvbiB0aW1lIG91dCBcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyBpbnQgbWlpX3NwZWVkKHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpKQoreworCWludCBhZHZlcnQsIGxwYSwgdmFsLCBtZWRpYTsKKwlpbnQgbHBhMiA9IDA7CisJaW50IHNwZWVkOworCisJaWYgKCFtaWlfbGlua19vayhtaWkpKQorCQlyZXR1cm4gMDsKKworCXZhbCA9ICgqbWlpLT5tZGlvX3JlYWQpIChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9CTVNSKTsKKwlpZiAoKHZhbCAmIEJNU1JfQU5FR0NPTVBMRVRFKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWFkdmVydCA9ICgqbWlpLT5tZGlvX3JlYWQpIChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCWxwYSA9ICgqbWlpLT5tZGlvX3JlYWQpIChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9MUEEpOworCW1lZGlhID0gbWlpX253YXlfcmVzdWx0KGFkdmVydCAmIGxwYSk7CisKKwlpZiAobWlpLT5zdXBwb3J0c19nbWlpKQorCQlscGEyID0gbWlpLT5tZGlvX3JlYWQobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfU1RBVDEwMDApOworCisJc3BlZWQgPSBscGEyICYgKExQQV8xMDAwRlVMTCB8IExQQV8xMDAwSEFMRikgPyAxMDAwIDoKKwkJCShtZWRpYSAmIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMDBIQUxGKSA/IDEwMCA6IDEwKTsKKwlyZXR1cm4gc3BlZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTEwOF9jaGVja19waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgbWFjX2NmZzJfcmVnLCBwb3J0Y3RybF9yZWc7CisJdTMyIGR1cGxleDsKKwl1MzIgc3BlZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERvIGEgZHVtbXkgcmVhZCwgYXMgZm9yIHNvbWUgcmVhc29uIHRoZSBmaXJzdCByZWFkCisJICogYWZ0ZXIgYSBsaW5rIGJlY29tZXMgdXAgcmV0dXJucyBsaW5rIGRvd24sIGV2ZW4gaWYKKwkgKiBpdCdzIGJlZW4gYSB3aGlsZSBzaW5jZSB0aGUgbGluayBjYW1lIHVwLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoeV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWRhdGEtPnBoeV9vaykKKwkJZ290byBvdXQ7CisKKwl0c2kxMDhfcmVhZF9taWkoZGF0YSwgTUlJX0JNU1IpOworCisJZHVwbGV4ID0gbWlpX2NoZWNrX21lZGlhKCZkYXRhLT5taWlfaWYsIG5ldGlmX21zZ19saW5rKGRhdGEpLCBkYXRhLT5pbml0X21lZGlhKTsKKwlkYXRhLT5pbml0X21lZGlhID0gMDsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKworCQlzcGVlZCA9IG1paV9zcGVlZCgmZGF0YS0+bWlpX2lmKTsKKworCQlpZiAoKHNwZWVkICE9IGRhdGEtPnNwZWVkKSB8fCBkdXBsZXgpIHsKKworCQkJbWFjX2NmZzJfcmVnID0gVFNJX1JFQUQoVFNJMTA4X01BQ19DRkcyKTsKKwkJCXBvcnRjdHJsX3JlZyA9IFRTSV9SRUFEKFRTSTEwOF9FQ19QT1JUQ1RSTCk7CisKKwkJCW1hY19jZmcyX3JlZyAmPSB+VFNJMTA4X01BQ19DRkcyX0lGQUNFX01BU0s7CisKKwkJCWlmIChzcGVlZCA9PSAxMDAwKSB7CisJCQkJbWFjX2NmZzJfcmVnIHw9IFRTSTEwOF9NQUNfQ0ZHMl9HSUc7CisJCQkJcG9ydGN0cmxfcmVnICY9IH5UU0kxMDhfRUNfUE9SVENUUkxfTk9HSUc7CisJCQl9IGVsc2UgeworCQkJCW1hY19jZmcyX3JlZyB8PSBUU0kxMDhfTUFDX0NGRzJfTk9HSUc7CisJCQkJcG9ydGN0cmxfcmVnIHw9IFRTSTEwOF9FQ19QT1JUQ1RSTF9OT0dJRzsKKwkJCX0KKworCQkJZGF0YS0+c3BlZWQgPSBzcGVlZDsKKworCQkJaWYgKGRhdGEtPm1paV9pZi5mdWxsX2R1cGxleCkgeworCQkJCW1hY19jZmcyX3JlZyB8PSBUU0kxMDhfTUFDX0NGRzJfRlVMTERVUExFWDsKKwkJCQlwb3J0Y3RybF9yZWcgJj0gflRTSTEwOF9FQ19QT1JUQ1RSTF9IQUxGRFVQTEVYOworCQkJCWRhdGEtPmR1cGxleCA9IDI7CisJCQl9IGVsc2UgeworCQkJCW1hY19jZmcyX3JlZyAmPSB+VFNJMTA4X01BQ19DRkcyX0ZVTExEVVBMRVg7CisJCQkJcG9ydGN0cmxfcmVnIHw9IFRTSTEwOF9FQ19QT1JUQ1RSTF9IQUxGRFVQTEVYOworCQkJCWRhdGEtPmR1cGxleCA9IDE7CisJCQl9CisKKwkJCVRTSV9XUklURShUU0kxMDhfTUFDX0NGRzIsIG1hY19jZmcyX3JlZyk7CisJCQlUU0lfV1JJVEUoVFNJMTA4X0VDX1BPUlRDVFJMLCBwb3J0Y3RybF9yZWcpOworCisJCQlpZiAoZGF0YS0+bGlua191cCA9PSAwKSB7CisJCQkJLyogVGhlIG1hbnVhbCBzYXlzIGl0IGNhbiB0YWtlIDMtNCB1c2VjcyBmb3IgdGhlIHNwZWVkIGNoYW5nZQorCQkJCSAqIHRvIHRha2UgZWZmZWN0LgorCQkJCSAqLworCQkJCXVkZWxheSg1KTsKKworCQkJCXNwaW5fbG9jaygmZGF0YS0+dHhsb2NrKTsKKwkJCQlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSAmJiBkYXRhLT50eGZyZWUpCisJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQkJCWRhdGEtPmxpbmtfdXAgPSAxOworCQkJCXNwaW5fdW5sb2NrKCZkYXRhLT50eGxvY2spOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQlpZiAoZGF0YS0+bGlua191cCA9PSAxKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlkYXRhLT5saW5rX3VwID0gMDsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXMgOiBsaW5rIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCX0KKworCQlnb3RvIG91dDsKKwl9CisKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoeV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHNpMTA4X3N0YXRfY2Fycnlfb25lKGludCBjYXJyeSwgaW50IGNhcnJ5X2JpdCwgaW50IGNhcnJ5X3NoaWZ0LAorCQkgICAgICB1bnNpZ25lZCBsb25nICp1cHBlcikKK3sKKwlpZiAoY2FycnkgJiBjYXJyeV9iaXQpCisJCSp1cHBlciArPSBjYXJyeV9zaGlmdDsKK30KKworc3RhdGljIHZvaWQgdHNpMTA4X3N0YXRfY2Fycnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgY2FycnkxLCBjYXJyeTI7CisKKwlzcGluX2xvY2tfaXJxKCZkYXRhLT5taXNjbG9jayk7CisKKwljYXJyeTEgPSBUU0lfUkVBRChUU0kxMDhfU1RBVF9DQVJSWTEpOworCWNhcnJ5MiA9IFRTSV9SRUFEKFRTSTEwOF9TVEFUX0NBUlJZMik7CisKKwlUU0lfV1JJVEUoVFNJMTA4X1NUQVRfQ0FSUlkxLCBjYXJyeTEpOworCVRTSV9XUklURShUU0kxMDhfU1RBVF9DQVJSWTIsIGNhcnJ5Mik7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkxLCBUU0kxMDhfU1RBVF9DQVJSWTFfUlhCWVRFUywKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYQllURVNfQ0FSUlksICZkYXRhLT5zdGF0cy5yeF9ieXRlcyk7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkxLCBUU0kxMDhfU1RBVF9DQVJSWTFfUlhQS1RTLAorCQkJICAgICAgVFNJMTA4X1NUQVRfUlhQS1RTX0NBUlJZLAorCQkJICAgICAgJmRhdGEtPnN0YXRzLnJ4X3BhY2tldHMpOworCisJdHNpMTA4X3N0YXRfY2Fycnlfb25lKGNhcnJ5MSwgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRkNTLAorCQkJICAgICAgVFNJMTA4X1NUQVRfUlhGQ1NfQ0FSUlksICZkYXRhLT5yeF9mY3MpOworCisJdHNpMTA4X3N0YXRfY2Fycnlfb25lKGNhcnJ5MSwgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYTUNBU1QsCisJCQkgICAgICBUU0kxMDhfU1RBVF9SWE1DQVNUX0NBUlJZLAorCQkJICAgICAgJmRhdGEtPnN0YXRzLm11bHRpY2FzdCk7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkxLCBUU0kxMDhfU1RBVF9DQVJSWTFfUlhBTElHTiwKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYQUxJR05fQ0FSUlksCisJCQkgICAgICAmZGF0YS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKTsKKworCXRzaTEwOF9zdGF0X2NhcnJ5X29uZShjYXJyeTEsIFRTSTEwOF9TVEFUX0NBUlJZMV9SWExFTkdUSCwKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYTEVOR1RIX0NBUlJZLAorCQkJICAgICAgJmRhdGEtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMpOworCisJdHNpMTA4X3N0YXRfY2Fycnlfb25lKGNhcnJ5MSwgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYUlVOVCwKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYUlVOVF9DQVJSWSwgJmRhdGEtPnJ4X3VuZGVycnVucyk7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkxLCBUU0kxMDhfU1RBVF9DQVJSWTFfUlhKVU1CTywKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYSlVNQk9fQ0FSUlksICZkYXRhLT5yeF9vdmVycnVucyk7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkxLCBUU0kxMDhfU1RBVF9DQVJSWTFfUlhGUkFHLAorCQkJICAgICAgVFNJMTA4X1NUQVRfUlhGUkFHX0NBUlJZLCAmZGF0YS0+cnhfc2hvcnRfZmNzKTsKKworCXRzaTEwOF9zdGF0X2NhcnJ5X29uZShjYXJyeTEsIFRTSTEwOF9TVEFUX0NBUlJZMV9SWEpBQkJFUiwKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYSkFCQkVSX0NBUlJZLCAmZGF0YS0+cnhfbG9uZ19mY3MpOworCisJdHNpMTA4X3N0YXRfY2Fycnlfb25lKGNhcnJ5MSwgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRFJPUCwKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1JYRFJPUF9DQVJSWSwKKwkJCSAgICAgICZkYXRhLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKTsKKworCXRzaTEwOF9zdGF0X2NhcnJ5X29uZShjYXJyeTIsIFRTSTEwOF9TVEFUX0NBUlJZMl9UWEJZVEVTLAorCQkJICAgICAgVFNJMTA4X1NUQVRfVFhCWVRFU19DQVJSWSwgJmRhdGEtPnN0YXRzLnR4X2J5dGVzKTsKKworCXRzaTEwOF9zdGF0X2NhcnJ5X29uZShjYXJyeTIsIFRTSTEwOF9TVEFUX0NBUlJZMl9UWFBLVFMsCisJCQkgICAgICBUU0kxMDhfU1RBVF9UWFBLVFNfQ0FSUlksCisJCQkgICAgICAmZGF0YS0+c3RhdHMudHhfcGFja2V0cyk7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkyLCBUU0kxMDhfU1RBVF9DQVJSWTJfVFhFWERFRiwKKwkJCSAgICAgIFRTSTEwOF9TVEFUX1RYRVhERUZfQ0FSUlksCisJCQkgICAgICAmZGF0YS0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMpOworCisJdHNpMTA4X3N0YXRfY2Fycnlfb25lKGNhcnJ5MiwgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhDT0wsCisJCQkgICAgICBUU0kxMDhfU1RBVF9UWEVYQ09MX0NBUlJZLCAmZGF0YS0+dHhfY29sbF9hYm9ydCk7CisKKwl0c2kxMDhfc3RhdF9jYXJyeV9vbmUoY2FycnkyLCBUU0kxMDhfU1RBVF9DQVJSWTJfVFhUQ09MLAorCQkJICAgICAgVFNJMTA4X1NUQVRfVFhUQ09MX0NBUlJZLAorCQkJICAgICAgJmRhdGEtPnN0YXRzLmNvbGxpc2lvbnMpOworCisJdHNpMTA4X3N0YXRfY2Fycnlfb25lKGNhcnJ5MiwgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYUEFVU0UsCisJCQkgICAgICBUU0kxMDhfU1RBVF9UWFBBVVNFRFJPUF9DQVJSWSwKKwkJCSAgICAgICZkYXRhLT50eF9wYXVzZV9kcm9wKTsKKworCXNwaW5fdW5sb2NrX2lycSgmZGF0YS0+bWlzY2xvY2spOworfQorCisvKiBSZWFkIGEgc3RhdCBjb3VudGVyIGF0b21pY2FsbHkgd2l0aCByZXNwZWN0IHRvIGNhcnJpZXMuCisgKiBkYXRhLT5taXNjbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordHNpMTA4X3JlYWRfc3RhdChzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICogZGF0YSwgaW50IHJlZywgaW50IGNhcnJ5X2JpdCwKKwkJIGludCBjYXJyeV9zaGlmdCwgdW5zaWduZWQgbG9uZyAqdXBwZXIpCit7CisJaW50IGNhcnJ5cmVnOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHJlZyA8IDB4YjApCisJCWNhcnJ5cmVnID0gVFNJMTA4X1NUQVRfQ0FSUlkxOworCWVsc2UKKwkJY2FycnlyZWcgPSBUU0kxMDhfU1RBVF9DQVJSWTI7CisKKyAgICAgIGFnYWluOgorCXZhbCA9IFRTSV9SRUFEKHJlZykgfCAqdXBwZXI7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgaXQgb3ZlcmZsb3dlZCwgYnV0IHRoZSBpbnRlcnJ1cHQgaGFzbid0CisJICogYmVlbiBzZXJ2aWNlZCB5ZXQuICBJZiBzbywgaGFuZGxlIHRoZSBjYXJyeSBoZXJlLCBhbmQKKwkgKiB0cnkgYWdhaW4uCisJICovCisKKwlpZiAodW5saWtlbHkoVFNJX1JFQUQoY2FycnlyZWcpICYgY2FycnlfYml0KSkgeworCQkqdXBwZXIgKz0gY2Fycnlfc2hpZnQ7CisJCVRTSV9XUklURShjYXJyeXJlZywgY2FycnlfYml0KTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRzaTEwOF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGV4Y29sOworCisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycSgmZGF0YS0+bWlzY2xvY2spOworCisJZGF0YS0+dG1wc3RhdHMucnhfcGFja2V0cyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfUlhQS1RTLAorCQkJICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhQS1RTLAorCQkJICAgICBUU0kxMDhfU1RBVF9SWFBLVFNfQ0FSUlksICZkYXRhLT5zdGF0cy5yeF9wYWNrZXRzKTsKKworCWRhdGEtPnRtcHN0YXRzLnR4X3BhY2tldHMgPQorCSAgICB0c2kxMDhfcmVhZF9zdGF0KGRhdGEsIFRTSTEwOF9TVEFUX1RYUEtUUywKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYUEtUUywKKwkJCSAgICAgVFNJMTA4X1NUQVRfVFhQS1RTX0NBUlJZLCAmZGF0YS0+c3RhdHMudHhfcGFja2V0cyk7CisKKwlkYXRhLT50bXBzdGF0cy5yeF9ieXRlcyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfUlhCWVRFUywKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYQllURVMsCisJCQkgICAgIFRTSTEwOF9TVEFUX1JYQllURVNfQ0FSUlksICZkYXRhLT5zdGF0cy5yeF9ieXRlcyk7CisKKwlkYXRhLT50bXBzdGF0cy50eF9ieXRlcyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfVFhCWVRFUywKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYQllURVMsCisJCQkgICAgIFRTSTEwOF9TVEFUX1RYQllURVNfQ0FSUlksICZkYXRhLT5zdGF0cy50eF9ieXRlcyk7CisKKwlkYXRhLT50bXBzdGF0cy5tdWx0aWNhc3QgPQorCSAgICB0c2kxMDhfcmVhZF9zdGF0KGRhdGEsIFRTSTEwOF9TVEFUX1JYTUNBU1QsCisJCQkgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWE1DQVNULAorCQkJICAgICBUU0kxMDhfU1RBVF9SWE1DQVNUX0NBUlJZLCAmZGF0YS0+c3RhdHMubXVsdGljYXN0KTsKKworCWV4Y29sID0gdHNpMTA4X3JlYWRfc3RhdChkYXRhLCBUU0kxMDhfU1RBVF9UWEVYQ09MLAorCQkJCSBUU0kxMDhfU1RBVF9DQVJSWTJfVFhFWENPTCwKKwkJCQkgVFNJMTA4X1NUQVRfVFhFWENPTF9DQVJSWSwKKwkJCQkgJmRhdGEtPnR4X2NvbGxfYWJvcnQpOworCisJZGF0YS0+dG1wc3RhdHMuY29sbGlzaW9ucyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfVFhUQ09MLAorCQkJICAgICBUU0kxMDhfU1RBVF9DQVJSWTJfVFhUQ09MLAorCQkJICAgICBUU0kxMDhfU1RBVF9UWFRDT0xfQ0FSUlksICZkYXRhLT5zdGF0cy5jb2xsaXNpb25zKTsKKworCWRhdGEtPnRtcHN0YXRzLmNvbGxpc2lvbnMgKz0gZXhjb2w7CisKKwlkYXRhLT50bXBzdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0KKwkgICAgdHNpMTA4X3JlYWRfc3RhdChkYXRhLCBUU0kxMDhfU1RBVF9SWExFTkdUSCwKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYTEVOR1RILAorCQkJICAgICBUU0kxMDhfU1RBVF9SWExFTkdUSF9DQVJSWSwKKwkJCSAgICAgJmRhdGEtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMpOworCisJZGF0YS0+dG1wc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPQorCSAgICB0c2kxMDhfcmVhZF9zdGF0KGRhdGEsIFRTSTEwOF9TVEFUX1JYUlVOVCwKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYUlVOVCwKKwkJCSAgICAgVFNJMTA4X1NUQVRfUlhSVU5UX0NBUlJZLCAmZGF0YS0+cnhfdW5kZXJydW5zKTsKKworCWRhdGEtPnRtcHN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0KKwkgICAgdHNpMTA4X3JlYWRfc3RhdChkYXRhLCBUU0kxMDhfU1RBVF9SWEpVTUJPLAorCQkJICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhKVU1CTywKKwkJCSAgICAgVFNJMTA4X1NUQVRfUlhKVU1CT19DQVJSWSwgJmRhdGEtPnJ4X292ZXJydW5zKTsKKworCWRhdGEtPnRtcHN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfUlhBTElHTiwKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYQUxJR04sCisJCQkgICAgIFRTSTEwOF9TVEFUX1JYQUxJR05fQ0FSUlksCisJCQkgICAgICZkYXRhLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMpOworCisJZGF0YS0+dG1wc3RhdHMucnhfZnJhbWVfZXJyb3JzICs9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfUlhGQ1MsCisJCQkgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWEZDUywgVFNJMTA4X1NUQVRfUlhGQ1NfQ0FSUlksCisJCQkgICAgICZkYXRhLT5yeF9mY3MpOworCisJZGF0YS0+dG1wc3RhdHMucnhfZnJhbWVfZXJyb3JzICs9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfUlhGUkFHLAorCQkJICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhGUkFHLAorCQkJICAgICBUU0kxMDhfU1RBVF9SWEZSQUdfQ0FSUlksICZkYXRhLT5yeF9zaG9ydF9mY3MpOworCisJZGF0YS0+dG1wc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfUlhEUk9QLAorCQkJICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhEUk9QLAorCQkJICAgICBUU0kxMDhfU1RBVF9SWERST1BfQ0FSUlksCisJCQkgICAgICZkYXRhLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKTsKKworCS8qIFRoZXNlIHRocmVlIGFyZSBtYWludGFpbmVkIGJ5IHNvZnR3YXJlLiAqLworCWRhdGEtPnRtcHN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gZGF0YS0+c3RhdHMucnhfZmlmb19lcnJvcnM7CisJZGF0YS0+dG1wc3RhdHMucnhfY3JjX2Vycm9ycyA9IGRhdGEtPnN0YXRzLnJ4X2NyY19lcnJvcnM7CisKKwlkYXRhLT50bXBzdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CisJICAgIHRzaTEwOF9yZWFkX3N0YXQoZGF0YSwgVFNJMTA4X1NUQVRfVFhFWERFRiwKKwkJCSAgICAgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhERUYsCisJCQkgICAgIFRTSTEwOF9TVEFUX1RYRVhERUZfQ0FSUlksCisJCQkgICAgICZkYXRhLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyk7CisKKwlkYXRhLT50bXBzdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPQorCSAgICB0c2kxMDhfcmVhZF9zdGF0KGRhdGEsIFRTSTEwOF9TVEFUX1RYUEFVU0VEUk9QLAorCQkJICAgICBUU0kxMDhfU1RBVF9DQVJSWTJfVFhQQVVTRSwKKwkJCSAgICAgVFNJMTA4X1NUQVRfVFhQQVVTRURST1BfQ0FSUlksCisJCQkgICAgICZkYXRhLT50eF9wYXVzZV9kcm9wKTsKKworCWRhdGEtPnRtcHN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IGV4Y29sOworCisJZGF0YS0+dG1wc3RhdHMudHhfZXJyb3JzID0gZGF0YS0+dG1wc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisJZGF0YS0+dG1wc3RhdHMucnhfZXJyb3JzID0gZGF0YS0+dG1wc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArCisJICAgIGRhdGEtPnRtcHN0YXRzLnJ4X2NyY19lcnJvcnMgKworCSAgICBkYXRhLT50bXBzdGF0cy5yeF9mcmFtZV9lcnJvcnMgKworCSAgICBkYXRhLT50bXBzdGF0cy5yeF9maWZvX2Vycm9ycyArIGRhdGEtPnRtcHN0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisKKwlzcGluX3VubG9ja19pcnEoJmRhdGEtPm1pc2Nsb2NrKTsKKwlyZXR1cm4gJmRhdGEtPnRtcHN0YXRzOworfQorCitzdGF0aWMgdm9pZCB0c2kxMDhfcmVzdGFydF9yeChzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICogZGF0YSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlUU0lfV1JJVEUoVFNJMTA4X0VDX1JYUV9QVFJISUdILAorCQkJICAgICBUU0kxMDhfRUNfUlhRX1BUUkhJR0hfVkFMSUQpOworCisJVFNJX1dSSVRFKFRTSTEwOF9FQ19SWENUUkwsIFRTSTEwOF9FQ19SWENUUkxfR08KKwkJCSAgICAgfCBUU0kxMDhfRUNfUlhDVFJMX1FVRVVFMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTEwOF9yZXN0YXJ0X3R4KHN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKiBkYXRhKQoreworCVRTSV9XUklURShUU0kxMDhfRUNfVFhRX1BUUkhJR0gsCisJCQkgICAgIFRTSTEwOF9FQ19UWFFfUFRSSElHSF9WQUxJRCk7CisKKwlUU0lfV1JJVEUoVFNJMTA4X0VDX1RYQ1RSTCwgVFNJMTA4X0VDX1RYQ1RSTF9JRExFSU5UIHwKKwkJCSAgICAgVFNJMTA4X0VDX1RYQ1RSTF9HTyB8IFRTSTEwOF9FQ19UWENUUkxfUVVFVUUwKTsKK30KKworLyogdHhsb2NrIG11c3QgYmUgaGVsZCBieSBjYWxsZXIsIHdpdGggSVJRcyBkaXNhYmxlZCwgYW5kCisgKiB3aXRoIHBlcm1pc3Npb24gdG8gcmUtZW5hYmxlIHRoZW0gd2hlbiB0aGUgbG9jayBpcyBkcm9wcGVkLgorICovCitzdGF0aWMgdm9pZCB0c2kxMDhfY29tcGxldGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdHg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmVsZWFzZSA9IDA7CisKKwl3aGlsZSAoIWRhdGEtPnR4ZnJlZSB8fCBkYXRhLT50eGhlYWQgIT0gZGF0YS0+dHh0YWlsKSB7CisJCXR4ID0gZGF0YS0+dHh0YWlsOworCisJCWlmIChkYXRhLT50eHJpbmdbdHhdLm1pc2MgJiBUU0kxMDhfVFhfT1dOKQorCQkJYnJlYWs7CisKKwkJc2tiID0gZGF0YS0+dHhza2JzW3R4XTsKKworCQlpZiAoIShkYXRhLT50eHJpbmdbdHhdLm1pc2MgJiBUU0kxMDhfVFhfT0spKQorCQkJcHJpbnRrKCIlczogYmFkIHR4IHBhY2tldCwgbWlzYyAleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRhdGEtPnR4cmluZ1t0eF0ubWlzYyk7CisKKwkJZGF0YS0+dHh0YWlsID0gKGRhdGEtPnR4dGFpbCArIDEpICUgVFNJMTA4X1RYUklOR19MRU47CisJCWRhdGEtPnR4ZnJlZSsrOworCisJCWlmIChkYXRhLT50eHJpbmdbdHhdLm1pc2MgJiBUU0kxMDhfVFhfRU9GKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmVsZWFzZSsrOworCQl9CisJfQorCisJaWYgKHJlbGVhc2UpIHsKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikgJiYgZGF0YS0+bGlua191cCkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdHNpMTA4X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBmcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOworCWludCBpOworCisJaWYgKCFkYXRhLT5waHlfb2sgJiYgbmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCB3aGlsZSBQSFkgaXMgZG93biFcbiIsIGRldi0+bmFtZSk7CisKKwlpZiAoIWRhdGEtPmxpbmtfdXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgd2hpbGUgbGluayBpcyBkb3duIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWlmIChkYXRhLT50eGZyZWUgPCBNQVhfU0tCX0ZSQUdTICsgMSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRyYW5zbWl0IHdpdGggZnVsbCB0eCByaW5nIVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJaWYgKGRhdGEtPnR4ZnJlZSAtIGZyYWdzIDwgTUFYX1NLQl9GUkFHUyArIDEpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fbG9ja19pcnEoJmRhdGEtPnR4bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnJhZ3M7IGkrKykgeworCQlpbnQgbWlzYyA9IDA7CisJCWludCB0eCA9IGRhdGEtPnR4aGVhZDsKKworCQkvKiBUaGlzIGlzIGRvbmUgdG8gbWFyayBldmVyeSBUU0kxMDhfVFhfSU5UX0ZSRVEgdHggYnVmZmVycyB3aXRoCisJCSAqIHRoZSBpbnRlcnJ1cHQgYml0LiAgVFggZGVzY3JpcHRvci1jb21wbGV0ZSBpbnRlcnJ1cHRzIGFyZQorCQkgKiBlbmFibGVkIHdoZW4gdGhlIHF1ZXVlIGZpbGxzIHVwLCBhbmQgbWFza2VkIHdoZW4gdGhlcmUgaXMKKwkJICogc3RpbGwgZnJlZSBzcGFjZS4gIFRoaXMgd2F5LCB3aGVuIHNhdHVyYXRpbmcgdGhlIG91dGJvdW5kCisJCSAqIGxpbmssIHRoZSB0eCBpbnRlcnJ1cHRzIGFyZSBrZXB0IHRvIGEgcmVhc29uYWJsZSBsZXZlbC4KKwkJICogV2hlbiB0aGUgcXVldWUgaXMgbm90IGZ1bGwsIHJlY2xhbWF0aW9uIG9mIHNrYnMgc3RpbGwgb2NjdXJzCisJCSAqIGFzIG5ldyBwYWNrZXRzIGFyZSB0cmFuc21pdHRlZCwgb3Igb24gYSBxdWV1ZS1lbXB0eQorCQkgKiBpbnRlcnJ1cHQuCisJCSAqLworCisJCWlmICgodHggJSBUU0kxMDhfVFhfSU5UX0ZSRVEgPT0gMCkgJiYKKwkJICAgICgoVFNJMTA4X1RYUklOR19MRU4gLSBkYXRhLT50eGZyZWUpID49IFRTSTEwOF9UWF9JTlRfRlJFUSkpCisJCQltaXNjID0gVFNJMTA4X1RYX0lOVDsKKworCQlkYXRhLT50eHNrYnNbdHhdID0gc2tiOworCisJCWlmIChpID09IDApIHsKKwkJCWRhdGEtPnR4cmluZ1t0eF0uYnVmMCA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKKwkJCQkJc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCWRhdGEtPnR4cmluZ1t0eF0ubGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOworCQkJbWlzYyB8PSBUU0kxMDhfVFhfU09GOworCQl9IGVsc2UgeworCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXTsKKworCQkJZGF0YS0+dHhyaW5nW3R4XS5idWYwID0KKwkJCSAgICBkbWFfbWFwX3BhZ2UoTlVMTCwgZnJhZy0+cGFnZSwgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCSAgICBmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJCWRhdGEtPnR4cmluZ1t0eF0ubGVuID0gZnJhZy0+c2l6ZTsKKwkJfQorCisJCWlmIChpID09IGZyYWdzIC0gMSkKKwkJCW1pc2MgfD0gVFNJMTA4X1RYX0VPRjsKKworCQlpZiAobmV0aWZfbXNnX3BrdGRhdGEoZGF0YSkpIHsKKwkJCWludCBpOworCQkJcHJpbnRrKCIlczogVHggRnJhbWUgY29udGVudHMgKCVkKVxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIHNrYi0+bGVuKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBza2ItPmxlbjsgaSsrKQorCQkJCXByaW50aygiICUyLjJ4Iiwgc2tiLT5kYXRhW2ldKTsKKwkJCXByaW50aygiLlxuIik7CisJCX0KKwkJZGF0YS0+dHhyaW5nW3R4XS5taXNjID0gbWlzYyB8IFRTSTEwOF9UWF9PV047CisKKwkJZGF0YS0+dHhoZWFkID0gKGRhdGEtPnR4aGVhZCArIDEpICUgVFNJMTA4X1RYUklOR19MRU47CisJCWRhdGEtPnR4ZnJlZS0tOworCX0KKworCXRzaTEwOF9jb21wbGV0ZV90eChkZXYpOworCisJLyogVGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGNoZWNrIGZvciBjb21wbGV0ZWQgdHggZGVzY3JpcHRvcnMsCisJICogc28gdGhhdCB0aGUgdGFpbCBwb2ludGVyIGlzIGNvcnJlY3QuCisJICovCisKKwlpZiAoIShUU0lfUkVBRChUU0kxMDhfRUNfVFhTVEFUKSAmIFRTSTEwOF9FQ19UWFNUQVRfUVVFVUUwKSkKKwkJdHNpMTA4X3Jlc3RhcnRfdHgoZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnEoJmRhdGEtPnR4bG9jayk7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIGludCB0c2kxMDhfY29tcGxldGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZG9uZSA9IDA7CisKKwl3aGlsZSAoZGF0YS0+cnhmcmVlICYmIGRvbmUgIT0gYnVkZ2V0KSB7CisJCWludCByeCA9IGRhdGEtPnJ4dGFpbDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoZGF0YS0+cnhyaW5nW3J4XS5taXNjICYgVFNJMTA4X1JYX09XTikKKwkJCWJyZWFrOworCisJCXNrYiA9IGRhdGEtPnJ4c2tic1tyeF07CisJCWRhdGEtPnJ4dGFpbCA9IChkYXRhLT5yeHRhaWwgKyAxKSAlIFRTSTEwOF9SWFJJTkdfTEVOOworCQlkYXRhLT5yeGZyZWUtLTsKKwkJZG9uZSsrOworCisJCWlmIChkYXRhLT5yeHJpbmdbcnhdLm1pc2MgJiBUU0kxMDhfUlhfQkFEKSB7CisJCQlzcGluX2xvY2tfaXJxKCZkYXRhLT5taXNjbG9jayk7CisKKwkJCWlmIChkYXRhLT5yeHJpbmdbcnhdLm1pc2MgJiBUU0kxMDhfUlhfQ1JDKQorCQkJCWRhdGEtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChkYXRhLT5yeHJpbmdbcnhdLm1pc2MgJiBUU0kxMDhfUlhfT1ZFUikKKwkJCQlkYXRhLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCisJCQlzcGluX3VubG9ja19pcnEoJmRhdGEtPm1pc2Nsb2NrKTsKKworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChuZXRpZl9tc2dfcGt0ZGF0YShkYXRhKSkgeworCQkJaW50IGk7CisJCQlwcmludGsoIiVzOiBSeCBGcmFtZSBjb250ZW50cyAoJWQpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZGF0YS0+cnhyaW5nW3J4XS5sZW4pOworCQkJZm9yIChpID0gMDsgaSA8IGRhdGEtPnJ4cmluZ1tyeF0ubGVuOyBpKyspCisJCQkJcHJpbnRrKCIgJTIuMngiLCBza2ItPmRhdGFbaV0pOworCQkJcHJpbnRrKCIuXG4iKTsKKwkJfQorCisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2JfcHV0KHNrYiwgZGF0YS0+cnhyaW5nW3J4XS5sZW4pOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0KKworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgaW50IHRzaTEwOF9yZWZpbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZG9uZSA9IDA7CisKKwl3aGlsZSAoZGF0YS0+cnhmcmVlICE9IFRTSTEwOF9SWFJJTkdfTEVOICYmIGRvbmUgIT0gYnVkZ2V0KSB7CisJCWludCByeCA9IGRhdGEtPnJ4aGVhZDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlkYXRhLT5yeHNrYnNbcnhdID0gc2tiID0gZGV2X2FsbG9jX3NrYihUU0kxMDhfUlhCVUZfU0laRSArIDIpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIEFsaWduIHRoZSBkYXRhIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAqLworCisJCWRhdGEtPnJ4cmluZ1tyeF0uYnVmMCA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKKwkJCQkJCQlUU0kxMDhfUlhfU0tCX1NJWkUsCisJCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQkvKiBTb21ldGltZXMgdGhlIGhhcmR3YXJlIHNldHMgYmxlbiB0byB6ZXJvIGFmdGVyIHBhY2tldAorCQkgKiByZWNlcHRpb24sIGV2ZW4gdGhvdWdoIHRoZSBtYW51YWwgc2F5cyB0aGF0IGl0J3Mgb25seSBldmVyCisJCSAqIG1vZGlmaWVkIGJ5IHRoZSBkcml2ZXIuCisJCSAqLworCisJCWRhdGEtPnJ4cmluZ1tyeF0uYmxlbiA9IFRTSTEwOF9SWF9TS0JfU0laRTsKKwkJZGF0YS0+cnhyaW5nW3J4XS5taXNjID0gVFNJMTA4X1JYX09XTiB8IFRTSTEwOF9SWF9JTlQ7CisKKwkJZGF0YS0+cnhoZWFkID0gKGRhdGEtPnJ4aGVhZCArIDEpICUgVFNJMTA4X1JYUklOR19MRU47CisJCWRhdGEtPnJ4ZnJlZSsrOworCQlkb25lKys7CisJfQorCisJaWYgKGRvbmUgIT0gMCAmJiAhKFRTSV9SRUFEKFRTSTEwOF9FQ19SWFNUQVQpICYKKwkJCSAgIFRTSTEwOF9FQ19SWFNUQVRfUVVFVUUwKSkKKwkJdHNpMTA4X3Jlc3RhcnRfcngoZGF0YSwgZGV2KTsKKworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgaW50IHRzaTEwOF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBlc3RhdCA9IFRTSV9SRUFEKFRTSTEwOF9FQ19SWEVTVEFUKTsKKwl1MzIgaW50c3RhdCA9IFRTSV9SRUFEKFRTSTEwOF9FQ19JTlRTVEFUKTsKKwlpbnQgdG90YWxfYnVkZ2V0ID0gbWluKCpidWRnZXQsIGRldi0+cXVvdGEpOworCWludCBudW1fcmVjZWl2ZWQgPSAwLCBudW1fZmlsbGVkID0gMCwgYnVkZ2V0X3VzZWQ7CisKKwlpbnRzdGF0ICY9IFRTSTEwOF9JTlRfUlhRVUVVRTAgfCBUU0kxMDhfSU5UX1JYVEhSRVNIIHwKKwkgICAgVFNJMTA4X0lOVF9SWE9WRVJSVU4gfCBUU0kxMDhfSU5UX1JYRVJST1IgfCBUU0kxMDhfSU5UX1JYV0FJVDsKKworCVRTSV9XUklURShUU0kxMDhfRUNfUlhFU1RBVCwgZXN0YXQpOworCVRTSV9XUklURShUU0kxMDhfRUNfSU5UU1RBVCwgaW50c3RhdCk7CisKKwlpZiAoZGF0YS0+cnhwZW5kaW5nIHx8IChlc3RhdCAmIFRTSTEwOF9FQ19SWEVTVEFUX1EwX0RFU0NJTlQpKQorCQludW1fcmVjZWl2ZWQgPSB0c2kxMDhfY29tcGxldGVfcngoZGV2LCB0b3RhbF9idWRnZXQpOworCisJLyogVGhpcyBzaG91bGQgbm9ybWFsbHkgZmlsbCBubyBtb3JlIHNsb3RzIHRoYW4gdGhlIG51bWJlciBvZgorCSAqIHBhY2tldHMgcmVjZWl2ZWQgaW4gdHNpMTA4X2NvbXBsZXRlX3J4KCkuICBUaGUgZXhjZXB0aW9uCisJICogaXMgd2hlbiB3ZSBwcmV2aW91c2x5IHJhbiBvdXQgb2YgbWVtb3J5IGZvciBSWCBTS0JzLiAgSW4gdGhhdAorCSAqIGNhc2UsIGl0J3MgaGVscGZ1bCB0byBvYmV5IHRoZSBidWRnZXQsIG5vdCBvbmx5IHNvIHRoYXQgdGhlCisJICogQ1BVIGlzbid0IGhvZ2dlZCwgYnV0IHNvIHRoYXQgbWVtb3J5ICh3aGljaCBtYXkgc3RpbGwgYmUgbG93KQorCSAqIGlzIG5vdCBob2dnZWQgYnkgb25lIGRldmljZS4KKwkgKgorCSAqIEEgd29yayB1bml0IGlzIGNvbnNpZGVyZWQgdG8gYmUgdHdvIFNLQnMgdG8gYWxsb3cgdXMgdG8gY2F0Y2gKKwkgKiB1cCB3aGVuIHRoZSByaW5nIGhhcyBzaHJ1bmsgZHVlIHRvIG91dC1vZi1tZW1vcnkgYnV0IHdlJ3JlCisJICogc3RpbGwgcmVtb3ZpbmcgdGhlIGZ1bGwgYnVkZ2V0J3Mgd29ydGggb2YgcGFja2V0cyBlYWNoIHRpbWUuCisJICovCisKKwlpZiAoZGF0YS0+cnhmcmVlIDwgVFNJMTA4X1JYUklOR19MRU4pCisJCW51bV9maWxsZWQgPSB0c2kxMDhfcmVmaWxsX3J4KGRldiwgdG90YWxfYnVkZ2V0ICogMik7CisKKwlpZiAoaW50c3RhdCAmIFRTSTEwOF9JTlRfUlhFUlJPUikgeworCQl1MzIgZXJyID0gVFNJX1JFQUQoVFNJMTA4X0VDX1JYRVJSKTsKKwkJVFNJX1dSSVRFKFRTSTEwOF9FQ19SWEVSUiwgZXJyKTsKKworCQlpZiAoZXJyKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggZXJyb3IgJXhcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKworCQkJaWYgKCEoVFNJX1JFQUQoVFNJMTA4X0VDX1JYU1RBVCkgJgorCQkJICAgICAgVFNJMTA4X0VDX1JYU1RBVF9RVUVVRTApKQorCQkJCXRzaTEwOF9yZXN0YXJ0X3J4KGRhdGEsIGRldik7CisJCX0KKwl9CisKKwlpZiAoaW50c3RhdCAmIFRTSTEwOF9JTlRfUlhPVkVSUlVOKSB7CisJCXNwaW5fbG9ja19pcnEoJmRhdGEtPm1pc2Nsb2NrKTsKKwkJZGF0YS0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkYXRhLT5taXNjbG9jayk7CisJfQorCisJYnVkZ2V0X3VzZWQgPSBtYXgobnVtX3JlY2VpdmVkLCBudW1fZmlsbGVkIC8gMik7CisKKwkqYnVkZ2V0IC09IGJ1ZGdldF91c2VkOworCWRldi0+cXVvdGEgLT0gYnVkZ2V0X3VzZWQ7CisKKwlpZiAoYnVkZ2V0X3VzZWQgIT0gdG90YWxfYnVkZ2V0KSB7CisJCWRhdGEtPnJ4cGVuZGluZyA9IDA7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwkJVFNJX1dSSVRFKFRTSTEwOF9FQ19JTlRNQVNLLAorCQkJCSAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX0lOVE1BU0spCisJCQkJICAgICAmIH4oVFNJMTA4X0lOVF9SWFFVRVVFMAorCQkJCQkgfCBUU0kxMDhfSU5UX1JYVEhSRVNIIHwKKwkJCQkJIFRTSTEwOF9JTlRfUlhPVkVSUlVOIHwKKwkJCQkJIFRTSTEwOF9JTlRfUlhFUlJPUiB8CisJCQkJCSBUU0kxMDhfSU5UX1JYV0FJVCkpOworCisJCS8qIElSUXMgYXJlIGxldmVsLXRyaWdnZXJlZCwgc28gbm8gbmVlZCB0byByZS1jaGVjayAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlkYXRhLT5yeHBlbmRpbmcgPSAxOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB0c2kxMDhfcnhfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBBIHJhY2UgY291bGQgY2F1c2UgZGV2IHRvIGFscmVhZHkgYmUgc2NoZWR1bGVkLCBzbyBpdCdzIG5vdCBhbgorCSAqIGVycm9yIGlmIHRoYXQgaGFwcGVucyAoYW5kIGludGVycnVwdHMgc2hvdWxkbid0IGJlIHJlLW1hc2tlZCwKKwkgKiBiZWNhdXNlIHRoYXQgY2FuIGNhdXNlIGhhcm1mdWwgcmFjZXMsIGlmIHBvbGwgaGFzIGFscmVhZHkKKwkgKiB1bm1hc2tlZCB0aGVtIGJ1dCBub3QgY2xlYXJlZCBMSU5LX1NUQVRFX1NDSEVEKS4KKwkgKgorCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGlzIGNvZGUgcmFjZXMgd2l0aCB0c2kxMDhfcG9sbCgpLCB3aGljaCBtYXNrcworCSAqIHRoZSBpbnRlcnJ1cHRzIGFmdGVyIHRzaTEwOF9pcnFfb25lKCkgcmVhZCB0aGUgbWFzaywgYnV0IGJlZm9yZQorCSAqIG5ldGlmX3J4X3NjaGVkdWxlIGlzIGNhbGxlZC4gIEl0IGNvdWxkIGFsc28gaGFwcGVuIGR1ZSB0byBjYWxscworCSAqIGZyb20gdHNpMTA4X2NoZWNrX3J4cmluZygpLgorCSAqLworCisJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkvKiBNYXNrLCByYXRoZXIgdGhhbiBhY2ssIHRoZSByZWNlaXZlIGludGVycnVwdHMuICBUaGUgYWNrCisJCSAqIHdpbGwgaGFwcGVuIGluIHRzaTEwOF9wb2xsKCkuCisJCSAqLworCisJCVRTSV9XUklURShUU0kxMDhfRUNfSU5UTUFTSywKKwkJCQkgICAgIFRTSV9SRUFEKFRTSTEwOF9FQ19JTlRNQVNLKSB8CisJCQkJICAgICBUU0kxMDhfSU5UX1JYUVVFVUUwCisJCQkJICAgICB8IFRTSTEwOF9JTlRfUlhUSFJFU0ggfAorCQkJCSAgICAgVFNJMTA4X0lOVF9SWE9WRVJSVU4gfCBUU0kxMDhfSU5UX1JYRVJST1IgfAorCQkJCSAgICAgVFNJMTA4X0lOVF9SWFdBSVQpOworCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJfSBlbHNlIHsKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCS8qIFRoaXMgY2FuIGhhcHBlbiBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJzIHdoaWxlIHRoZQorCQkJICogaW50ZXJmYWNlIGlzIGJlaW5nIGJyb3VnaHQgZG93biwgYXMgdGhlIFNUQVJUCisJCQkgKiBiaXQgaXMgY2xlYXJlZCBiZWZvcmUgdGhlIHN0b3AgZnVuY3Rpb24gaXMgY2FsbGVkLgorCQkJICoKKwkJCSAqIEluIHRoaXMgY2FzZSwgdGhlIGludGVycnVwdHMgbXVzdCBiZSBtYXNrZWQsIG9yCisJCQkgKiB0aGV5IHdpbGwgY29udGludWUgaW5kZWZpbml0ZWx5LgorCQkJICoKKwkJCSAqIFRoZXJlJ3MgYSByYWNlIGhlcmUgaWYgdGhlIGludGVyZmFjZSBpcyBicm91Z2h0IGRvd24KKwkJCSAqIGFuZCB0aGVuIHVwIGluIHJhcGlkIHN1Y2Nlc3Npb24sIGFzIHRoZSBkZXZpY2UgY291bGQKKwkJCSAqIGJlIG1hZGUgcnVubmluZyBhZnRlciB0aGUgYWJvdmUgY2hlY2sgYW5kIGJlZm9yZQorCQkJICogdGhlIG1hc2tpbmcgYmVsb3cuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYgdGhlIElSUQorCQkJICogdGhyZWFkIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIHRhc2sgYnJpbmluZworCQkJICogdXAgdGhlIGludGVyZmFjZS4gIEZpeGluZyB0aGlzIHJhY2Ugd291bGQgbGlrZWx5CisJCQkgKiByZXF1aXJlIGNoYW5nZXMgaW4gZ2VuZXJpYyBjb2RlLgorCQkJICovCisKKwkJCVRTSV9XUklURShUU0kxMDhfRUNfSU5UTUFTSywKKwkJCQkJICAgICBUU0lfUkVBRAorCQkJCQkgICAgIChUU0kxMDhfRUNfSU5UTUFTSykgfAorCQkJCQkgICAgIFRTSTEwOF9JTlRfUlhRVUVVRTAgfAorCQkJCQkgICAgIFRTSTEwOF9JTlRfUlhUSFJFU0ggfAorCQkJCQkgICAgIFRTSTEwOF9JTlRfUlhPVkVSUlVOIHwKKwkJCQkJICAgICBUU0kxMDhfSU5UX1JYRVJST1IgfAorCQkJCQkgICAgIFRTSTEwOF9JTlRfUlhXQUlUKTsKKwkJfQorCX0KK30KKworLyogSWYgdGhlIFJYIHJpbmcgaGFzIHJ1biBvdXQgb2YgbWVtb3J5LCB0cnkgcGVyaW9kaWNhbGx5CisgKiB0byBhbGxvY2F0ZSBzb21lIG1vcmUsIGFzIG90aGVyd2lzZSBwb2xsIHdvdWxkIG5ldmVyCisgKiBnZXQgY2FsbGVkIChhcGFydCBmcm9tIHRoZSBpbml0aWFsIGVuZC1vZi1xdWV1ZSBjb25kaXRpb24pLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uY2UgcGVyIHNlY29uZCAoYnkgZGVmYXVsdCkgZnJvbSB0aGUgdGhyZWFkLgorICovCisKK3N0YXRpYyB2b2lkIHRzaTEwOF9jaGVja19yeHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEEgcG9sbCBpcyBzY2hlZHVsZWQsIGFzIG9wcG9zZWQgdG8gY2FsaW5nIHRzaTEwOF9yZWZpbGxfcngKKwkgKiBkaXJlY3RseSwgc28gYXMgdG8ga2VlcCB0aGUgcmVjZWl2ZSBwYXRoIHNpbmdsZS10aHJlYWRlZAorCSAqIChhbmQgdGh1cyBub3QgbmVlZGluZyBhIGxvY2spLgorCSAqLworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBkYXRhLT5yeGZyZWUgPCBUU0kxMDhfUlhSSU5HX0xFTiAvIDQpCisJCXRzaTEwOF9yeF9pbnQoZGV2KTsKK30KKworc3RhdGljIHZvaWQgdHNpMTA4X3R4X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBlc3RhdCA9IFRTSV9SRUFEKFRTSTEwOF9FQ19UWEVTVEFUKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfVFhFU1RBVCwgZXN0YXQpOworCVRTSV9XUklURShUU0kxMDhfRUNfSU5UU1RBVCwgVFNJMTA4X0lOVF9UWFFVRVVFMCB8CisJCQkgICAgIFRTSTEwOF9JTlRfVFhJRExFIHwgVFNJMTA4X0lOVF9UWEVSUk9SKTsKKwlpZiAoZXN0YXQgJiBUU0kxMDhfRUNfVFhFU1RBVF9RMF9FUlIpIHsKKwkJdTMyIGVyciA9IFRTSV9SRUFEKFRTSTEwOF9FQ19UWEVSUik7CisJCVRTSV9XUklURShUU0kxMDhfRUNfVFhFUlIsIGVycik7CisKKwkJaWYgKGVyciAmJiBuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUWCBlcnJvciAleFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCX0KKworCWlmIChlc3RhdCAmIChUU0kxMDhfRUNfVFhFU1RBVF9RMF9ERVNDSU5UIHwgVFNJMTA4X0VDX1RYRVNUQVRfUTBfRU9RKSkgeworCQlzcGluX2xvY2soJmRhdGEtPnR4bG9jayk7CisJCXRzaTEwOF9jb21wbGV0ZV90eChkZXYpOworCQlzcGluX3VubG9jaygmZGF0YS0+dHhsb2NrKTsKKwl9Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHRzaTEwOF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHN0YXQgPSBUU0lfUkVBRChUU0kxMDhfRUNfSU5UU1RBVCk7CisKKwlpZiAoIShzdGF0ICYgVFNJMTA4X0lOVF9BTlkpKQorCQlyZXR1cm4gSVJRX05PTkU7CS8qIE5vdCBvdXIgaW50ZXJydXB0ICovCisKKwlzdGF0ICY9IH5UU0lfUkVBRChUU0kxMDhfRUNfSU5UTUFTSyk7CisKKwlpZiAoc3RhdCAmIChUU0kxMDhfSU5UX1RYUVVFVUUwIHwgVFNJMTA4X0lOVF9UWElETEUgfAorCQkgICAgVFNJMTA4X0lOVF9UWEVSUk9SKSkKKwkJdHNpMTA4X3R4X2ludChkZXYpOworCWlmIChzdGF0ICYgKFRTSTEwOF9JTlRfUlhRVUVVRTAgfCBUU0kxMDhfSU5UX1JYVEhSRVNIIHwKKwkJICAgIFRTSTEwOF9JTlRfUlhXQUlUIHwgVFNJMTA4X0lOVF9SWE9WRVJSVU4gfAorCQkgICAgVFNJMTA4X0lOVF9SWEVSUk9SKSkKKwkJdHNpMTA4X3J4X2ludChkZXYpOworCisJaWYgKHN0YXQgJiBUU0kxMDhfSU5UX1NGTikgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTRk4gZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCVRTSV9XUklURShUU0kxMDhfRUNfSU5UU1RBVCwgVFNJMTA4X0lOVF9TRk4pOworCX0KKworCWlmIChzdGF0ICYgVFNJMTA4X0lOVF9TVEFUQ0FSUlkpIHsKKwkJdHNpMTA4X3N0YXRfY2FycnkoZGV2KTsKKwkJVFNJX1dSSVRFKFRTSTEwOF9FQ19JTlRTVEFULCBUU0kxMDhfSU5UX1NUQVRDQVJSWSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCB0c2kxMDhfc3RvcF9ldGhlcm5ldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpID0gMTAwMDsKKwkvKiBEaXNhYmxlIGFsbCBUWCBhbmQgUlggcXVldWVzIC4uLiAqLworCVRTSV9XUklURShUU0kxMDhfRUNfVFhDVFJMLCAwKTsKKwlUU0lfV1JJVEUoVFNJMTA4X0VDX1JYQ1RSTCwgMCk7CisKKwkvKiAuLi5hbmQgd2FpdCBmb3IgdGhlbSB0byBiZWNvbWUgaWRsZSAqLworCXdoaWxlKGktLSkgeworCQlpZighKFRTSV9SRUFEKFRTSTEwOF9FQ19UWFNUQVQpICYgVFNJMTA4X0VDX1RYU1RBVF9BQ1RJVkUpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWkgPSAxMDAwOworCXdoaWxlKGktLSl7CisJCWlmKCEoVFNJX1JFQUQoVFNJMTA4X0VDX1JYU1RBVCkgJiBUU0kxMDhfRUNfUlhTVEFUX0FDVElWRSkpCisJCQlyZXR1cm47CisJCXVkZWxheSgxMCk7CisJfQorCXByaW50ayhLRVJOX0VSUiAiJXMgZnVuY3Rpb24gdGltZSBvdXQgXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCB0c2kxMDhfcmVzZXRfZXRoZXIoc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqIGRhdGEpCit7CisJVFNJX1dSSVRFKFRTSTEwOF9NQUNfQ0ZHMSwgVFNJMTA4X01BQ19DRkcxX1NPRlRSU1QpOworCXVkZWxheSgxMDApOworCVRTSV9XUklURShUU0kxMDhfTUFDX0NGRzEsIDApOworCisJVFNJX1dSSVRFKFRTSTEwOF9FQ19QT1JUQ1RSTCwgVFNJMTA4X0VDX1BPUlRDVFJMX1NUQVRSU1QpOworCXVkZWxheSgxMDApOworCVRTSV9XUklURShUU0kxMDhfRUNfUE9SVENUUkwsCisJCQkgICAgIFRTSV9SRUFEKFRTSTEwOF9FQ19QT1JUQ1RSTCkgJgorCQkJICAgICB+VFNJMTA4X0VDX1BPUlRDVFJMX1NUQVRSU1QpOworCisJVFNJX1dSSVRFKFRTSTEwOF9FQ19UWENGRywgVFNJMTA4X0VDX1RYQ0ZHX1JTVCk7CisJdWRlbGF5KDEwMCk7CisJVFNJX1dSSVRFKFRTSTEwOF9FQ19UWENGRywKKwkJCSAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX1RYQ0ZHKSAmCisJCQkgICAgIH5UU0kxMDhfRUNfVFhDRkdfUlNUKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfUlhDRkcsIFRTSTEwOF9FQ19SWENGR19SU1QpOworCXVkZWxheSgxMDApOworCVRTSV9XUklURShUU0kxMDhfRUNfUlhDRkcsCisJCQkgICAgIFRTSV9SRUFEKFRTSTEwOF9FQ19SWENGRykgJgorCQkJICAgICB+VFNJMTA4X0VDX1JYQ0ZHX1JTVCk7CisKKwlUU0lfV1JJVEUoVFNJMTA4X01BQ19NSUlfTUdNVF9DRkcsCisJCQkgICAgIFRTSV9SRUFEKFRTSTEwOF9NQUNfTUlJX01HTVRfQ0ZHKSB8CisJCQkgICAgIFRTSTEwOF9NQUNfTUlJX01HTVRfUlNUKTsKKwl1ZGVsYXkoMTAwKTsKKwlUU0lfV1JJVEUoVFNJMTA4X01BQ19NSUlfTUdNVF9DRkcsCisJCQkgICAgIChUU0lfUkVBRChUU0kxMDhfTUFDX01JSV9NR01UX0NGRykgJgorCQkJICAgICB+KFRTSTEwOF9NQUNfTUlJX01HTVRfUlNUIHwKKwkJCSAgICAgICBUU0kxMDhfTUFDX01JSV9NR01UX0NMSykpIHwgMHgwNyk7Cit9CisKK3N0YXRpYyBpbnQgdHNpMTA4X2dldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgd29yZDEgPSBUU0lfUkVBRChUU0kxMDhfTUFDX0FERFIxKTsKKwl1MzIgd29yZDIgPSBUU0lfUkVBRChUU0kxMDhfTUFDX0FERFIyKTsKKworCS8qIE5vdGUgdGhhdCB0aGUgb2N0ZXRzIGFyZSByZXZlcnNlZCBmcm9tIHdoYXQgdGhlIG1hbnVhbCBzYXlzLAorCSAqIHByb2R1Y2luZyBhbiBldmVuIHdlaXJkZXIgb3JkZXJpbmcuLi4KKwkgKi8KKwlpZiAod29yZDIgPT0gMCAmJiB3b3JkMSA9PSAwKSB7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwNjsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4ZDI7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzRdID0gMHgwMDsKKwkJaWYgKDB4OCA9PSBkYXRhLT5waHkpCisJCQlkZXYtPmRldl9hZGRyWzVdID0gMHgwMTsKKwkJZWxzZQorCQkJZGV2LT5kZXZfYWRkcls1XSA9IDB4MDI7CisKKwkJd29yZDIgPSAoZGV2LT5kZXZfYWRkclswXSA8PCAxNikgfCAoZGV2LT5kZXZfYWRkclsxXSA8PCAyNCk7CisKKwkJd29yZDEgPSAoZGV2LT5kZXZfYWRkclsyXSA8PCAwKSB8IChkZXYtPmRldl9hZGRyWzNdIDw8IDgpIHwKKwkJICAgIChkZXYtPmRldl9hZGRyWzRdIDw8IDE2KSB8IChkZXYtPmRldl9hZGRyWzVdIDw8IDI0KTsKKworCQlUU0lfV1JJVEUoVFNJMTA4X01BQ19BRERSMSwgd29yZDEpOworCQlUU0lfV1JJVEUoVFNJMTA4X01BQ19BRERSMiwgd29yZDIpOworCX0gZWxzZSB7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAod29yZDIgPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclsxXSA9ICh3b3JkMiA+PiAyNCkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzJdID0gKHdvcmQxID4+IDApICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclszXSA9ICh3b3JkMSA+PiA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbNF0gPSAod29yZDEgPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls1XSA9ICh3b3JkMSA+PiAyNCkgJiAweGZmOworCX0KKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworCQlwcmludGsoIktFUk5fRVJSOiB3b3JkMTogJTA4eCwgd29yZDI6ICUwOHhcbiIsIHdvcmQxLCB3b3JkMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzaTEwOF9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHdvcmQxLCB3b3JkMjsKKwlpbnQgaTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkvKiArMiBpcyBmb3IgdGhlIG9mZnNldCBvZiB0aGUgSFcgYWRkciB0eXBlICovCisJCWRldi0+ZGV2X2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKilhZGRyKVtpICsgMl07CisKKwl3b3JkMiA9IChkZXYtPmRldl9hZGRyWzBdIDw8IDE2KSB8IChkZXYtPmRldl9hZGRyWzFdIDw8IDI0KTsKKworCXdvcmQxID0gKGRldi0+ZGV2X2FkZHJbMl0gPDwgMCkgfCAoZGV2LT5kZXZfYWRkclszXSA8PCA4KSB8CisJICAgIChkZXYtPmRldl9hZGRyWzRdIDw8IDE2KSB8IChkZXYtPmRldl9hZGRyWzVdIDw8IDI0KTsKKworCXNwaW5fbG9ja19pcnEoJmRhdGEtPm1pc2Nsb2NrKTsKKwlUU0lfV1JJVEUoVFNJMTA4X01BQ19BRERSMSwgd29yZDEpOworCVRTSV9XUklURShUU0kxMDhfTUFDX0FERFIyLCB3b3JkMik7CisJc3Bpbl9sb2NrKCZkYXRhLT50eGxvY2spOworCisJaWYgKGRhdGEtPnR4ZnJlZSAmJiBkYXRhLT5saW5rX3VwKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9jaygmZGF0YS0+dHhsb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRhdGEtPm1pc2Nsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogUHJvdGVjdGVkIGJ5IGRldi0+eG1pdF9sb2NrLiAqLworc3RhdGljIHZvaWQgdHNpMTA4X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJ4Y2ZnID0gVFNJX1JFQUQoVFNJMTA4X0VDX1JYQ0ZHKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcnhjZmcgJj0gfihUU0kxMDhfRUNfUlhDRkdfVUNfSEFTSCB8IFRTSTEwOF9FQ19SWENGR19NQ19IQVNIKTsKKwkJcnhjZmcgfD0gVFNJMTA4X0VDX1JYQ0ZHX1VGRSB8IFRTSTEwOF9FQ19SWENGR19NRkU7CisJCWdvdG8gb3V0OworCX0KKworCXJ4Y2ZnICY9IH4oVFNJMTA4X0VDX1JYQ0ZHX1VGRSB8IFRTSTEwOF9FQ19SWENGR19NRkUpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19jb3VudCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGRldl9tY19saXN0ICptYyA9IGRldi0+bWNfbGlzdDsKKwkJcnhjZmcgfD0gVFNJMTA4X0VDX1JYQ0ZHX01GRSB8IFRTSTEwOF9FQ19SWENGR19NQ19IQVNIOworCisJCW1lbXNldChkYXRhLT5tY19oYXNoLCAwLCBzaXplb2YoZGF0YS0+bWNfaGFzaCkpOworCisJCXdoaWxlIChtYykgeworCQkJdTMyIGhhc2gsIGNyYzsKKworCQkJaWYgKG1jLT5kbWlfYWRkcmxlbiA9PSA2KSB7CisJCQkJY3JjID0gZXRoZXJfY3JjKDYsIG1jLT5kbWlfYWRkcik7CisJCQkJaGFzaCA9IGNyYyA+PiAyMzsKKworCQkJCV9fc2V0X2JpdChoYXNoLCAmZGF0YS0+bWNfaGFzaFswXSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IGdvdCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBsZW5ndGggJWQgIgorCQkJCSAgICAgICAiaW5zdGVhZCBvZiA2LlxuIiwgZGV2LT5uYW1lLAorCQkJCSAgICAgICBtYy0+ZG1pX2FkZHJsZW4pOworCQkJfQorCisJCQltYyA9IG1jLT5uZXh0OworCQl9CisKKwkJVFNJX1dSSVRFKFRTSTEwOF9FQ19IQVNIQUREUiwKKwkJCQkgICAgIFRTSTEwOF9FQ19IQVNIQUREUl9BVVRPSU5DIHwKKwkJCQkgICAgIFRTSTEwOF9FQ19IQVNIQUREUl9NQ0FTVCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCS8qIFRoZSBtYW51YWwgc2F5cyB0aGF0IHRoZSBoYXJkd2FyZSBtYXkgZHJvcAorCQkJICogYmFjay10by1iYWNrIHdyaXRlcyB0byB0aGUgZGF0YSByZWdpc3Rlci4KKwkJCSAqLworCQkJdWRlbGF5KDEpOworCQkJVFNJX1dSSVRFKFRTSTEwOF9FQ19IQVNIREFUQSwKKwkJCQkJICAgICBkYXRhLT5tY19oYXNoW2ldKTsKKwkJfQorCX0KKworICAgICAgb3V0OgorCVRTSV9XUklURShUU0kxMDhfRUNfUlhDRkcsIHJ4Y2ZnKTsKK30KKworc3RhdGljIHZvaWQgdHNpMTA4X2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGkgPSAwOworCXUxNiBwaHl2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGh5X2xvY2ssIGZsYWdzKTsKKworCXRzaTEwOF93cml0ZV9taWkoZGF0YSwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCXdoaWxlIChpLS0peworCQlpZighKHRzaTEwOF9yZWFkX21paShkYXRhLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzIGZ1bmN0aW9uIHRpbWUgb3V0IFxuIiwgX19GVU5DVElPTl9fKTsKKworI2lmIChUU0kxMDhfUEhZX1RZUEUgPT0gUEhZX0JDTTU0WFgpCS8qIEJyb2FkY29tIEJDTTU0eHggUEhZICovCisJdHNpMTA4X3dyaXRlX21paShkYXRhLCAweDA5LCAweDAzMDApOworCXRzaTEwOF93cml0ZV9taWkoZGF0YSwgMHgxMCwgMHgxMDIwKTsKKwl0c2kxMDhfd3JpdGVfbWlpKGRhdGEsIDB4MWMsIDB4OGMwMCk7CisjZW5kaWYKKworCXRzaTEwOF93cml0ZV9taWkoZGF0YSwKKwkJCSBNSUlfQk1DUiwKKwkJCSBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCXdoaWxlICh0c2kxMDhfcmVhZF9taWkoZGF0YSwgTUlJX0JNQ1IpICYgQk1DUl9BTlJFU1RBUlQpCisJCWNwdV9yZWxheCgpOworCisJLyogU2V0IEcvTUlJIG1vZGUgYW5kIHJlY2VpdmUgY2xvY2sgc2VsZWN0IGluIFRCSSBjb250cm9sICMyLiAgVGhlCisJICogc2Vjb25kIHBvcnQgd29uJ3Qgd29yayBpZiB0aGlzIGlzbid0IGRvbmUsIGV2ZW4gdGhvdWdoIHdlIGRvbid0CisJICogdXNlIFRCSSBtb2RlLgorCSAqLworCisJdHNpMTA4X3dyaXRlX3RiaShkYXRhLCAweDExLCAweDMwKTsKKworCS8qIEZJWE1FOiBJdCBzZWVtcyB0byB0YWtlIG1vcmUgdGhhbiAyIGJhY2stdG8tYmFjayByZWFkcyB0byB0aGUKKwkgKiBQSFlfU1RBVCByZWdpc3RlciBiZWZvcmUgdGhlIGxpbmsgdXAgc3RhdHVzIGJpdCBpcyBzZXQuCisJICovCisKKwlkYXRhLT5saW5rX3VwID0gMTsKKworCXdoaWxlICghKChwaHl2YWwgPSB0c2kxMDhfcmVhZF9taWkoZGF0YSwgTUlJX0JNU1IpKSAmCisJCSBCTVNSX0xTVEFUVVMpKSB7CisJCWlmIChpKysgPiAoTUlJX1JFQURfREVMQVkgLyAxMCkpIHsKKwkJCWRhdGEtPmxpbmtfdXAgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5X2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoeV9sb2NrLCBmbGFncyk7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIlBIWV9TVEFUIHJlZyBjb250YWlucyAlMDh4XG4iLCBwaHl2YWwpOworCWRhdGEtPnBoeV9vayA9IDE7CisJZGF0YS0+aW5pdF9tZWRpYSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdHNpMTA4X2tpbGxfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaHlfbG9jaywgZmxhZ3MpOworCXRzaTEwOF93cml0ZV9taWkoZGF0YSwgTUlJX0JNQ1IsIEJNQ1JfUERPV04pOworCWRhdGEtPnBoeV9vayA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0c2kxMDhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCByeHJpbmdfc2l6ZSA9IFRTSTEwOF9SWFJJTkdfTEVOICogc2l6ZW9mKHJ4X2Rlc2MpOworCXVuc2lnbmVkIGludCB0eHJpbmdfc2l6ZSA9IFRTSTEwOF9UWFJJTkdfTEVOICogc2l6ZW9mKHR4X2Rlc2MpOworCisJaSA9IHJlcXVlc3RfaXJxKGRhdGEtPmlycV9udW0sIHRzaTEwOF9pcnEsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidHNpMTA4X2V0aCVkOiBDb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkgICAgICAgZGF0YS0+aWQsIGRhdGEtPmlycV9udW0pOworCQlyZXR1cm4gaTsKKwl9IGVsc2UgeworCQlkZXYtPmlycSA9IGRhdGEtPmlycV9udW07CisJCXByaW50ayhLRVJOX05PVElDRQorCQkgICAgICAgInRzaTEwOF9vcGVuIDogUG9ydCAlZCBBc3NpZ25lZCBJUlEgJWQgdG8gJXNcbiIsCisJCSAgICAgICBkYXRhLT5pZCwgZGV2LT5pcnEsIGRldi0+bmFtZSk7CisJfQorCisJZGF0YS0+cnhyaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHJ4cmluZ19zaXplLAorCQkJJmRhdGEtPnJ4ZG1hLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGF0YS0+cnhyaW5nKSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiVFNJMTA4X0VUSDogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnhyaW5nIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCW1lbXNldChkYXRhLT5yeHJpbmcsIDAsIHJ4cmluZ19zaXplKTsKKwl9CisKKwlkYXRhLT50eHJpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgdHhyaW5nX3NpemUsCisJCQkmZGF0YS0+dHhkbWEsIEdGUF9LRVJORUwpOworCisJaWYgKCFkYXRhLT50eHJpbmcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJUU0kxMDhfRVRIOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0eHJpbmchXG4iKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCgwLCByeHJpbmdfc2l6ZSwgZGF0YS0+cnhyaW5nLCBkYXRhLT5yeGRtYSk7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCW1lbXNldChkYXRhLT50eHJpbmcsIDAsIHR4cmluZ19zaXplKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFNJMTA4X1JYUklOR19MRU47IGkrKykgeworCQlkYXRhLT5yeHJpbmdbaV0ubmV4dDAgPSBkYXRhLT5yeGRtYSArIChpICsgMSkgKiBzaXplb2YocnhfZGVzYyk7CisJCWRhdGEtPnJ4cmluZ1tpXS5ibGVuID0gVFNJMTA4X1JYQlVGX1NJWkU7CisJCWRhdGEtPnJ4cmluZ1tpXS52bGFuID0gMDsKKwl9CisKKwlkYXRhLT5yeHJpbmdbVFNJMTA4X1JYUklOR19MRU4gLSAxXS5uZXh0MCA9IGRhdGEtPnJ4ZG1hOworCisJZGF0YS0+cnh0YWlsID0gMDsKKwlkYXRhLT5yeGhlYWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFRTSTEwOF9SWFJJTkdfTEVOOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoVFNJMTA4X1JYQlVGX1NJWkUgKyBORVRfSVBfQUxJR04pOworCisJCWlmICghc2tiKSB7CisJCQkvKiBCYWguICBObyBtZW1vcnkgZm9yIG5vdywgYnV0IG1heWJlIHdlJ2xsIGdldAorCQkJICogc29tZSBtb3JlIGxhdGVyLgorCQkJICogRm9yIG5vdywgd2UnbGwgbGl2ZSB3aXRoIHRoZSBzbWFsbGVyIHJpbmcuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IENvdWxkIG9ubHkgYWxsb2NhdGUgJWQgcmVjZWl2ZSBza2IocykuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaSk7CisJCQlkYXRhLT5yeGhlYWQgPSBpOworCQkJYnJlYWs7CisJCX0KKworCQlkYXRhLT5yeHNrYnNbaV0gPSBza2I7CisJCS8qIEFsaWduIHRoZSBwYXlsb2FkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5ICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCWRhdGEtPnJ4c2tic1tpXSA9IHNrYjsKKwkJZGF0YS0+cnhyaW5nW2ldLmJ1ZjAgPSB2aXJ0X3RvX3BoeXMoZGF0YS0+cnhza2JzW2ldLT5kYXRhKTsKKwkJZGF0YS0+cnhyaW5nW2ldLm1pc2MgPSBUU0kxMDhfUlhfT1dOIHwgVFNJMTA4X1JYX0lOVDsKKwl9CisKKwlkYXRhLT5yeGZyZWUgPSBpOworCVRTSV9XUklURShUU0kxMDhfRUNfUlhRX1BUUkxPVywgZGF0YS0+cnhkbWEpOworCisJZm9yIChpID0gMDsgaSA8IFRTSTEwOF9UWFJJTkdfTEVOOyBpKyspIHsKKwkJZGF0YS0+dHhyaW5nW2ldLm5leHQwID0gZGF0YS0+dHhkbWEgKyAoaSArIDEpICogc2l6ZW9mKHR4X2Rlc2MpOworCQlkYXRhLT50eHJpbmdbaV0ubWlzYyA9IDA7CisJfQorCisJZGF0YS0+dHhyaW5nW1RTSTEwOF9UWFJJTkdfTEVOIC0gMV0ubmV4dDAgPSBkYXRhLT50eGRtYTsKKwlkYXRhLT50eHRhaWwgPSAwOworCWRhdGEtPnR4aGVhZCA9IDA7CisJZGF0YS0+dHhmcmVlID0gVFNJMTA4X1RYUklOR19MRU47CisJVFNJX1dSSVRFKFRTSTEwOF9FQ19UWFFfUFRSTE9XLCBkYXRhLT50eGRtYSk7CisJdHNpMTA4X2luaXRfcGh5KGRldik7CisKKwlzZXR1cF90aW1lcigmZGF0YS0+dGltZXIsIHRzaTEwOF90aW1lZF9jaGVja2VyLCAodW5zaWduZWQgbG9uZylkZXYpOworCW1vZF90aW1lcigmZGF0YS0+dGltZXIsIGppZmZpZXMgKyAxKTsKKworCXRzaTEwOF9yZXN0YXJ0X3J4KGRhdGEsIGRldik7CisKKwlUU0lfV1JJVEUoVFNJMTA4X0VDX0lOVFNUQVQsIH4wKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfSU5UTUFTSywKKwkJCSAgICAgfihUU0kxMDhfSU5UX1RYUVVFVUUwIHwgVFNJMTA4X0lOVF9SWEVSUk9SIHwKKwkJCSAgICAgICBUU0kxMDhfSU5UX1JYVEhSRVNIIHwgVFNJMTA4X0lOVF9SWFFVRVVFMCB8CisJCQkgICAgICAgVFNJMTA4X0lOVF9SWE9WRVJSVU4gfCBUU0kxMDhfSU5UX1JYV0FJVCB8CisJCQkgICAgICAgVFNJMTA4X0lOVF9TRk4gfCBUU0kxMDhfSU5UX1NUQVRDQVJSWSkpOworCisJVFNJX1dSSVRFKFRTSTEwOF9NQUNfQ0ZHMSwKKwkJCSAgICAgVFNJMTA4X01BQ19DRkcxX1JYRU4gfCBUU0kxMDhfTUFDX0NGRzFfVFhFTik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2kxMDhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZkYXRhLT50aW1lcik7CisKKwl0c2kxMDhfc3RvcF9ldGhlcm5ldChkZXYpOworCXRzaTEwOF9raWxsX3BoeShkZXYpOworCVRTSV9XUklURShUU0kxMDhfRUNfSU5UTUFTSywgfjApOworCVRTSV9XUklURShUU0kxMDhfTUFDX0NGRzEsIDApOworCisJLyogQ2hlY2sgZm9yIGFueSBwZW5kaW5nIFRYIHBhY2tldHMsIGFuZCBkcm9wIHRoZW0uICovCisKKwl3aGlsZSAoIWRhdGEtPnR4ZnJlZSB8fCBkYXRhLT50eGhlYWQgIT0gZGF0YS0+dHh0YWlsKSB7CisJCWludCB0eCA9IGRhdGEtPnR4dGFpbDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc2tiID0gZGF0YS0+dHhza2JzW3R4XTsKKwkJZGF0YS0+dHh0YWlsID0gKGRhdGEtPnR4dGFpbCArIDEpICUgVFNJMTA4X1RYUklOR19MRU47CisJCWRhdGEtPnR4ZnJlZSsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisJc3luY2hyb25pemVfaXJxKGRhdGEtPmlycV9udW0pOworCWZyZWVfaXJxKGRhdGEtPmlycV9udW0sIGRldik7CisKKwkvKiBEaXNjYXJkIHRoZSBSWCByaW5nLiAqLworCisJd2hpbGUgKGRhdGEtPnJ4ZnJlZSkgeworCQlpbnQgcnggPSBkYXRhLT5yeHRhaWw7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGF0YS0+cnhza2JzW3J4XTsKKwkJZGF0YS0+cnh0YWlsID0gKGRhdGEtPnJ4dGFpbCArIDEpICUgVFNJMTA4X1JYUklOR19MRU47CisJCWRhdGEtPnJ4ZnJlZS0tOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisJZG1hX2ZyZWVfY29oZXJlbnQoMCwKKwkJCSAgICBUU0kxMDhfUlhSSU5HX0xFTiAqIHNpemVvZihyeF9kZXNjKSwKKwkJCSAgICBkYXRhLT5yeHJpbmcsIGRhdGEtPnJ4ZG1hKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgwLAorCQkJICAgIFRTSTEwOF9UWFJJTkdfTEVOICogc2l6ZW9mKHR4X2Rlc2MpLAorCQkJICAgIGRhdGEtPnR4cmluZywgZGF0YS0+dHhkbWEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTEwOF9pbml0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJVFNJX1dSSVRFKFRTSTEwOF9NQUNfQ0ZHMiwgVFNJMTA4X01BQ19DRkcyX0RGTFRfUFJFQU1CTEUgfAorCQkJICAgICBUU0kxMDhfTUFDX0NGRzJfUEFEQ1JDKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfVFhUSFJFU0gsCisJCQkgICAgICgxOTIgPDwgVFNJMTA4X0VDX1RYVEhSRVNIX1NUQVJURklMTCkgfAorCQkJICAgICAoMTkyIDw8IFRTSTEwOF9FQ19UWFRIUkVTSF9TVE9QRklMTCkpOworCisJVFNJX1dSSVRFKFRTSTEwOF9TVEFUX0NBUlJZTUFTSzEsCisJCQkgICAgIH4oVFNJMTA4X1NUQVRfQ0FSUlkxX1JYQllURVMgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWFBLVFMgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWEZDUyB8CisJCQkgICAgICAgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYTUNBU1QgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWEFMSUdOIHwKKwkJCSAgICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhMRU5HVEggfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWFJVTlQgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWEpVTUJPIHwKKwkJCSAgICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhGUkFHIHwKKwkJCSAgICAgICBUU0kxMDhfU1RBVF9DQVJSWTFfUlhKQUJCRVIgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMV9SWERST1ApKTsKKworCVRTSV9XUklURShUU0kxMDhfU1RBVF9DQVJSWU1BU0syLAorCQkJICAgICB+KFRTSTEwOF9TVEFUX0NBUlJZMl9UWEJZVEVTIHwKKwkJCSAgICAgICBUU0kxMDhfU1RBVF9DQVJSWTJfVFhQS1RTIHwKKwkJCSAgICAgICBUU0kxMDhfU1RBVF9DQVJSWTJfVFhFWERFRiB8CisJCQkgICAgICAgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhDT0wgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMl9UWFRDT0wgfAorCQkJICAgICAgIFRTSTEwOF9TVEFUX0NBUlJZMl9UWFBBVVNFKSk7CisKKwlUU0lfV1JJVEUoVFNJMTA4X0VDX1BPUlRDVFJMLCBUU0kxMDhfRUNfUE9SVENUUkxfU1RBVEVOKTsKKwlUU0lfV1JJVEUoVFNJMTA4X01BQ19DRkcxLCAwKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfUlhDRkcsCisJCQkgICAgIFRTSTEwOF9FQ19SWENGR19TRSB8IFRTSTEwOF9FQ19SWENGR19CRkUpOworCisJVFNJX1dSSVRFKFRTSTEwOF9FQ19UWFFfQ0ZHLCBUU0kxMDhfRUNfVFhRX0NGR19ERVNDX0lOVCB8CisJCQkgICAgIFRTSTEwOF9FQ19UWFFfQ0ZHX0VPUV9PV05fSU5UIHwKKwkJCSAgICAgVFNJMTA4X0VDX1RYUV9DRkdfV1NXUCB8IChUU0kxMDhfUEJNX1BPUlQgPDwKKwkJCQkJCVRTSTEwOF9FQ19UWFFfQ0ZHX1NGTlBPUlQpKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfUlhRX0NGRywgVFNJMTA4X0VDX1JYUV9DRkdfREVTQ19JTlQgfAorCQkJICAgICBUU0kxMDhfRUNfUlhRX0NGR19FT1FfT1dOX0lOVCB8CisJCQkgICAgIFRTSTEwOF9FQ19SWFFfQ0ZHX1dTV1AgfCAoVFNJMTA4X1BCTV9QT1JUIDw8CisJCQkJCQlUU0kxMDhfRUNfUlhRX0NGR19TRk5QT1JUKSk7CisKKwlUU0lfV1JJVEUoVFNJMTA4X0VDX1RYUV9CVUZDRkcsCisJCQkgICAgIFRTSTEwOF9FQ19UWFFfQlVGQ0ZHX0JVUlNUMjU2IHwKKwkJCSAgICAgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlNXUCB8IChUU0kxMDhfUEJNX1BPUlQgPDwKKwkJCQkJCVRTSTEwOF9FQ19UWFFfQlVGQ0ZHX1NGTlBPUlQpKTsKKworCVRTSV9XUklURShUU0kxMDhfRUNfUlhRX0JVRkNGRywKKwkJCSAgICAgVFNJMTA4X0VDX1JYUV9CVUZDRkdfQlVSU1QyNTYgfAorCQkJICAgICBUU0kxMDhfRUNfUlhRX0JVRkNGR19CU1dQIHwgKFRTSTEwOF9QQk1fUE9SVCA8PAorCQkJCQkJVFNJMTA4X0VDX1JYUV9CVUZDRkdfU0ZOUE9SVCkpOworCisJVFNJX1dSSVRFKFRTSTEwOF9FQ19JTlRNQVNLLCB+MCk7Cit9CisKK3N0YXRpYyBpbnQgdHNpMTA4X2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZkYXRhLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3RzaTEwOF9pbml0X29uZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBOVUxMOworCWh3X2luZm8gKmVpbmZvOworCWludCBlcnIgPSAwOworCisJZWluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChOVUxMID09IGVpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAidHNpLWV0aCAlZDogTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhXG4iLAorCQkgICAgICAgcGRldi0+aWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDcmVhdGUgYW4gZXRoZXJuZXQgZGV2aWNlIGluc3RhbmNlICovCisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHRzaTEwOF9wcnZfZGF0YSkpOworCWlmICghZGV2KSB7CisJCXByaW50aygidHNpMTA4X2V0aDogQ291bGQgbm90IGFsbG9jYXRlIGEgZGV2aWNlIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaW50aygidHNpMTA4X2V0aCVkOiBwcm9iZS4uLlxuIiwgcGRldi0+aWQpOworCWRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJfZGVidWcoInRzaTEwOF9ldGglZDpyZWdzOnBoeXJlc2dzOnBoeTppcnFfbnVtPTB4JXg6MHgleDoweCV4OjB4JXhcbiIsCisJCQlwZGV2LT5pZCwgZWluZm8tPnJlZ3MsIGVpbmZvLT5waHlyZWdzLAorCQkJZWluZm8tPnBoeSwgZWluZm8tPmlycV9udW0pOworCisJZGF0YS0+cmVncyA9IGlvcmVtYXAoZWluZm8tPnJlZ3MsIDB4NDAwKTsKKwlpZiAoTlVMTCA9PSBkYXRhLT5yZWdzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gcmVnc19mYWlsOworCX0KKworCWRhdGEtPnBoeXJlZ3MgPSBpb3JlbWFwKGVpbmZvLT5waHlyZWdzLCAweDQwMCk7CisJaWYgKE5VTEwgPT0gZGF0YS0+cGh5cmVncykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHJlZ3NfZmFpbDsKKwl9CisvKiBNSUkgc2V0dXAgKi8KKwlkYXRhLT5taWlfaWYuZGV2ID0gZGV2OworCWRhdGEtPm1paV9pZi5tZGlvX3JlYWQgPSB0c2kxMDhfbWRpb19yZWFkOworCWRhdGEtPm1paV9pZi5tZGlvX3dyaXRlID0gdHNpMTA4X21kaW9fd3JpdGU7CisJZGF0YS0+bWlpX2lmLnBoeV9pZCA9IGVpbmZvLT5waHk7CisJZGF0YS0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlkYXRhLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKwlkYXRhLT5taWlfaWYuc3VwcG9ydHNfZ21paSA9IG1paV9jaGVja19nbWlpX3N1cHBvcnQoJmRhdGEtPm1paV9pZik7CisKKwlkYXRhLT5waHkgPSBlaW5mby0+cGh5OworCWRhdGEtPmlycV9udW0gPSBlaW5mby0+aXJxX251bTsKKwlkYXRhLT5pZCA9IHBkZXYtPmlkOworCWRldi0+b3BlbiA9IHRzaTEwOF9vcGVuOworCWRldi0+c3RvcCA9IHRzaTEwOF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRzaTEwOF9zZW5kX3BhY2tldDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHRzaTEwOF9zZXRfbWFjOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdHNpMTA4X3NldF9yeF9tb2RlOworCWRldi0+Z2V0X3N0YXRzID0gdHNpMTA4X2dldF9zdGF0czsKKwlkZXYtPnBvbGwgPSB0c2kxMDhfcG9sbDsKKwlkZXYtPmRvX2lvY3RsID0gdHNpMTA4X2RvX2lvY3RsOworCWRldi0+d2VpZ2h0ID0gNjQ7ICAvKiA2NCBpcyBtb3JlIHN1aXRhYmxlIGZvciBHaWdFIGludGVyZmFjZSAtIGtsYWkgKi8KKworCS8qIEFwcGFyZW50bHksIHRoZSBMaW51eCBuZXR3b3JraW5nIGNvZGUgd29uJ3QgdXNlIHNjYXR0ZXItZ2F0aGVyCisJICogaWYgdGhlIGhhcmR3YXJlIGRvZXNuJ3QgZG8gY2hlY2tzdW1zLiAgSG93ZXZlciwgaXQncyBmYXN0ZXIKKwkgKiB0byBjaGVja3N1bSBpbiBwbGFjZSBhbmQgdXNlIFNHLCBhcyAoYW1vbmcgb3RoZXIgcmVhc29ucykKKwkgKiB0aGUgY2FjaGUgd29uJ3QgYmUgZGlydGllZCAod2hpY2ggdGhlbiBoYXMgdG8gYmUgZmx1c2hlZAorCSAqIGJlZm9yZSBETUEpLiAgVGhlIGNoZWNrc3VtbWluZyBpcyBkb25lIGJ5IHRoZSBkcml2ZXIgKHZpYQorCSAqIGEgbmV3IGZ1bmN0aW9uIHNrYl9jc3VtX2RldigpIGluIG5ldC9jb3JlL3NrYnVmZi5jKS4KKwkgKi8KKworCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0hJR0hETUE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPnR4bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPm1pc2Nsb2NrKTsKKworCXRzaTEwOF9yZXNldF9ldGhlcihkYXRhKTsKKwl0c2kxMDhfa2lsbF9waHkoZGV2KTsKKworCWlmICgoZXJyID0gdHNpMTA4X2dldF9tYWMoZGV2KSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIE1BQyBhZGRyZXNzLiAgUGxlYXNlIGNvcnJlY3QuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byByZWdpc3Rlcl9mYWlsOworCX0KKworCXRzaTEwOF9pbml0X21hYyhkZXYpOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlnb3RvIHJlZ2lzdGVyX2ZhaWw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRzaTEwOCBHaWdhYml0IEV0aGVybmV0LCBNQUM6ICIKKwkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworI2lmZGVmIERFQlVHCisJZGF0YS0+bXNnX2VuYWJsZSA9IERFQlVHOworCWR1bXBfZXRoX29uZShkZXYpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJfZmFpbDoKKwlpb3VubWFwKGRhdGEtPnJlZ3MpOworCWlvdW5tYXAoZGF0YS0+cGh5cmVncyk7CisKK3JlZ3NfZmFpbDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoZXJlJ3Mgbm8gd2F5IHRvIGVpdGhlciBnZXQgaW50ZXJydXB0cyBmcm9tIHRoZSBQSFkgd2hlbgorICogc29tZXRoaW5nIGNoYW5nZXMsIG9yIHRvIGhhdmUgdGhlIFRzaTEwOCBhdXRvbWF0aWNhbGx5IGNvbW11bmljYXRlCisgKiB3aXRoIHRoZSBQSFkgdG8gcmVjb25maWd1cmUgaXRzZWxmLgorICoKKyAqIFRodXMsIHdlIGhhdmUgdG8gZG8gaXQgdXNpbmcgYSB0aW1lci4KKyAqLworCitzdGF0aWMgdm9pZCB0c2kxMDhfdGltZWRfY2hlY2tlcih1bnNpZ25lZCBsb25nIGRldl9wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9wdHI7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisKKwl0c2kxMDhfY2hlY2tfcGh5KGRldik7CisJdHNpMTA4X2NoZWNrX3J4cmluZyhkZXYpOworCW1vZF90aW1lcigmZGF0YS0+dGltZXIsIGppZmZpZXMgKyBDSEVDS19QSFlfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IHRzaTEwOF9ldGhlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgKCZ0c2lfZXRoX2RyaXZlcik7CisJaWYgKHJldCA8IDApeworCQlwcmludGsoInRzaTEwOF9ldGhlcl9pbml0OiBlcnJvciBpbml0aWFsaXppbmcgZXRoZXJuZXQgIgorCQkgICAgICAgImRldmljZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzaTEwOF9ldGhlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHRzaTEwOF9wcnZfZGF0YSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXRzaTEwOF9zdG9wX2V0aGVybmV0KGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW91bm1hcChwcml2LT5yZWdzKTsKKwlpb3VubWFwKHByaXYtPnBoeXJlZ3MpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIHRzaTEwOF9ldGhlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRzaV9ldGhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHNpMTA4X2V0aGVyX2luaXQpOworbW9kdWxlX2V4aXQodHNpMTA4X2V0aGVyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJUdW5kcmEgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUc2kxMDggR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguaCBiL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E3NjlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5oCkBAIC0wLDAgKzEsMzY1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA1IFR1bmRyYSBTZW1pY29uZHVjdG9yIENvcnAuCisgKiBLb25nIExhaSwgPGtvbmcubGFpQHR1bmRyYS5jb20pLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBuZXQvdHNpMTA4X2V0aC5oIC0gZGVmaW5pdGlvbnMgZm9yIFRzaTEwOCBHSUdFIG5ldHdvcmsgY29udHJvbGxlci4KKyAqLworCisjaWZuZGVmIF9fVFNJMTA4X0VUSF9ICisjZGVmaW5lIF9fVFNJMTA4X0VUSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFRTSV9XUklURShvZmZzZXQsIHZhbCkgXAorCW91dF9iZTMyKChkYXRhLT5yZWdzICsgKG9mZnNldCkpLCB2YWwpCisKKyNkZWZpbmUgVFNJX1JFQUQob2Zmc2V0KSBcCisJaW5fYmUzMigoZGF0YS0+cmVncyArIChvZmZzZXQpKSkKKworI2RlZmluZSBUU0lfV1JJVEVfUEhZKG9mZnNldCwgdmFsKSBcCisJb3V0X2JlMzIoKGRhdGEtPnBoeXJlZ3MgKyAob2Zmc2V0KSksIHZhbCkKKworI2RlZmluZSBUU0lfUkVBRF9QSFkob2Zmc2V0KSBcCisJaW5fYmUzMigoZGF0YS0+cGh5cmVncyArIChvZmZzZXQpKSkKKworLyoKKyAqIFBIWSBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqCisgKiBOT1RFOiBFbmFibGUgc2V0IG9mIGRlZmluaXRpb25zIGNvcnJlc3BvbmRpbmcgdG8geW91ciBib2FyZCB0eXBlCisgKi8KKyNkZWZpbmUgUEhZX01WODhFCTEJLyogTWFydmVsIDg4RXh4eHggUEhZICovCisjZGVmaW5lIFBIWV9CQ001NFhYCTIJLyogQnJvYXJkY29tIEJDTTU0eHggUEhZICovCisjZGVmaW5lIFRTSTEwOF9QSFlfVFlQRQlQSFlfTVY4OEUKKworLyoKKyAqIFRTSTEwOCBHSUdFIHBvcnQgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBUU0kxMDhfRVRIX1BPUlRfTlVNCQkyCisjZGVmaW5lIFRTSTEwOF9QQk1fUE9SVAkJCTIKKyNkZWZpbmUgVFNJMTA4X1NEUkFNX1BPUlQJCTQKKworI2RlZmluZSBUU0kxMDhfTUFDX0NGRzEJCQkoMHgwMDApCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMV9TT0ZUUlNUCQkoMSA8PCAzMSkKKyNkZWZpbmUgVFNJMTA4X01BQ19DRkcxX0xPT1BCQUNLCSgxIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMV9SWEVOCQkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfTUFDX0NGRzFfVFhFTgkJKDEgPDwgMCkKKworI2RlZmluZSBUU0kxMDhfTUFDX0NGRzIJCQkoMHgwMDQpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9ERkxUX1BSRUFNQkxFCSg3IDw8IDEyKQorI2RlZmluZSBUU0kxMDhfTUFDX0NGRzJfSUZBQ0VfTUFTSwkoMyA8PCA4KQorI2RlZmluZSBUU0kxMDhfTUFDX0NGRzJfTk9HSUcJCSgxIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9HSUcJCSgyIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9QQURDUkMJCSgxIDw8IDIpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9GVUxMRFVQTEVYCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfTUdNVF9DRkcJCSgweDAyMCkKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfTUdNVF9DTEsJCSg3IDw8IDApCisjZGVmaW5lIFRTSTEwOF9NQUNfTUlJX01HTVRfUlNUCQkoMSA8PCAzMSkKKworI2RlZmluZSBUU0kxMDhfTUFDX01JSV9DTUQJCSgweDAyNCkKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfQ01EX1JFQUQJCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfQUREUgkJKDB4MDI4KQorI2RlZmluZSBUU0kxMDhfTUFDX01JSV9BRERSX1JFRwkJMAorI2RlZmluZSBUU0kxMDhfTUFDX01JSV9BRERSX1BIWQkJOAorCisjZGVmaW5lIFRTSTEwOF9NQUNfTUlJX0RBVEFPVVQJCSgweDAyYykKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfREFUQUlOCQkoMHgwMzApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfSU5ECQkoMHgwMzQpCisjZGVmaW5lIFRTSTEwOF9NQUNfTUlJX0lORF9OT1RWQUxJRAkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfTUFDX01JSV9JTkRfU0NBTk5JTkcJKDEgPDwgMSkKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfSU5EX0JVU1kJCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19JRkNUUkwJCSgweDAzOCkKKyNkZWZpbmUgVFNJMTA4X01BQ19JRkNUUkxfUEhZTU9ERQkoMSA8PCAyNCkKKworI2RlZmluZSBUU0kxMDhfTUFDX0FERFIxCQkoMHgwNDApCisjZGVmaW5lIFRTSTEwOF9NQUNfQUREUjIJCSgweDA0NCkKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWEJZVEVTCQkoMHgwNmMpCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYQllURVNfQ0FSUlkJKDEgPDwgMjQpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhQS1RTCQkoMHgwNzApCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYUEtUU19DQVJSWQkoMSA8PCAxOCkKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWEZDUwkJKDB4MDc0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWEZDU19DQVJSWQkJKDEgPDwgMTIpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhNQ0FTVAkJKDB4MDc4KQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWE1DQVNUX0NBUlJZCSgxIDw8IDE4KQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYQUxJR04JCSgweDA4YykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhBTElHTl9DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWExFTkdUSAkJKDB4MDkwKQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWExFTkdUSF9DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWFJVTlQJCSgweDA5YykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhSVU5UX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYSlVNQk8JCSgweDBhMCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhKVU1CT19DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWEZSQUcJCSgweDBhNCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhGUkFHX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYSkFCQkVSCQkoMHgwYTgpCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYSkFCQkVSX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYRFJPUAkJKDB4MGFjKQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWERST1BfQ0FSUlkJKDEgPDwgMTIpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhCWVRFUwkJKDB4MGIwKQorI2RlZmluZSBUU0kxMDhfU1RBVF9UWEJZVEVTX0NBUlJZCSgxIDw8IDI0KQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYUEtUUwkJKDB4MGI0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9UWFBLVFNfQ0FSUlkJKDEgPDwgMTgpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhFWERFRgkJKDB4MGM4KQorI2RlZmluZSBUU0kxMDhfU1RBVF9UWEVYREVGX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYRVhDT0wJCSgweDBkOCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhFWENPTF9DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9UWFRDT0wJCSgweDBkYykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhUQ09MX0NBUlJZCSgxIDw8IDEzKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYUEFVU0VEUk9QCQkoMHgwZTQpCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYUEFVU0VEUk9QX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZMQkJKDB4MTAwKQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTFfUlhCWVRFUwkoMSA8PCAxNikKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYUEtUUwkoMSA8PCAxNSkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRkNTCSgxIDw8IDE0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTFfUlhNQ0FTVAkoMSA8PCAxMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYQUxJR04JKDEgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYTEVOR1RICSgxIDw8IDcpCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZMV9SWFJVTlQJKDEgPDwgNCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYSlVNQk8JKDEgPDwgMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRlJBRwkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTFfUlhKQUJCRVIJKDEgPDwgMSkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRFJPUAkoMSA8PCAwKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZMgkJKDB4MTA0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTJfVFhCWVRFUwkoMSA8PCAxMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYUEtUUwkoMSA8PCAxMikKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhERUYJKDEgPDwgNykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhDT0wJKDEgPDwgMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYVENPTAkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTJfVFhQQVVTRQkoMSA8PCAwKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZTUFTSzEJCSgweDEwOCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUllNQVNLMgkJKDB4MTBjKQorCisjZGVmaW5lIFRTSTEwOF9FQ19QT1JUQ1RSTAkJKDB4MjAwKQorI2RlZmluZSBUU0kxMDhfRUNfUE9SVENUUkxfU1RBVFJTVAkoMSA8PCAzMSkKKyNkZWZpbmUgVFNJMTA4X0VDX1BPUlRDVFJMX1NUQVRFTgkoMSA8PCAyOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1BPUlRDVFJMX05PR0lHCSgxIDw8IDE4KQorI2RlZmluZSBUU0kxMDhfRUNfUE9SVENUUkxfSEFMRkRVUExFWAkoMSA8PCAxNikKKworI2RlZmluZSBUU0kxMDhfRUNfSU5UU1RBVAkJKDB4MjA0KQorI2RlZmluZSBUU0kxMDhfRUNfSU5UTUFTSwkJKDB4MjA4KQorCisjZGVmaW5lIFRTSTEwOF9JTlRfQU5ZCQkJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTEwOF9JTlRfU0ZOCQkJKDEgPDwgMzApCisjZGVmaW5lIFRTSTEwOF9JTlRfUlhJRExFCQkoMSA8PCAyOSkKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWEFCT1JUCQkoMSA8PCAyOCkKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWEVSUk9SCQkoMSA8PCAyNykKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWE9WRVJSVU4JCSgxIDw8IDI2KQorI2RlZmluZSBUU0kxMDhfSU5UX1JYVEhSRVNICQkoMSA8PCAyNSkKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWFdBSVQJCSgxIDw8IDI0KQorI2RlZmluZSBUU0kxMDhfSU5UX1JYUVVFVUUwCQkoMSA8PCAxNikKKyNkZWZpbmUgVFNJMTA4X0lOVF9TVEFUQ0FSUlkJCSgxIDw8IDE1KQorI2RlZmluZSBUU0kxMDhfSU5UX1RYSURMRQkJKDEgPDwgMTMpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhBQk9SVAkJKDEgPDwgMTIpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhFUlJPUgkJKDEgPDwgMTEpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhVTkRFUlJVTgkJKDEgPDwgMTApCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhUSFJFU0gJCSgxIDw8ICA5KQorI2RlZmluZSBUU0kxMDhfSU5UX1RYV0FJVAkJKDEgPDwgIDgpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhRVUVVRTAJCSgxIDw8ICAwKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWENGRwkJCSgweDIyMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYQ0ZHX1JTVAkJKDEgPDwgMzEpCisKKyNkZWZpbmUgVFNJMTA4X0VDX1RYQ1RSTAkJKDB4MjI0KQorI2RlZmluZSBUU0kxMDhfRUNfVFhDVFJMX0lETEVJTlQJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTEwOF9FQ19UWENUUkxfQUJPUlQJCSgxIDw8IDMwKQorI2RlZmluZSBUU0kxMDhfRUNfVFhDVFJMX0dPCQkoMSA8PCAxNSkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYQ1RSTF9RVUVVRTAJCSgxIDw8ICAwKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWFNUQVQJCSgweDIyOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYU1RBVF9BQ1RJVkUJCSgxIDw8IDE1KQorI2RlZmluZSBUU0kxMDhfRUNfVFhTVEFUX1FVRVVFMAkJKDEgPDwgMCkKKworI2RlZmluZSBUU0kxMDhfRUNfVFhFU1RBVAkJKDB4MjJjKQorI2RlZmluZSBUU0kxMDhfRUNfVFhFU1RBVF9RMF9FUlIJKDEgPDwgMjQpCisjZGVmaW5lIFRTSTEwOF9FQ19UWEVTVEFUX1EwX0RFU0NJTlQJKDEgPDwgMTYpCisjZGVmaW5lIFRTSTEwOF9FQ19UWEVTVEFUX1EwX0VPRgkoMSA8PCAgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYRVNUQVRfUTBfRU9RCSgxIDw8ICAwKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWEVSUgkJCSgweDI3OCkKKworI2RlZmluZSBUU0kxMDhfRUNfVFhRX0NGRwkJKDB4MjgwKQorI2RlZmluZSBUU0kxMDhfRUNfVFhRX0NGR19ERVNDX0lOVAkoMSA8PCAyMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9DRkdfRU9RX09XTl9JTlQJKDEgPDwgMTkpCisjZGVmaW5lIFRTSTEwOF9FQ19UWFFfQ0ZHX1dTV1AJCSgxIDw8IDExKQorI2RlZmluZSBUU0kxMDhfRUNfVFhRX0NGR19CU1dQCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9DRkdfU0ZOUE9SVAkwCisKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkcJCSgweDI4NCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlVSU1Q4CSgwIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19UWFFfQlVGQ0ZHX0JVUlNUMzIJKDEgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlVSU1QxMjgJKDIgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlVSU1QyNTYJKDMgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfV1NXUAkoMSA8PCAxMSkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlNXUAkoMSA8PCAxMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfU0ZOUE9SVAkwCisKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9QVFJMT1cJCSgweDI4OCkKKworI2RlZmluZSBUU0kxMDhfRUNfVFhRX1BUUkhJR0gJCSgweDI4YykKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9QVFJISUdIX1ZBTElECSgxIDw8IDMxKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWFRIUkVTSAkJKDB4MjMwKQorI2RlZmluZSBUU0kxMDhfRUNfVFhUSFJFU0hfU1RBUlRGSUxMCTAKKyNkZWZpbmUgVFNJMTA4X0VDX1RYVEhSRVNIX1NUT1BGSUxMCTE2CisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHCQkJKDB4MzIwKQorI2RlZmluZSBUU0kxMDhfRUNfUlhDRkdfUlNUCQkoMSA8PCAzMSkKKworI2RlZmluZSBUU0kxMDhfRUNfUlhTVEFUCQkoMHgzMjgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFNUQVRfQUNUSVZFCQkoMSA8PCAxNSkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYU1RBVF9RVUVVRTAJCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYRVNUQVQJCSgweDMyYykKKyNkZWZpbmUgVFNJMTA4X0VDX1JYRVNUQVRfUTBfRVJSCSgxIDw8IDI0KQorI2RlZmluZSBUU0kxMDhfRUNfUlhFU1RBVF9RMF9ERVNDSU5UCSgxIDw8IDE2KQorI2RlZmluZSBUU0kxMDhfRUNfUlhFU1RBVF9RMF9FT0YJKDEgPDwgIDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWEVTVEFUX1EwX0VPUQkoMSA8PCAgMCkKKworI2RlZmluZSBUU0kxMDhfRUNfSEFTSEFERFIJCSgweDM2MCkKKyNkZWZpbmUgVFNJMTA4X0VDX0hBU0hBRERSX0FVVE9JTkMJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTEwOF9FQ19IQVNIQUREUl9ETzFTVFJFQUQJKDEgPDwgMzApCisjZGVmaW5lIFRTSTEwOF9FQ19IQVNIQUREUl9VTklDQVNUCSgwIDw8ICA0KQorI2RlZmluZSBUU0kxMDhfRUNfSEFTSEFERFJfTUNBU1QJKDEgPDwgIDQpCisKKyNkZWZpbmUgVFNJMTA4X0VDX0hBU0hEQVRBCQkoMHgzNjQpCisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9QVFJMT1cJCSgweDM4OCkKKworI2RlZmluZSBUU0kxMDhfRUNfUlhRX1BUUkhJR0gJCSgweDM4YykKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9QVFJISUdIX1ZBTElECSgxIDw8IDMxKQorCisvKiBTdGF0aW9uIEVuYWJsZSAtLSBhY2NlcHQgcGFja2V0cyBkZXN0aW5lZCBmb3IgdXMgKi8KKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHX1NFCQkoMSA8PCAxMykKKy8qIFVuaWNhc3QgRnJhbWUgRW5hYmxlIC0tIGZvciBwYWNrZXRzIG5vdCBkZXN0aW5lZCBmb3IgdXMgKi8KKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHX1VGRQkJKDEgPDwgMTIpCisvKiBNdWx0aWNhc3QgRnJhbWUgRW5hYmxlICovCisjZGVmaW5lIFRTSTEwOF9FQ19SWENGR19NRkUJCSgxIDw8IDExKQorLyogQnJvYWRjYXN0IEZyYW1lIEVuYWJsZSAqLworI2RlZmluZSBUU0kxMDhfRUNfUlhDRkdfQkZFCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHX1VDX0hBU0gJCSgxIDw8ICA5KQorI2RlZmluZSBUU0kxMDhfRUNfUlhDRkdfTUNfSEFTSAkJKDEgPDwgIDgpCisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9DRkcJCSgweDM4MCkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9DRkdfREVTQ19JTlQJKDEgPDwgMjApCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQ0ZHX0VPUV9PV05fSU5UCSgxIDw8IDE5KQorI2RlZmluZSBUU0kxMDhfRUNfUlhRX0NGR19XU1dQCQkoMSA8PCAxMSkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9DRkdfQlNXUAkJKDEgPDwgMTApCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQ0ZHX1NGTlBPUlQJMAorCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHCQkoMHgzODQpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JVUlNUOAkoMCA8PCA4KQorI2RlZmluZSBUU0kxMDhfRUNfUlhRX0JVRkNGR19CVVJTVDMyCSgxIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JVUlNUMTI4CSgyIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JVUlNUMjU2CSgzIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX1dTV1AJKDEgPDwgMTEpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JTV1AJKDEgPDwgMTApCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX1NGTlBPUlQJMAorCisjZGVmaW5lIFRTSTEwOF9FQ19SWENUUkwJCSgweDMyNCkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ1RSTF9BQk9SVAkJKDEgPDwgMzApCisjZGVmaW5lIFRTSTEwOF9FQ19SWENUUkxfR08JCSgxIDw8IDE1KQorI2RlZmluZSBUU0kxMDhfRUNfUlhDVFJMX1FVRVVFMAkJKDEgPDwgMCkKKworI2RlZmluZSBUU0kxMDhfRUNfUlhFUlIJCQkoMHgzNzgpCisKKyNkZWZpbmUgVFNJMTA4X1RYX0VPRgkoMSA8PCAwKQkvKiBFbmQgb2YgZnJhbWU7IGxhc3QgZnJhZ21lbnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFRTSTEwOF9UWF9TT0YJKDEgPDwgMSkJLyogU3RhcnQgb2YgZnJhbWU7IGZpcnN0IGZyYWcuIG9mIHBhY2tldCAqLworI2RlZmluZSBUU0kxMDhfVFhfVkxBTgkoMSA8PCAyKQkvKiBQZXItZnJhbWUgVkxBTjogZW5hYmxlcyBWTEFOIG92ZXJyaWRlICovCisjZGVmaW5lIFRTSTEwOF9UWF9IVUdFCSgxIDw8IDMpCS8qIEh1Z2UgZnJhbWUgZW5hYmxlICovCisjZGVmaW5lIFRTSTEwOF9UWF9QQUQJKDEgPDwgNCkJLyogUGFkIHRoZSBwYWNrZXQgaWYgdG9vIHNob3J0ICovCisjZGVmaW5lIFRTSTEwOF9UWF9DUkMJKDEgPDwgNSkJLyogR2VuZXJhdGUgQ1JDIGZvciB0aGlzIHBhY2tldCAqLworI2RlZmluZSBUU0kxMDhfVFhfSU5UCSgxIDw8IDE0KQkvKiBHZW5lcmF0ZSBhbiBJUlEgYWZ0ZXIgZnJhZy4gcHJvY2Vzc2VkICovCisjZGVmaW5lIFRTSTEwOF9UWF9SRVRSWQkoMHhmIDw8IDE2KQkvKiA0IGJpdCBmaWVsZCBpbmRpY2F0aW5nIG51bS4gb2YgcmV0cmllcyAqLworI2RlZmluZSBUU0kxMDhfVFhfQ09MCSgxIDw8IDIwKQkvKiBTZXQgaWYgYSBjb2xsaXNpb24gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfTENPTAkoMSA8PCAyNCkJLyogU2V0IGlmIGEgbGF0ZSBjb2xsaXNpb24gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfVU5ERVIJKDEgPDwgMjUpCS8qIFNldCBpZiBhIEZJRk8gdW5kZXJydW4gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfUkxJTQkoMSA8PCAyNikJLyogU2V0IGlmIHRoZSByZXRyeSBsaW1pdCB3YXMgcmVhY2hlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfT0sJKDEgPDwgMzApCS8qIFNldCBpZiB0aGUgZnJhbWUgVFggd2FzIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgVFNJMTA4X1RYX09XTgkoMSA8PCAzMSkJLyogU2V0IGlmIHRoZSBkZXZpY2Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworCisvKiBOb3RlOiB0aGUgZGVzY3JpcHRvciBsYXlvdXRzIGFzc3VtZSBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGJ1ZjA7CisJdTMyIGJ1ZjE7CQkvKiBCYXNlIGFkZHJlc3Mgb2YgYnVmZmVyICovCisJdTMyIG5leHQwOwkJLyogQWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IsIGlmIGFueSAqLworCXUzMiBuZXh0MTsKKwl1MTYgdmxhbjsJCS8qIFZMQU4sIGlmIG92ZXJyaWRlIGVuYWJsZWQgZm9yIHRoaXMgcGFja2V0ICovCisJdTE2IGxlbjsJCS8qIExlbmd0aCBvZiBidWZmZXIgaW4gYnl0ZXMgKi8KKwl1MzIgbWlzYzsJCS8qIFNlZSBUU0kxMDhfVFhfKiBhYm92ZSAqLworCXUzMiByZXNlcnZlZDA7CQkvKnJlc2VydmVkMCBhbmQgcmVzZXJ2ZWQxIGFyZSBhZGRlZCB0byBtYWtlIHRoZSBkZXNjICovCisJdTMyIHJlc2VydmVkMTsJCS8qIDMyLWJ5dGUgYWxpZ25lZCAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKSB0eF9kZXNjOworCisjZGVmaW5lIFRTSTEwOF9SWF9FT0YJKDEgPDwgMCkJLyogRW5kIG9mIGZyYW1lOyBsYXN0IGZyYWdtZW50IG9mIHBhY2tldCAqLworI2RlZmluZSBUU0kxMDhfUlhfU09GCSgxIDw8IDEpCS8qIFN0YXJ0IG9mIGZyYW1lOyBmaXJzdCBmcmFnLiBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgVFNJMTA4X1JYX1ZMQU4JKDEgPDwgMikJLyogU2V0IG9uIFNPRiBpZiBwYWNrZXQgaGFzIGEgVkxBTiAqLworI2RlZmluZSBUU0kxMDhfUlhfRlRZUEUJKDEgPDwgMykJLyogTGVuZ3RoL1R5cGUgZmllbGQgaXMgdHlwZSwgbm90IGxlbmd0aCAqLworI2RlZmluZSBUU0kxMDhfUlhfUlVOVAkoMSA8PCA0KS8qIFBhY2tldCBpcyBsZXNzIHRoYW4gbWluaW11bSBzaXplICovCisjZGVmaW5lIFRTSTEwOF9SWF9IQVNICSgxIDw8IDcpLyogSGFzaCB0YWJsZSBtYXRjaCAqLworI2RlZmluZSBUU0kxMDhfUlhfQkFECSgxIDw8IDgpCS8qIEJhZCBmcmFtZSAqLworI2RlZmluZSBUU0kxMDhfUlhfT1ZFUgkoMSA8PCA5KQkvKiBGSUZPIG92ZXJydW4gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfUlhfVFJVTkMJKDEgPDwgMTEpCS8qIFBhY2tldCB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2VzcyBsZW5ndGggKi8KKyNkZWZpbmUgVFNJMTA4X1JYX0NSQwkoMSA8PCAxMikJLyogUGFja2V0IGhhZCBhIENSQyBlcnJvciAqLworI2RlZmluZSBUU0kxMDhfUlhfSU5UCSgxIDw8IDEzKQkvKiBHZW5lcmF0ZSBhbiBJUlEgYWZ0ZXIgZnJhZy4gcHJvY2Vzc2VkICovCisjZGVmaW5lIFRTSTEwOF9SWF9PV04JKDEgPDwgMTUpCS8qIFNldCBpZiB0aGUgZGV2aWNlIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKworI2RlZmluZSBUU0kxMDhfUlhfU0tCX1NJWkUgMTUzNgkJLyogVGhlIFJYIHNrYiBsZW5ndGggKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBidWYwOwkJLyogQmFzZSBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXUzMiBidWYxOwkJLyogQmFzZSBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXUzMiBuZXh0MDsJCS8qIEFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yLCBpZiBhbnkgKi8KKwl1MzIgbmV4dDE7CQkvKiBBZGRyZXNzIG9mIG5leHQgZGVzY3JpcHRvciwgaWYgYW55ICovCisJdTE2IHZsYW47CQkvKiBWTEFOIG9mIHJlY2VpdmVkIHBhY2tldCwgZmlyc3QgZnJhZyBvbmx5ICovCisJdTE2IGxlbjsJCS8qIExlbmd0aCBvZiByZWNlaXZlZCBmcmFnbWVudCBpbiBieXRlcyAqLworCXUxNiBibGVuOwkJLyogTGVuZ3RoIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworCXUxNiBtaXNjOwkJLyogU2VlIFRTSTEwOF9SWF8qIGFib3ZlICovCisJdTMyIHJlc2VydmVkMDsJCS8qIHJlc2VydmVkMCBhbmQgcmVzZXJ2ZWQxIGFyZSBhZGRlZCB0byBtYWtlIHRoZSBkZXNjICovCisJdTMyIHJlc2VydmVkMTsJCS8qIDMyLWJ5dGUgYWxpZ25lZCAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKSByeF9kZXNjOworCisjZW5kaWYJCQkJLyogX19UU0kxMDhfRVRIX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwppbmRleCBmNmIzYTk0Li45ZDY3ZjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCkBAIC0xOTA2LDkgKzE5MDYsNyBAQAogCQkJZGUtPm1lZGlhW2ldLmNzcjE1ID0gdDIxMDQxX2NzcjE1W2ldOwogCX0KIAotCWRlLT5lZV9kYXRhID0ga21hbGxvYyhERV9FRVBST01fU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRlLT5lZV9kYXRhKQotCQltZW1jcHkoZGUtPmVlX2RhdGEsICZlZV9kYXRhWzBdLCBERV9FRVBST01fU0laRSk7CisJZGUtPmVlX2RhdGEgPSBrbWVtZHVwKCZlZV9kYXRhWzBdLCBERV9FRVBST01fU0laRSwgR0ZQX0tFUk5FTCk7CiAKIAlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCmluZGV4IDNmNGI2NDAuLjRiM2NkM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtNDczLDkgKzQ3Myw5IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorI2lmZGVmIENPTkZJR19QUENfUE1BQwogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKICNpbmNsdWRlICJkZTR4NS5oIgogCkBAIC00MTUxLDcgKzQxNTEsNyBAQAogICAgIC8qIElmIHBvc3NpYmxlLCB0cnkgdG8gZml4IGEgYnJva2VuIGNhcmQgLSBTTUMgb25seSBzbyBmYXIgKi8KICAgICBzcm9tX3JlcGFpcihkZXYsIGJyb2tlbik7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKICAgICAvKgogICAgICoqIElmIHRoZSBhZGRyZXNzIHN0YXJ0cyB3aXRoIDAwIGEwLCB3ZSBoYXZlIHRvIGJpdC1yZXZlcnNlCiAgICAgKiogZWFjaCBieXRlIG9mIHRoZSBhZGRyZXNzLgpAQCAtNDE2OCw3ICs0MTY4LDcgQEAKIAkJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSAoKHggJiAweDU1KSA8PCAxKSArICgoeCAmIDB4YWEpID4+IDEpOwogCSAgICB9CiAgICAgfQotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLworI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCiAgICAgLyogVGVzdCBmb3IgYSBiYWQgZW5ldCBhZGRyZXNzICovCiAgICAgc3RhdHVzID0gdGVzdF9iYWRfZW5ldChkZXYsIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKaW5kZXggNGRkOGEwYi4uN2Y1OWEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiBzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvIHsKIAl1MzIgY2hpcF9pZDsJCQkvKiBDaGlwIHZlbmRvci9EZXZpY2UgSUQgKi8KIAl1MzIgY2hpcF9yZXZpc2lvbjsJCS8qIENoaXAgcmV2aXNpb24gKi8KLQlzdHJ1Y3QgREVWSUNFICpuZXh0X2RldjsJLyogbmV4dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgREVWSUNFICpkZXY7CQkvKiBuZXQgZGV2aWNlICovCiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CQkvKiBQQ0kgZGV2aWNlICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCkBAIC0zOTksNiArMzk5LDggQEAKIAkvKiBJbml0IHN5c3RlbSAmIGRldmljZSAqLwogCWRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWRiLT5kZXYgPSBkZXY7CisKIAkvKiBBbGxvY2F0ZSBUeC9SeCBkZXNjcmlwdG9yIG1lbW9yeSAqLwogCWRiLT5kZXNjX3Bvb2xfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIERFU0NfQUxMX0NOVCArIDB4MjAsICZkYi0+ZGVzY19wb29sX2RtYV9wdHIpOwogCWRiLT5idWZfcG9vbF9wdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9CVUZfQUxMT0MgKiBUWF9ERVNDX0NOVCArIDQsICZkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CkBAIC00MjYsNiArNDI4LDcgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZwb2xsX2RtZmU7CiAjZW5kaWYKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwluZXRpZl9jYXJyaWVyX29mZihkYi0+ZGV2KTsKIAlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsICZwY2lfcG1yKTsKQEAgLTEwNTAsNiArMTA1Myw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9saW5rICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF9saW5rLAogfTsKIAogLyoKQEAgLTExNDQsNiArMTE0OCw3IEBACiAJCS8qIExpbmsgRmFpbGVkICovCiAJCURNRkVfREJVRygwLCAiTGluayBGYWlsZWQiLCB0bXBfY3IxMik7CiAJCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRiLT5kZXYpOwogCiAJCS8qIEZvciBGb3JjZSAxMC8xMDBNIEhhbGYvRnVsbCBtb2RlOiBFbmFibGUgQXV0by1OZWdvIG1vZGUgKi8KIAkJLyogQVVUTyBvciBmb3JjZSAxTSBIb21lcnVuL0xvbmdydW4gZG9uJ3QgbmVlZCAqLwpAQCAtMTE2Niw2ICsxMTcxLDggQEAKIAkJCWlmICggKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSAmJgogCQkJCWRtZmVfc2Vuc2Vfc3BlZWQoZGIpICkKIAkJCQlkYi0+bGlua19mYWlsZWQgPSAxOworCQkJZWxzZQorCQkJCW5ldGlmX2NhcnJpZXJfb24oZGItPmRldik7CiAJCQlkbWZlX3Byb2Nlc3NfbW9kZShkYik7CiAJCQkvKiBTSE9XX01FRElBX1RZUEUoZGItPm9wX21vZGUpOyAqLwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggM2JmOWU2My4uOTc4MWIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMTE3LDYgKzExNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KQEAgLTEyNyw3ICsxMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IGIzNzg4ODAuLjFmMDU1MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KIAotI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTQzMDEsMTIgKzQzMDEsMTIgQEAKIAkJbWVtY3B5KCYodWdldGhfaW5mb1tpXSksICZ1Z2V0aF9wcmltYXJ5X2luZm8sCiAJCSAgICAgICBzaXplb2YodWdldGhfcHJpbWFyeV9pbmZvKSk7CiAKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZ1Y2NfZ2V0aF9kcml2ZXIpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnVjY19nZXRoX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1Y2NfZ2V0aF9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnVjY19nZXRoX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnVjY19nZXRoX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHVjY19nZXRoX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwppbmRleCBiNWQwZDdmLi5kNWFiOWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwpAQCAtNTcsNDQgKzU3LDYgQEAKIAkgIFRoZSBkcml2ZXIgd2lsbCBiZSBjb21waWxlZCBhcyBhIG1vZHVsZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29zYS4KIAotY29uZmlnIERTQ0M0Ci0JdHJpc3RhdGUgIkV0aW5jIFBDSVNZTkMgc2VyaWFsIGJvYXJkIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBXQU4gJiYgUENJICYmIG0KLQloZWxwCi0JICBEcml2ZXIgZm9yIEV0aW5jIFBDSVNZTkMgYm9hcmRzIGJhc2VkIG9uIHRoZSBJbmZpbmVvbiAoZXguIFNpZW1lbnMpCi0JICBEU0NDNCBjaGlwc2V0LgotCi0JICBUaGlzIGlzIHN1cHBvc2VkIHRvIHdvcmsgd2l0aCB0aGUgZm91ciBwb3J0IGNhcmQuIFRha2UgYSBsb29rIGF0Ci0JICA8aHR0cDovL3d3dy5jb2dlbml0LmZyL2RzY2M0Lz4gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICBkcml2ZXIuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRzY2M0LgotCi1jb25maWcgRFNDQzRfUENJU1lOQwotCWJvb2wgIkV0aW5jIFBDSVNZTkMgZmVhdHVyZXMiCi0JZGVwZW5kcyBvbiBEU0NDNAotCWhlbHAKLQkgIER1ZSB0byBFdGluYydzIGRlc2lnbiBjaG9pY2UgZm9yIGl0cyBQQ0lTWU5DIGNhcmRzLCBzb21lIG9wZXJhdGlvbnMKLQkgIGFyZSBvbmx5IGFsbG93ZWQgb24gc3BlY2lmaWMgcG9ydHMgb2YgdGhlIERTQ0M0LiBUaGlzIG9wdGlvbiBpcyB0aGUKLQkgIG9ubHkgd2F5IGZvciB0aGUgZHJpdmVyIHRvIGtub3cgdGhhdCBpdCBzaG91bGRuJ3QgcmV0dXJuIGEgc3VjY2VzcwotCSAgY29kZSBmb3IgdGhlc2Ugb3BlcmF0aW9ucy4KLQotCSAgUGxlYXNlIHNheSBZIGlmIHlvdXIgY2FyZCBpcyBhbiBFdGluYydzIFBDSVNZTkMuCi0KLWNvbmZpZyBEU0NDNF9QQ0lfUlNUCi0JYm9vbCAiSGFyZCByZXNldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gRFNDQzQKLQloZWxwCi0JICBWYXJpb3VzIERTQ0M0IGJ1Z3MgZm9yYmlkIGFueSByZWxpYWJsZSBzb2Z0d2FyZSByZXNldCBvZiB0aGUgQVNJQy4KLQkgIEFzIGEgcmVwbGFjZW1lbnQsIHNvbWUgdmVuZG9ycyBwcm92aWRlIGEgd2F5IHRvIGFzc2VydCB0aGUgUENJICNSU1QKLQkgIHBpbiBvZiBEU0NDNCB0aHJvdWdoIHRoZSBHUElPIHBvcnQgb2YgdGhlIGNhcmQuIElmIHlvdSBjaG9vc2UgWSwKLQkgIHRoZSBkcml2ZXIgd2lsbCBtYWtlIHVzZSBvZiB0aGlzIGZlYXR1cmUgYmVmb3JlIG1vZHVsZSByZW1vdmFsCi0JICAoaS5lLiBybW1vZCkuIFRoZSBmZWF0dXJlIGlzIGtub3duIHRvIGJlIGF2YWlsYWJsZSBvbiBDb21tdGVjaCdzCi0JICBjYXJkcy4gQ29udGFjdCB5b3VyIG1hbnVmYWN0dXJlciBmb3IgZGV0YWlscy4KLQotCSAgU2F5IFkgaWYgeW91ciBjYXJkIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4KLQogIwogIyBMYW4gTWVkaWEncyBib2FyZC4gQ3VycmVudGx5IDEwMDAsIDEyMDAsIDUyMDAsIDUyNDUKICMKQEAgLTMyMyw2ICsyODUsNDQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGZhcnN5bmMuCiAKK2NvbmZpZyBEU0NDNAorCXRyaXN0YXRlICJFdGluYyBQQ0lTWU5DIHNlcmlhbCBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kgJiYgbQorCWhlbHAKKwkgIERyaXZlciBmb3IgRXRpbmMgUENJU1lOQyBib2FyZHMgYmFzZWQgb24gdGhlIEluZmluZW9uIChleC4gU2llbWVucykKKwkgIERTQ0M0IGNoaXBzZXQuCisKKwkgIFRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayB3aXRoIHRoZSBmb3VyIHBvcnQgY2FyZC4gVGFrZSBhIGxvb2sgYXQKKwkgIDxodHRwOi8vd3d3LmNvZ2VuaXQuZnIvZHNjYzQvPiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKwkgIGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHNjYzQuCisKK2NvbmZpZyBEU0NDNF9QQ0lTWU5DCisJYm9vbCAiRXRpbmMgUENJU1lOQyBmZWF0dXJlcyIKKwlkZXBlbmRzIG9uIERTQ0M0CisJaGVscAorCSAgRHVlIHRvIEV0aW5jJ3MgZGVzaWduIGNob2ljZSBmb3IgaXRzIFBDSVNZTkMgY2FyZHMsIHNvbWUgb3BlcmF0aW9ucworCSAgYXJlIG9ubHkgYWxsb3dlZCBvbiBzcGVjaWZpYyBwb3J0cyBvZiB0aGUgRFNDQzQuIFRoaXMgb3B0aW9uIGlzIHRoZQorCSAgb25seSB3YXkgZm9yIHRoZSBkcml2ZXIgdG8ga25vdyB0aGF0IGl0IHNob3VsZG4ndCByZXR1cm4gYSBzdWNjZXNzCisJICBjb2RlIGZvciB0aGVzZSBvcGVyYXRpb25zLgorCisJICBQbGVhc2Ugc2F5IFkgaWYgeW91ciBjYXJkIGlzIGFuIEV0aW5jJ3MgUENJU1lOQy4KKworY29uZmlnIERTQ0M0X1BDSV9SU1QKKwlib29sICJIYXJkIHJlc2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEU0NDNAorCWhlbHAKKwkgIFZhcmlvdXMgRFNDQzQgYnVncyBmb3JiaWQgYW55IHJlbGlhYmxlIHNvZnR3YXJlIHJlc2V0IG9mIHRoZSBBU0lDLgorCSAgQXMgYSByZXBsYWNlbWVudCwgc29tZSB2ZW5kb3JzIHByb3ZpZGUgYSB3YXkgdG8gYXNzZXJ0IHRoZSBQQ0kgI1JTVAorCSAgcGluIG9mIERTQ0M0IHRocm91Z2ggdGhlIEdQSU8gcG9ydCBvZiB0aGUgY2FyZC4gSWYgeW91IGNob29zZSBZLAorCSAgdGhlIGRyaXZlciB3aWxsIG1ha2UgdXNlIG9mIHRoaXMgZmVhdHVyZSBiZWZvcmUgbW9kdWxlIHJlbW92YWwKKwkgIChpLmUuIHJtbW9kKS4gVGhlIGZlYXR1cmUgaXMga25vd24gdG8gYmUgYXZhaWxhYmxlIG9uIENvbW10ZWNoJ3MKKwkgIGNhcmRzLiBDb250YWN0IHlvdXIgbWFudWZhY3R1cmVyIGZvciBkZXRhaWxzLgorCisJICBTYXkgWSBpZiB5b3VyIGNhcmQgc3VwcG9ydHMgdGhpcyBmZWF0dXJlLgorCiBjb25maWcgRExDSQogCXRyaXN0YXRlICJGcmFtZSBSZWxheSBETENJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBXQU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwppbmRleCBhYzk0MzdkLi5mMTIzNTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCkBAIC0yMTksMjEgKzIxOSw2IEBACiAJZGV2ID0gbGluay0+cHJpdjsKIAogCURFQlVHKDAsICJhaXJvX2NvbmZpZygweCVwKVxuIiwgbGluayk7Ci0JCi0JLyoKLQkgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgotCSAgcmVnaXN0ZXJzLgotCSovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwogCiAJLyoKIAkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCkBAIC0yNDcsNiArMjMyLDEwIEBACiAJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCiAJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCiAJKi8KKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAJd2hpbGUgKDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCmluZGV4IDBjMDdiOGIuLjEwYmNiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtNTk1LDcgKzU5NSw3IEBACiBzdGF0aWMgdm9pZCBhdG1lbF9zbW9vdGhfcXVhbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CiBzdGF0aWMgdm9pZCBhdG1lbF93cml0ZUFSKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkYXRhKTsKIHN0YXRpYyBpbnQgcHJvYmVfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgcmVzZXRfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IHJlc2V0X2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBhdG1lbF9lbnRlcl9zdGF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IG5ld19zdGF0ZSk7CiBpbnQgYXRtZWxfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKQEAgLTc4NCwxMSArNzg0LDExIEBACiAKIHN0YXRpYyBpbnQgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdGF0aWMgY29uc3QgdTggU05BUF9SRkMxMDI0WzZdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CiAJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyIGhlYWRlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBidWZmLCBmcmFtZV9jdGwsIGxlbiA9IChFVEhfWkxFTiA8IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogRVRIX1pMRU47Ci0JdTggU05BUF9SRkMxMDI0WzZdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwogCiAJaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJgogCSAgICAhKCpwcml2LT5wcmVzZW50X2NhbGxiYWNrKShwcml2LT5jYXJkKSkgewpAQCAtMTE5Myw3ICsxMTkzLDcgQEAKIAogCQlhdG1lbF9zZXRfZ2NyKGRldiwgR0NSX0FDS0lOVCk7IC8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLwogCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXJxX29yZGVyKS9zaXplb2YodTgpOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlycV9vcmRlcik7IGkrKykKIAkJCWlmIChpc3IgJiBpcnFfb3JkZXJbaV0pCiAJCQkJYnJlYWs7CiAKQEAgLTEzNDUsMTAgKzEzNDUsMTAgQEAKIAkJYXRtZWxfc2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JFR19ET01BSU5fUE9TLCBwcml2LT5yZWdfZG9tYWluKTsKIAl9IGVsc2UgewogCQlwcml2LT5yZWdfZG9tYWluID0gYXRtZWxfZ2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JFR19ET01BSU5fUE9TKTsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF90YWJsZSk7IGkrKykKIAkJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikKIAkJCQlicmVhazsKLQkJaWYgKGkgPT0gc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKSkgeworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGNoYW5uZWxfdGFibGUpKSB7CiAJCQlwcml2LT5yZWdfZG9tYWluID0gUkVHX0RPTUFJTl9NS0sxOwogCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvcnkgZG9tYWluOiBhc3N1bWluZyBNS0sxLlxuIiwgZGV2LT5uYW1lKTsKIAkJfQpAQCAtMTM5Myw3ICsxMzkzLDcgQEAKIAkgICBlbHNlIHJldHVybiBzdWl0YWJsZSBkZWZhdWx0IGNoYW5uZWwgKi8KIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF90YWJsZSk7IGkrKykKIAkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKSB7CiAJCQlpZiAoY2hhbm5lbCA+PSBjaGFubmVsX3RhYmxlW2ldLm1pbiAmJgogCQkJICAgIGNoYW5uZWwgPD0gY2hhbm5lbF90YWJsZVtpXS5tYXgpCkBAIC0xNDM3LDcgKzE0MzcsNyBAQAogCQl9CiAKIAkJciA9ICI8dW5rbm93bj4iOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFubmVsX3RhYmxlKTsgaSsrKQogCQkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKQogCQkJCXIgPSBjaGFubmVsX3RhYmxlW2ldLm5hbWU7CiAKQEAgLTE3MzYsNyArMTczNiw3IEBACiAJCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCiAJCQkJcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID0gMDsKIAkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJaWYgKCEoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CiAJCQkvKiBDbGVhbnVwICovCiAJCQltZW1zZXQocHJpdi0+d2VwX2tleXNbaW5kZXhdLCAwLCAxMyk7CiAJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLwpAQCAtMTkwNyw3ICsxOTA3LDcgQEAKIAogCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CiAJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKLQkKKwogCWlmICghcHJpdi0+d2VwX2lzX29uKSB7CiAJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOwogCQlleHQtPmtleV9sZW4gPSAwOwpAQCAtMjM0Myw2ICsyMzQzLDE0IEBACiAJCWl3ZS51LmZyZXEuZSA9IDA7CiAJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKIAorCQkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwkJaXdlLnUucXVhbC5sZXZlbCA9IHByaXYtPkJTU2luZm9baV0uUlNTSTsKKwkJaXdlLnUucXVhbC5xdWFsICA9IGl3ZS51LnF1YWwubGV2ZWw7CisJCS8qIGl3ZS51LnF1YWwubm9pc2UgID0gU09NRVRISU5HICovCisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEgLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKwogCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKIAkJaWYgKHByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApCiAJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CkBAIC0yMzczLDcgKzIzODEsNyBAQAogCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKIAlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7CiAJcmFuZ2UtPm51bV9jaGFubmVscyA9IDA7Ci0JZm9yIChqID0gMDsgaiA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGorKykKKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShjaGFubmVsX3RhYmxlKTsgaisrKQogCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2pdLnJlZ19kb21haW4pIHsKIAkJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBjaGFubmVsX3RhYmxlW2pdLm1heCAtIGNoYW5uZWxfdGFibGVbal0ubWluICsgMTsKIAkJCWJyZWFrOwpAQCAtMjU3OSw5ICsyNTg3LDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBhdG1lbF9oYW5kbGVyX2RlZiA9CiB7Ci0JLm51bV9zdGFuZGFyZAk9IHNpemVvZihhdG1lbF9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCi0JLm51bV9wcml2YXRlCT0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAotCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5udW1fc3RhbmRhcmQJPSBBUlJBWV9TSVpFKGF0bWVsX2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IEFSUkFZX1NJWkUoYXRtZWxfcHJpdmF0ZV9oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IEFSUkFZX1NJWkUoYXRtZWxfcHJpdmF0ZV9hcmdzKSwKIAkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9oYW5kbGVyLAogCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgYXRtZWxfcHJpdmF0ZV9oYW5kbGVyLAogCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBhdG1lbF9wcml2YXRlX2FyZ3MsCkBAIC0yNjQ1LDcgKzI2NTMsNyBAQAogCiAJCWRvbWFpbltSRUdET01BSU5TWl0gPSAwOwogCQlyYyA9IC1FSU5WQUw7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF90YWJsZSk7IGkrKykgewogCQkJLyogc3RyY2FzZWNtcCBkb2Vzbid0IGV4aXN0IGluIHRoZSBsaWJyYXJ5ICovCiAJCQljaGFyICphID0gY2hhbm5lbF90YWJsZVtpXS5uYW1lOwogCQkJY2hhciAqYiA9IGRvbWFpbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCmluZGV4IDc4NTY2NDAuLjEyNjE3Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtNSwxMiArNSwxMiBAQAogICAgICAgICBDb3B5cmlnaHQgMjAwMC0yMDAxIEFUTUVMIENvcnBvcmF0aW9uLgogICAgICAgICBDb3B5cmlnaHQgMjAwMyBTaW1vbiBLZWxsZXkuCiAKLSAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBmcm9tIHZlcnNpb24gMi4xLjEgb2YgdGhlIEF0bWVsIGRyaXZlcnMsIAotICAgIHJlbGVhc2VkIGJ5IEF0bWVsIGNvcnAuIHVuZGVyIHRoZSBHUEwgaW4gRGVjZW1iZXIgMjAwMi4gSXQgYWxzbyAKLSAgICBpbmNsdWRlcyBjb2RlIGZyb20gdGhlIExpbnV4IGFpcm9uZXQgZHJpdmVycyAoQykgQmVuamFtaW4gUmVlZCwgCi0gICAgYW5kIHRoZSBMaW51eCBQQ01DSUEgcGFja2FnZSwgKEMpIERhdmlkIEhpbmRzLiAKKyAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBmcm9tIHZlcnNpb24gMi4xLjEgb2YgdGhlIEF0bWVsIGRyaXZlcnMsCisgICAgcmVsZWFzZWQgYnkgQXRtZWwgY29ycC4gdW5kZXIgdGhlIEdQTCBpbiBEZWNlbWJlciAyMDAyLiBJdCBhbHNvCisgICAgaW5jbHVkZXMgY29kZSBmcm9tIHRoZSBMaW51eCBhaXJvbmV0IGRyaXZlcnMgKEMpIEJlbmphbWluIFJlZWQsCisgICAgYW5kIHRoZSBMaW51eCBQQ01DSUEgcGFja2FnZSwgKEMpIERhdmlkIEhpbmRzLgogCi0gICAgRm9yIGFsbCBxdWVyaWVzIGFib3V0IHRoaXMgY29kZSwgcGxlYXNlIGNvbnRhY3QgdGhlIGN1cnJlbnQgYXV0aG9yLCAKKyAgICBGb3IgYWxsIHF1ZXJpZXMgYWJvdXQgdGhpcyBjb2RlLCBwbGVhc2UgY29udGFjdCB0aGUgY3VycmVudCBhdXRob3IsCiAgICAgU2ltb24gS2VsbGV5IDxzaW1vbkB0aGVrZWxsZXlzLm9yZy51az4gYW5kIG5vdCBBdG1lbCBDb3Jwb3JhdGlvbi4KIAogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC04Nyw3ICs4Nyw3IEBACiAgICBldmVudCBpcyByZWNlaXZlZC4gIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUKICAgIHVzZWQgdG8gY29uZmlndXJlIG9yIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQKICAgIGluc2VydGlvbiBhbmQgZWplY3Rpb24gZXZlbnRzLiAgVGhleSBhcmUgaW52b2tlZCBmcm9tIHRoZSBhdG1lbF9jcwotICAgZXZlbnQgaGFuZGxlci4gCisgICBldmVudCBoYW5kbGVyLgogKi8KIAogc3RhdGljIGludCBhdG1lbF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspOwpAQCAtMTMzLDIyICsxMzMsMjIgQEAKICAgIGRldmljZSBJTyByb3V0aW5lcyBjYW4gdXNlIGEgZmxhZyBsaWtlIHRoaXMgdG8gdGhyb3R0bGUgSU8gdG8gYQogICAgY2FyZCB0aGF0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgaXQuCiAqLwotICAgCisKIHR5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CiAJZGV2X25vZGVfdAlub2RlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OwogfSBsb2NhbF9pbmZvX3Q7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKKwogICBhdG1lbF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZwogICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKICAgd2l0aCBDYXJkIFNlcnZpY2VzLgotICAKKwogICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKICAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCi0gIAorCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdGF0aWMgaW50IGF0bWVsX3Byb2JlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKQEAgLTE4NCwxMiArMTg0LDEyIEBACiB9IC8qIGF0bWVsX2F0dGFjaCAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgCisKICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCiAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCiAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KLSAgCisKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIGF0bWVsX2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTIwMiwxMSArMjAyLDExIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKKwogICBhdG1lbF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCiAgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KLSAgCisKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKICNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXApAQCAtMjM3LDI4ICsyMzcsMTcgQEAKIAlkaWQgPSBoYW5kbGVfdG9fZGV2KGxpbmspLmRyaXZlcl9kYXRhOwogCiAJREVCVUcoMCwgImF0bWVsX2NvbmZpZygweCVwKVxuIiwgbGluayk7Ci0JCisKIAl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKIAl0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCQotCS8qCi0JICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLQkgIHJlZ2lzdGVycy4KLQkqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CiAKIAkvKgogCSAgSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cmllcywKIAkgIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKIAkgIHZvbHRhZ2UsIElPIHdpbmRvdywgbWVtb3J5IHdpbmRvdywgYW5kIGludGVycnVwdCBzZXR0aW5ncy4KLQkgIAorCiAJICBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlIHVzZQogCSAganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbCB3b3JsZCwKIAkgIHRoaXMgd291bGQgd29yayBmb3IgYW55IFBDTUNJQSBjYXJkLCBidXQgaXQgcmVxdWlyZXMgYSBjb21wbGV0ZQpAQCAtMjc0LDE3ICsyNjMsMTcgQEAKIAkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpICE9IDAgfHwKIAkJCQlwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApCiAJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQorCiAJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CiAJCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKIAkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0JCQorCiAJCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLwogCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7CiAJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKIAkJCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CiAJCX0KLQkJCisKIAkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCiAJCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwogCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQpAQCAtMjkzLDExICsyODIsMTEgQEAKIAkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQogCQkJbGluay0+Y29uZi5WcHAgPQogCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JCQorCiAJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwogCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCiAJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCQkKKwogCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KIAkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKIAkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKQEAgLTMxNSwxOCArMzA0LDE4IEBACiAJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CiAJCQl9CiAJCX0KLQkJCisKIAkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KIAkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykgIT0gMCkKIAkJCWdvdG8gbmV4dF9lbnRyeTsKIAogCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCiAJCWJyZWFrOwotCQkKKwogCW5leHRfZW50cnk6CiAJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwogCX0KLQkKKwogCS8qCiAJICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCiAJICBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUKQEAgLTMzNCwzMSArMzIzLDMxIEBACiAJKi8KIAlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQogCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOwotCQorCiAJLyoKIAkgIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCiAJICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlCiAJICBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgogCSovCiAJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKLQkKKwogCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEgPT0gMCkgewotCQlwcmludGsoS0VSTl9BTEVSVCAKKwkJcHJpbnRrKEtFUk5fQUxFUlQKIAkJICAgICAgICJhdG1lbDogY2Fubm90IGFzc2lnbiBJUlE6IGNoZWNrIHRoYXQgQ09ORklHX0lTQSBpcyBzZXQgaW4ga2VybmVsIGNvbmZpZy4iKTsKIAkJZ290byBjc19mYWlsZWQ7CiAJfQotICAgICAgIAotCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IAorCisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0KIAkJaW5pdF9hdG1lbF9jYXJkKGxpbmstPmlycS5Bc3NpZ25lZElSUSwKIAkJCQlsaW5rLT5pby5CYXNlUG9ydDEsCiAJCQkJZGlkID8gZGlkLT5kcml2ZXJfaW5mbyA6IEFUTUVMX0ZXX1RZUEVfTk9ORSwKIAkJCQkmaGFuZGxlX3RvX2RldihsaW5rKSwKLQkJCQljYXJkX3ByZXNlbnQsIAorCQkJCWNhcmRfcHJlc2VudCwKIAkJCQlsaW5rKTsKLQlpZiAoISgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldikgCisJaWYgKCEoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYpCiAJCQlnb3RvIGNzX2ZhaWxlZDsKLQkKLQkKKworCiAJLyoKIAkgIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkIHRvIGJlCiAJICBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXZfbm9kZS4KQEAgLTM3NiwxMSArMzY1LDExIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKKwogICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYXRtZWxfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCiAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgotICAKKwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc3RhdGljIHZvaWQgYXRtZWxfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTUxNyw3ICs1MDYsNyBAQAogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKICAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKICAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwogCiBtb2R1bGVfaW5pdChhdG1lbF9jc19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKaW5kZXggM2JmYTc5MS4uOTJmODdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKQEAgLTUzLDE4ICs1MywxOCBAQAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBlbnQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQkJCisKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCiAJCXJldHVybiAtRU5PREVWOwotCQorCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JCi0JZGV2ID0gaW5pdF9hdG1lbF9jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQsIAorCisJZGV2ID0gaW5pdF9hdG1lbF9jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQsCiAJCQkgICAgICBBVE1FTF9GV19UWVBFXzUwNiwKIAkJCSAgICAgICZwZGV2LT5kZXYsIE5VTEwsIE5VTEwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLQkKKwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAppbmRleCBkNmE4YmYwLi45NGRmYjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaApAQCAtMTU5LDYgKzE1OSw3IEBACiAKIC8qIENoaXBjb21tb24gcmVnaXN0ZXJzLiAqLwogI2RlZmluZSBCQ000M3h4X0NISVBDT01NT05fQ0FQQUJJTElUSUVTIAkweDA0CisjZGVmaW5lIEJDTTQzeHhfQ0hJUENPTU1PTl9DVEwJCQkweDI4CiAjZGVmaW5lIEJDTTQzeHhfQ0hJUENPTU1PTl9QTExPTkRFTEFZCQkweEIwCiAjZGVmaW5lIEJDTTQzeHhfQ0hJUENPTU1PTl9GUkVGU0VMREVMQVkJCTB4QjQKICNkZWZpbmUgQkNNNDN4eF9DSElQQ09NTU9OX1NMT1dDTEtDVEwJCTB4QjgKQEAgLTE3Miw2ICsxNzMsMzMgQEAKIC8qIFNCVE9QQ0kyIHZhbHVlcy4gKi8KICNkZWZpbmUgQkNNNDN4eF9TQlRPUENJMl9QUkVGRVRDSAkweDQKICNkZWZpbmUgQkNNNDN4eF9TQlRPUENJMl9CVVJTVAkJMHg4CisjZGVmaW5lIEJDTTQzeHhfU0JUT1BDSTJfTUVNUkVBRF9NVUxUSQkweDIwCisKKy8qIFBDSS1FIGNvcmUgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBCQ000M3h4X1BDSUVDT1JFX1JFR19BRERSICAgICAgMHgwMTMwCisjZGVmaW5lIEJDTTQzeHhfUENJRUNPUkVfUkVHX0RBVEEgICAgICAweDAxMzQKKyNkZWZpbmUgQkNNNDN4eF9QQ0lFQ09SRV9NRElPX0NUTCAgICAgIDB4MDEyOAorI2RlZmluZSBCQ000M3h4X1BDSUVDT1JFX01ESU9fREFUQSAgICAgMHgwMTJDCisKKy8qIFBDSS1FIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgQkNNNDN4eF9QQ0lFX1RMUF9XT1JLQVJPVU5EICAgIDB4MDAwNAorI2RlZmluZSBCQ000M3h4X1BDSUVfRExMUF9MSU5LQ1RMICAgICAgMHgwMTAwCisKKy8qIFBDSS1FIE1ESU8gYml0cy4gKi8KKyNkZWZpbmUgQkNNNDN4eF9QQ0lFX01ESU9fU1QgICAweDQwMDAwMDAwCisjZGVmaW5lIEJDTTQzeHhfUENJRV9NRElPX1dUICAgMHgxMDAwMDAwMAorI2RlZmluZSBCQ000M3h4X1BDSUVfTURJT19ERVYgIDIyCisjZGVmaW5lIEJDTTQzeHhfUENJRV9NRElPX1JFRyAgMTgKKyNkZWZpbmUgQkNNNDN4eF9QQ0lFX01ESU9fVEEgICAweDAwMDIwMDAwCisjZGVmaW5lIEJDTTQzeHhfUENJRV9NRElPX1RDICAgMHgwMTAwCisKKy8qIE1ESU8gZGV2aWNlcy4gKi8KKyNkZWZpbmUgQkNNNDN4eF9NRElPX1NFUkRFU19SWAkweDFGCisKKy8qIFNFUkRFUyBSWCByZWdpc3RlcnMuICovCisjZGVmaW5lIEJDTTQzeHhfU0VSREVTX1JYVElNRVIJMHgyCisjZGVmaW5lIEJDTTQzeHhfU0VSREVTX0NEUgkweDYKKyNkZWZpbmUgQkNNNDN4eF9TRVJERVNfQ0RSX0JXCTB4NwogCiAvKiBDaGlwY29tbW9uIGNhcGFiaWxpdGllcy4gKi8KICNkZWZpbmUgQkNNNDN4eF9DQVBBQklMSVRJRVNfUENUTAkJMHgwMDA0MDAwMApAQCAtMjIxLDYgKzI0OSw3IEBACiAjZGVmaW5lIEJDTTQzeHhfQ09SRUlEX1VTQjIwX0hPU1QgICAgICAgMHg4MTkKICNkZWZpbmUgQkNNNDN4eF9DT1JFSURfVVNCMjBfREVWICAgICAgICAweDgxYQogI2RlZmluZSBCQ000M3h4X0NPUkVJRF9TRElPX0hPU1QgICAgICAgIDB4ODFiCisjZGVmaW5lIEJDTTQzeHhfQ09SRUlEX1BDSUUJCTB4ODIwCiAKIC8qIENvcmUgSW5mb3JtYXRpb24gUmVnaXN0ZXJzICovCiAjZGVmaW5lIEJDTTQzeHhfQ0lSX0JBU0UJCTB4ZjAwCkBAIC0zNjUsNiArMzk0LDkgQEAKICNkZWZpbmUgQkNNNDN4eF9ERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUCTcKICNkZWZpbmUgQkNNNDN4eF9ERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJNAogCisvKiBGSVhNRTogdGhlIG5leHQgbGluZSBpcyBhIGd1ZXNzIGFzIHRvIHdoYXQgdGhlIG1heGltdW0gUlNTSSB2YWx1ZSBtaWdodCBiZSAqLworI2RlZmluZSBSWF9SU1NJX01BWAkJCQk2MAorCiAvKiBNYXggc2l6ZSBvZiBhIHNlY3VyaXR5IGtleSAqLwogI2RlZmluZSBCQ000M3h4X1NFQ19LRVlTSVpFCQkJMTYKIC8qIFNlY3VyaXR5IGFsZ29yaXRobXMuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYwppbmRleCBhMWI3ODM4Li41YjNjMjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKQEAgLTEzMCw2ICsxMzAsMTAgQEAKIAl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDMwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAogCS8qIEJyb2FkY29tIDQzMDcgODAyLjExYiAqLwogCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzA3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJLyogQnJvYWRjb20gNDMxMSA4MDIuMTEoYSkvYi9nICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwkvKiBCcm9hZGNvbSA0MzEyIDgwMi4xMWEvYi9nICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzMTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKIAkvKiBCcm9hZGNvbSA0MzE4IDgwMi4xMWIvZyAqLwogCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCiAJLyogQnJvYWRjb20gNDMxOSA4MDIuMTFhL2IvZyAqLwpAQCAtMjYwMCw4ICsyNjA0LDkgQEAKIAkvKiBmZXRjaCBzYl9pZF9oaSBmcm9tIGNvcmUgaW5mb3JtYXRpb24gcmVnaXN0ZXJzICovCiAJc2JfaWRfaGkgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCX0lEX0hJKTsKIAotCWNvcmVfaWQgPSAoc2JfaWRfaGkgJiAweEZGRjApID4+IDQ7Ci0JY29yZV9yZXYgPSAoc2JfaWRfaGkgJiAweEYpOworCWNvcmVfaWQgPSAoc2JfaWRfaGkgJiAweDhGRjApID4+IDQ7CisJY29yZV9yZXYgPSAoc2JfaWRfaGkgJiAweDcwMDApID4+IDg7CisJY29yZV9yZXYgfD0gKHNiX2lkX2hpICYgMHhGKTsKIAljb3JlX3ZlbmRvciA9IChzYl9pZF9oaSAmIDB4RkZGRjAwMDApID4+IDE2OwogCiAJLyogaWYgcHJlc2VudCwgY2hpcGNvbW1vbiBpcyBhbHdheXMgY29yZSAwOyByZWFkIHRoZSBjaGlwaWQgZnJvbSBpdCAqLwpAQCAtMjY3OSwxNCArMjY4NCwxMCBAQAogCQliY20tPmNoaXBfaWQsIGJjbS0+Y2hpcF9yZXYpOwogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiTnVtYmVyIG9mIGNvcmVzOiAlZFxuIiwgY29yZV9jb3VudCk7CiAJaWYgKGJjbS0+Y29yZV9jaGlwY29tbW9uLmF2YWlsYWJsZSkgewotCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNvcmUgMDogSUQgMHgleCwgcmV2IDB4JXgsIHZlbmRvciAweCV4LCAlc1xuIiwKLQkJCWNvcmVfaWQsIGNvcmVfcmV2LCBjb3JlX3ZlbmRvciwKLQkJCWJjbTQzeHhfY29yZV9lbmFibGVkKGJjbSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQl9Ci0KLQlpZiAoYmNtLT5jb3JlX2NoaXBjb21tb24uYXZhaWxhYmxlKQorCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNvcmUgMDogSUQgMHgleCwgcmV2IDB4JXgsIHZlbmRvciAweCV4XG4iLAorCQkJY29yZV9pZCwgY29yZV9yZXYsIGNvcmVfdmVuZG9yKTsKIAkJY3VycmVudF9jb3JlID0gMTsKLQllbHNlCisJfSBlbHNlCiAJCWN1cnJlbnRfY29yZSA9IDA7CiAJZm9yICggOyBjdXJyZW50X2NvcmUgPCBjb3JlX2NvdW50OyBjdXJyZW50X2NvcmUrKykgewogCQlzdHJ1Y3QgYmNtNDN4eF9jb3JlaW5mbyAqY29yZTsKQEAgLTI3MDQsMTMgKzI3MDUsMTMgQEAKIAkJY29yZV9yZXYgPSAoc2JfaWRfaGkgJiAweEYpOwogCQljb3JlX3ZlbmRvciA9IChzYl9pZF9oaSAmIDB4RkZGRjAwMDApID4+IDE2OwogCi0JCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQ29yZSAlZDogSUQgMHgleCwgcmV2IDB4JXgsIHZlbmRvciAweCV4LCAlc1xuIiwKLQkJCWN1cnJlbnRfY29yZSwgY29yZV9pZCwgY29yZV9yZXYsIGNvcmVfdmVuZG9yLAotCQkJYmNtNDN4eF9jb3JlX2VuYWJsZWQoYmNtKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIgKTsKKwkJZHByaW50ayhLRVJOX0lORk8gUEZYICJDb3JlICVkOiBJRCAweCV4LCByZXYgMHgleCwgdmVuZG9yIDB4JXhcbiIsCisJCQljdXJyZW50X2NvcmUsIGNvcmVfaWQsIGNvcmVfcmV2LCBjb3JlX3ZlbmRvcik7CiAKIAkJY29yZSA9IE5VTEw7CiAJCXN3aXRjaCAoY29yZV9pZCkgewogCQljYXNlIEJDTTQzeHhfQ09SRUlEX1BDSToKKwkJY2FzZSBCQ000M3h4X0NPUkVJRF9QQ0lFOgogCQkJY29yZSA9ICZiY20tPmNvcmVfcGNpOwogCQkJaWYgKGNvcmUtPmF2YWlsYWJsZSkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJNdWx0aXBsZSBQQ0kgY29yZXMgZm91bmQuXG4iKTsKQEAgLTI3NDksMTIgKzI3NTAsMTIgQEAKIAkJCWNhc2UgNjoKIAkJCWNhc2UgNzoKIAkJCWNhc2UgOToKKwkJCWNhc2UgMTA6CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIkVycm9yOiBVbnN1cHBvcnRlZCA4MDIxMSBjb3JlIHJldmlzaW9uICV1XG4iLAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkJICAgICAgICJVbnN1cHBvcnRlZCA4MDIxMSBjb3JlIHJldmlzaW9uICV1XG4iLAogCQkJCSAgICAgICBjb3JlX3Jldik7Ci0JCQkJZXJyID0gLUVOT0RFVjsKLQkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWJjbS0+bnJfODAyMTFfYXZhaWxhYmxlKys7CiAJCQljb3JlLT5wcml2ID0gZXh0XzgwMjExOwpAQCAtMjg2OCwxNiArMjg2OSwxMSBAQAogCXUzMiBzYmltY29uZmlnbG93OwogCXU4IGxpbWl0OwogCi0JaWYgKGJjbS0+Y2hpcF9yZXYgPCA1KSB7CisJaWYgKGJjbS0+Y29yZV9wY2kucmV2IDw9IDUgJiYgYmNtLT5jb3JlX3BjaS5pZCAhPSBCQ000M3h4X0NPUkVJRF9QQ0lFKSB7CiAJCXNiaW1jb25maWdsb3cgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCSU1DT05GSUdMT1cpOwogCQlzYmltY29uZmlnbG93ICY9IH4gQkNNNDN4eF9TQklNQ09ORklHTE9XX1JFUVVFU1RfVE9VVF9NQVNLOwogCQlzYmltY29uZmlnbG93ICY9IH4gQkNNNDN4eF9TQklNQ09ORklHTE9XX1NFUlZJQ0VfVE9VVF9NQVNLOwotCQlpZiAoYmNtLT5idXN0eXBlID09IEJDTTQzeHhfQlVTVFlQRV9QQ0kpCi0JCQlzYmltY29uZmlnbG93IHw9IDB4MzI7Ci0JCWVsc2UgaWYgKGJjbS0+YnVzdHlwZSA9PSBCQ000M3h4X0JVU1RZUEVfU0IpCi0JCQlzYmltY29uZmlnbG93IHw9IDB4NTM7Ci0JCWVsc2UKLQkJCWFzc2VydCgwKTsKKwkJc2JpbWNvbmZpZ2xvdyB8PSAweDMyOwogCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NJUl9TQklNQ09ORklHTE9XLCBzYmltY29uZmlnbG93KTsKIAl9CiAKQEAgLTMwMDQsMjIgKzMwMDAsNjQgQEAKIAogc3RhdGljIGludCBiY200M3h4X3BjaWNvcmVfY29tbWl0X3NldHRpbmdzKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCBiY200M3h4X2NvcmVpbmZvICpvbGRfY29yZTsKKwlpbnQgZXJyID0gMDsKIAotCW9sZF9jb3JlID0gYmNtLT5jdXJyZW50X2NvcmU7Ci0JZXJyID0gYmNtNDN4eF9zd2l0Y2hfY29yZShiY20sICZiY20tPmNvcmVfcGNpKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwliY20tPmlycV9zYXZlZHN0YXRlID0gYmNtNDN4eF9pbnRlcnJ1cHRfZGlzYWJsZShiY20sIEJDTTQzeHhfSVJRX0FMTCk7CiAKLQliY200M3h4X3BjaWNvcmVfYnJvYWRjYXN0X3ZhbHVlKGJjbSwgMHhmZDgsIDB4MDAwMDAwMDApOworCWlmIChiY20tPmNvcmVfY2hpcGNvbW1vbi5hdmFpbGFibGUpIHsKKwkJZXJyID0gYmNtNDN4eF9zd2l0Y2hfY29yZShiY20sICZiY20tPmNvcmVfY2hpcGNvbW1vbik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKIAotCWJjbTQzeHhfc3dpdGNoX2NvcmUoYmNtLCBvbGRfY29yZSk7Ci0JYXNzZXJ0KGVyciA9PSAwKTsKKwkJYmNtNDN4eF9wY2ljb3JlX2Jyb2FkY2FzdF92YWx1ZShiY20sIDB4ZmQ4LCAweDAwMDAwMDAwKTsKKworCQkvKiB0aGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2hlbiBhIFBDSSBjb3JlIGlzIG1hcHBlZCAqLworCQllcnIgPSBiY200M3h4X3N3aXRjaF9jb3JlKGJjbSwgJmJjbS0+Y29yZV9wY2kpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfSBlbHNlCisJCWJjbTQzeHhfcGNpY29yZV9icm9hZGNhc3RfdmFsdWUoYmNtLCAweGZkOCwgMHgwMDAwMDAwMCk7CisKKwliY200M3h4X2ludGVycnVwdF9lbmFibGUoYmNtLCBiY20tPmlycV9zYXZlZHN0YXRlKTsKKwogb3V0OgogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB1MzIgYmNtNDN4eF9wY2llX3JlZ19yZWFkKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTMyIGFkZHJlc3MpCit7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfQUREUiwgYWRkcmVzcyk7CisJcmV0dXJuIGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfREFUQSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTQzeHhfcGNpZV9yZWdfd3JpdGUoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtLCB1MzIgYWRkcmVzcywKKwkJCQkgICAgdTMyIGRhdGEpCit7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfQUREUiwgYWRkcmVzcyk7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfREFUQSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTQzeHhfcGNpZV9tZGlvX3dyaXRlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTggZGV2LCB1OCByZWcsCisJCQkJICAgIHUxNiBkYXRhKQoreworCWludCBpOworCisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9NRElPX0NUTCwgMHgwMDgyKTsKKwliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X1BDSUVDT1JFX01ESU9fREFUQSwgQkNNNDN4eF9QQ0lFX01ESU9fU1QgfAorCQkJQkNNNDN4eF9QQ0lFX01ESU9fV1QgfCAoZGV2IDw8IEJDTTQzeHhfUENJRV9NRElPX0RFVikgfAorCQkJKHJlZyA8PCBCQ000M3h4X1BDSUVfTURJT19SRUcpIHwgQkNNNDN4eF9QQ0lFX01ESU9fVEEgfAorCQkJZGF0YSk7CisJdWRlbGF5KDEwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmIChiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfUENJRUNPUkVfTURJT19DVEwpICYKKwkJICAgIEJDTTQzeHhfUENJRV9NRElPX1RDKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9NRElPX0NUTCwgMCk7Cit9CisKIC8qIE1ha2UgYW4gSS9PIENvcmUgdXNhYmxlLiAiY29yZV9tYXNrIiBpcyB0aGUgYml0bWFzayBvZiB0aGUgY29yZXMgdG8gZW5hYmxlLgogICogVG8gZW5hYmxlIGNvcmUgMCwgcGFzcyBhIGNvcmVfbWFzayBvZiAxPDwwCiAgKi8KQEAgLTMwMzksNyArMzA3Nyw4IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlpZiAoYmNtLT5jb3JlX3BjaS5yZXYgPCA2KSB7CisJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPCA2IHx8CisJCWJjbS0+Y3VycmVudF9jb3JlLT5pZCA9PSBCQ000M3h4X0NPUkVJRF9QQ0kpIHsKIAkJdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCSU5UVkVDKTsKIAkJdmFsdWUgfD0gKDEgPDwgYmFja3BsYW5lX2ZsYWdfbnIpOwogCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NJUl9TQklOVFZFQywgdmFsdWUpOwpAQCAtMzA1NywyMSArMzA5Niw0NiBAQAogCQl9CiAJfQogCi0JdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfUENJQ09SRV9TQlRPUENJMik7Ci0JdmFsdWUgfD0gQkNNNDN4eF9TQlRPUENJMl9QUkVGRVRDSCB8IEJDTTQzeHhfU0JUT1BDSTJfQlVSU1Q7Ci0JYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lDT1JFX1NCVE9QQ0kyLCB2YWx1ZSk7CisJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5pZCA9PSBCQ000M3h4X0NPUkVJRF9QQ0kpIHsKKwkJdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfUENJQ09SRV9TQlRPUENJMik7CisJCXZhbHVlIHw9IEJDTTQzeHhfU0JUT1BDSTJfUFJFRkVUQ0ggfCBCQ000M3h4X1NCVE9QQ0kyX0JVUlNUOworCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X1BDSUNPUkVfU0JUT1BDSTIsIHZhbHVlKTsKIAotCWlmIChiY20tPmNvcmVfcGNpLnJldiA8IDUpIHsKLQkJdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCSU1DT05GSUdMT1cpOwotCQl2YWx1ZSB8PSAoMiA8PCBCQ000M3h4X1NCSU1DT05GSUdMT1dfU0VSVklDRV9UT1VUX1NISUZUKQotCQkJICYgQkNNNDN4eF9TQklNQ09ORklHTE9XX1NFUlZJQ0VfVE9VVF9NQVNLOwotCQl2YWx1ZSB8PSAoMyA8PCBCQ000M3h4X1NCSU1DT05GSUdMT1dfUkVRVUVTVF9UT1VUX1NISUZUKQotCQkJICYgQkNNNDN4eF9TQklNQ09ORklHTE9XX1JFUVVFU1RfVE9VVF9NQVNLOwotCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NJUl9TQklNQ09ORklHTE9XLCB2YWx1ZSk7Ci0JCWVyciA9IGJjbTQzeHhfcGNpY29yZV9jb21taXRfc2V0dGluZ3MoYmNtKTsKLQkJYXNzZXJ0KGVyciA9PSAwKTsKKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPCA1KSB7CisJCQl2YWx1ZSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JJTUNPTkZJR0xPVyk7CisJCQl2YWx1ZSB8PSAoMiA8PCBCQ000M3h4X1NCSU1DT05GSUdMT1dfU0VSVklDRV9UT1VUX1NISUZUKQorCQkJCSAmIEJDTTQzeHhfU0JJTUNPTkZJR0xPV19TRVJWSUNFX1RPVVRfTUFTSzsKKwkJCXZhbHVlIHw9ICgzIDw8IEJDTTQzeHhfU0JJTUNPTkZJR0xPV19SRVFVRVNUX1RPVVRfU0hJRlQpCisJCQkJICYgQkNNNDN4eF9TQklNQ09ORklHTE9XX1JFUVVFU1RfVE9VVF9NQVNLOworCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSVJfU0JJTUNPTkZJR0xPVywgdmFsdWUpOworCQkJZXJyID0gYmNtNDN4eF9wY2ljb3JlX2NvbW1pdF9zZXR0aW5ncyhiY20pOworCQkJYXNzZXJ0KGVyciA9PSAwKTsKKwkJfSBlbHNlIGlmIChiY20tPmN1cnJlbnRfY29yZS0+cmV2ID49IDExKSB7CisJCQl2YWx1ZSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9QQ0lDT1JFX1NCVE9QQ0kyKTsKKwkJCXZhbHVlIHw9IEJDTTQzeHhfU0JUT1BDSTJfTUVNUkVBRF9NVUxUSTsKKwkJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfUENJQ09SRV9TQlRPUENJMiwgdmFsdWUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPT0gMCB8fCBiY20tPmN1cnJlbnRfY29yZS0+cmV2ID09IDEpIHsKKwkJCXZhbHVlID0gYmNtNDN4eF9wY2llX3JlZ19yZWFkKGJjbSwgQkNNNDN4eF9QQ0lFX1RMUF9XT1JLQVJPVU5EKTsKKwkJCXZhbHVlIHw9IDB4ODsKKwkJCWJjbTQzeHhfcGNpZV9yZWdfd3JpdGUoYmNtLCBCQ000M3h4X1BDSUVfVExQX1dPUktBUk9VTkQsCisJCQkJCSAgICAgICB2YWx1ZSk7CisJCX0KKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPT0gMCkgeworCQkJYmNtNDN4eF9wY2llX21kaW9fd3JpdGUoYmNtLCBCQ000M3h4X01ESU9fU0VSREVTX1JYLAorCQkJCQkJQkNNNDN4eF9TRVJERVNfUlhUSU1FUiwgMHg4MTI4KTsKKwkJCWJjbTQzeHhfcGNpZV9tZGlvX3dyaXRlKGJjbSwgQkNNNDN4eF9NRElPX1NFUkRFU19SWCwKKwkJCQkJCUJDTTQzeHhfU0VSREVTX0NEUiwgMHgwMTAwKTsKKwkJCWJjbTQzeHhfcGNpZV9tZGlvX3dyaXRlKGJjbSwgQkNNNDN4eF9NRElPX1NFUkRFU19SWCwKKwkJCQkJCUJDTTQzeHhfU0VSREVTX0NEUl9CVywgMHgxNDY2KTsKKwkJfSBlbHNlIGlmIChiY20tPmN1cnJlbnRfY29yZS0+cmV2ID09IDEpIHsKKwkJCXZhbHVlID0gYmNtNDN4eF9wY2llX3JlZ19yZWFkKGJjbSwgQkNNNDN4eF9QQ0lFX0RMTFBfTElOS0NUTCk7CisJCQl2YWx1ZSB8PSAweDQwOworCQkJYmNtNDN4eF9wY2llX3JlZ193cml0ZShiY20sIEJDTTQzeHhfUENJRV9ETExQX0xJTktDVEwsCisJCQkJCSAgICAgICB2YWx1ZSk7CisJCX0KIAl9Ci0KIG91dF9zd2l0Y2hfYmFjazoKIAllcnIgPSBiY200M3h4X3N3aXRjaF9jb3JlKGJjbSwgb2xkX2NvcmUpOwogb3V0OgpAQCAtMzE0MCw1NSArMzIwNCwyNyBAQAogCiBzdGF0aWMgdm9pZCBkb19wZXJpb2RpY193b3JrKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQl1bnNpZ25lZCBpbnQgc3RhdGU7Ci0KLQlzdGF0ZSA9IGJjbS0+cGVyaW9kaWNfc3RhdGU7Ci0JaWYgKHN0YXRlICUgOCA9PSAwKQorCWlmIChiY20tPnBlcmlvZGljX3N0YXRlICUgOCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTIwc2VjKGJjbSk7Ci0JaWYgKHN0YXRlICUgNCA9PSAwKQorCWlmIChiY20tPnBlcmlvZGljX3N0YXRlICUgNCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5NjBzZWMoYmNtKTsKLQlpZiAoc3RhdGUgJSAyID09IDApCisJaWYgKGJjbS0+cGVyaW9kaWNfc3RhdGUgJSAyID09IDApCiAJCWJjbTQzeHhfcGVyaW9kaWNfZXZlcnkzMHNlYyhiY20pOwotCWlmIChzdGF0ZSAlIDEgPT0gMCkKLQkJYmNtNDN4eF9wZXJpb2RpY19ldmVyeTE1c2VjKGJjbSk7Ci0JYmNtLT5wZXJpb2RpY19zdGF0ZSA9IHN0YXRlICsgMTsKKwliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTVzZWMoYmNtKTsKIAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYmNtLT5wZXJpb2RpY193b3JrLCBIWiAqIDE1KTsKIH0KIAotLyogRXN0aW1hdGUgYSAiQmFkbmVzcyIgdmFsdWUgYmFzZWQgb24gdGhlIHBlcmlvZGljIHdvcmsKLSAqIHN0YXRlLW1hY2hpbmUgc3RhdGUuICJCYWRuZXNzIiBpcyB3b3JzZSAoYmlnZ2VyKSwgaWYgdGhlCi0gKiBwZXJpb2RpYyB3b3JrIHdpbGwgdGFrZSBsb25nZXIuCi0gKi8KLXN0YXRpYyBpbnQgZXN0aW1hdGVfcGVyaW9kaWNfd29ya19iYWRuZXNzKHVuc2lnbmVkIGludCBzdGF0ZSkKLXsKLQlpbnQgYmFkbmVzcyA9IDA7Ci0KLQlpZiAoc3RhdGUgJSA4ID09IDApIC8qIGV2ZXJ5IDEyMCBzZWMgKi8KLQkJYmFkbmVzcyArPSAxMDsKLQlpZiAoc3RhdGUgJSA0ID09IDApIC8qIGV2ZXJ5IDYwIHNlYyAqLwotCQliYWRuZXNzICs9IDU7Ci0JaWYgKHN0YXRlICUgMiA9PSAwKSAvKiBldmVyeSAzMCBzZWMgKi8KLQkJYmFkbmVzcyArPSAxOwotCWlmIChzdGF0ZSAlIDEgPT0gMCkgLyogZXZlcnkgMTUgc2VjICovCi0JCWJhZG5lc3MgKz0gMTsKLQotI2RlZmluZSBCQURORVNTX0xJTUlUCTQKLQlyZXR1cm4gYmFkbmVzczsKLX0KLQogc3RhdGljIHZvaWQgYmNtNDN4eF9wZXJpb2RpY193b3JrX2hhbmRsZXIodm9pZCAqZCkKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gYmNtLT5uZXRfZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHNhdmVkaXJxcyA9IDA7Ci0JaW50IGJhZG5lc3M7CiAJdW5zaWduZWQgbG9uZyBvcmlnX3RyYW5zX3N0YXJ0ID0gMDsKIAogCW11dGV4X2xvY2soJmJjbS0+bXV0ZXgpOwotCWJhZG5lc3MgPSBlc3RpbWF0ZV9wZXJpb2RpY193b3JrX2JhZG5lc3MoYmNtLT5wZXJpb2RpY19zdGF0ZSk7Ci0JaWYgKGJhZG5lc3MgPiBCQURORVNTX0xJTUlUKSB7CisJaWYgKHVubGlrZWx5KGJjbS0+cGVyaW9kaWNfc3RhdGUgJSA0ID09IDApKSB7CiAJCS8qIFBlcmlvZGljIHdvcmsgd2lsbCB0YWtlIGEgbG9uZyB0aW1lLCBzbyB3ZSB3YW50IGl0IHRvCiAJCSAqIGJlIHByZWVtdGlibGUuCiAJCSAqLwpAQCAtMzIyMCw3ICszMjU2LDcgQEAKIAogCWRvX3BlcmlvZGljX3dvcmsoYmNtKTsKIAotCWlmIChiYWRuZXNzID4gQkFETkVTU19MSU1JVCkgeworCWlmICh1bmxpa2VseShiY20tPnBlcmlvZGljX3N0YXRlICUgNCA9PSAwKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNtLT5pcnFfbG9jaywgZmxhZ3MpOwogCQl0YXNrbGV0X2VuYWJsZSgmYmNtLT5pc3JfdGFza2xldCk7CiAJCWJjbTQzeHhfaW50ZXJydXB0X2VuYWJsZShiY20sIHNhdmVkaXJxcyk7CkBAIC0zMjMxLDYgKzMyNjcsNyBAQAogCQluZXRfZGV2LT50cmFuc19zdGFydCA9IG9yaWdfdHJhbnNfc3RhcnQ7CiAJfQogCW1taW93YigpOworCWJjbS0+cGVyaW9kaWNfc3RhdGUrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY20tPmlycV9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZiY20tPm11dGV4KTsKIH0KQEAgLTM2NzYsNyArMzcxMyw3IEBACiAJCWJjbS0+aWVlZS0+ZnJlcV9iYW5kID0gSUVFRTgwMjExXzI0R0haX0JBTkQ7CiAJCWJyZWFrOwogCWNhc2UgQkNNNDN4eF9QSFlUWVBFX0c6Ci0JCWlmIChwaHlfcmV2ID4gNykKKwkJaWYgKHBoeV9yZXYgPiA4KQogCQkJcGh5X3Jldl9vayA9IDA7CiAJCWJjbS0+aWVlZS0+bW9kdWxhdGlvbiA9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gfAogCQkJCQlJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CkBAIC0zNjg4LDYgKzM3MjUsOCBAQAogCQkgICAgICAgcGh5X3R5cGUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9OworCWJjbS0+aWVlZS0+cGVyZmVjdF9yc3NpID0gUlhfUlNTSV9NQVg7CisJYmNtLT5pZWVlLT53b3JzdF9yc3NpID0gMDsKIAlpZiAoIXBoeV9yZXZfb2spIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkludmFsaWQgUEhZIFJldmlzaW9uICV4XG4iLAogCQkgICAgICAgcGh5X3Jldik7CkBAIC0zOTc0LDExICs0MDEzLDYgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBiY200M3h4X25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0JcmV0dXJuICYoYmNtNDN4eF9wcml2KG5ldF9kZXYpLT5pZWVlLT5zdGF0cyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGJjbTQzeHhfbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7CiAJc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtID0gYmNtNDN4eF9wcml2KG5ldF9kZXYpOwpAQCAtNDA5Miw3ICs0MTI2LDYgQEAKIAogCW5ldF9kZXYtPm9wZW4gPSBiY200M3h4X25ldF9vcGVuOwogCW5ldF9kZXYtPnN0b3AgPSBiY200M3h4X25ldF9zdG9wOwotCW5ldF9kZXYtPmdldF9zdGF0cyA9IGJjbTQzeHhfbmV0X2dldF9zdGF0czsKIAluZXRfZGV2LT50eF90aW1lb3V0ID0gYmNtNDN4eF9uZXRfdHhfdGltZW91dDsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCW5ldF9kZXYtPnBvbGxfY29udHJvbGxlciA9IGJjbTQzeHhfbmV0X3BvbGxfY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3Bvd2VyLmMKaW5kZXggNjU2OWRhMy4uN2U3NzRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3Bvd2VyLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3Bvd2VyLmMKQEAgLTE1Myw4ICsxNTMsNiBAQAogCWludCBlcnIsIG1heGZyZXE7CiAJc3RydWN0IGJjbTQzeHhfY29yZWluZm8gKm9sZF9jb3JlOwogCi0JaWYgKCEoYmNtLT5jaGlwY29tbW9uX2NhcGFiaWxpdGllcyAmIEJDTTQzeHhfQ0FQQUJJTElUSUVTX1BDVEwpKQotCQlyZXR1cm4gMDsKIAlvbGRfY29yZSA9IGJjbS0+Y3VycmVudF9jb3JlOwogCWVyciA9IGJjbTQzeHhfc3dpdGNoX2NvcmUoYmNtLCAmYmNtLT5jb3JlX2NoaXBjb21tb24pOwogCWlmIChlcnIgPT0gLUVOT0RFVikKQEAgLTE2MiwxMSArMTYwLDI3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQltYXhmcmVxID0gYmNtNDN4eF9wY3RsX2Nsb2NrZnJlcWxpbWl0KGJjbSwgMSk7Ci0JYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX1BMTE9OREVMQVksCi0JCQkobWF4ZnJlcSAqIDE1MCArIDk5OTk5OSkgLyAxMDAwMDAwKTsKLQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NISVBDT01NT05fRlJFRlNFTERFTEFZLAotCQkJKG1heGZyZXEgKiAxNSArIDk5OTk5OSkgLyAxMDAwMDAwKTsKKwlpZiAoYmNtLT5jaGlwX2lkID09IDB4NDMyMSkgeworCQlpZiAoYmNtLT5jaGlwX3JldiA9PSAwKQorCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX0NUTCwgMHgwM0E0KTsKKwkJaWYgKGJjbS0+Y2hpcF9yZXYgPT0gMSkKKwkJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0hJUENPTU1PTl9DVEwsIDB4MDBBNCk7CisJfQorCisJaWYgKGJjbS0+Y2hpcGNvbW1vbl9jYXBhYmlsaXRpZXMgJiBCQ000M3h4X0NBUEFCSUxJVElFU19QQ1RMKSB7CisJCWlmIChiY20tPmN1cnJlbnRfY29yZS0+cmV2ID49IDEwKSB7CisJCQkvKiBTZXQgSWRsZSBQb3dlciBjbG9jayByYXRlIHRvIDFNaHogKi8KKwkJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0hJUENPTU1PTl9TWVNDTEtDVEwsCisJCQkJICAgICAgIChiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0hJUENPTU1PTl9TWVNDTEtDVEwpCisJCQkJICAgICAgICYgMHgwMDAwRkZGRikgfCAweDQwMDAwKTsKKwkJfSBlbHNlIHsKKwkJCW1heGZyZXEgPSBiY200M3h4X3BjdGxfY2xvY2tmcmVxbGltaXQoYmNtLCAxKTsKKwkJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0hJUENPTU1PTl9QTExPTkRFTEFZLAorCQkJCSAgICAgICAobWF4ZnJlcSAqIDE1MCArIDk5OTk5OSkgLyAxMDAwMDAwKTsKKwkJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0hJUENPTU1PTl9GUkVGU0VMREVMQVksCisJCQkJICAgICAgIChtYXhmcmVxICogMTUgKyA5OTk5OTkpIC8gMTAwMDAwMCk7CisJCX0KKwl9CiAKIAllcnIgPSBiY200M3h4X3N3aXRjaF9jb3JlKGJjbSwgb2xkX2NvcmUpOwogCWFzc2VydChlcnIgPT0gMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfd3guYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jCmluZGV4IGQyNzAxNmYuLmE2NTk0NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jCkBAIC00Nyw5ICs0Nyw2IEBACiAjZGVmaW5lIEJDTTQzeHhfV1hfVkVSU0lPTgkxOAogCiAjZGVmaW5lIE1BWF9XWF9TVFJJTkcJCTgwCi0vKiBGSVhNRTogdGhlIG5leHQgbGluZSBpcyBhIGd1ZXNzIGFzIHRvIHdoYXQgdGhlIG1heGltdW0gUlNTSSB2YWx1ZSBtaWdodCBiZSAqLwotI2RlZmluZSBSWF9SU1NJX01BWAkJNjAKLQogCiBzdGF0aWMgaW50IGJjbTQzeHhfd3hfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTY5Myw2ICs2OTAsNyBAQAogCWJjbS0+aWVlZS0+aG9zdF9lbmNyeXB0ID0gISFvbjsKIAliY20tPmllZWUtPmhvc3RfZGVjcnlwdCA9ICEhb247CiAJYmNtLT5pZWVlLT5ob3N0X2J1aWxkX2l2ID0gIW9uOworCWJjbS0+aWVlZS0+aG9zdF9zdHJpcF9pdl9pY3YgPSAhb247CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNtLT5pcnFfbG9jaywgZmxhZ3MpOwogCW11dGV4X3VubG9jaygmYmNtLT5tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfeG1pdC5jCmluZGV4IDAxNTllNGUuLjNlMjQ2MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3htaXQuYwpAQCAtNTQ0LDI0ICs1NDQsNiBAQAogCX0KIAogCWZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KHdsaGRyLT5mcmFtZV9jdGwpOwotCWlmICgoZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJiAhYmNtLT5pZWVlLT5ob3N0X2RlY3J5cHQpIHsKLQkJZnJhbWVfY3RsICY9IH5JRUVFODAyMTFfRkNUTF9QUk9URUNURUQ7Ci0JCXdsaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmcmFtZV9jdGwpOwkJCi0JCS8qIHRyaW0gSVYgYW5kIElDViAqLwotCQkvKiBGSVhNRTogdGhpcyBtdXN0IGJlIGRvbmUgb25seSBmb3IgV0VQIGVuY3J5cHRlZCBwYWNrZXRzICovCi0JCWlmIChza2ItPmxlbiA8IDMyKSB7Ci0JCQlkcHJpbnRrbChLRVJOX0VSUiBQRlggIlJYIHBhY2tldCBkcm9wcGVkIChQUk9URUNURUQgZmxhZyAiCi0JCQkJCSAgICAgICJzZXQgYW5kIGxlbmd0aCA8IDMyKVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsJCQotCQkJbWVtbW92ZShza2ItPmRhdGEgKyA0LCBza2ItPmRhdGEsIDI0KTsKLQkJCXNrYl9wdWxsKHNrYiwgNCk7Ci0JCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7Ci0JCQlzdGF0cy5sZW4gLT0gODsKLQkJfQotCQl3bGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKShza2ItPmRhdGEpOwotCX0KLQkKIAlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZnJhbWVfY3RsKSkgewogCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CiAJCWllZWU4MDIxMV9yeF9tZ3QoYmNtLT5pZWVlLCB3bGhkciwgJnN0YXRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwppbmRleCBmNjM5MDllLi5lZTU0MmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCkBAIC0yOTMsMTUgKzI5MywxMiBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKIAl0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKIAl0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGh3X3ByaXYtPmxpbmssICZ0dXBsZSkgfHwKLQkgICAgcGNtY2lhX2dldF90dXBsZV9kYXRhKGh3X3ByaXYtPmxpbmssICZ0dXBsZSkgfHwKLQkgICAgcGNtY2lhX3BhcnNlX3R1cGxlKGh3X3ByaXYtPmxpbmssICZ0dXBsZSwgcGFyc2UpIHx8Ci0JICAgIHBhcnNlLT5tYW5maWQubWFuZiAhPSAweGQ2MDEgfHwgcGFyc2UtPm1hbmZpZC5jYXJkICE9IDB4MDEwMSkgeworCisJaWYgKGh3X3ByaXYtPmxpbmstPm1hbmZfaWQgIT0gMHhkNjAxIHx8IGh3X3ByaXYtPmxpbmstPmNhcmRfaWQgIT0gMHgwMTAxKSB7CiAJCS8qIE5vIFNhbkRpc2sgbWFuZmlkIGZvdW5kICovCiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKQEAgLTU3MywxNiArNTcwLDEwIEBACiAJfQogCW1lbXNldChod19wcml2LCAwLCBzaXplb2YoKmh3X3ByaXYpKTsKIAotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAJdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhID0gYnVmOwogCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsIHBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKIAlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKIAkJIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYwppbmRleCBjMmZhMDExLi5kMWRlOTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGNpLmMKQEAgLTQyNSw4ICs0MjUsMTQgQEAKIHN0YXRpYyBpbnQgcHJpc20yX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZXJyOwogCi0JcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgb24gcmVzdW1lXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAJcHJpc20yX2h3X2NvbmZpZyhkZXYsIDApOwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwppbmRleCA0ZTRlYWEyLi43OTYwN2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCkBAIC01ODI3LDE5ICs1ODI3LDYgQEAKIAlzY2hlZHVsZV9yZXNldChwcml2KTsKIH0KIAotLyoKLSAqIFRPRE86IHJlaW1wbGVtZW50IGl0IHNvIHRoYXQgaXQgcmVhZHMgc3RhdGlzdGljcwotICogICAgICAgZnJvbSB0aGUgYWRhcHRlciB1c2luZyBvcmRpbmFsIHRhYmxlcwotICogICAgICAgaW5zdGVhZCBvZi9pbiBhZGRpdGlvbiB0byBjb2xsZWN0aW5nIHRoZW0KLSAqICAgICAgIGluIHRoZSBkcml2ZXIKLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcHcyMTAwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlyZXR1cm4gJnByaXYtPmllZWUtPnN0YXRzOwotfQotCiBzdGF0aWMgaW50IGlwdzIxMDBfd3BhX2VuYWJsZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCBpbnQgdmFsdWUpCiB7CiAJLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBsb2FkcyBhbmQgY2xvc2VzIHRoZSBkcml2ZXIKQEAgLTYwMjIsNyArNjAwOSw2IEBACiAJZGV2LT5vcGVuID0gaXB3MjEwMF9vcGVuOwogCWRldi0+c3RvcCA9IGlwdzIxMDBfY2xvc2U7CiAJZGV2LT5pbml0ID0gaXB3MjEwMF9uZXRfaW5pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGlwdzIxMDBfc3RhdHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZpcHcyMTAwX2V0aHRvb2xfb3BzOwogCWRldi0+dHhfdGltZW91dCA9IGlwdzIxMDBfdHhfdGltZW91dDsKIAlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmlwdzIxMDBfd3hfaGFuZGxlcl9kZWY7CkBAIC02NDIzLDYgKzY0MDksNyBAQAogewogCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldF9kZXY7CisJaW50IGVycjsKIAl1MzIgdmFsOwogCiAJaWYgKElQVzIxMDBfUE1fRElTQUJMRUQpCkBAIC02NDMzLDcgKzY0MjAsMTIgQEAKIAlJUFdfREVCVUdfSU5GTygiJXM6IENvbWluZyBvdXQgb2Ygc3VzcGVuZC4uLlxuIiwgZGV2LT5uYW1lKTsKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAogCS8qCkBAIC03NTY4LDExICs3NTYwLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHdycXUtPmRhdGEubGVuZ3RoKSB7Ci0JCWJ1ZiA9IGttYWxsb2Mod3JxdS0+ZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQlidWYgPSBrbWVtZHVwKGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChidWYgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCW1lbWNweShidWYsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CiAJCWtmcmVlKGllZWUtPndwYV9pZSk7CiAJCWllZWUtPndwYV9pZSA9IGJ1ZjsKIAkJaWVlZS0+d3BhX2llX2xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCmluZGV4IDFmNzQyODEuLmM2OTJkMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKQEAgLTY5MjAsOCArNjkyMCw4IEBACiB9CiAKIC8qCi0qIGhhbmRsaW5nIHRoZSBiZWFjb25pbmcgcmVzcG9uY2VzLiBpZiB3ZSBnZXQgZGlmZmVyZW50IFFvUyBzZXR0aW5nCi0qIG9mIHRoZSBuZXR3b3JrIGZyb20gdGhlIHRoZSBhc3NvY2lhdGVkIHNldHRpbmcgYWRqdXN0IHRoZSBRb1MKKyogaGFuZGxpbmcgdGhlIGJlYWNvbmluZyByZXNwb25zZXMuIGlmIHdlIGdldCBkaWZmZXJlbnQgUW9TIHNldHRpbmcKKyogb2ZmIHRoZSBuZXR3b3JrIGZyb20gdGhlIGFzc29jaWF0ZWQgc2V0dGluZywgYWRqdXN0IHRoZSBRb1MKICogc2V0dGluZwogKi8KIHN0YXRpYyBpbnQgaXB3X3Fvc19hc3NvY2lhdGlvbl9yZXNwKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKQEAgLTExNzI3LDEyICsxMTcyNywxOCBAQAogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0X2RldjsKKwlpbnQgZXJyOwogCXUzMiB2YWw7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogQ29taW5nIG91dCBvZiBzdXNwZW5kLi4uXG4iLCBkZXYtPm5hbWUpOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIG9uIHJlc3VtZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwppbmRleCA2NzE0ZTBkLi42NDRiNDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCkBAIC03MzUsMTAgKzczNSw3IEBACiBzdGF0aWMgaW50IG5ldHdhdmVfcGNtY2lhX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykgewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIGludCBpLCBqLCBsYXN0X3JldCwgbGFzdF9mbjsKLSAgICB1X2NoYXIgYnVmWzY0XTsKICAgICB3aW5fcmVxX3QgcmVxOwogICAgIG1lbXJlcV90IG1lbTsKICAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IE5VTEw7CkBAIC03NDYsMjEgKzc0Myw2IEBACiAgICAgREVCVUcoMCwgIm5ldHdhdmVfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKICAgICAvKgotICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICByZWdpc3RlcnMuCi0gICAgKi8KLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQotICAgIC8qCiAgICAgICogIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuCiAgICAgICogIElmIHlvdSB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0bwogICAgICAqICBwaWNrIGFkZHJlc3NlcyAtLSBzZWUgdGhlIHNlcmlhbCBkcml2ZXIgZm9yIGFuIGV4YW1wbGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKaW5kZXggYmMxNDY4OS4uZDA4YWU4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpAQCAtMTc4LDIxICsxNzgsNiBAQAogCWNpc3BhcnNlX3QgcGFyc2U7CiAJdm9pZCBfX2lvbWVtICptZW07CiAKLQkvKgotCSAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMKLQkgKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KLQkgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAkvKiBMb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLwogCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAogCQkgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpKTsKQEAgLTIxMSw2ICsxOTYsMTAgQEAKIAkgKiBhbmQgbW9zdCBjbGllbnQgZHJpdmVycyB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbgogCSAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KIAkgKi8KKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAJd2hpbGUgKDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5oCmluZGV4IGJlMWFiZWEuLmY0ZTVlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuaApAQCAtNjAsNyArNjAsMTIgQEAKIAlpbnQgZXJyOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCmluZGV4IDIzZGVlZTYuLjAyZmM2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+XwogICoKQEAgLTM4LDcgKzM3LDcgQEAKICAqIGlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzIC0gZGlzYWJsZSBhbGwgaW50ZXJydXB0cwogICogQGRldmljZTogcGNpIG1lbW9yeSBiYXNlIGFkZHJlc3MKICAqCi0gKiAgSW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgaW50ZXJydXB0IHJlcG9ydGluZyBieSBhc3NlcnRpbmcgCisgKiAgSW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgaW50ZXJydXB0IHJlcG9ydGluZyBieSBhc3NlcnRpbmcKICAqICB0aGUgSVJRIGxpbmUuIE5ldyBldmVudHMgbWF5IHN0aWxsIHNob3cgdXAgaW4gdGhlIGludGVycnVwdCBpZGVudGlmaWNhdGlvbgogICogIHJlZ2lzdGVyIGxvY2F0ZWQgYXQgb2Zmc2V0ICVJU0wzOFhYX0lOVF9JREVOVF9SRUcuCiAgKi8KQEAgLTIwNCwxNyArMjAzLDE5IEBACiAJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIGRldGVjdGluZyBpbml0aWFsaXphdGlvbiAqLwogCiAJLyogTm90ZTogRG8gbm90IGVuYWJsZSBvdGhlciBpbnRlcnJ1cHRzIGhlcmUuIFdlIHdhbnQgdGhlCi0JICogZGV2aWNlIHRvIGhhdmUgY29tZSB1cCBmaXJzdCAxMDAlIGJlZm9yZSBhbGxvd2luZyBhbnkgb3RoZXIgCisJICogZGV2aWNlIHRvIGhhdmUgY29tZSB1cCBmaXJzdCAxMDAlIGJlZm9yZSBhbGxvd2luZyBhbnkgb3RoZXIKIAkgKiBpbnRlcnJ1cHRzLiAqLwogCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0lOVF9JREVOVF9JTklULCBJU0wzOFhYX0lOVF9FTl9SRUcpOwogCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOyAgLyogYWxsb3cgY29tcGxldGUgZnVsbCByZXNldCAqLwogfQogCiB2b2lkCi1pc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKSB7Citpc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKQorewogCXUzMiByZWc7Ci0JcmVnID0gKCBJU0wzOFhYX0lOVF9JREVOVF9VUERBVEUgfCAKLQkJCUlTTDM4WFhfSU5UX0lERU5UX1NMRUVQIHwgSVNMMzhYWF9JTlRfSURFTlRfV0FLRVVQKTsKKworCXJlZyA9IElTTDM4WFhfSU5UX0lERU5UX1VQREFURSB8IElTTDM4WFhfSU5UX0lERU5UX1NMRUVQIHwKKwkgICAgICBJU0wzOFhYX0lOVF9JREVOVF9XQUtFVVA7CiAJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIHJlZywgSVNMMzhYWF9JTlRfRU5fUkVHKTsKIAl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKIH0KQEAgLTIzNCwyMyArMjM1LDIxIEBACiAJCS8qIHNlbmQgcXVldWVzICovCiAJY2FzZSBJU0wzOFhYX0NCX1RYX01HTVRROgogCQlCVUdfT04oZGVsdGEgPiBJU0wzOFhYX0NCX01HTVRfUVNJWkUpOworCiAJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfTFE6CiAJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfSFE6CiAJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpOwogCQlyZXR1cm4gZGVsdGE7Ci0JCWJyZWFrOwogCiAJCS8qIHJlY2VpdmUgcXVldWVzICovCiAJY2FzZSBJU0wzOFhYX0NCX1JYX01HTVRROgogCQlCVUdfT04oZGVsdGEgPiBJU0wzOFhYX0NCX01HTVRfUVNJWkUpOwogCQlyZXR1cm4gSVNMMzhYWF9DQl9NR01UX1FTSVpFIC0gZGVsdGE7Ci0JCWJyZWFrOwogCiAJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfTFE6CiAJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfSFE6CiAJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfUlhfUVNJWkUpOwogCQlyZXR1cm4gSVNMMzhYWF9DQl9SWF9RU0laRSAtIGRlbHRhOwotCQlicmVhazsKIAl9CiAJQlVHKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmgKaW5kZXggOGFmMjA5OC4uM2ZhZGNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTY3LDEwICs2NiwxMCBAQAogICogQGJhc2U6IChob3N0KSBtZW1vcnkgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKICAqIEB2YWw6IDMyYml0IHZhbHVlIChob3N0IG9yZGVyKSB0byB3cml0ZQogICogQG9mZnNldDogYnl0ZSBvZmZzZXQgaW50byBAYmFzZSB0byB3cml0ZSB2YWx1ZSB0bwotICogCisgKgogICogIFRoaXMgaGVscGVyIHRha2VzIGNhcmUgb2Ygd3JpdGluZyBhIDMyYml0IGRhdHVtIHRvIHRoZQotICogIHNwZWNpZmllZCBvZmZzZXQgaW50byB0aGUgZGV2aWNlJ3MgcGNpIG1lbW9yeSBzcGFjZSwgYW5kIG1ha2luZyBzdXJlIAotICogIHRoZSBwY2kgbWVtb3J5IGJ1ZmZlcnMgZ2V0IGZsdXNoZWQgYnkgcGVyZm9ybWluZyBvbmUgaGFybWxlc3MgcmVhZCAKKyAqICBzcGVjaWZpZWQgb2Zmc2V0IGludG8gdGhlIGRldmljZSdzIHBjaSBtZW1vcnkgc3BhY2UsIGFuZCBtYWtpbmcgc3VyZQorICogIHRoZSBwY2kgbWVtb3J5IGJ1ZmZlcnMgZ2V0IGZsdXNoZWQgYnkgcGVyZm9ybWluZyBvbmUgaGFybWxlc3MgcmVhZAogICogIGZyb20gdGhlICVJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNIIG9mZnNldC4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCAyODYzMjVjLi40YTIwZTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgICAgICAgICAgIChDKSAyMDAzLDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KICAqICAgICAgICAgICAgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CkBAIC01NSwxMiArNTQsMTIgQEAKICAqIHByaXNtNTRfbWliX21vZGVfaGVscGVyIC0gTUlCIGNoYW5nZSBtb2RlIGhlbHBlciBmdW5jdGlvbgogICogQG1pYjogdGhlICZzdHJ1Y3QgaXNscGNpX21pYiBvYmplY3QgdG8gbW9kaWZ5CiAgKiBAaXdfbW9kZTogbmV3IG1vZGUgKCVJV19NT0RFXyopCi0gKiAKKyAqCiAgKiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiwgaGVuY2UgaXQgZG9lcyBub3QgbG9jay4gTWFrZSBzdXJlCi0gKiAgY2FsbGVyIGRlYWxzIHdpdGggbG9ja2luZyAqaWYqIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSAKLSAqICBtb2RlLWRlcGVuZGVudCBtaWIgdmFsdWVzIGFuZCBkb2VzIHRoZSBtYXBwaW5nIG9mIHRoZSBMaW51eCAKLSAqICBXaXJlbGVzcyBBUEkgbW9kZXMgdG8gRGV2aWNlIGZpcm13YXJlIG1vZGVzLiBJdCBhbHNvIGNoZWNrcyBmb3IgCi0gKiAgY29ycmVjdCB2YWxpZCBMaW51eCB3aXJlbGVzcyBtb2Rlcy4gCisgKiAgY2FsbGVyIGRlYWxzIHdpdGggbG9ja2luZyAqaWYqIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZQorICogIG1vZGUtZGVwZW5kZW50IG1pYiB2YWx1ZXMgYW5kIGRvZXMgdGhlIG1hcHBpbmcgb2YgdGhlIExpbnV4CisgKiAgV2lyZWxlc3MgQVBJIG1vZGVzIHRvIERldmljZSBmaXJtd2FyZSBtb2Rlcy4gSXQgYWxzbyBjaGVja3MgZm9yCisgKiAgY29ycmVjdCB2YWxpZCBMaW51eCB3aXJlbGVzcyBtb2Rlcy4KICAqLwogc3RhdGljIGludAogcHJpc201NF9taWJfbW9kZV9oZWxwZXIoaXNscGNpX3ByaXZhdGUgKnByaXYsIHUzMiBpd19tb2RlKQpAQCAtMTE4LDcgKzExNyw3IEBACiAgKgogICogIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHN0cnVjdCBnaXZlbiBhcyBAbWliIHdpdGggZGVmYXVsdHMsCiAgKiAgb2Ygd2hpY2ggbWFueSBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGdsb2JhbCBtb2R1bGUgcGFyYW1ldGVyCi0gKiAgdmFyaWFibGVzLiAgCisgKiAgdmFyaWFibGVzLgogICovCiAKIHZvaWQKQEAgLTEzNCw3ICsxMzMsNyBAQAogCWF1dGhlbiA9IENBUkRfREVGQVVMVF9BVVRIRU47CiAJd2VwID0gQ0FSRF9ERUZBVUxUX1dFUDsKIAlmaWx0ZXIgPSBDQVJEX0RFRkFVTFRfRklMVEVSOyAvKiAoMCkgRG8gbm90IGZpbHRlciB1bi1lbmNyeXB0ZWQgZGF0YSAqLwotCWRvdDF4ID0gQ0FSRF9ERUZBVUxUX0RPVDFYOyAKKwlkb3QxeCA9IENBUkRfREVGQVVMVF9ET1QxWDsKIAltbG1lID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKIAljb25mb3JtYW5jZSA9IENBUkRfREVGQVVMVF9DT05GT1JNQU5DRTsKIAlwb3dlciA9IDEyNzsKQEAgLTIyOCw3ICsyMjcsNyBAQAogCX0gZWxzZQogCQlwcml2LT5pd3N0YXRpc3RpY3MucXVhbC51cGRhdGVkID0gMDsKIAotCS8qIFVwZGF0ZSBvdXIgd2lyZWxlc3Mgc3RhdHMsIGJ1dCBkbyBub3Qgc2NoZWR1bGUgdG8gb2Z0ZW4gCisJLyogVXBkYXRlIG91ciB3aXJlbGVzcyBzdGF0cywgYnV0IGRvIG5vdCBzY2hlZHVsZSB0byBvZnRlbgogCSAqIChtYXggMSBIWikgKi8KIAlpZiAoKHByaXYtPnN0YXRzX3RpbWVzdGFtcCA9PSAwKSB8fAogCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPnN0YXRzX3RpbWVzdGFtcCArIDEgKiBIWikpIHsKQEAgLTcwNSw3ICs3MDQsNyBAQAogCSogU3RhcnRpbmcgd2l0aCBXRS0xNywgdGhlIGJ1ZmZlciBjYW4gYmUgYXMgYmlnIGFzIG5lZWRlZC4KIAkqIEJ1dCB0aGUgZGV2aWNlIHdvbid0IHJlcHBvcnQgYW55dGhpbmcgaWYgeW91IGNoYW5nZSB0aGUgdmFsdWUKIAkqIG9mIElXTUFYX0JTUz0yNC4gKi8KLQkKKwogCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0JTU0xJU1QsIDAsIE5VTEwsICZyKTsKIAlic3NsaXN0ID0gci5wdHI7CiAKQEAgLTc4NSw3ICs3ODQsNyBAQAogCXJldHVybiBydmFsdWU7CiB9CiAKLS8qIFByb3ZpZGVzIG5vIGZ1bmN0aW9uYWxpdHksIGp1c3QgY29tcGxldGVzIHRoZSBpb2N0bC4gSW4gZXNzZW5jZSB0aGlzIGlzIGEgCisvKiBQcm92aWRlcyBubyBmdW5jdGlvbmFsaXR5LCBqdXN0IGNvbXBsZXRlcyB0aGUgaW9jdGwuIEluIGVzc2VuY2UgdGhpcyBpcyBhCiAgKiBqdXN0IGEgY29zbWV0aWMgaW9jdGwuCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTExMDQsNyArMTEwMyw3IEBACiAJCQkJCSAgICAma2V5KTsKIAkJfQogCQkvKgotCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgCisJCSAqIElmIGEgdmFsaWQga2V5IGlzIHNldCwgZW5jcnlwdGlvbiBzaG91bGQgYmUgZW5hYmxlZAogCQkgKiAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpLgogCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MKIAkJICovCkBAIC0xMTI2LDcgKzExMjUsNyBAQAogCX0KIAkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KIAlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKLQkJLyogRW5jb2RpbmcgZGlzYWJsZWQsIAorCQkvKiBFbmNvZGluZyBkaXNhYmxlZCwKIAkJICogYXV0aGVuID0gRE9UMTFfQVVUSF9PUzsKIAkJICogaW52b2tlID0gMDsKIAkJICogZXh1bmVuY3J5cHQgPSAwOyAqLwpAQCAtMTIxNCw3ICsxMjEzLDcgQEAKIAl2d3JxLT52YWx1ZSA9IChzMzIpIHIudSAvIDQ7CiAJdndycS0+Zml4ZWQgPSAxOwogCS8qIHJhZGlvIGlzIG5vdCB0dXJuZWQgb2YKLQkgKiBidHc6IGhvdyBpcyBwb3NzaWJsZSB0byB0dXJuIG9mZiBvbmx5IHRoZSByYWRpbyAKKwkgKiBidHc6IGhvdyBpcyBwb3NzaWJsZSB0byB0dXJuIG9mZiBvbmx5IHRoZSByYWRpbwogCSAqLwogCXZ3cnEtPmRpc2FibGVkID0gMDsKIApAQCAtMjM1NCwxNyArMjM1MywxNyBAQAogCQloYW5kbGVfcmVxdWVzdChwcml2LCBtbG1lLCBvaWQpOwogCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiQXV0aGVudGljYXRlIHJlcXVlc3QgKGV4KSIsIG1sbWUsIDEpOwogCi0JCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSIAorCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUgogCQkJCSYmIG1sbWVleC0+c3RhdGUgIT0gRE9UMTFfU1RBVEVfQVVUSElORykKIAkJCWJyZWFrOwogCiAJCWNvbmZpcm0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqX21sbWVleCkgKyA2LCBHRlBfQVRPTUlDKTsKIAotCQlpZiAoIWNvbmZpcm0pIAorCQlpZiAoIWNvbmZpcm0pCiAJCQlicmVhazsKIAogCQltZW1jcHkoJmNvbmZpcm0tPmFkZHJlc3MsIG1sbWVleC0+YWRkcmVzcywgRVRIX0FMRU4pOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQXV0aGVudGljYXRlIGZyb206IGFkZHJlc3M6XHQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgCisJCXByaW50ayhLRVJOX0RFQlVHICJBdXRoZW50aWNhdGUgZnJvbTogYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAogCQkJCW1sbWVleC0+YWRkcmVzc1swXSwKIAkJCQltbG1lZXgtPmFkZHJlc3NbMV0sCiAJCQkJbWxtZWV4LT5hZGRyZXNzWzJdLApAQCAtMjM5OCwxMCArMjM5NywxMCBAQAogCQloYW5kbGVfcmVxdWVzdChwcml2LCBtbG1lLCBvaWQpOwogCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiQXNzb2NpYXRlIHJlcXVlc3QgKGV4KSIsIG1sbWUsIDEpOwogCi0JCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSIAorCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUgogCQkJCSYmIG1sbWVleC0+c3RhdGUgIT0gRE9UMTFfU1RBVEVfQVNTT0NJTkcpCiAJCQlicmVhazsKLQkJCisKIAkJY29uZmlybSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfbWxtZWV4KSwgR0ZQX0FUT01JQyk7CiAKIAkJaWYgKCFjb25maXJtKQpAQCAtMjQxNyw3ICsyNDE2LDcgQEAKIAogCQlpZiAoIXdwYV9pZV9sZW4pIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJObyBXUEEgSUUgZm91bmQgZnJvbSAiCi0JCQkJCSJhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIAorCQkJCQkiYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAogCQkJCW1sbWVleC0+YWRkcmVzc1swXSwKIAkJCQltbG1lZXgtPmFkZHJlc3NbMV0sCiAJCQkJbWxtZWV4LT5hZGRyZXNzWzJdLApAQCAtMjQzNSwxNCArMjQzNCwxNCBAQAogCQltZ3Rfc2V0X3Zhcmxlbihwcml2LCBvaWQsIGNvbmZpcm0sIHdwYV9pZV9sZW4pOwogCiAJCWtmcmVlKGNvbmZpcm0pOwotCQkKKwogCQlicmVhazsKIAogCWNhc2UgRE9UMTFfT0lEX1JFQVNTT0NJQVRFRVg6CiAJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CiAJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJSZWFzc29jaWF0ZSByZXF1ZXN0IChleCkiLCBtbG1lLCAxKTsKIAotCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiAKKwkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIKIAkJCQkmJiBtbG1lZXgtPnN0YXRlICE9IERPVDExX1NUQVRFX0FTU09DSU5HKQogCQkJYnJlYWs7CiAKQEAgLTI0NjEsNyArMjQ2MCw3IEBACiAKIAkJaWYgKCF3cGFfaWVfbGVuKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gV1BBIElFIGZvdW5kIGZyb20gIgotCQkJCQkiYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCAKKwkJCQkJImFkZHJlc3M6XHQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKIAkJCQltbG1lZXgtPmFkZHJlc3NbMF0sCiAJCQkJbWxtZWV4LT5hZGRyZXNzWzFdLAogCQkJCW1sbWVleC0+YWRkcmVzc1syXSwKQEAgLTI0NzMsMTMgKzI0NzIsMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJY29uZmlybS0+c2l6ZSA9IHdwYV9pZV9sZW47IAorCQljb25maXJtLT5zaXplID0gd3BhX2llX2xlbjsKIAkJbWVtY3B5KCZjb25maXJtLT5kYXRhLCB3cGFfaWUsIHdwYV9pZV9sZW4pOwogCiAJCW1ndF9zZXRfdmFybGVuKHByaXYsIG9pZCwgY29uZmlybSwgd3BhX2llX2xlbik7CiAKIAkJa2ZyZWUoY29uZmlybSk7Ci0JCQorCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTI1NDUsMTAgKzI1NDQsMTAgQEAKICNkZWZpbmUgUFJJU00yX0hPU1RBUERfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU4gXAogKChpbnQpICgmKChzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKikgMCktPnUuZ2VuZXJpY19lbGVtLmRhdGEpKQogCi0vKiBNYXhpbXVtIGxlbmd0aCBmb3IgYWxnb3JpdGhtIG5hbWVzICgtMSBmb3IgbnVsIHRlcm1pbmF0aW9uKSAKKy8qIE1heGltdW0gbGVuZ3RoIGZvciBhbGdvcml0aG0gbmFtZXMgKC0xIGZvciBudWwgdGVybWluYXRpb24pCiAgKiB1c2VkIGluIGlvY3RsKCkgKi8KICNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgotCQorCiBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gewogCXUzMiBjbWQ7CiAJdTggc3RhX2FkZHJbRVRIX0FMRU5dOwpAQCAtMjYyMSw3ICsyNjIwLDcgQEAKIAkJCQkJICAgICZrZXkpOwogCQl9CiAJCS8qCi0JCSAqIElmIGEgdmFsaWQga2V5IGlzIHNldCwgZW5jcnlwdGlvbiBzaG91bGQgYmUgZW5hYmxlZCAKKwkJICogSWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uIHNob3VsZCBiZSBlbmFibGVkCiAJCSAqICh1c2VyIG1heSB0dXJuIGl0IG9mZiBsYXRlcikuCiAJCSAqIFRoaXMgaXMgYWxzbyBob3cgIml3Y29uZmlnIGV0aFgga2V5IG9uIiB3b3JrcwogCQkgKi8KQEAgLTI2NDMsNyArMjY0Miw3IEBACiAJfQogCS8qIG5vdyByZWFkIHRoZSBmbGFncyAqLwogCWlmIChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewotCQkvKiBFbmNvZGluZyBkaXNhYmxlZCwgCisJCS8qIEVuY29kaW5nIGRpc2FibGVkLAogCQkgKiBhdXRoZW4gPSBET1QxMV9BVVRIX09TOwogCQkgKiBpbnZva2UgPSAwOwogCQkgKiBleHVuZW5jcnlwdCA9IDA7ICovCkBAIC0yNzEwLDcgKzI3MDksNyBAQAogCiAJICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7CiAKLQkgICAgICAgaWYgKHJldCA9PSAwKSAKKwkgICAgICAgaWYgKHJldCA9PSAwKQogCQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXUEEgSUUgQXR0YWNobWVudCB3YXMgc2V0XG4iLAogCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKICAgICAgICB9CkBAIC0yODcwLDcgKzI4NjksNyBAQAogCQkJbWxtZSA9IERPVDExX01MTUVfQVVUTzsKIAkJCXByaW50aygiJXM6IERpc2FibGluZyBXUEFcbiIsIG5kZXYtPm5hbWUpOwogCQkJYnJlYWs7Ci0JCWNhc2UgMjogCisJCWNhc2UgMjoKIAkJY2FzZSAxOiAvKiBXUEEgKi8KIAkJCXByaW50aygiJXM6IEVuYWJsaW5nIFdQQVxuIiwgbmRldi0+bmFtZSk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCmluZGV4IDY1ZjMzYWMuLmU4MTgzZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqICAgICAgICAgICAgKEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KICAqICAgICAgICAgICAgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oCmluZGV4IDQxOWVkZjcuLmI3NTM0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgogICogIENvcHlyaWdodCAoQykgMjAwNCBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KQEAgLTIzLDcgKzIxLDcgQEAKICNpZiAhZGVmaW5lZChfSVNMX09JRF9IKQogI2RlZmluZSBfSVNMX09JRF9ICiAKLS8qIAorLyoKICAqIE1JQiByZWxhdGVkIGNvbnN0YW50IGFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIGNvbW11bmljYXRpbmcKICAqIHdpdGggdGhlIGRldmljZSBmaXJtd2FyZQogICovCkBAIC05OSwyMSArOTcsMjEgQEAKIAljaGFyIGRhdGFbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCi0vKiAKKy8qCiAgKiBpbiBjYXNlIGV2ZXJ5dGhpbmcncyBvaywgdGhlIGlubGluZWQgZnVuY3Rpb24gYmVsb3cgd2lsbCBiZQogICogb3B0aW1pemVkIGF3YXkgYnkgdGhlIGNvbXBpbGVyLi4uCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAogX19idWdfb25fd3Jvbmdfc3RydWN0X3NpemVzKHZvaWQpCiB7Ci0JQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9zc2lkKSAhPSAzNCk7Ci0JQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9rZXkpICE9IDM0KTsKLQlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpICE9IDEyKTsKLQlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWVleCkgIT0gMTQpOwotCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfYnVmZmVyKSAhPSA4KTsKLQlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2JzcykgIT0gNjApOwotCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfYnNzbGlzdCkgIT0gNCk7Ci0JQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9mcmVxdWVuY2llcykgIT0gMik7CisJQlVJTERfQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9zc2lkKSAhPSAzNCk7CisJQlVJTERfQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9rZXkpICE9IDM0KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWVleCkgIT0gMTQpOworCUJVSUxEX0JVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfYnVmZmVyKSAhPSA4KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2JzcykgIT0gNjApOworCUJVSUxEX0JVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfYnNzbGlzdCkgIT0gNCk7CisJQlVJTERfQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9mcmVxdWVuY2llcykgIT0gMik7CiB9CiAKIGVudW0gZG90MTFfc3RhdGVfdCB7CkBAIC0xNTQsMTMgKzE1MiwxMyBAQAogCiAvKiBQcmlzbSAiTml0cm8iIC8gRnJhbWVidXJzdCAvICJQYWNrZXQgRnJhbWUgR3JvdXBpbmciCiAgKiBWYWx1ZSBpcyBpbiBtaWNyb3NlY29uZHMuIFJlcHJlc2VudHMgdGhlICMgbWljcm9zZWNvbmRzCi0gKiB0aGUgZmlybXdhcmUgd2lsbCB0YWtlIHRvIGdyb3VwIGZyYW1lcyBiZWZvcmUgc2VuZGluZyBvdXQgdGhlbiBvdXQgCisgKiB0aGUgZmlybXdhcmUgd2lsbCB0YWtlIHRvIGdyb3VwIGZyYW1lcyBiZWZvcmUgc2VuZGluZyBvdXQgdGhlbiBvdXQKICAqIHRvZ2V0aGVyIHdpdGggYSBDU01BIGNvbnRlbnRpb24uIFdpdGhvdXQgdGhpcyBhbGwgZnJhbWVzIGFyZQotICogc2VudCB3aXRoIGEgQ1NNQSBjb250ZW50aW9uLiAKLSAqIEJpYmxpb2dyYXBoeTogCisgKiBzZW50IHdpdGggYSBDU01BIGNvbnRlbnRpb24uCisgKiBCaWJsaW9ncmFwaHk6CiAgKiBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL1BhcGVycy9QYWNrZXQuRnJhbWUuR3JvdXBpbmcuaHRtbAogICovCi1lbnVtIGRvdDExX21heGZyYW1lYnVyc3RfdCB7IAorZW51bSBkb3QxMV9tYXhmcmFtZWJ1cnN0X3QgewogCS8qIFZhbHVlcyBmb3IgRE9UMTFfT0lEX01BWEZSQU1FQlVSU1QgKi8KIAlET1QxMV9NQVhGUkFNRUJVUlNUX09GRiA9IDAsIC8qIENhcmQgZmlybXdhcmUgZGVmYXVsdCAqLwogCURPVDExX01BWEZSQU1FQlVSU1RfTUlYRURfU0FGRSA9IDY1MCwgLyogODAyLjExIGEsYixnIHNhZmUgKi8KQEAgLTE3Niw5ICsxNzQsOSBAQAogLyogU3VwcG9ydCBmb3IgODAyLjExIGxvbmcgYW5kIHNob3J0IGZyYW1lIHByZWFtYmxlcy4KICAqIExvbmcJIHByZWFtYmxlIHVzZXMgMTI4LWJpdCBzeW5jIGZpZWxkLCA4LWJpdCAgQ1JDCiAgKiBTaG9ydCBwcmVhbWJsZSB1c2VzIDU2LWJpdCAgc3luYyBmaWVsZCwgMTYtYml0IENSQwotICogCisgKgogICogODAyLjExYSAtLSBub3Qgc3VyZSwgYm90aCBvcHRpb25hbGx5ID8KLSAqIDgwMi4xMWIgc3VwcG9ydHMgbG9uZyBhbmQgb3B0aW9uYWxseSBzaG9ydCAKKyAqIDgwMi4xMWIgc3VwcG9ydHMgbG9uZyBhbmQgb3B0aW9uYWxseSBzaG9ydAogICogODAyLjExZyBzdXBwb3J0cyBib3RoICovCiBlbnVtIGRvdDExX3ByZWFtYmxlc2V0dGluZ3NfdCB7CiAJRE9UMTFfUFJFQU1CTEVTRVRUSU5HX0xPTkcgPSAwLApAQCAtMTk0LDcgKzE5Miw3IEBACiAgKiBMb25nIHVzZXMgODAyLjExYSBzbG90IHRpbWluZyAgKDkgdXNlYyA/KQogICogU2hvcnQgdXNlcyA4MDIuMTFiIHNsb3QgdGltaW5nICgyMCB1c2UgPykgKi8KIGVudW0gZG90MTFfc2xvdHNldHRpbmdzX3QgewotCURPVDExX1NMT1RTRVRUSU5HU19MT05HID0gMCwgCisJRE9UMTFfU0xPVFNFVFRJTkdTX0xPTkcgPSAwLAogCQkvKiBBbGxvd3MgKm9ubHkqIGxvbmcgODAyLjExYiBzbG90IHRpbWluZyAqLwogCURPVDExX1NMT1RTRVRUSU5HU19TSE9SVCA9IDEsCiAJCS8qIEFsbG93cyAqb25seSogbG9uZyA4MDIuMTFhIHNsb3QgdGltaW5nICovCkBAIC0yMDMsNyArMjAxLDcgQEAKIH07CiAKIC8qIEFsbCB5b3UgbmVlZCB0byBrbm93LCBFUlAgaXMgIkV4dGVuZGVkIFJhdGUgUEhZIi4KLSAqIEFuIEV4dGVuZGVkIFJhdGUgUEhZIChFUlApIFNUQSBvciBBUCBzaGFsbCBzdXBwb3J0IHRocmVlIGRpZmZlcmVudCAKKyAqIEFuIEV4dGVuZGVkIFJhdGUgUEhZIChFUlApIFNUQSBvciBBUCBzaGFsbCBzdXBwb3J0IHRocmVlIGRpZmZlcmVudAogICogcHJlYW1ibGUgYW5kIGhlYWRlciBmb3JtYXRzOgogICogTG9uZyAgcHJlYW1ibGUgKHJlZmVyIHRvIGFib3ZlKQogICogU2hvcnQgcHJlYW1ibGUgKHJlZmVyIHRvIGFib3ZlKQpAQCAtMjIxLDcgKzIxOSw3IEBACiAvKiAoRVJQIGlzICJFeHRlbmRlZCBSYXRlIFBIWSIpIFdheSB0byByZWFkIE5PTkVSUCBpcyBOT04tRVJQLSoKICAqIFRoZSBrZXkgaGVyZSBpcyBET1QxMSBOT04gRVJQIE5FVkVSIHByb3RlY3RzIGFnYWluc3QKICAqIE5PTiBFUlAgU1RBJ3MuIFlvdSAqZG9uJ3QqIHdhbnQgdGhpcyB1bmxlc3MKLSAqIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gSXQgbWVhbnMgeW91IHdpbGwgb25seSAKKyAqIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gSXQgbWVhbnMgeW91IHdpbGwgb25seQogICogZ2V0IEV4dGVuZGVkIFJhdGUgY2FwYWJpbGl0aWVzICovCiBlbnVtIGRvdDExX25vbmVycHByb3RlY3Rpb25fdCB7CiAJRE9UMTFfTk9ORVJQX05FVkVSID0gMCwKQEAgLTIyOSwxMyArMjI3LDEzIEBACiAJRE9UMTFfTk9ORVJQX0RZTkFNSUMgPSAyCiB9OwogCi0vKiBQcmVzZXQgT0lEIGNvbmZpZ3VyYXRpb24gZm9yIDgwMi4xMSBtb2RlcyAKLSAqIE5vdGU6IERPVDExX09JRF9DV1tNSU58TUFYXSBob2xkIHRoZSB2YWx1ZXMgb2YgdGhlIAorLyogUHJlc2V0IE9JRCBjb25maWd1cmF0aW9uIGZvciA4MDIuMTEgbW9kZXMKKyAqIE5vdGU6IERPVDExX09JRF9DV1tNSU58TUFYXSBob2xkIHRoZSB2YWx1ZXMgb2YgdGhlCiAgKiBEQ1MgTUlOfE1BWCBiYWNrb2ZmIHVzZWQgKi8KIGVudW0gZG90MTFfcHJvZmlsZV90IHsgLyogQW5kIHNldC9hbGxvd2VkIHZhbHVlcyAqLwogCS8qIEFsbG93ZWQgdmFsdWVzIGZvciBET1QxMV9PSURfUFJPRklMRVMgKi8KIAlET1QxMV9QUk9GSUxFX0JfT05MWSA9IDAsCi0JCS8qIERPVDExX09JRF9SQVRFUzogMSwgMiwgNS41LCAxMU1icHMgCisJCS8qIERPVDExX09JRF9SQVRFUzogMSwgMiwgNS41LCAxMU1icHMKIAkJICogRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1M6IERPVDExX1BSRUFNQkxFU0VUVElOR19EWU5BTUlDCiAJCSAqIERPVDExX09JRF9DV01JTjogMzEKIAkJICogRE9UMTFfT0lEX05PTkVQUk9URUNUSU9OOiBET1QxMV9OT0VSUF9EWU5BTUlDCkBAIC0yNzUsNyArMjczLDcgQEAKIAlPSURfSU5MX0NPTkZPUk1BTkNFX05PTkUgPSAwLAkvKiBQZXJmb3JtIGFjdGl2ZSBzY2FubmluZyAqLwogCU9JRF9JTkxfQ09ORk9STUFOQ0VfU1RSSUNUID0gMSwJLyogU3RyaWN0bHkgYWRoZXJlIHRvIDgwMi4xMWQgKi8KIAlPSURfSU5MX0NPTkZPUk1BTkNFX0ZMRVhJQkxFID0gMiwJLyogVXNlIHBhc3NlZCA4MDIuMTFkIGluZm8gdG8KLQkJKiBkZXRlcm1pbmUgY2hhbm5lbCBBTkQvT1IganVzdCBtYWtlIGFzc3VtcHRpb24gdGhhdCBhY3RpdmUgCisJCSogZGV0ZXJtaW5lIGNoYW5uZWwgQU5EL09SIGp1c3QgbWFrZSBhc3N1bXB0aW9uIHRoYXQgYWN0aXZlCiAJCSogY2hhbm5lbHMgYXJlIHZhbGlkICBjaGFubmVscyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwppbmRleCBlYzFjMDBmLi4xZTA2MDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgpAQCAtNDEzLDcgKzQxMiw3IEBACiAJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUFJFQk9PVCk7CiAKIAkvKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCAqLwotCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsgIAorCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKIAogCS8qIEZvciBzYWZldHkgcmVhc29ucywgd2UgbWF5IHdhbnQgdG8gZW5zdXJlIHRoYXQgbm8gRE1BIHRyYW5zZmVyIGlzCiAJICogY3VycmVudGx5IGluIHByb2dyZXNzIGJ5IGVtcHR5aW5nIHRoZSBUWCBhbmQgUlggcXVldWVzLiAqLwpAQCAtNDgwLDcgKzQ3OSw3IEBACiAKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPnJlc2V0X2RvbmUsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCisKIAkvKiBub3cgdGhlIGxhc3Qgc3RlcCBpcyB0byByZXNldCB0aGUgaW50ZXJmYWNlICovCiAJaXNsMzh4eF9pbnRlcmZhY2VfcmVzZXQocHJpdi0+ZGV2aWNlX2Jhc2UsIHByaXYtPmRldmljZV9ob3N0X2FkZHJlc3MpOwogCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BSRUlOSVQpOwpAQCAtNDg4LDcgKzQ4Nyw3IEBACiAgICAgICAgIGZvcihjb3VudCA9IDA7IGNvdW50IDwgMiAmJiByZXN1bHQ7IGNvdW50KyspIHsKIAkJLyogVGhlIHNvZnR3YXJlIHJlc2V0IGFja25vd2xlZGdlIG5lZWRzIGFib3V0IDIyMCBtc2VjIGhlcmUuCiAJCSAqIEJlIGNvbnNlcnZhdGl2ZSBhbmQgd2FpdCBmb3IgdXAgdG8gb25lIHNlY29uZC4gKi8KLQkKKwogCQlyZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CiAKIAkJaWYocmVtYWluaW5nID4gMCkgewpAQCAtNDk2LDcgKzQ5NSw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCS8qIElmIHdlJ3JlIGhlcmUgaXQncyBiZWNhdXNlIG91ciBJUlEgaGFzbid0IHlldCBnb25lIHRocm91Z2guIAorCQkvKiBJZiB3ZSdyZSBoZXJlIGl0J3MgYmVjYXVzZSBvdXIgSVJRIGhhc24ndCB5ZXQgZ29uZSB0aHJvdWdoLgogCQkgKiBSZXRyeSBhIGJpdCBtb3JlLi4uCiAJCSAqLwogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyAncmVzZXQgY29tcGxldGUnIElSUSBzZWVuIC0gcmV0cnlpbmdcbiIsCkBAIC01MTQsNyArNTEzLDcgQEAKIAogCS8qIE5vdyB0aGF0IHRoZSBkZXZpY2UgaXMgMTAwJSB1cCwgbGV0J3MgYWxsb3cKIAkgKiBmb3IgdGhlIG90aGVyIGludGVycnVwdHMgLS0KLQkgKiBOT1RFOiB0aGlzIGlzIG5vdCAqeWV0KiB0cnVlIHNpbmNlIHdlJ3ZlIG9ubHkgYWxsb3dlZCB0aGUgCisJICogTk9URTogdGhpcyBpcyBub3QgKnlldCogdHJ1ZSBzaW5jZSB3ZSd2ZSBvbmx5IGFsbG93ZWQgdGhlCiAJICogSU5JVCBpbnRlcnJ1cHQgb24gdGhlIElSUSBsaW5lLiBXZSBjYW4gcGVyaGFwcyBwb2xsCiAJICogdGhlIElSUSBsaW5lIHVudGlsIHdlIGtub3cgZm9yIHN1cmUgdGhlIHJlc2V0IHdlbnQgdGhyb3VnaCAqLwogCWlzbDM4eHhfZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKQEAgLTcxNiw3ICs3MTUsNyBAQAogCiAJcHJpc201NF9hY2xfaW5pdCgmcHJpdi0+YWNsKTsKIAlwcmlzbTU0X3dwYV9ic3NfaWVfaW5pdChwcml2KTsKLQlpZiAobWd0X2luaXQocHJpdikpIAorCWlmIChtZ3RfaW5pdChwcml2KSkKIAkJZ290byBvdXRfZnJlZTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaAppbmRleCAyZjdlNTI1ZC4uYTlhYTE2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgKQEAgLTEsNiArMSw1IEBACiAvKgotICogIAotICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgogICogIENvcHlyaWdodCAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KQEAgLTcyLDEyICs3MSwxMiBAQAogCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOwogCXNpemVfdCB3cGFfaWVfbGVuOwotCQorCiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJc3BpbmxvY2tfdCBzbG9jazsJLyogZ2VuZXJpYyBzcGlubG9jazsgKi8KLQkKKwogCXUzMiBwcml2X29pZDsKIAogCS8qIG91ciBtaWIgY2FjaGUgKi8KQEAgLTg1LDcgKzg0LDcgQEAKICAgICAgICAgc3RydWN0IHJ3X3NlbWFwaG9yZSBtaWJfc2VtOwogCXZvaWQgKiptaWI7CiAJY2hhciBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsKLQkKKwogCS8qIFRha2UgY2FyZSBvZiB0aGUgd2lyZWxlc3Mgc3RhdHMgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhdHNfd29yazsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHN0YXRzX3NlbTsKQEAgLTEyMCw3ICsxMTksNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCiAJLyogZGV2aWNlIHF1ZXVlIGludGVyZmFjZSBtZW1iZXJzICovCi0Jc3RydWN0IGlzbDM4eHhfY2IgKmNvbnRyb2xfYmxvY2s7CS8qIGRldmljZSBjb250cm9sIGJsb2NrIAorCXN0cnVjdCBpc2wzOHh4X2NiICpjb250cm9sX2Jsb2NrOwkvKiBkZXZpY2UgY29udHJvbCBibG9jawogCQkJCQkJCSAgICg9PSBkcml2ZXJfbWVtX2FkZHJlc3MhKSAqLwogCiAJLyogRWFjaCBxdWV1ZSBoYXMgdGhyZWUgaW5kZXhlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKaW5kZXggYTgyNjFkOC4uNjc2ZDgzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTQ4LDcgKzQ3LDcgQEAKIAkJLyogcmVhZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGZyYWdtZW50IHRvIGJlIGZyZWVkICovCiAJCWluZGV4ID0gcHJpdi0+ZnJlZV9kYXRhX3R4ICUgSVNMMzhYWF9DQl9UWF9RU0laRTsKIAotCQkvKiBjaGVjayBmb3IgaG9sZXMgaW4gdGhlIGFycmF5cyBjYXVzZWQgYnkgbXVsdGkgZnJhZ21lbnQgZnJhbWVzIAorCQkvKiBjaGVjayBmb3IgaG9sZXMgaW4gdGhlIGFycmF5cyBjYXVzZWQgYnkgbXVsdGkgZnJhZ21lbnQgZnJhbWVzCiAJCSAqIHNlYXJjaGluZyBmb3IgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZSAqLwogCQlpZiAocHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSAhPSAoZG1hX2FkZHJfdCkgTlVMTCkgewogCQkJLyogZW50cnkgaXMgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZQpAQCAtMjUzLDYgKzI1Miw3IEBACiAJICogaGVhZGVyIGFuZCB3aXRob3V0IHRoZSBGQ1MuIEJ1dCB0aGVyZSBhIGlzIGEgYml0IHRoYXQKIAkgKiBpbmRpY2F0ZXMgaWYgdGhlIHBhY2tldCBpcyBjb3JydXB0ZWQgOi0pICovCiAJc3RydWN0IHJmbW9uX2hlYWRlciAqaGRyID0gKHN0cnVjdCByZm1vbl9oZWFkZXIgKikgKCpza2IpLT5kYXRhOworCiAJaWYgKGhkci0+ZmxhZ3MgJiAweDAxKQogCQkvKiBUaGlzIG9uZSBpcyBiYWQuIERyb3AgaXQgISAqLwogCQlyZXR1cm4gLTE7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkJICAgIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyICopIHNrYl9wdXNoKCpza2IsCiAJCQkJCQkJICAgc2l6ZW9mIChzdHJ1Y3QKIAkJCQkJCQkJICAgYXZzXzgwMjExXzFfaGVhZGVyKSk7Ci0JCQorCiAJCWF2cy0+dmVyc2lvbiA9IGNwdV90b19iZTMyKFA4MDIxMUNBUFRVUkVfVkVSU0lPTik7CiAJCWF2cy0+bGVuZ3RoID0gY3B1X3RvX2JlMzIoc2l6ZW9mIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyKSk7CiAJCWF2cy0+bWFjdGltZSA9IGNwdV90b19iZTY0KGxlNjRfdG9fY3B1KGNsb2NrKSk7CkBAIC0zOTAsNyArMzkwLDcgQEAKIAkJCXN0cnVjdCByeF9hbm5leF9oZWFkZXIgKmFubmV4ID0KIAkJCSAgICAoc3RydWN0IHJ4X2FubmV4X2hlYWRlciAqKSBza2ItPmRhdGE7CiAJCQl3c3RhdHMubGV2ZWwgPSBhbm5leC0+cmZtb24ucnNzaTsKLQkJCS8qIFRoZSBub2lzZSB2YWx1ZSBjYW4gYmUgYSBiaXQgb3V0ZGF0ZWQgaWYgbm9ib2R5J3MgCisJCQkvKiBUaGUgbm9pc2UgdmFsdWUgY2FuIGJlIGEgYml0IG91dGRhdGVkIGlmIG5vYm9keSdzCiAJCQkgKiByZWFkaW5nIHdpcmVsZXNzIHN0YXRzLi4uICovCiAJCQl3c3RhdHMubm9pc2UgPSBwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MucXVhbC5ub2lzZTsKIAkJCXdzdGF0cy5xdWFsID0gd3N0YXRzLmxldmVsIC0gd3N0YXRzLm5vaXNlOwpAQCAtNDY0LDEwICs0NjQsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJLyogdXBkYXRlIHRoZSBmcmFnbWVudCBhZGRyZXNzICovCi0JCWNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5hZGRyZXNzID0gY3B1X3RvX2xlMzIoKHUzMikKLQkJCQkJCQkJCXByaXYtPgotCQkJCQkJCQkJcGNpX21hcF9yeF9hZGRyZXNzCi0JCQkJCQkJCQlbaW5kZXhdKTsKKwkJY29udHJvbF9ibG9jay0+cnhfZGF0YV9sb3dbaW5kZXhdLmFkZHJlc3MgPQorCQkJY3B1X3RvX2xlMzIoKHUzMilwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdKTsKIAkJd21iKCk7CiAKIAkJLyogaW5jcmVtZW50IHRoZSBkcml2ZXIgcmVhZCBwb2ludGVyICovCkBAIC00ODQsMTAgKzQ4MiwxMiBAQAogdm9pZAogaXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHZvaWQgKmRhdGEpCiB7Ci0JaXNscGNpX3ByaXZhdGUgKnByaXYgPSAoaXNscGNpX3ByaXZhdGUgKikgZGF0YTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IGRhdGE7CisKIAlpc2xwY2lfcmVzZXQocHJpdiwgMSk7Ci0JbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZGV2KTsKIAlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOworCXNtcF93bWIoKTsKKwluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5kZXYpOwogfQogCiB2b2lkCkBAIC00OTksMTIgKzQ5OSwxNCBAQAogCS8qIGluY3JlbWVudCB0aGUgdHJhbnNtaXQgZXJyb3IgY291bnRlciAqLwogCXN0YXRpc3RpY3MtPnR4X2Vycm9ycysrOwogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHR4X3RpbWVvdXQiLCBuZGV2LT5uYW1lKTsKIAlpZiAoIXByaXYtPnJlc2V0X3Rhc2tfcGVuZGluZykgewotCQlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOwotCQlwcmludGsoIiwgc2NoZWR1bGluZyBhIHJlc2V0Iik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogdHhfdGltZW91dCwgc2NoZWR1bGluZyByZXNldCIsIG5kZXYtPm5hbWUpOwogCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOwogCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF90YXNrKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXM6IHR4X3RpbWVvdXQsIHdhaXRpbmcgZm9yIHJlc2V0IiwgbmRldi0+bmFtZSk7CiAJfQotCXByaW50aygiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKaW5kZXggYmM5ZDdhNi4uMjY3ODk0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKaW5kZXggZjY5MmRjYy4uNTgyNTdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CiAgKgpAQCAtNDAsOCArMzksOCBAQAogbW9kdWxlX3BhcmFtKGluaXRfcGNpdG0sIGludCwgMCk7CiAKIC8qIEluIHRoaXMgb3JkZXI6IHZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IsIHN1YmRldmljZSwgY2xhc3MsIGNsYXNzX21hc2ssCi0gKiBkcml2ZXJfZGF0YSAKLSAqIElmIHlvdSBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhpcyBwbGVhc2UgY29udGFjdCBwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnIAorICogZHJpdmVyX2RhdGEKKyAqIElmIHlvdSBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhpcyBwbGVhc2UgY29udGFjdCBwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnCiAgKiBUaGUgbGF0ZXN0IGxpc3QgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wcmlzbTU0Lm9yZy9zdXBwb3J0ZWRfY2FyZHMucGhwICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcHJpc201NF9pZF90YmxbXSA9IHsKIAkvKiBJbnRlcnNpbCBQUklTTSBEdWV0dGUvUHJpc20gR1QgV2lyZWxlc3MgTEFOIGFkYXB0ZXIgKi8KQEAgLTEzMiwxNSArMTMxLDE1IEBACiAKIAkvKiAweDQwIGlzIHRoZSBwcm9ncmFtbWFibGUgdGltZXIgdG8gY29uZmlndXJlIHRoZSByZXNwb25zZSB0aW1lb3V0IChUUkRZX1RJTUVPVVQpCiAJICogMHg0MSBpcyB0aGUgcHJvZ3JhbW1hYmxlIHRpbWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdGltZW91dCAoUkVUUllfVElNRU9VVCkKLQkgKiAJVGhlIFJFVFJZX1RJTUVPVVQgaXMgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiByZXRyaWVzIHRoYXQgdGhlIGNvcmUsIGFzIGEKLQkgKiAJTWFzdGVyLCB3aWxsIHBlcmZvcm0gYmVmb3JlIGFiYW5kb25pbmcgYSBjeWNsZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yCi0JICogCVJFVFJZX1RJTUVPVVQgaXMgMHg4MCwgd2hpY2ggZmFyIGV4Y2VlZHMgdGhlIFBDSSAyLjEgcmVxdWlyZW1lbnQgZm9yIG5ldwotCSAqIAlkZXZpY2VzLiBBIHdyaXRlIG9mIHplcm8gdG8gdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgZGlzYWJsZXMgdGhpcwotCSAqIAlmdW5jdGlvbiB0byBhbGxvdyB1c2Ugd2l0aCBhbnkgbm9uLWNvbXBsaWFudCBsZWdhY3kgZGV2aWNlcyB0aGF0IG1heQotCSAqIAlleGVjdXRlIG1vcmUgcmV0cmllcy4KKwkgKglUaGUgUkVUUllfVElNRU9VVCBpcyB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHJldHJpZXMgdGhhdCB0aGUgY29yZSwgYXMgYQorCSAqCU1hc3Rlciwgd2lsbCBwZXJmb3JtIGJlZm9yZSBhYmFuZG9uaW5nIGEgY3ljbGUuIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorCSAqCVJFVFJZX1RJTUVPVVQgaXMgMHg4MCwgd2hpY2ggZmFyIGV4Y2VlZHMgdGhlIFBDSSAyLjEgcmVxdWlyZW1lbnQgZm9yIG5ldworCSAqCWRldmljZXMuIEEgd3JpdGUgb2YgemVybyB0byB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciBkaXNhYmxlcyB0aGlzCisJICoJZnVuY3Rpb24gdG8gYWxsb3cgdXNlIHdpdGggYW55IG5vbi1jb21wbGlhbnQgbGVnYWN5IGRldmljZXMgdGhhdCBtYXkKKwkgKglleGVjdXRlIG1vcmUgcmV0cmllcy4KIAkgKgotCSAqIAlXcml0aW5nIHplcm8gdG8gYm90aCB0aGVzZSB0d28gcmVnaXN0ZXJzIHdpbGwgZGlzYWJsZSBib3RoIHRpbWVvdXRzIGFuZAotCSAqIAkqY2FuKiBzb2x2ZSBwcm9ibGVtcyBjYXVzZWQgYnkgZGV2aWNlcyB0aGF0IGFyZSBzbG93IHRvIHJlc3BvbmQuCisJICoJV3JpdGluZyB6ZXJvIHRvIGJvdGggdGhlc2UgdHdvIHJlZ2lzdGVycyB3aWxsIGRpc2FibGUgYm90aCB0aW1lb3V0cyBhbmQKKwkgKgkqY2FuKiBzb2x2ZSBwcm9ibGVtcyBjYXVzZWQgYnkgZGV2aWNlcyB0aGF0IGFyZSBzbG93IHRvIHJlc3BvbmQuCiAJICoJTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAtIE1TVwogCSAqLwogCWlmICggaW5pdF9wY2l0bSA+PSAwICkgewpAQCAtMTcxLDE0ICsxNzAsMTUgQEAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCS8qIGVuYWJsZSBNV0kgKi8KLQlwY2lfc2V0X213aShwZGV2KTsKKwlpZiAoIXBjaV9zZXRfbXdpKHBkZXYpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogcGNpX3NldF9td2kocGRldikgc3VjY2VlZGVkXG4iLCBEUlZfTkFNRSk7CiAKIAkvKiBzZXR1cCB0aGUgbmV0d29yayBkZXZpY2UgaW50ZXJmYWNlIGFuZCBpdHMgc3RydWN0dXJlICovCiAJaWYgKCEobmRldiA9IGlzbHBjaV9zZXR1cChwZGV2KSkpIHsKIAkJLyogZXJyb3IgY29uZmlndXJpbmcgdGhlIGRyaXZlciBhcyBhIG5ldHdvcmsgZGV2aWNlICovCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgbmV0d29yayBkZXZpY2VcbiIsCiAJCSAgICAgICBEUlZfTkFNRSk7Ci0JCWdvdG8gZG9fcGNpX3JlbGVhc2VfcmVnaW9uczsKKwkJZ290byBkb19wY2lfY2xlYXJfbXdpOwogCX0KIAogCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKQEAgLTIwOCw2ICsyMDgsOCBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlmcmVlX25ldGRldihuZGV2KTsKIAlwcml2ID0gTlVMTDsKKyAgICAgIGRvX3BjaV9jbGVhcl9td2k6CisJcGNpX2NsZWFyX213aShwZGV2KTsKICAgICAgIGRvX3BjaV9yZWxlYXNlX3JlZ2lvbnM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKICAgICAgIGRvX3BjaV9kaXNhYmxlX2RldmljZToKQEAgLTI0MSw3ICsyNDMsNyBAQAogCQlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CiAJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX09GRik7CiAJCS8qIFRoaXMgYmVsbG93IGNhdXNlcyBhIGxvY2t1cCBhdCBybW1vZCB0aW1lLiBJdCBtaWdodCBiZQotCQkgKiBiZWNhdXNlIHNvbWUgaW50ZXJydXB0cyBzdGlsbCBsaW5nZXIgYWZ0ZXIgcm1tb2QgdGltZSwgCisJCSAqIGJlY2F1c2Ugc29tZSBpbnRlcnJ1cHRzIHN0aWxsIGxpbmdlciBhZnRlciBybW1vZCB0aW1lLAogCQkgKiBzZWUgYnVnICMxNyAqLwogCQkvKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDMpOyovCS8qIHRyeSB0byBwb3dlci1vZmYgKi8KIAl9CkBAIC0yNTUsNiArMjU3LDggQEAKIAlmcmVlX25ldGRldihuZGV2KTsKIAlwcml2ID0gTlVMTDsKIAorCXBjaV9jbGVhcl9td2kocGRldik7CisKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpAQCAtMjg4LDEyICsyOTIsMTkgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJaW50IGVycjsKKwogCUJVR19PTighcHJpdik7CiAKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQogCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGdvdCByZXN1bWUgcmVxdWVzdFxuIiwgbmRldi0+bmFtZSk7CiAKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAogCS8qIGFscmlnaHQgbGV0J3MgZ28gaW50byB0aGUgUFJFQk9PVCBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwppbmRleCAyZTA2MWE4Li4wMzZhODc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqICBDb3B5cmlnaHQgMjAwNCBKZW5zIE1hdXJlciA8SmVucy5NYXVyZXJAZ214Lm5ldD4KICAqCkBAIC01MDIsNyArNTAxLDcgQEAKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlXG4iLAogCSAgICAgICBuZGV2LT5uYW1lKTsKIAotCS8qIFRPRE86IHdlIHNob3VsZCByZXNldCB0aGUgZGV2aWNlIGhlcmUgKi8gICAgIAorCS8qIFRPRE86IHdlIHNob3VsZCByZXNldCB0aGUgZGV2aWNlIGhlcmUgKi8KICBvdXQ6CiAJZmluaXNoX3dhaXQoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCk7CiAJdXAoJnByaXYtPm1nbXRfc2VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKaW5kZXggMjk4MmJlMy4uZmM1M2I1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgogICoKQEAgLTM2LDggKzM1LDggQEAKIAogCiAvKiBHZW5lcmFsIGRyaXZlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBQQ0lERVZJQ0VfTEFURU5DWV9USU1FUl9NSU4gCQkweDQwCi0jZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCAJCTB4NTAKKyNkZWZpbmUgUENJREVWSUNFX0xBVEVOQ1lfVElNRVJfTUlOCQkweDQwCisjZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTAkJMHg1MAogCiAvKiBEZWJ1Z2dpbmcgdmVyYm9zZSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBTSE9XX05PVEhJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAkvKiBvdmVycnVsZXMgZXZlcnl0aGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwppbmRleCBlYmIyMzg3Li5mYmM1MmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICAgCisvKgogICogIENvcHlyaWdodCAoQykgMjAwMywyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC01MDMsNyArNTAzLDcgQEAKIAkJfQogCQlpZiAocmV0IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikKIAkJCXJldCA9IC1FSU87Ci0JfSBlbHNlIAorCX0gZWxzZQogCQlyZXQgPSAtRUlPOwogCiAJLyogcmUtc2V0IGdpdmVuIGRhdGEgdG8gd2hhdCBpdCB3YXMgKi8KQEAgLTcyNyw3ICs3MjcsNyBAQAogICogTUVESVVNTElNSVQsQkVBQ09OUEVSSU9ELERUSU1QRVJJT0QsQVRJTVdJTkRPVyxMSVNURU5JTlRFUlZBTAogICogRlJFUVVFTkNZLEVYVEVOREVEUkFURVMuCiAgKgotICogVGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHNldCBFU1NJRC4gTm90ZSB0aG91Z2ggdGhhdCB0aGV5IG1heSBnZXQgCisgKiBUaGUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2V0IEVTU0lELiBOb3RlIHRob3VnaCB0aGF0IHRoZXkgbWF5IGdldAogICogdW5sYXRjaCBiZWZvcmUgdGhvdWdoIGJ5IHNldHRpbmcgYW5vdGhlciBPSUQuICovCiAjaWYgMAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oCmluZGV4IGQ3MWVjYTUuLmFhMWQxNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmgKQEAgLTEsNCArMSw0IEBACi0vKiAgCisvKgogICogIChDKSAyMDA0IE1hcmdpdCBTY2h1YmVydC1XaGlsZSA8bWFyZ2l0c3dAdC1vbmxpbmUuZGU+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNiw3ICsxNiw3IEBACiAgKgogICovCiAKLS8qICAKKy8qCiAgKglDb21wYXRpYmlsaXR5IGhlYWRlciBmaWxlIHRvIGFpZCBzdXBwb3J0IG9mIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDdmYmZjOWUuLjg4ZTEwYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC00MDgsMTEgKzQwOCw4IEBACiAjZGVmaW5lIE1BWF9UVVBMRV9TSVpFIDEyOAogc3RhdGljIGludCByYXlfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICBpbnQgbGFzdF9mbiA9IDAsIGxhc3RfcmV0ID0gMDsKICAgICBpbnQgaTsKLSAgICB1X2NoYXIgYnVmW01BWF9UVVBMRV9TSVpFXTsKICAgICB3aW5fcmVxX3QgcmVxOwogICAgIG1lbXJlcV90IG1lbTsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbGluay0+cHJpdjsKQEAgLTQyMCwyOSArNDE3LDEyIEBACiAKICAgICBERUJVRygxLCAicmF5X2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICAvKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24gcmVncyAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gTUFYX1RVUExFX1NJWkU7Ci0gICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogICAgIC8qIERldGVybWluZSBjYXJkIHR5cGUgYW5kIGZpcm13YXJlIHZlcnNpb24gKi8KLSAgICBidWZbMF0gPSBidWZbTUFYX1RVUExFX1NJWkUgLSAxXSA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBNQVhfVFVQTEVfU0laRTsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDI7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0KLSAgICBmb3IgKGk9MDsgaTx0dXBsZS5UdXBsZURhdGFMZW4gLSA0OyBpKyspIAotICAgICAgICBpZiAoYnVmW2ldID09IDApIGJ1ZltpXSA9ICcgJzsKLSAgICBwcmludGsoS0VSTl9JTkZPICJyYXlfY3MgRGV0ZWN0ZWQ6ICVzXG4iLGJ1Zik7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2NzIERldGVjdGVkOiAlcyVzJXMlc1xuIiwKKwkgICBsaW5rLT5wcm9kX2lkWzBdID8gbGluay0+cHJvZF9pZFswXSA6ICIgIiwKKwkgICBsaW5rLT5wcm9kX2lkWzFdID8gbGluay0+cHJvZF9pZFsxXSA6ICIgIiwKKwkgICBsaW5rLT5wcm9kX2lkWzJdID8gbGluay0+cHJvZF9pZFsyXSA6ICIgIiwKKwkgICBsaW5rLT5wcm9kX2lkWzNdID8gbGluay0+cHJvZF9pZFszXSA6ICIgIik7CiAKICAgICAvKiBOb3cgYWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAogICAgICAgIGFjdHVhbGx5IGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jCmluZGV4IGJjYzcwMzguLmNmMmQxNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3BlY3RydW1fY3MuYwpAQCAtNjQ3LDIxICs2NDcsNiBAQAogCWNpc3BhcnNlX3QgcGFyc2U7CiAJdm9pZCBfX2lvbWVtICptZW07CiAKLQkvKgotCSAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMKLQkgKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KLQkgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAkvKiBMb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLwogCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAogCQkgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpKTsKQEAgLTY4MSw2ICs2NjYsMTAgQEAKIAkgKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCiAJICovCiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuVHVwbGVEYXRhID0gYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKIAlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwogCXdoaWxlICgxKSB7CiAJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKaW5kZXggYWFmYjMwMS4uMjMzZDkwNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKQEAgLTM5MzksMTEgKzM5MzksOCBAQAogc3RhdGljIGlubGluZSBpbnQKIHd2X3BjbWNpYV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKglsaW5rKQogewotICB0dXBsZV90CQl0dXBsZTsKLSAgY2lzcGFyc2VfdAkJcGFyc2U7CiAgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGxpbmstPnByaXY7CiAgIGludAkJCWk7Ci0gIHVfY2hhcgkJYnVmWzY0XTsKICAgd2luX3JlcV90CQlyZXE7CiAgIG1lbXJlcV90CQltZW07CiAgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0zOTUzLDM2ICszOTUwLDYgQEAKICAgcHJpbnRrKEtFUk5fREVCVUcgIi0+d3ZfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAjZW5kaWYKIAotICAvKgotICAgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICogcmVnaXN0ZXJzLgotICAgKi8KLSAgZG8KLSAgICB7Ci0gICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpOwotICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQotCWJyZWFrOwotICAgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLSAgICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgICAgaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwotICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQotCWJyZWFrOwotICAgICAgaSA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0gICAgICBpZihpICE9IENTX1NVQ0NFU1MpCi0JYnJlYWs7Ci0gICAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLSAgICB9Ci0gIHdoaWxlKDApOwotICBpZihpICE9IENTX1NVQ0NFU1MpCi0gICAgewotICAgICAgY3NfZXJyb3IobGluaywgUGFyc2VUdXBsZSwgaSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCiAgIGRvCiAgICAgewogICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCmluZGV4IDViOThhNzguLjU4M2UwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCkBAIC0xOTY2LDI1ICsxOTY2LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgd2wzNTAxX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgcGFyc2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAJaW50IGkgPSAwLCBqLCBsYXN0X2ZuLCBsYXN0X3JldDsKLQl1bnNpZ25lZCBjaGFyIGJmWzY0XTsKIAlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXM7CiAKLQkvKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZyByZWdpc3RlcnMuICovCi0JdHVwbGUuQXR0cmlidXRlcwk9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlCT0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCXR1cGxlLlR1cGxlRGF0YQkJPSBiZjsKLQl0dXBsZS5UdXBsZURhdGFNYXgJPSBzaXplb2YoYmYpOwotCXR1cGxlLlR1cGxlT2Zmc2V0CT0gMDsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UJPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQJPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAkvKiBUcnkgYWxsb2NhdGluZyBJTyBwb3J0cy4gIFRoaXMgdHJpZXMgYSBmZXcgZml4ZWQgYWRkcmVzc2VzLiAgSWYgeW91CiAJICogd2FudCwgeW91IGNhbiBhbHNvIHJlYWQgdGhlIGNhcmQncyBjb25maWcgdGFibGUgdG8gcGljayBhZGRyZXNzZXMgLS0KIAkgKiBzZWUgdGhlIHNlcmlhbCBkcml2ZXIgZm9yIGFuIGV4YW1wbGUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMDEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCmluZGV4IDM2YjI5ZmYuLjZjYjY2YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCkBAIC0xODI4LDEwICsxODI4LDggQEAKIAkvKiBMZWF2ZSB0aGUgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCiAJemQxMjAxX2RvY21kKHpkLCBaRDEyMDFfQ01EQ09ERV9JTklULCAwLCAwLCAwKTsKIGVycl96ZDoKLQlpZiAoemQtPnR4X3VyYikKLQkJdXNiX2ZyZWVfdXJiKHpkLT50eF91cmIpOwotCWlmICh6ZC0+cnhfdXJiKQotCQl1c2JfZnJlZV91cmIoemQtPnJ4X3VyYik7CisJdXNiX2ZyZWVfdXJiKHpkLT50eF91cmIpOworCXVzYl9mcmVlX3VyYih6ZC0+cnhfdXJiKTsKIAlrZnJlZSh6ZCk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwppbmRleCBhYTY2MWIyLi44YmU5OWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCkBAIC0xMDc2LDYgKzEwNzYsMzEgQEAKIAlyZXR1cm4gemRfaW93cml0ZTMyX2xvY2tlZChjaGlwLCByYXRlcywgQ1JfTUFOREFUT1JZX1JBVEVfVEJMKTsKIH0KIAoraW50IHpkX2NoaXBfc2V0X3J0c19jdHNfcmF0ZV9sb2NrZWQoc3RydWN0IHpkX2NoaXAgKmNoaXAsCisJdTggcnRzX3JhdGUsIGludCBwcmVhbWJsZSkKK3sKKwlpbnQgcnRzX21vZCA9IFpEX1JYX0NDSzsKKwl1MzIgdmFsdWUgPSAwOworCisJLyogTW9kdWxhdGlvbiBiaXQgKi8KKwlpZiAoWkRfQ1NfVFlQRShydHNfcmF0ZSkgPT0gWkRfQ1NfT0ZETSkKKwkJcnRzX21vZCA9IFpEX1JYX09GRE07CisKKwlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJydHNfcmF0ZT0leCBwcmVhbWJsZT0leFxuIiwKKwkJcnRzX3JhdGUsIHByZWFtYmxlKTsKKworCXZhbHVlIHw9IHJ0c19yYXRlIDw8IFJUU0NUU19TSF9SVFNfUkFURTsKKwl2YWx1ZSB8PSBydHNfbW9kIDw8IFJUU0NUU19TSF9SVFNfTU9EX1RZUEU7CisJdmFsdWUgfD0gcHJlYW1ibGUgPDwgUlRTQ1RTX1NIX1JUU19QTUJfVFlQRTsKKwl2YWx1ZSB8PSBwcmVhbWJsZSA8PCBSVFNDVFNfU0hfQ1RTX1BNQl9UWVBFOworCisJLyogV2UgYWx3YXlzIHNlbmQgMTFNIHNlbGYtQ1RTIG1lc3NhZ2VzLCBsaWtlIHRoZSB2ZW5kb3IgZHJpdmVyLiAqLworCXZhbHVlIHw9IFpEX0NDS19SQVRFXzExTSA8PCBSVFNDVFNfU0hfQ1RTX1JBVEU7CisJdmFsdWUgfD0gWkRfUlhfQ0NLIDw8IFJUU0NUU19TSF9DVFNfTU9EX1RZUEU7CisKKwlyZXR1cm4gemRfaW93cml0ZTMyX2xvY2tlZChjaGlwLCB2YWx1ZSwgQ1JfUlRTX0NUU19SQVRFKTsKK30KKwogaW50IHpkX2NoaXBfZW5hYmxlX2h3aW50KHN0cnVjdCB6ZF9jaGlwICpjaGlwKQogewogCWludCByOwpAQCAtMTM1NSwxNyArMTM4MCwxMiBAQAogCXJldHVybiByOwogfQogCi1pbnQgemRfY2hpcF9zZXRfYmFzaWNfcmF0ZXMoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUxNiBjcl9yYXRlcykKK2ludCB6ZF9jaGlwX3NldF9iYXNpY19yYXRlc19sb2NrZWQoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUxNiBjcl9yYXRlcykKIHsKLQlpbnQgcjsKKwlaRF9BU1NFUlQoKGNyX3JhdGVzICYgfihDUl9SQVRFU184MDIxMUIgfCBDUl9SQVRFU184MDIxMUcpKSA9PSAwKTsKKwlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICIleFxuIiwgY3JfcmF0ZXMpOwogCi0JaWYgKGNyX3JhdGVzICYgfihDUl9SQVRFU184MDIxMUJ8Q1JfUkFURVNfODAyMTFHKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JciA9IHpkX2lvd3JpdGUzMl9sb2NrZWQoY2hpcCwgY3JfcmF0ZXMsIENSX0JBU0lDX1JBVEVfVEJMKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLQlyZXR1cm4gcjsKKwlyZXR1cm4gemRfaW93cml0ZTMyX2xvY2tlZChjaGlwLCBjcl9yYXRlcywgQ1JfQkFTSUNfUkFURV9UQkwpOwogfQogCiBzdGF0aWMgaW50IG9mZG1fcXVhbF9kYih1OCBzdGF0dXNfcXVhbGl0eSwgdTggcmF0ZSwgdW5zaWduZWQgaW50IHNpemUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKaW5kZXggYWU1OTU5Ny4uY2E4OTJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaApAQCAtMzM3LDI0ICszMzcsMjQgQEAKICNkZWZpbmUgQ1JfTUFDX1BTX1NUQVRFCQkJQ1RMX1JFRygweDA1MEMpCiAKICNkZWZpbmUgQ1JfSU5URVJSVVBUCQkJQ1RMX1JFRygweDA1MTApCi0jZGVmaW5lIElOVF9UWF9DT01QTEVURQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgSU5UX1JYX0NPTVBMRVRFCQkJMHgwMDAwMDAwMgotI2RlZmluZSBJTlRfUkVUUllfRkFJTAkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgSU5UX1dBS0VVUAkJCTB4MDAwMDAwMDgKLSNkZWZpbmUgSU5UX0RUSU1fTk9USUZZCQkJMHgwMDAwMDAyMAotI2RlZmluZSBJTlRfQ0ZHX05FWFRfQkNOCQkweDAwMDAwMDQwCi0jZGVmaW5lIElOVF9CVVNfQUJPUlQJCQkweDAwMDAwMDgwCi0jZGVmaW5lIElOVF9UWF9GSUZPX1JFQURZCQkweDAwMDAwMTAwCi0jZGVmaW5lIElOVF9VQVJUCQkJMHgwMDAwMDIwMAotI2RlZmluZSBJTlRfVFhfQ09NUExFVEVfRU4JCTB4MDAwMTAwMDAKLSNkZWZpbmUgSU5UX1JYX0NPTVBMRVRFX0VOCQkweDAwMDIwMDAwCi0jZGVmaW5lIElOVF9SRVRSWV9GQUlMX0VOCQkweDAwMDQwMDAwCi0jZGVmaW5lIElOVF9XQUtFVVBfRU4JCQkweDAwMDgwMDAwCi0jZGVmaW5lIElOVF9EVElNX05PVElGWV9FTgkJMHgwMDIwMDAwMAotI2RlZmluZSBJTlRfQ0ZHX05FWFRfQkNOX0VOCQkweDAwNDAwMDAwCi0jZGVmaW5lIElOVF9CVVNfQUJPUlRfRU4JCTB4MDA4MDAwMDAKLSNkZWZpbmUgSU5UX1RYX0ZJRk9fUkVBRFlfRU4JCTB4MDEwMDAwMDAKLSNkZWZpbmUgSU5UX1VBUlRfRU4JCQkweDAyMDAwMDAwCisjZGVmaW5lIElOVF9UWF9DT01QTEVURQkJCSgxIDw8ICAwKQorI2RlZmluZSBJTlRfUlhfQ09NUExFVEUJCQkoMSA8PCAgMSkKKyNkZWZpbmUgSU5UX1JFVFJZX0ZBSUwJCQkoMSA8PCAgMikKKyNkZWZpbmUgSU5UX1dBS0VVUAkJCSgxIDw8ICAzKQorI2RlZmluZSBJTlRfRFRJTV9OT1RJRlkJCQkoMSA8PCAgNSkKKyNkZWZpbmUgSU5UX0NGR19ORVhUX0JDTgkJKDEgPDwgIDYpCisjZGVmaW5lIElOVF9CVVNfQUJPUlQJCQkoMSA8PCAgNykKKyNkZWZpbmUgSU5UX1RYX0ZJRk9fUkVBRFkJCSgxIDw8ICA4KQorI2RlZmluZSBJTlRfVUFSVAkJCSgxIDw8ICA5KQorI2RlZmluZSBJTlRfVFhfQ09NUExFVEVfRU4JCSgxIDw8IDE2KQorI2RlZmluZSBJTlRfUlhfQ09NUExFVEVfRU4JCSgxIDw8IDE3KQorI2RlZmluZSBJTlRfUkVUUllfRkFJTF9FTgkJKDEgPDwgMTgpCisjZGVmaW5lIElOVF9XQUtFVVBfRU4JCQkoMSA8PCAxOSkKKyNkZWZpbmUgSU5UX0RUSU1fTk9USUZZX0VOCQkoMSA8PCAyMSkKKyNkZWZpbmUgSU5UX0NGR19ORVhUX0JDTl9FTgkJKDEgPDwgMjIpCisjZGVmaW5lIElOVF9CVVNfQUJPUlRfRU4JCSgxIDw8IDIzKQorI2RlZmluZSBJTlRfVFhfRklGT19SRUFEWV9FTgkJKDEgPDwgMjQpCisjZGVmaW5lIElOVF9VQVJUX0VOCQkJKDEgPDwgMjUpCiAKICNkZWZpbmUgQ1JfVFNGX0xPV19QQVJUCQkJQ1RMX1JFRygweDA1MTQpCiAjZGVmaW5lIENSX1RTRl9ISUdIX1BBUlQJCUNUTF9SRUcoMHgwNTE4KQpAQCAtMzk4LDE4ICszOTgsMTggQEAKICAqIGRldmljZSB3aWxsIHVzZSBhIHJhdGUgaW4gdGhpcyB0YWJsZSB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmF0ZQogICogb2YgdGhlIGluY29taW5nIGZyYW1lIHdoaWNoIHByb21wdGVkIHRoZSByZXNwb25zZSAqLwogI2RlZmluZSBDUl9CQVNJQ19SQVRFX1RCTAkJQ1RMX1JFRygweDA2MzApCi0jZGVmaW5lIENSX1JBVEVfMU0JMHgwMDAxCS8qIDgwMi4xMWIgKi8KLSNkZWZpbmUgQ1JfUkFURV8yTQkweDAwMDIJLyogODAyLjExYiAqLwotI2RlZmluZSBDUl9SQVRFXzVfNU0JMHgwMDA0CS8qIDgwMi4xMWIgKi8KLSNkZWZpbmUgQ1JfUkFURV8xMU0JMHgwMDA4CS8qIDgwMi4xMWIgKi8KLSNkZWZpbmUgQ1JfUkFURV82TSAgICAgIDB4MDEwMAkvKiA4MDIuMTFnICovCi0jZGVmaW5lIENSX1JBVEVfOU0gICAgICAweDAyMDAJLyogODAyLjExZyAqLwotI2RlZmluZSBDUl9SQVRFXzEyTQkweDA0MDAJLyogODAyLjExZyAqLwotI2RlZmluZSBDUl9SQVRFXzE4TQkweDA4MDAJLyogODAyLjExZyAqLwotI2RlZmluZSBDUl9SQVRFXzI0TSAgICAgMHgxMDAwCS8qIDgwMi4xMWcgKi8KLSNkZWZpbmUgQ1JfUkFURV8zNk0gICAgIDB4MjAwMAkvKiA4MDIuMTFnICovCi0jZGVmaW5lIENSX1JBVEVfNDhNICAgICAweDQwMDAJLyogODAyLjExZyAqLwotI2RlZmluZSBDUl9SQVRFXzU0TSAgICAgMHg4MDAwCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV8xTQkoMSA8PCAgMCkJLyogODAyLjExYiAqLworI2RlZmluZSBDUl9SQVRFXzJNCSgxIDw8ICAxKQkvKiA4MDIuMTFiICovCisjZGVmaW5lIENSX1JBVEVfNV81TQkoMSA8PCAgMikJLyogODAyLjExYiAqLworI2RlZmluZSBDUl9SQVRFXzExTQkoMSA8PCAgMykJLyogODAyLjExYiAqLworI2RlZmluZSBDUl9SQVRFXzZNICAgICAgKDEgPDwgIDgpCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV85TSAgICAgICgxIDw8ICA5KQkvKiA4MDIuMTFnICovCisjZGVmaW5lIENSX1JBVEVfMTJNCSgxIDw8IDEwKQkvKiA4MDIuMTFnICovCisjZGVmaW5lIENSX1JBVEVfMThNCSgxIDw8IDExKQkvKiA4MDIuMTFnICovCisjZGVmaW5lIENSX1JBVEVfMjRNICAgICAoMSA8PCAxMikJLyogODAyLjExZyAqLworI2RlZmluZSBDUl9SQVRFXzM2TSAgICAgKDEgPDwgMTMpCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV80OE0gICAgICgxIDw8IDE0KQkvKiA4MDIuMTFnICovCisjZGVmaW5lIENSX1JBVEVfNTRNICAgICAoMSA8PCAxNSkJLyogODAyLjExZyAqLwogI2RlZmluZSBDUl9SQVRFU184MDIxMUcJMHhmZjAwCiAjZGVmaW5lIENSX1JBVEVTXzgwMjExQgkweDAwMGYKIApAQCAtNDIwLDE1ICs0MjAsMjQgQEAKICNkZWZpbmUgQ1JfTUFOREFUT1JZX1JBVEVfVEJMCQlDVExfUkVHKDB4MDYzNCkKICNkZWZpbmUgQ1JfUlRTX0NUU19SQVRFCQkJQ1RMX1JFRygweDA2MzgpCiAKKy8qIFRoZXNlIGFyZSBhbGwgYml0IGluZGV4ZXMgaW4gQ1JfUlRTX0NUU19SQVRFLCBzbyByZW1lbWJlciB0byBzaGlmdC4gKi8KKyNkZWZpbmUgUlRTQ1RTX1NIX1JUU19SQVRFCQkwCisjZGVmaW5lIFJUU0NUU19TSF9FWFBfQ1RTX1JBVEUJCTQKKyNkZWZpbmUgUlRTQ1RTX1NIX1JUU19NT0RfVFlQRQkJOAorI2RlZmluZSBSVFNDVFNfU0hfUlRTX1BNQl9UWVBFCQk5CisjZGVmaW5lIFJUU0NUU19TSF9DVFNfUkFURQkJMTYKKyNkZWZpbmUgUlRTQ1RTX1NIX0NUU19NT0RfVFlQRQkJMjQKKyNkZWZpbmUgUlRTQ1RTX1NIX0NUU19QTUJfVFlQRQkJMjUKKwogI2RlZmluZSBDUl9XRVBfUFJPVEVDVAkJCUNUTF9SRUcoMHgwNjNDKQogI2RlZmluZSBDUl9SWF9USFJFU0hPTEQJCQlDVExfUkVHKDB4MDY0MCkKIAogLyogcmVnaXN0ZXIgZm9yIGNvbnRyb2xsaW5nIHRoZSBMRURTICovCiAjZGVmaW5lIENSX0xFRAkJCQlDVExfUkVHKDB4MDY0NCkKIC8qIG1hc2tzIGZvciBjb250cm9sbGluZyBMRURzICovCi0jZGVmaW5lIExFRDEJCQkJMHgwMTAwCi0jZGVmaW5lIExFRDIJCQkJMHgwMjAwCi0jZGVmaW5lIExFRF9TVwkJCQkweDA0MDAKKyNkZWZpbmUgTEVEMQkJCQkoMSA8PCAgOCkKKyNkZWZpbmUgTEVEMgkJCQkoMSA8PCAgOSkKKyNkZWZpbmUgTEVEX1NXCQkJCSgxIDw8IDEwKQogCiAvKiBTZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIG92ZXIuCiAgKi8KQEAgLTQ1NSwxOCArNDY0LDE4IEBACiAgKiByZWdpc3RlcnMsIHNvIG9uZSBjb3VsZCBhcmd1ZSBpdCBpcyBhIExPQ0sgYml0LiBCdXQgY2FsbGluZyBpdAogICogTE9DS19QSFlfUkVHUyBtYWtlcyBpdCBjb25mdXNpbmcuCiAgKi8KLSNkZWZpbmUgVU5MT0NLX1BIWV9SRUdTCQkJMHgwMDgwCisjZGVmaW5lIFVOTE9DS19QSFlfUkVHUwkJCSgxIDw8IDcpCiAKICNkZWZpbmUgQ1JfREVWSUNFX1NUQVRFCQkJQ1RMX1JFRygweDA2ODQpCiAjZGVmaW5lIENSX1VOREVSUlVOX0NOVAkJCUNUTF9SRUcoMHgwNjg4KQogCiAjZGVmaW5lIENSX1JYX0ZJTFRFUgkJCUNUTF9SRUcoMHgwNjhjKQotI2RlZmluZSBSWF9GSUxURVJfQVNTT0NfUkVTUE9OU0UJMHgwMDAyCi0jZGVmaW5lIFJYX0ZJTFRFUl9SRUFTU09DX1JFU1BPTlNFCTB4MDAwOAotI2RlZmluZSBSWF9GSUxURVJfUFJPQkVfUkVTUE9OU0UJMHgwMDIwCi0jZGVmaW5lIFJYX0ZJTFRFUl9CRUFDT04JCTB4MDEwMAotI2RlZmluZSBSWF9GSUxURVJfRElTQVNTT0MJCTB4MDQwMAotI2RlZmluZSBSWF9GSUxURVJfQVVUSAkJCTB4MDgwMAorI2RlZmluZSBSWF9GSUxURVJfQVNTT0NfUkVTUE9OU0UJKDEgPDwgIDEpCisjZGVmaW5lIFJYX0ZJTFRFUl9SRUFTU09DX1JFU1BPTlNFCSgxIDw8ICAzKQorI2RlZmluZSBSWF9GSUxURVJfUFJPQkVfUkVTUE9OU0UJKDEgPDwgIDUpCisjZGVmaW5lIFJYX0ZJTFRFUl9CRUFDT04JCSgxIDw8ICA4KQorI2RlZmluZSBSWF9GSUxURVJfRElTQVNTT0MJCSgxIDw8IDEwKQorI2RlZmluZSBSWF9GSUxURVJfQVVUSAkJCSgxIDw8IDExKQogI2RlZmluZSBBUF9SWF9GSUxURVIJCQkweDA0MDBmZWZmCiAjZGVmaW5lIFNUQV9SWF9GSUxURVIJCQkweDAwMDBmZmZmCiAKQEAgLTc5NCw2ICs4MDMsOSBAQAogaW50IHpkX2NoaXBfZW5hYmxlX2h3aW50KHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9jaGlwX2Rpc2FibGVfaHdpbnQoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogCitpbnQgemRfY2hpcF9zZXRfcnRzX2N0c19yYXRlX2xvY2tlZChzdHJ1Y3QgemRfY2hpcCAqY2hpcCwKKwl1OCBydHNfcmF0ZSwgaW50IHByZWFtYmxlKTsKKwogc3RhdGljIGlubGluZSBpbnQgemRfZ2V0X2VuY3J5cHRpb25fdHlwZShzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTMyICp0eXBlKQogewogCXJldHVybiB6ZF9pb3JlYWQzMihjaGlwLCBDUl9FTkNSWVBUSU9OX1RZUEUsIHR5cGUpOwpAQCAtODA5LDcgKzgyMSwxNyBAQAogCXJldHVybiB6ZF9pb3JlYWQxNihjaGlwLCBDUl9CQVNJQ19SQVRFX1RCTCwgY3JfcmF0ZXMpOwogfQogCi1pbnQgemRfY2hpcF9zZXRfYmFzaWNfcmF0ZXMoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUxNiBjcl9yYXRlcyk7CitpbnQgemRfY2hpcF9zZXRfYmFzaWNfcmF0ZXNfbG9ja2VkKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgY3JfcmF0ZXMpOworCitzdGF0aWMgaW5saW5lIGludCB6ZF9jaGlwX3NldF9iYXNpY19yYXRlcyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTE2IGNyX3JhdGVzKQoreworCWludCByOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCXIgPSB6ZF9jaGlwX3NldF9iYXNpY19yYXRlc19sb2NrZWQoY2hpcCwgY3JfcmF0ZXMpOworCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOworCXJldHVybiByOworfQogCiBzdGF0aWMgaW5saW5lIGludCB6ZF9jaGlwX3NldF9yeF9maWx0ZXIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUzMiBmaWx0ZXIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2RlZi5oCmluZGV4IGExM2VjNzIuLmZiMjJmNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2RlZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2RlZi5oCkBAIC0zOSw2ICszOSw3IEBACiAJaWYgKCEoeCkpIHsgXAogCQlwcl9kZWJ1ZygiJXM6JWQgQVNTRVJUICVzIFZJT0xBVEVEIVxuIiwgXAogCQkJX19GSUxFX18sIF9fTElORV9fLCBfX3N0cmluZ2lmeSh4KSk7IFwKKwkJZHVtcF9zdGFjaygpOyBcCiAJfSBcCiB9IHdoaWxlICgwKQogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmMKaW5kZXggNjY5MDVmNy4uMTg5MTYwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmMKQEAgLTM3LDcgKzM3LDEyIEBACiAJW1pEX1JFR0RPTUFJTl9KQVBBTl0JID0geyAxLCAxNH0sCiAJW1pEX1JFR0RPTUFJTl9TUEFJTl0JID0geyAxLCAxNH0sCiAJW1pEX1JFR0RPTUFJTl9GUkFOQ0VdCSA9IHsgMSwgMTR9LAotCVtaRF9SRUdET01BSU5fSkFQQU5fQUREXSA9IHsxNCwgMTV9LAorCisJLyogSmFwYW4gb3JpZ2luYWxseSBvbmx5IGhhZCBjaGFubmVsIDE0IGF2YWlsYWJsZSAoc2VlIENITkxfSUQgMHg0MCBpbgorCSAqIDgwMi4xMSkuIEhvd2V2ZXIsIGluIDIwMDEgdGhlIHJhbmdlIHdhcyBleHRlbmRlZCB0byBpbmNsdWRlIGNoYW5uZWxzCisJICogMS0xMy4gVGhlIFp5REFTIGRldmljZXMgc3RpbGwgdXNlIHRoZSBvbGQgcmVnaW9uIGNvZGUgYnV0IGFyZQorCSAqIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBleHRyYSBjaGFubmVsIGFjY2VzcyBpbiBKYXBhbi4gKi8KKwlbWkRfUkVHRE9NQUlOX0pBUEFOX0FERF0gPSB7IDEsIDE1fSwKIH07CiAKIGNvbnN0IHN0cnVjdCBjaGFubmVsX3JhbmdlICp6ZF9jaGFubmVsX3JhbmdlKHU4IHJlZ2RvbWFpbikKQEAgLTEzMyw5ICsxMzgsNiBAQAogCWludCBpLCByOwogCXUzMiBtaHo7CiAKLQlpZiAoIShmcmVxLT5mbGFncyAmIElXX0ZSRVFfRklYRUQpKQotCQlyZXR1cm4gMDsKLQogCWlmIChmcmVxLT5tIDwgMTAwMCkgewogCQlpZiAoZnJlcS0+bSAgPiBOVU1fQ0hBTk5FTFMgfHwgZnJlcS0+bSA9PSAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5oCmluZGV4IGY2MzI0NWIuLjI2YjgyOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5oCkBAIC01MCw2ICs1MCw3IEBACiAJcmV0dXJuIGhlYWRlci0+cHJlZml4WzBdICYgMHhmOwogfQogCisvKiBUaGVzZSBhcmUgcmVmZXJyZWQgdG8gYXMgemRfcmF0ZXMgKi8KICNkZWZpbmUgWkRfT0ZETV9SQVRFXzZNCQkweGIKICNkZWZpbmUgWkRfT0ZETV9SQVRFXzlNCQkweGYKICNkZWZpbmUgWkRfT0ZETV9SQVRFXzEyTQkweGEKQEAgLTY0LDcgKzY1LDcgQEAKIAl1OCBzZXJ2aWNlOwogCV9fbGUxNiBsZW5ndGg7CiAJX19sZTE2IGNyYzE2OwotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0YXRpYyBpbmxpbmUgdTggemRfY2NrX3BsY3BfaGVhZGVyX3JhdGUoY29uc3Qgc3RydWN0IGNja19wbGNwX2hlYWRlciAqaGVhZGVyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwppbmRleCBhN2QyOWJkLi4yNjk2Zjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwpAQCAtMzIsNiArMzIsOCBAQAogCiBzdGF0aWMgdm9pZCBpZWVlX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogc3RhdGljIHZvaWQgc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc20pOworc3RhdGljIHZvaWQgc2V0X3J0c19jdHNfd29yayh2b2lkICpkKTsKK3N0YXRpYyB2b2lkIHNldF9iYXNpY19yYXRlc193b3JrKHZvaWQgKmQpOwogCiBzdGF0aWMgdm9pZCBob3VzZWtlZXBpbmdfaW5pdChzdHJ1Y3QgemRfbWFjICptYWMpOwogc3RhdGljIHZvaWQgaG91c2VrZWVwaW5nX2VuYWJsZShzdHJ1Y3QgemRfbWFjICptYWMpOwpAQCAtNDYsNiArNDgsOCBAQAogCW1lbXNldChtYWMsIDAsIHNpemVvZigqbWFjKSk7CiAJc3Bpbl9sb2NrX2luaXQoJm1hYy0+bG9jayk7CiAJbWFjLT5uZXRkZXYgPSBuZXRkZXY7CisJSU5JVF9XT1JLKCZtYWMtPnNldF9ydHNfY3RzX3dvcmssIHNldF9ydHNfY3RzX3dvcmssIG1hYyk7CisJSU5JVF9XT1JLKCZtYWMtPnNldF9iYXNpY19yYXRlc193b3JrLCBzZXRfYmFzaWNfcmF0ZXNfd29yaywgbWFjKTsKIAogCWllZWVfaW5pdChpZWVlKTsKIAlzb2Z0bWFjX2luaXQoaWVlZTgwMjExX3ByaXYobmV0ZGV2KSk7CkBAIC0yMTMsNiArMjE3LDEzIEBACiAJaG91c2VrZWVwaW5nX2Rpc2FibGUobWFjKTsKIAlpZWVlODAyMTFzb2Z0bWFjX3N0b3AobmV0ZGV2KTsKIAorCS8qIEVuc3VyZSBubyB3b3JrIGl0ZW1zIGFyZSBydW5uaW5nIG9yIHF1ZXVlZCBmcm9tIHRoaXMgcG9pbnQgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrKCZtYWMtPnNldF9ydHNfY3RzX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJm1hYy0+c2V0X2Jhc2ljX3JhdGVzX3dvcmspOworCWZsdXNoX3dvcmtxdWV1ZSh6ZF93b3JrcXVldWUpOworCW1hYy0+dXBkYXRpbmdfcnRzX3JhdGUgPSAwOworCW1hYy0+dXBkYXRpbmdfYmFzaWNfcmF0ZXMgPSAwOworCiAJemRfY2hpcF9kaXNhYmxlX2h3aW50KGNoaXApOwogCXpkX2NoaXBfc3dpdGNoX3JhZGlvX29mZihjaGlwKTsKIAl6ZF9jaGlwX2Rpc2FibGVfaW50KGNoaXApOwpAQCAtMjg2LDYgKzI5NywxODYgQEAKIAlyZXR1cm4gcmVnZG9tYWluOwogfQogCisvKiBGYWxsYmFjayB0byBsb3dlc3QgcmF0ZSwgaWYgcmF0ZSBpcyB1bmtub3duLiAqLworc3RhdGljIHU4IHJhdGVfdG9femRfcmF0ZSh1OCByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKKwkJcmV0dXJuIFpEX0NDS19SQVRFXzJNOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKKwkJcmV0dXJuIFpEX0NDS19SQVRFXzVfNU07CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKKwkJcmV0dXJuIFpEX0NDS19SQVRFXzExTTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzZNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJCXJldHVybiBaRF9PRkRNX1JBVEVfOU07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJCXJldHVybiBaRF9PRkRNX1JBVEVfMTJNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgorCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzE4TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKKwkJcmV0dXJuIFpEX09GRE1fUkFURV8yNE07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJCXJldHVybiBaRF9PRkRNX1JBVEVfMzZNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgorCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzQ4TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKKwkJcmV0dXJuIFpEX09GRE1fUkFURV81NE07CisJfQorCXJldHVybiBaRF9DQ0tfUkFURV8xTTsKK30KKworc3RhdGljIHUxNiByYXRlX3RvX2NyX3JhdGUodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6CisJCXJldHVybiBDUl9SQVRFXzFNOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKKwkJcmV0dXJuIENSX1JBVEVfNV81TTsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gQ1JfUkFURV8xMU07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKKwkJcmV0dXJuIENSX1JBVEVfNk07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKKwkJcmV0dXJuIENSX1JBVEVfOU07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJCXJldHVybiBDUl9SQVRFXzEyTTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKKwkJcmV0dXJuIENSX1JBVEVfMThNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgorCQlyZXR1cm4gQ1JfUkFURV8yNE07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJCXJldHVybiBDUl9SQVRFXzM2TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKKwkJcmV0dXJuIENSX1JBVEVfNDhNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgorCQlyZXR1cm4gQ1JfUkFURV81NE07CisJfQorCXJldHVybiBDUl9SQVRFXzFNOworfQorCitzdGF0aWMgdm9pZCB0cnlfZW5hYmxlX3R4KHN0cnVjdCB6ZF9tYWMgKm1hYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCWlmIChtYWMtPnVwZGF0aW5nX3J0c19yYXRlID09IDAgJiYgbWFjLT51cGRhdGluZ19iYXNpY19yYXRlcyA9PSAwKQorCQluZXRpZl93YWtlX3F1ZXVlKG1hYy0+bmV0ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3J0c19jdHNfd29yayh2b2lkICpkKQoreworCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBydHNfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgc2hvcnRfcHJlYW1ibGU7CisKKwltdXRleF9sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW1hYy0+dXBkYXRpbmdfcnRzX3JhdGUgPSAwOworCXJ0c19yYXRlID0gbWFjLT5ydHNfcmF0ZTsKKwlzaG9ydF9wcmVhbWJsZSA9IG1hYy0+c2hvcnRfcHJlYW1ibGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7CisKKwl6ZF9jaGlwX3NldF9ydHNfY3RzX3JhdGVfbG9ja2VkKCZtYWMtPmNoaXAsIHJ0c19yYXRlLCBzaG9ydF9wcmVhbWJsZSk7CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCisJdHJ5X2VuYWJsZV90eChtYWMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYmFzaWNfcmF0ZXNfd29yayh2b2lkICpkKQoreworCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgYmFzaWNfcmF0ZXM7CisKKwltdXRleF9sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW1hYy0+dXBkYXRpbmdfYmFzaWNfcmF0ZXMgPSAwOworCWJhc2ljX3JhdGVzID0gbWFjLT5iYXNpY19yYXRlczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKworCXpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzX2xvY2tlZCgmbWFjLT5jaGlwLCBiYXNpY19yYXRlcyk7CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCisJdHJ5X2VuYWJsZV90eChtYWMpOworfQorCitzdGF0aWMgdm9pZCBic3NpbmZvX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgY2hhbmdlcykKK3sKKwlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9uZXRkZXZfbWFjKG5ldGRldik7CisJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICpzb2Z0bWFjID0gaWVlZTgwMjExX3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19ic3NfaW5mbyAqYnNzaW5mbyA9ICZzb2Z0bWFjLT5ic3NpbmZvOworCWludCBuZWVkX3NldF9ydHNfY3RzID0gMDsKKwlpbnQgbmVlZF9zZXRfcmF0ZXMgPSAwOworCXUxNiBiYXNpY19yYXRlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZ19mKHpkX21hY19kZXYobWFjKSwgImNoYW5nZXM6ICV4XG4iLCBjaGFuZ2VzKTsKKworCWlmIChjaGFuZ2VzICYgSUVFRTgwMjExU09GVE1BQ19CU1NJTkZPQ0hHX1NIT1JUX1BSRUFNQkxFKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwkJbWFjLT5zaG9ydF9wcmVhbWJsZSA9IGJzc2luZm8tPnNob3J0X3ByZWFtYmxlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwkJbmVlZF9zZXRfcnRzX2N0cyA9IDE7CisJfQorCisJaWYgKGNoYW5nZXMgJiBJRUVFODAyMTFTT0ZUTUFDX0JTU0lORk9DSEdfUkFURVMpIHsKKwkJLyogU2V0IFJUUyByYXRlIHRvIGhpZ2hlc3QgYXZhaWxhYmxlIGJhc2ljIHJhdGUgKi8KKwkJdTggcmF0ZSA9IGllZWU4MDIxMXNvZnRtYWNfaGlnaGVzdF9zdXBwb3J0ZWRfcmF0ZShzb2Z0bWFjLAorCQkJJmJzc2luZm8tPnN1cHBvcnRlZF9yYXRlcywgMSk7CisJCXJhdGUgPSByYXRlX3RvX3pkX3JhdGUocmF0ZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCQlpZiAocmF0ZSAhPSBtYWMtPnJ0c19yYXRlKSB7CisJCQltYWMtPnJ0c19yYXRlID0gcmF0ZTsKKwkJCW5lZWRfc2V0X3J0c19jdHMgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCisJCS8qIFNldCBiYXNpYyByYXRlcyAqLworCQluZWVkX3NldF9yYXRlcyA9IDE7CisJCWlmIChic3NpbmZvLT5zdXBwb3J0ZWRfcmF0ZXMuY291bnQgPT0gMCkgeworCQkJLyogQWxsb3cgdGhlIGRldmljZSB0byBiZSBmbGV4aWJsZSAqLworCQkJYmFzaWNfcmF0ZXMgPSBDUl9SQVRFU184MDIxMUIgfCBDUl9SQVRFU184MDIxMUc7CisJCX0gZWxzZSB7CisJCQlpbnQgaSA9IDA7CisJCQliYXNpY19yYXRlcyA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBic3NpbmZvLT5zdXBwb3J0ZWRfcmF0ZXMuY291bnQ7IGkrKykgeworCQkJCXUxNiByYXRlID0gYnNzaW5mby0+c3VwcG9ydGVkX3JhdGVzLnJhdGVzW2ldOworCQkJCWlmICgocmF0ZSAmIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spID09IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmF0ZSAmPSB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKKwkJCQliYXNpY19yYXRlcyB8PSByYXRlX3RvX2NyX3JhdGUocmF0ZSk7CisJCQl9CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCQltYWMtPmJhc2ljX3JhdGVzID0gYmFzaWNfcmF0ZXM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIFNjaGVkdWxlIGFueSBjaGFuZ2VzIHdlIG1hZGUgYWJvdmUgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwlpZiAobmVlZF9zZXRfcnRzX2N0cyAmJiAhbWFjLT51cGRhdGluZ19ydHNfcmF0ZSkgeworCQltYWMtPnVwZGF0aW5nX3J0c19yYXRlID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShtYWMtPm5ldGRldik7CisJCXF1ZXVlX3dvcmsoemRfd29ya3F1ZXVlLCAmbWFjLT5zZXRfcnRzX2N0c193b3JrKTsKKwl9CisJaWYgKG5lZWRfc2V0X3JhdGVzICYmICFtYWMtPnVwZGF0aW5nX2Jhc2ljX3JhdGVzKSB7CisJCW1hYy0+dXBkYXRpbmdfYmFzaWNfcmF0ZXMgPSAxOworCQluZXRpZl9zdG9wX3F1ZXVlKG1hYy0+bmV0ZGV2KTsKKwkJcXVldWVfd29yayh6ZF93b3JrcXVldWUsICZtYWMtPnNldF9iYXNpY19yYXRlc193b3JrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIHNldF9jaGFubmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHU4IGNoYW5uZWwpCiB7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfbmV0ZGV2X21hYyhuZXRkZXYpOwpAQCAtMjk1LDcgKzQ4Niw2IEBACiAJemRfY2hpcF9zZXRfY2hhbm5lbCgmbWFjLT5jaGlwLCBjaGFubmVsKTsKIH0KIAotLyogVE9ETzogU2hvdWxkIG5vdCB3b3JrIGluIE1hbmFnZWQgbW9kZS4gKi8KIGludCB6ZF9tYWNfcmVxdWVzdF9jaGFubmVsKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggY2hhbm5lbCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CkBAIC0zMTcsMzEgKzUwNywyMiBAQAogCQlyZXR1cm4gMDsKIH0KIAotaW50IHpkX21hY19nZXRfY2hhbm5lbChzdHJ1Y3QgemRfbWFjICptYWMsIHU4ICpjaGFubmVsLCB1OCAqZmxhZ3MpCit1OCB6ZF9tYWNfZ2V0X2NoYW5uZWwoc3RydWN0IHpkX21hYyAqbWFjKQogewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gemRfbWFjX3RvX2llZWU4MDIxMShtYWMpOworCXU4IGNoYW5uZWwgPSB6ZF9jaGlwX2dldF9jaGFubmVsKCZtYWMtPmNoaXApOwogCi0JKmNoYW5uZWwgPSB6ZF9jaGlwX2dldF9jaGFubmVsKCZtYWMtPmNoaXApOwotCWlmIChpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpIHsKLQkJc3Bpbl9sb2NrX2lycSgmbWFjLT5sb2NrKTsKLQkJKmZsYWdzID0gKmNoYW5uZWwgPT0gbWFjLT5yZXF1ZXN0ZWRfY2hhbm5lbCA/Ci0JCQlNQUNfRklYRURfQ0hBTk5FTCA6IDA7Ci0JCXNwaW5fdW5sb2NrKCZtYWMtPmxvY2spOwotCX0gZWxzZSB7Ci0JCSpmbGFncyA9IDA7Ci0JfQotCWRldl9kYmdfZih6ZF9tYWNfZGV2KG1hYyksICJjaGFubmVsICV1IGZsYWdzICV1XG4iLCAqY2hhbm5lbCwgKmZsYWdzKTsKLQlyZXR1cm4gMDsKKwlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLCAiY2hhbm5lbCAldVxuIiwgY2hhbm5lbCk7CisJcmV0dXJuIGNoYW5uZWw7CiB9CiAKIC8qIElmIHdyb25nIHJhdGUgaXMgZ2l2ZW4sIHdlIGFyZSBmYWxsaW5nIGJhY2sgdG8gdGhlIHNsb3dlc3QgcmF0ZTogMU1CaXQvcyAqLwotc3RhdGljIHU4IGNzX3R5cGVkX3JhdGUodTggY3NfcmF0ZSkKK3N0YXRpYyB1OCB6ZF9yYXRlX3R5cGVkKHU4IHpkX3JhdGUpCiB7CiAJc3RhdGljIGNvbnN0IHU4IHR5cGVkX3JhdGVzWzE2XSA9IHsKLQkJW1pEX0NTX0NDS19SQVRFXzFNXQk9IFpEX0NTX0NDS3xaRF9DU19DQ0tfUkFURV8xTSwKLQkJW1pEX0NTX0NDS19SQVRFXzJNXQk9IFpEX0NTX0NDS3xaRF9DU19DQ0tfUkFURV8yTSwKLQkJW1pEX0NTX0NDS19SQVRFXzVfNU1dCT0gWkRfQ1NfQ0NLfFpEX0NTX0NDS19SQVRFXzVfNU0sCi0JCVtaRF9DU19DQ0tfUkFURV8xMU1dCT0gWkRfQ1NfQ0NLfFpEX0NTX0NDS19SQVRFXzExTSwKKwkJW1pEX0NDS19SQVRFXzFNXQk9IFpEX0NTX0NDS3xaRF9DQ0tfUkFURV8xTSwKKwkJW1pEX0NDS19SQVRFXzJNXQk9IFpEX0NTX0NDS3xaRF9DQ0tfUkFURV8yTSwKKwkJW1pEX0NDS19SQVRFXzVfNU1dCT0gWkRfQ1NfQ0NLfFpEX0NDS19SQVRFXzVfNU0sCisJCVtaRF9DQ0tfUkFURV8xMU1dCT0gWkRfQ1NfQ0NLfFpEX0NDS19SQVRFXzExTSwKIAkJW1pEX09GRE1fUkFURV82TV0JPSBaRF9DU19PRkRNfFpEX09GRE1fUkFURV82TSwKIAkJW1pEX09GRE1fUkFURV85TV0JPSBaRF9DU19PRkRNfFpEX09GRE1fUkFURV85TSwKIAkJW1pEX09GRE1fUkFURV8xMk1dCT0gWkRfQ1NfT0ZETXxaRF9PRkRNX1JBVEVfMTJNLApAQCAtMzUzLDM3ICs1MzQsNyBAQAogCX07CiAKIAlaRF9BU1NFUlQoWkRfQ1NfUkFURV9NQVNLID09IDB4MGYpOwotCXJldHVybiB0eXBlZF9yYXRlc1tjc19yYXRlICYgWkRfQ1NfUkFURV9NQVNLXTsKLX0KLQotLyogRmFsbGJhY2sgdG8gbG93ZXN0IHJhdGUsIGlmIHJhdGUgaXMgdW5rbm93bi4gKi8KLXN0YXRpYyB1OCByYXRlX3RvX2NzX3JhdGUodTggcmF0ZSkKLXsKLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0JCXJldHVybiBaRF9DU19DQ0tfUkFURV8yTTsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCXJldHVybiBaRF9DU19DQ0tfUkFURV81XzVNOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCXJldHVybiBaRF9DU19DQ0tfUkFURV8xMU07Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQkJcmV0dXJuIFpEX09GRE1fUkFURV82TTsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgotCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzlNOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgotCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzEyTTsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKLQkJcmV0dXJuIFpEX09GRE1fUkFURV8xOE07Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6Ci0JCXJldHVybiBaRF9PRkRNX1JBVEVfMjRNOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgotCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzM2TTsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKLQkJcmV0dXJuIFpEX09GRE1fUkFURV80OE07Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6Ci0JCXJldHVybiBaRF9PRkRNX1JBVEVfNTRNOwotCX0KLQlyZXR1cm4gWkRfQ1NfQ0NLX1JBVEVfMU07CisJcmV0dXJuIHR5cGVkX3JhdGVzW3pkX3JhdGUgJiBaRF9DU19SQVRFX01BU0tdOwogfQogCiBpbnQgemRfbWFjX3NldF9tb2RlKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTMyIG1vZGUpCkBAIC00ODQsMTMgKzYzNSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHpkX2NhbGNfdHhfbGVuZ3RoX3VzKHU4ICpzZXJ2aWNlLCB1OCBjc19yYXRlLCB1MTYgdHhfbGVuZ3RoKQorc3RhdGljIGludCB6ZF9jYWxjX3R4X2xlbmd0aF91cyh1OCAqc2VydmljZSwgdTggemRfcmF0ZSwgdTE2IHR4X2xlbmd0aCkKIHsKIAlzdGF0aWMgY29uc3QgdTggcmF0ZV9kaXZpc29yW10gPSB7Ci0JCVtaRF9DU19DQ0tfUkFURV8xTV0JPSAgMSwKLQkJW1pEX0NTX0NDS19SQVRFXzJNXQk9ICAyLAotCQlbWkRfQ1NfQ0NLX1JBVEVfNV81TV0JPSAxMSwgLyogYml0cyBtdXN0IGJlIGRvdWJsZWQgKi8KLQkJW1pEX0NTX0NDS19SQVRFXzExTV0JPSAxMSwKKwkJW1pEX0NDS19SQVRFXzFNXQk9ICAxLAorCQlbWkRfQ0NLX1JBVEVfMk1dCT0gIDIsCisJCVtaRF9DQ0tfUkFURV81XzVNXQk9IDExLCAvKiBiaXRzIG11c3QgYmUgZG91YmxlZCAqLworCQlbWkRfQ0NLX1JBVEVfMTFNXQk9IDExLAogCQlbWkRfT0ZETV9SQVRFXzZNXQk9ICA2LAogCQlbWkRfT0ZETV9SQVRFXzlNXQk9ICA5LAogCQlbWkRfT0ZETV9SQVRFXzEyTV0JPSAxMiwKQEAgLTUwNCwxNSArNjU1LDE1IEBACiAJdTMyIGJpdHMgPSAodTMyKXR4X2xlbmd0aCAqIDg7CiAJdTMyIGRpdmlzb3I7CiAKLQlkaXZpc29yID0gcmF0ZV9kaXZpc29yW2NzX3JhdGVdOworCWRpdmlzb3IgPSByYXRlX2Rpdmlzb3JbemRfcmF0ZV07CiAJaWYgKGRpdmlzb3IgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2ggKGNzX3JhdGUpIHsKLQljYXNlIFpEX0NTX0NDS19SQVRFXzVfNU06CisJc3dpdGNoICh6ZF9yYXRlKSB7CisJY2FzZSBaRF9DQ0tfUkFURV81XzVNOgogCQliaXRzID0gKDIqYml0cykgKyAxMDsgLyogcm91bmQgdXAgdG8gdGhlIG5leHQgaW50ZWdlciAqLwogCQlicmVhazsKLQljYXNlIFpEX0NTX0NDS19SQVRFXzExTToKKwljYXNlIFpEX0NDS19SQVRFXzExTToKIAkJaWYgKHNlcnZpY2UpIHsKIAkJCXUzMiB0ID0gYml0cyAlIDExOwogCQkJKnNlcnZpY2UgJj0gflpEX1BMQ1BfU0VSVklDRV9MRU5HVEhfRVhURU5TSU9OOwpAQCAtNTMyLDE2ICs2ODMsMTYgQEAKIAlSMk1fMTFBCQkgICA9IDB4MDIsCiB9OwogCi1zdGF0aWMgdTggY3NfcmF0ZV90b19tb2R1bGF0aW9uKHU4IGNzX3JhdGUsIGludCBmbGFncykKK3N0YXRpYyB1OCB6ZF9yYXRlX3RvX21vZHVsYXRpb24odTggemRfcmF0ZSwgaW50IGZsYWdzKQogewogCXU4IG1vZHVsYXRpb247CiAKLQltb2R1bGF0aW9uID0gY3NfdHlwZWRfcmF0ZShjc19yYXRlKTsKKwltb2R1bGF0aW9uID0gemRfcmF0ZV90eXBlZCh6ZF9yYXRlKTsKIAlpZiAoZmxhZ3MgJiBSMk1fU0hPUlRfUFJFQU1CTEUpIHsKIAkJc3dpdGNoIChaRF9DU19SQVRFKG1vZHVsYXRpb24pKSB7Ci0JCWNhc2UgWkRfQ1NfQ0NLX1JBVEVfMk06Ci0JCWNhc2UgWkRfQ1NfQ0NLX1JBVEVfNV81TToKLQkJY2FzZSBaRF9DU19DQ0tfUkFURV8xMU06CisJCWNhc2UgWkRfQ0NLX1JBVEVfMk06CisJCWNhc2UgWkRfQ0NLX1JBVEVfNV81TToKKwkJY2FzZSBaRF9DQ0tfUkFURV8xMU06CiAJCQltb2R1bGF0aW9uIHw9IFpEX0NTX0NDS19QUkVBX1NIT1JUOwogCQkJcmV0dXJuIG1vZHVsYXRpb247CiAJCX0KQEAgLTU1OCwzOSArNzA5LDM2IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICpzb2Z0bWFjID0gaWVlZTgwMjExX3ByaXYobWFjLT5uZXRkZXYpOwogCXUxNiBmdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKLQl1OCByYXRlLCBjc19yYXRlOworCXU4IHJhdGUsIHpkX3JhdGU7CiAJaW50IGlzX21ndCA9IChmdHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkgIT0gMDsKKwlpbnQgaXNfbXVsdGljYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7CisJaW50IHNob3J0X3ByZWFtYmxlID0gaWVlZTgwMjExc29mdG1hY19zaG9ydF9wcmVhbWJsZV9vayhzb2Z0bWFjLAorCQlpc19tdWx0aWNhc3QsIGlzX21ndCk7CisJaW50IGZsYWdzID0gMDsKIAotCS8qIEZJWE1FOiA4MDIuMTFhPyBzaG9ydCBwcmVhbWJsZT8gKi8KLQlyYXRlID0gaWVlZTgwMjExc29mdG1hY19zdWdnZXN0X3R4cmF0ZShzb2Z0bWFjLAotCQlpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSwgaXNfbWd0KTsKKwkvKiBGSVhNRTogODAyLjExYT8gKi8KKwlyYXRlID0gaWVlZTgwMjExc29mdG1hY19zdWdnZXN0X3R4cmF0ZShzb2Z0bWFjLCBpc19tdWx0aWNhc3QsIGlzX21ndCk7CiAKLQljc19yYXRlID0gcmF0ZV90b19jc19yYXRlKHJhdGUpOwotCWNzLT5tb2R1bGF0aW9uID0gY3NfcmF0ZV90b19tb2R1bGF0aW9uKGNzX3JhdGUsIDApOworCWlmIChzaG9ydF9wcmVhbWJsZSkKKwkJZmxhZ3MgfD0gUjJNX1NIT1JUX1BSRUFNQkxFOworCisJemRfcmF0ZSA9IHJhdGVfdG9femRfcmF0ZShyYXRlKTsKKwljcy0+bW9kdWxhdGlvbiA9IHpkX3JhdGVfdG9fbW9kdWxhdGlvbih6ZF9yYXRlLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNzX3NldF9jb250cm9sKHN0cnVjdCB6ZF9tYWMgKm1hYywgc3RydWN0IHpkX2N0cmxzZXQgKmNzLAogCSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyKQogeworCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc29mdG1hYyA9IGllZWU4MDIxMV9wcml2KG1hYy0+bmV0ZGV2KTsKIAl1bnNpZ25lZCBpbnQgdHhfbGVuZ3RoID0gbGUxNl90b19jcHUoY3MtPnR4X2xlbmd0aCk7CiAJdTE2IGZjdGwgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCk7CiAJdTE2IGZ0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmY3RsKTsKIAl1MTYgc3R5cGUgPSBXTEFOX0ZDX0dFVF9TVFlQRShmY3RsKTsKIAogCS8qCi0JICogQ09OVFJPTDoKLQkgKiAtIHN0YXJ0IGF0IDB4MDAKLQkgKiAtIGlmIGZyYWdtZW50IDAsIGVuYWJsZSBiaXQgMAorCSAqIENPTlRST0wgVE9ETzoKIAkgKiAtIGlmIGJhY2tvZmYgbmVlZGVkLCBlbmFibGUgYml0IDAKIAkgKiAtIGlmIGJ1cnN0IChiYWNrb2ZmIG5vdCBuZWVkZWQpIGRpc2FibGUgYml0IDAKLQkgKiAtIGlmIG11bHRpY2FzdCwgZW5hYmxlIGJpdCAxCi0JICogLSBpZiBQUy1QT0xMIGZyYW1lLCBlbmFibGUgYml0IDIKLQkgKiAtIGlmIGluIElOREVQRU5ERU5UX0JTUyBtb2RlIGFuZCB6ZDEyMDVfRGVzdFBvd2VyU2F2ZSwgdGhlbiBlbmFibGUKLQkgKiAgIGJpdCA0IChGSVhNRTogd3RmKQotCSAqIC0gaWYgZnJhZ19sZW4gPiBSVFMgdGhyZXNob2xkLCBzZXQgYml0IDUgYXMgbG9uZyBpZiBpdCBpc250Ci0JICogICBtdWx0aWNhc3Qgb3IgbWd0Ci0JICogLSBpZiBiaXQgNSBpcyBzZXQsIGFuZCB3ZSBhcmUgaW4gT0ZETSBtb2RlLCB1bnNldCBiaXQgNSBhbmQgc2V0IGJpdAotCSAqICAgNwogCSAqLwogCiAJY3MtPmNvbnRyb2wgPSAwOwpAQCAtNjA3LDE3ICs3NTUsMTggQEAKIAlpZiAoc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1BTUE9MTCkKIAkJY3MtPmNvbnRyb2wgfD0gWkRfQ1NfUFNfUE9MTF9GUkFNRTsKIAorCS8qIFVuaWNhc3QgZGF0YSBmcmFtZXMgb3ZlciB0aGUgdGhyZXNob2xkIHNob3VsZCBoYXZlIFJUUyAqLwogCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkgJiYKLQkgICAgZnR5cGUgIT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgJiYKLQkgICAgdHhfbGVuZ3RoID4gemRfbmV0ZGV2X2llZWU4MDIxMShtYWMtPm5ldGRldiktPnJ0cykKLQl7Ci0JCS8qIEZJWE1FOiBjaGVjayB0aGUgbG9naWMgKi8KLQkJaWYgKFpEX0NTX1RZUEUoY3MtPm1vZHVsYXRpb24pID09IFpEX0NTX09GRE0pIHsKLQkJCS8qIDgwMi4xMWcgKi8KLQkJCWNzLT5jb250cm9sIHw9IFpEX0NTX1NFTEZfQ1RTOwotCQl9IGVsc2UgeyAvKiA4MDIuMTFiICovCi0JCQljcy0+Y29udHJvbCB8PSBaRF9DU19SVFM7Ci0JCX0KKwkgICAgCWZ0eXBlICE9IElFRUU4MDIxMV9GVFlQRV9NR01UICYmCisJCSAgICB0eF9sZW5ndGggPiB6ZF9uZXRkZXZfaWVlZTgwMjExKG1hYy0+bmV0ZGV2KS0+cnRzKQorCQljcy0+Y29udHJvbCB8PSBaRF9DU19SVFM7CisKKwkvKiBVc2UgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBpZiByZXF1aXJlZCAqLworCWlmIChaRF9DU19UWVBFKGNzLT5tb2R1bGF0aW9uKSA9PSBaRF9DU19PRkRNICYmCisJCQlpZWVlODAyMTFzb2Z0bWFjX3Byb3RlY3Rpb25fbmVlZGVkKHNvZnRtYWMpKSB7CisJCS8qIEZJWE1FOiBhdm9pZCBzZW5kaW5nIFJUUyAqYW5kKiBzZWxmLUNUUywgaXMgdGhhdCBjb3JyZWN0PyAqLworCQljcy0+Y29udHJvbCAmPSB+WkRfQ1NfUlRTOworCQljcy0+Y29udHJvbCB8PSBaRF9DU19TRUxGX0NUUzsKIAl9CiAKIAkvKiBGSVhNRTogTWFuYWdlbWVudCBmcmFtZT8gKi8KQEAgLTcyMSw3ICs4NzAsNyBAQAogCXU4ICBydF9yYXRlOwogCXUxNiBydF9jaGFubmVsOwogCXUxNiBydF9jaGJpdG1hc2s7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RhdGljIHZvaWQgZmlsbF9ydF9oZWFkZXIodm9pZCAqYnVmZmVyLCBzdHJ1Y3QgemRfbWFjICptYWMsCiAJICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzLApAQCAtNzgyLDkgKzkzMSwxMSBAQAogCSAgICAgICAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKTsKIH0KIAotLyogRmlsdGVycyByZWNlaXZpbmcgcGFja2V0cy4gSWYgaXQgcmV0dXJucyAxIHNlbmQgaXQgdG8gaWVlZTgwMjExX3J4LCBpZiAwCi0gKiByZXR1cm4uIElmIGFuIGVycm9yIGlzIGRldGVjdGVkIC1FSU5WQUwgaXMgcmV0dXJuZWQuIGllZWU4MDIxMV9yeF9tZ3QoKSBpcwotICogY2FsbGVkIGhlcmUuCisvKiBGaWx0ZXJzIHJlY2VpdmVkIHBhY2tldHMuIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIHBhY2tldCBzaG91bGQgYmUKKyAqIGZvcndhcmRlZCB0byBpZWVlODAyMTFfcngoKS4gSWYgdGhlIHBhY2tldCBzaG91bGQgYmUgaWdub3JlZCB0aGUgZnVuY3Rpb24KKyAqIHJldHVybnMgMC4gSWYgYW4gaW52YWxpZCBwYWNrZXQgaXMgZm91bmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgLUVJTlZBTC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY2FsbHMgaWVlZTgwMjExX3J4X21ndCgpIGRpcmVjdGx5LgogICoKICAqIEl0IGhhcyBiZWVuIGJhc2VkIG9uIGllZWU4MDIxMV9yeF9hbnkuCiAgKi8KQEAgLTgxMCw5ICs5NjEsOSBAQAogCQlpZWVlODAyMTFfcnhfbWd0KGllZWUsIGhkciwgc3RhdHMpOwogCQlyZXR1cm4gMDsKIAljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCS8qIElnbm9yZSBpbnZhbGlkIHNob3J0IGJ1ZmZlcnMgKi8KIAkJcmV0dXJuIDA7CiAJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJLyogSWdub3JlIGludmFsaWQgc2hvcnQgYnVmZmVycyAqLwogCQlpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gaXNfZGF0YV9wYWNrZXRfZm9yX3VzKGllZWUsIGhkcik7CkBAIC05OTMsNiArMTE0NCw3IEBACiBzdGF0aWMgdm9pZCBzb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICpzbSkKIHsKIAlzbS0+c2V0X2NoYW5uZWwgPSBzZXRfY2hhbm5lbDsKKwlzbS0+YnNzaW5mb19jaGFuZ2UgPSBic3NpbmZvX2NoYW5nZTsKIH0KIAogc3RydWN0IGl3X3N0YXRpc3RpY3MgKnpkX21hY19nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCkBAIC0xMDI4LDY2ICsxMTgwLDYgQEAKIAlyZXR1cm4gaXdfc3RhdHM7CiB9CiAKLSNpZmRlZiBERUJVRwotc3RhdGljIGNvbnN0IGNoYXIqIGRlY3J5cHRpb25fdHlwZXNbXSA9IHsKLQlbWkRfUlhfTk9fV0VQXSA9ICJub25lIiwKLQlbWkRfUlhfV0VQNjRdID0gIldFUDY0IiwKLQlbWkRfUlhfVEtJUF0gPSAiVEtJUCIsCi0JW1pEX1JYX0FFU10gPSAiQUVTIiwKLQlbWkRfUlhfV0VQMTI4XSA9ICJXRVAxMjgiLAotCVtaRF9SWF9XRVAyNTZdID0gIldFUDI1NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZGVjcnlwdGlvbl90eXBlX3N0cmluZyh1OCB0eXBlKQotewotCWNvbnN0IGNoYXIgKnM7Ci0KLQlpZiAodHlwZSA8IEFSUkFZX1NJWkUoZGVjcnlwdGlvbl90eXBlcykpIHsKLQkJcyA9IGRlY3J5cHRpb25fdHlwZXNbdHlwZV07Ci0JfSBlbHNlIHsKLQkJcyA9IE5VTEw7Ci0JfQotCXJldHVybiBzID8gcyA6ICJ1bmtub3duIjsKLX0KLQotc3RhdGljIGludCBpc19vZmRtKHU4IGZyYW1lX3N0YXR1cykKLXsKLQlyZXR1cm4gKGZyYW1lX3N0YXR1cyAmIFpEX1JYX09GRE0pOwotfQotCi12b2lkIHpkX2R1bXBfcnhfc3RhdHVzKGNvbnN0IHN0cnVjdCByeF9zdGF0dXMgKnN0YXR1cykKLXsKLQljb25zdCBjaGFyKiBtb2R1bGF0aW9uOwotCXU4IHF1YWxpdHk7Ci0KLQlpZiAoaXNfb2ZkbShzdGF0dXMtPmZyYW1lX3N0YXR1cykpIHsKLQkJbW9kdWxhdGlvbiA9ICJvZmRtIjsKLQkJcXVhbGl0eSA9IHN0YXR1cy0+c2lnbmFsX3F1YWxpdHlfb2ZkbTsKLQl9IGVsc2UgewotCQltb2R1bGF0aW9uID0gImNjayI7Ci0JCXF1YWxpdHkgPSBzdGF0dXMtPnNpZ25hbF9xdWFsaXR5X2NjazsKLQl9Ci0JcHJfZGVidWcoInJ4IHN0YXR1cyAlcyBzdHJlbmd0aCAlIzA0eCBxdWFsICUjMDR4IGRlY3J5cHRpb24gJXNcbiIsCi0JCW1vZHVsYXRpb24sIHN0YXR1cy0+c2lnbmFsX3N0cmVuZ3RoLCBxdWFsaXR5LAotCQlkZWNyeXB0aW9uX3R5cGVfc3RyaW5nKHN0YXR1cy0+ZGVjcnlwdGlvbl90eXBlKSk7Ci0JaWYgKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfRVJST1IpIHsKLQkJcHJfZGVidWcoInJ4IGVycm9yICVzJXMlcyVzJXMlc1xuIiwKLQkJCShzdGF0dXMtPmZyYW1lX3N0YXR1cyAmIFpEX1JYX1RJTUVPVVRfRVJST1IpID8KLQkJCQkidGltZW91dCAiIDogIiIsCi0JCQkoc3RhdHVzLT5mcmFtZV9zdGF0dXMgJiBaRF9SWF9GSUZPX09WRVJSVU5fRVJST1IpID8KLQkJCQkiZmlmbyAiIDogIiIsCi0JCQkoc3RhdHVzLT5mcmFtZV9zdGF0dXMgJiBaRF9SWF9ERUNSWVBUSU9OX0VSUk9SKSA/Ci0JCQkJImRlY3J5cHRpb24gIiA6ICIiLAotCQkJKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfQ1JDMzJfRVJST1IpID8KLQkJCQkiY3JjMzIgIiA6ICIiLAotCQkJKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfTk9fQUREUjFfTUFUQ0hfRVJST1IpID8KLQkJCQkiYWRkcjEgIiA6ICIiLAotCQkJKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfQ1JDMTZfRVJST1IpID8KLQkJCQkiY3JjMTYiIDogIiIpOwotCX0KLX0KLSNlbmRpZiAvKiBERUJVRyAqLwotCiAjZGVmaW5lIExJTktfTEVEX1dPUktfREVMQVkgSFoKIAogc3RhdGljIHZvaWQgbGlua19sZWRfaGFuZGxlcih2b2lkICpwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAppbmRleCBiOGVhM2RlLi41ZGNmYjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMXNvZnRtYWMuaD4KIApAQCAtNDgsMTAgKzQ5LDExIEBACiAjZGVmaW5lIFpEX0NTX0NDSwkJMHgwMAogI2RlZmluZSBaRF9DU19PRkRNCQkweDEwCiAKLSNkZWZpbmUgWkRfQ1NfQ0NLX1JBVEVfMU0JMHgwMAotI2RlZmluZSBaRF9DU19DQ0tfUkFURV8yTQkweDAxCi0jZGVmaW5lIFpEX0NTX0NDS19SQVRFXzVfNU0JMHgwMgotI2RlZmluZSBaRF9DU19DQ0tfUkFURV8xMU0JMHgwMworLyogVGhlc2UgYXJlIHJlZmVycmVkIHRvIGFzIHpkX3JhdGVzICovCisjZGVmaW5lIFpEX0NDS19SQVRFXzFNCTB4MDAKKyNkZWZpbmUgWkRfQ0NLX1JBVEVfMk0JMHgwMQorI2RlZmluZSBaRF9DQ0tfUkFURV81XzVNCTB4MDIKKyNkZWZpbmUgWkRfQ0NLX1JBVEVfMTFNCTB4MDMKIC8qIFRoZSByYXRlcyBmb3IgT0ZETSBhcmUgZW5jb2RlZCBhcyBpbiB0aGUgUExDUCBoZWFkZXIuIFVzZSBaRF9PRkRNX1JBVEVfKi4KICAqLwogCkBAIC04Miw3ICs4NCw3IEBACiBzdHJ1Y3QgcnhfbGVuZ3RoX2luZm8gewogCV9fbGUxNiBsZW5ndGhbM107CiAJX19sZTE2IHRhZzsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIFJYX0xFTkdUSF9JTkZPX1RBRwkJMHg2OTdlCiAKQEAgLTkzLDcgKzk1LDcgQEAKIAl1OCBzaWduYWxfcXVhbGl0eV9vZmRtOwogCXU4IGRlY3J5cHRpb25fdHlwZTsKIAl1OCBmcmFtZV9zdGF0dXM7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogcnhfc3RhdHVzIGZpZWxkIGRlY3J5cHRpb25fdHlwZSAqLwogI2RlZmluZSBaRF9SWF9OT19XRVAJMApAQCAtMTE2LDEwICsxMTgsNiBAQAogI2RlZmluZSBaRF9SWF9DUkMxNl9FUlJPUgkJMHg0MAogI2RlZmluZSBaRF9SWF9FUlJPUgkJCTB4ODAKIAotZW51bSBtYWNfZmxhZ3MgewotCU1BQ19GSVhFRF9DSEFOTkVMID0gMHgwMSwKLX07Ci0KIHN0cnVjdCBob3VzZWtlZXBpbmcgewogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2xlZF93b3JrOwogfTsKQEAgLTEzMCwxNSArMTI4LDMzIEBACiAJc3RydWN0IHpkX2NoaXAgY2hpcDsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwogCS8qIFVubG9ja2VkIHJlYWRpbmcgcG9zc2libGUgKi8KIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd19zdGF0czsKKwogCXN0cnVjdCBob3VzZWtlZXBpbmcgaG91c2VrZWVwaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXRfcnRzX2N0c193b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXRfYmFzaWNfcmF0ZXNfd29yazsKKwogCXVuc2lnbmVkIGludCBzdGF0c19jb3VudDsKIAl1OCBxdWFsX2J1ZmZlcltaRF9NQUNfU1RBVFNfQlVGRkVSX1NJWkVdOwogCXU4IHJzc2lfYnVmZmVyW1pEX01BQ19TVEFUU19CVUZGRVJfU0laRV07CiAJdTggcmVnZG9tYWluOwogCXU4IGRlZmF1bHRfcmVnZG9tYWluOwogCXU4IHJlcXVlc3RlZF9jaGFubmVsOworCisJLyogQSBiaXRwYXR0ZXJuIG9mIGNyX3JhdGVzICovCisJdTE2IGJhc2ljX3JhdGVzOworCisJLyogQSB6ZF9yYXRlICovCisJdTggcnRzX3JhdGU7CisKKwkvKiBTaG9ydCBwcmVhbWJsZSAodXNlZCBmb3IgUlRTL0NUUykgKi8KKwl1bnNpZ25lZCBpbnQgc2hvcnRfcHJlYW1ibGU6MTsKKworCS8qIGZsYWdzIHRvIGluZGljYXRlIHVwZGF0ZSBpbiBwcm9ncmVzcyAqLworCXVuc2lnbmVkIGludCB1cGRhdGluZ19ydHNfcmF0ZToxOworCXVuc2lnbmVkIGludCB1cGRhdGluZ19iYXNpY19yYXRlczoxOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqemRfbWFjX3RvX2llZWU4MDIxMShzdHJ1Y3QgemRfbWFjICptYWMpCkBAIC0xODAsNyArMTk2LDcgQEAKIHU4IHpkX21hY19nZXRfcmVnZG9tYWluKHN0cnVjdCB6ZF9tYWMgKnpkX21hYyk7CiAKIGludCB6ZF9tYWNfcmVxdWVzdF9jaGFubmVsKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggY2hhbm5lbCk7Ci1pbnQgemRfbWFjX2dldF9jaGFubmVsKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggKmNoYW5uZWwsIHU4ICpmbGFncyk7Cit1OCB6ZF9tYWNfZ2V0X2NoYW5uZWwoc3RydWN0IHpkX21hYyAqbWFjKTsKIAogaW50IHpkX21hY19zZXRfbW9kZShzdHJ1Y3QgemRfbWFjICptYWMsIHUzMiBtb2RlKTsKIGludCB6ZF9tYWNfZ2V0X21vZGUoc3RydWN0IHpkX21hYyAqbWFjLCB1MzIgKm1vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9uZXRkZXYuYwppbmRleCBhZjNhN2IzLi42MGYxYjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9uZXRkZXYuYwpAQCAtMTA3LDIxICsxMDcsMTAgQEAKIAkgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKnJlcSwgY2hhciAqZXh0cmEpCiB7Ci0JaW50IHI7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfbmV0ZGV2X21hYyhuZXRkZXYpOwogCXN0cnVjdCBpd19mcmVxICpmcmVxID0gJnJlcS0+ZnJlcTsKLQl1OCBjaGFubmVsOwotCXU4IGZsYWdzOwogCi0JciA9IHpkX21hY19nZXRfY2hhbm5lbChtYWMsICZjaGFubmVsLCAmZmxhZ3MpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCWZyZXEtPmZsYWdzID0gKGZsYWdzICYgTUFDX0ZJWEVEX0NIQU5ORUwpID8KLQkJICAgICAgSVdfRlJFUV9GSVhFRCA6IElXX0ZSRVFfQVVUTzsKLQlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLCAiY2hhbm5lbCAlc1xuIiwKLQkJICAoZmxhZ3MgJiBNQUNfRklYRURfQ0hBTk5FTCkgPyAiZml4ZWQiIDogImF1dG8iKTsKLQlyZXR1cm4gemRfY2hhbm5lbF90b19mcmVxKGZyZXEsIGNoYW5uZWwpOworCXJldHVybiB6ZF9jaGFubmVsX3RvX2ZyZXEoZnJlcSwgemRfbWFjX2dldF9jaGFubmVsKG1hYykpOwogfQogCiBzdGF0aWMgaW50IGl3X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IDNmYWFlYjIuLmFhNzgyZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC00NywxMSArNDcsMTcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MDIpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCiAJeyBVU0JfREVWSUNFKDB4MGIzYiwgMHg1NjMwKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAogCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTcwYyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNDM1LCAweDA3MTEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCisJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDA5KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAorCXsgVVNCX0RFVklDRSgweDBiM2IsIDB4MTYzMCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MDEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCisJeyBVU0JfREVWSUNFKDB4MTRlYSwgMHhhYjEzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAogCS8qIFpEMTIxMUIgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYWNlLCAweDEyMTUpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDE1N2UsIDB4MzAwZCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDc5YiwgMHgwMDYyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxNTgyLCAweDYwMDMpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAorCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4NzA1YyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJLyogIkRyaXZlcmxlc3MiIGRldmljZXMgdGhhdCBuZWVkIGVqZWN0aW5nICovCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgyMDExKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX0lOU1RBTExFUiB9LAogCXt9CkBAIC0zNjYsMTUgKzM3Miw2IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfcmVhZF9yZWdzX2ludChzdHJ1Y3QgemRfdXNiICp1c2IpCi17Ci0Jc3RydWN0IHpkX3VzYl9pbnRlcnJ1cHQgKmludHIgPSAmdXNiLT5pbnRyOwotCi0Jc3Bpbl9sb2NrKCZpbnRyLT5sb2NrKTsKLQlpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCA9IDA7Ci0Jc3Bpbl91bmxvY2soJmludHItPmxvY2spOwotfQotCiAjZGVmaW5lIHVyYl9kZXYodXJiKSAoJih1cmIpLT5kZXYtPmRldikKIAogc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9yZWdzX2ludChzdHJ1Y3QgdXJiICp1cmIpCkBAIC01OTYsNiArNTkzLDggQEAKIAkJdW5zaWduZWQgaW50IGwsIGssIG47CiAJCWZvciAoaSA9IDAsIGwgPSAwOzsgaSsrKSB7CiAJCQlrID0gbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgmbGVuZ3RoX2luZm8tPmxlbmd0aFtpXSkpOworCQkJaWYgKGsgPT0gMCkKKwkJCQlyZXR1cm47CiAJCQluID0gbCtrOwogCQkJaWYgKG4gPiBsZW5ndGgpCiAJCQkJcmV0dXJuOwpAQCAtMTExOSwyNyArMTExOCwyOCBAQAogewogCWludCByOwogCi0JcHJfZGVidWcoInVzYl9pbml0KClcbiIpOworCXByX2RlYnVnKCIlcyB1c2JfaW5pdCgpXG4iLCBkcml2ZXIubmFtZSk7CiAKIAl6ZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShkcml2ZXIubmFtZSk7CiAJaWYgKHpkX3dvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IGNyZWF0ZSB3b3JrcXVldWVcbiIsIGRyaXZlci5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBjb3VsZG4ndCBjcmVhdGUgd29ya3F1ZXVlXG4iLCBkcml2ZXIubmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXIgPSB1c2JfcmVnaXN0ZXIoJmRyaXZlcik7CiAJaWYgKHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1c2JfcmVnaXN0ZXIoKSBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgdXNiX3JlZ2lzdGVyKCkgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsCisJCSAgICAgICBkcml2ZXIubmFtZSwgcik7CiAJCXJldHVybiByOwogCX0KIAotCXByX2RlYnVnKCJ6ZDEyMTFydyBpbml0aWFsaXplZFxuIik7CisJcHJfZGVidWcoIiVzIGluaXRpYWxpemVkXG4iLCBkcml2ZXIubmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1c2JfZXhpdCh2b2lkKQogewotCXByX2RlYnVnKCJ1c2JfZXhpdCgpXG4iKTsKKwlwcl9kZWJ1ZygiJXMgdXNiX2V4aXQoKVxuIiwgZHJpdmVyLm5hbWUpOwogCXVzYl9kZXJlZ2lzdGVyKCZkcml2ZXIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHpkX3dvcmtxdWV1ZSk7CiB9CkBAIC0xMTU2LDEwICsxMTU2LDE5IEBACiB7CiAJc3RydWN0IHpkX3VzYl9pbnRlcnJ1cHQgKmludHIgPSAmdXNiLT5pbnRyOwogCi0Jc3Bpbl9sb2NrKCZpbnRyLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIAlpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCA9IDE7CiAJSU5JVF9DT01QTEVUSU9OKGludHItPnJlYWRfcmVncy5jb21wbGV0aW9uKTsKLQlzcGluX3VubG9jaygmaW50ci0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9yZWFkX3JlZ3NfaW50KHN0cnVjdCB6ZF91c2IgKnVzYikKK3sKKwlzdHJ1Y3QgemRfdXNiX2ludGVycnVwdCAqaW50ciA9ICZ1c2ItPmludHI7CisKKwlzcGluX2xvY2tfaXJxKCZpbnRyLT5sb2NrKTsKKwlpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIH0KIAogc3RhdGljIGludCBnZXRfcmVzdWx0cyhzdHJ1Y3QgemRfdXNiICp1c2IsIHUxNiAqdmFsdWVzLApAQCAtMTE3MSw3ICsxMTgwLDcgQEAKIAlzdHJ1Y3QgcmVhZF9yZWdzX2ludCAqcnIgPSAmaW50ci0+cmVhZF9yZWdzOwogCXN0cnVjdCB1c2JfaW50X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHVzYl9pbnRfcmVncyAqKXJyLT5idWZmZXI7CiAKLQlzcGluX2xvY2soJmludHItPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmludHItPmxvY2spOwogCiAJciA9IC1FSU87CiAJLyogVGhlIGNyZWF0ZWQgYmxvY2sgc2l6ZSBzZWVtcyB0byBiZSBsYXJnZXIgdGhhbiBleHBlY3RlZC4KQEAgLTEyMDQsNyArMTIxMyw3IEBACiAKIAlyID0gMDsKIGVycm9yX3VubG9jazoKLQlzcGluX3VubG9jaygmaW50ci0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaAppbmRleCBlODFhMmQzLi4zMTdkMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaApAQCAtNzQsMTcgKzc0LDE3IEBACiBzdHJ1Y3QgdXNiX3JlcV9yZWFkX3JlZ3MgewogCV9fbGUxNiBpZDsKIAlfX2xlMTYgYWRkclswXTsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcmVnX2RhdGEgewogCV9fbGUxNiBhZGRyOwogCV9fbGUxNiB2YWx1ZTsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgdXNiX3JlcV93cml0ZV9yZWdzIHsKIAlfX2xlMTYgaWQ7CiAJc3RydWN0IHJlZ19kYXRhIHJlZ193cml0ZXNbMF07Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogZW51bSB7CiAJUkZfSUZfTEUgPSAweDAyLApAQCAtMTAxLDcgKzEwMSw3IEBACiAJLyogUkYyNTk1OiAyNCAqLwogCV9fbGUxNiBiaXRfdmFsdWVzWzBdOwogCS8qIChDUjIwMyAmIH4oUkZfSUZfTEUgfCBSRl9DTEsgfCBSRl9EQVRBKSkgfCAoYml0ID8gUkZfREFUQSA6IDApICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogVVNCIGludGVycnVwdCAqLwogCkBAIC0xMTgsMTIgKzExOCwxMiBAQAogc3RydWN0IHVzYl9pbnRfaGVhZGVyIHsKIAl1OCB0eXBlOwkvKiBtdXN0IGFsd2F5cyBiZSAxICovCiAJdTggaWQ7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHVzYl9pbnRfcmVncyB7CiAJc3RydWN0IHVzYl9pbnRfaGVhZGVyIGhkcjsKIAlzdHJ1Y3QgcmVnX2RhdGEgcmVnc1swXTsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgdXNiX2ludF9yZXRyeV9mYWlsIHsKIAlzdHJ1Y3QgdXNiX2ludF9oZWFkZXIgaGRyOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJdTggX2R1bW15OwogCXU4IGFkZHJbRVRIX0FMRU5dOwogCXU4IGlic3Nfd2FrZXVwX2Rlc3Q7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHJlYWRfcmVnc19pbnQgewogCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96b3JybzgzOTAuYyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCmluZGV4IGRmMDRlMDUuLmQ4NWUyZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCkBAIC0zNCw4ICszNCwxNiBAQAogI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogCi0jaW5jbHVkZSAiODM5MC5oIgorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjZGVmaW5lIGVpX2luYihwb3J0KSAgIGluXzgocG9ydCkKKyNkZWZpbmUgZWlfb3V0Yih2YWwscG9ydCkgIG91dF84KHBvcnQsdmFsKQorI2RlZmluZSBlaV9pbmJfcChwb3J0KSAgIGluXzgocG9ydCkKKyNkZWZpbmUgZWlfb3V0Yl9wKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCiAKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgIjgzOTAuYzp2MS4xMGN2cyA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlICJsaWI4MzkwLmMiCiAKICNkZWZpbmUgRFJWX05BTUUJInpvcnJvODM5MCIKIApAQCAtMTE0LDcgKzEyMiw3IEBACiAJICAgIGJyZWFrOwogICAgIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CiAgICAgaW9hZGRyID0gYm9hcmQrY2FyZHNbaV0ub2Zmc2V0OwotICAgIGRldiA9IGFsbG9jX2VpX25ldGRldigpOworICAgIGRldiA9IF9fX19hbGxvY19laV9uZXRkZXYoMCk7CiAgICAgaWYgKCFkZXYpCiAJcmV0dXJuIC1FTk9NRU07CiAgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOwpAQCAtMjAxLDcgKzIwOSw3IEBACiAgICAgZGV2LT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CiAKICAgICAvKiBJbnN0YWxsIHRoZSBJbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBkZXYpOworICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIF9fZWlfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGRldik7CiAgICAgaWYgKGkpIHJldHVybiBpOwogCiAgICAgZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykgewpAQCAtMjI2LDEwICsyMzQsMTAgQEAKICAgICBkZXYtPm9wZW4gPSAmem9ycm84MzkwX29wZW47CiAgICAgZGV2LT5zdG9wID0gJnpvcnJvODM5MF9jbG9zZTsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IF9fZWlfcG9sbDsKICNlbmRpZgogCi0gICAgTlM4MzkwX2luaXQoZGV2LCAwKTsKKyAgICBfX05TODM5MF9pbml0KGRldiwgMCk7CiAgICAgZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAgICAgaWYgKGVycikgewogCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZGV2KTsKQEAgLTI0Niw3ICsyNTQsNyBAQAogCiBzdGF0aWMgaW50IHpvcnJvODM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgZWlfb3BlbihkZXYpOworICAgIF9fZWlfb3BlbihkZXYpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNTQsNyArMjYyLDcgQEAKIHsKICAgICBpZiAoZWlfZGVidWcgPiAxKQogCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOwotICAgIGVpX2Nsb3NlKGRldik7CisgICAgX19laV9jbG9zZShkZXYpOwogICAgIHJldHVybiAwOwogfQogCkBAIC00MDUsNyArNDEzLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLAogCQkgICAgICAgZGV2LT5uYW1lKTsKIAkJem9ycm84MzkwX3Jlc2V0XzgzOTAoZGV2KTsKLQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQlfX05TODM5MF9pbml0KGRldiwxKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jIGIvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYwppbmRleCA2OGNiM2EwLi5mZTNmNWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogKiogICBUaGlzIGJpdCB0ZWxscyBVMiB0byBkbyBSL00vVyBmb3IgcGFydGlhbCBjYWNoZWxpbmVzLiAiU3RyZWFtaW5nIgogKiogICBkYXRhIGNhbiBhdm9pZCB0aGlzIGlmIHRoZSBtYXBwaW5nIGNvdmVycyBmdWxsIGNhY2hlIGxpbmVzLgogKiogbyBTVE9QX01PU1QgaXMgbmVlZGVkIGZvciBhdG9taWNpdHkgYWNyb3NzIGNhY2hlbGluZXMuCi0qKiAgIEFwcGVyZW50bHkgb25seSAic29tZSBFSVNBIGRldmljZXMiIG5lZWQgdGhpcy4KKyoqICAgQXBwYXJlbnRseSBvbmx5ICJzb21lIEVJU0EgZGV2aWNlcyIgbmVlZCB0aGlzLgogKiogICBVc2luZyBDT05GSUdfSVNBIGlzIGhhY2suIE9ubHkgdGhlIElPQSB3aXRoIEVJU0EgdW5kZXIgaXQgbmVlZHMKICoqICAgdG8gdXNlIHRoaXMgaGludCBpZmYgdGhlIEVJU0EgZGV2aWNlcyBuZWVkcyB0aGlzIGZlYXR1cmUuCiAqKiAgIEFjY29yZGluZyB0byB0aGUgVTIgRVJTLCBTVE9QX01PU1QgZW5hYmxlZCBwYWdlcyBodXJ0IHBlcmZvcm1hbmNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jIGIvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCmluZGV4IGMyOTQ5YjQuLjEyYmFiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYworKysgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKQEAgLTUwLDEyICs1MCwxMiBAQAogKioKICoqIFBBIEZpcm13YXJlCiAqKiAtLS0tLS0tLS0tLQotKiogUEEtUklTQyBwbGF0Zm9ybXMgaGF2ZSB0d28gZnVuZGVtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMgb2YgZmlybXdhcmUuCisqKiBQQS1SSVNDIHBsYXRmb3JtcyBoYXZlIHR3byBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0eXBlcyBvZiBmaXJtd2FyZS4KICoqIEZvciBQQ0kgZGV2aWNlcywgIkxlZ2FjeSIgUERDIGluaXRpYWxpemVzIHRoZSAiSU5URVJSVVBUX0xJTkUiIHJlZ2lzdGVyCiAqKiBhbmQgQkFScyBzaW1pbGFyIHRvIGEgdHJhZGl0aW9uYWwgUEMgQklPUy4KICoqIFRoZSBuZXdlciAiUEFUIiBmaXJtd2FyZSBzdXBwb3J0cyBQREMgY2FsbHMgd2hpY2ggcmV0dXJuIHRhYmxlcy4KLSoqIFBBVCBmaXJtd2FyZSBvbmx5IGluaXRpYWxpemVzIFBDSSBDb25zb2xlIGFuZCBCb290IGludGVyZmFjZS4KLSoqIFdpdGggdGhlc2UgdGFibGVzLCB0aGUgT1MgY2FuIHByb2dhbSBhbGwgb3RoZXIgUENJIGRldmljZXMuCisqKiBQQVQgZmlybXdhcmUgb25seSBpbml0aWFsaXplcyB0aGUgUENJIENvbnNvbGUgYW5kIEJvb3QgaW50ZXJmYWNlLgorKiogV2l0aCB0aGVzZSB0YWJsZXMsIHRoZSBPUyBjYW4gcHJvZ3JhbSBhbGwgb3RoZXIgUENJIGRldmljZXMuCiAqKgogKiogT25lIHN1Y2ggUEFUIFBEQyBjYWxsIHJldHVybnMgdGhlICJJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSIgKElSVCkuCiAqKiBUaGUgSVJUIG1hcHMgZWFjaCBQQ0kgc2xvdCdzIElOVEEtRCAib3V0cHV0IiBsaW5lIHRvIGFuIEkvTyBTQVBJQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKaW5kZXggYjk1M2Q1OS4uZTYwYjRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCkBAIC0xNjYsMTQgKzE2Niw2IEBACiAgICAgCiAgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7IHR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKQEAgLTI2Myw2ICsyNTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgcGFycG9ydF9pZHNbXSA9IHsKIAlQQ01DSUFfREVWSUNFX0ZVTkNfSUQoMyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwrUGFyYWxsZWwgUG9ydDogU1AyMzAiLDB4M2JlYjhjZjIsMHhkYjllNThiYyksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM3LCAweDAwMDMpLAogCVBDTUNJQV9ERVZJQ0VfTlVMTAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IDVmMWI5ZjUuLmYxZGQ4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMTksNyArMTksNyBAQAogCiBjb25maWcgUENJX01VTFRJVEhSRUFEX1BST0JFCiAJYm9vbCAiUENJIE11bHRpLXRocmVhZGVkIHByb2JlIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTCAmJiBCUk9LRU4KKwlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBQQ0kgY29yZSB0byBzcGF3biBhIG5ldyB0aHJlYWQgZm9yCiAJICBldmVyeSBQQ0kgZGV2aWNlIHRoYXQgaXMgcHJvYmVkLiAgVGhpcyBjYW4gY2F1c2UgYSBodWdlCkBAIC0yNywxNCArMjcsMTQgQEAKIAkgIHNtYWxsZXIgc3BlZWR1cCBvbiBzaW5nbGUgcHJvY2Vzc29yIG1hY2hpbmVzLgogCiAJICBCdXQgaXQgY2FuIGFsc28gY2F1c2UgbG90cyBvZiBiYWQgdGhpbmdzIHRvIGhhcHBlbi4gIEEgbnVtYmVyCi0JICBvZiBQQ0kgZHJpdmVycyBjYW4gbm90IHByb3Blcmx5IGhhbmRsZSBydW5uaW5nIGluIHRoaXMgd2F5LAorCSAgb2YgUENJIGRyaXZlcnMgY2Fubm90IHByb3Blcmx5IGhhbmRsZSBydW5uaW5nIGluIHRoaXMgd2F5LAogCSAgc29tZSB3aWxsIGp1c3Qgbm90IHdvcmsgcHJvcGVybHkgYXQgYWxsLCB3aGlsZSBvdGhlcnMgbWlnaHQKIAkgIGRlY2lkZSB0byBibG93IHVwIHBvd2VyIHN1cHBsaWVzIHdpdGggYSBodWdlIGxvYWQgYWxsIGF0IG9uY2UsCiAJICBzbyB1c2UgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzay4KIAogCSAgSXQgaXMgdmVyeSB1bndpc2UgdG8gdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgbm90IHVzaW5nIGEKIAkgIGJvb3QgcHJvY2VzcyB0aGF0IGNhbiBoYW5kbGUgZGV2aWNlcyBiZWluZyBjcmVhdGVkIGluIGFueQotCSAgb3JkZXIuICBBIHByb2dyYW0gdGhhdCBjYW4gY3JlYXRlIHBlcnNpc3RhbnQgYmxvY2sgYW5kIG5ldHdvcmsKKwkgIG9yZGVyLiAgQSBwcm9ncmFtIHRoYXQgY2FuIGNyZWF0ZSBwZXJzaXN0ZW50IGJsb2NrIGFuZCBuZXR3b3JrCiAJICBkZXZpY2UgbmFtZXMgKGxpa2UgdWRldikgaXMgYSBnb29kIGlkZWEgaWYgeW91IHdpc2ggdG8gdXNlCiAJICB0aGlzIG9wdGlvbi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYWNjZXNzLmMgYi9kcml2ZXJzL3BjaS9hY2Nlc3MuYwppbmRleCBlYTE2ODA1Li5mYzQwNWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9hY2Nlc3MuYworKysgYi9kcml2ZXJzL3BjaS9hY2Nlc3MuYwpAQCAtMSw2ICsxLDggQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogI2luY2x1ZGUgInBjaS5oIgogCkBAIC02MywzMCArNjUsNDIgQEAKIEVYUE9SVF9TWU1CT0wocGNpX2J1c193cml0ZV9jb25maWdfd29yZCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKTsKIAotc3RhdGljIHUzMiBwY2lfdXNlcl9jYWNoZWRfY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MpCi17Ci0JdTMyIGRhdGE7CisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGFjY2Vzc2luZyBQQ0kgY29uZmlnCisgKiBzcGFjZSB3aGVuIGl0J3MgdW5zYWZlIHRvIGRvIHNvLiAgU29tZSBkZXZpY2VzIHJlcXVpcmUgdGhpcyBkdXJpbmcgQklTVCBhbmQKKyAqIHdlJ3JlIHJlcXVpcmVkIHRvIHByZXZlbnQgaXQgZHVyaW5nIEQtc3RhdGUgdHJhbnNpdGlvbnMuCisgKgorICogV2UgaGF2ZSBhIGJpdCBwZXIgZGV2aWNlIHRvIGluZGljYXRlIGl0J3MgYmxvY2tlZCBhbmQgYSBnbG9iYWwgd2FpdCBxdWV1ZQorICogZm9yIGNhbGxlcnMgdG8gc2xlZXAgb24gdW50aWwgZGV2aWNlcyBhcmUgdW5ibG9ja2VkLgorICovCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocGNpX3VjZmdfd2FpdCk7CiAKLQlkYXRhID0gZGV2LT5zYXZlZF9jb25maWdfc3BhY2VbcG9zL3NpemVvZihkZXYtPnNhdmVkX2NvbmZpZ19zcGFjZVswXSldOwotCWRhdGEgPj49IChwb3MgJSBzaXplb2YoZGV2LT5zYXZlZF9jb25maWdfc3BhY2VbMF0pKSAqIDg7Ci0JcmV0dXJuIGRhdGE7CitzdGF0aWMgbm9pbmxpbmUgdm9pZCBwY2lfd2FpdF91Y2ZnKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlfX2FkZF93YWl0X3F1ZXVlKCZwY2lfdWNmZ193YWl0LCAmd2FpdCk7CisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycSgmcGNpX2xvY2spOworCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfaXJxKCZwY2lfbG9jayk7CisJfSB3aGlsZSAoZGV2LT5ibG9ja191Y2ZnX2FjY2Vzcyk7CisJX19yZW1vdmVfd2FpdF9xdWV1ZSgmcGNpX3VjZmdfd2FpdCwgJndhaXQpOwogfQogCiAjZGVmaW5lIFBDSV9VU0VSX1JFQURfQ09ORklHKHNpemUsdHlwZSkJCQkJCVwKIGludCBwY2lfdXNlcl9yZWFkX2NvbmZpZ18jI3NpemUJCQkJCQlcCiAJKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIHR5cGUgKnZhbCkJCQlcCiB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAogCWludCByZXQgPSAwOwkJCQkJCQlcCiAJdTMyIGRhdGEgPSAtMTsJCQkJCQkJXAogCWlmIChQQ0lfIyNzaXplIyNfQkFEKSByZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwlcCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9sb2NrLCBmbGFncyk7CQkJCVwKLQlpZiAobGlrZWx5KCFkZXYtPmJsb2NrX3VjZmdfYWNjZXNzKSkJCQkJXAotCQlyZXQgPSBkZXYtPmJ1cy0+b3BzLT5yZWFkKGRldi0+YnVzLCBkZXYtPmRldmZuLAkJXAorCXNwaW5fbG9ja19pcnEoJnBjaV9sb2NrKTsJCQkJCVwKKwlpZiAodW5saWtlbHkoZGV2LT5ibG9ja191Y2ZnX2FjY2VzcykpIHBjaV93YWl0X3VjZmcoZGV2KTsJXAorCXJldCA9IGRldi0+YnVzLT5vcHMtPnJlYWQoZGV2LT5idXMsIGRldi0+ZGV2Zm4sCQkJXAogCQkJCQlwb3MsIHNpemVvZih0eXBlKSwgJmRhdGEpOwlcCi0JZWxzZSBpZiAocG9zIDwgc2l6ZW9mKGRldi0+c2F2ZWRfY29uZmlnX3NwYWNlKSkJCQlcCi0JCWRhdGEgPSBwY2lfdXNlcl9jYWNoZWRfY29uZmlnKGRldiwgcG9zKTsgCQlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2xvY2ssIGZsYWdzKTsJCQlcCisJc3Bpbl91bmxvY2tfaXJxKCZwY2lfbG9jayk7CQkJCQlcCiAJKnZhbCA9ICh0eXBlKWRhdGE7CQkJCQkJXAogCXJldHVybiByZXQ7CQkJCQkJCVwKIH0KQEAgLTk1LDE0ICsxMDksMTMgQEAKIGludCBwY2lfdXNlcl93cml0ZV9jb25maWdfIyNzaXplCQkJCQlcCiAJKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIHR5cGUgdmFsKQkJCVwKIHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCQlcCiAJaW50IHJldCA9IC1FSU87CQkJCQkJCVwKIAlpZiAoUENJXyMjc2l6ZSMjX0JBRCkgcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfbG9jaywgZmxhZ3MpOwkJCQlcCi0JaWYgKGxpa2VseSghZGV2LT5ibG9ja191Y2ZnX2FjY2VzcykpCQkJCVwKLQkJcmV0ID0gZGV2LT5idXMtPm9wcy0+d3JpdGUoZGV2LT5idXMsIGRldi0+ZGV2Zm4sCVwKKwlzcGluX2xvY2tfaXJxKCZwY2lfbG9jayk7CQkJCQlcCisJaWYgKHVubGlrZWx5KGRldi0+YmxvY2tfdWNmZ19hY2Nlc3MpKSBwY2lfd2FpdF91Y2ZnKGRldik7CVwKKwlyZXQgPSBkZXYtPmJ1cy0+b3BzLT53cml0ZShkZXYtPmJ1cywgZGV2LT5kZXZmbiwJCVwKIAkJCQkJcG9zLCBzaXplb2YodHlwZSksIHZhbCk7CVwKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfbG9jaywgZmxhZ3MpOwkJCVwKKwlzcGluX3VubG9ja19pcnEoJnBjaV9sb2NrKTsJCQkJCVwKIAlyZXR1cm4gcmV0OwkJCQkJCQlcCiB9CiAKQEAgLTExNywyMSArMTMwLDIzIEBACiAgKiBwY2lfYmxvY2tfdXNlcl9jZmdfYWNjZXNzIC0gQmxvY2sgdXNlcnNwYWNlIFBDSSBjb25maWcgcmVhZHMvd3JpdGVzCiAgKiBAZGV2OglwY2kgZGV2aWNlIHN0cnVjdAogICoKLSAqIFRoaXMgZnVuY3Rpb24gYmxvY2tzIGFueSB1c2Vyc3BhY2UgUENJIGNvbmZpZyBhY2Nlc3NlcyBmcm9tIG9jY3VycmluZy4KLSAqIFdoZW4gYmxvY2tlZCwgYW55IHdyaXRlcyB3aWxsIGJlIGJpdCBidWNrZXRlZCBhbmQgcmVhZHMgd2lsbCByZXR1cm4gdGhlCi0gKiBkYXRhIHNhdmVkIHVzaW5nIHBjaV9zYXZlX3N0YXRlIGZvciB0aGUgZmlyc3QgNjQgYnl0ZXMgb2YgY29uZmlnCi0gKiBzcGFjZSBhbmQgcmV0dXJuIDB4ZmYgZm9yIGFsbCBvdGhlciBjb25maWcgcmVhZHMuCi0gKiovCisgKiBXaGVuIHVzZXIgYWNjZXNzIGlzIGJsb2NrZWQsIGFueSByZWFkcyBvciB3cml0ZXMgdG8gY29uZmlnIHNwYWNlIHdpbGwKKyAqIHNsZWVwIHVudGlsIGFjY2VzcyBpcyB1bmJsb2NrZWQgYWdhaW4uICBXZSBkb24ndCBhbGxvdyBuZXN0aW5nIG9mCisgKiBibG9jay91bmJsb2NrIGNhbGxzLgorICovCiB2b2lkIHBjaV9ibG9ja191c2VyX2NmZ19hY2Nlc3Moc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3YXNfYmxvY2tlZDsKIAotCXBjaV9zYXZlX3N0YXRlKGRldik7Ci0KLQkvKiBzcGlubG9jayB0byBzeW5jaHJvbml6ZSB3aXRoIGFueW9uZSByZWFkaW5nIGNvbmZpZyBzcGFjZSBub3cgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2xvY2ssIGZsYWdzKTsKKwl3YXNfYmxvY2tlZCA9IGRldi0+YmxvY2tfdWNmZ19hY2Nlc3M7CiAJZGV2LT5ibG9ja191Y2ZnX2FjY2VzcyA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2xvY2ssIGZsYWdzKTsKKworCS8qIElmIHdlIEJVRygpIGluc2lkZSB0aGUgcGNpX2xvY2ssIHdlJ3JlIGd1YXJhbnRlZWQgdG8gaG9zZQorCSAqIHRoZSBtYWNoaW5lICovCisJQlVHX09OKHdhc19ibG9ja2VkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9ibG9ja191c2VyX2NmZ19hY2Nlc3MpOwogCkBAIC0xNDAsMTQgKzE1NSwxOSBAQAogICogQGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1c2Vyc3BhY2UgUENJIGNvbmZpZyBhY2Nlc3NlcyB0byByZXN1bWUuCi0gKiovCisgKi8KIHZvaWQgcGNpX3VuYmxvY2tfdXNlcl9jZmdfYWNjZXNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIHNwaW5sb2NrIHRvIHN5bmNocm9uaXplIHdpdGggYW55b25lIHJlYWRpbmcgc2F2ZWQgY29uZmlnIHNwYWNlICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9sb2NrLCBmbGFncyk7CisKKwkvKiBUaGlzIGluZGljYXRlcyBhIHByb2JsZW0gaW4gdGhlIGNhbGxlciwgYnV0IHdlIGRvbid0IG5lZWQKKwkgKiB0byBraWxsIHRoZW0sIHVubGlrZSBhIGRvdWJsZS1ibG9jayBhYm92ZS4gKi8KKwlXQVJOX09OKCFkZXYtPmJsb2NrX3VjZmdfYWNjZXNzKTsKKwogCWRldi0+YmxvY2tfdWNmZ19hY2Nlc3MgPSAwOworCXdha2VfdXBfYWxsKCZwY2lfdWNmZ193YWl0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX3VuYmxvY2tfdXNlcl9jZmdfYWNjZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKaW5kZXggNTljNWIyNC4uZGRiYWRkOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC02MiwxMCArNjIsMTAgQEAKIHN0cnVjdCBzbG90IHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90CSpob3RwbHVnX3Nsb3Q7CiAJc3RydWN0IGFjcGlwaHBfc2xvdAkqYWNwaV9zbG90OworCXN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyBpbmZvOworCWNoYXIgbmFtZVtTTE9UX05BTUVfU0laRV07CiB9OwogCi0KLQogLyoqCiAgKiBzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgLSBQQ0kgYnJpZGdlIGluZm9ybWF0aW9uCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMKaW5kZXggYzU3ZDlkNWMuLjQwYzc5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYwpAQCAtMzAzLDI1ICszMDMsMTUgQEAKIAkvKiByZWFkIGluaXRpYWwgbnVtYmVyIG9mIHNsb3RzICovCiAJaWYgKCFyZXR2YWwpIHsKIAkJbnVtX3Nsb3RzID0gYWNwaXBocF9nZXRfbnVtX3Nsb3RzKCk7Ci0JCWlmIChudW1fc2xvdHMgPT0gMCkKKwkJaWYgKG51bV9zbG90cyA9PSAwKSB7CisJCQlhY3BpcGhwX2dsdWVfZXhpdCgpOwogCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJfQogCX0KIAogCXJldHVybiByZXR2YWw7CiB9CiAKLQotLyoqCi0gKiBtYWtlX3Nsb3RfbmFtZSAtIG1ha2UgYSBzbG90IG5hbWUgdGhhdCBhcHBlYXJzIGluIHBjaWhwZnMKLSAqIEBzbG90OiBzbG90IHRvIG5hbWUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIG1ha2Vfc2xvdF9uYW1lKHN0cnVjdCBzbG90ICpzbG90KQotewotCXNucHJpbnRmKHNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSwgU0xPVF9OQU1FX1NJWkUsICIldSIsCi0JCSBzbG90LT5hY3BpX3Nsb3QtPnN1bik7Ci19Ci0KIC8qKgogICogcmVsZWFzZV9zbG90IC0gZnJlZSB1cCB0aGUgbWVtb3J5IHVzZWQgYnkgYSBzbG90CiAgKiBAaG90cGx1Z19zbG90OiBzbG90IHRvIGZyZWUKQEAgLTMzMiw4ICszMjIsNiBAQAogCiAJZGJnKCIlcyAtIHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBob3RwbHVnX3Nsb3QtPm5hbWUpOwogCi0Ja2ZyZWUoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKTsKLQlrZnJlZShzbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUpOwogCWtmcmVlKHNsb3QtPmhvdHBsdWdfc2xvdCk7CiAJa2ZyZWUoc2xvdCk7CiB9CkBAIC0zNDIsMjYgKzMzMCwxOSBAQAogaW50IGFjcGlwaHBfcmVnaXN0ZXJfaG90cGx1Z19zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKmFjcGlwaHBfc2xvdCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7Ci0Jc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICpob3RwbHVnX3Nsb3RfaW5mbzsKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAogCXNsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9LRVJORUwpOwogCWlmICghc2xvdCkKIAkJZ290byBlcnJvcjsKIAotCXNsb3QtPmhvdHBsdWdfc2xvdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3RwbHVnX3Nsb3QpLCBHRlBfS0VSTkVMKTsKKwlzbG90LT5ob3RwbHVnX3Nsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdC0+aG90cGx1Z19zbG90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzbG90LT5ob3RwbHVnX3Nsb3QpCiAJCWdvdG8gZXJyb3Jfc2xvdDsKIAotCXNsb3QtPmhvdHBsdWdfc2xvdC0+aW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpob3RwbHVnX3Nsb3RfaW5mbyksCi0JCQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKQotCQlnb3RvIGVycm9yX2hwc2xvdDsKKwlzbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8gPSAmc2xvdC0+aW5mbzsKIAotCXNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSA9IGt6YWxsb2MoU0xPVF9OQU1FX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKQotCQlnb3RvIGVycm9yX2luZm87CisJc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lID0gc2xvdC0+bmFtZTsKIAogCXNsb3QtPmhvdHBsdWdfc2xvdC0+cHJpdmF0ZSA9IHNsb3Q7CiAJc2xvdC0+aG90cGx1Z19zbG90LT5yZWxlYXNlID0gJnJlbGVhc2Vfc2xvdDsKQEAgLTM3NiwyMSArMzU3LDE3IEBACiAJc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5jdXJfYnVzX3NwZWVkID0gUENJX1NQRUVEX1VOS05PV047CiAKIAlhY3BpcGhwX3Nsb3QtPnNsb3QgPSBzbG90OwotCW1ha2Vfc2xvdF9uYW1lKHNsb3QpOworCXNucHJpbnRmKHNsb3QtPm5hbWUsIHNpemVvZihzbG90LT5uYW1lKSwgIiV1Iiwgc2xvdC0+YWNwaV9zbG90LT5zdW4pOwogCiAJcmV0dmFsID0gcGNpX2hwX3JlZ2lzdGVyKHNsb3QtPmhvdHBsdWdfc2xvdCk7CiAJaWYgKHJldHZhbCkgewogCQllcnIoInBjaV9ocF9yZWdpc3RlciBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmV0dmFsKTsKLQkJZ290byBlcnJvcl9uYW1lOworCQlnb3RvIGVycm9yX2hwc2xvdDsKICAJfQogCiAJaW5mbygiU2xvdCBbJXNdIHJlZ2lzdGVyZWRcbiIsIHNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKLWVycm9yX25hbWU6Ci0Ja2ZyZWUoc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKTsKLWVycm9yX2luZm86Ci0Ja2ZyZWUoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKTsKIGVycm9yX2hwc2xvdDoKIAlrZnJlZShzbG90LT5ob3RwbHVnX3Nsb3QpOwogZXJyb3Jfc2xvdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IDE2MTY3YjAuLjBiOWQwZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtMTY5MywxNCArMTY5MywxMCBAQAogICovCiBpbnQgX19pbml0IGFjcGlwaHBfZ2V0X251bV9zbG90cyh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7Ci0JaW50IG51bV9zbG90czsKKwlpbnQgbnVtX3Nsb3RzID0gMDsKIAotCW51bV9zbG90cyA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoIChub2RlLCAmYnJpZGdlX2xpc3QpIHsKLQkJYnJpZGdlID0gKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqKW5vZGU7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoYnJpZGdlLCAmYnJpZGdlX2xpc3QsIGxpc3QpIHsKIAkJZGJnKCJCdXMgJTA0eDolMDJ4IGhhcyAlZCBzbG90JXNcbiIsCiAJCQkJcGNpX2RvbWFpbl9ucihicmlkZ2UtPnBjaV9idXMpLAogCQkJCWJyaWRnZS0+cGNpX2J1cy0+bnVtYmVyLCBicmlkZ2UtPm5yX3Nsb3RzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9ocGMuYwppbmRleCBjM2FjOThhLi5mNTVhYzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9ocGMuYwpAQCAtNTMxLDcgKzUzMSw3IEBACiAqCiAqIEFjdGlvbjogIGlzc3VlIGEgUkVBRCBjb21tYW5kIHRvIEhQQwogKgotKiBJbnB1dDogICBwc2xvdCAgIC0gY2FuIG5vdCBiZSBOVUxMIGZvciBSRUFEX0FMTFNUQVQKKyogSW5wdXQ6ICAgcHNsb3QgICAtIGNhbm5vdCBiZSBOVUxMIGZvciBSRUFEX0FMTFNUQVQKICogICAgICAgICAgcHN0YXR1cyAtIGNhbiBiZSBOVUxMIGZvciBSRUFEX0FMTFNUQVQKICoKICogUmV0dXJuICAgMCBvciBlcnJvciBjb2RlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYwppbmRleCBkODdhOWUzLi5kOGYwNWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYwpAQCAtMTM3MSwxMiArMTM3MSwxMiBAQAogCX0KIAogCWJ1cyA9IGlibXBocF9maW5kX3Jlc19idXMgKHNlY19udW1iZXIpOwotCWRlYnVnICgiYnVzLT5idXNubyBpcyAleFxuIiwgYnVzLT5idXNubyk7Ci0JZGVidWcgKCJzZWNfbnVtYmVyIGlzICV4XG4iLCBzZWNfbnVtYmVyKTsKIAlpZiAoIWJ1cykgewogCQllcnIgKCJjYW5ub3QgZmluZCBCdXMgc3RydWN0dXJlIGZvciB0aGUgYnJpZGdlZCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJZGVidWcoImJ1cy0+YnVzbm8gaXMgJXhcbiIsIGJ1cy0+YnVzbm8pOworCWRlYnVnKCJzZWNfbnVtYmVyIGlzICV4XG4iLCBzZWNfbnVtYmVyKTsKIAogCWlibXBocF9yZW1vdmVfYnVzIChidXMsIGJ1c25vKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IGY5M2U4MWUuLmYxM2YzMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTUyMSwxNCArNTIxLDkgQEAKIAogfQogCi1zdGF0aWMgaW50IGhwZHJpdmVyX2NvbnRleHQgPSAwOwotCiBzdGF0aWMgdm9pZCBwY2llaHBfcmVtb3ZlIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldmljZSkKIHsKLQlwcmludGsoIiVzIEVOVFJZXG4iLCBfX0ZVTkNUSU9OX18pOwkKLQlwcmludGsoIiVzIC0+IENhbGwgZnJlZV9pcnEgZm9yIGlycSA9ICVkXG4iLCAgCi0JCV9fRlVOQ1RJT05fXywgZGV2aWNlLT5pcnEpOwotCWZyZWVfaXJxKGRldmljZS0+aXJxLCAmaHBkcml2ZXJfY29udGV4dCk7CisJLyogWFhYIC0gTmVlZHMgdG8gYmUgYWRhcHRlZCB0byBkZXZpY2UgZHJpdmVyIG1vZGVsICovCiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKaW5kZXggMWM1NTFjNi4uNmQzZjU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKQEAgLTcxOCw4ICs3MTgsNiBAQAogCQlpZiAocGhwX2N0bHItPmlycSkgewogCQkJZnJlZV9pcnEocGhwX2N0bHItPmlycSwgY3RybCk7CiAJCQlwaHBfY3Rsci0+aXJxID0gMDsKLQkJCWlmICghcGNpZV9tY2hfcXVpcmspIAotCQkJCXBjaV9kaXNhYmxlX21zaShwaHBfY3Rsci0+cGNpX2Rldik7CiAJCX0KIAl9CiAJaWYgKHBocF9jdGxyLT5wY2lfZGV2KSAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKaW5kZXggNDY4MjVmZS4uNzIzODM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAljaGFyICp0eXBlOwogCWludCByYzsKIAotCXdoaWxlICgobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSkgeworCXdoaWxlICgobnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgInBjaSIpKSkgewogCQlyYyA9IHJwYXBocF9nZXRfZHJjX3Byb3BzKG5wLCBOVUxMLCAmbmFtZSwgJnR5cGUsIE5VTEwpOwogCQlpZiAocmMgPT0gMCkKIAkJCWlmICghc3RyY21wKGRyY19uYW1lLCBuYW1lKSAmJiAhc3RyY21wKGRyY190eXBlLCB0eXBlKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYwppbmRleCAxNDE0ODZkLi43MWEyY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCkBAIC0zNTYsNyArMzU2LDcgQEAKIAlpbmZvKERSSVZFUl9ERVNDICIgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKIAlpbml0X01VVEVYKCZycGFwaHBfc2VtKTsKIAotCXdoaWxlICgoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShkbiwgInBjaSIpKSkKKwl3aGlsZSAoKGRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZG4sICJwY2kiKSkpCiAJCXJwYXBocF9hZGRfc2xvdChkbik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwppbmRleCBiNjJhZDMxLi41ZDE4OGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0yMDUsMjEgKzIwNSw2IEBACiAJcmV0dXJuIGJzc19ob3RwbHVnX3Nsb3Q7CiB9CiAKLXN0YXRpYyB2b2lkIHNuX2J1c19hbGxvY19kYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9idXMgKnN1Ym9yZGluYXRlX2J1czsKLQlzdHJ1Y3QgcGNpX2RldiAqY2hpbGQ7Ci0KLQlzbl9wY2lfZml4dXBfc2xvdChkZXYpOwotCi0JLyogUmVjdXJzaXZlbHkgc2V0cyB1cCB0aGUgc25faXJxX2luZm8gc3RydWN0cyAqLwotCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCXN1Ym9yZGluYXRlX2J1cyA9IGRldi0+c3Vib3JkaW5hdGU7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMsIGJ1c19saXN0KQotCQkJc25fYnVzX2FsbG9jX2RhdGEoY2hpbGQpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgc25fYnVzX2ZyZWVfZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfYnVzICpzdWJvcmRpbmF0ZV9idXM7CkBAIC0zMzcsNiArMzIyLDExIEBACiAJcmV0dXJuIHJjOwogfQogCisvKgorICogUG93ZXIgdXAgYW5kIGNvbmZpZ3VyZSB0aGUgc2xvdCB2aWEgYSBTQUwgY2FsbCB0byBQUk9NLgorICogU2NhbiBzbG90IChhbmQgYW55IGNoaWxkcmVuKSwgZG8gYW55IHBsYXRmb3JtIHNwZWNpZmljIGZpeHVwLAorICogYW5kIGZpbmQgZGV2aWNlIGRyaXZlci4KKyAqLwogc3RhdGljIGludCBlbmFibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQogewogCXN0cnVjdCBzbG90ICpzbG90ID0gYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKQEAgLTM0NSw2ICszMzUsNyBAQAogCWludCBmdW5jLCBudW1fZnVuY3M7CiAJaW50IG5ld19wcGIgPSAwOwogCWludCByYzsKKwl2b2lkIHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqKTsKIAogCS8qIFNlcmlhbGl6ZSB0aGUgTGludXggUENJIGluZnJhc3RydWN0dXJlICovCiAJbXV0ZXhfbG9jaygmc25faG90cGx1Z19tdXRleCk7CkBAIC0zNjcsOSArMzU4LDYgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25fcGNpX2NvbnRyb2xsZXJfZml4dXAocGNpX2RvbWFpbl9ucihzbG90LT5wY2lfYnVzKSwKLQkJCQlzbG90LT5wY2lfYnVzLT5udW1iZXIsCi0JCQkJc2xvdC0+cGNpX2J1cyk7CiAJLyoKIAkgKiBNYXAgU04gcmVzb3VyY2VzIGZvciBhbGwgZnVuY3Rpb25zIG9uIHRoZSBjYXJkCiAJICogdG8gdGhlIExpbnV4IFBDSSBpbnRlcmZhY2UgYW5kIHRlbGwgdGhlIGRyaXZlcnMKQEAgLTM4MCw2ICszNjgsMTMgQEAKIAkJCQkgICBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlX251bSArIDEsCiAJCQkJCSAgICAgUENJX0ZVTkMoZnVuYykpKTsKIAkJaWYgKGRldikgeworCQkJLyogTmVlZCB0byBkbyBzbG90IGZpeHVwIG9uIFBQQiBiZWZvcmUgZml4dXAgb2YgY2hpbGRyZW4KKwkJCSAqIChQUEIncyBwY2lkZXZfaW5mbyBuZWVkcyB0byBiZSBpbiBwY2lkZXZfaW5mbyBsaXN0CisJCQkgKiBiZWZvcmUgY2hpbGQncyBTTl9QQ0lERVZfSU5GTygpIGNhbGwgdG8gc2V0dXAKKwkJCSAqIHBkaV9ob3N0X3BjaWRldl9pbmZvKS4KKwkJCSAqLworCQkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldik7CisJCQlzbl9wY2lfZml4dXBfc2xvdChkZXYpOwogCQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewogCQkJCXVuc2lnbmVkIGNoYXIgc2VjX2J1czsKIAkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLApAQCAtMzg3LDEyICszODIsOCBAQAogCQkJCW5ld19idXMgPSBwY2lfYWRkX25ld19idXMoZGV2LT5idXMsIGRldiwKIAkJCQkJCQkgIHNlY19idXMpOwogCQkJCXBjaV9zY2FuX2NoaWxkX2J1cyhuZXdfYnVzKTsKLQkJCQlzbl9wY2lfY29udHJvbGxlcl9maXh1cChwY2lfZG9tYWluX25yKG5ld19idXMpLAotCQkJCQkJCW5ld19idXMtPm51bWJlciwKLQkJCQkJCQluZXdfYnVzKTsKIAkJCQluZXdfcHBiID0gMTsKIAkJCX0KLQkJCXNuX2J1c19hbGxvY19kYXRhKGRldik7CiAJCQlwY2lfZGV2X3B1dChkZXYpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmggYi9kcml2ZXJzL3BjaS9tc2kuaAppbmRleCBmMGNjYTE3Li4zODk4ZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuaAorKysgYi9kcml2ZXJzL3BjaS9tc2kuaApAQCAtNiwxNCArNiw2IEBACiAjaWZuZGVmIE1TSV9ICiAjZGVmaW5lIE1TSV9ICiAKLS8qCi0gKiBNU0ktWCBBZGRyZXNzIFJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgUENJX01TSVhfRkxBR1NfUVNJWkUJCTB4N0ZGCi0jZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0VOQUJMRQkJKDEgPDwgMTUpCi0jZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0JJUk1BU0sJCSg3IDw8IDApCi0jZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0JJVE1BU0sJCSgxIDw8IDApCi0KICNkZWZpbmUgUENJX01TSVhfRU5UUllfU0laRQkJCTE2CiAjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSX09GRlNFVAkwCiAjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9VUFBFUl9BRERSX09GRlNFVAk0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBiYjc0NTZjLi5hMDY0ZjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTM2LDYgKzM2LDcgQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIJb3V0cHV0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKIAl1bmlvbiBhY3BpX29iamVjdCAJKm91dF9vYmo7CiAJdTMyCQkJb3NjX2R3MDsKKwlhY3BpX3N0YXR1cyAqcmV0X3N0YXR1cyA9IChhY3BpX3N0YXR1cyAqKXJldHZhbDsKIAogCQogCS8qIFNldHRpbmcgdXAgaW5wdXQgcGFyYW1ldGVycyAqLwpAQCAtNTYsNiArNTcsNyBAQAogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIAogCQkJIkV2YWx1YXRlIF9PU0MgU2V0IGZhaWxzLiBTdGF0dXMgPSAweCUwNHhcbiIsIHN0YXR1cyk7CisJCSpyZXRfc3RhdHVzID0gc3RhdHVzOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAlvdXRfb2JqID0gb3V0cHV0LnBvaW50ZXI7CkBAIC05MCw2ICs5Miw3IEBACiAKIHF1ZXJ5X29zY19vdXQ6CiAJa2ZyZWUob3V0cHV0LnBvaW50ZXIpOworCSpyZXRfc3RhdHVzID0gc3RhdHVzOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2Niw2ICsxNjksNyBAQAogYWNwaV9zdGF0dXMgcGNpX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MpCiB7CiAJdTMyIHRlbXA7CisJYWNwaV9zdGF0dXMgcmV0dmFsOwogCiAJaWYgKCEoZmxhZ3MgJiBPU0NfU1VQUE9SVF9NQVNLUykpIHsKIAkJcmV0dXJuIEFFX1RZUEU7CkBAIC0xNzksOSArMTgzLDEzIEBACiAJYWNwaV9nZXRfZGV2aWNlcyAoIFBDSV9ST09UX0hJRF9TVFJJTkcsCiAJCQlhY3BpX3F1ZXJ5X29zYywKIAkJCWN0cmxzZXRfYnVmLAotCQkJTlVMTCApOworCQkJKHZvaWQgKiopICZyZXR2YWwgKTsKIAljdHJsc2V0X2J1ZltPU0NfUVVFUllfVFlQRV0gPSAhT1NDX1FVRVJZX0VOQUJMRTsKIAljdHJsc2V0X2J1ZltPU0NfQ09OVFJPTF9UWVBFXSA9IHRlbXA7CisJaWYgKEFDUElfRkFJTFVSRShyZXR2YWwpKSB7CisJCS8qIG5vIG9zYyBzdXBwb3J0IGF0IGFsbCAqLworCQljdHJsc2V0X2J1ZltPU0NfU1VQUE9SVF9UWVBFXSA9IDA7CisJfQogCXJldHVybiBBRV9PSzsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX29zY19zdXBwb3J0X3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggMTk0ZjFkMi4uZTVhZTNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtMzI5LDggKzMyOSw4IEBACiAJLyogcmVzdG9yZSB0aGUgUENJIGNvbmZpZyBzcGFjZSAqLwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwogCS8qIGlmIHRoZSBkZXZpY2Ugd2FzIGVuYWJsZWQgYmVmb3JlIHN1c3BlbmQsIHJlZW5hYmxlICovCi0JaWYgKHBjaV9kZXYtPmlzX2VuYWJsZWQpCi0JCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCWlmIChhdG9taWNfcmVhZCgmcGNpX2Rldi0+ZW5hYmxlX2NudCkpCisJCXJldHZhbCA9IF9fcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CiAJLyogaWYgdGhlIGRldmljZSB3YXMgYnVzbWFzdGVyIGJlZm9yZSB0aGUgc3VzcGVuZCwgbWFrZSBpdCBidXNtYXN0ZXIgYWdhaW4gKi8KIAlpZiAocGNpX2Rldi0+aXNfYnVzbWFzdGVyKQogCQlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKQEAgLTQ0NSw5ICs0NDUsMTIgQEAKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWVycm9yID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoIWVycm9yKQotCQllcnJvciA9IHBjaV9jcmVhdGVfbmV3aWRfZmlsZShkcnYpOworCWVycm9yID0gcGNpX2NyZWF0ZV9uZXdpZF9maWxlKGRydik7CisJaWYgKGVycm9yKQorCQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogCiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCBmOTUyYmZlLi43YTk0MDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtNDIsNyArNDIsNiBAQAogcGNpX2NvbmZpZ19hdHRyKHN1YnN5c3RlbV9kZXZpY2UsICIweCUwNHhcbiIpOwogcGNpX2NvbmZpZ19hdHRyKGNsYXNzLCAiMHglMDZ4XG4iKTsKIHBjaV9jb25maWdfYXR0cihpcnEsICIldVxuIik7Ci1wY2lfY29uZmlnX2F0dHIoaXNfZW5hYmxlZCwgIiV1XG4iKTsKIAogc3RhdGljIHNzaXplX3QgYnJva2VuX3Bhcml0eV9zdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTExMiwyNiArMTExLDM2IEBACiAJCSAgICAgICAodTgpKHBjaV9kZXYtPmNsYXNzID4+IDE2KSwgKHU4KShwY2lfZGV2LT5jbGFzcyA+PiA4KSwKIAkJICAgICAgICh1OCkocGNpX2Rldi0+Y2xhc3MpKTsKIH0KLXN0YXRpYyBzc2l6ZV90Ci1pc19lbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorCitzdGF0aWMgc3NpemVfdCBpc19lbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKIHsKKwlzc2l6ZV90IHJlc3VsdCA9IC1FSU5WQUw7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0JaW50IHJldHZhbCA9IDA7CiAKIAkvKiB0aGlzIGNhbiBjcmFzaCB0aGUgbWFjaGluZSB3aGVuIGRvbmUgb24gdGhlICJ3cm9uZyIgZGV2aWNlICovCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gY291bnQ7CiAKLQlpZiAoKmJ1ZiA9PSAnMCcpCi0JCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlpZiAoKmJ1ZiA9PSAnMCcpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZwZGV2LT5lbmFibGVfY250KSAhPSAwKQorCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQllbHNlCisJCQlyZXN1bHQgPSAtRUlPOworCX0gZWxzZSBpZiAoKmJ1ZiA9PSAnMScpCisJCXJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCi0JaWYgKCpidWYgPT0gJzEnKQotCQlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmVzdWx0IDwgMCA/IHJlc3VsdCA6IGNvdW50OworfQogCi0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQlyZXR1cm4gY291bnQ7CitzdGF0aWMgc3NpemVfdCBpc19lbmFibGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJXVcbiIsIGF0b21pY19yZWFkKCZwZGV2LT5lbmFibGVfY250KSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IGE1NDQ5OTcuLjVhMTRiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC00OTAsNiArNDkwLDQ3IEBACiAJa2ZyZWUoc2F2ZV9zdGF0ZSk7CiB9CiAKKworc3RhdGljIGludCBwY2lfc2F2ZV9wY2l4X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBvcywgaSA9IDA7CisJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7CisJdTE2ICpjYXA7CisKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKKwlpZiAocG9zIDw9IDApCisJCXJldHVybiAwOworCisJc2F2ZV9zdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzYXZlX3N0YXRlKSArIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhdmVfc3RhdGUpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJPdXQgb2YgbWVtb3J5IGluIHBjaV9zYXZlX3BjaWVfc3RhdGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY2FwID0gKHUxNiAqKSZzYXZlX3N0YXRlLT5kYXRhWzBdOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfWF9DTUQsICZjYXBbaSsrXSk7CisJcGNpX2FkZF9zYXZlZF9jYXAoZGV2LCBzYXZlX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGNpX3Jlc3RvcmVfcGNpeF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpID0gMCwgcG9zOworCXN0cnVjdCBwY2lfY2FwX3NhdmVkX3N0YXRlICpzYXZlX3N0YXRlOworCXUxNiAqY2FwOworCisJc2F2ZV9zdGF0ZSA9IHBjaV9maW5kX3NhdmVkX2NhcChkZXYsIFBDSV9DQVBfSURfUENJWCk7CisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUENJWCk7CisJaWYgKCFzYXZlX3N0YXRlIHx8IHBvcyA8PSAwKQorCQlyZXR1cm47CisJY2FwID0gKHUxNiAqKSZzYXZlX3N0YXRlLT5kYXRhWzBdOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX1hfQ01ELCBjYXBbaSsrXSk7CisJcGNpX3JlbW92ZV9zYXZlZF9jYXAoc2F2ZV9zdGF0ZSk7CisJa2ZyZWUoc2F2ZV9zdGF0ZSk7Cit9CisKKwogLyoqCiAgKiBwY2lfc2F2ZV9zdGF0ZSAtIHNhdmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9mIGEgZGV2aWNlIGJlZm9yZSBzdXNwZW5kaW5nCiAgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKQEAgLTUwNyw2ICs1NDgsOCBAQAogCQlyZXR1cm4gaTsKIAlpZiAoKGkgPSBwY2lfc2F2ZV9wY2llX3N0YXRlKGRldikpICE9IDApCiAJCXJldHVybiBpOworCWlmICgoaSA9IHBjaV9zYXZlX3BjaXhfc3RhdGUoZGV2KSkgIT0gMCkKKwkJcmV0dXJuIGk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzOCw2ICs1ODEsNyBAQAogCQkJCWRldi0+c2F2ZWRfY29uZmlnX3NwYWNlW2ldKTsKIAkJfQogCX0KKwlwY2lfcmVzdG9yZV9wY2l4X3N0YXRlKGRldik7CiAJcGNpX3Jlc3RvcmVfbXNpX3N0YXRlKGRldik7CiAJcGNpX3Jlc3RvcmVfbXNpeF9zdGF0ZShkZXYpOwogCXJldHVybiAwOwpAQCAtNTY4LDI3ICs2MTIsNDggQEAKIH0KIAogLyoqCisgKiBfX3BjaV9lbmFibGVfZGV2aWNlIC0gSW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlci4KKyAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKiAgSW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlci4gQXNrIGxvdy1sZXZlbCBjb2RlCisgKiAgdG8gZW5hYmxlIEkvTyBhbmQgbWVtb3J5LiBXYWtlIHVwIHRoZSBkZXZpY2UgaWYgaXQgd2FzIHN1c3BlbmRlZC4KKyAqICBCZXdhcmUsIHRoaXMgZnVuY3Rpb24gY2FuIGZhaWwuCisgKgorICogTm90ZSB0aGlzIGZ1bmN0aW9uIGlzIGEgYmFja2VuZCBhbmQgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBieQorICogbm9ybWFsIGNvZGUsIHVzZSBwY2lfZW5hYmxlX2RldmljZSgpIGluc3RlYWQuCisgKi8KK2ludAorX19wY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZV9iYXJzKGRldiwgKDEgPDwgUENJX05VTV9SRVNPVVJDRVMpIC0gMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9lbmFibGUsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogcGNpX2VuYWJsZV9kZXZpY2UgLSBJbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyLgogICogQGRldjogUENJIGRldmljZSB0byBiZSBpbml0aWFsaXplZAogICoKICAqICBJbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyLiBBc2sgbG93LWxldmVsIGNvZGUKICAqICB0byBlbmFibGUgSS9PIGFuZCBtZW1vcnkuIFdha2UgdXAgdGhlIGRldmljZSBpZiBpdCB3YXMgc3VzcGVuZGVkLgogICogIEJld2FyZSwgdGhpcyBmdW5jdGlvbiBjYW4gZmFpbC4KKyAqCisgKiAgTm90ZSB3ZSBkb24ndCBhY3R1YWxseSBlbmFibGUgdGhlIGRldmljZSBtYW55IHRpbWVzIGlmIHdlIGNhbGwKKyAqICB0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkgKHdlIGp1c3QgaW5jcmVtZW50IHRoZSBjb3VudCkuCiAgKi8KLWludAotcGNpX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK2ludCBwY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCBlcnI7Ci0KLQlpZiAoZGV2LT5pc19lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlX2JhcnMoZGV2LCAoMSA8PCBQQ0lfTlVNX1JFU09VUkNFUykgLSAxKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2VuYWJsZSwgZGV2KTsKLQlkZXYtPmlzX2VuYWJsZWQgPSAxOwotCXJldHVybiAwOworCWludCByZXN1bHQ7CisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZkZXYtPmVuYWJsZV9jbnQpID4gMSkKKwkJcmV0dXJuIDA7CQkvKiBhbHJlYWR5IGVuYWJsZWQgKi8KKwlyZXN1bHQgPSBfX3BjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWF0b21pY19kZWMoJmRldi0+ZW5hYmxlX2NudCk7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCkBAIC02MDcsMTIgKzY3MiwxOCBAQAogICoKICAqIFNpZ25hbCB0byB0aGUgc3lzdGVtIHRoYXQgdGhlIFBDSSBkZXZpY2UgaXMgbm90IGluIHVzZSBieSB0aGUgc3lzdGVtCiAgKiBhbnltb3JlLiAgVGhpcyBvbmx5IGludm9sdmVzIGRpc2FibGluZyBQQ0kgYnVzLW1hc3RlcmluZywgaWYgYWN0aXZlLgorICoKKyAqIE5vdGUgd2UgZG9uJ3QgYWN0dWFsbHkgZGlzYWJsZSB0aGUgZGV2aWNlIHVudGlsIGFsbCBjYWxsZXJzIG9mCisgKiBwY2lfZGV2aWNlX2VuYWJsZSgpIGhhdmUgY2FsbGVkIHBjaV9kZXZpY2VfZGlzYWJsZSgpLgogICovCiB2b2lkCiBwY2lfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MTYgcGNpX2NvbW1hbmQ7CiAKKwlpZiAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgJmRldi0+ZW5hYmxlX2NudCkgIT0gMCkKKwkJcmV0dXJuOworCiAJaWYgKGRldi0+bXNpX2VuYWJsZWQpCiAJCWRpc2FibGVfbXNpX21vZGUoZGV2LCBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9NU0kpLAogCQkJUENJX0NBUF9JRF9NU0kpOwpAQCAtNjI4LDcgKzY5OSw2IEBACiAJZGV2LT5pc19idXNtYXN0ZXIgPSAwOwogCiAJcGNpYmlvc19kaXNhYmxlX2RldmljZShkZXYpOwotCWRldi0+aXNfZW5hYmxlZCA9IDA7CiB9CiAKIC8qKgpAQCAtODMxLDIyICs5MDEsMzggQEAKIAlwY2liaW9zX3NldF9tYXN0ZXIoZGV2KTsKIH0KIAotI2lmbmRlZiBIQVZFX0FSQ0hfUENJX01XSQorI2lmZGVmIFBDSV9ESVNBQkxFX01XSQoraW50IHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworfQorCisjZWxzZQorCisjaWZuZGVmIFBDSV9DQUNIRV9MSU5FX0JZVEVTCisjZGVmaW5lIFBDSV9DQUNIRV9MSU5FX0JZVEVTIEwxX0NBQ0hFX0JZVEVTCisjZW5kaWYKKwogLyogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhcmNoIGNvZGUuICovCi11OCBwY2lfY2FjaGVfbGluZV9zaXplID0gTDFfQ0FDSEVfQllURVMgPj4gMjsKKy8qIERvbid0IGZvcmdldCB0aGlzIGlzIG1lYXN1cmVkIGluIDMyLWJpdCB3b3Jkcywgbm90IGJ5dGVzICovCit1OCBwY2lfY2FjaGVfbGluZV9zaXplID0gUENJX0NBQ0hFX0xJTkVfQllURVMgLyA0OwogCiAvKioKLSAqIHBjaV9nZW5lcmljX3ByZXBfbXdpIC0gaGVscGVyIGZ1bmN0aW9uIGZvciBwY2lfc2V0X213aQotICogQGRldjogdGhlIFBDSSBkZXZpY2UgZm9yIHdoaWNoIE1XSSBpcyBlbmFibGVkCisgKiBwY2lfc2V0X2NhY2hlbGluZV9zaXplIC0gZW5zdXJlIHRoZSBDQUNIRV9MSU5FX1NJWkUgcmVnaXN0ZXIgaXMgcHJvZ3JhbW1lZAorICogQGRldjogdGhlIFBDSSBkZXZpY2UgZm9yIHdoaWNoIE1XSSBpcyB0byBiZSBlbmFibGVkCiAgKgotICogSGVscGVyIGZ1bmN0aW9uIGZvciBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHBjaWJpb3NfcHJlcF9td2kKLSAqIGZ1bmN0aW9uLiAgT3JpZ2luYWxseSBjb3BpZWQgZnJvbSBkcml2ZXJzL25ldC9hY2VuaWMuYy4KKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcGNpX3NldF9td2kuCisgKiBPcmlnaW5hbGx5IGNvcGllZCBmcm9tIGRyaXZlcnMvbmV0L2FjZW5pYy5jLgogICogQ29weXJpZ2h0IDE5OTgtMjAwMSBieSBKZXMgU29yZW5zZW4sIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPi4KICAqCiAgKiBSRVRVUk5TOiBBbiBhcHByb3ByaWF0ZSAtRVJSTk8gZXJyb3IgdmFsdWUgb24gZXJyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLXBjaV9nZW5lcmljX3ByZXBfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitwY2lfc2V0X2NhY2hlbGluZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTggY2FjaGVsaW5lX3NpemU7CiAKQEAgLTg3Miw3ICs5NTgsNiBAQAogCiAJcmV0dXJuIC1FSU5WQUw7CiB9Ci0jZW5kaWYgLyogIUhBVkVfQVJDSF9QQ0lfTVdJICovCiAKIC8qKgogICogcGNpX3NldF9td2kgLSBlbmFibGVzIG1lbW9yeS13cml0ZS1pbnZhbGlkYXRlIFBDSSB0cmFuc2FjdGlvbgpAQCAtODkwLDEyICs5NzUsNyBAQAogCWludCByYzsKIAl1MTYgY21kOwogCi0jaWZkZWYgSEFWRV9BUkNIX1BDSV9NV0kKLQlyYyA9IHBjaWJpb3NfcHJlcF9td2koZGV2KTsKLSNlbHNlCi0JcmMgPSBwY2lfZ2VuZXJpY19wcmVwX213aShkZXYpOwotI2VuZGlmCi0KKwlyYyA9IHBjaV9zZXRfY2FjaGVsaW5lX3NpemUoZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtOTI2LDYgKzEwMDYsNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CiB9CisjZW5kaWYgLyogISBQQ0lfRElTQUJMRV9NV0kgKi8KIAogLyoqCiAgKiBwY2lfaW50eCAtIGVuYWJsZXMvZGlzYWJsZXMgUENJIElOVHggZm9yIGRldmljZSBkZXYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggNmJmMzI3ZC4uMzk4ODUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTEsNSArMSw2IEBACiAvKiBGdW5jdGlvbnMgaW50ZXJuYWwgdG8gdGhlIFBDSSBjb3JlIGNvZGUgKi8KIAorZXh0ZXJuIGludCBfX211c3RfY2hlY2sgX19wY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqKTsKIGV4dGVybiBpbnQgcGNpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCiAJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKIGV4dGVybiBpbnQgcGNpX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggZTE1OWQ2Ni4uMGVlYWM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC02NzksNiArNjc5LDMzIEBACiAJCXBjaV9yZWFkX2Jhc2VzKGRldiwgNiwgUENJX1JPTV9BRERSRVNTKTsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmRldi0+c3Vic3lzdGVtX3ZlbmRvcik7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJmRldi0+c3Vic3lzdGVtX2RldmljZSk7CisKKwkJLyoKKwkJICoJRG8gdGhlIHVnbHkgbGVnYWN5IG1vZGUgc3R1ZmYgaGVyZSByYXRoZXIgdGhhbiBicm9rZW4gY2hpcAorCQkgKglxdWlyayBjb2RlLiBMZWdhY3kgbW9kZSBBVEEgY29udHJvbGxlcnMgaGF2ZSBmaXhlZAorCQkgKglhZGRyZXNzZXMuIFRoZXNlIGFyZSBub3QgYWx3YXlzIGVjaG9lZCBpbiBCQVIwLTMsIGFuZAorCQkgKglCQVIwLTMgaW4gYSBmZXcgY2FzZXMgY29udGFpbiBqdW5rIQorCQkgKi8KKwkJaWYgKGNsYXNzID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkgeworCQkJdTggcHJvZ2lmOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUFJPRywgJnByb2dpZik7CisJCQlpZiAoKHByb2dpZiAmIDEpID09IDApIHsKKwkJCQlkZXYtPnJlc291cmNlWzBdLnN0YXJ0ID0gMHgxRjA7CisJCQkJZGV2LT5yZXNvdXJjZVswXS5lbmQgPSAweDFGNzsKKwkJCQlkZXYtPnJlc291cmNlWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCQlkZXYtPnJlc291cmNlWzFdLnN0YXJ0ID0gMHgzRjY7CisJCQkJZGV2LT5yZXNvdXJjZVsxXS5lbmQgPSAweDNGNjsKKwkJCQlkZXYtPnJlc291cmNlWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCX0KKwkJCWlmICgocHJvZ2lmICYgNCkgPT0gMCkgeworCQkJCWRldi0+cmVzb3VyY2VbMl0uc3RhcnQgPSAweDE3MDsKKwkJCQlkZXYtPnJlc291cmNlWzJdLmVuZCA9IDB4MTc3OworCQkJCWRldi0+cmVzb3VyY2VbMl0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQkJCWRldi0+cmVzb3VyY2VbM10uc3RhcnQgPSAweDM3NjsKKwkJCQlkZXYtPnJlc291cmNlWzNdLmVuZCA9IDB4Mzc2OworCQkJCWRldi0+cmVzb3VyY2VbM10uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQkJfQorCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOgkJICAgIC8qIGJyaWRnZSBoZWFkZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggNWI0NDgzOC4uOWNhOWI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTc5Nyw1NiArNzk3LDYgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQ1lSSVgsCVBDSV9ERVZJQ0VfSURfQ1lSSVhfUENJX01BU1RFUiwgcXVpcmtfbWVkaWFneF9tYXN0ZXIgKTsKIAogLyoKLSAqIEFzIHBlciBQQ0kgc3BlYywgaWdub3JlIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMgMC0zIG9mIHRoZSBJREUgY29udHJvbGxlcnMKLSAqIHJ1bm5pbmcgaW4gQ29tcGF0aWJsZSBtb2RlIChiaXRzIDAgYW5kIDIgaW4gdGhlIFByb2dJZiBmb3IgcHJpbWFyeSBhbmQKLSAqIHNlY29uZGFyeSBjaGFubmVscyByZXNwZWN0aXZlbHkpLiBJZiB0aGUgZGV2aWNlIHJlcG9ydHMgQ29tcGF0aWJsZSBtb2RlCi0gKiBidXQgZG9lcyB1c2UgQkFSMC0zIGZvciBhZGRyZXNzIGRlY29kaW5nLCB3ZSBhc3N1bWUgdGhhdCBmaXJtd2FyZSBoYXMKLSAqIHByb2dyYW1tZWQgdGhlc2UgQkFScyB3aXRoIHN0YW5kYXJkIHZhbHVlcyAoMHgxZjAsMHgzZjQgYW5kIDB4MTcwLDB4Mzc0KS4KLSAqIEV4Y2VwdGlvbnMgKGlmIHRoZXkgZXhpc3QpIG11c3QgYmUgaGFuZGxlZCBpbiBjaGlwL2FyY2hpdGVjdHVyZSBzcGVjaWZpYwotICogZml4dXBzLgotICoKLSAqIE5vdGU6IGZvciBub24geDg2IHBlb3BsZS4gWW91IG1heSBuZWVkIGFuIGFyY2ggc3BlY2lmaWMgcXVpcmsgdG8gaGFuZGxlCi0gKiBtb3ZpbmcgSURFIGRldmljZXMgdG8gbmF0aXZlIG1vZGUgYXMgd2VsbC4gU29tZSBwbHVnIGluIGNhcmQgZGV2aWNlcyBwb3dlcgotICogdXAgaW4gY29tcGF0aWJsZSBtb2RlIGFuZCBhc3N1bWUgdGhlIEJJT1Mgd2lsbCBhZGp1c3QgdGhlbS4KLSAqCi0gKiBROiBzaG91bGQgd2UgbG9hZCB0aGUgMHgxZjAsMHgzZjQgaW50byB0aGUgcmVnaXN0ZXJzIG9yIHphcCB0aGVtIGFzCi0gKiB3ZSBkbyBub3cgPyBXZSBkb24ndCB3YW50IGlzIHBjaV9lbmFibGVfZGV2aWNlIHRvIGNvbWUgYWxvbmcKLSAqIGFuZCBhc3NpZ24gbmV3IHJlc291cmNlcy4gQm90aCBhcHByb2FjaGVzIHdvcmsgZm9yIHRoYXQuCi0gKi8gCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaWRlX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0gICAgICAgc3RydWN0IHJlc291cmNlICpyZXM7Ci0gICAgICAgaW50IGZpcnN0X2JhciA9IDIsIGxhc3RfYmFyID0gMDsKLQotICAgICAgIGlmICgoZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCi0gICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICByZXMgPSAmZGV2LT5yZXNvdXJjZVswXTsKLQotICAgICAgIC8qIHByaW1hcnkgY2hhbm5lbDogUHJvZ0lmIGJpdCAwLCBCQVIwLCBCQVIxICovCi0gICAgICAgaWYgKCEoZGV2LT5jbGFzcyAmIDEpICYmIChyZXNbMF0uZmxhZ3MgfHwgcmVzWzFdLmZsYWdzKSkgeyAKLSAgICAgICAgICAgICAgIHJlc1swXS5zdGFydCA9IHJlc1swXS5lbmQgPSByZXNbMF0uZmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgcmVzWzFdLnN0YXJ0ID0gcmVzWzFdLmVuZCA9IHJlc1sxXS5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgICBmaXJzdF9iYXIgPSAwOwotICAgICAgICAgICAgICAgbGFzdF9iYXIgPSAxOwotICAgICAgIH0KLQotICAgICAgIC8qIHNlY29uZGFyeSBjaGFubmVsOiBQcm9nSWYgYml0IDIsIEJBUjIsIEJBUjMgKi8KLSAgICAgICBpZiAoIShkZXYtPmNsYXNzICYgNCkgJiYgKHJlc1syXS5mbGFncyB8fCByZXNbM10uZmxhZ3MpKSB7IAotICAgICAgICAgICAgICAgcmVzWzJdLnN0YXJ0ID0gcmVzWzJdLmVuZCA9IHJlc1syXS5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgICByZXNbM10uc3RhcnQgPSByZXNbM10uZW5kID0gcmVzWzNdLmZsYWdzID0gMDsKLSAgICAgICAgICAgICAgIGxhc3RfYmFyID0gMzsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAoIWxhc3RfYmFyKQotICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBJZ25vcmluZyBCQVIlZC0lZCBvZiBJREUgY29udHJvbGxlciAlc1xuIiwKLSAgICAgICAgICAgICAgZmlyc3RfYmFyLCBsYXN0X2JhciwgcGNpX25hbWUoZGV2KSk7Ci19Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcXVpcmtfaWRlX2Jhc2VzKTsKLQotLyoKICAqCUVuc3VyZSBDMCByZXYgcmVzdHJlYW1pbmcgaXMgb2ZmLiBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkKICAqCXRoZSBCSU9TIGJ1dCBpbiB0aGUgb2RkIGNhc2UgaXQgaXMgbm90IHRoZSByZXN1bHRzIGFyZSBjb3JydXB0aW9uCiAgKgloZW5jZSB0aGUgcHJlc2VuY2Ugb2YgYSBMaW51eCBjaGVjawpAQCAtODgwLDExICs4MzAsMTAgQEAKIAkJcHJvZyAmPSB+NTsKIAkJcGRldi0+Y2xhc3MgJj0gfjU7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUFJPRywgcHJvZyk7Ci0JCS8qIG5lZWQgdG8gcmUtYXNzaWduIEJBUnMgZm9yIGNvbXBhdCBtb2RlICovCi0JCXF1aXJrX2lkZV9iYXNlcyhwZGV2KTsKKwkJLyogUENJIGxheWVyIHdpbGwgc29ydCBvdXQgcmVzb3VyY2VzICovCiAJfQogfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgcXVpcmtfc3Z3a3NfY3NiNWlkZSApOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFLCBxdWlya19zdndrc19jc2I1aWRlICk7CiAKIC8qCiAgKglJbnRlbCA4MjgwMUNBTSBJQ0gzLU0gZGF0YXNoZWV0IHNheXMgSURFIG1vZGVzIG11c3QgYmUgdGhlIHNhbWUKQEAgLTkwMCwxMSArODQ5LDkgQEAKIAkJcHJvZyAmPSB+NTsKIAkJcGRldi0+Y2xhc3MgJj0gfjU7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUFJPRywgcHJvZyk7Ci0JCS8qIG5lZWQgdG8gcmUtYXNzaWduIEJBUnMgZm9yIGNvbXBhdCBtb2RlICovCi0JCXF1aXJrX2lkZV9iYXNlcyhwZGV2KTsKIAl9CiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwLCBxdWlya19pZGVfc2FtZW1vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwLCBxdWlya19pZGVfc2FtZW1vZGUpOwogCiAvKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGFuIEFscGhhIHNwZWNpZmljIHRoaW5nLCBidXQgaXQgcmVhbGx5IGZpdHMgaGVyZS4KICAqIFRoZSBpODIzNzUgUENJL0VJU0EgYnJpZGdlIGFwcGVhcnMgYXMgbm9uLWNsYXNzaWZpZWQuIEZpeCB0aGF0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcm9tLmMgYi9kcml2ZXJzL3BjaS9yb20uYwppbmRleCBlMWRjZWZjLi5kMDg3ZTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yb20uYworKysgYi9kcml2ZXJzL3BjaS9yb20uYwpAQCAtODEsNyArODEsOCBAQAogCQlzdGFydCA9IChsb2ZmX3QpMHhDMDAwMDsKIAkJKnNpemUgPSAweDIwMDAwOyAvKiBjb3ZlciBDMDAwOjAgdGhyb3VnaCBFMDAwOjAgKi8KIAl9IGVsc2UgewotCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0NPUFkpIHsKKwkJaWYgKHJlcy0+ZmxhZ3MgJgorCQkJKElPUkVTT1VSQ0VfUk9NX0NPUFkgfCBJT1JFU09VUkNFX1JPTV9CSU9TX0NPUFkpKSB7CiAJCQkqc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CiAJCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSh1bnNpZ25lZCBsb25nKQogCQkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKTsKQEAgLTE2NSw3ICsxNjYsOCBAQAogCWlmICghcm9tKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChyZXMtPmZsYWdzICYgKElPUkVTT1VSQ0VfUk9NX0NPUFkgfCBJT1JFU09VUkNFX1JPTV9TSEFET1cpKQorCWlmIChyZXMtPmZsYWdzICYgKElPUkVTT1VSQ0VfUk9NX0NPUFkgfCBJT1JFU09VUkNFX1JPTV9TSEFET1cgfAorCQkJICBJT1JFU09VUkNFX1JPTV9CSU9TX0NPUFkpKQogCQlyZXR1cm4gcm9tOwogCiAJcmVzLT5zdGFydCA9ICh1bnNpZ25lZCBsb25nKWttYWxsb2MoKnNpemUsIEdGUF9LRVJORUwpOwpAQCAtMTkxLDcgKzE5Myw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CiAKLQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0NPUFkpCisJaWYgKHJlcy0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9ST01fQ09QWSB8IElPUkVTT1VSQ0VfUk9NX0JJT1NfQ09QWSkpCiAJCXJldHVybjsKIAogCWlvdW5tYXAocm9tKTsKQEAgLTIxNSw2ICsyMTcsNyBAQAogCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCBwZGV2LT5yb21fYXR0cik7CiAJaWYgKCEocmVzLT5mbGFncyAmIChJT1JFU09VUkNFX1JPTV9FTkFCTEUgfAogCQkJICAgIElPUkVTT1VSQ0VfUk9NX1NIQURPVyB8CisJCQkgICAgSU9SRVNPVVJDRV9ST01fQklPU19DT1BZIHwKIAkJCSAgICBJT1JFU09VUkNFX1JPTV9DT1BZKSkpCiAJCXBjaV9kaXNhYmxlX3JvbShwZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYyBiL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYwppbmRleCAzYmNiN2RjLi5iNjc0NjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdDkxX2NmLmMKKysrIGIvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jCkBAIC0zMiwxMCArMzIsMTEgQEAKICAqIEEwLi5BMTAgd29yayBpbiBlYWNoIHJhbmdlOyBBMjMgaW5kaWNhdGVzIEkvTyBzcGFjZTsgIEEyNSBpcyBDRlJOVzsKICAqIHNvbWUgb3RoZXIgYml0IGluIHtBMjQsQTIyLi5BMTF9IGlzIG5SRUcgdG8gZmxhZyBtZW1vcnkgYWNjZXNzCiAgKiAodnMgYXR0cmlidXRlcykuICBTbyBtb3JlIHRoYW4gMktCL3JlZ2lvbiB3b3VsZCBqdXN0IGJlIHdhc3RlLgorICogTm90ZTogVGhlc2UgYXJlIG9mZnNldHMgZnJvbSB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzLgogICovCi0jZGVmaW5lCUNGX0FUVFJfUEhZUwkoQVQ5MV9DRl9CQVNFKQotI2RlZmluZQlDRl9JT19QSFlTCShBVDkxX0NGX0JBU0UgICsgKDEgPDwgMjMpKQotI2RlZmluZQlDRl9NRU1fUEhZUwkoQVQ5MV9DRl9CQVNFICArIDB4MDE3ZmY4MDApCisjZGVmaW5lCUNGX0FUVFJfUEhZUwkoMCkKKyNkZWZpbmUJQ0ZfSU9fUEhZUwkoMSA8PCAyMykKKyNkZWZpbmUJQ0ZfTUVNX1BIWVMJKDB4MDE3ZmY4MDApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC00OCw2ICs0OSw4IEBACiAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwogCXN0cnVjdCBhdDkxX2NmX2RhdGEJKmJvYXJkOworCisJdW5zaWduZWQgbG9uZwkJcGh5c19iYXNlYWRkcjsKIH07CiAKICNkZWZpbmUJU1pfMksJCQkoMiAqIFNaXzFLKQpAQCAtMTU0LDkgKzE1Nyw4IEBACiAKIAkvKgogCSAqIFVzZSAxNiBiaXQgYWNjZXNzZXMgdW5sZXNzL3VudGlsIHdlIG5lZWQgOC1iaXQgaS9vIHNwYWNlLgotCSAqIEFsd2F5cyBzZXQgQ1NSNCAuLi4gUENNQ0lBIHdvbid0IGFsd2F5cyB1bm1hcCB0aGluZ3MuCiAJICovCi0JY3NyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1NNQ19DU1IoNCkpICYgfkFUOTFfU01DX0RCVzsKKwljc3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfU01DX0NTUihjZi0+Ym9hcmQtPmNoaXBzZWxlY3QpKSAmIH5BVDkxX1NNQ19EQlc7CiAKIAkvKgogCSAqIE5PVEU6IHRoaXMgQ0YgY29udHJvbGxlciBpZ25vcmVzIElPSVMxNiwgc28gd2UgY2FuJ3QgcmVhbGx5IGRvCkBAIC0xNjgsMTQgKzE3MCwxNCBAQAogCSAqIHNvbWUgY2FyZHMgb25seSBsaWtlIHRoYXQgd2F5IHRvIGdldCBhdCB0aGUgb2RkIGJ5dGUsIGRlc3BpdGUKIAkgKiBDRiAzLjAgc3BlYyB0YWJsZSAzNSBhbHNvIGdpdmluZyB0aGUgRDgtRDE1IG9wdGlvbi4KIAkgKi8KLQlpZiAoIShpby0+ZmxhZ3MgJiAoTUFQXzE2QklUfE1BUF9BVVRPU1opKSkgeworCWlmICghKGlvLT5mbGFncyAmIChNQVBfMTZCSVQgfCBNQVBfQVVUT1NaKSkpIHsKIAkJY3NyIHw9IEFUOTFfU01DX0RCV184OwogCQlwcl9kZWJ1ZygiJXM6IDhiaXQgaS9vIGJ1c1xuIiwgZHJpdmVyX25hbWUpOwogCX0gZWxzZSB7CiAJCWNzciB8PSBBVDkxX1NNQ19EQldfMTY7CiAJCXByX2RlYnVnKCIlczogMTZiaXQgaS9vIGJ1c1xuIiwgZHJpdmVyX25hbWUpOwogCX0KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DU1IoNCksIGNzcik7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1NSKGNmLT5ib2FyZC0+Y2hpcHNlbGVjdCksIGNzcik7CiAKIAlpby0+c3RhcnQgPSBjZi0+c29ja2V0LmlvX29mZnNldDsKIAlpby0+c3RvcCA9IGlvLT5zdGFydCArIFNaXzJLIC0gMTsKQEAgLTE5NCwxMSArMTk2LDExIEBACiAKIAljZiA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3QgYXQ5MV9jZl9zb2NrZXQsIHNvY2tldCk7CiAKLQltYXAtPmZsYWdzICY9IE1BUF9BQ1RJVkV8TUFQX0FUVFJJQnxNQVBfMTZCSVQ7CisJbWFwLT5mbGFncyAmPSAoTUFQX0FDVElWRSB8IE1BUF9BVFRSSUIgfCBNQVBfMTZCSVQpOwogCWlmIChtYXAtPmZsYWdzICYgTUFQX0FUVFJJQikKLQkJbWFwLT5zdGF0aWNfc3RhcnQgPSBDRl9BVFRSX1BIWVM7CisJCW1hcC0+c3RhdGljX3N0YXJ0ID0gY2YtPnBoeXNfYmFzZWFkZHIgKyBDRl9BVFRSX1BIWVM7CiAJZWxzZQotCQltYXAtPnN0YXRpY19zdGFydCA9IENGX01FTV9QSFlTOworCQltYXAtPnN0YXRpY19zdGFydCA9IGNmLT5waHlzX2Jhc2VhZGRyICsgQ0ZfTUVNX1BIWVM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxOSw3ICsyMjEsNiBAQAogCXN0cnVjdCBhdDkxX2NmX3NvY2tldAkqY2Y7CiAJc3RydWN0IGF0OTFfY2ZfZGF0YQkqYm9hcmQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSppbzsKLQl1bnNpZ25lZCBpbnQJCWNzYTsKIAlpbnQJCQlzdGF0dXM7CiAKIAlpZiAoIWJvYXJkIHx8ICFib2FyZC0+ZGV0X3BpbiB8fCAhYm9hcmQtPnJzdF9waW4pCkBAIC0yMzUsMzMgKzIzNiwxMSBAQAogCiAJY2YtPmJvYXJkID0gYm9hcmQ7CiAJY2YtPnBkZXYgPSBwZGV2OworCWNmLT5waHlzX2Jhc2VhZGRyID0gaW8tPnN0YXJ0OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNmKTsKIAotCS8qIENGIHRha2VzIG92ZXIgQ1M0LCBDUzUsIENTNiAqLwotCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9FQklfQ1NBKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX0VCSV9DU0EsIGNzYSB8IEFUOTFfRUJJX0NTNEFfU01DX0NPTVBBQ1RGTEFTSCk7Ci0KLQkvKiBuV0FJVCBpcyBfbm90XyBhIGRlZmF1bHQgc2V0dGluZyAqLwotCSh2b2lkKSBhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzYsIDEpOwkvKiAgbldBSVQgKi8KLQotCS8qCi0JICogU3RhdGljIG1lbW9yeSBjb250cm9sbGVyIHRpbWluZyBhZGp1c3RtZW50cy4KLQkgKiBSRVZJU0lUOiAgdGhlc2UgdGltaW5ncyBhcmUgaW4gdGVybXMgb2YgTUNLIGN5Y2xlcywgc28KLQkgKiB3aGVuIE1DSyBjaGFuZ2VzIChjcHVmcmVxIGV0Yykgc28gbXVzdCB0aGVzZSB2YWx1ZXMuLi4KLQkgKi8KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DU1IoNCksCi0JCQkJICBBVDkxX1NNQ19BQ1NTX1NURAotCQkJCXwgQVQ5MV9TTUNfREJXXzE2Ci0JCQkJfCBBVDkxX1NNQ19CQVQKLQkJCQl8IEFUOTFfU01DX1dTRU4KLQkJCQl8IEFUOTFfU01DX05XU18oMzIpCS8qIHdhaXQgc3RhdGVzICovCi0JCQkJfCBBVDkxX1NNQ19SV1NFVFVQXyg2KQkvKiBzZXR1cCB0aW1lICovCi0JCQkJfCBBVDkxX1NNQ19SV0hPTERfKDQpCS8qIGhvbGQgdGltZSAqLwotCSk7Ci0KIAkvKiBtdXN0IGJlIGEgR1BJTzsgZXJnbyBtdXN0IHRyaWdnZXIgb24gYm90aCBlZGdlcyAqLwotCXN0YXR1cyA9IHJlcXVlc3RfaXJxKGJvYXJkLT5kZXRfcGluLCBhdDkxX2NmX2lycSwKLQkJCUlSUUZfU0FNUExFX1JBTkRPTSwgZHJpdmVyX25hbWUsIGNmKTsKKwlzdGF0dXMgPSByZXF1ZXN0X2lycShib2FyZC0+ZGV0X3BpbiwgYXQ5MV9jZl9pcnEsIDAsIGRyaXZlcl9uYW1lLCBjZik7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDA7CiAJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwpAQCAtMjgyLDE0ICsyNjEsMTggQEAKIAkJY2YtPnNvY2tldC5wY2lfaXJxID0gTlJfSVJRUyArIDE7CiAKIAkvKiBwY21jaWEgbGF5ZXIgb25seSByZW1hcHMgInJlYWwiIG1lbW9yeSBub3QgaW9zcGFjZSAqLwotCWNmLT5zb2NrZXQuaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoQ0ZfSU9fUEhZUywgU1pfMkspOwotCWlmICghY2YtPnNvY2tldC5pb19vZmZzZXQpCisJY2YtPnNvY2tldC5pb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChjZi0+cGh5c19iYXNlYWRkciArIENGX0lPX1BIWVMsIFNaXzJLKTsKKwlpZiAoIWNmLT5zb2NrZXQuaW9fb2Zmc2V0KSB7CisJCXN0YXR1cyA9IC1FTlhJTzsKIAkJZ290byBmYWlsMTsKKwl9CiAKLQkvKiByZXNlcnZlIENTNCwgQ1M1LCBhbmQgQ1M2IHJlZ2lvbnM7IGJ1dCB1c2UganVzdCBDUzQgKi8KKwkvKiByZXNlcnZlIGNoaXAtc2VsZWN0IHJlZ2lvbnMgKi8KIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpby0+c3RhcnQsIGlvLT5lbmQgKyAxIC0gaW8tPnN0YXJ0LAotCQkJCWRyaXZlcl9uYW1lKSkKKwkJCQlkcml2ZXJfbmFtZSkpIHsKKwkJc3RhdHVzID0gLUVOWElPOwogCQlnb3RvIGZhaWwxOworCX0KIAogCXByX2luZm8oIiVzOiBpcnFzIGRldCAjJWQsIGlvICMlZFxuIiwgZHJpdmVyX25hbWUsCiAJCWJvYXJkLT5kZXRfcGluLCBib2FyZC0+aXJxX3Bpbik7CkBAIC0zMTksOSArMzAyLDcgQEAKIGZhaWwwYToKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CiAJZnJlZV9pcnEoYm9hcmQtPmRldF9waW4sIGNmKTsKLQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CiBmYWlsMDoKLQlhdDkxX3N5c193cml0ZShBVDkxX0VCSV9DU0EsIGNzYSk7CiAJa2ZyZWUoY2YpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zMzEsMTkgKzMxMiwxNSBAQAogCXN0cnVjdCBhdDkxX2NmX3NvY2tldAkqY2YgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYXQ5MV9jZl9kYXRhCSpib2FyZCA9IGNmLT5ib2FyZDsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSppbyA9IGNmLT5zb2NrZXQuaW9bMF0ucmVzOwotCXVuc2lnbmVkIGludAkJY3NhOwogCiAJcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KCZjZi0+c29ja2V0KTsKIAlpZiAoYm9hcmQtPmlycV9waW4pCiAJCWZyZWVfaXJxKGJvYXJkLT5pcnFfcGluLCBjZik7Ci0JZnJlZV9pcnEoYm9hcmQtPmRldF9waW4sIGNmKTsKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisJZnJlZV9pcnEoYm9hcmQtPmRldF9waW4sIGNmKTsKIAlpb3VubWFwKCh2b2lkIF9faW9tZW0gKikgY2YtPnNvY2tldC5pb19vZmZzZXQpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihpby0+c3RhcnQsIGlvLT5lbmQgKyAxIC0gaW8tPnN0YXJ0KTsKIAotCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9FQklfQ1NBKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX0VCSV9DU0EsIGNzYSAmIH5BVDkxX0VCSV9DUzRBKTsKLQogCWtmcmVlKGNmKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCmluZGV4IGQ2MTY0Y2QuLmY1NzNlYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaApAQCAtMTM1LDcgKzEzNSw3IEBACiBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrewogCXN0cnVjdCBtb2R1bGUJKm93bmVyOwogCWludAkJKCpldmVudCkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpOwotCXZvaWQJCSgqcmVxdWVyeSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwl2b2lkCQkoKnJlcXVlcnkpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IG5ld19jaXMpOwogCWludAkJKCpzdXNwZW5kKSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwogCWludAkJKCpyZXN1bWUpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggYTIwZDg0ZC4uNDVkZjEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC0yMzEsNjUgKzIzMSw2IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19QQ01DSUFfTE9BRF9DSVMKLQotLyoqCi0gKiBwY21jaWFfbG9hZF9maXJtd2FyZSAtIGxvYWQgQ0lTIGZyb20gdXNlcnNwYWNlIGlmIGRldmljZS1wcm92aWRlZCBpcyBicm9rZW4KLSAqIEBkZXYgLSB0aGUgcGNtY2lhIGRldmljZSB3aGljaCBuZWVkcyBhIENJUyBvdmVycmlkZQotICogQGZpbGVuYW1lIC0gcmVxdWVzdGVkIGZpbGVuYW1lIGluIC9saWIvZmlybXdhcmUvCi0gKgotICogVGhpcyB1c2VzIHRoZSBpbi1rZXJuZWwgZmlybXdhcmUgbG9hZGluZyBtZWNoYW5pc20gdG8gdXNlIGEgImZha2UgQ0lTIiBpZgotICogdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgY2FyZCBpcyBicm9rZW4uIFRoZSBmaXJtd2FyZSBmaWxlcyByZXNpZGUgaW4KLSAqIC9saWIvZmlybXdhcmUvIGluIHVzZXJzcGFjZS4KLSAqLwotc3RhdGljIGludCBwY21jaWFfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2LCBjaGFyICogZmlsZW5hbWUpCi17Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkZXYtPnNvY2tldDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWNoYXIgcGF0aFsyMF07Ci0JaW50IHJldD0tRU5PTUVNOwotCWNpc2R1bXBfdCAqY2lzOwotCi0JaWYgKCFmaWxlbmFtZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkc19kYmcoMSwgInRyeWluZyB0byBsb2FkIGZpcm13YXJlICVzXG4iLCBmaWxlbmFtZSk7Ci0KLQlpZiAoc3RybGVuKGZpbGVuYW1lKSA+IDE0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNucHJpbnRmKHBhdGgsIDIwLCAiJXMiLCBmaWxlbmFtZSk7Ci0KLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIHBhdGgsICZkZXYtPmRldikgPT0gMCkgewotCQlpZiAoZnctPnNpemUgPj0gQ0lTVFBMX01BWF9DSVNfU0laRSkKLQkJCWdvdG8gcmVsZWFzZTsKLQotCQljaXMgPSBremFsbG9jKHNpemVvZihjaXNkdW1wX3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjaXMpCi0JCQlnb3RvIHJlbGVhc2U7Ci0KLQkJY2lzLT5MZW5ndGggPSBmdy0+c2l6ZSArIDE7Ci0JCW1lbWNweShjaXMtPkRhdGEsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7Ci0KLQkJaWYgKCFwY21jaWFfcmVwbGFjZV9jaXMocywgY2lzKSkKLQkJCXJldCA9IDA7Ci0JfQotIHJlbGVhc2U6Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLSNlbHNlIC8qICFDT05GSUdfUENNQ0lBX0xPQURfQ0lTICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHBjbWNpYV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpkZXYsIGNoYXIgKiBmaWxlbmFtZSkKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotI2VuZGlmCi0KLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogCkBAIC0zMDksNiArMjUwLDggQEAKIAlkcml2ZXItPmRydi5idXMgPSAmcGNtY2lhX2J1c190eXBlOwogCWRyaXZlci0+ZHJ2Lm93bmVyID0gZHJpdmVyLT5vd25lcjsKIAorCWRzX2RiZygzLCAicmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBkcml2ZXItPmRydi5uYW1lKTsKKwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlZ2lzdGVyX2RyaXZlcik7CkBAIC0zMTgsNiArMjYxLDcgQEAKICAqLwogdm9pZCBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjbWNpYV9kcml2ZXIgKmRyaXZlcikKIHsKKwlkc19kYmcoMywgInVucmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBkcml2ZXItPmRydi5uYW1lKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcnYpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIpOwpAQCAtMzQzLDIzICsyODcsMjcgQEAKIHN0YXRpYyB2b2lkIHBjbWNpYV9yZWxlYXNlX2Z1bmN0aW9uKHN0cnVjdCBrcmVmICpyZWYpCiB7CiAJc3RydWN0IGNvbmZpZ190ICpjID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGNvbmZpZ190LCByZWYpOworCWRzX2RiZygxLCAicmVsZWFzaW5nIGNvbmZpZ190XG4iKTsKIAlrZnJlZShjKTsKIH0KIAogc3RhdGljIHZvaWQgcGNtY2lhX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7Ci0JZHNfZGJnKDEsICJyZWxlYXNpbmcgZGV2ICVwXG4iLCBwX2Rldik7CisJZHNfZGJnKDEsICJyZWxlYXNpbmcgZGV2aWNlICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CiAJcGNtY2lhX3B1dF9zb2NrZXQocF9kZXYtPnNvY2tldCk7CiAJa2ZyZWUocF9kZXYtPmRldm5hbWUpOwogCWtyZWZfcHV0KCZwX2Rldi0+ZnVuY3Rpb25fY29uZmlnLT5yZWYsIHBjbWNpYV9yZWxlYXNlX2Z1bmN0aW9uKTsKIAlrZnJlZShwX2Rldik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9hZGRfcHNldWRvX2RldmljZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3N0YXRpYyB2b2lkIHBjbWNpYV9hZGRfZGV2aWNlX2xhdGVyKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgbWZjKQogewogCWlmICghcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZykgeworCQlkc19kYmcoMSwgInNjaGVkdWxpbmcgdG8gYWRkICVzIHNlY29uZGFyeSIKKwkJICAgICAgICIgZGV2aWNlIHRvICVkXG4iLCBtZmMgPyAibWZjIiA6ICJwZmMiLCBzLT5zb2NrKTsKIAkJcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZyA9IDE7CisJCXMtPnBjbWNpYV9zdGF0ZS5tZmNfcGZjID0gbWZjOwogCQlzY2hlZHVsZV93b3JrKCZzLT5kZXZpY2VfYWRkKTsKIAl9CiAJcmV0dXJuOwpAQCAtMzcxLDYgKzMxOSw3IEBACiAJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OwogCXN0cnVjdCBwY21jaWFfZGV2aWNlX2lkICpkaWQ7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisJY2lzdHBsX2NvbmZpZ190IGNpc19jb25maWc7CiAJaW50IHJldCA9IDA7CiAKIAlkZXYgPSBnZXRfZGV2aWNlKGRldik7CkBAIC0zODEsMTUgKzMzMCwzMyBAQAogCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihkZXYtPmRyaXZlcik7CiAJcyA9IHBfZGV2LT5zb2NrZXQ7CiAKKwlkc19kYmcoMSwgInRyeWluZyB0byBiaW5kICVzIHRvICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCwKKwkgICAgICAgcF9kcnYtPmRydi5uYW1lKTsKKwogCWlmICgoIXBfZHJ2LT5wcm9iZSkgfHwgKCFwX2Rldi0+ZnVuY3Rpb25fY29uZmlnKSB8fAogCSAgICAoIXRyeV9tb2R1bGVfZ2V0KHBfZHJ2LT5vd25lcikpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gcHV0X2RldjsKIAl9CiAKKwkvKiBzZXQgdXAgc29tZSBtb3JlIGRldmljZSBpbmZvcm1hdGlvbiAqLworCXJldCA9IHBjY2FyZF9yZWFkX3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLCBDSVNUUExfQ09ORklHLAorCQkJCSZjaXNfY29uZmlnKTsKKwlpZiAoIXJldCkgeworCQlwX2Rldi0+Y29uZi5Db25maWdCYXNlID0gY2lzX2NvbmZpZy5iYXNlOworCQlwX2Rldi0+Y29uZi5QcmVzZW50ID0gY2lzX2NvbmZpZy5ybWFza1swXTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IGNvdWxkIG5vdCBwYXJzZSBiYXNlIGFuZCBybWFzazAgb2YgQ0lTXG4iKTsKKwkJcF9kZXYtPmNvbmYuQ29uZmlnQmFzZSA9IDA7CisJCXBfZGV2LT5jb25mLlByZXNlbnQgPSAwOworCX0KKwogCXJldCA9IHBfZHJ2LT5wcm9iZShwX2Rldik7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWRzX2RiZygxLCAiYmluZGluZyAlcyB0byAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJICAgICAgIHBfZGV2LT5kZXYuYnVzX2lkLCBwX2Rydi0+ZHJ2Lm5hbWUsIHJldCk7CiAJCWdvdG8gcHV0X21vZHVsZTsKKwl9CiAKIAkvKiBoYW5kbGUgcHNldWRvIG11bHRpZnVuY3Rpb24gZGV2aWNlczoKIAkgKiB0aGVyZSBhcmUgYXQgbW9zdCB0d28gcHNldWRvIG11bHRpZnVuY3Rpb24gZGV2aWNlcy4KQEAgLTQwMCw3ICszNjcsNyBAQAogCWRpZCA9IHBfZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJaWYgKGRpZCAmJiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PKSAmJgogCSAgICAocF9kZXYtPnNvY2tldC0+ZGV2aWNlX2NvdW50ID09IDEpICYmIChwX2Rldi0+ZGV2aWNlX25vID09IDApKQotCQlwY21jaWFfYWRkX3BzZXVkb19kZXZpY2UocF9kZXYtPnNvY2tldCk7CisJCXBjbWNpYV9hZGRfZGV2aWNlX2xhdGVyKHBfZGV2LT5zb2NrZXQsIDApOwogCiAgcHV0X21vZHVsZToKIAlpZiAocmV0KQpAQCAtNDIxLDggKzM4OCw4IEBACiAJc3RydWN0IHBjbWNpYV9kZXZpY2UJKnRtcDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotCWRzX2RiZygyLCAidW5iaW5kX3JlcXVlc3QoJWQpXG4iLCBzLT5zb2NrKTsKLQorCWRzX2RiZygyLCAicGNtY2lhX2NhcmRfcmVtb3ZlKCVkKSAlc1xuIiwgcy0+c29jaywKKwkgICAgICAgbGVmdG92ZXIgPyBsZWZ0b3Zlci0+ZGV2bmFtZSA6ICIiKTsKIAogCWlmICghbGVmdG92ZXIpCiAJCXMtPmRldmljZV9jb3VudCA9IDA7CkBAIC00MzksNiArNDA2LDcgQEAKIAkJcF9kZXYtPl9yZW1vdmVkPTE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAKKwkJZHNfZGJnKDIsICJ1bnJlZ2lzdGVyaW5nIGRldmljZSAlc1xuIiwgcF9kZXYtPmRldi5idXNfaWQpOwogCQlkZXZpY2VfdW5yZWdpc3RlcigmcF9kZXYtPmRldik7CiAJfQogCkBAIC00NTUsNiArNDIzLDggQEAKIAlwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKIAlwX2RydiA9IHRvX3BjbWNpYV9kcnYoZGV2LT5kcml2ZXIpOwogCisJZHNfZGJnKDEsICJyZW1vdmluZyBkZXZpY2UgJXNcbiIsIHBfZGV2LT5kZXYuYnVzX2lkKTsKKwogCS8qIElmIHdlJ3JlIHJlbW92aW5nIHRoZSBwcmltYXJ5IG1vZHVsZSBkcml2aW5nIGEKIAkgKiBwc2V1ZG8gbXVsdGktZnVuY3Rpb24gY2FyZCwgd2UgbmVlZCB0byB1bmJpbmQKIAkgKiBhbGwgZGV2aWNlcwpAQCAtNTg3LDggKzU1NywxMCBAQAogCiAJbXV0ZXhfbG9jaygmZGV2aWNlX2FkZF9sb2NrKTsKIAotCS8qIG1heCBvZiAyIGRldmljZXMgcGVyIGNhcmQgKi8KLQlpZiAocy0+ZGV2aWNlX2NvdW50ID09IDIpCisJZHNfZGJnKDMsICJhZGRpbmcgZGV2aWNlIHRvICVkLCBmdW5jdGlvbiAlZFxuIiwgcy0+c29jaywgZnVuY3Rpb24pOworCisJLyogbWF4IG9mIDQgZGV2aWNlcyBwZXIgY2FyZCAqLworCWlmIChzLT5kZXZpY2VfY291bnQgPT0gNCkKIAkJZ290byBlcnJfcHV0OwogCiAJcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNtY2lhX2RldmljZSksIEdGUF9LRVJORUwpOwpAQCAtNTk4LDggKzU3MCw2IEBACiAJcF9kZXYtPnNvY2tldCA9IHM7CiAJcF9kZXYtPmRldmljZV9ubyA9IChzLT5kZXZpY2VfY291bnQrKyk7CiAJcF9kZXYtPmZ1bmMgICA9IGZ1bmN0aW9uOwotCWlmIChzLT5mdW5jdGlvbnMgPD0gZnVuY3Rpb24pCi0JCXMtPmZ1bmN0aW9ucyA9IGZ1bmN0aW9uICsgMTsKIAogCXBfZGV2LT5kZXYuYnVzID0gJnBjbWNpYV9idXNfdHlwZTsKIAlwX2Rldi0+ZGV2LnBhcmVudCA9IHMtPmRldi5kZXY7CkBAIC02MTAsOCArNTgwLDggQEAKIAlpZiAoIXBfZGV2LT5kZXZuYW1lKQogCQlnb3RvIGVycl9mcmVlOwogCXNwcmludGYgKHBfZGV2LT5kZXZuYW1lLCAicGNtY2lhJXMiLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CisJZHNfZGJnKDMsICJkZXZuYW1lIGlzICVzXG4iLCBwX2Rldi0+ZGV2bmFtZSk7CiAKLQkvKiBjb21wYXQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKIAogCS8qCkBAIC02MzEsNiArNjAxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFwX2Rldi0+ZnVuY3Rpb25fY29uZmlnKSB7CisJCWRzX2RiZygzLCAiY3JlYXRpbmcgY29uZmlnX3QgZm9yICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CiAJCXBfZGV2LT5mdW5jdGlvbl9jb25maWcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX3QpLAogCQkJCQkJIEdGUF9LRVJORUwpOwogCQlpZiAoIXBfZGV2LT5mdW5jdGlvbl9jb25maWcpCkBAIC02NzQsMTEgKzY0NSwxNiBAQAogCXVuc2lnbmVkIGludCBub19mdW5jcywgaTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghKHMtPnJlc291cmNlX3NldHVwX2RvbmUpKQorCWlmICghKHMtPnJlc291cmNlX3NldHVwX2RvbmUpKSB7CisJCWRzX2RiZygzLCAibm8gcmVzb3VyY2VzIGF2YWlsYWJsZSwgZGVsYXlpbmcgY2FyZF9hZGRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluLCBidXQgbGF0ZXIuLi4gKi8KKwl9CiAKLQlpZiAocGNtY2lhX3ZhbGlkYXRlX21lbShzKSkKKwlpZiAocGNtY2lhX3ZhbGlkYXRlX21lbShzKSkgeworCQlkc19kYmcoMywgInZhbGlkYXRpbmcgbWVtIHJlc291cmNlcyBmYWlsZWQsICIKKwkJICAgICAgICJkZWxheWluZyBjYXJkX2FkZFxuIik7CiAJCXJldHVybiAtRUFHQUlOOyAvKiB0cnkgYWdhaW4sIGJ1dCBsYXRlci4uLiAqLworCX0KIAogCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgQklORF9GTl9BTEwsICZjaXNpbmZvKTsKIAlpZiAocmV0IHx8ICFjaXNpbmZvLkNoYWlucykgewpAQCAtNjkwLDYgKzY2Niw3IEBACiAJCW5vX2Z1bmNzID0gbWZjLm5mbjsKIAllbHNlCiAJCW5vX2Z1bmNzID0gMTsKKwlzLT5mdW5jdGlvbnMgPSBub19mdW5jczsKIAogCWZvciAoaT0wOyBpIDwgbm9fZnVuY3M7IGkrKykKIAkJcGNtY2lhX2RldmljZV9hZGQocywgaSk7CkBAIC02OTgsMzggKzY3NSw0OSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9kZWxheWVkX2FkZF9wc2V1ZG9fZGV2aWNlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY21jaWFfZGVsYXllZF9hZGRfZGV2aWNlKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkYXRhOwotCXBjbWNpYV9kZXZpY2VfYWRkKHMsIDApOworCWRzX2RiZygxLCAiYWRkaW5nIGFkZGl0aW9uYWwgZGV2aWNlIHRvICVkXG4iLCBzLT5zb2NrKTsKKwlwY21jaWFfZGV2aWNlX2FkZChzLCBzLT5wY21jaWFfc3RhdGUubWZjX3BmYyk7CiAJcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZyA9IDA7CisJcy0+cGNtY2lhX3N0YXRlLm1mY19wZmMgPSAwOwogfQogCiBzdGF0aWMgaW50IHBjbWNpYV9yZXF1ZXJ5KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqIF9kYXRhKQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKLQlpZiAoIXBfZGV2LT5kZXYuZHJpdmVyKQorCWlmICghcF9kZXYtPmRldi5kcml2ZXIpIHsKKwkJZHNfZGJnKDEsICJ1cGRhdGUgZGV2aWNlIGluZm9ybWF0aW9uIGZvciAlc1xuIiwKKwkJICAgICAgIHBfZGV2LT5kZXYuYnVzX2lkKTsKIAkJcGNtY2lhX2RldmljZV9xdWVyeShwX2Rldik7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9idXNfcmVzY2FuKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCitzdGF0aWMgdm9pZCBwY21jaWFfYnVzX3Jlc2NhbihzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0LCBpbnQgbmV3X2NpcykKIHsKLQlpbnQgbm9fZGV2aWNlcz0wOworCWludCBub19kZXZpY2VzID0gMDsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBza3RfbXV0ZXggaGVsZCAqLworCWRzX2RiZygwLCAicmUtc2Nhbm5pbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKGxpc3RfZW1wdHkoJnNrdC0+ZGV2aWNlc19saXN0KSkKLQkJbm9fZGV2aWNlcz0xOworCQlub19kZXZpY2VzID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCisJLyogSWYgdGhpcyBpcyBiZWNhdXNlIG9mIGEgQ0lTIG92ZXJyaWRlLCBzdGFydCBvdmVyICovCisJaWYgKG5ld19jaXMgJiYgIW5vX2RldmljZXMpCisJCXBjbWNpYV9jYXJkX3JlbW92ZShza3QsIE5VTEwpOworCiAJLyogaWYgbm8gZGV2aWNlcyB3ZXJlIGFkZGVkIGZvciB0aGlzIHNvY2tldCB5ZXQgYmVjYXVzZSBvZgogCSAqIG1pc3NpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24gb3Igb3RoZXIgdHJvdWJsZSwgd2UgbmVlZCB0bwogCSAqIGRvIHRoaXMgbm93LiAqLwotCWlmIChub19kZXZpY2VzKSB7CisJaWYgKG5vX2RldmljZXMgfHwgbmV3X2NpcykgewogCQlyZXQgPSBwY21jaWFfY2FyZF9hZGQoc2t0KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybjsKQEAgLTc0Nyw2ICs3MzUsOTcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAicGNtY2lhOiBidXNfcmVzY2FuX2RldmljZXMgZmFpbGVkXG4iKTsKIH0KIAorI2lmZGVmIENPTkZJR19QQ01DSUFfTE9BRF9DSVMKKworLyoqCisgKiBwY21jaWFfbG9hZF9maXJtd2FyZSAtIGxvYWQgQ0lTIGZyb20gdXNlcnNwYWNlIGlmIGRldmljZS1wcm92aWRlZCBpcyBicm9rZW4KKyAqIEBkZXYgLSB0aGUgcGNtY2lhIGRldmljZSB3aGljaCBuZWVkcyBhIENJUyBvdmVycmlkZQorICogQGZpbGVuYW1lIC0gcmVxdWVzdGVkIGZpbGVuYW1lIGluIC9saWIvZmlybXdhcmUvCisgKgorICogVGhpcyB1c2VzIHRoZSBpbi1rZXJuZWwgZmlybXdhcmUgbG9hZGluZyBtZWNoYW5pc20gdG8gdXNlIGEgImZha2UgQ0lTIiBpZgorICogdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgY2FyZCBpcyBicm9rZW4uIFRoZSBmaXJtd2FyZSBmaWxlcyByZXNpZGUgaW4KKyAqIC9saWIvZmlybXdhcmUvIGluIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIGludCBwY21jaWFfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2LCBjaGFyICogZmlsZW5hbWUpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkZXYtPnNvY2tldDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNoYXIgcGF0aFsyMF07CisJaW50IHJldCA9IC1FTk9NRU07CisJaW50IG5vX2Z1bmNzOworCWludCBvbGRfZnVuY3M7CisJY2lzZHVtcF90ICpjaXM7CisJY2lzdHBsX2xvbmdsaW5rX21mY190IG1mYzsKKworCWlmICghZmlsZW5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJZHNfZGJnKDEsICJ0cnlpbmcgdG8gbG9hZCBDSVMgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworCisJaWYgKHN0cmxlbihmaWxlbmFtZSkgPiAxNCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY21jaWE6IENJUyBmaWxlbmFtZSBpcyB0b28gbG9uZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNucHJpbnRmKHBhdGgsIDIwLCAiJXMiLCBmaWxlbmFtZSk7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIHBhdGgsICZkZXYtPmRldikgPT0gMCkgeworCQlpZiAoZnctPnNpemUgPj0gQ0lTVFBMX01BWF9DSVNfU0laRSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCXByaW50ayhLRVJOX0VSUiAicGNtY2lhOiBDSVMgb3ZlcnJpZGUgaXMgdG9vIGJpZ1xuIik7CisJCQlnb3RvIHJlbGVhc2U7CisJCX0KKworCQljaXMgPSBremFsbG9jKHNpemVvZihjaXNkdW1wX3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaXMpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIHJlbGVhc2U7CisJCX0KKworCQljaXMtPkxlbmd0aCA9IGZ3LT5zaXplICsgMTsKKwkJbWVtY3B5KGNpcy0+RGF0YSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCQlpZiAoIXBjbWNpYV9yZXBsYWNlX2NpcyhzLCBjaXMpKQorCQkJcmV0ID0gMDsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBjbWNpYTogQ0lTIG92ZXJyaWRlIGZhaWxlZFxuIik7CisJCQlnb3RvIHJlbGVhc2U7CisJCX0KKworCisJCS8qIHVwZGF0ZSBpbmZvcm1hdGlvbiAqLworCQlwY21jaWFfZGV2aWNlX3F1ZXJ5KGRldik7CisKKwkJLyogZG9lcyB0aGlzIGNpcyBvdmVycmlkZSBhZGQgb3IgcmVtb3ZlIGZ1bmN0aW9ucz8gKi8KKwkJb2xkX2Z1bmNzID0gcy0+ZnVuY3Rpb25zOworCisJCWlmICghcGNjYXJkX3JlYWRfdHVwbGUocywgQklORF9GTl9BTEwsIENJU1RQTF9MT05HTElOS19NRkMsICZtZmMpKQorCQkJbm9fZnVuY3MgPSBtZmMubmZuOworCQllbHNlCisJCQlub19mdW5jcyA9IDE7CisJCXMtPmZ1bmN0aW9ucyA9IG5vX2Z1bmNzOworCisJCWlmIChvbGRfZnVuY3MgPiBub19mdW5jcykKKwkJCXBjbWNpYV9jYXJkX3JlbW92ZShzLCBkZXYpOworCQllbHNlIGlmIChub19mdW5jcyA+IG9sZF9mdW5jcykKKwkJCXBjbWNpYV9hZGRfZGV2aWNlX2xhdGVyKHMsIDEpOworCX0KKyByZWxlYXNlOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIChyZXQpOworfQorCisjZWxzZSAvKiAhQ09ORklHX1BDTUNJQV9MT0FEX0NJUyAqLworCitzdGF0aWMgaW5saW5lIGludCBwY21jaWFfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2LCBjaGFyICogZmlsZW5hbWUpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNlbmRpZgorCisKIHN0YXRpYyBpbmxpbmUgaW50IHBjbWNpYV9kZXZtYXRjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgKmRpZCkKIHsKQEAgLTgxMywxMSArODkyLDE0IEBACiAJCSAqIGFmdGVyIGl0IGhhcyByZS1jaGVja2VkIHRoYXQgdGhlcmUgaXMgbm8gcG9zc2libGUgbW9kdWxlCiAJCSAqIHdpdGggYSBwcm9kX2lkL21hbmZfaWQvY2FyZF9pZCBtYXRjaC4KIAkJICovCisJCWRzX2RiZygwLCAic2tpcHBpbmcgRlVOQ19JRCBtYXRjaCBmb3IgJXMgdW50aWwgdXNlcnNwYWNlICIKKwkJICAgICAgICJpbnRlcmFjdGlvblxuIiwgZGV2LT5kZXYuYnVzX2lkKTsKIAkJaWYgKCFkZXYtPmFsbG93X2Z1bmNfaWRfbWF0Y2gpCiAJCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMpIHsKKwkJZHNfZGJnKDAsICJkZXZpY2UgJXMgbmVlZHMgYSBmYWtlIENJU1xuIiwgZGV2LT5kZXYuYnVzX2lkKTsKIAkJaWYgKCFkZXYtPnNvY2tldC0+ZmFrZV9jaXMpCiAJCQlwY21jaWFfbG9hZF9maXJtd2FyZShkZXYsIGRpZC0+Y2lzZmlsZSk7CiAKQEAgLTg0NywxMyArOTI5LDIxIEBACiAKICNpZmRlZiBDT05GSUdfUENNQ0lBX0lPQ1RMCiAJLyogbWF0Y2hpbmcgYnkgY2FyZG1nciAqLwotCWlmIChwX2Rldi0+Y2FyZG1nciA9PSBwX2RydikKKwlpZiAocF9kZXYtPmNhcmRtZ3IgPT0gcF9kcnYpIHsKKwkJZHNfZGJnKDAsICJjYXJkbWdyIG1hdGNoZWQgJXMgdG8gJXNcbiIsIGRldi0+YnVzX2lkLAorCQkgICAgICAgZHJ2LT5uYW1lKTsKIAkJcmV0dXJuIDE7CisJfQogI2VuZGlmCiAKIAl3aGlsZSAoZGlkICYmIGRpZC0+bWF0Y2hfZmxhZ3MpIHsKLQkJaWYgKHBjbWNpYV9kZXZtYXRjaChwX2RldiwgZGlkKSkKKwkJZHNfZGJnKDMsICJ0cnlpbmcgdG8gbWF0Y2ggJXMgdG8gJXNcbiIsIGRldi0+YnVzX2lkLAorCQkgICAgICAgZHJ2LT5uYW1lKTsKKwkJaWYgKHBjbWNpYV9kZXZtYXRjaChwX2RldiwgZGlkKSkgeworCQkJZHNfZGJnKDAsICJtYXRjaGVkICVzIHRvICVzXG4iLCBkZXYtPmJ1c19pZCwKKwkJCSAgICAgICBkcnYtPm5hbWUpOwogCQkJcmV0dXJuIDE7CisJCX0KIAkJZGlkKys7CiAJfQogCkBAIC0xMDQ0LDYgKzExMzQsOCBAQAogCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKKwlkc19kYmcoMiwgInN1c3BlbmRpbmcgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwogCWlmIChkZXYtPmRyaXZlcikKIAkJcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRldi0+ZHJpdmVyKTsKIApAQCAtMTA1MiwxMiArMTE0NCwxOCBAQAogCiAJaWYgKHBfZHJ2LT5zdXNwZW5kKSB7CiAJCXJldCA9IHBfZHJ2LT5zdXNwZW5kKHBfZGV2KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwY21jaWE6IGRldmljZSAlcyAoZHJpdmVyICVzKSBkaWQgIgorCQkJICAgICAgICJub3Qgd2FudCB0byBnbyB0byBzbGVlcCAoJWQpXG4iLAorCQkJICAgICAgIHBfZGV2LT5kZXZuYW1lLCBwX2Rydi0+ZHJ2Lm5hbWUsIHJldCk7CiAJCQlnb3RvIG91dDsKKwkJfQogCX0KIAotCWlmIChwX2Rldi0+ZGV2aWNlX25vID09IHBfZGV2LT5mdW5jKQorCWlmIChwX2Rldi0+ZGV2aWNlX25vID09IHBfZGV2LT5mdW5jKSB7CisJCWRzX2RiZygyLCAicmVsZWFzaW5nIGNvbmZpZ3VyYXRpb24gZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CiAJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24ocF9kZXYpOworCX0KIAogIG91dDoKIAlpZiAoIXJldCkKQEAgLTEwNzIsNiArMTE3MCw4IEBACiAgICAgICAgIHN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKKwlkc19kYmcoMiwgInJlc3VtaW5nICVzXG4iLCBkZXYtPmJ1c19pZCk7CisKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihkZXYtPmRyaXZlcik7CiAKQEAgLTEwNzksNiArMTE3OSw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHBfZGV2LT5kZXZpY2Vfbm8gPT0gcF9kZXYtPmZ1bmMpIHsKKwkJZHNfZGJnKDIsICJyZXF1ZXN0aW5nIGNvbmZpZ3VyYXRpb24gZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CiAJCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24ocF9kZXYsICZwX2Rldi0+Y29uZik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKQEAgLTExMjAsMTIgKzEyMjEsMTQgQEAKIAogc3RhdGljIGludCBwY21jaWFfYnVzX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogeworCWRzX2RiZygyLCAicmVzdW1pbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOwogCWJ1c19mb3JfZWFjaF9kZXYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwgc2t0LCBwY21jaWFfYnVzX3Jlc3VtZV9jYWxsYmFjayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGNtY2lhX2J1c19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CisJZHNfZGJnKDIsICJzdXNwZW5kaW5nIHNvY2tldCAlZFxuIiwgc2t0LT5zb2NrKTsKIAlpZiAoYnVzX2Zvcl9lYWNoX2RldigmcGNtY2lhX2J1c190eXBlLCBOVUxMLCBza3QsCiAJCQkgICAgIHBjbWNpYV9idXNfc3VzcGVuZF9jYWxsYmFjaykpIHsKIAkJcGNtY2lhX2J1c19yZXN1bWUoc2t0KTsKQEAgLTEyNDYsNyArMTM0OSw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ja2V0LT5xdWV1ZSk7CiAjZW5kaWYKIAlJTklUX0xJU1RfSEVBRCgmc29ja2V0LT5kZXZpY2VzX2xpc3QpOwotCUlOSVRfV09SSygmc29ja2V0LT5kZXZpY2VfYWRkLCBwY21jaWFfZGVsYXllZF9hZGRfcHNldWRvX2RldmljZSwgc29ja2V0KTsKKwlJTklUX1dPUksoJnNvY2tldC0+ZGV2aWNlX2FkZCwgcGNtY2lhX2RlbGF5ZWRfYWRkX2RldmljZSwgc29ja2V0KTsKIAltZW1zZXQoJnNvY2tldC0+cGNtY2lhX3N0YXRlLCAwLCBzaXplb2YodTgpKTsKIAlzb2NrZXQtPmRldmljZV9jb3VudCA9IDA7CiAKQEAgLTEyNzIsNyArMTM3NSw5IEBACiAJcGNjYXJkX3JlZ2lzdGVyX3BjbWNpYShzb2NrZXQsIE5VTEwpOwogCiAJLyogdW5yZWdpc3RlciBhbnkgdW5ib3VuZCBkZXZpY2VzICovCisJbXV0ZXhfbG9jaygmc29ja2V0LT5za3RfbXV0ZXgpOwogCXBjbWNpYV9jYXJkX3JlbW92ZShzb2NrZXQsIE5VTEwpOworCW11dGV4X3VubG9jaygmc29ja2V0LT5za3RfbXV0ZXgpOwogCiAJcGNtY2lhX3B1dF9zb2NrZXQoc29ja2V0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKaW5kZXggMzZmZGFhNS4uM2MyMmFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCkBAIC0zOTgsNyArMzk4LDcgQEAKIHN0YXRpYyB2b2lkIHBjY19pbnRlcnJ1cHRfd3JhcHBlcih1X2xvbmcgZGF0YSkKIHsKIAlkZWJ1ZygzLCAibTMycl9jZmM6IHBjY19pbnRlcnJ1cHRfd3JhcHBlcjpcbiIpOwotCXBjY19pbnRlcnJ1cHQoMCwgTlVMTCwgTlVMTCk7CisJcGNjX2ludGVycnVwdCgwLCBOVUxMKTsKIAlpbml0X3RpbWVyKCZwb2xsX3RpbWVyKTsKIAlwb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcG9sbF9pbnRlcnZhbDsKIAlhZGRfdGltZXIoJnBvbGxfdGltZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYwppbmRleCAzMTBlZGU1Li5kMDc3ODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYwpAQCAtNTk0LDcgKzU5NCwxMiBAQAogCiAgICAgZXJyID0gcmV0ID0gMDsKIAotICAgIGlmIChjbWQgJiBJT0NfSU4pIF9fY29weV9mcm9tX3VzZXIoKGNoYXIgKilidWYsIHVhcmcsIHNpemUpOworICAgIGlmIChjbWQgJiBJT0NfSU4pIHsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigoY2hhciAqKWJ1ZiwgdWFyZywgc2l6ZSkpIHsKKwkgICAgZXJyID0gLUVGQVVMVDsKKwkgICAgZ290byBmcmVlX291dDsKKwl9CisgICAgfQogCiAgICAgc3dpdGNoIChjbWQpIHsKICAgICBjYXNlIERTX0FESlVTVF9SRVNPVVJDRV9JTkZPOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMgYi9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYwppbmRleCBhNzBmOTdmLi4zNjBjMjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYwpAQCAtNTgxLDEwICs1ODEsMTAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgcGQ2NzI5X2NoZWNrX2lycShpbnQgaXJxLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHBkNjcyOV9jaGVja19pcnEoaW50IGlycSkKIHsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBwZDY3MjlfdGVzdCwgZmxhZ3MsICJ4IiwgcGQ2NzI5X3Rlc3QpICE9IDApCi0JCXJldHVybiAtMTsKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBwZDY3MjlfdGVzdCwgSVJRRl9QUk9CRV9TSEFSRUQsICJ4IiwgcGQ2NzI5X3Rlc3QpCisJCSE9IDApIHJldHVybiAtMTsKIAlmcmVlX2lycShpcnEsIHBkNjcyOV90ZXN0KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTYxMCw3ICs2MTAsNyBAQAogCiAJLyoganVzdCBmaW5kIGludGVycnVwdHMgdGhhdCBhcmVuJ3QgaW4gdXNlICovCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCWlmICgobWFzazAgJiAoMSA8PCBpKSkgJiYgKHBkNjcyOV9jaGVja19pcnEoaSwgMCkgPT0gMCkpCisJCWlmICgobWFzazAgJiAoMSA8PCBpKSkgJiYgKHBkNjcyOV9jaGVja19pcnEoaSkgPT0gMCkpCiAJCQltYXNrIHw9ICgxIDw8IGkpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAicGQ2NzI5OiBJU0EgaXJxcyA9ICIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwppbmRleCA5MzNjZDg2Li5iMDA1NjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJICAgIChzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSAmJgogCSAgICAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKSB7CiAJCWlmICh0cnlfbW9kdWxlX2dldChzLT5jYWxsYmFjay0+b3duZXIpKSB7Ci0JCQlzLT5jYWxsYmFjay0+cmVxdWVyeShzKTsKKwkJCXMtPmNhbGxiYWNrLT5yZXF1ZXJ5KHMsIDApOwogCQkJbW9kdWxlX3B1dChzLT5jYWxsYmFjay0+b3duZXIpOwogCQl9CiAJfQpAQCAtMzI1LDcgKzMyNSw3IEBACiAJaWYgKChzLT5jYWxsYmFjaykgJiYgKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpICYmCiAJICAgICEocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykpIHsKIAkJaWYgKHRyeV9tb2R1bGVfZ2V0KHMtPmNhbGxiYWNrLT5vd25lcikpIHsKLQkJCXMtPmNhbGxiYWNrLT5yZXF1ZXJ5KHMpOworCQkJcy0+Y2FsbGJhY2stPnJlcXVlcnkocywgMSk7CiAJCQltb2R1bGVfcHV0KHMtPmNhbGxiYWNrLT5vd25lcik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9NYWtlZmlsZSBiL2RyaXZlcnMvcHMzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmQ1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmoteSArPSBzeXN0ZW0tYnVzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3N5c3RlbS1idXMuYyBiL2RyaXZlcnMvcHMzL3N5c3RlbS1idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzlmOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wczMvc3lzdGVtLWJ1cy5jCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogIFBTMyBzeXN0ZW0gYnVzIGRyaXZlci4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKKyNkZWZpbmUgZHVtcF9tbWlvX3JlZ2lvbihfYSkgX2R1bXBfbW1pb19yZWdpb24oX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX21taW9fcmVnaW9uKGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb24qIHIsCisJY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiBkZXYgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsIHItPmRpZC5idXNfaWQsCisJCXItPmRpZC5kZXZfaWQpOworCXByX2RlYnVnKCIlczolZDogYnVzX2FkZHIgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmJ1c19hZGRyKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGxlbiAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5sZW4pOworCXByX2RlYnVnKCIlczolZDogbHBhcl9hZGRyICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmxwYXJfYWRkcik7Cit9CisKK2ludCBwczNfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJCXItPmJ1c19hZGRyLCByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgJnItPmxwYXJfYWRkcik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX21hcF9kZXZpY2VfbW1pb19yZWdpb24gZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJci0+bHBhcl9hZGRyID0gci0+bGVuID0gci0+YnVzX2FkZHIgPSAwOworCX0KKworCWR1bXBfbW1pb19yZWdpb24ocik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwkJci0+YnVzX2FkZHIpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfdW5tYXBfZGV2aWNlX21taW9fcmVnaW9uIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisKKwlyLT5scGFyX2FkZHIgPSByLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfc3lzdGVtX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpfZHJ2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0gdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kcnYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKworCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKKworCXByX2luZm8oIiVzOiVkOiBkZXY9JXUoJXMpLCBkcnY9JXUoJXMpOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkLCBkZXYtPmNvcmUuYnVzX2lkLCBkcnYtPm1hdGNoX2lkLCBkcnYtPmNvcmUubmFtZSwKKwkJKHJlc3VsdCA/ICJtYXRjaCIgOiAibWlzcyIpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0KKwkJdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisKKwlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQsIDApOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9vcGVuX2RldmljZSBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVBQ0NFUzsKKwkJZ290byBjbGVhbl9ub25lOworCX0KKworCWlmIChkZXYtPmRfcmVnaW9uLT5kaWQuYnVzX2lkKSB7CisJCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2NyZWF0ZShkZXYtPmRfcmVnaW9uKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfcmVnaW9uX2NyZWF0ZSBmYWlsZWQgKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCQlCVUdfT04oImNoZWNrIHJlZ2lvbiB0eXBlIik7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbl9kZXZpY2U7CisJCX0KKwl9CisKKwlCVUdfT04oIWRydik7CisKKwlpZiAoZHJ2LT5wcm9iZSkKKwkJcmVzdWx0ID0gZHJ2LT5wcm9iZShkZXYpOworCWVsc2UKKwkJcHJfaW5mbygiJXM6JWQ6ICVzIG5vIHByb2JlIG1ldGhvZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJZGV2LT5jb3JlLmJ1c19pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogZHJ2LT5wcm9iZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gY2xlYW5fZG1hOworCX0KKworCXJldHVybiByZXN1bHQ7CisKK2NsZWFuX2RtYToKKwlwczNfZG1hX3JlZ2lvbl9mcmVlKGRldi0+ZF9yZWdpb24pOworY2xlYW5fZGV2aWNlOgorCWx2MV9jbG9zZV9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOworY2xlYW5fbm9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPQorCQl0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKworCWlmIChkcnYtPnJlbW92ZSkKKwkJZHJ2LT5yZW1vdmUoZGV2KTsKKwllbHNlCisJCXByX2luZm8oIiVzOiVkOiAlcyBubyByZW1vdmUgbWV0aG9kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlkZXYtPmNvcmUuYnVzX2lkKTsKKworCXBzM19kbWFfcmVnaW9uX2ZyZWUoZGV2LT5kX3JlZ2lvbik7CisJcHMzX2ZyZWVfbW1pb19yZWdpb24oZGV2LT5tX3JlZ2lvbik7CisJbHYxX2Nsb3NlX2RldmljZShkZXYtPmRpZC5idXNfaWQsIGRldi0+ZGlkLmRldl9pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ1c190eXBlIHBzM19zeXN0ZW1fYnVzX3R5cGUgPSB7CisgICAgICAgIC5uYW1lID0gInBzM19zeXN0ZW1fYnVzIiwKKwkubWF0Y2ggPSBwczNfc3lzdGVtX2J1c19tYXRjaCwKKwkucHJvYmUgPSBwczNfc3lzdGVtX2J1c19wcm9iZSwKKwkucmVtb3ZlID0gcHMzX3N5c3RlbV9idXNfcmVtb3ZlLAorfTsKKworaW50IF9faW5pdCBwczNfc3lzdGVtX2J1c19pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKKwkJcmV0dXJuIDA7CisKKwlyZXN1bHQgPSBidXNfcmVnaXN0ZXIoJnBzM19zeXN0ZW1fYnVzX3R5cGUpOworCUJVR19PTihyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2NvcmVfaW5pdGNhbGwocHMzX3N5c3RlbV9idXNfaW5pdCk7CisKKy8qIEFsbG9jYXRlcyBhIGNvbnRpZ3VvdXMgcmVhbCBidWZmZXIgYW5kIGNyZWF0ZXMgbWFwcGluZ3Mgb3ZlciBpdC4KKyAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZCBzZXRzIGRtYV9oYW5kbGUKKyAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCisgKi8KKworc3RhdGljIHZvaWQgKiBwczNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsCisJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkcjsKKworCUJVR19PTighZGV2LT5kX3JlZ2lvbi0+YnVzX2FkZHIpOworCisJZmxhZyAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pOworCWZsYWcgfD0gX19HRlBfWkVSTzsKKworCXZpcnRfYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoZmxhZywgZ2V0X29yZGVyKHNpemUpKTsKKworCWlmICghdmlydF9hZGRyKSB7CisJCXByX2RlYnVnKCIlczolZDogZ2V0X2ZyZWVfcGFnZXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGNsZWFuX25vbmU7CisJfQorCisJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgdmlydF9hZGRyLCBzaXplLCBkbWFfaGFuZGxlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJQlVHX09OKCJjaGVjayByZWdpb24gdHlwZSIpOworCQlnb3RvIGNsZWFuX2FsbG9jOworCX0KKworCXJldHVybiAodm9pZCopdmlydF9hZGRyOworCitjbGVhbl9hbGxvYzoKKwlmcmVlX3BhZ2VzKHZpcnRfYWRkciwgZ2V0X29yZGVyKHNpemUpKTsKK2NsZWFuX25vbmU6CisJZG1hX2hhbmRsZSA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKKwlkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCisJcHMzX2RtYV91bm1hcChkZXYtPmRfcmVnaW9uLCBkbWFfaGFuZGxlLCBzaXplKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorCisvKiBDcmVhdGVzIFRDRXMgZm9yIGEgdXNlciBwcm92aWRlZCBidWZmZXIuICBUaGUgdXNlciBidWZmZXIgbXVzdCBiZQorICogY29udGlndW91cyByZWFsIGtlcm5lbCBzdG9yYWdlIChub3Qgdm1hbGxvYykuICBUaGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisgKiBwYXNzZWQgaGVyZSBpcyB0aGUga2VybmVsICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHRoZSBidWZmZXIuICBUaGUgYnVmZmVyCisgKiBuZWVkIG5vdCBiZSBwYWdlIGFsaWduZWQsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIHdpbGwgcG9pbnQgdG8gdGhlIHNhbWUKKyAqIGJ5dGUgd2l0aGluIHRoZSBwYWdlIGFzIHZhZGRyLgorICovCisKK3N0YXRpYyBkbWFfYWRkcl90IHBzM19tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CisKKwlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCAodW5zaWduZWQgbG9uZylwdHIsIHNpemUsCisJCSZidXNfYWRkcik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJfQorCisJcmV0dXJuIGJ1c19hZGRyOworfQorCitzdGF0aWMgdm9pZCBwczNfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHBzM19kbWFfdW5tYXAoZGV2LT5kX3JlZ2lvbiwgZG1hX2FkZHIsIHNpemUpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfdW5tYXAgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJfQorfQorCitzdGF0aWMgaW50IHBzM19tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCisJQlVHX09OKCJkbyIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBzM191bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworI2lmIGRlZmluZWQoQ09ORklHX1BTM19EWU5BTUlDX0RNQSkKKwlCVUdfT04oImRvIik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBwczNfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpfZGV2LCB1NjQgbWFzaykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX2RtYV9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50ID0gcHMzX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50ID0gcHMzX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zaW5nbGUgPSBwczNfbWFwX3NpbmdsZSwKKwkudW5tYXBfc2luZ2xlID0gcHMzX3VubWFwX3NpbmdsZSwKKwkubWFwX3NnID0gcHMzX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZAorfTsKKworLyoqCisgKiBwczNfc3lzdGVtX2J1c19yZWxlYXNlX2RldmljZSAtIHJlbW92ZSBhIGRldmljZSBmcm9tIHRoZSBzeXN0ZW0gYnVzCisgKi8KKworc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJa2ZyZWUoZGV2KTsKK30KKworLyoqCisgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgLSBhZGQgYSBkZXZpY2UgdG8gdGhlIHN5c3RlbSBidXMKKyAqCisgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoKSBleHBlY3RzIHRoZSBkZXYgb2JqZWN0IHRvIGJlIGFsbG9jYXRlZAorICogZHluYW1pY2FsbHkgYnkgdGhlIGNhbGxlci4gIFRoZSBzeXN0ZW0gYnVzIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZGV2CisgKiBvYmplY3QgYW5kIGZyZWVzIHRoZSBvYmplY3QgaW4gcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2UoKS4KKyAqLworCitpbnQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X2NvdW50ID0gMTsKKworCWRldi0+Y29yZS5wYXJlbnQgPSBOVUxMOworCWRldi0+Y29yZS5idXMgPSAmcHMzX3N5c3RlbV9idXNfdHlwZTsKKwlkZXYtPmNvcmUucmVsZWFzZSA9IHBzM19zeXN0ZW1fYnVzX3JlbGVhc2VfZGV2aWNlOworCisJZGV2LT5jb3JlLmFyY2hkYXRhLm9mX25vZGUgPSBOVUxMOworCWRldi0+Y29yZS5hcmNoZGF0YS5kbWFfb3BzID0gJnBzM19kbWFfb3BzOworCWRldi0+Y29yZS5hcmNoZGF0YS5udW1hX25vZGUgPSAwOworCisJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLCAic2JfJTAyeCIsCisJCWRldl9jb3VudCsrKTsKKworCXByX2RlYnVnKCIlczolZCBhZGQgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7CisKKwlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+Y29yZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKTsKKworaW50IHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpCit7CisJaW50IHJlc3VsdDsKKworCWRydi0+Y29yZS5idXMgPSAmcHMzX3N5c3RlbV9idXNfdHlwZTsKKworCXJlc3VsdCA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5jb3JlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MX0dQTChwczNfc3lzdGVtX2J1c19kcml2ZXJfcmVnaXN0ZXIpOworCit2b2lkIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCA1NzljZDY2Li42ZjExZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtMTQ1LDYgKzE0NSwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocnRjX3NldF9hbGFybSk7CiAKKy8qKgorICogcnRjX3VwZGF0ZV9pcnEgLSByZXBvcnQgUlRDIHBlcmlvZGljLCBhbGFybSwgYW5kL29yIHVwZGF0ZSBpcnFzCisgKiBAY2xhc3NfZGV2OiB0aGUgcnRjJ3MgY2xhc3MgZGV2aWNlCisgKiBAbnVtOiBob3cgbWFueSBpcnFzIGFyZSBiZWluZyByZXBvcnRlZCAodXN1YWxseSBvbmUpCisgKiBAZXZlbnRzOiBtYXNrIG9mIFJUQ19JUlFGIHdpdGggb25lIG9yIG1vcmUgb2YgUlRDX1BGLCBSVENfQUYsIFJUQ19VRgorICogQ29udGV4dDogaW5faW50ZXJydXB0KCksIGlycXMgYmxvY2tlZAorICovCiB2b2lkIHJ0Y191cGRhdGVfaXJxKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKIAkJdW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgZXZlbnRzKQogewpAQCAtMjAxLDEyICsyMDgsMTIgQEAKIAlpZiAodGFzayA9PSBOVUxMIHx8IHRhc2stPmZ1bmMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2soJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfdGFza19sb2NrKTsKIAlpZiAocnRjLT5pcnFfdGFzayA9PSBOVUxMKSB7CiAJCXJ0Yy0+aXJxX3Rhc2sgPSB0YXNrOwogCQlyZXR2YWwgPSAwOwogCX0KLQlzcGluX3VubG9jaygmcnRjLT5pcnFfdGFza19sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjE2LDEwICsyMjMsMTAgQEAKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gdG9fcnRjX2RldmljZShjbGFzc19kZXYpOwogCi0Jc3Bpbl9sb2NrKCZydGMtPmlycV90YXNrX2xvY2spOworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CiAJaWYgKHJ0Yy0+aXJxX3Rhc2sgPT0gdGFzaykKIAkJcnRjLT5pcnFfdGFzayA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV90YXNrX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnRjX2lycV91bnJlZ2lzdGVyKTsKIApAQCAtMjY1LDMgKzI3Miw0IEBACiAJfQogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfaXJxX3NldF9mcmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1hdDkxLmMgYi9kcml2ZXJzL3J0Yy9ydGMtYXQ5MS5jCmluZGV4IGJkNjFlOTkuLjVjOGFkZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1hdDkxLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWF0OTEuYwpAQCAtMjkyLDcgKzI5Miw4IEBACiAJCQkJCUFUOTFfUlRDX0NBTEVWKTsKIAogCXJldCA9IHJlcXVlc3RfaXJxKEFUOTFfSURfU1lTLCBhdDkxX3J0Y19pbnRlcnJ1cHQsCi0JCQkJSVJRRl9TSEFSRUQsICJhdDkxX3J0YyIsIHBkZXYpOworCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwkJCQkiYXQ5MV9ydGMiLCBwZGV2KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9ydGM6IElSUSAlZCBhbHJlYWR5IGluIHVzZS5cbiIsCiAJCQkJQVQ5MV9JRF9TWVMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRldi5jIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCmluZGV4IDU4Mzc4OWMuLjgxNGI5ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKQEAgLTYxLDcgKzYxLDkgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gcnRjX3JlYWRfdGltZSgmcnRjLT5jbGFzc19kZXYsICZ0bSk7Ci0Jc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXNwaW5fbG9jaygmcnRjLT5pcnFfbG9jayk7CiAJaWYgKHJ0Yy0+c3RvcF91aWVfcG9sbGluZyB8fCBlcnIpIHsKIAkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAwOwogCX0gZWxzZSBpZiAocnRjLT5vbGRzZWNzICE9IHRtLnRtX3NlYykgewpAQCAtNzQsMTEgKzc2LDExIEBACiAJfSBlbHNlIGlmIChzY2hlZHVsZV93b3JrKCZydGMtPnVpZV90YXNrKSA9PSAwKSB7CiAJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlzcGluX3VubG9jaygmcnRjLT5pcnFfbG9jayk7CiAJaWYgKG51bSkKIAkJcnRjX3VwZGF0ZV9pcnEoJnJ0Yy0+Y2xhc3NfZGV2LCBudW0sIFJUQ19VRiB8IFJUQ19JUlFGKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9Ci0KIHN0YXRpYyB2b2lkIHJ0Y191aWVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSAoc3RydWN0IHJ0Y19kZXZpY2UgKilkYXRhOwpAQCAtMjE0LDcgKzIxNiw3IEBACiAJc3RydWN0IHJ0Y193a2Fscm0gYWxhcm07CiAJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOwogCi0JLyogY2hlY2sgdGhhdCB0aGUgY2FsbGVzIGhhcyBhcHByb3ByaWF0ZSBwZXJtaXNzaW9ucworCS8qIGNoZWNrIHRoYXQgdGhlIGNhbGxpbmcgdGFzayBoYXMgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMKIAkgKiBmb3IgY2VydGFpbiBpb2N0bHMuIGRvaW5nIHRoaXMgY2hlY2sgaGVyZSBpcyB1c2VmdWwKIAkgKiB0byBhdm9pZCBkdXBsaWNhdGUgY29kZSBpbiBlYWNoIGRyaXZlci4KIAkgKi8KQEAgLTIzOCwxMCArMjQwLDEwIEBACiAKIAkvKiBhdm9pZCBjb25mbGljdGluZyBJUlEgdXNlcnMgKi8KIAlpZiAoY21kID09IFJUQ19QSUVfT04gfHwgY21kID09IFJUQ19QSUVfT0ZGIHx8IGNtZCA9PSBSVENfSVJRUF9TRVQpIHsKLQkJc3Bpbl9sb2NrKCZydGMtPmlycV90YXNrX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZydGMtPmlycV90YXNrX2xvY2spOwogCQlpZiAocnRjLT5pcnFfdGFzaykKIAkJCWVyciA9IC1FQlVTWTsKLQkJc3Bpbl91bmxvY2soJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfdGFza19sb2NrKTsKIAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0yOTksNiArMzAxLDE3IEBACiAKIAkJZXJyID0gcnRjX3NldF90aW1lKGNsYXNzX2RldiwgJnRtKTsKIAkJYnJlYWs7CisKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CisJCWlmIChvcHMtPmlycV9zZXRfZnJlcSkKKwkJCWVyciA9IHB1dF91c2VyKHJ0Yy0+aXJxX2ZyZXEsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWlmIChvcHMtPmlycV9zZXRfZnJlcSkKKwkJCWVyciA9IHJ0Y19pcnFfc2V0X2ZyZXEoY2xhc3NfZGV2LCBydGMtPmlycV90YXNrLCBhcmcpOworCQlicmVhazsKKwogI2lmIDAKIAljYXNlIFJUQ19FUE9DSF9TRVQ6CiAjaWZuZGVmIHJ0Y19lcG9jaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCmluZGV4IDc4NTUyZTYuLjAwMWViMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKQEAgLTM0MCw3ICszNDAsOCBAQAogCiAJaWYgKHBkYXRhLT5pcnEgPj0gMCkgewogCQl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwotCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgZHMxNTUzX3J0Y19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgZHMxNTUzX3J0Y19pbnRlcnJ1cHQsCisJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAogCQkJCXBkZXYtPm5hbWUsIHBkZXYpIDwgMCkgewogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7CiAJCQlwZGF0YS0+aXJxID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYwppbmRleCAyYTg2NjMyLi5hNDRmZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHJhdyB0cmltPSV4XG4iLCBfX0ZVTkNUSU9OX18sICp0cmltKTsKLQogCWlmIChvc2MpCiAJCSpvc2MgPSAoYnVmICYgUlM1QzM3Ml9UUklNX1hTTCkgPyAzMjAwMCA6IDMyNzY4OwogCi0JaWYgKHRyaW0pCisJaWYgKHRyaW0pIHsKIAkJKnRyaW0gPSBidWYgJiBSUzVDMzcyX1RSSU1fTUFTSzsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogcmF3IHRyaW09JXhcbiIsIF9fRlVOQ1RJT05fXywgKnRyaW0pOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXRlc3QuYyBiL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKaW5kZXggYmM0YmQyNC4uNmVmOWM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXRlc3QuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCkBAIC05OSw2ICs5OSw3IEBACiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRfZGV2KTsKIAogCXJldHZhbCA9IGNvdW50OworCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJaWYgKHN0cm5jbXAoYnVmLCAidGljayIsIDQpID09IDApCiAJCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgMSwgUlRDX1BGIHwgUlRDX0lSUUYpOwogCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiYWxhcm0iLCA1KSA9PSAwKQpAQCAtMTA3LDYgKzEwOCw3IEBACiAJCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgMSwgUlRDX1VGIHwgUlRDX0lSUUYpOwogCWVsc2UKIAkJcmV0dmFsID0gLUVJTlZBTDsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggNzlmZmVmNi4uYTJjZWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0xMjY0LDE1ICsxMjY0LDIxIEBACiAJaWYgKGxpc3RfZW1wdHkoJmRldmljZS0+Y2N3X3F1ZXVlKSkKIAkJcmV0dXJuOwogCWNxciA9IGxpc3RfZW50cnkoZGV2aWNlLT5jY3dfcXVldWUubmV4dCwgc3RydWN0IGRhc2RfY2N3X3JlcSwgbGlzdCk7Ci0JaWYgKGNxci0+c3RhdHVzID09IERBU0RfQ1FSX0lOX0lPICYmIGNxci0+ZXhwaXJlcyAhPSAwKSB7Ci0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGNxci0+ZXhwaXJlcyArIGNxci0+c3RhcnR0aW1lKSkgeworCWlmICgoY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfSU5fSU8gJiYgY3FyLT5leHBpcmVzICE9IDApICYmCisJICAgICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGNxci0+ZXhwaXJlcyArIGNxci0+c3RhcnR0aW1lKSkpIHsKKwkJaWYgKGRldmljZS0+ZGlzY2lwbGluZS0+dGVybV9JTyhjcXIpICE9IDApIHsKKwkJCS8qIEhtcGYsIHRyeSBhZ2FpbiBpbiA1IHNlYyAqLworCQkJZGFzZF9zZXRfdGltZXIoZGV2aWNlLCA1KkhaKTsKKwkJCURFVl9NRVNTQUdFKEtFUk5fRVJSLCBkZXZpY2UsCisJCQkJICAgICJpbnRlcm5hbCBlcnJvciAtIHRpbWVvdXQgKCVpcykgZXhwaXJlZCAiCisJCQkJICAgICJmb3IgY3FyICVwLCB0ZXJtaW5hdGlvbiBmYWlsZWQsICIKKwkJCQkgICAgInJldHJ5aW5nIGluIDVzIiwKKwkJCQkgICAgKGNxci0+ZXhwaXJlcy9IWiksIGNxcik7CisJCX0gZWxzZSB7CiAJCQlERVZfTUVTU0FHRShLRVJOX0VSUiwgZGV2aWNlLAogCQkJCSAgICAiaW50ZXJuYWwgZXJyb3IgLSB0aW1lb3V0ICglaXMpIGV4cGlyZWQgIgogCQkJCSAgICAiZm9yIGNxciAlcCAoJWkgcmV0cmllcyBsZWZ0KSIsCiAJCQkJICAgIChjcXItPmV4cGlyZXMvSFopLCBjcXIsIGNxci0+cmV0cmllcyk7Ci0JCQlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lLT50ZXJtX0lPKGNxcikgIT0gMCkKLQkJCQkvKiBIbXBmLCB0cnkgYWdhaW4gaW4gMS8xMCBzZWMgKi8KLQkJCQlkYXNkX3NldF90aW1lcihkZXZpY2UsIDEwKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMKaW5kZXggOTFjZjk3MS4uMTdmZGQ4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMKQEAgLTY4NCwyMSArNjg0LDI2IEBACiAJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7Ci0JaW50IHJvX2ZsYWc7CisJaW50IHZhbDsKKwljaGFyICplbmRwOwogCiAJZGV2bWFwID0gZGFzZF9kZXZtYXBfZnJvbV9jZGV2KHRvX2Njd2RldihkZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCiAJCXJldHVybiBQVFJfRVJSKGRldm1hcCk7Ci0Jcm9fZmxhZyA9IGJ1ZlswXSA9PSAnMSc7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoKChlbmRwICsgMSkgPCAoYnVmICsgY291bnQpKSB8fCAodmFsID4gMSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKLQlpZiAocm9fZmxhZykKKwlpZiAodmFsKQogCQlkZXZtYXAtPmZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9SRUFET05MWTsKIAllbHNlCiAJCWRldm1hcC0+ZmVhdHVyZXMgJj0gfkRBU0RfRkVBVFVSRV9SRUFET05MWTsKIAlpZiAoZGV2bWFwLT5kZXZpY2UpCiAJCWRldm1hcC0+ZGV2aWNlLT5mZWF0dXJlcyA9IGRldm1hcC0+ZmVhdHVyZXM7CiAJaWYgKGRldm1hcC0+ZGV2aWNlICYmIGRldm1hcC0+ZGV2aWNlLT5nZHApCi0JCXNldF9kaXNrX3JvKGRldm1hcC0+ZGV2aWNlLT5nZHAsIHJvX2ZsYWcpOworCQlzZXRfZGlza19ybyhkZXZtYXAtPmRldmljZS0+Z2RwLCB2YWwpOwogCXNwaW5fdW5sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC03MjksMTcgKzczNCwyMiBAQAogewogCXN0cnVjdCBkYXNkX2Rldm1hcCAqZGV2bWFwOwogCXNzaXplX3QgcmM7Ci0JaW50IHVzZV9kaWFnOworCWludCB2YWw7CisJY2hhciAqZW5kcDsKIAogCWRldm1hcCA9IGRhc2RfZGV2bWFwX2Zyb21fY2Rldih0b19jY3dkZXYoZGV2KSk7CiAJaWYgKElTX0VSUihkZXZtYXApKQogCQlyZXR1cm4gUFRSX0VSUihkZXZtYXApOwotCXVzZV9kaWFnID0gYnVmWzBdID09ICcxJzsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCWlmICgoKGVuZHAgKyAxKSA8IChidWYgKyBjb3VudCkpIHx8ICh2YWwgPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzcGluX2xvY2soJmRhc2RfZGV2bWFwX2xvY2spOwogCS8qIENoYW5naW5nIGRpYWcgZGlzY2lwbGluZSBmbGFnIGlzIG9ubHkgYWxsb3dlZCBpbiBvZmZsaW5lIHN0YXRlLiAqLwogCXJjID0gY291bnQ7CiAJaWYgKCFkZXZtYXAtPmRldmljZSkgewotCQlpZiAodXNlX2RpYWcpCisJCWlmICh2YWwpCiAJCQlkZXZtYXAtPmZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9VU0VESUFHOwogCQllbHNlCiAJCQlkZXZtYXAtPmZlYXR1cmVzICY9IH5EQVNEX0ZFQVRVUkVfVVNFRElBRzsKQEAgLTg1NCwxNCArODY0LDIwIEBACiAJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkYXNkX2Rldm1hcCAqZGV2bWFwOwotCWludCByYzsKKwlpbnQgdmFsLCByYzsKKwljaGFyICplbmRwOwogCiAJZGV2bWFwID0gZGFzZF9kZXZtYXBfZnJvbV9jZGV2KHRvX2Njd2RldihkZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCiAJCXJldHVybiBQVFJfRVJSKGRldm1hcCk7CiAJaWYgKCFkZXZtYXAtPmRldmljZSkKLQkJcmV0dXJuIGNvdW50OwotCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXJldHVybiAtRU5PREVWOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7CisJaWYgKCgoZW5kcCArIDEpIDwgKGJ1ZiArIGNvdW50KSkgfHwgKHZhbCA+IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2YWwpIHsKIAkJcmMgPSBkYXNkX2Vlcl9lbmFibGUoZGV2bWFwLT5kZXZpY2UpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKaW5kZXggZDdkZTE3NWQuLmM5MzIxYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKQEAgLTI5OSwxNCArMjk5LDE0IEBACiAJc3RydWN0IHJhdzMyMTVfaW5mbyAqcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgX19kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZShyYXctPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCWlmIChyYXctPmZsYWdzICYgUkFXMzIxNV9USU1FUl9SVU5TKSB7CiAJCWRlbF90aW1lcigmcmF3LT50aW1lcik7CiAJCXJhdy0+ZmxhZ3MgJj0gflJBVzMyMTVfVElNRVJfUlVOUzsKIAkJcmF3MzIxNV9ta193cml0ZV9yZXEocmF3KTsKIAkJcmF3MzIxNV9zdGFydF9pbyhyYXcpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIH0KIAogLyoKQEAgLTM1NSwxMCArMzU1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJhdyA9IChzdHJ1Y3QgcmF3MzIxNV9pbmZvICopIGRhdGE7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAlyYXczMjE1X21rX3dyaXRlX3JlcShyYXcpOwogCXJhdzMyMTVfdHJ5X2lvKHJhdyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyYXctPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJLyogQ2hlY2sgZm9yIHBlbmRpbmcgbWVzc2FnZSBmcm9tIHJhdzMyMTVfaXJxICovCiAJaWYgKHJhdy0+bWVzc2FnZSAhPSBOVUxMKSB7CiAJCXByaW50ayhyYXctPm1lc3NhZ2UsIHJhdy0+bXNnX2RzdGF0LCByYXctPm1zZ19jc3RhdCk7CkBAIC01MTIsOSArNTEyLDkgQEAKIAkJaWYgKFJBVzMyMTVfQlVGRkVSX1NJWkUgLSByYXctPmNvdW50ID49IGxlbmd0aCkKIAkJCWJyZWFrOwogCQkvKiB0aGVyZSBtaWdodCBiZSBhbm90aGVyIGNwdSB3YWl0aW5nIGZvciB0aGUgbG9jayAqLwotCQlzcGluX3VubG9jayhyYXctPmxvY2spOworCQlzcGluX3VubG9jayhnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSk7CiAJCXVkZWxheSgxMDApOwotCQlzcGluX2xvY2socmF3LT5sb2NrKTsKKwkJc3Bpbl9sb2NrKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpKTsKIAl9CiB9CiAKQEAgLTUyOCw3ICs1MjgsNyBAQAogCWludCBjLCBjb3VudDsKIAogCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCQljb3VudCA9IChsZW5ndGggPiBSQVczMjE1X0JVRkZFUl9TSVpFKSA/CiAJCQkJCSAgICAgUkFXMzIxNV9CVUZGRVJfU0laRSA6IGxlbmd0aDsKIAkJbGVuZ3RoIC09IGNvdW50OwpAQCAtNTU1LDcgKzU1NSw3IEBACiAJCQkvKiBzdGFydCBvciBxdWV1ZSByZXF1ZXN0ICovCiAJCQlyYXczMjE1X3RyeV9pbyhyYXcpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTU2OCw3ICs1NjgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGxlbmd0aCwgaTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJaWYgKGNoID09ICdcdCcpIHsKIAkJbGVuZ3RoID0gVEFCX1NUT1BfU0laRSAtIChyYXctPmxpbmVfcG9zJVRBQl9TVE9QX1NJWkUpOwogCQlyYXctPmxpbmVfcG9zICs9IGxlbmd0aDsKQEAgLTU5Miw3ICs1OTIsNyBAQAogCQkvKiBzdGFydCBvciBxdWV1ZSByZXF1ZXN0ICovCiAJCXJhdzMyMTVfdHJ5X2lvKHJhdyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCiAvKgpAQCAtNjA0LDEzICs2MDQsMTMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAlpZiAocmF3LT5jb3VudCA+IDApIHsKIAkJcmF3LT5mbGFncyB8PSBSQVczMjE1X0ZMVVNISU5HOwogCQlyYXczMjE1X3RyeV9pbyhyYXcpOwogCQlyYXctPmZsYWdzICY9IH5SQVczMjE1X0ZMVVNISU5HOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIH0KIAogLyoKQEAgLTYyNSw5ICs2MjUsOSBAQAogCQlyZXR1cm4gMDsKIAlyYXctPmxpbmVfcG9zID0gMDsKIAlyYXctPmZsYWdzIHw9IFJBVzMyMTVfQUNUSVZFOwotCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJcmF3MzIxNV90cnlfaW8ocmF3KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQ0LDIxICs2NDQsMjEgQEAKIAlpZiAoIShyYXctPmZsYWdzICYgUkFXMzIxNV9BQ1RJVkUpIHx8IChyYXctPmZsYWdzICYgUkFXMzIxNV9GSVhFRCkpCiAJCXJldHVybjsKIAkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyByZXF1ZXN0cywgdGhlbiBmcmVlIGlycSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJaWYgKChyYXctPmZsYWdzICYgUkFXMzIxNV9XT1JLSU5HKSB8fAogCSAgICByYXctPnF1ZXVlZF93cml0ZSAhPSBOVUxMIHx8CiAJICAgIHJhdy0+cXVldWVkX3JlYWQgIT0gTlVMTCkgewogCQlyYXctPmZsYWdzIHw9IFJBVzMyMTVfQ0xPU0lORzsKIAkJYWRkX3dhaXRfcXVldWUoJnJhdy0+ZW1wdHlfd2FpdCwgJndhaXQpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJCXNjaGVkdWxlKCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcmF3LT5lbXB0eV93YWl0LCAmd2FpdCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCXJhdy0+ZmxhZ3MgJj0gfihSQVczMjE1X0FDVElWRSB8IFJBVzMyMTVfQ0xPU0lORyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CkBAIC02ODYsNyArNjg2LDYgQEAKIAl9CiAKIAlyYXctPmNkZXYgPSBjZGV2OwotCXJhdy0+bG9jayA9IGdldF9jY3dkZXZfbG9jayhjZGV2KTsKIAlyYXctPmluYnVmID0gKGNoYXIgKikgcmF3ICsgc2l6ZW9mKHN0cnVjdCByYXczMjE1X2luZm8pOwogCW1lbXNldChyYXcsIDAsIHNpemVvZihzdHJ1Y3QgcmF3MzIxNV9pbmZvKSk7CiAJcmF3LT5idWZmZXIgPSAoY2hhciAqKSBrbWFsbG9jKFJBVzMyMTVfQlVGRkVSX1NJWkUsCkBAIC04MDksOSArODA4LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmF3ID0gcmF3MzIxNVswXTsgIC8qIGNvbnNvbGUgMzIxNSBpcyB0aGUgZmlyc3Qgb25lICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAlyYXczMjE1X21ha2Vfcm9vbShyYXcsIFJBVzMyMTVfQlVGRkVSX1NJWkUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCAKQEAgLTg3Myw3ICs4NzIsNiBAQAogCXJhdy0+YnVmZmVyID0gKGNoYXIgKikgYWxsb2NfYm9vdG1lbV9sb3coUkFXMzIxNV9CVUZGRVJfU0laRSk7CiAJcmF3LT5pbmJ1ZiA9IChjaGFyICopIGFsbG9jX2Jvb3RtZW1fbG93KFJBVzMyMTVfSU5CVUZfU0laRSk7CiAJcmF3LT5jZGV2ID0gY2RldjsKLQlyYXctPmxvY2sgPSBnZXRfY2N3ZGV2X2xvY2soY2Rldik7CiAJY2Rldi0+ZGV2LmRyaXZlcl9kYXRhID0gcmF3OwogCWNkZXYtPmhhbmRsZXIgPSByYXczMjE1X2lycTsKIApAQCAtMTA2NiwxMCArMTA2NCwxMCBAQAogCiAJcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocmF3LT5mbGFncyAmIFJBVzMyMTVfVEhST1RUTEVEKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCQlyYXctPmZsYWdzICY9IH5SQVczMjE1X1RIUk9UVExFRDsKIAkJcmF3MzIxNV90cnlfaW8ocmF3KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyYXctPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCX0KIH0KIApAQCAtMTA5NiwxMCArMTA5NCwxMCBAQAogCiAJcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocmF3LT5mbGFncyAmIFJBVzMyMTVfU1RPUFBFRCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZShyYXctPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAkJcmF3LT5mbGFncyAmPSB+UkFXMzIxNV9TVE9QUEVEOwogCQlyYXczMjE1X3RyeV9pbyhyYXcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCmluZGV4IDMyMDA0YWEuLmZmYTkyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCkBAIC0xOSw1MiArMTksMTcgQEAKIAogI2luY2x1ZGUgInNjbHAuaCIKIAotCi0jaWZkZWYgQ09ORklHX1NNUAotLyogU2lnbmFsIGNvbXBsZXRpb24gb2Ygc2h1dGRvd24gcHJvY2Vzcy4gQWxsIENQVXMgZXhjZXB0IHRoZSBmaXJzdCB0byBlbnRlcgotICogdGhpcyBmdW5jdGlvbjogZ28gdG8gc3RvcHBlZCBzdGF0ZS4gRmlyc3QgQ1BVOiB3YWl0IHVudGlsIGFsbCBvdGhlcgotICogQ1BVcyBhcmUgaW4gc3RvcHBlZCBvciBjaGVjayBzdG9wIHN0YXRlLiBBZnRlcndhcmRzLCBsb2FkIHNwZWNpYWwgUFNXCi0gKiB0byBpbmRpY2F0ZSBjb21wbGV0aW9uLiAqLwotc3RhdGljIHZvaWQKLWRvX2xvYWRfcXVpZXNjZV9wc3codm9pZCAqIF9fdW51c2VkKQotewotCXN0YXRpYyBhdG9taWNfdCBjcHVpZCA9IEFUT01JQ19JTklUKC0xKTsKLQlwc3dfdCBxdWllc2NlX3BzdzsKLQlpbnQgY3B1OwotCi0JaWYgKGF0b21pY19jbXB4Y2hnKCZjcHVpZCwgLTEsIHNtcF9wcm9jZXNzb3JfaWQoKSkgIT0gLTEpCi0JCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3ApOwotCS8qIFdhaXQgZm9yIGFsbCBvdGhlciBjcHVzIHRvIGVudGVyIHN0b3BwZWQgc3RhdGUgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJCWNvbnRpbnVlOwotCQl3aGlsZSghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQotCQkJY3B1X3JlbGF4KCk7Ci0JfQotCS8qIFF1aWVzY2UgdGhlIGxhc3QgY3B1IHdpdGggdGhlIHNwZWNpYWwgcHN3ICovCi0JcXVpZXNjZV9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19XQUlUOwotCXF1aWVzY2VfcHN3LmFkZHIgPSAweGZmZjsKLQlfX2xvYWRfcHN3KHF1aWVzY2VfcHN3KTsKLX0KLQotLyogU2h1dGRvd24gaGFuZGxlci4gUGVyZm9ybSBzaHV0ZG93biBmdW5jdGlvbiBvbiBhbGwgQ1BVcy4gKi8KLXN0YXRpYyB2b2lkCi1kb19tYWNoaW5lX3F1aWVzY2Uodm9pZCkKLXsKLQlvbl9lYWNoX2NwdShkb19sb2FkX3F1aWVzY2VfcHN3LCBOVUxMLCAwLCAwKTsKLX0KLSNlbHNlCiAvKiBTaHV0ZG93biBoYW5kbGVyLiBTaWduYWwgY29tcGxldGlvbiBvZiBzaHV0ZG93biBieSBsb2FkaW5nIHNwZWNpYWwgUFNXLiAqLwogc3RhdGljIHZvaWQKIGRvX21hY2hpbmVfcXVpZXNjZSh2b2lkKQogewogCXBzd190IHF1aWVzY2VfcHN3OwogCisJc21wX3NlbmRfc3RvcCgpOwogCXF1aWVzY2VfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfV0FJVDsKIAlxdWllc2NlX3Bzdy5hZGRyID0gMHhmZmY7CiAJX19sb2FkX3BzdyhxdWllc2NlX3Bzdyk7CiB9Ci0jZW5kaWYKIAogLyogSGFuZGxlciBmb3IgcXVpZXNjZSBldmVudC4gU3RhcnQgc2h1dGRvd24gcHJvY2VkdXJlLiAqLwogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKaW5kZXggMmQ3OGYwZi4uZGJmYjc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKQEAgLTI1MSw2ICsyNTEsOCBAQAogCQljYyA9IGNpb19jbGVhcihzY2gpOwogCQlpZiAoY2MgPT0gLUVOT0RFVikKIAkJCWdvdG8gb3V0X3VucmVnOworCQkvKiBSZXF1ZXN0IHJldHJ5IG9mIGludGVybmFsIG9wZXJhdGlvbi4gKi8KKwkJZGV2aWNlX3NldF9pbnRyZXRyeShzY2gpOwogCQkvKiBDYWxsIGhhbmRsZXIuICovCiAJCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dGVybWluYXRpb24pCiAJCQlzY2gtPmRyaXZlci0+dGVybWluYXRpb24oJnNjaC0+ZGV2KTsKQEAgLTcxMSw5ICs3MTMsNiBAQAogewogCWludCBjYzsKIAotCWlmICghZGV2aWNlX2lzX29ubGluZShzY2gpKQotCQkvKiBjaW8gY291bGQgYmUgZG9pbmcgSS9PLiAqLwotCQlyZXR1cm4gMDsKIAljYyA9IHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKIAlpZiAoY2MpCiAJCXJldHVybiAwOwpAQCAtNzIyLDYgKzcyMSwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlpZiAoY2lvX2NsZWFyKHNjaCkpIHsKKwkJLyogUmVjaGVjayBkZXZpY2UgaW4gY2FzZSBjbGVhciBmYWlsZWQuICovCisJCXNjaC0+bHBtID0gMDsKKwkJaWYgKGRldmljZV90cmlnZ2VyX3ZlcmlmeShzY2gpICE9IDApIHsKKwkJCWlmKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2gtPnNjaGlkKSkgeworCQkJCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOworCQkJCW5lZWRfcmVzY2FuID0gMTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLworCWRldmljZV9zZXRfaW50cmV0cnkoc2NoKTsKKwkvKiBDYWxsIGhhbmRsZXIuICovCisJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbikKKwkJc2NoLT5kcml2ZXItPnRlcm1pbmF0aW9uKCZzY2gtPmRldik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19zMzkwX3N1YmNoYW5uZWxfdmFyeV9jaHBpZChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBfX3U4IGNocGlkLCBpbnQgb24pCiB7CkBAIC03NDQsMjAgKzc2MywyNiBAQAogCQkJCWRldmljZV90cmlnZ2VyX3JlcHJvYmUoc2NoKTsKIAkJCWVsc2UgaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT52ZXJpZnkpCiAJCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwotCQl9IGVsc2UgewotCQkJc2NoLT5vcG0gJj0gfigweDgwID4+IGNocCk7Ci0JCQlzY2gtPmxwbSAmPSB+KDB4ODAgPj4gY2hwKTsKLQkJCWlmIChjaGVja19mb3JfaW9fb25fcGF0aChzY2gsIGNocCkpCisJCQlicmVhazsKKwkJfQorCQlzY2gtPm9wbSAmPSB+KDB4ODAgPj4gY2hwKTsKKwkJc2NoLT5scG0gJj0gfigweDgwID4+IGNocCk7CisJCWlmIChjaGVja19mb3JfaW9fb25fcGF0aChzY2gsIGNocCkpIHsKKwkJCWlmIChkZXZpY2VfaXNfb25saW5lKHNjaCkpCiAJCQkJLyogUGF0aCB2ZXJpZmljYXRpb24gaXMgZG9uZSBhZnRlciBraWxsaW5nLiAqLwogCQkJCWRldmljZV9raWxsX2lvKHNjaCk7Ci0JCQllbHNlIGlmICghc2NoLT5scG0pIHsKKwkJCWVsc2UKKwkJCQkvKiBLaWxsIGFuZCByZXRyeSBpbnRlcm5hbCBJL08uICovCisJCQkJdGVybWluYXRlX2ludGVybmFsX2lvKHNjaCk7CisJCX0gZWxzZSBpZiAoIXNjaC0+bHBtKSB7CisJCQlpZiAoZGV2aWNlX3RyaWdnZXJfdmVyaWZ5KHNjaCkgIT0gMCkgewogCQkJCWlmIChjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc2NoLT5zY2hpZCkpIHsKIAkJCQkJY3NzX2NsZWFyX3N1YmNoYW5uZWxfc2xvd19saXN0KCk7CiAJCQkJCW5lZWRfcmVzY2FuID0gMTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT52ZXJpZnkpCi0JCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwotCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKKwkJCXNjaC0+ZHJpdmVyLT52ZXJpZnkoJnNjaC0+ZGV2KTsKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaC0+bG9jaywgZmxhZ3MpOwpAQCAtMTQ2NSw0MSArMTQ5MCw2IEBACiAJcmV0dXJuIGRlc2M7CiB9CiAKLXN0YXRpYyBpbnQgcmVzZXRfY2hhbm5lbF9wYXRoKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCkKLXsKLQlpbnQgY2M7Ci0KLQljYyA9IHJjaHAoY2hwLT5pZCk7Ci0Jc3dpdGNoIChjYykgewotCWNhc2UgMDoKLQkJcmV0dXJuIDA7Ci0JY2FzZSAyOgotCQlyZXR1cm4gLUVCVVNZOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfY2hhbm5lbF9wYXRoc19jc3Moc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3MpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IF9fTUFYX0NIUElEOyBpKyspIHsKLQkJaWYgKGNzcy0+Y2hwc1tpXSkKLQkJCXJlc2V0X2NoYW5uZWxfcGF0aChjc3MtPmNocHNbaV0pOwotCX0KLX0KLQotdm9pZCBjaW9fcmVzZXRfY2hhbm5lbF9wYXRocyh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8PSBfX01BWF9DU1NJRDsgaSsrKSB7Ci0JCWlmIChjc3NbaV0gJiYgY3NzW2ldLT52YWxpZCkKLQkJCXJlc2V0X2NoYW5uZWxfcGF0aHNfY3NzKGNzc1tpXSk7Ci0JfQotfQotCiBzdGF0aWMgaW50IF9faW5pdAogY2hzY19hbGxvY19zZWlfYXJlYSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggODkzNmU0Ni4uMjBhZWUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogI2luY2x1ZGUgImFpcnEuaCIKICNpbmNsdWRlICJjaW8uaCIKICNpbmNsdWRlICJjc3MuaCIKQEAgLTI4LDYgKzI5LDcgQEAKICNpbmNsdWRlICJpb2FzbS5oIgogI2luY2x1ZGUgImJsYWNrbGlzdC5oIgogI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgorI2luY2x1ZGUgIi4uL3MzOTBtYWNoLmgiCiAKIGRlYnVnX2luZm9fdCAqY2lvX2RlYnVnX21zZ19pZDsKIGRlYnVnX2luZm9fdCAqY2lvX2RlYnVnX3RyYWNlX2lkOwpAQCAtODQxLDI2ICs4NDMsMTIgQEAKIAlyZXR1cm4gLUVCVVNZOwogfQogCi1zdHJ1Y3Qgc2NoX21hdGNoX2lkIHsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKLQlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZpZDsKLQlpbnQgcmM7Ci19OwotCi1zdGF0aWMgaW50IF9fc2h1dGRvd25fc3ViY2hhbm5lbF9lYXN5X2FuZF9tYXRjaChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCwKLQl2b2lkICpkYXRhKQorc3RhdGljIGludCBfX3NodXRkb3duX3N1YmNoYW5uZWxfZWFzeShzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2NoaWIgc2NoaWI7Ci0Jc3RydWN0IHNjaF9tYXRjaF9pZCAqbWF0Y2hfaWQgPSBkYXRhOwogCiAJaWYgKHN0c2NoX2VycihzY2hpZCwgJnNjaGliKSkKIAkJcmV0dXJuIC1FTlhJTzsKLQlpZiAobWF0Y2hfaWQgJiYgc2NoaWIucG1jdy5kbnYgJiYKLQkJKHNjaGliLnBtY3cuZGV2ID09IG1hdGNoX2lkLT5kZXZpZC5kZXZubykgJiYKLQkJKHNjaGlkLnNzaWQgPT0gbWF0Y2hfaWQtPmRldmlkLnNzaWQpKSB7Ci0JCW1hdGNoX2lkLT5zY2hpZCA9IHNjaGlkOwotCQltYXRjaF9pZC0+cmMgPSAwOwotCX0KIAlpZiAoIXNjaGliLnBtY3cuZW5hKQogCQlyZXR1cm4gMDsKIAlzd2l0Y2goX19kaXNhYmxlX3N1YmNoYW5uZWxfZWFzeShzY2hpZCwgJnNjaGliKSkgewpAQCAtODc2LDI3ICs4NjQsMTExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xlYXJfYWxsX3N1YmNoYW5uZWxzX2FuZF9tYXRjaChzdHJ1Y3QgY2N3X2Rldl9pZCAqZGV2aWQsCi0Jc3RydWN0IHN1YmNoYW5uZWxfaWQgKnNjaGlkKQorc3RhdGljIGF0b21pY190IGNocGlkX3Jlc2V0X2NvdW50OworCitzdGF0aWMgdm9pZCBzMzkwX3Jlc2V0X2NocGlkc19tY2NrX2hhbmRsZXIodm9pZCkKK3sKKwlzdHJ1Y3QgY3J3IGNydzsKKwlzdHJ1Y3QgbWNpICptY2k7CisKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBjaGFubmVsIHJlcG9ydCB3b3JkLiAqLworCW1jaSA9IChzdHJ1Y3QgbWNpICopJlMzOTBfbG93Y29yZS5tY2NrX2ludGVycnVwdGlvbl9jb2RlOworCWlmICghbWNpLT5jcCkKKwkJcmV0dXJuOworCS8qIFByb2Nlc3MgY2hhbm5lbCByZXBvcnQgd29yZHMuICovCisJd2hpbGUgKHN0Y3J3KCZjcncpID09IDApIHsKKwkJLyogQ2hlY2sgZm9yIHJlc3BvbnNlcyB0byBSQ0hQLiAqLworCQlpZiAoY3J3LnNsY3QgJiYgY3J3LnJzYyA9PSBDUldfUlNDX0NQQVRIKQorCQkJYXRvbWljX2RlYygmY2hwaWRfcmVzZXRfY291bnQpOworCX0KK30KKworI2RlZmluZSBSQ0hQX1RJTUVPVVQgKDMwICogVVNFQ19QRVJfU0VDKQorc3RhdGljIHZvaWQgY3NzX3Jlc2V0KHZvaWQpCit7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGltZW91dDsKKworCS8qIFJlc2V0IHN1YmNoYW5uZWxzLiAqLworCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19zaHV0ZG93bl9zdWJjaGFubmVsX2Vhc3ksICBOVUxMKTsKKwkvKiBSZXNldCBjaGFubmVsIHBhdGhzLiAqLworCXMzOTBfcmVzZXRfbWNja19oYW5kbGVyID0gczM5MF9yZXNldF9jaHBpZHNfbWNja19oYW5kbGVyOworCS8qIEVuYWJsZSBjaGFubmVsIHJlcG9ydCBtYWNoaW5lIGNoZWNrcy4gKi8KKwlfX2N0bF9zZXRfYml0KDE0LCAyOCk7CisJLyogVGVtcG9yYXJpbHkgcmVlbmFibGUgbWFjaGluZSBjaGVja3MuICovCisJbG9jYWxfbWNja19lbmFibGUoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IF9fTUFYX0NIUElEOyBpKyspIHsKKwkJcmV0ID0gcmNocChpKTsKKwkJaWYgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAyKSkKKwkJCS8qCisJCQkgKiByY2hwIGVpdGhlciBzdWNjZWVkZWQsIG9yIGFub3RoZXIgcmNocCBpcyBhbHJlYWR5CisJCQkgKiBpbiBwcm9ncmVzcy4gSW4gZWl0aGVyIGNhc2UsIHdlJ2xsIGdldCBhIGNydy4KKwkJCSAqLworCQkJYXRvbWljX2luYygmY2hwaWRfcmVzZXRfY291bnQpOworCX0KKwkvKiBXYWl0IGZvciBtYWNoaW5lIGNoZWNrIGZvciBhbGwgY2hhbm5lbCBwYXRocy4gKi8KKwl0aW1lb3V0ID0gZ2V0X2Nsb2NrKCkgKyAoUkNIUF9USU1FT1VUIDw8IDEyKTsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmNocGlkX3Jlc2V0X2NvdW50KSAhPSAwKSB7CisJCWlmIChnZXRfY2xvY2soKSA+IHRpbWVvdXQpCisJCQlicmVhazsKKwkJY3B1X3JlbGF4KCk7CisJfQorCS8qIERpc2FibGUgbWFjaGluZSBjaGVja3MgYWdhaW4uICovCisJbG9jYWxfbWNja19kaXNhYmxlKCk7CisJLyogRGlzYWJsZSBjaGFubmVsIHJlcG9ydCBtYWNoaW5lIGNoZWNrcy4gKi8KKwlfX2N0bF9jbGVhcl9iaXQoMTQsIDI4KTsKKwlzMzkwX3Jlc2V0X21jY2tfaGFuZGxlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzZXRfY2FsbCBjc3NfcmVzZXRfY2FsbCA9IHsKKwkuZm4gPSBjc3NfcmVzZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2Nzc19yZXNldF9jYWxsKHZvaWQpCit7CisJYXRvbWljX3NldCgmY2hwaWRfcmVzZXRfY291bnQsIDApOworCXJlZ2lzdGVyX3Jlc2V0X2NhbGwoJmNzc19yZXNldF9jYWxsKTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChpbml0X2Nzc19yZXNldF9jYWxsKTsKKworc3RydWN0IHNjaF9tYXRjaF9pZCB7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CisJc3RydWN0IGNjd19kZXZfaWQgZGV2aWQ7CisJaW50IHJjOworfTsKKworc3RhdGljIGludCBfX3JlaXBsX3N1YmNoYW5uZWxfbWF0Y2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNjaGliIHNjaGliOworCXN0cnVjdCBzY2hfbWF0Y2hfaWQgKm1hdGNoX2lkID0gZGF0YTsKKworCWlmIChzdHNjaF9lcnIoc2NoaWQsICZzY2hpYikpCisJCXJldHVybiAtRU5YSU87CisJaWYgKHNjaGliLnBtY3cuZG52ICYmCisJICAgIChzY2hpYi5wbWN3LmRldiA9PSBtYXRjaF9pZC0+ZGV2aWQuZGV2bm8pICYmCisJICAgIChzY2hpZC5zc2lkID09IG1hdGNoX2lkLT5kZXZpZC5zc2lkKSkgeworCQltYXRjaF9pZC0+c2NoaWQgPSBzY2hpZDsKKwkJbWF0Y2hfaWQtPnJjID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlaXBsX2ZpbmRfc2NoaWQoc3RydWN0IGNjd19kZXZfaWQgKmRldmlkLAorCQkJICAgIHN0cnVjdCBzdWJjaGFubmVsX2lkICpzY2hpZCkKIHsKIAlzdHJ1Y3Qgc2NoX21hdGNoX2lkIG1hdGNoX2lkOwogCiAJbWF0Y2hfaWQuZGV2aWQgPSAqZGV2aWQ7CiAJbWF0Y2hfaWQucmMgPSAtRU5PREVWOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JZm9yX2VhY2hfc3ViY2hhbm5lbChfX3NodXRkb3duX3N1YmNoYW5uZWxfZWFzeV9hbmRfbWF0Y2gsICZtYXRjaF9pZCk7CisJZm9yX2VhY2hfc3ViY2hhbm5lbChfX3JlaXBsX3N1YmNoYW5uZWxfbWF0Y2gsICZtYXRjaF9pZCk7CiAJaWYgKG1hdGNoX2lkLnJjID09IDApCiAJCSpzY2hpZCA9IG1hdGNoX2lkLnNjaGlkOwogCXJldHVybiBtYXRjaF9pZC5yYzsKIH0KIAotCi12b2lkIGNsZWFyX2FsbF9zdWJjaGFubmVscyh2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JZm9yX2VhY2hfc3ViY2hhbm5lbChfX3NodXRkb3duX3N1YmNoYW5uZWxfZWFzeV9hbmRfbWF0Y2gsIE5VTEwpOwotfQotCiBleHRlcm4gdm9pZCBkb19yZWlwbF9hc20oX191MzIgc2NoaWQpOwogCiAvKiBNYWtlIHN1cmUgYWxsIHN1YmNoYW5uZWxzIGFyZSBxdWlldCBiZWZvcmUgd2UgcmUtaXBsIGFuIGxwYXIuICovCkBAIC05MDQsOSArOTc2LDkgQEAKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKIAotCWlmIChjbGVhcl9hbGxfc3ViY2hhbm5lbHNfYW5kX21hdGNoKGRldmlkLCAmc2NoaWQpKQorCXMzOTBfcmVzZXRfc3lzdGVtKCk7CisJaWYgKHJlaXBsX2ZpbmRfc2NoaWQoZGV2aWQsICZzY2hpZCkgIT0gMCkKIAkJcGFuaWMoIklQTCBEZXZpY2Ugbm90IGZvdW5kXG4iKTsKLQljaW9fcmVzZXRfY2hhbm5lbF9wYXRocygpOwogCWRvX3JlaXBsX2FzbSgqKChfX3UzMiopJnNjaGlkKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IDRjMmZmODMuLjlmZjA2NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtOTQsNiArOTQsNyBAQAogCQl1bnNpZ25lZCBpbnQgZG9ub3RpZnk6MTsgICAgLyogY2FsbCBub3RpZnkgZnVuY3Rpb24gKi8KIAkJdW5zaWduZWQgaW50IHJlY29nX2RvbmU6MTsgIC8qIGRldi4gcmVjb2cuIGNvbXBsZXRlICovCiAJCXVuc2lnbmVkIGludCBmYWtlX2lyYjoxOyAgICAvKiBkZWxpdmVyIGZha2VkIGlyYiAqLworCQl1bnNpZ25lZCBpbnQgaW50cmV0cnk6MTsgICAgLyogcmV0cnkgaW50ZXJuYWwgb3BlcmF0aW9uICovCiAJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGludHBhcm07CS8qIHVzZXIgaW50ZXJydXB0aW9uIHBhcmFtZXRlciAqLwogCXN0cnVjdCBxZGlvX2lycSAqcWRpb19kYXRhOwpAQCAtMTcxLDYgKzE3Miw4IEBACiAvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB2YXJ5IG9uL29mZi4gKi8KIGludCBkZXZpY2VfaXNfb25saW5lKHN0cnVjdCBzdWJjaGFubmVsICopOwogdm9pZCBkZXZpY2Vfa2lsbF9pbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKK3ZvaWQgZGV2aWNlX3NldF9pbnRyZXRyeShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKK2ludCBkZXZpY2VfdHJpZ2dlcl92ZXJpZnkoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CiAKIC8qIE1hY2hpbmUgY2hlY2sgaGVscGVyIGZ1bmN0aW9uLiAqLwogdm9pZCBkZXZpY2Vfa2lsbF9wZW5kaW5nX3RpbWVyKHN0cnVjdCBzdWJjaGFubmVsICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggMzljOThmOS4uZDNkMzcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC02ODcsOCArNjg3LDIwIEBACiAJY2RldiA9IGRhdGE7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAorCS8qCisJICogaW9fc3ViY2hhbm5lbF9yZWdpc3RlcigpIHdpbGwgYWxzbyBiZSBjYWxsZWQgYWZ0ZXIgZGV2aWNlCisJICogcmVjb2duaXRpb24gaGFzIGJlZW4gZG9uZSBmb3IgYSBib3hlZCBkZXZpY2UgKHdoaWNoIHdpbGwgYWxyZWFkeQorCSAqIGJlIHJlZ2lzdGVyZWQpLiBXZSBuZWVkIHRvIHJlcHJvYmUgc2luY2Ugd2UgbWF5IG5vdyBoYXZlIHNlbnNlIGlkCisJICogaW5mb3JtYXRpb24uCisJICovCiAJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmNkZXYtPmRldi5rbm9kZV9wYXJlbnQpKSB7Ci0JCWJ1c19yZXNjYW5fZGV2aWNlcygmY2N3X2J1c190eXBlKTsKKwkJaWYgKCFjZGV2LT5kcnYpIHsKKwkJCXJldCA9IGRldmljZV9yZXByb2JlKCZjZGV2LT5kZXYpOworCQkJaWYgKHJldCkKKwkJCQkvKiBXZSBjYW4ndCBkbyBtdWNoIGhlcmUuICovCisJCQkJZGV2X2luZm8oJmNkZXYtPmRldiwgImRldmljZV9yZXByb2JlKCkgcmV0dXJuZWQiCisJCQkJCSAiICVkXG4iLCByZXQpOworCQl9CiAJCWdvdG8gb3V0OwogCX0KIAkvKiBtYWtlIGl0IGtub3duIHRvIHRoZSBzeXN0ZW0gKi8KQEAgLTk0OCw2ICs5NjAsOSBAQAogCWNkZXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCWlmICghY2RldikKIAkJcmV0dXJuOworCS8qIEludGVybmFsIEkvTyB3aWxsIGJlIHJldHJpZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyLiAqLworCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkKKwkJcmV0dXJuOwogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX0NMRUFSX1ZFUklGWTsKIAlpZiAoY2Rldi0+aGFuZGxlcikKIAkJY2Rldi0+aGFuZGxlcihjZGV2LCBjZGV2LT5wcml2YXRlLT5pbnRwYXJtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYwppbmRleCBkZTNkMDg1Li4wOWM3NjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYwpAQCAtNTksNiArNTksMjcgQEAKIAljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9ESVNDT05ORUNURUQ7CiB9CiAKK3ZvaWQgZGV2aWNlX3NldF9pbnRyZXRyeShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OworCisJY2RldiA9IHNjaC0+ZGV2LmRyaXZlcl9kYXRhOworCWlmICghY2RldikKKwkJcmV0dXJuOworCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMTsKK30KKworaW50IGRldmljZV90cmlnZ2VyX3ZlcmlmeShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OworCisJY2RldiA9IHNjaC0+ZGV2LmRyaXZlcl9kYXRhOworCWlmICghY2RldiB8fCAhY2Rldi0+b25saW5lKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9WRVJJRlkpOworCXJldHVybiAwOworfQorCiAvKgogICogVGltZW91dCBmdW5jdGlvbi4gSXQganVzdCB0cmlnZ2VycyBhIERFVl9FVkVOVF9USU1FT1VULgogICovCkBAIC04OTMsNiArOTE0LDEyIEBACiAJICogaGFkIGtpbGxlZCB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KIAkgKi8KIAlpZiAoaXJiLT5zY3N3LmZjdGwgJiAoU0NTV19GQ1RMX0NMRUFSX0ZVTkMgfCBTQ1NXX0ZDVExfSEFMVF9GVU5DKSkgeworCQkvKiBSZXRyeSBCYXNpYyBTZW5zZSBpZiByZXF1ZXN0ZWQuICovCisJCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgeworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOworCQkJY2N3X2RldmljZV9kb19zZW5zZShjZGV2LCBpcmIpOworCQkJcmV0dXJuOworCQl9CiAJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvc2Vuc2UgPSAwOwogCQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKIAkJY2N3X2RldmljZV9hY2N1bXVsYXRlX2lyYihjZGV2LCBpcmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2lkLmMKaW5kZXggYTc0Nzg1Yi4uZjE3Mjc1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCkBAIC0xOTEsNiArMTkxLDggQEAKIAkJaWYgKChzY2gtPm9wbSAmIGNkZXYtPnByaXZhdGUtPmltYXNrKSAhPSAwICYmCiAJCSAgICBjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7CiAJCQljZGV2LT5wcml2YXRlLT5pcmV0cnktLTsKKwkJCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCisJCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7CiAJCQlyZXQgPSBjaW9fc3RhcnQgKHNjaCwgY2Rldi0+cHJpdmF0ZS0+aWNjd3MsCiAJCQkJCSBjZGV2LT5wcml2YXRlLT5pbWFzayk7CiAJCQkvKiByZXQgaXMgMCwgLUVCVVNZLCAtRUFDQ0VTIG9yIC1FTk9ERVYgKi8KQEAgLTIzNyw4ICsyMzksMTQgQEAKIAkJcmV0dXJuIDA7IC8qIFN1Y2Nlc3MgKi8KIAl9CiAJLyogQ2hlY2sgdGhlIGVycm9yIGNhc2VzLiAqLwotCWlmIChpcmItPnNjc3cuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKQorCWlmIChpcmItPnNjc3cuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKSB7CisJCS8qIFJldHJ5IFNlbnNlIElEIGlmIHJlcXVlc3RlZC4gKi8KKwkJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5KSB7CisJCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQogCQlyZXR1cm4gLUVUSU1FOworCX0KIAlpZiAoaXJiLT5lc3cuZXN3MC5lcncuY29ucyAmJiAoaXJiLT5lY3dbMF0gJiBTTlMwX0NNRF9SRUpFQ1QpKSB7CiAJCS8qCiAJCSAqIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHRoZSBTZW5zZUlECmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMKaW5kZXggMjk3NWNlOC4uY2IxODc5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYwpAQCAtNzEsNiArNzEsOCBAQAogCQljY3ctPmNkYSA9IChfX3UzMikgX19wYSAoJmNkZXYtPnByaXZhdGUtPnBnaWRbaV0pOwogCQlpZiAoY2Rldi0+cHJpdmF0ZS0+aXJldHJ5ID4gMCkgewogCQkJY2Rldi0+cHJpdmF0ZS0+aXJldHJ5LS07CisJCQkvKiBSZXNldCBpbnRlcm5hbCByZXRyeSBpbmRpY2F0aW9uLiAqLworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOwogCQkJcmV0ID0gY2lvX3N0YXJ0IChzY2gsIGNkZXYtPnByaXZhdGUtPmljY3dzLCAKIAkJCQkJIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKIAkJCS8qIHJldCBpcyAwLCAtRUJVU1ksIC1FQUNDRVMgb3IgLUVOT0RFViAqLwpAQCAtMTIyLDggKzEyNCwxNCBAQAogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlpcmIgPSAmY2Rldi0+cHJpdmF0ZS0+aXJiOwotCWlmIChpcmItPnNjc3cuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKQorCWlmIChpcmItPnNjc3cuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKSB7CisJCS8qIFJldHJ5IFNlbnNlIFBHSUQgaWYgcmVxdWVzdGVkLiAqLworCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKKwkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CiAJCXJldHVybiAtRVRJTUU7CisJfQogCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zICYmCiAJICAgIChpcmItPmVjd1swXSYoU05TMF9DTURfUkVKRUNUfFNOUzBfSU5URVJWRU5USU9OX1JFUSkpKSB7CiAJCS8qCkBAIC0yNTMsNiArMjYxLDggQEAKIAlyZXQgPSAtRUFDQ0VTOwogCWlmIChjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7CiAJCWNkZXYtPnByaXZhdGUtPmlyZXRyeS0tOworCQkvKiBSZXNldCBpbnRlcm5hbCByZXRyeSBpbmRpY2F0aW9uLiAqLworCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7CiAJCXJldCA9IGNpb19zdGFydCAoc2NoLCBjZGV2LT5wcml2YXRlLT5pY2N3cywKIAkJCQkgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwogCQkvKiBXZSBleHBlY3QgYW4gaW50ZXJydXB0IGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBidXN5CkBAIC0yOTMsNiArMzAzLDggQEAKIAlyZXQgPSAtRUFDQ0VTOwogCWlmIChjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7CiAJCWNkZXYtPnByaXZhdGUtPmlyZXRyeS0tOworCQkvKiBSZXNldCBpbnRlcm5hbCByZXRyeSBpbmRpY2F0aW9uLiAqLworCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7CiAJCXJldCA9IGNpb19zdGFydCAoc2NoLCBjZGV2LT5wcml2YXRlLT5pY2N3cywKIAkJCQkgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwogCQkvKiBXZSBleHBlY3QgYW4gaW50ZXJydXB0IGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBidXN5CkBAIC0zMjEsOCArMzMzLDE0IEBACiAKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWlyYiA9ICZjZGV2LT5wcml2YXRlLT5pcmI7Ci0JaWYgKGlyYi0+c2Nzdy5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpCisJaWYgKGlyYi0+c2Nzdy5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpIHsKKwkJLyogUmV0cnkgU2V0IFBHSUQgaWYgcmVxdWVzdGVkLiAqLworCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKKwkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CiAJCXJldHVybiAtRVRJTUU7CisJfQogCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zKSB7CiAJCWlmIChpcmItPmVjd1swXSAmIFNOUzBfQ01EX1JFSkVDVCkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTM2MCw4ICszNzgsMTQgQEAKIAogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJaXJiID0gJmNkZXYtPnByaXZhdGUtPmlyYjsKLQlpZiAoaXJiLT5zY3N3LmZjdGwgJiAoU0NTV19GQ1RMX0hBTFRfRlVOQyB8IFNDU1dfRkNUTF9DTEVBUl9GVU5DKSkKKwlpZiAoaXJiLT5zY3N3LmZjdGwgJiAoU0NTV19GQ1RMX0hBTFRfRlVOQyB8IFNDU1dfRkNUTF9DTEVBUl9GVU5DKSkgeworCQkvKiBSZXRyeSBOT1AgaWYgcmVxdWVzdGVkLiAqLworCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKKwkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CiAJCXJldHVybiAtRVRJTUU7CisJfQogCWlmIChpcmItPnNjc3cuY2MgPT0gMykgewogCQlDSU9fTVNHX0VWRU5UKDIsICJOT1AgLSBEZXZpY2UgJTA0eCBvbiBTdWJjaGFubmVsIDAuJXguJTA0eCwiCiAJCQkgICAgICAiIGxwbSAlMDJYLCBiZWNhbWUgJ25vdCBvcGVyYXRpb25hbCdcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCmluZGV4IDNmN2NiY2UuLmJkY2Y5MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCkBAIC0zMTksNiArMzE5LDkgQEAKIAlzY2gtPnNlbnNlX2Njdy5jb3VudCA9IFNFTlNFX01BWF9DT1VOVDsKIAlzY2gtPnNlbnNlX2Njdy5mbGFncyA9IENDV19GTEFHX1NMSTsKIAorCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCisJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOworCiAJcmV0dXJuIGNpb19zdGFydCAoc2NoLCAmc2NoLT5zZW5zZV9jY3csIDB4ZmYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5jCmluZGV4IDQ3NmFhMWQuLjhkNWZhMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5jCkBAIC00ODEsNyArNDgxLDcgQEAKICAgICAgICB1bnNpZ25lZCBjaGFyIHN0YXRlID0gMDsKICAgICAgICBzdHJ1Y3QgcWRpb19pcnEgKmlycSA9IChzdHJ1Y3QgcWRpb19pcnEgKikgcS0+aXJxX3B0cjsKIAotCWlmICghYXRvbWljX3N3YXAoJnEtPnBvbGxpbmcsMCkpIAorCWlmICghYXRvbWljX3hjaGcoJnEtPnBvbGxpbmcsMCkpCiAJCXJldHVybiAxOwogCiAJUURJT19EQkZfVEVYVDQoMCx0cmFjZSwic3RvcHBvbGwiKTsKQEAgLTE5NjQsOCArMTk2NCw4IEBACiAJCVFESU9fREJGX0hFWDAoMCxzZW5zZSxpcmIsUURJT19EQkZfU0VOU0VfTEVOKTsKIAogCQlRRElPX1BSSU5UX1dBUk4oInNlbnNlIGRhdGEgYXZhaWxhYmxlIG9uIHFkaW8gY2hhbm5lbC5cbiIpOwotCQlIRVhEVU1QMTYoV0FSTiwiaXJiOiAiLGlyYik7Ci0JCUhFWERVTVAxNihXQVJOLCJzZW5zZSBkYXRhOiAiLGlyYi0+ZWN3KTsKKwkJUURJT19IRVhEVU1QMTYoV0FSTiwiaXJiOiAiLGlyYik7CisJCVFESU9fSEVYRFVNUDE2KFdBUk4sInNlbnNlIGRhdGE6ICIsaXJiLT5lY3cpOwogCX0KIAkJCiB9CkBAIC0zNDI1LDcgKzM0MjUsNyBAQAogCQogCWlmICgodXNlZF9lbGVtZW50cytjb3VudD09UURJT19NQVhfQlVGRkVSU19QRVJfUSkmJgogCSAgICAoY2FsbGZsYWdzJlFESU9fRkxBR19VTkRFUl9JTlRFUlJVUFQpKQotCQlhdG9taWNfc3dhcCgmcS0+cG9sbGluZywwKTsKKwkJYXRvbWljX3hjaGcoJnEtPnBvbGxpbmcsMCk7CiAJCiAJaWYgKHVzZWRfZWxlbWVudHMpIAogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCmluZGV4IDQ5YmI5ZTMuLjQyOTI3YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCkBAIC0yMzYsNyArMjM2LDcgQEAKICNkZWZpbmUgUURJT19QUklOVF9FTUVSRyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZSBIRVhEVU1QMTYoaW1wb3J0YW5jZSxoZWFkZXIscHRyKSBcCisjZGVmaW5lIFFESU9fSEVYRFVNUDE2KGltcG9ydGFuY2UsaGVhZGVyLHB0cikgXAogUURJT19QUklOVF8jI2ltcG9ydGFuY2UoaGVhZGVyICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAiIFwKIAkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAiIFwKIAkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCooKChjaGFyKilwdHIpKSwgXApAQCAtNDI5LDggKzQyOSw2IEBACiB9OwogI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KIAotI2RlZmluZSBhdG9taWNfc3dhcChhLGIpIHhjaGcoKGludCopYS5jb3VudGVyLGIpCi0KIC8qIHVubGlrZWx5IGFzIHRoZSBsYXRlciB0aGUgYmV0dGVyICovCiAjZGVmaW5lIFNZTkNfTUVNT1JZIGlmICh1bmxpa2VseShxLT5zaWdhX3N5bmMpKSBxZGlvX3NpZ2Ffc3luY19xKHEpCiAjZGVmaW5lIFNZTkNfTUVNT1JZX0FMTCBpZiAodW5saWtlbHkocS0+c2lnYV9zeW5jKSkgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKaW5kZXggNzlkODljMy4uNmE1NDMzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCkBAIC00MzEsNyArNDMxLDE1IEBACiAJCQkgICBhcF9kZXYtPmRldmljZV90eXBlKTsKIAlpZiAoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZW52cFsxXSA9IDA7CisJYnVmZmVyICs9IGxlbmd0aDsKKwlidWZmZXJfc2l6ZSAtPSBsZW5ndGg7CisJLyogQWRkIE1PREFMSUFTPSAqLworCWVudnBbMV0gPSBidWZmZXI7CisJbGVuZ3RoID0gc2NucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJNT0RBTElBUz1hcDp0JTAyWCIsCisJCQkgICBhcF9kZXYtPmRldmljZV90eXBlKTsKKwlpZiAoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZW52cFsyXSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmgKaW5kZXggOTY5YmU0Ni4uMWVlOWE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgQ0xBV19DT01QTEVURSAgICAgICAgICAgMHhmZiAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgaS9vIGNvbXBsZXRlZCAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgQ0xBVyBjb250cm9sIGNvbWFuZCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgIENMQVcgY29udHJvbCBjb21tYW5kIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2RlZmluZSBTWVNURU1fVkFMSURBVEVfUkVRVUVTVCAgIDB4MDEgIC8qIFN5c3RlbSBWYWxpZGF0ZSByZXF1ZXN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwppbmRleCAxNmFjNjhjLi4wOGQ0ZTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKQEAgLTU0LDYgKzU0LDggQEAKICNlcnJvciBDYW5ub3QgY29tcGlsZSBsY3MuYyB3aXRob3V0IHNvbWUgbmV0IGRldmljZXMgc3dpdGNoZWQgb24uCiAjZW5kaWYKIAorI2RlZmluZSBQUklOVEtfSEVBREVSCQkiIGxjczogIgorCiAvKioKICAqIGluaXRpYWxpemF0aW9uIHN0cmluZyBmb3Igb3V0cHV0CiAgKi8KQEAgLTEyMCw3ICsxMjIsNyBAQAogCQkJa3phbGxvYyhMQ1NfSU9CVUZGRVJTSVpFLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CiAJCWlmIChjaGFubmVsLT5pb2JbY250XS5kYXRhID09IE5VTEwpCiAJCQlicmVhazsKLQkJY2hhbm5lbC0+aW9iW2NudF0uc3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CisJCWNoYW5uZWwtPmlvYltjbnRdLnN0YXRlID0gTENTX0JVRl9TVEFURV9FTVBUWTsKIAl9CiAJaWYgKGNudCA8IExDU19OVU1fQlVGRlMpIHsKIAkJLyogTm90IGFsbCBpbyBidWZmZXJzIGNvdWxkIGJlIGFsbG9jYXRlZC4gKi8KQEAgLTIzNiw3ICsyMzgsNyBAQAogCQkoKHN0cnVjdCBsY3NfaGVhZGVyICopCiAJCSBjYXJkLT5yZWFkLmlvYltjbnRdLmRhdGEpLT5vZmZzZXQgPSBMQ1NfSUxMRUdBTF9PRkZTRVQ7CiAJCWNhcmQtPnJlYWQuaW9iW2NudF0uY2FsbGJhY2sgPSBsY3NfZ2V0X2ZyYW1lc19jYjsKLQkJY2FyZC0+cmVhZC5pb2JbY250XS5zdGF0ZSA9IEJVRl9TVEFURV9SRUFEWTsKKwkJY2FyZC0+cmVhZC5pb2JbY250XS5zdGF0ZSA9IExDU19CVUZfU1RBVEVfUkVBRFk7CiAJCWNhcmQtPnJlYWQuaW9iW2NudF0uY291bnQgPSBMQ1NfSU9CVUZGRVJTSVpFOwogCX0KIAljYXJkLT5yZWFkLmNjd3NbMF0uZmxhZ3MgJj0gfkNDV19GTEFHX1BDSTsKQEAgLTI0Nyw3ICsyNDksNyBAQAogCWNhcmQtPnJlYWQuY2N3c1tMQ1NfTlVNX0JVRkZTXS5jZGEgPQogCQkoX191MzIpIF9fcGEoY2FyZC0+cmVhZC5jY3dzKTsKIAkvKiBTZXRnIGluaXRpYWwgc3RhdGUgb2YgdGhlIHJlYWQgY2hhbm5lbC4gKi8KLQljYXJkLT5yZWFkLnN0YXRlID0gQ0hfU1RBVEVfSU5JVDsKKwljYXJkLT5yZWFkLnN0YXRlID0gTENTX0NIX1NUQVRFX0lOSVQ7CiAKIAljYXJkLT5yZWFkLmlvX2lkeCA9IDA7CiAJY2FyZC0+cmVhZC5idWZfaWR4ID0gMDsKQEAgLTI5NCw3ICsyOTYsNyBAQAogCWNhcmQtPndyaXRlLmNjd3NbTENTX05VTV9CVUZGU10uY2RhID0KIAkJKF9fdTMyKSBfX3BhKGNhcmQtPndyaXRlLmNjd3MpOwogCS8qIFNldCBpbml0aWFsIHN0YXRlIG9mIHRoZSB3cml0ZSBjaGFubmVsLiAqLwotCWNhcmQtPnJlYWQuc3RhdGUgPSBDSF9TVEFURV9JTklUOworCWNhcmQtPnJlYWQuc3RhdGUgPSBMQ1NfQ0hfU1RBVEVfSU5JVDsKIAogCWNhcmQtPndyaXRlLmlvX2lkeCA9IDA7CiAJY2FyZC0+d3JpdGUuYnVmX2lkeCA9IDA7CkBAIC00OTYsNyArNDk4LDcgQEAKIAkJCSAgICAgIGNoYW5uZWwtPmNjd3MgKyBjaGFubmVsLT5pb19pZHgsIDAsIDAsCiAJCQkgICAgICBET0lPX0RFTllfUFJFRkVUQ0ggfCBET0lPX0FMTE9XX1NVU1BFTkQpOwogCWlmIChyYyA9PSAwKQotCQljaGFubmVsLT5zdGF0ZSA9IENIX1NUQVRFX1JVTk5JTkc7CisJCWNoYW5uZWwtPnN0YXRlID0gTENTX0NIX1NUQVRFX1JVTk5JTkc7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOwogCWlmIChyYykgewogCQlMQ1NfREJGX1RFWFRfKDQsdHJhY2UsImVzc2glcyIsIGNoYW5uZWwtPmNjd2Rldi0+ZGV2LmJ1c19pZCk7CkBAIC01MjAsOCArNTIyLDggQEAKIAkJTENTX0RCRl9URVhUXyg0LHRyYWNlLCJlY3NjJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOwogCQlyZXR1cm4gcmM7CiAJfQotCXdhaXRfZXZlbnQoY2hhbm5lbC0+d2FpdF9xLCAoY2hhbm5lbC0+c3RhdGUgPT0gQ0hfU1RBVEVfQ0xFQVJFRCkpOwotCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfU1RPUFBFRDsKKwl3YWl0X2V2ZW50KGNoYW5uZWwtPndhaXRfcSwgKGNoYW5uZWwtPnN0YXRlID09IExDU19DSF9TVEFURV9DTEVBUkVEKSk7CisJY2hhbm5lbC0+c3RhdGUgPSBMQ1NfQ0hfU1RBVEVfU1RPUFBFRDsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTUzNSwxMSArNTM3LDExIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM7CiAKLQlpZiAoY2hhbm5lbC0+c3RhdGUgPT0gQ0hfU1RBVEVfU1RPUFBFRCkKKwlpZiAoY2hhbm5lbC0+c3RhdGUgPT0gTENTX0NIX1NUQVRFX1NUT1BQRUQpCiAJCXJldHVybiAwOwogCUxDU19EQkZfVEVYVCg0LHRyYWNlLCJoYWx0c2NoIik7CiAJTENTX0RCRl9URVhUXyg0LHRyYWNlLCIlcyIsIGNoYW5uZWwtPmNjd2Rldi0+ZGV2LmJ1c19pZCk7Ci0JY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9JTklUOworCWNoYW5uZWwtPnN0YXRlID0gTENTX0NIX1NUQVRFX0lOSVQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKIAlyYyA9IGNjd19kZXZpY2VfaGFsdChjaGFubmVsLT5jY3dkZXYsIChhZGRyX3QpIGNoYW5uZWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKQEAgLTU0OCw3ICs1NTAsNyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCS8qIEFzeW5jaHJvbm91cyBoYWx0IGluaXRpYWx0ZWQuIFdhaXQgZm9yIGl0cyBjb21wbGV0aW9uLiAqLwotCXdhaXRfZXZlbnQoY2hhbm5lbC0+d2FpdF9xLCAoY2hhbm5lbC0+c3RhdGUgPT0gQ0hfU1RBVEVfSEFMVEVEKSk7CisJd2FpdF9ldmVudChjaGFubmVsLT53YWl0X3EsIChjaGFubmVsLT5zdGF0ZSA9PSBMQ1NfQ0hfU1RBVEVfSEFMVEVEKSk7CiAJbGNzX2NsZWFyX2NoYW5uZWwoY2hhbm5lbCk7CiAJcmV0dXJuIDA7CiB9CkBAIC01OTYsOCArNTk4LDggQEAKIAlMQ1NfREJGX1RFWFQoNSwgdHJhY2UsICJfZ2V0YnVmZiIpOwogCWluZGV4ID0gY2hhbm5lbC0+aW9faWR4OwogCWRvIHsKLQkJaWYgKGNoYW5uZWwtPmlvYltpbmRleF0uc3RhdGUgPT0gQlVGX1NUQVRFX0VNUFRZKSB7Ci0JCQljaGFubmVsLT5pb2JbaW5kZXhdLnN0YXRlID0gQlVGX1NUQVRFX0xPQ0tFRDsKKwkJaWYgKGNoYW5uZWwtPmlvYltpbmRleF0uc3RhdGUgPT0gTENTX0JVRl9TVEFURV9FTVBUWSkgeworCQkJY2hhbm5lbC0+aW9iW2luZGV4XS5zdGF0ZSA9IExDU19CVUZfU1RBVEVfTE9DS0VEOwogCQkJcmV0dXJuIGNoYW5uZWwtPmlvYiArIGluZGV4OwogCQl9CiAJCWluZGV4ID0gKGluZGV4ICsgMSkgJiAoTENTX05VTV9CVUZGUyAtIDEpOwpAQCAtNjI2LDcgKzYyOCw3IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKGNoYW5uZWwtPnN0YXRlICE9IENIX1NUQVRFX1NVU1BFTkRFRCkKKwlpZiAoY2hhbm5lbC0+c3RhdGUgIT0gTENTX0NIX1NUQVRFX1NVU1BFTkRFRCkKIAkJcmV0dXJuIDA7CiAJaWYgKGNoYW5uZWwtPmNjd3NbY2hhbm5lbC0+aW9faWR4XS5mbGFncyAmIENDV19GTEFHX1NVU1BFTkQpCiAJCXJldHVybiAwOwpAQCAtNjM2LDcgKzYzOCw3IEBACiAJCUxDU19EQkZfVEVYVF8oNCwgdHJhY2UsICJlcnNjJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOwogCQlQUklOVF9FUlIoIkVycm9yIGluIGxjc19yZXN1bWVfY2hhbm5lbDogcmM9JWRcbiIscmMpOwogCX0gZWxzZQotCQljaGFubmVsLT5zdGF0ZSA9IENIX1NUQVRFX1JVTk5JTkc7CisJCWNoYW5uZWwtPnN0YXRlID0gTENTX0NIX1NUQVRFX1JVTk5JTkc7CiAJcmV0dXJuIHJjOwogCiB9CkBAIC02NzAsMTAgKzY3MiwxMCBAQAogCWludCBpbmRleCwgcmM7CiAKIAlMQ1NfREJGX1RFWFQoNSwgdHJhY2UsICJyZHlidWZmIik7Ci0JQlVHX09OKGJ1ZmZlci0+c3RhdGUgIT0gQlVGX1NUQVRFX0xPQ0tFRCAmJgotCSAgICAgICBidWZmZXItPnN0YXRlICE9IEJVRl9TVEFURV9QUk9DRVNTRUQpOworCUJVR19PTihidWZmZXItPnN0YXRlICE9IExDU19CVUZfU1RBVEVfTE9DS0VEICYmCisJICAgICAgIGJ1ZmZlci0+c3RhdGUgIT0gTENTX0JVRl9TVEFURV9QUk9DRVNTRUQpOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7Ci0JYnVmZmVyLT5zdGF0ZSA9IEJVRl9TVEFURV9SRUFEWTsKKwlidWZmZXItPnN0YXRlID0gTENTX0JVRl9TVEFURV9SRUFEWTsKIAlpbmRleCA9IGJ1ZmZlciAtIGNoYW5uZWwtPmlvYjsKIAkvKiBTZXQgbGVuZ3RoLiAqLwogCWNoYW5uZWwtPmNjd3NbaW5kZXhdLmNvdW50ID0gYnVmZmVyLT5jb3VudDsKQEAgLTY5NSw4ICs2OTcsOCBAQAogCWludCBpbmRleCwgcHJldiwgbmV4dDsKIAogCUxDU19EQkZfVEVYVCg1LCB0cmFjZSwgInByY3NidWZmIik7Ci0JQlVHX09OKGJ1ZmZlci0+c3RhdGUgIT0gQlVGX1NUQVRFX1JFQURZKTsKLQlidWZmZXItPnN0YXRlID0gQlVGX1NUQVRFX1BST0NFU1NFRDsKKwlCVUdfT04oYnVmZmVyLT5zdGF0ZSAhPSBMQ1NfQlVGX1NUQVRFX1JFQURZKTsKKwlidWZmZXItPnN0YXRlID0gTENTX0JVRl9TVEFURV9QUk9DRVNTRUQ7CiAJaW5kZXggPSBidWZmZXIgLSBjaGFubmVsLT5pb2I7CiAJcHJldiA9IChpbmRleCAtIDEpICYgKExDU19OVU1fQlVGRlMgLSAxKTsKIAluZXh0ID0gKGluZGV4ICsgMSkgJiAoTENTX05VTV9CVUZGUyAtIDEpOwpAQCAtNzA0LDcgKzcwNiw3IEBACiAJY2hhbm5lbC0+Y2N3c1tpbmRleF0uZmxhZ3MgfD0gQ0NXX0ZMQUdfU1VTUEVORDsKIAljaGFubmVsLT5jY3dzW2luZGV4XS5mbGFncyAmPSB+Q0NXX0ZMQUdfUENJOwogCS8qIENoZWNrIHRoZSBzdXNwZW5kIGJpdCBvZiB0aGUgcHJldmlvdXMgYnVmZmVyLiAqLwotCWlmIChjaGFubmVsLT5pb2JbcHJldl0uc3RhdGUgPT0gQlVGX1NUQVRFX1JFQURZKSB7CisJaWYgKGNoYW5uZWwtPmlvYltwcmV2XS5zdGF0ZSA9PSBMQ1NfQlVGX1NUQVRFX1JFQURZKSB7CiAJCS8qCiAJCSAqIFByZXZpb3VzIGJ1ZmZlciBpcyBpbiBzdGF0ZSByZWFkeS4gSXQgbWlnaHQgaGF2ZQogCQkgKiBoYXBwZW5lZCBpbiBsY3NfcmVhZHlfYnVmZmVyIHRoYXQgdGhlIHN1c3BlbmQgYml0CkBAIC03MjcsMTAgKzcyOSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlMQ1NfREJGX1RFWFQoNSwgdHJhY2UsICJyZWxidWZmIik7Ci0JQlVHX09OKGJ1ZmZlci0+c3RhdGUgIT0gQlVGX1NUQVRFX0xPQ0tFRCAmJgotCSAgICAgICBidWZmZXItPnN0YXRlICE9IEJVRl9TVEFURV9QUk9DRVNTRUQpOworCUJVR19PTihidWZmZXItPnN0YXRlICE9IExDU19CVUZfU1RBVEVfTE9DS0VEICYmCisJICAgICAgIGJ1ZmZlci0+c3RhdGUgIT0gTENTX0JVRl9TVEFURV9QUk9DRVNTRUQpOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7Ci0JYnVmZmVyLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsKKwlidWZmZXItPnN0YXRlID0gTENTX0JVRl9TVEFURV9FTVBUWTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CiB9CiAKQEAgLTExNDcsNyArMTE0OSw3IEBACiAgKiBnZXQgbWFjIGFkZHJlc3MgZm9yIHRoZSByZWxldmFudCBNdWx0aWNhc3QgYWRkcmVzcwogICovCiBzdGF0aWMgdm9pZAotbGNzX2dldF9tYWNfZm9yX2lwbShfX3UzMiBpcG0sIGNoYXIgKm1hYywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2xjc19nZXRfbWFjX2Zvcl9pcG0oX19iZTMyIGlwbSwgY2hhciAqbWFjLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCUxDU19EQkZfVEVYVCg0LHRyYWNlLCAiZ2V0bWFjIik7CiAJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikKQEAgLTEyNjQsNyArMTI2Niw3IEBACiAJbmV0aWZfY2Fycmllcl9vZmYoY2FyZC0+ZGV2KTsKIAluZXRpZl90eF9kaXNhYmxlKGNhcmQtPmRldik7CiAJd2FpdF9ldmVudChjYXJkLT53cml0ZS53YWl0X3EsCi0JCQkoY2FyZC0+d3JpdGUuc3RhdGUgIT0gQ0hfU1RBVEVfUlVOTklORykpOworCQkJKGNhcmQtPndyaXRlLnN0YXRlICE9IExDU19DSF9TVEFURV9SVU5OSU5HKSk7CiAJbGNzX2ZpeF9tdWx0aWNhc3RfbGlzdChjYXJkKTsKIAlpZiAoY2FyZC0+c3RhdGUgPT0gREVWX1NUQVRFX1VQKSB7CiAJCW5ldGlmX2NhcnJpZXJfb24oY2FyZC0+ZGV2KTsKQEAgLTE0MDQsNyArMTQwNiw3IEBACiAJCX0KIAl9CiAJLyogSG93IGZhciBpbiB0aGUgY2N3IGNoYWluIGhhdmUgd2UgcHJvY2Vzc2VkPyAqLwotCWlmICgoY2hhbm5lbC0+c3RhdGUgIT0gQ0hfU1RBVEVfSU5JVCkgJiYKKwlpZiAoKGNoYW5uZWwtPnN0YXRlICE9IExDU19DSF9TVEFURV9JTklUKSAmJgogCSAgICAoaXJiLT5zY3N3LmZjdGwgJiBTQ1NXX0ZDVExfU1RBUlRfRlVOQykpIHsKIAkJaW5kZXggPSAoc3RydWN0IGNjdzEgKikgX192YSgoYWRkcl90KSBpcmItPnNjc3cuY3BhKQogCQkJLSBjaGFubmVsLT5jY3dzOwpAQCAtMTQyNCwyMCArMTQyNiwyMCBAQAogCSAgICAoaXJiLT5zY3N3LmRzdGF0ICYgREVWX1NUQVRfQ0hOX0VORCkgfHwKIAkgICAgKGlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX1VOSVRfQ0hFQ0spKQogCQkvKiBNYXJrIGNoYW5uZWwgYXMgc3RvcHBlZC4gKi8KLQkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9TVE9QUEVEOworCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9TVE9QUEVEOwogCWVsc2UgaWYgKGlyYi0+c2Nzdy5hY3RsICYgU0NTV19BQ1RMX1NVU1BFTkRFRCkKIAkJLyogQ0NXIGV4ZWN1dGlvbiBzdG9wcGVkIG9uIGEgc3VzcGVuZCBiaXQuICovCi0JCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfU1VTUEVOREVEOworCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9TVVNQRU5ERUQ7CiAJaWYgKGlyYi0+c2Nzdy5mY3RsICYgU0NTV19GQ1RMX0hBTFRfRlVOQykgewogCQlpZiAoaXJiLT5zY3N3LmNjICE9IDApIHsKIAkJCWNjd19kZXZpY2VfaGFsdChjaGFubmVsLT5jY3dkZXYsIChhZGRyX3QpIGNoYW5uZWwpOwogCQkJcmV0dXJuOwogCQl9CiAJCS8qIFRoZSBjaGFubmVsIGhhcyBiZWVuIHN0b3BwZWQgYnkgaGFsdF9JTy4gKi8KLQkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9IQUxURUQ7CisJCWNoYW5uZWwtPnN0YXRlID0gTENTX0NIX1NUQVRFX0hBTFRFRDsKIAl9CiAJaWYgKGlyYi0+c2Nzdy5mY3RsICYgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpIHsKLQkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9DTEVBUkVEOworCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9DTEVBUkVEOwogCX0KIAkvKiBEbyB0aGUgcmVzdCBpbiB0aGUgdGFza2xldC4gKi8KIAl0YXNrbGV0X3NjaGVkdWxlKCZjaGFubmVsLT5pcnFfdGFza2xldCk7CkBAIC0xNDYxLDcgKzE0NjMsNyBAQAogCS8qIENoZWNrIGZvciBwcm9jZXNzZWQgYnVmZmVycy4gKi8KIAlpb2IgPSBjaGFubmVsLT5pb2I7CiAJYnVmX2lkeCA9IGNoYW5uZWwtPmJ1Zl9pZHg7Ci0Jd2hpbGUgKGlvYltidWZfaWR4XS5zdGF0ZSA9PSBCVUZfU1RBVEVfUFJPQ0VTU0VEKSB7CisJd2hpbGUgKGlvYltidWZfaWR4XS5zdGF0ZSA9PSBMQ1NfQlVGX1NUQVRFX1BST0NFU1NFRCkgewogCQkvKiBEbyB0aGUgY2FsbGJhY2sgdGhpbmcuICovCiAJCWlmIChpb2JbYnVmX2lkeF0uY2FsbGJhY2sgIT0gTlVMTCkKIAkJCWlvYltidWZfaWR4XS5jYWxsYmFjayhjaGFubmVsLCBpb2IgKyBidWZfaWR4KTsKQEAgLTE0NjksMTIgKzE0NzEsMTIgQEAKIAl9CiAJY2hhbm5lbC0+YnVmX2lkeCA9IGJ1Zl9pZHg7CiAKLQlpZiAoY2hhbm5lbC0+c3RhdGUgPT0gQ0hfU1RBVEVfU1RPUFBFRCkKKwlpZiAoY2hhbm5lbC0+c3RhdGUgPT0gTENTX0NIX1NUQVRFX1NUT1BQRUQpCiAJCS8vIEZJWE1FOiB3aGF0IGlmIHJjICE9IDAgPz8KIAkJcmMgPSBsY3Nfc3RhcnRfY2hhbm5lbChjaGFubmVsKTsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOwotCWlmIChjaGFubmVsLT5zdGF0ZSA9PSBDSF9TVEFURV9TVVNQRU5ERUQgJiYKLQkgICAgY2hhbm5lbC0+aW9iW2NoYW5uZWwtPmlvX2lkeF0uc3RhdGUgPT0gQlVGX1NUQVRFX1JFQURZKSB7CisJaWYgKGNoYW5uZWwtPnN0YXRlID09IExDU19DSF9TVEFURV9TVVNQRU5ERUQgJiYKKwkgICAgY2hhbm5lbC0+aW9iW2NoYW5uZWwtPmlvX2lkeF0uc3RhdGUgPT0gTENTX0JVRl9TVEFURV9SRUFEWSkgewogCQkvLyBGSVhNRTogd2hhdCBpZiByYyAhPSAwID8/CiAJCXJjID0gX19sY3NfcmVzdW1lX2NoYW5uZWwoY2hhbm5lbCk7CiAJfQpAQCAtMTY4OSw4ICsxNjkxLDggQEAKIAkJY2FyZC0+c3RhdGUgPSBERVZfU1RBVEVfVVA7CiAJfSBlbHNlIHsKIAkJY2FyZC0+c3RhdGUgPSBERVZfU1RBVEVfRE9XTjsKLQkJY2FyZC0+d3JpdGUuc3RhdGUgPSBDSF9TVEFURV9JTklUOwotCQljYXJkLT5yZWFkLnN0YXRlID0gIENIX1NUQVRFX0lOSVQ7CisJCWNhcmQtPndyaXRlLnN0YXRlID0gTENTX0NIX1NUQVRFX0lOSVQ7CisJCWNhcmQtPnJlYWQuc3RhdGUgPSAgTENTX0NIX1NUQVRFX0lOSVQ7CiAJfQogCXJldHVybiByYzsKIH0KQEAgLTE3MDUsOCArMTcwNyw4IEBACiAKIAlMQ1NfREJGX1RFWFQoMywgc2V0dXAsICJzdG9wY2FyZCIpOwogCi0JaWYgKGNhcmQtPnJlYWQuc3RhdGUgIT0gQ0hfU1RBVEVfU1RPUFBFRCAmJgotCSAgICBjYXJkLT53cml0ZS5zdGF0ZSAhPSBDSF9TVEFURV9TVE9QUEVEICYmCisJaWYgKGNhcmQtPnJlYWQuc3RhdGUgIT0gTENTX0NIX1NUQVRFX1NUT1BQRUQgJiYKKwkgICAgY2FyZC0+d3JpdGUuc3RhdGUgIT0gTENTX0NIX1NUQVRFX1NUT1BQRUQgJiYKIAkgICAgY2FyZC0+c3RhdGUgPT0gREVWX1NUQVRFX1VQKSB7CiAJCWxjc19jbGVhcl9tdWx0aWNhc3RfbGlzdChjYXJkKTsKIAkJcmMgPSBsY3Nfc2VuZF9zdG9wbGFuKGNhcmQsTENTX0lOSVRJQVRPUl9UQ1BJUCk7CkBAIC0xODcxLDcgKzE4NzMsNyBAQAogCW5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKIAlkZXYtPmZsYWdzICY9IH5JRkZfVVA7CiAJd2FpdF9ldmVudChjYXJkLT53cml0ZS53YWl0X3EsCi0JCShjYXJkLT53cml0ZS5zdGF0ZSAhPSBDSF9TVEFURV9SVU5OSU5HKSk7CisJCShjYXJkLT53cml0ZS5zdGF0ZSAhPSBMQ1NfQ0hfU1RBVEVfUlVOTklORykpOwogCXJjID0gbGNzX3N0b3BjYXJkKGNhcmQpOwogCWlmIChyYykKIAkJUFJJTlRfRVJSKCJUcnkgaXQgYWdhaW4hXG4gIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5oIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuaAppbmRleCA5MzE0MzkzLi4wZTFlNGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmgKQEAgLTIzLDExICsyMyw2IEBACiB9IHdoaWxlICgwKQogCiAvKioKLSAqIHNvbWUgbW9yZSBkZWZpbml0aW9ucyBmb3IgZGVidWcgb3Igb3V0cHV0IHN0dWZmCi0gKi8KLSNkZWZpbmUgUFJJTlRLX0hFQURFUgkJIiBsY3M6ICIKLQotLyoqCiAgKglzeXNmcyByZWxhdGVkIHN0dWZmCiAgKi8KICNkZWZpbmUgQ0FSRF9GUk9NX0RFVihjZGV2KSBcCkBAIC0xMjcsMjIgKzEyMiwyMiBAQAogICogTENTIEJ1ZmZlciBzdGF0ZXMKICAqLwogZW51bSBsY3NfYnVmZmVyX3N0YXRlcyB7Ci0JQlVGX1NUQVRFX0VNUFRZLAkvKiBidWZmZXIgaXMgZW1wdHkgKi8KLQlCVUZfU1RBVEVfTE9DS0VELAkvKiBidWZmZXIgaXMgbG9ja2VkLCBkb24ndCB0b3VjaCAqLwotCUJVRl9TVEFURV9SRUFEWSwJLyogYnVmZmVyIGlzIHJlYWR5IGZvciByZWFkL3dyaXRlICovCi0JQlVGX1NUQVRFX1BST0NFU1NFRCwKKwlMQ1NfQlVGX1NUQVRFX0VNUFRZLAkvKiBidWZmZXIgaXMgZW1wdHkgKi8KKwlMQ1NfQlVGX1NUQVRFX0xPQ0tFRCwJLyogYnVmZmVyIGlzIGxvY2tlZCwgZG9uJ3QgdG91Y2ggKi8KKwlMQ1NfQlVGX1NUQVRFX1JFQURZLAkvKiBidWZmZXIgaXMgcmVhZHkgZm9yIHJlYWQvd3JpdGUgKi8KKwlMQ1NfQlVGX1NUQVRFX1BST0NFU1NFRCwKIH07CiAKIC8qKgogICogTENTIENoYW5uZWwgU3RhdGUgTWFjaGluZSBkZWNsYXJhdGlvbnMKICAqLwogZW51bSBsY3NfY2hhbm5lbF9zdGF0ZXMgewotCUNIX1NUQVRFX0lOSVQsCi0JQ0hfU1RBVEVfSEFMVEVELAotCUNIX1NUQVRFX1NUT1BQRUQsCi0JQ0hfU1RBVEVfUlVOTklORywKLQlDSF9TVEFURV9TVVNQRU5ERUQsCi0JQ0hfU1RBVEVfQ0xFQVJFRCwKKwlMQ1NfQ0hfU1RBVEVfSU5JVCwKKwlMQ1NfQ0hfU1RBVEVfSEFMVEVELAorCUxDU19DSF9TVEFURV9TVE9QUEVELAorCUxDU19DSF9TVEFURV9SVU5OSU5HLAorCUxDU19DSF9TVEFURV9TVVNQRU5ERUQsCisJTENTX0NIX1NUQVRFX0NMRUFSRUQsCiB9OwogCiAvKioKQEAgLTE2OSw3ICsxNjQsNyBAQAogfSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgbGNzX2lwX21hY19wYWlyIHsKLQlfX3UzMiAgaXBfYWRkcjsKKwlfX2JlMzIgIGlwX2FkZHI7CiAJX191OCAgIG1hY19hZGRyW0xDU19NQUNfTEVOR1RIXTsKIAlfX3U4ICAgcmVzZXJ2ZWRbMl07CiB9ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CkBAIC0yODcsNyArMjgyLDcgQEAKIAllbnVtIGxjc19kZXZfc3RhdGVzIHN0YXRlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0JdW5zaWduZWQgc2hvcnQgKCpsYW5fdHlwZV90cmFucykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlfX2JlMTYgKCpsYW5fdHlwZV90cmFucykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXY7CiAJc3RydWN0IGxjc19jaGFubmVsIHJlYWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGguaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oCmluZGV4IDgyMTM4M2QuLjUzYzM1OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oCkBAIC0xNTEsOCArMTUxLDYgQEAKICNkZWZpbmUgU0VOU0VfUkVTRVRUSU5HX0VWRU5UX0JZVEUgMQogI2RlZmluZSBTRU5TRV9SRVNFVFRJTkdfRVZFTlRfRkxBRyAweDgwCiAKLSNkZWZpbmUgYXRvbWljX3N3YXAoYSxiKSB4Y2hnKChpbnQgKilhLmNvdW50ZXIsIGIpCi0KIC8qCiAgKiBDb21tb24gSU8gcmVsYXRlZCBkZWZpbml0aW9ucwogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuYwppbmRleCBhMzYzNzIxLi42YmI1NThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHFldGhfZWRkcF9jb3B5X2RhdGFfdGNwKGNoYXIgKmRzdCwgc3RydWN0IHFldGhfZWRkcF9kYXRhICplZGRwLCBpbnQgbGVuLAotCQkJdTMyICpoY3N1bSkKKwkJCV9fd3N1bSAqaGNzdW0pCiB7CiAJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKIAlpbnQgbGVmdF9pbl9mcmFnOwpAQCAtMzA1LDcgKzMwNSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHFldGhfZWRkcF9jcmVhdGVfc2VnbWVudF9kYXRhX3RjcChzdHJ1Y3QgcWV0aF9lZGRwX2NvbnRleHQgKmN0eCwKIAkJCQkgIHN0cnVjdCBxZXRoX2VkZHBfZGF0YSAqZWRkcCwgaW50IGRhdGFfbGVuLAotCQkJCSAgdTMyIGhjc3VtKQorCQkJCSAgX193c3VtIGhjc3VtKQogewogCXU4ICpwYWdlOwogCWludCBwYWdlX3JlbWFpbmRlcjsKQEAgLTM0OSwxMCArMzQ5LDEwIEBACiAJKChzdHJ1Y3QgdGNwaGRyICopZWRkcC0+dGhfaW5fY3R4KS0+Y2hlY2sgPSBjc3VtX2ZvbGQoaGNzdW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMgorc3RhdGljIGlubGluZSBfX3dzdW0KIHFldGhfZWRkcF9jaGVja190Y3A0X2hkcihzdHJ1Y3QgcWV0aF9lZGRwX2RhdGEgKmVkZHAsIGludCBkYXRhX2xlbikKIHsKLQl1MzIgcGhjc3VtOyAvKiBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtICovCisJX193c3VtIHBoY3N1bTsgLyogcHNldWRvIGhlYWRlciBjaGVja3N1bSAqLwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgNSwgImVkZHBja3Q0Iik7CiAJZWRkcC0+dGgudGNwLmguY2hlY2sgPSAwOwpAQCAtMzYzLDExICszNjMsMTEgQEAKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsKCh1OCAqKSZlZGRwLT50aCwgZWRkcC0+dGhsLCBwaGNzdW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMgorc3RhdGljIGlubGluZSBfX3dzdW0KIHFldGhfZWRkcF9jaGVja190Y3A2X2hkcihzdHJ1Y3QgcWV0aF9lZGRwX2RhdGEgKmVkZHAsIGludCBkYXRhX2xlbikKIHsKLQl1MzIgcHJvdG87Ci0JdTMyIHBoY3N1bTsgLyogcHNldWRvIGhlYWRlciBjaGVja3N1bSAqLworCV9fYmUzMiBwcm90bzsKKwlfX3dzdW0gcGhjc3VtOyAvKiBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtICovCiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiZWRkcGNrdDYiKTsKIAllZGRwLT50aC50Y3AuaC5jaGVjayA9IDA7CkBAIC00MDUsNyArNDA1LDcgQEAKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCWludCBkYXRhX2xlbjsKLQl1MzIgaGNzdW07CisJX193c3VtIGhjc3VtOwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgNSwgImVkZHBmdGNwIik7CiAJZWRkcC0+c2tiX29mZnNldCA9IHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpICsgZWRkcC0+bmhsICsgZWRkcC0+dGhsOwpAQCAtNDMzLDIyICs0MzMsMjIgQEAKIAkJCWVkZHAtPnFoLmhkci5sMy5sZW5ndGggPSBkYXRhX2xlbiArIGVkZHAtPm5obCArCiAJCQkJCQkgZWRkcC0+dGhsOwogCQkvKiBwcmVwYXJlIGlwIGhkciAqLwotCQlpZiAoZWRkcC0+c2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUCl7Ci0JCQllZGRwLT5uaC5pcDQuaC50b3RfbGVuID0gZGF0YV9sZW4gKyBlZGRwLT5uaGwgKwotCQkJCQkJIGVkZHAtPnRobDsKKwkJaWYgKGVkZHAtPnNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKXsKKwkJCWVkZHAtPm5oLmlwNC5oLnRvdF9sZW4gPSBodG9ucyhkYXRhX2xlbiArIGVkZHAtPm5obCArCisJCQkJCQkgZWRkcC0+dGhsKTsKIAkJCWVkZHAtPm5oLmlwNC5oLmNoZWNrID0gMDsKIAkJCWVkZHAtPm5oLmlwNC5oLmNoZWNrID0KIAkJCQlpcF9mYXN0X2NzdW0oKHU4ICopJmVkZHAtPm5oLmlwNC5oLAogCQkJCQkJZWRkcC0+bmguaXA0LmguaWhsKTsKIAkJfSBlbHNlCi0JCQllZGRwLT5uaC5pcDYuaC5wYXlsb2FkX2xlbiA9IGRhdGFfbGVuICsgZWRkcC0+dGhsOworCQkJZWRkcC0+bmguaXA2LmgucGF5bG9hZF9sZW4gPSBodG9ucyhkYXRhX2xlbiArIGVkZHAtPnRobCk7CiAJCS8qIHByZXBhcmUgdGNwIGhkciAqLwogCQlpZiAoZGF0YV9sZW4gPT0gKGVkZHAtPnNrYi0+bGVuIC0gZWRkcC0+c2tiX29mZnNldCkpewogCQkJLyogbGFzdCBzZWdtZW50IC0+IHNldCBGSU4gYW5kIFBTSCBmbGFncyAqLwogCQkJZWRkcC0+dGgudGNwLmguZmluID0gdGNwaC0+ZmluOwogCQkJZWRkcC0+dGgudGNwLmgucHNoID0gdGNwaC0+cHNoOwogCQl9Ci0JCWlmIChlZGRwLT5za2ItPnByb3RvY29sID09IEVUSF9QX0lQKQorCQlpZiAoZWRkcC0+c2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCQloY3N1bSA9IHFldGhfZWRkcF9jaGVja190Y3A0X2hkcihlZGRwLCBkYXRhX2xlbik7CiAJCWVsc2UKIAkJCWhjc3VtID0gcWV0aF9lZGRwX2NoZWNrX3RjcDZfaGRyKGVkZHAsIGRhdGFfbGVuKTsKQEAgLTQ1OCw5ICs0NTgsOSBAQAogCQlpZiAoZWRkcC0+c2tiX29mZnNldCA+PSBlZGRwLT5za2ItPmxlbikKIAkJCWJyZWFrOwogCQkvKiBwcmVwYXJlIGhlYWRlcnMgZm9yIG5leHQgcm91bmQgKi8KLQkJaWYgKGVkZHAtPnNrYi0+cHJvdG9jb2wgPT0gRVRIX1BfSVApCi0JCQllZGRwLT5uaC5pcDQuaC5pZCsrOwotCQllZGRwLT50aC50Y3AuaC5zZXEgKz0gZGF0YV9sZW47CisJCWlmIChlZGRwLT5za2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJCWVkZHAtPm5oLmlwNC5oLmlkID0gaHRvbnMobnRvaHMoZWRkcC0+bmguaXA0LmguaWQpICsgMSk7CisJCWVkZHAtPnRoLnRjcC5oLnNlcSA9IGh0b25sKG50b2hsKGVkZHAtPnRoLnRjcC5oLnNlcSkgKyBkYXRhX2xlbik7CiAJfQogfQogCkBAIC00NzIsNyArNDcyLDcgQEAKIAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJlZGRwZmljeCIpOwogCS8qIGNyZWF0ZSBvdXIgc2VnbWVudGF0aW9uIGhlYWRlcnMgYW5kIGNvcHkgb3JpZ2luYWwgaGVhZGVycyAqLwotCWlmIChza2ItPnByb3RvY29sID09IEVUSF9QX0lQKQorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJZWRkcCA9IHFldGhfZWRkcF9jcmVhdGVfZWRkcF9kYXRhKHFoZHIsICh1OCAqKXNrYi0+bmguaXBoLAogCQkJCXNrYi0+bmguaXBoLT5paGwqNCwKIAkJCQkodTggKilza2ItPmgudGgsIHNrYi0+aC50aC0+ZG9mZio0KTsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQltZW1jcHkoJmVkZHAtPm1hYywgZXRoX2hkcihza2IpLCBFVEhfSExFTik7CiAjaWZkZWYgQ09ORklHX1FFVEhfVkxBTgogCQlpZiAoZWRkcC0+bWFjLmhfcHJvdG8gPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSkpIHsKLQkJCWVkZHAtPnZsYW5bMF0gPSBfX2NvbnN0YW50X2h0b25zKHNrYi0+cHJvdG9jb2wpOworCQkJZWRkcC0+dmxhblswXSA9IHNrYi0+cHJvdG9jb2w7CiAJCQllZGRwLT52bGFuWzFdID0gaHRvbnModmxhbl90eF90YWdfZ2V0KHNrYikpOwogCQl9CiAjZW5kaWYgLyogQ09ORklHX1FFVEhfVkxBTiAqLwpAQCAtNTg4LDExICs1ODgsMTEgQEAKIAlzdHJ1Y3QgcWV0aF9lZGRwX2NvbnRleHQgKmN0eCA9IE5VTEw7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiY3JlZGRwY3QiKTsKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCWN0eCA9IHFldGhfZWRkcF9jcmVhdGVfY29udGV4dF9nZW5lcmljKGNhcmQsIHNrYiwKIAkJCXNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpICsgc2tiLT5uaC5pcGgtPmlobCo0ICsKIAkJCXNrYi0+aC50aC0+ZG9mZio0KTsKLQllbHNlIGlmIChza2ItPnByb3RvY29sID09IEVUSF9QX0lQVjYpCisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKIAkJY3R4ID0gcWV0aF9lZGRwX2NyZWF0ZV9jb250ZXh0X2dlbmVyaWMoY2FyZCwgc2tiLAogCQkJc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKIAkJCXNrYi0+aC50aC0+ZG9mZio0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5oCmluZGV4IGNhZTliYTIuLjEwMzc2OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuaApAQCAtNTQsNyArNTQsNyBAQAogc3RydWN0IHFldGhfZWRkcF9kYXRhIHsKIAlzdHJ1Y3QgcWV0aF9oZHIgcWg7CiAJc3RydWN0IGV0aGhkciBtYWM7Ci0JdTE2IHZsYW5bMl07CisJX19iZTE2IHZsYW5bMl07CiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGlwaGRyIGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwppbmRleCA4MzY0ZDU0Li43ZmRjNTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKQEAgLTI5ODIsNyArMjk4Miw3IEBACiAJICovCiAJaWYgKChhdG9taWNfcmVhZCgmcXVldWUtPnVzZWRfYnVmZmVycykgPD0gUUVUSF9MT1dfV0FURVJNQVJLX1BBQ0spIHx8CiAJICAgICFhdG9taWNfcmVhZCgmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpKXsKLQkJaWYgKGF0b21pY19zd2FwKCZxdWV1ZS0+c3RhdGUsIFFFVEhfT1VUX1FfTE9DS0VEX0ZMVVNIKSA9PQorCQlpZiAoYXRvbWljX3hjaGcoJnF1ZXVlLT5zdGF0ZSwgUUVUSF9PVVRfUV9MT0NLRURfRkxVU0gpID09CiAJCQkJUUVUSF9PVVRfUV9VTkxPQ0tFRCkgewogCQkJLyoKIAkJCSAqIElmIHdlIGdldCBpbiBoZXJlLCB0aGVyZSB3YXMgbm8gYWN0aW9uIGluCkBAIC0zMjQ1LDcgKzMyNDUsNyBAQAogCWludCBpLCBqOwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgMiwgImZyZWVxZGJmIik7Ci0JaWYgKGF0b21pY19zd2FwKCZjYXJkLT5xZGlvLnN0YXRlLCBRRVRIX1FESU9fVU5JTklUSUFMSVpFRCkgPT0KKwlpZiAoYXRvbWljX3hjaGcoJmNhcmQtPnFkaW8uc3RhdGUsIFFFVEhfUURJT19VTklOSVRJQUxJWkVEKSA9PQogCQlRRVRIX1FESU9fVU5JTklUSUFMSVpFRCkKIAkJcmV0dXJuOwogCWtmcmVlKGNhcmQtPnFkaW8uaW5fcSk7CkBAIC00MzY2LDcgKzQzNjYsNyBAQAogCWlmIChmbHVzaF9jb3VudCkKIAkJcWV0aF9mbHVzaF9idWZmZXJzKHF1ZXVlLCAwLCBzdGFydF9pbmRleCwgZmx1c2hfY291bnQpOwogCWVsc2UgaWYgKCFhdG9taWNfcmVhZCgmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpKQotCQlhdG9taWNfc3dhcCgmcXVldWUtPnN0YXRlLCBRRVRIX09VVF9RX0xPQ0tFRF9GTFVTSCk7CisJCWF0b21pY194Y2hnKCZxdWV1ZS0+c3RhdGUsIFFFVEhfT1VUX1FfTE9DS0VEX0ZMVVNIKTsKIAkvKgogCSAqIHF1ZXVlLT5zdGF0ZSB3aWxsIGdvIGZyb20gTE9DS0VEIC0+IFVOTE9DS0VEIG9yIGZyb20KIAkgKiBMT0NLRURfRkxVU0ggLT4gTE9DS0VEIGlmIG91dHB1dF9oYW5kbGVyIHdhbnRlZCB0byAnbm90aWZ5JyB1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmggYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3JlZ19kZWYuaAppbmRleCBiNzlmNDVmLi5hMTFmNGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3JlZ19kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3JlZ19kZWYuaApAQCAtMjAwMCw3ICsyMDAwLDcgQEAKICAqIFRoZSBob3N0IGFjY2Vzc2VzIHRoaXMgc2NyYXRjaCBpbiBhIGRpZmZlcmVudCBtYW5uZXIgZnJvbSB0aGUKICAqIGNlbnRyYWwgc2VxdWVuY2VyLiBUaGUgc2VxdWVuY2VyIGhhcyB0byB1c2UgQ1NFUSByZWdpc3RlcnMgQ1NDUlBBR0UKICAqIGFuZCBDTW5TQ1JQQUdFIHRvIGFjY2VzcyB0aGUgc2NyYXRjaCBtZW1vcnkuIEEgZmxhdCBtYXBwaW5nIG9mIHRoZQotICogc2NyYXRjaCBtZW1vcnkgaXMgYXZhbGlhYmxlIGZvciBzb2Z0d2FyZSBjb252ZW5pZW5jZSBhbmQgdG8gcHJldmVudAorICogc2NyYXRjaCBtZW1vcnkgaXMgYXZhaWxhYmxlIGZvciBzb2Z0d2FyZSBjb252ZW5pZW5jZSBhbmQgdG8gcHJldmVudAogICogY29ycnVwdGlvbiB3aGlsZSB0aGUgc2VxdWVuY2VyIGlzIHJ1bm5pbmcuIFRoaXMgbWVtb3J5IGlzIG1hcHBlZAogICogb250byBhZGRyZXNzZXMgODAwaCAtIEJGRmgsIHRvdGFsIG9mIDQwMGggYnl0ZXMuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZHMuYyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2RzLmMKaW5kZXggZGU3YzA0ZC4uZTVhMGVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZHMuYworKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3Nkcy5jCkBAIC02NCw3ICs2NCw3IEBACiAKICNkZWZpbmUgT0NNX0lOSVRfRElSX0VOVFJJRVMJNQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgT0NNIGRpcmNldG9yeSBkZWZhdWx0CisqICBPQ00gZGlyZWN0b3J5IGRlZmF1bHQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgYXNkX29jbV9kaXIgT0NNRGlySW5pdCA9CiB7CkBAIC03Myw3ICs3Myw3IEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBPQ00gZGlyY2V0b3J5IEVudHJpZXMgZGVmYXVsdAorKiAgT0NNIGRpcmVjdG9yeSBFbnRyaWVzIGRlZmF1bHQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgYXNkX29jbV9kaXJfZW50IE9DTURpckVudHJpZXNJbml0W09DTV9JTklUX0RJUl9FTlRSSUVTXSA9CiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKaW5kZXggNWE4OGZhMC4uYmJmNTIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAqKglwb3dlciBvZiAyIGNhY2hlIGxpbmUgc2l6ZS4KICoqCUVuaGFuY2VkIGluIGxpbnV4LTIuMy40NCB0byBwcm92aWRlIGEgbWVtb3J5IHBvb2wgCiAqKglwZXIgcGNpZGV2IHRvIHN1cHBvcnQgZHluYW1pYyBkbWEgbWFwcGluZy4gKEkgd291bGQgCi0qKgloYXZlIHByZWZlcnJlZCBhIHJlYWwgYnVzIGFzdHJhY3Rpb24sIGJ0dykuCisqKgloYXZlIHByZWZlcnJlZCBhIHJlYWwgYnVzIGFic3RyYWN0aW9uLCBidHcpLgogKioKICoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTE0NDEsNyArMTQ0MSw3IEBACiAqKglUaGUgZmlyc3QgZm91ciBieXRlcyAoc2NyX3N0WzRdKSBhcmUgdXNlZCBpbnNpZGUgdGhlIHNjcmlwdCBieSAKICoqCSJDT1BZIiBjb21tYW5kcy4KICoqCUJlY2F1c2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50Ci0qKglpbiBhIERXT1JELCB0aGUgZmllbGRzIEhBVkUgdG8gYmUgYXQgdGhlIGNob29zZW4gb2Zmc2V0cy4KKyoqCWluIGEgRFdPUkQsIHRoZSBmaWVsZHMgSEFWRSB0byBiZSBhdCB0aGUgY2hvc2VuIG9mZnNldHMuCiAqKgkJeGVycl9zdAkJMAkoMHgzNCkJc2NyYXRjaGEKICoqCQlzeW5jX3N0CQkxCSgweDA1KQlzeGZlcgogKioJCXdpZGVfc3QJCTMJKDB4MDMpCXNjbnRsMwpAQCAtMTUwMSw3ICsxNTAxLDcgQEAKICoqCXRoZSBEU0EgKGRhdGEgc3RydWN0dXJlIGFkZHJlc3MpIHJlZ2lzdGVyIHBvaW50cwogKioJdG8gdGhpcyBzdWJzdHJ1Y3R1cmUgb2YgdGhlIGNjYi4KICoqCVRoaXMgc3Vic3RydWN0dXJlIGNvbnRhaW5zIHRoZSBoZWFkZXIgd2l0aAotKioJdGhlIHNjcmlwdC1wcm9jZXNzb3ItY2hhbmdhYmxlIGRhdGEgYW5kCisqKgl0aGUgc2NyaXB0LXByb2Nlc3Nvci1jaGFuZ2VhYmxlIGRhdGEgYW5kCiAqKglkYXRhIGJsb2NrcyBmb3IgdGhlIGluZGlyZWN0IG1vdmUgY29tbWFuZHMuCiAqKgogKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MTEwLDcgKzUxMTAsNyBAQAogCiAvKgogKioJVGhpcyBDQ0IgaGFzIGJlZW4gc2tpcHBlZCBieSB0aGUgTkNSLgotKioJUXVldWUgaXQgaW4gdGhlIGNvcnJlcG9uZGluZyB1bml0IHF1ZXVlLgorKioJUXVldWUgaXQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCBxdWV1ZS4KICovCiBzdGF0aWMgdm9pZCBuY3JfY2NiX3NraXBwZWQoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKQogewpAQCAtNTg5OSw4ICs1ODk5LDggQEAKICoqCiAqKglJbiBub3JtYWwgY2FzZXMsIGludGVycnVwdCBjb25kaXRpb25zIG9jY3VyIG9uZSBhdCBhIAogKioJdGltZS4gVGhlIG5jciBpcyBhYmxlIHRvIHN0YWNrIGluIHNvbWUgZXh0cmEgcmVnaXN0ZXJzIAotKioJb3RoZXIgaW50ZXJydXB0cyB0aGF0IHdpbGwgb2NjdXJzIGFmdGVyIHRoZSBmaXJzdCBvbmUuCi0qKglCdXQgc2V2ZXJhbGwgaW50ZXJydXB0cyBtYXkgb2NjdXIgYXQgdGhlIHNhbWUgdGltZS4KKyoqCW90aGVyIGludGVycnVwdHMgdGhhdCB3aWxsIG9jY3VyIGFmdGVyIHRoZSBmaXJzdCBvbmUuCisqKglCdXQsIHNldmVyYWwgaW50ZXJydXB0cyBtYXkgb2NjdXIgYXQgdGhlIHNhbWUgdGltZS4KICoqCiAqKglXZSBwcm9iYWJseSBzaG91bGQgb25seSB0cnkgdG8gZGVhbCB3aXRoIHRoZSBub3JtYWwgCiAqKgljYXNlLCBidXQgaXQgc2VlbXMgdGhhdCBtdWx0aXBsZSBpbnRlcnJ1cHRzIG9jY3VyIGluIApAQCAtNjc5OSw3ICs2Nzk5LDcgQEAKICoqCVRoZSBob3N0IHN0YXR1cyBmaWVsZCBpcyBzZXQgdG8gSFNfTkVHT1RJQVRFIHRvIG1hcmsgdGhpcwogKioJc2l0dWF0aW9uLgogKioKLSoqCUlmIHRoZSB0YXJnZXQgZG9lc24ndCBhbnN3ZXIgdGhpcyBtZXNzYWdlIGltbWlkaWF0ZWx5CisqKglJZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgYW5zd2VyIHRoaXMgbWVzc2FnZSBpbW1lZGlhdGVseQogKioJKGFzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZCksIHRoZSBTSVJfTkVHT19GQUlMIGludGVycnVwdAogKioJd2lsbCBiZSByYWlzZWQgZXZlbnR1YWxseS4KICoqCVRoZSBoYW5kbGVyIHJlbW92ZXMgdGhlIEhTX05FR09USUFURSBzdGF0dXMsIGFuZCBzZXRzIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5oIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5oCmluZGV4IGNiOGI3NzAuLmIzOTM1N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguaAorKysgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmgKQEAgLTIxOCw3ICsyMTgsNyBAQAogKioJU2FtZSBhcyBvcHRpb24gMSwgYnV0IGFsc28gZGVhbCB3aXRoIAogKioJbWlzY29uZmlndXJlZCBpbnRlcnJ1cHRzLgogKioKLSoqCS0gRWRnZSB0cmlnZ2VycmVkIGluc3RlYWQgb2YgbGV2ZWwgc2Vuc2l0aXZlLgorKioJLSBFZGdlIHRyaWdnZXJlZCBpbnN0ZWFkIG9mIGxldmVsIHNlbnNpdGl2ZS4KICoqCS0gTm8gaW50ZXJydXB0IGxpbmUgY29ubmVjdGVkLgogKioJLSBJUlEgbnVtYmVyIG1pc2NvbmZpZ3VyZWQuCiAqKgkKQEAgLTU0OSw3ICs1NDksNyBAQAogCiAvKgogKioJSW5pdGlhbCBzZXR1cC4KLSoqCUNhbiBiZSBvdmVycmlkZW4gYXQgc3RhcnR1cCBieSBhIGNvbW1hbmQgbGluZS4KKyoqCUNhbiBiZSBvdmVycmlkZGVuIGF0IHN0YXJ0dXAgYnkgYSBjb21tYW5kIGxpbmUuCiAqLwogI2RlZmluZSBTQ1NJX05DUl9EUklWRVJfU0VUVVAJCQlcCiB7CQkJCQkJXApAQCAtMTA5Myw3ICsxMDkzLDcgQEAKICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoqCU9uIDgxMEEsIDg2MCwgODI1QSwgODc1LCA4OTUgYW5kIDg5NiBjaGlwcyB0aGUgY29udGVudCAKICoqCW9mIFNGQlIgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgZGF0YSAoU0NSX1NGQlJfREFUQSkuCi0qKglUaGUgODk2IGhhcyBhZGRpdGlvbm5hbCBJTyByZWdpc3RlcnMgc3RhcnRpbmcgYXQgCisqKglUaGUgODk2IGhhcyBhZGRpdGlvbmFsIElPIHJlZ2lzdGVycyBzdGFydGluZyBhdCAKICoqCW9mZnNldCAweDgwLiBCaXQgNyBvZiByZWdpc3RlciBvZmZzZXQgaXMgc3RvcmVkIGluIAogKioJYml0IDcgb2YgdGhlIFNDUklQVFMgaW5zdHJ1Y3Rpb24gZmlyc3QgRFdPUkQuCiAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYwppbmRleCBlZTQ0OWIyLi5hYWQzNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKQEAgLTE1NCwxNiArMTU0LDExIEBACiAgICAgCiAgICAgREVCVUcoMCwgImFoYTE1MnhfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAgICAgdHVwbGUuVHVwbGVEYXRhID0gdHVwbGVfZGF0YTsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQogICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAgICAgd2hpbGUgKDEpIHsKIAlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKaW5kZXggODVmN2ZmYS4uYTFjNWYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCkBAIC0xMzYsMTQgKzEzNiw5IEBACiAKICAgICBERUJVRygwLCAiZmRvbWFpbl9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKICAgICB0dXBsZS5UdXBsZURhdGEgPSB0dXBsZV9kYXRhOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwogCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCmluZGV4IGYyZDc5YzMuLmQ3MmRmNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwpAQCAtMTY4NSwxNiArMTY4NSwxMCBAQAogCiAJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluIik7CiAKLQl0dXBsZS5EZXNpcmVkVHVwbGUgICAgPSBDSVNUUExfQ09ORklHOwogCXR1cGxlLkF0dHJpYnV0ZXMgICAgICA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhCSAgICAgID0gdHVwbGVfZGF0YTsKIAl0dXBsZS5UdXBsZURhdGFNYXggICAgPSBzaXplb2YodHVwbGVfZGF0YSk7CiAJdHVwbGUuVHVwbGVPZmZzZXQgICAgID0gMDsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwJcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCAgICA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKIAogCS8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCiAJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKaW5kZXggODZjMmFjNi4uOWQ0MzFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwpAQCAtMjA4LDE4ICsyMDgsMTEgQEAKIAogCURFQlVHKDAsICJxbG9naWNfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAorCWluZm8tPm1hbmZfaWQgPSBsaW5rLT5tYW5mX2lkOworCiAJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSB0dXBsZV9kYXRhOwogCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwogCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwotCWlmICgocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpICYmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSkKLQkJaW5mby0+bWFuZl9pZCA9IGxlMTZfdG9fY3B1KHR1cGxlLlR1cGxlRGF0YVswXSk7CiAKIAl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKIAlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKaW5kZXggNzJmZTVkMC4uZmI3YWNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCkBAIC03MjIsMTkgKzcyMiwxMSBAQAogCiAJREVCVUcoMCwgIlNZTTUzQzUwMF9jb25maWcoMHglcClcbiIsIGxpbmspOwogCisJaW5mby0+bWFuZl9pZCA9IGxpbmstPm1hbmZfaWQ7CisKIAl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopdHVwbGVfZGF0YTsKIAl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKLQlpZiAoKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJgotCSAgICAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpCi0JCWluZm8tPm1hbmZfaWQgPSBsZTE2X3RvX2NwdSh0dXBsZS5UdXBsZURhdGFbMF0pOwogCiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwppbmRleCBiNWIwYzJjLi41YzBiNzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYwppbmRleCBiNjkxZDNlLi43ODdhOGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0yLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMi5jCkBAIC0yODIsNyArMjgyLDcgQEAKIH0KIAogLyogU2V0dXAgYW55IGR5bmFtaWMgcGFyYW1zIGluIHRoZSB1YXJ0IGRlc2MgKi8KLWludCBjcG1fdWFydF9pbml0X3BvcnRkZXNjKHZvaWQpCitpbnQgX19pbml0IGNwbV91YXJ0X2luaXRfcG9ydGRlc2Modm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQ1BNX1NNQzEpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9DUE1fU01DMikKIAl1MzIgYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jIGIvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKaW5kZXggNGY4MGM1Yi4uNmRkNTc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKLSAqCiAgKiBEcml2ZXIgZm9yIHRoZSBQU0Mgb2YgdGhlIEZyZWVzY2FsZSBNUEM1Mnh4IFBTQ3MgY29uZmlndXJlZCBhcyBVQVJUcy4KICAqCiAgKiBGSVhNRSBBY2NvcmRpbmcgdG8gdGhlIHVzZXJtYW51YWwgdGhlIHN0YXR1cyBiaXRzIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIKQEAgLTE0LDE4ICsxMiwyMCBAQAogICoKICAqCiAgKiBNYWludGFpbmVyIDogU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgotICogCisgKgogICogU29tZSBvZiB0aGUgY29kZSBoYXMgYmVlbiBpbnNwaXJlZC9jb3BpZWQgZnJvbSB0aGUgMi40IGNvZGUgd3JpdHRlbgogICogYnkgRGFsZSBGYXJuc3dvcnRoIDxkZmFybnN3b3J0aEBtdmlzdGEuY29tPi4KLSAqIAotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKiAgICAgICAgICAgICAgICAgICAgR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCi0gKiAKKyAqCiAgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKICAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0gCisKIC8qIFBsYXRmb3JtIGRldmljZSBVc2FnZSA6CiAgKgogICogU2luY2UgUFNDcyBjYW4gaGF2ZSBtdWx0aXBsZSBmdW5jdGlvbiwgdGhlIGNvcnJlY3QgZHJpdmVyIGZvciBlYWNoIG9uZQpAQCAtNDQsNyArNDQsMjQgQEAKICAqIHdpbGwgYmUgbWFwcGVkIHRvLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKy8qIE9GIFBsYXRmb3JtIGRldmljZSBVc2FnZSA6CisgKgorICogVGhpcyBkcml2ZXIgaXMgb25seSB1c2VkIGZvciBQU0NzIGNvbmZpZ3VyZWQgaW4gdWFydCBtb2RlLiAgVGhlIGRldmljZQorICogdHJlZSB3aWxsIGhhdmUgYSBub2RlIGZvciBlYWNoIFBTQyBpbiB1YXJ0IG1vZGUgdy8gZGV2aWNlX3R5cGUgPSAic2VyaWFsIgorICogYW5kICJtcGM1Mnh4LXBzYy11YXJ0IiBpbiB0aGUgY29tcGF0aWJsZSBzdHJpbmcKKyAqCisgKiBCeSBkZWZhdWx0LCBQU0MgZGV2aWNlcyBhcmUgZW51bWVyYXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmQuICBIb3dldmVyCisgKiBhIHBhcnRpY3VsYXIgUFNDIG51bWJlciBjYW4gYmUgZm9yY2VzIGJ5IGFkZGluZyAnZGV2aWNlX25vID0gPHBvcnQjPicKKyAqIHRvIHRoZSBkZXZpY2Ugbm9kZS4KKyAqCisgKiBUaGUgZHJpdmVyIGluaXQgYWxsIG5lY2Vzc2FyeSByZWdpc3RlcnMgdG8gcGxhY2UgdGhlIFBTQyBpbiB1YXJ0IG1vZGUgd2l0aG91dAorICogRENELiBIb3dldmVyLCB0aGUgcGluIG11bHRpcGxleGluZyBhcmVuJ3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHNldCBlaXRoZXIKKyAqIGJ5IHRoZSBib290bG9hZGVyIG9yIGluIHRoZSBwbGF0Zm9ybSBpbml0IGNvZGUuCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KQEAgLTU0LDYgKzcxLDEyIEBACiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4X3BzYy5oPgogCkBAIC04MCw2ICsxMDMsMTIgQEAKIAkgKiAgICAgICAgaXQncyBjbGVhcmVkLCB0aGVuIGEgbWVtc2V0KC4uLiwwLC4uLikgc2hvdWxkIGJlIGFkZGVkIHRvCiAJICogICAgICAgIHRoZSBjb25zb2xlX2luaXQKIAkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisvKiBsb29rdXAgdGFibGUgZm9yIG1hdGNoaW5nIGRldmljZSBub2RlcyB0byBpbmRleCBudW1iZXJzICovCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICptcGM1Mnh4X3VhcnRfbm9kZXNbTVBDNTJ4eF9QU0NfTUFYTlVNXTsKKworc3RhdGljIHZvaWQgbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSh2b2lkKTsKKyNlbmRpZgogCiAjZGVmaW5lIFBTQyhwb3J0KSAoKHN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICopKChwb3J0KS0+bWVtYmFzZSkpCiAKQEAgLTk2LDMyICsxMjUsNDAgQEAKICNkZWZpbmUgdWFydF9jb25zb2xlKHBvcnQpCSgwKQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X3VhcnRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC50eXBlID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gIm1wYzUyeHgtcHNjLXVhcnQiLCB9LAorCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAibXBjNTIwMC1wc2MiLCB9LCAvKiBFZmlrYSBvbmx5ISAqLworCXt9LAorfTsKKyNlbmRpZgorCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogVUFSVCBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCAKK3N0YXRpYyB1bnNpZ25lZCBpbnQKIG1wYzUyeHhfdWFydF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCWludCBzdGF0dXMgPSBpbl9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX3N0YXR1cyk7CiAJcmV0dXJuIChzdGF0dXMgJiBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgPyBUSU9DU0VSX1RFTVQgOiAwOwogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBtcGM1Mnh4X3VhcnRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKIHsKIAkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCAKK3N0YXRpYyB1bnNpZ25lZCBpbnQKIG1wYzUyeHhfdWFydF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KIAlyZXR1cm4gVElPQ01fQ1RTIHwgVElPQ01fRFNSIHwgVElPQ01fQ0FSOwogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBtcGM1Mnh4X3VhcnRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCS8qIHBvcnQtPmxvY2sgdGFrZW4gYnkgY2FsbGVyICovCkBAIC0xMjksNyArMTY2LDcgQEAKIAlvdXRfYmUxNigmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19pbXIscG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIG1wYzUyeHhfdWFydF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCS8qIHBvcnQtPmxvY2sgdGFrZW4gYnkgY2FsbGVyICovCkBAIC0xMzcsMTIgKzE3NCwxMiBAQAogCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltcixwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKIH0KIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogbXBjNTJ4eF91YXJ0X3NlbmRfeGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciBjaCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCisKIAlwb3J0LT54X2NoYXIgPSBjaDsKIAlpZiAoY2gpIHsKIAkJLyogTWFrZSBzdXJlIHR4IGludGVycnVwdHMgYXJlIG9uICovCkBAIC0xNTAsNyArMTg3LDcgQEAKIAkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNUEM1Mnh4X1BTQ19JTVJfVFhSRFk7CiAJCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltcixwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKIAl9Ci0JCisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE3OCw3ICsyMTUsNyBAQAogCQlvdXRfOCgmUFNDKHBvcnQpLT5jb21tYW5kLE1QQzUyeHhfUFNDX1NUQVJUX0JSSyk7CiAJZWxzZQogCQlvdXRfOCgmUFNDKHBvcnQpLT5jb21tYW5kLE1QQzUyeHhfUFNDX1NUT1BfQlJLKTsKLQkKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTk3LDExICsyMzQsMTEgQEAKIAkvKiBSZXNldC9hY3RpdmF0ZSB0aGUgcG9ydCwgY2xlYXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAJb3V0XzgoJnBzYy0+Y29tbWFuZCxNUEM1Mnh4X1BTQ19SU1RfUlgpOwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfUlNUX1RYKTsKLQkKKwogCW91dF9iZTMyKCZwc2MtPnNpY3IsMCk7CS8qIFVBUlQgbW9kZSBEQ0QgaWdub3JlZCAqLwogCiAJb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfY2xvY2tfc2VsZWN0LCAweGRkMDApOyAvKiAvMTYgcHJlc2NhbGVyIG9uICovCi0JCisKIAlvdXRfOCgmcHNjLT5yZmNudGwsIDB4MDApOwogCW91dF9iZTE2KCZwc2MtPnJmYWxhcm0sIDB4MWZmKTsKIAlvdXRfOCgmcHNjLT50ZmNudGwsIDB4MDcpOwpAQCAtMjA5LDEwICsyNDYsMTAgQEAKIAogCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gTVBDNTJ4eF9QU0NfSU1SX1JYUkRZIHwgTVBDNTJ4eF9QU0NfSU1SX1RYUkRZOwogCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2ltcixwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKLQkKKwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfVFhfRU5BQkxFKTsKIAlvdXRfOCgmcHNjLT5jb21tYW5kLE1QQzUyeHhfUFNDX1JYX0VOQUJMRSk7Ci0JCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMCwxOSArMjU3LDE5IEBACiBtcGM1Mnh4X3VhcnRfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gUFNDKHBvcnQpOwotCQorCiAJLyogU2h1dCBkb3duIHRoZSBwb3J0LCBpbnRlcnJ1cHQgYW5kIGFsbCAqLwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfUlNUX1JYKTsKIAlvdXRfOCgmcHNjLT5jb21tYW5kLE1QQzUyeHhfUFNDX1JTVF9UWCk7Ci0JCi0JcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IDA7IAorCisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IDA7CiAJb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfaW1yLHBvcnQtPnJlYWRfc3RhdHVzX21hc2spOwogCiAJLyogUmVsZWFzZSBpbnRlcnJ1cHQgKi8KIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBtcGM1Mnh4X3VhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQogewpAQCAtMjQxLDEwICsyNzgsMTAgQEAKIAl1bnNpZ25lZCBjaGFyIG1yMSwgbXIyOwogCXVuc2lnbmVkIHNob3J0IGN0cjsKIAl1bnNpZ25lZCBpbnQgaiwgYmF1ZCwgcXVvdDsKLQkKKwogCS8qIFByZXBhcmUgd2hhdCB3ZSdyZSBnb25uYSB3cml0ZSAqLwogCW1yMSA9IDA7Ci0JCisKIAlzd2l0Y2ggKG5ldy0+Y19jZmxhZyAmIENTSVpFKSB7CiAJCWNhc2UgQ1M1OgltcjEgfD0gTVBDNTJ4eF9QU0NfTU9ERV81X0JJVFM7CiAJCQkJYnJlYWs7CkBAIC0yNjEsOCArMjk4LDggQEAKIAkJCU1QQzUyeHhfUFNDX01PREVfUEFST0REIDogTVBDNTJ4eF9QU0NfTU9ERV9QQVJFVkVOOwogCX0gZWxzZQogCQltcjEgfD0gTVBDNTJ4eF9QU0NfTU9ERV9QQVJOT05FOwotCQotCQorCisKIAltcjIgPSAwOwogCiAJaWYgKG5ldy0+Y19jZmxhZyAmIENTVE9QQikKQEAgLTI3Niw3ICszMTMsNyBAQAogCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgbmV3LCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsvMTYpOwogCXF1b3QgPSB1YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOwogCWN0ciA9IHF1b3QgJiAweGZmZmY7Ci0JCisKIAkvKiBHZXQgdGhlIGxvY2sgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCkBAIC0yOTAsMTQgKzMyNywxNCBAQAogCSAqIGJvb3QgZm9yIHRoZSBjb25zb2xlLCBhbGwgc3R1ZmYgaXMgbm90IHlldCByZWFkeSB0byByZWNlaXZlIGF0IHRoYXQKIAkgKiB0aW1lIGFuZCB0aGF0IGp1c3QgbWFrZXMgdGhlIGtlcm5lbCBvb3BzICovCiAJLyogd2hpbGUgKGotLSAmJiBtcGM1Mnh4X3VhcnRfaW50X3J4X2NoYXJzKHBvcnQpKTsgKi8KLQl3aGlsZSAoIShpbl9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX3N0YXR1cykgJiBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgJiYgCisJd2hpbGUgKCEoaW5fYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19zdGF0dXMpICYgTVBDNTJ4eF9QU0NfU1JfVFhFTVApICYmCiAJICAgICAgIC0taikKIAkJdWRlbGF5KDEpOwogCiAJaWYgKCFqKQogCQlwcmludGsoCUtFUk5fRVJSICJtcGM1Mnh4X3VhcnQuYzogIgogCQkJIlVuYWJsZSB0byBmbHVzaCBSWCAmIFRYIGZpZm9zIGluLXRpbWUgaW4gc2V0X3Rlcm1pb3MuIgotCQkJIlNvbWUgY2hhcnMgbWF5IGhhdmUgYmVlbiBsb3N0LlxuIiApOyAKKwkJCSJTb21lIGNoYXJzIG1heSBoYXZlIGJlZW4gbG9zdC5cbiIgKTsKIAogCS8qIFJlc2V0IHRoZSBUWCAmIFJYICovCiAJb3V0XzgoJnBzYy0+Y29tbWFuZCxNUEM1Mnh4X1BTQ19SU1RfUlgpOwpAQCAtMzA5LDcgKzM0Niw3IEBACiAJb3V0XzgoJnBzYy0+bW9kZSxtcjIpOwogCW91dF84KCZwc2MtPmN0dXIsY3RyID4+IDgpOwogCW91dF84KCZwc2MtPmN0bHIsY3RyICYgMHhmZik7Ci0JCisKIAkvKiBSZWVuYWJsZSBUWCAmIFJYICovCiAJb3V0XzgoJnBzYy0+Y29tbWFuZCxNUEM1Mnh4X1BTQ19UWF9FTkFCTEUpOwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfUlhfRU5BQkxFKTsKQEAgLTMzMiw3ICszNjksNyBAQAogCQlwb3J0LT5tZW1iYXNlID0gTlVMTDsKIAl9CiAKLQlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgTVBDNTJ4eF9QU0NfU0laRSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIHNpemVvZihzdHJ1Y3QgbXBjNTJ4eF9wc2MpKTsKIH0KIAogc3RhdGljIGludApAQCAtMzQxLDEyICszNzgsMTMgQEAKIAlpbnQgZXJyOwogCiAJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0lPUkVNQVApIC8qIE5lZWQgdG8gcmVtYXAgPyAqLwotCQlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcChwb3J0LT5tYXBiYXNlLCBNUEM1Mnh4X1BTQ19TSVpFKTsKKwkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBtcGM1Mnh4X3BzYykpOwogCiAJaWYgKCFwb3J0LT5tZW1iYXNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBNUEM1Mnh4X1BTQ19TSVpFLAorCWVyciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBzaXplb2Yoc3RydWN0IG1wYzUyeHhfcHNjKSwKIAkJCSJtcGM1Mnh4X3BzY191YXJ0IikgIT0gTlVMTCA/IDAgOiAtRUJVU1k7CiAKIAlpZiAoZXJyICYmIChwb3J0LT5mbGFncyAmIFVQRl9JT1JFTUFQKSkgewpAQCAtMzczLDcgKzQxMSw3IEBACiAKIAlpZiAoIChzZXItPmlycSAhPSBwb3J0LT5pcnEpIHx8CiAJICAgICAoc2VyLT5pb190eXBlICE9IFNFUklBTF9JT19NRU0pIHx8Ci0JICAgICAoc2VyLT5iYXVkX2Jhc2UgIT0gcG9ydC0+dWFydGNsaykgIHx8IAorCSAgICAgKHNlci0+YmF1ZF9iYXNlICE9IHBvcnQtPnVhcnRjbGspICB8fAogCSAgICAgKHNlci0+aW9tZW1fYmFzZSAhPSAodm9pZCopcG9ydC0+bWFwYmFzZSkgfHwKIAkgICAgIChzZXItPmh1YjYgIT0gMCApICkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MDQsMTEgKzQ0MiwxMSBAQAogCS52ZXJpZnlfcG9ydAk9IG1wYzUyeHhfdWFydF92ZXJpZnlfcG9ydAogfTsKIAotCQorCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qIEludGVycnVwdCBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0JCisKIHN0YXRpYyBpbmxpbmUgaW50CiBtcGM1Mnh4X3VhcnRfaW50X3J4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC00MzUsMTEgKzQ3MywxMSBAQAogCiAJCWZsYWcgPSBUVFlfTk9STUFMOwogCQlwb3J0LT5pY291bnQucngrKzsKLQkKKwogCQlpZiAoIHN0YXR1cyAmIChNUEM1Mnh4X1BTQ19TUl9QRSB8CiAJCSAgICAgICAgICAgICAgIE1QQzUyeHhfUFNDX1NSX0ZFIHwKIAkJICAgICAgICAgICAgICAgTVBDNTJ4eF9QU0NfU1JfUkIpICkgewotCQkJCisKIAkJCWlmIChzdGF0dXMgJiBNUEM1Mnh4X1BTQ19TUl9SQikgewogCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQkJdWFydF9oYW5kbGVfYnJlYWsocG9ydCk7CkBAIC00NjQsNyArNTAyLDcgQEAKIAl9CiAKIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQorCiAJcmV0dXJuIGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSAmIE1QQzUyeHhfUFNDX1NSX1JYUkRZOwogfQogCkBAIC01MDksMjUgKzU0NywyNSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgCitzdGF0aWMgaXJxcmV0dXJuX3QKIG1wYzUyeHhfdWFydF9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBkZXZfaWQ7CiAJdW5zaWduZWQgbG9uZyBwYXNzID0gSVNSX1BBU1NfTElNSVQ7CiAJdW5zaWduZWQgaW50IGtlZXBnb2luZzsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Ci0JCisKIAlzcGluX2xvY2soJnBvcnQtPmxvY2spOwotCQorCiAJLyogV2hpbGUgd2UgaGF2ZSBzdHVmZiB0byBkbywgd2UgY29udGludWUgKi8KIAlkbyB7CiAJCS8qIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcgdG8gZG8sIHdlIHN0b3AgKi8KLQkJa2VlcGdvaW5nID0gMDsgCi0JCQorCQlrZWVwZ29pbmcgPSAwOworCiAJCS8qIFJlYWQgc3RhdHVzICovCiAJCXN0YXR1cyA9IGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaXNyKTsKIAkJc3RhdHVzICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7Ci0JCQkKKwogCQkvKiBEbyB3ZSBuZWVkIHRvIHJlY2VpdmUgY2hhcnMgPyAqLwogCQkvKiBGb3IgdGhpcyBSWCBpbnRlcnJ1cHRzIG11c3QgYmUgb24gYW5kIHNvbWUgY2hhcnMgd2FpdGluZyAqLwogCQlpZiAoIHN0YXR1cyAmIE1QQzUyeHhfUFNDX0lNUl9SWFJEWSApCkBAIC01MzcsMTUgKzU3NSwxNSBAQAogCQkvKiBGb3IgdGhpcywgVFggbXVzdCBiZSByZWFkeSBhbmQgVFggaW50ZXJydXB0IGVuYWJsZWQgKi8KIAkJaWYgKCBzdGF0dXMgJiBNUEM1Mnh4X1BTQ19JTVJfVFhSRFkgKQogCQkJa2VlcGdvaW5nIHw9IG1wYzUyeHhfdWFydF9pbnRfdHhfY2hhcnMocG9ydCk7Ci0JCQorCiAJCS8qIExpbWl0IG51bWJlciBvZiBpdGVyYXRpb24gKi8KIAkJaWYgKCAhKC0tcGFzcykgKQogCQkJa2VlcGdvaW5nID0gMDsKIAogCX0gd2hpbGUgKGtlZXBnb2luZyk7Ci0JCisKIAlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7Ci0JCisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTU2MywxMyArNjAxLDE4IEBACiAJc3RydWN0IG1wYzUyeHhfcHNjIF9faW9tZW0gKnBzYyA9IFBTQyhwb3J0KTsKIAl1bnNpZ25lZCBjaGFyIG1yMTsKIAorCXByX2RlYnVnKCJtcGM1Mnh4X2NvbnNvbGVfZ2V0X29wdGlvbnMocG9ydD0lcClcbiIsIHBvcnQpOworCiAJLyogUmVhZCB0aGUgbW9kZSByZWdpc3RlcnMgKi8KIAlvdXRfOCgmcHNjLT5jb21tYW5kLE1QQzUyeHhfUFNDX1NFTF9NT0RFX1JFR18xKTsKIAltcjEgPSBpbl84KCZwc2MtPm1vZGUpOwotCQorCiAJLyogQ1R7VSxMfVIgYXJlIHdyaXRlLW9ubHkgISAqLwotCSpiYXVkID0gX19yZXMuYmlfYmF1ZHJhdGUgPwotCQlfX3Jlcy5iaV9iYXVkcmF0ZSA6IENPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFX0JBVUQ7CisJKmJhdWQgPSBDT05GSUdfU0VSSUFMX01QQzUyeHhfQ09OU09MRV9CQVVEOworI2lmICFkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisJaWYgKF9fcmVzLmJpX2JhdWRyYXRlKQorCQkqYmF1ZCA9IF9fcmVzLmJpX2JhdWRyYXRlOworI2VuZGlmCiAKIAkvKiBQYXJzZSB0aGVtICovCiAJc3dpdGNoIChtcjEgJiBNUEM1Mnh4X1BTQ19NT0RFX0JJVFNfTUFTSykgewpAQCAtNTc5LDI2ICs2MjIsMjYgQEAKIAkJY2FzZSBNUEM1Mnh4X1BTQ19NT0RFXzhfQklUUzoKIAkJZGVmYXVsdDoJCQkqYml0cyA9IDg7CiAJfQotCQorCiAJaWYgKG1yMSAmIE1QQzUyeHhfUFNDX01PREVfUEFSTk9ORSkKIAkJKnBhcml0eSA9ICduJzsKIAllbHNlCiAJCSpwYXJpdHkgPSBtcjEgJiBNUEM1Mnh4X1BTQ19NT0RFX1BBUk9ERCA/ICdvJyA6ICdlJzsKIH0KIAotc3RhdGljIHZvaWQgIAorc3RhdGljIHZvaWQKIG1wYzUyeHhfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJm1wYzUyeHhfdWFydF9wb3J0c1tjby0+aW5kZXhdOwogCXN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICpwc2MgPSBQU0MocG9ydCk7CiAJdW5zaWduZWQgaW50IGksIGo7Ci0JCisKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAlvdXRfYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19pbXIsIDApOwogCiAJLyogV2FpdCB0aGUgVFggYnVmZmVyIHRvIGJlIGVtcHR5ICovCi0JaiA9IDUwMDAwMDA7CS8qIE1heGltdW0gd2FpdCAqLwkKLQl3aGlsZSAoIShpbl9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX3N0YXR1cykgJiBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgJiYgCisJaiA9IDUwMDAwMDA7CS8qIE1heGltdW0gd2FpdCAqLworCXdoaWxlICghKGluX2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSAmIE1QQzUyeHhfUFNDX1NSX1RYRU1QKSAmJgogCSAgICAgICAtLWopCiAJCXVkZWxheSgxKTsKIApAQCAtNjA3LDEzICs2NTAsMTMgQEAKIAkJLyogTGluZSByZXR1cm4gaGFuZGxpbmcgKi8KIAkJaWYgKCpzID09ICdcbicpCiAJCQlvdXRfOCgmcHNjLT5tcGM1Mnh4X3BzY19idWZmZXJfOCwgJ1xyJyk7Ci0JCQorCiAJCS8qIFNlbmQgdGhlIGNoYXIgKi8KIAkJb3V0XzgoJnBzYy0+bXBjNTJ4eF9wc2NfYnVmZmVyXzgsICpzKTsKIAogCQkvKiBXYWl0IHRoZSBUWCBidWZmZXIgdG8gYmUgZW1wdHkgKi8KLQkJaiA9IDIwMDAwOwkvKiBNYXhpbXVtIHdhaXQgKi8JCi0JCXdoaWxlICghKGluX2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSAmIAorCQlqID0gMjAwMDA7CS8qIE1heGltdW0gd2FpdCAqLworCQl3aGlsZSAoIShpbl9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX3N0YXR1cykgJgogCQkgICAgICAgICBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgJiYgLS1qKQogCQkJdWRlbGF5KDEpOwogCX0KQEAgLTYyMiw2ICs2NjUsNyBAQAogCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2ltciwgcG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7CiB9CiAKKyNpZiAhZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQogc3RhdGljIGludCBfX2luaXQKIG1wYzUyeHhfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCiB7CkBAIC02MzQsNyArNjc4LDcgQEAKIAogCWlmIChjby0+aW5kZXggPCAwIHx8IGNvLT5pbmRleCA+PSBNUEM1Mnh4X1BTQ19NQVhOVU0pCiAJCXJldHVybiAtRUlOVkFMOwotCQorCiAJLyogQmFzaWMgcG9ydCBpbml0LiBOZWVkZWQgc2luY2Ugd2UgdXNlIHNvbWUgdWFydF8/Pz8gZnVuYyBiZWZvcmUKIAkgKiByZWFsIGluaXQgZm9yIGVhcmx5IGFjY2VzcyAqLwogCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKQEAgLTY1Niw2ICs3MDAsNzggQEAKIAlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KIAorI2Vsc2UKKworc3RhdGljIGludCBfX2luaXQKK21wYzUyeHhfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZtcGM1Mnh4X3VhcnRfcG9ydHNbY28tPmluZGV4XTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gbXBjNTJ4eF91YXJ0X25vZGVzW2NvLT5pbmRleF07CisJdW5zaWduZWQgaW50IGlwYl9mcmVxOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IHJldDsKKworCWludCBiYXVkID0gQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEVfQkFVRDsKKwlpbnQgYml0cyA9IDg7CisJaW50IHBhcml0eSA9ICduJzsKKwlpbnQgZmxvdyA9ICduJzsKKworCXByX2RlYnVnKCJtcGM1Mnh4X2NvbnNvbGVfc2V0dXAgY289JXAsIGNvLT5pbmRleD0laSwgb3B0aW9ucz0lc1xuIiwKKwkJIGNvLCBjby0+aW5kZXgsIG9wdGlvbnMpOworCisJaWYgKChjby0+aW5kZXggPCAwKSB8fCAoY28tPmluZGV4ID4gTVBDNTJ4eF9QU0NfTUFYTlVNKSkgeworCQlwcl9kZWJ1ZygiUFNDJXggb3V0IG9mIHJhbmdlXG4iLCBjby0+aW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIW5wKSB7CisJCXByX2RlYnVnKCJQU0MleCBub3QgZm91bmQgaW4gZGV2aWNlIHRyZWVcbiIsIGNvLT5pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCJDb25zb2xlIG9uIHR0eVBTQyV4IGlzICVzXG4iLAorCSAgICAgICAgIGNvLT5pbmRleCwgbXBjNTJ4eF91YXJ0X25vZGVzW2NvLT5pbmRleF0tPmZ1bGxfbmFtZSk7CisKKwkvKiBGZXRjaCByZWdpc3RlciBsb2NhdGlvbnMgKi8KKwlpZiAoKHJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKSAhPSAwKSB7CisJCXByX2RlYnVnKCJDb3VsZCBub3QgZ2V0IHJlc291cmNlcyBmb3IgUFNDJXhcbiIsIGNvLT5pbmRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogU2VhcmNoIGZvciBidXMtZnJlcXVlbmN5IHByb3BlcnR5IGluIHRoaXMgbm9kZSBvciBhIHBhcmVudCAqLworCWlmICgoaXBiX2ZyZXEgPSBtcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEobnApKSA9PSAwKSB7CisJCXByX2RlYnVnKCJDb3VsZCBub3QgZmluZCBJUEIgYnVzIGZyZXF1ZW5jeSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBCYXNpYyBwb3J0IGluaXQuIE5lZWRlZCBzaW5jZSB3ZSB1c2Ugc29tZSB1YXJ0Xz8/PyBmdW5jIGJlZm9yZQorCSAqIHJlYWwgaW5pdCBmb3IgZWFybHkgYWNjZXNzICovCisJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCXBvcnQtPnVhcnRjbGsJPSBpcGJfZnJlcSAvIDI7CisJcG9ydC0+b3BzCT0gJm1wYzUyeHhfdWFydF9vcHM7CisJcG9ydC0+bWFwYmFzZSA9IHJlcy5zdGFydDsKKwlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcChyZXMuc3RhcnQsIHNpemVvZihzdHJ1Y3QgbXBjNTJ4eF9wc2MpKTsKKwlwb3J0LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisKKwlpZiAocG9ydC0+bWVtYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCJtcGM1Mnh4LXBzYyB1YXJ0IGF0ICVseCwgbWFwcGVkIHRvICVwLCBpcnE9JXgsIGZyZXE9JWlcbiIsCisJICAgICAgICAgcG9ydC0+bWFwYmFzZSwgcG9ydC0+bWVtYmFzZSwgcG9ydC0+aXJxLCBwb3J0LT51YXJ0Y2xrKTsKKworCS8qIFNldHVwIHRoZSBwb3J0IHBhcmFtZXRlcnMgYWNjb2RpbmcgdG8gb3B0aW9ucyAqLworCWlmIChvcHRpb25zKQorCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CisJZWxzZQorCQltcGM1Mnh4X2NvbnNvbGVfZ2V0X29wdGlvbnMocG9ydCwgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CisKKwlwcl9kZWJ1ZygiU2V0dGluZyBjb25zb2xlIHBhcmFtZXRlcnM6ICVpICVpJWMxIGZsb3c9JWNcbiIsCisJICAgICAgICAgYmF1ZCwgYml0cywgcGFyaXR5LCBmbG93KTsKKworCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKHBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkgKi8KKwogCiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG1wYzUyeHhfdWFydF9kcml2ZXI7CiAKQEAgLTY2OSwxMCArNzg1LDExIEBACiAJLmRhdGEJPSAmbXBjNTJ4eF91YXJ0X2RyaXZlciwKIH07CiAKLQkKLXN0YXRpYyBpbnQgX19pbml0IAorCitzdGF0aWMgaW50IF9faW5pdAogbXBjNTJ4eF9jb25zb2xlX2luaXQodm9pZCkKIHsKKwltcGM1Mnh4X3VhcnRfb2ZfZW51bWVyYXRlKCk7CiAJcmVnaXN0ZXJfY29uc29sZSgmbXBjNTJ4eF9jb25zb2xlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTcwMCw2ICs4MTcsNyBAQAogfTsKIAogCisjaWYgIWRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogUGxhdGZvcm0gRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTcyMyw4ICs4NDEsNiBAQAogCS8qIEluaXQgdGhlIHBvcnQgc3RydWN0dXJlICovCiAJcG9ydCA9ICZtcGM1Mnh4X3VhcnRfcG9ydHNbaWR4XTsKIAotCW1lbXNldChwb3J0LCAweDAwLCBzaXplb2Yoc3RydWN0IHVhcnRfcG9ydCkpOwotCiAJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOwogCXBvcnQtPnVhcnRjbGsJPSBfX3Jlcy5iaV9pcGJmcmVxIC8gMjsgLyogTG9vayBhdCBDVExSIGRvYyAqLwogCXBvcnQtPmZpZm9zaXplCT0gNTEyOwpAQCAtNzMzLDYgKzg0OSw3IEBACiAJCQkgICggdWFydF9jb25zb2xlKHBvcnQpID8gMCA6IFVQRl9JT1JFTUFQICk7CiAJcG9ydC0+bGluZQk9IGlkeDsKIAlwb3J0LT5vcHMJPSAmbXBjNTJ4eF91YXJ0X29wczsKKwlwb3J0LT5kZXYJPSAmZGV2LT5kZXY7CiAKIAkvKiBTZWFyY2ggZm9yIElSUSBhbmQgbWFwYmFzZSAqLwogCWZvciAoaT0wIDsgaTxkZXYtPm51bV9yZXNvdXJjZXMgOyBpKyssIHJlcysrKSB7CkBAIC03NzEsNyArODg4LDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKikgcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmIChzcG9ydCkKKwlpZiAocG9ydCkKIAkJdWFydF9zdXNwZW5kX3BvcnQoJm1wYzUyeHhfdWFydF9kcml2ZXIsIHBvcnQpOwogCiAJcmV0dXJuIDA7CkBAIC03ODksNiArOTA2LDcgQEAKIH0KICNlbmRpZgogCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1wYzUyeHhfdWFydF9wbGF0Zm9ybV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG1wYzUyeHhfdWFydF9wcm9iZSwKIAkucmVtb3ZlCQk9IG1wYzUyeHhfdWFydF9yZW1vdmUsCkBAIC04MDAsNiArOTE4LDE4NCBAQAogCQkubmFtZQk9ICJtcGM1Mnh4LXBzYyIsCiAJfSwKIH07CisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkgKi8KKworCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBPRiBQbGF0Zm9ybSBEcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbXBjNTJ4eF91YXJ0X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlpbnQgaWR4ID0gLTE7CisJdW5zaWduZWQgaW50IGlwYl9mcmVxOworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IHJldDsKKworCWRldl9kYmcoJm9wLT5kZXYsICJtcGM1Mnh4X3VhcnRfcHJvYmUob3A9JXAsIG1hdGNoPSVwKVxuIiwgb3AsIG1hdGNoKTsKKworCS8qIENoZWNrIHZhbGlkaXR5ICYgcHJlc2VuY2UgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1QQzUyeHhfUFNDX01BWE5VTTsgaWR4KyspCisJCWlmIChtcGM1Mnh4X3VhcnRfbm9kZXNbaWR4XSA9PSBvcC0+bm9kZSkKKwkJCWJyZWFrOworCWlmIChpZHggPj0gTVBDNTJ4eF9QU0NfTUFYTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcl9kZWJ1ZygiRm91bmQgJXMgYXNzaWduZWQgdG8gdHR5UFNDJXhcbiIsCisJICAgICAgICAgbXBjNTJ4eF91YXJ0X25vZGVzW2lkeF0tPmZ1bGxfbmFtZSwgaWR4KTsKKworCS8qIFNlYXJjaCBmb3IgYnVzLWZyZXF1ZW5jeSBwcm9wZXJ0eSBpbiB0aGlzIG5vZGUgb3IgYSBwYXJlbnQgKi8KKwlpZiAoKGlwYl9mcmVxID0gbXBjNTJ4eF9maW5kX2lwYl9mcmVxKG9wLT5ub2RlKSkgPT0gMCkgeworCQlkZXZfZGJnKCZvcC0+ZGV2LCAiQ291bGQgbm90IGZpbmQgSVBCIGJ1cyBmcmVxdWVuY3khXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSW5pdCB0aGUgcG9ydCBzdHJ1Y3R1cmUgKi8KKwlwb3J0ID0gJm1wYzUyeHhfdWFydF9wb3J0c1tpZHhdOworCisJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCXBvcnQtPnVhcnRjbGsJPSBpcGJfZnJlcSAvIDI7CisJcG9ydC0+Zmlmb3NpemUJPSA1MTI7CisJcG9ydC0+aW90eXBlCT0gVVBJT19NRU07CisJcG9ydC0+ZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORiB8CisJCQkgICggdWFydF9jb25zb2xlKHBvcnQpID8gMCA6IFVQRl9JT1JFTUFQICk7CisJcG9ydC0+bGluZQk9IGlkeDsKKwlwb3J0LT5vcHMJPSAmbXBjNTJ4eF91YXJ0X29wczsKKwlwb3J0LT5kZXYJPSAmb3AtPmRldjsKKworCS8qIFNlYXJjaCBmb3IgSVJRIGFuZCBtYXBiYXNlICovCisJaWYgKChyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5ub2RlLCAwLCAmcmVzKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXBvcnQtPm1hcGJhc2UgPSByZXMuc3RhcnQ7CisJcG9ydC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPm5vZGUsIDApOworCisJZGV2X2RiZygmb3AtPmRldiwgIm1wYzUyeHgtcHNjIHVhcnQgYXQgJWx4LCBpcnE9JXgsIGZyZXE9JWlcbiIsCisJICAgICAgICBwb3J0LT5tYXBiYXNlLCBwb3J0LT5pcnEsIHBvcnQtPnVhcnRjbGspOworCisJaWYgKChwb3J0LT5pcnE9PU5PX0lSUSkgfHwgIXBvcnQtPm1hcGJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBQU0NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBZGQgdGhlIHBvcnQgdG8gdGhlIHVhcnQgc3ViLXN5c3RlbSAqLworCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZtcGM1Mnh4X3VhcnRfZHJpdmVyLCBwb3J0KTsKKwlpZiAoIXJldCkKKwkJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCAodm9pZCopcG9ydCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CittcGM1Mnh4X3VhcnRfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CisKKwlpZiAocG9ydCkKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJm1wYzUyeHhfdWFydF9kcml2ZXIsIHBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQKK21wYzUyeHhfdWFydF9vZl9zdXNwZW5kKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopIGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisKKwlpZiAocG9ydCkKKwkJdWFydF9zdXNwZW5kX3BvcnQoJm1wYzUyeHhfdWFydF9kcml2ZXIsIHBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21wYzUyeHhfdWFydF9vZl9yZXN1bWUoc3RydWN0IG9mX2RldmljZSAqb3ApCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopIGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisKKwlpZiAocG9ydCkKKwkJdWFydF9yZXN1bWVfcG9ydCgmbXBjNTJ4eF91YXJ0X2RyaXZlciwgcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorbXBjNTJ4eF91YXJ0X29mX2Fzc2lnbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaWR4KQoreworCWludCBmcmVlX2lkeCA9IC0xOworCWludCBpOworCisJLyogRmluZCB0aGUgZmlyc3QgZnJlZSBub2RlICovCisJZm9yIChpID0gMDsgaSA8IE1QQzUyeHhfUFNDX01BWE5VTTsgaSsrKSB7CisJCWlmIChtcGM1Mnh4X3VhcnRfbm9kZXNbaV0gPT0gTlVMTCkgeworCQkJZnJlZV9pZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gTVBDNTJ4eF9QU0NfTUFYTlVNKSkKKwkJaWR4ID0gZnJlZV9pZHg7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuOyAvKiBObyBmcmVlIHNsb3Q7IGFib3J0ICovCisKKwkvKiBJZiB0aGUgc2xvdCBpcyBhbHJlYWR5IG9jY3VwaWVkLCB0aGVuIHN3YXAgc2xvdHMgKi8KKwlpZiAobXBjNTJ4eF91YXJ0X25vZGVzW2lkeF0gJiYgKGZyZWVfaWR4ICE9IC0xKSkKKwkJbXBjNTJ4eF91YXJ0X25vZGVzW2ZyZWVfaWR4XSA9IG1wYzUyeHhfdWFydF9ub2Rlc1tpZHhdOworCW1wYzUyeHhfdWFydF9ub2Rlc1tpXSA9IG5wOworfQorCitzdGF0aWMgdm9pZAorbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSh2b2lkKQoreworCXN0YXRpYyBpbnQgZW51bV9kb25lID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHVuc2lnbmVkIGludCAqZGV2bm87CisJaW50IGk7CisKKwlpZiAoZW51bV9kb25lKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJzZXJpYWwiKSB7CisJCWlmICghb2ZfbWF0Y2hfbm9kZShtcGM1Mnh4X3VhcnRfb2ZfbWF0Y2gsIG5wKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElzIGEgcGFydGljdWxhciBkZXZpY2UgbnVtYmVyIHJlcXVlc3RlZD8gKi8KKwkJZGV2bm8gPSBnZXRfcHJvcGVydHkobnAsICJkZXZpY2Vfbm8iLCBOVUxMKTsKKwkJbXBjNTJ4eF91YXJ0X29mX2Fzc2lnbihvZl9ub2RlX2dldChucCksIGRldm5vID8gKmRldm5vIDogLTEpOworCX0KKworCWVudW1fZG9uZSA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVBDNTJ4eF9QU0NfTUFYTlVNOyBpKyspIHsKKwkJaWYgKG1wYzUyeHhfdWFydF9ub2Rlc1tpXSkKKwkJCXByX2RlYnVnKCIlcyBhc3NpZ25lZCB0byB0dHlQU0MleFxuIiwKKwkJCSAgICAgICAgIG1wYzUyeHhfdWFydF9ub2Rlc1tpXS0+ZnVsbF9uYW1lLCBpKTsKKwl9Cit9CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1wYzUyeHhfdWFydF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG1wYzUyeHhfdWFydF9vZl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJtcGM1Mnh4LXBzYy11YXJ0IiwKKwkubWF0Y2hfdGFibGUJPSBtcGM1Mnh4X3VhcnRfb2ZfbWF0Y2gsCisJLnByb2JlCQk9IG1wYzUyeHhfdWFydF9vZl9wcm9iZSwKKwkucmVtb3ZlCQk9IG1wYzUyeHhfdWFydF9vZl9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBtcGM1Mnh4X3VhcnRfb2Zfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1wYzUyeHhfdWFydF9vZl9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibXBjNTJ4eC1wc2MtdWFydCIsCisJfSwKK307CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKSAqLwogCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtODExLDIyICsxMTA3LDQ1IEBACiB7CiAJaW50IHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogTVBDNTJ4eCBQU0MgZHJpdmVyXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IE1QQzUyeHggUFNDIFVBUlQgZHJpdmVyXG4iKTsKIAotCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZtcGM1Mnh4X3VhcnRfZHJpdmVyKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtcGM1Mnh4X3VhcnRfcGxhdGZvcm1fZHJpdmVyKTsKLQkJaWYgKHJldCkKLQkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpOworCWlmICgocmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVhcnRfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCAoJWkpXG4iLAorCQkgICAgICAgX19GSUxFX18sIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIHJldDsKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisJbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSgpOworCisJcmV0ID0gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZtcGM1Mnh4X3VhcnRfb2ZfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlciBmYWlsZWQgKCVpKVxuIiwKKwkJICAgICAgIF9fRklMRV9fLCByZXQpOworCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZtcGM1Mnh4X3VhcnRfZHJpdmVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZWxzZQorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTJ4eF91YXJ0X3BsYXRmb3JtX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkICglaSlcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgcmV0KTsKKwkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmbXBjNTJ4eF91YXJ0X2RyaXZlcik7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CiBtcGM1Mnh4X3VhcnRfZXhpdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTJ4eF91YXJ0X29mX2RyaXZlcik7CisjZWxzZQogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtcGM1Mnh4X3VhcnRfcGxhdGZvcm1fZHJpdmVyKTsKKyNlbmRpZgogCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCmluZGV4IDAwZjlmZmQuLjQzMTQzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCkBAIC03MjMsNyArNzIzLDcgQEAKIAl1X2NoYXIgKmJ1ZjsKIAljaXNwYXJzZV90ICpwYXJzZTsKIAljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZjsKLQlpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisJaW50IGk7CiAKIAlERUJVRygwLCAic2VyaWFsX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKQEAgLTc0MCwxNSArNzQwLDYgQEAKIAl0dXBsZS0+VHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLT5UdXBsZURhdGFNYXggPSAyNTU7CiAJdHVwbGUtPkF0dHJpYnV0ZXMgPSAwOwotCS8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZm9ybWF0aW9uICovCi0JdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JbGFzdF9yZXQgPSBmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpOwotCWlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKIAkvKiBJcyB0aGlzIGEgY29tcGxpYW50IG11bHRpZnVuY3Rpb24gY2FyZD8gKi8KIAl0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0xPTkdMSU5LX01GQzsKQEAgLTc1NywyNyArNzQ4LDI1IEBACiAKIAkvKiBJcyB0aGlzIGEgbXVsdGlwb3J0IGNhcmQ/ICovCiAJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0JaWYgKGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSkgPT0gQ1NfU1VDQ0VTUykgewotCQlpbmZvLT5tYW5maWQgPSBwYXJzZS0+bWFuZmlkLm1hbmY7Ci0JCWluZm8tPnByb2RpZCA9IHBhcnNlLT5tYW5maWQuY2FyZDsKKwlpbmZvLT5tYW5maWQgPSBsaW5rLT5tYW5mX2lkOworCWluZm8tPnByb2RpZCA9IGxpbmstPmNhcmRfaWQ7CiAKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocXVpcmtzKTsgaSsrKQotCQkJaWYgKChxdWlya3NbaV0ubWFuZmlkID09IH4wIHx8Ci0JCQkgICAgIHF1aXJrc1tpXS5tYW5maWQgPT0gaW5mby0+bWFuZmlkKSAmJgotCQkJICAgIChxdWlya3NbaV0ucHJvZGlkID09IH4wIHx8Ci0JCQkgICAgIHF1aXJrc1tpXS5wcm9kaWQgPT0gaW5mby0+cHJvZGlkKSkgewotCQkJCWluZm8tPnF1aXJrID0gJnF1aXJrc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocXVpcmtzKTsgaSsrKQorCQlpZiAoKHF1aXJrc1tpXS5tYW5maWQgPT0gfjAgfHwKKwkJICAgICBxdWlya3NbaV0ubWFuZmlkID09IGluZm8tPm1hbmZpZCkgJiYKKwkJICAgIChxdWlya3NbaV0ucHJvZGlkID09IH4wIHx8CisJCSAgICAgcXVpcmtzW2ldLnByb2RpZCA9PSBpbmZvLT5wcm9kaWQpKSB7CisJCQlpbmZvLT5xdWlyayA9ICZxdWlya3NbaV07CisJCQlicmVhazsKKwkJfQogCiAJLyogQW5vdGhlciBjaGVjayBmb3IgZHVhbC1zZXJpYWwgY2FyZHM6IGxvb2sgZm9yIGVpdGhlciBzZXJpYWwgb3IKIAkgICBtdWx0aWZ1bmN0aW9uIGNhcmRzIHRoYXQgYXNrIGZvciBhcHByb3ByaWF0ZSBJTyBwb3J0IHJhbmdlcyAqLwogCXR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0lEOwogCWlmICgoaW5mby0+bXVsdGkgPT0gMCkgJiYKLQkgICAgKChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpIHx8Ci0JICAgICAocGFyc2UtPmZ1bmNpZC5mdW5jID09IENJU1RQTF9GVU5DSURfTVVMVEkpIHx8Ci0JICAgICAocGFyc2UtPmZ1bmNpZC5mdW5jID09IENJU1RQTF9GVU5DSURfU0VSSUFMKSkpIHsKKwkgICAgKGxpbmstPmhhc19mdW5jX2lkKSAmJgorCSAgICAoKGxpbmstPmZ1bmNfaWQgPT0gQ0lTVFBMX0ZVTkNJRF9NVUxUSSkgfHwKKwkgICAgIChsaW5rLT5mdW5jX2lkID09IENJU1RQTF9GVU5DSURfU0VSSUFMKSkpIHsKIAkJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCQlpZiAoZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSA9PSBDU19TVUNDRVNTKSB7CiAJCQlpZiAoKGNmLT5pby5ud2luID09IDEpICYmIChjZi0+aW8ud2luWzBdLmxlbiAlIDggPT0gMCkpCkBAIC04MTQsOCArODAzLDYgQEAKIAlrZnJlZShjZmdfbWVtKTsKIAlyZXR1cm4gMDsKIAotIGNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CiAgZmFpbGVkOgogCXNlcmlhbF9yZW1vdmUobGluayk7CiAJa2ZyZWUoY2ZnX21lbSk7CkBAIC05MjUsNiArOTEyLDMwIEBACiAJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyMygiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NSIsICIxLjAiLCAweDk2OTEzYTg1LCAweDhmYmU5MmFlLCAweDA4NzdiNjI3LCAiQ09NcGFkMi5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMigiUlMtQ09NIDJQIiwgMHhhZDIwYjE1NiwgIlJTLUNPTS0yUC5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQoMHgwMDEzLCAweDAwMDAsICJHTE9CRVRST1RURVIuY2lzIiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMQU4gRElHSVRBTCBTWVNURU1TIExURCwgYzE5OTcuIiwiU0VSSUFMIENBUkQ6IFNMMTAwICAxLjAwLiIsMHgxOWNhNzhhZiwweGY5NjRmNDJiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRUxBTiBESUdJVEFMIFNZU1RFTVMgTFRELCBjMTk5Ny4iLCJTRVJJQUwgQ0FSRDogU0wxMDAiLDB4MTljYTc4YWYsMHg3MWQ5OGU4MyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMQU4gRElHSVRBTCBTWVNURU1TIExURCwgYzE5OTcuIiwiU0VSSUFMIENBUkQ6IFNMMjMyICAxLjAwLiIsMHgxOWNhNzhhZiwweDY5ZmI3NDkwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRUxBTiBESUdJVEFMIFNZU1RFTVMgTFRELCBjMTk5Ny4iLCJTRVJJQUwgQ0FSRDogU0wyMzIiLDB4MTljYTc4YWYsMHhiNmJjMDIzNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMQU4gRElHSVRBTCBTWVNURU1TIExURCwgYzIwMDAuIiwiU0VSSUFMIENBUkQ6IENGMjMyIiwweDYzZjJlMGJkLDB4YjllMTc1ZDMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFTEFOIERJR0lUQUwgU1lTVEVNUyBMVEQsIGMyMDAwLiIsIlNFUklBTCBDQVJEOiBDRjIzMi01IiwweDYzZjJlMGJkLDB4ZmNlMzM0NDIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFbGFuIiwiU2VyaWFsIFBvcnQ6IENGMjMyIiwweDNiZWI4Y2YyLDB4MTcxZTcxOTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFbGFuIiwiU2VyaWFsIFBvcnQ6IENGMjMyLTUiLDB4M2JlYjhjZjIsMHgyMGRhNDI2MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0Y0MjgiLDB4M2JlYjhjZjIsMHhlYTVkZDU3ZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0Y1MDAiLDB4M2JlYjhjZjIsMHhkNzcyNTVmYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogSUMyMzIiLDB4M2JlYjhjZjIsMHg2YTcwOTkwMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wyMzIiLDB4M2JlYjhjZjIsMHgxODQzMDY3NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogWEwyMzIiLDB4M2JlYjhjZjIsMHg2ZjkzMzc2NyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0YzMzIiLDB4M2JlYjhjZjIsMHgxNmRjMWJhNyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzMzIiLDB4M2JlYjhjZjIsMHgxOTgxNmM0MSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzODUiLDB4M2JlYjhjZjIsMHg2NDExMjAyOSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwrUGFyYWxsZWwgUG9ydDogU1AyMzAiLDB4M2JlYjhjZjIsMHhkYjllNThiYyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0YzMzIiLDB4M2JlYjhjZjIsMHgxNmRjMWJhNyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzMzIiLDB4M2JlYjhjZjIsMHgxOTgxNmM0MSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzODUiLDB4M2JlYjhjZjIsMHg2NDExMjAyOSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDIsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDMsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCiAJLyogdG9vIGdlbmVyaWMgKi8KIAkvKiBQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTYwLCAweDAwMDIpLCAqLwogCS8qIFBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxNjAsIDB4MDAwMiksICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCAyMzMzNGM4Li5kODk1YTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTE2LDcgKzE2LDcgQEAKIAkgIGNvbnRyb2xsZXIgYW5kIGEgY2hpcHNlbGVjdC4gIE1vc3QgU1BJIHNsYXZlcyBkb24ndCBzdXBwb3J0CiAJICBkeW5hbWljIGRldmljZSBkaXNjb3Zlcnk7IHNvbWUgYXJlIGV2ZW4gd3JpdGUtb25seSBvciByZWFkLW9ubHkuCiAKLQkgIFNQSSBpcyB3aWRlbHkgdXNlZCBieSBtaWNyb2NvbnRvbGxlcnMgdG8gdGFsayB3aXRoIHNlbnNvcnMsCisJICBTUEkgaXMgd2lkZWx5IHVzZWQgYnkgbWljcm9jb250cm9sbGVycyB0byB0YWxrIHdpdGggc2Vuc29ycywKIAkgIGVlcHJvbSBhbmQgZmxhc2ggbWVtb3J5LCBjb2RlY3MgYW5kIHZhcmlvdXMgb3RoZXIgY29udHJvbGxlcgogCSAgY2hpcHMsIGFuYWxvZyB0byBkaWdpdGFsIChhbmQgZC10by1hKSBjb252ZXJ0ZXJzLCBhbmQgbW9yZS4KIAkgIE1NQyBhbmQgU0QgY2FyZHMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIFNQSSBwcm90b2NvbDsgYW5kIGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCmluZGV4IDM5ZDliMjAuLmMyZjYwMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYworKysgYi9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYyBiL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYwppbmRleCBkZGEwY2E0Li4xNjRhNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCkBAIC02OSwyNSArNjksMjEgQEAKIAogc3RhdGljIHZvaWQgaXhqX2dldF9zZXJpYWwoc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBsaW5rLCBJWEogKiBqKQogewotCXR1cGxlX3QgdHVwbGU7Ci0JdV9zaG9ydCBidWZbMTI4XTsKIAljaGFyICpzdHI7Ci0JaW50IGxhc3RfcmV0LCBsYXN0X2ZuLCBpLCBwbGFjZTsKKwlpbnQgaSwgcGxhY2U7CiAJREVCVUcoMCwgIml4al9nZXRfc2VyaWFsKDB4JXApXG4iLCBsaW5rKTsKLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gODA7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCXN0ciA9IChjaGFyICopIGJ1ZjsKLQlwcmludGsoIlBDTUNJQSBWZXJzaW9uICVkLiVkXG4iLCBzdHJbMF0sIHN0clsxXSk7Ci0Jc3RyICs9IDI7CisKKwlzdHIgPSBsaW5rLT5wcm9kX2lkWzBdOworCWlmICghc3RyKQorCQlnb3RvIGNzX2ZhaWxlZDsKIAlwcmludGsoIiVzIiwgc3RyKTsKLQlzdHIgPSBzdHIgKyBzdHJsZW4oc3RyKSArIDE7CisJc3RyID0gbGluay0+cHJvZF9pZFsxXTsKKwlpZiAoIXN0cikKKwkJZ290byBjc19mYWlsZWQ7CiAJcHJpbnRrKCIgJXMiLCBzdHIpOwotCXN0ciA9IHN0ciArIHN0cmxlbihzdHIpICsgMTsKKwlzdHIgPSBsaW5rLT5wcm9kX2lkWzJdOworCWlmICghc3RyKQorCQlnb3RvIGNzX2ZhaWxlZDsKIAlwbGFjZSA9IDE7CiAJZm9yIChpID0gc3RybGVuKHN0cikgLSAxOyBpID49IDA7IGktLSkgewogCQlzd2l0Y2ggKHN0cltpXSkgewpAQCAtMTIyLDcgKzExOCw5IEBACiAJCX0KIAkJcGxhY2UgPSBwbGFjZSAqIDB4MTA7CiAJfQotCXN0ciA9IHN0ciArIHN0cmxlbihzdHIpICsgMTsKKwlzdHIgPSBsaW5rLT5wcm9kX2lkWzNdOworCWlmICghc3RyKQorCQlnb3RvIGNzX2ZhaWxlZDsKIAlwcmludGsoIiB2ZXJzaW9uICVzXG4iLCBzdHIpOwogICAgICAgY3NfZmFpbGVkOgogCXJldHVybjsKQEAgLTE0NiwxMyArMTQ0LDYgQEAKIAl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAJdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKaW5kZXggYzg3MGM4MC4uYTgyMzQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKQEAgLTgzNCw4ICs4MzQsOCBAQAogCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9kZXNjID0gJmRlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJCWlmICgoZW5kcG9pbnRfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyA9PSB0YXJnZXRfYWRkcmVzcykpIHsKLQkJCQl1c2VfaXNvYyA9IChlbmRwb2ludF9kZXNjLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkJCQkJVVNCX0VORFBPSU5UX1hGRVJfSVNPQzsKKwkJCQl1c2VfaXNvYyA9CisJCQkJCXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnRfZGVzYyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IGY2YjlmN2UuLmMxMzdjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtNDAxLDkgKzQwMSw4IEBACiAJaW50IHJldCA9IC1FTk9NRU07CiAJdTggKnhmZXJfYnVmZjsKIAotCXhmZXJfYnVmZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJeGZlcl9idWZmID0ga21lbWR1cChidWZmLCBzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoeGZlcl9idWZmKSB7Ci0JCW1lbWNweSh4ZmVyX2J1ZmYsIGJ1ZmYsIHNpemUpOwogCQlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiLAogCQkJCSAgICAgIHVzYl9zbmRjdHJscGlwZSh1c2IsIDApLAogCQkJCSAgICAgIExPQURfSU5URVJOQUwsCkBAIC01OTUsMTQgKzU5NCwxMiBAQAogCXU4ICp4ZmVyX2J1ZmY7CiAJaW50IGJ5dGVzX3JlYWQ7CiAKLQl4ZmVyX2J1ZmYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXhmZXJfYnVmZiA9IGttZW1kdXAoZGF0YSwgc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF4ZmVyX2J1ZmYpIHsKIAkJdWVhX2VycihJTlNfVE9fVVNCREVWKHNjKSwgImNhbid0IGFsbG9jYXRlIHhmZXJfYnVmZlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JbWVtY3B5KHhmZXJfYnVmZiwgZGF0YSwgc2l6ZSk7Ci0KIAlyZXQgPSB1c2JfYnVsa19tc2coc2MtPnVzYl9kZXYsCiAJCQkgdXNiX3NuZGJ1bGtwaXBlKHNjLT51c2JfZGV2LCBVRUFfSURNQV9QSVBFKSwKIAkJCSB4ZmVyX2J1ZmYsIHNpemUsICZieXRlc19yZWFkLCBCVUxLX1RJTUVPVVQpOwpAQCAtNzY1LDEyICs3NjIsMTEgQEAKIAl1OCAqeGZlcl9idWZmOwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JeGZlcl9idWZmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwl4ZmVyX2J1ZmYgPSBrbWVtZHVwKGRhdGEsIHNpemUsIEdGUF9LRVJORUwpOwogCWlmICgheGZlcl9idWZmKSB7CiAJCXVlYV9lcnIoSU5TX1RPX1VTQkRFVihzYyksICJjYW4ndCBhbGxvY2F0ZSB4ZmVyX2J1ZmZcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQltZW1jcHkoeGZlcl9idWZmLCBkYXRhLCBzaXplKTsKIAogCXJldCA9IHVzYl9jb250cm9sX21zZyhzYy0+dXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHNjLT51c2JfZGV2LCAwKSwKIAkJCSAgICAgIFVDRENfU0VORF9FTkNBUFNVTEFURURfQ09NTUFORCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCA5YTkwMTJmLi5lYzM0MzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC04OTIsNyArODkyLDcgQEAKIAogCiAJLyogd29ya2Fyb3VuZCBmb3Igc3dpdGNoZWQgZW5kcG9pbnRzICovCi0JaWYgKChlcHJlYWQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAhPSBVU0JfRElSX0lOKSB7CisJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX2luKGVwcmVhZCkpIHsKIAkJLyogZGVzY3JpcHRvcnMgYXJlIHN3YXBwZWQgKi8KIAkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICp0OwogCQlkZXZfZGJnKCZpbnRmLT5kZXYsIlRoZSBkYXRhIGludGVyZmFjZSBoYXMgc3dpdGNoZWQgZW5kcG9pbnRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKaW5kZXggNmUzYjUzNS4uZjgzMjRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZwpAQCAtNzIsNiArNzIsMjEgQEAKIAogCSAgSWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgdGhpcywgc2F5IE4gaGVyZS4KIAorY29uZmlnIFVTQl9NVUxUSVRIUkVBRF9QUk9CRQorCWJvb2wgIlVTQiBNdWx0aS10aHJlYWRlZCBwcm9iZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFVTQiAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBVU0IgY29yZSB0byBzcGF3biBhIG5ldyB0aHJlYWQgZm9yCisJICBldmVyeSBVU0IgZGV2aWNlIHRoYXQgaXMgcHJvYmVkLiAgVGhpcyBjYW4gY2F1c2UgYSBzbWFsbCBzcGVlZHVwCisJICBpbiBib290IHRpbWVzIG9uIHN5c3RlbXMgd2l0aCBhIGxvdCBvZiBkaWZmZXJlbnQgVVNCIGRldmljZXMuCisKKwkgIFRoaXMgb3B0aW9uIHNob3VsZCBiZSBzYWZlIHRvIGVuYWJsZSwgYnV0IGlmIGFueSBvZGQgcHJvYmluZworCSAgcHJvYmxlbXMgYXJlIGZvdW5kLCBwbGVhc2UgZGlzYWJsZSBpdCwgb3IgZHluYW1pY2FsbHkgdHVybiBpdAorCSAgb2ZmIGluIHRoZSAvc3lzL21vZHVsZS91c2Jjb3JlL3BhcmFtZXRlcnMvbXVsdGl0aHJlYWRfcHJvYmUKKwkgIGZpbGUKKworCSAgV2hlbiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBVU0JfT1RHCiAJYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpY2VzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYwppbmRleCAzNTM4YzJmLi5lYTM5OGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYwpAQCAtMTc1LDEyICsxNzUsMTMgQEAKICkKIHsKIAljaGFyIGRpciwgdW5pdCwgKnR5cGU7Ci0JdW5zaWduZWQgaW50ZXJ2YWwsIGluLCBiYW5kd2lkdGggPSAxOworCXVuc2lnbmVkIGludGVydmFsLCBiYW5kd2lkdGggPSAxOwogCiAJaWYgKHN0YXJ0ID4gZW5kKQogCQlyZXR1cm4gc3RhcnQ7Ci0JaW4gPSAoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pOwotCWRpciA9IGluID8gJ0knIDogJ08nOworCisJZGlyID0gdXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKSA/ICdJJyA6ICdPJzsKKwogCWlmIChzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgewogCQlzd2l0Y2ggKGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSAmICgweDAzIDw8IDExKSkgewogCQljYXNlIDEgPDwgMTE6CWJhbmR3aWR0aCA9IDI7IGJyZWFrOwpAQCAtMjA0LDcgKzIwNSw3IEBACiAJCWJyZWFrOwogCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKIAkJdHlwZSA9ICJCdWxrIjsKLQkJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9ISUdIICYmICFpbikJLyogdWZyYW1lcyBwZXIgTkFLICovCisJCWlmIChzcGVlZCA9PSBVU0JfU1BFRURfSElHSCAmJiBkaXIgPT0gJ08nKSAvKiB1ZnJhbWVzIHBlciBOQUsgKi8KIAkJCWludGVydmFsID0gZGVzYy0+YkludGVydmFsOwogCQllbHNlCiAJCQlpbnRlcnZhbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggZmVkOTJiZS4uM2VkNGNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtNTYxLDcgKzU2MSw3IEBACiAJCWRldiA9IGlub2RlLT5pX3ByaXZhdGU7CiAJaWYgKCFkZXYpCiAJCWdvdG8gb3V0OwotCXJldCA9IHVzYl9hdXRvcmVzdW1lX2RldmljZShkZXYsIDEpOworCXJldCA9IHVzYl9hdXRvcmVzdW1lX2RldmljZShkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC02MDksNyArNjA5LDcgQEAKIAkJCXJlbGVhc2VpbnRmKHBzLCBpZm51bSk7CiAJfQogCWRlc3Ryb3lfYWxsX2FzeW5jKHBzKTsKLQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldiwgMSk7CisJdXNiX2F1dG9zdXNwZW5kX2RldmljZShkZXYpOwogCXVzYl91bmxvY2tfZGV2aWNlKGRldik7CiAJdXNiX3B1dF9kZXYoZGV2KTsKIAlwdXRfcGlkKHBzLT5kaXNjX3BpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCAxMTNlNDg0Li5kNmViNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCWlmIChpZCkgewogCQlkZXZfZGJnKGRldiwgIiVzIC0gZ290IGlkXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JCWVycm9yID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYsIDEpOworCQllcnJvciA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJfSBlbHNlCiAJCQlpbnRmLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX0JPVU5EOwogCi0JCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgMSk7CisJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAKIAkvKiBBdXRvcmVzdW1lIGZvciBzZXRfaW50ZXJmYWNlIGNhbGwgYmVsb3cgKi8KIAl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQllcnJvciA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LCAxKTsKKwllcnJvciA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKIAogCS8qIHJlbGVhc2UgYWxsIHVyYnMgZm9yIHRoaXMgaW50ZXJmYWNlICovCiAJdXNiX2Rpc2FibGVfaW50ZXJmYWNlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIGludGYpOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CiAKIAlpZiAoIWVycm9yKQotCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYsIDEpOworCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDgsNiArNDA4LDE2IEBACiAJICAgIChpZC0+YkRldmljZVByb3RvY29sICE9IGRldi0+ZGVzY3JpcHRvci5iRGV2aWNlUHJvdG9jb2wpKQogCQlyZXR1cm4gMDsKIAorCS8qIFRoZSBpbnRlcmZhY2UgY2xhc3MsIHN1YmNsYXNzLCBhbmQgcHJvdG9jb2wgc2hvdWxkIG5ldmVyIGJlCisJICogY2hlY2tlZCBmb3IgYSBtYXRjaCBpZiB0aGUgZGV2aWNlIGNsYXNzIGlzIFZlbmRvciBTcGVjaWZpYywKKwkgKiB1bmxlc3MgdGhlIG1hdGNoIHJlY29yZCBzcGVjaWZpZXMgdGhlIFZlbmRvciBJRC4gKi8KKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyA9PSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMgJiYKKwkJCSEoaWQtPm1hdGNoX2ZsYWdzICYgVVNCX0RFVklDRV9JRF9NQVRDSF9WRU5ET1IpICYmCisJCQkoaWQtPm1hdGNoX2ZsYWdzICYgKFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwKKwkJCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUyB8CisJCQkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfUFJPVE9DT0wpKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAoKGlkLT5tYXRjaF9mbGFncyAmIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTKSAmJgogCSAgICAoaWQtPmJJbnRlcmZhY2VDbGFzcyAhPSBpbnRmLT5kZXNjLmJJbnRlcmZhY2VDbGFzcykpCiAJCXJldHVybiAwOwpAQCAtNDc2LDcgKzQ4NiwxNyBAQAogICogbW9zdCBnZW5lcmFsOyB0aGV5IGxldCBkcml2ZXJzIGJpbmQgdG8gYW55IGludGVyZmFjZSBvbiBhCiAgKiBtdWx0aXBsZS1mdW5jdGlvbiBkZXZpY2UuICBVc2UgdGhlIFVTQl9JTlRFUkZBQ0VfSU5GTwogICogbWFjcm8sIG9yIGl0cyBzaWJsaW5ncywgdG8gbWF0Y2ggY2xhc3MtcGVyLWludGVyZmFjZSBzdHlsZQotICogZGV2aWNlcyAoYXMgcmVjb3JkZWQgaW4gYkRldmljZUNsYXNzKS4KKyAqIGRldmljZXMgKGFzIHJlY29yZGVkIGluIGJJbnRlcmZhY2VDbGFzcykuCisgKgorICogTm90ZSB0aGF0IGFuIGVudHJ5IGNyZWF0ZWQgYnkgVVNCX0lOVEVSRkFDRV9JTkZPIHdvbid0IG1hdGNoCisgKiBhbnkgaW50ZXJmYWNlIGlmIHRoZSBkZXZpY2UgY2xhc3MgaXMgc2V0IHRvIFZlbmRvci1TcGVjaWZpYy4KKyAqIFRoaXMgaXMgZGVsaWJlcmF0ZTsgYWNjb3JkaW5nIHRvIHRoZSBVU0Igc3BlYyB0aGUgbWVhbmluZ3Mgb2YKKyAqIHRoZSBpbnRlcmZhY2UgY2xhc3Mvc3ViY2xhc3MvcHJvdG9jb2wgZm9yIHRoZXNlIGRldmljZXMgYXJlIGFsc28KKyAqIHZlbmRvci1zcGVjaWZpYywgYW5kIGhlbmNlIG1hdGNoaW5nIGFnYWluc3QgYSBzdGFuZGFyZCBwcm9kdWN0CisgKiBjbGFzcyB3b3VsZG4ndCB3b3JrIGFueXdheS4gIElmIHlvdSByZWFsbHkgd2FudCB0byB1c2UgYW4KKyAqIGludGVyZmFjZS1iYXNlZCBtYXRjaCBmb3Igc3VjaCBhIGRldmljZSwgY3JlYXRlIGEgbWF0Y2ggcmVjb3JkCisgKiB0aGF0IGFsc28gc3BlY2lmaWVzIHRoZSB2ZW5kb3IgSUQuICAoVW5mb3J1bmF0ZWx5IHRoZXJlIGlzbid0IGEKKyAqIHN0YW5kYXJkIG1hY3JvIGZvciBjcmVhdGluZyByZWNvcmRzIGxpa2UgdGhpcy4pCiAgKgogICogV2l0aGluIHRob3NlIGdyb3VwcywgcmVtZW1iZXIgdGhhdCBub3QgYWxsIGNvbWJpbmF0aW9ucyBhcmUKICAqIG1lYW5pbmdmdWwuICBGb3IgZXhhbXBsZSwgZG9uJ3QgZ2l2ZSBhIHByb2R1Y3QgdmVyc2lvbiByYW5nZQpAQCAtNTA1LDcgKzUyNSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUodXNiX21hdGNoX2lkKTsKIAotaW50IHVzYl9kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQorc3RhdGljIGludCB1c2JfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAkvKiBkZXZpY2VzIGFuZCBpbnRlcmZhY2VzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgKi8KIAlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7CkBAIC03OTAsNyArODEwLDcgQEAKICNpZmRlZiBDT05GSUdfUE0KIAogLyogQ2FsbGVyIGhhcyBsb2NrZWQgdWRldidzIHBtX211dGV4ICovCi1zdGF0aWMgaW50IHN1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQorc3RhdGljIGludCB1c2Jfc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyCSp1ZHJpdmVyOwogCWludAkJCQlzdGF0dXMgPSAwOwpAQCAtODE3LDcgKzgzNyw3IEBACiB9CiAKIC8qIENhbGxlciBoYXMgbG9ja2VkIHVkZXYncyBwbV9tdXRleCAqLwotc3RhdGljIGludCByZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCB1c2JfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIJKnVkcml2ZXI7CiAJaW50CQkJCXN0YXR1cyA9IDA7CkBAIC04NDMsNyArODYzLDcgQEAKIH0KIAogLyogQ2FsbGVyIGhhcyBsb2NrZWQgaW50ZidzIHVzYl9kZXZpY2UncyBwbSBtdXRleCAqLwotc3RhdGljIGludCBzdXNwZW5kX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1zZykKK3N0YXRpYyBpbnQgdXNiX3N1c3BlbmRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7CiAJaW50CQkJc3RhdHVzID0gMDsKQEAgLTg4MCw3ICs5MDAsNyBAQAogfQogCiAvKiBDYWxsZXIgaGFzIGxvY2tlZCBpbnRmJ3MgdXNiX2RldmljZSdzIHBtX211dGV4ICovCi1zdGF0aWMgaW50IHJlc3VtZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW50IHVzYl9yZXN1bWVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7CiAJaW50CQkJc3RhdHVzID0gMDsKQEAgLTkyMCw2ICs5NDAsNDQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisjaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECisKKy8qIEludGVybmFsIHJvdXRpbmUgdG8gY2hlY2sgd2hldGhlciB3ZSBtYXkgYXV0b3N1c3BlbmQgYSBkZXZpY2UuICovCitzdGF0aWMgaW50IGF1dG9zdXNwZW5kX2NoZWNrKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCWludAkJCWk7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CisKKwkvKiBGb3IgYXV0b3N1c3BlbmQsIGZhaWwgZmFzdCBpZiBhbnl0aGluZyBpcyBpbiB1c2UuCisJICogQWxzbyBmYWlsIGlmIGFueSBpbnRlcmZhY2VzIHJlcXVpcmUgcmVtb3RlIHdha2V1cCBidXQgaXQKKwkgKiBpc24ndCBhdmFpbGFibGUuICovCisJdWRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IGRldmljZV9tYXlfd2FrZXVwKCZ1ZGV2LT5kZXYpOworCWlmICh1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKQorCQlyZXR1cm4gLUVCVVNZOworCWlmICh1ZGV2LT5hY3Rjb25maWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CisJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07CisJCQlpZiAoIWlzX2FjdGl2ZShpbnRmKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpbnRmLT5wbV91c2FnZV9jbnQgPiAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlpZiAoaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCAmJgorCQkJCQkhdWRldi0+ZG9fcmVtb3RlX3dha2V1cCkgeworCQkJCWRldl9kYmcoJnVkZXYtPmRldiwgInJlbW90ZSB3YWtldXAgbmVlZGVkICIKKwkJCQkJCSJmb3IgYXV0b3N1c3BlbmRcbiIpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2RlZmluZSBhdXRvc3VzcGVuZF9jaGVjayh1ZGV2KQkJMAorCisjZW5kaWYKKwogLyoqCiAgKiB1c2Jfc3VzcGVuZF9ib3RoIC0gc3VzcGVuZCBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCiAgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gc3VzcGVuZApAQCAtOTcxLDUyICsxMDI5LDM0IEBACiAKIAl1ZGV2LT5kb19yZW1vdGVfd2FrZXVwID0gZGV2aWNlX21heV93YWtldXAoJnVkZXYtPmRldik7CiAKLQkvKiBGb3IgYXV0b3N1c3BlbmQsIGZhaWwgZmFzdCBpZiBhbnl0aGluZyBpcyBpbiB1c2UuCi0JICogQWxzbyBmYWlsIGlmIGFueSBpbnRlcmZhY2VzIHJlcXVpcmUgcmVtb3RlIHdha2V1cCBidXQgaXQKLQkgKiBpc24ndCBhdmFpbGFibGUuICovCiAJaWYgKHVkZXYtPmF1dG9fcG0pIHsKLQkJaWYgKHVkZXYtPnBtX3VzYWdlX2NudCA+IDApCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlpZiAodWRldi0+YWN0Y29uZmlnKSB7Ci0JCQlmb3IgKDsgaSA8IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7Ci0JCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJCWlmICghaXNfYWN0aXZlKGludGYpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoaW50Zi0+cG1fdXNhZ2VfY250ID4gMCkKLQkJCQkJcmV0dXJuIC1FQlVTWTsKLQkJCQlpZiAoaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCAmJgotCQkJCQkJIXVkZXYtPmRvX3JlbW90ZV93YWtldXApIHsKLQkJCQkJZGV2X2RiZygmdWRldi0+ZGV2LAotCSJyZW1vdGUgd2FrZXVwIG5lZWRlZCBmb3IgYXV0b3N1c3BlbmRcbiIpOwotCQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCQkJfQotCQkJfQotCQkJaSA9IDA7Ci0JCX0KKwkJc3RhdHVzID0gYXV0b3N1c3BlbmRfY2hlY2sodWRldik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAkvKiBTdXNwZW5kIGFsbCB0aGUgaW50ZXJmYWNlcyBhbmQgdGhlbiB1ZGV2IGl0c2VsZiAqLwogCWlmICh1ZGV2LT5hY3Rjb25maWcpIHsKIAkJZm9yICg7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJc3RhdHVzID0gc3VzcGVuZF9pbnRlcmZhY2UoaW50ZiwgbXNnKTsKKwkJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2ludGVyZmFjZShpbnRmLCBtc2cpOwogCQkJaWYgKHN0YXR1cyAhPSAwKQogCQkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gc3VzcGVuZF9kZXZpY2UodWRldiwgbXNnKTsKKwkJc3RhdHVzID0gdXNiX3N1c3BlbmRfZGV2aWNlKHVkZXYsIG1zZyk7CiAKIAkvKiBJZiB0aGUgc3VzcGVuZCBmYWlsZWQsIHJlc3VtZSBpbnRlcmZhY2VzIHRoYXQgZGlkIGdldCBzdXNwZW5kZWQgKi8KIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJd2hpbGUgKC0taSA+PSAwKSB7CiAJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQlyZXN1bWVfaW50ZXJmYWNlKGludGYpOworCQkJdXNiX3Jlc3VtZV9pbnRlcmZhY2UoaW50Zik7CiAJCX0KIAogCS8qIElmIHRoZSBzdXNwZW5kIHN1Y2NlZWRlZCwgcHJvcGFnYXRlIGl0IHVwIHRoZSB0cmVlICovCiAJfSBlbHNlIGlmIChwYXJlbnQpCi0JCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UocGFyZW50LCAwKTsKKwkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShwYXJlbnQpOwogCiAJLy8gZGV2X2RiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xMDY0LDkgKzExMDQsMjUgQEAKIAkvKiBQcm9wYWdhdGUgdGhlIHJlc3VtZSB1cCB0aGUgdHJlZSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKIAkJaWYgKHBhcmVudCkgewotCQkJdXNiX3BtX2xvY2socGFyZW50KTsKLQkJCXBhcmVudC0+YXV0b19wbSA9IDE7Ci0JCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgocGFyZW50KTsKKwkJCXN0YXR1cyA9IHVzYl9hdXRvcmVzdW1lX2RldmljZShwYXJlbnQpOworCQkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCQkJaWYgKHN0YXR1cykgeworCQkJCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHBhcmVudCk7CisKKwkJCQkJLyogSXQncyBwb3NzaWJsZSB1c2JfcmVzdW1lX2RldmljZSgpCisJCQkJCSAqIGZhaWxlZCBhZnRlciB0aGUgcG9ydCB3YXMKKwkJCQkJICogdW5zdXNwZW5kZWQsIGNhdXNpbmcgdWRldiB0byBiZQorCQkJCQkgKiBsb2dpY2FsbHkgZGlzY29ubmVjdGVkLiAgV2UgZG9uJ3QKKwkJCQkJICogd2FudCB1c2JfZGlzY29ubmVjdCgpIHRvIGF1dG9zdXNwZW5kCisJCQkJCSAqIHRoZSBwYXJlbnQgYWdhaW4sIHNvIHRlbGwgaXQgdGhhdAorCQkJCQkgKiB1ZGV2IGRpc2Nvbm5lY3RlZCB3aGlsZSBzdGlsbAorCQkJCQkgKiBzdXNwZW5kZWQuICovCisJCQkJCWlmICh1ZGV2LT5zdGF0ZSA9PQorCQkJCQkJCVVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKKwkJCQkJCXVkZXYtPmRpc2Nvbl9zdXNwZW5kZWQgPSAxOworCQkJCX0KKwkJCX0KIAkJfSBlbHNlIHsKIAogCQkJLyogV2UgY2FuJ3QgcHJvZ2FnYXRlIGJleW9uZCB0aGUgVVNCIHN1YnN5c3RlbSwKQEAgLTEwNzUsMjQgKzExMzEsMjAgQEAKIAkJCWlmICh1ZGV2LT5kZXYucGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPQogCQkJCQlQTV9FVkVOVF9PTikKIAkJCQlzdGF0dXMgPSAtRUhPU1RVTlJFQUNIOwotCQl9Ci0JCWlmIChzdGF0dXMgPT0gMCkKLQkJCXN0YXR1cyA9IHJlc3VtZV9kZXZpY2UodWRldik7Ci0JCWlmIChwYXJlbnQpCi0JCQl1c2JfcG1fdW5sb2NrKHBhcmVudCk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldik7CisgCQl9CiAJfSBlbHNlIHsKIAogCQkvKiBOZWVkZWQgb25seSBmb3Igc2V0dGluZyB1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQKIAkJICogYW5kIGZvciBwb3NzaWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZS4gKi8KLQkJc3RhdHVzID0gcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldik7CiAJfQogCi0JLyogTm93IHRoZSBwYXJlbnQgd29uJ3Qgc3VzcGVuZCB1bnRpbCB3ZSBhcmUgZmluaXNoZWQgKi8KLQogCWlmIChzdGF0dXMgPT0gMCAmJiB1ZGV2LT5hY3Rjb25maWcpIHsKIAkJZm9yIChpID0gMDsgaSA8IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CiAJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQlyZXN1bWVfaW50ZXJmYWNlKGludGYpOworCQkJdXNiX3Jlc3VtZV9pbnRlcmZhY2UoaW50Zik7CiAJCX0KIAl9CiAKQEAgLTExMDIsMzkgKzExNTQsNTMgQEAKIAogI2lmZGVmIENPTkZJR19VU0JfU1VTUEVORAogCisvKiBJbnRlcm5hbCByb3V0aW5lIHRvIGFkanVzdCBhIGRldmljZSdzIHVzYWdlIGNvdW50ZXIgYW5kIGNoYW5nZQorICogaXRzIGF1dG9zdXNwZW5kIHN0YXRlLgorICovCitzdGF0aWMgaW50IHVzYl9hdXRvcG1fZG9fZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5jX3VzYWdlX2NudCkKK3sKKwlpbnQJc3RhdHVzID0gMDsKKworCXVzYl9wbV9sb2NrKHVkZXYpOworCXVkZXYtPnBtX3VzYWdlX2NudCArPSBpbmNfdXNhZ2VfY250OworCVdBUk5fT04odWRldi0+cG1fdXNhZ2VfY250IDwgMCk7CisJaWYgKGluY191c2FnZV9jbnQgPj0gMCAmJiB1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKSB7CisJCXVkZXYtPmF1dG9fcG0gPSAxOworCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCXVkZXYtPnBtX3VzYWdlX2NudCAtPSBpbmNfdXNhZ2VfY250OworCX0gZWxzZSBpZiAoaW5jX3VzYWdlX2NudCA8PSAwICYmIGF1dG9zdXNwZW5kX2NoZWNrKHVkZXYpID09IDApCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvc3VzcGVuZCwKKwkJCQlVU0JfQVVUT1NVU1BFTkRfREVMQVkpOworCXVzYl9wbV91bmxvY2sodWRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoqCiAgKiB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlIC0gZGVsYXllZCBhdXRvc3VzcGVuZCBvZiBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCiAgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gYXV0b3N1c3BlbmQKLSAqIEBkZWNfdXNhZ2VfY250OiBmbGFnIHRvIGRlY3JlbWVudCBAdWRldidzIFBNLXVzYWdlIGNvdW50ZXIKICAqCiAgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgY29yZSBzdWJzeXN0ZW0gaXMgZmluaXNoZWQgdXNpbmcKICAqIEB1ZGV2IGFuZCB3YW50cyB0byBhbGxvdyBpdCB0byBhdXRvc3VzcGVuZC4gIEV4YW1wbGVzIHdvdWxkIGJlIHdoZW4KICAqIEB1ZGV2J3MgZGV2aWNlIGZpbGUgaW4gdXNiZnMgaXMgY2xvc2VkIG9yIGFmdGVyIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuCiAgKgotICogQGRlY191c2FnZV9jbnQgc2hvdWxkIGJlIDEgaWYgdGhlIHN1YnN5c3RlbSBwcmV2aW91c2x5IGluY3JlbWVudGVkCi0gKiBAdWRldidzIHVzYWdlIGNvdW50ZXIgKHN1Y2ggYXMgYnkgcGFzc2luZyAxIHRvIHVzYl9hdXRvcmVzdW1lX2RldmljZSk7Ci0gKiBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIDAuCi0gKgotICogSWYgdGhlIHVzYWdlIGNvdW50ZXIgZm9yIEB1ZGV2IG9yIGFueSBvZiBpdHMgYWN0aXZlIGludGVyZmFjZXMgaXMgZ3JlYXRlcgotICogdGhhbiAwLCB0aGUgYXV0b3N1c3BlbmQgcmVxdWVzdCB3aWxsIG5vdCBiZSBxdWV1ZWQuICAoSWYgYW4gaW50ZXJmYWNlCi0gKiBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBhdXRvc3VzcGVuZCB0aGVuIGl0cyB1c2FnZSBjb3VudGVyIGlzIHBlcm1hbmVudGx5Ci0gKiBwb3NpdGl2ZS4pICBMaWtld2lzZSwgaWYgYW4gaW50ZXJmYWNlIGRyaXZlciByZXF1aXJlcyByZW1vdGUtd2FrZXVwCi0gKiBjYXBhYmlsaXR5IGR1cmluZyBhdXRvc3VzcGVuZCBidXQgcmVtb3RlIHdha2V1cCBpcyBkaXNhYmxlZCwgdGhlCi0gKiBhdXRvc3VzcGVuZCB3aWxsIGZhaWwuCisgKiBAdWRldidzIHVzYWdlIGNvdW50ZXIgaXMgZGVjcmVtZW50ZWQuICBJZiBpdCBvciBhbnkgb2YgdGhlIHVzYWdlIGNvdW50ZXJzCisgKiBmb3IgYW4gYWN0aXZlIGludGVyZmFjZSBpcyBncmVhdGVyIHRoYW4gMCwgbm8gYXV0b3N1c3BlbmQgcmVxdWVzdCB3aWxsIGJlCisgKiBxdWV1ZWQuICAoSWYgYW4gaW50ZXJmYWNlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGF1dG9zdXNwZW5kIHRoZW4gaXRzCisgKiB1c2FnZSBjb3VudGVyIGlzIHBlcm1hbmVudGx5IHBvc2l0aXZlLikgIEZ1cnRoZXJtb3JlLCBpZiBhbiBpbnRlcmZhY2UKKyAqIGRyaXZlciByZXF1aXJlcyByZW1vdGUtd2FrZXVwIGNhcGFiaWxpdHkgZHVyaW5nIGF1dG9zdXNwZW5kIGJ1dCByZW1vdGUKKyAqIHdha2V1cCBpcyBkaXNhYmxlZCwgdGhlIGF1dG9zdXNwZW5kIHdpbGwgZmFpbC4KICAqCiAgKiBPZnRlbiB0aGUgY2FsbGVyIHdpbGwgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLCBidXQgdGhpcyBpcyBub3QKICAqIG5lY2Vzc2FyeS4KICAqCiAgKiBUaGlzIHJvdXRpbmUgY2FuIHJ1biBvbmx5IGluIHByb2Nlc3MgY29udGV4dC4KICAqLwotdm9pZCB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgZGVjX3VzYWdlX2NudCkKK3ZvaWQgdXNiX2F1dG9zdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKLQl1c2JfcG1fbG9jayh1ZGV2KTsKLQl1ZGV2LT5wbV91c2FnZV9jbnQgLT0gZGVjX3VzYWdlX2NudDsKLQlpZiAodWRldi0+cG1fdXNhZ2VfY250IDw9IDApCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvc3VzcGVuZCwKLQkJCQlVU0JfQVVUT1NVU1BFTkRfREVMQVkpOwotCXVzYl9wbV91bmxvY2sodWRldik7CisJaW50CXN0YXR1czsKKworCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIC0xKTsKIAkvLyBkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlczogY250ICVkXG4iLAogCS8vCQlfX0ZVTkNUSU9OX18sIHVkZXYtPnBtX3VzYWdlX2NudCk7CiB9CkBAIC0xMTQyLDQ0ICsxMjA4LDU5IEBACiAvKioKICAqIHVzYl9hdXRvcmVzdW1lX2RldmljZSAtIGltbWVkaWF0ZWx5IGF1dG9yZXN1bWUgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcwogICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIGF1dG9yZXN1bWUKLSAqIEBpbmNfdXNhZ2VfY250OiBmbGFnIHRvIGluY3JlbWVudCBAdWRldidzIFBNLXVzYWdlIGNvdW50ZXIKICAqCiAgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgY29yZSBzdWJzeXN0ZW0gd2FudHMgdG8gdXNlIEB1ZGV2Ci0gKiBhbmQgbmVlZHMgdG8gZ3VhcmFudGVlIHRoYXQgaXQgaXMgbm90IHN1c3BlbmRlZC4gIEluIGFkZGl0aW9uLCB0aGUKLSAqIGNhbGxlciBjYW4gcHJldmVudCBAdWRldiBmcm9tIGJlaW5nIGF1dG9zdXNwZW5kZWQgc3Vic2VxdWVudGx5LiAgKE5vdGUKLSAqIHRoYXQgdGhpcyB3aWxsIG5vdCBwcmV2ZW50IHN1c3BlbmQgZXZlbnRzIG9yaWdpbmF0aW5nIGluIHRoZSBQTSBjb3JlLikKLSAqIEV4YW1wbGVzIHdvdWxkIGJlIHdoZW4gQHVkZXYncyBkZXZpY2UgZmlsZSBpbiB1c2JmcyBpcyBvcGVuZWQgKGF1dG9zdXNwZW5kCi0gKiBzaG91bGQgYmUgcHJldmVudGVkIHVudGlsIHRoZSBmaWxlIGlzIGNsb3NlZCkgb3Igd2hlbiBhIHJlbW90ZS13YWtldXAKLSAqIHJlcXVlc3QgaXMgcmVjZWl2ZWQgKGxhdGVyIGF1dG9zdXNwZW5kcyBzaG91bGQgbm90IGJlIHByZXZlbnRlZCkuCisgKiBhbmQgbmVlZHMgdG8gZ3VhcmFudGVlIHRoYXQgaXQgaXMgbm90IHN1c3BlbmRlZC4gIE5vIGF1dG9zdXNwZW5kIHdpbGwKKyAqIG9jY3VyIHVudGlsIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2UgaXMgY2FsbGVkLiAgKE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90CisgKiBwcmV2ZW50IHN1c3BlbmQgZXZlbnRzIG9yaWdpbmF0aW5nIGluIHRoZSBQTSBjb3JlLikgIEV4YW1wbGVzIHdvdWxkIGJlCisgKiB3aGVuIEB1ZGV2J3MgZGV2aWNlIGZpbGUgaW4gdXNiZnMgaXMgb3BlbmVkIG9yIHdoZW4gYSByZW1vdGUtd2FrZXVwCisgKiByZXF1ZXN0IGlzIHJlY2VpdmVkLgogICoKLSAqIEBpbmNfdXNhZ2VfY250IHNob3VsZCBiZSAxIHRvIGluY3JlbWVudCBAdWRldidzIHVzYWdlIGNvdW50ZXIgYW5kIHByZXZlbnQKLSAqIGF1dG9zdXNwZW5kcy4gIFRoaXMgcHJldmVudGlvbiB3aWxsIHBlcnNpc3QgdW50aWwgdGhlIHVzYWdlIGNvdW50ZXIgaXMKLSAqIGRlY3JlbWVudGVkIGFnYWluIChzdWNoIGFzIGJ5IHBhc3NpbmcgMSB0byB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKS4KLSAqIE90aGVyd2lzZSBAaW5jX3VzYWdlX2NudCBzaG91bGQgYmUgMCB0byBsZWF2ZSB0aGUgdXNhZ2UgY291bnRlciB1bmNoYW5nZWQuCi0gKiBSZWdhcmRsZXNzLCBpZiB0aGUgYXV0b3Jlc3VtZSBmYWlscyB0aGVuIHRoZSB1c2FnZSBjb3VudGVyIGlzIG5vdAotICogaW5jcmVtZW50ZWQuCisgKiBAdWRldidzIHVzYWdlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgdG8gcHJldmVudCBzdWJzZXF1ZW50IGF1dG9zdXNwZW5kcy4KKyAqIEhvd2V2ZXIgaWYgdGhlIGF1dG9yZXN1bWUgZmFpbHMgdGhlbiB0aGUgdXNhZ2UgY291bnRlciBpcyByZS1kZWNyZW1lbnRlZC4KICAqCiAgKiBPZnRlbiB0aGUgY2FsbGVyIHdpbGwgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLCBidXQgdGhpcyBpcyBub3QKICAqIG5lY2Vzc2FyeSAoYW5kIGF0dGVtcHRpbmcgaXQgbWlnaHQgY2F1c2UgZGVhZGxvY2spLgogICoKICAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgogICovCi1pbnQgdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5jX3VzYWdlX2NudCkKK2ludCB1c2JfYXV0b3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJaW50CXN0YXR1czsKIAotCXVzYl9wbV9sb2NrKHVkZXYpOwotCXVkZXYtPnBtX3VzYWdlX2NudCArPSBpbmNfdXNhZ2VfY250OwotCXVkZXYtPmF1dG9fcG0gPSAxOwotCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXVkZXYtPnBtX3VzYWdlX2NudCAtPSBpbmNfdXNhZ2VfY250OwotCXVzYl9wbV91bmxvY2sodWRldik7CisJc3RhdHVzID0gdXNiX2F1dG9wbV9kb19kZXZpY2UodWRldiwgMSk7CiAJLy8gZGV2X2RiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCiAJLy8JCV9fRlVOQ1RJT05fXywgc3RhdHVzLCB1ZGV2LT5wbV91c2FnZV9jbnQpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qIEludGVybmFsIHJvdXRpbmUgdG8gYWRqdXN0IGFuIGludGVyZmFjZSdzIHVzYWdlIGNvdW50ZXIgYW5kIGNoYW5nZQorICogaXRzIGRldmljZSdzIGF1dG9zdXNwZW5kIHN0YXRlLgorICovCitzdGF0aWMgaW50IHVzYl9hdXRvcG1fZG9faW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQlpbnQgaW5jX3VzYWdlX2NudCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50CQkJc3RhdHVzID0gMDsKKworCXVzYl9wbV9sb2NrKHVkZXYpOworCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKQorCQlzdGF0dXMgPSAtRU5PREVWOworCWVsc2UgeworCQlpbnRmLT5wbV91c2FnZV9jbnQgKz0gaW5jX3VzYWdlX2NudDsKKwkJaWYgKGluY191c2FnZV9jbnQgPj0gMCAmJiBpbnRmLT5wbV91c2FnZV9jbnQgPiAwKSB7CisJCQl1ZGV2LT5hdXRvX3BtID0gMTsKKwkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKKwkJCWlmIChzdGF0dXMgIT0gMCkKKwkJCQlpbnRmLT5wbV91c2FnZV9jbnQgLT0gaW5jX3VzYWdlX2NudDsKKwkJfSBlbHNlIGlmIChpbmNfdXNhZ2VfY250IDw9IDAgJiYgYXV0b3N1c3BlbmRfY2hlY2sodWRldikgPT0gMCkKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvc3VzcGVuZCwKKwkJCQkJVVNCX0FVVE9TVVNQRU5EX0RFTEFZKTsKKwl9CisJdXNiX3BtX3VubG9jayh1ZGV2KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKioKICAqIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSAtIGRlY3JlbWVudCBhIFVTQiBpbnRlcmZhY2UncyBQTS11c2FnZSBjb3VudGVyCiAgKiBAaW50ZjogdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2UgY291bnRlciBzaG91bGQgYmUgZGVjcmVtZW50ZWQKQEAgLTEyMTMsMTcgKzEyOTQsMTEgQEAKICAqLwogdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UJKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludAlzdGF0dXM7CiAKLQl1c2JfcG1fbG9jayh1ZGV2KTsKLQlpZiAoaW50Zi0+Y29uZGl0aW9uICE9IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCAmJgotCQkJLS1pbnRmLT5wbV91c2FnZV9jbnQgPD0gMCkgewotCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCi0JCQkJVVNCX0FVVE9TVVNQRU5EX0RFTEFZKTsKLQl9Ci0JdXNiX3BtX3VubG9jayh1ZGV2KTsKLQkvLyBkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogY250ICVkXG4iLAotCS8vCQlfX0ZVTkNUSU9OX18sIGludGYtPnBtX3VzYWdlX2NudCk7CisJc3RhdHVzID0gdXNiX2F1dG9wbV9kb19pbnRlcmZhY2UoaW50ZiwgLTEpOworCS8vIGRldl9kYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAorCS8vCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSk7CiAKQEAgLTEyNjAsMjYgKzEzMzUsMzcgQEAKICAqLwogaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JaW50CQkJc3RhdHVzOworCWludAlzdGF0dXM7CiAKLQl1c2JfcG1fbG9jayh1ZGV2KTsKLQlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQllbHNlIHsKLQkJKytpbnRmLT5wbV91c2FnZV9jbnQ7Ci0JCXVkZXYtPmF1dG9fcG0gPSAxOwotCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7Ci0JCWlmIChzdGF0dXMgIT0gMCkKLQkJCS0taW50Zi0+cG1fdXNhZ2VfY250OwotCX0KLQl1c2JfcG1fdW5sb2NrKHVkZXYpOworCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9faW50ZXJmYWNlKGludGYsIDEpOwogCS8vIGRldl9kYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAogCS8vCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKTsKIAorLyoqCisgKiB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UgLSBzZXQgYSBVU0IgaW50ZXJmYWNlJ3MgYXV0b3N1c3BlbmQgc3RhdGUKKyAqIEBpbnRmOiB0aGUgdXNiX2ludGVyZmFjZSB3aG9zZSBzdGF0ZSBzaG91bGQgYmUgc2V0CisgKgorICogVGhpcyByb3V0aW5lIHNldHMgdGhlIGF1dG9zdXNwZW5kIHN0YXRlIG9mIEBpbnRmJ3MgZGV2aWNlIGFjY29yZGluZworICogdG8gQGludGYncyB1c2FnZSBjb3VudGVyLCB3aGljaCB0aGUgY2FsbGVyIG11c3QgaGF2ZSBzZXQgcHJldmlvdXNseS4KKyAqIElmIHRoZSBjb3VudGVyIGlzIDw9IDAsIHRoZSBkZXZpY2UgaXMgYXV0b3N1c3BlbmRlZCAoaWYgaXQgaXNuJ3QKKyAqIGFscmVhZHkgc3VzcGVuZGVkIGFuZCBpZiBub3RoaW5nIGVsc2UgcHJldmVudHMgdGhlIGF1dG9zdXNwZW5kKS4gIElmCisgKiB0aGUgY291bnRlciBpcyA+IDAsIHRoZSBkZXZpY2UgaXMgYXV0b3Jlc3VtZWQgKGlmIGl0IGlzbid0IGFscmVhZHkKKyAqIGF3YWtlKS4KKyAqLworaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQJc3RhdHVzOworCisJc3RhdHVzID0gdXNiX2F1dG9wbV9kb19pbnRlcmZhY2UoaW50ZiwgMCk7CisJLy8gZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCisJLy8JCV9fRlVOQ1RJT05fXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UpOworCiAjZW5kaWYgLyogQ09ORklHX1VTQl9TVVNQRU5EICovCiAKIHN0YXRpYyBpbnQgdXNiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYwppbmRleCAzYjJkMTM3Li5jNTA1Yjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCkBAIC0xMCwxNSArMTAsMjAgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlICJ1c2IuaCIKIAotLyogZW5kcG9pbnQgc3R1ZmYgKi8KKyNkZWZpbmUgTUFYX0VORFBPSU5UX01JTk9SUyAoNjQqMTI4KjMyKQorc3RhdGljIGludCB1c2JfZW5kcG9pbnRfbWFqb3I7CitzdGF0aWMgREVGSU5FX0lEUihlbmRwb2ludF9pZHIpOwogCiBzdHJ1Y3QgZXBfZGV2aWNlIHsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2M7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IGRldmljZSBkZXY7CisJaW50IG1pbm9yOwogfTsKICNkZWZpbmUgdG9fZXBfZGV2aWNlKF9kZXYpIFwKIAljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGVwX2RldmljZSwgZGV2KQpAQCAtMTUyLDYgKzE1Nyw1NSBAQAogCS5hdHRycyA9IGVwX2Rldl9hdHRycywKIH07CiAKK3N0YXRpYyBpbnQgdXNiX2VuZHBvaW50X21ham9yX2luaXQodm9pZCkKK3sKKwlkZXZfdCBkZXY7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZkZXYsIDAsIE1BWF9FTkRQT0lOVF9NSU5PUlMsCisJCQkJICAgICJ1c2JfZW5kcG9pbnQiKTsKKwlpZiAoZXJyb3IpIHsKKwkJZXJyKCJ1bmFibGUgdG8gZ2V0IGEgZHluYW1pYyBtYWpvciBmb3IgdXNiIGVuZHBvaW50cyIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXVzYl9lbmRwb2ludF9tYWpvciA9IE1BSk9SKGRldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9lbmRwb2ludF9tYWpvcl9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKHVzYl9lbmRwb2ludF9tYWpvciwgMCksCisJCQkJIE1BWF9FTkRQT0lOVF9NSU5PUlMpOworfQorCitzdGF0aWMgaW50IGVuZHBvaW50X2dldF9taW5vcihzdHJ1Y3QgZXBfZGV2aWNlICplcF9kZXYpCit7CisJc3RhdGljIERFRklORV9NVVRFWChtaW5vcl9sb2NrKTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwlpbnQgaWQ7CisKKwltdXRleF9sb2NrKCZtaW5vcl9sb2NrKTsKKwlpZiAoaWRyX3ByZV9nZXQoJmVuZHBvaW50X2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkKKwkJZ290byBleGl0OworCisJcmV0dmFsID0gaWRyX2dldF9uZXcoJmVuZHBvaW50X2lkciwgZXBfZGV2LCAmaWQpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWlmIChyZXR2YWwgPT0gLUVBR0FJTikKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJZXBfZGV2LT5taW5vciA9IGlkICYgTUFYX0lEX01BU0s7CitleGl0OgorCW11dGV4X3VubG9jaygmbWlub3JfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZW5kcG9pbnRfZnJlZV9taW5vcihzdHJ1Y3QgZXBfZGV2aWNlICplcF9kZXYpCit7CisJaWRyX3JlbW92ZSgmZW5kcG9pbnRfaWRyLCBlcF9kZXYtPm1pbm9yKTsKK30KKwogc3RhdGljIHN0cnVjdCBlbmRwb2ludF9jbGFzcyB7CiAJc3RydWN0IGtyZWYga3JlZjsKIAlzdHJ1Y3QgY2xhc3MgKmNsYXNzOwpAQCAtMTc2LDExICsyMzAsMjAgQEAKIAllcF9jbGFzcy0+Y2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJ1c2JfZW5kcG9pbnQiKTsKIAlpZiAoSVNfRVJSKGVwX2NsYXNzLT5jbGFzcykpIHsKIAkJcmVzdWx0ID0gSVNfRVJSKGVwX2NsYXNzLT5jbGFzcyk7Ci0JCWtmcmVlKGVwX2NsYXNzKTsKLQkJZXBfY2xhc3MgPSBOVUxMOwotCQlnb3RvIGV4aXQ7CisJCWdvdG8gY2xhc3NfY3JlYXRlX2Vycm9yOwogCX0KIAorCXJlc3VsdCA9IHVzYl9lbmRwb2ludF9tYWpvcl9pbml0KCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlbmRwb2ludF9tYWpvcl9lcnJvcjsKKworCWdvdG8gZXhpdDsKKworZW5kcG9pbnRfbWFqb3JfZXJyb3I6CisJY2xhc3NfZGVzdHJveShlcF9jbGFzcy0+Y2xhc3MpOworY2xhc3NfY3JlYXRlX2Vycm9yOgorCWtmcmVlKGVwX2NsYXNzKTsKKwllcF9jbGFzcyA9IE5VTEw7CiBleGl0OgogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xOTEsNiArMjU0LDcgQEAKIAljbGFzc19kZXN0cm95KGVwX2NsYXNzLT5jbGFzcyk7CiAJa2ZyZWUoZXBfY2xhc3MpOwogCWVwX2NsYXNzID0gTlVMTDsKKwl1c2JfZW5kcG9pbnRfbWFqb3JfY2xlYW51cCgpOwogfQogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2VuZHBvaW50X2NsYXNzKHZvaWQpCkBAIC0yMTMsNyArMjc3LDYgQEAKIHsKIAljaGFyIG5hbWVbOF07CiAJc3RydWN0IGVwX2RldmljZSAqZXBfZGV2OwotCWludCBtaW5vcjsKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gaW5pdF9lbmRwb2ludF9jbGFzcygpOwpAQCAtMjI2LDEyICsyODksMTYgQEAKIAkJZ290byBlcnJvcl9hbGxvYzsKIAl9CiAKLQkvKiBmdW4gY2FsY3VsYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBtaW5vciBvZiB0aGlzIGVuZHBvaW50ICovCi0JbWlub3IgPSAoKCh1ZGV2LT5idXMtPmJ1c251bSAtIDEpICogMTI4KSAqIDE2KSArICh1ZGV2LT5kZXZudW0gLSAxKTsKKwlyZXR2YWwgPSBlbmRwb2ludF9nZXRfbWlub3IoZXBfZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIocGFyZW50LCAiY2FuIG5vdCBhbGxvY2F0ZSBtaW5vciBudW1iZXIgZm9yICVzIiwKKwkJCWVwX2Rldi0+ZGV2LmJ1c19pZCk7CisJCWdvdG8gZXJyb3JfcmVnaXN0ZXI7CisJfQogCiAJZXBfZGV2LT5kZXNjID0gJmVuZHBvaW50LT5kZXNjOwogCWVwX2Rldi0+dWRldiA9IHVkZXY7Ci0JZXBfZGV2LT5kZXYuZGV2dCA9IE1LREVWKDQ0MiwgbWlub3IpOwkvLyBGSVhNRSBmYWtlIG51bWJlci4uLgorCWVwX2Rldi0+ZGV2LmRldnQgPSBNS0RFVih1c2JfZW5kcG9pbnRfbWFqb3IsIGVwX2Rldi0+bWlub3IpOwogCWVwX2Rldi0+ZGV2LmNsYXNzID0gZXBfY2xhc3MtPmNsYXNzOwogCWVwX2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKIAllcF9kZXYtPmRldi5yZWxlYXNlID0gZXBfZGV2aWNlX3JlbGVhc2U7CkBAIC0yNDEsNyArMzA4LDcgQEAKIAogCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmZXBfZGV2LT5kZXYpOwogCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyb3JfcmVnaXN0ZXI7CisJCWdvdG8gZXJyb3JfY2hyZGV2OwogCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZXBfZGV2LT5kZXYua29iaiwgJmVwX2Rldl9hdHRyX2dycCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJvcl9ncm91cDsKQEAgLTI2MSw2ICszMjgsOSBAQAogCWRlc3Ryb3lfZW5kcG9pbnRfY2xhc3MoKTsKIAlyZXR1cm4gcmV0dmFsOwogCitlcnJvcl9jaHJkZXY6CisJZW5kcG9pbnRfZnJlZV9taW5vcihlcF9kZXYpOworCiBlcnJvcl9yZWdpc3RlcjoKIAlrZnJlZShlcF9kZXYpOwogZXJyb3JfYWxsb2M6CkBAIC0yNzEsMTQgKzM0MSwxNiBAQAogCiB2b2lkIHVzYl9yZW1vdmVfZXBfZmlsZXMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCkKIHsKKwlzdHJ1Y3QgZXBfZGV2aWNlICplcF9kZXYgPSBlbmRwb2ludC0+ZXBfZGV2OwogCi0JaWYgKGVuZHBvaW50LT5lcF9kZXYpIHsKKwlpZiAoZXBfZGV2KSB7CiAJCWNoYXIgbmFtZVs4XTsKIAogCQlzcHJpbnRmKG5hbWUsICJlcF8lMDJ4IiwgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZlbmRwb2ludC0+ZXBfZGV2LT5kZXYucGFyZW50LT5rb2JqLCBuYW1lKTsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZlbmRwb2ludC0+ZXBfZGV2LT5kZXYua29iaiwgJmVwX2Rldl9hdHRyX2dycCk7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZlbmRwb2ludC0+ZXBfZGV2LT5kZXYpOworCQlzeXNmc19yZW1vdmVfbGluaygmZXBfZGV2LT5kZXYucGFyZW50LT5rb2JqLCBuYW1lKTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZlcF9kZXYtPmRldi5rb2JqLCAmZXBfZGV2X2F0dHJfZ3JwKTsKKwkJZW5kcG9pbnRfZnJlZV9taW5vcihlcF9kZXYpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmZXBfZGV2LT5kZXYpOwogCQllbmRwb2ludC0+ZXBfZGV2ID0gTlVMTDsKIAkJZGVzdHJveV9lbmRwb2ludF9jbGFzcygpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IGFmYTJkZDIuLjEwMDY0YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwpAQCAtMjU2LDcgKzI1Niw5IEBACiAJMHgwNSwgICAgICAgLyogIF9fdTggIGVwX2JEZXNjcmlwdG9yVHlwZTsgRW5kcG9pbnQgKi8KIAkweDgxLCAgICAgICAvKiAgX191OCAgZXBfYkVuZHBvaW50QWRkcmVzczsgSU4gRW5kcG9pbnQgMSAqLwogIAkweDAzLCAgICAgICAvKiAgX191OCAgZXBfYm1BdHRyaWJ1dGVzOyBJbnRlcnJ1cHQgKi8KLSAJMHgwMiwgMHgwMCwgLyogIF9fbGUxNiBlcF93TWF4UGFja2V0U2l6ZTsgMSArIChNQVhfUk9PVF9QT1JUUyAvIDgpICovCisJCSAgICAvKiBfX2xlMTYgZXBfd01heFBhY2tldFNpemU7IDEgKyAoTUFYX1JPT1RfUE9SVFMgLyA4KQorCQkgICAgICogc2VlIGh1Yi5jOmh1Yl9jb25maWd1cmUoKSBmb3IgZGV0YWlscy4gKi8KKwkoVVNCX01BWENISUxEUkVOICsgMSArIDcpIC8gOCwgMHgwMCwKIAkweDBjICAgICAgICAvKiAgX191OCAgZXBfYkludGVydmFsOyAoMjU2bXMgLS0gdXNiIDIuMCBzcGVjKSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9odWIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKaW5kZXggYmExNjVhZi4uMGNlMzkzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC0zMSw2ICszMSw0NyBAQAogI2luY2x1ZGUgImhjZC5oIgogI2luY2x1ZGUgImh1Yi5oIgogCitzdHJ1Y3QgdXNiX2h1YiB7CisJc3RydWN0IGRldmljZQkJKmludGZkZXY7CS8qIHRoZSAiaW50ZXJmYWNlIiBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZQkqaGRldjsKKwlzdHJ1Y3QgdXJiCQkqdXJiOwkJLyogZm9yIGludGVycnVwdCBwb2xsaW5nIHBpcGUgKi8KKworCS8qIGJ1ZmZlciBmb3IgdXJiIC4uLiB3aXRoIGV4dHJhIHNwYWNlIGluIGNhc2Ugb2YgYmFiYmxlICovCisJY2hhcgkJCSgqYnVmZmVyKVs4XTsKKwlkbWFfYWRkcl90CQlidWZmZXJfZG1hOwkvKiBETUEgYWRkcmVzcyBmb3IgYnVmZmVyICovCisJdW5pb24geworCQlzdHJ1Y3QgdXNiX2h1Yl9zdGF0dXMJaHViOworCQlzdHJ1Y3QgdXNiX3BvcnRfc3RhdHVzCXBvcnQ7CisJfQkJCSpzdGF0dXM7CS8qIGJ1ZmZlciBmb3Igc3RhdHVzIHJlcG9ydHMgKi8KKworCWludAkJCWVycm9yOwkJLyogbGFzdCByZXBvcnRlZCBlcnJvciAqLworCWludAkJCW5lcnJvcnM7CS8qIHRyYWNrIGNvbnNlY3V0aXZlIGVycm9ycyAqLworCisJc3RydWN0IGxpc3RfaGVhZAlldmVudF9saXN0OwkvKiBodWJzIHcvZGF0YSBvciBlcnJzIHJlYWR5ICovCisJdW5zaWduZWQgbG9uZwkJZXZlbnRfYml0c1sxXTsJLyogc3RhdHVzIGNoYW5nZSBiaXRtYXNrICovCisJdW5zaWduZWQgbG9uZwkJY2hhbmdlX2JpdHNbMV07CS8qIHBvcnRzIHdpdGggbG9naWNhbCBjb25uZWN0CisJCQkJCQkJc3RhdHVzIGNoYW5nZSAqLworCXVuc2lnbmVkIGxvbmcJCWJ1c3lfYml0c1sxXTsJLyogcG9ydHMgYmVpbmcgcmVzZXQgb3IKKwkJCQkJCQlyZXN1bWVkICovCisjaWYgVVNCX01BWENISUxEUkVOID4gMzEgLyogOCpzaXplb2YodW5zaWduZWQgbG9uZykgLSAxICovCisjZXJyb3IgZXZlbnRfYml0c1tdIGlzIHRvbyBzaG9ydCEKKyNlbmRpZgorCisJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzY3JpcHRvcjsJLyogY2xhc3MgZGVzY3JpcHRvciAqLworCXN0cnVjdCB1c2JfdHQJCXR0OwkJLyogVHJhbnNhY3Rpb24gVHJhbnNsYXRvciAqLworCisJdW5zaWduZWQJCW1BX3Blcl9wb3J0OwkvKiBjdXJyZW50IGZvciBlYWNoIGNoaWxkICovCisKKwl1bnNpZ25lZAkJbGltaXRlZF9wb3dlcjoxOworCXVuc2lnbmVkCQlxdWllc2Npbmc6MTsKKwl1bnNpZ25lZAkJYWN0aXZhdGluZzoxOworCisJdW5zaWduZWQJCWhhc19pbmRpY2F0b3JzOjE7CisJdTgJCQlpbmRpY2F0b3JbVVNCX01BWENISUxEUkVOXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbGVkczsKK307CisKKwogLyogUHJvdGVjdCBzdHJ1Y3QgdXNiX2RldmljZS0+c3RhdGUgYW5kIC0+Y2hpbGRyZW4gbWVtYmVycwogICogTm90ZTogQm90aCBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgLT5kZXYuc2VtLCBleGNlcHQgdGhhdCAtPnN0YXRlIGNhbgogICogY2hhbmdlIHRvIFVTQl9TVEFURV9OT1RBVFRBQ0hFRCBldmVuIHdoZW4gdGhlIHNlbWFwaG9yZSBpc24ndCBoZWxkLiAqLwpAQCAtNDUsNiArODYsMTYgQEAKIAogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2h1YmRfdGFzazsKIAorLyogbXVsdGl0aHJlYWRlZCBwcm9iZSBsb2dpYyAqLworc3RhdGljIGludCBtdWx0aXRocmVhZF9wcm9iZSA9CisjaWZkZWYgQ09ORklHX1VTQl9NVUxUSVRIUkVBRF9QUk9CRQorCTE7CisjZWxzZQorCTA7CisjZW5kaWYKK21vZHVsZV9wYXJhbShtdWx0aXRocmVhZF9wcm9iZSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpdGhyZWFkX3Byb2JlLCAiUnVuIGVhY2ggVVNCIGRldmljZSBwcm9iZSBpbiBhIG5ldyB0aHJlYWQiKTsKKwogLyogY3ljbGUgbGVkcyBvbiBodWJzIHRoYXQgYXJlbid0IGJsaW5raW5nIGZvciBhdHRlbnRpb24gKi8KIHN0YXRpYyBpbnQgYmxpbmtlbmxpZ2h0cyA9IDA7CiBtb2R1bGVfcGFyYW0gKGJsaW5rZW5saWdodHMsIGJvb2wsIFNfSVJVR08pOwpAQCAtMjc2LDYgKzMyNyw5IEBACiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAorCS8qIFN1cHByZXNzIGF1dG9zdXNwZW5kIHVudGlsIGtodWJkIHJ1bnMgKi8KKwl0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldiktPnBtX3VzYWdlX2NudCA9IDE7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHViX2V2ZW50X2xvY2ssIGZsYWdzKTsKIAlpZiAobGlzdF9lbXB0eSgmaHViLT5ldmVudF9saXN0KSkgewogCQlsaXN0X2FkZF90YWlsKCZodWItPmV2ZW50X2xpc3QsICZodWJfZXZlbnRfbGlzdCk7CkBAIC00NTcsNyArNTExLDYgQEAKIAkvKiAobm9uYmxvY2tpbmcpIGtodWJkIGFuZCByZWxhdGVkIGFjdGl2aXR5IHdvbid0IHJlLXRyaWdnZXIgKi8KIAlodWItPnF1aWVzY2luZyA9IDE7CiAJaHViLT5hY3RpdmF0aW5nID0gMDsKLQlodWItPnJlc3VtZV9yb290X2h1YiA9IDA7CiAKIAkvKiAoYmxvY2tpbmcpIHN0b3Aga2h1YmQgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgKi8KIAl1c2Jfa2lsbF91cmIoaHViLT51cmIpOwpAQCAtNDczLDcgKzUyNiw3IEBACiAKIAlodWItPnF1aWVzY2luZyA9IDA7CiAJaHViLT5hY3RpdmF0aW5nID0gMTsKLQlodWItPnJlc3VtZV9yb290X2h1YiA9IDA7CisKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihodWItPnVyYiwgR0ZQX05PSU8pOwogCWlmIChzdGF0dXMgPCAwKQogCQlkZXZfZXJyKGh1Yi0+aW50ZmRldiwgImFjdGl2YXRlIC0tPiAlZFxuIiwgc3RhdHVzKTsKQEAgLTc1OSw3ICs4MTIsMTIgQEAKIAkJZGV2X2RiZyhodWJfZGV2LCAiJXNvdmVyLWN1cnJlbnQgY29uZGl0aW9uIGV4aXN0c1xuIiwKIAkJCShodWJzdGF0dXMgJiBIVUJfU1RBVFVTX09WRVJDVVJSRU5UKSA/ICIiIDogIm5vICIpOwogCi0JLyogc2V0IHVwIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwkvKiBzZXQgdXAgdGhlIGludGVycnVwdCBlbmRwb2ludAorCSAqIFdlIHVzZSB0aGUgRVAncyBtYXhwYWNrZXQgc2l6ZSBpbnN0ZWFkIG9mIChQT1JUUysxKzcpLzgKKwkgKiBieXRlcyBhcyBVU0IyLjBbMTEuMTIuM10gc2F5cyBiZWNhdXNlIHNvbWUgaHVicyBhcmUga25vd24KKwkgKiB0byBzZW5kIG1vcmUgZGF0YSAoYW5kIHRodXMgY2F1c2Ugb3ZlcmZsb3cpLiBGb3Igcm9vdCBodWJzLAorCSAqIG1heHBrdHNpemUgaXMgZGVmaW5lZCBpbiBoY2QuYydzIGZha2UgZW5kcG9pbnQgZGVzY3JpcHRvcnMKKwkgKiB0byBiZSBiaWcgZW5vdWdoIGZvciBhdCBsZWFzdCBVU0JfTUFYQ0hJTERSRU4gcG9ydHMuICovCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGhkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKIAltYXhwID0gdXNiX21heHBhY2tldChoZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CiAKQEAgLTg4Myw2ICs5NDEsNyBAQAogCUlOSVRfV09SSygmaHViLT5sZWRzLCBsZWRfd29yaywgaHViKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIGh1Yik7CisJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CiAKIAlpZiAoaGRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCWhpZ2hzcGVlZF9odWJzKys7CkBAIC05ODAsNiArMTAzOSw4IEBACiAJCWlmICh1ZGV2LT5jaGlsZHJlbltpXSkKIAkJCXJlY3Vyc2l2ZWx5X21hcmtfTk9UQVRUQUNIRUQodWRldi0+Y2hpbGRyZW5baV0pOwogCX0KKwlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKKwkJdWRldi0+ZGlzY29uX3N1c3BlbmRlZCA9IDE7CiAJdWRldi0+c3RhdGUgPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQ7CiB9CiAKQEAgLTExNjksNiArMTIzMCwxNCBAQAogCSpwZGV2ID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnEoJmRldmljZV9zdGF0ZV9sb2NrKTsKIAorCS8qIERlY3JlbWVudCB0aGUgcGFyZW50J3MgY291bnQgb2YgdW5zdXNwZW5kZWQgY2hpbGRyZW4gKi8KKwlpZiAodWRldi0+cGFyZW50KSB7CisJCXVzYl9wbV9sb2NrKHVkZXYpOworCQlpZiAoIXVkZXYtPmRpc2Nvbl9zdXNwZW5kZWQpCisJCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYtPnBhcmVudCk7CisJCXVzYl9wbV91bmxvY2sodWRldik7CisJfQorCiAJcHV0X2RldmljZSgmdWRldi0+ZGV2KTsKIH0KIApAQCAtMTE5MSwyOSArMTI2MCwxNyBAQAogc3RhdGljIGludCBfX3VzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKiwgaW50IHBvcnQxKTsKICNlbmRpZgogCi0vKioKLSAqIHVzYl9uZXdfZGV2aWNlIC0gcGVyZm9ybSBpbml0aWFsIGRldmljZSBzZXR1cCAodXNiY29yZS1pbnRlcm5hbCkKLSAqIEB1ZGV2OiBuZXdseSBhZGRyZXNzZWQgZGV2aWNlIChpbiBBRERSRVNTIHN0YXRlKQotICoKLSAqIFRoaXMgaXMgY2FsbGVkIHdpdGggZGV2aWNlcyB3aGljaCBoYXZlIGJlZW4gZW51bWVyYXRlZCwgYnV0IG5vdCB5ZXQKLSAqIGNvbmZpZ3VyZWQuICBUaGUgZGV2aWNlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlLCBidXQgbm90IGRlc2NyaXB0b3JzCi0gKiBmb3IgYW55IGRldmljZSBjb25maWd1cmF0aW9uLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIGVpdGhlcgotICogdGhlIHBhcmVudCBodWIgKGlmIHVkZXYgaXMgYSBub3JtYWwgZGV2aWNlKSBvciBlbHNlIHRoZQotICogdXNiX2J1c19saXN0X2xvY2sgKGlmIHVkZXYgaXMgYSByb290IGh1YikuICBUaGUgcGFyZW50J3MgcG9pbnRlciB0bwotICogdWRldiBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZCwgYnV0IHVkZXYgaXMgbm90IHlldCB2aXNpYmxlIHRocm91Z2gKLSAqIHN5c2ZzIG9yIG90aGVyIGZpbGVzeXN0ZW0gY29kZS4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MgKGRldmljZSBpcyBjb25maWd1cmVkIGFuZCBsaXN0ZWQsIHdpdGggaXRzCi0gKiBpbnRlcmZhY2VzLCBpbiBzeXNmcyk7IGVsc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KLSAqCi0gKiBUaGlzIGNhbGwgaXMgc3luY2hyb25vdXMsIGFuZCBtYXkgbm90IGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0IGNvbnRleHQuCi0gKgotICogT25seSB0aGUgaHViIGRyaXZlciBvciByb290LWh1YiByZWdpc3RyYXIgc2hvdWxkIGV2ZXIgY2FsbCB0aGlzLgotICovCi1pbnQgdXNiX25ld19kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IF9fdXNiX25ld19kZXZpY2Uodm9pZCAqdm9pZF9kYXRhKQogeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdm9pZF9kYXRhOwogCWludCBlcnI7CiAKKwkvKiBMb2NrIG91cnNlbGYgaW50byBtZW1vcnkgaW4gb3JkZXIgdG8ga2VlcCBhIHByb2JlIHNlcXVlbmNlCisJICogc2xlZXBpbmcgaW4gYSBuZXcgdGhyZWFkIGZyb20gYWxsb3dpbmcgdXMgdG8gYmUgdW5sb2FkZWQuCisJICovCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJZXJyID0gdXNiX2dldF9jb25maWd1cmF0aW9uKHVkZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnVkZXYtPmRldiwgImNhbid0IHJlYWQgY29uZmlndXJhdGlvbnMsIGVycm9yICVkXG4iLApAQCAtMTMwOSwxMyArMTM2Niw1NiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0dXJuIDA7CisJLyogSW5jcmVtZW50IHRoZSBwYXJlbnQncyBjb3VudCBvZiB1bnN1c3BlbmRlZCBjaGlsZHJlbiAqLworCWlmICh1ZGV2LT5wYXJlbnQpCisJCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LT5wYXJlbnQpOworCitleGl0OgorCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCXJldHVybiBlcnI7CiAKIGZhaWw6CiAJdXNiX3NldF9kZXZpY2Vfc3RhdGUodWRldiwgVVNCX1NUQVRFX05PVEFUVEFDSEVEKTsKLQlyZXR1cm4gZXJyOworCWdvdG8gZXhpdDsKIH0KIAorLyoqCisgKiB1c2JfbmV3X2RldmljZSAtIHBlcmZvcm0gaW5pdGlhbCBkZXZpY2Ugc2V0dXAgKHVzYmNvcmUtaW50ZXJuYWwpCisgKiBAdWRldjogbmV3bHkgYWRkcmVzc2VkIGRldmljZSAoaW4gQUREUkVTUyBzdGF0ZSkKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGRldmljZXMgd2hpY2ggaGF2ZSBiZWVuIGVudW1lcmF0ZWQsIGJ1dCBub3QgeWV0CisgKiBjb25maWd1cmVkLiAgVGhlIGRldmljZSBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSwgYnV0IG5vdCBkZXNjcmlwdG9ycworICogZm9yIGFueSBkZXZpY2UgY29uZmlndXJhdGlvbi4gIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGxvY2tlZCBlaXRoZXIKKyAqIHRoZSBwYXJlbnQgaHViIChpZiB1ZGV2IGlzIGEgbm9ybWFsIGRldmljZSkgb3IgZWxzZSB0aGUKKyAqIHVzYl9idXNfbGlzdF9sb2NrIChpZiB1ZGV2IGlzIGEgcm9vdCBodWIpLiAgVGhlIHBhcmVudCdzIHBvaW50ZXIgdG8KKyAqIHVkZXYgaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQsIGJ1dCB1ZGV2IGlzIG5vdCB5ZXQgdmlzaWJsZSB0aHJvdWdoCisgKiBzeXNmcyBvciBvdGhlciBmaWxlc3lzdGVtIGNvZGUuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIGlmIHRoZQorICogbXVsdGl0aHJlYWRfcHJvYmUgdmFyaWFibGUgaXMgc2V0IG9yIG5vdC4gIElmIGl0J3Mgc2V0LCBpdCB3aWxsCisgKiByZXR1cm4gYSBpZiB0aGUgcHJvYmUgdGhyZWFkIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvciBub3QuICBJZiB0aGUKKyAqIHZhcmlhYmxlIGlzIG5vdCBzZXQsIGl0IHdpbGwgcmV0dXJuIGlmIHRoZSBkZXZpY2UgaXMgY29uZmlndXJlZAorICogcHJvcGVybHkgb3Igbm90LiAgaW50ZXJmYWNlcywgaW4gc3lzZnMpOyBlbHNlIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUuCisgKgorICogVGhpcyBjYWxsIGlzIHN5bmNocm9ub3VzLCBhbmQgbWF5IG5vdCBiZSB1c2VkIGluIGFuIGludGVycnVwdCBjb250ZXh0LgorICoKKyAqIE9ubHkgdGhlIGh1YiBkcml2ZXIgb3Igcm9vdC1odWIgcmVnaXN0cmFyIHNob3VsZCBldmVyIGNhbGwgdGhpcy4KKyAqLworaW50IHVzYl9uZXdfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJvYmVfdGFzazsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtdWx0aXRocmVhZF9wcm9iZSkgeworCQlwcm9iZV90YXNrID0ga3RocmVhZF9ydW4oX191c2JfbmV3X2RldmljZSwgdWRldiwKKwkJCQkJICJ1c2ItcHJvYmUtJXMiLCB1ZGV2LT5kZXZudW0pOworCQlpZiAoSVNfRVJSKHByb2JlX3Rhc2spKQorCQkJcmV0ID0gUFRSX0VSUihwcm9iZV90YXNrKTsKKwl9IGVsc2UKKwkJcmV0ID0gX191c2JfbmV3X2RldmljZSh1ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CiAKIHN0YXRpYyBpbnQgaHViX3BvcnRfc3RhdHVzKHN0cnVjdCB1c2JfaHViICpodWIsIGludCBwb3J0MSwKIAkJCSAgICAgICB1MTYgKnN0YXR1cywgdTE2ICpjaGFuZ2UpCkBAIC0xMzIzLDEwICsxNDIzLDEyIEBACiAJaW50IHJldDsKIAogCXJldCA9IGdldF9wb3J0X3N0YXR1cyhodWItPmhkZXYsIHBvcnQxLCAmaHViLT5zdGF0dXMtPnBvcnQpOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCA0KSB7CiAJCWRldl9lcnIgKGh1Yi0+aW50ZmRldiwKIAkJCSIlcyBmYWlsZWQgKGVyciA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCByZXQpOwotCWVsc2UgeworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRUlPOworCX0gZWxzZSB7CiAJCSpzdGF0dXMgPSBsZTE2X3RvX2NwdShodWItPnN0YXR1cy0+cG9ydC53UG9ydFN0YXR1cyk7CiAJCSpjaGFuZ2UgPSBsZTE2X3RvX2NwdShodWItPnN0YXR1cy0+cG9ydC53UG9ydENoYW5nZSk7IAogCQlyZXQgPSAwOwpAQCAtMTY3NCw2ICsxNzc2LDEyIEBACiBodWJfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlpbnQJc3RhdHVzOworCXUxNglwb3J0Y2hhbmdlLCBwb3J0c3RhdHVzOworCisJLyogU2tpcCB0aGUgaW5pdGlhbCBDbGVhci1TdXNwZW5kIHN0ZXAgZm9yIGEgcmVtb3RlIHdha2V1cCAqLworCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLCAmcG9ydHN0YXR1cywgJnBvcnRjaGFuZ2UpOworCWlmIChzdGF0dXMgPT0gMCAmJiAhKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQlnb3RvIFN1c3BlbmRDbGVhcmVkOwogCiAJLy8gZGV2X2RiZyhodWItPmludGZkZXYsICJyZXN1bWUgcG9ydCAlZFxuIiwgcG9ydDEpOwogCkBAIC0xNjg3LDkgKzE3OTUsNiBAQAogCQkJImNhbid0IHJlc3VtZSBwb3J0ICVkLCBzdGF0dXMgJWRcbiIsCiAJCQlwb3J0MSwgc3RhdHVzKTsKIAl9IGVsc2UgewotCQl1MTYJCWRldnN0YXR1czsKLQkJdTE2CQlwb3J0Y2hhbmdlOwotCiAJCS8qIGRyaXZlIHJlc3VtZSBmb3IgYXQgbGVhc3QgMjAgbXNlYyAqLwogCQlpZiAodWRldikKIAkJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3Jlc3VtZVxuIiwKQEAgLTE3MDQsMTYgKzE4MDksMTUgQEAKIAkJICogc3RvcCByZXN1bWUgc2lnbmFsaW5nLiAgVGhlbiBmaW5pc2ggdGhlIHJlc3VtZQogCQkgKiBzZXF1ZW5jZS4KIAkJICovCi0JCWRldnN0YXR1cyA9IHBvcnRjaGFuZ2UgPSAwOwotCQlzdGF0dXMgPSBodWJfcG9ydF9zdGF0dXMoaHViLCBwb3J0MSwKLQkJCQkmZGV2c3RhdHVzLCAmcG9ydGNoYW5nZSk7CisJCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLCAmcG9ydHN0YXR1cywgJnBvcnRjaGFuZ2UpOworU3VzcGVuZENsZWFyZWQ6CiAJCWlmIChzdGF0dXMgPCAwCi0JCQkJfHwgKGRldnN0YXR1cyAmIExJVkVfRkxBR1MpICE9IExJVkVfRkxBR1MKLQkJCQl8fCAoZGV2c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSAhPSAwCisJCQkJfHwgKHBvcnRzdGF0dXMgJiBMSVZFX0ZMQUdTKSAhPSBMSVZFX0ZMQUdTCisJCQkJfHwgKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpICE9IDAKIAkJCQkpIHsKIAkJCWRldl9kYmcoaHViLT5pbnRmZGV2LAogCQkJCSJwb3J0ICVkIHN0YXR1cyAlMDR4LiUwNHggYWZ0ZXIgcmVzdW1lLCAlZFxuIiwKLQkJCQlwb3J0MSwgcG9ydGNoYW5nZSwgZGV2c3RhdHVzLCBzdGF0dXMpOworCQkJCXBvcnQxLCBwb3J0Y2hhbmdlLCBwb3J0c3RhdHVzLCBzdGF0dXMpOwogCQkJaWYgKHN0YXR1cyA+PSAwKQogCQkJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCX0gZWxzZSB7CkBAIC0xNzc0LDIzICsxODc4LDE2IEBACiB7CiAJaW50CXN0YXR1cyA9IDA7CiAKLQkvKiBBbGwgdGhpcyBqdXN0IHRvIGF2b2lkIHNlbmRpbmcgYSBwb3J0LXJlc3VtZSBtZXNzYWdlCi0JICogdG8gdGhlIHBhcmVudCBodWIhICovCi0KIAl1c2JfbG9ja19kZXZpY2UodWRldik7Ci0JdXNiX3BtX2xvY2sodWRldik7CiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzcmVzdW1lXG4iLCAid2FrZXVwLSIpOwotCQkvKiBUUlNNUkNZID0gMTAgbXNlYyAqLwotCQltc2xlZXAoMTApOwotCQlzdGF0dXMgPSBmaW5pc2hfcG9ydF9yZXN1bWUodWRldik7Ci0JCWlmIChzdGF0dXMgPT0gMCkKLQkJCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9IFBNX0VWRU5UX09OOwotCX0KLQl1c2JfcG1fdW5sb2NrKHVkZXYpOworCQlzdGF0dXMgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldik7CiAKLQlpZiAoc3RhdHVzID09IDApCi0JCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LCAwKTsKKwkJLyogR2l2ZSB0aGUgaW50ZXJmYWNlIGRyaXZlcnMgYSBjaGFuY2UgdG8gZG8gc29tZXRoaW5nLAorCQkgKiB0aGVuIGF1dG9zdXNwZW5kIHRoZSBkZXZpY2UgYWdhaW4uICovCisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldik7CisJfQogCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xODU0LDYgKzE5NTEsOCBAQAogCQl9CiAJfQogCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKIAkvKiAiZ2xvYmFsIHN1c3BlbmQiIG9mIHRoZSBkb3duc3RyZWFtIEhDLXRvLVVTQiBpbnRlcmZhY2UgKi8KIAlpZiAoIWhkZXYtPnBhcmVudCkgewogCQlzdHJ1Y3QgdXNiX2J1cwkqYnVzID0gaGRldi0+YnVzOwpAQCAtMTg3NiwxMCArMTk3NSwxMiBAQAogCiBzdGF0aWMgaW50IGh1Yl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UJKmhkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCB1c2JfaHViCQkqaHViID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IHVzYl9kZXZpY2UJKmhkZXYgPSBodWItPmhkZXY7CiAJaW50CQkJc3RhdHVzOwogCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKIAkvKiAiZ2xvYmFsIHJlc3VtZSIgb2YgdGhlIGRvd25zdHJlYW0gSEMtdG8tVVNCIGludGVyZmFjZSAqLwogCWlmICghaGRldi0+cGFyZW50KSB7CiAJCXN0cnVjdCB1c2JfYnVzCSpidXMgPSBoZGV2LT5idXM7CkBAIC0xOTE4LDcgKzIwMTksNiBAQAogewogCXN0cnVjdCB1c2JfaHViICpodWIgPSBoZGV2X3RvX2h1YihoZGV2KTsKIAotCWh1Yi0+cmVzdW1lX3Jvb3RfaHViID0gMTsKIAlraWNrX2todWJkKGh1Yik7CiB9CiAKQEAgLTI1NTUsMTYgKzI2NTUsMTMgQEAKIAkJaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KTsKIAkJaHViX2RldiA9ICZpbnRmLT5kZXY7CiAKLQkJaSA9IGh1Yi0+cmVzdW1lX3Jvb3RfaHViOwotCi0JCWRldl9kYmcoaHViX2RldiwgInN0YXRlICVkIHBvcnRzICVkIGNoZyAlMDR4IGV2dCAlMDR4JXNcbiIsCisJCWRldl9kYmcoaHViX2RldiwgInN0YXRlICVkIHBvcnRzICVkIGNoZyAlMDR4IGV2dCAlMDR4XG4iLAogCQkJCWhkZXYtPnN0YXRlLCBodWItPmRlc2NyaXB0b3IKIAkJCQkJPyBodWItPmRlc2NyaXB0b3ItPmJOYnJQb3J0cwogCQkJCQk6IDAsCiAJCQkJLyogTk9URTogZXhwZWN0cyBtYXggMTUgcG9ydHMuLi4gKi8KIAkJCQkodTE2KSBodWItPmNoYW5nZV9iaXRzWzBdLAotCQkJCSh1MTYpIGh1Yi0+ZXZlbnRfYml0c1swXSwKLQkJCQlpID8gIiwgcmVzdW1lIHJvb3QiIDogIiIpOworCQkJCSh1MTYpIGh1Yi0+ZXZlbnRfYml0c1swXSk7CiAKIAkJdXNiX2dldF9pbnRmKGludGYpOwogCQlzcGluX3VubG9ja19pcnEoJmh1Yl9ldmVudF9sb2NrKTsKQEAgLTI1ODUsMTYgKzI2ODIsMTYgQEAKIAkJCWdvdG8gbG9vcDsKIAkJfQogCi0JCS8qIElzIHRoaXMgaXMgYSByb290IGh1YiB3YW50aW5nIHRvIHJlYWN0aXZhdGUgdGhlIGRvd25zdHJlYW0KLQkJICogcG9ydHM/ICBJZiBzbywgYmUgc3VyZSB0aGUgaW50ZXJmYWNlIHJlc3VtZXMgZXZlbiBpZiBpdHMKLQkJICogc3R1YiAiZGV2aWNlIiBub2RlIHdhcyBuZXZlciBzdXNwZW5kZWQuCi0JCSAqLwotCQlpZiAoaSkKLQkJCXVzYl9hdXRvcmVzdW1lX2RldmljZShoZGV2LCAwKTsKLQotCQkvKiBJZiB0aGlzIGlzIGFuIGluYWN0aXZlIG9yIHN1c3BlbmRlZCBodWIsIGRvIG5vdGhpbmcgKi8KLQkJaWYgKGh1Yi0+cXVpZXNjaW5nKQorCQkvKiBBdXRvcmVzdW1lICovCisJCXJldCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpbnRmKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2RiZyhodWJfZGV2LCAiQ2FuJ3QgYXV0b3Jlc3VtZTogJWRcbiIsIHJldCk7CiAJCQlnb3RvIGxvb3A7CisJCX0KKworCQkvKiBJZiB0aGlzIGlzIGFuIGluYWN0aXZlIGh1YiwgZG8gbm90aGluZyAqLworCQlpZiAoaHViLT5xdWllc2NpbmcpCisJCQlnb3RvIGxvb3BfYXV0b3BtOwogCiAJCWlmIChodWItPmVycm9yKSB7CiAJCQlkZXZfZGJnIChodWJfZGV2LCAicmVzZXR0aW5nIGZvciBlcnJvciAlZFxuIiwKQEAgLTI2MDQsNyArMjcwMSw3IEBACiAJCQlpZiAocmV0KSB7CiAJCQkJZGV2X2RiZyAoaHViX2RldiwKIAkJCQkJImVycm9yIHJlc2V0dGluZyBodWI6ICVkXG4iLCByZXQpOwotCQkJCWdvdG8gbG9vcDsKKwkJCQlnb3RvIGxvb3BfYXV0b3BtOwogCQkJfQogCiAJCQlodWItPm5lcnJvcnMgPSAwOwpAQCAtMjczMiw2ICsyODI5LDEwIEBACiAJCWlmICghaGRldi0+cGFyZW50ICYmICFodWItPmJ1c3lfYml0c1swXSkKIAkJCXVzYl9lbmFibGVfcm9vdF9odWJfaXJxKGhkZXYtPmJ1cyk7CiAKK2xvb3BfYXV0b3BtOgorCQkvKiBBbGxvdyBhdXRvc3VzcGVuZCBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gcnVuIGFnYWluICovCisJCWlmIChsaXN0X2VtcHR5KCZodWItPmV2ZW50X2xpc3QpKQorCQkJdXNiX2F1dG9wbV9lbmFibGUoaW50Zik7CiBsb29wOgogCQl1c2JfdW5sb2NrX2RldmljZShoZGV2KTsKIAkJdXNiX3B1dF9pbnRmKGludGYpOwpAQCAtMjc3Myw2ICsyODc0LDcgQEAKIAkucG9zdF9yZXNldCA9CWh1Yl9wb3N0X3Jlc2V0LAogCS5pb2N0bCA9CWh1Yl9pb2N0bCwKIAkuaWRfdGFibGUgPQlodWJfaWRfdGFibGUsCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0JMSwKIH07CiAKIGludCB1c2JfaHViX2luaXQodm9pZCkKQEAgLTI5OTcsNyArMzA5OSw3IEBACiAJfQogCiAJLyogUHJldmVudCBhdXRvc3VzcGVuZCBkdXJpbmcgdGhlIHJlc2V0ICovCi0JdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYsIDEpOworCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKIAogCWlmIChpZmFjZSAmJiBpZmFjZS0+Y29uZGl0aW9uICE9IFVTQl9JTlRFUkZBQ0VfQklORElORykKIAkJaWZhY2UgPSBOVUxMOwpAQCAtMzA0MCw3ICszMTQyLDcgQEAKIAkJfQogCX0KIAotCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgMSk7CisJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oIGIvZHJpdmVycy91c2IvY29yZS9odWIuaAppbmRleCAwZjhlODJhLi5jZjk1NTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKQEAgLTE5Miw0NSArMTkyLDQgQEAKIAogZXh0ZXJuIHZvaWQgdXNiX2h1Yl90dF9jbGVhcl9idWZmZXIgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBwaXBlKTsKIAotc3RydWN0IHVzYl9odWIgewotCXN0cnVjdCBkZXZpY2UJCSppbnRmZGV2OwkvKiB0aGUgImludGVyZmFjZSIgZGV2aWNlICovCi0Jc3RydWN0IHVzYl9kZXZpY2UJKmhkZXY7Ci0Jc3RydWN0IHVyYgkJKnVyYjsJCS8qIGZvciBpbnRlcnJ1cHQgcG9sbGluZyBwaXBlICovCi0KLQkvKiBidWZmZXIgZm9yIHVyYiAuLi4gd2l0aCBleHRyYSBzcGFjZSBpbiBjYXNlIG9mIGJhYmJsZSAqLwotCWNoYXIJCQkoKmJ1ZmZlcilbOF07Ci0JZG1hX2FkZHJfdAkJYnVmZmVyX2RtYTsJLyogRE1BIGFkZHJlc3MgZm9yIGJ1ZmZlciAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHVzYl9odWJfc3RhdHVzCWh1YjsKLQkJc3RydWN0IHVzYl9wb3J0X3N0YXR1cwlwb3J0OwotCX0JCQkqc3RhdHVzOwkvKiBidWZmZXIgZm9yIHN0YXR1cyByZXBvcnRzICovCi0KLQlpbnQJCQllcnJvcjsJCS8qIGxhc3QgcmVwb3J0ZWQgZXJyb3IgKi8KLQlpbnQJCQluZXJyb3JzOwkvKiB0cmFjayBjb25zZWN1dGl2ZSBlcnJvcnMgKi8KLQotCXN0cnVjdCBsaXN0X2hlYWQJZXZlbnRfbGlzdDsJLyogaHVicyB3L2RhdGEgb3IgZXJycyByZWFkeSAqLwotCXVuc2lnbmVkIGxvbmcJCWV2ZW50X2JpdHNbMV07CS8qIHN0YXR1cyBjaGFuZ2UgYml0bWFzayAqLwotCXVuc2lnbmVkIGxvbmcJCWNoYW5nZV9iaXRzWzFdOwkvKiBwb3J0cyB3aXRoIGxvZ2ljYWwgY29ubmVjdAotCQkJCQkJCXN0YXR1cyBjaGFuZ2UgKi8KLQl1bnNpZ25lZCBsb25nCQlidXN5X2JpdHNbMV07CS8qIHBvcnRzIGJlaW5nIHJlc2V0IG9yCi0JCQkJCQkJcmVzdW1lZCAqLwotI2lmIFVTQl9NQVhDSElMRFJFTiA+IDMxIC8qIDgqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gMSAqLwotI2Vycm9yIGV2ZW50X2JpdHNbXSBpcyB0b28gc2hvcnQhCi0jZW5kaWYKLQotCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3I7CS8qIGNsYXNzIGRlc2NyaXB0b3IgKi8KLQlzdHJ1Y3QgdXNiX3R0CQl0dDsJCS8qIFRyYW5zYWN0aW9uIFRyYW5zbGF0b3IgKi8KLQotCXVuc2lnbmVkCQltQV9wZXJfcG9ydDsJLyogY3VycmVudCBmb3IgZWFjaCBjaGlsZCAqLwotCi0JdW5zaWduZWQJCWxpbWl0ZWRfcG93ZXI6MTsKLQl1bnNpZ25lZAkJcXVpZXNjaW5nOjE7Ci0JdW5zaWduZWQJCWFjdGl2YXRpbmc6MTsKLQl1bnNpZ25lZAkJcmVzdW1lX3Jvb3RfaHViOjE7Ci0KLQl1bnNpZ25lZAkJaGFzX2luZGljYXRvcnM6MTsKLQllbnVtIGh1Yl9sZWRfbW9kZQlpbmRpY2F0b3JbVVNCX01BWENISUxEUkVOXTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbGVkczsKLX07Ci0KICNlbmRpZiAvKiBfX0xJTlVYX0hVQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDc3MjljMDcuLjI5YjBmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC03NjQsNyArNzY0LDcgQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycm91dDsKIAkJfSBlbHNlIHsKLQkJCWRldi0+aGF2ZV9sYW5naWQgPSAtMTsKKwkJCWRldi0+aGF2ZV9sYW5naWQgPSAxOwogCQkJZGV2LT5zdHJpbmdfbGFuZ2lkID0gdGJ1ZlsyXSB8ICh0YnVmWzNdPDwgOCk7CiAJCQkJLyogYWx3YXlzIHVzZSB0aGUgZmlyc3QgbGFuZ2lkIGxpc3RlZCAqLwogCQkJZGV2X2RiZyAoJmRldi0+ZGV2LCAiZGVmYXVsdCBsYW5ndWFnZSAweCUwNHhcbiIsCkBAIC0xMzk4LDcgKzEzOTgsNyBAQAogCX0KIAogCS8qIFdha2UgdXAgdGhlIGRldmljZSBzbyB3ZSBjYW4gc2VuZCBpdCB0aGUgU2V0LUNvbmZpZyByZXF1ZXN0ICovCi0JcmV0ID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKGRldiwgMSk7CisJcmV0ID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKGRldik7CiAJaWYgKHJldCkKIAkJZ290byBmcmVlX2ludGVyZmFjZXM7CiAKQEAgLTE0MjEsNyArMTQyMSw3IEBACiAJZGV2LT5hY3Rjb25maWcgPSBjcDsKIAlpZiAoIWNwKSB7CiAJCXVzYl9zZXRfZGV2aWNlX3N0YXRlKGRldiwgVVNCX1NUQVRFX0FERFJFU1MpOwotCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldiwgMSk7CisJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2KTsKIAkJZ290byBmcmVlX2ludGVyZmFjZXM7CiAJfQogCXVzYl9zZXRfZGV2aWNlX3N0YXRlKGRldiwgVVNCX1NUQVRFX0NPTkZJR1VSRUQpOwpAQCAtMTQ5MCw3ICsxNDkwLDcgQEAKIAkJdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzIChpbnRmKTsKIAl9CiAKLQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldiwgMSk7CisJdXNiX2F1dG9zdXNwZW5kX2RldmljZShkZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCA0NjdjYjAyLi44MWNiNTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTIwMCwxMyArMjAwLDYgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZShrc3VzcGVuZF91c2Jfd3EpOwogfQogCi0jZWxzZQotCi0jZGVmaW5lIGtzdXNwZW5kX3VzYl9pbml0KCkJMAotI2RlZmluZSBrc3VzcGVuZF91c2JfY2xlYW51cCgpCWRvIHt9IHdoaWxlICgwKQotCi0jZW5kaWYKLQogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAogCiAvKiB1c2JfYXV0b3N1c3BlbmRfd29yayAtIGNhbGxiYWNrIHJvdXRpbmUgdG8gYXV0b3N1c3BlbmQgYSBVU0IgZGV2aWNlICovCkBAIC0yMjUsNyArMjE4LDE0IEBACiBzdGF0aWMgdm9pZCB1c2JfYXV0b3N1c3BlbmRfd29yayh2b2lkICpfdWRldikKIHt9CiAKLSNlbmRpZgorI2VuZGlmCS8qIENPTkZJR19VU0JfU1VTUEVORCAqLworCisjZWxzZQorCisjZGVmaW5lIGtzdXNwZW5kX3VzYl9pbml0KCkJMAorI2RlZmluZSBrc3VzcGVuZF91c2JfY2xlYW51cCgpCWRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYJLyogQ09ORklHX1BNICovCiAKIC8qKgogICogdXNiX2FsbG9jX2RldiAtIHVzYiBkZXZpY2UgY29uc3RydWN0b3IgKHVzYmNvcmUtaW50ZXJuYWwpCkBAIC01MzcsMTM4ICs1MzcsNiBAQAogCXJldHVybiB1c2JfaGNkX2dldF9mcmFtZV9udW1iZXIgKGRldik7CiB9CiAKLS8qKgotICogdXNiX2VuZHBvaW50X2Rpcl9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgSU4gZGlyZWN0aW9uCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIElOLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgotICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X3hmZXJfYnVsayAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGJ1bGssIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X3hmZXJfYnVsayhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfeGZlcl9pbnQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKLSAqIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X3hmZXJfaW50KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X3hmZXJfaXNvYyAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaXNvY2hyb25vdXMgdHJhbnNmZXIgdHlwZQotICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpc29jaHJvbm91cywgb3RoZXJ3aXNlIGl0IHJldHVybnMKLSAqIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBidWxrIElOCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGJ1bGsgT1VUCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAotICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCi0gKi8KLWludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2ludF9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgSU4KLSAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAotICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCi0gKi8KLWludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfaXNfaW50X291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgT1VUCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaXNvY2hyb25vdXMgSU4KLSAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19pc29jX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGlzb2Nocm9ub3VzIE9VVAotICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19pc29jX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiBfX3VzYl9nZXRfZXh0cmFfZGVzY3JpcHRvcigpIGZpbmRzIGEgZGVzY3JpcHRvciBvZiBzcGVjaWZpYyB0eXBlIGluIHRoZQpAQCAtMTEwMiwxOCArOTcwLDYgQEAKIEVYUE9SVF9TWU1CT0wodXNiX2ZpbmRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wodXNiX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcik7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9kaXJfaW4pOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X2Rpcl9vdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X3hmZXJfYnVsayk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfeGZlcl9pbnQpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X3hmZXJfaXNvYyk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfYnVsa19pbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X2lzX2ludF9pbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaW50X291dCk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaXNvY19pbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaXNvY19vdXQpOwotCiBFWFBPUlRfU1lNQk9MICh1c2JfYnVmZmVyX2FsbG9jKTsKIEVYUE9SVF9TWU1CT0wgKHVzYl9idWZmZXJfZnJlZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmggYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCmluZGV4IDEzMzIyZTMuLjE3ODMwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuaApAQCAtNjQsMTQgKzY0LDEzIEBACiAKICNkZWZpbmUgVVNCX0FVVE9TVVNQRU5EX0RFTEFZCShIWioyKQogCi1leHRlcm4gdm9pZCB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgZGVjX2J1c3lfY250KTsKLWV4dGVybiBpbnQgdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5jX2J1c3lfY250KTsKK2V4dGVybiB2b2lkIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIGludCB1c2JfYXV0b3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCiAjZWxzZQogCi0jZGVmaW5lIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgZGVjX2J1c3lfY250KQlkbyB7fSB3aGlsZSAoMCkKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJaW50IGluY19idXN5X2NudCkKKyNkZWZpbmUgdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KQlkbyB7fSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKaW5kZXggMWMxN2QyNi4uM2JkMWRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKQEAgLTE4OTQsMTMgKzE4OTQsMTMgQEAKIAlpZiAoIWV0aF9pc19wcm9taXNjIChkZXYpKSB7CiAJCXU4CQkqZGVzdCA9IHNrYi0+ZGF0YTsKIAotCQlpZiAoZGVzdCBbMF0gJiAweDAxKSB7CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewogCQkJdTE2CXR5cGU7CiAKIAkJCS8qIGlnbm9yZXMgVVNCX0NEQ19QQUNLRVRfVFlQRV9NVUxUSUNBU1QgYW5kIGhvc3QKIAkJCSAqIFNFVF9FVEhFUk5FVF9NVUxUSUNBU1RfRklMVEVSUyByZXF1ZXN0cwogCQkJICovCi0JCQlpZiAobWVtY21wIChkZXN0LCBuZXQtPmJyb2FkY2FzdCwgRVRIX0FMRU4pID09IDApCisJCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpCiAJCQkJdHlwZSA9IFVTQl9DRENfUEFDS0VUX1RZUEVfQlJPQURDQVNUOwogCQkJZWxzZQogCQkJCXR5cGUgPSBVU0JfQ0RDX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IDE3OTI1OTYuLjRhOTkxNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC04Myw3ICs4Myw2IEBACiBzdGF0aWMgaW50IGxoN2E0MHhfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICopOwogc3RhdGljIGludCBsaDdhNDB4X3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQpOwogc3RhdGljIGludCBsaDdhNDB4X2ZpZm9fc3RhdHVzKHN0cnVjdCB1c2JfZXAgKmVwKTsKLXN0YXRpYyBpbnQgbGg3YTQweF9maWZvX3N0YXR1cyhzdHJ1Y3QgdXNiX2VwICplcCk7CiBzdGF0aWMgdm9pZCBsaDdhNDB4X2ZpZm9fZmx1c2goc3RydWN0IHVzYl9lcCAqZXApOwogc3RhdGljIHZvaWQgbGg3YTQweF9lcDBfa2ljayhzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiwgc3RydWN0IGxoN2E0MHhfZXAgKmVwKTsKIHN0YXRpYyB2b2lkIGxoN2E0MHhfaGFuZGxlX2VwMChzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiwgdTMyIGludHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKaW5kZXggM2FjYzg5Ni4uMGI1OTA4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCkBAIC0xMDQwLDYgKzEwNDAsNyBAQAogCiAJfSAvKiBlbHNlIHRoZSBpcnEgaGFuZGxlciBhZHZhbmNlcyB0aGUgcXVldWUuICovCiAKKwllcC0+cmVzcG9uZGVkID0gMTsKIAlpZiAocmVxKQogCQlsaXN0X2FkZF90YWlsICgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CiBkb25lOgpAQCAtMjE4OCw3ICsyMTg5LDggQEAKIAkJCQkJZXAtPnN0b3BwZWQgPSAxOwogCQkJCQlzZXRfaGFsdCAoZXApOwogCQkJCQltb2RlID0gMjsKLQkJCQl9IGVsc2UgaWYgKCFyZXEgJiYgIWVwLT5zdG9wcGVkKQorCQkJCX0gZWxzZSBpZiAoZXAtPnJlc3BvbmRlZCAmJgorCQkJCQkJIXJlcSAmJiAhZXAtPnN0b3BwZWQpCiAJCQkJCXdyaXRlX2ZpZm8gKGVwLCBOVUxMKTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTIyMDMsNyArMjIwNSw3IEBACiAJCQl9IGVsc2UgaWYgKCgodCAmICgxIDw8IERBVEFfT1VUX1BJTkdfVE9LRU5fSU5URVJSVVBUKSkKIAkJCQkJJiYgcmVxCiAJCQkJCSYmIHJlcS0+cmVxLmFjdHVhbCA9PSByZXEtPnJlcS5sZW5ndGgpCi0JCQkJCXx8ICFyZXEpIHsKKwkJCQkJfHwgKGVwLT5yZXNwb25kZWQgJiYgIXJlcSkpIHsKIAkJCQllcC0+ZGV2LT5wcm90b2NvbF9zdGFsbCA9IDE7CiAJCQkJc2V0X2hhbHQgKGVwKTsKIAkJCQllcC0+c3RvcHBlZCA9IDE7CkBAIC0yNDY5LDYgKzI0NzEsNyBAQAogCQkvKiB3ZSBtYWRlIHRoZSBoYXJkd2FyZSBoYW5kbGUgbW9zdCBsb3dsZXZlbCByZXF1ZXN0czsKIAkJICogZXZlcnl0aGluZyBlbHNlIGdvZXMgdXBsZXZlbCB0byB0aGUgZ2FkZ2V0IGNvZGUuCiAJCSAqLworCQllcC0+cmVzcG9uZGVkID0gMTsKIAkJc3dpdGNoICh1LnIuYlJlcXVlc3QpIHsKIAkJY2FzZSBVU0JfUkVRX0dFVF9TVEFUVVM6IHsKIAkJCXN0cnVjdCBuZXQyMjgwX2VwCSplOwpAQCAtMjUzNyw2ICsyNTQwLDcgQEAKIAkJCQl1LnIuYlJlcXVlc3RUeXBlLCB1LnIuYlJlcXVlc3QsCiAJCQkJd192YWx1ZSwgd19pbmRleCwgd19sZW5ndGgsCiAJCQkJcmVhZGwgKCZlcC0+cmVncy0+ZXBfY2ZnKSk7CisJCQllcC0+cmVzcG9uZGVkID0gMDsKIAkJCXNwaW5fdW5sb2NrICgmZGV2LT5sb2NrKTsKIAkJCXRtcCA9IGRldi0+ZHJpdmVyLT5zZXR1cCAoJmRldi0+Z2FkZ2V0LCAmdS5yKTsKIAkJCXNwaW5fbG9jayAoJmRldi0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuaAppbmRleCA5NTdkNmRmLi40NGNhMTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmgKQEAgLTExMCw3ICsxMTAsOCBAQAogCQkJCQkJb3V0X292ZXJmbG93IDogMSwKIAkJCQkJCXN0b3BwZWQgOiAxLAogCQkJCQkJaXNfaW4gOiAxLAotCQkJCQkJaXNfaXNvIDogMTsKKwkJCQkJCWlzX2lzbyA6IDEsCisJCQkJCQlyZXNwb25kZWQgOiAxOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGFsbG93X3N0YXR1cyAoc3RydWN0IG5ldDIyODBfZXAgKmVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggNjcxYzI0Yi4uMWVkNTA2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC0yNDcyLDYgKzI0NzIsNyBAQAogI2RlZmluZSBQWEEyMTBfQjEJCTB4MDAwMDAxMjMKICNkZWZpbmUgUFhBMjEwX0IwCQkweDAwMDAwMTIyCiAjZGVmaW5lIElYUDQyNV9BMAkJMHgwMDAwMDFjMQorI2RlZmluZSBJWFA0MjVfQjAJCTB4MDAwMDAxZjEKICNkZWZpbmUgSVhQNDY1X0FECQkweDAwMDAwMjAwCiAKIC8qCkBAIC0yNTA5LDYgKzI1MTAsNyBAQAogCQlicmVhazsKICNlbGlmCWRlZmluZWQoQ09ORklHX0FSQ0hfSVhQNFhYKQogCWNhc2UgSVhQNDI1X0EwOgorCWNhc2UgSVhQNDI1X0IwOgogCWNhc2UgSVhQNDY1X0FEOgogCQlkZXYtPmhhc19jZnIgPSAxOwogCQlvdXRfZG1hID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwppbmRleCBjZjEwY2JjLi5jYzYwNzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkgIGFkYXB0ZXIgd2lsbCAqTk9UKiB3b3JrIHdpdGggUEMgY2FyZHMgdGhhdCBkbyBub3QgY29udGFpbiBhbiBPSENJCiAJICBjb250cm9sbGVyLgogCi0JICBGb3IgdGhvc2UgUEMgY2FyZHMgdGhhdCBjb250YWluIG11bHRpcGxlIE9IQ0kgY29udHJvbGxlcnMgb25seSB0aGVyCisJICBGb3IgdGhvc2UgUEMgY2FyZHMgdGhhdCBjb250YWluIG11bHRpcGxlIE9IQ0kgY29udHJvbGxlcnMgb25seSB0aGUKIAkgIGZpcnN0IG9uZSBpcyB1c2VkLgogCiAJICBUaGUgZHJpdmVyIGNvbnNpc3RzIG9mIHR3byBtb2R1bGVzLCB0aGUgImZ0ZGktZWxhbiIgbW9kdWxlIGlzIGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCA5MDMwOTk0Li4wMjVkMzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC0xMjYsNiArMTI2LDExIEBACiBtb2R1bGVfcGFyYW0gKHBhcmssIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyAocGFyaywgInBhcmsgc2V0dGluZzsgMS0zIGJhY2stdG8tYmFjayBhc3luYyBwYWNrZXRzIik7CiAKKy8qIGZvciBmbGFrZXkgaGFyZHdhcmUsIGlnbm9yZSBvdmVyY3VycmVudCBpbmRpY2F0b3JzICovCitzdGF0aWMgaW50IGlnbm9yZV9vYyA9IDA7Cittb2R1bGVfcGFyYW0gKGlnbm9yZV9vYywgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDIChpZ25vcmVfb2MsICJpZ25vcmUgYm9ndXMgaGFyZHdhcmUgb3ZlcmN1cnJlbnQgaW5kaWNhdGlvbnMiKTsKKwogI2RlZmluZQlJTlRSX01BU0sgKFNUU19JQUEgfCBTVFNfRkFUQUwgfCBTVFNfUENEIHwgU1RTX0VSUiB8IFNUU19JTlQpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC01NDEsOSArNTQ2LDEwIEBACiAKIAl0ZW1wID0gSENfVkVSU0lPTihyZWFkbCAoJmVoY2ktPmNhcHMtPmhjX2NhcGJhc2UpKTsKIAllaGNpX2luZm8gKGVoY2ksCi0JCSJVU0IgJXguJXggc3RhcnRlZCwgRUhDSSAleC4lMDJ4LCBkcml2ZXIgJXNcbiIsCisJCSJVU0IgJXguJXggc3RhcnRlZCwgRUhDSSAleC4lMDJ4LCBkcml2ZXIgJXMlc1xuIiwKIAkJKChlaGNpLT5zYnJuICYgMHhmMCk+PjQpLCAoZWhjaS0+c2JybiAmIDB4MGYpLAotCQl0ZW1wID4+IDgsIHRlbXAgJiAweGZmLCBEUklWRVJfVkVSU0lPTik7CisJCXRlbXAgPj4gOCwgdGVtcCAmIDB4ZmYsIERSSVZFUl9WRVJTSU9OLAorCQlpZ25vcmVfb2MgPyAiLCBvdmVyY3VycmVudCBpZ25vcmVkIiA6ICIiKTsKIAogCXdyaXRlbCAoSU5UUl9NQVNLLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOyAvKiBUdXJuIE9uIEludGVycnVwdHMgKi8KIApAQCAtNjEzLDkgKzYxOSw4IEBACiAJCXVuc2lnbmVkCWkgPSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7CiAKIAkJLyogcmVzdW1lIHJvb3QgaHViPyAqLwotCQlzdGF0dXMgPSByZWFkbCAoJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwotCQlpZiAoIShzdGF0dXMgJiBDTURfUlVOKSkKLQkJCXdyaXRlbCAoc3RhdHVzIHwgQ01EX1JVTiwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOworCQlpZiAoIShyZWFkbCgmZWhjaS0+cmVncy0+Y29tbWFuZCkgJiBDTURfUlVOKSkKKwkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7CiAKIAkJd2hpbGUgKGktLSkgewogCQkJaW50IHBzdGF0dXMgPSByZWFkbCAoJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSk7CkBAIC02MzIsNyArNjM3LDYgQEAKIAkJCSAqLwogCQkJZWhjaS0+cmVzZXRfZG9uZSBbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyAoMjApOwogCQkJZWhjaV9kYmcgKGVoY2ksICJwb3J0ICVkIHJlbW90ZSB3YWtldXBcbiIsIGkgKyAxKTsKLQkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCAxYjIwNzIyLi5iZmU1ZjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC0zNCw2ICszNCw3IEBACiB7CiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCWludAkJCXBvcnQ7CisJaW50CQkJbWFzazsKIAogCWlmICh0aW1lX2JlZm9yZSAoamlmZmllcywgZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCiAJCW1zbGVlcCg1KTsKQEAgLTUxLDE0ICs1MiwyNSBAQAogCQllaGNpLT5yZWNsYWltX3JlYWR5ID0gMTsKIAllaGNpX3dvcmsoZWhjaSk7CiAKLQkvKiBzdXNwZW5kIGFueSBhY3RpdmUvdW5zdXNwZW5kZWQgcG9ydHMsIG1heWJlIGFsbG93IHdha2V1cCAqLworCS8qIFVubGlrZSBvdGhlciBVU0IgaG9zdCBjb250cm9sbGVyIHR5cGVzLCBFSENJIGRvZXNuJ3QgaGF2ZQorCSAqIGFueSBub3Rpb24gb2YgImdsb2JhbCIgb3IgYnVzLXdpZGUgc3VzcGVuZC4gIFRoZSBkcml2ZXIgaGFzCisJICogdG8gbWFudWFsbHkgc3VzcGVuZCBhbGwgdGhlIGFjdGl2ZSB1bnN1c3BlbmRlZCBwb3J0cywgYW5kCisJICogdGhlbiBtYW51YWxseSByZXN1bWUgdGhlbSBpbiB0aGUgYnVzX3Jlc3VtZSgpIHJvdXRpbmUuCisJICovCisJZWhjaS0+YnVzX3N1c3BlbmRlZCA9IDA7CiAJd2hpbGUgKHBvcnQtLSkgewogCQl1MzIgX19pb21lbQkqcmVnID0gJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtwb3J0XTsKIAkJdTMyCQl0MSA9IHJlYWRsIChyZWcpICYgflBPUlRfUldDX0JJVFM7CiAJCXUzMgkJdDIgPSB0MTsKIAotCQlpZiAoKHQxICYgUE9SVF9QRSkgJiYgISh0MSAmIFBPUlRfT1dORVIpKQorCQkvKiBrZWVwIHRyYWNrIG9mIHdoaWNoIHBvcnRzIHdlIHN1c3BlbmQgKi8KKwkJaWYgKCh0MSAmIFBPUlRfUEUpICYmICEodDEgJiBQT1JUX09XTkVSKSAmJgorCQkJCSEodDEgJiBQT1JUX1NVU1BFTkQpKSB7CiAJCQl0MiB8PSBQT1JUX1NVU1BFTkQ7CisJCQlzZXRfYml0KHBvcnQsICZlaGNpLT5idXNfc3VzcGVuZGVkKTsKKwkJfQorCisJCS8qIGVuYWJsZSByZW1vdGUgd2FrZXVwIG9uIGFsbCBwb3J0cyAqLwogCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKIAkJCXQyIHw9IFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRTsKIAkJZWxzZQpAQCAtNzYsNiArODgsMTMgQEAKIAllaGNpX2hhbHQgKGVoY2kpOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7CiAKKwkvKiBhbGxvdyByZW1vdGUgd2FrZXVwICovCisJbWFzayA9IElOVFJfTUFTSzsKKwlpZiAoIWRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJCW1hc2sgJj0gflNUU19QQ0Q7CisJd3JpdGVsKG1hc2ssICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJcmVhZGwoJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKwogCWVoY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCk7CiAJc3Bpbl91bmxvY2tfaXJxICgmZWhjaS0+bG9jayk7CiAJcmV0dXJuIDA7CkBAIC04OCw3ICsxMDcsNiBAQAogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKIAl1MzIJCQl0ZW1wOwogCWludAkJCWk7Ci0JaW50CQkJaW50cl9lbmFibGU7CiAKIAlpZiAodGltZV9iZWZvcmUgKGppZmZpZXMsIGVoY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CkBAIC0xMDAsMzEgKzExOCwzMCBAQAogCSAqIHRoZSBsYXN0IHVzZXIgb2YgdGhlIGNvbnRyb2xsZXIsIG5vdCByZXNldC9wbSBoYXJkd2FyZSBrZWVwaW5nCiAJICogc3RhdGUgd2UgZ2F2ZSB0byBpdC4KIAkgKi8KKwl0ZW1wID0gcmVhZGwoJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKwllaGNpX2RiZyhlaGNpLCAicmVzdW1lIHJvb3QgaHViJXNcbiIsIHRlbXAgPyAiIiA6ICIgYWZ0ZXIgcG93ZXIgbG9zcyIpOwogCi0JLyogcmUtaW5pdCBvcGVyYXRpb25hbCByZWdpc3RlcnMgaW4gY2FzZSB3ZSBsb3N0IHBvd2VyICovCi0JaWYgKHJlYWRsICgmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpID09IDApIHsKLQkJLyogYXQgbGVhc3Qgc29tZSBBUE0gaW1wbGVtZW50YXRpb25zIHdpbGwgdHJ5IHRvIGRlbGl2ZXIKLQkJICogSVJRcyByaWdodCBhd2F5LCBzbyBkZWxheSB0aGVtIHVudGlsIHdlJ3JlIHJlYWR5LgotCQkgKi8KLQkJaW50cl9lbmFibGUgPSAxOwotCQl3cml0ZWwgKDAsICZlaGNpLT5yZWdzLT5zZWdtZW50KTsKLQkJd3JpdGVsIChlaGNpLT5wZXJpb2RpY19kbWEsICZlaGNpLT5yZWdzLT5mcmFtZV9saXN0KTsKLQkJd3JpdGVsICgodTMyKWVoY2ktPmFzeW5jLT5xaF9kbWEsICZlaGNpLT5yZWdzLT5hc3luY19uZXh0KTsKLQl9IGVsc2UKLQkJaW50cl9lbmFibGUgPSAwOwotCWVoY2lfZGJnKGVoY2ksICJyZXN1bWUgcm9vdCBodWIlc1xuIiwKLQkJCWludHJfZW5hYmxlID8gIiBhZnRlciBwb3dlciBsb3NzIiA6ICIiKTsKKwkvKiBhdCBsZWFzdCBzb21lIEFQTSBpbXBsZW1lbnRhdGlvbnMgd2lsbCB0cnkgdG8gZGVsaXZlcgorCSAqIElSUXMgcmlnaHQgYXdheSwgc28gZGVsYXkgdGhlbSB1bnRpbCB3ZSdyZSByZWFkeS4KKwkgKi8KKwl3cml0ZWwoMCwgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCS8qIHJlLWluaXQgb3BlcmF0aW9uYWwgcmVnaXN0ZXJzICovCisJd3JpdGVsKDAsICZlaGNpLT5yZWdzLT5zZWdtZW50KTsKKwl3cml0ZWwoZWhjaS0+cGVyaW9kaWNfZG1hLCAmZWhjaS0+cmVncy0+ZnJhbWVfbGlzdCk7CisJd3JpdGVsKCh1MzIpIGVoY2ktPmFzeW5jLT5xaF9kbWEsICZlaGNpLT5yZWdzLT5hc3luY19uZXh0KTsKIAogCS8qIHJlc3RvcmUgQ01EX1JVTiwgZnJhbWVsaXN0IHNpemUsIGFuZCBpcnEgdGhyZXNob2xkICovCiAJd3JpdGVsIChlaGNpLT5jb21tYW5kLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CiAKLQkvKiB0YWtlIHBvcnRzIG91dCBvZiBzdXNwZW5kICovCisJLyogbWFudWFsbHkgcmVzdW1lIHRoZSBwb3J0cyB3ZSBzdXNwZW5kZWQgZHVyaW5nIGJ1c19zdXNwZW5kKCkgKi8KIAlpID0gSENTX05fUE9SVFMgKGVoY2ktPmhjc19wYXJhbXMpOwogCXdoaWxlIChpLS0pIHsKIAkJdGVtcCA9IHJlYWRsICgmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKIAkJdGVtcCAmPSB+KFBPUlRfUldDX0JJVFMKIAkJCXwgUE9SVF9XS09DX0UgfCBQT1JUX1dLRElTQ19FIHwgUE9SVF9XS0NPTk5fRSk7Ci0JCWlmICh0ZW1wICYgUE9SVF9TVVNQRU5EKSB7CisJCWlmICh0ZXN0X2JpdChpLCAmZWhjaS0+YnVzX3N1c3BlbmRlZCkgJiYKKwkJCQkodGVtcCAmIFBPUlRfU1VTUEVORCkpIHsKIAkJCWVoY2ktPnJlc2V0X2RvbmUgW2ldID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMgKDIwKTsKIAkJCXRlbXAgfD0gUE9SVF9SRVNVTUU7CiAJCX0KQEAgLTEzNCwxMSArMTUxLDEyIEBACiAJbWRlbGF5ICgyMCk7CiAJd2hpbGUgKGktLSkgewogCQl0ZW1wID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwotCQlpZiAoKHRlbXAgJiBQT1JUX1NVU1BFTkQpID09IDApCi0JCQljb250aW51ZTsKLQkJdGVtcCAmPSB+KFBPUlRfUldDX0JJVFMgfCBQT1JUX1JFU1VNRSk7Ci0JCXdyaXRlbCAodGVtcCwgJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSk7Ci0JCWVoY2lfdmRiZyAoZWhjaSwgInJlc3VtZWQgcG9ydCAlZFxuIiwgaSArIDEpOworCQlpZiAodGVzdF9iaXQoaSwgJmVoY2ktPmJ1c19zdXNwZW5kZWQpICYmCisJCQkJKHRlbXAgJiBQT1JUX1NVU1BFTkQpKSB7CisJCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTVU1FKTsKKwkJCXdyaXRlbCAodGVtcCwgJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSk7CisJCQllaGNpX3ZkYmcgKGVoY2ksICJyZXN1bWVkIHBvcnQgJWRcbiIsIGkgKyAxKTsKKwkJfQogCX0KIAkodm9pZCkgcmVhZGwgKCZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIApAQCAtMTU3LDggKzE3NSw3IEBACiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CiAKIAkvKiBOb3cgd2UgY2FuIHNhZmVseSByZS1lbmFibGUgaXJxcyAqLwotCWlmIChpbnRyX2VuYWJsZSkKLQkJd3JpdGVsIChJTlRSX01BU0ssICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJd3JpdGVsKElOVFJfTUFTSywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKIAogCXNwaW5fdW5sb2NrX2lycSAoJmVoY2ktPmxvY2spOwogCXJldHVybiAwOwpAQCAtMjE4LDYgKzIzNSw3IEBACiB7CiAJc3RydWN0IGVoY2lfaGNkCSplaGNpID0gaGNkX3RvX2VoY2kgKGhjZCk7CiAJdTMyCQl0ZW1wLCBzdGF0dXMgPSAwOworCXUzMgkJbWFzazsKIAlpbnQJCXBvcnRzLCBpLCByZXR2YWwgPSAxOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKQEAgLTIzMyw2ICsyNTEsMTggQEAKIAkJcmV0dmFsKys7CiAJfQogCisJLyogU29tZSBib2FyZHMgKG1vc3RseSBWSUE/KSByZXBvcnQgYm9ndXMgb3ZlcmN1cnJlbnQgaW5kaWNhdGlvbnMsCisJICogY2F1c2luZyBtYXNzaXZlIGxvZyBzcGFtIHVubGVzcyB3ZSBjb21wbGV0ZWx5IGlnbm9yZSB0aGVtLiAgSXQKKwkgKiBtYXkgYmUgcmVsZXZhbnQgdGhhdCBWSUEgVlQ4MjM1IGNvbnRyb2xlcnMsIHdoZXJlIFBPUlRfUE9XRVIgaXMKKwkgKiBhbHdheXMgc2V0LCBzZWVtIHRvIGNsZWFyIFBPUlRfT0NDIGFuZCBQT1JUX0NTQyB3aGVuIHdyaXRpbmcgdG8KKwkgKiBQT1JUX1BPV0VSOyB0aGF0J3Mgc3VycHJpc2luZywgYnV0IG1heWJlIHdpdGhpbi1zcGVjLgorCSAqLworCWlmICghaWdub3JlX29jKQorCQltYXNrID0gUE9SVF9DU0MgfCBQT1JUX1BFQyB8IFBPUlRfT0NDOworCWVsc2UKKwkJbWFzayA9IFBPUlRfQ1NDIHwgUE9SVF9QRUM7CisJLy8gUE9SVF9SRVNVTUUgZnJvbSBoYXJkd2FyZSB+PSBQT1JUX1NUQVRfQ19TVVNQRU5ECisKIAkvKiBubyBodWIgY2hhbmdlIHJlcG9ydHMgKGJpdCAwKSBmb3Igbm93IChwb3dlciwgLi4uKSAqLwogCiAJLyogcG9ydCBOIGNoYW5nZXMgKGJpdCBOKT8gKi8KQEAgLTI1MCw4ICsyODAsNyBAQAogCQl9CiAJCWlmICghKHRlbXAgJiBQT1JUX0NPTk5FQ1QpKQogCQkJZWhjaS0+cmVzZXRfZG9uZSBbaV0gPSAwOwotCQlpZiAoKHRlbXAgJiAoUE9SVF9DU0MgfCBQT1JUX1BFQyB8IFBPUlRfT0NDKSkgIT0gMAotCQkJCS8vIFBPUlRfU1RBVF9DX1NVU1BFTkQ/CisJCWlmICgodGVtcCAmIG1hc2spICE9IDAKIAkJCQl8fCAoKHRlbXAgJiBQT1JUX1JFU1VNRSkgIT0gMAogCQkJCQkmJiB0aW1lX2FmdGVyIChqaWZmaWVzLAogCQkJCQkJZWhjaS0+cmVzZXRfZG9uZSBbaV0pKSkgewpAQCAtMzE5LDYgKzM0OCw3IEBACiAJdTMyCQl0ZW1wLCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQJCXJldHZhbCA9IDA7CisJdW5zaWduZWQJc2VsZWN0b3I7CiAKIAkvKgogCSAqIEZJWE1FOiAgc3VwcG9ydCBTZXRQb3J0RmVhdHVyZXMgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1IuCkBAIC00MTcsNyArNDQ3LDcgQEAKIAkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OOwogCQlpZiAodGVtcCAmIFBPUlRfUEVDKQogCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DX0VOQUJMRTsKLQkJaWYgKHRlbXAgJiBQT1JUX09DQykKKwkJaWYgKCh0ZW1wICYgUE9SVF9PQ0MpICYmICFpZ25vcmVfb2MpCiAJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOwogCiAJCS8qIHdob2V2ZXIgcmVzdW1lcyBtdXN0IEdldFBvcnRTdGF0dXMgdG8gY29tcGxldGUgaXQhISAqLwpAQCAtNTA2LDYgKzUzNiw4IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTZXRQb3J0RmVhdHVyZToKKwkJc2VsZWN0b3IgPSB3SW5kZXggPj4gODsKKwkJd0luZGV4ICY9IDB4ZmY7CiAJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IHBvcnRzKQogCQkJZ290byBlcnJvcjsKIAkJd0luZGV4LS07CkBAIC01NTksNiArNTkxLDIyIEBACiAJCQl9CiAJCQl3cml0ZWwgKHRlbXAsICZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbd0luZGV4XSk7CiAJCQlicmVhazsKKworCQkvKiBGb3IgZG93bnN0cmVhbSBmYWNpbmcgcG9ydHMgKHRoZXNlKTogIG9uZSBodWIgcG9ydCBpcyBwdXQKKwkJICogaW50byB0ZXN0IG1vZGUgYWNjb3JkaW5nIHRvIFVTQjIgMTEuMjQuMi4xMywgdGhlbiB0aGUgaHViCisJCSAqIG11c3QgYmUgcmVzZXQgKHdoaWNoIGZvciByb290IGh1YiBub3cgbWVhbnMgcm1tb2QrbW9kcHJvYmUsCisJCSAqIG9yIGVsc2Ugc3lzdGVtIHJlYm9vdCkuICBTZWUgRUhDSSAyLjMuOSBhbmQgNC4xNCBmb3IgaW5mbworCQkgKiBhYm91dCB0aGUgRUhDSS1zcGVjaWZpYyBzdHVmZi4KKwkJICovCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9URVNUOgorCQkJaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA+IDUpCisJCQkJZ290byBlcnJvcjsKKwkJCWVoY2lfcXVpZXNjZShlaGNpKTsKKwkJCWVoY2lfaGFsdChlaGNpKTsKKwkJCXRlbXAgfD0gc2VsZWN0b3IgPDwgMTY7CisJCQl3cml0ZWwgKHRlbXAsICZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbd0luZGV4XSk7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJZ290byBlcnJvcjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCmluZGV4IGU1MWMxZWQ4Li40YmM3OTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCkBAIC0yNTcsOSArMjU3LDcgQEAKIHN0YXRpYyBpbnQgZWhjaV9wY2lfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7Ci0JdW5zaWduZWQJCXBvcnQ7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2ID0gdG9fcGNpX2RldihoY2QtPnNlbGYuY29udHJvbGxlcik7Ci0JaW50CQkJcmV0dmFsID0gLUVJTlZBTDsKIAogCS8vIG1heWJlIHJlc3RvcmUgRkxBREoKIApAQCAtMjY5LDI3ICsyNjcsMTkgQEAKIAkvKiBNYXJrIGhhcmR3YXJlIGFjY2Vzc2libGUgYWdhaW4gYXMgd2UgYXJlIG91dCBvZiBEMyBzdGF0ZSBieSBub3cgKi8KIAlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKIAotCS8qIElmIENGIGlzIGNsZWFyLCB3ZSBsb3N0IFBDSSBWYXV4IHBvd2VyIGFuZCBuZWVkIHRvIHJlc3RhcnQuICAqLwotCWlmIChyZWFkbCgmZWhjaS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKSAhPSBGTEFHX0NGKQotCQlnb3RvIHJlc3RhcnQ7Ci0KLQkvKiBJZiBhbnkgcG9ydCBpcyBzdXNwZW5kZWQgKG9yIG93bmVkIGJ5IHRoZSBjb21wYW5pb24pLAotCSAqIHdlIGtub3cgd2UgY2FuL211c3QgcmVzdW1lIHRoZSBIQyAoYW5kIG11c3RuJ3QgcmVzZXQgaXQpLgotCSAqIFdlIGp1c3QgZGVmZXIgdGhhdCB0byB0aGUgcm9vdCBodWIgY29kZS4KKwkvKiBJZiBDRiBpcyBzdGlsbCBzZXQsIHdlIG1haW50YWluZWQgUENJIFZhdXggcG93ZXIuCisJICogSnVzdCB1bmRvIHRoZSBlZmZlY3Qgb2YgZWhjaV9wY2lfc3VzcGVuZCgpLgogCSAqLwotCWZvciAocG9ydCA9IEhDU19OX1BPUlRTKGVoY2ktPmhjc19wYXJhbXMpOyBwb3J0ID4gMDsgKSB7Ci0JCXUzMglzdGF0dXM7Ci0JCXBvcnQtLTsKLQkJc3RhdHVzID0gcmVhZGwoJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtwb3J0XSk7Ci0JCWlmICghKHN0YXR1cyAmIFBPUlRfUE9XRVIpKQotCQkJY29udGludWU7Ci0JCWlmIChzdGF0dXMgJiAoUE9SVF9TVVNQRU5EIHwgUE9SVF9SRVNVTUUgfCBQT1JUX09XTkVSKSkgewotCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKLQkJCXJldHVybiAwOwotCQl9CisJaWYgKHJlYWRsKCZlaGNpLT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpID09IEZMQUdfQ0YpIHsKKwkJaW50CW1hc2sgPSBJTlRSX01BU0s7CisKKwkJaWYgKCFkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpKQorCQkJbWFzayAmPSB+U1RTX1BDRDsKKwkJd3JpdGVsKG1hc2ssICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJCXJlYWRsKCZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJCXJldHVybiAwOwogCX0KIAotcmVzdGFydDoKIAllaGNpX2RiZyhlaGNpLCAibG9zdCBwb3dlciwgcmVzdGFydGluZ1xuIik7CiAJdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIoaGNkLT5zZWxmLnJvb3RfaHViKTsKIApAQCAtMzA3LDEzICsyOTcsMTUgQEAKIAllaGNpX3dvcmsoZWhjaSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAotCS8qIHJlc3RhcnQ7IGtodWJkIHdpbGwgZGlzY29ubmVjdCBkZXZpY2VzICovCi0JcmV0dmFsID0gZWhjaV9ydW4oaGNkKTsKLQogCS8qIGhlcmUgd2UgImtub3ciIHJvb3QgcG9ydHMgc2hvdWxkIGFsd2F5cyBzdGF5IHBvd2VyZWQgKi8KIAllaGNpX3BvcnRfcG93ZXIoZWhjaSwgMSk7CiAKLQlyZXR1cm4gcmV0dmFsOworCXdyaXRlbChlaGNpLT5jb21tYW5kLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CisJd3JpdGVsKEZMQUdfQ0YsICZlaGNpLT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOworCXJlYWRsKCZlaGNpLT5yZWdzLT5jb21tYW5kKTsJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGVzICovCisKKwloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKaW5kZXggYmJjMzA4Mi4uNzRkYmM2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKQEAgLTc0LDYgKzc0LDcgQEAKIAogCS8qIHBlciByb290IGh1YiBwb3J0ICovCiAJdW5zaWduZWQgbG9uZwkJcmVzZXRfZG9uZSBbRUhDSV9NQVhfUk9PVF9QT1JUU107CisJdW5zaWduZWQgbG9uZwkJYnVzX3N1c3BlbmRlZDsKIAogCS8qIHBlci1IQyBtZW1vcnkgcG9vbHMgKGNvdWxkIGJlIHBlci1idXMsIGJ1dCAuLi4pICovCiAJc3RydWN0IGRtYV9wb29sCQkqcWhfcG9vbDsJLyogcWggcGVyIGFjdGl2ZSB1cmIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwppbmRleCBlYTQ3MTRlLi5hOTUyNzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCkBAIC03MjksNiArNzI5LDE2IEBACiAJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgU1RBVEVDSEFOR0VfREVMQVk7CiAJCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SRCB8IE9IQ0lfSU5UUl9SSFNDLAogCQkJCSZyZWdzLT5pbnRyc3RhdHVzKTsKKworCQkvKiBOT1RFOiBWZW5kb3JzIGRpZG4ndCBhbHdheXMgbWFrZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbgorCQkgKiBjaG9pY2VzIGZvciBSSFNDLiAgTWFueSBmb2xsb3dlZCB0aGUgc3BlYzsgUkhTQyB0cmlnZ2VycworCQkgKiBvbiBhbiBlZGdlLCBsaWtlIHNldHRpbmcgYW5kIG1heWJlIGNsZWFyaW5nIGEgcG9ydCBzdGF0dXMKKwkJICogY2hhbmdlIGJpdC4gIFdpdGggb3RoZXJzIGl0J3MgbGV2ZWwtdHJpZ2dlcmVkLCBhY3RpdmUKKwkJICogdW50aWwga2h1YmQgY2xlYXJzIGFsbCB0aGUgcG9ydCBzdGF0dXMgY2hhbmdlIGJpdHMuICBXZSdsbAorCQkgKiBhbHdheXMgZGlzYWJsZSBpdCBoZXJlIGFuZCByZWx5IG9uIHBvbGxpbmcgdW50aWwga2h1YmQKKwkJICogcmUtZW5hYmxlcyBpdC4KKwkJICovCisJCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmcmVncy0+aW50cmRpc2FibGUpOwogCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKaW5kZXggNjk5NWVhMy4uMjQ0MTY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYwpAQCAtNDEsNyArNDEsMTEgQEAKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAKLQlvaGNpX3dyaXRlbCAob2hjaSwgT0hDSV9JTlRSX1JIU0MsICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKKwlzcGluX2xvY2tfaXJxKCZvaGNpLT5sb2NrKTsKKwlpZiAoIW9oY2ktPmF1dG9zdG9wKQorCQlkZWxfdGltZXIoJmhjZC0+cmhfdGltZXIpOwkvKiBQcmV2ZW50IG5leHQgcG9sbCAqLworCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZvaGNpLT5sb2NrKTsKIH0KIAogI2RlZmluZSBPSENJX1NDSEVEX0VOQUJMRVMgXApAQCAtNTAsNiArNTQsOSBAQAogc3RhdGljIHZvaWQgZGxfZG9uZV9saXN0IChzdHJ1Y3Qgb2hjaV9oY2QgKik7CiBzdGF0aWMgdm9pZCBmaW5pc2hfdW5saW5rcyAoc3RydWN0IG9oY2lfaGNkICosIHUxNik7CiAKKyNpZmRlZglDT05GSUdfUE0KK3N0YXRpYyBpbnQgb2hjaV9yZXN0YXJ0KHN0cnVjdCBvaGNpX2hjZCAqb2hjaSk7CisKIHN0YXRpYyBpbnQgb2hjaV9yaF9zdXNwZW5kIChzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2ksIGludCBhdXRvc3RvcCkKIF9fcmVsZWFzZXMob2hjaS0+bG9jaykKIF9fYWNxdWlyZXMob2hjaS0+bG9jaykKQEAgLTEzMiw4ICsxMzksNiBAQAogCXJldHVybiBlZDsKIH0KIAotc3RhdGljIGludCBvaGNpX3Jlc3RhcnQgKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSk7Ci0KIC8qIGNhbGxlciBoYXMgbG9ja2VkIHRoZSByb290IGh1YiAqLwogc3RhdGljIGludCBvaGNpX3JoX3Jlc3VtZSAoc3RydWN0IG9oY2lfaGNkICpvaGNpKQogX19yZWxlYXNlcyhvaGNpLT5sb2NrKQpAQCAtMTY5LDcgKzE3NCw3IEBACiAJCWJyZWFrOwogCWNhc2UgT0hDSV9VU0JfUkVTVU1FOgogCQkvKiBIQ0ZTIGNoYW5nZXMgc29tZXRpbWUgYWZ0ZXIgSU5UUl9SRCAqLwotCQlvaGNpX2luZm8ob2hjaSwgIiVzd2FrZXVwXG4iLAorCQlvaGNpX2RiZyhvaGNpLCAiJXN3YWtldXAgcm9vdCBodWJcbiIsCiAJCQkJYXV0b3N0b3BwZWQgPyAiYXV0by0iIDogIiIpOwogCQlicmVhazsKIAljYXNlIE9IQ0lfVVNCX09QRVI6CkBAIC0xODEsNyArMTg2LDYgQEAKIAkJb2hjaV9kYmcgKG9oY2ksICJsb3N0IHBvd2VyXG4iKTsKIAkJc3RhdHVzID0gLUVCVVNZOwogCX0KLSNpZmRlZglDT05GSUdfUE0KIAlpZiAoc3RhdHVzID09IC1FQlVTWSkgewogCQlpZiAoIWF1dG9zdG9wcGVkKSB7CiAJCQlzcGluX3VubG9ja19pcnEgKCZvaGNpLT5sb2NrKTsKQEAgLTE5MSwyNSArMTk1LDEyIEBACiAJCX0KIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0jZW5kaWYKIAlpZiAoc3RhdHVzICE9IC1FSU5QUk9HUkVTUykKIAkJcmV0dXJuIHN0YXR1czsKIAlpZiAoYXV0b3N0b3BwZWQpCiAJCWdvdG8gc2tpcF9yZXN1bWU7CiAJc3Bpbl91bmxvY2tfaXJxICgmb2hjaS0+bG9jayk7CiAKLQl0ZW1wID0gb2hjaS0+bnVtX3BvcnRzOwotCXdoaWxlICh0ZW1wLS0pIHsKLQkJdTMyIHN0YXQgPSBvaGNpX3JlYWRsIChvaGNpLAotCQkJCSAgICAgICAmb2hjaS0+cmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzIFt0ZW1wXSk7Ci0KLQkJLyogZm9yY2UgZ2xvYmFsLCBub3Qgc2VsZWN0aXZlLCByZXN1bWUgKi8KLQkJaWYgKCEoc3RhdCAmIFJIX1BTX1BTUykpCi0JCQljb250aW51ZTsKLQkJb2hjaV93cml0ZWwgKG9oY2ksIFJIX1BTX1BPQ0ksCi0JCQkJJm9oY2ktPnJlZ3MtPnJvb3RodWIucG9ydHN0YXR1cyBbdGVtcF0pOwotCX0KLQogCS8qIFNvbWUgY29udHJvbGxlcnMgKGx1Y2VudCBlcnJhdHVtKSBuZWVkIGV4dHJhLWxvbmcgZGVsYXlzICovCiAJbXNsZWVwICgyMCAvKiB1c2IgMTEuNS4xLjEwICovICsgMTIgLyogMzIgbXNlYyBjb3VudGVyICovICsgMSk7CiAKQEAgLTIxNyw2ICsyMDgsNyBAQAogCXRlbXAgJj0gT0hDSV9DVFJMX0hDRlM7CiAJaWYgKHRlbXAgIT0gT0hDSV9VU0JfUkVTVU1FKSB7CiAJCW9oY2lfZXJyIChvaGNpLCAiY29udHJvbGxlciB3b24ndCByZXN1bWVcbiIpOworCQlzcGluX2xvY2tfaXJxKCZvaGNpLT5sb2NrKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTI5Niw4ICsyODgsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYJQ09ORklHX1BNCi0KIHN0YXRpYyBpbnQgb2hjaV9idXNfc3VzcGVuZCAoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CkBAIC0zMzUsNiArMzI1LDgzIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBDYXJyeSBvdXQgcG9sbGluZy0sIGF1dG9zdG9wLSwgYW5kIGF1dG9yZXN1bWUtcmVsYXRlZCBzdGF0ZSBjaGFuZ2VzICovCitzdGF0aWMgaW50IG9oY2lfcm9vdF9odWJfc3RhdGVfY2hhbmdlcyhzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2ksIGludCBjaGFuZ2VkLAorCQlpbnQgYW55X2Nvbm5lY3RlZCkKK3sKKwlpbnQJcG9sbF9yaCA9IDE7CisKKwlzd2l0Y2ggKG9oY2ktPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUykgeworCisJY2FzZSBPSENJX1VTQl9PUEVSOgorCQkvKiBrZWVwIG9uIHBvbGxpbmcgdW50aWwgd2Uga25vdyBhIGRldmljZSBpcyBjb25uZWN0ZWQKKwkJICogYW5kIFJIU0MgaXMgZW5hYmxlZCAqLworCQlpZiAoIW9oY2ktPmF1dG9zdG9wKSB7CisJCQlpZiAoYW55X2Nvbm5lY3RlZCB8fAorCQkJCQkhZGV2aWNlX21heV93YWtldXAoJm9oY2lfdG9faGNkKG9oY2kpCisJCQkJCQktPnNlbGYucm9vdF9odWItPmRldikpIHsKKwkJCQlpZiAob2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSkgJgorCQkJCQkJT0hDSV9JTlRSX1JIU0MpCisJCQkJCXBvbGxfcmggPSAwOworCQkJfSBlbHNlIHsKKwkJCQlvaGNpLT5hdXRvc3RvcCA9IDE7CisJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBIWjsKKwkJCX0KKworCQkvKiBpZiBubyBkZXZpY2VzIGhhdmUgYmVlbiBhdHRhY2hlZCBmb3Igb25lIHNlY29uZCwgYXV0b3N0b3AgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChjaGFuZ2VkIHx8IGFueV9jb25uZWN0ZWQpIHsKKwkJCQlvaGNpLT5hdXRvc3RvcCA9IDA7CisJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKworCQkJCQkJU1RBVEVDSEFOR0VfREVMQVk7CisJCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKKwkJCQkJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpCisJCQkJCSYmICFvaGNpLT5lZF9ybV9saXN0CisJCQkJCSYmICEob2hjaS0+aGNfY29udHJvbCAmCisJCQkJCQlPSENJX1NDSEVEX0VOQUJMRVMpKSB7CisJCQkJb2hjaV9yaF9zdXNwZW5kKG9oY2ksIDEpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJLyogaWYgdGhlcmUgaXMgYSBwb3J0IGNoYW5nZSwgYXV0b3N0YXJ0IG9yIGFzayB0byBiZSByZXN1bWVkICovCisJY2FzZSBPSENJX1VTQl9TVVNQRU5EOgorCWNhc2UgT0hDSV9VU0JfUkVTVU1FOgorCQlpZiAoY2hhbmdlZCkgeworCQkJaWYgKG9oY2ktPmF1dG9zdG9wKQorCQkJCW9oY2lfcmhfcmVzdW1lKG9oY2kpOworCQkJZWxzZQorCQkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKG9oY2lfdG9faGNkKG9oY2kpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGV2ZXJ5dGhpbmcgaXMgaWRsZSwgbm8gbmVlZCBmb3IgcG9sbGluZyAqLworCQkJcG9sbF9yaCA9IDA7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBwb2xsX3JoOworfQorCisjZWxzZQkvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGlubGluZSBpbnQgb2hjaV9yaF9yZXN1bWUoc3RydWN0IG9oY2lfaGNkICpvaGNpKQoreworCXJldHVybiAwOworfQorCisvKiBDYXJyeSBvdXQgcG9sbGluZy1yZWxhdGVkIHN0YXRlIGNoYW5nZXMuCisgKiBhdXRvc3RvcCBpc24ndCB1c2VkIHdoZW4gQ09ORklHX1BNIGlzIHR1cm5lZCBvZmYuCisgKi8KK3N0YXRpYyBpbnQgb2hjaV9yb290X2h1Yl9zdGF0ZV9jaGFuZ2VzKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSwgaW50IGNoYW5nZWQsCisJCWludCBhbnlfY29ubmVjdGVkKQoreworCWludAlwb2xsX3JoID0gMTsKKworCS8qIGtlZXAgb24gcG9sbGluZyB1bnRpbCBSSFNDIGlzIGVuYWJsZWQgKi8KKwlpZiAob2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSkgJiBPSENJX0lOVFJfUkhTQykKKwkJcG9sbF9yaCA9IDA7CisJcmV0dXJuIHBvbGxfcmg7Cit9CisKICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM0Niw3ICs0MTMsNyBAQAogewogCXN0cnVjdCBvaGNpX2hjZAkqb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwogCWludAkJaSwgY2hhbmdlZCA9IDAsIGxlbmd0aCA9IDE7Ci0JaW50CQlhbnlfY29ubmVjdGVkID0gMCwgcmhzY19lbmFibGVkID0gMTsKKwlpbnQJCWFueV9jb25uZWN0ZWQgPSAwOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJm9oY2ktPmxvY2ssIGZsYWdzKTsKQEAgLTM4Nyw2NyArNDU0LDggQEAKIAkJfQogCX0KIAotCS8qIE5PVEU6ICB2ZW5kb3JzIGRpZG4ndCBhbHdheXMgbWFrZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbgotCSAqIGNob2ljZXMgZm9yIFJIU0MuICBTb21ldGltZXMgaXQgdHJpZ2dlcnMgb24gYW4gZWRnZSAobGlrZQotCSAqIHNldHRpbmcgYW5kIG1heWJlIGNsZWFyaW5nIGEgcG9ydCBzdGF0dXMgY2hhbmdlIGJpdCk7IGFuZAotCSAqIGl0J3MgbGV2ZWwtdHJpZ2dlcmVkIG9uIG90aGVyIHNpbGljb24sIGFjdGl2ZSB1bnRpbCBraHViZAotCSAqIGNsZWFycyBhbGwgYWN0aXZlIHBvcnQgc3RhdHVzIGNoYW5nZSBiaXRzLiAgSWYgaXQncyBzdGlsbAotCSAqIHNldCAobGV2ZWwtdHJpZ2dlcmVkKSB3ZSBtdXN0IGRpc2FibGUgaXQgYW5kIHJlbHkgb24KLQkgKiBwb2xsaW5nIHVudGlsIGtodWJkIHJlLWVuYWJsZXMgaXQuCi0JICovCi0JaWYgKG9oY2lfcmVhZGwgKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyc3RhdHVzKSAmIE9IQ0lfSU5UUl9SSFNDKSB7Ci0JCW9oY2lfd3JpdGVsIChvaGNpLCBPSENJX0lOVFJfUkhTQywgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKLQkJKHZvaWQpIG9oY2lfcmVhZGwgKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7Ci0JCXJoc2NfZW5hYmxlZCA9IDA7Ci0JfQotCWhjZC0+cG9sbF9yaCA9IDE7Ci0KLQkvKiBjYXJyeSBvdXQgYXBwcm9wcmlhdGUgc3RhdGUgY2hhbmdlcyAqLwotCXN3aXRjaCAob2hjaS0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSB7Ci0KLQljYXNlIE9IQ0lfVVNCX09QRVI6Ci0JCS8qIGtlZXAgb24gcG9sbGluZyB1bnRpbCB3ZSBrbm93IGEgZGV2aWNlIGlzIGNvbm5lY3RlZAotCQkgKiBhbmQgUkhTQyBpcyBlbmFibGVkICovCi0JCWlmICghb2hjaS0+YXV0b3N0b3ApIHsKLQkJCWlmIChhbnlfY29ubmVjdGVkKSB7Ci0JCQkJaWYgKHJoc2NfZW5hYmxlZCkKLQkJCQkJaGNkLT5wb2xsX3JoID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJb2hjaS0+YXV0b3N0b3AgPSAxOwotCQkJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgSFo7Ci0JCQl9Ci0KLQkJLyogaWYgbm8gZGV2aWNlcyBoYXZlIGJlZW4gYXR0YWNoZWQgZm9yIG9uZSBzZWNvbmQsIGF1dG9zdG9wICovCi0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hhbmdlZCB8fCBhbnlfY29ubmVjdGVkKSB7Ci0JCQkJb2hjaS0+YXV0b3N0b3AgPSAwOwotCQkJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsKLQkJCQkJCVNUQVRFQ0hBTkdFX0RFTEFZOwotCQkJfSBlbHNlIGlmIChkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpCi0JCQkJCSYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKLQkJCQkJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpCi0JCQkJCSYmICFvaGNpLT5lZF9ybV9saXN0Ci0JCQkJCSYmICEob2hjaS0+aGNfY29udHJvbCAmCi0JCQkJCQlPSENJX1NDSEVEX0VOQUJMRVMpKSB7Ci0JCQkJb2hjaV9yaF9zdXNwZW5kIChvaGNpLCAxKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCS8qIGlmIHRoZXJlIGlzIGEgcG9ydCBjaGFuZ2UsIGF1dG9zdGFydCBvciBhc2sgdG8gYmUgcmVzdW1lZCAqLwotCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoKLQljYXNlIE9IQ0lfVVNCX1JFU1VNRToKLQkJaWYgKGNoYW5nZWQpIHsKLQkJCWlmIChvaGNpLT5hdXRvc3RvcCkKLQkJCQlvaGNpX3JoX3Jlc3VtZSAob2hjaSk7Ci0JCQllbHNlCi0JCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgKGhjZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBldmVyeXRoaW5nIGlzIGlkbGUsIG5vIG5lZWQgZm9yIHBvbGxpbmcgKi8KLQkJCWhjZC0+cG9sbF9yaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWhjZC0+cG9sbF9yaCA9IG9oY2lfcm9vdF9odWJfc3RhdGVfY2hhbmdlcyhvaGNpLCBjaGFuZ2VkLAorCQkJYW55X2Nvbm5lY3RlZCk7CiAKIGRvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJm9oY2ktPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYwppbmRleCA1NGY1NTRlLi5hYzlmMTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCkBAIC0xNjksMjEgKzE2OSwxNCBAQAogCiAJREJHKDAsICJzbDgxMV9jc19jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCiAJLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KIAlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKIAkJCXBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7CiAKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAJd2hpbGUgKDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYwppbmRleCAzMmM2MzVlLi5lZjU0ZTMxMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMKQEAgLTcxLDcgKzcxLDcgQEAKIG1vZHVsZV9wYXJhbShkaXN0cnVzdF9maXJtd2FyZSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc3RydXN0X2Zpcm13YXJlLCAidHJ1ZSB0byBkaXN0cnVzdCBmaXJtd2FyZSBwb3dlci9vdmVyY3VycmVuIgogICAgICAgICAidCBzZXR1cCIpOwotREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodTEzMl9oY2Rfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodTEzMl9oY2Rfd2FpdCk7CiAvKgogKiB1MTMyX21vZHVsZV9sb2NrIGV4aXN0cyB0byBwcm90ZWN0IGFjY2VzcyB0byBnbG9iYWwgdmFyaWFibGVzCiAqCkBAIC0yMDUsMTMgKzIwNSw5IEBACiAgICAgICAgIHN0cnVjdCB1MTMyX3BvcnQgcG9ydFtNQVhfVTEzMl9QT1JUU107CiAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHBbTUFYX1UxMzJfRU5EUFNdOwogfTsKLWludCB1c2JfZnRkaV9lbGFuX3JlYWRfcmVnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHUzMiAqZGF0YSk7Ci1pbnQgdXNiX2Z0ZGlfZWxhbl9yZWFkX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBhZGRyZXNzb2ZzLAotICAgICAgICB1OCB3aWR0aCwgdTMyICpkYXRhKTsKLWludCB1c2JfZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBhZGRyZXNzb2ZzLAotICAgICAgICB1OCB3aWR0aCwgdTMyIGRhdGEpOworCiAvKgotKiB0aGVzZSBjYW4gbm90IGJlIGlubGluZXMgYmVjYXVzZSB3ZSBuZWVkIHRoZSBzdHJ1Y3R1cmUgb2Zmc2V0ISEKKyogdGhlc2UgY2Fubm90IGJlIGlubGluZXMgYmVjYXVzZSB3ZSBuZWVkIHRoZSBzdHJ1Y3R1cmUgb2Zmc2V0ISEKICogRG9lcyBhbnlvbmUgaGF2ZSBhIGJldHRlciB3YXk/Pz8/PwogKi8KICNkZWZpbmUgdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBtZW1iZXIsIGRhdGEpIFwKQEAgLTMwNDUsNyArMzA0MSw3IEBACiAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBieSB0aGUgVVNCIGNvcmUgd2hpbHN0IHRoZSAidXNiX2FsbF9kZXZpY2VzX3J3c2VtIgogKiBpcyBoZWxkIGZvciB3cml0aW5nLCB0aHVzIHRoaXMgbW9kdWxlIG11c3Qgbm90IGNhbGwgdXNiX3JlbW92ZV9oY2QoKQogKiBzeW5jaHJvbm91c2x5IC0gYnV0IGluc3RlYWQgc2hvdWxkIGltbWVkaWF0ZWx5IHN0b3AgYWN0aXZpdHkgdG8gdGhlCi0qIGRldmljZSBhbmQgYW5zeW5jaHJvbm91c2x5IGNhbGwgdXNiX3JlbW92ZV9oY2QoKQorKiBkZXZpY2UgYW5kIGFzeW5jaHJvbm91c2x5IGNhbGwgdXNiX3JlbW92ZV9oY2QoKQogKi8KIHN0YXRpYyBpbnQgX19kZXZleGl0IHUxMzJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0zMjQxLDcgKzMyMzcsNyBAQAogI2RlZmluZSB1MTMyX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIC8qCi0qIHRoaXMgZHJpdmVyIGlzIGxvYWRlZCBleHBsaWNpdGVseSBieSBmdGRpX3UxMzIKKyogdGhpcyBkcml2ZXIgaXMgbG9hZGVkIGV4cGxpY2l0bHkgYnkgZnRkaV91MTMyCiAqCiAqIHRoZSBwbGF0Zm9ybV9kcml2ZXIgc3RydWN0IGlzIHN0YXRpYyBiZWNhdXNlIGl0IGlzIHBlciB0eXBlIG9mIG1vZHVsZQogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCmluZGV4IDMwMzhlZDAuLjhjY2RkZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKKysrIGIvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAKIAluZXdfZGVzYy0+Y29udGV4dC5zY3NpX3N0YXR1cyA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfZGVzYy0+Y29udGV4dC5zY3NpX3N0YXR1cykKLQkJZ290byBvdXRfa2ZyZWUyOworCQlnb3RvIG91dF9mcmVlX3VyYjsKIAogCW5ld19kZXNjLT51c2JfZGV2ID0gZGV2OwogCW5ld19kZXNjLT51c2JfaW50ZiA9IGludGY7CkBAIC04MjIsMTggKzgyMiwyMCBAQAogCW5ld19kZXNjLT5ob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtdHNfc2NzaV9ob3N0X3RlbXBsYXRlLAogCQkJc2l6ZW9mKG5ld19kZXNjKSk7CiAJaWYgKCFuZXdfZGVzYy0+aG9zdCkKLQkJZ290byBvdXRfZnJlZV91cmI7CisJCWdvdG8gb3V0X2tmcmVlMjsKIAogCW5ld19kZXNjLT5ob3N0LT5ob3N0ZGF0YVswXSA9ICh1bnNpZ25lZCBsb25nKW5ld19kZXNjOwogCWlmIChzY3NpX2FkZF9ob3N0KG5ld19kZXNjLT5ob3N0LCBOVUxMKSkgewogCQllcnJfcmV0dmFsID0gLUVJTzsKLQkJZ290byBvdXRfZnJlZV91cmI7CisJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KIAlzY3NpX3NjYW5faG9zdChuZXdfZGVzYy0+aG9zdCk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIG5ld19kZXNjKTsKIAlyZXR1cm4gMDsKIAorIG91dF9ob3N0X3B1dDoKKwlzY3NpX2hvc3RfcHV0KG5ld19kZXNjLT5ob3N0KTsKICBvdXRfa2ZyZWUyOgogCWtmcmVlKG5ld19kZXNjLT5jb250ZXh0LnNjc2lfc3RhdHVzKTsKICBvdXRfZnJlZV91cmI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwppbmRleCAyMGRiMzY0Li42NjFhZjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKQEAgLTIyMSw2ICsyMjEsNyBAQAogCSAgLSBJVE0KIAkgIC0gc29tZSBvdGhlciBlVHVyYm9Ub3VjaAogCSAgLSBHdW56ZSBBSEw2MQorCSAgLSBETUMgVFNDLTEwLzI1CiAKIAkgIEhhdmUgYSBsb29rIGF0IDxodHRwOi8vbGludXguY2hhcHRlcjcuY2gvdG91Y2hraXQvPiBmb3IKIAkgIGEgdXNhZ2UgZGVzY3JpcHRpb24gYW5kIHRoZSByZXF1aXJlZCB1c2VyLXNwYWNlIHN0dWZmLgpAQCAtMjU4LDYgKzI1OSwxMSBAQAogCWJvb2wgIkd1bnplIEFITDYxIGRldmljZSBzdXBwb3J0IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX1RPVUNIU0NSRUVOCiAKK2NvbmZpZyBVU0JfVE9VQ0hTQ1JFRU5fRE1DX1RTQzEwCisJZGVmYXVsdCB5CisJYm9vbCAiRE1DIFRTQy0xMC8yNSBkZXZpY2Ugc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9UT1VDSFNDUkVFTgorCiBjb25maWcgVVNCX1lFQUxJTksKIAl0cmlzdGF0ZSAiWWVhbGluayB1c2ItcDFrIHZvaXAgcGhvbmUiCiAJZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlLmMKaW5kZXggZjY1OWYzMC4uZmYyMzMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYwpAQCAtNjMwLDE5ICs2MzAsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCiB7Ci0JaWYgKGF0aV9yZW1vdGUtPmlycV91cmIpCi0JCXVzYl9mcmVlX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwl1c2JfZnJlZV91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYik7CisJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOwogCi0JaWYgKGF0aV9yZW1vdGUtPm91dF91cmIpCi0JCXVzYl9mcmVlX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKKwl1c2JfYnVmZmVyX2ZyZWUoYXRpX3JlbW90ZS0+dWRldiwgREFUQV9CVUZTSVpFLAorCQlhdGlfcmVtb3RlLT5pbmJ1ZiwgYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKIAotCWlmIChhdGlfcmVtb3RlLT5pbmJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKLQkJCQlhdGlfcmVtb3RlLT5pbmJ1ZiwgYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKLQotCWlmIChhdGlfcmVtb3RlLT5vdXRidWYpCi0JCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCi0JCQkJYXRpX3JlbW90ZS0+aW5idWYsIGF0aV9yZW1vdGUtPm91dGJ1Zl9kbWEpOworCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCisJCWF0aV9yZW1vdGUtPm91dGJ1ZiwgYXRpX3JlbW90ZS0+b3V0YnVmX2RtYSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfaW5pdChzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUyLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlMi5jCmluZGV4IGY5ODJhMmIuLjgzZjFmNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUyLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZTIuYwpAQCAtMzcyLDggKzM3Miw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCWlmIChhcjItPnVyYltpXSkKLQkJCXVzYl9mcmVlX3VyYihhcjItPnVyYltpXSk7CisJCXVzYl9mcmVlX3VyYihhcjItPnVyYltpXSk7CiAKIAkJaWYgKGFyMi0+YnVmW2ldKQogCQkJdXNiX2J1ZmZlcl9mcmVlKGFyMi0+dWRldiwgNCwgYXIyLT5idWZbaV0sIGFyMi0+YnVmX2RtYVtpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwppbmRleCA2ZDA4YTNiLi5hNDk2NDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKQEAgLTk2OCwyMCArOTY4LDI5IEBACiAJCWhpZF9pb19lcnJvcihoaWQpOwogfQogCi0vKiBXb3JrcXVldWUgcm91dGluZSB0byByZXNldCB0aGUgZGV2aWNlICovCisvKiBXb3JrcXVldWUgcm91dGluZSB0byByZXNldCB0aGUgZGV2aWNlIG9yIGNsZWFyIGEgaGFsdCAqLwogc3RhdGljIHZvaWQgaGlkX3Jlc2V0KHZvaWQgKl9oaWQpCiB7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IChzdHJ1Y3QgaGlkX2RldmljZSAqKSBfaGlkOwotCWludCByY19sb2NrLCByYzsKKwlpbnQgcmNfbG9jaywgcmMgPSAwOwogCi0JZGV2X2RiZygmaGlkLT5pbnRmLT5kZXYsICJyZXNldHRpbmcgZGV2aWNlXG4iKTsKLQlyYyA9IHJjX2xvY2sgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGhpZC0+ZGV2LCBoaWQtPmludGYpOwotCWlmIChyY19sb2NrID49IDApIHsKLQkJcmMgPSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZShoaWQtPmRldiwgaGlkLT5pbnRmKTsKLQkJaWYgKHJjX2xvY2spCi0JCQl1c2JfdW5sb2NrX2RldmljZShoaWQtPmRldik7CisJaWYgKHRlc3RfYml0KEhJRF9DTEVBUl9IQUxULCAmaGlkLT5pb2ZsKSkgeworCQlkZXZfZGJnKCZoaWQtPmludGYtPmRldiwgImNsZWFyIGhhbHRcbiIpOworCQlyYyA9IHVzYl9jbGVhcl9oYWx0KGhpZC0+ZGV2LCBoaWQtPnVyYmluLT5waXBlKTsKKwkJY2xlYXJfYml0KEhJRF9DTEVBUl9IQUxULCAmaGlkLT5pb2ZsKTsKKwkJaGlkX3N0YXJ0X2luKGhpZCk7CiAJfQotCWNsZWFyX2JpdChISURfUkVTRVRfUEVORElORywgJmhpZC0+aW9mbCk7CisKKwllbHNlIGlmICh0ZXN0X2JpdChISURfUkVTRVRfUEVORElORywgJmhpZC0+aW9mbCkpIHsKKwkJZGV2X2RiZygmaGlkLT5pbnRmLT5kZXYsICJyZXNldHRpbmcgZGV2aWNlXG4iKTsKKwkJcmMgPSByY19sb2NrID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChoaWQtPmRldiwgaGlkLT5pbnRmKTsKKwkJaWYgKHJjX2xvY2sgPj0gMCkgeworCQkJcmMgPSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZShoaWQtPmRldiwgaGlkLT5pbnRmKTsKKwkJCWlmIChyY19sb2NrKQorCQkJCXVzYl91bmxvY2tfZGV2aWNlKGhpZC0+ZGV2KTsKKwkJfQorCQljbGVhcl9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZoaWQtPmlvZmwpOworCX0KIAogCXN3aXRjaCAocmMpIHsKIAljYXNlIDA6CkBAIC0xMDIzLDkgKzEwMzIsOCBAQAogCiAJCS8qIFJldHJpZXMgZmFpbGVkLCBzbyBkbyBhIHBvcnQgcmVzZXQgKi8KIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmaGlkLT5pb2ZsKSkgewotCQkJaWYgKHNjaGVkdWxlX3dvcmsoJmhpZC0+cmVzZXRfd29yaykpCi0JCQkJZ290byBkb25lOwotCQkJY2xlYXJfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmaGlkLT5pb2ZsKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmhpZC0+cmVzZXRfd29yayk7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CiAKQEAgLTEwNDksNiArMTA1NywxMSBAQAogCQkJaGlkLT5yZXRyeV9kZWxheSA9IDA7CiAJCQloaWRfaW5wdXRfcmVwb3J0KEhJRF9JTlBVVF9SRVBPUlQsIHVyYiwgMSk7CiAJCQlicmVhazsKKwkJY2FzZSAtRVBJUEU6CQkvKiBzdGFsbCAqLworCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKKwkJCXNldF9iaXQoSElEX0NMRUFSX0hBTFQsICZoaWQtPmlvZmwpOworCQkJc2NoZWR1bGVfd29yaygmaGlkLT5yZXNldF93b3JrKTsKKwkJCXJldHVybjsKIAkJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCiAJCWNhc2UgLUVOT0VOVDoKIAkJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KQEAgLTE2MjcsNiArMTY0MCwxOSBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVBQTEUJCTB4MDVhYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFCTB4MDMwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0kJMHgwMjBlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPCTB4MDIwZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9BTlNJCTB4MDIxNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08JMHgwMjE1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUwkweDAyMTYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0FOU0kJMHgwMjE3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08JMHgwMjE4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19KSVMJMHgwMjE5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJCTB4MDIxYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPCTB4MDIxYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSklTCTB4MDIxYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkJMHgwMzBhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZCTB4MDMwYgogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hFUlJZCQkweDA0NmEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSEVSUllfQ1lNT1RJT04JMHgwMDIzCkBAIC0xNzk0LDE3ICsxODIwLDE5IEBACiAKIAl7IFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTiwgSElEX1FVSVJLX0NZTU9USU9OIH0sCiAKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIwRSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIwRiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNCwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAyMTYsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAyMTcsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCAweDAyMTgsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX1BPV0VSQk9PS19JU09fS0VZQk9BUkR9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE5LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjFCLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBBLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBCLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9JU08sIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9BTlNJLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19QT1dFUkJPT0tfSVNPX0tFWUJPQVJEfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0lTTywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0FOU0ksIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAogCiAJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAxLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAyLCBISURfUVVJUktfSUdOT1JFIH0sCkBAIC0xOTg1LDcgKzIwMTMsNyBAQAogCQlpZiAoaGlkLT5jb2xsZWN0aW9uLT51c2FnZSA9PSBISURfR0RfTU9VU0UgJiYgaGlkX21vdXNlcG9sbF9pbnRlcnZhbCA+IDApCiAJCQlpbnRlcnZhbCA9IGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWw7CiAKLQkJaWYgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgeworCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9pbihlbmRwb2ludCkpIHsKIAkJCWlmIChoaWQtPnVyYmluKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCEoaGlkLT51cmJpbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKQpAQCAtMjA2NywxMyArMjA5NSw5IEBACiAJcmV0dXJuIGhpZDsKIAogZmFpbDoKLQotCWlmIChoaWQtPnVyYmluKQotCQl1c2JfZnJlZV91cmIoaGlkLT51cmJpbik7Ci0JaWYgKGhpZC0+dXJib3V0KQotCQl1c2JfZnJlZV91cmIoaGlkLT51cmJvdXQpOwotCWlmIChoaWQtPnVyYmN0cmwpCi0JCXVzYl9mcmVlX3VyYihoaWQtPnVyYmN0cmwpOworCXVzYl9mcmVlX3VyYihoaWQtPnVyYmluKTsKKwl1c2JfZnJlZV91cmIoaGlkLT51cmJvdXQpOworCXVzYl9mcmVlX3VyYihoaWQtPnVyYmN0cmwpOwogCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOwogCWhpZF9mcmVlX2RldmljZShoaWQpOwogCkBAIC0yMTA0LDggKzIxMjgsNyBAQAogCiAJdXNiX2ZyZWVfdXJiKGhpZC0+dXJiaW4pOwogCXVzYl9mcmVlX3VyYihoaWQtPnVyYmN0cmwpOwotCWlmIChoaWQtPnVyYm91dCkKLQkJdXNiX2ZyZWVfdXJiKGhpZC0+dXJib3V0KTsKKwl1c2JfZnJlZV91cmIoaGlkLT51cmJvdXQpOwogCiAJaGlkX2ZyZWVfYnVmZmVycyhoaWQtPmRldiwgaGlkKTsKIAloaWRfZnJlZV9kZXZpY2UoaGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKaW5kZXggMGU3NmU2ZC4uMmE5YmYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKQEAgLTM4NSw2ICszODUsNyBAQAogI2RlZmluZSBISURfSU5fUlVOTklORwkJMwogI2RlZmluZSBISURfUkVTRVRfUEVORElORwk0CiAjZGVmaW5lIEhJRF9TVVNQRU5ERUQJCTUKKyNkZWZpbmUgSElEX0NMRUFSX0hBTFQJCTYKIAogc3RydWN0IGhpZF9pbnB1dCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYwppbmRleCBjNzMyODVjLi5kYWM4ODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYwpAQCAtMjA4LDEwICsyMDgsOCBAQAogCiBzdGF0aWMgdm9pZCB1c2Jfa2JkX2ZyZWVfbWVtKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCB1c2Jfa2JkICprYmQpCiB7Ci0JaWYgKGtiZC0+aXJxKQotCQl1c2JfZnJlZV91cmIoa2JkLT5pcnEpOwotCWlmIChrYmQtPmxlZCkKLQkJdXNiX2ZyZWVfdXJiKGtiZC0+bGVkKTsKKwl1c2JfZnJlZV91cmIoa2JkLT5pcnEpOworCXVzYl9mcmVlX3VyYihrYmQtPmxlZCk7CiAJaWYgKGtiZC0+bmV3KQogCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCA4LCBrYmQtPm5ldywga2JkLT5uZXdfZG1hKTsKIAlpZiAoa2JkLT5jcikKQEAgLTIzNiw5ICsyMzQsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYm1vdXNlLmMKaW5kZXggY2JiYmVhMy4uNjhhNTU2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jCkBAIC0xMjYsOSArMTI2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7Ci0JaWYgKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwlpZiAoIXVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2J0b3VjaHNjcmVlbi5jCmluZGV4IDkzM2NlZGQuLjQ5NzA0ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdXNidG91Y2hzY3JlZW4uYwpAQCAtOCw2ICs4LDcgQEAKICAqICAtIFBhbkppdCBUb3VjaFNldAogICogIC0gZVR1cmJvVG91Y2gKICAqICAtIEd1bnplIEFITDYxCisgKiAgLSBETUMgVFNDLTEwLzI1CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgYnkgRGFuaWVsIFJpdHogPGRhbmllbC5yaXR6QGdteC5jaD4KICAqIENvcHlyaWdodCAoQykgYnkgVG9kZCBFLiBKb2huc29uIChtdG91Y2h1c2IuYykKQEAgLTMwLDYgKzMxLDggQEAKICAqIC0gSVRNIHBhcnRzIGFyZSBmcm9tIGl0bXRvdWNoLmMKICAqIC0gM00gcGFydHMgYXJlIGZyb20gbXRvdWNodXNiLmMKICAqIC0gUGFuSml0IHBhcnRzIGFyZSBmcm9tIGFuIHVubWVyZ2VkIGRyaXZlciBieSBMYW5zbG90dCBHaXNoCisgKiAtIERNQyBUU0MgMTAvMjUgYXJlIGZyb20gSG9sZ2VyIFNjaHVyaWcsIHdpdGggaWRlYXMgZnJvbSBhbiB1bm1lcmdlZAorICogICBkcml2ZXIgZnJvbSBNYXJpdXMgVm9sbG1lcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDQsNyArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgogCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJ2MC40IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjUiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJEYW5pZWwgUml0eiA8ZGFuaWVsLnJpdHpAZ214LmNoPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJCSJVU0IgVG91Y2hzY3JlZW4gRHJpdmVyIgogCkBAIC0xMDMsNiArMTA2LDcgQEAKIAlERVZUWVBFX0lUTSwKIAlERVZUWVBFX0VUVVJCTywKIAlERVZUWVBFX0dVTlpFLAorCURFVlRZUEVfRE1DX1RTQzEwLAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYnRvdWNoX2RldmljZXNbXSA9IHsKQEAgLTEzOSw2ICsxNDMsMTAgQEAKIAl7VVNCX0RFVklDRSgweDA2MzcsIDB4MDAwMSksIC5kcml2ZXJfaW5mbyA9IERFVlRZUEVfR1VOWkV9LAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX1RPVUNIU0NSRUVOX0RNQ19UU0MxMAorCXtVU0JfREVWSUNFKDB4MGFmYSwgMHgwM2U4KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9ETUNfVFNDMTB9LAorI2VuZGlmCisKIAl7fQogfTsKIApAQCAtMzEzLDYgKzMyMSw4MCBAQAogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRE1DIFRTQy0xMC8yNSBQYXJ0CisgKgorICogRG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgY29udHJvbGxlciBhbmQgaXQncyBwcm90b2NvbCBjYW4gYmUgZm91bmQgYXQKKyAqICAgaHR0cDovL3d3dy5kbWNjb2x0ZC5jb20vZmlsZXMvY29udHJvbGVyL3RzYzEwdXNiX3BpX2UucGRmCisgKiAgIGh0dHA6Ly93d3cuZG1jY29sdGQuY29tL2ZpbGVzL2NvbnRyb2xlci90c2MyNV91c2JfZS5wZGYKKyAqLworI2lmZGVmIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU5fRE1DX1RTQzEwCisKKy8qIHN1cHBvcnRlZCBkYXRhIHJhdGVzLiBjdXJyZW50bHkgdXNpbmcgMTMwICovCisjZGVmaW5lIFRTQzEwX1JBVEVfUE9JTlQJMHg1MAorI2RlZmluZSBUU0MxMF9SQVRFXzMwCQkweDQwCisjZGVmaW5lIFRTQzEwX1JBVEVfNTAJCTB4NDEKKyNkZWZpbmUgVFNDMTBfUkFURV84MAkJMHg0MgorI2RlZmluZSBUU0MxMF9SQVRFXzEwMAkJMHg0MworI2RlZmluZSBUU0MxMF9SQVRFXzEzMAkJMHg0NAorI2RlZmluZSBUU0MxMF9SQVRFXzE1MAkJMHg0NQorCisvKiBjb21tYW5kcyAqLworI2RlZmluZSBUU0MxMF9DTURfUkVTRVQJCTB4NTUKKyNkZWZpbmUgVFNDMTBfQ01EX1JBVEUJCTB4MDUKKyNkZWZpbmUgVFNDMTBfQ01EX0RBVEExCQkweDAxCisKK3N0YXRpYyBpbnQgZG1jX3RzYzEwX2luaXQoc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHVzYnRvdWNoLT51ZGV2OworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisKKwkvKiByZXNldCAqLworCWJ1ZlswXSA9IGJ1ZlsxXSA9IDB4RkY7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlIChkZXYsIDApLAorCSAgICAgICAgICAgICAgICAgICAgICBUU0MxMF9DTURfUkVTRVQsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCSAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBidWYsIDIsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoYnVmWzBdICE9IDB4MDYgfHwgYnVmWzFdICE9IDB4MDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogc2V0IGNvb3JkaW5hdGUgb3V0cHV0IHJhdGUgKi8KKwlidWZbMF0gPSBidWZbMV0gPSAweEZGOworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZSAoZGV2LCAwKSwKKwkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfQ01EX1JBVEUsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCSAgICAgICAgICAgICAgICAgICAgICBUU0MxMF9SQVRFXzE1MCwgMCwgYnVmLCAyLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKGJ1ZlswXSAhPSAweDA2IHx8IGJ1ZlsxXSAhPSAweDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZSAoZGV2LCAwKSwKKwkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfQ01EX0RBVEExLAorCSAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZG1jX3RzYzEwX3JlYWRfZGF0YSh1bnNpZ25lZCBjaGFyICpwa3QsIGludCAqeCwgaW50ICp5LCBpbnQgKnRvdWNoLCBpbnQgKnByZXNzKQoreworCSp4ID0gKChwa3RbMl0gJiAweDAzKSA8PCA4KSB8IHBrdFsxXTsKKwkqeSA9ICgocGt0WzRdICYgMHgwMykgPDwgOCkgfCBwa3RbM107CisJKnRvdWNoID0gcGt0WzBdICYgMHgwMTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB0aGUgZGlmZmVyZW50IGRldmljZSBkZXNjcmlwdG9ycwogICovCiBzdGF0aWMgc3RydWN0IHVzYnRvdWNoX2RldmljZV9pbmZvIHVzYnRvdWNoX2Rldl9pbmZvW10gPSB7CkBAIC0zODksNiArNDcxLDE4IEBACiAJCS5yZWFkX2RhdGEJPSBndW56ZV9yZWFkX2RhdGEsCiAJfSwKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9UT1VDSFNDUkVFTl9ETUNfVFNDMTAKKwlbREVWVFlQRV9ETUNfVFNDMTBdID0geworCQkubWluX3hjCQk9IDB4MCwKKwkJLm1heF94YwkJPSAweDAzZmYsCisJCS5taW5feWMJCT0gMHgwLAorCQkubWF4X3ljCQk9IDB4MDNmZiwKKwkJLnJlcHRfc2l6ZQk9IDUsCisJCS5pbml0CQk9IGRtY190c2MxMF9pbml0LAorCQkucmVhZF9kYXRhCT0gZG1jX3RzYzEwX3JlYWRfZGF0YSwKKwl9LAorI2VuZGlmCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmggYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5oCmluZGV4IDFjZjA4ZjAuLmQ4NWFiZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uaApAQCAtMTEwLDcgKzExMCw2IEBACiB9OwogCiBleHRlcm4gaW50IHdhY29tX3dhY19pcnEoc3RydWN0IHdhY29tX3dhYyAqIHdhY29tX3dhYywgdm9pZCAqIHdjb21ibyk7Ci1leHRlcm4gdm9pZCB3YWNvbV9zeXNfaXJxKHN0cnVjdCB1cmIgKnVyYik7CiBleHRlcm4gdm9pZCB3YWNvbV9yZXBvcnRfYWJzKHZvaWQgKndjb21ibywgdW5zaWduZWQgaW50IGFic190eXBlLCBpbnQgYWJzX2RhdGEpOwogZXh0ZXJuIHZvaWQgd2Fjb21fcmVwb3J0X3JlbCh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCByZWxfdHlwZSwgaW50IHJlbF9kYXRhKTsKIGV4dGVybiB2b2lkIHdhY29tX3JlcG9ydF9rZXkodm9pZCAqd2NvbWJvLCB1bnNpZ25lZCBpbnQga2V5X3R5cGUsIGludCBrZXlfZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV9zeXMuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jCmluZGV4IDM0OThiODkuLmU3Y2MyMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jCkBAIC00Miw3ICs0Miw3IEBACiAJcmV0dXJuIHdjb21iby0+d2Fjb20tPmRldjsKIH0KIAotdm9pZCB3YWNvbV9zeXNfaXJxKHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyB2b2lkIHdhY29tX3N5c19pcnEoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHdhY29tX2NvbWJvIHdjb21ibzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuYwppbmRleCA5MDViZjYzLi4yMjY4Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jCkBAIC04NTksMTAgKzg1OSw4IEBACiAKIAlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7Ci0JaWYgKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAl5bGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeWVhbGlua19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXlsZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCmluZGV4IDExZGM1OTUuLjJjYmEwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAKICMKIAogb2JqLSQoQ09ORklHX1VTQl9BRFVUVVgpCSs9IGFkdXR1eC5vCitvYmotJChDT05GSUdfVVNCX0FQUExFRElTUExBWSkJKz0gYXBwbGVkaXNwbGF5Lm8KIG9iai0kKENPTkZJR19VU0JfQVVFUlNXQUxEKQkrPSBhdWVyc3dhbGQubwogb2JqLSQoQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MykrPSBjeXByZXNzX2N5N2M2My5vCiBvYmotJChDT05GSUdfVVNCX0NZVEhFUk0pCSs9IGN5dGhlcm0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKaW5kZXggNmIyM2ExZC4uYmEzMGNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCkBAIC0yMTYsMTAgKzIxNiw3IEBACiAJaWZhY2VfZGVzYyA9IGlmYWNlLT5jdXJfYWx0c2V0dGluZzsKIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKLQkJaWYgKCFpbnRfaW5fZW5kcG9pbnRBZGRyICYmCi0JCSAgICAoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCSAgICAgVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgeworCQlpZiAoIWludF9pbl9lbmRwb2ludEFkZHIgJiYgdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpIHsKIAkJCS8qIHdlIGZvdW5kIGFuIGludGVycnVwdCBpbiBlbmRwb2ludCAqLwogCQkJaW50X2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwppbmRleCBlNDk3MWQ2Li5jNzAzZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKQEAgLTcwNCw5ICs3MDQsNyBAQAogewogCWtmcmVlKGJwLT5idWZwKTsKIAlrZnJlZShicC0+ZHIpOwotCWlmIChicC0+dXJicCkgewotCQl1c2JfZnJlZV91cmIoYnAtPnVyYnApOwotCX0KKwl1c2JfZnJlZV91cmIoYnAtPnVyYnApOwogCWtmcmVlKGJwKTsKIH0KIApAQCAtMTE1NSw4ICsxMTUzLDcgQEAKICAgICAgICAgZGJnICgiYXVlcnN3YWxkX2ludF9yZWxlYXNlIik7CiAKICAgICAgICAgLyogc3RvcCB0aGUgaW50IGVuZHBvaW50ICovCi0gICAgICAgIGlmIChjcC0+aW50dXJicCkKLSAgICAgICAgICAgICAgICB1c2Jfa2lsbF91cmIgKGNwLT5pbnR1cmJwKTsKKwl1c2Jfa2lsbF91cmIgKGNwLT5pbnR1cmJwKTsKIAogICAgICAgICAvKiBkZWFsbG9jYXRlIG1lbW9yeSAqLwogICAgICAgICBhdWVyc3dhbGRfaW50X2ZyZWUgKGNwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwppbmRleCAxZmQ5Y2I4Li41YzBhMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCkBAIC01MywxMyArNTMsMTIgQEAKIHN0YXRpYyBpbnQgZW1pMjZfd3JpdGVtZW1vcnkgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoLCBfX3U4IHJlcXVlc3QpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAga21hbGxvYyAobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAga21lbWR1cChkYXRhLCBsZW5ndGgsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFidWZmZXIpIHsKIAkJZXJyKCJlbWkyNjoga21hbGxvYyglZCkgZmFpbGVkLiIsIGxlbmd0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1jcHkgKGJ1ZmZlciwgZGF0YSwgbGVuZ3RoKTsKIAkvKiBOb3RlOiB1c2JfY29udHJvbF9tc2cgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciBvciBsZW5ndGggb2YgdGhlCiAJICogCQkgZGF0YSB0aGF0IHdhcyB3cml0dGVuISAqLwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgcmVxdWVzdCwgMHg0MCwgYWRkcmVzcywgMCwgYnVmZmVyLCBsZW5ndGgsIDMwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMKaW5kZXggZmUzNTEzNy4uMjMxNTNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9lbWk2Mi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYwpAQCAtNjEsMTMgKzYxLDEyIEBACiBzdGF0aWMgaW50IGVtaTYyX3dyaXRlbWVtb3J5IChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgYWRkcmVzcywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgX191OCByZXF1ZXN0KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0gIGttYWxsb2MgKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyID0gIGttZW1kdXAoZGF0YSwgbGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAogCWlmICghYnVmZmVyKSB7CiAJCWVycigiZW1pNjI6IGttYWxsb2MoJWQpIGZhaWxlZC4iLCBsZW5ndGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtY3B5IChidWZmZXIsIGRhdGEsIGxlbmd0aCk7CiAJLyogTm90ZTogdXNiX2NvbnRyb2xfbXNnIHJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3Igb3IgbGVuZ3RoIG9mIHRoZQogCSAqIAkJIGRhdGEgdGhhdCB3YXMgd3JpdHRlbiEgKi8KIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksIHJlcXVlc3QsIDB4NDAsIGFkZHJlc3MsIDAsIGJ1ZmZlciwgbGVuZ3RoLCAzMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYyBiL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKaW5kZXggOWI1OTFiOC4uY2IwYmEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCkBAIC0zMDMsNyArMzAzLDcgQEAKIAogCiBFWFBPUlRfU1lNQk9MX0dQTChmdGRpX2VsYW5fZ29uZV9hd2F5KTsKLXZvaWQgZnRkaV9yZWxlYXNlX3BsYXRmb3JtX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBmdGRpX3JlbGVhc2VfcGxhdGZvcm1fZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKICAgICAgICAgZGV2LT5wYXJlbnQgPSBOVUxMOwogfQpAQCAtMTQyNiwxNCArMTQyNiw2IEBACiAgICAgICAgIH0KIH0KIAotaW50IHVzYl9mdGRpX2VsYW5fcmVhZF9yZWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTMyICpkYXRhKQotewotICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBwbGF0Zm9ybV9kZXZpY2VfdG9fdXNiX2Z0ZGkocGRldik7Ci0gICAgICAgIHJldHVybiBmdGRpX2VsYW5fcmVhZF9yZWcoZnRkaSwgZGF0YSk7Ci19Ci0KLQotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Z0ZGlfZWxhbl9yZWFkX3JlZyk7CiBzdGF0aWMgaW50IGZ0ZGlfZWxhbl9yZWFkX2NvbmZpZyhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIGludCBjb25maWdfb2Zmc2V0LAogICAgICAgICB1OCB3aWR0aCwgdTMyICpkYXRhKQogewpAQCAtMjYzMywxMCArMjYyNSw3IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgewogICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAgICAgICAgICAgICAgICAgaWYgKCFmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKLSAgICAgICAgICAgICAgICAgICAgICAgID09IFVTQl9ESVJfSU4pICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpCi0gICAgICAgICAgICAgICAgICAgICAgICB7CisJCSAgICB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKQEAgLTI2NDksMTAgKzI2MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWZ0ZGktPmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKLSAgICAgICAgICAgICAgICAgICAgICAgID09IFVTQl9ESVJfT1VUKSAmJiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJgotICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspKQotICAgICAgICAgICAgICAgICAgICAgICAgeworCQkgICAgdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMgYi9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYwppbmRleCA4ZTZlMTk1Li5jOTQxODUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYwpAQCAtMTI1LDEyICsxMjUsMTIgQEAKIAogc3RhdGljIGludCBpZG1vdXNlX2NyZWF0ZV9pbWFnZShzdHJ1Y3QgdXNiX2lkbW91c2UgKmRldikKIHsKLQlpbnQgYnl0ZXNfcmVhZCA9IDA7Ci0JaW50IGJ1bGtfcmVhZCA9IDA7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IGJ5dGVzX3JlYWQ7CisJaW50IGJ1bGtfcmVhZDsKKwlpbnQgcmVzdWx0OwogCiAJbWVtY3B5KGRldi0+YnVsa19pbl9idWZmZXIsIEhFQURFUiwgc2l6ZW9mKEhFQURFUiktMSk7Ci0JYnl0ZXNfcmVhZCArPSBzaXplb2YoSEVBREVSKS0xOworCWJ5dGVzX3JlYWQgPSBzaXplb2YoSEVBREVSKS0xOwogCiAJLyogcmVzZXQgdGhlIGRldmljZSBhbmQgc2V0IGEgZmFzdCBibGluayByYXRlICovCiAJcmVzdWx0ID0gZnRpcF9jb21tYW5kKGRldiwgRlRJUF9SRUxFQVNFLCAwLCAwKTsKQEAgLTIwOCw5ICsyMDgsOSBAQAogCiBzdGF0aWMgaW50IGlkbW91c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdXNiX2lkbW91c2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9pZG1vdXNlICpkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0OwogCiAJLyogcHJldmVudCBkaXNjb25uZWN0cyAqLwogCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCQkJbG9mZl90ICogcHBvcykKIHsKIAlzdHJ1Y3QgdXNiX2lkbW91c2UgKmRldjsKLQlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0OwogCiAJZGV2ID0gKHN0cnVjdCB1c2JfaWRtb3VzZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKQEAgLTMyOSw3ICszMjksNyBAQAogCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKLQlzdHJ1Y3QgdXNiX2lkbW91c2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9pZG1vdXNlICpkZXY7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCWludCByZXN1bHQ7CkBAIC0zNTAsMTEgKzM1MCw3IEBACiAKIAkvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uIC0gdXNlIG9ubHkgdGhlIGZpcnN0IGJ1bGstaW4gZW5kcG9pbnQgKi8KIAllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFswXS5kZXNjOwotCWlmICghZGV2LT5idWxrX2luX2VuZHBvaW50QWRkcgotCQkmJiAoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQotCQkmJiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKLQorCWlmICghZGV2LT5idWxrX2luX2VuZHBvaW50QWRkciAmJiB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKIAkJLyogd2UgZm91bmQgYSBidWxrIGluIGVuZHBvaW50ICovCiAJCWRldi0+b3JpZ19iaV9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJZGV2LT5idWxrX2luX3NpemUgPSAweDIwMDsgLyogd29ya3MgX211Y2hfIGZhc3RlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYyBiL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKaW5kZXggMjcwODk0OS4uNWRjZTc5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCkBAIC0zMTcsMTIgKzMxNyw4IEBACiAJdG93ZXJfYWJvcnRfdHJhbnNmZXJzIChkZXYpOwogCiAJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KLQlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiICE9IE5VTEwpIHsKLQkJdXNiX2ZyZWVfdXJiIChkZXYtPmludGVycnVwdF9pbl91cmIpOwotCX0KLQlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiAhPSBOVUxMKSB7Ci0JCXVzYl9mcmVlX3VyYiAoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7Ci0JfQorCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKIAlrZnJlZSAoZGV2LT5yZWFkX2J1ZmZlcik7CiAJa2ZyZWUgKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcik7CiAJa2ZyZWUgKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOwpAQCAtNTAyLDE1ICs0OTgsMTEgQEAKIAlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZykgewogCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKIAkJbWIoKTsKLQkJaWYgKGRldi0+aW50ZXJydXB0X2luX3VyYiAhPSBOVUxMICYmIGRldi0+dWRldikgeworCQlpZiAoZGV2LT51ZGV2KQogCQkJdXNiX2tpbGxfdXJiIChkZXYtPmludGVycnVwdF9pbl91cmIpOwotCQl9CiAJfQotCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkgewotCQlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiAhPSBOVUxMICYmIGRldi0+dWRldikgewotCQkJdXNiX2tpbGxfdXJiIChkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKLQkJfQotCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgJiYgZGV2LT51ZGV2KQorCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CiAKIGV4aXQ6CiAJZGJnKDIsICIlczogbGVhdmUiLCBfX0ZVTkNUSU9OX18pOwpAQCAtODk4LDE0ICs4OTAsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKIAotCQlpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7Ci0JCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OwotCQl9Ci0KLQkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKLQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OworCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVuZHBvaW50KSkgeworCQkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZW5kcG9pbnQpKQorCQkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID0gZW5kcG9pbnQ7CisJCQllbHNlCisJCQkJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID0gZW5kcG9pbnQ7CiAJCX0KIAl9CiAJaWYoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRraXQuYwppbmRleCBhYmI0ZGNkLi45MTEwNzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRraXQuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRraXQuYwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwotCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkpIAorCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlbmRwb2ludCkpCiAJCXJldHVybiAtRU5PREVWOwogCS8qCiAJICogYm1BdHRyaWJ1dGVzCkBAIC02NTAsOCArNjUwLDcgQEAKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGtpdC0+ZGV2LCAmZGV2X291dHB1dF9hdHRyc1tpXSk7CiBvdXQ6CiAJaWYgKGtpdCkgewotCQlpZiAoa2l0LT5pcnEpCi0JCQl1c2JfZnJlZV91cmIoa2l0LT5pcnEpOworCQl1c2JfZnJlZV91cmIoa2l0LT5pcnEpOwogCQlpZiAoa2l0LT5kYXRhKQogCQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgVVJCX0lOVF9TSVpFLCBraXQtPmRhdGEsIGtpdC0+ZGF0YV9kbWEpOwogCQlpZiAoa2l0LT5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCmluZGV4IDVjNzgwY2EuLmMzNDY5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7Ci0JaWYgKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSkKKwlpZiAoIXVzYl9lbmRwb2ludF9kaXJfaW4oZW5kcG9pbnQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCkBAIC0zOTIsOCArMzkyLDcgQEAKIAkJZGV2aWNlX3JlbW92ZV9maWxlKG1jLT5kZXYsICZkZXZfYXR0cnNbaV0pOwogb3V0OgogCWlmIChtYykgewotCQlpZiAobWMtPmlycSkKLQkJCXVzYl9mcmVlX3VyYihtYy0+aXJxKTsKKwkJdXNiX2ZyZWVfdXJiKG1jLT5pcnEpOwogCQlpZiAobWMtPmRhdGEpCiAJCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBVUkJfSU5UX1NJWkUsIG1jLT5kYXRhLCBtYy0+ZGF0YV9kbWEpOwogCQlpZiAobWMtPmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNiX3UxMzIuaCBiL2RyaXZlcnMvdXNiL21pc2MvdXNiX3UxMzIuaAppbmRleCA1NTFiYTg5Li5kYzJlNWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYl91MTMyLmgKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JfdTEzMi5oCkBAIC01Miw3ICs1Miw3IEBACiAqIHRoZSBrZXJuZWwgdG8gbG9hZCB0aGUgInUxMzItaGNkIiBtb2R1bGUuCiAqCiAqIFRoZSAiZnRkaS11MTMyIiBtb2R1bGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0byB0aGUgaW5zZXJ0ZWQKLSogUEMgY2FyZCBhbmQgdGhlICJ1MTMyLWhjZCIgbW9kdWxlIHVzZXMgdGhlIEFQSSB0byBzZW5kIGFuZCByZWNpZXZlCisqIFBDIGNhcmQgYW5kIHRoZSAidTEzMi1oY2QiIG1vZHVsZSB1c2VzIHRoZSBBUEkgdG8gc2VuZCBhbmQgcmVjZWl2ZQogKiBkYXRhLiBUaGUgQVBJIGZlYXR1cmVzIGNhbGwtYmFja3MsIHNvIHRoYXQgcGFydCBvZiB0aGUgInUxMzItaGNkIgogKiBtb2R1bGUgY29kZSB3aWxsIHJ1biBpbiB0aGUgY29udGV4dCBvZiBvbmUgb2YgdGhlIGtlcm5lbCB0aHJlYWRzCiAqIG9mIHRoZSAiZnRkaS11MTMyIiBtb2R1bGUuCkBAIC05NSwzICs5NSw3IEBACiAgICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSk7CiBpbnQgdXNiX2Z0ZGlfZWxhbl9lZHNldF9mbHVzaChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBlZF9udW1iZXIsCiAgICAgICAgIHZvaWQgKmVuZHApOworaW50IHVzYl9mdGRpX2VsYW5fcmVhZF9wY2ltZW0oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IG1lbV9vZmZzZXQsCisJCQkgICAgICB1OCB3aWR0aCwgdTMyICpkYXRhKTsKK2ludCB1c2JfZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgbWVtX29mZnNldCwKKwkJCSAgICAgICB1OCB3aWR0aCwgdTMyIGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwppbmRleCA3YzJjYmRmLi4xOTQwNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCQlkZWZhdWx0OgogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKCZlLT5kZXNjKSkgewogCQkJCWlmICghaW4pCiAJCQkJCWluID0gZTsKIAkJCX0gZWxzZSB7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJCX0KIAkJCWNvbnRpbnVlOwogdHJ5X2lzbzoKLQkJCWlmIChlLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7CisJCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9pbigmZS0+ZGVzYykpIHsKIAkJCQlpZiAoIWlzb19pbikKIAkJCQkJaXNvX2luID0gZTsKIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwppbmRleCA4ODE4NDFlLi45NWU2ODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMKQEAgLTI0OSw5ICsyNDksOSBAQAogCiAJcmVxLT5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0U7CiAJcmVxLT5iUmVxdWVzdCA9IGNtZDsKLQlyZXEtPndWYWx1ZSA9IHZhbHVlOwotCXJlcS0+d0luZGV4ID0gaW5kZXg7Ci0JcmVxLT53TGVuZ3RoID0gc2l6ZTsKKwlyZXEtPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlyZXEtPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKIAogCXVzYl9maWxsX2NvbnRyb2xfdXJiKHVyYiwgZGV2LT51ZGV2LAogCQkJICAgICB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMgYi9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jCmluZGV4IGY3NDAzMjUuLjkwN2I4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2NhdGMuYwpAQCAtNzg2LDE0ICs3ODYsMTAgQEAKIAlpZiAoKCFjYXRjLT5jdHJsX3VyYikgfHwgKCFjYXRjLT50eF91cmIpIHx8IAogCSAgICAoIWNhdGMtPnJ4X3VyYikgfHwgKCFjYXRjLT5pcnFfdXJiKSkgewogCQllcnIoIk5vIGZyZWUgdXJicyBhdmFpbGFibGUuIik7Ci0JCWlmIChjYXRjLT5jdHJsX3VyYikKLQkJCXVzYl9mcmVlX3VyYihjYXRjLT5jdHJsX3VyYik7Ci0JCWlmIChjYXRjLT50eF91cmIpCi0JCQl1c2JfZnJlZV91cmIoY2F0Yy0+dHhfdXJiKTsKLQkJaWYgKGNhdGMtPnJ4X3VyYikKLQkJCXVzYl9mcmVlX3VyYihjYXRjLT5yeF91cmIpOwotCQlpZiAoY2F0Yy0+aXJxX3VyYikKLQkJCXVzYl9mcmVlX3VyYihjYXRjLT5pcnFfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKGNhdGMtPmN0cmxfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKGNhdGMtPnR4X3VyYik7CisJCXVzYl9mcmVlX3VyYihjYXRjLT5yeF91cmIpOworCQl1c2JfZnJlZV91cmIoY2F0Yy0+aXJxX3VyYik7CiAJCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9jZGNfZXRoZXIuYyBiL2RyaXZlcnMvdXNiL25ldC9jZGNfZXRoZXIuYwppbmRleCBmNjk3MWI4Li40NGE5MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2NkY19ldGhlci5jCkBAIC0yMDAsOCArMjAwLDcgQEAKIAogCQlkZXYtPnN0YXR1cyA9ICZpbmZvLT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQgWzBdOwogCQlkZXNjID0gJmRldi0+c3RhdHVzLT5kZXNjOwotCQlpZiAoZGVzYy0+Ym1BdHRyaWJ1dGVzICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVAotCQkJCXx8ICEoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pCisJCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihkZXNjKQogCQkJCXx8IChsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkKIAkJCQkJPCBzaXplb2Yoc3RydWN0IHVzYl9jZGNfbm90aWZpY2F0aW9uKSkKIAkJCQl8fCAhZGVzYy0+YkludGVydmFsKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jIGIvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYwppbmRleCBjZTAwZGU4Li5hNzc0MTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKQEAgLTIzNywxMiArMjM3LDEyIEBACiAjZGVmaW5lCVNUQVRVU19DT05OX09USEVSCSgxIDw8IDE0KQogI2RlZmluZQlTVEFUVVNfU1VTUEVORF9PVEhFUgkoMSA8PCAxMykKICNkZWZpbmUJU1RBVFVTX01BSUxCT1hfT1RIRVIJKDEgPDwgMTIpCi0jZGVmaW5lCVNUQVRVU19QQUNLRVRTX09USEVSKG4pCSgoKG4pID4+IDgpICYmIDB4MDMpCisjZGVmaW5lCVNUQVRVU19QQUNLRVRTX09USEVSKG4pCSgoKG4pID4+IDgpICYgMHgwMykKIAogI2RlZmluZQlTVEFUVVNfQ09OTl9USElTCSgxIDw8IDYpCiAjZGVmaW5lCVNUQVRVU19TVVNQRU5EX1RISVMJKDEgPDwgNSkKICNkZWZpbmUJU1RBVFVTX01BSUxCT1hfVEhJUwkoMSA8PCA0KQotI2RlZmluZQlTVEFUVVNfUEFDS0VUU19USElTKG4pCSgoKG4pID4+IDApICYmIDB4MDMpCisjZGVmaW5lCVNUQVRVU19QQUNLRVRTX1RISVMobikJKCgobikgPj4gMCkgJiAweDAzKQogCiAjZGVmaW5lCVNUQVRVU19VTlNQRUNfTUFTSwkweDBjOGMKICNkZWZpbmUJU1RBVFVTX05PSVNFX01BU0sgCSgodTE2KX4oMHgwMzAzfFNUQVRVU19VTlNQRUNfTUFTSykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYwppbmRleCAzM2FiYmQyLi42OWViMGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKQEAgLTE2Myw2ICsxNjMsNyBAQAogCiAJLyogdXNpbmcgQVRPTUlDLCB3ZSdkIG5ldmVyIHdha2UgdXAgaWYgd2Ugc2xlcHQgKi8KIAlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKHBlZ2FzdXMtPmN0cmxfdXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJaWYgKHJldCA9PSAtRU5PREVWKQogCQkJbmV0aWZfZGV2aWNlX2RldGFjaChwZWdhc3VzLT5uZXQpOwogCQlpZiAobmV0aWZfbXNnX2RydihwZWdhc3VzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwppbmRleCA3NjBiNTMyLi43NjcyZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCWUgPSBhbHQtPmVuZHBvaW50ICsgZXA7CiAJCQlzd2l0Y2ggKGUtPmRlc2MuYm1BdHRyaWJ1dGVzKSB7CiAJCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKLQkJCQlpZiAoIShlLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkKKwkJCQlpZiAoIXVzYl9lbmRwb2ludF9kaXJfaW4oJmUtPmRlc2MpKQogCQkJCQljb250aW51ZTsKIAkJCQlpbnRyID0gMTsKIAkJCQkvKiBGQUxMVEhST1VHSCAqLwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJCQlkZWZhdWx0OgogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKCZlLT5kZXNjKSkgewogCQkJCWlmICghaW50ciAmJiAhaW4pCiAJCQkJCWluID0gZTsKIAkJCQllbHNlIGlmIChpbnRyICYmICFzdGF0dXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCmluZGV4IDJhOGRkNGMuLjJmNGQzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCkBAIC01NTQsNiArNTU0LDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvbW5pbmV0LgogCitjb25maWcgVVNCX1NFUklBTF9ERUJVRworCXRyaXN0YXRlICJVU0IgRGVidWdnaW5nIERldmljZSIKKwlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgVVNCIGRlYnVnZ2luZyBkZXZpY2UgdXNlZCB0byByZWNpZXZlCisJICBkZWJ1Z2dpbmcgZGF0YSBmcm9tIGFub3RoZXIgbWFjaGluZS4gIFRoZSBtb3N0IGNvbW1vbiBvZiB0aGVzZQorCSAgZGV2aWNlcyBpcyB0aGUgTmV0Q2hpcCBUdXJib0NPTk5FQ1QgZGV2aWNlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2ItZGVidWcuCisKIGNvbmZpZyBVU0JfRVpVU0IKIAlib29sCiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMX0tFWVNQQU5fUERBIHx8IFVTQl9TRVJJQUxfWElSQ09NIHx8IFVTQl9TRVJJQUxfS0VZU1BBTiB8fCBVU0JfU0VSSUFMX1dISVRFSEVBVApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCmluZGV4IGE1MDQ3ZGMuLjYxMTY2YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAKIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0NQMjEwMSkJCQkrPSBjcDIxMDEubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLKQkJKz0gY3liZXJqYWNrLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0NZUFJFU1NfTTgpCQkrPSBjeXByZXNzX204Lm8KK29iai0kKENPTkZJR19VU0JfU0VSSUFMX0RFQlVHKQkJCSs9IHVzYl9kZWJ1Zy5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQpCSs9IGRpZ2lfYWNjZWxlcG9ydC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVCkJCSs9IGlvX2VkZ2Vwb3J0Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJKQkJKz0gaW9fdGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwppbmRleCA4MTIyNzU1Li5iMWI1NzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtMjcwLDggKzI3MCwxMSBAQAogCSAqLwogCXR0eSA9IHBvcnQtPnR0eTsKIAotCWlmICghdHR5KQorCWlmICghdHR5KSB7CiAJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOworCQllcnIoIiVzIC0gTm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiA7CisJfQogCiAJY291bnQgPSBtaW4oNjQsIHNlcmlhbF9idWZfZGF0YV9hdmFpbChwcml2LT5yeF9idWYpKTsKIApAQCAtMzA1LDkgKzMwOCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKLQkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSA9PSAweDAwKSAmJgotCQkJKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMikpIHsKLQkJCS8qIHdlIGZvdW5kIG91ciBidWxrIG91dCBlbmRwb2ludCAqLworCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgewogCQkJZGJnKCJmb3VuZCBidWxrIG91dCBvbiBlbmRwb2ludCAlZCIsIGkpOwogCQkJKytudW1fYnVsa19vdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJwcmltZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKaW5kZXggN2Y1ZDU0Ni4uOTZjNzM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKQEAgLTE5LDYgKzE5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgwYzg4LCAweDE3ZGEpIH0sIC8qIEt5b2NlcmEgV2lyZWxlc3MgS1BDNjUwL1Bhc3Nwb3J0ICovCiAJeyBVU0JfREVWSUNFKDB4MTQxMCwgMHgxMTEwKSB9LCAvKiBOb3ZhdGVsIFdpcmVsZXNzIE1lcmxpbiBDRE1BICovCisJeyBVU0JfREVWSUNFKDB4MTQxMCwgMHgxNDMwKSB9LAkvKiBOb3ZhdGVsIE1lcmxpbiBYVTg3MCBIU0RQQS8zRyAqLwogCXsgVVNCX0RFVklDRSgweDE0MTAsIDB4MTEwMCkgfSwgLyogRXhwcmVzc0NhcmQzNCBRdWFsY29tbSAzRyBDRE1BICovCiAJeyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCmluZGV4IGNhNTJmMTIuLjg2Mzk2NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwpAQCAtODUsMTAgKzg1LDkgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7Ci0JCXByaXYgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGFyazMxMTZfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFyazMxMTZfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXByaXYpCiAJCQlnb3RvIGNsZWFudXA7Ci0JCW1lbXNldChwcml2LCAweDAwLCBzaXplb2YgKHN0cnVjdCBhcmszMTE2X3ByaXZhdGUpKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0sIHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMKaW5kZXggM2E5MDczZC4uNzE2NzcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jCkBAIC0xNjYsMTkgKzE2NiwxNyBAQAogCWlmIChzZXJpYWwtPnR5cGUtPnNldF90ZXJtaW9zKSB7CiAJCS8qIGJ1aWxkIHVwIGEgZmFrZSB0dHkgc3RydWN0dXJlIHNvIHRoYXQgdGhlIG9wZW4gY2FsbCBoYXMgc29tZXRoaW5nCiAJCSAqIHRvIGxvb2sgYXQgdG8gZ2V0IHRoZSBjZmxhZyB2YWx1ZSAqLwotCQl0dHkgPSBrbWFsbG9jIChzaXplb2YgKCp0dHkpLCBHRlBfS0VSTkVMKTsKKwkJdHR5ID0ga3phbGxvYyhzaXplb2YoKnR0eSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXR0eSkgewogCQkJZXJyICgibm8gbW9yZSBtZW1vcnkiKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCXRlcm1pb3MgPSBrbWFsbG9jIChzaXplb2YgKCp0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CisJCXRlcm1pb3MgPSBremFsbG9jKHNpemVvZigqdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRlcm1pb3MpIHsKIAkJCWVyciAoIm5vIG1vcmUgbWVtb3J5Iik7CiAJCQlrZnJlZSAodHR5KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCW1lbXNldCAodHR5LCAweDAwLCBzaXplb2YoKnR0eSkpOwotCQltZW1zZXQgKHRlcm1pb3MsIDB4MDAsIHNpemVvZigqdGVybWlvcykpOwogCQl0ZXJtaW9zLT5jX2NmbGFnID0gY2ZsYWc7CiAJCXR0eS0+dGVybWlvcyA9IHRlcm1pb3M7CiAJCXBvcnQtPnR0eSA9IHR0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCmluZGV4IGYyZTg5YTAuLjA5M2YzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMTY4NCwxNSArMTY4NCwxNCBAQAogCiAJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiAwOwotZmFpbGVkX3VzYl9yZWdpc3RlcjoKLQl1c2JfZGVyZWdpc3RlcigmY3lwcmVzc19kcml2ZXIpOwotZmFpbGVkX2NhNDJ2Ml9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmN5cHJlc3NfY2E0MnYyX2RldmljZSk7Ci1mYWlsZWRfaGlkY29tX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmY3lwcmVzc19oaWRjb21fZGV2aWNlKTsKLWZhaWxlZF9lbV9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmN5cHJlc3NfZWFydGhtYXRlX2RldmljZSk7CiAKK2ZhaWxlZF91c2JfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZjeXByZXNzX2NhNDJ2Ml9kZXZpY2UpOworZmFpbGVkX2NhNDJ2Ml9yZWdpc3RlcjoKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmN5cHJlc3NfaGlkY29tX2RldmljZSk7CitmYWlsZWRfaGlkY29tX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmY3lwcmVzc19lYXJ0aG1hdGVfZGV2aWNlKTsKK2ZhaWxlZF9lbV9yZWdpc3RlcjoKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKaW5kZXggYmRiNTgxMC4uNWUzYWMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAqICAgICAgIHRvIFRBU0tfUlVOTklORyB3aWxsIGJlIGxvc3QgYW5kIHdyaXRlX2NoYW4ncyBzdWJzZXF1ZW50IGNhbGwgdG8KICogICAgICAgc2NoZWR1bGUoKSB3aWxsIG5ldmVyIHJldHVybiAodW5sZXNzIGl0IGNhdGNoZXMgYSBzaWduYWwpLgogKiAgICAgICBUaGlzIHJhY2UgY29uZGl0aW9uIG9jY3VycyBiZWNhdXNlIHdyaXRlX2J1bGtfY2FsbGJhY2soKSAoYW5kIHRodXMKLSogICAgICAgdGhlIHdha2V1cCkgYXJlIGNhbGxlZCBhc3luY2hvbm91c2x5IGZyb20gYW4gaW50ZXJydXB0LCByYXRoZXIgdGhhbgorKiAgICAgICB0aGUgd2FrZXVwKSBhcmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IGZyb20gYW4gaW50ZXJydXB0LCByYXRoZXIgdGhhbgogKiAgICAgICBmcm9tIHRoZSBzY2hlZHVsZXIuICBXZSBjYW4gYXZvaWQgdGhlIHJhY2UgYnkgY2FsbGluZyB0aGUgd2FrZXVwCiAqICAgICAgIGZyb20gdGhlIHNjaGVkdWxlciBxdWV1ZSBhbmQgdGhhdCdzIG91ciBmaXg6ICBOb3csIGF0IHRoZSBlbmQgb2YKICogICAgICAgd3JpdGVfYnVsa19jYWxsYmFjaygpIHdlIHF1ZXVlIHVwIGEgd2FrZXVwIGNhbGwgb24gdGhlIHNjaGVkdWxlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2V6dXNiLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZXp1c2IuYwppbmRleCA1MTY5YzJkLi45N2VlNzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZXp1c2IuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZXp1c2IuYwpAQCAtMzEsMTIgKzMxLDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXRyYW5zZmVyX2J1ZmZlciA9ICBrbWFsbG9jIChsZW5ndGgsIEdGUF9LRVJORUwpOworCXRyYW5zZmVyX2J1ZmZlciA9IGttZW1kdXAoZGF0YSwgbGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zZmVyX2J1ZmZlcikgewogCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1jcHkgKHRyYW5zZmVyX2J1ZmZlciwgZGF0YSwgbGVuZ3RoKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLCBiUmVxdWVzdCwgMHg0MCwgYWRkcmVzcywgMCwgdHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgsIDMwMDApOwogCWtmcmVlICh0cmFuc2Zlcl9idWZmZXIpOwogCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGMxODZiNGUuLjg5Y2UyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC0xMzg4LDggKzEzODgsNyBAQAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKIAkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkICovCi0JaWYgKHBvcnQtPnJlYWRfdXJiKQotCQl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOworCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiB9IC8qIGZ0ZGlfY2xvc2UgKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwppbmRleCA0NTQzMTUyLi42NTMwZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKQEAgLTE1MjMsMTIgKzE1MjMsMTEgQEAKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCi0JZ2FybWluX2RhdGFfcCA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgZ2FybWluX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlnYXJtaW5fZGF0YV9wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdhcm1pbl9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGdhcm1pbl9kYXRhX3AgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQgKGdhcm1pbl9kYXRhX3AsIDAsIHNpemVvZihzdHJ1Y3QgZ2FybWluX2RhdGEpKTsKIAlpbml0X3RpbWVyKCZnYXJtaW5fZGF0YV9wLT50aW1lcik7CiAJc3Bpbl9sb2NrX2luaXQoJmdhcm1pbl9kYXRhX3AtPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZnYXJtaW5fZGF0YV9wLT5wa3RsaXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKaW5kZXggOTFiZDMwMS4uZDA2NTQ3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTEwMzgsOSArMTAzOCw3IEBACiAJZWRnZV9wb3J0LT5vcGVuID0gRkFMU0U7CiAJZWRnZV9wb3J0LT5vcGVuUGVuZGluZyA9IEZBTFNFOwogCi0JaWYgKGVkZ2VfcG9ydC0+d3JpdGVfdXJiKSB7Ci0JCXVzYl9raWxsX3VyYihlZGdlX3BvcnQtPndyaXRlX3VyYik7Ci0JfQorCXVzYl9raWxsX3VyYihlZGdlX3BvcnQtPndyaXRlX3VyYik7CiAKIAlpZiAoZWRnZV9wb3J0LT53cml0ZV91cmIpIHsKIAkJLyogaWYgdGhpcyB1cmIgaGFkIGEgdHJhbnNmZXIgYnVmZmVyIGFscmVhZHkgKG9sZCB0cmFuc2ZlcikgZnJlZSBpdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCmluZGV4IDJhNGJiNjYuLmQzYjlhMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKQEAgLTIwNiwxMCArMjA2LDkgQEAKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCi0JYnVmX2Zsb3dfaW5pdCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOworCWJ1Zl9mbG93X2luaXQgPSBrbWVtZHVwKGJ1Zl9mbG93X3N0YXRpYywgMTYsIEdGUF9LRVJORUwpOwogCWlmICghYnVmX2Zsb3dfaW5pdCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGJ1Zl9mbG93X2luaXQsIGJ1Zl9mbG93X3N0YXRpYywgMTYpOwogCiAJaWYgKHBvcnQtPnR0eSkKIAkJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwppbmRleCA1M2JlODI0Li43NjM5NjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKQEAgLTIzMDYsMjIgKzIzMDYsMTYgQEAKIAl9CiAKIAkvKiBOb3cgZnJlZSB0aGVtICovCi0JaWYgKHNfcHJpdi0+aW5zdGF0X3VyYikKLQkJdXNiX2ZyZWVfdXJiKHNfcHJpdi0+aW5zdGF0X3VyYik7Ci0JaWYgKHNfcHJpdi0+Z2xvY29udF91cmIpCi0JCXVzYl9mcmVlX3VyYihzX3ByaXYtPmdsb2NvbnRfdXJiKTsKKwl1c2JfZnJlZV91cmIoc19wcml2LT5pbnN0YXRfdXJiKTsKKwl1c2JfZnJlZV91cmIoc19wcml2LT5nbG9jb250X3VyYik7CiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCQlpZiAocF9wcml2LT5pbmFja191cmIpCi0JCQl1c2JfZnJlZV91cmIocF9wcml2LT5pbmFja191cmIpOwotCQlpZiAocF9wcml2LT5vdXRjb250X3VyYikKLQkJCXVzYl9mcmVlX3VyYihwX3ByaXYtPm91dGNvbnRfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHBfcHJpdi0+aW5hY2tfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHBfcHJpdi0+b3V0Y29udF91cmIpOwogCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlpZiAocF9wcml2LT5pbl91cmJzW2pdKQotCQkJCXVzYl9mcmVlX3VyYihwX3ByaXYtPmluX3VyYnNbal0pOwotCQkJaWYgKHBfcHJpdi0+b3V0X3VyYnNbal0pCi0JCQkJdXNiX2ZyZWVfdXJiKHBfcHJpdi0+b3V0X3VyYnNbal0pOworCQkJdXNiX2ZyZWVfdXJiKHBfcHJpdi0+aW5fdXJic1tqXSk7CisJCQl1c2JfZnJlZV91cmIocF9wcml2LT5vdXRfdXJic1tqXSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwppbmRleCBmZjAzMzMxLi4yMzcyODk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC0xODUsMTMgKzE4NSwxMSBAQAogICAKICAJZm9yIChpID0gMDsgaSA8IGFsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CiAJCWVuZHBvaW50ID0gJmFsdHNldHRpbmctPmVuZHBvaW50W2ldOwotCQlpZiAoKChlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkgJiYgCi0gCQkgICAgKChlbmRwb2ludC0+ZGVzYy5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgeworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9vdXQoJmVuZHBvaW50LT5kZXNjKSkgewogCQkgCWRiZygiJXMgRm91bmQgaW50ZXJydXB0IG91dCBlbmRwb2ludC4gQWRkcmVzczogJWQiLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwogCQkgCXByaXYtPndyaXRlX2ludF9lbmRwb2ludF9hZGRyZXNzID0gZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKICAJCX0KLSAJCWlmICgoKGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pICYmIAotIAkJICAgICgoZW5kcG9pbnQtPmRlc2MuYm1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oJmVuZHBvaW50LT5kZXNjKSkgewogCQkgCWRiZygiJXMgRm91bmQgaW50ZXJydXB0IGluICBlbmRwb2ludC4gQWRkcmVzczogJWQiLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwogCQkgCXByaXYtPnJlYWRfaW50X2VuZHBvaW50X2FkZHJlc3MgPSBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCSAJfQpAQCAtMzU1LDggKzM1Myw3IEBACiAJCXVzYl9mcmVlX3VyYiggcG9ydC0+d3JpdGVfdXJiICk7CiAJCXBvcnQtPndyaXRlX3VyYiA9IE5VTEw7CiAJfQotCWlmIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKQotCQl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKaW5kZXggYjc1ODJjYy4uYTkwNmU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKQEAgLTM1OCwxMCArMzU4LDggQEAKIAkvKiBQdWgsIHRoYXQncyBkaXJ0eSAqLwogCXBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAJcnBvcnQgPSBzZXJpYWwtPnBvcnRbMV07Ci0JaWYgKHBvcnQtPnJlYWRfdXJiKSB7Ci0JCS8qIE5vIHVubGlua2luZywgaXQgd2Fzbid0IHN1Ym1pdHRlZCB5ZXQuICovCi0JCXVzYl9mcmVlX3VyYihwb3J0LT5yZWFkX3VyYik7Ci0JfQorCS8qIE5vIHVubGlua2luZywgaXQgd2Fzbid0IHN1Ym1pdHRlZCB5ZXQuICovCisJdXNiX2ZyZWVfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAlwb3J0LT5yZWFkX3VyYiA9IHJwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiOwogCXJwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiID0gTlVMTDsKIAlwb3J0LT5yZWFkX3VyYi0+Y29udGV4dCA9IHBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCA1YjcxOTYyLi4wMmM4OWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTI1OTYsMTIgKzI1OTYsMTEgQEAKIAogCS8qIHNldCB1cCBwb3J0IHByaXZhdGUgc3RydWN0dXJlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7Ci0JCW1vczc4NDBfcG9ydCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwkJbW9zNzg0MF9wb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vc2NoaXBfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpIHsKIAkJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCW1lbXNldChtb3M3ODQwX3BvcnQsIDAsIHNpemVvZihzdHJ1Y3QgbW9zY2hpcF9wb3J0KSk7CiAKIAkJLyogSW5pdGlhbGl6ZSBhbGwgcG9ydCBpbnRlcnJ1cHQgZW5kIHBvaW50IHRvIHBvcnQgMCBpbnQgZW5kcG9pbnQgKgogCQkgKiBPdXIgZGV2aWNlIGhhcyBvbmx5IG9uZSBpbnRlcnJ1cHQgZW5kIHBvaW50IGNvbW1hbiB0byBhbGwgcG9ydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCmluZGV4IDA2MTA0MDkuLjA1NGFiZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbmF2bWFuLmMKQEAgLTk1LDggKzk1LDcgQEAKIHsKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAotCWlmIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKQotCQl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogfQogCiBzdGF0aWMgaW50IG5hdm1hbl93cml0ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKaW5kZXggMDc0MDBjMC4uYWU5OGQ4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCkBAIC0yMjgsNiArMjI4LDcgQEAKIC8qIG51bGwgZW50cnkgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0aV9pZF90YWJsZV8zNDEwWzErVElfRVhUUkFfVklEX1BJRF9DT1VOVCsxXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV8zNDEwX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfMzQxMF9FWjQzMF9JRCkgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0aV9pZF90YWJsZV81MDUyWzQrVElfRVhUUkFfVklEX1BJRF9DT1VOVCsxXSA9IHsKQEAgLTIzOSw2ICsyNDAsNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdGlfaWRfdGFibGVfY29tYmluZWRbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV8zNDEwX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfMzQxMF9FWjQzMF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MDUyX0JPT1RfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MTUyX0JPT1RfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MDUyX0VFUFJPTV9QUk9EVUNUX0lEKSB9LApAQCAtNDU5LDEzICs0NjEsMTIgQEAKIAogCS8qIHNldCB1cCBwb3J0IHN0cnVjdHVyZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewotCQl0cG9ydCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aV9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJCXRwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHRwb3J0ID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV90cG9ydHM7CiAJCX0KLQkJbWVtc2V0KHRwb3J0LCAwLCBzaXplb2Yoc3RydWN0IHRpX3BvcnQpKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnRwb3J0LT50cF9sb2NrKTsKIAkJdHBvcnQtPnRwX3VhcnRfYmFzZV9hZGRyID0gKGkgPT0gMCA/IFRJX1VBUlQxX0JBU0VfQUREUiA6IFRJX1VBUlQyX0JBU0VfQUREUik7CiAJCXRwb3J0LT50cF9mbGFncyA9IGxvd19sYXRlbmN5ID8gQVNZTkNfTE9XX0xBVEVOQ1kgOiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmgKaW5kZXggMDJjMWFlYi4uYjU1NDFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5oCkBAIC0yOCw2ICsyOCw3IEBACiAvKiBWZW5kb3IgYW5kIHByb2R1Y3QgaWRzICovCiAjZGVmaW5lIFRJX1ZFTkRPUl9JRAkJCTB4MDQ1MQogI2RlZmluZSBUSV8zNDEwX1BST0RVQ1RfSUQJCTB4MzQxMAorI2RlZmluZSBUSV8zNDEwX0VaNDMwX0lECQkweEY0MzAgIC8qIFRJIGV6NDMwIGRldmVsb3BtZW50IHRvb2wgKi8KICNkZWZpbmUgVElfNTA1Ml9CT09UX1BST0RVQ1RfSUQJCTB4NTA1MgkvKiBubyBFRVBST00sIG5vIGZpcm13YXJlICovCiAjZGVmaW5lIFRJXzUxNTJfQk9PVF9QUk9EVUNUX0lECQkweDUxNTIJLyogbm8gRUVQUk9NLCBubyBmaXJtd2FyZSAqLwogI2RlZmluZSBUSV81MDUyX0VFUFJPTV9QUk9EVUNUX0lECTB4NTA1QQkvKiBFRVBST00sIG5vIGZpcm13YXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCA4MDA2ZTUxLi5jMTI1N2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTk1MiwzMiArOTUyLDI4IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmICghcG9ydCkKIAkJCWNvbnRpbnVlOwotCQlpZiAocG9ydC0+cmVhZF91cmIpCi0JCQl1c2JfZnJlZV91cmIgKHBvcnQtPnJlYWRfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAkJa2ZyZWUocG9ydC0+YnVsa19pbl9idWZmZXIpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1bGtfb3V0OyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJaWYgKCFwb3J0KQogCQkJY29udGludWU7Ci0JCWlmIChwb3J0LT53cml0ZV91cmIpCi0JCQl1c2JfZnJlZV91cmIgKHBvcnQtPndyaXRlX3VyYik7CisJCXVzYl9mcmVlX3VyYihwb3J0LT53cml0ZV91cmIpOwogCQlrZnJlZShwb3J0LT5idWxrX291dF9idWZmZXIpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2ludGVycnVwdF9pbjsgKytpKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmICghcG9ydCkKIAkJCWNvbnRpbnVlOwotCQlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikKLQkJCXVzYl9mcmVlX3VyYiAocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CisJCXVzYl9mcmVlX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKIAkJa2ZyZWUocG9ydC0+aW50ZXJydXB0X2luX2J1ZmZlcik7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBudW1faW50ZXJydXB0X291dDsgKytpKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmICghcG9ydCkKIAkJCWNvbnRpbnVlOwotCQlpZiAocG9ydC0+aW50ZXJydXB0X291dF91cmIpCi0JCQl1c2JfZnJlZV91cmIgKHBvcnQtPmludGVycnVwdF9vdXRfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHBvcnQtPmludGVycnVwdF9vdXRfdXJiKTsKIAkJa2ZyZWUocG9ydC0+aW50ZXJydXB0X291dF9idWZmZXIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1N2E1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIFVTQiBEZWJ1ZyBjYWJsZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDUyNSwgMHgxMjdhKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZGVidWdfZHJpdmVyID0geworCS5uYW1lID0JCSJkZWJ1ZyIsCisJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQlpZF90YWJsZSwKKwkubm9fZHluYW1pY19pZCA9IAkxLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBkZWJ1Z19kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5uYW1lID0JCSJkZWJ1ZyIsCisJfSwKKwkuaWRfdGFibGUgPQkJaWRfdGFibGUsCisJLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAorCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAorCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKKwkubnVtX3BvcnRzID0JCTEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmRlYnVnX2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJmRlYnVnX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZkZWJ1Z19kZXZpY2UpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZWJ1Z19leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJmRlYnVnX2RyaXZlcik7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZkZWJ1Z19kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChkZWJ1Z19pbml0KTsKK21vZHVsZV9leGl0KGRlYnVnX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwppbmRleCBiZWZlMmUxLi5lZWY1ZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwpAQCAtMzQ4LDggKzM0OCw3IEBACiAJCQkgCiAJLyogc2h1dGRvd24gb3VyIHVyYnMgKi8KIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwotCWlmIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKQotCQl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogCiAJLyogVHJ5IHRvIHNlbmQgc2h1dGRvd24gbWVzc2FnZSwgaWYgdGhlIGRldmljZSBpcyBnb25lLCB0aGlzIHdpbGwganVzdCBmYWlsLiAqLwogCXRyYW5zZmVyX2J1ZmZlciA9ICBrbWFsbG9jICgweDEyLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYwppbmRleCAzYmFmNDQ4Li4zYTE1OGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL29uZXRvdWNoLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5jCkBAIC0xNDIsMTAgKzE0Miw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFsyXS5kZXNjOwotCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQotCQkJIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IGVmYjA0N2YuLmRiOGIyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMTMxOCw2ICsxMzE4LDE2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCB1c2Jfc3Rvcl91Y3I2MXMyYl9pbml0LAogCQkwICksCiAKKy8qIFJlcG9ydGVkIGJ5IEphY28gS3Jvb24gPGphY29Aa3Jvb24uY28uemE+CisgKiBUaGUgdXNiLXN0b3JhZ2UgbW9kdWxlIGZvdW5kIG9uIHRoZSBEaWdpdGVjaCBHTlg0IChhbmQgc3VwcG9zZWRseSBvdGhlcgorICogZGV2aWNlcykgbWlzYmVoYXZlcyBhbmQgY2F1c2VzIGEgYnVuY2ggb2YgaW52YWxpZCBJL08gZXJyb3JzLgorICovCitVTlVTVUFMX0RFViggIDB4MTIxMCwgMHgwMDAzLCAweDAxMDAsIDB4MDEwMCwKKwkJIkRpZ2l0ZWNoIEhNRyIsCisJCSJEaWdpVGVjaCBNYXNzIFN0b3JhZ2UiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKKwogLyogUmVwb3J0ZWQgYnkgVmlsaXVzIEJpbGlua2V2aWNpdXMgPHZpbGlzYXMgQVQgeHh4IERPVCBsdCkgKi8KIFVOVVNVQUxfREVWKCAgMHgxMzJiLCAweDAwMGIsIDB4MDAwMSwgMHgwMDAxLAogCQkiTWlub2x0YSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCBiOGQ2MDMxLi5iNDAxMDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTc0MCwxOCArNzQwLDE2IEBACiAJCWVwID0gJmFsdHNldHRpbmctPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJLyogSXMgaXQgYSBCVUxLIGVuZHBvaW50PyAqLwotCQlpZiAoKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKLQkJCQk9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwKSkgewogCQkJLyogQlVMSyBpbiBvciBvdXQ/ICovCi0JCQlpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZXApKQogCQkJCWVwX2luID0gZXA7CiAJCQllbHNlCiAJCQkJZXBfb3V0ID0gZXA7CiAJCX0KIAogCQkvKiBJcyBpdCBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQ/ICovCi0JCWVsc2UgaWYgKChlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCQkJPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisJCWVsc2UgaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcCkpIHsKIAkJCWVwX2ludCA9IGVwOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IDkzZmZjZGQuLmU5NzNhODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTEyOTYsMTQgKzEyOTYsMTQgQEAKIAkJCWJyZWFrOwogCWZiX2luZm8tPm5vZGUgPSBpOwogCi0JZmJfaW5mby0+Y2xhc3NfZGV2aWNlID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgTlVMTCwgTUtERVYoRkJfTUFKT1IsIGkpLAotCQkJCSAgICBmYl9pbmZvLT5kZXZpY2UsICJmYiVkIiwgaSk7Ci0JaWYgKElTX0VSUihmYl9pbmZvLT5jbGFzc19kZXZpY2UpKSB7CisJZmJfaW5mby0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgZmJfaW5mby0+ZGV2aWNlLAorCQkJCSAgICAgTUtERVYoRkJfTUFKT1IsIGkpLCAiZmIlZCIsIGkpOworCWlmIChJU19FUlIoZmJfaW5mby0+ZGV2KSkgewogCQkvKiBOb3QgZmF0YWwgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBjbGFzc19kZXZpY2UgZm9yIGZyYW1lYnVmZmVyICVkOyBlcnJubyA9ICVsZFxuIiwgaSwgUFRSX0VSUihmYl9pbmZvLT5jbGFzc19kZXZpY2UpKTsKLQkJZmJfaW5mby0+Y2xhc3NfZGV2aWNlID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBkZXZpY2UgZm9yIGZyYW1lYnVmZmVyICVkOyBlcnJubyA9ICVsZFxuIiwgaSwgUFRSX0VSUihmYl9pbmZvLT5kZXYpKTsKKwkJZmJfaW5mby0+ZGV2ID0gTlVMTDsKIAl9IGVsc2UKLQkJZmJfaW5pdF9jbGFzc19kZXZpY2UoZmJfaW5mbyk7CisJCWZiX2luaXRfZGV2aWNlKGZiX2luZm8pOwogCiAJaWYgKGZiX2luZm8tPnBpeG1hcC5hZGRyID09IE5VTEwpIHsKIAkJZmJfaW5mby0+cGl4bWFwLmFkZHIgPSBrbWFsbG9jKEZCUElYTUFQU0laRSwgR0ZQX0tFUk5FTCk7CkBAIC0xMzU2LDggKzEzNTYsOCBAQAogCWZiX2Rlc3Ryb3lfbW9kZWxpc3QoJmZiX2luZm8tPm1vZGVsaXN0KTsKIAlyZWdpc3RlcmVkX2ZiW2ldPU5VTEw7CiAJbnVtX3JlZ2lzdGVyZWRfZmItLTsKLQlmYl9jbGVhbnVwX2NsYXNzX2RldmljZShmYl9pbmZvKTsKLQljbGFzc19kZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKKwlmYl9jbGVhbnVwX2RldmljZShmYl9pbmZvKTsKKwlkZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKIAlldmVudC5pbmZvID0gZmJfaW5mbzsKIAlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX0ZCX1VOUkVHSVNURVJFRCwgJmV2ZW50KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggZDNhNTA0MS4uMzIzYmRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTczLDcgKzczLDcgQEAKICAqCiAgKiBAaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCiAgKgotICogRHJvcCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBjbGFzc19kZXZpY2UgZW1iZWRkZWQgaW4gdGhlCisgKiBEcm9wIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRldmljZSBlbWJlZGRlZCBpbiB0aGUKICAqIGZyYW1lYnVmZmVyIGluZm8gc3RydWN0dXJlLgogICoKICAqLwpAQCAtMTIwLDEwICsxMjAsMTAgQEAKIAkgICAgICAgICAgICAgICAgbSwgbW9kZS0+eHJlcywgbW9kZS0+eXJlcywgdiwgbW9kZS0+cmVmcmVzaCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjb25zdCBjaGFyICogYnVmLAotCQkJICBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCWNoYXIgbXN0clsxMDBdOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJc3RydWN0IGZiX21vZGVsaXN0ICptb2RlbGlzdDsKQEAgLTE1MSw5ICsxNTEsMTAgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCiAJaWYgKCFmYl9pbmZvLT5tb2RlKQogCQlyZXR1cm4gMDsKQEAgLTE2MSwxMCArMTYyLDExIEBACiAJcmV0dXJuIG1vZGVfc3RyaW5nKGJ1ZiwgMCwgZmJfaW5mby0+bW9kZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY29uc3QgY2hhciAqIGJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJTElTVF9IRUFEKG9sZF9saXN0KTsKIAlpbnQgaSA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBmYl92aWRlb21vZGUpOwogCkBAIC0xODYsOSArMTg4LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbW9kZXMoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IGZiX21vZGVsaXN0ICptb2RlbGlzdDsKQEAgLTIwMywxMCArMjA2LDEwIEBACiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2JwcChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKiBidWYsCi0JCQkgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfYnBwKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAljaGFyICoqIGxhc3QgPSBOVUxMOwogCWludCBlcnI7CkBAIC0yMTgsMTYgKzIyMSwxOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19icHAoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2JwcChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwogCWNoYXIgKipsYXN0ID0gTlVMTDsKIAlpbnQgZXJyOwpAQCAtMjQyLDE3ICsyNDcsMTkgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBzaG93X3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcm90YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZmJfaW5mby0+dmFyLnJvdGF0ZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3ZpcnR1YWwoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV92aXJ0dWFsKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJY2hhciAqbGFzdCA9IE5VTEw7CiAJaW50IGVycjsKQEAgLTI2OSwyMyArMjc2LDI2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3ZpcnR1YWwoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3ZpcnR1YWwoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQsJWRcbiIsIGZiX2luZm8tPnZhci54cmVzX3ZpcnR1YWwsCiAJCQlmYl9pbmZvLT52YXIueXJlc192aXJ0dWFsKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19zdHJpZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3N0cmlkZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBmYl9pbmZvLT5maXgubGluZV9sZW5ndGgpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9ibGFuayhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKiBidWYsCi0JCQkgICBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9ibGFuayhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCWNoYXIgKmxhc3QgPSBOVUxMOwogCWludCBlcnI7CiAKQEAgLTI5OSw0MiArMzA5LDQ4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2JsYW5rKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19ibGFuayhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0vLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisvLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9jb25zb2xlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKLQkJCSAgICAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfY29uc29sZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLS8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKy8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfY29uc29sZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfY29uc29sZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLS8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKy8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2N1cnNvcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQkgICAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfY3Vyc29yKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLS8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKy8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfY3Vyc29yKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19jdXJzb3Ioc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLS8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKy8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3BhbihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKiBidWYsCi0JCQkgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcGFuKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwogCWNoYXIgKmxhc3QgPSBOVUxMOwogCWludCBlcnI7CkBAIC0zNTUsMjQgKzM3MSwyNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19wYW4oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3BhbihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkLCVkXG4iLCBmYl9pbmZvLT52YXIueG9mZnNldCwKIAkJCWZiX2luZm8tPnZhci54b2Zmc2V0KTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiX2luZm8tPmZpeC5pZCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2Zic3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYnN0YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXUzMiBzdGF0ZTsKIAljaGFyICpsYXN0ID0gTlVMTDsKIApAQCAtMzg1LDE3ICs0MDQsMTkgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmJzdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmJzdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZmJfaW5mby0+c3RhdGUpOwogfQogCiAjaWZkZWYgQ09ORklHX0ZCX0JBQ0tMSUdIVAotc3RhdGljIHNzaXplX3Qgc3RvcmVfYmxfY3VydmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2JsX2N1cnZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJdTggdG1wX2N1cnZlW0ZCX0JBQ0tMSUdIVF9MRVZFTFNdOwogCXVuc2lnbmVkIGludCBpOwogCkBAIC00MzIsOSArNDUzLDEwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2JsX2N1cnZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19ibF9jdXJ2ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3NpemVfdCBsZW4gPSAwOwogCXVuc2lnbmVkIGludCBpOwogCkBAIC00NjUsNyArNDg3LDcgQEAKIC8qIFdoZW4gY21hcCBpcyBhZGRlZCBiYWNrIGluIGl0IHNob3VsZCBiZSBhIGJpbmFyeSBhdHRyaWJ1dGUKICAqIG5vdCBhIHRleHQgb25lLiBDb25zaWRlcmF0aW9uIHNob3VsZCBhbHNvIGJlIGdpdmVuIHRvIGNvbnZlcnRpbmcKICAqIGZiZGV2IHRvIHVzZSBjb25maWdmcyBpbnN0ZWFkIG9mIHN5c2ZzICovCi1zdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2aWNlX2F0dHJzW10gPSB7CiAJX19BVFRSKGJpdHNfcGVyX3BpeGVsLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYnBwLCBzdG9yZV9icHApLAogCV9fQVRUUihibGFuaywgU19JUlVHT3xTX0lXVVNSLCBzaG93X2JsYW5rLCBzdG9yZV9ibGFuayksCiAJX19BVFRSKGNvbnNvbGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19jb25zb2xlLCBzdG9yZV9jb25zb2xlKSwKQEAgLTQ4MywxNyArNTA1LDE2IEBACiAjZW5kaWYKIH07CiAKLWludCBmYl9pbml0X2NsYXNzX2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKK2ludCBmYl9pbml0X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKIHsKIAlpbnQgaSwgZXJyb3IgPSAwOwogCi0JY2xhc3Nfc2V0X2RldmRhdGEoZmJfaW5mby0+Y2xhc3NfZGV2aWNlLCBmYl9pbmZvKTsKKwlkZXZfc2V0X2RydmRhdGEoZmJfaW5mby0+ZGV2LCBmYl9pbmZvKTsKIAogCWZiX2luZm8tPmNsYXNzX2ZsYWcgfD0gRkJfU1lTRlNfRkxBR19BVFRSOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKSB7Ci0JCWVycm9yID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGZiX2luZm8tPmNsYXNzX2RldmljZSwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspIHsKKwkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZmJfaW5mby0+ZGV2LCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKQEAgLTUwMSwyMiArNTIyLDIwIEBACiAKIAlpZiAoZXJyb3IpIHsKIAkJd2hpbGUgKC0taSA+PSAwKQotCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGZiX2luZm8tPmNsYXNzX2RldmljZSwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShmYl9pbmZvLT5kZXYsICZkZXZpY2VfYXR0cnNbaV0pOwogCQlmYl9pbmZvLT5jbGFzc19mbGFnICY9IH5GQl9TWVNGU19GTEFHX0FUVFI7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZmJfY2xlYW51cF9jbGFzc19kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pCit2b2lkIGZiX2NsZWFudXBfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQogewogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKGZiX2luZm8tPmNsYXNzX2ZsYWcgJiBGQl9TWVNGU19GTEFHX0FUVFIpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKQotCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGZiX2luZm8tPmNsYXNzX2RldmljZSwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlX2F0dHJzKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKGZiX2luZm8tPmRldiwgJmRldmljZV9hdHRyc1tpXSk7CiAKIAkJZmJfaW5mby0+Y2xhc3NfZmxhZyAmPSB+RkJfU1lTRlNfRkxBR19BVFRSOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKaW5kZXggZmRiMzNjZC4uY2IyNmM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSAibWFjbW9kZXMuaCIKICNpbmNsdWRlICJwbGF0aW51bWZiLmgiCkBAIC02ODIsMTQgKzY4MywxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlwbGF0aW51bWZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKLQlvZl9yZWdpc3Rlcl9kcml2ZXIoJnBsYXRpbnVtX2RyaXZlcik7CisJb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZwbGF0aW51bV9kcml2ZXIpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwbGF0aW51bWZiX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmcGxhdGludW1fZHJpdmVyKTsJCisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnBsYXRpbnVtX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCmluZGV4IDUzNzJjZmMuLmIwMjJmZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9mcy85cC9jb252LmMgYi9mcy85cC9jb252LmMKaW5kZXggNTZkODhjMS4uYTNlZDU3MSAxMDA2NDQKLS0tIGEvZnMvOXAvY29udi5jCisrKyBiL2ZzLzlwL2NvbnYuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL2ZzLzlwL2ZjYWxsLmMgYi9mcy85cC9mY2FsbC5jCmluZGV4IDg1NTYwOTcuLmRjMzM2YTYgMTAwNjQ0Ci0tLSBhL2ZzLzlwL2ZjYWxsLmMKKysrIGIvZnMvOXAvZmNhbGwuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL2ZzLzlwL2ZpZC5jIGIvZnMvOXAvZmlkLmMKaW5kZXggNzA0OTJjYy4uMjc1MDcyMCAxMDA2NDQKLS0tIGEvZnMvOXAvZmlkLmMKKysrIGIvZnMvOXAvZmlkLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KIAogI2luY2x1ZGUgImRlYnVnLmgiCmRpZmYgLS1naXQgYS9mcy85cC92OWZzLmMgYi9mcy85cC92OWZzLmMKaW5kZXggMGY2MjgwNC4uMGI5NmZhZSAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmcy5jCisrKyBiL2ZzLzlwL3Y5ZnMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZGlyLmMgYi9mcy85cC92ZnNfZGlyLmMKaW5kZXggZTMyZDU5Ny4uOTA1Yzg4MiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2Rpci5jCisrKyBiL2ZzLzlwL3Zmc19kaXIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZmlsZS5jIGIvZnMvOXAvdmZzX2ZpbGUuYwppbmRleCBjM2M0N2VkLi43OWU2ZjljIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfZmlsZS5jCisrKyBiL2ZzLzlwL3Zmc19maWxlLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggN2IxNTExZC4uYjNiNWFhMCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC05NzIsNyArOTcyLDcgQEAKIAogCVNvbWUgc3lzdGVtIGFnZW50cyByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBzeXNmcyB0byBvcGVyYXRlLgogCS9zYmluL2hvdHBsdWcgdXNlcyBkZXZpY2UgYW5kIG9iamVjdCBhdHRyaWJ1dGVzIGluIHN5c2ZzIHRvIGFzc2lzdCBpbgotCWRlbGVnYXRpbmcgcG9saWN5IGRlY2lzaW9ucywgbGlrZSBwZXJzaXN0YW50bHkgbmFtaW5nIGRldmljZXMuCisJZGVsZWdhdGluZyBwb2xpY3kgZGVjaXNpb25zLCBsaWtlIHBlcnNpc3RlbnRseSBuYW1pbmcgZGV2aWNlcy4KIAogCXN5c2ZzIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBibG9jayBzdWJzeXN0ZW0gdG8gbW91bnQgdGhlIHJvb3QKIAlwYXJ0aXRpb24uICBJZiBzeXNmcyBpcyBkaXNhYmxlZCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBib290IGRldmljZSBvbgpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIAloZWxwCiAJICBUaGUgQmVPUyBGaWxlIFN5c3RlbSAoQmVGUykgaXMgdGhlIG5hdGl2ZSBmaWxlIHN5c3RlbSBvZiBCZSwgSW5jJ3MKIAkgIEJlT1MuIE5vdGFibGUgZmVhdHVyZXMgaW5jbHVkZSBzdXBwb3J0IGZvciBhcmJpdHJhcnkgYXR0cmlidXRlcwotCSAgb24gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCBhbmQgZGF0YWJhc2UtbGlrZSBpbmRlY2VzIG9uIHNlbGVjdGVkCisJICBvbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIGFuZCBkYXRhYmFzZS1saWtlIGluZGljZXMgb24gc2VsZWN0ZWQKIAkgIGF0dHJpYnV0ZXMuIChBbHNvIG5vdGUgdGhhdCB0aGlzIGRyaXZlciBkb2Vzbid0IG1ha2UgdGhvc2UgZmVhdHVyZXMKIAkgIGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUpLiBJdCBpcyBhIDY0IGJpdCBmaWxlc3lzdGVtLCBzbyBpdCBzdXBwb3J0cwogCSAgZXh0cmVtZWx5IGxhcmdlIHZvbHVtZXMgYW5kIGZpbGVzLgpkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCA5NDc2NjU5Li4yNzdhNWYyIDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtMzY3LDggKzM2Nyw3IEBACiB7CiAJdW5zaWduZWQgbnJfZXZlbnRzID0gY3R4LT5tYXhfcmVxczsKIAotCWlmICh1bmxpa2VseShjdHgtPnJlcXNfYWN0aXZlKSkKLQkJQlVHKCk7CisJQlVHX09OKGN0eC0+cmVxc19hY3RpdmUpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmY3R4LT53cSk7CiAJZmx1c2hfd29ya3F1ZXVlKGFpb193cSk7CkBAIC01MDUsOCArNTA0LDcgQEAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmN0eC0+Y3R4X2xvY2spOwogCiAJcmVxLT5raV91c2VycyAtLTsKLQlpZiAodW5saWtlbHkocmVxLT5raV91c2VycyA8IDApKQotCQlCVUcoKTsKKwlCVUdfT04ocmVxLT5raV91c2VycyA8IDApOwogCWlmIChsaWtlbHkocmVxLT5raV91c2VycykpCiAJCXJldHVybiAwOwogCWxpc3RfZGVsKCZyZXEtPmtpX2xpc3QpOwkJLyogcmVtb3ZlIGZyb20gYWN0aXZlX3JlcXMgKi8KZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCA3OWIwNWExLi5jYzcyYmI0IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC0xNTgyLDYgKzE1ODIsMTAgQEAKIAkJCiAJCXN6ICs9IHRocmVhZF9zdGF0dXNfc2l6ZTsKIAorI2lmZGVmIEVMRl9DT1JFX1dSSVRFX0VYVFJBX05PVEVTCisJCXN6ICs9IEVMRl9DT1JFX0VYVFJBX05PVEVTX1NJWkU7CisjZW5kaWYKKwogCQlmaWxsX2VsZl9ub3RlX3BoZHIoJnBoZHIsIHN6LCBvZmZzZXQpOwogCQlvZmZzZXQgKz0gc3o7CiAJCURVTVBfV1JJVEUoJnBoZHIsIHNpemVvZihwaGRyKSk7CkBAIC0xNjIyLDYgKzE2MjYsMTAgQEAKIAkJaWYgKCF3cml0ZW5vdGUobm90ZXMgKyBpLCBmaWxlLCAmZm9mZnNldCkpCiAJCQlnb3RvIGVuZF9jb3JlZHVtcDsKIAorI2lmZGVmIEVMRl9DT1JFX1dSSVRFX0VYVFJBX05PVEVTCisJRUxGX0NPUkVfV1JJVEVfRVhUUkFfTk9URVM7CisjZW5kaWYKKwogCS8qIHdyaXRlIG91dCB0aGUgdGhyZWFkIHN0YXR1cyBub3RlcyBzZWN0aW9uICovCiAJbGlzdF9mb3JfZWFjaCh0LCAmdGhyZWFkX2xpc3QpIHsKIAkJc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0bXAgPQpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCBmOTVjODc0Li5hYTRkMDliIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtNTYwLDEwICs1NjAsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoYmlvX2FkZF9wY19wYWdlKHEsIGJpbywgcGFnZSwgYnl0ZXMsIDApIDwgYnl0ZXMpIHsKLQkJCXJldCA9IC1FSU5WQUw7CisJCWlmIChiaW9fYWRkX3BjX3BhZ2UocSwgYmlvLCBwYWdlLCBieXRlcywgMCkgPCBieXRlcykKIAkJCWJyZWFrOwotCQl9CiAKIAkJbGVuIC09IGJ5dGVzOwogCX0KQEAgLTYyMiwxMCArNjIwLDkgQEAKIAogCQlucl9wYWdlcyArPSBlbmQgLSBzdGFydDsKIAkJLyoKLQkJICogdHJhbnNmZXIgYW5kIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQgdG8gYXQgbGVhc3QgaGFyZHNlY3RvcgotCQkgKiBzaXplIGZvciBub3csIGluIHRoZSBmdXR1cmUgd2UgY2FuIHJlbGF4IHRoaXMgcmVzdHJpY3Rpb24KKwkJICogYnVmZmVyIG11c3QgYmUgYWxpZ25lZCB0byBhdCBsZWFzdCBoYXJkc2VjdG9yIHNpemUgZm9yIG5vdwogCQkgKi8KLQkJaWYgKCh1YWRkciAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpIHx8IChsZW4gJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSkKKwkJaWYgKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIApAQCAtNzUxLDcgKzc0OCw2IEBACiAJCQkgICAgIGludCB3cml0ZV90b192bSkKIHsKIAlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IGxlbiA9IDAsIGk7CiAKIAliaW8gPSBfX2Jpb19tYXBfdXNlcl9pb3YocSwgYmRldiwgaW92LCBpb3ZfY291bnQsIHdyaXRlX3RvX3ZtKTsKIApAQCAtNzY2LDE4ICs3NjIsNyBAQAogCSAqLwogCWJpb19nZXQoYmlvKTsKIAotCWZvciAoaSA9IDA7IGkgPCBpb3ZfY291bnQ7IGkrKykKLQkJbGVuICs9IGlvdltpXS5pb3ZfbGVuOwotCi0JaWYgKGJpby0+Ymlfc2l6ZSA9PSBsZW4pCi0JCXJldHVybiBiaW87Ci0KLQkvKgotCSAqIGRvbid0IHN1cHBvcnQgcGFydGlhbCBtYXBwaW5ncwotCSAqLwotCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgMCk7Ci0JYmlvX3VubWFwX3VzZXIoYmlvKTsKLQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlyZXR1cm4gYmlvOwogfQogCiBzdGF0aWMgdm9pZCBfX2Jpb191bm1hcF91c2VyKHN0cnVjdCBiaW8gKmJpbykKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwppbmRleCAxYWQ4YzlmLi5jNGZhOTFiIDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0zMTgsNiArMzE4LDcgQEAKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihzYik7CiAJY2hhciAqdG1wX3BhdGg7CiAJY2hhciAqYnVmID0gTlVMTDsKKwlpbnQgYWRqdXN0VFogPSBGQUxTRTsKIAogCXBUY29uID0gY2lmc19zYi0+dGNvbjsKIAljRllJKDEsKCJHZXR0aW5nIGluZm8gb24gJXMiLCBzZWFyY2hfcGF0aCkpOwpAQCAtMzQ4LDYgKzM0OSw3IEBACiAJCQkJCXBmaW5kRGF0YSwgY2lmc19zYi0+bG9jYWxfbmxzLCAKIAkJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgogCQkJCQkgIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwkJCWFkanVzdFRaID0gVFJVRTsKIAkJfQogCQkKIAl9CkBAIC00NDQsNiArNDQ2LDEwIEBACiAJCWlub2RlLT5pX2N0aW1lID0KIAkJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+Q2hhbmdlVGltZSkpOwogCQljRllJKDAsICgiQXR0cmlidXRlcyBjYW1lIGluIGFzIDB4JXgiLCBhdHRyKSk7CisJCWlmKGFkanVzdFRaICYmIChwVGNvbi0+c2VzKSAmJiAocFRjb24tPnNlcy0+c2VydmVyKSkgeworCQkJaW5vZGUtPmlfY3RpbWUudHZfc2VjICs9IHBUY29uLT5zZXMtPnNlcnZlci0+dGltZUFkajsKKwkgICAgICAgICAgICAgICAgaW5vZGUtPmlfbXRpbWUudHZfc2VjICs9IHBUY29uLT5zZXMtPnNlcnZlci0+dGltZUFkajsKKwkJfQogCiAJCS8qIHNldCBkZWZhdWx0IG1vZGUuIHdpbGwgb3ZlcnJpZGUgZm9yIGRpcnMgYmVsb3cgKi8KIAkJaWYgKGF0b21pY19yZWFkKCZjaWZzSW5mby0+aW5Vc2UpID09IDApCmRpZmYgLS1naXQgYS9mcy9jaWZzL2xpbmsuYyBiL2ZzL2NpZnMvbGluay5jCmluZGV4IDBiZWU4YjcuLjhlMjU5OTYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvbGluay5jCisrKyBiL2ZzL2NpZnMvbGluay5jCkBAIC02OSwxNyArNjksMzAgQEAKIAkJCXJjID0gLUVPUE5PVFNVUFA7ICAKIAl9CiAKLS8qIGlmICghcmMpICAgICAqLwotCXsKLQkJLyogICByZW5ld19wYXJlbnRhbF90aW1lc3RhbXBzKG9sZF9maWxlKTsKLQkJICAgaW5vZGUtPmlfbmxpbmsrKzsKLQkJICAgbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JCSAgIGRfaW5zdGFudGlhdGUoZGlyZW50cnksIGlub2RlKTsgKi8KLQkJLyogQkIgYWRkIGNhbGwgdG8gZWl0aGVyIG1hcmsgaW5vZGUgZGlydHkgb3IgcmVmcmVzaCBpdHMgZGF0YSBhbmQgdGltZXN0YW1wIHRvIGN1cnJlbnQgdGltZSAqLworCWRfZHJvcChkaXJlbnRyeSk7CS8qIGZvcmNlIG5ldyBsb29rdXAgZnJvbSBzZXJ2ZXIgb2YgdGFyZ2V0ICovCisKKwkvKiBpZiBzb3VyY2UgZmlsZSBpcyBjYWNoZWQgKG9wbG9ja2VkKSByZXZhbGlkYXRlIHdpbGwgbm90IGdvIHRvIHNlcnZlcgorCSAgIHVudGlsIHRoZSBmaWxlIGlzIGNsb3NlZCBvciBvcGxvY2sgYnJva2VuIHNvIHVwZGF0ZSBubGlua3MgbG9jYWxseSAqLworCWlmKG9sZF9maWxlLT5kX2lub2RlKSB7CisJCWNpZnNJbm9kZSA9IENJRlNfSShvbGRfZmlsZS0+ZF9pbm9kZSk7CisJCWlmKHJjID09IDApIHsKKwkJCW9sZF9maWxlLT5kX2lub2RlLT5pX25saW5rKys7CisJCQlvbGRfZmlsZS0+ZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJCS8qIHBhcmVudCBkaXIgdGltZXN0YW1wcyB3aWxsIHVwZGF0ZSBmcm9tIHNydgorCQkJd2l0aGluIGEgc2Vjb25kLCB3b3VsZCBpdCByZWFsbHkgYmUgd29ydGggaXQKKwkJCXRvIHNldCB0aGUgcGFyZW50IGRpciBjaWZzIGlub2RlIHRpbWUgdG8gemVybworCQkJdG8gZm9yY2UgcmV2YWxpZGF0ZSAoZmFzdGVyKSBmb3IgaXQgdG9vPyAqLworCQl9CisJCS8qIGlmIG5vdCBvcGxvY2tlZCB3aWxsIGZvcmNlIHJldmFsaWRhdGUgdG8gZ2V0IGluZm8gCisJCSAgIG9uIHNvdXJjZSBmaWxlIGZyb20gc3J2ICovCisJCWNpZnNJbm9kZS0+dGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBXaWxsIHVwZGF0ZSBwYXJlbnQgZGlyIHRpbWVzdGFtcHMgZnJvbSBzcnYgd2l0aGluIGEgc2Vjb25kLgorCQkgICBXb3VsZCBpdCByZWFsbHkgYmUgd29ydGggaXQgdG8gc2V0IHRoZSBwYXJlbnQgZGlyIChjaWZzCisJCSAgIGlub2RlKSB0aW1lIGZpZWxkIHRvIHplcm8gdG8gZm9yY2UgcmV2YWxpZGF0ZSBvbiBwYXJlbnQKKwkJICAgZGlyZWN0b3J5IGZhc3RlciBpZSAKKwkJCUNJRlNfSShpbm9kZSktPnRpbWUgPSAwOyAgKi8KIAl9Ci0JZF9kcm9wKGRpcmVudHJ5KTsJLyogZm9yY2UgbmV3IGxvb2t1cCBmcm9tIHNlcnZlciAqLwotCWNpZnNJbm9kZSA9IENJRlNfSShvbGRfZmlsZS0+ZF9pbm9kZSk7Ci0JY2lmc0lub2RlLT50aW1lID0gMDsJLyogd2lsbCBmb3JjZSByZXZhbGlkYXRlIHRvIGdvIGdldCBpbmZvIHdoZW4gbmVlZGVkICovCiAKIGNpZnNfaGxfZXhpdDoKIAlrZnJlZShmcm9tTmFtZSk7CmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDhkMGEwMDEuLjA2ZGFkNjYgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RzYWNjdF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8bmV0L3NvY2suaD4JCS8qIHNpb2NkZXZwcml2YXRlX2lvY3RsICovCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9kaXIuYyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCmluZGV4IDhhM2I2YTEuLmMzOTg4NjEgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2Rpci5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCkBAIC05Myw4ICs5Myw4IEBACiAgKgogICogY2FsbGVkIHdpdGggcGFyZW50IGlub2RlJ3MgaV9tdXRleCBoZWxkCiAgKi8KLWludCBjb25maWdmc19kaXJlbnRfZXhpc3RzKHN0cnVjdCBjb25maWdmc19kaXJlbnQgKnBhcmVudF9zZCwKLQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldykKK3N0YXRpYyBpbnQgY29uZmlnZnNfZGlyZW50X2V4aXN0cyhzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpwYXJlbnRfc2QsCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXcpCiB7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHNkOwogCkBAIC0xMTc2LDggKzExNzYsOSBAQAogCQlyZXR1cm47CiAJfQogCi0JbXV0ZXhfbG9jaygmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF9sb2NrX25lc3RlZCgmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCwKKwkJCSAgSV9NVVRFWF9QQVJFTlQpOworCW11dGV4X2xvY2tfbmVzdGVkKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOwogCWlmIChjb25maWdmc19kZXRhY2hfcHJlcChkZW50cnkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY29uZmlnZnM6IFRyaWVkIHRvIHVucmVnaXN0ZXIgbm9uLWVtcHR5IHN1YnN5c3RlbSFcbiIpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCBhNzM2ZDQ0Li4xMzdkNzZjIDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KIApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwppbmRleCAxMzYxNzVhLi5mNjNhNzc1IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9jcnlwdG8uYworKysgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwpAQCAtODIwLDcgKzgyMCw4IEBACiAJY3J5cHRfc3RhdC0+dGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihmdWxsX2FsZ19uYW1lLCAwLAogCQkJCQkJIENSWVBUT19BTEdfQVNZTkMpOwogCWtmcmVlKGZ1bGxfYWxnX25hbWUpOwotCWlmICghY3J5cHRfc3RhdC0+dGZtKSB7CisJaWYgKElTX0VSUihjcnlwdF9zdGF0LT50Zm0pKSB7CisJCXJjID0gUFRSX0VSUihjcnlwdF9zdGF0LT50Zm0pOwogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJjcnlwdGZzOiBpbml0X2NyeXB0X2N0eCgpOiAiCiAJCQkJIkVycm9yIGluaXRpYWxpemluZyBjaXBoZXIgWyVzXVxuIiwKIAkJCQljcnlwdF9zdGF0LT5jaXBoZXIpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggY2ZjOGY4MS4uYzcxYTZjMCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xMzgsNiArMTM4LDcgQEAKIAkJc3RydWN0IGZ1c2VfZW50cnlfb3V0IG91dGFyZzsKIAkJc3RydWN0IGZ1c2VfY29ubiAqZmM7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCQlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CiAJCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKIAogCQkvKiBEb2Vzbid0IGh1cnQgdG8gInJlc2V0IiB0aGUgdmFsaWRpdHkgdGltZW91dCAqLwpAQCAtMTUyLDI1ICsxNTMsMzMgQEAKIAkJaWYgKElTX0VSUihyZXEpKQogCQkJcmV0dXJuIDA7CiAKKwkJZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpIHsKKwkJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCiAJCXBhcmVudCA9IGRnZXRfcGFyZW50KGVudHJ5KTsKIAkJZnVzZV9sb29rdXBfaW5pdChyZXEsIHBhcmVudC0+ZF9pbm9kZSwgZW50cnksICZvdXRhcmcpOwogCQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWRwdXQocGFyZW50KTsKIAkJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJLyogWmVybyBub2RlaWQgaXMgc2FtZSBhcyAtRU5PRU5UICovCiAJCWlmICghZXJyICYmICFvdXRhcmcubm9kZWlkKQogCQkJZXJyID0gLUVOT0VOVDsKIAkJaWYgKCFlcnIpIHsKIAkJCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKIAkJCWlmIChvdXRhcmcubm9kZWlkICE9IGdldF9ub2RlX2lkKGlub2RlKSkgewotCQkJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CisJCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgZm9yZ2V0X3JlcSwKKwkJCQkJCSBvdXRhcmcubm9kZWlkLCAxKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQkJZmktPm5sb29rdXAgKys7CiAJCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQl9Ci0JCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOwogCQlpZiAoZXJyIHx8IChvdXRhcmcuYXR0ci5tb2RlIF4gaW5vZGUtPmlfbW9kZSkgJiBTX0lGTVQpCiAJCQlyZXR1cm4gMDsKIApAQCAtMjIxLDYgKzIzMCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CiAJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2VfcmVxICpmb3JnZXRfcmVxOwogCiAJaWYgKGVudHJ5LT5kX25hbWUubGVuID4gRlVTRV9OQU1FX01BWCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CkBAIC0yMjksOSArMjM5LDE2IEBACiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHJlcSkpOwogCisJZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGZvcmdldF9yZXEpKTsKKwl9CisKIAlmdXNlX2xvb2t1cF9pbml0KHJlcSwgZGlyLCBlbnRyeSwgJm91dGFyZyk7CiAJcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkvKiBaZXJvIG5vZGVpZCBpcyBzYW1lIGFzIC1FTk9FTlQsIGJ1dCB3aXRoIHZhbGlkIHRpbWVvdXQgKi8KIAlpZiAoIWVyciAmJiBvdXRhcmcubm9kZWlkICYmCiAJICAgIChpbnZhbGlkX25vZGVpZChvdXRhcmcubm9kZWlkKSB8fCAhdmFsaWRfbW9kZShvdXRhcmcuYXR0ci5tb2RlKSkpCkBAIC0yNDAsMTEgKzI1NywxMSBAQAogCQlpbm9kZSA9IGZ1c2VfaWdldChkaXItPmlfc2IsIG91dGFyZy5ub2RlaWQsIG91dGFyZy5nZW5lcmF0aW9uLAogCQkJCSAgJm91dGFyZy5hdHRyKTsKIAkJaWYgKCFpbm9kZSkgewotCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGFyZy5ub2RlaWQsIDEpOwogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJCX0KIAl9Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKIAlpZiAoZXJyICYmIGVyciAhPSAtRU5PRU5UKQogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCkBAIC0zODgsNiArNDA1LDEzIEBACiAJc3RydWN0IGZ1c2VfZW50cnlfb3V0IG91dGFyZzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBlcnI7CisJc3RydWN0IGZ1c2VfcmVxICpmb3JnZXRfcmVxOworCisJZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCQlyZXR1cm4gUFRSX0VSUihmb3JnZXRfcmVxKTsKKwl9CiAKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKQEAgLTM5NSwyNCArNDE5LDI0IEBACiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CiAJcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7Ci0JaWYgKGVycikgewotCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3B1dF9mb3JnZXRfcmVxOworCiAJZXJyID0gLUVJTzsKIAlpZiAoaW52YWxpZF9ub2RlaWQob3V0YXJnLm5vZGVpZCkpCi0JCWdvdG8gb3V0X3B1dF9yZXF1ZXN0OworCQlnb3RvIG91dF9wdXRfZm9yZ2V0X3JlcTsKIAogCWlmICgob3V0YXJnLmF0dHIubW9kZSBeIG1vZGUpICYgU19JRk1UKQotCQlnb3RvIG91dF9wdXRfcmVxdWVzdDsKKwkJZ290byBvdXRfcHV0X2ZvcmdldF9yZXE7CiAKIAlpbm9kZSA9IGZ1c2VfaWdldChkaXItPmlfc2IsIG91dGFyZy5ub2RlaWQsIG91dGFyZy5nZW5lcmF0aW9uLAogCQkJICAmb3V0YXJnLmF0dHIpOwogCWlmICghaW5vZGUpIHsKLQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJZnVzZV9zZW5kX2ZvcmdldChmYywgZm9yZ2V0X3JlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJc3RydWN0IGRlbnRyeSAqYWxpYXM7CkBAIC00MzQsOCArNDU4LDggQEAKIAlmdXNlX2ludmFsaWRhdGVfYXR0cihkaXIpOwogCXJldHVybiAwOwogCi0gb3V0X3B1dF9yZXF1ZXN0OgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Cisgb3V0X3B1dF9mb3JnZXRfcmVxOgorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbG9ja2luZy9kbG0vcGxvY2suYyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vcGxvY2suYwppbmRleCA3MzY1YWVjLi4zNzk5ZjE5IDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvY2tpbmcvZGxtL3Bsb2NrLmMKKysrIGIvZnMvZ2ZzMi9sb2NraW5nL2RsbS9wbG9jay5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tfZGxtX3Bsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCiAjaW5jbHVkZSAibG9ja19kbG0uaCIKIApkaWZmIC0tZ2l0IGEvZnMvaW5vdGlmeS5jIGIvZnMvaW5vdGlmeS5jCmluZGV4IDcyMzgzNmEuLmY1MDk5ZDggMTAwNjQ0Ci0tLSBhL2ZzL2lub3RpZnkuYworKysgYi9mcy9pbm90aWZ5LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9hY2wuYyBiL2ZzL2pmZnMyL2FjbC5jCmluZGV4IDBhZTNjZDEuLjczZjBkNjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2FjbC5jCisrKyBiL2ZzL2pmZnMyL2FjbC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvd2J1Zi5jIGIvZnMvamZmczIvd2J1Zi5jCmluZGV4IGI5YjcwMDcuLjcwNzA3MzAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3didWYuYworKysgYi9mcy9qZmZzMi93YnVmLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlICJub2RlbGlzdC5oIgogCmRpZmYgLS1naXQgYS9mcy9qZnMvaW9jdGwuYyBiL2ZzL2pmcy9pb2N0bC5jCmluZGV4IDM3ZGI1MjQuLmVkODE0YjEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9pb2N0bC5jCisrKyBiL2ZzL2pmcy9pb2N0bC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19maWxzeXMuaCBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKaW5kZXggOTkwMTkyOC4uZWI1NTBiMyAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19maWxzeXMuaAorKysgYi9mcy9qZnMvamZzX2ZpbHN5cy5oCkBAIC04MSw3ICs4MSw3IEBACiAjZGVmaW5lCUpGU19TV0FQX0JZVEVTCQkweDAwMTAwMDAwCS8qIHJ1bm5pbmcgb24gYmlnIGVuZGlhbiBjb21wdXRlciAqLwogCiAvKiBEaXJlY3RvcnkgaW5kZXggKi8KLSNkZWZpbmUgSkZTX0RJUl9JTkRFWAkJMHgwMDIwMDAwMAkvKiBQZXJzaXN0YW50IGluZGV4IGZvciAqLworI2RlZmluZSBKRlNfRElSX0lOREVYCQkweDAwMjAwMDAwCS8qIFBlcnNpc3RlbnQgaW5kZXggZm9yICovCiAJCQkJCQkvKiBkaXJlY3RvcnkgZW50cmllcyAgICAqLwogCiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnNyb290LmMgYi9mcy9uZnMvbmZzcm9vdC5jCmluZGV4IDhkZmVmZTQuLjc1ZjgxOWQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnNyb290LmMKKysrIGIvZnMvbmZzL25mc3Jvb3QuYwpAQCAtOTgsNyArOTgsNyBAQAogc3RhdGljIGNoYXIgbmZzX3Jvb3RfbmFtZVsyNTZdIF9faW5pdGRhdGEgPSAiIjsKIAogLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCi1zdGF0aWMgX191MzIgc2VydmFkZHIgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgX19iZTMyIHNlcnZhZGRyIF9faW5pdGRhdGEgPSAwOwogCiAvKiBOYW1lIG9mIGRpcmVjdG9yeSB0byBtb3VudCAqLwogc3RhdGljIGNoYXIgbmZzX3BhdGhbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGEgPSB7IDAsIH07CkBAIC0zMjcsNyArMzI3LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfYWRkcih2b2lkKQogewotCWlmICgoc2VydmFkZHIgPSByb290X3NlcnZlcl9hZGRyKSA9PSBJTkFERFJfTk9ORSkgeworCWlmICgoc2VydmFkZHIgPSByb290X3NlcnZlcl9hZGRyKSA9PSBodG9ubChJTkFERFJfTk9ORSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogTm8gTkZTIHNlcnZlciBhdmFpbGFibGUsIGdpdmluZyB1cC5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNDExLDcgKzQxMSw3IEBACiAgKiAgQ29uc3RydWN0IHNvY2thZGRyX2luIGZyb20gYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX3UzMiBhZGRyLCBfX3UxNiBwb3J0KQorc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX2JlMzIgYWRkciwgX19iZTE2IHBvcnQpCiB7CiAJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKIAlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7CkBAIC00NjgsMTQgKzQ2OCwxMyBAQAogCQlkcHJpbnRrKCJSb290LU5GUzogUG9ydG1hcHBlciBvbiBzZXJ2ZXIgcmV0dXJuZWQgJWQgIgogCQkJImFzIG5mc2QgcG9ydFxuIiwgcG9ydCk7CiAJfQotCW5mc19wb3J0ID0gaHRvbnMobmZzX3BvcnQpOwogCiAJaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfTU5UX1BST0dSQU0sIG1vdW50ZF92ZXIsIHByb3RvKSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFVuYWJsZSB0byBnZXQgbW91bnRkIHBvcnQgIgogCQkJCSJudW1iZXIgZnJvbSBzZXJ2ZXIsIHVzaW5nIGRlZmF1bHRcbiIpOwogCQlwb3J0ID0gbW91bnRkX3BvcnQ7CiAJfQotCW1vdW50X3BvcnQgPSBodG9ucyhwb3J0KTsKKwltb3VudF9wb3J0ID0gcG9ydDsKIAlkcHJpbnRrKCJSb290LU5GUzogbW91bnRkIHBvcnQgaXMgJWRcbiIsIHBvcnQpOwogCiAJcmV0dXJuIDA7CkBAIC00OTYsNyArNDk1LDcgQEAKIAlpbnQgdmVyc2lvbiA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSA/CiAJCQkJCU5GU19NTlQzX1ZFUlNJT04gOiBORlNfTU5UX1ZFUlNJT047CiAKLQlzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIG1vdW50X3BvcnQpOworCXNldF9zb2NrYWRkcigmc2luLCBzZXJ2YWRkciwgaHRvbnMobW91bnRfcG9ydCkpOwogCXN0YXR1cyA9IG5mc3Jvb3RfbW91bnQoJnNpbiwgbmZzX3BhdGgsICZmaCwgdmVyc2lvbiwgcHJvdG9jb2wpOwogCWlmIChzdGF0dXMgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBTZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQgIgpAQCAtNTE5LDYgKzUxOCw2IEBACiAJIHx8IHJvb3RfbmZzX3BvcnRzKCkgPCAwCiAJIHx8IHJvb3RfbmZzX2dldF9oYW5kbGUoKSA8IDApCiAJCXJldHVybiBOVUxMOwotCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZuZnNfZGF0YS5hZGRyLCBzZXJ2YWRkciwgbmZzX3BvcnQpOworCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZuZnNfZGF0YS5hZGRyLCBzZXJ2YWRkciwgaHRvbnMobmZzX3BvcnQpKTsKIAlyZXR1cm4gKHZvaWQqKSZuZnNfZGF0YTsKIH0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IGY0M2JjNWYuLjg1YTA0OGIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNTIsMTQgKzUyLDE0IEBACiAJCQkgICAgICAgdTY0IGJsa25vKTsKIAogc3RhdGljIGludCBvY2ZzMl9jcmVhdGVfbmV3X21ldGFfYmhzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIGludCB3YW50ZWQsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10pOwogCiBzdGF0aWMgaW50IG9jZnMyX2FkZF9icmFuY2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCwKQEAgLTY3LDE0ICs2NywxNCBAQAogCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKTsKIAogc3RhdGljIGludCBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9uZXdfZWJfYmgpOwogCiBzdGF0aWMgaW50IG9jZnMyX2RvX2luc2VydF9leHRlbnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCQkgIHU2NCBibGtubywKQEAgLTE1Miw3ICsxNTIsNyBAQAogICogbF9jb3VudCBmb3IgeW91CiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfY3JlYXRlX25ld19tZXRhX2JocyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICBpbnQgd2FudGVkLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCkBAIC0yNTMsNyArMjUzLDcgQEAKICAqIGNvbnRhaW4gYSBzaW5nbGUgcmVjb3JkIHdpdGggZV9jbHVzdGVycyA9PSAwLgogICovCiBzdGF0aWMgaW50IG9jZnMyX2FkZF9icmFuY2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCwKQEAgLTQxOCw3ICs0MTgsNyBAQAogICogYWZ0ZXIgdGhpcyBjYWxsLgogICovCiBzdGF0aWMgaW50IG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLApAQCAtNTIwLDcgKzUyMCw3IEBACiAgKiBkb3duLgogICovCiBzdGF0aWMgaW50IG9jZnMyX2RvX2luc2VydF9leHRlbnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCQkgIHU2NCBzdGFydF9ibGssCkBAIC04MDksNyArODA5LDcgQEAKIAogLyogdGhlIGNhbGxlciBuZWVkcyB0byB1cGRhdGUgZmUtPmlfY2x1c3RlcnMgKi8KIGludCBvY2ZzMl9pbnNlcnRfZXh0ZW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICppbm9kZSwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQl1NjQgc3RhcnRfYmxrLApAQCAtOTUxLDcgKzk1MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgIHU2NCBzdGFydF9ibGssCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzKQogewpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZXBsYXlfdHJ1bmNhdGVfcmVjb3JkcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkJIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJIHN0cnVjdCBpbm9kZSAqZGF0YV9hbGxvY19pbm9kZSwKIAkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9hbGxvY19iaCkKIHsKQEAgLTExMTMsNyArMTExMyw3IEBACiB7CiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbnVtX3RvX2ZsdXNoOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKmRhdGFfYWxsb2NfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqdGxfYmggPSBvc2ItPm9zYl90bF9iaDsKQEAgLTExMzAsNyArMTEzMCw3IEBACiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7CiAJCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKG9zYi0+c2IsIGRpKTsKIAkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dDsKIAl9CiAKIAludW1fdG9fZmx1c2ggPSBsZTE2X3RvX2NwdSh0bC0+dGxfdXNlZCk7CkBAIC0xMTM4LDE0ICsxMTM4LDcgQEAKIAkgICAgIG51bV90b19mbHVzaCwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKHRsX2lub2RlKS0+aXBfYmxrbm8pOwogCWlmICghbnVtX3RvX2ZsdXNoKSB7CiAJCXN0YXR1cyA9IDA7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoIWhhbmRsZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAJfQogCiAJZGF0YV9hbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCkBAIC0xMTU0LDQxICsxMTQ3LDQwIEBACiAJaWYgKCFkYXRhX2FsbG9jX2lub2RlKSB7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCW1sb2coTUxfRVJST1IsICJDb3VsZCBub3QgZ2V0IGJpdG1hcCBpbm9kZSFcbiIpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCX0KIAotCW9jZnMyX2hhbmRsZV9hZGRfaW5vZGUoaGFuZGxlLCBkYXRhX2FsbG9jX2lub2RlKTsKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGF0YV9hbGxvY19pbm9kZSwgaGFuZGxlLCAmZGF0YV9hbGxvY19iaCwgMSk7CisJbXV0ZXhfbG9jaygmZGF0YV9hbGxvY19pbm9kZS0+aV9tdXRleCk7CisKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGF0YV9hbGxvY19pbm9kZSwgJmRhdGFfYWxsb2NfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9tdXRleDsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwotCQloYW5kbGUgPSBOVUxMOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCXN0YXR1cyA9IG9jZnMyX3JlcGxheV90cnVuY2F0ZV9yZWNvcmRzKG9zYiwgaGFuZGxlLCBkYXRhX2FsbG9jX2lub2RlLAogCQkJCQkgICAgICAgZGF0YV9hbGxvY19iaCk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKKwlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQogCi1iYWlsOgotCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKLQlpZiAoZGF0YV9hbGxvY19pbm9kZSkKLQkJaXB1dChkYXRhX2FsbG9jX2lub2RlKTsKK291dF91bmxvY2s6CisJYnJlbHNlKGRhdGFfYWxsb2NfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGRhdGFfYWxsb2NfaW5vZGUsIDEpOwogCi0JaWYgKGRhdGFfYWxsb2NfYmgpCi0JCWJyZWxzZShkYXRhX2FsbG9jX2JoKTsKK291dF9tdXRleDoKKwltdXRleF91bmxvY2soJmRhdGFfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCWlwdXQoZGF0YV9hbGxvY19pbm9kZSk7CiAKK291dDoKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTM0Nyw3ICsxMzM5LDcgQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgY2x1c3RlcnMsIG51bV9yZWNzLCBzdGFydF9jbHVzdGVyOwogCXU2NCBzdGFydF9ibGs7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CiAJc3RydWN0IG9jZnMyX3RydW5jYXRlX2xvZyAqdGw7CiAKQEAgLTEzNzMsOCArMTM2NSw3IEBACiAJCQl9CiAJCX0KIAotCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE5VTEwsCi0JCQkJCSAgIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUpOworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUpOwogCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTEzODcsNyArMTM3OCw3IEBACiAKIAkJc3RhdHVzID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwKIAkJCQkJCSAgIHN0YXJ0X2JsaywgY2x1c3RlcnMpOwotCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbF91cDsKQEAgLTE1NDMsNyArMTUzNCw3IEBACiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2xhc3RfZWJfYmgsCi0JCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpCiB7CiAJaW50IHN0YXR1cywgaSwgZGVwdGg7CkBAIC0xNzgyLDcgKzE3NzMsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKQEAgLTE4NjgsNyArMTg1OSw3IEBACiAKIAljcmVkaXRzID0gb2NmczJfY2FsY190cmVlX3RydW5jX2NyZWRpdHMob3NiLT5zYiwgY2x1c3RlcnNfdG9fZGVsLAogCQkJCQkJZmUsIGVsKTsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE5VTEwsIGNyZWRpdHMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTE4OTEsNyArMTg4Miw3IEBACiAJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CiAJdGxfc2VtID0gMDsKIAotCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAJaGFuZGxlID0gTlVMTDsKIAogCUJVR19PTihsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykgPCB0YXJnZXRfaV9jbHVzdGVycyk7CkBAIC0xOTA2LDcgKzE4OTcsNyBAQAogCQltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKIAogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiAJaWYgKGxhc3RfZWJfYmgpCiAJCWJyZWxzZShsYXN0X2ViX2JoKTsKQEAgLTIwMTEsMTAgKzIwMDIsNyBAQAogCQltdXRleF9sb2NrKCZleHRfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwogCQkoKnRjKS0+dGNfZXh0X2FsbG9jX2lub2RlID0gZXh0X2FsbG9jX2lub2RlOwogCi0JCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhleHRfYWxsb2NfaW5vZGUsCi0JCQkJCSBOVUxMLAotCQkJCQkgJmV4dF9hbGxvY19iaCwKLQkJCQkJIDEpOworCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZXh0X2FsbG9jX2lub2RlLCAmZXh0X2FsbG9jX2JoLCAxKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmggYi9mcy9vY2ZzMi9hbGxvYy5oCmluZGV4IDEyYmE4OTcuLjBiODJlODAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmgKKysrIGIvZnMvb2NmczIvYWxsb2MuaApAQCAtMjgsNyArMjgsNyBAQAogCiBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dDsKIGludCBvY2ZzMl9pbnNlcnRfZXh0ZW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICppbm9kZSwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQl1NjQgYmxrbm8sCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggM2Q3YzA4Mi4uMmY3MjY4ZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAltbG9nX2VudHJ5KCIoMHglcCwgJWx1KVxuIiwgZmlsZSwgKHBhZ2UgPyBwYWdlLT5pbmRleCA6IDApKTsKIAotCXJldCA9IG9jZnMyX21ldGFfbG9ja193aXRoX3BhZ2UoaW5vZGUsIE5VTEwsIE5VTEwsIDAsIHBhZ2UpOworCXJldCA9IG9jZnMyX21ldGFfbG9ja193aXRoX3BhZ2UoaW5vZGUsIE5VTEwsIDAsIHBhZ2UpOwogCWlmIChyZXQgIT0gMCkgewogCQlpZiAocmV0ID09IEFPUF9UUlVOQ0FURURfUEFHRSkKIAkJCXVubG9jayA9IDA7CkBAIC0zMDUsNyArMzA1LDcgQEAKIAogCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAldSwgJXUpXG4iLCBmaWxlLCBwYWdlLCBmcm9tLCB0byk7CiAKLQlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCBOVUxMLCBOVUxMLCAwLCBwYWdlKTsKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCBOVUxMLCAwLCBwYWdlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTM1NSwxNiArMzU1LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKK2hhbmRsZV90ICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJCQkJIHVuc2lnbmVkIGZyb20sCiAJCQkJCQkJIHVuc2lnbmVkIHRvKQogewogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgTlVMTCwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmICghaGFuZGxlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTM3Miw3ICszNzIsNyBAQAogCX0KIAogCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKLQkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLT5rX2hhbmRsZSwKKwkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLAogCQkJCQlwYWdlX2J1ZmZlcnMocGFnZSksCiAJCQkJCWZyb20sIHRvLCBOVUxMLAogCQkJCQlvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOwpAQCAtMzgyLDcgKzM4Miw3IEBACiBvdXQ6CiAJaWYgKHJldCkgewogCQlpZiAoaGFuZGxlKQotCQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCQloYW5kbGUgPSBFUlJfUFRSKHJldCk7CiAJfQogCXJldHVybiBoYW5kbGU7CkBAIC0zOTQsNyArMzk0LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAogCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAldSwgJXUpXG4iLCBmaWxlLCBwYWdlLCBmcm9tLCB0byk7CkBAIC00MTIsNyArNDEyLDcgQEAKIAkgKiAgICBzdGFsZSBpbm9kZSBhbGxvY2F0aW9uIGltYWdlIChpX3NpemUsIGlfY2x1c3RlcnMsIGV0YykuCiAJICovCiAKLQlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCBOVUxMLCAmZGlfYmgsIDEsIHBhZ2UpOworCXJldCA9IG9jZnMyX21ldGFfbG9ja193aXRoX3BhZ2UoaW5vZGUsICZkaV9iaCwgMSwgcGFnZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC00NjQsNyArNDY0LDcgQEAKIAl9CiAKIG91dF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKIG91dF91bmxvY2tfZGF0YToKIAlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiBvdXRfdW5sb2NrX21ldGE6CkBAIC00OTAsNyArNDkwLDcgQEAKIAkgKiBhY2Nlc3NlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZSBub2Rlcy4KIAkgKi8KIAlpZiAoIUlOT0RFX0pPVVJOQUwoaW5vZGUpKSB7Ci0JCWVyciA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgTlVMTCwgMCk7CisJCWVyciA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgMCk7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnIgIT0gLUVOT0VOVCkKIAkJCQltbG9nX2Vycm5vKGVycik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmggYi9mcy9vY2ZzMi9hb3BzLmgKaW5kZXggZTg4YzNmMC4uZjQ0NmExNSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5oCisrKyBiL2ZzL29jZnMyL2FvcHMuaApAQCAtMjUsNyArMjUsNyBAQAogaW50IG9jZnMyX3ByZXBhcmVfd3JpdGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKIAotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKK2hhbmRsZV90ICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJCQkJIHVuc2lnbmVkIGZyb20sCiAJCQkJCQkJIHVuc2lnbmVkIHRvKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggMDRlMDE5MS4uYmFhZDJhYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTgyLDYgKzgyLDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKIAl1bnNpZ25lZCBpbnQgcmFfc2VjdG9ycyA9IDE2OworCWludCBsb2NrX2xldmVsID0gMDsKIAogCW1sb2dfZW50cnkoImRpcmlubz0lbGx1XG4iLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CkBAIC04OSw3ICs5MCwxNSBAQAogCXN0b3JlZCA9IDA7CiAJYmggPSBOVUxMOwogCi0JZXJyb3IgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIE5VTEwsIDApOworCWVycm9yID0gb2NmczJfbWV0YV9sb2NrX2F0aW1lKGlub2RlLCBmaWxwLT5mX3Zmc21udCwgJmxvY2tfbGV2ZWwpOworCWlmIChsb2NrX2xldmVsICYmIGVycm9yID49IDApIHsKKwkJLyogV2UgcmVsZWFzZSBFWCBsb2NrIHdoaWNoIHVzZWQgdG8gdXBkYXRlIGF0aW1lCisJCSAqIGFuZCBnZXQgUFIgbG9jayBhZ2FpbiB0byByZWR1Y2UgY29udGVudGlvbgorCQkgKiBvbiBjb21tb25seSBhY2Nlc3NlZCBkaXJlY3Rvcmllcy4gKi8KKwkJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCQlsb2NrX2xldmVsID0gMDsKKwkJZXJyb3IgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOworCX0KIAlpZiAoZXJyb3IgPCAwKSB7CiAJCWlmIChlcnJvciAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhlcnJvcik7CkBAIC0xOTgsNyArMjA3LDcgQEAKIAogCXN0b3JlZCA9IDA7CiBiYWlsOgotCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAwKTsKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgbG9ja19sZXZlbCk7CiAKIGJhaWxfbm9sb2NrOgogCW1sb2dfZXhpdChzdG9yZWQpOwpAQCAtMzQwLDcgKzM0OSw3IEBACiAKIC8qIHJldHVybnMgYSBiaCBvZiB0aGUgMXN0IG5ldyBibG9jayBpbiB0aGUgYWxsb2NhdGlvbi4gKi8KIGludCBvY2ZzMl9kb19leHRlbmRfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2ZlX2JoLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCkBAIC0zOTgsNyArNDA3LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIHBhcmVudF9mZV9iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICogZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9zYi0+c2I7CkBAIC00MDksMTMgKzQxOCw2IEBACiAJbWxvZygwLCAiZXh0ZW5kaW5nIGRpciAlbGx1IChpX3NpemUgPSAlbGxkKVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShkaXIpLT5pcF9ibGtubywgZGlyX2lfc2l6ZSk7CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQotCiAJLyogZGlyLT5pX3NpemUgaXMgYWx3YXlzIGJsb2NrIGFsaWduZWQuICovCiAJc3Bpbl9sb2NrKCZPQ0ZTMl9JKGRpciktPmlwX2xvY2spOwogCWlmIChkaXJfaV9zaXplID09IG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKHNiLCBPQ0ZTMl9JKGRpciktPmlwX2NsdXN0ZXJzKSkgewpAQCAtNDI4LDggKzQzMCw3IEBACiAJCX0KIAogCQlpZiAoIW51bV9mcmVlX2V4dGVudHMpIHsKLQkJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgaGFuZGxlLAotCQkJCQkJCSAgICBmZSwgJm1ldGFfYWMpOworCQkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGEob3NiLCBmZSwgJm1ldGFfYWMpOwogCQkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQzNyw3ICs0MzgsNyBAQAogCQkJfQogCQl9CiAKLQkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgMSwgJmRhdGFfYWMpOworCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgMSwgJmRhdGFfYWMpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQ1MCw3ICs0NTEsNyBAQAogCQljcmVkaXRzID0gT0NGUzJfU0lNUExFX0RJUl9FWFRFTkRfQ1JFRElUUzsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgY3JlZGl0cyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNDk2LDcgKzQ5Nyw3IEBACiAJZ2V0X2JoKCpuZXdfZGVfYmgpOwogYmFpbDoKIAlpZiAoaGFuZGxlKQotCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogCWlmIChkYXRhX2FjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kaXIuaCBiL2ZzL29jZnMyL2Rpci5oCmluZGV4IDVmNjE0ZWMuLjNmNjdlMTQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2Rpci5oCisrKyBiL2ZzL29jZnMyL2Rpci5oCkBAIC00NSw3ICs0NSw3IEBACiAJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9kZV9iaCk7CiBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dDsKIGludCBvY2ZzMl9kb19leHRlbmRfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2ZlX2JoLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKaW5kZXggOGQxMDY1Zi4uZjZjZGFiMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwpAQCAtNjgsNyArNjgsOCBAQAogCQkJZ290byBvdXRfZnJlZTsKIAogCW1sb2coMCwgIkFsbG9jYXRlZCBETE0gaGFzaCBwYWdldmVjOyAlZCBwYWdlcyAoJWx1IGV4cGVjdGVkKSwgJWx1IGJ1Y2tldHMgcGVyIHBhZ2VcbiIsCi0JICAgICBwYWdlcywgRExNX0hBU0hfUEFHRVMsICh1bnNpZ25lZCBsb25nKURMTV9CVUNLRVRTX1BFUl9QQUdFKTsKKwkgICAgIHBhZ2VzLCAodW5zaWduZWQgbG9uZylETE1fSEFTSF9QQUdFUywKKwkgICAgICh1bnNpZ25lZCBsb25nKURMTV9CVUNLRVRTX1BFUl9QQUdFKTsKIAlyZXR1cm4gdmVjOwogb3V0X2ZyZWU6CiAJZGxtX2ZyZWVfcGFnZXZlYyh2ZWMsIGkpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IDg4MDFlNDEuLjY5ZmJhMTYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlICJkY2FjaGUuaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgorI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFydGJlYXQuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgImpvdXJuYWwuaCIKQEAgLTEwNjMsMTAgKzEwNjQsMTAgQEAKIAltbG9nX2V4aXRfdm9pZCgpOwogfQogCi1pbnQgb2NmczJfY3JlYXRlX25ld19sb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICBzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMsCi0JCQkgIGludCBleCwKLQkJCSAgaW50IGxvY2FsKQorc3RhdGljIGludCBvY2ZzMl9jcmVhdGVfbmV3X2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJIHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcywKKwkJCQkgaW50IGV4LAorCQkJCSBpbnQgbG9jYWwpCiB7CiAJaW50IGxldmVsID0gIGV4ID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE1NzksNyArMTU4MCw2IEBACiAgKiB0aGUgcmVzdWx0IG9mIHRoZSBsb2NrIHdpbGwgYmUgY29tbXVuaWNhdGVkIHZpYSB0aGUgY2FsbGJhY2suCiAgKi8KIGludCBvY2ZzMl9tZXRhX2xvY2tfZnVsbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9iaCwKIAkJCSBpbnQgZXgsCiAJCQkgaW50IGFyZ19mbGFncykKQEAgLTE2NjgsMTIgKzE2NjgsNiBAQAogCQl9CiAJfQogCi0JaWYgKGhhbmRsZSkgewotCQlzdGF0dXMgPSBvY2ZzMl9oYW5kbGVfYWRkX2xvY2soaGFuZGxlLCBpbm9kZSk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCX0KLQogYmFpbDoKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAocmV0X2JoICYmICgqcmV0X2JoKSkgewpAQCAtMTcxMywxOCArMTcwNywxNiBAQAogICogdGhlIGxvY2sgaW52ZXJzaW9uIHNpbXBseS4KICAqLwogaW50IG9jZnMyX21ldGFfbG9ja193aXRoX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcmV0X2JoLAogCQkJICAgICAgaW50IGV4LAogCQkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IG9jZnMyX21ldGFfbG9ja19mdWxsKGlub2RlLCBoYW5kbGUsIHJldF9iaCwgZXgsCi0JCQkJICAgT0NGUzJfTE9DS19OT05CTE9DSyk7CisJcmV0ID0gb2NmczJfbWV0YV9sb2NrX2Z1bGwoaW5vZGUsIHJldF9iaCwgZXgsIE9DRlMyX0xPQ0tfTk9OQkxPQ0spOwogCWlmIChyZXQgPT0gLUVBR0FJTikgewogCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJaWYgKG9jZnMyX21ldGFfbG9jayhpbm9kZSwgaGFuZGxlLCByZXRfYmgsIGV4KSA9PSAwKQorCQlpZiAob2NmczJfbWV0YV9sb2NrKGlub2RlLCByZXRfYmgsIGV4KSA9PSAwKQogCQkJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIGV4KTsKIAkJcmV0ID0gQU9QX1RSVU5DQVRFRF9QQUdFOwogCX0KQEAgLTE3MzIsNiArMTcyNCw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBvY2ZzMl9tZXRhX2xvY2tfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsCisJCQkgIGludCAqbGV2ZWwpCit7CisJaW50IHJldDsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogSWYgd2Ugc2hvdWxkIHVwZGF0ZSBhdGltZSwgd2Ugd2lsbCBnZXQgRVggbG9jaywKKwkgKiBvdGhlcndpc2Ugd2UganVzdCBnZXQgUFIgbG9jay4KKwkgKi8KKwlpZiAob2NmczJfc2hvdWxkX3VwZGF0ZV9hdGltZShpbm9kZSwgdmZzbW50KSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMCk7CisJCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmJoLCAxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJKmxldmVsID0gMTsKKwkJaWYgKG9jZnMyX3Nob3VsZF91cGRhdGVfYXRpbWUoaW5vZGUsIHZmc21udCkpCisJCQlvY2ZzMl91cGRhdGVfaW5vZGVfYXRpbWUoaW5vZGUsIGJoKTsKKwkJaWYgKGJoKQorCQkJYnJlbHNlKGJoKTsKKwl9IGVsc2UKKwkJKmxldmVsID0gMDsKKworCW1sb2dfZXhpdChyZXQpOworCXJldHVybiByZXQ7Cit9CisKIHZvaWQgb2NmczJfbWV0YV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJICAgICAgIGludCBleCkKIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuaCBiL2ZzL29jZnMyL2RsbWdsdWUuaAppbmRleCA0YTI3NjkzLi5jMzQzZmNhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmgKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5oCkBAIC02OCw4ICs2OCw2IEBACiAJCQkJdTY0IHBhcmVudCwgc3RydWN0IGlub2RlICppbm9kZSk7CiB2b2lkIG9jZnMyX2xvY2tfcmVzX2ZyZWUoc3RydWN0IG9jZnMyX2xvY2tfcmVzICpyZXMpOwogaW50IG9jZnMyX2NyZWF0ZV9uZXdfaW5vZGVfbG9ja3Moc3RydWN0IGlub2RlICppbm9kZSk7Ci1pbnQgb2NmczJfY3JlYXRlX25ld19sb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICBzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMsIGludCBleCwgaW50IGxvY2FsKTsKIGludCBvY2ZzMl9kcm9wX2lub2RlX2xvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogaW50IG9jZnMyX2RhdGFfbG9ja19mdWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgaW50IHdyaXRlLApAQCAtODIsMTkgKzgwLDIwIEBACiAJCSAgICAgICBpbnQgd3JpdGUpOwogaW50IG9jZnMyX3J3X2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdyaXRlKTsKIHZvaWQgb2NmczJfcndfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3cml0ZSk7CitpbnQgb2NmczJfbWV0YV9sb2NrX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LAorCQkJICBpbnQgKmxldmVsKTsKIGludCBvY2ZzMl9tZXRhX2xvY2tfZnVsbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9iaCwKIAkJCSBpbnQgZXgsCiAJCQkgaW50IGFyZ19mbGFncyk7CiBpbnQgb2NmczJfbWV0YV9sb2NrX3dpdGhfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZXRfYmgsCiAJCQkgICAgICBpbnQgZXgsCiAJCQkgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAvKiA5OSUgb2YgdGhlIHRpbWUgd2UgZG9uJ3Qgd2FudCB0byBzdXBwbHkgYW55IGFkZGl0aW9uYWwgZmxhZ3MgLS0KICAqIHRob3NlIGFyZSBmb3IgdmVyeSBzcGVjaWZpYyBjYXNlcyBvbmx5LiAqLwotI2RlZmluZSBvY2ZzMl9tZXRhX2xvY2soaSwgaCwgYiwgZSkgb2NmczJfbWV0YV9sb2NrX2Z1bGwoaSwgaCwgYiwgZSwgMCkKKyNkZWZpbmUgb2NmczJfbWV0YV9sb2NrKGksIGIsIGUpIG9jZnMyX21ldGFfbG9ja19mdWxsKGksIGIsIGUsIDApCiB2b2lkIG9jZnMyX21ldGFfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgICBpbnQgZXgpOwogaW50IG9jZnMyX3N1cGVyX2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHBvcnQuYyBiL2ZzL29jZnMyL2V4cG9ydC5jCmluZGV4IGZiOTEwODkuLjA2YmU2ZTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4cG9ydC5jCisrKyBiL2ZzL29jZnMyL2V4cG9ydC5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAltbG9nKDAsICJmaW5kIHBhcmVudCBvZiBkaXJlY3RvcnkgJWxsdVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShkaXIpLT5pcF9ibGtubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBOVUxMLCBOVUxMLCAwKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggMWJlNzRjNC4uODc4NmIzYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpcGVfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9JTk9ERQogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtMTM0LDcgKzEzNiw1OCBAQAogCXJldHVybiAoZXJyIDwgMCkgPyAtRUlPIDogMDsKIH0KIAotaW50IG9jZnMyX3NldF9pbm9kZV9zaXplKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX3Nob3VsZF91cGRhdGVfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50KQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpIHx8IG9jZnMyX2lzX3NvZnRfcmVhZG9ubHkob3NiKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGlub2RlLT5pX2ZsYWdzICYgU19OT0FUSU1FKSB8fAorCSAgICAoKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfTk9ESVJBVElNRSkgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkpCisJCXJldHVybiAwOworCisJaWYgKCh2ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT0FUSU1FKSB8fAorCSAgICAoKHZmc21udC0+bW50X2ZsYWdzICYgTU5UX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm4gMDsKKworCW5vdyA9IENVUlJFTlRfVElNRTsKKwlpZiAoKG5vdy50dl9zZWMgLSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPD0gb3NiLT5zX2F0aW1lX3F1YW50dW0pKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitpbnQgb2NmczJfdXBkYXRlX2lub2RlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbm9kZS0+aV9hdGltZSA9IENVUlJFTlRfVElNRTsKKwlyZXQgPSBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUsIGJoKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKK291dDoKKwltbG9nX2V4aXQocmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfc2V0X2lub2RlX3NpemUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgdTY0IG5ld19pX3NpemUpCkBAIC0xNjMsMTAgKzIxNiw5IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE5VTEwsCi0JCQkJICAgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmIChoYW5kbGUgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0xNzgsNyArMjMwLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCi0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTg5LDE0ICsyNDEsMTQgQEAKIAkJCQkgICAgIHU2NCBuZXdfaV9zaXplKQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJLyogVE9ETzogVGhpcyBuZWVkcyB0byBhY3R1YWxseSBvcnBoYW4gdGhlIGlub2RlIGluIHRoaXMKIAkgKiB0cmFuc2FjdGlvbi4gKi8KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgTlVMTCwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTIwNyw3ICsyNTksNyBAQAogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0zMjgsNyArMzgwLDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KQpAQCAtNDMzLDcgKzQ4NSw3IEBACiAJdTMyIHByZXZfY2x1c3RlcnM7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHdoeTsKQEAgLTQ2MywxMyArNTE1LDYgQEAKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBpX3NpemVfcmVhZChpbm9kZSksCiAJICAgICBmZS0+aV9jbHVzdGVycywgY2x1c3RlcnNfdG9fYWRkKTsKIAotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCiAJbnVtX2ZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLAogCQkJCQkJICBpbm9kZSwKIAkJCQkJCSAgZmUpOwpAQCAtNDgwLDEwICs1MjUsNyBAQAogCX0KIAogCWlmICghbnVtX2ZyZWVfZXh0ZW50cykgewotCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsCi0JCQkJCQkgICAgaGFuZGxlLAotCQkJCQkJICAgIGZlLAotCQkJCQkJICAgICZtZXRhX2FjKTsKKwkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGEob3NiLCBmZSwgJm1ldGFfYWMpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQ5MSwxMCArNTMzLDcgQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLAotCQkJCQloYW5kbGUsCi0JCQkJCWNsdXN0ZXJzX3RvX2FkZCwKLQkJCQkJJmRhdGFfYWMpOworCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBjbHVzdGVyc190b19hZGQsICZkYXRhX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01MDksNyArNTQ4LDcgQEAKIAlkcm9wX2FsbG9jX3NlbSA9IDE7CiAKIAljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLCBmZSwgY2x1c3RlcnNfdG9fYWRkKTsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgY3JlZGl0cyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNTg5LDcgKzYyOCw3IEBACiAJCWRyb3BfYWxsb2Nfc2VtID0gMDsKIAl9CiAJaWYgKGhhbmRsZSkgewotCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKIAl9CiAJaWYgKGRhdGFfYWMpIHsKQEAgLTYyNCw3ICs2NjMsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJaW50IHJldDsKIAogCW9mZnNldCA9IChzaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IC8qIFdpdGhpbiBwYWdlICovCkBAIC02NjgsNyArNzA3LDcgQEAKIAkJcmV0ID0gMDsKIAogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOwogb3V0X3VubG9jazoKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC03ODksNyArODI4LDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihzYik7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsICclLipzJylcbiIsIGRlbnRyeSwKIAkgICAgICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC04MjUsNyArODY0LDcgQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgJmJoLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZiaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtODQ1LDcgKzg4NCw3IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE5VTEwsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC04NjMsNyArOTAyLDcgQEAKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCiBiYWlsX2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogYmFpbF91bmxvY2s6CiAJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOwogYmFpbF91bmxvY2tfcnc6CkBAIC05MDYsMTkgKzk0NSw0MSBAQAogCXJldHVybiBlcnI7CiB9CiAKK2ludCBvY2ZzMl9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgcmV0OworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIE5VTEwpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAwKTsKK291dDoKKwltbG9nX2V4aXQocmV0KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG9jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZTsKKwloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCiAJbWxvZ19lbnRyeSgiKElub2RlICVsbHUsIG1vZGUgMCVvKVxuIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sIGlub2RlLT5pX21vZGUpOwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTk1MSw3NSArMTAxMiwyOSBAQAogb3V0X2JoOgogCWJyZWxzZShiaCk7CiBvdXRfdHJhbnM6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKIAltbG9nX2V4aXQocmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl93cml0ZV9zaG91bGRfcmVtb3ZlX3N1aWQoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbnQgb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQkgbG9mZl90ICpwcG9zLAorCQkJCQkgc2l6ZV90IGNvdW50LAorCQkJCQkgaW50IGFwcGVuZGluZykKIHsKLQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX0ZTRVRJRCkpIHsKLQkJaWYgKHVubGlrZWx5KG1vZGUgJiBTX0lTVUlEKSkKLQkJCXJldHVybiAxOwotCi0JCWlmICh1bmxpa2VseSgobW9kZSAmIFNfSVNHSUQpICYmIChtb2RlICYgU19JWEdSUCkpKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCSAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCi0JCQkJICAgIGxvZmZfdCBwb3MpCi17Ci0JaW50IHJldCwgcndfbGV2ZWwgPSAtMSwgbWV0YV9sZXZlbCA9IC0xLCBoYXZlX2FsbG9jX3NlbSA9IDA7CisJaW50IHJldCA9IDAsIG1ldGFfbGV2ZWwgPSBhcHBlbmRpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAl1MzIgY2x1c3RlcnM7Ci0Jc3RydWN0IGZpbGUgKmZpbHAgPSBpb2NiLT5raV9maWxwOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlsb2ZmX3QgbmV3c2l6ZSwgc2F2ZWRfcG9zOwogCi0JbWxvZ19lbnRyeSgiKDB4JXAsICV1LCAnJS4qcycpXG4iLCBmaWxwLAotCQkgICAodW5zaWduZWQgaW50KW5yX3NlZ3MsCi0JCSAgIGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubGVuLAotCQkgICBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCi0JLyogaGFwcHkgd3JpdGUgb2YgemVybyBieXRlcyAqLwotCWlmIChpb2NiLT5raV9sZWZ0ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKCFpbm9kZSkgewotCQltbG9nKDAsICJiYWQgaW5vZGVcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JLyogdG8gbWF0Y2ggc2V0YXR0cidzIGlfbXV0ZXggLT4gaV9hbGxvY19zZW0gLT4gcndfbG9jayBvcmRlcmluZyAqLwotCWlmIChmaWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsKLQkJaGF2ZV9hbGxvY19zZW0gPSAxOwotCQlkb3duX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JfQotCi0JLyogY29uY3VycmVudCBPX0RJUkVDVCB3cml0ZXMgYXJlIGFsbG93ZWQgKi8KLQlyd19sZXZlbCA9IChmaWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpID8gMCA6IDE7Ci0JcmV0ID0gb2NmczJfcndfbG9jayhpbm9kZSwgcndfbGV2ZWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXJ3X2xldmVsID0gLTE7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJLyogCiAJICogV2Ugc2FtcGxlIGlfc2l6ZSB1bmRlciBhIHJlYWQgbGV2ZWwgbWV0YSBsb2NrIHRvIHNlZSBpZiBvdXIgd3JpdGUKIAkgKiBpcyBleHRlbmRpbmcgdGhlIGZpbGUsIGlmIGl0IGlzIHdlIGJhY2sgb2ZmIGFuZCBnZXQgYSB3cml0ZSBsZXZlbAogCSAqIG1ldGEgbG9jay4KIAkgKi8KLQltZXRhX2xldmVsID0gKGZpbHAtPmZfZmxhZ3MgJiBPX0FQUEVORCkgPyAxIDogMDsKIAlmb3IoOzspIHsKLQkJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCBOVUxMLCBtZXRhX2xldmVsKTsKKwkJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCBtZXRhX2xldmVsKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1ldGFfbGV2ZWwgPSAtMTsKIAkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTEwMzUsNyArMTA1MCw3IEBACiAJCSAqIGlub2RlLiBUaGVyZSdzIGFsc28gdGhlIGRpbm9kZSBpX3NpemUgc3RhdGUgd2hpY2gKIAkJICogY2FuIGJlIGxvc3QgdmlhIHNldGF0dHIgZHVyaW5nIGV4dGVuZGluZyB3cml0ZXMgKHdlCiAJCSAqIHNldCBpbm9kZS0+aV9zaXplIGF0IHRoZSBlbmQgb2YgYSB3cml0ZS4gKi8KLQkJaWYgKG9jZnMyX3dyaXRlX3Nob3VsZF9yZW1vdmVfc3VpZChpbm9kZSkpIHsKKwkJaWYgKHNob3VsZF9yZW1vdmVfc3VpZChkZW50cnkpKSB7CiAJCQlpZiAobWV0YV9sZXZlbCA9PSAwKSB7CiAJCQkJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIG1ldGFfbGV2ZWwpOwogCQkJCW1ldGFfbGV2ZWwgPSAxOwpAQCAtMTA0NSwxOSArMTA2MCwxOSBAQAogCQkJcmV0ID0gb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoaW5vZGUpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJZ290byBvdXQ7CisJCQkJZ290byBvdXRfdW5sb2NrOwogCQkJfQogCQl9CiAKIAkJLyogd29yayBvbiBhIGNvcHkgb2YgcHBvcyB1bnRpbCB3ZSdyZSBzdXJlIHRoYXQgd2Ugd29uJ3QgaGF2ZQogCQkgKiB0byByZWNhbGN1bGF0ZSBpdCBkdWUgdG8gcmVsb2NraW5nLiAqLwotCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CisJCWlmIChhcHBlbmRpbmcpIHsKIAkJCXNhdmVkX3BvcyA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJCW1sb2coMCwgIk9fQVBQRU5EOiBpbm9kZS0+aV9zaXplPSVsbHVcbiIsIHNhdmVkX3Bvcyk7CiAJCX0gZWxzZSB7Ci0JCQlzYXZlZF9wb3MgPSBpb2NiLT5raV9wb3M7CisJCQlzYXZlZF9wb3MgPSAqcHBvczsKIAkJfQotCQluZXdzaXplID0gaW9jYi0+a2lfbGVmdCArIHNhdmVkX3BvczsKKwkJbmV3c2l6ZSA9IGNvdW50ICsgc2F2ZWRfcG9zOwogCiAJCW1sb2coMCwgInBvcz0lbGxkIG5ld3NpemU9JWxsZCBjdXJzaXplPSVsbGRcbiIsCiAJCSAgICAgKGxvbmcgbG9uZykgc2F2ZWRfcG9zLCAobG9uZyBsb25nKSBuZXdzaXplLApAQCAtMTA5MCwxOSArMTEwNSw2NiBAQAogCQlpZiAoIWNsdXN0ZXJzKQogCQkJYnJlYWs7CiAKLQkJcmV0ID0gb2NmczJfZXh0ZW5kX2ZpbGUoaW5vZGUsIE5VTEwsIG5ld3NpemUsIGlvY2ItPmtpX2xlZnQpOworCQlyZXQgPSBvY2ZzMl9leHRlbmRfZmlsZShpbm9kZSwgTlVMTCwgbmV3c2l6ZSwgY291bnQpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKHJldCAhPSAtRU5PU1BDKQogCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CiAJCWJyZWFrOwogCX0KIAotCS8qIG9rLCB3ZSdyZSBkb25lIHdpdGggaV9zaXplIGFuZCBhbGxvYyB3b3JrICovCi0JaW9jYi0+a2lfcG9zID0gc2F2ZWRfcG9zOworCWlmIChhcHBlbmRpbmcpCisJCSpwcG9zID0gc2F2ZWRfcG9zOworCitvdXRfdW5sb2NrOgogCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCBtZXRhX2xldmVsKTsKLQltZXRhX2xldmVsID0gLTE7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCisJCQkJICAgIGxvZmZfdCBwb3MpCit7CisJaW50IHJldCwgcndfbGV2ZWwsIGhhdmVfYWxsb2Nfc2VtID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZmlscCA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCBhcHBlbmRpbmcgPSBmaWxwLT5mX2ZsYWdzICYgT19BUFBFTkQgPyAxIDogMDsKKworCW1sb2dfZW50cnkoIigweCVwLCAldSwgJyUuKnMnKVxuIiwgZmlscCwKKwkJICAgKHVuc2lnbmVkIGludClucl9zZWdzLAorCQkgICBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJICAgZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIGhhcHB5IHdyaXRlIG9mIHplcm8gYnl0ZXMgKi8KKwlpZiAoaW9jYi0+a2lfbGVmdCA9PSAwKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkvKiB0byBtYXRjaCBzZXRhdHRyJ3MgaV9tdXRleCAtPiBpX2FsbG9jX3NlbSAtPiByd19sb2NrIG9yZGVyaW5nICovCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeworCQloYXZlX2FsbG9jX3NlbSA9IDE7CisJCWRvd25fcmVhZCgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwl9CisKKwkvKiBjb25jdXJyZW50IE9fRElSRUNUIHdyaXRlcyBhcmUgYWxsb3dlZCAqLworCXJ3X2xldmVsID0gKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgPyAwIDogMTsKKwlyZXQgPSBvY2ZzMl9yd19sb2NrKGlub2RlLCByd19sZXZlbCk7CisJaWYgKHJldCA8IDApIHsKKwkJcndfbGV2ZWwgPSAtMTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9wcmVwYXJlX2lub2RlX2Zvcl93cml0ZShmaWxwLT5mX2RlbnRyeSwgJmlvY2ItPmtpX3BvcywKKwkJCQkJICAgIGlvY2ItPmtpX2xlZnQsIGFwcGVuZGluZyk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKiBjb21tdW5pY2F0ZSB3aXRoIG9jZnMyX2Rpb19lbmRfaW8gKi8KIAlvY2ZzMl9pb2NiX3NldF9yd19sb2NrZWQoaW9jYik7CkBAIC0xMTI4LDggKzExOTAsNiBAQAogCX0KIAogb3V0OgotCWlmIChtZXRhX2xldmVsICE9IC0xKQotCQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgbWV0YV9sZXZlbCk7CiAJaWYgKGhhdmVfYWxsb2Nfc2VtKQogCQl1cF9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOwogCWlmIChyd19sZXZlbCAhPSAtMSkgCkBAIC0xMTQwLDEyICsxMjAwLDgzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKm91dCwKKwkJCQkgICAgICAgbG9mZl90ICpwcG9zLAorCQkJCSAgICAgICBzaXplX3QgbGVuLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb3V0LT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAldSwgJyUuKnMnKVxuIiwgb3V0LCBwaXBlLAorCQkgICAodW5zaWduZWQgaW50KWxlbiwKKwkJICAgb3V0LT5mX2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJICAgb3V0LT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaW5vZGVfZG91YmxlX2xvY2soaW5vZGUsIHBpcGUtPmlub2RlKTsKKworCXJldCA9IG9jZnMyX3J3X2xvY2soaW5vZGUsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUob3V0LT5mX2RlbnRyeSwgcHBvcywgbGVuLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBvaywgd2UncmUgZG9uZSB3aXRoIGlfc2l6ZSBhbmQgYWxsb2Mgd29yayAqLworCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGVfbm9sb2NrKHBpcGUsIG91dCwgcHBvcywgbGVuLCBmbGFncyk7CisKK291dF91bmxvY2s6CisJb2NmczJfcndfdW5sb2NrKGlub2RlLCAxKTsKK291dDoKKwlpbm9kZV9kb3VibGVfdW5sb2NrKGlub2RlLCBwaXBlLT5pbm9kZSk7CisKKwltbG9nX2V4aXQocmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICppbiwKKwkJCQkgICAgICBsb2ZmX3QgKnBwb3MsCisJCQkJICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgICAgICBzaXplX3QgbGVuLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW4tPmZfZGVudHJ5LT5kX2lub2RlOworCisJbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsICV1LCAnJS4qcycpXG4iLCBpbiwgcGlwZSwKKwkJICAgKHVuc2lnbmVkIGludClsZW4sCisJCSAgIGluLT5mX2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJICAgaW4tPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKgorCSAqIFNlZSB0aGUgY29tbWVudCBpbiBvY2ZzMl9maWxlX2Fpb19yZWFkKCkKKwkgKi8KKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBiYWlsOworCX0KKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMCk7CisKKwlyZXQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQoaW4sIHBwb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOworCitiYWlsOgorCW1sb2dfZXhpdChyZXQpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IG9jZnMyX2ZpbGVfYWlvX3JlYWQoc3RydWN0IGtpb2NiICppb2NiLAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKIAkJCQkgICBsb2ZmX3QgcG9zKQogewotCWludCByZXQgPSAwLCByd19sZXZlbCA9IC0xLCBoYXZlX2FsbG9jX3NlbSA9IDA7CisJaW50IHJldCA9IDAsIHJ3X2xldmVsID0gLTEsIGhhdmVfYWxsb2Nfc2VtID0gMCwgbG9ja19sZXZlbCA9IDA7CiAJc3RydWN0IGZpbGUgKmZpbHAgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIApAQCAtMTE4NywxMiArMTMxOCwxMiBAQAogCSAqIGxpa2UgaV9zaXplLiBUaGlzIGFsbG93cyB0aGUgY2hlY2tzIGRvd24gYmVsb3cKIAkgKiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoKSBhIGNoYW5jZSBvZiBhY3R1YWxseSB3b3JraW5nLiAKIAkgKi8KLQlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIE5VTEwsIDApOworCXJldCA9IG9jZnMyX21ldGFfbG9ja19hdGltZShpbm9kZSwgZmlscC0+Zl92ZnNtbnQsICZsb2NrX2xldmVsKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gYmFpbDsKIAl9Ci0Jb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDApOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCBsb2NrX2xldmVsKTsKIAogCXJldCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZChpb2NiLCBpb3YsIG5yX3NlZ3MsIGlvY2ItPmtpX3Bvcyk7CiAJaWYgKHJldCA9PSAtRUlOVkFMKQpAQCAtMTIyMCwxMSArMTM1MSwxMyBAQAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb2NmczJfZmlsZV9pb3BzID0gewogCS5zZXRhdHRyCT0gb2NmczJfc2V0YXR0ciwKIAkuZ2V0YXR0cgk9IG9jZnMyX2dldGF0dHIsCisJLnBlcm1pc3Npb24JPSBvY2ZzMl9wZXJtaXNzaW9uLAogfTsKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb2NmczJfc3BlY2lhbF9maWxlX2lvcHMgPSB7CiAJLnNldGF0dHIJPSBvY2ZzMl9zZXRhdHRyLAogCS5nZXRhdHRyCT0gb2NmczJfZ2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IG9jZnMyX3Blcm1pc3Npb24sCiB9OwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2ZvcHMgPSB7CkBAIC0xMjM4LDYgKzEzNzEsOCBAQAogCS5haW9fcmVhZAk9IG9jZnMyX2ZpbGVfYWlvX3JlYWQsCiAJLmFpb193cml0ZQk9IG9jZnMyX2ZpbGVfYWlvX3dyaXRlLAogCS5pb2N0bAkJPSBvY2ZzMl9pb2N0bCwKKwkuc3BsaWNlX3JlYWQJPSBvY2ZzMl9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2Vfd3JpdGUJPSBvY2ZzMl9maWxlX3NwbGljZV93cml0ZSwKIH07CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZG9wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuaCBiL2ZzL29jZnMyL2ZpbGUuaAppbmRleCA3NDBjOWU3Li42MDFhNDUzIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmgKKysrIGIvZnMvb2NmczIvZmlsZS5oCkBAIC00MSwxNyArNDEsMjQgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb24pOwogaW50IG9jZnMyX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogaW50IG9jZnMyX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJICBzdHJ1Y3Qga3N0YXQgKnN0YXQpOworaW50IG9jZnMyX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssCisJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogCi1pbnQgb2NmczJfc2V0X2lub2RlX3NpemUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgb2NmczJfc2V0X2lub2RlX3NpemUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgdTY0IG5ld19pX3NpemUpOwogCitpbnQgb2NmczJfc2hvdWxkX3VwZGF0ZV9hdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQpOworaW50IG9jZnMyX3VwZGF0ZV9pbm9kZV9hdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKwogI2VuZGlmIC8qIE9DRlMyX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggMTZlOGU3NC4uNDJlMzYxZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC0zNjAsNyArMzYwLDYgQEAKIAkJCQkgIGlub2RlKTsKIAogCW9jZnMyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7Ci0JaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOwogCiAJc3RhdHVzID0gMDsKIGJhaWw6CkBAIC00NDEsNyArNDQwLDcgQEAKIAkJCQkgIGdlbmVyYXRpb24sIGlub2RlKTsKIAogCWlmIChjYW5fbG9jaykgewotCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIE5VTEwsIDApOworCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOwogCQlpZiAoc3RhdHVzKSB7CiAJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01MTIsNyArNTExLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgpCiB7CiAJaW50IHN0YXR1cyA9IDA7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7CiAKQEAgLTUyNCw3ICs1MjMsNyBAQAogCWlmICghZmUtPmlfY2x1c3RlcnMpCiAJCWdvdG8gYmFpbDsKIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTUzOCw3ICs1MzcsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAloYW5kbGUgPSBOVUxMOwogCiAJc3RhdHVzID0gb2NmczJfcHJlcGFyZV90cnVuY2F0ZShvc2IsIGlub2RlLCBmZV9iaCwgJnRjKTsKQEAgLTU1NCw3ICs1NTMsNyBAQAogCX0KIGJhaWw6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTY4LDcgKzU2Nyw3IEBACiAJaW50IHN0YXR1czsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZTsKKwloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZGlfYmgtPmJfZGF0YTsKIApAQCAtNTgyLDcgKzU4MSw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmaW5vZGVfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZV9hbGxvY19pbm9kZSwgTlVMTCwgJmlub2RlX2FsbG9jX2JoLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGVfYWxsb2NfaW5vZGUsICZpbm9kZV9hbGxvY19iaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZpbm9kZV9hbGxvY19pbm9kZS0+aV9tdXRleCk7CiAKQEAgLTU5MCw3ICs1ODksNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9ERUxFVEVfSU5PREVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9ERUxFVEVfSU5PREVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjI5LDcgKzYyOCw3IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAogYmFpbF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIGJhaWxfdW5sb2NrOgogCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlX2FsbG9jX2lub2RlLCAxKTsKIAltdXRleF91bmxvY2soJmlub2RlX2FsbG9jX2lub2RlLT5pX211dGV4KTsKQEAgLTcwNSw3ICs3MDQsNyBAQAogCSAqIGRlbGV0ZV9pbm9kZSBvcGVyYXRpb24uIFdlIGRvIHRoaXMgbm93IHRvIGF2b2lkIHJhY2VzIHdpdGgKIAkgKiByZWNvdmVyeSBjb21wbGV0aW9uIG9uIG90aGVyIG5vZGVzLiAqLwogCW11dGV4X2xvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhvcnBoYW5fZGlyX2lub2RlLCBOVUxMLCAmb3JwaGFuX2Rpcl9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsICZvcnBoYW5fZGlyX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltdXRleF91bmxvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwogCkBAIC05MzMsNyArOTMyLDcgQEAKIAkgKiBhbGxvY2F0aW9uIGxvY2sgaGVyZSBhcyBpdCB3b24ndCBiZSBuZWVkZWQgLSBub2JvZHkgd2lsbAogCSAqIGhhdmUgdGhlIGZpbGUgb3Blbi4KIAkgKi8KLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsICZkaV9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTEwNjcsMTIgKzEwNjYsNiBAQAogCW1sb2dfYnVnX29uX21zZyhvaS0+aXBfb3Blbl9jb3VudCwKIAkJCSJDbGVhciBpbm9kZSBvZiAlbGx1IGhhcyBvcGVuIGNvdW50ICVkXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sIG9pLT5pcF9vcGVuX2NvdW50KTsKLQltbG9nX2J1Z19vbl9tc2coIWxpc3RfZW1wdHkoJm9pLT5pcF9oYW5kbGVfbGlzdCksCi0JCQkiQ2xlYXIgaW5vZGUgb2YgJWxsdSBoYXMgbm9uIGVtcHR5IGhhbmRsZSBsaXN0XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8pOwotCW1sb2dfYnVnX29uX21zZyhvaS0+aXBfaGFuZGxlLAotCQkJIkNsZWFyIGlub2RlIG9mICVsbHUgaGFzIG5vbiBlbXB0eSBoYW5kbGUgcG9pbnRlclxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vKTsKIAogCS8qIENsZWFyIGFsbCBvdGhlciBmbGFncy4gKi8KIAlvaS0+aXBfZmxhZ3MgPSBPQ0ZTMl9JTk9ERV9DQUNIRV9JTkxJTkU7CkBAIC0xMTg2LDcgKzExNzksNyBAQAogCiAJLyogTGV0IG9jZnMyX21ldGFfbG9jayBkbyB0aGUgd29yayBvZiB1cGRhdGluZyBvdXIgc3RydWN0CiAJICogaW5vZGUgZm9yIHVzLiAqLwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgTlVMTCwgMCk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xMjA0LDcgKzExOTcsNyBAQAogICogc3RydWN0IGlub2RlLgogICogT25seSB0YWtlcyBpcF9sb2NrLgogICovCi1pbnQgb2NmczJfbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2lub2RlLmggYi9mcy9vY2ZzMi9pbm9kZS5oCmluZGV4IDk5NTc4MTAuLjQ2YTM3OGYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2lub2RlLmgKKysrIGIvZnMvb2NmczIvaW5vZGUuaApAQCAtNDgsMTMgKzQ4LDYgQEAKIAogCXN0cnVjdCBtdXRleAkJCWlwX2lvX211dGV4OwogCi0JLyogVXNlZCBieSB0aGUgam91cm5hbGxpbmcgY29kZSB0byBhdHRhY2ggYW4gaW5vZGUgdG8gYQotCSAqIGhhbmRsZS4gIFRoZXNlIGFyZSBwcm90ZWN0ZWQgYnkgaXBfaW9fbXV0ZXggaW4gb3JkZXIgdG8gbG9jawotCSAqIG91dCBvdGhlciBJL08gdG8gdGhlIGlub2RlIHVudGlsIHdlIGVpdGhlciBjb21taXQgb3IKLQkgKiBhYm9ydC4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQlpcF9oYW5kbGVfbGlzdDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUJKmlwX2hhbmRsZTsKLQogCXUzMgkJCQlpcF9mbGFnczsgLyogc2VlIGJlbG93ICovCiAJdTMyCQkJCWlwX2F0dHI7IC8qIGlub2RlIGF0dHJpYnV0ZXMgKi8KIApAQCAtMTQzLDcgKzEzNiw3IEBACiB2b2lkIG9jZnMyX3N5bmNfYmxvY2tkZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiB2b2lkIG9jZnMyX3JlZnJlc2hfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSk7Ci1pbnQgb2NmczJfbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBpbnQgb2NmczJfYWlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBraW9jYiAqcmVxLCBzdHJ1Y3QgaW9jYiAqaW9jYik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pb2N0bC5jIGIvZnMvb2NmczIvaW9jdGwuYwppbmRleCAzNjYzY2VmLi40NzY4YmU1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pb2N0bC5jCisrKyBiL2ZzL29jZnMyL2lvY3RsLmMKQEAgLTI2LDcgKzI2LDcgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCBOVUxMLCAwKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTQzLDE0ICs0MywxNCBAQAogewogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvY2ZzMl9pbm9kZSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAl1bnNpZ25lZCBvbGRmbGFnczsKIAlpbnQgc3RhdHVzOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAmYmgsIDEpOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmJoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTY3LDcgKzY3LDcgQEAKIAlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCWZsYWdzICY9IH5PQ0ZTMl9ESVJTWU5DX0ZMOwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtOTYsNyArOTYsNyBAQAogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogYmFpbF91bmxvY2s6CiAJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOwogYmFpbDoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCBmZDk3MzRkLi5jMGFkN2NiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC01Nyw5ICs1Nyw2IEBACiBzdGF0aWMgaW50IF9fb2NmczJfcmVjb3ZlcnlfdGhyZWFkKHZvaWQgKmFyZyk7CiBzdGF0aWMgaW50IG9jZnMyX2NvbW1pdF9jYWNoZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiBzdGF0aWMgaW50IG9jZnMyX3dhaXRfb25fbW91bnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwotc3RhdGljIHZvaWQgb2NmczJfaGFuZGxlX2NsZWFudXBfbG9ja3Moc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKTsKLXN0YXRpYyB2b2lkIG9jZnMyX2NvbW1pdF91bnN0YXJ0ZWRfaGFuZGxlKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKTsKIHN0YXRpYyBpbnQgb2NmczJfam91cm5hbF90b2dnbGVfZGlydHkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICAgaW50IGRpcnR5KTsKIHN0YXRpYyBpbnQgb2NmczJfdHJ5bG9ja19qb3VybmFsKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApAQCAtMTEzLDQ2ICsxMTAsMTggQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKm9jZnMyX2FsbG9jX2hhbmRsZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKLXsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKnJldHZhbCA9IE5VTEw7Ci0KLQlyZXR2YWwgPSBrY2FsbG9jKDEsIHNpemVvZigqcmV0dmFsKSwgR0ZQX05PRlMpOwotCWlmICghcmV0dmFsKSB7Ci0JCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsICIKLQkJICAgICAiaGFuZGxlIVxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHZhbC0+bWF4X2J1ZmZzID0gMDsKLQlyZXR2YWwtPm51bV9sb2NrcyA9IDA7Ci0JcmV0dmFsLT5rX2hhbmRsZSA9IE5VTEw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcmV0dmFsLT5sb2Nrcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJldHZhbC0+aW5vZGVfbGlzdCk7Ci0JcmV0dmFsLT5qb3VybmFsID0gb3NiLT5qb3VybmFsOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQogLyogcGFzcyBpdCBOVUxMIGFuZCBpdCB3aWxsIGFsbG9jYXRlIGEgbmV3IGhhbmRsZSBvYmplY3QgZm9yIHlvdS4gIElmCiAgKiB5b3UgcGFzcyBpdCBhIGhhbmRsZSBob3dldmVyLCBpdCBtYXkgc3RpbGwgcmV0dXJuIGVycm9yLCBpbiB3aGljaAogICogY2FzZSBpdCBoYXMgZnJlZSdkIHRoZSBwYXNzZWQgaGFuZGxlIGZvciB5b3UuICovCi1zdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKm9jZnMyX3N0YXJ0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCi0JCQkJCSAgICAgICBpbnQgbWF4X2J1ZmZzKQoraGFuZGxlX3QgKm9jZnMyX3N0YXJ0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBpbnQgbWF4X2J1ZmZzKQogewotCWludCByZXQ7CiAJam91cm5hbF90ICpqb3VybmFsID0gb3NiLT5qb3VybmFsLT5qX2pvdXJuYWw7Ci0KLQltbG9nX2VudHJ5KCIobWF4X2J1ZmZzID0gJWQpXG4iLCBtYXhfYnVmZnMpOworCWhhbmRsZV90ICpoYW5kbGU7CiAKIAlCVUdfT04oIW9zYiB8fCAhb3NiLT5qb3VybmFsLT5qX2pvdXJuYWwpOwogCi0JaWYgKG9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSkgewotCQlyZXQgPSAtRVJPRlM7Ci0JCWdvdG8gZG9uZV9mcmVlOwotCX0KKwlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOwogCiAJQlVHX09OKG9zYi0+am91cm5hbC0+al9zdGF0ZSA9PSBPQ0ZTMl9KT1VSTkFMX0ZSRUUpOwogCUJVR19PTihtYXhfYnVmZnMgPD0gMCk7CkBAIC0xNjMsMTU0ICsxMzIsMzkgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKCFoYW5kbGUpCi0JCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmICghaGFuZGxlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsICIKLQkJICAgICAiaGFuZGxlIVxuIik7Ci0JCWdvdG8gZG9uZV9mcmVlOwotCX0KLQotCWhhbmRsZS0+bWF4X2J1ZmZzID0gbWF4X2J1ZmZzOwotCiAJZG93bl9yZWFkKCZvc2ItPmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKLQkvKiBhY3R1YWxseSBzdGFydCB0aGUgdHJhbnNhY3Rpb24gbm93ICovCi0JaGFuZGxlLT5rX2hhbmRsZSA9IGpvdXJuYWxfc3RhcnQoam91cm5hbCwgbWF4X2J1ZmZzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZS0+a19oYW5kbGUpKSB7CisJaGFuZGxlID0gam91cm5hbF9zdGFydChqb3VybmFsLCBtYXhfYnVmZnMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQl1cF9yZWFkKCZvc2ItPmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUtPmtfaGFuZGxlKTsKLQkJaGFuZGxlLT5rX2hhbmRsZSA9IE5VTEw7Ci0JCW1sb2dfZXJybm8ocmV0KTsKKwkJbWxvZ19lcnJubyhQVFJfRVJSKGhhbmRsZSkpOwogCiAJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKIAkJCW9jZnMyX2Fib3J0KG9zYi0+c2IsICJEZXRlY3RlZCBhYm9ydGVkIGpvdXJuYWwiKTsKLQkJCXJldCA9IC1FUk9GUzsKKwkJCWhhbmRsZSA9IEVSUl9QVFIoLUVST0ZTKTsKIAkJfQotCQlnb3RvIGRvbmVfZnJlZTsKLQl9CisJfSBlbHNlCisJCWF0b21pY19pbmMoJihvc2ItPmpvdXJuYWwtPmpfbnVtX3RyYW5zKSk7CiAKLQlhdG9taWNfaW5jKCYob3NiLT5qb3VybmFsLT5qX251bV90cmFucykpOwotCWhhbmRsZS0+ZmxhZ3MgfD0gT0NGUzJfSEFORExFX1NUQVJURUQ7Ci0KLQltbG9nX2V4aXRfcHRyKGhhbmRsZSk7CiAJcmV0dXJuIGhhbmRsZTsKLQotZG9uZV9mcmVlOgotCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF91bnN0YXJ0ZWRfaGFuZGxlKGhhbmRsZSk7IC8qIHdpbGwga2ZyZWUgaGFuZGxlICovCi0KLQltbG9nX2V4aXQocmV0KTsKLQlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi12b2lkIG9jZnMyX2hhbmRsZV9hZGRfaW5vZGUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCi0JCQkgICAgc3RydWN0IGlub2RlICppbm9kZSkKK2ludCBvY2ZzMl9jb21taXRfdHJhbnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlKQogewotCUJVR19PTighaGFuZGxlKTsKLQlCVUdfT04oIWlub2RlKTsKLQotCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKLQotCS8qIHdlJ3JlIG9idmlvdXNseSBjaGFuZ2luZyBpdC4uLiAqLwotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQotCS8qIHNhbml0eSBjaGVjayAqLwotCUJVR19PTihPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJk9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGVfbGlzdCkpOwotCi0JT0NGUzJfSShpbm9kZSktPmlwX2hhbmRsZSA9IGhhbmRsZTsKLQlsaXN0X21vdmVfdGFpbCgmKE9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGVfbGlzdCksICYoaGFuZGxlLT5pbm9kZV9saXN0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jZnMyX2hhbmRsZV91bmxvY2tfaW5vZGVzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZoYW5kbGUtPmlub2RlX2xpc3QpIHsKLQkJb2kgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvLAotCQkJCWlwX2hhbmRsZV9saXN0KTsKLQkJaW5vZGUgPSAmb2ktPnZmc19pbm9kZTsKLQotCQlPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlID0gTlVMTDsKLQkJbGlzdF9kZWxfaW5pdCgmT0NGUzJfSShpbm9kZSktPmlwX2hhbmRsZV9saXN0KTsKLQotCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJaXB1dChpbm9kZSk7Ci0JfQotfQotCi0vKiBUaGlzIGlzIHRyaXZpYWwgc28gd2UgZG8gaXQgb3V0IG9mIHRoZSBtYWluIGNvbW1pdAotICogcGF0aHMuIEJld2FyZSwgaXQgY2FuIGJlIGNhbGxlZCBmcm9tIHN0YXJ0X3RyYW5zIHRvbyEgKi8KLXN0YXRpYyB2b2lkIG9jZnMyX2NvbW1pdF91bnN0YXJ0ZWRfaGFuZGxlKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKQotewotCW1sb2dfZW50cnlfdm9pZCgpOwotCi0JQlVHX09OKGhhbmRsZS0+ZmxhZ3MgJiBPQ0ZTMl9IQU5ETEVfU1RBUlRFRCk7Ci0KLQlvY2ZzMl9oYW5kbGVfdW5sb2NrX2lub2RlcyhoYW5kbGUpOwotCS8qIFlvdSBhcmUgYWxsb3dlZCB0byBhZGQgam91cm5hbCBsb2NrcyBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uCi0JICogaGFzIHN0YXJ0ZWQuICovCi0Jb2NmczJfaGFuZGxlX2NsZWFudXBfbG9ja3MoaGFuZGxlLT5qb3VybmFsLCBoYW5kbGUpOwotCi0Ja2ZyZWUoaGFuZGxlKTsKLQotCW1sb2dfZXhpdF92b2lkKCk7Ci19Ci0KLXZvaWQgb2NmczJfY29tbWl0X3RyYW5zKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKQotewotCWhhbmRsZV90ICpqYmRfaGFuZGxlOwotCWludCByZXR2YWw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwgPSBoYW5kbGUtPmpvdXJuYWw7Ci0KLQltbG9nX2VudHJ5X3ZvaWQoKTsKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsID0gb3NiLT5qb3VybmFsOwogCiAJQlVHX09OKCFoYW5kbGUpOwogCi0JaWYgKCEoaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKSkgewotCQlvY2ZzMl9jb21taXRfdW5zdGFydGVkX2hhbmRsZShoYW5kbGUpOwotCQltbG9nX2V4aXRfdm9pZCgpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogcmVsZWFzZSBpbm9kZSBzZW1hcGhvcmVzIHdlIHRvb2sgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24gKi8KLQlvY2ZzMl9oYW5kbGVfdW5sb2NrX2lub2RlcyhoYW5kbGUpOwotCi0JLyogb2NmczJfZXh0ZW5kX3RyYW5zIG1heSBoYXZlIGhhZCB0byBjYWxsIGpvdXJuYWxfcmVzdGFydAotCSAqIHdoaWNoIHdpbGwgYWx3YXlzIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24sIGJ1dCBtYXkgcmV0dXJuCi0JICogZXJyb3IgZm9yIGFueSBudW1iZXIgb2YgcmVhc29ucy4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgd2UKLQkgKiBjbGVhciBrX2hhbmRsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZS4gKi8KLQlpZiAoaGFuZGxlLT5rX2hhbmRsZSkgewotCQlqYmRfaGFuZGxlID0gaGFuZGxlLT5rX2hhbmRsZTsKLQotCQlpZiAoaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TWU5DKQotCQkJamJkX2hhbmRsZS0+aF9zeW5jID0gMTsKLQkJZWxzZQotCQkJamJkX2hhbmRsZS0+aF9zeW5jID0gMDsKLQotCQkvKiBhY3R1YWxseSBzdG9wIHRoZSB0cmFuc2FjdGlvbi4gaWYgd2UndmUgc2V0IGhfc3luYywKLQkJICogaXQnbGwgaGF2ZSBiZWVuIGNvbW1pdHRlZCB3aGVuIHdlIHJldHVybiAqLwotCQlyZXR2YWwgPSBqb3VybmFsX3N0b3AoamJkX2hhbmRsZSk7Ci0JCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldHZhbCk7Ci0JCQltbG9nKE1MX0VSUk9SLCAiQ291bGQgbm90IGNvbW1pdCB0cmFuc2FjdGlvblxuIik7Ci0JCQlCVUcoKTsKLQkJfQotCi0JCWhhbmRsZS0+a19oYW5kbGUgPSBOVUxMOyAvKiBpdCdzIGJlZW4gZnJlZSdkIGluIGpvdXJuYWxfc3RvcCAqLwotCX0KLQotCW9jZnMyX2hhbmRsZV9jbGVhbnVwX2xvY2tzKGpvdXJuYWwsIGhhbmRsZSk7CisJcmV0ID0gam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKIAogCXVwX3JlYWQoJmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKLQlrZnJlZShoYW5kbGUpOwotCW1sb2dfZXhpdF92b2lkKCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTMyNiwyMCArMTgwLDE4IEBACiAgKiBnb29kIGJlY2F1c2UgdHJhbnNhY3Rpb24gaWRzIGhhdmVuJ3QgeWV0IGJlZW4gcmVjb3JkZWQgb24gdGhlCiAgKiBjbHVzdGVyIGxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhhbmRsZS4KICAqLwotaW50IG9jZnMyX2V4dGVuZF90cmFucyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJICAgICAgIGludCBuYmxvY2tzKQoraW50IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmJsb2NrcykKIHsKIAlpbnQgc3RhdHVzOwogCiAJQlVHX09OKCFoYW5kbGUpOwotCUJVR19PTighKGhhbmRsZS0+ZmxhZ3MgJiBPQ0ZTMl9IQU5ETEVfU1RBUlRFRCkpOwogCUJVR19PTighbmJsb2Nrcyk7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAogCW1sb2coMCwgIlRyeWluZyB0byBleHRlbmQgdHJhbnNhY3Rpb24gYnkgJWQgYmxvY2tzXG4iLCBuYmxvY2tzKTsKIAotCXN0YXR1cyA9IGpvdXJuYWxfZXh0ZW5kKGhhbmRsZS0+a19oYW5kbGUsIG5ibG9ja3MpOworCXN0YXR1cyA9IGpvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgbmJsb2Nrcyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0zNDcsMTUgKzE5OSwxMiBAQAogCiAJaWYgKHN0YXR1cyA+IDApIHsKIAkJbWxvZygwLCAiam91cm5hbF9leHRlbmQgZmFpbGVkLCB0cnlpbmcgam91cm5hbF9yZXN0YXJ0XG4iKTsKLQkJc3RhdHVzID0gam91cm5hbF9yZXN0YXJ0KGhhbmRsZS0+a19oYW5kbGUsIG5ibG9ja3MpOworCQlzdGF0dXMgPSBqb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBuYmxvY2tzKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWhhbmRsZS0+a19oYW5kbGUgPSBOVUxMOwogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9Ci0JCWhhbmRsZS0+bWF4X2J1ZmZzID0gbmJsb2NrczsKLQl9IGVsc2UKLQkJaGFuZGxlLT5tYXhfYnVmZnMgKz0gbmJsb2NrczsKKwl9CiAKIAlzdGF0dXMgPSAwOwogYmFpbDoKQEAgLTM2NCw3ICsyMTMsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCBvY2ZzMl9qb3VybmFsX2FjY2VzcyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCSBpbnQgdHlwZSkKQEAgLTM3NCw3ICsyMjMsNiBAQAogCUJVR19PTighaW5vZGUpOwogCUJVR19PTighaGFuZGxlKTsKIAlCVUdfT04oIWJoKTsKLQlCVUdfT04oIShoYW5kbGUtPmZsYWdzICYgT0NGUzJfSEFORExFX1NUQVJURUQpKTsKIAogCW1sb2dfZW50cnkoImJoLT5iX2Jsb2NrbnI9JWxsdSwgdHlwZT0lZCAoXCIlc1wiKSwgYmgtPmJfc2l6ZSA9ICV6dVxuIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCB0eXBlLApAQCAtNDAzLDExICsyNTEsMTEgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURToKIAljYXNlIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFOgotCQlzdGF0dXMgPSBqb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLT5rX2hhbmRsZSwgYmgpOworCQlzdGF0dXMgPSBqb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CiAJCWJyZWFrOwogCiAJY2FzZSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19VTkRPOgotCQlzdGF0dXMgPSBqb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUtPmtfaGFuZGxlLCBiaCk7CisJCXN0YXR1cyA9IGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYmgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MjQsMTcgKzI3MiwxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCBvY2ZzMl9qb3VybmFsX2RpcnR5KHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CiAJaW50IHN0YXR1czsKIAotCUJVR19PTighKGhhbmRsZS0+ZmxhZ3MgJiBPQ0ZTMl9IQU5ETEVfU1RBUlRFRCkpOwotCiAJbWxvZ19lbnRyeSgiKGJoLT5iX2Jsb2NrbnI9JWxsdSlcbiIsCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CiAKLQlzdGF0dXMgPSBqb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZS0+a19oYW5kbGUsIGJoKTsKKwlzdGF0dXMgPSBqb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nKE1MX0VSUk9SLCAiQ291bGQgbm90IGRpcnR5IG1ldGFkYXRhIGJ1ZmZlci4gIgogCQkgICAgICIoYmgtPmJfYmxvY2tucj0lbGx1KVxuIiwKQEAgLTQ1Niw1OSArMzAyLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBXZSBhbHdheXMgYXNzdW1lIHlvdSdyZSBhZGRpbmcgYSBtZXRhZGF0YSBsb2NrIGF0IGxldmVsICdleCcgKi8KLWludCBvY2ZzMl9oYW5kbGVfYWRkX2xvY2soc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCi0JCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9sb2NrICpsb2NrOwotCi0JQlVHX09OKCFpbm9kZSk7Ci0KLQlsb2NrID0ga21lbV9jYWNoZV9hbGxvYyhvY2ZzMl9sb2NrX2NhY2hlLCBHRlBfTk9GUyk7Ci0JaWYgKCFsb2NrKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oLUVOT01FTSk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQlpZiAoIWlncmFiKGlub2RlKSkKLQkJQlVHKCk7Ci0JbG9jay0+amxfaW5vZGUgPSBpbm9kZTsKLQotCWxpc3RfYWRkX3RhaWwoJihsb2NrLT5qbF9sb2NrX2xpc3QpLCAmKGhhbmRsZS0+bG9ja3MpKTsKLQloYW5kbGUtPm51bV9sb2NrcysrOwotCi0Jc3RhdHVzID0gMDsKLWJhaWw6Ci0JbWxvZ19leGl0KHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgb2NmczJfaGFuZGxlX2NsZWFudXBfbG9ja3Moc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2xvY2sgKmxvY2s7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmKGhhbmRsZS0+bG9ja3MpKSB7Ci0JCWxvY2sgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2xvY2ssCi0JCQkJICBqbF9sb2NrX2xpc3QpOwotCQlsaXN0X2RlbCgmbG9jay0+amxfbG9ja19saXN0KTsKLQkJaGFuZGxlLT5udW1fbG9ja3MtLTsKLQotCQlpbm9kZSA9IGxvY2stPmpsX2lub2RlOwotCQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7Ci0JCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpID09IDEpCi0JCQltbG9nKE1MX0VSUk9SLAotCQkJICAgICAiSW5vZGUgJWxsdSwgSSdtIGRvaW5nIGEgbGFzdCBpcHV0IGZvciEiLAotCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7Ci0JCWlwdXQoaW5vZGUpOwotCQlrbWVtX2NhY2hlX2ZyZWUob2NmczJfbG9ja19jYWNoZSwgbG9jayk7Ci0JfQotfQotCiAjZGVmaW5lIE9DRlMyX0RFRkFVTFRfQ09NTUlUX0lOVEVSVkFMIAkoSFogKiA1KQogCiB2b2lkIG9jZnMyX3NldF9qb3VybmFsX3BhcmFtcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKQEAgLTU2Miw4ICszNTUsNyBAQAogCS8qIFNraXAgcmVjb3Zlcnkgd2FpdHMgaGVyZSAtIGpvdXJuYWwgaW5vZGUgbWV0YWRhdGEgbmV2ZXIKIAkgKiBjaGFuZ2VzIGluIGEgbGl2ZSBjbHVzdGVyIHNvIGl0IGNhbiBiZSBjb25zaWRlcmVkIGFuCiAJICogZXhjZXB0aW9uIHRvIHRoZSBydWxlLiAqLwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9ja19mdWxsKGlub2RlLCBOVUxMLCAmYmgsIDEsCi0JCQkJICAgICAgT0NGUzJfTUVUQV9MT0NLX1JFQ09WRVJZKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2tfZnVsbChpbm9kZSwgJmJoLCAxLCBPQ0ZTMl9NRVRBX0xPQ0tfUkVDT1ZFUlkpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVSRVNUQVJUU1lTKQogCQkJbWxvZyhNTF9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgbG9jayBvbiBqb3VybmFsIVxuIik7CkBAIC0xMTYwLDggKzk1Miw3IEBACiAJfQogCVNFVF9JTk9ERV9KT1VSTkFMKGlub2RlKTsKIAotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9ja19mdWxsKGlub2RlLCBOVUxMLCAmYmgsIDEsCi0JCQkJICAgICAgT0NGUzJfTUVUQV9MT0NLX1JFQ09WRVJZKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2tfZnVsbChpbm9kZSwgJmJoLCAxLCBPQ0ZTMl9NRVRBX0xPQ0tfUkVDT1ZFUlkpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2coMCwgInN0YXR1cyByZXR1cm5lZCBmcm9tIG9jZnMyX21ldGFfbG9jaz0lZFxuIiwgc3RhdHVzKTsKIAkJaWYgKHN0YXR1cyAhPSAtRVJFU1RBUlRTWVMpCkBAIC0xMzUwLDcgKzExNDEsNyBAQAogCVNFVF9JTk9ERV9KT1VSTkFMKGlub2RlKTsKIAogCWZsYWdzID0gT0NGUzJfTUVUQV9MT0NLX1JFQ09WRVJZIHwgT0NGUzJfTUVUQV9MT0NLX05PUVVFVUU7Ci0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrX2Z1bGwoaW5vZGUsIE5VTEwsIE5VTEwsIDEsIGZsYWdzKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2tfZnVsbChpbm9kZSwgTlVMTCwgMSwgZmxhZ3MpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVBR0FJTikKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTE0MzMsNyArMTIyNCw3IEBACiAJfQkKIAogCW11dGV4X2xvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhvcnBoYW5fZGlyX2lub2RlLCBOVUxMLCBOVUxMLCAwKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2sob3JwaGFuX2Rpcl9pbm9kZSwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuaCBiL2ZzL29jZnMyL2pvdXJuYWwuaAppbmRleCAyZjNhNmFjLi5kODZjYjk2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmgKKysrIGIvZnMvb2NmczIvam91cm5hbC5oCkBAIC0zNyw3ICszNyw2IEBACiAKIHN0cnVjdCBvY2ZzMl9zdXBlcjsKIHN0cnVjdCBvY2ZzMl9kaW5vZGU7Ci1zdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGU7CiAKIHN0cnVjdCBvY2ZzMl9qb3VybmFsIHsKIAllbnVtIG9jZnMyX2pvdXJuYWxfc3RhdGUgICBqX3N0YXRlOyAgICAvKiBKb3VybmFscyBjdXJyZW50IHN0YXRlICAgKi8KQEAgLTEzMyw0NCArMTMyLDYgQEAKIAlzcGluX3VubG9jaygmdHJhbnNfaW5jX2xvY2spOwogfQogCi1leHRlcm4ga21lbV9jYWNoZV90ICpvY2ZzMl9sb2NrX2NhY2hlOwotCi1zdHJ1Y3Qgb2NmczJfam91cm5hbF9sb2NrIHsKLQlzdHJ1Y3QgaW5vZGUgICAgICpqbF9pbm9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICBqbF9sb2NrX2xpc3Q7Ci19OwotCi1zdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgewotCWhhbmRsZV90ICAgICAgICAgICAgKmtfaGFuZGxlOyAvKiBrZXJuZWwgaGFuZGxlLiAgICAgICAgICAgICAgICAqLwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsICAgICAgICAqam91cm5hbDsKLQl1MzIgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgLyogc2VlIGZsYWdzIGJlbG93LiAgICAgICAgICAgICAgKi8KLQlpbnQgICAgICAgICAgICAgICAgIG1heF9idWZmczsgLyogQnVmZnMgcmVzZXJ2ZWQgYnkgdGhpcyBoYW5kbGUgKi8KLQotCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBhcmUgZm9yIG9jZnMyX2hhbmRsZV9hZGRfbG9jayAqLwotCWludCAgICAgICAgICAgICAgICAgbnVtX2xvY2tzOwotCXN0cnVjdCBsaXN0X2hlYWQgICAgbG9ja3M7ICAgICAvKiBBIGJ1bmNoIG9mIGxvY2tzIHRvCi0JCQkJCSogcmVsZWFzZSBvbiBjb21taXQuIFRoaXMKLQkJCQkJKiBzaG91bGQgYmUgYSBsaXN0X2hlYWQgKi8KLQotCXN0cnVjdCBsaXN0X2hlYWQgICAgIGlub2RlX2xpc3Q7Ci19OwotCi0jZGVmaW5lIE9DRlMyX0hBTkRMRV9TVEFSVEVECQkJMQotLyogc2hvdWxkIHdlIHN5bmMtY29tbWl0IHRoaXMgaGFuZGxlPyAqLwotI2RlZmluZSBPQ0ZTMl9IQU5ETEVfU1lOQwkJCTIKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2hhbmRsZV9zdGFydGVkKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKQotewotCXJldHVybiBoYW5kbGUtPmZsYWdzICYgT0NGUzJfSEFORExFX1NUQVJURUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9oYW5kbGVfc2V0X3N5bmMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsIGludCBzeW5jKQotewotCWlmIChzeW5jKQotCQloYW5kbGUtPmZsYWdzIHw9IE9DRlMyX0hBTkRMRV9TWU5DOwotCWVsc2UKLQkJaGFuZGxlLT5mbGFncyAmPSB+T0NGUzJfSEFORExFX1NZTkM7Ci19Ci0KIC8qIEV4cG9ydGVkIG9ubHkgZm9yIHRoZSBqb3VybmFsIHN0cnVjdCBpbml0IGNvZGUgaW4gc3VwZXIuYy4gRG8gbm90IGNhbGwuICovCiB2b2lkIG9jZnMyX2NvbXBsZXRlX3JlY292ZXJ5KHZvaWQgKmRhdGEpOwogCkBAIC0yMzEsMTUgKzE5MiwxNCBAQAogICogIFRyYW5zYWN0aW9uIEhhbmRsaW5nOgogICogIE1hbmFnZSB0aGUgbGlmZXRpbWUgb2YgYSB0cmFuc2FjdGlvbiBoYW5kbGUuCiAgKgotICogIG9jZnMyX2FsbG9jX2hhbmRsZSAgICAgLSBPbmx5IGFsbG9jYXRlIGEgaGFuZGxlIHNvIHdlIGNhbiBzdGFydCBwdXR0aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciBsb2NrcyBvbiBpdC4gVG8gYWN0dWFsbHkgY2hhbmdlIGJsb2NrcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIG9jZnMyX3N0YXJ0X3RyYW5zIHdpdGggdGhlIGhhbmRsZSByZXR1cm5lZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhpcyBmdW5jdGlvbi4gWW91IG1heSBjYWxsIG9jZnMyX2NvbW1pdF90cmFucwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBhbnkgdGltZSBpbiB0aGUgbGlmZXRpbWUgb2YgYSBoYW5kbGUuCiAgKiAgb2NmczJfc3RhcnRfdHJhbnMgICAgICAtIEJlZ2luIGEgdHJhbnNhY3Rpb24uIEdpdmUgaXQgYW4gdXBwZXIgZXN0aW1hdGUgb2YKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHdpbGwgYmUgY2hhbmdlZCBkdXJpbmcKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGhhbmRsZS4KLSAqICBvY2ZzMl9jb21taXRfdHJhbnMgICAgIC0gQ29tcGxldGUgYSBoYW5kbGUuCisgKiAgb2NmczJfY29tbWl0X3RyYW5zIC0gQ29tcGxldGUgYSBoYW5kbGUuIEl0IG1pZ2h0IHJldHVybiAtRUlPIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGpvdXJuYWwgd2FzIGFib3J0ZWQuIFRoZSBtYWpvcml0eSBvZiBwYXRocyBkb24ndAorICogICAgICAgICAgICAgICAgICAgICAgIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYXMgYW4gZXJyb3IgdGhlcmUgY29tZXMgdG9vCisgKiAgICAgICAgICAgICAgICAgICAgICAgbGF0ZSB0byBkbyBhbnl0aGluZyAoYW5kIHdpbGwgYmUgcGlja2VkIHVwIGluIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICBsYXRlciB0cmFuc2FjdGlvbikuCiAgKiAgb2NmczJfZXh0ZW5kX3RyYW5zICAgICAtIEV4dGVuZCBhIGhhbmRsZSBieSBuYmxvY2tzIGNyZWRpdHMuIFRoaXMgbWF5CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0IHRoZSBoYW5kbGUgdG8gZGlzayBpbiB0aGUgcHJvY2VzcywgYnV0IHdpbGwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmVsZWFzZSBhbnkgbG9ja3MgdGFrZW4gZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi4KQEAgLTI0OSwyNCArMjA5LDE2IEBACiAgKiAgb2NmczJfam91cm5hbF9kaXJ0eSAgICAtIE1hcmsgYSBqb3VybmFsbGVkIGJ1ZmZlciBhcyBoYXZpbmcgZGlydHkgZGF0YS4KICAqICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEgLSBJbmRpY2F0ZSB0aGF0IGEgZGF0YSBidWZmZXIgc2hvdWxkIGdvIG91dCBiZWZvcmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBoYW5kbGUgY29tbWl0cy4KLSAqICBvY2ZzMl9oYW5kbGVfYWRkX2xvY2sgIC0gU29tZXRpbWVzIHdlIG5lZWQgdG8gZGVsYXkgbG9jayByZWxlYXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuIFVzZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9jZnMyX2hhbmRsZV9hZGRfbG9jayB0byBpbmRpY2F0ZSB0aGF0IGEgbG9jayBuZWVkcwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbGVhc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBoYW5kbGUuIExvY2tzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWxlYXNlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBhZGRlZC4KLSAqICBvY2ZzMl9oYW5kbGVfYWRkX2lub2RlIC0gQWRkIGEgbG9ja2VkIGlub2RlIHRvIGEgdHJhbnNhY3Rpb24uCiAgKi8KIAogLyogWW91IG11c3QgYWx3YXlzIHN0YXJ0X3RyYW5zIHdpdGggYSBudW1iZXIgb2YgYnVmZnMgPiAwLCBidXQgaXQncwogICogcGVyZmVjdGx5IGxlZ2FsIHRvIGdvIHRocm91Z2ggYW4gZW50aXJlIHRyYW5zYWN0aW9uIHdpdGhvdXQgaGF2aW5nCiAgKiBkaXJ0aWVkIGFueSBidWZmZXJzLiAqLwotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9hbGxvY19oYW5kbGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9zdGFydF90cmFucyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraGFuZGxlX3QJCSAgICAqb2NmczJfc3RhcnRfdHJhbnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSAgICAgICBpbnQgbWF4X2J1ZmZzKTsKLXZvaWQJCQkgICAgIG9jZnMyX2NvbW1pdF90cmFucyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSk7Ci1pbnQJCQkgICAgIG9jZnMyX2V4dGVuZF90cmFucyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCQkJCWludCBuYmxvY2tzKTsKK2ludAkJCSAgICAgb2NmczJfY29tbWl0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCQkJaGFuZGxlX3QgKmhhbmRsZSk7CitpbnQJCQkgICAgIG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmJsb2Nrcyk7CiAKIC8qCiAgKiBDcmVhdGUgYWNjZXNzIGlzIGZvciB3aGVuIHdlIGdldCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIGFuZCB3ZSdyZQpAQCAtMjgzLDcgKzIzNSw3IEBACiAjZGVmaW5lIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFICAxCiAjZGVmaW5lIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1VORE8gICAyCiAKLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfYWNjZXNzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50ICAgICAgICAgICAgICAgICAgb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkJCSAgaW50IHR5cGUpOwpAQCAtMzA2LDE4ICsyNTgsMTAgQEAKICAqCTxtb2RpZnkgdGhlIGJoPgogICogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CiAgKi8KLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHkoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgICAgICAgICAgICAgICAgICBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIGludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2hhbmRsZV9hZGRfbG9jayhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSk7Ci0vKgotICogVXNlIHRoaXMgdG8gcHJvdGVjdCBmcm9tIG90aGVyIHByb2Nlc3NlcyByZWFkaW5nIGJ1ZmZlciBzdGF0ZSB3aGlsZQotICogaXQncyBpbiBmbGlnaHQuCi0gKi8KLXZvaWQgICAgICAgICAgICAgICAgIG9jZnMyX2hhbmRsZV9hZGRfaW5vZGUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCi0JCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogLyoKICAqICBDcmVkaXQgTWFjcm9zOgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5jCmluZGV4IDFmMTdhNGQuLjY5OGQ3OWEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuYworKysgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKQEAgLTU4LDE5ICs1OCwxOCBAQAogc3RhdGljIHZvaWQgb2NmczJfY2xlYXJfbG9jYWxfYWxsb2Moc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MpOwogCiBzdGF0aWMgaW50IG9jZnMyX3N5bmNfbG9jYWxfdG9fbWFpbihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmFsbG9jLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKm1haW5fYm1faW5vZGUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbWFpbl9ibV9iaCk7CiAKIHN0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2NfcmVzZXJ2ZV9mb3Jfd2luZG93KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjLAogCQkJCQkJc3RydWN0IGlub2RlICoqYml0bWFwX2lub2RlLAogCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYml0bWFwX2JoKTsKIAogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19uZXdfd2luZG93KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKTsKIAogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19zbGlkZV93aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCkBAIC0xOTYsNyArMTk1LDcgQEAKIHZvaWQgb2NmczJfc2h1dGRvd25fbG9jYWxfYWxsb2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKmxvY2FsX2FsbG9jX2lub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1haW5fYm1fYmggPSBOVUxMOwpAQCAtMjA3LDcgKzIwNiw3IEBACiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKIAlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9VTlVTRUQpCi0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAKIAlsb2NhbF9hbGxvY19pbm9kZSA9CiAJCW9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCkBAIC0yMTYsNDAgKzIxNSwzNCBAQAogCWlmICghbG9jYWxfYWxsb2NfaW5vZGUpIHsKIAkJc3RhdHVzID0gLUVOT0VOVDsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCX0KIAogCW9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPSBPQ0ZTMl9MQV9ESVNBQkxFRDsKIAotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmICghaGFuZGxlKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQogCW1haW5fYm1faW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLAogCQkJCQkJICAgIEdMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFLAogCQkJCQkJICAgIE9DRlMyX0lOVkFMSURfU0xPVCk7CiAJaWYgKCFtYWluX2JtX2lub2RlKSB7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dDsKIAl9CiAKLQlvY2ZzMl9oYW5kbGVfYWRkX2lub2RlKGhhbmRsZSwgbWFpbl9ibV9pbm9kZSk7Ci0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG1haW5fYm1faW5vZGUsIGhhbmRsZSwgJm1haW5fYm1fYmgsIDEpOworCW11dGV4X2xvY2soJm1haW5fYm1faW5vZGUtPmlfbXV0ZXgpOworCisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG1haW5fYm1faW5vZGUsICZtYWluX2JtX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfbXV0ZXg7CiAJfQogCiAJLyogV0lORE9XX01PVkVfQ1JFRElUUyBpcyBhIGJpdCBoZWF2eS4uLiAqLwotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9XSU5ET1dfTU9WRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQltbG9nX2Vycm5vKFBUUl9FUlIoaGFuZGxlKSk7CiAJCWhhbmRsZSA9IE5VTEw7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWJoID0gb3NiLT5sb2NhbF9hbGxvY19iaDsKQEAgLTI1OCw3ICsyNTEsNyBAQAogCWFsbG9jX2NvcHkgPSBrbWFsbG9jKGJoLT5iX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYWxsb2NfY29weSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X2NvbW1pdDsKIAl9CiAJbWVtY3B5KGFsbG9jX2NvcHksIGFsbG9jLCBiaC0+Yl9zaXplKTsKIApAQCAtMjY2LDcgKzI1OSw3IEBACiAJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCiAJb2NmczJfY2xlYXJfbG9jYWxfYWxsb2MoYWxsb2MpOwpAQCAtMjc0LDcgKzI2Nyw3IEBACiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfY29tbWl0OwogCX0KIAogCWJyZWxzZShiaCk7CkBAIC0yODYsMTYgKzI3OSwyMCBAQAogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLWJhaWw6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKK291dF91bmxvY2s6CiAJaWYgKG1haW5fYm1fYmgpCiAJCWJyZWxzZShtYWluX2JtX2JoKTsKIAotCWlmIChtYWluX2JtX2lub2RlKQotCQlpcHV0KG1haW5fYm1faW5vZGUpOworCW9jZnMyX21ldGFfdW5sb2NrKG1haW5fYm1faW5vZGUsIDEpOwogCitvdXRfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZtYWluX2JtX2lub2RlLT5pX211dGV4KTsKKwlpcHV0KG1haW5fYm1faW5vZGUpOworCitvdXQ6CiAJaWYgKGxvY2FsX2FsbG9jX2lub2RlKQogCQlpcHV0KGxvY2FsX2FsbG9jX2lub2RlKTsKIApAQCAtMzg1LDYxICszODIsNTkgQEAKIAkJCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1haW5fYm1fYmggPSBOVUxMOwotCXN0cnVjdCBpbm9kZSAqbWFpbl9ibV9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGlub2RlICptYWluX2JtX2lub2RlOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoIWhhbmRsZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAltYWluX2JtX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKIAkJCQkJCSAgICBHTE9CQUxfQklUTUFQX1NZU1RFTV9JTk9ERSwKIAkJCQkJCSAgICBPQ0ZTMl9JTlZBTElEX1NMT1QpOwogCWlmICghbWFpbl9ibV9pbm9kZSkgewogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAJfQogCi0Jb2NmczJfaGFuZGxlX2FkZF9pbm9kZShoYW5kbGUsIG1haW5fYm1faW5vZGUpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhtYWluX2JtX2lub2RlLCBoYW5kbGUsICZtYWluX2JtX2JoLCAxKTsKKwltdXRleF9sb2NrKCZtYWluX2JtX2lub2RlLT5pX211dGV4KTsKKworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhtYWluX2JtX2lub2RlLCAmbWFpbl9ibV9iaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X211dGV4OwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9XSU5ET1dfTU9WRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJLyogd2Ugd2FudCB0aGUgYml0bWFwIGNoYW5nZSB0byBiZSByZWNvcmRlZCBvbiBkaXNrIGFzYXAgKi8KLQlvY2ZzMl9oYW5kbGVfc2V0X3N5bmMoaGFuZGxlLCAxKTsKKwloYW5kbGUtPmhfc3luYyA9IDE7CiAKIAlzdGF0dXMgPSBvY2ZzMl9zeW5jX2xvY2FsX3RvX21haW4ob3NiLCBoYW5kbGUsIGFsbG9jLAogCQkJCQkgIG1haW5fYm1faW5vZGUsIG1haW5fYm1fYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLWJhaWw6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworb3V0X3VubG9jazoKKwlvY2ZzMl9tZXRhX3VubG9jayhtYWluX2JtX2lub2RlLCAxKTsKKworb3V0X211dGV4OgorCW11dGV4X3VubG9jaygmbWFpbl9ibV9pbm9kZS0+aV9tdXRleCk7CiAKIAlpZiAobWFpbl9ibV9iaCkKIAkJYnJlbHNlKG1haW5fYm1fYmgpOwogCi0JaWYgKG1haW5fYm1faW5vZGUpCi0JCWlwdXQobWFpbl9ibV9pbm9kZSk7CisJaXB1dChtYWluX2JtX2lub2RlKTsKIAorb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00NTIsNyArNDQ3LDYgQEAKICAqIG91ciBvd24gaW4gb3JkZXIgdG8gc2hpZnQgd2luZG93cy4KICAqLwogaW50IG9jZnMyX3Jlc2VydmVfbG9jYWxfYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKnBhc3NlZF9oYW5kbGUsCiAJCQkJICAgdTMyIGJpdHNfd2FudGVkLAogCQkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKIHsKQEAgLTQ2Myw5ICs0NTcsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlCVUdfT04oIXBhc3NlZF9oYW5kbGUpOwogCUJVR19PTighYWMpOwotCUJVR19PTihwYXNzZWRfaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKTsKIAogCWxvY2FsX2FsbG9jX2lub2RlID0KIAkJb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKQEAgLTQ3Niw3ICs0NjgsMTEgQEAKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQotCW9jZnMyX2hhbmRsZV9hZGRfaW5vZGUocGFzc2VkX2hhbmRsZSwgbG9jYWxfYWxsb2NfaW5vZGUpOworCisJbXV0ZXhfbG9jaygmbG9jYWxfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCisJYWMtPmFjX2lub2RlID0gbG9jYWxfYWxsb2NfaW5vZGU7CisJYWMtPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX0xPQ0FMOwogCiAJaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgIT0gT0NGUzJfTEFfRU5BQkxFRCkgewogCQlzdGF0dXMgPSAtRU5PU1BDOwpAQCAtNTE1LDIxICs1MTEsMTcgQEAKIAkJfQogCX0KIAotCWFjLT5hY19pbm9kZSA9IGlncmFiKGxvY2FsX2FsbG9jX2lub2RlKTsKIAlnZXRfYmgob3NiLT5sb2NhbF9hbGxvY19iaCk7CiAJYWMtPmFjX2JoID0gb3NiLT5sb2NhbF9hbGxvY19iaDsKLQlhYy0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfTE9DQUw7CiAJc3RhdHVzID0gMDsKIGJhaWw6Ci0JaWYgKGxvY2FsX2FsbG9jX2lub2RlKQotCQlpcHV0KGxvY2FsX2FsbG9jX2lub2RlKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIGludCBvY2ZzMl9jbGFpbV9sb2NhbF9hbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJCSB1MzIgbWluX2JpdHMsCiAJCQkJIHUzMiAqYml0X29mZiwKQEAgLTcwNyw3ICs2OTksNyBAQAogICogcGFzc2VkIGlzIHVzZWQgZm9yIGNhY2hpbmcuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfc3luY19sb2NhbF90b19tYWluKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqbWFpbl9ibV9pbm9kZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICptYWluX2JtX2JoKQpAQCAtNzc4LDcgKzc3MCw2IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2NfcmVzZXJ2ZV9mb3Jfd2luZG93KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjLAogCQkJCQkJc3RydWN0IGlub2RlICoqYml0bWFwX2lub2RlLAogCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYml0bWFwX2JoKQpAQCAtNzkyLDcgKzc4Myw2IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQkoKmFjKS0+YWNfaGFuZGxlID0gaGFuZGxlOwogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2xvY2FsX2FsbG9jX3dpbmRvd19iaXRzKG9zYik7CiAKIAlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJfYml0bWFwX2JpdHMob3NiLCAqYWMpOwpAQCAtODIxLDcgKzgxMSw3IEBACiAgKiBwYXNzIGl0IHRoZSBiaXRtYXAgbG9jayBpbiBsb2NrX2JoIGlmIHlvdSBoYXZlIGl0LgogICovCiBzdGF0aWMgaW50IG9jZnMyX2xvY2FsX2FsbG9jX25ld193aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpCiB7CiAJaW50IHN0YXR1cyA9IDA7CkBAIC04ODgsMjMgKzg3OCwxNSBAQAogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFpbl9ibV9iaCA9IE5VTEw7CiAJc3RydWN0IGlub2RlICptYWluX2JtX2lub2RlID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2M7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2NfY29weSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjID0gTlVMTDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKCFoYW5kbGUpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQotCiAJLyogVGhpcyB3aWxsIGxvY2sgdGhlIG1haW4gYml0bWFwIGZvciB1cy4gKi8KIAlzdGF0dXMgPSBvY2ZzMl9sb2NhbF9hbGxvY19yZXNlcnZlX2Zvcl93aW5kb3cob3NiLAotCQkJCQkJICAgICAgaGFuZGxlLAogCQkJCQkJICAgICAgJmFjLAogCQkJCQkJICAgICAgJm1haW5fYm1faW5vZGUsCiAJCQkJCQkgICAgICAmbWFpbl9ibV9iaCk7CkBAIC05MTQsNyArODk2LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9XSU5ET1dfTU9WRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC05NzIsNyArOTU0LDcgQEAKIAlzdGF0dXMgPSAwOwogYmFpbDoKIAlpZiAoaGFuZGxlKQotCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogCWlmIChtYWluX2JtX2JoKQogCQlicmVsc2UobWFpbl9ibV9iaCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmggYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmgKaW5kZXggMzBmODhjZS4uMzg1YTEwMSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9jYWxhbGxvYy5oCisrKyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuaApAQCAtNDIsMTIgKzQyLDExIEBACiAKIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0OwogaW50IG9jZnMyX3Jlc2VydmVfbG9jYWxfYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKnBhc3NlZF9oYW5kbGUsCiAJCQkJICAgdTMyIGJpdHNfd2FudGVkLAogCQkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYyk7CiAKIGludCBvY2ZzMl9jbGFpbV9sb2NhbF9hbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJCSB1MzIgbWluX2JpdHMsCiAJCQkJIHUzMiAqYml0X29mZiwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL21tYXAuYyBiL2ZzL29jZnMyL21tYXAuYwppbmRleCA4MzkzNGUzLi42OWY4NWFlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9tbWFwLmMKKysrIGIvZnMvb2NmczIvbW1hcC5jCkBAIC04Miw2ICs4Miw4IEBACiAKIGludCBvY2ZzMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKKwlpbnQgcmV0ID0gMCwgbG9ja19sZXZlbCA9IDA7CisKIAkvKiBXZSBkb24ndCB3YW50IHRvIHN1cHBvcnQgc2hhcmVkIHdyaXRhYmxlIG1hcHBpbmdzIHlldC4gKi8KIAlpZiAoKCh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSkKIAkgICAgJiYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZV1JJVEUpKSkgewpAQCAtOTEsNyArOTMsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmlsZV9hY2Nlc3NlZChmaWxlKTsKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfYXRpbWUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJICAgIGZpbGUtPmZfdmZzbW50LCAmbG9ja19sZXZlbCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJb2NmczJfbWV0YV91bmxvY2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGxvY2tfbGV2ZWwpOworb3V0OgogCXZtYS0+dm1fb3BzID0gJm9jZnMyX2ZpbGVfdm1fb3BzOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggYTU3Yjc1MS4uMjFkYjQ1ZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC03NSwxMiArNzUsMTIgQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkJCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKipyZXNfZGlyKTsKIAotc3RhdGljIGludCBvY2ZzMl9kZWxldGVfZW50cnkoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW50IG9jZnMyX2RlbGV0ZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgc3RydWN0IGlub2RlICpkaXIsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZV9kZWwsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotc3RhdGljIGludCBfX29jZnMyX2FkZF9lbnRyeShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbnQgX19vY2ZzMl9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgc3RydWN0IGlub2RlICpkaXIsCiAJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAogCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYmxrbm8sCkBAIC05Myw0MyArOTMsMzcgQEAKIAkJCSAgICAgIGRldl90IGRldiwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKm5ld19mZV9iaCwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2ZlX2JoLAotCQkJICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgc3RydWN0IGlub2RlICoqcmV0X2lub2RlLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmlub2RlX2FjKTsKIAogc3RhdGljIGludCBvY2ZzMl9maWxsX25ld19kaXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKnBhcmVudCwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMpOwogCi1zdGF0aWMgaW50IG9jZnMyX2RvdWJsZV9sb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgxLAotCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlMSwKLQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgyLAotCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlMik7Ci0KIHN0YXRpYyBpbnQgb2NmczJfcHJlcGFyZV9vcnBoYW5fZGlyKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgc3RydWN0IGlub2RlICoqcmV0X29ycGhhbl9kaXIsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIGNoYXIgKm5hbWUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmRlX2JoKTsKIAogc3RhdGljIGludCBvY2ZzMl9vcnBoYW5fYWRkKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKIAkJCSAgICBjaGFyICpuYW1lLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGVfYmgpOworCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGVfYmgsCisJCQkgICAgc3RydWN0IGlub2RlICpvcnBoYW5fZGlyX2lub2RlKTsKIAogc3RhdGljIGludCBvY2ZzMl9jcmVhdGVfc3ltbGlua19kYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWUpOwogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9hZGRfZW50cnkoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBibGtubywKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2ZlX2JoLApAQCAtMTY1LDcgKzE1OSw3IEBACiAJbWxvZygwLCAiZmluZCBuYW1lICUuKnMgaW4gZGlyZWN0b3J5ICVsbHVcbiIsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKIAkgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShkaXIpLT5pcF9ibGtubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBOVUxMLCBOVUxMLCAwKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0yNDIsNyArMjM2LDcgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9maWxsX25ld19kaXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKnBhcmVudCwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLApAQCAtMzE3LDcgKzMxMSw3IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpwYXJlbnRfZmVfYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYjsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaXJmZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19mZV9iaCA9IE5VTEw7CkBAIC0zMzMsMTggKzMyNywxMSBAQAogCS8qIGdldCBvdXIgc3VwZXIgYmxvY2sgKi8KIAlvc2IgPSBPQ0ZTMl9TQihkaXItPmlfc2IpOwogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBoYW5kbGUsICZwYXJlbnRfZmVfYmgsIDEpOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsICZwYXJlbnRfZmVfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAlpZiAoU19JU0RJUihtb2RlKSAmJiAoZGlyLT5pX25saW5rID49IE9DRlMyX0xJTktfTUFYKSkgewpAQCAtMzc0LDcgKzM2MSw3IEBACiAJfQogCiAJLyogcmVzZXJ2ZSBhbiBpbm9kZSBzcG90ICovCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUob3NiLCBoYW5kbGUsICZpbm9kZV9hYyk7CisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUob3NiLCAmaW5vZGVfYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTM4NCw3ICszNzEsNyBAQAogCS8qIGFyZSB3ZSBtYWtpbmcgYSBkaXJlY3Rvcnk/IElmIHNvLCByZXNlcnZlIGEgY2x1c3RlciBmb3IgaGlzCiAJICogMXN0IGV4dGVudC4gKi8KIAlpZiAoU19JU0RJUihtb2RlKSkgewotCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCAxLCAmZGF0YV9hYyk7CisJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCAxLCAmZGF0YV9hYyk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMzkyLDcgKzM3OSw3IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgT0NGUzJfTUtOT0RfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9NS05PRF9DUkVESVRTKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNDUzLDcgKzQ0MCw5IEBACiAJc3RhdHVzID0gMDsKIGxlYXZlOgogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCisJb2NmczJfbWV0YV91bmxvY2soZGlyLCAxKTsKIAogCWlmIChzdGF0dXMgPT0gLUVOT1NQQykKIAkJbWxvZygwLCAiRGlzayBpcyBmdWxsXG4iKTsKQEAgLTQ4Nyw3ICs0NzYsNyBAQAogCQkJICAgICAgZGV2X3QgZGV2LAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2ZlX2JoLAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwYXJlbnRfZmVfYmgsCi0JCQkgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKipyZXRfaW5vZGUsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqaW5vZGVfYWMpCiB7CkBAIC02NTMsNyArNjQyLDcgQEAKIAkJICAgICAgc3RydWN0IGlub2RlICpkaXIsCiAJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmggPSBOVUxMOwpAQCAtNjY2LDY4ICs2NTUsNjAgQEAKIAkJICAgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gYmFpbDsKLQl9CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBiYWlsOwotCX0KLQotCWVyciA9IG9jZnMyX21ldGFfbG9jayhkaXIsIGhhbmRsZSwgJnBhcmVudF9mZV9iaCwgMSk7CisJZXJyID0gb2NmczJfbWV0YV9sb2NrKGRpciwgJnBhcmVudF9mZV9iaCwgMSk7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKGVyciAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhlcnIpOwotCQlnb3RvIGJhaWw7CisJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKCFkaXItPmlfbmxpbmspIHsKIAkJZXJyID0gLUVOT0VOVDsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSBvY2ZzMl9jaGVja19kaXJfZm9yX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQkJZGVudHJ5LT5kX25hbWUubGVuKTsKIAlpZiAoZXJyKQotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCiAJZXJyID0gb2NmczJfcHJlcGFyZV9kaXJfZm9yX2luc2VydChvc2IsIGRpciwgcGFyZW50X2ZlX2JoLAogCQkJCQkgICBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sICZkZV9iaCk7CiAJaWYgKGVyciA8IDApIHsKIAkJbWxvZ19lcnJubyhlcnIpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCX0KIAotCWVyciA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgaGFuZGxlLCAmZmVfYmgsIDEpOworCWVyciA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmZlX2JoLCAxKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKGVycik7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAJfQogCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwogCWlmIChsZTE2X3RvX2NwdShmZS0+aV9saW5rc19jb3VudCkgPj0gT0NGUzJfTElOS19NQVgpIHsKIAkJZXJyID0gLUVNTElOSzsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF91bmxvY2tfaW5vZGU7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIE9DRlMyX0xJTktfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9MSU5LX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQllcnIgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CiAJCW1sb2dfZXJybm8oZXJyKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF91bmxvY2tfaW5vZGU7CiAJfQogCiAJZXJyID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCiAJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChlcnIgPCAwKSB7CiAJCW1sb2dfZXJybm8oZXJyKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCiAJaW5jX25saW5rKGlub2RlKTsKQEAgLTc0MSw3ICs3MjIsNyBAQAogCQlsZTE2X2FkZF9jcHUoJmZlLT5pX2xpbmtzX2NvdW50LCAtMSk7CiAJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQltbG9nX2Vycm5vKGVycik7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfY29tbWl0OwogCX0KIAogCWVyciA9IG9jZnMyX2FkZF9lbnRyeShoYW5kbGUsIGRlbnRyeSwgaW5vZGUsCkBAIC03NTEsMjEgKzczMiwyNyBAQAogCQlsZTE2X2FkZF9jcHUoJmZlLT5pX2xpbmtzX2NvdW50LCAtMSk7CiAJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQltbG9nX2Vycm5vKGVycik7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfY29tbWl0OwogCX0KIAogCWVyciA9IG9jZnMyX2RlbnRyeV9hdHRhY2hfbG9jayhkZW50cnksIGlub2RlLCBPQ0ZTMl9JKGRpciktPmlwX2Jsa25vKTsKIAlpZiAoZXJyKSB7CiAJCW1sb2dfZXJybm8oZXJyKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCiAJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOwogCWRlbnRyeS0+ZF9vcCA9ICZvY2ZzMl9kZW50cnlfb3BzOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci1iYWlsOgotCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXRfdW5sb2NrX2lub2RlOgorCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworb3V0OgorCW9jZnMyX21ldGFfdW5sb2NrKGRpciwgMSk7CisKIAlpZiAoZGVfYmgpCiAJCWJyZWxzZShkZV9iaCk7CiAJaWYgKGZlX2JoKQpAQCAtODEyLDEzICs3OTksMTUgQEAKIAkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlpbnQgc3RhdHVzOworCWludCBjaGlsZF9sb2NrZWQgPSAwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpvcnBoYW5fZGlyID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGRpci0+aV9zYik7CiAJdTY0IGJsa25vOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9ub2RlX2JoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGlyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcmVudF9iaCA9IE5VTEw7CiAJY2hhciBvcnBoYW5fbmFtZVtPQ0ZTMl9PUlBIQU5fTkFNRUxFTiArIDFdOwpAQCAtODMzLDIyICs4MjIsMTQgQEAKIAogCWlmIChpbm9kZSA9PSBvc2ItPnJvb3RfaW5vZGUpIHsKIAkJbWxvZygwLCAiQ2Fubm90IGRlbGV0ZSB0aGUgcm9vdCBkaXJlY3RvcnlcbiIpOwotCQlzdGF0dXMgPSAtRVBFUk07Ci0JCWdvdG8gbGVhdmU7CisJCXJldHVybiAtRVBFUk07CiAJfQogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBoYW5kbGUsICZwYXJlbnRfbm9kZV9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGRpciwgJnBhcmVudF9ub2RlX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7CisJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJc3RhdHVzID0gb2NmczJfZmluZF9maWxlc19vbl9kaXNrKGRlbnRyeS0+ZF9uYW1lLm5hbWUsCkBAIC04NjksMTIgKzg1MCwxMyBAQAogCQlnb3RvIGxlYXZlOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgaGFuZGxlLCAmZmVfYmgsIDEpOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmZlX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CiAJfQorCWNoaWxkX2xvY2tlZCA9IDE7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCSAgICAgICAJaWYgKCFvY2ZzMl9lbXB0eV9kaXIoaW5vZGUpKSB7CkBAIC04OTUsNyArODc3LDcgQEAKIAl9CiAKIAlpZiAoaW5vZGVfaXNfdW5saW5rYWJsZShpbm9kZSkpIHsKLQkJc3RhdHVzID0gb2NmczJfcHJlcGFyZV9vcnBoYW5fZGlyKG9zYiwgaGFuZGxlLCBpbm9kZSwKKwkJc3RhdHVzID0gb2NmczJfcHJlcGFyZV9vcnBoYW5fZGlyKG9zYiwgJm9ycGhhbl9kaXIsIGlub2RlLAogCQkJCQkJICBvcnBoYW5fbmFtZSwKIAkJCQkJCSAgJm9ycGhhbl9lbnRyeV9iaCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CkBAIC05MDQsNyArODg2LDcgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9VTkxJTktfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9VTkxJTktfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTkyMyw3ICs5MDUsNyBAQAogCiAJaWYgKGlub2RlX2lzX3VubGlua2FibGUoaW5vZGUpKSB7CiAJCXN0YXR1cyA9IG9jZnMyX29ycGhhbl9hZGQob3NiLCBoYW5kbGUsIGlub2RlLCBmZSwgb3JwaGFuX25hbWUsCi0JCQkJCSAgb3JwaGFuX2VudHJ5X2JoKTsKKwkJCQkJICBvcnBoYW5fZW50cnlfYmgsIG9ycGhhbl9kaXIpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBsZWF2ZTsKQEAgLTk2MCw3ICs5NDIsMTkgQEAKIAogbGVhdmU6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKKwlpZiAoY2hpbGRfbG9ja2VkKQorCQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CisKKwlvY2ZzMl9tZXRhX3VubG9jayhkaXIsIDEpOworCisJaWYgKG9ycGhhbl9kaXIpIHsKKwkJLyogVGhpcyB3YXMgbG9ja2VkIGZvciB1cyBpbiBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIoKSAqLworCQlvY2ZzMl9tZXRhX3VubG9jayhvcnBoYW5fZGlyLCAxKTsKKwkJbXV0ZXhfdW5sb2NrKCZvcnBoYW5fZGlyLT5pX211dGV4KTsKKwkJaXB1dChvcnBoYW5fZGlyKTsKKwl9CiAKIAlpZiAoZmVfYmgpCiAJCWJyZWxzZShmZV9iaCk7CkBAIC05ODQsNyArOTc4LDYgQEAKICAqIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpZCwgdGhlbiB0aGUgMXN0IG9uZSBpcyB0aGUgb25seSBvbmUgbG9ja2VkLgogICovCiBzdGF0aWMgaW50IG9jZnMyX2RvdWJsZV9sb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgxLAogCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlMSwKIAkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgyLApAQCAtMTAwMCw4ICs5OTMsNiBAQAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW9pMS0+aXBfYmxrbm8sCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2kyLT5pcF9ibGtubyk7CiAKLQlCVUdfT04oIWhhbmRsZSk7Ci0KIAlpZiAoKmJoMSkKIAkJKmJoMSA9IE5VTEw7CiAJaWYgKCpiaDIpCkBAIC0xMDIxLDI1ICsxMDEyLDQxIEBACiAJCQlpbm9kZTEgPSB0bXBpbm9kZTsKIAkJfQogCQkvKiBsb2NrIGlkMiAqLwotCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUyLCBoYW5kbGUsIGJoMiwgMSk7CisJCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZTIsIGJoMiwgMSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CiAJfQorCiAJLyogbG9jayBpZDEgKi8KLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUxLCBoYW5kbGUsIGJoMSwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlMSwgYmgxLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgeworCQkvKgorCQkgKiBBbiBlcnJvciByZXR1cm4gbXVzdCBtZWFuIHRoYXQgbm8gY2x1c3RlciBsb2NrcworCQkgKiB3ZXJlIGhlbGQgb24gZnVuY3Rpb24gZXhpdC4KKwkJICovCisJCWlmIChvaTEtPmlwX2Jsa25vICE9IG9pMi0+aXBfYmxrbm8pCisJCQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZTIsIDEpOworCiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwogCX0KKwogYmFpbDoKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl9kb3VibGVfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUxLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMikKK3sKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZTEsIDEpOworCisJaWYgKGlub2RlMSAhPSBpbm9kZTIpCisJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlMiwgMSk7Cit9CisKICNkZWZpbmUgUEFSRU5UX0lOTyhidWZmZXIpIFwKIAkoKHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKikgXAogCSAoKGNoYXIgKilidWZmZXIgKyBcCkBAIC0xMDUwLDkgKzEwNTcsMTEgQEAKIAkJCXN0cnVjdCBpbm9kZSAqbmV3X2RpciwKIAkJCXN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCiB7Ci0JaW50IHN0YXR1cyA9IDAsIHJlbmFtZV9sb2NrID0gMDsKKwlpbnQgc3RhdHVzID0gMCwgcmVuYW1lX2xvY2sgPSAwLCBwYXJlbnRzX2xvY2tlZCA9IDA7CisJaW50IG9sZF9jaGlsZF9sb2NrZWQgPSAwLCBuZXdfY2hpbGRfbG9ja2VkID0gMDsKIAlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqb3JwaGFuX2RpciA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbmV3ZmUgPSBOVUxMOwogCWNoYXIgb3JwaGFuX25hbWVbT0NGUzJfT1JQSEFOX05BTUVMRU4gKyAxXTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9ycGhhbl9lbnRyeV9iaCA9IE5VTEw7CkBAIC0xMDYwLDcgKzEwNjksNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5zZXJ0X2VudHJ5X2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE5VTEw7CiAJdTY0IG5ld2ZlX2Jsa25vOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9kaXJfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2Rpcl9iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqb2xkX2RlID0gTlVMTCwgKm5ld19kZSA9IE5VTEw7IC8vIGRpcmVudCBmb3Igb2xkX2RlbnRyeQpAQCAtMTEwNSwyMSArMTExNCwxNCBAQAogCQlyZW5hbWVfbG9jayA9IDE7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQogCS8qIGlmIG9sZCBhbmQgbmV3IGFyZSB0aGUgc2FtZSwgdGhpcydsbCBqdXN0IGRvIG9uZSBsb2NrLiAqLwotCXN0YXR1cyA9IG9jZnMyX2RvdWJsZV9sb2NrKG9zYiwgaGFuZGxlLAotCQkJCSAgJm9sZF9kaXJfYmgsIG9sZF9kaXIsCi0JCQkJICAmbmV3X2Rpcl9iaCwgbmV3X2Rpcik7CisJc3RhdHVzID0gb2NmczJfZG91YmxlX2xvY2sob3NiLCAmb2xkX2Rpcl9iaCwgb2xkX2RpciwKKwkJCQkgICAmbmV3X2Rpcl9iaCwgbmV3X2Rpcik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQorCXBhcmVudHNfbG9ja2VkID0gMTsKIAogCS8qIG1ha2Ugc3VyZSBib3RoIGRpcnMgaGF2ZSBiaHMKIAkgKiBnZXQgYW4gZXh0cmEgcmVmIG9uIG9sZF9kaXJfYmggaWYgb2xkPT1uZXcgKi8KQEAgLTExNDAsMTIgKzExNDIsMTMgQEAKIAkgKiB0aGUgdm90ZSB0aHJlYWQgb24gb3RoZXIgbm9kZXMgd29uJ3QgaGF2ZSB0byBjb25jdXJyZW50bHkKIAkgKiBkb3duY29udmVydCB0aGUgaW5vZGUgYW5kIHRoZSBkZW50cnkgbG9ja3MuCiAJICovCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9sZF9pbm9kZSwgaGFuZGxlLCBOVUxMLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2sob2xkX2lub2RlLCBOVUxMLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CisJb2xkX2NoaWxkX2xvY2tlZCA9IDE7CiAKIAlzdGF0dXMgPSBvY2ZzMl9yZW1vdGVfZGVudHJ5X2RlbGV0ZShvbGRfZGVudHJ5KTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtMTIzMSwxMiArMTIzNCwxMyBAQAogCQkJZ290byBiYWlsOwogCQl9CiAKLQkJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG5ld19pbm9kZSwgaGFuZGxlLCAmbmV3ZmVfYmgsIDEpOworCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2sobmV3X2lub2RlLCAmbmV3ZmVfYmgsIDEpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQorCQluZXdfY2hpbGRfbG9ja2VkID0gMTsKIAogCQlzdGF0dXMgPSBvY2ZzMl9yZW1vdGVfZGVudHJ5X2RlbGV0ZShuZXdfZGVudHJ5KTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTEyNTIsNyArMTI1Niw3IEBACiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdmZV9iaC0+Yl9ibG9ja25yIDogMFVMTCk7CiAKIAkJaWYgKFNfSVNESVIobmV3X2lub2RlLT5pX21vZGUpIHx8IChuZXdfaW5vZGUtPmlfbmxpbmsgPT0gMSkpIHsKLQkJCXN0YXR1cyA9IG9jZnMyX3ByZXBhcmVfb3JwaGFuX2Rpcihvc2IsIGhhbmRsZSwKKwkJCXN0YXR1cyA9IG9jZnMyX3ByZXBhcmVfb3JwaGFuX2Rpcihvc2IsICZvcnBoYW5fZGlyLAogCQkJCQkJCSAgbmV3X2lub2RlLAogCQkJCQkJCSAgb3JwaGFuX25hbWUsCiAJCQkJCQkJICAmb3JwaGFuX2VudHJ5X2JoKTsKQEAgLTEyODAsNyArMTI4NCw3IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgT0NGUzJfUkVOQU1FX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUkVOQU1FX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC0xMzA3LDcgKzEzMTEsNyBAQAogCQkgICAgKG5ld2ZlLT5pX2xpbmtzX2NvdW50ID09IGNwdV90b19sZTE2KDEpKSl7CiAJCQlzdGF0dXMgPSBvY2ZzMl9vcnBoYW5fYWRkKG9zYiwgaGFuZGxlLCBuZXdfaW5vZGUsCiAJCQkJCQkgIG5ld2ZlLCBvcnBoYW5fbmFtZSwKLQkJCQkJCSAgb3JwaGFuX2VudHJ5X2JoKTsKKwkJCQkJCSAgb3JwaGFuX2VudHJ5X2JoLCBvcnBoYW5fZGlyKTsKIAkJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJCWdvdG8gYmFpbDsKQEAgLTE0MjQsNyArMTQyOCwyMyBAQAogCQlvY2ZzMl9yZW5hbWVfdW5sb2NrKG9zYik7CiAKIAlpZiAoaGFuZGxlKQotCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworCWlmIChwYXJlbnRzX2xvY2tlZCkKKwkJb2NmczJfZG91YmxlX3VubG9jayhvbGRfZGlyLCBuZXdfZGlyKTsKKworCWlmIChvbGRfY2hpbGRfbG9ja2VkKQorCQlvY2ZzMl9tZXRhX3VubG9jayhvbGRfaW5vZGUsIDEpOworCisJaWYgKG5ld19jaGlsZF9sb2NrZWQpCisJCW9jZnMyX21ldGFfdW5sb2NrKG5ld19pbm9kZSwgMSk7CisKKwlpZiAob3JwaGFuX2RpcikgeworCQkvKiBUaGlzIHdhcyBsb2NrZWQgZm9yIHVzIGluIG9jZnMyX3ByZXBhcmVfb3JwaGFuX2RpcigpICovCisJCW9jZnMyX21ldGFfdW5sb2NrKG9ycGhhbl9kaXIsIDEpOworCQltdXRleF91bmxvY2soJm9ycGhhbl9kaXItPmlfbXV0ZXgpOworCQlpcHV0KG9ycGhhbl9kaXIpOworCX0KIAogCWlmIChuZXdfaW5vZGUpCiAJCXN5bmNfbWFwcGluZ19idWZmZXJzKG9sZF9pbm9kZS0+aV9tYXBwaW5nKTsKQEAgLTE0NTgsNyArMTQ3OCw3IEBACiAgKiBkYXRhLCBpbmNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvci4KICAqLwogc3RhdGljIGludCBvY2ZzMl9jcmVhdGVfc3ltbGlua19kYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWUpCiB7CkBAIC0xNTczLDcgKzE1OTMsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2ZlX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGlyZmU7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICppbm9kZV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOwogCkBAIC0xNTg3LDE5ICsxNjA3LDEyIEBACiAKIAljcmVkaXRzID0gb2NmczJfY2FsY19zeW1saW5rX2NyZWRpdHMoc2IpOwogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQogCS8qIGxvY2sgdGhlIHBhcmVudCBkaXJlY3RvcnkgKi8KLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCBoYW5kbGUsICZwYXJlbnRfZmVfYmgsIDEpOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsICZwYXJlbnRfZmVfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCWRpcmZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgcGFyZW50X2ZlX2JoLT5iX2RhdGE7CkBAIC0xNjIyLDcgKzE2MzUsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUob3NiLCBoYW5kbGUsICZpbm9kZV9hYyk7CisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUob3NiLCAmaW5vZGVfYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTE2MzEsNyArMTY0NCw3IEBACiAKIAkvKiBkb24ndCByZXNlcnZlIGJpdG1hcCBzcGFjZSBmb3IgZmFzdCBzeW1saW5rcy4gKi8KIAlpZiAobCA+IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhzYikpIHsKLQkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgMSwgJmRhdGFfYWMpOworCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgMSwgJmRhdGFfYWMpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTE2MzksNyArMTY1Miw3IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgY3JlZGl0cyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtMTcxNyw3ICsxNzMwLDEwIEBACiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIGJhaWw6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKKwlvY2ZzMl9tZXRhX3VubG9jayhkaXIsIDEpOworCiAJaWYgKG5ld19mZV9iaCkKIAkJYnJlbHNlKG5ld19mZV9iaCk7CiAJaWYgKHBhcmVudF9mZV9iaCkKQEAgLTE3NjgsNyArMTc4NCw3IEBACiAgKiBJZiB5b3UgcGFzcyBtZSBpbnNlcnRfYmgsIEknbGwgc2tpcCB0aGUgc2VhcmNoIG9mIHRoZSBvdGhlciBkaXIKICAqIGJsb2NrcyBhbmQgcHV0IHRoZSByZWNvcmQgaW4gdGhlcmUuCiAgKi8KLXN0YXRpYyBpbnQgX19vY2ZzMl9hZGRfZW50cnkoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW50IF9fb2NmczJfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKIAkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGJsa25vLApAQCAtMTg1NCw3ICsxODcwLDcgQEAKICAqIG9jZnMyX2RlbGV0ZV9lbnRyeSBkZWxldGVzIGEgZGlyZWN0b3J5IGVudHJ5IGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUKICAqIHByZXZpb3VzIGVudHJ5CiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZGVsZXRlX2VudHJ5KHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBvY2ZzMl9kZWxldGVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGVfZGVsLAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKQEAgLTIwODUsMTkgKzIxMDEsMTkgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKipyZXRfb3JwaGFuX2RpciwKIAkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgY2hhciAqbmFtZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZGVfYmgpCiB7Ci0Jc3RydWN0IGlub2RlICpvcnBoYW5fZGlyX2lub2RlID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9kaXJfaW5vZGU7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpvcnBoYW5fZGlyX2JoID0gTlVMTDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCXN0YXR1cyA9IG9jZnMyX2Jsa25vX3N0cmluZ2lmeShPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIG5hbWUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAlvcnBoYW5fZGlyX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKQEAgLTIxMDYsMTEgKzIxMjIsMTIgQEAKIAlpZiAoIW9ycGhhbl9kaXJfaW5vZGUpIHsKIAkJc3RhdHVzID0gLUVOT0VOVDsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCW9jZnMyX2hhbmRsZV9hZGRfaW5vZGUoaGFuZGxlLCBvcnBoYW5fZGlyX2lub2RlKTsKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2sob3JwaGFuX2Rpcl9pbm9kZSwgaGFuZGxlLCAmb3JwaGFuX2Rpcl9iaCwgMSk7CisJbXV0ZXhfbG9jaygmb3JwaGFuX2Rpcl9pbm9kZS0+aV9tdXRleCk7CisKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2sob3JwaGFuX2Rpcl9pbm9kZSwgJm9ycGhhbl9kaXJfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTIxMjAsMTMgKzIxMzcsMTkgQEAKIAkJCQkJICAgICAgb3JwaGFuX2Rpcl9iaCwgbmFtZSwKIAkJCQkJICAgICAgT0NGUzJfT1JQSEFOX05BTUVMRU4sIGRlX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgeworCQlvY2ZzMl9tZXRhX3VubG9jayhvcnBoYW5fZGlyX2lub2RlLCAxKTsKKwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CiAJfQogCisJKnJldF9vcnBoYW5fZGlyID0gb3JwaGFuX2Rpcl9pbm9kZTsKKwogbGVhdmU6Ci0JaWYgKG9ycGhhbl9kaXJfaW5vZGUpCisJaWYgKHN0YXR1cykgeworCQltdXRleF91bmxvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwogCQlpcHV0KG9ycGhhbl9kaXJfaW5vZGUpOworCX0KIAogCWlmIChvcnBoYW5fZGlyX2JoKQogCQlicmVsc2Uob3JwaGFuX2Rpcl9iaCk7CkBAIC0yMTM2LDI4ICsyMTU5LDE5IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfb3JwaGFuX2FkZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCiAJCQkgICAgY2hhciAqbmFtZSwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlX2JoKQorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGVfYmgsCisJCQkgICAgc3RydWN0IGlub2RlICpvcnBoYW5fZGlyX2lub2RlKQogewotCXN0cnVjdCBpbm9kZSAqb3JwaGFuX2Rpcl9pbm9kZSA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpvcnBoYW5fZGlyX2JoID0gTlVMTDsKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpvcnBoYW5fZmU7CiAKIAltbG9nX2VudHJ5KCIoaW5vZGUtPmlfaW5vID0gJWx1KVxuIiwgaW5vZGUtPmlfaW5vKTsKIAotCW9ycGhhbl9kaXJfaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLAotCQkJCQkJICAgICAgIE9SUEhBTl9ESVJfU1lTVEVNX0lOT0RFLAotCQkJCQkJICAgICAgIG9zYi0+c2xvdF9udW0pOwotCWlmICghb3JwaGFuX2Rpcl9pbm9kZSkgewotCQlzdGF0dXMgPSAtRU5PRU5UOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCiAJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsCiAJCQkJICBPQ0ZTMl9JKG9ycGhhbl9kaXJfaW5vZGUpLT5pcF9ibGtubywKIAkJCQkgICZvcnBoYW5fZGlyX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsCkBAIC0yMjA5LDkgKzIyMjMsNiBAQAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIG9zYi0+c2xvdF9udW0pOwogCiBsZWF2ZToKLQlpZiAob3JwaGFuX2Rpcl9pbm9kZSkKLQkJaXB1dChvcnBoYW5fZGlyX2lub2RlKTsKLQogCWlmIChvcnBoYW5fZGlyX2JoKQogCQlicmVsc2Uob3JwaGFuX2Rpcl9iaCk7CiAKQEAgLTIyMjEsNyArMjIzMiw3IEBACiAKIC8qIHVubGlrZSBvcnBoYW5fYWRkLCB3ZSBleHBlY3QgdGhlIG9ycGhhbiBkaXIgdG8gYWxyZWFkeSBiZSBsb2NrZWQgaGVyZS4gKi8KIGludCBvY2ZzMl9vcnBoYW5fZGVsKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgc3RydWN0IGlub2RlICpvcnBoYW5fZGlyX2lub2RlLAogCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpvcnBoYW5fZGlyX2JoKQpAQCAtMjMwMCw0ICsyMzExLDUgQEAKIAkucmVuYW1lCQk9IG9jZnMyX3JlbmFtZSwKIAkuc2V0YXR0cgk9IG9jZnMyX3NldGF0dHIsCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gb2NmczJfcGVybWlzc2lvbiwKIH07CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5oIGIvZnMvb2NmczIvbmFtZWkuaAppbmRleCBkZWFhYTk3Li44NDI1OTQ0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5oCisrKyBiL2ZzL29jZnMyL25hbWVpLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAkJCQkgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKnJlc19kaXIpOwogaW50IG9jZnMyX29ycGhhbl9kZWwoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCSAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICBzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9kaXJfaW5vZGUsCiAJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9ycGhhbl9kaXJfYmgpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczIuaCBiL2ZzL29jZnMyL29jZnMyLmgKaW5kZXggMDQ2MmE3Zi4uMDc4ODgzNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczIuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMi5oCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CiAKICNpbmNsdWRlICJjbHVzdGVyL25vZGVtYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2x1c3Rlci9oZWFydGJlYXQuaCIKQEAgLTE3OSw5ICsxODAsOSBAQAogI2RlZmluZSBPQ0ZTMl9PU0JfU09GVF9STwkweDAwMDEKICNkZWZpbmUgT0NGUzJfT1NCX0hBUkRfUk8JMHgwMDAyCiAjZGVmaW5lIE9DRlMyX09TQl9FUlJPUl9GUwkweDAwMDQKKyNkZWZpbmUgT0NGUzJfREVGQVVMVF9BVElNRV9RVUFOVFVNCTYwCiAKIHN0cnVjdCBvY2ZzMl9qb3VybmFsOwotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlOwogc3RydWN0IG9jZnMyX3N1cGVyCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjb21taXRfdGFzazsKQEAgLTIxOCw2ICsyMTksNyBAQAogCXVuc2lnbmVkIGxvbmcgb3NiX2ZsYWdzOwogCiAJdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKKwl1bnNpZ25lZCBpbnQgc19hdGltZV9xdWFudHVtOwogCiAJdTE2IG1heF9zbG90czsKIAlzMTYgbm9kZV9udW07CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5jIGIvZnMvb2NmczIvc3ViYWxsb2MuYwppbmRleCA5ZDkxZTY2Li4wMDBkNzFjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5jCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9kZWJ1Z19iZyhzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcpOwogc3RhdGljIGlubGluZSB2b2lkIG9jZnMyX2RlYnVnX3N1YmFsbG9jX2lub2RlKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlKTsKIHN0YXRpYyBpbmxpbmUgdTE2IG9jZnMyX2ZpbmRfdmljdGltX2NoYWluKHN0cnVjdCBvY2ZzMl9jaGFpbl9saXN0ICpjbCk7Ci1zdGF0aWMgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2ZpbGwoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2ZpbGwoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJnX2JoLAogCQkJCSAgdTY0IGdyb3VwX2Jsa25vLApAQCAtNTksOSArNTksNiBAQAogCQkJCSAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKLXN0YXRpYyBpbnQgb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpOwotCiBzdGF0aWMgaW50IG9jZnMyX2NsdXN0ZXJfZ3JvdXBfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCwKIAkJCQkgICAgICB1MzIgYml0c193YW50ZWQsIHUzMiBtaW5fYml0cywKQEAgLTcyLDYgKzY5LDcgQEAKIAkJCQkgICAgdTE2ICpiaXRfb2ZmLCB1MTYgKmJpdHNfZm91bmQpOwogc3RhdGljIGludCBvY2ZzMl9jbGFpbV9zdWJhbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAorCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgIHUzMiBiaXRzX3dhbnRlZCwKIAkJCQkgICAgIHUzMiBtaW5fYml0cywKIAkJCQkgICAgIHUxNiAqYml0X29mZiwKQEAgLTc5LDIwICs3NywyMCBAQAogCQkJCSAgICAgdTY0ICpiZ19ibGtubyk7CiBzdGF0aWMgaW50IG9jZnMyX3Rlc3RfYmdfYml0X2FsbG9jYXRhYmxlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmdfYmgsCiAJCQkJCSBpbnQgbnIpOwotc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfc2V0X2JpdHMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9zZXRfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJCSAgICAgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnLAogCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IGJpdF9vZmYsCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9iaXRzKTsKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2NsZWFyX2JpdHMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9jbGVhcl9iaXRzKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnLAogCQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGludCBiaXRfb2ZmLAogCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bV9iaXRzKTsKIAotc3RhdGljIGludCBvY2ZzMl9yZWxpbmtfYmxvY2tfZ3JvdXAoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW50IG9jZnMyX3JlbGlua19ibG9ja19ncm91cChoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJnX2JoLApAQCAtMTAwLDcgKzk4LDcgQEAKIAkJCQkgICAgdTE2IGNoYWluKTsKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX3JlYXNvbmFibHlfZW1wdHkoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnLAogCQkJCQkJICAgICB1MzIgd2FudGVkKTsKLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKIAkJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKQEAgLTEyMCw4ICsxMTgsMTYgQEAKIAogdm9pZCBvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKQogewotCWlmIChhYy0+YWNfaW5vZGUpCi0JCWlwdXQoYWMtPmFjX2lub2RlKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gYWMtPmFjX2lub2RlOworCisJaWYgKGlub2RlKSB7CisJCWlmIChhYy0+YWNfd2hpY2ggIT0gT0NGUzJfQUNfVVNFX0xPQ0FMKQorCQkJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJCWlwdXQoaW5vZGUpOworCX0KIAlpZiAoYWMtPmFjX2JoKQogCQlicmVsc2UoYWMtPmFjX2JoKTsKIAlrZnJlZShhYyk7CkBAIC0xOTAsNyArMTk2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9ibG9ja19ncm91cF9maWxsKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBvY2ZzMl9ibG9ja19ncm91cF9maWxsKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiZ19iaCwKIAkJCQkgIHU2NCBncm91cF9ibGtubywKQEAgLTI3Myw3ICsyNzksNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfY2hhaW5fbGlzdCAqY2w7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJdTMyIGJpdF9vZmYsIG51bV9iaXRzOwogCXUxNiBhbGxvY19yZWM7CiAJdTY0IGJnX2Jsa25vOwpAQCAtMjg0LDE2ICsyOTAsOCBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoIWhhbmRsZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAljbCA9ICZmZS0+aWQyLmlfY2hhaW47CiAJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsCi0JCQkJCWhhbmRsZSwKIAkJCQkJbGUxNl90b19jcHUoY2wtPmNsX2NwZyksCiAJCQkJCSZhYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTMwNCw3ICszMDIsNyBAQAogCiAJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZ3JvdXBfYWxsb2NfY3JlZGl0cyhvc2ItPnNiLAogCQkJCQkJIGxlMTZfdG9fY3B1KGNsLT5jbF9jcGcpKTsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgY3JlZGl0cyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtMzg5LDcgKzM4Nyw3IEBACiAJc3RhdHVzID0gMDsKIGJhaWw6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKIAlpZiAoYWMpCiAJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChhYyk7CkBAIC00MDIsMjcgKzQwMCwzOCBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKQorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCisJCQkJICAgICAgIGludCB0eXBlLAorCQkJCSAgICAgICB1MzIgc2xvdCkKIHsKIAlpbnQgc3RhdHVzOwogCXUzMiBiaXRzX3dhbnRlZCA9IGFjLT5hY19iaXRzX3dhbnRlZDsKLQlzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlID0gYWMtPmFjX2lub2RlOworCXN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGU7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBhYy0+YWNfaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlOwogCXUzMiBmcmVlX2JpdHM7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCUJVR19PTihoYW5kbGUtPmZsYWdzICYgT0NGUzJfSEFORExFX1NUQVJURUQpOwotCi0Jb2NmczJfaGFuZGxlX2FkZF9pbm9kZShoYW5kbGUsIGFsbG9jX2lub2RlKTsKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soYWxsb2NfaW5vZGUsIGhhbmRsZSwgJmJoLCAxKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwlhbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIHR5cGUsIHNsb3QpOworCWlmICghYWxsb2NfaW5vZGUpIHsKKwkJbWxvZ19lcnJubygtRUlOVkFMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJbXV0ZXhfbG9jaygmYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGFsbG9jX2lub2RlLCAmYmgsIDEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW11dGV4X3VubG9jaygmYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCQlpcHV0KGFsbG9jX2lub2RlKTsKKworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJYWMtPmFjX2lub2RlID0gYWxsb2NfaW5vZGU7CisKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGJoLT5iX2RhdGE7CiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7CiAJCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGFsbG9jX2lub2RlLT5pX3NiLCBmZSk7CkBAIC00NzMsMTIgKzQ4MiwxMSBAQAogfQogCiBpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKIHsKIAlpbnQgc3RhdHVzOwotCXN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUgPSBOVUxMOworCXUzMiBzbG90OwogCiAJKmFjID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqYWMpKSB7CkBAIC00ODgsMjggKzQ5NiwxOCBAQAogCX0KIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChmZSk7Ci0JKCphYyktPmFjX2hhbmRsZSA9IGhhbmRsZTsKIAkoKmFjKS0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfTUVUQTsKIAogI2lmbmRlZiBPQ0ZTMl9VU0VfQUxMX01FVEFEQVRBX1NVQkFMTE9DQVRPUlMKLQlhbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCi0JCQkJCQkgIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsCi0JCQkJCQkgIDApOworCXNsb3QgPSAwOwogI2Vsc2UKLQlhbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCi0JCQkJCQkgIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsCi0JCQkJCQkgIG9zYi0+c2xvdF9udW0pOworCXNsb3QgPSBvc2ItPnNsb3RfbnVtOwogI2VuZGlmCi0JaWYgKCFhbGxvY19pbm9kZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9CiAKLQkoKmFjKS0+YWNfaW5vZGUgPSBpZ3JhYihhbGxvY19pbm9kZSk7CiAJKCphYyktPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaDsKIAotCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsICgqYWMpKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX3N1YmFsbG9jX2JpdHMob3NiLCAoKmFjKSwKKwkJCQkJICAgICBFWFRFTlRfQUxMT0NfU1lTVEVNX0lOT0RFLCBzbG90KTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01MjMsMTkgKzUyMSwxNCBAQAogCQkqYWMgPSBOVUxMOwogCX0KIAotCWlmIChhbGxvY19pbm9kZSkKLQkJaXB1dChhbGxvY19pbm9kZSk7Ci0KIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKIHsKIAlpbnQgc3RhdHVzOwotCXN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUgPSBOVUxMOwogCiAJKmFjID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqYWMpKSB7CkBAIC01NDUsMjIgKzUzOCwxMyBAQAogCX0KIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IDE7Ci0JKCphYyktPmFjX2hhbmRsZSA9IGhhbmRsZTsKIAkoKmFjKS0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfSU5PREU7CiAKLQlhbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCi0JCQkJCQkgIElOT0RFX0FMTE9DX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgb3NiLT5zbG90X251bSk7Ci0JaWYgKCFhbGxvY19pbm9kZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQkoKmFjKS0+YWNfaW5vZGUgPSBpZ3JhYihhbGxvY19pbm9kZSk7CiAJKCphYyktPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaDsKIAotCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsICphYyk7CisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgKmFjLAorCQkJCQkgICAgIElOT0RFX0FMTE9DX1NZU1RFTV9JTk9ERSwKKwkJCQkJICAgICBvc2ItPnNsb3RfbnVtKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01NzQsOSArNTU4LDYgQEAKIAkJKmFjID0gTlVMTDsKIAl9CiAKLQlpZiAoYWxsb2NfaW5vZGUpCi0JCWlwdXQoYWxsb2NfaW5vZGUpOwotCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU4OCwyMCArNTY5LDE3IEBACiB7CiAJaW50IHN0YXR1czsKIAotCWFjLT5hY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCi0JCQkJCQkgICBHTE9CQUxfQklUTUFQX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgIE9DRlMyX0lOVkFMSURfU0xPVCk7Ci0JaWYgKCFhYy0+YWNfaW5vZGUpIHsKLQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJbWxvZyhNTF9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgYml0bWFwIGlub2RlIVxuIik7Ci0JCWdvdG8gYmFpbDsKLQl9CiAJYWMtPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX01BSU47CiAJYWMtPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2NsdXN0ZXJfZ3JvdXBfc2VhcmNoOwogCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgYWMpOwotCWlmIChzdGF0dXMgPCAwICYmIHN0YXR1cyAhPSAtRU5PU1BDKQorCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsIGFjLAorCQkJCQkgICAgIEdMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFLAorCQkJCQkgICAgIE9DRlMyX0lOVkFMSURfU0xPVCk7CisJaWYgKHN0YXR1cyA8IDAgJiYgc3RhdHVzICE9IC1FTk9TUEMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGJhaWw7CisJfQorCiBiYWlsOgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02MTAsNyArNTg4LDYgQEAKICAqIHVzZSBzbyB3ZSBmaWd1cmUgaXQgb3V0IGZvciB0aGVtLCBidXQgdW5mb3J0dW5hdGVseSB0aGlzIGNsdXR0ZXJzCiAgKiB0aGluZ3MgYSBiaXQuICovCiBpbnQgb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgdTMyIGJpdHNfd2FudGVkLAogCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKIHsKQEAgLTYxOCw4ICs1OTUsNiBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlCVUdfT04oIWhhbmRsZSk7Ci0KIAkqYWMgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCksIEdGUF9LRVJORUwpOwogCWlmICghKCphYykpIHsKIAkJc3RhdHVzID0gLUVOT01FTTsKQEAgLTYyOCwxMiArNjAzLDEwIEBACiAJfQogCiAJKCphYyktPmFjX2JpdHNfd2FudGVkID0gYml0c193YW50ZWQ7Ci0JKCphYyktPmFjX2hhbmRsZSA9IGhhbmRsZTsKIAogCXN0YXR1cyA9IC1FTk9TUEM7CiAJaWYgKG9jZnMyX2FsbG9jX3Nob3VsZF91c2VfbG9jYWwob3NiLCBiaXRzX3dhbnRlZCkpIHsKIAkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9sb2NhbF9hbGxvY19iaXRzKG9zYiwKLQkJCQkJCQloYW5kbGUsCiAJCQkJCQkJYml0c193YW50ZWQsCiAJCQkJCQkJKmFjKTsKIAkJaWYgKChzdGF0dXMgPCAwKSAmJiAoc3RhdHVzICE9IC1FTk9TUEMpKSB7CkBAIC03NzQsNyArNzQ3LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9zZXRfYml0cyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX3NldF9iaXRzKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcsCiAJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCwKQEAgLTg0NSw3ICs4MTgsNyBAQAogCXJldHVybiBiZXN0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3JlbGlua19ibG9ja19ncm91cChzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbnQgb2NmczJfcmVsaW5rX2Jsb2NrX2dyb3VwKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmdfYmgsCkBAIC0xMDI1LDcgKzk5OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfYWxsb2NfZGlub2RlX3VwZGF0ZV9jb3VudHMoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCiAJCQkJICAgICAgIHUzMiBudW1fYml0cywKIAkJCQkgICAgICAgdTE2IGNoYWluKQpAQCAtMTA1NSw2ICsxMDI4LDcgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9zZWFyY2hfb25lX2dyb3VwKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICB1MzIgYml0c193YW50ZWQsCiAJCQkJICB1MzIgbWluX2JpdHMsCiAJCQkJICB1MTYgKmJpdF9vZmYsCkBAIC0xMDY3LDcgKzEwNDEsNiBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZDsKIAlzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlID0gYWMtPmFjX2lub2RlOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gYWMtPmFjX2hhbmRsZTsKIAogCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoYWxsb2NfaW5vZGUtPmlfc2IpLCBnZF9ibGtubywKIAkJCSAgICAgICAmZ3JvdXBfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgYWxsb2NfaW5vZGUpOwpAQCAtMTExNSw2ICsxMDg4LDcgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9zZWFyY2hfY2hhaW4oc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgIHUzMiBiaXRzX3dhbnRlZCwKIAkJCSAgICAgIHUzMiBtaW5fYml0cywKIAkJCSAgICAgIHUxNiAqYml0X29mZiwKQEAgLTExMjYsNyArMTEwMCw2IEBACiAJdTE2IGNoYWluLCB0bXBfYml0czsKIAl1MzIgdG1wX3VzZWQ7CiAJdTY0IG5leHRfZ3JvdXA7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBhYy0+YWNfaGFuZGxlOwogCXN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUgPSBhYy0+YWNfaW5vZGU7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpwcmV2X2dyb3VwX2JoID0gTlVMTDsKQEAgLTEyNzIsNiArMTI0NSw3IEBACiAvKiB3aWxsIGdpdmUgb3V0IHVwIHRvIGJpdHNfd2FudGVkIGNvbnRpZ3VvdXMgYml0cy4gKi8KIHN0YXRpYyBpbnQgb2NmczJfY2xhaW1fc3ViYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKKwkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICB1MzIgYml0c193YW50ZWQsCiAJCQkJICAgICB1MzIgbWluX2JpdHMsCiAJCQkJICAgICB1MTYgKmJpdF9vZmYsCkBAIC0xMzEzLDggKzEyODcsOCBAQAogCQkgKiBieSBqdW1waW5nIHN0cmFpZ2h0IHRvIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQKIAkJICogYWxsb2NhdGlvbiBncm91cC4gVGhpcyBoZWxwcyB1cyBtYW50YWluIHNvbWUKIAkJICogY29udGlndW91c25lc3MgYWNyb3NzIGFsbG9jYXRpb25zLiAqLwotCQlzdGF0dXMgPSBvY2ZzMl9zZWFyY2hfb25lX2dyb3VwKGFjLCBiaXRzX3dhbnRlZCwgbWluX2JpdHMsCi0JCQkJCQliaXRfb2ZmLCBudW1fYml0cywKKwkJc3RhdHVzID0gb2NmczJfc2VhcmNoX29uZV9ncm91cChhYywgaGFuZGxlLCBiaXRzX3dhbnRlZCwKKwkJCQkJCW1pbl9iaXRzLCBiaXRfb2ZmLCBudW1fYml0cywKIAkJCQkJCWhpbnRfYmxrbm8sICZiaXRzX2xlZnQpOwogCQlpZiAoIXN0YXR1cykgewogCQkJLyogQmUgY2FyZWZ1bCB0byB1cGRhdGUgKmJnX2Jsa25vIGhlcmUgYXMgdGhlCkBAIC0xMzM2LDcgKzEzMTAsNyBAQAogCWFjLT5hY19jaGFpbiA9IHZpY3RpbTsKIAlhYy0+YWNfYWxsb3dfY2hhaW5fcmVsaW5rID0gMTsKIAotCXN0YXR1cyA9IG9jZnMyX3NlYXJjaF9jaGFpbihhYywgYml0c193YW50ZWQsIG1pbl9iaXRzLCBiaXRfb2ZmLAorCXN0YXR1cyA9IG9jZnMyX3NlYXJjaF9jaGFpbihhYywgaGFuZGxlLCBiaXRzX3dhbnRlZCwgbWluX2JpdHMsIGJpdF9vZmYsCiAJCQkJICAgIG51bV9iaXRzLCBiZ19ibGtubywgJmJpdHNfbGVmdCk7CiAJaWYgKCFzdGF0dXMpCiAJCWdvdG8gc2V0X2hpbnQ7CkBAIC0xMzYwLDcgKzEzMzQsNyBAQAogCQkJY29udGludWU7CiAKIAkJYWMtPmFjX2NoYWluID0gaTsKLQkJc3RhdHVzID0gb2NmczJfc2VhcmNoX2NoYWluKGFjLCBiaXRzX3dhbnRlZCwgbWluX2JpdHMsCisJCXN0YXR1cyA9IG9jZnMyX3NlYXJjaF9jaGFpbihhYywgaGFuZGxlLCBiaXRzX3dhbnRlZCwgbWluX2JpdHMsCiAJCQkJCSAgICBiaXRfb2ZmLCBudW1fYml0cywgYmdfYmxrbm8sCiAJCQkJCSAgICAmYml0c19sZWZ0KTsKIAkJaWYgKCFzdGF0dXMpCkBAIC0xMzg4LDcgKzEzNjIsNyBAQAogfQogCiBpbnQgb2NmczJfY2xhaW1fbWV0YWRhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCiAJCQkgdTMyIGJpdHNfd2FudGVkLAogCQkJIHUxNiAqc3ViYWxsb2NfYml0X3N0YXJ0LApAQCAtMTQwMSwxMCArMTM3NSwxMCBAQAogCUJVR19PTighYWMpOwogCUJVR19PTihhYy0+YWNfYml0c193YW50ZWQgPCAoYWMtPmFjX2JpdHNfZ2l2ZW4gKyBiaXRzX3dhbnRlZCkpOwogCUJVR19PTihhYy0+YWNfd2hpY2ggIT0gT0NGUzJfQUNfVVNFX01FVEEpOwotCUJVR19PTihhYy0+YWNfaGFuZGxlICE9IGhhbmRsZSk7CiAKIAlzdGF0dXMgPSBvY2ZzMl9jbGFpbV9zdWJhbGxvY19iaXRzKG9zYiwKIAkJCQkJICAgYWMsCisJCQkJCSAgIGhhbmRsZSwKIAkJCQkJICAgYml0c193YW50ZWQsCiAJCQkJCSAgIDEsCiAJCQkJCSAgIHN1YmFsbG9jX2JpdF9zdGFydCwKQEAgLTE0MjUsNyArMTM5OSw3IEBACiB9CiAKIGludCBvY2ZzMl9jbGFpbV9uZXdfaW5vZGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCiAJCQkgIHUxNiAqc3ViYWxsb2NfYml0LAogCQkJICB1NjQgKmZlX2Jsa25vKQpAQCAtMTQ0MCwxMCArMTQxNCwxMCBAQAogCUJVR19PTihhYy0+YWNfYml0c19naXZlbiAhPSAwKTsKIAlCVUdfT04oYWMtPmFjX2JpdHNfd2FudGVkICE9IDEpOwogCUJVR19PTihhYy0+YWNfd2hpY2ggIT0gT0NGUzJfQUNfVVNFX0lOT0RFKTsKLQlCVUdfT04oYWMtPmFjX2hhbmRsZSAhPSBoYW5kbGUpOwogCiAJc3RhdHVzID0gb2NmczJfY2xhaW1fc3ViYWxsb2NfYml0cyhvc2IsCiAJCQkJCSAgIGFjLAorCQkJCQkgICBoYW5kbGUsCiAJCQkJCSAgIDEsCiAJCQkJCSAgIDEsCiAJCQkJCSAgIHN1YmFsbG9jX2JpdCwKQEAgLTE1MjgsNyArMTUwMiw3IEBACiAgKiBvZiBhbnkgc2l6ZS4KICAqLwogaW50IG9jZnMyX2NsYWltX2NsdXN0ZXJzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJIHUzMiBtaW5fY2x1c3RlcnMsCiAJCQkgdTMyICpjbHVzdGVyX3N0YXJ0LApAQCAtMTU0Niw3ICsxNTIwLDYgQEAKIAogCUJVR19PTihhYy0+YWNfd2hpY2ggIT0gT0NGUzJfQUNfVVNFX0xPQ0FMCiAJICAgICAgICYmIGFjLT5hY193aGljaCAhPSBPQ0ZTMl9BQ19VU0VfTUFJTik7Ci0JQlVHX09OKGFjLT5hY19oYW5kbGUgIT0gaGFuZGxlKTsKIAogCWlmIChhYy0+YWNfd2hpY2ggPT0gT0NGUzJfQUNfVVNFX0xPQ0FMKSB7CiAJCXN0YXR1cyA9IG9jZnMyX2NsYWltX2xvY2FsX2FsbG9jX2JpdHMob3NiLApAQCAtMTU3Miw2ICsxNTQ1LDcgQEAKIAogCQlzdGF0dXMgPSBvY2ZzMl9jbGFpbV9zdWJhbGxvY19iaXRzKG9zYiwKIAkJCQkJCSAgIGFjLAorCQkJCQkJICAgaGFuZGxlLAogCQkJCQkJICAgYml0c193YW50ZWQsCiAJCQkJCQkgICBtaW5fY2x1c3RlcnMsCiAJCQkJCQkgICAmYmdfYml0X29mZiwKQEAgLTE1OTgsNyArMTU3Miw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfY2xlYXJfYml0cyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2NsZWFyX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcsCiAJCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoLApAQCAtMTY1Myw3ICsxNjI3LDcgQEAKIC8qCiAgKiBleHBlY3RzIHRoZSBzdWJhbGxvYyBpbm9kZSB0byBhbHJlYWR5IGJlIGxvY2tlZC4KICAqLwotc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LApAQCAtMTczNyw3ICsxNzExLDcgQEAKIAlyZXR1cm4gZ3JvdXA7CiB9CiAKLWludCBvY2ZzMl9mcmVlX2Rpbm9kZShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLAogCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKQEAgLTE3NTAsNyArMTcyNCw3IEBACiAJCQkJCWlub2RlX2FsbG9jX2JoLCBiaXQsIGJnX2Jsa25vLCAxKTsKIH0KIAotaW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgc3RydWN0IGlub2RlICplYl9hbGxvY19pbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2FsbG9jX2JoLAogCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKQpAQCAtMTc2Myw3ICsxNzM3LDcgQEAKIAkJCQkJYml0LCBiZ19ibGtubywgMSk7CiB9CiAKLWludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICAgIHN0cnVjdCBpbm9kZSAqYml0bWFwX2lub2RlLAogCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCiAJCSAgICAgICB1NjQgc3RhcnRfYmxrLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuaCBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKaW5kZXggYzc4NzgzOC4uMWEzYzk0YyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCkBAIC00Myw3ICs0Myw2IEBACiAjZGVmaW5lIE9DRlMyX0FDX1VTRV9JTk9ERSAzCiAjZGVmaW5lIE9DRlMyX0FDX1VTRV9NRVRBICA0CiAJdTMyICAgIGFjX3doaWNoOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqYWNfaGFuZGxlOwogCiAJLyogdGhlc2UgYXJlIHVzZWQgYnkgdGhlIGNoYWluIHNlYXJjaCAqLwogCXUxNiAgICBhY19jaGFpbjsKQEAgLTYwLDQ1ICs1OSw0MiBAQAogfQogCiBpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYyk7CiBpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYyk7CiBpbnQgb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgdTMyIGJpdHNfd2FudGVkLAogCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYyk7CiAKIGludCBvY2ZzMl9jbGFpbV9tZXRhZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSBoYW5kbGVfdCAqaGFuZGxlLAogCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKIAkJCSB1MzIgYml0c193YW50ZWQsCiAJCQkgdTE2ICpzdWJhbGxvY19iaXRfc3RhcnQsCiAJCQkgdTMyICpudW1fYml0cywKIAkJCSB1NjQgKmJsa25vX3N0YXJ0KTsKIGludCBvY2ZzMl9jbGFpbV9uZXdfaW5vZGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCiAJCQkgIHUxNiAqc3ViYWxsb2NfYml0LAogCQkJICB1NjQgKmZlX2Jsa25vKTsKIGludCBvY2ZzMl9jbGFpbV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSBoYW5kbGVfdCAqaGFuZGxlLAogCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKIAkJCSB1MzIgbWluX2NsdXN0ZXJzLAogCQkJIHUzMiAqY2x1c3Rlcl9zdGFydCwKIAkJCSB1MzIgKm51bV9jbHVzdGVycyk7CiAKLWludCBvY2ZzMl9mcmVlX2Rpbm9kZShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLAogCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSk7Ci1pbnQgb2NmczJfZnJlZV9leHRlbnRfYmxvY2soc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmViX2FsbG9jX2lub2RlLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYWxsb2NfYmgsCiAJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpOwotaW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgb2NmczJfZnJlZV9jbHVzdGVycyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICpiaXRtYXBfaW5vZGUsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCwKIAkJCXU2NCBzdGFydF9ibGssCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCA3NmI0NmViLi5iMDk5MjU3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTcwLDggKzcwLDYgQEAKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqb2NmczJfaW5vZGVfY2FjaGVwID0gTlVMTDsKIAota21lbV9jYWNoZV90ICpvY2ZzMl9sb2NrX2NhY2hlID0gTlVMTDsKLQogLyogT0NGUzIgbmVlZHMgdG8gc2NoZWR1bGUgc2V2ZXJhbCBkaWZmZXJudCB0eXBlcyBvZiB3b3JrIHdoaWNoCiAgKiByZXF1aXJlIGNsdXN0ZXIgbG9ja2luZywgZGlzayBJL08sIHJlY292ZXJ5IHdhaXRzLCBldGMuIFNpbmNlIHRoZXNlCiAgKiB0eXBlcyBvZiB3b3JrIHRlbmQgdG8gYmUgaGVhdnkgd2UgYXZvaWQgdXNpbmcgdGhlIGtlcm5lbCBldmVudHMKQEAgLTE0MSw2ICsxMzksNyBAQAogCU9wdF9oYl9sb2NhbCwKIAlPcHRfZGF0YV9vcmRlcmVkLAogCU9wdF9kYXRhX3dyaXRlYmFjaywKKwlPcHRfYXRpbWVfcXVhbnR1bSwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTU0LDYgKzE1Myw3IEBACiAJe09wdF9oYl9sb2NhbCwgT0NGUzJfSEJfTE9DQUx9LAogCXtPcHRfZGF0YV9vcmRlcmVkLCAiZGF0YT1vcmRlcmVkIn0sCiAJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCisJe09wdF9hdGltZV9xdWFudHVtLCAiYXRpbWVfcXVhbnR1bT0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtNzA3LDYgKzcwNyw3IEBACiAJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CiAJCWludCB0b2tlbiwgb3B0aW9uOwogCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCXN0cnVjdCBvY2ZzMl9zdXBlciAqIG9zYiA9IE9DRlMyX1NCKHNiKTsKIAogCQlpZiAoISpwKQogCQkJY29udGludWU7CkBAIC03NDcsNiArNzQ4LDE2IEBACiAJCWNhc2UgT3B0X2RhdGFfd3JpdGViYWNrOgogCQkJKm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9EQVRBX1dSSVRFQkFDSzsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9hdGltZV9xdWFudHVtOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpIHsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChvcHRpb24gPj0gMCkKKwkJCQlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IG9wdGlvbjsKKwkJCWVsc2UKKwkJCQlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IE9DRlMyX0RFRkFVTFRfQVRJTUVfUVVBTlRVTTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJbWxvZyhNTF9FUlJPUiwKIAkJCSAgICAgIlVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKQEAgLTg2Nyw3ICs4NzgsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAmYmgsIDApOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmJoLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTkxNCw5ICs5MjUsNyBAQAogCQlvaS0+aXBfb3Blbl9jb3VudCA9IDA7CiAJCXNwaW5fbG9ja19pbml0KCZvaS0+aXBfbG9jayk7CiAJCW9jZnMyX2V4dGVudF9tYXBfaW5pdCgmb2ktPnZmc19pbm9kZSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZvaS0+aXBfaGFuZGxlX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmb2ktPmlwX2lvX21hcmtlcnMpOwotCQlvaS0+aXBfaGFuZGxlID0gTlVMTDsKIAkJb2ktPmlwX2NyZWF0ZWRfdHJhbnMgPSAwOwogCQlvaS0+aXBfbGFzdF90cmFucyA9IDA7CiAJCW9pLT5pcF9kaXJfc3RhcnRfbG9va3VwID0gMDsKQEAgLTk0OCwxNCArOTU3LDYgQEAKIAlpZiAoIW9jZnMyX2lub2RlX2NhY2hlcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlvY2ZzMl9sb2NrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoIm9jZnMyX2xvY2siLAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfam91cm5hbF9sb2NrKSwKLQkJCQkJICAgICAwLAotCQkJCQkgICAgIFNMQUJfSFdDQUNIRV9BTElHTiwKLQkJCQkJICAgICBOVUxMLCBOVUxMKTsKLQlpZiAoIW9jZnMyX2xvY2tfY2FjaGUpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2MywxMSArOTY0LDggQEAKIHsKIAlpZiAob2NmczJfaW5vZGVfY2FjaGVwKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kob2NmczJfaW5vZGVfY2FjaGVwKTsKLQlpZiAob2NmczJfbG9ja19jYWNoZSkKLQkJa21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX2xvY2tfY2FjaGUpOwogCiAJb2NmczJfaW5vZGVfY2FjaGVwID0gTlVMTDsKLQlvY2ZzMl9sb2NrX2NhY2hlID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBvY2ZzMl9nZXRfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xMjgwLDYgKzEyNzgsOCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9zYi0+Y2hlY2twb2ludF9ldmVudCk7CiAJYXRvbWljX3NldCgmb3NiLT5uZWVkc19jaGVja3BvaW50LCAwKTsKIAorCW9zYi0+c19hdGltZV9xdWFudHVtID0gT0NGUzJfREVGQVVMVF9BVElNRV9RVUFOVFVNOworCiAJb3NiLT5ub2RlX251bSA9IE8yTk1fSU5WQUxJRF9OT0RFX05VTTsKIAlvc2ItPnNsb3RfbnVtID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zeW1saW5rLmMgYi9mcy9vY2ZzMi9zeW1saW5rLmMKaW5kZXggYzBmNjhhYS4uOTU3ZDY4NyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ltbGluay5jCisrKyBiL2ZzL29jZnMyL3N5bWxpbmsuYwpAQCAtMTI2LDYgKzEyNiwxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwkvKgorCSAqIFdpdGhvdXQgdmZzbW91bnQgd2UgY2FuJ3QgdXBkYXRlIGF0aW1lIG5vdywKKwkgKiBidXQgd2Ugd2lsbCB1cGRhdGUgYXRpbWUgaGVyZSB1bHRpbWF0ZWx5LgorCSAqLwogCXJldCA9IHZmc19yZWFkbGluayhkZW50cnksIGJ1ZmZlciwgYnVmbGVuLCBsaW5rKTsKIAogCWJyZWxzZShiaCk7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL21hYy5jIGIvZnMvcGFydGl0aW9ucy9tYWMuYwppbmRleCBjMDg3MTAwLi5kNGEwZmFkIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL21hYy5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvbWFjLmMKQEAgLTc0LDYgKzc0LDggQEAKIAkJCWJlMzJfdG9fY3B1KHBhcnQtPnN0YXJ0X2Jsb2NrKSAqIChzZWNzaXplLzUxMiksCiAJCQliZTMyX3RvX2NwdShwYXJ0LT5ibG9ja19jb3VudCkgKiAoc2Vjc2l6ZS81MTIpKTsKIAorCQlpZiAoIXN0cm5pY21wKHBhcnQtPnR5cGUsICJMaW51eF9SQUlEIiwgMTApKQorCQkJc3RhdGUtPnBhcnRzW3Nsb3RdLmZsYWdzID0gMTsKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAkJLyoKIAkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYm9vdGFibGUgcGFydGl0aW9uLCB0ZWxsIHRoZQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA4ZGYyNzQwMS4uNzk1MzE5YyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTQ0Miw3ICs0NDIsOCBAQAogCiAJCWlmICh0YXNrKSB7CiAJCQl0YXNrX2xvY2sodGFzayk7Ci0JCQluYW1lc3BhY2UgPSB0YXNrLT5uc3Byb3h5LT5uYW1lc3BhY2U7CisJCQlpZiAodGFzay0+bnNwcm94eSkKKwkJCQluYW1lc3BhY2UgPSB0YXNrLT5uc3Byb3h5LT5uYW1lc3BhY2U7CiAJCQlpZiAobmFtZXNwYWNlKQogCQkJCWdldF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKIAkJCXRhc2tfdW5sb2NrKHRhc2spOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9yb290LmMgYi9mcy9wcm9jL3Jvb3QuYwppbmRleCBmZmU2NmMzLi42NGQyNDJiNiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9yb290LmMKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maWxlLmMgYi9mcy9yZWlzZXJmcy9maWxlLmMKaW5kZXggYjY3Y2U5MzUuLmFjMTQzMTggMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2ZpbGUuYworKysgYi9mcy9yZWlzZXJmcy9maWxlLmMKQEAgLTc0LDcgKzc0LDggQEAKIAkJCWlncmFiKGlub2RlKTsKIAkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCiAJCQkJCSAicGlubmluZyBpbm9kZSAlbHUgYmVjYXVzZSB0aGUgIgotCQkJCQkgInByZWFsbG9jYXRpb24gY2FuJ3QgYmUgZnJlZWQiKTsKKwkJCQkJICJwcmVhbGxvY2F0aW9uIGNhbid0IGJlIGZyZWVkIiwKKwkJCQkJIGlub2RlLT5pX2lubyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwppbmRleCA4NWNlMjMyLi5hYzkzMTc0IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMKKysrIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCkBAIC0xNDY0LDcgKzE0NjQsNyBAQAogCQl9CiAKIAkJLyogaWYgc29tZW9uZSBoYXMgdGhpcyBibG9jayBpbiBhIG5ld2VyIHRyYW5zYWN0aW9uLCBqdXN0IG1ha2UKLQkJICoqIHN1cmUgdGhleSBhcmUgY29tbWl0ZWQsIGFuZCBkb24ndCB0cnkgd3JpdGluZyBpdCB0byBkaXNrCisJCSAqKiBzdXJlIHRoZXkgYXJlIGNvbW1pdHRlZCwgYW5kIGRvbid0IHRyeSB3cml0aW5nIGl0IHRvIGRpc2sKIAkJICovCiAJCWlmIChwamwpIHsKIAkJCWlmIChhdG9taWNfcmVhZCgmcGpsLT5qX2NvbW1pdF9sZWZ0KSkKQEAgLTMzODQsNyArMzM4NCw3IEBACiAKIC8qCiAqKiBmb3IgYW55IGNub2RlIGluIGEgam91cm5hbCBsaXN0LCBpdCBjYW4gb25seSBiZSBkaXJ0aWVkIG9mIGFsbCB0aGUKLSoqIHRyYW5zYWN0aW9ucyB0aGF0IGluY2x1ZGUgaXQgYXJlIGNvbW1pdGVkIHRvIGRpc2suCisqKiB0cmFuc2FjdGlvbnMgdGhhdCBpbmNsdWRlIGl0IGFyZSBjb21taXR0ZWQgdG8gZGlzay4KICoqIHRoaXMgY2hlY2tzIHRocm91Z2ggZWFjaCB0cmFuc2FjdGlvbiwgYW5kIHJldHVybnMgMSBpZiB5b3UgYXJlIGFsbG93ZWQgdG8gZGlydHksCiAqKiBhbmQgMCBpZiB5b3UgYXJlbid0CiAqKgpAQCAtMzQyNiw3ICszNDI2LDcgQEAKIH0KIAogLyogc3luY3MgdGhlIGNvbW1pdCBibG9ja3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSB0aGUgcmVhbCBidWZmZXJzIHRvIGRpc2sKLSoqIHdpbGwgd2FpdCB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBkb25lL2NvbW1pdGVkIGJlZm9yZSByZXR1cm5pbmcgCisqKiB3aWxsIHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgZG9uZS9jb21taXR0ZWQgYmVmb3JlIHJldHVybmluZyAKICovCiBpbnQgam91cm5hbF9lbmRfc3luYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKIAkJICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHIuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKaW5kZXggN2JkYjBlZC4uMWU0ZDY4NSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHIuYworKysgYi9mcy9yZWlzZXJmcy94YXR0ci5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDQ3ZTU1NGMuLjg0YzMyMGYgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtMjIxLDYgKzIyMSwyNCBAQAogfQogCiAvKgorICogU3VwZXJibG9jayBsb2NraW5nLiAgV2UgcmVhbGx5IG91Z2h0IHRvIGdldCByaWQgb2YgdGhlc2UgdHdvLgorICovCit2b2lkIGxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJZ2V0X2ZzX2V4Y2woKTsKKwltdXRleF9sb2NrKCZzYi0+c19sb2NrKTsKK30KKwordm9pZCB1bmxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJcHV0X2ZzX2V4Y2woKTsKKwltdXRleF91bmxvY2soJnNiLT5zX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGxvY2tfc3VwZXIpOworRVhQT1JUX1NZTUJPTCh1bmxvY2tfc3VwZXIpOworCisvKgogICogV3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYWxsIGRpcnR5IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMKICAqIHN1cGVyYmxvY2suICBGaWxlc3lzdGVtIGRhdGEgYXMgd2VsbCBhcyB0aGUgdW5kZXJseWluZyBibG9jawogICogZGV2aWNlLiAgVGFrZXMgdGhlIHN1cGVyYmxvY2sgbG9jay4gIFJlcXVpcmVzIGEgc2Vjb25kIGJsa2RldgpkaWZmIC0tZ2l0IGEvZnMvc3luYy5jIGIvZnMvc3luYy5jCmluZGV4IDFkZTc0N2IuLjg2NWYzMmJlIDEwMDY0NAotLS0gYS9mcy9zeW5jLmMKKysrIGIvZnMvc3luYy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IDNhYTM0MzQuLmE1NzgyZTggMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2Rpci5jCisrKyBiL2ZzL3N5c2ZzL2Rpci5jCkBAIC0zNzIsNiArMzcyLDUxIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitpbnQgc3lzZnNfbW92ZV9kaXIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqZWN0ICpuZXdfcGFyZW50KQoreworCXN0cnVjdCBkZW50cnkgKm9sZF9wYXJlbnRfZGVudHJ5LCAqbmV3X3BhcmVudF9kZW50cnksICpuZXdfZGVudHJ5OworCXN0cnVjdCBzeXNmc19kaXJlbnQgKm5ld19wYXJlbnRfc2QsICpzZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW5ld19wYXJlbnQpCisJCXJldHVybiAtRUlOVkFMOworCisJb2xkX3BhcmVudF9kZW50cnkgPSBrb2JqLT5wYXJlbnQgPworCQlrb2JqLT5wYXJlbnQtPmRlbnRyeSA6IHN5c2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKwluZXdfcGFyZW50X2RlbnRyeSA9IG5ld19wYXJlbnQtPmRlbnRyeTsKKworYWdhaW46CisJbXV0ZXhfbG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCWlmICghbXV0ZXhfdHJ5bG9jaygmbmV3X3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpKSB7CisJCW11dGV4X3VubG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlnb3RvIGFnYWluOworCX0KKworCW5ld19wYXJlbnRfc2QgPSBuZXdfcGFyZW50X2RlbnRyeS0+ZF9mc2RhdGE7CisJc2QgPSBrb2JqLT5kZW50cnktPmRfZnNkYXRhOworCisJbmV3X2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGtvYmotPm5hbWUsIG5ld19wYXJlbnRfZGVudHJ5LAorCQkJCSAgICBzdHJsZW4oa29iai0+bmFtZSkpOworCWlmIChJU19FUlIobmV3X2RlbnRyeSkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKG5ld19kZW50cnkpOworCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJZXJyb3IgPSAwOworCWRfYWRkKG5ld19kZW50cnksIE5VTEwpOworCWRfbW92ZShrb2JqLT5kZW50cnksIG5ld19kZW50cnkpOworCWRwdXQobmV3X2RlbnRyeSk7CisKKwkvKiBSZW1vdmUgZnJvbSBvbGQgcGFyZW50J3MgbGlzdCBhbmQgaW5zZXJ0IGludG8gbmV3IHBhcmVudCdzIGxpc3QuICovCisJbGlzdF9kZWxfaW5pdCgmc2QtPnNfc2libGluZyk7CisJbGlzdF9hZGQoJnNkLT5zX3NpYmxpbmcsICZuZXdfcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbmV3X3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X3VubG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgaW50IHN5c2ZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCAyOTgzMDNiLi45NWMxNjUxIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0xOTAsNiArMTkwLDkgQEAKIAkJY291bnQgPSBQQUdFX1NJWkUgLSAxOwogCWVycm9yID0gY29weV9mcm9tX3VzZXIoYnVmZmVyLT5wYWdlLGJ1Zixjb3VudCk7CiAJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOworCS8qIGlmIGJ1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYSBzdHJpbmcsIHRlcm1pbmF0ZSBpdCBieSBcMCwKKwkgICBzbyBlLmcuIHNzY2FuZigpIGNhbiBzY2FuIHRoZSBzdHJpbmcgZWFzaWx5ICovCisJYnVmZmVyLT5wYWdlW2NvdW50XSA9IDA7CiAJcmV0dXJuIGVycm9yID8gLUVGQVVMVCA6IGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9mcy91dGltZXMuYyBiL2ZzL3V0aW1lcy5jCmluZGV4IDFiY2Q4NTJmLi45OWNmMmNiIDEwMDY0NAotLS0gYS9mcy91dGltZXMuYworKysgYi9mcy91dGltZXMuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdXRpbWUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggZjMzOGU0MC4uZmRkMTA5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTM1Nyw3ICszNTcsNyBAQAogLyogaGVscGVyICovCiBhY3BpX2hhbmRsZSBhY3BpX2dldF9jaGlsZChhY3BpX2hhbmRsZSwgYWNwaV9pbnRlZ2VyKTsKIGFjcGlfaGFuZGxlIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci0jZGVmaW5lIERFVklDRV9BQ1BJX0hBTkRMRShkZXYpICgoYWNwaV9oYW5kbGUpKChkZXYpLT5maXJtd2FyZV9kYXRhKSkKKyNkZWZpbmUgREVWSUNFX0FDUElfSEFORExFKGRldikgKChhY3BpX2hhbmRsZSkoKGRldiktPmFyY2hkYXRhLmFjcGlfaGFuZGxlKSkKIAogI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9jaGVja3N1bS5oCmluZGV4IGE1YzlmMDguLmQzODU0YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvY2hlY2tzdW0uaApAQCAtNywyMSArNywyMCBAQAogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAogICoJd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK2V4dGVybiBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpOwogCiAvKgogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK2V4dGVybiBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKTsKKwkJCQkJICAgX193c3VtIHN1bSk7CiAKLXVuc2lnbmVkIGludCBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKK19fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQl1bnNpZ25lZCBpbnQgc3VtKTsKKwkJCQlfX3dzdW0gc3VtKTsKIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLApAQCAtMzUsNyArMzQsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtNDQsOSArNDMsOSBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJwKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycnApOwogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIAogLyoKQEAgLTU0LDI0ICs1MywyMyBAQAogICogaW4gaWNtcC5jCiAgKi8KIAotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbik7CitleHRlcm4gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbik7CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bSB3aXRob3V0IGFkZGluZyBwc2V1ZG8gaGVhZGVycwogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBjc3VtKQogeworCXUzMiBzdW0gPSAoX19mb3JjZSB1MzIpY3N1bTsKIAlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOwogCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7Ci0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UzMiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdW0pOwotCitleHRlcm4gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJICAgICAgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkgICAgICAgX193c3VtIHN1bSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2RldmljZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2ExMTAvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2ExMTAvaW8uaAppbmRleCBhZTA0ODQ0Li43MjJjNWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMTEwL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTExMC9pby5oCkBAIC0yNyw5ICsyNyw5IEBACiB1MzIgX19pbmwodW5zaWduZWQgaW50IHBvcnQpOwogdm9pZCBfX291dGwodTMyIHZhbCwgdW5zaWduZWQgaW50IHBvcnQpOwogCi11OCAgX19yZWFkYih2b2lkIF9faW9tZW0gKmFkZHIpOwotdTE2IF9fcmVhZHcodm9pZCBfX2lvbWVtICphZGRyKTsKLXUzMiBfX3JlYWRsKHZvaWQgX19pb21lbSAqYWRkcik7Cit1OCAgX19yZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwordTE2IF9fcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKK3UzMiBfX3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKIHZvaWQgX193cml0ZWIodTggIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKIHZvaWQgX193cml0ZXcodTE2IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKQEAgLTY0LDggKzY0LDE0IEBACiAjZGVmaW5lIHdyaXRldyh2LGIpCQlfX3dyaXRldyh2LGIpCiAjZGVmaW5lIHdyaXRlbCh2LGIpCQlfX3dyaXRlbCh2LGIpCiAKLSNkZWZpbmUgX19hcmNoX2lvcmVtYXAoY29va2llLHN6LGMpCSgodm9pZCBfX2lvbWVtICopKGNvb2tpZSkpCi0jZGVmaW5lIF9fYXJjaF9pb3VubWFwKGNvb2tpZSkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX2FyY2hfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGNvb2tpZSwgc2l6ZV90IHNpemUsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWNvb2tpZTsKK30KKworI2RlZmluZSBfX2FyY2hfaW9yZW1hcAkJX19hcmNoX2lvcmVtYXAKKyNkZWZpbmUgX19hcmNoX2lvdW5tYXAoY29va2llKQlkbyB7IH0gd2hpbGUgKDApCiAKIGV4dGVybiB2b2lkIGluc2IodW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKmJ1ZiwgaW50IHN6KTsKIGV4dGVybiB2b2lkIGluc3codW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKmJ1ZiwgaW50IHN6KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKaW5kZXggOGQxMGE5MS4uYWIxOTRlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKQEAgLTg2LDYgKzg2LDE5IEBACiAJdW5zaWduZWQgbG9uZyBzY2xfcGluOwogfTsKIAorLyoKKyAqIFRoaXMgc3RydWN0dXJlIHByb3ZpZGUgYSBtZWFucyBmb3IgdGhlIGJvYXJkIHNldHVwIGNvZGUKKyAqIHRvIGdpdmUgaW5mb3JtYXRpb24gdG8gdGggcGF0YV9peHA0eHggZHJpdmVyLiBJdCBpcworICogcGFzc2VkIGFzIHBsYXRmb3JtX2RhdGEuCisgKi8KK3N0cnVjdCBpeHA0eHhfcGF0YV9kYXRhIHsKKwl2b2xhdGlsZSB1MzIJKmNzMF9jZmc7CisJdm9sYXRpbGUgdTMyCSpjczFfY2ZnOworCXVuc2lnbmVkIGxvbmcJY3MwX2JpdHM7CisJdW5zaWduZWQgbG9uZwljczFfYml0czsKKwl2b2lkIF9faW9tZW0JKmNzMDsKKwl2b2lkIF9faW9tZW0JKmNzMTsKK307CiAKIHN0cnVjdCBzeXNfdGltZXI7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS91ZGMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS91ZGMuaAppbmRleCAxMjFjZDI0Li42NDY0ODBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvdWRjLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3VkYy5oCkBAIC00LDIzICs0LDggQEAKICAqIFRoaXMgc3VwcG9ydHMgbWFjaGluZS1zcGVjaWZpYyBkaWZmZXJlbmNlcyBpbiBob3cgdGhlIFBYQTJ4eAogICogVVNCIERldmljZSBDb250cm9sbGVyIChVREMpIGlzIHdpcmVkLgogICoKLSAqIEl0IGlzIHNldCBpbiBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS88bWFjaGluZT4uYyBhbmQgdXNlZCBpbgotICogdGhlIHByb2JlIHJvdXRpbmUgb2YgbGludXgvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwogICovCi1zdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gewotICAgICAgICBpbnQgICgqdWRjX2lzX2Nvbm5lY3RlZCkodm9pZCk7CQkvKiBkbyB3ZSBzZWUgaG9zdD8gKi8KLSAgICAgICAgdm9pZCAoKnVkY19jb21tYW5kKShpbnQgY21kKTsKLSNkZWZpbmUJUFhBMlhYX1VEQ19DTURfQ09OTkVDVAkJMAkvKiBsZXQgaG9zdCBzZWUgdXMgKi8KLSNkZWZpbmUJUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVAkxCS8qIHNvIGhvc3Qgd29uJ3Qgc2VlIHVzICovCi0KLQkvKiBCb2FyZHMgZm9sbG93aW5nIHRoZSBkZXNpZ24gZ3VpZGVsaW5lcyBpbiB0aGUgZGV2ZWxvcGVyJ3MgbWFudWFsLAotCSAqIHdpdGggb24tY2hpcCBHUElPcyBub3QgTHViYm9jaydzIHdpZXJkIGhhcmR3YXJlLCBjYW4gaGF2ZSBhIHNhbmUKLQkgKiBWQlVTIElSUSBhbmQgb21pdCB0aGUgbWV0aG9kcyBhYm92ZS4gIFN0b3JlIHRoZSBHUElPIG51bWJlcgotCSAqIGhlcmU7IGZvciBHUElPIDAsIGFsc28gbWFzayBpbiBvbmUgb2YgdGhlIHB4YV9ncGlvX21vZGUoKSBiaXRzLgotCSAqLwotCXUxNglncGlvX3ZidXM7CQkJLyogaGlnaCA9PSB2YnVzIHByZXNlbnQgKi8KLQl1MTYJZ3Bpb19wdWxsdXA7CQkJLyogaGlnaCA9PSBwdWxsdXAgYWN0aXZhdGVkICovCi19OworI2luY2x1ZGUgPGFzbS9tYWNoL3VkY19weGEyeHguaD4KIAogZXh0ZXJuIHZvaWQgcHhhX3NldF91ZGNfaW5mbyhzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gKmluZm8pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWFybS9jaGVja3N1bS5oCmluZGV4IDc0N2JkZDMuLjhjMGJiNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9jaGVja3N1bS5oCkBAIC0yMyw3ICsyMyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMzMsMjYgKzMzLDE4IEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSk7CitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cik7Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBvbGQgKGFuZCB1bnNhZmUpIHdheSBvZiBkb2luZyBjaGVja3N1bXMsIGEgd2FybmluZyBtZXNzYWdlIHdpbGwKLSAqIGJlIHByaW50ZWQgaWYgaXQgaXMgdXNlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3Vycy4KLSAqCi0gKiB0aGlzIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhZnRlciBzb21lIHRpbWUuCi0gKi8KLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHkoc3JjLGRzdCxsZW4sc3VtKQljc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYyxkc3QsbGVuLHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKIAogLyoKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKLWlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2CitpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW0sIHRtcDE7CiAKQEAgLTc4LDE0ICs3MCwxMyBAQAogCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKSwgIj1yIiAodG1wMSkKIAk6ICIxIiAoaXBoKSwgIjIiIChpaGwpCiAJOiAiY2MiLCAibWVtb3J5Iik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCiAgKiAJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0gd2l0aG91dCBhZGRpbmcgcHNldWRvIGhlYWRlcnMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJImFkZHMJJTAsICUxLCAlMSwgbHNsICMxNglAIGNzdW1fZm9sZAkJXG5cCkBAIC05MywyMSArODQsMjUgQEAKIAk6ICI9ciIgKHN1bSkKIAk6ICJyIiAoc3VtKQogCTogImNjIik7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgaW50IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTIJCUAgY3N1bV90Y3B1ZHBfbm9mb2xkCVxuXAotCWFkY3MJJTAsICUwLCAlMwkJCQkJXG5cCi0JYWRjcwklMCwgJTAsICU0CQkJCQlcblwKLQlhZGNzCSUwLCAlMCwgJTUJCQkJCVxuXAorCWFkY3MJJTAsICUwLCAlMwkJCQkJXG4iCisjaWZkZWYgX19BUk1FQl9fCisJImFkY3MJJTAsICUwLCAlNAkJCQkJXG4iCisjZWxzZQorCSJhZGNzCSUwLCAlMCwgJTQsIGxzbCAjOAkJCQlcbiIKKyNlbmRpZgorCSJhZGNzCSUwLCAlMCwgJTUJCQkJCVxuXAogCWFkYwklMCwgJTAsICMwIgogCTogIj0mciIoc3VtKQotCTogInIiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAobnRvaHMobGVuKSksICJJciIgKG50b2hzKHByb3RvKSkKKwk6ICJyIiAoc3VtKSwgInIiIChkYWRkciksICJyIiAoc2FkZHIpLCAiciIgKGxlbiksICJJciIgKGh0b25zKHByb3RvKSkKIAk6ICJjYyIpOwogCXJldHVybiBzdW07CiB9CQpAQCAtMTE1LDIzICsxMTAsMjcgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIGludCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTIJCUAgY3N1bV90Y3B1ZHBfbWFnaWMJXG5cCi0JYWRjcwklMCwgJTAsICUzCQkJCQlcblwKLQlhZGNzCSUwLCAlMCwgJTQJCQkJCVxuXAotCWFkY3MJJTAsICUwLCAlNQkJCQkJXG5cCisJYWRjcwklMCwgJTAsICUzCQkJCQlcbiIKKyNpZmRlZiBfX0FSTUVCX18KKwkiYWRjcwklMCwgJTAsICU0CQkJCQlcbiIKKyNlbHNlCisJImFkY3MJJTAsICUwLCAlNCwgbHNsICM4CQkJCVxuIgorI2VuZGlmCisJImFkY3MJJTAsICUwLCAlNQkJCQkJXG5cCiAJYWRjCSUwLCAlMCwgIzAJCQkJCVxuXAogCWFkZHMJJTAsICUwLCAlMCwgbHNsICMxNgkJCQlcblwKIAlhZGRjcwklMCwgJTAsICMweDEwMDAwCQkJCVxuXAogCW12bgklMCwgJTAiCiAJOiAiPSZyIihzdW0pCi0JOiAiciIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiIChudG9ocyhsZW4pKSwgIklyIiAobnRvaHMocHJvdG8pKQorCTogInIiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAobGVuKSwgIklyIiAoaHRvbnMocHJvdG8pKQogCTogImNjIik7Ci0JcmV0dXJuIHN1bSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikoKF9fZm9yY2UgdTMyKXN1bSA+PiAxNik7CiB9CiAKIApAQCAtMTM5LDIwICsxMzgsMjAgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1pcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2lwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1leHRlcm4gdW5zaWduZWQgbG9uZwotX19jc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX191MzIgbGVuLAotCQlfX3UzMiBwcm90bywgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtCitfX2NzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX2JlMzIgbGVuLAorCQlfX2JlMzIgcHJvdG8sIF9fd3N1bSBzdW0pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIF9fdTMyIGxlbiwKLQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX3UzMiBsZW4sCisJCXVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoX19jc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBodG9ubChsZW4pLAogCQkJCQkgICBodG9ubChwcm90byksIHN1bSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2RldmljZS5oIGIvaW5jbHVkZS9hc20tYXJtL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1hcm0vZG1hLW1hcHBpbmcuaAppbmRleCA1NWViNGRjLi42NjY2MTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZG1hLW1hcHBpbmcuaApAQCAtMTIsNiArMTIsMTAgQEAKICAqIHVuY2FjaGVkLCB1bndyaXRlLWJ1ZmZlcmVkIG1hcHBlZCBtZW1vcnkgc3BhY2UgZm9yIHVzZSB3aXRoIERNQQogICogZGV2aWNlcy4gIFRoaXMgaXMgdGhlICJnZW5lcmljIiB2ZXJzaW9uLiAgVGhlIFBDSSBzcGVjaWZpYyB2ZXJzaW9uCiAgKiBpcyBpbiBwY2kuaAorICoKKyAqIE5vdGU6IERyaXZlcnMgc2hvdWxkIE5PVCB1c2UgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgYXMgaXQgd2lsbCBicmVhaworICogcGxhdGZvcm1zIHdpdGggQ09ORklHX0RNQUJPVU5DRS4KKyAqIFVzZSB0aGUgZHJpdmVyIERNQSBzdXBwb3J0IC0gc2VlIGRtYS1tYXBwaW5nLmggKGRtYV9zeW5jXyopCiAgKi8KIGV4dGVybiB2b2lkIGNvbnNpc3RlbnRfc3luYyh2b2lkICprYWRkciwgc2l6ZV90IHNpemUsIGludCBydyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL3VkY19weGEyeHguaCBiL2luY2x1ZGUvYXNtLWFybS9tYWNoL3VkY19weGEyeHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjBhOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvdWRjX3B4YTJ4eC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vbWFjaC91ZGNfcHhhMnh4LmgKKyAqCisgKiBUaGlzIHN1cHBvcnRzIG1hY2hpbmUtc3BlY2lmaWMgZGlmZmVyZW5jZXMgaW4gaG93IHRoZSBQWEEyeHgKKyAqIFVTQiBEZXZpY2UgQ29udHJvbGxlciAoVURDKSBpcyB3aXJlZC4KKyAqCisgKiBJdCBpcyBzZXQgaW4gbGludXgvYXJjaC9hcm0vbWFjaC1weGEvPG1hY2hpbmU+LmMgb3IgaW4KKyAqIGxpbnV4L2FyY2gvbWFjaC1peHA0eHgvPG1hY2hpbmU+LmMgYW5kIHVzZWQgaW4KKyAqIHRoZSBwcm9iZSByb3V0aW5lIG9mIGxpbnV4L2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKKyAqLworCitzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8geworICAgICAgICBpbnQgICgqdWRjX2lzX2Nvbm5lY3RlZCkodm9pZCk7CQkvKiBkbyB3ZSBzZWUgaG9zdD8gKi8KKyAgICAgICAgdm9pZCAoKnVkY19jb21tYW5kKShpbnQgY21kKTsKKyNkZWZpbmUJUFhBMlhYX1VEQ19DTURfQ09OTkVDVAkJMAkvKiBsZXQgaG9zdCBzZWUgdXMgKi8KKyNkZWZpbmUJUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVAkxCS8qIHNvIGhvc3Qgd29uJ3Qgc2VlIHVzICovCisKKwkvKiBCb2FyZHMgZm9sbG93aW5nIHRoZSBkZXNpZ24gZ3VpZGVsaW5lcyBpbiB0aGUgZGV2ZWxvcGVyJ3MgbWFudWFsLAorCSAqIHdpdGggb24tY2hpcCBHUElPcyBub3QgTHViYm9jaydzIHdpZXJkIGhhcmR3YXJlLCBjYW4gaGF2ZSBhIHNhbmUKKwkgKiBWQlVTIElSUSBhbmQgb21pdCB0aGUgbWV0aG9kcyBhYm92ZS4gIFN0b3JlIHRoZSBHUElPIG51bWJlcgorCSAqIGhlcmU7IGZvciBHUElPIDAsIGFsc28gbWFzayBpbiBvbmUgb2YgdGhlIHB4YV9ncGlvX21vZGUoKSBiaXRzLgorCSAqLworCXUxNglncGlvX3ZidXM7CQkJLyogaGlnaCA9PSB2YnVzIHByZXNlbnQgKi8KKwl1MTYJZ3Bpb19wdWxsdXA7CQkJLyogaGlnaCA9PSBwdWxsdXAgYWN0aXZhdGVkICovCit9OworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvY2hlY2tzdW0uaAppbmRleCBkNDI1NmQ1Li5mMmI0YjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2NoZWNrc3VtLmgKQEAgLTIzLDcgKzIzLDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CkBAIC0zMywyNiArMzMsMTggQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtKTsKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKTsKLQotLyoKLSAqIFRoaXMgaXMgdGhlIG9sZCAoYW5kIHVuc2FmZSkgd2F5IG9mIGRvaW5nIGNoZWNrc3VtcywgYSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbAotICogYmUgcHJpbnRlZCBpZiBpdCBpcyB1c2VkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJzLgotICoKLSAqIHRoaXMgZnVuY3Rpb25zIHNob3VsZCBnbyBhd2F5IGFmdGVyIHNvbWUgdGltZS4KLSAqLwotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weShzcmMsZHN0LGxlbixzdW0pCWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLGRzdCxsZW4sc3VtKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpOwogCiAvKgogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAogICoJd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2lwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bSwgdG1wMTsKIApAQCAtNzgsMTQgKzcwLDEzIEBACiAJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpLCAiPXIiICh0bXAxKQogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJjYyIpOwotCXJldHVybiBzdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCiAvKgogICogCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTEsIGxzbCAjMTYJQCBjc3VtX2ZvbGQJCVxuXApAQCAtOTMsMTIgKzg0LDEyIEBACiAJOiAiPXIiIChzdW0pCiAJOiAiciIgKHN1bSkKIAk6ICJjYyIpOwotCXJldHVybiAofnN1bSkgPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKH4oX19mb3JjZSB1MzIpc3VtID4+IDE2KTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgIHVuc2lnbmVkIGludCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkiYWRkcwklMCwgJTEsICUyCQlAIGNzdW1fdGNwdWRwX25vZm9sZAlcblwKQEAgLTEwNyw3ICs5OCw3IEBACiAJYWRjcwklMCwgJTAsICU1CQkJCQlcblwKIAlhZGMJJTAsICUwLCAjMCIKIAk6ICI9JnIiKHN1bSkKLQk6ICJyIiAoc3VtKSwgInIiIChkYWRkciksICJyIiAoc2FkZHIpLCAiciIgKG50b2hzKGxlbikpLCAiSXIiIChudG9ocyhwcm90bykpCisJOiAiciIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiIChodG9ucyhsZW4pKSwgIklyIiAoaHRvbnMocHJvdG8pKQogCTogImNjIik7CiAJcmV0dXJuIHN1bTsKIH0JCkBAIC0xMTUsOSArMTA2LDkgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIGludCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTIJCUAgY3N1bV90Y3B1ZHBfbWFnaWMJXG5cCkBAIC0xMjksOSArMTIwLDkgQEAKIAlhZGRjcwklMCwgJTAsICMweDEwMDAwCQkJCVxuXAogCW12bgklMCwgJTAiCiAJOiAiPSZyIihzdW0pCi0JOiAiciIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiIChudG9ocyhsZW4pKSwgIklyIiAobnRvaHMocHJvdG8pKQorCTogInIiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAoaHRvbnMobGVuKSksICJJciIgKGh0b25zKHByb3RvKSkKIAk6ICJjYyIpOwotCXJldHVybiBzdW0gPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKChfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCiAKQEAgLTEzOSwyMCArMTMwLDIwIEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2CitpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcKLV9fY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIF9fdTMyIGxlbiwKLQkJX191MzIgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bQorX19jc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX19iZTMyIGxlbiwKKwkJX19iZTMyIHByb3RvLCBfX3dzdW0gc3VtKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKLWNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX3UzMiBsZW4sCi0JCXVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX191MzIgbGVuLAorCQl1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKF9fY3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgaHRvbmwobGVuKSwKIAkJCQkJICAgaHRvbmwocHJvdG8pLCBzdW0pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2RldmljZS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9jaGVja3N1bS5oCmluZGV4IDQxYjdhZjAuLmFmOWQ1M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvY2hlY2tzdW0uaApAQCAtMjAsOCArMjAsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLAotCQkJICB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTMwLDggKzI5LDggQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkJICAgICAgIGludCBzdW0sIGludCAqc3JjX2Vycl9wdHIsCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkgICAgICAgX193c3VtIHN1bSwgaW50ICpzcmNfZXJyX3B0ciwKIAkJCQkgICAgICAgaW50ICpkc3RfZXJyX3B0cik7CiAKIC8qCkBAIC00MiwxNyArNDEsMTcgQEAKICAqCXZlcmlmeV9hcmVhKCkuCiAgKi8KIHN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZQotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkgIGludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoY29uc3QgY2hhciBfX2ZvcmNlICopc3JjLCBkc3QsIGxlbiwKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoY29uc3Qgdm9pZCBfX2ZvcmNlICopc3JjLCBkc3QsIGxlbiwKIAkJCQkJIHN1bSwgZXJyX3B0ciwgTlVMTCk7CiB9CiAKQEAgLTYwLDggKzU5LDcgQEAKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmlwaCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bSwgdG1wOwogCkBAIC05MCwxNCArODgsMTQgQEAKIAkJOiAiPXIiKHN1bSksICI9ciIoaXBoKSwgIj1yIihpaGwpLCAiPXIiKHRtcCkKIAkJOiAiMSIoaXBoKSwgIjIiKGlobCkKIAkJOiAibWVtb3J5IiwgImNjIik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTEwOSwyMSArMTA3LDIwIEBACiAJICAgIDogIj0mciIoc3VtKSwgIj0mciIodG1wKQogCSAgICA6ICIwIihzdW0pKTsKIAotCXJldHVybiB+c3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCSAgICAgICBfX3dzdW0gc3VtKQogewogCWFzbSgiCWFkZAklMCwgJTFcbiIKIAkgICAgIglhZGMJJTAsICUwLCAlMlxuIgogCSAgICAiCWFkYwklMCwgJTAsICUzXG4iCiAJICAgICIJYWNyCSUwIgogCSAgICA6ICI9ciIoc3VtKQotCSAgICA6ICJyIihkYWRkciksICJyIihzYWRkciksICJyIihudG9ocyhsZW4pIHwgKHByb3RvIDw8IDE2KSksCisJICAgIDogInIiKGRhZGRyKSwgInIiKHNhZGRyKSwgInIiKGxlbiArIHByb3RvKSwKIAkgICAgICAiMCIoc3VtKQogCSAgICA6ICJjYyIpOwogCkBAIC0xMzQsMTEgKzEzMSwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xNDgsNyArMTQ0LDcgQEAKICAqIGluIGljbXAuYwogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogICAgIHJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3R5cGVzLmgKaW5kZXggM2Y0N2RiOS4uMmJmZjE1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi90eXBlcy5oCkBAIC01NywxMSArNTcsNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi0jaWZkZWYgQ09ORklHX0xCRAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2NoZWNrc3VtLmgKaW5kZXggNjMzZjIzNC4uYjgwMDBjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvY2hlY2tzdW0uaApAQCAtOCwxMSArOCwxMSBAQAogICogdG8gc3BsaXQgYWxsIG9mIHRob3NlIGludG8gMTYtYml0IGNvbXBvbmVudHMsIHRoZW4gYWRkLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7Ci0JaW50IHJlczsKKwlfX3dzdW0gcmVzOwogCV9fYXNtX18gKCJhZGQuZCAlMiwgJTBcblx0IgogCQkgImF4XG5cdCIKIAkJICJhZGQuZCAlMywgJTBcblx0IgpAQCAtMjEsNyArMjEsNyBAQAogCQkgImF4XG5cdCIKIAkJICJhZGRxIDAsICUwXG4iCiAJOiAiPXIiIChyZXMpCi0JOiAiMCIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiICgobnRvaHMobGVuKSA8PCAxNikgKyAocHJvdG8gPDwgOCkpKTsKKwk6ICIwIiAoc3VtKSwgInIiIChkYWRkciksICJyIiAoc2FkZHIpLCAiciIgKChsZW4gKyBwcm90bykgPDwgOCkpOwogCiAJcmV0dXJuIHJlczsKIH0JCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2NoZWNrc3VtLmgKaW5kZXggOTdlZjg5ZS4uZTVkY2ZjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvY2hlY2tzdW0uaApAQCAtOSwxMSArOSwxMSBAQAogICogY2hlY2tzdW0uIFdoaWNoIG1lYW5zIGl0IHdvdWxkIGJlIG5lY2Vzc2FyeSB0byBzcGxpdCBhbGwgdGhvc2UgaW50bwogICogMTYtYml0IGNvbXBvbmVudHMgYW5kIHRoZW4gYWRkLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewotCWludCByZXM7CisJX193c3VtIHJlczsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fICgiYWRkLmQgJTIsICUwXG5cdCIKIAkJCSAgICAgICJhZGRjICUzLCAlMFxuXHQiCkBAIC0yMSw3ICsyMSw3IEBACiAJCQkgICAgICAiYWRkYyAwLCAlMFxuXHQiCiAJCQkgICAgICA6ICI9ciIgKHJlcykKIAkJCSAgICAgIDogIjAiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksIFwKLQkJCSAgICAgICJyIiAoKG50b2hzKGxlbikgPDwgMTYpICsgKHByb3RvIDw8IDgpKSk7CisJCQkgICAgICAiciIgKChsZW4gKyBwcm90bykgPDwgOCkpOwogCiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWNyaXMvY2hlY2tzdW0uaAppbmRleCAyNmE3NzE5Li4xODBkYmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9jaGVja3N1bS5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMjcsMjYgKzI3LDIzIEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIGludG8gYSB3b3JkCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBjc3VtKQogewotCS8qIHRoZSB3aGlsZSBsb29wIGlzIHVubmVjZXNzYXJ5IHJlYWxseSwgaXQncyBhbHdheXMgZW5vdWdoIHdpdGggdHdvCi0JICAgaXRlcmF0aW9ucyAqLwotCQotCXdoaWxlKHN1bSA+PiAxNikKLQkJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsgLyogYWRkIGluIGVuZC1hcm91bmQgY2FycnkgKi8KLQkKLQlyZXR1cm4gfnN1bTsKKwl1MzIgc3VtID0gKF9fZm9yY2UgdTMyKWNzdW07CisJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsgLyogYWRkIGluIGVuZC1hcm91bmQgY2FycnkgKi8KKwlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOyAvKiBhZGQgaW4gZW5kLWFyb3VuZCBjYXJyeSAqLworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkJaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgCitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLAogCQkJCQkJaW50ICplcnJwdHIpOwogCiAvKgpAQCAtNTUsOCArNTIsNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLAotCQkJCQkgIHVuc2lnbmVkIGludCBpaGwpCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChpcGgsIGlobCAqIDQsIDApKTsKIH0KQEAgLTY2LDExICs2MiwxMCBAQAogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpbnQgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTgwLDcgKzc1LDggQEAKICAqIGluIGljbXAuYwogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKSB7CitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCit7CiAJcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2RldmljZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWZydi9jaGVja3N1bS5oCmluZGV4IDQyYmYwZGIuLjliMTY4OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9jaGVja3N1bS5oCkBAIC0yNiw3ICsyNiw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMzUsNyArMzUsNyBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsX2NvcHksIGJ1dCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlLgpAQCAtNDMsMTEgKzQzLDggQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkJaW50IGxlbiwgaW50IHN1bSwgaW50ICpjc3VtX2Vycik7Ci0KLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhzcmMsIGRzdCwgbGVuLCBzdW0pCVwKLQljc3VtX3BhcnRpYWxfY29weSgoc3JjKSwgKGRzdCksIChsZW4pLCAoc3VtKSkKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpOwogCiAvKgogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLApAQCAtNTUsNyArNTIsNyBAQAogICoKICAqLwogc3RhdGljIGlubGluZQotdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKIAl1bnNpZ25lZCBpbnQgdG1wLCBpbmMsIHN1bSA9IDA7CiAKQEAgLTgxLDEzICs3OCwxMyBAQAogCSAgICA6ICJpY2MwIiwgImljYzEiCiAJICAgICk7CiAKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtMTAwLDE2ICs5NywxNiBAQAogCSAgICA6ICIwIihzdW0pCiAJICAgICk7CiAKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAvKgogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCWFzbSgiCWFkZGNjCQklMSwlMCwlMCxpY2MwCVxuIgogCSAgICAiCWFkZHhjYwkJJTIsJTAsJTAsaWNjMAlcbiIKQEAgLTEyMiw5ICsxMTksOSBAQAogCXJldHVybiBzdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTMzLDEyICsxMzAsMTIgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKLWNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQlfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcCwgdG1wMjsKIApAQCAtMTc3LDcgKzE3NCw3IEBACiAJICAgIDogImljYzAiCiAJICAgICk7CiAKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAjZW5kaWYgLyogX0FTTV9DSEVDS1NVTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1mcnYvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RldmljZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdjOTYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kZXZpY2UuaApAQCAtMCwwICsxLDEyIEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpZm5kZWYgX0FTTV9HRU5FUklDX0RFVklDRV9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19ERVZJQ0VfSAorCitzdHJ1Y3QgZGV2X2FyY2hkYXRhIHsKK307CisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1oODMwMC9jaGVja3N1bS5oCmluZGV4IDMwNTE5MzEuLjk4NzI0ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvY2hlY2tzdW0uaApAQCAtMTMsNyArMTMsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTIzLDcgKzIzLDcgQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogCiAvKgpAQCAtMzMsMjAgKzMzLDE3IEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkJaW50IGxlbiwgaW50IHN1bSwgaW50ICpjc3VtX2Vycik7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmNzdW1fZXJyKTsKIAotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkJXAotCWNzdW1fcGFydGlhbF9jb3B5KChzcmMpLCAoZHN0KSwgKGxlbiksIChzdW0pKQotCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCk7CiAKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygibW92LmwgJTAsZXIwXG5cdCIKIAkJImFkZC53IGUwLHIwXG5cdCIKQEAgLTU4LDcgKzU1LDcgQEAKIAkJOiAiPXIiKHN1bSkKIAkJOiAiMCIoc3VtKQogCQk6ICJlcjAiKTsKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAKQEAgLTY3LDkgKzY0LDkgQEAKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXyAoInN1Yi5sIGVyMCxlcjBcblx0IgogCQkgImFkZC5sICUyLCUwXG5cdCIKQEAgLTg4LDkgKzg1LDkgQEAKIAlyZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2Citjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTEwMCw2ICs5Nyw2IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogI2VuZGlmIC8qIF9IODMwMF9DSEVDS1NVTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC90eXBlcy5oIGIvaW5jbHVkZS9hc20taDgzMDAvdHlwZXMuaAppbmRleCBkYTI0MDJiLi4yYThiMWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3R5cGVzLmgKQEAgLTU1LDEyICs1NSw2IEBACiAKIHR5cGVkZWYgdTMyIGRtYV9hZGRyX3Q7CiAKLSNkZWZpbmUgSEFWRV9TRUNUT1JfVAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0KLSNkZWZpbmUgSEFWRV9CTEtDTlRfVAotdHlwZWRlZiB1NjQgYmxrY250X3Q7Ci0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvY2hlY2tzdW0uaAppbmRleCA2N2QzNjMwLi43NTE5NGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9jaGVja3N1bS5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTI3LDggKzI3LDggQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJCSAgaW50IGxlbiwgaW50IHN1bSwgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkJICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKnNyY19lcnJfcHRyLCBpbnQgKmRzdF9lcnJfcHRyKTsKIAogLyoKICAqCU5vdGU6IHdoZW4geW91IGdldCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24gaGVyZSB0aGlzIG1lYW5zIHNvbWVvbmUKQEAgLTM4LDE4ICszOCwxOCBAQAogICoJYWNjZXNzX29rKCkuCiAgKi8KIHN0YXRpYyBfX2lubGluZV9fCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCWludCBsZW4sIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKCBzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCQlpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAltaWdodF9zbGVlcCgpOwotCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIHVuc2lnbmVkIGNoYXIgKilzcmMsIGRzdCwKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSB2b2lkICopc3JjLCBkc3QsCiAJCQkJCWxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKIH0KIApAQCAtNjAsOCArNjAsNyBAQAogICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQogICoJQXJudCBHdWxicmFuZHNlbi4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bTsKIApAQCAtODksMjkgKzg4LDI5IEBACiAJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpCiAJOiAiMSIgKGlwaCksICIyIiAoaWhsKQogCTogIm1lbW9yeSIpOwotCXJldHVybihzdW0pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkJImFkZGwgJTEsICUwCQk7XG4iCiAJCSJhZGNsICQweGZmZmYsICUwCTtcbiIKIAkJOiAiPXIiIChzdW0pCi0JCTogInIiIChzdW0gPDwgMTYpLCAiMCIgKHN1bSAmIDB4ZmZmZjAwMDApCisJCTogInIiICgoX19mb3JjZSB1MzIpc3VtIDw8IDE2KSwKKwkJICAiMCIgKChfX2ZvcmNlIHUzMilzdW0gJiAweGZmZmYwMDAwKQogCSk7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgICBfX3dzdW0gc3VtKQogewogICAgIF9fYXNtX18oCiAJImFkZGwgJTEsICUwCTtcbiIKQEAgLTExOSw3ICsxMTgsNyBAQAogCSJhZGNsICUzLCAlMAk7XG4iCiAJImFkY2wgJDAsICUwCTtcbiIKIAk6ICI9ciIgKHN1bSkKLQk6ICJnIiAoZGFkZHIpLCAiZyIoc2FkZHIpLCAiZyIoKG50b2hzKGxlbik8PDE2KStwcm90byoyNTYpLCAiMCIoc3VtKSk7CisJOiAiZyIgKGRhZGRyKSwgImciKHNhZGRyKSwgImciKChsZW4gKyBwcm90bykgPDwgOCksICIwIihzdW0pKTsKICAgICByZXR1cm4gc3VtOwogfQogCkBAIC0xMjcsMTEgKzEyNiwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xNDEsMTcgKzEzOSwxNiBAQAogICogaW4gaWNtcC5jCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAgICAgcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTMyIGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCSAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJCSJhZGRsIDAoJTEpLCAlMAkJO1xuIgpAQCAtMTc2LDE5ICsxNzMsMTkgQEAKICAqCUNvcHkgYW5kIGNoZWNrc3VtIHRvIHVzZXIKICAqLwogI2RlZmluZSBIQVZFX0NTVU1fQ09QWV9VU0VSCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJCSAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwKLQkJCQkJCSAgICAgaW50IGxlbiwgaW50IHN1bSwgCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJCSAgICAgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCSAgICAgaW50ICplcnJfcHRyKQogewogCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkKLQkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCAoX19mb3JjZSB1bnNpZ25lZCBjaGFyICopZHN0LCBsZW4sIHN1bSwgTlVMTCwgZXJyX3B0cik7CisJCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgKF9fZm9yY2Ugdm9pZCAqKWRzdCwgbGVuLCBzdW0sIE5VTEwsIGVycl9wdHIpOwogCiAJaWYgKGxlbikKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwogCi0JcmV0dXJuIC0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1pMzg2L2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTYwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2RldmljZS5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2lmbmRlZiBfQVNNX0kzODZfREVWSUNFX0gKKyNkZWZpbmUgX0FTTV9JMzg2X0RFVklDRV9ICisKK3N0cnVjdCBkZXZfYXJjaGRhdGEgeworI2lmZGVmIENPTkZJR19BQ1BJCisJdm9pZAkqYWNwaV9oYW5kbGU7CisjZW5kaWYKK307CisKKyNlbmRpZiAvKiBfQVNNX0kzODZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0L21hY2hfYXBpYy5oCmluZGV4IGVmMDY3MWUuLjQzZTViZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9hcGljLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXN1bW1pdC9tYWNoX2FwaWMuaApAQCAtODgsNyArODgsMTEgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYXBpY2lkX3RvX25vZGUoaW50IGxvZ2ljYWxfYXBpY2lkKQogeworI2lmZGVmIENPTkZJR19TTVAKIAlyZXR1cm4gYXBpY2lkXzJfbm9kZVtoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKV07CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCiB9CiAKIC8qIE1hcHBpbmcgZnJvbSBjcHUgbnVtYmVyIHRvIGxvZ2ljYWwgYXBpY2lkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmgKaW5kZXggNGI0YjI5NS4uYWQwYTU1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdHlwZXMuaApAQCAtNTcsMTYgKzU3LDYgQEAKICNlbmRpZgogdHlwZWRlZiB1NjQgZG1hNjRfYWRkcl90OwogCi0jaWZkZWYgQ09ORklHX0xCRAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0xTRgotdHlwZWRlZiB1NjQgYmxrY250X3Q7Ci0jZGVmaW5lIEhBVkVfQkxLQ05UX1QKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1pYTY0L2NoZWNrc3VtLmgKaW5kZXggMWYyMzBmZi4uYmQ0MGY0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvY2hlY2tzdW0uaApAQCAtMTAsMjMgKzEwLDIxIEBACiAgKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKiB3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtICh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK2V4dGVybiBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpOwogCiAvKgogICogQ29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIgcmV0dXJucyBhIDE2LWJpdAogICogY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWMgKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK2V4dGVybiBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljIChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgICAgdW5zaWduZWQgaW50IHN1bSk7CisJCQkJCSAgICAgX193c3VtIHN1bSk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV90Y3B1ZHBfbm9mb2xkICh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQgKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCXVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQl1bnNpZ25lZCBpbnQgc3VtKTsKKwkJCQkJX193c3VtIHN1bSk7CiAKIC8qCiAgKiBDb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKQEAgLTQwLDggKzM4LDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLAotCQkJCSAgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIFNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0IGNoZWNrc3Vtcy4KQEAgLTQ5LDI4ICs0NiwyOCBAQAogICogSGVyZSBpdCBpcyBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvcgogICogZXZlbiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeS4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkJIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0sCitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCSBpbnQgKmVycnApOwogCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkgaW4KICAqIGljbXAuYwogICovCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtICh1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogLyoKICAqIEZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1jc3VtX2ZvbGQgKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBjc3VtKQogeworCXUzMiBzdW0gPSAoX19mb3JjZSB1MzIpY3N1bTsKIAlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOwogCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7Ci0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogI2VuZGlmIC8qIF9BU01fSUE2NF9DSEVDS1NVTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2RldmljZS5oIGIvaW5jbHVkZS9hc20taWE2NC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI2ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9kZXZpY2UuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpZm5kZWYgX0FTTV9JQTY0X0RFVklDRV9ICisjZGVmaW5lIF9BU01fSUE2NF9ERVZJQ0VfSAorCitzdHJ1Y3QgZGV2X2FyY2hkYXRhIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCXZvaWQJKmFjcGlfaGFuZGxlOworI2VuZGlmCit9OworCisjZW5kaWYgLyogX0FTTV9JQTY0X0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2lvLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvLmgKaW5kZXggODU1YzMwYS4uNjMxMWUxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaW8uaApAQCAtMzIsNyArMzIsNyBAQAogICovCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweGZmZmZmZmZmZmZmZmZmZmZVTAogCi0jZGVmaW5lIE1BWF9JT19TUEFDRVNfQklUUwkJNAorI2RlZmluZSBNQVhfSU9fU1BBQ0VTX0JJVFMJCTgKICNkZWZpbmUgTUFYX0lPX1NQQUNFUwkJCSgxVUwgPDwgTUFYX0lPX1NQQUNFU19CSVRTKQogI2RlZmluZSBJT19TUEFDRV9CSVRTCQkJMjQKICNkZWZpbmUgSU9fU1BBQ0VfU0laRQkJCSgxVUwgPDwgSU9fU1BBQ0VfQklUUykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlYy5oIGIvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjLmgKaW5kZXggN2ZmYmRkZi4uOGY3ODRmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjLmgKQEAgLTM2LDYgKzM2LDcgQEAKIHR5cGVkZWYgaW50IGlhNjRfbXZfcGNpX2xlZ2FjeV93cml0ZV90IChzdHJ1Y3QgcGNpX2J1cyAqLCB1MTYgcG9ydCwgdTMyIHZhbCwKIAkJCQkJdTggc2l6ZSk7CiB0eXBlZGVmIHZvaWQgaWE2NF9tdl9taWdyYXRlX3Qoc3RydWN0IHRhc2tfc3RydWN0ICogdGFzayk7Cit0eXBlZGVmIHZvaWQgaWE2NF9tdl9wY2lfZml4dXBfYnVzX3QgKHN0cnVjdCBwY2lfYnVzICopOwogCiAvKiBETUEtbWFwcGluZyBpbnRlcmZhY2U6ICovCiB0eXBlZGVmIHZvaWQgaWE2NF9tdl9kbWFfaW5pdCAodm9pZCk7CkBAIC05NSw2ICs5NiwxMSBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQKK21hY2h2ZWNfbm9vcF9idXMgKHN0cnVjdCBwY2lfYnVzICpidXMpCit7Cit9CisKIGV4dGVybiB2b2lkIG1hY2h2ZWNfc2V0dXAgKGNoYXIgKiopOwogZXh0ZXJuIHZvaWQgbWFjaHZlY190aW1lcl9pbnRlcnJ1cHQgKGludCwgdm9pZCAqKTsKIGV4dGVybiB2b2lkIG1hY2h2ZWNfZG1hX3N5bmNfc2luZ2xlIChzdHJ1Y3QgZGV2aWNlICosIGRtYV9hZGRyX3QsIHNpemVfdCwgaW50KTsKQEAgLTE1OSw2ICsxNjUsNyBAQAogIyAgZGVmaW5lIHBsYXRmb3JtX21pZ3JhdGUJCWlhNjRfbXYubWlncmF0ZQogIyAgZGVmaW5lIHBsYXRmb3JtX3NldHVwX21zaV9pcnEJaWE2NF9tdi5zZXR1cF9tc2lfaXJxCiAjICBkZWZpbmUgcGxhdGZvcm1fdGVhcmRvd25fbXNpX2lycQlpYTY0X212LnRlYXJkb3duX21zaV9pcnEKKyMgIGRlZmluZSBwbGF0Zm9ybV9wY2lfZml4dXBfYnVzCWlhNjRfbXYucGNpX2ZpeHVwX2J1cwogIyBlbmRpZgogCiAvKiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxNikpKSBpcyByZXF1aXJlZCB0byBtYWtlIHNpemUgb2YgdGhlCkBAIC0yMTAsNiArMjE3LDcgQEAKIAlpYTY0X212X21pZ3JhdGVfdCAqbWlncmF0ZTsKIAlpYTY0X212X3NldHVwX21zaV9pcnFfdCAqc2V0dXBfbXNpX2lycTsKIAlpYTY0X212X3RlYXJkb3duX21zaV9pcnFfdCAqdGVhcmRvd25fbXNpX2lycTsKKwlpYTY0X212X3BjaV9maXh1cF9idXNfdCAqcGNpX2ZpeHVwX2J1czsKIH0gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMTYpKSk7IC8qIGFsaWduIGF0dHJpYj8gc2VlIGFib3ZlIGNvbW1lbnQgKi8KIAogI2RlZmluZSBNQUNIVkVDX0lOSVQobmFtZSkJCQlcCkBAIC0yNTcsNiArMjY1LDcgQEAKIAlwbGF0Zm9ybV9taWdyYXRlLAkJCVwKIAlwbGF0Zm9ybV9zZXR1cF9tc2lfaXJxLAkJCVwKIAlwbGF0Zm9ybV90ZWFyZG93bl9tc2lfaXJxLAkJXAorCXBsYXRmb3JtX3BjaV9maXh1cF9idXMsCQkJXAogfQogCiBleHRlcm4gc3RydWN0IGlhNjRfbWFjaGluZV92ZWN0b3IgaWE2NF9tdjsKQEAgLTQxNiw1ICs0MjUsOCBAQAogI2lmbmRlZiBwbGF0Zm9ybV90ZWFyZG93bl9tc2lfaXJxCiAjIGRlZmluZSBwbGF0Zm9ybV90ZWFyZG93bl9tc2lfaXJxCSgoaWE2NF9tdl90ZWFyZG93bl9tc2lfaXJxX3QqKU5VTEwpCiAjZW5kaWYKKyNpZm5kZWYgcGxhdGZvcm1fcGNpX2ZpeHVwX2J1cworIyBkZWZpbmUgcGxhdGZvcm1fcGNpX2ZpeHVwX2J1cwltYWNodmVjX25vb3BfYnVzCisjZW5kaWYKIAogI2VuZGlmIC8qIF9BU01fSUE2NF9NQUNIVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlY19zbjIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlY19zbjIuaAppbmRleCBjNTRiMTY1Li44MzMyNWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWNfc24yLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjX3NuMi5oCkBAIC02OSw2ICs2OSw3IEBACiBleHRlcm4gaWE2NF9tdl9taWdyYXRlX3QJCXNuX21pZ3JhdGU7CiBleHRlcm4gaWE2NF9tdl9zZXR1cF9tc2lfaXJxX3QJCXNuX3NldHVwX21zaV9pcnE7CiBleHRlcm4gaWE2NF9tdl90ZWFyZG93bl9tc2lfaXJxX3QJc25fdGVhcmRvd25fbXNpX2lycTsKK2V4dGVybiBpYTY0X212X3BjaV9maXh1cF9idXNfdAkJc25fcGNpX2ZpeHVwX2J1czsKIAogCiAvKgpAQCAtMTI3LDYgKzEyOCw3IEBACiAjZGVmaW5lIHBsYXRmb3JtX3NldHVwX21zaV9pcnEJCSgoaWE2NF9tdl9zZXR1cF9tc2lfaXJxX3QqKU5VTEwpCiAjZGVmaW5lIHBsYXRmb3JtX3RlYXJkb3duX21zaV9pcnEJKChpYTY0X212X3RlYXJkb3duX21zaV9pcnFfdCopTlVMTCkKICNlbmRpZgorI2RlZmluZSBwbGF0Zm9ybV9wY2lfZml4dXBfYnVzCQlzbl9wY2lfZml4dXBfYnVzCiAKICNpbmNsdWRlIDxhc20vc24vaW8uaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wY2kuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKaW5kZXggZWY2MTZmZC4uODI1ZWI3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCkBAIC0yNiwxNiArMjYsMTggQEAKIHN0cnVjdCBwY2lfZGV2OwogCiAvKgotICogUENJX0RNQV9CVVNfSVNfUEhZUyBzaG91bGQgYmUgc2V0IHRvIDEgaWYgdGhlcmUgaXMgX25lY2Vzc2FyaWx5XyBhIGRpcmVjdCBjb3JyZXNwb25kZW5jZQotICogYmV0d2VlbiBkZXZpY2UgYnVzIGFkZHJlc3NlcyBhbmQgQ1BVIHBoeXNpY2FsIGFkZHJlc3Nlcy4gIFBsYXRmb3JtcyB3aXRoIGEgaGFyZHdhcmUgSS9PCi0gKiBNTVUgX211c3RfIHR1cm4gdGhpcyBvZmYgdG8gc3VwcHJlc3MgdGhlIGJvdW5jZSBidWZmZXIgaGFuZGxpbmcgY29kZSBpbiB0aGUgYmxvY2sgYW5kCi0gKiBuZXR3b3JrIGRldmljZSBsYXllcnMuICBQbGF0Zm9ybXMgd2l0aCBzZXBhcmF0ZSBidXMgYWRkcmVzcyBzcGFjZXMgX211c3RfIHR1cm4gdGhpcyBvZmYKLSAqIGFuZCBwcm92aWRlIGEgZGV2aWNlIERNQSBtYXBwaW5nIGltcGxlbWVudGF0aW9uIHRoYXQgdGFrZXMgY2FyZSBvZiB0aGUgbmVjZXNzYXJ5CisgKiBQQ0lfRE1BX0JVU19JU19QSFlTIHNob3VsZCBiZSBzZXQgdG8gMSBpZiB0aGVyZSBpcyBfbmVjZXNzYXJpbHlfIGEgZGlyZWN0CisgKiBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIGRldmljZSBidXMgYWRkcmVzc2VzIGFuZCBDUFUgcGh5c2ljYWwgYWRkcmVzc2VzLgorICogUGxhdGZvcm1zIHdpdGggYSBoYXJkd2FyZSBJL08gTU1VIF9tdXN0XyB0dXJuIHRoaXMgb2ZmIHRvIHN1cHByZXNzIHRoZQorICogYm91bmNlIGJ1ZmZlciBoYW5kbGluZyBjb2RlIGluIHRoZSBibG9jayBhbmQgbmV0d29yayBkZXZpY2UgbGF5ZXJzLgorICogUGxhdGZvcm1zIHdpdGggc2VwYXJhdGUgYnVzIGFkZHJlc3Mgc3BhY2VzIF9tdXN0XyB0dXJuIHRoaXMgb2ZmIGFuZCBwcm92aWRlCisgKiBhIGRldmljZSBETUEgbWFwcGluZyBpbXBsZW1lbnRhdGlvbiB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIG5lY2Vzc2FyeQogICogYWRkcmVzcyB0cmFuc2xhdGlvbi4KICAqCi0gKiBGb3Igbm93LCB0aGUgaWE2NCBwbGF0Zm9ybXMgd2hpY2ggbWF5IGhhdmUgc2VwYXJhdGUvbXVsdGlwbGUgYnVzIGFkZHJlc3Mgc3BhY2VzIGFsbAotICogaGF2ZSBJL08gTU1VcyB3aGljaCBzdXBwb3J0IHRoZSBtZXJnaW5nIG9mIHBoeXNpY2FsbHkgZGlzY29udGlndW91cyBidWZmZXJzLCBzbyB3ZSBjYW4KLSAqIHVzZSB0aGF0IGFzIHRoZSBzb2xlIGZhY3RvciB0byBkZXRlcm1pbmUgdGhlIHNldHRpbmcgb2YgUENJX0RNQV9CVVNfSVNfUEhZUy4KKyAqIEZvciBub3csIHRoZSBpYTY0IHBsYXRmb3JtcyB3aGljaCBtYXkgaGF2ZSBzZXBhcmF0ZS9tdWx0aXBsZSBidXMgYWRkcmVzcworICogc3BhY2VzIGFsbCBoYXZlIEkvTyBNTVVzIHdoaWNoIHN1cHBvcnQgdGhlIG1lcmdpbmcgb2YgcGh5c2ljYWxseQorICogZGlzY29udGlndW91cyBidWZmZXJzLCBzbyB3ZSBjYW4gdXNlIHRoYXQgYXMgdGhlIHNvbGUgZmFjdG9yIHRvIGRldGVybWluZQorICogdGhlIHNldHRpbmcgb2YgUENJX0RNQV9CVVNfSVNfUEhZUy4KICAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaWE2NF9tYXhfaW9tbXVfbWVyZ2VfbWFzazsKICNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUwkoaWE2NF9tYXhfaW9tbXVfbWVyZ2VfbWFzayA9PSB+MFVMKQpAQCAtNTIsOSArNTQsNiBAQAogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CiAKLSNkZWZpbmUgSEFWRV9BUkNIX1BDSV9NV0kgMQotZXh0ZXJuIGludCBwY2liaW9zX3ByZXBfbXdpIChzdHJ1Y3QgcGNpX2RldiAqKTsKLQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS1kbWEtY29tcGF0Lmg+CiAKIC8qIHBjaV91bm1hcF97c2luZ2xlLHBhZ2V9IGlzIG5vdCBhIG5vcCwgdGh1cy4uLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FjcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODUwYTdlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfQVNNX0lBNjRfU05fQUNQSV9ICisjZGVmaW5lIF9BU01fSUE2NF9TTl9BQ1BJX0gKKworI2luY2x1ZGUgImFjcGkvYWNnbG9iYWwuaCIKKworI2RlZmluZSBTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpICAgKGFjcGlfZ2JsX0RTRFQtPm9lbV9yZXZpc2lvbiA+PSAweDIwMTAxKQorCisjZW5kaWYgLyogX0FTTV9JQTY0X1NOX0FDUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKaW5kZXggZWFjMzU2MS4uOWZlODlhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMjAwMC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogI2lmbmRlZiBfQVNNX0lBNjRfU05fUENJX1BDSURFVl9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9QQ0lfUENJREVWX0gKQEAgLTEyLDMxICsxMiwyOSBAQAogCiAvKgogICogSW4gaWE2NCwgcGNpX2Rldi0+c3lzZGF0YSBtdXN0IGJlIGEgKnBjaV9jb250cm9sbGVyLiBUbyBwcm92aWRlIGFjY2VzcyB0bwotICogdGhlIHBjaWRldl9pbmZvIHN0cnVjdHMgZm9yIGFsbCBkZXZpY2VzIHVuZGVyIGEgY29udHJvbGxlciwgd2UgZXh0ZW5kIHRoZQotICogZGVmaW5pdGlvbiBvZiBwY2lfY29udHJvbGxlciwgdmlhIHNuX3BjaV9jb250cm9sbGVyLCB0byBpbmNsdWRlIGEgbGlzdAotICogb2YgcGNpZGV2X2luZm8uCisgKiB0aGUgcGNpZGV2X2luZm8gc3RydWN0cyBmb3IgYWxsIGRldmljZXMgdW5kZXIgYSBjb250cm9sbGVyLCB3ZSBrZWVwIGEKKyAqIGxpc3Qgb2YgcGNpZGV2X2luZm8gdW5kZXIgcGNpX2NvbnRyb2xsZXItPnBsYXRmb3JtX2RhdGEuCiAgKi8KLXN0cnVjdCBzbl9wY2lfY29udHJvbGxlciB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaV9jb250cm9sbGVyOworc3RydWN0IHNuX3BsYXRmb3JtX2RhdGEgeworCXZvaWQgKnByb3ZpZGVyX3NvZnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBwY2lkZXZfaW5mbzsKIH07CiAKLSNkZWZpbmUgU05fUENJX0NPTlRST0xMRVIoZGV2KSAoKHN0cnVjdCBzbl9wY2lfY29udHJvbGxlciAqKSBkZXYtPnN5c2RhdGEpCisjZGVmaW5lIFNOX1BMQVRGT1JNX0RBVEEoYnVzZGV2KSBcCisJKChzdHJ1Y3Qgc25fcGxhdGZvcm1fZGF0YSAqKShQQ0lfQ09OVFJPTExFUihidXNkZXYpLT5wbGF0Zm9ybV9kYXRhKSkKIAogI2RlZmluZSBTTl9QQ0lERVZfSU5GTyhkZXYpCXNuX3BjaWRldl9pbmZvX2dldChkZXYpCiAKLSNkZWZpbmUgU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKSBcCi0JKHN0cnVjdCBwY2lidXNfaW5mbyAqKSgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKFBDSV9DT05UUk9MTEVSKChwY2lfYnVzKSktPnBsYXRmb3JtX2RhdGEpKQogLyoKICAqIEdpdmVuIGEgcGNpX2J1cywgcmV0dXJuIHRoZSBzbiBwY2lidXNfYnVzc29mdCBzdHJ1Y3QuICBOb3RlIHRoYXQKICAqIHRoaXMgb25seSB3b3JrcyBmb3Igcm9vdCBidXNzZXMsIG5vdCBmb3IgYnVzc2VzIHJlcHJlc2VudGVkIGJ5IFBQQidzLgogICovCiAKICNkZWZpbmUgU05fUENJQlVTX0JVU1NPRlQocGNpX2J1cykgXAotICAgICAgICAoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKShQQ0lfQ09OVFJPTExFUigocGNpX2J1cykpLT5wbGF0Zm9ybV9kYXRhKSkKKwkoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKShTTl9QTEFURk9STV9EQVRBKHBjaV9idXMpLT5wcm92aWRlcl9zb2Z0KSkKIAogI2RlZmluZSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpIFwKLQkoc3RydWN0IHBjaWJ1c19pbmZvICopKChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKikoUENJX0NPTlRST0xMRVIoKHBjaV9idXMpKS0+cGxhdGZvcm1fZGF0YSkpCisJKChzdHJ1Y3QgcGNpYnVzX2luZm8gKikoU05fUExBVEZPUk1fREFUQShwY2lfYnVzKS0+cHJvdmlkZXJfc29mdCkpCiAvKgogICogR2l2ZW4gYSBzdHJ1Y3QgcGNpX2RldiwgcmV0dXJuIHRoZSBzbiBwY2lidXNfYnVzc29mdCBzdHJ1Y3QuICBOb3RlCiAgKiB0aGF0IHRoaXMgaXMgbm90IGVxdWl2YWxlbnQgdG8gU05fUENJQlVTX0JVU1NPRlQocGNpX2Rldi0+YnVzKSBkdWUKQEAgLTcyLDggKzcwLDYgQEAKIAkJCSBzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKTsKIGV4dGVybiB2b2lkIHNuX2lycV91bmZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKIGV4dGVybiBzdHJ1Y3QgcGNpZGV2X2luZm8gKiBzbl9wY2lkZXZfaW5mb19nZXQoc3RydWN0IHBjaV9kZXYgKik7Ci1leHRlcm4gdm9pZCBzbl9wY2lfY29udHJvbGxlcl9maXh1cChpbnQgc2VnbWVudCwgaW50IGJ1c251bSwKLSAJCQkJICAgIHN0cnVjdCBwY2lfYnVzICpidXMpOwogZXh0ZXJuIHZvaWQgc25fYnVzX3N0b3JlX3N5c2RhdGEoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBzbl9idXNfZnJlZV9zeXNkYXRhKHZvaWQpOwogZXh0ZXJuIHZvaWQgc25fZ2VuZXJhdGVfcGF0aChzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgY2hhciAqYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2ZlYXR1cmVfc2V0cy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9mZWF0dXJlX3NldHMuaAppbmRleCAzMGRjZmE0Li5iZmRjMzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2ZlYXR1cmVfc2V0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fZmVhdHVyZV9zZXRzLmgKQEAgLTQ0LDggKzQ0LDE0IEBACiAgKiBPbmNlIGVuYWJsZWQsIGEgZmVhdHVyZSBjYW5ub3QgYmUgZGlzYWJsZWQuCiAgKgogICogQnkgZGVmYXVsdCwgZmVhdHVyZXMgYXJlIGRpc2FibGVkIHVubGVzcyBleHBsaWNpdGx5IGVuYWJsZWQuCisgKgorICogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgKiBQUk9NIGRlZmluaXRpb25zIGluIGZlYXR1cmVfc2V0cy5oLgogICovCiAjZGVmaW5lICBPU0ZfTUNBX1NMVl9UT19PU19JTklUX1NMVgkwCiAjZGVmaW5lICBPU0ZfRkVBVF9MT0dfU0JFUwkJMQorI2RlZmluZSAgT1NGX0FDUElfRU5BQkxFCQkyCisjZGVmaW5lICBPU0ZfUENJU0VHTUVOVF9FTkFCTEUJCTMKKwogCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NOX0ZFQVRVUkVfU0VUU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAppbmRleCBiYTgyNmIzLi5iZTVkODNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKQEAgLTc3LDYgKzc3LDcgQEAKICNkZWZpbmUgIFNOX1NBTF9JT0lGX0dFVF9XSURHRVRfRE1BRkxVU0hfTElTVAkgICAweDAyMDAwMDU4CS8vIGRlcHJlY2F0ZWQKICNkZWZpbmUgIFNOX1NBTF9JT0lGX0dFVF9ERVZJQ0VfRE1BRkxVU0hfTElTVAkgICAweDAyMDAwMDVhCiAKKyNkZWZpbmUgU05fU0FMX0lPSUZfSU5JVAkJCSAgIDB4MDIwMDAwNWYKICNkZWZpbmUgU05fU0FMX0hVQl9FUlJPUl9JTlRFUlJVUFQJCSAgIDB4MDIwMDAwNjAKICNkZWZpbmUgU05fU0FMX0JURV9SRUNPVkVSCQkJICAgMHgwMjAwMDA2MQogI2RlZmluZSBTTl9TQUxfUkVTRVJWRURfRE9fTk9UX1VTRQkJICAgMHgwMjAwMDA2MgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tbTMyci9jaGVja3N1bS5oCmluZGV4IDg3N2ViZjQuLmE3YTdjNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2NoZWNrc3VtLmgKQEAgLTMxLDggKzMxLDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsCi0JCQkJICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK2FzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIFRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdCBjaGVja3N1bXMuCkBAIC00MCwyNCArMzksMjIgQEAKICAqIEhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogVGhpcyBpcyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBhYm92ZSB0aGF0IHJlY29yZHMgZXJyb3JzIGl0IGZpbmRzIGluICplcnJwLAogICogYnV0IGNvbnRpbnVlcyBhbmQgemVyb3MgdGhyZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZXJyX3B0cik7CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgdG1wcmVnOwogCV9fYXNtX18oCkBAIC03MiwxNiArNjksMTcgQEAKIAkJOiAiMCIgIChzdW0pCiAJCTogImNiaXQiCiAJKTsKLQlyZXR1cm4gc3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKICAqIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqIHdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlobCkgewotCXVuc2lnbmVkIGxvbmcgc3VtLCB0bXByZWcwLCB0bXByZWcxOworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CisJdW5zaWduZWQgbG9uZyB0bXByZWcwLCB0bXByZWcxOworCV9fd3N1bSBzdW07CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIglsZAklMCwgQCUxKyBcbiIKQEAgLTExNSwxNiArMTEzLDE1IEBACiAJcmV0dXJuIGNzdW1fZm9sZChzdW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkgICAgICAgX193c3VtIHN1bSkKIHsKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2OworCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKHByb3RvICsgbGVuKSA8PCA4OwogI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChwcm90bzw8MTYpK2xlbjsKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IHByb3RvICsgbGVuOwogI2VuZGlmCiAJdW5zaWduZWQgbG9uZyB0bXByZWc7CiAKQEAgLTE0NywxMSArMTQ0LDEwIEBACiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTE2MSwxNiArMTU3LDE2IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikgeworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQorewogCXJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQkJCSBfX3UxNiBsZW4sCi0JCQkJCQkgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCSAgICAgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJICAgICAgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcHJlZzAsIHRtcHJlZzEsIHRtcHJlZzIsIHRtcHJlZzM7CiAJX19hc21fXygKQEAgLTE5Nyw3ICsxOTMsNyBAQAogCQk6ICI9JnIiIChzdW0pLCAiPSZyIiAodG1wcmVnMCksICI9JnIiICh0bXByZWcxKSwKIAkJICAiPSZyIiAodG1wcmVnMiksICI9JnIiICh0bXByZWczKQogCQk6ICJyIiAoc2FkZHIpLCAiciIgKGRhZGRyKSwKLQkJICAiciIgKGh0b25sKChfX3UzMikgKGxlbikpKSwgInIiIChodG9ubChwcm90bykpLCAiMCIgKHN1bSkKKwkJICAiciIgKGh0b25sKGxlbikpLCAiciIgKGh0b25sKHByb3RvKSksICIwIiAoc3VtKQogCQk6ICJjYml0IgogCSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1tMzJyL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLW02OGsvY2hlY2tzdW0uaAppbmRleCAxNzI4MGVmLi40OTRmOWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9jaGVja3N1bS5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMjUsMjIgKzI1LDIxIEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCQlpbnQgbGVuLCBpbnQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwkJCQkJCXZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCQlpbnQgKmNzdW1fZXJyKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJCQkgICAgICBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsCisJCQkJCSAgICAgIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkJICAgICAgX193c3VtIHN1bSk7CiAKIC8qCiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICoKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW0gPSAwOwogCXVuc2lnbmVkIGxvbmcgdG1wOwpAQCAtNTgsMjkgKzU3LDI5IEBACiAJCSA6ICI9ZCIgKHN1bSksICI9JmEiIChpcGgpLCAiPSZkIiAoaWhsKSwgIj0mZCIgKHRtcCkKIAkJIDogIjAiIChzdW0pLCAiMSIgKGlwaCksICIyIiAoaWhsKQogCQkgOiAibWVtb3J5Iik7Ci0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7Ci0JdW5zaWduZWQgaW50IHRtcCA9IHN1bTsKKwl1bnNpZ25lZCBpbnQgdG1wID0gKF9fZm9yY2UgdTMyKXN1bTsKIAlfX2FzbV9fKCJzd2FwICUxXG5cdCIKIAkJImFkZHcgJTEsICUwXG5cdCIKIAkJImNscncgJTFcblx0IgogCQkiYWRkeHcgJTEsICUwIgogCQk6ICI9JmQiIChzdW0pLCAiPSZkIiAodG1wKQogCQk6ICIwIiAoc3VtKSwgIjEiICh0bXApKTsKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gKCJhZGRsICAlMiwlMFxuXHQiCiAJCSAiYWRkeGwgJTMsJTBcblx0IgpAQCAtOTgsOSArOTcsOSBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTEwLDE2ICsxMDksMTUgQEAKICAqIGluIGljbXAuYwogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKLWlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCV9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRtcDsKIAlfX2FzbV9fKCJhZGRsICUyQCwlMFxuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2RldmljZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jaGVja3N1bS5oCmluZGV4IDI5NGVjNzUuLjgxODgzNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jaGVja3N1bS5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMjUsOCArMjUsOCBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JaW50IGxlbiwgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwlpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogCiAvKgpAQCAtMzYsMzMgKzM2LDMxIEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQl1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0sIGludCAqY3N1bV9lcnIpOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwl2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpOwogCi0jZGVmaW5lIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLCBkc3QsIGxlbiwgc3VtKQlcCi0JY3N1bV9wYXJ0aWFsX2NvcHkoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSkpCi0KLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpOworX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX2ZvcmNlIHUzMilzdW07CiAjaWZkZWYgQ09ORklHX0NPTERGSVJFCi0Jc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKLQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCXRtcCA9ICh0bXAgJiAweGZmZmYpICsgKHRtcCA+PiAxNik7CisJdG1wID0gKHRtcCAmIDB4ZmZmZikgKyAodG1wID4+IDE2KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+dG1wOwogI2Vsc2UKLQl1bnNpZ25lZCBpbnQgdG1wID0gc3VtOwogCV9fYXNtX18oInN3YXAgJTFcblx0IgogCQkiYWRkdyAlMSwgJTBcblx0IgogCQkiY2xydyAlMVxuXHQiCiAJCSJhZGR4dyAlMSwgJTAiCiAJCTogIj0mZCIgKHN1bSksICI9JmQiICh0bXApCiAJCTogIjAiIChzdW0pLCAiMSIgKHN1bSkpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiAjZW5kaWYKLQlyZXR1cm4gfnN1bTsKIH0KIAogCkBAIC03MSw5ICs2OSw5IEBACiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gKCJhZGRsICAlMSwlMFxuXHQiCiAJCSAiYWRkeGwgJTQsJTBcblx0IgpAQCAtODYsOSArODQsOSBAQAogCXJldHVybiBzdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtOTgsMTIgKzk2LDEyIEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkgCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRtcDsKIAlfX2FzbV9fKCJhZGRsICUyQCwlMFxuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9kbWEtbWFwcGluZy5oCmluZGV4IDU2MjJiODUuLjZhZWFiMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9kbWEtbWFwcGluZy5oCkBAIC0xLDkgKzEsMTAgQEAKICNpZm5kZWYgX002OEtOT01NVV9ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9NNjhLTk9NTVVfRE1BX01BUFBJTkdfSAogCi0KICNpZmRlZiBDT05GSUdfUENJCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CiAjZW5kaWYKIAogI2VuZGlmICAvKiBfTTY4S05PTU1VX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tNTIweHNpbS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjB4c2ltLmgKaW5kZXggMWRhYzIyZS4uNDlkMDE2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjB4c2ltLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjB4c2ltLmgKQEAgLTMxLDYgKzMxLDE2IEBACiAjZGVmaW5lIE1DRklOVF9RU1BJICAgICAgICAgMzEgICAgICAgICAgLyogSW50ZXJydXB0IG51bWJlciBmb3IgUVNQSSAqLwogI2RlZmluZSBNQ0ZJTlRfUElUMSAgICAgICAgIDQgICAgICAgICAgIC8qIEludGVycnVwdCBudW1iZXIgZm9yIFBJVDEgKFBJVDAgaW4gcHJvY2Vzc29yKSAqLwogCisvKgorICogIFNEUkFNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIE1DRlNJTV9TRE1SICAgICAgICAgMHgwMDBhODAwMAkvKiBTRFJBTSBNb2RlL0V4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNGU0lNX1NEQ1IgICAgICAgICAweDAwMGE4MDA0CS8qIFNEUkFNIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNGU0lNX1NEQ0ZHMSAgICAgICAweDAwMGE4MDA4CS8qIFNEUkFNIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNQ0ZTSU1fU0RDRkcyICAgICAgIDB4MDAwYTgwMGMJLyogU0RSQU0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lIE1DRlNJTV9TRENTMCAgICAgICAgMHgwMDBhODExMAkvKiBTRFJBTSBDaGlwIFNlbGVjdCAwIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTUNGU0lNX1NEQ1MxICAgICAgICAweDAwMGE4MTE0CS8qIFNEUkFNIENoaXAgU2VsZWN0IDEgQ29uZmlndXJhdGlvbiAqLworCiAKICNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlQgICAgICAgICAgICAgICAgICAgKDB4QTQwMzYpCiAjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkMgICAgICAgICAgICAgICAgICgweEE0MDMzKQpAQCAtNDcsNyArNTcsNyBAQAogCiAjZGVmaW5lIElDUl9JTlRSQ09ORgkJMHgwNQogI2RlZmluZSBNQ0ZQSVRfSU1SCQlNQ0ZJTlRDX0lNUkwKLSNkZWZpbmUgTUNGUElUX0lNUl9JQklUCSgxIDw8IE1DRklOVF9QSVQxKQorI2RlZmluZSBNQ0ZQSVRfSU1SX0lCSVQJCSgxIDw8IE1DRklOVF9QSVQxKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNlbmRpZiAgLyogbTUyMHhzaW1faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZm1idXMuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZtYnVzLmgKaW5kZXggMTNkZjlkNC4uMzE5ODk5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZm1idXMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmbWJ1cy5oCkBAIC0zNyw3ICszNyw3IEBACiAjZGVmaW5lIE1DRk1CVVNfTUZEUl9NQkMoYSkJKChhKSYweDNGKQkgICAvKk0tQnVzIENsb2NrKi8KIAogLyoKLSoJRGVmaW5lIGJpdCBmbGFncyBpbiBDb250cm9sbCBSZWdpc3RlcgorKglEZWZpbmUgYml0IGZsYWdzIGluIENvbnRyb2wgUmVnaXN0ZXIKICovCiAKICNkZWZpbmUgTUNGTUJVU19NQkNSX01FTiAgICAgICAgICAgKDB4ODApICAvKiBNLUJ1cyBFbmFibGUgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc2NhdHRlcmxpc3QuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zY2F0dGVybGlzdC5oCmluZGV4IDEyMzA5YjEuLjIwODVkNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9zY2F0dGVybGlzdC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zY2F0dGVybGlzdC5oCkBAIC0xMCw3ICsxMCw3IEBACiAJdW5zaWduZWQgaW50CWxlbmd0aDsKIH07CiAKLSNkZWZpbmUgc2dfYWRkcmVzcyhzZykgKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldAorI2RlZmluZSBzZ19hZGRyZXNzKHNnKQkJKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldCkKICNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpICAgICAgKChzZyktPmRtYV9hZGRyZXNzKQogI2RlZmluZSBzZ19kbWFfbGVuKHNnKSAgICAgICAgICAoKHNnKS0+bGVuZ3RoKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FkZHJzcGFjZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9hZGRyc3BhY2UuaAppbmRleCA0NWM3MDZlLi5jNjI3NTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2FkZHJzcGFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYWRkcnNwYWNlLmgKQEAgLTE5LDEyICsxOSwxNiBAQAogI2RlZmluZSBfQVRZUEVfCiAjZGVmaW5lIF9BVFlQRTMyXwogI2RlZmluZSBfQVRZUEU2NF8KLSNkZWZpbmUgX0xMQ09OU1RfKHgpCXgKKyNkZWZpbmUgX0NPTlNUNjRfKHgpCXgKICNlbHNlCiAjZGVmaW5lIF9BVFlQRV8JCV9fUFRSRElGRl9UWVBFX18KICNkZWZpbmUgX0FUWVBFMzJfCWludAotI2RlZmluZSBfQVRZUEU2NF8JbG9uZyBsb25nCi0jZGVmaW5lIF9MTENPTlNUXyh4KQl4ICMjIExMCisjZGVmaW5lIF9BVFlQRTY0XwlfX3M2NAorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBfQ09OU1Q2NF8oeCkJeCAjIyBMCisjZWxzZQorI2RlZmluZSBfQ09OU1Q2NF8oeCkJeCAjIyBMTAorI2VuZGlmCiAjZW5kaWYKIAogLyoKQEAgLTQ4LDcgKzUyLDcgQEAKICAqLwogI2RlZmluZSBDUEhZU0FERFIoYSkJCSgoX0FDQVNUMzJfKGEpKSAmIDB4MWZmZmZmZmYpCiAjZGVmaW5lIFhQSFlTQUREUihhKSAgICAgICAgICAgICgoX0FDQVNUNjRfKGEpKSAmCQkJXAotCQkJCSBfTExDT05TVF8oMHgwMDAwMDBmZmZmZmZmZmZmKSkKKwkJCQkgX0NPTlNUNjRfKDB4MDAwMDAwZmZmZmZmZmZmZikpCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIApAQCAtNTcsMTQgKzYxLDE0IEBACiAgKiBUaGUgY29tcGF0aWJpbGl0eSBzZWdtZW50cyB1c2UgdGhlIGZ1bGwgNjQtYml0IHNpZ24gZXh0ZW5kZWQgdmFsdWUuICBOb3RlCiAgKiB0aGUgUjgwMDAgZG9lc24ndCBoYXZlIHRoZW0gc28gZG9uJ3QgcmVmZXJlbmNlIHRoZXNlIGluIGdlbmVyaWMgTUlQUyBjb2RlLgogICovCi0jZGVmaW5lIFhLVVNFRwkJCV9MTENPTlNUXygweDAwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFhLU1NFRwkJCV9MTENPTlNUXygweDQwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFhLUEhZUwkJCV9MTENPTlNUXygweDgwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFhLU0VHCQkJX0xMQ09OU1RfKDB4YzAwMDAwMDAwMDAwMDAwMCkKLSNkZWZpbmUgQ0tTRUcwCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmY4MDAwMDAwMCkKLSNkZWZpbmUgQ0tTRUcxCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZhMDAwMDAwMCkKLSNkZWZpbmUgQ0tTU0VHCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZjMDAwMDAwMCkKLSNkZWZpbmUgQ0tTRUczCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZlMDAwMDAwMCkKKyNkZWZpbmUgWEtVU0VHCQkJX0NPTlNUNjRfKDB4MDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgWEtTU0VHCQkJX0NPTlNUNjRfKDB4NDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgWEtQSFlTCQkJX0NPTlNUNjRfKDB4ODAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgWEtTRUcJCQlfQ09OU1Q2NF8oMHhjMDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBDS1NFRzAJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZjgwMDAwMDAwKQorI2RlZmluZSBDS1NFRzEJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmEwMDAwMDAwKQorI2RlZmluZSBDS1NTRUcJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmMwMDAwMDAwKQorI2RlZmluZSBDS1NFRzMJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmUwMDAwMDAwKQogCiAjZGVmaW5lIENLU0VHMEFERFIoYSkJCShDUEhZU0FERFIoYSkgfCBDS1NFRzApCiAjZGVmaW5lIENLU0VHMUFERFIoYSkJCShDUEhZU0FERFIoYSkgfCBDS1NFRzEpCkBAIC0xMjIsNyArMTI2LDcgQEAKICNkZWZpbmUgUEhZU19UT19YS1NFR19VTkNBQ0hFRChwKQlQSFlTX1RPX1hLUEhZUyhLX0NBTEdfVU5DQUNIRUQsKHApKQogI2RlZmluZSBQSFlTX1RPX1hLU0VHX0NBQ0hFRChwKQkJUEhZU19UT19YS1BIWVMoS19DQUxHX0NPSF9TSEFSRUFCTEUsKHApKQogI2RlZmluZSBYS1BIWVNfVE9fUEhZUyhwKQkJKChwKSAmIFRPX1BIWVNfTUFTSykKLSNkZWZpbmUgUEhZU19UT19YS1BIWVMoY20sYSkJCShfTExDT05TVF8oMHg4MDAwMDAwMDAwMDAwMDAwKSB8IFwKKyNkZWZpbmUgUEhZU19UT19YS1BIWVMoY20sYSkJCShfQ09OU1Q2NF8oMHg4MDAwMDAwMDAwMDAwMDAwKSB8IFwKIAkJCQkJICgoY20pPDw1OSkgfCAoYSkpCiAKICNpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1I0MzAwKQkJCQkJCVwKQEAgLTEzMiwyMCArMTM2LDIwIEBACiAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9ORVZBREEpCQkJCQlcCiAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9UWDQ5WFgpCQkJCQlcCiAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9NSVBTNjQpCi0jZGVmaW5lIFRPX1BIWVNfTUFTSwlfTExDT05TVF8oMHgwMDAwMDAwZmZmZmZmZmZmKQkvKiAyXl4zNiAtIDEgKi8KKyNkZWZpbmUgVE9fUEhZU19NQVNLCV9DT05TVDY0XygweDAwMDAwMDBmZmZmZmZmZmYpCS8qIDJeXjM2IC0gMSAqLwogI2VuZGlmCiAKICNpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1I4MDAwKQogLyogV2Uga2VlcCBLVVNJWkUgY29uc2lzdGVudCB3aXRoIFI0MDAwIGZvciBub3cgKDJeXjQwKSBpbnN0ZWFkIG9mICgyXl40OCkgKi8KLSNkZWZpbmUgVE9fUEhZU19NQVNLCV9MTENPTlNUXygweDAwMDAwMGZmZmZmZmZmZmYpCS8qIDJeXjQwIC0gMSAqLworI2RlZmluZSBUT19QSFlTX01BU0sJX0NPTlNUNjRfKDB4MDAwMDAwZmZmZmZmZmZmZikJLyogMl5eNDAgLSAxICovCiAjZW5kaWYKIAogI2lmIGRlZmluZWQgKENPTkZJR19DUFVfUjEwMDAwKQotI2RlZmluZSBUT19QSFlTX01BU0sJX0xMQ09OU1RfKDB4MDAwMDAwZmZmZmZmZmZmZikJLyogMl5eNDAgLSAxICovCisjZGVmaW5lIFRPX1BIWVNfTUFTSwlfQ09OU1Q2NF8oMHgwMDAwMDBmZmZmZmZmZmZmKQkvKiAyXl40MCAtIDEgKi8KICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NCMSkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NCMUEpCi0jZGVmaW5lIFRPX1BIWVNfTUFTSwlfTExDT05TVF8oMHgwMDAwMGZmZmZmZmZmZmZmKQkvKiAyXl40NCAtIDEgKi8KKyNkZWZpbmUgVE9fUEhZU19NQVNLCV9DT05TVDY0XygweDAwMDAwZmZmZmZmZmZmZmYpCS8qIDJeXjQ0IC0gMSAqLwogI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX0NQVV9SODAwMApAQCAtMTU1LDcgKzE1OSw3IEBACiAgKiBpbiBvcmRlciB0byBjYXRjaCBidWdzIGluIHRoZSBzb3VyY2UgY29kZS4KICAqLwogCi0jZGVmaW5lIENPTVBBVF9LMUJBU0UzMgkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZhMDAwMDAwMCkKKyNkZWZpbmUgQ09NUEFUX0sxQkFTRTMyCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmEwMDAwMDAwKQogI2RlZmluZSBQSFlTX1RPX0NPTVBBVEsxKHgpCSgoeCkgfCBDT01QQVRfSzFCQVNFMzIpIC8qIDMyLWJpdCBjb21wYXQgazEgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaAppbmRleCBlNjRhYmMwLi5jMWEyNDA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmgKQEAgLTksMjAgKzksMTMgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCA5NywgOTksIDIwMDAsIDAzLCAwNCBieSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgOTcsIDk5LCAyMDAwLCAwMywgMDQsIDA2IGJ5IFJhbGYgQmFlY2hsZQogICovCi0KLS8qCi0gKiBBcyB3b3JrYXJvdW5kIGZvciB0aGUgQVRPTUlDX0RFQ19BTkRfTE9DSyAvIGF0b21pY19kZWNfYW5kX2xvY2sgbWVzcyBpbgotICogPGxpbnV4L3NwaW5sb2NrLmg+IHdlIGhhdmUgdG8gaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4gb3V0c2lkZSB0aGUKLSAqIG1haW4gYmlnIHdyYXBwZXIgLi4uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCiAjaWZuZGVmIF9BU01fQVRPTUlDX0gKICNkZWZpbmUgX0FTTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+CiAKQEAgLTEzOCw2ICsxMzEsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCisJc21wX21iKCk7CisKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKQEAgLTE0OCw3ICsxNDMsNiBAQAogCQkiCXNjCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxemwJJTAsIDFiCQkJCQlcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCiAJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKQEAgLTE2Myw3ICsxNTcsNiBAQAogCQkiCXNjCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxegklMCwgMWIJCQkJCVxuIgogCQkiCWFkZHUJJTAsICUxLCAlMwkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKIAkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQpAQCAtMTc4LDYgKzE3MSw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE4NSw2ICsxODAsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCisJc21wX21iKCk7CisKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKQEAgLTE5NSw3ICsxOTIsNiBAQAogCQkiCXNjCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxemwJJTAsIDFiCQkJCQlcbiIKIAkJIglzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCiAJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKQEAgLTIxMCw3ICsyMDYsNiBAQAogCQkiCXNjCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxegklMCwgMWIJCQkJCVxuIgogCQkiCXN1YnUJJTAsICUxLCAlMwkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKIAkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQpAQCAtMjI1LDYgKzIyMCw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI0MCw2ICsyMzcsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCisJc21wX21iKCk7CisKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKQEAgLTI1Myw3ICsyNTIsNiBAQAogCQkiCWJlcXpsCSUwLCAxYgkJCQkJXG4iCiAJCSIJIHN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIjE6CQkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCkBAIC0yNzIsNyArMjcwLDYgQEAKIAkJIgliZXF6CSUwLCAxYgkJCQkJXG4iCiAJCSIJIHN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIjE6CQkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCkBAIC0yODksNiArMjg2LDggQEAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAorCXNtcF9tYigpOworCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzgzLDcgKzM4Miw3IEBACiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBfX3M2NCBjb3VudGVyOyB9IGF0b21pYzY0X3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGxvbmcgY291bnRlcjsgfSBhdG9taWM2NF90OwogCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkgICAgeyAoaSkgfQogCkBAIC00OTIsNiArNDkxLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAorCXNtcF9tYigpOworCiAJaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCkBAIC01MDIsNyArNTAzLDYgQEAKIAkJIglzY2QJJTAsICUyCQkJCQlcbiIKIAkJIgliZXF6bAklMCwgMWIJCQkJCVxuIgogCQkiCWFkZHUJJTAsICUxLCAlMwkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKIAkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQpAQCAtNTE3LDcgKzUxNyw2IEBACiAJCSIJc2NkCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxegklMCwgMWIJCQkJCVxuIgogCQkiCWFkZHUJJTAsICUxLCAlMwkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKIAkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQpAQCAtNTMyLDYgKzUzMSw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTUzOSw2ICs1NDAsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCisJc21wX21iKCk7CisKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKQEAgLTU0OSw3ICs1NTIsNiBAQAogCQkiCXNjZAklMCwgJTIJCQkJCVxuIgogCQkiCWJlcXpsCSUwLCAxYgkJCQkJXG4iCiAJCSIJc3VidQklMCwgJTEsICUzCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQogCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpCkBAIC01NjQsNyArNTY2LDYgQEAKIAkJIglzY2QJJTAsICUyCQkJCQlcbiIKIAkJIgliZXF6CSUwLCAxYgkJCQkJXG4iCiAJCSIJc3VidQklMCwgJTEsICUzCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQogCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpCkBAIC01NzksNiArNTgwLDggQEAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAorCXNtcF9tYigpOworCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNTk0LDYgKzU5Nyw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAKKwlzbXBfbWIoKTsKKwogCWlmIChjcHVfaGFzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIApAQCAtNjA3LDcgKzYxMiw2IEBACiAJCSIJYmVxemwJJTAsIDFiCQkJCQlcbiIKIAkJIgkgZHN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIjE6CQkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCkBAIC02MjYsNyArNjMwLDYgQEAKIAkJIgliZXF6CSUwLCAxYgkJCQkJXG4iCiAJCSIJIGRzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIxOgkJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQpAQCAtNjQzLDYgKzY0Niw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYmFycmllci5oIGIvaW5jbHVkZS9hc20tbWlwcy9iYXJyaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYmFycmllci5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqLworI2lmbmRlZiBfX0FTTV9CQVJSSUVSX0gKKyNkZWZpbmUgX19BU01fQkFSUklFUl9ICisKKy8qCisgKiByZWFkX2JhcnJpZXJfZGVwZW5kcyAtIEZsdXNoIGFsbCBwZW5kaW5nIHJlYWRzIHRoYXQgc3Vic2VxdWVudHMgcmVhZHMKKyAqIGRlcGVuZCBvbi4KKyAqCisgKiBObyBkYXRhLWRlcGVuZGVudCByZWFkcyBmcm9tIG1lbW9yeS1saWtlIHJlZ2lvbnMgYXJlIGV2ZXIgcmVvcmRlcmVkCisgKiBvdmVyIHRoaXMgYmFycmllci4gIEFsbCByZWFkcyBwcmVjZWRpbmcgdGhpcyBwcmltaXRpdmUgYXJlIGd1YXJhbnRlZWQKKyAqIHRvIGFjY2VzcyBtZW1vcnkgKGJ1dCBub3QgbmVjZXNzYXJpbHkgb3RoZXIgQ1BVcycgY2FjaGVzKSBiZWZvcmUgYW55CisgKiByZWFkcyBmb2xsb3dpbmcgdGhpcyBwcmltaXRpdmUgdGhhdCBkZXBlbmQgb24gdGhlIGRhdGEgcmV0dXJuIGJ5CisgKiBhbnkgb2YgdGhlIHByZWNlZGluZyByZWFkcy4gIFRoaXMgcHJpbWl0aXZlIGlzIG11Y2ggbGlnaHRlciB3ZWlnaHQgdGhhbgorICogcm1iKCkgb24gbW9zdCBDUFVzLCBhbmQgaXMgbmV2ZXIgaGVhdmllciB3ZWlnaHQgdGhhbiBpcworICogcm1iKCkuCisgKgorICogVGhlc2Ugb3JkZXJpbmcgY29uc3RyYWludHMgYXJlIHJlc3BlY3RlZCBieSBib3RoIHRoZSBsb2NhbCBDUFUKKyAqIGFuZCB0aGUgY29tcGlsZXIuCisgKgorICogT3JkZXJpbmcgaXMgbm90IGd1YXJhbnRlZWQgYnkgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGVzZSBwcmltaXRpdmVzLAorICogbm90IGV2ZW4gYnkgZGF0YSBkZXBlbmRlbmNpZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCisgKiBtZW1vcnlfYmFycmllcigpIGZvciBleGFtcGxlcyBhbmQgVVJMcyB0byBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgZm9yY2Ugb3JkZXJpbmcgKHRoZSBpbml0aWFsCisgKiB2YWx1ZSBvZiAiYSIgaXMgemVybywgImIiIGlzIG9uZSwgYW5kICJwIiBpcyAiJmEiKToKKyAqCisgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgKglDUFUgMAkJCQlDUFUgMQorICoKKyAqCWIgPSAyOworICoJbWVtb3J5X2JhcnJpZXIoKTsKKyAqCXAgPSAmYjsJCQkJcSA9IHA7CisgKgkJCQkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKyAqCQkJCQlkID0gKnE7CisgKiA8L3Byb2dyYW1saXN0aW5nPgorICoKKyAqIGJlY2F1c2UgdGhlIHJlYWQgb2YgIipxIiBkZXBlbmRzIG9uIHRoZSByZWFkIG9mICJwIiBhbmQgdGhlc2UKKyAqIHR3byByZWFkcyBhcmUgc2VwYXJhdGVkIGJ5IGEgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKS4gIEhvd2V2ZXIsCisgKiB0aGUgZm9sbG93aW5nIGNvZGUsIHdpdGggdGhlIHNhbWUgaW5pdGlhbCB2YWx1ZXMgZm9yICJhIiBhbmQgImIiOgorICoKKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqCUNQVSAwCQkJCUNQVSAxCisgKgorICoJYSA9IDI7CisgKgltZW1vcnlfYmFycmllcigpOworICoJYiA9IDM7CQkJCXkgPSBiOworICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7CisgKgkJCQkJeCA9IGE7CisgKiA8L3Byb2dyYW1saXN0aW5nPgorICoKKyAqIGRvZXMgbm90IGVuZm9yY2Ugb3JkZXJpbmcsIHNpbmNlIHRoZXJlIGlzIG5vIGRhdGEgZGVwZW5kZW5jeSBiZXR3ZWVuCisgKiB0aGUgcmVhZCBvZiAiYSIgYW5kIHRoZSByZWFkIG9mICJiIi4gIFRoZXJlZm9yZSwgb24gc29tZSBDUFVzLCBzdWNoCisgKiBhcyBBbHBoYSwgInkiIGNvdWxkIGJlIHNldCB0byAzIGFuZCAieCIgdG8gMC4gIFVzZSBybWIoKQorICogaW4gY2FzZXMgbGlrZSB0aGlzIHdoZXJlIHRoZXJlIGFyZSBubyBkYXRhIGRlcGVuZGVuY2llcy4KKyAqLworCisjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKKworI2lmZGVmIENPTkZJR19DUFVfSEFTX1NZTkMKKyNkZWZpbmUgX19zeW5jKCkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKKwkJIi5zZXQJcHVzaFxuXHQiCQlcCisJCSIuc2V0CW5vcmVvcmRlclxuXHQiCQlcCisJCSIuc2V0CW1pcHMyXG5cdCIJCVwKKwkJInN5bmNcblx0IgkJCVwKKwkJIi5zZXQJcG9wIgkJCVwKKwkJOiAvKiBubyBvdXRwdXQgKi8JCVwKKwkJOiAvKiBubyBpbnB1dCAqLwkJXAorCQk6ICJtZW1vcnkiKQorI2Vsc2UKKyNkZWZpbmUgX19zeW5jKCkJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBfX2Zhc3RfaW9iKCkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKKwkJIi5zZXQJcHVzaFxuXHQiCQlcCisJCSIuc2V0CW5vcmVvcmRlclxuXHQiCQlcCisJCSJsdwkkMCwlMFxuXHQiCQlcCisJCSJub3Bcblx0IgkJCVwKKwkJIi5zZXQJcG9wIgkJCVwKKwkJOiAvKiBubyBvdXRwdXQgKi8JCVwKKwkJOiAibSIgKCooaW50ICopQ0tTRUcxKQkJXAorCQk6ICJtZW1vcnkiKQorCisjZGVmaW5lIGZhc3Rfd21iKCkJX19zeW5jKCkKKyNkZWZpbmUgZmFzdF9ybWIoKQlfX3N5bmMoKQorI2RlZmluZSBmYXN0X21iKCkJX19zeW5jKCkKKyNkZWZpbmUgZmFzdF9pb2IoKQkJCQlcCisJZG8gewkJCQkJXAorCQlfX3N5bmMoKTsJCQlcCisJCV9fZmFzdF9pb2IoKTsJCQlcCisJfSB3aGlsZSAoMCkKKworI2lmZGVmIENPTkZJR19DUFVfSEFTX1dCCisKKyNpbmNsdWRlIDxhc20vd2JmbHVzaC5oPgorCisjZGVmaW5lIHdtYigpCQlmYXN0X3dtYigpCisjZGVmaW5lIHJtYigpCQlmYXN0X3JtYigpCisjZGVmaW5lIG1iKCkJCXdiZmx1c2goKQorI2RlZmluZSBpb2IoKQkJd2JmbHVzaCgpCisKKyNlbHNlIC8qICFDT05GSUdfQ1BVX0hBU19XQiAqLworCisjZGVmaW5lIHdtYigpCQlmYXN0X3dtYigpCisjZGVmaW5lIHJtYigpCQlmYXN0X3JtYigpCisjZGVmaW5lIG1iKCkJCWZhc3RfbWIoKQorI2RlZmluZSBpb2IoKQkJZmFzdF9pb2IoKQorCisjZW5kaWYgLyogIUNPTkZJR19DUFVfSEFTX1dCICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19XRUFLX09SREVSSU5HKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisjZGVmaW5lIF9fV0VBS19PUkRFUklOR19NQgkiICAgICAgIHN5bmMJXG4iCisjZWxzZQorI2RlZmluZSBfX1dFQUtfT1JERVJJTkdfTUIJIgkJXG4iCisjZW5kaWYKKworI2RlZmluZSBzbXBfbWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyhfX1dFQUtfT1JERVJJTkdfTUIgOiA6IDoibWVtb3J5IikKKyNkZWZpbmUgc21wX3JtYigpCV9fYXNtX18gX192b2xhdGlsZV9fKF9fV0VBS19PUkRFUklOR19NQiA6IDogOiJtZW1vcnkiKQorI2RlZmluZSBzbXBfd21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oX19XRUFLX09SREVSSU5HX01CIDogOiA6Im1lbW9yeSIpCisKKyNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIFwKKwlkbyB7IHZhciA9IHZhbHVlOyBzbXBfbWIoKTsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fQVNNX0JBUlJJRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYml0b3BzLmgKaW5kZXggMWJiODljNS4uMDY0NDVkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2JpdG9wcy5oCkBAIC0zLDM4ICszLDM0IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5NCAtIDE5OTcsIDE5OTksIDIwMDAgIFJhbGYgQmFlY2hsZSAocmFsZkBnbnUub3JnKQorICogQ29weXJpZ2h0IChjKSAxOTk0IC0gMTk5NywgMTk5OSwgMjAwMCwgMDYgIFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKICAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCiAjaWZuZGVmIF9BU01fQklUT1BTX0gKICNkZWZpbmUgX0FTTV9CSVRPUFNfSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkJLyogc2lnaCAuLi4gKi8KICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CisjaW5jbHVkZSA8YXNtL3NnaWRlZnMuaD4KKyNpbmNsdWRlIDxhc20vd2FyLmg+CiAKICNpZiAoX01JUFNfU1pMT05HID09IDMyKQogI2RlZmluZSBTWkxPTkdfTE9HIDUKICNkZWZpbmUgU1pMT05HX01BU0sgMzFVTAogI2RlZmluZSBfX0xMCQkibGwJIgogI2RlZmluZSBfX1NDCQkic2MJIgotI2RlZmluZSBjcHVfdG9fbGVsb25ncCh4KSBjcHVfdG9fbGUzMnAoKF9fdTMyICopICh4KSkKICNlbGlmIChfTUlQU19TWkxPTkcgPT0gNjQpCiAjZGVmaW5lIFNaTE9OR19MT0cgNgogI2RlZmluZSBTWkxPTkdfTUFTSyA2M1VMCiAjZGVmaW5lIF9fTEwJCSJsbGQJIgogI2RlZmluZSBfX1NDCQkic2NkCSIKLSNkZWZpbmUgY3B1X3RvX2xlbG9uZ3AoeCkgY3B1X3RvX2xlNjRwKChfX3U2NCAqKSAoeCkpCiAjZW5kaWYKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+Ci0jaW5jbHVkZSA8YXNtL3NnaWRlZnMuaD4KLSNpbmNsdWRlIDxhc20vd2FyLmg+Ci0KIC8qCiAgKiBjbGVhcl9iaXQoKSBkb2Vzbid0IHByb3ZpZGUgYW55IGJhcnJpZXIgZm9yIHRoZSBjb21waWxlci4KICAqLwpAQCAtNDIsMjAgKzM4LDYgQEAKICNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQlzbXBfbWIoKQogCiAvKgotICogT25seSBkaXNhYmxlIGludGVycnVwdCBmb3Iga2VybmVsIG1vZGUgc3R1ZmYgdG8ga2VlcCB1c2VybW9kZSBzdHVmZgotICogdGhhdCBkYXJlcyB0byB1c2Uga2VybmVsIGluY2x1ZGUgZmlsZXMgYWxpdmUuCi0gKi8KLQotI2RlZmluZSBfX2JpX2ZsYWdzCQkJdW5zaWduZWQgbG9uZyBmbGFncwotI2RlZmluZSBfX2JpX2xvY2FsX2lycV9zYXZlKHgpCQlsb2NhbF9pcnFfc2F2ZSh4KQotI2RlZmluZSBfX2JpX2xvY2FsX2lycV9yZXN0b3JlKHgpCWxvY2FsX2lycV9yZXN0b3JlKHgpCi0jZWxzZQotI2RlZmluZSBfX2JpX2ZsYWdzCi0jZGVmaW5lIF9fYmlfbG9jYWxfaXJxX3NhdmUoeCkKLSNkZWZpbmUgX19iaV9sb2NhbF9pcnFfcmVzdG9yZSh4KQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotLyoKICAqIHNldF9iaXQgLSBBdG9taWNhbGx5IHNldCBhIGJpdCBpbiBtZW1vcnkKICAqIEBucjogdGhlIGJpdCB0byBzZXQKICAqIEBhZGRyOiB0aGUgYWRkcmVzcyB0byBzdGFydCBjb3VudGluZyBmcm9tCkBAIC05MywxMyArNzUsMTMgQEAKIAl9IGVsc2UgewogCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBtYXNrOwotCQlfX2JpX2ZsYWdzOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWEgKz0gbnIgPj4gU1pMT05HX0xPRzsKIAkJbWFzayA9IDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSyk7Ci0JCV9fYmlfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCSphIHw9IG1hc2s7Ci0JCV9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogfQogCkBAIC0xNDEsMTMgKzEyMywxMyBAQAogCX0gZWxzZSB7CiAJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JCV9fYmlfZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJYSArPSBuciA+PiBTWkxPTkdfTE9HOwogCQltYXNrID0gMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKTsKLQkJX19iaV9sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJKmEgJj0gfm1hc2s7Ci0JCV9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogfQogCkBAIC0xOTEsMTMgKzE3MywxMyBAQAogCX0gZWxzZSB7CiAJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JCV9fYmlfZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJYSArPSBuciA+PiBTWkxPTkdfTE9HOwogCQltYXNrID0gMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKTsKLQkJX19iaV9sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJKmEgXj0gbWFzazsKLQkJX19iaV9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKQEAgLTIyMyw5ICsyMDUsNiBAQAogCQkiCSIgX19TQwkiJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgogCQkiCWFuZAklMiwgJTAsICUzCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKCptKSwgIj0mciIgKHJlcykKIAkJOiAiciIgKDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSykpLCAibSIgKCptKQpAQCAtMjQ1LDkgKzIyNCw2IEBACiAJCSIJIiBfX1NDCSIlMiwgJTEJCQkJCVxuIgogCQkiCWJlcXoJJTIsIDFiCQkJCQlcbiIKIAkJIgkgYW5kCSUyLCAlMCwgJTMJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJcG9wCQkJCQlcbiIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKCptKSwgIj0mciIgKHJlcykKIAkJOiAiciIgKDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSykpLCAibSIgKCptKQpAQCAtMjU4LDE3ICsyMzQsMTkgQEAKIAkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHI7CiAJCXVuc2lnbmVkIGxvbmcgbWFzazsKIAkJaW50IHJldHZhbDsKLQkJX19iaV9mbGFnczsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQlhICs9IG5yID4+IFNaTE9OR19MT0c7CiAJCW1hc2sgPSAxVUwgPDwgKG5yICYgU1pMT05HX01BU0spOwotCQlfX2JpX2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOwogCQkqYSB8PSBtYXNrOwotCQlfX2JpX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJCXJldHVybiByZXR2YWw7CiAJfQorCisJc21wX21iKCk7CiB9CiAKIC8qCkBAIC0yOTQsOSArMjcyLDYgQEAKIAkJIgkiIF9fU0MgCSIlMiwgJTEJCQkJCVxuIgogCQkiCWJlcXpsCSUyLCAxYgkJCQkJXG4iCiAJCSIJYW5kCSUyLCAlMCwgJTMJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAoKm0pLCAiPSZyIiAocmVzKQogCQk6ICJyIiAoMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKSksICJtIiAoKm0pCkBAIC0zMTcsOSArMjkyLDYgQEAKIAkJIgkiIF9fU0MgCSIlMiwgJTEJCQkJCVxuIgogCQkiCWJlcXoJJTIsIDFiCQkJCQlcbiIKIAkJIgkgYW5kCSUyLCAlMCwgJTMJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJcG9wCQkJCQlcbiIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKCptKSwgIj0mciIgKHJlcykKIAkJOiAiciIgKDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSykpLCAibSIgKCptKQpAQCAtMzMwLDE3ICszMDIsMTkgQEAKIAkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHI7CiAJCXVuc2lnbmVkIGxvbmcgbWFzazsKIAkJaW50IHJldHZhbDsKLQkJX19iaV9mbGFnczsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQlhICs9IG5yID4+IFNaTE9OR19MT0c7CiAJCW1hc2sgPSAxVUwgPDwgKG5yICYgU1pMT05HX01BU0spOwotCQlfX2JpX2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOwogCQkqYSAmPSB+bWFzazsKLQkJX19iaV9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCQlyZXR1cm4gcmV0dmFsOwogCX0KKworCXNtcF9tYigpOwogfQogCiAvKgpAQCAtMzY1LDkgKzMzOSw2IEBACiAJCSIJIiBfX1NDCSIlMiwgJTEJCQkJCVxuIgogCQkiCWJlcXpsCSUyLCAxYgkJCQkJXG4iCiAJCSIJYW5kCSUyLCAlMCwgJTMJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAoKm0pLCAiPSZyIiAocmVzKQogCQk6ICJyIiAoMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKSksICJtIiAoKm0pCkBAIC0zODcsOSArMzU4LDYgQEAKIAkJIgkiIF9fU0MJIlx0JTIsICUxCQkJCVxuIgogCQkiCWJlcXoJJTIsIDFiCQkJCQlcbiIKIAkJIgkgYW5kCSUyLCAlMCwgJTMJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJcG9wCQkJCQlcbiIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKCptKSwgIj0mciIgKHJlcykKIAkJOiAiciIgKDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSykpLCAibSIgKCptKQpAQCAtMzk5LDIyICszNjcsMjAgQEAKIAl9IGVsc2UgewogCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBtYXNrLCByZXR2YWw7Ci0JCV9fYmlfZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJYSArPSBuciA+PiBTWkxPTkdfTE9HOwogCQltYXNrID0gMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKTsKLQkJX19iaV9sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKIAkJKmEgXj0gbWFzazsKLQkJX19iaV9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCQlyZXR1cm4gcmV0dmFsOwogCX0KLX0KIAotI3VuZGVmIF9fYmlfZmxhZ3MKLSN1bmRlZiBfX2JpX2xvY2FsX2lycV9zYXZlCi0jdW5kZWYgX19iaV9sb2NhbF9pcnFfcmVzdG9yZQorCXNtcF9tYigpOworfQogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL25vbi1hdG9taWMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9idWcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYnVnLmgKaW5kZXggN2I0NzM5ZC4uNGQ1NjBhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2J1Zy5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX0FTTV9CVUdfSAogI2RlZmluZSBfX0FTTV9CVUdfSAogCisjaW5jbHVkZSA8YXNtL3NnaWRlZnMuaD4KIAogI2lmZGVmIENPTkZJR19CVUcKIApAQCAtMTMsNiArMTQsMTcgQEAKIAogI2RlZmluZSBIQVZFX0FSQ0hfQlVHCiAKKyNpZiAoX01JUFNfSVNBID4gX01JUFNfSVNBX01JUFMxKQorCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygidG5lICQwLCAlMCIgOiA6ICJyIiAoY29uZGl0aW9uKSk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBVkVfQVJDSF9CVUdfT04KKworI2VuZGlmIC8qIF9NSVBTX0lTQSA+IF9NSVBTX0lTQV9NSVBTMSAqLworCiAjZW5kaWYKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2J1Zy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tbWlwcy9jaGVja3N1bS5oCmluZGV4IGE1ZTYwNTAuLjliNzY4YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NoZWNrc3VtLmgKQEAgLTI3LDIzICsyNywyMiBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoaXMgaXMgYSBuZXcgdmVyc2lvbiBvZiB0aGUgYWJvdmUgdGhhdCByZWNvcmRzIGVycm9ycyBpdCBmaW5kcyBpbiAqZXJycCwKICAqIGJ1dCBjb250aW51ZXMgYW5kIHplcm9zIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywKLQkJCQkJIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCQkJIHVuc2lnbmVkIGludCBzdW0sIGludCAqZXJycCk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsCisJCQkJCSB2b2lkICpkc3QsIGludCBsZW4sCisJCQkJCSBfX3dzdW0gc3VtLCBpbnQgKmVycnApOwogCiAvKgogICogQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgogICovCiAjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfdG9fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQkJICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LAotCQkJCQkJICBpbnQgbGVuLCBpbnQgc3VtLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyIChjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCisJCQkJCQkgIGludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCQkgIGludCAqZXJyX3B0cikKIHsKIAltaWdodF9zbGVlcCgpOwpAQCAtNTEsNyArNTAsNyBAQAogCiAJaWYgKGNvcHlfdG9fdXNlcihkc3QsIHNyYywgbGVuKSkgewogCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsKIAl9CiAKIAlyZXR1cm4gc3VtOwpAQCAtNjEsMTMgKzYwLDEzIEBACiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlIChidXQgb24gTUlQUwogICogd2UgaGF2ZSBqdXN0IG9uZSBhZGRyZXNzIHNwYWNlLCBzbyB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgYWJvdmUpCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJIgkuc2V0CXB1c2gJCSMgY3N1bV9mb2xkXG4iCkBAIC04Miw3ICs4MSw3IEBACiAJOiAiPXIiIChzdW0pCiAJOiAiMCIgKHN1bSkpOwogCi0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCkBAIC05MiwxMCArOTEsMTAgQEAKICAqCUJ5IEpvcmdlIEN3aWsgPGpvcmdlQGxhc2VyLnNhdGxpbmsubmV0PiwgYWRhcHRlZCBmb3IgbGludXggYnkKICAqCUFybnQgR3VsYnJhbmRzZW4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewotCXVuc2lnbmVkIGludCAqd29yZCA9ICh1bnNpZ25lZCBpbnQgKikgaXBoOwotCXVuc2lnbmVkIGludCAqc3RvcCA9IHdvcmQgKyBpaGw7CisJY29uc3QgdW5zaWduZWQgaW50ICp3b3JkID0gaXBoOworCWNvbnN0IHVuc2lnbmVkIGludCAqc3RvcCA9IHdvcmQgKyBpaGw7CiAJdW5zaWduZWQgaW50IGNzdW07CiAJaW50IGNhcnJ5OwogCkBAIC0xMjMsOSArMTIyLDkgQEAKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQl1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCXVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLAorCV9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwlfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJIgkuc2V0CXB1c2gJCSMgY3N1bV90Y3B1ZHBfbm9mb2xkXG4iCkBAIC0xNTUsOSArMTU0LDkgQEAKIAk6ICI9ciIgKHN1bSkKIAk6ICIwIiAoZGFkZHIpLCAiciIoc2FkZHIpLAogI2lmZGVmIF9fTUlQU0VMX18KLQkgICJyIiAoKCh1bnNpZ25lZCBsb25nKWh0b25zKGxlbik8PDE2KSArIHByb3RvKjI1NiksCisJICAiciIgKChwcm90byArIGxlbikgPDwgOCksCiAjZWxzZQotCSAgInIiICgoKHVuc2lnbmVkIGxvbmcpKHByb3RvKTw8MTYpICsgbGVuKSwKKwkgICJyIiAocHJvdG8gKyBsZW4pLAogI2VuZGlmCiAJICAiciIgKHN1bSkpOwogCkBAIC0xNjgsMTEgKzE2NywxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkciwgZGFkZHIsIGxlbiwgcHJvdG8sIHN1bSkpOwogfQpAQCAtMTgxLDE3ICsxNzksMTYgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkJICAgICBfX3UzMiBsZW4sCi0JCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkJICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkiCS5zZXQJcHVzaAkJIyBjc3VtX2lwdjZfbWFnaWNcbiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCmluZGV4IDkwMGY0NzIuLjU1YTAxNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaApAQCAtMzIsNiArMzIsNyBAQAogCXMzMgl2YWxbMl07CiB9IGNvbXBhdF9mc2lkX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3RpbWVyX3Q7Cit0eXBlZGVmIHMzMgkJY29tcGF0X2tleV90OwogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7CkBAIC0xNDYsNCArMTQ3LDcxIEBACiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKSAocmVncy0+cmVnc1syOV0gLSBsZW4pOwogfQogCitzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0geworCWNvbXBhdF9rZXlfdCBrZXk7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKKwljb21wYXRfbW9kZV90IG1vZGU7CisJdW5zaWduZWQgc2hvcnQgc2VxOworCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsKKwljb21wYXRfdWxvbmdfdCBfX3VudXNlZDE7CisJY29tcGF0X3Vsb25nX3QgX191bnVzZWQyOworfTsKKworc3RydWN0IGNvbXBhdF9zZW1pZDY0X2RzIHsKKwlzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gc2VtX3Blcm07CisJY29tcGF0X3RpbWVfdAlzZW1fb3RpbWU7CisJY29tcGF0X3RpbWVfdAlzZW1fY3RpbWU7CisJY29tcGF0X3Vsb25nX3QJc2VtX25zZW1zOworCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMTsKKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDI7Cit9OworCitzdHJ1Y3QgY29tcGF0X21zcWlkNjRfZHMgeworCXN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSBtc2dfcGVybTsKKyNpZm5kZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCisJY29tcGF0X3Vsb25nX3QJX191bnVzZWQxOworI2VuZGlmCisJY29tcGF0X3RpbWVfdAltc2dfc3RpbWU7CisjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCisJY29tcGF0X3Vsb25nX3QJX191bnVzZWQxOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMjsKKyNlbmRpZgorCWNvbXBhdF90aW1lX3QJbXNnX3J0aW1lOworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMjsKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDM7CisjZW5kaWYKKwljb21wYXRfdGltZV90CW1zZ19jdGltZTsKKyNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDM7CisjZW5kaWYKKwljb21wYXRfdWxvbmdfdAltc2dfY2J5dGVzOworCWNvbXBhdF91bG9uZ190CW1zZ19xbnVtOworCWNvbXBhdF91bG9uZ190CW1zZ19xYnl0ZXM7CisJY29tcGF0X3BpZF90CW1zZ19sc3BpZDsKKwljb21wYXRfcGlkX3QJbXNnX2xycGlkOworCWNvbXBhdF91bG9uZ190CV9fdW51c2VkNDsKKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDU7Cit9OworCitzdHJ1Y3QgY29tcGF0X3NobWlkNjRfZHMgeworCXN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSBzaG1fcGVybTsKKwljb21wYXRfc2l6ZV90CXNobV9zZWdzejsKKwljb21wYXRfdGltZV90CXNobV9hdGltZTsKKwljb21wYXRfdGltZV90CXNobV9kdGltZTsKKwljb21wYXRfdGltZV90CXNobV9jdGltZTsKKwljb21wYXRfcGlkX3QJc2htX2NwaWQ7CisJY29tcGF0X3BpZF90CXNobV9scGlkOworCWNvbXBhdF91bG9uZ190CXNobV9uYXR0Y2g7CisJY29tcGF0X3Vsb25nX3QJX191bnVzZWQxOworCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMjsKK307CisKICNlbmRpZiAvKiBfQVNNX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NwdS1pbmZvLmggYi9pbmNsdWRlL2FzbS1taXBzL2NwdS1pbmZvLmgKaW5kZXggYTJmMGM4ZS4uNjEwZDBjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jcHUtaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWluZm8uaApAQCAtMjIsMTIgKzIyLDEyIEBACiAgKiBEZXNjcmlwdG9yIGZvciBhIGNhY2hlCiAgKi8KIHN0cnVjdCBjYWNoZV9kZXNjIHsKLQl1bnNpZ25lZCBzaG9ydCBsaW5lc3o7CS8qIFNpemUgb2YgbGluZSBpbiBieXRlcyAqLwotCXVuc2lnbmVkIHNob3J0IHdheXM7CS8qIE51bWJlciBvZiB3YXlzICovCi0JdW5zaWduZWQgc2hvcnQgc2V0czsJLyogTnVtYmVyIG9mIGxpbmVzIHBlciBzZXQgKi8KIAl1bnNpZ25lZCBpbnQgd2F5c2l6ZTsJLyogQnl0ZXMgcGVyIHdheSAqLwotCXVuc2lnbmVkIGludCB3YXliaXQ7CS8qIEJpdHMgdG8gc2VsZWN0IGluIGEgY2FjaGUgc2V0ICovCi0JdW5zaWduZWQgaW50IGZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIGNhY2hlIHByb3BlcnRpZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZXRzOwkvKiBOdW1iZXIgb2YgbGluZXMgcGVyIHNldCAqLworCXVuc2lnbmVkIGNoYXIgd2F5czsJLyogTnVtYmVyIG9mIHdheXMgKi8KKwl1bnNpZ25lZCBjaGFyIGxpbmVzejsJLyogU2l6ZSBvZiBsaW5lIGluIGJ5dGVzICovCisJdW5zaWduZWQgY2hhciB3YXliaXQ7CS8qIEJpdHMgdG8gc2VsZWN0IGluIGEgY2FjaGUgc2V0ICovCisJdW5zaWduZWQgY2hhciBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyBjYWNoZSBwcm9wZXJ0aWVzICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMi5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMi5oCmluZGV4IDgzMTlhZDcuLjkzNDMwYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL2tuMDIuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAyLmgKQEAgLTgyLDExICs4Miw5IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIGV4dGVybiB1MzIgY2FjaGVkX2tuMDJfY3NyOwotZXh0ZXJuIHNwaW5sb2NrX3Qga24wMl9sb2NrOwogZXh0ZXJuIHZvaWQgaW5pdF9rbjAyX2lycXMoaW50IGJhc2UpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1taXBzL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZG1hLmggYi9pbmNsdWRlL2FzbS1taXBzL2RtYS5oCmluZGV4IGU4NTg0OWEuLjIzZjc4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9kbWEuaApAQCAtNzQsNyArNzQsOSBAQAogICoKICAqLwogCisjaWZuZGVmIEdFTkVSSUNfSVNBX0RNQV9TVVBQT1JUX0JST0tFTgogI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTgKKyNlbmRpZgogCiAvKgogICogVGhlIG1heGltdW0gYWRkcmVzcyBpbiBLU0VHMCB0aGF0IHdlIGNhbiBwZXJmb3JtIGEgRE1BIHRyYW5zZmVyIHRvIG9uIHRoaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLW1pcHMvZnV0ZXguaAppbmRleCBlZDAyM2VhLi45MjdhMjE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9mdXRleC5oCkBAIC0xLDE5ICsxLDIxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2ICBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCisgKi8KICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBfX0ZVVEVYX1NNUF9TWU5DICIJc3luYwkJCQkJXG4iCi0jZWxzZQotI2RlZmluZSBfX0ZVVEVYX1NNUF9TWU5DCi0jZW5kaWYKLQogI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcChpbnNuLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKQkJXAogewkJCQkJCQkJCVwKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewkJCQlcCkBAIC0yNyw3ICsyOSw3IEBACiAJCSIJLnNldAltaXBzMwkJCQlcbiIJXAogCQkiMjoJc2MJJDEsICUyCQkJCVxuIglcCiAJCSIJYmVxemwJJDEsIDFiCQkJCVxuIglcCi0JCV9fRlVURVhfU01QX1NZTkMJCQkJCVwKKwkJX19XRUFLX09SREVSSU5HX01CCQkJCQlcCiAJCSIzOgkJCQkJCVxuIglcCiAJCSIJLnNldAlwb3AJCQkJXG4iCVwKIAkJIgkuc2V0CW1pcHMwCQkJCVxuIglcCkBAIC01Myw3ICs1NSw3IEBACiAJCSIJLnNldAltaXBzMwkJCQlcbiIJXAogCQkiMjoJc2MJJDEsICUyCQkJCVxuIglcCiAJCSIJYmVxegkkMSwgMWIJCQkJXG4iCVwKLQkJX19GVVRFWF9TTVBfU1lOQwkJCQkJXAorCQlfX1dFQUtfT1JERVJJTkdfTUIJCQkJCVwKIAkJIjM6CQkJCQkJXG4iCVwKIAkJIgkuc2V0CXBvcAkJCQlcbiIJXAogCQkiCS5zZXQJbWlwczAJCQkJXG4iCVwKQEAgLTE1MCw3ICsxNTIsNyBAQAogCQkiCS5zZXQJbWlwczMJCQkJCVxuIgogCQkiMjoJc2MJJDEsICUxCQkJCQlcbiIKIAkJIgliZXF6bAkkMSwgMWIJCQkJCVxuIgotCQlfX0ZVVEVYX1NNUF9TWU5DCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiMzoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCIJCQkJXG4iCkBAIC0xNzcsNyArMTc5LDcgQEAKIAkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKIAkJIjI6CXNjCSQxLCAlMQkJCQkJXG4iCiAJCSIJYmVxegkkMSwgMWIJCQkJCVxuIgotCQlfX0ZVVEVYX1NNUF9TWU5DCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiMzoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCIJCQkJXG4iCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2d0NjQxMjAuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCmluZGV4IDJlZGQxNzEuLjRiZjhlMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCkBAIC00NTEsNiArNDUxLDEzIEBACiAjZGVmaW5lIEdUX1NEUkFNX09QTU9ERV9PUF9NT0RFCQkzCiAjZGVmaW5lIEdUX1NEUkFNX09QTU9ERV9PUF9DQlIJCTQKIAorI2RlZmluZSBHVF9UQ19DT05UUk9MX0VOVEMwX1NIRgkJMAorI2RlZmluZSBHVF9UQ19DT05UUk9MX0VOVEMwX01TSwkJKE1TSygxKSA8PCBHVF9UQ19DT05UUk9MX0VOVEMwX1NIRikKKyNkZWZpbmUgR1RfVENfQ09OVFJPTF9FTlRDMF9CSVQJCUdUX1RDX0NPTlRST0xfRU5UQzBfTVNLCisjZGVmaW5lIEdUX1RDX0NPTlRST0xfU0VMVEMwX1NIRgkxCisjZGVmaW5lIEdUX1RDX0NPTlRST0xfU0VMVEMwX01TSwkoTVNLKDEpIDw8IEdUX1RDX0NPTlRST0xfU0VMVEMwX1NIRikKKyNkZWZpbmUgR1RfVENfQ09OVFJPTF9TRUxUQzBfQklUCUdUX1RDX0NPTlRST0xfU0VMVEMwX01TSworCiAKICNkZWZpbmUgR1RfUENJMF9CQVJFX1NXU0NTM0JPT1RESVNfU0hGCTAKICNkZWZpbmUgR1RfUENJMF9CQVJFX1NXU0NTM0JPT1RESVNfTVNLCShNU0soMSkgPDwgR1RfUENJMF9CQVJFX1NXU0NTM0JPT1RESVNfU0hGKQpAQCAtNTIzLDYgKzUzMCwxMyBAQAogI2RlZmluZSBHVF9QQ0kwX0NNRF9TV09SRFNXQVBfTVNLCShNU0soMSkgPDwgR1RfUENJMF9DTURfU1dPUkRTV0FQX1NIRikKICNkZWZpbmUgR1RfUENJMF9DTURfU1dPUkRTV0FQX0JJVAlHVF9QQ0kwX0NNRF9TV09SRFNXQVBfTVNLCiAKKyNkZWZpbmUgR1RfSU5UUl9UMEVYUF9TSEYJCTgKKyNkZWZpbmUgR1RfSU5UUl9UMEVYUF9NU0sJCShNU0soMSkgPDwgR1RfSU5UUl9UMEVYUF9TSEYpCisjZGVmaW5lIEdUX0lOVFJfVDBFWFBfQklUCQlHVF9JTlRSX1QwRVhQX01TSworI2RlZmluZSBHVF9JTlRSX1JFVFJZQ1RSMF9TSEYJCTIwCisjZGVmaW5lIEdUX0lOVFJfUkVUUllDVFIwX01TSwkJKE1TSygxKSA8PCBHVF9JTlRSX1JFVFJZQ1RSMF9TSEYpCisjZGVmaW5lIEdUX0lOVFJfUkVUUllDVFIwX0JJVAkJR1RfSU5UUl9SRVRSWUNUUjBfTVNLCisKIC8qCiAgKiAgTWlzYwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2lvLmggYi9pbmNsdWRlL2FzbS1taXBzL2lvLmgKaW5kZXggYmM1ZjNjNS4uZDc3YjY1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvaW8uaApAQCAtMTEzLDcgKzExMyw3IEBACiAgKiAgICAgYWxtb3N0IGFsbCBjb25jZWl2YWJsZSBjYXNlcyBhIGRldmljZSBkcml2ZXIgc2hvdWxkIG5vdCBiZSB1c2luZwogICogICAgIHRoaXMgZnVuY3Rpb24KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSB2b2lkICogYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgY29uc3Qgdm9pZCAqYWRkcmVzcykKIHsKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyAtIFBBR0VfT0ZGU0VUOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pcnEuaCBiL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmgKaW5kZXggMzVhMDVjYS4uNjc2NTcwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2lycS5oCkBAIC0yNCw4ICsyNCw2IEBACiAjZGVmaW5lIGlycV9jYW5vbmljYWxpemUoaXJxKSAoaXJxKQkvKiBTYW5lIGhhcmR3YXJlLCBzYW5lIGNvZGUgLi4uICovCiAjZW5kaWYKIAotZXh0ZXJuIGFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGRvX0lSUSh1bnNpZ25lZCBpbnQgaXJxKTsKLQogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIC8qCiAgKiBDbGVhciBpbnRlcnJ1cHQgbWFzayBoYW5kbGluZyAiYmFja3N0b3AiIGlmIGlycV9od21hc2sKQEAgLTQzLDggKzQxLDYgQEAKICNkZWZpbmUgX19ET19JUlFfU01UQ19IT09LKCkgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCiAvKgogICogZG9fSVJRIGhhbmRsZXMgYWxsIG5vcm1hbCBkZXZpY2UgSVJRJ3MgKHRoZSBzcGVjaWFsCiAgKiBTTVAgY3Jvc3MtQ1BVIGludGVycnVwdHMgaGF2ZSB0aGVpciBvd24gc3BlY2lmaWMKQEAgLTU3LDEyICs1MywxMCBAQAogZG8gewkJCQkJCQkJCVwKIAlpcnFfZW50ZXIoKTsJCQkJCQkJXAogCV9fRE9fSVJRX1NNVENfSE9PSygpOwkJCQkJCVwKLQlfX2RvX0lSUSgoaXJxKSk7CQkJCQkJXAorCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwkJCQkJXAogCWlycV9leGl0KCk7CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLSNlbmRpZgotCiBleHRlcm4gdm9pZCBhcmNoX2luaXRfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3B1cmlvdXNfaW50ZXJydXB0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2tleGVjLmggYi9pbmNsdWRlL2FzbS1taXBzL2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MjY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMva2V4ZWMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICoga2V4ZWMuaCBmb3Iga2V4ZWMKKyAqIENyZWF0ZWQgYnkgPG5zY2hpY2hhbkBjb3JwLmZyZWUuZnI+IG9uIFRodSBPY3QgMTIgMTQ6NTk6MzQgMjAwNgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9NSVBTX0tFWEVDCisjIGRlZmluZSBfTUlQU19LRVhFQworCisvKiBNYXhpbXVtIHBoeXNpY2FsIGFkZHJlc3Mgd2UgY2FuIHVzZSBwYWdlcyBmcm9tICovCisjZGVmaW5lIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgKDB4MjAwMDAwMDApCisvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHJlYWNoIGluIHBoeXNpY2FsIGFkZHJlc3MgbW9kZSAqLworI2RlZmluZSBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQgKDB4MjAwMDAwMDApCisgLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiB1c2UgZm9yIHRoZSBjb250cm9sIGNvZGUgYnVmZmVyICovCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUICgweDIwMDAwMDAwKQorCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFIDQwOTYKKworLyogVGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIX01JUFMKKworI2RlZmluZSBNQVhfTk9URV9CWVRFUyAxMDI0CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcmFzaF9zZXR1cF9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqb2xkcmVncykKK3sKKwkvKiBEdW1teSBpbXBsZW1lbnRhdGlvbiBmb3Igbm93ICovCit9CisKKyNlbmRpZiAvKiAhX01JUFNfS0VYRUMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKaW5kZXggMzAxZTcxMy4uZTlmYTI1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKQEAgLTE3MCwxMCArMTcwLDggQEAKICAgICAgICAgc3RhdGljIGludCBhdWlkZV9kbWFfaG9zdF9vbihpZGVfZHJpdmVfdCAqZHJpdmUpOwogICAgICAgICBzdGF0aWMgaW50IGF1aWRlX2RtYV9sb3N0aXJxKGlkZV9kcml2ZV90ICpkcml2ZSk7CiAgICAgICAgIHN0YXRpYyBpbnQgYXVpZGVfZG1hX29uKGlkZV9kcml2ZV90ICpkcml2ZSk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIGF1aWRlX2RkbWFfdHhfY2FsbGJhY2soaW50IGlycSwgdm9pZCAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotICAgICAgICBzdGF0aWMgdm9pZCBhdWlkZV9kZG1hX3J4X2NhbGxiYWNrKGludCBpcnEsIHZvaWQgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyAgICAgICAgc3RhdGljIHZvaWQgYXVpZGVfZGRtYV90eF9jYWxsYmFjayhpbnQgaXJxLCB2b2lkICpwYXJhbSk7CisgICAgICAgIHN0YXRpYyB2b2lkIGF1aWRlX2RkbWFfcnhfY2FsbGJhY2soaW50IGlycSwgdm9pZCAqcGFyYW0pOwogICAgICAgICBzdGF0aWMgaW50IGF1aWRlX2RtYV9vZmZfcXVpZXRseShpZGVfZHJpdmVfdCAqZHJpdmUpOwogI2VuZGlmIC8qIGVuZCBDT05GSUdfQkxLX0RFVl9JREVfQVUxWFhYX01ETUEyX0RCRE1BICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L2NvYmFsdC5oCmluZGV4IGIzYzVlY2IuLjAwYjBmYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9jb2JhbHQuaApAQCAtNjcsMzQgKzY3LDkgQEAKICNkZWZpbmUgQ09CQUxUX0JSRF9JRF9RVUJFMiAgICAweDUKICNkZWZpbmUgQ09CQUxUX0JSRF9JRF9SQVEyICAgICAweDYKIAotLyoKLSAqIEdhbGlsZW8gY2hpcHNldCBhY2Nlc3MgbWFjcm9zIGZvciB0aGUgQ29iYWx0LiBUaGUgYmFzZSBhZGRyZXNzIGZvcgotICogdGhlIEdUNjQxMTEgY2hpcCBpcyAweDE0MDAwMDAwCi0gKgotICogTW9zdCBvZiB0aGlzIHJlYWxseSBzaG91bGQgZ28gaW50byBhIHNlcGFyYXRlIEdUNjQxMTEgaGVhZGVyIGZpbGUuCi0gKi8KLSNkZWZpbmUgR1Q2NDExMV9JT19CQVNFCQkweDEwMDAwMDAwVUwKLSNkZWZpbmUgR1Q2NDExMV9JT19FTkQJCTB4MTFmZmZmZmZVTAotI2RlZmluZSBHVDY0MTExX01FTV9CQVNFCTB4MTIwMDAwMDBVTAotI2RlZmluZSBHVDY0MTExX01FTV9FTkQJCTB4MTNmZmZmZmZVTAotI2RlZmluZSBHVDY0MTExX0JBU0UJCTB4MTQwMDAwMDBVTAotI2RlZmluZSBHQUxJTEVPX1JFRyhvZnMpCUNLU0VHMUFERFIoR1Q2NDExMV9CQVNFICsgKHVuc2lnbmVkIGxvbmcpKG9mcykpCi0KLSNkZWZpbmUgR0FMSUxFT19JTkwocG9ydCkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIEdBTElMRU9fUkVHKHBvcnQpKQotI2RlZmluZSBHQUxJTEVPX09VVEwodmFsLCBwb3J0KQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgR0FMSUxFT19SRUcocG9ydCkgPSAodmFsKTsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR0FMSUxFT19JTlRSX1QwRVhQCSgxIDw8IDgpCi0jZGVmaW5lIEdBTElMRU9fSU5UUl9SRVRSWV9DVFIJKDEgPDwgMjApCi0KLSNkZWZpbmUgR0FMSUxFT19FTlRDMAkJMHgwMQotI2RlZmluZSBHQUxJTEVPX1NFTFRDMAkJMHgwMgotCiAjZGVmaW5lIFBDSV9DRkdfU0VUKGRldmZuLHdoZXJlKQkJCQkJXAotCUdBTElMRU9fT1VUTCgoMHg4MDAwMDAwMCB8IChQQ0lfU0xPVCAoZGV2Zm4pIDw8IDExKSB8CQlcCi0JCShQQ0lfRlVOQyAoZGV2Zm4pIDw8IDgpIHwgKHdoZXJlKSksIEdUX1BDSTBfQ0ZHQUREUl9PRlMpCisJR1RfV1JJVEUoR1RfUENJMF9DRkdBRERSX09GUywgKDB4ODAwMDAwMDAgfCAoUENJX1NMT1QgKGRldmZuKSA8PCAxMSkgfAkJXAorCQkoUENJX0ZVTkMgKGRldmZuKSA8PCA4KSB8ICh3aGVyZSkpKQogCiAjZGVmaW5lIENPQkFMVF9MRURfUE9SVAkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBDS1NFRzFBRERSKDB4MWMwMDAwMDApKQogIyBkZWZpbmUgQ09CQUxUX0xFRF9CQVJfTEVGVAkoMSA8PCAwKQkvKiBRdWJlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L21hY2gtZ3Q2NDEyMC5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9tYWNoLWd0NjQxMjAuaAppbmRleCA1ODdmYzQzLi5hZTljNTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L21hY2gtZ3Q2NDEyMC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvbWFjaC1ndDY0MTIwLmgKQEAgLTEgKzEsMjcgQEAKLS8qIHRoZXJlJ3Mgc29tZXRoaW5nIGhlcmUgLi4uIGluIHRoZSBkYXJrICovCisvKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBfQ09CQUxUX01BQ0hfR1Q2NDEyMF9ICisjZGVmaW5lIF9DT0JBTFRfTUFDSF9HVDY0MTIwX0gKKworLyoKKyAqIENvYmFsdCB1c2VzIEdUNjQxMTEuIEdUNjQxMTEgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIEdUNjQxMjAuCisgKi8KKworI2RlZmluZSBHVDY0MTIwX0JBU0UJQ0tTRUcxQUREUihHVF9ERUZfQkFTRSkKKworI2VuZGlmIC8qIF9DT0JBTFRfTUFDSF9HVDY0MTIwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWlwc3JlZ3MuaAppbmRleCAxZjMxOGQ3Li45OTg1Y2I3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21pcHNyZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzcmVncy5oCkBAIC01NDUsNjIgKzU0NSw2IEBACiAjZGVmaW5lIE1JUFNfRlBJUl9MCQkoX1VMQ0FTVF8oMSkgPDwgMjEpCiAjZGVmaW5lIE1JUFNfRlBJUl9GNjQJCShfVUxDQVNUXygxKSA8PCAyMikKIAotLyoKLSAqIFIxMDAwMCBwZXJmb3JtYW5jZSBjb3VudGVyIGRlZmluaXRpb25zLgotICoKLSAqIEZJWE1FOiBUaGUgUjEwMDAwIHBlcmZvcm1hbmNlIGNvdW50ZXIgb3BlbnMgYSBuaWNlIHdheSB0byBpbXBsZW1lbnQgQ1BVCi0gKiAgICAgICAgdGltZSBhY2NvdW50aW5nIHdpdGggYSBwcmVjaXNzaW9uIG9mIG9uZSBjeWNsZS4gIEkgZG9uJ3QgaGF2ZQotICogICAgICAgIFIxMDAwMCBzaWxpY29uIGJ1dCBqdXN0IGEgbWFudWFsLCBzbyAuLi4KLSAqLwotCi0vKgotICogRXZlbnRzIGNvdW50ZWQgYnkgY291bnRlciAjMAotICovCi0jZGVmaW5lIENFMF9DWUNMRVMJCQkwCi0jZGVmaW5lIENFMF9JTlNOX0lTU1VFRAkJCTEKLSNkZWZpbmUgQ0UwX0xQU0NfSVNTVUVECQkJMgotI2RlZmluZSBDRTBfU19JU1NVRUQJCQkzCi0jZGVmaW5lIENFMF9TQ19JU1NVRUQJCQk0Ci0jZGVmaW5lIENFMF9TQ19GQUlMRUQJCQk1Ci0jZGVmaW5lIENFMF9CUkFOQ0hfREVDT0RFRAkJNgotI2RlZmluZSBDRTBfUVdfV0JfU0VDT05EQVJZCQk3Ci0jZGVmaW5lIENFMF9DT1JSRUNURURfRUNDX0VSUk9SUwk4Ci0jZGVmaW5lIENFMF9JQ0FDSEVfTUlTU0VTCQk5Ci0jZGVmaW5lIENFMF9TQ0FDSEVfSV9NSVNTRVMJCTEwCi0jZGVmaW5lIENFMF9TQ0FDSEVfSV9XQVlfTUlTU1BSRURJQ1RFRAkxMQotI2RlZmluZSBDRTBfRVhUX0lOVEVSVkVOVElPTlNfUkVRCTEyCi0jZGVmaW5lIENFMF9FWFRfSU5WQUxJREFURV9SRVEJCTEzCi0jZGVmaW5lIENFMF9WSVJUVUFMX0NPSEVSRU5DWV9DT05ECTE0Ci0jZGVmaW5lIENFMF9JTlNOX0dSQURVQVRFRAkJMTUKLQotLyoKLSAqIEV2ZW50cyBjb3VudGVkIGJ5IGNvdW50ZXIgIzEKLSAqLwotI2RlZmluZSBDRTFfQ1lDTEVTCQkJMAotI2RlZmluZSBDRTFfSU5TTl9HUkFEVUFURUQJCTEKLSNkZWZpbmUgQ0UxX0xQU0NfR1JBRFVBVEVECQkyCi0jZGVmaW5lIENFMV9TX0dSQURVQVRFRAkJCTMKLSNkZWZpbmUgQ0UxX1NDX0dSQURVQVRFRAkJNAotI2RlZmluZSBDRTFfRlBfSU5TTl9HUkFEVUFURUQJCTUKLSNkZWZpbmUgQ0UxX1FXX1dCX1BSSU1BUlkJCTYKLSNkZWZpbmUgQ0UxX1RMQl9SRUZJTEwJCQk3Ci0jZGVmaW5lIENFMV9CUkFOQ0hfTUlTU1BSRURJQ1RFRAk4Ci0jZGVmaW5lIENFMV9EQ0FDSEVfTUlTUwkJCTkKLSNkZWZpbmUgQ0UxX1NDQUNIRV9EX01JU1NFUwkJMTAKLSNkZWZpbmUgQ0UxX1NDQUNIRV9EX1dBWV9NSVNTUFJFRElDVEVECTExCi0jZGVmaW5lIENFMV9FWFRfSU5URVJWRU5USU9OX0hJVFMJMTIKLSNkZWZpbmUgQ0UxX0VYVF9JTlZBTElEQVRFX1JFUQkJMTMKLSNkZWZpbmUgQ0UxX1NQX0hJTlRfVE9fQ0VYQ0xfU0NfQkxPQ0tTCTE0Ci0jZGVmaW5lIENFMV9TUF9ISU5UX1RPX1NIQVJFRF9TQ19CTE9DS1MJMTUKLQotLyoKLSAqIFRoZXNlIGZsYWdzIGRlZmluZSBpbiB3aGljaCBwcml2aWxlZ2UgbW9kZSB0aGUgY291bnRlcnMgY291bnQgZXZlbnRzCi0gKi8KLSNkZWZpbmUgQ0VCX1VTRVIJOAkvKiBDb3VudCBldmVudHMgaW4gdXNlciBtb2RlLCBFWEwgPSBFUkwgPSAwICovCi0jZGVmaW5lIENFQl9TVVBFUlZJU09SCTQJLyogQ291bnQgZXZlbnRzIGluIHN1cHZlcnZpc29yIG1vZGUgRVhMID0gRVJMID0gMCAqLwotI2RlZmluZSBDRUJfS0VSTkVMCTIJLyogQ291bnQgZXZlbnRzIGluIGtlcm5lbCBtb2RlIEVYTCA9IEVSTCA9IDAgKi8KLSNkZWZpbmUgQ0VCX0VYTAkJMQkvKiBDb3VudCBldmVudHMgd2l0aCBFWEwgPSAxLCBFUkwgPSAwICovCi0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCmluZGV4IDg1YjI1OGUuLjBkYzFhNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCkBAIC0zNCw3ICszNCw5IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIGV4dGVybiB2b2lkIGNsZWFyX3BhZ2Uodm9pZCAqIHBhZ2UpOwogZXh0ZXJuIHZvaWQgY29weV9wYWdlKHZvaWQgKiB0bywgdm9pZCAqIGZyb20pOwpAQCAtMTM0LDggKzEzNiwxNCBAQAogLyogdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5ICovCiAjZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSykKIAotI2RlZmluZSBfX3BhKHgpCQkJKCh1bnNpZ25lZCBsb25nKSAoeCkgLSBQQUdFX09GRlNFVCkKLSNkZWZpbmUgX192YSh4KQkJCSgodm9pZCAqKSgodW5zaWduZWQgbG9uZykgKHgpICsgUEFHRV9PRkZTRVQpKQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiAhZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpCisjZGVmaW5lIF9fcGFfcGFnZV9vZmZzZXQoeCkJKCh1bnNpZ25lZCBsb25nKSh4KSA8IENLU0VHMCA/IFBBR0VfT0ZGU0VUIDogQ0tTRUcwKQorI2Vsc2UKKyNkZWZpbmUgX19wYV9wYWdlX29mZnNldCh4KQlQQUdFX09GRlNFVAorI2VuZGlmCisjZGVmaW5lIF9fcGEoeCkJCQkoKHVuc2lnbmVkIGxvbmcpKHgpIC0gX19wYV9wYWdlX29mZnNldCh4KSkKKyNkZWZpbmUgX19wYV9zeW1ib2woeCkJCV9fcGEoUkVMT0NfSElERSgodW5zaWduZWQgbG9uZykoeCksMCkpCisjZGVmaW5lIF9fdmEoeCkJCQkoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHgpICsgUEFHRV9PRkZTRVQpKQogCiAjZGVmaW5lIHBmbl90b19rYWRkcihwZm4pCV9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKIApAQCAtMTYwLDggKzE2OCw4IEBACiAKICNlbmRpZgogCi0jZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJcGZuX3RvX3BhZ2UoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShQRk5fRE9XTih2aXJ0X3RvX3BoeXMoa2FkZHIpKSkKKyNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoUEZOX0RPV04odmlydF90b19waHlzKGthZGRyKSkpCiAKICNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTCShWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXAogCQkJCSBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmggYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtNjQuaAppbmRleCA3ZTczMjAzLi5iOWIxZTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtNjQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtNjQuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wdWQuaD4KIApAQCAtMTAzLDYgKzEwNCwxMyBAQAogI2RlZmluZSBWTUFMTE9DX1NUQVJUCQlNQVBfQkFTRQogI2RlZmluZSBWTUFMTE9DX0VORAlcCiAJKFZNQUxMT0NfU1RBUlQgKyBQVFJTX1BFUl9QR0QgKiBQVFJTX1BFUl9QTUQgKiBQVFJTX1BFUl9QVEUgKiBQQUdFX1NJWkUpCisjaWYgZGVmaW5lZChDT05GSUdfTU9EVUxFUykgJiYgIWRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KSAmJiBcCisJVk1BTExPQ19TVEFSVCAhPSBDS1NTRUcKKy8qIExvYWQgbW9kdWxlcyBpbnRvIDMyYml0LWNvbXBhdGlibGUgc2VnbWVudC4gKi8KKyNkZWZpbmUgTU9EVUxFX1NUQVJUCUNLU1NFRworI2RlZmluZSBNT0RVTEVfRU5ECShGSVhBRERSX1NUQVJULTIqUEFHRV9TSVpFKQorZXh0ZXJuIHBnZF90IG1vZHVsZV9wZ19kaXJbUFRSU19QRVJfUEdEXTsKKyNlbmRpZgogCiAjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlMDE2bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHB0ZV92YWwoZSkpCkBAIC0xNzQsNyArMTgyLDEyIEBACiAjZGVmaW5lIF9fcG1kX29mZnNldChhZGRyZXNzKQlwbWRfaW5kZXgoYWRkcmVzcykKIAogLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIGtlcm5lbCBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLworI2lmZGVmIE1PRFVMRV9TVEFSVAorI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykgXAorCSgoYWRkcmVzcykgPj0gTU9EVUxFX1NUQVJUID8gbW9kdWxlX3BnX2RpciA6IHBnZF9vZmZzZXQoJmluaXRfbW0sIDBVTCkpCisjZWxzZQogI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykgcGdkX29mZnNldCgmaW5pdF9tbSwgMFVMKQorI2VuZGlmCiAKICNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpCSgoKGFkZHJlc3MpID4+IFBHRElSX1NISUZUKSAmIChQVFJTX1BFUl9QR0QtMSkpCiAjZGVmaW5lIHBtZF9pbmRleChhZGRyZXNzKQkoKChhZGRyZXNzKSA+PiBQTURfU0hJRlQpICYgKFBUUlNfUEVSX1BNRC0xKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKaW5kZXggMWNhNGQxZS4uZjJlMTMyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKQEAgLTY3LDcgKzY3LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHplcm9fcGFnZV9tYXNrOwogCiAjZGVmaW5lIFpFUk9fUEFHRSh2YWRkcikgXAotCSh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlICsgKCgodW5zaWduZWQgbG9uZykodmFkZHIpKSAmIHplcm9fcGFnZV9tYXNrKSkpCisJKHZpcnRfdG9fcGFnZSgodm9pZCAqKShlbXB0eV96ZXJvX3BhZ2UgKyAoKCh1bnNpZ25lZCBsb25nKSh2YWRkcikpICYgemVyb19wYWdlX21hc2spKSkpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfTU9WRV9QVEUKICNkZWZpbmUgbW92ZV9wdGUocHRlLCBwcm90LCBvbGRfYWRkciwgbmV3X2FkZHIpCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1taXBzL3B0cmFjZS5oCmluZGV4IDVmM2E5MDcuLjMwYmY1NTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wdHJhY2UuaApAQCAtODAsOCArODAsNiBAQAogI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPmNwMF9lcGMpCiAjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQogCi1leHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7Ci0KIGV4dGVybiBhc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9rbGNvbmZpZy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zbi9rbGNvbmZpZy5oCmluZGV4IGI2M2NkMDYuLjE1ZDcwY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc24va2xjb25maWcuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NuL2tsY29uZmlnLmgKQEAgLTE3Niw3ICsxNzYsNyBAQAogLyogLS0tIE5ldyBNYWNyb3MgZm9yIHRoZSBjaGFuZ2VkIGtsX2NvbmZpZ19oZHJfdCBzdHJ1Y3R1cmUgLS0tICovCiAKICNkZWZpbmUgUFRSX0NIX01BTExPQ19IRFIoX2spICAgKChrbGNfbWFsbG9jX2hkcl90ICopXAotCQkJKHVuc2lnbmVkIGxvbmcpX2sgKyAoX2stPmNoX21hbGxvY19oZHJfb2ZmKSkpCisJCQkoKHVuc2lnbmVkIGxvbmcpX2sgKyAoX2stPmNoX21hbGxvY19oZHJfb2ZmKSkpCiAKICNkZWZpbmUgS0xfQ09ORklHX0NIX01BTExPQ19IRFIoX24pICAgUFRSX0NIX01BTExPQ19IRFIoS0xfQ09ORklHX0hEUihfbikpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaAppbmRleCBjOGQ1NTg3Li5mYzMyMTdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oCkBAIC0zLDEyICszLDEzIEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBieSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMDYgYnkgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCiAjaWZuZGVmIF9BU01fU1BJTkxPQ0tfSAogI2RlZmluZSBfQVNNX1NQSU5MT0NLX0gKIAorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogCiAvKgpAQCAtNDAsNyArNDEsNiBAQAogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKIAkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCTogIj1tIiAobG9jay0+bG9jayksICI9JnIiICh0bXApCiAJCTogIm0iIChsb2NrLT5sb2NrKQpAQCAtNTMsMTkgKzUzLDIyIEBACiAJCSIJIGxpCSUxLCAxCQkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgogCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgc3luYwkJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQk6ICI9bSIgKGxvY2stPmxvY2spLCAiPSZyIiAodG1wKQogCQk6ICJtIiAobG9jay0+bG9jaykKIAkJOiAibWVtb3J5Iik7CiAJfQorCisJc21wX21iKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKKwlzbXBfbWIoKTsKKwogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX3VubG9jawlcbiIKLQkiCXN5bmMJCQkJCQlcbiIKIAkiCXN3CSQwLCAlMAkJCQkJXG4iCiAJIgkuc2V0XHRyZW9yZGVyCQkJCQlcbiIKIAk6ICI9bSIgKGxvY2stPmxvY2spCkBAIC04Niw3ICs4OSw2IEBACiAJCSIJYmVxemwJJTIsIDFiCQkJCQlcbiIKIAkJIgkgbm9wCQkJCQkJXG4iCiAJCSIJYW5kaQklMiwgJTAsIDEJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlciIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKGxvY2stPmxvY2spLCAiPSZyIiAocmVzKQogCQk6ICJtIiAobG9jay0+bG9jaykKQEAgLTk5LDEzICsxMDEsMTQgQEAKIAkJIglzYwklMiwgJTEJCQkJCVxuIgogCQkiCWJlcXoJJTIsIDFiCQkJCQlcbiIKIAkJIgkgYW5kaQklMiwgJTAsIDEJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlciIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKGxvY2stPmxvY2spLCAiPSZyIiAocmVzKQogCQk6ICJtIiAobG9jay0+bG9jaykKIAkJOiAibWVtb3J5Iik7CiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmVzID09IDA7CiB9CiAKQEAgLTE0Myw3ICsxNDYsNiBAQAogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKIAkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQogCQk6ICJtIiAocnctPmxvY2spCkBAIC0xNTYsMTIgKzE1OCwxNCBAQAogCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgogCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgc3luYwkJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKIAkJOiAibSIgKHJ3LT5sb2NrKQogCQk6ICJtZW1vcnkiKTsKIAl9CisKKwlzbXBfbWIoKTsKIH0KIAogLyogTm90ZSB0aGUgdXNlIG9mIHN1Yiwgbm90IHN1YnUgd2hpY2ggd2lsbCBtYWtlIHRoZSBrZXJuZWwgZGllIHdpdGggYW4KQEAgLTE3MSwxMyArMTc1LDE0IEBACiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIAorCXNtcF9tYigpOworCiAJaWYgKFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIjE6CWxsCSUxLCAlMgkJIyBfX3Jhd19yZWFkX3VubG9jawlcbiIKIAkJIglzdWIJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQogCQk6ICJtIiAocnctPmxvY2spCiAJCTogIm1lbW9yeSIpOwpAQCAtMTg4LDcgKzE5Myw3IEBACiAJCSIJc3ViCSUxLCAxCQkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgogCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgc3luYwkJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKIAkJOiAibSIgKHJ3LT5sb2NrKQpAQCAtMjA4LDcgKzIxMyw3IEBACiAJCSIJIGx1aQklMSwgMHg4MDAwCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKLQkJIgkgc3luYwkJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKIAkJOiAibSIgKHJ3LT5sb2NrKQpAQCAtMjIxLDE4ICsyMjYsMjIgQEAKIAkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6CSUxLCAxYgkJCQkJXG4iCi0JCSIJIHN5bmMJCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKIAkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCiAJCTogIm0iIChydy0+bG9jaykKIAkJOiAibWVtb3J5Iik7CiAJfQorCisJc21wX21iKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKKwlzbXBfbWIoKTsKKwogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIJc3luYwkJCSMgX19yYXdfd3JpdGVfdW5sb2NrCVxuIgorCSIJCQkJIyBfX3Jhd193cml0ZV91bmxvY2sJXG4iCiAJIglzdwkkMCwgJTAJCQkJCVxuIgogCTogIj1tIiAocnctPmxvY2spCiAJOiAibSIgKHJ3LT5sb2NrKQpAQCAtMjUyLDExICsyNjEsMTAgQEAKIAkJIglibmV6CSUxLCAyZgkJCQkJXG4iCiAJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCi0JCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIgkgc3luYwkJCQkJCVxuIgotI2VuZGlmCisJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiCWxpCSUyLCAxCQkJCQlcbiIKIAkJIjI6CQkJCQkJCVxuIgogCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCkBAIC0yNzEsMTAgKzI3OSw5IEBACiAJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxegklMSwgMWIJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIgkgc3luYwkJCQkJCVxuIgotI2VuZGlmCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiCWxpCSUyLCAxCQkJCQlcbiIKIAkJIjI6CQkJCQkJCVxuIgogCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCkBAIC0yOTksNyArMzA2LDggQEAKIAkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgotCQkiCSBzeW5jCQkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgorCQlfX1dFQUtfT1JERVJJTkdfTUIKIAkJIglsaQklMiwgMQkJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKIAkJIjI6CQkJCQkJCVxuIgpAQCAtMzE1LDcgKzMyMyw4IEBACiAJCSIJbHVpCSUxLCAweDgwMDAJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6CSUxLCAxYgkJCQkJXG4iCi0JCSIJIHN5bmMJCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiCWxpCSUyLCAxCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQkiMjoJCQkJCQkJXG4iCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAppbmRleCAzMDU2ZmVlLi45NDI4MDU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAzIGJ5IFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDMsIDA2IGJ5IFJhbGYgQmFlY2hsZQogICogQ29weXJpZ2h0IChDKSAxOTk2IGJ5IFBhdWwgTS4gQW50b2luZQogICogQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MKICAqIEtldmluIEQuIEtpc3NlbGwsIGtldmlua0BtaXBzLm9yZyBhbmQgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCkBAIC0xNiwxMzIgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KICNpbmNsdWRlIDxhc20vZHNwLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KIAotLyoKLSAqIHJlYWRfYmFycmllcl9kZXBlbmRzIC0gRmx1c2ggYWxsIHBlbmRpbmcgcmVhZHMgdGhhdCBzdWJzZXF1ZW50cyByZWFkcwotICogZGVwZW5kIG9uLgotICoKLSAqIE5vIGRhdGEtZGVwZW5kZW50IHJlYWRzIGZyb20gbWVtb3J5LWxpa2UgcmVnaW9ucyBhcmUgZXZlciByZW9yZGVyZWQKLSAqIG92ZXIgdGhpcyBiYXJyaWVyLiAgQWxsIHJlYWRzIHByZWNlZGluZyB0aGlzIHByaW1pdGl2ZSBhcmUgZ3VhcmFudGVlZAotICogdG8gYWNjZXNzIG1lbW9yeSAoYnV0IG5vdCBuZWNlc3NhcmlseSBvdGhlciBDUFVzJyBjYWNoZXMpIGJlZm9yZSBhbnkKLSAqIHJlYWRzIGZvbGxvd2luZyB0aGlzIHByaW1pdGl2ZSB0aGF0IGRlcGVuZCBvbiB0aGUgZGF0YSByZXR1cm4gYnkKLSAqIGFueSBvZiB0aGUgcHJlY2VkaW5nIHJlYWRzLiAgVGhpcyBwcmltaXRpdmUgaXMgbXVjaCBsaWdodGVyIHdlaWdodCB0aGFuCi0gKiBybWIoKSBvbiBtb3N0IENQVXMsIGFuZCBpcyBuZXZlciBoZWF2aWVyIHdlaWdodCB0aGFuIGlzCi0gKiBybWIoKS4KLSAqCi0gKiBUaGVzZSBvcmRlcmluZyBjb25zdHJhaW50cyBhcmUgcmVzcGVjdGVkIGJ5IGJvdGggdGhlIGxvY2FsIENQVQotICogYW5kIHRoZSBjb21waWxlci4KLSAqCi0gKiBPcmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCBieSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZXNlIHByaW1pdGl2ZXMsCi0gKiBub3QgZXZlbiBieSBkYXRhIGRlcGVuZGVuY2llcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKLSAqIG1lbW9yeV9iYXJyaWVyKCkgZm9yIGV4YW1wbGVzIGFuZCBVUkxzIHRvIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBmb3JjZSBvcmRlcmluZyAodGhlIGluaXRpYWwKLSAqIHZhbHVlIG9mICJhIiBpcyB6ZXJvLCAiYiIgaXMgb25lLCBhbmQgInAiIGlzICImYSIpOgotICoKLSAqIDxwcm9ncmFtbGlzdGluZz4KLSAqCUNQVSAwCQkJCUNQVSAxCi0gKgotICoJYiA9IDI7Ci0gKgltZW1vcnlfYmFycmllcigpOwotICoJcCA9ICZiOwkJCQlxID0gcDsKLSAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotICoJCQkJCWQgPSAqcTsKLSAqIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gKgotICogYmVjYXVzZSB0aGUgcmVhZCBvZiAiKnEiIGRlcGVuZHMgb24gdGhlIHJlYWQgb2YgInAiIGFuZCB0aGVzZQotICogdHdvIHJlYWRzIGFyZSBzZXBhcmF0ZWQgYnkgYSByZWFkX2JhcnJpZXJfZGVwZW5kcygpLiAgSG93ZXZlciwKLSAqIHRoZSBmb2xsb3dpbmcgY29kZSwgd2l0aCB0aGUgc2FtZSBpbml0aWFsIHZhbHVlcyBmb3IgImEiIGFuZCAiYiI6Ci0gKgotICogPHByb2dyYW1saXN0aW5nPgotICoJQ1BVIDAJCQkJQ1BVIDEKLSAqCi0gKglhID0gMjsKLSAqCW1lbW9yeV9iYXJyaWVyKCk7Ci0gKgliID0gMzsJCQkJeSA9IGI7Ci0gKgkJCQkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLSAqCQkJCQl4ID0gYTsKLSAqIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gKgotICogZG9lcyBub3QgZW5mb3JjZSBvcmRlcmluZywgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBkZXBlbmRlbmN5IGJldHdlZW4KLSAqIHRoZSByZWFkIG9mICJhIiBhbmQgdGhlIHJlYWQgb2YgImIiLiAgVGhlcmVmb3JlLCBvbiBzb21lIENQVXMsIHN1Y2gKLSAqIGFzIEFscGhhLCAieSIgY291bGQgYmUgc2V0IHRvIDMgYW5kICJ4IiB0byAwLiAgVXNlIHJtYigpCi0gKiBpbiBjYXNlcyBsaWtlIHRoaXMgd2hlcmUgdGhlcmUgYXJlIG5vIGRhdGEgZGVwZW5kZW5jaWVzLgotICovCi0KLSNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKLQotI2lmZGVmIENPTkZJR19DUFVfSEFTX1NZTkMKLSNkZWZpbmUgX19zeW5jKCkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJIi5zZXQJcHVzaFxuXHQiCQlcCi0JCSIuc2V0CW5vcmVvcmRlclxuXHQiCQlcCi0JCSIuc2V0CW1pcHMyXG5cdCIJCVwKLQkJInN5bmNcblx0IgkJCVwKLQkJIi5zZXQJcG9wIgkJCVwKLQkJOiAvKiBubyBvdXRwdXQgKi8JCVwKLQkJOiAvKiBubyBpbnB1dCAqLwkJXAotCQk6ICJtZW1vcnkiKQotI2Vsc2UKLSNkZWZpbmUgX19zeW5jKCkJZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSBfX2Zhc3RfaW9iKCkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJIi5zZXQJcHVzaFxuXHQiCQlcCi0JCSIuc2V0CW5vcmVvcmRlclxuXHQiCQlcCi0JCSJsdwkkMCwlMFxuXHQiCQlcCi0JCSJub3Bcblx0IgkJCVwKLQkJIi5zZXQJcG9wIgkJCVwKLQkJOiAvKiBubyBvdXRwdXQgKi8JCVwKLQkJOiAibSIgKCooaW50ICopQ0tTRUcxKQkJXAotCQk6ICJtZW1vcnkiKQotCi0jZGVmaW5lIGZhc3Rfd21iKCkJX19zeW5jKCkKLSNkZWZpbmUgZmFzdF9ybWIoKQlfX3N5bmMoKQotI2RlZmluZSBmYXN0X21iKCkJX19zeW5jKCkKLSNkZWZpbmUgZmFzdF9pb2IoKQkJCQlcCi0JZG8gewkJCQkJXAotCQlfX3N5bmMoKTsJCQlcCi0JCV9fZmFzdF9pb2IoKTsJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2lmZGVmIENPTkZJR19DUFVfSEFTX1dCCi0KLSNpbmNsdWRlIDxhc20vd2JmbHVzaC5oPgotCi0jZGVmaW5lIHdtYigpCQlmYXN0X3dtYigpCi0jZGVmaW5lIHJtYigpCQlmYXN0X3JtYigpCi0jZGVmaW5lIG1iKCkJCXdiZmx1c2goKQotI2RlZmluZSBpb2IoKQkJd2JmbHVzaCgpCi0KLSNlbHNlIC8qICFDT05GSUdfQ1BVX0hBU19XQiAqLwotCi0jZGVmaW5lIHdtYigpCQlmYXN0X3dtYigpCi0jZGVmaW5lIHJtYigpCQlmYXN0X3JtYigpCi0jZGVmaW5lIG1iKCkJCWZhc3RfbWIoKQotI2RlZmluZSBpb2IoKQkJZmFzdF9pb2IoKQotCi0jZW5kaWYgLyogIUNPTkZJR19DUFVfSEFTX1dCICovCi0KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIHNtcF9tYigpCW1iKCkKLSNkZWZpbmUgc21wX3JtYigpCXJtYigpCi0jZGVmaW5lIHNtcF93bWIoKQl3bWIoKQotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCi0jZWxzZQotI2RlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3JtYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfd21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIFwKLWRvIHsgdmFyID0gdmFsdWU7IG1iKCk7IH0gd2hpbGUgKDApCiAKIC8qCiAgKiBzd2l0Y2hfdG8obikgc2hvdWxkIHN3aXRjaCB0YXNrcyB0byB0YXNrIG5yIG4sIGZpcnN0CkBAIC0yMTcsOSArOTcsNiBAQAogCQkiCS5zZXQJbWlwczMJCQkJCVxuIgogCQkiCXNjCSUyLCAlMQkJCQkJXG4iCiAJCSIJYmVxemwJJTIsIDFiCQkJCQlcbiIKLSNpZmRlZiBDT05GSUdfU01QCi0JCSIJc3luYwkJCQkJCVxuIgotI2VuZGlmCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJldHZhbCksICI9bSIgKCptKSwgIj0mciIgKGR1bW15KQogCQk6ICJSIiAoKm0pLCAiSnIiICh2YWwpCkBAIC0yMzUsOSArMTEyLDYgQEAKIAkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKIAkJIglzYwklMiwgJTEJCQkJCVxuIgogCQkiCWJlcXoJJTIsIDFiCQkJCQlcbiIKLSNpZmRlZiBDT05GSUdfU01QCi0JCSIJc3luYwkJCQkJCVxuIgotI2VuZGlmCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJldHZhbCksICI9bSIgKCptKSwgIj0mciIgKGR1bW15KQogCQk6ICJSIiAoKm0pLCAiSnIiICh2YWwpCkBAIC0yNTEsNiArMTI1LDggQEAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkvKiBpbXBsaWVzIG1lbW9yeSBiYXJyaWVyICAqLwogCX0KIAorCXNtcF9tYigpOworCiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjY4LDkgKzE0NCw2IEBACiAJCSIJbW92ZQklMiwgJXo0CQkJCQlcbiIKIAkJIglzY2QJJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1tIiAoKm0pLCAiPSZyIiAoZHVtbXkpCiAJCTogIlIiICgqbSksICJKciIgKHZhbCkKQEAgLTI4NCw5ICsxNTcsNiBAQAogCQkiCW1vdmUJJTIsICV6NAkJCQkJXG4iCiAJCSIJc2NkCSUyLCAlMQkJCQkJXG4iCiAJCSIJYmVxegklMiwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1tIiAoKm0pLCAiPSZyIiAoZHVtbXkpCiAJCTogIlIiICgqbSksICJKciIgKHZhbCkKQEAgLTMwMCw2ICsxNzAsOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CS8qIGltcGxpZXMgbWVtb3J5IGJhcnJpZXIgICovCiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogI2Vsc2UKQEAgLTM0NSw5ICsyMTcsNiBAQAogCQkiCS5zZXQJbWlwczMJCQkJCVxuIgogCQkiCXNjCSQxLCAlMQkJCQkJXG4iCiAJCSIJYmVxemwJJDEsIDFiCQkJCQlcbiIKLSNpZmRlZiBDT05GSUdfU01QCi0JCSIJc3luYwkJCQkJCVxuIgotI2VuZGlmCiAJCSIyOgkJCQkJCQlcbiIKIAkJIgkuc2V0CXBvcAkJCQkJXG4iCiAJCTogIj0mciIgKHJldHZhbCksICI9UiIgKCptKQpAQCAtMzY1LDkgKzIzNCw2IEBACiAJCSIJLnNldAltaXBzMwkJCQkJXG4iCiAJCSIJc2MJJDEsICUxCQkJCQlcbiIKIAkJIgliZXF6CSQxLCAxYgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiMjoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQk6ICI9JnIiIChyZXR2YWwpLCAiPVIiICgqbSkKQEAgLTM4Myw2ICsyNDksOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CS8qIGltcGxpZXMgbWVtb3J5IGJhcnJpZXIgICovCiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00MDIsOSArMjcwLDYgQEAKIAkJIgltb3ZlCSQxLCAlejQJCQkJCVxuIgogCQkiCXNjZAkkMSwgJTEJCQkJCVxuIgogCQkiCWJlcXpsCSQxLCAxYgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiMjoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQk6ICI9JnIiIChyZXR2YWwpLCAiPVIiICgqbSkKQEAgLTQyMCw5ICsyODUsNiBAQAogCQkiCW1vdmUJJDEsICV6NAkJCQkJXG4iCiAJCSIJc2NkCSQxLCAlMQkJCQkJXG4iCiAJCSIJYmVxegkkMSwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIjI6CQkJCQkJCVxuIgogCQkiCS5zZXQJcG9wCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1SIiAoKm0pCkBAIC00MzgsNiArMzAwLDggQEAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkvKiBpbXBsaWVzIG1lbW9yeSBiYXJyaWVyICAqLwogCX0KIAorCXNtcF9tYigpOworCiAJcmV0dXJuIHJldHZhbDsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3RpbWUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdGltZS5oCmluZGV4IDYyNWFjZDMuLmE2MzJjZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdGltZS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogCiBleHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKIApAQCAtNDQsMTIgKzQ1LDEwIEBACiBleHRlcm4gdm9pZCAoKm1pcHNfdGltZXJfYWNrKSh2b2lkKTsKIAogLyoKLSAqIEhpZ2ggcHJlY2lzaW9uIHRpbWVyIGZ1bmN0aW9ucy4KLSAqIElmIG1pcHNfaHB0X3JlYWQgaXMgTlVMTCwgYW4gUjRrLWNvbXBhdGlibGUgdGltZXIgc2V0dXAgaXMgYXR0ZW1wdGVkLgorICogSGlnaCBwcmVjaXNpb24gdGltZXIgY2xvY2tzb3VyY2UuCisgKiBJZiAucmVhZCBpcyBOVUxMLCBhbiBSNGstY29tcGF0aWJsZSB0aW1lciBzZXR1cCBpcyBhdHRlbXB0ZWQuCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgKCptaXBzX2hwdF9yZWFkKSh2b2lkKTsKLWV4dGVybiB2b2lkICgqbWlwc19ocHRfaW5pdCkodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IG1pcHNfaHB0X21hc2s7CitleHRlcm4gc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX21pcHM7CiAKIC8qCiAgKiB0b190bSgpIGNvbnZlcnRzIHN5c3RlbSB0aW1lIGJhY2sgdG8gKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYykuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL3R5cGVzLmgKaW5kZXggMmI1MmUxOC4uNjNhMTNjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdHlwZXMuaApAQCAtOTMsMTYgKzkzLDYgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX3Q7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19MQkQKLXR5cGVkZWYgdTY0IHNlY3Rvcl90OwotI2RlZmluZSBIQVZFX1NFQ1RPUl9UCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19MU0YKLXR5cGVkZWYgdTY0IGJsa2NudF90OwotI2RlZmluZSBIQVZFX0JMS0NOVF9UCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvY2hlY2tzdW0uaAppbmRleCAyMjljYjU2Li5jYzNlYzFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvY2hlY2tzdW0uaApAQCAtMTUsNyArMTUsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKiwgaW50LCBfX3dzdW0pOwogCiAvKgogICogVGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0IGNoZWNrc3Vtcy4KQEAgLTIzLDE1ICsyMywxNCBAQAogICogSGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICosIHZvaWQgKiwgaW50LCBfX3dzdW0pOwogCiAvKgogICogdGhpcyBpcyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBhYm92ZSB0aGF0IHJlY29yZHMgZXJyb3JzIGl0IGZpbmRzIGluICplcnJwLAogICogYnV0IGNvbnRpbnVlcyBhbmQgemVyb3MgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywKLQkJdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycnApOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwkJdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycnApOwogCiAvKgogICoJT3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLCB3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgpAQCAtMzksMTEgKzM4LDEwIEBACiAgKglXcml0dGVuIGJ5IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPiwgYW5kIHRoZW4gbXVja2VkIHdpdGggYnkKICAqCUxhTW9udCBKb25lcyA8bGFtb250QGRlYmlhbi5vcmc+CiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlobCkgeworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CiAJdW5zaWduZWQgaW50IHN1bTsKIAotCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogIglsZHdzLG1hCQk0KCUxKSwgJTBcbiIKICIJYWRkaWIsPD0JLTQsICUyLCAyZlxuIgpAQCAtNjksMjcgKzY3LDI3IEBACiAJOiAiMSIgKGlwaCksICIyIiAoaWhsKQogCTogInIxOSIsICJyMjAiLCAicjIxIiApOwogCi0JcmV0dXJuKHN1bSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBjc3VtKQogeworCXUzMiBzdW0gPSAoX19mb3JjZSB1MzIpY3N1bTsKIAkvKiBhZGQgdGhlIHN3YXBwZWQgdHdvIDE2LWJpdCBoYWx2ZXMgb2Ygc3VtLAogCSAgIGEgcG9zc2libGUgY2FycnkgZnJvbSBhZGRpbmcgdGhlIHR3byAxNi1iaXQgaGFsdmVzLAogCSAgIHdpbGwgY2FycnkgZnJvbSB0aGUgbG93ZXIgaGFsZiBpbnRvIHRoZSB1cHBlciBoYWxmLAogCSAgIGdpdmluZyB1cyB0aGUgY29ycmVjdCBzdW0gaW4gdGhlIHVwcGVyIGhhbGYuICovCiAJc3VtICs9IChzdW0gPDwgMTYpICsgKHN1bSA+PiAxNik7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofnN1bSA+PiAxNik7CiB9CiAgCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKSAKKwkJCQkJICAgICAgIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkiCWFkZCAgJTEsICUwLCAlMFxuIgpAQCAtOTcsMTkgKzk1LDE4IEBACiAJIglhZGRjICUzLCAlMCwgJTBcbiIKIAkiCWFkZGMgJSVyMCwgJTAsICUwXG4iCiAJCTogIj1yIiAoc3VtKQotCQk6ICJyIiAoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIoKHByb3RvPDwxNikrbGVuKSwgIjAiKHN1bSkpOwotICAgIHJldHVybiBzdW07CisJCTogInIiIChkYWRkciksICJyIihzYWRkciksICJyIihwcm90bytsZW4pLCAiMCIoc3VtKSk7CisJcmV0dXJuIHN1bTsKIH0KIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkgCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTExOCwxNyArMTE1LDE3IEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZiwgaW50IGxlbikgeworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CiAJIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWYsIGxlbiwgMCkpOwogfQogCiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJCSAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQkJCSAgICAgX191MTYgbGVuLAotCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgdW5zaWduZWQgaW50IHN1bSkgCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCSAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgKIApAQCAtMTkzLDkgKzE5MCw5IEBACiAgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCiAgKi8KICNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfdG9fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQkJICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwKLQkJCQkJCSAgICAgIGludCBsZW4sIGludCBzdW0sIAorc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsCisJCQkJCQkgICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkJCQkJICAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCSAgICAgIGludCAqZXJyX3B0cikKIHsKIAkvKiBjb2RlIHN0b2xlbiBmcm9tIGluY2x1ZGUvYXNtLW1pcHM2NCAqLwpAQCAtMjAzLDcgKzIwMCw3IEBACiAJIAogCWlmIChjb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbikpIHsKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7CiAJfQogCiAJcmV0dXJuIHN1bTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9kbWEuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9kbWEuaAppbmRleCBkYTJjZjM3Li4zMWFkMGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2RtYS5oCkBAIC0xNywxMCArMTcsMTAgQEAKIAogLyoKICoqIERNQV9DSFVOS19TSVpFIGlzIHVzZWQgYnkgdGhlIFNDU0kgbWlkLWxheWVyIHRvIGJyZWFrIHVwCi0qKiAob3IgcmF0aGVyIG5vdCBtZXJnZSkgRE1BJ3MgaW50byBtYW5hZ2FibGUgY2h1bmtzLgorKiogKG9yIHJhdGhlciBub3QgbWVyZ2UpIERNQXMgaW50byBtYW5hZ2VhYmxlIGNodW5rcy4KICoqIE9uIHBhcmlzYywgdGhpcyBpcyBtb3JlIG9mIHRoZSBzb2Z0d2FyZS90dW5pbmcgY29uc3RyYWludAotKiogcmF0aGVyIHRoYW4gdGhlIEhXLiBJL08gTU1VIGFsbG9jYXRpb24gYWxvZ29yaXRobXMgY2FuIGJlCi0qKiBmYXN0ZXIgd2l0aCBzbWFsbGVyIHNpemUgaXMgKHRvIHNvbWUgZGVncmVlKS4KKyoqIHJhdGhlciB0aGFuIHRoZSBIVy4gSS9PIE1NVSBhbGxvY2F0aW9uIGFsZ29yaXRobXMgY2FuIGJlCisqKiBmYXN0ZXIgd2l0aCBzbWFsbGVyIHNpemVzICh0byBzb21lIGRlZ3JlZSkuCiAqLwogI2RlZmluZSBETUFfQ0hVTktfU0laRQkoQklUU19QRVJfTE9ORypQQUdFX1NJWkUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaAppbmRleCA3YjhhZDExLi43YjNiZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCkBAIC0xNDksNyArMTQ5LDcgQEAKIC8qCiAqKiBNb3N0IFBDSSBkZXZpY2VzIChlZyBUdWxpcCwgTkNSNzIwKSBhbHNvIGV4cG9ydCB0aGUgc2FtZSByZWdpc3RlcnMKICoqIHRvIGJvdGggTU1JTyBhbmQgSS9PIHBvcnQgc3BhY2UuICBEdWUgdG8gcG9vciBwZXJmb3JtYW5jZSBvZiBJL08gUG9ydAotKiogYWNjZXNzIHVuZGVyIEhQIFBDSSBidXMgYWRhcHRlcnMsIHN0cm9uZ2x5IHJlY2NvbWVuZCB1c2Ugb2YgTU1JTworKiogYWNjZXNzIHVuZGVyIEhQIFBDSSBidXMgYWRhcHRlcnMsIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGUgdXNlIG9mIE1NSU8KICoqIGFkZHJlc3Mgc3BhY2UuCiAqKgogKiogV2hpbGUgSSdtIGF0IGl0IG1vcmUgUEEgcHJvZ3JhbW1pbmcgbm90ZXM6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvcm9wZXMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9yb3Blcy5oCmluZGV4IDU1NDJkZDAuLjAwN2E4ODA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2Mvcm9wZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvcm9wZXMuaApAQCAtMTQsNyArMTQsNyBAQAogI2VuZGlmCiAKIC8qCi0qKiBUaGUgbnVtYmVyIG9mIHBkaXIgZW50cmllcyB0byAiZnJlZSIgYmVmb3JlIGlzc3VlaW5nCisqKiBUaGUgbnVtYmVyIG9mIHBkaXIgZW50cmllcyB0byAiZnJlZSIgYmVmb3JlIGlzc3VpbmcKICoqIGEgcmVhZCB0byBQQ09NIHJlZ2lzdGVyIHRvIGZsdXNoIG91dCBQQ09NIHdyaXRlcy4KICoqIEludGVyYWN0cyB3aXRoIGFsbG9jYXRpb24gZ3JhbnVsYXJpdHkgKGllIDQgb3IgOCBlbnRyaWVzCiAqKiBhbGxvY2F0ZWQgYW5kIGZyZWUnZC9wdXJnZWQgYXQgYSB0aW1lIG1pZ2h0IG1ha2UgdGhpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3NlbWFwaG9yZS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NlbWFwaG9yZS5oCmluZGV4IGM5ZWU0MWMuLmQ0NTgyN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zZW1hcGhvcmUuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc2VtYXBob3JlLmgKQEAgLTExNSw3ICsxMTUsOCBAQAogICovCiBleHRlcm4gX19pbmxpbmVfXyBpbnQgZG93bl90cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7Ci0JaW50IGZsYWdzLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPnNlbnRyeSwgZmxhZ3MpOwogCWNvdW50ID0gc2VtLT5jb3VudCAtIDE7CkBAIC0xMzEsNyArMTMyLDggQEAKICAqLwogZXh0ZXJuIF9faW5saW5lX18gdm9pZCB1cChzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQogewotCWludCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+c2VudHJ5LCBmbGFncyk7CiAJaWYgKHNlbS0+Y291bnQgPCAwKSB7CiAJCV9fdXAoc2VtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvS2J1aWxkIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9LYnVpbGQKaW5kZXggOTgyNzg0OS4uMWU2MzczOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9LYnVpbGQKQEAgLTE3LDYgKzE3LDcgQEAKIGhlYWRlci15ICs9IHBvbGwuaAogaGVhZGVyLXkgKz0gc2htcGFyYW0uaAogaGVhZGVyLXkgKz0gc29ja2lvcy5oCitoZWFkZXIteSArPSBzcHVfaW5mby5oCiBoZWFkZXIteSArPSB1Y29udGV4dC5oCiBoZWFkZXIteSArPSBpb2N0bC5oCiBoZWFkZXIteSArPSBsaW5rYWdlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2VsbC1wbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2VsbC1wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMyZWJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jZWxsLXBtdS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ2VsbCBCcm9hZGJhbmQgRW5naW5lIFBlcmZvcm1hbmNlIE1vbml0b3IKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2CisgKgorICogQXV0aG9yOgorICogICBEYXZpZCBFcmIgKGRqZXJiQHVzLmlibS5jb20pCisgKiAgIEtldmluIENvcnJ5IChrZXZjb3JyeUB1cy5pYm0uY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fQ0VMTF9QTVVfSF9fCisjZGVmaW5lIF9fQVNNX0NFTExfUE1VX0hfXworCisvKiBUaGUgQ2VsbCBQTVUgaGFzIGZvdXIgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlcnMsIHdoaWNoIGNhbiBiZQorICogY29uZmlndXJlZCBhcyBmb3VyIDMyLWJpdCBjb3VudGVycyBvciBlaWdodCAxNi1iaXQgY291bnRlcnMuCisgKi8KKyNkZWZpbmUgTlJfUEhZU19DVFJTIDQKKyNkZWZpbmUgTlJfQ1RSUyAgICAgIChOUl9QSFlTX0NUUlMgKiAyKQorCisvKiBNYWNyb3MgZm9yIHRoZSBwbV9jb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBDQkVfUE1fMTZCSVRfQ1RSKGN0cikgICAgICAgICAgICAgICgxIDw8ICgyNCAtICgoY3RyKSAmIChOUl9QSFlTX0NUUlMgLSAxKSkpKQorI2RlZmluZSBDQkVfUE1fRU5BQkxFX1BFUkZfTU9OICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgQ0JFX1BNX1NUT1BfQVRfTUFYICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIENCRV9QTV9UUkFDRV9NT0RFX0dFVChwbV9jb250cm9sKSAgKCgocG1fY29udHJvbCkgPj4gMjgpICYgMHgzKQorI2RlZmluZSBDQkVfUE1fVFJBQ0VfTU9ERV9TRVQobW9kZSkgICAgICAgICgoKG1vZGUpICAmIDB4MykgPDwgMjgpCisjZGVmaW5lIENCRV9QTV9DT1VOVF9NT0RFX1NFVChjb3VudCkgICAgICAgKCgoY291bnQpICYgMHgzKSA8PCAxOCkKKyNkZWZpbmUgQ0JFX1BNX0ZSRUVaRV9BTExfQ1RSUyAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIENCRV9QTV9FTkFCTEVfRVhUX1RSQUNFICAgICAgICAgICAgMHgwMDAwODAwMAorCisvKiBNYWNyb3MgZm9yIHRoZSB0cmFjZV9hZGRyZXNzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBDQkVfUE1fVFJBQ0VfQlVGX0ZVTEwgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQ0JFX1BNX1RSQUNFX0JVRl9FTVBUWSAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIENCRV9QTV9UUkFDRV9CVUZfREFUQV9DT1VOVCh0YSkgICAgKCh0YSkgJiAweDNmZikKKyNkZWZpbmUgQ0JFX1BNX1RSQUNFX0JVRl9NQVhfQ09VTlQgICAgICAgICAweDQwMAorCisvKiBNYWNyb3MgZm9yIHRoZSBwbTA3X2NvbnRyb2wgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBDQkVfUE1fQ1RSX0lOUFVUX01VWChwbTA3X2NvbnRyb2wpICgoKHBtMDdfY29udHJvbCkgPj4gMjYpICYgMHgzZikKKyNkZWZpbmUgQ0JFX1BNX0NUUl9JTlBVVF9DT05UUk9MICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIENCRV9QTV9DVFJfUE9MQVJJVFkgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBDQkVfUE1fQ1RSX0NPVU5UX0NZQ0xFUyAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQ0JFX1BNX0NUUl9FTkFCTEUgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisKKy8qIE1hY3JvcyBmb3IgdGhlIHBtX3N0YXR1cyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKGN0cikgICAgICAoMSA8PCAoMzEgLSAoKGN0cikgJiA3KSkpCisKK2VudW0gcG1fcmVnX25hbWUgeworCWdyb3VwX2NvbnRyb2wsCisJZGVidWdfYnVzX2NvbnRyb2wsCisJdHJhY2VfYWRkcmVzcywKKwlleHRfdHJfdGltZXIsCisJcG1fc3RhdHVzLAorCXBtX2NvbnRyb2wsCisJcG1faW50ZXJ2YWwsCisJcG1fc3RhcnRfc3RvcCwKK307CisKKy8qIFJvdXRpbmVzIGZvciByZWFkaW5nL3dyaXRpbmcgdGhlIFBNVSByZWdpc3RlcnMuICovCitleHRlcm4gdTMyICBjYmVfcmVhZF9waHlzX2N0cih1MzIgY3B1LCB1MzIgcGh5c19jdHIpOworZXh0ZXJuIHZvaWQgY2JlX3dyaXRlX3BoeXNfY3RyKHUzMiBjcHUsIHUzMiBwaHlzX2N0ciwgdTMyIHZhbCk7CitleHRlcm4gdTMyICBjYmVfcmVhZF9jdHIodTMyIGNwdSwgdTMyIGN0cik7CitleHRlcm4gdm9pZCBjYmVfd3JpdGVfY3RyKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiB2YWwpOworCitleHRlcm4gdTMyICBjYmVfcmVhZF9wbTA3X2NvbnRyb2wodTMyIGNwdSwgdTMyIGN0cik7CitleHRlcm4gdm9pZCBjYmVfd3JpdGVfcG0wN19jb250cm9sKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiB2YWwpOworZXh0ZXJuIHUzMiAgY2JlX3JlYWRfcG0odTMyIGNwdSwgZW51bSBwbV9yZWdfbmFtZSByZWcpOworZXh0ZXJuIHZvaWQgY2JlX3dyaXRlX3BtKHUzMiBjcHUsIGVudW0gcG1fcmVnX25hbWUgcmVnLCB1MzIgdmFsKTsKKworZXh0ZXJuIHUzMiAgY2JlX2dldF9jdHJfc2l6ZSh1MzIgY3B1LCB1MzIgcGh5c19jdHIpOworZXh0ZXJuIHZvaWQgY2JlX3NldF9jdHJfc2l6ZSh1MzIgY3B1LCB1MzIgcGh5c19jdHIsIHUzMiBjdHJfc2l6ZSk7CisKK2V4dGVybiB2b2lkIGNiZV9lbmFibGVfcG0odTMyIGNwdSk7CitleHRlcm4gdm9pZCBjYmVfZGlzYWJsZV9wbSh1MzIgY3B1KTsKKworZXh0ZXJuIHZvaWQgY2JlX3JlYWRfdHJhY2VfYnVmZmVyKHUzMiBjcHUsIHU2NCAqYnVmKTsKKworZXh0ZXJuIHZvaWQgY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUsIHUzMiB0aHJlYWQsIHUzMiBtYXNrKTsKK2V4dGVybiB2b2lkIGNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHModTMyIGNwdSk7CitleHRlcm4gdTMyICBjYmVfcXVlcnlfcG1faW50ZXJydXB0cyh1MzIgY3B1KTsKK2V4dGVybiB1MzIgIGNiZV9jbGVhcl9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUpOworZXh0ZXJuIHZvaWQgY2JlX3N5bmNfaXJxKGludCBub2RlKTsKKworLyogVXRpbGl0eSBmdW5jdGlvbnMsIG1hY3JvcyAqLworZXh0ZXJuIHUzMiBjYmVfZ2V0X2h3X3RocmVhZF9pZChpbnQgY3B1KTsKKworI2RlZmluZSBjYmVfY3B1X3RvX25vZGUoY3B1KSAoKGNwdSkgPj4gMSkKKworI2RlZmluZSBDQkVfQ09VTlRfU1VQRVJWSVNPUl9NT0RFICAgICAgIDAKKyNkZWZpbmUgQ0JFX0NPVU5UX0hZUEVSVklTT1JfTU9ERSAgICAgICAxCisjZGVmaW5lIENCRV9DT1VOVF9QUk9CTEVNX01PREUgICAgICAgICAgMgorI2RlZmluZSBDQkVfQ09VTlRfQUxMX01PREVTICAgICAgICAgICAgIDMKKworLyogTWFjcm9zIGZvciB0aGUgcG0wN19jb250cm9sIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgUE0wN19DVFJfSU5QVVRfTVVYKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4M0YpIDw8IDI2KQorI2RlZmluZSBQTTA3X0NUUl9JTlBVVF9DT05UUk9MKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMSkgPDwgMjUpCisjZGVmaW5lIFBNMDdfQ1RSX1BPTEFSSVRZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAxKSA8PCAyNCkKKyNkZWZpbmUgUE0wN19DVFJfQ09VTlRfQ1lDTEVTKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDEpIDw8IDIzKQorI2RlZmluZSBQTTA3X0NUUl9FTkFCTEUoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMSkgPDwgMjIpCisKKyNlbmRpZiAvKiBfX0FTTV9DRUxMX1BNVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2hlY2tzdW0uaAppbmRleCA2MDllY2JiLi43Y2RmMzU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jaGVja3N1bS5oCkBAIC0xNCwxNyArMTQsMTYgQEAKICAqIHdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuICBpaGwgaXMgdGhlIG51bWJlcgogICogb2YgMzItYml0IHdvcmRzIGFuZCBpcyBhbHdheXMgPj0gNS4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK2V4dGVybiBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpOwogCiAvKgogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorZXh0ZXJuIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCXVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCXVuc2lnbmVkIGludCBzdW0pOworCQkJCQlfX3dzdW0gc3VtKTsKIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLApAQCAtMzgsOCArMzcsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwKLQkJCQkgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIENvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBzcmMsIGxlbmd0aCBsZW4sCkBAIC01MSwyMCArNDksMTUgQEAKICAqIExpa2UgY3N1bV9wYXJ0aWFsLCB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLAogICogZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudC4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAogCQkJCQkgICAgICBpbnQgKnNyY19lcnIsIGludCAqZHN0X2Vycik7CiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHRvIGRzdCB3aGlsZSBpdAogICogY2hlY2tzdW1zLgogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIAotCQkJCSAgICAgICBjaGFyICpkc3QsIAotCQkJCSAgICAgICBpbnQgbGVuLCAKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSk7Ci0KICNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgZXJycCkgICBcCi0gICAgICAgIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSksIChlcnJwKSwgTlVMTCkKKyAgICAgICAgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSksIChlcnJwKSwgTlVMTCkKIAogI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkgICBcCiAgICAgICAgIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSksIE5VTEwsIE5VTEwpCkBAIC03NCw3ICs2Nyw3IEBACiAgKiB0dXJucyBhIDMyLWJpdCBwYXJ0aWFsIGNoZWNrc3VtIChlLmcuIGZyb20gY3N1bV9wYXJ0aWFsKSBpbnRvIGEKICAqIDEncyBjb21wbGVtZW50IDE2LWJpdCBjaGVja3N1bS4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtODMsNDEgKzc2LDMyIEBACiAJLyogaWYgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIGFkZGluZyB0aGUgdHdvIDE2LWJpdCBoYWx2ZXMsCiAJICAgaXQgd2lsbCBjYXJyeSBmcm9tIHRoZSBsb3dlciBoYWxmIGludG8gdGhlIHVwcGVyIGhhbGYsCiAJICAgZ2l2aW5nIHVzIHRoZSBjb3JyZWN0IHN1bSBpbiB0aGUgdXBwZXIgaGFsZi4gKi8KLQlzdW0gPSB+KHN1bSArIHRtcCkgPj4gMTY7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofigoX19mb3JjZSB1MzIpc3VtICsgdG1wKSA+PiAxNik7CiB9CiAKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCi1zdGF0aWMgaW5saW5lIHUzMiBjc3VtX3RjcHVkcF9ub2ZvbGQodTMyIHNhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3dzdW0gc3VtKQogewotCXVuc2lnbmVkIGxvbmcgcyA9IHN1bTsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJdW5zaWduZWQgbG9uZyBzID0gKF9fZm9yY2UgdTMyKXN1bTsKIAotCXMgKz0gc2FkZHI7Ci0JcyArPSBkYWRkcjsKLQlzICs9IChwcm90byA8PCAxNikgKyBsZW47CisJcyArPSAoX19mb3JjZSB1MzIpc2FkZHI7CisJcyArPSAoX19mb3JjZSB1MzIpZGFkZHI7CisJcyArPSBwcm90byArIGxlbjsKIAlzICs9IChzID4+IDMyKTsKLQlyZXR1cm4gKHUzMikgczsKLX0KKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKSBzOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCi17CiAgICAgX19hc21fXygiXG5cCiAJYWRkYyAlMCwlMCwlMSBcblwKIAlhZGRlICUwLCUwLCUyIFxuXApAQCAtMTI1LDEwICsxMDksOSBAQAogCWFkZHplICUwLCUwIFxuXAogCSIKIAk6ICI9ciIgKHN1bSkKLQk6ICJyIiAoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIoKHByb3RvPDwxNikrbGVuKSwgIjAiKHN1bSkpOwotICAgIHJldHVybiBzdW07Ci19Ci0KKwk6ICJyIiAoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIocHJvdG8gKyBsZW4pLCAiMCIoc3VtKSk7CisJcmV0dXJuIHN1bTsKICNlbmRpZgorfQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCmluZGV4IGE5YTQwMTQuLjZmZTVjOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKQEAgLTI0LDYgKzI0LDggQEAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfSUNBQ0hFX1NOT09QCTB4MDAwMDIwMDAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfQVJDSF8yXzA1CQkweDAwMDAxMDAwCiAjZGVmaW5lIFBQQ19GRUFUVVJFX1BBNlQJCTB4MDAwMDA4MDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfSEFTX0RGUAkJMHgwMDAwMDQwMAorI2RlZmluZSBQUENfRkVBVFVSRV9QT1dFUjZfRVhUCQkweDAwMDAwMjAwCiAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfVFJVRV9MRQkJMHgwMDAwMDAwMgogI2RlZmluZSBQUENfRkVBVFVSRV9QUENfTEUJCTB4MDAwMDAwMDEKQEAgLTQ1LDYgKzQ3LDcgQEAKIAlQUENfT1BST0ZJTEVfUE9XRVI0ID0gMiwKIAlQUENfT1BST0ZJTEVfRzQgPSAzLAogCVBQQ19PUFJPRklMRV9CT09LRSA9IDQsCisJUFBDX09QUk9GSUxFX0NFTEwgPSA1LAogfTsKIAogc3RydWN0IGNwdV9zcGVjIHsKQEAgLTkxLDcgKzk0LDcgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBfX3N0YXJ0X19fZnRyX2ZpeHVwLCBfX3N0b3BfX19mdHJfZml4dXA7CiAKLWV4dGVybiBzdHJ1Y3QgY3B1X3NwZWMgKmlkZW50aWZ5X2NwdSh1bnNpZ25lZCBsb25nIG9mZnNldCk7CitleHRlcm4gc3RydWN0IGNwdV9zcGVjICppZGVudGlmeV9jcHUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBwdnIpOwogZXh0ZXJuIHZvaWQgZG9fZmVhdHVyZV9maXh1cHModW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqZml4dXBfc3RhcnQsCiAJCQkgICAgICB2b2lkICpmaXh1cF9lbmQpOwogCkBAIC0xNDgsMTkgKzE1MSwxMyBAQAogI2RlZmluZSBDUFVfRlRSX1BBVVNFX1pFUk8JCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDIwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9QVVJSCQkJTE9OR19BU01fQ09OU1QoMHgwMDAwNDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NFTExfVEJfQlVHCQlMT05HX0FTTV9DT05TVCgweDAwMDA4MDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfU1BVUlIJCQlMT05HX0FTTV9DT05TVCgweDAwMDEwMDAwMDAwMDAwMDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNkZWZpbmUgQ1BVX0ZUUl9QUENBU19BUkNIX1YyX0JBU0UgKENQVV9GVFJfU0xCIHwgXAotCQkJCQlDUFVfRlRSX1RMQklFTCB8IENQVV9GVFJfTk9FWEVDVVRFIHwgXAotCQkJCQlDUFVfRlRSX05PRFNJU1JBTElHTikKLQotLyogaVNlcmllcyBkb2Vzbid0IHN1cHBvcnQgbGFyZ2UgcGFnZXMgKi8KLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLSNkZWZpbmUgQ1BVX0ZUUl9QUENBU19BUkNIX1YyCShDUFVfRlRSX1BQQ0FTX0FSQ0hfVjJfQkFTRSkKLSNlbHNlCi0jZGVmaW5lIENQVV9GVFJfUFBDQVNfQVJDSF9WMgkoQ1BVX0ZUUl9QUENBU19BUkNIX1YyX0JBU0UgfCBDUFVfRlRSXzE2TV9QQUdFKQotI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLworI2RlZmluZSBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIJKENQVV9GVFJfU0xCIHwgXAorCQkJCSBDUFVfRlRSX1RMQklFTCB8IENQVV9GVFJfTk9FWEVDVVRFIHwgXAorCQkJCSBDUFVfRlRSX05PRFNJU1JBTElHTiB8IENQVV9GVFJfMTZNX1BBR0UpCiAKIC8qIFdlIG9ubHkgc2V0IHRoZSBhbHRpdmVjIGZlYXR1cmVzIGlmIHRoZSBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGggYWx0aXZlYwogICogc3VwcG9ydApAQCAtMzExLDcgKzMwOCw4IEBACiAjZGVmaW5lIENQVV9GVFJTX0U1MDBfMgkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0JJR19QSFlTIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCiAjZGVmaW5lIENQVV9GVFJTX0dFTkVSSUNfMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jaWZkZWYgX19wb3dlcnBjNjRfXworCisvKiA2NC1iaXQgQ1BVcyAqLwogI2RlZmluZSBDUFVfRlRSU19QT1dFUjMJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTX1JTNjQJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKQEAgLTMzMiw3ICszMzAsMTMgQEAKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKLQkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFIHwgQ1BVX0ZUUl9SRUFMX0xFKQorCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1NQVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFKQorI2RlZmluZSBDUFVfRlRSU19QT1dFUjZYIChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKKwkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAorCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCisJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IFwKKwkgICAgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXApAQCAtMzQzLDcgKzM0Nyw2IEBACiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfUkVBTF9MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfQ09NUEFUSUJMRQkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIpCi0jZW5kaWYKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KICNkZWZpbmUgQ1BVX0ZUUlNfUE9TU0lCTEUJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kYmRtYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kYmRtYS5oCmluZGV4IDg5NzM1NjUuLmUyM2YwN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZGJkbWEuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2RiZG1hLmgKQEAgLTk1LDcgKzk1LDEzIEBACiAjZGVmaW5lIERCRE1BX0RPX1NUT1AocmVncykgZG8gewkJCQlcCiAJb3V0X2xlMzIoJigocmVncyktPmNvbnRyb2wpLCAoUlVOfEZMVVNIKTw8MTYpOwkJXAogCXdoaWxlKGluX2xlMzIoJigocmVncyktPnN0YXR1cykpICYgKEFDVElWRXxGTFVTSCkpCVwKLQkJOwkJCQkJCVwKKwkJOyBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgREJETUFfRE9fUkVTRVQocmVncykgZG8gewkJCQlcCisJb3V0X2xlMzIoJigocmVncyktPmNvbnRyb2wpLCAoQUNUSVZFfERFQUR8V0FLRXxGTFVTSHxQQVVTRXxSVU4pPDwxNik7XAorCXdoaWxlKGluX2xlMzIoJigocmVncyktPnN0YXR1cykpICYgKFJVTikpIFwKKwkJOyBcCiB9IHdoaWxlKDApCiAKICNlbmRpZiAvKiBfQVNNX0RCRE1BX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci1tbWlvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci1tbWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiZmNhOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGNyLW1taW8uaApAQCAtMCwwICsxLDUxIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICogICAgICAgICAgICAgICAgICAgIDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfQVNNX1BPV0VSUENfRENSX01NSU9fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfRENSX01NSU9fSAorI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCit0eXBlZGVmIHN0cnVjdCB7IHZvaWQgX19pb21lbSAqdG9rZW47IHVuc2lnbmVkIGludCBzdHJpZGU7IH0gZGNyX2hvc3RfdDsKKworI2RlZmluZSBEQ1JfTUFQX09LKGhvc3QpCSgoaG9zdCkudG9rZW4gIT0gTlVMTCkKKworZXh0ZXJuIGRjcl9ob3N0X3QgZGNyX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgdW5zaWduZWQgaW50IGRjcl9uLAorCQkJICB1bnNpZ25lZCBpbnQgZGNyX2MpOworZXh0ZXJuIHZvaWQgZGNyX3VubWFwKGRjcl9ob3N0X3QgaG9zdCwgdW5zaWduZWQgaW50IGRjcl9uLCB1bnNpZ25lZCBpbnQgZGNyX2MpOworCitzdGF0aWMgaW5saW5lIHUzMiBkY3JfcmVhZChkY3JfaG9zdF90IGhvc3QsIHVuc2lnbmVkIGludCBkY3JfbikKK3sKKwlyZXR1cm4gaW5fYmUzMihob3N0LnRva2VuICsgZGNyX24gKiBob3N0LnN0cmlkZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3Jfd3JpdGUoZGNyX2hvc3RfdCBob3N0LCB1bnNpZ25lZCBpbnQgZGNyX24sIHUzMiB2YWx1ZSkKK3sKKwlvdXRfYmUzMihob3N0LnRva2VuICsgZGNyX24gKiBob3N0LnN0cmlkZSwgdmFsdWUpOworfQorCitleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9kY3JfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGRjcl9uLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnN0cmlkZSk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RDUl9NTUlPX0ggKi8KKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci1uYXRpdmUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGNyLW5hdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNGE1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci1uYXRpdmUuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICogICAgICAgICAgICAgICAgICAgIDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfQVNNX1BPV0VSUENfRENSX05BVElWRV9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19EQ1JfTkFUSVZFX0gKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxhc20vcmVnLmg+CisKK3R5cGVkZWYgc3RydWN0IHt9IGRjcl9ob3N0X3Q7CisKKyNkZWZpbmUgRENSX01BUF9PSyhob3N0KQkoMSkKKworI2RlZmluZSBkY3JfbWFwKGRldiwgZGNyX24sIGRjcl9jKQl7fQorI2RlZmluZSBkY3JfdW5tYXAoaG9zdCwgZGNyX24sIGRjcl9jKQl7fQorI2RlZmluZSBkY3JfcmVhZChob3N0LCBkY3JfbikJCW1mZGNyKGRjcl9uKQorI2RlZmluZSBkY3Jfd3JpdGUoaG9zdCwgZGNyX24sIHZhbHVlKQltdGRjcihkY3JfbiwgdmFsdWUpCisKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfRENSX05BVElWRV9IICovCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGNyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczZjJjNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGNyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqICAgICAgICAgICAgICAgICAgICA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0RDUl9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19EQ1JfSAorI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQorI2luY2x1ZGUgPGFzbS9kY3ItbmF0aXZlLmg+CisjZWxzZQorI2luY2x1ZGUgPGFzbS9kY3ItbW1pby5oPgorI2VuZGlmCisKKy8qCisgKiBPbiBDT05GSUdfUFBDX01FUkdFLCB3ZSBoYXZlIGFkZGl0aW9uYWwgaGVscGVycyB0byByZWFkIHRoZSBEQ1IKKyAqIGJhc2UgZnJvbSB0aGUgZGV2aWNlLXRyZWUKKyAqLworI2lmZGVmIENPTkZJR19QUENfTUVSR0UKK2V4dGVybiB1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBpbmRleCk7CitleHRlcm4gdW5zaWduZWQgaW50IGRjcl9yZXNvdXJjZV9sZW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpbmRleCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19NRVJHRSAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19EQ1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4YWIyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGV2aWNlLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaWZuZGVmIF9BU01fUE9XRVJQQ19ERVZJQ0VfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfREVWSUNFX0gKKworc3RydWN0IGRtYV9tYXBwaW5nX29wczsKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKKworc3RydWN0IGRldl9hcmNoZGF0YSB7CisJLyogT3B0aW9uYWwgcG9pbnRlciB0byBhbiBPRiBkZXZpY2Ugbm9kZSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqb2Zfbm9kZTsKKworCS8qIERNQSBvcGVyYXRpb25zIG9uIHRoYXQgZGV2aWNlICovCisJc3RydWN0IGRtYV9tYXBwaW5nX29wcwkqZG1hX29wczsKKwl2b2lkCQkJKmRtYV9kYXRhOworCisJLyogTlVNQSBub2RlIGlmIGFwcGxpY2FibGUgKi8KKwlpbnQJCQludW1hX25vZGU7Cit9OworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS1tYXBwaW5nLmgKaW5kZXggMmFiOWJhZi4uN2UzOGI1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZG1hLW1hcHBpbmcuaApAQCAtNDQsMjYgKzQ0LDE1MCBAQAogI2VuZGlmIC8qICEgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSAqLwogCiAjaWZkZWYgQ09ORklHX1BQQzY0CisvKgorICogRE1BIG9wZXJhdGlvbnMgYXJlIGFic3RyYWN0ZWQgZm9yIEc1IHZzLiBpL3BTZXJpZXMsIFBDSSB2cy4gVklPCisgKi8KK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgeworCXZvaWQgKgkJKCphbGxvY19jb2hlcmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKTsKKwl2b2lkCQkoKmZyZWVfY29oZXJlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisJZG1hX2FkZHJfdAkoKm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLAorCQkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXZvaWQJCSgqdW5tYXBfc2luZ2xlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJaW50CQkoKm1hcF9zZykoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwl2b2lkCQkoKnVubWFwX3NnKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCWludAkJKCpkbWFfc3VwcG9ydGVkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKKwlpbnQJCSgqZGFjX2RtYV9zdXBwb3J0ZWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworCWludAkJKCpzZXRfZG1hX21hc2spKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKTsKK307CiAKLWV4dGVybiBpbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKLWV4dGVybiBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKTsKLWV4dGVybiB2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZyk7Ci1leHRlcm4gdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHVfYWRkciwKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKLWV4dGVybiBkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqY3B1X2FkZHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotZXh0ZXJuIHZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIGRtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci1leHRlcm4gaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQlpbnQgbmh3ZW50cmllcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZ2V0X2RtYV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIFdlIGRvbid0IGhhbmRsZSB0aGUgTlVMTCBkZXYgY2FzZSBmb3IgSVNBIGZvciBub3cuIFdlIGNvdWxkCisJICogZG8gaXQgdmlhIGFuIG91dCBvZiBsaW5lIGNhbGwgYnV0IGl0IGlzIG5vdCBuZWVkZWQgZm9yIG5vdy4gVGhlCisJICogb25seSBJU0EgRE1BIGRldmljZSB3ZSBzdXBwb3J0IGlzIHRoZSBmbG9wcHkgYW5kIHdlIGhhdmUgYSBoYWNrCisJICogaW4gdGhlIGZsb3BweSBkcml2ZXIgZGlyZWN0bHkgdG8gZ2V0IGEgZGV2aWNlIGZvciB1cy4KKwkgKi8KKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwgfHwgZGV2LT5hcmNoZGF0YS5kbWFfb3BzID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZGV2LT5hcmNoZGF0YS5kbWFfb3BzOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlpZiAodW5saWtlbHkoZG1hX29wcyA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisJaWYgKGRtYV9vcHMtPmRtYV9zdXBwb3J0ZWQgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGRtYV9vcHMtPmRtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKQoreworCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJaWYgKHVubGlrZWx5KGRtYV9vcHMgPT0gTlVMTCkpCisJCXJldHVybiAtRUlPOworCWlmIChkbWFfb3BzLT5zZXRfZG1hX21hc2sgIT0gTlVMTCkKKwkJcmV0dXJuIGRtYV9vcHMtPnNldF9kbWFfbWFzayhkZXYsIGRtYV9tYXNrKTsKKwlpZiAoIWRldi0+ZG1hX21hc2sgfHwgIWRtYV9zdXBwb3J0ZWQoZGV2LCAqZGV2LT5kbWFfbWFzaykpCisJCXJldHVybiAtRUlPOworCSpkZXYtPmRtYV9tYXNrID0gZG1hX21hc2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCXJldHVybiBkbWFfb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsIGZsYWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCWRtYV9vcHMtPmZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNwdV9hZGRyLAorCQkJCQlzaXplX3Qgc2l6ZSwKKwkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCFkbWFfb3BzKTsKKwlyZXR1cm4gZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkJICAgIHNpemVfdCBzaXplLAorCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJcmV0dXJuIGRtYV9vcHMtPm1hcF9zaW5nbGUoZGV2LCBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsIHNpemUsCisJCQlkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLAorCQkJCSAgc2l6ZV90IHNpemUsCisJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyZXNzLCBzaXplLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCXJldHVybiBkbWFfb3BzLT5tYXBfc2coZGV2LCBzZywgbmVudHMsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuaHdlbnRyaWVzLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJZG1hX29wcy0+dW5tYXBfc2coZGV2LCBzZywgbmh3ZW50cmllcywgZGlyZWN0aW9uKTsKK30KKworCisvKgorICogQXZhaWxhYmxlIGdlbmVyaWMgc2V0cyBvZiBvcGVyYXRpb25zCisgKi8KK2V4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9pb21tdV9vcHM7CitleHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyBkbWFfZGlyZWN0X29wczsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZG1hX2RpcmVjdF9vZmZzZXQ7CiAKICNlbHNlIC8qIENPTkZJR19QUEM2NCAqLwogCkBAIC0yNjEsMjUgKzM4NSw1IEBACiAJX19kbWFfc3luYyh2YWRkciwgc2l6ZSwgKGludClkaXJlY3Rpb24pOwogfQogCi0vKgotICogRE1BIG9wZXJhdGlvbnMgYXJlIGFic3RyYWN0ZWQgZm9yIEc1IHZzLiBpL3BTZXJpZXMsIFBDSSB2cy4gVklPCi0gKi8KLXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgewotCXZvaWQgKgkJKCphbGxvY19jb2hlcmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKTsKLQl2b2lkCQkoKmZyZWVfY29oZXJlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7Ci0JZG1hX2FkZHJfdAkoKm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLAotCQkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotCXZvaWQJCSgqdW5tYXBfc2luZ2xlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0JaW50CQkoKm1hcF9zZykoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLQl2b2lkCQkoKnVubWFwX3NnKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotCWludAkJKCpkbWFfc3VwcG9ydGVkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKLQlpbnQJCSgqZGFjX2RtYV9zdXBwb3J0ZWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOwotfTsKLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfQVNNX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaC5oCmluZGV4IDZhNzg0MzkuLmI4ODZiZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWguaApAQCAtMTIwLDEwICsxMjAsNiBAQAogCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF93cml0ZWIodTggdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jb3V0XzgoYWRkciwgdmFsKTsKLX0KIAogc3RhdGljIGlubGluZSB1MTYgZWVoX3JlYWR3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKQEAgLTEzMiwyMSArMTI4LDYgQEAKIAkJcmV0dXJuIGVlaF9jaGVja19mYWlsdXJlKGFkZHIsIHZhbCk7CiAJcmV0dXJuIHZhbDsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfd3JpdGV3KHUxNiB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlvdXRfbGUxNihhZGRyLCB2YWwpOwotfQotc3RhdGljIGlubGluZSB1MTYgZWVoX3Jhd19yZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JdTE2IHZhbCA9IGluX2JlMTYoYWRkcik7Ci0JaWYgKEVFSF9QT1NTSUJMRV9FUlJPUih2YWwsIHUxNikpCi0JCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZShhZGRyLCB2YWwpOwotCXJldHVybiB2YWw7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX3Jhd193cml0ZXcodTE2IHZhbCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKSB7Ci0Jdm9sYXRpbGUgdTE2IF9faW9tZW0gKnZhZGRyID0gKHZvbGF0aWxlIHUxNiBfX2lvbWVtICopIGFkZHI7Ci0Jb3V0X2JlMTYodmFkZHIsIHZhbCk7Ci19CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGVlaF9yZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CkBAIC0xNTUsMjEgKzEzNiw2IEBACiAJCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZShhZGRyLCB2YWwpOwogCXJldHVybiB2YWw7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX3dyaXRlbCh1MzIgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jb3V0X2xlMzIoYWRkciwgdmFsKTsKLX0KLXN0YXRpYyBpbmxpbmUgdTMyIGVlaF9yYXdfcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQotewotCXUzMiB2YWwgPSBpbl9iZTMyKGFkZHIpOwotCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MzIpKQotCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF9yYXdfd3JpdGVsKHUzMiB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlvdXRfYmUzMihhZGRyLCB2YWwpOwotfQogCiBzdGF0aWMgaW5saW5lIHU2NCBlZWhfcmVhZHEoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewpAQCAtMTc4LDE4MiArMTQ0LDY3IEBACiAJCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZShhZGRyLCB2YWwpOwogCXJldHVybiB2YWw7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX3dyaXRlcSh1NjQgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCisKK3N0YXRpYyBpbmxpbmUgdTE2IGVlaF9yZWFkd19iZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0Jb3V0X2xlNjQoYWRkciwgdmFsKTsKKwl1MTYgdmFsID0gaW5fYmUxNihhZGRyKTsKKwlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKHZhbCwgdTE2KSkKKwkJcmV0dXJuIGVlaF9jaGVja19mYWlsdXJlKGFkZHIsIHZhbCk7CisJcmV0dXJuIHZhbDsKIH0KLXN0YXRpYyBpbmxpbmUgdTY0IGVlaF9yYXdfcmVhZHEoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorCitzdGF0aWMgaW5saW5lIHUzMiBlZWhfcmVhZGxfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXUzMiB2YWwgPSBpbl9iZTMyKGFkZHIpOworCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MzIpKQorCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBlZWhfcmVhZHFfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXU2NCB2YWwgPSBpbl9iZTY0KGFkZHIpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1NjQpKQogCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF9yYXdfd3JpdGVxKHU2NCB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlvdXRfYmU2NChhZGRyLCB2YWwpOwotfQogCi0jZGVmaW5lIEVFSF9DSEVDS19BTElHTih2LGEpIFwKLQkoKCgodW5zaWduZWQgbG9uZykodikpICYgKChhKSAtIDEpKSA9PSAwKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX21lbXNldF9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBjLAotCQkJCSB1bnNpZ25lZCBsb25nIG4pCi17Ci0Jdm9pZCAqcCA9ICh2b2lkIF9fZm9yY2UgKilhZGRyOwotCXUzMiBsYyA9IGM7Ci0JbGMgfD0gbGMgPDwgODsKLQlsYyB8PSBsYyA8PCAxNjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwotCXdoaWxlKG4gJiYgIUVFSF9DSEVDS19BTElHTihwLCA0KSkgewotCQkqKCh2b2xhdGlsZSB1OCAqKXApID0gYzsKLQkJcCsrOwotCQluLS07Ci0JfQotCXdoaWxlKG4gPj0gNCkgewotCQkqKCh2b2xhdGlsZSB1MzIgKilwKSA9IGxjOwotCQlwICs9IDQ7Ci0JCW4gLT0gNDsKLQl9Ci0Jd2hpbGUobikgewotCQkqKCh2b2xhdGlsZSB1OCAqKXApID0gYzsKLQkJcCsrOwotCQluLS07Ci0JfQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF9tZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLAorc3RhdGljIGlubGluZSB2b2lkIGVlaF9tZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0CisJCQkJICAgICB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbikKIHsKLQl2b2lkICp2c3JjID0gKHZvaWQgX19mb3JjZSAqKSBzcmM7Ci0Jdm9pZCAqZGVzdHNhdmUgPSBkZXN0OwotCXVuc2lnbmVkIGxvbmcgbnNhdmUgPSBuOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7Ci0Jd2hpbGUobiAmJiAoIUVFSF9DSEVDS19BTElHTih2c3JjLCA0KSB8fCAhRUVIX0NIRUNLX0FMSUdOKGRlc3QsIDQpKSkgewotCQkqKCh1OCAqKWRlc3QpID0gKigodm9sYXRpbGUgdTggKil2c3JjKTsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOwotCQl2c3JjKys7Ci0JCWRlc3QrKzsKLQkJbi0tOwotCX0KLQl3aGlsZShuID4gNCkgewotCQkqKCh1MzIgKilkZXN0KSA9ICooKHZvbGF0aWxlIHUzMiAqKXZzcmMpOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7Ci0JCXZzcmMgKz0gNDsKLQkJZGVzdCArPSA0OwotCQluIC09IDQ7Ci0JfQotCXdoaWxlKG4pIHsKLQkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKLQkJdnNyYysrOwotCQlkZXN0Kys7Ci0JCW4tLTsKLQl9Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJX21lbWNweV9mcm9taW8oZGVzdCwgc3JjLCBuKTsKIAogCS8qIExvb2sgZm9yIGZmZmYncyBoZXJlIGF0IGRlc3Rbbl0uICBBc3N1bWUgdGhhdCBhdCBsZWFzdCA0IGJ5dGVzCiAJICogd2VyZSBjb3BpZWQuIENoZWNrIGFsbCBmb3VyIGJ5dGVzLgogCSAqLwotCWlmICgobnNhdmUgPj0gNCkgJiYKLQkJKEVFSF9QT1NTSUJMRV9FUlJPUigoKigodTMyICopIGRlc3RzYXZlK25zYXZlLTQpKSwgdTMyKSkpIHsKLQkJZWVoX2NoZWNrX2ZhaWx1cmUoc3JjLCAoKigodTMyICopIGRlc3RzYXZlK25zYXZlLTQpKSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX21lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbikKLXsKLQl2b2lkICp2ZGVzdCA9ICh2b2lkIF9fZm9yY2UgKikgZGVzdDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwotCXdoaWxlKG4gJiYgKCFFRUhfQ0hFQ0tfQUxJR04odmRlc3QsIDQpIHx8ICFFRUhfQ0hFQ0tfQUxJR04oc3JjLCA0KSkpIHsKLQkJKigodm9sYXRpbGUgdTggKil2ZGVzdCkgPSAqKCh1OCAqKXNyYyk7Ci0JCXNyYysrOwotCQl2ZGVzdCsrOwotCQluLS07Ci0JfQotCXdoaWxlKG4gPiA0KSB7Ci0JCSooKHZvbGF0aWxlIHUzMiAqKXZkZXN0KSA9ICooKHZvbGF0aWxlIHUzMiAqKXNyYyk7Ci0JCXNyYyArPSA0OwotCQl2ZGVzdCArPSA0OwotCQluLT00OwotCX0KLQl3aGlsZShuKSB7Ci0JCSooKHZvbGF0aWxlIHU4ICopdmRlc3QpID0gKigodTggKilzcmMpOwotCQlzcmMrKzsKLQkJdmRlc3QrKzsKLQkJbi0tOwotCX0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKLX0KLQotI3VuZGVmIEVFSF9DSEVDS19BTElHTgotCi1zdGF0aWMgaW5saW5lIHU4IGVlaF9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQotewotCXU4IHZhbDsKLQl2YWwgPSBpbl84KCh1OCBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpKTsKLQlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKHZhbCwgdTgpKQotCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoKHZvaWQgX19pb21lbSAqKShwb3J0KSwgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX291dGIodTggdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0Jb3V0XzgoKHU4IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGVlaF9pbncodW5zaWduZWQgbG9uZyBwb3J0KQotewotCXUxNiB2YWw7Ci0JdmFsID0gaW5fbGUxNigodTE2IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSkpOwotCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MTYpKQotCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoKHZvaWQgX19pb21lbSAqKShwb3J0KSwgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX291dHcodTE2IHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCW91dF9sZTE2KCh1MTYgX19pb21lbSAqKShwb3J0K3BjaV9pb19iYXNlKSwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgZWVoX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JdTMyIHZhbDsKLQl2YWwgPSBpbl9sZTMyKCh1MzIgX19pb21lbSAqKShwb3J0K3BjaV9pb19iYXNlKSk7Ci0JaWYgKEVFSF9QT1NTSUJMRV9FUlJPUih2YWwsIHUzMikpCi0JCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCB2YWwpOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfb3V0bCh1MzIgdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0Jb3V0X2xlMzIoKHUzMiBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCB2YWwpOworCWlmIChuID49IDQgJiYgRUVIX1BPU1NJQkxFX0VSUk9SKCooKHUzMiAqKShkZXN0ICsgbiAtIDQpKSwgdTMyKSkKKwkJZWVoX2NoZWNrX2ZhaWx1cmUoc3JjLCAqKCh1MzIgKikoZGVzdCArIG4gLSA0KSkpOwogfQogCiAvKiBpbi1zdHJpbmcgZWVoIG1hY3JvcyAqLwotc3RhdGljIGlubGluZSB2b2lkIGVlaF9pbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqIGJ1ZiwgaW50IG5zKQorc3RhdGljIGlubGluZSB2b2lkIGVlaF9yZWFkc2IoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICogYnVmLAorCQkJICAgICAgaW50IG5zKQogewotCV9pbnNiKCh1OCBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCBidWYsIG5zKTsKKwlfaW5zYihhZGRyLCBidWYsIG5zKTsKIAlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKCgqKCgodTgqKWJ1ZikrbnMtMSkpLCB1OCkpCi0JCWVlaF9jaGVja19mYWlsdXJlKCh2b2lkIF9faW9tZW0gKikocG9ydCksICoodTgqKWJ1Zik7CisJCWVlaF9jaGVja19mYWlsdXJlKGFkZHIsICoodTgqKWJ1Zik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfaW5zd19ucyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKiBidWYsIGludCBucykKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZWhfcmVhZHN3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqIGJ1ZiwKKwkJCSAgICAgIGludCBucykKIHsKLQlfaW5zd19ucygodTE2IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIGJ1ZiwgbnMpOworCV9pbnN3KGFkZHIsIGJ1ZiwgbnMpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IoKCooKCh1MTYqKWJ1ZikrbnMtMSkpLCB1MTYpKQotCQllZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCAqKHUxNiopYnVmKTsKKwkJZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgKih1MTYqKWJ1Zik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfaW5zbF9ucyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKiBidWYsIGludCBubCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZWhfcmVhZHNsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqIGJ1ZiwKKwkJCSAgICAgIGludCBubCkKIHsKLQlfaW5zbF9ucygodTMyIF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIGJ1ZiwgbmwpOworCV9pbnNsKGFkZHIsIGJ1ZiwgbmwpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IoKCooKCh1MzIqKWJ1ZikrbmwtMSkpLCB1MzIpKQotCQllZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCAqKHUzMiopYnVmKTsKKwkJZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgKih1MzIqKWJ1Zik7CiB9CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaAppbmRleCA5YTgzYTk4Li5iNTQzNjY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKQEAgLTQxMSw0ICs0MTEsMTcgQEAKIC8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCiAjZGVmaW5lIFJfUFBDNjRfTlVNCQkxMDcKIAorI2lmZGVmIENPTkZJR19TUFVfQkFTRQorLyogTm90ZXMgdXNlZCBpbiBFVF9DT1JFLiBOb3RlIG5hbWUgaXMgIlNQVS88ZmQ+LzxmaWxlbmFtZT4iLiAqLworI2RlZmluZSBOVF9TUFUJCTEKKworZXh0ZXJuIGludCBhcmNoX25vdGVzX3NpemUodm9pZCk7CitleHRlcm4gdm9pZCBhcmNoX3dyaXRlX25vdGVzKHN0cnVjdCBmaWxlICpmaWxlKTsKKworI2RlZmluZSBFTEZfQ09SRV9FWFRSQV9OT1RFU19TSVpFIGFyY2hfbm90ZXNfc2l6ZSgpCisjZGVmaW5lIEVMRl9DT1JFX1dSSVRFX0VYVFJBX05PVEVTIGFyY2hfd3JpdGVfbm90ZXMoZmlsZSkKKworI2RlZmluZSBBUkNIX0hBVkVfRVhUUkFfRUxGX05PVEVTCisjZW5kaWYgLyogQ09ORklHX1BQQ19DRUxMICovCisKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaAppbmRleCBmZGY5YWZmLi45OGY3YjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zpcm13YXJlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9maXJtd2FyZS5oCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIEZXX0ZFQVRVUkVfU1BMUEFSCUFTTV9DT05TVCgweDAwMDAwMDAwMDAxMDAwMDApCiAjZGVmaW5lIEZXX0ZFQVRVUkVfSVNFUklFUwlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMjAwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX0xQQVIJCUFTTV9DT05TVCgweDAwMDAwMDAwMDA0MDAwMDApCisjZGVmaW5lIEZXX0ZFQVRVUkVfUFMzX0xWMQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwODAwMDAwKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC01OCw2ICs1OSwxMCBAQAogCUZXX0ZFQVRVUkVfUFNFUklFU19BTFdBWVMgPSAwLAogCUZXX0ZFQVRVUkVfSVNFUklFU19QT1NTSUJMRSA9IEZXX0ZFQVRVUkVfSVNFUklFUyB8IEZXX0ZFQVRVUkVfTFBBUiwKIAlGV19GRUFUVVJFX0lTRVJJRVNfQUxXQVlTID0gRldfRkVBVFVSRV9JU0VSSUVTIHwgRldfRkVBVFVSRV9MUEFSLAorCUZXX0ZFQVRVUkVfUFMzX1BPU1NJQkxFID0gRldfRkVBVFVSRV9MUEFSIHwgRldfRkVBVFVSRV9QUzNfTFYxLAorCUZXX0ZFQVRVUkVfUFMzX0FMV0FZUyA9IEZXX0ZFQVRVUkVfTFBBUiB8IEZXX0ZFQVRVUkVfUFMzX0xWMSwKKwlGV19GRUFUVVJFX05BVElWRV9QT1NTSUJMRSA9IDAsCisJRldfRkVBVFVSRV9OQVRJVkVfQUxXQVlTID0gMCwKIAlGV19GRUFUVVJFX1BPU1NJQkxFID0KICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKIAkJRldfRkVBVFVSRV9QU0VSSUVTX1BPU1NJQkxFIHwKQEAgLTY1LDYgKzcwLDEyIEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAJCUZXX0ZFQVRVUkVfSVNFUklFU19QT1NTSUJMRSB8CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDX1BTMworCQlGV19GRUFUVVJFX1BTM19QT1NTSUJMRSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDX05BVElWRQorCQlGV19GRUFUVVJFX05BVElWRV9BTFdBWVMgfAorI2VuZGlmCiAJCTAsCiAJRldfRkVBVFVSRV9BTFdBWVMgPQogI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwpAQCAtNzMsNiArODQsMTIgQEAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIAkJRldfRkVBVFVSRV9JU0VSSUVTX0FMV0FZUyAmCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDX1BTMworCQlGV19GRUFUVVJFX1BTM19BTFdBWVMgJgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19OQVRJVkUKKwkJRldfRkVBVFVSRV9OQVRJVkVfQUxXQVlTICYKKyNlbmRpZgogCQlGV19GRUFUVVJFX1BPU1NJQkxFLAogCiAjZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h3X2lycS5oCmluZGV4IGQ0MDM1OTIuLmQ2MDQ4NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHdfaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9od19pcnEuaApAQCAtNywxNiArNyw0MCBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiBleHRlcm4gdm9pZCB0aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CiAKLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKKyNpZmRlZiBDT05GSUdfUFBDNjQKKyNpbmNsdWRlIDxhc20vcGFjYS5oPgogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsb2NhbF9nZXRfZmxhZ3Modm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBsb2NhbF9pcnFfZGlzYWJsZSh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb2NhbF9nZXRfZmxhZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxieiAlMCwlMSgxMykiCisJOiAiPXIiIChmbGFncykKKwk6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzb2Z0X2VuYWJsZWQpKSk7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHplcm87CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGkgJTEsMDsgbGJ6ICUwLCUyKDEzKTsgc3RiICUxLCUyKDEzKSIKKwk6ICI9ciIgKGZsYWdzKSwgIj0mciIgKHplcm8pCisJOiAiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc29mdF9lbmFibGVkKSkKKwk6ICJtZW1vcnkiKTsKKworCXJldHVybiBmbGFnczsKK30KKwogZXh0ZXJuIHZvaWQgbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBpc2VyaWVzX2hhbmRsZV9pbnRlcnJ1cHRzKHZvaWQpOwogCiAjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKQlsb2NhbF9pcnFfcmVzdG9yZSgxKQogI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKQkoKGZsYWdzKSA9IGxvY2FsX2dldF9mbGFncygpKQpAQCAtMjQsMTcgKzQ4LDE0IEBACiAKICNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkobG9jYWxfZ2V0X2ZsYWdzKCkgPT0gMCkKIAorI2RlZmluZSBoYXJkX2lycV9lbmFibGUoKQlfX210bXNyZChtZm1zcigpIHwgTVNSX0VFLCAxKQorI2RlZmluZSBoYXJkX2lycV9kaXNhYmxlKCkJX19tdG1zcmQobWZtc3IoKSAmIH5NU1JfRUUsIDEpCisKICNlbHNlCiAKICNpZiBkZWZpbmVkKENPTkZJR19CT09LRSkKICNkZWZpbmUgU0VUX01TUl9FRSh4KQltdG1zcih4KQogI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZShmbGFncykJX19hc21fXyBfX3ZvbGF0aWxlX18oIndydGVlICUwIiA6IDogInIiIChmbGFncykgOiAibWVtb3J5IikKLSNlbGlmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKLSNkZWZpbmUgU0VUX01TUl9FRSh4KQlfX210bXNyZCh4LCAxKQotI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZShmbGFncykgZG8geyBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKTsgXAotCV9fbXRtc3JkKChmbGFncyksIDEpOyBcCi19IHdoaWxlKDApCiAjZWxzZQogI2RlZmluZSBTRVRfTVNSX0VFKHgpCW10bXNyKHgpCiAjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKQltdG1zcihmbGFncykKQEAgLTgxLDcgKzEwMiwxMCBAQAogI2RlZmluZSBsb2NhbF9pcnFfc2F2ZShmbGFncykJbG9jYWxfaXJxX3NhdmVfcHRyKCZmbGFncykKICNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkoKG1mbXNyKCkgJiBNU1JfRUUpID09IDApCiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KKyNkZWZpbmUgaGFyZF9pcnFfZW5hYmxlKCkJbG9jYWxfaXJxX2VuYWJsZSgpCisjZGVmaW5lIGhhcmRfaXJxX2Rpc2FibGUoKQlsb2NhbF9pcnFfZGlzYWJsZSgpCisKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogI2RlZmluZSBtYXNrX2lycShpcnEpCQkJCQkJXAogCSh7CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaWJtZWJ1cy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pYm1lYnVzLmgKaW5kZXggMzQ5MzQyOWIuLjY2MTEyMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaWJtZWJ1cy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaWJtZWJ1cy5oCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogCi1leHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyBpYm1lYnVzX2RtYV9vcHM7CiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGlibWVidXNfYnVzX3R5cGU7CiAKIHN0cnVjdCBpYm1lYnVzX2RldiB7CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pZGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaWRlLmgKaW5kZXggYzgzOTBmOS4uMGY2NmYwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lkZS5oCkBAIC0yMiwxMCArMjIsMTAgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNkZWZpbmUgX19pZGVfbW1faW5zdyhwLCBhLCBjKQlfaW5zd19ucygodm9sYXRpbGUgdTE2IF9faW9tZW0gKikocCksIChhKSwgKGMpKQotI2RlZmluZSBfX2lkZV9tbV9pbnNsKHAsIGEsIGMpCV9pbnNsX25zKCh2b2xhdGlsZSB1MzIgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCi0jZGVmaW5lIF9faWRlX21tX291dHN3KHAsIGEsIGMpCV9vdXRzd19ucygodm9sYXRpbGUgdTE2IF9faW9tZW0gKikocCksIChhKSwgKGMpKQotI2RlZmluZSBfX2lkZV9tbV9vdXRzbChwLCBhLCBjKQlfb3V0c2xfbnMoKHZvbGF0aWxlIHUzMiBfX2lvbWVtICopKHApLCAoYSksIChjKSkKKyNkZWZpbmUgX19pZGVfbW1faW5zdyhwLCBhLCBjKQlyZWFkc3coKHZvaWQgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCisjZGVmaW5lIF9faWRlX21tX2luc2wocCwgYSwgYykJcmVhZHNsKCh2b2lkIF9faW9tZW0gKikocCksIChhKSwgKGMpKQorI2RlZmluZSBfX2lkZV9tbV9vdXRzdyhwLCBhLCBjKQl3cml0ZXN3KCh2b2lkIF9faW9tZW0gKikocCksIChhKSwgKGMpKQorI2RlZmluZSBfX2lkZV9tbV9vdXRzbChwLCBhLCBjKQl3cml0ZXNsKCh2b2lkIF9faW9tZW0gKikocCksIChhKSwgKGMpKQogCiAjaWZuZGVmICBfX3Bvd2VycGM2NF9fCiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfcWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfcWUuaAppbmRleCBjZTEyZjg1Li45ZmRkMDQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ltbWFwX3FlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pbW1hcF9xZS5oCkBAIC0xMzYsMjIgKzEzNiw3IEBACiAKIC8qIEJSRyAqLwogc3RydWN0IHFlX2JyZyB7Ci0JX19iZTMyCWJyZ2MxOwkJLyogQlJHMSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MyOwkJLyogQlJHMiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MzOwkJLyogQlJHMyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M0OwkJLyogQlJHNCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M1OwkJLyogQlJHNSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M2OwkJLyogQlJHNiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M3OwkJLyogQlJHNyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M4OwkJLyogQlJHOCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M5OwkJLyogQlJHOSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MxMDsJCS8qIEJSRzEwIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQlfX2JlMzIJYnJnYzExOwkJLyogQlJHMTEgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCV9fYmUzMglicmdjMTI7CQkvKiBCUkcxMiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MxMzsJCS8qIEJSRzEzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQlfX2JlMzIJYnJnYzE0OwkJLyogQlJHMTQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCV9fYmUzMglicmdjMTU7CQkvKiBCUkcxNSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MxNjsJCS8qIEJSRzE2IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlfX2JlMzIJYnJnY1sxNl07CS8qIEJSRyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwogCXU4CXJlczBbMHg0MF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby1kZWZzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzY5MWFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby1kZWZzLmgKQEAgLTAsMCArMSw1OSBAQAorLyogVGhpcyBmaWxlIGlzIG1lYW50IHRvIGJlIGluY2x1ZGUgbXVsdGlwbGUgdGltZXMgYnkgb3RoZXIgaGVhZGVycyAqLworCitERUZfUENJX0FDX1JFVChyZWFkYiwgdTgsIChjb25zdCBQQ0lfSU9fQUREUiBhZGRyKSwgKGFkZHIpKQorREVGX1BDSV9BQ19SRVQocmVhZHcsIHUxNiwgKGNvbnN0IFBDSV9JT19BRERSIGFkZHIpLCAoYWRkcikpCitERUZfUENJX0FDX1JFVChyZWFkbCwgdTMyLCAoY29uc3QgUENJX0lPX0FERFIgYWRkciksIChhZGRyKSkKK0RFRl9QQ0lfQUNfUkVUKHJlYWR3X2JlLCB1MTYsIChjb25zdCBQQ0lfSU9fQUREUiBhZGRyKSwgKGFkZHIpKQorREVGX1BDSV9BQ19SRVQocmVhZGxfYmUsIHUzMiwgKGNvbnN0IFBDSV9JT19BRERSIGFkZHIpLCAoYWRkcikpCitERUZfUENJX0FDX05PUkVUKHdyaXRlYiwgKHU4IHZhbCwgUENJX0lPX0FERFIgYWRkciksICh2YWwsIGFkZHIpKQorREVGX1BDSV9BQ19OT1JFVCh3cml0ZXcsICh1MTYgdmFsLCBQQ0lfSU9fQUREUiBhZGRyKSwgKHZhbCwgYWRkcikpCitERUZfUENJX0FDX05PUkVUKHdyaXRlbCwgKHUzMiB2YWwsIFBDSV9JT19BRERSIGFkZHIpLCAodmFsLCBhZGRyKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGV3X2JlLCAodTE2IHZhbCwgUENJX0lPX0FERFIgYWRkciksICh2YWwsIGFkZHIpKQorREVGX1BDSV9BQ19OT1JFVCh3cml0ZWxfYmUsICh1MzIgdmFsLCBQQ0lfSU9fQUREUiBhZGRyKSwgKHZhbCwgYWRkcikpCisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCitERUZfUENJX0FDX1JFVChyZWFkcSwgdTY0LCAoY29uc3QgUENJX0lPX0FERFIgYWRkciksIChhZGRyKSkKK0RFRl9QQ0lfQUNfUkVUKHJlYWRxX2JlLCB1NjQsIChjb25zdCBQQ0lfSU9fQUREUiBhZGRyKSwgKGFkZHIpKQorREVGX1BDSV9BQ19OT1JFVCh3cml0ZXEsICh1NjQgdmFsLCBQQ0lfSU9fQUREUiBhZGRyKSwgKHZhbCwgYWRkcikpCitERUZfUENJX0FDX05PUkVUKHdyaXRlcV9iZSwgKHU2NCB2YWwsIFBDSV9JT19BRERSIGFkZHIpLCAodmFsLCBhZGRyKSkKKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKK0RFRl9QQ0lfQUNfUkVUKGluYiwgdTgsICh1bnNpZ25lZCBsb25nIHBvcnQpLCAocG9ydCkpCitERUZfUENJX0FDX1JFVChpbncsIHUxNiwgKHVuc2lnbmVkIGxvbmcgcG9ydCksIChwb3J0KSkKK0RFRl9QQ0lfQUNfUkVUKGlubCwgdTMyLCAodW5zaWduZWQgbG9uZyBwb3J0KSwgKHBvcnQpKQorREVGX1BDSV9BQ19OT1JFVChvdXRiLCAodTggdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpLCAodmFsLCBwb3J0KSkKK0RFRl9QQ0lfQUNfTk9SRVQob3V0dywgKHUxNiB2YWwsIHVuc2lnbmVkIGxvbmcgcG9ydCksICh2YWwsIHBvcnQpKQorREVGX1BDSV9BQ19OT1JFVChvdXRsLCAodTMyIHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KSwgKHZhbCwgcG9ydCkpCisKK0RFRl9QQ0lfQUNfTk9SRVQocmVhZHNiLCAoY29uc3QgUENJX0lPX0FERFIgYSwgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKGEsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChyZWFkc3csIChjb25zdCBQQ0lfSU9fQUREUiBhLCB2b2lkICpiLCB1bnNpZ25lZCBsb25nIGMpLCBcCisJCSAoYSwgYiwgYykpCitERUZfUENJX0FDX05PUkVUKHJlYWRzbCwgKGNvbnN0IFBDSV9JT19BRERSIGEsIHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGVzYiwgKFBDSV9JT19BRERSIGEsIGNvbnN0IHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGVzdywgKFBDSV9JT19BRERSIGEsIGNvbnN0IHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGVzbCwgKFBDSV9JT19BRERSIGEsIGNvbnN0IHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKKworREVGX1BDSV9BQ19OT1JFVChpbnNiLCAodW5zaWduZWQgbG9uZyBwLCB2b2lkICpiLCB1bnNpZ25lZCBsb25nIGMpLCBcCisJCSAocCwgYiwgYykpCitERUZfUENJX0FDX05PUkVUKGluc3csICh1bnNpZ25lZCBsb25nIHAsIHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChwLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQoaW5zbCwgKHVuc2lnbmVkIGxvbmcgcCwgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChvdXRzYiwgKHVuc2lnbmVkIGxvbmcgcCwgY29uc3Qgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChvdXRzdywgKHVuc2lnbmVkIGxvbmcgcCwgY29uc3Qgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChvdXRzbCwgKHVuc2lnbmVkIGxvbmcgcCwgY29uc3Qgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorCitERUZfUENJX0FDX05PUkVUKG1lbXNldF9pbywgKFBDSV9JT19BRERSIGEsIGludCBjLCB1bnNpZ25lZCBsb25nIG4pLAkgICBcCisJCSAoYSwgYywgbikpCitERUZfUENJX0FDX05PUkVUKG1lbWNweV9mcm9taW8sKHZvaWQgKmQsY29uc3QgUENJX0lPX0FERFIgcyx1bnNpZ25lZCBsb25nIG4pLCBcCisJCSAoZCwgcywgbikpCitERUZfUENJX0FDX05PUkVUKG1lbWNweV90b2lvLChQQ0lfSU9fQUREUiBkLGNvbnN0IHZvaWQgKnMsdW5zaWduZWQgbG9uZyBuKSwgICBcCisJCSAoZCwgcywgbikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKaW5kZXggYzJjNWYxNC4uMWNkNTMyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaApAQCAtMTMsMTU0ICsxMyw1MzAgQEAKIGV4dGVybiBpbnQgY2hlY2tfbGVnYWN5X2lvcG9ydCh1bnNpZ25lZCBsb25nIGJhc2VfcG9ydCk7CiAjZGVmaW5lIFBOUEJJT1NfQkFTRQkweGYwMDAJLyogb25seSByZWxldmFudCBmb3IgUFJlUCAqLwogCi0jaWZuZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGFzbS1wcGMvaW8uaD4KLSNlbHNlCi0KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAjaW5jbHVkZSA8YXNtL3N5bmNoLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9tYXAuaD4KIAorI2lmZGVmIENPTkZJR19QUEM2NAorI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjZW5kaWYKKwogI2RlZmluZSBTSU9fQ09ORklHX1JBCTB4Mzk4CiAjZGVmaW5lIFNJT19DT05GSUdfUkQJMHgzOTkKIAogI2RlZmluZSBTTE9XX0RPV05fSU8KIAorLyogMzIgYml0cyB1c2VzIHNsaWdodGx5IGRpZmZlcmVudCB2YXJpYWJsZXMgZm9yIHRoZSB2YXJpb3VzIElPCisgKiBiYXNlcy4gTW9zdCBvZiB0aGlzIGZpbGUgb25seSB1c2VzIF9JT19CQVNFIHRob3VnaCB3aGljaCB3ZQorICogZGVmaW5lIHByb3Blcmx5IGJhc2VkIG9uIHRoZSBwbGF0Zm9ybQorICovCisjaWZuZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgX0lPX0JBU0UJMAorI2RlZmluZSBfSVNBX01FTV9CQVNFCTAKKyNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUIDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQzMyKQorI2RlZmluZSBfSU9fQkFTRQlpc2FfaW9fYmFzZQorI2RlZmluZSBfSVNBX01FTV9CQVNFCWlzYV9tZW1fYmFzZQorI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQJcGNpX2RyYW1fb2Zmc2V0CisjZWxzZQorI2RlZmluZSBfSU9fQkFTRQlwY2lfaW9fYmFzZQorI2RlZmluZSBfSVNBX01FTV9CQVNFCTAKKyNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUCTAKKyNlbmRpZgorCiBleHRlcm4gdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9pb19iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2RyYW1fb2Zmc2V0OwogCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmIGRlZmluZWQoQ09ORklHX1BQQ19JTkRJUkVDVF9JTykKKyNlcnJvciBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIDMyIGJpdHMKKyNlbmRpZgogCi1leHRlcm4gaW50IGluXzgoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB2b2lkIG91dF84KHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkciwgaW50IHZhbCk7Ci1leHRlcm4gaW50IGluX2xlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gaW50IGluX2JlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBvdXRfbGUxNih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICphZGRyLCBpbnQgdmFsKTsKLWV4dGVybiB2b2lkIG91dF9iZTE2KHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIsIGludCB2YWwpOwotZXh0ZXJuIHVuc2lnbmVkIGluX2xlMzIoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgaW5fYmUzMihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB2b2lkIG91dF9sZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIGludCB2YWwpOwotZXh0ZXJuIHZvaWQgb3V0X2JlMzIodm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkciwgaW50IHZhbCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpbl9sZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpbl9iZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBvdXRfbGU2NCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFsKTsKLWV4dGVybiB2b2lkIG91dF9iZTY0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpOworLyoKKyAqCisgKiBMb3cgbGV2ZWwgTU1JTyBhY2Nlc3NvcnMKKyAqCisgKiBUaGlzIHByb3ZpZGVzIHRoZSBub24tYnVzIHNwZWNpZmljIGFjY2Vzc29ycyB0byBNTUlPLiBUaG9zZSBhcmUgUG93ZXJQQworICogc3BlY2lmaWMgYW5kIHRodXMgc2hvdWxkbid0IGJlIHVzZWQgaW4gZ2VuZXJpYyBjb2RlLiBUaGUgYWNjZXNzb3JzCisgKiBwcm92aWRlZCBoZXJlIGFyZToKKyAqCisgKglpbl84LCBpbl9sZTE2LCBpbl9iZTE2LCBpbl9sZTMyLCBpbl9iZTMyLCBpbl9sZTY0LCBpbl9iZTY0CisgKglvdXRfOCwgb3V0X2xlMTYsIG91dF9iZTE2LCBvdXRfbGUzMiwgb3V0X2JlMzIsIG91dF9sZTY0LCBvdXRfYmU2NAorICoJX2luc2IsIF9pbnN3X25zLCBfaW5zbF9ucywgX291dHNiLCBfb3V0c3dfbnMsIF9vdXRzbF9ucworICoKKyAqIFRob3NlIG9wZXJhdGUgZGlyZWN0bHkgb24gYSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzLiBOb3RlIHRoYXQgdGhlIHByb3RvdHlwZQorICogZm9yIHRoZSBvdXRfKiBhY2Nlc3NvcnMgaGFzIHRoZSBhcmd1bWVudHMgaW4gb3Bwb3NpdGUgb3JkZXIgZnJvbSB0aGUgdXN1YWwKKyAqIGxpbnV4IFBDSSBhY2Nlc3NvcnMuIFVubGlrZSB0aG9zZSwgdGhleSB0YWtlIHRoZSBhZGRyZXNzIGZpcnN0IGFuZCB0aGUgdmFsdWUKKyAqIG5leHQuCisgKgorICogTm90ZTogSSBtaWdodCBkcm9wIHRoZSBfbnMgc3VmZml4IG9uIHRoZSBzdHJlYW0gb3BlcmF0aW9ucyBzb29uIGFzIGl0IGlzCisgKiBzaW1wbHkgbm9ybWFsIGZvciBzdHJlYW0gb3BlcmF0aW9ucyB0byBub3Qgc3dhcCBpbiB0aGUgZmlyc3QgcGxhY2UuCisgKgorICovCiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIF9fcmF3X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgX19yYXdfcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZWIodW5zaWduZWQgY2hhciB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwotZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZWwodW5zaWduZWQgaW50IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZXEodW5zaWduZWQgbG9uZyB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOworI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBJT19TRVRfU1lOQ19GTEFHKCkJZG8geyBnZXRfcGFjYSgpLT5pb19zeW5jID0gMTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgSU9fU0VUX1NZTkNfRkxBRygpCisjZW5kaWYKIAotZXh0ZXJuIHZvaWQgbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsIHVuc2lnbmVkIGxvbmcgbik7Ci1leHRlcm4gdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKTsKLWV4dGVybiB2b2lkIG1lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKTsKKyNkZWZpbmUgREVGX01NSU9fSU4obmFtZSwgdHlwZSwgaW5zbikJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdHlwZSBuYW1lKGNvbnN0IHZvbGF0aWxlIHR5cGUgX19pb21lbSAqYWRkcikJCVwKK3sJCQkJCQkJCQlcCisJdHlwZSByZXQ7CQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsiIGluc24gIjt0d2kgMCwlMCwwO2lzeW5jIgkJXAorIAkJOiAiPXIiIChyZXQpIDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOwkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30KIAotI2Vsc2UgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCisjZGVmaW5lIERFRl9NTUlPX09VVChuYW1lLCB0eXBlLCBpbnNuKQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIG5hbWUodm9sYXRpbGUgdHlwZSBfX2lvbWVtICphZGRyLCB0eXBlIHZhbCkJCVwKK3sJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IiBpbnNuCQkJCVwKKyAJCTogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsJCVwKKwlJT19TRVRfU1lOQ19GTEFHKCk7CQkJCQlcCit9CiAKLSNkZWZpbmUgaW5fOChhZGRyKQkJX19pbl84KChhZGRyKSkKLSNkZWZpbmUgb3V0XzgoYWRkciwgdmFsKQlfX291dF84KChhZGRyKSwgKHZhbCkpCi0jZGVmaW5lIGluX2xlMTYoYWRkcikJCV9faW5fbGUxNigoYWRkcikpCi0jZGVmaW5lIGluX2JlMTYoYWRkcikJCV9faW5fYmUxNigoYWRkcikpCi0jZGVmaW5lIG91dF9sZTE2KGFkZHIsIHZhbCkJX19vdXRfbGUxNigoYWRkciksICh2YWwpKQotI2RlZmluZSBvdXRfYmUxNihhZGRyLCB2YWwpCV9fb3V0X2JlMTYoKGFkZHIpLCAodmFsKSkKLSNkZWZpbmUgaW5fbGUzMihhZGRyKQkJX19pbl9sZTMyKChhZGRyKSkKLSNkZWZpbmUgaW5fYmUzMihhZGRyKQkJX19pbl9iZTMyKChhZGRyKSkKLSNkZWZpbmUgb3V0X2xlMzIoYWRkciwgdmFsKQlfX291dF9sZTMyKChhZGRyKSwgKHZhbCkpCi0jZGVmaW5lIG91dF9iZTMyKGFkZHIsIHZhbCkJX19vdXRfYmUzMigoYWRkciksICh2YWwpKQotI2RlZmluZSBpbl9sZTY0KGFkZHIpCQlfX2luX2xlNjQoKGFkZHIpKQotI2RlZmluZSBpbl9iZTY0KGFkZHIpCQlfX2luX2JlNjQoKGFkZHIpKQotI2RlZmluZSBvdXRfbGU2NChhZGRyLCB2YWwpCV9fb3V0X2xlNjQoKGFkZHIpLCAodmFsKSkKLSNkZWZpbmUgb3V0X2JlNjQoYWRkciwgdmFsKQlfX291dF9iZTY0KChhZGRyKSwgKHZhbCkpCisKKyNkZWZpbmUgREVGX01NSU9fSU5fQkUobmFtZSwgc2l6ZSwgaW5zbikgXAorCURFRl9NTUlPX0lOKG5hbWUsIHUjI3NpemUsIF9fc3RyaW5naWZ5KGluc24pIiVVMiVYMiAlMCwlMiIpCisjZGVmaW5lIERFRl9NTUlPX0lOX0xFKG5hbWUsIHNpemUsIGluc24pIFwKKwlERUZfTU1JT19JTihuYW1lLCB1IyNzaXplLCBfX3N0cmluZ2lmeShpbnNuKSIgJTAsMCwlMSIpCisKKyNkZWZpbmUgREVGX01NSU9fT1VUX0JFKG5hbWUsIHNpemUsIGluc24pIFwKKwlERUZfTU1JT19PVVQobmFtZSwgdSMjc2l6ZSwgX19zdHJpbmdpZnkoaW5zbikiJVUwJVgwICUxLCUwIikKKyNkZWZpbmUgREVGX01NSU9fT1VUX0xFKG5hbWUsIHNpemUsIGluc24pIFwKKwlERUZfTU1JT19PVVQobmFtZSwgdSMjc2l6ZSwgX19zdHJpbmdpZnkoaW5zbikiICUxLDAsJTIiKQorCitERUZfTU1JT19JTl9CRShpbl84LCAgICAgOCwgbGJ6KTsKK0RFRl9NTUlPX0lOX0JFKGluX2JlMTYsIDE2LCBsaHopOworREVGX01NSU9fSU5fQkUoaW5fYmUzMiwgMzIsIGx3eik7CitERUZfTU1JT19JTl9MRShpbl9sZTE2LCAxNiwgbGhicngpOworREVGX01NSU9fSU5fTEUoaW5fbGUzMiwgMzIsIGx3YnJ4KTsKKworREVGX01NSU9fT1VUX0JFKG91dF84LCAgICAgOCwgc3RiKTsKK0RFRl9NTUlPX09VVF9CRShvdXRfYmUxNiwgMTYsIHN0aCk7CitERUZfTU1JT19PVVRfQkUob3V0X2JlMzIsIDMyLCBzdHcpOworREVGX01NSU9fT1VUX0xFKG91dF9sZTE2LCAxNiwgc3RoYnJ4KTsKK0RFRl9NTUlPX09VVF9MRShvdXRfbGUzMiwgMzIsIHN0d2JyeCk7CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCitERUZfTU1JT19PVVRfQkUob3V0X2JlNjQsIDY0LCBzdGQpOworREVGX01NSU9fSU5fQkUoaW5fYmU2NCwgNjQsIGxkKTsKKworLyogVGhlcmUgaXMgbm8gYXNtIGluc3RydWN0aW9ucyBmb3IgNjQgYml0cyByZXZlcnNlIGxvYWRzIGFuZCBzdG9yZXMgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGluX2xlNjQoY29uc3Qgdm9sYXRpbGUgdTY0IF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIGxlNjRfdG9fY3B1KGluX2JlNjQoYWRkcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0X2xlNjQodm9sYXRpbGUgdTY0IF9faW9tZW0gKmFkZHIsIHU2NCB2YWwpCit7CisJb3V0X2JlNjQoYWRkciwgY3B1X3RvX2xlNjQodmFsKSk7Cit9CisjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLworCisvKgorICogTG93IGxldmVsIElPIHN0cmVhbSBpbnN0cnVjdGlvbnMgYXJlIGRlZmluZWQgb3V0IG9mIGxpbmUgZm9yIG5vdworICovCitleHRlcm4gdm9pZCBfaW5zYihjb25zdCB2b2xhdGlsZSB1OCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKmFkZHIsY29uc3Qgdm9pZCAqYnVmLGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX2luc3dfbnMoY29uc3Qgdm9sYXRpbGUgdTE2IF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfb3V0c3dfbnModm9sYXRpbGUgdTE2IF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfaW5zbF9ucyhjb25zdCB2b2xhdGlsZSB1MzIgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9vdXRzbF9ucyh2b2xhdGlsZSB1MzIgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKKworLyogVGhlIF9ucyBuYW1pbmcgaXMgaGlzdG9yaWNhbCBhbmQgd2lsbCBiZSByZW1vdmVkLiBGb3Igbm93LCBqdXN0ICNkZWZpbmUKKyAqIHRoZSBub24gX25zIGVxdWl2YWxlbnQgbmFtZXMKKyAqLworI2RlZmluZSBfaW5zdwlfaW5zd19ucworI2RlZmluZSBfaW5zbAlfaW5zbF9ucworI2RlZmluZSBfb3V0c3cJX291dHN3X25zCisjZGVmaW5lIF9vdXRzbAlfb3V0c2xfbnMKKworCisvKgorICogbWVtc2V0X2lvLCBtZW1jcHlfdG9pbywgbWVtY3B5X2Zyb21pbyBiYXNlIGltcGxlbWVudGF0aW9ucyBhcmUgb3V0IG9mIGxpbmUKKyAqLworCitleHRlcm4gdm9pZCBfbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdm9pZCBfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdm9pZCBfbWVtY3B5X3RvaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCBjb25zdCB2b2lkICpzcmMsCisJCQkgdW5zaWduZWQgbG9uZyBuKTsKKworLyoKKyAqCisgKiBQQ0kgYW5kIHN0YW5kYXJkIElTQSBhY2Nlc3NvcnMKKyAqCisgKiBUaG9zZSBhcmUgZ2xvYmFsbHkgZGVmaW5lZCBsaW51eCBhY2Nlc3NvcnMgZm9yIGRldmljZXMgb24gUENJIG9yIElTQQorICogYnVzc2VzLiBUaGV5IGZvbGxvdyB0aGUgTGludXggZGVmaW5lZCBzZW1hbnRpY3MuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCisgKiBmb3IgUG93ZXJQQyBpcyBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgeDg2IHZlcnNpb24gb2YgdGhlc2UsIGFuZCB0aHVzCisgKiBwcm92aWRlcyBmYWlybHkgaGVhdnkgd2VpZ2h0IGJhcnJpZXJzIGZvciB0aGUgbm9uLXJhdyB2ZXJzaW9ucworICoKKyAqIEluIGFkZGl0aW9uLCB0aGV5IHN1cHBvcnQgYSBob29rIG1lY2hhbmlzbSB3aGVuIENPTkZJR19QUENfSU5ESVJFQ1RfSU8KKyAqIGFsbG93aW5nIHRoZSBwbGF0Zm9ybSB0byBwcm92aWRlIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2Ygc29tZSBvciBhbGwKKyAqIG9mIHRoZSBhY2Nlc3NvcnMuCisgKi8KKworLyoKKyAqIEluY2x1ZGUgdGhlIEVFSCBkZWZpbml0aW9ucyB3aGVuIEVFSCBpcyBlbmFibGVkIG9ubHkgc28gdGhleSBkb24ndCBnZXQKKyAqIGluIHRoZSB3YXkgd2hlbiBidWlsZGluZyBmb3IgMzIgYml0cworICovCisjaWZkZWYgQ09ORklHX0VFSAorI2luY2x1ZGUgPGFzbS9lZWguaD4KKyNlbmRpZgorCisvKiBTaG9ydGN1dCB0byB0aGUgTU1JTyBhcmd1bWVudCBwb2ludGVyICovCisjZGVmaW5lIFBDSV9JT19BRERSCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqCisKKy8qIEluZGlyZWN0IElPIGFkZHJlc3MgdG9rZW5zOgorICoKKyAqIFdoZW4gQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBzZXQsIHRoZSBwbGF0Zm9ybSBjYW4gcHJvdmlkZSBob29rcworICogb24gYWxsIElPcy4gKE5vdGUgdGhhdCB0aGlzIGlzIGFsbCA2NCBiaXRzIG9ubHkgZm9yIG5vdykKKyAqCisgKiBUbyBoZWxwIHBsYXRmb3JtcyB3aG8gbWF5IG5lZWQgdG8gZGlmZmVyZW5jaWF0ZSBNTUlPIGFkZHJlc3NlcyBpbgorICogdGhlaXIgaG9va3MsIGEgYml0ZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgcGxhdGZvcm0gbmVhciB0aGUKKyAqIHRvcCBvZiBNTUlPIGFkZHJlc3NlcyAobm90IFBJTywgdGhvc2UgaGF2ZSB0byBjb3BlIHRoZSBoYXJkIHdheSkuCisgKgorICogVGhpcyBiaXQgZmllbGQgaXMgMTIgYml0cyBhbmQgaXMgYXQgdGhlIHRvcCBvZiB0aGUgSU8gdmlydHVhbAorICogYWRkcmVzc2VzIFBDSV9JT19JTkRJUkVDVF9UT0tFTl9NQVNLLgorICoKKyAqIFRoZSBrZXJuZWwgdmlydHVhbCBzcGFjZSBpcyB0aHVzOgorICoKKyAqICAweEQwMDAwMDAwMDAwMDAwMDAJCTogdm1hbGxvYworICogIDB4RDAwMDA4MDAwMDAwMDAwMAkJOiBQQ0kgUEhCIElPIHNwYWNlCisgKiAgMHhEMDAwMDgwMDgwMDAwMDAwCQk6IGlvcmVtYXAKKyAqICAweEQwMDAwZmZmZmZmZmZmZmYJCTogZW5kIG9mIGlvcmVtYXAgcmVnaW9uCisgKgorICogU2luY2UgdGhlIHRvcCA0IGJpdHMgYXJlIHJlc2VydmVkIGFzIHRoZSByZWdpb24gSUQsIHdlIHVzZSB0aHVzCisgKiB0aGUgbmV4dCAxMiBiaXRzIGFuZCBrZWVwIDQgYml0cyBhdmFpbGFibGUgZm9yIHRoZSBmdXR1cmUgaWYgdGhlCisgKiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaXMgZXZlciB0byBiZSBleHRlbmRlZC4KKyAqCisgKiBUaGUgZGlyZWN0IElPIG1hcHBpbmcgb3BlcmF0aW9ucyB3aWxsIHRoZW4gbWFzayBvZmYgdGhvc2UgYml0cworICogYmVmb3JlIGRvaW5nIHRoZSBhY3R1YWwgYWNjZXNzLCB0aG91Z2ggdGhhdCBvbmx5IGhhcHBlbiB3aGVuCisgKiBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIHNldCwgdGh1cyBiZSBjYXJlZnVsIHdoZW4geW91IHVzZSB0aGF0CisgKiBtZWNoYW5pc20KKyAqLworCisjaWZkZWYgQ09ORklHX1BQQ19JTkRJUkVDVF9JTworI2RlZmluZSBQQ0lfSU9fSU5EX1RPS0VOX01BU0sJMHgwZmZmMDAwMDAwMDAwMDAwdWwKKyNkZWZpbmUgUENJX0lPX0lORF9UT0tFTl9TSElGVAk0OAorI2RlZmluZSBQQ0lfRklYX0FERFIoYWRkcikJCQkJCQlcCisJKChQQ0lfSU9fQUREUikoKCh1bnNpZ25lZCBsb25nKShhZGRyKSkgJiB+UENJX0lPX0lORF9UT0tFTl9NQVNLKSkKKyNkZWZpbmUgUENJX0dFVF9BRERSX1RPS0VOKGFkZHIpCQkJCQlcCisJKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiBQQ0lfSU9fSU5EX1RPS0VOX01BU0spID4+IAkJXAorCQlQQ0lfSU9fSU5EX1RPS0VOX1NISUZUKQorI2RlZmluZSBQQ0lfU0VUX0FERFJfVE9LRU4oYWRkciwgdG9rZW4pIAkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19hID0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpOwkJCVwKKwlfX2EgJj0gflBDSV9JT19JTkRfVE9LRU5fTUFTSzsJCQkJCVwKKwlfX2EgfD0gKCh1bnNpZ25lZCBsb25nKSh0b2tlbikpIDw8IFBDSV9JT19JTkRfVE9LRU5fU0hJRlQ7CVwKKwkoYWRkcikgPSAodm9pZCBfX2lvbWVtICopX19hOwkJCQkJXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgUENJX0ZJWF9BRERSKGFkZHIpIChhZGRyKQorI2VuZGlmCisKKworLyoKKyAqIE5vbiBvcmRlcmVkIGFuZCBub24tc3dhcHBpbmcgInJhdyIgYWNjZXNzb3JzCisgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9fcmF3X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKVBDSV9GSVhfQUREUihhZGRyKTsKIH0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcik7CiB9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3Jhd19yZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilhZGRyOwotfQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopUENJX0ZJWF9BRERSKGFkZHIpOwogfQogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlYih1bnNpZ25lZCBjaGFyIHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKWFkZHIgPSB2OworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2ZvcmNlICopUENJX0ZJWF9BRERSKGFkZHIpID0gdjsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXcodW5zaWduZWQgc2hvcnQgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19mb3JjZSAqKWFkZHIgPSB2OworCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19mb3JjZSAqKVBDSV9GSVhfQUREUihhZGRyKSA9IHY7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVsKHVuc2lnbmVkIGludCB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19mb3JjZSAqKWFkZHIgPSB2OworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcikgPSB2OworfQorCisjaWZkZWYgX19wb3dlcnBjNjRfXworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcik7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVxKHVuc2lnbmVkIGxvbmcgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ZvcmNlICopYWRkciA9IHY7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcikgPSB2OwogfQotI2RlZmluZSBtZW1zZXRfaW8oYSxiLGMpCWVlaF9tZW1zZXRfaW8oKGEpLChiKSwoYykpCi0jZGVmaW5lIG1lbWNweV9mcm9taW8oYSxiLGMpCWVlaF9tZW1jcHlfZnJvbWlvKChhKSwoYiksKGMpKQotI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykJZWVoX21lbWNweV90b2lvKChhKSwoYiksKGMpKQotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCisjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiAvKgotICogVGhlIGluc3cvb3V0c3cvaW5zbC9vdXRzbCBtYWNyb3MgZG9uJ3QgZG8gYnl0ZS1zd2FwcGluZy4KLSAqIFRoZXkgYXJlIG9ubHkgdXNlZCBpbiBwcmFjdGljZSBmb3IgdHJhbnNmZXJyaW5nIGJ1ZmZlcnMgd2hpY2gKLSAqIGFyZSBhcnJheXMgb2YgYnl0ZXMsIGFuZCBieXRlLXN3YXBwaW5nIGlzIG5vdCBhcHByb3ByaWF0ZSBpbgotICogdGhhdCBjYXNlLiAgLSBwYXVsdXMgKi8KLSNkZWZpbmUgaW5zYihwb3J0LCBidWYsIG5zKQllZWhfaW5zYigocG9ydCksIChidWYpLCAobnMpKQotI2RlZmluZSBpbnN3KHBvcnQsIGJ1ZiwgbnMpCWVlaF9pbnN3X25zKChwb3J0KSwgKGJ1ZiksIChucykpCi0jZGVmaW5lIGluc2wocG9ydCwgYnVmLCBubCkJZWVoX2luc2xfbnMoKHBvcnQpLCAoYnVmKSwgKG5sKSkKKyAqCisgKiBQQ0kgUElPIGFuZCBNTUlPIGFjY2Vzc29ycy4KKyAqCisgKgorICogT24gMzIgYml0cywgUElPIG9wZXJhdGlvbnMgaGF2ZSBhIHJlY292ZXJ5IG1lY2hhbmlzbSBpbiBjYXNlIHRoZXkgdHJpZ2dlcgorICogbWFjaGluZSBjaGVja3MgKHdoaWNoIHRoZXkgb2NjYXNpb25hbGx5IGRvIHdoZW4gcHJvYmluZyBub24gZXhpc3RpbmcKKyAqIElPIHBvcnRzIG9uIHNvbWUgcGxhdGZvcm1zLCBsaWtlIFBvd2VyTWFjIGFuZCA4eHgpLgorICogSSBhbHdheXMgZm91bmQgaXQgdG8gYmUgb2YgZHViaW91cyByZWxpYWJpbGl0eSBhbmQgSSBhbSB0ZW1wdGVkIHRvIGdldAorICogcmlkIG9mIGl0IG9uZSBvZiB0aGVzZSBkYXlzLiBTbyBpZiB5b3UgdGhpbmsgaXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpdCwKKyAqIHBsZWFzZSB2b2ljZSB1cCBhc2FwLiBXZSBuZXZlciBoYWQgaXQgZm9yIDY0IGJpdHMgYW5kIEkgZG8gbm90IGludGVuZAorICogdG8gcG9ydCBpdCBvdmVyCisgKi8KIAotI2RlZmluZSBvdXRzYihwb3J0LCBidWYsIG5zKSAgX291dHNiKCh1OCBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQotI2RlZmluZSBvdXRzdyhwb3J0LCBidWYsIG5zKSAgX291dHN3X25zKCh1MTYgX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKLSNkZWZpbmUgb3V0c2wocG9ydCwgYnVmLCBubCkgIF9vdXRzbF9ucygodTMyIF9faW9tZW0gKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChubCkpCisjaWZkZWYgQ09ORklHX1BQQzMyCiAKLSNkZWZpbmUgcmVhZGIoYWRkcikJCWVlaF9yZWFkYihhZGRyKQotI2RlZmluZSByZWFkdyhhZGRyKQkJZWVoX3JlYWR3KGFkZHIpCi0jZGVmaW5lIHJlYWRsKGFkZHIpCQllZWhfcmVhZGwoYWRkcikKLSNkZWZpbmUgcmVhZHEoYWRkcikJCWVlaF9yZWFkcShhZGRyKQotI2RlZmluZSB3cml0ZWIoZGF0YSwgYWRkcikJZWVoX3dyaXRlYigoZGF0YSksIChhZGRyKSkKLSNkZWZpbmUgd3JpdGV3KGRhdGEsIGFkZHIpCWVlaF93cml0ZXcoKGRhdGEpLCAoYWRkcikpCi0jZGVmaW5lIHdyaXRlbChkYXRhLCBhZGRyKQllZWhfd3JpdGVsKChkYXRhKSwgKGFkZHIpKQotI2RlZmluZSB3cml0ZXEoZGF0YSwgYWRkcikJZWVoX3dyaXRlcSgoZGF0YSksIChhZGRyKSkKLSNkZWZpbmUgaW5iKHBvcnQpCQllZWhfaW5iKCh1bnNpZ25lZCBsb25nKXBvcnQpCi0jZGVmaW5lIG91dGIodmFsLCBwb3J0KQkJZWVoX291dGIodmFsLCAodW5zaWduZWQgbG9uZylwb3J0KQotI2RlZmluZSBpbncocG9ydCkJCWVlaF9pbncoKHVuc2lnbmVkIGxvbmcpcG9ydCkKLSNkZWZpbmUgb3V0dyh2YWwsIHBvcnQpCQllZWhfb3V0dyh2YWwsICh1bnNpZ25lZCBsb25nKXBvcnQpCi0jZGVmaW5lIGlubChwb3J0KQkJZWVoX2lubCgodW5zaWduZWQgbG9uZylwb3J0KQotI2RlZmluZSBvdXRsKHZhbCwgcG9ydCkJCWVlaF9vdXRsKHZhbCwgKHVuc2lnbmVkIGxvbmcpcG9ydCkKKyNkZWZpbmUgX19kb19pbl9hc20obmFtZSwgb3ApCQkJCVwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5hbWUodW5zaWduZWQgaW50IHBvcnQpCVwKK3sJCQkJCQkJXAorCXVuc2lnbmVkIGludCB4OwkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCisJCSJzeW5jXG4iCQkJCVwKKwkJIjA6IglvcCAiCSUwLDAsJTFcbiIJCVwKKwkJIjE6CXR3aQkwLCUwLDBcbiIJCVwKKwkJIjI6CWlzeW5jXG4iCQkJXAorCQkiMzoJbm9wXG4iCQkJCVwKKwkJIjQ6XG4iCQkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCSI1OglsaQklMCwtMVxuIgkJXAorCQkiCWIJNGJcbiIJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkiCS5hbGlnbgkyXG4iCQkJXAorCQkiCS5sb25nCTBiLDViXG4iCQlcCisJCSIJLmxvbmcJMWIsNWJcbiIJCVwKKwkJIgkubG9uZwkyYiw1YlxuIgkJXAorCQkiCS5sb25nCTNiLDViXG4iCQlcCisJCSIucHJldmlvdXMiCQkJCVwKKwkJOiAiPSZyIiAoeCkJCQkJXAorCQk6ICJyIiAocG9ydCArIF9JT19CQVNFKSk7CQlcCisJcmV0dXJuIHg7CQkJCQlcCit9CiAKKyNkZWZpbmUgX19kb19vdXRfYXNtKG5hbWUsIG9wKQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgbmFtZSh1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgcG9ydCkgXAorewkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCVwKKwkJInN5bmNcbiIJCQkJXAorCQkiMDoiIG9wICIgJTAsMCwlMVxuIgkJCVwKKwkJIjE6CXN5bmNcbiIJCQkJXAorCQkiMjpcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCVwKKwkJIgkuYWxpZ24JMlxuIgkJCVwKKwkJIgkubG9uZwkwYiwyYlxuIgkJXAorCQkiCS5sb25nCTFiLDJiXG4iCQlcCisJCSIucHJldmlvdXMiCQkJCVwKKwkJOiA6ICJyIiAodmFsKSwgInIiIChwb3J0ICsgX0lPX0JBU0UpKTsJXAorfQorCitfX2RvX2luX2FzbShfcmVjX2luYiwgImxiengiKQorX19kb19pbl9hc20oX3JlY19pbncsICJsaGJyeCIpCitfX2RvX2luX2FzbShfcmVjX2lubCwgImx3YnJ4IikKK19fZG9fb3V0X2FzbShfcmVjX291dGIsICJzdGJ4IikKK19fZG9fb3V0X2FzbShfcmVjX291dHcsICJzdGhicngiKQorX19kb19vdXRfYXNtKF9yZWNfb3V0bCwgInN0d2JyeCIpCisKKyNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KKworLyogVGhlICJfX2RvXyoiIG9wZXJhdGlvbnMgYmVsb3cgcHJvdmlkZSB0aGUgYWN0dWFsICJiYXNlIiBpbXBsZW1lbnRhdGlvbgorICogZm9yIGVhY2ggb2YgdGhlIGRlZmluZWQgYWNjY2Vzc29yLiBTb21lIG9mIHRoZW0gdXNlIHRoZSBvdXRfKiBmdW5jdGlvbnMKKyAqIGRpcmVjdGx5LCBzb21lIG9mIHRoZW0gc3RpbGwgdXNlIEVFSCwgdGhvdWdoIHdlIG1pZ2h0IGNoYW5nZSB0aGF0IGluIHRoZQorICogZnV0dXJlLiBUaG9zZSBtYWNyb3MgYmVsb3cgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50IHN3YXBwaW5nIGFuZAorICogaGFuZGxpbmcgb2YgdGhlIElPIGJhc2UgZm9yIFBJTy4KKyAqCisgKiBUaGV5IGFyZSB0aGVtc2VsdmVzIHVzZWQgYnkgdGhlIG1hY3JvcyB0aGF0IGRlZmluZSB0aGUgYWN0dWFsIGFjY2Vzc29ycworICogYW5kIGNhbiBiZSB1c2VkIGJ5IHRoZSBob29rcyBpZiBhbnkuCisgKgorICogTm90ZSB0aGF0IFBJTyBvcGVyYXRpb25zIGFyZSBhbHdheXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGVpciBjb3JyZXNvbmRpbmcKKyAqIE1NSU8gb3BlcmF0aW9ucy4gVGhhdCBhbGxvd3MgcGxhdGZvcm1zIGxpa2UgaVNlcmllcyB3aG8gd2FudCB0byBtb2RpZnkgdGhlCisgKiBiZWhhdmlvdXIgb2YgYm90aCB0byBvbmx5IGhvb2sgb24gdGhlIE1NSU8gdmVyc2lvbiBhbmQgZ2V0IGJvdGguIEl0J3MgYWxzbworICogcG9zc2libGUgdG8gaG9vayBkaXJlY3RseSBhdCB0aGUgdG9wbGV2ZWwgUElPIG9wZXJhdGlvbiBpZiB0aGV5IGhhdmUgdG8KKyAqIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAqLworI2RlZmluZSBfX2RvX3dyaXRlYih2YWwsIGFkZHIpCW91dF84KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRldyh2YWwsIGFkZHIpCW91dF9sZTE2KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlbCh2YWwsIGFkZHIpCW91dF9sZTMyKFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlcSh2YWwsIGFkZHIpCW91dF9sZTY0KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRld19iZSh2YWwsIGFkZHIpIG91dF9iZTE2KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlbF9iZSh2YWwsIGFkZHIpIG91dF9iZTMyKFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlcV9iZSh2YWwsIGFkZHIpIG91dF9iZTY0KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorCisjaWZkZWYgQ09ORklHX0VFSAorI2RlZmluZSBfX2RvX3JlYWRiKGFkZHIpCWVlaF9yZWFkYihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHcoYWRkcikJZWVoX3JlYWR3KFBDSV9GSVhfQUREUihhZGRyKSkKKyNkZWZpbmUgX19kb19yZWFkbChhZGRyKQllZWhfcmVhZGwoUENJX0ZJWF9BRERSKGFkZHIpKQorI2RlZmluZSBfX2RvX3JlYWRxKGFkZHIpCWVlaF9yZWFkcShQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHdfYmUoYWRkcikJZWVoX3JlYWR3X2JlKFBDSV9GSVhfQUREUihhZGRyKSkKKyNkZWZpbmUgX19kb19yZWFkbF9iZShhZGRyKQllZWhfcmVhZGxfYmUoUENJX0ZJWF9BRERSKGFkZHIpKQorI2RlZmluZSBfX2RvX3JlYWRxX2JlKGFkZHIpCWVlaF9yZWFkcV9iZShQQ0lfRklYX0FERFIoYWRkcikpCisjZWxzZSAvKiBDT05GSUdfRUVIICovCisjZGVmaW5lIF9fZG9fcmVhZGIoYWRkcikJaW5fOChQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHcoYWRkcikJaW5fbGUxNihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZGwoYWRkcikJaW5fbGUzMihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHEoYWRkcikJaW5fbGU2NChQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHdfYmUoYWRkcikJaW5fYmUxNihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZGxfYmUoYWRkcikJaW5fYmUzMihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHFfYmUoYWRkcikJaW5fYmU2NChQQ0lfRklYX0FERFIoYWRkcikpCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0VFSCkgKi8KKworI2lmZGVmIENPTkZJR19QUEMzMgorI2RlZmluZSBfX2RvX291dGIodmFsLCBwb3J0KQlfcmVjX291dGIodmFsLCBwb3J0KQorI2RlZmluZSBfX2RvX291dHcodmFsLCBwb3J0KQlfcmVjX291dHcodmFsLCBwb3J0KQorI2RlZmluZSBfX2RvX291dGwodmFsLCBwb3J0KQlfcmVjX291dGwodmFsLCBwb3J0KQorI2RlZmluZSBfX2RvX2luYihwb3J0KQkJX3JlY19pbmIocG9ydCkKKyNkZWZpbmUgX19kb19pbncocG9ydCkJCV9yZWNfaW53KHBvcnQpCisjZGVmaW5lIF9fZG9faW5sKHBvcnQpCQlfcmVjX2lubChwb3J0KQorI2Vsc2UgLyogQ09ORklHX1BQQzMyICovCisjZGVmaW5lIF9fZG9fb3V0Yih2YWwsIHBvcnQpCXdyaXRlYih2YWwsKFBDSV9JT19BRERSKV9JT19CQVNFK3BvcnQpOworI2RlZmluZSBfX2RvX291dHcodmFsLCBwb3J0KQl3cml0ZXcodmFsLChQQ0lfSU9fQUREUilfSU9fQkFTRStwb3J0KTsKKyNkZWZpbmUgX19kb19vdXRsKHZhbCwgcG9ydCkJd3JpdGVsKHZhbCwoUENJX0lPX0FERFIpX0lPX0JBU0UrcG9ydCk7CisjZGVmaW5lIF9fZG9faW5iKHBvcnQpCQlyZWFkYigoUENJX0lPX0FERFIpX0lPX0JBU0UgKyBwb3J0KTsKKyNkZWZpbmUgX19kb19pbncocG9ydCkJCXJlYWR3KChQQ0lfSU9fQUREUilfSU9fQkFTRSArIHBvcnQpOworI2RlZmluZSBfX2RvX2lubChwb3J0KQkJcmVhZGwoKFBDSV9JT19BRERSKV9JT19CQVNFICsgcG9ydCk7CisjZW5kaWYgLyogIUNPTkZJR19QUEMzMiAqLworCisjaWZkZWYgQ09ORklHX0VFSAorI2RlZmluZSBfX2RvX3JlYWRzYihhLCBiLCBuKQllZWhfcmVhZHNiKFBDSV9GSVhfQUREUihhKSwgKGIpLCAobikpCisjZGVmaW5lIF9fZG9fcmVhZHN3KGEsIGIsIG4pCWVlaF9yZWFkc3coUENJX0ZJWF9BRERSKGEpLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19yZWFkc2woYSwgYiwgbikJZWVoX3JlYWRzbChQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2Vsc2UgLyogQ09ORklHX0VFSCAqLworI2RlZmluZSBfX2RvX3JlYWRzYihhLCBiLCBuKQlfaW5zYihQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2RlZmluZSBfX2RvX3JlYWRzdyhhLCBiLCBuKQlfaW5zdyhQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2RlZmluZSBfX2RvX3JlYWRzbChhLCBiLCBuKQlfaW5zbChQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2VuZGlmIC8qICFDT05GSUdfRUVIICovCisjZGVmaW5lIF9fZG9fd3JpdGVzYihhLCBiLCBuKQlfb3V0c2IoUENJX0ZJWF9BRERSKGEpLChiKSwobikpCisjZGVmaW5lIF9fZG9fd3JpdGVzdyhhLCBiLCBuKQlfb3V0c3coUENJX0ZJWF9BRERSKGEpLChiKSwobikpCisjZGVmaW5lIF9fZG9fd3JpdGVzbChhLCBiLCBuKQlfb3V0c2woUENJX0ZJWF9BRERSKGEpLChiKSwobikpCisKKyNkZWZpbmUgX19kb19pbnNiKHAsIGIsIG4pCXJlYWRzYigoUENJX0lPX0FERFIpX0lPX0JBU0UrKHApLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19pbnN3KHAsIGIsIG4pCXJlYWRzdygoUENJX0lPX0FERFIpX0lPX0JBU0UrKHApLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19pbnNsKHAsIGIsIG4pCXJlYWRzbCgoUENJX0lPX0FERFIpX0lPX0JBU0UrKHApLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19vdXRzYihwLCBiLCBuKQl3cml0ZXNiKChQQ0lfSU9fQUREUilfSU9fQkFTRSsocCksKGIpLChuKSkKKyNkZWZpbmUgX19kb19vdXRzdyhwLCBiLCBuKQl3cml0ZXN3KChQQ0lfSU9fQUREUilfSU9fQkFTRSsocCksKGIpLChuKSkKKyNkZWZpbmUgX19kb19vdXRzbChwLCBiLCBuKQl3cml0ZXNsKChQQ0lfSU9fQUREUilfSU9fQkFTRSsocCksKGIpLChuKSkKKworI2RlZmluZSBfX2RvX21lbXNldF9pbyhhZGRyLCBjLCBuKQlcCisJCQkJX21lbXNldF9pbyhQQ0lfRklYX0FERFIoYWRkciksIGMsIG4pCisjZGVmaW5lIF9fZG9fbWVtY3B5X3RvaW8oZHN0LCBzcmMsIG4pCVwKKwkJCQlfbWVtY3B5X3RvaW8oUENJX0ZJWF9BRERSKGRzdCksIHNyYywgbikKKworI2lmZGVmIENPTkZJR19FRUgKKyNkZWZpbmUgX19kb19tZW1jcHlfZnJvbWlvKGRzdCwgc3JjLCBuKQlcCisJCQkJZWVoX21lbWNweV9mcm9taW8oZHN0LCBQQ0lfRklYX0FERFIoc3JjKSwgbikKKyNlbHNlIC8qIENPTkZJR19FRUggKi8KKyNkZWZpbmUgX19kb19tZW1jcHlfZnJvbWlvKGRzdCwgc3JjLCBuKQlcCisJCQkJX21lbWNweV9mcm9taW8oZHN0LFBDSV9GSVhfQUREUihzcmMpLG4pCisjZW5kaWYgLyogIUNPTkZJR19FRUggKi8KKworI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfSU8KKyNkZWZpbmUgREVGX1BDSV9IT09LKHgpCQl4CisjZWxzZQorI2RlZmluZSBERUZfUENJX0hPT0soeCkJCU5VTEwKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIGhvb2tzICovCitleHRlcm4gc3RydWN0IHBwY19wY2lfaW8geworCisjZGVmaW5lIERFRl9QQ0lfQUNfUkVUKG5hbWUsIHJldCwgYXQsIGFsKQlyZXQgKCpuYW1lKSBhdDsKKyNkZWZpbmUgREVGX1BDSV9BQ19OT1JFVChuYW1lLCBhdCwgYWwpCQl2b2lkICgqbmFtZSkgYXQ7CisKKyNpbmNsdWRlIDxhc20vaW8tZGVmcy5oPgorCisjdW5kZWYgREVGX1BDSV9BQ19SRVQKKyN1bmRlZiBERUZfUENJX0FDX05PUkVUCisKK30gcHBjX3BjaV9pbzsKKworLyogVGhlIGlubGluZSB3cmFwcGVycyAqLworI2RlZmluZSBERUZfUENJX0FDX1JFVChuYW1lLCByZXQsIGF0LCBhbCkJCQlcCitzdGF0aWMgaW5saW5lIHJldCBuYW1lIGF0CQkJCQlcCit7CQkJCQkJCQlcCisJaWYgKERFRl9QQ0lfSE9PSyhwcGNfcGNpX2lvLm5hbWUpICE9IE5VTEwpCQlcCisJCXJldHVybiBwcGNfcGNpX2lvLm5hbWUgYWw7CQkJXAorCXJldHVybiBfX2RvXyMjbmFtZSBhbDsJCQkJCVwKK30KKworI2RlZmluZSBERUZfUENJX0FDX05PUkVUKG5hbWUsIGF0LCBhbCkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIG5hbWUgYXQJCQkJCVwKK3sJCQkJCQkJCVwKKwlpZiAoREVGX1BDSV9IT09LKHBwY19wY2lfaW8ubmFtZSkgIT0gTlVMTCkJCVwKKwkJcHBjX3BjaV9pby5uYW1lIGFsOwkJCQlcCisJZWxzZQkJCQkJCQlcCisJCV9fZG9fIyNuYW1lIGFsOwkJCQkJXAorfQorCisjaW5jbHVkZSA8YXNtL2lvLWRlZnMuaD4KKworI3VuZGVmIERFRl9QQ0lfQUNfUkVUCisjdW5kZWYgREVGX1BDSV9BQ19OT1JFVAorCisvKiBTb21lIGRyaXZlcnMgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiByZWFkcSAmIHdyaXRlcSB3aXRoCisgKiBhICNpZmRlZiwgc28gd2UgbWFrZSB0aGVtIGhhcHB5IGhlcmUuCisgKi8KKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisjZGVmaW5lIHJlYWRxCXJlYWRxCisjZGVmaW5lIHdyaXRlcQl3cml0ZXEKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorCisjZGVmaW5lIGRtYV9jYWNoZV9pbnYoX3N0YXJ0LF9zaXplKSBcCisJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoX3N0YXJ0LCAoX3N0YXJ0ICsgX3NpemUpKQorI2RlZmluZSBkbWFfY2FjaGVfd2JhY2soX3N0YXJ0LF9zaXplKSBcCisJY2xlYW5fZGNhY2hlX3JhbmdlKF9zdGFydCwgKF9zdGFydCArIF9zaXplKSkKKyNkZWZpbmUgZG1hX2NhY2hlX3diYWNrX2ludihfc3RhcnQsX3NpemUpIFwKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoX3N0YXJ0LCAoX3N0YXJ0ICsgX3NpemUpKQorCisjZWxzZSAvKiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFICovCisKKyNkZWZpbmUgZG1hX2NhY2hlX2ludihfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9jYWNoZV93YmFjayhfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9jYWNoZV93YmFja19pbnYoX3N0YXJ0LF9zaXplKQlkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSAqLworCisvKgorICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQorICogYWNjZXNzCisgKi8KKyNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkJX192YShwKQorCisvKgorICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKQlwCisKKy8qCisgKiBXZSBkb24ndCBkbyByZWxheGVkIG9wZXJhdGlvbnMgeWV0LCBhdCBsZWFzdCBub3Qgd2l0aCB0aGlzIHNlbWFudGljCisgKi8KICNkZWZpbmUgcmVhZGJfcmVsYXhlZChhZGRyKSByZWFkYihhZGRyKQogI2RlZmluZSByZWFkd19yZWxheGVkKGFkZHIpIHJlYWR3KGFkZHIpCiAjZGVmaW5lIHJlYWRsX3JlbGF4ZWQoYWRkcikgcmVhZGwoYWRkcikKICNkZWZpbmUgcmVhZHFfcmVsYXhlZChhZGRyKSByZWFkcShhZGRyKQogCi1leHRlcm4gdm9pZCBfaW5zYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBfaW5zd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9vdXRzd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX291dHNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotCisjaWZkZWYgQ09ORklHX1BQQzMyCisjZGVmaW5lIG1taW93YigpCisjZWxzZQorLyoKKyAqIEVuZm9yY2Ugc3luY2hyb25pc2F0aW9uIG9mIHN0b3JlcyB2cy4gc3Bpbl91bmxvY2sKKyAqICh0aGlzIGRvZXMgaXQgZXhwbGljaXRlbHksIHRob3VnaCBvdXIgaW1wbGVtZW50YXRpb24gb2Ygc3Bpbl91bmxvY2sKKyAqIGRvZXMgaXQgaW1wbGljaXRlbHkgdG9vKQorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1pb3diKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CkBAIC0xNjksNiArNTQ1LDI0IEBACiAJOiAiPSZyIiAodG1wKSA6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBpb19zeW5jKSkKIAk6ICJtZW1vcnkiKTsKIH0KKyNlbmRpZiAvKiAhQ09ORklHX1BQQzMyICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3N5bmModm9pZCkKK3sKKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7Cit9CisKKy8qIEVuZm9yY2UgaW4tb3JkZXIgZXhlY3V0aW9uIG9mIGRhdGEgSS9PLgorICogTm8gZGlzdGluY3Rpb24gYmV0d2VlbiByZWFkL3dyaXRlIG9uIFBQQzsgdXNlIGVpZWlvIGZvciBhbGwgdGhyZWUuCisgKiBUaG9zZSBhcmUgZmFpcmx5IHdlZWsgdGhvdWdoLiBUaGV5IGRvbid0IHByb3ZpZGUgYSBiYXJyaWVyIGJldHdlZW4KKyAqIE1NSU8gYW5kIGNhY2hlYWJsZSBzdG9yYWdlIG5vciBkbyB0aGV5IHByb3ZpZGUgYSBiYXJyaWVyIHZzLiBsb2NrcywKKyAqIHRoZXkgb25seSBwcm92aWRlIGJhcnJpZXJzIGJldHdlZW4gMiBfX3JhdyBNTUlPIG9wZXJhdGlvbnMgYW5kCisgKiBwb3NzaWJseSBicmVhayB3cml0ZSBjb21iaW5pbmcuCisgKi8KKyNkZWZpbmUgaW9iYXJyaWVyX3J3KCkgZWllaW8oKQorI2RlZmluZSBpb2JhcnJpZXJfcigpICBlaWVpbygpCisjZGVmaW5lIGlvYmFycmllcl93KCkgIGVpZWlvKCkKKwogCiAvKgogICogb3V0cHV0IHBhdXNlIHZlcnNpb25zIG5lZWQgYSBkZWxheSBhdCBsZWFzdCBmb3IgdGhlCkBAIC0xODUsMTEgKzU3OSw2IEBACiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIH4oMFVMKQogCiAKLWV4dGVybiBpbnQgX19pb3JlbWFwX2V4cGxpY2l0KHVuc2lnbmVkIGxvbmcgcF9hZGRyLCB1bnNpZ25lZCBsb25nIHZfYWRkciwKLQkJICAgICAJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIF9faW9tZW0gKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCiAvKioKICAqIGlvcmVtYXAgICAgIC0gICBtYXAgYnVzIG1lbW9yeSBpbnRvIENQVSBzcGFjZQogICogQGFkZHJlc3M6ICAgYnVzIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQpAQCAtMjAwLDE0ICs1ODksNzcgQEAKICAqIHdyaXRldy93cml0ZWwgZnVuY3Rpb25zIGFuZCB0aGUgb3RoZXIgbW1pbyBoZWxwZXJzLiBUaGUgcmV0dXJuZWQKICAqIGFkZHJlc3MgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXNhYmxlIGRpcmVjdGx5IGFzIGEgdmlydHVhbAogICogYWRkcmVzcy4KKyAqCisgKiBXZSBwcm92aWRlIGEgZmV3IHZhcmlhdGlvbnMgb2YgaXQ6CisgKgorICogKiBpb3JlbWFwIGlzIHRoZSBzdGFuZGFyZCBvbmUgYW5kIHByb3ZpZGVzIG5vbi1jYWNoZWFibGUgZ3VhcmRlZCBtYXBwaW5ncworICogICBhbmQgY2FuIGJlIGhvb2tlZCBieSB0aGUgcGxhdGZvcm0gdmlhIHBwY19tZAorICoKKyAqICogaW9yZW1hcF9mbGFncyBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgcGFnZSBmbGFncyBhcyBhbiBhcmd1bWVudCBhbmQgY2FuCisgKiAgIGFsc28gYmUgaG9va2VkIGJ5IHRoZSBwbGF0Zm9ybSB2aWEgcHBjX21kCisgKgorICogKiBpb3JlbWFwX25vY2FjaGUgaXMgaWRlbnRpY2FsIHRvIGlvcmVtYXAKKyAqCisgKiAqIGlvdW5tYXAgdW5kb2VzIHN1Y2ggYSBtYXBwaW5nIGFuZCBjYW4gYmUgaG9va2VkCisgKgorICogKiBfX2lvcmVtYXBfZXhwbGljaXQgKGFuZCB0aGUgcGVuZGluZyBfX2lvdW5tYXBfZXhwbGljaXQpIGFyZSBsb3cgbGV2ZWwKKyAqICAgZnVuY3Rpb25zIHRvIGNyZWF0ZSBoYW5kLW1hZGUgbWFwcGluZ3MgZm9yIHVzZSBvbmx5IGJ5IHRoZSBQQ0kgY29kZQorICogICBhbmQgY2Fubm90IGN1cnJlbnRseSBiZSBob29rZWQuCisgKgorICogKiBfX2lvcmVtYXAgaXMgdGhlIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGlvcmVtYXAgYW5kCisgKiAgIGlvcmVtYXBfZmxhZ3MgYW5kIGNhbm5vdCBiZSBob29rZWQgKGJ1dCBjYW4gYmUgdXNlZCBieSBhIGhvb2sgb24gb25lCisgKiAgIG9mIHRoZSBwcmV2aW91cyBvbmVzKQorICoKKyAqICogX19pb3VubWFwLCBpcyB0aGUgbG93IGxldmVsIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgaW91bm1hcCBhbmQgY2Fubm90CisgKiAgIGJlIGhvb2tlZCAoYnV0IGNhbiBiZSB1c2VkIGJ5IGEgaG9vayBvbiBpb3VubWFwKQorICoKICAqLwotZXh0ZXJuIHZvaWQgX19pb21lbSAqaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KK2V4dGVybiB2b2lkIF9faW9tZW0gKmlvcmVtYXAocGh5c19hZGRyX3QgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIF9faW9tZW0gKmlvcmVtYXBfZmxhZ3MocGh5c19hZGRyX3QgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogI2RlZmluZSBpb3JlbWFwX25vY2FjaGUoYWRkciwgc2l6ZSkJaW9yZW1hcCgoYWRkciksIChzaXplKSkKLWV4dGVybiBpbnQgaW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CisKK2V4dGVybiB2b2lkIF9faW9tZW0gKl9faW9yZW1hcChwaHlzX2FkZHJfdCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CisKK2V4dGVybiBpbnQgX19pb3JlbWFwX2V4cGxpY2l0KHBoeXNfYWRkcl90IHBfYWRkciwgdW5zaWduZWQgbG9uZyB2X2FkZHIsCisJCSAgICAgCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IF9faW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnN0YXJ0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKKwogZXh0ZXJuIHZvaWQgX19pb21lbSAqIHJlc2VydmVfcGhiX2lvc3BhY2UodW5zaWduZWQgbG9uZyBzaXplKTsKIAorLyogVGhvc2UgYXJlIG1vcmUgMzIgYml0cyBvbmx5IGZ1bmN0aW9ucyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9wYSh1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW1fcHRvdih1bnNpZ25lZCBsb25nIGFkZHIpIF9fYXR0cmlidXRlX2NvbnN0X187CitleHRlcm4gdm9pZCBpb19ibG9ja19tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdmlydCwgcGh5c19hZGRyX3QgcGh5cywKKwkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBmbGFncyk7CisKKworLyoKKyAqIFdoZW4gQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBzZXQsIHdlIHVzZSB0aGUgZ2VuZXJpYyBpb21hcCBpbXBsZW1lbnRhdGlvbgorICogd2hpY2ggbmVlZHMgc29tZSBhZGRpdGlvbmFsIGRlZmluaXRpb25zIGhlcmUuIFRoZXkgYmFzaWNhbGx5IGFsbG93IFBJTworICogc3BhY2Ugb3ZlcmFsbCB0byBiZSAxR0IuIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgd2UgbmV2ZXIgdHJ5IHRvIHVzZQorICogaW9tYXAgdG8gbWFwIE1NSU8gYmVsb3cgMUdCIHdoaWNoIHNob3VsZCBiZSBmaW5lIG9uIHBwYzY0CisgKi8KKyNkZWZpbmUgSEFWRV9BUkNIX1BJT19TSVpFCQkxCisjZGVmaW5lIFBJT19PRkZTRVQJCQkweDAwMDAwMDAwVUwKKyNkZWZpbmUgUElPX01BU0sJCQkweDNmZmZmZmZmVUwKKyNkZWZpbmUgUElPX1JFU0VSVkVECQkJMHg0MDAwMDAwMFVMCisKKyNkZWZpbmUgbW1pb19yZWFkMTZiZShhZGRyKQkJcmVhZHdfYmUoYWRkcikKKyNkZWZpbmUgbW1pb19yZWFkMzJiZShhZGRyKQkJcmVhZGxfYmUoYWRkcikKKyNkZWZpbmUgbW1pb193cml0ZTE2YmUodmFsLCBhZGRyKQl3cml0ZXdfYmUodmFsLCBhZGRyKQorI2RlZmluZSBtbWlvX3dyaXRlMzJiZSh2YWwsIGFkZHIpCXdyaXRlbF9iZSh2YWwsIGFkZHIpCisjZGVmaW5lIG1taW9faW5zYihhZGRyLCBkc3QsIGNvdW50KQlyZWFkc2IoYWRkciwgZHN0LCBjb3VudCkKKyNkZWZpbmUgbW1pb19pbnN3KGFkZHIsIGRzdCwgY291bnQpCXJlYWRzdyhhZGRyLCBkc3QsIGNvdW50KQorI2RlZmluZSBtbWlvX2luc2woYWRkciwgZHN0LCBjb3VudCkJcmVhZHNsKGFkZHIsIGRzdCwgY291bnQpCisjZGVmaW5lIG1taW9fb3V0c2IoYWRkciwgc3JjLCBjb3VudCkJd3JpdGVzYihhZGRyLCBzcmMsIGNvdW50KQorI2RlZmluZSBtbWlvX291dHN3KGFkZHIsIHNyYywgY291bnQpCXdyaXRlc3coYWRkciwgc3JjLCBjb3VudCkKKyNkZWZpbmUgbW1pb19vdXRzbChhZGRyLCBzcmMsIGNvdW50KQl3cml0ZXNsKGFkZHIsIHNyYywgY291bnQpCisKIC8qKgogICoJdmlydF90b19waHlzCS0JbWFwIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsCiAgKglAYWRkcmVzczogYWRkcmVzcyB0byByZW1hcApAQCAtMjU0LDE3OCArNzA2LDMzIEBACiAgKi8KICNkZWZpbmUgQklPX1ZNRVJHRV9CT1VOREFSWQkwCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpb3N5bmModm9pZCkKLXsKLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7Ci19Ci0KLS8qIEVuZm9yY2UgaW4tb3JkZXIgZXhlY3V0aW9uIG9mIGRhdGEgSS9PLiAKLSAqIE5vIGRpc3RpbmN0aW9uIGJldHdlZW4gcmVhZC93cml0ZSBvbiBQUEM7IHVzZSBlaWVpbyBmb3IgYWxsIHRocmVlLgotICovCi0jZGVmaW5lIGlvYmFycmllcl9ydygpIGVpZWlvKCkKLSNkZWZpbmUgaW9iYXJyaWVyX3IoKSAgZWllaW8oKQotI2RlZmluZSBpb2JhcnJpZXJfdygpICBlaWVpbygpCi0KIC8qCi0gKiA4LCAxNiBhbmQgMzIgYml0LCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gSS9PIG9wZXJhdGlvbnMsIHdpdGggYmFycmllci4KLSAqIFRoZXNlIHJvdXRpbmVzIGRvIG5vdCBwZXJmb3JtIEVFSC1yZWxhdGVkIEkvTyBhZGRyZXNzIHRyYW5zbGF0aW9uLAotICogYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBkZXZpY2UgZHJpdmVycy4gIFVzZSBpbmIvcmVhZGIKLSAqIGluc3RlYWQuCisgKiAzMiBiaXRzIHN0aWxsIHVzZXMgdmlydF90b19idXMoKSBmb3IgaXQncyBpbXBsZW1lbnRhdGlvbiBvZiBETUEKKyAqIG1hcHBpbmdzIHNlIHdlIGhhdmUgdG8ga2VlcCBpdCBkZWZpbmVkIGhlcmUuIFdlIGFsc28gaGF2ZSBzb21lIG9sZAorICogZHJpdmVycyAoc2hhbWUgc2hhbWUgc2hhbWUpIHRoYXQgdXNlIGJ1c190b192aXJ0KCkgYW5kIGhhdmVuJ3QgYmVlbgorICogZml4ZWQgeWV0IHNvIEkgbmVlZCB0byBkZWZpbmUgaXQgaGVyZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgX19pbl84KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgcmV0OworI2lmZGVmIENPTkZJR19QUEMzMgogCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IGxieiVVMSVYMSAlMCwlMTsgdHdpIDAsJTAsMDsgaXN5bmMiCi0JCQkgICAgIDogIj1yIiAocmV0KSA6ICJtIiAoKmFkZHIpKTsKLQlyZXR1cm4gcmV0Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fYnVzKHZvbGF0aWxlIHZvaWQgKiBhZGRyZXNzKQoreworICAgICAgICBpZiAoYWRkcmVzcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIF9fcGEoYWRkcmVzcykgKyBQQ0lfRFJBTV9PRkZTRVQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF84KHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkciwgaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGJ1c190b192aXJ0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgc3RiJVUwJVgwICUxLCUwIgotCQkJICAgICA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSk7Ci0JZ2V0X3BhY2EoKS0+aW9fc3luYyA9IDE7CisgICAgICAgIGlmIChhZGRyZXNzID09IDApCisJCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gX192YShhZGRyZXNzIC0gUENJX0RSQU1fT0ZGU0VUKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19pbl9sZTE2KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIpCi17Ci0JaW50IHJldDsKKyNkZWZpbmUgcGFnZV90b19idXMocGFnZSkJKHBhZ2VfdG9fcGh5cyhwYWdlKSArIFBDSV9EUkFNX09GRlNFVCkKIAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBsaGJyeCAlMCwwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKLQkJCSAgICAgOiAiPXIiIChyZXQpIDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7Ci19CisjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IF9faW5fYmUxNihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICphZGRyKQotewotCWludCByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgbGh6JVUxJVgxICUwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKLQkJCSAgICAgOiAiPXIiIChyZXQpIDogIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF9sZTE2KHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIsIGludCB2YWwpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IHN0aGJyeCAlMSwwLCUyIgotCQkJICAgICA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Ci0JZ2V0X3BhY2EoKS0+aW9fc3luYyA9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF9iZTE2KHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIsIGludCB2YWwpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IHN0aCVVMCVYMCAlMSwlMCIKLQkJCSAgICAgOiAiPW0iICgqYWRkcikgOiAiciIgKHZhbCkpOwotCWdldF9wYWNhKCktPmlvX3N5bmMgPSAxOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIF9faW5fbGUzMihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyKQotewotCXVuc2lnbmVkIHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBsd2JyeCAlMCwwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKLQkJCSAgICAgOiAiPXIiIChyZXQpIDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgX19pbl9iZTMyKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIpCi17Ci0JdW5zaWduZWQgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IGx3eiVVMSVYMSAlMCwlMTsgdHdpIDAsJTAsMDsgaXN5bmMiCi0JCQkgICAgIDogIj1yIiAocmV0KSA6ICJtIiAoKmFkZHIpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRfbGUzMih2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyLCBpbnQgdmFsKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBzdHdicnggJTEsMCwlMiIgOiAiPW0iICgqYWRkcikKLQkJCSAgICAgOiAiciIgKHZhbCksICJyIiAoYWRkcikpOwotCWdldF9wYWNhKCktPmlvX3N5bmMgPSAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRfYmUzMih2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyLCBpbnQgdmFsKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBzdHclVTAlWDAgJTEsJTAiCi0JCQkgICAgIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpKTsKLQlnZXRfcGFjYSgpLT5pb19zeW5jID0gMTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faW5fbGU2NChjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXAsIHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJICAgICAic3luY1xuIgotCQkJICAgICAibGQgJTEsMCglMilcbiIKLQkJCSAgICAgInR3aSAwLCUxLDBcbiIKLQkJCSAgICAgImlzeW5jXG4iCi0JCQkgICAgICJybGRpbWkgJTAsJTEsNSo4LDEqOFxuIgotCQkJICAgICAicmxkaW1pICUwLCUxLDMqOCwyKjhcbiIKLQkJCSAgICAgInJsZGltaSAlMCwlMSwxKjgsMyo4XG4iCi0JCQkgICAgICJybGRpbWkgJTAsJTEsNyo4LDQqOFxuIgotCQkJICAgICAicmxkaWNsICUxLCUxLDMyLDBcbiIKLQkJCSAgICAgInJsd2ltaSAlMCwlMSw4LDgsMzFcbiIKLQkJCSAgICAgInJsd2ltaSAlMCwlMSwyNCwxNiwyM1xuIgotCQkJICAgICA6ICI9ciIgKHJldCkgLCAiPXIiICh0bXApIDogImIiIChhZGRyKSAsICJtIiAoKmFkZHIpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19pbl9iZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBsZCVVMSVYMSAlMCwlMTsgdHdpIDAsJTAsMDsgaXN5bmMiCi0JCQkgICAgIDogIj1yIiAocmV0KSA6ICJtIiAoKmFkZHIpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRfbGU2NCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkgICAgICJybGRpbWkgJTAsJTEsNSo4LDEqOFxuIgotCQkJICAgICAicmxkaW1pICUwLCUxLDMqOCwyKjhcbiIKLQkJCSAgICAgInJsZGltaSAlMCwlMSwxKjgsMyo4XG4iCi0JCQkgICAgICJybGRpbWkgJTAsJTEsNyo4LDQqOFxuIgotCQkJICAgICAicmxkaWNsICUxLCUxLDMyLDBcbiIKLQkJCSAgICAgInJsd2ltaSAlMCwlMSw4LDgsMzFcbiIKLQkJCSAgICAgInJsd2ltaSAlMCwlMSwyNCwxNiwyM1xuIgotCQkJICAgICAic3luY1xuIgotCQkJICAgICAic3RkICUwLDAoJTMpIgotCQkJICAgICA6ICI9JnIiICh0bXApICwgIj0mciIgKHZhbCkgOiAiMSIgKHZhbCkgLCAiYiIgKGFkZHIpICwgIm0iICgqYWRkcikpOwotCWdldF9wYWNhKCktPmlvX3N5bmMgPSAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRfYmU2NCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBzdGQlVTAlWDAgJTEsJTAiIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpKTsKLQlnZXRfcGFjYSgpLT5pb19zeW5jID0gMTsKLX0KLQotI2luY2x1ZGUgPGFzbS9lZWguaD4KLQotLyogTm90aGluZyB0byBkbyAqLwotCi0jZGVmaW5lIGRtYV9jYWNoZV9pbnYoX3N0YXJ0LF9zaXplKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBkbWFfY2FjaGVfd2JhY2soX3N0YXJ0LF9zaXplKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBkbWFfY2FjaGVfd2JhY2tfaW52KF9zdGFydCxfc2l6ZSkJZG8geyB9IHdoaWxlICgwKQotCi0KLS8qCi0gKiBDb252ZXJ0IGEgcGh5c2ljYWwgcG9pbnRlciB0byBhIHZpcnR1YWwga2VybmVsIHBvaW50ZXIgZm9yIC9kZXYvbWVtCi0gKiBhY2Nlc3MKLSAqLwotI2RlZmluZSB4bGF0ZV9kZXZfbWVtX3B0cihwKQlfX3ZhKHApCi0KLS8qCi0gKiBDb252ZXJ0IGEgdmlydHVhbCBjYWNoZWQgcG9pbnRlciB0byBhbiB1bmNhY2hlZCBwb2ludGVyCi0gKi8KLSNkZWZpbmUgeGxhdGVfZGV2X2ttZW1fcHRyKHApCXAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19JT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmgKaW5kZXggMzlmYWQ2OC4uZjg1ZGJkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaApAQCAtMzQsNyArMzQsOSBAQAogI2RlZmluZSBJT01NVV9QQUdFX01BU0sgICAgICAgKH4oKDEgPDwgSU9NTVVfUEFHRV9TSElGVCkgLSAxKSkKICNkZWZpbmUgSU9NTVVfUEFHRV9BTElHTihhZGRyKSBfQUxJR05fVVAoYWRkciwgSU9NTVVfUEFHRV9TSVpFKQogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXworLyogQm9vdCB0aW1lIGZsYWdzICovCitleHRlcm4gaW50IGlvbW11X2lzX29mZjsKK2V4dGVybiBpbnQgaW9tbXVfZm9yY2Vfb247CiAKIC8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCiBzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIGludCBnZXRfaW9tbXVfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQpAQCAtNDIsOCArNDQsNiBAQAogCXJldHVybiBfX2lsb2cyKChzaXplIC0gMSkgPj4gSU9NTVVfUEFHRV9TSElGVCkgKyAxOwogfQogCi0jZW5kaWYgICAvKiBfX0FTU0VNQkxZX18gKi8KLQogCiAvKgogICogSU9NQVBfTUFYX09SREVSIGRlZmluZXMgdGhlIGxhcmdlc3QgY29udGlndW91cyBibG9jawpAQCAtNzAsMzkgKzcwLDMxIEBACiBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CiBzdHJ1Y3QgZGV2aWNlX25vZGU7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLQotLyogV2Fsa3MgYWxsIGJ1c2VzIGFuZCBjcmVhdGVzIGlvbW11IHRhYmxlcyAqLwotZXh0ZXJuIHZvaWQgaW9tbXVfc2V0dXBfcFNlcmllcyh2b2lkKTsKLWV4dGVybiB2b2lkIGlvbW11X3NldHVwX2RhcnQodm9pZCk7Ci0KIC8qIEZyZWVzIHRhYmxlIGZvciBhbiBpbmRpdmlkdWFsIGRldmljZSBub2RlICovCiBleHRlcm4gdm9pZCBpb21tdV9mcmVlX3RhYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOwogCi0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCi0KIC8qIEluaXRpYWxpemVzIGFuIGlvbW11X3RhYmxlIGJhc2VkIGluIHZhbHVlcyBzZXQgaW4gdGhlIHBhc3NlZC1pbgogICogc3RydWN0dXJlCiAgKi8KIGV4dGVybiBzdHJ1Y3QgaW9tbXVfdGFibGUgKmlvbW11X2luaXRfdGFibGUoc3RydWN0IGlvbW11X3RhYmxlICogdGJsLAogCQkJCQkgICAgaW50IG5pZCk7CiAKLWV4dGVybiBpbnQgaW9tbXVfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLCB1bnNpZ25lZCBsb25nIG1hc2ssCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gaW50IGlvbW11X21hcF9zZyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCQlpbnQgbmVsZW1zLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwogZXh0ZXJuIHZvaWQgaW9tbXVfdW5tYXBfc2coc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCQkJICAgaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKIAogZXh0ZXJuIHZvaWQgKmlvbW11X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKLQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBtYXNrLAotCQlnZnBfdCBmbGFnLCBpbnQgbm9kZSk7CisJCQkJICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJCQkJICBnZnBfdCBmbGFnLCBpbnQgbm9kZSk7CiBleHRlcm4gdm9pZCBpb21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKLQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisJCQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CiBleHRlcm4gZG1hX2FkZHJfdCBpb21tdV9tYXBfc2luZ2xlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCB2b2lkICp2YWRkciwKLQkJc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbWFzaywKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwkJCQkgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXNrLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CiBleHRlcm4gdm9pZCBpb21tdV91bm1hcF9zaW5nbGUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJCQkgICAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CiAKIGV4dGVybiB2b2lkIGlvbW11X2luaXRfZWFybHlfcFNlcmllcyh2b2lkKTsKIGV4dGVybiB2b2lkIGlvbW11X2luaXRfZWFybHlfaVNlcmllcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCmluZGV4IGY5NjBmNTMuLjQ2NDc2ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaApAQCAtMTM1LDYgKzEzNSwxMCBAQAogCiBleHRlcm4gc3RydWN0IGlycV9tYXBfZW50cnkgaXJxX21hcFtOUl9JUlFTXTsKIAorc3RhdGljIGlubGluZSBpcnFfaHdfbnVtYmVyX3QgdmlycV90b19odyh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlyZXR1cm4gaXJxX21hcFt2aXJxXS5od2lycTsKK30KIAogLyoqCiAgKiBpcnFfYWxsb2NfaG9zdCAtIEFsbG9jYXRlIGEgbmV3IGlycV9ob3N0IGRhdGEgc3RydWN0dXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaW9tbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pb21tdS5oCmluZGV4IDBlZGJmZTEuLjZlMzIzYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pb21tdS5oCkBAIC0yMSwxMSArMjEsMTMgQEAKICAqIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKK3N0cnVjdCBwY2lfZGV2Owogc3RydWN0IGRldmljZV9ub2RlOwogc3RydWN0IGlvbW11X3RhYmxlOwogCiAvKiBDcmVhdGVzIHRhYmxlIGZvciBhbiBpbmRpdmlkdWFsIGRldmljZSBub2RlICovCi1leHRlcm4gdm9pZCBpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKK2V4dGVybiB2b2lkIGlvbW11X2Rldm5vZGVfaW5pdF9pU2VyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAogLyogR2V0IHRhYmxlIHBhcmFtZXRlcnMgZnJvbSBIViAqLwogZXh0ZXJuIHZvaWQgaW9tbXVfdGFibGVfZ2V0cGFybXNfaVNlcmllcyh1bnNpZ25lZCBsb25nIGJ1c25vLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2x2MWNhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzMzYmVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiAgUFMzIGh2Y2FsbCBpbnRlcmZhY2UuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqICBDb3B5cmlnaHQgMjAwMywgMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZiAhZGVmaW5lZChfQVNNX1BPV0VSUENfTFYxQ0FMTF9IKQorI2RlZmluZSBfQVNNX1BPV0VSUENfTFYxQ0FMTF9ICisKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBsdjEgY2FsbCBkZWNsYXJhdGlvbiBtYWNyb3MgKi8KKworI2RlZmluZSBMVjFfMV9JTl9BUkdfREVDTCB1NjQgaW5fMQorI2RlZmluZSBMVjFfMl9JTl9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgdTY0IGluXzIKKyNkZWZpbmUgTFYxXzNfSU5fQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIHU2NCBpbl8zCisjZGVmaW5lIExWMV80X0lOX0FSR19ERUNMIExWMV8zX0lOX0FSR19ERUNMLCB1NjQgaW5fNAorI2RlZmluZSBMVjFfNV9JTl9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgdTY0IGluXzUKKyNkZWZpbmUgTFYxXzZfSU5fQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIHU2NCBpbl82CisjZGVmaW5lIExWMV83X0lOX0FSR19ERUNMIExWMV82X0lOX0FSR19ERUNMLCB1NjQgaW5fNworI2RlZmluZSBMVjFfOF9JTl9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgdTY0IGluXzgKKyNkZWZpbmUgTFYxXzFfT1VUX0FSR19ERUNMIHU2NCAqb3V0XzEKKyNkZWZpbmUgTFYxXzJfT1VUX0FSR19ERUNMIExWMV8xX09VVF9BUkdfREVDTCwgdTY0ICpvdXRfMgorI2RlZmluZSBMVjFfM19PVVRfQVJHX0RFQ0wgTFYxXzJfT1VUX0FSR19ERUNMLCB1NjQgKm91dF8zCisjZGVmaW5lIExWMV80X09VVF9BUkdfREVDTCBMVjFfM19PVVRfQVJHX0RFQ0wsIHU2NCAqb3V0XzQKKyNkZWZpbmUgTFYxXzVfT1VUX0FSR19ERUNMIExWMV80X09VVF9BUkdfREVDTCwgdTY0ICpvdXRfNQorI2RlZmluZSBMVjFfNl9PVVRfQVJHX0RFQ0wgTFYxXzVfT1VUX0FSR19ERUNMLCB1NjQgKm91dF82CisjZGVmaW5lIExWMV83X09VVF9BUkdfREVDTCBMVjFfNl9PVVRfQVJHX0RFQ0wsIHU2NCAqb3V0XzcKKworI2RlZmluZSBMVjFfMF9JTl8wX09VVF9BUkdfREVDTCB2b2lkCisjZGVmaW5lIExWMV8xX0lOXzBfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzBfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMCisjZGVmaW5lIExWMV8zX0lOXzBfT1VUX0FSR19ERUNMIExWMV8zX0lOX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzBfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzBfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMCisjZGVmaW5lIExWMV82X0lOXzBfT1VUX0FSR19ERUNMIExWMV82X0lOX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzBfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fMV9PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV8xX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl8xX09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzFfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzFfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfMV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fMV9PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV8xX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl8xX09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzFfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzFfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfMV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fMV9PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV8xX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl8xX09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzFfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV84X0lOXzFfT1VUX0FSR19ERUNMIExWMV84X0lOX0FSR19ERUNMLCBMVjFfMV9PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMF9JTl8yX09VVF9BUkdfREVDTCAgICAgICAgICAgICAgICAgICAgTFYxXzJfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8xX0lOXzJfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMLCBMVjFfMl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzJfSU5fMl9PVVRfQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIExWMV8yX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl8yX09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgTFYxXzJfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzJfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMLCBMVjFfMl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzVfSU5fMl9PVVRfQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIExWMV8yX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl8yX09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgTFYxXzJfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzJfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMLCBMVjFfMl9PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMF9JTl8zX09VVF9BUkdfREVDTCAgICAgICAgICAgICAgICAgICAgTFYxXzNfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8xX0lOXzNfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMLCBMVjFfM19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzJfSU5fM19PVVRfQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIExWMV8zX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl8zX09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgTFYxXzNfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzNfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMLCBMVjFfM19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzVfSU5fM19PVVRfQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIExWMV8zX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl8zX09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgTFYxXzNfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzNfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMLCBMVjFfM19PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMF9JTl80X09VVF9BUkdfREVDTCAgICAgICAgICAgICAgICAgICAgTFYxXzRfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8xX0lOXzRfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMLCBMVjFfNF9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzJfSU5fNF9PVVRfQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIExWMV80X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl80X09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgTFYxXzRfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzRfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMLCBMVjFfNF9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzVfSU5fNF9PVVRfQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIExWMV80X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl80X09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgTFYxXzRfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzRfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMLCBMVjFfNF9PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMF9JTl81X09VVF9BUkdfREVDTCAgICAgICAgICAgICAgICAgICAgTFYxXzVfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8xX0lOXzVfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMLCBMVjFfNV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzJfSU5fNV9PVVRfQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIExWMV81X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl81X09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgTFYxXzVfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzVfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMLCBMVjFfNV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzVfSU5fNV9PVVRfQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIExWMV81X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl81X09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgTFYxXzVfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzVfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMLCBMVjFfNV9PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMF9JTl82X09VVF9BUkdfREVDTCAgICAgICAgICAgICAgICAgICAgTFYxXzZfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8xX0lOXzZfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMLCBMVjFfNl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzJfSU5fNl9PVVRfQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIExWMV82X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl82X09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgTFYxXzZfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzZfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMLCBMVjFfNl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzVfSU5fNl9PVVRfQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIExWMV82X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl82X09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgTFYxXzZfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzZfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMLCBMVjFfNl9PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMF9JTl83X09VVF9BUkdfREVDTCAgICAgICAgICAgICAgICAgICAgTFYxXzdfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8xX0lOXzdfT1VUX0FSR19ERUNMIExWMV8xX0lOX0FSR19ERUNMLCBMVjFfN19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzJfSU5fN19PVVRfQVJHX0RFQ0wgTFYxXzJfSU5fQVJHX0RFQ0wsIExWMV83X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl83X09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgTFYxXzdfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV80X0lOXzdfT1VUX0FSR19ERUNMIExWMV80X0lOX0FSR19ERUNMLCBMVjFfN19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzVfSU5fN19PVVRfQVJHX0RFQ0wgTFYxXzVfSU5fQVJHX0RFQ0wsIExWMV83X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl83X09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgTFYxXzdfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV83X0lOXzdfT1VUX0FSR19ERUNMIExWMV83X0lOX0FSR19ERUNMLCBMVjFfN19PVVRfQVJHX0RFQ0wKKworI2RlZmluZSBMVjFfMV9JTl9BUkdTIGluXzEKKyNkZWZpbmUgTFYxXzJfSU5fQVJHUyBMVjFfMV9JTl9BUkdTLCBpbl8yCisjZGVmaW5lIExWMV8zX0lOX0FSR1MgTFYxXzJfSU5fQVJHUywgaW5fMworI2RlZmluZSBMVjFfNF9JTl9BUkdTIExWMV8zX0lOX0FSR1MsIGluXzQKKyNkZWZpbmUgTFYxXzVfSU5fQVJHUyBMVjFfNF9JTl9BUkdTLCBpbl81CisjZGVmaW5lIExWMV82X0lOX0FSR1MgTFYxXzVfSU5fQVJHUywgaW5fNgorI2RlZmluZSBMVjFfN19JTl9BUkdTIExWMV82X0lOX0FSR1MsIGluXzcKKyNkZWZpbmUgTFYxXzhfSU5fQVJHUyBMVjFfN19JTl9BUkdTLCBpbl84CisKKyNkZWZpbmUgTFYxXzFfT1VUX0FSR1Mgb3V0XzEKKyNkZWZpbmUgTFYxXzJfT1VUX0FSR1MgTFYxXzFfT1VUX0FSR1MsIG91dF8yCisjZGVmaW5lIExWMV8zX09VVF9BUkdTIExWMV8yX09VVF9BUkdTLCBvdXRfMworI2RlZmluZSBMVjFfNF9PVVRfQVJHUyBMVjFfM19PVVRfQVJHUywgb3V0XzQKKyNkZWZpbmUgTFYxXzVfT1VUX0FSR1MgTFYxXzRfT1VUX0FSR1MsIG91dF81CisjZGVmaW5lIExWMV82X09VVF9BUkdTIExWMV81X09VVF9BUkdTLCBvdXRfNgorI2RlZmluZSBMVjFfN19PVVRfQVJHUyBMVjFfNl9PVVRfQVJHUywgb3V0XzcKKworI2RlZmluZSBMVjFfMF9JTl8wX09VVF9BUkdTCisjZGVmaW5lIExWMV8xX0lOXzBfT1VUX0FSR1MgTFYxXzFfSU5fQVJHUworI2RlZmluZSBMVjFfMl9JTl8wX09VVF9BUkdTIExWMV8yX0lOX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fMF9PVVRfQVJHUyBMVjFfM19JTl9BUkdTCisjZGVmaW5lIExWMV80X0lOXzBfT1VUX0FSR1MgTFYxXzRfSU5fQVJHUworI2RlZmluZSBMVjFfNV9JTl8wX09VVF9BUkdTIExWMV81X0lOX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fMF9PVVRfQVJHUyBMVjFfNl9JTl9BUkdTCisjZGVmaW5lIExWMV83X0lOXzBfT1VUX0FSR1MgTFYxXzdfSU5fQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzFfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzFfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fMV9PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfMV9PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl8xX09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV8xX09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzFfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzFfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fMV9PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfMV9PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl8xX09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV8xX09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzFfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzFfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fMV9PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfMV9PVVRfQVJHUworI2RlZmluZSBMVjFfOF9JTl8xX09VVF9BUkdTIExWMV84X0lOX0FSR1MsIExWMV8xX09VVF9BUkdTCisKKyNkZWZpbmUgTFYxXzBfSU5fMl9PVVRfQVJHUyAgICAgICAgICAgICAgICBMVjFfMl9PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl8yX09VVF9BUkdTIExWMV8xX0lOX0FSR1MsIExWMV8yX09VVF9BUkdTCisjZGVmaW5lIExWMV8yX0lOXzJfT1VUX0FSR1MgTFYxXzJfSU5fQVJHUywgTFYxXzJfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fMl9PVVRfQVJHUyBMVjFfM19JTl9BUkdTLCBMVjFfMl9PVVRfQVJHUworI2RlZmluZSBMVjFfNF9JTl8yX09VVF9BUkdTIExWMV80X0lOX0FSR1MsIExWMV8yX09VVF9BUkdTCisjZGVmaW5lIExWMV81X0lOXzJfT1VUX0FSR1MgTFYxXzVfSU5fQVJHUywgTFYxXzJfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fMl9PVVRfQVJHUyBMVjFfNl9JTl9BUkdTLCBMVjFfMl9PVVRfQVJHUworI2RlZmluZSBMVjFfN19JTl8yX09VVF9BUkdTIExWMV83X0lOX0FSR1MsIExWMV8yX09VVF9BUkdTCisKKyNkZWZpbmUgTFYxXzBfSU5fM19PVVRfQVJHUyAgICAgICAgICAgICAgICBMVjFfM19PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl8zX09VVF9BUkdTIExWMV8xX0lOX0FSR1MsIExWMV8zX09VVF9BUkdTCisjZGVmaW5lIExWMV8yX0lOXzNfT1VUX0FSR1MgTFYxXzJfSU5fQVJHUywgTFYxXzNfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fM19PVVRfQVJHUyBMVjFfM19JTl9BUkdTLCBMVjFfM19PVVRfQVJHUworI2RlZmluZSBMVjFfNF9JTl8zX09VVF9BUkdTIExWMV80X0lOX0FSR1MsIExWMV8zX09VVF9BUkdTCisjZGVmaW5lIExWMV81X0lOXzNfT1VUX0FSR1MgTFYxXzVfSU5fQVJHUywgTFYxXzNfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fM19PVVRfQVJHUyBMVjFfNl9JTl9BUkdTLCBMVjFfM19PVVRfQVJHUworI2RlZmluZSBMVjFfN19JTl8zX09VVF9BUkdTIExWMV83X0lOX0FSR1MsIExWMV8zX09VVF9BUkdTCisKKyNkZWZpbmUgTFYxXzBfSU5fNF9PVVRfQVJHUyAgICAgICAgICAgICAgICBMVjFfNF9PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl80X09VVF9BUkdTIExWMV8xX0lOX0FSR1MsIExWMV80X09VVF9BUkdTCisjZGVmaW5lIExWMV8yX0lOXzRfT1VUX0FSR1MgTFYxXzJfSU5fQVJHUywgTFYxXzRfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fNF9PVVRfQVJHUyBMVjFfM19JTl9BUkdTLCBMVjFfNF9PVVRfQVJHUworI2RlZmluZSBMVjFfNF9JTl80X09VVF9BUkdTIExWMV80X0lOX0FSR1MsIExWMV80X09VVF9BUkdTCisjZGVmaW5lIExWMV81X0lOXzRfT1VUX0FSR1MgTFYxXzVfSU5fQVJHUywgTFYxXzRfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fNF9PVVRfQVJHUyBMVjFfNl9JTl9BUkdTLCBMVjFfNF9PVVRfQVJHUworI2RlZmluZSBMVjFfN19JTl80X09VVF9BUkdTIExWMV83X0lOX0FSR1MsIExWMV80X09VVF9BUkdTCisKKyNkZWZpbmUgTFYxXzBfSU5fNV9PVVRfQVJHUyAgICAgICAgICAgICAgICBMVjFfNV9PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl81X09VVF9BUkdTIExWMV8xX0lOX0FSR1MsIExWMV81X09VVF9BUkdTCisjZGVmaW5lIExWMV8yX0lOXzVfT1VUX0FSR1MgTFYxXzJfSU5fQVJHUywgTFYxXzVfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fNV9PVVRfQVJHUyBMVjFfM19JTl9BUkdTLCBMVjFfNV9PVVRfQVJHUworI2RlZmluZSBMVjFfNF9JTl81X09VVF9BUkdTIExWMV80X0lOX0FSR1MsIExWMV81X09VVF9BUkdTCisjZGVmaW5lIExWMV81X0lOXzVfT1VUX0FSR1MgTFYxXzVfSU5fQVJHUywgTFYxXzVfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fNV9PVVRfQVJHUyBMVjFfNl9JTl9BUkdTLCBMVjFfNV9PVVRfQVJHUworI2RlZmluZSBMVjFfN19JTl81X09VVF9BUkdTIExWMV83X0lOX0FSR1MsIExWMV81X09VVF9BUkdTCisKKyNkZWZpbmUgTFYxXzBfSU5fNl9PVVRfQVJHUyAgICAgICAgICAgICAgICBMVjFfNl9PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl82X09VVF9BUkdTIExWMV8xX0lOX0FSR1MsIExWMV82X09VVF9BUkdTCisjZGVmaW5lIExWMV8yX0lOXzZfT1VUX0FSR1MgTFYxXzJfSU5fQVJHUywgTFYxXzZfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fNl9PVVRfQVJHUyBMVjFfM19JTl9BUkdTLCBMVjFfNl9PVVRfQVJHUworI2RlZmluZSBMVjFfNF9JTl82X09VVF9BUkdTIExWMV80X0lOX0FSR1MsIExWMV82X09VVF9BUkdTCisjZGVmaW5lIExWMV81X0lOXzZfT1VUX0FSR1MgTFYxXzVfSU5fQVJHUywgTFYxXzZfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fNl9PVVRfQVJHUyBMVjFfNl9JTl9BUkdTLCBMVjFfNl9PVVRfQVJHUworI2RlZmluZSBMVjFfN19JTl82X09VVF9BUkdTIExWMV83X0lOX0FSR1MsIExWMV82X09VVF9BUkdTCisKKyNkZWZpbmUgTFYxXzBfSU5fN19PVVRfQVJHUyAgICAgICAgICAgICAgICBMVjFfN19PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl83X09VVF9BUkdTIExWMV8xX0lOX0FSR1MsIExWMV83X09VVF9BUkdTCisjZGVmaW5lIExWMV8yX0lOXzdfT1VUX0FSR1MgTFYxXzJfSU5fQVJHUywgTFYxXzdfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzNfSU5fN19PVVRfQVJHUyBMVjFfM19JTl9BUkdTLCBMVjFfN19PVVRfQVJHUworI2RlZmluZSBMVjFfNF9JTl83X09VVF9BUkdTIExWMV80X0lOX0FSR1MsIExWMV83X09VVF9BUkdTCisjZGVmaW5lIExWMV81X0lOXzdfT1VUX0FSR1MgTFYxXzVfSU5fQVJHUywgTFYxXzdfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzZfSU5fN19PVVRfQVJHUyBMVjFfNl9JTl9BUkdTLCBMVjFfN19PVVRfQVJHUworI2RlZmluZSBMVjFfN19JTl83X09VVF9BUkdTIExWMV83X0lOX0FSR1MsIExWMV83X09VVF9BUkdTCisKKy8qCisgKiBUaGlzIExWMV9DQUxMKCkgbWFjcm8gaXMgZm9yIHVzZSBieSBjYWxsZXJzLiAgSXQgZXhwYW5kcyBpbnRvIGFuCisgKiBpbmxpbmUgY2FsbCB3cmFwcGVyIGFuZCBhbiB1bmRlcnNjb3JlZCBIViBjYWxsIGRlY2xhcmF0aW9uLiAgVGhlCisgKiB3cmFwcGVyIGNhbiBiZSB1c2VkIHRvIGluc3RydW1lbnQgdGhlIGx2MSBjYWxsIGludGVyZmFjZS4gIFRoZQorICogZmlsZSBsdjFjYWxsLlMgZGVmaW5lcyBpdHMgb3duIExWMV9DQUxMKCkgbWFjcm8gdG8gZXhwYW5kIGludG8KKyAqIHRoZSBhY3R1YWwgdW5kZXJzY29yZWQgY2FsbCBkZWZpbml0aW9uLgorICovCisKKyNpZiAhZGVmaW5lZChMVjFfQ0FMTCkKKyNkZWZpbmUgTFYxX0NBTEwobmFtZSwgaW4sIG91dCwgbnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4dGVybiBzNjQgX2x2MV8jI25hbWUoTFYxXyMjaW4jI19JTl8jI291dCMjX09VVF9BUkdfREVDTCk7ICAgICAgXAorICBzdGF0aWMgaW5saW5lIGludCBsdjFfIyNuYW1lKExWMV8jI2luIyNfSU5fIyNvdXQjI19PVVRfQVJHX0RFQ0wpIFwKKyAgICB7cmV0dXJuIF9sdjFfIyNuYW1lKExWMV8jI2luIyNfSU5fIyNvdXQjI19PVVRfQVJHUyk7fQorI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChfX0FTU0VNQkxZX18pICovCisKKy8qIGx2MSBjYWxsIHRhYmxlICovCisKK0xWMV9DQUxMKGFsbG9jYXRlX21lbW9yeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMiwgICAwICkKK0xWMV9DQUxMKHdyaXRlX2h0YWJfZW50cnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgICAxICkKK0xWMV9DQUxMKGNvbnN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UsICAgICAgICAgICAgICAgMywgMiwgICAyICkKK0xWMV9DQUxMKGludmFsaWRhdGVfaHRhYl9lbnRyaWVzLCAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgICAzICkKK0xWMV9DQUxMKGdldF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2VfaWRfb2ZfcHBlLCAgICAgICAgICAgMSwgMSwgICA0ICkKK0xWMV9DQUxMKHF1ZXJ5X2xvZ2ljYWxfcGFydGl0aW9uX2FkZHJlc3NfcmVnaW9uX2luZm8sICAgMSwgNSwgICA2ICkKK0xWMV9DQUxMKHNlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UsICAgICAgICAgICAgICAgICAgMSwgMCwgICA3ICkKK0xWMV9DQUxMKHBhdXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgICA5ICkKK0xWMV9DQUxMKGRlc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSwgICAgICAgICAgICAgICAgMSwgMCwgIDEwICkKK0xWMV9DQUxMKGNvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwLCAgICAgICAgICAgICAgICAgICAgMywgMCwgIDExICkKK0xWMV9DQUxMKGNvbm5lY3RfaXJxX3BsdWdfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgIDEyICkKK0xWMV9DQUxMKHJlbGVhc2VfbWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDEzICkKK0xWMV9DQUxMKGRpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgIDE3ICkKK0xWMV9DQUxMKGNvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgICAgICAgICAgICAgMCwgMSwgIDE4ICkKK0xWMV9DQUxMKGRlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgICAgICAgICAgICAgMSwgMCwgIDE5ICkKK0xWMV9DQUxMKHNlbmRfZXZlbnRfbG9jYWxseSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDI0ICkKK0xWMV9DQUxMKGVuZF9vZl9pbnRlcnJ1cHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDI3ICkKK0xWMV9DQUxMKGNvbm5lY3RfaXJxX3BsdWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgIDI4ICkKK0xWMV9DQUxMKGRpc2Nvbm5lY3RfaXJxX3BsdWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDI5ICkKK0xWMV9DQUxMKGVuZF9vZl9pbnRlcnJ1cHRfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgIDMwICkKK0xWMV9DQUxMKGRpZF91cGRhdGVfaW50ZXJydXB0X21hc2ssICAgICAgICAgICAgICAgICAgICAgMiwgMCwgIDMxICkKK0xWMV9DQUxMKHNodXRkb3duX2xvZ2ljYWxfcGFydGl0aW9uLCAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDQ0ICkKK0xWMV9DQUxMKGRlc3RydWN0X2xvZ2ljYWxfc3BlLCAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDU0ICkKK0xWMV9DQUxMKGNvbnN0cnVjdF9sb2dpY2FsX3NwZSwgICAgICAgICAgICAgICAgICAgICAgICAgNywgNiwgIDU3ICkKK0xWMV9DQUxMKHNldF9zcGVfaW50ZXJydXB0X21hc2ssICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgIDYxICkKK0xWMV9DQUxMKHNldF9zcGVfdHJhbnNpdGlvbl9ub3RpZmllciwgICAgICAgICAgICAgICAgICAgMywgMCwgIDY0ICkKK0xWMV9DQUxMKGRpc2FibGVfbG9naWNhbF9zcGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgIDY1ICkKK0xWMV9DQUxMKGNsZWFyX3NwZV9pbnRlcnJ1cHRfc3RhdHVzLCAgICAgICAgICAgICAgICAgICAgNCwgMCwgIDY2ICkKK0xWMV9DQUxMKGdldF9zcGVfaW50ZXJydXB0X3N0YXR1cywgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgIDY3ICkKK0xWMV9DQUxMKGdldF9sb2dpY2FsX3BwZV9pZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgIDY5ICkKK0xWMV9DQUxMKHNldF9pbnRlcnJ1cHRfbWFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgIDczICkKK0xWMV9DQUxMKGdldF9sb2dpY2FsX3BhcnRpdGlvbl9pZCwgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgIDc0ICkKK0xWMV9DQUxMKGNvbmZpZ3VyZV9leGVjdXRpb25fdGltZV92YXJpYWJsZSwgICAgICAgICAgICAgMSwgMCwgIDc3ICkKK0xWMV9DQUxMKGdldF9zcGVfaXJxX291dGxldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgIDc4ICkKK0xWMV9DQUxMKHNldF9zcGVfcHJpdmlsZWdlX3N0YXRlX2FyZWFfMV9yZWdpc3RlciwgICAgICAgMywgMCwgIDc5ICkKK0xWMV9DQUxMKGNyZWF0ZV9yZXBvc2l0b3J5X25vZGUsICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgIDkwICkKK0xWMV9DQUxMKGdldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUsICAgICAgICAgICAgICAgICAgICAgNSwgMiwgIDkxICkKK0xWMV9DQUxMKG1vZGlmeV9yZXBvc2l0b3J5X25vZGVfdmFsdWUsICAgICAgICAgICAgICAgICAgNiwgMCwgIDkyICkKK0xWMV9DQUxMKHJlbW92ZV9yZXBvc2l0b3J5X25vZGUsICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgIDkzICkKK0xWMV9DQUxMKHJlYWRfaHRhYl9lbnRyaWVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgNSwgIDk1ICkKK0xWMV9DQUxMKHNldF9kYWJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgIDk2ICkKK0xWMV9DQUxMKGdldF90b3RhbF9leGVjdXRpb25fdGltZSwgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTAzICkKK0xWMV9DQUxMKGNvbnN0cnVjdF9pb19pcnFfb3V0bGV0LCAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTIwICkKK0xWMV9DQUxMKGRlc3RydWN0X2lvX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTIxICkKK0xWMV9DQUxMKG1hcF9odGFiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTIyICkKK0xWMV9DQUxMKHVubWFwX2h0YWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTIzICkKK0xWMV9DQUxMKGdldF92ZXJzaW9uX2luZm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMTI3ICkKK0xWMV9DQUxMKGluc2VydF9odGFiX2VudHJ5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMywgMTU4ICkKK0xWMV9DQUxMKHJlYWRfdmlydHVhbF91YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTYyICkKK0xWMV9DQUxMKHdyaXRlX3ZpcnR1YWxfdWFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTYzICkKK0xWMV9DQUxMKHNldF92aXJ0dWFsX3VhcnRfcGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTY0ICkKK0xWMV9DQUxMKGdldF92aXJ0dWFsX3VhcnRfcGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTY1ICkKK0xWMV9DQUxMKGNvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxLCAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTY2ICkKK0xWMV9DQUxMKG9wZW5fZGV2aWNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTcwICkKK0xWMV9DQUxMKGNsb3NlX2RldmljZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgMTcxICkKK0xWMV9DQUxMKG1hcF9kZXZpY2VfbW1pb19yZWdpb24sICAgICAgICAgICAgICAgICAgICAgICAgNSwgMSwgMTcyICkKK0xWMV9DQUxMKHVubWFwX2RldmljZV9tbWlvX3JlZ2lvbiwgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTczICkKK0xWMV9DQUxMKGFsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uLCAgICAgICAgICAgICAgICAgICAgNSwgMSwgMTc0ICkKK0xWMV9DQUxMKGZyZWVfZGV2aWNlX2RtYV9yZWdpb24sICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTc1ICkKK0xWMV9DQUxMKG1hcF9kZXZpY2VfZG1hX3JlZ2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgMTc2ICkKK0xWMV9DQUxMKHVubWFwX2RldmljZV9kbWFfcmVnaW9uLCAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMTc3ICkKK0xWMV9DQUxMKG5ldF9hZGRfbXVsdGljYXN0X2FkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMTg1ICkKK0xWMV9DQUxMKG5ldF9yZW1vdmVfbXVsdGljYXN0X2FkZHJlc3MsICAgICAgICAgICAgICAgICAgNCwgMCwgMTg2ICkKK0xWMV9DQUxMKG5ldF9zdGFydF90eF9kbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMTg3ICkKK0xWMV9DQUxMKG5ldF9zdG9wX3R4X2RtYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTg4ICkKK0xWMV9DQUxMKG5ldF9zdGFydF9yeF9kbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMTg5ICkKK0xWMV9DQUxMKG5ldF9zdG9wX3J4X2RtYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTkwICkKK0xWMV9DQUxMKG5ldF9zZXRfaW50ZXJydXB0X3N0YXR1c19pbmRpY2F0b3IsICAgICAgICAgICAgNCwgMCwgMTkxICkKK0xWMV9DQUxMKG5ldF9zZXRfaW50ZXJydXB0X21hc2ssICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMTkzICkKK0xWMV9DQUxMKG5ldF9jb250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMiwgMTk0ICkKK0xWMV9DQUxMKGNvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgICAgNCwgMCwgMTk3ICkKK0xWMV9DQUxMKGRpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgNCwgMCwgMTk4ICkKK0xWMV9DQUxMKGdldF9zcGVfYWxsX2ludGVycnVwdF9zdGF0dXNlcywgICAgICAgICAgICAgICAgMSwgMSwgMTk5ICkKK0xWMV9DQUxMKGRlY29uZmlndXJlX3ZpcnR1YWxfdWFydF9pcnEsICAgICAgICAgICAgICAgICAgMCwgMCwgMjAyICkKK0xWMV9DQUxMKGVuYWJsZV9sb2dpY2FsX3NwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgMjA3ICkKK0xWMV9DQUxMKGdwdV9vcGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMjEwICkKK0xWMV9DQUxMKGdwdV9jbG9zZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMjExICkKK0xWMV9DQUxMKGdwdV9kZXZpY2VfbWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMjEyICkKK0xWMV9DQUxMKGdwdV9kZXZpY2VfdW5tYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMjEzICkKK0xWMV9DQUxMKGdwdV9tZW1vcnlfYWxsb2NhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMiwgMjE0ICkKK0xWMV9DQUxMKGdwdV9tZW1vcnlfZnJlZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMjE2ICkKK0xWMV9DQUxMKGdwdV9jb250ZXh0X2FsbG9jYXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgNSwgMjE3ICkKK0xWMV9DQUxMKGdwdV9jb250ZXh0X2ZyZWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMjE4ICkKK0xWMV9DQUxMKGdwdV9jb250ZXh0X2lvbWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMjIxICkKK0xWMV9DQUxMKGdwdV9jb250ZXh0X2F0dHJpYnV0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgMjI1ICkKK0xWMV9DQUxMKGdwdV9jb250ZXh0X2ludHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMjI3ICkKK0xWMV9DQUxMKGdwdV9hdHRyaWJ1dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMjI4ICkKK0xWMV9DQUxMKGdldF9ydGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgMjMyICkKK0xWMV9DQUxMKHNldF9wcGVfcGVyaW9kaWNfdHJhY2VyX2ZyZXF1ZW5jeSwgICAgICAgICAgICAgMSwgMCwgMjQwICkKK0xWMV9DQUxMKHN0YXJ0X3BwZV9wZXJpb2RpY190cmFjZXIsICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMjQxICkKK0xWMV9DQUxMKHN0b3BfcHBlX3BlcmlvZGljX3RyYWNlciwgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMjQyICkKK0xWMV9DQUxMKHN0b3JhZ2VfcmVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMSwgMjQ1ICkKK0xWMV9DQUxMKHN0b3JhZ2Vfd3JpdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMSwgMjQ2ICkKK0xWMV9DQUxMKHN0b3JhZ2Vfc2VuZF9kZXZpY2VfY29tbWFuZCwgICAgICAgICAgICAgICAgICAgNiwgMSwgMjQ4ICkKK0xWMV9DQUxMKHN0b3JhZ2VfZ2V0X2FzeW5jX3N0YXR1cywgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMjQ5ICkKK0xWMV9DQUxMKHN0b3JhZ2VfY2hlY2tfYXN5bmNfc3RhdHVzLCAgICAgICAgICAgICAgICAgICAgMiwgMSwgMjU0ICkKK0xWMV9DQUxMKHBhbmljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMjU1ICkKK0xWMV9DQUxMKGNvbnN0cnVjdF9scG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMywgMTQwICkKK0xWMV9DQUxMKGRlc3RydWN0X2xwbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTQxICkKK0xWMV9DQUxMKHN0YXJ0X2xwbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTQyICkKK0xWMV9DQUxMKHN0b3BfbHBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTQzICkKK0xWMV9DQUxMKGNvcHlfbHBtX3RyYWNlX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTQ0ICkKK0xWMV9DQUxMKGFkZF9scG1fZXZlbnRfYm9va21hcmssICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMTQ1ICkKK0xWMV9DQUxMKGRlbGV0ZV9scG1fZXZlbnRfYm9va21hcmssICAgICAgICAgICAgICAgICAgICAgMywgMCwgMTQ2ICkKK0xWMV9DQUxMKHNldF9scG1faW50ZXJydXB0X21hc2ssICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTQ3ICkKK0xWMV9DQUxMKGdldF9scG1faW50ZXJydXB0X3N0YXR1cywgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTQ4ICkKK0xWMV9DQUxMKHNldF9scG1fZ2VuZXJhbF9jb250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgNSwgMiwgMTQ5ICkKK0xWMV9DQUxMKHNldF9scG1faW50ZXJ2YWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTUwICkKK0xWMV9DQUxMKHNldF9scG1fdHJpZ2dlcl9jb250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTUxICkKK0xWMV9DQUxMKHNldF9scG1fY291bnRlcl9jb250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgNCwgMSwgMTUyICkKK0xWMV9DQUxMKHNldF9scG1fZ3JvdXBfY29udHJvbCwgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTUzICkKK0xWMV9DQUxMKHNldF9scG1fZGVidWdfYnVzX2NvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTU0ICkKK0xWMV9DQUxMKHNldF9scG1fY291bnRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMiwgMTU1ICkKK0xWMV9DQUxMKHNldF9scG1fc2lnbmFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgMCwgMTU2ICkKK0xWMV9DQUxMKHNldF9scG1fc3ByX3RyaWdnZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgMTU3ICkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCmluZGV4IGRhYzkwZGMzLi4xYjA0ZTU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaApAQCAtMjYsNiArMjYsNyBAQAogc3RydWN0IGlvbW11X3RhYmxlOwogc3RydWN0IHJ0Y190aW1lOwogc3RydWN0IGZpbGU7CitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CiAjaWZkZWYgQ09ORklHX0tFWEVDCiBzdHJ1Y3Qga2ltYWdlOwogI2VuZGlmCkBAIC04NCw5ICs4NSwxMiBAQAogCXVuc2lnbmVkIGxvbmcJKCp0Y2VfZ2V0KShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKIAkJCQkgICAgbG9uZyBpbmRleCk7CiAJdm9pZAkJKCp0Y2VfZmx1c2gpKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsKTsKLQl2b2lkCQkoKmlvbW11X2Rldl9zZXR1cCkoc3RydWN0IHBjaV9kZXYgKmRldik7Ci0Jdm9pZAkJKCppb21tdV9idXNfc2V0dXApKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCXZvaWQJCSgqaXJxX2J1c19zZXR1cCkoc3RydWN0IHBjaV9idXMgKmJ1cyk7CisJdm9pZAkJKCpwY2lfZG1hX2Rldl9zZXR1cCkoc3RydWN0IHBjaV9kZXYgKmRldik7CisJdm9pZAkJKCpwY2lfZG1hX2J1c19zZXR1cCkoc3RydWN0IHBjaV9idXMgKmJ1cyk7CisKKwl2b2lkIF9faW9tZW0gKgkoKmlvcmVtYXApKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwl2b2lkCQkoKmlvdW5tYXApKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG9rZW4pOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAJaW50CQkoKnByb2JlKSh2b2lkKTsKQEAgLTEwNiw2ICsxMTAsMTAgQEAKIAkvKiBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgdGhlIGJ1cywgYmVmb3JlIGFsbG9jYXRpbmcgcmVzb3VyY2VzICovCiAJdm9pZAkJKCpwY2liaW9zX2ZpeHVwKSh2b2lkKTsKIAlpbnQJCSgqcGNpX3Byb2JlX21vZGUpKHN0cnVjdCBwY2lfYnVzICopOworCXZvaWQJCSgqcGNpX2lycV9maXh1cCkoc3RydWN0IHBjaV9kZXYgKmRldik7CisKKwkvKiBUbyBzZXR1cCBQSEJzIHdoZW4gdXNpbmcgYXV0b21hdGljIE9GIHBsYXRmb3JtIGRyaXZlciBmb3IgUENJICovCisJaW50CQkoKnBjaV9zZXR1cF9waGIpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zdCk7CiAKIAl2b2lkCQkoKnJlc3RhcnQpKGNoYXIgKmNtZCk7CiAJdm9pZAkJKCpwb3dlcl9vZmYpKHZvaWQpOwpAQCAtMTk5LDEwICsyMDcsNiBAQAogCSAqIFJldHVybnMgMCB0byBhbGxvdyBhc3NpZ25tZW50L2VuYWJsaW5nIG9mIHRoZSBkZXZpY2UuICovCiAJaW50ICAoKnBjaWJpb3NfZW5hYmxlX2RldmljZV9ob29rKShzdHJ1Y3QgcGNpX2RldiAqLCBpbnQgaW5pdGlhbCk7CiAKLQkvKiBGb3IgaW50ZXJydXB0IHJvdXRpbmcgKi8KLQl1bnNpZ25lZCBjaGFyICgqcGNpX3N3aXp6bGUpKHN0cnVjdCBwY2lfZGV2ICosIHVuc2lnbmVkIGNoYXIgKik7Ci0JaW50ICgqcGNpX21hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOwotCiAJLyogQ2FsbGVkIGluIGluZGlyZWN0XyogdG8gYXZvaWQgdG91Y2hpbmcgZGV2aWNlcyAqLwogCWludCAoKnBjaV9leGNsdWRlX2RldmljZSkodW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCmluZGV4IGMzZmM3YTIuLjQxYzhjOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaApAQCAtMjQ4LDIxICsyNDgsNiBAQAogZXh0ZXJuIHZvaWQgaHB0ZV9pbml0X2xwYXIodm9pZCk7CiBleHRlcm4gdm9pZCBocHRlX2luaXRfaVNlcmllcyh2b2lkKTsKIAotZXh0ZXJuIGxvbmcgcFNlcmllc19scGFyX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmEsIHVuc2lnbmVkIGxvbmcgcHJwbiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmZsYWdzLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSk7Ci0KLWV4dGVybiBsb25nIG5hdGl2ZV9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YSwgdW5zaWduZWQgbG9uZyBwcnBuLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmZsYWdzLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpOwotCi1leHRlcm4gbG9uZyBpU2VyaWVzX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwKLQkJCQl1bnNpZ25lZCBsb25nIHZhLCB1bnNpZ25lZCBsb25nIHBycG4sCi0JCQkJdW5zaWduZWQgbG9uZyByZmxhZ3MsCi0JCQkJdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSk7Ci0KIGV4dGVybiB2b2lkIHN0YWJzX2FsbG9jKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2xiX2luaXRpYWxpemUodm9pZCk7CiBleHRlcm4gdm9pZCBzbGJfZmx1c2hfYW5kX3JlYm9sdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjNTJ4eC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM1Mnh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyOGE4NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjNTJ4eC5oCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogUHJvdG90eXBlcywgZXRjLiBmb3IgdGhlIEZyZWVzY2FsZSBNUEM1Mnh4IGVtYmVkZGVkIGNwdSBjaGlwcworICogTWF5IG5lZWQgdG8gYmUgY2xlYW5lZCBhcyB0aGUgcG9ydCBnb2VzIG9uIC4uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfX0FTTV9QT1dFUlBDX01QQzUyeHhfSF9fCisjZGVmaW5lIF9fQVNNX1BPV0VSUENfTVBDNTJ4eF9IX18KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogU3RydWN0dXJlcyBtYXBwaW5nIG9mIHNvbWUgdW5pdCByZWdpc3RlciBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogTWVtb3J5IE1hcHBpbmcgQ29udHJvbCAqLworc3RydWN0IG1wYzUyeHhfbW1hcF9jdGwgeworCXUzMiBtYmFyOwkJLyogTU1BUF9DVFJMICsgMHgwMCAqLworCisJdTMyIGNzMF9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4MDQgKi8KKwl1MzIgY3MwX3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDA4ICovCisJdTMyIGNzMV9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4MGMgKi8KKwl1MzIgY3MxX3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDEwICovCisJdTMyIGNzMl9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4MTQgKi8KKwl1MzIgY3MyX3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDE4ICovCisJdTMyIGNzM19zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4MWMgKi8KKwl1MzIgY3MzX3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDIwICovCisJdTMyIGNzNF9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4MjQgKi8KKwl1MzIgY3M0X3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDI4ICovCisJdTMyIGNzNV9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4MmMgKi8KKwl1MzIgY3M1X3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDMwICovCisKKwl1MzIgc2RyYW0wOwkJLyogTU1BUF9DVFJMICsgMHgzNCAqLworCXUzMiBzZHJhbTE7CQkvKiBNTUFQX0NUUkwgKyAwWDM4ICovCisKKwl1MzIgcmVzZXJ2ZWRbNF07CS8qIE1NQVBfQ1RSTCArIDB4M2MgLi4gMHg0OCAqLworCisJdTMyIGJvb3Rfc3RhcnQ7CQkvKiBNTUFQX0NUUkwgKyAweDRjICovCisJdTMyIGJvb3Rfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4NTAgKi8KKworCXUzMiBpcGJpX3dzX2N0cmw7CS8qIE1NQVBfQ1RSTCArIDB4NTQgKi8KKworCXUzMiBjczZfc3RhcnQ7CQkvKiBNTUFQX0NUUkwgKyAweDU4ICovCisJdTMyIGNzNl9zdG9wOwkJLyogTU1BUF9DVFJMICsgMHg1YyAqLworCXUzMiBjczdfc3RhcnQ7CQkvKiBNTUFQX0NUUkwgKyAweDYwICovCisJdTMyIGNzN19zdG9wOwkJLyogTU1BUF9DVFJMICsgMHg2NCAqLworfTsKKworLyogU0RSQU0gY29udHJvbCAqLworc3RydWN0IG1wYzUyeHhfc2RyYW0geworCXUzMiBtb2RlOwkJLyogU0RSQU0gKyAweDAwICovCisJdTMyIGN0cmw7CQkvKiBTRFJBTSArIDB4MDQgKi8KKwl1MzIgY29uZmlnMTsJCS8qIFNEUkFNICsgMHgwOCAqLworCXUzMiBjb25maWcyOwkJLyogU0RSQU0gKyAweDBjICovCit9OworCisvKiBTRE1BICovCitzdHJ1Y3QgbXBjNTJ4eF9zZG1hIHsKKwl1MzIgdGFza0JhcjsJCS8qIFNETUEgKyAweDAwICovCisJdTMyIGN1cnJlbnRQb2ludGVyOwkvKiBTRE1BICsgMHgwNCAqLworCXUzMiBlbmRQb2ludGVyOwkJLyogU0RNQSArIDB4MDggKi8KKwl1MzIgdmFyaWFibGVQb2ludGVyOwkvKiBTRE1BICsgMHgwYyAqLworCisJdTggSW50VmVjdDE7CQkvKiBTRE1BICsgMHgxMCAqLworCXU4IEludFZlY3QyOwkJLyogU0RNQSArIDB4MTEgKi8KKwl1MTYgUHRkQ250cmw7CQkvKiBTRE1BICsgMHgxMiAqLworCisJdTMyIEludFBlbmQ7CQkvKiBTRE1BICsgMHgxNCAqLworCXUzMiBJbnRNYXNrOwkJLyogU0RNQSArIDB4MTggKi8KKworCXUxNiB0Y3JbMTZdOwkJLyogU0RNQSArIDB4MWMgLi4gMHgzYSAqLworCisJdTggaXByWzMyXTsJCS8qIFNETUEgKyAweDNjIC4uIDB4NWIgKi8KKworCXUzMiBjUmVxU2VsZWN0OwkJLyogU0RNQSArIDB4NWMgKi8KKwl1MzIgdGFza19zaXplMDsJCS8qIFNETUEgKyAweDYwICovCisJdTMyIHRhc2tfc2l6ZTE7CQkvKiBTRE1BICsgMHg2NCAqLworCXUzMiBNREVEZWJ1ZzsJCS8qIFNETUEgKyAweDY4ICovCisJdTMyIEFEU0RlYnVnOwkJLyogU0RNQSArIDB4NmMgKi8KKwl1MzIgVmFsdWUxOwkJLyogU0RNQSArIDB4NzAgKi8KKwl1MzIgVmFsdWUyOwkJLyogU0RNQSArIDB4NzQgKi8KKwl1MzIgQ29udHJvbDsJCS8qIFNETUEgKyAweDc4ICovCisJdTMyIFN0YXR1czsJCS8qIFNETUEgKyAweDdjICovCisJdTMyIFBURERlYnVnOwkJLyogU0RNQSArIDB4ODAgKi8KK307CisKKy8qIEdQVCAqLworc3RydWN0IG1wYzUyeHhfZ3B0IHsKKwl1MzIgbW9kZTsJCS8qIEdQVHggKyAweDAwICovCisJdTMyIGNvdW50OwkJLyogR1BUeCArIDB4MDQgKi8KKwl1MzIgcHdtOwkJLyogR1BUeCArIDB4MDggKi8KKwl1MzIgc3RhdHVzOwkJLyogR1BUeCArIDBYMGMgKi8KK307CisKKy8qIEdQSU8gKi8KK3N0cnVjdCBtcGM1Mnh4X2dwaW8geworCXUzMiBwb3J0X2NvbmZpZzsJLyogR1BJTyArIDB4MDAgKi8KKwl1MzIgc2ltcGxlX2dwaW9lOwkvKiBHUElPICsgMHgwNCAqLworCXUzMiBzaW1wbGVfb2RlOwkJLyogR1BJTyArIDB4MDggKi8KKwl1MzIgc2ltcGxlX2RkcjsJCS8qIEdQSU8gKyAweDBjICovCisJdTMyIHNpbXBsZV9kdm87CQkvKiBHUElPICsgMHgxMCAqLworCXUzMiBzaW1wbGVfaXZhbDsJLyogR1BJTyArIDB4MTQgKi8KKwl1OCBvdXRvX2dwaW9lOwkJLyogR1BJTyArIDB4MTggKi8KKwl1OCByZXNlcnZlZDFbM107CS8qIEdQSU8gKyAweDE5ICovCisJdTggb3V0b19kdm87CQkvKiBHUElPICsgMHgxYyAqLworCXU4IHJlc2VydmVkMlszXTsJLyogR1BJTyArIDB4MWQgKi8KKwl1OCBzaW50X2dwaW9lOwkJLyogR1BJTyArIDB4MjAgKi8KKwl1OCByZXNlcnZlZDNbM107CS8qIEdQSU8gKyAweDIxICovCisJdTggc2ludF9vZGU7CQkvKiBHUElPICsgMHgyNCAqLworCXU4IHJlc2VydmVkNFszXTsJLyogR1BJTyArIDB4MjUgKi8KKwl1OCBzaW50X2RkcjsJCS8qIEdQSU8gKyAweDI4ICovCisJdTggcmVzZXJ2ZWQ1WzNdOwkvKiBHUElPICsgMHgyOSAqLworCXU4IHNpbnRfZHZvOwkJLyogR1BJTyArIDB4MmMgKi8KKwl1OCByZXNlcnZlZDZbM107CS8qIEdQSU8gKyAweDJkICovCisJdTggc2ludF9pbnRlbjsJCS8qIEdQSU8gKyAweDMwICovCisJdTggcmVzZXJ2ZWQ3WzNdOwkvKiBHUElPICsgMHgzMSAqLworCXUxNiBzaW50X2l0eXBlOwkJLyogR1BJTyArIDB4MzQgKi8KKwl1MTYgcmVzZXJ2ZWQ4OwkJLyogR1BJTyArIDB4MzYgKi8KKwl1OCBncGlvX2NvbnRyb2w7CS8qIEdQSU8gKyAweDM4ICovCisJdTggcmVzZXJ2ZWQ5WzNdOwkvKiBHUElPICsgMHgzOSAqLworCXU4IHNpbnRfaXN0YXQ7CQkvKiBHUElPICsgMHgzYyAqLworCXU4IHNpbnRfaXZhbDsJCS8qIEdQSU8gKyAweDNkICovCisJdTggYnVzX2VycnM7CQkvKiBHUElPICsgMHgzZSAqLworCXU4IHJlc2VydmVkMTA7CQkvKiBHUElPICsgMHgzZiAqLworfTsKKworI2RlZmluZSBNUEM1Mnh4X0dQSU9fUFNDX0NPTkZJR19VQVJUX1dJVEhPVVRfQ0QJNAorI2RlZmluZSBNUEM1Mnh4X0dQSU9fUFNDX0NPTkZJR19VQVJUX1dJVEhfQ0QJNQorI2RlZmluZSBNUEM1Mnh4X0dQSU9fUENJX0RJUwkJCSgxPDwxNSkKKworLyogR1BJTyB3aXRoIFdha2VVcCovCitzdHJ1Y3QgbXBjNTJ4eF9ncGlvX3drdXAgeworCXU4IHdrdXBfZ3Bpb2U7CQkvKiBHUElPX1dLVVAgKyAweDAwICovCisJdTggcmVzZXJ2ZWQxWzNdOwkvKiBHUElPX1dLVVAgKyAweDAzICovCisJdTggd2t1cF9vZGU7CQkvKiBHUElPX1dLVVAgKyAweDA0ICovCisJdTggcmVzZXJ2ZWQyWzNdOwkvKiBHUElPX1dLVVAgKyAweDA1ICovCisJdTggd2t1cF9kZHI7CQkvKiBHUElPX1dLVVAgKyAweDA4ICovCisJdTggcmVzZXJ2ZWQzWzNdOwkvKiBHUElPX1dLVVAgKyAweDA5ICovCisJdTggd2t1cF9kdm87CQkvKiBHUElPX1dLVVAgKyAweDBDICovCisJdTggcmVzZXJ2ZWQ0WzNdOwkvKiBHUElPX1dLVVAgKyAweDBEICovCisJdTggd2t1cF9pbnRlbjsJCS8qIEdQSU9fV0tVUCArIDB4MTAgKi8KKwl1OCByZXNlcnZlZDVbM107CS8qIEdQSU9fV0tVUCArIDB4MTEgKi8KKwl1OCB3a3VwX2lpbnRlbjsJCS8qIEdQSU9fV0tVUCArIDB4MTQgKi8KKwl1OCByZXNlcnZlZDZbM107CS8qIEdQSU9fV0tVUCArIDB4MTUgKi8KKwl1MTYgd2t1cF9pdHlwZTsJCS8qIEdQSU9fV0tVUCArIDB4MTggKi8KKwl1OCByZXNlcnZlZDdbMl07CS8qIEdQSU9fV0tVUCArIDB4MUEgKi8KKwl1OCB3a3VwX21hc3RlOwkJLyogR1BJT19XS1VQICsgMHgxQyAqLworCXU4IHJlc2VydmVkOFszXTsJLyogR1BJT19XS1VQICsgMHgxRCAqLworCXU4IHdrdXBfaXZhbDsJCS8qIEdQSU9fV0tVUCArIDB4MjAgKi8KKwl1OCByZXNlcnZlZDlbM107CS8qIEdQSU9fV0tVUCArIDB4MjEgKi8KKwl1OCB3a3VwX2lzdGF0OwkJLyogR1BJT19XS1VQICsgMHgyNCAqLworCXU4IHJlc2VydmVkMTBbM107CS8qIEdQSU9fV0tVUCArIDB4MjUgKi8KK307CisKKy8qIFhMQiBCdXMgY29udHJvbCAqLworc3RydWN0IG1wYzUyeHhfeGxiIHsKKwl1OCByZXNlcnZlZFsweDQwXTsKKwl1MzIgY29uZmlnOwkJLyogWExCICsgMHg0MCAqLworCXUzMiB2ZXJzaW9uOwkJLyogWExCICsgMHg0NCAqLworCXUzMiBzdGF0dXM7CQkvKiBYTEIgKyAweDQ4ICovCisJdTMyIGludF9lbmFibGU7CQkvKiBYTEIgKyAweDRjICovCisJdTMyIGFkZHJfY2FwdHVyZTsJLyogWExCICsgMHg1MCAqLworCXUzMiBidXNfc2lnX2NhcHR1cmU7CS8qIFhMQiArIDB4NTQgKi8KKwl1MzIgYWRkcl90aW1lb3V0OwkvKiBYTEIgKyAweDU4ICovCisJdTMyIGRhdGFfdGltZW91dDsJLyogWExCICsgMHg1YyAqLworCXUzMiBidXNfYWN0X3RpbWVvdXQ7CS8qIFhMQiArIDB4NjAgKi8KKwl1MzIgbWFzdGVyX3ByaV9lbmFibGU7CS8qIFhMQiArIDB4NjQgKi8KKwl1MzIgbWFzdGVyX3ByaW9yaXR5OwkvKiBYTEIgKyAweDY4ICovCisJdTMyIGJhc2VfYWRkcmVzczsJLyogWExCICsgMHg2YyAqLworCXUzMiBzbm9vcF93aW5kb3c7CS8qIFhMQiArIDB4NzAgKi8KK307CisKKyNkZWZpbmUgTVBDNTJ4eF9YTEJfQ0ZHX1BMRElTCQkoMSA8PCAzMSkKKyNkZWZpbmUgTVBDNTJ4eF9YTEJfQ0ZHX1NOT09QCQkoMSA8PCAxNSkKKworLyogQ2xvY2sgRGlzdHJpYnV0aW9uIGNvbnRyb2wgKi8KK3N0cnVjdCBtcGM1Mnh4X2NkbSB7CisJdTMyIGp0YWdfaWQ7CQkvKiBDRE0gKyAweDAwICByZWcwIHJlYWQgb25seSAqLworCXUzMiByc3RjZmc7CQkvKiBDRE0gKyAweDA0ICByZWcxIHJlYWQgb25seSAqLworCXUzMiBicmVhZGNydW1iOwkJLyogQ0RNICsgMHgwOCAgcmVnMiAqLworCisJdTggbWVtX2Nsa19zZWw7CQkvKiBDRE0gKyAweDBjICByZWczIGJ5dGUwICovCisJdTggeGxiX2Nsa19zZWw7CQkvKiBDRE0gKyAweDBkICByZWczIGJ5dGUxIHJlYWQgb25seSAqLworCXU4IGlwYl9jbGtfc2VsOwkJLyogQ0RNICsgMHgwZSAgcmVnMyBieXRlMiAqLworCXU4IHBjaV9jbGtfc2VsOwkJLyogQ0RNICsgMHgwZiAgcmVnMyBieXRlMyAqLworCisJdTggZXh0XzQ4bWh6X2VuOwkvKiBDRE0gKyAweDEwICByZWc0IGJ5dGUwICovCisJdTggZmRfZW5hYmxlOwkJLyogQ0RNICsgMHgxMSAgcmVnNCBieXRlMSAqLworCXUxNiBmZF9jb3VudGVyczsJLyogQ0RNICsgMHgxMiAgcmVnNCBieXRlMiwzICovCisKKwl1MzIgY2xrX2VuYWJsZXM7CS8qIENETSArIDB4MTQgIHJlZzUgKi8KKworCXU4IG9zY19kaXNhYmxlOwkJLyogQ0RNICsgMHgxOCAgcmVnNiBieXRlMCAqLworCXU4IHJlc2VydmVkMFszXTsJLyogQ0RNICsgMHgxOSAgcmVnNiBieXRlMSwyLDMgKi8KKworCXU4IGNjc19zbGVlcF9lbmFibGU7CS8qIENETSArIDB4MWMgIHJlZzcgYnl0ZTAgKi8KKwl1OCBvc2Nfc2xlZXBfZW5hYmxlOwkvKiBDRE0gKyAweDFkICByZWc3IGJ5dGUxICovCisJdTggcmVzZXJ2ZWQxOwkJLyogQ0RNICsgMHgxZSAgcmVnNyBieXRlMiAqLworCXU4IGNjc19xcmVxX3Rlc3Q7CS8qIENETSArIDB4MWYgIHJlZzcgYnl0ZTMgKi8KKworCXU4IHNvZnRfcmVzZXQ7CQkvKiBDRE0gKyAweDIwICB1OCBieXRlMCAqLworCXU4IG5vX2Nrc3RwOwkJLyogQ0RNICsgMHgyMSAgdTggYnl0ZTAgKi8KKwl1OCByZXNlcnZlZDJbMl07CS8qIENETSArIDB4MjIgIHU4IGJ5dGUxLDIsMyAqLworCisJdTggcGxsX2xvY2s7CQkvKiBDRE0gKyAweDI0ICByZWc5IGJ5dGUwICovCisJdTggcGxsX2xvb3NlbG9jazsJLyogQ0RNICsgMHgyNSAgcmVnOSBieXRlMSAqLworCXU4IHBsbF9zbV9sb2Nrd2luOwkvKiBDRE0gKyAweDI2ICByZWc5IGJ5dGUyICovCisJdTggcmVzZXJ2ZWQzOwkJLyogQ0RNICsgMHgyNyAgcmVnOSBieXRlMyAqLworCisJdTE2IHJlc2VydmVkNDsJCS8qIENETSArIDB4MjggIHJlZzEwIGJ5dGUwLDEgKi8KKwl1MTYgbWNsa2VuX2Rpdl9wc2MxOwkvKiBDRE0gKyAweDJhICByZWcxMCBieXRlMiwzICovCisKKwl1MTYgcmVzZXJ2ZWQ1OwkJLyogQ0RNICsgMHgyYyAgcmVnMTEgYnl0ZTAsMSAqLworCXUxNiBtY2xrZW5fZGl2X3BzYzI7CS8qIENETSArIDB4MmUgIHJlZzExIGJ5dGUyLDMgKi8KKworCXUxNiByZXNlcnZlZDY7CQkvKiBDRE0gKyAweDMwICByZWcxMiBieXRlMCwxICovCisJdTE2IG1jbGtlbl9kaXZfcHNjMzsJLyogQ0RNICsgMHgzMiAgcmVnMTIgYnl0ZTIsMyAqLworCisJdTE2IHJlc2VydmVkNzsJCS8qIENETSArIDB4MzQgIHJlZzEzIGJ5dGUwLDEgKi8KKwl1MTYgbWNsa2VuX2Rpdl9wc2M2OwkvKiBDRE0gKyAweDM2ICByZWcxMyBieXRlMiwzICovCit9OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogUHJvdG90eXBlcyBmb3IgTVBDNTJ4eCBzeXNkZXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitleHRlcm4gdm9pZCBfX2lvbWVtICogbXBjNTJ4eF9maW5kX2FuZF9tYXAoY29uc3QgY2hhciAqKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbXBjNTJ4eF9maW5kX2lwYl9mcmVxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CitleHRlcm4gdm9pZCBtcGM1Mnh4X3NldHVwX2NwdSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgbXBjNTJ4eF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbXBjNTJ4eF9nZXRfaXJxKHZvaWQpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0FTTV9QT1dFUlBDX01QQzUyeHhfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODV4eC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4NXh4LmgKaW5kZXggY2NkYjhhMi4uNTQxNDI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4NXh4LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4NXh4LmgKQEAgLTMxLDE0ICszMSw2IEBACiAjaW5jbHVkZSA8cGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuaD4KICNlbmRpZgogCi0jZGVmaW5lIF9JT19CQVNFICAgICAgICBpc2FfaW9fYmFzZQotI2RlZmluZSBfSVNBX01FTV9CQVNFICAgaXNhX21lbV9iYXNlCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgcGNpX2RyYW1fb2Zmc2V0Ci0jZWxzZQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgMAotI2VuZGlmCi0KIC8qIExldCBtb2R1bGVzL2RyaXZlcnMgZ2V0IGF0IENDU1JCQVIgKi8KIGV4dGVybiBwaHlzX2FkZHJfdCBnZXRfY2NzcmJhcih2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGljLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaAppbmRleCBlZjBhNTQ1Li5iNzFlN2IzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaApAQCAtMyw2ICszLDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZGNyLmg+CiAKIC8qCiAgKiBHbG9iYWwgcmVnaXN0ZXJzCkBAIC0yMjUsNiArMjI2LDIzIEBACiAjZW5kaWYgLyogQ09ORklHX01QSUNfQlJPS0VOX1UzICovCiAKIAorZW51bSBtcGljX3JlZ190eXBlIHsKKwltcGljX2FjY2Vzc19tbWlvX2xlLAorCW1waWNfYWNjZXNzX21taW9fYmUsCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwltcGljX2FjY2Vzc19kY3IKKyNlbmRpZgorfTsKKworc3RydWN0IG1waWNfcmVnX2JhbmsgeworCXUzMiBfX2lvbWVtCSpiYXNlOworI2lmZGVmIENPTkZJR19QUENfRENSCisJZGNyX2hvc3RfdAlkaG9zdDsKKwl1bnNpZ25lZCBpbnQJZGJhc2U7CisJdW5zaWduZWQgaW50CWRvZmY7CisjZW5kaWYgLyogQ09ORklHX1BQQ19EQ1IgKi8KK307CisKIC8qIFRoZSBpbnN0YW5jZSBkYXRhIG9mIGEgZ2l2ZW4gTVBJQyAqLwogc3RydWN0IG1waWMKIHsKQEAgLTI2NCwxMSArMjgyLDE4IEBACiAJc3BpbmxvY2tfdAkJZml4dXBfbG9jazsKICNlbmRpZgogCisJLyogUmVnaXN0ZXIgYWNjZXNzIG1ldGhvZCAqLworCWVudW0gbXBpY19yZWdfdHlwZQlyZWdfdHlwZTsKKwogCS8qIFRoZSB2YXJpb3VzIGlvcmVtYXAnZWQgYmFzZXMgKi8KLQl2b2xhdGlsZSB1MzIgX19pb21lbQkqZ3JlZ3M7Ci0Jdm9sYXRpbGUgdTMyIF9faW9tZW0JKnRtcmVnczsKLQl2b2xhdGlsZSB1MzIgX19pb21lbQkqY3B1cmVnc1tNUElDX01BWF9DUFVTXTsKLQl2b2xhdGlsZSB1MzIgX19pb21lbQkqaXN1c1tNUElDX01BWF9JU1VdOworCXN0cnVjdCBtcGljX3JlZ19iYW5rCWdyZWdzOworCXN0cnVjdCBtcGljX3JlZ19iYW5rCXRtcmVnczsKKwlzdHJ1Y3QgbXBpY19yZWdfYmFuawljcHVyZWdzW01QSUNfTUFYX0NQVVNdOworCXN0cnVjdCBtcGljX3JlZ19iYW5rCWlzdXNbTVBJQ19NQVhfSVNVXTsKKworI2lmZGVmIENPTkZJR19QUENfRENSCisJdW5zaWduZWQgaW50CQlkY3JfYmFzZTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01QSUNfV0VJUkQKIAkvKiBQb2ludGVyIHRvIEhXIGluZm8gYXJyYXkgKi8KQEAgLTMwNSw2ICszMzAsOCBAQAogI2RlZmluZSBNUElDX1NQVl9FT0kJCQkweDAwMDAwMDIwCiAvKiBObyBwYXNzdGhyb3VnaCBkaXNhYmxlICovCiAjZGVmaW5lIE1QSUNfTk9fUFRIUk9VX0RJUwkJMHgwMDAwMDA0MAorLyogRENSIGJhc2VkIE1QSUMgKi8KKyNkZWZpbmUgTVBJQ19VU0VTX0RDUgkJCTB4MDAwMDAwODAKIAogLyogTVBJQyBIVyBtb2RpZmljYXRpb24gSUQgKi8KICNkZWZpbmUgTVBJQ19SRUdTRVRfTUFTSwkJMHhmMDAwMDAwMApAQCAtMzM3LDcgKzM2NCw3IEBACiAgKiB0aGF0IGlzIHNlbnNlc1swXSBjb3JyZXNwb25kIHRvIGxpbnV4IGlycSAiaXJxX29mZnNldCIuCiAgKi8KIGV4dGVybiBzdHJ1Y3QgbXBpYyAqbXBpY19hbGxvYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkgICAgICAgcGh5c19hZGRyX3QgcGh5c19hZGRyLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXN1X3NpemUsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGlycV9jb3VudCwKQEAgLTM1MCw3ICszNzcsNyBAQAogICogQHBoeXNfYWRkcjoJcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgSVNVCiAgKi8KIGV4dGVybiB2b2lkIG1waWNfYXNzaWduX2lzdShzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IGlzdV9udW0sCi0JCQkgICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOworCQkJICAgIHBoeXNfYWRkcl90IHBoeXNfYWRkcik7CiAKIC8qIFNldCBkZWZhdWx0IHNlbnNlIGNvZGVzCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvb2ZfZGV2aWNlLmgKaW5kZXggYzVjMGIwYi4uYTg4OWIyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oCkBAIC02LDEyICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCi0vKgotICogVGhlIG9mX3BsYXRmb3JtX2J1c190eXBlIGlzIGEgYnVzIHR5cGUgdXNlZCBieSBkcml2ZXJzIHRoYXQgZG8gbm90Ci0gKiBhdHRhY2ggdG8gYSBtYWNpbyBvciBzaW1pbGFyIGJ1cyBidXQgc3RpbGwgdXNlIE9GIHByb2JpbmcKLSAqIG1lY2hhbmlzbQotICovCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIG9mX3BsYXRmb3JtX2J1c190eXBlOwogCiAvKgogICogVGhlIG9mX2RldmljZSBpcyBhIGtpbmQgb2YgImJhc2UgY2xhc3MiIHRoYXQgaXMgYSBzdXBlcnNldCBvZgpAQCAtMjAsNDYgKzE0LDIyIEBACiAgKi8KIHN0cnVjdCBvZl9kZXZpY2UKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUJKm5vZGU7CQkvKiBPRiBkZXZpY2Ugbm9kZSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbm9kZTsJCS8qIHRvIGJlIG9ic29sZXRlZCAqLwogCXU2NAkJCWRtYV9tYXNrOwkvKiBETUEgbWFzayAqLwogCXN0cnVjdCBkZXZpY2UJCWRldjsJCS8qIEdlbmVyaWMgZGV2aWNlIGludGVyZmFjZSAqLwogfTsKICNkZWZpbmUJdG9fb2ZfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgb2ZfZGV2aWNlLCBkZXYpCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9ub2RlKAorCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiBleHRlcm4gY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXZfZ2V0KHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBvZl9kZXZfcHV0KHN0cnVjdCBvZl9kZXZpY2UgKmRldik7CiAKLS8qCi0gKiBBbiBvZl9wbGF0Zm9ybV9kcml2ZXIgZHJpdmVyIGlzIGF0dGFjaGVkIHRvIGEgYmFzaWMgb2ZfZGV2aWNlIG9uCi0gKiB0aGUgInBsYXRmb3JtIGJ1cyIgKG9mX3BsYXRmb3JtX2J1c190eXBlKQotICovCi1zdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyCi17Ci0JY2hhcgkJCSpuYW1lOwotCXN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoX3RhYmxlOwotCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKLQotCWludAkoKnByb2JlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKTsKLQlpbnQJKCpyZW1vdmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7Ci0KLQlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0JaW50CSgqcmVzdW1lKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOwotCWludAkoKnNodXRkb3duKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOwotCi0Jc3RydWN0IGRldmljZV9kcml2ZXIJZHJpdmVyOwotfTsKLSNkZWZpbmUJdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydixzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyLCBkcml2ZXIpCi0KLWV4dGVybiBpbnQgb2ZfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydik7Ci1leHRlcm4gdm9pZCBvZl91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpOwogZXh0ZXJuIHZvaWQgb2ZfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpOwotZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKLQkJCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCk7CiBleHRlcm4gdm9pZCBvZl9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2VhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX3BsYXRmb3JtLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqCQkJIDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisKKy8qCisgKiBUaGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgaXMgYSBidXMgdHlwZSB1c2VkIGJ5IGRyaXZlcnMgdGhhdCBkbyBub3QKKyAqIGF0dGFjaCB0byBhIG1hY2lvIG9yIHNpbWlsYXIgYnVzIGJ1dCBzdGlsbCB1c2UgT0YgcHJvYmluZworICogbWVjaGFuaXNtCisgKi8KK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGU7CisKKy8qCisgKiBBbiBvZl9wbGF0Zm9ybV9kcml2ZXIgZHJpdmVyIGlzIGF0dGFjaGVkIHRvIGEgYmFzaWMgb2ZfZGV2aWNlIG9uCisgKiB0aGUgInBsYXRmb3JtIGJ1cyIgKG9mX3BsYXRmb3JtX2J1c190eXBlKQorICovCitzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyCit7CisJY2hhcgkJCSpuYW1lOworCXN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoX3RhYmxlOworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKworCWludAkoKnByb2JlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsCisJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpOworCWludAkoKnJlbW92ZSkoc3RydWN0IG9mX2RldmljZSogZGV2KTsKKworCWludAkoKnN1c3BlbmQpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQJKCpyZXN1bWUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CisJaW50CSgqc2h1dGRvd24pKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CisKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7Cit9OworI2RlZmluZQl0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KSBcCisJY29udGFpbmVyX29mKGRydixzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyLCBkcml2ZXIpCisKKy8qIFBsYXRmb3JtIGRyaXZlcnMgcmVnaXN0ZXIvdW5yZWdpc3RlciAqLworZXh0ZXJuIGludCBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KTsKK2V4dGVybiB2b2lkIG9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydik7CisKKy8qIFBsYXRmb3JtIGRldmljZXMgYW5kIGJ1c3NlcyBjcmVhdGlvbiAqLworZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKKwkJCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCk7CisvKiBwc2V1ZG8gIm1hdGNoZXMiIHZhbHVlIHRvIG5vdCBkbyBkZWVwIHByb2JlICovCisjZGVmaW5lIE9GX05PX0RFRVBfUFJPQkUgKChzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICopLTEpCisKK2V4dGVybiBpbnQgb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCwKKwkJCQkgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKKwkJCQkgc3RydWN0IGRldmljZSAqcGFyZW50KTsKKworZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZShwaGFuZGxlIHBoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvb3Byb2ZpbGVfaW1wbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmgKaW5kZXggMDdhMTBlNS4uNzEwNDNiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmgKQEAgLTQ0LDcgKzQ0LDkgQEAKIAkJCSAgIGludCBudW1fY291bnRlcnMpOwogCXZvaWQgKCpjcHVfc2V0dXApIChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKik7CiAJdm9pZCAoKnN0YXJ0KSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOworICAgICAgICB2b2lkICgqZ2xvYmFsX3N0YXJ0KSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOwogCXZvaWQgKCpzdG9wKSAodm9pZCk7CisJdm9pZCAoKmdsb2JhbF9zdG9wKSAodm9pZCk7CiAJdm9pZCAoKmhhbmRsZV9pbnRlcnJ1cHQpIChzdHJ1Y3QgcHRfcmVncyAqLAogCQkJCSAgc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOwogCWludCBudW1fY291bnRlcnM7CkBAIC01NCw2ICs1Niw3IEBACiBleHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfcnM2NDsKIGV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9wb3dlcjQ7CiBleHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfNzQ1MDsKK2V4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9jZWxsOwogCiAjaWZuZGVmIENPTkZJR19GU0xfQk9PS0UKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaAppbmRleCAwYTRlNWM5Li4wZDNhZGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaApAQCAtOTMsNyArOTMsOCBAQAogCXU2NCBzdGFiX3JyOwkJCS8qIHN0YWIvc2xiIHJvdW5kLXJvYmluIGNvdW50ZXIgKi8KIAl1NjQgc2F2ZWRfcjE7CQkJLyogcjEgc2F2ZSBmb3IgUlRBUyBjYWxscyAqLwogCXU2NCBzYXZlZF9tc3I7CQkJLyogTVNSIHNhdmVkIGhlcmUgYnkgZW50ZXJfcnRhcyAqLwotCXU4IHByb2NfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCisJdTggc29mdF9lbmFibGVkOwkJLyogaXJxIHNvZnQtZW5hYmxlIGZsYWcgKi8KKwl1OCBoYXJkX2VuYWJsZWQ7CQkvKiBzZXQgaWYgaXJxcyBhcmUgZW5hYmxlZCBpbiBNU1IgKi8KIAl1OCBpb19zeW5jOwkJCS8qIHdyaXRlbCgpIG5lZWRzIHNwaW5fdW5sb2NrIHN5bmMgKi8KIAogCS8qIFN0dWZmIGZvciBhY2N1cmF0ZSB0aW1lIGFjY291bnRpbmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKaW5kZXggODZlZTQ2Yi4uN2JiN2Y5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAlpbnQgbm9kZTsKIAl2b2lkICphcmNoX2RhdGE7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CisJc3RydWN0IGRldmljZSAqcGFyZW50OwogCiAJaW50IGZpcnN0X2J1c25vOwogCWludCBsYXN0X2J1c25vOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKaW5kZXggNDZhZmQyOS4uMTZmMTMzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCkBAIC02MiwyOSArNjIsMjMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBIQVZFX0FSQ0hfUENJX01XSSAxCi1zdGF0aWMgaW5saW5lIGludCBwY2liaW9zX3ByZXBfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JLyoKLQkgKiBXZSB3b3VsZCBsaWtlIHRvIGF2b2lkIHRvdWNoaW5nIHRoZSBjYWNoZWxpbmUgc2l6ZSBvciBNV0kgYml0Ci0JICogYnV0IHdlIGNhbnQgZG8gdGhhdCB3aXRoIHRoZSBjdXJyZW50IHBjaWJpb3NfcHJlcF9td2kgCi0JICogaW50ZXJmYWNlLiBwU2VyaWVzIGZpcm13YXJlIHNldHMgdGhlIGNhY2hlbGluZSBzaXplICh3aGljaCBpcyBub3QKLQkgKiB0aGUgY3B1IGNhY2hlbGluZSBzaXplIGluIGFsbCBjYXNlcykgYW5kIGhhcmR3YXJlIHRyZWF0cyBNV0kgCi0JICogdGhlIHNhbWUgYXMgbWVtb3J5IHdyaXRlLiBTbyB3ZSBkb250IHRvdWNoIHRoZSBjYWNoZWxpbmUgc2l6ZQotCSAqIGhlcmUgYW5kIGFsbG93IHRoZSBnZW5lcmljIGNvZGUgdG8gc2V0IHRoZSBNV0kgYml0LgotCSAqLwotCXJldHVybiAwOwotfQogCi1leHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyBwY2lfZG1hX29wczsKKy8qCisgKiBXZSB3YW50IHRvIGF2b2lkIHRvdWNoaW5nIHRoZSBjYWNoZWxpbmUgc2l6ZSBvciBNV0kgYml0LgorICogcFNlcmllcyBmaXJtd2FyZSBzZXRzIHRoZSBjYWNoZWxpbmUgc2l6ZSAod2hpY2ggaXMgbm90IHRoZSBjcHUgY2FjaGVsaW5lCisgKiBzaXplIGluIGFsbCBjYXNlcykgYW5kIGhhcmR3YXJlIHRyZWF0cyBNV0kgdGhlIHNhbWUgYXMgbWVtb3J5IHdyaXRlLgorICovCisjZGVmaW5lIFBDSV9ESVNBQkxFX01XSQorCitleHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqcGNpX2RtYV9vcHM7CiAKIC8qIEZvciBEQUMgRE1BLCB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBpdCBieSBkZWZhdWx0LCBidXQKICAqIHdlIGxldCA2NC1iaXQgcGxhdGZvcm1zIG92ZXJyaWRlIHRoaXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9kYWNfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsdTY0IG1hc2spCiB7Ci0JaWYgKHBjaV9kbWFfb3BzLmRhY19kbWFfc3VwcG9ydGVkKQotCQlyZXR1cm4gcGNpX2RtYV9vcHMuZGFjX2RtYV9zdXBwb3J0ZWQoJmh3ZGV2LT5kZXYsIG1hc2spOworCWlmIChwY2lfZG1hX29wcyAmJiBwY2lfZG1hX29wcy0+ZGFjX2RtYV9zdXBwb3J0ZWQpCisJCXJldHVybiBwY2lfZG1hX29wcy0+ZGFjX2RtYV9zdXBwb3J0ZWQoJmh3ZGV2LT5kZXYsIG1hc2spOwogCXJldHVybiAwOwogfQogCkBAIC0yMTYsNiArMjEwLDggQEAKIGV4dGVybiB2b2lkIHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKK2V4dGVybiB2b2lkIHBjaWJpb3Nfc2V0dXBfbmV3X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKwogZXh0ZXJuIHZvaWQgcGNpYmlvc19jbGFpbV9vbmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKTsKIAogZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciAqaW5pdF9waGJfZHluYW1pYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKQEAgLTIzOCwxMiArMjM0LDEwIEBACiAJCQkJCSB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCSBwZ3Byb3RfdCBwcm90KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNKSB8fCBkZWZpbmVkKENPTkZJR19QUEMzMikKICNkZWZpbmUgSEFWRV9BUkNIX1BDSV9SRVNPVVJDRV9UT19VU0VSCiBleHRlcm4gdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAogCQkJCSBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCiAJCQkJIHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCAqZW5kKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gfHwgQ09ORklHX1BQQzMyICovCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fUE9XRVJQQ19QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAppbmRleCAxMTE1NzU2Li5hYjZlZGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaApAQCAtMzYsMTggKzM2LDE3IEBACiB2b2lkICp0cmF2ZXJzZV9wY2lfZGV2aWNlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKnN0YXJ0LCB0cmF2ZXJzZV9mdW5jIHByZSwKIAkJdm9pZCAqZGF0YSk7CiAKLXZvaWQgcGNpX2RldnNfcGhiX2luaXQodm9pZCk7Ci12b2lkIHBjaV9kZXZzX3BoYl9pbml0X2R5bmFtaWMoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwotaW50IHNldHVwX3BoYihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwotdm9pZCBfX2RldmluaXQgc2Nhbl9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKK2V4dGVybiB2b2lkIHBjaV9kZXZzX3BoYl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CitleHRlcm4gdm9pZCBzY2FuX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOwogCiAvKiBGcm9tIHJ0YXNfcGNpLmggKi8KLXZvaWQgaW5pdF9wY2lfY29uZmlnX3Rva2VucyAodm9pZCk7Ci11bnNpZ25lZCBsb25nIGdldF9waGJfYnVpZCAoc3RydWN0IGRldmljZV9ub2RlICopOworZXh0ZXJuIHZvaWQgaW5pdF9wY2lfY29uZmlnX3Rva2VucyAodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfcGhiX2J1aWQgKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKK2V4dGVybiBpbnQgcnRhc19zZXR1cF9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwogCiAvKiBGcm9tIHBTZXJpZXNfcGNpLmggKi8KIGV4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7Ci1leHRlcm4gdm9pZCBwU2VyaWVzX2lycV9idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9wcm9iZV9vbmx5OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAppbmRleCA2Y2I2ZmIxLi5hMjZjMzJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKQEAgLTUzLDEwICs1Myw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BSRVAgKi8KIAotI2lmbmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLSNkZWZpbmUgX21hY2hpbmUgMAotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwotCiAjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggZWMxMWQ0NC4uMGFmZWUxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlICovCkBAIC0zMzMsNiArMzM0LDIwIEBACiBzdHJ1Y3QgcGNpX2RldjsKIGV4dGVybiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpOwogCitzdGF0aWMgaW5saW5lIGludCBvZl9pcnFfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwgc3RydWN0IHJlc291cmNlICpyKQoreworCWludCBpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYsIGluZGV4KTsKKworCS8qIE9ubHkgZGVyZWZlcmVuY2UgdGhlIHJlc291cmNlIGlmIGJvdGggdGhlCisJICogcmVzb3VyY2UgYW5kIHRoZSBpcnEgYXJlIHZhbGlkLiAqLworCWlmIChyICYmIGlycSAhPSBOT19JUlEpIHsKKwkJci0+c3RhcnQgPSByLT5lbmQgPSBpcnE7CisJCXItPmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJfQorCisJcmV0dXJuIGlycTsKK30KKwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QT1dFUlBDX1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhNjllZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmgKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiAgUFMzIHBsYXRmb3JtIGRlY2xhcmF0aW9ucy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZiAhZGVmaW5lZChfQVNNX1BPV0VSUENfUFMzX0gpCisjZGVmaW5lIF9BU01fUE9XRVJQQ19QUzNfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4gLyogZm9yIF9fZGVwcmVjYXRlZCAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisvKioKKyAqIHN0cnVjdCBwczNfZGV2aWNlX2lkIC0gSFYgYnVzIGRldmljZSBpZGVudGlmaWVyIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5CisgKiBAYnVzX2lkOiBIViBidXMgaWQsIHsxLi59ICh6ZXJvIGludmFsaWQpCisgKiBAZGV2X2lkOiBIViBkZXZpY2UgaWQsIHswLi59CisgKi8KKworc3RydWN0IHBzM19kZXZpY2VfaWQgeworCXVuc2lnbmVkIGludCBidXNfaWQ7CisJdW5zaWduZWQgaW50IGRldl9pZDsKK307CisKKworLyogZG1hIHJvdXRpbmVzICovCisKK2VudW0gcHMzX2RtYV9wYWdlX3NpemUgeworCVBTM19ETUFfNEsgPSAxMlUsCisJUFMzX0RNQV82NEsgPSAxNlUsCisJUFMzX0RNQV8xTSA9IDIwVSwKKwlQUzNfRE1BXzE2TSA9IDI0VSwKK307CisKK2VudW0gcHMzX2RtYV9yZWdpb25fdHlwZSB7CisJUFMzX0RNQV9PVEhFUiA9IDAsCisJUFMzX0RNQV9JTlRFUk5BTCA9IDIsCit9OworCisvKioKKyAqIHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAtIEEgcGVyIGRldmljZSBkbWEgc3RhdGUgdmFyaWFibGVzIHN0cnVjdHVyZQorICogQGRpZDogVGhlIEhWIGRldmljZSBpZC4KKyAqIEBwYWdlX3NpemU6IFRoZSBpb2MgcGFnZXNpemUuCisgKiBAcmVnaW9uX3R5cGU6IFRoZSBIViByZWdpb24gdHlwZS4KKyAqIEBidXNfYWRkcjogVGhlICd0cmFuc2xhdGVkJyBidXMgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICogQGxlbjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcmVnaW9uLgorICogQGNodW5rX2xpc3Q6IE9wYXF1ZSB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBpb2MgcGFnZSBtYW5hZ2VyLgorICovCisKK3N0cnVjdCBwczNfZG1hX3JlZ2lvbiB7CisJc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCWVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplOworCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZTsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXN0cnVjdCB7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCX0gY2h1bmtfbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHBzM19kbWFfcmVnaW9uX2luaXQgLSBIZWxwZXIgdG8gaW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgdmFyaWFibGVzCisgKgorICogSGVscGVyIHRvIHByb3Blcmx5IGluaXRpYWxpemUgdmFyaWFibGVzIHByaW9yIHRvIGNhbGxpbmcKKyAqIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcHMzX2RtYV9yZWdpb25faW5pdChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQqIGRpZCwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCisJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlKQoreworCXItPmRpZCA9ICpkaWQ7CisJci0+cGFnZV9zaXplID0gcGFnZV9zaXplOworCXItPnJlZ2lvbl90eXBlID0gcmVnaW9uX3R5cGU7Cit9CitpbnQgcHMzX2RtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcik7CitpbnQgcHMzX2RtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpOworaW50IHBzM19kbWFfbWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKTsKK2ludCBwczNfZG1hX3VubWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbik7CisKKy8qIG1taW8gcm91dGluZXMgKi8KKworZW51bSBwczNfbW1pb19wYWdlX3NpemUgeworCVBTM19NTUlPXzRLID0gMTJVLAorCVBTM19NTUlPXzY0SyA9IDE2VQorfTsKKworLyoqCisgKiBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIC0gYSBwZXIgZGV2aWNlIG1taW8gc3RhdGUgdmFyaWFibGVzIHN0cnVjdHVyZQorICoKKyAqIEN1cnJlbnQgc3lzdGVtcyBjYW4gYmUgc3VwcG9ydGVkIHdpdGggYSBzaW5nbGUgcmVnaW9uIHBlciBkZXZpY2UuCisgKi8KKworc3RydWN0IHBzM19tbWlvX3JlZ2lvbiB7CisJc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplOworCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX2luaXQgLSBIZWxwZXIgdG8gaW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgdmFyaWFibGVzCisgKgorICogSGVscGVyIHRvIHByb3Blcmx5IGluaXRpYWxpemUgdmFyaWFibGVzIHByaW9yIHRvIGNhbGxpbmcKKyAqIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcHMzX21taW9fcmVnaW9uX2luaXQoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqciwKKwljb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCogZGlkLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuLCBlbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpCit7CisJci0+ZGlkID0gKmRpZDsKKwlyLT5idXNfYWRkciA9IGJ1c19hZGRyOworCXItPmxlbiA9IGxlbjsKKwlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7Cit9CitpbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKTsKK2ludCBwczNfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKTsKK3Vuc2lnbmVkIGxvbmcgcHMzX21tX3BoeXNfdG9fbHBhcih1bnNpZ25lZCBsb25nIHBoeXNfYWRkcik7CisKKy8qIGlucmVycnVwdCByb3V0aW5lcyAqLworCitpbnQgcHMzX2FsbG9jX2lvX2lycSh1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLCB1bnNpZ25lZCBpbnQgKnZpcnEpOworaW50IHBzM19mcmVlX2lvX2lycSh1bnNpZ25lZCBpbnQgdmlycSk7CitpbnQgcHMzX2FsbG9jX2V2ZW50X2lycSh1bnNpZ25lZCBpbnQgKnZpcnEpOworaW50IHBzM19mcmVlX2V2ZW50X2lycSh1bnNpZ25lZCBpbnQgdmlycSk7CitpbnQgcHMzX3NlbmRfZXZlbnRfbG9jYWxseSh1bnNpZ25lZCBpbnQgdmlycSk7CitpbnQgcHMzX2Nvbm5lY3RfZXZlbnRfaXJxKGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCisJdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfZGlzY29ubmVjdF9ldmVudF9pcnEoY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQgKmRpZCwKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLCB1bnNpZ25lZCBpbnQgdmlycSk7CitpbnQgcHMzX2FsbG9jX3Z1YXJ0X2lycSh2b2lkKiB2aXJ0X2FkZHJfYm1wLCB1bnNpZ25lZCBpbnQgKnZpcnEpOworaW50IHBzM19mcmVlX3Z1YXJ0X2lycSh1bnNpZ25lZCBpbnQgdmlycSk7CitpbnQgcHMzX2FsbG9jX3NwZV9pcnEodW5zaWduZWQgbG9uZyBzcGVfaWQsIHVuc2lnbmVkIGludCBjbGFzcywKKwl1bnNpZ25lZCBpbnQgKnZpcnEpOworaW50IHBzM19mcmVlX3NwZV9pcnEodW5zaWduZWQgaW50IHZpcnEpOworCisvKiBsdjEgcmVzdWx0IGNvZGVzICovCisKK2VudW0gbHYxX3Jlc3VsdCB7CisJTFYxX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICA9IDAsCisJLyogbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgIC0xICovCisJTFYxX1JFU09VUkNFX1NIT1JUQUdFICAgICAgICAgICA9IC0yLAorCUxWMV9OT19QUklWSUxFR0UgICAgICAgICAgICAgICAgPSAtMywKKwlMVjFfREVOSUVEX0JZX1BPTElDWSAgICAgICAgICAgID0gLTQsCisJTFYxX0FDQ0VTU19WSU9MQVRJT04gICAgICAgICAgICA9IC01LAorCUxWMV9OT19FTlRSWSAgICAgICAgICAgICAgICAgICAgPSAtNiwKKwlMVjFfRFVQTElDQVRFX0VOVFJZICAgICAgICAgICAgID0gLTcsCisJTFYxX1RZUEVfTUlTTUFUQ0ggICAgICAgICAgICAgICA9IC04LAorCUxWMV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgPSAtOSwKKwlMVjFfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgID0gLTEwLAorCUxWMV9XUk9OR19TVEFURSAgICAgICAgICAgICAgICAgPSAtMTEsCisJLyogbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgIC0xMiAqLworCUxWMV9OT19NQVRDSCAgICAgICAgICAgICAgICAgICAgPSAtMTMsCisJTFYxX0FMUkVBRFlfQ09OTkVDVEVEICAgICAgICAgICA9IC0xNCwKKwlMVjFfVU5TVVBQT1JURURfUEFSQU1FVEVSX1ZBTFVFID0gLTE1LAorCUxWMV9DT05ESVRJT05fTk9UX1NBVElTRklFRCAgICAgPSAtMTYsCisJTFYxX0lMTEVHQUxfUEFSQU1FVEVSX1ZBTFVFICAgICA9IC0xNywKKwlMVjFfQkFEX09QVElPTiAgICAgICAgICAgICAgICAgID0gLTE4LAorCUxWMV9JTVBMRU1FTlRBVElPTl9MSU1JVEFUSU9OICAgPSAtMTksCisJTFYxX05PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgICA9IC0yMCwKKwlMVjFfSU5WQUxJRF9DTEFTU19JRCAgICAgICAgICAgID0gLTIxLAorCUxWMV9DT05TVFJBSU5UX05PVF9TQVRJU0ZJRUQgICAgPSAtMjIsCisJTFYxX0FMSUdOTUVOVF9FUlJPUiAgICAgICAgICAgICA9IC0yMywKKwlMVjFfSU5URVJOQUxfRVJST1IgICAgICAgICAgICAgID0gLTMyNzY4LAorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBwczNfcmVzdWx0KGludCByZXN1bHQpCit7CisjaWYgZGVmaW5lZChERUJVRykKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgTFYxX1NVQ0NFU1M6CisJCXJldHVybiAiTFYxX1NVQ0NFU1MgKDApIjsKKwljYXNlIC0xOgorCQlyZXR1cm4gIioqIHVua25vd24gcmVzdWx0ICoqICgtMSkiOworCWNhc2UgTFYxX1JFU09VUkNFX1NIT1JUQUdFOgorCQlyZXR1cm4gIkxWMV9SRVNPVVJDRV9TSE9SVEFHRSAoLTIpIjsKKwljYXNlIExWMV9OT19QUklWSUxFR0U6CisJCXJldHVybiAiTFYxX05PX1BSSVZJTEVHRSAoLTMpIjsKKwljYXNlIExWMV9ERU5JRURfQllfUE9MSUNZOgorCQlyZXR1cm4gIkxWMV9ERU5JRURfQllfUE9MSUNZICgtNCkiOworCWNhc2UgTFYxX0FDQ0VTU19WSU9MQVRJT046CisJCXJldHVybiAiTFYxX0FDQ0VTU19WSU9MQVRJT04gKC01KSI7CisJY2FzZSBMVjFfTk9fRU5UUlk6CisJCXJldHVybiAiTFYxX05PX0VOVFJZICgtNikiOworCWNhc2UgTFYxX0RVUExJQ0FURV9FTlRSWToKKwkJcmV0dXJuICJMVjFfRFVQTElDQVRFX0VOVFJZICgtNykiOworCWNhc2UgTFYxX1RZUEVfTUlTTUFUQ0g6CisJCXJldHVybiAiTFYxX1RZUEVfTUlTTUFUQ0ggKC04KSI7CisJY2FzZSBMVjFfQlVTWToKKwkJcmV0dXJuICJMVjFfQlVTWSAoLTkpIjsKKwljYXNlIExWMV9FTVBUWToKKwkJcmV0dXJuICJMVjFfRU1QVFkgKC0xMCkiOworCWNhc2UgTFYxX1dST05HX1NUQVRFOgorCQlyZXR1cm4gIkxWMV9XUk9OR19TVEFURSAoLTExKSI7CisJY2FzZSAtMTI6CisJCXJldHVybiAiKiogdW5rbm93biByZXN1bHQgKiogKC0xMikiOworCWNhc2UgTFYxX05PX01BVENIOgorCQlyZXR1cm4gIkxWMV9OT19NQVRDSCAoLTEzKSI7CisJY2FzZSBMVjFfQUxSRUFEWV9DT05ORUNURUQ6CisJCXJldHVybiAiTFYxX0FMUkVBRFlfQ09OTkVDVEVEICgtMTQpIjsKKwljYXNlIExWMV9VTlNVUFBPUlRFRF9QQVJBTUVURVJfVkFMVUU6CisJCXJldHVybiAiTFYxX1VOU1VQUE9SVEVEX1BBUkFNRVRFUl9WQUxVRSAoLTE1KSI7CisJY2FzZSBMVjFfQ09ORElUSU9OX05PVF9TQVRJU0ZJRUQ6CisJCXJldHVybiAiTFYxX0NPTkRJVElPTl9OT1RfU0FUSVNGSUVEICgtMTYpIjsKKwljYXNlIExWMV9JTExFR0FMX1BBUkFNRVRFUl9WQUxVRToKKwkJcmV0dXJuICJMVjFfSUxMRUdBTF9QQVJBTUVURVJfVkFMVUUgKC0xNykiOworCWNhc2UgTFYxX0JBRF9PUFRJT046CisJCXJldHVybiAiTFYxX0JBRF9PUFRJT04gKC0xOCkiOworCWNhc2UgTFYxX0lNUExFTUVOVEFUSU9OX0xJTUlUQVRJT046CisJCXJldHVybiAiTFYxX0lNUExFTUVOVEFUSU9OX0xJTUlUQVRJT04gKC0xOSkiOworCWNhc2UgTFYxX05PVF9JTVBMRU1FTlRFRDoKKwkJcmV0dXJuICJMVjFfTk9UX0lNUExFTUVOVEVEICgtMjApIjsKKwljYXNlIExWMV9JTlZBTElEX0NMQVNTX0lEOgorCQlyZXR1cm4gIkxWMV9JTlZBTElEX0NMQVNTX0lEICgtMjEpIjsKKwljYXNlIExWMV9DT05TVFJBSU5UX05PVF9TQVRJU0ZJRUQ6CisJCXJldHVybiAiTFYxX0NPTlNUUkFJTlRfTk9UX1NBVElTRklFRCAoLTIyKSI7CisJY2FzZSBMVjFfQUxJR05NRU5UX0VSUk9SOgorCQlyZXR1cm4gIkxWMV9BTElHTk1FTlRfRVJST1IgKC0yMykiOworCWNhc2UgTFYxX0lOVEVSTkFMX0VSUk9SOgorCQlyZXR1cm4gIkxWMV9JTlRFUk5BTF9FUlJPUiAoLTMyNzY4KSI7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAiKiogdW5rbm93biByZXN1bHQgKioiOworCX07CisjZWxzZQorCXJldHVybiAiIjsKKyNlbmRpZgorfQorCisvKiByZXBvc2l0b3J5IGJ1cyBpbmZvICovCisKK2VudW0gcHMzX2J1c190eXBlIHsKKwlQUzNfQlVTX1RZUEVfU0IgPSA0LAorCVBTM19CVVNfVFlQRV9TVE9SQUdFID0gNSwKK307CisKK2VudW0gcHMzX2Rldl90eXBlIHsKKwlQUzNfREVWX1RZUEVfU0JfR0VMSUMgPSAzLAorCVBTM19ERVZfVFlQRV9TQl9VU0IgPSA0LAorCVBTM19ERVZfVFlQRV9TQl9HUElPID0gNiwKK307CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19zdHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwgY29uc3QgY2hhciAqYnVzX3N0ciwKKwl1NjQgKnZhbHVlKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZCh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCB1bnNpZ25lZCBpbnQgKmJ1c19pZCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZSh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCWVudW0gcHMzX2J1c190eXBlICpidXNfdHlwZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2Rldih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCAqbnVtX2Rldik7CisKKy8qIHJlcG9zaXRvcnkgYnVzIGRldmljZSBpbmZvICovCisKK2VudW0gcHMzX2ludGVycnVwdF90eXBlIHsKKwlQUzNfSU5URVJSVVBUX1RZUEVfRVZFTlRfUE9SVCA9IDIsCisJUFMzX0lOVEVSUlVQVF9UWVBFX1NCX09IQ0kgPSAzLAorCVBTM19JTlRFUlJVUFRfVFlQRV9TQl9FSENJID0gNCwKKwlQUzNfSU5URVJSVVBUX1RZUEVfT1RIRVIgPSA1LAorfTsKKworZW51bSBwczNfcmVnaW9uX3R5cGUgeworCVBTM19SRUdJT05fVFlQRV9TQl9PSENJID0gMywKKwlQUzNfUkVHSU9OX1RZUEVfU0JfRUhDSSA9IDQsCisJUFMzX1JFR0lPTl9UWVBFX1NCX0dQSU8gPSA1LAorfTsKKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3N0cih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIGNvbnN0IGNoYXIgKmRldl9zdHIsIHU2NCAqdmFsdWUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIHVuc2lnbmVkIGludCBkZXZfaW5kZXgsCisJdW5zaWduZWQgaW50ICpkZXZfaWQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCBlbnVtIHBzM19kZXZfdHlwZSAqZGV2X3R5cGUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgaW50cl9pbmRleCwKKwllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSAqaW50cl90eXBlLCB1bnNpZ25lZCBpbnQgKmludGVycnVwdF9pZCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnX3R5cGUodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgcmVnX2luZGV4LAorCWVudW0gcHMzX3JlZ2lvbl90eXBlICpyZWdfdHlwZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnX2FkZHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgcmVnX2luZGV4LCB1NjQgKmJ1c19hZGRyLAorCXU2NCAqbGVuKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgcmVnX2luZGV4LAorCWVudW0gcHMzX3JlZ2lvbl90eXBlICpyZWdfdHlwZSwgdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pOworCisvKiByZXBvc2l0b3J5IGJ1cyBlbnVtZXJhdG9ycyAqLworCitzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHsKKwl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OworCXVuc2lnbmVkIGludCBkZXZfaW5kZXg7CisJc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworfTsKKworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAorCWVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlLAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnN0YXJ0X2RldiwKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpOworc3RhdGljIGlubGluZSBpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9maXJzdF9kZXZpY2UoCisJZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsIGVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlLAorCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2UoYnVzX3R5cGUsIGRldl90eXBlLCBOVUxMLCBkZXYpOworfQoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKKwllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGUsIHVuc2lnbmVkIGludCAqaW50ZXJydXB0X2lkKTsKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCisJZW51bSBwczNfcmVnaW9uX3R5cGUgcmVnX3R5cGUsIHU2NCAqYnVzX2FkZHIsIHU2NCAqbGVuKTsKKworLyogcmVwb3NpdG9yeSBibG9jayBkZXZpY2UgaW5mbyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcG9ydCh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHU2NCAqcG9ydCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfYmxrX3NpemUodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1NjQgKmJsa19zaXplKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9udW1fYmxvY2tzKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdTY0ICpudW1fYmxvY2tzKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9udW1fcmVnaW9ucyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCAqbnVtX3JlZ2lvbnMpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ2lvbl9pZCh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCByZWdpb25faW5kZXgsCisJdW5zaWduZWQgaW50ICpyZWdpb25faWQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ2lvbl9zaXplKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwJdW5zaWduZWQgaW50IHJlZ2lvbl9pbmRleCwgdTY0ICpyZWdpb25fc2l6ZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnaW9uX3N0YXJ0KHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IHJlZ2lvbl9pbmRleCwgdTY0ICpyZWdpb25fc3RhcnQpOworCisvKiByZXBvc2l0b3J5IHB1IGFuZCBtZW1vcnkgaW5mbyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fcHUodW5zaWduZWQgaW50ICpudW1fcHUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfcHBlX2lkKHVuc2lnbmVkIGludCAqcHVfaW5kZXgsIHVuc2lnbmVkIGludCAqcHBlX2lkKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3JtX2Jhc2UodW5zaWduZWQgaW50IHBwZV9pZCwgdTY0ICpybV9iYXNlKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3JtX3NpemUodW5zaWduZWQgaW50IHBwZV9pZCwgdTY0ICpybV9zaXplKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3JlZ2lvbl90b3RhbCh1NjQgKnJlZ2lvbl90b3RhbCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9tbV9pbmZvKHU2NCAqcm1fYmFzZSwgdTY0ICpybV9zaXplLAorCXU2NCAqcmVnaW9uX3RvdGFsKTsKKworLyogcmVwb3NpdG9yeSBwbWUgaW5mbyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fYmUodW5zaWduZWQgaW50ICpudW1fYmUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYmVfbm9kZV9pZCh1bnNpZ25lZCBpbnQgYmVfaW5kZXgsIHU2NCAqbm9kZV9pZCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF90Yl9mcmVxKHU2NCBub2RlX2lkLCB1NjQgKnRiX2ZyZXEpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYmVfdGJfZnJlcSh1bnNpZ25lZCBpbnQgYmVfaW5kZXgsIHU2NCAqdGJfZnJlcSk7CisKKy8qIHJlcG9zaXRvcnkgJ090aGVyIE9TJyBhcmVhICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2FkZHIodTY0ICpscGFyX2FkZHIpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfc2l6ZSh1bnNpZ25lZCBpbnQgKnNpemUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfaW5mbyh1NjQgKmxwYXJfYWRkciwgdW5zaWduZWQgaW50ICpzaXplKTsKKworLyogcmVwb3NpdG9yeSBzcHUgaW5mbyAqLworCisvKioKKyAqIGVudW0gc3B1X3Jlc291cmNlX3R5cGUgLSBUeXBlIG9mIHNwdSByZXNvdXJjZS4KKyAqIEBzcHVfcmVzb3VyY2VfdHlwZV9zaGFyZWQ6IExvZ2ljYWwgc3B1IGlzIHNoYXJlZCB3aXRoIG90aGVyIHBhcnRpb25zLgorICogQHNwdV9yZXNvdXJjZV90eXBlX2V4Y2x1c2l2ZTogTG9naWNhbCBzcHUgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyIHBhcnRpb25zLgorICoKKyAqIFJldHVybmVkIGJ5IHBzM19yZXBvc2l0b3J5X3JlYWRfc3B1X3Jlc291cmNlX2lkKCkuCisgKi8KKworZW51bSBwczNfc3B1X3Jlc291cmNlX3R5cGUgeworCVBTM19TUFVfUkVTT1VSQ0VfVFlQRV9TSEFSRUQgPSAwLAorCVBTM19TUFVfUkVTT1VSQ0VfVFlQRV9FWENMVVNJVkUgPSAweDgwMDAwMDAwMDAwMDAwMDBVTCwKK307CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9zcHVfcmVzZXJ2ZWQodW5zaWduZWQgaW50ICpudW1fc3B1X3Jlc2VydmVkKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9zcHVfcmVzb3VyY2VfaWQodW5zaWduZWQgaW50ICpudW1fcmVzb3VyY2VfaWQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfc3B1X3Jlc291cmNlX2lkKHVuc2lnbmVkIGludCByZXNfaW5kZXgsCisJZW51bSBwczNfc3B1X3Jlc291cmNlX3R5cGUqIHJlc291cmNlX3R5cGUsIHVuc2lnbmVkIGludCAqcmVzb3VyY2VfaWQpOworCisKKy8qIHN5c3RlbSBidXMgcm91dGluZXMgKi8KKworZW51bSBwczNfbWF0Y2hfaWQgeworCVBTM19NQVRDSF9JRF9FSENJID0gMSwKKwlQUzNfTUFUQ0hfSURfT0hDSSwKKwlQUzNfTUFUQ0hfSURfR0VMSUMsCisJUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTLAorCVBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKK307CisKKy8qKgorICogc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAtIGEgZGV2aWNlIG9uIHRoZSBzeXN0ZW0gYnVzCisgKi8KKworc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSB7CisJZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQ7CisJc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisvKglzdHJ1Y3QgaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOyAtLSB3YWl0aW5nIGZvciBCZW4ncyBjbGVhbnVwcyAqLworCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqZF9yZWdpb247CisJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqbV9yZWdpb247CisJc3RydWN0IGRldmljZSBjb3JlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyIC0gYSBkcml2ZXIgZm9yIGEgZGV2aWNlIG9uIHRoZSBzeXN0ZW0gYnVzCisgKi8KKworc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciB7CisJZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQ7CisJc3RydWN0IGRldmljZV9kcml2ZXIgY29yZTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisvKglpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7ICovCisvKglpbnQgKCpyZXN1bWUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7ICovCit9OworCitpbnQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7CitpbnQgcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydik7Cit2b2lkIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydik7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKnRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcigKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIsIGNvcmUpOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICp0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoCisJc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UsIGNvcmUpOworfQorCisvKioKKyAqIHBzM19zeXN0ZW1fYnVzX3NldF9kcnZkYXRhIC0KKyAqIEBkZXY6IGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiBEYXRhIHRvIHNldAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwczNfc3lzdGVtX2J1c19zZXRfZHJpdmVyX2RhdGEoCisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWRldi0+Y29yZS5kcml2ZXJfZGF0YSA9IGRhdGE7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgKnBzM19zeXN0ZW1fYnVzX2dldF9kcml2ZXJfZGF0YSgKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+Y29yZS5kcml2ZXJfZGF0YTsKK30KKworLyogVGhlc2UgdHdvIG5lZWQgZ2xvYmFsIHNjb3BlIGZvciBnZXRfZG1hX29wcygpLiAqLworCitleHRlcm4gc3RydWN0IGJ1c190eXBlIHBzM19zeXN0ZW1fYnVzX3R5cGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3J0YXMuaAppbmRleCBkMzRmOWUxLi41YTBjMTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3J0YXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3J0YXMuaApAQCAtNTQsOCArNTQsNiBAQAogCXJ0YXNfYXJnX3QgKnJldHM7ICAgICAvKiBQb2ludGVyIHRvIHJldHVybiB2YWx1ZXMgaW4gYXJnc1tdLiAqLwogfTsgIAogCi1leHRlcm4gc3RydWN0IHJ0YXNfYXJncyBydGFzX3N0b3Bfc2VsZl9hcmdzOwotCiBzdHJ1Y3QgcnRhc190IHsKIAl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogcGh5c2ljYWwgYWRkcmVzcyBwb2ludGVyICovCiAJdW5zaWduZWQgbG9uZyBiYXNlOwkJLyogcGh5c2ljYWwgYWRkcmVzcyBwb2ludGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwYXJzZW1lbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGFyc2VtZW0uaAppbmRleCAzOGIxZWEzLi40OGFkODA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwYXJzZW1lbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BhcnNlbWVtLmgKQEAgLTksOCArOSwxNCBAQAogICogTUFYX1BIWVNNRU1fQklUUwkJMl5OOiBob3cgbXVjaCBtZW1vcnkgd2UgY2FuIGhhdmUgaW4gdGhhdCBzcGFjZQogICovCiAjZGVmaW5lIFNFQ1RJT05fU0laRV9CSVRTICAgICAgIDI0CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUzNfVVNFX0xQQVJfQUREUikKKyNkZWZpbmUgTUFYX1BIWVNBRERSX0JJVFMgICAgICAgNDcKKyNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUyAgICAgICAgNDcKKyNlbHNlCiAjZGVmaW5lIE1BWF9QSFlTQUREUl9CSVRTICAgICAgIDQ0CiAjZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMgICAgICAgIDQ0CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwogZXh0ZXJuIHZvaWQgY3JlYXRlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaAppbmRleCBlNzNlYTAwLi5mZGFkNDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKQEAgLTExMSwxNCArMTExLDEyIEBACiAJdTggKmxvY2FsX3N0b3JlOwogCXVuc2lnbmVkIGxvbmcgcHJvYmxlbV9waHlzOwogCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9ibGVtOwotCXN0cnVjdCBzcHVfcHJpdjEgX19pb21lbSAqcHJpdjE7CiAJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBzY2hlZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZnVsbF9saXN0OwogCWludCBudW1iZXI7Ci0JaW50IG5pZDsKIAl1bnNpZ25lZCBpbnQgaXJxc1szXTsKLQl1MzIgaXNyYzsKIAl1MzIgbm9kZTsKIAl1NjQgZmxhZ3M7CiAJdTY0IGRhcjsKQEAgLTE0NCw2ICsxNDIsNyBAQAogCWNoYXIgaXJxX2MxWzhdOwogCWNoYXIgaXJxX2MyWzhdOwogCisJdm9pZCogcGRhdGE7IC8qIHBsYXRmb3JtIHByaXZhdGUgZGF0YSAqLwogCXN0cnVjdCBzeXNfZGV2aWNlIHN5c2RldjsKIH07CiAKQEAgLTE3MCw2ICsxNjksMTMgQEAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIH0gc3B1ZnNfY2FsbHM7CiAKKy8qIGNvcmVkdW1wIGNhbGxzIGltcGxlbWVudGVkIGluIHNwdWZzICovCitzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzIHsKKwlhc21saW5rYWdlIGludCAoKmFyY2hfbm90ZXNfc2l6ZSkodm9pZCk7CisJYXNtbGlua2FnZSB2b2lkICgqYXJjaF93cml0ZV9ub3Rlcykoc3RydWN0IGZpbGUgKmZpbGUpOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKwogLyogcmV0dXJuIHN0YXR1cyBmcm9tIHNwdV9ydW4sIHNhbWUgYXMgaW4gbGlic3BlICovCiAjZGVmaW5lIFNQRV9FVkVOVF9ETUFfQUxJR05NRU5UCQkweDAwMDgJLypBIERNQSBhbGlnbm1lbnQgZXJyb3IgKi8KICNkZWZpbmUgU1BFX0VWRU5UX1NQRV9FUlJPUgkJMHgwMDEwCS8qQW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBlcnJvciovCkBAIC0xODIsOCArMTg4LDEwIEBACiAgKi8KICNkZWZpbmUgU1BVX0NSRUFURV9FVkVOVFNfRU5BQkxFRAkweDAwMDEKICNkZWZpbmUgU1BVX0NSRUFURV9HQU5HCQkJMHgwMDAyCisjZGVmaW5lIFNQVV9DUkVBVEVfTk9TQ0hFRAkJMHgwMDA0CisjZGVmaW5lIFNQVV9DUkVBVEVfSVNPTEFURQkJMHgwMDA4CiAKLSNkZWZpbmUgU1BVX0NSRUFURV9GTEFHX0FMTAkJMHgwMDAzIC8qIG1hc2sgb2YgYWxsIHZhbGlkIGZsYWdzICovCisjZGVmaW5lIFNQVV9DUkVBVEVfRkxBR19BTEwJCTB4MDAwZiAvKiBtYXNrIG9mIGFsbCB2YWxpZCBmbGFncyAqLwogCiAKICNpZmRlZiBDT05GSUdfU1BVX0ZTX01PRFVMRQpAQCAtMTk5LDYgKzIwNywxNSBAQAogfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCitpbnQgcmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyhzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzICpjYWxscyk7Cit2b2lkIHVucmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyhzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzICpjYWxscyk7CisKK2ludCBzcHVfYWRkX3N5c2Rldl9hdHRyKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyKTsKK3ZvaWQgc3B1X3JlbW92ZV9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cik7CisKK2ludCBzcHVfYWRkX3N5c2Rldl9hdHRyX2dyb3VwKHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJzKTsKK3ZvaWQgc3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cChzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycyk7CisKIAogLyoKICAqIE5vdGlmaWVyIGJsb2NrczoKQEAgLTI3Nyw2ICsyOTQsNyBAQAogCXUzMiBzcHVfcnVuY250bF9SVzsJCQkJCS8qIDB4NDAxYyAqLwogI2RlZmluZSBTUFVfUlVOQ05UTF9TVE9QCTBMCiAjZGVmaW5lIFNQVV9SVU5DTlRMX1JVTk5BQkxFCTFMCisjZGVmaW5lIFNQVV9SVU5DTlRMX0lTT0xBVEUJMkwKIAl1OCAgcGFkXzB4NDAyMF8weDQwMjRbMHg0XTsJCQkJLyogMHg0MDIwICovCiAJdTMyIHNwdV9zdGF0dXNfUjsJCQkJCS8qIDB4NDAyNCAqLwogI2RlZmluZSBTUFVfU1RPUF9TVEFUVVNfU0hJRlQgICAgICAgICAgIDE2CkBAIC0yODksOCArMzA3LDggQEAKICNkZWZpbmUgU1BVX1NUQVRVU19JTlZBTElEX0lOU1RSICAgICAgICAweDIwCiAjZGVmaW5lIFNQVV9TVEFUVVNfSU5WQUxJRF9DSCAgICAgICAgICAgMHg0MAogI2RlZmluZSBTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFICAgICAgIDB4ODAKLSNkZWZpbmUgU1BVX1NUQVRVU19JU09MQVRFRF9MT0FEX1NUQVVUVVMgMHgyMDAKLSNkZWZpbmUgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVVUVVMgMHg0MDAKKyNkZWZpbmUgU1BVX1NUQVRVU19JU09MQVRFRF9MT0FEX1NUQVRVUyAweDIwMAorI2RlZmluZSBTUFVfU1RBVFVTX0lTT0xBVEVEX0VYSVRfU1RBVFVTIDB4NDAwCiAJdTggIHBhZF8weDQwMjhfMHg0MDJjWzB4NF07CQkJCS8qIDB4NDAyOCAqLwogCXUzMiBzcHVfc3BlX1I7CQkJCQkJLyogMHg0MDJjICovCiAJdTggIHBhZF8weDQwMzBfMHg0MDM0WzB4NF07CQkJCS8qIDB4NDAzMCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9jc2EuaAppbmRleCA5NjRjMmQzLi5iZGJmOTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9jc2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9jc2EuaApAQCAtMTUxLDcgKzE1MSw2IEBACiAJdTY0IG1mY19maXJfY2hrc3RwX2VuYWJsZV9SVzsKIAl1NjQgc21mX3NiaV9zaWduYWxfc2VsOwogCXU2NCBzbWZfYXRvX3NpZ25hbF9zZWw7Ci0JdTY0IG1mY19zZHJfUlc7CiAJdTY0IHRsYl9pbmRleF9oaW50X1JPOwogCXU2NCB0bGJfaW5kZXhfVzsKIAl1NjQgdGxiX3Zwbl9SVzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X2luZm8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ1ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfaW5mby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBTUFUgaW5mbyBzdHJ1Y3R1cmVzCisgKgorICogKEMpIENvcHlyaWdodCAyMDA2IElCTSBDb3JwLgorICoKKyAqIEF1dGhvcjogRHdheW5lIEdyYW50IE1jQ29ubmVsbCA8ZGVjaW1hbEB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfU1BVX0lORk9fSAorI2RlZmluZSBfU1BVX0lORk9fSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2Vsc2UKK3N0cnVjdCBtZmNfY3Ffc3IgeworCV9fdTY0IG1mY19jcV9kYXRhMF9SVzsKKwlfX3U2NCBtZmNfY3FfZGF0YTFfUlc7CisJX191NjQgbWZjX2NxX2RhdGEyX1JXOworCV9fdTY0IG1mY19jcV9kYXRhM19SVzsKK307CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCitzdHJ1Y3Qgc3B1X2RtYV9pbmZvIHsKKwlfX3U2NCBkbWFfaW5mb190eXBlOworCV9fdTY0IGRtYV9pbmZvX21hc2s7CisJX191NjQgZG1hX2luZm9fc3RhdHVzOworCV9fdTY0IGRtYV9pbmZvX3N0YWxsX2FuZF9ub3RpZnk7CisJX191NjQgZG1hX2luZm9fYXRvbWljX2NvbW1hbmRfc3RhdHVzOworCXN0cnVjdCBtZmNfY3Ffc3IgZG1hX2luZm9fY29tbWFuZF9kYXRhWzE2XTsKK307CisKK3N0cnVjdCBzcHVfcHJveHlkbWFfaW5mbyB7CisJX191NjQgcHJveHlkbWFfaW5mb190eXBlOworCV9fdTY0IHByb3h5ZG1hX2luZm9fbWFzazsKKwlfX3U2NCBwcm94eWRtYV9pbmZvX3N0YXR1czsKKwlzdHJ1Y3QgbWZjX2NxX3NyIHByb3h5ZG1hX2luZm9fY29tbWFuZF9kYXRhWzhdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9wcml2MS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfcHJpdjEuaAppbmRleCAzMDBjNDU4Li42OWRjYjBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9wcml2MS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X3ByaXYxLmgKQEAgLTIxLDEyICsyMSwxMyBAQAogI2RlZmluZSBfU1BVX1BSSVYxX0gKICNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiBzdHJ1Y3Qgc3B1OwogCiAvKiBhY2Nlc3MgdG8gcHJpdjEgcmVnaXN0ZXJzICovCiAKLXN0cnVjdCBzcHVfcHJpdjFfb3BzCi17CitzdHJ1Y3Qgc3B1X3ByaXYxX29wcyB7CiAJdm9pZCAoKmludF9tYXNrX2FuZCkgKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7CiAJdm9pZCAoKmludF9tYXNrX29yKSAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKTsKIAl2b2lkICgqaW50X21hc2tfc2V0KSAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKTsKQEAgLTM3LDcgKzM4LDcgQEAKIAl1NjQgKCptZmNfZGFyX2dldCkgKHN0cnVjdCBzcHUgKnNwdSk7CiAJdTY0ICgqbWZjX2RzaXNyX2dldCkgKHN0cnVjdCBzcHUgKnNwdSk7CiAJdm9pZCAoKm1mY19kc2lzcl9zZXQpIChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBkc2lzcik7Ci0Jdm9pZCAoKm1mY19zZHJfc2V0KSAoc3RydWN0IHNwdSAqc3B1LCB1NjQgc2RyKTsKKwl2b2lkICgqbWZjX3Nkcl9zZXR1cCkgKHN0cnVjdCBzcHUgKnNwdSk7CiAJdm9pZCAoKm1mY19zcjFfc2V0KSAoc3RydWN0IHNwdSAqc3B1LCB1NjQgc3IxKTsKIAl1NjQgKCptZmNfc3IxX2dldCkgKHN0cnVjdCBzcHUgKnNwdSk7CiAJdm9pZCAoKm1mY190Y2xhc3NfaWRfc2V0KSAoc3RydWN0IHNwdSAqc3B1LCB1NjQgdGNsYXNzX2lkKTsKQEAgLTExMiw5ICsxMTMsOSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNwdV9tZmNfc2RyX3NldCAoc3RydWN0IHNwdSAqc3B1LCB1NjQgc2RyKQorc3B1X21mY19zZHJfc2V0dXAgKHN0cnVjdCBzcHUgKnNwdSkKIHsKLQlzcHVfcHJpdjFfb3BzLT5tZmNfc2RyX3NldChzcHUsIHNkcik7CisJc3B1X3ByaXYxX29wcy0+bWZjX3Nkcl9zZXR1cChzcHUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTE3MSwxMiArMTcyLDQxIEBACiAJcmV0dXJuIHNwdV9wcml2MV9vcHMtPnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldChzcHUpOwogfQogCi0vKiBUaGUgZGVjbGFyYXRpb25zIGZvbG93aW5nIGFyZSBwdXQgaGVyZSBmb3IgY29udmVuaWVuY2UKLSAqIGFuZCBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHBsYXRmb3JtIHNldHVwIGNvZGUKLSAqIGZvciBpbml0aWFsaXppbmcgc3B1X3ByaXYxX29wcy4KKy8qIHNwdSBtYW5hZ2VtZW50IGFic3RyYWN0aW9uICovCisKK3N0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMgeworCWludCAoKmVudW1lcmF0ZV9zcHVzKShpbnQgKCpmbikodm9pZCAqZGF0YSkpOworCWludCAoKmNyZWF0ZV9zcHUpKHN0cnVjdCBzcHUgKnNwdSwgdm9pZCAqZGF0YSk7CisJaW50ICgqZGVzdHJveV9zcHUpKHN0cnVjdCBzcHUgKnNwdSk7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHNwdV9tYW5hZ2VtZW50X29wcyogc3B1X21hbmFnZW1lbnRfb3BzOworCitzdGF0aWMgaW5saW5lIGludAorc3B1X2VudW1lcmF0ZV9zcHVzIChpbnQgKCpmbikodm9pZCAqZGF0YSkpCit7CisJcmV0dXJuIHNwdV9tYW5hZ2VtZW50X29wcy0+ZW51bWVyYXRlX3NwdXMoZm4pOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3B1X2NyZWF0ZV9zcHUgKHN0cnVjdCBzcHUgKnNwdSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gc3B1X21hbmFnZW1lbnRfb3BzLT5jcmVhdGVfc3B1KHNwdSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzcHVfZGVzdHJveV9zcHUgKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X21hbmFnZW1lbnRfb3BzLT5kZXN0cm95X3NwdShzcHUpOworfQorCisvKgorICogVGhlIGRlY2xhcmF0aW9ucyBmb2xvd2luZyBhcmUgcHV0IGhlcmUgZm9yIGNvbnZlbmllbmNlCisgKiBhbmQgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSBwbGF0Zm9ybSBzZXR1cCBjb2RlLgogICovCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc3B1X3ByaXYxX29wcyBzcHVfcHJpdjFfbW1pb19vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHNwdV9tYW5hZ2VtZW50X29wcyBzcHVfbWFuYWdlbWVudF9vZl9vcHM7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9kYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b2RjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYThjMzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90b2RjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoKLSAqIERlZmluaXRpb25zIGZvciB0aGUgTTQ4VHh4IGFuZCBtYzE0NjgxOCBzZXJpZXMgb2YgVGltZSBvZiBkYXkvUmVhbCBUaW1lCi0gKiBDbG9jayBjaGlwcy4KLSAqCi0gKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgotICoKLSAqIDIwMDEgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotLyoKLSAqIFN1cHBvcnQgZm9yIHRoZSBNNDhUMzcvTTQ4VDU5Ly4uLi9tYzE0NjgxOCBSZWFsIFRpbWUgQ2xvY2sgY2hpcHMuCi0gKiBQdXJwb3NlIGlzIHRvIG1ha2Ugb25lIGdlbmVyaWMgZmlsZSB0aGF0IGhhbmRsZXMgYWxsIG9mIHRoZXNlIGNoaXBzIGluc3RlYWQKLSAqIG9mIGV2ZXJ5IHBsYXRmb3JtIGltcGxlbWVudGluZyB0aGUgc2FtZSBjb2RlIG92ZXIgJiBvdmVyIGFnYWluLgotICovCi0KLSNpZm5kZWYgX19QUENfS0VSTkVMX1RPRENfSAotI2RlZmluZSBfX1BQQ19LRVJORUxfVE9EQ19ICi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1aW50IHJ0Y190eXBlOwkJLyogeW91ciBwYXJ0aWN1bGFyIGNoaXAgKi8KLQotCS8qCi0JICogRm9sbG93aW5nIGFyZSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBBUzAsIEFTMSwgYW5kIERBVEEgcmVnaXN0ZXJzCi0JICogb2YgdGhlc2UgY2hpcHMuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGJvYXJkLXNwZWNpZmljLgotCSAqLwotCXVuc2lnbmVkIGludCBudnJhbV9hczA7Ci0JdW5zaWduZWQgaW50IG52cmFtX2FzMTsKLQl1bnNpZ25lZCBpbnQgbnZyYW1fZGF0YTsKLQotCS8qCi0JICogRGVmaW5lIGJpdHMgdG8gc3RvcCBleHRlcm5hbCBzZXQgb2YgcmVncyBmcm9tIGNoYW5naW5nIHNvCi0JICogdGhlIGNoaXAgY2FuIGJlIHJlYWQvd3JpdHRlbiByZWxpYWJseS4KLQkgKi8KLQl1bnNpZ25lZCBjaGFyIGVuYWJsZV9yZWFkOwotCXVuc2lnbmVkIGNoYXIgZW5hYmxlX3dyaXRlOwotCi0JLyoKLQkgKiBGb2xsb3dpbmcgaXMgdGhlIG51bWJlciBvZiBBUzAgYWRkcmVzcyBiaXRzLiAgVGhpcyBpcyBub3JtYWxseQotCSAqIDggYnV0IHNvbWUgYmFkIGhhcmR3YXJlIHJvdXRlcyBhZGRyZXNzIGxpbmVzIGluY29ycmVjdGx5LgotCSAqLwotCWludCBhczBfYml0czsKLQotCWludCBudnJhbV9zaXplOwkvKiBTaXplIG9mIE5WUkFNIG9uIGNoaXAgKi8KLQlpbnQgc3dfZmxhZ3M7CS8qIFNvZnR3YXJlIGNvbnRyb2wgZmxhZ3MgKi8KLQotCS8qIEZvbGxvd2luZyBhcmUgdGhlIHJlZ2lzdGVyIG9mZnNldHMgZm9yIHRoZSBwYXJ0aWN1bGFyIGNoaXAgKi8KLQlpbnQgeWVhcjsKLQlpbnQgbW9udGg7Ci0JaW50IGRheV9vZl9tb250aDsKLQlpbnQgZGF5X29mX3dlZWs7Ci0JaW50IGhvdXJzOwotCWludCBtaW51dGVzOwotCWludCBzZWNvbmRzOwotCWludCBjb250cm9sX2I7Ci0JaW50IGNvbnRyb2xfYTsKLQlpbnQgd2F0Y2hkb2c7Ci0JaW50IGludGVycnVwdHM7Ci0JaW50IGFsYXJtX2RhdGU7Ci0JaW50IGFsYXJtX2hvdXI7Ci0JaW50IGFsYXJtX21pbnV0ZXM7Ci0JaW50IGFsYXJtX3NlY29uZHM7Ci0JaW50IGNlbnR1cnk7Ci0JaW50IGZsYWdzOwotCi0JLyoKLQkgKiBTb21lIFJUQyBjaGlwcyBoYXZlIHRoZWlyIE5WUkFNIGJ1cmllZCBiZWhpbmQgYSBhZGRyL2RhdGEgcGFpciBvZgotCSAqIHJlZ3Mgb24gdGhlIGZpcnN0IGxldmVsL2Nsb2NrIHJlZ2lzdGVycy4gIFRoZSBmb2xsb3dpbmcgZmllbGRzCi0JICogYXJlIHRoZSBhZGRyZXNzZXMgZm9yIHRob3NlIGFkZHIvZGF0YSByZWdzLgotCSAqLwotCWludCBudnJhbV9hZGRyX3JlZzsKLQlpbnQgbnZyYW1fZGF0YV9yZWc7Ci19IHRvZGNfaW5mb190OwotCi0vKgotICogRGVmaW5lIHRoZSB0eXBlcyBvZiBUT0RDL1JUQyB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQgaW4KLSAqIGFyY2gvcHBjL2tlcm5lbC90b2RjX3RpbWUuYwotICogTWFrZSBhIG5ldyBvbmUgb2YgdGhlc2UgZm9yIGFueSBjaGlwIHNvbWVob3cgZGlmZmVycyBmcm9tIHdoYXQncyBhbHJlYWR5Ci0gKiBkZWZpbmVkLiAgVGhhdCB3YXksIGlmIHlvdSBldmVyIG5lZWQgdG8gcHV0IGluIGNvZGUgdG8gdG91Y2ggdGhvc2UKLSAqIGJpdHMvcmVnaXN0ZXJzIGluIHRvZGNfdGltZS5jLCB5b3UgY2FuIHB1dCBpdCBpbnNpZGUgYW4KLSAqICdpZiAodG9kY19pbmZvLT5ydGNfdHlwZSA9PSBUT0RDX1RZUEVfWFhYKScgc28geW91IHdvbid0IGJyZWFrCi0gKiBhbnlvbmUgZWxzZS4KLSAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNQkJMQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNwkJMgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OQkJMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzCQk0CS8qIERhbGxhcyBEUzE2OTMgUlRDICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDMJCTUJLyogRGFsbGFzIERTMTc0MyBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0NgkJNgkvKiBEYWxsYXMgRFMxNzQ2IFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3CQk3CS8qIERhbGxhcyBEUzE3NDcgUlRDICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDEJCTgJLyogRGFsbGFzIERTMTUwMSBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0MwkJOQkvKiBEYWxsYXMgRFMxNjQzIFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwNwkJMTAJLyogUEM5NzMwNyBpbnRlcm5hbCBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1NwkJMTEJLyogRGFsbGFzIERTMTU1NyBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODUJCTEyCS8qIERhbGxhcyBEUzE3Mjg1IFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzCQkxMwkvKiBEYWxsYXMgRFMxNTUzIFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MTgJCTEwMAkvKiBMZWF2ZSByb29tIGZvciBtNDh0eHgncyAqLwotCi0vKgotICogQml0IHRvIGNsZWFyL3NldCB0byBlbmFibGUgcmVhZHMvd3JpdGVzIHRvIHRoZSBjaGlwCi0gKi8KLSNkZWZpbmUgVE9EQ19NSzQ4VFhYX0NOVExfQV9SCQkweDQwCi0jZGVmaW5lIFRPRENfTUs0OFRYWF9DTlRMX0FfVwkJMHg4MAotI2RlZmluZSBUT0RDX01LNDhUWFhfREFZX0NCCQkweDgwCi0KLSNkZWZpbmUgVE9EQ19EUzE1MDFfQ05UTF9CX1RFCQkweDgwCi0KLS8qCi0gKiBEZWZpbmUgZmxhZyBiaXRzIHVzZWQgYnkgdG9kYyByb3V0aW5lcy4KLSAqLwotI2RlZmluZSBUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTQkJMHgwMDAwMDAwMQotCi0vKgotICogRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSB2YXJpb3VzIFJUQydzIHRoYXQgc2hvdWxkIHRvIGludG8gdGhlIHRvZGNfaW5mbwotICogdGFibGUuCi0gKiBOb3RlOiBUaGUgWFhYX05WUkFNX1NJWkUsIFhYWF9OVlJBTV9BRERSX1JFRywgYW5kIFhYWF9OVlJBTV9EQVRBX1JFRyBvbmx5Ci0gKiBtYXR0ZXIgaWYgWFhYX1NXX0ZMQUdTIGhhcyBUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTSBzZXQuCi0gKi8KLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTlZSQU1fU0laRQkJMHg3ZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X1lFQVIJCQkweDdmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTU9OVEgJCQkweDdmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfRE9NCQkJMHg3ZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9ET1cJCQkweDdmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfSE9VUlMJCQkweDdmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTUlOVVRFUwkJMHg3ZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X1NFQ09ORFMJCTB4N2ZmOQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9DTlRMX0IJCTB4N2ZmOQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9DTlRMX0EJCTB4N2ZmOAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9XQVRDSERPRwkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X0lOVEVSUlVQVFMJCTB4MDAwMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9BTEFSTV9EQVRFCQkweDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfQUxBUk1fSE9VUgkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X0FMQVJNX01JTlVURVMJCTB4MDAwMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9BTEFSTV9TRUNPTkRTCQkweDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfQ0VOVFVSWQkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X0ZMQUdTCQkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X05WUkFNX0FERFJfUkVHCTAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTlZSQU1fREFUQV9SRUcJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X05WUkFNX1NJWkUJCTB4N2ZmMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19TV19GTEFHUwkJMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19ZRUFSCQkJMHg3ZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X01PTlRICQkJMHg3ZmZlCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0RPTQkJCTB4N2ZmZAkvKiBEYXkgb2YgTW9udGggKi8KLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfRE9XCQkJMHg3ZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0hPVVJTCQkJMHg3ZmZiCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X01JTlVURVMJCTB4N2ZmYQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19TRUNPTkRTCQkweDdmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQ05UTF9CCQkweDdmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQ05UTF9BCQkweDdmZjgKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfV0FUQ0hET0cJCTB4N2ZmNwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19JTlRFUlJVUFRTCQkweDdmZjYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQUxBUk1fREFURQkJMHg3ZmY1Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0FMQVJNX0hPVVIJCTB4N2ZmNAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19BTEFSTV9NSU5VVEVTCQkweDdmZjMKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQUxBUk1fU0VDT05EUwkJMHg3ZmYyCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0NFTlRVUlkJCTB4N2ZmMQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19GTEFHUwkJCTB4N2ZmMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19OVlJBTV9BRERSX1JFRwkwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X05WUkFNX0RBVEFfUkVHCTAKLQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9OVlJBTV9TSVpFCQkweDFmZjAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfWUVBUgkJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9NT05USAkJCTB4MWZmZQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0RPVwkJCTB4MWZmYwkvKiBEYXkgb2YgV2VlayAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9IT1VSUwkJCTB4MWZmYgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfU0VDT05EUwkJMHgxZmY5Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0NOVExfQgkJMHgxZmY5Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0NOVExfQQkJMHgxZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X1dBVENIRE9HCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfSU5URVJSVVBUUwkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0FMQVJNX0RBVEUJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9BTEFSTV9IT1VSCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfQUxBUk1fTUlOVVRFUwkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0FMQVJNX1NFQ09ORFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9DRU5UVVJZCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfRkxBR1MJCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfTlZSQU1fQUREUl9SRUcJMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9OVlJBTV9EQVRBX1JFRwkwCi0KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFCTB4MTAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfU1dfRkxBR1MJVE9EQ19GTEFHXzJfTEVWRUxfTlZSQU0KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9ZRUFSCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwNikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9NT05USAkJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4MDUpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfRE9NCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwNCkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9ET1cJCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDAzKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0hPVVJTCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwMikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9NSU5VVEVTCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDAxKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX1NFQ09ORFMJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4MDApCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfQ05UTF9CCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwZikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9DTlRMX0EJCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDBmKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX1dBVENIRE9HCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweGZmKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0lOVEVSUlVQVFMJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4ZmYpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfQUxBUk1fREFURQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwYikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9BTEFSTV9IT1VSCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDBhKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0FMQVJNX01JTlVURVMJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4MDkpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfQUxBUk1fU0VDT05EUwkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwOCkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9DRU5UVVJZCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDA3KQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0ZMQUdTCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHhmZikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9BRERSX1JFRwkweDEwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fREFUQV9SRUcJMHgxMwotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfTlZSQU1fU0laRQkJMHgxZmYwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19ZRUFSCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfTU9OVEgJCQkweDFmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfRE9XCQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfSE9VUlMJCQkweDFmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19TRUNPTkRTCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19DTlRMX0IJCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19DTlRMX0EJCQkweDFmZjgJLyogY29udHJvbF9hIFIvVyByZWdzICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfV0FUQ0hET0cJCTB4MWZmNwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0lOVEVSUlVQVFMJCTB4MWZmNgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX0RBVEUJCTB4MWZmNQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX0hPVVIJCTB4MWZmNAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX01JTlVURVMJCTB4MWZmMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX1NFQ09ORFMJCTB4MWZmMgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0NFTlRVUlkJCTB4MWZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0ZMQUdTCQkJMHgxZmYwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfTlZSQU1fU0laRQkJMHg3ZmZmMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfWUVBUgkJCTB4N2ZmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19NT05USAkJCTB4N2ZmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19ET00JCQkweDdmZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0RPVwkJCTB4N2ZmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19IT1VSUwkJCTB4N2ZmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19NSU5VVEVTCQkweDdmZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfU0VDT05EUwkJMHg3ZmZmOQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0NOVExfQgkJCTB4N2ZmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19DTlRMX0EJCQkweDdmZmY4CS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X1dBVENIRE9HCQkweDdmZmY3Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfSU5URVJSVVBUUwkJMHg3ZmZmNgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0FMQVJNX0RBVEUJCTB4N2ZmZjUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19BTEFSTV9IT1VSCQkweDdmZmY0Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfQUxBUk1fTUlOVVRFUwkJMHg3ZmZmMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0FMQVJNX1NFQ09ORFMJCTB4N2ZmZjIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19DRU5UVVJZCQkweDdmZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfRkxBR1MJCQkweDdmZmYwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfTlZSQU1fU0laRQkJMHgxZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19ZRUFSCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfTU9OVEgJCQkweDFmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfRE9XCQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfSE9VUlMJCQkweDFmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19TRUNPTkRTCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19DTlRMX0IJCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19DTlRMX0EJCQkweDFmZjgJLyogY29udHJvbF9hIFIvVyByZWdzICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfV0FUQ0hET0cJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0lOVEVSUlVQVFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX0RBVEUJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX0hPVVIJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX01JTlVURVMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX1NFQ09ORFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0NFTlRVUlkJCTB4MWZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0ZMQUdTCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTlZSQU1fU0laRQkJMCAvKiBOb3QgaGFuZGxlZCB5ZXQgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19TV19GTEFHUwkJMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX1lFQVIJCQkweDA5Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTU9OVEgJCQkweDA4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfRE9NCQkJMHgwNwkvKiBEYXkgb2YgTW9udGggKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19ET1cJCQkweDA2CS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfSE9VUlMJCQkweDA0Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTUlOVVRFUwkJMHgwMgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX1NFQ09ORFMJCTB4MDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19DTlRMX0IJCQkweDBiCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfQ05UTF9BCQkJMHgwYQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX1dBVENIRE9HCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfSU5URVJSVVBUUwkJMHhmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX0FMQVJNX0RBVEUJCTB4NDkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19BTEFSTV9IT1VSCQkweDA1Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfQUxBUk1fTUlOVVRFUwkJMHgwMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX0FMQVJNX1NFQ09ORFMJCTB4MDEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19DRU5UVVJZCQkweDQ4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfRkxBR1MJCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfTlZSQU1fU0laRQkJMHgxZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19ZRUFSCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfTU9OVEgJCQkweDFmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfRE9XCQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfSE9VUlMJCQkweDFmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19TRUNPTkRTCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19DTlRMX0IJCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19DTlRMX0EJCQkweDFmZjgJLyogY29udHJvbF9hIFIvVyByZWdzICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfV0FUQ0hET0cJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0lOVEVSUlVQVFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX0RBVEUJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX0hPVVIJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX01JTlVURVMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX1NFQ09ORFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0NFTlRVUlkJCTB4MWZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0ZMQUdTCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfTlZSQU1fU0laRQkJMHgxZmZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfWUVBUgkJCTB4MWZmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9NT05USAkJCTB4MWZmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9ET00JCQkweDFmZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0RPVwkJCTB4MWZmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9IT1VSUwkJCTB4MWZmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9NSU5VVEVTCQkweDFmZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfU0VDT05EUwkJMHgxZmZmOQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0NOVExfQgkJCTB4MWZmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9DTlRMX0EJCQkweDFmZmY4CS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X1dBVENIRE9HCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfSU5URVJSVVBUUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0FMQVJNX0RBVEUJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9BTEFSTV9IT1VSCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfQUxBUk1fTUlOVVRFUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0FMQVJNX1NFQ09ORFMJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9DRU5UVVJZCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfRkxBR1MJCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfTlZSQU1fU0laRQkJMHg3ZmZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfWUVBUgkJCTB4N2ZmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19NT05USAkJCTB4N2ZmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19ET00JCQkweDdmZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0RPVwkJCTB4N2ZmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19IT1VSUwkJCTB4N2ZmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19NSU5VVEVTCQkweDdmZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfU0VDT05EUwkJMHg3ZmZmOQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0NOVExfQgkJCTB4N2ZmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19DTlRMX0EJCQkweDdmZmY4CS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X1dBVENIRE9HCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfSU5URVJSVVBUUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0FMQVJNX0RBVEUJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19BTEFSTV9IT1VSCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfQUxBUk1fTUlOVVRFUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0FMQVJNX1NFQ09ORFMJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19DRU5UVVJZCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfRkxBR1MJCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUJCSgweDEwMDAtMHg4MCkgLyogNEt4OCBOVlJBTSAobWludXMgUlRDIHJlZ3MpICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X1NXX0ZMQUdTCQlUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9TRUNPTkRTCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MDApCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0FMQVJNX1NFQ09ORFMJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwMSkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfTUlOVVRFUwkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDAyKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9BTEFSTV9NSU5VVEVTCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MDMpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0hPVVJTCQkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDA0KQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9BTEFSTV9IT1VSCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MDUpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0RPVwkJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwNikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfRE9NCQkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDA3KQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9NT05USAkJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwOCkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfWUVBUgkJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwOSkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfQ05UTF9BCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MEEpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0NOVExfQgkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDBCKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9DTlRMX0MJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwQykKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfQ05UTF9ECQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MEQpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X1dBVENIRE9HCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0lOVEVSUlVQVFMJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfQUxBUk1fREFURQkJMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9DRU5UVVJZCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0ZMQUdTCQkJMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9BRERSX1JFRwkweDUwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX0RBVEFfUkVHCTB4NTMKLQotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfTlZSQU1fU0laRQkJMAkvKiBYWFhYICovCi0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9TV19GTEFHUwkJMAotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfWUVBUgkJCTB4MDkKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X01PTlRICQkweDA4Ci0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9ET00JCQkweDA3CS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfRE9XCQkJMHgwNgkvKiBEYXkgb2YgV2VlayAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfSE9VUlMJCTB4MDQKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X01JTlVURVMJCTB4MDIKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X1NFQ09ORFMJCTB4MDAKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0NOVExfQgkJMHgwYQotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfQ05UTF9BCQkweDBiCS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfV0FUQ0hET0cJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0lOVEVSUlVQVFMJCTB4MGMKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0FMQVJNX0RBVEUJCTB4ZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0FMQVJNX0hPVVIJCTB4MDUKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0FMQVJNX01JTlVURVMJMHgwMwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfQUxBUk1fU0VDT05EUwkweDAxCi0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9DRU5UVVJZCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9GTEFHUwkJMHhmZgotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfTlZSQU1fQUREUl9SRUcJMAotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfTlZSQU1fREFUQV9SRUcJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X05WUkFNX1NJWkUJCTAJLyogTm8gTlZSQU0/ICovCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X1lFQVIJCQkweDA5Ci0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X01PTlRICQkJMHgwOAotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19ET00JCQkweDA3CS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19ET1cJCQkweDA2CS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0hPVVJTCQkJMHgwNAotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19NSU5VVEVTCQkweDAyCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X1NFQ09ORFMJCTB4MDAKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfQ05UTF9CCQkweDBhCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0NOVExfQQkJMHgwYgkvKiBjb250cm9sX2EgUi9XIHJlZ3MgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfV0FUQ0hET0cJCTB4MGMKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfSU5URVJSVVBUUwkJMHgwZAotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19BTEFSTV9EQVRFCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0FMQVJNX0hPVVIJCTB4MDUKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfQUxBUk1fTUlOVVRFUwkJMHgwMwotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19BTEFSTV9TRUNPTkRTCQkweDAxCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0NFTlRVUlkJCTB4ZmYKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfRkxBR1MJCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X05WUkFNX0FERFJfUkVHCTAKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfTlZSQU1fREFUQV9SRUcJMAotCi0vKgotICogRGVmaW5lIG1hY3JvcyB0byBhbGxvY2F0ZSBhbmQgaW5pdCB0aGUgdG9kY19pbmZvX3QgdGFibGUgdGhhdCB3aWxsCi0gKiBiZSB1c2VkIGJ5IHRoZSB0b2RjX3RpbWUuYyByb3V0aW5lcy4KLSAqLwotI2RlZmluZSBUT0RDX0FMTE9DKCkJCQkJCQkJXAotCXN0YXRpYyB0b2RjX2luZm9fdCB0b2RjX2luZm9fYWxsb2M7CQkJCVwKLQl0b2RjX2luZm9fdCAqdG9kY19pbmZvID0gJnRvZGNfaW5mb19hbGxvYzsKLQotI2RlZmluZSBUT0RDX0lOSVQoY2xvY2tfdHlwZSwgYXMwLCBhczEsIGRhdGEsIGJpdHMpIHsJCQlcCi0JdG9kY19pbmZvLT5ydGNfdHlwZSA9IGNsb2NrX3R5cGU7CQkJCVwKLQkJCQkJCQkJCVwKLQl0b2RjX2luZm8tPm52cmFtX2FzMCA9ICh1bnNpZ25lZCBpbnQpKGFzMCk7CQkJXAotCXRvZGNfaW5mby0+bnZyYW1fYXMxID0gKHVuc2lnbmVkIGludCkoYXMxKTsJCQlcCi0JdG9kY19pbmZvLT5udnJhbV9kYXRhID0gKHVuc2lnbmVkIGludCkoZGF0YSk7CQkJXAotCQkJCQkJCQkJXAotCXRvZGNfaW5mby0+YXMwX2JpdHMgPSAoYml0cyk7CQkJCQlcCi0JCQkJCQkJCQlcCi0JdG9kY19pbmZvLT5udnJhbV9zaXplID0gY2xvY2tfdHlwZSAjI19OVlJBTV9TSVpFOwkJXAotCXRvZGNfaW5mby0+c3dfZmxhZ3MgPSBjbG9ja190eXBlICMjX1NXX0ZMQUdTOwkJCVwKLQkJCQkJCQkJCVwKLQl0b2RjX2luZm8tPnllYXIgPSBjbG9ja190eXBlICMjX1lFQVI7CQkJCVwKLQl0b2RjX2luZm8tPm1vbnRoID0gY2xvY2tfdHlwZSAjI19NT05USDsJCQkJXAotCXRvZGNfaW5mby0+ZGF5X29mX21vbnRoID0gY2xvY2tfdHlwZSAjI19ET007CQkJXAotCXRvZGNfaW5mby0+ZGF5X29mX3dlZWsgPSBjbG9ja190eXBlICMjX0RPVzsJCQlcCi0JdG9kY19pbmZvLT5ob3VycyA9IGNsb2NrX3R5cGUgIyNfSE9VUlM7CQkJCVwKLQl0b2RjX2luZm8tPm1pbnV0ZXMgPSBjbG9ja190eXBlICMjX01JTlVURVM7CQkJXAotCXRvZGNfaW5mby0+c2Vjb25kcyA9IGNsb2NrX3R5cGUgIyNfU0VDT05EUzsJCQlcCi0JdG9kY19pbmZvLT5jb250cm9sX2IgPSBjbG9ja190eXBlICMjX0NOVExfQjsJCQlcCi0JdG9kY19pbmZvLT5jb250cm9sX2EgPSBjbG9ja190eXBlICMjX0NOVExfQTsJCQlcCi0JdG9kY19pbmZvLT53YXRjaGRvZyA9IGNsb2NrX3R5cGUgIyNfV0FUQ0hET0c7CQkJXAotCXRvZGNfaW5mby0+aW50ZXJydXB0cyA9IGNsb2NrX3R5cGUgIyNfSU5URVJSVVBUUzsJCVwKLQl0b2RjX2luZm8tPmFsYXJtX2RhdGUgPSBjbG9ja190eXBlICMjX0FMQVJNX0RBVEU7CQlcCi0JdG9kY19pbmZvLT5hbGFybV9ob3VyID0gY2xvY2tfdHlwZSAjI19BTEFSTV9IT1VSOwkJXAotCXRvZGNfaW5mby0+YWxhcm1fbWludXRlcyA9IGNsb2NrX3R5cGUgIyNfQUxBUk1fTUlOVVRFUzsJCVwKLQl0b2RjX2luZm8tPmFsYXJtX3NlY29uZHMgPSBjbG9ja190eXBlICMjX0FMQVJNX1NFQ09ORFM7CQlcCi0JdG9kY19pbmZvLT5jZW50dXJ5ID0gY2xvY2tfdHlwZSAjI19DRU5UVVJZOwkJCVwKLQl0b2RjX2luZm8tPmZsYWdzID0gY2xvY2tfdHlwZSAjI19GTEFHUzsJCQkJXAotCQkJCQkJCQkJXAotCXRvZGNfaW5mby0+bnZyYW1fYWRkcl9yZWcgPSBjbG9ja190eXBlICMjX05WUkFNX0FERFJfUkVHOwlcCi0JdG9kY19pbmZvLT5udnJhbV9kYXRhX3JlZyA9IGNsb2NrX3R5cGUgIyNfTlZSQU1fREFUQV9SRUc7CVwKLX0KLQotZXh0ZXJuIHRvZGNfaW5mb190ICp0b2RjX2luZm87Ci0KLXVuc2lnbmVkIGNoYXIgdG9kY19kaXJlY3RfcmVhZF92YWwoaW50IGFkZHIpOwotdm9pZCB0b2RjX2RpcmVjdF93cml0ZV92YWwoaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKTsKLXVuc2lnbmVkIGNoYXIgdG9kY19tNDh0eHhfcmVhZF92YWwoaW50IGFkZHIpOwotdm9pZCB0b2RjX200OHR4eF93cml0ZV92YWwoaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKTsKLXVuc2lnbmVkIGNoYXIgdG9kY19tYzE0NjgxOF9yZWFkX3ZhbChpbnQgYWRkcik7Ci12b2lkIHRvZGNfbWMxNDY4MThfd3JpdGVfdmFsKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCk7Ci0KLWxvbmcgdG9kY190aW1lX2luaXQodm9pZCk7Ci12b2lkIHRvZGNfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqKTsKLWludCB0b2RjX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKik7Ci12b2lkIHRvZGNfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci0KLSNlbmRpZgkJCQkvKiBfX1BQQ19LRVJORUxfVE9EQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKaW5kZXggOWZlNzg5NC4uNTBjMDE0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaApAQCAtMzIsNyArMzIsMTQgQEAKIGludCBvZl9ub2RlX3RvX25pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSk7CiAKIHN0cnVjdCBwY2lfYnVzOworI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiBpbnQgcGNpYnVzX3RvX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcGNpYnVzX3RvX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKIAogI2RlZmluZSBwY2lidXNfdG9fY3B1bWFzayhidXMpCShwY2lidXNfdG9fbm9kZShidXMpID09IC0xID8gXAogCQkJCQlDUFVfTUFTS19BTEwgOiBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RzaTEwOC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90c2kxMDguaAppbmRleCAyYzcwMmQzLi40ZTk1ZDE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RzaTEwOC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdHNpMTA4LmgKQEAgLTk4LDEyICs5OCwxMiBAQAogZXh0ZXJuIHUzMiBnZXRfdmlyX2NzcmJhc2Uodm9pZCk7CiBleHRlcm4gdTMyIHRzaTEwOF9jc3JfdmlyX2Jhc2U7CiAKLWV4dGVybiBpbmxpbmUgdTMyIHRzaTEwOF9yZWFkX3JlZyh1MzIgcmVnX29mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIHRzaTEwOF9yZWFkX3JlZyh1MzIgcmVnX29mZnNldCkKIHsKIAlyZXR1cm4gaW5fYmUzMigodm9sYXRpbGUgdTMyICopKHRzaTEwOF9jc3JfdmlyX2Jhc2UgKyByZWdfb2Zmc2V0KSk7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCB0c2kxMDhfd3JpdGVfcmVnKHUzMiByZWdfb2Zmc2V0LCB1MzIgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIHRzaTEwOF93cml0ZV9yZWcodTMyIHJlZ19vZmZzZXQsIHUzMiB2YWwpCiB7CiAJb3V0X2JlMzIoKHZvbGF0aWxlIHUzMiAqKSh0c2kxMDhfY3NyX3Zpcl9iYXNlICsgcmVnX29mZnNldCksIHZhbCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3R5cGVzLmgKaW5kZXggZDZmYjU2Yi4uM2IzNjM3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdHlwZXMuaApAQCAtOTcsMTYgKzk3LDYgQEAKIAl1bnNpZ25lZCBsb25nIGVudjsKIH0gZnVuY19kZXNjcl90OwogCi0jaWZkZWYgQ09ORklHX0xCRAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0xTRgotdHlwZWRlZiB1NjQgYmxrY250X3Q7Ci0jZGVmaW5lIEhBVkVfQkxLQ05UX1QKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWFjY2Vzcy5oCmluZGV4IGQ4M2ZjMjkuLmFkYmYxNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWFjY2Vzcy5oCkBAIC0zMDQsNyArMzA0LDcgQEAKIAogI2lmbmRlZiBfX3Bvd2VycGM2NF9fCiAKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKIAkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAl1bnNpZ25lZCBsb25nIG92ZXI7CkBAIC0zMTksNyArMzE5LDcgQEAKIAlyZXR1cm4gbjsKIH0KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywKIAkJY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCXVuc2lnbmVkIGxvbmcgb3ZlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuaXN0ZC5oCmluZGV4IDBlNGVhMzcuLjA0YjZjMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy91bmlzdGQuaApAQCAtNDQ2LDcgKzQ0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgpAQCAtNDgxLDE2ICs0ODAsOSBAQAogCiAvKgogICogIkNvbmRpdGlvbmFsIiBzeXNjYWxscwotICoKLSAqIFdoYXQgd2Ugd2FudCBpcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrLGFsaWFzKCJzeXNfbmlfc3lzY2FsbCIpKSksCi0gKiBidXQgaXQgZG9lc24ndCB3b3JrIG9uIGFsbCB0b29sY2hhaW5zLCBzbyB3ZSBqdXN0IGRvIGl0IGJ5IGhhbmQKICAqLwotI2lmZGVmIENPTkZJR19QUEMzMgotI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgYXNtKCIud2Vha1x0IiAjeCAiXG5cdC5zZXRcdCIgI3ggIixzeXNfbmlfc3lzY2FsbCIpCi0jZWxzZQotI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgYXNtKCIud2Vha1x0LiIgI3ggIlxuXHQuc2V0XHQuIiAjeCAiLC5zeXNfbmlfc3lzY2FsbCIpCi0jZW5kaWYKLQorI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgXAorCWFzbWxpbmthZ2UgbG9uZyB4ICh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLGFsaWFzKCJzeXNfbmlfc3lzY2FsbCIpKSkKIAogI2VuZGlmCQkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmgKaW5kZXggNGI1MWQ0Mi4uMDExN2I1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCkBAIC00NSw3ICs0NSw2IEBACiAgKiBUaGUgdmlvX2RldiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSB2aXJ0dWFsIEkvTyBkZXZpY2VzLgogICovCiBzdHJ1Y3QgdmlvX2RldiB7Ci0Jc3RydWN0IGlvbW11X3RhYmxlICppb21tdV90YWJsZTsgICAgIC8qIHZpb19tYXBfKiB1c2VzIHRoaXMgKi8KIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKnR5cGU7CiAJdWludDMyX3QgdW5pdF9hZGRyZXNzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy94bW9uLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3htb24uaAppbmRleCBmMWQzMzdlLi44ODMyMGEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3htb24uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3htb24uaApAQCAtMTQsOCArMTQsMTAgQEAKIAogI2lmZGVmIENPTkZJR19YTU9OCiBleHRlcm4gdm9pZCB4bW9uX3NldHVwKHZvaWQpOworZXh0ZXJuIHZvaWQgeG1vbl9yZWdpc3Rlcl9zcHVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB4bW9uX3NldHVwKHZvaWQpIHsgfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bW9uX3JlZ2lzdGVyX3NwdXMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkgeyB9OwogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTCBfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2RldmljZS5oIGIvaW5jbHVkZS9hc20tcHBjL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2lvLmggYi9pbmNsdWRlL2FzbS1wcGMvaW8uaAppbmRleCBhNGM0MTFiLi5jY2YxYTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvaW8uaApAQCAtMjYsMTcgKzI2LDExIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR180eHgpCiAjaW5jbHVkZSA8YXNtL2libTR4eC5oPgotI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX01QQzUyeHgpCi0jaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KICNlbGlmIGRlZmluZWQoQ09ORklHXzh4eCkKICNpbmNsdWRlIDxhc20vbXBjOHh4Lmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR184MjYwKQogI2luY2x1ZGUgPGFzbS9tcGM4MjYwLmg+Ci0jZWxpZiBkZWZpbmVkKENPTkZJR184M3h4KQotI2luY2x1ZGUgPGFzbS9tcGM4M3h4Lmg+Ci0jZWxpZiBkZWZpbmVkKENPTkZJR184NXh4KQotI2luY2x1ZGUgPGFzbS9tcGM4NXh4Lmg+Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19BUFVTKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVBVUykgfHwgIWRlZmluZWQoQ09ORklHX1BDSSkKICNkZWZpbmUgX0lPX0JBU0UJMAogI2RlZmluZSBfSVNBX01FTV9CQVNFCTAKICNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUIDAKQEAgLTIzNyw2ICsyMzEsMTQgQEAKICNkZWZpbmUgaW5zbChwb3J0LCBidWYsIG5sKQlfaW5zbF9ucygocG9ydCkrX19fSU9fQkFTRSwgKGJ1ZiksIChubCkpCiAjZGVmaW5lIG91dHNsKHBvcnQsIGJ1ZiwgbmwpCV9vdXRzbF9ucygocG9ydCkrX19fSU9fQkFTRSwgKGJ1ZiksIChubCkpCiAKKyNkZWZpbmUgcmVhZHNiKGEsIGIsIG4pCQlfaW5zYigoYSksIChiKSwgKG4pKQorI2RlZmluZSByZWFkc3coYSwgYiwgbikJCV9pbnN3X25zKChhKSwgKGIpLCAobikpCisjZGVmaW5lIHJlYWRzbChhLCBiLCBuKQkJX2luc2xfbnMoKGEpLCAoYiksIChuKSkKKyNkZWZpbmUgd3JpdGVzYihhLCBiLCBuKQlfb3V0c2IoKGEpLChiKSwobikpCisjZGVmaW5lIHdyaXRlc3coYSwgYiwgbikJX291dHN3X25zKChhKSwoYiksKG4pKQorI2RlZmluZSB3cml0ZXNsKGEsIGIsIG4pCV9vdXRzbF9ucygoYSksKGIpLChuKSkKKworCiAvKgogICogT24gcG93ZXJtYWNzIGFuZCA4eHggd2Ugd2lsbCBnZXQgYSBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiAKICAqIGlmIHdlIHRyeSB0byByZWFkIGRhdGEgZnJvbSBhIG5vbi1leGlzdGVudCBJL08gcG9ydC4gQmVjYXVzZQpAQCAtMzI3LDEyICszMjksMTIgQEAKICNkZWZpbmUgaW5sX3AocG9ydCkJCWlubCgocG9ydCkpCiAjZGVmaW5lIG91dGxfcCh2YWwsIHBvcnQpCW91dGwoKHZhbCksIChwb3J0KSkKIAotZXh0ZXJuIHZvaWQgX2luc2Iodm9sYXRpbGUgdTggX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9vdXRzYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX2luc3dfbnModm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBfb3V0c3dfbnModm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBfaW5zbF9ucyh2b2xhdGlsZSB1MzIgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9vdXRzbF9ucyh2b2xhdGlsZSB1MzIgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9pbnNiKGNvbnN0IHZvbGF0aWxlIHU4IF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfb3V0c2Iodm9sYXRpbGUgdTggX19pb21lbSAqYWRkcixjb25zdCB2b2lkICpidWYsbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfaW5zd19ucyhjb25zdCB2b2xhdGlsZSB1MTYgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9vdXRzd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9pbnNsX25zKGNvbnN0IHZvbGF0aWxlIHUzMiBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX291dHNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGxvbmcgY291bnQpOwogCiAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgfjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tNDh0MzUuaCBiL2luY2x1ZGUvYXNtLXBwYy9tNDh0MzUuaAppbmRleCBmM2M1ZTVkLi5hNTI3N2VhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbTQ4dDM1LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL200OHQzNS5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIE00OFQzNV9SVENfV0FUQ0hET0dfUkIgICAgICAgICAweDAzCiAjZGVmaW5lIE00OFQzNV9SVENfV0FUQ0hET0dfQk1CICAgICAgICAweDdjCiAjZGVmaW5lIE00OFQzNV9SVENfV0FUQ0hET0dfV0RTICAgICAgICAweDgwCi0jZGVmaW5lIE00OFQzNV9SVENfV0FUQ0hET0dfQUxMICAgICAgICAoTTQ4VDM1X1JUQ19XQVRDSERPR19SQnxNNDhUMzVfUlRDX1dBVENIRE9HX0JNQnxNNDhUMzVfUlRDX1cKKyNkZWZpbmUgTTQ4VDM1X1JUQ19XQVRDSERPR19BTEwgICAgICAgIChNNDhUMzVfUlRDX1dBVENIRE9HX1JCfE00OFQzNV9SVENfV0FUQ0hET0dfQk1CfE00OFQzNV9SVENfVykKIAogI2RlZmluZSBNNDhUMzVfUlRDX0NPTlRST0xfV1JJVEUgICAgICAgMHg4MAogI2RlZmluZSBNNDhUMzVfUlRDX0NPTlRST0xfUkVBRCAgICAgICAgMHg0MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21wYzUyeHguaCBiL2luY2x1ZGUvYXNtLXBwYy9tcGM1Mnh4LmgKaW5kZXggNjRjODg3NC4uZDlkMjFhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21wYzUyeHguaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbXBjNTJ4eC5oCkBAIC0yOSwxNyArMjksNiBAQAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIF9JT19CQVNFCWlzYV9pb19iYXNlCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UJaXNhX21lbV9iYXNlCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVAlwY2lfZHJhbV9vZmZzZXQKLSNlbHNlCi0jZGVmaW5lIF9JT19CQVNFCTAKLSNkZWZpbmUgX0lTQV9NRU1fQkFTRQkwCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVAkwCi0jZW5kaWYKLQotCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qIFBQQyBTeXMgZGV2aWNlcyBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbXBjODN4eC5oIGIvaW5jbHVkZS9hc20tcHBjL21wYzgzeHguaAppbmRleCAwMmVkMmMzLi5jMzA2MTk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbXBjODN4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4M3h4LmgKQEAgLTI1LDE0ICsyNSw2IEBACiAjaW5jbHVkZSA8cGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaD4KICNlbmRpZgogCi0jZGVmaW5lIF9JT19CQVNFICAgICAgICBpc2FfaW9fYmFzZQotI2RlZmluZSBfSVNBX01FTV9CQVNFICAgaXNhX21lbV9iYXNlCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgcGNpX2RyYW1fb2Zmc2V0Ci0jZWxzZQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgMAotI2VuZGlmCi0KIC8qCiAgKiBUaGUgInJlc2lkdWFsIiBib2FyZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdGhlIGJvb3QgbG9hZGVyIHBhc3NlcwogICogaW50byB0aGUga2VybmVsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21wYzg1eHguaCBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4NXh4LmgKaW5kZXggOWI0ODUxMS4uZDdlNGE3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21wYzg1eHguaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbXBjODV4eC5oCkBAIC00NCwxNCArNDQsNiBAQAogI2luY2x1ZGUgPHBsYXRmb3Jtcy84NXh4L3RxbTg1eHguaD4KICNlbmRpZgogCi0jZGVmaW5lIF9JT19CQVNFICAgICAgICBpc2FfaW9fYmFzZQotI2RlZmluZSBfSVNBX01FTV9CQVNFICAgaXNhX21lbV9iYXNlCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgcGNpX2RyYW1fb2Zmc2V0Ci0jZWxzZQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgMAotI2VuZGlmCi0KIC8qCiAgKiBUaGUgInJlc2lkdWFsIiBib2FyZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdGhlIGJvb3QgbG9hZGVyIHBhc3NlcwogICogaW50byB0aGUga2VybmVsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBwYy9wY2ktYnJpZGdlLmgKaW5kZXggOWQ1MjMwNi4uNmM5NTVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BjaS1icmlkZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcGNpLWJyaWRnZS5oCkBAIC00Myw2ICs0Myw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpuZXh0OwogICAgICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCXZvaWQgKmFyY2hfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CiAKIAlpbnQgZmlyc3RfYnVzbm87CiAJaW50IGxhc3RfYnVzbm87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1zMzkwL2NoZWNrc3VtLmgKaW5kZXggMzdjMzYyZC4uMGEzY2Q3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2hlY2tzdW0uaApAQCAtMjcsOCArMjcsOCBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMiBhc20oIjIiKSA9ICh1bnNpZ25lZCBsb25nKSBidWZmOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMyBhc20oIjMiKSA9ICh1bnNpZ25lZCBsb25nKSBsZW47CkBAIC00OSw5ICs0OSw5IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLAorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwpAQCAtNjYsOCArNjYsOCBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIChjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKICAgICAgICAgbWVtY3B5KGRzdCxzcmMsbGVuKTsKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwpAQCAtNzYsOCArNzYsNyBAQAogLyoKICAqICAgICAgRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0gd2l0aG91dCBhZGRpbmcgcHNldWRvIGhlYWRlcnMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAjaWZuZGVmIF9fczM5MHhfXwogCXJlZ2lzdGVyX3BhaXIgcnA7CkBAIC0xMDAsNyArOTksNyBAQAogCQkiCXNybAklMCwxNlxuIgkvKiAlMCA9IEgrTCtDICovCiAJCTogIismZCIgKHN1bSkgOiA6ICJjYyIsICIyIiwgIjMiKTsKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQlyZXR1cm4gKCh1bnNpZ25lZCBzaG9ydCkgfnN1bSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpIH5zdW07CiB9CiAKIC8qCkBAIC0xMDgsOCArMTA3LDcgQEAKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1pcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoaXBoLCBpaGwqNCwgMCkpOwogfQpAQCAtMTE4LDEwICsxMTYsMTAgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMzItYml0IGNoZWNrc3VtCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKyAgICAgICAgICAgICAgICAgICBfX3dzdW0gc3VtKQogewogI2lmbmRlZiBfX3MzOTB4X18KIAlhc20gdm9sYXRpbGUoCkBAIC0xMzcsMTIgKzEzNSwxMiBAQAogCQkiMToiCiAJCTogIismZCIgKHN1bSkgOiAiZCIgKGRhZGRyKSA6ICJjYyIpOwogCWFzbSB2b2xhdGlsZSgKLQkJIglhbHIJJTAsJTFcbiIgLyogc3VtICs9IChsZW48PDE2KSArIChwcm90bzw8OCkgKi8KKwkJIglhbHIJJTAsJTFcbiIgLyogc3VtICs9IGxlbiArIHByb3RvICovCiAJCSIJYnJjCTEyLDJmXG4iCiAJCSIJYWhpCSUwLDFcbiIgIC8qIGFkZCBjYXJyeSAqLwogCQkiMjoiCiAJCTogIismZCIgKHN1bSkKLQkJOiAiZCIgKCgodW5zaWduZWQgaW50KSBsZW48PDE2KSArICh1bnNpZ25lZCBpbnQpIHByb3RvKQorCQk6ICJkIiAobGVuICsgcHJvdG8pCiAJCTogImNjIik7CiAjZWxzZSAvKiBfX3MzOTB4X18gKi8KIAlhc20gdm9sYXRpbGUoCkBAIC0xNTMsNyArMTUxLDcgQEAKIAkJIjA6CWFsZ3IJJTAsJTJcbiIgIC8qIHN1bSArPSBkYWRkciAqLwogCQkiCWJyYwkxMiwxZlxuIgogCQkiCWFnaGkJJTAsMVxuIiAgIC8qIGFkZCBjYXJyeSAqLwotCQkiMToJYWxnZnIJJTAsJTNcbiIgIC8qIHN1bSArPSAobGVuPDwxNikgKyBwcm90byAqLworCQkiMToJYWxnZnIJJTAsJTNcbiIgIC8qIHN1bSArPSBsZW4gKyBwcm90byAqLwogCQkiCWJyYwkxMiwyZlxuIgogCQkiCWFnaGkJJTAsMVxuIiAgIC8qIGFkZCBjYXJyeSAqLwogCQkiMjoJc3JsZwkwLCUwLDMyXG4iCkBAIC0xNjMsNyArMTYxLDcgQEAKIAkJIjM6CWxsZ2ZyCSUwLCUwIgogCQk6ICIrJmQiIChzdW0pCiAJCTogImQiIChzYWRkciksICJkIiAoZGFkZHIpLAotCQkgICJkIiAoKCh1bnNpZ25lZCBpbnQpIGxlbjw8MTYpICsgKHVuc2lnbmVkIGludCkgcHJvdG8pCisJCSAgImQiIChsZW4gKyBwcm90bykKIAkJOiAiY2MiLCAiMCIpOwogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCXJldHVybiBzdW07CkBAIC0xNzQsMTAgKzE3MiwxMCBAQAogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKyAgICAgICAgICAgICAgICAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTg3LDggKzE4NSw3IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1pcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Npby5oIGIvaW5jbHVkZS9hc20tczM5MC9jaW8uaAppbmRleCA4MTI4N2Q4Li5kOTI3ODUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2Npby5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmgKQEAgLTI3OCwxNyArMjc4LDE2IEBACiBzdGF0aWMgaW5saW5lIGludCBjY3dfZGV2X2lkX2lzX2VxdWFsKHN0cnVjdCBjY3dfZGV2X2lkICpkZXZfaWQxLAogCQkJCSAgICAgIHN0cnVjdCBjY3dfZGV2X2lkICpkZXZfaWQyKQogewotCXJldHVybiAhbWVtY21wKGRldl9pZDEsIGRldl9pZDIsIHNpemVvZihzdHJ1Y3QgY2N3X2Rldl9pZCkpOworCWlmICgoZGV2X2lkMS0+c3NpZCA9PSBkZXZfaWQyLT5zc2lkKSAmJgorCSAgICAoZGV2X2lkMS0+ZGV2bm8gPT0gZGV2X2lkMi0+ZGV2bm8pKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogZXh0ZXJuIGludCBkaWFnMjEwKHN0cnVjdCBkaWFnMjEwICphZGRyKTsKIAogZXh0ZXJuIHZvaWQgd2FpdF9jb25zX2Rldih2b2lkKTsKIAotZXh0ZXJuIHZvaWQgY2xlYXJfYWxsX3N1YmNoYW5uZWxzKHZvaWQpOwotCi1leHRlcm4gdm9pZCBjaW9fcmVzZXRfY2hhbm5lbF9wYXRocyh2b2lkKTsKLQogZXh0ZXJuIHZvaWQgY3NzX3NjaGVkdWxlX3JlcHJvYmUodm9pZCk7CiAKIGV4dGVybiB2b2lkIHJlaXBsX2Njd19kZXYoc3RydWN0IGNjd19kZXZfaWQgKmlkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaAppbmRleCAxZmNmNjViLi40OGE5ZWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2NwY21kLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jcGNtZC5oCkBAIC03LDggKzcsOCBAQAogICogICAgICAgICAgICAgICBDaHJpc3RpYW4gQm9ybnRyYWVnZXIgKGNib3JudHJhQGRlLmlibS5jb20pLAogICovCiAKLSNpZm5kZWYgX19DUENNRF9fCi0jZGVmaW5lIF9fQ1BDTURfXworI2lmbmRlZiBfQVNNX1MzOTBfQ1BDTURfSAorI2RlZmluZSBfQVNNX1MzOTBfQ1BDTURfSAogCiAvKgogICogdGhlIGxvd2xldmVsIGZ1bmN0aW9uIGZvciBjcGNtZApAQCAtMTYsOSArMTYsNiBAQAogICovCiBleHRlcm4gaW50IF9fY3BjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4sIGludCAqcmVzcG9uc2VfY29kZSk7CiAKLSNpZm5kZWYgX19zMzkweF9fCi0jZGVmaW5lIGNwY21kIF9fY3BjbWQKLSNlbHNlCiAvKgogICogY3BjbWQgaXMgdGhlIGluLWtlcm5lbCBpbnRlcmZhY2UgZm9yIGlzc3VpbmcgQ1AgY29tbWFuZHMKICAqCkBAIC0zMyw2ICszMCw1IEBACiAgKiBOT1RFOiBJZiB0aGUgcmVzcG9uc2UgYnVmZmVyIGlzIG5vdCBiZWxvdyAyIEdCLCBjcGNtZCBjYW4gc2xlZXAKICAqLwogZXh0ZXJuIGludCBjcGNtZChjb25zdCBjaGFyICpjbWQsIGNoYXIgKnJlc3BvbnNlLCBpbnQgcmxlbiwgaW50ICpyZXNwb25zZV9jb2RlKTsKLSNlbmRpZiAvKl9fczM5MHhfXyovCiAKLSNlbmRpZgorI2VuZGlmIC8qIF9BU01fUzM5MF9DUENNRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2RldmljZS5oIGIvaW5jbHVkZS9hc20tczM5MC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tczM5MC9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmggYi9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmgKaW5kZXggY2UyOGRkZC4uOWMzNWM4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAva2V4ZWMuaApAQCAtMjYsNyArMjYsNyBAQAogCiAvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHVzZSBmb3IgdGhlIGNvbnRyb2wgcGFnZXMgKi8KIC8qIE5vdCBtb3JlIHRoYW4gMkdCICovCi0jZGVmaW5lIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUICgxPDwzMSkKKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgKDFVTDw8MzEpCiAKIC8qIEFsbG9jYXRlIG9uZSBwYWdlIGZvciB0aGUgcGRwIGFuZCB0aGUgc2Vjb25kIGZvciB0aGUgY29kZSAqLwogI2RlZmluZSBLRVhFQ19DT05UUk9MX0NPREVfU0laRSA0MDk2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2xvd2NvcmUuaCBiL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oCmluZGV4IDA2NTgzZWQuLjc0ZjczODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oCkBAIC0zNjIsNiArMzYyLDE0IEBACiAJYXNtIHZvbGF0aWxlKCJzcHggJTAiIDogOiAibSIgKGFkZHJlc3MpIDogIm1lbW9yeSIpOwogfQogCitzdGF0aWMgaW5saW5lIF9fdTMyIHN0b3JlX3ByZWZpeCh2b2lkKQoreworCV9fdTMyIGFkZHJlc3M7CisKKwlhc20gdm9sYXRpbGUoInN0cHggJTAiIDogIj1tIiAoYWRkcmVzcykpOworCXJldHVybiBhZGRyZXNzOworfQorCiAjZGVmaW5lIF9fUEFOSUNfTUFHSUMgICAgICAgICAgIDB4REVBREMwREUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCmluZGV4IDM2YmI2ZGEuLjJkOTY4YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCkBAIC0xMTAsMTIgKzExMCwyMSBAQAogI2RlZmluZSBWTUFMTE9DX09GRlNFVCAgKDgqMTAyNCoxMDI0KQogI2RlZmluZSBWTUFMTE9DX1NUQVJUICAgKCgodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgKyBWTUFMTE9DX09GRlNFVCkgXAogCQkJICYgfihWTUFMTE9DX09GRlNFVC0xKSkKLSNpZm5kZWYgX19zMzkweF9fCi0jIGRlZmluZSBWTUFMTE9DX0VORCAgICAgKDB4N2ZmZmZmZmZMKQotI2Vsc2UgLyogX19zMzkweF9fICovCi0jIGRlZmluZSBWTUFMTE9DX0VORCAgICAgKDB4NDAwMDAwMDAwMDBMKQotI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCisvKgorICogV2UgbmVlZCBzb21lIGZyZWUgdmlydHVhbCBzcGFjZSB0byBiZSBhYmxlIHRvIGRvIHZtYWxsb2MuCisgKiBWTUFMTE9DX01JTl9TSVpFIGRlZmluZXMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgdm1hbGxvYworICogYXJlYS4gT24gYSBtYWNoaW5lIHdpdGggMkdCIG1lbW9yeSB3ZSBtYWtlIHN1cmUgdGhhdCB3ZQorICogaGF2ZSBhdCBsZWFzdCAxMjhNQiBmcmVlIHNwYWNlIGZvciB2bWFsbG9jLiBPbiBhIG1hY2hpbmUKKyAqIHdpdGggNFRCIHdlIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IDFHQi4KKyAqLworI2lmbmRlZiBfX3MzOTB4X18KKyNkZWZpbmUgVk1BTExPQ19NSU5fU0laRQkweDgwMDAwMDBVTAorI2RlZmluZSBWTUFMTE9DX0VORAkJMHg4MDAwMDAwMFVMCisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKyNkZWZpbmUgVk1BTExPQ19NSU5fU0laRQkweDQwMDAwMDAwVUwKKyNkZWZpbmUgVk1BTExPQ19FTkQJCTB4NDAwMDAwMDAwMDBVTAorI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCiAvKgogICogQSAzMSBiaXQgcGFnZXRhYmxlIGVudHJ5IG9mIFMzOTAgaGFzIGZvbGxvd2luZyBmb3JtYXQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Jlc2V0LmggYi9pbmNsdWRlL2FzbS1zMzkwL3Jlc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0MzljZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcmVzZXQuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogIGluY2x1ZGUvYXNtLXMzOTAvcmVzZXQuaAorICoKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNgorICogICAgQXV0aG9yKHMpOiBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KKyAqLworCisjaWZuZGVmIF9BU01fUzM5MF9SRVNFVF9ICisjZGVmaW5lIF9BU01fUzM5MF9SRVNFVF9ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKK3N0cnVjdCByZXNldF9jYWxsIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdm9pZCAoKmZuKSh2b2lkKTsKK307CisKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3Jlc2V0X2NhbGwoc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0KTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfcmVzZXRfY2FsbChzdHJ1Y3QgcmVzZXRfY2FsbCAqcmVzZXQpOworZXh0ZXJuIHZvaWQgczM5MF9yZXNldF9zeXN0ZW0odm9pZCk7CitleHRlcm4gdm9pZCAoKnMzOTBfcmVzZXRfbWNja19oYW5kbGVyKSh2b2lkKTsKKworI2VuZGlmIC8qIF9BU01fUzM5MF9SRVNFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NldHVwLmggYi9pbmNsdWRlL2FzbS1zMzkwL3NldHVwLmgKaW5kZXggNWQ3MmVkYS4uNzY2NGJhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc2V0dXAuaApAQCAtMiw3ICsyLDcgQEAKICAqICBpbmNsdWRlL2FzbS1zMzkwL3NldHVwLmgKICAqCiAgKiAgUzM5MCB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk5LDIwMDYKICAqLwogCiAjaWZuZGVmIF9BU01fUzM5MF9TRVRVUF9ICkBAIC0zMCw2ICszMCwxNyBAQAogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogI2RlZmluZSBDT01NQU5EX0xJTkUgICAgICAoKGNoYXIgKikgICAgICAgICAgICAoMHgxMDQ4MCkpCiAKKyNkZWZpbmUgQ0hVTktfUkVBRF9XUklURSAwCisjZGVmaW5lIENIVU5LX1JFQURfT05MWSAgMQorCitzdHJ1Y3QgbWVtX2NodW5rIHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKK307CisKK2V4dGVybiBzdHJ1Y3QgbWVtX2NodW5rIG1lbW9yeV9jaHVua1tdOworCiAvKgogICogTWFjaGluZSBmZWF0dXJlcyBkZXRlY3RlZCBpbiBoZWFkLlMKICAqLwpAQCAtNTMsNyArNjQsNiBAQAogI2RlZmluZSBNQUNISU5FX0hBU19NVkNPUwkobWFjaGluZV9mbGFncyAmIDUxMikKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIAotCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX1NDTFAJKCFNQUNISU5FX0lTX1AzOTApCiAKIC8qCkBAIC03MSw3ICs4MSw2IEBACiAjZGVmaW5lIFNFVF9DT05TT0xFXzMyMTUJZG8geyBjb25zb2xlX21vZGUgPSAyOyB9IHdoaWxlICgwKQogI2RlZmluZSBTRVRfQ09OU09MRV8zMjcwCWRvIHsgY29uc29sZV9tb2RlID0gMzsgfSB3aGlsZSAoMCkKIAotCiBzdHJ1Y3QgaXBsX2xpc3RfaGRyIHsKIAl1MzIgbGVuOwogCXU4ICByZXNlcnZlZDFbM107CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oIGIvaW5jbHVkZS9hc20tczM5MC9zbXAuaAppbmRleCBjM2NmMDMwLi43MDk3Yzk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc21wLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qCiAgIHMzOTAgc3BlY2lmaWMgc21wLmMgaGVhZGVycwpAQCAtMTAxLDYgKzEwMiwxMyBAQAogCWZ1bmMoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cy9tYWNoaW5lIGNoZWNrcyAqLworCV9fbG9hZF9wc3dfbWFzayhQU1dfS0VSTkVMX0JJVFMgJiB+UFNXX01BU0tfTUNIRUNLKTsKK30KKwogI2RlZmluZSBzbXBfY3B1X25vdF9ydW5uaW5nKGNwdSkJMQogI2RlZmluZSBzbXBfZ2V0X2NwdShjcHUpICh7IDA7IH0pCiAjZGVmaW5lIHNtcF9wdXRfY3B1KGNwdSkgKHsgMDsgfSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCmluZGV4IGNjYmFmZTQuLmJkMGIwNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaApAQCAtMTE1LDYgKzExNSwxNiBAQAogI2RlZmluZSBhY2NvdW50X3Z0aW1lKHgpIGRvIHsgLyogZW1wdHkgKi8gfSB3aGlsZSAoMCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BGQVVMVAorZXh0ZXJuIHZvaWQgcGZhdWx0X2lycV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBwZmF1bHRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHBmYXVsdF9maW5pKHZvaWQpOworI2Vsc2UgLyogQ09ORklHX1BGQVVMVCAqLworI2RlZmluZSBwZmF1bHRfaXJxX2luaXQoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHBmYXVsdF9pbml0KCkJCSh7LTE7fSkKKyNkZWZpbmUgcGZhdWx0X2ZpbmkoKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19QRkFVTFQgKi8KKwogI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikgZG8gewkJCQkJICAgICBcCiAJc2V0X2ZzKGN1cnJlbnQtPnRocmVhZC5tbV9zZWdtZW50KTsJCQkJICAgICBcCiAJYWNjb3VudF92dGltZShwcmV2KTsJCQkJCQkgICAgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tczM5MC90ZXJtaW9zLmgKaW5kZXggZDFlMjljYy4uNjJiMjNjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC90ZXJtaW9zLmgKQEAgLTc1LDM5ICs3NSw3IEBACiAqLwogI2RlZmluZSBJTklUX0NfQ0MgIlwwMDNcMDM0XDE3N1wwMjVcMDA0XDBcMVwwXDAyMVwwMjNcMDMyXDBcMDIyXDAxN1wwMjdcMDI2XDAiCiAKLS8qCi0gKiBUcmFuc2xhdGUgYSAidGVybWlvIiBzdHJ1Y3R1cmUgaW50byBhICJ0ZXJtaW9zIi4gVWdoLgotICovCi0jZGVmaW5lIFNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgeCkgeyBcCi0JdW5zaWduZWQgc2hvcnQgX190bXA7IFwKLQlnZXRfdXNlcihfX3RtcCwmKHRlcm1pbyktPngpOyBcCi0JKHRlcm1pb3MpLT54ID0gKDB4ZmZmZjAwMDAgJiAoKHRlcm1pb3MpLT54KSkgfCBfX3RtcDsgXAotfQotCi0jZGVmaW5lIHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKHRlcm1pb3MsIHRlcm1pbykgXAotKHsgXAotCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19pZmxhZyk7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfb2ZsYWcpOyBcCi0JU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX2NmbGFnKTsgXAotCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19sZmxhZyk7IFwKLQljb3B5X2Zyb21fdXNlcigodGVybWlvcyktPmNfY2MsICh0ZXJtaW8pLT5jX2NjLCBOQ0MpOyBcCi19KQotCi0vKgotICogVHJhbnNsYXRlIGEgInRlcm1pb3MiIHN0cnVjdHVyZSBpbnRvIGEgInRlcm1pbyIuIFVnaC4KLSAqLwotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHRlcm1pb3MpIFwKLSh7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfaWZsYWcsICYodGVybWlvKS0+Y19pZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfb2ZsYWcsICYodGVybWlvKS0+Y19vZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfY2ZsYWcsICYodGVybWlvKS0+Y19jZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfbGZsYWcsICYodGVybWlvKS0+Y19sZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfbGluZSwgICYodGVybWlvKS0+Y19saW5lKTsgXAotCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCi19KQotCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWlvcy5oPgogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zMzkwL3R5cGVzLmgKaW5kZXggYWUyOTUxYy4uZmM1ZDdjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdHlwZXMuaApAQCAtODcsMTYgKzg3LDYgQEAKIAl9IHN1YnJlZzsKIH0gcmVnaXN0ZXJfcGFpcjsKIAotI2lmZGVmIENPTkZJR19MQkQKLXR5cGVkZWYgdTY0IHNlY3Rvcl90OwotI2RlZmluZSBIQVZFX1NFQ1RPUl9UCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19MU0YKLXR5cGVkZWYgdTY0IGJsa2NudF90OwotI2RlZmluZSBIQVZFX0JMS0NOVF9UCi0jZW5kaWYKLQogI2VuZGlmIC8qICEgX19zMzkweF9fICAgKi8KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zMzkwL3VhY2Nlc3MuaAppbmRleCA3MmFlNGVmLi43M2FjNGU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3VhY2Nlc3MuaApAQCAtMjAxLDcgKzIwMSw3IEBACiAgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCiAgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikgJiYgKG4gPD0gMjU2KSkKQEAgLTIyNiw3ICsyMjYsNyBAQAogICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgogICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCW1pZ2h0X3NsZWVwKCk7CkBAIC0yNTIsNyArMjUyLDcgQEAKICAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKICAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikgJiYgKG4gPD0gMjU2KSkKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICogSWYgc29tZSBkYXRhIGNvdWxkIG5vdCBiZSBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBwYWQgdGhlIGNvcGllZAogICogZGF0YSB0byB0aGUgcmVxdWVzdGVkIHNpemUgdXNpbmcgemVybyBieXRlcy4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAltaWdodF9zbGVlcCgpOwpAQCAtMjg4LDEzICsyODgsMTMgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBfX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJcmV0dXJuIHVhY2Nlc3MuY29weV9pbl91c2VyKG4sIHRvLCBmcm9tKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCW1pZ2h0X3NsZWVwKCk7CkBAIC0zMDYsNyArMzA2LDcgQEAKIC8qCiAgKiBDb3B5IGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KICAqLwotc3RhdGljIGlubGluZSBsb25nCitzdGF0aWMgaW5saW5lIGxvbmcgX19tdXN0X2NoZWNrCiBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCiB7CiAgICAgICAgIGxvbmcgcmVzID0gLUVGQVVMVDsKQEAgLTM0MywxMyArMzQzLDEzIEBACiAgKiBaZXJvIFVzZXJzcGFjZQogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQogewogCXJldHVybiB1YWNjZXNzLmNsZWFyX3VzZXIobiwgdG8pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJbWlnaHRfc2xlZXAoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvemNyeXB0LmggYi9pbmNsdWRlL2FzbS1zMzkwL3pjcnlwdC5oCmluZGV4IDcyNDRjNjguLmI5MGU1NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvemNyeXB0LmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC96Y3J5cHQuaApAQCAtMTgwLDQwICsxODAsOCBAQAogICoJICAgICBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUKICAqCSAgICAgYmxvY2sKICAqCi0gKiAgIFo5MFNUQVRfVE9UQUxDT1VOVAotICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBkZXZpY2UgdHlwZXMgdG9nZXRoZXIuCi0gKgotICogICBaOTBTVEFUX1BDSUNBQ09VTlQKLSAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgUENJQ0FzLgotICoKLSAqICAgWjkwU1RBVF9QQ0lDQ0NPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIFBDSUNDcy4KLSAqCi0gKiAgIFo5MFNUQVRfUENJWENDTUNMMkNPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIE1DTDIgUENJWENDcy4KLSAqCi0gKiAgIFo5MFNUQVRfUENJWENDTUNMM0NPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIE1DTDMgUENJWENDcy4KLSAqCi0gKiAgIFo5MFNUQVRfQ0VYMkNDT1VOVAotICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBDRVgyQ3MuCi0gKgotICogICBaOTBTVEFUX0NFWDJBQ09VTlQKLSAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgQ0VYMkFzLgotICoKLSAqICAgWjkwU1RBVF9SRVFVRVNUUV9DT1VOVAotICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyB3YWl0aW5nIHRvIGJlCi0gKiAgICAgc2VudCB0byBhIGRldmljZS4KLSAqCi0gKiAgIFo5MFNUQVRfUEVORElOR1FfQ09VTlQKLSAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc2VudCB0byBhCi0gKiAgICAgZGV2aWNlIGF3YWl0aW5nIHRoZSByZXBseS4KLSAqCi0gKiAgIFo5MFNUQVRfVE9UQUxPUEVOX0NPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBvcGVuIGZpbGUgaGFuZGxlcy4KLSAqCi0gKiAgIFo5MFNUQVRfRE9NQUlOX0lOREVYCi0gKiAgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBDcnlwdG9ncmFwaGljIERvbWFpbi4KKyAqICAgWlNFQ1NFTkRDUFJCCisgKiAgICAgU2VuZCBhbiBhcmJpdHJhcnkgQ1BSQiB0byBhIGNyeXB0byBjYXJkLgogICoKICAqICAgWjkwU1RBVF9TVEFUVVNfTUFTSwogICogICAgIFJldHVybiBhbiA2NCBlbGVtZW50IGFycmF5IG9mIHVuc2lnbmVkIGNoYXJzIGZvciB0aGUgc3RhdHVzIG9mCkBAIC0yMzUsMjggKzIwMyw1MSBAQAogICogICAgIG9mIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgcmVxdWVzdHMgcGVyIGRldmljZSBzaW5jZSB0aGUgZGV2aWNlCiAgKiAgICAgd2FzIGRldGVjdGVkIGFuZCBtYWRlIGF2YWlsYWJsZS4KICAqCi0gKiAgIElDQVo5MFNUQVRVUyAoZGVwcmVjYXRlZCkKKyAqICAgWjkwU1RBVF9SRVFVRVNUUV9DT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyB3YWl0aW5nIHRvIGJlCisgKiAgICAgc2VudCB0byBhIGRldmljZS4KKyAqCisgKiAgIFo5MFNUQVRfUEVORElOR1FfQ09VTlQKKyAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc2VudCB0byBhbGwKKyAqICAgICBkZXZpY2VzIGF3YWl0aW5nIHRoZSByZXBseS4KKyAqCisgKiAgIFo5MFNUQVRfVE9UQUxPUEVOX0NPVU5UCisgKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBvcGVuIGZpbGUgaGFuZGxlcy4KKyAqCisgKiAgIFo5MFNUQVRfRE9NQUlOX0lOREVYCisgKiAgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBDcnlwdG9ncmFwaGljIERvbWFpbi4KKyAqCisgKiAgIFRoZSBmb2xsb3dpbmcgaW9jdGxzIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgbm8gbG9uZ2VyIHVzZWQ6CisgKgorICogICBaOTBTVEFUX1RPVEFMQ09VTlQKKyAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgZGV2aWNlIHR5cGVzIHRvZ2V0aGVyLgorICoKKyAqICAgWjkwU1RBVF9QQ0lDQUNPVU5UCisgKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIFBDSUNBcy4KKyAqCisgKiAgIFo5MFNUQVRfUENJQ0NDT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBQQ0lDQ3MuCisgKgorICogICBaOTBTVEFUX1BDSVhDQ01DTDJDT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBNQ0wyIFBDSVhDQ3MuCisgKgorICogICBaOTBTVEFUX1BDSVhDQ01DTDNDT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBNQ0wzIFBDSVhDQ3MuCisgKgorICogICBaOTBTVEFUX0NFWDJDQ09VTlQKKyAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgQ0VYMkNzLgorICoKKyAqICAgWjkwU1RBVF9DRVgyQUNPVU5UCisgKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIENFWDJBcy4KKyAqCisgKiAgIElDQVo5MFNUQVRVUwogICogICAgIFJldHVybiBzb21lIGRldmljZSBkcml2ZXIgc3RhdHVzIGluIGEgaWNhX3o5MF9zdGF0dXMgc3RydWN0CiAgKiAgICAgVGhpcyB0YWtlcyBhbiBpY2FfejkwX3N0YXR1cyBzdHJ1Y3QgYXMgaXRzIGFyZy4KICAqCi0gKiAgICAgTk9URTogdGhpcyBpb2N0bCgpIGlzIGRlcHJlY2F0ZWQsIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoCi0gKgkgICAgIHNpbmdsZSBpb2N0bCgpcyBmb3IgZWFjaCB0eXBlIG9mIHN0YXR1cyBiZWluZyByZXF1ZXN0ZWQKLSAqCi0gKiAgIFo5MFNUQVRfUENJWENDQ09VTlQgKGRlcHJlY2F0ZWQpCisgKiAgIFo5MFNUQVRfUENJWENDQ09VTlQKICAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgUENJWENDcyAoTUNMMiArIE1DTDMpLgogICogICAgIFRoaXMgaXMgREVQUkVDQVRFRCBub3cgdGhhdCBNQ0wzIFBDSVhDQ3MgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgZnJvbQogICogICAgIE1DTDIgUENJWENDcy4KLSAqCi0gKiAgIFo5MFFVSUVTQ0UgKG5vdCByZWNvbW1lbmRlZCkKLSAqICAgICBRdWllc2NlIHRoZSBkcml2ZXIuICBUaGlzIGlzIGludGVuZGVkIHRvIHN0b3AgYWxsIG5ldwotICogICAgIHJlcXVlc3RzIGZyb20gYmVpbmcgcHJvY2Vzc2VkLiAgSXRzIHVzZSBpcyBOT1QgcmVjb21tZW5kZWQsCi0gKiAgICAgZXhjZXB0IGluIGNpcmN1bXN0YW5jZXMgd2hlcmUgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHN0b3AKLSAqICAgICBjYWxsZXJzIGZyb20gYWNjZXNzaW5nIHRoZSBkcml2ZXIuICBJdHMgb3JpZ2luYWwgdXNlIHdhcyB0bwotICogICAgIGFsbG93IHRoZSBkcml2ZXIgdG8gYmUgImRyYWluZWQiIG9mIHdvcmsgaW4gcHJlcGFyYXRpb24gZm9yCi0gKiAgICAgYSBzeXN0ZW0gc2h1dGRvd24uCi0gKgotICogICAgIE5PVEU6IG9uY2UgaXNzdWVkLCB0aGlzIGJhbiBvbiBuZXcgd29yayBjYW5ub3QgYmUgdW5kb25lCi0gKgkgICAgIGV4Y2VwdCBieSB1bmxvYWRpbmcgYW5kIHJlbG9hZGluZyB0aGUgZHJpdmVyLgogICovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXNoL2NoZWNrc3VtLmgKaW5kZXggMDgxNjhhZi4uZDQ0MzQ0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jaGVja3N1bS5oCkBAIC0yMyw3ICsyMyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTMzLDggKzMzLDggQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJCSAgaW50IGxlbiwgaW50IHN1bSwgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpOwogCiAvKgogICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQpAQCAtNDQsMjQgKzQ0LDI1IEBACiAgKglhY2Nlc3Nfb2soKS4KICAqLwogc3RhdGljIF9faW5saW5lX18KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljICggc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBOVUxMKTsKIH0KIAogc3RhdGljIF9faW5saW5lX18KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCQkJaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKCBzcmMsIGRzdCwgbGVuLCBzdW0sIGVycl9wdHIsIE5VTEwpOworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIGNvbnN0IHZvaWQgKilzcmMsIGRzdCwKKwkJCQkJbGVuLCBzdW0sIGVycl9wdHIsIE5VTEwpOwogfQogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCBfX2R1bW15OwogCV9fYXNtX18oInN3YXAudyAlMCwgJTFcblx0IgpAQCAtNzQsNyArNzUsNyBAQAogCQk6ICI9ciIgKHN1bSksICI9JnIiIChfX2R1bW15KQogCQk6ICIwIiAoc3VtKQogCQk6ICJ0Iik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCkBAIC04NCw3ICs4NSw3IEBACiAgKiAgICAgIGkzODYgdmVyc2lvbiBieSBKb3JnZSBDd2lrIDxqb3JnZUBsYXNlci5zYXRsaW5rLm5ldD4sIGFkYXB0ZWQKICAqICAgICAgZm9yIGxpbnV4IGJ5ICogQXJudCBHdWxicmFuZHNlbi4KICAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bSwgX19kdW1teTAsIF9fZHVtbXkxOwogCkBAIC0xMTIsMTYgKzExMywxNSBAQAogCXJldHVybgljc3VtX2ZvbGQoc3VtKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKSAKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2OworCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKHByb3RvICsgbGVuKSA8PCA4OwogI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChwcm90bzw8MTYpK2xlbjsKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IHByb3RvICsgbGVuOwogI2VuZGlmCiAJX19hc21fXygiY2xydFxuXHQiCiAJCSJhZGRjCSUwLCAlMVxuXHQiCkBAIC0xMzksMTEgKzEzOSwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKSAKKwkJCQkJCSAgICAgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTE1MywxOCArMTUyLDE3IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQogI2lmZGVmIENPTkZJR19JUFY2Ci1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTMyIGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgX19kdW1teTsKIAlfX2FzbV9fKCJjbHJ0XG5cdCIKQEAgLTIwMSwxNyArMTk5LDE4IEBACiAgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCiAgKi8KICNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfdG9fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQkJICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwKLQkJCQkJCSAgICAgIGludCBsZW4sIGludCBzdW0sCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyIChjb25zdCB2b2lkICpzcmMsCisJCQkJCQkgICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkJCQkJICAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCSAgICAgIGludCAqZXJyX3B0cikKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKQotCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIGVycl9wdHIpOworCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLAorCQkJCQkJZHN0LCBsZW4sIHN1bSwgTlVMTCwgZXJyX3B0cik7CiAKIAlpZiAobGVuKQogCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CiAKLQlyZXR1cm4gLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCiB9CiAjZW5kaWYgLyogX19BU01fU0hfQ0hFQ0tTVU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1zaC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXNoL3R5cGVzLmgKaW5kZXggM2MwOWRkNC4uZmQwMGRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC90eXBlcy5oCkBAIC01MiwxNiArNTIsNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi0jaWZkZWYgQ09ORklHX0xCRAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0xTRgotdHlwZWRlZiB1NjQgYmxrY250X3Q7Ci0jZGVmaW5lIEhBVkVfQkxLQ05UX1QKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1zaDY0L2NoZWNrc3VtLmgKaW5kZXggZmQwMzRlOS4uYmE1OTRjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvY2hlY2tzdW0uaApAQCAtMjYsOCArMjYsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1hc21saW5rYWdlIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGxlbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pOworYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQpAQCAtMzgsNDYgKzM3LDM0IEBACiAgKi8KIAogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkgICAgICAgX193c3VtIHN1bSk7CiAKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCi0JCQkJCSBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpOworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCSBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpOwogCi0vKgotICogVGhlc2UgYXJlIHRoZSBvbGQgKGFuZCB1bnNhZmUpIHdheSBvZiBkb2luZyBjaGVja3N1bXMsIGEgd2FybmluZyBtZXNzYWdlIHdpbGwgYmUKLSAqIHByaW50ZWQgaWYgdGhleSBhcmUgdXNlZCBhbmQgYW4gZXhlcHRpb24gb2NjdXJzLgotICoKLSAqIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhZnRlciBzb21lIHRpbWUuCi0gKi8KLQotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9mcm9tdXNlciBjc3VtX3BhcnRpYWxfY29weQotCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBjc3VtKQogeworCXUzMiBzdW0gPSAoX19mb3JjZSB1MzIpY3N1bTsKICAgICAgICAgc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKICAgICAgICAgc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKLSAgICAgICAgcmV0dXJuIH4oc3VtKTsKKyAgICAgICAgcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAotdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpOworX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAotdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKK19fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJIHVuc2lnbmVkIGludCBzdW0pOworCQkJCSBfX3dzdW0gc3VtKTsKIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtODYsNyArNzMsNyBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXNoNjQvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2NoZWNrc3VtLmgKaW5kZXggMjg2MTU4MS4uMjY3ZTYzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9jaGVja3N1bS5oCkBAIC0zMCw3ICszMCw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBmczpzcmMgd2hpbGUgaXQKICAqIGNoZWNrc3VtcwpAQCAtNDEsOSArNDEsOCBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpYyAoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCAKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICAgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXQgYXNtKCJvMCIpID0gKHVuc2lnbmVkIGludClzcmM7CiAJcmVnaXN0ZXIgY2hhciAqZCBhc20oIm8xIikgPSBkc3Q7CkBAIC01Nyw0MiArNTYsMzYgQEAKIAk6ICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJvNyIsCiAJICAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzciLAogCSAgIm1lbW9yeSIsICJjYyIpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycikKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJICAgIF9fd3N1bSBzdW0sIGludCAqZXJyKQogICB7Ci0JaWYgKCFhY2Nlc3Nfb2sgKFZFUklGWV9SRUFELCBzcmMsIGxlbikpIHsKLQkJKmVyciA9IC1FRkFVTFQ7Ci0JCW1lbXNldCAoZHN0LCAwLCBsZW4pOwotCQlyZXR1cm4gc3VtOwotCX0gZWxzZSB7Ci0JCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmV0IGFzbSgibzAiKSA9ICh1bnNpZ25lZCBsb25nKXNyYzsKLQkJcmVnaXN0ZXIgY2hhciAqZCBhc20oIm8xIikgPSBkc3Q7Ci0JCXJlZ2lzdGVyIGludCBsIGFzbSgiZzEiKSA9IGxlbjsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHMgYXNtKCJnNyIpID0gc3VtOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmV0IGFzbSgibzAiKSA9ICh1bnNpZ25lZCBsb25nKXNyYzsKKwlyZWdpc3RlciBjaGFyICpkIGFzbSgibzEiKSA9IGRzdDsKKwlyZWdpc3RlciBpbnQgbCBhc20oImcxIikgPSBsZW47CisJcmVnaXN0ZXIgX193c3VtIHMgYXNtKCJnNyIpID0gc3VtOwogCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIi5zZWN0aW9uIF9fZXhfdGFibGUsI2FsbG9jXG5cdCIKLQkJIi5hbGlnbiA0XG5cdCIKLQkJIi53b3JkIDFmLDJcblx0IgotCQkiLnByZXZpb3VzXG4iCi0JCSIxOlxuXHQiCi0JCSJjYWxsIF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpY1xuXHQiCi0JCSIgc3QgJTgsIFslJXNwICsgNjRdXG4iCi0JCTogIj0mciIgKHJldCksICI9JnIiIChkKSwgIj0mciIgKGwpLCAiPSZyIiAocykKLQkJOiAiMCIgKHJldCksICIxIiAoZCksICIyIiAobCksICIzIiAocyksICJyIiAoZXJyKQotCQk6ICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJvNyIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsCi0JCSAgImNjIiwgIm1lbW9yeSIpOwotCQlyZXR1cm4gcmV0OwotCX0KLSAgfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiLnNlY3Rpb24gX19leF90YWJsZSwjYWxsb2Ncblx0IgorCSIuYWxpZ24gNFxuXHQiCisJIi53b3JkIDFmLDJcblx0IgorCSIucHJldmlvdXNcbiIKKwkiMTpcblx0IgorCSJjYWxsIF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpY1xuXHQiCisJIiBzdCAlOCwgWyUlc3AgKyA2NF1cbiIKKwk6ICI9JnIiIChyZXQpLCAiPSZyIiAoZCksICI9JnIiIChsKSwgIj0mciIgKHMpCisJOiAiMCIgKHJldCksICIxIiAoZCksICIyIiAobCksICIzIiAocyksICJyIiAoZXJyKQorCTogIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgIm83IiwgImcyIiwgImczIiwgImc0IiwgImc1IiwKKwkgICJjYyIsICJtZW1vcnkiKTsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJldDsKK30KICAgCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCAKLWNzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LCBpbnQgbGVuLAotCQkJICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycikKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCBfX3VzZXIgKmRzdCwgaW50IGxlbiwKKwkJCSAgX193c3VtIHN1bSwgaW50ICplcnIpCiB7CiAJaWYgKCFhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKSB7CiAJCSplcnIgPSAtRUZBVUxUOwpAQCAtMTAxLDcgKzk0LDcgQEAKIAkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXQgYXNtKCJvMCIpID0gKHVuc2lnbmVkIGxvbmcpc3JjOwogCQlyZWdpc3RlciBjaGFyIF9fdXNlciAqZCBhc20oIm8xIikgPSBkc3Q7CiAJCXJlZ2lzdGVyIGludCBsIGFzbSgiZzEiKSA9IGxlbjsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHMgYXNtKCJnNyIpID0gc3VtOworCQlyZWdpc3RlciBfX3dzdW0gcyBhc20oImc3IikgPSBzdW07CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogCQkiLnNlY3Rpb24gX19leF90YWJsZSwjYWxsb2Ncblx0IgpAQCAtMTE2LDcgKzEwOSw3IEBACiAJCTogIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgIm83IiwKIAkJICAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLAogCQkgICJjYyIsICJtZW1vcnkiKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXQ7CiAJfQogfQogCkBAIC0xMjYsMTAgKzExOSw5IEBACiAvKiBpaGwgaXMgYWx3YXlzIDUgb3IgZ3JlYXRlciwgYWxtb3N0IGFsd2F5cyBpcyA1LCBhbmQgaXBoIGlzIHdvcmQgYWxpZ25lZAogICogdGhlIG1ham9yaXR5IG9mIHRoZSB0aW1lLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICppcGgsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewotCXVuc2lnbmVkIHNob3J0IHN1bTsKKwlfX3N1bTE2IHN1bTsKIAogCS8qIE5vdGU6IFdlIG11c3QgcmVhZCAlMiBiZWZvcmUgd2UgdG91Y2ggJTAgZm9yIHRoZSBmaXJzdCB0aW1lLAogCSAqICAgICAgIGJlY2F1c2UgR0NDIGNhbiBsZWdpdGltYXRlbHkgdXNlIHRoZSBzYW1lIHJlZ2lzdGVyIGZvcgpAQCAtMTY0LDcgKzE1Niw3IEBACiB9CiAKIC8qIEZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzLiAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtMTczLDIzICsxNjUsMjIgQEAKIAkJCSAgICAgImFkZHhcdCUxLCAlJWcwLCAlMVxuXHQiCiAJCQkgICAgICJ4bm9yXHQlJWcwLCAlMSwgJTAiCiAJCQkgICAgIDogIj0mciIgKHN1bSksICI9ciIgKHRtcCkKLQkJCSAgICAgOiAiMCIgKHN1bSksICIxIiAoc3VtPDwxNikKKwkJCSAgICAgOiAiMCIgKHN1bSksICIxIiAoKF9fZm9yY2UgdTMyKXN1bTw8MTYpCiAJCQkgICAgIDogImNjIik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkgICAgICAgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYWRkY2NcdCUxLCAlMCwgJTBcblx0IgogCQkJICAgICAiYWRkeGNjXHQlMiwgJTAsICUwXG5cdCIKIAkJCSAgICAgImFkZHhjY1x0JTMsICUwLCAlMFxuXHQiCiAJCQkgICAgICJhZGR4XHQlMCwgJSVnMCwgJTBcblx0IgogCQkJICAgICA6ICI9ciIgKHN1bSksICI9ciIgKHNhZGRyKQotCQkJICAgICA6ICJyIiAoZGFkZHIpLCAiciIgKChwcm90bzw8MTYpK2xlbiksICIwIiAoc3VtKSwKKwkJCSAgICAgOiAiciIgKGRhZGRyKSwgInIiIChwcm90byArIGxlbiksICIwIiAoc3VtKSwKIAkJCSAgICAgICAiMSIgKHNhZGRyKQogCQkJICAgICA6ICJjYyIpOwogCXJldHVybiBzdW07CkBAIC0xOTksMjIgKzE5MCwyMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKSAKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgX191MzIgbGVuLAotCQkJCQkJIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJICAgICAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkgICAgICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgKIAkJImFkZGNjCSUzLCAlNCwgJSVnNFxuXHQiCkBAIC0yNDUsNyArMjM0LDcgQEAKIH0KIAogLyogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seSBpbiBpY21wLmMgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jaGVja3N1bS5oCmluZGV4IGRjOGJlZDIuLjcwYTAwNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NoZWNrc3VtLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqIGJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlIHdoaWxlIGl0CiAgKiBjaGVja3N1bXMKQEAgLTM4LDUyICszOCw1MCBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCSAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAotZXh0ZXJuIGxvbmcgX19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywKLQkJCQkJICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkJCSAgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gbG9uZyBfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorCQkJCQkgIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkJICBfX3dzdW0gc3VtKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycikKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwkJCSAgICB2b2lkICpkc3QsIGludCBsZW4sCisJCQkgICAgX193c3VtIHN1bSwgaW50ICplcnIpCiB7CiAJbG9uZyByZXQgPSBfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihzcmMsIGRzdCwgbGVuLCBzdW0pOwogCWlmIChyZXQgPCAwKQogCQkqZXJyID0gLUVGQVVMVDsKLQlyZXR1cm4gKHVuc2lnbmVkIGludCkgcmV0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pIHJldDsKIH0KIAogLyogCiAgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCiAgKi8KICNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotZXh0ZXJuIGxvbmcgX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwgaW50IGxlbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBsb25nIF9fY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsCisJCQkJCXZvaWQgX191c2VyICpkc3QsIGludCBsZW4sCisJCQkJCSAgX193c3VtIHN1bSk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkgICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LCBpbnQgbGVuLAotCQkgICAgICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycikKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAorCQkgICAgICB2b2lkIF9fdXNlciAqZHN0LCBpbnQgbGVuLAorCQkgICAgICBfX3dzdW0gc3VtLCBpbnQgKmVycikKIHsKIAlsb25nIHJldCA9IF9fY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihzcmMsIGRzdCwgbGVuLCBzdW0pOwogCWlmIChyZXQgPCAwKQogCQkqZXJyID0gLUVGQVVMVDsKLQlyZXR1cm4gKHVuc2lnbmVkIGludCkgcmV0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pIHJldDsKIH0KIAogLyogaWhsIGlzIGFsd2F5cyA1IG9yIGdyZWF0ZXIsIGFsbW9zdCBhbHdheXMgaXMgNSwgYW5kIGlwaCBpcyB3b3JkIGFsaWduZWQKICAqIHRoZSBtYWpvcml0eSBvZiB0aGUgdGltZS4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bShfX2NvbnN0X18gdW5zaWduZWQgY2hhciAqaXBoLAotCQkJCSAgIHVuc2lnbmVkIGludCBpaGwpOworZXh0ZXJuIF9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCk7CiAKIC8qIEZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzLiAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCkBAIC05MywxNiArOTEsMTUgQEAKICIJYWRkYwkJJTEsICUlZzAsICUxXG4iCiAiCXhub3IJCSUlZzAsICUxLCAlMFxuIgogCTogIj0mciIgKHN1bSksICI9ciIgKHRtcCkKLQk6ICIwIiAoc3VtKSwgIjEiIChzdW08PDE2KQorCTogIjAiIChzdW0pLCAiMSIgKChfX2ZvcmNlIHUzMilzdW08PDE2KQogCTogImNjIik7Ci0JcmV0dXJuIChzdW0gJiAweGZmZmYpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sCiAJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCSAgICAgICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogIglhZGRjYwkJJTEsICUwLCAlMFxuIgpAQCAtMTEwLDcgKzEwNyw3IEBACiAiCWFkZGNjYwkJJTMsICUwLCAlMFxuIgogIglhZGRjCQklMCwgJSVnMCwgJTBcbiIKIAk6ICI9ciIgKHN1bSksICI9ciIgKHNhZGRyKQotCTogInIiIChkYWRkciksICJyIiAoKHByb3RvPDwxNikrbGVuKSwgIjAiIChzdW0pLCAiMSIgKHNhZGRyKQorCTogInIiIChkYWRkciksICJyIiAocHJvdG8gKyBsZW4pLCAiMCIgKHN1bSksICIxIiAoc2FkZHIpCiAJOiAiY2MiKTsKIAlyZXR1cm4gc3VtOwogfQpAQCAtMTE5LDIyICsxMTYsMjAgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkgCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJCSBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkJIF9fdTMyIGxlbiwKLQkJCQkJCSB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSB1bnNpZ25lZCBpbnQgc3VtKSAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCSAgICAgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJICAgICAgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCiAiCWFkZGNjCQklMywgJTQsICUlZzdcbiIKQEAgLTE2NSw3ICsxNjAsNyBAQAogfQogCiAvKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5IGluIGljbXAuYyAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2RldmljZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAppbmRleCBlMWVhNjdiLi5jYTY1NjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKQEAgLTE4LDYgKzE4LDggQEAKIAogI2RlZmluZSBQQ0lfSVJRX05PTkUJCTB4ZmZmZmZmZmYKIAorI2RlZmluZSBQQ0lfQ0FDSEVfTElORV9CWVRFUwk2NAorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCkBAIC0yOTEsMTAgKzI5Myw2IEBACiAJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAogCQkJICAgICAgIGludCB3cml0ZV9jb21iaW5lKTsKIAotLyogUGxhdGZvcm0gc3BlY2lmaWMgTVdJIHN1cHBvcnQuICovCi0jZGVmaW5lIEhBVkVfQVJDSF9QQ0lfTVdJCi1leHRlcm4gaW50IHBjaWJpb3NfcHJlcF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7Ci0KIGV4dGVybiB2b2lkCiBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKIAkJCXN0cnVjdCByZXNvdXJjZSAqcmVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2RldmljZS5oIGIvaW5jbHVkZS9hc20tdW0vZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXVtL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaAppbmRleCA0ZGY1ZTcxMC4uZDFkZGRkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaApAQCAtMjYsOCArMjYsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbCAoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sCi0JCQkJICB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CkBAIC0zNiw4ICszNSw4IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWxfY29weSAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsCisJCQkJICAgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogCiAvKgpAQCAtNDYsMjAgKzQ1LDE3IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJICAgICB2b2lkICpkc3QsCisJCQkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJICAgICBpbnQgKmNzdW1fZXJyKTsKIAotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkJXAotCWNzdW1fcGFydGlhbF9jb3B5ICgoc3JjKSwgKGRzdCksIChsZW4pLCAoc3VtKSkKLQotdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtICh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpOworX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCAodW5zaWduZWQgbG9uZyBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkIChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAJLyoKQEAgLTY4LDcgKzY0LDcgQEAKIAkgICAgICBhZGQgJTEsICUwCUggICAgIEwJCUgrTCtDIEgrTAogCSovCiAJYXNtICgiaHN3ICUxLCAlMDsgYWRkICUxLCAlMCIgOiAiPSZyIiAocmVzdWx0KSA6ICJyIiAoc3VtKSk7Ci0JcmV0dXJuICh+cmVzdWx0KSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofnJlc3VsdCA+PiAxNik7CiB9CiAKIApAQCAtNzYsMTAgKzcyLDEwIEBACiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCAodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3RjcHVkcF9ub2ZvbGQgKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkgICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCisJCSAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlpbnQgX19jYXJyeTsKIAlfX2FzbV9fICgiYWRkICUyLCAlMDsiCkBAIC05MywxNSArODksMTUgQEAKIAkJICJhZGQgJTEsICUwIgogCQkgOiAiPSZyIiAoc3VtKSwgIj0mciIgKF9fY2FycnkpCiAJCSA6ICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwKLQkJICJyIiAobnRvaHMgKGxlbikgKyAocHJvdG8gPDwgOCkpLAorCQkgInIiICgobGVuICsgcHJvdG8pIDw8IDgpLAogCQkgIjAiIChzdW0pKTsKIAlyZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWMgKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljIChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKKwkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV90Y3B1ZHBfbm9mb2xkIChzYWRkciwgZGFkZHIsIGxlbiwgcHJvdG8sIHN1bSkpOwogfQpAQCAtMTEwLDcgKzEwNiw3IEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSAoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pOworZXh0ZXJuIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pOwogCiAKICNlbmRpZiAvKiBfX1Y4NTBfQ0hFQ0tTVU1fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2RldmljZS5oIGIvaW5jbHVkZS9hc20tdjg1MC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jaGVja3N1bS5oCmluZGV4IDk4OTQ2OWUuLjQxOWZlODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jaGVja3N1bS5oCkBAIC0xOSwxNSArMTksMTYgQEAKICAqIHRoZSBsYXN0IHN0ZXAgYmVmb3JlIHB1dHRpbmcgYSBjaGVja3N1bSBpbnRvIGEgcGFja2V0LgogICogTWFrZSBzdXJlIG5vdCB0byBtaXggd2l0aCA2NGJpdCBjaGVja3N1bXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJCSIgIGFkZGwgJTEsJTBcbiIKIAkJIiAgYWRjbCAkMHhmZmZmLCUwIgogCQk6ICI9ciIgKHN1bSkKLQkJOiAiciIgKHN1bSA8PCAxNiksICIwIiAoc3VtICYgMHhmZmZmMDAwMCkKKwkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAorCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCiAJKTsKLQlyZXR1cm4gKH5zdW0pID4+IDE2OworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KSh+KF9fZm9yY2UgdTMyKXN1bSA+PiAxNik7CiB9CiAKIC8qCkBAIC00Myw3ICs0NCw3IEBACiAgKiBpcGg6IGlwdjQgaGVhZGVyCiAgKiBpaGw6IGxlbmd0aCBvZiBoZWFkZXIgLyA0CiAgKi8gCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpIAorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bTsKIApAQCAtNzAsNyArNzEsNyBAQAogCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJtZW1vcnkiKTsKLQlyZXR1cm4oc3VtKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qKiAKQEAgLTg0LDE2ICs4NSwxNyBAQAogICogUmV0dXJucyB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bSB0aGUgaW5wdXQgZGF0YS4gUmVzdWx0IGlzIAogICogMzJiaXQgdW5mb2xkZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBzYWRkciwgdW5zaWduZWQgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlhc20oIiAgYWRkbCAlMSwgJTBcbiIKIAkgICAgIiAgYWRjbCAlMiwgJTBcbiIKIAkgICAgIiAgYWRjbCAlMywgJTBcbiIKIAkgICAgIiAgYWRjbCAkMCwgJTBcbiIKIAkJOiAiPXIiIChzdW0pCi0JICAgIDogImciIChkYWRkciksICJnIiAoc2FkZHIpLCAiZyIgKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgIjAiIChzdW0pKTsKKwkgICAgOiAiZyIgKGRhZGRyKSwgImciIChzYWRkciksCisJICAgICAgImciICgobGVuICsgcHJvdG8pPDw4KSwgIjAiIChzdW0pKTsKICAgICByZXR1cm4gc3VtOwogfQogCkBAIC0xMDksOSArMTExLDkgQEAKICAqIFJldHVybnMgdGhlIDE2Yml0IHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gdGhlIGlucHV0IGRhdGEgYWxyZWFkeQogICogY29tcGxlbWVudGVkIGFuZCByZWFkeSB0byBiZSBmaWxsZWQgaW4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKLQkJICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKSAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCSAgdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xMjYsMjUgKzEyOCwyNSBAQAogICogQmVmb3JlIGZpbGxpbmcgaXQgaW4gaXQgbmVlZHMgdG8gYmUgY3N1bV9mb2xkKCknZWQuCiAgKiBidWZmIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgNjRiaXQgYm91bmRhcnkgaWYgcG9zc2libGUuCiAgKi8gCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKICNkZWZpbmUgIF9IQVZFX0FSQ0hfQ09QWV9BTkRfQ1NVTV9GUk9NX1VTRVIgMQogI2RlZmluZSBIQVZFX0NTVU1fQ09QWV9VU0VSIDEKIAogCiAvKiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBVc2UgdGhlIHdyYXBwZXJzIGJlbG93ICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCQkgICAgICAgdW5zaWduZWQgbGVuLAotCQkJCQkgICAgICAgdW5zaWduZWQgc3VtLCAKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB2b2lkICpzcmMsIGNvbnN0IHZvaWQgKmRzdCwKKwkJCQkJICAgICAgIGludCBsZW4sCisJCQkJCSAgICAgICBfX3dzdW0gc3VtLAogCQkJCQkgICAgICAgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7CiAKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaXN1bSwgaW50ICplcnJwKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkJICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGlzdW0sIGludCAqZXJycCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gaXN1bSwgaW50ICplcnJwKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCisJCQkJICAgICAgaW50IGxlbiwgX193c3VtIGlzdW0sIGludCAqZXJycCk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sCisJCQkJCSAgICAgIF9fd3N1bSBzdW0pOwogCiAvKiBPbGQgbmFtZXMuIFRvIGJlIHJlbW92ZWQuICovCiAjZGVmaW5lIGNzdW1fYW5kX2NvcHlfdG9fdXNlciBjc3VtX3BhcnRpYWxfY29weV90b191c2VyCkBAIC0xNTgsNyArMTYwLDcgQEAKICAqIFJldHVybnMgdGhlIDE2Yml0IGZvbGRlZC9pbnZlcnRlZCBjaGVja3N1bSBvZiB0aGUgcGFzc2VkIGJ1ZmZlci4KICAqIFJlYWR5IHRvIGZpbGwgaW4uCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pOworZXh0ZXJuIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pOwogCiAvKioKICAqIGNzdW1faXB2Nl9tYWdpYyAtIENvbXB1dGUgY2hlY2tzdW0gb2YgYW4gSVB2NiBwc2V1ZG8gaGVhZGVyLgpAQCAtMTc2LDkgKzE3OCw5IEBACiBzdHJ1Y3QgaW42X2FkZHI7CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0gMQotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IAotY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCV9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fc3VtMTYKK2NzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQlfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBhZGQzMl93aXRoX2NhcnJ5KHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmYTAzZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kZXZpY2UuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpZm5kZWYgX0FTTV9YODZfNjRfREVWSUNFX0gKKyNkZWZpbmUgX0FTTV9YODZfNjRfREVWSUNFX0gKKworc3RydWN0IGRldl9hcmNoZGF0YSB7CisjaWZkZWYgQ09ORklHX0FDUEkKKwl2b2lkCSphY3BpX2hhbmRsZTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9BU01fWDg2XzY0X0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZWxmLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZWxmLmgKaW5kZXggYTQwNmZjYi4uNmQyNGVhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9lbGYuaApAQCAtNDUsNyArNDUsNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdHlwZXMuaAppbmRleCBjODZjMmU2Li4yZDQ0OTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdHlwZXMuaApAQCAtNDgsOSArNDgsNiBAQAogdHlwZWRlZiB1NjQgZG1hNjRfYWRkcl90OwogdHlwZWRlZiB1NjQgZG1hX2FkZHJfdDsKIAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKaW5kZXggMTlmOTkxNy4uZDVkYmM4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCkBAIC02LDcgKzYsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCmluZGV4IDAzMTE0ZjguLjU0MzVhZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCkBAIC0yNiw3ICsyNiw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTM2LDcgKzM2LDcgQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyggY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0sCithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLAogCQkJCQkJICAgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7CiAKIC8qCkBAIC00NiwzNCArNDYsMjUgQEAKICAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlIGFjY2Vzc19vaygpLgogICovCiBzdGF0aWMgaW5saW5lCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoIGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQlpbnQgbGVuLCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0pCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKCBzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKCBjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkJCWludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkJaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewotCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljICggc3JjLCBkc3QsIGxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBkc3QsCisJCQkJCWxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKIH0KIAogLyoKLSAqIFRoZXNlIGFyZSB0aGUgb2xkIChhbmQgdW5zYWZlKSB3YXkgb2YgZG9pbmcgY2hlY2tzdW1zLCBhIHdhcm5pbmcgbWVzc2FnZSB3aWxsIGJlCi0gKiBwcmludGVkIGlmIHRoZXkgYXJlIHVzZWQgYW5kIGFuIGV4ZXB0aW9uIG9jY3Vycy4KLSAqCi0gKiB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGdvIGF3YXkgYWZ0ZXIgc29tZSB0aW1lLgotICovCi0KLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbXVzZXIgY3N1bV9wYXJ0aWFsX2NvcHkKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weSggY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pOwotCi0vKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCBfX2R1bW15OwogCV9fYXNtX18oImV4dHVpCSUxLCAlMCwgMTYsIDE2XG5cdCIKQEAgLTg3LDE0ICs3OCwxNCBAQAogCQkiZXh0dWkJJTAsICUwLCAwLCAxNlxuXHQiCiAJCTogIj1yIiAoc3VtKSwgIj0mciIgKF9fZHVtbXkpCiAJCTogIjAiIChzdW0pKTsKLQlyZXR1cm4gc3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW0sIHRtcCwgZW5kYWRkcjsKIApAQCAtMTI3LDE3ICsxMTgsMTYgQEAKIAlyZXR1cm4JY3N1bV9mb2xkKHN1bSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAKICNpZmRlZiBfX1hURU5TQV9FTF9fCi0JdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NjsKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChsZW4gKyBwcm90bykgPDwgODsKICNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChwcm90bzw8MTYpK2xlbjsKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IGxlbiArIHByb3RvOwogI2Vsc2UKICMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQogI2VuZGlmCkBAIC0xNjIsMTEgKzE1MiwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgICAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTc2LDE3ICsxNjUsMTYgQEAKICAqIGluIGljbXAuYwogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAgICAgcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTMyIGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCSAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJICBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCBfX2R1bW15OwogCV9fYXNtX18oImwzMmkJJTEsICUyLCAwXG5cdCIKQEAgLTI0OCw4ICsyMzYsOCBAQAogICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgogICovCiAjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2FuZF9jb3B5X3RvX3VzZXIgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCSAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpCiAJCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgZXJyX3B0cik7CkBAIC0yNTcsNiArMjQ1LDYgQEAKIAlpZiAobGVuKQogCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CiAKLQlyZXR1cm4gLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggYTExNTVhMi4uZmY0MzMxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTYwLDggKzYwLDYgQEAKIGhlYWRlci15ICs9IGZkLmgKIGhlYWRlci15ICs9IGZkcmVnLmgKIGhlYWRlci15ICs9IGZpYl9ydWxlcy5oCi1oZWFkZXIteSArPSBmdGFwZS1oZWFkZXItc2VnbWVudC5oCi1oZWFkZXIteSArPSBmdGFwZS12ZW5kb3JzLmgKIGhlYWRlci15ICs9IGZ1c2UuaAogaGVhZGVyLXkgKz0gZnV0ZXguaAogaGVhZGVyLXkgKz0gZ2VuZXRsaW5rLmgKQEAgLTE5Myw3ICsxOTEsNiBAQAogdW5pZmRlZi15ICs9IGN5Y2xhZGVzLmgKIHVuaWZkZWYteSArPSBkY2NwLmgKIHVuaWZkZWYteSArPSBkaXJlbnQuaAotdW5pZmRlZi15ICs9IGRpdmVydC5oCiB1bmlmZGVmLXkgKz0gZGxtLmgKIHVuaWZkZWYteSArPSBlbGZjb3JlLmgKIHVuaWZkZWYteSArPSBlcnJuby5oCkBAIC0yMDcsNyArMjA0LDYgQEAKIHVuaWZkZWYteSArPSBmaWx0ZXIuaAogdW5pZmRlZi15ICs9IGZsYXQuaAogdW5pZmRlZi15ICs9IGZzLmgKLXVuaWZkZWYteSArPSBmdGFwZS5oCiB1bmlmZGVmLXkgKz0gZ2FtZXBvcnQuaAogdW5pZmRlZi15ICs9IGdlbmVyaWNfc2VyaWFsLmgKIHVuaWZkZWYteSArPSBnZW5oZC5oCkBAIC0zNDIsNiArMzM4LDUgQEAKIHVuaWZkZWYteSArPSB3YW5yb3V0ZXIuaAogdW5pZmRlZi15ICs9IHdhdGNoZG9nLmgKIHVuaWZkZWYteSArPSB4ZnJtLmgKLXVuaWZkZWYteSArPSB6ZnRhcGUuaAogCiBvYmpoZHIteSArPSB2ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNjdC5oIGIvaW5jbHVkZS9saW51eC9hY2N0LmgKaW5kZXggMDQ5NmQxZi4uMzAyZWI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY2N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hY2N0LmgKQEAgLTExOSw2ICsxMTksNyBAQAogI2lmZGVmIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUCiBzdHJ1Y3QgdmZzbW91bnQ7CiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CitzdHJ1Y3QgcGFjY3Rfc3RydWN0OwogZXh0ZXJuIHZvaWQgYWNjdF9hdXRvX2Nsb3NlX21udChzdHJ1Y3QgdmZzbW91bnQgKm0pOwogZXh0ZXJuIHZvaWQgYWNjdF9hdXRvX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIHZvaWQgYWNjdF9pbml0X3BhY2N0KHN0cnVjdCBwYWNjdF9zdHJ1Y3QgKnBhY2N0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRhLmggYi9pbmNsdWRlL2xpbnV4L2F0YS5oCmluZGV4IGQ4OTQ0MTkuLjFkZjk0MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdGEuaApAQCAtMjAwLDggKzIwMCw5IEBACiAJQVRBX0NCTF9OT05FCQk9IDAsCiAJQVRBX0NCTF9QQVRBNDAJCT0gMSwKIAlBVEFfQ0JMX1BBVEE4MAkJPSAyLAotCUFUQV9DQkxfUEFUQV9VTksJPSAzLAotCUFUQV9DQkxfU0FUQQkJPSA0LAorCUFUQV9DQkxfUEFUQTQwX1NIT1JUCT0gMywJCS8qIDQwIHdpcmUgY2FibGUgdG8gaGlnaCBVRE1BIHNwZWMgKi8KKwlBVEFfQ0JMX1BBVEFfVU5LCT0gNCwKKwlBVEFfQ0JMX1NBVEEJCT0gNSwKIAogCS8qIFNBVEEgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVycyAqLwogCVNDUl9TVEFUVVMJCT0gMCwKQEAgLTM0Miw2ICszNDMsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYXRhX2RyaXZlXzQwd2lyZShjb25zdCB1MTYgKmRldl9pZCkKK3sKKwlpZiAoYXRhX2lkX21ham9yX3ZlcnNpb24oZGV2X2lkKSA+PSA1ICYmIGF0YV9pZF9pc19zYXRhKGRldl9pZCkpCisJCXJldHVybiAwOwkvKiBTQVRBICovCisJaWYgKGRldl9pZFs5M10gJiAweDQwMDApCisJCXJldHVybiAwOwkvKiA4MCB3aXJlICovCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGF0YXBpX2NkYl9sZW4oY29uc3QgdTE2ICpkZXZfaWQpCiB7CiAJdTE2IHRtcCA9IGRldl9pZFswXSAmIDB4MzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtYXJwLmggYi9pbmNsdWRlL2xpbnV4L2F0bWFycC5oCmluZGV4IDI0ZjgyMzMuLmVlMTA4ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtYXJwLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1hcnAuaApAQCAtMzcsNyArMzcsNyBAQAogc3RydWN0IGF0bWFycF9jdHJsIHsKIAllbnVtIGF0bWFycF9jdHJsX3R5cGUJdHlwZTsJLyogbWVzc2FnZSB0eXBlICovCiAJaW50CQkJaXRmX251bTsvKiBpbnRlcmZhY2UgbnVtYmVyIChpZiBwcmVzZW50KSAqLwotCXVpbnQzMl90CQlpcDsJLyogSVAgYWRkcmVzcyAoYWN0X25lZWQgb25seSkgKi8KKwlfX2JlMzIJCQlpcDsJLyogSVAgYWRkcmVzcyAoYWN0X25lZWQgb25seSkgKi8KIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1icjI2ODQuaCBiL2luY2x1ZGUvbGludXgvYXRtYnIyNjg0LmgKaW5kZXggNzk4MWI3My4uOTY5ZmI2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdG1icjI2ODQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0bWJyMjY4NC5oCkBAIC04Niw4ICs4Niw4IEBACiAgKiBlZmZpY2llbnQgcGVyLWlmIGluL291dCBmaWx0ZXJzLCB0aGlzIHN1cHBvcnQgd2lsbCBiZSByZW1vdmVkCiAgKi8KIHN0cnVjdCBicjI2ODRfZmlsdGVyIHsKLQlfX3UzMglwcmVmaXg7CQkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLQlfX3UzMgluZXRtYXNrOwkvKiAwID0gZGlzYWJsZSBmaWx0ZXIgKi8KKwlfX2JlMzIJcHJlZml4OwkJLyogbmV0d29yayBieXRlIG9yZGVyICovCisJX19iZTMyCW5ldG1hc2s7CS8qIDAgPSBkaXNhYmxlIGZpbHRlciAqLwogfTsKIAogc3RydWN0IGJyMjY4NF9maWx0ZXJfc2V0IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtbXBjLmggYi9pbmNsdWRlL2xpbnV4L2F0bW1wYy5oCmluZGV4IDVmYmZhNjguLmVhMTY1MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtbXBjLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1tcGMuaApAQCAtMTMsNyArMTMsNyBAQAogCiBzdHJ1Y3QgYXRtbXBjX2lvYyB7CiAgICAgICAgIGludCBkZXZfbnVtOwotICAgICAgICB1aW50MzJfdCBpcGFkZHI7ICAgICAgICAgICAgICAvKiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgc2hvcnRjdXQgICAgKi8KKyAgICAgICAgX19iZTMyIGlwYWRkcjsgICAgICAgICAgICAgIC8qIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBzaG9ydGN1dCAgICAqLwogICAgICAgICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAvKiBpbmdyZXNzIG9yIGVncmVzcyAgICAgICAgICAgICAgICAgKi8KIH07CiAKQEAgLTIxLDggKzIxLDggQEAKICAgICAgICAgdWludDhfdCAgIExhc3RfTkhSUF9DSUVfY29kZTsKICAgICAgICAgdWludDhfdCAgIExhc3RfUTI5MzFfY2F1c2VfdmFsdWU7ICAgICAKICAgICAgICAgdWludDhfdCAgIGVnX01QQ19BVE1fYWRkcltBVE1fRVNBX0xFTl07Ci0gICAgICAgIHVpbnQzMl90ICB0YWc7Ci0gICAgICAgIHVpbnQzMl90ICBpbl9kc3RfaXA7ICAgICAgLyogSVAgYWRkcmVzcyB0aGlzIGluZ3Jlc3MgTVBDIHNlbmRzIHBhY2tldHMgdG8gKi8KKyAgICAgICAgX19iZTMyICB0YWc7CisgICAgICAgIF9fYmUzMiAgaW5fZHN0X2lwOyAgICAgIC8qIElQIGFkZHJlc3MgdGhpcyBpbmdyZXNzIE1QQyBzZW5kcyBwYWNrZXRzIHRvICovCiAgICAgICAgIHVpbnQxNl90ICBob2xkaW5nX3RpbWU7CiAgICAgICAgIHVpbnQzMl90ICByZXF1ZXN0X2lkOwogfSBpbl9jdHJsX2luZm87CkBAIC0zMCwxMCArMzAsMTAgQEAKIHR5cGVkZWYgc3RydWN0IGVnX2N0cmxfaW5mbyB7CiAgICAgICAgIHVpbnQ4X3QgICBETExfaGVhZGVyWzI1Nl07CiAgICAgICAgIHVpbnQ4X3QgICBESF9sZW5ndGg7Ci0gICAgICAgIHVpbnQzMl90ICBjYWNoZV9pZDsKLSAgICAgICAgdWludDMyX3QgIHRhZzsKLSAgICAgICAgdWludDMyX3QgIG1wc19pcDsKLSAgICAgICAgdWludDMyX3QgIGVnX2RzdF9pcDsgICAgICAvKiBJUCBhZGRyZXNzIHRvIHdoaWNoIGluZ3Jlc3MgTVBDIHNlbmRzIHBhY2tldHMgKi8KKyAgICAgICAgX19iZTMyICBjYWNoZV9pZDsKKyAgICAgICAgX19iZTMyICB0YWc7CisgICAgICAgIF9fYmUzMiAgbXBzX2lwOworICAgICAgICBfX2JlMzIgIGVnX2RzdF9pcDsgICAgICAvKiBJUCBhZGRyZXNzIHRvIHdoaWNoIGluZ3Jlc3MgTVBDIHNlbmRzIHBhY2tldHMgKi8KICAgICAgICAgdWludDhfdCAgIGluX01QQ19kYXRhX0FUTV9hZGRyW0FUTV9FU0FfTEVOXTsKICAgICAgICAgdWludDE2X3QgIGhvbGRpbmdfdGltZTsKIH0gZWdfY3RybF9pbmZvOwpAQCAtNDksNyArNDksNyBAQAogCiBzdHJ1Y3Qga19tZXNzYWdlIHsKICAgICAgICAgdWludDE2X3QgdHlwZTsKLSAgICAgICAgdWludDMyX3QgaXBfbWFzazsKKyAgICAgICAgX19iZTMyIGlwX21hc2s7CiAgICAgICAgIHVpbnQ4X3QgIE1QU19jdHJsW0FUTV9FU0FfTEVOXTsKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgIGluX2N0cmxfaW5mbyBpbl9pbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggN2JmY2RlMi4uZTFjNzI4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC02NzgsMTAgKzY3OCwxMSBAQAogZXh0ZXJuIHZvaWQgYmxrX3J1bl9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKik7CiBleHRlcm4gdm9pZCBibGtfc3RhcnRfcXVldWVpbmcocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2FjdGl2aXR5X2ZuKHJlcXVlc3RfcXVldWVfdCAqLCBhY3Rpdml0eV9mbiAqLCB2b2lkICopOwotZXh0ZXJuIGludCBibGtfcnFfbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgX191c2VyICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gaW50IGJsa19ycV91bm1hcF91c2VyKHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkIF9fdXNlciAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gaW50IGJsa19ycV9tYXBfa2VybihyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQsIGdmcF90KTsKLWV4dGVybiBpbnQgYmxrX3JxX21hcF91c2VyX2lvdihyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IHNnX2lvdmVjICosIGludCk7CitleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosCisJCQkgICAgICAgc3RydWN0IHNnX2lvdmVjICosIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgYmxrX2V4ZWN1dGVfcnEocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosCiAJCQkgIHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBleHRlcm4gdm9pZCBibGtfZXhlY3V0ZV9ycV9ub3dhaXQocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAppbmRleCBiOTlhNzE0Li4zNjgwZmY5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCkBAIC01MCw2ICs1MCwxNSBAQAogfTsKIAogLyoKKyAqIE5vdGlmeSBldmVudHMuCisgKi8KK2VudW0gYmxrdHJhY2Vfbm90aWZ5IHsKKwlfX0JMS19UTl9QUk9DRVNTID0gMCwJCS8qIGVzdGFibGlzaCBwaWQvbmFtZSBtYXBwaW5nICovCisJX19CTEtfVE5fVElNRVNUQU1QLAkJLyogaW5jbHVkZSBzeXN0ZW0gY2xvY2sgKi8KK307CisKKworLyoKICAqIFRyYWNlIGFjdGlvbnMgaW4gZnVsbC4gQWRkaXRpb25hbGx5LCByZWFkIG9yIHdyaXRlIGlzIG1hc2tlZAogICovCiAjZGVmaW5lIEJMS19UQV9RVUVVRQkJKF9fQkxLX1RBX1FVRVVFIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQpAQCAtNjgsNiArNzcsOSBAQAogI2RlZmluZSBCTEtfVEFfQk9VTkNFCQkoX19CTEtfVEFfQk9VTkNFKQogI2RlZmluZSBCTEtfVEFfUkVNQVAJCShfX0JMS19UQV9SRU1BUCB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKIAorI2RlZmluZSBCTEtfVE5fUFJPQ0VTUwkJKF9fQkxLX1ROX1BST0NFU1MgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQorI2RlZmluZSBCTEtfVE5fVElNRVNUQU1QCShfX0JMS19UTl9USU1FU1RBTVAgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQorCiAjZGVmaW5lIEJMS19JT19UUkFDRV9NQUdJQwkweDY1NjE3NDAwCiAjZGVmaW5lIEJMS19JT19UUkFDRV9WRVJTSU9OCTB4MDcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggM2ZlZjdkNi4uZjAyZDcxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC0zMyw2ICszMywxNCBAQAogCiBleHRlcm4gaW50IHJlZ2lzdGVyX2NwdShzdHJ1Y3QgY3B1ICpjcHUsIGludCBudW0pOwogZXh0ZXJuIHN0cnVjdCBzeXNfZGV2aWNlICpnZXRfY3B1X3N5c2Rldih1bnNpZ25lZCBjcHUpOworCitleHRlcm4gaW50IGNwdV9hZGRfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpOworZXh0ZXJuIHZvaWQgY3B1X3JlbW92ZV9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cik7CisKK2V4dGVybiBpbnQgY3B1X2FkZF9zeXNkZXZfYXR0cl9ncm91cChzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycyk7CitleHRlcm4gdm9pZCBjcHVfcmVtb3ZlX3N5c2Rldl9hdHRyX2dyb3VwKHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJzKTsKKworCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2NwdShzdHJ1Y3QgY3B1ICpjcHUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjY3AuaCBiL2luY2x1ZGUvbGludXgvZGNjcC5oCmluZGV4IDUzNTUzYzkuLmVkNmNjODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNjcC5oCkBAIC0zMCw3ICszMCw3IEBACiAjZWxzZQogI2Vycm9yICAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKICNlbmRpZgotCV9fdTE2CWRjY3BoX2NoZWNrc3VtOworCV9fc3VtMTYJZGNjcGhfY2hlY2tzdW07CiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCiAJX191OAlkY2NwaF94OjEsCiAJCWRjY3BoX3R5cGU6NCwKQEAgLTE3NSwxNyArMTc1LDIxIEBACiAJRENDUENfQ0NJRDMgPSAzLAogfTsKIAotLyogRENDUCBmZWF0dXJlcyAqLwotZW51bSB7Ci0JRENDUEZfUkVTRVJWRUQgPSAwLAotCURDQ1BGX0NDSUQgPSAxLAotCURDQ1BGX1NFUVVFTkNFX1dJTkRPVyA9IDMsCi0JRENDUEZfQUNLX1JBVElPID0gNSwKLQlEQ0NQRl9TRU5EX0FDS19WRUNUT1IgPSA2LAotCURDQ1BGX1NFTkRfTkRQX0NPVU5UID0gNywKLQkvKiAxMC0xMjcgcmVzZXJ2ZWQgKi8KLQlEQ0NQRl9NSU5fQ0NJRF9TUEVDSUZJQyA9IDEyOCwKLQlEQ0NQRl9NQVhfQ0NJRF9TUEVDSUZJQyA9IDI1NSwKKy8qIERDQ1AgZmVhdHVyZXMgKFJGQyA0MzQwIHNlY3Rpb24gNi40KSAqLworIGVudW0geworIAlEQ0NQRl9SRVNFUlZFRCA9IDAsCisgCURDQ1BGX0NDSUQgPSAxLAorCURDQ1BGX1NIT1JUX1NFUU5PUyA9IDIsCQkvKiBYWFg6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAJRENDUEZfU0VRVUVOQ0VfV0lORE9XID0gMywKKwlEQ0NQRl9FQ05fSU5DQVBBQkxFID0gNCwJLyogWFhYOiBub3QgeWV0IGltcGxlbWVudGVkICovCisgCURDQ1BGX0FDS19SQVRJTyA9IDUsCisgCURDQ1BGX1NFTkRfQUNLX1ZFQ1RPUiA9IDYsCisgCURDQ1BGX1NFTkRfTkRQX0NPVU5UID0gNywKKwlEQ0NQRl9NSU5fQ1NVTV9DT1ZFUiA9IDgsCisJRENDUEZfREFUQV9DSEVDS1NVTSA9IDksCS8qIFhYWDogbm90IHlldCBpbXBsZW1lbnRlZCAqLworIAkvKiAxMC0xMjcgcmVzZXJ2ZWQgKi8KKyAJRENDUEZfTUlOX0NDSURfU1BFQ0lGSUMgPSAxMjgsCisgCURDQ1BGX01BWF9DQ0lEX1NQRUNJRklDID0gMjU1LAogfTsKIAogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgYXJndW1lbnQgdG8gRENDUF9TT0NLT1BUX0NIQU5HRV9YICovCkBAIC0xOTYsMTMgKzIwMCwxNiBAQAogfTsKIAogLyogRENDUCBzb2NrZXQgb3B0aW9ucyAqLwotI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkUJMQorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkUJMSAvKiBYWFggZGVwcmVjYXRlZCwgd2l0aG91dCBlZmZlY3QgKi8KICNkZWZpbmUgRENDUF9TT0NLT1BUX1NFUlZJQ0UJCTIKICNkZWZpbmUgRENDUF9TT0NLT1BUX0NIQU5HRV9MCQkzCiAjZGVmaW5lIERDQ1BfU09DS09QVF9DSEFOR0VfUgkJNAorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVgkJMTAKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1JFQ1ZfQ1NDT1YJCTExCiAjZGVmaW5lIERDQ1BfU09DS09QVF9DQ0lEX1JYX0lORk8JMTI4CiAjZGVmaW5lIERDQ1BfU09DS09QVF9DQ0lEX1RYX0lORk8JMTkyCiAKKy8qIG1heGltdW0gbnVtYmVyIG9mIHNlcnZpY2VzIHByb3ZpZGVkIG9uIHRoZSBzYW1lIGxpc3RlbmluZyBwb3J0ICovCiAjZGVmaW5lIERDQ1BfU0VSVklDRV9MSVNUX01BWF9MRU4gICAgICAzMgogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMjU2LDYgKzI2MywxMyBAQAogCXJldHVybiAoc3RydWN0IGRjY3BfaGRyICopc2tiLT5oLnJhdzsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9oZHIgKmRjY3BfemVyb2VkX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGVhZGxlbikKK3sKKwlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBoZWFkbGVuKTsKKwltZW1zZXQoc2tiLT5oLnJhdywgMCwgaGVhZGxlbik7CisJcmV0dXJuIGRjY3BfaGRyKHNrYik7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX2V4dCAqZGNjcF9oZHJ4KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHJfZXh0ICopKHNrYi0+aC5yYXcgKyBzaXplb2Yoc3RydWN0IGRjY3BfaGRyKSk7CkBAIC0zNDIsNiArMzU2LDkgQEAKICAgKiBAZGNjcG1zX2NjaWQgLSBDb25nZXN0aW9uIENvbnRyb2wgSWQgKENDSUQpIChzZWN0aW9uIDEwKQogICAqIEBkY2NwbXNfc2VuZF9hY2tfdmVjdG9yIC0gU2VuZCBBY2sgVmVjdG9yIEZlYXR1cmUgKHNlY3Rpb24gMTEuNSkKICAgKiBAZGNjcG1zX3NlbmRfbmRwX2NvdW50IC0gU2VuZCBORFAgQ291bnQgRmVhdHVyZSAoNy43LjIpCisgICogQGRjY3Btc19hY2tfcmF0aW8gLSBBY2sgUmF0aW8gRmVhdHVyZSAoc2VjdGlvbiAxMS4zKQorICAqIEBkY2NwbXNfcGVuZGluZyAtIExpc3Qgb2YgZmVhdHVyZXMgYmVpbmcgbmVnb3RpYXRlZAorICAqIEBkY2NwbXNfY29uZiAtCiAgICovCiBzdHJ1Y3QgZGNjcF9taW5pc29jayB7CiAJX191NjQJCQlkY2NwbXNfc2VxdWVuY2Vfd2luZG93OwpAQCAtNDM5LDEyICs0NTYsMjUgQEAKICAqIEBkY2Nwc19nc3MgLSBncmVhdGVzdCBzZXF1ZW5jZSBudW1iZXIgc2VudAogICogQGRjY3BzX2dzciAtIGdyZWF0ZXN0IHZhbGlkIHNlcXVlbmNlIG51bWJlciByZWNlaXZlZAogICogQGRjY3BzX2dhciAtIGdyZWF0ZXN0IHZhbGlkIGFjayBudW1iZXIgcmVjZWl2ZWQgb24gYSBub24tU3luYzsgaW5pdGlhbGl6ZWQgdG8gJWRjY3BzX2lzcworICogQGRjY3BzX3NlcnZpY2UgLSBmaXJzdCAocGFzc2l2ZSBzb2NrKSBvciB1bmlxdWUgKGFjdGl2ZSBzb2NrKSBzZXJ2aWNlIGNvZGUKKyAqIEBkY2Nwc19zZXJ2aWNlX2xpc3QgLSBzZWNvbmQgLi4gbGFzdCBzZXJ2aWNlIGNvZGUgb24gcGFzc2l2ZSBzb2NrZXQKICAqIEBkY2Nwc190aW1lc3RhbXBfdGltZSAtIHRpbWUgb2YgbGF0ZXN0IFRJTUVTVEFNUCBvcHRpb24KICAqIEBkY2Nwc190aW1lc3RhbXBfZWNobyAtIGxhdGVzdCB0aW1lc3RhbXAgcmVjZWl2ZWQgb24gYSBUSU1FU1RBTVAgb3B0aW9uCi0gKiBAZGNjcHNfcGFja2V0X3NpemUgLSBTZXQgdGhydSBzZXRzb2Nrb3B0Ci0gKiBAZGNjcHNfcm9sZSAtIFJvbGUgb2YgdGhpcyBzb2NrLCBvbmUgb2YgJWRjY3Bfcm9sZQorICogQGRjY3BzX2xfYWNrX3JhdGlvIC0KKyAqIEBkY2Nwc19yX2Fja19yYXRpbyAtCisgKiBAZGNjcHNfcGNzbGVuIC0gc2VuZGVyICAgcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSAodmlhIHNvY2tvcHQpCisgKiBAZGNjcHNfcGNybGVuIC0gcmVjZWl2ZXIgcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSAodmlhIHNvY2tvcHQpCiAgKiBAZGNjcHNfbmRwX2NvdW50IC0gbnVtYmVyIG9mIE5vbiBEYXRhIFBhY2tldHMgc2luY2UgbGFzdCBkYXRhIHBhY2tldAorICogQGRjY3BzX21zc19jYWNoZSAtCisgKiBAZGNjcHNfbWluaXNvY2sgLQogICogQGRjY3BzX2hjX3J4X2Fja3ZlYyAtIHJ4IGhhbGYgY29ubmVjdGlvbiBhY2sgdmVjdG9yCisgKiBAZGNjcHNfaGNfcnhfY2NpZCAtCisgKiBAZGNjcHNfaGNfdHhfY2NpZCAtCisgKiBAZGNjcHNfb3B0aW9uc19yZWNlaXZlZCAtCisgKiBAZGNjcHNfZXBvY2ggLQorICogQGRjY3BzX3JvbGUgLSBSb2xlIG9mIHRoaXMgc29jaywgb25lIG9mICVkY2NwX3JvbGUKKyAqIEBkY2Nwc19oY19yeF9pbnNlcnRfb3B0aW9ucyAtCisgKiBAZGNjcHNfaGNfdHhfaW5zZXJ0X29wdGlvbnMgLQogICogQGRjY3BzX3htaXRfdGltZXIgLSB0aW1lciBmb3Igd2hlbiBDQ0lEIGlzIG5vdCByZWFkeSB0byBzZW5kCiAgKi8KIHN0cnVjdCBkY2NwX3NvY2sgewpAQCAtNDY0LDkgKzQ5NCwxMCBAQAogCXN0cnVjdCBkY2NwX3NlcnZpY2VfbGlzdAkqZGNjcHNfc2VydmljZV9saXN0OwogCXN0cnVjdCB0aW1ldmFsCQkJZGNjcHNfdGltZXN0YW1wX3RpbWU7CiAJX191MzIJCQkJZGNjcHNfdGltZXN0YW1wX2VjaG87Ci0JX191MzIJCQkJZGNjcHNfcGFja2V0X3NpemU7CiAJX191MTYJCQkJZGNjcHNfbF9hY2tfcmF0aW87CiAJX191MTYJCQkJZGNjcHNfcl9hY2tfcmF0aW87CisJX191MTYJCQkJZGNjcHNfcGNzbGVuOworCV9fdTE2CQkJCWRjY3BzX3BjcmxlbjsKIAl1bnNpZ25lZCBsb25nCQkJZGNjcHNfbmRwX2NvdW50OwogCV9fdTMyCQkJCWRjY3BzX21zc19jYWNoZTsKIAlzdHJ1Y3QgZGNjcF9taW5pc29jawkJZGNjcHNfbWluaXNvY2s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCA5ZDRmNmE5Li41ODNhMzQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2RldmljZS5oPgogCiAjZGVmaW5lIERFVklDRV9OQU1FX1NJWkUJNTAKICNkZWZpbmUgREVWSUNFX05BTUVfSEFMRglfX3N0cmluZ2lmeSgyMCkJLyogTGVzcyB0aGFuIGhhbGYgdG8gYWNjb21tb2RhdGUgc2xvcCAqLwpAQCAtNDIsNiArNDMsOCBAQAogCXN0cnVjdCBrbGlzdAkJa2xpc3RfZGV2aWNlczsKIAlzdHJ1Y3Qga2xpc3QJCWtsaXN0X2RyaXZlcnM7CiAKKwlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBidXNfbm90aWZpZXI7CisKIAlzdHJ1Y3QgYnVzX2F0dHJpYnV0ZQkqIGJ1c19hdHRyczsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQkqIGRldl9hdHRyczsKIAlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZQkqIGRydl9hdHRyczsKQEAgLTc1LDYgKzc4LDI5IEBACiAJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpzdGFydCwgdm9pZCAqZGF0YSwKIAkJaW50ICgqZm4pKHN0cnVjdCBkZXZpY2VfZHJpdmVyICosIHZvaWQgKikpOwogCisvKgorICogQnVzIG5vdGlmaWVyczogR2V0IG5vdGlmaWVkIG9mIGFkZGl0aW9uL3JlbW92YWwgb2YgZGV2aWNlcworICogYW5kIGJpbmRpbmcvdW5iaW5kaW5nIG9mIGRyaXZlcnMgdG8gZGV2aWNlcy4KKyAqIEluIHRoZSBsb25nIHJ1biwgaXQgc2hvdWxkIGJlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBwbGF0Zm9ybQorICogbm90aWZ5IGhvb2tzLgorICovCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CisKK2V4dGVybiBpbnQgYnVzX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLAorCQkJCSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGJ1c190eXBlICpidXMsCisJCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKKy8qIEFsbCA0IG5vdGlmZXJzIGJlbG93IGdldCBjYWxsZWQgd2l0aCB0aGUgdGFyZ2V0IHN0cnVjdCBkZXZpY2UgKgorICogYXMgYW4gYXJndW1lbnQuIE5vdGUgdGhhdCB0aG9zZSBmdW5jdGlvbnMgYXJlIGxpa2VseSB0byBiZSBjYWxsZWQKKyAqIHdpdGggdGhlIGRldmljZSBzZW1hcGhvcmUgaGVsZCBpbiB0aGUgY29yZSwgc28gYmUgY2FyZWZ1bC4KKyAqLworI2RlZmluZSBCVVNfTk9USUZZX0FERF9ERVZJQ0UJCTB4MDAwMDAwMDEgLyogZGV2aWNlIGFkZGVkICovCisjZGVmaW5lIEJVU19OT1RJRllfREVMX0RFVklDRQkJMHgwMDAwMDAwMiAvKiBkZXZpY2UgcmVtb3ZlZCAqLworI2RlZmluZSBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUgkJMHgwMDAwMDAwMyAvKiBkcml2ZXIgYm91bmQgdG8gZGV2aWNlICovCisjZGVmaW5lIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUgkweDAwMDAwMDA0IC8qIGRyaXZlciBhYm91dCB0byBiZQorCQkJCQkJICAgICAgdW5ib3VuZCAqLworCiAvKiBkcml2ZXJmcyBpbnRlcmZhY2UgZm9yIGV4cG9ydGluZyBidXMgYXR0cmlidXRlcyAqLwogCiBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSB7CkBAIC0zNDMsOCArMzY5LDYgQEAKIAl2b2lkCQkqZHJpdmVyX2RhdGE7CS8qIGRhdGEgcHJpdmF0ZSB0byB0aGUgZHJpdmVyICovCiAJdm9pZAkJKnBsYXRmb3JtX2RhdGE7CS8qIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEsIGRldmljZQogCQkJCQkgICBjb3JlIGRvZXNuJ3QgdG91Y2ggaXQgKi8KLQl2b2lkCQkqZmlybXdhcmVfZGF0YTsgLyogRmlybXdhcmUgc3BlY2lmaWMgZGF0YSAoZS5nLiBBQ1BJLAotCQkJCQkgICBCSU9TIGRhdGEpLHJlc2VydmVkIGZvciBkZXZpY2UgY29yZSovCiAJc3RydWN0IGRldl9wbV9pbmZvCXBvd2VyOwogCiAJdTY0CQkqZG1hX21hc2s7CS8qIGRtYSBtYXNrIChpZiBkbWEnYWJsZSBkZXZpY2UpICovCkBAIC0zNTgsNiArMzgyLDggQEAKIAogCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtCSpkbWFfbWVtOyAvKiBpbnRlcm5hbCBmb3IgY29oZXJlbnQgbWVtCiAJCQkJCSAgICAgb3ZlcnJpZGUgKi8KKwkvKiBhcmNoIHNwZWNpZmljIGFkZGl0aW9ucyAqLworCXN0cnVjdCBkZXZfYXJjaGRhdGEJYXJjaGRhdGE7CiAKIAkvKiBjbGFzc19kZXZpY2UgbWlncmF0aW9uIHBhdGggKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CkBAIC0zOTUsNyArNDIxLDEwIEBACiBleHRlcm4gdm9pZCBkZXZpY2VfZGVsKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoc3RydWN0IGRldmljZSAqLCB2b2lkICosCiAJCSAgICAgaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CitleHRlcm4gc3RydWN0IGRldmljZSAqZGV2aWNlX2ZpbmRfY2hpbGQoc3RydWN0IGRldmljZSAqLCB2b2lkICpkYXRhLAorCQkJCQlpbnQgKCptYXRjaCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIGV4dGVybiBpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm5ld19uYW1lKTsKK2V4dGVybiBpbnQgZGV2aWNlX21vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpuZXdfcGFyZW50KTsKIAogLyoKICAqIE1hbnVhbCBiaW5kaW5nIG9mIGEgZGV2aWNlIHRvIGRyaXZlci4gU2VlIGRyaXZlcnMvYmFzZS9idXMuYwpAQCAtNDE1LDggKzQ0NCw2IEBACiAJCQkJICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsNCw1KSkpOwogZXh0ZXJuIHZvaWQgZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGNsYXNzICpjbHMsIGRldl90IGRldnQpOwogCi1leHRlcm4gaW50IHZpcnR1YWxfZGV2aWNlX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCiAvKgogICogUGxhdGZvcm0gImZpeHVwIiBmdW5jdGlvbnMgLSBhbGxvdyB0aGUgcGxhdGZvcm0gdG8gaGF2ZSB0aGVpciBzYXkKICAqIGFib3V0IGRldmljZXMgYW5kIGFjdGlvbnMgdGhhdCB0aGUgZ2VuZXJhbCBkZXZpY2UgbGF5ZXIgZG9lc24ndApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kaXZlcnQuaCBiL2luY2x1ZGUvbGludXgvZGl2ZXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjRlOWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9kaXZlcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogRnJhbWUgRGl2ZXJzaW9uLCBCZW5vaXQgTG9jaGVyIDxCZW5vaXQuTG9jaGVyQHNrZi5jb20+Ci0gKgotICogQ2hhbmdlczoKLSAqIAkJMDYvMDkvMjAwMAlCTDoJaW5pdGlhbCB2ZXJzaW9uCi0gKiAKLSAqLwotIAotI2lmbmRlZiBfTElOVVhfRElWRVJUX0gKLSNkZWZpbmUgX0xJTlVYX0RJVkVSVF9ICi0KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2RlZmluZQlNQVhfRElWRVJUX1BPUlRTCTgJLyogTWF4IG51bWJlciBvZiBwb3J0cyB0byBkaXZlcnQgKHRjcCwgdWRwKSAqLwotCi0vKiBEaXZlcnRhYmxlIHByb3RvY29scyAqLwotI2RlZmluZQlESVZFUlRfUFJPVE9fTk9ORQkweDAwMDAKLSNkZWZpbmUJRElWRVJUX1BST1RPX0lQCQkweDAwMDEKLSNkZWZpbmUJRElWRVJUX1BST1RPX0lDTVAJMHgwMDAyCi0jZGVmaW5lCURJVkVSVF9QUk9UT19UQ1AJMHgwMDA0Ci0jZGVmaW5lCURJVkVSVF9QUk9UT19VRFAJMHgwMDA4Ci0KLS8qCi0gKglUaGlzIGlzIGFuIEV0aGVybmV0IEZyYW1lIERpdmVydGVyIG9wdGlvbiBibG9jawotICovCi1zdHJ1Y3QgZGl2ZXJ0X2JsawotewotCWludAkJZGl2ZXJ0OyAgLyogYXJlIHdlIGFjdGl2ZSAqLwotCXVuc2lnbmVkIGludCBwcm90b3M7CS8qIHByb3RvY29scyAqLwotCV9fdTE2CQl0Y3BfZHN0W01BWF9ESVZFUlRfUE9SVFNdOyAvKiBzcGVjaWZpYyB0Y3AgZHN0IHBvcnRzIHRvIGRpdmVydCAqLwotCV9fdTE2CQl0Y3Bfc3JjW01BWF9ESVZFUlRfUE9SVFNdOyAvKiBzcGVjaWZpYyB0Y3Agc3JjIHBvcnRzIHRvIGRpdmVydCAqLwotCV9fdTE2CQl1ZHBfZHN0W01BWF9ESVZFUlRfUE9SVFNdOyAvKiBzcGVjaWZpYyB1ZHAgZHN0IHBvcnRzIHRvIGRpdmVydCAqLwotCV9fdTE2CQl1ZHBfc3JjW01BWF9ESVZFUlRfUE9SVFNdOyAvKiBzcGVjaWZpYyB1ZHAgc3JjIHBvcnRzIHRvIGRpdmVydCAqLwotfTsKLQotLyoKLSAqIERpdmVyc2lvbiBjb250cm9sIGJsb2NrLCBmb3IgY29uZmlndXJhdGlvbiB3aXRoIHRoZSB1c2Vyc3BhY2UgdG9vbAotICogZGl2ZXJ0Ci0gKi8KLQotdHlwZWRlZiB1bmlvbiBfZGl2ZXJ0X2NmX2FyZwotewotCV9fczE2CQlpbnQxNjsKLQlfX3UxNgkJdWludDE2OwotCV9fczMyCQlpbnQzMjsKLQlfX3UzMgkJdWludDMyOwotCV9fczY0CQlpbnQ2NDsKLQlfX3U2NAkJdWludDY0OwotCXZvaWQJX191c2VyICpwdHI7Ci19IGRpdmVydF9jZl9hcmc7Ci0KLQotc3RydWN0IGRpdmVydF9jZgotewotCWludAljbWQ7CQkJCS8qIENvbW1hbmQgKi8KLQlkaXZlcnRfY2ZfYXJnIAlhcmcxLAotCQkJCQlhcmcyLAotCQkJCQlhcmczOwotCWludAlkZXZfaW5kZXg7CS8qIGRldmljZSBpbmRleCAoZXRoMD0wLCBldGMuLi4pICovCi19OwotCi0KLS8qIERpdmVyc2lvbiBjb21tYW5kcyAqLwotI2RlZmluZQlESVZDTURfRElWRVJUCQkJMSAvKiBFTkFCTEUvRElTQUJMRSBkaXZlcnNpb24gKi8KLSNkZWZpbmUJRElWQ01EX0lQCQkJCTIgLyogRU5BQkxFL0RJU0FCTEUgd2hvbGQgSVAgZGl2ZXJzaW9uICovCi0jZGVmaW5lCURJVkNNRF9UQ1AJCQkJMyAvKiBFTkFCTEUvRElTQUJMRSB3aG9sZCBUQ1AgZGl2ZXJzaW9uICovCi0jZGVmaW5lCURJVkNNRF9UQ1BEU1QJCQk0IC8qIEFERC9SRU1PVkUgVENQIERTVCBwb3J0IGZvciBkaXZlcnNpb24gKi8KLSNkZWZpbmUJRElWQ01EX1RDUFNSQwkJCTUgLyogQUREL1JFTU9WRSBUQ1AgU1JDIHBvcnQgZm9yIGRpdmVyc2lvbiAqLwotI2RlZmluZQlESVZDTURfVURQCQkJCTYgLyogRU5BQkxFL0RJU0FCTEUgd2hvbGUgVURQIGRpdmVyc2lvbiAqLwotI2RlZmluZQlESVZDTURfVURQRFNUCQkJNyAvKiBBREQvUkVNT1ZFIFVEUCBEU1QgcG9ydCBmb3IgZGl2ZXJzaW9uICovCi0jZGVmaW5lCURJVkNNRF9VRFBTUkMJCQk4IC8qIEFERC9SRU1PVkUgVURQIFNSQyBwb3J0IGZvciBkaXZlcnNpb24gKi8KLSNkZWZpbmUJRElWQ01EX0lDTVAJCQkJOSAvKiBFTkFCTEUvRElTQUJMRSB3aG9sZSBJQ01QIGRpdmVyc2lvbiAqLwotI2RlZmluZQlESVZDTURfR0VUU1RBVFVTCQkxMCAvKiBHRVQgdGhlIHN0YXR1cyBvZiB0aGUgZGl2ZXJ0ZXIgKi8KLSNkZWZpbmUJRElWQ01EX1JFU0VUCQkJMTEgLyogUmVzZXQgdGhlIGRpdmVydGVyIG9uIHRoZSBzcGVjaWZpZWQgZGV2ICovCi0jZGVmaW5lIERJVkNNRF9HRVRWRVJTSU9OCQkxMiAvKiBSZXRyaWV2ZSB0aGUgZGl2ZXJ0ZXIgY29kZSB2ZXJzaW9uIChjaGFyWzMyXSkgKi8KLQotLyogR2VuZXJhbCBzeW50YXggb2YgdGhlIGNvbW1hbmRzOgotICogCi0gKiBESVZDTURfeHh4eHh4KGFyZzEsIGFyZzIsIGFyZzMsIGRldl9pbmRleCkKLSAqIAotICogU0lPQ1NJRkRJVkVSVDoKLSAqICAgRElWQ01EX0RJVkVSVChESVZBUkcxX0VOQUJMRXxESVZBUkcxX0RJU0FCTEUsICwgLGlmaW5kZXgpCi0gKiAgIERJVkNNRF9JUChESVZBUkcxX0VOQUJMRXxESVZBUkcxX0RJU0FCTEUsICwgLCBpZmluZGV4KQotICogICBESVZDTURfVENQKERJVkFSRzFfRU5BQkxFfERJVkFSRzFfRElTQUJMRSwgLCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9UQ1BEU1QoRElWQVJHMV9BRER8RElWQVJHMV9SRU1PVkUsIHBvcnQsICwgaWZpbmRleCkKLSAqICAgRElWQ01EX1RDUFNSQyhESVZBUkcxX0FERHxESVZBUkcxX1JFTU9WRSwgcG9ydCwgLCBpZmluZGV4KQotICogICBESVZDTURfVURQKERJVkFSRzFfRU5BQkxFfERJVkFSRzFfRElTQUJMRSwgLCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9VRFBEU1QoRElWQVJHMV9BRER8RElWQVJHMV9SRU1PVkUsIHBvcnQsICwgaWZpbmRleCkKLSAqICAgRElWQ01EX1VEUFNSQyhESVZBUkcxX0FERHxESVZBUkcxX1JFTU9WRSwgcG9ydCwgLCBpZmluZGV4KQotICogICBESVZDTURfSUNNUChESVZBUkcxX0VOQUJMRXxESVZBUkcxX0RJU0FCTEUsICwgLCBpZmluZGV4KQotICogICBESVZDTURfUkVTRVQoLCAsICwgaWZpbmRleCkKLSAqICAgCi0gKiBTSU9HSUZESVZFUlQ6Ci0gKiAgIERJVkNNRF9HRVRTVEFUVVMoZGl2ZXJ0X2JsaywgLCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9HRVRWRVJTSU9OKHN0cmluZ1szXSkKLSAqLwotCi0KLS8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgYXJnMSAqLwotI2RlZmluZQlESVZBUkcxX0VOQUJMRQkJCTAgLyogRU5BQkxFIHNvbWV0aGluZyAqLwotI2RlZmluZQlESVZBUkcxX0RJU0FCTEUJCQkxIC8qIERJU0FCTEUgc29tZXRoaW5nICovCi0jZGVmaW5lIERJVkFSRzFfQURECQkJCTIgLyogQUREIHNvbWV0aGluZyAqLwotI2RlZmluZSBESVZBUkcxX1JFTU9WRQkJCTMgLyogUkVNT1ZFIHNvbWV0aGluZyAqLwotCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qIGRpdmVydGVyIGZ1bmN0aW9ucyAqLwotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaWZkZWYgQ09ORklHX05FVF9ESVZFUlQKLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLQotaW50IGFsbG9jX2RpdmVydF9ibGsoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci12b2lkIGZyZWVfZGl2ZXJ0X2JsayhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLWludCBkaXZlcnRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGRpdmVydF9jZiBfX3VzZXIgKmFyZyk7Ci12b2lkIGRpdmVydF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfZGl2ZXJ0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQkvKiBpZiBkaXZlcnNpb24gaXMgc3VwcG9ydGVkIG9uIGRldmljZSwgdGhlbiBkaXZlcnQgKi8KLQlpZiAoc2tiLT5kZXYtPmRpdmVydCAmJiBza2ItPmRldi0+ZGl2ZXJ0LT5kaXZlcnQpCi0JCWRpdmVydF9mcmFtZShza2IpOwotfQotCi0jZWxzZQotIyBkZWZpbmUgYWxsb2NfZGl2ZXJ0X2JsayhkZXYpCQkoMCkKLSMgZGVmaW5lIGZyZWVfZGl2ZXJ0X2JsayhkZXYpCQlkbyB7fSB3aGlsZSAoMCkKLSMgZGVmaW5lIGRpdmVydF9pb2N0bChjbWQsIGFyZykJCSgtRU5PUEtHKQotIyBkZWZpbmUgaGFuZGxlX2RpdmVydGVyKHNrYikJCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0jZW5kaWYgCi0jZW5kaWYJLyogX0xJTlVYX0RJVkVSVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmggYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKaW5kZXggMmZhOWYxMS4uYTI0OTMxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaApAQCAtMjEsMTEgKzIxLDExIEBACiB0eXBlZGVmIGludCAoZWxldmF0b3JfbWF5X3F1ZXVlX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIGludCk7CiAKIHR5cGVkZWYgaW50IChlbGV2YXRvcl9zZXRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGdmcF90KTsKLXR5cGVkZWYgdm9pZCAoZWxldmF0b3JfcHV0X3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3R5cGVkZWYgdm9pZCAoZWxldmF0b3JfcHV0X3JlcV9mbikgKHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9hY3RpdmF0ZV9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiB0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2RlYWN0aXZhdGVfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogCi10eXBlZGVmIHZvaWQgKihlbGV2YXRvcl9pbml0X2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIGVsZXZhdG9yX3QgKik7Cit0eXBlZGVmIHZvaWQgKihlbGV2YXRvcl9pbml0X2ZuKSAocmVxdWVzdF9xdWV1ZV90ICopOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9leGl0X2ZuKSAoZWxldmF0b3JfdCAqKTsKIAogc3RydWN0IGVsZXZhdG9yX29wcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGYuaCBiL2luY2x1ZGUvbGludXgvZWxmLmgKaW5kZXggYjcwZDFkMi4uNzQzZDVjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0zNjgsNSArMzY4LDEyIEBACiAKICNlbmRpZgogCisjaWZuZGVmIEFSQ0hfSEFWRV9FWFRSQV9FTEZfTk9URVMKK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfbm90ZXNfc2l6ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV9ub3RlcyhzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9CisKKyNkZWZpbmUgRUxGX0NPUkVfRVhUUkFfTk9URVNfU0laRSBhcmNoX25vdGVzX3NpemUoKQorI2RlZmluZSBFTEZfQ09SRV9XUklURV9FWFRSQV9OT1RFUyBhcmNoX3dyaXRlX25vdGVzKGZpbGUpCisjZW5kaWYgLyogQVJDSF9IQVZFX0VYVFJBX0VMRl9OT1RFUyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggM2U2OTI0MS4uZmEyM2UwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtNzc0LDggKzc3NCw4IEBACiAjZW5kaWYKIAogCXN0cnVjdCBmYl9vcHMgKmZib3BzOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2U7IC8qIHN5c2ZzIHBlciBkZXZpY2UgYXR0cnMgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CQkvKiBUaGlzIGlzIHRoZSBwYXJlbnQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBUaGlzIGlzIHRoaXMgZmIgZGV2aWNlICovCiAJaW50IGNsYXNzX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAvKiBwcml2YXRlIHN5c2ZzIGZsYWdzICovCiAjaWZkZWYgQ09ORklHX0ZCX1RJTEVCTElUVElORwogCXN0cnVjdCBmYl90aWxlX29wcyAqdGlsZW9wczsgICAgLyogVGlsZSBCbGl0dGluZyAqLwpAQCAtOTEwLDggKzkxMCw4IEBACiAvKiBkcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYyAqLwogZXh0ZXJuIHN0cnVjdCBmYl9pbmZvICpmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplX3Qgc2l6ZSwgc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGZyYW1lYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8pOwotZXh0ZXJuIGludCBmYl9pbml0X2NsYXNzX2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyk7Ci1leHRlcm4gdm9pZCBmYl9jbGVhbnVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaGVhZCk7CitleHRlcm4gaW50IGZiX2luaXRfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKK2V4dGVybiB2b2lkIGZiX2NsZWFudXBfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpoZWFkKTsKIGV4dGVybiB2b2lkIGZiX2JsX2RlZmF1bHRfY3VydmUoc3RydWN0IGZiX2luZm8gKmZiX2luZm8sIHU4IG9mZiwgdTggbWluLCB1OCBtYXgpOwogCiAvKiBkcml2ZXJzL3ZpZGVvL2ZibW9uLmMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmggYi9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oCmluZGV4IDQ0MThjOGQuLjgyNzBhYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaApAQCAtNiw2ICs2LDcgQEAKIAogLyogcnVsZSBpcyBwZXJtYW5lbnQsIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCAqLwogI2RlZmluZSBGSUJfUlVMRV9QRVJNQU5FTlQJMQorI2RlZmluZSBGSUJfUlVMRV9JTlZFUlQJCTIKIAogc3RydWN0IGZpYl9ydWxlX2hkcgogewpAQCAtMzQsNyArMzUsNyBAQAogCUZSQV9VTlVTRUQzLAogCUZSQV9VTlVTRUQ0LAogCUZSQV9VTlVTRUQ1LAotCUZSQV9GV01BUkssCS8qIG5ldGZpbHRlciBtYXJrICovCisJRlJBX0ZXTUFSSywJLyogbWFyayAqLwogCUZSQV9GTE9XLAkvKiBmbG93L2NsYXNzIGlkICovCiAJRlJBX1VOVVNFRDYsCiAJRlJBX1VOVVNFRDcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggMmZlNmUzZi4uY2FjN2IxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMjc2LDcgKzI3Niw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW9fdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC05NzcsMzYgKzk3NywxMyBAQAogI2RlZmluZSB2ZnNfY2hlY2tfZnJvemVuKHNiLCBsZXZlbCkgXAogCXdhaXRfZXZlbnQoKHNiKS0+c193YWl0X3VuZnJvemVuLCAoKHNiKS0+c19mcm96ZW4gPCAobGV2ZWwpKSkKIAotc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19leGNsKHZvaWQpCi17Ci0JYXRvbWljX2luYygmY3VycmVudC0+ZnNfZXhjbCk7Ci19CisjZGVmaW5lIGdldF9mc19leGNsKCkgYXRvbWljX2luYygmY3VycmVudC0+ZnNfZXhjbCkKKyNkZWZpbmUgcHV0X2ZzX2V4Y2woKSBhdG9taWNfZGVjKCZjdXJyZW50LT5mc19leGNsKQorI2RlZmluZSBoYXNfZnNfZXhjbCgpIGF0b21pY19yZWFkKCZjdXJyZW50LT5mc19leGNsKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZzX2V4Y2wodm9pZCkKLXsKLQlhdG9taWNfZGVjKCZjdXJyZW50LT5mc19leGNsKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaGFzX2ZzX2V4Y2wodm9pZCkKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmN1cnJlbnQtPmZzX2V4Y2wpOwotfQotCi0KLS8qCi0gKiBTdXBlcmJsb2NrIGxvY2tpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBsb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQotewotCWdldF9mc19leGNsKCk7Ci0JbXV0ZXhfbG9jaygmc2ItPnNfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCi17Ci0JcHV0X2ZzX2V4Y2woKTsKLQltdXRleF91bmxvY2soJnNiLT5zX2xvY2spOwotfQorLyogbm90IHF1aXRlIHJlYWR5IHRvIGJlIGRlcHJlY2F0ZWQsIGJ1dC4uLiAqLworZXh0ZXJuIHZvaWQgbG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCB1bmxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCiAvKgogICogVkZTIGhlbHBlciBmdW5jdGlvbnMuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oIGIvaW5jbHVkZS9saW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzMyMjE4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9IRUFERVJfU0VHTUVOVF9ICi0jZGVmaW5lIF9GVEFQRV9IRUFERVJfU0VHTUVOVF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2luY2x1ZGUvbGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjI4ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgb2Zmc2V0cyBpbnRvIHRoZSBoZWFkZXIgc2VnbWVudCBvZiBhCi0gKiAgICAgIGZsb3BweSB0YXBlIGNhcnRyaWRnZS4gIEZvciB1c2Ugd2l0aCB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMAotICogICAgICBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCi0gKi8KLQotI2RlZmluZSBGVF9TSUdOQVRVUkUgICAwICAvKiBtdXN0IGJlIDB4YWE1NWFhNTUgKi8KLSNkZWZpbmUgRlRfRk1UX0NPREUgICAgNAotI2RlZmluZSBGVF9SRVZfTEVWRUwgICA1ICAvKiBvbmx5IGZvciBRSUMtODAgc2luY2UuIFJldi4gTCAoPT0gMHgwYykgICAgICAgICAqLwotI2RlZmluZSBGVF9IU0VHXzEgICAgICA2ICAvKiBmaXJzdCBoZWFkZXIgc2VnbWVudCwgZXhjZXB0IGZvciBmb3JtYXQgY29kZSAgNiAqLwotI2RlZmluZSBGVF9IU0VHXzIgICAgICA4ICAvKiBzZWNvbmQgaGVhZGVyIHNlZ21lbnQsIGV4Y2VwdCBmb3IgZm9ybWF0IGNvZGUgNiAqLwotI2RlZmluZSBGVF9GUlNUX1NFRyAgIDEwICAvKiBmaXJzdCBkYXRhIHNlZ21lbnQsIGV4Y2VwdCBmb3IgZm9ybWF0IGNvZGUgNiAgICAqLwotI2RlZmluZSBGVF9MQVNUX1NFRyAgIDEyICAvKiBsYXN0IGRhdGEgc2VnbWVudCwgZXhjZXB0IGZvciBmb3JtYXQgY29kZSA2ICAgICAqLwotI2RlZmluZSBGVF9GTVRfREFURSAgIDE0ICAvKiBkYXRlIGFuZCB0aW1lIG9mIG1vc3QgcmVjZW50IGZvcm1hdCwgc2VlIGJlbG93ICAqLwotI2RlZmluZSBGVF9XUl9EQVRFICAgIDE4ICAvKiBkYXRlIGFuZCB0aW1lIG9mIG1vc3QgcmVjZW50IHdyaXRlIG9yIGZvcm1hdCAgICAqLwotI2RlZmluZSBGVF9TUFQgICAgICAgIDI0ICAvKiBzZWdtZW50cyBwZXIgdHJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9UUEMgICAgICAgIDI2ICAvKiB0cmFja3MgcGVyIGNhcnRyaWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GSE0gICAgICAgIDI3ICAvKiBmbG9wcHkgZHJpdmUgaGVhZCAobWF4aW11bSBvZiBpdCkgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GVE0gICAgICAgIDI4ICAvKiBmbG9wcHkgdHJhY2sgbWF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GU00gICAgICAgIDI5ICAvKiBmbG9wcHkgc2VjdG9yIG1heC4gKDEyOCkgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9MQUJFTCAgICAgIDMwICAvKiBmbG9wcHkgdGFwZSBsYWJlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9MQUJFTF9EQVRFIDc0ICAvKiBkYXRlIGFuZCB0aW1lIHRoZSB0YXBlIGxhYmVsIHdhcyB3cml0dGVuICAgICAgICAqLwotI2RlZmluZSBGVF9MQUJFTF9TWiAgIChGVF9MQUJFTF9EQVRFIC0gRlRfTEFCRUwpCi0jZGVmaW5lIEZUX0NNQVBfU1RBUlQgNzggIC8qIHN0YXJ0aW5nIHNlZ21lbnQgb2YgY29tcHJlc3Npb24gbWFwICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0ZNVF9FUlJPUiAxMjggIC8qIG11c3QgYmUgc2V0IHRvIDB4ZmYgaWYgcmVtYWluZGVyIGdldHMgbG9zdCBkdXJpbmcKLQkJCSAgICogdGFwZSBmb3JtYXQKLQkJCSAgICovCi0jZGVmaW5lIEZUX1NFR19DTlQgICAxMzAgIC8qIG51bWJlciBvZiBzZWcuIHdyaXR0ZW4sIGZvcm1hdHRlZCBvciB2ZXJpZmllZAotCQkJICAgKiB0aHJvdWdoIGxpZmV0aW1lIG9mIHRhcGUgKHdoeSBub3QgcmVhZD8pCi0JCQkgICAqLwotI2RlZmluZSBGVF9JTklUX0RBVEUgMTM4ICAvKiBkYXRlIGFuZCB0aW1lIG9mIGluaXRpYWwgdGFwZSBmb3JtYXQgICAgKi8KLSNkZWZpbmUgRlRfRk1UX0NOVCAgIDE0MiAgLyogbnVtYmVyIG9mIHRpbWVzIHRhcGUgaGFzIGJlZW4gZm9ybWF0dGVkICovCi0jZGVmaW5lIEZUX0ZTTF9DTlQgICAxNDQgIC8qIG51bWJlciBvZiBzZWdtZW50cyBpbiBmYWlsZWQgc2VjdG9yIGxvZyAqLwotI2RlZmluZSBGVF9NS19DT0RFICAgMTQ2ICAvKiBpZCBzdHJpbmcgb2YgdGFwZSBtYW51ZmFjdHVyZXIgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfTE9UX0NPREUgIDE5MCAgLyogdGFwZSBtYW51ZmFjdHVyZXIgbG90IGNvZGUgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUXzZfSFNFR18xICAyMzQgIC8qIGZpcnN0IGhlYWRlciBzZWdtZW50IGZvciBmb3JtYXQgY29kZSAgNiAqLwotI2RlZmluZSBGVF82X0hTRUdfMiAgMjM4ICAvKiBzZWNvbmQgaGVhZGVyIHNlZ21lbnQgZm9yIGZvcm1hdCBjb2RlIDYgKi8KLSNkZWZpbmUgRlRfNl9GUlNUX1NFRyAyNDIgLyogZmlyc3QgZGF0YSBzZWdtZW50IGZvciBmb3JtYXQgY29kZSA2ICAgICovCi0jZGVmaW5lIEZUXzZfTEFTVF9TRUcgMjQ2IC8qIGxhc3QgZGF0YSBzZWdtZW50IGZvciBmb3JtYXQgY29kZSA2ICAgICAqLwotCi0jZGVmaW5lIEZUX0ZTTCAgICAgICAgMjU2Ci0jZGVmaW5lIEZUX0hFQURFUl9FTkQgMjU2IC8qIHNwYWNlIGJleW9uZCB0aGlzIHBvaW50OgotCQkJICAgKiBmb3JtYXQgY29kZXMgMiwgMyBhbmQgNTogCi0JCQkgICAqIC0gIGZhaWxlZCBzZWN0b3IgbG9nIHVudGlsIGJ5dGUgMjA0NwotCQkJICAgKiAtICBiYWQgc2VjdG9yIG1hcCBpbiB0aGUgcmVhbWluaW5nIHBhcnQgb2Ygc2VnbWVudAotCQkJICAgKiBmb3JtYXQgY29kZXMgNCBhbmQgNjoKLQkJCSAgICogLSAgYmFkIHNlY3RvciBtYXAgIHN0YXJ0cyBoZWFyCi0JCQkgICAqLwotCi0KLS8qICB2YWx1ZSB0byBiZSBzdG9yZWQgYXQgdGhlIEZUX1NJR05BVFVSRSBvZmZzZXQgCi0gKi8KLSNkZWZpbmUgRlRfSFNFR19NQUdJQyAweGFhNTVhYTU1Ci0jZGVmaW5lIEZUX0QyR19NQUdJQyAgMHg4MjI4ODIyOCAvKiBEaXR0byAyR0IgKi8KLQotLyogZGF0YSBhbmQgdGltZSBlbmNvZGluZzogKi8KLSNkZWZpbmUgRlRfWUVBUl9TSElGVCAyNQotI2RlZmluZSBGVF9ZRUFSX01BU0sgIDB4ZmUwMDAwMDAKLSNkZWZpbmUgRlRfWUVBUl8wICAgICAxOTcwCi0jZGVmaW5lIEZUX1lFQVJfTUFYICAgMTI3Ci0jZGVmaW5lIEZUX1lFQVIoeWVhcikgKCgoKHllYXIpLUZUX1lFQVJfMCk8PEZUX1lFQVJfU0hJRlQpJkZUX1lFQVJfTUFTSykKLQotI2RlZmluZSBGVF9USU1FX1NISUZUICAgMAotI2RlZmluZSBGVF9USU1FX01BU0sgICAgMHgwMUZGRkZGRgotI2RlZmluZSBGVF9USU1FX01BWCAgICAgMHgwMWVhNmRmZiAvKiBsYXN0IHNlY29uZCBvZiBhIHllYXIgKi8KLSNkZWZpbmUgRlRfVElNRShtbyxkLGgsbSxzKSBcCi0JKCgoKHMpKzYwKigobSkrNjAqKChoKSsyNCooKGQpKzMxKihtbykpKSkpICYgRlRfVElNRV9NQVNLKSkKLQotI2RlZmluZSBGVF9USU1FX1NUQU1QKHksbW8sZCxoLG0scykgKEZUX1lFQVIoeSkgfCBGVF9USU1FKG1vLGQsaCxtLHMpKQotCi0vKiB2YWx1ZXMgZm9yIHRoZSBmb3JtYXQgY29kZSBmaWVsZCAqLwotdHlwZWRlZiBlbnVtIHsKLQlmbXRfbm9ybWFsID0gMiwgLyogIFFJQy04MCBwb3N0IFJldi4gQiAyMDVGdCBvciAzMDdGdCB0YXBlICAgICovCi0JZm10XzExMDBmdCA9IDMsIC8qICBRSUMtODAgcG9zdCBSZXYuIEIgMTEwMEZ0IHRhcGUgICAgICAgICAgICAqLwotCWZtdF92YXIgICAgPSA0LCAvKiAgUUlDLTgwIHBvc3QgUmV2LiBCIHZhcmlhYmVsIGxlbmd0aCBmb3JtYXQgKi8KLQlmbXRfNDI1ZnQgID0gNSwgLyogIFFJQy04MCBwb3N0IFJldi4gQiA0MjVGdCB0YXBlICAgICAgICAgICAgICovCi0JZm10X2JpZyAgICA9IDYgIC8qICBRSUMtMzAxMC8zMDIwIHZhcmlhYmxlIGxlbmd0aCB0YXBlIHdpdGggbW9yZSAKLQkJCSAqICB0aGFuIDJeMTYgc2VnbWVudHMgcGVyIHRhcGUKLQkJCSAqLwotfSBmdF9mb3JtYXRfdHlwZTsKLQotLyogZGVmaW5pdGlvbnMgZm9yIHRoZSBmYWlsZWQgc2VjdG9yIGxvZyAqLwotI2RlZmluZSBGVF9GU0xfU0laRSAgICAgICAgKDIgKiBGVF9TRUNUT1JfU0laRSAtIEZUX0hFQURFUl9FTkQpCi0jZGVmaW5lIEZUX0ZTTF9NQVhfRU5UUklFUyAoRlRfRlNMX1NJWkUvc2l6ZW9mKF9fdTMyKSkKLQotdHlwZWRlZiBzdHJ1Y3QgZnRfZnNsX2VudHJ5IHsKLQlfX3UxNiBzZWdtZW50OwotCV9fdTE2IGRhdGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmdF9mc2xfZW50cnk7Ci0KLQotLyogIGRhdGUgZW5jb2RpbmcgZm9yIHRoZSBmYWlsZWQgc2VjdG9yIGxvZyAKLSAqICBtb250aDogMS4uMTIsIGRheTogMS4uMzEsIHllYXI6IDE5NzAuLjIwOTcKLSAqLwotI2RlZmluZSBGVF9GU0xfVElNRV9TVEFNUCh5LG0sZCkgXAotCSgoKCgoeSkgLSBGVF9ZRUFSXzApPDw5KSYweGZlMDApIHwgKCgobSk8PDUpJjB4MDFlMCkgfCAoKGQpJjB4MDAxZikpCi0KLSNlbmRpZiAvKiBfRlRBUEVfSEVBREVSX1NFR01FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdGFwZS12ZW5kb3JzLmggYi9pbmNsdWRlL2xpbnV4L2Z0YXBlLXZlbmRvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxYTgxZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0YXBlLXZlbmRvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0jaWZuZGVmIF9GVEFQRV9WRU5ET1JTX0gKLSNkZWZpbmUgX0ZUQVBFX1ZFTkRPUlNfSAotCi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAotICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2luY2x1ZGUvbGludXgvZnRhcGUtdmVuZG9ycy5oLHYgJAotICogJFJldmlzaW9uOiAxLjYgJAotICogJERhdGU6IDE5OTcvMTAvMDkgMTU6Mzg6MTEgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdXBwb3J0ZWQgZHJpdmUgdHlwZXMgd2l0aCB0aGVpcgotICogICAgICBRSUMtMTE3IHNwZWMuIHZlbmRvciBjb2RlIGFuZCBkcml2ZSBkZXBlbmRlbnQgY29uZmlndXJhdGlvbgotICogICAgICBpbmZvcm1hdGlvbi4KLSAqLwotCi10eXBlZGVmIGVudW0gewotCXVua25vd25fd2FrZV91cCA9IDAsCi0Jbm9fd2FrZV91cCwKLQl3YWtlX3VwX2NvbG9yYWRvLAotCXdha2VfdXBfbW91bnRhaW4sCi0Jd2FrZV91cF9pbnNpZ2h0LAotfSB3YWtlX3VwX3R5cGVzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jd2FrZV91cF90eXBlcyB3YWtlX3VwOwkvKiBzZWUgd2FrZV91cF90eXBlcyAqLwotCWNoYXIgKm5hbWU7CQkvKiBUZXh0IGRlc2NyaWJpbmcgdGhlIGRyaXZlICovCi19IHdha2V1cF9tZXRob2Q7Ci0KLS8qICBOb3RlOiBvcmRlciBvZiBlbnRyaWVzIGluIFdBS0VVUF9NRVRIT0RTIG11c3QgYmUgc28gdGhhdCBhIHZhcmlhYmxlCi0gKiAgICAgICAgb2YgdHlwZSB3YWtlX3VwX3R5cGVzIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGluIHRoZSBhcnJheS4KLSAqLwotI2RlZmluZSBXQUtFVVBfTUVUSE9EUyB7IFwKLSAgeyB1bmtub3duX3dha2VfdXAsICAgICJVbmtub3duIiB9LCBcCi0gIHsgbm9fd2FrZV91cCwgICAgICAgICAiTm9uZSIgfSwgXAotICB7IHdha2VfdXBfY29sb3JhZG8sICAgIkNvbG9yYWRvIiB9LCBcCi0gIHsgd2FrZV91cF9tb3VudGFpbiwgICAiTW91bnRhaW4iIH0sIFwKLSAgeyB3YWtlX3VwX2luc2lnaHQsICAgICJNb3Rvci1vbiIgfSwgXAotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IHZlbmRvcl9pZDsJLyogdmVuZG9yIGlkIGZyb20gZHJpdmUgKi8KLQlpbnQgc3BlZWQ7CQkvKiBtYXhpbXVtIHRhcGUgdHJhbnNwb3J0IHNwZWVkIChpcHMpICovCi0Jd2FrZV91cF90eXBlcyB3YWtlX3VwOwkvKiBzZWUgd2FrZV91cF90eXBlcyAqLwotCWNoYXIgKm5hbWU7CQkvKiBUZXh0IGRlc2NyaWJpbmcgdGhlIGRyaXZlICovCi19IHZlbmRvcl9zdHJ1Y3Q7Ci0KLSNkZWZpbmUgVU5LTk9XTl9WRU5ET1IgKC0xKQotCi0jZGVmaW5lIFFJQzExN19WRU5ET1JTIHsJCQkJCQkgICAgXAotLyogc2VlIF92ZW5kb3Jfc3RydWN0ICovCQkJCQkJICAgIFwKLSAgeyAweDAwMDAwLCAgODIsIHdha2VfdXBfY29sb3JhZG8sICAiQ29sb3JhZG8gREotMTAgKG9sZCkiIH0sCQkgICAgXAotICB7IDB4MDAwNDcsICA5MCwgd2FrZV91cF9jb2xvcmFkbywgICJDb2xvcmFkbyBESi0xMC9ESi0yMCIgfSwJCSAgICBcCi0gIHsgMHgwMTFjMiwgIDg0LCB3YWtlX3VwX2NvbG9yYWRvLCAgIkNvbG9yYWRvIDcwMCIgfSwJCQkgICAgXAotICB7IDB4MDExYzMsICA5MCwgd2FrZV91cF9jb2xvcmFkbywgICJDb2xvcmFkbyAxNDAwIiB9LAkJCSAgICBcCi0gIHsgMHgwMTFjNCwgIDg0LCB3YWtlX3VwX2NvbG9yYWRvLCAgIkNvbG9yYWRvIERKLTEwL0RKLTIwIChuZXcpIiB9LAkgICAgXAotICB7IDB4MDExYzUsICA4NCwgd2FrZV91cF9jb2xvcmFkbywgICJIUCBDb2xvcmFkbyBUMTAwMCIgfSwJCSAgICBcCi0gIHsgMHgwMTFjNiwgIDkwLCB3YWtlX3VwX2NvbG9yYWRvLCAgIkhQIENvbG9yYWRvIFQzMDAwIiB9LAkJICAgIFwKLSAgeyAweDAwMDA1LCAgNDUsIHdha2VfdXBfbW91bnRhaW4sICAiQXJjaGl2ZSA1NTgwaSIgfSwJCQkgICAgXAotICB7IDB4MTAwMDUsICA1MCwgd2FrZV91cF9pbnNpZ2h0LCAgICJJbnNpZ2h0IDgwTWIsIElyd2luIDgwU1giIH0sCSAgICBcCi0gIHsgMHgwMDE0MCwgIDc0LCB3YWtlX3VwX21vdW50YWluLCAgIkFyY2hpdmUgUy5Ib3JuZXQgW0lkZW50aXR5L0VzY29tXSIgfSwgXAotICB7IDB4MDAxNDYsICA3Miwgd2FrZV91cF9tb3VudGFpbiwgICJBcmNoaXZlIDMxMjUwUSBbRXNjb21dIiB9LAkgICAgXAotICB7IDB4MDAxNGEsIDEwMCwgd2FrZV91cF9tb3VudGFpbiwgICJBcmNoaXZlIFhMOTI1MGkgW0Nvbm5lci9Fc2NvbV0iIH0sICAgIFwKLSAgeyAweDAwMTRjLCAgOTgsIHdha2VfdXBfbW91bnRhaW4sICAiQ29ubmVyIEMyNTBNUVQiIH0sCQkgICAgXAotICB7IDB4MDAxNGUsICA4MCwgd2FrZV91cF9tb3VudGFpbiwgICJDb25uZXIgQzI1ME1RIiB9LAkJCSAgICBcCi0gIHsgMHgwMDE1MCwgIDgwLCB3YWtlX3VwX21vdW50YWluLCAgIkNvbm5lciBUU000MjBSL1RTVDgwMFIiIH0sCSAgICBcCi0gIHsgMHgwMDE1MiwgIDgwLCB3YWtlX3VwX21vdW50YWluLCAgIkNvbm5lciBUU004NTBSIiB9LAkJICAgIFwKLSAgeyAweDAwMTU2LCAgODAsIHdha2VfdXBfbW91bnRhaW4sICAiQ29ubmVyIFRTTTg1MFIvMTcwMFIvVFNUMzIwMFIiIH0sCSAgICBcCi0gIHsgMHgwMDE4MCwgICAwLCB3YWtlX3VwX21vdW50YWluLCAgIlN1bW1pdCBTRSAxNTAiIH0sCQkJICAgIFwKLSAgeyAweDAwMTgxLCAgODUsIHdha2VfdXBfbW91bnRhaW4sICAiU3VtbWl0IFNFIDI1MCwgTW91bnRhaW4gRlM4MDAwIiB9LCAgICBcCi0gIHsgMHgwMDFjMSwgIDgyLCBub193YWtlX3VwLCAgICAgICAgIldhbmd0ZWsgMzA0MEYiIH0sCQkJICAgIFwKLSAgeyAweDAwMWM4LCAgNjQsIG5vX3dha2VfdXAsICAgICAgICAiV2FuZ3RlayAzMDgwRiIgfSwJCQkgICAgXAotICB7IDB4MDAxYzgsICA2NCwgd2FrZV91cF9jb2xvcmFkbywgICJXYW5ndGVrIDMwODBGIiB9LAkJCSAgICBcCi0gIHsgMHgwMDFjYSwgIDY3LCBub193YWtlX3VwLCAgICAgICAgIldhbmd0ZWsgMzA4MEYgKG5ldykiIH0sCQkgICAgXAotICB7IDB4MDAxY2MsICA3Nywgd2FrZV91cF9jb2xvcmFkbywgICJXYW5ndGVrIDMyMDAgLyBUZWFjIDcwMCIgfSwJICAgIFwKLSAgeyAweDAwMWNkLCAgNzUsIHdha2VfdXBfY29sb3JhZG8sICAiUmV2ZWFsIFRCMTQwMCIgfSwJCQkgICAgXAotICB7IDB4MDAzODAsICA4NSwgd2FrZV91cF9jb2xvcmFkbywgICJFeGFieXRlIEVhZ2xlLTk2IiB9LAkJICAgIFwKLSAgeyAweDAwMzgxLCAgODUsIHdha2VfdXBfY29sb3JhZG8sICAiRXhhYnl0ZSBFYWdsZSBUUi0zIiB9LAkJICAgIFwKLSAgeyAweDAwMzgyLCAgODUsIHdha2VfdXBfY29sb3JhZG8sICAiRXhhYnl0ZSBFYWdsZSBUUi0zIiB9LAkJICAgIFwKLSAgeyAweDAwM2NlLCAgNzcsIHdha2VfdXBfY29sb3JhZG8sICAiVGVhYyA4MDAiIH0sCQkJICAgIFwKLSAgeyAweDAwM2NmLCAgIDAsIHdha2VfdXBfY29sb3JhZG8sICAiVGVhYyBGVDMwMTBUUiIgfSwJCQkgICAgXAotICB7IDB4MDg4ODAsICA2NCwgbm9fd2FrZV91cCwgICAgICAgICJJb21lZ2EgMjUwLCBEaXR0byA4MDAiIH0sCQkgICAgXAotICB7IDB4MDg4ODAsICA2NCwgd2FrZV91cF9jb2xvcmFkbywgICJJb21lZ2EgMjUwLCBEaXR0byA4MDAiIH0sCQkgICAgXAotICB7IDB4MDg4ODAsICA2NCwgd2FrZV91cF9pbnNpZ2h0LCAgICJJb21lZ2EgMjUwLCBEaXR0byA4MDAiIH0sCQkgICAgXAotICB7IDB4MDg4ODEsICA4MCwgd2FrZV91cF9jb2xvcmFkbywgICJJb21lZ2EgNzAwIiB9LAkJCSAgICBcCi0gIHsgMHgwODg4MiwgIDgwLCB3YWtlX3VwX2NvbG9yYWRvLCAgIklvbWVnYSAzMjAwIiB9LAkJCSAgICBcCi0gIHsgMHgwODg4MywgIDgwLCB3YWtlX3VwX2NvbG9yYWRvLCAgIklvbWVnYSBESVRUTyAyR0IiIH0sCQkgICAgXAotICB7IDB4MDAwMjEsICA3MCwgbm9fd2FrZV91cCwgICAgICAgICJBSVdBIENULTgwMyIgfSwJCQkgICAgXAotICB7IDB4MDA0YzAsICA4MCwgbm9fd2FrZV91cCwgICAgICAgICJBSVdBIFRELVMxNjAwIiB9LAkJCSAgICBcCi0gIHsgMHgwMDAyMSwgICAwLCB3YWtlX3VwX21vdW50YWluLCAgIkNPUkV0YXBlIFFJQzgwIiB9LAkJICAgIFwKLSAgeyAweDAwNDQxLCAgIDAsIHdha2VfdXBfbW91bnRhaW4sICAiQ29tQnl0ZSBEb3VibGVQbGF5IiB9LAkJICAgIFwKLSAgeyAweDAwNDgxLCAxMjcsIHdha2VfdXBfbW91bnRhaW4sICAiUEVSVEVDIE15VGFwZSA4MDAiIH0sCQkgICAgXAotICB7IDB4MDA0ODMsIDEzMCwgd2FrZV91cF9tb3VudGFpbiwgICJQRVJURUMgTXlUYXBlIDMyMDAiIH0sCQkgICAgXAotICB7IFVOS05PV05fVkVORE9SLCAwLCBub193YWtlX3VwLCAidW5rbm93biIgfQkJCQkgICAgXAotfQotCi0jZGVmaW5lIFFJQzExN19NQUtFX0NPREVTIHsJCQlcCi0gIHsgMCwgIlVuYXNzaWduZWQiIH0sCQkJCVwKLSAgeyAxLCAiQWxsb3kgQ29tcHV0ZXIgUHJvZHVjdHMiIH0sCQlcCi0gIHsgMiwgIjNNIiB9LAkJCQkJXAotICB7IDMsICJUYW5kYmVyZyBEYXRhIiB9LAkJCVwKLSAgeyA0LCAiQ29sb3JhZG8iIH0sCQkJCVwKLSAgeyA1LCAiQXJjaGl2ZS9Db25uZXIiIH0sCQkJXAotICB7IDYsICJNb3VudGFpbi9TdW1taXQgTWVtb3J5IFN5c3RlbXMiIH0sCVwKLSAgeyA3LCAiV2FuZ3Rlay9SZXhvbi9UZWNtYXIiIH0sCQlcCi0gIHsgOCwgIlNvbnkiIH0sCQkJCVwKLSAgeyA5LCAiQ2lwaGVyIERhdGEgUHJvZHVjdHMiIH0sCQlcCi0gIHsgMTAsICJJcndpbiBNYWduZXRpYyBTeXN0ZW1zIiB9LAkJXAotICB7IDExLCAiQnJhZW1hciIgfSwJCQkJXAotICB7IDEyLCAiVmVyYmF0aW0iIH0sCQkJCVwKLSAgeyAxMywgIkNvcmUgSW50ZXJuYXRpb25hbCIgfSwJCQlcCi0gIHsgMTQsICJFeGFieXRlIiB9LAkJCQlcCi0gIHsgMTUsICJUZWFjIiB9LAkJCQlcCi0gIHsgMTYsICJHaWdhdGVrIiB9LAkJCQlcCi0gIHsgMTcsICJDb21CeXRlIiB9LAkJCQlcCi0gIHsgMTgsICJQRVJURUMgTWVtb3JpZXMiIH0sCQkJXAotICB7IDE5LCAiQWl3YSIgfSwJCQkJXAotICB7IDcxLCAiQ29sb3JhZG8iIH0sCQkJCVwKLSAgeyA1NDYsICJJb21lZ2EgSW5jIiB9LAkJCVwKLX0KLQotI2VuZGlmIC8qIF9GVEFQRV9WRU5ET1JTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRhcGUuaCBiL2luY2x1ZGUvbGludXgvZnRhcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3MDM4Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0YXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfSAotI2RlZmluZSBfRlRBUEVfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvaW5jbHVkZS9saW51eC9mdGFwZS5oLHYgJAotICogJFJldmlzaW9uOiAxLjE3LjYuNCAkCi0gKiAkRGF0ZTogMTk5Ny8xMS8yNSAwMTo1Mjo1NCAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZ2xvYmFsIGRlZmluaXRpb25zLCB0eXBlZGVmcyBhbmQgbWFjcm8ncwotICogICAgICBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0jZGVmaW5lIEZUQVBFX1ZFUlNJT04gImZ0YXBlIHYzLjA0ZCAyNS8xMS85NyIKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGlvLmg+Ci0KLSNkZWZpbmUgRlRfU0VDVE9SKHgpCQkoeCsxKQkvKiBzZWN0b3Igb2Zmc2V0IGludG8gcmVhbCBzZWN0b3IgKi8KLSNkZWZpbmUgRlRfU0VDVE9SX1NJWkUJCTEwMjQKLSNkZWZpbmUgRlRfU0VDVE9SU19QRVJfU0VHTUVOVAkgIDMyCi0jZGVmaW5lIEZUX0VDQ19TRUNUT1JTCQkgICAzCi0jZGVmaW5lIEZUX1NFR01FTlRfU0laRQkJKChGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gRlRfRUNDX1NFQ1RPUlMpICogRlRfU0VDVE9SX1NJWkUpCi0jZGVmaW5lIEZUX0JVRkZfU0laRSAgICAoRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAqIEZUX1NFQ1RPUl9TSVpFKQotCi0vKgotICogICBiaXRzIG9mIHRoZSBtaW5vciBkZXZpY2UgbnVtYmVyIHRoYXQgZGVmaW5lIGRyaXZlIHNlbGVjdGlvbgotICogICBtZXRob2RzLiBDb3VsZCBiZSB1c2VkIG9uZSBkYXkgdG8gYWNjZXNzIG11bHRpcGxlIHRhcGUKLSAqICAgZHJpdmVzIG9uIHRoZSBzYW1lIGNvbnRyb2xsZXIuCi0gKi8KLSNkZWZpbmUgRlRBUEVfU0VMX0EgICAgIDAKLSNkZWZpbmUgRlRBUEVfU0VMX0IgICAgIDEKLSNkZWZpbmUgRlRBUEVfU0VMX0MgICAgIDIKLSNkZWZpbmUgRlRBUEVfU0VMX0QgICAgIDMKLSNkZWZpbmUgRlRBUEVfU0VMX01BU0sgICAgIDMKLSNkZWZpbmUgRlRBUEVfU0VMKHVuaXQpICgodW5pdCkgJiBGVEFQRV9TRUxfTUFTSykKLSNkZWZpbmUgRlRBUEVfTk9fUkVXSU5EIDQJLyogbWFzayBmb3IgbWlub3IgbnIgKi8KLQotLyogdGhlIGZvbGxvd2luZyB0d28gbWF5IGJlIHJlcG9ydGVkIHdoZW4gTVRJT0NHRVQgaXMgcmVxdWVzdGVkIC4uLiAqLwotdHlwZWRlZiB1bmlvbiB7Ci0Jc3RydWN0IHsKLQkJX191OCBlcnJvcjsKLQkJX191OCBjb21tYW5kOwotCX0gZXJyb3I7Ci0JbG9uZyBzcGFjZTsKLX0gZnRfZHJpdmVfZXJyb3I7Ci10eXBlZGVmIHVuaW9uIHsKLQlzdHJ1Y3QgewotCQlfX3U4IGRyaXZlX3N0YXR1czsKLQkJX191OCBkcml2ZV9jb25maWc7Ci0JCV9fdTggdGFwZV9zdGF0dXM7Ci0JfSBzdGF0dXM7Ci0JbG9uZyBzcGFjZTsKLX0gZnRfZHJpdmVfc3RhdHVzOwotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIEZUX1JRTV9ERUxBWSAgICAxMgotI2RlZmluZSBGVF9NSUxMSVNFQ09ORCAgMQotI2RlZmluZSBGVF9TRUNPTkQgICAgICAgMTAwMAotI2RlZmluZSBGVF9GT1JFVkVSICAgICAgLTEKLSNpZm5kZWYgSFoKLSNlcnJvciAiSFogdW5kZWZpbmVkLiIKLSNlbmRpZgotI2RlZmluZSBGVF9VU1BUICAgICAgICAgKDEwMDAwMDAvSFopIC8qIG1pY3Jvc2Vjb25kcyBwZXIgdGljayAqLwotCi0vKiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHRoYXQgdGhlIGRyaXZlciB3aWxsIGFsbG93Ci0gKiBiZWZvcmUgZ2l2aW5nIHVwIChhbmQgbGV0dGluZyBhIGhpZ2hlciBsZXZlbCBoYW5kbGUgdGhlIGVycm9yKS4KLSAqLwotI2lmZGVmIFRFU1RJTkcKLSNkZWZpbmUgRlRfU09GVF9SRVRSSUVTIDEJICAgLyogbnVtYmVyIG9mIGxvdyBsZXZlbCByZXRyaWVzICovCi0jZGVmaW5lIEZUX1JFVFJJRVNfT05fRUNDX0VSUk9SIDMgIC8qIGVjYyBlcnJvciB3aGVuIGNvcnJlY3Rpbmcgc2VnbWVudCAqLwotI2Vsc2UKLSNkZWZpbmUgRlRfU09GVF9SRVRSSUVTIDYJICAgLyogbnVtYmVyIG9mIGxvdyBsZXZlbCByZXRyaWVzICh0cmlwbGUpICovCi0jZGVmaW5lIEZUX1JFVFJJRVNfT05fRUNDX0VSUk9SIDMgIC8qIGVjYyBlcnJvciB3aGVuIGNvcnJlY3Rpbmcgc2VnbWVudCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgVEhFX0ZUQVBFX01BSU5UQUlORVIKLSNkZWZpbmUgVEhFX0ZUQVBFX01BSU5UQUlORVIgInRoZSBmdGFwZSBtYWludGFpbmVyIgotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgbWlzc2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCi0gKi8KLSNpZm5kZWYgQ09ORklHX0ZUX05SX0JVRkZFUlMKLSMgZGVmaW5lIENPTkZJR19GVF9OUl9CVUZGRVJTIDMKLSNlbmRpZgotI2lmbmRlZiBDT05GSUdfRlRfRkRDX1RIUgotIyBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19USFIgOAotI2VuZGlmCi0jaWZuZGVmIENPTkZJR19GVF9GRENfTUFYX1JBVEUKLSMgZGVmaW5lIENPTkZJR19GVF9GRENfTUFYX1JBVEUgMjAwMAotI2VuZGlmCi0jaWZuZGVmIENPTkZJR19GVF9GRENfQkFTRQotIyBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19CQVNFIDAKLSNlbmRpZgotI2lmbmRlZiBDT05GSUdfRlRfRkRDX0lSUQotIyBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19JUlEgIDAKLSNlbmRpZgotI2lmbmRlZiBDT05GSUdfRlRfRkRDX0RNQQotIyBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19ETUEgIDAKLSNlbmRpZgotCi0vKiBUdXJuIHNvbWUgYm9vbGVhbnMgaW50byBudW1iZXJzLgotICovCi0jaWZkZWYgQ09ORklHX0ZUX1BST0JFX0ZDMTAKLSMgdW5kZWYgQ09ORklHX0ZUX1BST0JFX0ZDMTAKLSMgZGVmaW5lIENPTkZJR19GVF9QUk9CRV9GQzEwIDEKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfRlRfUFJPQkVfRkMxMCAwCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfRlRfTUFDSDIKLSMgdW5kZWYgQ09ORklHX0ZUX01BQ0gyCi0jIGRlZmluZSBDT05GSUdfRlRfTUFDSDIgMQotI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19GVF9NQUNIMiAwCi0jZW5kaWYKLQotLyogSW5zZXJ0IGRlZmF1bHQgc2V0dGluZ3MKLSAqLwotI2lmIENPTkZJR19GVF9QUk9CRV9GQzEwID09IDEKLSMgaWYgQ09ORklHX0ZUX0ZEQ19CQVNFID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0JBU0UKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0JBU0UgMHgxODAKLSMgZW5kaWYKLSMgaWYgQ09ORklHX0ZUX0ZEQ19JUlEgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfSVJRCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19JUlEgOQotIyBlbmRpZgotIyBpZiBDT05GSUdfRlRfRkRDX0RNQSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19ETUEKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0RNQSAzCi0jIGVuZGlmCi0jZWxpZiBDT05GSUdfRlRfTUFDSDIgPT0gMSAgICAvKiBDT05GSUdfRlRfUFJPQkVfRkMxMCA9PSAxICovCi0jIGlmIENPTkZJR19GVF9GRENfQkFTRSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19CQVNFCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19CQVNFIDB4MUUwCi0jIGVuZGlmCi0jIGlmIENPTkZJR19GVF9GRENfSVJRID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0lSUQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfSVJRIDYKLSMgZW5kaWYKLSMgaWYgQ09ORklHX0ZUX0ZEQ19ETUEgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfRE1BCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19ETUEgMgotIyBlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfRlRfQUxUX0ZEQykgIC8qIENPTkZJR19GVF9NQUNIMiAqLwotIyBpZiBDT05GSUdfRlRfRkRDX0JBU0UgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfQkFTRQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfQkFTRSAweDM3MAotIyBlbmRpZgotIyBpZiBDT05GSUdfRlRfRkRDX0lSUSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19JUlEKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0lSUSA2Ci0jIGVuZGlmCi0jIGlmIENPTkZJR19GVF9GRENfRE1BID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0RNQQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfRE1BIDIKLSMgZW5kaWYKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDT05GSUdfRlRfQUxUX0ZEQyAqLwotIyBpZiBDT05GSUdfRlRfRkRDX0JBU0UgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfQkFTRQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfQkFTRSAweDNmMAotIyBlbmRpZgotIyBpZiBDT05GSUdfRlRfRkRDX0lSUSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19JUlEKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0lSUSA2Ci0jIGVuZGlmCi0jIGlmIENPTkZJR19GVF9GRENfRE1BID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0RNQQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfRE1BIDIKLSMgZW5kaWYKLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFuZGFyZCBGREMgKi8KLQotLyogICAgICBzb21lIHVzZWZ1bCBtYWNybydzCi0gKi8KLSNkZWZpbmUgTlJfSVRFTVMoeCkgICAgIChpbnQpKHNpemVvZih4KS8gc2l6ZW9mKCp4KSkKLQotI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pY21wLmggYi9pbmNsdWRlL2xpbnV4L2ljbXAuaAppbmRleCA4NzhjZmU0Li4yNGRhNGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ljbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ljbXAuaApAQCAtNjgsNyArNjgsNyBAQAogc3RydWN0IGljbXBoZHIgewogICBfX3U4CQl0eXBlOwogICBfX3U4CQljb2RlOwotICBfX2JlMTYJY2hlY2tzdW07CisgIF9fc3VtMTYJY2hlY2tzdW07CiAgIHVuaW9uIHsKIAlzdHJ1Y3QgewogCQlfX2JlMTYJaWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oIGIvaW5jbHVkZS9saW51eC9pY21wdjYuaAppbmRleCBjNzcxYTdkLi42OGQzNTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKQEAgLTcsMTcgKzcsMTcgQEAKIAogCV9fdTgJCWljbXA2X3R5cGU7CiAJX191OAkJaWNtcDZfY29kZTsKLQlfX3UxNgkJaWNtcDZfY2tzdW07CisJX19zdW0xNgkJaWNtcDZfY2tzdW07CiAKIAogCXVuaW9uIHsKLQkJX191MzIJCQl1bl9kYXRhMzJbMV07Ci0JCV9fdTE2CQkJdW5fZGF0YTE2WzJdOworCQlfX2JlMzIJCQl1bl9kYXRhMzJbMV07CisJCV9fYmUxNgkJCXVuX2RhdGExNlsyXTsKIAkJX191OAkJCXVuX2RhdGE4WzRdOwogCiAJCXN0cnVjdCBpY21wdjZfZWNobyB7Ci0JCQlfX3UxNgkJaWRlbnRpZmllcjsKLQkJCV9fdTE2CQlzZXF1ZW5jZTsKKwkJCV9fYmUxNgkJaWRlbnRpZmllcjsKKwkJCV9fYmUxNgkJc2VxdWVuY2U7CiAJCX0gdV9lY2hvOwogCiAgICAgICAgICAgICAgICAgc3RydWN0IGljbXB2Nl9uZF9hZHZ0IHsKQEAgLTUzLDcgKzUzLDcgQEAKICNlbHNlCiAjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiAjZW5kaWYKLQkJCV9fdTE2CQlydF9saWZldGltZTsKKwkJCV9fYmUxNgkJcnRfbGlmZXRpbWU7CiAgICAgICAgICAgICAgICAgfSB1X25kX3JhOwogCiAJfSBpY21wNl9kYXRhdW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAppbmRleCBiOTI1NTg1NC4uOTkzOTNlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCkBAIC0xLDE3ICsxLDE5IEBACiAjaWZuZGVmIF9fTElOVVhfSUZfUEFDS0VUX0gKICNkZWZpbmUgX19MSU5VWF9JRl9QQUNLRVRfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogc3RydWN0IHNvY2thZGRyX3BrdAogewogCXVuc2lnbmVkIHNob3J0IHNwa3RfZmFtaWx5OwogCXVuc2lnbmVkIGNoYXIgc3BrdF9kZXZpY2VbMTRdOwotCXVuc2lnbmVkIHNob3J0IHNwa3RfcHJvdG9jb2w7CisJX19iZTE2IHNwa3RfcHJvdG9jb2w7CiB9OwogCiBzdHJ1Y3Qgc29ja2FkZHJfbGwKIHsKIAl1bnNpZ25lZCBzaG9ydAlzbGxfZmFtaWx5OwotCXVuc2lnbmVkIHNob3J0CXNsbF9wcm90b2NvbDsKKwlfX2JlMTYJCXNsbF9wcm90b2NvbDsKIAlpbnQJCXNsbF9pZmluZGV4OwogCXVuc2lnbmVkIHNob3J0CXNsbF9oYXR5cGU7CiAJdW5zaWduZWQgY2hhcglzbGxfcGt0dHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmggYi9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCmluZGV4IGJlZjlmOGYuLjhkZTA3OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaApAQCAtMTksMTAgKzE5LDEwIEBACiB7CiAJY2hhcgkJCW5hbWVbSUZOQU1TSVpdOwogCWludAkJCWxpbms7Ci0JX191MTYJCQlpX2ZsYWdzOwotCV9fdTE2CQkJb19mbGFnczsKLQlfX3UzMgkJCWlfa2V5OwotCV9fdTMyCQkJb19rZXk7CisJX19iZTE2CQkJaV9mbGFnczsKKwlfX2JlMTYJCQlvX2ZsYWdzOworCV9fYmUzMgkJCWlfa2V5OworCV9fYmUzMgkJCW9fa2V5OwogCXN0cnVjdCBpcGhkcgkJaXBoOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZ21wLmggYi9pbmNsdWRlL2xpbnV4L2lnbXAuaAppbmRleCAyMWRkNTY5Li45ZGJiNTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lnbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lnbXAuaApAQCAtMzAsNyArMzAsNyBAQAogewogCV9fdTggdHlwZTsKIAlfX3U4IGNvZGU7CQkvKiBGb3IgbmV3ZXIgSUdNUCAqLwotCV9fYmUxNiBjc3VtOworCV9fc3VtMTYgY3N1bTsKIAlfX2JlMzIgZ3JvdXA7CiB9OwogCkBAIC0xMjcsNiArMTI3LDcgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAKIGV4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbi5oIGIvaW5jbHVkZS9saW51eC9pbi5oCmluZGV4IDI2MTk4NTkuLjE5MTJlN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2luLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogICBJUFBST1RPX0NPTVAgICA9IDEwOCwgICAgICAgICAgICAgICAgLyogQ29tcHJlc3Npb24gSGVhZGVyIHByb3RvY29sICovCiAgIElQUFJPVE9fU0NUUCAgID0gMTMyLAkJLyogU3RyZWFtIENvbnRyb2wgVHJhbnNwb3J0IFByb3RvY29sCSovCisgIElQUFJPVE9fVURQTElURSA9IDEzNiwJLyogVURQLUxpdGUgKFJGQyAzODI4KQkJCSovCiAKICAgSVBQUk9UT19SQVcJID0gMjU1LAkJLyogUmF3IElQIHBhY2tldHMJCQkqLwogICBJUFBST1RPX01BWApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbjYuaCBiL2luY2x1ZGUvbGludXgvaW42LmgKaW5kZXggZjI4NjIxZi4uNGU4MzUwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luNi5oCkBAIC01NCw3ICs1NCw3IEBACiBzdHJ1Y3Qgc29ja2FkZHJfaW42IHsKIAl1bnNpZ25lZCBzaG9ydCBpbnQJc2luNl9mYW1pbHk7ICAgIC8qIEFGX0lORVQ2ICovCiAJX19iZTE2CQkJc2luNl9wb3J0OyAgICAgIC8qIFRyYW5zcG9ydCBsYXllciBwb3J0ICMgKi8KLQlfX3UzMgkJCXNpbjZfZmxvd2luZm87ICAvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KKwlfX2JlMzIJCQlzaW42X2Zsb3dpbmZvOyAgLyogSVB2NiBmbG93IGluZm9ybWF0aW9uICovCiAJc3RydWN0IGluNl9hZGRyCQlzaW42X2FkZHI7ICAgICAgLyogSVB2NiBhZGRyZXNzICovCiAJX191MzIJCQlzaW42X3Njb3BlX2lkOyAgLyogc2NvcGUgaWQgKG5ldyBpbiBSRkMyNTUzKSAqLwogfTsKQEAgLTcyLDcgKzcyLDcgQEAKIHN0cnVjdCBpbjZfZmxvd2xhYmVsX3JlcQogewogCXN0cnVjdCBpbjZfYWRkcglmbHJfZHN0OwotCV9fdTMyCWZscl9sYWJlbDsKKwlfX2JlMzIJZmxyX2xhYmVsOwogCV9fdTgJZmxyX2FjdGlvbjsKIAlfX3U4CWZscl9zaGFyZTsKIAlfX3UxNglmbHJfZmxhZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luZXQuaCBiL2luY2x1ZGUvbGludXgvaW5ldC5oCmluZGV4IGI3YzZkYTcuLjY3NWE3ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5ldC5oCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogZXh0ZXJuIF9fYmUzMiBpbl9hdG9uKGNvbnN0IGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IGluNF9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwgdTggKmRzdCwgY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmVuZCk7Ci1leHRlcm4gaW50IGluNl9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwgdTggKmRzdCwgY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmVuZCk7CitleHRlcm4gaW50IGluNF9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwgdTggKmRzdCwgaW50IGRlbGltLCBjb25zdCBjaGFyICoqZW5kKTsKK2V4dGVybiBpbnQgaW42X3B0b24oY29uc3QgY2hhciAqc3JjLCBpbnQgc3JjbGVuLCB1OCAqZHN0LCBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpOwogI2VuZGlmCiAjZW5kaWYJLyogX0xJTlVYX0lORVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaAppbmRleCA1YTBhYjA0Li5jMGY3YWVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaApAQCAtMTI0LDEyICsxMjQsMTMgQEAKICAqCUNoZWNrIGlmIGEgbWFzayBpcyBhY2NlcHRhYmxlLgogICovCiAgCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgYmFkX21hc2sodTMyIG1hc2ssIHUzMiBhZGRyKQorc3RhdGljIF9faW5saW5lX18gaW50IGJhZF9tYXNrKF9fYmUzMiBtYXNrLCBfX2JlMzIgYWRkcikKIHsKKwlfX3UzMiBobWFzazsKIAlpZiAoYWRkciAmIChtYXNrID0gfm1hc2spKQogCQlyZXR1cm4gMTsKLQltYXNrID0gbnRvaGwobWFzayk7Ci0JaWYgKG1hc2sgJiAobWFzaysxKSkKKwlobWFzayA9IG50b2hsKG1hc2spOworCWlmIChobWFzayAmIChobWFzaysxKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTAsMTEgKzE5MSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5ldF9tYXNrX2xlbihfX3UzMiBtYXNrKQorc3RhdGljIF9faW5saW5lX18gaW50IGluZXRfbWFza19sZW4oX19iZTMyIG1hc2spCiB7Ci0JaWYgKCEobWFzayA9IG50b2hsKG1hc2spKSkKKwlfX3UzMiBobWFzayA9IG50b2hsKG1hc2spOworCWlmICghaG1hc2spCiAJCXJldHVybiAwOwotCXJldHVybiAzMiAtIGZmeih+bWFzayk7CisJcmV0dXJuIDMyIC0gZmZ6KH5obWFzayk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaCBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKaW5kZXggZDQyYzgzMy4uY2Y4Njk2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCkBAIC04OSw2ICs4OSw3IEBACiAjZGVmaW5lIElPUkVTT1VSQ0VfUk9NX0VOQUJMRQkJKDE8PDApCS8qIFJPTSBpcyBlbmFibGVkLCBzYW1lIGFzIFBDSV9ST01fQUREUkVTU19FTkFCTEUgKi8KICNkZWZpbmUgSU9SRVNPVVJDRV9ST01fU0hBRE9XCQkoMTw8MSkJLyogUk9NIGlzIGNvcHkgYXQgQzAwMDowICovCiAjZGVmaW5lIElPUkVTT1VSQ0VfUk9NX0NPUFkJCSgxPDwyKQkvKiBST00gaXMgYWxsb2MnZCBjb3B5LCByZXNvdXJjZSBmaWVsZCBvdmVybGFpZCAqLworI2RlZmluZSBJT1JFU09VUkNFX1JPTV9CSU9TX0NPUFkJKDE8PDMpCS8qIFJPTSBpcyBCSU9TIGNvcHksIHJlc291cmNlIGZpZWxkIG92ZXJsYWlkICovCiAKIC8qIFBDL0lTQS93aGF0ZXZlciAtIHRoZSBub3JtYWwgUEMgYWRkcmVzcyBzcGFjZXM6IElPIGFuZCBtZW1vcnkgKi8KIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgaW9wb3J0X3Jlc291cmNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcC5oIGIvaW5jbHVkZS9saW51eC9pcC5oCmluZGV4IGVjZWU5YmIuLjFkMzZiOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwLmgKQEAgLTk4LDcgKzk4LDcgQEAKIAlfX2JlMTYJZnJhZ19vZmY7CiAJX191OAl0dGw7CiAJX191OAlwcm90b2NvbDsKLQlfX2JlMTYJY2hlY2s7CisJX19zdW0xNgljaGVjazsKIAlfX2JlMzIJc2FkZHI7CiAJX19iZTMyCWRhZGRyOwogCS8qVGhlIG9wdGlvbnMgc3RhcnQgaGVyZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXA2X3R1bm5lbC5oIGIvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmgKaW5kZXggNWMyM2FlYi4uYWYzZjRhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAlfX3U4IHByb3RvOwkJLyogdHVubmVsIHByb3RvY29sICovCiAJX191OCBlbmNhcF9saW1pdDsJLyogZW5jYXBzdWxhdGlvbiBsaW1pdCBmb3IgdHVubmVsICovCiAJX191OCBob3BfbGltaXQ7CQkvKiBob3AgbGltaXQgZm9yIHR1bm5lbCAqLwotCV9fdTMyIGZsb3dpbmZvOwkJLyogdHJhZmZpYyBjbGFzcyBhbmQgZmxvd2xhYmVsIGZvciB0dW5uZWwgKi8KKwlfX2JlMzIgZmxvd2luZm87CS8qIHRyYWZmaWMgY2xhc3MgYW5kIGZsb3dsYWJlbCBmb3IgdHVubmVsICovCiAJX191MzIgZmxhZ3M7CQkvKiB0dW5uZWwgZmxhZ3MgKi8KIAlzdHJ1Y3QgaW42X2FkZHIgbGFkZHI7CS8qIGxvY2FsIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLwogCXN0cnVjdCBpbjZfYWRkciByYWRkcjsJLyogcmVtb3RlIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcHY2LmggYi9pbmNsdWRlL2xpbnV4L2lwdjYuaAppbmRleCA0ZjQzNWM1Li5mODI0MTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwdjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwdjYuaApAQCAtMjc0LDcgKzI3NCw3IEBACiAJc3RydWN0IGluNl9hZGRyCQkqc2FkZHJfY2FjaGU7CiAjZW5kaWYKIAotCV9fdTMyCQkJZmxvd19sYWJlbDsKKwlfX2JlMzIJCQlmbG93X2xhYmVsOwogCV9fdTMyCQkJZnJhZ19zaXplOwogCV9fczE2CQkJaG9wX2xpbWl0OwogCV9fczE2CQkJbWNhc3RfaG9wczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXhqdXNlci5oIGIvaW5jbHVkZS9saW51eC9peGp1c2VyLmgKaW5kZXggZmQxNzU2ZC4uODhiNDU4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9peGp1c2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9peGp1c2VyLmgKQEAgLTMxNSw3ICszMTUsNyBAQAogKiBzdHJ1Y3R1cmVzLiAgSWYgdGhlIGZyZXEwIHZhcmlhYmxlIGlzIG5vbi16ZXJvLCB0aGUgdG9uZSB0YWJsZSBjb250ZW50cwogKiBmb3IgdGhlIHRvbmVfaW5kZXggYXJlIHVwZGF0ZWQgdG8gdGhlIGZyZXF1ZW5jaWVzIGFuZCBnYWlucyBkZWZpbmVkLiAgSXQKICogc2hvdWxkIGJlIG5vdGVkIHRoYXQgRFRNRiB0b25lcyBjYW5ub3QgYmUgcmVhc3NpZ25lZCwgc28gaWYgRFRNRiB0b25lCi0qIHRhYmxlIGluZGV4cyBhcmUgdXNlZCBpbiBhIGNhZGVuY2UgdGhlIGZyZXF1ZW5jeSBhbmQgZ2FpbiB2YXJpYWJsZXMgd2lsbAorKiB0YWJsZSBpbmRleGVzIGFyZSB1c2VkIGluIGEgY2FkZW5jZSB0aGUgZnJlcXVlbmN5IGFuZCBnYWluIHZhcmlhYmxlcyB3aWxsCiAqIGJlIGlnbm9yZWQuCiAqCiAqIElmIHRoZSBhcnJheSBlbGVtZW50cyBjb250YWluIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzIHRoZSBkcml2ZXIgd2lsbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qaWZmaWVzLmggYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAppbmRleCBjOGQ1ZjIwLi4wZWM2ZTI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaApAQCAtNzQsNyArNzQsNyBAQAogI2RlZmluZSBfX2ppZmZ5X2RhdGEgIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5kYXRhIikpKQogCiAvKgotICogVGhlIDY0LWJpdCB2YWx1ZSBpcyBub3Qgdm9sYXRpbGUgLSB5b3UgTVVTVCBOT1QgcmVhZCBpdAorICogVGhlIDY0LWJpdCB2YWx1ZSBpcyBub3QgYXRvbWljIC0geW91IE1VU1QgTk9UIHJlYWQgaXQKICAqIHdpdGhvdXQgc2FtcGxpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBpbiB4dGltZV9sb2NrLgogICogZ2V0X2ppZmZpZXNfNjQoKSB3aWxsIGRvIHRoaXMgZm9yIHlvdSBhcyBhcHByb3ByaWF0ZS4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggMjRiNjExMS4uNjczODI4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0zMCw4ICszMCwxMCBAQAogCiAjZGVmaW5lIFNUQUNLX01BR0lDCTB4ZGVhZGJlZWYKIAorI2RlZmluZSBBTElHTih4LGEpCQlfX0FMSUdOX01BU0soeCwodHlwZW9mKHgpKShhKS0xKQorI2RlZmluZSBfX0FMSUdOX01BU0soeCxtYXNrKQkoKCh4KSsobWFzaykpJn4obWFzaykpCisKICNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCi0jZGVmaW5lIEFMSUdOKHgsYSkgKCgoeCkrKGEpLTFVTCkmfigoYSktMVVMKSkKICNkZWZpbmUgRklFTERfU0laRU9GKHQsIGYpIChzaXplb2YoKCh0KikwKS0+ZikpCiAjZGVmaW5lIERJVl9ST1VORF9VUChuLGQpICgoKG4pICsgKGQpIC0gMSkgLyAoZCkpCiAjZGVmaW5lIHJvdW5kdXAoeCwgeSkgKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCkBAIC02Myw3ICs2NSw3IEBACiAgKiBjb250ZXh0IChzcGlubG9jaywgaXJxLWhhbmRsZXIsIC4uLikuCiAgKgogICogVGhpcyBpcyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgaGVscCB0byBiZSBhYmxlIHRvIGNhdGNoIHByb2JsZW1zIGVhcmx5IGFuZCBub3QKLSAqIGJlIGJpdGVuIGxhdGVyIHdoZW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24gaGFwcGVucyB0byBzbGVlcCB3aGVuIGl0IGlzIG5vdAorICogYmUgYml0dGVuIGxhdGVyIHdoZW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24gaGFwcGVucyB0byBzbGVlcCB3aGVuIGl0IGlzIG5vdAogICogc3VwcG9zZWQgdG8uCiAgKi8KICNpZmRlZiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKaW5kZXggODkxYmIyYy4uYWVhMzRlNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCkBAIC00Nyw2ICs0Nyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjZGVmaW5lCUtDSV9DT05UUlVQCTAJLyogYXJnOiBzdHJ1Y3QgY2FwaV9wcm9maWxlICovCiAjZGVmaW5lCUtDSV9DT05UUkRPV04JMQkvKiBhcmc6IE5VTEwgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWMuaCBiL2luY2x1ZGUvbGludXgva2V4ZWMuaAppbmRleCA2NDI3OTQ5Li5hNGVkZTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tleGVjLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCkBAIC0xMjIsNiArMTIyLDggQEAKICNkZWZpbmUgS0VYRUNfQVJDSF9JQV82NCAgICg1MCA8PCAxNikKICNkZWZpbmUgS0VYRUNfQVJDSF9TMzkwICAgICgyMiA8PCAxNikKICNkZWZpbmUgS0VYRUNfQVJDSF9TSCAgICAgICg0MiA8PCAxNikKKyNkZWZpbmUgS0VYRUNfQVJDSF9NSVBTX0xFICgxMCA8PCAxNikKKyNkZWZpbmUgS0VYRUNfQVJDSF9NSVBTICAgICggOCA8PCAxNikKIAogI2RlZmluZSBLRVhFQ19GTEFHUyAgICAoS0VYRUNfT05fQ1JBU0gpICAvKiBMaXN0IG9mIGRlZmluZWQvbGVnYWwga2V4ZWMgZmxhZ3MgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rb2JqZWN0LmggYi9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaAppbmRleCBiY2Q5Y2QxLi5kMWM4ZDI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaApAQCAtNDcsNiArNDcsNyBAQAogCUtPQkpfVU1PVU5UCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNSwJLyogdW1vdW50IGV2ZW50IGZvciBibG9jayBkZXZpY2VzIChicm9rZW4pICovCiAJS09CSl9PRkZMSU5FCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNiwJLyogZGV2aWNlIG9mZmxpbmUgKi8KIAlLT0JKX09OTElORQk9IChfX2ZvcmNlIGtvYmplY3RfYWN0aW9uX3QpIDB4MDcsCS8qIGRldmljZSBvbmxpbmUgKi8KKwlLT0JKX01PVkUJPSAoX19mb3JjZSBrb2JqZWN0X2FjdGlvbl90KSAweDA4LAkvKiBkZXZpY2UgbW92ZSAqLwogfTsKIAogc3RydWN0IGtvYmplY3QgewpAQCAtNzYsNiArNzcsNyBAQAogZXh0ZXJuIHZvaWQga29iamVjdF9kZWwoc3RydWN0IGtvYmplY3QgKik7CiAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfcmVuYW1lKHN0cnVjdCBrb2JqZWN0ICosIGNvbnN0IGNoYXIgKm5ld19uYW1lKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfbW92ZShzdHJ1Y3Qga29iamVjdCAqLCBzdHJ1Y3Qga29iamVjdCAqKTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9yZWdpc3RlcihzdHJ1Y3Qga29iamVjdCAqKTsKIGV4dGVybiB2b2lkIGtvYmplY3RfdW5yZWdpc3RlcihzdHJ1Y3Qga29iamVjdCAqKTsKQEAgLTI2NCw2ICsyNjYsOCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVRykKIHZvaWQga29iamVjdF91ZXZlbnQoc3RydWN0IGtvYmplY3QgKmtvYmosIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uKTsKK3ZvaWQga29iamVjdF91ZXZlbnRfZW52KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBlbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbiwKKwkJCWNoYXIgKmVudnBbXSk7CiAKIGludCBhZGRfdWV2ZW50X3ZhcihjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLCBpbnQgKmN1cl9pbmRleCwKIAkJCWNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplLCBpbnQgKmN1cl9sZW4sCkBAIC0yNzEsNiArMjc1LDEwIEBACiAJX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDcsIDgpKSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGtvYmplY3RfdWV2ZW50KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBlbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQga29iamVjdF91ZXZlbnRfZW52KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uLAorCQkJCSAgICAgIGNoYXIgKmVudnBbXSkKK3sgfQogCiBzdGF0aWMgaW5saW5lIGludCBhZGRfdWV2ZW50X3ZhcihjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLCBpbnQgKmN1cl9pbmRleCwKIAkJCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSwgaW50ICpjdXJfbGVuLCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IGFiZDJkZWIuLjIwMjI4M2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtMTQwLDYgKzE0MCw3IEBACiAJQVRBX0RGTEFHX0xCQTQ4CQk9ICgxIDw8IDEpLCAvKiBkZXZpY2Ugc3VwcG9ydHMgTEJBNDggKi8KIAlBVEFfREZMQUdfQ0RCX0lOVFIJPSAoMSA8PCAyKSwgLyogZGV2aWNlIGFzc2VydHMgSU5UUlEgd2hlbiByZWFkeSBmb3IgQ0RCICovCiAJQVRBX0RGTEFHX05DUQkJPSAoMSA8PCAzKSwgLyogZGV2aWNlIHN1cHBvcnRzIE5DUSAqLworCUFUQV9ERkxBR19GTFVTSF9FWFQJPSAoMSA8PCA0KSwgLyogZG8gRkxVU0hfRVhUIGluc3RlYWQgb2YgRkxVU0ggKi8KIAlBVEFfREZMQUdfQ0ZHX01BU0sJPSAoMSA8PCA4KSAtIDEsCiAKIAlBVEFfREZMQUdfUElPCQk9ICgxIDw8IDgpLCAvKiBkZXZpY2UgbGltaXRlZCB0byBQSU8gbW9kZSAqLwpAQCAtMTc1LDYgKzE3Niw3IEBACiAJQVRBX0ZMQUdfU0tJUF9EMkhfQlNZCT0gKDEgPDwgMTIpLCAvKiBjYW4ndCB3YWl0IGZvciB0aGUgZmlyc3QgRDJICiAJCQkJCSAgICAgICogUmVnaXN0ZXIgRklTIGNsZWFyaW5nIEJTWSAqLwogCUFUQV9GTEFHX0RFQlVHTVNHCT0gKDEgPDwgMTMpLAorCUFUQV9GTEFHX1NFVFhGRVJfUE9MTElORz0gKDEgPDwgMTQpLCAvKiB1c2UgcG9sbGluZyBmb3IgU0VUWEZFUiAqLwogCiAJLyogVGhlIGZvbGxvd2luZyBmbGFnIGJlbG9uZ3MgdG8gYXAtPnBmbGFncyBidXQgaXMga2VwdCBpbgogCSAqIGFwLT5mbGFncyBiZWNhdXNlIGl0J3MgcmVmZXJlbmNlZCBpbiBtYW55IExMRHMgYW5kIHdpbGwgYmUKQEAgLTI4Myw2ICsyODUsOSBAQAogCUFUQV9FSElfUVVJRVQJCT0gKDEgPDwgMyksICAvKiBiZSBxdWlldCAqLwogCiAJQVRBX0VISV9ESURfUkVTRVQJPSAoMSA8PCAxNiksIC8qIGFscmVhZHkgcmVzZXQgdGhpcyBwb3J0ICovCisJQVRBX0VISV9QUklOVElORk8JPSAoMSA8PCAxNyksIC8qIHByaW50IGNvbmZpZ3VyYXRpb24gaW5mbyAqLworCUFUQV9FSElfU0VUTU9ERQkJPSAoMSA8PCAxOCksIC8qIGNvbmZpZ3VyZSB0cmFuc2ZlciBtb2RlICovCisJQVRBX0VISV9QT1NUX1NFVE1PREUJPSAoMSA8PCAxOSksIC8qIHJldmFpbGRhdGluZyBhZnRlciBzZXRtb2RlICovCiAKIAlBVEFfRUhJX1JFU0VUX01PRElGSUVSX01BU0sgPSBBVEFfRUhJX1JFU1VNRV9MSU5LLAogCkBAIC0zMDcsMTAgKzMxMiwxMSBAQAogCSAgIChzb21lIGhvcmthZ2UgbWF5IGJlIGRyaXZlL2NvbnRyb2xsZXIgcGFpciBkZXBlbmRhbnQgKi8KIAogCUFUQV9IT1JLQUdFX0RJQUdOT1NUSUMJPSAoMSA8PCAwKSwJLyogRmFpbGVkIGJvb3QgZGlhZyAqLworCUFUQV9IT1JLQUdFX05PRE1BCT0gKDEgPDwgMSksCS8qIERNQSBwcm9ibGVtcyAqLworCUFUQV9IT1JLQUdFX05PTkNRCT0gKDEgPDwgMiksCS8qIERvbid0IHVzZSBOQ1EgKi8KIH07CiAKIGVudW0gaHNtX3Rhc2tfc3RhdGVzIHsKLQlIU01fU1RfVU5LTk9XTiwJCS8qIHN0YXRlIHVua25vd24gKi8KIAlIU01fU1RfSURMRSwJCS8qIG5vIGNvbW1hbmQgb24gZ29pbmcgKi8KIAlIU01fU1QsCQkJLyogKHdhaXRpbmcgdGhlIGRldmljZSB0bykgdHJhbnNmZXIgZGF0YSAqLwogCUhTTV9TVF9MQVNULAkJLyogKHdhaXRpbmcgdGhlIGRldmljZSB0bykgY29tcGxldGUgY29tbWFuZCAqLwpAQCAtMzI5LDYgKzMzNSw3IEBACiAJQUNfRVJSX1NZU1RFTQkJPSAoMSA8PCA2KSwgLyogc3lzdGVtIGVycm9yICovCiAJQUNfRVJSX0lOVkFMSUQJCT0gKDEgPDwgNyksIC8qIGludmFsaWQgYXJndW1lbnQgKi8KIAlBQ19FUlJfT1RIRVIJCT0gKDEgPDwgOCksIC8qIHVua25vd24gKi8KKwlBQ19FUlJfTk9ERVZfSElOVAk9ICgxIDw8IDkpLCAvKiBwb2xsaW5nIGRldmljZSBkZXRlY3Rpb24gaGludCAqLwogfTsKIAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KQEAgLTcwMCw2ICs3MDcsOCBAQAogZXh0ZXJuIGludCBzYXRhX3BoeV9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgdW5zaWduZWQgbG9uZyAqcGFyYW0pOwogZXh0ZXJuIGludCBhdGFfc3RkX3ByZXJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIGludCBhdGFfc3RkX3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpOworZXh0ZXJuIGludCBzYXRhX3BvcnRfaGFyZHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nKTsKIGV4dGVybiBpbnQgc2F0YV9zdGRfaGFyZHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3MpOwogZXh0ZXJuIHZvaWQgYXRhX3N0ZF9wb3N0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKIGV4dGVybiB2b2lkIGF0YV9wb3J0X2Rpc2FibGUoc3RydWN0IGF0YV9wb3J0ICopOwpAQCAtNzQ0LDkgKzc1Myw4IEBACiBleHRlcm4gaW50IGF0YV9ob3N0X3N1c3BlbmQoc3RydWN0IGF0YV9ob3N0ICpob3N0LCBwbV9tZXNzYWdlX3QgbWVzZyk7CiBleHRlcm4gdm9pZCBhdGFfaG9zdF9yZXN1bWUoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKIGV4dGVybiBpbnQgYXRhX3JhdGVsaW1pdCh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgYXRhX2J1c3lfc2xlZXAoc3RydWN0IGF0YV9wb3J0ICphcCwKLQkJCQkgICB1bnNpZ25lZCBsb25nIHRpbWVvdXRfcGF0LAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CitleHRlcm4gaW50IGF0YV9idXN5X3NsZWVwKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9wYXQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9xdWV1ZV90YXNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHZvaWQgKCpmbikodm9pZCAqKSwKIAkJCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKIGV4dGVybiB1MzIgYXRhX3dhaXRfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrLCB1MzIgdmFsLApAQCAtNzg3LDYgKzc5NSw3IEBACiAJCQkgIHVuc2lnbmVkIGludCBvZnMsIHVuc2lnbmVkIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgYXRhX2lkX2Nfc3RyaW5nKGNvbnN0IHUxNiAqaWQsIHVuc2lnbmVkIGNoYXIgKnMsCiAJCQkgICAgdW5zaWduZWQgaW50IG9mcywgdW5zaWduZWQgaW50IGxlbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhdGFfZGV2aWNlX2JsYWNrbGlzdGVkKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgYXRhX2JtZG1hX3NldHVwIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIGV4dGVybiB2b2lkIGF0YV9ibWRtYV9zdGFydCAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gdm9pZCBhdGFfYm1kbWFfc3RvcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKQEAgLTEwNjEsNyArMTA3MCw3IEBACiAJCXVkZWxheSgxMCk7CiAJCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKIAkJbWF4LS07Ci0JfSB3aGlsZSAoKHN0YXR1cyAmIGJpdHMpICYmIChtYXggPiAwKSk7CisJfSB3aGlsZSAoc3RhdHVzICE9IDB4ZmYgJiYgKHN0YXR1cyAmIGJpdHMpICYmIChtYXggPiAwKSk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTA4Miw3ICsxMDkxLDcgQEAKIHsKIAl1OCBzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSB8IEFUQV9EUlEsIDEwMDApOwogCi0JaWYgKHN0YXR1cyAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSB7CisJaWYgKHN0YXR1cyAhPSAweGZmICYmIChzdGF0dXMgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkpIHsKIAkJdW5zaWduZWQgbG9uZyBsID0gYXAtPmlvYWRkci5zdGF0dXNfYWRkcjsKIAkJaWYgKGF0YV9tc2dfd2FybihhcCkpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBVEE6IGFibm9ybWFsIHN0YXR1cyAweCVYIG9uIHBvcnQgMHglbFhcbiIsCkBAIC0xMTQ4LDM3ICsxMTU3LDYgQEAKIH0KIAogLyoqCi0gKglhdGFfaXJxX29uIC0gRW5hYmxlIGludGVycnVwdHMgb24gYSBwb3J0LgotICoJQGFwOiBQb3J0IG9uIHdoaWNoIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCi0gKgotICoJRW5hYmxlIGludGVycnVwdHMgb24gYSBsZWdhY3kgSURFIGRldmljZSB1c2luZyBNTUlPIG9yIFBJTywKLSAqCXdhaXQgZm9yIGlkbGUsIGNsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMuCi0gKgotICoJTE9DS0lORzoKLSAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHU4IGF0YV9pcnFfb24oc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOwotCXU4IHRtcDsKLQotCWFwLT5jdGwgJj0gfkFUQV9OSUVOOwotCWFwLT5sYXN0X2N0bCA9IGFwLT5jdGw7Ci0KLQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKLQkJd3JpdGViKGFwLT5jdGwsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5jdGxfYWRkcik7Ci0JZWxzZQotCQlvdXRiKGFwLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOwotCXRtcCA9IGF0YV93YWl0X2lkbGUoYXApOwotCi0JYXAtPm9wcy0+aXJxX2NsZWFyKGFwKTsKLQotCXJldHVybiB0bXA7Ci19Ci0KLQotLyoqCiAgKglhdGFfaXJxX2FjayAtIEFja25vd2xlZGdlIGEgZGV2aWNlIGludGVycnVwdC4KICAqCUBhcDogUG9ydCBvbiB3aGljaCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKaW5kZXggYjAzY2ZiOS4uMzI2ZGE3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKQEAgLTMxLDE1ICszMSwxNCBAQAogI2RlZmluZQlIUEVUX01JTk9SCSAgICAgMjI4CiAKIHN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgY2xhc3NfZGV2aWNlOwogCiBzdHJ1Y3QgbWlzY2RldmljZSAgewogCWludCBtaW5vcjsKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzczsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IGRldmljZSAqdGhpc19kZXZpY2U7CiB9OwogCiBleHRlcm4gaW50IG1pc2NfcmVnaXN0ZXIoc3RydWN0IG1pc2NkZXZpY2UgKiBtaXNjKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCA5OTFhMzczLi5kMGU2YTU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC0zOSw2ICszOSwxMCBAQAogCQkJCXdyaXRlX21pc2FsaWduOjE7CiB9OwogCitzdHJ1Y3QgbW1jX2V4dF9jc2QgeworCXVuc2lnbmVkIGludAkJaHNfbWF4X2R0cjsKK307CisKIHN0cnVjdCBzZF9zY3IgewogCXVuc2lnbmVkIGNoYXIJCXNkYV92c247CiAJdW5zaWduZWQgY2hhcgkJYnVzX3dpZHRoczsKQEAgLTQ2LDYgKzUwLDEwIEBACiAjZGVmaW5lIFNEX1NDUl9CVVNfV0lEVEhfNAkoMTw8MikKIH07CiAKK3N0cnVjdCBzZF9zd2l0Y2hfY2FwcyB7CisJdW5zaWduZWQgaW50CQloc19tYXhfZHRyOworfTsKKwogc3RydWN0IG1tY19ob3N0OwogCiAvKgpAQCAtNjIsMTIgKzcwLDE1IEBACiAjZGVmaW5lIE1NQ19TVEFURV9CQUQJCSgxPDwyKQkJLyogdW5yZWNvZ25pc2VkIGRldmljZSAqLwogI2RlZmluZSBNTUNfU1RBVEVfU0RDQVJECSgxPDwzKQkJLyogaXMgYW4gU0QgY2FyZCAqLwogI2RlZmluZSBNTUNfU1RBVEVfUkVBRE9OTFkJKDE8PDQpCQkvKiBjYXJkIGlzIHJlYWQtb25seSAqLworI2RlZmluZSBNTUNfU1RBVEVfSElHSFNQRUVECSgxPDw1KQkJLyogY2FyZCBpcyBpbiBoaWdoIHNwZWVkIG1vZGUgKi8KIAl1MzIJCQlyYXdfY2lkWzRdOwkvKiByYXcgY2FyZCBDSUQgKi8KIAl1MzIJCQlyYXdfY3NkWzRdOwkvKiByYXcgY2FyZCBDU0QgKi8KIAl1MzIJCQlyYXdfc2NyWzJdOwkvKiByYXcgY2FyZCBTQ1IgKi8KIAlzdHJ1Y3QgbW1jX2NpZAkJY2lkOwkJLyogY2FyZCBpZGVudGlmaWNhdGlvbiAqLwogCXN0cnVjdCBtbWNfY3NkCQljc2Q7CQkvKiBjYXJkIHNwZWNpZmljICovCisJc3RydWN0IG1tY19leHRfY3NkCWV4dF9jc2Q7CS8qIG1tYyB2NCBleHRlbmRlZCBjYXJkIHNwZWNpZmljICovCiAJc3RydWN0IHNkX3NjcgkJc2NyOwkJLyogZXh0cmEgU0QgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3Qgc2Rfc3dpdGNoX2NhcHMJc3dfY2FwczsJLyogc3dpdGNoIChDTUQ2KSBjYXBzICovCiB9OwogCiAjZGVmaW5lIG1tY19jYXJkX3ByZXNlbnQoYykJKChjKS0+c3RhdGUgJiBNTUNfU1RBVEVfUFJFU0VOVCkKQEAgLTc1LDEyICs4NiwxNCBAQAogI2RlZmluZSBtbWNfY2FyZF9iYWQoYykJCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX0JBRCkKICNkZWZpbmUgbW1jX2NhcmRfc2QoYykJCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX1NEQ0FSRCkKICNkZWZpbmUgbW1jX2NhcmRfcmVhZG9ubHkoYykJKChjKS0+c3RhdGUgJiBNTUNfU1RBVEVfUkVBRE9OTFkpCisjZGVmaW5lIG1tY19jYXJkX2hpZ2hzcGVlZChjKQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9ISUdIU1BFRUQpCiAKICNkZWZpbmUgbW1jX2NhcmRfc2V0X3ByZXNlbnQoYykJKChjKS0+c3RhdGUgfD0gTU1DX1NUQVRFX1BSRVNFTlQpCiAjZGVmaW5lIG1tY19jYXJkX3NldF9kZWFkKGMpCSgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9ERUFEKQogI2RlZmluZSBtbWNfY2FyZF9zZXRfYmFkKGMpCSgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9CQUQpCiAjZGVmaW5lIG1tY19jYXJkX3NldF9zZChjKQkoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfU0RDQVJEKQogI2RlZmluZSBtbWNfY2FyZF9zZXRfcmVhZG9ubHkoYykgKChjKS0+c3RhdGUgfD0gTU1DX1NUQVRFX1JFQURPTkxZKQorI2RlZmluZSBtbWNfY2FyZF9zZXRfaGlnaHNwZWVkKGMpICgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9ISUdIU1BFRUQpCiAKICNkZWZpbmUgbW1jX2NhcmRfbmFtZShjKQkoKGMpLT5jaWQucHJvZF9uYW1lKQogI2RlZmluZSBtbWNfY2FyZF9pZChjKQkJKChjKS0+ZGV2LmJ1c19pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCA1ODcyNjRhLi41MjhlN2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC03NCw4ICs3NCw4IEBACiBzdHJ1Y3QgZGV2aWNlOwogCiBzdHJ1Y3QgbW1jX2hvc3QgewotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IGNsYXNzX2RldmljZQljbGFzc19kZXY7CisJc3RydWN0IGRldmljZQkJKnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlCQljbGFzc19kZXY7CiAJaW50CQkJaW5kZXg7CiAJY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyAqb3BzOwogCXVuc2lnbmVkIGludAkJZl9taW47CkBAIC0xMjUsOCArMTI1LDggQEAKIAlyZXR1cm4gKHZvaWQgKilob3N0LT5wcml2YXRlOwogfQogCi0jZGVmaW5lIG1tY19kZXYoeCkJKCh4KS0+ZGV2KQotI2RlZmluZSBtbWNfaG9zdG5hbWUoeCkJKCh4KS0+Y2xhc3NfZGV2LmNsYXNzX2lkKQorI2RlZmluZSBtbWNfZGV2KHgpCSgoeCktPnBhcmVudCkKKyNkZWZpbmUgbW1jX2hvc3RuYW1lKHgpCSgoeCktPmNsYXNzX2Rldi5idXNfaWQpCiAKIGV4dGVybiBpbnQgbW1jX3N1c3BlbmRfaG9zdChzdHJ1Y3QgbW1jX2hvc3QgKiwgcG1fbWVzc2FnZV90KTsKIGV4dGVybiBpbnQgbW1jX3Jlc3VtZV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmggYi9pbmNsdWRlL2xpbnV4L21tYy9wcm90b2NvbC5oCmluZGV4IDA4ZGVjOGQuLjJkY2U2MGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaApAQCAtMjUsMTQgKzI1LDE2IEBACiAjaWZuZGVmIE1NQ19NTUNfUFJPVE9DT0xfSAogI2RlZmluZSBNTUNfTU1DX1BST1RPQ09MX0gKIAotLyogU3RhbmRhcmQgTU1DIGNvbW1hbmRzICgzLjEpICAgICAgICAgICB0eXBlICBhcmd1bWVudCAgICAgcmVzcG9uc2UgKi8KKy8qIFN0YW5kYXJkIE1NQyBjb21tYW5kcyAoNC4xKSAgICAgICAgICAgdHlwZSAgYXJndW1lbnQgICAgIHJlc3BvbnNlICovCiAgICAvKiBjbGFzcyAxICovCiAjZGVmaW5lCU1NQ19HT19JRExFX1NUQVRFICAgICAgICAgMCAgIC8qIGJjICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBNTUNfU0VORF9PUF9DT05EICAgICAgICAgIDEgICAvKiBiY3IgIFszMTowXSBPQ1IgICAgICAgICBSMyAgKi8KICNkZWZpbmUgTU1DX0FMTF9TRU5EX0NJRCAgICAgICAgICAyICAgLyogYmNyICAgICAgICAgICAgICAgICAgICAgUjIgICovCiAjZGVmaW5lIE1NQ19TRVRfUkVMQVRJVkVfQUREUiAgICAgMyAgIC8qIGFjICAgWzMxOjE2XSBSQ0EgICAgICAgIFIxICAqLwogI2RlZmluZSBNTUNfU0VUX0RTUiAgICAgICAgICAgICAgIDQgICAvKiBiYyAgIFszMToxNl0gUkNBICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU1DX1NXSVRDSCAgICAgICAgICAgICAgICA2ICAgLyogYWMgICBbMzE6MF0gU2VlIGJlbG93ICAgUjFiICovCiAjZGVmaW5lIE1NQ19TRUxFQ1RfQ0FSRCAgICAgICAgICAgNyAgIC8qIGFjICAgWzMxOjE2XSBSQ0EgICAgICAgIFIxICAqLworI2RlZmluZSBNTUNfU0VORF9FWFRfQ1NEICAgICAgICAgIDggICAvKiBhZHRjICAgICAgICAgICAgICAgICAgICBSMSAgKi8KICNkZWZpbmUgTU1DX1NFTkRfQ1NEICAgICAgICAgICAgICA5ICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgUjIgICovCiAjZGVmaW5lIE1NQ19TRU5EX0NJRCAgICAgICAgICAgICAxMCAgIC8qIGFjICAgWzMxOjE2XSBSQ0EgICAgICAgIFIyICAqLwogI2RlZmluZSBNTUNfUkVBRF9EQVRfVU5USUxfU1RPUCAgMTEgICAvKiBhZHRjIFszMTowXSBkYWRyICAgICAgICBSMSAgKi8KQEAgLTgwLDYgKzgyLDcgQEAKICAgLyogY2xhc3MgOCAqLwogLyogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgY29tbWFuZCBhcyBmb3IgTU1DIHdpdGggc29tZSBxdWlya3MuICovCiAjZGVmaW5lIFNEX1NFTkRfUkVMQVRJVkVfQUREUiAgICAgMyAgIC8qIGJjciAgICAgICAgICAgICAgICAgICAgIFI2ICAqLworI2RlZmluZSBTRF9TV0lUQ0ggICAgICAgICAgICAgICAgIDYgICAvKiBhZHRjIFszMTowXSBTZWUgYmVsb3cgICBSMSAgKi8KIAogICAvKiBBcHBsaWNhdGlvbiBjb21tYW5kcyAqLwogI2RlZmluZSBTRF9BUFBfU0VUX0JVU19XSURUSCAgICAgIDYgICAvKiBhYyAgIFsxOjBdIGJ1cyB3aWR0aCAgICBSMSAgKi8KQEAgLTg4LDYgKzkxLDMwIEBACiAjZGVmaW5lIFNEX0FQUF9TRU5EX1NDUiAgICAgICAgICA1MSAgIC8qIGFkdGMgICAgICAgICAgICAgICAgICAgIFIxICAqLwogCiAvKgorICogTU1DX1NXSVRDSCBhcmd1bWVudCBmb3JtYXQ6CisgKgorICoJWzMxOjI2XSBBbHdheXMgMAorICoJWzI1OjI0XSBBY2Nlc3MgTW9kZQorICoJWzIzOjE2XSBMb2NhdGlvbiBvZiB0YXJnZXQgQnl0ZSBpbiBFWFRfQ1NECisgKglbMTU6MDhdIFZhbHVlIEJ5dGUKKyAqCVswNzowM10gQWx3YXlzIDAKKyAqCVswMjowMF0gQ29tbWFuZCBTZXQKKyAqLworCisvKgorICogU0RfU1dJVENIIGFyZ3VtZW50IGZvcm1hdDoKKyAqCisgKiAgICAgIFszMV0gQ2hlY2sgKDApIG9yIHN3aXRjaCAoMSkKKyAqICAgICAgWzMwOjI0XSBSZXNlcnZlZCAoMCkKKyAqICAgICAgWzIzOjIwXSBGdW5jdGlvbiBncm91cCA2CisgKiAgICAgIFsxOToxNl0gRnVuY3Rpb24gZ3JvdXAgNQorICogICAgICBbMTU6MTJdIEZ1bmN0aW9uIGdyb3VwIDQKKyAqICAgICAgWzExOjhdIEZ1bmN0aW9uIGdyb3VwIDMKKyAqICAgICAgWzc6NF0gRnVuY3Rpb24gZ3JvdXAgMgorICogICAgICBbMzowXSBGdW5jdGlvbiBncm91cCAxCisgKi8KKworLyoKICAgTU1DIHN0YXR1cyBpbiBSMQogICBUeXBlCiAgIAllIDogZXJyb3IgYml0CkBAIC0yMzAsMTMgKzI1Nyw1NCBAQAogCiAjZGVmaW5lIENTRF9TVFJVQ1RfVkVSXzFfMCAgMCAgICAgICAgICAgLyogVmFsaWQgZm9yIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuMCAtIDEuMiAqLwogI2RlZmluZSBDU0RfU1RSVUNUX1ZFUl8xXzEgIDEgICAgICAgICAgIC8qIFZhbGlkIGZvciBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjQgLSAyLjIgKi8KLSNkZWZpbmUgQ1NEX1NUUlVDVF9WRVJfMV8yICAyICAgICAgICAgICAvKiBWYWxpZCBmb3Igc3lzdGVtIHNwZWNpZmljYXRpb24gMy4xICAgICAgICovCisjZGVmaW5lIENTRF9TVFJVQ1RfVkVSXzFfMiAgMiAgICAgICAgICAgLyogVmFsaWQgZm9yIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDMuMSAtIDMuMiAtIDMuMzEgLSA0LjAgLSA0LjEgKi8KKyNkZWZpbmUgQ1NEX1NUUlVDVF9FWFRfQ1NEICAzICAgICAgICAgICAvKiBWZXJzaW9uIGlzIGNvZGVkIGluIENTRF9TVFJVQ1RVUkUgaW4gRVhUX0NTRCAqLwogCiAjZGVmaW5lIENTRF9TUEVDX1ZFUl8wICAgICAgMCAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjAgLSAxLjIgKi8KICNkZWZpbmUgQ1NEX1NQRUNfVkVSXzEgICAgICAxICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuNCAqLwogI2RlZmluZSBDU0RfU1BFQ19WRVJfMiAgICAgIDIgICAgICAgICAgIC8qIEltcGxlbWVudHMgc3lzdGVtIHNwZWNpZmljYXRpb24gMi4wIC0gMi4yICovCi0jZGVmaW5lIENTRF9TUEVDX1ZFUl8zICAgICAgMyAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAzLjEgKi8KKyNkZWZpbmUgQ1NEX1NQRUNfVkVSXzMgICAgICAzICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDMuMSAtIDMuMiAtIDMuMzEgKi8KKyNkZWZpbmUgQ1NEX1NQRUNfVkVSXzQgICAgICA0ICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDQuMCAtIDQuMSAqLwogCisvKgorICogRVhUX0NTRCBmaWVsZHMKKyAqLworCisjZGVmaW5lIEVYVF9DU0RfQlVTX1dJRFRICTE4MwkvKiBSL1cgKi8KKyNkZWZpbmUgRVhUX0NTRF9IU19USU1JTkcJMTg1CS8qIFIvVyAqLworI2RlZmluZSBFWFRfQ1NEX0NBUkRfVFlQRQkxOTYJLyogUk8gKi8KKworLyoKKyAqIEVYVF9DU0QgZmllbGQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwJCSgxPDwwKQorI2RlZmluZSBFWFRfQ1NEX0NNRF9TRVRfU0VDVVJFCQkoMTw8MSkKKyNkZWZpbmUgRVhUX0NTRF9DTURfU0VUX0NQU0VDVVJFCSgxPDwyKQorCisjZGVmaW5lIEVYVF9DU0RfQ0FSRF9UWVBFXzI2CSgxPDwwKQkvKiBDYXJkIGNhbiBydW4gYXQgMjZNSHogKi8KKyNkZWZpbmUgRVhUX0NTRF9DQVJEX1RZUEVfNTIJKDE8PDEpCS8qIENhcmQgY2FuIHJ1biBhdCA1Mk1IeiAqLworCisjZGVmaW5lIEVYVF9DU0RfQlVTX1dJRFRIXzEJMAkvKiBDYXJkIGlzIGluIDEgYml0IG1vZGUgKi8KKyNkZWZpbmUgRVhUX0NTRF9CVVNfV0lEVEhfNAkxCS8qIENhcmQgaXMgaW4gNCBiaXQgbW9kZSAqLworI2RlZmluZSBFWFRfQ1NEX0JVU19XSURUSF84CTIJLyogQ2FyZCBpcyBpbiA4IGJpdCBtb2RlICovCisKKy8qCisgKiBNTUNfU1dJVENIIGFjY2VzcyBtb2RlcworICovCisKKyNkZWZpbmUgTU1DX1NXSVRDSF9NT0RFX0NNRF9TRVQJCTB4MDAJLyogQ2hhbmdlIHRoZSBjb21tYW5kIHNldCAqLworI2RlZmluZSBNTUNfU1dJVENIX01PREVfU0VUX0JJVFMJMHgwMQkvKiBTZXQgYml0cyB3aGljaCBhcmUgMSBpbiB2YWx1ZSAqLworI2RlZmluZSBNTUNfU1dJVENIX01PREVfQ0xFQVJfQklUUwkweDAyCS8qIENsZWFyIGJpdHMgd2hpY2ggYXJlIDEgaW4gdmFsdWUgKi8KKyNkZWZpbmUgTU1DX1NXSVRDSF9NT0RFX1dSSVRFX0JZVEUJMHgwMwkvKiBTZXQgdGFyZ2V0IHRvIHZhbHVlICovCisKKy8qCisgKiBTQ1IgZmllbGQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIFNDUl9TUEVDX1ZFUl8wICAgICAgMCAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjAgLSAxLjAxICovCisjZGVmaW5lIFNDUl9TUEVDX1ZFUl8xICAgICAgMSAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjEwICovCisjZGVmaW5lIFNDUl9TUEVDX1ZFUl8yICAgICAgMiAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAyLjAwICovCiAKIC8qCiAgKiBTRCBidXMgd2lkdGhzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBkMWQwMGNlLi5kMzNkZjI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTYsNyArNiw2IEBACiAgKiBSZXdyaXR0ZW4gYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4gRGVjIDE5OTYKICAqIFJld3JpdHRlbiBhZ2FpbiBieSBSdXN0eSBSdXNzZWxsLCAyMDAyCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KQEAgLTI2NCw2ICsyNjMsNyBAQAogCXN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptb2RpbmZvX2F0dHJzOwogCWNvbnN0IGNoYXIgKnZlcnNpb247CiAJY29uc3QgY2hhciAqc3JjdmVyc2lvbjsKKwlzdHJ1Y3Qga29iamVjdCAqZHJpdmVyc19kaXI7CiAKIAkvKiBFeHBvcnRlZCBzeW1ib2xzICovCiAJY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKnN5bXM7CkBAIC00MTAsMTcgKzQxMCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1vZHVsZV9wdXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKQotewotCWlmIChtb2R1bGUpIHsKLQkJdW5zaWduZWQgaW50IGNwdSA9IGdldF9jcHUoKTsKLQkJbG9jYWxfZGVjKCZtb2R1bGUtPnJlZltjcHVdLmNvdW50KTsKLQkJLyogTWF5YmUgdGhleSdyZSB3YWl0aW5nIGZvciB1cyB0byBkcm9wIHJlZmVyZW5jZT8gKi8KLQkJaWYgKHVubGlrZWx5KCFtb2R1bGVfaXNfbGl2ZShtb2R1bGUpKSkKLQkJCXdha2VfdXBfcHJvY2Vzcyhtb2R1bGUtPndhaXRlcik7Ci0JCXB1dF9jcHUoKTsKLQl9Ci19CitleHRlcm4gdm9pZCBtb2R1bGVfcHV0KHN0cnVjdCBtb2R1bGUgKm1vZHVsZSk7CiAKICNlbHNlIC8qIUNPTkZJR19NT0RVTEVfVU5MT0FEKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRyeV9tb2R1bGVfZ2V0KHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXF1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L21xdWV1ZS5oCmluZGV4IDhkYjlkNzUuLjhiNWE3OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXF1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tcXVldWUuaApAQCAtMTgsOCArMTgsNiBAQAogI2lmbmRlZiBfTElOVVhfTVFVRVVFX0gKICNkZWZpbmUgX0xJTlVYX01RVUVVRV9ICiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCiAjZGVmaW5lIE1RX1BSSU9fTUFYIAkzMjc2OAogLyogcGVyLXVpZCBsaW1pdCBvZiBrZXJuZWwgbWVtb3J5IHVzZWQgYnkgbXF1ZXVlLCBpbiBieXRlcyAqLwogI2RlZmluZSBNUV9CWVRFU19NQVgJODE5MjAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L212NjQzeHguaCBiL2luY2x1ZGUvbGludXgvbXY2NDN4eC5oCmluZGV4IGVkZmEwMTIuLmFmZjI1YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXY2NDN4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXY2NDN4eC5oCkBAIC03MjQsNyArNzI0LDcgQEAKICNkZWZpbmUgTVY2NDNYWF9FVEhfUlhfRklGT19VUkdFTlRfVEhSRVNIT0xEX1JFRyhwb3J0KSAgICAgICAgICAgICAoMHgyNDcwICsgKHBvcnQ8PDEwKSkKICNkZWZpbmUgTVY2NDNYWF9FVEhfVFhfRklGT19VUkdFTlRfVEhSRVNIT0xEX1JFRyhwb3J0KSAgICAgICAgICAgICAoMHgyNDc0ICsgKHBvcnQ8PDEwKSkKICNkZWZpbmUgTVY2NDNYWF9FVEhfUlhfTUlOSU1BTF9GUkFNRV9TSVpFX1JFRyhwb3J0KSAgICAgICAgICAgICAgICAoMHgyNDdjICsgKHBvcnQ8PDEwKSkKLSNkZWZpbmUgTVY2NDNYWF9FVEhfUlhfRElTQ0FSREVEX0ZSQU1FU19DT1VOVEVSKHBvcnQpICAgICAgICAgICAgICAoMHgyNDg0ICsgKHBvcnQ8PDEwKQorI2RlZmluZSBNVjY0M1hYX0VUSF9SWF9ESVNDQVJERURfRlJBTUVTX0NPVU5URVIocG9ydCkgICAgICAgICAgICAgICgweDI0ODQgKyAocG9ydDw8MTApKQogI2RlZmluZSBNVjY0M1hYX0VUSF9QT1JUX0RFQlVHXzBfUkVHKHBvcnQpICAgICAgICAgICAgICAgICAgICAgICAgICgweDI0OGMgKyAocG9ydDw8MTApKQogI2RlZmluZSBNVjY0M1hYX0VUSF9QT1JUX0RFQlVHXzFfUkVHKHBvcnQpICAgICAgICAgICAgICAgICAgICAgICAgICgweDI0OTAgKyAocG9ydDw8MTApKQogI2RlZmluZSBNVjY0M1hYX0VUSF9QT1JUX0lOVEVSTkFMX0FERFJfRVJST1JfUkVHKHBvcnQpICAgICAgICAgICAgICgweDI0OTQgKyAocG9ydDw8MTApKQpAQCAtMTEzNSw3ICsxMTM1LDcgQEAKICNkZWZpbmUgTVY2NDNYWF9FVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfMQkoMTw8MTkpCiAjZGVmaW5lIE1WNjQzWFhfRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzIJKDE8PDIwKQogI2RlZmluZSBNVjY0M1hYX0VUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV8zCSgoMTw8MjApIHwgKDE8PDE5KSkKLSNkZWZpbmUgTVY2NDNYWF9FVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNAkoKDE8PDIxKQorI2RlZmluZSBNVjY0M1hYX0VUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV80CSgxPDwyMSkKICNkZWZpbmUgTVY2NDNYWF9FVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNQkoKDE8PDIxKSB8ICgxPDwxOSkpCiAjZGVmaW5lIE1WNjQzWFhfRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzYJKCgxPDwyMSkgfCAoMTw8MjApKQogI2RlZmluZSBNVjY0M1hYX0VUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV83CSgoMTw8MjEpIHwgKDE8PDIwKSB8ICgxPDwxOSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldC5oIGIvaW5jbHVkZS9saW51eC9uZXQuaAppbmRleCAxNWM3MzNiLi42ZjBkZmViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0LmgKQEAgLTE5Niw3ICsxOTYsNyBAQAogZXh0ZXJuIGludAkgICAgIG5ldF9yYXRlbGltaXQodm9pZCk7CiAKICNkZWZpbmUgbmV0X3JhbmRvbSgpCQlyYW5kb20zMigpCi0jZGVmaW5lIG5ldF9zcmFuZG9tKHNlZWQpCXNyYW5kb20zMihzZWVkKQorI2RlZmluZSBuZXRfc3JhbmRvbShzZWVkKQlzcmFuZG9tMzIoKF9fZm9yY2UgdTMyKXNlZWQpCiAKIGV4dGVybiBpbnQgICAJICAgICBrZXJuZWxfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCQkJICAgIHN0cnVjdCBrdmVjICp2ZWMsIHNpemVfdCBudW0sIHNpemVfdCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggOTI2NDEzOS4uYzU3MDg4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpAQCAtMzgsNyArMzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogCi1zdHJ1Y3QgZGl2ZXJ0X2JsazsKIHN0cnVjdCB2bGFuX2dyb3VwOwogc3RydWN0IGV0aHRvb2xfb3BzOwogc3RydWN0IG5ldHBvbGxfaW5mbzsKQEAgLTY3LDYgKzY3LDEwIEBACiAjZGVmaW5lIE5FVF9SWF9DTl9ISUdICQk0ICAgLyogVGhlIHN0b3JtIGlzIGhlcmUgKi8KICNkZWZpbmUgTkVUX1JYX0JBRAkJNSAgLyogcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtlcm5lbCBlcnJvciAqLwogCisvKiBORVRfWE1JVF9DTiBpcyBzcGVjaWFsLiBJdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGlzIHBhY2tldCBpcyBsb3N0LiBJdAorICogaW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSB3aWxsIHNvb24gYmUgZHJvcHBpbmcgcGFja2V0cywgb3IgYWxyZWFkeSBkcm9wcworICogc29tZSBwYWNrZXRzIG9mIHRoZSBzYW1lIHByaW9yaXR5OyBwcm9tcHRpbmcgdXMgdG8gc2VuZCBsZXNzIGFnZ3Jlc3NpdmVseS4gKi8KKyNkZWZpbmUgbmV0X3htaXRfZXZhbChlKQkoKGUpID09IE5FVF9YTUlUX0NOPyAwIDogKGUpKQogI2RlZmluZSBuZXRfeG1pdF9lcnJubyhlKQkoKGUpICE9IE5FVF9YTUlUX0NOID8gLUVOT0JVRlMgOiAwKQogCiAjZW5kaWYKQEAgLTkzLDggKzk3LDEwIEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoQ09ORklHX05FVF9JUElQKSAmJiBcCi0gICAgIWRlZmluZWQoQ09ORklHX0lQVjYpICYmICFkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiAhZGVmaW5lZChDT05GSUdfTkVUX0lQSVApICYmICFkZWZpbmVkKENPTkZJR19ORVRfSVBJUF9NT0RVTEUpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfTkVUX0lQR1JFKSAmJiAgIWRlZmluZWQoQ09ORklHX05FVF9JUEdSRV9NT0RVTEUpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfSVBWNl9TSVQpICYmICFkZWZpbmVkKENPTkZJR19JUFY2X1NJVF9NT0RVTEUpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfSVBWNl9UVU5ORUwpICYmICFkZWZpbmVkKENPTkZJR19JUFY2X1RVTk5FTF9NT0RVTEUpCiAjZGVmaW5lIE1BWF9IRUFERVIgTExfTUFYX0hFQURFUgogI2Vsc2UKICNkZWZpbmUgTUFYX0hFQURFUiAoTExfTUFYX0hFQURFUiArIDQ4KQpAQCAtMTkxLDcgKzE5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIE5PVEU6ICBGb3IgVkxBTnMsIHRoaXMgd2lsbCBiZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgZW5jYXB1c2xhdGVkIHR5cGUuIC0tQkxHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JaW50CQloaF9sZW47CQkvKiBsZW5ndGggb2YgaGVhZGVyICovCisJdTE2CQloaF9sZW47CQkvKiBsZW5ndGggb2YgaGVhZGVyICovCiAJaW50CQkoKmhoX291dHB1dCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJcndsb2NrX3QJaGhfbG9jazsKIApAQCAtNTE1LDExICs1MjEsNiBAQAogCS8qIGJyaWRnZSBzdHVmZiAqLwogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQJKmJyX3BvcnQ7CiAKLSNpZmRlZiBDT05GSUdfTkVUX0RJVkVSVAotCS8qIHRoaXMgd2lsbCBnZXQgaW5pdGlhbGl6ZWQgYXQgZWFjaCBpbnRlcmZhY2UgdHlwZSBpbml0IHJvdXRpbmUgKi8KLQlzdHJ1Y3QgZGl2ZXJ0X2JsawkqZGl2ZXJ0OwotI2VuZGlmIC8qIENPTkZJR19ORVRfRElWRVJUICovCi0KIAkvKiBjbGFzcy9uZXQvbmFtZSBlbnRyeSAqLwogCXN0cnVjdCBjbGFzc19kZXZpY2UJY2xhc3NfZGV2OwogCS8qIHNwYWNlIGZvciBvcHRpb25hbCBzdGF0aXN0aWNzIGFuZCB3aXJlbGVzcyBzeXNmcyBncm91cHMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCmluZGV4IGI3ZTY3ZDEuLmQ0YzRjNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaApAQCAtMTE3LDYgKzExNywxNiBAQAogaW50IG5mX3JlZ2lzdGVyX3NvY2tvcHQoc3RydWN0IG5mX3NvY2tvcHRfb3BzICpyZWcpOwogdm9pZCBuZl91bnJlZ2lzdGVyX3NvY2tvcHQoc3RydWN0IG5mX3NvY2tvcHRfb3BzICpyZWcpOwogCisjaWZkZWYgQ09ORklHX1NZU0NUTAorLyogU3lzY3RsIHJlZ2lzdHJhdGlvbiAqLworc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mX3JlZ2lzdGVyX3N5c2N0bF90YWJsZShzdHJ1Y3QgY3RsX3RhYmxlICpwYXRoLAorCQkJCQkJICBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSk7Cit2b2lkIG5mX3VucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkZXIsCisJCQkJc3RydWN0IGN0bF90YWJsZSAqdGFibGUpOworZXh0ZXJuIHN0cnVjdCBjdGxfdGFibGUgbmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aFtdOworZXh0ZXJuIHN0cnVjdCBjdGxfdGFibGUgbmZfbmV0X2lwdjRfbmV0ZmlsdGVyX3N5c2N0bF9wYXRoW107CisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZl9ob29rc1tOUFJPVE9dW05GX01BWF9IT09LU107CiAKIC8qIHRob3NlIE5GX0xPR18qIGRlZmluZXMgYW5kIHN0cnVjdCBuZl9sb2dpbmZvIGFyZSBsZWdhY3kgZGVmaW5pdGlvcyB0aGF0IHdpbGwKQEAgLTI4MiwxNSArMjkyLDMxIEBACiAgICBSZXR1cm5zIHRydWUgb3IgZmFsc2UuICovCiBleHRlcm4gaW50IHNrYl9tYWtlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHdyaXRhYmxlX2xlbik7CiAKLWV4dGVybiB1X2ludDE2X3QgbmZfY3N1bV91cGRhdGUodV9pbnQzMl90IG9sZHZhbCwgdV9pbnQzMl90IG5ld3ZhbCwKLQkJCQl1X2ludDMyX3QgY3N1bSk7Ci1leHRlcm4gdV9pbnQxNl90IG5mX3Byb3RvX2NzdW1fdXBkYXRlKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgdV9pbnQzMl90IG9sZHZhbCwgdV9pbnQzMl90IG5ld3ZhbCwKLQkJCQkgICAgICB1X2ludDE2X3QgY3N1bSwgaW50IHBzZXVkb2hkcik7CitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3N1bV9yZXBsYWNlNChfX3N1bTE2ICpzdW0sIF9fYmUzMiBmcm9tLCBfX2JlMzIgdG8pCit7CisJX19iZTMyIGRpZmZbXSA9IHsgfmZyb20sIHRvIH07CisKKwkqc3VtID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbCgoY2hhciAqKWRpZmYsIHNpemVvZihkaWZmKSwgfmNzdW1fdW5mb2xkKCpzdW0pKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZl9jc3VtX3JlcGxhY2UyKF9fc3VtMTYgKnN1bSwgX19iZTE2IGZyb20sIF9fYmUxNiB0bykKK3sKKwluZl9jc3VtX3JlcGxhY2U0KHN1bSwgKF9fZm9yY2UgX19iZTMyKWZyb20sIChfX2ZvcmNlIF9fYmUzMil0byk7Cit9CisKK2V4dGVybiB2b2lkIG5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoX19zdW0xNiAqc3VtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIF9fYmUzMiBmcm9tLCBfX2JlMzIgdG8sIGludCBwc2V1ZG9oZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfcHJvdG9fY3N1bV9yZXBsYWNlMihfX3N1bTE2ICpzdW0sIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgX19iZTE2IGZyb20sIF9fYmUxNiB0bywgaW50IHBzZXVkb2hkcikKK3sKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KHN1bSwgc2tiLCAoX19mb3JjZSBfX2JlMzIpZnJvbSwKKwkJCQkoX19mb3JjZSBfX2JlMzIpdG8sIHBzZXVkb2hkcik7Cit9CiAKIHN0cnVjdCBuZl9hZmluZm8gewogCXVuc2lnbmVkIHNob3J0CWZhbWlseTsKLQl1bnNpZ25lZCBpbnQJKCpjaGVja3N1bSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCisJX19zdW0xNgkJKCpjaGVja3N1bSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLCB1X2ludDhfdCBwcm90b2NvbCk7CiAJdm9pZAkJKCpzYXZlcm91dGUpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICBzdHJ1Y3QgbmZfaW5mbyAqaW5mbyk7CkBAIC0zMDUsMTIgKzMzMSwxMiBAQAogCXJldHVybiByY3VfZGVyZWZlcmVuY2UobmZfYWZpbmZvW2ZhbWlseV0pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorc3RhdGljIGlubGluZSBfX3N1bTE2CiBuZl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGRhdGFvZmYsCiAJICAgIHVfaW50OF90IHByb3RvY29sLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCiB7CiAJc3RydWN0IG5mX2FmaW5mbyAqYWZpbmZvOwotCXVuc2lnbmVkIGludCBjc3VtID0gMDsKKwlfX3N1bTE2IGNzdW0gPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWFmaW5mbyA9IG5mX2dldF9hZmluZm8oZmFtaWx5KTsKQEAgLTMzMSw3ICszNTcsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBuZl9uYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCwgaW50IGZhbWlseSkKIHsKLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAorI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX05BVF9ORUVERUQpIHx8IGRlZmluZWQoQ09ORklHX05GX05BVF9ORUVERUQpCiAJdm9pZCAoKmRlY29kZWZuKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgZmxvd2kgKik7CiAKIAlpZiAoZmFtaWx5ID09IEFGX0lORVQgJiYgKGRlY29kZWZuID0gaXBfbmF0X2RlY29kZV9zZXNzaW9uKSAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCmluZGV4IDMxMmJkMmZmZS4uNjMyODE3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZApAQCAtMTQsNiArMTQsNyBAQAogaGVhZGVyLXkgKz0geHRfRFNDUC5oCiBoZWFkZXIteSArPSB4dF9lc3AuaAogaGVhZGVyLXkgKz0geHRfaGVscGVyLmgKK2hlYWRlci15ICs9IHh0X2hhc2hsaW1pdC5oCiBoZWFkZXIteSArPSB4dF9sZW5ndGguaAogaGVhZGVyLXkgKz0geHRfbGltaXQuaAogaGVhZGVyLXkgKz0geHRfbWFjLmgKQEAgLTIxLDYgKzIyLDcgQEAKIGhlYWRlci15ICs9IHh0X01BUksuaAogaGVhZGVyLXkgKz0geHRfbXVsdGlwb3J0LmgKIGhlYWRlci15ICs9IHh0X05GUVVFVUUuaAoraGVhZGVyLXkgKz0geHRfTkZMT0cuaAogaGVhZGVyLXkgKz0geHRfcGt0dHlwZS5oCiBoZWFkZXIteSArPSB4dF9wb2xpY3kuaAogaGVhZGVyLXkgKz0geHRfcmVhbG0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FtYW5kYS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FtYW5kYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzIyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0FNQU5EQV9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfQU1BTkRBX0gKKy8qIEFNQU5EQSB0cmFja2luZy4gKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCAoKm5mX25hdF9hbWFuZGFfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCQkgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkJCSAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19BTUFOREFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oCmluZGV4IGFkNGE0MWMuLjgxNDUzZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmgKQEAgLTMsMTYgKzMsMTYgQEAKIC8qIEZUUCB0cmFja2luZy4gKi8KIAogLyogVGhpcyBlbnVtIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlICovCi1lbnVtIGlwX2N0X2Z0cF90eXBlCitlbnVtIG5mX2N0X2Z0cF90eXBlCiB7CiAJLyogUE9SVCBjb21tYW5kIGZyb20gY2xpZW50ICovCi0JSVBfQ1RfRlRQX1BPUlQsCisJTkZfQ1RfRlRQX1BPUlQsCiAJLyogUEFTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLwotCUlQX0NUX0ZUUF9QQVNWLAorCU5GX0NUX0ZUUF9QQVNWLAogCS8qIEVQUlQgY29tbWFuZCBmcm9tIGNsaWVudCAqLwotCUlQX0NUX0ZUUF9FUFJULAorCU5GX0NUX0ZUUF9FUFJULAogCS8qIEVQU1YgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KLQlJUF9DVF9GVFBfRVBTViwKKwlORl9DVF9GVFBfRVBTViwKIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0yMSwyMyArMjEsMjMgQEAKIAogI2RlZmluZSBOVU1fU0VRX1RPX1JFTUVNQkVSIDIKIC8qIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IG9uY2UgcGVyIG1hc3RlciAqLwotc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgeworc3RydWN0IG5mX2N0X2Z0cF9tYXN0ZXIgewogCS8qIFZhbGlkIHNlcSBwb3NpdGlvbnMgZm9yIGNtZCBtYXRjaGluZyBhZnRlciBuZXdsaW5lICovCiAJdV9pbnQzMl90IHNlcV9hZnRfbmxbSVBfQ1RfRElSX01BWF1bTlVNX1NFUV9UT19SRU1FTUJFUl07CiAJLyogMCBtZWFucyBzZXFfbWF0Y2hfYWZ0X25sIG5vdCBzZXQgKi8KIAlpbnQgc2VxX2FmdF9ubF9udW1bSVBfQ1RfRElSX01BWF07CiB9OwogCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdDsKK3N0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0OwogCiAvKiBGb3IgTkFUIHRvIGhvb2sgaW4gd2hlbiB3ZSBmaW5kIGEgcGFja2V0IHdoaWNoIGRlc2NyaWJlcyB3aGF0IG90aGVyCiAgKiBjb25uZWN0aW9uIHdlIHNob3VsZCBleHBlY3QuICovCi1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X2Z0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCitleHRlcm4gdW5zaWduZWQgaW50ICgqbmZfbmF0X2Z0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAJCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgICBlbnVtIGlwX2N0X2Z0cF90eXBlIHR5cGUsCisJCQkJICAgICAgIGVudW0gbmZfY3RfZnRwX3R5cGUgdHlwZSwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAsCisJCQkJICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAsCiAJCQkJICAgICAgIHUzMiAqc2VxKTsKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyMy5oCkBAIC0wLDAgKzEsOTIgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19IMzIzX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19IMzIzX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLmg+CisKKyNkZWZpbmUgUkFTX1BPUlQgMTcxOQorI2RlZmluZSBROTMxX1BPUlQgMTcyMAorI2RlZmluZSBIMzIzX1JUUF9DSEFOTkVMX01BWCA0CS8qIEF1ZGlvLCB2aWRlbywgRkFYIGFuZCBvdGhlciAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBleGlzdHMgb25seSBvbmNlIHBlciBtYXN0ZXIgKi8KK3N0cnVjdCBuZl9jdF9oMzIzX21hc3RlciB7CisKKwkvKiBPcmlnaW5hbCBhbmQgTkFUZWQgUS45MzEgb3IgSC4yNDUgc2lnbmFsIHBvcnRzICovCisJX19iZTE2IHNpZ19wb3J0W0lQX0NUX0RJUl9NQVhdOworCisJLyogT3JpZ2luYWwgYW5kIE5BVGVkIFJUUCBwb3J0cyAqLworCV9fYmUxNiBydHBfcG9ydFtIMzIzX1JUUF9DSEFOTkVMX01BWF1bSVBfQ1RfRElSX01BWF07CisKKwl1bmlvbiB7CisJCS8qIFJBUyBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKwkJdV9pbnQzMl90IHRpbWVvdXQ7CisKKwkJLyogTmV4dCBUUEtUIGxlbmd0aCAoZm9yIHNlcGFyYXRlIFRQS1QgaGVhZGVyIGFuZCBkYXRhKSAqLworCQl1X2ludDE2X3QgdHBrdF9sZW5bSVBfQ1RfRElSX01BWF07CisJfTsKK307CisKK3N0cnVjdCBuZl9jb25uOworCitleHRlcm4gaW50IGdldF9oMjI1X2FkZHIoc3RydWN0IG5mX2Nvbm4gKmN0LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICphZGRyLCBfX2JlMTYgKnBvcnQpOworZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX2gyNDVfZXhwZWN0KHN0cnVjdCBuZl9jb25uICpuZXcsCisJCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqdGhpcyk7CitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfcTkzMV9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKm5ldywKKwkJCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKK2V4dGVybiBpbnQgKCpzZXRfaDI0NV9hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkJICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJCSAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsCisJCQkJICBfX2JlMTYgcG9ydCk7CitleHRlcm4gaW50ICgqc2V0X2gyMjVfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkJICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwKKwkJCQkgIF9fYmUxNiBwb3J0KTsKK2V4dGVybiBpbnQgKCpzZXRfc2lnX2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEsCisJCQkJIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBpbnQgY291bnQpOworZXh0ZXJuIGludCAoKnNldF9yYXNfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkJCQkgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCk7CitleHRlcm4gaW50ICgqbmF0X3J0cF9ydGNwX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCQkgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICp0YWRkciwKKwkJCQkgX19iZTE2IHBvcnQsIF9fYmUxNiBydHBfcG9ydCwKKwkJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHAsCisJCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpydGNwX2V4cCk7CitleHRlcm4gaW50ICgqbmF0X3QxMjBfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBfX2JlMTYgcG9ydCwKKwkJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CitleHRlcm4gaW50ICgqbmF0X2gyNDVfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgICBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwgX19iZTE2IHBvcnQsCisJCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOworZXh0ZXJuIGludCAoKm5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkJICAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJCSAgICAgICBfX2JlMTYgcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CitleHRlcm4gaW50ICgqbmF0X3E5MzFfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJICAgICBpbnQgaWR4LCBfX2JlMTYgcG9ydCwKKwkJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEuaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEuaAppbmRleCBjNmU5YTBiLi44ZGFiNTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5oCkBAIC0xLDYgKzEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmggLSBCRVIgYW5kIFBFUiBkZWNvZGluZyBsaWJyYXJ5IGZvciBILjMyMwotICogCQkJICAgICAgCSAgICAgY29ubnRyYWNrL05BVCBtb2R1bGUuCisgKiBpcF9jb25udHJhY2tfaDMyM19hc24xLmggLSBCRVIgYW5kIFBFUiBkZWNvZGluZyBsaWJyYXJ5IGZvciBILjMyMworICogCQkJICAgICAgY29ubnRyYWNrL05BVCBtb2R1bGUuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA2IGJ5IEppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAqCkBAIC0zNCwxMyArMzQsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0hFTFBFUl9IMzIzX0FTTjFfSF8KLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19IRUxQRVJfSDMyM19BU04xX0hfCisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfSEVMUEVSX0gzMjNfQVNOMV9IXworI2RlZmluZSBfTkZfQ09OTlRSQUNLX0hFTFBFUl9IMzIzX0FTTjFfSF8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBILjMyMyBUeXBlcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX3R5cGVzLmgiCisjaW5jbHVkZSAibmZfY29ubnRyYWNrX2gzMjNfdHlwZXMuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewogCWVudW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfdHlwZXMuaAppbmRleCAzZDRhNzczLi4zOGQ3NGQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM190eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX3R5cGVzLmgKQEAgLTEwLDYgKzEwLDExIEBACiAJdW5zaWduZWQgaXA7CiB9IFRyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzOwogCit0eXBlZGVmIHN0cnVjdCBUcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3MgewkvKiBTRVFVRU5DRSAqLworCWludCBvcHRpb25zOwkJLyogTm8gdXNlICovCisJdW5zaWduZWQgaXA2OworfSBUcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3M7CisKIHR5cGVkZWYgc3RydWN0IFRyYW5zcG9ydEFkZHJlc3MgewkvKiBDSE9JQ0UgKi8KIAllbnVtIHsKIAkJZVRyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzLApAQCAtMjIsNiArMjcsNyBAQAogCX0gY2hvaWNlOwogCXVuaW9uIHsKIAkJVHJhbnNwb3J0QWRkcmVzc19pcEFkZHJlc3MgaXBBZGRyZXNzOworCQlUcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3MgaXA2QWRkcmVzczsKIAl9OwogfSBUcmFuc3BvcnRBZGRyZXNzOwogCkBAIC05Myw2ICs5OSwxMSBAQAogCXVuc2lnbmVkIG5ldHdvcms7CiB9IFVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzczsKIAordHlwZWRlZiBzdHJ1Y3QgVW5pY2FzdEFkZHJlc3NfaVA2QWRkcmVzcyB7CS8qIFNFUVVFTkNFICovCisJaW50IG9wdGlvbnM7CQkvKiBObyB1c2UgKi8KKwl1bnNpZ25lZCBuZXR3b3JrOworfSBVbmljYXN0QWRkcmVzc19pUDZBZGRyZXNzOworCiB0eXBlZGVmIHN0cnVjdCBVbmljYXN0QWRkcmVzcyB7CS8qIENIT0lDRSAqLwogCWVudW0gewogCQllVW5pY2FzdEFkZHJlc3NfaVBBZGRyZXNzLApAQCAtMTA1LDYgKzExNiw3IEBACiAJfSBjaG9pY2U7CiAJdW5pb24gewogCQlVbmljYXN0QWRkcmVzc19pUEFkZHJlc3MgaVBBZGRyZXNzOworCQlVbmljYXN0QWRkcmVzc19pUDZBZGRyZXNzIGlQNkFkZHJlc3M7CiAJfTsKIH0gVW5pY2FzdEFkZHJlc3M7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWI2YjgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19JUkNfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX0lSQ19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgSVJDX1BPUlQJNjY2NworCitleHRlcm4gdW5zaWduZWQgaW50ICgqbmZfbmF0X2lyY19ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19JUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwNDllYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmgKQEAgLTAsMCArMSwzMjEgQEAKKy8qIFBQVFAgY29uc3RhbnRzIGFuZCBzdHJ1Y3RzICovCisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfUFBUUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfUFBUUF9ICisKKy8qIHN0YXRlIG9mIHRoZSBjb250cm9sIHNlc3Npb24gKi8KK2VudW0gcHB0cF9jdHJsc2Vzc19zdGF0ZSB7CisJUFBUUF9TRVNTSU9OX05PTkUsCQkJLyogbm8gc2Vzc2lvbiBwcmVzZW50ICovCisJUFBUUF9TRVNTSU9OX0VSUk9SLAkJCS8qIHNvbWUgc2Vzc2lvbiBlcnJvciAqLworCVBQVFBfU0VTU0lPTl9TVE9QUkVRLAkJCS8qIHN0b3Bfc2VzcyByZXF1ZXN0IHNlZW4gKi8KKwlQUFRQX1NFU1NJT05fUkVRVUVTVEVELAkJCS8qIHN0YXJ0X3Nlc3MgcmVxdWVzdCBzZWVuICovCisJUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCwJCQkvKiBzZXNzaW9uIGVzdGFibGlzaGVkICovCit9OworCisvKiBzdGF0ZSBvZiB0aGUgY2FsbCBpbnNpZGUgdGhlIGNvbnRyb2wgc2Vzc2lvbiAqLworZW51bSBwcHRwX2N0cmxjYWxsX3N0YXRlIHsKKwlQUFRQX0NBTExfTk9ORSwKKwlQUFRQX0NBTExfRVJST1IsCisJUFBUUF9DQUxMX09VVF9SRVEsCisJUFBUUF9DQUxMX09VVF9DT05GLAorCVBQVFBfQ0FMTF9JTl9SRVEsCisJUFBUUF9DQUxMX0lOX1JFUCwKKwlQUFRQX0NBTExfSU5fQ09ORiwKKwlQUFRQX0NBTExfQ0xFQVJfUkVRLAorfTsKKworLyogY29ubnRyYWNrIHByaXZhdGUgZGF0YSAqLworc3RydWN0IG5mX2N0X3BwdHBfbWFzdGVyIHsKKwllbnVtIHBwdHBfY3RybHNlc3Nfc3RhdGUgc3N0YXRlOwkvKiBzZXNzaW9uIHN0YXRlICovCisJZW51bSBwcHRwX2N0cmxjYWxsX3N0YXRlIGNzdGF0ZTsJLyogY2FsbCBzdGF0ZSAqLworCV9fYmUxNiBwYWNfY2FsbF9pZDsJCQkvKiBjYWxsIGlkIG9mIFBBQyAqLworCV9fYmUxNiBwbnNfY2FsbF9pZDsJCQkvKiBjYWxsIGlkIG9mIFBOUyAqLworCisJLyogaW4gcHJlLTIuNi4xMSB0aGlzIHVzZWQgdG8gYmUgcGVyLWV4cGVjdC4gTm93IGl0IGlzIHBlci1jb25udHJhY2sKKwkgKiBhbmQgdGhlcmVmb3JlIGltcG9zZXMgYSBmaXhlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG1hcHMgKi8KKwlzdHJ1Y3QgbmZfY3RfZ3JlX2tleW1hcCAqa2V5bWFwW0lQX0NUX0RJUl9NQVhdOworfTsKKworc3RydWN0IG5mX25hdF9wcHRwIHsKKwlfX2JlMTYgcG5zX2NhbGxfaWQ7CQkJLyogTkFUJ2VkIFBOUyBjYWxsIGlkICovCisJX19iZTE2IHBhY19jYWxsX2lkOwkJCS8qIE5BVCdlZCBQQUMgY2FsbCBpZCAqLworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBQUFRQX0NPTlRST0xfUE9SVAkxNzIzCisKKyNkZWZpbmUgUFBUUF9QQUNLRVRfQ09OVFJPTAkxCisjZGVmaW5lIFBQVFBfUEFDS0VUX01HTVQJMgorCisjZGVmaW5lIFBQVFBfTUFHSUNfQ09PS0lFCTB4MWEyYjNjNGQKKworc3RydWN0IHBwdHBfcGt0X2hkciB7CisJX191MTYJcGFja2V0TGVuZ3RoOworCV9fYmUxNglwYWNrZXRUeXBlOworCV9fYmUzMgltYWdpY0Nvb2tpZTsKK307CisKKy8qIFBwdHBDb250cm9sTWVzc2FnZVR5cGUgdmFsdWVzICovCisjZGVmaW5lIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVFVRVNUCTEKKyNkZWZpbmUgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUExZCTIKKyNkZWZpbmUgUFBUUF9TVE9QX1NFU1NJT05fUkVRVUVTVAkzCisjZGVmaW5lIFBQVFBfU1RPUF9TRVNTSU9OX1JFUExZCQk0CisjZGVmaW5lIFBQVFBfRUNIT19SRVFVRVNUCQk1CisjZGVmaW5lIFBQVFBfRUNIT19SRVBMWQkJCTYKKyNkZWZpbmUgUFBUUF9PVVRfQ0FMTF9SRVFVRVNUCQk3CisjZGVmaW5lIFBQVFBfT1VUX0NBTExfUkVQTFkJCTgKKyNkZWZpbmUgUFBUUF9JTl9DQUxMX1JFUVVFU1QJCTkKKyNkZWZpbmUgUFBUUF9JTl9DQUxMX1JFUExZCQkxMAorI2RlZmluZSBQUFRQX0lOX0NBTExfQ09OTkVDVAkJMTEKKyNkZWZpbmUgUFBUUF9DQUxMX0NMRUFSX1JFUVVFU1QJCTEyCisjZGVmaW5lIFBQVFBfQ0FMTF9ESVNDT05ORUNUX05PVElGWQkxMworI2RlZmluZSBQUFRQX1dBTl9FUlJPUl9OT1RJRlkJCTE0CisjZGVmaW5lIFBQVFBfU0VUX0xJTktfSU5GTwkJMTUKKworI2RlZmluZSBQUFRQX01TR19NQVgJCQkxNQorCisvKiBQcHRwR2VuZXJhbEVycm9yIHZhbHVlcyAqLworI2RlZmluZSBQUFRQX0VSUk9SX0NPREVfTk9ORQkJMAorI2RlZmluZSBQUFRQX05PVF9DT05ORUNURUQJCTEKKyNkZWZpbmUgUFBUUF9CQURfRk9STUFUCQkJMgorI2RlZmluZSBQUFRQX0JBRF9WQUxVRQkJCTMKKyNkZWZpbmUgUFBUUF9OT19SRVNPVVJDRQkJNAorI2RlZmluZSBQUFRQX0JBRF9DQUxMSUQJCQk1CisjZGVmaW5lIFBQVFBfUkVNT1ZFX0RFVklDRV9FUlJPUgk2CisKK3N0cnVjdCBQcHRwQ29udHJvbEhlYWRlciB7CisJX19iZTE2CW1lc3NhZ2VUeXBlOworCV9fdTE2CXJlc2VydmVkOworfTsKKworLyogRnJhbWluZ0NhcGFiaWxpdHkgQml0bWFwIFZhbHVlcyAqLworI2RlZmluZSBQUFRQX0ZSQU1FX0NBUF9BU1lOQwkJMHgxCisjZGVmaW5lIFBQVFBfRlJBTUVfQ0FQX1NZTkMJCTB4MgorCisvKiBCZWFyZXJDYXBhYmlsaXR5IEJpdG1hcCBWYWx1ZXMgKi8KKyNkZWZpbmUgUFBUUF9CRUFSRVJfQ0FQX0FOQUxPRwkJMHgxCisjZGVmaW5lIFBQVFBfQkVBUkVSX0NBUF9ESUdJVEFMCQkweDIKKworc3RydWN0IFBwdHBTdGFydFNlc3Npb25SZXF1ZXN0IHsKKwlfX2JlMTYJcHJvdG9jb2xWZXJzaW9uOworCV9fdTE2CXJlc2VydmVkMTsKKwlfX2JlMzIJZnJhbWluZ0NhcGFiaWxpdHk7CisJX19iZTMyCWJlYXJlckNhcGFiaWxpdHk7CisJX19iZTE2CW1heENoYW5uZWxzOworCV9fYmUxNglmaXJtd2FyZVJldmlzaW9uOworCV9fdTgJaG9zdE5hbWVbNjRdOworCV9fdTgJdmVuZG9yU3RyaW5nWzY0XTsKK307CisKKy8qIFBwdHBTdGFydFNlc3Npb25SZXN1bHRDb2RlIFZhbHVlcyAqLworI2RlZmluZSBQUFRQX1NUQVJUX09LCQkJMQorI2RlZmluZSBQUFRQX1NUQVJUX0dFTkVSQUxfRVJST1IJMgorI2RlZmluZSBQUFRQX1NUQVJUX0FMUkVBRFlfQ09OTkVDVEVECTMKKyNkZWZpbmUgUFBUUF9TVEFSVF9OT1RfQVVUSE9SSVpFRAk0CisjZGVmaW5lIFBQVFBfU1RBUlRfVU5LTk9XTl9QUk9UT0NPTAk1CisKK3N0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVwbHkgeworCV9fYmUxNglwcm90b2NvbFZlcnNpb247CisJX191OAlyZXN1bHRDb2RlOworCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKKwlfX2JlMzIJZnJhbWluZ0NhcGFiaWxpdHk7CisJX19iZTMyCWJlYXJlckNhcGFiaWxpdHk7CisJX19iZTE2CW1heENoYW5uZWxzOworCV9fYmUxNglmaXJtd2FyZVJldmlzaW9uOworCV9fdTgJaG9zdE5hbWVbNjRdOworCV9fdTgJdmVuZG9yU3RyaW5nWzY0XTsKK307CisKKy8qIFBwdHBTdG9wUmVhc29ucyAqLworI2RlZmluZSBQUFRQX1NUT1BfTk9ORQkJCTEKKyNkZWZpbmUgUFBUUF9TVE9QX1BST1RPQ09MCQkyCisjZGVmaW5lIFBQVFBfU1RPUF9MT0NBTF9TSFVURE9XTgkzCisKK3N0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXF1ZXN0IHsKKwlfX3U4CXJlYXNvbjsKKwlfX3U4CXJlc2VydmVkMTsKKwlfX3UxNglyZXNlcnZlZDI7Cit9OworCisvKiBQcHRwU3RvcFNlc3Npb25SZXN1bHRDb2RlICovCisjZGVmaW5lIFBQVFBfU1RPUF9PSwkJCTEKKyNkZWZpbmUgUFBUUF9TVE9QX0dFTkVSQUxfRVJST1IJCTIKKworc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcGx5IHsKKwlfX3U4CXJlc3VsdENvZGU7CisJX191OAlnZW5lcmFsRXJyb3JDb2RlOworCV9fdTE2CXJlc2VydmVkMTsKK307CisKK3N0cnVjdCBQcHRwRWNob1JlcXVlc3QgeworCV9fYmUzMiBpZGVudE51bWJlcjsKK307CisKKy8qIFBwdHBFY2hvUmVwbHlSZXN1bHRDb2RlICovCisjZGVmaW5lIFBQVFBfRUNIT19PSwkJCTEKKyNkZWZpbmUgUFBUUF9FQ0hPX0dFTkVSQUxfRVJST1IJCTIKKworc3RydWN0IFBwdHBFY2hvUmVwbHkgeworCV9fYmUzMglpZGVudE51bWJlcjsKKwlfX3U4CXJlc3VsdENvZGU7CisJX191OAlnZW5lcmFsRXJyb3JDb2RlOworCV9fdTE2CXJlc2VydmVkOworfTsKKworLyogUHB0cEZyYW1pbmdUeXBlICovCisjZGVmaW5lIFBQVFBfQVNZTkNfRlJBTUlORwkJMQorI2RlZmluZSBQUFRQX1NZTkNfRlJBTUlORwkJMgorI2RlZmluZSBQUFRQX0RPTlRfQ0FSRV9GUkFNSU5HCQkzCisKKy8qIFBwdHBDYWxsQmVhcmVyVHlwZSAqLworI2RlZmluZSBQUFRQX0FOQUxPR19UWVBFCQkxCisjZGVmaW5lIFBQVFBfRElHSVRBTF9UWVBFCQkyCisjZGVmaW5lIFBQVFBfRE9OVF9DQVJFX0JFQVJFUl9UWVBFCTMKKworc3RydWN0IFBwdHBPdXRDYWxsUmVxdWVzdCB7CisJX19iZTE2CWNhbGxJRDsKKwlfX2JlMTYJY2FsbFNlcmlhbE51bWJlcjsKKwlfX2JlMzIJbWluQlBTOworCV9fYmUzMgltYXhCUFM7CisJX19iZTMyCWJlYXJlclR5cGU7CisJX19iZTMyCWZyYW1pbmdUeXBlOworCV9fYmUxNglwYWNrZXRXaW5kb3c7CisJX19iZTE2CXBhY2tldFByb2NEZWxheTsKKwlfX2JlMTYJcGhvbmVOdW1iZXJMZW5ndGg7CisJX191MTYJcmVzZXJ2ZWQxOworCV9fdTgJcGhvbmVOdW1iZXJbNjRdOworCV9fdTgJc3ViQWRkcmVzc1s2NF07Cit9OworCisvKiBQcHRwQ2FsbFJlc3VsdENvZGUgKi8KKyNkZWZpbmUgUFBUUF9PVVRDQUxMX0NPTk5FQ1QJCTEKKyNkZWZpbmUgUFBUUF9PVVRDQUxMX0dFTkVSQUxfRVJST1IJMgorI2RlZmluZSBQUFRQX09VVENBTExfTk9fQ0FSUklFUgkJMworI2RlZmluZSBQUFRQX09VVENBTExfQlVTWQkJNAorI2RlZmluZSBQUFRQX09VVENBTExfTk9fRElBTF9UT05FCTUKKyNkZWZpbmUgUFBUUF9PVVRDQUxMX1RJTUVPVVQJCTYKKyNkZWZpbmUgUFBUUF9PVVRDQUxMX0RPTlRfQUNDRVBUCTcKKworc3RydWN0IFBwdHBPdXRDYWxsUmVwbHkgeworCV9fYmUxNgljYWxsSUQ7CisJX19iZTE2CXBlZXJzQ2FsbElEOworCV9fdTgJcmVzdWx0Q29kZTsKKwlfX3U4CWdlbmVyYWxFcnJvckNvZGU7CisJX19iZTE2CWNhdXNlQ29kZTsKKwlfX2JlMzIJY29ubmVjdFNwZWVkOworCV9fYmUxNglwYWNrZXRXaW5kb3c7CisJX19iZTE2CXBhY2tldFByb2NEZWxheTsKKwlfX2JlMzIJcGh5c0NoYW5uZWxJRDsKK307CisKK3N0cnVjdCBQcHRwSW5DYWxsUmVxdWVzdCB7CisJX19iZTE2CWNhbGxJRDsKKwlfX2JlMTYJY2FsbFNlcmlhbE51bWJlcjsKKwlfX2JlMzIJY2FsbEJlYXJlclR5cGU7CisJX19iZTMyCXBoeXNDaGFubmVsSUQ7CisJX19iZTE2CWRpYWxlZE51bWJlckxlbmd0aDsKKwlfX2JlMTYJZGlhbGluZ051bWJlckxlbmd0aDsKKwlfX3U4CWRpYWxlZE51bWJlcls2NF07CisJX191OAlkaWFsaW5nTnVtYmVyWzY0XTsKKwlfX3U4CXN1YkFkZHJlc3NbNjRdOworfTsKKworLyogUHB0cEluQ2FsbFJlc3VsdENvZGUgKi8KKyNkZWZpbmUgUFBUUF9JTkNBTExfQUNDRVBUCQkxCisjZGVmaW5lIFBQVFBfSU5DQUxMX0dFTkVSQUxfRVJST1IJMgorI2RlZmluZSBQUFRQX0lOQ0FMTF9ET05UX0FDQ0VQVAkJMworCitzdHJ1Y3QgUHB0cEluQ2FsbFJlcGx5IHsKKwlfX2JlMTYJY2FsbElEOworCV9fYmUxNglwZWVyc0NhbGxJRDsKKwlfX3U4CXJlc3VsdENvZGU7CisJX191OAlnZW5lcmFsRXJyb3JDb2RlOworCV9fYmUxNglwYWNrZXRXaW5kb3c7CisJX19iZTE2CXBhY2tldFByb2NEZWxheTsKKwlfX3UxNglyZXNlcnZlZDsKK307CisKK3N0cnVjdCBQcHRwSW5DYWxsQ29ubmVjdGVkIHsKKwlfX2JlMTYJcGVlcnNDYWxsSUQ7CisJX191MTYJcmVzZXJ2ZWQ7CisJX19iZTMyCWNvbm5lY3RTcGVlZDsKKwlfX2JlMTYJcGFja2V0V2luZG93OworCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7CisJX19iZTMyCWNhbGxGcmFtaW5nVHlwZTsKK307CisKK3N0cnVjdCBQcHRwQ2xlYXJDYWxsUmVxdWVzdCB7CisJX19iZTE2CWNhbGxJRDsKKwlfX3UxNglyZXNlcnZlZDsKK307CisKK3N0cnVjdCBQcHRwQ2FsbERpc2Nvbm5lY3ROb3RpZnkgeworCV9fYmUxNgljYWxsSUQ7CisJX191OAlyZXN1bHRDb2RlOworCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKKwlfX2JlMTYJY2F1c2VDb2RlOworCV9fdTE2CXJlc2VydmVkOworCV9fdTgJY2FsbFN0YXRpc3RpY3NbMTI4XTsKK307CisKK3N0cnVjdCBQcHRwV2FuRXJyb3JOb3RpZnkgeworCV9fYmUxNglwZWVyc0NhbGxJRDsKKwlfX3UxNglyZXNlcnZlZDsKKwlfX2JlMzIJY3JjRXJyb3JzOworCV9fYmUzMglmcmFtaW5nRXJyb3JzOworCV9fYmUzMgloYXJkd2FyZU92ZXJSdW5zOworCV9fYmUzMglidWZmZXJPdmVyUnVuczsKKwlfX2JlMzIJdGltZW91dEVycm9yczsKKwlfX2JlMzIJYWxpZ25tZW50RXJyb3JzOworfTsKKworc3RydWN0IFBwdHBTZXRMaW5rSW5mbyB7CisJX19iZTE2CXBlZXJzQ2FsbElEOworCV9fdTE2CXJlc2VydmVkOworCV9fYmUzMglzZW5kQWNjbTsKKwlfX2JlMzIJcmVjdkFjY207Cit9OworCit1bmlvbiBwcHRwX2N0cmxfdW5pb24geworCXN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVxdWVzdAlzcmVxOworCXN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVwbHkJc3JlcDsKKwlzdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVxdWVzdAlzdHJlcTsKKwlzdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVwbHkJc3RyZXA7CisJc3RydWN0IFBwdHBPdXRDYWxsUmVxdWVzdAlvY3JlcTsKKwlzdHJ1Y3QgUHB0cE91dENhbGxSZXBseQkJb2NhY2s7CisJc3RydWN0IFBwdHBJbkNhbGxSZXF1ZXN0CWljcmVxOworCXN0cnVjdCBQcHRwSW5DYWxsUmVwbHkJCWljYWNrOworCXN0cnVjdCBQcHRwSW5DYWxsQ29ubmVjdGVkCWljY29uOworCXN0cnVjdCBQcHRwQ2xlYXJDYWxsUmVxdWVzdAljbHJyZXE7CisJc3RydWN0IFBwdHBDYWxsRGlzY29ubmVjdE5vdGlmeSBkaXNjOworCXN0cnVjdCBQcHRwV2FuRXJyb3JOb3RpZnkJd2FuZXJyOworCXN0cnVjdCBQcHRwU2V0TGlua0luZm8JCXNldGxpbms7Cit9OworCisvKiBjcmFwIG5lZWRlZCBmb3IgbmZfY29ubnRyYWNrX2NvbXBhdC5oICovCitzdHJ1Y3QgbmZfY29ubjsKK3N0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0OworZW51bSBpcF9jb25udHJhY2tfaW5mbzsKKworZXh0ZXJuIGludAorKCpuZl9uYXRfcHB0cF9ob29rX291dGJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJCSAgICAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKTsKKworZXh0ZXJuIGludAorKCpuZl9uYXRfcHB0cF9ob29rX2luYm91bmQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJCSAgICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpOworCitleHRlcm4gdm9pZAorKCpuZl9uYXRfcHB0cF9ob29rX2V4cF9ncmUpKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHBfb3JpZywKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwX3JlcGx5KTsKKworZXh0ZXJuIHZvaWQKKygqbmZfbmF0X3BwdHBfaG9va19leHBlY3Rmbikoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1BQVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNmJiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKQEAgLTAsMCArMSwxMTIgQEAKKyNpZm5kZWYgX0NPTk5UUkFDS19QUk9UT19HUkVfSAorI2RlZmluZSBfQ09OTlRSQUNLX1BST1RPX0dSRV9ICisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBHUkUgUFJPVE9DT0wgSEVBREVSICovCisKKy8qIEdSRSBWZXJzaW9uIGZpZWxkICovCisjZGVmaW5lIEdSRV9WRVJTSU9OXzE3MDEJMHgwCisjZGVmaW5lIEdSRV9WRVJTSU9OX1BQVFAJMHgxCisKKy8qIEdSRSBQcm90b2NvbCBmaWVsZCAqLworI2RlZmluZSBHUkVfUFJPVE9DT0xfUFBUUAkweDg4MEIKKworLyogR1JFIEZsYWdzICovCisjZGVmaW5lIEdSRV9GTEFHX0MJCTB4ODAKKyNkZWZpbmUgR1JFX0ZMQUdfUgkJMHg0MAorI2RlZmluZSBHUkVfRkxBR19LCQkweDIwCisjZGVmaW5lIEdSRV9GTEFHX1MJCTB4MTAKKyNkZWZpbmUgR1JFX0ZMQUdfQQkJMHg4MAorCisjZGVmaW5lIEdSRV9JU19DKGYpCSgoZikmR1JFX0ZMQUdfQykKKyNkZWZpbmUgR1JFX0lTX1IoZikJKChmKSZHUkVfRkxBR19SKQorI2RlZmluZSBHUkVfSVNfSyhmKQkoKGYpJkdSRV9GTEFHX0spCisjZGVmaW5lIEdSRV9JU19TKGYpCSgoZikmR1JFX0ZMQUdfUykKKyNkZWZpbmUgR1JFX0lTX0EoZikJKChmKSZHUkVfRkxBR19BKQorCisvKiBHUkUgaXMgYSBtZXNzOiBGb3VyIGRpZmZlcmVudCBzdGFuZGFyZHMgKi8KK3N0cnVjdCBncmVfaGRyIHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNglyZWM6MywKKwkJc3JyOjEsCisJCXNlcToxLAorCQlrZXk6MSwKKwkJcm91dGluZzoxLAorCQljc3VtOjEsCisJCXZlcnNpb246MywKKwkJcmVzZXJ2ZWQ6NCwKKwkJYWNrOjE7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNgljc3VtOjEsCisJCXJvdXRpbmc6MSwKKwkJa2V5OjEsCisJCXNlcToxLAorCQlzcnI6MSwKKwkJcmVjOjMsCisJCWFjazoxLAorCQlyZXNlcnZlZDo0LAorCQl2ZXJzaW9uOjM7CisjZWxzZQorI2Vycm9yICJBZGp1c3QgeW91ciA8YXNtL2J5dGVvcmRlci5oPiBkZWZpbmVzIgorI2VuZGlmCisJX19iZTE2CXByb3RvY29sOworfTsKKworLyogbW9kaWZpZWQgR1JFIGhlYWRlciBmb3IgUFBUUCAqLworc3RydWN0IGdyZV9oZHJfcHB0cCB7CisJX191OCAgIGZsYWdzOwkJLyogYml0ZmllbGQgKi8KKwlfX3U4ICAgdmVyc2lvbjsJCS8qIHNob3VsZCBiZSBHUkVfVkVSU0lPTl9QUFRQICovCisJX19iZTE2IHByb3RvY29sOwkvKiBzaG91bGQgYmUgR1JFX1BST1RPQ09MX1BQVFAgKi8KKwlfX2JlMTYgcGF5bG9hZF9sZW47CS8qIHNpemUgb2YgcHBwIHBheWxvYWQsIG5vdCBpbmMuIGdyZSBoZWFkZXIgKi8KKwlfX2JlMTYgY2FsbF9pZDsJCS8qIHBlZXIncyBjYWxsX2lkIGZvciB0aGlzIHNlc3Npb24gKi8KKwlfX2JlMzIgc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyLiAgUHJlc2VudCBpZiBTPT0xICovCisJX19iZTMyIGFjazsJCS8qIHNlcSBudW1iZXIgb2YgaGlnaGVzdCBwYWNrZXQgcmVjaWV2ZWQgYnkgKi8KKwkJCQkvKiAgc2VuZGVyIGluIHRoaXMgc2Vzc2lvbiAqLworfTsKKworc3RydWN0IG5mX2N0X2dyZSB7CisJdW5zaWduZWQgaW50IHN0cmVhbV90aW1lb3V0OworCXVuc2lnbmVkIGludCB0aW1lb3V0OworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgorCitzdHJ1Y3QgbmZfY29ubjsKKworLyogc3RydWN0dXJlIGZvciBvcmlnaW5hbCA8LT4gcmVwbHkga2V5bWFwICovCitzdHJ1Y3QgbmZfY3RfZ3JlX2tleW1hcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7Cit9OworCisvKiBhZGQgbmV3IHR1cGxlLT5rZXlfcmVwbHkgcGFpciB0byBrZXltYXAgKi8KK2ludCBuZl9jdF9ncmVfa2V5bWFwX2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsCisJCQkgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CisKKy8qIGRlbGV0ZSBrZXltYXAgZW50cmllcyAqLwordm9pZCBuZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IG5mX2Nvbm4gKmN0KTsKKworLyogZ2V0IHBvaW50ZXIgdG8gZ3JlIGtleSwgaWYgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBfX2JlMzIgKmdyZV9rZXkoc3RydWN0IGdyZV9oZHIgKmdyZWgpCit7CisJaWYgKCFncmVoLT5rZXkpCisJCXJldHVybiBOVUxMOworCWlmIChncmVoLT5jc3VtIHx8IGdyZWgtPnJvdXRpbmcpCisJCXJldHVybiAoX19iZTMyICopKGdyZWgrc2l6ZW9mKCpncmVoKSs0KTsKKwlyZXR1cm4gKF9fYmUzMiAqKShncmVoK3NpemVvZigqZ3JlaCkpOworfQorCisvKiBnZXQgcG9pbnRlciBvdCBncmUgY3N1bSwgaWYgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBfX3N1bTE2ICpncmVfY3N1bShzdHJ1Y3QgZ3JlX2hkciAqZ3JlaCkKK3sKKwlpZiAoIWdyZWgtPmNzdW0pCisJCXJldHVybiBOVUxMOworCXJldHVybiAoX19zdW0xNiAqKShncmVoK3NpemVvZigqZ3JlaCkpOworfQorCitleHRlcm4gdm9pZCBuZl9jdF9ncmVfa2V5bWFwX2ZsdXNoKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZfbmF0X25lZWRfZ3JlKHZvaWQpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2N0cC5oCmluZGV4IGI4OTk0ZDkuLjVjZjJjMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaApAQCAtMjAsNyArMjAsNyBAQAogewogCWVudW0gc2N0cF9jb25udHJhY2sgc3RhdGU7CiAKLQl1X2ludDMyX3QgdnRhZ1tJUF9DVF9ESVJfTUFYXTsKKwlfX2JlMzIgdnRhZ1tJUF9DVF9ESVJfTUFYXTsKIAl1X2ludDMyX3QgdHRhZ1tJUF9DVF9ESVJfTUFYXTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjdmMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX19ORl9DT05OVFJBQ0tfU0lQX0hfXworI2RlZmluZSBfX05GX0NPTk5UUkFDS19TSVBfSF9fCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFNJUF9QT1JUCTUwNjAKKyNkZWZpbmUgU0lQX1RJTUVPVVQJMzYwMAorCitlbnVtIHNpcF9oZWFkZXJfcG9zIHsKKwlQT1NfUkVHX1JFUV9VUkksCisJUE9TX1JFUV9VUkksCisJUE9TX0ZST00sCisJUE9TX1RPLAorCVBPU19WSUEsCisJUE9TX0NPTlRBQ1QsCisJUE9TX0NPTlRFTlQsCisJUE9TX01FRElBLAorCVBPU19PV05FUl9JUDQsCisJUE9TX0NPTk5FQ1RJT05fSVA0LAorCVBPU19PV05FUl9JUDYsCisJUE9TX0NPTk5FQ1RJT05fSVA2LAorCVBPU19TRFBfSEVBREVSLAorfTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCAoKm5mX25hdF9zaXBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0cik7CitleHRlcm4gdW5zaWduZWQgaW50ICgqbmZfbmF0X3NkcF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpkcHRyKTsKKworZXh0ZXJuIGludCBjdF9zaXBfZ2V0X2luZm8oc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBjaGFyICpkcHRyLCBzaXplX3QgZGxlbiwKKwkJCSAgIHVuc2lnbmVkIGludCAqbWF0Y2hvZmYsIHVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCisJCQkgICBlbnVtIHNpcF9oZWFkZXJfcG9zIHBvcyk7CitleHRlcm4gaW50IGN0X3NpcF9sbmxlbihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpsaW1pdCk7CitleHRlcm4gY29uc3QgY2hhciAqY3Rfc2lwX3NlYXJjaChjb25zdCBjaGFyICpuZWVkbGUsIGNvbnN0IGNoYXIgKmhheXN0YWNrLAorCQkJCSBzaXplX3QgbmVlZGxlX2xlbiwgc2l6ZV90IGhheXN0YWNrX2xlbiwKKwkJCQkgaW50IGNhc2Vfc2Vuc2l0aXZlKTsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19ORl9DT05OVFJBQ0tfU0lQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RmdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3OWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1RGVFBfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX1RGVFBfSAorCisjZGVmaW5lIFRGVFBfUE9SVCA2OQorCitzdHJ1Y3QgdGZ0cGhkciB7CisJX19iZTE2IG9wY29kZTsKK307CisKKyNkZWZpbmUgVEZUUF9PUENPREVfUkVBRAkxCisjZGVmaW5lIFRGVFBfT1BDT0RFX1dSSVRFCTIKKyNkZWZpbmUgVEZUUF9PUENPREVfREFUQQkzCisjZGVmaW5lIFRGVFBfT1BDT0RFX0FDSwkJNAorI2RlZmluZSBURlRQX09QQ09ERV9FUlJPUgk1CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgKCpuZl9uYXRfdGZ0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19URlRQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKaW5kZXggNmQ4ZTNlNS4uMWU5YzgyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKQEAgLTc4LDcgKzc4LDcgQEAKIHN0cnVjdCBuZmdlbm1zZyB7CiAJdV9pbnQ4X3QgIG5mZ2VuX2ZhbWlseTsJCS8qIEFGX3h4eCAqLwogCXVfaW50OF90ICB2ZXJzaW9uOwkJLyogbmZuZXRsaW5rIHZlcnNpb24gKi8KLQl1X2ludDE2X3QgcmVzX2lkOwkJLyogcmVzb3VyY2UgaWQgKi8KKwlfX2JlMTYgICAgcmVzX2lkOwkJLyogcmVzb3VyY2UgaWQgKi8KIH07CiAKICNkZWZpbmUgTkZORVRMSU5LX1YwCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaAppbmRleCA4N2I5MmY4Li41OTY2YWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oCkBAIC0xNiwyNCArMTYsMjIgQEAKIH07CiAKIHN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9oZHIgewotCXVfaW50MTZfdAlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCisJX19iZTE2CQlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCiAJdV9pbnQ4X3QJaG9vazsJCS8qIG5ldGZpbHRlciBob29rICovCiAJdV9pbnQ4X3QJX3BhZDsKIH07CiAKIHN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyB7Ci0JdV9pbnQxNl90CWh3X2FkZHJsZW47CisJX19iZTE2CQlod19hZGRybGVuOwogCXVfaW50MTZfdAlfcGFkOwogCXVfaW50OF90CWh3X2FkZHJbOF07CiB9OwogCiBzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfdGltZXN0YW1wIHsKLQlhbGlnbmVkX3U2NAlzZWM7Ci0JYWxpZ25lZF91NjQJdXNlYzsKKwlhbGlnbmVkX2JlNjQJc2VjOworCWFsaWduZWRfYmU2NAl1c2VjOwogfTsKIAotI2RlZmluZSBORlVMTkxfUFJFRklYTEVOCTMwCS8qIGp1c3QgbGlrZSBvbGQgbG9nIHRhcmdldCAqLwotCiBlbnVtIG5mdWxubF9hdHRyX3R5cGUgewogCU5GVUxBX1VOU1BFQywKIAlORlVMQV9QQUNLRVRfSERSLApAQCAtNjcsNyArNjUsNyBAQAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBuZnVsbmxfbXNnX2NvbmZpZ19tb2RlIHsKLQl1X2ludDMyX3QJY29weV9yYW5nZTsKKwlfX2JlMzIJCWNvcHlfcmFuZ2U7CiAJdV9pbnQ4X3QJY29weV9tb2RlOwogCXVfaW50OF90CV9wYWQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKaW5kZXggMzZhZjAzNi4uODNlNzg5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKQEAgLTEzLDIwICsxMywyMCBAQAogfTsKIAogc3RydWN0IG5mcW5sX21zZ19wYWNrZXRfaGRyIHsKLQl1X2ludDMyX3QJcGFja2V0X2lkOwkvKiB1bmlxdWUgSUQgb2YgcGFja2V0IGluIHF1ZXVlICovCi0JdV9pbnQxNl90CWh3X3Byb3RvY29sOwkvKiBodyBwcm90b2NvbCAobmV0d29yayBvcmRlcikgKi8KKwlfX2JlMzIJCXBhY2tldF9pZDsJLyogdW5pcXVlIElEIG9mIHBhY2tldCBpbiBxdWV1ZSAqLworCV9fYmUxNgkJaHdfcHJvdG9jb2w7CS8qIGh3IHByb3RvY29sIChuZXR3b3JrIG9yZGVyKSAqLwogCXVfaW50OF90CWhvb2s7CQkvKiBuZXRmaWx0ZXIgaG9vayAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBuZnFubF9tc2dfcGFja2V0X2h3IHsKLQl1X2ludDE2X3QJaHdfYWRkcmxlbjsKKwlfX2JlMTYJCWh3X2FkZHJsZW47CiAJdV9pbnQxNl90CV9wYWQ7CiAJdV9pbnQ4X3QJaHdfYWRkcls4XTsKIH07CiAKIHN0cnVjdCBuZnFubF9tc2dfcGFja2V0X3RpbWVzdGFtcCB7Ci0JYWxpZ25lZF91NjQJc2VjOwotCWFsaWduZWRfdTY0CXVzZWM7CisJYWxpZ25lZF9iZTY0CXNlYzsKKwlhbGlnbmVkX2JlNjQJdXNlYzsKIH07CiAKIGVudW0gbmZxbmxfYXR0cl90eXBlIHsKQEAgLTQ3LDggKzQ3LDggQEAKICNkZWZpbmUgTkZRQV9NQVggKF9fTkZRQV9NQVggLSAxKQogCiBzdHJ1Y3QgbmZxbmxfbXNnX3ZlcmRpY3RfaGRyIHsKLQl1X2ludDMyX3QgdmVyZGljdDsKLQl1X2ludDMyX3QgaWQ7CisJX19iZTMyIHZlcmRpY3Q7CisJX19iZTMyIGlkOwogfTsKIAogCkBAIC02Myw3ICs2Myw3IEBACiBzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19jbWQgewogCXVfaW50OF90CWNvbW1hbmQ7CS8qIG5mcW5sX21zZ19jb25maWdfY21kcyAqLwogCXVfaW50OF90CV9wYWQ7Ci0JdV9pbnQxNl90CXBmOwkJLyogQUZfeHh4IGZvciBQRl9bVU5dQklORCAqLworCV9fYmUxNgkJcGY7CQkvKiBBRl94eHggZm9yIFBGX1tVTl1CSU5EICovCiB9OwogCiBlbnVtIG5mcW5sX2NvbmZpZ19tb2RlIHsKQEAgLTczLDcgKzczLDcgQEAKIH07CiAKIHN0cnVjdCBuZnFubF9tc2dfY29uZmlnX3BhcmFtcyB7Ci0JdV9pbnQzMl90CWNvcHlfcmFuZ2U7CisJX19iZTMyCQljb3B5X3JhbmdlOwogCXVfaW50OF90CWNvcHlfbW9kZTsJLyogZW51bSBuZnFubF9jb25maWdfbW9kZSAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKQEAgLTgyLDYgKzgyLDcgQEAKIAlORlFBX0NGR19VTlNQRUMsCiAJTkZRQV9DRkdfQ01ELAkJCS8qIG5mcW5sX21zZ19jb25maWdfY21kICovCiAJTkZRQV9DRkdfUEFSQU1TLAkJLyogbmZxbmxfbXNnX2NvbmZpZ19wYXJhbXMgKi8KKwlORlFBX0NGR19RVUVVRV9NQVhMRU4sCQkvKiB1X2ludDMyX3QgKi8KIAlfX05GUUFfQ0ZHX01BWAogfTsKICNkZWZpbmUgTkZRQV9DRkdfTUFYIChfX05GUUFfQ0ZHX01BWC0xKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTkZMT0cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZDBlZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfWFRfTkZMT0dfVEFSR0VUCisjZGVmaW5lIF9YVF9ORkxPR19UQVJHRVQKKworI2RlZmluZSBYVF9ORkxPR19ERUZBVUxUX0dST1VQCQkweDEKKyNkZWZpbmUgWFRfTkZMT0dfREVGQVVMVF9USFJFU0hPTEQJMQorCisjZGVmaW5lIFhUX05GTE9HX01BU0sJCQkweDAKKworc3RydWN0IHh0X25mbG9nX2luZm8geworCXVfaW50MzJfdAlsZW47CisJdV9pbnQxNl90CWdyb3VwOworCXVfaW50MTZfdAl0aHJlc2hvbGQ7CisJdV9pbnQxNl90CWZsYWdzOworCXVfaW50MTZfdAlwYWQ7CisJY2hhcgkJcHJlZml4WzY0XTsKK307CisKKyNlbmRpZiAvKiBfWFRfTkZMT0dfVEFSR0VUICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCmluZGV4IDRjMmQ5OTQuLjcwYjZmNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCkBAIC0yOSwxNCArMjksMTQgQEAKIHN0cnVjdCBpcF9jb25udHJhY2tfb2xkX3R1cGxlCiB7CiAJc3RydWN0IHsKLQkJX191MzIgaXA7CisJCV9fYmUzMiBpcDsKIAkJdW5pb24gewogCQkJX191MTYgYWxsOwogCQl9IHU7CiAJfSBzcmM7CiAKIAlzdHJ1Y3QgewotCQlfX3UzMiBpcDsKKwkJX19iZTMyIGlwOwogCQl1bmlvbiB7CiAJCQlfX3UxNiBhbGw7CiAJCX0gdTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1NTZiOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX1hUX0hBU0hMSU1JVF9ICisjZGVmaW5lIF9YVF9IQVNITElNSVRfSAorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIFhUX0hBU0hMSU1JVF9TQ0FMRSAxMDAwMAorLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCisgICBzZWNvbmRzLCBvciBvbmUgZXZlcnkgNTkgaG91cnMuICovCisKKy8qIGRldGFpbHMgb2YgdGhpcyBzdHJ1Y3R1cmUgaGlkZGVuIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiAqLworc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGU7CisKKyNkZWZpbmUgWFRfSEFTSExJTUlUX0hBU0hfRElQCTB4MDAwMQorI2RlZmluZSBYVF9IQVNITElNSVRfSEFTSF9EUFQJMHgwMDAyCisjZGVmaW5lIFhUX0hBU0hMSU1JVF9IQVNIX1NJUAkweDAwMDQKKyNkZWZpbmUgWFRfSEFTSExJTUlUX0hBU0hfU1BUCTB4MDAwOAorCitzdHJ1Y3QgaGFzaGxpbWl0X2NmZyB7CisJdV9pbnQzMl90IG1vZGU7CSAgLyogYml0bWFzayBvZiBJUFRfSEFTSExJTUlUX0hBU0hfKiAqLworCXVfaW50MzJfdCBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLworCXVfaW50MzJfdCBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKworCS8qIHVzZXIgc3BlY2lmaWVkICovCisJdV9pbnQzMl90IHNpemU7CQkvKiBob3cgbWFueSBidWNrZXRzICovCisJdV9pbnQzMl90IG1heDsJCS8qIG1heCBudW1iZXIgb2YgZW50cmllcyAqLworCXVfaW50MzJfdCBnY19pbnRlcnZhbDsJLyogZ2MgaW50ZXJ2YWwgKi8KKwl1X2ludDMyX3QgZXhwaXJlOwkvKiB3aGVuIGRvIGVudHJpZXMgZXhwaXJlPyAqLworfTsKKworc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvIHsKKwljaGFyIG5hbWUgW0lGTkFNU0laXTsJCS8qIG5hbWUgKi8KKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZyBjZmc7CisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwl1bmlvbiB7CisJCXZvaWQgKnB0cjsKKwkJc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICptYXN0ZXI7CisJfSB1OworfTsKKyNlbmRpZiAvKl9YVF9IQVNITElNSVRfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BvbGljeS5oCmluZGV4IGE4MTMyZWMuLjQ1NjU0ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BvbGljeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BvbGljeS5oCkBAIC0zOSw3ICszOSw3IEBACiAJdW5pb24geHRfcG9saWN5X2FkZHIJc21hc2s7CiAJdW5pb24geHRfcG9saWN5X2FkZHIJZGFkZHI7CiAJdW5pb24geHRfcG9saWN5X2FkZHIJZG1hc2s7Ci0JdV9pbnQzMl90CQlzcGk7CisJX19iZTMyCQkJc3BpOwogCXVfaW50MzJfdAkJcmVxaWQ7CiAJdV9pbnQ4X3QJCXByb3RvOwogCXVfaW50OF90CQltb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAppbmRleCA5YTRkZDExLi42YzQ2MTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtNjQsNyArNjQsNyBAQAogCiBzdHJ1Y3QgYnJpZGdlX3NrYl9jYiB7CiAJdW5pb24gewotCQlfX3UzMiBpcHY0OworCQlfX2JlMzIgaXB2NDsKIAl9IGRhZGRyOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oCmluZGV4IGI5ZjcxMmMuLjA3ZjA0NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKQEAgLTI4LDIxICsyOCwyMSBAQAogCXVpbnQ4X3Qgc3NhcDsKIAl1aW50OF90IGN0cmw7CiAJdWludDhfdCBvcmlnWzNdOwotCXVpbnQxNl90IHR5cGU7CisJX19iZTE2IHR5cGU7CiB9OwogCiBzdHJ1Y3QgaGRyX25pIHsKIAl1aW50OF90IGRzYXA7CiAJdWludDhfdCBzc2FwOwotCXVpbnQxNl90IGN0cmw7CisJX19iZTE2IGN0cmw7CiAJdWludDhfdCAgb3JpZ1szXTsKLQl1aW50MTZfdCB0eXBlOworCV9fYmUxNiB0eXBlOwogfTsKIAogc3RydWN0IGVidF84MDJfM19oZHIgewogCXVpbnQ4X3QgIGRhZGRyWzZdOwogCXVpbnQ4X3QgIHNhZGRyWzZdOwotCXVpbnQxNl90IGxlbjsKKwlfX2JlMTYgbGVuOwogCXVuaW9uIHsKIAkJc3RydWN0IGhkcl91aSB1aTsKIAkJc3RydWN0IGhkcl9uaSBuaTsKQEAgLTYxLDcgKzYxLDcgQEAKIHN0cnVjdCBlYnRfODAyXzNfaW5mbyAKIHsKIAl1aW50OF90ICBzYXA7Ci0JdWludDE2X3QgdHlwZTsKKwlfX2JlMTYgdHlwZTsKIAl1aW50OF90ICBiaXRtYXNrOwogCXVpbnQ4X3QgIGludmZsYWdzOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaAppbmRleCAzMDdjMWZlLi43NjU0MDY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2Ftb25nLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oCkBAIC0zMiw3ICszMiw3IEBACiBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZQogewogCXVpbnQzMl90IGNtcFsyXTsKLQl1aW50MzJfdCBpcDsKKwlfX2JlMzIgaXA7CiB9OwogCiBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmgKaW5kZXggNTM3ZWM2Yi4uOTdlNGRiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oCkBAIC0xNCwxMyArMTQsMTMgQEAKIAogc3RydWN0IGVidF9hcnBfaW5mbwogewotCXVpbnQxNl90IGh0eXBlOwotCXVpbnQxNl90IHB0eXBlOwotCXVpbnQxNl90IG9wY29kZTsKLQl1aW50MzJfdCBzYWRkcjsKLQl1aW50MzJfdCBzbXNrOwotCXVpbnQzMl90IGRhZGRyOwotCXVpbnQzMl90IGRtc2s7CisJX19iZTE2IGh0eXBlOworCV9fYmUxNiBwdHlwZTsKKwlfX2JlMTYgb3Bjb2RlOworCV9fYmUzMiBzYWRkcjsKKwlfX2JlMzIgc21zazsKKwlfX2JlMzIgZGFkZHI7CisJX19iZTMyIGRtc2s7CiAJdW5zaWduZWQgY2hhciBzbWFkZHJbRVRIX0FMRU5dOwogCXVuc2lnbmVkIGNoYXIgc21tc2tbRVRIX0FMRU5dOwogCXVuc2lnbmVkIGNoYXIgZG1hZGRyW0VUSF9BTEVOXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaAppbmRleCA3MjQ3Mzg1Li5kNjg0NzQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oCkBAIC0yOCwxMCArMjgsMTAgQEAKIC8qIHRoZSBzYW1lIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhlIGludmZsYWdzICovCiBzdHJ1Y3QgZWJ0X2lwX2luZm8KIHsKLQl1aW50MzJfdCBzYWRkcjsKLQl1aW50MzJfdCBkYWRkcjsKLQl1aW50MzJfdCBzbXNrOwotCXVpbnQzMl90IGRtc2s7CisJX19iZTMyIHNhZGRyOworCV9fYmUzMiBkYWRkcjsKKwlfX2JlMzIgc21zazsKKwlfX2JlMzIgZG1zazsKIAl1aW50OF90ICB0b3M7CiAJdWludDhfdCAgcHJvdG9jb2w7CiAJdWludDhfdCAgYml0bWFzazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oCmluZGV4IDI2ZmQ5MGQuLjQzNWI4ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX05BVF9ICiAjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9OQVRfSAogCisjZGVmaW5lIE5BVF9BUlBfQklUICAoMHgwMDAwMDAxMCkKIHN0cnVjdCBlYnRfbmF0X2luZm8KIHsKIAl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oCmluZGV4IGNiMWZjYzQuLjFkOThiZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oCkBAIC0xMCw3ICsxMCw3IEBACiBzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyB7CiAJdWludDE2X3QgaWQ7CQkvKiBWTEFOIElEIHsxLTQwOTV9ICovCiAJdWludDhfdCBwcmlvOwkJLyogVkxBTiBVc2VyIFByaW9yaXR5IHswLTd9ICovCi0JdWludDE2X3QgZW5jYXA7CQkvKiBWTEFOIEVuY2Fwc3VsYXRlZCBmcmFtZSBjb2RlIHswLTY1NTM1fSAqLworCV9fYmUxNiBlbmNhcDsJCS8qIFZMQU4gRW5jYXBzdWxhdGVkIGZyYW1lIGNvZGUgezAtNjU1MzV9ICovCiAJdWludDhfdCBiaXRtYXNrOwkJLyogQXJncyBiaXRtYXNrIGJpdCAxPTEgLSBJRCBhcmcsCiAJCQkJICAgYml0IDI9MSBVc2VyLVByaW9yaXR5IGFyZywgYml0IDM9MSBlbmNhcCovCiAJdWludDhfdCBpbnZmbGFnczsJCS8qIEludmVyc2UgYml0bWFzayAgYml0IDE9MSAtIGludmVyc2VkIElEIGFyZywgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCmluZGV4IGIxYTdjYzkuLjk0ZTBhN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCkBAIC0yNiw2ICsyNiwxMCBAQAogI2RlZmluZSBFQlRfQ09OVElOVUUgLTMKICNkZWZpbmUgRUJUX1JFVFVSTiAgIC00CiAjZGVmaW5lIE5VTV9TVEFOREFSRF9UQVJHRVRTICAgNAorLyogZWJ0YWJsZXMgdGFyZ2V0IG1vZHVsZXMgc3RvcmUgdGhlIHZlcmRpY3QgaW5zaWRlIGFuIGludC4gV2UgY2FuCisgKiByZWNsYWltIGEgcGFydCBvZiB0aGlzIGludCBmb3IgYmFja3dhcmRzIGNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKyAqIFRoZSA0IGxzYiBhcmUgbW9yZSB0aGFuIGVub3VnaCB0byBzdG9yZSB0aGUgdmVyZGljdC4gKi8KKyNkZWZpbmUgRUJUX1ZFUkRJQ1RfQklUUyAweDAwMDAwMDBGCiAKIHN0cnVjdCBlYnRfY291bnRlcgogewpAQCAtNDIsNiArNDYsMjMgQEAKIAkvKiB0b3RhbCBzaXplIG9mIHRoZSBlbnRyaWVzICovCiAJdW5zaWduZWQgaW50IGVudHJpZXNfc2l6ZTsKIAkvKiBzdGFydCBvZiB0aGUgY2hhaW5zICovCisJc3RydWN0IGVidF9lbnRyaWVzIF9fdXNlciAqaG9va19lbnRyeVtORl9CUl9OVU1IT09LU107CisJLyogbnIgb2YgY291bnRlcnMgdXNlcnNwYWNlIGV4cGVjdHMgYmFjayAqLworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJLyogd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHB1dCB0aGUgb2xkIGNvdW50ZXJzICovCisJc3RydWN0IGVidF9jb3VudGVyIF9fdXNlciAqY291bnRlcnM7CisJY2hhciBfX3VzZXIgKmVudHJpZXM7Cit9OworCitzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsCit7CisJY2hhciBuYW1lW0VCVF9UQUJMRV9NQVhOQU1FTEVOXTsKKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisJLyogbnIgb2YgcnVsZXMgaW4gdGhlIHRhYmxlICovCisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCS8qIHRvdGFsIHNpemUgb2YgdGhlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgZW50cmllc19zaXplOworCS8qIHN0YXJ0IG9mIHRoZSBjaGFpbnMgKi8KIAlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmhvb2tfZW50cnlbTkZfQlJfTlVNSE9PS1NdOwogCS8qIG5yIG9mIGNvdW50ZXJzIHVzZXJzcGFjZSBleHBlY3RzIGJhY2sgKi8KIAl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOwpAQCAtMTQxLDcgKzE2Miw3IEBACiAJLyogdGhpcyBuZWVkcyB0byBiZSB0aGUgZmlyc3QgZmllbGQgKi8KIAl1bnNpZ25lZCBpbnQgYml0bWFzazsKIAl1bnNpZ25lZCBpbnQgaW52ZmxhZ3M7Ci0JdWludDE2X3QgZXRocHJvdG87CisJX19iZTE2IGV0aHByb3RvOwogCS8qIHRoZSBwaHlzaWNhbCBpbi1kZXYgKi8KIAljaGFyIGluW0lGTkFNU0laXTsKIAkvKiB0aGUgbG9naWNhbCBpbi1kZXYgKi8KQEAgLTI1MSw3ICsyNzIsNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljaGFyIG5hbWVbRUJUX1RBQkxFX01BWE5BTUVMRU5dOwotCXN0cnVjdCBlYnRfcmVwbGFjZSAqdGFibGU7CisJc3RydWN0IGVidF9yZXBsYWNlX2tlcm5lbCAqdGFibGU7CiAJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOwogCXJ3bG9ja190IGxvY2s7CiAJLyogZS5nLiBjb3VsZCBiZSB0aGUgdGFibGUgZXhwbGljaXRseSBvbmx5IGFsbG93cyBjZXJ0YWluCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0LmgKaW5kZXggNWI2M2EyMy4uNTgyMWViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaApAQCAtNzksNyArNzksNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIGV4dGVybiBpbnQgaXBfcm91dGVfbWVfaGFyZGVyKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgYWRkcl90eXBlKTsKIGV4dGVybiBpbnQgaXBfeGZybV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfaXBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCitleHRlcm4gX19zdW0xNiBuZl9pcF9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKIAkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgdV9pbnQ4X3QgcHJvdG9jb2wpOwogI2VuZGlmIC8qX19LRVJORUxfXyovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKaW5kZXggNTkxYzFhOC4uMTgwMzM3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKQEAgLTEsNiArMSw0IEBACiBoZWFkZXIteSArPSBpcF9jb25udHJhY2tfaGVscGVyLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM190eXBlcy5oCiBoZWFkZXIteSArPSBpcF9jb25udHJhY2tfcHJvdG9jb2wuaAogaGVhZGVyLXkgKz0gaXBfY29ubnRyYWNrX3NjdHAuaAogaGVhZGVyLXkgKz0gaXBfY29ubnRyYWNrX3RjcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAppbmRleCA2NGU4NjgwLi4zMzU4MWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaWNtcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b19ncmUuaD4KQEAgLTI3Nyw3ICsyNzgsNyBAQAogX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwogCiBleHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgotaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKK2lwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwogCiBleHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKIF9faXBfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19mdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oCmluZGV4IDYzODExOTMuLjIxMjlmYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oCkBAIC0xLDYgKzEsNDQgQEAKICNpZm5kZWYgX0lQX0NPTk5UUkFDS19GVFBfSAogI2RlZmluZSBfSVBfQ09OTlRSQUNLX0ZUUF9ICisvKiBGVFAgdHJhY2tpbmcuICovCiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oPgorLyogVGhpcyBlbnVtIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlICovCitlbnVtIGlwX2N0X2Z0cF90eXBlCit7CisJLyogUE9SVCBjb21tYW5kIGZyb20gY2xpZW50ICovCisJSVBfQ1RfRlRQX1BPUlQsCisJLyogUEFTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLworCUlQX0NUX0ZUUF9QQVNWLAorCS8qIEVQUlQgY29tbWFuZCBmcm9tIGNsaWVudCAqLworCUlQX0NUX0ZUUF9FUFJULAorCS8qIEVQU1YgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KKwlJUF9DVF9GVFBfRVBTViwKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgRlRQX1BPUlQJMjEKKworI2RlZmluZSBOVU1fU0VRX1RPX1JFTUVNQkVSIDIKKy8qIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IG9uY2UgcGVyIG1hc3RlciAqLworc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgeworCS8qIFZhbGlkIHNlcSBwb3NpdGlvbnMgZm9yIGNtZCBtYXRjaGluZyBhZnRlciBuZXdsaW5lICovCisJdV9pbnQzMl90IHNlcV9hZnRfbmxbSVBfQ1RfRElSX01BWF1bTlVNX1NFUV9UT19SRU1FTUJFUl07CisJLyogMCBtZWFucyBzZXFfbWF0Y2hfYWZ0X25sIG5vdCBzZXQgKi8KKwlpbnQgc2VxX2FmdF9ubF9udW1bSVBfQ1RfRElSX01BWF07Cit9OworCitzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdDsKKworLyogRm9yIE5BVCB0byBob29rIGluIHdoZW4gd2UgZmluZCBhIHBhY2tldCB3aGljaCBkZXNjcmliZXMgd2hhdCBvdGhlcgorICogY29ubmVjdGlvbiB3ZSBzaG91bGQgZXhwZWN0LiAqLworZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF9mdHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICAgZW51bSBpcF9jdF9mdHBfdHlwZSB0eXBlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKKwkJCQkgICAgICAgdTMyICpzZXEpOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfRlRQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaAppbmRleCA5NDNjYzZhLi4xOGY3Njk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oMzIzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5oPgogCiAjZGVmaW5lIFJBU19QT1JUIDE3MTkKICNkZWZpbmUgUTkzMV9QT1JUIDE3MjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKaW5kZXggMWQ4NTNhYS4uZTM3MWUwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKQEAgLTEwMiwxMSArMTAyLDExIEBACiB9CiAKIC8qIGdldCBwb2ludGVyIG90IGdyZSBjc3VtLCBpZiBwcmVzZW50ICovCi1zdGF0aWMgaW5saW5lIHVfaW50MTZfdCAqZ3JlX2NzdW0oc3RydWN0IGdyZV9oZHIgKmdyZWgpCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgKmdyZV9jc3VtKHN0cnVjdCBncmVfaGRyICpncmVoKQogewogCWlmICghZ3JlaC0+Y3N1bSkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICh1X2ludDE2X3QgKikgKGdyZWgrc2l6ZW9mKCpncmVoKSk7CisJcmV0dXJuIChfX3N1bTE2ICopIChncmVoK3NpemVvZigqZ3JlaCkpOwogfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaAppbmRleCA5MTNkYWQ2Li5iZWY2YzY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaApAQCAtNSwyMyArNSwxOCBAQAogI2RlZmluZSBTSVBfUE9SVAk1MDYwCiAjZGVmaW5lIFNJUF9USU1FT1VUCTM2MDAKIAotI2RlZmluZSBQT1NfVklBCQkwCi0jZGVmaW5lIFBPU19DT05UQUNUCTEKLSNkZWZpbmUgUE9TX0NPTlRFTlQJMgotI2RlZmluZSBQT1NfTUVESUEJMwotI2RlZmluZSBQT1NfT1dORVIJNAotI2RlZmluZSBQT1NfQ09OTkVDVElPTgk1Ci0jZGVmaW5lIFBPU19SRVFfSEVBREVSCTYKLSNkZWZpbmUgUE9TX1NEUF9IRUFERVIJNwotCi1zdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gewotCWNvbnN0IGNoYXIJKmxuYW1lOwotCWNvbnN0IGNoYXIJKnNuYW1lOwotCWNvbnN0IGNoYXIJKmxuX3N0cjsKLQlzaXplX3QJCWxubGVuOwotCXNpemVfdAkJc25sZW47Ci0Jc2l6ZV90CQlsbl9zdHJsZW47Ci0JaW50CQkoKm1hdGNoX2xlbikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqKTsKK2VudW0gc2lwX2hlYWRlcl9wb3MgeworCVBPU19SRUdfUkVRX1VSSSwKKwlQT1NfUkVRX1VSSSwKKwlQT1NfRlJPTSwKKwlQT1NfVE8sCisJUE9TX1ZJQSwKKwlQT1NfQ09OVEFDVCwKKwlQT1NfQ09OVEVOVCwKKwlQT1NfTUVESUEsCisJUE9TX09XTkVSLAorCVBPU19DT05ORUNUSU9OLAorCVBPU19TRFBfSEVBREVSLAogfTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF9zaXBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLApAQCAtMzYsOSArMzEsMTAgQEAKIGV4dGVybiBpbnQgY3Rfc2lwX2dldF9pbmZvKGNvbnN0IGNoYXIgKmRwdHIsIHNpemVfdCBkbGVuLAogCQkJICAgdW5zaWduZWQgaW50ICptYXRjaG9mZiwKIAkJCSAgIHVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCi0JCQkgICBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gKmhuZm8pOworCQkJICAgZW51bSBzaXBfaGVhZGVyX3BvcyBwb3MpOwogZXh0ZXJuIGludCBjdF9zaXBfbG5sZW4oY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqbGltaXQpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmN0X3NpcF9zZWFyY2goY29uc3QgY2hhciAqbmVlZGxlLCBjb25zdCBjaGFyICpoYXlzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuKTsKKwkJCQkgc2l6ZV90IG5lZWRsZV9sZW4sIHNpemVfdCBoYXlzdGFja19sZW4sCisJCQkJIGludCBjYXNlX3NlbnNpdGl2ZSk7CiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fSVBfQ09OTlRSQUNLX1NJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaAppbmRleCBjZGU5NzI5Li5hNDA0ZmMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190ZnRwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdGZ0cC5oCkBAIC00LDcgKzQsNyBAQAogI2RlZmluZSBURlRQX1BPUlQgNjkKIAogc3RydWN0IHRmdHBoZHIgewotCXVfaW50MTZfdCBvcGNvZGU7CisJX19iZTE2IG9wY29kZTsKIH07CiAKICNkZWZpbmUgVEZUUF9PUENPREVfUkVBRAkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9MT0cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCmluZGV4IDg5MmY5YTMuLjkwZmE2NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCkBAIC02LDcgKzYsNyBAQAogI2RlZmluZSBJUFRfTE9HX1RDUE9QVAkJMHgwMgkvKiBMb2cgVENQIG9wdGlvbnMgKi8KICNkZWZpbmUgSVBUX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLwogI2RlZmluZSBJUFRfTE9HX1VJRAkJMHgwOAkvKiBMb2cgVUlEIG93bmluZyBsb2NhbCBzb2NrZXQgKi8KLSNkZWZpbmUgSVBUX0xPR19ORkxPRwkJMHgxMAkvKiBMb2cgdXNpbmcgbmZfbG9nIGJhY2tlbmQgKi8KKyNkZWZpbmUgSVBUX0xPR19ORkxPRwkJMHgxMAkvKiBVbnN1cHBvcnRlZCwgZG9uJ3QgcmV1c2UgKi8KICNkZWZpbmUgSVBUX0xPR19NQVNLCQkweDFmCiAKIHN0cnVjdCBpcHRfbG9nX2luZm8gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGFzaGxpbWl0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oYXNobGltaXQuaAppbmRleCBhYzJjYjY0Li41NjYyMTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oYXNobGltaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oYXNobGltaXQuaApAQCAtMSw0MCArMSwxNCBAQAogI2lmbmRlZiBfSVBUX0hBU0hMSU1JVF9ICiAjZGVmaW5lIF9JUFRfSEFTSExJTUlUX0gKIAotLyogdGltaW5ncyBhcmUgaW4gbWlsbGlzZWNvbmRzLiAqLwotI2RlZmluZSBJUFRfSEFTSExJTUlUX1NDQUxFIDEwMDAwCi0vKiAxLzEwLDAwMCBzZWMgcGVyaW9kID0+IG1heCBvZiAxMCwwMDAvc2VjLiAgTWluIHJhdGUgaXMgdGhlbiA0Mjk0OTAKLSAgIHNlY29uZHMsIG9yIG9uZSBldmVyeSA1OSBob3Vycy4gKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0Lmg+CiAKLS8qIGRldGFpbHMgb2YgdGhpcyBzdHJ1Y3R1cmUgaGlkZGVuIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlOworI2RlZmluZSBJUFRfSEFTSExJTUlUX1NDQUxFCVhUX0hBU0hMSU1JVF9TQ0FMRQorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfRElQCVhUX0hBU0hMSU1JVF9IQVNIX0RJUAorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfRFBUCVhUX0hBU0hMSU1JVF9IQVNIX0RQVAorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfU0lQCVhUX0hBU0hMSU1JVF9IQVNIX1NJUAorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfU1BUCVhUX0hBU0hMSU1JVF9IQVNIX1NQVAogCi0jZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9ESVAJMHgwMDAxCi0jZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9EUFQJMHgwMDAyCi0jZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9TSVAJMHgwMDA0Ci0jZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9TUFQJMHgwMDA4CisjZGVmaW5lIGlwdF9oYXNobGltaXRfaW5mbyB4dF9oYXNobGltaXRfaW5mbwogCi1zdHJ1Y3QgaGFzaGxpbWl0X2NmZyB7Ci0JdV9pbnQzMl90IG1vZGU7CSAgLyogYml0bWFzayBvZiBJUFRfSEFTSExJTUlUX0hBU0hfKiAqLwotCXVfaW50MzJfdCBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLwotCXVfaW50MzJfdCBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KLQotCS8qIHVzZXIgc3BlY2lmaWVkICovCi0JdV9pbnQzMl90IHNpemU7CQkvKiBob3cgbWFueSBidWNrZXRzICovCi0JdV9pbnQzMl90IG1heDsJCS8qIG1heCBudW1iZXIgb2YgZW50cmllcyAqLwotCXVfaW50MzJfdCBnY19pbnRlcnZhbDsJLyogZ2MgaW50ZXJ2YWwgKi8KLQl1X2ludDMyX3QgZXhwaXJlOwkvKiB3aGVuIGRvIGVudHJpZXMgZXhwaXJlPyAqLwotfTsKLQotc3RydWN0IGlwdF9oYXNobGltaXRfaW5mbyB7Ci0JY2hhciBuYW1lIFtJRk5BTVNJWl07CQkvKiBuYW1lICovCi0Jc3RydWN0IGhhc2hsaW1pdF9jZmcgY2ZnOwotCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm87Ci0KLQkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLwotCXVuaW9uIHsKLQkJdm9pZCAqcHRyOwotCQlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvICptYXN0ZXI7Ci0JfSB1OwotfTsKLSNlbmRpZiAvKl9JUFRfSEFTSExJTUlUX0gqLworI2VuZGlmIC8qIF9JUFRfSEFTSExJTUlUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaAppbmRleCBkOTdlMjY4Li5hYjgxYTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oCkBAIC03NCw3ICs3NCw3IEBACiAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiBleHRlcm4gaW50IGlwNl9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2lwNl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKK2V4dGVybiBfX3N1bTE2IG5mX2lwNl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKIAkJCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIHVfaW50OF90IHByb3RvY29sKTsKIAogZXh0ZXJuIGludCBpcHY2X25ldGZpbHRlcl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oCmluZGV4IDA2MGMxYTEuLjBkMDExOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmgKQEAgLTYsNyArNiw3IEBACiAjZGVmaW5lIElQNlRfTE9HX1RDUE9QVAkJMHgwMgkvKiBMb2cgVENQIG9wdGlvbnMgKi8KICNkZWZpbmUgSVA2VF9MT0dfSVBPUFQJCTB4MDQJLyogTG9nIElQIG9wdGlvbnMgKi8KICNkZWZpbmUgSVA2VF9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLwotI2RlZmluZSBJUDZUX0xPR19ORkxPRwkJMHgxMAkvKiBMb2cgdXNpbmcgbmZfbG9nIGJhY2tlbmQgKi8KKyNkZWZpbmUgSVA2VF9MT0dfTkZMT0cJCTB4MTAJLyogVW5zdXBwb3J0ZWQsIGRvbid0IHVzZSAqLwogI2RlZmluZSBJUDZUX0xPR19NQVNLCQkweDFmCiAKIHN0cnVjdCBpcDZ0X2xvZ19pbmZvIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggNjY0MTE2Mi4uYjNiOWI2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTE0MSw3ICsxNDEsNiBAQAogewogCXN0cnVjdCB1Y3JlZAkJY3JlZHM7CQkvKiBTa2IgY3JlZGVudGlhbHMJKi8KIAlfX3UzMgkJCXBpZDsKLQlfX3UzMgkJCWRzdF9waWQ7CiAJX191MzIJCQlkc3RfZ3JvdXA7CiAJa2VybmVsX2NhcF90CQllZmZfY2FwOwogCV9fdTMyCQkJbG9naW51aWQ7CS8qIExvZ2luIChhdWRpdCkgdWlkICovCkBAIC0xNzQsNiArMTczLDcgQEAKICAqLwogI2RlZmluZSBOTE1TR19HT09ET1JERVIgMAogI2RlZmluZSBOTE1TR19HT09EU0laRSAoU0tCX01BWF9PUkRFUigwLCBOTE1TR19HT09ET1JERVIpKQorI2RlZmluZSBOTE1TR19ERUZBVUxUX1NJWkUgKE5MTVNHX0dPT0RTSVpFIC0gTkxNU0dfSERSTEVOKQogCiAKIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldHBvbGwuaCBiL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oCmluZGV4IDFlZmU2MGMuLjJjYzk4NjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oCkBAIC0xMiwyNiArMTIsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAotc3RydWN0IG5ldHBvbGw7Ci0KIHN0cnVjdCBuZXRwb2xsIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWNoYXIgZGV2X25hbWVbMTZdLCAqbmFtZTsKKwljaGFyIGRldl9uYW1lW0lGTkFNU0laXTsKKwljb25zdCBjaGFyICpuYW1lOwogCXZvaWQgKCpyeF9ob29rKShzdHJ1Y3QgbmV0cG9sbCAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLQl2b2lkICgqZHJvcCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKIAl1MzIgbG9jYWxfaXAsIHJlbW90ZV9pcDsKIAl1MTYgbG9jYWxfcG9ydCwgcmVtb3RlX3BvcnQ7Ci0JdW5zaWduZWQgY2hhciBsb2NhbF9tYWNbNl0sIHJlbW90ZV9tYWNbNl07CisgCXU4IGxvY2FsX21hY1tFVEhfQUxFTl0sIHJlbW90ZV9tYWNbRVRIX0FMRU5dOwogfTsKIAogc3RydWN0IG5ldHBvbGxfaW5mbyB7CisJYXRvbWljX3QgcmVmY250OwogCXNwaW5sb2NrX3QgcG9sbF9sb2NrOwogCWludCBwb2xsX293bmVyOwotCWludCB0cmllczsKIAlpbnQgcnhfZmxhZ3M7CiAJc3BpbmxvY2tfdCByeF9sb2NrOwogCXN0cnVjdCBuZXRwb2xsICpyeF9ucDsgLyogbmV0cG9sbCB0aGF0IHJlZ2lzdGVyZWQgYW4gcnhfaG9vayAqLwogCXN0cnVjdCBza19idWZmX2hlYWQgYXJwX3R4OyAvKiBsaXN0IG9mIGFycCByZXF1ZXN0cyB0byByZXBseSB0byAqLworCXN0cnVjdCBza19idWZmX2hlYWQgdHhxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOwogfTsKIAogdm9pZCBuZXRwb2xsX3BvbGwoc3RydWN0IG5ldHBvbGwgKm5wKTsKQEAgLTQyLDcgKzQzLDcgQEAKIHZvaWQgbmV0cG9sbF9zZXRfdHJhcChpbnQgdHJhcCk7CiB2b2lkIG5ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0cG9sbCAqbnApOwogaW50IF9fbmV0cG9sbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgbmV0cG9sbF9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwogCiAjaWZkZWYgQ09ORklHX05FVFBPTEwKIHN0YXRpYyBpbmxpbmUgaW50IG5ldHBvbGxfcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDQ1MjI4YzEuLjYyNWZmZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtMzE4LDcgKzMxOCw3IEBACiBleHRlcm4gc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKm5mc19maW5kX29wZW5fY29udGV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGludCBtb2RlKTsKIAogLyogbGludXgvbmV0L2lwdjQvaXBjb25maWcuYzogdHJpbXMgaXAgYWRkciBvZmYgZnJvbnQgb2YgbmFtZSwgdG9vLiAqLwotZXh0ZXJuIHUzMiByb290X25mc19wYXJzZV9hZGRyKGNoYXIgKm5hbWUpOyAvKl9faW5pdCovCitleHRlcm4gX19iZTMyIHJvb3RfbmZzX3BhcnNlX2FkZHIoY2hhciAqbmFtZSk7IC8qX19pbml0Ki8KIAogc3RhdGljIGlubGluZSB2b2lkIG5mc19mYXR0cl9pbml0KHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uc3Byb3h5LmggYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAppbmRleCBmNmJhZWNkLi45NzFkMWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaApAQCAtNDUsOCArNDUsMTAgQEAKIHsKIAlzdHJ1Y3QgbnNwcm94eSAqbnMgPSBwLT5uc3Byb3h5OwogCWlmIChucykgewotCQlwdXRfbnNwcm94eShucyk7CisJCXRhc2tfbG9jayhwKTsKIAkJcC0+bnNwcm94eSA9IE5VTEw7CisJCXRhc2tfdW5sb2NrKHApOworCQlwdXRfbnNwcm94eShucyk7CiAJfQogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhdGFfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvcGF0YV9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNWZkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BhdGFfcGxhdGZvcm0uaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fTElOVVhfUEFUQV9QTEFURk9STV9ICisjZGVmaW5lIF9fTElOVVhfUEFUQV9QTEFURk9STV9ICisKK3N0cnVjdCBwYXRhX3BsYXRmb3JtX2luZm8geworCS8qCisJICogSS9PIHBvcnQgc2hpZnQsIGZvciBwbGF0Zm9ybXMgd2l0aCBwb3J0cyB0aGF0IGFyZQorCSAqIGNvbnN0YW50bHkgc3BhY2VkIGFuZCBuZWVkIGxhcmdlciB0aGFuIHRoZSAxLWJ5dGUKKwkgKiBzcGFjaW5nIHVzZWQgYnkgYXRhX3N0ZF9wb3J0cygpLgorCSAqLworCXVuc2lnbmVkIGludCBpb3BvcnRfc2hpZnQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9QQVRBX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDA5YmUwZjguLjAxYzcwNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAvKiBGaWxlIHN0YXRlIGZvciBtbWFwKClzIG9uIC9wcm9jL2J1cy9wY2kvWC9ZICovCkBAIC0xNTksNyArMTYwLDYgQEAKIAl1bnNpZ25lZCBpbnQJdHJhbnNwYXJlbnQ6MTsJLyogVHJhbnNwYXJlbnQgUENJIGJyaWRnZSAqLwogCXVuc2lnbmVkIGludAltdWx0aWZ1bmN0aW9uOjE7LyogUGFydCBvZiBtdWx0aS1mdW5jdGlvbiBkZXZpY2UgKi8KIAkvKiBrZWVwIHRyYWNrIG9mIGRldmljZSBzdGF0ZSAqLwotCXVuc2lnbmVkIGludAlpc19lbmFibGVkOjE7CS8qIHBjaV9lbmFibGVfZGV2aWNlIGhhcyBiZWVuIGNhbGxlZCAqLwogCXVuc2lnbmVkIGludAlpc19idXNtYXN0ZXI6MTsgLyogZGV2aWNlIGlzIGJ1c21hc3RlciAqLwogCXVuc2lnbmVkIGludAlub19tc2k6MTsJLyogZGV2aWNlIG1heSBub3QgdXNlIG1zaSAqLwogCXVuc2lnbmVkIGludAlub19kMWQyOjE7ICAgLyogb25seSBhbGxvdyBkMCBvciBkMyAqLwpAQCAtMTY3LDYgKzE2Nyw3IEBACiAJdW5zaWduZWQgaW50CWJyb2tlbl9wYXJpdHlfc3RhdHVzOjE7CS8qIERldmljZSBnZW5lcmF0ZXMgZmFsc2UgcG9zaXRpdmUgcGFyaXR5ICovCiAJdW5zaWduZWQgaW50IAltc2lfZW5hYmxlZDoxOwogCXVuc2lnbmVkIGludAltc2l4X2VuYWJsZWQ6MTsKKwlhdG9taWNfdAllbmFibGVfY250OwkvKiBwY2lfZW5hYmxlX2RldmljZSBoYXMgYmVlbiBjYWxsZWQgKi8KIAogCXUzMgkJc2F2ZWRfY29uZmlnX3NwYWNlWzE2XTsgLyogY29uZmlnIHNwYWNlIHNhdmVkIGF0IHN1c3BlbmQgdGltZSAqLwogCXN0cnVjdCBobGlzdF9oZWFkIHNhdmVkX2NhcF9zcGFjZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggZmE0ZTFkNy4uYzA5ZGExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTEyMTMsNiArMTIxMywxMCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjEgICAgICAgICAgICAgIDB4MDQ1MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjIgICAgICAgICAgICAgIDB4MDQ1MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjMgICAgICAgICAgICAgIDB4MDQ1MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjQgICAgICAgICAgICAgIDB4MDU0QworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjUgICAgICAgICAgICAgIDB4MDU0RAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjYgICAgICAgICAgICAgIDB4MDU0RQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjcgICAgICAgICAgICAgIDB4MDU0RgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjdfSURFICAgICAgIDB4MDU2MAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU1TCQkweDEwZTAKQEAgLTE4OTMsNiArMTg5Nyw3IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPQURDT00JCTB4MTRlNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUyCTB4MTYwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUyTQkweDE2MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTcwOQkJMHgxNjM5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDAJMHgxNjQ0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDEJMHgxNjQ1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDIJMHgxNjQ2CkBAIC0yMjExLDYgKzIyMTYsMTMgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQJMHgyODE1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF81CTB4MjgzZQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNgkweDI4NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzAJMHgyOTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV8xCTB4MjkxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfMgkweDI5MTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzMJMHgyOTEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV80CTB4MjkxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNQkweDI5MTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzYJMHgyOTMwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQgkweDMzNDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9IQgkweDM1NzUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9DR0MJMHgzNTc3CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggYzMyMTMxNi4uMDY0YjFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtMjkyLDYgKzI5MiwxMiBAQAogI2RlZmluZSBQQ0lfTVNJX0RBVEFfNjQJCTEyCS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgNjQtYml0IGRldmljZXMgKi8KICNkZWZpbmUgUENJX01TSV9NQVNLX0JJVAkxNgkvKiBNYXNrIGJpdHMgcmVnaXN0ZXIgKi8KIAorLyogTVNJLVggcmVnaXN0ZXJzICh0aGVzZSBhcmUgYXQgb2Zmc2V0IFBDSV9NU0lfRkxBR1MpICovCisjZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX1FTSVpFCTB4N0ZGCisjZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0VOQUJMRQkoMSA8PCAxNSkKKyNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklSTUFTSwkoNyA8PCAwKQorI2RlZmluZSBQQ0lfTVNJWF9GTEFHU19CSVRNQVNLCSgxIDw8IDApCisKIC8qIENvbXBhY3RQQ0kgSG90c3dhcCBSZWdpc3RlciAqLwogCiAjZGVmaW5lIFBDSV9DSFNXUF9DU1IJCTIJLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaCBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCmluZGV4IGQ1ZGQ0NzEuLjBmMGI4ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCkBAIC0zMiw3ICszMiw3IEBACiBzdHJ1Y3Qgc2FkYl9zYSB7CiAJdWludDE2X3QJc2FkYl9zYV9sZW47CiAJdWludDE2X3QJc2FkYl9zYV9leHR0eXBlOwotCXVpbnQzMl90CXNhZGJfc2Ffc3BpOworCV9fYmUzMgkJc2FkYl9zYV9zcGk7CiAJdWludDhfdAkJc2FkYl9zYV9yZXBsYXk7CiAJdWludDhfdAkJc2FkYl9zYV9zdGF0ZTsKIAl1aW50OF90CQlzYWRiX3NhX2F1dGg7CkBAIC0yMTEsNyArMjExLDcgQEAKIHN0cnVjdCBzYWRiX3hfbmF0X3RfcG9ydCB7CiAJdWludDE2X3QJc2FkYl94X25hdF90X3BvcnRfbGVuOwogCXVpbnQxNl90CXNhZGJfeF9uYXRfdF9wb3J0X2V4dHR5cGU7Ci0JdWludDE2X3QJc2FkYl94X25hdF90X3BvcnRfcG9ydDsKKwlfX2JlMTYJCXNhZGJfeF9uYXRfdF9wb3J0X3BvcnQ7CiAJdWludDE2X3QJc2FkYl94X25hdF90X3BvcnRfcmVzZXJ2ZWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfbmF0X3RfcG9ydCkgPT0gOCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5LmgKaW5kZXggOTQ0N2E1Ny4uZWRkNGM4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2RlZmluZSBQSFlfQkFTSUNfRkVBVFVSRVMJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBcCiAJCQkJIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCkBAIC00MywxNSArNDcsMjYgQEAKICNkZWZpbmUgUEhZX0hBU19JTlRFUlJVUFQJMHgwMDAwMDAwMQogI2RlZmluZSBQSFlfSEFTX01BR0lDQU5FRwkweDAwMDAwMDAyCiAKKy8qIEludGVyZmFjZSBNb2RlIGRlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0geworCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCisJUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9UQkksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJCit9IHBoeV9pbnRlcmZhY2VfdDsKKwogI2RlZmluZSBNSUlfQlVTX01BWCA0CiAKIAotI2RlZmluZSBQSFlfSU5JVF9USU1FT1VUIDEwMDAwMAorI2RlZmluZSBQSFlfSU5JVF9USU1FT1VUCTEwMDAwMAogI2RlZmluZSBQSFlfU1RBVEVfVElNRQkJMQogI2RlZmluZSBQSFlfRk9SQ0VfVElNRU9VVAkxMAogI2RlZmluZSBQSFlfQU5fVElNRU9VVAkJMTAKIAotI2RlZmluZSBQSFlfTUFYX0FERFIgMzIKKyNkZWZpbmUgUEhZX01BWF9BRERSCTMyCiAKIC8qIFVzZWQgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHNwZWNpZmljIHBoeSAobWlpIGJ1cyBpZDpwaHkgZGV2aWNlIGlkKSAqLwogI2RlZmluZSBQSFlfSURfRk1UICIleDolMDJ4IgpAQCAtODMsOCArOTgsOCBAQAogCWludCAqaXJxOwogfTsKIAotI2RlZmluZSBQSFlfSU5URVJSVVBUX0RJU0FCTEVEIDB4MAotI2RlZmluZSBQSFlfSU5URVJSVVBUX0VOQUJMRUQgMHg4MDAwMDAwMAorI2RlZmluZSBQSFlfSU5URVJSVVBUX0RJU0FCTEVECTB4MAorI2RlZmluZSBQSFlfSU5URVJSVVBUX0VOQUJMRUQJMHg4MDAwMDAwMAogCiAvKiBQSFkgc3RhdGUgbWFjaGluZSBzdGF0ZXM6CiAgKgpAQCAtMjI2LDYgKzI0MSw4IEBACiAKIAl1MzIgZGV2X2ZsYWdzOwogCisJcGh5X2ludGVyZmFjZV90IGludGVyZmFjZTsKKwogCS8qIEJ1cyBhZGRyZXNzIG9mIHRoZSBQSFkgKDAtMzIpICovCiAJaW50IGFkZHI7CiAKQEAgLTM0MSw5ICszNTgsMTAgQEAKIGludCBwaHlfY2xlYXJfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogaW50IHBoeV9jb25maWdfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHUzMiBpbnRlcnJ1cHRzKTsKIHN0cnVjdCBwaHlfZGV2aWNlICogcGh5X2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQljb25zdCBjaGFyICpwaHlfaWQsIHUzMiBmbGFncyk7CisJCWNvbnN0IGNoYXIgKnBoeV9pZCwgdTMyIGZsYWdzLCBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKIHN0cnVjdCBwaHlfZGV2aWNlICogcGh5X2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcGh5X2lkLAotCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKiksIHUzMiBmbGFncyk7CisJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwgdTMyIGZsYWdzLAorCQlwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKIHZvaWQgcGh5X2Rpc2Nvbm5lY3Qoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiB2b2lkIHBoeV9kZXRhY2goc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiB2b2lkIHBoeV9zdGFydChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCmluZGV4IDI5Y2Q2ZGUuLjIwZjQ3YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaApAQCAtNTgsNiArNTgsMTIgQEAKIGV4dGVybiBpbnQgcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKik7CiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICopOwogCisvKiBub24taG90cGx1Z2dhYmxlIHBsYXRmb3JtIGRldmljZXMgbWF5IHVzZSB0aGlzIHNvIHRoYXQgcHJvYmUoKSBhbmQKKyAqIGl0cyBzdXBwb3J0IG1heSBsaXZlIGluIF9faW5pdCBzZWN0aW9ucywgY29uc2VydmluZyBydW50aW1lIG1lbW9yeS4KKyAqLworZXh0ZXJuIGludCBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSk7CisKICNkZWZpbmUgcGxhdGZvcm1fZ2V0X2RydmRhdGEoX2RldikJZGV2X2dldF9kcnZkYXRhKCYoX2RldiktPmRldikKICNkZWZpbmUgcGxhdGZvcm1fc2V0X2RydmRhdGEoX2RldixkYXRhKQlkZXZfc2V0X2RydmRhdGEoJihfZGV2KS0+ZGV2LCAoZGF0YSkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9sbC5oIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKaW5kZXggNTFlMWI1Ni4uMjc2OTA3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTgsNyArOCw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyogfjgzMiBieXRlcyBvZiBzdGFjayBzcGFjZSB1c2VkIG1heCBpbiBzeXNfc2VsZWN0L3N5c19wb2xsIGJlZm9yZSBhbGxvY2F0aW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IDkxNThhNjguLmNiZmExMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0xOSw3ICsxOSw2IEBACiAjaWZuZGVmIF9MSU5VWF9SQURJWF9UUkVFX0gKICNkZWZpbmUgX0xJTlVYX1JBRElYX1RSRUVfSAogCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYW5kb20uaCBiL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKaW5kZXggMDI0OGIzMC4uMDFhZDcxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYW5kb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCkBAIC01MSwxNiArNTEsMTYgQEAKIGV4dGVybiB2b2lkIGdldF9yYW5kb21fYnl0ZXModm9pZCAqYnVmLCBpbnQgbmJ5dGVzKTsKIHZvaWQgZ2VuZXJhdGVfcmFuZG9tX3V1aWQodW5zaWduZWQgY2hhciB1dWlkX291dFsxNl0pOwogCi1leHRlcm4gX191MzIgc2VjdXJlX2lwX2lkKF9fdTMyIGRhZGRyKTsKLWV4dGVybiB1MzIgc2VjdXJlX2lwdjRfcG9ydF9lcGhlbWVyYWwoX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLCBfX3UxNiBkcG9ydCk7Ci1leHRlcm4gdTMyIHNlY3VyZV9pcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fdTMyICpzYWRkciwgY29uc3QgX191MzIgKmRhZGRyLCAKLQkJCQkgICAgICBfX3UxNiBkcG9ydCk7Ci1leHRlcm4gX191MzIgc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLAotCQkJCQlfX3UxNiBzcG9ydCwgX191MTYgZHBvcnQpOwotZXh0ZXJuIF9fdTMyIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoX191MzIgKnNhZGRyLCBfX3UzMiAqZGFkZHIsCi0JCQkJCSAgX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KTsKLWV4dGVybiB1NjQgc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKLQkJCQkgICAgICAgX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KTsKK2V4dGVybiBfX3UzMiBzZWN1cmVfaXBfaWQoX19iZTMyIGRhZGRyKTsKK2V4dGVybiB1MzIgc2VjdXJlX2lwdjRfcG9ydF9lcGhlbWVyYWwoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCk7CitleHRlcm4gdTMyIHNlY3VyZV9pcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fYmUzMiAqc2FkZHIsIGNvbnN0IF9fYmUzMiAqZGFkZHIsCisJCQkJICAgICAgX19iZTE2IGRwb3J0KTsKK2V4dGVybiBfX3UzMiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkJX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpOworZXh0ZXJuIF9fdTMyIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoX19iZTMyICpzYWRkciwgX19iZTMyICpkYWRkciwKKwkJCQkJICBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCk7CitleHRlcm4gdTY0IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkgICAgICAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpOwogCiAjaWZuZGVmIE1PRFVMRQogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmFuZG9tX2ZvcHMsIHVyYW5kb21fZm9wczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaAppbmRleCA3M2UwYmVjLi42MmE3MTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oCkBAIC00MjksNyArNDI5LDcgQEAKIC8qIC1vIGhhc2g9e3RlYSwgcnVwYXNvdiwgcjUsIGRldGVjdH0gaXMgbWVhbnQgZm9yIHByb3Blcmx5IG1vdW50aW5nIAogKiogcmVpc2VyZnMgZGlza3MgZnJvbSAzLjUuMTkgb3IgZWFybGllci4gIDk5JSBvZiB0aGUgdGltZSwgdGhpcyBvcHRpb24KICoqIGlzIG5vdCByZXF1aXJlZC4gIElmIHRoZSBub3JtYWwgYXV0b2RlY3Rpb24gY29kZSBjYW4ndCBkZXRlcm1pbmUgd2hpY2gKLSoqIGhhc2ggdG8gdXNlIChiZWNhdXNlIGJvdGggaGFzZXMgaGFkIHRoZSBzYW1lIHZhbHVlIGZvciBhIGZpbGUpCisqKiBoYXNoIHRvIHVzZSAoYmVjYXVzZSBib3RoIGhhc2hlcyBoYWQgdGhlIHNhbWUgdmFsdWUgZm9yIGEgZmlsZSkKICoqIHVzZSB0aGlzIG9wdGlvbiB0byBmb3JjZSBhIHNwZWNpZmljIGhhc2guICBJdCB3b24ndCBhbGxvdyB5b3UgdG8gb3ZlcnJpZGUKICoqIHRoZSBleGlzdGluZyBoYXNoIG9uIHRoZSBGUywgc28gaWYgeW91IGhhdmUgYSB0ZWEgaGFzaCBkaXNrLCBhbmQgbW91bnQKICoqIHdpdGggLW8gaGFzaD1ydXBhc292LCB0aGUgbW91bnQgd2lsbCBmYWlsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggM2ExOGFkZC4uNDkzMjk3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC04MSw4ICs4MSw2IEBACiAKIAlSVE1fTkVXUFJFRklYCT0gNTIsCiAjZGVmaW5lIFJUTV9ORVdQUkVGSVgJUlRNX05FV1BSRUZJWAotCVJUTV9HRVRQUkVGSVgJPSA1NCwKLSNkZWZpbmUgUlRNX0dFVFBSRUZJWAlSVE1fR0VUUFJFRklYCiAKIAlSVE1fR0VUTVVMVElDQVNUID0gNTgsCiAjZGVmaW5lIFJUTV9HRVRNVUxUSUNBU1QgUlRNX0dFVE1VTFRJQ0FTVApAQCAtNTg3LDYgKzU4NSw5IEBACiAJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgZ2ZwX3QgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgcnRubF9zZXRfc2tfZXJyKHUzMiBncm91cCwgaW50IGVycm9yKTsKIGV4dGVybiBpbnQgcnRuZXRsaW5rX3B1dF9tZXRyaWNzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqbWV0cmljcyk7CitleHRlcm4gaW50IHJ0bmxfcHV0X2NhY2hlaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCisJCQkgICAgICB1MzIgaWQsIHUzMiB0cywgdTMyIHRzYWdlLCBsb25nIGV4cGlyZXMsCisJCQkgICAgICB1MzIgZXJyb3IpOwogCiBleHRlcm4gdm9pZCBfX3J0YV9maWxsKHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4sIGNvbnN0IHZvaWQgKmRhdGEpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjdHAuaCBiL2luY2x1ZGUvbGludXgvc2N0cC5oCmluZGV4IDZlYzY2ZGUuLjM1MTA4ZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2N0cC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2N0cC5oCkBAIC01NywxNyArNTcsMTcgQEAKIAogLyogU2VjdGlvbiAzLjEuICBTQ1RQIENvbW1vbiBIZWFkZXIgRm9ybWF0ICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwaGRyIHsKLQlfX3UxNiBzb3VyY2U7Ci0JX191MTYgZGVzdDsKLQlfX3UzMiB2dGFnOwotCV9fdTMyIGNoZWNrc3VtOworCV9fYmUxNiBzb3VyY2U7CisJX19iZTE2IGRlc3Q7CisJX19iZTMyIHZ0YWc7CisJX19iZTMyIGNoZWNrc3VtOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX3NjdHBoZHJfdDsKIAogLyogU2VjdGlvbiAzLjIuICBDaHVuayBGaWVsZCBEZXNjcmlwdGlvbnMuICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2NodW5raGRyIHsKIAlfX3U4IHR5cGU7CiAJX191OCBmbGFnczsKLQlfX3UxNiBsZW5ndGg7CisJX19iZTE2IGxlbmd0aDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9jaHVua2hkcl90OwogCiAKQEAgLTE1Myw4ICsxNTMsOCBAQAogICovCiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfcGFyYW1oZHIgewotCV9fdTE2IHR5cGU7Ci0JX191MTYgbGVuZ3RoOworCV9fYmUxNiB0eXBlOworCV9fYmUxNiBsZW5ndGg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfcGFyYW1oZHJfdDsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTIwMywxMCArMjAzLDEwIEBACiAvKiBSRkMgMjk2MCBTZWN0aW9uIDMuMy4xIFBheWxvYWQgRGF0YSAoREFUQSkgKDApICovCiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfZGF0YWhkciB7Ci0JX191MzIgdHNuOwotCV9fdTE2IHN0cmVhbTsKLQlfX3UxNiBzc247Ci0JX191MzIgcHBpZDsKKwlfX2JlMzIgdHNuOworCV9fYmUxNiBzdHJlYW07CisJX19iZTE2IHNzbjsKKwlfX2JlMzIgcHBpZDsKIAlfX3U4ICBwYXlsb2FkWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2RhdGFoZHJfdDsKIApAQCAtMjMyLDExICsyMzIsMTEgQEAKICAqICBlbmRwb2ludHMuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfaW5pdGhkciB7Ci0JX191MzIgaW5pdF90YWc7Ci0JX191MzIgYV9yd25kOwotCV9fdTE2IG51bV9vdXRib3VuZF9zdHJlYW1zOwotCV9fdTE2IG51bV9pbmJvdW5kX3N0cmVhbXM7Ci0JX191MzIgaW5pdGlhbF90c247CisJX19iZTMyIGluaXRfdGFnOworCV9fYmUzMiBhX3J3bmQ7CisJX19iZTE2IG51bV9vdXRib3VuZF9zdHJlYW1zOworCV9fYmUxNiBudW1faW5ib3VuZF9zdHJlYW1zOworCV9fYmUzMiBpbml0aWFsX3RzbjsKIAlfX3U4ICBwYXJhbXNbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfaW5pdGhkcl90OwogCkBAIC0yNjEsNyArMjYxLDcgQEAKIC8qIFNlY3Rpb24gMy4zLjIuMSBDb29raWUgUHJlc2VydmF0aXZlICg5KSAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9jb29raWVfcHJlc2VydmVfcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdCBwYXJhbV9oZHI7Ci0JdWludDMyX3QgICAgICAgIGxpZmVzcGFuX2luY3JlbWVudDsKKwlfX2JlMzIgICAgICAgICAgbGlmZXNwYW5faW5jcmVtZW50OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2Nvb2tpZV9wcmVzZXJ2ZV9wYXJhbV90OwogCiAvKiBTZWN0aW9uIDMuMy4yLjEgSG9zdCBOYW1lIEFkZHJlc3MgKDExKSAqLwpAQCAtMjczLDcgKzI3Myw3IEBACiAvKiBTZWN0aW9uIDMuMy4yLjEgU3VwcG9ydGVkIEFkZHJlc3MgVHlwZXMgKDEyKSAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9zdXBwb3J0ZWRfYWRkcnNfcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdCBwYXJhbV9oZHI7Ci0JdWludDE2X3QgdHlwZXNbMF07CisJX19iZTE2IHR5cGVzWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX3N1cHBvcnRlZF9hZGRyc19wYXJhbV90OwogCiAvKiBBcHBlbmRpeCBBLiBFQ04gQ2FwYWJsZSAoMzI3NjgpICovCkBAIC0yODQsNyArMjg0LDcgQEAKIC8qIEFERElQIFNlY3Rpb24gMy4yLjYgQWRhcHRpb24gTGF5ZXIgSW5kaWNhdGlvbiAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9hZGFwdGlvbl9pbmRfcGFyYW0gewogCXN0cnVjdCBzY3RwX3BhcmFtaGRyIHBhcmFtX2hkcjsKLQlfX3UzMiBhZGFwdGlvbl9pbmQ7CisJX19iZTMyIGFkYXB0aW9uX2luZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hZGFwdGlvbl9pbmRfcGFyYW1fdDsKIAogLyogUkZDIDI5NjAuICBTZWN0aW9uIDMuMy4zIEluaXRpYXRpb24gQWNrbm93bGVkZ2VtZW50IChJTklUIEFDSykgKDIpOgpAQCAtMzE2LDExICszMTYsMTEgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2dhcF9hY2tfYmxvY2sgewotCV9fdTE2IHN0YXJ0OwotCV9fdTE2IGVuZDsKKwlfX2JlMTYgc3RhcnQ7CisJX19iZTE2IGVuZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9nYXBfYWNrX2Jsb2NrX3Q7CiAKLXR5cGVkZWYgdWludDMyX3Qgc2N0cF9kdXBfdHNuX3Q7Cit0eXBlZGVmIF9fYmUzMiBzY3RwX2R1cF90c25fdDsKIAogdHlwZWRlZiB1bmlvbiB7CiAJc2N0cF9nYXBfYWNrX2Jsb2NrX3QJZ2FiOwpAQCAtMzI4LDEwICszMjgsMTAgQEAKIH0gc2N0cF9zYWNrX3ZhcmlhYmxlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfc2Fja2hkciB7Ci0JX191MzIgY3VtX3Rzbl9hY2s7Ci0JX191MzIgYV9yd25kOwotCV9fdTE2IG51bV9nYXBfYWNrX2Jsb2NrczsKLQlfX3UxNiBudW1fZHVwX3RzbnM7CisJX19iZTMyIGN1bV90c25fYWNrOworCV9fYmUzMiBhX3J3bmQ7CisJX19iZTE2IG51bV9nYXBfYWNrX2Jsb2NrczsKKwlfX2JlMTYgbnVtX2R1cF90c25zOwogCXNjdHBfc2Fja192YXJpYWJsZV90IHZhcmlhYmxlWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX3NhY2toZHJfdDsKIApAQCAtMzcxLDcgKzM3MSw3IEBACiAgKiBhbmQgdGhlIGhpZ2hlc3QgY29uc2VjdXRpdmUgYWNraW5nIHZhbHVlLgogICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX3NodXRkb3duaGRyIHsKLQlfX3UzMiBjdW1fdHNuX2FjazsKKwlfX2JlMzIgY3VtX3Rzbl9hY2s7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc2h1dGRvd25oZHJfdDsKIAogc3RydWN0IHNjdHBfc2h1dGRvd25fY2h1bmtfdCB7CkBAIC0zODIsOCArMzgyLDggQEAKIC8qIFJGQyAyOTYwLiAgU2VjdGlvbiAzLjMuMTAgT3BlcmF0aW9uIEVycm9yIChFUlJPUikgKDkpICovCiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfZXJyaGRyIHsKLQlfX3UxNiBjYXVzZTsKLQlfX3UxNiBsZW5ndGg7CisJX19iZTE2IGNhdXNlOworCV9fYmUxNiBsZW5ndGg7CiAJX191OCAgdmFyaWFibGVbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfZXJyaGRyX3Q7CiAKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICogICBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiBFY2hvIChFQ05FKSAoMTIpCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfZWNuZWhkciB7Ci0JX191MzIgbG93ZXN0X3RzbjsKKwlfX2JlMzIgbG93ZXN0X3RzbjsKIH0gc2N0cF9lY25laGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfZWNuZV9jaHVuayB7CkBAIC00NzQsNyArNDc0LDcgQEAKICAqICAgQ29uZ2VzdGlvbiBXaW5kb3cgUmVkdWNlZCAoQ1dSKSAoMTMpCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfY3dyaGRyIHsKLQlfX3UzMiBsb3dlc3RfdHNuOworCV9fYmUzMiBsb3dlc3RfdHNuOwogfSBzY3RwX2N3cmhkcl90OwogCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2N3cl9jaHVuayB7CkBAIC01MjksMTIgKzUyOSwxMiBAQAogICogICAgICAgY2h1bmtzIHRoaXMgZmllbGQgTVVTVCBiZSBmaWxsZWQgaW4uCiAgKi8KIHN0cnVjdCBzY3RwX2Z3ZHRzbl9za2lwIHsKLQlfX3UxNiBzdHJlYW07Ci0JX191MTYgc3NuOworCV9fYmUxNiBzdHJlYW07CisJX19iZTE2IHNzbjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIgewotCV9fdTMyIG5ld19jdW1fdHNuOworCV9fYmUzMiBuZXdfY3VtX3RzbjsKIAlzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCBza2lwWzBdOwogfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CiAKQEAgLTU3OCwxMSArNTc4LDExIEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfYWRkaXBfcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdAlwYXJhbV9oZHI7Ci0JX191MzIJCWNycl9pZDsJCisJX19iZTMyCQljcnJfaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfYWRkaXBfcGFyYW1fdDsKIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9hZGRpcGhkciB7Ci0JX191MzIJc2VyaWFsOworCV9fYmUzMglzZXJpYWw7CiAJX191OAlwYXJhbXNbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfYWRkaXBoZHJfdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IGIyMDBiOTguLjgzY2RlZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTgyNiw2ICs4MjYsOCBAQAogICoJU2V0cyB0aGUgb3BlbnJlcSdzIHNpZCB0byBzb2NrZXQncyBzaWQgd2l0aCBNTFMgcG9ydGlvbiB0YWtlbiBmcm9tIHBlZXIgc2lkLgogICogQGluZXRfY3NrX2Nsb25lOgogICoJU2V0cyB0aGUgbmV3IGNoaWxkIHNvY2tldCdzIHNpZCB0byB0aGUgb3BlbnJlcSBzaWQuCisgKiBAaW5ldF9jb25uX2VzdGFibGlzaGVkOgorICogICAgIFNldHMgdGhlIGNvbm5lY3Rpb24ncyBwZWVyc2lkIHRvIHRoZSBzZWNtYXJrIG9uIHNrYi4KICAqIEByZXFfY2xhc3NpZnlfZmxvdzoKICAqCVNldHMgdGhlIGZsb3cncyBzaWQgdG8gdGhlIG9wZW5yZXEgc2lkLgogICoKQEAgLTgzNiwxMCArODM4LDggQEAKICAqCXVzZWQgYnkgdGhlIFhGUk0gc3lzdGVtLgogICoJQHNlY19jdHggY29udGFpbnMgdGhlIHNlY3VyaXR5IGNvbnRleHQgaW5mb3JtYXRpb24gYmVpbmcgcHJvdmlkZWQgYnkKICAqCXRoZSB1c2VyLWxldmVsIHBvbGljeSB1cGRhdGUgcHJvZ3JhbSAoZS5nLiwgc2V0a2V5KS4KLSAqCUBzayByZWZlcnMgdG8gdGhlIHNvY2sgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHNlY3VyaXR5IGNvbnRleHQuCiAgKglBbGxvY2F0ZSBhIHNlY3VyaXR5IHN0cnVjdHVyZSB0byB0aGUgeHAtPnNlY3VyaXR5IGZpZWxkOyB0aGUgc2VjdXJpdHkKLSAqCWZpZWxkIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgd2hlbiB0aGUgeGZybV9wb2xpY3kgaXMgYWxsb2NhdGVkLiBPbmx5Ci0gKglvbmUgb2Ygc2VjX2N0eCBvciBzb2NrIGNhbiBiZSBzcGVjaWZpZWQuCisgKglmaWVsZCBpcyBpbml0aWFsaXplZCB0byBOVUxMIHdoZW4gdGhlIHhmcm1fcG9saWN5IGlzIGFsbG9jYXRlZC4KICAqCVJldHVybiAwIGlmIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAobWVtb3J5IHRvIGFsbG9jYXRlLCBsZWdhbCBjb250ZXh0KQogICogQHhmcm1fcG9saWN5X2Nsb25lX3NlY3VyaXR5OgogICoJQG9sZCBjb250YWlucyBhbiBleGlzdGluZyB4ZnJtX3BvbGljeSBpbiB0aGUgU1BELgpAQCAtODU4LDkgKzg1OCw2IEBACiAgKglEYXRhYmFzZSBieSB0aGUgWEZSTSBzeXN0ZW0uCiAgKglAc2VjX2N0eCBjb250YWlucyB0aGUgc2VjdXJpdHkgY29udGV4dCBpbmZvcm1hdGlvbiBiZWluZyBwcm92aWRlZCBieQogICoJdGhlIHVzZXItbGV2ZWwgU0EgZ2VuZXJhdGlvbiBwcm9ncmFtIChlLmcuLCBzZXRrZXkgb3IgcmFjb29uKS4KLSAqCUBwb2xzZWMgY29udGFpbnMgdGhlIHNlY3VyaXR5IGNvbnRleHQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgeGZybQotICoJcG9saWN5IHJ1bGUgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBiYXNlIGNvbnRleHQuIHBvbHNlYyBtdXN0IGJlIE5VTEwKLSAqCXdoZW4gc2VjX2N0eCBpcyBzcGVjaWZpZWQuCiAgKglAc2VjaWQgY29udGFpbnMgdGhlIHNlY2lkIGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgbWxzIHBvcnRpb24gb2YgdGhlIGNvbnRleHQuCiAgKglBbGxvY2F0ZSBhIHNlY3VyaXR5IHN0cnVjdHVyZSB0byB0aGUgeC0+c2VjdXJpdHkgZmllbGQ7IHRoZSBzZWN1cml0eQogICoJZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCB3aGVuIHRoZSB4ZnJtX3N0YXRlIGlzIGFsbG9jYXRlZC4gU2V0IHRoZQpAQCAtODg5LDExICs4ODYsNiBAQAogICoJQHhwIGNvbnRhaW5zIHRoZSBwb2xpY3kgdG8gY2hlY2sgZm9yIGEgbWF0Y2guCiAgKglAZmwgY29udGFpbnMgdGhlIGZsb3cgdG8gY2hlY2sgZm9yIGEgbWF0Y2guCiAgKglSZXR1cm4gMSBpZiB0aGVyZSBpcyBhIG1hdGNoLgotICogQHhmcm1fZmxvd19zdGF0ZV9tYXRjaDoKLSAqCUBmbCBjb250YWlucyB0aGUgZmxvdyBrZXkgdG8gbWF0Y2guCi0gKglAeGZybSBwb2ludHMgdG8gdGhlIHhmcm1fc3RhdGUgdG8gbWF0Y2guCi0gKglAeHAgcG9pbnRzIHRvIHRoZSB4ZnJtX3BvbGljeSB0byBtYXRjaC4KLSAqCVJldHVybiAxIGlmIHRoZXJlIGlzIGEgbWF0Y2guCiAgKiBAeGZybV9kZWNvZGVfc2Vzc2lvbjoKICAqCUBza2IgcG9pbnRzIHRvIHNrYiB0byBkZWNvZGUuCiAgKglAc2VjaWQgcG9pbnRzIHRvIHRoZSBmbG93IGtleSBzZWNpZCB0byBzZXQuCkBAIC0xMzczLDI1ICsxMzY1LDI0IEBACiAJaW50ICgqaW5ldF9jb25uX3JlcXVlc3QpKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKIAl2b2lkICgqaW5ldF9jc2tfY2xvbmUpKHN0cnVjdCBzb2NrICpuZXdzaywgY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKKwl2b2lkICgqaW5ldF9jb25uX2VzdGFibGlzaGVkKShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogCXZvaWQgKCpyZXFfY2xhc3NpZnlfZmxvdykoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBzdHJ1Y3QgZmxvd2kgKmZsKTsKICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyAqLwogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogCWludCAoKnhmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KSAoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwKLQkJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHNvY2sgKnNrKTsKKwkJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCk7CiAJaW50ICgqeGZybV9wb2xpY3lfY2xvbmVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9wb2xpY3kgKm9sZCwgc3RydWN0IHhmcm1fcG9saWN5ICpuZXcpOwogCXZvaWQgKCp4ZnJtX3BvbGljeV9mcmVlX3NlY3VyaXR5KSAoc3RydWN0IHhmcm1fcG9saWN5ICp4cCk7CiAJaW50ICgqeGZybV9wb2xpY3lfZGVsZXRlX3NlY3VyaXR5KSAoc3RydWN0IHhmcm1fcG9saWN5ICp4cCk7CiAJaW50ICgqeGZybV9zdGF0ZV9hbGxvY19zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAotCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgsIHN0cnVjdCB4ZnJtX3NlY19jdHggKnBvbHNlYywKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LAogCQl1MzIgc2VjaWQpOwogCXZvaWQgKCp4ZnJtX3N0YXRlX2ZyZWVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiAJaW50ICgqeGZybV9zdGF0ZV9kZWxldGVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiAJaW50ICgqeGZybV9wb2xpY3lfbG9va3VwKShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCB1MzIgZmxfc2VjaWQsIHU4IGRpcik7CiAJaW50ICgqeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCkoc3RydWN0IHhmcm1fc3RhdGUgKngsCiAJCQlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3QgZmxvd2kgKmZsKTsKLQlpbnQgKCp4ZnJtX2Zsb3dfc3RhdGVfbWF0Y2gpKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLAotCQkJc3RydWN0IHhmcm1fcG9saWN5ICp4cCk7CiAJaW50ICgqeGZybV9kZWNvZGVfc2Vzc2lvbikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICpzZWNpZCwgaW50IGNrYWxsKTsKICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNICovCiAKQEAgLTI5NjYsOSArMjk1NywxNSBAQAogewogCXNlY3VyaXR5X29wcy0+aW5ldF9jc2tfY2xvbmUobmV3c2ssIHJlcSk7CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQoc3RydWN0IHNvY2sgKnNrLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzZWN1cml0eV9vcHMtPmluZXRfY29ubl9lc3RhYmxpc2hlZChzaywgc2tiKTsKK30KICNlbHNlCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV91bml4X3N0cmVhbV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKiBzb2NrLAotCQkJCQkgICAgICAgc3RydWN0IHNvY2tldCAqIG90aGVyLCAKKwkJCQkJICAgICAgIHN0cnVjdCBzb2NrZXQgKiBvdGhlciwKIAkJCQkJICAgICAgIHN0cnVjdCBzb2NrICogbmV3c2spCiB7CiAJcmV0dXJuIDA7CkBAIC0zMTE1LDEyICszMTEyLDE3IEBACiAJCQljb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQoc3RydWN0IHNvY2sgKnNrLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKK30KICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyAqLwogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KQogewotCXJldHVybiBzZWN1cml0eV9vcHMtPnhmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KHhwLCBzZWNfY3R4LCBOVUxMKTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eSh4cCwgc2VjX2N0eCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2Nsb25lKHN0cnVjdCB4ZnJtX3BvbGljeSAqb2xkLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKm5ldykKQEAgLTMxNDEsNyArMzE0Myw3IEBACiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX3N0YXRlX2FsbG9jKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAogCQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KQogewotCXJldHVybiBzZWN1cml0eV9vcHMtPnhmcm1fc3RhdGVfYWxsb2Nfc2VjdXJpdHkoeCwgc2VjX2N0eCwgTlVMTCwgMCk7CisJcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9zdGF0ZV9hbGxvY19zZWN1cml0eSh4LCBzZWNfY3R4LCAwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9zdGF0ZV9hbGxvY19hY3F1aXJlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LApAQCAtMzE0OSw3ICszMTUxLDExIEBACiB7CiAJaWYgKCFwb2xzZWMpCiAJCXJldHVybiAwOwotCXJldHVybiBzZWN1cml0eV9vcHMtPnhmcm1fc3RhdGVfYWxsb2Nfc2VjdXJpdHkoeCwgTlVMTCwgcG9sc2VjLCBzZWNpZCk7CisJLyoKKwkgKiBXZSB3YW50IHRoZSBjb250ZXh0IHRvIGJlIHRha2VuIGZyb20gc2VjaWQgd2hpY2ggaXMgdXN1YWxseQorCSAqIGZyb20gdGhlIHNvY2suCisJICovCisJcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9zdGF0ZV9hbGxvY19zZWN1cml0eSh4LCBOVUxMLCBzZWNpZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQpAQCAtMzE3MywxMiArMzE3OSw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCh4LCB4cCwgZmwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goc3RydWN0IGZsb3dpICpmbCwKLQkJCXN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKQotewotCXJldHVybiBzZWN1cml0eV9vcHMtPnhmcm1fZmxvd19zdGF0ZV9tYXRjaChmbCwgeGZybSwgeHApOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqc2VjaWQpCiB7CiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9kZWNvZGVfc2Vzc2lvbihza2IsIHNlY2lkLCAxKTsKQEAgLTMyNDIsMTIgKzMyNDIsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goc3RydWN0IGZsb3dpICpmbCwKLQkJCXN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKQotewotCXJldHVybiAxOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqc2VjaWQpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCA4NTU3N2E0Li5hMDVhNWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTIyLDEyICsyMiwxMCBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIAogI2RlZmluZSBIQVZFX0FMTE9DX1NLQgkJLyogRm9yIHRoZSBkcml2ZXJzIHRvIGtub3cgKi8KQEAgLTEzOSw3ICsxMzcsNyBAQAogCS8qIFdhcm5pbmc6IHRoaXMgZmllbGQgaXMgbm90IGFsd2F5cyBmaWxsZWQgaW4gKFVGTykhICovCiAJdW5zaWduZWQgc2hvcnQJZ3NvX3NlZ3M7CiAJdW5zaWduZWQgc2hvcnQgIGdzb190eXBlOwotCXVuc2lnbmVkIGludCAgICBpcDZfZnJhZ19pZDsKKwlfX2JlMzIgICAgICAgICAgaXA2X2ZyYWdfaWQ7CiAJc3RydWN0IHNrX2J1ZmYJKmZyYWdfbGlzdDsKIAlza2JfZnJhZ190CWZyYWdzW01BWF9TS0JfRlJBR1NdOwogfTsKQEAgLTIxNiw3ICsyMTQsNyBAQAogICoJQHRhaWw6IFRhaWwgcG9pbnRlcgogICoJQGVuZDogRW5kIHBvaW50ZXIKICAqCUBkZXN0cnVjdG9yOiBEZXN0cnVjdCBmdW5jdGlvbgotICoJQG5mbWFyazogQ2FuIGJlIHVzZWQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBob29rcworICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKICAqCUBuZmN0OiBBc3NvY2lhdGVkIGNvbm5lY3Rpb24sIGlmIGFueQogICoJQGlwdnNfcHJvcGVydHk6IHNrYnVmZiBpcyBvd25lZCBieSBpcHZzCiAgKglAbmZjdGluZm86IFJlbGF0aW9uc2hpcCBvZiB0aGlzIHNrYiB0byB0aGUgY29ubmVjdGlvbgpAQCAtMjczLDggKzI3MSwxMSBAQAogCiAJdW5zaWduZWQgaW50CQlsZW4sCiAJCQkJZGF0YV9sZW4sCi0JCQkJbWFjX2xlbiwKLQkJCQljc3VtOworCQkJCW1hY19sZW47CisJdW5pb24geworCQlfX3dzdW0JCWNzdW07CisJCV9fdTMyCQljc3VtX29mZnNldDsKKwl9OwogCV9fdTMyCQkJcHJpb3JpdHk7CiAJX191OAkJCWxvY2FsX2RmOjEsCiAJCQkJY2xvbmVkOjEsCkBAIC0yOTUsNyArMjk2LDYgQEAKICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgogCXN0cnVjdCBuZl9icmlkZ2VfaW5mbwkqbmZfYnJpZGdlOwogI2VuZGlmCi0JX191MzIJCQluZm1hcms7CiAjZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUiAqLwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAlfX3UxNgkJCXRjX2luZGV4OwkvKiB0cmFmZmljIGNvbnRyb2wgaW5kZXggKi8KQEAgLTMxMCw2ICszMTAsNyBAQAogCV9fdTMyCQkJc2VjbWFyazsKICNlbmRpZgogCisJX191MzIJCQltYXJrOwogCiAJLyogVGhlc2UgZWxlbWVudHMgbXVzdCBiZSBhdCB0aGUgZW5kLCBzZWUgYWxsb2Nfc2tiKCkgZm9yIGRldGFpbHMuICAqLwogCXVuc2lnbmVkIGludAkJdHJ1ZXNpemU7CkBAIC0xMTk5LDggKzEyMDAsNyBAQAogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKIAkJaW50IGVyciA9IDA7Ci0JCXVuc2lnbmVkIGludCBjc3VtID0gY3N1bV9hbmRfY29weV9mcm9tX3VzZXIoZnJvbSwKLQkJCQkJCQkgICAgc2tiX3B1dChza2IsIGNvcHkpLAorCQlfX3dzdW0gY3N1bSA9IGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyKGZyb20sIHNrYl9wdXQoc2tiLCBjb3B5KSwKIAkJCQkJCQkgICAgY29weSwgMCwgJmVycik7CiAJCWlmICghZXJyKSB7CiAJCQlza2ItPmNzdW0gPSBjc3VtX2Jsb2NrX2FkZChza2ItPmNzdW0sIGNzdW0sIG9mZik7CkBAIC0xMjkzLDI0ICsxMjkzLDYgQEAKIAlyZXR1cm4gX19wc2tiX3RyaW0oc2tiLCBsZW4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmttYXBfc2tiX2ZyYWcoY29uc3Qgc2tiX2ZyYWdfdCAqZnJhZykKLXsKLSNpZmRlZiBDT05GSUdfSElHSE1FTQotCUJVR19PTihpbl9pcnEoKSk7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0jZW5kaWYKLQlyZXR1cm4ga21hcF9hdG9taWMoZnJhZy0+cGFnZSwgS01fU0tCX0RBVEFfU09GVElSUSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdW5tYXBfc2tiX2ZyYWcodm9pZCAqdmFkZHIpCi17Ci0Ja3VubWFwX2F0b21pYyh2YWRkciwgS01fU0tCX0RBVEFfU09GVElSUSk7Ci0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlsb2NhbF9iaF9lbmFibGUoKTsKLSNlbmRpZgotfQotCiAjZGVmaW5lIHNrYl9xdWV1ZV93YWxrKHF1ZXVlLCBza2IpIFwKIAkJZm9yIChza2IgPSAocXVldWUpLT5uZXh0OwkJCQkJXAogCQkgICAgIHByZWZldGNoKHNrYi0+bmV4dCksIChza2IgIT0gKHN0cnVjdCBza19idWZmICopKHF1ZXVlKSk7CVwKQEAgLTEzMzUsMTUgKzEzMTcsMTUgQEAKIGV4dGVybiB2b2lkCSAgICAgICBza2JfZnJlZV9kYXRhZ3JhbShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQJICAgICAgIHNrYl9raWxsX2RhdGFncmFtKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJIHVuc2lnbmVkIGludCBmbGFncyk7Ci1leHRlcm4gdW5zaWduZWQgaW50ICAgIHNrYl9jaGVja3N1bShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAotCQkJCSAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgY3N1bSk7CitleHRlcm4gX193c3VtCSAgICAgICBza2JfY2hlY2tzdW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKKwkJCQkgICAgaW50IGxlbiwgX193c3VtIGNzdW0pOwogZXh0ZXJuIGludAkgICAgICAgc2tiX2NvcHlfYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAogCQkJCSAgICAgdm9pZCAqdG8sIGludCBsZW4pOwogZXh0ZXJuIGludAkgICAgICAgc2tiX3N0b3JlX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKIAkJCQkgICAgICB2b2lkICpmcm9tLCBpbnQgbGVuKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgICAgc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIF9fd3N1bQkgICAgICAgc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICAgICBpbnQgb2Zmc2V0LCB1OCAqdG8sIGludCBsZW4sCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBjc3VtKTsKKwkJCQkJICAgICAgX193c3VtIGNzdW0pOwogZXh0ZXJuIHZvaWQJICAgICAgIHNrYl9jb3B5X2FuZF9jc3VtX2Rldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqdG8pOwogZXh0ZXJuIHZvaWQJICAgICAgIHNrYl9zcGxpdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSwgY29uc3QgdTMyIGxlbik7CkBAIC0xMzk5LDcgKzEzODEsNyBAQAogCiBleHRlcm4gdm9pZCBfX25ldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgX19za2JfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogLyoqCiAgKglza2JfY2hlY2tzdW1fY29tcGxldGUgLSBDYWxjdWxhdGUgY2hlY2tzdW0gb2YgYW4gZW50aXJlIHBhY2tldApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggMzYxNDA5MC4uOTJjZDM4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0yNjQsNiArMjY0LDcgQEAKICNkZWZpbmUgU09MX0lQVjYJNDEKICNkZWZpbmUgU09MX0lDTVBWNgk1OAogI2RlZmluZSBTT0xfU0NUUAkxMzIKKyNkZWZpbmUgU09MX1VEUExJVEUJMTM2ICAgICAvKiBVRFAtTGl0ZSAoUkZDIDM4MjgpICovCiAjZGVmaW5lIFNPTF9SQVcJCTI1NQogI2RlZmluZSBTT0xfSVBYCQkyNTYKICNkZWZpbmUgU09MX0FYMjUJMjU3CkBAIC0yOTIsNyArMjkzLDcgQEAKIGV4dGVybiBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbWlvdmVjZW5kKHVuc2lnbmVkIGNoYXIgKmtkYXRhLCAKIAkJCQkJICBzdHJ1Y3QgaW92ZWMgKmlvdiwgCiAJCQkJCSAgaW50IG9mZnNldCwgCi0JCQkJCSAgdW5zaWduZWQgaW50IGxlbiwgaW50ICpjc3VtcCk7CisJCQkJCSAgdW5zaWduZWQgaW50IGxlbiwgX193c3VtICpjc3VtcCk7CiAKIGV4dGVybiBpbnQgdmVyaWZ5X2lvdmVjKHN0cnVjdCBtc2doZHIgKm0sIHN0cnVjdCBpb3ZlYyAqaW92LCBjaGFyICphZGRyZXNzLCBpbnQgbW9kZSk7CiBleHRlcm4gaW50IG1lbWNweV90b2lvdmVjKHN0cnVjdCBpb3ZlYyAqdiwgdW5zaWduZWQgY2hhciAqa2RhdGEsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NraW9zLmggYi9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaAppbmRleCBlNmI5ZDFkLi5hYmVmNzU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaApAQCAtNzIsOCArNzIsOCBAQAogI2RlZmluZSBTSU9DR0lGVFhRTEVOCTB4ODk0MgkJLyogR2V0IHRoZSB0eCBxdWV1ZSBsZW5ndGgJKi8KICNkZWZpbmUgU0lPQ1NJRlRYUUxFTgkweDg5NDMJCS8qIFNldCB0aGUgdHggcXVldWUgbGVuZ3RoIAkqLwogCi0jZGVmaW5lIFNJT0NHSUZESVZFUlQJMHg4OTQ0CQkvKiBGcmFtZSBkaXZlcnNpb24gc3VwcG9ydCAqLwotI2RlZmluZSBTSU9DU0lGRElWRVJUCTB4ODk0NQkJLyogU2V0IGZyYW1lIGRpdmVyc2lvbiBvcHRpb25zICovCisvKiBTSU9DR0lGRElWRVJUIHdhczoJMHg4OTQ0CQlGcmFtZSBkaXZlcnNpb24gc3VwcG9ydCAqLworLyogU0lPQ1NJRkRJVkVSVCB3YXM6CTB4ODk0NQkJU2V0IGZyYW1lIGRpdmVyc2lvbiBvcHRpb25zICovCiAKICNkZWZpbmUgU0lPQ0VUSFRPT0wJMHg4OTQ2CQkvKiBFdGh0b29sIGludGVyZmFjZQkJKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCmluZGV4IGI4MDBkMmQuLjg0NTEwNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKQEAgLTE4MywxMyArMTgzLDI3IEBACiAjZGVmaW5lIHJlYWRfbG9jayhsb2NrKQkJCV9yZWFkX2xvY2sobG9jaykKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCisKICNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCWZsYWdzID0gX3NwaW5fbG9ja19pcnFzYXZlKGxvY2spCiAjZGVmaW5lIHJlYWRfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQlmbGFncyA9IF9yZWFkX2xvY2tfaXJxc2F2ZShsb2NrKQogI2RlZmluZSB3cml0ZV9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCWZsYWdzID0gX3dyaXRlX2xvY2tfaXJxc2F2ZShsb2NrKQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKKyNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKGxvY2ssIGZsYWdzLCBzdWJjbGFzcykgXAorCWZsYWdzID0gX3NwaW5fbG9ja19pcnFzYXZlX25lc3RlZChsb2NrLCBzdWJjbGFzcykKICNlbHNlCisjZGVmaW5lIHNwaW5fbG9ja19pcnFzYXZlX25lc3RlZChsb2NrLCBmbGFncywgc3ViY2xhc3MpIFwKKwlmbGFncyA9IF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrKQorI2VuZGlmCisKKyNlbHNlCisKICNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCV9zcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykKICNkZWZpbmUgcmVhZF9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCV9yZWFkX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykKICNkZWZpbmUgd3JpdGVfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQlfd3JpdGVfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQorI2RlZmluZSBzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQobG9jaywgZmxhZ3MsIHN1YmNsYXNzKQlcCisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCisKICNlbmRpZgogCiAjZGVmaW5lIHNwaW5fbG9ja19pcnEobG9jaykJCV9zcGluX2xvY2tfaXJxKGxvY2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV9zbXAuaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oCmluZGV4IDg4MjhiODEuLjhhMjMwN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oCkBAIC0zMiw2ICszMiw4IEBACiB2b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX2xvY2tfaXJxKHJ3bG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhsb2NrKTsKIHVuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2lycXNhdmUoc3BpbmxvY2tfdCAqbG9jaykKIAkJCQkJCQlfX2FjcXVpcmVzKGxvY2spOwordW5zaWduZWQgbG9uZyBfX2xvY2tmdW5jIF9zcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQoc3BpbmxvY2tfdCAqbG9jaywgaW50IHN1YmNsYXNzKQorCQkJCQkJCV9fYWNxdWlyZXMobG9jayk7CiB1bnNpZ25lZCBsb25nIF9fbG9ja2Z1bmMgX3JlYWRfbG9ja19pcnFzYXZlKHJ3bG9ja190ICpsb2NrKQogCQkJCQkJCV9fYWNxdWlyZXMobG9jayk7CiB1bnNpZ25lZCBsb25nIF9fbG9ja2Z1bmMgX3dyaXRlX2xvY2tfaXJxc2F2ZShyd2xvY2tfdCAqbG9jaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKaW5kZXggYWM2OWU1NS4uOWE1MjdjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXN0cnVjdCBza19idWZmCSpza2I7CiAJdW5zaWduZWQgaW50CW9mZnNldDsKIAlzaXplX3QJCWNvdW50OwotCXVuc2lnbmVkIGludAljc3VtOworCV9fd3N1bQkJY3N1bTsKIH0gc2tiX3JlYWRlcl90OwogCiB0eXBlZGVmIHNpemVfdCAoKnNrYl9yZWFkX2FjdG9yX3QpKHNrYl9yZWFkZXJfdCAqZGVzYywgdm9pZCAqdG8sIHNpemVfdCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggZDk4NTYyZjEuLjk0MzE2YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtNDI2LDYgKzQyNiw4IEBACiAJTkVUX0NJUFNPVjRfQ0FDSEVfQlVDS0VUX1NJWkU9MTE5LAogCU5FVF9DSVBTT1Y0X1JCTV9PUFRGTVQ9MTIwLAogCU5FVF9DSVBTT1Y0X1JCTV9TVFJJQ1RWQUxJRD0xMjEsCisJTkVUX1RDUF9BVkFJTF9DT05HX0NPTlRST0w9MTIyLAorCU5FVF9UQ1BfQUxMT1dFRF9DT05HX0NPTlRST0w9MTIzLAogfTsKIAogZW51bSB7CkBAIC02MDQsMTYgKzYwNiw2IEBACiAJTkVUX0RDQ1BfREVGQVVMVD0xLAogfTsKIAotLyogL3Byb2Mvc3lzL25ldC9kY2NwL2RlZmF1bHQgKi8KLWVudW0gewotCU5FVF9EQ0NQX0RFRkFVTFRfU0VRX1dJTkRPVyAgPSAxLAotCU5FVF9EQ0NQX0RFRkFVTFRfUlhfQ0NJRCAgICAgPSAyLAotCU5FVF9EQ0NQX0RFRkFVTFRfVFhfQ0NJRCAgICAgPSAzLAotCU5FVF9EQ0NQX0RFRkFVTFRfQUNLX1JBVElPICAgPSA0LAotCU5FVF9EQ0NQX0RFRkFVTFRfU0VORF9BQ0tWRUMgPSA1LAotCU5FVF9EQ0NQX0RFRkFVTFRfU0VORF9ORFAgICAgPSA2LAotfTsKLQogLyogL3Byb2Mvc3lzL25ldC9pcHggKi8KIGVudW0gewogCU5FVF9JUFhfUFBST1BfQlJPQURDQVNUSU5HPTEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggNmQ1YzQzZC4uMjEyOWQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtOTcsNiArOTcsOSBAQAogc3lzZnNfcmVuYW1lX2RpcihzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBjaGFyICpuZXdfbmFtZSk7CiAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrCitzeXNmc19tb3ZlX2RpcihzdHJ1Y3Qga29iamVjdCAqLCBzdHJ1Y3Qga29iamVjdCAqKTsKKworZXh0ZXJuIGludCBfX211c3RfY2hlY2sKIHN5c2ZzX2NyZWF0ZV9maWxlKHN0cnVjdCBrb2JqZWN0ICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKik7CiAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrCkBAIC0xNDIsNiArMTQ1LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX21vdmVfZGlyKHN0cnVjdCBrb2JqZWN0ICogaywgc3RydWN0IGtvYmplY3QgKiBuZXdfcGFyZW50KQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBzeXNmc19jcmVhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGssIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3AuaCBiL2luY2x1ZGUvbGludXgvdGNwLmgKaW5kZXggMmQzNmY2ZC4uM2NjNzBkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KIAogc3RydWN0IHRjcGhkciB7CiAJX19iZTE2CXNvdXJjZTsKQEAgLTUxLDcgKzUyLDcgQEAKICNlcnJvcgkiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKICNlbmRpZgkKIAlfX2JlMTYJd2luZG93OwotCV9fYmUxNgljaGVjazsKKwlfX3N1bTE2CWNoZWNrOwogCV9fYmUxNgl1cmdfcHRyOwogfTsKIApAQCAtOTQsNiArOTUsNyBAQAogI2RlZmluZSBUQ1BfSU5GTwkJMTEJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25uZWN0aW9uLiAqLwogI2RlZmluZSBUQ1BfUVVJQ0tBQ0sJCTEyCS8qIEJsb2NrL3JlZW5hYmxlIHF1aWNrIGFja3MgKi8KICNkZWZpbmUgVENQX0NPTkdFU1RJT04JCTEzCS8qIENvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gKi8KKyNkZWZpbmUgVENQX01ENVNJRwkJMTQJLyogVENQIE1ENSBTaWduYXR1cmUgKFJGQzIzODUpICovCiAKICNkZWZpbmUgVENQSV9PUFRfVElNRVNUQU1QUwkxCiAjZGVmaW5lIFRDUElfT1BUX1NBQ0sJCTIKQEAgLTE1Nyw2ICsxNTksMTcgQEAKIAlfX3UzMgl0Y3BpX3RvdGFsX3JldHJhbnM7CiB9OwogCisvKiBmb3IgVENQX01ENVNJRyBzb2NrZXQgb3B0aW9uICovCisjZGVmaW5lIFRDUF9NRDVTSUdfTUFYS0VZTEVOCTgwCisKK3N0cnVjdCB0Y3BfbWQ1c2lnIHsKKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSB0Y3BtX2FkZHI7CS8qIGFkZHJlc3MgYXNzb2NpYXRlZCAqLworCV9fdTE2CV9fdGNwbV9wYWQxOwkJCQkvKiB6ZXJvICovCisJX191MTYJdGNwbV9rZXlsZW47CQkJCS8qIGtleSBsZW5ndGggKi8KKwlfX3UzMglfX3RjcG1fcGFkMjsJCQkJLyogemVybyAqLworCV9fdTgJdGNwbV9rZXlbVENQX01ENVNJR19NQVhLRVlMRU5dOwkJLyoga2V5IChiaW5hcnkpICovCit9OworCiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0xNzIsMTcgKzE4NSwxNyBAQAogfTsKIAogc3RydWN0IHRjcF9zYWNrX2Jsb2NrIHsKLQlfX3UzMglzdGFydF9zZXE7Ci0JX191MzIJZW5kX3NlcTsKKwl1MzIJc3RhcnRfc2VxOworCXUzMgllbmRfc2VxOwogfTsKIAogc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHsKIC8qCVBBV1MvUlRUTSBkYXRhCSovCiAJbG9uZwl0c19yZWNlbnRfc3RhbXA7LyogVGltZSB3ZSBzdG9yZWQgdHNfcmVjZW50IChmb3IgYWdpbmcpICovCi0JX191MzIJdHNfcmVjZW50OwkvKiBUaW1lIHN0YW1wIHRvIGVjaG8gbmV4dAkJKi8KLQlfX3UzMglyY3ZfdHN2YWw7CS8qIFRpbWUgc3RhbXAgdmFsdWUgICAgICAgICAgICAgCSovCi0JX191MzIJcmN2X3RzZWNyOwkvKiBUaW1lIHN0YW1wIGVjaG8gcmVwbHkgICAgICAgIAkqLwotCV9fdTE2IAlzYXdfdHN0YW1wIDogMSwJLyogU2F3IFRJTUVTVEFNUCBvbiBsYXN0IHBhY2tldAkJKi8KKwl1MzIJdHNfcmVjZW50OwkvKiBUaW1lIHN0YW1wIHRvIGVjaG8gbmV4dAkJKi8KKwl1MzIJcmN2X3RzdmFsOwkvKiBUaW1lIHN0YW1wIHZhbHVlICAgICAgICAgICAgIAkqLworCXUzMglyY3ZfdHNlY3I7CS8qIFRpbWUgc3RhbXAgZWNobyByZXBseSAgICAgICAgCSovCisJdTE2IAlzYXdfdHN0YW1wIDogMSwJLyogU2F3IFRJTUVTVEFNUCBvbiBsYXN0IHBhY2tldAkJKi8KIAkJdHN0YW1wX29rIDogMSwJLyogVElNRVNUQU1QIHNlZW4gb24gU1lOIHBhY2tldAkJKi8KIAkJZHNhY2sgOiAxLAkvKiBELVNBQ0sgaXMgc2NoZWR1bGVkCQkJKi8KIAkJd3NjYWxlX29rIDogMSwJLyogV3NjYWxlIHNlZW4gb24gU1lOIHBhY2tldAkJKi8KQEAgLTE5MCwxNiArMjAzLDIwIEBACiAJCXNuZF93c2NhbGUgOiA0LAkvKiBXaW5kb3cgc2NhbGluZyByZWNlaXZlZCBmcm9tIHNlbmRlcgkqLwogCQlyY3Zfd3NjYWxlIDogNDsJLyogV2luZG93IHNjYWxpbmcgdG8gc2VuZCB0byByZWNlaXZlcgkqLwogLyoJU0FDS3MgZGF0YQkqLwotCV9fdTgJZWZmX3NhY2tzOwkvKiBTaXplIG9mIFNBQ0sgYXJyYXkgdG8gc2VuZCB3aXRoIG5leHQgcGFja2V0ICovCi0JX191OAludW1fc2Fja3M7CS8qIE51bWJlciBvZiBTQUNLIGJsb2NrcwkJKi8KLQlfX3UxNgl1c2VyX21zczsgIAkvKiBtc3MgcmVxdWVzdGVkIGJ5IHVzZXIgaW4gaW9jdGwgKi8KLQlfX3UxNgltc3NfY2xhbXA7CS8qIE1heGltYWwgbXNzLCBuZWdvdGlhdGVkIGF0IGNvbm5lY3Rpb24gc2V0dXAgKi8KKwl1OAllZmZfc2Fja3M7CS8qIFNpemUgb2YgU0FDSyBhcnJheSB0byBzZW5kIHdpdGggbmV4dCBwYWNrZXQgKi8KKwl1OAludW1fc2Fja3M7CS8qIE51bWJlciBvZiBTQUNLIGJsb2NrcwkJKi8KKwl1MTYJdXNlcl9tc3M7ICAJLyogbXNzIHJlcXVlc3RlZCBieSB1c2VyIGluIGlvY3RsICovCisJdTE2CW1zc19jbGFtcDsJLyogTWF4aW1hbCBtc3MsIG5lZ290aWF0ZWQgYXQgY29ubmVjdGlvbiBzZXR1cCAqLwogfTsKIAogc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgewotCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayByZXE7Ci0JX191MzIJCQkgcmN2X2lzbjsKLQlfX3UzMgkJCSBzbnRfaXNuOworCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAJcmVxOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogT25seSB1c2VkIGJ5IFRDUCBNRDUgU2lnbmF0dXJlIHNvIGZhci4gKi8KKwlzdHJ1Y3QgdGNwX3JlcXVlc3Rfc29ja19vcHMJKmFmX3NwZWNpZmljOworI2VuZGlmCisJdTMyCQkJIAlyY3ZfaXNuOworCXUzMgkJCSAJc250X2lzbjsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgKnRjcF9yc2soY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQpAQCAtMjEwLDcgKzIyNyw4IEBACiBzdHJ1Y3QgdGNwX3NvY2sgewogCS8qIGluZXRfY29ubmVjdGlvbl9zb2NrIGhhcyB0byBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHRjcF9zb2NrICovCiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrCWluZXRfY29ubjsKLQlpbnQJdGNwX2hlYWRlcl9sZW47CS8qIEJ5dGVzIG9mIHRjcCBoZWFkZXIgdG8gc2VuZAkJKi8KKwl1MTYJdGNwX2hlYWRlcl9sZW47CS8qIEJ5dGVzIG9mIHRjcCBoZWFkZXIgdG8gc2VuZAkJKi8KKwl1MTYJeG1pdF9zaXplX2dvYWw7CS8qIEdvYWwgZm9yIHNlZ21lbnRpbmcgb3V0cHV0IHBhY2tldHMJKi8KIAogLyoKICAqCUhlYWRlciBwcmVkaWN0aW9uIGZsYWdzCkBAIC0yMjMsMTMgKzI0MSwxMyBAQAogICoJcmVhZCB0aGUgY29kZSBhbmQgdGhlIHNwZWMgc2lkZSBieSBzaWRlIChhbmQgbGF1Z2ggLi4uKQogICoJU2VlIFJGQzc5MyBhbmQgUkZDMTEyMi4gVGhlIFJGQyB3cml0ZXMgdGhlc2UgaW4gY2FwaXRhbHMuCiAgKi8KLSAJX191MzIJcmN2X254dDsJLyogV2hhdCB3ZSB3YW50IHRvIHJlY2VpdmUgbmV4dCAJKi8KLSAJX191MzIJc25kX254dDsJLyogTmV4dCBzZXF1ZW5jZSB3ZSBzZW5kCQkqLworIAl1MzIJcmN2X254dDsJLyogV2hhdCB3ZSB3YW50IHRvIHJlY2VpdmUgbmV4dCAJKi8KKyAJdTMyCXNuZF9ueHQ7CS8qIE5leHQgc2VxdWVuY2Ugd2Ugc2VuZAkJKi8KIAotIAlfX3UzMglzbmRfdW5hOwkvKiBGaXJzdCBieXRlIHdlIHdhbnQgYW4gYWNrIGZvcgkqLwotIAlfX3UzMglzbmRfc21sOwkvKiBMYXN0IGJ5dGUgb2YgdGhlIG1vc3QgcmVjZW50bHkgdHJhbnNtaXR0ZWQgc21hbGwgcGFja2V0ICovCi0JX191MzIJcmN2X3RzdGFtcDsJLyogdGltZXN0YW1wIG9mIGxhc3QgcmVjZWl2ZWQgQUNLIChmb3Iga2VlcGFsaXZlcykgKi8KLQlfX3UzMglsc25kdGltZTsJLyogdGltZXN0YW1wIG9mIGxhc3Qgc2VudCBkYXRhIHBhY2tldCAoZm9yIHJlc3RhcnQgd2luZG93KSAqLworIAl1MzIJc25kX3VuYTsJLyogRmlyc3QgYnl0ZSB3ZSB3YW50IGFuIGFjayBmb3IJKi8KKyAJdTMyCXNuZF9zbWw7CS8qIExhc3QgYnl0ZSBvZiB0aGUgbW9zdCByZWNlbnRseSB0cmFuc21pdHRlZCBzbWFsbCBwYWNrZXQgKi8KKwl1MzIJcmN2X3RzdGFtcDsJLyogdGltZXN0YW1wIG9mIGxhc3QgcmVjZWl2ZWQgQUNLIChmb3Iga2VlcGFsaXZlcykgKi8KKwl1MzIJbHNuZHRpbWU7CS8qIHRpbWVzdGFtcCBvZiBsYXN0IHNlbnQgZGF0YSBwYWNrZXQgKGZvciByZXN0YXJ0IHdpbmRvdykgKi8KIAogCS8qIERhdGEgZm9yIGRpcmVjdCBjb3B5IHRvIHVzZXIgKi8KIAlzdHJ1Y3QgewpAQCAtMjQ3LDMyICsyNjUsMzAgQEAKICNlbmRpZgogCX0gdWNvcHk7CiAKLQlfX3UzMglzbmRfd2wxOwkvKiBTZXF1ZW5jZSBmb3Igd2luZG93IHVwZGF0ZQkJKi8KLQlfX3UzMglzbmRfd25kOwkvKiBUaGUgd2luZG93IHdlIGV4cGVjdCB0byByZWNlaXZlCSovCi0JX191MzIJbWF4X3dpbmRvdzsJLyogTWF4aW1hbCB3aW5kb3cgZXZlciBzZWVuIGZyb20gcGVlcgkqLwotCV9fdTMyCW1zc19jYWNoZTsJLyogQ2FjaGVkIGVmZmVjdGl2ZSBtc3MsIG5vdCBpbmNsdWRpbmcgU0FDS1MgKi8KLQlfX3UxNgl4bWl0X3NpemVfZ29hbDsJLyogR29hbCBmb3Igc2VnbWVudGluZyBvdXRwdXQgcGFja2V0cwkqLwotCS8qIFhYWCBUd28gYnl0ZXMgaG9sZSwgdHJ5IHRvIHBhY2sgKi8KKwl1MzIJc25kX3dsMTsJLyogU2VxdWVuY2UgZm9yIHdpbmRvdyB1cGRhdGUJCSovCisJdTMyCXNuZF93bmQ7CS8qIFRoZSB3aW5kb3cgd2UgZXhwZWN0IHRvIHJlY2VpdmUJKi8KKwl1MzIJbWF4X3dpbmRvdzsJLyogTWF4aW1hbCB3aW5kb3cgZXZlciBzZWVuIGZyb20gcGVlcgkqLworCXUzMgltc3NfY2FjaGU7CS8qIENhY2hlZCBlZmZlY3RpdmUgbXNzLCBub3QgaW5jbHVkaW5nIFNBQ0tTICovCiAKLQlfX3UzMgl3aW5kb3dfY2xhbXA7CS8qIE1heGltYWwgd2luZG93IHRvIGFkdmVydGlzZQkJKi8KLQlfX3UzMglyY3Zfc3N0aHJlc2g7CS8qIEN1cnJlbnQgd2luZG93IGNsYW1wCQkJKi8KKwl1MzIJd2luZG93X2NsYW1wOwkvKiBNYXhpbWFsIHdpbmRvdyB0byBhZHZlcnRpc2UJCSovCisJdTMyCXJjdl9zc3RocmVzaDsJLyogQ3VycmVudCB3aW5kb3cgY2xhbXAJCQkqLwogCi0JX191MzIJZnJ0b19oaWdobWFyazsJLyogc25kX254dCB3aGVuIFJUTyBvY2N1cnJlZCAqLwotCV9fdTgJcmVvcmRlcmluZzsJLyogUGFja2V0IHJlb3JkZXJpbmcgbWV0cmljLgkJKi8KLQlfX3U4CWZydG9fY291bnRlcjsJLyogTnVtYmVyIG9mIG5ldyBhY2tzIGFmdGVyIFJUTyAqLwotCV9fdTgJbm9uYWdsZTsJLyogRGlzYWJsZSBOYWdsZSBhbGdvcml0aG0/ICAgICAgICAgICAgICovCi0JX191OAlrZWVwYWxpdmVfcHJvYmVzOyAvKiBudW0gb2YgYWxsb3dlZCBrZWVwIGFsaXZlIHByb2JlcwkqLworCXUzMglmcnRvX2hpZ2htYXJrOwkvKiBzbmRfbnh0IHdoZW4gUlRPIG9jY3VycmVkICovCisJdTgJcmVvcmRlcmluZzsJLyogUGFja2V0IHJlb3JkZXJpbmcgbWV0cmljLgkJKi8KKwl1OAlmcnRvX2NvdW50ZXI7CS8qIE51bWJlciBvZiBuZXcgYWNrcyBhZnRlciBSVE8gKi8KKwl1OAlub25hZ2xlOwkvKiBEaXNhYmxlIE5hZ2xlIGFsZ29yaXRobT8gICAgICAgICAgICAgKi8KKwl1OAlrZWVwYWxpdmVfcHJvYmVzOyAvKiBudW0gb2YgYWxsb3dlZCBrZWVwIGFsaXZlIHByb2JlcwkqLwogCiAvKiBSVFQgbWVhc3VyZW1lbnQgKi8KLQlfX3UzMglzcnR0OwkJLyogc21vb3RoZWQgcm91bmQgdHJpcCB0aW1lIDw8IDMJKi8KLQlfX3UzMgltZGV2OwkJLyogbWVkaXVtIGRldmlhdGlvbgkJCSovCi0JX191MzIJbWRldl9tYXg7CS8qIG1heGltYWwgbWRldiBmb3IgdGhlIGxhc3QgcnR0IHBlcmlvZAkqLwotCV9fdTMyCXJ0dHZhcjsJCS8qIHNtb290aGVkIG1kZXZfbWF4CQkJKi8KLQlfX3UzMglydHRfc2VxOwkvKiBzZXF1ZW5jZSBudW1iZXIgdG8gdXBkYXRlIHJ0dHZhcgkqLworCXUzMglzcnR0OwkJLyogc21vb3RoZWQgcm91bmQgdHJpcCB0aW1lIDw8IDMJKi8KKwl1MzIJbWRldjsJCS8qIG1lZGl1bSBkZXZpYXRpb24JCQkqLworCXUzMgltZGV2X21heDsJLyogbWF4aW1hbCBtZGV2IGZvciB0aGUgbGFzdCBydHQgcGVyaW9kCSovCisJdTMyCXJ0dHZhcjsJCS8qIHNtb290aGVkIG1kZXZfbWF4CQkJKi8KKwl1MzIJcnR0X3NlcTsJLyogc2VxdWVuY2UgbnVtYmVyIHRvIHVwZGF0ZSBydHR2YXIJKi8KIAotCV9fdTMyCXBhY2tldHNfb3V0OwkvKiBQYWNrZXRzIHdoaWNoIGFyZSAiaW4gZmxpZ2h0IgkqLwotCV9fdTMyCWxlZnRfb3V0OwkvKiBQYWNrZXRzIHdoaWNoIGxlYXZlZCBuZXR3b3JrCSovCi0JX191MzIJcmV0cmFuc19vdXQ7CS8qIFJldHJhbnNtaXR0ZWQgcGFja2V0cyBvdXQJCSovCisJdTMyCXBhY2tldHNfb3V0OwkvKiBQYWNrZXRzIHdoaWNoIGFyZSAiaW4gZmxpZ2h0IgkqLworCXUzMglsZWZ0X291dDsJLyogUGFja2V0cyB3aGljaCBsZWF2ZWQgbmV0d29yawkqLworCXUzMglyZXRyYW5zX291dDsJLyogUmV0cmFuc21pdHRlZCBwYWNrZXRzIG91dAkJKi8KIC8qCiAgKiAgICAgIE9wdGlvbnMgcmVjZWl2ZWQgKHVzdWFsbHkgb24gbGFzdCBwYWNrZXQsIHNvbWUgb25seSBvbiBTWU4gcGFja2V0cykuCiAgKi8KQEAgLTI4MSwyMCArMjk3LDIwIEBACiAvKgogICoJU2xvdyBzdGFydCBhbmQgY29uZ2VzdGlvbiBjb250cm9sIChzZWUgYWxzbyBOYWdsZSwgYW5kIEthcm4gJiBQYXJ0cmlkZ2UpCiAgKi8KLSAJX191MzIJc25kX3NzdGhyZXNoOwkvKiBTbG93IHN0YXJ0IHNpemUgdGhyZXNob2xkCQkqLwotIAlfX3UzMglzbmRfY3duZDsJLyogU2VuZGluZyBjb25nZXN0aW9uIHdpbmRvdwkJKi8KLSAJX191MTYJc25kX2N3bmRfY250OwkvKiBMaW5lYXIgaW5jcmVhc2UgY291bnRlcgkJKi8KLQlfX3UxNglzbmRfY3duZF9jbGFtcDsgLyogRG8gbm90IGFsbG93IHNuZF9jd25kIHRvIGdyb3cgYWJvdmUgdGhpcyAqLwotCV9fdTMyCXNuZF9jd25kX3VzZWQ7Ci0JX191MzIJc25kX2N3bmRfc3RhbXA7CisgCXUzMglzbmRfc3N0aHJlc2g7CS8qIFNsb3cgc3RhcnQgc2l6ZSB0aHJlc2hvbGQJCSovCisgCXUzMglzbmRfY3duZDsJLyogU2VuZGluZyBjb25nZXN0aW9uIHdpbmRvdwkJKi8KKyAJdTE2CXNuZF9jd25kX2NudDsJLyogTGluZWFyIGluY3JlYXNlIGNvdW50ZXIJCSovCisJdTE2CXNuZF9jd25kX2NsYW1wOyAvKiBEbyBub3QgYWxsb3cgc25kX2N3bmQgdG8gZ3JvdyBhYm92ZSB0aGlzICovCisJdTMyCXNuZF9jd25kX3VzZWQ7CisJdTMyCXNuZF9jd25kX3N0YW1wOwogCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlvdXRfb2Zfb3JkZXJfcXVldWU7IC8qIE91dCBvZiBvcmRlciBzZWdtZW50cyBnbyBoZXJlICovCiAKLSAJX191MzIJcmN2X3duZDsJLyogQ3VycmVudCByZWNlaXZlciB3aW5kb3cJCSovCi0JX191MzIJcmN2X3d1cDsJLyogcmN2X254dCBvbiBsYXN0IHdpbmRvdyB1cGRhdGUgc2VudAkqLwotCV9fdTMyCXdyaXRlX3NlcTsJLyogVGFpbCgrMSkgb2YgZGF0YSBoZWxkIGluIHRjcCBzZW5kIGJ1ZmZlciAqLwotCV9fdTMyCXB1c2hlZF9zZXE7CS8qIExhc3QgcHVzaGVkIHNlcSwgcmVxdWlyZWQgdG8gdGFsayB0byB3aW5kb3dzICovCi0JX191MzIJY29waWVkX3NlcTsJLyogSGVhZCBvZiB5ZXQgdW5yZWFkIGRhdGEJCSovCisgCXUzMglyY3Zfd25kOwkvKiBDdXJyZW50IHJlY2VpdmVyIHdpbmRvdwkJKi8KKwl1MzIJcmN2X3d1cDsJLyogcmN2X254dCBvbiBsYXN0IHdpbmRvdyB1cGRhdGUgc2VudAkqLworCXUzMgl3cml0ZV9zZXE7CS8qIFRhaWwoKzEpIG9mIGRhdGEgaGVsZCBpbiB0Y3Agc2VuZCBidWZmZXIgKi8KKwl1MzIJcHVzaGVkX3NlcTsJLyogTGFzdCBwdXNoZWQgc2VxLCByZXF1aXJlZCB0byB0YWxrIHRvIHdpbmRvd3MgKi8KKwl1MzIJY29waWVkX3NlcTsJLyogSGVhZCBvZiB5ZXQgdW5yZWFkIGRhdGEJCSovCiAKIC8qCVNBQ0tzIGRhdGEJKi8KIAlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgZHVwbGljYXRlX3NhY2tbMV07IC8qIEQtU0FDSyBibG9jayAqLwpAQCAtMzE1LDI2ICszMzEsMjYgQEAKIAlpbnQgICAgIHJldHJhbnNtaXRfY250X2hpbnQ7CiAJaW50ICAgICBmb3J3YXJkX2NudF9oaW50OwogCi0JX191MTYJYWR2bXNzOwkJLyogQWR2ZXJ0aXNlZCBNU1MJCQkqLwotCV9fdTE2CXByaW9yX3NzdGhyZXNoOyAvKiBzc3RocmVzaCBzYXZlZCBhdCByZWNvdmVyeSBzdGFydAkqLwotCV9fdTMyCWxvc3Rfb3V0OwkvKiBMb3N0IHBhY2tldHMJCQkqLwotCV9fdTMyCXNhY2tlZF9vdXQ7CS8qIFNBQ0snZCBwYWNrZXRzCQkJKi8KLQlfX3UzMglmYWNrZXRzX291dDsJLyogRkFDSydkIHBhY2tldHMJCQkqLwotCV9fdTMyCWhpZ2hfc2VxOwkvKiBzbmRfbnh0IGF0IG9uc2V0IG9mIGNvbmdlc3Rpb24JKi8KKwl1MTYJYWR2bXNzOwkJLyogQWR2ZXJ0aXNlZCBNU1MJCQkqLworCXUxNglwcmlvcl9zc3RocmVzaDsgLyogc3N0aHJlc2ggc2F2ZWQgYXQgcmVjb3Zlcnkgc3RhcnQJKi8KKwl1MzIJbG9zdF9vdXQ7CS8qIExvc3QgcGFja2V0cwkJCSovCisJdTMyCXNhY2tlZF9vdXQ7CS8qIFNBQ0snZCBwYWNrZXRzCQkJKi8KKwl1MzIJZmFja2V0c19vdXQ7CS8qIEZBQ0snZCBwYWNrZXRzCQkJKi8KKwl1MzIJaGlnaF9zZXE7CS8qIHNuZF9ueHQgYXQgb25zZXQgb2YgY29uZ2VzdGlvbgkqLwogCi0JX191MzIJcmV0cmFuc19zdGFtcDsJLyogVGltZXN0YW1wIG9mIHRoZSBsYXN0IHJldHJhbnNtaXQsCisJdTMyCXJldHJhbnNfc3RhbXA7CS8qIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCByZXRyYW5zbWl0LAogCQkJCSAqIGFsc28gdXNlZCBpbiBTWU4tU0VOVCB0byByZW1lbWJlciBzdGFtcCBvZgogCQkJCSAqIHRoZSBmaXJzdCBTWU4uICovCi0JX191MzIJdW5kb19tYXJrZXI7CS8qIHRyYWNraW5nIHJldHJhbnMgc3RhcnRlZCBoZXJlLiAqLworCXUzMgl1bmRvX21hcmtlcjsJLyogdHJhY2tpbmcgcmV0cmFucyBzdGFydGVkIGhlcmUuICovCiAJaW50CXVuZG9fcmV0cmFuczsJLyogbnVtYmVyIG9mIHVuZG9hYmxlIHJldHJhbnNtaXNzaW9ucy4gKi8KLQlfX3UzMgl1cmdfc2VxOwkvKiBTZXEgb2YgcmVjZWl2ZWQgdXJnZW50IHBvaW50ZXIgKi8KLQlfX3UxNgl1cmdfZGF0YTsJLyogU2F2ZWQgb2N0ZXQgb2YgT09CIGRhdGEgYW5kIGNvbnRyb2wgZmxhZ3MgKi8KLQlfX3U4CXVyZ19tb2RlOwkvKiBJbiB1cmdlbnQgbW9kZQkJKi8KLQlfX3U4CWVjbl9mbGFnczsJLyogRUNOIHN0YXR1cyBiaXRzLgkJCSovCi0JX191MzIJc25kX3VwOwkJLyogVXJnZW50IHBvaW50ZXIJCSovCisJdTMyCXVyZ19zZXE7CS8qIFNlcSBvZiByZWNlaXZlZCB1cmdlbnQgcG9pbnRlciAqLworCXUxNgl1cmdfZGF0YTsJLyogU2F2ZWQgb2N0ZXQgb2YgT09CIGRhdGEgYW5kIGNvbnRyb2wgZmxhZ3MgKi8KKwl1OAl1cmdfbW9kZTsJLyogSW4gdXJnZW50IG1vZGUJCSovCisJdTgJZWNuX2ZsYWdzOwkvKiBFQ04gc3RhdHVzIGJpdHMuCQkJKi8KKwl1MzIJc25kX3VwOwkJLyogVXJnZW50IHBvaW50ZXIJCSovCiAKLQlfX3UzMgl0b3RhbF9yZXRyYW5zOwkvKiBUb3RhbCByZXRyYW5zbWl0cyBmb3IgZW50aXJlIGNvbm5lY3Rpb24gKi8KLQlfX3UzMglieXRlc19hY2tlZDsJLyogQXBwcm9wcmlhdGUgQnl0ZSBDb3VudGluZyAtIFJGQzM0NjUgKi8KKwl1MzIJdG90YWxfcmV0cmFuczsJLyogVG90YWwgcmV0cmFuc21pdHMgZm9yIGVudGlyZSBjb25uZWN0aW9uICovCisJdTMyCWJ5dGVzX2Fja2VkOwkvKiBBcHByb3ByaWF0ZSBCeXRlIENvdW50aW5nIC0gUkZDMzQ2NSAqLwogCiAJdW5zaWduZWQgaW50CQlrZWVwYWxpdmVfdGltZTsJICAvKiB0aW1lIGJlZm9yZSBrZWVwIGFsaXZlIHRha2VzIHBsYWNlICovCiAJdW5zaWduZWQgaW50CQlrZWVwYWxpdmVfaW50dmw7ICAvKiB0aW1lIGludGVydmFsIGJldHdlZW4ga2VlcCBhbGl2ZSBwcm9iZXMgKi8KQEAgLTM0MiwyNyArMzU4LDM1IEBACiAKIAl1bnNpZ25lZCBsb25nIGxhc3Rfc3lucV9vdmVyZmxvdzsgCiAKLQlfX3UzMgl0c29fZGVmZXJyZWQ7CisJdTMyCXRzb19kZWZlcnJlZDsKIAogLyogUmVjZWl2ZXIgc2lkZSBSVFQgZXN0aW1hdGlvbiAqLwogCXN0cnVjdCB7Ci0JCV9fdTMyCXJ0dDsKLQkJX191MzIJc2VxOwotCQlfX3UzMgl0aW1lOworCQl1MzIJcnR0OworCQl1MzIJc2VxOworCQl1MzIJdGltZTsKIAl9IHJjdl9ydHRfZXN0OwogCiAvKiBSZWNlaXZlciBxdWV1ZSBzcGFjZSAqLwogCXN0cnVjdCB7CiAJCWludAlzcGFjZTsKLQkJX191MzIJc2VxOwotCQlfX3UzMgl0aW1lOworCQl1MzIJc2VxOworCQl1MzIJdGltZTsKIAl9IHJjdnFfc3BhY2U7CiAKIC8qIFRDUC1zcGVjaWZpYyBNVFUgcHJvYmUgaW5mb3JtYXRpb24uICovCiAJc3RydWN0IHsKLQkJX191MzIJCSAgcHJvYmVfc2VxX3N0YXJ0OwotCQlfX3UzMgkJICBwcm9iZV9zZXFfZW5kOworCQl1MzIJCSAgcHJvYmVfc2VxX3N0YXJ0OworCQl1MzIJCSAgcHJvYmVfc2VxX2VuZDsKIAl9IG10dV9wcm9iZTsKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisvKiBUQ1AgQUYtU3BlY2lmaWMgcGFydHM7IG9ubHkgdXNlZCBieSBNRDUgU2lnbmF0dXJlIHN1cHBvcnQgc28gZmFyICovCisJc3RydWN0IHRjcF9zb2NrX2FmX29wcwkqYWZfc3BlY2lmaWM7CisKKy8qIFRDUCBNRDUgU2lnbmFndXJlIE9wdGlvbiBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8JKm1kNXNpZ19pbmZvOworI2VuZGlmCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y3Bfc29jayAqdGNwX3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKQEAgLTM3MiwxMSArMzk2LDE1IEBACiAKIHN0cnVjdCB0Y3BfdGltZXdhaXRfc29jayB7CiAJc3RydWN0IGluZXRfdGltZXdhaXRfc29jayB0d19zazsKLQlfX3UzMgkJCSAgdHdfcmN2X254dDsKLQlfX3UzMgkJCSAgdHdfc25kX254dDsKLQlfX3UzMgkJCSAgdHdfcmN2X3duZDsKLQlfX3UzMgkJCSAgdHdfdHNfcmVjZW50OworCXUzMgkJCSAgdHdfcmN2X254dDsKKwl1MzIJCQkgIHR3X3NuZF9ueHQ7CisJdTMyCQkJICB0d19yY3Zfd25kOworCXUzMgkJCSAgdHdfdHNfcmVjZW50OwogCWxvbmcJCQkgIHR3X3RzX3JlY2VudF9zdGFtcDsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXUxNgkJCSAgdHdfbWQ1X2tleWxlbjsKKwl1OAkJCSAgdHdfbWQ1X2tleVtUQ1BfTUQ1U0lHX01BWEtFWUxFTl07CisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF90aW1ld2FpdF9zb2NrICp0Y3BfdHdzayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaCBiL2luY2x1ZGUvbGludXgvdGV4dHNlYXJjaC5oCmluZGV4IDdkYWM4ZjAuLjAwNDgwOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGV4dHNlYXJjaC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGV4dHNlYXJjaC5oCkBAIC0yMCw3ICsyMCw3IEBACiAvKioKICAqIHN0cnVjdCB0c19zdGF0ZSAtIHNlYXJjaCBzdGF0ZQogICogQG9mZnNldDogb2Zmc2V0IGZvciBuZXh0IG1hdGNoCi0gKiBAY2I6IGNvbnRyb2wgYnVmZmVyLCBmb3IgcGVyc2lzdGFudCB2YXJpYWJsZXMgb2YgZ2V0X25leHRfYmxvY2soKQorICogQGNiOiBjb250cm9sIGJ1ZmZlciwgZm9yIHBlcnNpc3RlbnQgdmFyaWFibGVzIG9mIGdldF9uZXh0X2Jsb2NrKCkKICAqLwogc3RydWN0IHRzX3N0YXRlCiB7CkBAIC03MSw3ICs3MSw3IEBACiAJICogQ2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgMCBpcyByZXR1cm5lZC4gTXVzdCBhc3NpZ24gdGhlCiAJICogaGVhZCBvZiB0aGUgbmV4dCBibG9jayBvZiBkYXRhIHRvICYqZHN0IGFuZCByZXR1cm4gdGhlIGxlbmd0aAogCSAqIG9mIHRoZSBibG9jayBvciAwIGlmIGF0IHRoZSBlbmQuIGNvbnN1bWVkID09IDAgaW5kaWNhdGVzCi0JICogYSBuZXcgc2VhcmNoLiBNYXkgc3RvcmUvcmVhZCBwZXJzaXN0YW50IHZhbHVlcyBpbiBzdGF0ZS0+Y2IuCisJICogYSBuZXcgc2VhcmNoLiBNYXkgc3RvcmUvcmVhZCBwZXJzaXN0ZW50IHZhbHVlcyBpbiBzdGF0ZS0+Y2IuCiAJICovCiAJdW5zaWduZWQgaW50CQkoKmdldF9uZXh0X2Jsb2NrKSh1bnNpZ25lZCBpbnQgY29uc3VtZWQsCiAJCQkJCQkgIGNvbnN0IHU4ICoqZHN0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90ZnJjLmggYi9pbmNsdWRlL2xpbnV4L3RmcmMuaAppbmRleCA3ZGFiNzgzLi4zMWE5YjI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RmcmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RmcmMuaApAQCAtMSw3ICsxLDggQEAKICNpZm5kZWYgX0xJTlVYX1RGUkNfSF8KICNkZWZpbmUgX0xJTlVYX1RGUkNfSF8KIC8qCi0gKiAgaW5jbHVkZS9saW51eC90ZnJjLmgKKyAqICBURlJDIC0gRGF0YSBTdHJ1Y3R1cmVzIGZvciB0aGUgVENQLUZyaWVuZGx5IFJhdGUgQ29udHJvbCBjb25nZXN0aW9uCisgKiAgICAgICAgIGNvbnRyb2wgbWVjaGFuaXNtIGFzIHNwZWNpZmllZCBpbiBSRkMgMzQ0OC4KICAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBVbml2ZXJzaXR5IG9mIFdhaWthdG8sIEhhbWlsdG9uLCBOZXcgWmVhbGFuZC4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDUgSWFuIE1jRG9uYWxkIDxpYW00QGNzLndhaWthdG8uYWMubno+CkBAIC0xMywxNSArMTQsMzAgQEAKICAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKKy8qKiAJdGZyY19yeF9pbmZvICAgIC0gICAgVEZSQyBSZWNlaXZlciBEYXRhIFN0cnVjdHVyZQorICoKKyAqIAlAdGZyY3J4X3hfcmVjdjoJcmVjZWl2ZXIgZXN0aW1hdGUgb2Ygc2VuZGluZyByYXRlICgzLjIuMikKKyAqIAlAdGZyY3J4X3J0dDoJcm91bmQtdHJpcC10aW1lIChjb21tdW5pY2F0ZWQgYnkgc2VuZGVyKQorICogCUB0ZnJjcnhfcDoJY3VycmVudCBlc3RpbWF0ZSBvZiBsb3NzIGV2ZW50IHJhdGUgKDMuMi4yKQorICovCiBzdHJ1Y3QgdGZyY19yeF9pbmZvIHsKICAgCV9fdTMyIHRmcmNyeF94X3JlY3Y7CiAJX191MzIgdGZyY3J4X3J0dDsKICAgCV9fdTMyIHRmcmNyeF9wOwogfTsKIAorLyoqIAl0ZnJjX3R4X2luZm8gICAgLSAgICBURlJDIFNlbmRlciBEYXRhIFN0cnVjdHVyZQorICoKKyAqIAlAdGZyY3R4X3g6CWNvbXB1dGVkIHRyYW5zbWl0IHJhdGUgKDQuMyAoNCkpCisgKiAJQHRmcmN0eF94X3JlY3Y6IHJlY2VpdmVyIGVzdGltYXRlIG9mIHNlbmQgcmF0ZSAoNC4zKQorICogCUB0ZnJjdHhfeF9jYWxjOglyZXR1cm4gdmFsdWUgb2YgdGhyb3VnaHB1dCBlcXVhdGlvbiAoMy4xKQorICogCUB0ZnJjdHhfcnR0OgkobW92aW5nIGF2ZXJhZ2UpIGVzdGltYXRlIG9mIFJUVCAoNC4zKQorICogCUB0ZnJjdHhfcDoJY3VycmVudCBsb3NzIGV2ZW50IHJhdGUgKDUuNCkKKyAqIAlAdGZyY3R4X3J0bzoJZXN0aW1hdGUgb2YgUlRPLCBlcXVhbHMgNCpSVFQgKDQuMykKKyAqIAlAdGZyY3R4X2lwaToJaW50ZXItcGFja2V0IGludGVydmFsICg0LjYpCisgKi8KIHN0cnVjdCB0ZnJjX3R4X2luZm8gewogCV9fdTMyIHRmcmN0eF94OwogCV9fdTMyIHRmcmN0eF94X3JlY3Y7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmggYi9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKaW5kZXggMzNhNjUzOS4uYjBjOTE2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGlwY19jb25maWcuaApAQCAtMTk0LDM0ICsxOTQsMzQgQEAKIAogCiBzdHJ1Y3QgdGlwY19ub2RlX2luZm8gewotCV9fdTMyIGFkZHI7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgKi8KLQlfX3UzMiB1cDsJCQkvKiAwPWRvd24sIDE9IHVwICovCisJX19iZTMyIGFkZHI7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgKi8KKwlfX2JlMzIgdXA7CQkJLyogMD1kb3duLCAxPSB1cCAqLwogfTsKIAogc3RydWN0IHRpcGNfbGlua19pbmZvIHsKLQlfX3UzMiBkZXN0OwkJCS8qIG5ldHdvcmsgYWRkcmVzcyBvZiBwZWVyIG5vZGUgKi8KLQlfX3UzMiB1cDsJCQkvKiAwPWRvd24sIDE9dXAgKi8KKwlfX2JlMzIgZGVzdDsJCQkvKiBuZXR3b3JrIGFkZHJlc3Mgb2YgcGVlciBub2RlICovCisJX19iZTMyIHVwOwkJCS8qIDA9ZG93biwgMT11cCAqLwogCWNoYXIgc3RyW1RJUENfTUFYX0xJTktfTkFNRV07CS8qIGxpbmsgbmFtZSAqLwogfTsKIAogc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyB7Ci0JX191MzIgcHJpb3JpdHk7CQkJLyogUmFuZ2UgWzEsMzFdLiBPdmVycmlkZSBwZXIgbGluayAgKi8KLQlfX3UzMiBkZXRlY3Rfc2NvcGU7ICAgICAKKwlfX2JlMzIgcHJpb3JpdHk7CQkvKiBSYW5nZSBbMSwzMV0uIE92ZXJyaWRlIHBlciBsaW5rICAqLworCV9fYmUzMiBkZXRlY3Rfc2NvcGU7CiAJY2hhciBuYW1lW1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKIH07CiAKIHN0cnVjdCB0aXBjX2xpbmtfY29uZmlnIHsKLQlfX3UzMiB2YWx1ZTsKKwlfX2JlMzIgdmFsdWU7CiAJY2hhciBuYW1lW1RJUENfTUFYX0xJTktfTkFNRV07CiB9OwogCiAjZGVmaW5lIFRJUENfTlRRX0FMTFRZUEVTIDB4ODAwMDAwMDAKIAogc3RydWN0IHRpcGNfbmFtZV90YWJsZV9xdWVyeSB7Ci0JX191MzIgZGVwdGg7CS8qIDE6dHlwZSwgMjorbmFtZSBpbmZvLCAzOitwb3J0IGluZm8sIDQrOitkZWJ1ZyBpbmZvICovCi0JX191MzIgdHlwZTsJLyoge3QsbCx1fSBpbmZvIGlnbm9yZWQgaWYgaGlnaCBiaXQgb2YgImRlcHRoIiBpcyBzZXQgKi8KLQlfX3UzMiBsb3dib3VuZDsgLyogKGkuZS4gZGlzcGxheXMgYWxsIGVudHJpZXMgb2YgbmFtZSB0YWJsZSkgKi8KLQlfX3UzMiB1cGJvdW5kOworCV9fYmUzMiBkZXB0aDsJLyogMTp0eXBlLCAyOituYW1lIGluZm8sIDM6K3BvcnQgaW5mbywgNCs6K2RlYnVnIGluZm8gKi8KKwlfX2JlMzIgdHlwZTsJLyoge3QsbCx1fSBpbmZvIGlnbm9yZWQgaWYgaGlnaCBiaXQgb2YgImRlcHRoIiBpcyBzZXQgKi8KKwlfX2JlMzIgbG93Ym91bmQ7IC8qIChpLmUuIGRpc3BsYXlzIGFsbCBlbnRyaWVzIG9mIG5hbWUgdGFibGUpICovCisJX19iZTMyIHVwYm91bmQ7CiB9OwogCiAvKgpAQCAtMjYyLDggKzI2Miw4IEBACiAgKi8KIAogc3RydWN0IHRsdl9kZXNjIHsKLQlfX3UxNiB0bHZfbGVuOwkJLyogVExWIGxlbmd0aCAoZGVzY3JpcHRvciArIHZhbHVlKSAqLwotCV9fdTE2IHRsdl90eXBlOwkJLyogVExWIGlkZW50aWZpZXIgKi8KKwlfX2JlMTYgdGx2X2xlbjsJCS8qIFRMViBsZW5ndGggKGRlc2NyaXB0b3IgKyB2YWx1ZSkgKi8KKwlfX2JlMTYgdGx2X3R5cGU7CQkvKiBUTFYgaWRlbnRpZmllciAqLwogfTsKIAogI2RlZmluZSBUTFZfQUxJR05UTyA0CkBAIC0zNzcsOSArMzc3LDkgQEAKIAogc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIKIHsKLQlfX3UzMiB0Y21fbGVuOwkJLyogTWVzc2FnZSBsZW5ndGggKGluY2x1ZGluZyBoZWFkZXIpICovCi0JX191MTYgdGNtX3R5cGU7CQkvKiBDb21tYW5kIHR5cGUgKi8KLQlfX3UxNiB0Y21fZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwlfX2JlMzIgdGNtX2xlbjsJCS8qIE1lc3NhZ2UgbGVuZ3RoIChpbmNsdWRpbmcgaGVhZGVyKSAqLworCV9fYmUxNiB0Y21fdHlwZTsJLyogQ29tbWFuZCB0eXBlICovCisJX19iZTE2IHRjbV9mbGFnczsJLyogQWRkaXRpb25hbCBmbGFncyAqLwogCWNoYXIgIHRjbV9yZXNlcnZlZFs4XTsJLyogVW51c2VkICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eS5oIGIvaW5jbHVkZS9saW51eC90dHkuaAppbmRleCA0NDA5MWMwLi42NTMyMWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTI3Niw5ICsyNzYsOCBAQAogZXh0ZXJuIGludCB0dHlfdW5yZWdpc3Rlcl9sZGlzYyhpbnQgZGlzYyk7CiBleHRlcm4gaW50IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcik7CiBleHRlcm4gaW50IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKTsKLWV4dGVybiBzdHJ1Y3QgY2xhc3NfZGV2aWNlICp0dHlfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCi0JCQkJCQl1bnNpZ25lZCBpbmRleCwKLQkJCQkJCXN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IGRldmljZSAqdHR5X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLAorCQkJCQkgIHVuc2lnbmVkIGluZGV4LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHVuc2lnbmVkIGluZGV4KTsKIGV4dGVybiBpbnQgdHR5X3JlYWRfcmF3X2RhdGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqYnVmcCwKIAkJCSAgICAgaW50IGJ1Zmxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKaW5kZXggNzUwZjA4NS4uMDM1MWJmMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKQEAgLTEyOCwyMSArMTI4LDI3IEBACiAKIC8qIHRoaXMgaXMgYSBzcGVjaWFsIDY0Yml0IGRhdGEgdHlwZSB0aGF0IGlzIDgtYnl0ZSBhbGlnbmVkICovCiAjZGVmaW5lIGFsaWduZWRfdTY0IHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNkZWZpbmUgYWxpZ25lZF9iZTY0IF9fYmU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNkZWZpbmUgYWxpZ25lZF9sZTY0IF9fbGU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKIAogLyoqCiAgKiBUaGUgdHlwZSB1c2VkIGZvciBpbmRleGluZyBvbnRvIGEgZGlzYyBvciBkaXNjIHBhcnRpdGlvbi4KICAqCiAgKiBMaW51eCBhbHdheXMgY29uc2lkZXJzIHNlY3RvcnMgdG8gYmUgNTEyIGJ5dGVzIGxvbmcgaW5kZXBlbmRlbnRseQogICogb2YgdGhlIGRldmljZXMgcmVhbCBibG9jayBzaXplLgotICoKLSAqIElmIHJlcXVpcmVkLCBhc20vdHlwZXMuaCBjYW4gb3ZlcnJpZGUgaXQgYW5kIGRlZmluZQotICogSEFWRV9TRUNUT1JfVAogICovCi0jaWZuZGVmIEhBVkVfU0VDVE9SX1QKKyNpZmRlZiBDT05GSUdfTEJECit0eXBlZGVmIHU2NCBzZWN0b3JfdDsKKyNlbHNlCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2VjdG9yX3Q7CiAjZW5kaWYKIAotI2lmbmRlZiBIQVZFX0JMS0NOVF9UCisvKgorICogVGhlIHR5cGUgb2YgdGhlIGlub2RlJ3MgYmxvY2sgY291bnQuCisgKi8KKyNpZmRlZiBDT05GSUdfTFNGCit0eXBlZGVmIHU2NCBibGtjbnRfdDsKKyNlbHNlCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmxrY250X3Q7CiAjZW5kaWYKIApAQCAtMTgwLDYgKzE4Niw4IEBACiB0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBfX2xlNjQ7CiB0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBfX2JlNjQ7CiAjZW5kaWYKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fc3VtMTY7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX3dzdW07CiAKICNpZmRlZiBfX0tFUk5FTF9fCiB0eXBlZGVmIHVuc2lnbmVkIF9fYml0d2lzZV9fIGdmcF90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91ZHAuaCBiL2luY2x1ZGUvbGludXgvdWRwLmgKaW5kZXggMDE0YjQxZC4uN2UwOGMwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91ZHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VkcC5oCkBAIC0yMyw3ICsyMyw3IEBACiAJX19iZTE2CXNvdXJjZTsKIAlfX2JlMTYJZGVzdDsKIAlfX2JlMTYJbGVuOwotCV9fYmUxNgljaGVjazsKKwlfX3N1bTE2CWNoZWNrOwogfTsKIAogLyogVURQIHNvY2tldCBvcHRpb25zICovCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KKyNkZWZpbmUgVURQX0hUQUJMRV9TSVpFCQkxMjgKIAogc3RydWN0IHVkcF9zb2NrIHsKIAkvKiBpbmV0X3NvY2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgKi8KQEAgLTUwLDEyICs1MSwyMyBAQAogCSAqIHdoZW4gdGhlIHNvY2tldCBpcyB1bmNvcmtlZC4KIAkgKi8KIAlfX3UxNgkJIGxlbjsJCS8qIHRvdGFsIGxlbmd0aCBvZiBwZW5kaW5nIGZyYW1lcyAqLworCS8qCisJICogRmllbGRzIHNwZWNpZmljIHRvIFVEUC1MaXRlLgorCSAqLworCV9fdTE2CQkgcGNzbGVuOworCV9fdTE2CQkgcGNybGVuOworLyogaW5kaWNhdG9yIGJpdHMgdXNlZCBieSBwY2ZsYWc6ICovCisjZGVmaW5lIFVEUExJVEVfQklUICAgICAgMHgxICAJCS8qIHNldCBieSB1ZHBsaXRlIHByb3RvIGluaXQgZnVuY3Rpb24gKi8KKyNkZWZpbmUgVURQTElURV9TRU5EX0NDICAweDIgIAkJLyogc2V0IHZpYSB1ZHBsaXRlIHNldHNvY2tvcHQgICAgICAgICAqLworI2RlZmluZSBVRFBMSVRFX1JFQ1ZfQ0MgIDB4NAkJLyogc2V0IHZpYSB1ZHBsaXRlIHNldHNvY2t0b3B0ICAgICAgICAqLworCV9fdTgJCSBwY2ZsYWc7ICAgICAgICAvKiBtYXJrcyBzb2NrZXQgYXMgVURQLUxpdGUgaWYgPiAwICAgICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1ZHBfc29jayAqdWRwX3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gKHN0cnVjdCB1ZHBfc29jayAqKXNrOwogfQorI2RlZmluZSBJU19VRFBMSVRFKF9fc2spICh1ZHBfc2soX19zayktPnBjZmxhZykKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IDU0ODJiZmIuLjBjZDczZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtMzEzLDggKzMxMywxMyBAQAogLyogVGhpcyBpcyBhcmJpdHJhcnkuCiAgKiBGcm9tIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xMywgb2Zmc2V0IDcsIGEgaHViIGNhbgogICogaGF2ZSB1cCB0byAyNTUgcG9ydHMuIFRoZSBtb3N0IHlldCByZXBvcnRlZCBpcyAxMC4KKyAqCisgKiBDdXJyZW50IFdpcmVsZXNzIFVTQiBob3N0IGhhcmR3YXJlIChJbnRlbCBpMTQ4MCBmb3IgZXhhbXBsZSkgYWxsb3dzCisgKiB1cCB0byAyMiBkZXZpY2VzIHRvIGNvbm5lY3QuIFVwY29taW5nIGhhcmR3YXJlIG1pZ2h0IHJhaXNlIHRoYXQKKyAqIGxpbWl0LiBCZWNhdXNlIHRoZSBhcnJheXMgbmVlZCB0byBhZGQgYSBiaXQgZm9yIGh1YiBzdGF0dXMgZGF0YSwgd2UKKyAqIGRvIDMxLCBzbyBwbHVzIG9uZSBldmVucyBvdXQgdG8gZm91ciBieXRlcy4KICAqLwotI2RlZmluZSBVU0JfTUFYQ0hJTERSRU4JCSgxNikKKyNkZWZpbmUgVVNCX01BWENISUxEUkVOCQkoMzEpCiAKIHN0cnVjdCB1c2JfdHQ7CiAKQEAgLTM1Nyw3ICszNjIsOCBAQAogCXU4IHBvcnRudW07CQkJLyogUGFyZW50IHBvcnQgbnVtYmVyIChvcmlnaW4gMSkgKi8KIAl1OCBsZXZlbDsJCQkvKiBOdW1iZXIgb2YgVVNCIGh1YiBhbmNlc3RvcnMgKi8KIAotCWludCBoYXZlX2xhbmdpZDsJCS8qIHdoZXRoZXIgc3RyaW5nX2xhbmdpZCBpcyB2YWxpZCAqLworCXVuc2lnbmVkIGRpc2Nvbl9zdXNwZW5kZWQ6MTsJLyogRGlzY29ubmVjdGVkIHdoaWxlIHN1c3BlbmRlZCAqLworCXVuc2lnbmVkIGhhdmVfbGFuZ2lkOjE7CQkvKiB3aGV0aGVyIHN0cmluZ19sYW5naWQgaXMgdmFsaWQgKi8KIAlpbnQgc3RyaW5nX2xhbmdpZDsJCS8qIGxhbmd1YWdlIElEIGZvciBzdHJpbmdzICovCiAKIAkvKiBzdGF0aWMgc3RyaW5ncyBmcm9tIHRoZSBkZXZpY2UgKi8KQEAgLTQxMCwxNCArNDE2LDM3IEBACiAKIC8qIFVTQiBhdXRvc3VzcGVuZCBhbmQgYXV0b3Jlc3VtZSAqLwogI2lmZGVmIENPTkZJR19VU0JfU1VTUEVORAorZXh0ZXJuIGludCB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAotI2Vsc2UKLSNkZWZpbmUgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGludGYpCQkwCi0jZGVmaW5lIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpbnRmKQkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2VuYWJsZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnRmLT5wbV91c2FnZV9jbnQgPSAwOworCXVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShpbnRmKTsKK30KIAorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZGlzYWJsZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnRmLT5wbV91c2FnZV9jbnQgPSAxOworCXVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShpbnRmKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7IHJldHVybiAwOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2VuYWJsZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sgfQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZGlzYWJsZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sgfQorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTQ5MCwxNyArNTE5LDEzNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1leHRlcm4gaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfZGlyX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7Ci1leHRlcm4gaW50IHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pbnQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfaXNfaXNvY19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7Ci1leHRlcm4gaW50IHVzYl9lbmRwb2ludF9pc19pc29jX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CisvKioKKyAqIHVzYl9lbmRwb2ludF9kaXJfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIElOIGRpcmVjdGlvbgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBJTiwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfZGlyX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9idWxrIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBidWxrIHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgYnVsaywgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSyk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfaW50IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpbnRlcnJ1cHQsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgKiBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X3hmZXJfaW50KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfaXNvYyAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaXNvY2hyb25vdXMgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpc29jaHJvbm91cywgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19idWxrX2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGJ1bGsgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBidWxrIHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19idWxrX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBidWxrIE9VVAorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGJ1bGsgdHJhbnNmZXIgdHlwZSBhbmQgT1VUIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2ludF9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9pc19pbnRfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pbnRfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGludGVycnVwdCBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgT1VUIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pc29jX2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGlzb2Nocm9ub3VzIElOCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaXNvY2hyb25vdXMgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9pc19pc29jX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGlzb2Nocm9ub3VzIE9VVAorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOworfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmggYi9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKaW5kZXggYTUwYTAxMy4uN2MyNjlmNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKQEAgLTU0Niw2ICs1NDYsOCBAQAogLyogTUxNRSByZXF1ZXN0cyAoU0lPQ1NJV01MTUUgLyBzdHJ1Y3QgaXdfbWxtZSkgKi8KICNkZWZpbmUgSVdfTUxNRV9ERUFVVEgJCTAKICNkZWZpbmUgSVdfTUxNRV9ESVNBU1NPQwkxCisjZGVmaW5lIElXX01MTUVfQVVUSAkJMgorI2RlZmluZSBJV19NTE1FX0FTU09DCQkzCiAKIC8qIFNJT0NTSVdBVVRIL1NJT0NHSVdBVVRIIHN0cnVjdCBpd19wYXJhbSBmbGFncyAqLwogI2RlZmluZSBJV19BVVRIX0lOREVYCQkweDBGRkYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgveGZybS5oIGIvaW5jbHVkZS9saW51eC94ZnJtLmgKaW5kZXggOGFlN2Y3NC4uMDg4YmE4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC94ZnJtLmgKKysrIGIvaW5jbHVkZS9saW51eC94ZnJtLmgKQEAgLTIxMSw4ICsyMTEsOCBAQAogCiBzdHJ1Y3QgeGZybV9lbmNhcF90bXBsIHsKIAlfX3UxNgkJZW5jYXBfdHlwZTsKLQlfX3UxNgkJZW5jYXBfc3BvcnQ7Ci0JX191MTYJCWVuY2FwX2Rwb3J0OworCV9fYmUxNgkJZW5jYXBfc3BvcnQ7CisJX19iZTE2CQllbmNhcF9kcG9ydDsKIAl4ZnJtX2FkZHJlc3NfdAllbmNhcF9vYTsKIH07CiAKQEAgLTI4OSw3ICsyODksOSBAQAogCiBzdHJ1Y3QgeGZybV9hZXZlbnRfaWQgewogCXN0cnVjdCB4ZnJtX3VzZXJzYV9pZAkJc2FfaWQ7CisJeGZybV9hZGRyZXNzX3QJCQlzYWRkcjsKIAlfX3UzMgkJCQlmbGFnczsKKwlfX3UzMgkJCQlyZXFpZDsKIH07CiAKIHN0cnVjdCB4ZnJtX3VzZXJzcGlfaW5mbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3pmdGFwZS5oIGIvaW5jbHVkZS9saW51eC96ZnRhcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1N2M2NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3pmdGFwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotI2lmbmRlZiBfWkZUQVBFX0gKLSNkZWZpbmUgX1pGVEFQRV9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9pbmNsdWRlL2xpbnV4L3pmdGFwZS5oLHYgJAotICogJFJldmlzaW9uOiAxLjEyICQKLSAqICREYXRlOiAxOTk3LzEwLzIxIDExOjAyOjM3ICQKLSAqCi0gKiAgICAgIFNwZWNpYWwgaW9jdGwgYW5kIG90aGVyIGdsb2JhbCBpbmZvIGZvciB0aGUgemZ0YXBlIFZGUwotICogICAgICBpbnRlcmZhY2UgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IKLSAqICAgICAgTGludXguCi0gKi8KLQotI2RlZmluZSBaRlRBUEVfVkVSU0lPTiAgInpmdGFwZSBmb3IgIiBGVEFQRV9WRVJTSU9OCi0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgotCi0jZGVmaW5lIFpGVEFQRV9MQUJFTCAgICAgICAiRnRhcGUgLSBUaGUgTGludXggRmxvcHB5IFRhcGUgUHJvamVjdCEiCi0KLS8qIEJpdHMgb2YgdGhlIG1pbm9yIGRldmljZSBudW1iZXIgdGhhdCBjb250cm9sIHRoZSBvcGVyYXRpb24gbW9kZSAqLwotI2RlZmluZSBaRlRfUTgwX01PREUJCSgxIDw8IDMpCi0jZGVmaW5lIFpGVF9aSVBfTU9ERQkJKDEgPDwgNCkKLSNkZWZpbmUgWkZUX1JBV19NT0RFCQkoMSA8PCA1KQotI2RlZmluZSBaRlRfTUlOT1JfT1BfTUFTSwkoWkZUX1E4MF9NT0RFCXwgCVwKLQkJCQkgWkZUX1pJUF9NT0RFCXwgCVwKLQkJCQkgWkZUX1JBV19NT0RFKQotI2RlZmluZSBaRlRfTUlOT1JfTUFTSwkJKEZUQVBFX1NFTF9NQVNLCQl8CVwKLQkJCQkgWkZUX01JTk9SX09QX01BU0sJfAlcCi0JCQkJIEZUQVBFX05PX1JFV0lORCkKLQotI2lmZGVmIFpGVF9PQlNPTEVURQotc3RydWN0IG10Ymxrc3ogewotCXVuc2lnbmVkIGludCBtdF9ibGtzejsKLX07Ci0jZGVmaW5lIE1USU9DX1pGVEFQRV9HRVRCTEtTWiBfSU9SKCdtJywgMTA0LCBzdHJ1Y3QgbXRibGtzeikKLSNlbmRpZgotCi0jaWZkZWYgX19LRVJORUxfXwotCi1leHRlcm4gaW50IHpmdF9pbml0KHZvaWQpOwotCi1zdGF0aWMgaW5saW5lIF9fczY0IHpmdF9kaXZfYmxrc3ooX19zNjQgdmFsdWUsIF9fdTMyIGJsa19zeikKLXsKLQlpZiAoYmxrX3N6ID09IDEpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoX19zNjQpKCgoX191MzIpKHZhbHVlID4+IDEwKSArIChibGtfc3ogPj4gMTApIC0gMSkgCi0JCQkgICAgICAgLyAoYmxrX3N6ID4+IDEwKSk7Ci0JfSAKLX0KLQotc3RhdGljIGlubGluZSBfX3M2NCB6ZnRfbXVsX2Jsa3N6KF9fczY0IHZhbHVlLCBfX3UzMiBibGtfc3opCi17Ci0JaWYgKGJsa19zeiA9PSAxKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9IGVsc2UgewotCQkvKiAgaWYgYmxrX3N6ICE9IDEsIHRoZW4gaXQgaXMgYSBtdWx0aXBsZSBvZiAxMDI0LiBJbgotCQkgKiAgdGhpcyBjYXNlLCBgdmFsdWUnIHdpbGwgYWxzbyBmaXQgaW50byAzMiBiaXRzLgotCQkgKiAKLQkJICogIEFjdHVhbGx5LCB0aGlzIGxpbWl0cyB0aGUgY2FwYWNpdHkgdG8gNDIKLQkJICogIGJpdHMuIFRoaXMgaXMgKDJeMzIpKjEwMjQsIHJvdWdobHkgYSB0aG91c2FuZAotCQkgKiAgdGltZXMgMkdCLCBvciAzIFRlcmFieXRlcy4gSG9wZWZ1bGx5IHRoaXMgaXMgZW5vdWdoCi0JCSAqLwotCQlyZXR1cm4oX19zNjQpKCgoX191MzIpKHZhbHVlKSooYmxrX3N6Pj4xMCkpPDwxMCk7Ci0JfQotfQotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAppbmRleCA0NGYxYjY3Li44OGRmOGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oCisrKyBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKQEAgLTM1LDkgKzM1LDkgQEAKICNlbHNlCiAjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiAjZW5kaWYKLQlfX3UzMgkJCXZhbGlkOwotCV9fdTMyCQkJcHJlZmVyZWQ7Ci0JX191MzIJCQlyZXNlcnZlZDI7CisJX19iZTMyCQkJdmFsaWQ7CisJX19iZTMyCQkJcHJlZmVyZWQ7CisJX19iZTMyCQkJcmVzZXJ2ZWQyOwogCiAJc3RydWN0IGluNl9hZGRyCQlwcmVmaXg7CiB9OwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJICogVGhpcyB3aWxsIGluY2x1ZGUgdGhlIElFRUUgYWRkcmVzcyB0b2tlbiBvbiBsaW5rcyB0aGF0IHN1cHBvcnQgaXQuCiAJICovCiAKLQl3b3JkID0gYWRkci0+czZfYWRkcjMyWzJdIF4gYWRkci0+czZfYWRkcjMyWzNdOworCXdvcmQgPSAoX19mb3JjZSB1MzIpKGFkZHItPnM2X2FkZHIzMlsyXSBeIGFkZHItPnM2X2FkZHIzMlszXSk7CiAJd29yZCBePSAod29yZCA+PiAxNik7CiAJd29yZCBePSAod29yZCA+PiA4KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXJwLmggYi9pbmNsdWRlL25ldC9hcnAuaAppbmRleCA2YTNkOWE3Li5mMDI2NjQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hcnAuaAorKysgYi9pbmNsdWRlL25ldC9hcnAuaApAQCAtMTYsNyArMTYsNyBAQAogCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBzcmNfaXAsCiAJCQkgdW5zaWduZWQgY2hhciAqZGVzdF9odywgdW5zaWduZWQgY2hhciAqc3JjX2h3LCB1bnNpZ25lZCBjaGFyICp0aCk7CiBleHRlcm4gaW50CWFycF9iaW5kX25laWdoYm91cihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwotZXh0ZXJuIGludAlhcnBfbWNfbWFwKHUzMiBhZGRyLCB1OCAqaGFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkaXIpOworZXh0ZXJuIGludAlhcnBfbWNfbWFwKF9fYmUzMiBhZGRyLCB1OCAqaGFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkaXIpOwogZXh0ZXJuIHZvaWQJYXJwX2lmZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBza19idWZmICphcnBfY3JlYXRlKGludCB0eXBlLCBpbnQgcHR5cGUsIF9fYmUzMiBkZXN0X2lwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXRtY2xpcC5oIGIvaW5jbHVkZS9uZXQvYXRtY2xpcC5oCmluZGV4IDkwZmNjOTguLmI1YTUxYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2F0bWNsaXAuaAorKysgYi9pbmNsdWRlL25ldC9hdG1jbGlwLmgKQEAgLTM2LDcgKzM2LDcgQEAKIAogCiBzdHJ1Y3QgYXRtYXJwX2VudHJ5IHsKLQl1MzIJCWlwOwkJLyogSVAgYWRkcmVzcyAqLworCV9fYmUzMgkJaXA7CQkvKiBJUCBhZGRyZXNzICovCiAJc3RydWN0IGNsaXBfdmNjCSp2Y2NzOwkJLyogYWN0aXZlIFZDQ3M7IE5VTEwgaWYgcmVzb2x1dGlvbiBpcwogCQkJCQkgICBwZW5kaW5nICovCiAJdW5zaWduZWQgbG9uZwlleHBpcmVzOwkvKiBlbnRyeSBleHBpcmF0aW9uIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9yZmNvbW0uaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9yZmNvbW0uaAppbmRleCA4OWQ3NDNjLi4zYzU2M2YwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvcmZjb21tLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oCkBAIC0xMjQsNyArMTI0LDcgQEAKIAl1OCAgZmxvd19jdHJsOwogCXU4ICBwcmlvcml0eTsKIAl1OCAgYWNrX3RpbWVyOwotCXUxNiBtdHU7CisJX19sZTE2IG10dTsKIAl1OCAgbWF4X3JldHJhbnM7CiAJdTggIGNyZWRpdHM7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCXU4ICBmbG93X2N0cmw7CiAJdTggIHhvbl9jaGFyOwogCXU4ICB4b2ZmX2NoYXI7Ci0JdTE2IHBhcmFtX21hc2s7CisJX19sZTE2IHBhcmFtX21hc2s7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHJmY29tbV9ybHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2hlY2tzdW0uaCBiL2luY2x1ZGUvbmV0L2NoZWNrc3VtLmgKaW5kZXggZTNlYTdjYy4uMTI0MjQ2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL25ldC9jaGVja3N1bS5oCkBAIC0yNyw4ICsyNyw4IEBACiAKICNpZm5kZWYgX0hBVkVfQVJDSF9DT1BZX0FORF9DU1VNX0ZST01fVVNFUgogc3RhdGljIGlubGluZQotdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJICAgICAgaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtIGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyIChjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgbGVuKSkKIAkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihzcmMsIGRzdCwgbGVuLCBzdW0sIGVycl9wdHIpOwpAQCAtNDEsOCArNDEsOCBAQAogI2VuZGlmCiAKICNpZm5kZWYgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfdG9fdXNlcgotKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJfcHRyKQorc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fYW5kX2NvcHlfdG9fdXNlcgorKGNvbnN0IHZvaWQgKnNyYywgdm9pZCBfX3VzZXIgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCXN1bSA9IGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKIApAQCAtNTMsMzUgKzUzLDQ0IEBACiAJaWYgKGxlbikKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwogCi0JcmV0dXJuIC0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fYWRkKHVuc2lnbmVkIGludCBjc3VtLCB1bnNpZ25lZCBpbnQgYWRkZW5kKQorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV9hZGQoX193c3VtIGNzdW0sIF9fd3N1bSBhZGRlbmQpCiB7Ci0JY3N1bSArPSBhZGRlbmQ7Ci0JcmV0dXJuIGNzdW0gKyAoY3N1bSA8IGFkZGVuZCk7CisJdTMyIHJlcyA9IChfX2ZvcmNlIHUzMiljc3VtOworCXJlcyArPSAoX19mb3JjZSB1MzIpYWRkZW5kOworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pKHJlcyArIChyZXMgPCAoX19mb3JjZSB1MzIpYWRkZW5kKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fc3ViKHVuc2lnbmVkIGludCBjc3VtLCB1bnNpZ25lZCBpbnQgYWRkZW5kKQorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV9zdWIoX193c3VtIGNzdW0sIF9fd3N1bSBhZGRlbmQpCiB7CiAJcmV0dXJuIGNzdW1fYWRkKGNzdW0sIH5hZGRlbmQpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV9ibG9ja19hZGQodW5zaWduZWQgaW50IGNzdW0sIHVuc2lnbmVkIGludCBjc3VtMiwgaW50IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX2Jsb2NrX2FkZChfX3dzdW0gY3N1bSwgX193c3VtIGNzdW0yLCBpbnQgb2Zmc2V0KQogeworCXUzMiBzdW0gPSAoX19mb3JjZSB1MzIpY3N1bTI7CiAJaWYgKG9mZnNldCYxKQotCQljc3VtMiA9ICgoY3N1bTImMHhGRjAwRkYpPDw4KSsoKGNzdW0yPj44KSYweEZGMDBGRik7Ci0JcmV0dXJuIGNzdW1fYWRkKGNzdW0sIGNzdW0yKTsKKwkJc3VtID0gKChzdW0mMHhGRjAwRkYpPDw4KSsoKHN1bT4+OCkmMHhGRjAwRkYpOworCXJldHVybiBjc3VtX2FkZChjc3VtLCAoX19mb3JjZSBfX3dzdW0pc3VtKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fYmxvY2tfc3ViKHVuc2lnbmVkIGludCBjc3VtLCB1bnNpZ25lZCBpbnQgY3N1bTIsIGludCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV9ibG9ja19zdWIoX193c3VtIGNzdW0sIF9fd3N1bSBjc3VtMiwgaW50IG9mZnNldCkKIHsKKwl1MzIgc3VtID0gKF9fZm9yY2UgdTMyKWNzdW0yOwogCWlmIChvZmZzZXQmMSkKLQkJY3N1bTIgPSAoKGNzdW0yJjB4RkYwMEZGKTw8OCkrKChjc3VtMj4+OCkmMHhGRjAwRkYpOwotCXJldHVybiBjc3VtX3N1Yihjc3VtLCBjc3VtMik7CisJCXN1bSA9ICgoc3VtJjB4RkYwMEZGKTw8OCkrKChzdW0+PjgpJjB4RkYwMEZGKTsKKwlyZXR1cm4gY3N1bV9zdWIoY3N1bSwgKF9fZm9yY2UgX193c3VtKXN1bSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdW5mb2xkKF9fc3VtMTYgbikKK3sKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKW47Cit9CisKKyNkZWZpbmUgQ1NVTV9NQU5HTEVEXzAgKChfX2ZvcmNlIF9fc3VtMTYpMHhmZmZmKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmggYi9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKaW5kZXggNzE4YjRkOS4uNGM5NTIyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaApAQCAtNTgsMTAgKzU4LDEwIEBACiAjZGVmaW5lIENJUFNPX1Y0X01BUF9QQVNTICAgICAgICAgICAgIDIKIAogLyogbGltaXRzICovCi0jZGVmaW5lIENJUFNPX1Y0X01BWF9SRU1fTFZMUyAgICAgICAgIDI1NgorI2RlZmluZSBDSVBTT19WNF9NQVhfUkVNX0xWTFMgICAgICAgICAyNTUKICNkZWZpbmUgQ0lQU09fVjRfSU5WX0xWTCAgICAgICAgICAgICAgMHg4MDAwMDAwMAogI2RlZmluZSBDSVBTT19WNF9NQVhfTE9DX0xWTFMgICAgICAgICAoQ0lQU09fVjRfSU5WX0xWTCAtIDEpCi0jZGVmaW5lIENJUFNPX1Y0X01BWF9SRU1fQ0FUUyAgICAgICAgIDY1NTM2CisjZGVmaW5lIENJUFNPX1Y0X01BWF9SRU1fQ0FUUyAgICAgICAgIDY1NTM0CiAjZGVmaW5lIENJUFNPX1Y0X0lOVl9DQVQgICAgICAgICAgICAgIDB4ODAwMDAwMDAKICNkZWZpbmUgQ0lQU09fVjRfTUFYX0xPQ19DQVRTICAgICAgICAgKENJUFNPX1Y0X0lOVl9DQVQgLSAxKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2ZpZWxkLmggYi9pbmNsdWRlL25ldC9kc2ZpZWxkLmgKaW5kZXggYTc5YzllMC4uZWI2NWJmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHNmaWVsZC5oCisrKyBiL2luY2x1ZGUvbmV0L2RzZmllbGQuaApAQCAtMjAsMTQgKzIwLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgX191OCBpcHY2X2dldF9kc2ZpZWxkKHN0cnVjdCBpcHY2aGRyICppcHY2aCkKIHsKLQlyZXR1cm4gbnRvaHMoKihfX3UxNiAqKSBpcHY2aCkgPj4gNDsKKwlyZXR1cm4gbnRvaHMoKihfX2JlMTYgKikgaXB2NmgpID4+IDQ7CiB9CiAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwdjRfY2hhbmdlX2RzZmllbGQoc3RydWN0IGlwaGRyICppcGgsX191OCBtYXNrLAogICAgIF9fdTggdmFsdWUpCiB7Ci0gICAgICAgIF9fdTMyIGNoZWNrID0gbnRvaHMoaXBoLT5jaGVjayk7CisgICAgICAgIF9fdTMyIGNoZWNrID0gbnRvaHMoKF9fZm9yY2UgX19iZTE2KWlwaC0+Y2hlY2spOwogCV9fdTggZHNmaWVsZDsKIAogCWRzZmllbGQgPSAoaXBoLT50b3MgJiBtYXNrKSB8IHZhbHVlOwpAQCAtMzUsNyArMzUsNyBAQAogCWlmICgoY2hlY2srMSkgPj4gMTYpIGNoZWNrID0gKGNoZWNrKzEpICYgMHhmZmZmOwogCWNoZWNrIC09IGRzZmllbGQ7CiAJY2hlY2sgKz0gY2hlY2sgPj4gMTY7IC8qIGFkanVzdCBjYXJyeSAqLwotCWlwaC0+Y2hlY2sgPSBodG9ucyhjaGVjayk7CisJaXBoLT5jaGVjayA9IChfX2ZvcmNlIF9fc3VtMTYpaHRvbnMoY2hlY2spOwogCWlwaC0+dG9zID0gZHNmaWVsZDsKIH0KIApAQCAtNDUsOSArNDUsOSBAQAogewogICAgICAgICBfX3UxNiB0bXA7CiAKLQl0bXAgPSBudG9ocygqKF9fdTE2ICopIGlwdjZoKTsKKwl0bXAgPSBudG9ocygqKF9fYmUxNiAqKSBpcHY2aCk7CiAJdG1wID0gKHRtcCAmICgobWFzayA8PCA0KSB8IDB4ZjAwZikpIHwgKHZhbHVlIDw8IDQpOwotCSooX191MTYgKikgaXB2NmggPSBodG9ucyh0bXApOworCSooX19iZTE2ICopIGlwdjZoID0gaHRvbnModG1wKTsKIH0KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9maWJfcnVsZXMuaCBiL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCmluZGV4IDhlMmY0NzMuLmJjM2MyNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCkBAIC0xMyw2ICsxMyw4IEBACiAJYXRvbWljX3QJCXJlZmNudDsKIAlpbnQJCQlpZmluZGV4OwogCWNoYXIJCQlpZm5hbWVbSUZOQU1TSVpdOworCXUzMgkJCW1hcms7CisJdTMyCQkJbWFya19tYXNrOwogCXUzMgkJCXByZWY7CiAJdTMyCQkJZmxhZ3M7CiAJdTMyCQkJdGFibGU7CkBAIC01MCw2ICs1Miw3IEBACiAJCQkJCXN0cnVjdCBubG1zZ2hkciAqLAogCQkJCQlzdHJ1Y3QgZmliX3J1bGVfaGRyICopOwogCXUzMgkJCSgqZGVmYXVsdF9wcmVmKSh2b2lkKTsKKwlzaXplX3QJCQkoKm5sbXNnX3BheWxvYWQpKHN0cnVjdCBmaWJfcnVsZSAqKTsKIAogCWludAkJCW5sZ3JvdXA7CiAJc3RydWN0IG5sYV9wb2xpY3kJKnBvbGljeTsKQEAgLTU3LDYgKzYwLDEzIEBACiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwogfTsKIAorI2RlZmluZSBGUkFfR0VORVJJQ19QT0xJQ1kgXAorCVtGUkFfSUZOQU1FXQk9IHsgLnR5cGUgPSBOTEFfU1RSSU5HLCAubGVuID0gSUZOQU1TSVogLSAxIH0sIFwKKwlbRlJBX1BSSU9SSVRZXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKKwlbRlJBX0ZXTUFSS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LCBcCisJW0ZSQV9GV01BU0tdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAorCVtGUkFfVEFCTEVdICAgICA9IHsgLnR5cGUgPSBOTEFfVTMyIH0KKwogc3RhdGljIGlubGluZSB2b2lkIGZpYl9ydWxlX2dldChzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUpCiB7CiAJYXRvbWljX2luYygmcnVsZS0+cmVmY250KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2Zsb3cuaCBiL2luY2x1ZGUvbmV0L2Zsb3cuaAppbmRleCA1Y2RhMjdjLi5jZTRiMTBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9mbG93LmgKKysrIGIvaW5jbHVkZS9uZXQvZmxvdy5oCkBAIC0xMywxMiArMTMsMTIgQEAKIHN0cnVjdCBmbG93aSB7CiAJaW50CW9pZjsKIAlpbnQJaWlmOworCV9fdTMyCW1hcms7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlfX2JlMzIJCQlkYWRkcjsKIAkJCV9fYmUzMgkJCXNhZGRyOwotCQkJX191MzIJCQlmd21hcms7CiAJCQlfX3U4CQkJdG9zOwogCQkJX191OAkJCXNjb3BlOwogCQl9IGlwNF91OwpAQCAtMjYsMjggKzI2LDIzIEBACiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgaW42X2FkZHIJCWRhZGRyOwogCQkJc3RydWN0IGluNl9hZGRyCQlzYWRkcjsKLQkJCV9fdTMyCQkJZndtYXJrOwotCQkJX191MzIJCQlmbG93bGFiZWw7CisJCQlfX2JlMzIJCQlmbG93bGFiZWw7CiAJCX0gaXA2X3U7CiAKIAkJc3RydWN0IHsKIAkJCV9fbGUxNgkJCWRhZGRyOwogCQkJX19sZTE2CQkJc2FkZHI7Ci0JCQlfX3UzMgkJCWZ3bWFyazsKIAkJCV9fdTgJCQlzY29wZTsKIAkJfSBkbl91OwogCX0gbmxfdTsKICNkZWZpbmUgZmxkX2RzdAkJbmxfdS5kbl91LmRhZGRyCiAjZGVmaW5lIGZsZF9zcmMJCW5sX3UuZG5fdS5zYWRkcgotI2RlZmluZSBmbGRfZndtYXJrCW5sX3UuZG5fdS5md21hcmsKICNkZWZpbmUgZmxkX3Njb3BlCW5sX3UuZG5fdS5zY29wZQogI2RlZmluZSBmbDZfZHN0CQlubF91LmlwNl91LmRhZGRyCiAjZGVmaW5lIGZsNl9zcmMJCW5sX3UuaXA2X3Uuc2FkZHIKLSNkZWZpbmUgZmw2X2Z3bWFyawlubF91LmlwNl91LmZ3bWFyawogI2RlZmluZSBmbDZfZmxvd2xhYmVsCW5sX3UuaXA2X3UuZmxvd2xhYmVsCiAjZGVmaW5lIGZsNF9kc3QJCW5sX3UuaXA0X3UuZGFkZHIKICNkZWZpbmUgZmw0X3NyYwkJbmxfdS5pcDRfdS5zYWRkcgotI2RlZmluZSBmbDRfZndtYXJrCW5sX3UuaXA0X3UuZndtYXJrCiAjZGVmaW5lIGZsNF90b3MJCW5sX3UuaXA0X3UudG9zCiAjZGVmaW5lIGZsNF9zY29wZQlubF91LmlwNF91LnNjb3BlCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKaW5kZXggYjYxOTMxNC4uYWRmZjRjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKQEAgLTUzLDYgKzUzLDcgQEAKICAqIEBwb2xpY3k6IGF0dHJpYnV0ZSB2YWxpZGF0aW9uIHBvbGljeQogICogQGRvaXQ6IHN0YW5kYXJkIGNvbW1hbmQgY2FsbGJhY2sKICAqIEBkdW1waXQ6IGNhbGxiYWNrIGZvciBkdW1wZXJzCisgKiBAZG9uZTogY29tcGxldGlvbiBjYWxsYmFjayBmb3IgZHVtcHMKICAqIEBvcHNfbGlzdDogb3BlcmF0aW9ucyBsaXN0CiAgKi8KIHN0cnVjdCBnZW5sX29wcwpAQCAtNjQsNiArNjUsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAlpbnQJCSAgICAgICAoKmR1bXBpdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CisJaW50CQkgICAgICAgKCpkb25lKShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogCXN0cnVjdCBsaXN0X2hlYWQJb3BzX2xpc3Q7CiB9OwogCkBAIC03OSwzNCArODEsNTEgQEAKICAqIEBza2I6IHNvY2tldCBidWZmZXIgaG9sZGluZyB0aGUgbWVzc2FnZQogICogQHBpZDogbmV0bGluayBwaWQgdGhlIG1lc3NhZ2UgaXMgYWRkcmVzc2VkIHRvCiAgKiBAc2VxOiBzZXF1ZW5jZSBudW1iZXIgKHVzdWFsbHkgdGhlIG9uZSBvZiB0aGUgc2VuZGVyKQotICogQHR5cGU6IG5ldGxpbmsgbWVzc2FnZSB0eXBlCi0gKiBAaGRybGVuOiBsZW5ndGggb2YgdGhlIHVzZXIgc3BlY2lmaWMgaGVhZGVyCisgKiBAZmFtaWx5OiBnZW5lcmljIG5ldGxpbmsgZmFtaWx5CiAgKiBAZmxhZ3MgbmV0bGluayBtZXNzYWdlIGZsYWdzCiAgKiBAY21kOiBnZW5lcmljIG5ldGxpbmsgY29tbWFuZAotICogQHZlcnNpb246IHZlcnNpb24KICAqCiAgKiBSZXR1cm5zIHBvaW50ZXIgdG8gdXNlciBzcGVjaWZpYyBoZWFkZXIKICAqLwogc3RhdGljIGlubGluZSB2b2lkICpnZW5sbXNnX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAotCQkJCWludCB0eXBlLCBpbnQgaGRybGVuLCBpbnQgZmxhZ3MsCi0JCQkJdTggY21kLCB1OCB2ZXJzaW9uKQorCQkJCXN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5LCBpbnQgZmxhZ3MsIHU4IGNtZCkKIHsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgZ2VubG1zZ2hkciAqaGRyOwogCi0JbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIEdFTkxfSERSTEVOICsgaGRybGVuLCBmbGFncyk7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGZhbWlseS0+aWQsIEdFTkxfSERSTEVOICsKKwkJCWZhbWlseS0+aGRyc2l6ZSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAloZHIgPSBubG1zZ19kYXRhKG5saCk7CiAJaGRyLT5jbWQgPSBjbWQ7Ci0JaGRyLT52ZXJzaW9uID0gdmVyc2lvbjsKKwloZHItPnZlcnNpb24gPSBmYW1pbHktPnZlcnNpb247CiAJaGRyLT5yZXNlcnZlZCA9IDA7CiAKIAlyZXR1cm4gKGNoYXIgKikgaGRyICsgR0VOTF9IRFJMRU47CiB9CiAKIC8qKgorICogZ2VubG1zZ19wdXRfcmVwbHkgLSBBZGQgZ2VuZXJpYyBuZXRsaW5rIGhlYWRlciB0byBhIHJlcGx5IG1lc3NhZ2UKKyAqIEBza2I6IHNvY2tldCBidWZmZXIgaG9sZGluZyB0aGUgbWVzc2FnZQorICogQGluZm86IHJlY2VpdmVyIGluZm8KKyAqIEBmYW1pbHk6IGdlbmVyaWMgbmV0bGluayBmYW1pbHkKKyAqIEBmbGFnczogbmV0bGluayBtZXNzYWdlIGZsYWdzCisgKiBAY21kOiBnZW5lcmljIG5ldGxpbmsgY29tbWFuZAorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byB1c2VyIHNwZWNpZmljIGhlYWRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmdlbmxtc2dfcHV0X3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgZ2VubF9mYW1pbHkgKmZhbWlseSwKKwkJCQkgICAgICBpbnQgZmxhZ3MsIHU4IGNtZCkKK3sKKwlyZXR1cm4gZ2VubG1zZ19wdXQoc2tiLCBpbmZvLT5zbmRfcGlkLCBpbmZvLT5zbmRfc2VxLCBmYW1pbHksCisJCQkgICBmbGFncywgY21kKTsKK30KKworLyoqCiAgKiBnZW5sbXNnX2VuZCAtIEZpbmFsaXplIGEgZ2VuZXJpYyBuZXRsaW5rIG1lc3NhZ2UKICAqIEBza2I6IHNvY2tldCBidWZmZXIgdGhlIG1lc3NhZ2UgaXMgc3RvcmVkIGluCiAgKiBAaGRyOiB1c2VyIHNwZWNpZmljIGhlYWRlcgpAQCAtMTUwLDYgKzE2OSwxNiBAQAogfQogCiAvKioKKyAqIGdlbmxtc2dfcmVwbHkgLSByZXBseSB0byBhIHJlcXVlc3QKKyAqIEBza2I6IG5ldGxpbmsgbWVzc2FnZSB0byBiZSBzZW50IGJhY2sKKyAqIEBpbmZvOiByZWNlaXZlciBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgaW5saW5lIGludCBnZW5sbXNnX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJcmV0dXJuIGdlbmxtc2dfdW5pY2FzdChza2IsIGluZm8tPnNuZF9waWQpOworfQorCisvKioKICAqIGdlbm5sbXNnX2RhdGEgLSBoZWFkIG9mIG1lc3NhZ2UgcGF5bG9hZAogICogQGdubGg6IGdlbmV0bGluayBtZXNzc2FnZSBoZWFkZXIKICAqLwpAQCAtMTg3LDQgKzIxNiwxNSBAQAogCXJldHVybiBOTE1TR19BTElHTihnZW5sbXNnX21zZ19zaXplKHBheWxvYWQpKTsKIH0KIAorLyoqCisgKiBnZW5sbXNnX25ldyAtIEFsbG9jYXRlIGEgbmV3IGdlbmVyaWMgbmV0bGluayBtZXNzYWdlCisgKiBAcGF5bG9hZDogc2l6ZSBvZiB0aGUgbWVzc2FnZSBwYXlsb2FkCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqZ2VubG1zZ19uZXcoc2l6ZV90IHBheWxvYWQsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBubG1zZ19uZXcoZ2VubG1zZ190b3RhbF9zaXplKHBheWxvYWQpLCBmbGFncyk7Cit9CisKKwogI2VuZGlmCS8qIF9fTkVUX0dFTkVSSUNfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCmluZGV4IGIxNzRlYmIuLmU2YWYzODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0xMDM3LDYgKzEwMzcsMTAgQEAKIAkvKiBob3N0IHBlcmZvcm1zIG11bHRpY2FzdCBkZWNyeXB0aW9uICovCiAJaW50IGhvc3RfbWNfZGVjcnlwdDsKIAorCS8qIGhvc3Qgc2hvdWxkIHN0cmlwIElWIGFuZCBJQ1YgZnJvbSBwcm90ZWN0ZWQgZnJhbWVzICovCisJLyogbWVhbmluZ2Z1bCBvbmx5IHdoZW4gaGFyZHdhcmUgZGVjcnlwdGlvbiBpcyBiZWluZyB1c2VkICovCisJaW50IGhvc3Rfc3RyaXBfaXZfaWN2OworCiAJaW50IGhvc3Rfb3Blbl9mcmFnOwogCWludCBob3N0X2J1aWxkX2l2OwogCWludCBpZWVlODAyXzF4OwkJLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLwpAQCAtMTA3Niw2ICsxMDgwLDggQEAKIAlpbnQgcGVyZmVjdF9yc3NpOwogCWludCB3b3JzdF9yc3NpOwogCisJdTE2IHByZXZfc2VxX2N0bDsJLyogdXNlZCB0byBkcm9wIGR1cGxpY2F0ZSBmcmFtZXMgKi8KKwogCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLwogCXZvaWQgKCpzZXRfc2VjdXJpdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKiBzZWMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaCBiL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKaW5kZXggMzQ0ODljMS4uM2VjN2QwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaAorKysgYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCkBAIC0xNTIsNiArMTUyLDcgQEAKIAogc3RydWN0IGlwdjZfZGV2c3RhdCB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX2Rpcl9lbnRyeTsKKwlERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpcHN0YXRzX21pYiwgaXB2Nik7CiAJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcHY2X21pYiwgaWNtcHY2KTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmgKaW5kZXggYjMzYjQzOC4uMTZhYTk2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCByZXF1ZXN0X3NvY2sgKmluZXQ2X2Nza19zZWFyY2hfcmVxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqKnByZXZwLAotCQkJCQkJIGNvbnN0IF9fdTE2IHJwb3J0LAorCQkJCQkJIGNvbnN0IF9fYmUxNiBycG9ydCwKIAkJCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyLAogCQkJCQkJIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIsCiAJCQkJCQkgY29uc3QgaW50IGlpZik7CkBAIC0zOCw1ICszOCw1IEBACiAKIGV4dGVybiB2b2lkIGluZXQ2X2Nza19hZGRyMnNvY2thZGRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkcik7CiAKLWV4dGVybiBpbnQgaW5ldDZfY3NrX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlwZnJhZ29rKTsKK2V4dGVybiBpbnQgaW5ldDZfY3NrX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLCBpbnQgaXBmcmFnb2spOwogI2VuZGlmIC8qIF9JTkVUNl9DT05ORUNUSU9OX1NPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oIGIvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCmluZGV4IGJjNmE3MWQuLmMyOGU0MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaAorKysgYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKQEAgLTI2LDExICsyNiwxMSBAQAogCiAvKiBJIGhhdmUgbm8gaWRlYSBpZiB0aGlzIGlzIGEgZ29vZCBoYXNoIGZvciB2NiBvciBub3QuIC1EYXZlTSAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW5ldDZfZWhhc2hmbihjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLCBjb25zdCB1MTYgbHBvcnQsCi0JCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpmYWRkciwgY29uc3QgdTE2IGZwb3J0KQorCQkJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsIGNvbnN0IF9fYmUxNiBmcG9ydCkKIHsKLQl1bnNpZ25lZCBpbnQgaGFzaGVudCA9IChscG9ydCBeIGZwb3J0KTsKKwl1bnNpZ25lZCBpbnQgaGFzaGVudCA9IChscG9ydCBeIChfX2ZvcmNlIHUxNilmcG9ydCk7CiAKLQloYXNoZW50IF49IChsYWRkci0+czZfYWRkcjMyWzNdIF4gZmFkZHItPnM2X2FkZHIzMlszXSk7CisJaGFzaGVudCBePSAoX19mb3JjZSB1MzIpKGxhZGRyLT5zNl9hZGRyMzJbM10gXiBmYWRkci0+czZfYWRkcjMyWzNdKTsKIAloYXNoZW50IF49IGhhc2hlbnQgPj4gMTY7CiAJaGFzaGVudCBePSBoYXNoZW50ID4+IDg7CiAJcmV0dXJuIGhhc2hlbnQ7CkBAIC00Myw3ICs0Myw3IEBACiAJY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciA9ICZucC0+cmN2X3NhZGRyOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIgPSAmbnAtPmRhZGRyOwogCWNvbnN0IF9fdTE2IGxwb3J0ID0gaW5ldC0+bnVtOwotCWNvbnN0IF9fdTE2IGZwb3J0ID0gaW5ldC0+ZHBvcnQ7CisJY29uc3QgX19iZTE2IGZwb3J0ID0gaW5ldC0+ZHBvcnQ7CiAJcmV0dXJuIGluZXQ2X2VoYXNoZm4obGFkZHIsIGxwb3J0LCBmYWRkciwgZnBvcnQpOwogfQogCkBAIC01Nyw3ICs1Nyw3IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3Qgc29jayAqX19pbmV0Nl9sb29rdXBfZXN0YWJsaXNoZWQoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkgICBjb25zdCB1MTYgc3BvcnQsCisJCQkJCSAgIGNvbnN0IF9fYmUxNiBzcG9ydCwKIAkJCQkJICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCQkJICAgY29uc3QgdTE2IGhudW0sCiAJCQkJCSAgIGNvbnN0IGludCBkaWYpOwpAQCAtNjksNyArNjksNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpfX2luZXQ2X2xvb2t1cChzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sCiAJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJICBjb25zdCB1MTYgc3BvcnQsCisJCQkJCSAgY29uc3QgX19iZTE2IHNwb3J0LAogCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCiAJCQkJCSAgY29uc3QgdTE2IGhudW0sCiAJCQkJCSAgY29uc3QgaW50IGRpZikKQEAgLTgzLDggKzgzLDggQEAKIH0KIAogZXh0ZXJuIHN0cnVjdCBzb2NrICppbmV0Nl9sb29rdXAoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAotCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCB1MTYgc3BvcnQsCi0JCQkJIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIGNvbnN0IHUxNiBkcG9ydCwKKwkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3QgX19iZTE2IHNwb3J0LAorCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBjb25zdCBfX2JlMTYgZHBvcnQsCiAJCQkJIGNvbnN0IGludCBkaWYpOwogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkgKi8KICNlbmRpZiAvKiBfSU5FVDZfSEFTSFRBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaAppbmRleCAwYmNmOWYyLi5iZjE2ZDk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogI2luY2x1ZGUgPG5ldC9yZXF1ZXN0X3NvY2suaD4KQEAgLTM2LDcgKzM3LDggQEAKICAqIChpLmUuIHRoaW5ncyB0aGF0IGRlcGVuZCBvbiB0aGUgYWRkcmVzcyBmYW1pbHkpCiAgKi8KIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgewotCWludAkgICAgKCpxdWV1ZV94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaXBmcmFnb2spOworCWludAkgICAgKCpxdWV1ZV94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICBpbnQgaXBmcmFnb2spOwogCXZvaWQJICAgICgqc2VuZF9jaGVjaykoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAogCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJaW50CSAgICAoKnJlYnVpbGRfaGVhZGVyKShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNDUsNyArNDcsOCBAQAogCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKIAkJCQkgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCWludAkgICAgKCpyZW1lbWJlcl9zdGFtcCkoc3RydWN0IHNvY2sgKnNrKTsKLQlfX3UxNgkgICAgbmV0X2hlYWRlcl9sZW47CisJdTE2CSAgICBuZXRfaGVhZGVyX2xlbjsKKwl1MTYJICAgIHNvY2thZGRyX2xlbjsKIAlpbnQJICAgICgqc2V0c29ja29wdCkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCAKIAkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOwogCWludAkgICAgKCpnZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIApAQCAtNTcsNyArNjAsNiBAQAogCQkJCWludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKIAl2b2lkCSAgICAoKmFkZHIyc29ja2FkZHIpKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICopOwotCWludCBzb2NrYWRkcl9sZW47CiB9OwogCiAvKiogaW5ldF9jb25uZWN0aW9uX3NvY2sgLSBJTkVUIGNvbm5lY3Rpb24gb3JpZW50ZWQgc29jawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9lY24uaCBiL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKaW5kZXggNzg0OTg0NC4uMTAxMTdjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9lY24uaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCkBAIC01Myw3ICs1Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IElQX0VDTl9zZXRfY2Uoc3RydWN0IGlwaGRyICppcGgpCiB7Ci0JdTMyIGNoZWNrID0gaXBoLT5jaGVjazsKKwl1MzIgY2hlY2sgPSAoX19mb3JjZSB1MzIpaXBoLT5jaGVjazsKIAl1MzIgZWNuID0gKGlwaC0+dG9zICsgMSkgJiBJTkVUX0VDTl9NQVNLOwogCiAJLyoKQEAgLTcxLDkgKzcxLDkgQEAKIAkgKiBJTkVUX0VDTl9FQ1RfMSA9PiBjaGVjayArPSBodG9ucygweEZGRkQpCiAJICogSU5FVF9FQ05fRUNUXzAgPT4gY2hlY2sgKz0gaHRvbnMoMHhGRkZFKQogCSAqLwotCWNoZWNrICs9IGh0b25zKDB4RkZGQikgKyBodG9ucyhlY24pOworCWNoZWNrICs9IChfX2ZvcmNlIHUxNilodG9ucygweEZGRkIpICsgKF9fZm9yY2UgdTE2KWh0b25zKGVjbik7CiAKLQlpcGgtPmNoZWNrID0gY2hlY2sgKyAoY2hlY2s+PTB4RkZGRik7CisJaXBoLT5jaGVjayA9IChfX2ZvcmNlIF9fc3VtMTYpKGNoZWNrICsgKGNoZWNrPj0weEZGRkYpKTsKIAlpcGgtPnRvcyB8PSBJTkVUX0VDTl9DRTsKIAlyZXR1cm4gMTsKIH0KQEAgLTk1LDEzICs5NSwxMyBAQAogewogCWlmIChJTkVUX0VDTl9pc19ub3RfZWN0KGlwdjZfZ2V0X2RzZmllbGQoaXBoKSkpCiAJCXJldHVybiAwOwotCSoodTMyKilpcGggfD0gaHRvbmwoSU5FVF9FQ05fQ0UgPDwgMjApOworCSooX19iZTMyKilpcGggfD0gaHRvbmwoSU5FVF9FQ05fQ0UgPDwgMjApOwogCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgSVA2X0VDTl9jbGVhcihzdHJ1Y3QgaXB2NmhkciAqaXBoKQogewotCSoodTMyKilpcGggJj0gfmh0b25sKElORVRfRUNOX01BU0sgPDwgMjApOworCSooX19iZTMyKilpcGggJj0gfmh0b25sKElORVRfRUNOX01BU0sgPDwgMjApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXB2Nl9jb3B5X2RzY3Aoc3RydWN0IGlwdjZoZHIgKm91dGVyLCBzdHJ1Y3QgaXB2NmhkciAqaW5uZXIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCBiNmQ5NWU1Li44M2NiOWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTk3LDcgKzk3LDcgQEAKIGV4dGVybiBpbnQJCWlwX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIGludCAoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKikpOwogZXh0ZXJuIGludAkJaXBfZG9fbmF0KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQJCWlwX3NlbmRfY2hlY2soc3RydWN0IGlwaGRyICppcCk7Ci1leHRlcm4gaW50CQlpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvayk7CitleHRlcm4gaW50CQlpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywgaW50IGlwZnJhZ29rKTsKIGV4dGVybiB2b2lkCQlpcF9pbml0KHZvaWQpOwogZXh0ZXJuIGludAkJaXBfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgICBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwKQEAgLTEyMyw3ICsxMjMsNyBAQAogICogICAgICBtdWx0aWNhc3QgcGFja2V0cy4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdHJfbWNfbWFwKHUzMiBhZGRyLCBjaGFyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfdHJfbWNfbWFwKF9fYmUzMiBhZGRyLCBjaGFyICpidWYpCiB7CiAJYnVmWzBdPTB4QzA7CiAJYnVmWzFdPTB4MDA7CkBAIC0xMzUsNyArMTM1LDcgQEAKIAogc3RydWN0IGlwX3JlcGx5X2FyZyB7CiAJc3RydWN0IGt2ZWMgaW92WzFdOyAgIAotCXUzMiAJICAgIGNzdW07IAorCV9fd3N1bSAJICAgIGNzdW07CiAJaW50CSAgICBjc3Vtb2Zmc2V0OyAvKiB1MTYgb2Zmc2V0IG9mIGNzdW0gaW4gaW92WzBdLmlvdl9iYXNlICovCiAJCQkJLyogLTEgaWYgbm90IG5lZWRlZCAqLyAKIH07IApAQCAtMTkyLDkgKzE5Miw5IEBACiBzdGF0aWMgaW5saW5lCiBpbnQgaXBfZGVjcmVhc2VfdHRsKHN0cnVjdCBpcGhkciAqaXBoKQogewotCXUzMiBjaGVjayA9IGlwaC0+Y2hlY2s7Ci0JY2hlY2sgKz0gaHRvbnMoMHgwMTAwKTsKLQlpcGgtPmNoZWNrID0gY2hlY2sgKyAoY2hlY2s+PTB4RkZGRik7CisJdTMyIGNoZWNrID0gKF9fZm9yY2UgdTMyKWlwaC0+Y2hlY2s7CisJY2hlY2sgKz0gKF9fZm9yY2UgdTMyKWh0b25zKDB4MDEwMCk7CisJaXBoLT5jaGVjayA9IChfX2ZvcmNlIF9fc3VtMTYpKGNoZWNrICsgKGNoZWNrPj0weEZGRkYpKTsKIAlyZXR1cm4gLS1pcGgtPnR0bDsKIH0KIApAQCAtMjM4LDkgKzIzOCw5IEBACiAgKglNYXAgYSBtdWx0aWNhc3QgSVAgb250byBtdWx0aWNhc3QgTUFDIGZvciB0eXBlIGV0aGVybmV0LgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9ldGhfbWNfbWFwKHUzMiBhZGRyLCBjaGFyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfZXRoX21jX21hcChfX2JlMzIgbmFkZHIsIGNoYXIgKmJ1ZikKIHsKLQlhZGRyPW50b2hsKGFkZHIpOworCV9fdTMyIGFkZHI9bnRvaGwobmFkZHIpOwogCWJ1ZlswXT0weDAxOwogCWJ1ZlsxXT0weDAwOwogCWJ1ZlsyXT0weDVlOwpAQCAtMjU2LDEzICsyNTYsMTQgQEAKICAqCUxlYXZlIFBfS2V5IGFzIDAgdG8gYmUgZmlsbGVkIGluIGJ5IGRyaXZlci4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfaWJfbWNfbWFwKHUzMiBhZGRyLCBjaGFyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfaWJfbWNfbWFwKF9fYmUzMiBuYWRkciwgY2hhciAqYnVmKQogeworCV9fdTMyIGFkZHI7CiAJYnVmWzBdICA9IDA7CQkvKiBSZXNlcnZlZCAqLwogCWJ1ZlsxXSAgPSAweGZmOwkJLyogTXVsdGljYXN0IFFQTiAqLwogCWJ1ZlsyXSAgPSAweGZmOwogCWJ1ZlszXSAgPSAweGZmOwotCWFkZHIgICAgPSBudG9obChhZGRyKTsKKwlhZGRyICAgID0gbnRvaGwobmFkZHIpOwogCWJ1Zls0XSAgPSAweGZmOwogCWJ1Zls1XSAgPSAweDEyOwkJLyogbGluayBsb2NhbCBzY29wZSAqLwogCWJ1Zls2XSAgPSAweDQwOwkJLyogSVB2NCBzaWduYXR1cmUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9jaGVja3N1bS5oIGIvaW5jbHVkZS9uZXQvaXA2X2NoZWNrc3VtLmgKaW5kZXggM2RmYzg4NS4uNjhlMmIzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2NoZWNrc3VtLmgKQEAgLTM0LDYwICszNCw2MCBAQAogCiAjaWZuZGVmIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJCSAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQkJCSAgICAgX191MTYgbGVuLAotCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgdW5zaWduZWQgaW50IGNzdW0pIAorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIGNzdW0pCiB7CiAKIAlpbnQgY2Fycnk7CiAJX191MzIgdWxlbjsKIAlfX3UzMiB1cHJvdG87CisJX191MzIgc3VtID0gKF9fZm9yY2UgdTMyKWNzdW07CiAKLQljc3VtICs9IHNhZGRyLT5zNl9hZGRyMzJbMF07Ci0JY2FycnkgPSAoY3N1bSA8IHNhZGRyLT5zNl9hZGRyMzJbMF0pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzBdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzBdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IHNhZGRyLT5zNl9hZGRyMzJbMV07Ci0JY2FycnkgPSAoY3N1bSA8IHNhZGRyLT5zNl9hZGRyMzJbMV0pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzFdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzFdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IHNhZGRyLT5zNl9hZGRyMzJbMl07Ci0JY2FycnkgPSAoY3N1bSA8IHNhZGRyLT5zNl9hZGRyMzJbMl0pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzJdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzJdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IHNhZGRyLT5zNl9hZGRyMzJbM107Ci0JY2FycnkgPSAoY3N1bSA8IHNhZGRyLT5zNl9hZGRyMzJbM10pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IGRhZGRyLT5zNl9hZGRyMzJbMF07Ci0JY2FycnkgPSAoY3N1bSA8IGRhZGRyLT5zNl9hZGRyMzJbMF0pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzBdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzBdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IGRhZGRyLT5zNl9hZGRyMzJbMV07Ci0JY2FycnkgPSAoY3N1bSA8IGRhZGRyLT5zNl9hZGRyMzJbMV0pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzFdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzFdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IGRhZGRyLT5zNl9hZGRyMzJbMl07Ci0JY2FycnkgPSAoY3N1bSA8IGRhZGRyLT5zNl9hZGRyMzJbMl0pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzJdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzJdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQljc3VtICs9IGRhZGRyLT5zNl9hZGRyMzJbM107Ci0JY2FycnkgPSAoY3N1bSA8IGRhZGRyLT5zNl9hZGRyMzJbM10pOwotCWNzdW0gKz0gY2Fycnk7CisJc3VtICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzNdOworCWNhcnJ5ID0gKHN1bSA8IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzNdKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQl1bGVuID0gaHRvbmwoKF9fdTMyKSBsZW4pOwotCWNzdW0gKz0gdWxlbjsKLQljYXJyeSA9IChjc3VtIDwgdWxlbik7Ci0JY3N1bSArPSBjYXJyeTsKKwl1bGVuID0gKF9fZm9yY2UgdTMyKWh0b25sKChfX3UzMikgbGVuKTsKKwlzdW0gKz0gdWxlbjsKKwljYXJyeSA9IChzdW0gPCB1bGVuKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQl1cHJvdG8gPSBodG9ubChwcm90byk7Ci0JY3N1bSArPSB1cHJvdG87Ci0JY2FycnkgPSAoY3N1bSA8IHVwcm90byk7Ci0JY3N1bSArPSBjYXJyeTsKKwl1cHJvdG8gPSAoX19mb3JjZSB1MzIpaHRvbmwocHJvdG8pOworCXN1bSArPSB1cHJvdG87CisJY2FycnkgPSAoc3VtIDwgdXByb3RvKTsKKwlzdW0gKz0gY2Fycnk7CiAKLQlyZXR1cm4gY3N1bV9mb2xkKGNzdW0pOworCXJldHVybiBjc3VtX2ZvbGQoKF9fZm9yY2UgX193c3VtKWNzdW0pOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaCBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaAppbmRleCBlNDQzOGRlLi5mOWNkZTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCkBAIC0xMDcsNiArMTA3LDExIEBACiAJdTgJCQkJcnQ2aV9wcm90b2NvbDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGluZXQ2X2RldiAqaXA2X2RzdF9pZGV2KHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgcnQ2X2luZm8gKilkc3QpLT5ydDZpX2lkZXY7Cit9CisKIHN0cnVjdCBmaWI2X3dhbGtlcl90CiB7CiAJc3RydWN0IGZpYjZfd2Fsa2VyX3QgKnByZXYsICpuZXh0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmggYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAppbmRleCBjMTRiNzBlLi40ZTkyN2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaApAQCAtMjAsNyArMjAsNyBAQAogCQkJCXJvdXRlX3ByZWY6MiwKIAkJCQlyZXNlcnZlZF9oOjM7CiAjZW5kaWYKLQlfX3UzMgkJCWxpZmV0aW1lOworCV9fYmUzMgkJCWxpZmV0aW1lOwogCV9fdTgJCQlwcmVmaXhbMF07CS8qIDAsOCBvciAxNiAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfZmliLmggYi9pbmNsdWRlL25ldC9pcF9maWIuaAppbmRleCA5NDliOTMyLi4zNmM2MzVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF9maWIuaAorKysgYi9pbmNsdWRlL25ldC9pcF9maWIuaApAQCAtMTE1LDcgKzExNSw3IEBACiAKIHN0cnVjdCBmaWJfcmVzdWx0X25sIHsKIAlfX2JlMzIJCWZsX2FkZHI7ICAgLyogVG8gYmUgbG9va2VkIHVwKi8KLQl1MzIJCWZsX2Z3bWFyazsgCisJdTMyCQlmbF9tYXJrOwogCXVuc2lnbmVkIGNoYXIJZmxfdG9zOwogCXVuc2lnbmVkIGNoYXIgICBmbF9zY29wZTsKIAl1bnNpZ25lZCBjaGFyICAgdGJfaWRfaW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF9tcF9hbGcuaCBiL2luY2x1ZGUvbmV0L2lwX21wX2FsZy5oCmluZGV4IGJlZmZkZDYuLjI1YjU2NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX21wX2FsZy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX21wX2FsZy5oCkBAIC04OCw5ICs4OCw3IEBACiAJcmV0dXJuIGZscDEtPmZsNF9kc3QgPT0gZmxwMi0+Zmw0X2RzdCAmJgogCQlmbHAxLT5mbDRfc3JjID09IGZscDItPmZsNF9zcmMgJiYKIAkJZmxwMS0+b2lmID09IGZscDItPm9pZiAmJgotI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKLQkJZmxwMS0+Zmw0X2Z3bWFyayA9PSBmbHAyLT5mbDRfZndtYXJrICYmCi0jZW5kaWYKKwkJZmxwMS0+bWFyayA9PSBmbHAyLT5tYXJrICYmCiAJCSEoKGZscDEtPmZsNF90b3MgXiBmbHAyLT5mbDRfdG9zKSAmCiAJCSAgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA5MDMxMDhlLi42NzI1NjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKQEAgLTk4OCwxNCArOTg4LDIwIEBACiBleHRlcm4gdm9pZCBpcF92c19uYXRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAogCQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXIpOwogCi1leHRlcm4gdTE2IGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQpOworZXh0ZXJuIF9fc3VtMTYgaXBfdnNfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCk7CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGlwX3ZzX2NoZWNrX2RpZmYodTMyIG9sZCwgdTMyIG5ldywgdTE2IG9sZHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtIGlwX3ZzX2NoZWNrX2RpZmY0KF9fYmUzMiBvbGQsIF9fYmUzMiBuZXcsIF9fd3N1bSBvbGRzdW0pCiB7Ci0JdTMyIGRpZmZbMl0gPSB7IG9sZCwgbmV3IH07CisJX19iZTMyIGRpZmZbMl0gPSB7IH5vbGQsIG5ldyB9OwogCi0JcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoKGNoYXIgKikgZGlmZiwgc2l6ZW9mKGRpZmYpLAotCQkJCSAgICAgIG9sZHN1bSBeIDB4RkZGRikpOworCXJldHVybiBjc3VtX3BhcnRpYWwoKGNoYXIgKikgZGlmZiwgc2l6ZW9mKGRpZmYpLCBvbGRzdW0pOworfQorCitzdGF0aWMgaW5saW5lIF9fd3N1bSBpcF92c19jaGVja19kaWZmMihfX2JlMTYgb2xkLCBfX2JlMTYgbmV3LCBfX3dzdW0gb2xkc3VtKQoreworCV9fYmUxNiBkaWZmWzJdID0geyB+b2xkLCBuZXcgfTsKKworCXJldHVybiBjc3VtX3BhcnRpYWwoKGNoYXIgKikgZGlmZiwgc2l6ZW9mKGRpZmYpLCBvbGRzdW0pOwogfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBjb25maWcuaCBiL2luY2x1ZGUvbmV0L2lwY29uZmlnLmgKaW5kZXggMmExZmU5OS4uMzkyNGQ3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBjb25maWcuaAorKysgYi9pbmNsdWRlL25ldC9pcGNvbmZpZy5oCkBAIC0xMSwxMiArMTEsMTIgQEAKIGV4dGVybiBpbnQgaWNfcHJvdG9fZW5hYmxlZDsJLyogUHJvdG9jb2xzIGVuYWJsZWQgKHNlZSBJQ194eHgpICovCiBleHRlcm4gaW50IGljX3NldF9tYW51YWxseTsJLyogSVBjb25maWcgcGFyYW1ldGVycyBzZXQgbWFudWFsbHkgKi8KIAotZXh0ZXJuIHUzMiBpY19teWFkZHI7CQkvKiBNeSBJUCBhZGRyZXNzICovCi1leHRlcm4gdTMyIGljX2dhdGV3YXk7CQkvKiBHYXRld2F5IElQIGFkZHJlc3MgKi8KK2V4dGVybiBfX2JlMzIgaWNfbXlhZGRyOwkJLyogTXkgSVAgYWRkcmVzcyAqLworZXh0ZXJuIF9fYmUzMiBpY19nYXRld2F5OwkJLyogR2F0ZXdheSBJUCBhZGRyZXNzICovCiAKLWV4dGVybiB1MzIgaWNfc2VydmFkZHI7CQkvKiBCb290IHNlcnZlciBJUCBhZGRyZXNzICovCitleHRlcm4gX19iZTMyIGljX3NlcnZhZGRyOwkJLyogQm9vdCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLwogCi1leHRlcm4gdTMyIHJvb3Rfc2VydmVyX2FkZHI7CS8qIEFkZHJlc3Mgb2YgTkZTIHNlcnZlciAqLworZXh0ZXJuIF9fYmUzMiByb290X3NlcnZlcl9hZGRyOwkvKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8KIGV4dGVybiB1OCByb290X3NlcnZlcl9wYXRoW107CS8qIFBhdGggdG8gbW91bnQgYXMgcm9vdCAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwaXAuaCBiL2luY2x1ZGUvbmV0L2lwaXAuaAppbmRleCBmNDkwYzNjLi43Y2RjOTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcGlwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBpcC5oCkBAIC0zNSw3ICszNSw3IEBACiAJaXBfc2VuZF9jaGVjayhpcGgpOwkJCQkJCVwKIAkJCQkJCQkJCVwKIAllcnIgPSBORl9IT09LKFBGX0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBydC0+dS5kc3QuZGV2LCBkc3Rfb3V0cHV0KTtcCi0JaWYgKGVyciA9PSBORVRfWE1JVF9TVUNDRVNTIHx8IGVyciA9PSBORVRfWE1JVF9DTikgewkJXAorCWlmIChuZXRfeG1pdF9ldmFsKGVycikgPT0gMCkgewkJCQkJXAogCQlzdGF0cy0+dHhfYnl0ZXMgKz0gcGt0X2xlbjsJCQkJXAogCQlzdGF0cy0+dHhfcGFja2V0cysrOwkJCQkJXAogCX0gZWxzZSB7CQkJCQkJCVwKQEAgLTQ0LDggKzQ0LDQgQEAKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0KLWV4dGVybiBpbnQJc2l0X2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZAlzaXRfY2xlYW51cCh2b2lkKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHY2LmggYi9pbmNsdWRlL25ldC9pcHY2LmgKaW5kZXggODIyM2M0NC4uMDAzMjhiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lwdjYuaApAQCAtOTUsMTAgKzk1LDEwIEBACiAgKi8KIAogc3RydWN0IGZyYWdfaGRyIHsKLQl1bnNpZ25lZCBjaGFyCW5leHRoZHI7Ci0JdW5zaWduZWQgY2hhcglyZXNlcnZlZDsJCi0JdW5zaWduZWQgc2hvcnQJZnJhZ19vZmY7Ci0JX191MzIJCWlkZW50aWZpY2F0aW9uOworCV9fdTgJbmV4dGhkcjsKKwlfX3U4CXJlc2VydmVkOworCV9fYmUxNglmcmFnX29mZjsKKwlfX2JlMzIJaWRlbnRpZmljYXRpb247CiB9OwogCiAjZGVmaW5lCUlQNl9NRgkweDAwMDEKQEAgLTExMyw5ICsxMTMsMjQgQEAKIAogLyogTUlCcyAqLwogREVDTEFSRV9TTk1QX1NUQVQoc3RydWN0IGlwc3RhdHNfbWliLCBpcHY2X3N0YXRpc3RpY3MpOwotI2RlZmluZSBJUDZfSU5DX1NUQVRTKGZpZWxkKQkJU05NUF9JTkNfU1RBVFMoaXB2Nl9zdGF0aXN0aWNzLCBmaWVsZCkKLSNkZWZpbmUgSVA2X0lOQ19TVEFUU19CSChmaWVsZCkJCVNOTVBfSU5DX1NUQVRTX0JIKGlwdjZfc3RhdGlzdGljcywgZmllbGQpCi0jZGVmaW5lIElQNl9JTkNfU1RBVFNfVVNFUihmaWVsZCkgCVNOTVBfSU5DX1NUQVRTX1VTRVIoaXB2Nl9zdGF0aXN0aWNzLCBmaWVsZCkKKyNkZWZpbmUgSVA2X0lOQ19TVEFUUyhpZGV2LGZpZWxkKQkJKHsJCQlcCisJc3RydWN0IGluZXQ2X2RldiAqX2lkZXYgPSAoaWRldik7CQkJCVwKKwlpZiAobGlrZWx5KF9pZGV2ICE9IE5VTEwpKQkJCQkJXAorCQlTTk1QX0lOQ19TVEFUUyhfaWRldi0+c3RhdHMuaXB2NiwgZmllbGQpOwkJXAorCVNOTVBfSU5DX1NUQVRTKGlwdjZfc3RhdGlzdGljcywgZmllbGQpOwkJCQlcCit9KQorI2RlZmluZSBJUDZfSU5DX1NUQVRTX0JIKGlkZXYsZmllbGQpCQkoewkJCVwKKwlzdHJ1Y3QgaW5ldDZfZGV2ICpfaWRldiA9IChpZGV2KTsJCQkJXAorCWlmIChsaWtlbHkoX2lkZXYgIT0gTlVMTCkpCQkJCQlcCisJCVNOTVBfSU5DX1NUQVRTX0JIKF9pZGV2LT5zdGF0cy5pcHY2LCBmaWVsZCk7CQlcCisJU05NUF9JTkNfU1RBVFNfQkgoaXB2Nl9zdGF0aXN0aWNzLCBmaWVsZCk7CQkJXAorfSkKKyNkZWZpbmUgSVA2X0lOQ19TVEFUU19VU0VSKGlkZXYsZmllbGQpCQkoewkJCVwKKwlzdHJ1Y3QgaW5ldDZfZGV2ICpfaWRldiA9IChpZGV2KTsJCQkJXAorCWlmIChsaWtlbHkoX2lkZXYgIT0gTlVMTCkpCQkJCQlcCisJCVNOTVBfSU5DX1NUQVRTX1VTRVIoX2lkZXYtPnN0YXRzLmlwdjYsIGZpZWxkKTsJCVwKKwlTTk1QX0lOQ19TVEFUU19VU0VSKGlwdjZfc3RhdGlzdGljcywgZmllbGQpOwkJCVwKK30pCiBERUNMQVJFX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcHY2X21pYiwgaWNtcHY2X3N0YXRpc3RpY3MpOwogI2RlZmluZSBJQ01QNl9JTkNfU1RBVFMoaWRldiwgZmllbGQpCQkoewkJCVwKIAlzdHJ1Y3QgaW5ldDZfZGV2ICpfaWRldiA9IChpZGV2KTsJCQkJXApAQCAtMTQzLDkgKzE1OCwxMyBAQAogCVNOTVBfSU5DX1NUQVRTX09GRlNFVF9CSChpY21wdjZfc3RhdGlzdGljcywgZmllbGQsIF9vZmZzZXQpOyAgICAJXAogfSkKIERFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBfc3RhdHNfaW42KTsKLSNkZWZpbmUgVURQNl9JTkNfU1RBVFMoZmllbGQpCQlTTk1QX0lOQ19TVEFUUyh1ZHBfc3RhdHNfaW42LCBmaWVsZCkKLSNkZWZpbmUgVURQNl9JTkNfU1RBVFNfQkgoZmllbGQpCVNOTVBfSU5DX1NUQVRTX0JIKHVkcF9zdGF0c19pbjYsIGZpZWxkKQotI2RlZmluZSBVRFA2X0lOQ19TVEFUU19VU0VSKGZpZWxkKSAJU05NUF9JTkNfU1RBVFNfVVNFUih1ZHBfc3RhdHNfaW42LCBmaWVsZCkKK0RFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBsaXRlX3N0YXRzX2luNik7CisjZGVmaW5lIFVEUDZfSU5DX1NUQVRTX0JIKGZpZWxkLCBpc191ZHBsaXRlKSAJCQkgICAgICBkbyAgeyAgXAorCWlmIChpc191ZHBsaXRlKSBTTk1QX0lOQ19TVEFUU19CSCh1ZHBsaXRlX3N0YXRzX2luNiwgZmllbGQpOyAgICAgICAgIFwKKwllbHNlCQlTTk1QX0lOQ19TVEFUU19CSCh1ZHBfc3RhdHNfaW42LCBmaWVsZCk7ICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgVURQNl9JTkNfU1RBVFNfVVNFUihmaWVsZCwgaXNfdWRwbGl0ZSkJCQkgICAgICAgZG8geyAgICBcCisJaWYgKGlzX3VkcGxpdGUpIFNOTVBfSU5DX1NUQVRTX1VTRVIodWRwbGl0ZV9zdGF0c19pbjYsIGZpZWxkKTsgICAgICAgICBcCisJZWxzZQkJU05NUF9JTkNfU1RBVFNfVVNFUih1ZHBfc3RhdHNfaW42LCBmaWVsZCk7ICAgIH0gd2hpbGUoMCkKIAogaW50IHNubXA2X3JlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKIGludCBzbm1wNl91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKQEAgLTE5MSw3ICsyMTAsNyBAQAogc3RydWN0IGlwNl9mbG93bGFiZWwKIHsKIAlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbAkqbmV4dDsKLQl1MzIJCQlsYWJlbDsKKwlfX2JlMzIJCQlsYWJlbDsKIAlzdHJ1Y3QgaW42X2FkZHIJCWRzdDsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMJKm9wdDsKIAlhdG9taWNfdAkJdXNlcnM7CkBAIC0yMTEsNyArMjMwLDcgQEAKIAlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbAkqZmw7CiB9OwogCi1leHRlcm4gc3RydWN0IGlwNl9mbG93bGFiZWwJKmZsNl9zb2NrX2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBsYWJlbCk7CitleHRlcm4gc3RydWN0IGlwNl9mbG93bGFiZWwJKmZsNl9zb2NrX2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIF9fYmUzMiBsYWJlbCk7CiBleHRlcm4gc3RydWN0IGlwdjZfdHhvcHRpb25zCSpmbDZfbWVyZ2Vfb3B0aW9ucyhzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKiBvcHRfc3BhY2UsCiAJCQkJCQkgICBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqIGZsLAogCQkJCQkJICAgc3RydWN0IGlwdjZfdHhvcHRpb25zICogZm9wdCk7CkBAIC0zNzUsMjIgKzM5NCwxNSBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBfX2lwdjZfYWRkcl9kaWZmKGNvbnN0IHZvaWQgKnRva2VuMSwgY29uc3Qgdm9pZCAqdG9rZW4yLCBpbnQgYWRkcmxlbikKIHsKLQljb25zdCBfX3UzMiAqYTEgPSB0b2tlbjEsICphMiA9IHRva2VuMjsKKwljb25zdCBfX2JlMzIgKmExID0gdG9rZW4xLCAqYTIgPSB0b2tlbjI7CiAJaW50IGk7CiAKIAlhZGRybGVuID4+PSAyOwogCiAJZm9yIChpID0gMDsgaSA8IGFkZHJsZW47IGkrKykgewotCQlfX3UzMiB4YiA9IGExW2ldIF4gYTJbaV07Ci0JCWlmICh4YikgewotCQkJaW50IGogPSAzMTsKLQotCQkJeGIgPSBudG9obCh4Yik7Ci0JCQl3aGlsZSAoKHhiICYgKDEgPDwgaikpID09IDApCi0JCQkJai0tOwotCi0JCQlyZXR1cm4gKGkgKiAzMiArIDMxIC0gaik7Ci0JCX0KKwkJX19iZTMyIHhiID0gYTFbaV0gXiBhMltpXTsKKwkJaWYgKHhiKQorCQkJcmV0dXJuIGkgKiAzMiArIDMyIC0gZmxzKG50b2hsKHhiKSk7CiAJfQogCiAJLyoKQEAgLTU0NCw3ICs1NTYsNyBAQAogCQkJCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRyX2xlbik7CiAKIGV4dGVybiBpbnQgCQkJaXB2Nl9yZWN2X2Vycm9yKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkCQkJaXB2Nl9pY21wX2Vycm9yKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVyciwgdTE2IHBvcnQsCitleHRlcm4gdm9pZAkJCWlwdjZfaWNtcF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIsIF9fYmUxNiBwb3J0LAogCQkJCQkJdTMyIGluZm8sIHU4ICpwYXlsb2FkKTsKIGV4dGVybiB2b2lkCQkJaXB2Nl9sb2NhbF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIsIHN0cnVjdCBmbG93aSAqZmwsIHUzMiBpbmZvKTsKIApAQCAtNTg5LDYgKzYwMSw4IEBACiBleHRlcm4gdm9pZCB0Y3A2X3Byb2NfZXhpdCh2b2lkKTsKIGV4dGVybiBpbnQgIHVkcDZfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgdWRwNl9wcm9jX2V4aXQodm9pZCk7CitleHRlcm4gaW50ICB1ZHBsaXRlNl9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB1ZHBsaXRlNl9wcm9jX2V4aXQodm9pZCk7CiBleHRlcm4gaW50ICBpcHY2X21pc2NfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXB2Nl9taXNjX3Byb2NfZXhpdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5oIGIvaW5jbHVkZS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5oCmluZGV4IDlkZDU0YTUuLjY0MWY4OGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lyZGEvaXJsYXBfZnJhbWUuaAorKysgYi9pbmNsdWRlL25ldC9pcmRhL2lybGFwX2ZyYW1lLmgKQEAgLTkxLDggKzkxLDggQEAKIAlfX3U4ICBjYWRkcjsgLyogQ29ubmVjdGlvbiBhZGRyZXNzICovCiAJX191OCAgY29udHJvbDsKIAlfX3U4ICBpZGVudDsgLyogU2hvdWxkIGFsd2F5cyBiZSBYSURfRk9STUFUICovIAotCV9fdTMyIHNhZGRyOyAvKiBTb3VyY2UgZGV2aWNlIGFkZHJlc3MgKi8KLQlfX3UzMiBkYWRkcjsgLyogRGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KKwlfX2xlMzIgc2FkZHI7IC8qIFNvdXJjZSBkZXZpY2UgYWRkcmVzcyAqLworCV9fbGUzMiBkYWRkcjsgLyogRGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KIAlfX3U4ICBmbGFnczsgLyogRGlzY292ZXJ5IGZsYWdzICovCiAJX191OCAgc2xvdG5yOwogCV9fdTggIHZlcnNpb247CkBAIC0xMDEsMTUgKzEwMSwxNSBAQAogc3RydWN0IHRlc3RfZnJhbWUgewogCV9fdTggY2FkZHI7ICAgICAgICAgIC8qIENvbm5lY3Rpb24gYWRkcmVzcyAqLwogCV9fdTggY29udHJvbDsKLQlfX3UzMiBzYWRkcjsgICAgICAgICAvKiBTb3VyY2UgZGV2aWNlIGFkZHJlc3MgKi8KLQlfX3UzMiBkYWRkcjsgICAgICAgICAvKiBEZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLworCV9fbGUzMiBzYWRkcjsgICAgICAgICAvKiBTb3VyY2UgZGV2aWNlIGFkZHJlc3MgKi8KKwlfX2xlMzIgZGFkZHI7ICAgICAgICAgLyogRGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KIH0gSVJEQV9QQUNLOwogCiBzdHJ1Y3QgdWFfZnJhbWUgewogCV9fdTggY2FkZHI7CiAJX191OCBjb250cm9sOwotCV9fdTMyIHNhZGRyOyAvKiBTb3VyY2UgZGV2aWNlIGFkZHJlc3MgKi8KLQlfX3UzMiBkYWRkcjsgLyogRGVzdCBkZXZpY2UgYWRkcmVzcyAqLworCV9fbGUzMiBzYWRkcjsgLyogU291cmNlIGRldmljZSBhZGRyZXNzICovCisJX19sZTMyIGRhZGRyOyAvKiBEZXN0IGRldmljZSBhZGRyZXNzICovCiB9IElSREFfUEFDSzsKIAogc3RydWN0IGRtX2ZyYW1lIHsKQEAgLTEzNSw4ICsxMzUsOCBAQAogc3RydWN0IHNucm1fZnJhbWUgewogCV9fdTggIGNhZGRyOwogCV9fdTggIGNvbnRyb2w7Ci0JX191MzIgc2FkZHI7Ci0JX191MzIgZGFkZHI7CisJX19sZTMyIHNhZGRyOworCV9fbGUzMiBkYWRkcjsKIAlfX3U4ICBuY2FkZHI7CiB9IElSREFfUEFDSzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXJkYS90aW1lci5oIGIvaW5jbHVkZS9uZXQvaXJkYS90aW1lci5oCmluZGV4IDJjNWQ4ODYuLmNiNjE1NjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lyZGEvdGltZXIuaAorKysgYi9pbmNsdWRlL25ldC9pcmRhL3RpbWVyLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgVElNRVJfSAogCiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKICNpbmNsdWRlIDxhc20vcGFyYW0uaD4gIC8qIGZvciBIWiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9sbGNfcGR1LmggYi9pbmNsdWRlL25ldC9sbGNfcGR1LmgKaW5kZXggOGY2MzA2NS4uYWEzM2E0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbGxjX3BkdS5oCisrKyBiL2luY2x1ZGUvbmV0L2xsY19wZHUuaApAQCAtMjUyLDkgKzI1Miw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBsbGNfcGR1X2RlY29kZV9zYShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqc2EpCiB7Ci0JaWYgKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfODAyXzIpKQorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMl8yKSkKIAkJbWVtY3B5KHNhLCBldGhfaGRyKHNrYiktPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9UUl84MDJfMikpIHsKKwllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1RSXzgwMl8yKSkgewogCQltZW1jcHkoc2EsIHRyX2hkcihza2IpLT5zYWRkciwgRVRIX0FMRU4pOwogCQkqc2EgJj0gMHg3RjsKIAl9CkBAIC0yNjksOSArMjY5LDkgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGxsY19wZHVfZGVjb2RlX2RhKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpkYSkKIHsKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF84MDJfMikpCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyXzIpKQogCQltZW1jcHkoZGEsIGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBFVEhfQUxFTik7Ci0JZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9UUl84MDJfMikpCisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9UUl84MDJfMikpCiAJCW1lbWNweShkYSwgdHJfaGRyKHNrYiktPmRhZGRyLCBFVEhfQUxFTik7CiB9CiAKQEAgLTM0NSw3ICszNDUsNyBAQAogCXBkdS0+Y3RybF8xICA9IExMQ19QRFVfVFlQRV9VOwogCXBkdS0+Y3RybF8xIHw9IExMQ18xX1BEVV9DTURfVEVTVDsKIAlwZHUtPmN0cmxfMSB8PSBMTENfVV9QRl9CSVRfTUFTSzsKLQlpZiAoZXZfc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF84MDJfMikpIHsKKwlpZiAoZXZfc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDJfMikpIHsKIAkJc3RydWN0IGxsY19wZHVfdW4gKmV2X3BkdSA9IGxsY19wZHVfdW5faGRyKGV2X3NrYik7CiAJCWludCBkc2l6ZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmRpc2MuaCBiL2luY2x1ZGUvbmV0L25kaXNjLmgKaW5kZXggZDM5MTVkYWIuLjQ3NWIxMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25kaXNjLmgKKysrIGIvaW5jbHVkZS9uZXQvbmRpc2MuaApAQCAtNjYsOCArNjYsOCBAQAogCiBzdHJ1Y3QgcmFfbXNnIHsKICAgICAgICAgc3RydWN0IGljbXA2aGRyCQlpY21waDsKLQlfX3UzMgkJCXJlYWNoYWJsZV90aW1lOwotCV9fdTMyCQkJcmV0cmFuc190aW1lcjsKKwlfX2JlMzIJCQlyZWFjaGFibGVfdGltZTsKKwlfX2JlMzIJCQlyZXRyYW5zX3RpbWVyOwogfTsKIAogc3RydWN0IG5kX29wdF9oZHIgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0LmgKaW5kZXggOTE2ODQ0My4uMTQwMWNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oCkBAIC05LDMyICs5LDM1IEBACiAjaWZuZGVmIF9ORl9DT05OVFJBQ0tfSVBWNF9ICiAjZGVmaW5lIF9ORl9DT05OVFJBQ0tfSVBWNF9ICiAKLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuaD4KIAogLyogcGVyIGNvbm50cmFjazogbmF0IGFwcGxpY2F0aW9uIGhlbHBlciBwcml2YXRlIGRhdGEgKi8KLXVuaW9uIGlwX2Nvbm50cmFja19uYXRfaGVscCB7Cit1bmlvbiBuZl9jb25udHJhY2tfbmF0X2hlbHAgewogICAgICAgICAvKiBpbnNlcnQgbmF0IGhlbHBlciBwcml2YXRlIGRhdGEgaGVyZSAqLworCXN0cnVjdCBuZl9uYXRfcHB0cCBuYXRfcHB0cF9pbmZvOwogfTsKIAotc3RydWN0IG5mX2Nvbm50cmFja19pcHY0X25hdCB7Ci0Jc3RydWN0IGlwX25hdF9pbmZvIGluZm87Ci0JdW5pb24gaXBfY29ubnRyYWNrX25hdF9oZWxwIGhlbHA7CitzdHJ1Y3QgbmZfY29ubl9uYXQgeworCXN0cnVjdCBuZl9uYXRfaW5mbyBpbmZvOworCXVuaW9uIG5mX2Nvbm50cmFja19uYXRfaGVscCBoZWxwOwogI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREVfTU9EVUxFKQogCWludCBtYXNxX2luZGV4OwogI2VuZGlmCiB9OwotI2VuZGlmIC8qIENPTkZJR19JUF9ORl9OQVRfTkVFREVEICovCi0KLXN0cnVjdCBuZl9jb25udHJhY2tfaXB2NCB7Ci0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2lwdjRfbmF0ICpuYXQ7Ci0jZW5kaWYKLX07CisjZW5kaWYgLyogQ09ORklHX05GX05BVF9ORUVERUQgKi8KIAogLyogUmV0dXJucyBuZXcgc2tfYnVmZiwgb3IgTlVMTCAqLwogc3RydWN0IHNrX2J1ZmYgKgogbmZfY3RfaXB2NF9jdF9nYXRoZXJfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNDsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNDsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9faWNtcDsKKworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfaXB2NF9jb21wYXRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9maW5pKHZvaWQpOworCiAjZW5kaWYgLypfTkZfQ09OTlRSQUNLX0lQVjRfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9jb25udHJhY2tfaXB2Ni5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjYvbmZfY29ubnRyYWNrX2lwdjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjYvbmZfY29ubnRyYWNrX2lwdjYuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfSVBWNl9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfSVBWNl9ICisKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NjsKKworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b190Y3A2OworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b191ZHA2OworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19pY21wdjY7CisKK2V4dGVybiBpbnQgbmZfY3RfaXB2Nl9za2lwX2V4dGhkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc3RhcnQsCisJCQkJICB1OCAqbmV4dGhkcnAsIGludCBsZW4pOworCitleHRlcm4gaW50IG5mX2N0X2ZyYWc2X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBuZl9jdF9mcmFnNl9jbGVhbnVwKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpuZl9jdF9mcmFnNl9nYXRoZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZCBuZl9jdF9mcmFnNl9vdXRwdXQodW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpOworCitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X2ZyYWc2X3RpbWVvdXQ7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X2ZyYWc2X2xvd190aHJlc2g7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X2ZyYWc2X2hpZ2hfdGhyZXNoOworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19JUFY2X0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDFmYmQ4MTkuLmJkMDFiNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjYvbmZfY29ubnRyYWNrX2ljbXB2Ni5oPgogCkBAIC0zMyw2ICszNCw3IEBACiAJc3RydWN0IGlwX2N0X3RjcCB0Y3A7CiAJc3RydWN0IGlwX2N0X2ljbXAgaWNtcDsKIAlzdHJ1Y3QgbmZfY3RfaWNtcHY2IGljbXB2NjsKKwlzdHJ1Y3QgbmZfY3RfZ3JlIGdyZTsKIH07CiAKIHVuaW9uIG5mX2Nvbm50cmFja19leHBlY3RfcHJvdG8gewpAQCAtNDEsMTUgKzQzLDIwIEBACiAKIC8qIEFkZCBwcm90b2NvbCBoZWxwZXIgaW5jbHVkZSBmaWxlIGhlcmUgKi8KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyMy5oPgogCiAvKiBwZXIgY29ubnRyYWNrOiBhcHBsaWNhdGlvbiBoZWxwZXIgcHJpdmF0ZSBkYXRhICovCiB1bmlvbiBuZl9jb25udHJhY2tfaGVscCB7CiAJLyogaW5zZXJ0IGNvbm50cmFjayBoZWxwZXIgcHJpdmF0ZSBkYXRhIChtYXN0ZXIpIGhlcmUgKi8KLQlzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciBjdF9mdHBfaW5mbzsKKwlzdHJ1Y3QgbmZfY3RfZnRwX21hc3RlciBjdF9mdHBfaW5mbzsKKwlzdHJ1Y3QgbmZfY3RfcHB0cF9tYXN0ZXIgY3RfcHB0cF9pbmZvOworCXN0cnVjdCBuZl9jdF9oMzIzX21hc3RlciBjdF9oMzIzX2luZm87CiB9OwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwogI2RlZmluZSBORl9DVF9BU1NFUlQoeCkJCQkJCQkJXApAQCAtNzksNiArODYsOCBAQAogCiAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjYvbmZfY29ubnRyYWNrX2lwdjYuaD4KKwogc3RydWN0IG5mX2Nvbm4KIHsKIAkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUvZGVzdHJ1Y3QgdGltZXIsIDEgcGVyIHNrYiwKQEAgLTEyNCw0NCArMTMzLDYgQEAKIAljaGFyIGRhdGFbMF07CiB9OwogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdAotewotCS8qIEludGVybmFsIGxpbmtlZCBsaXN0IChnbG9iYWwgZXhwZWN0YXRpb24gbGlzdCkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBXZSBleHBlY3QgdGhpcyB0dXBsZSwgd2l0aCB0aGUgZm9sbG93aW5nIG1hc2sgKi8KLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlLCBtYXNrOwotIAotCS8qIEZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgc2V0dXAgYW5kIGluc2VydGlvbiAqLwotCXZvaWQgKCpleHBlY3Rmbikoc3RydWN0IG5mX2Nvbm4gKm5ldywKLQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqdGhpcyk7Ci0KLQkvKiBUaGUgY29ubnRyYWNrIG9mIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiAqLwotCXN0cnVjdCBuZl9jb25uICptYXN0ZXI7Ci0KLQkvKiBUaW1lciBmdW5jdGlvbjsgZGVsZXRlcyB0aGUgZXhwZWN0YXRpb24uICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dDsKLQotCS8qIFVzYWdlIGNvdW50LiAqLwotCWF0b21pY190IHVzZTsKLQotCS8qIFVuaXF1ZSBJRCAqLwotCXVuc2lnbmVkIGludCBpZDsKLQotCS8qIEZsYWdzICovCi0JdW5zaWduZWQgaW50IGZsYWdzOwotCi0jaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKLQkvKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBwZXItcHJvdG8gcGFydCwgdXNlZCB0byBtYXAgdGhlCi0JICogZXhwZWN0ZWQgY29ubmVjdGlvbiB0aGUgd2F5IHRoZSByZWNpcGllbnQgZXhwZWN0cy4gKi8KLQl1bmlvbiBuZl9jb25udHJhY2tfbWFuaXBfcHJvdG8gc2F2ZWRfcHJvdG87Ci0JLyogRGlyZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBtYXN0ZXIgY29ubmVjdGlvbi4gKi8KLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOwotI2VuZGlmCi19OwotCi0jZGVmaW5lIE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQgMHgxCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm4gKgogbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2gpCiB7CkBAIC0yMDgsMTYgKzE3OSw2IEBACiAKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19oYXNoX2luc2VydChzdHJ1Y3QgbmZfY29ubiAqY3QpOwogCi1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgotX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgotbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKLQotZXh0ZXJuIHZvaWQgbmZfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLQotZXh0ZXJuIHZvaWQgbmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhzdHJ1Y3QgbmZfY29ubiAqY3QpOwotCiBleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZmx1c2godm9pZCk7CiAKIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqCkBAIC0yODksODkgKzI1MCwxMiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2NoZWNrc3VtOworZXh0ZXJuIGF0b21pY190IG5mX2Nvbm50cmFja19jb3VudDsKK2V4dGVybiBpbnQgbmZfY29ubnRyYWNrX21heDsKIAorREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCwgbmZfY29ubnRyYWNrX3N0YXQpOwogI2RlZmluZSBORl9DVF9TVEFUX0lOQyhjb3VudCkgKF9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX3N0YXQpLmNvdW50KyspCiAKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUwotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlIHsKLQlzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0JdW5zaWduZWQgaW50IGV2ZW50czsKLX07Ci1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUsIG5mX2Nvbm50cmFja19lY2FjaGUpOwotCi0jZGVmaW5lIENPTk5UUkFDS19FQ0FDSEUoeCkJKF9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSkueCkKLQotZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBuZl9jb25udHJhY2tfY2hhaW47Ci1leHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19leHBlY3RfY2hhaW47Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19jaGFpbiwgbmIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZl9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwgbmIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotbmZfY29ubnRyYWNrX2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLAotCQkJbmIpOwotfQotCi1leHRlcm4gdm9pZCBuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KTsKLWV4dGVybiB2b2lkIF9fbmZfY3RfZXZlbnRfY2FjaGVfaW5pdChzdHJ1Y3QgbmZfY29ubiAqY3QpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCi0JCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilza2ItPm5mY3Q7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKTsKLQlpZiAoY3QgIT0gZWNhY2hlLT5jdCkKLQkJX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KGN0KTsKLQllY2FjaGUtPmV2ZW50cyB8PSBldmVudDsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19ldmVudChlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCi0JCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCWlmIChuZl9jdF9pc19jb25maXJtZWQoY3QpICYmICFuZl9jdF9pc19keWluZyhjdCkpCi0JCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZuZl9jb25udHJhY2tfY2hhaW4sIGV2ZW50LCBjdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbmZfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LAotCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLCBldmVudCwgZXhwKTsKLX0KLSNlbHNlIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZAotbmZfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LAotCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSB7fQotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTICovCi0KIC8qIG5vIGhlbHBlciwgbm8gbmF0ICovCiAjZGVmaW5lCU5GX0NUX0ZfQkFTSUMJMAogLyogZm9yIGhlbHBlciAqLwpAQCAtMzg3LDggKzI3MSwzNSBAQAogCiAvKiB2YWxpZCBjb21iaW5hdGlvbnM6CiAgKiBiYXNpYzogbmZfY29ubiwgbmZfY29ubiAuLiBuZl9jb25uX2hlbHAKLSAqIG5hdDogbmZfY29ubiAuLiBuZl9jb25uX25hdCwgbmZfY29ubiAuLiBuZl9jb25uX25hdCwgbmZfY29ubiBoZWxwCisgKiBuYXQ6IG5mX2Nvbm4gLi4gbmZfY29ubl9uYXQsIG5mX2Nvbm4gLi4gbmZfY29ubl9uYXQgLi4gbmZfY29ubiBoZWxwCiAgKi8KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9uYXQgKm5mY3RfbmF0KGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBuZl9jb25uKTsKKworCWlmICghKGN0LT5mZWF0dXJlcyAmIE5GX0NUX0ZfTkFUKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlvZmZzZXQgPSBBTElHTihvZmZzZXQsIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jb25uX25hdCkpOworCXJldHVybiAoc3RydWN0IG5mX2Nvbm5fbmF0ICopICgodm9pZCAqKWN0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9oZWxwICpuZmN0X2hlbHAoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IG5mX2Nvbm4pOworCisJaWYgKCEoY3QtPmZlYXR1cmVzICYgTkZfQ1RfRl9IRUxQKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGN0LT5mZWF0dXJlcyAmIE5GX0NUX0ZfTkFUKSB7CisJCW9mZnNldCA9IEFMSUdOKG9mZnNldCwgX19hbGlnbm9mX18oc3RydWN0IG5mX2Nvbm5fbmF0KSk7CisJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fbmF0KTsKKwl9CisKKwlvZmZzZXQgPSBBTElHTihvZmZzZXQsIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jb25uX2hlbHApKTsKKwlyZXR1cm4gKHN0cnVjdCBuZl9jb25uX2hlbHAgKikgKCh2b2lkICopY3QgKyBvZmZzZXQpOworfQorI2Vsc2UgLyogTm8gTkFUICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2hlbHAgKm5mY3RfaGVscChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgbmZfY29ubik7CkBAIC0zOTYsOCArMzA3LDkgQEAKIAlpZiAoIShjdC0+ZmVhdHVyZXMgJiBORl9DVF9GX0hFTFApKQogCQlyZXR1cm4gTlVMTDsKIAorCW9mZnNldCA9IEFMSUdOKG9mZnNldCwgX19hbGlnbm9mX18oc3RydWN0IG5mX2Nvbm5faGVscCkpOwogCXJldHVybiAoc3RydWN0IG5mX2Nvbm5faGVscCAqKSAoKHZvaWQgKiljdCArIG9mZnNldCk7CiB9Ci0KKyNlbmRpZiAvKiBDT05GSUdfTkZfTkFUX05FRURFRCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKaW5kZXggZGEyNTQ1Mi4uN2ZkYzcyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKQEAgLTEzLDYgKzEzLDkgQEAKICNkZWZpbmUgX05GX0NPTk5UUkFDS19DT1JFX0gKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+CiAKIC8qIFRoaXMgaGVhZGVyIGlzIHVzZWQgdG8gc2hhcmUgY29yZSBmdW5jdGlvbmFsaXR5IGJldHdlZW4gdGhlCiAgICBzdGFuZGFsb25lIGNvbm5lY3Rpb24gdHJhY2tpbmcgbW9kdWxlLCBhbmQgdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIncyB1c2UKQEAgLTI5LDcgKzMyLDcgQEAKIC8qIExpa2UgYWJvdmUsIGJ1dCB5b3UgYWxyZWFkeSBoYXZlIGNvbm50cmFjayByZWFkIGxvY2suICovCiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpfX25mX2N0X2ZpbmRfbDNwcm90byh1X2ludDE2X3QgbDNwcm90byk7CiAKLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2w7CitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG87CiAKIGV4dGVybiBpbnQKIG5mX2N0X2dldF90dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMzksMTMgKzQyLDEzIEBACiAJCXVfaW50OF90IHByb3RvbnVtLAogCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCk7CisJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90byk7CiAKIGV4dGVybiBpbnQKIG5mX2N0X2ludmVydF90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnLAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCi0JCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvY29sKTsKKwkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKTsKIAogLyogRmluZCBhIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLwogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqCkBAIC03MCw3ICs3MywxNCBAQAogCiBleHRlcm4gdm9pZCBfX25mX2Nvbm50cmFja19hdHRhY2goc3RydWN0IHNrX2J1ZmYgKm5za2IsIHN0cnVjdCBza19idWZmICpza2IpOwogCitpbnQKK3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bywKKwkgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpwcm90byk7CisKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICpuZl9jb25udHJhY2tfaGFzaDsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG5mX2Nvbm50cmFja19leHBlY3RfbGlzdDsKIGV4dGVybiByd2xvY2tfdCBuZl9jb25udHJhY2tfbG9jayA7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB1bmNvbmZpcm1lZDsKKwogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjJhOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogY29ubmVjdGlvbiB0cmFja2luZyBldmVudCBjYWNoZS4KKyAqLworCisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfRUNBQ0hFX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19FQ0FDSEVfSAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKK3N0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlIHsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJdW5zaWduZWQgaW50IGV2ZW50czsKK307CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUsIG5mX2Nvbm50cmFja19lY2FjaGUpOworCisjZGVmaW5lIENPTk5UUkFDS19FQ0FDSEUoeCkJKF9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSkueCkKKworZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBuZl9jb25udHJhY2tfY2hhaW47CitleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19leHBlY3RfY2hhaW47CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19jaGFpbiwgbmIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2NoYWluLCBuYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZl9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwgbmIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZfY29ubnRyYWNrX2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLAorCQkJbmIpOworfQorCitleHRlcm4gdm9pZCBuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KTsKK2V4dGVybiB2b2lkIF9fbmZfY3RfZXZlbnRfY2FjaGVfaW5pdChzdHJ1Y3QgbmZfY29ubiAqY3QpOworZXh0ZXJuIHZvaWQgbmZfY3RfZXZlbnRfY2FjaGVfZmx1c2godm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKKwkJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKXNrYi0+bmZjdDsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKG5mX2Nvbm50cmFja19lY2FjaGUpOworCWlmIChjdCAhPSBlY2FjaGUtPmN0KQorCQlfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQoY3QpOworCWVjYWNoZS0+ZXZlbnRzIHw9IGV2ZW50OworCWxvY2FsX2JoX2VuYWJsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKKwkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkgJiYgIW5mX2N0X2lzX2R5aW5nKGN0KSkKKwkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2Nvbm50cmFja19jaGFpbiwgZXZlbnQsIGN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituZl9jb25udHJhY2tfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCisJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIGV2ZW50LCBleHApOworfQorCisjZWxzZSAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKKwkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LAorCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHZvaWQpIHt9CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KKworI2VuZGlmIC8qX05GX0NPTk5UUkFDS19FQ0FDSEVfSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjMxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBjb25uZWN0aW9uIHRyYWNraW5nIGV4cGVjdGF0aW9ucy4KKyAqLworCisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfRVhQRUNUX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19FWFBFQ1RfSAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG5mX2Nvbm50cmFja19leHBlY3RfbGlzdDsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhwX2ZpbGVfb3BzOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdAoreworCS8qIEludGVybmFsIGxpbmtlZCBsaXN0IChnbG9iYWwgZXhwZWN0YXRpb24gbGlzdCkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBXZSBleHBlY3QgdGhpcyB0dXBsZSwgd2l0aCB0aGUgZm9sbG93aW5nIG1hc2sgKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlLCBtYXNrOworCisJLyogRnVuY3Rpb24gdG8gY2FsbCBhZnRlciBzZXR1cCBhbmQgaW5zZXJ0aW9uICovCisJdm9pZCAoKmV4cGVjdGZuKShzdHJ1Y3QgbmZfY29ubiAqbmV3LAorCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKKworCS8qIEhlbHBlciB0byBhc3NpZ24gdG8gbmV3IGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOworCisJLyogVGhlIGNvbm50cmFjayBvZiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyOworCisJLyogVGltZXIgZnVuY3Rpb247IGRlbGV0ZXMgdGhlIGV4cGVjdGF0aW9uLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7CisKKwkvKiBVc2FnZSBjb3VudC4gKi8KKwlhdG9taWNfdCB1c2U7CisKKwkvKiBVbmlxdWUgSUQgKi8KKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwkvKiBGbGFncyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJX19iZTMyIHNhdmVkX2lwOworCS8qIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHBlci1wcm90byBwYXJ0LCB1c2VkIHRvIG1hcCB0aGUKKwkgKiBleHBlY3RlZCBjb25uZWN0aW9uIHRoZSB3YXkgdGhlIHJlY2lwaWVudCBleHBlY3RzLiAqLworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gc2F2ZWRfcHJvdG87CisJLyogRGlyZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBtYXN0ZXIgY29ubmVjdGlvbi4gKi8KKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOworI2VuZGlmCit9OworCisjZGVmaW5lIE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQgMHgxCisKKworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCituZl9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKKworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorZmluZF9leHBlY3RhdGlvbihjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CisKK3ZvaWQgbmZfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKK3ZvaWQgbmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhzdHJ1Y3QgbmZfY29ubiAqY3QpOwordm9pZCBuZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKKworLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFuIGV4cGVjdGF0aW9uOiB0aGlzIGlzIG1hbmRhdG9yeSBiZWZvcmUgY2FsbGluZworICAgbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkLiAgWW91IHdpbGwgaGF2ZSB0byBjYWxsIHB1dCBhZnRlcndhcmRzLiAqLworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKm5mX2Nvbm50cmFja19leHBlY3RfYWxsb2Moc3RydWN0IG5mX2Nvbm4gKm1lKTsKK3ZvaWQgbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICosIGludCwKKwkJCSAgICAgIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICosCisJCQkgICAgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqLAorCQkJICAgICAgdV9pbnQ4X3QsIF9fYmUxNiAqLCBfX2JlMTYgKik7Cit2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOworaW50IG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0KTsKKworI2VuZGlmIC8qX05GX0NPTk5UUkFDS19FWFBFQ1RfSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oCmluZGV4IDg2ZWM4MTcuLjhjNzJhYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaApAQCAtMzQsMjAgKzM0LDIyIEBACiAJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGNvbm50cmFja2luZm8pOwogCisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBuZl9jb25uICpjdCk7CisKIAlpbnQgKCp0b19uZmF0dHIpKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCk7CiB9OwogCitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgorX19uZl9jdF9oZWxwZXJfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CisKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqCituZl9jdF9oZWxwZXJfZmluZF9nZXQoIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKKworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKK19fbmZfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgbmZfY3RfaGVscGVyX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKTsKIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqKTsKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqKTsKIAotLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFuIGV4cGVjdGF0aW9uOiB0aGlzIGlzIG1hbmRhdG9yeSBiZWZvcmUgY2FsbGluZwotICAgbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkLiAgWW91IHdpbGwgaGF2ZSB0byBjYWxsIHB1dCBhZnRlcndhcmRzLiAqLwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLW5mX2Nvbm50cmFja19leHBlY3RfYWxsb2Moc3RydWN0IG5mX2Nvbm4gKm1hc3Rlcik7Ci1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZXhwZWN0X3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLQotLyogQWRkIGFuIGV4cGVjdGVkIGNvbm5lY3Rpb246IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcGVyIGNvbm5lY3Rpb24gKi8KLWV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOwotZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci0KICNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfSEVMUEVSX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaAppbmRleCBkYWM0M2IxLi42NjRkZGNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaApAQCAtMTgsOSArMTgsNiBAQAogCiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8KIHsKLQkvKiBOZXh0IHBvaW50ZXIuICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCiAJLyogTDMgUHJvdG9jb2wgRmFtaWx5IG51bWJlci4gZXgpIFBGX0lORVQgKi8KIAl1X2ludDE2X3QgbDNwcm90bzsKIApAQCAtNzgsNiArNzUsMTIgQEAKIAlpbnQgKCpuZmF0dHJfdG9fdHVwbGUpKHN0cnVjdCBuZmF0dHIgKnRiW10sCiAJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CiAKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIJKmN0bF90YWJsZV9oZWFkZXI7CisJc3RydWN0IGN0bF90YWJsZQkqY3RsX3RhYmxlX3BhdGg7CisJc3RydWN0IGN0bF90YWJsZQkqY3RsX3RhYmxlOworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKwogCS8qIE1vZHVsZSAoaWYgYW55KSB3aGljaCB0aGlzIGlzIGNvbm5lY3RlZCB0by4gKi8KIAlzdHJ1Y3QgbW9kdWxlICptZTsKIH07CkBAIC04Niw3ICs4OSw3IEBACiAKIC8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90byk7Ci1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pOworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pOwogCiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICoKIG5mX2N0X2wzcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8pOwpAQCAtOTYsMTMgKzk5LDEzIEBACiAvKiBFeGlzdGluZyBidWlsdC1pbiBwcm90b2NvbHMgKi8KIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NDsKIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NjsKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2dlbmVyaWNfbDNwcm90bzsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYzsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKgogX19uZl9jdF9sM3Byb3RvX2ZpbmQodV9pbnQxNl90IGwzcHJvdG8pCiB7CiAJaWYgKHVubGlrZWx5KGwzcHJvdG8gPj0gQUZfTUFYKSkKLQkJcmV0dXJuICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvOworCQlyZXR1cm4gJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWM7CiAJcmV0dXJuIG5mX2N0X2wzcHJvdG9zW2wzcHJvdG9dOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmgKcmVuYW1lIHRvIGluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCmluZGV4IDFmMzM3MzcuLmZjOGFmMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBIZWFkZXIgZm9yIHVzZSBpbiBkZWZpbmluZyBhIGdpdmVuIHByb3RvY29sIGZvciBjb25uZWN0aW9uIHRyYWNraW5nLgorICogSGVhZGVyIGZvciB1c2UgaW4gZGVmaW5pbmcgYSBnaXZlbiBMNCBwcm90b2NvbCBmb3IgY29ubmVjdGlvbiB0cmFja2luZy4KICAqCiAgKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KICAqCS0gZ2VuZXJhbGl6ZWQgTDMgcHJvdG9jb2wgZGVwZW5kZW50IHBhcnQuCkBAIC03LDIzICs3LDIwIEBACiAgKiBEZXJpdmVkIGZyb20gaW5jbHVkZS9saW51eC9uZXRmaXRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90Y29sLmgKICAqLwogCi0jaWZuZGVmIF9ORl9DT05OVFJBQ0tfUFJPVE9DT0xfSAotI2RlZmluZSBfTkZfQ09OTlRSQUNLX1BST1RPQ09MX0gKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19MNFBST1RPX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19MNFBST1RPX0gKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogCiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgbmZhdHRyOwogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8KIHsKLQkvKiBOZXh0IHBvaW50ZXIuICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCiAJLyogTDMgUHJvdG9jb2wgbnVtYmVyLiAqLwogCXVfaW50MTZfdCBsM3Byb3RvOwogCi0JLyogUHJvdG9jb2wgbnVtYmVyLiAqLwotCXVfaW50OF90IHByb3RvOworCS8qIEw0IFByb3RvY29sIG51bWJlci4gKi8KKwl1X2ludDhfdCBsNHByb3RvOwogCiAJLyogUHJvdG9jb2wgbmFtZSAqLwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC03OSwzMCArNzYsNDAgQEAKIAlpbnQgKCpuZmF0dHJfdG9fdHVwbGUpKHN0cnVjdCBuZmF0dHIgKnRiW10sCiAJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CiAKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIJKipjdGxfdGFibGVfaGVhZGVyOworCXN0cnVjdCBjdGxfdGFibGUJKmN0bF90YWJsZTsKKwl1bnNpZ25lZCBpbnQJCSpjdGxfdGFibGVfdXNlcnM7CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAorCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyCSpjdGxfY29tcGF0X3RhYmxlX2hlYWRlcjsKKwlzdHJ1Y3QgY3RsX3RhYmxlCSpjdGxfY29tcGF0X3RhYmxlOworI2VuZGlmCisjZW5kaWYKKwogCS8qIE1vZHVsZSAoaWYgYW55KSB3aGljaCB0aGlzIGlzIGNvbm5lY3RlZCB0by4gKi8KIAlzdHJ1Y3QgbW9kdWxlICptZTsKIH07CiAKIC8qIEV4aXN0aW5nIGJ1aWx0LWluIHByb3RvY29scyAqLwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDY7Ci1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNDsKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA2OwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3RjcDY7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3VkcDQ7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3VkcDY7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWM7CiAKICNkZWZpbmUgTUFYX05GX0NUX1BST1RPIDI1NgotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKipuZl9jdF9wcm90b3NbUEZfTUFYXTsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipuZl9jdF9wcm90b3NbUEZfTUFYXTsKIAotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKgotX19uZl9jdF9wcm90b19maW5kKHVfaW50MTZfdCBsM3Byb3RvLCB1X2ludDhfdCBwcm90b2NvbCk7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoKK19fbmZfY3RfbDRwcm90b19maW5kKHVfaW50MTZfdCBsM3Byb3RvLCB1X2ludDhfdCBsNHByb3RvKTsKIAotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKgotbmZfY3RfcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IHByb3RvY29sKTsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKgorbmZfY3RfbDRwcm90b19maW5kX2dldCh1X2ludDE2X3QgbDNwcm90bywgdV9pbnQ4X3QgcHJvdG9jb2wpOwogCi1leHRlcm4gdm9pZCBuZl9jdF9wcm90b19wdXQoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcCk7CitleHRlcm4gdm9pZCBuZl9jdF9sNHByb3RvX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKnApOwogCiAvKiBQcm90b2NvbCByZWdpc3RyYXRpb24uICovCi1leHRlcm4gaW50IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90byk7Ci1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90byk7CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcHJvdG8pOworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcHJvdG8pOwogCiAvKiBHZW5lcmljIG5ldGxpbmsgaGVscGVycyAqLwogZXh0ZXJuIGludCBuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCmluZGV4IDUzMGVmMWYuLjVkNzJiMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKQEAgLTI0LDEwICsyNCwxMCBAQAogCiAvKiBUaGUgbDMgcHJvdG9jb2wtc3BlY2lmaWMgbWFuaXB1bGFibGUgcGFydHMgb2YgdGhlIHR1cGxlOiBhbHdheXMgaW4KICAgIG5ldHdvcmsgb3JkZXIhICovCi11bmlvbiBuZl9jb25udHJhY2tfbWFuX2wzcHJvdG8gewordW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgewogCXVfaW50MzJfdCBhbGxbTkZfQ1RfVFVQTEVfTDNTSVpFXTsKLQl1X2ludDMyX3QgaXA7Ci0JdV9pbnQzMl90IGlwNls0XTsKKwlfX2JlMzIgaXA7CisJX19iZTMyIGlwNls0XTsKIH07CiAKIC8qIFRoZSBwcm90b2NvbC1zcGVjaWZpYyBtYW5pcHVsYWJsZSBwYXJ0cyBvZiB0aGUgdHVwbGU6IGFsd2F5cyBpbgpAQCAtMzgsMjMgKzM4LDI2IEBACiAJdV9pbnQxNl90IGFsbDsKIAogCXN0cnVjdCB7Ci0JCXVfaW50MTZfdCBwb3J0OworCQlfX2JlMTYgcG9ydDsKIAl9IHRjcDsKIAlzdHJ1Y3QgewotCQl1X2ludDE2X3QgcG9ydDsKKwkJX19iZTE2IHBvcnQ7CiAJfSB1ZHA7CiAJc3RydWN0IHsKLQkJdV9pbnQxNl90IGlkOworCQlfX2JlMTYgaWQ7CiAJfSBpY21wOwogCXN0cnVjdCB7Ci0JCXVfaW50MTZfdCBwb3J0OworCQlfX2JlMTYgcG9ydDsKIAl9IHNjdHA7CisJc3RydWN0IHsKKwkJX19iZTE2IGtleTsJLyogR1JFIGtleSBpcyAzMmJpdCwgUFB0UCBvbmx5IHVzZXMgMTZiaXQgKi8KKwl9IGdyZTsKIH07CiAKIC8qIFRoZSBtYW5pcHVsYWJsZSBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KIHN0cnVjdCBuZl9jb25udHJhY2tfbWFuCiB7Ci0JdW5pb24gbmZfY29ubnRyYWNrX21hbl9sM3Byb3RvIHUzOworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIHUzOwogCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gdTsKIAkvKiBMYXllciAzIHByb3RvY29sICovCiAJdV9pbnQxNl90IGwzbnVtOwpAQCAtNjcsMjcgKzcwLDI2IEBACiAKIAkvKiBUaGVzZSBhcmUgdGhlIHBhcnRzIG9mIHRoZSB0dXBsZSB3aGljaCBhcmUgZml4ZWQuICovCiAJc3RydWN0IHsKLQkJdW5pb24gewotCQkJdV9pbnQzMl90IGFsbFtORl9DVF9UVVBMRV9MM1NJWkVdOwotCQkJdV9pbnQzMl90IGlwOwotCQkJdV9pbnQzMl90IGlwNls0XTsKLQkJfSB1MzsKKwkJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgdTM7CiAJCXVuaW9uIHsKIAkJCS8qIEFkZCBvdGhlciBwcm90b2NvbHMgaGVyZS4gKi8KIAkJCXVfaW50MTZfdCBhbGw7CiAKIAkJCXN0cnVjdCB7Ci0JCQkJdV9pbnQxNl90IHBvcnQ7CisJCQkJX19iZTE2IHBvcnQ7CiAJCQl9IHRjcDsKIAkJCXN0cnVjdCB7Ci0JCQkJdV9pbnQxNl90IHBvcnQ7CisJCQkJX19iZTE2IHBvcnQ7CiAJCQl9IHVkcDsKIAkJCXN0cnVjdCB7CiAJCQkJdV9pbnQ4X3QgdHlwZSwgY29kZTsKIAkJCX0gaWNtcDsKIAkJCXN0cnVjdCB7Ci0JCQkJdV9pbnQxNl90IHBvcnQ7CisJCQkJX19iZTE2IHBvcnQ7CiAJCQl9IHNjdHA7CisJCQlzdHJ1Y3QgeworCQkJCV9fYmUxNiBrZXk7CisJCQl9IGdyZTsKIAkJfSB1OwogCiAJCS8qIFRoZSBwcm90b2NvbC4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWM2MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX05GX05BVF9ICisjZGVmaW5lIF9ORl9OQVRfSAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KKworI2RlZmluZSBORl9OQVRfTUFQUElOR19UWVBFX01BWF9OQU1FTEVOIDE2CisKK2VudW0gbmZfbmF0X21hbmlwX3R5cGUKK3sKKwlJUF9OQVRfTUFOSVBfU1JDLAorCUlQX05BVF9NQU5JUF9EU1QKK307CisKKy8qIFNSQyBtYW5pcCBvY2N1cnMgUE9TVF9ST1VUSU5HIG9yIExPQ0FMX0lOICovCisjZGVmaW5lIEhPT0syTUFOSVAoaG9va251bSkgKChob29rbnVtKSAhPSBORl9JUF9QT1NUX1JPVVRJTkcgJiYgKGhvb2tudW0pICE9IE5GX0lQX0xPQ0FMX0lOKQorCisjZGVmaW5lIElQX05BVF9SQU5HRV9NQVBfSVBTIDEKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCAyCisKKy8qIE5BVCBzZXF1ZW5jZSBudW1iZXIgbW9kaWZpY2F0aW9ucyAqLworc3RydWN0IG5mX25hdF9zZXEgeworCS8qIHBvc2l0aW9uIG9mIHRoZSBsYXN0IFRDUCBzZXF1ZW5jZSBudW1iZXIgbW9kaWZpY2F0aW9uIChpZiBhbnkpICovCisJdV9pbnQzMl90IGNvcnJlY3Rpb25fcG9zOworCisJLyogc2VxdWVuY2UgbnVtYmVyIG9mZnNldCBiZWZvcmUgYW5kIGFmdGVyIGxhc3QgbW9kaWZpY2F0aW9uICovCisJaW50MTZfdCBvZmZzZXRfYmVmb3JlLCBvZmZzZXRfYWZ0ZXI7Cit9OworCisvKiBTaW5nbGUgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4gKi8KK3N0cnVjdCBuZl9uYXRfcmFuZ2UKK3sKKwkvKiBTZXQgdG8gT1Igb2YgZmxhZ3MgYWJvdmUuICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyLiAqLworCV9fYmUzMiBtaW5faXAsIG1heF9pcDsKKworCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlciAqLworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gbWluLCBtYXg7Cit9OworCisvKiBGb3IgYmFja3dhcmRzIGNvbXBhdDogZG9uJ3QgdXNlIGluIG1vZGVybiBjb2RlLiAqLworc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQKK3sKKwl1bnNpZ25lZCBpbnQgcmFuZ2VzaXplOyAvKiBNdXN0IGJlIDEuICovCisKKwkvKiBoYW5ncyBvZmYgZW5kLiAqLworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2VbMV07Cit9OworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyogVGhlIHN0cnVjdHVyZSBlbWJlZGRlZCBpbiB0aGUgY29ubnRyYWNrIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBuZl9uYXRfaW5mbworeworCXN0cnVjdCBsaXN0X2hlYWQgYnlzb3VyY2U7CisJc3RydWN0IG5mX25hdF9zZXEgc2VxW0lQX0NUX0RJUl9NQVhdOworfTsKKworc3RydWN0IG5mX2Nvbm47CisKKy8qIFNldCB1cCB0aGUgaW5mbyBzdHJ1Y3R1cmUgdG8gbWFwIGludG8gdGhpcyByYW5nZS4gKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfbmF0X3NldHVwX2luZm8oc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKKworLyogSXMgdGhpcyB0dXBsZSBhbHJlYWR5IHRha2VuPyAobm90IGJ5IHVzKSovCitleHRlcm4gaW50IG5mX25hdF91c2VkX3R1cGxlKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqaWdub3JlZF9jb25udHJhY2spOworCitleHRlcm4gaW50IG5mX25hdF9tb2R1bGVfaXNfbG9hZGVkOworCisjZWxzZSAgLyogIV9fS0VSTkVMX186IGlwdGFibGVzIHdhbnRzIHRoaXMgdG8gY29tcGlsZS4gKi8KKyNkZWZpbmUgbmZfbmF0X211bHRpX3JhbmdlIG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQKKyNlbmRpZiAvKl9fS0VSTkVMX18qLworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzhmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9ORl9OQVRfQ09SRV9ICisjZGVmaW5lIF9ORl9OQVRfQ09SRV9ICisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisKKy8qIFRoaXMgaGVhZGVyIHVzZWQgdG8gc2hhcmUgY29yZSBmdW5jdGlvbmFsaXR5IGJldHdlZW4gdGhlIHN0YW5kYWxvbmUKKyAgIE5BVCBtb2R1bGUsIGFuZCB0aGUgY29tcGF0aWJpbGl0eSBsYXllcidzIHVzZSBvZiBOQVQgZm9yIG1hc3F1ZXJhZGluZy4gKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9uYXRfcGFja2V0KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOworCitleHRlcm4gaW50IG5mX25hdF9pY21wX3JlcGx5X3RyYW5zbGF0aW9uKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCQkgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOworCitzdGF0aWMgaW5saW5lIGludCBuZl9uYXRfaW5pdGlhbGl6ZWQoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcCkKK3sKKwlpZiAobWFuaXAgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJcmV0dXJuIHRlc3RfYml0KElQU19TUkNfTkFUX0RPTkVfQklULCAmY3QtPnN0YXR1cyk7CisJZWxzZQorCQlyZXR1cm4gdGVzdF9iaXQoSVBTX0RTVF9OQVRfRE9ORV9CSVQsICZjdC0+c3RhdHVzKTsKK30KKyNlbmRpZiAvKiBfTkZfTkFUX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5OGVjZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfTkZfTkFUX0hFTFBFUl9ICisjZGVmaW5lIF9ORl9OQVRfSEVMUEVSX0gKKy8qIE5BVCBwcm90b2NvbCBoZWxwZXIgcm91dGluZXMuICovCisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorCitzdHJ1Y3Qgc2tfYnVmZjsKKworLyogVGhlc2UgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCitleHRlcm4gaW50IG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnNrYiwKKwkJCQkgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKKwkJCQkgICAgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlcF9sZW4pOworZXh0ZXJuIGludCBuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKipza2IsCisJCQkJICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJICAgIHVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCisJCQkJICAgIHVuc2lnbmVkIGludCBtYXRjaF9sZW4sCisJCQkJICAgIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCisJCQkJICAgIHVuc2lnbmVkIGludCByZXBfbGVuKTsKK2V4dGVybiBpbnQgbmZfbmF0X3NlcV9hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKTsKKworLyogU2V0dXAgTkFUIG9uIHRoaXMgZXhwZWN0ZWQgY29ubnRyYWNrIHNvIGl0IGZvbGxvd3MgbWFzdGVyLCBidXQgZ29lcworICogdG8gcG9ydCBjdC0+bWFzdGVyLT5zYXZlZF9wcm90by4gKi8KK2V4dGVybiB2b2lkIG5mX25hdF9mb2xsb3dfbWFzdGVyKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnRoaXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllYzVlZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaApAQCAtMCwwICsxLDcwIEBACisvKiBIZWFkZXIgZm9yIHVzZSBpbiBkZWZpbmluZyBhIGdpdmVuIHByb3RvY29sLiAqLworI2lmbmRlZiBfTkZfTkFUX1BST1RPQ09MX0gKKyNkZWZpbmUgX05GX05BVF9QUk9UT0NPTF9ICisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oPgorCitzdHJ1Y3QgbmZfbmF0X3JhbmdlOworCitzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sCit7CisJLyogUHJvdG9jb2wgbmFtZSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBQcm90b2NvbCBudW1iZXIuICovCisJdW5zaWduZWQgaW50IHByb3RvbnVtOworCisJc3RydWN0IG1vZHVsZSAqbWU7CisKKwkvKiBUcmFuc2xhdGUgYSBwYWNrZXQgdG8gdGhlIHRhcmdldCBhY2NvcmRpbmcgdG8gbWFuaXAgdHlwZS4KKwkgICBSZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkZWQuICovCisJaW50ICgqbWFuaXBfcGt0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgdW5zaWduZWQgaW50IGlwaGRyb2ZmLAorCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKTsKKworCS8qIElzIHRoZSBtYW5pcGFibGUgcGFydCBvZiB0aGUgdHVwbGUgYmV0d2VlbiBtaW4gYW5kIG1heCBpbmNsPyAqLworCWludCAoKmluX3JhbmdlKShjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJCWVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCQkJY29uc3QgdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byAqbWluLAorCQkJY29uc3QgdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byAqbWF4KTsKKworCS8qIEFsdGVyIHRoZSBwZXItcHJvdG8gcGFydCBvZiB0aGUgdHVwbGUgKGRlcGVuZGluZyBvbgorCSAgIG1hbmlwdHlwZSksIHRvIGdpdmUgYSB1bmlxdWUgdHVwbGUgaW4gdGhlIGdpdmVuIHJhbmdlIGlmCisJICAgcG9zc2libGU7IHJldHVybiBmYWxzZSBpZiBub3QuICBQZXItcHJvdG9jb2wgcGFydCBvZiB0dXBsZQorCSAgIGlzIGluaXRpYWxpemVkIHRvIHRoZSBpbmNvbWluZyBwYWNrZXQuICovCisJaW50ICgqdW5pcXVlX3R1cGxlKShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJCSAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpOworCisJaW50ICgqcmFuZ2VfdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKTsKKworCWludCAoKm5mYXR0cl90b19yYW5nZSkoc3RydWN0IG5mYXR0ciAqdGJbXSwKKwkJCSAgICAgICBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSk7Cit9OworCisvKiBQcm90b2NvbCByZWdpc3RyYXRpb24uICovCitleHRlcm4gaW50IG5mX25hdF9wcm90b2NvbF9yZWdpc3RlcihzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpwcm90byk7CitleHRlcm4gdm9pZCBuZl9uYXRfcHJvdG9jb2xfdW5yZWdpc3RlcihzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpwcm90byk7CisKK2V4dGVybiBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpuZl9uYXRfcHJvdG9fZmluZF9nZXQodV9pbnQ4X3QgcHJvdG9jb2wpOworZXh0ZXJuIHZvaWQgbmZfbmF0X3Byb3RvX3B1dChzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpwcm90byk7CisKKy8qIEJ1aWx0LWluIHByb3RvY29scy4gKi8KK2V4dGVybiBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF9wcm90b2NvbF90Y3A7CitleHRlcm4gc3RydWN0IG5mX25hdF9wcm90b2NvbCBuZl9uYXRfcHJvdG9jb2xfdWRwOworZXh0ZXJuIHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX2ljbXA7CitleHRlcm4gc3RydWN0IG5mX25hdF9wcm90b2NvbCBuZl9uYXRfdW5rbm93bl9wcm90b2NvbDsKKworZXh0ZXJuIGludCBpbml0X3Byb3RvY29scyh2b2lkKSBfX2luaXQ7CitleHRlcm4gdm9pZCBjbGVhbnVwX3Byb3RvY29scyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpmaW5kX25hdF9wcm90byh1X2ludDE2X3QgcHJvdG9udW0pOworCitleHRlcm4gaW50IG5mX25hdF9wb3J0X3JhbmdlX3RvX25mYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSk7CitleHRlcm4gaW50IG5mX25hdF9wb3J0X25mYXR0cl90b19yYW5nZShzdHJ1Y3QgbmZhdHRyICp0YltdLAorCQkJCSAgICAgICBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSk7CisKKyNlbmRpZiAvKl9ORl9OQVRfUFJPVE9fSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTFjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIF9ORl9OQVRfUlVMRV9ICisjZGVmaW5lIF9ORl9OQVRfUlVMRV9ICisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCisvKiBDb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBpcHRfRk9PIG1vZHVsZXMgKi8KKyNkZWZpbmUgaXBfbmF0X3JhbmdlCQkJbmZfbmF0X3JhbmdlCisjZGVmaW5lIGlwX2Nvbm50cmFja190dXBsZQkJbmZfY29ubnRyYWNrX3R1cGxlCisjZGVmaW5lIGlwX2Nvbm50cmFja19nZXQJCW5mX2N0X2dldAorI2RlZmluZSBpcF9jb25udHJhY2sJCQluZl9jb25uCisjZGVmaW5lIGlwX25hdF9zZXR1cF9pbmZvCQluZl9uYXRfc2V0dXBfaW5mbworI2RlZmluZSBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0CW5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQKKyNkZWZpbmUgaXBfY3RfaXRlcmF0ZV9jbGVhbnVwCQluZl9jdF9pdGVyYXRlX2NsZWFudXAKKyNkZWZpbmUJSVBfTkZfQVNTRVJUCQkJTkZfQ1RfQVNTRVJUCisKK2V4dGVybiBpbnQgbmZfbmF0X3J1bGVfaW5pdCh2b2lkKSBfX2luaXQ7CitleHRlcm4gdm9pZCBuZl9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpOworZXh0ZXJuIGludCBuZl9uYXRfcnVsZV9maW5kKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgc3RydWN0IG5mX25hdF9pbmZvICppbmZvKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludAorYWxsb2NfbnVsbF9iaW5kaW5nKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgc3RydWN0IG5mX25hdF9pbmZvICppbmZvLAorCQkgICB1bnNpZ25lZCBpbnQgaG9va251bSk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQKK2FsbG9jX251bGxfYmluZGluZ19jb25maXJtZWQoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm8sCisJCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKKyNlbmRpZiAvKiBfTkZfTkFUX1JVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaCBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKaW5kZXggMTJjMjE0Yi4uODNkYTdlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAorKysgYi9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCkBAIC0xMTEsMTMgKzExMSwzNCBAQAogCXZvaWQgKCpmcmVlKSAoY29uc3Qgdm9pZCAqZGF0YSk7CiAJdm9pZCAqZGF0YTsKIH07CisvKiBUaGUgY2F0bWFwIGJpdG1hcCBmaWVsZCBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvIGluIGxlbmd0aCBhbmQgbGFyZ2UKKyAqIGVub3VnaCB0byBob2xkIGF0IGxlYXN0IDI0MCBiaXRzLiAgU3BlY2lhbCBjYXJlIChpLmUuIGNoZWNrIHRoZSBjb2RlISkKKyAqIHNob3VsZCBiZSB1c2VkIHdoZW4gY2hhbmdpbmcgdGhlc2UgdmFsdWVzIGFzIHRoZSBMU00gaW1wbGVtZW50YXRpb24KKyAqIHByb2JhYmx5IGhhcyBmdW5jdGlvbnMgd2hpY2ggcmVseSBvbiB0aGUgc2l6ZXMgb2YgdGhlc2UgdHlwZXMgdG8gc3BlZWQKKyAqIHByb2Nlc3NpbmcuICovCisjZGVmaW5lIE5FVExCTF9DQVRNQVBfTUFQVFlQRSAgICAgICAgICAgdTY0CisjZGVmaW5lIE5FVExCTF9DQVRNQVBfTUFQQ05UICAgICAgICAgICAgNAorI2RlZmluZSBORVRMQkxfQ0FUTUFQX01BUFNJWkUgICAgICAgICAgIChzaXplb2YoTkVUTEJMX0NBVE1BUF9NQVBUWVBFKSAqIDgpCisjZGVmaW5lIE5FVExCTF9DQVRNQVBfU0laRSAgICAgICAgICAgICAgKE5FVExCTF9DQVRNQVBfTUFQU0laRSAqIFwKKwkJCQkJIE5FVExCTF9DQVRNQVBfTUFQQ05UKQorI2RlZmluZSBORVRMQkxfQ0FUTUFQX0JJVCAgICAgICAgICAgICAgIChORVRMQkxfQ0FUTUFQX01BUFRZUEUpMHgwMQorc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgeworCXUzMiBzdGFydGJpdDsKKwlORVRMQkxfQ0FUTUFQX01BUFRZUEUgYml0bWFwW05FVExCTF9DQVRNQVBfTUFQQ05UXTsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqbmV4dDsKK307CisjZGVmaW5lIE5FVExCTF9TRUNBVFRSX05PTkUgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBORVRMQkxfU0VDQVRUUl9ET01BSU4gICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTkVUTEJMX1NFQ0FUVFJfQ0FDSEUgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5FVExCTF9TRUNBVFRSX01MU19MVkwgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUICAgICAgICAgIDB4MDAwMDAwMDgKIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgeworCXUzMiBmbGFnczsKKwogCWNoYXIgKmRvbWFpbjsKIAogCXUzMiBtbHNfbHZsOwotCXUzMiBtbHNfbHZsX3ZsZDsKLQl1bnNpZ25lZCBjaGFyICptbHNfY2F0OwotCXNpemVfdCBtbHNfY2F0X2xlbjsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqbWxzX2NhdDsKIAogCXN0cnVjdCBuZXRsYmxfbHNtX2NhY2hlICpjYWNoZTsKIH07CkBAIC0xNjUsMTggKzE4Niw1NCBAQAogfQogCiAvKioKKyAqIG5ldGxibF9zZWNhdHRyX2NhdG1hcF9hbGxvYyAtIEFsbG9jYXRlIGEgTFNNIHNlY2F0dHIgY2F0bWFwCisgKiBAZmxhZ3M6IG1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgTFNNIHNlY2F0dHIgY2F0bWFwLCByZXR1cm5zIGEgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMCisgKiBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwKSwgZmxhZ3MpOworfQorCisvKioKKyAqIG5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlIC0gRnJlZSBhIExTTSBzZWNhdHRyIGNhdG1hcAorICogQGNhdG1hcDogdGhlIGNhdGVnb3J5IGJpdG1hcAorICoKKyAqIERlc2NyaXB0aW9uOgorICogRnJlZSBhIExTTSBzZWNhdHRyIGNhdG1hcC4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfZnJlZSgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwKQoreworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICppdGVyOworCisJZG8geworCQlpdGVyID0gY2F0bWFwOworCQljYXRtYXAgPSBjYXRtYXAtPm5leHQ7CisJCWtmcmVlKGl0ZXIpOworCX0gd2hpbGUgKGNhdG1hcCk7Cit9CisKKy8qKgogICogbmV0bGJsX3NlY2F0dHJfaW5pdCAtIEluaXRpYWxpemUgYSBuZXRsYmxfbHNtX3NlY2F0dHIgc3RydWN0CiAgKiBAc2VjYXR0cjogdGhlIHN0cnVjdCB0byBpbml0aWFsaXplCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplIGFuIGFscmVhZHkgYWxsb2NhdGVkIG5ldGxibF9sc21fc2VjYXR0ciBzdHJ1Y3QuICBSZXR1cm5zIHplcm8gb24KLSAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvci4KKyAqIEluaXRpYWxpemUgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgbmV0bGJsX2xzbV9zZWNhdHRyIHN0cnVjdC4KICAqCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9zZWNhdHRyX2luaXQoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9pbml0KHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JbWVtc2V0KHNlY2F0dHIsIDAsIHNpemVvZigqc2VjYXR0cikpOwotCXJldHVybiAwOworCXNlY2F0dHItPmZsYWdzID0gMDsKKwlzZWNhdHRyLT5kb21haW4gPSBOVUxMOworCXNlY2F0dHItPm1sc19jYXQgPSBOVUxMOworCXNlY2F0dHItPmNhY2hlID0gTlVMTDsKIH0KIAogLyoqCkBAIC0xOTMsNyArMjUwLDggQEAKIAlpZiAoc2VjYXR0ci0+Y2FjaGUpCiAJCW5ldGxibF9zZWNhdHRyX2NhY2hlX2ZyZWUoc2VjYXR0ci0+Y2FjaGUpOwogCWtmcmVlKHNlY2F0dHItPmRvbWFpbik7Ci0Ja2ZyZWUoc2VjYXR0ci0+bWxzX2NhdCk7CisJaWYgKHNlY2F0dHItPm1sc19jYXQpCisJCW5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlKHNlY2F0dHItPm1sc19jYXQpOwogfQogCiAvKioKQEAgLTIwNSw3ICsyNjMsNyBAQAogICogcG9pbnRlciBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKm5ldGxibF9zZWNhdHRyX2FsbG9jKGludCBmbGFncykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqbmV0bGJsX3NlY2F0dHJfYWxsb2MoZ2ZwX3QgZmxhZ3MpCiB7CiAJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIpLCBmbGFncyk7CiB9CkBAIC0yMjQsNiArMjgyLDUxIEBACiAJa2ZyZWUoc2VjYXR0cik7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUTEFCRUwKK2ludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJICAgICAgIHUzMiBvZmZzZXQpOworaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrX3JuZyhzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJCSAgIHUzMiBvZmZzZXQpOworaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRiaXQoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgdTMyIGJpdCwKKwkJCQkgZ2ZwX3QgZmxhZ3MpOworaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRybmcoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgdTMyIHN0YXJ0LAorCQkJCSB1MzIgZW5kLAorCQkJCSBnZnBfdCBmbGFncyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGsoCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgICAgICB1MzIgb2Zmc2V0KQoreworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2Fsa19ybmcoCisJCQkJICAgICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgICAgICB1MzIgb2Zmc2V0KQoreworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfc2V0Yml0KAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXAsCisJCQkJICAgICAgdTMyIGJpdCwKKwkJCQkgICAgICBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldHJuZygKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJCSAgICAgIHUzMiBzdGFydCwKKwkJCQkgICAgICB1MzIgZW5kLAorCQkJCSAgICAgIGdmcF90IGZsYWdzKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qCiAgKiBMU00gcHJvdG9jb2wgb3BlcmF0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsaW5rLmggYi9pbmNsdWRlL25ldC9uZXRsaW5rLmgKaW5kZXggY2U1Y2JhMS4uYmNhZjY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiAgICAgICAgIE5ldGxpbmsgTWVzc2FnZXMgYW5kIEF0dHJpYnV0ZXMgSW50ZXJmYWNlIChBcyBTZWVuIE9uIFRWKQpAQCAtNTAwLDE0ICs1MDEsMTUgQEAKIAogLyoqCiAgKiBubG1zZ19uZXcgLSBBbGxvY2F0ZSBhIG5ldyBuZXRsaW5rIG1lc3NhZ2UKLSAqIEBzaXplOiBtYXhpbXVtIHNpemUgb2YgbWVzc2FnZQorICogQHBheWxvYWQ6IHNpemUgb2YgdGhlIG1lc3NhZ2UgcGF5bG9hZAogICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCiAgKgotICogVXNlIE5MTVNHX0dPT0RTSVpFIGlmIHNpemUgaXNuJ3Qga25vdyBhbmQgeW91IG5lZWQgYSBnb29kIGRlZmF1bHQgc2l6ZS4KKyAqIFVzZSBOTE1TR19ERUZBVUxUX1NJWkUgaWYgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgaXNuJ3Qga25vd24KKyAqIGFuZCBhIGdvb2QgZGVmYXVsdCBpcyBuZWVkZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5sbXNnX25ldyhpbnQgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpubG1zZ19uZXcoc2l6ZV90IHBheWxvYWQsIGdmcF90IGZsYWdzKQogewotCXJldHVybiBhbGxvY19za2Ioc2l6ZSwgZmxhZ3MpOworCXJldHVybiBhbGxvY19za2Iobmxtc2dfdG90YWxfc2l6ZShwYXlsb2FkKSwgZmxhZ3MpOwogfQogCiAvKioKQEAgLTgyOCw2ICs4MzAsOSBAQAogI2RlZmluZSBOTEFfUFVUX1UxNihza2IsIGF0dHJ0eXBlLCB2YWx1ZSkgXAogCU5MQV9QVVRfVFlQRShza2IsIHUxNiwgYXR0cnR5cGUsIHZhbHVlKQogCisjZGVmaW5lIE5MQV9QVVRfTEUxNihza2IsIGF0dHJ0eXBlLCB2YWx1ZSkgXAorCU5MQV9QVVRfVFlQRShza2IsIF9fbGUxNiwgYXR0cnR5cGUsIHZhbHVlKQorCiAjZGVmaW5lIE5MQV9QVVRfVTMyKHNrYiwgYXR0cnR5cGUsIHZhbHVlKSBcCiAJTkxBX1BVVF9UWVBFKHNrYiwgdTMyLCBhdHRydHlwZSwgdmFsdWUpCiAKQEAgLTg3NCw2ICs4NzksMTUgQEAKIH0KIAogLyoqCisgKiBubGFfZ2V0X2xlMTYgLSByZXR1cm4gcGF5bG9hZCBvZiBfX2xlMTYgYXR0cmlidXRlCisgKiBAbmxhOiBfX2xlMTYgbmV0bGluayBhdHRyaWJ1dGUKKyAqLworc3RhdGljIGlubGluZSBfX2xlMTYgbmxhX2dldF9sZTE2KHN0cnVjdCBubGF0dHIgKm5sYSkKK3sKKwlyZXR1cm4gKihfX2xlMTYgKikgbmxhX2RhdGEobmxhKTsKK30KKworLyoqCiAgKiBubGFfZ2V0X3U4IC0gcmV0dXJuIHBheWxvYWQgb2YgdTggYXR0cmlidXRlCiAgKiBAbmxhOiB1OCBuZXRsaW5rIGF0dHJpYnV0ZQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAppbmRleCBjNjQzYmNlLi4xMDViZjEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKQEAgLTUwLDcgKzUwLDcgQEAKIAl2b2lkCSgqZXJyX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICAgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCiAJCQkgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LAotCQkJICAgICAgIF9fdTMyIGluZm8pOworCQkJICAgICAgIF9fYmUzMiBpbmZvKTsKIAogCWludAkoKmdzb19zZW5kX2NoZWNrKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnc29fc2VnbWVudCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTcxLDcgKzcxLDcgQEAKIAogICAgICAgICAvKiBUaGVzZSB0d28gZmllbGRzIGZvcm0gdGhlIGxvb2t1cCBrZXkuICAqLwogCXVuc2lnbmVkIHNob3J0CSB0eXBlOwkgICAvKiBUaGlzIGlzIHRoZSAybmQgYXJndW1lbnQgdG8gc29ja2V0KDIpLiAqLwotCWludAkJIHByb3RvY29sOyAvKiBUaGlzIGlzIHRoZSBMNCBwcm90b2NvbCBudW1iZXIuICAqLworCXVuc2lnbmVkIHNob3J0CSBwcm90b2NvbDsgLyogVGhpcyBpcyB0aGUgTDQgcHJvdG9jb2wgbnVtYmVyLiAgKi8KIAogCXN0cnVjdCBwcm90bwkgKnByb3Q7CiAJY29uc3Qgc3RydWN0IHByb3RvX29wcyAqb3BzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcmF3djYuaCBiL2luY2x1ZGUvbmV0L3Jhd3Y2LmgKaW5kZXggMTQ0NzZhNy4uYWY4OTYwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcmF3djYuaAorKysgYi9pbmNsdWRlL25ldC9yYXd2Ni5oCkBAIC0yMSw3ICsyMSw3IEBACiAJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKIAkJCQkJICBpbnQgdHlwZSwgaW50IGNvZGUsIAotCQkJCQkgIGludCBvZmZzZXQsIHUzMiBpbmZvKTsKKwkJCQkJICBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbyk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9yZXF1ZXN0X3NvY2suaCBiL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCmluZGV4IDhlMTY1Y2EuLmUzN2JhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCkBAIC0yOCwxNCArMjgsMTUgQEAKIAogc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgewogCWludAkJZmFtaWx5OwotCWttZW1fY2FjaGVfdAkqc2xhYjsKIAlpbnQJCW9ial9zaXplOworCWttZW1fY2FjaGVfdAkqc2xhYjsKIAlpbnQJCSgqcnR4X3N5bl9hY2spKHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAogCQkJCSAgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCXZvaWQJCSgqc2VuZF9hY2spKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7Ci0Jdm9pZAkJKCpzZW5kX3Jlc2V0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwl2b2lkCQkoKnNlbmRfcmVzZXQpKHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAl2b2lkCQkoKmRlc3RydWN0b3IpKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CiB9OwogCkBAIC01MSwxMiArNTIsMTMgQEAKIAl1MzIJCQkJcmN2X3duZDsJICAvKiByY3Zfd25kIG9mZmVyZWQgZmlyc3QgdGltZSAqLwogCXUzMgkJCQl0c19yZWNlbnQ7CiAJdW5zaWduZWQgbG9uZwkJCWV4cGlyZXM7Ci0Jc3RydWN0IHJlcXVlc3Rfc29ja19vcHMJCSpyc2tfb3BzOworCWNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzCSpyc2tfb3BzOwogCXN0cnVjdCBzb2NrCQkJKnNrOwogCXUzMgkJCQlzZWNpZDsKKwl1MzIJCQkJcGVlcl9zZWNpZDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxc2tfYWxsb2Moc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgKm9wcykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxc2tfYWxsb2MoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKG9wcy0+c2xhYiwgU0xBQl9BVE9NSUMpOwogCkBAIC0xMjAsNyArMTIyLDcgQEAKIH07CiAKIGV4dGVybiBpbnQgcmVxc2tfcXVldWVfYWxsb2Moc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUsCi0JCQkgICAgIGNvbnN0IGludCBucl90YWJsZV9lbnRyaWVzKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IG5yX3RhYmxlX2VudHJpZXMpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0ZW5fc29jayAqcmVxc2tfcXVldWVfeWFua19saXN0ZW5fc2soc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAppbmRleCBiMGU5MTA4Li44MjA4NjM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKQEAgLTYwLDYgKzYwLDcgQEAKIAlpbnQJCQkoKmdyYWZ0KShzdHJ1Y3QgUWRpc2MgKiwgdW5zaWduZWQgbG9uZyBjbCwKIAkJCQkJc3RydWN0IFFkaXNjICosIHN0cnVjdCBRZGlzYyAqKik7CiAJc3RydWN0IFFkaXNjICoJCSgqbGVhZikoc3RydWN0IFFkaXNjICosIHVuc2lnbmVkIGxvbmcgY2wpOworCXZvaWQJCQkoKnFsZW5fbm90aWZ5KShzdHJ1Y3QgUWRpc2MgKiwgdW5zaWduZWQgbG9uZyk7CiAKIAkvKiBDbGFzcyBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KIAl1bnNpZ25lZCBsb25nCQkoKmdldCkoc3RydWN0IFFkaXNjICosIHUzMiBjbGFzc2lkKTsKQEAgLTE0NCw3ICsxNDUsNyBAQAogCXZvaWQJCQkqcm9vdDsKIAlpbnQJCQkoKmNsYXNzaWZ5KShzdHJ1Y3Qgc2tfYnVmZiosIHN0cnVjdCB0Y2ZfcHJvdG8qLAogCQkJCQlzdHJ1Y3QgdGNmX3Jlc3VsdCAqKTsKLQl1MzIJCQlwcm90b2NvbDsKKwlfX2JlMTYJCQlwcm90b2NvbDsKIAogCS8qIEFsbCB0aGUgcmVzdCAqLwogCXUzMgkJCXByaW87CkBAIC0xNzIsOSArMTczLDEwIEBACiBleHRlcm4gdm9pZCBkZXZfZGVhY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHFkaXNjX3Jlc2V0KHN0cnVjdCBRZGlzYyAqcWRpc2MpOwogZXh0ZXJuIHZvaWQgcWRpc2NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKK2V4dGVybiB2b2lkIHFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihzdHJ1Y3QgUWRpc2MgKnFkaXNjLCB1bnNpZ25lZCBpbnQgbik7CiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpOwogZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzKTsKKwkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzLCB1MzIgcGFyZW50aWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHRjZl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmggYi9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaAppbmRleCA4MDdkNmYxLi42MTE0YzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaApAQCAtMTE2LDkgKzExNiwxMSBAQAogdHlwZWRlZiB1bmlvbiB7CiAJX19zMzIgaTMyOwogCV9fdTMyIHUzMjsKKwlfX2JlMzIgYmUzMjsKIAlfX3UxNiB1MTY7CiAJX191OCB1ODsKIAlpbnQgZXJyb3I7CisJX19iZTE2IGVycjsKIAlzY3RwX3N0YXRlX3Qgc3RhdGU7CiAJc2N0cF9ldmVudF90aW1lb3V0X3QgdG87CiAJdW5zaWduZWQgbG9uZyB6ZXJvOwpAQCAtMTY0LDkgKzE2NiwxMSBAQAogCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihJMzIsCV9fczMyLCBpMzIpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihVMzIsCV9fdTMyLCB1MzIpCitTQ1RQX0FSR19DT05TVFJVQ1RPUihCRTMyLAlfX2JlMzIsIGJlMzIpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihVMTYsCV9fdTE2LCB1MTYpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihVOCwJX191OCwgdTgpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihFUlJPUiwgICAgIGludCwgZXJyb3IpCitTQ1RQX0FSR19DT05TVFJVQ1RPUihQRVJSLCAgICAgIF9fYmUxNiwgZXJyKQkvKiBwcm90b2NvbCBlcnJvciAqLwogU0NUUF9BUkdfQ09OU1RSVUNUT1IoU1RBVEUsCXNjdHBfc3RhdGVfdCwgc3RhdGUpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihUTywJc2N0cF9ldmVudF90aW1lb3V0X3QsIHRvKQogU0NUUF9BUkdfQ09OU1RSVUNUT1IoUFRSLAl2b2lkICosIHB0cikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmggYi9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCmluZGV4IDZjNjMyZTIuLjVkZGI4NTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaApAQCAtMzU2LDcgKzM1Niw3IEBACiAgKiBhZGRyZXNzZXMuCiAgKi8KICNkZWZpbmUgSVNfSVBWNF9VTlVTQUJMRV9BRERSRVNTKGEpIFwKLQkoKElOQUREUl9CUk9BRENBU1QgPT0gKmEpIHx8IFwKKwkoKGh0b25sKElOQUREUl9CUk9BRENBU1QpID09ICphKSB8fCBcCiAJKE1VTFRJQ0FTVCgqYSkpIHx8IFwKIAkoKCh1bnNpZ25lZCBjaGFyICopKGEpKVswXSA9PSAwKSB8fCBcCiAJKCgoKHVuc2lnbmVkIGNoYXIgKikoYSkpWzBdID09IDE5OCkgJiYgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCA3NjRlM2FmLi4yMTU0NjFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtNTg1LDcgKzU4NSw3IEBACiB9CiAKIC8qIENvbnZlcnQgZnJvbSBhbiBhZGRyZXNzIHBhcmFtZXRlciB0eXBlIHRvIGFuIGFkZHJlc3MgZmFtaWx5LiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHBhcmFtX3R5cGUyYWYoX191MTYgdHlwZSkKK3N0YXRpYyBpbmxpbmUgaW50IHBhcmFtX3R5cGUyYWYoX19iZTE2IHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBTQ1RQX1BBUkFNX0lQVjRfQUREUkVTUzoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaCBiL2luY2x1ZGUvbmV0L3NjdHAvc20uaAppbmRleCBkZTMxM2RlLi4zMjY5ZWQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NtLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJCQkJICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqKTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2Vfc2h1dGRvd25fY29tcGxldGUoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkJICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqKTsKLXZvaWQgc2N0cF9pbml0X2NhdXNlKHN0cnVjdCBzY3RwX2NodW5rICosIF9fdTE2IGNhdXNlLCBjb25zdCB2b2lkICosIHNpemVfdCk7Cit2b2lkIHNjdHBfaW5pdF9jYXVzZShzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBfX2JlMTYgY2F1c2UsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfYWJvcnQoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICosCiAJCQkgICAgICBjb25zdCBzaXplX3QgaGludCk7CkBAIC0yMzYsMTQgKzIzNiwxNCBAQAogCQkJCSAgICAgIGNvbnN0IHNpemVfdCBwYXlsZW4pOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9vcF9lcnJvcihjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJIF9fdTE2IGNhdXNlX2NvZGUsCisJCQkJIF9fYmUxNiBjYXVzZV9jb2RlLAogCQkJCSBjb25zdCB2b2lkICpwYXlsb2FkLAogCQkJCSBzaXplX3QgcGF5bGVuKTsKIAogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9hc2NvbmZfdXBkYXRlX2lwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJCSAgICAgIHVuaW9uIHNjdHBfYWRkciAqLAogCQkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKiwKLQkJCQkJICAgICAgaW50LCBfX3UxNik7CisJCQkJCSAgICAgIGludCwgX19iZTE2KTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfYXNjb25mX3NldF9wcmltKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCQkgICAgIHVuaW9uIHNjdHBfYWRkciAqYWRkcik7CiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9wcm9jZXNzX2FzY29uZihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggYzZkOTNiYi4uZjhjYmU0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTUzNyw3ICs1MzcsNyBAQAogCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICopOwogCXZvaWQJCSgqZHN0X3NhZGRyKQkodW5pb24gc2N0cF9hZGRyICpzYWRkciwKIAkJCQkJIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKLQkJCQkJIHVuc2lnbmVkIHNob3J0IHBvcnQpOworCQkJCQkgX19iZTE2IHBvcnQpOwogCWludAkJKCpjbXBfYWRkcikJKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcjEsCiAJCQkJCSBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIyKTsKIAl2b2lkCQkoKmFkZHJfY29weSkJKHVuaW9uIHNjdHBfYWRkciAqZHN0LApAQCAtNTUzLDE0ICs1NTMsMTQgQEAKIAkJCQkJIHN0cnVjdCBzb2NrICpzayk7CiAJdm9pZAkJKCpmcm9tX2FkZHJfcGFyYW0pICh1bmlvbiBzY3RwX2FkZHIgKiwKIAkJCQkJICAgIHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqLAotCQkJCQkgICAgX191MTYgcG9ydCwgaW50IGlpZik7CQorCQkJCQkgICAgX19iZTE2IHBvcnQsIGludCBpaWYpOwogCWludAkJKCp0b19hZGRyX3BhcmFtKSAoY29uc3QgdW5pb24gc2N0cF9hZGRyICosCiAJCQkJCSAgdW5pb24gc2N0cF9hZGRyX3BhcmFtICopOyAKIAlpbnQJCSgqYWRkcl92YWxpZCkJKHVuaW9uIHNjdHBfYWRkciAqLAogCQkJCQkgc3RydWN0IHNjdHBfc29jayAqLAogCQkJCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKik7CiAJc2N0cF9zY29wZV90CSgqc2NvcGUpICh1bmlvbiBzY3RwX2FkZHIgKik7Ci0Jdm9pZAkJKCppbmFkZHJfYW55KQkodW5pb24gc2N0cF9hZGRyICosIHVuc2lnbmVkIHNob3J0KTsKKwl2b2lkCQkoKmluYWRkcl9hbnkpCSh1bmlvbiBzY3RwX2FkZHIgKiwgX19iZTE2KTsKIAlpbnQJCSgqaXNfYW55KQkoY29uc3QgdW5pb24gc2N0cF9hZGRyICopOwogCWludAkJKCphdmFpbGFibGUpCSh1bmlvbiBzY3RwX2FkZHIgKiwKIAkJCQkJIHN0cnVjdCBzY3RwX3NvY2sgKik7CkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCSAgc3RydWN0IHNjdHBfc29jayAqKTsKIAlpbnQgICgqYmluZF92ZXJpZnkpIChzdHJ1Y3Qgc2N0cF9zb2NrICosIHVuaW9uIHNjdHBfYWRkciAqKTsKIAlpbnQgICgqc2VuZF92ZXJpZnkpIChzdHJ1Y3Qgc2N0cF9zb2NrICosIHVuaW9uIHNjdHBfYWRkciAqKTsKLQlpbnQgICgqc3VwcG9ydGVkX2FkZHJzKShjb25zdCBzdHJ1Y3Qgc2N0cF9zb2NrICosIF9fdTE2ICopOworCWludCAgKCpzdXBwb3J0ZWRfYWRkcnMpKGNvbnN0IHN0cnVjdCBzY3RwX3NvY2sgKiwgX19iZTE2ICopOwogCXN0cnVjdCBzb2NrICooKmNyZWF0ZV9hY2NlcHRfc2spIChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpOwogCXZvaWQgKCphZGRyX3Y0bWFwKSAoc3RydWN0IHNjdHBfc29jayAqLCB1bmlvbiBzY3RwX2FkZHIgKik7CkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogIAkgKiAJICAgIHRoaXMgaGVyZSBzbyB3ZSBwcmUtYWxsb2NhdGUgdGhpcyBvbmNlIGFuZCBjYW4gcmUtdXNlCiAgCSAqIAkgICAgb24gZXZlcnkgcmVjZWl2ZS4KICAJICovCi0gCV9fdTggZGlnZXN0W1NDVFBfU0lHTkFUVVJFX1NJWkVdOworIAlfX3U4ICpkaWdlc3Q7CiAgCiAJLyogc2VuZGJ1ZiBhY2N0LiBwb2xpY3kuCSovCiAJX191MzIgc25kYnVmX3BvbGljeTsKQEAgLTEzMTQsNiArMTMxNCwxMyBAQAogX191MzIgc2N0cF9nZW5lcmF0ZV90YWcoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiBfX3UzMiBzY3RwX2dlbmVyYXRlX3Rzbihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKTsKIAorc3RydWN0IHNjdHBfaW5pdGhkcl9ob3N0IHsKKwlfX3UzMiBpbml0X3RhZzsKKwlfX3UzMiBhX3J3bmQ7CisJX191MTYgbnVtX291dGJvdW5kX3N0cmVhbXM7CisJX191MTYgbnVtX2luYm91bmRfc3RyZWFtczsKKwlfX3UzMiBpbml0aWFsX3RzbjsKK307CiAKIC8qIFJGQzI5NjAKICAqCkBAIC0xNDgyLDkgKzE0ODksOSBAQAogCQkvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBkaXNhYmxlIHNlbmRpbmcgdGhlIEFTQ09ORiBjaHVuawogCQkgKiB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gcGVlci4KIAkJICovCi0JCV9fdTE2IGFkZGlwX2Rpc2FibGVkX21hc2s7CisJCV9fYmUxNiBhZGRpcF9kaXNhYmxlZF9tYXNrOwogCi0JCXN0cnVjdCBzY3RwX2luaXRoZHIgaTsKKwkJc3RydWN0IHNjdHBfaW5pdGhkcl9ob3N0IGk7CiAJCWludCBjb29raWVfbGVuOwogCQl2b2lkICpjb29raWU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvdHNubWFwLmggYi9pbmNsdWRlL25ldC9zY3RwL3Rzbm1hcC5oCmluZGV4IDAyMTk0N2QuLjcwYTgyNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdHNubWFwLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC90c25tYXAuaApAQCAtMTA1LDcgKzEwNSw3IEBACiAJICogZXZlcnkgU0FDSy4gIFN0b3JlIHVwIHRvIFNDVFBfTUFYX0RVUF9UU05TIHdvcnRoIG9mCiAJICogaW5mb3JtYXRpb24uCiAJICovCi0JX191MzIgZHVwX3RzbnNbU0NUUF9NQVhfRFVQX1RTTlNdOworCV9fYmUzMiBkdXBfdHNuc1tTQ1RQX01BWF9EVVBfVFNOU107CiAJX191MTYgbnVtX2R1cF90c25zOwogCiAJLyogUmVjb3JkIGdhcCBhY2sgYmxvY2sgaW5mb3JtYXRpb24gaGVyZS4gICovCkBAIC0xNjIsNyArMTYyLDcgQEAKIH0KIAogLyogUmV0dXJuIHBvaW50ZXIgdG8gZHVwbGljYXRlIHRzbiBhcnJheSBhcyBuZWVkZWQgYnkgU0FDSy4gKi8KLXN0YXRpYyBpbmxpbmUgX191MzIgKnNjdHBfdHNubWFwX2dldF9kdXBzKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwKQorc3RhdGljIGlubGluZSBfX2JlMzIgKnNjdHBfdHNubWFwX2dldF9kdXBzKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwKQogewogCW1hcC0+bnVtX2R1cF90c25zID0gMDsKIAlyZXR1cm4gbWFwLT5kdXBfdHNuczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBhYzI4NmEzLi5mZTNhMzNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgkvKiBzdHJ1Y3Qgc2tfYnVmZiAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgpAQCAtNzQ1LDcgKzc0NiwxMyBAQAogICovCiAjZGVmaW5lIHNvY2tfb3duZWRfYnlfdXNlcihzaykJKChzayktPnNrX2xvY2sub3duZXIpCiAKLWV4dGVybiB2b2lkIEZBU1RDQUxMKGxvY2tfc29jayhzdHJ1Y3Qgc29jayAqc2spKTsKK2V4dGVybiB2b2lkIEZBU1RDQUxMKGxvY2tfc29ja19uZXN0ZWQoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3ViY2xhc3MpKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxvY2tfc29jayhzdHJ1Y3Qgc29jayAqc2spCit7CisJbG9ja19zb2NrX25lc3RlZChzaywgMCk7Cit9CisKIGV4dGVybiB2b2lkIEZBU1RDQUxMKHJlbGVhc2Vfc29jayhzdHJ1Y3Qgc29jayAqc2spKTsKIAogLyogQkggY29udGV4dCBtYXkgb25seSB1c2UgdGhlIGZvbGxvd2luZyBsb2NraW5nIGludGVyZmFjZS4gKi8KQEAgLTg4MywxOCArODkwLDIzIEBACiB9CiAKIC8qKgotICoJc2tfZmlsdGVyX3JlbGVhc2U6IFJlbGVhc2UgYSBzb2NrZXQgZmlsdGVyCi0gKglAcmN1OiByY3VfaGVhZCB0aGF0IGNvbnRhaW5zIHRoZSBza19maWx0ZXIgaW5mbyB0byByZW1vdmUKLSAqCi0gKglSZW1vdmUgYSBmaWx0ZXIgZnJvbSBhIHNvY2tldCBhbmQgcmVsZWFzZSBpdHMgcmVzb3VyY2VzLgorICogCXNrX2ZpbHRlcl9yY3VfZnJlZTogRnJlZSBhIHNvY2tldCBmaWx0ZXIKKyAqCUByY3U6IHJjdV9oZWFkIHRoYXQgY29udGFpbnMgdGhlIHNrX2ZpbHRlciB0byBmcmVlCiAgKi8KLSAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza19maWx0ZXJfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCiB7CiAJc3RydWN0IHNrX2ZpbHRlciAqZnAgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2tfZmlsdGVyLCByY3UpOwogCWtmcmVlKGZwKTsKIH0KIAorLyoqCisgKglza19maWx0ZXJfcmVsZWFzZTogUmVsZWFzZSBhIHNvY2tldCBmaWx0ZXIKKyAqCUBzazogc29ja2V0CisgKglAZnA6IGZpbHRlciB0byByZW1vdmUKKyAqCisgKglSZW1vdmUgYSBmaWx0ZXIgZnJvbSBhIHNvY2tldCBhbmQgcmVsZWFzZSBpdHMgcmVzb3VyY2VzLgorICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBza19maWx0ZXJfcmVsZWFzZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19maWx0ZXIgKmZwKQogewogCXVuc2lnbmVkIGludCBzaXplID0gc2tfZmlsdGVyX2xlbihmcCk7CkBAIC05NDMsNyArOTU1LDggQEAKIAkJc2tfZnJlZShzayk7CiB9CiAKLWV4dGVybiBpbnQgc2tfcmVjZWl2ZV9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgc2tfcmVjZWl2ZV9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBjb25zdCBpbnQgbmVzdGVkKTsKIAogLyogRGV0YWNoIHNvY2tldCBmcm9tIHByb2Nlc3MgY29udGV4dC4KICAqIEFubm91bmNlIHNvY2tldCBkZWFkLCBkZXRhY2ggaXQgZnJvbSB3YWl0IHF1ZXVlIGFuZCBpbm9kZS4KQEAgLTEwNzcsNyArMTA5MCw3IEBACiB7CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKIAkJaW50IGVyciA9IDA7Ci0JCXVuc2lnbmVkIGludCBjc3VtID0gY3N1bV9hbmRfY29weV9mcm9tX3VzZXIoZnJvbSwKKwkJX193c3VtIGNzdW0gPSBjc3VtX2FuZF9jb3B5X2Zyb21fdXNlcihmcm9tLAogCQkJCQkJICAgICBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmYsCiAJCQkJCQkJICAgIGNvcHksIDAsICZlcnIpOwogCQlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCA3YTA5M2QwLi5jOTk3NzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogCiAjaW5jbHVkZSA8bmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfdGltZXdhaXRfc29jay5oPgpAQCAtMTM4LDcgKzEzOSw2IEBACiAjZGVmaW5lIE1BWF9UQ1BfU1lOQ05UCQkxMjcKIAogI2RlZmluZSBUQ1BfU1lOUV9JTlRFUlZBTAkoSFovNSkJLyogUGVyaW9kIG9mIFNZTkFDSyB0aW1lciAqLwotI2RlZmluZSBUQ1BfU1lOUV9IU0laRQkJNTEyCS8qIFNpemUgb2YgU1lOQUNLIGhhc2ggdGFibGUgKi8KIAogI2RlZmluZSBUQ1BfUEFXU18yNERBWVMJKDYwICogNjAgKiAyNCAqIDI0KQogI2RlZmluZSBUQ1BfUEFXU19NU0wJNjAJCS8qIFBlci1ob3N0IHRpbWVzdGFtcHMgYXJlIGludmFsaWRhdGVkCkBAIC0xNjIsNiArMTYyLDcgQEAKICNkZWZpbmUgVENQT1BUX1NBQ0tfUEVSTSAgICAgICAgNCAgICAgICAvKiBTQUNLIFBlcm1pdHRlZCAqLwogI2RlZmluZSBUQ1BPUFRfU0FDSyAgICAgICAgICAgICA1ICAgICAgIC8qIFNBQ0sgQmxvY2sgKi8KICNkZWZpbmUgVENQT1BUX1RJTUVTVEFNUAk4CS8qIEJldHRlciBSVFQgZXN0aW1hdGlvbnMvUEFXUyAqLworI2RlZmluZSBUQ1BPUFRfTUQ1U0lHCQkxOQkvKiBNRDUgU2lnbmF0dXJlIChSRkMyMzg1KSAqLwogCiAvKgogICogICAgIFRDUCBvcHRpb24gbGVuZ3RocwpAQCAtMTcxLDYgKzE3Miw3IEBACiAjZGVmaW5lIFRDUE9MRU5fV0lORE9XICAgICAgICAgMwogI2RlZmluZSBUQ1BPTEVOX1NBQ0tfUEVSTSAgICAgIDIKICNkZWZpbmUgVENQT0xFTl9USU1FU1RBTVAgICAgICAxMAorI2RlZmluZSBUQ1BPTEVOX01ENVNJRyAgICAgICAgIDE4CiAKIC8qIEJ1dCB0aGlzIGlzIHdoYXQgc3RhY2tzIHJlYWxseSBzZW5kIG91dC4gKi8KICNkZWZpbmUgVENQT0xFTl9UU1RBTVBfQUxJR05FRAkJMTIKQEAgLTE3OSw2ICsxODEsNyBAQAogI2RlZmluZSBUQ1BPTEVOX1NBQ0tfQkFTRQkJMgogI2RlZmluZSBUQ1BPTEVOX1NBQ0tfQkFTRV9BTElHTkVECTQKICNkZWZpbmUgVENQT0xFTl9TQUNLX1BFUkJMT0NLCQk4CisjZGVmaW5lIFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQJCTIwCiAKIC8qIEZsYWdzIGluIHRwLT5ub25hZ2xlICovCiAjZGVmaW5lIFRDUF9OQUdMRV9PRkYJCTEJLyogTmFnbGUncyBhbGdvIGlzIGRpc2FibGVkICovCkBAIC0zMDAsNiArMzAzLDggQEAKIGV4dGVybiBpbnQJCQl0Y3BfdHdza191bmlxdWUoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkJc3RydWN0IHNvY2sgKnNrdHcsIHZvaWQgKnR3cCk7CiAKK2V4dGVybiB2b2lkCQkJdGNwX3R3c2tfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc29jayAqc2spOworCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2RlY19xdWlja2Fja19tb2RlKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJIGNvbnN0IHVuc2lnbmVkIGludCBwa3RzKQogewpAQCAtNjIxLDggKzYyNiwxMiBAQAogICogSW50ZXJmYWNlIGZvciBhZGRpbmcgbmV3IFRDUCBjb25nZXN0aW9uIGNvbnRyb2wgaGFuZGxlcnMKICAqLwogI2RlZmluZSBUQ1BfQ0FfTkFNRV9NQVgJMTYKKyNkZWZpbmUgVENQX0NBX01BWAkxMjgKKyNkZWZpbmUgVENQX0NBX0JVRl9NQVgJKFRDUF9DQV9OQU1FX01BWCpUQ1BfQ0FfTUFYKQorCiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJaW50CW5vbl9yZXN0cmljdGVkOwogCiAJLyogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKG9wdGlvbmFsKSAqLwogCXZvaWQgKCppbml0KShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjYwLDYgKzY2OSw5IEBACiBleHRlcm4gdm9pZCB0Y3BfY2xlYW51cF9jb25nZXN0aW9uX2NvbnRyb2woc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiBpbnQgdGNwX3NldF9kZWZhdWx0X2Nvbmdlc3Rpb25fY29udHJvbChjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIHRjcF9nZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCB0Y3BfZ2V0X2F2YWlsYWJsZV9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIHRjcF9nZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKK2V4dGVybiBpbnQgdGNwX3NldF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbChjaGFyICphbGxvd2VkKTsKIGV4dGVybiBpbnQgdGNwX3NldF9jb25nZXN0aW9uX2NvbnRyb2woc3RydWN0IHNvY2sgKnNrLCBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIHRjcF9zbG93X3N0YXJ0KHN0cnVjdCB0Y3Bfc29jayAqdHApOwogCkBAIC03OTUsMTQgKzgwNywxNCBAQAogLyoKICAqIENhbGN1bGF0ZSgvY2hlY2spIFRDUCBjaGVja3N1bQogICovCi1zdGF0aWMgaW5saW5lIHUxNiB0Y3BfdjRfY2hlY2soc3RydWN0IHRjcGhkciAqdGgsIGludCBsZW4sCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBiYXNlKQorc3RhdGljIGlubGluZSBfX3N1bTE2IHRjcF92NF9jaGVjayhzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IGxlbiwKKwkJCSAgICAgICBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCSAgICAgICBfX3dzdW0gYmFzZSkKIHsKIAlyZXR1cm4gY3N1bV90Y3B1ZHBfbWFnaWMoc2FkZHIsZGFkZHIsbGVuLElQUFJPVE9fVENQLGJhc2UpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX3RjcF9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBfX3N1bTE2IF9fdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7CiB9CkBAIC0xMDU4LDYgKzEwNzAsMTE0IEBACiAJdHAtPmZhc3RwYXRoX3NrYl9oaW50ID0gTlVMTDsKIH0KIAorLyogTUQ1IFNpZ25hdHVyZSAqLworc3RydWN0IGNyeXB0b19oYXNoOworCisvKiAtIGtleSBkYXRhYmFzZSAqLworc3RydWN0IHRjcF9tZDVzaWdfa2V5IHsKKwl1OAkJCSprZXk7CisJdTgJCQlrZXlsZW47Cit9OworCitzdHJ1Y3QgdGNwNF9tZDVzaWdfa2V5IHsKKwl1OAkJCSprZXk7CisJdTE2CQkJa2V5bGVuOworCV9fYmUzMgkJCWFkZHI7Cit9OworCitzdHJ1Y3QgdGNwNl9tZDVzaWdfa2V5IHsKKwl1OAkJCSprZXk7CisJdTE2CQkJa2V5bGVuOworI2lmIDAKKwl1MzIJCQlzY29wZV9pZDsJLyogWFhYICovCisjZW5kaWYKKwlzdHJ1Y3QgaW42X2FkZHIJCWFkZHI7Cit9OworCisvKiAtIHNvY2sgYmxvY2sgKi8KK3N0cnVjdCB0Y3BfbWQ1c2lnX2luZm8geworCXN0cnVjdCB0Y3A0X21kNXNpZ19rZXkJKmtleXM0OworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCB0Y3A2X21kNXNpZ19rZXkJKmtleXM2OworCXUzMgkJCWVudHJpZXM2OworCXUzMgkJCWFsbG9jZWQ2OworI2VuZGlmCisJdTMyCQkJZW50cmllczQ7CisJdTMyCQkJYWxsb2NlZDQ7Cit9OworCisvKiAtIHBzZXVkbyBoZWFkZXIgKi8KK3N0cnVjdCB0Y3A0X3BzZXVkb2hkciB7CisJX19iZTMyCQlzYWRkcjsKKwlfX2JlMzIJCWRhZGRyOworCV9fdTgJCXBhZDsKKwlfX3U4CQlwcm90b2NvbDsKKwlfX2JlMTYJCWxlbjsKK307CisKK3N0cnVjdCB0Y3A2X3BzZXVkb2hkciB7CisJc3RydWN0IGluNl9hZGRyCXNhZGRyOworCXN0cnVjdCBpbjZfYWRkciBkYWRkcjsKKwlfX2JlMzIJCWxlbjsKKwlfX2JlMzIJCXByb3RvY29sOwkvKiBpbmNsdWRpbmcgcGFkZGluZyAqLworfTsKKwordW5pb24gdGNwX21kNXN1bV9ibG9jayB7CisJc3RydWN0IHRjcDRfcHNldWRvaGRyIGlwNDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3QgdGNwNl9wc2V1ZG9oZHIgaXA2OworI2VuZGlmCit9OworCisvKiAtIHBvb2w6IGRpZ2VzdCBhbGdvcml0aG0sIGhhc2ggZGVzY3JpcHRpb24gYW5kIHNjcmF0Y2ggYnVmZmVyICovCitzdHJ1Y3QgdGNwX21kNXNpZ19wb29sIHsKKwlzdHJ1Y3QgaGFzaF9kZXNjCW1kNV9kZXNjOworCXVuaW9uIHRjcF9tZDVzdW1fYmxvY2sJbWQ1X2JsazsKK307CisKKyNkZWZpbmUgVENQX01ENVNJR19NQVhLRVlTCSh+KHUzMikwKQkvKiByZWFsbHk/ISAqLworCisvKiAtIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludAkJCXRjcF92NF9jYWxjX21kNV9oYXNoKGNoYXIgKm1kNV9oYXNoLAorCQkJCQkJICAgICBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwKKwkJCQkJCSAgICAgc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCisJCQkJCQkgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKKwkJCQkJCSAgICAgc3RydWN0IHRjcGhkciAqdGgsCisJCQkJCQkgICAgIGludCBwcm90b2NvbCwgaW50IHRjcGxlbik7CitleHRlcm4gc3RydWN0IHRjcF9tZDVzaWdfa2V5CSp0Y3BfdjRfbWQ1X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgICBzdHJ1Y3Qgc29jayAqYWRkcl9zayk7CisKK2V4dGVybiBpbnQJCQl0Y3BfdjRfbWQ1X2RvX2FkZChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgIF9fYmUzMiBhZGRyLAorCQkJCQkJICB1OCAqbmV3a2V5LAorCQkJCQkJICB1OCBuZXdrZXlsZW4pOworCitleHRlcm4gaW50CQkJdGNwX3Y0X21kNV9kb19kZWwoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICBfX2JlMzIgYWRkcik7CisKK2V4dGVybiBzdHJ1Y3QgdGNwX21kNXNpZ19wb29sCSoqdGNwX2FsbG9jX21kNXNpZ19wb29sKHZvaWQpOworZXh0ZXJuIHZvaWQJCQl0Y3BfZnJlZV9tZDVzaWdfcG9vbCh2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wJKl9fdGNwX2dldF9tZDVzaWdfcG9vbChpbnQgY3B1KTsKK2V4dGVybiB2b2lkCQkJX190Y3BfcHV0X21kNXNpZ19wb29sKHZvaWQpOworCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgdGNwX21kNXNpZ19wb29sCQkqdGNwX2dldF9tZDVzaWdfcG9vbCh2b2lkKQoreworCWludCBjcHUgPSBnZXRfY3B1KCk7CisJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqcmV0ID0gX190Y3BfZ2V0X21kNXNpZ19wb29sKGNwdSk7CisJaWYgKCFyZXQpCisJCXB1dF9jcHUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQJCXRjcF9wdXRfbWQ1c2lnX3Bvb2wodm9pZCkKK3sKKwlfX3RjcF9wdXRfbWQ1c2lnX3Bvb2woKTsKKwlwdXRfY3B1KCk7Cit9CisKIC8qIC9wcm9jICovCiBlbnVtIHRjcF9zZXFfc3RhdGVzIHsKIAlUQ1BfU0VRX1NUQVRFX0xJU1RFTklORywKQEAgLTEwOTcsNiArMTIxNywzNSBAQAogZXh0ZXJuIHZvaWQgdGNwNF9wcm9jX2V4aXQodm9pZCk7CiAjZW5kaWYKIAorLyogVENQIGFmLXNwZWNpZmljIGZ1bmN0aW9ucyAqLworc3RydWN0IHRjcF9zb2NrX2FmX29wcyB7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkJKigqbWQ1X2xvb2t1cCkgKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCXN0cnVjdCBzb2NrICphZGRyX3NrKTsKKwlpbnQJCQkoKmNhbGNfbWQ1X2hhc2gpIChjaGFyICpsb2NhdGlvbiwKKwkJCQkJCSAgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICptZDUsCisJCQkJCQkgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCSAgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJCQkJICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkJCQkgIHN0cnVjdCB0Y3BoZHIgKnRoLAorCQkJCQkJICBpbnQgcHJvdG9jb2wsIGludCBsZW4pOworCWludAkJCSgqbWQ1X2FkZCkgKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIHN0cnVjdCBzb2NrICphZGRyX3NrLAorCQkJCQkgICAgdTggKm5ld2tleSwKKwkJCQkJICAgIHU4IGxlbik7CisJaW50CQkJKCptZDVfcGFyc2UpIChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCSAgICAgIGludCBvcHRsZW4pOworI2VuZGlmCit9OworCitzdHJ1Y3QgdGNwX3JlcXVlc3Rfc29ja19vcHMgeworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJc3RydWN0IHRjcF9tZDVzaWdfa2V5CSooKm1kNV9sb29rdXApIChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOworI2VuZGlmCit9OworCiBleHRlcm4gdm9pZCB0Y3BfdjRfaW5pdChzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqb3BzKTsKIGV4dGVybiB2b2lkIHRjcF9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC90aW1ld2FpdF9zb2NrLmgKaW5kZXggYmUyOTNkNy4uZDdhMzA2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGltZXdhaXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3RpbWV3YWl0X3NvY2suaApAQCAtMzEsNiArMzEsOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdHdza19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKIHsKKwlCVUdfT04oc2sgPT0gTlVMTCk7CisJQlVHX09OKHNrLT5za19wcm90ID09IE5VTEwpOworCUJVR19PTihzay0+c2tfcHJvdC0+dHdza19wcm90ID09IE5VTEwpOwogCWlmIChzay0+c2tfcHJvdC0+dHdza19wcm90LT50d3NrX2Rlc3RydWN0b3IgIT0gTlVMTCkKIAkJc2stPnNrX3Byb3QtPnR3c2tfcHJvdC0+dHdza19kZXN0cnVjdG9yKHNrKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaAppbmRleCBlMDcxMzZkLi4yMTUxYTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmgKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX2JlYXJlci5oCkBAIC01OCw3ICs1OCw3IEBACiAgKi8KIAogc3RydWN0IHRpcGNfbWVkaWFfYWRkciB7Ci0JX191MzIgIHR5cGU7CQkJLyogYmVhcmVyIHR5cGUgKG5ldHdvcmsgYnl0ZSBvcmRlcikgKi8KKwlfX2JlMzIgIHR5cGU7CQkJLyogYmVhcmVyIHR5cGUgKG5ldHdvcmsgYnl0ZSBvcmRlcikgKi8KIAl1bmlvbiB7CiAJCV9fdTggICBldGhfYWRkcls2XTsJLyogNDggYml0IEV0aGVybmV0IGFkZHIgKGJ5dGUgYXJyYXkpICovIAogI2lmIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaAppbmRleCA0ZDA5NmVlLi5mYjQyZWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmgKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX21zZy5oCkBAIC00MCw3ICs0MCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiBzdHJ1Y3QgdGlwY19tc2cgewotCXUzMiBoZHJbMTVdOworCV9fYmUzMiBoZHJbMTVdOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90cmFuc3BfdjYuaCBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCmluZGV4IDYxZjcyNGMuLjQwOWRhM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCisrKyBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCkBAIC0xMSw2ICsxMSw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgcHJvdG8gcmF3djZfcHJvdDsKIGV4dGVybiBzdHJ1Y3QgcHJvdG8gdWRwdjZfcHJvdDsKK2V4dGVybiBzdHJ1Y3QgcHJvdG8gdWRwbGl0ZXY2X3Byb3Q7CiBleHRlcm4gc3RydWN0IHByb3RvIHRjcHY2X3Byb3Q7CiAKIHN0cnVjdCBmbG93aTsKQEAgLTI0LDYgKzI1LDcgQEAKIC8qIHRyYW5zcG9ydCBwcm90b2NvbHMgKi8KIGV4dGVybiB2b2lkCQkJCXJhd3Y2X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZAkJCQl1ZHB2Nl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgCQkJCXVkcGxpdGV2Nl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQJCQkJdGNwdjZfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIGludAkJCQl1ZHB2Nl9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggZGIwYzA1Zi4uMWI5MjFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTI2LDkgKzI2LDI5IEBACiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAKLSNkZWZpbmUgVURQX0hUQUJMRV9TSVpFCQkxMjgKKy8qKgorICoJc3RydWN0IHVkcF9za2JfY2IgIC0gIFVEUCgtTGl0ZSkgcHJpdmF0ZSB2YXJpYWJsZXMKKyAqCisgKglAaGVhZGVyOiAgICAgIHByaXZhdGUgdmFyaWFibGVzIHVzZWQgYnkgSVB2NC9JUHY2CisgKglAY3Njb3Y6ICAgICAgIGNoZWNrc3VtIGNvdmVyYWdlIGxlbmd0aCAoVURQLUxpdGUgb25seSkKKyAqCUBwYXJ0aWFsX2NvdjogaWYgc2V0IGluZGljYXRlcyBwYXJ0aWFsIGNzdW0gY292ZXJhZ2UKKyAqLworc3RydWN0IHVkcF9za2JfY2IgeworCXVuaW9uIHsKKwkJc3RydWN0IGluZXRfc2tiX3Bhcm0JaDQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorCQlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0JaDY7CisjZW5kaWYKKwl9IGhlYWRlcjsKKwlfX3UxNgkJY3Njb3Y7CisJX191OAkJcGFydGlhbF9jb3Y7Cit9OworI2RlZmluZSBVRFBfU0tCX0NCKF9fc2tiKQkoKHN0cnVjdCB1ZHBfc2tiX2NiICopKChfX3NrYiktPmNiKSkKIAogZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIHVkcF9oYXNoW1VEUF9IVEFCTEVfU0laRV07CiBleHRlcm4gcndsb2NrX3QgdWRwX2hhc2hfbG9jazsKQEAgLTQ3LDYgKzY3LDYyIEBACiAKIHN0cnVjdCBza19idWZmOwogCisvKgorICoJR2VuZXJpYyBjaGVja3N1bW1pbmcgcm91dGluZXMgZm9yIFVEUCgtTGl0ZSkgdjQgYW5kIHY2CisgKi8KK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoISBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KQorCQlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKKwlyZXR1cm4gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YsCisJCQkJICAgICAgc2tiLT5jc3VtKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKKwkJX191ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7Cit9CisKKy8qKgorICogCXVkcF9jc3VtX291dGdvaW5nICAtICBjb21wdXRlIFVEUHY0L3Y2IGNoZWNrc3VtIG92ZXIgZnJhZ21lbnRzCisgKiAJQHNrOiAJc29ja2V0IHdlIGFyZSB3cml0aW5nIHRvCisgKiAJQHNrYjogCXNrX2J1ZmYgY29udGFpbmluZyB0aGUgZmlsbGVkLWluIFVEUCBoZWFkZXIKKyAqIAkgICAgICAgIChjaGVja3N1bSBmaWVsZCBtdXN0IGJlIHplcm9lZCBvdXQpCisgKi8KK3N0YXRpYyBpbmxpbmUgX193c3VtIHVkcF9jc3VtX291dGdvaW5nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3dzdW0gY3N1bSA9IGNzdW1fcGFydGlhbChza2ItPmgucmF3LCBzaXplb2Yoc3RydWN0IHVkcGhkciksIDApOworCisJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7CisJCWNzdW0gPSBjc3VtX2FkZChjc3VtLCBza2ItPmNzdW0pOworCX0KKwlyZXR1cm4gY3N1bTsKK30KKworLyogaGFzaCByb3V0aW5lcyBzaGFyZWQgYmV0d2VlbiBVRFB2NC82IGFuZCBVRFAtTGl0ZXY0LzYgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZHBfbGliX2hhc2goc3RydWN0IHNvY2sgKnNrKQoreworCUJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRwX2xpYl91bmhhc2goc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCWlmIChza19kZWxfbm9kZV9pbml0KHNrKSkgeworCQlpbmV0X3NrKHNrKS0+bnVtID0gMDsKKwkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRwX2xpYl9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKK3sKKwlza19jb21tb25fcmVsZWFzZShzayk7Cit9CisKKworLyogbmV0L2lwdjQvdWRwLmMgKi8KIGV4dGVybiBpbnQJdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKIAkJCSAgICAgaW50ICgqc2FkZHJfY21wKShjb25zdCBzdHJ1Y3Qgc29jayAqLCBjb25zdCBzdHJ1Y3Qgc29jayAqKSk7CiBleHRlcm4gdm9pZAl1ZHBfZXJyKHN0cnVjdCBza19idWZmICosIHUzMik7CkBAIC01OSwyMyArMTM1LDM2IEBACiBleHRlcm4gaW50CXVkcF9kaXNjb25uZWN0KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgdWRwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgICAgIHBvbGxfdGFibGUgKndhaXQpOworZXh0ZXJuIGludCAJdWRwX2xpYl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgICAgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKK2V4dGVybiBpbnQgCXVkcF9saWJfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwKKwkJCQkgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSk7CiAKIERFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBfc3RhdGlzdGljcyk7Ci0jZGVmaW5lIFVEUF9JTkNfU1RBVFMoZmllbGQpCQlTTk1QX0lOQ19TVEFUUyh1ZHBfc3RhdGlzdGljcywgZmllbGQpCi0jZGVmaW5lIFVEUF9JTkNfU1RBVFNfQkgoZmllbGQpCQlTTk1QX0lOQ19TVEFUU19CSCh1ZHBfc3RhdGlzdGljcywgZmllbGQpCi0jZGVmaW5lIFVEUF9JTkNfU1RBVFNfVVNFUihmaWVsZCkgCVNOTVBfSU5DX1NUQVRTX1VTRVIodWRwX3N0YXRpc3RpY3MsIGZpZWxkKQorLyoKKyAqIAlTTk1QIHN0YXRpc3RpY3MgZm9yIFVEUCBhbmQgVURQLUxpdGUKKyAqLworI2RlZmluZSBVRFBfSU5DX1NUQVRTX1VTRVIoZmllbGQsIGlzX3VkcGxpdGUpCQkJICAgICAgIGRvIHsgICBcCisJaWYgKGlzX3VkcGxpdGUpIFNOTVBfSU5DX1NUQVRTX1VTRVIodWRwbGl0ZV9zdGF0aXN0aWNzLCBmaWVsZCk7ICAgICAgIFwKKwllbHNlCQlTTk1QX0lOQ19TVEFUU19VU0VSKHVkcF9zdGF0aXN0aWNzLCBmaWVsZCk7ICB9ICB3aGlsZSgwKQorI2RlZmluZSBVRFBfSU5DX1NUQVRTX0JIKGZpZWxkLCBpc191ZHBsaXRlKSAJCQkgICAgICAgZG8gIHsgIFwKKwlpZiAoaXNfdWRwbGl0ZSkgU05NUF9JTkNfU1RBVFNfQkgodWRwbGl0ZV9zdGF0aXN0aWNzLCBmaWVsZCk7ICAgICAgICAgXAorCWVsc2UJCVNOTVBfSU5DX1NUQVRTX0JIKHVkcF9zdGF0aXN0aWNzLCBmaWVsZCk7ICAgIH0gIHdoaWxlKDApCiAKIC8qIC9wcm9jICovCiBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gewogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAljaGFyCQkJKm5hbWU7CiAJc2FfZmFtaWx5X3QJCWZhbWlseTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkqaGFzaHRhYmxlOwogCWludCAJCQkoKnNlcV9zaG93KSAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSpzZXFfZm9wczsKIH07CiAKIHN0cnVjdCB1ZHBfaXRlcl9zdGF0ZSB7CiAJc2FfZmFtaWx5X3QJCWZhbWlseTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkqaGFzaHRhYmxlOwogCWludAkJCWJ1Y2tldDsKIAlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMJc2VxX29wczsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHBsaXRlLmggYi9pbmNsdWRlL25ldC91ZHBsaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhYzUxNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3VkcGxpdGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqCURlZmluaXRpb25zIGZvciB0aGUgVURQLUxpdGUgKFJGQyAzODI4KSBjb2RlLgorICovCisjaWZuZGVmIF9VRFBMSVRFX0gKKyNkZWZpbmUgX1VEUExJVEVfSAorCisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorCisvKiBVRFAtTGl0ZSBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBVRFBMSVRFX1NFTkRfQ1NDT1YgICAxMCAvKiBzZW5kZXIgcGFydGlhbCBjb3ZlcmFnZSAoYXMgc2VudCkgICAgICAqLworI2RlZmluZSBVRFBMSVRFX1JFQ1ZfQ1NDT1YgICAxMSAvKiByZWNlaXZlciBwYXJ0aWFsIGNvdmVyYWdlICh0aHJlc2hvbGQgKSAqLworCitleHRlcm4gc3RydWN0IHByb3RvIAkJdWRwbGl0ZV9wcm90OworZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIAl1ZHBsaXRlX2hhc2hbVURQX0hUQUJMRV9TSVpFXTsKKworLyogVURQLUxpdGUgZG9lcyBub3QgaGF2ZSBhIHN0YW5kYXJkaXplZCBNSUIgeWV0LCBzbyB3ZSBpbmhlcml0IGZyb20gVURQICovCitERUNMQVJFX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwbGl0ZV9zdGF0aXN0aWNzKTsKKworLyoKKyAqCUNoZWNrc3VtIGNvbXB1dGF0aW9uIGlzIGFsbCBpbiBzb2Z0d2FyZSwgaGVuY2Ugc2ltcGxlciBnZXRmcmFnLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdWRwbGl0ZV9nZXRmcmFnKHZvaWQgKmZyb20sIGNoYXIgKnRvLCBpbnQgIG9mZnNldCwKKwkJCQkgICAgICBpbnQgbGVuLCBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBtZW1jcHlfZnJvbWlvdmVjZW5kKHRvLCAoc3RydWN0IGlvdmVjICopIGZyb20sIG9mZnNldCwgbGVuKTsKK30KKworLyogRGVzaWduYXRlIHNrIGFzIFVEUC1MaXRlIHNvY2tldCAqLworc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9za19pbml0KHN0cnVjdCBzb2NrICpzaykKK3sKKwl1ZHBfc2soc2spLT5wY2ZsYWcgPSBVRFBMSVRFX0JJVDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlDaGVja3N1bW1pbmcgcm91dGluZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoKQoreworCXUxNiBjc2NvdjsKKworICAgICAgICAvKiBJbiBVRFB2NCBhIHplcm8gY2hlY2tzdW0gbWVhbnMgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgZ2VuZXJhdGVkIG5vCisgICAgICAgICAqIGNoZWNrc3VtLiBVRFAtTGl0ZSAobGlrZSBJUHY2KSBtYW5kYXRlcyBjaGVja3N1bXMsIGhlbmNlIHBhY2tldHMKKyAgICAgICAgICogd2l0aCBhIHplcm8gY2hlY2tzdW0gZmllbGQgYXJlIGlsbGVnYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKHVoLT5jaGVjayA9PSAwKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUExJVEU6IHplcm9lZCBjaGVja3N1bSBmaWVsZFxuIik7CisJCXJldHVybiAxOworCX0KKworICAgICAgICBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKKwljc2NvdiA9IG50b2hzKHVoLT5sZW4pOworCisJaWYgKGNzY292ID09IDApCQkgLyogSW5kaWNhdGVzIHRoYXQgZnVsbCBjb3ZlcmFnZSBpcyByZXF1aXJlZC4gKi8KKwkJY3Njb3YgPSBza2ItPmxlbjsKKwllbHNlIGlmIChjc2NvdiA8IDggIHx8IGNzY292ID4gc2tiLT5sZW4pIHsKKwkJLyoKKwkJICogQ292ZXJhZ2UgbGVuZ3RoIHZpb2xhdGVzIFJGQyAzODI4OiBsb2cgYW5kIGRpc2NhcmQgc2lsZW50bHkuCisJCSAqLworCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFBMSVRFOiBiYWQgY3N1bSBjb3ZlcmFnZSAlZC8lZFxuIiwKKwkJCSAgICAgICBjc2Nvdiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMTsKKworCX0gZWxzZSBpZiAoY3Njb3YgPCBza2ItPmxlbikKKyAgICAgICAgCVVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YgPSAxOworCisgICAgICAgIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YgPSBjc2NvdjsKKworCS8qCisJICogVGhlcmUgaXMgbm8ga25vd24gTklDIG1hbnVmYWN0dXJlciBzdXBwb3J0aW5nIFVEUC1MaXRlIHlldCwKKwkgKiBoZW5jZSBpcF9zdW1tZWQgaXMgYWx3YXlzIChyZS0pc2V0IHRvIENIRUNLU1VNX05PTkUuCisJICovCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB1ZHBsaXRlNF9jc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgpCit7CisJaW50IHJjID0gdWRwbGl0ZV9jaGVja3N1bV9pbml0KHNrYiwgdWgpOworCisJaWYgKCFyYykKKwkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUExJVEUsIDApOworCXJldHVybiByYzsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHVkcGxpdGU2X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKK3sKKwlpbnQgcmMgPSB1ZHBsaXRlX2NoZWNrc3VtX2luaXQoc2tiLCB1aCk7CisKKwlpZiAoIXJjKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCQkJCSAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQTElURSwgMCkpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9zZW5kZXJfY3Njb3Yoc3RydWN0IHVkcF9zb2NrICp1cCwgc3RydWN0IHVkcGhkciAqdWgpCit7CisJaW50IGNzY292ID0gdXAtPmxlbjsKKworCS8qCisJICogU2VuZGVyIGhhcyBzZXQgYHBhcnRpYWwgY292ZXJhZ2UnIG9wdGlvbiBvbiBVRFAtTGl0ZSBzb2NrZXQKKwkgKi8KKwlpZiAodXAtPnBjZmxhZyAmIFVEUExJVEVfU0VORF9DQykgICAgeworCQlpZiAodXAtPnBjc2xlbiA8IHVwLT5sZW4pIHsKKwkJLyogdXAtPnBjc2xlbiA9PSAwIG1lYW5zIHRoYXQgZnVsbCBjb3ZlcmFnZSBpcyByZXF1aXJlZCwKKwkJICogcGFydGlhbCBjb3ZlcmFnZSBvbmx5IGlmICAwIDwgdXAtPnBjc2xlbiA8IHVwLT5sZW4gKi8KKwkJCWlmICgwIDwgdXAtPnBjc2xlbikgeworCQkJICAgICAgIGNzY292ID0gdXAtPnBjc2xlbjsKKwkJCX0KKwkJCXVoLT5sZW4gPSBodG9ucyh1cC0+cGNzbGVuKTsKKwkJfQorCS8qCisJICogTk9URTogQ2F1c2VzIGZvciB0aGUgZXJyb3IgY2FzZSAgYHVwLT5wY3NsZW4gPiB1cC0+bGVuJzoKKwkgKiAgICAgICAgKGkpICBBcHBsaWNhdGlvbiBlcnJvciAod2lsbCBub3QgYmUgcGVuYWxpemVkKS4KKwkgKiAgICAgICAoaWkpICBQYXlsb2FkIHRvbyBiaWcgZm9yIHNlbmQgYnVmZmVyOiBkYXRhIGlzIHNwbGl0CisJICogICAgICAgICAgICAgaW50byBzZXZlcmFsIHBhY2tldHMsIGVhY2ggd2l0aCBpdHMgb3duIGhlYWRlci4KKwkgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgKGUuZy4gbGFzdCBzZWdtZW50KSwgY292ZXJhZ2UgbWF5CisJICogICAgICAgICAgICAgZXhjZWVkIHBhY2tldCBsZW5ndGguCisJICogICAgICAgU2luY2UgcGFja2V0cyB3aXRoIGNvdmVyYWdlIGxlbmd0aCA+IHBhY2tldCBsZW5ndGggYXJlCisJICogICAgICAgaWxsZWdhbCwgd2UgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0cyBoZXJlLgorCSAqLworCX0KKwlyZXR1cm4gY3Njb3Y7Cit9CisKK3N0YXRpYyBpbmxpbmUgX193c3VtIHVkcGxpdGVfY3N1bV9vdXRnb2luZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG9mZiwgbGVuLCBjc2NvdiA9IHVkcGxpdGVfc2VuZGVyX2NzY292KHVkcF9zayhzayksIHNrYi0+aC51aCk7CisJX193c3VtIGNzdW0gPSAwOworCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAgICAgLyogbm8gSFcgc3VwcG9ydCBmb3IgY2hlY2tzdW1taW5nICovCisKKwlza2JfcXVldWVfd2Fsaygmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpIHsKKwkJb2ZmID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJbGVuID0gc2tiLT5sZW4gLSBvZmY7CisKKwkJY3N1bSA9IHNrYl9jaGVja3N1bShza2IsIG9mZiwgKGNzY292ID4gbGVuKT8gbGVuIDogY3Njb3YsIGNzdW0pOworCisJCWlmICgoY3Njb3YgLT0gbGVuKSA8PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBjc3VtOworfQorCitleHRlcm4gdm9pZAl1ZHBsaXRlNF9yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiBpbnQgCXVkcGxpdGVfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAorCQkJaW50ICgqc2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpOworI2VuZGlmCS8qIF9VRFBMSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCA3MzdmZGIyLi4xNWVjMTlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0zMTAsNiArMzEwLDggQEAKIC8qIFNvdXJjZSBhZGRyZXNzIG9mIHR1bm5lbC4gSWdub3JlZCwgaWYgaXQgaXMgbm90IGEgdHVubmVsLiAqLwogCXhmcm1fYWRkcmVzc190CQlzYWRkcjsKIAorCXVuc2lnbmVkIHNob3J0CQllbmNhcF9mYW1pbHk7CisKIAlfX3UzMgkJCXJlcWlkOwogCiAvKiBNb2RlOiB0cmFuc3BvcnQsIHR1bm5lbCBldGMuICovCkBAIC0zNDAsMTggKzM0MiwxOSBAQAogCWF0b21pY190CQlyZWZjbnQ7CiAJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CiAKLQl1OAkJCXR5cGU7CiAJdTMyCQkJcHJpb3JpdHk7CiAJdTMyCQkJaW5kZXg7CiAJc3RydWN0IHhmcm1fc2VsZWN0b3IJc2VsZWN0b3I7CiAJc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnIGxmdDsKIAlzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIgY3VybGZ0OwogCXN0cnVjdCBkc3RfZW50cnkgICAgICAgKmJ1bmRsZXM7Ci0JX191MTYJCQlmYW1pbHk7Ci0JX191OAkJCWFjdGlvbjsKLQlfX3U4CQkJZmxhZ3M7Ci0JX191OAkJCWRlYWQ7Ci0JX191OAkJCXhmcm1fbnI7CisJdTE2CQkJZmFtaWx5OworCXU4CQkJdHlwZTsKKwl1OAkJCWFjdGlvbjsKKwl1OAkJCWZsYWdzOworCXU4CQkJZGVhZDsKKwl1OAkJCXhmcm1fbnI7CisJLyogWFhYIDEgYnl0ZSBob2xlLCB0cnkgdG8gcGFjayAqLwogCXN0cnVjdCB4ZnJtX3NlY19jdHgJKnNlY3VyaXR5OwogCXN0cnVjdCB4ZnJtX3RtcGwgICAgICAgCXhmcm1fdmVjW1hGUk1fTUFYX0RFUFRIXTsKIH07CkBAIC0zNzksNyArMzgyLDcgQEAKIAlpbnQJCQkoKm5vdGlmeSkoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBrbV9ldmVudCAqYyk7CiAJaW50CQkJKCphY3F1aXJlKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHhmcm1fdG1wbCAqLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyKTsKIAlzdHJ1Y3QgeGZybV9wb2xpY3kJKigqY29tcGlsZV9wb2xpY3kpKHN0cnVjdCBzb2NrICpzaywgaW50IG9wdCwgdTggKmRhdGEsIGludCBsZW4sIGludCAqZGlyKTsKLQlpbnQJCQkoKm5ld19tYXBwaW5nKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgdTE2IHNwb3J0KTsKKwlpbnQJCQkoKm5ld19tYXBwaW5nKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KTsKIAlpbnQJCQkoKm5vdGlmeV9wb2xpY3kpKHN0cnVjdCB4ZnJtX3BvbGljeSAqeCwgaW50IGRpciwgc3RydWN0IGttX2V2ZW50ICpjKTsKIAlpbnQJCQkoKnJlcG9ydCkodTggcHJvdG8sIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHhmcm1fYWRkcmVzc190ICphZGRyKTsKIH07CkBAIC00NjgsNiArNDcxLDcgQEAKIAlzd2l0Y2goZmwtPnByb3RvKSB7CiAJY2FzZSBJUFBST1RPX1RDUDoKIAljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19VRFBMSVRFOgogCWNhc2UgSVBQUk9UT19TQ1RQOgogCQlwb3J0ID0gZmwtPmZsX2lwX3Nwb3J0OwogCQlicmVhazsKQEAgLTQ5Myw2ICs0OTcsNyBAQAogCXN3aXRjaChmbC0+cHJvdG8pIHsKIAljYXNlIElQUFJPVE9fVENQOgogCWNhc2UgSVBQUk9UT19VRFA6CisJY2FzZSBJUFBST1RPX1VEUExJVEU6CiAJY2FzZSBJUFBST1RPX1NDVFA6CiAJCXBvcnQgPSBmbC0+ZmxfaXBfZHBvcnQ7CiAJCWJyZWFrOwpAQCAtNTA2LDQwICs1MTEsOCBAQAogCXJldHVybiBwb3J0OwogfQogCi1zdGF0aWMgaW5saW5lIGludAotX194ZnJtNF9zZWxlY3Rvcl9tYXRjaChzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCBzdHJ1Y3QgZmxvd2kgKmZsKQotewotCXJldHVybiAgYWRkcl9tYXRjaCgmZmwtPmZsNF9kc3QsICZzZWwtPmRhZGRyLCBzZWwtPnByZWZpeGxlbl9kKSAmJgotCQlhZGRyX21hdGNoKCZmbC0+Zmw0X3NyYywgJnNlbC0+c2FkZHIsIHNlbC0+cHJlZml4bGVuX3MpICYmCi0JCSEoKHhmcm1fZmxvd2lfZHBvcnQoZmwpIF4gc2VsLT5kcG9ydCkgJiBzZWwtPmRwb3J0X21hc2spICYmCi0JCSEoKHhmcm1fZmxvd2lfc3BvcnQoZmwpIF4gc2VsLT5zcG9ydCkgJiBzZWwtPnNwb3J0X21hc2spICYmCi0JCShmbC0+cHJvdG8gPT0gc2VsLT5wcm90byB8fCAhc2VsLT5wcm90bykgJiYKLQkJKGZsLT5vaWYgPT0gc2VsLT5pZmluZGV4IHx8ICFzZWwtPmlmaW5kZXgpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotX194ZnJtNl9zZWxlY3Rvcl9tYXRjaChzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCBzdHJ1Y3QgZmxvd2kgKmZsKQotewotCXJldHVybiAgYWRkcl9tYXRjaCgmZmwtPmZsNl9kc3QsICZzZWwtPmRhZGRyLCBzZWwtPnByZWZpeGxlbl9kKSAmJgotCQlhZGRyX21hdGNoKCZmbC0+Zmw2X3NyYywgJnNlbC0+c2FkZHIsIHNlbC0+cHJlZml4bGVuX3MpICYmCi0JCSEoKHhmcm1fZmxvd2lfZHBvcnQoZmwpIF4gc2VsLT5kcG9ydCkgJiBzZWwtPmRwb3J0X21hc2spICYmCi0JCSEoKHhmcm1fZmxvd2lfc3BvcnQoZmwpIF4gc2VsLT5zcG9ydCkgJiBzZWwtPnNwb3J0X21hc2spICYmCi0JCShmbC0+cHJvdG8gPT0gc2VsLT5wcm90byB8fCAhc2VsLT5wcm90bykgJiYKLQkJKGZsLT5vaWYgPT0gc2VsLT5pZmluZGV4IHx8ICFzZWwtPmlmaW5kZXgpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAoteGZybV9zZWxlY3Rvcl9tYXRjaChzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCBzdHJ1Y3QgZmxvd2kgKmZsLAotCQkgICAgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQotewotCXN3aXRjaCAoZmFtaWx5KSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlyZXR1cm4gX194ZnJtNF9zZWxlY3Rvcl9tYXRjaChzZWwsIGZsKTsKLQljYXNlIEFGX0lORVQ2OgotCQlyZXR1cm4gX194ZnJtNl9zZWxlY3Rvcl9tYXRjaChzZWwsIGZsKTsKLQl9Ci0JcmV0dXJuIDA7Ci19CitleHRlcm4gaW50IHhmcm1fc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOwogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogLyoJSWYgbmVpdGhlciBoYXMgYSBjb250ZXh0IC0tPiBtYXRjaApAQCAtODg3LDggKzg2MCw3IEBACiBzdHJ1Y3QgeGZybTZfdHVubmVsIHsKIAlpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQgKCplcnJfaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCi0JCQkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pOwotCisJCQkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKTsKIAlzdHJ1Y3QgeGZybTZfdHVubmVsICpuZXh0OwogCWludCBwcmlvcml0eTsKIH07CkBAIC05NTEsOSArOTIzLDkgQEAKIAkJCSAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHU4IHByb3RvKTsKIGV4dGVybiBpbnQgeGZybTZfdHVubmVsX3JlZ2lzdGVyKHN0cnVjdCB4ZnJtNl90dW5uZWwgKmhhbmRsZXIpOwogZXh0ZXJuIGludCB4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcihzdHJ1Y3QgeGZybTZfdHVubmVsICpoYW5kbGVyKTsKLWV4dGVybiB1MzIgeGZybTZfdHVubmVsX2FsbG9jX3NwaSh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpOworZXh0ZXJuIF9fYmUzMiB4ZnJtNl90dW5uZWxfYWxsb2Nfc3BpKHhmcm1fYWRkcmVzc190ICpzYWRkcik7CiBleHRlcm4gdm9pZCB4ZnJtNl90dW5uZWxfZnJlZV9zcGkoeGZybV9hZGRyZXNzX3QgKnNhZGRyKTsKLWV4dGVybiB1MzIgeGZybTZfdHVubmVsX3NwaV9sb29rdXAoeGZybV9hZGRyZXNzX3QgKnNhZGRyKTsKK2V4dGVybiBfX2JlMzIgeGZybTZfdHVubmVsX3NwaV9sb29rdXAoeGZybV9hZGRyZXNzX3QgKnNhZGRyKTsKIGV4dGVybiBpbnQgeGZybTZfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludCB4ZnJtNl9maW5kXzFzdGZyYWdvcHQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJIHU4ICoqcHJldmhkcik7CkBAIC0xMDAwLDcgKzk3Miw3IEBACiBleHRlcm4gdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCiBleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3Qga21fd2FpdHE7Ci1leHRlcm4gaW50IGttX25ld19tYXBwaW5nKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB4ZnJtX2FkZHJlc3NfdCAqaXBhZGRyLCB1MTYgc3BvcnQpOworZXh0ZXJuIGludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KTsKIGV4dGVybiB2b2lkIGttX3BvbGljeV9leHBpcmVkKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCBpbnQgZGlyLCBpbnQgaGFyZCwgdTMyIHBpZCk7CiBleHRlcm4gaW50IGttX3JlcG9ydCh1OCBwcm90bywgc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgeGZybV9hZGRyZXNzX3QgKmFkZHIpOwogCkBAIC0xMDMzLDcgKzEwMDUsNyBAQAogCXN3aXRjaCAoZmFtaWx5KSB7CiAJZGVmYXVsdDoKIAljYXNlIEFGX0lORVQ6Ci0JCXJldHVybiBhLT5hNCAtIGItPmE0OworCQlyZXR1cm4gKF9fZm9yY2UgX191MzIpYS0+YTQgLSAoX19mb3JjZSBfX3UzMiliLT5hNDsKIAljYXNlIEFGX0lORVQ2OgogCQlyZXR1cm4gaXB2Nl9hZGRyX2NtcCgoc3RydWN0IGluNl9hZGRyICopYSwKIAkJCQkgICAgIChzdHJ1Y3QgaW42X2FkZHIgKiliKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL3NzLmggYi9pbmNsdWRlL3BjbWNpYS9zcy5oCmluZGV4IGVkZTYzOTguLjYyM2EwZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL3NzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvc3MuaApAQCAtMjYyLDkgKzI2MiwxMCBAQAogCQl1OAkJCXByZXNlbnQ6MSwJLyogUENNQ0lBIGNhcmQgaXMgcHJlc2VudCBpbiBzb2NrZXQgKi8KIAkJCQkJYnVzeToxLAkJLyogIm1hc3RlciIgaW9jdGwgaXMgdXNlZCAqLwogCQkJCQlkZWFkOjEsCQkvKiBwY21jaWEgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkICovCi0JCQkJCWRldmljZV9hZGRfcGVuZGluZzoxLCAvKiBhIHBzZXVkby1tdWx0aWZ1bmN0aW9uLWRldmljZQorCQkJCQlkZXZpY2VfYWRkX3BlbmRpbmc6MSwgLyogYSBtdWx0aWZ1bmN0aW9uLWRldmljZQogCQkJCQkJCSAgICAgICAqIGFkZCBldmVudCBpcyBwZW5kaW5nICovCi0JCQkJCXJlc2VydmVkOjQ7CisJCQkJCW1mY19wZmM6MSwJLyogdGhlIHBlbmRpbmcgZXZlbnQgYWRkcyBhIG1mYyAoMSkgb3IgcGZjICgwKSAqLworCQkJCQlyZXNlcnZlZDozOwogCX0gCQkJCXBjbWNpYV9zdGF0ZTsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdAkJZGV2aWNlX2FkZDsJLyogZm9yIGFkZGluZyBmdXJ0aGVyIHBzZXVkby1tdWx0aWZ1bmN0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfY20uaCBiL2luY2x1ZGUvcmRtYS9pYl9jbS5oCmluZGV4IGM5YjQ3MzguLjVjMDcwMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl9jbS5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl9jbS5oCkBAIC02MCw2ICs2MCw3IEBACiB9OwogCiBlbnVtIGliX2NtX2xhcF9zdGF0ZSB7CisJSUJfQ01fTEFQX1VOSU5JVCwKIAlJQl9DTV9MQVBfSURMRSwKIAlJQl9DTV9MQVBfU0VOVCwKIAlJQl9DTV9MQVBfUkNWRCwKQEAgLTQ0MywxMyArNDQ0LDIwIEBACiAJCSAgICB1OCBwcml2YXRlX2RhdGFfbGVuKTsKIAogLyoqCi0gKiBpYl9jbV9lc3RhYmxpc2ggLSBGb3JjZXMgYSBjb25uZWN0aW9uIHN0YXRlIHRvIGVzdGFibGlzaGVkLgorICogaWJfY21fbm90aWZ5IC0gTm90aWZpZXMgdGhlIENNIG9mIGFuIGV2ZW50IHJlcG9ydGVkIHRvIHRoZSBjb25zdW1lci4KICAqIEBjbV9pZDogQ29ubmVjdGlvbiBpZGVudGlmaWVyIHRvIHRyYW5zaXRpb24gdG8gZXN0YWJsaXNoZWQuCisgKiBAZXZlbnQ6IFR5cGUgb2YgZXZlbnQuCiAgKgotICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBpbnZva2VkIGJ5IHVzZXJzIHdobyByZWNlaXZlIG1lc3NhZ2VzIG9uIGEKLSAqIGNvbm5lY3RlZCBRUCBiZWZvcmUgYW4gUlRVIGhhcyBiZWVuIHJlY2VpdmVkLgorICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBpbnZva2VkIGJ5IHVzZXJzIHRvIG5vdGlmeSB0aGUgQ00gb2YgcmVsZXZhbnQKKyAqIGNvbW11bmljYXRpb24gZXZlbnRzLiAgRXZlbnRzIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBDTSBhbmQKKyAqIHdoZW4gdG8gcmVwb3J0IHRoZW0gYXJlOgorICoKKyAqIElCX0VWRU5UX0NPTU1fRVNUIC0gVXNlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBvbiBhIGNvbm5lY3RlZAorICogICAgUVAgYmVmb3JlIGFuIFJUVSBoYXMgYmVlbiByZWNlaXZlZC4KKyAqIElCX0VWRU5UX1BBVEhfTUlHIC0gTm90aWZpZXMgdGhlIENNIHRoYXQgdGhlIGNvbm5lY3Rpb24gaGFzIGZhaWxlZCBvdmVyCisgKiAgIHRvIHRoZSBhbHRlcm5hdGUgcGF0aC4KICAqLwotaW50IGliX2NtX2VzdGFibGlzaChzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKTsKK2ludCBpYl9jbV9ub3RpZnkoc3RydWN0IGliX2NtX2lkICpjbV9pZCwgZW51bSBpYl9ldmVudF90eXBlIGV2ZW50KTsKIAogLyoqCiAgKiBpYl9zZW5kX2NtX3JlaiAtIFNlbmRzIGEgY29ubmVjdGlvbiByZWplY3Rpb24gbWVzc2FnZSB0byB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl91c2VyX2NtLmggYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl9jbS5oCmluZGV4IDA2NmMyMGIuLjM3NjUwYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl91c2VyX2NtLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaApAQCAtMzgsNyArMzgsNyBAQAogCiAjaW5jbHVkZSA8cmRtYS9pYl91c2VyX3NhLmg+CiAKLSNkZWZpbmUgSUJfVVNFUl9DTV9BQklfVkVSU0lPTiA0CisjZGVmaW5lIElCX1VTRVJfQ01fQUJJX1ZFUlNJT04gNQogCiBlbnVtIHsKIAlJQl9VU0VSX0NNX0NNRF9DUkVBVEVfSUQsCkBAIC00Niw3ICs0Niw3IEBACiAJSUJfVVNFUl9DTV9DTURfQVRUUl9JRCwKIAogCUlCX1VTRVJfQ01fQ01EX0xJU1RFTiwKLQlJQl9VU0VSX0NNX0NNRF9FU1RBQkxJU0gsCisJSUJfVVNFUl9DTV9DTURfTk9USUZZLAogCiAJSUJfVVNFUl9DTV9DTURfU0VORF9SRVEsCiAJSUJfVVNFUl9DTV9DTURfU0VORF9SRVAsCkBAIC0xMTcsOCArMTE3LDkgQEAKIAlfX3UzMiByZXNlcnZlZDsKIH07CiAKLXN0cnVjdCBpYl91Y21fZXN0YWJsaXNoIHsKK3N0cnVjdCBpYl91Y21fbm90aWZ5IHsKIAlfX3UzMiBpZDsKKwlfX3UzMiBldmVudDsKIH07CiAKIHN0cnVjdCBpYl91Y21fcHJpdmF0ZV9kYXRhIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKaW5kZXggNjFlZWJlYy4uZWEwODE2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKQEAgLTI1LDYgKzI1LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KICNpbmNsdWRlIDxzY3NpL2lzY3NpX2lmLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJzYXMuaCBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaAppbmRleCAyOWY2ZTFhLi40NGIyZjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGlic2FzLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIAogc3RydWN0IGJsb2NrX2RldmljZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL2NvcmUuaAppbmRleCBmYTFjYTAxLi5hOTk0YmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2NvcmUuaAorKysgYi9pbmNsdWRlL3NvdW5kL2NvcmUuaApAQCAtMTMyLDYgKzEzMiw3IEBACiAJaW50IHNodXRkb3duOwkJCS8qIHRoaXMgY2FyZCBpcyBnb2luZyBkb3duICovCiAJaW50IGZyZWVfb25fbGFzdF9jbG9zZTsJCS8qIGZyZWUgaW4gY29udGV4dCBvZiBmaWxlX3JlbGVhc2UgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl9zbGVlcDsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0xODcsMTMgKzE4OCwxNCBAQAogCWludCBkZXZpY2U7CQkJLyogZGV2aWNlIG51bWJlciAqLwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZfb3BzOwkvKiBmaWxlIG9wZXJhdGlvbnMgKi8KIAl2b2lkICpwcml2YXRlX2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGZfb3BzLT5vcGVuICovCi0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwkvKiBjbGFzcyBkZXZpY2UgZm9yIHN5c2ZzICovCisJc3RydWN0IGRldmljZSAqZGV2OwkJLyogZGV2aWNlIGZvciBzeXNmcyAqLwogfTsKIAogLyogc291bmQuYyAqLwogCiBleHRlcm4gaW50IHNuZF9tYWpvcjsKIGV4dGVybiBpbnQgc25kX2VjYXJkc19saW1pdDsKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKnNvdW5kX2NsYXNzOwogCiB2b2lkIHNuZF9yZXF1ZXN0X2NhcmQoaW50IGNhcmQpOwogCkBAIC0yMDMsNyArMjA1LDcgQEAKIGludCBzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldik7CiB2b2lkICpzbmRfbG9va3VwX21pbm9yX2RhdGEodW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdHlwZSk7CiBpbnQgc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2LAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpOworCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOwogCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCiBpbnQgc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKQEAgLTI1NSw3ICsyNTcsNyBAQAogaW50IHNuZF9jYXJkX2ZpbGVfcmVtb3ZlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiAjaWZuZGVmIHNuZF9jYXJkX3NldF9kZXYKLSNkZWZpbmUgc25kX2NhcmRfc2V0X2RldihjYXJkLGRldnB0cikgKChjYXJkKS0+ZGV2ID0gKGRldnB0cikpCisjZGVmaW5lIHNuZF9jYXJkX3NldF9kZXYoY2FyZCxkZXZwdHIpICgoY2FyZCktPnBhcmVudCA9IChkZXZwdHIpKQogI2VuZGlmCiAKIC8qIGRldmljZS5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3BjbS5oIGIvaW5jbHVkZS9zb3VuZC9wY20uaAppbmRleCBhZmFmM2U4Li4yZjY0NWRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3BjbS5oCisrKyBiL2luY2x1ZGUvc291bmQvcGNtLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KICNpbmNsdWRlIDxzb3VuZC9tZW1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjZGVmaW5lIHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKSAoKHN1YnN0cmVhbSktPnByaXZhdGVfZGF0YSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKaW5kZXggNTJmZDY4Ny4uMTcxMzdmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKQEAgLTEsMyArMSwzIEBACiAvKiBpbmNsdWRlL3ZlcnNpb24uaC4gIEdlbmVyYXRlZCBieSBhbHNhL2tzeW5jIHNjcmlwdC4gICovCiAjZGVmaW5lIENPTkZJR19TTkRfVkVSU0lPTiAiMS4wLjEzIgotI2RlZmluZSBDT05GSUdfU05EX0RBVEUgIiAoU3VuIE9jdCAyMiAwODo1NjoxNiAyMDA2IFVUQykiCisjZGVmaW5lIENPTkZJR19TTkRfREFURSAiIChUdWUgTm92IDI4IDE0OjA3OjI0IDIwMDYgVVRDKSIKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCAxNzZmN2U1Li4xNGQ0ODQ2IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0yNDksNiArMjQ5LDI2IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAorY29uZmlnIFNZU0ZTX0RFUFJFQ0FURUQKKwlib29sICJDcmVhdGUgZGVwcmVjYXRlZCBzeXNmcyBmaWxlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjcmVhdGVzIGRlcHJlY2F0ZWQgc3ltbGlua3Mgc3VjaCBhcyB0aGUKKwkgICJkZXZpY2UiLWxpbmssIHRoZSA8c3Vic3lzdGVtPjo8bmFtZT4tbGluaywgYW5kIHRoZQorCSAgImJ1cyItbGluay4gSXQgbWF5IGFsc28gYWRkIGRlcHJlY2F0ZWQga2V5IGluIHRoZQorCSAgdWV2ZW50IGVudmlyb25tZW50LgorCSAgTm9uZSBvZiB0aGVzZSBmZWF0dXJlcyBvciB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQgdG9kYXksIGFzCisJICB0aGV5IGV4cG9ydCBkcml2ZXIgY29yZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIHVzZXJzcGFjZQorCSAgb3IgZXhwb3J0IHByb3BlcnRpZXMgd2hpY2ggY2FuJ3QgYmUga2VwdCBzdGFibGUgYWNyb3NzIGtlcm5lbAorCSAgcmVsZWFzZXMuCisKKwkgIElmIGVuYWJsZWQsIHRoaXMgb3B0aW9uIHdpbGwgYWxzbyBtb3ZlIGFueSBkZXZpY2Ugc3RydWN0dXJlcworCSAgdGhhdCBiZWxvbmcgdG8gYSBjbGFzcywgYmFjayBpbnRvIHRoZSAvc3lzL2NsYXNzIGhlaXJhY2h5LCBpbgorCSAgb3JkZXIgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyBvZiB1ZGV2LgorCisJICBJZiB5b3UgYXJlIHVzaW5nIGEgZGlzdHJvIHRoYXQgd2FzIHJlbGVhc2VkIGluIDIwMDYgb3IgbGF0ZXIsCisJICBpdCBzaG91bGQgYmUgc2FmZSB0byBzYXkgTiBoZXJlLgorCiBjb25maWcgUkVMQVkKIAlib29sICJLZXJuZWwtPnVzZXIgc3BhY2UgcmVsYXkgc3VwcG9ydCAoZm9ybWVybHkgcmVsYXlmcykiCiAJaGVscApkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggNDJmMmYxMTcuLmFiOTdlNTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGludXguaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlICJhdWRpdC5oIgpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggM2RhOTc4ZS4uOGNkZDNlNyAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0xMzE1LDkgKzEzMTUsOCBAQAogCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKIAl0YXNrID0gY29weV9wcm9jZXNzKENMT05FX1ZNLCAwLCBpZGxlX3JlZ3MoJnJlZ3MpLCAwLCBOVUxMLCBOVUxMLCAwKTsKLQlpZiAoIXRhc2spCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWluaXRfaWRsZSh0YXNrLCBjcHUpOworCWlmICghSVNfRVJSKHRhc2spKQorCQlpbml0X2lkbGUodGFzaywgY3B1KTsKIAogCXJldHVybiB0YXNrOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggNDJhYTZmMS4uYTY4MTkxMiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC0yMzEsMTAgKzIzMSwxMCBAQAogCQlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiAKIAkJYWN0aW9uX3JldCA9IGhhbmRsZV9JUlFfZXZlbnQoaXJxLCBhY3Rpb24pOwotCi0JCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAJCWlmICghbm9pcnFkZWJ1ZykKIAkJCW5vdGVfaW50ZXJydXB0KGlycSwgZGVzYywgYWN0aW9uX3JldCk7CisKKwkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKIAkJaWYgKGxpa2VseSghKGRlc2MtPnN0YXR1cyAmIElSUV9QRU5ESU5HKSkpCiAJCQlicmVhazsKIAkJZGVzYy0+c3RhdHVzICY9IH5JUlFfUEVORElORzsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwppbmRleCA5YzdlMmU0Li41NDNlYTJlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKKysrIGIva2VybmVsL2lycS9zcHVyaW91cy5jCkBAIC0xNDcsMTEgKzE0Nyw3IEBACiAJaWYgKHVubGlrZWx5KGlycWZpeHVwKSkgewogCQkvKiBEb24ndCBwdW5pc2ggd29ya2luZyBjb21wdXRlcnMgKi8KIAkJaWYgKChpcnFmaXh1cCA9PSAyICYmIGlycSA9PSAwKSB8fCBhY3Rpb25fcmV0ID09IElSUV9OT05FKSB7Ci0JCQlpbnQgb2s7Ci0KLQkJCXNwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKLQkJCW9rID0gbWlzcm91dGVkX2lycShpcnEpOwotCQkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKKwkJCWludCBvayA9IG1pc3JvdXRlZF9pcnEoaXJxKTsKIAkJCWlmIChhY3Rpb25fcmV0ID09IElSUV9OT05FKQogCQkJCWRlc2MtPmlycXNfdW5oYW5kbGVkIC09IG9rOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCBiYjRlMjlkLi4yYjc2ZGVlIDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTMwNywxNCArMzA3LDE0IEBACiAJCXJldHVybiAwOwogCiAJZiA9IGNyZWF0ZV93cml0ZV9waXBlKCk7Ci0JaWYgKCFmKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoSVNfRVJSKGYpKQorCQlyZXR1cm4gUFRSX0VSUihmKTsKIAkqZmlscCA9IGY7CiAKIAlmID0gY3JlYXRlX3JlYWRfcGlwZShmKTsKLQlpZiAoIWYpIHsKKwlpZiAoSVNfRVJSKGYpKSB7CiAJCWZyZWVfd3JpdGVfcGlwZSgqZmlscCk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gUFRSX0VSUihmKTsKIAl9CiAJc3ViX2luZm8uc3RkaW4gPSBmOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbGF0ZW5jeS5jIGIva2VybmVsL2xhdGVuY3kuYwppbmRleCAyNThmMjU1Li5lNjNmY2FjIDEwMDY0NAotLS0gYS9rZXJuZWwvbGF0ZW5jeS5jCisrKyBiL2tlcm5lbC9sYXRlbmN5LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBzdHJ1Y3QgbGF0ZW5jeV9pbmZvIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBmMDE2NjU2Li5lMmQwOWQ2IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC0zNCwxMCArMzQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJtYWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdW53aW5kLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTc5MCw2ICs3OTAsMTkgQEAKIAkuc2hvdyA9IHNob3dfcmVmY250LAogfTsKIAordm9pZCBtb2R1bGVfcHV0KHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKwlpZiAobW9kdWxlKSB7CisJCXVuc2lnbmVkIGludCBjcHUgPSBnZXRfY3B1KCk7CisJCWxvY2FsX2RlYygmbW9kdWxlLT5yZWZbY3B1XS5jb3VudCk7CisJCS8qIE1heWJlIHRoZXkncmUgd2FpdGluZyBmb3IgdXMgdG8gZHJvcCByZWZlcmVuY2U/ICovCisJCWlmICh1bmxpa2VseSghbW9kdWxlX2lzX2xpdmUobW9kdWxlKSkpCisJCQl3YWtlX3VwX3Byb2Nlc3MobW9kdWxlLT53YWl0ZXIpOworCQlwdXRfY3B1KCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChtb2R1bGVfcHV0KTsKKwogI2Vsc2UgLyogIUNPTkZJR19NT0RVTEVfVU5MT0FEICovCiBzdGF0aWMgdm9pZCBwcmludF91bmxvYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKQEAgLTEwODYsMjIgKzEwOTksMzUgQEAKIAkJZ290byBvdXQ7CiAJa29ial9zZXRfa3NldF9zKCZtb2QtPm1rb2JqLCBtb2R1bGVfc3Vic3lzKTsKIAltb2QtPm1rb2JqLm1vZCA9IG1vZDsKLQllcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZtb2QtPm1rb2JqLmtvYmopOworCisJLyogZGVsYXkgdWV2ZW50IHVudGlsIGZ1bGwgc3lzZnMgcG9wdWxhdGlvbiAqLworCWtvYmplY3RfaW5pdCgmbW9kLT5ta29iai5rb2JqKTsKKwllcnIgPSBrb2JqZWN0X2FkZCgmbW9kLT5ta29iai5rb2JqKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAorCW1vZC0+ZHJpdmVyc19kaXIgPSBrb2JqZWN0X2FkZF9kaXIoJm1vZC0+bWtvYmoua29iaiwgImRyaXZlcnMiKTsKKwlpZiAoIW1vZC0+ZHJpdmVyc19kaXIpCisJCWdvdG8gb3V0X3VucmVnOworCiAJZXJyID0gbW9kdWxlX3BhcmFtX3N5c2ZzX3NldHVwKG1vZCwga3BhcmFtLCBudW1fcGFyYW1zKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF91bnJlZzsKKwkJZ290byBvdXRfdW5yZWdfZHJpdmVyczsKIAogCWVyciA9IG1vZHVsZV9hZGRfbW9kaW5mb19hdHRycyhtb2QpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3VucmVnOworCQlnb3RvIG91dF91bnJlZ19wYXJhbTsKIAorCWtvYmplY3RfdWV2ZW50KCZtb2QtPm1rb2JqLmtvYmosIEtPQkpfQUREKTsKIAlyZXR1cm4gMDsKIAorb3V0X3VucmVnX2RyaXZlcnM6CisJa29iamVjdF91bnJlZ2lzdGVyKG1vZC0+ZHJpdmVyc19kaXIpOworb3V0X3VucmVnX3BhcmFtOgorCW1vZHVsZV9wYXJhbV9zeXNmc19yZW1vdmUobW9kKTsKIG91dF91bnJlZzoKLQlrb2JqZWN0X3VucmVnaXN0ZXIoJm1vZC0+bWtvYmoua29iaik7CisJa29iamVjdF9kZWwoJm1vZC0+bWtvYmoua29iaik7CisJa29iamVjdF9wdXQoJm1vZC0+bWtvYmoua29iaik7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTExMTAsNiArMTEzNiw3IEBACiB7CiAJbW9kdWxlX3JlbW92ZV9tb2RpbmZvX2F0dHJzKG1vZCk7CiAJbW9kdWxlX3BhcmFtX3N5c2ZzX3JlbW92ZShtb2QpOworCWtvYmplY3RfdW5yZWdpc3Rlcihtb2QtPmRyaXZlcnNfZGlyKTsKIAogCWtvYmplY3RfdW5yZWdpc3RlcigmbW9kLT5ta29iai5rb2JqKTsKIH0KQEAgLTIyNzUsMTEgKzIzMDIsMTQgQEAKIAogdm9pZCBtb2R1bGVfYWRkX2RyaXZlcihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7CisJaW50IG5vX3dhcm47CisKIAlpZiAoIW1vZCB8fCAhZHJ2KQogCQlyZXR1cm47CiAKLQkvKiBEb24ndCBjaGVjayByZXR1cm4gY29kZTsgdGhpcyBjYWxsIGlzIGlkZW1wb3RlbnQgKi8KLQlzeXNmc19jcmVhdGVfbGluaygmZHJ2LT5rb2JqLCAmbW9kLT5ta29iai5rb2JqLCAibW9kdWxlIik7CisJLyogRG9uJ3QgY2hlY2sgcmV0dXJuIGNvZGVzOyB0aGVzZSBjYWxscyBhcmUgaWRlbXBvdGVudCAqLworCW5vX3dhcm4gPSBzeXNmc19jcmVhdGVfbGluaygmZHJ2LT5rb2JqLCAmbW9kLT5ta29iai5rb2JqLCAibW9kdWxlIik7CisJbm9fd2FybiA9IHN5c2ZzX2NyZWF0ZV9saW5rKG1vZC0+ZHJpdmVyc19kaXIsICZkcnYtPmtvYmosIGRydi0+bmFtZSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1vZHVsZV9hZGRfZHJpdmVyKTsKIApAQCAtMjI4OCw2ICsyMzE4LDggQEAKIAlpZiAoIWRydikKIAkJcmV0dXJuOwogCXN5c2ZzX3JlbW92ZV9saW5rKCZkcnYtPmtvYmosICJtb2R1bGUiKTsKKwlpZiAoZHJ2LT5vd25lciAmJiBkcnYtPm93bmVyLT5kcml2ZXJzX2RpcikKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoZHJ2LT5vd25lci0+ZHJpdmVyc19kaXIsIGRydi0+bmFtZSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1vZHVsZV9yZW1vdmVfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NwaW5sb2NrLmMgYi9rZXJuZWwvc3BpbmxvY2suYwppbmRleCA0NzZjMzc0Li4yYzZjMmJmIDEwMDY0NAotLS0gYS9rZXJuZWwvc3BpbmxvY2suYworKysgYi9rZXJuZWwvc3BpbmxvY2suYwpAQCAtMjkzLDYgKzI5MywyNyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9zcGluX2xvY2tfbmVzdGVkKTsKK3Vuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKHNwaW5sb2NrX3QgKmxvY2ssIGludCBzdWJjbGFzcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOworCXNwaW5fYWNxdWlyZSgmbG9jay0+ZGVwX21hcCwgc3ViY2xhc3MsIDAsIF9SRVRfSVBfKTsKKwkvKgorCSAqIE9uIGxvY2tkZXAgd2UgZG9udCB3YW50IHRoZSBoYW5kLWNvZGVkIGlycS1lbmFibGUgb2YKKwkgKiBfcmF3X3NwaW5fbG9ja19mbGFncygpIGNvZGUsIGJlY2F1c2UgbG9ja2RlcCBhc3N1bWVzCisJICogdGhhdCBpbnRlcnJ1cHRzIGFyZSBub3QgcmUtZW5hYmxlZCBkdXJpbmcgbG9jay1hY3F1aXJlOgorCSAqLworI2lmZGVmIENPTkZJR19QUk9WRV9TUElOX0xPQ0tJTkcKKwlfcmF3X3NwaW5fbG9jayhsb2NrKTsKKyNlbHNlCisJX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgJmZsYWdzKTsKKyNlbmRpZgorCXJldHVybiBmbGFnczsKK30KKworRVhQT1JUX1NZTUJPTChfc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90YXNrc3RhdHMuYyBiL2tlcm5lbC90YXNrc3RhdHMuYwppbmRleCBmNDVjNWU3Li5kM2QyODkxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGFza3N0YXRzLmMKKysrIGIva2VybmVsL3Rhc2tzdGF0cy5jCkBAIC03Nyw4ICs3Nyw3IEBACiAJLyoKIAkgKiBJZiBuZXcgYXR0cmlidXRlcyBhcmUgYWRkZWQsIHBsZWFzZSByZXZpc2l0IHRoaXMgYWxsb2NhdGlvbgogCSAqLwotCXNpemUgPSBubG1zZ190b3RhbF9zaXplKGdlbmxtc2dfdG90YWxfc2l6ZShzaXplKSk7Ci0Jc2tiID0gbmxtc2dfbmV3KHNpemUsIEdGUF9LRVJORUwpOworCXNrYiA9IGdlbmxtc2dfbmV3KHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtODYsMTMgKzg1LDkgQEAKIAkJaW50IHNlcSA9IGdldF9jcHVfdmFyKHRhc2tzdGF0c19zZXFudW0pKys7CiAJCXB1dF9jcHVfdmFyKHRhc2tzdGF0c19zZXFudW0pOwogCi0JCXJlcGx5ID0gZ2VubG1zZ19wdXQoc2tiLCAwLCBzZXEsCi0JCQkJZmFtaWx5LmlkLCAwLCAwLAotCQkJCWNtZCwgZmFtaWx5LnZlcnNpb24pOworCQlyZXBseSA9IGdlbmxtc2dfcHV0KHNrYiwgMCwgc2VxLCAmZmFtaWx5LCAwLCBjbWQpOwogCX0gZWxzZQotCQlyZXBseSA9IGdlbmxtc2dfcHV0KHNrYiwgaW5mby0+c25kX3BpZCwgaW5mby0+c25kX3NlcSwKLQkJCQlmYW1pbHkuaWQsIDAsIDAsCi0JCQkJY21kLCBmYW1pbHkudmVyc2lvbik7CisJCXJlcGx5ID0gZ2VubG1zZ19wdXRfcmVwbHkoc2tiLCBpbmZvLCAmZmFtaWx5LCAwLCBjbWQpOwogCWlmIChyZXBseSA9PSBOVUxMKSB7CiAJCW5sbXNnX2ZyZWUoc2tiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9rZXJuZWwvdW53aW5kLmMgYi9rZXJuZWwvdW53aW5kLmMKaW5kZXggZjdlNTBkMS4uZWQwYTIxZCAxMDA2NDQKLS0tIGEva2VybmVsL3Vud2luZC5jCisrKyBiL2tlcm5lbC91bndpbmQuYwpAQCAtOTM4LDggKzkzOCwxMSBAQAogCQllbHNlIHsKIAkJCXJldEFkZHJSZWcgPSBzdGF0ZS52ZXJzaW9uIDw9IDEgPyAqcHRyKysgOiBnZXRfdWxlYjEyOCgmcHRyLCBlbmQpOwogCQkJLyogc2tpcCBhdWdtZW50YXRpb24gKi8KLQkJCWlmICgoKGNvbnN0IGNoYXIgKikoY2llICsgMikpWzFdID09ICd6JykKLQkJCQlwdHIgKz0gZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsKKwkJCWlmICgoKGNvbnN0IGNoYXIgKikoY2llICsgMikpWzFdID09ICd6JykgeworCQkJCXVsZWIxMjhfdCBhdWdTaXplID0gZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsKKworCQkJCXB0ciArPSBhdWdTaXplOworCQkJfQogCQkJaWYgKHB0ciA+IGVuZAogCQkJICAgfHwgcmV0QWRkclJlZyA+PSBBUlJBWV9TSVpFKHJlZ19pbmZvKQogCQkJICAgfHwgUkVHX0lOVkFMSUQocmV0QWRkclJlZykKQEAgLTk2Myw5ICs5NjYsNyBAQAogCWlmIChjaWUgPT0gTlVMTCB8fCBmZGUgPT0gTlVMTCkgewogI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCiAJCXVuc2lnbmVkIGxvbmcgdG9wLCBib3R0b207Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCiAJCXRvcCA9IFNUQUNLX1RPUChmcmFtZS0+dGFzayk7CiAJCWJvdHRvbSA9IFNUQUNLX0JPVFRPTShmcmFtZS0+dGFzayk7CiAjIGlmIEZSQU1FX1JFVEFERFJfT0ZGU0VUIDwgMApkaWZmIC0tZ2l0IGEvbGliL2lvbWFwLmMgYi9saWIvaW9tYXAuYwppbmRleCA1NTY4OWM1Li5kNmNjZGQ4IDEwMDY0NAotLS0gYS9saWIvaW9tYXAuYworKysgYi9saWIvaW9tYXAuYwpAQCAtNTAsNiArNTAsMTYgQEAKIAl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKKyNpZm5kZWYgcGlvX3JlYWQxNmJlCisjZGVmaW5lIHBpb19yZWFkMTZiZShwb3J0KSBzd2FiMTYoaW53KHBvcnQpKQorI2RlZmluZSBwaW9fcmVhZDMyYmUocG9ydCkgc3dhYjMyKGlubChwb3J0KSkKKyNlbmRpZgorCisjaWZuZGVmIG1taW9fcmVhZDE2YmUKKyNkZWZpbmUgbW1pb19yZWFkMTZiZShhZGRyKSBiZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhhZGRyKSkKKyNkZWZpbmUgbW1pb19yZWFkMzJiZShhZGRyKSBiZTMyX3RvX2NwdShfX3Jhd19yZWFkbChhZGRyKSkKKyNlbmRpZgorCiB1bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkOCh2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJSU9fQ09ORChhZGRyLCByZXR1cm4gaW5iKHBvcnQpLCByZXR1cm4gcmVhZGIoYWRkcikpOwpAQCAtNjAsNyArNzAsNyBAQAogfQogdW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDE2YmUodm9pZCBfX2lvbWVtICphZGRyKQogewotCUlPX0NPTkQoYWRkciwgcmV0dXJuIGludyhwb3J0KSwgcmV0dXJuIGJlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KGFkZHIpKSk7CisJSU9fQ09ORChhZGRyLCByZXR1cm4gcGlvX3JlYWQxNmJlKHBvcnQpLCByZXR1cm4gbW1pb19yZWFkMTZiZShhZGRyKSk7CiB9CiB1bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkMzIodm9pZCBfX2lvbWVtICphZGRyKQogewpAQCAtNjgsNyArNzgsNyBAQAogfQogdW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDMyYmUodm9pZCBfX2lvbWVtICphZGRyKQogewotCUlPX0NPTkQoYWRkciwgcmV0dXJuIGlubChwb3J0KSwgcmV0dXJuIGJlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKGFkZHIpKSk7CisJSU9fQ09ORChhZGRyLCByZXR1cm4gcGlvX3JlYWQzMmJlKHBvcnQpLCByZXR1cm4gbW1pb19yZWFkMzJiZShhZGRyKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvcmVhZDgpOwogRVhQT1JUX1NZTUJPTChpb3JlYWQxNik7CkBAIC03Niw2ICs4NiwxNiBAQAogRVhQT1JUX1NZTUJPTChpb3JlYWQzMik7CiBFWFBPUlRfU1lNQk9MKGlvcmVhZDMyYmUpOwogCisjaWZuZGVmIHBpb193cml0ZTE2YmUKKyNkZWZpbmUgcGlvX3dyaXRlMTZiZSh2YWwscG9ydCkgb3V0dyhzd2FiMTYodmFsKSxwb3J0KQorI2RlZmluZSBwaW9fd3JpdGUzMmJlKHZhbCxwb3J0KSBvdXRsKHN3YWIzMih2YWwpLHBvcnQpCisjZW5kaWYKKworI2lmbmRlZiBtbWlvX3dyaXRlMTZiZQorI2RlZmluZSBtbWlvX3dyaXRlMTZiZSh2YWwscG9ydCkgX19yYXdfd3JpdGV3KGJlMTZfdG9fY3B1KHZhbCkscG9ydCkKKyNkZWZpbmUgbW1pb193cml0ZTMyYmUodmFsLHBvcnQpIF9fcmF3X3dyaXRlbChiZTMyX3RvX2NwdSh2YWwpLHBvcnQpCisjZW5kaWYKKwogdm9pZCBmYXN0Y2FsbCBpb3dyaXRlOCh1OCB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlJT19DT05EKGFkZHIsIG91dGIodmFsLHBvcnQpLCB3cml0ZWIodmFsLCBhZGRyKSk7CkBAIC04Niw3ICsxMDYsNyBAQAogfQogdm9pZCBmYXN0Y2FsbCBpb3dyaXRlMTZiZSh1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JSU9fQ09ORChhZGRyLCBvdXR3KHZhbCxwb3J0KSwgX19yYXdfd3JpdGV3KGNwdV90b19iZTE2KHZhbCksIGFkZHIpKTsKKwlJT19DT05EKGFkZHIsIHBpb193cml0ZTE2YmUodmFsLHBvcnQpLCBtbWlvX3dyaXRlMTZiZSh2YWwsIGFkZHIpKTsKIH0KIHZvaWQgZmFzdGNhbGwgaW93cml0ZTMyKHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKQEAgLTk0LDcgKzExNCw3IEBACiB9CiB2b2lkIGZhc3RjYWxsIGlvd3JpdGUzMmJlKHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlJT19DT05EKGFkZHIsIG91dGwodmFsLHBvcnQpLCBfX3Jhd193cml0ZWwoY3B1X3RvX2JlMzIodmFsKSwgYWRkcikpOworCUlPX0NPTkQoYWRkciwgcGlvX3dyaXRlMzJiZSh2YWwscG9ydCksIG1taW9fd3JpdGUzMmJlKHZhbCwgYWRkcikpOwogfQogRVhQT1JUX1NZTUJPTChpb3dyaXRlOCk7CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGUxNik7CkBAIC0xMDgsNiArMTI4LDcgQEAKICAqIGNvbnZlcnQgdG8gQ1BVIGJ5dGUgb3JkZXIuIFdlIHdyaXRlIGluICJJTyBieXRlCiAgKiBvcmRlciIgKHdlIGFsc28gZG9uJ3QgaGF2ZSBJTyBiYXJyaWVycykuCiAgKi8KKyNpZm5kZWYgbW1pb19pbnNiCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1pb19pbnNiKHZvaWQgX19pb21lbSAqYWRkciwgdTggKmRzdCwgaW50IGNvdW50KQogewogCXdoaWxlICgtLWNvdW50ID49IDApIHsKQEAgLTEzMiw3ICsxNTMsOSBAQAogCQlkc3QrKzsKIAl9CiB9CisjZW5kaWYKIAorI2lmbmRlZiBtbWlvX291dHNiCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1pb19vdXRzYih2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHU4ICpzcmMsIGludCBjb3VudCkKIHsKIAl3aGlsZSAoLS1jb3VudCA+PSAwKSB7CkBAIC0xNTQsNiArMTc3LDcgQEAKIAkJc3JjKys7CiAJfQogfQorI2VuZGlmCiAKIHZvaWQgZmFzdGNhbGwgaW9yZWFkOF9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CmRpZmYgLS1naXQgYS9saWIva29iamVjdC5jIGIvbGliL2tvYmplY3QuYwppbmRleCA3ZGQ1YzBlLi43NDRhNGIxIDEwMDY0NAotLS0gYS9saWIva29iamVjdC5jCisrKyBiL2xpYi9rb2JqZWN0LmMKQEAgLTMxMSw2ICszMTEsNTYgQEAKIH0KIAogLyoqCisgKglrb2JqZWN0X21vdmUgLSBtb3ZlIG9iamVjdCB0byBhbm90aGVyIHBhcmVudAorICoJQGtvYmo6CW9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCUBuZXdfcGFyZW50OiBvYmplY3QncyBuZXcgcGFyZW50CisgKi8KKworaW50IGtvYmplY3RfbW92ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKm5ld19wYXJlbnQpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBrb2JqZWN0ICpvbGRfcGFyZW50OworCWNvbnN0IGNoYXIgKmRldnBhdGggPSBOVUxMOworCWNoYXIgKmRldnBhdGhfc3RyaW5nID0gTlVMTDsKKwljaGFyICplbnZwWzJdOworCisJa29iaiA9IGtvYmplY3RfZ2V0KGtvYmopOworCWlmICgha29iaikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbmV3X3BhcmVudCA9IGtvYmplY3RfZ2V0KG5ld19wYXJlbnQpOworCWlmICghbmV3X3BhcmVudCkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKiBvbGQgb2JqZWN0IHBhdGggKi8KKwlkZXZwYXRoID0ga29iamVjdF9nZXRfcGF0aChrb2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldnBhdGgpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJZGV2cGF0aF9zdHJpbmcgPSBrbWFsbG9jKHN0cmxlbihkZXZwYXRoKSArIDE1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldnBhdGhfc3RyaW5nKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXNwcmludGYoZGV2cGF0aF9zdHJpbmcsICJERVZQQVRIX09MRD0lcyIsIGRldnBhdGgpOworCWVudnBbMF0gPSBkZXZwYXRoX3N0cmluZzsKKwllbnZwWzFdID0gTlVMTDsKKwllcnJvciA9IHN5c2ZzX21vdmVfZGlyKGtvYmosIG5ld19wYXJlbnQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJb2xkX3BhcmVudCA9IGtvYmotPnBhcmVudDsKKwlrb2JqLT5wYXJlbnQgPSBuZXdfcGFyZW50OworCWtvYmplY3RfcHV0KG9sZF9wYXJlbnQpOworCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX01PVkUsIGVudnApOworb3V0OgorCWtvYmplY3RfcHV0KGtvYmopOworCWtmcmVlKGRldnBhdGhfc3RyaW5nKTsKKwlrZnJlZShkZXZwYXRoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgogICoJa29iamVjdF9kZWwgLSB1bmxpbmsga29iamVjdCBmcm9tIGhpZXJhcmNoeS4KICAqIAlAa29iajoJb2JqZWN0LgogICovCmRpZmYgLS1naXQgYS9saWIva29iamVjdF91ZXZlbnQuYyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCmluZGV4IDdmMjBlN2IuLmExOTIyNzYgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0X3VldmVudC5jCisrKyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC01MCwxOCArNTAsMjIgQEAKIAkJcmV0dXJuICJvZmZsaW5lIjsKIAljYXNlIEtPQkpfT05MSU5FOgogCQlyZXR1cm4gIm9ubGluZSI7CisJY2FzZSBLT0JKX01PVkU6CisJCXJldHVybiAibW92ZSI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQogCiAvKioKLSAqIGtvYmplY3RfdWV2ZW50IC0gbm90aWZ5IHVzZXJzcGFjZSBieSBlbmRpbmcgYW4gdWV2ZW50CisgKiBrb2JqZWN0X3VldmVudF9lbnYgLSBzZW5kIGFuIHVldmVudCB3aXRoIGVudmlyb25tZW50YWwgZGF0YQogICoKLSAqIEBhY3Rpb246IGFjdGlvbiB0aGF0IGlzIGhhcHBlbmluZyAodXN1YWxseSBLT0JKX0FERCBhbmQgS09CSl9SRU1PVkUpCisgKiBAYWN0aW9uOiBhY3Rpb24gdGhhdCBpcyBoYXBwZW5pbmcgKHVzdWFsbHkgS09CSl9NT1ZFKQogICogQGtvYmo6IHN0cnVjdCBrb2JqZWN0IHRoYXQgdGhlIGFjdGlvbiBpcyBoYXBwZW5pbmcgdG8KKyAqIEBlbnZwX2V4dDogcG9pbnRlciB0byBlbnZpcm9ubWVudGFsIGRhdGEKICAqLwotdm9pZCBrb2JqZWN0X3VldmVudChzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24pCit2b2lkIGtvYmplY3RfdWV2ZW50X2VudihzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24sCisJCQljaGFyICplbnZwX2V4dFtdKQogewogCWNoYXIgKiplbnZwOwogCWNoYXIgKmJ1ZmZlcjsKQEAgLTc2LDYgKzgwLDcgQEAKIAljaGFyICpzZXFfYnVmZjsKIAlpbnQgaSA9IDA7CiAJaW50IHJldHZhbDsKKwlpbnQgajsKIAogCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMTM0LDcgKzEzOSw4IEBACiAJc2NyYXRjaCArPSBzcHJpbnRmIChzY3JhdGNoLCAiREVWUEFUSD0lcyIsIGRldnBhdGgpICsgMTsKIAllbnZwIFtpKytdID0gc2NyYXRjaDsKIAlzY3JhdGNoICs9IHNwcmludGYoc2NyYXRjaCwgIlNVQlNZU1RFTT0lcyIsIHN1YnN5c3RlbSkgKyAxOwotCisJZm9yIChqID0gMDsgZW52cF9leHQgJiYgZW52cF9leHRbal07IGorKykKKwkJZW52cFtpKytdID0gZW52cF9leHRbal07CiAJLyoganVzdCByZXNlcnZlIHRoZSBzcGFjZSwgb3ZlcndyaXRlIGl0IGFmdGVyIGtzZXQgY2FsbCBoYXMgcmV0dXJuZWQgKi8KIAllbnZwW2krK10gPSBzZXFfYnVmZiA9IHNjcmF0Y2g7CiAJc2NyYXRjaCArPSBzdHJsZW4oIlNFUU5VTT0xODQ0Njc0NDA3MzcwOTU1MTYxNiIpICsgMTsKQEAgLTIwMCw2ICsyMDYsMjAgQEAKIAlrZnJlZShlbnZwKTsKIAlyZXR1cm47CiB9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGtvYmplY3RfdWV2ZW50X2Vudik7CisKKy8qKgorICoga29iamVjdF91ZXZlbnQgLSBub3RpZnkgdXNlcnNwYWNlIGJ5IGVuZGluZyBhbiB1ZXZlbnQKKyAqCisgKiBAYWN0aW9uOiBhY3Rpb24gdGhhdCBpcyBoYXBwZW5pbmcgKHVzdWFsbHkgS09CSl9BREQgYW5kIEtPQkpfUkVNT1ZFKQorICogQGtvYmo6IHN0cnVjdCBrb2JqZWN0IHRoYXQgdGhlIGFjdGlvbiBpcyBoYXBwZW5pbmcgdG8KKyAqLwordm9pZCBrb2JqZWN0X3VldmVudChzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24pCit7CisJa29iamVjdF91ZXZlbnRfZW52KGtvYmosIGFjdGlvbiwgTlVMTCk7Cit9CisKIEVYUE9SVF9TWU1CT0xfR1BMKGtvYmplY3RfdWV2ZW50KTsKIAogLyoqCmRpZmYgLS1naXQgYS9saWIvcmFuZG9tMzIuYyBiL2xpYi9yYW5kb20zMi5jCmluZGV4IDRhMTVjZTUuLmVjN2Y4MWQgMTAwNjQ0Ci0tLSBhL2xpYi9yYW5kb20zMi5jCisrKyBiL2xpYi9yYW5kb20zMi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKIHN0cnVjdCBybmRfc3RhdGUgewpkaWZmIC0tZ2l0IGEvbGliL3RleHRzZWFyY2guYyBiL2xpYi90ZXh0c2VhcmNoLmMKaW5kZXggMmNiNGE0My4uOThiY2FkYyAxMDA2NDQKLS0tIGEvbGliL3RleHRzZWFyY2guYworKysgYi9saWIvdGV4dHNlYXJjaC5jCkBAIC00MCw3ICs0MCw3IEBACiAgKiAgICAgICBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgKiAgICgzKSBVc2VyIHN0YXJ0cyB0aGUgc2VhcmNoKGVzKSBieSBjYWxsaW5nIF9maW5kKCkgb3IgX25leHQoKSB0bwogICogICAgICAgZmV0Y2ggc3Vic2VxdWVudCBvY2N1cnJlbmNlcy4gQSBzdGF0ZSB2YXJpYWJsZSBpcyBwcm92aWRlZAotICogICAgICAgdG8gdGhlIGFsZ29yaWh0bSB0byBzdG9yZSBwZXJzaXN0YW50IHZhcmlhYmxlcy4KKyAqICAgICAgIHRvIHRoZSBhbGdvcmlodG0gdG8gc3RvcmUgcGVyc2lzdGVudCB2YXJpYWJsZXMuCiAgKiAgICg0KSBDb3JlIGV2ZW50dWFsbHkgcmVzZXRzIHRoZSBzZWFyY2ggb2Zmc2V0IGFuZCBmb3J3YXJkcyB0aGUgZmluZCgpCiAgKiAgICAgICByZXF1ZXN0IHRvIHRoZSBhbGdvcml0aG0uCiAgKiAgICg1KSBBbGdvcml0aG0gY2FsbHMgZ2V0X25leHRfYmxvY2soKSBwcm92aWRlZCBieSB0aGUgdXNlciBjb250aW5vdXNseQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDdiODRkYzguLjEzZGYwMWMgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTE4OTMsNiArMTg5Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc2hvdWxkX3JlbW92ZV9zdWlkKTsKIAogaW50IF9fcmVtb3ZlX3N1aWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQga2lsbCkKIHsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBiZjJmNmNmLi5hYTZmY2M3IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0yNjEyLDYgKzI2MTIsOSBAQAogewogCWludCBpOwogCisJLyogUmVnaW9ucyBpbiB0aGUgZWFybHlfbm9kZV9tYXAgY2FuIGJlIGluIGFueSBvcmRlciAqLworCXNvcnRfbm9kZV9tYXAoKTsKKwogCS8qIEFzc3VtaW5nIGEgc29ydGVkIG1hcCwgdGhlIGZpcnN0IHJhbmdlIGZvdW5kIGhhcyB0aGUgc3RhcnRpbmcgcGZuICovCiAJZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpCiAJCXJldHVybiBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm47CkBAIC0yNjgwLDkgKzI2ODMsNiBAQAogCQkJbWF4KG1heF96b25lX3BmbltpXSwgYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5baV0pOwogCX0KIAotCS8qIFJlZ2lvbnMgaW4gdGhlIGVhcmx5X25vZGVfbWFwIGNhbiBiZSBpbiBhbnkgb3JkZXIgKi8KLQlzb3J0X25vZGVfbWFwKCk7Ci0KIAkvKiBQcmludCBvdXQgdGhlIHpvbmUgcmFuZ2VzICovCiAJcHJpbnRrKCJab25lIFBGTiByYW5nZXM6XG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspCmRpZmYgLS1naXQgYS9uZXQvODAyL2hpcHBpLmMgYi9uZXQvODAyL2hpcHBpLmMKaW5kZXggNmQ3ZmVkMy4uNTc5ZTJkZCAxMDA2NDQKLS0tIGEvbmV0LzgwMi9oaXBwaS5jCisrKyBiL25ldC84MDIvaGlwcGkuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA2N2UzOWFkLi43ZGZjOTQ5IDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtNzUsNyArNzUsNyBAQAogCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KIAogbWVudWNvbmZpZyBORVRGSUxURVIKLQlib29sICJOZXR3b3JrIHBhY2tldCBmaWx0ZXJpbmcgKHJlcGxhY2VzIGlwY2hhaW5zKSIKKwlib29sICJOZXR3b3JrIHBhY2tldCBmaWx0ZXJpbmcgZnJhbWV3b3JrIChOZXRmaWx0ZXIpIgogCS0tLWhlbHAtLS0KIAkgIE5ldGZpbHRlciBpcyBhIGZyYW1ld29yayBmb3IgZmlsdGVyaW5nIGFuZCBtYW5nbGluZyBuZXR3b3JrIHBhY2tldHMKIAkgIHRoYXQgcGFzcyB0aHJvdWdoIHlvdXIgTGludXggYm94LgpAQCAtMTc1LDMzICsxNzUsNiBAQAogc291cmNlICJkcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3gyNS9LY29uZmlnIgogc291cmNlICJuZXQvbGFwYi9LY29uZmlnIgotCi1jb25maWcgTkVUX0RJVkVSVAotCWJvb2wgIkZyYW1lIERpdmVydGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIEJST0tFTgotCS0tLWhlbHAtLS0KLQkgIFRoZSBGcmFtZSBEaXZlcnRlciBhbGxvd3MgeW91IHRvIGRpdmVydCBwYWNrZXRzIGZyb20gdGhlCi0JICBuZXR3b3JrLCB0aGF0IGFyZSBub3QgYWltZWQgYXQgdGhlIGludGVyZmFjZSByZWNlaXZpbmcgaXQgKGluCi0JICBwcm9taXNjLiBtb2RlKS4gVHlwaWNhbGx5LCBhIExpbnV4IGJveCBzZXR1cCBhcyBhbiBFdGhlcm5ldCBicmlkZ2UKLQkgIHdpdGggdGhlIEZyYW1lcyBEaXZlcnRlciBvbiwgY2FuIGRvIHNvbWUgKnJlYWxseSogdHJhbnNwYXJlbnQgd3d3Ci0JICBjYWNoaW5nIHVzaW5nIGEgU3F1aWQgcHJveHkgZm9yIGV4YW1wbGUuCi0KLQkgIFRoaXMgaXMgdmVyeSB1c2VmdWwgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgeW91ciByb3V0ZXIncwotCSAgY29uZmlnIChvciBpZiB5b3Ugc2ltcGx5IGRvbid0IGhhdmUgYWNjZXNzIHRvIGl0KS4KLQotCSAgVGhlIG90aGVyIHBvc3NpYmxlIHVzYWdlcyBvZiBkaXZlcnRpbmcgRXRoZXJuZXQgRnJhbWVzIGFyZQotCSAgbnVtYmVyb3VzOgotCSAgLSByZXJvdXRlIHNtdHAgdHJhZmZpYyB0byBhbm90aGVyIGludGVyZmFjZQotCSAgLSB0cmFmZmljLXNoYXBlIGNlcnRhaW4gbmV0d29yayBzdHJlYW1zCi0JICAtIHRyYW5zcGFyZW50bHkgcHJveHkgc210cCBjb25uZWN0aW9ucwotCSAgLSBldGMuLi4KLQotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb25zLCBwbGVhc2UgcmVmZXIgdG86Ci0JICA8aHR0cDovL2RpdmVydGVyLnNvdXJjZWZvcmdlLm5ldC8+Ci0JICA8aHR0cDovL3BlcnNvLndhbmFkb28uZnIvbWFncGllL0V0aGVyRGl2ZXJ0Lmh0bWw+Ci0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIHNvdXJjZSAibmV0L2Vjb25ldC9LY29uZmlnIgogc291cmNlICJuZXQvd2Fucm91dGVyL0tjb25maWciCiBzb3VyY2UgIm5ldC9zY2hlZC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggNDg1ZTM1Yy4uM2E3MDUyMiAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgorI2luY2x1ZGUgIi4uL2NvcmUva21hcF9za2IuaCIKIAogc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkZHBfZGwsICphYXJwX2RsOwogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgYXRhbGtfZGdyYW1fb3BzOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9NYWtlZmlsZSBiL25ldC9hdG0vTWFrZWZpbGUKaW5kZXggODk2NTZkNi4uY2M1MGJkMSAxMDA2NDQKLS0tIGEvbmV0L2F0bS9NYWtlZmlsZQorKysgYi9uZXQvYXRtL01ha2VmaWxlCkBAIC03LDEwICs3LDcgQEAKIAogb2JqLSQoQ09ORklHX0FUTSkgKz0gYXRtLm8KIG9iai0kKENPTkZJR19BVE1fQ0xJUCkgKz0gY2xpcC5vCi1hdG0tJChzdWJzdCBtLHksJChDT05GSUdfQVRNX0NMSVApKSArPSBpcGNvbW1vbi5vCiBvYmotJChDT05GSUdfQVRNX0JSMjY4NCkgKz0gYnIyNjg0Lm8KLWF0bS0kKHN1YnN0IG0seSwkKENPTkZJR19BVE1fQlIyNjg0KSkgKz0gaXBjb21tb24ubwotYXRtLSQoc3Vic3QgbSx5LCQoQ09ORklHX05FVF9TQ0hfQVRNKSkgKz0gaXBjb21tb24ubwogYXRtLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2MubwogCiBvYmotJChDT05GSUdfQVRNX0xBTkUpICs9IGxlYy5vCmRpZmYgLS1naXQgYS9uZXQvYXRtL2JyMjY4NC5jIGIvbmV0L2F0bS9icjI2ODQuYwppbmRleCBkMDBjY2E5Li44M2ExYzFiIDEwMDY0NAotLS0gYS9uZXQvYXRtL2JyMjY4NC5jCisrKyBiL25ldC9hdG0vYnIyNjg0LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9hdG1icjI2ODQuaD4KIAogI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImlwY29tbW9uLmgiCiAKIC8qCiAgKiBEZWZpbmUgdGhpcyB0byB1c2UgYSB2ZXJzaW9uIG9mIHRoZSBjb2RlIHdoaWNoIGludGVyYWN0cyB3aXRoIHRoZSBoaWdoZXIKQEAgLTM3Miw3ICszNzEsNyBAQAogCiAvKiBSZXR1cm5zIDEgaWYgcGFja2V0IHNob3VsZCBiZSBkcm9wcGVkICovCiBzdGF0aWMgaW5saW5lIGludAotcGFja2V0X2ZhaWxzX2ZpbHRlcih1MTYgdHlwZSwgc3RydWN0IGJyMjY4NF92Y2MgKmJydmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorcGFja2V0X2ZhaWxzX2ZpbHRlcihfX2JlMTYgdHlwZSwgc3RydWN0IGJyMjY4NF92Y2MgKmJydmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChicnZjYy0+ZmlsdGVyLm5ldG1hc2sgPT0gMCkKIAkJcmV0dXJuIDA7CQkJLyogbm8gZmlsdGVyIGluIHBsYWNlICovCkBAIC01MDAsMTEgKzQ5OSwxMiBAQAogKi8KIAlpbnQgZXJyOwogCXN0cnVjdCBicjI2ODRfdmNjICpicnZjYzsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNvcHk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpycTsKIAlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CiAJc3RydWN0IGF0bV9iYWNrZW5kX2JyMjY4NCBiZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZiZSwgYXJnLCBzaXplb2YgYmUpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTU1NCwxMiArNTU0LDMwIEBACiAJYnJ2Y2MtPm9sZF9wdXNoID0gYXRtdmNjLT5wdXNoOwogCWJhcnJpZXIoKTsKIAlhdG12Y2MtPnB1c2ggPSBicjI2ODRfcHVzaDsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZjb3B5KTsKLQlza2JfbWlncmF0ZSgmc2tfYXRtKGF0bXZjYyktPnNrX3JlY2VpdmVfcXVldWUsICZjb3B5KTsKLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb3B5KSkgIT0gTlVMTCkgeworCisJcnEgPSAmc2tfYXRtKGF0bXZjYyktPnNrX3JlY2VpdmVfcXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnEtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KHJxKSkgeworCQlza2IgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIE5VTEwgdGVybWluYXRlIHRoZSBsaXN0LiAgKi8KKwkJcnEtPnByZXYtPm5leHQgPSBOVUxMOworCQlza2IgPSBycS0+bmV4dDsKKwl9CisJcnEtPnByZXYgPSBycS0+bmV4dCA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXJxOworCXJxLT5xbGVuID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHNrYikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYi0+bmV4dDsKKworCQlza2ItPm5leHQgPSBza2ItPnByZXYgPSBOVUxMOwogCQlCUlBSSVYoc2tiLT5kZXYpLT5zdGF0cy5yeF9ieXRlcyAtPSBza2ItPmxlbjsKIAkJQlJQUklWKHNrYi0+ZGV2KS0+c3RhdHMucnhfcGFja2V0cy0tOwogCQlicjI2ODRfcHVzaChhdG12Y2MsIHNrYik7CisKKwkJc2tiID0gbmV4dDsKIAl9CiAJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9hdG0vY2xpcC5jIGIvbmV0L2F0bS9jbGlwLmMKaW5kZXggN2FmMmM0MS4uNWY4YTFkMiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9jbGlwLmMKKysrIGIvbmV0L2F0bS9jbGlwLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgInJlc291cmNlcy5oIgotI2luY2x1ZGUgImlwY29tbW9uLmgiCiAjaW5jbHVkZSA8bmV0L2F0bWNsaXAuaD4KIAogCkBAIC01NCw3ICs1Myw3IEBACiBzdGF0aWMgc3RydWN0IG5laWdoX3RhYmxlIGNsaXBfdGJsOwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGlkbGVfdGltZXI7CiAKLXN0YXRpYyBpbnQgdG9fYXRtYXJwZChlbnVtIGF0bWFycF9jdHJsX3R5cGUgdHlwZSwgaW50IGl0ZiwgdW5zaWduZWQgbG9uZyBpcCkKK3N0YXRpYyBpbnQgdG9fYXRtYXJwZChlbnVtIGF0bWFycF9jdHJsX3R5cGUgdHlwZSwgaW50IGl0ZiwgX19iZTMyIGlwKQogewogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgYXRtYXJwX2N0cmwgKmN0cmw7CkBAIC0yMjAsNyArMjE5LDcgQEAKIAkgICAgfHwgbWVtY21wKHNrYi0+ZGF0YSwgbGxjX291aSwgc2l6ZW9mIChsbGNfb3VpKSkpCiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJZWxzZSB7Ci0JCXNrYi0+cHJvdG9jb2wgPSAoKHUxNiAqKSBza2ItPmRhdGEpWzNdOworCQlza2ItPnByb3RvY29sID0gKChfX2JlMTYgKikgc2tiLT5kYXRhKVszXTsKIAkJc2tiX3B1bGwoc2tiLCBSRkMxNDgzTExDX0xFTik7CiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0FSUCkpIHsKIAkJCVBSSVYoc2tiLT5kZXYpLT5zdGF0cy5yeF9wYWNrZXRzKys7CkBAIC00MzAsNyArNDI5LDcgQEAKIAogCQloZXJlID0gc2tiX3B1c2goc2tiLCBSRkMxNDgzTExDX0xFTik7CiAJCW1lbWNweShoZXJlLCBsbGNfb3VpLCBzaXplb2YobGxjX291aSkpOwotCQkoKHUxNiAqKSBoZXJlKVszXSA9IHNrYi0+cHJvdG9jb2w7CisJCSgoX19iZTE2ICopIGhlcmUpWzNdID0gc2tiLT5wcm90b2NvbDsKIAl9CiAJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmc2tfYXRtKHZjYyktPnNrX3dtZW1fYWxsb2MpOwogCUFUTV9TS0Ioc2tiKS0+YXRtX29wdGlvbnMgPSB2Y2MtPmF0bV9vcHRpb25zOwpAQCAtNDY5LDggKzQ2OCw5IEBACiBzdGF0aWMgaW50IGNsaXBfbWtpcChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBpbnQgdGltZW91dCkKIHsKIAlzdHJ1Y3QgY2xpcF92Y2MgKmNsaXBfdmNjOwotCXN0cnVjdCBza19idWZmX2hlYWQgY29weTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmX2hlYWQgKnJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXZjYy0+cHVzaCkKIAkJcmV0dXJuIC1FQkFERkQ7CkBAIC00OTAsMTAgKzQ5MCwyNiBAQAogCWNsaXBfdmNjLT5vbGRfcG9wID0gdmNjLT5wb3A7CiAJdmNjLT5wdXNoID0gY2xpcF9wdXNoOwogCXZjYy0+cG9wID0gY2xpcF9wb3A7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29weSk7Ci0Jc2tiX21pZ3JhdGUoJnNrX2F0bSh2Y2MpLT5za19yZWNlaXZlX3F1ZXVlLCAmY29weSk7CisKKwlycSA9ICZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOworCWlmIChza2JfcXVldWVfZW1wdHkocnEpKSB7CisJCXNrYiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3QuICAqLworCQlycS0+cHJldi0+bmV4dCA9IE5VTEw7CisJCXNrYiA9IHJxLT5uZXh0OworCX0KKwlycS0+cHJldiA9IHJxLT5uZXh0ID0gKHN0cnVjdCBza19idWZmICopcnE7CisJcnEtPnFsZW4gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CisKIAkvKiByZS1wcm9jZXNzIGV2ZXJ5dGhpbmcgcmVjZWl2ZWQgYmV0d2VlbiBjb25uZWN0aW9uIHNldHVwIGFuZCBNS0lQICovCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29weSkpICE9IE5VTEwpCisJd2hpbGUgKHNrYikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYi0+bmV4dDsKKworCQlza2ItPm5leHQgPSBza2ItPnByZXYgPSBOVUxMOwogCQlpZiAoIWNsaXBfZGV2cykgewogCQkJYXRtX3JldHVybih2Y2MsIHNrYi0+dHJ1ZXNpemUpOwogCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC01MDYsMTAgKzUyMiwxMyBAQAogCQkJUFJJVihza2ItPmRldiktPnN0YXRzLnJ4X2J5dGVzIC09IGxlbjsKIAkJCWtmcmVlX3NrYihza2IpOwogCQl9CisKKwkJc2tiID0gbmV4dDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xpcF9zZXRlbnRyeShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCB1MzIgaXApCitzdGF0aWMgaW50IGNsaXBfc2V0ZW50cnkoc3RydWN0IGF0bV92Y2MgKnZjYywgX19iZTMyIGlwKQogewogCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCXN0cnVjdCBhdG1hcnBfZW50cnkgKmVudHJ5OwpAQCAtNzUyLDcgKzc3MSw3IEBACiAJCWVyciA9IGNsaXBfbWtpcCh2Y2MsIGFyZyk7CiAJCWJyZWFrOwogCWNhc2UgQVRNQVJQX1NFVEVOVFJZOgotCQllcnIgPSBjbGlwX3NldGVudHJ5KHZjYywgYXJnKTsKKwkJZXJyID0gY2xpcF9zZXRlbnRyeSh2Y2MsIChfX2ZvcmNlIF9fYmUzMilhcmcpOwogCQlicmVhazsKIAljYXNlIEFUTUFSUF9FTkNBUDoKIAkJZXJyID0gY2xpcF9lbmNhcCh2Y2MsIGFyZyk7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2lwY29tbW9uLmMgYi9uZXQvYXRtL2lwY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2RlNDIuLjAwMDAwMDAKLS0tIGEvbmV0L2F0bS9pcGNvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogbmV0L2F0bS9pcGNvbW1vbi5jIC0gQ29tbW9uIGl0ZW1zIGZvciBhbGwgd2F5cyBvZiBkb2luZyBJUCBvdmVyIEFUTSAqLwotCi0vKiBXcml0dGVuIDE5OTYtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bWNsaXAuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImlwY29tbW9uLmgiCi0KLQotI2lmIDAKLSNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCMjYXJncykKLSNlbHNlCi0jZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCi0jZW5kaWYKLQotCi0vKgotICogc2tiX21pZ3JhdGUgYXBwZW5kcyB0aGUgbGlzdCBhdCAiZnJvbSIgdG8gInRvIiwgZW1wdHlpbmcgImZyb20iIGluIHRoZQotICogcHJvY2Vzcy4gc2tiX21pZ3JhdGUgaXMgYXRvbWljIHdpdGggcmVzcGVjdCB0byBhbGwgb3RoZXIgc2tiIG9wZXJhdGlvbnMgb24KLSAqICJmcm9tIiBhbmQgInRvIi4gTm90ZSB0aGF0IGl0IGxvY2tzIGJvdGggbGlzdHMgYXQgdGhlIHNhbWUgdGltZSwgc28gdG8gZGVhbAotICogd2l0aCB0aGUgbG9jayBvcmRlcmluZywgdGhlIGxvY2tzIGFyZSB0YWtlbiBpbiBhZGRyZXNzIG9yZGVyLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGxpdmUgaW4gc2tidWZmLmMgb3Igc2tidWZmLmguCi0gKi8KLQotCi12b2lkIHNrYl9taWdyYXRlKHN0cnVjdCBza19idWZmX2hlYWQgKmZyb20sIHN0cnVjdCBza19idWZmX2hlYWQgKnRvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl9mcm9tID0gKHN0cnVjdCBza19idWZmICopIGZyb207Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl90byA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSB0bzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcHJldjsKLQotCWlmICgodW5zaWduZWQgbG9uZykgZnJvbSA8ICh1bnNpZ25lZCBsb25nKSB0bykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZnJvbS0+bG9jaywgZmxhZ3MpOwotCQlzcGluX2xvY2tfbmVzdGVkKCZ0by0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0by0+bG9jaywgZmxhZ3MpOwotCQlzcGluX2xvY2tfbmVzdGVkKCZmcm9tLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0JfQotCXByZXYgPSBmcm9tLT5wcmV2OwotCWZyb20tPm5leHQtPnByZXYgPSB0by0+cHJldjsKLQlwcmV2LT5uZXh0ID0gc2tiX3RvOwotCXRvLT5wcmV2LT5uZXh0ID0gZnJvbS0+bmV4dDsKLQl0by0+cHJldiA9IGZyb20tPnByZXY7Ci0JdG8tPnFsZW4gKz0gZnJvbS0+cWxlbjsKLQlzcGluX3VubG9jaygmdG8tPmxvY2spOwotCWZyb20tPnByZXYgPSBza2JfZnJvbTsKLQlmcm9tLT5uZXh0ID0gc2tiX2Zyb207Ci0JZnJvbS0+cWxlbiA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnJvbS0+bG9jaywgZmxhZ3MpOwotfQotCi0KLUVYUE9SVF9TWU1CT0woc2tiX21pZ3JhdGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9pcGNvbW1vbi5oIGIvbmV0L2F0bS9pcGNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzIxNjVmLi4wMDAwMDAwCi0tLSBhL25ldC9hdG0vaXBjb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIG5ldC9hdG0vaXBjb21tb24uaCAtIENvbW1vbiBpdGVtcyBmb3IgYWxsIHdheXMgb2YgZG9pbmcgSVAgb3ZlciBBVE0gKi8KLQotLyogV3JpdHRlbiAxOTk2LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KLQotCi0jaWZuZGVmIE5FVF9BVE1fSVBDT01NT05fSAotI2RlZmluZSBORVRfQVRNX0lQQ09NTU9OX0gKLQotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+Ci0KLS8qCi0gKiBBcHBlbmRzIGFsbCBza2JzIGZyb20gImZyb20iIHRvICJ0byIuIFRoZSBvcGVyYXRpb24gaXMgYXRvbWljIHdpdGggcmVzcGVjdAotICogdG8gYWxsIG90aGVyIHNrYiBvcGVyYXRpb25zIG9uICJmcm9tIiBvciAidG8iLgotICovCi0KLXZvaWQgc2tiX21pZ3JhdGUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqZnJvbSxzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp0byk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9sZWMuYyBiL25ldC9hdG0vbGVjLmMKaW5kZXggNjZjNTdjMS4uNTk0NmVjNiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9sZWMuYworKysgYi9uZXQvYXRtL2xlYy5jCkBAIC0yMDQsOSArMjA0LDkgQEAKIAltZW1zZXQocmRlc2MsIDAsIEVUSF9BTEVOKTsKIAkvKiBvZmZzZXQgNCBjb21lcyBmcm9tIExBTiBkZXN0aW5hdGlvbiBmaWVsZCBpbiBMRSBjb250cm9sIGZyYW1lcyAqLwogCWlmICh0cmgtPnJjZiAmIGh0b25zKCh1aW50MTZfdCkgVFJfUkNGX0RJUl9CSVQpKQotCQltZW1jcHkoJnJkZXNjWzRdLCAmdHJoLT5yc2VnW251bV9yZHNjIC0gMl0sIHNpemVvZih1aW50MTZfdCkpOworCQltZW1jcHkoJnJkZXNjWzRdLCAmdHJoLT5yc2VnW251bV9yZHNjIC0gMl0sIHNpemVvZihfX2JlMTYpKTsKIAllbHNlIHsKLQkJbWVtY3B5KCZyZGVzY1s0XSwgJnRyaC0+cnNlZ1sxXSwgc2l6ZW9mKHVpbnQxNl90KSk7CisJCW1lbWNweSgmcmRlc2NbNF0sICZ0cmgtPnJzZWdbMV0sIHNpemVvZihfX2JlMTYpKTsKIAkJcmRlc2NbNV0gPSAoKG50b2hzKHRyaC0+cnNlZ1swXSkgJiAweDAwMGYpIHwgKHJkZXNjWzVdICYgMHhmMCkpOwogCX0KIApAQCAtNzc1LDcgKzc3NSw3IEBACiAJCXVuc2lnbmVkIGNoYXIgKnNyYywgKmRzdDsKIAogCQlhdG1fcmV0dXJuKHZjYywgc2tiLT50cnVlc2l6ZSk7Ci0JCWlmICgqKHVpbnQxNl90ICopIHNrYi0+ZGF0YSA9PSBodG9ucyhwcml2LT5sZWNpZCkgfHwKKwkJaWYgKCooX19iZTE2ICopIHNrYi0+ZGF0YSA9PSBodG9ucyhwcml2LT5sZWNpZCkgfHwKIAkJICAgICFwcml2LT5sZWNkIHx8ICEoZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKIAkJCS8qCiAJCQkgKiBQcm9iYWJseSBsb29waW5nIGJhY2ssIG9yIGlmIGxlY2QgaXMgbWlzc2luZywKQEAgLTEzMjEsMTEgKzEzMjEsMTAgQEAKIAkJaWYgKHRhYmxlID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAKLQkJKnRsdnMgPSBrbWFsbG9jKHRhYmxlLT5zaXplb2Z0bHZzLCBHRlBfQVRPTUlDKTsKKwkJKnRsdnMgPSBrbWVtZHVwKHRhYmxlLT50bHZzLCB0YWJsZS0+c2l6ZW9mdGx2cywgR0ZQX0FUT01JQyk7CiAJCWlmICgqdGx2cyA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCi0JCW1lbWNweSgqdGx2cywgdGFibGUtPnRsdnMsIHRhYmxlLT5zaXplb2Z0bHZzKTsKIAkJKnNpemVvZnRsdnMgPSB0YWJsZS0+c2l6ZW9mdGx2czsKIAogCQlyZXR1cm4gMDsKQEAgLTEzNjQsMTEgKzEzNjMsMTAgQEAKIAogCWtmcmVlKHByaXYtPnRsdnMpOwkvKiBOVUxMIGlmIHRoZXJlIHdhcyBubyBwcmV2aW91cyBhc3NvY2lhdGlvbiAqLwogCi0JcHJpdi0+dGx2cyA9IGttYWxsb2Moc2l6ZW9mdGx2cywgR0ZQX0tFUk5FTCk7CisJcHJpdi0+dGx2cyA9IGttZW1kdXAodGx2cywgc2l6ZW9mdGx2cywgR0ZQX0tFUk5FTCk7CiAJaWYgKHByaXYtPnRsdnMgPT0gTlVMTCkKIAkJcmV0dXJuICgwKTsKIAlwcml2LT5zaXplb2Z0bHZzID0gc2l6ZW9mdGx2czsKLQltZW1jcHkocHJpdi0+dGx2cywgdGx2cywgc2l6ZW9mdGx2cyk7CiAKIAlza2IgPSBhbGxvY19za2Ioc2l6ZW9mdGx2cywgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKQpAQCAtMTQwOSwxMiArMTQwNywxMCBAQAogCiAJa2ZyZWUoZW50cnktPnRsdnMpOwogCi0JZW50cnktPnRsdnMgPSBrbWFsbG9jKHNpemVvZnRsdnMsIEdGUF9LRVJORUwpOworCWVudHJ5LT50bHZzID0ga21lbWR1cCh0bHZzLCBzaXplb2Z0bHZzLCBHRlBfS0VSTkVMKTsKIAlpZiAoZW50cnktPnRsdnMgPT0gTlVMTCkKIAkJcmV0dXJuOwotCiAJZW50cnktPnNpemVvZnRsdnMgPSBzaXplb2Z0bHZzOwotCW1lbWNweShlbnRyeS0+dGx2cywgdGx2cywgc2l6ZW9mdGx2cyk7CiAjZW5kaWYKICNpZiAwCiAJcHJpbnRrKCJsZWMuYzogbGFuZTJfYXNzb2NpYXRlX2luZCgpXG4iKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbGVjLmggYi9uZXQvYXRtL2xlYy5oCmluZGV4IDg3N2Y1MDkuLjI0Y2M5NWYgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbGVjLmgKKysrIGIvbmV0L2F0bS9sZWMuaApAQCAtMTQsMTQgKzE0LDE0IEBACiAjZGVmaW5lIExFQ19IRUFERVJfTEVOIDE2CiAKIHN0cnVjdCBsZWNkYXRhaGRyXzgwMjMgewotCXVuc2lnbmVkIHNob3J0IGxlX2hlYWRlcjsKKwlfX2JlMTYgbGVfaGVhZGVyOwogCXVuc2lnbmVkIGNoYXIgaF9kZXN0W0VUSF9BTEVOXTsKIAl1bnNpZ25lZCBjaGFyIGhfc291cmNlW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBzaG9ydCBoX3R5cGU7CisJX19iZTE2IGhfdHlwZTsKIH07CiAKIHN0cnVjdCBsZWNkYXRhaGRyXzgwMjUgewotCXVuc2lnbmVkIHNob3J0IGxlX2hlYWRlcjsKKwlfX2JlMTYgbGVfaGVhZGVyOwogCXVuc2lnbmVkIGNoYXIgYWNfcGFkOwogCXVuc2lnbmVkIGNoYXIgZmM7CiAJdW5zaWduZWQgY2hhciBoX2Rlc3RbRVRIX0FMRU5dOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcGMuYyBiL25ldC9hdG0vbXBjLmMKaW5kZXggMGQyYjk5NC4uYzE4ZjczNyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9tcGMuYworKysgYi9uZXQvYXRtL21wYy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIC8qCiAgKiBPdmVyd3JpdGVzIHRoZSBvbGQgZW50cnkgb3IgbWFrZXMgYSBuZXcgb25lLgogICovCi1zdHJ1Y3QgYXRtX21wb2FfcW9zICphdG1fbXBvYV9hZGRfcW9zKHVpbnQzMl90IGRzdF9pcCwgc3RydWN0IGF0bV9xb3MgKnFvcykKK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX2FkZF9xb3MoX19iZTMyIGRzdF9pcCwgc3RydWN0IGF0bV9xb3MgKnFvcykKIHsKIAlzdHJ1Y3QgYXRtX21wb2FfcW9zICplbnRyeTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCi1zdHJ1Y3QgYXRtX21wb2FfcW9zICphdG1fbXBvYV9zZWFyY2hfcW9zKHVpbnQzMl90IGRzdF9pcCkKK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX3NlYXJjaF9xb3MoX19iZTMyIGRzdF9pcCkKIHsKIAlzdHJ1Y3QgYXRtX21wb2FfcW9zICpxb3M7CiAKQEAgLTQ2MCwxMSArNDYwLDExIEBACiAJaW5fY2FjaGVfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBpcGhkciAqaXBoOwogCWNoYXIgKmJ1ZmY7Ci0JdWludDMyX3QgaXBhZGRyID0gMDsKKwlfX2JlMzIgaXBhZGRyID0gMDsKIAogCXN0YXRpYyBzdHJ1Y3QgewogCQlzdHJ1Y3QgbGxjX3NuYXBfaGRyIGhkcjsKLQkJdWludDMyX3QgdGFnOworCQlfX2JlMzIgdGFnOwogCX0gdGFnZ2VkX2xsY19zbmFwX2hkciA9IHsKIAkJezB4YWEsIDB4YWEsIDB4MDMsIHsweDAwLCAweDAwLCAweDAwfSwgezB4ODgsIDB4NGN9fSwKIAkJMApAQCAtNTU5LDcgKzU1OSw3IEBACiAJc3RydWN0IG1wb2FfY2xpZW50ICptcGM7CiAJc3RydWN0IGF0bW1wY19pb2MgaW9jX2RhdGE7CiAJaW5fY2FjaGVfZW50cnkgKmluX2VudHJ5OwotCXVpbnQzMl90ICBpcGFkZHI7CisJX19iZTMyICBpcGFkZHI7CiAKIAlieXRlc19sZWZ0ID0gY29weV9mcm9tX3VzZXIoJmlvY19kYXRhLCBhcmcsIHNpemVvZihzdHJ1Y3QgYXRtbXBjX2lvYykpOwogCWlmIChieXRlc19sZWZ0ICE9IDApIHsKQEAgLTYzOCw3ICs2MzgsNyBAQAogCXN0cnVjdCBza19idWZmICpuZXdfc2tiOwogCWVnX2NhY2hlX2VudHJ5ICplZzsKIAlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYzsKLQl1aW50MzJfdCB0YWc7CisJX19iZTMyIHRhZzsKIAljaGFyICp0bXA7CiAJCiAJZGRwcmludGsoIm1wb2E6ICglcykgbXBjX3B1c2g6XG4iLCBkZXYtPm5hbWUpOwpAQCAtNjgzLDcgKzY4Myw3IEBACiAJfQogCiAJdG1wID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpOwotCXRhZyA9ICoodWludDMyX3QgKil0bXA7CisJdGFnID0gKihfX2JlMzIgKil0bXA7CiAKIAllZyA9IG1wYy0+ZWdfb3BzLT5nZXRfYnlfdGFnKHRhZywgbXBjKTsKIAlpZiAoZWcgPT0gTlVMTCkgewpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAogc3RhdGljIHZvaWQgTVBPQV90cmlnZ2VyX3JjdmQoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKLQl1aW50MzJfdCBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CisJX19iZTMyIGRzdF9pcCA9IG1zZy0+Y29udGVudC5pbl9pbmZvLmluX2RzdF9pcDsKIAlpbl9jYWNoZV9lbnRyeSAqZW50cnk7CiAKIAllbnRyeSA9IG1wYy0+aW5fb3BzLT5nZXQoZHN0X2lwLCBtcGMpOwpAQCAtMTA2Niw3ICsxMDY2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgY2hlY2tfcW9zX2FuZF9vcGVuX3Nob3J0Y3V0KHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQsIGluX2NhY2hlX2VudHJ5ICplbnRyeSkKIHsKLQl1aW50MzJfdCBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CisJX19iZTMyIGRzdF9pcCA9IG1zZy0+Y29udGVudC5pbl9pbmZvLmluX2RzdF9pcDsKIAlzdHJ1Y3QgYXRtX21wb2FfcW9zICpxb3MgPSBhdG1fbXBvYV9zZWFyY2hfcW9zKGRzdF9pcCk7CiAJZWdfY2FjaGVfZW50cnkgKmVnX2VudHJ5ID0gY2xpZW50LT5lZ19vcHMtPmdldF9ieV9zcmNfaXAoZHN0X2lwLCBjbGllbnQpOwogCkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCiBzdGF0aWMgdm9pZCBNUE9BX3Jlc19yZXBseV9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCiB7Ci0JdWludDMyX3QgZHN0X2lwID0gbXNnLT5jb250ZW50LmluX2luZm8uaW5fZHN0X2lwOworCV9fYmUzMiBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CiAJaW5fY2FjaGVfZW50cnkgKmVudHJ5ID0gbXBjLT5pbl9vcHMtPmdldChkc3RfaXAsIG1wYyk7CiAKIAlkcHJpbnRrKCJtcG9hOiAoJXMpIE1QT0FfcmVzX3JlcGx5X3JjdmQ6IGlwICV1LiV1LiV1LiV1XG4iLCBtcGMtPmRldi0+bmFtZSwgTklQUVVBRChkc3RfaXApKTsKQEAgLTExNDgsOCArMTE0OCw4IEBACiAKIHN0YXRpYyB2b2lkIGluZ3Jlc3NfcHVyZ2VfcmN2ZChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQogewotCXVpbnQzMl90IGRzdF9pcCA9IG1zZy0+Y29udGVudC5pbl9pbmZvLmluX2RzdF9pcDsKLQl1aW50MzJfdCBtYXNrID0gbXNnLT5pcF9tYXNrOworCV9fYmUzMiBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CisJX19iZTMyIG1hc2sgPSBtc2ctPmlwX21hc2s7CiAJaW5fY2FjaGVfZW50cnkgKmVudHJ5ID0gbXBjLT5pbl9vcHMtPmdldF93aXRoX21hc2soZHN0X2lwLCBtcGMsIG1hc2spOwogCiAJaWYoZW50cnkgPT0gTlVMTCl7CkBAIC0xMTczLDcgKzExNzMsNyBAQAogCiBzdGF0aWMgdm9pZCBlZ3Jlc3NfcHVyZ2VfcmN2ZChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQogewotCXVpbnQzMl90IGNhY2hlX2lkID0gbXNnLT5jb250ZW50LmVnX2luZm8uY2FjaGVfaWQ7CisJX19iZTMyIGNhY2hlX2lkID0gbXNnLT5jb250ZW50LmVnX2luZm8uY2FjaGVfaWQ7CiAJZWdfY2FjaGVfZW50cnkgKmVudHJ5ID0gbXBjLT5lZ19vcHMtPmdldF9ieV9jYWNoZV9pZChjYWNoZV9pZCwgbXBjKTsKIAkKIAlpZiAoZW50cnkgPT0gTlVMTCkgewpAQCAtMTMyMiwxMyArMTMyMiwxMiBAQAogCWlmKGNsaWVudC0+bnVtYmVyX29mX21wc19tYWNzKQogCQlrZnJlZShjbGllbnQtPm1wc19tYWNzKTsKIAljbGllbnQtPm51bWJlcl9vZl9tcHNfbWFjcyA9IDA7Ci0JY2xpZW50LT5tcHNfbWFjcyA9IGttYWxsb2MoRVRIX0FMRU4sR0ZQX0tFUk5FTCk7CisJY2xpZW50LT5tcHNfbWFjcyA9IGttZW1kdXAobXNnLT5NUFNfY3RybCwgRVRIX0FMRU4sIEdGUF9LRVJORUwpOwogCWlmIChjbGllbnQtPm1wc19tYWNzID09IE5VTEwpIHsKIAkJcHJpbnRrKCJtcG9hOiBzZXRfbXBzX21hY19hZGRyX3JjdmQ6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm47CiAJfQogCWNsaWVudC0+bnVtYmVyX29mX21wc19tYWNzID0gMTsKLQltZW1jcHkoY2xpZW50LT5tcHNfbWFjcywgbXNnLT5NUFNfY3RybCwgRVRIX0FMRU4pOwogCQogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmggYi9uZXQvYXRtL21wYy5oCmluZGV4IDNjNzk4MWEuLjUxZjQ2MGQgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmgKKysrIGIvbmV0L2F0bS9tcGMuaApAQCAtMzYsMTQgKzM2LDE0IEBACiAKIHN0cnVjdCBhdG1fbXBvYV9xb3MgewogICAgICAgICBzdHJ1Y3QgYXRtX21wb2FfcW9zICpuZXh0OwotICAgICAgICB1aW50MzJfdCBpcGFkZHI7CisgICAgICAgIF9fYmUzMiBpcGFkZHI7CiAgICAgICAgIHN0cnVjdCBhdG1fcW9zIHFvczsKIH07CiAKIAogLyogTVBPQSBRb1Mgb3BlcmF0aW9ucyAqLwotc3RydWN0IGF0bV9tcG9hX3FvcyAqYXRtX21wb2FfYWRkX3Fvcyh1aW50MzJfdCBkc3RfaXAsIHN0cnVjdCBhdG1fcW9zICpxb3MpOwotc3RydWN0IGF0bV9tcG9hX3FvcyAqYXRtX21wb2Ffc2VhcmNoX3Fvcyh1aW50MzJfdCBkc3RfaXApOworc3RydWN0IGF0bV9tcG9hX3FvcyAqYXRtX21wb2FfYWRkX3FvcyhfX2JlMzIgZHN0X2lwLCBzdHJ1Y3QgYXRtX3FvcyAqcW9zKTsKK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX3NlYXJjaF9xb3MoX19iZTMyIGRzdF9pcCk7CiBpbnQgYXRtX21wb2FfZGVsZXRlX3FvcyhzdHJ1Y3QgYXRtX21wb2FfcW9zICpxb3MpOwogCiAvKiBEaXNwbGF5IFFvUyBlbnRyaWVzLiBUaGlzIGlzIGZvciB0aGUgcHJvY2ZzICovCmRpZmYgLS1naXQgYS9uZXQvYXRtL21wb2FfY2FjaGVzLmMgYi9uZXQvYXRtL21wb2FfY2FjaGVzLmMKaW5kZXggZmJmMTNjZC4uNjk3YTA4MSAxMDA2NDQKLS0tIGEvbmV0L2F0bS9tcG9hX2NhY2hlcy5jCisrKyBiL25ldC9hdG0vbXBvYV9jYWNoZXMuYwpAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBkZHByaW50ayhmb3JtYXQsYXJncy4uLikKICNlbmRpZgogCi1zdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2dldCh1aW50MzJfdCBkc3RfaXAsCitzdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2dldChfX2JlMzIgZHN0X2lwLAogCQkJCSAgICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCkKIHsKIAlpbl9jYWNoZV9lbnRyeSAqZW50cnk7CkBAIC00Miw5ICs0Miw5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbl9jYWNoZV9lbnRyeSAqaW5fY2FjaGVfZ2V0X3dpdGhfbWFzayh1aW50MzJfdCBkc3RfaXAsCitzdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2dldF93aXRoX21hc2soX19iZTMyIGRzdF9pcCwKIAkJCQkJICAgICAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgICAgIHVpbnQzMl90IG1hc2spCisJCQkJCSAgICAgIF9fYmUzMiBtYXNrKQogewogCWluX2NhY2hlX2VudHJ5ICplbnRyeTsKIApAQCAtODQsMTAgKzg0LDEwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbl9jYWNoZV9lbnRyeSAqaW5fY2FjaGVfYWRkX2VudHJ5KHVpbnQzMl90IGRzdF9pcCwKK3N0YXRpYyBpbl9jYWNoZV9lbnRyeSAqaW5fY2FjaGVfYWRkX2VudHJ5KF9fYmUzMiBkc3RfaXAsCiAJCQkJCSAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCiB7Ci0JaW5fY2FjaGVfZW50cnkqIGVudHJ5ID0ga21hbGxvYyhzaXplb2YoaW5fY2FjaGVfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpbl9jYWNoZV9lbnRyeSAqZW50cnkgPSBremFsbG9jKHNpemVvZihpbl9jYWNoZV9lbnRyeSksIEdGUF9LRVJORUwpOwogCiAJaWYgKGVudHJ5ID09IE5VTEwpIHsKIAkJcHJpbnRrKCJtcG9hOiBtcG9hX2NhY2hlcy5jOiBuZXdfaW5fY2FjaGVfZW50cnk6IG91dCBvZiBtZW1vcnlcbiIpOwpAQCAtOTUsNyArOTUsNiBAQAogCX0KIAogCWRwcmludGsoIm1wb2E6IG1wb2FfY2FjaGVzLmM6IGFkZGluZyBhbiBpbmdyZXNzIGVudHJ5LCBpcCA9ICV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGRzdF9pcCkpOwotCW1lbXNldChlbnRyeSwwLHNpemVvZihpbl9jYWNoZV9lbnRyeSkpOwogCiAJYXRvbWljX3NldCgmZW50cnktPnVzZSwgMSk7CiAJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2luX2NhY2hlX2VudHJ5OiBhYm91dCB0byBsb2NrXG4iKTsKQEAgLTMxOSw3ICszMTgsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGVnX2NhY2hlX2VudHJ5ICplZ19jYWNoZV9nZXRfYnlfY2FjaGVfaWQodWludDMyX3QgY2FjaGVfaWQsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQorc3RhdGljIGVnX2NhY2hlX2VudHJ5ICplZ19jYWNoZV9nZXRfYnlfY2FjaGVfaWQoX19iZTMyIGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKIAllZ19jYWNoZV9lbnRyeSAqZW50cnk7CiAKQEAgLTMzOSw3ICszMzgsNyBAQAogfQogCiAvKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dCBzaW5jZSBpdCBzYXZlcyBDUFUgZmxhZ3MgKi8KLXN0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X3RhZyh1aW50MzJfdCB0YWcsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQorc3RhdGljIGVnX2NhY2hlX2VudHJ5ICplZ19jYWNoZV9nZXRfYnlfdGFnKF9fYmUzMiB0YWcsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZWdfY2FjaGVfZW50cnkgKmVudHJ5OwpAQCAtMzgwLDcgKzM3OSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X3NyY19pcCh1aW50MzJfdCBpcGFkZHIsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQorc3RhdGljIGVnX2NhY2hlX2VudHJ5ICplZ19jYWNoZV9nZXRfYnlfc3JjX2lwKF9fYmUzMiBpcGFkZHIsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQogewogCWVnX2NhY2hlX2VudHJ5ICplbnRyeTsKIApAQCAtNDQ3LDcgKzQ0Niw3IEBACiAKIHN0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfYWRkX2VudHJ5KHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCiB7Ci0JZWdfY2FjaGVfZW50cnkgKmVudHJ5ID0ga21hbGxvYyhzaXplb2YoZWdfY2FjaGVfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwllZ19jYWNoZV9lbnRyeSAqZW50cnkgPSBremFsbG9jKHNpemVvZihlZ19jYWNoZV9lbnRyeSksIEdGUF9LRVJORUwpOwogCiAJaWYgKGVudHJ5ID09IE5VTEwpIHsKIAkJcHJpbnRrKCJtcG9hOiBtcG9hX2NhY2hlcy5jOiBuZXdfZWdfY2FjaGVfZW50cnk6IG91dCBvZiBtZW1vcnlcbiIpOwpAQCAtNDU1LDcgKzQ1NCw2IEBACiAJfQogCiAJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogYWRkaW5nIGFuIGVncmVzcyBlbnRyeSwgaXAgPSAldS4ldS4ldS4ldSwgdGhpcyBzaG91bGQgYmUgb3VyIElQXG4iLCBOSVBRVUFEKG1zZy0+Y29udGVudC5lZ19pbmZvLmVnX2RzdF9pcCkpOwotCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKGVnX2NhY2hlX2VudHJ5KSk7CiAKIAlhdG9taWNfc2V0KCZlbnRyeS0+dXNlLCAxKTsKIAlkcHJpbnRrKCJtcG9hOiBtcG9hX2NhY2hlcy5jOiBuZXdfZWdfY2FjaGVfZW50cnk6IGFib3V0IHRvIGxvY2tcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcG9hX2NhY2hlcy5oIGIvbmV0L2F0bS9tcG9hX2NhY2hlcy5oCmluZGV4IDZjOTg4NmEuLjg0ZGU5NzcgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBvYV9jYWNoZXMuaAorKysgYi9uZXQvYXRtL21wb2FfY2FjaGVzLmgKQEAgLTI5LDEyICsyOSwxMiBAQAogfSBpbl9jYWNoZV9lbnRyeTsKIAogc3RydWN0IGluX2NhY2hlX29wc3sKLSAgICAgICAgaW5fY2FjaGVfZW50cnkgKigqYWRkX2VudHJ5KSh1aW50MzJfdCBkc3RfaXAsCisgICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmFkZF9lbnRyeSkoX19iZTMyIGRzdF9pcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOwotICAgICAgICBpbl9jYWNoZV9lbnRyeSAqKCpnZXQpKHVpbnQzMl90IGRzdF9pcCwgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOwotICAgICAgICBpbl9jYWNoZV9lbnRyeSAqKCpnZXRfd2l0aF9tYXNrKSh1aW50MzJfdCBkc3RfaXAsIAorICAgICAgICBpbl9jYWNoZV9lbnRyeSAqKCpnZXQpKF9fYmUzMiBkc3RfaXAsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKKyAgICAgICAgaW5fY2FjaGVfZW50cnkgKigqZ2V0X3dpdGhfbWFzaykoX19iZTMyIGRzdF9pcCwKIAkJCQkJIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdWludDMyX3QgbWFzayk7CisJCQkJCSBfX2JlMzIgbWFzayk7CiAgICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmdldF9ieV92Y2MpKHN0cnVjdCBhdG1fdmNjICp2Y2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CiAgICAgICAgIHZvaWQgICAgICAgICAgICAoKnB1dCkoaW5fY2FjaGVfZW50cnkgKmVudHJ5KTsKQEAgLTU2LDE3ICs1NiwxNyBAQAogICAgICAgICBzdHJ1Y3QgYXRtX3ZjYyAgICAgICAqc2hvcnRjdXQ7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIHBhY2tldHNfcmN2ZDsKICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgZW50cnlfc3RhdGU7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIGxhdGVzdF9pcF9hZGRyOyAgICAvKiBUaGUgc3JjIElQIGFkZHJlc3Mgb2YgdGhlIGxhc3QgcGFja2V0ICovCisgICAgICAgIF9fYmUzMiAgICAgICAgICAgICBsYXRlc3RfaXBfYWRkcjsgICAgLyogVGhlIHNyYyBJUCBhZGRyZXNzIG9mIHRoZSBsYXN0IHBhY2tldCAqLwogICAgICAgICBzdHJ1Y3QgZWdfY3RybF9pbmZvICBjdHJsX2luZm87CiAgICAgICAgIGF0b21pY190ICAgICAgICAgICAgIHVzZTsKIH0gZWdfY2FjaGVfZW50cnk7CiAKIHN0cnVjdCBlZ19jYWNoZV9vcHN7CiAgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmFkZF9lbnRyeSkoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7Ci0gICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV9jYWNoZV9pZCkodWludDMyX3QgY2FjaGVfaWQsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKLSAgICAgICAgZWdfY2FjaGVfZW50cnkgKigqZ2V0X2J5X3RhZykodWludDMyX3QgY2FjaGVfaWQsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKKyAgICAgICAgZWdfY2FjaGVfZW50cnkgKigqZ2V0X2J5X2NhY2hlX2lkKShfX2JlMzIgY2FjaGVfaWQsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKKyAgICAgICAgZWdfY2FjaGVfZW50cnkgKigqZ2V0X2J5X3RhZykoX19iZTMyIGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CiAgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV92Y2MpKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKLSAgICAgICAgZWdfY2FjaGVfZW50cnkgKigqZ2V0X2J5X3NyY19pcCkodWludDMyX3QgaXBhZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV9zcmNfaXApKF9fYmUzMiBpcGFkZHIsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICgqcHV0KShlZ19jYWNoZV9lbnRyeSAqZW50cnkpOwogICAgICAgICB2b2lkICAgICAgICAgICAgKCpyZW1vdmVfZW50cnkpKGVnX2NhY2hlX2VudHJ5ICplbnRyeSwgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOwogICAgICAgICB2b2lkICAgICAgICAgICAgKCp1cGRhdGUpKGVnX2NhY2hlX2VudHJ5ICplbnRyeSwgdWludDE2X3QgaG9sZGluZ190aW1lKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBvYV9wcm9jLmMgYi9uZXQvYXRtL21wb2FfcHJvYy5jCmluZGV4IGQzN2I4OTEuLjM4NDRjODUgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBvYV9wcm9jLmMKKysrIGIvbmV0L2F0bS9tcG9hX3Byb2MuYwpAQCAtMjMxLDE0ICsyMzEsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgaXBbNF07IAogCWludCB0eF9wY3IsIHR4X3NkdSwgcnhfcGNyLCByeF9zZHU7Ci0gICAgICAgIHVpbnQzMl90IGlwYWRkcjsKKyAgICAgICAgX19iZTMyIGlwYWRkcjsKIAlzdHJ1Y3QgYXRtX3FvcyBxb3M7IAogICAgICAgICAKICAgICAgICAgbWVtc2V0KCZxb3MsIDAsIHNpemVvZihzdHJ1Y3QgYXRtX3FvcykpOwogCiAJaWYgKHNzY2FuZihidWZmLCAiZGVsICVoaHUuJWhodS4laGh1LiVoaHUiLAogCQkJaXAsIGlwKzEsIGlwKzIsIGlwKzMpID09IDQpIHsKLQkJaXBhZGRyID0gKih1aW50MzJfdCAqKWlwOworCQlpcGFkZHIgPSAqKF9fYmUzMiAqKWlwOwogCQlyZXR1cm4gYXRtX21wb2FfZGVsZXRlX3FvcyhhdG1fbXBvYV9zZWFyY2hfcW9zKGlwYWRkcikpOwogCX0KIApAQCAtMjUwLDcgKzI1MCw3IEBACiAJCWlwLCBpcCsxLCBpcCsyLCBpcCszLCAmdHhfcGNyLCAmdHhfc2R1LCAmcnhfcGNyLCAmcnhfc2R1KSAhPSA4KQogCQlyZXR1cm4gMDsKIAotICAgICAgICBpcGFkZHIgPSAqKHVpbnQzMl90ICopaXA7CisgICAgICAgIGlwYWRkciA9ICooX19iZTMyICopaXA7CiAJcW9zLnR4dHAudHJhZmZpY19jbGFzcyA9IEFUTV9DQlI7CiAJcW9zLnR4dHAubWF4X3BjciA9IHR4X3BjcjsKIAlxb3MudHh0cC5tYXhfc2R1ID0gdHhfc2R1OwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IDAwMDY5NWMuLjZjYWJmNmQgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTkwNiwxMyArOTA2LDEzIEBACiAJYXgyNS0+c291cmNlX2FkZHIgPSBvYXgyNS0+c291cmNlX2FkZHI7CiAKIAlpZiAob2F4MjUtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKLQkJaWYgKChheDI1LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWF4MjUtPmRpZ2lwZWF0ID0ga21lbWR1cChvYXgyNS0+ZGlnaXBlYXQsIHNpemVvZihheDI1X2RpZ2kpLAorCQkJCQkgR0ZQX0FUT01JQyk7CisJCWlmIChheDI1LT5kaWdpcGVhdCA9PSBOVUxMKSB7CiAJCQlza19mcmVlKHNrKTsKIAkJCWF4MjVfY2JfcHV0KGF4MjUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQotCQltZW1jcHkoYXgyNS0+ZGlnaXBlYXQsIG9heDI1LT5kaWdpcGVhdCwgc2l6ZW9mKGF4MjVfZGlnaSkpOwogCX0KIAogCXNrLT5za19wcm90aW5mbyA9IGF4MjU7CmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X291dC5jIGIvbmV0L2F4MjUvYXgyNV9vdXQuYwppbmRleCBkNzczNmU1Li5mODQwNDdkIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X291dC5jCisrKyBiL25ldC9heDI1L2F4MjVfb3V0LmMKQEAgLTcwLDExICs3MCwxMSBAQAogCWF4MjUtPmRlc3RfYWRkciAgID0gKmRlc3Q7CiAKIAlpZiAoZGlnaSAhPSBOVUxMKSB7Ci0JCWlmICgoYXgyNS0+ZGlnaXBlYXQgPSBrbWFsbG9jKHNpemVvZihheDI1X2RpZ2kpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlheDI1LT5kaWdpcGVhdCA9IGttZW1kdXAoZGlnaSwgc2l6ZW9mKCpkaWdpKSwgR0ZQX0FUT01JQyk7CisJCWlmIChheDI1LT5kaWdpcGVhdCA9PSBOVUxMKSB7CiAJCQlheDI1X2NiX3B1dChheDI1KTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JCW1lbWNweShheDI1LT5kaWdpcGVhdCwgZGlnaSwgc2l6ZW9mKGF4MjVfZGlnaSkpOwogCX0KIAogCXN3aXRjaCAoYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19QUk9UT0NPTF0pIHsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfcm91dGUuYyBiL25ldC9heDI1L2F4MjVfcm91dGUuYwppbmRleCA1MWI3YmRhLi44NTgwMzU2IDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X3JvdXRlLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCkBAIC00MzIsMTEgKzQzMiwxMiBAQAogCX0KIAogCWlmIChheDI1X3J0LT5kaWdpcGVhdCAhPSBOVUxMKSB7Ci0JCWlmICgoYXgyNS0+ZGlnaXBlYXQgPSBrbWFsbG9jKHNpemVvZihheDI1X2RpZ2kpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlheDI1LT5kaWdpcGVhdCA9IGttZW1kdXAoYXgyNV9ydC0+ZGlnaXBlYXQsIHNpemVvZihheDI1X2RpZ2kpLAorCQkJCQkgR0ZQX0FUT01JQyk7CisJCWlmIChheDI1LT5kaWdpcGVhdCA9PSBOVUxMKSB7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBwdXQ7CiAJCX0KLQkJbWVtY3B5KGF4MjUtPmRpZ2lwZWF0LCBheDI1X3J0LT5kaWdpcGVhdCwgc2l6ZW9mKGF4MjVfZGlnaSkpOwogCQlheDI1X2FkanVzdF9wYXRoKGFkZHIsIGF4MjUtPmRpZ2lwZWF0KTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9heDI1L3N5c2N0bF9uZXRfYXgyNS5jIGIvbmV0L2F4MjUvc3lzY3RsX25ldF9heDI1LmMKaW5kZXggODY3ZDQyNS4uZDIzYTI3ZiAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvc3lzY3RsX25ldF9heDI1LmMKKysrIGIvbmV0L2F4MjUvc3lzY3RsX25ldF9heDI1LmMKQEAgLTIwOSw3ICsyMDksOSBAQAogCX0KIAogCWZvciAobiA9IDAsIGF4MjVfZGV2ID0gYXgyNV9kZXZfbGlzdDsgYXgyNV9kZXYgIT0gTlVMTDsgYXgyNV9kZXYgPSBheDI1X2Rldi0+bmV4dCkgewotCQljdGxfdGFibGUgKmNoaWxkID0ga21hbGxvYyhzaXplb2YoYXgyNV9wYXJhbV90YWJsZSksIEdGUF9BVE9NSUMpOworCQlzdHJ1Y3QgY3RsX3RhYmxlICpjaGlsZCA9IGttZW1kdXAoYXgyNV9wYXJhbV90YWJsZSwKKwkJCQkJCSAgc2l6ZW9mKGF4MjVfcGFyYW1fdGFibGUpLAorCQkJCQkJICBHRlBfQVRPTUlDKTsKIAkJaWYgKCFjaGlsZCkgewogCQkJd2hpbGUgKG4tLSkKIAkJCQlrZnJlZShheDI1X3RhYmxlW25dLmNoaWxkKTsKQEAgLTIxNyw3ICsyMTksNiBAQAogCQkJc3Bpbl91bmxvY2tfYmgoJmF4MjVfZGV2X2xvY2spOwogCQkJcmV0dXJuOwogCQl9Ci0JCW1lbWNweShjaGlsZCwgYXgyNV9wYXJhbV90YWJsZSwgc2l6ZW9mKGF4MjVfcGFyYW1fdGFibGUpKTsKIAkJYXgyNV90YWJsZVtuXS5jaGlsZCA9IGF4MjVfZGV2LT5zeXN0YWJsZSA9IGNoaWxkOwogCQlheDI1X3RhYmxlW25dLmN0bF9uYW1lICAgICA9IG4gKyAxOwogCQlheDI1X3RhYmxlW25dLnByb2NuYW1lICAgICA9IGF4MjVfZGV2LT5kZXYtPm5hbWU7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaAppbmRleCBiYmIxZWQ3Li4wYjZjZDBlIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmgKQEAgLTk1LDE0ICs5NSwxNCBAQAogc3RydWN0IGJuZXBfc2V0X2ZpbHRlcl9yZXEgewogCV9fdTggIHR5cGU7CiAJX191OCAgY3RybDsKLQlfX3UxNiBsZW47CisJX19iZTE2IGxlbjsKIAlfX3U4ICBsaXN0WzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGJuZXBfY29udHJvbF9yc3AgewogCV9fdTggIHR5cGU7CiAJX191OCAgY3RybDsKLQlfX3UxNiByZXNwOworCV9fYmUxNiByZXNwOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGJuZXBfZXh0X2hkciB7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwppbmRleCA0ZDM0MjRjLi43YmE2NDcwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKQEAgLTExNywxOCArMTE3LDE4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYm5lcF9zZXRfZGVmYXVsdF9wcm90b19maWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKIHsKIAkvKiAoSVB2NCwgQVJQKSAgKi8KLQlzLT5wcm90b19maWx0ZXJbMF0uc3RhcnQgPSBodG9ucygweDA4MDApOwotCXMtPnByb3RvX2ZpbHRlclswXS5lbmQgICA9IGh0b25zKDB4MDgwNik7CisJcy0+cHJvdG9fZmlsdGVyWzBdLnN0YXJ0ID0gRVRIX1BfSVA7CisJcy0+cHJvdG9fZmlsdGVyWzBdLmVuZCAgID0gRVRIX1BfQVJQOwogCS8qIChSQVJQLCBBcHBsZVRhbGspICovCi0Jcy0+cHJvdG9fZmlsdGVyWzFdLnN0YXJ0ID0gaHRvbnMoMHg4MDM1KTsKLQlzLT5wcm90b19maWx0ZXJbMV0uZW5kICAgPSBodG9ucygweDgwRjMpOworCXMtPnByb3RvX2ZpbHRlclsxXS5zdGFydCA9IEVUSF9QX1JBUlA7CisJcy0+cHJvdG9fZmlsdGVyWzFdLmVuZCAgID0gRVRIX1BfQUFSUDsKIAkvKiAoSVBYLCBJUHY2KSAqLwotCXMtPnByb3RvX2ZpbHRlclsyXS5zdGFydCA9IGh0b25zKDB4ODEzNyk7Ci0Jcy0+cHJvdG9fZmlsdGVyWzJdLmVuZCAgID0gaHRvbnMoMHg4NkREKTsKKwlzLT5wcm90b19maWx0ZXJbMl0uc3RhcnQgPSBFVEhfUF9JUFg7CisJcy0+cHJvdG9fZmlsdGVyWzJdLmVuZCAgID0gRVRIX1BfSVBWNjsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGJuZXBfY3RybF9zZXRfbmV0ZmlsdGVyKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMsIHUxNiAqZGF0YSwgaW50IGxlbikKK3N0YXRpYyBpbnQgYm5lcF9jdHJsX3NldF9uZXRmaWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgX19iZTE2ICpkYXRhLCBpbnQgbGVuKQogewogCWludCBuOwogCkBAIC0xNTAsOCArMTUwLDggQEAKIAkJaW50IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJZltpXS5zdGFydCA9IGdldF91bmFsaWduZWQoZGF0YSsrKTsKLQkJCWZbaV0uZW5kICAgPSBnZXRfdW5hbGlnbmVkKGRhdGErKyk7CisJCQlmW2ldLnN0YXJ0ID0gbnRvaHMoZ2V0X3VuYWxpZ25lZChkYXRhKyspKTsKKwkJCWZbaV0uZW5kICAgPSBudG9ocyhnZXRfdW5hbGlnbmVkKGRhdGErKykpOwogCiAJCQlCVF9EQkcoInByb3RvIGZpbHRlciBzdGFydCAlZCBlbmQgJWQiLAogCQkJCWZbaV0uc3RhcnQsIGZbaV0uZW5kKTsKQEAgLTE4MCw3ICsxODAsNyBAQAogCWlmIChsZW4gPCAyKQogCQlyZXR1cm4gLUVJTFNFUTsKIAotCW4gPSBudG9ocyhnZXRfdW5hbGlnbmVkKCh1MTYgKikgZGF0YSkpOyAKKwluID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopIGRhdGEpKTsKIAlkYXRhICs9IDI7IGxlbiAtPSAyOwogCiAJaWYgKGxlbiA8IG4pCkBAIC0zMzIsNyArMzMyLDcgQEAKIAlpZiAoIXNrYl9wdWxsKHNrYiwgX19ibmVwX3J4X2hsZW5bdHlwZSAmIEJORVBfVFlQRV9NQVNLXSkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKLQlzLT5laC5oX3Byb3RvID0gZ2V0X3VuYWxpZ25lZCgodTE2ICopIChza2ItPmRhdGEgLSAyKSk7CisJcy0+ZWguaF9wcm90byA9IGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSAoc2tiLT5kYXRhIC0gMikpOwogCiAJaWYgKHR5cGUgJiBCTkVQX0VYVF9IRUFERVIpIHsKIAkJaWYgKGJuZXBfcnhfZXh0ZW5zaW9uKHMsIHNrYikgPCAwKQpAQCAtMzQzLDcgKzM0Myw3IEBACiAJaWYgKG50b2hzKHMtPmVoLmhfcHJvdG8pID09IDB4ODEwMCkgewogCQlpZiAoIXNrYl9wdWxsKHNrYiwgNCkpCiAJCQlnb3RvIGJhZGZyYW1lOwotCQlzLT5laC5oX3Byb3RvID0gZ2V0X3VuYWxpZ25lZCgodTE2ICopIChza2ItPmRhdGEgLSAyKSk7CisJCXMtPmVoLmhfcHJvdG8gPSBnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikgKHNrYi0+ZGF0YSAtIDIpKTsKIAl9CiAJCiAJLyogV2UgaGF2ZSB0byBhbGxvYyBuZXcgc2tiIGFuZCBjb3B5IGRhdGEgaGVyZSA6KC4gQmVjYXVzZSBvcmlnaW5hbCBza2IKQEAgLTM2NSw3ICszNjUsNyBAQAogCWNhc2UgQk5FUF9DT01QUkVTU0VEX1NSQ19PTkxZOgogCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOKSwgcy0+ZWguaF9kZXN0LCBFVEhfQUxFTik7CiAJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBza2ItPm1hYy5yYXcsIEVUSF9BTEVOKTsKLQkJcHV0X3VuYWxpZ25lZChzLT5laC5oX3Byb3RvLCAodTE2ICopIF9fc2tiX3B1dChuc2tiLCAyKSk7CisJCXB1dF91bmFsaWduZWQocy0+ZWguaF9wcm90bywgKF9fYmUxNiAqKSBfX3NrYl9wdXQobnNrYiwgMikpOwogCQlicmVhazsKIAogCWNhc2UgQk5FUF9DT01QUkVTU0VEX0RTVF9PTkxZOgpAQCAtMzc1LDcgKzM3NSw3IEBACiAKIAljYXNlIEJORVBfR0VORVJBTDoKIAkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiAqIDIpLCBza2ItPm1hYy5yYXcsIEVUSF9BTEVOICogMik7Ci0JCXB1dF91bmFsaWduZWQocy0+ZWguaF9wcm90bywgKHUxNiAqKSBfX3NrYl9wdXQobnNrYiwgMikpOworCQlwdXRfdW5hbGlnbmVkKHMtPmVoLmhfcHJvdG8sIChfX2JlMTYgKikgX19za2JfcHV0KG5za2IsIDIpKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKaW5kZXggN2Y3YjI3ZC4uNjdhMDAyYSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYwpAQCAtMTU4LDE0ICsxNTgsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdTE2IGJuZXBfbmV0X2V0aF9wcm90byhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBldGhoZHIgKmVoID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXUxNiBwcm90byA9IG50b2hzKGVoLT5oX3Byb3RvKTsKIAkKLQlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID49IDE1MzYpCi0JCXJldHVybiBlaC0+aF9wcm90bzsKKwlpZiAocHJvdG8gPj0gMTUzNikKKwkJcmV0dXJuIHByb3RvOwogCQkKLQlpZiAoZ2V0X3VuYWxpZ25lZCgodTE2ICopIHNrYi0+ZGF0YSkgPT0gMHhGRkZGKQotCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOworCWlmIChnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikgc2tiLT5kYXRhKSA9PSBodG9ucygweEZGRkYpKQorCQlyZXR1cm4gRVRIX1BfODAyXzM7CiAJCQotCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7CisJcmV0dXJuIEVUSF9QXzgwMl8yOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBibmVwX25ldF9wcm90b19maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXAuYyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwppbmRleCBiYmY3OGU2Li4yOWE4ZmE0IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCkBAIC03NzAsNyArNzcwLDcgQEAKIAlsb25nIHRpbWVvOwogCWludCBlcnIgPSAwOwogCi0JbG9ja19zb2NrKHNrKTsKKwlsb2NrX3NvY2tfbmVzdGVkKHNrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikgewogCQllcnIgPSAtRUJBREZEOwpAQCAtNzkyLDcgKzc5Miw3IEBACiAKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKLQkJbG9ja19zb2NrKHNrKTsKKwkJbG9ja19zb2NrX25lc3RlZChzaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCiAJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfTElTVEVOKSB7CiAJCQllcnIgPSAtRUJBREZEOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCmluZGV4IGRkYzRlOWQuLjI3OGM4NjcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTg1NCw3ICs4NTQsNyBAQAogCXJwbi0+Zmxvd19jdHJsICAgICA9IGZsb3dfY3RybF9zZXR0aW5nczsKIAlycG4tPnhvbl9jaGFyICAgICAgPSB4b25fY2hhcjsKIAlycG4tPnhvZmZfY2hhciAgICAgPSB4b2ZmX2NoYXI7Ci0JcnBuLT5wYXJhbV9tYXNrICAgID0gcGFyYW1fbWFzazsKKwlycG4tPnBhcmFtX21hc2sgICAgPSBjcHVfdG9fbGUxNihwYXJhbV9tYXNrKTsKIAogCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKIApAQCAtMTAxOCw3ICsxMDE4LDcgQEAKIAogCWlmIChsZW4gPiAxMjcpIHsKIAkJaGRyID0gKHZvaWQgKikgc2tiX3B1c2goc2tiLCA0KTsKLQkJcHV0X3VuYWxpZ25lZChodG9icyhfX2xlbjE2KGxlbikpLCAodTE2ICopICZoZHItPmxlbik7CisJCXB1dF91bmFsaWduZWQoaHRvYnMoX19sZW4xNihsZW4pKSwgKF9fbGUxNiAqKSAmaGRyLT5sZW4pOwogCX0gZWxzZSB7CiAJCWhkciA9ICh2b2lkICopIHNrYl9wdXNoKHNrYiwgMyk7CiAJCWhkci0+bGVuID0gX19sZW44KGxlbik7CkBAIC0xMzQzLDcgKzEzNDMsNyBAQAogCS8qIENoZWNrIGZvciBzYW5lIHZhbHVlcywgaWdub3JlL2FjY2VwdCBiaXRfcmF0ZSwgOCBiaXRzLCAxIHN0b3AgYml0LAogCSAqIG5vIHBhcml0eSwgbm8gZmxvdyBjb250cm9sIGxpbmVzLCBub3JtYWwgWE9OL1hPRkYgY2hhcnMgKi8KIAotCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0JJVFJBVEUpIHsKKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgY3B1X3RvX2xlMTYoUkZDT01NX1JQTl9QTV9CSVRSQVRFKSkgewogCQliaXRfcmF0ZSA9IHJwbi0+Yml0X3JhdGU7CiAJCWlmIChiaXRfcmF0ZSAhPSBSRkNPTU1fUlBOX0JSXzExNTIwMCkgewogCQkJQlRfREJHKCJSUE4gYml0IHJhdGUgbWlzbWF0Y2ggMHgleCIsIGJpdF9yYXRlKTsKQEAgLTEzNTIsNyArMTM1Miw3IEBACiAJCX0KIAl9CiAKLQlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9EQVRBKSB7CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIGNwdV90b19sZTE2KFJGQ09NTV9SUE5fUE1fREFUQSkpIHsKIAkJZGF0YV9iaXRzID0gX19nZXRfcnBuX2RhdGFfYml0cyhycG4tPmxpbmVfc2V0dGluZ3MpOwogCQlpZiAoZGF0YV9iaXRzICE9IFJGQ09NTV9SUE5fREFUQV84KSB7CiAJCQlCVF9EQkcoIlJQTiBkYXRhIGJpdHMgbWlzbWF0Y2ggMHgleCIsIGRhdGFfYml0cyk7CkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCQl9CiAJfQogCi0JaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fU1RPUCkgeworCWlmIChycG4tPnBhcmFtX21hc2sgJiBjcHVfdG9fbGUxNihSRkNPTU1fUlBOX1BNX1NUT1ApKSB7CiAJCXN0b3BfYml0cyA9IF9fZ2V0X3Jwbl9zdG9wX2JpdHMocnBuLT5saW5lX3NldHRpbmdzKTsKIAkJaWYgKHN0b3BfYml0cyAhPSBSRkNPTU1fUlBOX1NUT1BfMSkgewogCQkJQlRfREJHKCJSUE4gc3RvcCBiaXRzIG1pc21hdGNoIDB4JXgiLCBzdG9wX2JpdHMpOwpAQCAtMTM3MCw3ICsxMzcwLDcgQEAKIAkJfQogCX0KIAotCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX1BBUklUWSkgeworCWlmIChycG4tPnBhcmFtX21hc2sgJiBjcHVfdG9fbGUxNihSRkNPTU1fUlBOX1BNX1BBUklUWSkpIHsKIAkJcGFyaXR5ID0gX19nZXRfcnBuX3Bhcml0eShycG4tPmxpbmVfc2V0dGluZ3MpOwogCQlpZiAocGFyaXR5ICE9IFJGQ09NTV9SUE5fUEFSSVRZX05PTkUpIHsKIAkJCUJUX0RCRygiUlBOIHBhcml0eSBtaXNtYXRjaCAweCV4IiwgcGFyaXR5KTsKQEAgLTEzNzksNyArMTM3OSw3IEBACiAJCX0KIAl9CiAKLQlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9GTE9XKSB7CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIGNwdV90b19sZTE2KFJGQ09NTV9SUE5fUE1fRkxPVykpIHsKIAkJZmxvd19jdHJsID0gcnBuLT5mbG93X2N0cmw7CiAJCWlmIChmbG93X2N0cmwgIT0gUkZDT01NX1JQTl9GTE9XX05PTkUpIHsKIAkJCUJUX0RCRygiUlBOIGZsb3cgY3RybCBtaXNtYXRjaCAweCV4IiwgZmxvd19jdHJsKTsKQEAgLTEzODgsNyArMTM4OCw3IEBACiAJCX0KIAl9CiAKLQlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9YT04pIHsKKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgY3B1X3RvX2xlMTYoUkZDT01NX1JQTl9QTV9YT04pKSB7CiAJCXhvbl9jaGFyID0gcnBuLT54b25fY2hhcjsKIAkJaWYgKHhvbl9jaGFyICE9IFJGQ09NTV9SUE5fWE9OX0NIQVIpIHsKIAkJCUJUX0RCRygiUlBOIFhPTiBjaGFyIG1pc21hdGNoIDB4JXgiLCB4b25fY2hhcik7CkBAIC0xMzk3LDcgKzEzOTcsNyBAQAogCQl9CiAJfQogCi0JaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fWE9GRikgeworCWlmIChycG4tPnBhcmFtX21hc2sgJiBjcHVfdG9fbGUxNihSRkNPTU1fUlBOX1BNX1hPRkYpKSB7CiAJCXhvZmZfY2hhciA9IHJwbi0+eG9mZl9jaGFyOwogCQlpZiAoeG9mZl9jaGFyICE9IFJGQ09NTV9SUE5fWE9GRl9DSEFSKSB7CiAJCQlCVF9EQkcoIlJQTiBYT0ZGIGNoYXIgbWlzbWF0Y2ggMHgleCIsIHhvZmZfY2hhcik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lvY3RsLmMgYi9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKaW5kZXggNGU0MTE5YS4uNGM2MWE3ZSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pb2N0bC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW9jdGwuYwpAQCAtNTgsMTIgKzU4LDEzIEBACiB7CiAJaW50IG51bTsKIAl2b2lkICpidWY7Ci0Jc2l6ZV90IHNpemUgPSBtYXhudW0gKiBzaXplb2Yoc3RydWN0IF9fZmRiX2VudHJ5KTsKKwlzaXplX3Qgc2l6ZTsKIAotCWlmIChzaXplID4gUEFHRV9TSVpFKSB7Ci0JCXNpemUgPSBQQUdFX1NJWkU7CisJLyogQ2xhbXAgc2l6ZSB0byBQQUdFX1NJWkUsIHRlc3QgbWF4bnVtIHRvIGF2b2lkIG92ZXJmbG93ICovCisJaWYgKG1heG51bSA+IFBBR0VfU0laRS9zaXplb2Yoc3RydWN0IF9fZmRiX2VudHJ5KSkKIAkJbWF4bnVtID0gUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpOwotCX0KKworCXNpemUgPSBtYXhudW0gKiBzaXplb2Yoc3RydWN0IF9fZmRiX2VudHJ5KTsKIAogCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX1VTRVIpOwogCWlmICghYnVmKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKaW5kZXggYWMxODFiZS4uYWM0N2JhMiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCkBAIC00MCw3ICs0MCw2IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CkBAIC0zODEsNyArMzgwLDcgQEAKIAkJY2FzZSBJUFY2X1RMVl9KVU1CTzoKIAkJCWlmIChza2ItPm5oLnJhd1tvZmYgKyAxXSAhPSA0IHx8IChvZmYgJiAzKSAhPSAyKQogCQkJCWdvdG8gYmFkOwotCQkJcGt0X2xlbiA9IG50b2hsKCoodTMyICopIChza2ItPm5oLnJhdyArIG9mZiArIDIpKTsKKwkJCXBrdF9sZW4gPSBudG9obCgqKF9fYmUzMiAqKSAoc2tiLT5uaC5yYXcgKyBvZmYgKyAyKSk7CiAJCQlpZiAocGt0X2xlbiA8PSBJUFY2X01BWFBMRU4gfHwKIAkJCSAgICBza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikKIAkJCQlnb3RvIGJhZDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKaW5kZXggOGY2NjExOS4uYTkxMzk2OCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKQEAgLTE1LDYgKzE1LDE4IEBACiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGJyX25sbXNnX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKElGTkFNU0laKSAvKiBJRkxBX0lGTkFNRSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKE1BWF9BRERSX0xFTikgLyogSUZMQV9BRERSRVNTICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZMQV9NQVNURVIgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX01UVSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfTElOSyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDEpIC8qIElGTEFfT1BFUlNUQVRFICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMSk7IC8qIElGTEFfUFJPVElORk8gKi8KK30KKwogLyoKICAqIENyZWF0ZSBvbmUgbmV0bGluayBtZXNzYWdlIGZvciBvbmUgaW50ZXJmYWNlCiAgKiBDb250YWlucyBwb3J0IGFuZCBtYXN0ZXIgaW5mbyBhcyB3ZWxsIGFzIGNhcnJpZXIgYW5kIGJyaWRnZSBzdGF0ZS4KQEAgLTI0LDUxICszNiw0MyBAQAogewogCWNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHBvcnQtPmJyOwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT5kZXY7Ci0Jc3RydWN0IGlmaW5mb21zZyAqcjsKKwlzdHJ1Y3QgaWZpbmZvbXNnICpoZHI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKLQl1MzIgbXR1ID0gZGV2LT5tdHU7CiAJdTggb3BlcnN0YXRlID0gbmV0aWZfcnVubmluZyhkZXYpID8gZGV2LT5vcGVyc3RhdGUgOiBJRl9PUEVSX0RPV047Ci0JdTggcG9ydHN0YXRlID0gcG9ydC0+c3RhdGU7CiAKIAlwcl9kZWJ1ZygiYnJfZmlsbF9pbmZvIGV2ZW50ICVkIHBvcnQgJXMgbWFzdGVyICVzXG4iLAogCQkgZXZlbnQsIGRldi0+bmFtZSwgYnItPmRldi0+bmFtZSk7CiAKLQlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKLQlyID0gTkxNU0dfREFUQShubGgpOwotCXItPmlmaV9mYW1pbHkgPSBBRl9CUklER0U7Ci0Jci0+X19pZmlfcGFkID0gMDsKLQlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKLQlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7Ci0Jci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOwotCXItPmlmaV9jaGFuZ2UgPSAwOworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpoZHIpLCBmbGFncyk7CisJaWYgKG5saCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQlSVEFfUFVUKHNrYiwgSUZMQV9JRk5BTUUsIHN0cmxlbihkZXYtPm5hbWUpKzEsIGRldi0+bmFtZSk7CisJaGRyID0gbmxtc2dfZGF0YShubGgpOworCWhkci0+aWZpX2ZhbWlseSA9IEFGX0JSSURHRTsKKwloZHItPl9faWZpX3BhZCA9IDA7CisJaGRyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKKwloZHItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKKwloZHItPmlmaV9mbGFncyA9IGRldl9nZXRfZmxhZ3MoZGV2KTsKKwloZHItPmlmaV9jaGFuZ2UgPSAwOwogCi0JUlRBX1BVVChza2IsIElGTEFfTUFTVEVSLCBzaXplb2YoaW50KSwgJmJyLT5kZXYtPmlmaW5kZXgpOworCU5MQV9QVVRfU1RSSU5HKHNrYiwgSUZMQV9JRk5BTUUsIGRldi0+bmFtZSk7CisJTkxBX1BVVF9VMzIoc2tiLCBJRkxBX01BU1RFUiwgYnItPmRldi0+aWZpbmRleCk7CisJTkxBX1BVVF9VMzIoc2tiLCBJRkxBX01UVSwgZGV2LT5tdHUpOworCU5MQV9QVVRfVTgoc2tiLCBJRkxBX09QRVJTVEFURSwgb3BlcnN0YXRlKTsKIAogCWlmIChkZXYtPmFkZHJfbGVuKQotCQlSVEFfUFVUKHNrYiwgSUZMQV9BRERSRVNTLCBkZXYtPmFkZHJfbGVuLCBkZXYtPmRldl9hZGRyKTsKKwkJTkxBX1BVVChza2IsIElGTEFfQUREUkVTUywgZGV2LT5hZGRyX2xlbiwgZGV2LT5kZXZfYWRkcik7CiAKLQlSVEFfUFVUKHNrYiwgSUZMQV9NVFUsIHNpemVvZihtdHUpLCAmbXR1KTsKIAlpZiAoZGV2LT5pZmluZGV4ICE9IGRldi0+aWZsaW5rKQotCQlSVEFfUFVUKHNrYiwgSUZMQV9MSU5LLCBzaXplb2YoaW50KSwgJmRldi0+aWZsaW5rKTsKLQotCi0JUlRBX1BVVChza2IsIElGTEFfT1BFUlNUQVRFLCBzaXplb2Yob3BlcnN0YXRlKSwgJm9wZXJzdGF0ZSk7CisJCU5MQV9QVVRfVTMyKHNrYiwgSUZMQV9MSU5LLCBkZXYtPmlmbGluayk7CiAKIAlpZiAoZXZlbnQgPT0gUlRNX05FV0xJTkspCi0JCVJUQV9QVVQoc2tiLCBJRkxBX1BST1RJTkZPLCBzaXplb2YocG9ydHN0YXRlKSwgJnBvcnRzdGF0ZSk7CisJCU5MQV9QVVRfVTgoc2tiLCBJRkxBX1BST1RJTkZPLCBwb3J0LT5zdGF0ZSk7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKLQlyZXR1cm4gc2tiLT5sZW47Ci0KLW5sbXNnX2ZhaWx1cmU6Ci1ydGF0dHJfZmFpbHVyZToKLQotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7Ci0JcmV0dXJuIC1FSU5WQUw7CitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CiB9CiAKIC8qCkBAIC03NywxOSArODEsMTYgQEAKIHZvaWQgYnJfaWZpbmZvX25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcGF5bG9hZCA9IHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSArIDEyODsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKIAlwcl9kZWJ1ZygiYnJpZGdlIG5vdGlmeSBldmVudD0lZFxuIiwgZXZlbnQpOwotCXNrYiA9IG5sbXNnX25ldyhubG1zZ190b3RhbF9zaXplKHBheWxvYWQpLCBHRlBfQVRPTUlDKTsKKwlza2IgPSBubG1zZ19uZXcoYnJfbmxtc2dfc2l6ZSgpLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gYnJfZmlsbF9pZmluZm8oc2tiLCBwb3J0LCAwLCAwLCBldmVudCwgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGJyX25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9MSU5LLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKQEAgLTEwNCwyNSArMTA1LDE4IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgaWR4OwotCWludCBzX2lkeCA9IGNiLT5hcmdzWzBdOwotCWludCBlcnIgPSAwOwogCiAJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAlmb3IgKGRldiA9IGRldl9iYXNlLCBpZHggPSAwOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgewotCQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gZGV2LT5icl9wb3J0OwotCiAJCS8qIG5vdCBhIGJyaWRnZSBwb3J0ICovCi0JCWlmICghcCkKLQkJCWNvbnRpbnVlOworCQlpZiAoZGV2LT5icl9wb3J0ID09IE5VTEwgfHwgaWR4IDwgY2ItPmFyZ3NbMF0pCisJCQlnb3RvIHNraXA7CiAKLQkJaWYgKGlkeCA8IHNfaWR4KQotCQkJZ290byBjb250OwotCi0JCWVyciA9IGJyX2ZpbGxfaWZpbmZvKHNrYiwgcCwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCi0JCQkJICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdMSU5LLCBOTE1fRl9NVUxUSSk7Ci0JCWlmIChlcnIgPD0gMCkKKwkJaWYgKGJyX2ZpbGxfaWZpbmZvKHNrYiwgZGV2LT5icl9wb3J0LCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdMSU5LLAorCQkJCSAgIE5MTV9GX01VTFRJKSA8IDApCiAJCQlicmVhazsKLWNvbnQ6Citza2lwOgogCQkrK2lkeDsKIAl9CiAJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOwpAQCAtMTM4LDI2ICsxMzIsMjcgQEAKICAqLwogc3RhdGljIGludCBicl9ydG1fc2V0bGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgcnRhdHRyICAqKnJ0YSA9IGFyZzsKLQlzdHJ1Y3QgaWZpbmZvbXNnICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGlmaW5mb21zZyAqaWZtOworCXN0cnVjdCBubGF0dHIgKnByb3RpbmZvOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKIAl1OCBuZXdfc3RhdGU7CiAKKwlpZiAobmxtc2dfbGVuKG5saCkgPCBzaXplb2YoKmlmbSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWlmIChpZm0tPmlmaV9mYW1pbHkgIT0gQUZfQlJJREdFKQogCQlyZXR1cm4gLUVQRk5PU1VQUE9SVDsKIAotCS8qIE11c3QgcGFzcyB2YWxpZCBzdGF0ZSBhcyBQUk9USU5GTyAqLwotCWlmIChydGFbSUZMQV9QUk9USU5GTy0xXSkgewotCQl1OCAqcHN0YXRlID0gUlRBX0RBVEEocnRhW0lGTEFfUFJPVElORk8tMV0pOwotCQluZXdfc3RhdGUgPSAqcHN0YXRlOwotCX0gZWxzZQorCXByb3RpbmZvID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKCppZm0pLCBJRkxBX1BST1RJTkZPKTsKKwlpZiAoIXByb3RpbmZvIHx8IG5sYV9sZW4ocHJvdGluZm8pIDwgc2l6ZW9mKHU4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwluZXdfc3RhdGUgPSBubGFfZ2V0X3U4KHByb3RpbmZvKTsKIAlpZiAobmV3X3N0YXRlID4gQlJfU1RBVEVfQkxPQ0tJTkcpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogRmluZCBicmlkZ2UgcG9ydCAqLwogCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChpZm0tPmlmaV9pbmRleCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTcwLDEwICsxNjUsOCBAQAogCWlmIChwLT5ici0+c3RwX2VuYWJsZWQpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQotCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpICYmIG5ld19zdGF0ZSAhPSBCUl9TVEFURV9ESVNBQkxFRCkKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fAorCSAgICAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSAmJiBuZXdfc3RhdGUgIT0gQlJfU1RBVEVfRElTQUJMRUQpKQogCQlyZXR1cm4gLUVORVRET1dOOwogCiAJcC0+c3RhdGUgPSBuZXdfc3RhdGU7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfODAyXzMuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF84MDJfMy5jCmluZGV4IGQ0MmY2M2YuLjlhYmJjMDkgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF84MDJfMy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF84MDJfMy5jCkBAIC0xNyw3ICsxNyw3IEBACiB7CiAJc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKWRhdGE7CiAJc3RydWN0IGVidF84MDJfM19oZHIgKmhkciA9IGVidF84MDJfM19oZHIoc2tiKTsKLQl1aW50MTZfdCB0eXBlID0gaGRyLT5sbGMudWkuY3RybCAmIElTX1VJID8gaGRyLT5sbGMudWkudHlwZSA6IGhkci0+bGxjLm5pLnR5cGU7CisJX19iZTE2IHR5cGUgPSBoZHItPmxsYy51aS5jdHJsICYgSVNfVUkgPyBoZHItPmxsYy51aS50eXBlIDogaGRyLT5sbGMubmkudHlwZTsKIAogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUXzgwMl8zX1NBUCkgewogCQlpZiAoRldJTlYoaW5mby0+c2FwICE9IGhkci0+bGxjLnVpLnNzYXAsIEVCVF84MDJfM19TQVApKSAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKaW5kZXggYTYxNDQ4NS4uY2U5N2M0MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBlYnRfbWFjX3dvcm1oYXNoX2NvbnRhaW5zKGNvbnN0IHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoICp3aCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm1hYywgdWludDMyX3QgaXApCisJCQkJICAgICBjb25zdCBjaGFyICptYWMsIF9fYmUzMiBpcCkKIHsKIAkvKiBZb3UgbWF5IGJlIHB1enpsZWQgYXMgdG8gaG93IHRoaXMgY29kZSB3b3Jrcy4KIAkgKiBTb21lIHRyaWNrcyB3ZXJlIHVzZWQsIHJlZmVyIHRvIApAQCAtNzAsNyArNzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9pcF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgKmFkZHIpCitzdGF0aWMgaW50IGdldF9pcF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTMyICphZGRyKQogewogCWlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7CkBAIC04MSwxNiArODEsMTYgQEAKIAkJKmFkZHIgPSBpaC0+ZGFkZHI7CiAJfSBlbHNlIGlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfQVJQKSkgewogCQlzdHJ1Y3QgYXJwaGRyIF9hcnBoLCAqYWg7Ci0JCXVpbnQzMl90IGJ1ZiwgKmJwOworCQlfX2JlMzIgYnVmLCAqYnA7CiAKIAkJYWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2FycGgpLCAmX2FycGgpOwogCQlpZiAoYWggPT0gTlVMTCB8fAotCQkgICAgYWgtPmFyX3BsbiAhPSBzaXplb2YodWludDMyX3QpIHx8CisJCSAgICBhaC0+YXJfcGxuICE9IHNpemVvZihfX2JlMzIpIHx8CiAJCSAgICBhaC0+YXJfaGxuICE9IEVUSF9BTEVOKQogCQkJcmV0dXJuIC0xOwogCQlicCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCi0JCQkJCTIgKiBFVEhfQUxFTiArIHNpemVvZih1aW50MzJfdCksCi0JCQkJCXNpemVvZih1aW50MzJfdCksICZidWYpOworCQkJCQkyICogRVRIX0FMRU4gKyBzaXplb2YoX19iZTMyKSwKKwkJCQkJc2l6ZW9mKF9fYmUzMiksICZidWYpOwogCQlpZiAoYnAgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAkJKmFkZHIgPSAqYnA7CkBAIC05OCw3ICs5OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2lwX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1aW50MzJfdCAqYWRkcikKK3N0YXRpYyBpbnQgZ2V0X2lwX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMzIgKmFkZHIpCiB7CiAJaWYgKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKQEAgLTEwOSwxNSArMTA5LDE1IEBACiAJCSphZGRyID0gaWgtPnNhZGRyOwogCX0gZWxzZSBpZiAoZXRoX2hkcihza2IpLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0FSUCkpIHsKIAkJc3RydWN0IGFycGhkciBfYXJwaCwgKmFoOwotCQl1aW50MzJfdCBidWYsICpicDsKKwkJX19iZTMyIGJ1ZiwgKmJwOwogCiAJCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9hcnBoKSwgJl9hcnBoKTsKIAkJaWYgKGFoID09IE5VTEwgfHwKLQkJICAgIGFoLT5hcl9wbG4gIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAorCQkgICAgYWgtPmFyX3BsbiAhPSBzaXplb2YoX19iZTMyKSB8fAogCQkgICAgYWgtPmFyX2hsbiAhPSBFVEhfQUxFTikKIAkJCXJldHVybiAtMTsKIAkJYnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKwotCQkJCQlFVEhfQUxFTiwgc2l6ZW9mKHVpbnQzMl90KSwgJmJ1Zik7CisJCQkJCUVUSF9BTEVOLCBzaXplb2YoX19iZTMyKSwgJmJ1Zik7CiAJCWlmIChicCA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCQkqYWRkciA9ICpicDsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCXN0cnVjdCBlYnRfYW1vbmdfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKikgZGF0YTsKIAljb25zdCBjaGFyICpkbWFjLCAqc21hYzsKIAljb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2hfZHN0LCAqd2hfc3JjOwotCXVpbnQzMl90IGRpcCA9IDAsIHNpcCA9IDA7CisJX19iZTMyIGRpcCA9IDAsIHNpcCA9IDA7CiAKIAl3aF9kc3QgPSBlYnRfYW1vbmdfd2hfZHN0KGluZm8pOwogCXdoX3NyYyA9IGVidF9hbW9uZ193aF9zcmMoaW5mbyk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMKaW5kZXggYTZjODFkOS4uOWM1OTk4MCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnAuYwpAQCAtMzUsMTAgKzM1LDEwIEBACiAJCXJldHVybiBFQlRfTk9NQVRDSDsKIAogCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVApKSB7Ci0JCXVpbnQzMl90IF9hZGRyLCAqYXA7CisJCV9fYmUzMiBfYWRkciwgKmFwOwogCiAJCS8qIElQdjQgYWRkcmVzc2VzIGFyZSBhbHdheXMgNCBieXRlcyAqLwotCQlpZiAoYWgtPmFyX3BsbiAhPSBzaXplb2YodWludDMyX3QpKQorCQlpZiAoYWgtPmFyX3BsbiAhPSBzaXplb2YoX19iZTMyKSkKIAkJCXJldHVybiBFQlRfTk9NQVRDSDsKIAkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX1NSQ19JUCkgewogCQkJYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKwpAQCAtNTMsNyArNTMsNyBAQAogCiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9EU1RfSVApIHsKIAkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKLQkJCQkJCTIqYWgtPmFyX2hsbitzaXplb2YodWludDMyX3QpLAorCQkJCQkJMiphaC0+YXJfaGxuK3NpemVvZihfX2JlMzIpLAogCQkJCQkJc2l6ZW9mKF9hZGRyKSwgJl9hZGRyKTsKIAkJCWlmIChhcCA9PSBOVUxMKQogCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMKaW5kZXggNjViNjY1Yy4uZTRjNjQyNCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHRjcHVkcGhkciB7Ci0JdWludDE2X3Qgc3JjOwotCXVpbnQxNl90IGRzdDsKKwlfX2JlMTYgc3JjOworCV9fYmUxNiBkc3Q7CiB9OwogCiBzdGF0aWMgaW50IGVidF9maWx0ZXJfaXAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCmluZGV4IDQ2NmVkMzQuLmExODRmODcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKQEAgLTM4LDggKzM4LDggQEAKIAogc3RydWN0IHRjcHVkcGhkcgogewotCXVpbnQxNl90IHNyYzsKLQl1aW50MTZfdCBkc3Q7CisJX19iZTE2IHNyYzsKKwlfX2JlMTYgZHN0OwogfTsKIAogc3RydWN0IGFycHBheWxvYWQKQEAgLTEzMCw3ICsxMzAsNyBAQAogCQkgKiB0aGVuIGxvZyB0aGUgQVJQIHBheWxvYWQgKi8KIAkJaWYgKGFoLT5hcl9ocmQgPT0gaHRvbnMoMSkgJiYKIAkJICAgIGFoLT5hcl9obG4gPT0gRVRIX0FMRU4gJiYKLQkJICAgIGFoLT5hcl9wbG4gPT0gc2l6ZW9mKHVpbnQzMl90KSkgeworCQkgICAgYWgtPmFyX3BsbiA9PSBzaXplb2YoX19iZTMyKSkgewogCQkJc3RydWN0IGFycHBheWxvYWQgX2FycHAsICphcDsKIAogCQkJYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2YoX2FycGgpLApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmsuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrLmMKaW5kZXggYjU0MzA2YS4uNjJkMjNjNyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmsuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFyay5jCkBAIC0yNSwxNSArMjUsMTUgQEAKIAlpbnQgYWN0aW9uID0gaW5mby0+dGFyZ2V0ICYgLTE2OwogCiAJaWYgKGFjdGlvbiA9PSBNQVJLX1NFVF9WQUxVRSkKLQkJKCpwc2tiKS0+bmZtYXJrID0gaW5mby0+bWFyazsKKwkJKCpwc2tiKS0+bWFyayA9IGluZm8tPm1hcms7CiAJZWxzZSBpZiAoYWN0aW9uID09IE1BUktfT1JfVkFMVUUpCi0JCSgqcHNrYiktPm5mbWFyayB8PSBpbmZvLT5tYXJrOworCQkoKnBza2IpLT5tYXJrIHw9IGluZm8tPm1hcms7CiAJZWxzZSBpZiAoYWN0aW9uID09IE1BUktfQU5EX1ZBTFVFKQotCQkoKnBza2IpLT5uZm1hcmsgJj0gaW5mby0+bWFyazsKKwkJKCpwc2tiKS0+bWFyayAmPSBpbmZvLT5tYXJrOwogCWVsc2UKLQkJKCpwc2tiKS0+bmZtYXJrIF49IGluZm8tPm1hcms7CisJCSgqcHNrYiktPm1hcmsgXj0gaW5mby0+bWFyazsKIAotCXJldHVybiBpbmZvLT50YXJnZXQgfCAtMTY7CisJcmV0dXJuIGluZm8tPnRhcmdldCB8IH5FQlRfVkVSRElDVF9CSVRTOwogfQogCiBzdGF0aWMgaW50IGVidF90YXJnZXRfbWFya19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKQEAgLTQ0LDEzICs0NCwxMyBAQAogCiAJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X21hcmtfdF9pbmZvKSkpCiAJCXJldHVybiAtRUlOVkFMOwotCXRtcCA9IGluZm8tPnRhcmdldCB8IC0xNjsKKwl0bXAgPSBpbmZvLT50YXJnZXQgfCB+RUJUX1ZFUkRJQ1RfQklUUzsKIAlpZiAoQkFTRV9DSEFJTiAmJiB0bXAgPT0gRUJUX1JFVFVSTikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJQ0xFQVJfQkFTRV9DSEFJTl9CSVQ7CiAJaWYgKHRtcCA8IC1OVU1fU1RBTkRBUkRfVEFSR0VUUyB8fCB0bXAgPj0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JdG1wID0gaW5mby0+dGFyZ2V0ICYgLTE2OworCXRtcCA9IGluZm8tPnRhcmdldCAmIH5FQlRfVkVSRElDVF9CSVRTOwogCWlmICh0bXAgIT0gTUFSS19TRVRfVkFMVUUgJiYgdG1wICE9IE1BUktfT1JfVkFMVUUgJiYKIAkgICAgdG1wICE9IE1BUktfQU5EX1ZBTFVFICYmIHRtcCAhPSBNQVJLX1hPUl9WQUxVRSkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFya19tLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFya19tLmMKaW5kZXggYTY0MTNlNC4uMDI1ODY5ZWUwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFya19tLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jCkBAIC0xOSw4ICsxOSw4IEBACiAJc3RydWN0IGVidF9tYXJrX21faW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICopIGRhdGE7CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9NQVJLX09SKQotCQlyZXR1cm4gISghIShza2ItPm5mbWFyayAmIGluZm8tPm1hc2spIF4gaW5mby0+aW52ZXJ0KTsKLQlyZXR1cm4gISgoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQpOworCQlyZXR1cm4gISghIShza2ItPm1hcmsgJiBpbmZvLT5tYXNrKSBeIGluZm8tPmludmVydCk7CisJcmV0dXJuICEoKChza2ItPm1hcmsgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydCk7CiB9CiAKIHN0YXRpYyBpbnQgZWJ0X21hcmtfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc25hdC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3NuYXQuYwppbmRleCBjYmIzM2UyLi5hNTA3MjIxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc25hdC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9zbmF0LmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KIAogc3RhdGljIGludCBlYnRfdGFyZ2V0X3NuYXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgaG9va25yLAogICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LApAQCAtMzEsMjQgKzMzLDQzIEBACiAJCSpwc2tiID0gbnNrYjsKIAl9CiAJbWVtY3B5KGV0aF9oZHIoKnBza2IpLT5oX3NvdXJjZSwgaW5mby0+bWFjLCBFVEhfQUxFTik7Ci0JcmV0dXJuIGluZm8tPnRhcmdldDsKKwlpZiAoIShpbmZvLT50YXJnZXQgJiBOQVRfQVJQX0JJVCkgJiYKKwkgICAgZXRoX2hkcigqcHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfQVJQKSkgeworCQlzdHJ1Y3QgYXJwaGRyIF9haCwgKmFwOworCisJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCAwLCBzaXplb2YoX2FoKSwgJl9haCk7CisJCWlmIChhcCA9PSBOVUxMKQorCQkJcmV0dXJuIEVCVF9EUk9QOworCQlpZiAoYXAtPmFyX2hsbiAhPSBFVEhfQUxFTikKKwkJCWdvdG8gb3V0OworCQlpZiAoc2tiX3N0b3JlX2JpdHMoKnBza2IsIHNpemVvZihfYWgpLCBpbmZvLT5tYWMsRVRIX0FMRU4pKQorCQkJcmV0dXJuIEVCVF9EUk9QOworCX0KK291dDoKKwlyZXR1cm4gaW5mby0+dGFyZ2V0IHwgfkVCVF9WRVJESUNUX0JJVFM7CiB9CiAKIHN0YXRpYyBpbnQgZWJ0X3RhcmdldF9zbmF0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAogICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCiB7CiAJc3RydWN0IGVidF9uYXRfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X25hdF9pbmZvICopIGRhdGE7CisJaW50IHRtcDsKIAogCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9uYXRfaW5mbykpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoQkFTRV9DSEFJTiAmJiBpbmZvLT50YXJnZXQgPT0gRUJUX1JFVFVSTikKKwl0bXAgPSBpbmZvLT50YXJnZXQgfCB+RUJUX1ZFUkRJQ1RfQklUUzsKKwlpZiAoQkFTRV9DSEFJTiAmJiB0bXAgPT0gRUJUX1JFVFVSTikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJQ0xFQVJfQkFTRV9DSEFJTl9CSVQ7CiAJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJuYXQiKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGhvb2ttYXNrICYgfigxIDw8IE5GX0JSX1BPU1RfUk9VVElORykpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChJTlZBTElEX1RBUkdFVCkKKworCWlmICh0bXAgPCAtTlVNX1NUQU5EQVJEX1RBUkdFVFMgfHwgdG1wID49IDApCisJCXJldHVybiAtRUlOVkFMOworCXRtcCA9IGluZm8tPnRhcmdldCB8IEVCVF9WRVJESUNUX0JJVFM7CisJaWYgKCh0bXAgJiB+TkFUX0FSUF9CSVQpICE9IH5OQVRfQVJQX0JJVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwppbmRleCA5Zjk1MGRiLi5jMWFmNjhiIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCWlmICh1Yi0+cWxlbiA9PSAxKQogCQlza2Jfc2V0X3RpbWVzdGFtcCh1Yi0+c2tiLCAmcG0tPnN0YW1wKTsKIAlwbS0+ZGF0YV9sZW4gPSBjb3B5X2xlbjsKLQlwbS0+bWFyayA9IHNrYi0+bmZtYXJrOworCXBtLT5tYXJrID0gc2tiLT5tYXJrOwogCXBtLT5ob29rID0gaG9va25yOwogCWlmICh1bG9naW5mby0+cHJlZml4ICE9IE5VTEwpCiAJCXN0cmNweShwbS0+cHJlZml4LCB1bG9naW5mby0+cHJlZml4KTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF92bGFuLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdmxhbi5jCmluZGV4IGEyYjQ1MjguLjdlZTM3NzYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF92bGFuLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3ZsYW4uYwpAQCAtNTUsNyArNTUsNyBAQAogCXVuc2lnbmVkIHNob3J0IGlkOwkvKiBWTEFOIElELCBnaXZlbiBmcm9tIGZyYW1lIFRDSSAqLwogCXVuc2lnbmVkIGNoYXIgcHJpbzsJLyogdXNlcl9wcmlvcml0eSwgZ2l2ZW4gZnJvbSBmcmFtZSBUQ0kgKi8KIAkvKiBWTEFOIGVuY2Fwc3VsYXRlZCBUeXBlL0xlbmd0aCBmaWVsZCwgZ2l2ZW4gZnJvbSBvcmlnIGZyYW1lICovCi0JdW5zaWduZWQgc2hvcnQgZW5jYXA7CisJX19iZTE2IGVuY2FwOwogCiAJZnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2ZyYW1lKSwgJl9mcmFtZSk7CiAJaWYgKGZwID09IE5VTEwpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2Jyb3V0ZS5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9icm91dGUuYwppbmRleCA5YTZlNTQ4Li5kMzdjZTA0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2Jyb3V0ZS5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfYnJvdXRlLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAkucG9saWN5CQk9IEVCVF9BQ0NFUFQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGVidF9yZXBsYWNlIGluaXRpYWxfdGFibGUgPQorc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZV9rZXJuZWwgaW5pdGlhbF90YWJsZSA9CiB7CiAJLm5hbWUJCT0gImJyb3V0ZSIsCiAJLnZhbGlkX2hvb2tzCT0gMSA8PCBORl9CUl9CUk9VVElORywKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfZmlsdGVyLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2ZpbHRlci5jCmluZGV4IDNkNWJkNDQuLjEyNzEzNWUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9maWx0ZXIuYwpAQCAtMzAsNyArMzAsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGVidF9yZXBsYWNlIGluaXRpYWxfdGFibGUgPQorc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZV9rZXJuZWwgaW5pdGlhbF90YWJsZSA9CiB7CiAJLm5hbWUJCT0gImZpbHRlciIsCiAJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9uYXQuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfbmF0LmMKaW5kZXggMDRkZDQyZS4uOWM1MDQ4OCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9uYXQuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX25hdC5jCkBAIC0zMCw3ICszMCw3IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZSBpbml0aWFsX3RhYmxlID0KK3N0YXRpYyBzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsIGluaXRpYWxfdGFibGUgPQogewogCS5uYW1lCQk9ICJuYXQiLAogCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCmluZGV4IDlmODU2NjYuLmJlZTU1OGE0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKQEAgLTMzOCwxMCArMzM4LDExIEBACiAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCAqY250KQogewogCXN0cnVjdCBlYnRfbWF0Y2ggKm1hdGNoOworCXNpemVfdCBsZWZ0ID0gKChjaGFyICopZSArIGUtPndhdGNoZXJzX29mZnNldCkgLSAoY2hhciAqKW07CiAJaW50IHJldDsKIAotCWlmICgoKGNoYXIgKiltKSArIG0tPm1hdGNoX3NpemUgKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV9tYXRjaCkgPgotCSAgICgoY2hhciAqKWUpICsgZS0+d2F0Y2hlcnNfb2Zmc2V0KQorCWlmIChsZWZ0IDwgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2gpIHx8CisJICAgIGxlZnQgLSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV9tYXRjaCkgPCBtLT5tYXRjaF9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltYXRjaCA9IGZpbmRfbWF0Y2hfbG9jayhtLT51Lm5hbWUsICZyZXQsICZlYnRfbXV0ZXgpOwogCWlmICghbWF0Y2gpCkBAIC0zNjcsMTAgKzM2OCwxMSBAQAogICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgKmNudCkKIHsKIAlzdHJ1Y3QgZWJ0X3dhdGNoZXIgKndhdGNoZXI7CisJc2l6ZV90IGxlZnQgPSAoKGNoYXIgKillICsgZS0+dGFyZ2V0X29mZnNldCkgLSAoY2hhciAqKXc7CiAJaW50IHJldDsKIAotCWlmICgoKGNoYXIgKil3KSArIHctPndhdGNoZXJfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpID4KLQkgICAoKGNoYXIgKillKSArIGUtPnRhcmdldF9vZmZzZXQpCisJaWYgKGxlZnQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyKSB8fAorCSAgIGxlZnQgLSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyKSA8IHctPndhdGNoZXJfc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJd2F0Y2hlciA9IGZpbmRfd2F0Y2hlcl9sb2NrKHctPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7CiAJaWYgKCF3YXRjaGVyKQpAQCAtMzkxLDM1ICszOTMsOTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBlYnRfdmVyaWZ5X3BvaW50ZXJzKHN0cnVjdCBlYnRfcmVwbGFjZSAqcmVwbCwKKwkJCSAgICAgICBzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm8pCit7CisJdW5zaWduZWQgaW50IGxpbWl0ID0gcmVwbC0+ZW50cmllc19zaXplOworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rcyA9IHJlcGwtPnZhbGlkX2hvb2tzOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspCisJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSBOVUxMOworCisJbmV3aW5mby0+ZW50cmllc19zaXplID0gcmVwbC0+ZW50cmllc19zaXplOworCW5ld2luZm8tPm5lbnRyaWVzID0gcmVwbC0+bmVudHJpZXM7CisKKwl3aGlsZSAob2Zmc2V0IDwgbGltaXQpIHsKKwkJc2l6ZV90IGxlZnQgPSBsaW1pdCAtIG9mZnNldDsKKwkJc3RydWN0IGVidF9lbnRyeSAqZSA9ICh2b2lkICopbmV3aW5mby0+ZW50cmllcyArIG9mZnNldDsKKworCQlpZiAobGVmdCA8IHNpemVvZih1bnNpZ25lZCBpbnQpKQorCQkJYnJlYWs7CisKKwkJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKKwkJCWlmICgodmFsaWRfaG9va3MgJiAoMSA8PCBpKSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICgoY2hhciBfX3VzZXIgKilyZXBsLT5ob29rX2VudHJ5W2ldID09CisJCQkgICAgIHJlcGwtPmVudHJpZXMgKyBvZmZzZXQpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSAhPSBORl9CUl9OVU1IT09LUyB8fCAhKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykpIHsKKwkJCWlmIChlLT5iaXRtYXNrICE9IDApIHsKKwkJCQkvKiB3ZSBtYWtlIHVzZXJzcGFjZSBzZXQgdGhpcyByaWdodCwKKwkJCQkgICBzbyB0aGVyZSBpcyBubyBtaXN1bmRlcnN0YW5kaW5nICovCisJCQkJQlVHUFJJTlQoIkVCVF9FTlRSWV9PUl9FTlRSSUVTIHNob3VsZG4ndCBiZSBzZXQgIgorCQkJCQkgImluIGRpc3Rpbmd1aXNoZXJcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MpCisJCQkJbmV3aW5mby0+aG9va19lbnRyeVtpXSA9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillOworCQkJaWYgKGxlZnQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKSkKKwkJCQlicmVhazsKKwkJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsZWZ0IDwgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnkpKQorCQkJCWJyZWFrOworCQkJaWYgKGxlZnQgPCBlLT5uZXh0X29mZnNldCkKKwkJCQlicmVhazsKKwkJCW9mZnNldCArPSBlLT5uZXh0X29mZnNldDsKKwkJfQorCX0KKwlpZiAob2Zmc2V0ICE9IGxpbWl0KSB7CisJCUJVR1BSSU5UKCJlbnRyaWVzX3NpemUgdG9vIHNtYWxsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgaWYgYWxsIHZhbGlkIGhvb2tzIGhhdmUgYSBjaGFpbiAqLworCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7CisJCWlmICghbmV3aW5mby0+aG9va19lbnRyeVtpXSAmJgorCQkgICAodmFsaWRfaG9va3MgJiAoMSA8PCBpKSkpIHsKKwkJCUJVR1BSSU5UKCJWYWxpZCBob29rIHdpdGhvdXQgY2hhaW5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiB0aGlzIG9uZSBpcyB2ZXJ5IGNhcmVmdWwsIGFzIGl0IGlzIHRoZSBmaXJzdCBmdW5jdGlvbgogICogdG8gcGFyc2UgdGhlIHVzZXJzcGFjZSBkYXRhCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBlYnRfY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGVidF9lbnRyeSAqZSwKLSAgIHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbywgY2hhciAqYmFzZSwgY2hhciAqbGltaXQsCi0gICBzdHJ1Y3QgZWJ0X2VudHJpZXMgKipob29rX2VudHJpZXMsIHVuc2lnbmVkIGludCAqbiwgdW5zaWduZWQgaW50ICpjbnQsCi0gICB1bnNpZ25lZCBpbnQgKnRvdGFsY250LCB1bnNpZ25lZCBpbnQgKnVkY19jbnQsIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcykKKyAgIHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbywKKyAgIHVuc2lnbmVkIGludCAqbiwgdW5zaWduZWQgaW50ICpjbnQsCisgICB1bnNpZ25lZCBpbnQgKnRvdGFsY250LCB1bnNpZ25lZCBpbnQgKnVkY19jbnQpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykgewotCQlpZiAoKHZhbGlkX2hvb2tzICYgKDEgPDwgaSkpID09IDApCi0JCQljb250aW51ZTsKLQkJaWYgKCAoY2hhciAqKWhvb2tfZW50cmllc1tpXSAtIGJhc2UgPT0KLQkJICAgKGNoYXIgKillIC0gbmV3aW5mby0+ZW50cmllcykKKwkJaWYgKCh2b2lkICopZSA9PSAodm9pZCAqKW5ld2luZm8tPmhvb2tfZW50cnlbaV0pCiAJCQlicmVhazsKIAl9CiAJLyogYmVnaW5uaW5nIG9mIGEgbmV3IGNoYWluCiAJICAgaWYgaSA9PSBORl9CUl9OVU1IT09LUyBpdCBtdXN0IGJlIGEgdXNlciBkZWZpbmVkIGNoYWluICovCi0JaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MgfHwgIShlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpKSB7Ci0JCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSAhPSAwKSB7Ci0JCQkvKiB3ZSBtYWtlIHVzZXJzcGFjZSBzZXQgdGhpcyByaWdodCwKLQkJCSAgIHNvIHRoZXJlIGlzIG5vIG1pc3VuZGVyc3RhbmRpbmcgKi8KLQkJCUJVR1BSSU5UKCJFQlRfRU5UUllfT1JfRU5UUklFUyBzaG91bGRuJ3QgYmUgc2V0ICIKLQkJCSAgICAgICAgICJpbiBkaXN0aW5ndWlzaGVyXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MgfHwgIWUtPmJpdG1hc2spIHsKIAkJLyogdGhpcyBjaGVja3MgaWYgdGhlIHByZXZpb3VzIGNoYWluIGhhcyBhcyBtYW55IGVudHJpZXMKIAkJICAgYXMgaXQgc2FpZCBpdCBoYXMgKi8KIAkJaWYgKCpuICE9ICpjbnQpIHsKQEAgLTQyNywxMiArNDg1LDYgQEAKIAkJICAgICAgICAgICAgICAgICAiaW4gdGhlIGNoYWluXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCS8qIGJlZm9yZSB3ZSBsb29rIGF0IHRoZSBzdHJ1Y3QsIGJlIHN1cmUgaXQgaXMgbm90IHRvbyBiaWcgKi8KLQkJaWYgKChjaGFyICopaG9va19lbnRyaWVzW2ldICsgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cmllcykKLQkJICAgPiBsaW1pdCkgewotCQkJQlVHUFJJTlQoImVudHJpZXNfc2l6ZSB0b28gc21hbGxcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KIAkJaWYgKCgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfRFJPUCAmJgogCQkgICAoKHN0cnVjdCBlYnRfZW50cmllcyAqKWUpLT5wb2xpY3kgIT0gRUJUX0FDQ0VQVCkgewogCQkJLyogb25seSBSRVRVUk4gZnJvbSB1ZGMgKi8KQEAgLTQ0NCw4ICs0OTYsNiBAQAogCQl9CiAJCWlmIChpID09IE5GX0JSX05VTUhPT0tTKSAvKiBpdCdzIGEgdXNlciBkZWZpbmVkIGNoYWluICovCiAJCQkoKnVkY19jbnQpKys7Ci0JCWVsc2UKLQkJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSAoc3RydWN0IGVidF9lbnRyaWVzICopZTsKIAkJaWYgKCgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPmNvdW50ZXJfb2Zmc2V0ICE9ICp0b3RhbGNudCkgewogCQkJQlVHUFJJTlQoImNvdW50ZXJfb2Zmc2V0ICE9IHRvdGFsY250Iik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ2Niw3ICs1MTYsNiBAQAogCQlCVUdQUklOVCgidGFyZ2V0IHNpemUgdG9vIHNtYWxsXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCiAJKCpjbnQpKys7CiAJKCp0b3RhbGNudCkrKzsKIAlyZXR1cm4gMDsKQEAgLTQ4NSwxNyArNTM0LDE0IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBlYnRfZ2V0X3VkY19wb3NpdGlvbnMoc3RydWN0IGVidF9lbnRyeSAqZSwgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLAotICAgc3RydWN0IGVidF9lbnRyaWVzICoqaG9va19lbnRyaWVzLCB1bnNpZ25lZCBpbnQgKm4sIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKLSAgIHN0cnVjdCBlYnRfY2xfc3RhY2sgKnVkYykKKyAgIHVuc2lnbmVkIGludCAqbiwgc3RydWN0IGVidF9jbF9zdGFjayAqdWRjKQogewogCWludCBpOwogCiAJLyogd2UncmUgb25seSBpbnRlcmVzdGVkIGluIGNoYWluIHN0YXJ0cyAqLwotCWlmIChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpCisJaWYgKGUtPmJpdG1hc2spCiAJCXJldHVybiAwOwogCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7Ci0JCWlmICgodmFsaWRfaG9va3MgJiAoMSA8PCBpKSkgPT0gMCkKLQkJCWNvbnRpbnVlOwogCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtpXSA9PSAoc3RydWN0IGVidF9lbnRyaWVzICopZSkKIAkJCWJyZWFrOwogCX0KQEAgLTU0MSw3ICs1ODcsNyBAQAogewogCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OwogCi0JaWYgKChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpID09IDApCisJaWYgKGUtPmJpdG1hc2sgPT0gMCkKIAkJcmV0dXJuIDA7CiAJLyogd2UncmUgZG9uZSAqLwogCWlmIChjbnQgJiYgKCpjbnQpLS0gPT0gMCkKQEAgLTU1OCwxNiArNjA0LDE3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBlYnRfY2hlY2tfZW50cnkoc3RydWN0IGVidF9lbnRyeSAqZSwgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLAotICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50ICpjbnQsIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKKyAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCAqY250LAogICAgc3RydWN0IGVidF9jbF9zdGFjayAqY2xfcywgdW5zaWduZWQgaW50IHVkY19jbnQpCiB7CiAJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CiAJc3RydWN0IGVidF90YXJnZXQgKnRhcmdldDsKIAl1bnNpZ25lZCBpbnQgaSwgaiwgaG9vayA9IDAsIGhvb2ttYXNrID0gMDsKKwlzaXplX3QgZ2FwID0gZS0+bmV4dF9vZmZzZXQgLSBlLT50YXJnZXRfb2Zmc2V0OwogCWludCByZXQ7CiAKIAkvKiBkb24ndCBtZXNzIHdpdGggdGhlIHN0cnVjdCBlYnRfZW50cmllcyAqLwotCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSA9PSAwKQorCWlmIChlLT5iaXRtYXNrID09IDApCiAJCXJldHVybiAwOwogCiAJaWYgKGUtPmJpdG1hc2sgJiB+RUJUX0ZfTUFTSykgewpAQCAtNTg0LDcgKzYzMSw3IEBACiAJfQogCS8qIHdoYXQgaG9vayBkbyB3ZSBiZWxvbmcgdG8/ICovCiAJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKLQkJaWYgKCh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSA9PSAwKQorCQlpZiAoIW5ld2luZm8tPmhvb2tfZW50cnlbaV0pCiAJCQljb250aW51ZTsKIAkJaWYgKChjaGFyICopbmV3aW5mby0+aG9va19lbnRyeVtpXSA8IChjaGFyICopZSkKIAkJCWhvb2sgPSBpOwpAQCAtNjI1LDggKzY3Miw3IEBACiAKIAl0LT51LnRhcmdldCA9IHRhcmdldDsKIAlpZiAodC0+dS50YXJnZXQgPT0gJmVidF9zdGFuZGFyZF90YXJnZXQpIHsKLQkJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQpID4KLQkJICAgZS0+bmV4dF9vZmZzZXQpIHsKKwkJaWYgKGdhcCA8IHNpemVvZihzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCkpIHsKIAkJCUJVR1BSSU5UKCJTdGFuZGFyZCB0YXJnZXQgc2l6ZSB0b28gYmlnXG4iKTsKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7CkBAIC02MzcsOCArNjgzLDcgQEAKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7CiAJCX0KLQl9IGVsc2UgaWYgKChlLT50YXJnZXRfb2Zmc2V0ICsgdC0+dGFyZ2V0X3NpemUgKwotCSAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCkgPiBlLT5uZXh0X29mZnNldCkgfHwKKwl9IGVsc2UgaWYgKHQtPnRhcmdldF9zaXplID4gZ2FwIC0gc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSB8fAogCSAgICh0LT51LnRhcmdldC0+Y2hlY2sgJiYKIAkgICB0LT51LnRhcmdldC0+Y2hlY2sobmFtZSwgaG9va21hc2ssIGUsIHQtPmRhdGEsIHQtPnRhcmdldF9zaXplKSAhPSAwKSl7CiAJCW1vZHVsZV9wdXQodC0+dS50YXJnZXQtPm1lKTsKQEAgLTcwOCw3ICs3NTMsOSBAQAogCQkJCUJVR1BSSU5UKCJsb29wXG4iKTsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9Ci0JCQkvKiB0aGlzIGNhbid0IGJlIDAsIHNvIHRoZSBhYm92ZSB0ZXN0IGlzIGNvcnJlY3QgKi8KKwkJCWlmIChjbF9zW2ldLmhvb2ttYXNrICYgKDEgPDwgaG9va25yKSkKKwkJCQlnb3RvIGxldHNjb250aW51ZTsKKwkJCS8qIHRoaXMgY2FuJ3QgYmUgMCwgc28gdGhlIGxvb3AgdGVzdCBpcyBjb3JyZWN0ICovCiAJCQljbF9zW2ldLmNzLm4gPSBwb3MgKyAxOwogCQkJcG9zID0gMDsKIAkJCWNsX3NbaV0uY3MuZSA9ICgodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldCk7CkBAIC03MjgsNDIgKzc3NSwzNSBAQAogfQogCiAvKiBkbyB0aGUgcGFyc2luZyBvZiB0aGUgdGFibGUvY2hhaW5zL2VudHJpZXMvbWF0Y2hlcy93YXRjaGVycy90YXJnZXRzLCBoZWggKi8KLXN0YXRpYyBpbnQgdHJhbnNsYXRlX3RhYmxlKHN0cnVjdCBlYnRfcmVwbGFjZSAqcmVwbCwKLSAgIHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbykKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX3RhYmxlKGNoYXIgKm5hbWUsIHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbykKIHsKIAl1bnNpZ25lZCBpbnQgaSwgaiwgaywgdWRjX2NudDsKIAlpbnQgcmV0OwogCXN0cnVjdCBlYnRfY2xfc3RhY2sgKmNsX3MgPSBOVUxMOyAvKiB1c2VkIGluIHRoZSBjaGVja2luZyBmb3IgY2hhaW4gbG9vcHMgKi8KIAogCWkgPSAwOwotCXdoaWxlIChpIDwgTkZfQlJfTlVNSE9PS1MgJiYgIShyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGkpKSkKKwl3aGlsZSAoaSA8IE5GX0JSX05VTUhPT0tTICYmICFuZXdpbmZvLT5ob29rX2VudHJ5W2ldKQogCQlpKys7CiAJaWYgKGkgPT0gTkZfQlJfTlVNSE9PS1MpIHsKIAkJQlVHUFJJTlQoIk5vIHZhbGlkIGhvb2tzIHNwZWNpZmllZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAocmVwbC0+aG9va19lbnRyeVtpXSAhPSAoc3RydWN0IGVidF9lbnRyaWVzICopcmVwbC0+ZW50cmllcykgeworCWlmIChuZXdpbmZvLT5ob29rX2VudHJ5W2ldICE9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKiluZXdpbmZvLT5lbnRyaWVzKSB7CiAJCUJVR1BSSU5UKCJDaGFpbnMgZG9uJ3Qgc3RhcnQgYXQgYmVnaW5uaW5nXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIG1ha2Ugc3VyZSBjaGFpbnMgYXJlIG9yZGVyZWQgYWZ0ZXIgZWFjaCBvdGhlciBpbiBzYW1lIG9yZGVyCiAJICAgYXMgdGhlaXIgY29ycmVzcG9uZGluZyBob29rcyAqLwogCWZvciAoaiA9IGkgKyAxOyBqIDwgTkZfQlJfTlVNSE9PS1M7IGorKykgewotCQlpZiAoIShyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGopKSkKKwkJaWYgKCFuZXdpbmZvLT5ob29rX2VudHJ5W2pdKQogCQkJY29udGludWU7Ci0JCWlmICggcmVwbC0+aG9va19lbnRyeVtqXSA8PSByZXBsLT5ob29rX2VudHJ5W2ldICkgeworCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtqXSA8PSBuZXdpbmZvLT5ob29rX2VudHJ5W2ldKSB7CiAJCQlCVUdQUklOVCgiSG9vayBvcmRlciBtdXN0IGJlIGZvbGxvd2VkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWkgPSBqOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKQotCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gTlVMTDsKLQotCW5ld2luZm8tPmVudHJpZXNfc2l6ZSA9IHJlcGwtPmVudHJpZXNfc2l6ZTsKLQluZXdpbmZvLT5uZW50cmllcyA9IHJlcGwtPm5lbnRyaWVzOwotCiAJLyogZG8gc29tZSBlYXJseSBjaGVja2luZ3MgYW5kIGluaXRpYWxpemUgc29tZSB0aGluZ3MgKi8KIAlpID0gMDsgLyogaG9sZHMgdGhlIGV4cGVjdGVkIG5yLiBvZiBlbnRyaWVzIGZvciB0aGUgY2hhaW4gKi8KIAlqID0gMDsgLyogaG9sZHMgdGhlIHVwIHRvIG5vdyBjb3VudGVkIGVudHJpZXMgZm9yIHRoZSBjaGFpbiAqLwpAQCAtNzcxLDkgKzgxMSw4IEBACiAJICAgICAgICAgIG5ld2luZm8tPm5lbnRyaWVzIGFmdGVyd2FyZHMgKi8KIAl1ZGNfY250ID0gMDsgLyogd2lsbCBob2xkIHRoZSBuci4gb2YgdXNlciBkZWZpbmVkIGNoYWlucyAodWRjKSAqLwogCXJldCA9IEVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKLQkgICBlYnRfY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3MsIG5ld2luZm8sIHJlcGwtPmVudHJpZXMsCi0JICAgcmVwbC0+ZW50cmllcyArIHJlcGwtPmVudHJpZXNfc2l6ZSwgcmVwbC0+aG9va19lbnRyeSwgJmksICZqLCAmaywKLQkgICAmdWRjX2NudCwgcmVwbC0+dmFsaWRfaG9va3MpOworCSAgIGVidF9jaGVja19lbnRyeV9zaXplX2FuZF9ob29rcywgbmV3aW5mbywKKwkgICAmaSwgJmosICZrLCAmdWRjX2NudCk7CiAKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CkBAIC03ODgsMTUgKzgyNyw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIGNoZWNrIGlmIGFsbCB2YWxpZCBob29rcyBoYXZlIGEgY2hhaW4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykgewotCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtpXSA9PSBOVUxMICYmCi0JCSAgIChyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGkpKSkgewotCQkJQlVHUFJJTlQoIlZhbGlkIGhvb2sgd2l0aG91dCBjaGFpblxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQogCS8qIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHVkYywgcHV0IHRoZW0gaW4gYW4gYXJyYXkKIAkgICB3aGlsZSB3ZSdyZSBhdCBpdCwgYWxsb2NhdGUgdGhlIGNoYWluc3RhY2sgKi8KIAlpZiAodWRjX2NudCkgewpAQCAtODI0LDggKzg1NCw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaSA9IDA7IC8qIHRoZSBpJ3RoIHVkYyAqLwogCQlFQlRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5lbnRyaWVzX3NpemUsCi0JCSAgIGVidF9nZXRfdWRjX3Bvc2l0aW9ucywgbmV3aW5mbywgcmVwbC0+aG9va19lbnRyeSwgJmksCi0JCSAgIHJlcGwtPnZhbGlkX2hvb2tzLCBjbF9zKTsKKwkJICAgZWJ0X2dldF91ZGNfcG9zaXRpb25zLCBuZXdpbmZvLCAmaSwgY2xfcyk7CiAJCS8qIHNhbml0eSBjaGVjayAqLwogCQlpZiAoaSAhPSB1ZGNfY250KSB7CiAJCQlCVUdQUklOVCgiaSAhPSB1ZGNfY250XG4iKTsKQEAgLTgzNiw3ICs4NjUsNyBAQAogCiAJLyogQ2hlY2sgZm9yIGxvb3BzICovCiAJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspCi0JCWlmIChyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGkpKQorCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtpXSkKIAkJCWlmIChjaGVja19jaGFpbmxvb3BzKG5ld2luZm8tPmhvb2tfZW50cnlbaV0sCiAJCQkgICBjbF9zLCB1ZGNfY250LCBpLCBuZXdpbmZvLT5lbnRyaWVzKSkgewogCQkJCXZmcmVlKGNsX3MpOwpAQCAtODU2LDggKzg4NSw3IEBACiAJLyogdXNlZCB0byBrbm93IHdoYXQgd2UgbmVlZCB0byBjbGVhbiB1cCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyAqLwogCWkgPSAwOwogCXJldCA9IEVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKLQkgICBlYnRfY2hlY2tfZW50cnksIG5ld2luZm8sIHJlcGwtPm5hbWUsICZpLCByZXBsLT52YWxpZF9ob29rcywKLQkgICBjbF9zLCB1ZGNfY250KTsKKwkgICBlYnRfY2hlY2tfZW50cnksIG5ld2luZm8sIG5hbWUsICZpLCBjbF9zLCB1ZGNfY250KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAogCQkgICBlYnRfY2xlYW51cF9lbnRyeSwgJmkpOwpAQCAtOTU0LDcgKzk4MiwxMSBAQAogCiAJLyogdGhpcyBjYW4gZ2V0IGluaXRpYWxpemVkIGJ5IHRyYW5zbGF0ZV90YWJsZSgpICovCiAJbmV3aW5mby0+Y2hhaW5zdGFjayA9IE5VTEw7Ci0JcmV0ID0gdHJhbnNsYXRlX3RhYmxlKCZ0bXAsIG5ld2luZm8pOworCXJldCA9IGVidF92ZXJpZnlfcG9pbnRlcnMoJnRtcCwgbmV3aW5mbyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfY291bnRlcnN0bXA7CisKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodG1wLm5hbWUsIG5ld2luZm8pOwogCiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGZyZWVfY291bnRlcnN0bXA7CkBAIC0xMTI1LDM1ICsxMTU3LDQ3IEBACiB7CiAJc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvOwogCXN0cnVjdCBlYnRfdGFibGUgKnQ7CisJc3RydWN0IGVidF9yZXBsYWNlX2tlcm5lbCAqcmVwbDsKIAlpbnQgcmV0LCBpLCBjb3VudGVyc2l6ZTsKKwl2b2lkICpwOwogCi0JaWYgKCF0YWJsZSB8fCAhdGFibGUtPnRhYmxlIHx8IXRhYmxlLT50YWJsZS0+ZW50cmllcyB8fAotCSAgICB0YWJsZS0+dGFibGUtPmVudHJpZXNfc2l6ZSA9PSAwIHx8Ci0JICAgIHRhYmxlLT50YWJsZS0+Y291bnRlcnMgfHwgdGFibGUtPnByaXZhdGUpIHsKKwlpZiAoIXRhYmxlIHx8ICEocmVwbCA9IHRhYmxlLT50YWJsZSkgfHwgIXJlcGwtPmVudHJpZXMgfHwKKwkgICAgcmVwbC0+ZW50cmllc19zaXplID09IDAgfHwKKwkgICAgcmVwbC0+Y291bnRlcnMgfHwgdGFibGUtPnByaXZhdGUpIHsKIAkJQlVHUFJJTlQoIkJhZCB0YWJsZSBkYXRhIGZvciBlYnRfcmVnaXN0ZXJfdGFibGUhISFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljb3VudGVyc2l6ZSA9IENPVU5URVJfT0ZGU0VUKHRhYmxlLT50YWJsZS0+bmVudHJpZXMpICoKKwljb3VudGVyc2l6ZSA9IENPVU5URVJfT0ZGU0VUKHJlcGwtPm5lbnRyaWVzKSAqCiAJCQkJCShoaWdoZXN0X3Bvc3NpYmxlX3Byb2Nlc3Nvcl9pZCgpKzEpOwogCW5ld2luZm8gPSB2bWFsbG9jKHNpemVvZigqbmV3aW5mbykgKyBjb3VudGVyc2l6ZSk7CiAJcmV0ID0gLUVOT01FTTsKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbmV3aW5mby0+ZW50cmllcyA9IHZtYWxsb2ModGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUpOwotCWlmICghKG5ld2luZm8tPmVudHJpZXMpKQorCXAgPSB2bWFsbG9jKHJlcGwtPmVudHJpZXNfc2l6ZSk7CisJaWYgKCFwKQogCQlnb3RvIGZyZWVfbmV3aW5mbzsKIAotCW1lbWNweShuZXdpbmZvLT5lbnRyaWVzLCB0YWJsZS0+dGFibGUtPmVudHJpZXMsCi0JICAgdGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUpOworCW1lbWNweShwLCByZXBsLT5lbnRyaWVzLCByZXBsLT5lbnRyaWVzX3NpemUpOworCW5ld2luZm8tPmVudHJpZXMgPSBwOworCisJbmV3aW5mby0+ZW50cmllc19zaXplID0gcmVwbC0+ZW50cmllc19zaXplOworCW5ld2luZm8tPm5lbnRyaWVzID0gcmVwbC0+bmVudHJpZXM7CiAKIAlpZiAoY291bnRlcnNpemUpCiAJCW1lbXNldChuZXdpbmZvLT5jb3VudGVycywgMCwgY291bnRlcnNpemUpOwogCiAJLyogZmlsbCBpbiBuZXdpbmZvIGFuZCBwYXJzZSB0aGUgZW50cmllcyAqLwogCW5ld2luZm8tPmNoYWluc3RhY2sgPSBOVUxMOwotCXJldCA9IHRyYW5zbGF0ZV90YWJsZSh0YWJsZS0+dGFibGUsIG5ld2luZm8pOworCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7CisJCWlmICgocmVwbC0+dmFsaWRfaG9va3MgJiAoMSA8PCBpKSkgPT0gMCkKKwkJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSBOVUxMOworCQllbHNlCisJCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gcCArCisJCQkJKChjaGFyICopcmVwbC0+aG9va19lbnRyeVtpXSAtIHJlcGwtPmVudHJpZXMpOworCX0KKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUocmVwbC0+bmFtZSwgbmV3aW5mbyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCUJVR1BSSU5UKCJUcmFuc2xhdGVfdGFibGUgZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX2NoYWluc3RhY2s7CkBAIC0xMjc3LDMzICsxMzIxLDMzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGVidF9tYWtlX21hdGNobmFtZShzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLAotICAgY2hhciAqYmFzZSwgY2hhciAqdWJhc2UpCisgICBjaGFyICpiYXNlLCBjaGFyIF9fdXNlciAqdWJhc2UpCiB7Ci0JY2hhciAqaGxwID0gdWJhc2UgLSBiYXNlICsgKGNoYXIgKiltOworCWNoYXIgX191c2VyICpobHAgPSB1YmFzZSArICgoY2hhciAqKW0gLSBiYXNlKTsKIAlpZiAoY29weV90b191c2VyKGhscCwgbS0+dS5tYXRjaC0+bmFtZSwgRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWJ0X21ha2Vfd2F0Y2hlcm5hbWUoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LAotICAgY2hhciAqYmFzZSwgY2hhciAqdWJhc2UpCisgICBjaGFyICpiYXNlLCBjaGFyIF9fdXNlciAqdWJhc2UpCiB7Ci0JY2hhciAqaGxwID0gdWJhc2UgLSBiYXNlICsgKGNoYXIgKil3OworCWNoYXIgX191c2VyICpobHAgPSB1YmFzZSArICgoY2hhciAqKXcgLSBiYXNlKTsKIAlpZiAoY29weV90b191c2VyKGhscCAsIHctPnUud2F0Y2hlci0+bmFtZSwgRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZWJ0X21ha2VfbmFtZXMoc3RydWN0IGVidF9lbnRyeSAqZSwgY2hhciAqYmFzZSwgY2hhciAqdWJhc2UpCitzdGF0aWMgaW5saW5lIGludCBlYnRfbWFrZV9uYW1lcyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBjaGFyICpiYXNlLCBjaGFyIF9fdXNlciAqdWJhc2UpCiB7CiAJaW50IHJldDsKLQljaGFyICpobHA7CisJY2hhciBfX3VzZXIgKmhscDsKIAlzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDsKIAotCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSA9PSAwKQorCWlmIChlLT5iaXRtYXNrID09IDApCiAJCXJldHVybiAwOwogCi0JaGxwID0gdWJhc2UgLSBiYXNlICsgKGNoYXIgKillICsgZS0+dGFyZ2V0X29mZnNldDsKKwlobHAgPSB1YmFzZSArICgoKGNoYXIgKillICsgZS0+dGFyZ2V0X29mZnNldCkgLSBiYXNlKTsKIAl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CiAJCiAJcmV0ID0gRUJUX01BVENIX0lURVJBVEUoZSwgZWJ0X21ha2VfbWF0Y2huYW1lLCBiYXNlLCB1YmFzZSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlCmluZGV4IDExOTU2ODAuLjczMjcyZDUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL01ha2VmaWxlCisrKyBiL25ldC9jb3JlL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw2IEBACiAKIG9iai0kKENPTkZJR19YRlJNKSArPSBmbG93Lm8KIG9iai0kKENPTkZJR19TWVNGUykgKz0gbmV0LXN5c2ZzLm8KLW9iai0kKENPTkZJR19ORVRfRElWRVJUKSArPSBkdi5vCiBvYmotJChDT05GSUdfTkVUX1BLVEdFTikgKz0gcGt0Z2VuLm8KIG9iai0kKENPTkZJR19XSVJFTEVTU19FWFQpICs9IHdpcmVsZXNzLm8KIG9iai0kKENPTkZJR19ORVRQT0xMKSArPSBuZXRwb2xsLm8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RhdGFncmFtLmMgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCmluZGV4IGY1NThjNjEuLjc5N2ZkZDQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2RhdGFncmFtLmMKKysrIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAKIHN0YXRpYyBpbnQgc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKIAkJCQkgICAgICB1OCBfX3VzZXIgKnRvLCBpbnQgbGVuLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCAqY3N1bXApCisJCQkJICAgICAgX193c3VtICpjc3VtcCkKIHsKIAlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOwogCWludCBwb3MgPSAwOwpAQCAtMzUwLDcgKzM1MCw3IEBACiAKIAkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CiAJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7Ci0JCQl1bnNpZ25lZCBpbnQgY3N1bTI7CisJCQlfX3dzdW0gY3N1bTI7CiAJCQlpbnQgZXJyID0gMDsKIAkJCXU4ICAqdmFkZHI7CiAJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CkBAIC0zODYsNyArMzg2LDcgQEAKIAogCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CiAJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewotCQkJCXVuc2lnbmVkIGludCBjc3VtMiA9IDA7CisJCQkJX193c3VtIGNzdW0yID0gMDsKIAkJCQlpZiAoY29weSA+IGxlbikKIAkJCQkJY29weSA9IGxlbjsKIAkJCQlpZiAoc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW0obGlzdCwKQEAgLTQxMSwxMSArNDExLDExIEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLXVuc2lnbmVkIGludCBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXVuc2lnbmVkIGludCBzdW07CisJX19zdW0xNiBzdW07CiAKLQlzdW0gPSAodTE2KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgc2tiLT5jc3VtKSk7CisJc3VtID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCBza2ItPmNzdW0pKTsKIAlpZiAobGlrZWx5KCFzdW0pKSB7CiAJCWlmICh1bmxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkpCiAJCQluZXRkZXZfcnhfY3N1bV9mYXVsdChza2ItPmRldik7CkBAIC00NDEsNyArNDQxLDcgQEAKIGludCBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgaW50IGhsZW4sIHN0cnVjdCBpb3ZlYyAqaW92KQogewotCXVuc2lnbmVkIGludCBjc3VtOworCV9fd3N1bSBjc3VtOwogCWludCBjaHVuayA9IHNrYi0+bGVuIC0gaGxlbjsKIAogCS8qIFNraXAgZmlsbGVkIGVsZW1lbnRzLgpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJCWlmIChza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbShza2IsIGhsZW4sIGlvdi0+aW92X2Jhc2UsCiAJCQkJCSAgICAgICBjaHVuaywgJmNzdW0pKQogCQkJZ290byBmYXVsdDsKLQkJaWYgKCh1bnNpZ25lZCBzaG9ydCljc3VtX2ZvbGQoY3N1bSkpCisJCWlmIChjc3VtX2ZvbGQoY3N1bSkpCiAJCQlnb3RvIGNzdW1fZXJyb3I7CiAJCWlmICh1bmxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkpCiAJCQluZXRkZXZfcnhfY3N1bV9mYXVsdChza2ItPmRldik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDgxYzQyNmEuLjU5ZDA1OGEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC05OCw3ICs5OCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGl2ZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KQEAgLTExNzAsNyArMTE2OSw3IEBACiAgKi8KIGludCBza2JfY2hlY2tzdW1faGVscChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXVuc2lnbmVkIGludCBjc3VtOworCV9fd3N1bSBjc3VtOwogCWludCByZXQgPSAwLCBvZmZzZXQgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQpAQCAtMTE5Miw5ICsxMTkxLDkgQEAKIAogCW9mZnNldCA9IHNrYi0+dGFpbCAtIHNrYi0+aC5yYXc7CiAJQlVHX09OKG9mZnNldCA8PSAwKTsKLQlCVUdfT04oc2tiLT5jc3VtICsgMiA+IG9mZnNldCk7CisJQlVHX09OKHNrYi0+Y3N1bV9vZmZzZXQgKyAyID4gb2Zmc2V0KTsKIAotCSoodTE2Kikoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgPSBjc3VtX2ZvbGQoY3N1bSk7CisJKihfX3N1bTE2Kikoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bV9vZmZzZXQpID0gY3N1bV9mb2xkKGNzdW0pOwogCiBvdXRfc2V0X3N1bW1lZDoKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CkBAIC0xMjE2LDcgKzEyMTUsNyBAQAogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRVBST1RPTk9TVVBQT1JUKTsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlOwotCWludCB0eXBlID0gc2tiLT5wcm90b2NvbDsKKwlfX2JlMTYgdHlwZSA9IHNrYi0+cHJvdG9jb2w7CiAJaW50IGVycjsKIAogCUJVR19PTihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCk7CkBAIC0xNzY3LDcgKzE3NjYsNyBAQAogCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUsICpwdF9wcmV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldjsKIAlpbnQgcmV0ID0gTkVUX1JYX0RST1A7Ci0JdW5zaWduZWQgc2hvcnQgdHlwZTsKKwlfX2JlMTYgdHlwZTsKIAogCS8qIGlmIHdlJ3ZlIGdvdHRlbiBoZXJlIHRocm91Z2ggTkFQSSwgY2hlY2sgbmV0cG9sbCAqLwogCWlmIChza2ItPmRldi0+cG9sbCAmJiBuZXRwb2xsX3J4KHNrYikpCkBAIC0xODI3LDggKzE4MjYsNiBAQAogbmNsczoKICNlbmRpZgogCi0JaGFuZGxlX2RpdmVydGVyKHNrYik7Ci0KIAlpZiAoaGFuZGxlX2JyaWRnZSgmc2tiLCAmcHRfcHJldiwgJnJldCwgb3JpZ19kZXYpKQogCQlnb3RvIG91dDsKIApAQCAtMjg5OCwxMCArMjg5NSw2IEBACiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+aW5ncmVzc19sb2NrKTsKICNlbmRpZgogCi0JcmV0ID0gYWxsb2NfZGl2ZXJ0X2JsayhkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCiAJZGV2LT5pZmxpbmsgPSAtMTsKIAogCS8qIEluaXQsIGlmIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlICovCkBAIC0yOTEwLDEzICsyOTAzLDEzIEBACiAJCWlmIChyZXQpIHsKIAkJCWlmIChyZXQgPiAwKQogCQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dF9lcnI7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KICAKIAlpZiAoIWRldl92YWxpZF9uYW1lKGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfZXJyOworCQlnb3RvIG91dDsKIAl9CiAKIAlkZXYtPmlmaW5kZXggPSBkZXZfbmV3X2luZGV4KCk7CkBAIC0yOTMwLDcgKzI5MjMsNyBAQAogCQkJPSBobGlzdF9lbnRyeShwLCBzdHJ1Y3QgbmV0X2RldmljZSwgbmFtZV9obGlzdCk7CiAJCWlmICghc3RybmNtcChkLT5uYW1lLCBkZXYtPm5hbWUsIElGTkFNU0laKSkgewogCQkJcmV0ID0gLUVFWElTVDsKLSAJCQlnb3RvIG91dF9lcnI7CisgCQkJZ290byBvdXQ7CiAJCX0KICAJfQogCkBAIC0yOTc0LDcgKzI5NjcsNyBAQAogCiAJcmV0ID0gbmV0ZGV2X3JlZ2lzdGVyX3N5c2ZzKGRldik7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfZXJyOworCQlnb3RvIG91dDsKIAlkZXYtPnJlZ19zdGF0ZSA9IE5FVFJFR19SRUdJU1RFUkVEOwogCiAJLyoKQEAgLTMwMDEsOSArMjk5NCw2IEBACiAKIG91dDoKIAlyZXR1cm4gcmV0Owotb3V0X2VycjoKLQlmcmVlX2RpdmVydF9ibGsoZGV2KTsKLQlnb3RvIG91dDsKIH0KIAogLyoqCkBAIC0zMDM1LDE1ICszMDI1LDYgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAkKLQkvKgotCSAqIEJhY2sgY29tcGF0aWJpbGl0eSBob29rLiBLaWxsIHRoaXMgb25lIGluIDIuNQotCSAqLwotCWlmIChkZXYtPm5hbWVbMF0gPT0gMCB8fCBkZXYtPm5hbWVbMF0gPT0gJyAnKSB7Ci0JCWVyciA9IGRldl9hbGxvY19uYW1lKGRldiwgImV0aCVkIik7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CiBvdXQ6CiAJcnRubF91bmxvY2soKTsKQEAgLTMzMjksOCArMzMxMCw2IEBACiAJLyogTm90aWZpZXIgY2hhaW4gTVVTVCBkZXRhY2ggdXMgZnJvbSBtYXN0ZXIgZGV2aWNlLiAqLwogCUJVR19UUkFQKCFkZXYtPm1hc3Rlcik7CiAKLQlmcmVlX2RpdmVydF9ibGsoZGV2KTsKLQogCS8qIEZpbmlzaCBwcm9jZXNzaW5nIHVucmVnaXN0ZXIgYWZ0ZXIgdW5sb2NrICovCiAJbmV0X3NldF90b2RvKGRldik7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2R2LmMgYi9uZXQvY29yZS9kdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWVlNzdmMS4uMDAwMDAwMAotLS0gYS9uZXQvY29yZS9kdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qCi0gKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKLSAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKLSAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KLSAqCi0gKgkJR2VuZXJpYyBmcmFtZSBkaXZlcnNpb24KLSAqCi0gKiBBdXRob3JzOgkKLSAqIAkJQmVub2l0IExPQ0hFUjoJaW5pdGlhbCBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCB3aXRoIHN1cHBvcnQgZm9yIGV0aGVybmV0Ci0gKiAJCURhdmUgTWlsbGVyOglpbXByb3ZlbWVudCBvbiB0aGUgY29kZSAoY29ycmVjdG5lc3MsIHBlcmZvcm1hbmNlIGFuZCBzb3VyY2UgZmlsZXMpCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxuZXQvZHN0Lmg+Ci0jaW5jbHVkZSA8bmV0L2FycC5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kaXZlcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+Ci0KLWNvbnN0IGNoYXIgc3lzY3RsX2RpdmVydF92ZXJzaW9uWzMyXT0iMC40NiI7CS8qIEN1cnJlbnQgdmVyc2lvbiAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBkdl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdChkdl9pbml0KTsKLQotLyoKLSAqIEFsbG9jYXRlIGEgZGl2ZXJ0X2JsayBmb3IgYSBkZXZpY2UuIFRoaXMgbXVzdCBiZSBhbiBldGhlcm5ldCBuaWMuCi0gKi8KLWludCBhbGxvY19kaXZlcnRfYmxrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaW50IGFsbG9jX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBkaXZlcnRfYmxrKSArIDMpICYgfjM7Ci0KLQlkZXYtPmRpdmVydCA9IE5VTEw7Ci0JaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpIHsKLQkJZGV2LT5kaXZlcnQgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoZGV2LT5kaXZlcnQgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZGl2ZXJ0OiB1bmFibGUgdG8gYWxsb2NhdGUgZGl2ZXJ0X2JsayBmb3IgJXNcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWRldl9ob2xkKGRldik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19IAotCi0vKgotICogRnJlZSBhIGRpdmVydF9ibGsgYWxsb2NhdGVkIGJ5IHRoZSBhYm92ZSBmdW5jdGlvbiwgaWYgaXQgd2FzIAotICogYWxsb2NhdGVkIG9uIHRoYXQgZGV2aWNlLgotICovCi12b2lkIGZyZWVfZGl2ZXJ0X2JsayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWlmIChkZXYtPmRpdmVydCkgewotCQlrZnJlZShkZXYtPmRpdmVydCk7Ci0JCWRldi0+ZGl2ZXJ0PU5VTEw7Ci0JCWRldl9wdXQoZGV2KTsKLQl9Ci19Ci0KLS8qCi0gKiBBZGRzIGEgdGNwL3VkcCAoc291cmNlIG9yIGRlc3QpIHBvcnQgdG8gYW4gYXJyYXkKLSAqLwotc3RhdGljIGludCBhZGRfcG9ydCh1MTYgcG9ydHNbXSwgdTE2IHBvcnQpCi17Ci0JaW50IGk7Ci0KLQlpZiAocG9ydCA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFN0b3JpbmcgZGlyZWN0bHkgaW4gbmV0d29yayBmb3JtYXQgZm9yIHBlcmZvcm1hbmNlLAotCSAqIHRoYW5rcyBEYXZlIDopCi0JICovCi0JcG9ydCA9IGh0b25zKHBvcnQpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgewotCQlpZiAocG9ydHNbaV0gPT0gcG9ydCkKLQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBNQVhfRElWRVJUX1BPUlRTOyBpKyspIHsKLQkJaWYgKHBvcnRzW2ldID09IDApIHsKLQkJCXBvcnRzW2ldID0gcG9ydDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9CVUZTOwotfQotCi0vKgotICogUmVtb3ZlcyBhIHBvcnQgZnJvbSBhbiBhcnJheSB0Y3AvdWRwIChzb3VyY2Ugb3IgZGVzdCkKLSAqLwotc3RhdGljIGludCByZW1vdmVfcG9ydCh1MTYgcG9ydHNbXSwgdTE2IHBvcnQpCi17Ci0JaW50IGk7Ci0KLQlpZiAocG9ydCA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkKLQkvKiBTdG9yaW5nIGRpcmVjdGx5IGluIG5ldHdvcmsgZm9ybWF0IGZvciBwZXJmb3JtYW5jZSwKLQkgKiB0aGFua3MgRGF2ZSAhCi0JICovCi0JcG9ydCA9IGh0b25zKHBvcnQpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgewotCQlpZiAocG9ydHNbaV0gPT0gcG9ydCkgewotCQkJcG9ydHNbaV0gPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogU29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRpdmVydF9pb2N0bCgpICovCi1zdGF0aWMgaW50IGNoZWNrX2FyZ3Moc3RydWN0IGRpdmVydF9jZiAqZGl2X2NmLCBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldikKLXsKLQljaGFyIGRldm5hbWVbMzJdOwotCWludCByZXQ7Ci0KLQlpZiAoZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOwotCQotCS8qIEdFVFZFUlNJT046IGFsbCBvdGhlciBhcmdzIGFyZSB1bnVzZWQgKi8KLQlpZiAoZGl2X2NmLT5jbWQgPT0gRElWQ01EX0dFVFZFUlNJT04pCi0JCXJldHVybiAwOwotCQotCS8qIE5ldHdvcmsgZGV2aWNlIGluZGV4IHNob3VsZCByZWFzb25hYmx5IGJlIGJldHdlZW4gMCBhbmQgMTAwMCA6KSAqLwotCWlmIChkaXZfY2YtPmRldl9pbmRleCA8IDAgfHwgZGl2X2NmLT5kZXZfaW5kZXggPiAxMDAwKSAKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkKLQkvKiBMZXQncyB0cnkgdG8gZmluZCB0aGUgaWZuYW1lICovCi0Jc3ByaW50ZihkZXZuYW1lLCAiZXRoJWQiLCBkaXZfY2YtPmRldl9pbmRleCk7Ci0JKmRldiA9IGRldl9nZXRfYnlfbmFtZShkZXZuYW1lKTsKLQkKLQkvKiBkZXYgc2hvdWxkIE5PVCBiZSBudWxsICovCi0JaWYgKCpkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSAwOwotCi0JLyogdXNlciBpc3N1aW5nIHRoZSBpb2N0bCBtdXN0IGJlIGEgc3VwZXIgb25lIDopICovCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogRGV2aWNlIG11c3QgaGF2ZSBhIGRpdmVydF9ibGsgbWVtYmVyIE5PVCBudWxsICovCi0JaWYgKCgqZGV2KS0+ZGl2ZXJ0ID09IE5VTEwpCi0JCXJldCA9IC1FSU5WQUw7Ci1vdXQ6Ci0JZGV2X3B1dCgqZGV2KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogY29udHJvbCBmdW5jdGlvbiBvZiB0aGUgZGl2ZXJ0ZXIKLSAqLwotI2lmIDAKLSNkZWZpbmUJRFZEQkcoYSkJXAotCXByaW50ayhLRVJOX0RFQlVHICJkaXZlcnRfaW9jdGwoKSBsaW5lICVkICVzXG4iLCBfX0xJTkVfXywgKGEpKQotI2Vsc2UKLSNkZWZpbmUJRFZEQkcoYSkKLSNlbmRpZgotCi1pbnQgZGl2ZXJ0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBkaXZlcnRfY2YgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IGRpdmVydF9jZglkaXZfY2Y7Ci0Jc3RydWN0IGRpdmVydF9ibGsJKmRpdl9ibGs7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKLQlpbnQJCQlyZXQ7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0lPQ0dJRkRJVkVSVDoKLQkJRFZEQkcoIlNJT0NHSUZESVZFUlQsIGNvcHlfZnJvbV91c2VyIik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZGl2X2NmLCBhcmcsIHNpemVvZihzdHJ1Y3QgZGl2ZXJ0X2NmKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJRFZEQkcoImJlZm9yZSBjaGVja19hcmdzIik7Ci0JCXJldCA9IGNoZWNrX2FyZ3MoJmRpdl9jZiwgJmRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlEVkRCRygiYWZ0ZXIgY2hlY2thcmdzIik7Ci0JCWRpdl9ibGsgPSBkZXYtPmRpdmVydDsKLQkJCQotCQlEVkRCRygiYmVmcmUgc3dpdGNoKCkiKTsKLQkJc3dpdGNoIChkaXZfY2YuY21kKSB7Ci0JCWNhc2UgRElWQ01EX0dFVFNUQVRVUzoKLQkJCS8qIE5vdywganVzdCBnaXZlIHRoZSB1c2VyIHRoZSByYXcgZGl2ZXJ0IGJsb2NrCi0JCQkgKiBmb3IgaGltIHRvIHBsYXkgd2l0aCA6KQotCQkJICovCi0JCQlpZiAoY29weV90b191c2VyKGRpdl9jZi5hcmcxLnB0ciwgZGV2LT5kaXZlcnQsCi0JCQkJCSBzaXplb2Yoc3RydWN0IGRpdmVydF9ibGspKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRElWQ01EX0dFVFZFUlNJT046Ci0JCQlEVkRCRygiR0VUVkVSU0lPTjogY2hlY2tpbmcgcHRyIik7Ci0JCQlpZiAoZGl2X2NmLmFyZzEucHRyID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlEVkRCRygiR0VUVkVSU0lPTjogY29weWluZyBkYXRhIHRvIHVzZXJsYW5kIik7Ci0JCQlpZiAoY29weV90b191c2VyKGRpdl9jZi5hcmcxLnB0ciwKLQkJCQkJIHN5c2N0bF9kaXZlcnRfdmVyc2lvbiwgMzIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJRFZEQkcoIkdFVFZFUlNJT046IGRhdGEgY29waWVkIik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJRkRJVkVSVDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkaXZfY2YsIGFyZywgc2l6ZW9mKHN0cnVjdCBkaXZlcnRfY2YpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldCA9IGNoZWNrX2FyZ3MoJmRpdl9jZiwgJmRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCWRpdl9ibGsgPSBkZXYtPmRpdmVydDsKLQotCQlzd2l0Y2goZGl2X2NmLmNtZCkgewotCQljYXNlIERJVkNNRF9SRVNFVDoKLQkJCWRpdl9ibGstPmRpdmVydCA9IDA7Ci0JCQlkaXZfYmxrLT5wcm90b3MgPSBESVZFUlRfUFJPVE9fTk9ORTsKLQkJCW1lbXNldChkaXZfYmxrLT50Y3BfZHN0LCAwLAotCQkJICAgICAgIE1BWF9ESVZFUlRfUE9SVFMgKiBzaXplb2YodTE2KSk7Ci0JCQltZW1zZXQoZGl2X2Jsay0+dGNwX3NyYywgMCwKLQkJCSAgICAgICBNQVhfRElWRVJUX1BPUlRTICogc2l6ZW9mKHUxNikpOwotCQkJbWVtc2V0KGRpdl9ibGstPnVkcF9kc3QsIDAsCi0JCQkgICAgICAgTUFYX0RJVkVSVF9QT1JUUyAqIHNpemVvZih1MTYpKTsKLQkJCW1lbXNldChkaXZfYmxrLT51ZHBfc3JjLCAwLAotCQkJICAgICAgIE1BWF9ESVZFUlRfUE9SVFMgKiBzaXplb2YodTE2KSk7Ci0JCQlyZXR1cm4gMDsKLQkJCQkKLQkJY2FzZSBESVZDTURfRElWRVJUOgotCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7Ci0JCQljYXNlIERJVkFSRzFfRU5BQkxFOgotCQkJCWlmIChkaXZfYmxrLT5kaXZlcnQpCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+ZGl2ZXJ0ID0gMTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBESVZBUkcxX0RJU0FCTEU6Ci0JCQkJaWYgKCFkaXZfYmxrLT5kaXZlcnQpCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+ZGl2ZXJ0ID0gMDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBESVZDTURfSVA6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9FTkFCTEU6Ci0JCQkJaWYgKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19JUCkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5wcm90b3MgfD0gRElWRVJUX1BST1RPX0lQOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERJVkFSRzFfRElTQUJMRToKLQkJCQlpZiAoIShkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSVApKQotCQkJCQlyZXR1cm4gLUVBTFJFQURZOwotCQkJCWRpdl9ibGstPnByb3RvcyAmPSB+RElWRVJUX1BST1RPX0lQOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9UQ1A6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9FTkFCTEU6Ci0JCQkJaWYgKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19UQ1ApCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+cHJvdG9zIHw9IERJVkVSVF9QUk9UT19UQ1A7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRElWQVJHMV9ESVNBQkxFOgotCQkJCWlmICghKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19UQ1ApKQotCQkJCQlyZXR1cm4gLUVBTFJFQURZOwotCQkJCWRpdl9ibGstPnByb3RvcyAmPSB+RElWRVJUX1BST1RPX1RDUDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBESVZDTURfVENQRFNUOgotCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7Ci0JCQljYXNlIERJVkFSRzFfQUREOgotCQkJCXJldHVybiBhZGRfcG9ydChkaXZfYmxrLT50Y3BfZHN0LAotCQkJCQkJZGl2X2NmLmFyZzIudWludDE2KTsKLQkJCQkKLQkJCWNhc2UgRElWQVJHMV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHJlbW92ZV9wb3J0KGRpdl9ibGstPnRjcF9kc3QsCi0JCQkJCQkgICBkaXZfY2YuYXJnMi51aW50MTYpOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9UQ1BTUkM6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9BREQ6Ci0JCQkJcmV0dXJuIGFkZF9wb3J0KGRpdl9ibGstPnRjcF9zcmMsCi0JCQkJCQlkaXZfY2YuYXJnMi51aW50MTYpOwotCi0JCQljYXNlIERJVkFSRzFfUkVNT1ZFOgotCQkJCXJldHVybiByZW1vdmVfcG9ydChkaXZfYmxrLT50Y3Bfc3JjLAotCQkJCQkJICAgZGl2X2NmLmFyZzIudWludDE2KTsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBESVZDTURfVURQOgotCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7Ci0JCQljYXNlIERJVkFSRzFfRU5BQkxFOgotCQkJCWlmIChkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fVURQKQotCQkJCQlyZXR1cm4gLUVBTFJFQURZOwotCQkJCWRpdl9ibGstPnByb3RvcyB8PSBESVZFUlRfUFJPVE9fVURQOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERJVkFSRzFfRElTQUJMRToKLQkJCQlpZiAoIShkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fVURQKSkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5wcm90b3MgJj0gfkRJVkVSVF9QUk9UT19VRFA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgRElWQ01EX1VEUERTVDoKLQkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgewotCQkJY2FzZSBESVZBUkcxX0FERDoKLQkJCQlyZXR1cm4gYWRkX3BvcnQoZGl2X2Jsay0+dWRwX2RzdCwKLQkJCQkJCWRpdl9jZi5hcmcyLnVpbnQxNik7Ci0KLQkJCWNhc2UgRElWQVJHMV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHJlbW92ZV9wb3J0KGRpdl9ibGstPnVkcF9kc3QsCi0JCQkJCQkgICBkaXZfY2YuYXJnMi51aW50MTYpOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9VRFBTUkM6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9BREQ6Ci0JCQkJcmV0dXJuIGFkZF9wb3J0KGRpdl9ibGstPnVkcF9zcmMsCi0JCQkJCQlkaXZfY2YuYXJnMi51aW50MTYpOwotCi0JCQljYXNlIERJVkFSRzFfUkVNT1ZFOgotCQkJCXJldHVybiByZW1vdmVfcG9ydChkaXZfYmxrLT51ZHBfc3JjLAotCQkJCQkJICAgZGl2X2NmLmFyZzIudWludDE2KTsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBESVZDTURfSUNNUDoKLQkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgewotCQkJY2FzZSBESVZBUkcxX0VOQUJMRToKLQkJCQlpZiAoZGl2X2Jsay0+cHJvdG9zICYgRElWRVJUX1BST1RPX0lDTVApCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+cHJvdG9zIHw9IERJVkVSVF9QUk9UT19JQ01QOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERJVkFSRzFfRElTQUJMRToKLQkJCQlpZiAoIShkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSUNNUCkpCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+cHJvdG9zICY9IH5ESVZFUlRfUFJPVE9fSUNNUDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogQ2hlY2sgaWYgcGFja2V0IHNob3VsZCBoYXZlIGl0cyBkZXN0IG1hYyBhZGRyZXNzIHNldCB0byB0aGUgYm94IGl0c2VsZgotICogZm9yIGRpdmVyc2lvbgotICovCi0KLSNkZWZpbmUJRVRIX0RJVkVSVF9GUkFNRShza2IpIFwKLQltZW1jcHkoZXRoX2hkcihza2IpLCBza2ItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsgXAotCXNrYi0+cGt0X3R5cGU9UEFDS0VUX0hPU1QKLQkJCi12b2lkIGRpdmVydF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBldGhoZHIJCQkqZXRoID0gZXRoX2hkcihza2IpOwotCXN0cnVjdCBpcGhkcgkJCSppcGg7Ci0Jc3RydWN0IHRjcGhkcgkJCSp0Y3BoOwotCXN0cnVjdCB1ZHBoZHIJCQkqdWRwaDsKLQlzdHJ1Y3QgZGl2ZXJ0X2JsawkJKmRpdmVydCA9IHNrYi0+ZGV2LT5kaXZlcnQ7Ci0JaW50CQkJCWksIHNyYywgZHN0OwotCXVuc2lnbmVkIGNoYXIJCQkqc2tiX2RhdGFfZW5kID0gc2tiLT5kYXRhICsgc2tiLT5sZW47Ci0KLQkvKiBQYWNrZXQgaXMgYWxyZWFkeSBhaW1lZCBhdCB1cywgcmV0dXJuICovCi0JaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoLT5oX2Rlc3QsIHNrYi0+ZGV2LT5kZXZfYWRkcikpCi0JCXJldHVybjsKLQkKLQkvKiBwcm90byBpcyBub3QgSVAsIGRvIG5vdGhpbmcgKi8KLQlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKLQkJcmV0dXJuOwotCQotCS8qIERpdmVydCBhbGwgSVAgZnJhbWVzID8gKi8KLQlpZiAoZGl2ZXJ0LT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSVApIHsKLQkJRVRIX0RJVkVSVF9GUkFNRShza2IpOwotCQlyZXR1cm47Ci0JfQotCQotCS8qIENoZWNrIGZvciBwb3NzaWJsZSAobWFsaWNpb3VzbHkpIG1hbGZvcm1lZCBJUCBmcmFtZSAodGhhbmtzIERhdmUpICovCi0JaXBoID0gKHN0cnVjdCBpcGhkciAqKSBza2ItPmRhdGE7Ci0JaWYgKCgoaXBoLT5paGw8PDIpKyh1bnNpZ25lZCBjaGFyKikoaXBoKSkgPj0gc2tiX2RhdGFfZW5kKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImRpdmVydDogbWFsZm9ybWVkIElQIHBhY2tldCAhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoaXBoLT5wcm90b2NvbCkgewotCS8qIERpdmVydCBhbGwgSUNNUCBmcmFtZXMgPyAqLwotCWNhc2UgSVBQUk9UT19JQ01QOgotCQlpZiAoZGl2ZXJ0LT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSUNNUCkgewotCQkJRVRIX0RJVkVSVF9GUkFNRShza2IpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JLyogRGl2ZXJ0IGFsbCBUQ1AgZnJhbWVzID8gKi8KLQljYXNlIElQUFJPVE9fVENQOgotCQlpZiAoZGl2ZXJ0LT5wcm90b3MgJiBESVZFUlRfUFJPVE9fVENQKSB7Ci0JCQlFVEhfRElWRVJUX0ZSQU1FKHNrYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgcG9zc2libGUgKG1hbGljaW91c2x5KSBtYWxmb3JtZWQgSVAKLQkJICogZnJhbWUgKHRoYW54IERhdmUpCi0JCSAqLwotCQl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikKLQkJCSgoKHVuc2lnbmVkIGNoYXIgKilpcGgpICsgKGlwaC0+aWhsPDwyKSk7Ci0JCWlmICgoKHVuc2lnbmVkIGNoYXIgKikodGNwaCsxKSkgPj0gc2tiX2RhdGFfZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJkaXZlcnQ6IG1hbGZvcm1lZCBUQ1AgcGFja2V0ICFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogRGl2ZXJ0IHNvbWUgdGNwIGRzdC9zcmMgcG9ydHMgb25seSA/Ki8KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgewotCQkJZHN0ID0gZGl2ZXJ0LT50Y3BfZHN0W2ldOwotCQkJc3JjID0gZGl2ZXJ0LT50Y3Bfc3JjW2ldOwotCQkJaWYgKChkc3QgJiYgZHN0ID09IHRjcGgtPmRlc3QpIHx8Ci0JCQkgICAgKHNyYyAmJiBzcmMgPT0gdGNwaC0+c291cmNlKSkgewotCQkJCUVUSF9ESVZFUlRfRlJBTUUoc2tiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkvKiBEaXZlcnQgYWxsIFVEUCBmcmFtZXMgPyAqLwotCWNhc2UgSVBQUk9UT19VRFA6Ci0JCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19VRFApIHsKLQkJCUVUSF9ESVZFUlRfRlJBTUUoc2tiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIENoZWNrIGZvciBwb3NzaWJsZSAobWFsaWNpb3VzbHkpIG1hbGZvcm1lZCBJUAotCQkgKiBwYWNrZXQgKHRoYW5rcyBEYXZlKQotCQkgKi8KLQkJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopCi0JCQkoKCh1bnNpZ25lZCBjaGFyICopaXBoKSArIChpcGgtPmlobDw8MikpOwotCQlpZiAoKCh1bnNpZ25lZCBjaGFyICopKHVkcGgrMSkpID49IHNrYl9kYXRhX2VuZCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJkaXZlcnQ6IG1hbGZvcm1lZCBVRFAgcGFja2V0ICFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogRGl2ZXJ0IHNvbWUgdWRwIGRzdC9zcmMgcG9ydHMgb25seSA/ICovCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfRElWRVJUX1BPUlRTOyBpKyspIHsKLQkJCWRzdCA9IGRpdmVydC0+dWRwX2RzdFtpXTsKLQkJCXNyYyA9IGRpdmVydC0+dWRwX3NyY1tpXTsKLQkJCWlmICgoZHN0ICYmIGRzdCA9PSB1ZHBoLT5kZXN0KSB8fAotCQkJICAgIChzcmMgJiYgc3JjID09IHVkcGgtPnNvdXJjZSkpIHsKLQkJCQlFVEhfRElWRVJUX0ZSQU1FKHNrYik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKaW5kZXggNmIwZTYzYy4uMWRmNmNkNDUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jCisrKyBiL25ldC9jb3JlL2ZpYl9ydWxlcy5jCkBAIC0xMDcsNiArMTA3LDIyIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGZpYl9ydWxlc191bnJlZ2lzdGVyKTsKIAorc3RhdGljIGludCBmaWJfcnVsZV9tYXRjaChzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMsCisJCQkgIHN0cnVjdCBmbG93aSAqZmwsIGludCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChydWxlLT5pZmluZGV4ICYmIChydWxlLT5pZmluZGV4ICE9IGZsLT5paWYpKQorCQlnb3RvIG91dDsKKworCWlmICgocnVsZS0+bWFyayBeIGZsLT5tYXJrKSAmIHJ1bGUtPm1hcmtfbWFzaykKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvcHMtPm1hdGNoKHJ1bGUsIGZsLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIChydWxlLT5mbGFncyAmIEZJQl9SVUxFX0lOVkVSVCkgPyAhcmV0IDogcmV0OworfQorCiBpbnQgZmliX3J1bGVzX2xvb2t1cChzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzLCBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkgICAgIGludCBmbGFncywgc3RydWN0IGZpYl9sb29rdXBfYXJnICphcmcpCiB7CkBAIC0xMTYsMTAgKzEzMiw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocnVsZSwgb3BzLT5ydWxlc19saXN0LCBsaXN0KSB7Ci0JCWlmIChydWxlLT5pZmluZGV4ICYmIChydWxlLT5pZmluZGV4ICE9IGZsLT5paWYpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFvcHMtPm1hdGNoKHJ1bGUsIGZsLCBmbGFncykpCisJCWlmICghZmliX3J1bGVfbWF0Y2gocnVsZSwgb3BzLCBmbCwgZmxhZ3MpKQogCQkJY29udGludWU7CiAKIAkJZXJyID0gb3BzLT5hY3Rpb24ocnVsZSwgZmwsIGZsYWdzLCBhcmcpOwpAQCAtMTc5LDYgKzE5MiwxOCBAQAogCQkJcnVsZS0+aWZpbmRleCA9IGRldi0+aWZpbmRleDsKIAl9CiAKKwlpZiAodGJbRlJBX0ZXTUFSS10pIHsKKwkJcnVsZS0+bWFyayA9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BUktdKTsKKwkJaWYgKHJ1bGUtPm1hcmspCisJCQkvKiBjb21wYXRpYmlsaXR5OiBpZiB0aGUgbWFyayB2YWx1ZSBpcyBub24temVybyBhbGwgYml0cworCQkJICogYXJlIGNvbXBhcmVkIHVubGVzcyBhIG1hc2sgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCisJCQkgKi8KKwkJCXJ1bGUtPm1hcmtfbWFzayA9IDB4RkZGRkZGRkY7CisJfQorCisJaWYgKHRiW0ZSQV9GV01BU0tdKQorCQlydWxlLT5tYXJrX21hc2sgPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVNLXSk7CisKIAlydWxlLT5hY3Rpb24gPSBmcmgtPmFjdGlvbjsKIAlydWxlLT5mbGFncyA9IGZyaC0+ZmxhZ3M7CiAJcnVsZS0+dGFibGUgPSBmcmhfZ2V0X3RhYmxlKGZyaCwgdGIpOwpAQCAtMjUwLDYgKzI3NSwxNCBAQAogCQkgICAgbmxhX3N0cmNtcCh0YltGUkFfSUZOQU1FXSwgcnVsZS0+aWZuYW1lKSkKIAkJCWNvbnRpbnVlOwogCisJCWlmICh0YltGUkFfRldNQVJLXSAmJgorCQkgICAgKHJ1bGUtPm1hcmsgIT0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0YltGUkFfRldNQVNLXSAmJgorCQkgICAgKHJ1bGUtPm1hcmtfbWFzayAhPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVNLXSkpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFvcHMtPmNvbXBhcmUocnVsZSwgZnJoLCB0YikpCiAJCQljb250aW51ZTsKIApAQCAtMjczLDYgKzMwNiwyMiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGZpYl9ydWxlX25sbXNnX3NpemUoc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcywKKwkJCQkJIHN0cnVjdCBmaWJfcnVsZSAqcnVsZSkKK3sKKwlzaXplX3QgcGF5bG9hZCA9IE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgZmliX3J1bGVfaGRyKSkKKwkJCSArIG5sYV90b3RhbF9zaXplKElGTkFNU0laKSAvKiBGUkFfSUZOQU1FICovCisJCQkgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBGUkFfUFJJT1JJVFkgKi8KKwkJCSArIG5sYV90b3RhbF9zaXplKDQpIC8qIEZSQV9UQUJMRSAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCkgLyogRlJBX0ZXTUFSSyAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCk7IC8qIEZSQV9GV01BU0sgKi8KKworCWlmIChvcHMtPm5sbXNnX3BheWxvYWQpCisJCXBheWxvYWQgKz0gb3BzLT5ubG1zZ19wYXlsb2FkKHJ1bGUpOworCisJcmV0dXJuIHBheWxvYWQ7Cit9CisKIHN0YXRpYyBpbnQgZmliX25sX2ZpbGxfcnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsCiAJCQkgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IHR5cGUsIGludCBmbGFncywKIAkJCSAgICBzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzKQpAQCAtMjk4LDYgKzM0NywxMiBAQAogCWlmIChydWxlLT5wcmVmKQogCQlOTEFfUFVUX1UzMihza2IsIEZSQV9QUklPUklUWSwgcnVsZS0+cHJlZik7CiAKKwlpZiAocnVsZS0+bWFyaykKKwkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVJLLCBydWxlLT5tYXJrKTsKKworCWlmIChydWxlLT5tYXJrX21hc2sgfHwgcnVsZS0+bWFyaykKKwkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVNLLCBydWxlLT5tYXJrX21hc2spOworCiAJaWYgKG9wcy0+ZmlsbChydWxlLCBza2IsIG5saCwgZnJoKSA8IDApCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCkBAIC0zNDUsMTUgKzQwMCwxMyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBubG1zZ19uZXcoZmliX3J1bGVfbmxtc2dfc2l6ZShvcHMsIHJ1bGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gZmliX25sX2ZpbGxfcnVsZShza2IsIHJ1bGUsIHBpZCwgbmxoLT5ubG1zZ19zZXEsIGV2ZW50LCAwLCBvcHMpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBmaWJfcnVsZV9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIHBpZCwgb3BzLT5ubGdyb3VwLCBubGgsIEdGUF9LRVJORUwpOwogZXJyb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCA2NzMyNzgyLi4wZGY4NDNiIDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiBsb2FkX3c6CiAJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrLCA0LCAmdG1wKTsKIAkJCWlmIChwdHIgIT0gTlVMTCkgewotCQkJCUEgPSBudG9obChnZXRfdW5hbGlnbmVkKCh1MzIgKilwdHIpKTsKKwkJCQlBID0gbnRvaGwoZ2V0X3VuYWxpZ25lZCgoX19iZTMyICopcHRyKSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE4Nyw3ICsxODcsNyBAQAogbG9hZF9oOgogCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgaywgMiwgJnRtcCk7CiAJCQlpZiAocHRyICE9IE5VTEwpIHsKLQkJCQlBID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgodTE2ICopcHRyKSk7CisJCQkJQSA9IG50b2hzKGdldF91bmFsaWduZWQoKF9fYmUxNiAqKXB0cikpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJICovCiAJCXN3aXRjaCAoay1TS0ZfQURfT0ZGKSB7CiAJCWNhc2UgU0tGX0FEX1BST1RPQ09MOgotCQkJQSA9IGh0b25zKHNrYi0+cHJvdG9jb2wpOworCQkJQSA9IG50b2hzKHNrYi0+cHJvdG9jb2wpOwogCQkJY29udGludWU7CiAJCWNhc2UgU0tGX0FEX1BLVFRZUEU6CiAJCQlBID0gc2tiLT5wa3RfdHlwZTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2lvdmVjLmMgYi9uZXQvY29yZS9pb3ZlYy5jCmluZGV4IDY1ZTRiNTYuLjA0YjI0OWMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2lvdmVjLmMKKysrIGIvbmV0L2NvcmUvaW92ZWMuYwpAQCAtMTU4LDkgKzE1OCw5IEBACiAgKgljYWxsIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1bmFsaWduZWQgYWxzby4KICAqLwogaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21pb3ZlY2VuZCh1bnNpZ25lZCBjaGFyICprZGF0YSwgc3RydWN0IGlvdmVjICppb3YsCi0JCQkJIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sIGludCAqY3N1bXApCisJCQkJIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sIF9fd3N1bSAqY3N1bXApCiB7Ci0JaW50IGNzdW0gPSAqY3N1bXA7CisJX193c3VtIGNzdW0gPSAqY3N1bXA7CiAJaW50IHBhcnRpYWxfY250ID0gMCwgZXJyID0gMDsKIAogCS8qIFNraXAgb3ZlciB0aGUgZmluaXNoZWQgaW92ZWNzICovCmRpZmYgLS1naXQgYS9uZXQvY29yZS9rbWFwX3NrYi5oIGIvbmV0L2NvcmUva21hcF9za2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNjMmI5OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2ttYXBfc2tiLmgKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKworc3RhdGljIGlubGluZSB2b2lkICprbWFwX3NrYl9mcmFnKGNvbnN0IHNrYl9mcmFnX3QgKmZyYWcpCit7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwlCVUdfT04oaW5faXJxKCkpOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworI2VuZGlmCisJcmV0dXJuIGttYXBfYXRvbWljKGZyYWctPnBhZ2UsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3VubWFwX3NrYl9mcmFnKHZvaWQgKnZhZGRyKQoreworCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJbG9jYWxfYmhfZW5hYmxlKCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggYjRiNDc4My4uYmE1MDlhNCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTEyNjYsMTAgKzEyNjYsOSBAQAogc3RydWN0IG5laWdoX3Bhcm1zICpuZWlnaF9wYXJtc19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsKQogewotCXN0cnVjdCBuZWlnaF9wYXJtcyAqcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IG5laWdoX3Bhcm1zICpwID0ga21lbWR1cCgmdGJsLT5wYXJtcywgc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAocCkgewotCQltZW1jcHkocCwgJnRibC0+cGFybXMsIHNpemVvZigqcCkpOwogCQlwLT50YmwJCSAgPSB0Ymw7CiAJCWF0b21pY19zZXQoJnAtPnJlZmNudCwgMSk7CiAJCUlOSVRfUkNVX0hFQUQoJnAtPnJjdV9oZWFkKTsKQEAgLTI0MTAsMjAgKzI0MDksMjcgQEAKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAjaWZkZWYgQ09ORklHX0FSUEQKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IG5laWdoX25sbXNnX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZG1zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoTUFYX0FERFJfTEVOKSAvKiBOREFfRFNUICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoTUFYX0FERFJfTEVOKSAvKiBOREFfTExBRERSICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBuZGFfY2FjaGVpbmZvKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KTsgLyogTkRBX1BST0JFUyAqLworfQorCiBzdGF0aWMgdm9pZCBfX25laWdoX25vdGlmeShzdHJ1Y3QgbmVpZ2hib3VyICpuLCBpbnQgdHlwZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfQVRPTUlDKTsKKwlza2IgPSBubG1zZ19uZXcobmVpZ2hfbmxtc2dfc2l6ZSgpLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gbmVpZ2hfZmlsbF9pbmZvKHNrYiwgbiwgMCwgMCwgdHlwZSwgZmxhZ3MpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBuZWlnaF9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfTkVJR0gsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgpAQCAtMjYxOCwxNCArMjYyNCwxNCBAQAogCQkJICBpbnQgcF9pZCwgaW50IHBkZXZfaWQsIGNoYXIgKnBfbmFtZSwgCiAJCQkgIHByb2NfaGFuZGxlciAqaGFuZGxlciwgY3RsX2hhbmRsZXIgKnN0cmF0ZWd5KQogewotCXN0cnVjdCBuZWlnaF9zeXNjdGxfdGFibGUgKnQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCXN0cnVjdCBuZWlnaF9zeXNjdGxfdGFibGUgKnQgPSBrbWVtZHVwKCZuZWlnaF9zeXNjdGxfdGVtcGxhdGUsCisJCQkJCSAgICAgICBzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKIAljb25zdCBjaGFyICpkZXZfbmFtZV9zb3VyY2UgPSBOVUxMOwogCWNoYXIgKmRldl9uYW1lID0gTlVMTDsKIAlpbnQgZXJyID0gMDsKIAogCWlmICghdCkKIAkJcmV0dXJuIC1FTk9CVUZTOwotCW1lbWNweSh0LCAmbmVpZ2hfc3lzY3RsX3RlbXBsYXRlLCBzaXplb2YoKnQpKTsKIAl0LT5uZWlnaF92YXJzWzBdLmRhdGEgID0gJnAtPm1jYXN0X3Byb2JlczsKIAl0LT5uZWlnaF92YXJzWzFdLmRhdGEgID0gJnAtPnVjYXN0X3Byb2JlczsKIAl0LT5uZWlnaF92YXJzWzJdLmRhdGEgID0gJnAtPmFwcF9wcm9iZXM7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRwb2xsLmMgYi9uZXQvY29yZS9uZXRwb2xsLmMKaW5kZXggNjU4OWFkYi4uM2M1ODg0NiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0cG9sbC5jCisrKyBiL25ldC9jb3JlL25ldHBvbGwuYwpAQCAtMzQsMTggKzM0LDEyIEBACiAjZGVmaW5lIE1BWF9VRFBfQ0hVTksgMTQ2MAogI2RlZmluZSBNQVhfU0tCUyAzMgogI2RlZmluZSBNQVhfUVVFVUVfREVQVEggKE1BWF9TS0JTIC8gMikKLSNkZWZpbmUgTUFYX1JFVFJJRVMgMjAwMDAKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhza2JfbGlzdF9sb2NrKTsKLXN0YXRpYyBpbnQgbnJfc2ticzsKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2ticzsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhxdWV1ZV9sb2NrKTsKLXN0YXRpYyBpbnQgcXVldWVfZGVwdGg7Ci1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnF1ZXVlX2hlYWQsICpxdWV1ZV90YWlsOworc3RhdGljIHN0cnVjdCBza19idWZmX2hlYWQgc2tiX3Bvb2w7CiAKIHN0YXRpYyBhdG9taWNfdCB0cmFwcGVkOwogCisjZGVmaW5lIFVTRUNfUEVSX1BPTEwJNTAKICNkZWZpbmUgTkVUUE9MTF9SWF9FTkFCTEVEICAxCiAjZGVmaW5lIE5FVFBPTExfUlhfRFJPUCAgICAgMgogCkBAIC01OCw1MiArNTIsMzUgQEAKIAogc3RhdGljIHZvaWQgcXVldWVfcHJvY2Vzcyh2b2lkICpwKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvID0gcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jd2hpbGUgKHF1ZXVlX2hlYWQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZucGluZm8tPnR4cSkpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAotCQlza2IgPSBxdWV1ZV9oZWFkOwotCQlxdWV1ZV9oZWFkID0gc2tiLT5uZXh0OwotCQlpZiAoc2tiID09IHF1ZXVlX3RhaWwpCi0JCQlxdWV1ZV9oZWFkID0gTlVMTDsKKwkJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpIHx8ICFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCV9fa2ZyZWVfc2tiKHNrYik7CisJCQljb250aW51ZTsKKwkJfQogCi0JCXF1ZXVlX2RlcHRoLS07CisJCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSB8fAorCQkgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYpICE9IE5FVERFVl9UWF9PSykgeworCQkJc2tiX3F1ZXVlX2hlYWQoJm5waW5mby0+dHhxLCBza2IpOworCQkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVfbG9jaywgZmxhZ3MpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZucGluZm8tPnR4X3dvcmssIEhaLzEwKTsKKwkJCXJldHVybjsKKwkJfQogCi0JCWRldl9xdWV1ZV94bWl0KHNrYik7CisJCW5ldGlmX3R4X3VubG9ja19iaChkZXYpOwogCX0KIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyhzZW5kX3F1ZXVlLCBxdWV1ZV9wcm9jZXNzLCBOVUxMKTsKLQotdm9pZCBuZXRwb2xsX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgX19zdW0xNiBjaGVja3N1bV91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgdWxlbiwgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChxdWV1ZV9kZXB0aCA9PSBNQVhfUVVFVUVfREVQVEgpIHsKLQkJX19rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFxdWV1ZV9oZWFkKQotCQlxdWV1ZV9oZWFkID0gc2tiOwotCWVsc2UKLQkJcXVldWVfdGFpbC0+bmV4dCA9IHNrYjsKLQlxdWV1ZV90YWlsID0gc2tiOwotCXF1ZXVlX2RlcHRoKys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVfbG9jaywgZmxhZ3MpOwotCi0Jc2NoZWR1bGVfd29yaygmc2VuZF9xdWV1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tzdW1fdWRwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoLAotCQkJICAgICB1bnNpZ25lZCBzaG9ydCB1bGVuLCB1MzIgc2FkZHIsIHUzMiBkYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgcHN1bTsKKwlfX3dzdW0gcHN1bTsKIAogCWlmICh1aC0+Y2hlY2sgPT0gMCB8fCBza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKIAkJcmV0dXJuIDA7CkBAIC0xMTEsNyArODgsNyBAQAogCXBzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsIGRhZGRyLCB1bGVuLCBJUFBST1RPX1VEUCwgMCk7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUgJiYKLQkgICAgISh1MTYpY3N1bV9mb2xkKGNzdW1fYWRkKHBzdW0sIHNrYi0+Y3N1bSkpKQorCSAgICAhY3N1bV9mb2xkKGNzdW1fYWRkKHBzdW0sIHNrYi0+Y3N1bSkpKQogCQlyZXR1cm4gMDsKIAogCXNrYi0+Y3N1bSA9IHBzdW07CkBAIC0xNjcsMTIgKzE0NCwxMSBAQAogCQlhcnBfcmVwbHkoc2tiKTsKIAkJc2tiID0gc2tiX2RlcXVldWUoJm5waS0+YXJwX3R4KTsKIAl9Ci0JcmV0dXJuOwogfQogCiB2b2lkIG5ldHBvbGxfcG9sbChzdHJ1Y3QgbmV0cG9sbCAqbnApCiB7Ci0JaWYoIW5wLT5kZXYgfHwgIW5ldGlmX3J1bm5pbmcobnAtPmRldikgfHwgIW5wLT5kZXYtPnBvbGxfY29udHJvbGxlcikKKwlpZiAoIW5wLT5kZXYgfHwgIW5ldGlmX3J1bm5pbmcobnAtPmRldikgfHwgIW5wLT5kZXYtPnBvbGxfY29udHJvbGxlcikKIAkJcmV0dXJuOwogCiAJLyogUHJvY2VzcyBwZW5kaW5nIHdvcmsgb24gTklDICovCkBAIC0xOTAsMTcgKzE2NiwxNSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZza2JfbGlzdF9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKG5yX3NrYnMgPCBNQVhfU0tCUykgeworCXNwaW5fbG9ja19pcnFzYXZlKCZza2JfcG9vbC5sb2NrLCBmbGFncyk7CisJd2hpbGUgKHNrYl9wb29sLnFsZW4gPCBNQVhfU0tCUykgewogCQlza2IgPSBhbGxvY19za2IoTUFYX1NLQl9TSVpFLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFza2IpCiAJCQlicmVhazsKIAotCQlza2ItPm5leHQgPSBza2JzOwotCQlza2JzID0gc2tiOwotCQlucl9za2JzKys7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrYl9wb29sLCBza2IpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZza2JfbGlzdF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2tiX3Bvb2wubG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB6YXBfY29tcGxldGlvbl9xdWV1ZSh2b2lkKQpAQCAtMjE5LDcgKzE5Myw3IEBACiAJCXdoaWxlIChjbGlzdCAhPSBOVUxMKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY2xpc3Q7CiAJCQljbGlzdCA9IGNsaXN0LT5uZXh0OwotCQkJaWYoc2tiLT5kZXN0cnVjdG9yKQorCQkJaWYgKHNrYi0+ZGVzdHJ1Y3RvcikKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOyAvKiBwdXQgdGhpcyBvbmUgYmFjayAqLwogCQkJZWxzZQogCQkJCV9fa2ZyZWVfc2tiKHNrYik7CkBAIC0yMjksMzggKzIwMywyNSBAQAogCXB1dF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqIGZpbmRfc2tiKHN0cnVjdCBuZXRwb2xsICpucCwgaW50IGxlbiwgaW50IHJlc2VydmUpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmZpbmRfc2tiKHN0cnVjdCBuZXRwb2xsICpucCwgaW50IGxlbiwgaW50IHJlc2VydmUpCiB7Ci0JaW50IG9uY2UgPSAxLCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CiAKIAl6YXBfY29tcGxldGlvbl9xdWV1ZSgpOworCXJlZmlsbF9za2JzKCk7CiByZXBlYXQ6Ci0JaWYgKG5yX3NrYnMgPCBNQVhfU0tCUykKLQkJcmVmaWxsX3NrYnMoKTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlza2IgPSBza2JfZGVxdWV1ZSgmc2tiX3Bvb2wpOwogCiAJaWYgKCFza2IpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNrYl9saXN0X2xvY2ssIGZsYWdzKTsKLQkJc2tiID0gc2ticzsKLQkJaWYgKHNrYikgewotCQkJc2ticyA9IHNrYi0+bmV4dDsKLQkJCXNrYi0+bmV4dCA9IE5VTEw7Ci0JCQlucl9za2JzLS07CisJCWlmICgrK2NvdW50IDwgMTApIHsKKwkJCW5ldHBvbGxfcG9sbChucCk7CisJCQlnb3RvIHJlcGVhdDsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZza2JfbGlzdF9sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYoIXNrYikgewotCQljb3VudCsrOwotCQlpZiAob25jZSAmJiAoY291bnQgPT0gMTAwMDAwMCkpIHsKLQkJCXByaW50aygib3V0IG9mIG5ldHBvbGwgc2ticyFcbiIpOwotCQkJb25jZSA9IDA7Ci0JCX0KLQkJbmV0cG9sbF9wb2xsKG5wKTsKLQkJZ290byByZXBlYXQ7CisJCXJldHVybiBOVUxMOwogCX0KIAogCWF0b21pY19zZXQoJnNrYi0+dXNlcnMsIDEpOwpAQCAtMjcwLDUwICsyMzEsNDAgQEAKIAogc3RhdGljIHZvaWQgbmV0cG9sbF9zZW5kX3NrYihzdHJ1Y3QgbmV0cG9sbCAqbnAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IHN0YXR1czsKLQlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm87CisJaW50IHN0YXR1cyA9IE5FVERFVl9UWF9CVVNZOworCXVuc2lnbmVkIGxvbmcgdHJpZXM7CisgCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBucC0+ZGV2OworIAlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm8gPSBucC0+ZGV2LT5ucGluZm87CiAKLQlpZiAoIW5wIHx8ICFucC0+ZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5wLT5kZXYpKSB7Ci0JCV9fa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybjsKLQl9CisgCWlmICghbnBpbmZvIHx8ICFuZXRpZl9ydW5uaW5nKGRldikgfHwgIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKyAJCV9fa2ZyZWVfc2tiKHNrYik7CisgCQlyZXR1cm47CisgCX0KIAotCW5waW5mbyA9IG5wLT5kZXYtPm5waW5mbzsKKwkvKiBkb24ndCBnZXQgbWVzc2FnZXMgb3V0IG9mIG9yZGVyLCBhbmQgbm8gcmVjdXJzaW9uICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJm5waW5mby0+dHhxKSA9PSAwICYmCisJICAgIG5waW5mby0+cG9sbF9vd25lciAhPSBzbXBfcHJvY2Vzc29yX2lkKCkgJiYKKwkgICAgbmV0aWZfdHhfdHJ5bG9jayhkZXYpKSB7CisJCS8qIHRyeSB1bnRpbCBuZXh0IGNsb2NrIHRpY2sgKi8KKwkJZm9yICh0cmllcyA9IGppZmZpZXNfdG9fdXNlY3MoMSkvVVNFQ19QRVJfUE9MTDsgdHJpZXMgPiAwOyAtLXRyaWVzKSB7CisJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCQlzdGF0dXMgPSBkZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CiAKLQkvKiBhdm9pZCByZWN1cnNpb24gKi8KLQlpZiAobnBpbmZvLT5wb2xsX293bmVyID09IHNtcF9wcm9jZXNzb3JfaWQoKSB8fAotCSAgICBucC0+ZGV2LT54bWl0X2xvY2tfb3duZXIgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7Ci0JCWlmIChucC0+ZHJvcCkKLQkJCW5wLT5kcm9wKHNrYik7Ci0JCWVsc2UKLQkJCV9fa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybjsKLQl9CisJCQlpZiAoc3RhdHVzID09IE5FVERFVl9UWF9PSykKKwkJCQlicmVhazsKIAotCWRvIHsKLQkJbnBpbmZvLT50cmllcy0tOwotCQluZXRpZl90eF9sb2NrKG5wLT5kZXYpOworCQkJLyogdGlja2xlIGRldmljZSBtYXliZSB0aGVyZSBpcyBzb21lIGNsZWFudXAgKi8KKwkJCW5ldHBvbGxfcG9sbChucCk7CiAKLQkJLyoKLQkJICogbmV0d29yayBkcml2ZXJzIGRvIG5vdCBleHBlY3QgdG8gYmUgY2FsbGVkIGlmIHRoZSBxdWV1ZSBpcwotCQkgKiBzdG9wcGVkLgotCQkgKi8KLQkJc3RhdHVzID0gTkVUREVWX1RYX0JVU1k7Ci0JCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChucC0+ZGV2KSkKLQkJCXN0YXR1cyA9IG5wLT5kZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIG5wLT5kZXYpOwotCi0JCW5ldGlmX3R4X3VubG9jayhucC0+ZGV2KTsKLQotCQkvKiBzdWNjZXNzICovCi0JCWlmKCFzdGF0dXMpIHsKLQkJCW5waW5mby0+dHJpZXMgPSBNQVhfUkVUUklFUzsgLyogcmVzZXQgKi8KLQkJCXJldHVybjsKKwkJCXVkZWxheShVU0VDX1BFUl9QT0xMKTsKIAkJfQorCQluZXRpZl90eF91bmxvY2soZGV2KTsKKwl9CiAKLQkJLyogdHJhbnNtaXQgYnVzeSAqLwotCQluZXRwb2xsX3BvbGwobnApOwotCQl1ZGVsYXkoNTApOwotCX0gd2hpbGUgKG5waW5mby0+dHJpZXMgPiAwKTsKKwlpZiAoc3RhdHVzICE9IE5FVERFVl9UWF9PSykgeworCQlza2JfcXVldWVfdGFpbCgmbnBpbmZvLT50eHEsIHNrYik7CisJCXNjaGVkdWxlX3dvcmsoJm5waW5mby0+dHhfd29yayk7CisJfQogfQogCiB2b2lkIG5ldHBvbGxfc2VuZF91ZHAoc3RydWN0IG5ldHBvbGwgKm5wLCBjb25zdCBjaGFyICptc2csIGludCBsZW4pCkBAIC0zNDUsNyArMjk2LDcgQEAKIAkJCQkJdWRwX2xlbiwgSVBQUk9UT19VRFAsCiAJCQkJCWNzdW1fcGFydGlhbCgodW5zaWduZWQgY2hhciAqKXVkcGgsIHVkcF9sZW4sIDApKTsKIAlpZiAodWRwaC0+Y2hlY2sgPT0gMCkKLQkJdWRwaC0+Y2hlY2sgPSAtMTsKKwkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAogCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCppcGgpKTsKIApAQCAtMzc5LDcgKzMzMCw3IEBACiAJc3RydWN0IGFycGhkciAqYXJwOwogCXVuc2lnbmVkIGNoYXIgKmFycF9wdHI7CiAJaW50IHNpemUsIHR5cGUgPSBBUlBPUF9SRVBMWSwgcHR5cGUgPSBFVEhfUF9BUlA7Ci0JdTMyIHNpcCwgdGlwOworCV9fYmUzMiBzaXAsIHRpcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VuZF9za2I7CiAJc3RydWN0IG5ldHBvbGwgKm5wID0gTlVMTDsKIApAQCAtNDMxLDggKzM4Miw4IEBACiAKIAlpZiAobnAtPmRldi0+aGFyZF9oZWFkZXIgJiYKIAkgICAgbnAtPmRldi0+aGFyZF9oZWFkZXIoc2VuZF9za2IsIHNrYi0+ZGV2LCBwdHlwZSwKLQkJCQkgICAgICAgbnAtPnJlbW90ZV9tYWMsIG5wLT5sb2NhbF9tYWMsCi0JCQkJICAgICAgIHNlbmRfc2tiLT5sZW4pIDwgMCkgeworCQkJCSBucC0+cmVtb3RlX21hYywgbnAtPmxvY2FsX21hYywKKwkJCQkgc2VuZF9za2ItPmxlbikgPCAwKSB7CiAJCWtmcmVlX3NrYihzZW5kX3NrYik7CiAJCXJldHVybjsKIAl9CkBAIC00NzAsNyArNDIxLDYgQEAKIAlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGkgPSBza2ItPmRldi0+bnBpbmZvOwogCXN0cnVjdCBuZXRwb2xsICpucCA9IG5waS0+cnhfbnA7CiAKLQogCWlmICghbnApCiAJCWdvdG8gb3V0OwogCWlmIChza2ItPmRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCkBAIC01NDMsNDcgKzQ5Myw0NyBAQAogewogCWNoYXIgKmN1cj1vcHQsICpkZWxpbTsKIAotCWlmKCpjdXIgIT0gJ0AnKSB7CisJaWYgKCpjdXIgIT0gJ0AnKSB7CiAJCWlmICgoZGVsaW0gPSBzdHJjaHIoY3VyLCAnQCcpKSA9PSBOVUxMKQogCQkJZ290byBwYXJzZV9mYWlsZWQ7Ci0JCSpkZWxpbT0wOwotCQlucC0+bG9jYWxfcG9ydD1zaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTApOwotCQljdXI9ZGVsaW07CisJCSpkZWxpbSA9IDA7CisJCW5wLT5sb2NhbF9wb3J0ID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDEwKTsKKwkJY3VyID0gZGVsaW07CiAJfQogCWN1cisrOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2NhbCBwb3J0ICVkXG4iLCBucC0+bmFtZSwgbnAtPmxvY2FsX3BvcnQpOwogCi0JaWYoKmN1ciAhPSAnLycpIHsKKwlpZiAoKmN1ciAhPSAnLycpIHsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICcvJykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5sb2NhbF9pcD1udG9obChpbl9hdG9uKGN1cikpOwotCQljdXI9ZGVsaW07CisJCSpkZWxpbSA9IDA7CisJCW5wLT5sb2NhbF9pcCA9IG50b2hsKGluX2F0b24oY3VyKSk7CisJCWN1ciA9IGRlbGltOwogCiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2NhbCBJUCAlZC4lZC4lZC4lZFxuIiwKIAkJICAgICAgIG5wLT5uYW1lLCBISVBRVUFEKG5wLT5sb2NhbF9pcCkpOwogCX0KIAljdXIrKzsKIAotCWlmICggKmN1ciAhPSAnLCcpIHsKKwlpZiAoKmN1ciAhPSAnLCcpIHsKIAkJLyogcGFyc2Ugb3V0IGRldiBuYW1lICovCiAJCWlmICgoZGVsaW0gPSBzdHJjaHIoY3VyLCAnLCcpKSA9PSBOVUxMKQogCQkJZ290byBwYXJzZV9mYWlsZWQ7Ci0JCSpkZWxpbT0wOworCQkqZGVsaW0gPSAwOwogCQlzdHJsY3B5KG5wLT5kZXZfbmFtZSwgY3VyLCBzaXplb2YobnAtPmRldl9uYW1lKSk7Ci0JCWN1cj1kZWxpbTsKKwkJY3VyID0gZGVsaW07CiAJfQogCWN1cisrOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSAlc1xuIiwgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7CiAKLQlpZiAoICpjdXIgIT0gJ0AnICkgeworCWlmICgqY3VyICE9ICdAJykgewogCQkvKiBkc3QgcG9ydCAqLwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJ0AnKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPnJlbW90ZV9wb3J0PXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxMCk7Ci0JCWN1cj1kZWxpbTsKKwkJKmRlbGltID0gMDsKKwkJbnAtPnJlbW90ZV9wb3J0ID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDEwKTsKKwkJY3VyID0gZGVsaW07CiAJfQogCWN1cisrOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiByZW1vdGUgcG9ydCAlZFxuIiwgbnAtPm5hbWUsIG5wLT5yZW1vdGVfcG9ydCk7CkBAIC01OTEsNDIgKzU0MSw0MSBAQAogCS8qIGRzdCBpcCAqLwogCWlmICgoZGVsaW0gPSBzdHJjaHIoY3VyLCAnLycpKSA9PSBOVUxMKQogCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkqZGVsaW09MDsKLQlucC0+cmVtb3RlX2lwPW50b2hsKGluX2F0b24oY3VyKSk7Ci0JY3VyPWRlbGltKzE7CisJKmRlbGltID0gMDsKKwlucC0+cmVtb3RlX2lwID0gbnRvaGwoaW5fYXRvbihjdXIpKTsKKwljdXIgPSBkZWxpbSArIDE7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogcmVtb3RlIElQICVkLiVkLiVkLiVkXG4iLAotCQkgICAgICAgbnAtPm5hbWUsIEhJUFFVQUQobnAtPnJlbW90ZV9pcCkpOworCSAgICAgICBucC0+bmFtZSwgSElQUVVBRChucC0+cmVtb3RlX2lwKSk7CiAKLQlpZiggKmN1ciAhPSAwICkKLQl7CisJaWYgKCpjdXIgIT0gMCkgewogCQkvKiBNQUMgYWRkcmVzcyAqLwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPnJlbW90ZV9tYWNbMF09c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKLQkJY3VyPWRlbGltKzE7CisJCSpkZWxpbSA9IDA7CisJCW5wLT5yZW1vdGVfbWFjWzBdID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyID0gZGVsaW0gKyAxOwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPnJlbW90ZV9tYWNbMV09c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKLQkJY3VyPWRlbGltKzE7CisJCSpkZWxpbSA9IDA7CisJCW5wLT5yZW1vdGVfbWFjWzFdID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyID0gZGVsaW0gKyAxOwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPnJlbW90ZV9tYWNbMl09c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKLQkJY3VyPWRlbGltKzE7CisJCSpkZWxpbSA9IDA7CisJCW5wLT5yZW1vdGVfbWFjWzJdID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyID0gZGVsaW0gKyAxOwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPnJlbW90ZV9tYWNbM109c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKLQkJY3VyPWRlbGltKzE7CisJCSpkZWxpbSA9IDA7CisJCW5wLT5yZW1vdGVfbWFjWzNdID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyID0gZGVsaW0gKyAxOwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPnJlbW90ZV9tYWNbNF09c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKLQkJY3VyPWRlbGltKzE7Ci0JCW5wLT5yZW1vdGVfbWFjWzVdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCSpkZWxpbSA9IDA7CisJCW5wLT5yZW1vdGVfbWFjWzRdID0gc2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyID0gZGVsaW0gKyAxOworCQlucC0+cmVtb3RlX21hY1s1XSA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbW90ZSBldGhlcm5ldCBhZGRyZXNzICIKQEAgLTY1MywzNCArNjAyLDQ0IEBACiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwogCXN0cnVjdCBuZXRwb2xsX2luZm8gKm5waW5mbzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CiAKIAlpZiAobnAtPmRldl9uYW1lKQogCQluZGV2ID0gZGV2X2dldF9ieV9uYW1lKG5wLT5kZXZfbmFtZSk7CiAJaWYgKCFuZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGRvZXNuJ3QgZXhpc3QsIGFib3J0aW5nLlxuIiwKIAkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCW5wLT5kZXYgPSBuZGV2OwogCWlmICghbmRldi0+bnBpbmZvKSB7CiAJCW5waW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpucGluZm8pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFucGluZm8pCisJCWlmICghbnBpbmZvKSB7CisJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byByZWxlYXNlOworCQl9CiAKIAkJbnBpbmZvLT5yeF9mbGFncyA9IDA7CiAJCW5waW5mby0+cnhfbnAgPSBOVUxMOwogCQlzcGluX2xvY2tfaW5pdCgmbnBpbmZvLT5wb2xsX2xvY2spOwogCQlucGluZm8tPnBvbGxfb3duZXIgPSAtMTsKLQkJbnBpbmZvLT50cmllcyA9IE1BWF9SRVRSSUVTOworCiAJCXNwaW5fbG9ja19pbml0KCZucGluZm8tPnJ4X2xvY2spOwogCQlza2JfcXVldWVfaGVhZF9pbml0KCZucGluZm8tPmFycF90eCk7Ci0JfSBlbHNlCisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5waW5mby0+dHhxKTsKKwkJSU5JVF9XT1JLKCZucGluZm8tPnR4X3dvcmssIHF1ZXVlX3Byb2Nlc3MsIG5waW5mbyk7CisKKwkJYXRvbWljX3NldCgmbnBpbmZvLT5yZWZjbnQsIDEpOworCX0gZWxzZSB7CiAJCW5waW5mbyA9IG5kZXYtPm5waW5mbzsKKwkJYXRvbWljX2luYygmbnBpbmZvLT5yZWZjbnQpOworCX0KIAogCWlmICghbmRldi0+cG9sbF9jb250cm9sbGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwb2xsaW5nLCBhYm9ydGluZy5cbiIsCiAJCSAgICAgICBucC0+bmFtZSwgbnAtPmRldl9uYW1lKTsKKwkJZXJyID0gLUVOT1RTVVBQOwogCQlnb3RvIHJlbGVhc2U7CiAJfQogCkBAIC02OTEsMTMgKzY1MCwxNCBAQAogCQkgICAgICAgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7CiAKIAkJcnRubF9sb2NrKCk7Ci0JCWlmIChkZXZfY2hhbmdlX2ZsYWdzKG5kZXYsIG5kZXYtPmZsYWdzIHwgSUZGX1VQKSA8IDApIHsKKwkJZXJyID0gZGV2X29wZW4obmRldik7CisJCXJ0bmxfdW5sb2NrKCk7CisKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIG9wZW4gJXNcbiIsCi0JCQkgICAgICAgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7Ci0JCQlydG5sX3VubG9jaygpOworCQkJICAgICAgIG5wLT5uYW1lLCBuZGV2LT5uYW1lKTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQotCQlydG5sX3VubG9jaygpOwogCiAJCWF0bGVhc3QgPSBqaWZmaWVzICsgSFovMTA7CiAgCQlhdG1vc3QgPSBqaWZmaWVzICsgNCpIWjsKQEAgLTczNSw2ICs2OTUsNyBAQAogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBJUCBhZGRyZXNzIGZvciAlcywgYWJvcnRpbmdcbiIsCiAJCQkgICAgICAgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7CisJCQllcnIgPSAtRURFU1RBRERSUkVROwogCQkJZ290byByZWxlYXNlOwogCQl9CiAKQEAgLTc2Nyw5ICs3MjgsMTYgQEAKIAkJa2ZyZWUobnBpbmZvKTsKIAlucC0+ZGV2ID0gTlVMTDsKIAlkZXZfcHV0KG5kZXYpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBuZXRwb2xsX2luaXQodm9pZCkKK3sKKwlza2JfcXVldWVfaGVhZF9pbml0KCZza2JfcG9vbCk7CisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKG5ldHBvbGxfaW5pdCk7CisKIHZvaWQgbmV0cG9sbF9jbGVhbnVwKHN0cnVjdCBuZXRwb2xsICpucCkKIHsKIAlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm87CkBAIC03NzcsMTIgKzc0NSwyNSBAQAogCiAJaWYgKG5wLT5kZXYpIHsKIAkJbnBpbmZvID0gbnAtPmRldi0+bnBpbmZvOwotCQlpZiAobnBpbmZvICYmIG5waW5mby0+cnhfbnAgPT0gbnApIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZucGluZm8tPnJ4X2xvY2ssIGZsYWdzKTsKLQkJCW5waW5mby0+cnhfbnAgPSBOVUxMOwotCQkJbnBpbmZvLT5yeF9mbGFncyAmPSB+TkVUUE9MTF9SWF9FTkFCTEVEOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7CisJCWlmIChucGluZm8pIHsKKwkJCWlmIChucGluZm8tPnJ4X25wID09IG5wKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOworCQkJCW5waW5mby0+cnhfbnAgPSBOVUxMOworCQkJCW5waW5mby0+cnhfZmxhZ3MgJj0gfk5FVFBPTExfUlhfRU5BQkxFRDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucGluZm8tPnJ4X2xvY2ssIGZsYWdzKTsKKwkJCX0KKworCQkJbnAtPmRldi0+bnBpbmZvID0gTlVMTDsKKwkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZucGluZm8tPnJlZmNudCkpIHsKKwkJCQlza2JfcXVldWVfcHVyZ2UoJm5waW5mby0+YXJwX3R4KTsKKyAJCQkJc2tiX3F1ZXVlX3B1cmdlKCZucGluZm8tPnR4cSk7CisJCQkJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmbnBpbmZvLT50eF93b3JrKTsKKyAJCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCQkJCWtmcmVlKG5waW5mbyk7CisJCQl9CiAJCX0KKwogCQlkZXZfcHV0KG5wLT5kZXYpOwogCX0KIApAQCAtODA5LDQgKzc5MCwzIEBACiBFWFBPUlRfU1lNQk9MKG5ldHBvbGxfY2xlYW51cCk7CiBFWFBPUlRfU1lNQk9MKG5ldHBvbGxfc2VuZF91ZHApOwogRVhQT1JUX1NZTUJPTChuZXRwb2xsX3BvbGwpOwotRVhQT1JUX1NZTUJPTChuZXRwb2xsX3F1ZXVlKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggNzMzZDg2ZC4uMTg5N2EzYSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogI2RlZmluZSBTVkxBTl9UQUdfU0laRSh4KSAoKHgpLT5zdmxhbl9pZCA9PSAweGZmZmYgPyAwIDogNCkKIAogc3RydWN0IGZsb3dfc3RhdGUgewotCV9fdTMyIGN1cl9kYWRkcjsKKwlfX2JlMzIgY3VyX2RhZGRyOwogCWludCBjb3VudDsKIH07CiAKQEAgLTI4MiwxMCArMjgyLDEwIEBACiAJLyogSWYgd2UncmUgZG9pbmcgcmFuZ2VzLCByYW5kb20gb3IgaW5jcmVtZW50YWwsIHRoZW4gdGhpcwogCSAqIGRlZmluZXMgdGhlIG1pbi9tYXggZm9yIHRob3NlIHJhbmdlcy4KIAkgKi8KLQlfX3UzMiBzYWRkcl9taW47CS8qIGluY2x1c2l2ZSwgc291cmNlIElQIGFkZHJlc3MgKi8KLQlfX3UzMiBzYWRkcl9tYXg7CS8qIGV4Y2x1c2l2ZSwgc291cmNlIElQIGFkZHJlc3MgKi8KLQlfX3UzMiBkYWRkcl9taW47CS8qIGluY2x1c2l2ZSwgZGVzdCBJUCBhZGRyZXNzICovCi0JX191MzIgZGFkZHJfbWF4OwkvKiBleGNsdXNpdmUsIGRlc3QgSVAgYWRkcmVzcyAqLworCV9fYmUzMiBzYWRkcl9taW47CS8qIGluY2x1c2l2ZSwgc291cmNlIElQIGFkZHJlc3MgKi8KKwlfX2JlMzIgc2FkZHJfbWF4OwkvKiBleGNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCisJX19iZTMyIGRhZGRyX21pbjsJLyogaW5jbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KKwlfX2JlMzIgZGFkZHJfbWF4OwkvKiBleGNsdXNpdmUsIGRlc3QgSVAgYWRkcmVzcyAqLwogCiAJX191MTYgdWRwX3NyY19taW47CS8qIGluY2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCiAJX191MTYgdWRwX3NyY19tYXg7CS8qIGV4Y2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCkBAIC0zMTcsOCArMzE3LDggQEAKIAogCV9fdTMyIGN1cl9kc3RfbWFjX29mZnNldDsKIAlfX3UzMiBjdXJfc3JjX21hY19vZmZzZXQ7Ci0JX191MzIgY3VyX3NhZGRyOwotCV9fdTMyIGN1cl9kYWRkcjsKKwlfX2JlMzIgY3VyX3NhZGRyOworCV9fYmUzMiBjdXJfZGFkZHI7CiAJX191MTYgY3VyX3VkcF9kc3Q7CiAJX191MTYgY3VyX3VkcF9zcmM7CiAJX191MzIgY3VyX3BrdF9zaXplOwpAQCAtMzUwLDEwICszNTAsMTAgQEAKIH07CiAKIHN0cnVjdCBwa3RnZW5faGRyIHsKLQlfX3UzMiBwZ2hfbWFnaWM7Ci0JX191MzIgc2VxX251bTsKLQlfX3UzMiB0dl9zZWM7Ci0JX191MzIgdHZfdXNlYzsKKwlfX2JlMzIgcGdoX21hZ2ljOworCV9fYmUzMiBzZXFfbnVtOworCV9fYmUzMiB0dl9zZWM7CisJX19iZTMyIHR2X3VzZWM7CiB9OwogCiBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCB7CkBAIC0yMTYwLDcgKzIxNjAsNyBAQAogCQlmb3IoaSA9IDA7IGkgPCBwa3RfZGV2LT5ucl9sYWJlbHM7IGkrKykKIAkJCWlmIChwa3RfZGV2LT5sYWJlbHNbaV0gJiBNUExTX1NUQUNLX0JPVFRPTSkKIAkJCQlwa3RfZGV2LT5sYWJlbHNbaV0gPSBNUExTX1NUQUNLX0JPVFRPTSB8Ci0JCQkJCQkgICAgIChwa3RnZW5fcmFuZG9tKCkgJgorCQkJCQkgICAgICgoX19mb3JjZSBfX2JlMzIpcGt0Z2VuX3JhbmRvbSgpICYKIAkJCQkJCSAgICAgIGh0b25sKDB4MDAwZmZmZmYpKTsKIAl9CiAKQEAgLTIyMjAsMjkgKzIyMjAsMjUgQEAKIAkJaWYgKHBrdF9kZXYtPmNmbG93cyAmJiBwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCAhPSAwKSB7CiAJCQlwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5mbG93c1tmbG93XS5jdXJfZGFkZHI7CiAJCX0gZWxzZSB7Ci0KLQkJCWlmICgoaW1uID0gbnRvaGwocGt0X2Rldi0+ZGFkZHJfbWluKSkgPCAoaW14ID0KLQkJCQkJCQkJIG50b2hsKHBrdF9kZXYtPgotCQkJCQkJCQkgICAgICAgZGFkZHJfbWF4KSkpCi0JCQl7CisJCQlpbW4gPSBudG9obChwa3RfZGV2LT5kYWRkcl9taW4pOworCQkJaW14ID0gbnRvaGwocGt0X2Rldi0+ZGFkZHJfbWF4KTsKKwkJCWlmIChpbW4gPCBpbXgpIHsKIAkJCQlfX3UzMiB0OworCQkJCV9fYmUzMiBzOwogCQkJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBEU1RfUk5EKSB7CiAKLQkJCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikpICsKLQkJCQkJICAgICBpbW4pOwotCQkJCQl0ID0gaHRvbmwodCk7CisJCQkJCXQgPSBwa3RnZW5fcmFuZG9tKCkgJSAoaW14IC0gaW1uKSArIGltbjsKKwkJCQkJcyA9IGh0b25sKHQpOwogCi0JCQkJCXdoaWxlIChMT09QQkFDSyh0KSB8fCBNVUxUSUNBU1QodCkKLQkJCQkJICAgICAgIHx8IEJBRENMQVNTKHQpIHx8IFpFUk9ORVQodCkKLQkJCQkJICAgICAgIHx8IExPQ0FMX01DQVNUKHQpKSB7Ci0JCQkJCQl0ID0gKChwa3RnZW5fcmFuZG9tKCkgJQotCQkJCQkJICAgICAgKGlteCAtIGltbikpICsgaW1uKTsKLQkJCQkJCXQgPSBodG9ubCh0KTsKKwkJCQkJd2hpbGUgKExPT1BCQUNLKHMpIHx8IE1VTFRJQ0FTVChzKQorCQkJCQkgICAgICAgfHwgQkFEQ0xBU1MocykgfHwgWkVST05FVChzKQorCQkJCQkgICAgICAgfHwgTE9DQUxfTUNBU1QocykpIHsKKwkJCQkJCXQgPSAocGt0Z2VuX3JhbmRvbSgpICUKKwkJCQkJCSAgICAgIChpbXggLSBpbW4pKSArIGltbjsKKwkJCQkJCXMgPSBodG9ubCh0KTsKIAkJCQkJfQotCQkJCQlwa3RfZGV2LT5jdXJfZGFkZHIgPSB0OwotCQkJCX0KLQotCQkJCWVsc2UgeworCQkJCQlwa3RfZGV2LT5jdXJfZGFkZHIgPSBzOworCQkJCX0gZWxzZSB7CiAJCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfZGFkZHIpOwogCQkJCQl0Kys7CiAJCQkJCWlmICh0ID4gaW14KSB7CkBAIC0yMjcwLDcgKzIyNjYsNyBAQAogCiAJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCQkJcGt0X2Rldi0+Y3VyX2luNl9kYWRkci5zNl9hZGRyMzJbaV0gPQotCQkJCSAgICAoKHBrdGdlbl9yYW5kb20oKSB8CisJCQkJICAgICgoKF9fZm9yY2UgX19iZTMyKXBrdGdlbl9yYW5kb20oKSB8CiAJCQkJICAgICAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbaV0pICYKIAkJCQkgICAgIHBrdF9kZXYtPm1heF9pbjZfZGFkZHIuczZfYWRkcjMyW2ldKTsKIAkJCX0KQEAgLTIzNzcsNyArMjM3Myw3IEBACiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKIAltZW1jcHkoZXRoLCBwa3RfZGV2LT5oaCwgMTIpOwotCSoodTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOworCSooX19iZTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOwogCiAJLyogRXRoICsgSVBoICsgVURQaCArIG1wbHMgKi8KIAlkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplIC0gMTQgLSAyMCAtIDggLQpAQCAtMjQ5Nyw3ICsyNDkzLDcgQEAKIAljaGFyIHN1ZmZpeFsxNl07CiAJdW5zaWduZWQgaW50IHByZWZpeGxlbiA9IDA7CiAJdW5zaWduZWQgaW50IHN1ZmZpeGxlbiA9IDA7Ci0JX191MzIgdG1wOworCV9fYmUzMiB0bXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJaXBbaV0gPSAwOwpAQCAtMjcxMyw3ICsyNzA5LDcgQEAKIAl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKIAogCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7Ci0JKih1MTYgKikgJiBldGhbMTJdID0gcHJvdG9jb2w7CisJKihfX2JlMTYgKikgJiBldGhbMTJdID0gcHJvdG9jb2w7CiAKIAkvKiBFdGggKyBJUGggKyBVRFBoICsgbXBscyAqLwogCWRhdGFsZW4gPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgLSAxNCAtCkBAIC0yNzMyLDExICsyNzI4LDExIEBACiAJdWRwaC0+bGVuID0gaHRvbnMoZGF0YWxlbiArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAJdWRwaC0+Y2hlY2sgPSAwOwkvKiBObyBjaGVja3N1bSAqLwogCi0JKih1MzIgKikgaXBoID0gX19jb25zdGFudF9odG9ubCgweDYwMDAwMDAwKTsJLyogVmVyc2lvbiArIGZsb3cgKi8KKwkqKF9fYmUzMiAqKSBpcGggPSBfX2NvbnN0YW50X2h0b25sKDB4NjAwMDAwMDApOwkvKiBWZXJzaW9uICsgZmxvdyAqLwogCiAJaWYgKHBrdF9kZXYtPnRyYWZmaWNfY2xhc3MpIHsKIAkJLyogVmVyc2lvbiArIHRyYWZmaWMgY2xhc3MgKyBmbG93ICgwKSAqLwotCQkqKHUzMiAqKWlwaCB8PSBodG9ubCgweDYwMDAwMDAwIHwgKHBrdF9kZXYtPnRyYWZmaWNfY2xhc3MgPDwgMjApKTsKKwkJKihfX2JlMzIgKilpcGggfD0gaHRvbmwoMHg2MDAwMDAwMCB8IChwa3RfZGV2LT50cmFmZmljX2NsYXNzIDw8IDIwKSk7CiAJfQogCiAJaXBoLT5ob3BfbGltaXQgPSAzMjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jIGIvbmV0L2NvcmUvcmVxdWVzdF9zb2NrLmMKaW5kZXggNzllYmQ3NS4uNWYwODE4ZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcmVxdWVzdF9zb2NrLmMKKysrIGIvbmV0L2NvcmUvcmVxdWVzdF9zb2NrLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8bmV0L3JlcXVlc3Rfc29jay5oPgogCkBAIC0yOSwyMiArMzAsMzEgQEAKICAqIGl0IGlzIGFic29sdXRlbHkgbm90IGVub3VnaCBldmVuIGF0IDEwMGNvbm4vc2VjLiAyNTYgY3VyZXMgbW9zdAogICogb2YgcHJvYmxlbXMuIFRoaXMgdmFsdWUgaXMgYWRqdXN0ZWQgdG8gMTI4IGZvciB2ZXJ5IHNtYWxsIG1hY2hpbmVzCiAgKiAoPD0zMk1iIG9mIG1lbW9yeSkgYW5kIHRvIDEwMjQgb24gbm9ybWFsIG9yIGJldHRlciBvbmVzICg+PTI1Nk1iKS4KLSAqIEZ1cnRoZXIgaW5jcmVhc2luZyByZXF1aXJlcyB0byBjaGFuZ2UgaGFzaCB0YWJsZSBzaXplLgorICogTm90ZSA6IERvbnQgZm9yZ2V0IHNvbWF4Y29ubiB0aGF0IG1heSBsaW1pdCBiYWNrbG9nIHRvby4KICAqLwogaW50IHN5c2N0bF9tYXhfc3luX2JhY2tsb2cgPSAyNTY7CiAKIGludCByZXFza19xdWV1ZV9hbGxvYyhzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSwKLQkJICAgICAgY29uc3QgaW50IG5yX3RhYmxlX2VudHJpZXMpCisJCSAgICAgIHVuc2lnbmVkIGludCBucl90YWJsZV9lbnRyaWVzKQogewotCWNvbnN0IGludCBsb3B0X3NpemUgPSBzaXplb2Yoc3RydWN0IGxpc3Rlbl9zb2NrKSArCi0JCQkgICAgICBucl90YWJsZV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCByZXF1ZXN0X3NvY2sgKik7Ci0Jc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0ID0ga3phbGxvYyhsb3B0X3NpemUsIEdGUF9LRVJORUwpOworCXNpemVfdCBsb3B0X3NpemUgPSBzaXplb2Yoc3RydWN0IGxpc3Rlbl9zb2NrKTsKKwlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQ7CiAKKwlucl90YWJsZV9lbnRyaWVzID0gbWluX3QodTMyLCBucl90YWJsZV9lbnRyaWVzLCBzeXNjdGxfbWF4X3N5bl9iYWNrbG9nKTsKKwlucl90YWJsZV9lbnRyaWVzID0gbWF4X3QodTMyLCBucl90YWJsZV9lbnRyaWVzLCA4KTsKKwlucl90YWJsZV9lbnRyaWVzID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5yX3RhYmxlX2VudHJpZXMgKyAxKTsKKwlsb3B0X3NpemUgKz0gbnJfdGFibGVfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgcmVxdWVzdF9zb2NrICopOworCWlmIChsb3B0X3NpemUgPiBQQUdFX1NJWkUpCisJCWxvcHQgPSBfX3ZtYWxsb2MobG9wdF9zaXplLAorCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLAorCQkJUEFHRV9LRVJORUwpOworCWVsc2UKKwkJbG9wdCA9IGt6YWxsb2MobG9wdF9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAobG9wdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAobG9wdC0+bWF4X3FsZW5fbG9nID0gNjsKLQkgICAgICgxIDw8IGxvcHQtPm1heF9xbGVuX2xvZykgPCBzeXNjdGxfbWF4X3N5bl9iYWNrbG9nOworCWZvciAobG9wdC0+bWF4X3FsZW5fbG9nID0gMzsKKwkgICAgICgxIDw8IGxvcHQtPm1heF9xbGVuX2xvZykgPCBucl90YWJsZV9lbnRyaWVzOwogCSAgICAgbG9wdC0+bWF4X3FsZW5fbG9nKyspOwogCiAJZ2V0X3JhbmRvbV9ieXRlcygmbG9wdC0+aGFzaF9ybmQsIHNpemVvZihsb3B0LT5oYXNoX3JuZCkpOwpAQCAtNjUsOSArNzUsMTEgQEAKIHsKIAkvKiBtYWtlIGFsbCB0aGUgbGlzdGVuX29wdCBsb2NhbCB0byB1cyAqLwogCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdCA9IHJlcXNrX3F1ZXVlX3lhbmtfbGlzdGVuX3NrKHF1ZXVlKTsKKwlzaXplX3QgbG9wdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaXN0ZW5fc29jaykgKworCQlsb3B0LT5ucl90YWJsZV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCByZXF1ZXN0X3NvY2sgKik7CiAKIAlpZiAobG9wdC0+cWxlbiAhPSAwKSB7Ci0JCWludCBpOworCQl1bnNpZ25lZCBpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbG9wdC0+bnJfdGFibGVfZW50cmllczsgaSsrKSB7CiAJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7CkBAIC04MSw3ICs5MywxMCBAQAogCX0KIAogCUJVR19UUkFQKGxvcHQtPnFsZW4gPT0gMCk7Ci0Ja2ZyZWUobG9wdCk7CisJaWYgKGxvcHRfc2l6ZSA+IFBBR0VfU0laRSkKKwkJdmZyZWUobG9wdCk7CisJZWxzZQorCQlrZnJlZShsb3B0KTsKIH0KIAogRVhQT1JUX1NZTUJPTChyZXFza19xdWV1ZV9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggMDJmM2M3OS4uZTc2NTM5YSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTEwOCw3ICsxMDgsNiBAQAogCVtSVE1fRkFNKFJUTV9ORVdUQ0xBU1MpXSAgICA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjbXNnKSksCiAJW1JUTV9GQU0oUlRNX05FV1RGSUxURVIpXSAgID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNtc2cpKSwKIAlbUlRNX0ZBTShSVE1fTkVXQUNUSU9OKV0gICAgPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y2Ftc2cpKSwKLQlbUlRNX0ZBTShSVE1fTkVXUFJFRklYKV0gICAgPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydGdlbm1zZykpLAogCVtSVE1fRkFNKFJUTV9HRVRNVUxUSUNBU1QpXSA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0Z2VubXNnKSksCiAJW1JUTV9GQU0oUlRNX0dFVEFOWUNBU1QpXSAgID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKSwKIH07CkBAIC0yMTMsNiArMjEyLDI2IEBACiAJcmV0dXJuIG5sYV9uZXN0X2NhbmNlbChza2IsIG14KTsKIH0KIAoraW50IHJ0bmxfcHV0X2NhY2hlaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBpZCwKKwkJICAgICAgIHUzMiB0cywgdTMyIHRzYWdlLCBsb25nIGV4cGlyZXMsIHUzMiBlcnJvcikKK3sKKwlzdHJ1Y3QgcnRhX2NhY2hlaW5mbyBjaSA9IHsKKwkJLnJ0YV9sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBkc3QtPmxhc3R1c2UpLAorCQkucnRhX3VzZWQgPSBkc3QtPl9fdXNlLAorCQkucnRhX2NsbnRyZWYgPSBhdG9taWNfcmVhZCgmKGRzdC0+X19yZWZjbnQpKSwKKwkJLnJ0YV9lcnJvciA9IGVycm9yLAorCQkucnRhX2lkID0gIGlkLAorCQkucnRhX3RzID0gdHMsCisJCS5ydGFfdHNhZ2UgPSB0c2FnZSwKKwl9OworCisJaWYgKGV4cGlyZXMpCisJCWNpLnJ0YV9leHBpcmVzID0gamlmZmllc190b19jbG9ja190KGV4cGlyZXMpOworCisJcmV0dXJuIG5sYV9wdXQoc2tiLCBSVEFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChydG5sX3B1dF9jYWNoZWluZm8pOwogCiBzdGF0aWMgdm9pZCBzZXRfb3BlcnN0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgdHJhbnNpdGlvbikKIHsKQEAgLTI3Myw2ICsyOTIsMjUgQEAKIAlhLT50eF9jb21wcmVzc2VkID0gYi0+dHhfY29tcHJlc3NlZDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGlmX25sbXNnX3NpemUoaW50IGl3YnVmbGVuKQoreworCXJldHVybiBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopIC8qIElGTEFfSUZOQU1FICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopIC8qIElGTEFfUURJU0MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19pZm1hcCkpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBydG5sX2xpbmtfc3RhdHMpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKE1BWF9BRERSX0xFTikgLyogSUZMQV9BRERSRVNTICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoTUFYX0FERFJfTEVOKSAvKiBJRkxBX0JST0FEQ0FTVCAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfVFhRTEVOICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZMQV9XRUlHSFQgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX01UVSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfTElOSyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfTUFTVEVSICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMSkgLyogSUZMQV9PUEVSU1RBVEUgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJRkxBX0xJTktNT0RFICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoaXdidWZsZW4pOworfQorCiBzdGF0aWMgaW50IHJ0bmxfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICB2b2lkICppd2J1ZiwgaW50IGl3YnVmbGVuLCBpbnQgdHlwZSwgdTMyIHBpZCwKIAkJCSAgICB1MzIgc2VxLCB1MzIgY2hhbmdlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC01NTgsNyArNTk2LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAljaGFyICppd19idWYgPSBOVUxMLCAqaXcgPSBOVUxMOwogCWludCBpd19idWZfbGVuID0gMDsKLQlpbnQgZXJyLCBwYXlsb2FkOworCWludCBlcnI7CiAKIAllcnIgPSBubG1zZ19wYXJzZShubGgsIHNpemVvZigqaWZtKSwgdGIsIElGTEFfTUFYLCBpZmxhX3BvbGljeSk7CiAJaWYgKGVyciA8IDApCkBAIC01ODcsOSArNjI1LDcgQEAKIAl9CiAjZW5kaWYJLyogQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgKi8KIAotCXBheWxvYWQgPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykgKwotCQkJICAgICAgbmxhX3RvdGFsX3NpemUoaXdfYnVmX2xlbikpOwotCW5za2IgPSBubG1zZ19uZXcobmxtc2dfdG90YWxfc2l6ZShwYXlsb2FkKSwgR0ZQX0tFUk5FTCk7CisJbnNrYiA9IG5sbXNnX25ldyhpZl9ubG1zZ19zaXplKGl3X2J1Zl9sZW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAobnNrYiA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9CVUZTOwogCQlnb3RvIGVycm91dDsKQEAgLTU5NywxMCArNjMzLDggQEAKIAogCWVyciA9IHJ0bmxfZmlsbF9pZmluZm8obnNrYiwgZGV2LCBpdywgaXdfYnVmX2xlbiwgUlRNX05FV0xJTkssCiAJCQkgICAgICAgTkVUTElOS19DQihza2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsIDAsIDApOwotCWlmIChlcnIgPD0gMCkgewotCQlrZnJlZV9za2IobnNrYik7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwkvKiBmYWlsdXJlIGltcGlsaWVzIEJVRyBpbiBpZl9ubG1zZ19zaXplIG9yIHdpcmVsZXNzX3J0bmV0bGlua19nZXQgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX3VuaWNhc3QobnNrYiwgTkVUTElOS19DQihza2IpLnBpZCk7CiBlcnJvdXQ6CkBAIC02MzksMTUgKzY3MywxMyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBubG1zZ19uZXcoaWZfbmxtc2dfc2l6ZSgwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IHJ0bmxfZmlsbF9pZmluZm8oc2tiLCBkZXYsIE5VTEwsIDAsIHR5cGUsIDAsIDAsIGNoYW5nZSwgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGlmX25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9MSU5LLCBOVUxMLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggYjhiMTA2My4uOGUxYzM4NSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTU2LDcgKzU2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAKICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CkBAIC02Nyw2ICs2Niw4IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKKyNpbmNsdWRlICJrbWFwX3NrYi5oIgorCiBzdGF0aWMga21lbV9jYWNoZV90ICpza2J1ZmZfaGVhZF9jYWNoZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGttZW1fY2FjaGVfdCAqc2tidWZmX2ZjbG9uZV9jYWNoZSBfX3JlYWRfbW9zdGx5OwogCkBAIC00NzMsOCArNDc0LDggQEAKICNlbmRpZgogCUMocHJvdG9jb2wpOwogCW4tPmRlc3RydWN0b3IgPSBOVUxMOworCUMobWFyayk7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgotCUMobmZtYXJrKTsKIAlDKG5mY3QpOwogCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKIAlDKG5mY3RpbmZvKTsKQEAgLTUzNCw4ICs1MzUsOCBAQAogCW5ldy0+cGt0X3R5cGUJPSBvbGQtPnBrdF90eXBlOwogCW5ldy0+dHN0YW1wCT0gb2xkLT50c3RhbXA7CiAJbmV3LT5kZXN0cnVjdG9yID0gTlVMTDsKKwluZXctPm1hcmsJPSBvbGQtPm1hcms7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgotCW5ldy0+bmZtYXJrCT0gb2xkLT5uZm1hcms7CiAJbmV3LT5uZmN0CT0gb2xkLT5uZmN0OwogCW5mX2Nvbm50cmFja19nZXQob2xkLT5uZmN0KTsKIAluZXctPm5mY3RpbmZvCT0gb2xkLT5uZmN0aW5mbzsKQEAgLTEyNDAsOCArMTI0MSw4IEBACiAKIC8qIENoZWNrc3VtIHNrYiBkYXRhLiAqLwogCi11bnNpZ25lZCBpbnQgc2tiX2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCi0JCQkgIGludCBsZW4sIHVuc2lnbmVkIGludCBjc3VtKQorX193c3VtIHNrYl9jaGVja3N1bShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAorCQkJICBpbnQgbGVuLCBfX3dzdW0gY3N1bSkKIHsKIAlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOwogCWludCBpLCBjb3B5ID0gc3RhcnQgLSBvZmZzZXQ7CkBAIC0xMjY1LDcgKzEyNjYsNyBAQAogCiAJCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwogCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewotCQkJdW5zaWduZWQgaW50IGNzdW0yOworCQkJX193c3VtIGNzdW0yOwogCQkJdTggKnZhZGRyOwogCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCkBAIC0xMjk0LDcgKzEyOTUsNyBAQAogCiAJCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKIAkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7Ci0JCQkJdW5zaWduZWQgaW50IGNzdW0yOworCQkJCV9fd3N1bSBjc3VtMjsKIAkJCQlpZiAoY29weSA+IGxlbikKIAkJCQkJY29weSA9IGxlbjsKIAkJCQljc3VtMiA9IHNrYl9jaGVja3N1bShsaXN0LCBvZmZzZXQgLSBzdGFydCwKQEAgLTEzMTUsOCArMTMxNiw4IEBACiAKIC8qIEJvdGggb2YgYWJvdmUgaW4gb25lIGJvdHRsZS4gKi8KIAotdW5zaWduZWQgaW50IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKLQkJCQkgICAgdTggKnRvLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgY3N1bSkKK19fd3N1bSBza2JfY29weV9hbmRfY3N1bV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCisJCQkJICAgIHU4ICp0bywgaW50IGxlbiwgX193c3VtIGNzdW0pCiB7CiAJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKIAlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OwpAQCAtMTM0Miw3ICsxMzQzLDcgQEAKIAogCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKIAkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKLQkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCV9fd3N1bSBjc3VtMjsKIAkJCXU4ICp2YWRkcjsKIAkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKIApAQCAtMTM2OCw3ICsxMzY5LDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAogCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCV9fd3N1bSBjc3VtMjsKIAkJCWludCBlbmQ7CiAKIAkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CkBAIC0xMzk2LDcgKzEzOTcsNyBAQAogCiB2b2lkIHNrYl9jb3B5X2FuZF9jc3VtX2Rldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqdG8pCiB7Ci0JdW5zaWduZWQgaW50IGNzdW07CisJX193c3VtIGNzdW07CiAJbG9uZyBjc3N0YXJ0OwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCkBAIC0xNDE0LDkgKzE0MTUsOSBAQAogCQkJCQkgICAgICBza2ItPmxlbiAtIGNzc3RhcnQsIDApOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJbG9uZyBjc3N0dWZmID0gY3NzdGFydCArIHNrYi0+Y3N1bTsKKwkJbG9uZyBjc3N0dWZmID0gY3NzdGFydCArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAKLQkJKigodW5zaWduZWQgc2hvcnQgKikodG8gKyBjc3N0dWZmKSkgPSBjc3VtX2ZvbGQoY3N1bSk7CisJCSooKF9fc3VtMTYgKikodG8gKyBjc3N0dWZmKSkgPSBjc3VtX2ZvbGQoY3N1bSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggZWU2Y2QyNS4uNDE5YzdkMyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtMTExLDYgKzExMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTI3MCw3ICsyNzEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzb2NrX3F1ZXVlX3Jjdl9za2IpOwogCi1pbnQgc2tfcmVjZWl2ZV9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHNrX3JlY2VpdmVfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgaW50IG5lc3RlZCkKIHsKIAlpbnQgcmMgPSBORVRfUlhfU1VDQ0VTUzsKIApAQCAtMjc5LDcgKzI4MCwxMCBAQAogCiAJc2tiLT5kZXYgPSBOVUxMOwogCi0JYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAobmVzdGVkKQorCQliaF9sb2NrX3NvY2tfbmVzdGVkKHNrKTsKKwllbHNlCisJCWJoX2xvY2tfc29jayhzayk7CiAJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CiAJCS8qCiAJCSAqIHRyeWxvY2sgKyB1bmxvY2sgc2VtYW50aWNzOgpAQCAtMTUyNyw3ICsxNTMxLDcgQEAKIAlhdG9taWNfc2V0KCZzay0+c2tfcmVmY250LCAxKTsKIH0KIAotdm9pZCBmYXN0Y2FsbCBsb2NrX3NvY2soc3RydWN0IHNvY2sgKnNrKQordm9pZCBmYXN0Y2FsbCBsb2NrX3NvY2tfbmVzdGVkKHN0cnVjdCBzb2NrICpzaywgaW50IHN1YmNsYXNzKQogewogCW1pZ2h0X3NsZWVwKCk7CiAJc3Bpbl9sb2NrX2JoKCZzay0+c2tfbG9jay5zbG9jayk7CkBAIC0xNTM4LDExICsxNTQyLDExIEBACiAJLyoKIAkgKiBUaGUgc2tfbG9jayBoYXMgbXV0ZXhfbG9jaygpIHNlbWFudGljcyBoZXJlOgogCSAqLwotCW11dGV4X2FjcXVpcmUoJnNrLT5za19sb2NrLmRlcF9tYXAsIDAsIDAsIF9SRVRfSVBfKTsKKwltdXRleF9hY3F1aXJlKCZzay0+c2tfbG9jay5kZXBfbWFwLCBzdWJjbGFzcywgMCwgX1JFVF9JUF8pOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogfQogCi1FWFBPUlRfU1lNQk9MKGxvY2tfc29jayk7CitFWFBPUlRfU1lNQk9MKGxvY2tfc29ja19uZXN0ZWQpOwogCiB2b2lkIGZhc3RjYWxsIHJlbGVhc2Vfc29jayhzdHJ1Y3Qgc29jayAqc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IDAyNTM0MTMuLjFlNzViMTUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCkBAIC0yMSwxMCArMjEsNiBAQAogCiBleHRlcm4gaW50IHN5c2N0bF9jb3JlX2Rlc3Ryb3lfZGVsYXk7CiAKLSNpZmRlZiBDT05GSUdfTkVUX0RJVkVSVAotZXh0ZXJuIGNoYXIgc3lzY3RsX2RpdmVydF92ZXJzaW9uW107Ci0jZW5kaWYgLyogQ09ORklHX05FVF9ESVZFUlQgKi8KLQogI2lmZGVmIENPTkZJR19YRlJNCiBleHRlcm4gdTMyIHN5c2N0bF94ZnJtX2FldmVudF9ldGltZTsKIGV4dGVybiB1MzIgc3lzY3RsX3hmcm1fYWV2ZW50X3JzZXF0aDsKQEAgLTEwNSwxNiArMTAxLDYgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCiAJfSwKLSNpZmRlZiBDT05GSUdfTkVUX0RJVkVSVAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfRElWRVJUX1ZFUlNJT04sCi0JCS5wcm9jbmFtZQk9ICJkaXZlcnRfdmVyc2lvbiIsCi0JCS5kYXRhCQk9ICh2b2lkICopc3lzY3RsX2RpdmVydF92ZXJzaW9uLAotCQkubWF4bGVuCQk9IDMyLAotCQkubW9kZQkJPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9zdHJpbmcKLQl9LAotI2VuZGlmIC8qIENPTkZJR19ORVRfRElWRVJUICovCiAjaWZkZWYgQ09ORklHX1hGUk0KIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9DT1JFX0FFVkVOVF9FVElNRSwKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3V0aWxzLmMgYi9uZXQvY29yZS91dGlscy5jCmluZGV4IGQ5M2ZlNjQuLjYxNTU2MDYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3V0aWxzLmMKKysrIGIvbmV0L2NvcmUvdXRpbHMuYwpAQCAtODgsNyArODgsNyBAQAogI2RlZmluZSBJTjZQVE9OX05VTEwJCTB4MjAwMDAwMDAJLyogZmlyc3QvdGFpbCAqLwogI2RlZmluZSBJTjZQVE9OX1VOS05PV04JCTB4NDAwMDAwMDAKIAotc3RhdGljIGlubGluZSBpbnQgZGlnaXQyYmluKGNoYXIgYywgY2hhciBkZWxpbSkKK3N0YXRpYyBpbmxpbmUgaW50IGRpZ2l0MmJpbihjaGFyIGMsIGludCBkZWxpbSkKIHsKIAlpZiAoYyA9PSBkZWxpbSB8fCBjID09ICdcMCcpCiAJCXJldHVybiBJTjZQVE9OX0RFTElNOwpAQCAtOTksNyArOTksNyBAQAogCXJldHVybiBJTjZQVE9OX1VOS05PV047CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHhkaWdpdDJiaW4oY2hhciBjLCBjaGFyIGRlbGltKQorc3RhdGljIGlubGluZSBpbnQgeGRpZ2l0MmJpbihjaGFyIGMsIGludCBkZWxpbSkKIHsKIAlpZiAoYyA9PSBkZWxpbSB8fCBjID09ICdcMCcpCiAJCXJldHVybiBJTjZQVE9OX0RFTElNOwpAQCAtMTEzLDEyICsxMTMsMTQgQEAKIAkJcmV0dXJuIChJTjZQVE9OX1hESUdJVCB8IChjIC0gJ2EnICsgMTApKTsKIAlpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCiAJCXJldHVybiAoSU42UFRPTl9YRElHSVQgfCAoYyAtICdBJyArIDEwKSk7CisJaWYgKGRlbGltID09IC0xKQorCQlyZXR1cm4gSU42UFRPTl9ERUxJTTsKIAlyZXR1cm4gSU42UFRPTl9VTktOT1dOOwogfQogCiBpbnQgaW40X3B0b24oY29uc3QgY2hhciAqc3JjLCBpbnQgc3JjbGVuLAogCSAgICAgdTggKmRzdCwKLQkgICAgIGNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCisJICAgICBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCiB7CiAJY29uc3QgY2hhciAqczsKIAl1OCAqZDsKQEAgLTE3Myw3ICsxNzUsNyBAQAogCiBpbnQgaW42X3B0b24oY29uc3QgY2hhciAqc3JjLCBpbnQgc3JjbGVuLAogCSAgICAgdTggKmRzdCwKLQkgICAgIGNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCisJICAgICBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCiB7CiAJY29uc3QgY2hhciAqcywgKnRvayA9IE5VTEw7CiAJdTggKmQsICpkYyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9LY29uZmlnIGIvbmV0L2RjY3AvS2NvbmZpZwppbmRleCBlZjg5MTljLi5iOGE2OGRkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9LY29uZmlnCisrKyBiL25ldC9kY2NwL0tjb25maWcKQEAgLTM4LDYgKzM4LDkgQEAKIAktLS1oZWxwLS0tCiAJICBPbmx5IHVzZSB0aGlzIGlmIHlvdSdyZSBoYWNraW5nIERDQ1AuCiAKKwkgIFdoZW4gY29tcGlsaW5nIERDQ1AgYXMgYSBtb2R1bGUsIHRoaXMgZGVidWdnaW5nIG91dHB1dCBjYW4gYmUgdG9nZ2xlZAorCSAgYnkgc2V0dGluZyB0aGUgcGFyYW1ldGVyIGRjY3BfZGVidWcgb2YgdGhlIGBkY2NwJyBtb2R1bGUgdG8gMCBvciAxLgorCiAJICBKdXN0IHNheSBOLgogCiBjb25maWcgTkVUX0RDQ1BQUk9CRQpAQCAtNDksNyArNTIsNyBAQAogCURDQ1AgY29uZ2VzdGlvbiBhdm9pZGFuY2UgbW9kdWxlcy4gSWYgeW91IGRvbid0IHVuZGVyc3RhbmQKIAl3aGF0IHdhcyBqdXN0IHNhaWQsIHlvdSBkb24ndCBuZWVkIGl0OiBzYXkgTi4KIAotCURvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGUgcGFja2V0IGdlbmVyYXRvciBjYW4gYmUgZm91bmQKKwlEb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgRENDUCBjb25uZWN0aW9uIHByb2JpbmcgY2FuIGJlIGZvdW5kCiAJYXQgaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvRGNjcFByb2JlCiAKIAlUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9NYWtlZmlsZSBiL25ldC9kY2NwL01ha2VmaWxlCmluZGV4IDE3ZWQ5OWMuLmY0Zjg3OTMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL01ha2VmaWxlCisrKyBiL25ldC9kY2NwL01ha2VmaWxlCkBAIC0xLDEzICsxLDEzIEBACi1vYmotJChDT05GSUdfSVBWNikgKz0gZGNjcF9pcHY2Lm8KLQotZGNjcF9pcHY2LXkgOj0gaXB2Ni5vCi0KIG9iai0kKENPTkZJR19JUF9EQ0NQKSArPSBkY2NwLm8gZGNjcF9pcHY0Lm8KIAogZGNjcC15IDo9IGNjaWQubyBmZWF0Lm8gaW5wdXQubyBtaW5pc29ja3MubyBvcHRpb25zLm8gb3V0cHV0Lm8gcHJvdG8ubyB0aW1lci5vCiAKIGRjY3BfaXB2NC15IDo9IGlwdjQubwogCisjIGJ1aWxkIGRjY3BfaXB2NiBhcyBtb2R1bGUgd2hlbmV2ZXIgZWl0aGVyIElQdjYgb3IgRENDUCBpcyBhIG1vZHVsZQorb2JqLSQoc3Vic3QgeSwkKENPTkZJR19JUF9EQ0NQKSwkKENPTkZJR19JUFY2KSkgKz0gZGNjcF9pcHY2Lm8KK2RjY3BfaXB2Ni15IDo9IGlwdjYubworCiBkY2NwLSQoQ09ORklHX0lQX0RDQ1BfQUNLVkVDKSArPSBhY2t2ZWMubwogCiBvYmotJChDT05GSUdfSU5FVF9EQ0NQX0RJQUcpICs9IGRjY3BfZGlhZy5vCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9hY2t2ZWMuYyBiL25ldC9kY2NwL2Fja3ZlYy5jCmluZGV4IGY4MjA4ODcuLmJkZjFiYjcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2Fja3ZlYy5jCisrKyBiL25ldC9kY2NwL2Fja3ZlYy5jCkBAIC02NywxNSArNjcsMTYgQEAKIGludCBkY2NwX2luc2VydF9vcHRpb25fYWNrdmVjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCi0JY29uc3QgY2hhciAqZGVidWdfcHJlZml4ID0gZHAtPmRjY3BzX3JvbGUgPT0gRENDUF9ST0xFX0NMSUVOVCA/Ci0JCQkJIkNMSUVOVCB0eDogIiA6ICJzZXJ2ZXIgdHg6ICI7Ci0jZW5kaWYKIAlzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmF2ID0gZHAtPmRjY3BzX2hjX3J4X2Fja3ZlYzsKLQlpbnQgbGVuID0gYXYtPmRjY3Bhdl92ZWNfbGVuICsgMjsKKwkvKiBGaWd1cmUgb3V0IGhvdyBtYW55IG9wdGlvbnMgZG8gd2UgbmVlZCB0byByZXByZXNlbnQgdGhlIGFja3ZlYyAqLworCWNvbnN0IHUxNiBucl9vcHRzID0gKGF2LT5kY2NwYXZfdmVjX2xlbiArCisJCQkgICAgIERDQ1BfTUFYX0FDS1ZFQ19PUFRfTEVOIC0gMSkgLworCQkJICAgIERDQ1BfTUFYX0FDS1ZFQ19PUFRfTEVOOworCXUxNiBsZW4gPSBhdi0+ZGNjcGF2X3ZlY19sZW4gKyAyICogbnJfb3B0cywgaTsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJdTMyIGVsYXBzZWRfdGltZTsKLQl1bnNpZ25lZCBjaGFyICp0bywgKmZyb207CisJY29uc3QgdW5zaWduZWQgY2hhciAqdGFpbCwgKmZyb207CisJdW5zaWduZWQgY2hhciAqdG87CiAJc3RydWN0IGRjY3BfYWNrdmVjX3JlY29yZCAqYXZyOwogCiAJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX29wdF9sZW4gKyBsZW4gPiBEQ0NQX01BWF9PUFRfTEVOKQpAQCAtOTQsMjQgKzk1LDM3IEBACiAKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9vcHRfbGVuICs9IGxlbjsKIAotCXRvICAgID0gc2tiX3B1c2goc2tiLCBsZW4pOwotCSp0bysrID0gRENDUE9fQUNLX1ZFQ1RPUl8wOwotCSp0bysrID0gbGVuOwotCisJdG8gICA9IHNrYl9wdXNoKHNrYiwgbGVuKTsKIAlsZW4gID0gYXYtPmRjY3Bhdl92ZWNfbGVuOwogCWZyb20gPSBhdi0+ZGNjcGF2X2J1ZiArIGF2LT5kY2NwYXZfYnVmX2hlYWQ7CisJdGFpbCA9IGF2LT5kY2NwYXZfYnVmICsgRENDUF9NQVhfQUNLVkVDX0xFTjsKIAotCS8qIENoZWNrIGlmIGJ1Zl9oZWFkIHdyYXBzICovCi0JaWYgKChpbnQpYXYtPmRjY3Bhdl9idWZfaGVhZCArIGxlbiA+IERDQ1BfTUFYX0FDS1ZFQ19MRU4pIHsKLQkJY29uc3QgdTMyIHRhaWxzaXplID0gRENDUF9NQVhfQUNLVkVDX0xFTiAtIGF2LT5kY2NwYXZfYnVmX2hlYWQ7CisJZm9yIChpID0gMDsgaSA8IG5yX29wdHM7ICsraSkgeworCQlpbnQgY29weWxlbiA9IGxlbjsKIAotCQltZW1jcHkodG8sIGZyb20sIHRhaWxzaXplKTsKLQkJdG8gICArPSB0YWlsc2l6ZTsKLQkJbGVuICAtPSB0YWlsc2l6ZTsKLQkJZnJvbSA9IGF2LT5kY2NwYXZfYnVmOworCQlpZiAobGVuID4gRENDUF9NQVhfQUNLVkVDX09QVF9MRU4pCisJCQljb3B5bGVuID0gRENDUF9NQVhfQUNLVkVDX09QVF9MRU47CisKKwkJKnRvKysgPSBEQ0NQT19BQ0tfVkVDVE9SXzA7CisJCSp0bysrID0gY29weWxlbiArIDI7CisKKwkJLyogQ2hlY2sgaWYgYnVmX2hlYWQgd3JhcHMgKi8KKwkJaWYgKGZyb20gKyBjb3B5bGVuID4gdGFpbCkgeworCQkJY29uc3QgdTE2IHRhaWxzaXplID0gdGFpbCAtIGZyb207CisKKwkJCW1lbWNweSh0bywgZnJvbSwgdGFpbHNpemUpOworCQkJdG8JKz0gdGFpbHNpemU7CisJCQlsZW4JLT0gdGFpbHNpemU7CisJCQljb3B5bGVuCS09IHRhaWxzaXplOworCQkJZnJvbQk9IGF2LT5kY2NwYXZfYnVmOworCQl9CisKKwkJbWVtY3B5KHRvLCBmcm9tLCBjb3B5bGVuKTsKKwkJZnJvbSArPSBjb3B5bGVuOworCQl0byAgICs9IGNvcHlsZW47CisJCWxlbiAgLT0gY29weWxlbjsKIAl9CiAKLQltZW1jcHkodG8sIGZyb20sIGxlbik7CiAJLyoKIAkgKglGcm9tIFJGQyA0MzQwLCBBLjI6CiAJICoKQEAgLTEyOSw5ICsxNDMsOSBAQAogCiAJZGNjcF9hY2t2ZWNfaW5zZXJ0X2F2cihhdiwgYXZyKTsKIAotCWRjY3BfcHJfZGVidWcoIiVzQUNLIFZlY3RvciAwLCBsZW49JWQsIGFja19zZXFubz0lbGx1LCAiCisJZGNjcF9wcl9kZWJ1ZygiJXMgQUNLIFZlY3RvciAwLCBsZW49JWQsIGFja19zZXFubz0lbGx1LCAiCiAJCSAgICAgICJhY2tfYWNrbm89JWxsdVxuIiwKLQkJICAgICAgZGVidWdfcHJlZml4LCBhdnItPmRjY3BhdnJfc2VudF9sZW4sCisJCSAgICAgIGRjY3Bfcm9sZShzayksIGF2ci0+ZGNjcGF2cl9zZW50X2xlbiwKIAkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdnItPmRjY3BhdnJfYWNrX3NlcW5vLAogCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWF2ci0+ZGNjcGF2cl9hY2tfYWNrbm8pOwogCXJldHVybiAwOwpAQCAtMTQ1LDcgKzE1OSw2IEBACiAJCWF2LT5kY2NwYXZfYnVmX2hlYWQJPSBEQ0NQX01BWF9BQ0tWRUNfTEVOIC0gMTsKIAkJYXYtPmRjY3Bhdl9idWZfYWNrbm8JPSBEQ0NQX01BWF9TRVFOTyArIDE7CiAJCWF2LT5kY2NwYXZfYnVmX25vbmNlID0gYXYtPmRjY3Bhdl9idWZfbm9uY2UgPSAwOwotCQlhdi0+ZGNjcGF2X2Fja19wdHIJPSAwOwogCQlhdi0+ZGNjcGF2X3RpbWUudHZfc2VjCT0gMDsKIAkJYXYtPmRjY3Bhdl90aW1lLnR2X3VzZWMJPSAwOwogCQlhdi0+ZGNjcGF2X3ZlY19sZW4JPSAwOwpAQCAtMTc0LDEzICsxODcsMTMgQEAKIH0KIAogc3RhdGljIGlubGluZSB1OCBkY2NwX2Fja3ZlY19zdGF0ZShjb25zdCBzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmF2LAotCQkJCSAgIGNvbnN0IHU4IGluZGV4KQorCQkJCSAgIGNvbnN0IHUzMiBpbmRleCkKIHsKIAlyZXR1cm4gYXYtPmRjY3Bhdl9idWZbaW5kZXhdICYgRENDUF9BQ0tWRUNfU1RBVEVfTUFTSzsKIH0KIAogc3RhdGljIGlubGluZSB1OCBkY2NwX2Fja3ZlY19sZW4oY29uc3Qgc3RydWN0IGRjY3BfYWNrdmVjICphdiwKLQkJCQkgY29uc3QgdTggaW5kZXgpCisJCQkJIGNvbnN0IHUzMiBpbmRleCkKIHsKIAlyZXR1cm4gYXYtPmRjY3Bhdl9idWZbaW5kZXhdICYgRENDUF9BQ0tWRUNfTEVOX01BU0s7CiB9CkBAIC0yODAsNyArMjkzLDcgQEAKIAkJICoJY291bGQgcmVkdWNlIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgc2Nhbi4pCiAJCSAqLwogCQl1NjQgZGVsdGEgPSBkY2NwX2RlbHRhX3NlcW5vKGFja25vLCBhdi0+ZGNjcGF2X2J1Zl9hY2tubyk7Ci0JCXU4IGluZGV4ID0gYXYtPmRjY3Bhdl9idWZfaGVhZDsKKwkJdTMyIGluZGV4ID0gYXYtPmRjY3Bhdl9idWZfaGVhZDsKIAogCQl3aGlsZSAoMSkgewogCQkJY29uc3QgdTggbGVuID0gZGNjcF9hY2t2ZWNfbGVuKGF2LCBpbmRleCk7CkBAIC0zMjIsMjEgKzMzNSwxOCBAQAogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCiB2b2lkIGRjY3BfYWNrdmVjdG9yX3ByaW50KGNvbnN0IHU2NCBhY2tubywgY29uc3QgdW5zaWduZWQgY2hhciAqdmVjdG9yLCBpbnQgbGVuKQogewotCWlmICghZGNjcF9kZWJ1ZykKLQkJcmV0dXJuOwotCi0JcHJpbnRrKCJBQ0sgdmVjdG9yIGxlbj0lZCwgYWNrbm89JWxsdSB8IiwgbGVuLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFja25vKTsKKwlkY2NwX3ByX2RlYnVnX2NhdCgiQUNLIHZlY3RvciBsZW49JWQsIGFja25vPSVsbHUgfCIsIGxlbiwKKwkJCSAJCSh1bnNpZ25lZCBsb25nIGxvbmcpYWNrbm8pOwogCiAJd2hpbGUgKGxlbi0tKSB7CiAJCWNvbnN0IHU4IHN0YXRlID0gKCp2ZWN0b3IgJiBEQ0NQX0FDS1ZFQ19TVEFURV9NQVNLKSA+PiA2OwogCQljb25zdCB1OCBybCA9ICp2ZWN0b3IgJiBEQ0NQX0FDS1ZFQ19MRU5fTUFTSzsKIAotCQlwcmludGsoIiVkLCVkfCIsIHN0YXRlLCBybCk7CisJCWRjY3BfcHJfZGVidWdfY2F0KCIlZCwlZHwiLCBzdGF0ZSwgcmwpOwogCQkrK3ZlY3RvcjsKIAl9CiAKLQlwcmludGsoIlxuIik7CisJZGNjcF9wcl9kZWJ1Z19jYXQoIlxuIik7CiB9CiAKIHZvaWQgZGNjcF9hY2t2ZWNfcHJpbnQoY29uc3Qgc3RydWN0IGRjY3BfYWNrdmVjICphdikKQEAgLTM4MCwyNCArMzkwLDIwIEBACiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGF2ciwgJmF2LT5kY2NwYXZfcmVjb3JkcywgZGNjcGF2cl9ub2RlKSB7CiAJCWlmIChhY2tubyA9PSBhdnItPmRjY3BhdnJfYWNrX3NlcW5vKSB7Ci0jaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKLQkJCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0JCQljb25zdCBjaGFyICpkZWJ1Z19wcmVmaXggPSBkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KLQkJCQkJCSJDTElFTlQgcnggYWNrOiAiIDogInNlcnZlciByeCBhY2s6ICI7Ci0jZW5kaWYKLQkJCWRjY3BfcHJfZGVidWcoIiVzQUNLIHBhY2tldCAwLCBsZW49JWQsIGFja19zZXFubz0lbGx1LCAiCisJCQlkY2NwX3ByX2RlYnVnKCIlcyBBQ0sgcGFja2V0IDAsIGxlbj0lZCwgYWNrX3NlcW5vPSVsbHUsICIKIAkJCQkgICAgICAiYWNrX2Fja25vPSVsbHUsIEFDS0VEIVxuIiwKLQkJCQkgICAgICBkZWJ1Z19wcmVmaXgsIDEsCisJCQkJICAgICAgZGNjcF9yb2xlKHNrKSwgMSwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8sCiAJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdnItPmRjY3BhdnJfYWNrX2Fja25vKTsKIAkJCWRjY3BfYWNrdmVjX3Rocm93X3JlY29yZChhdiwgYXZyKTsKIAkJCWJyZWFrOwotCQl9CisJCX0gZWxzZSBpZiAoYXZyLT5kY2NwYXZyX2Fja19zZXFubyA+IGFja25vKQorCQkJYnJlYWs7IC8qIG9sZCBuZXdzICovCiAJfQogfQogCiBzdGF0aWMgdm9pZCBkY2NwX2Fja3ZlY19jaGVja19yY3ZfYWNrdmVjdG9yKHN0cnVjdCBkY2NwX2Fja3ZlYyAqYXYsCi0JCQkJCSAgICBzdHJ1Y3Qgc29jayAqc2ssIHU2NCBhY2tubywKKwkJCQkJICAgIHN0cnVjdCBzb2NrICpzaywgdTY0ICphY2tubywKIAkJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGVuLAogCQkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdmVjdG9yKQogewpAQCAtNDIwLDcgKzQyNiw3IEBACiAJCWNvbnN0IHU4IHJsID0gKnZlY3RvciAmIERDQ1BfQUNLVkVDX0xFTl9NQVNLOwogCQl1NjQgYWNrbm9fZW5kX3JsOwogCi0JCWRjY3Bfc2V0X3NlcW5vKCZhY2tub19lbmRfcmwsIGFja25vIC0gcmwpOworCQlkY2NwX3NldF9zZXFubygmYWNrbm9fZW5kX3JsLCAqYWNrbm8gLSBybCk7CiAKIAkJLyoKIAkJICogSWYgb3VyIEFWUiBzZXF1ZW5jZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHRoZSBhY2ssIGdvCkBAIC00MjgsMjUgKzQzNCwxOSBAQAogCQkgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGF2ciwgJmF2LT5kY2NwYXZfcmVjb3JkcywKIAkJCQkJIGRjY3BhdnJfbm9kZSkgewotCQkJaWYgKCFhZnRlcjQ4KGF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8sIGFja25vKSkKKwkJCWlmICghYWZ0ZXI0OChhdnItPmRjY3BhdnJfYWNrX3NlcW5vLCAqYWNrbm8pKQogCQkJCWdvdG8gZm91bmQ7CiAJCX0KIAkJLyogRW5kIG9mIHRoZSBkY2NwYXZfcmVjb3JkcyBsaXN0LCBub3QgZm91bmQsIGV4aXQgKi8KIAkJYnJlYWs7CiBmb3VuZDoKLQkJaWYgKGJldHdlZW40OChhdnItPmRjY3BhdnJfYWNrX3NlcW5vLCBhY2tub19lbmRfcmwsIGFja25vKSkgeworCQlpZiAoYmV0d2VlbjQ4KGF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8sIGFja25vX2VuZF9ybCwgKmFja25vKSkgewogCQkJY29uc3QgdTggc3RhdGUgPSAqdmVjdG9yICYgRENDUF9BQ0tWRUNfU1RBVEVfTUFTSzsKIAkJCWlmIChzdGF0ZSAhPSBEQ0NQX0FDS1ZFQ19TVEFURV9OT1RfUkVDRUlWRUQpIHsKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9ERUJVRwotCQkJCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0JCQkJY29uc3QgY2hhciAqZGVidWdfcHJlZml4ID0KLQkJCQkJZHAtPmRjY3BzX3JvbGUgPT0gRENDUF9ST0xFX0NMSUVOVCA/Ci0JCQkJCSJDTElFTlQgcnggYWNrOiAiIDogInNlcnZlciByeCBhY2s6ICI7Ci0jZW5kaWYKLQkJCQlkY2NwX3ByX2RlYnVnKCIlc0FDSyB2ZWN0b3IgMCwgbGVuPSVkLCAiCisJCQkJZGNjcF9wcl9kZWJ1ZygiJXMgQUNLIHZlY3RvciAwLCBsZW49JWQsICIKIAkJCQkJICAgICAgImFja19zZXFubz0lbGx1LCBhY2tfYWNrbm89JWxsdSwgIgogCQkJCQkgICAgICAiQUNLRUQhXG4iLAotCQkJCQkgICAgICBkZWJ1Z19wcmVmaXgsIGxlbiwKKwkJCQkJICAgICAgZGNjcF9yb2xlKHNrKSwgbGVuLAogCQkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQogCQkJCQkgICAgICBhdnItPmRjY3BhdnJfYWNrX3NlcW5vLAogCQkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQpAQCAtNDYwLDI3ICs0NjAsMjMgQEAKIAkJCSAqLwogCQl9CiAKLQkJZGNjcF9zZXRfc2Vxbm8oJmFja25vLCBhY2tub19lbmRfcmwgLSAxKTsKKwkJZGNjcF9zZXRfc2Vxbm8oYWNrbm8sIGFja25vX2VuZF9ybCAtIDEpOwogCQkrK3ZlY3RvcjsKIAl9CiB9CiAKIGludCBkY2NwX2Fja3ZlY19wYXJzZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgIGNvbnN0IHU4IG9wdCwgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCisJCSAgICAgIHU2NCAqYWNrbm8sIGNvbnN0IHU4IG9wdCwgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCiB7Ci0JaWYgKGxlbiA+IERDQ1BfTUFYX0FDS1ZFQ19MRU4pCisJaWYgKGxlbiA+IERDQ1BfTUFYX0FDS1ZFQ19PUFRfTEVOKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBkY2NwX2Fja3ZlY3Rvcl9wcmludChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxLCB2YWx1ZSwgbGVuKTsgKi8KIAlkY2NwX2Fja3ZlY19jaGVja19yY3ZfYWNrdmVjdG9yKGRjY3Bfc2soc2spLT5kY2Nwc19oY19yeF9hY2t2ZWMsIHNrLAotCQkJCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxLAotCQkJCSAgICAgICAgbGVuLCB2YWx1ZSk7CisJCQkJCWFja25vLCBsZW4sIHZhbHVlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNoYXIgZGNjcF9hY2t2ZWNfc2xhYl9tc2dbXSBfX2luaXRkYXRhID0KLQlLRVJOX0NSSVQgIkRDQ1A6IFVuYWJsZSB0byBjcmVhdGUgYWNrIHZlY3RvcnMgc2xhYiBjYWNoZXNcbiI7Ci0KIGludCBfX2luaXQgZGNjcF9hY2t2ZWNfaW5pdCh2b2lkKQogewogCWRjY3BfYWNrdmVjX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZGNjcF9hY2t2ZWMiLApAQCAtNTAyLDcgKzQ5OCw3IEBACiAJa21lbV9jYWNoZV9kZXN0cm95KGRjY3BfYWNrdmVjX3NsYWIpOwogCWRjY3BfYWNrdmVjX3NsYWIgPSBOVUxMOwogb3V0X2VycjoKLQlwcmludGsoZGNjcF9hY2t2ZWNfc2xhYl9tc2cpOworCURDQ1BfQ1JJVCgiVW5hYmxlIHRvIGNyZWF0ZSBBY2sgVmVjdG9yIHNsYWIgY2FjaGUiKTsKIAlyZXR1cm4gLUVOT0JVRlM7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2Fja3ZlYy5oIGIvbmV0L2RjY3AvYWNrdmVjLmgKaW5kZXggY2Y4ZjIwYy4uOTY1MDRhMyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvYWNrdmVjLmgKKysrIGIvbmV0L2RjY3AvYWNrdmVjLmgKQEAgLTE3LDcgKzE3LDkgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBSZWFkIGFib3V0IHRoZSBFQ04gbm9uY2UgdG8gc2VlIHdoeSBpdCBpcyAyNTMgKi8KLSNkZWZpbmUgRENDUF9NQVhfQUNLVkVDX0xFTiAyNTMKKyNkZWZpbmUgRENDUF9NQVhfQUNLVkVDX09QVF9MRU4gMjUzCisvKiBXZSBjYW4gc3ByZWFkIGFuIGFjayB2ZWN0b3IgYWNyb3NzIG11bHRpcGxlIG9wdGlvbnMgKi8KKyNkZWZpbmUgRENDUF9NQVhfQUNLVkVDX0xFTiAoRENDUF9NQVhfQUNLVkVDX09QVF9MRU4gKiAyKQogCiAjZGVmaW5lIERDQ1BfQUNLVkVDX1NUQVRFX1JFQ0VJVkVECTAKICNkZWZpbmUgRENDUF9BQ0tWRUNfU1RBVEVfRUNOX01BUktFRAkoMSA8PCA2KQpAQCAtNDEsNyArNDMsNiBAQAogICogQWNrIFZlY3RvcnMgaXQgaGFzIHJlY2VudGx5IHNlbnQuIEZvciBlYWNoIHBhY2tldCBzZW50IGNhcnJ5aW5nIGFuCiAgKiBBY2sgVmVjdG9yLCBpdCByZW1lbWJlcnMgZm91ciB2YXJpYWJsZXM6CiAgKgotICogQGRjY3Bhdl9hY2tfcHRyIC0gdGhlIHZhbHVlIG9mIGJ1Zl9oZWFkIGF0IHRoZSB0aW1lIG9mIGFja25vd2xlZGdlbWVudC4KICAqIEBkY2NwYXZfcmVjb3JkcyAtIGxpc3Qgb2YgZGNjcF9hY2t2ZWNfcmVjb3JkCiAgKiBAZGNjcGF2X2Fja19ub25jZSAtIHRoZSBvbmUtYml0IHN1bSBvZiB0aGUgRUNOIE5vbmNlcyBmb3IgYWxsIFN0YXRlIDAuCiAgKgpAQCAtNTIsOSArNTMsOCBAQAogCXU2NAkJZGNjcGF2X2J1Zl9hY2tubzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRjY3Bhdl9yZWNvcmRzOwogCXN0cnVjdCB0aW1ldmFsCWRjY3Bhdl90aW1lOwotCXU4CQlkY2NwYXZfYnVmX2hlYWQ7Ci0JdTgJCWRjY3Bhdl9hY2tfcHRyOwotCXU4CQlkY2NwYXZfdmVjX2xlbjsKKwl1MTYJCWRjY3Bhdl9idWZfaGVhZDsKKwl1MTYJCWRjY3Bhdl92ZWNfbGVuOwogCXU4CQlkY2NwYXZfYnVmX25vbmNlOwogCXU4CQlkY2NwYXZfYWNrX25vbmNlOwogCXU4CQlkY2NwYXZfYnVmW0RDQ1BfTUFYX0FDS1ZFQ19MRU5dOwpAQCAtNzcsOSArNzcsOSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZGNjcGF2cl9ub2RlOwogCXU2NAkJIGRjY3BhdnJfYWNrX3NlcW5vOwogCXU2NAkJIGRjY3BhdnJfYWNrX2Fja25vOwotCXU4CQkgZGNjcGF2cl9hY2tfcHRyOworCXUxNgkJIGRjY3BhdnJfYWNrX3B0cjsKKwl1MTYJCSBkY2NwYXZyX3NlbnRfbGVuOwogCXU4CQkgZGNjcGF2cl9hY2tfbm9uY2U7Ci0JdTgJCSBkY2NwYXZyX3NlbnRfbGVuOwogfTsKIAogc3RydWN0IHNvY2s7CkBAIC05OCw3ICs5OCw4IEBACiBleHRlcm4gdm9pZCBkY2NwX2Fja3ZlY19jaGVja19yY3ZfYWNrbm8oc3RydWN0IGRjY3BfYWNrdmVjICphdiwKIAkJCQkJc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1NjQgYWNrbm8pOwogZXh0ZXJuIGludCBkY2NwX2Fja3ZlY19wYXJzZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIGNvbnN0IHU4IG9wdCwgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pOworCQkJICAgICB1NjQgKmFja25vLCBjb25zdCB1OCBvcHQsCisJCQkgICAgIGNvbnN0IHU4ICp2YWx1ZSwgY29uc3QgdTggbGVuKTsKIAogZXh0ZXJuIGludCBkY2NwX2luc2VydF9vcHRpb25fYWNrdmVjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKQEAgLTEzNyw3ICsxMzgsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBkY2NwX2Fja3ZlY19wYXJzZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IHU4IG9wdCwgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCisJCQkJICAgIGNvbnN0IHU2NCAqYWNrbm8sIGNvbnN0IHU4IG9wdCwKKwkJCQkgICAgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCiB7CiAJcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZC5oIGIvbmV0L2RjY3AvY2NpZC5oCmluZGV4IGY3ZWI2YzYuLmM3YzI5NTEgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWQuaAorKysgYi9uZXQvZGNjcC9jY2lkLmgKQEAgLTUyLDkgKzUyLDkgQEAKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIGxlbiwgdTE2IGlkeCwKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyKiB2YWx1ZSk7CiAJaW50CQkoKmNjaWRfaGNfdHhfc2VuZF9wYWNrZXQpKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbik7Ci0Jdm9pZAkJKCpjY2lkX2hjX3R4X3BhY2tldF9zZW50KShzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlLAotCQkJCQkJICBpbnQgbGVuKTsKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZAkJKCpjY2lkX2hjX3R4X3BhY2tldF9zZW50KShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgIGludCBtb3JlLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAl2b2lkCQkoKmNjaWRfaGNfcnhfZ2V0X2luZm8pKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgICAgIHN0cnVjdCB0Y3BfaW5mbyAqaW5mbyk7CiAJdm9pZAkJKCpjY2lkX2hjX3R4X2dldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssCkBAIC05NCwxNiArOTQsMTYgQEAKIGV4dGVybiB2b2lkIGNjaWRfaGNfdHhfZGVsZXRlKHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2spOwogCiBzdGF0aWMgaW5saW5lIGludCBjY2lkX2hjX3R4X3NlbmRfcGFja2V0KHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgcmMgPSAwOwogCWlmIChjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9zZW5kX3BhY2tldCAhPSBOVUxMKQotCQlyYyA9IGNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3R4X3NlbmRfcGFja2V0KHNrLCBza2IsIGxlbik7CisJCXJjID0gY2NpZC0+Y2NpZF9vcHMtPmNjaWRfaGNfdHhfc2VuZF9wYWNrZXQoc2ssIHNrYik7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2NpZF9oY190eF9wYWNrZXRfc2VudChzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgIGludCBtb3JlLCBpbnQgbGVuKQorCQkJCQkgIGludCBtb3JlLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWlmIChjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9wYWNrZXRfc2VudCAhPSBOVUxMKQogCQljY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9wYWNrZXRfc2VudChzaywgbW9yZSwgbGVuKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL0tjb25maWcgYi9uZXQvZGNjcC9jY2lkcy9LY29uZmlnCmluZGV4IDg1MzNkYWIuLjgwZjQ2OTggMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL0tjb25maWcKKysrIGIvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZwpAQCAtMjgsMTMgKzI4LDIwIEBACiAJICBUaGlzIHRleHQgd2FzIGV4dHJhY3RlZCBmcm9tIFJGQyA0MzQwIChzZWMuIDEwLjEpLAogCSAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDM0MC50eHQKIAorCSAgVG8gY29tcGlsZSB0aGlzIENDSUQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGRjY3BfY2NpZDIuCisKIAkgIElmIGluIGRvdWJ0LCBzYXkgTS4KIAogY29uZmlnIElQX0RDQ1BfQ0NJRDJfREVCVUcKLQkgIGJvb2wgIkNDSUQyIGRlYnVnIgorCSAgYm9vbCAiQ0NJRDIgZGVidWdnaW5nIG1lc3NhZ2VzIgogCSAgZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQyCiAJICAtLS1oZWxwLS0tCi0JICAgIEVuYWJsZSBDQ0lEMiBkZWJ1ZyBtZXNzYWdlcy4KKwkgICAgRW5hYmxlIENDSUQyLXNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlcy4KKworCSAgICBXaGVuIGNvbXBpbGluZyBDQ0lEMiBhcyBhIG1vZHVsZSwgdGhpcyBkZWJ1Z2dpbmcgb3V0cHV0IGNhbgorCSAgICBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZSBjY2lkMl9kZWJ1ZyBtb2R1bGUKKwkgICAgcGFyYW1ldGVyIHRvIDAgb3IgMS4KIAogCSAgICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKQEAgLTYyLDEwICs2OSw1NyBAQAogCSAgVGhpcyB0ZXh0IHdhcyBleHRyYWN0ZWQgZnJvbSBSRkMgNDM0MCAoc2VjLiAxMC4yKSwKIAkgIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQzNDAudHh0CiAJICAKKwkgIFRvIGNvbXBpbGUgdGhpcyBDQ0lEIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBkY2NwX2NjaWQzLgorCiAJICBJZiBpbiBkb3VidCwgc2F5IE0uCiAKIGNvbmZpZyBJUF9EQ0NQX1RGUkNfTElCCiAJZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQzCiAJZGVmX3RyaXN0YXRlIElQX0RDQ1BfQ0NJRDMKIAorY29uZmlnIElQX0RDQ1BfQ0NJRDNfREVCVUcKKwkgIGJvb2wgIkNDSUQzIGRlYnVnZ2luZyBtZXNzYWdlcyIKKwkgIGRlcGVuZHMgb24gSVBfRENDUF9DQ0lEMworCSAgLS0taGVscC0tLQorCSAgICBFbmFibGUgQ0NJRDMtc3BlY2lmaWMgZGVidWdnaW5nIG1lc3NhZ2VzLgorCisJICAgIFdoZW4gY29tcGlsaW5nIENDSUQzIGFzIGEgbW9kdWxlLCB0aGlzIGRlYnVnZ2luZyBvdXRwdXQgY2FuCisJICAgIGFkZGl0aW9uYWxseSBiZSB0b2dnbGVkIGJ5IHNldHRpbmcgdGhlIGNjaWQzX2RlYnVnIG1vZHVsZQorCSAgICBwYXJhbWV0ZXIgdG8gMCBvciAxLgorCisJICAgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIElQX0RDQ1BfQ0NJRDNfUlRPCisJICBpbnQgIlVzZSBoaWdoZXIgYm91bmQgZm9yIG5vZmVlZGJhY2sgdGltZXIiCisJICBkZWZhdWx0IDEwMAorCSAgZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQzICYmIEVYUEVSSU1FTlRBTAorCSAgLS0taGVscC0tLQorCSAgICBVc2UgaGlnaGVyIGxvd2VyIGJvdW5kIGZvciBub2ZlZWRiYWNrIHRpbWVyIGV4cGlyYXRpb24uCisKKwkgICAgVGhlIFRGUkMgbm9mZWVkYmFjayB0aW1lciBub3JtYWxseSBleHBpcmVzIGFmdGVyIHRoZSBtYXhpbXVtIG9mIDQKKwkgICAgUlRUcyBhbmQgdHdpY2UgdGhlIGN1cnJlbnQgc2VuZCBpbnRlcnZhbCAoUkZDIDM0NDgsIDQuMykuIE9uIExBTnMKKwkgICAgd2l0aCBhIHNtYWxsIFJUVCB0aGlzIGNhbiBtZWFuIGEgaGlnaCBwcm9jZXNzaW5nIGxvYWQgYW5kIHJlZHVjZWQKKwkgICAgcGVyZm9ybWFuY2UsIHNpbmNlIHRoZW4gdGhlIG5vZmVlZGJhY2sgdGltZXIgaXMgdHJpZ2dlcmVkIHZlcnkKKwkgICAgZnJlcXVlbnRseS4KKworCSAgICBUaGlzIG9wdGlvbiBlbmFibGVzIHRvIHNldCBhIGhpZ2hlciBsb3dlciBib3VuZCBmb3IgdGhlIG5vZmVlZGJhY2sKKwkgICAgdmFsdWUuIFZhbHVlcyBpbiB1bml0cyBvZiBtaWxsaXNlY29uZHMgY2FuIGJlIHNldCBoZXJlLgorCisJICAgIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyB0aGlzIGZlYXR1cmUgYnkgZW5mb3JjaW5nIHRoZSB2YWx1ZSBzcGVjaWZpZWQKKwkgICAgaW4gUkZDIDM0NDguIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGhhdmUgYmVlbiBzdWdnZXN0ZWQgYXMgYm91bmRzIGZvcgorCSAgICBleHBlcmltZW50YWwgdXNlOgorCSAgICAJKiAxNi0yMG1zIHRvIG1hdGNoIHRoZSB0eXBpY2FsIG11bHRpbWVkaWEgaW50ZXItZnJhbWUgaW50ZXJ2YWwKKwkgICAgCSogMTAwbXMgYXMgYSByZWFzb25hYmxlIGNvbXByb21pc2UgW2RlZmF1bHRdCisJICAgIAkqIDEwMDBtcyBjb3JyZXNwb25kcyB0byB0aGUgbG93ZXIgVENQIFJUTyBib3VuZCAoUkZDIDI5ODgsIDIuNCkKKworCSAgICBUaGUgZGVmYXVsdCBvZiAxMDBtcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiBhIGxhcmdlIHZhbHVlIGZvcgorCSAgICBlZmZpY2llbnQgRENDUCBpbXBsZW1lbnRhdGlvbnMsIGFuZCBhIHNtYWxsIHZhbHVlIHRvIGF2b2lkIGRpc3J1cHRpbmcKKwkgICAgdGhlIG5ldHdvcmsgaW4gdGltZXMgb2YgY29uZ2VzdGlvbi4KKworCSAgICBUaGUgcHVycG9zZSBvZiB0aGUgbm9mZWVkYmFjayB0aW1lciBpcyB0byBzbG93IERDQ1AgZG93biB3aGVuIHRoZXJlCisJICAgIGlzIHNlcmlvdXMgbmV0d29yayBjb25nZXN0aW9uOiBleHBlcmltZW50aW5nIHdpdGggbGFyZ2VyIHZhbHVlcyBzaG91bGQKKwkgICAgdGhlcmVmb3JlIG5vdCBiZSBwZXJmb3JtZWQgb24gV0FOcy4KKworCiBlbmRtZW51CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYwppbmRleCAxNjIwMzJiLi4yNTU1YmU4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKQEAgLTMzLDE4ICszMywxMSBAQAogI2luY2x1ZGUgIi4uL2RjY3AuaCIKICNpbmNsdWRlICJjY2lkMi5oIgogCisKKyNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMl9ERUJVRwogc3RhdGljIGludCBjY2lkMl9kZWJ1ZzsKKyNkZWZpbmUgY2NpZDJfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQlEQ0NQX1BSX0RFQlVHKGNjaWQyX2RlYnVnLCBmb3JtYXQsICMjYSkKIAotI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHCi0jZGVmaW5lIGNjaWQyX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikgXAotICAgICAgICBkbyB7IGlmIChjY2lkMl9kZWJ1ZykgXAotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXywgIyNhKTsgXAotICAgICAgICB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgY2NpZDJfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMl9ERUJVRwogc3RhdGljIHZvaWQgY2NpZDJfaGNfdHhfY2hlY2tfc2FuaXR5KGNvbnN0IHN0cnVjdCBjY2lkMl9oY190eF9zb2NrICpoY3R4KQogewogCWludCBsZW4gPSAwOwpAQCAtODYsNyArNzksOCBAQAogCUJVR19PTihsZW4gIT0gaGN0eC0+Y2NpZDJoY3R4X3NlcWJ1ZmMgKiBDQ0lEMl9TRVFCVUZfTEVOKTsKIH0KICNlbHNlCi0jZGVmaW5lIGNjaWQyX2hjX3R4X2NoZWNrX3Nhbml0eShoY3R4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY2NpZDJfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQorI2RlZmluZSBjY2lkMl9oY190eF9jaGVja19zYW5pdHkoaGN0eCkKICNlbmRpZgogCiBzdGF0aWMgaW50IGNjaWQyX2hjX3R4X2FsbG9jX3NlcShzdHJ1Y3QgY2NpZDJfaGNfdHhfc29jayAqaGN0eCwgaW50IG51bSwKQEAgLTEzMSw4ICsxMjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNjaWQyX2hjX3R4X3NlbmRfcGFja2V0KHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQorc3RhdGljIGludCBjY2lkMl9oY190eF9zZW5kX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGNjaWQyX2hjX3R4X3NvY2sgKmhjdHg7CiAKQEAgLTI3NCw3ICsyNjcsNyBAQAogCQkgICAgICAgamlmZmllcyArIGhjdHgtPmNjaWQyaGN0eF9ydG8pOwogfQogCi1zdGF0aWMgdm9pZCBjY2lkMl9oY190eF9wYWNrZXRfc2VudChzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgY2NpZDJfaGNfdHhfcGFja2V0X3NlbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbW9yZSwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkMl9oY190eF9zb2NrICpoY3R4ID0gY2NpZDJfaGNfdHhfc2soc2spOwpAQCAtNDI2LDcgKzQxOSw3IEBACiAJcmV0dXJuIC0xOwogCiBvdXRfaW52YWxpZF9vcHRpb246Ci0JQlVHX09OKDEpOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uIG9wdGlvbnMgd2VyZSBwcmV2aW91c2x5IHBhcnNlZCAhICovCisJRENDUF9CVUcoIkludmFsaWQgb3B0aW9uIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbiAocHJldmlvdXMgcGFyc2luZykhIik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC02MTksNyArNjEyLDE3IEBACiAJfQogCiAJYWNrbm8gPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxOwotCXNlcXAgPSBoY3R4LT5jY2lkMmhjdHhfc2VxaC0+Y2NpZDJzX3ByZXY7CisJaWYgKGFmdGVyNDgoYWNrbm8sIGhjdHgtPmNjaWQyaGN0eF9oaWdoX2FjaykpCisJCWhjdHgtPmNjaWQyaGN0eF9oaWdoX2FjayA9IGFja25vOworCisJc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXF0OworCXdoaWxlIChiZWZvcmU0OChzZXFwLT5jY2lkMnNfc2VxLCBhY2tubykpIHsKKwkJc2VxcCA9IHNlcXAtPmNjaWQyc19uZXh0OworCQlpZiAoc2VxcCA9PSBoY3R4LT5jY2lkMmhjdHhfc2VxaCkgeworCQkJc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXFoLT5jY2lkMnNfcHJldjsKKwkJCWJyZWFrOworCQl9CisJfQogCiAJLyogSWYgaW4gc2xvdy1zdGFydCwgY3duZCBjYW4gaW5jcmVhc2UgYXQgbW9zdCBBY2sgUmF0aW8gLyAyIHBhY2tldHMgZm9yCiAJICogdGhpcyBzaW5nbGUgYWNrLiAgSSByb3VuZCB1cC4KQEAgLTY5Nyw3ICs3MDAsMTQgQEAKIAkvKiBUaGUgc3RhdGUgYWJvdXQgd2hhdCBpcyBhY2tlZCBzaG91bGQgYmUgY29ycmVjdCBub3cKIAkgKiBDaGVjayBmb3IgTlVNRFVQQUNLCiAJICovCi0Jc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXFoLT5jY2lkMnNfcHJldjsKKwlzZXFwID0gaGN0eC0+Y2NpZDJoY3R4X3NlcXQ7CisJd2hpbGUgKGJlZm9yZTQ4KHNlcXAtPmNjaWQyc19zZXEsIGhjdHgtPmNjaWQyaGN0eF9oaWdoX2FjaykpIHsKKwkJc2VxcCA9IHNlcXAtPmNjaWQyc19uZXh0OworCQlpZiAoc2VxcCA9PSBoY3R4LT5jY2lkMmhjdHhfc2VxaCkgeworCQkJc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXFoLT5jY2lkMnNfcHJldjsKKwkJCWJyZWFrOworCQl9CisJfQogCWRvbmUgPSAwOwogCXdoaWxlICgxKSB7CiAJCWlmIChzZXFwLT5jY2lkMnNfYWNrZWQpIHsKQEAgLTc3MSw2ICs3ODEsNyBAQAogCWhjdHgtPmNjaWQyaGN0eF9sYXN0cnR0ICA9IDA7CiAJaGN0eC0+Y2NpZDJoY3R4X3JwZHVwYWNrID0gLTE7CiAJaGN0eC0+Y2NpZDJoY3R4X2xhc3RfY29uZyA9IGppZmZpZXM7CisJaGN0eC0+Y2NpZDJoY3R4X2hpZ2hfYWNrID0gMDsKIAogCWhjdHgtPmNjaWQyaGN0eF9ydG90aW1lci5mdW5jdGlvbiA9ICZjY2lkMl9oY190eF9ydG9fZXhwaXJlOwogCWhjdHgtPmNjaWQyaGN0eF9ydG90aW1lci5kYXRhCSAgPSAodW5zaWduZWQgbG9uZylzazsKQEAgLTgyMyw4ICs4MzQsMTAgQEAKIAkuY2NpZF9oY19yeF9wYWNrZXRfcmVjdgk9IGNjaWQyX2hjX3J4X3BhY2tldF9yZWN2LAogfTsKIAorI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHCiBtb2R1bGVfcGFyYW0oY2NpZDJfZGVidWcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNjaWQyX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisjZW5kaWYKIAogc3RhdGljIF9faW5pdCBpbnQgY2NpZDJfbW9kdWxlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmggYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5oCmluZGV4IDViMmVmNGEuLmViZDc5NDkgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmgKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuaApAQCAtMzUsNyArMzUsNyBAQAogCXN0cnVjdCBjY2lkMl9zZXEJKmNjaWQyc19uZXh0OwogfTsKIAotI2RlZmluZSBDQ0lEMl9TRVFCVUZfTEVOIDI1NgorI2RlZmluZSBDQ0lEMl9TRVFCVUZfTEVOIDEwMjQKICNkZWZpbmUgQ0NJRDJfU0VRQlVGX01BWCAxMjgKIAogLyoqIHN0cnVjdCBjY2lkMl9oY190eF9zb2NrIC0gQ0NJRDIgVFggaGFsZiBjb25uZWN0aW9uCkBAIC03Miw2ICs3Miw3IEBACiAJaW50CQkJY2NpZDJoY3R4X3JwZHVwYWNrOwogCWludAkJCWNjaWQyaGN0eF9zZW5kd2FpdDsKIAl1bnNpZ25lZCBsb25nCQljY2lkMmhjdHhfbGFzdF9jb25nOworCXU2NAkJCWNjaWQyaGN0eF9oaWdoX2FjazsKIH07CiAKIHN0cnVjdCBjY2lkMl9oY19yeF9zb2NrIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCmluZGV4IGNlYzIzYWQuLmNmOGMwN2IgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwpAQCAtNjAsMTMgKzYwLDExIEBACiAJcmV0dXJuIChiID49IDIgKiBkaXYpID8gdG1wIC8gKGIgLyBkaXYpIDogdG1wOwogfQogCi1zdGF0aWMgaW50IGNjaWQzX2RlYnVnOwogCi0jaWZkZWYgQ0NJRDNfREVCVUcKLSNkZWZpbmUgY2NpZDNfcHJfZGVidWcoZm9ybWF0LCBhLi4uKSBcCi0JZG8geyBpZiAoY2NpZDNfZGVidWcpIFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZvcm1hdCwgX19GVU5DVElPTl9fLCAjI2EpOyBcCi0JfSB3aGlsZSAoMCkKKworI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCitzdGF0aWMgaW50IGNjaWQzX2RlYnVnOworI2RlZmluZSBjY2lkM19wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pCURDQ1BfUFJfREVCVUcoY2NpZDNfZGVidWcsIGZvcm1hdCwgIyNhKQogI2Vsc2UKICNkZWZpbmUgY2NpZDNfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQogI2VuZGlmCkBAIC03NSwxNSArNzMsNyBAQAogc3RhdGljIHN0cnVjdCBkY2NwX3J4X2hpc3QgKmNjaWQzX3J4X2hpc3Q7CiBzdGF0aWMgc3RydWN0IGRjY3BfbGlfaGlzdCAqY2NpZDNfbGlfaGlzdDsKIAotLyogVEZSQyBzZW5kZXIgc3RhdGVzICovCi1lbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyB7Ci0gICAgICAgCVRGUkNfU1NUQVRFX05PX1NFTlQgPSAxLAotCVRGUkNfU1NUQVRFX05PX0ZCQUNLLAotCVRGUkNfU1NUQVRFX0ZCQUNLLAotCVRGUkNfU1NUQVRFX1RFUk0sCi19OwotCi0jaWZkZWYgQ0NJRDNfREVCVUcKKyNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwogc3RhdGljIGNvbnN0IGNoYXIgKmNjaWQzX3R4X3N0YXRlX25hbWUoZW51bSBjY2lkM19oY190eF9zdGF0ZXMgc3RhdGUpCiB7CiAJc3RhdGljIGNoYXIgKmNjaWQzX3N0YXRlX25hbWVzW10gPSB7CkBAIC0xMTAsMTA1ICsxMDAsMTE1IEBACiAJaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID0gc3RhdGU7CiB9CiAKLS8qIENhbGN1bGF0ZSBuZXcgdF9pcGkgKGludGVyIHBhY2tldCBpbnRlcnZhbCkgYnkgdF9pcGkgPSBzIC8gWF9pbnN0ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfY2FsY19uZXdfdF9pcGkoc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgpCisvKgorICogUmVjYWxjdWxhdGUgc2NoZWR1bGVkIG5vbWluYWwgc2VuZCB0aW1lIHRfbm9tLCBpbnRlci1wYWNrZXQgaW50ZXJ2YWwKKyAqIHRfaXBpLCBhbmQgZGVsdGEgdmFsdWUuIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UgdG8gWC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX3VwZGF0ZV9zZW5kX3RpbWUoc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgpCiB7Ci0JLyoKLQkgKiBJZiBubyBmZWVkYmFjayBzcGVjIHNheXMgdF9pcGkgaXMgMSBzZWNvbmQgKHNldCBlbHNld2hlcmUgYW5kIHRoZW4KLQkgKiBkb3VibGVzIGFmdGVyIGV2ZXJ5IG5vIGZlZWRiYWNrIHRpbWVyIChzZXBhcmF0ZSBmdW5jdGlvbikKLQkgKi8KLQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlICE9IFRGUkNfU1NUQVRFX05PX0ZCQUNLKQotCQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSB1c2Vjc19kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsCi0JCQkJCQkgIGhjdHgtPmNjaWQzaGN0eF94KTsKLX0KKwl0aW1ldmFsX3N1Yl91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwogCi0vKiBDYWxjdWxhdGUgbmV3IGRlbHRhIGJ5IGRlbHRhID0gbWluKHRfaXBpIC8gMiwgdF9ncmFuIC8gMikgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjY2lkM19jYWxjX25ld19kZWx0YShzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCkKLXsKKwkvKiBDYWxjdWxhdGUgbmV3IHRfaXBpIChpbnRlciBwYWNrZXQgaW50ZXJ2YWwpIGJ5IHRfaXBpID0gcyAvIFhfaW5zdCAqLworCWhjdHgtPmNjaWQzaGN0eF90X2lwaSA9IHVzZWNzX2RpdihoY3R4LT5jY2lkM2hjdHhfcywgaGN0eC0+Y2NpZDNoY3R4X3gpOworCisJLyogVXBkYXRlIG5vbWluYWwgc2VuZCB0aW1lIHdpdGggcmVnYXJkIHRvIHRoZSBuZXcgdF9pcGkgKi8KKwl0aW1ldmFsX2FkZF91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOworCisJLyogQ2FsY3VsYXRlIG5ldyBkZWx0YSBieSBkZWx0YSA9IG1pbih0X2lwaSAvIDIsIHRfZ3JhbiAvIDIpICovCiAJaGN0eC0+Y2NpZDNoY3R4X2RlbHRhID0gbWluX3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkgLyAyLAogCQkJCQkgICBURlJDX09QU1lTX0hBTEZfVElNRV9HUkFOKTsKIH0KLQogLyoKICAqIFVwZGF0ZSBYIGJ5CiAgKiAgICBJZiAocCA+IDApCi0gKiAgICAgICB4X2NhbGMgPSBjYWxjWChzLCBSLCBwKTsKKyAqICAgICAgIFhfY2FsYyA9IGNhbGNYKHMsIFIsIHApOwogICogICAgICAgWCA9IG1heChtaW4oWF9jYWxjLCAyICogWF9yZWN2KSwgcyAvIHRfbWJpKTsKICAqICAgIEVsc2UKICAqICAgICAgIElmIChub3cgLSB0bGQgPj0gUikKICAqICAgICAgICAgIFggPSBtYXgobWluKDIgKiBYLCAyICogWF9yZWN2KSwgcyAvIFIpOwogICogICAgICAgICAgdGxkID0gbm93OworICoKKyAqIElmIFggaGFzIGNoYW5nZWQsIHdlIGFsc28gdXBkYXRlIHRoZSBzY2hlZHVsZWQgc2VuZCB0aW1lIHRfbm93LAorICogdGhlIGludGVyLXBhY2tldCBpbnRlcnZhbCB0X2lwaSwgYW5kIHRoZSBkZWx0YSB2YWx1ZS4KICAqLyAKLXN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X3VwZGF0ZV94KHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X3VwZGF0ZV94KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKm5vdykKKwogewogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCWNvbnN0IF9fdTMyIG9sZF94ID0gaGN0eC0+Y2NpZDNoY3R4X3g7CiAKLQkvKiBUbyBhdm9pZCBsYXJnZSBlcnJvciBpbiBjYWxjWCAqLwotCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA+PSBURlJDX1NNQUxMRVNUX1ApIHsKKwlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPiAwKSB7CiAJCWhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPSB0ZnJjX2NhbGNfeChoY3R4LT5jY2lkM2hjdHhfcywKIAkJCQkJCSAgICAgaGN0eC0+Y2NpZDNoY3R4X3J0dCwKIAkJCQkJCSAgICAgaGN0eC0+Y2NpZDNoY3R4X3ApOwotCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heF90KHUzMiwgbWluX3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfeF9jYWxjLAotCQkJCQkJCSAgMiAqIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YpLAotCQkJCQkgICAgICAgKGhjdHgtPmNjaWQzaGN0eF9zIC8KLQkJCQkJICAgICAgICBURlJDX01BWF9CQUNLX09GRl9USU1FKSk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHRpbWV2YWwgbm93OworCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heF90KHUzMiwgbWluKGhjdHgtPmNjaWQzaGN0eF94X2NhbGMsCisJCQkJCQkgICBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2ICogMiksCisJCQkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfcyAvIFRGUkNfVF9NQkkpOwogCi0JCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKLQkgICAgICAgCWlmICh0aW1ldmFsX2RlbHRhKCZub3csICZoY3R4LT5jY2lkM2hjdHhfdF9sZCkgPj0KLQkJICAgIGhjdHgtPmNjaWQzaGN0eF9ydHQpIHsKLQkJCWhjdHgtPmNjaWQzaGN0eF94ID0gbWF4X3QodTMyLCBtaW5fdCh1MzIsIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YsCi0JCQkJCQkJCSAgaGN0eC0+Y2NpZDNoY3R4X3gpICogMiwKLQkJCQkJCSAgICAgICB1c2Vjc19kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsCi0JCQkJCQkJICAgICAgIAkgaGN0eC0+Y2NpZDNoY3R4X3J0dCkpOwotCQkJaGN0eC0+Y2NpZDNoY3R4X3RfbGQgPSBub3c7Ci0JCX0KLQl9CisJfSBlbHNlIGlmICh0aW1ldmFsX2RlbHRhKG5vdywgJmhjdHgtPmNjaWQzaGN0eF90X2xkKSA+PQorCQkJCQkJCSAgaGN0eC0+Y2NpZDNoY3R4X3J0dCkgeworCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heChtaW4oaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiwKKwkJCQkJICAgIGhjdHgtPmNjaWQzaGN0eF94ICAgICAgKSAqIDIsCisJCQkJCXVzZWNzX2RpdihoY3R4LT5jY2lkM2hjdHhfcywKKwkJCQkJICAgICAgIAkgIGhjdHgtPmNjaWQzaGN0eF9ydHQpICAgKTsKKwkJaGN0eC0+Y2NpZDNoY3R4X3RfbGQgPSAqbm93OworCX0gZWxzZQorCQljY2lkM19wcl9kZWJ1ZygiTm90IGNoYW5naW5nIFhcbiIpOworCisJaWYgKGhjdHgtPmNjaWQzaGN0eF94ICE9IG9sZF94KQorCQljY2lkM191cGRhdGVfc2VuZF90aW1lKGhjdHgpOworfQorCisvKgorICogCVRyYWNrIHRoZSBtZWFuIHBhY2tldCBzaXplIGBzJyAoY2YuIFJGQyA0MzQyLCA1LjMgYW5kICBSRkMgMzQ0OCwgNC4xKQorICogCUBsZW46IERDQ1AgcGFja2V0IHBheWxvYWQgc2l6ZSBpbiBieXRlcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfaGNfdHhfdXBkYXRlX3Moc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgsIGludCBsZW4pCit7CisJaWYgKHVubGlrZWx5KGxlbiA9PSAwKSkKKwkJY2NpZDNfcHJfZGVidWcoIlBhY2tldCBwYXlsb2FkIGxlbmd0aCBpcyAwIC0gbm90IHVwZGF0aW5nXG4iKTsKKwllbHNlCisJCWhjdHgtPmNjaWQzaGN0eF9zID0gaGN0eC0+Y2NpZDNoY3R4X3MgPT0gMCA/IGxlbiA6CisJCQkJICAgICg5ICogaGN0eC0+Y2NpZDNoY3R4X3MgKyBsZW4pIC8gMTA7CisJLyoKKwkgKiBOb3RlOiBXZSBjb3VsZCBkbyBhIHBvdGVudGlhbCBvcHRpbWlzYXRpb24gaGVyZSAtIHdoZW4gYHMnIGNoYW5nZXMsCisJICoJIHJlY2FsY3VsYXRlIHNlbmRpbmcgcmF0ZSBhbmQgY29uc2VxdWVudGx5IHRfaXBpLCB0X2RlbHRhLCBhbmQKKwkgKgkgdF9ub3cuIFRoaXMgaXMgaG93ZXZlciBub24tc3RhbmRhcmQsIGFuZCB0aGUgYmVuZWZpdHMgYXJlIG5vdAorCSAqCSBjbGVhciwgc28gaXQgaXMgY3VycmVudGx5IGxlZnQgb3V0LgorCSAqLwogfQogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9ub19mZWVkYmFja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopZGF0YTsKLQl1bnNpZ25lZCBsb25nIG5leHRfdG1vdXQgPSAwOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCXVuc2lnbmVkIGxvbmcgdF9uZmIgPSBVU0VDX1BFUl9TRUMgLyA1OwogCiAJYmhfbG9ja19zb2NrKHNrKTsKIAlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQkvKiBUcnkgYWdhaW4gbGF0ZXIuICovCiAJCS8qIFhYWDogc2V0IHNvbWUgc2Vuc2libGUgTUlCICovCi0JCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLAotCQkJICAgICAgIGppZmZpZXMgKyBIWiAvIDUpOwotCQlnb3RvIG91dDsKKwkJZ290byByZXN0YXJ0X3RpbWVyOwogCX0KIAogCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIHN0YXRlPSVzXG4iLCBkY2NwX3JvbGUoc2spLCBzaywKIAkJICAgICAgIGNjaWQzX3R4X3N0YXRlX25hbWUoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSk7CiAJCiAJc3dpdGNoIChoY3R4LT5jY2lkM2hjdHhfc3RhdGUpIHsKLQljYXNlIFRGUkNfU1NUQVRFX1RFUk06Ci0JCWdvdG8gb3V0OwogCWNhc2UgVEZSQ19TU1RBVEVfTk9fRkJBQ0s6Ci0JCS8qIEhhbHZlIHNlbmQgcmF0ZSAqLwotCQloY3R4LT5jY2lkM2hjdHhfeCAvPSAyOwotCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3ggPCAoaGN0eC0+Y2NpZDNoY3R4X3MgLwotCQkJCQkgVEZSQ19NQVhfQkFDS19PRkZfVElNRSkpCi0JCQloY3R4LT5jY2lkM2hjdHhfeCA9IChoY3R4LT5jY2lkM2hjdHhfcyAvCi0JCQkJCSAgICAgVEZSQ19NQVhfQkFDS19PRkZfVElNRSk7CisJCS8qIFJGQyAzNDQ4LCA0LjQ6IEhhbHZlIHNlbmQgcmF0ZSBkaXJlY3RseSAqLworCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1pbl90KHUzMiwgaGN0eC0+Y2NpZDNoY3R4X3ggLyAyLAorCQkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3MgLyBURlJDX1RfTUJJKTsKIAogCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBzdGF0ZT0lcywgdXBkYXRlZCB0eCByYXRlIHRvICVkICIKIAkJCSAgICAgICAiYnl0ZXMvc1xuIiwKIAkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKIAkJCSAgICAgICBjY2lkM190eF9zdGF0ZV9uYW1lKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSksCiAJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpOwotCQluZXh0X3Rtb3V0ID0gbWF4X3QodTMyLCAyICogdXNlY3NfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkJICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpLAotCQkJCQlURlJDX0lOSVRJQUxfVElNRU9VVCk7Ci0JCS8qCi0JCSAqIEZJWE1FIC0gbm90IHN1cmUgYWJvdmUgY2FsY3VsYXRpb24gaXMgY29ycmVjdC4gU2VlIHNlY3Rpb24KLQkJICogNSBvZiBDQ0lEMyAxMSBzaG91bGQgYWRqdXN0IHR4X3RfaXBpIGFuZCBkb3VibGUgdGhhdCB0bwotCQkgKiBhY2hpZXZlIGl0IHJlYWxseQotCQkgKi8KKwkJLyogVGhlIHZhbHVlIG9mIFIgaXMgc3RpbGwgdW5kZWZpbmVkIGFuZCBzbyB3ZSBjYW4gbm90IHJlY29tcHV0ZQorCQkgKiB0aGUgdGltb3V0IHZhbHVlLiBLZWVwIGluaXRpYWwgdmFsdWUgYXMgcGVyIFtSRkMgNDM0MiwgNV0uICovCisJCXRfbmZiID0gVEZSQ19JTklUSUFMX1RJTUVPVVQ7CisJCWNjaWQzX3VwZGF0ZV9zZW5kX3RpbWUoaGN0eCk7CiAJCWJyZWFrOwogCWNhc2UgVEZSQ19TU1RBVEVfRkJBQ0s6CiAJCS8qCkBAIC0yMTgsNzIgKzIxOCw3OCBAQAogCQlpZiAoIWhjdHgtPmNjaWQzaGN0eF9pZGxlIHx8CiAJCSAgICAoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PQogCQkgICAgIDQgKiB1c2Vjc19kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsIGhjdHgtPmNjaWQzaGN0eF9ydHQpKSkgeworCQkJc3RydWN0IHRpbWV2YWwgbm93OworCiAJCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBzdGF0ZT0lcywgbm90IGlkbGVcbiIsCiAJCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAogCQkJCSAgICAgICBjY2lkM190eF9zdGF0ZV9uYW1lKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSkpOwogCQkJLyogSGFsdmUgc2VuZGluZyByYXRlICovCiAKLQkJCS8qICBJZiAoWF9jYWxjID4gMiAqIFhfcmVjdikKKwkJCS8qICBJZiAocCA9PSAwIHx8IFhfY2FsYyA+IDIgKiBYX3JlY3YpCiAJCQkgKiAgICBYX3JlY3YgPSBtYXgoWF9yZWN2IC8gMiwgcyAvICgyICogdF9tYmkpKTsKIAkJCSAqICBFbHNlCiAJCQkgKiAgICBYX3JlY3YgPSBYX2NhbGMgLyA0OwogCQkJICovCi0JCQlCVUdfT04oaGN0eC0+Y2NpZDNoY3R4X3AgPj0gVEZSQ19TTUFMTEVTVF9QICYmCi0JCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyA9PSAwKTsKKwkJCUJVR19PTihoY3R4LT5jY2lkM2hjdHhfcCAmJiAhaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyk7CiAKLQkJCS8qIGNoZWNrIGFsc28gaWYgcCBpcyB6ZXJvIC0+IHhfY2FsYyBpcyBpbmZpbml0eT8gKi8KLQkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA8IFRGUkNfU01BTExFU1RfUCB8fAorCQkJaWYgKGhjdHgtPmNjaWQzaGN0eF9wICA9PSAwIHx8CiAJCQkgICAgaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyA+IDIgKiBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2KQogCQkJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPSBtYXhfdCh1MzIsIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgLyAyLAotCQkJCQkJCQkgICAgaGN0eC0+Y2NpZDNoY3R4X3MgLyAoMiAqIFRGUkNfTUFYX0JBQ0tfT0ZGX1RJTUUpKTsKKwkJCQkJCQkJICAgIGhjdHgtPmNjaWQzaGN0eF9zIC8gKDIgKiBURlJDX1RfTUJJKSk7CiAJCQllbHNlCiAJCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA9IGhjdHgtPmNjaWQzaGN0eF94X2NhbGMgLyA0OwogCiAJCQkvKiBVcGRhdGUgc2VuZGluZyByYXRlICovCi0JCQljY2lkM19oY190eF91cGRhdGVfeChzayk7CisJCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CisJCQljY2lkM19oY190eF91cGRhdGVfeChzaywgJm5vdyk7CiAJCX0KIAkJLyoKIAkJICogU2NoZWR1bGUgbm8gZmVlZGJhY2sgdGltZXIgdG8gZXhwaXJlIGluCi0JCSAqIG1heCg0ICogUiwgMiAqIHMgLyBYKQorCQkgKiBtYXgodF9SVE8sIDIgKiBzL1gpICA9ICBtYXgodF9SVE8sIDIgKiB0X2lwaSkKKwkJICogU2VlIGNvbW1lbnRzIGluIHBhY2tldF9yZWN2KCkgcmVnYXJkaW5nIHRoZSB2YWx1ZSBvZiB0X1JUTy4KIAkJICovCi0JCW5leHRfdG1vdXQgPSBtYXhfdCh1MzIsIGhjdHgtPmNjaWQzaGN0eF90X3J0bywgCi0JCQkJCTIgKiB1c2Vjc19kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsCi0JCQkJCQkgICAgICBoY3R4LT5jY2lkM2hjdHhfeCkpOworCQl0X25mYiA9IG1heChoY3R4LT5jY2lkM2hjdHhfdF9ydG8sIDIgKiBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9DUklUICIlczogJXMsIHNrPSVwLCBJbGxlZ2FsIHN0YXRlICglZCkhXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzaywgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKTsKLQkJZHVtcF9zdGFjaygpOworCWNhc2UgVEZSQ19TU1RBVEVfTk9fU0VOVDoKKwkJRENDUF9CVUcoIklsbGVnYWwgJXMgc3RhdGUgTk9fU0VOVCwgc2s9JXAiLCBkY2NwX3JvbGUoc2spLCBzayk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVEZSQ19TU1RBVEVfVEVSTToKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2tfcmVzZXRfdGltZXIoc2ssICZoY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIsIAotCQkgICAgICBqaWZmaWVzICsgbWF4X3QodTMyLCAxLCB1c2Vjc190b19qaWZmaWVzKG5leHRfdG1vdXQpKSk7CiAJaGN0eC0+Y2NpZDNoY3R4X2lkbGUgPSAxOworCityZXN0YXJ0X3RpbWVyOgorCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLAorCQkgICAgICAgICAgIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRfbmZiKSk7CiBvdXQ6CiAJYmhfdW5sb2NrX3NvY2soc2spOwogCXNvY2tfcHV0KHNrKTsKIH0KIAotc3RhdGljIGludCBjY2lkM19oY190eF9zZW5kX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKKy8qCisgKiByZXR1cm5zCisgKiAgID4gMDogZGVsYXkgKGluIG1zZWNzKSB0aGF0IHNob3VsZCBwYXNzIGJlZm9yZSBhY3R1YWxseSBzZW5kaW5nCisgKiAgID0gMDogY2FuIHNlbmQgaW1tZWRpYXRlbHkKKyAqICAgPCAwOiBlcnJvciBjb25kaXRpb247IGRvIG5vdCBzZW5kIHBhY2tldAorICovCitzdGF0aWMgaW50IGNjaWQzX2hjX3R4X3NlbmRfcGFja2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKm5ld19wYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCWxvbmcgZGVsYXk7Ci0JaW50IHJjID0gLUVOT1RDT05OOwogCi0JQlVHX09OKGhjdHggPT0gTlVMTCB8fCBoY3R4LT5jY2lkM2hjdHhfc3RhdGUgPT0gVEZSQ19TU1RBVEVfVEVSTSk7CisJQlVHX09OKGhjdHggPT0gTlVMTCk7CiAKLQkvKiBDaGVjayBpZiBwdXJlIEFDSyBvciBUZXJtaW5hdGluZyovCiAJLyoKLQkgKiBYWFg6IFdlIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBEQVRBIGFuZCBEQVRBQUNLLCBvbiwgdGhlc2UKLQkgKiBwYWNrZXRzIGNhbiBoYXZlIHplcm8gbGVuZ3RoLCBidXQgd2h5IHRoZSBjb21tZW50IGFib3V0ICJwdXJlIEFDSyI/CisJICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBmb3IgRGF0YSBhbmQgRGF0YUFjayBwYWNrZXRzLiBTZW5kaW5nCisJICogemVyby1zaXplZCBEYXRhKEFjaylzIGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUsIGJ1dCBmb3IgY29uZ2VzdGlvbgorCSAqIGNvbnRyb2wgdGhpcyBjYXNlIGlzIHBhdGhvbG9naWNhbCAtIGlnbm9yZSBpdC4KIAkgKi8KLQlpZiAodW5saWtlbHkobGVuID09IDApKQotCQlnb3RvIG91dDsKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPT0gMCkpCisJCXJldHVybiAtRUJBRE1TRzsKIAogCS8qIFNlZSBpZiBsYXN0IHBhY2tldCBhbGxvY2F0ZWQgd2FzIG5vdCBzZW50ICovCiAJbmV3X3BhY2tldCA9IGRjY3BfdHhfaGlzdF9oZWFkKCZoY3R4LT5jY2lkM2hjdHhfaGlzdCk7CkBAIC0yOTEsMTIgKzI5NywxMCBAQAogCQluZXdfcGFja2V0ID0gZGNjcF90eF9oaXN0X2VudHJ5X25ldyhjY2lkM190eF9oaXN0LAogCQkJCQkJICAgIFNMQUJfQVRPTUlDKTsKIAotCQlyYyA9IC1FTk9CVUZTOwogCQlpZiAodW5saWtlbHkobmV3X3BhY2tldCA9PSBOVUxMKSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBub3QgZW5vdWdoICIKLQkJCQkgICAgICAgIm1lbSB0byBhZGQgdG8gaGlzdG9yeSwgc2VuZCByZWZ1c2VkXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKLQkJCWdvdG8gb3V0OworCQkJRENDUF9XQVJOKCIlcywgc2s9JXAsIG5vdCBlbm91Z2ggbWVtIHRvIGFkZCB0byBoaXN0b3J5LCIKKwkJCQkgICJzZW5kIHJlZnVzZWRcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKIAkJfQogCiAJCWRjY3BfdHhfaGlzdF9hZGRfZW50cnkoJmhjdHgtPmNjaWQzaGN0eF9oaXN0LCBuZXdfcGFja2V0KTsKQEAgLTMxMSwxMjMgKzMxNSw5NCBAQAogCQloY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQJID0gMDsKIAkJaGN0eC0+Y2NpZDNoY3R4X3RfbGFzdF93aW5fY291bnQgPSBub3c7CiAJCWNjaWQzX2hjX3R4X3NldF9zdGF0ZShzaywgVEZSQ19TU1RBVEVfTk9fRkJBQ0spOwotCQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBURlJDX0lOSVRJQUxfSVBJOwogCi0JCS8qIFNldCBub21pbmFsIHNlbmQgdGltZSBmb3IgaW5pdGlhbCBwYWNrZXQgKi8KKwkJLyogU2V0IGluaXRpYWwgc2VuZGluZyByYXRlIHRvIDEgcGFja2V0IHBlciBzZWNvbmQgKi8KKwkJY2NpZDNfaGNfdHhfdXBkYXRlX3MoaGN0eCwgc2tiLT5sZW4pOworCQloY3R4LT5jY2lkM2hjdHhfeCAgICAgPSBoY3R4LT5jY2lkM2hjdHhfczsKKworCQkvKiBGaXJzdCB0aW1lb3V0LCBhY2NvcmRpbmcgdG8gW1JGQyAzNDQ4LCA0LjJdLCBpcyAxIHNlY29uZCAqLworCQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBVU0VDX1BFUl9TRUM7CisJCS8qIEluaXRpYWwgZGVsdGE6IG1pbmltdW0gb2YgMC41IHNlYyBhbmQgdF9ncmFuLzIgKi8KKwkJaGN0eC0+Y2NpZDNoY3R4X2RlbHRhID0gVEZSQ19PUFNZU19IQUxGX1RJTUVfR1JBTjsKKworCQkvKiBTZXQgdF8wIGZvciBpbml0aWFsIHBhY2tldCAqLwogCQloY3R4LT5jY2lkM2hjdHhfdF9ub20gPSBub3c7Ci0JCXRpbWV2YWxfYWRkX3VzZWNzKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sCi0JCQkJICBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwotCQljY2lkM19jYWxjX25ld19kZWx0YShoY3R4KTsKLQkJcmMgPSAwOwogCQlicmVhazsKIAljYXNlIFRGUkNfU1NUQVRFX05PX0ZCQUNLOgogCWNhc2UgVEZSQ19TU1RBVEVfRkJBQ0s6Ci0JCWRlbGF5ID0gKHRpbWV2YWxfZGVsdGEoJm5vdywgJmhjdHgtPmNjaWQzaGN0eF90X25vbSkgLQotCQkgICAgICAgICBoY3R4LT5jY2lkM2hjdHhfZGVsdGEpOwotCQlkZWxheSAvPSAtMTAwMDsKLQkJLyogZGl2aWRlIGJ5IC0xMDAwIGlzIHRvIGNvbnZlcnQgdG8gbXMgYW5kIGdldCBzaWduIHJpZ2h0ICovCi0JCXJjID0gZGVsYXkgPiAwID8gZGVsYXkgOiAwOworCQlkZWxheSA9IHRpbWV2YWxfZGVsdGEoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgJm5vdyk7CisJCS8qCisJCSAqIAlTY2hlZHVsaW5nIG9mIHBhY2tldCB0cmFuc21pc3Npb25zIFtSRkMgMzQ0OCwgNC42XQorCQkgKgorCQkgKiBpZiAodF9ub3cgPiB0X25vbSAtIGRlbHRhKQorCQkgKiAgICAgICAvLyBzZW5kIHRoZSBwYWNrZXQgbm93CisJCSAqIGVsc2UKKwkJICogICAgICAgLy8gc2VuZCB0aGUgcGFja2V0IGluICh0X25vbSAtIHRfbm93KSBtaWxsaXNlY29uZHMuCisJCSAqLworCQlpZiAoZGVsYXkgLSAobG9uZyloY3R4LT5jY2lkM2hjdHhfZGVsdGEgPj0gMCkKKwkJCXJldHVybiBkZWxheSAvIDEwMDBMOwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9DUklUICIlczogJXMsIHNrPSVwLCBJbGxlZ2FsIHN0YXRlICglZCkhXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzaywgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKTsKLQkJZHVtcF9zdGFjaygpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOworCWNhc2UgVEZSQ19TU1RBVEVfVEVSTToKKwkJRENDUF9CVUcoIklsbGVnYWwgJXMgc3RhdGUgVEVSTSwgc2s9JXAiLCBkY2NwX3JvbGUoc2spLCBzayk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIENhbiB3ZSBzZW5kPyBpZiBzbyBhZGQgb3B0aW9ucyBhbmQgYWRkIHRvIHBhY2tldCBoaXN0b3J5ICovCi0JaWYgKHJjID09IDApIHsKLQkJZHAtPmRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zID0gMTsKLQkJbmV3X3BhY2tldC0+ZGNjcGh0eF9jY3ZhbCA9Ci0JCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9jY3ZhbCA9Ci0JCQkJaGN0eC0+Y2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50OwotCQl0aW1ldmFsX2FkZF91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLAotCQkJCSAgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCS8qIHByZXBhcmUgdG8gc2VuZCBub3cgKGFkZCBvcHRpb25zIGV0Yy4pICovCisJZHAtPmRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zID0gMTsKKwluZXdfcGFja2V0LT5kY2NwaHR4X2NjdmFsID0gRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfY2N2YWwgPQorCQkJCSAgICBoY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQ7CisJdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjY2lkM19oY190eF9wYWNrZXRfc2VudChzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfcGFja2V0X3NlbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbW9yZSwgdW5zaWduZWQgaW50IGxlbikKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBsb25nIHF1YXJ0ZXJfcnR0OworCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKnBhY2tldDsKIAotCUJVR19PTihoY3R4ID09IE5VTEwgfHwgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pOworCUJVR19PTihoY3R4ID09IE5VTEwpOwogCiAJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwogCi0JLyogY2hlY2sgaWYgd2UgaGF2ZSBzZW50IGEgZGF0YSBwYWNrZXQgKi8KLQlpZiAobGVuID4gMCkgewotCQl1bnNpZ25lZCBsb25nIHF1YXJ0ZXJfcnR0OwotCQlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQ7CisJY2NpZDNfaGNfdHhfdXBkYXRlX3MoaGN0eCwgbGVuKTsKIAotCQlwYWNrZXQgPSBkY2NwX3R4X2hpc3RfaGVhZCgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QpOwotCQlpZiAodW5saWtlbHkocGFja2V0ID09IE5VTEwpKSB7Ci0JCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiBwYWNrZXQgZG9lc24ndCAiCi0JCQkJICAgICAgICJleGlzdHMgaW4gaGlzdG9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHVubGlrZWx5KHBhY2tldC0+ZGNjcGh0eF9zZW50KSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogbm8gdW5zZW50IHBhY2tldCBpbiAiCi0JCQkJICAgICAgICJoaXN0b3J5IVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybjsKLQkJfQotCQlwYWNrZXQtPmRjY3BodHhfdHN0YW1wID0gbm93OwotCQlwYWNrZXQtPmRjY3BodHhfc2Vxbm8gID0gZHAtPmRjY3BzX2dzczsKLQkJLyoKLQkJICogQ2hlY2sgaWYgd2luX2NvdW50IGhhdmUgY2hhbmdlZAotCQkgKiBBbGdvcml0aG0gaW4gIjguMS4gV2luZG93IENvdW50ZXIgVmFsdWUiIGluIFJGQyA0MzQyLgotCQkgKi8KLQkJcXVhcnRlcl9ydHQgPSB0aW1ldmFsX2RlbHRhKCZub3csICZoY3R4LT5jY2lkM2hjdHhfdF9sYXN0X3dpbl9jb3VudCk7Ci0JCWlmIChsaWtlbHkoaGN0eC0+Y2NpZDNoY3R4X3J0dCA+IDgpKQotCQkJcXVhcnRlcl9ydHQgLz0gaGN0eC0+Y2NpZDNoY3R4X3J0dCAvIDQ7Ci0KLQkJaWYgKHF1YXJ0ZXJfcnR0ID4gMCkgewotCQkJaGN0eC0+Y2NpZDNoY3R4X3RfbGFzdF93aW5fY291bnQgPSBub3c7Ci0JCQloY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQJID0gKGhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudCArCi0JCQkJCQkJICAgIG1pbl90KHVuc2lnbmVkIGxvbmcsIHF1YXJ0ZXJfcnR0LCA1KSkgJSAxNjsKLQkJCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIHdpbmRvdyBjaGFuZ2VkIGZyb20gIgotCQkJCSAgICAgICAiJXUgdG8gJXUhXG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKLQkJCQkgICAgICAgcGFja2V0LT5kY2NwaHR4X2NjdmFsLAotCQkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQpOwotCQl9Ci0KLQkJaGN0eC0+Y2NpZDNoY3R4X2lkbGUgPSAwOwotCQlwYWNrZXQtPmRjY3BodHhfcnR0ICA9IGhjdHgtPmNjaWQzaGN0eF9ydHQ7Ci0JCXBhY2tldC0+ZGNjcGh0eF9zZW50ID0gMTsKLQl9IGVsc2UKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgc2Vxbm89JWxsdSBOT1QgaW5zZXJ0ZWQhXG4iLAotCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLCBkcC0+ZGNjcHNfZ3NzKTsKLQotCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7Ci0JY2FzZSBURlJDX1NTVEFURV9OT19TRU5UOgotCQkvKiBpZiBmaXJzdCB3YXNuJ3QgcHVyZSBhY2sgKi8KLQkJaWYgKGxlbiAhPSAwKQotCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBGaXJzdCBwYWNrZXQgc2VudCBpcyBub3RlZCAiCi0JCQkJCSAiYXMgYSBkYXRhIHBhY2tldFxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzaykpOworCXBhY2tldCA9IGRjY3BfdHhfaGlzdF9oZWFkKCZoY3R4LT5jY2lkM2hjdHhfaGlzdCk7CisJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgeworCQlEQ0NQX1dBUk4oInBhY2tldCBkb2Vzbid0IGV4aXN0IGluIGhpc3RvcnkhXG4iKTsKIAkJcmV0dXJuOwotCWNhc2UgVEZSQ19TU1RBVEVfTk9fRkJBQ0s6Ci0JY2FzZSBURlJDX1NTVEFURV9GQkFDSzoKLQkJaWYgKGxlbiA+IDApIHsKLQkJCXRpbWV2YWxfc3ViX3VzZWNzKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sCi0JCQkJICBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwotCQkJY2NpZDNfY2FsY19uZXdfdF9pcGkoaGN0eCk7Ci0JCQljY2lkM19jYWxjX25ld19kZWx0YShoY3R4KTsKLQkJCXRpbWV2YWxfYWRkX3VzZWNzKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sCi0JCQkJCSAgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9DUklUICIlczogJXMsIHNrPSVwLCBJbGxlZ2FsIHN0YXRlICglZCkhXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzaywgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKTsKLQkJZHVtcF9zdGFjaygpOwotCQlicmVhazsKIAl9CisJaWYgKHVubGlrZWx5KHBhY2tldC0+ZGNjcGh0eF9zZW50KSkgeworCQlEQ0NQX1dBUk4oIm5vIHVuc2VudCBwYWNrZXQgaW4gaGlzdG9yeSFcbiIpOworCQlyZXR1cm47CisJfQorCXBhY2tldC0+ZGNjcGh0eF90c3RhbXAgPSBub3c7CisJcGFja2V0LT5kY2NwaHR4X3NlcW5vICA9IGRwLT5kY2Nwc19nc3M7CisJLyoKKwkgKiBDaGVjayBpZiB3aW5fY291bnQgaGF2ZSBjaGFuZ2VkCisJICogQWxnb3JpdGhtIGluICI4LjEuIFdpbmRvdyBDb3VudGVyIFZhbHVlIiBpbiBSRkMgNDM0Mi4KKwkgKi8KKwlxdWFydGVyX3J0dCA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJmhjdHgtPmNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50KTsKKwlpZiAobGlrZWx5KGhjdHgtPmNjaWQzaGN0eF9ydHQgPiA4KSkKKwkJcXVhcnRlcl9ydHQgLz0gaGN0eC0+Y2NpZDNoY3R4X3J0dCAvIDQ7CisKKwlpZiAocXVhcnRlcl9ydHQgPiAwKSB7CisJCWhjdHgtPmNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50ID0gbm93OworCQloY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQJID0gKGhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudCArCisJCQkJCQkgICAgbWluX3QodW5zaWduZWQgbG9uZywgcXVhcnRlcl9ydHQsIDUpKSAlIDE2OworCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCB3aW5kb3cgY2hhbmdlZCBmcm9tICIKKwkJCSAgICAgICAiJXUgdG8gJXUhXG4iLAorCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAorCQkJICAgICAgIHBhY2tldC0+ZGNjcGh0eF9jY3ZhbCwKKwkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQpOworCX0KKworCWhjdHgtPmNjaWQzaGN0eF9pZGxlID0gMDsKKwlwYWNrZXQtPmRjY3BodHhfcnR0ICA9IGhjdHgtPmNjaWQzaGN0eF9ydHQ7CisJcGFja2V0LT5kY2NwaHR4X3NlbnQgPSAxOwogfQogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9wYWNrZXRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCkBAIC00MzcsMTMgKzQxMiwxMSBAQAogCXN0cnVjdCBjY2lkM19vcHRpb25zX3JlY2VpdmVkICpvcHRfcmVjdjsKIAlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwotCXVuc2lnbmVkIGxvbmcgbmV4dF90bW91dDsgCi0JdTMyIHRfZWxhcHNlZDsKKwl1bnNpZ25lZCBsb25nIHRfbmZiOwogCXUzMiBwaW52OwotCXUzMiB4X3JlY3Y7Ci0JdTMyIHJfc2FtcGxlOworCWxvbmcgcl9zYW1wbGUsIHRfZWxhcHNlZDsKIAotCUJVR19PTihoY3R4ID09IE5VTEwgfHwgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pOworCUJVR19PTihoY3R4ID09IE5VTEwpOwogCiAJLyogd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBBQ0tzICovCiAJaWYgKCEoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9PSBEQ0NQX1BLVF9BQ0sgfHwKQEAgLTQ1MiwzNyArNDI1LDQ1IEBACiAKIAlvcHRfcmVjdiA9ICZoY3R4LT5jY2lkM2hjdHhfb3B0aW9uc19yZWNlaXZlZDsKIAotCXRfZWxhcHNlZCA9IGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKLQl4X3JlY3YgPSBvcHRfcmVjdi0+Y2NpZDNvcl9yZWNlaXZlX3JhdGU7Ci0JcGludiA9IG9wdF9yZWN2LT5jY2lkM29yX2xvc3NfZXZlbnRfcmF0ZTsKLQogCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7Ci0JY2FzZSBURlJDX1NTVEFURV9OT19TRU5UOgotCQkvKiBGSVhNRTogd2hhdCB0byBkbyBoZXJlPyAqLwotCQlyZXR1cm47CiAJY2FzZSBURlJDX1NTVEFURV9OT19GQkFDSzoKIAljYXNlIFRGUkNfU1NUQVRFX0ZCQUNLOgotCQkvKiBDYWxjdWxhdGUgbmV3IHJvdW5kIHRyaXAgc2FtcGxlIGJ5Ci0JCSAqIFJfc2FtcGxlID0gKG5vdyAtIHRfcmVjdmRhdGEpIC0gdF9kZWxheSAqLwotCQkvKiBnZXQgdF9yZWN2ZGF0YSBmcm9tIGhpc3RvcnkgKi8KKwkJLyogZ2V0IHBhY2tldCBmcm9tIGhpc3RvcnkgdG8gbG9vayB1cCB0X3JlY3ZkYXRhICovCiAJCXBhY2tldCA9IGRjY3BfdHhfaGlzdF9maW5kX2VudHJ5KCZoY3R4LT5jY2lkM2hjdHhfaGlzdCwKIAkJCQkJCSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKIAkJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBzZXFubyAiCi0JCQkJICAgICAgICIlbGx1KCVzKSBkb2VzJ3QgZXhpc3QgaW4gaGlzdG9yeSFcbiIsCi0JCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2ssCisJCQlEQ0NQX1dBUk4oIiVzKCVwKSwgc2Vxbm8gJWxsdSglcykgZG9lc24ndCBleGlzdCAiCisJCQkJICAiaW4gaGlzdG9yeSFcbiIsICBkY2NwX3JvbGUoc2spLCBzaywKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCi0JCQkJZGNjcF9wYWNrZXRfbmFtZShEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlKSk7CisJCQkJICBkY2NwX3BhY2tldF9uYW1lKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUpKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCS8qIFVwZGF0ZSBSVFQgKi8KKwkJLyogVXBkYXRlIHJlY2VpdmUgcmF0ZSAqLworCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID0gb3B0X3JlY3YtPmNjaWQzb3JfcmVjZWl2ZV9yYXRlOworCisJCS8qIFVwZGF0ZSBsb3NzIGV2ZW50IHJhdGUgKi8KKwkJcGludiA9IG9wdF9yZWN2LT5jY2lkM29yX2xvc3NfZXZlbnRfcmF0ZTsKKwkJaWYgKHBpbnYgPT0gfjBVIHx8IHBpbnYgPT0gMCkKKwkJCWhjdHgtPmNjaWQzaGN0eF9wID0gMDsKKwkJZWxzZQorIAkJCWhjdHgtPmNjaWQzaGN0eF9wID0gMTAwMDAwMCAvIHBpbnY7CisKIAkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwotCQlyX3NhbXBsZSA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJnBhY2tldC0+ZGNjcGh0eF90c3RhbXApOwotCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gdF9lbGFwc2VkKSkKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHJfc2FtcGxlPSV1dXMsICIKLQkJCQkgICAgICAgInRfZWxhcHNlZD0ldXVzXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJfc2FtcGxlLCB0X2VsYXBzZWQpOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBuZXcgcm91bmQgdHJpcCBzYW1wbGUgYXMgcGVyIFtSRkMgMzQ0OCwgNC4zXSBieQorCQkgKiAJUl9zYW1wbGUgID0gIChub3cgLSB0X3JlY3ZkYXRhKSAtIHRfZWxhcHNlZAorCQkgKi8KKwkJcl9zYW1wbGUgID0gdGltZXZhbF9kZWx0YSgmbm93LCAmcGFja2V0LT5kY2NwaHR4X3RzdGFtcCk7CisJCXRfZWxhcHNlZCA9IGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKKworCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gMCkpIHsKKwkJCURDQ1BfV0FSTigiV0FSTklORzogUl9zYW1wbGUgKCVsZCkgPD0gMCFcbiIsIHJfc2FtcGxlKTsKKwkJCXJfc2FtcGxlID0gMDsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShyX3NhbXBsZSA8PSB0X2VsYXBzZWQpKQorCQkJRENDUF9XQVJOKCJXQVJOSU5HOiByX3NhbXBsZT0lbGR1cyA8PSB0X2VsYXBzZWQ9JWxkdXNcbiIsCisJCQkJICByX3NhbXBsZSwgdF9lbGFwc2VkKTsKIAkJZWxzZQogCQkJcl9zYW1wbGUgLT0gdF9lbGFwc2VkOwogCkBAIC00OTUsODIgKzQ3Niw3OSBAQAogCQkgKiBxIGlzIGEgY29uc3RhbnQsIFJGQyAzNDQ4IHJlY29tbWVudHMgMC45CiAJCSAqLwogCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX05PX0ZCQUNLKSB7CisJCQkvKiBVc2UgTGFyZ2VyIEluaXRpYWwgV2luZG93cyBbUkZDIDQzNDIsIHNlYy4gNV0KKwkJCSAqIFdlIGRldmlhdGUgaW4gdGhhdCB3ZSB1c2UgYHMnIGluc3RlYWQgb2YgYE1TUycuICovCisJCQl1MTYgd19pbml0ID0gbWF4KCAgICA0ICogaGN0eC0+Y2NpZDNoY3R4X3MsCisJCQkJCSBtYXgoMiAqIGhjdHgtPmNjaWQzaGN0eF9zLCA0MzgwKSk7CisJCQloY3R4LT5jY2lkM2hjdHhfcnR0ICA9IHJfc2FtcGxlOworCQkJaGN0eC0+Y2NpZDNoY3R4X3ggICAgPSB1c2Vjc19kaXYod19pbml0LCByX3NhbXBsZSk7CisJCQloY3R4LT5jY2lkM2hjdHhfdF9sZCA9IG5vdzsKKworCQkJY2NpZDNfdXBkYXRlX3NlbmRfdGltZShoY3R4KTsKKworCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgcz0ldSwgd19pbml0PSV1LCAiCisJCQkJICAgICAgICJSX3NhbXBsZT0lbGR1cywgWD0ldVxuIiwgZGNjcF9yb2xlKHNrKSwKKwkJCQkgICAgICAgc2ssIGhjdHgtPmNjaWQzaGN0eF9zLCB3X2luaXQsIHJfc2FtcGxlLAorCQkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfeCk7CisKIAkJCWNjaWQzX2hjX3R4X3NldF9zdGF0ZShzaywgVEZSQ19TU1RBVEVfRkJBQ0spOwotCQkJaGN0eC0+Y2NpZDNoY3R4X3J0dCA9IHJfc2FtcGxlOwotCQl9IGVsc2UKLQkJCWhjdHgtPmNjaWQzaGN0eF9ydHQgPSAoaGN0eC0+Y2NpZDNoY3R4X3J0dCAqIDkpIC8gMTAgKwotCQkJCQkgICAgICByX3NhbXBsZSAvIDEwOworCQl9IGVsc2UgeworCQkJaGN0eC0+Y2NpZDNoY3R4X3J0dCA9ICg5ICogaGN0eC0+Y2NpZDNoY3R4X3J0dCArCisJCQkJCSAgICAgICAgICAgKHUzMilyX3NhbXBsZSAgICAgICAgKSAvIDEwOwogCi0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIE5ldyBSVFQgZXN0aW1hdGU9JXV1cywgIgotCQkJICAgICAgICJyX3NhbXBsZT0ldXNcbiIsIGRjY3Bfcm9sZShzayksIHNrLAotCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9ydHQsIHJfc2FtcGxlKTsKKwkJCWNjaWQzX2hjX3R4X3VwZGF0ZV94KHNrLCAmbm93KTsKIAotCQkvKiBVcGRhdGUgdGltZW91dCBpbnRlcnZhbCAqLwotCQloY3R4LT5jY2lkM2hjdHhfdF9ydG8gPSBtYXhfdCh1MzIsIDQgKiBoY3R4LT5jY2lkM2hjdHhfcnR0LAotCQkJCQkgICAgICBVU0VDX1BFUl9TRUMpOwotCi0JCS8qIFVwZGF0ZSByZWNlaXZlIHJhdGUgKi8KLQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA9IHhfcmVjdjsvKiBYX3JlY3YgaW4gYnl0ZXMgcGVyIHNlYyAqLwotCi0JCS8qIFVwZGF0ZSBsb3NzIGV2ZW50IHJhdGUgKi8KLQkJaWYgKHBpbnYgPT0gfjAgfHwgcGludiA9PSAwKQotCQkJaGN0eC0+Y2NpZDNoY3R4X3AgPSAwOwotCQllbHNlIHsKLQkJCWhjdHgtPmNjaWQzaGN0eF9wID0gMTAwMDAwMCAvIHBpbnY7Ci0KLQkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA8IFRGUkNfU01BTExFU1RfUCkgewotCQkJCWhjdHgtPmNjaWQzaGN0eF9wID0gVEZSQ19TTUFMTEVTVF9QOwotCQkJCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIFNtYWxsZXN0IHAgdXNlZCFcbiIsCi0JCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzayk7Ci0JCQl9CisJCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBSVFQ9JXV1cyAoc2FtcGxlPSVsZHVzKSwgcz0ldSwgIgorCQkJCSAgICAgICAicD0ldSwgWF9jYWxjPSV1LCBYPSV1XG4iLCBkY2NwX3JvbGUoc2spLAorCQkJCSAgICAgICBzaywgaGN0eC0+Y2NpZDNoY3R4X3J0dCwgcl9zYW1wbGUsCisJCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9zLCBoY3R4LT5jY2lkM2hjdHhfcCwKKwkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYywKKwkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpOwogCQl9CiAKIAkJLyogdW5zY2hlZHVsZSBubyBmZWVkYmFjayB0aW1lciAqLwogCQlza19zdG9wX3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyKTsKIAotCQkvKiBVcGRhdGUgc2VuZGluZyByYXRlICovCi0JCWNjaWQzX2hjX3R4X3VwZGF0ZV94KHNrKTsKLQotCQkvKiBVcGRhdGUgbmV4dCBzZW5kIHRpbWUgKi8KLQkJdGltZXZhbF9zdWJfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwKLQkJCQkgIGhjdHgtPmNjaWQzaGN0eF90X2lwaSk7Ci0JCWNjaWQzX2NhbGNfbmV3X3RfaXBpKGhjdHgpOwotCQl0aW1ldmFsX2FkZF91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLAotCQkJCSAgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKLQkJY2NpZDNfY2FsY19uZXdfZGVsdGEoaGN0eCk7Ci0KIAkJLyogcmVtb3ZlIGFsbCBwYWNrZXRzIG9sZGVyIHRoYW4gdGhlIG9uZSBhY2tlZCBmcm9tIGhpc3RvcnkgKi8KIAkJZGNjcF90eF9oaXN0X3B1cmdlX29sZGVyKGNjaWQzX3R4X2hpc3QsCiAJCQkJCSAmaGN0eC0+Y2NpZDNoY3R4X2hpc3QsIHBhY2tldCk7CiAJCS8qCiAJCSAqIEFzIHdlIGhhdmUgY2FsY3VsYXRlZCBuZXcgaXBpLCBkZWx0YSwgdF9ub20gaXQgaXMgcG9zc2libGUgdGhhdAotCQkgKiB3ZSBub3cgY2FuIHNlbmQgYSBwYWNrZXQsIHNvIHdha2UgdXAgZGNjcF93YWl0X2Zvcl9jY2lkcy4KKwkJICogd2Ugbm93IGNhbiBzZW5kIGEgcGFja2V0LCBzbyB3YWtlIHVwIGRjY3Bfd2FpdF9mb3JfY2NpZAogCQkgKi8KIAkJc2stPnNrX3dyaXRlX3NwYWNlKHNrKTsKIAogCQkvKgotCQkgKiBTY2hlZHVsZSBubyBmZWVkYmFjayB0aW1lciB0byBleHBpcmUgaW4KLQkJICogbWF4KDQgKiBSLCAyICogcyAvIFgpCisJCSAqIFVwZGF0ZSB0aW1lb3V0IGludGVydmFsIGZvciB0aGUgbm9mZWVkYmFjayB0aW1lci4KKwkJICogV2UgdXNlIGEgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gaW5jcmVhc2UgdGhlIGxvd2VyIGJvdW5kLgorCQkgKiBUaGlzIGNhbiBoZWxwIGF2b2lkIHRyaWdnZXJpbmcgdGhlIG5vZmVlZGJhY2sgdGltZXIgdG9vIG9mdGVuCisJCSAqICgnc3Bpbm5pbmcnKSBvbiBMQU5zIHdpdGggc21hbGwgUlRUcy4KIAkJICovCi0JCW5leHRfdG1vdXQgPSBtYXgoaGN0eC0+Y2NpZDNoY3R4X3RfcnRvLAotCQkJCSAyICogdXNlY3NfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpKTsKKwkJaGN0eC0+Y2NpZDNoY3R4X3RfcnRvID0gbWF4X3QodTMyLCA0ICogaGN0eC0+Y2NpZDNoY3R4X3J0dCwKKwkJCQkJCSAgIENPTkZJR19JUF9EQ0NQX0NDSUQzX1JUTyAqCisJCQkJCQkgICAoVVNFQ19QRVJfU0VDLzEwMDApCSAgICAgKTsKKwkJLyoKKwkJICogU2NoZWR1bGUgbm8gZmVlZGJhY2sgdGltZXIgdG8gZXhwaXJlIGluCisJCSAqIG1heCh0X1JUTywgMiAqIHMvWCkgID0gIG1heCh0X1JUTywgMiAqIHRfaXBpKQorCQkgKi8KKwkJdF9uZmIgPSBtYXgoaGN0eC0+Y2NpZDNoY3R4X3RfcnRvLCAyICogaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKIAkJCQogCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBTY2hlZHVsZWQgbm8gZmVlZGJhY2sgdGltZXIgdG8gIgogCQkJICAgICAgICJleHBpcmUgaW4gJWx1IGppZmZpZXMgKCVsdXVzKVxuIiwKIAkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKLQkJCSAgICAgICB1c2Vjc190b19qaWZmaWVzKG5leHRfdG1vdXQpLCBuZXh0X3Rtb3V0KTsgCisJCQkgICAgICAgdXNlY3NfdG9famlmZmllcyh0X25mYiksIHRfbmZiKTsKIAogCQlza19yZXNldF90aW1lcihzaywgJmhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lciwgCi0JCQkgICAgICAgamlmZmllcyArIG1heF90KHUzMiwgMSwgdXNlY3NfdG9famlmZmllcyhuZXh0X3Rtb3V0KSkpOworCQkJCSAgIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRfbmZiKSk7CiAKIAkJLyogc2V0IGlkbGUgZmxhZyAqLwogCQloY3R4LT5jY2lkM2hjdHhfaWRsZSA9IDE7ICAgCiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiAlcywgc2s9JXAsIElsbGVnYWwgc3RhdGUgKCVkKSFcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrLCBoY3R4LT5jY2lkM2hjdHhfc3RhdGUpOwotCQlkdW1wX3N0YWNrKCk7CisJY2FzZSBURlJDX1NTVEFURV9OT19TRU5UOgorCQlpZiAoZGNjcF9zayhzayktPmRjY3BzX3JvbGUgPT0gRENDUF9ST0xFX0NMSUVOVCkKKwkJCURDQ1BfV0FSTigiSWxsZWdhbCBBQ0sgcmVjZWl2ZWQgLSBubyBwYWNrZXQgc2VudFxuIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVEZSQ19TU1RBVEVfVEVSTToJCS8qIGlnbm9yZSBmZWVkYmFjayB3aGVuIGNsb3NpbmcgKi8KIAkJYnJlYWs7CiAJfQogfQpAQCAtNjEwLDkgKzU4OCw5IEBACiAJc3dpdGNoIChvcHRpb24pIHsKIAljYXNlIFRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURToKIAkJaWYgKHVubGlrZWx5KGxlbiAhPSA0KSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBpbnZhbGlkICIKLQkJCQkgICAgICAgImxlbiBmb3IgVEZSQ19PUFRfTE9TU19FVkVOVF9SQVRFXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJCURDQ1BfV0FSTigiJXMsIHNrPSVwLCBpbnZhbGlkIGxlbiAlZCAiCisJCQkJICAiZm9yIFRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURVxuIiwKKwkJCQkgIGRjY3Bfcm9sZShzayksIHNrLCBsZW4pOwogCQkJcmMgPSAtRUlOVkFMOwogCQl9IGVsc2UgewogCQkJb3B0X3JlY3YtPmNjaWQzb3JfbG9zc19ldmVudF9yYXRlID0gbnRvaGwoKihfX2JlMzIgKil2YWx1ZSk7CkBAIC02MzEsOSArNjA5LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBURlJDX09QVF9SRUNFSVZFX1JBVEU6CiAJCWlmICh1bmxpa2VseShsZW4gIT0gNCkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgaW52YWxpZCAiCi0JCQkJICAgICAgICJsZW4gZm9yIFRGUkNfT1BUX1JFQ0VJVkVfUkFURVxuIiwKLQkJCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7CisJCQlEQ0NQX1dBUk4oIiVzLCBzaz0lcCwgaW52YWxpZCBsZW4gJWQgIgorCQkJCSAgImZvciBURlJDX09QVF9SRUNFSVZFX1JBVEVcbiIsCisJCQkJICBkY2NwX3JvbGUoc2spLCBzaywgbGVuKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCW9wdF9yZWN2LT5jY2lkM29yX3JlY2VpdmVfcmF0ZSA9IG50b2hsKCooX19iZTMyICopdmFsdWUpOwpAQCAtNjQ5LDE4ICs2MjcsOSBAQAogCiBzdGF0aWMgaW50IGNjaWQzX2hjX3R4X2luaXQoc3RydWN0IGNjaWQgKmNjaWQsIHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZF9wcml2KGNjaWQpOwogCi0JaWYgKGRwLT5kY2Nwc19wYWNrZXRfc2l6ZSA+PSBURlJDX01JTl9QQUNLRVRfU0laRSAmJgotCSAgICBkcC0+ZGNjcHNfcGFja2V0X3NpemUgPD0gVEZSQ19NQVhfUEFDS0VUX1NJWkUpCi0JCWhjdHgtPmNjaWQzaGN0eF9zID0gZHAtPmRjY3BzX3BhY2tldF9zaXplOwotCWVsc2UKLQkJaGN0eC0+Y2NpZDNoY3R4X3MgPSBURlJDX1NURF9QQUNLRVRfU0laRTsKLQotCS8qIFNldCB0cmFuc21pc3Npb24gcmF0ZSB0byAxIHBhY2tldCBwZXIgc2Vjb25kICovCi0JaGN0eC0+Y2NpZDNoY3R4X3ggICAgID0gaGN0eC0+Y2NpZDNoY3R4X3M7Ci0JaGN0eC0+Y2NpZDNoY3R4X3RfcnRvID0gVVNFQ19QRVJfU0VDOworCWhjdHgtPmNjaWQzaGN0eF9zICAgICA9IDA7CiAJaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID0gVEZSQ19TU1RBVEVfTk9fU0VOVDsKIAlJTklUX0xJU1RfSEVBRCgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QpOwogCkBAIC02ODgsMTQgKzY1Nyw3IEBACiAgKiBSWCBIYWxmIENvbm5lY3Rpb24gbWV0aG9kcwogICovCiAKLS8qIFRGUkMgcmVjZWl2ZXIgc3RhdGVzICovCi1lbnVtIGNjaWQzX2hjX3J4X3N0YXRlcyB7Ci0gICAgICAgCVRGUkNfUlNUQVRFX05PX0RBVEEgPSAxLAotCVRGUkNfUlNUQVRFX0RBVEEsCi0JVEZSQ19SU1RBVEVfVEVSTSAgICA9IDEyNywKLX07Ci0KLSNpZmRlZiBDQ0lEM19ERUJVRworI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCiBzdGF0aWMgY29uc3QgY2hhciAqY2NpZDNfcnhfc3RhdGVfbmFtZShlbnVtIGNjaWQzX2hjX3J4X3N0YXRlcyBzdGF0ZSkKIHsKIAlzdGF0aWMgY2hhciAqY2NpZDNfcnhfc3RhdGVfbmFtZXNbXSA9IHsKQEAgLTcyMSw2ICs2ODMsMTUgQEAKIAloY3J4LT5jY2lkM2hjcnhfc3RhdGUgPSBzdGF0ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX2hjX3J4X3VwZGF0ZV9zKHN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4LCBpbnQgbGVuKQoreworCWlmICh1bmxpa2VseShsZW4gPT0gMCkpCS8qIGRvbid0IHVwZGF0ZSBvbiBlbXB0eSBwYWNrZXRzIChlLmcuIEFDS3MpICovCisJCWNjaWQzX3ByX2RlYnVnKCJQYWNrZXQgcGF5bG9hZCBsZW5ndGggaXMgMCAtIG5vdCB1cGRhdGluZ1xuIik7CisJZWxzZQorCQloY3J4LT5jY2lkM2hjcnhfcyA9IGhjcngtPmNjaWQzaGNyeF9zID09IDAgPyBsZW4gOgorCQkJCSAgICAoOSAqIGhjcngtPmNjaWQzaGNyeF9zICsgbGVuKSAvIDEwOworfQorCiBzdGF0aWMgdm9pZCBjY2lkM19oY19yeF9zZW5kX2ZlZWRiYWNrKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKQEAgLTc0MywxOCArNzE0LDE1IEBACiAJCQkJCQkgICBkZWx0YSk7CiAJfQogCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9DUklUICIlczogJXMsIHNrPSVwLCBJbGxlZ2FsIHN0YXRlICglZCkhXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzaywgaGNyeC0+Y2NpZDNoY3J4X3N0YXRlKTsKLQkJZHVtcF9zdGFjaygpOworCWNhc2UgVEZSQ19SU1RBVEVfVEVSTToKKwkJRENDUF9CVUcoIklsbGVnYWwgJXMgc3RhdGUgVEVSTSwgc2s9JXAiLCBkY2NwX3JvbGUoc2spLCBzayk7CiAJCXJldHVybjsKIAl9CiAKIAlwYWNrZXQgPSBkY2NwX3J4X2hpc3RfZmluZF9kYXRhX3BhY2tldCgmaGNyeC0+Y2NpZDNoY3J4X2hpc3QpOwogCWlmICh1bmxpa2VseShwYWNrZXQgPT0gTlVMTCkpIHsKLQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBubyBkYXRhIHBhY2tldCAiCi0JCQkgICAgICAgImluIGhpc3RvcnkhXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOworCQlEQ0NQX1dBUk4oIiVzLCBzaz0lcCwgbm8gZGF0YSBwYWNrZXQgaW4gaGlzdG9yeSFcbiIsCisJCQkgIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODQyLDI5ICs4MTAsMjkgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoc3RlcCA9PSAwKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIHBhY2tldCBoaXN0b3J5ICIKLQkJCSAgICAgICAiY29udGFpbnMgbm8gZGF0YSBwYWNrZXRzIVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJRENDUF9XQVJOKCIlcywgc2s9JXAsIHBhY2tldCBoaXN0b3J5IGhhcyBubyBkYXRhIHBhY2tldHMhXG4iLAorCQkJICBkY2NwX3JvbGUoc2spLCBzayk7CiAJCXJldHVybiB+MDsKIAl9CiAKIAlpZiAodW5saWtlbHkoaW50ZXJ2YWwgPT0gMCkpIHsKLQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBDb3VsZCBub3QgZmluZCBhICIKLQkJCSAgICAgICAid2luX2NvdW50IGludGVydmFsID4gMC4gRGVmYXVsdGluZyB0byAxXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOworCQlEQ0NQX1dBUk4oIiVzLCBzaz0lcCwgQ291bGQgbm90IGZpbmQgYSB3aW5fY291bnQgaW50ZXJ2YWwgPiAwLiIKKwkJCSAgIkRlZmF1bHRpbmcgdG8gMVxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwogCQlpbnRlcnZhbCA9IDE7CiAJfQogZm91bmQ6CiAJaWYgKCF0YWlsKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHRhaWwgaXMgbnVsbFxuIiwKLQkJICAgX19GVU5DVElPTl9fKTsKKwkJRENDUF9DUklUKCJ0YWlsIGlzIG51bGxcbiIpOwogCQlyZXR1cm4gfjA7CiAJfQogCXJ0dCA9IHRpbWV2YWxfZGVsdGEoJnRzdGFtcCwgJnRhaWwtPmRjY3BocnhfdHN0YW1wKSAqIDQgLyBpbnRlcnZhbDsKIAljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBhcHByb3hpbWF0ZWQgUlRUIHRvICV1dXNcbiIsCiAJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywgcnR0KTsKLQlpZiAocnR0ID09IDApCi0JCXJ0dCA9IDE7CisKKwlpZiAocnR0ID09IDApIHsKKwkJRENDUF9XQVJOKCJSVFQ9PTAsIHNldHRpbmcgdG8gMVxuIik7CisgCQlydHQgPSAxOworCX0KIAogCWRjY3BfdGltZXN0YW1wKHNrLCAmdHN0YW1wKTsKIAlkZWx0YSA9IHRpbWV2YWxfZGVsdGEoJnRzdGFtcCwgJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayk7CkBAIC04NzgsOSArODQ2LDcgQEAKIAl0bXAyID0gKHUzMil0bXAxOwogCiAJaWYgKCF0bXAyKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAidG1wMiA9IDAgIgotCQkgICAiJXM6IHhfcmVjdiA9ICV1LCBydHQgPSV1XG4iLAotCQkgICBfX0ZVTkNUSU9OX18sIHhfcmVjdiwgcnR0KTsKKwkJRENDUF9DUklUKCJ0bXAyID0gMCwgeF9yZWN2ID0gJXUsIHJ0dCA9JXVcbiIsIHhfcmVjdiwgcnR0KTsKIAkJcmV0dXJuIH4wOwogCX0KIApAQCAtOTI2LDggKzg5Miw3IEBACiAJCWVudHJ5ID0gZGNjcF9saV9oaXN0X2VudHJ5X25ldyhjY2lkM19saV9oaXN0LCBTTEFCX0FUT01JQyk7CiAKIAkJaWYgKGVudHJ5ID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQlkdW1wX3N0YWNrKCk7CisJCQlEQ0NQX0JVRygib3V0IG9mIG1lbW9yeSAtIGNhbiBub3QgYWxsb2NhdGUgZW50cnkiKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0xMDAyLDEzICs5NjcsMTAgQEAKIAljb25zdCBzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcmVjdjsKIAlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwotCXU4IHdpbl9jb3VudDsKIAl1MzIgcF9wcmV2LCBydHRfcHJldiwgcl9zYW1wbGUsIHRfZWxhcHNlZDsKLQlpbnQgbG9zczsKKwlpbnQgbG9zcywgcGF5bG9hZF9zaXplOwogCi0JQlVHX09OKGhjcnggPT0gTlVMTCB8fAotCSAgICAgICAhKGhjcngtPmNjaWQzaGNyeF9zdGF0ZSA9PSBURlJDX1JTVEFURV9OT19EQVRBIHx8Ci0JCSBoY3J4LT5jY2lkM2hjcnhfc3RhdGUgPT0gVEZSQ19SU1RBVEVfREFUQSkpOworCUJVR19PTihoY3J4ID09IE5VTEwpOwogCiAJb3B0X3JlY3YgPSAmZGNjcF9zayhzayktPmRjY3BzX29wdGlvbnNfcmVjZWl2ZWQ7CiAKQEAgLTEwMjYsOSArOTg4LDggQEAKIAkJdF9lbGFwc2VkID0gb3B0X3JlY3YtPmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKIAogCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gdF9lbGFwc2VkKSkKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHJfc2FtcGxlPSV1dXMsICIKLQkJCQkgICAgICAgInRfZWxhcHNlZD0ldXVzXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJfc2FtcGxlLCB0X2VsYXBzZWQpOworCQkJRENDUF9XQVJOKCJyX3NhbXBsZT0ldXVzLCB0X2VsYXBzZWQ9JXV1c1xuIiwKKwkJCQkgIHJfc2FtcGxlLCB0X2VsYXBzZWQpOwogCQllbHNlCiAJCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7CiAKQEAgLTEwNTIsMTkgKzEwMTMsMTkgQEAKIAlwYWNrZXQgPSBkY2NwX3J4X2hpc3RfZW50cnlfbmV3KGNjaWQzX3J4X2hpc3QsIHNrLCBvcHRfcmVjdi0+ZGNjcG9yX25kcCwKIAkJCQkJc2tiLCBTTEFCX0FUT01JQyk7CiAJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIE5vdCBlbm91Z2ggbWVtIHRvICIKLQkJCQkiYWRkIHJ4IHBhY2tldCB0byBoaXN0b3J5LCBjb25zaWRlciBpdCBsb3N0IVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJRENDUF9XQVJOKCIlcywgc2s9JXAsIE5vdCBlbm91Z2ggbWVtIHRvIGFkZCByeCBwYWNrZXQgIgorCQkJICAidG8gaGlzdG9yeSwgY29uc2lkZXIgaXQgbG9zdCFcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIAotCXdpbl9jb3VudCA9IHBhY2tldC0+ZGNjcGhyeF9jY3ZhbDsKLQogCWxvc3MgPSBjY2lkM19oY19yeF9kZXRlY3RfbG9zcyhzaywgcGFja2V0KTsKIAogCWlmIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID09IERDQ1BfUEtUX0FDSykKIAkJcmV0dXJuOwogCisJcGF5bG9hZF9zaXplID0gc2tiLT5sZW4gLSBkY2NwX2hkcihza2IpLT5kY2NwaF9kb2ZmICogNDsKKwljY2lkM19oY19yeF91cGRhdGVfcyhoY3J4LCBwYXlsb2FkX3NpemUpOworCiAJc3dpdGNoIChoY3J4LT5jY2lkM2hjcnhfc3RhdGUpIHsKIAljYXNlIFRGUkNfUlNUQVRFX05PX0RBVEE6CiAJCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAoJXMpLCBza2I9JXAsIHNlbmRpbmcgaW5pdGlhbCAiCkBAIC0xMDc1LDggKzEwMzYsNyBAQAogCQljY2lkM19oY19yeF9zZXRfc3RhdGUoc2ssIFRGUkNfUlNUQVRFX0RBVEEpOwogCQlyZXR1cm47CiAJY2FzZSBURlJDX1JTVEFURV9EQVRBOgotCQloY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiArPSBza2ItPmxlbiAtCi0JCQkJCSAgICAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX2RvZmYgKiA0OworCQloY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiArPSBwYXlsb2FkX3NpemU7CiAJCWlmIChsb3NzKQogCQkJYnJlYWs7CiAKQEAgLTEwODcsMTAgKzEwNDcsOCBAQAogCQkJY2NpZDNfaGNfcnhfc2VuZF9mZWVkYmFjayhzayk7CiAJCX0KIAkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiAlcywgc2s9JXAsIElsbGVnYWwgc3RhdGUgKCVkKSFcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrLCBoY3J4LT5jY2lkM2hjcnhfc3RhdGUpOwotCQlkdW1wX3N0YWNrKCk7CisJY2FzZSBURlJDX1JTVEFURV9URVJNOgorCQlEQ0NQX0JVRygiSWxsZWdhbCAlcyBzdGF0ZSBURVJNLCBzaz0lcCIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTEwNywxMCArMTA2NSw4IEBACiAJCS8qIFNjYWxpbmcgdXAgYnkgMTAwMDAwMCBhcyBmaXhlZCBkZWNpbWFsICovCiAJCWlmIChpX21lYW4gIT0gMCkKIAkJCWhjcngtPmNjaWQzaGNyeF9wID0gMTAwMDAwMCAvIGlfbWVhbjsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9DUklUICIlczogZW1wdHkgbG9zcyBoaXN0XG4iLF9fRlVOQ1RJT05fXyk7Ci0JCWR1bXBfc3RhY2soKTsKLQl9CisJfSBlbHNlCisJCURDQ1BfQlVHKCJlbXB0eSBsb3NzIGhpc3RvcnkiKTsKIAogCWlmIChoY3J4LT5jY2lkM2hjcnhfcCA+IHBfcHJldikgewogCQljY2lkM19oY19yeF9zZW5kX2ZlZWRiYWNrKHNrKTsKQEAgLTExMjAsMjIgKzEwNzYsMTYgQEAKIAogc3RhdGljIGludCBjY2lkM19oY19yeF9pbml0KHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWRfcHJpdihjY2lkKTsKIAogCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXBcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAotCWlmIChkcC0+ZGNjcHNfcGFja2V0X3NpemUgPj0gVEZSQ19NSU5fUEFDS0VUX1NJWkUgJiYKLQkgICAgZHAtPmRjY3BzX3BhY2tldF9zaXplIDw9IFRGUkNfTUFYX1BBQ0tFVF9TSVpFKQotCQloY3J4LT5jY2lkM2hjcnhfcyA9IGRwLT5kY2Nwc19wYWNrZXRfc2l6ZTsKLQllbHNlCi0JCWhjcngtPmNjaWQzaGNyeF9zID0gVEZSQ19TVERfUEFDS0VUX1NJWkU7Ci0KIAloY3J4LT5jY2lkM2hjcnhfc3RhdGUgPSBURlJDX1JTVEFURV9OT19EQVRBOwogCUlOSVRfTElTVF9IRUFEKCZoY3J4LT5jY2lkM2hjcnhfaGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmhjcngtPmNjaWQzaGNyeF9saV9oaXN0KTsKIAlkY2NwX3RpbWVzdGFtcChzaywgJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2spOwogCWhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayA9IGhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2s7CisJaGNyeC0+Y2NpZDNoY3J4X3MgICA9IDA7CiAJaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IDUwMDA7IC8qIFhYWCA1bXMgZm9yIG5vdy4uLiAqLwogCXJldHVybiAwOwogfQpAQCAtMTI2MSw4ICsxMjExLDEwIEBACiAJLmNjaWRfaGNfdHhfZ2V0c29ja29wdAkgICA9IGNjaWQzX2hjX3R4X2dldHNvY2tvcHQsCiB9OwogIAorI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCiBtb2R1bGVfcGFyYW0oY2NpZDNfZGVidWcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNjaWQzX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisjZW5kaWYKIAogc3RhdGljIF9faW5pdCBpbnQgY2NpZDNfbW9kdWxlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmggYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oCmluZGV4IDBhMmNiNzUuLjA3NTk2ZDcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmgKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaApAQCAtNDIsMjIgKzQyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvdGZyYy5oPgogI2luY2x1ZGUgIi4uL2NjaWQuaCIKIAotI2RlZmluZSBURlJDX01JTl9QQUNLRVRfU0laRQkgICAxNgotI2RlZmluZSBURlJDX1NURF9QQUNLRVRfU0laRQkgIDI1NgotI2RlZmluZSBURlJDX01BWF9QQUNLRVRfU0laRQk2NTUzNQotCi0vKiBUd28gc2Vjb25kcyBhcyBwZXIgQ0NJRDMgc3BlYyAqLworLyogVHdvIHNlY29uZHMgYXMgcGVyIFJGQyAzNDQ4IDQuMiAqLwogI2RlZmluZSBURlJDX0lOSVRJQUxfVElNRU9VVAkgICAoMiAqIFVTRUNfUEVSX1NFQykKIAotI2RlZmluZSBURlJDX0lOSVRJQUxfSVBJCSAgIChVU0VDX1BFUl9TRUMgLyA0KQotCiAvKiBJbiB1c2VjcyAtIGhhbGYgdGhlIHNjaGVkdWxpbmcgZ3JhbnVsYXJpdHkgYXMgcGVyIFJGQzM0NDggNC42ICovCiAjZGVmaW5lIFRGUkNfT1BTWVNfSEFMRl9USU1FX0dSQU4gIChVU0VDX1BFUl9TRUMgLyAoMiAqIEhaKSkKIAotLyogSW4gc2Vjb25kcyAqLwotI2RlZmluZSBURlJDX01BWF9CQUNLX09GRl9USU1FCSAgIDY0Ci0KLSNkZWZpbmUgVEZSQ19TTUFMTEVTVF9QCQkgICA0MAorLyogUGFyYW1ldGVyIHRfbWJpIGZyb20gW1JGQyAzNDQ4LCA0LjNdOiBiYWNrb2ZmIGludGVydmFsIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgVEZSQ19UX01CSQkJICAgNjQKIAogZW51bSBjY2lkM19vcHRpb25zIHsKIAlURlJDX09QVF9MT1NTX0VWRU5UX1JBVEUgPSAxOTIsCkBAIC03MywyNiArNjUsMzYgQEAKIAl1MzIgY2NpZDNvcl9yZWNlaXZlX3JhdGU7CiB9OwogCi0vKiogc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgLSBDQ0lEMyBzZW5kZXIgaGFsZiBjb25uZWN0aW9uIHNvY2sKKy8qIFRGUkMgc2VuZGVyIHN0YXRlcyAqLworZW51bSBjY2lkM19oY190eF9zdGF0ZXMgeworICAgICAgIAlURlJDX1NTVEFURV9OT19TRU5UID0gMSwKKwlURlJDX1NTVEFURV9OT19GQkFDSywKKwlURlJDX1NTVEFURV9GQkFDSywKKwlURlJDX1NTVEFURV9URVJNLAorfTsKKworLyoqIHN0cnVjdCBjY2lkM19oY190eF9zb2NrIC0gQ0NJRDMgc2VuZGVyIGhhbGYtY29ubmVjdGlvbiBzb2NrZXQKICAqCi0gICogQGNjaWQzaGN0eF9zdGF0ZSAtIFNlbmRlciBzdGF0ZQotICAqIEBjY2lkM2hjdHhfeCAtIEN1cnJlbnQgc2VuZGluZyByYXRlCi0gICogQGNjaWQzaGN0eF94X3JlY3YgLSBSZWNlaXZlIHJhdGUKLSAgKiBAY2NpZDNoY3R4X3hfY2FsYyAtIENhbGN1bGF0ZWQgc2VuZCAoPykgcmF0ZQotICAqIEBjY2lkM2hjdHhfcyAtIFBhY2tldCBzaXplCi0gICogQGNjaWQzaGN0eF9ydHQgLSBFc3RpbWF0ZSBvZiBjdXJyZW50IHJvdW5kIHRyaXAgdGltZSBpbiB1c2VjcwotICAqIEBAY2NpZDNoY3R4X3AgLSBDdXJyZW50IGxvc3MgZXZlbnQgcmF0ZSAoMC0xKSBzY2FsZWQgYnkgMTAwMDAwMAotICAqIEBjY2lkM2hjdHhfbGFzdF93aW5fY291bnQgLSBMYXN0IHdpbmRvdyBjb3VudGVyIHNlbnQKLSAgKiBAY2NpZDNoY3R4X3RfbGFzdF93aW5fY291bnQgLSBUaW1lc3RhbXAgb2YgZWFybGllc3QgcGFja2V0Ci0gICogCQkJCSAgd2l0aCBsYXN0X3dpbl9jb3VudCB2YWx1ZSBzZW50Ci0gICogQGNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lciAtIEhhbmRsZSB0byBubyBmZWVkYmFjayB0aW1lcgotICAqIEBjY2lkM2hjdHhfaWRsZSAtIEZJWE1FCi0gICogQGNjaWQzaGN0eF90X2xkIC0gVGltZSBsYXN0IGRvdWJsZWQgZHVyaW5nIHNsb3cgc3RhcnQKLSAgKiBAY2NpZDNoY3R4X3Rfbm9tIC0gTm9taW5hbCBzZW5kIHRpbWUgb2YgbmV4dCBwYWNrZXQKLSAgKiBAY2NpZDNoY3R4X3RfaXBpIC0gSW50ZXJwYWNrZXQgKHNlbmQpIGludGVydmFsCi0gICogQGNjaWQzaGN0eF9kZWx0YSAtIFNlbmQgdGltZXIgZGVsdGEKLSAgKiBAY2NpZDNoY3R4X2hpc3QgLSBQYWNrZXQgaGlzdG9yeQotICAqLworICogQGNjaWQzaGN0eF94IC0gQ3VycmVudCBzZW5kaW5nIHJhdGUKKyAqIEBjY2lkM2hjdHhfeF9yZWN2IC0gUmVjZWl2ZSByYXRlCisgKiBAY2NpZDNoY3R4X3hfY2FsYyAtIENhbGN1bGF0ZWQgc2VuZCByYXRlIChSRkMgMzQ0OCwgMy4xKQorICogQGNjaWQzaGN0eF9ydHQgLSBFc3RpbWF0ZSBvZiBjdXJyZW50IHJvdW5kIHRyaXAgdGltZSBpbiB1c2VjcworICogQGNjaWQzaGN0eF9wIC0gQ3VycmVudCBsb3NzIGV2ZW50IHJhdGUgKDAtMSkgc2NhbGVkIGJ5IDEwMDAwMDAKKyAqIEBjY2lkM2hjdHhfcyAtIFBhY2tldCBzaXplCisgKiBAY2NpZDNoY3R4X3RfcnRvIC0gUmV0cmFuc21pc3Npb24gVGltZW91dCAoUkZDIDM0NDgsIDMuMSkKKyAqIEBjY2lkM2hjdHhfdF9pcGkgLSBJbnRlcnBhY2tldCAoc2VuZCkgaW50ZXJ2YWwgKFJGQyAzNDQ4LCA0LjYpCisgKiBAY2NpZDNoY3R4X3N0YXRlIC0gU2VuZGVyIHN0YXRlLCBvbmUgb2YgJWNjaWQzX2hjX3R4X3N0YXRlcworICogQGNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudCAtIExhc3Qgd2luZG93IGNvdW50ZXIgc2VudAorICogQGNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50IC0gVGltZXN0YW1wIG9mIGVhcmxpZXN0IHBhY2tldAorICogCQkJCSB3aXRoIGxhc3Rfd2luX2NvdW50IHZhbHVlIHNlbnQKKyAqIEBjY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIgLSBIYW5kbGUgdG8gbm8gZmVlZGJhY2sgdGltZXIKKyAqIEBjY2lkM2hjdHhfaWRsZSAtIEZsYWcgaW5kaWNhdGluZyB0aGF0IHNlbmRlciBpcyBpZGxpbmcKKyAqIEBjY2lkM2hjdHhfdF9sZCAtIFRpbWUgbGFzdCBkb3VibGVkIGR1cmluZyBzbG93IHN0YXJ0CisgKiBAY2NpZDNoY3R4X3Rfbm9tIC0gTm9taW5hbCBzZW5kIHRpbWUgb2YgbmV4dCBwYWNrZXQKKyAqIEBjY2lkM2hjdHhfZGVsdGEgLSBTZW5kIHRpbWVyIGRlbHRhCisgKiBAY2NpZDNoY3R4X2hpc3QgLSBQYWNrZXQgaGlzdG9yeQorICogQGNjaWQzaGN0eF9vcHRpb25zX3JlY2VpdmVkIC0gUGFyc2VkIHNldCBvZiByZXRyaWV2ZWQgb3B0aW9ucworICovCiBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayB7CiAJc3RydWN0IHRmcmNfdHhfaW5mbwkJY2NpZDNoY3R4X3RmcmM7CiAjZGVmaW5lIGNjaWQzaGN0eF94CQkJY2NpZDNoY3R4X3RmcmMudGZyY3R4X3gKQEAgLTEwMyw3ICsxMDUsNyBAQAogI2RlZmluZSBjY2lkM2hjdHhfdF9ydG8JCQljY2lkM2hjdHhfdGZyYy50ZnJjdHhfcnRvCiAjZGVmaW5lIGNjaWQzaGN0eF90X2lwaQkJCWNjaWQzaGN0eF90ZnJjLnRmcmN0eF9pcGkKIAl1MTYJCQkJY2NpZDNoY3R4X3M7Ci0gIAl1OAkJCQljY2lkM2hjdHhfc3RhdGU7CisgIAllbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyAJY2NpZDNoY3R4X3N0YXRlOjg7CiAJdTgJCQkJY2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50OwogCXU4CQkJCWNjaWQzaGN0eF9pZGxlOwogCXN0cnVjdCB0aW1ldmFsCQkJY2NpZDNoY3R4X3RfbGFzdF93aW5fY291bnQ7CkBAIC0xMTUsMjMgKzExNyw0OCBAQAogCXN0cnVjdCBjY2lkM19vcHRpb25zX3JlY2VpdmVkCWNjaWQzaGN0eF9vcHRpb25zX3JlY2VpdmVkOwogfTsKIAorLyogVEZSQyByZWNlaXZlciBzdGF0ZXMgKi8KK2VudW0gY2NpZDNfaGNfcnhfc3RhdGVzIHsKKyAgICAgICAJVEZSQ19SU1RBVEVfTk9fREFUQSA9IDEsCisJVEZSQ19SU1RBVEVfREFUQSwKKwlURlJDX1JTVEFURV9URVJNICAgID0gMTI3LAorfTsKKworLyoqIHN0cnVjdCBjY2lkM19oY19yeF9zb2NrIC0gQ0NJRDMgcmVjZWl2ZXIgaGFsZi1jb25uZWN0aW9uIHNvY2tldAorICoKKyAqICBAY2NpZDNoY3J4X3hfcmVjdiAgLSAgUmVjZWl2ZXIgZXN0aW1hdGUgb2Ygc2VuZCByYXRlIChSRkMgMzQ0OCA0LjMpCisgKiAgQGNjaWQzaGNyeF9ydHQgIC0gIFJlY2VpdmVyIGVzdGltYXRlIG9mIHJ0dCAobm9uLXN0YW5kYXJkKQorICogIEBjY2lkM2hjcnhfcCAgLSAgY3VycmVudCBsb3NzIGV2ZW50IHJhdGUgKFJGQyAzNDQ4IDUuNCkKKyAqICBAY2NpZDNoY3J4X3NlcW5vX25vbmxvc3MgIC0gIExhc3QgcmVjZWl2ZWQgbm9uLWxvc3Mgc2VxdWVuY2UgbnVtYmVyCisgKiAgQGNjaWQzaGNyeF9jY3ZhbF9ub25sb3NzICAtICBMYXN0IHJlY2VpdmVkIG5vbi1sb3NzIFdpbmRvdyBDQ1ZhbAorICogIEBjY2lkM2hjcnhfY2N2YWxfbGFzdF9jb3VudGVyICAtICBUcmFja3Mgd2luZG93IGNvdW50ZXIgKFJGQyA0MzQyLCA4LjEpCisgKiAgQGNjaWQzaGNyeF9zdGF0ZSAgLSAgcmVjZWl2ZXIgc3RhdGUsIG9uZSBvZiAlY2NpZDNfaGNfcnhfc3RhdGVzCisgKiAgQGNjaWQzaGNyeF9ieXRlc19yZWN2ICAtICBUb3RhbCBzdW0gb2YgRENDUCBwYXlsb2FkIGJ5dGVzCisgKiAgQGNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayAgLSAgVGltZSBhdCB3aGljaCBsYXN0IGZlZWRiYWNrIHdhcyBzZW50CisgKiAgQGNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2sgIC0gIFRpbWUgYXQgd2hpY2ggbGFzdCBmZWVkYmFjayB3YXMgc2VudAorICogIEBjY2lkM2hjcnhfaGlzdCAgLSAgUGFja2V0IGhpc3RvcnkKKyAqICBAY2NpZDNoY3J4X2xpX2hpc3QgIC0gIExvc3MgSW50ZXJ2YWwgSGlzdG9yeQorICogIEBjY2lkM2hjcnhfcyAgLSAgUmVjZWl2ZWQgcGFja2V0IHNpemUgaW4gYnl0ZXMKKyAqICBAY2NpZDNoY3J4X3BpbnYgIC0gIEludmVyc2Ugb2YgTG9zcyBFdmVudCBSYXRlIChSRkMgNDM0Miwgc2VjLiA4LjUpCisgKiAgQGNjaWQzaGNyeF9lbGFwc2VkX3RpbWUgIC0gIFRpbWUgc2luY2UgcGFja2V0IHJlY2VwdGlvbgorICovCiBzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayB7Ci0Jc3RydWN0IHRmcmNfcnhfaW5mbwljY2lkM2hjcnhfdGZyYzsKLSNkZWZpbmUgY2NpZDNoY3J4X3hfcmVjdgljY2lkM2hjcnhfdGZyYy50ZnJjcnhfeF9yZWN2Ci0jZGVmaW5lIGNjaWQzaGNyeF9ydHQJCWNjaWQzaGNyeF90ZnJjLnRmcmNyeF9ydHQKLSNkZWZpbmUgY2NpZDNoY3J4X3AJCWNjaWQzaGNyeF90ZnJjLnRmcmNyeF9wCi0gIAl1NjQJCQljY2lkM2hjcnhfc2Vxbm9fbm9ubG9zczo0OCwKLQkJCQljY2lkM2hjcnhfY2N2YWxfbm9ubG9zczo0LAotCQkJCWNjaWQzaGNyeF9zdGF0ZTo4LAotCQkJCWNjaWQzaGNyeF9jY3ZhbF9sYXN0X2NvdW50ZXI6NDsKLSAgCXUzMgkJCWNjaWQzaGNyeF9ieXRlc19yZWN2OwotICAJc3RydWN0IHRpbWV2YWwJCWNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjazsKLSAgCXN0cnVjdCB0aW1ldmFsCQljY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrOwotCXN0cnVjdCBsaXN0X2hlYWQJY2NpZDNoY3J4X2hpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAljY2lkM2hjcnhfbGlfaGlzdDsKLSAgCXUxNgkJCWNjaWQzaGNyeF9zOwotICAJdTMyCQkJY2NpZDNoY3J4X3BpbnY7Ci0gIAl1MzIJCQljY2lkM2hjcnhfZWxhcHNlZF90aW1lOworCXN0cnVjdCB0ZnJjX3J4X2luZm8JCWNjaWQzaGNyeF90ZnJjOworI2RlZmluZSBjY2lkM2hjcnhfeF9yZWN2CQljY2lkM2hjcnhfdGZyYy50ZnJjcnhfeF9yZWN2CisjZGVmaW5lIGNjaWQzaGNyeF9ydHQJCQljY2lkM2hjcnhfdGZyYy50ZnJjcnhfcnR0CisjZGVmaW5lIGNjaWQzaGNyeF9wCQkJY2NpZDNoY3J4X3RmcmMudGZyY3J4X3AKKyAgCXU2NAkJCQljY2lkM2hjcnhfc2Vxbm9fbm9ubG9zczo0OCwKKwkJCQkJY2NpZDNoY3J4X2NjdmFsX25vbmxvc3M6NCwKKwkJCQkJY2NpZDNoY3J4X2NjdmFsX2xhc3RfY291bnRlcjo0OworCWVudW0gY2NpZDNfaGNfcnhfc3RhdGVzCQljY2lkM2hjcnhfc3RhdGU6ODsKKyAgCXUzMgkJCQljY2lkM2hjcnhfYnl0ZXNfcmVjdjsKKyAgCXN0cnVjdCB0aW1ldmFsCQkJY2NpZDNoY3J4X3RzdGFtcF9sYXN0X2ZlZWRiYWNrOworICAJc3RydWN0IHRpbWV2YWwJCQljY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrOworCXN0cnVjdCBsaXN0X2hlYWQJCWNjaWQzaGNyeF9oaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCWNjaWQzaGNyeF9saV9oaXN0OworICAJdTE2CQkJCWNjaWQzaGNyeF9zOworICAJdTMyCQkJCWNjaWQzaGNyeF9waW52OworICAJdTMyCQkJCWNjaWQzaGNyeF9lbGFwc2VkX3RpbWU7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpjY2lkM19oY190eF9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYwppbmRleCA5MDZjODFhLi40OGI5YjkzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KKyNpbmNsdWRlICIuLi8uLi9kY2NwLmgiCiAjaW5jbHVkZSAibG9zc19pbnRlcnZhbC5oIgogCiBzdHJ1Y3QgZGNjcF9saV9oaXN0ICpkY2NwX2xpX2hpc3RfbmV3KGNvbnN0IGNoYXIgKm5hbWUpCkBAIC0xMDksNyArMTA5LDcgQEAKIAlpX3RvdCA9IG1heChpX3RvdDAsIGlfdG90MSk7CiAKIAlpZiAoIXdfdG90KSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHdfdG90ID0gMFxuIiwgX19GVU5DVElPTl9fKTsKKwkJRENDUF9XQVJOKCJ3X3RvdCA9IDBcbiIpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQllbnRyeSA9IGRjY3BfbGlfaGlzdF9lbnRyeV9uZXcoaGlzdCwgU0xBQl9BVE9NSUMpOwogCQlpZiAoZW50cnkgPT0gTlVMTCkgewogCQkJZGNjcF9saV9oaXN0X3B1cmdlKGhpc3QsIGxpc3QpOwotCQkJZHVtcF9zdGFjaygpOworCQkJRENDUF9CVUcoImxvc3MgaW50ZXJ2YWwgbGlzdCBlbnRyeSBpcyBOVUxMIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQllbnRyeS0+ZGNjcGxpaF9pbnRlcnZhbCA9IH4wOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmNfZXF1YXRpb24uYyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjX2VxdWF0aW9uLmMKaW5kZXggNDQwNzZlMC4uZGRhYzJjNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmNfZXF1YXRpb24uYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyY19lcXVhdGlvbi5jCkBAIC0xMywxNiArMTMsODQgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQorI2luY2x1ZGUgIi4uLy4uL2RjY3AuaCIKICNpbmNsdWRlICJ0ZnJjLmgiCiAKICNkZWZpbmUgVEZSQ19DQUxDX1hfQVJSU0laRSA1MDAKKyNkZWZpbmUgVEZSQ19DQUxDX1hfU1BMSVQgICA1MDAwMAkvKiAwLjA1ICogMTAwMDAwMCwgZGV0YWlscyBiZWxvdyAqLworI2RlZmluZSBURlJDX1NNQUxMRVNUX1AJICAgIChURlJDX0NBTENfWF9TUExJVC9URlJDX0NBTENfWF9BUlJTSVpFKQogCi0jZGVmaW5lIFRGUkNfQ0FMQ19YX1NQTElUIDUwMDAwCi0vKiBlcXVpdmFsZW50IHRvIDAuMDUgKi8KKy8qCisgIFRGUkMgVENQIFJlbm8gVGhyb3VnaHB1dCBFcXVhdGlvbiBMb29rdXAgVGFibGUgZm9yIGYocCkKIAorICBUaGUgZm9sbG93aW5nIHR3by1jb2x1bW4gbG9va3VwIHRhYmxlIGltcGxlbWVudHMgYSBwYXJ0IG9mIHRoZSBUQ1AgdGhyb3VnaHB1dAorICBlcXVhdGlvbiBmcm9tIFtSRkMgMzQ0OCwgc2VjLiAzLjFdOgorCisJIAkJCSAgICAgcworICBYX2NhbGMgID0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgICBSICogc3FydCgyKmIqcC8zKSArICgzICogdF9SVE8gKiBzcXJ0KDMqYipwLzgpICogKHAgKyAzMipwXjMpKQorCisgIFdoZXJlOgorCVggICAgICBpcyB0aGUgdHJhbnNtaXQgcmF0ZSBpbiBieXRlcy9zZWNvbmQKKwlzICAgICAgaXMgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzCisJUiAgICAgIGlzIHRoZSByb3VuZCB0cmlwIHRpbWUgaW4gc2Vjb25kcworCXAgICAgICBpcyB0aGUgbG9zcyBldmVudCByYXRlLCBiZXR3ZWVuIDAgYW5kIDEuMCwgb2YgdGhlIG51bWJlciBvZiBsb3NzCisJICAgICAgICAgICAgICBldmVudHMgYXMgYSBmcmFjdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQKKwl0X1JUTyAgaXMgdGhlIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMKKwliICAgICAgaXMgdGhlIG51bWJlciBvZiBwYWNrZXRzIGFja25vd2xlZGdlZCBieSBhIHNpbmdsZSBUQ1AgQUNLCisKKyAgV2UgY2FuIGFzc3VtZSB0aGF0IGIgPSAxIGFuZCB0X1JUTyBpcyA0ICogUi4gVGhlIGVxdWF0aW9uIG5vdyBiZWNvbWVzOgorCisJCQkJICAgICBzCisgIFhfY2FsYyAgPSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICAgUiAqIHNxcnQocCoyLzMpICsgKDEyICogUiAqIHNxcnQocCozLzgpICogKHAgKyAzMipwXjMpKQorCisgIHdoaWNoIHdlIGNhbiBicmVhayBkb3duIGludG86CisKKyAgICAgICAgICAgICAgICAgICAgICBzCisJWF9jYWxjICA9ICAtLS0tLS0tLS0KKwkgICAgICAgICAgICBSICogZihwKQorCisgIHdoZXJlIGYocCkgaXMgZ2l2ZW4gZm9yIDAgPCBwIDw9IDEgYnk6CisKKwlmKHApICA9ICBzcXJ0KDIqcC8zKSArIDEyICogc3FydCgzKnAvOCkgKiAgKHAgKyAzMipwXjMpCisKKyAgU2luY2UgdGhpcyBpcyBrZXJuZWwgY29kZSwgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBpcyBhdm9pZGVkIGluIGZhdm91ciBvZgorICBpbnRlZ2VyIGFyaXRobWV0aWMuIFRoaXMgbWVhbnMgdGhhdCBuZWFybHkgYWxsIGZyYWN0aW9uYWwgcGFyYW1ldGVycyBhcmUKKyAgc2NhbGVkIGJ5IDEwMDAwMDA6CisgICAgKiB0aGUgcGFyYW1ldGVycyBwIGFuZCBSCisgICAgKiB0aGUgcmV0dXJuIHJlc3VsdCBmKHApCisgIFRoZSBsb29rdXAgdGFibGUgdGhlcmVmb3JlIGFjdHVhbGx5IHRhYnVsYXRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGcocSk6CisKKyAgCWcocSkgID0gIDEwMDAwMDAgKiBmKHEvMTAwMDAwMCkKKworICBIZW5jZSwgd2hlbiBwIDw9IDEsIHEgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAwMDAwMC4gVG8gYWNoaWV2ZSBmaW5lcgorICBncmFudWxhcml0eSBmb3IgdGhlIHByYWN0aWNhbGx5IG1vcmUgcmVsZXZhbnQgY2FzZSBvZiBzbWFsbCB2YWx1ZXMgb2YgcCAodXAgdG8KKyAgNSUpLCB0aGUgc2Vjb25kIGNvbHVtbiBpcyB1c2VkOyB0aGUgZmlyc3Qgb25lIHJhbmdlcyB1cCB0byAxMDAlLiAgVGhpcyBzcGxpdAorICBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgb2YgcSA9IFRGUkNfQ0FMQ19YX1NQTElULiBBdCB0aGUgc2FtZSB0aW1lIHRoaXMgYWxzbworICBkZXRlcm1pbmVzIHRoZSBzbWFsbGVzdCByZXNvbHV0aW9uIHBvc3NpYmxlIHdpdGggdGhpcyBsb29rdXAgdGFibGU6CisKKyAgICBURlJDX1NNQUxMRVNUX1AgICA9ICBURlJDX0NBTENfWF9TUExJVCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkUKKworICBUaGUgZW50aXJlIHRhYmxlIGlzIGdlbmVyYXRlZCBieToKKyAgICBmb3IoaT0wOyBpIDwgVEZSQ19DQUxDX1hfQVJSU0laRTsgaSsrKSB7CisJbG9va3VwW2ldWzBdICA9ICBnKChpKzEpICogMTAwMDAwMC9URlJDX0NBTENfWF9BUlJTSVpFKTsKKwlsb29rdXBbaV1bMV0gID0gIGcoKGkrMSkgKiBURlJDX0NBTENfWF9TUExJVC9URlJDX0NBTENfWF9BUlJTSVpFKTsKKyAgICB9CisKKyAgV2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiwgd2UgaGF2ZSwgd2l0aCBNID0gVEZSQ19DQUxDX1hfQVJSU0laRS0xLAorICAgIGxvb2t1cFswXVswXSAgPSAgZygxMDAwMDAwLyhNKzEpKSAJCSA9ICAxMDAwMDAwICogZigwLjIlKQorICAgIGxvb2t1cFtNXVswXSAgPSAgZygxMDAwMDAwKQkJCSA9ICAxMDAwMDAwICogZigxMDAlKQorICAgIGxvb2t1cFswXVsxXSAgPSAgZyhURlJDX1NNQUxMRVNUX1ApCQkgID0gMTAwMDAwMCAqIGYoMC4wMSUpCisgICAgbG9va3VwW01dWzFdICA9ICBnKFRGUkNfQ0FMQ19YX1NQTElUKQkgPSAgMTAwMDAwMCAqIGYoNSUpCisKKyAgSW4gc3VtbWFyeSwgdGhlIHR3byBjb2x1bW5zIHJlcHJlc2VudCBmKHApIGZvciB0aGUgZm9sbG93aW5nIHJhbmdlczoKKyAgICAqIFRoZSBmaXJzdCBjb2x1bW4gaXMgZm9yICAgMC4wMDIgIDw9IHAgPD0gMS4wCisgICAgKiBUaGUgc2Vjb25kIGNvbHVtbiBpcyBmb3IgIDAuMDAwMSA8PSBwIDw9IDAuMDUKKyAgV2hlcmUgdGhlIGNvbHVtbnMgb3ZlcmxhcCwgdGhlIHNlY29uZCAoZmluZXItZ3JhaW5lZCkgaXMgZ2l2ZW4gcHJlZmVyZW5jZSwKKyAgaS5lLiB0aGUgZmlyc3QgY29sdW1uIGlzIHVzZWQgb25seSBmb3IgcCA+PSAwLjA1LgorICovCiBzdGF0aWMgY29uc3QgdTMyIHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFXVsyXSA9IHsKIAl7ICAgICAzNzE3MiwgICA4MTcyIH0sCiAJeyAgICAgNTM0OTksICAxMTU2NyB9LApAQCAtNTI2LDgzICs1OTQsNjkgQEAKIAl7IDI0MzMxNTk4MSwgMjcxMzA1IH0KIH07CiAKLS8qIENhbGN1bGF0ZSB0aGUgc2VuZCByYXRlIGFzIHBlciBzZWN0aW9uIDMuMSBvZiBSRkMzNDQ4Ci0gCi1SZXR1cm5zIHNlbmQgcmF0ZSBpbiBieXRlcyBwZXIgc2Vjb25kCisvKiByZXR1cm4gbGFyZ2VzdCBpbmRleCBpIHN1Y2ggdGhhdCBmdmFsIDw9IGxvb2t1cFtpXVtzbWFsbF0gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHRmcmNfYmluc2VhcmNoKHUzMiBmdmFsLCB1OCBzbWFsbCkKK3sKKwl1MzIgdHJ5LCBsb3cgPSAwLCBoaWdoID0gVEZSQ19DQUxDX1hfQVJSU0laRSAtIDE7CiAKLUludGVnZXIgbWF0aHMgYW5kIGxvb2t1cHMgYXJlIHVzZWQgYXMgbm90IGFsbG93ZWQgZmxvYXRpbmcgcG9pbnQgaW4ga2VybmVsCisJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKKwkJdHJ5ID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJaWYgKGZ2YWwgPD0gdGZyY19jYWxjX3hfbG9va3VwW3RyeV1bc21hbGxdKQorCQkJaGlnaCA9IHRyeTsKKwkJZWxzZQorCQkJbG93ICA9IHRyeSArIDE7CisJfQorCXJldHVybiBoaWdoOworfQogCi1UaGUgZnVuY3Rpb24gZm9yIFhjYWxjIGFzIHBlciBzZWN0aW9uIDMuMSBvZiBSRkMzNDQ4IGlzOgotCi1YID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcwotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIqc3FydCgyKmIqcC8zKSArICh0X1JUTyAqICgzKnNxcnQoMypiKnAvOCkgKiBwICogKDErMzIqcF4yKSkpCi0KLXdoZXJlIAotWCBpcyB0aGUgdHJhc21pdCByYXRlIGluIGJ5dGVzL3NlY29uZAotcyBpcyB0aGUgcGFja2V0IHNpemUgaW4gYnl0ZXMKLVIgaXMgdGhlIHJvdW5kIHRyaXAgdGltZSBpbiBzZWNvbmRzCi1wIGlzIHRoZSBsb3NzIGV2ZW50IHJhdGUsIGJldHdlZW4gMCBhbmQgMS4wLCBvZiB0aGUgbnVtYmVyIG9mIGxvc3MgZXZlbnRzIAotICBhcyBhIGZyYWN0aW9uIG9mIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0cmFuc21pdHRlZAotdF9SVE8gaXMgdGhlIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMKLWIgaXMgdGhlIG51bWJlciBvZiBwYWNrZXRzIGFja25vd2xlZGdlZCBieSBhIHNpbmdsZSBUQ1AgYWNrbm93bGVkZ2VtZW50Ci0KLXdlIGNhbiBhc3N1bWUgdGhhdCBiID0gMSBhbmQgdF9SVE8gaXMgNCAqIFIuIFdpdGggdGhpcyB0aGUgZXF1YXRpb24gYmVjb21lczoKLQotWCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgUiAqIHNxcnQoMiAqIHAgLyAzKSArICgxMiAqIFIgKiAoc3FydCgzICogcCAvIDgpICogcCAqICgxICsgMzIgKiBwXjIpKSkKLQotCi13aGljaCB3ZSBjYW4gYnJlYWsgZG93biBpbnRvOgotCi1YID0gICAgIHMKLSAgICAgLS0tLS0tLS0KLSAgICAgUiAqIGYocCkKLQotd2hlcmUgZihwKSA9IHNxcnQoMiAqIHAgLyAzKSArICgxMiAqIHNxcnQoMyAqIHAgLyA4KSAqIHAgKiAoMSArIDMyICogcCAqIHApKQotCi1GdW5jdGlvbiBwYXJhbWV0ZXJzOgotcyAtIGJ5dGVzCi1SIC0gUlRUIGluIHVzZWNzCi1wIC0gbG9zcyByYXRlIChkZWNpbWFsIGZyYWN0aW9uIG11bHRpcGxpZWQgYnkgMSwwMDAsMDAwKQotCi1SZXR1cm5zIFhjYWxjIGluIGJ5dGVzIHBlciBzZWNvbmQKLQotRE9OJ1QgYWx0ZXIgdGhpcyBjb2RlIHVubGVzcyB5b3UgcnVuIHRlc3QgY2FzZXMgYWdhaW5zdCBpdCBhcyB0aGUgY29kZQotaGFzIGJlZW4gbWFuaXB1bGF0ZWQgdG8gc3RvcCB1bmRlcmZsb3cvb3Zlcmxvdy4KLQotKi8KKy8qKgorICogdGZyY19jYWxjX3ggLSBDYWxjdWxhdGUgdGhlIHNlbmQgcmF0ZSBhcyBwZXIgc2VjdGlvbiAzLjEgb2YgUkZDMzQ0OAorICoKKyAqICBAczogcGFja2V0IHNpemUgICAgICAgICAgaW4gYnl0ZXMKKyAqICBAUjogUlRUICAgICAgICAgICAgICAgICAgc2NhbGVkIGJ5IDEwMDAwMDAgICAoaS5lLiwgbWljcm9zZWNvbmRzKQorICogIEBwOiBsb3NzIHJhdGlvIGVzdGltYXRlICBzY2FsZWQgYnkgMTAwMDAwMAorICogIFJldHVybnMgWF9jYWxjICAgICAgICAgICBpbiBieXRlcyBwZXIgc2Vjb25kIChub3Qgc2NhbGVkKS4KKyAqCisgKiBOb3RlOiBETyBOT1QgYWx0ZXIgdGhpcyBjb2RlIHVubGVzcyB5b3UgcnVuIHRlc3QgY2FzZXMgYWdhaW5zdCBpdCwKKyAqICAgICAgIGFzIHRoZSBjb2RlIGhhcyBiZWVuIG9wdGltaXplZCB0byBzdG9wIHVuZGVyZmxvdy9vdmVyZmxvdy4KKyAqLwogdTMyIHRmcmNfY2FsY194KHUxNiBzLCB1MzIgUiwgdTMyIHApCiB7CiAJaW50IGluZGV4OwogCXUzMiBmOwogCXU2NCB0bXAxLCB0bXAyOwogCi0JaWYgKHAgPCBURlJDX0NBTENfWF9TUExJVCkKLQkJaW5kZXggPSAocCAvIChURlJDX0NBTENfWF9TUExJVCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkUpKSAtIDE7Ci0JZWxzZQotCQlpbmRleCA9IChwIC8gKDEwMDAwMDAgLyBURlJDX0NBTENfWF9BUlJTSVpFKSkgLSAxOworCS8qIGNoZWNrIGFnYWluc3QgaW52YWxpZCBwYXJhbWV0ZXJzIGFuZCBkaXZpZGUtYnktemVybyAgICovCisJQlVHX09OKHAgPiAgMTAwMDAwMCk7CQkvKiBwIG11c3Qgbm90IGV4Y2VlZCAxMDAlICAgKi8KKwlCVUdfT04ocCA9PSAwKTsJCQkvKiBmKDApID0gMCwgZGl2aWRlIGJ5IHplcm8gKi8KKwlpZiAoUiA9PSAwKSB7CQkJLyogcG9zc2libGUgIGRpdmlkZSBieSB6ZXJvICovCisJCURDQ1BfQ1JJVCgiV0FSTklORzogUlRUIGlzIDAsIHJldHVybmluZyBtYXhpbXVtIFhfY2FsYy4iKTsKKwkJcmV0dXJuIH4wVTsKKyAJfQogCi0JaWYgKGluZGV4IDwgMCkKLQkJLyogcCBzaG91bGQgYmUgMCB1bmxlc3MgdGhlcmUgaXMgYSBidWcgaW4gbXkgY29kZSAqLwotCQlpbmRleCA9IDA7CisJaWYgKHAgPD0gVEZSQ19DQUxDX1hfU1BMSVQpIAkJeyAgICAgLyogMC4wMDAwIDwgcCA8PSAwLjA1ICAgKi8KKwkJaWYgKHAgPCBURlJDX1NNQUxMRVNUX1ApIHsJICAgICAgLyogMC4wMDAwIDwgcCA8ICAwLjAwMDEgKi8KKwkJCURDQ1BfV0FSTigiVmFsdWUgb2YgcCAoJWQpIGJlbG93IHJlc29sdXRpb24uICIKKwkJCQkgICJTdWJzdGl0dXRpbmcgJWRcbiIsIHAsIFRGUkNfU01BTExFU1RfUCk7CisJCQlpbmRleCA9IDA7CisJCX0gZWxzZSAJCQkJICAgICAgLyogMC4wMDAxIDw9IHAgPD0gMC4wNSAgKi8KKwkJCWluZGV4ID0gIHAvVEZSQ19TTUFMTEVTVF9QIC0gMTsKIAotCWlmIChSID09IDApCi0JCVIgPSAxOyAvKiBSVFQgY2FuJ3QgYmUgemVybyBvciBlbHNlIGRpdmlkZSBieSB6ZXJvICovCisgCQlmID0gdGZyY19jYWxjX3hfbG9va3VwW2luZGV4XVsxXTsKIAotCUJVR19PTihpbmRleCA+PSBURlJDX0NBTENfWF9BUlJTSVpFKTsKKwl9IGVsc2UgewkgCQkJICAgICAgLyogMC4wNSAgIDwgIHAgPD0gMS4wMCAgKi8KKwkJaW5kZXggPSBwLygxMDAwMDAwL1RGUkNfQ0FMQ19YX0FSUlNJWkUpIC0gMTsKIAotCWlmIChwID49IFRGUkNfQ0FMQ19YX1NQTElUKQogCQlmID0gdGZyY19jYWxjX3hfbG9va3VwW2luZGV4XVswXTsKLQllbHNlCi0JCWYgPSB0ZnJjX2NhbGNfeF9sb29rdXBbaW5kZXhdWzFdOworCX0KIAorCS8qIFRoZSBmb2xsb3dpbmcgY29tcHV0ZXMgWCA9IHMvKFIqZihwKSkgaW4gYnl0ZXMgcGVyIHNlY29uZC4gU2luY2UgZihwKQorCSAqIGFuZCBSIGFyZSBib3RoIHNjYWxlZCBieSAxMDAwMDAwLCB3ZSBuZWVkIHRvIG11bHRpcGx5IGJ5IDEwMDAwMDBeMi4KKwkgKiA9PT4gRE8gTk9UIGFsdGVyIHRoaXMgdW5sZXNzIHlvdSB0ZXN0IGFnYWluc3Qgb3ZlcmZsb3cgb24gMzIgYml0ICAgKi8KIAl0bXAxID0gKCh1NjQpcyAqIDEwMDAwMDAwMCk7CiAJdG1wMiA9ICgodTY0KVIgKiAodTY0KWYpOwogCWRvX2Rpdih0bXAyLCAxMDAwMCk7CiAJZG9fZGl2KHRtcDEsIHRtcDIpOyAKLQkvKiBEb24ndCBhbHRlciBhYm92ZSBtYXRoIHVubGVzcyB5b3UgdGVzdCBkdWUgdG8gb3ZlcmZsb3cgb24gMzIgYml0ICovCiAKIAlyZXR1cm4gKHUzMil0bXAxOyAKIH0KQEAgLTYxMCwzMyArNjY0LDM2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX2NhbGNfeCk7CiAKIC8qCi0gKiBhcmdzOiBmdmFsdWUgLSBmdW5jdGlvbiB2YWx1ZSB0byBtYXRjaAotICogcmV0dXJuczogcCBjbG9zZXN0IHRvIHRoYXQgdmFsdWUKKyAqICB0ZnJjX2NhbGNfeF9yZXZlcnNlX2xvb2t1cCAgLSAgdHJ5IHRvIGZpbmQgcCBnaXZlbiBmKHApCiAgKgotICogYm90aCBmdmFsdWUgYW5kIHAgYXJlIG11bHRpcGxpZWQgYnkgMSwwMDAsMDAwIHRvIHVzZSBpbnRzCisgKiAgQGZ2YWx1ZTogZnVuY3Rpb24gdmFsdWUgdG8gbWF0Y2gsIHNjYWxlZCBieSAxMDAwMDAwCisgKiAgUmV0dXJucyBjbG9zZXN0IG1hdGNoIGZvciBwLCBhbHNvIHNjYWxlZCBieSAxMDAwMDAwCiAgKi8KIHUzMiB0ZnJjX2NhbGNfeF9yZXZlcnNlX2xvb2t1cCh1MzIgZnZhbHVlKQogewotCWludCBjdHIgPSAwOwotCWludCBzbWFsbDsKKwlpbnQgaW5kZXg7CiAKLQlpZiAoZnZhbHVlIDwgdGZyY19jYWxjX3hfbG9va3VwWzBdWzFdKQorCWlmIChmdmFsdWUgPT0gMCkJLyogZihwKSA9IDAgIHdoZW5ldmVyICBwID0gMCAqLwogCQlyZXR1cm4gMDsKIAotCWlmIChmdmFsdWUgPD0gdGZyY19jYWxjX3hfbG9va3VwW1RGUkNfQ0FMQ19YX0FSUlNJWkUgLSAxXVsxXSkKLQkJc21hbGwgPSAxOwotCWVsc2UgaWYgKGZ2YWx1ZSA+IHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFIC0gMV1bMF0pCisJLyogRXJyb3IgY2FzZXMuICovCisJaWYgKGZ2YWx1ZSA8IHRmcmNfY2FsY194X2xvb2t1cFswXVsxXSkgeworCQlEQ0NQX1dBUk4oImZ2YWx1ZSAlZCBzbWFsbGVyIHRoYW4gcmVzb2x1dGlvblxuIiwgZnZhbHVlKTsKKwkJcmV0dXJuIHRmcmNfY2FsY194X2xvb2t1cFswXVsxXTsKKwl9CisJaWYgKGZ2YWx1ZSA+IHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFIC0gMV1bMF0pIHsKKwkJRENDUF9XQVJOKCJmdmFsdWUgJWQgZXhjZWVkcyBib3VuZHMhXG4iLCBmdmFsdWUpOwogCQlyZXR1cm4gMTAwMDAwMDsKLQllbHNlCi0JCXNtYWxsID0gMDsKKwl9CiAKLQl3aGlsZSAoZnZhbHVlID4gdGZyY19jYWxjX3hfbG9va3VwW2N0cl1bc21hbGxdKQotCQljdHIrKzsKLQotCWlmIChzbWFsbCkKLQkJcmV0dXJuIFRGUkNfQ0FMQ19YX1NQTElUICogY3RyIC8gVEZSQ19DQUxDX1hfQVJSU0laRTsKLQllbHNlCi0JCXJldHVybiAxMDAwMDAwICogY3RyIC8gVEZSQ19DQUxDX1hfQVJSU0laRTsKKwlpZiAoZnZhbHVlIDw9IHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFIC0gMV1bMV0pIHsKKwkJaW5kZXggPSB0ZnJjX2JpbnNlYXJjaChmdmFsdWUsIDEpOworCQlyZXR1cm4gKGluZGV4ICsgMSkgKiBURlJDX0NBTENfWF9TUExJVCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkU7CisgCX0KKyAKKwkvKiBlbHNlIC4uLiBpdCBtdXN0IGJlIGluIHRoZSBjb2Fyc2UtZ3JhaW5lZCBjb2x1bW4gKi8KKwlpbmRleCA9IHRmcmNfYmluc2VhcmNoKGZ2YWx1ZSwgMCk7CisJcmV0dXJuIChpbmRleCArIDEpICogMTAwMDAwMCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkU7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfY2FsY194X3JldmVyc2VfbG9va3VwKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2RjY3AuaCBiL25ldC9kY2NwL2RjY3AuaAppbmRleCAyNzJlODU4Li42ODg4Njk4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9kY2NwLmgKKysrIGIvbmV0L2RjY3AvZGNjcC5oCkBAIC0xOCwxNSArMTgsMzMgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSAiYWNrdmVjLmgiCiAKKy8qCisgKiAJRENDUCAtIHNwZWNpZmljIHdhcm5pbmcgYW5kIGRlYnVnZ2luZyBtYWNyb3MuCisgKi8KKyNkZWZpbmUgRENDUF9XQVJOKGZtdCwgYS4uLikgTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogIiBmbXQsICAgICAgIFwKKwkJCQkJCSAgICAgICAgX19GVU5DVElPTl9fLCAjI2EpCisjZGVmaW5lIERDQ1BfQ1JJVChmbXQsIGEuLi4pIHByaW50ayhLRVJOX0NSSVQgZm10ICIgYXQgJXM6JWQvJXMoKVxuIiwgIyNhLCBcCisJCQkJCSBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgRENDUF9CVUcoYS4uLikgICAgICAgZG8geyBEQ0NQX0NSSVQoIkJVRzogIiBhKTsgZHVtcF9zdGFjaygpOyB9IHdoaWxlKDApCisjZGVmaW5lIERDQ1BfQlVHX09OKGNvbmQpICAgIGRvIHsgaWYgKHVubGlrZWx5KChjb25kKSAhPSAwKSkJCSAgIFwKKwkJCQkgICAgIERDQ1BfQlVHKCJcIiVzXCIgaG9sZHMgKGV4Y2VwdGlvbiEpIiwgXAorCQkJCQkgICAgICBfX3N0cmluZ2lmeShjb25kKSk7ICAgICAgICAgIFwKKwkJCSAgICAgfSB3aGlsZSAoMCkKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBEQ0NQX1BSSU5USyhlbmFibGUsIGZtdCwgYXJncy4uLikJZG8geyBpZiAoZW5hYmxlKQkgICAgIFwKKwkJCQkJCQlwcmludGsoZm10LCAjI2FyZ3MpOyBcCisJCQkJCSAJfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgRENDUF9QUklOVEsoZW5hYmxlLCBmbXQsIGFyZ3MuLi4pCXByaW50ayhmbXQsICMjYXJncykKKyNlbmRpZgorI2RlZmluZSBEQ0NQX1BSX0RFQlVHKGVuYWJsZSwgZm10LCBhLi4uKQlEQ0NQX1BSSU5USyhlbmFibGUsIEtFUk5fREVCVUcgXAorCQkJCQkJICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYSkKKwogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCiBleHRlcm4gaW50IGRjY3BfZGVidWc7Ci0KLSNkZWZpbmUgZGNjcF9wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pIFwKLQlkbyB7IGlmIChkY2NwX2RlYnVnKSBcCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjYSk7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBkY2NwX3ByX2RlYnVnX2NhdChmb3JtYXQsIGEuLi4pIGRvIHsgaWYgKGRjY3BfZGVidWcpIFwKLQkJCQkJICAgICBwcmludGsoZm9ybWF0LCAjI2EpOyB9IHdoaWxlICgwKQorI2RlZmluZSBkY2NwX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikJICBEQ0NQX1BSX0RFQlVHKGRjY3BfZGVidWcsIGZvcm1hdCwgIyNhKQorI2RlZmluZSBkY2NwX3ByX2RlYnVnX2NhdChmb3JtYXQsIGEuLi4pICAgRENDUF9QUklOVEsoZGNjcF9kZWJ1ZywgZm9ybWF0LCAjI2EpCiAjZWxzZQogI2RlZmluZSBkY2NwX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikKICNkZWZpbmUgZGNjcF9wcl9kZWJ1Z19jYXQoZm9ybWF0LCBhLi4uKQpAQCAtMzUsMTcgKzUzLDIxIEBACiBleHRlcm4gc3RydWN0IGluZXRfaGFzaGluZm8gZGNjcF9oYXNoaW5mbzsKIAogZXh0ZXJuIGF0b21pY190IGRjY3Bfb3JwaGFuX2NvdW50OwotZXh0ZXJuIGludCBkY2NwX3R3X2NvdW50OwotZXh0ZXJuIHZvaWQgZGNjcF90d19kZXNjaGVkdWxlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKIAogZXh0ZXJuIHZvaWQgZGNjcF90aW1lX3dhaXQoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3RhdGUsIGludCB0aW1lbyk7CiAKLS8qIEZJWE1FOiBSaWdodCBzaXplIHRoaXMgKi8KLSNkZWZpbmUgRENDUF9NQVhfT1BUX0xFTiAxMjgKLQotI2RlZmluZSBEQ0NQX01BWF9QQUNLRVRfSERSIDMyCi0KLSNkZWZpbmUgTUFYX0RDQ1BfSEVBREVSICAoRENDUF9NQVhfUEFDS0VUX0hEUiArIERDQ1BfTUFYX09QVF9MRU4gKyBNQVhfSEVBREVSKQorLyoKKyAqICBTZXQgc2FmZSB1cHBlciBib3VuZHMgZm9yIGhlYWRlciBhbmQgb3B0aW9uIGxlbmd0aC4gU2luY2UgRGF0YSBPZmZzZXQgaXMgOAorICogIGJpdHMgKFJGQyA0MzQwLCBzZWMuIDUuMSksIHRoZSB0b3RhbCBoZWFkZXIgbGVuZ3RoIGNhbiBuZXZlciBiZSBtb3JlIHRoYW4KKyAqICA0ICogMjU1ID0gMTAyMCBieXRlcy4gVGhlIGxhcmdlc3QgcG9zc2libGUgaGVhZGVyIGxlbmd0aCBpcyAyOCBieXRlcyAoWD0xKToKKyAqICAgIC0gRENDUC1SZXNwb25zZSB3aXRoIEFDSyBTdWJoZWFkZXIgYW5kIDQgYnl0ZXMgb2YgU2VydmljZSBjb2RlICAgICAgT1IKKyAqICAgIC0gRENDUC1SZXNldCAgICB3aXRoIEFDSyBTdWJoZWFkZXIgYW5kIDQgYnl0ZXMgb2YgUmVzZXQgQ29kZSBmaWVsZHMKKyAqICBIZW5jZSBhIHNhZmUgdXBwZXIgYm91bmQgZm9yIHRoZSBtYXhpbXVtIG9wdGlvbiBsZW5ndGggaXMgMTAyMC0yOCA9IDk5MgorICovCisjZGVmaW5lIE1BWF9EQ0NQX1NQRUNJRklDX0hFQURFUiAoMjU1ICogc2l6ZW9mKGludCkpCisjZGVmaW5lIERDQ1BfTUFYX1BBQ0tFVF9IRFIgMjgKKyNkZWZpbmUgRENDUF9NQVhfT1BUX0xFTiAoTUFYX0RDQ1BfU1BFQ0lGSUNfSEVBREVSIC0gRENDUF9NQVhfUEFDS0VUX0hEUikKKyNkZWZpbmUgTUFYX0RDQ1BfSEVBREVSIChNQVhfRENDUF9TUEVDSUZJQ19IRUFERVIgKyBNQVhfSEVBREVSKQogCiAjZGVmaW5lIERDQ1BfVElNRVdBSVRfTEVOICg2MCAqIEhaKSAvKiBob3cgbG9uZyB0byB3YWl0IHRvIGRlc3Ryb3kgVElNRS1XQUlUCiAJCQkJICAgICAqIHN0YXRlLCBhYm91dCA2MCBzZWNvbmRzICovCkBAIC01OCw2ICs4MCwyMCBAQAogCiAjZGVmaW5lIERDQ1BfUlRPX01BWCAoKHVuc2lnbmVkKSgxMjAgKiBIWikpIC8qIEZJWE1FOiB1c2luZyBUQ1AgdmFsdWUgKi8KIAorI2RlZmluZSBEQ0NQX1hNSVRfVElNRU8gMzAwMDAgLyogVGltZS9tc2VjcyBmb3IgYmxvY2tpbmcgdHJhbnNtaXQgcGVyIHBhY2tldCAqLworCisvKiBzeXNjdGwgdmFyaWFibGVzIGZvciBEQ0NQICovCitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXM7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9yZXRyaWVzMTsKK2V4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3JldHJpZXMyOworZXh0ZXJuIGludCAgc3lzY3RsX2RjY3BfZmVhdF9zZXF1ZW5jZV93aW5kb3c7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X3J4X2NjaWQ7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X3R4X2NjaWQ7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X2Fja19yYXRpbzsKK2V4dGVybiBpbnQgIHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9hY2tfdmVjdG9yOworZXh0ZXJuIGludCAgc3lzY3RsX2RjY3BfZmVhdF9zZW5kX25kcF9jb3VudDsKK2V4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3R4X3FsZW47CisKIC8qIGlzIHNlcTEgPCBzZXEyID8gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGJlZm9yZTQ4KGNvbnN0IHU2NCBzZXExLCBjb25zdCB1NjQgc2VxMikKIHsKQEAgLTEyMywxMCArMTU5LDM2IEBACiAjZGVmaW5lIERDQ1BfQUREX1NUQVRTX1VTRVIoZmllbGQsIHZhbCkJXAogCQkJU05NUF9BRERfU1RBVFNfVVNFUihkY2NwX3N0YXRpc3RpY3MsIGZpZWxkLCB2YWwpCiAKKy8qCisgKiAJQ2hlY2tzdW1taW5nIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRjY3BfY3N1bV9jb3ZlcmFnZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNvbnN0IHN0cnVjdCBkY2NwX2hkciogZGggPSBkY2NwX2hkcihza2IpOworCisJaWYgKGRoLT5kY2NwaF9jc2NvdiA9PSAwKQorCQlyZXR1cm4gc2tiLT5sZW47CisJcmV0dXJuIChkaC0+ZGNjcGhfZG9mZiArIGRoLT5kY2NwaF9jc2NvdiAtIDEpICogc2l6ZW9mKHUzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2NzdW1fb3V0Z29pbmcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgY292ID0gZGNjcF9jc3VtX2NvdmVyYWdlKHNrYik7CisKKwlpZiAoY292ID49IHNrYi0+bGVuKQorCQlkY2NwX2hkcihza2IpLT5kY2NwaF9jc2NvdiA9IDA7CisKKwlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCAwLCAoY292ID4gc2tiLT5sZW4pPyBza2ItPmxlbiA6IGNvdiwgMCk7Cit9CisKK2V4dGVybiB2b2lkIGRjY3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpOworCiBleHRlcm4gaW50ICBkY2NwX3JldHJhbnNtaXRfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGV4dGVybiB2b2lkIGRjY3Bfc2VuZF9hY2soc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkIGRjY3Bfc2VuZF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHZvaWQgZGNjcF9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJzayk7CisKIGV4dGVybiB2b2lkIGRjY3Bfc2VuZF9zeW5jKHN0cnVjdCBzb2NrICpzaywgY29uc3QgdTY0IHNlcSwKIAkJCSAgIGNvbnN0IGVudW0gZGNjcF9wa3RfdHlwZSBwa3RfdHlwZSk7CiAKQEAgLTE0NywxOCArMjA5LDcgQEAKIGV4dGVybiB2b2lkIGRjY3Bfc2V0X3N0YXRlKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IHN0YXRlKTsKIGV4dGVybiB2b2lkIGRjY3BfZG9uZShzdHJ1Y3Qgc29jayAqc2spOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9vcGVucmVxX2luaXQoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCSAgICAgc3RydWN0IGRjY3Bfc29jayAqZHAsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCS8qCi0JICogRklYTUU6IGZpbGwgaW4gdGhlIG90aGVyIHJlcSBmaWVsZHMgZnJvbSB0aGUgRENDUCBvcHRpb25zCi0JICogcmVjZWl2ZWQKLQkgKi8KLQlpbmV0X3JzayhyZXEpLT5ybXRfcG9ydCA9IGRjY3BfaGRyKHNrYiktPmRjY3BoX3Nwb3J0OwotCWluZXRfcnNrKHJlcSktPmFja2VkCT0gMDsKLQlyZXEtPnJjdl93bmQgPSAwOwotfQorZXh0ZXJuIHZvaWQgZGNjcF9yZXFza19pbml0KHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGV4dGVybiBpbnQgZGNjcF92NF9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApAQCAtMjE3LDE0ICsyNjgsOSBAQAogZXh0ZXJuIGludAkgICBpbmV0X2RjY3BfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZGNjcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJICAgICBwb2xsX3RhYmxlICp3YWl0KTsKLWV4dGVybiB2b2lkCSAgIGRjY3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CSAgIGRjY3BfdjRfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCiAJCQkJICAgaW50IGFkZHJfbGVuKTsKIAotZXh0ZXJuIGludAkgICBkY2NwX3Y0X2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IF9fYmUzMiBzYWRkciwgY29uc3QgX19iZTMyIGRhZGRyKTsKLQogZXh0ZXJuIGludAkgICBkY2NwX3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIGRjY3BfcmVzZXRfY29kZXMgY29kZSk7CiBleHRlcm4gdm9pZAkgICBkY2NwX3NlbmRfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgYWN0aXZlKTsKIGV4dGVybiBpbnQJICAgZGNjcF9pbnZhbGlkX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2ZlYXQuYyBiL25ldC9kY2NwL2ZlYXQuYwppbmRleCBhMWIwNjgyLi40ZGM0ODdmIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9mZWF0LmMKKysrIGIvbmV0L2RjY3AvZmVhdC5jCkBAIC0xMiw3ICsxMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2luY2x1ZGUgImRjY3AuaCIKICNpbmNsdWRlICJjY2lkLmgiCiAjaW5jbHVkZSAiZmVhdC5oIgogCkBAIC0yMyw5ICsyMiwxNyBAQAogewogCXN0cnVjdCBkY2NwX29wdF9wZW5kICpvcHQ7CiAKLQlkY2NwX3ByX2RlYnVnKCJmZWF0IGNoYW5nZSB0eXBlPSVkIGZlYXQ9JWRcbiIsIHR5cGUsIGZlYXR1cmUpOworCWRjY3BfZmVhdF9kZWJ1Zyh0eXBlLCBmZWF0dXJlLCAqdmFsKTsKIAotCS8qIFhYWCBzYW5pdHkgY2hlY2sgZmVhdCBjaGFuZ2UgcmVxdWVzdCAqLworCWlmICghZGNjcF9mZWF0X2lzX3ZhbGlkX3R5cGUodHlwZSkpIHsKKwkJRENDUF9XQVJOKCJvcHRpb24gdHlwZSAlZCBpbnZhbGlkIGluIG5lZ290aWF0aW9uXG4iLCB0eXBlKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghZGNjcF9mZWF0X2lzX3ZhbGlkX2xlbmd0aCh0eXBlLCBmZWF0dXJlLCBsZW4pKSB7CisJCURDQ1BfV0FSTigiaW52YWxpZCBsZW5ndGggJWRcbiIsIGxlbik7CisJCXJldHVybiAxOworCX0KKwkvKiBYWFggYWRkIGZ1cnRoZXIgc2FuaXR5IGNoZWNrcyAqLwogCiAJLyogY2hlY2sgaWYgdGhhdCBmZWF0dXJlIGlzIGFscmVhZHkgYmVpbmcgbmVnb3RpYXRlZCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkob3B0LCAmZG1zay0+ZGNjcG1zX3BlbmRpbmcsIGRjY3BvcF9ub2RlKSB7CkBAIC05NSwxNCArMTAyLDE0IEBACiAvKiBYWFggdGFraW5nIG9ubHkgdTggdmFscyAqLwogc3RhdGljIGludCBkY2NwX2ZlYXRfdXBkYXRlKHN0cnVjdCBzb2NrICpzaywgdTggdHlwZSwgdTggZmVhdCwgdTggdmFsKQogewotCWRjY3BfcHJfZGVidWcoImNoYW5naW5nIFslZF0gZmVhdCAlZCB0byAlZFxuIiwgdHlwZSwgZmVhdCwgdmFsKTsKKwlkY2NwX2ZlYXRfZGVidWcodHlwZSwgZmVhdCwgdmFsKTsKIAogCXN3aXRjaCAoZmVhdCkgewogCWNhc2UgRENDUEZfQ0NJRDoKIAkJcmV0dXJuIGRjY3BfZmVhdF91cGRhdGVfY2NpZChzaywgdHlwZSwgdmFsKTsKIAlkZWZhdWx0OgotCQlkY2NwX3ByX2RlYnVnKCJJTVBMRU1FTlQgY2hhbmdpbmcgWyVkXSBmZWF0ICVkIHRvICVkXG4iLAotCQkJICAgICAgdHlwZSwgZmVhdCwgdmFsKTsKKwkJZGNjcF9wcl9kZWJ1ZygiVU5JTVBMRU1FTlRFRDogJXMoJWQsIC4uLilcbiIsCisJCQkgICAgICBkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksIGZlYXQpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNjIsNyArMTY5LDggQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlXQVJOX09OKDEpOyAvKiBYWFggaW1wbGVtZW50IHJlcyAqLworCQkJRENDUF9CVUcoIkZlbGwgdGhyb3VnaCwgZmVhdD0lZCIsIG9wdC0+ZGNjcG9wX2ZlYXQpOworCQkJLyogWFhYIGltcGxlbWVudCByZXMgKi8KIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKQEAgLTI2NSwxMCArMjczLDEwIEBACiAJdTggKmNvcHk7CiAJaW50IHJjOwogCi0JLyogTk4gZmVhdHVyZXMgbXVzdCBiZSBjaGFuZ2UgTCAqLwotCWlmICh0eXBlID09IERDQ1BPX0NIQU5HRV9SKSB7Ci0JCWRjY3BfcHJfZGVidWcoInJlY2VpdmVkIENIQU5HRV9SICVkIGZvciBOTiBmZWF0ICVkXG4iLAotCQkJICAgICAgdHlwZSwgZmVhdHVyZSk7CisJLyogTk4gZmVhdHVyZXMgbXVzdCBiZSBDaGFuZ2UgTCAoc2VjLiA2LjMuMikgKi8KKwlpZiAodHlwZSAhPSBEQ0NQT19DSEFOR0VfTCkgeworCQlkY2NwX3ByX2RlYnVnKCJyZWNlaXZlZCAlcyBmb3IgTk4gZmVhdHVyZSAlZFxuIiwKKwkJCQlkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksIGZlYXR1cmUpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTI3OSwxMiArMjg3LDExIEBACiAJaWYgKG9wdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWNvcHkgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJY29weSA9IGttZW1kdXAodmFsLCBsZW4sIEdGUF9BVE9NSUMpOwogCWlmIChjb3B5ID09IE5VTEwpIHsKIAkJa2ZyZWUob3B0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbWNweShjb3B5LCB2YWwsIGxlbik7CiAKIAlvcHQtPmRjY3BvcF90eXBlID0gRENDUE9fQ09ORklSTV9SOyAvKiBOTiBjYW4gb25seSBjb25maXJtIFIgKi8KIAlvcHQtPmRjY3BvcF9mZWF0ID0gZmVhdHVyZTsKQEAgLTI5OSw3ICszMDYsOCBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JZGNjcF9wcl9kZWJ1ZygiQ29uZmlybWluZyBOTiBmZWF0dXJlICVkICh2YWw9JWQpXG4iLCBmZWF0dXJlLCAqY29weSk7CisJZGNjcF9mZWF0X2RlYnVnKHR5cGUsIGZlYXR1cmUsICpjb3B5KTsKKwogCWxpc3RfYWRkX3RhaWwoJm9wdC0+ZGNjcG9wX25vZGUsICZkbXNrLT5kY2NwbXNfY29uZik7CiAKIAlyZXR1cm4gMDsKQEAgLTMxOCwxNCArMzI2LDE5IEBACiAJCXJldHVybjsKIAl9CiAKLQlvcHQtPmRjY3BvcF90eXBlID0gdHlwZSA9PSBEQ0NQT19DSEFOR0VfTCA/IERDQ1BPX0NPTkZJUk1fUiA6Ci0JCQkJCQkgICAgRENDUE9fQ09ORklSTV9MOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRENDUE9fQ0hBTkdFX0w6IG9wdC0+ZGNjcG9wX3R5cGUgPSBEQ0NQT19DT05GSVJNX1I7IGJyZWFrOworCWNhc2UgRENDUE9fQ0hBTkdFX1I6IG9wdC0+ZGNjcG9wX3R5cGUgPSBEQ0NQT19DT05GSVJNX0w7IGJyZWFrOworCWRlZmF1bHQ6IAkgICAgIERDQ1BfV0FSTigiaW52YWxpZCB0eXBlICVkXG4iLCB0eXBlKTsgcmV0dXJuOworCisJfQogCW9wdC0+ZGNjcG9wX2ZlYXQgPSBmZWF0dXJlOwogCW9wdC0+ZGNjcG9wX3ZhbAkgPSBOVUxMOwogCW9wdC0+ZGNjcG9wX2xlbgkgPSAwOwogCiAJLyogY2hhbmdlIGZlYXR1cmUgKi8KLQlkY2NwX3ByX2RlYnVnKCJFbXB0eSBjb25maXJtIGZlYXR1cmUgJWQgdHlwZSAlZFxuIiwgZmVhdHVyZSwgdHlwZSk7CisJZGNjcF9wcl9kZWJ1ZygiRW1wdHkgJXMoJWQpXG4iLCBkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksIGZlYXR1cmUpOworCiAJbGlzdF9hZGRfdGFpbCgmb3B0LT5kY2Nwb3Bfbm9kZSwgJmRtc2stPmRjY3Btc19jb25mKTsKIH0KIApAQCAtMzU5LDcgKzM3Miw3IEBACiB7CiAJaW50IHJjOwogCi0JZGNjcF9wcl9kZWJ1ZygiZ290IGZlYXQgY2hhbmdlIHR5cGU9JWQgZmVhdD0lZFxuIiwgdHlwZSwgZmVhdHVyZSk7CisJZGNjcF9mZWF0X2RlYnVnKHR5cGUsIGZlYXR1cmUsICp2YWwpOwogCiAJLyogZmlndXJlIG91dCBpZiBpdCdzIFNQIG9yIE5OIGZlYXR1cmUgKi8KIAlzd2l0Y2ggKGZlYXR1cmUpIHsKQEAgLTM3NSw2ICszODgsOCBAQAogCiAJLyogWFhYIGltcGxlbWVudCBvdGhlciBmZWF0dXJlcyAqLwogCWRlZmF1bHQ6CisJCWRjY3BfcHJfZGVidWcoIlVOSU1QTEVNRU5URUQ6IG5vdCBoYW5kbGluZyAlcyglZCwgLi4uKVxuIiwKKwkJCSAgICAgIGRjY3BfZmVhdF90eXBlbmFtZSh0eXBlKSwgZmVhdHVyZSk7CiAJCXJjID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQpAQCAtNDAzLDIwICs0MTgsMjcgQEAKIAl1OCB0OwogCXN0cnVjdCBkY2NwX29wdF9wZW5kICpvcHQ7CiAJc3RydWN0IGRjY3BfbWluaXNvY2sgKmRtc2sgPSBkY2NwX21zayhzayk7Ci0JaW50IHJjID0gMTsKKwlpbnQgZm91bmQgPSAwOwogCWludCBhbGxfY29uZmlybWVkID0gMTsKIAotCWRjY3BfcHJfZGVidWcoImdvdCBmZWF0IGNvbmZpcm0gdHlwZT0lZCBmZWF0PSVkXG4iLCB0eXBlLCBmZWF0dXJlKTsKLQotCS8qIFhYWCBzYW5pdHkgY2hlY2sgdHlwZSAmIGZlYXQgKi8KKwlkY2NwX2ZlYXRfZGVidWcodHlwZSwgZmVhdHVyZSwgKnZhbCk7CiAKIAkvKiBsb2NhdGUgb3VyIGNoYW5nZSByZXF1ZXN0ICovCi0JdCA9IHR5cGUgPT0gRENDUE9fQ09ORklSTV9MID8gRENDUE9fQ0hBTkdFX1IgOiBEQ0NQT19DSEFOR0VfTDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERDQ1BPX0NPTkZJUk1fTDogdCA9IERDQ1BPX0NIQU5HRV9SOyBicmVhazsKKwljYXNlIERDQ1BPX0NPTkZJUk1fUjogdCA9IERDQ1BPX0NIQU5HRV9MOyBicmVhazsKKwlkZWZhdWx0OiAJICAgICAgRENDUF9XQVJOKCJpbnZhbGlkIHR5cGUgJWRcbiIsIHR5cGUpOworCQkJICAgICAgcmV0dXJuIDE7CisKKwl9CisJLyogWFhYIHNhbml0eSBjaGVjayBmZWF0dXJlIHZhbHVlICovCiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wdCwgJmRtc2stPmRjY3Btc19wZW5kaW5nLCBkY2Nwb3Bfbm9kZSkgewogCQlpZiAoIW9wdC0+ZGNjcG9wX2NvbmYgJiYgb3B0LT5kY2Nwb3BfdHlwZSA9PSB0ICYmCiAJCSAgICBvcHQtPmRjY3BvcF9mZWF0ID09IGZlYXR1cmUpIHsKLQkJCS8qIHdlIGZvdW5kIGl0ICovCisJCQlmb3VuZCA9IDE7CisJCQlkY2NwX3ByX2RlYnVnKCJmZWF0dXJlICVkIGZvdW5kXG4iLCBvcHQtPmRjY3BvcF9mZWF0KTsKKwogCQkJLyogWFhYIGRvIHNhbml0eSBjaGVjayAqLwogCiAJCQlvcHQtPmRjY3BvcF9jb25mID0gMTsKQEAgLTQyNSw5ICs0NDcsNyBAQAogCQkJZGNjcF9mZWF0X3VwZGF0ZShzaywgb3B0LT5kY2Nwb3BfdHlwZSwKIAkJCQkJIG9wdC0+ZGNjcG9wX2ZlYXQsICp2YWwpOwogCi0JCQlkY2NwX3ByX2RlYnVnKCJmZWF0ICVkIHR5cGUgJWQgY29uZmlybWVkICVkXG4iLAotCQkJCSAgICAgIGZlYXR1cmUsIHR5cGUsICp2YWwpOwotCQkJcmMgPSAwOworCQkJLyogWFhYIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgZGNjcF9mZWF0X3VwZGF0ZSAqLwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDQ2LDkgKzQ2Niw5IEBACiAJCWluZXRfY3NrX2NsZWFyX3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TKTsKIAl9CiAKLQlpZiAocmMpCi0JCWRjY3BfcHJfZGVidWcoImZlYXQgJWQgdHlwZSAlZCBuZXZlciByZXF1ZXN0ZWRcbiIsCi0JCQkgICAgICBmZWF0dXJlLCB0eXBlKTsKKwlpZiAoIWZvdW5kKQorCQlkY2NwX3ByX2RlYnVnKCIlcyglZCwgLi4uKSBuZXZlciByZXF1ZXN0ZWRcbiIsCisJCQkgICAgICBkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksIGZlYXR1cmUpOwogCXJldHVybiAwOwogfQogCkBAIC01MDEsMjAgKzUyMSwxOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkob3B0LCAmb2xkZG1zay0+ZGNjcG1zX3BlbmRpbmcsIGRjY3BvcF9ub2RlKSB7CiAJCXN0cnVjdCBkY2NwX29wdF9wZW5kICpuZXdvcHQ7CiAJCS8qIGNvcHkgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gKi8KLQkJdTggKnZhbCA9IGttYWxsb2Mob3B0LT5kY2Nwb3BfbGVuLCBHRlBfQVRPTUlDKTsKKwkJdTggKnZhbCA9IGttZW1kdXAob3B0LT5kY2Nwb3BfdmFsLCBvcHQtPmRjY3BvcF9sZW4sIEdGUF9BVE9NSUMpOwogCiAJCWlmICh2YWwgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X2NsZWFuOwotCQltZW1jcHkodmFsLCBvcHQtPmRjY3BvcF92YWwsIG9wdC0+ZGNjcG9wX2xlbik7CiAKLQkJbmV3b3B0ID0ga21hbGxvYyhzaXplb2YoKm5ld29wdCksIEdGUF9BVE9NSUMpOworCQluZXdvcHQgPSBrbWVtZHVwKG9wdCwgc2l6ZW9mKCpuZXdvcHQpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKG5ld29wdCA9PSBOVUxMKSB7CiAJCQlrZnJlZSh2YWwpOwogCQkJZ290byBvdXRfY2xlYW47CiAJCX0KIAogCQkvKiBpbnNlcnQgdGhlIG9wdGlvbiAqLwotCQltZW1jcHkobmV3b3B0LCBvcHQsIHNpemVvZigqbmV3b3B0KSk7CiAJCW5ld29wdC0+ZGNjcG9wX3ZhbCA9IHZhbDsKIAkJbGlzdF9hZGRfdGFpbCgmbmV3b3B0LT5kY2Nwb3Bfbm9kZSwgJm5ld2Rtc2stPmRjY3Btc19wZW5kaW5nKTsKIApAQCAtNTQ1LDEwICs1NjMsOSBAQAogCQkJICAgIHU4ICp2YWwsIHU4IGxlbikKIHsKIAlpbnQgcmMgPSAtRU5PTUVNOwotCXU4ICpjb3B5ID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCXU4ICpjb3B5ID0ga21lbWR1cCh2YWwsIGxlbiwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoY29weSAhPSBOVUxMKSB7Ci0JCW1lbWNweShjb3B5LCB2YWwsIGxlbik7CiAJCXJjID0gZGNjcF9mZWF0X2NoYW5nZShkbXNrLCB0eXBlLCBmZWF0LCBjb3B5LCBsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAocmMpCiAJCQlrZnJlZShjb3B5KTsKQEAgLTU4MywzICs2MDAsNDUgQEAKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9mZWF0X2luaXQpOworCisjaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKK2NvbnN0IGNoYXIgKmRjY3BfZmVhdF90eXBlbmFtZShjb25zdCB1OCB0eXBlKQoreworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBEQ0NQT19DSEFOR0VfTDogIHJldHVybigiQ2hhbmdlTCIpOworCWNhc2UgRENDUE9fQ09ORklSTV9MOiByZXR1cm4oIkNvbmZpcm1MIik7CisJY2FzZSBEQ0NQT19DSEFOR0VfUjogIHJldHVybigiQ2hhbmdlUiIpOworCWNhc2UgRENDUE9fQ09ORklSTV9SOiByZXR1cm4oIkNvbmZpcm1SIik7CisJLyogdGhlIGZvbGxvd2luZyBjYXNlIG11c3Qgbm90IGFwcGVhciBpbiBmZWF0dXJlIG5lZ290YXRpb24gICovCisJZGVmYXVsdDogCSAgICAgIGRjY3BfcHJfZGVidWcoInVua25vd24gdHlwZSAlZCBbQlVHIV1cbiIsIHR5cGUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9mZWF0X3R5cGVuYW1lKTsKKworY29uc3QgY2hhciAqZGNjcF9mZWF0X25hbWUoY29uc3QgdTggZmVhdCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqZmVhdHVyZV9uYW1lc1tdID0geworCQlbRENDUEZfUkVTRVJWRURdCT0gIlJlc2VydmVkIiwKKwkJW0RDQ1BGX0NDSURdCQk9ICJDQ0lEIiwKKwkJW0RDQ1BGX1NIT1JUX1NFUU5PU10JPSAiQWxsb3cgU2hvcnQgU2Vxbm9zIiwKKwkJW0RDQ1BGX1NFUVVFTkNFX1dJTkRPV10JPSAiU2VxdWVuY2UgV2luZG93IiwKKwkJW0RDQ1BGX0VDTl9JTkNBUEFCTEVdCT0gIkVDTiBJbmNhcGFibGUiLAorCQlbRENDUEZfQUNLX1JBVElPXQk9ICJBY2sgUmF0aW8iLAorCQlbRENDUEZfU0VORF9BQ0tfVkVDVE9SXQk9ICJTZW5kIEFDSyBWZWN0b3IiLAorCQlbRENDUEZfU0VORF9ORFBfQ09VTlRdCT0gIlNlbmQgTkRQIENvdW50IiwKKwkJW0RDQ1BGX01JTl9DU1VNX0NPVkVSXQk9ICJNaW4uIENzdW0gQ292ZXJhZ2UiLAorCQlbRENDUEZfREFUQV9DSEVDS1NVTV0JPSAiU2VuZCBEYXRhIENoZWNrc3VtIiwKKwl9OworCWlmIChmZWF0ID49IERDQ1BGX01JTl9DQ0lEX1NQRUNJRklDKQorCQlyZXR1cm4gIkNDSUQtc3BlY2lmaWMiOworCisJaWYgKGRjY3BfZmVhdF9pc19yZXNlcnZlZChmZWF0KSkKKwkJcmV0dXJuIGZlYXR1cmVfbmFtZXNbRENDUEZfUkVTRVJWRURdOworCisJcmV0dXJuIGZlYXR1cmVfbmFtZXNbZmVhdF07Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGRjY3BfZmVhdF9uYW1lKTsKKyNlbmRpZiAvKiBDT05GSUdfSVBfRENDUF9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvZmVhdC5oIGIvbmV0L2RjY3AvZmVhdC5oCmluZGV4IGNlZTU1M2QuLjJjMzczYWQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2ZlYXQuaAorKysgYi9uZXQvZGNjcC9mZWF0LmgKQEAgLTEyLDkgKzEyLDQ2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiZGNjcC5oIgogCi1zdHJ1Y3Qgc29jazsKLXN0cnVjdCBkY2NwX21pbmlzb2NrOworc3RhdGljIGlubGluZSBpbnQgZGNjcF9mZWF0X2lzX3ZhbGlkX2xlbmd0aCh1OCB0eXBlLCB1OCBmZWF0dXJlLCB1OCBsZW4pCit7CisJLyogc2VjLiA2LjE6IENvbmZpcm0gaGFzIGF0IGxlYXN0IGxlbmd0aCAzLAorCSAqIHNlYy4gNi4yOiBDaGFuZ2UgIGhhcyBhdCBsZWFzdCBsZW5ndGggNCAqLworCWlmIChsZW4gPCAzKQorCQlyZXR1cm4gMTsKKwlpZiAobGVuIDwgNCAgJiYgKHR5cGUgPT0gRENDUE9fQ0hBTkdFX0wgfHwgdHlwZSA9PSBEQ0NQT19DSEFOR0VfUikpCisJCXJldHVybiAxOworCS8qIFhYWDogYWRkIHBlci1mZWF0dXJlIGxlbmd0aCB2YWxpZGF0aW9uIChzZWMuIDYuNi44KSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkY2NwX2ZlYXRfaXNfcmVzZXJ2ZWQoY29uc3QgdTggZmVhdCkKK3sKKwlyZXR1cm4gKGZlYXQgPiBEQ0NQRl9EQVRBX0NIRUNLU1VNICYmCisJCWZlYXQgPCBEQ0NQRl9NSU5fQ0NJRF9TUEVDSUZJQykgfHwKKwkgICAgICAgIGZlYXQgPT0gRENDUEZfUkVTRVJWRUQ7Cit9CisKKy8qIGZlYXR1cmUgbmVnb3RpYXRpb24ga25vd3Mgb25seSB0aGVzZSBmb3VyIG9wdGlvbiB0eXBlcyAoUkZDIDQzNDAsIHNlYy4gNikgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRjY3BfZmVhdF9pc192YWxpZF90eXBlKGNvbnN0IHU4IG9wdG51bSkKK3sKKwlyZXR1cm4gb3B0bnVtID49IERDQ1BPX0NIQU5HRV9MICYmIG9wdG51bSA8PSBEQ0NQT19DT05GSVJNX1I7CisKK30KKworI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCitleHRlcm4gY29uc3QgY2hhciAqZGNjcF9mZWF0X3R5cGVuYW1lKGNvbnN0IHU4IHR5cGUpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmRjY3BfZmVhdF9uYW1lKGNvbnN0IHU4IGZlYXQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9mZWF0X2RlYnVnKGNvbnN0IHU4IHR5cGUsIGNvbnN0IHU4IGZlYXQsIGNvbnN0IHU4IHZhbCkKK3sKKwlkY2NwX3ByX2RlYnVnKCIlcyglcyAoJWQpLCAlZClcbiIsIGRjY3BfZmVhdF90eXBlbmFtZSh0eXBlKSwKKwkJCQkJICAgZGNjcF9mZWF0X25hbWUoZmVhdCksIGZlYXQsIHZhbCk7Cit9CisjZWxzZQorI2RlZmluZSBkY2NwX2ZlYXRfZGVidWcodHlwZSwgZmVhdCwgdmFsKQorI2VuZGlmIC8qIENPTkZJR19JUF9EQ0NQX0RFQlVHICovCiAKIGV4dGVybiBpbnQgIGRjY3BfZmVhdF9jaGFuZ2Uoc3RydWN0IGRjY3BfbWluaXNvY2sgKmRtc2ssIHU4IHR5cGUsIHU4IGZlYXR1cmUsCiAJCQkgICAgIHU4ICp2YWwsIHU4IGxlbiwgZ2ZwX3QgZ2ZwKTsKQEAgLTI2LDExICs2Myw0IEBACiBleHRlcm4gaW50ICBkY2NwX2ZlYXRfY2xvbmUoc3RydWN0IHNvY2sgKm9sZHNrLCBzdHJ1Y3Qgc29jayAqbmV3c2spOwogZXh0ZXJuIGludCAgZGNjcF9mZWF0X2luaXQoc3RydWN0IGRjY3BfbWluaXNvY2sgKmRtc2spOwogCi1leHRlcm4gaW50ICBkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3c7Ci1leHRlcm4gaW50ICBkY2NwX2ZlYXRfZGVmYXVsdF9yeF9jY2lkOwotZXh0ZXJuIGludCAgZGNjcF9mZWF0X2RlZmF1bHRfdHhfY2NpZDsKLWV4dGVybiBpbnQgIGRjY3BfZmVhdF9kZWZhdWx0X2Fja19yYXRpbzsKLWV4dGVybiBpbnQgIGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfYWNrX3ZlY3RvcjsKLWV4dGVybiBpbnQgIGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfbmRwX2NvdW50OwotCiAjZW5kaWYgLyogX0RDQ1BfRkVBVF9IICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCAxZDI0ODgxLi43MzcxYTJmIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTEyOCwyMSArMTI4LDE4IEBACiAJCSAgICAgRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRKSkKIAkJCWRwLT5kY2Nwc19nYXIgPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxOwogCX0gZWxzZSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogU3RlcCA2IGZhaWxlZCBmb3IgJXMgcGFja2V0LCAiCi0JCQkJCSAgICAiKExTV0woJWxsdSkgPD0gUC5zZXFubyglbGx1KSA8PSBTLlNXSCglbGx1KSkgYW5kICIKLQkJCQkJICAgICIoUC5hY2tubyAlcyBvciBMQVdMKCVsbHUpIDw9IFAuYWNrbm8oJWxsdSkgPD0gUy5BV0goJWxsdSksICIKLQkJCQkJICAgICJzZW5kaW5nIFNZTkMuLi5cbiIsCi0JCQkgICAgICAgZGNjcF9wYWNrZXRfbmFtZShkaC0+ZGNjcGhfdHlwZSksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbHN3bCwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQotCQkJICAgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBkcC0+ZGNjcHNfc3doLAotCQkJICAgICAgIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxID09CisJCURDQ1BfV0FSTigiRENDUDogU3RlcCA2IGZhaWxlZCBmb3IgJXMgcGFja2V0LCAiCisJCQkgICIoTFNXTCglbGx1KSA8PSBQLnNlcW5vKCVsbHUpIDw9IFMuU1dIKCVsbHUpKSBhbmQgIgorCQkJICAiKFAuYWNrbm8gJXMgb3IgTEFXTCglbGx1KSA8PSBQLmFja25vKCVsbHUpIDw9IFMuQVdIKCVsbHUpLCAiCisJCQkgICJzZW5kaW5nIFNZTkMuLi5cbiIsICBkY2NwX3BhY2tldF9uYW1lKGRoLT5kY2NwaF90eXBlKSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbHN3bCwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkcC0+ZGNjcHNfc3doLAorCQkJICAoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSA9PQogCQkJICAgICAgICBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEpID8gImRvZXNuJ3QgZXhpc3QiIDogImV4aXN0cyIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGF3bCwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQotCQkJICAgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZHAtPmRjY3BzX2F3aCk7CisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxhd2wsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRwLT5kY2Nwc19hd2gpOwogCQlkY2NwX3NlbmRfc3luYyhzaywgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLCBEQ0NQX1BLVF9TWU5DKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQzMSwyOSArNDI4LDI1IEBACiAKIAkvKgogCSAqICBTdGVwIDM6IFByb2Nlc3MgTElTVEVOIHN0YXRlCi0JICogIAkoQ29udGludWluZyBmcm9tIGRjY3BfdjRfZG9fcmN2IGFuZCBkY2NwX3Y2X2RvX3JjdikKIAkgKgogCSAqICAgICBJZiBTLnN0YXRlID09IExJU1RFTiwKLQkgKgkgIElmIFAudHlwZSA9PSBSZXF1ZXN0IG9yIFAgY29udGFpbnMgYSB2YWxpZCBJbml0IENvb2tpZQotCSAqCSAgCW9wdGlvbiwKLQkgKgkgICAgICogTXVzdCBzY2FuIHRoZSBwYWNrZXQncyBvcHRpb25zIHRvIGNoZWNrIGZvciBhbiBJbml0Ci0JICoJCUNvb2tpZS4gIE9ubHkgdGhlIEluaXQgQ29va2llIGlzIHByb2Nlc3NlZCBoZXJlLAotCSAqCQlob3dldmVyOyBvdGhlciBvcHRpb25zIGFyZSBwcm9jZXNzZWQgaW4gU3RlcCA4LiAgVGhpcwotCSAqCQlzY2FuIG5lZWQgb25seSBiZSBwZXJmb3JtZWQgaWYgdGhlIGVuZHBvaW50IHVzZXMgSW5pdAotCSAqCQlDb29raWVzICoKLQkgKgkgICAgICogR2VuZXJhdGUgYSBuZXcgc29ja2V0IGFuZCBzd2l0Y2ggdG8gdGhhdCBzb2NrZXQgKgotCSAqCSAgICAgU2V0IFMgOj0gbmV3IHNvY2tldCBmb3IgdGhpcyBwb3J0IHBhaXIKLQkgKgkgICAgIFMuc3RhdGUgPSBSRVNQT05ECi0JICoJICAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llCi0JICoJICAgICBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWUKLQkgKgkgICAgIENvbnRpbnVlIHdpdGggUy5zdGF0ZSA9PSBSRVNQT05ECi0JICoJICAgICAqIEEgUmVzcG9uc2UgcGFja2V0IHdpbGwgYmUgZ2VuZXJhdGVkIGluIFN0ZXAgMTEgKgotCSAqCSAgT3RoZXJ3aXNlLAotCSAqCSAgICAgR2VuZXJhdGUgUmVzZXQoTm8gQ29ubmVjdGlvbikgdW5sZXNzIFAudHlwZSA9PSBSZXNldAotCSAqCSAgICAgRHJvcCBwYWNrZXQgYW5kIHJldHVybgotCSAqCi0JICogTk9URTogdGhlIGNoZWNrIGZvciB0aGUgcGFja2V0IHR5cGVzIGlzIGRvbmUgaW4KLQkgKgkgZGNjcF9yY3Zfc3RhdGVfcHJvY2VzcworCSAqCSBJZiBQLnR5cGUgPT0gUmVxdWVzdCBvciBQIGNvbnRhaW5zIGEgdmFsaWQgSW5pdCBDb29raWUgb3B0aW9uLAorCSAqCSAgICAgICgqIE11c3Qgc2NhbiB0aGUgcGFja2V0J3Mgb3B0aW9ucyB0byBjaGVjayBmb3IgSW5pdAorCSAqCQkgQ29va2llcy4gIE9ubHkgSW5pdCBDb29raWVzIGFyZSBwcm9jZXNzZWQgaGVyZSwKKwkgKgkJIGhvd2V2ZXI7IG90aGVyIG9wdGlvbnMgYXJlIHByb2Nlc3NlZCBpbiBTdGVwIDguICBUaGlzCisJICoJCSBzY2FuIG5lZWQgb25seSBiZSBwZXJmb3JtZWQgaWYgdGhlIGVuZHBvaW50IHVzZXMgSW5pdAorCSAqCQkgQ29va2llcyAqKQorCSAqCSAgICAgICgqIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0ICopCisJICoJICAgICAgU2V0IFMgOj0gbmV3IHNvY2tldCBmb3IgdGhpcyBwb3J0IHBhaXIKKwkgKgkgICAgICBTLnN0YXRlID0gUkVTUE9ORAorCSAqCSAgICAgIENob29zZSBTLklTUyAoaW5pdGlhbCBzZXFubykgb3Igc2V0IGZyb20gSW5pdCBDb29raWVzCisJICoJICAgICAgSW5pdGlhbGl6ZSBTLkdBUiA6PSBTLklTUworCSAqCSAgICAgIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0CisJICoJICAgICAgQ29va2llcyBDb250aW51ZSB3aXRoIFMuc3RhdGUgPT0gUkVTUE9ORAorCSAqCSAgICAgICgqIEEgUmVzcG9uc2UgcGFja2V0IHdpbGwgYmUgZ2VuZXJhdGVkIGluIFN0ZXAgMTEgKikKKwkgKgkgT3RoZXJ3aXNlLAorCSAqCSAgICAgIEdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKKwkgKgkgICAgICBEcm9wIHBhY2tldCBhbmQgcmV0dXJuCiAJICovCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX0xJU1RFTikgewogCQlpZiAoZGgtPmRjY3BoX3R5cGUgPT0gRENDUF9QS1RfUkVRVUVTVCkgewpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2NC5jIGIvbmV0L2RjY3AvaXB2NC5jCmluZGV4IGUwOGU3NjguLmZmODE2NzkgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjQuYworKysgYi9uZXQvZGNjcC9pcHY0LmMKQEAgLTExMywxMyArMTEzLDggQEAKIAkvKiBPSywgbm93IGNvbW1pdCBkZXN0aW5hdGlvbiB0byBzb2NrZXQuICAqLwogCXNrX3NldHVwX2NhcHMoc2ssICZydC0+dS5kc3QpOwogCi0JZHAtPmRjY3BzX2dhciA9Ci0JCWRwLT5kY2Nwc19pc3MgPSBzZWN1cmVfZGNjcF9zZXF1ZW5jZV9udW1iZXIoaW5ldC0+c2FkZHIsCi0JCQkJCQkJICAgIGluZXQtPmRhZGRyLAotCQkJCQkJCSAgICBpbmV0LT5zcG9ydCwKLQkJCQkJCQkgICAgdXNpbi0+c2luX3BvcnQpOwotCWRjY3BfdXBkYXRlX2dzcyhzaywgZHAtPmRjY3BzX2lzcyk7Ci0KKwlkcC0+ZGNjcHNfaXNzID0gc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKGluZXQtPnNhZGRyLCBpbmV0LT5kYWRkciwKKwkJCQkJCSAgICBpbmV0LT5zcG9ydCwgaW5ldC0+ZHBvcnQpOwogCWluZXQtPmlkID0gZHAtPmRjY3BzX2lzcyBeIGppZmZpZXM7CiAKIAllcnIgPSBkY2NwX2Nvbm5lY3Qoc2spOwpAQCAtMTkzLDg2ICsxODgsNiBAQAogCX0gLyogZWxzZSBsZXQgdGhlIHVzdWFsIHJldHJhbnNtaXQgdGltZXIgaGFuZGxlIGl0ICovCiB9CiAKLXN0YXRpYyB2b2lkIGRjY3BfdjRfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnJ4c2tiLAotCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBkY2NwX2hkciAqcnhkaCA9IGRjY3BfaGRyKHJ4c2tiKSwgKmRoOwotCWNvbnN0IHUzMiBkY2NwX2hkcl9hY2tfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpICsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlpZiAoKChzdHJ1Y3QgcnRhYmxlICopcnhza2ItPmRzdCktPnJ0X3R5cGUgIT0gUlROX0xPQ0FMKQotCQlyZXR1cm47Ci0KLQlza2IgPSBhbGxvY19za2IoZGNjcF92NF9jdGxfc29ja2V0LT5zay0+c2tfcHJvdC0+bWF4X2hlYWRlciwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzLiAqLwotCXNrYl9yZXNlcnZlKHNrYiwgZGNjcF92NF9jdGxfc29ja2V0LT5zay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7Ci0KLQlza2ItPmRzdCA9IGRzdF9jbG9uZShyeHNrYi0+ZHN0KTsKLQotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIGRjY3BfaGRyX2Fja19sZW4pOwotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQltZW1zZXQoZGgsIDAsIGRjY3BfaGRyX2Fja19sZW4pOwotCi0JLyogQnVpbGQgRENDUCBoZWFkZXIgYW5kIGNoZWNrc3VtIGl0LiAqLwotCWRoLT5kY2NwaF90eXBlCSAgID0gRENDUF9QS1RfQUNLOwotCWRoLT5kY2NwaF9zcG9ydAkgICA9IHJ4ZGgtPmRjY3BoX2Rwb3J0OwotCWRoLT5kY2NwaF9kcG9ydAkgICA9IHJ4ZGgtPmRjY3BoX3Nwb3J0OwotCWRoLT5kY2NwaF9kb2ZmCSAgID0gZGNjcF9oZHJfYWNrX2xlbiAvIDQ7Ci0JZGgtPmRjY3BoX3gJICAgPSAxOwotCi0JZGNjcF9oZHJfc2V0X3NlcShkaCwgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxKTsKLQlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksCi0JCQkgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOwotCi0JYmhfbG9ja19zb2NrKGRjY3BfdjRfY3RsX3NvY2tldC0+c2spOwotCWVyciA9IGlwX2J1aWxkX2FuZF9zZW5kX3BrdChza2IsIGRjY3BfdjRfY3RsX3NvY2tldC0+c2ssCi0JCQkJICAgIHJ4c2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICByeHNrYi0+bmguaXBoLT5zYWRkciwgTlVMTCk7Ci0JYmhfdW5sb2NrX3NvY2soZGNjcF92NF9jdGxfc29ja2V0LT5zayk7Ci0KLQlpZiAoZXJyID09IE5FVF9YTUlUX0NOIHx8IGVyciA9PSAwKSB7Ci0JCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX09VVFNFR1MpOwotCQlEQ0NQX0lOQ19TVEFUU19CSChEQ0NQX01JQl9PVVRSU1RTKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZGNjcF92NF9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCSBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCi17Ci0JaW50IGVyciA9IC0xOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkvKiBGaXJzdCwgZ3JhYiBhIHJvdXRlLiAqLwotCQotCWlmIChkc3QgPT0gTlVMTCAmJiAoZHN0ID0gaW5ldF9jc2tfcm91dGVfcmVxKHNrLCByZXEpKSA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCXNrYiA9IGRjY3BfbWFrZV9yZXNwb25zZShzaywgZHN0LCByZXEpOwotCWlmIChza2IgIT0gTlVMTCkgewotCQljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwotCQlzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKLQotCQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NoZWNrc3VtKHNrYiwgaXJlcS0+bG9jX2FkZHIsCi0JCQkJCQkgICAgICBpcmVxLT5ybXRfYWRkcik7Ci0JCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7Ci0JCWVyciA9IGlwX2J1aWxkX2FuZF9zZW5kX3BrdChza2IsIHNrLCBpcmVxLT5sb2NfYWRkciwKLQkJCQkJICAgIGlyZXEtPnJtdF9hZGRyLAotCQkJCQkgICAgaXJlcS0+b3B0KTsKLQkJaWYgKGVyciA9PSBORVRfWE1JVF9DTikKLQkJCWVyciA9IDA7Ci0JfQotCi1vdXQ6Ci0JZHN0X3JlbGVhc2UoZHN0KTsKLQlyZXR1cm4gZXJyOwotfQotCiAvKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgSUNNUCBtb2R1bGUgd2hlbiBpdCBnZXRzIHNvbWUgc29ydCBvZiBlcnJvcgogICogY29uZGl0aW9uLiBJZiBlcnIgPCAwIHRoZW4gdGhlIHNvY2tldCBzaG91bGQgYmUgY2xvc2VkIGFuZCB0aGUgZXJyb3IKQEAgLTMyOSw3ICsyNDQsNyBAQAogCXNlcSA9IGRjY3BfaGRyX3NlcShza2IpOwogCWlmIChzay0+c2tfc3RhdGUgIT0gRENDUF9MSVNURU4gJiYKIAkgICAgIWJldHdlZW40OChzZXEsIGRwLT5kY2Nwc19zd2wsIGRwLT5kY2Nwc19zd2gpKSB7Ci0JCU5FVF9JTkNfU1RBVFMoTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00MjksMTkgKzM0NCwyNCBAQAogCXNvY2tfcHV0KHNrKTsKIH0KIAotLyogVGhpcyByb3V0aW5lIGNvbXB1dGVzIGFuIElQdjQgRENDUCBjaGVja3N1bS4gKi8KLXZvaWQgZGNjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBkY2NwX3Y0X2NzdW1fZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgX19iZTMyIHNyYywgX19iZTMyIGRzdCkKK3sKKwlyZXR1cm4gY3N1bV90Y3B1ZHBfbWFnaWMoc3JjLCBkc3QsIHNrYi0+bGVuLCBJUFBST1RPX0RDQ1AsIHNrYi0+Y3N1bSk7Cit9CisKK3ZvaWQgZGNjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IHVudXNlZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CiAKLQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NoZWNrc3VtKHNrYiwgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyKTsKKwlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyKTsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF92NF9zZW5kX2NoZWNrKTsKIAotc3RhdGljIGlubGluZSB1NjQgZGNjcF92NF9pbml0X3NlcXVlbmNlKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgdTY0IGRjY3BfdjRfaW5pdF9zZXF1ZW5jZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBzZWN1cmVfZGNjcF9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAogCQkJCQkgICBza2ItPm5oLmlwaC0+c2FkZHIsCkBAIC00NDksOTUgKzM2OSw2IEBACiAJCQkJCSAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX3Nwb3J0KTsKIH0KIAotc3RhdGljIHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzIGRjY3BfcmVxdWVzdF9zb2NrX29wczsKLQotaW50IGRjY3BfdjRfY29ubl9yZXF1ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXE7Ci0Jc3RydWN0IGRjY3Bfc29jayBkcDsKLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7Ci0Jc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrICpkcmVxOwotCWNvbnN0IF9fYmUzMiBzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKLQljb25zdCBfX2JlMzIgZGFkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7Ci0gCWNvbnN0IF9fYmUzMiBzZXJ2aWNlID0gZGNjcF9oZHJfcmVxdWVzdChza2IpLT5kY2NwaF9yZXFfc2VydmljZTsKLQlzdHJ1Y3QgZGNjcF9za2JfY2IgKmRjYiA9IERDQ1BfU0tCX0NCKHNrYik7Ci0JX191OCByZXNldF9jb2RlID0gRENDUF9SRVNFVF9DT0RFX1RPT19CVVNZOwotCi0JLyogTmV2ZXIgYW5zd2VyIHRvIERDQ1BfUEtUX1JFUVVFU1RzIHNlbmQgdG8gYnJvYWRjYXN0IG9yIG11bHRpY2FzdCAqLwotCWlmICgoKHN0cnVjdCBydGFibGUgKilza2ItPmRzdCktPnJ0X2ZsYWdzICYKLQkgICAgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSB7Ci0JCXJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfTk9fQ09OTkVDVElPTjsKLQkJZ290byBkcm9wOwotCX0KLQotCWlmIChkY2NwX2JhZF9zZXJ2aWNlX2NvZGUoc2ssIHNlcnZpY2UpKSB7Ci0JCXJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfQkFEX1NFUlZJQ0VfQ09ERTsKLQkJZ290byBkcm9wOwotIAl9Ci0JLyoKLQkgKiBUVyBidWNrZXRzIGFyZSBjb252ZXJ0ZWQgdG8gb3BlbiByZXF1ZXN0cyB3aXRob3V0Ci0JICogbGltaXRhdGlvbnMsIHRoZXkgY29uc2VydmUgcmVzb3VyY2VzIGFuZCBwZWVyIGlzCi0JICogZXZpZGVudGx5IHJlYWwgb25lLgotCSAqLwotCWlmIChpbmV0X2Nza19yZXFza19xdWV1ZV9pc19mdWxsKHNrKSkKLQkJZ290byBkcm9wOwotCi0JLyoKLQkgKiBBY2NlcHQgYmFja2xvZyBpcyBmdWxsLiBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIGVub3VnaAotCSAqIG9mIHdhcm0gZW50cmllcyBpbiBzeW4gcXVldWUsIGRyb3AgcmVxdWVzdC4gSXQgaXMgYmV0dGVyIHRoYW4KLQkgKiBjbG9nZ2luZyBzeW4gcXVldWUgd2l0aCBvcGVucmVxcyB3aXRoIGV4cG9uZW50aWFsbHkgaW5jcmVhc2luZwotCSAqIHRpbWVvdXQuCi0JICovCi0JaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykgJiYgaW5ldF9jc2tfcmVxc2tfcXVldWVfeW91bmcoc2spID4gMSkKLQkJZ290byBkcm9wOwotCi0JcmVxID0gcmVxc2tfYWxsb2MoJmRjY3BfcmVxdWVzdF9zb2NrX29wcyk7Ci0JaWYgKHJlcSA9PSBOVUxMKQotCQlnb3RvIGRyb3A7Ci0KLQlpZiAoZGNjcF9wYXJzZV9vcHRpb25zKHNrLCBza2IpKQotCQlnb3RvIGRyb3BfYW5kX2ZyZWU7Ci0KLQlkY2NwX29wZW5yZXFfaW5pdChyZXEsICZkcCwgc2tiKTsKLQotCWlmIChzZWN1cml0eV9pbmV0X2Nvbm5fcmVxdWVzdChzaywgc2tiLCByZXEpKQotCQlnb3RvIGRyb3BfYW5kX2ZyZWU7Ci0KLQlpcmVxID0gaW5ldF9yc2socmVxKTsKLQlpcmVxLT5sb2NfYWRkciA9IGRhZGRyOwotCWlyZXEtPnJtdF9hZGRyID0gc2FkZHI7Ci0JcmVxLT5yY3Zfd25kCT0gZGNjcF9mZWF0X2RlZmF1bHRfc2VxdWVuY2Vfd2luZG93OwotCWlyZXEtPm9wdAk9IE5VTEw7Ci0KLQkvKiAKLQkgKiBTdGVwIDM6IFByb2Nlc3MgTElTVEVOIHN0YXRlCi0JICoKLQkgKiBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWUKLQkgKgotCSAqIEluIGZhY3Qgd2UgZGVmZXIgc2V0dGluZyBTLkdTUiwgUy5TV0wsIFMuU1dIIHRvCi0JICogZGNjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZC4KLQkgKi8KLQlkcmVxID0gZGNjcF9yc2socmVxKTsKLQlkcmVxLT5kcmVxX2lzcgkgICA9IGRjYi0+ZGNjcGRfc2VxOwotCWRyZXEtPmRyZXFfaXNzCSAgID0gZGNjcF92NF9pbml0X3NlcXVlbmNlKHNrLCBza2IpOwotCWRyZXEtPmRyZXFfc2VydmljZSA9IHNlcnZpY2U7Ci0KLQlpZiAoZGNjcF92NF9zZW5kX3Jlc3BvbnNlKHNrLCByZXEsIE5VTEwpKQotCQlnb3RvIGRyb3BfYW5kX2ZyZWU7Ci0KLQlpbmV0X2Nza19yZXFza19xdWV1ZV9oYXNoX2FkZChzaywgcmVxLCBEQ0NQX1RJTUVPVVRfSU5JVCk7Ci0JcmV0dXJuIDA7Ci0KLWRyb3BfYW5kX2ZyZWU6Ci0JcmVxc2tfZnJlZShyZXEpOwotZHJvcDoKLQlEQ0NQX0lOQ19TVEFUU19CSChEQ0NQX01JQl9BVFRFTVBURkFJTFMpOwotCWRjYi0+ZGNjcGRfcmVzZXRfY29kZSA9IHJlc2V0X2NvZGU7Ci0JcmV0dXJuIC0xOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChkY2NwX3Y0X2Nvbm5fcmVxdWVzdCk7Ci0KIC8qCiAgKiBUaGUgdGhyZWUgd2F5IGhhbmRzaGFrZSBoYXMgY29tcGxldGVkIC0gd2UgZ290IGEgdmFsaWQgQUNLIG9yIERBVEFBQ0sgLQogICogbm93IGNyZWF0ZSB0aGUgbmV3IHNvY2tldC4KQEAgLTYyMyw0NyArNDU0LDYgQEAKIAlyZXR1cm4gc2s7CiB9CiAKLWludCBkY2NwX3Y0X2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IF9fYmUzMiBzYWRkciwKLQkJICAgICBjb25zdCBfX2JlMzIgZGFkZHIpCi17Ci0JY29uc3Qgc3RydWN0IGRjY3BfaGRyKiBkaCA9IGRjY3BfaGRyKHNrYik7Ci0JaW50IGNoZWNrc3VtX2xlbjsKLQl1MzIgdG1wOwotCi0JaWYgKGRoLT5kY2NwaF9jc2NvdiA9PSAwKQotCQljaGVja3N1bV9sZW4gPSBza2ItPmxlbjsKLQllbHNlIHsKLQkJY2hlY2tzdW1fbGVuID0gKGRoLT5kY2NwaF9jc2NvdiArIGRoLT5kY2NwaF94KSAqIHNpemVvZih1MzIpOwotCQljaGVja3N1bV9sZW4gPSBjaGVja3N1bV9sZW4gPCBza2ItPmxlbiA/IGNoZWNrc3VtX2xlbiA6Ci0JCQkJCQkJIHNrYi0+bGVuOwotCX0KLQotCXRtcCA9IGNzdW1fcGFydGlhbCgodW5zaWduZWQgY2hhciAqKWRoLCBjaGVja3N1bV9sZW4sIDApOwotCXJldHVybiBjc3VtX3RjcHVkcF9tYWdpYyhzYWRkciwgZGFkZHIsIGNoZWNrc3VtX2xlbiwKLQkJCQkgSVBQUk9UT19EQ0NQLCB0bXApOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChkY2NwX3Y0X2NoZWNrc3VtKTsKLQotc3RhdGljIGludCBkY2NwX3Y0X3ZlcmlmeV9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgIGNvbnN0IF9fYmUzMiBzYWRkciwgY29uc3QgX19iZTMyIGRhZGRyKQotewotCXN0cnVjdCBkY2NwX2hkciAqZGggPSBkY2NwX2hkcihza2IpOwotCWludCBjaGVja3N1bV9sZW47Ci0JdTMyIHRtcDsKLQotCWlmIChkaC0+ZGNjcGhfY3Njb3YgPT0gMCkKLQkJY2hlY2tzdW1fbGVuID0gc2tiLT5sZW47Ci0JZWxzZSB7Ci0JCWNoZWNrc3VtX2xlbiA9IChkaC0+ZGNjcGhfY3Njb3YgKyBkaC0+ZGNjcGhfeCkgKiBzaXplb2YodTMyKTsKLQkJY2hlY2tzdW1fbGVuID0gY2hlY2tzdW1fbGVuIDwgc2tiLT5sZW4gPyBjaGVja3N1bV9sZW4gOgotCQkJCQkJCSBza2ItPmxlbjsKLQl9Ci0JdG1wID0gY3N1bV9wYXJ0aWFsKCh1bnNpZ25lZCBjaGFyICopZGgsIGNoZWNrc3VtX2xlbiwgMCk7Ci0JcmV0dXJuIGNzdW1fdGNwdWRwX21hZ2ljKHNhZGRyLCBkYWRkciwgY2hlY2tzdW1fbGVuLAotCQkJCSBJUFBST1RPX0RDQ1AsIHRtcCkgPT0gMCA/IDAgOiAtMTsKLX0KLQogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkqIGRjY3BfdjRfcm91dGVfc2tiKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTY4OSw3ICs0NzksMzcgQEAKIAlyZXR1cm4gJnJ0LT51LmRzdDsKIH0KIAotc3RhdGljIHZvaWQgZGNjcF92NF9jdGxfc2VuZF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqcnhza2IpCitzdGF0aWMgaW50IGRjY3BfdjRfc2VuZF9yZXNwb25zZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKKwkJCQkgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCWludCBlcnIgPSAtMTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogRmlyc3QsIGdyYWIgYSByb3V0ZS4gKi8KKwkKKwlpZiAoZHN0ID09IE5VTEwgJiYgKGRzdCA9IGluZXRfY3NrX3JvdXRlX3JlcShzaywgcmVxKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlza2IgPSBkY2NwX21ha2VfcmVzcG9uc2Uoc2ssIGRzdCwgcmVxKTsKKwlpZiAoc2tiICE9IE5VTEwpIHsKKwkJY29uc3Qgc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKKwkJc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CisKKwkJZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92NF9jc3VtX2ZpbmlzaChza2IsIGlyZXEtPmxvY19hZGRyLAorCQkJCQkJCSAgICAgIGlyZXEtPnJtdF9hZGRyKTsKKwkJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwkJZXJyID0gaXBfYnVpbGRfYW5kX3NlbmRfcGt0KHNrYiwgc2ssIGlyZXEtPmxvY19hZGRyLAorCQkJCQkgICAgaXJlcS0+cm10X2FkZHIsCisJCQkJCSAgICBpcmVxLT5vcHQpOworCQllcnIgPSBuZXRfeG1pdF9ldmFsKGVycik7CisJfQorCitvdXQ6CisJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkY2NwX3Y0X2N0bF9zZW5kX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnJ4c2tiKQogewogCWludCBlcnI7CiAJc3RydWN0IGRjY3BfaGRyICpyeGRoID0gZGNjcF9oZHIocnhza2IpLCAqZGg7CkBAIC02OTgsNyArNTE4LDcgQEAKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNldCk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7Ci0JdTY0IHNlcW5vOworCXU2NCBzZXFubyA9IDA7CiAKIAkvKiBOZXZlciBzZW5kIGEgcmVzZXQgaW4gcmVzcG9uc2UgdG8gYSByZXNldC4gKi8KIAlpZiAocnhkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9SRVNFVCkKQEAgLTcyMCw5ICs1NDAsNyBAQAogCXNrYl9yZXNlcnZlKHNrYiwgZGNjcF92NF9jdGxfc29ja2V0LT5zay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoZHN0KTsKIAotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIGRjY3BfaGRyX3Jlc2V0X2xlbik7Ci0JZGggPSBkY2NwX2hkcihza2IpOwotCW1lbXNldChkaCwgMCwgZGNjcF9oZHJfcmVzZXRfbGVuKTsKKwlkaCA9IGRjY3BfemVyb2VkX2hkcihza2IsIGRjY3BfaGRyX3Jlc2V0X2xlbik7CiAKIAkvKiBCdWlsZCBEQ0NQIGhlYWRlciBhbmQgY2hlY2tzdW0gaXQuICovCiAJZGgtPmRjY3BoX3R5cGUJICAgPSBEQ0NQX1BLVF9SRVNFVDsKQEAgLTczNCwxNiArNTUyLDE1IEBACiAJCQkJRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9yZXNldF9jb2RlOwogCiAJLyogU2VlICI4LjMuMS4gQWJub3JtYWwgVGVybWluYXRpb24iIGluIFJGQyA0MzQwICovCi0Jc2Vxbm8gPSAwOwogCWlmIChEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX2Fja19zZXEgIT0gRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRKQogCQlkY2NwX3NldF9zZXFubygmc2Vxbm8sIERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfYWNrX3NlcSArIDEpOwogCiAJZGNjcF9oZHJfc2V0X3NlcShkaCwgc2Vxbm8pOwotCWRjY3BfaGRyX3NldF9hY2soZGNjcF9oZHJfYWNrX2JpdHMoc2tiKSwKLQkJCSBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3NlcSk7CisJZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLCBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3NlcSk7CiAKLQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NoZWNrc3VtKHNrYiwgcnhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICAgIHJ4c2tiLT5uaC5pcGgtPmRhZGRyKTsKKwlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgcnhza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCQkgICAgICByeHNrYi0+bmguaXBoLT5kYWRkcik7CiAKIAliaF9sb2NrX3NvY2soZGNjcF92NF9jdGxfc29ja2V0LT5zayk7CiAJZXJyID0gaXBfYnVpbGRfYW5kX3NlbmRfcGt0KHNrYiwgZGNjcF92NF9jdGxfc29ja2V0LT5zaywKQEAgLTc1MSw3ICs1NjgsNyBAQAogCQkJCSAgICByeHNrYi0+bmguaXBoLT5zYWRkciwgTlVMTCk7CiAJYmhfdW5sb2NrX3NvY2soZGNjcF92NF9jdGxfc29ja2V0LT5zayk7CiAKLQlpZiAoZXJyID09IE5FVF9YTUlUX0NOIHx8IGVyciA9PSAwKSB7CisJaWYgKG5ldF94bWl0X2V2YWwoZXJyKSA9PSAwKSB7CiAJCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX09VVFNFR1MpOwogCQlEQ0NQX0lOQ19TVEFUU19CSChEQ0NQX01JQl9PVVRSU1RTKTsKIAl9CkBAIC03NTksNiArNTc2LDEwMyBAQAogCSBkc3RfcmVsZWFzZShkc3QpOwogfQogCitzdGF0aWMgdm9pZCBkY2NwX3Y0X3JlcXNrX2Rlc3RydWN0b3Ioc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQoreworCWtmcmVlKGluZXRfcnNrKHJlcSktPm9wdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyBkY2NwX3JlcXVlc3Rfc29ja19vcHMgX19yZWFkX21vc3RseSA9IHsKKwkuZmFtaWx5CQk9IFBGX0lORVQsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayksCisJLnJ0eF9zeW5fYWNrCT0gZGNjcF92NF9zZW5kX3Jlc3BvbnNlLAorCS5zZW5kX2Fjawk9IGRjY3BfcmVxc2tfc2VuZF9hY2ssCisJLmRlc3RydWN0b3IJPSBkY2NwX3Y0X3JlcXNrX2Rlc3RydWN0b3IsCisJLnNlbmRfcmVzZXQJPSBkY2NwX3Y0X2N0bF9zZW5kX3Jlc2V0LAorfTsKKworaW50IGRjY3BfdjRfY29ubl9yZXF1ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXE7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOworCXN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayAqZHJlcTsKKyAJY29uc3QgX19iZTMyIHNlcnZpY2UgPSBkY2NwX2hkcl9yZXF1ZXN0KHNrYiktPmRjY3BoX3JlcV9zZXJ2aWNlOworCXN0cnVjdCBkY2NwX3NrYl9jYiAqZGNiID0gRENDUF9TS0JfQ0Ioc2tiKTsKKwlfX3U4IHJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfVE9PX0JVU1k7CisKKwkvKiBOZXZlciBhbnN3ZXIgdG8gRENDUF9QS1RfUkVRVUVTVHMgc2VuZCB0byBicm9hZGNhc3Qgb3IgbXVsdGljYXN0ICovCisJaWYgKCgoc3RydWN0IHJ0YWJsZSAqKXNrYi0+ZHN0KS0+cnRfZmxhZ3MgJgorCSAgICAoUlRDRl9CUk9BRENBU1QgfCBSVENGX01VTFRJQ0FTVCkpIHsKKwkJcmVzZXRfY29kZSA9IERDQ1BfUkVTRVRfQ09ERV9OT19DT05ORUNUSU9OOworCQlnb3RvIGRyb3A7CisJfQorCisJaWYgKGRjY3BfYmFkX3NlcnZpY2VfY29kZShzaywgc2VydmljZSkpIHsKKwkJcmVzZXRfY29kZSA9IERDQ1BfUkVTRVRfQ09ERV9CQURfU0VSVklDRV9DT0RFOworCQlnb3RvIGRyb3A7CisgCX0KKwkvKgorCSAqIFRXIGJ1Y2tldHMgYXJlIGNvbnZlcnRlZCB0byBvcGVuIHJlcXVlc3RzIHdpdGhvdXQKKwkgKiBsaW1pdGF0aW9ucywgdGhleSBjb25zZXJ2ZSByZXNvdXJjZXMgYW5kIHBlZXIgaXMKKwkgKiBldmlkZW50bHkgcmVhbCBvbmUuCisJICovCisJaWYgKGluZXRfY3NrX3JlcXNrX3F1ZXVlX2lzX2Z1bGwoc2spKQorCQlnb3RvIGRyb3A7CisKKwkvKgorCSAqIEFjY2VwdCBiYWNrbG9nIGlzIGZ1bGwuIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgZW5vdWdoCisJICogb2Ygd2FybSBlbnRyaWVzIGluIHN5biBxdWV1ZSwgZHJvcCByZXF1ZXN0LiBJdCBpcyBiZXR0ZXIgdGhhbgorCSAqIGNsb2dnaW5nIHN5biBxdWV1ZSB3aXRoIG9wZW5yZXFzIHdpdGggZXhwb25lbnRpYWxseSBpbmNyZWFzaW5nCisJICogdGltZW91dC4KKwkgKi8KKwlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSAmJiBpbmV0X2Nza19yZXFza19xdWV1ZV95b3VuZyhzaykgPiAxKQorCQlnb3RvIGRyb3A7CisKKwlyZXEgPSByZXFza19hbGxvYygmZGNjcF9yZXF1ZXN0X3NvY2tfb3BzKTsKKwlpZiAocmVxID09IE5VTEwpCisJCWdvdG8gZHJvcDsKKworCWlmIChkY2NwX3BhcnNlX29wdGlvbnMoc2ssIHNrYikpCisJCWdvdG8gZHJvcF9hbmRfZnJlZTsKKworCWRjY3BfcmVxc2tfaW5pdChyZXEsIHNrYik7CisKKwlpZiAoc2VjdXJpdHlfaW5ldF9jb25uX3JlcXVlc3Qoc2ssIHNrYiwgcmVxKSkKKwkJZ290byBkcm9wX2FuZF9mcmVlOworCisJaXJlcSA9IGluZXRfcnNrKHJlcSk7CisJaXJlcS0+bG9jX2FkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7CisJaXJlcS0+cm10X2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJaXJlcS0+b3B0CT0gTlVMTDsKKworCS8qIAorCSAqIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKKwkgKgorCSAqIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZQorCSAqCisJICogSW4gZmFjdCB3ZSBkZWZlciBzZXR0aW5nIFMuR1NSLCBTLlNXTCwgUy5TV0ggdG8KKwkgKiBkY2NwX2NyZWF0ZV9vcGVucmVxX2NoaWxkLgorCSAqLworCWRyZXEgPSBkY2NwX3JzayhyZXEpOworCWRyZXEtPmRyZXFfaXNyCSAgID0gZGNiLT5kY2NwZF9zZXE7CisJZHJlcS0+ZHJlcV9pc3MJICAgPSBkY2NwX3Y0X2luaXRfc2VxdWVuY2Uoc2tiKTsKKwlkcmVxLT5kcmVxX3NlcnZpY2UgPSBzZXJ2aWNlOworCisJaWYgKGRjY3BfdjRfc2VuZF9yZXNwb25zZShzaywgcmVxLCBOVUxMKSkKKwkJZ290byBkcm9wX2FuZF9mcmVlOworCisJaW5ldF9jc2tfcmVxc2tfcXVldWVfaGFzaF9hZGQoc2ssIHJlcSwgRENDUF9USU1FT1VUX0lOSVQpOworCXJldHVybiAwOworCitkcm9wX2FuZF9mcmVlOgorCXJlcXNrX2ZyZWUocmVxKTsKK2Ryb3A6CisJRENDUF9JTkNfU1RBVFNfQkgoRENDUF9NSUJfQVRURU1QVEZBSUxTKTsKKwlkY2ItPmRjY3BkX3Jlc2V0X2NvZGUgPSByZXNldF9jb2RlOworCXJldHVybiAtMTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF92NF9jb25uX3JlcXVlc3QpOworCiBpbnQgZGNjcF92NF9kb19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkY2NwX2hkciAqZGggPSBkY2NwX2hkcihza2IpOwpAQCAtNzcxLDI0ICs2ODUsMjMgQEAKIAogCS8qCiAJICogIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKLQkgKiAgICAgSWYgUy5zdGF0ZSA9PSBMSVNURU4sCi0JICoJICBJZiBQLnR5cGUgPT0gUmVxdWVzdCBvciBQIGNvbnRhaW5zIGEgdmFsaWQgSW5pdCBDb29raWUKLQkgKgkgIAlvcHRpb24sCi0JICoJICAgICAqIE11c3Qgc2NhbiB0aGUgcGFja2V0J3Mgb3B0aW9ucyB0byBjaGVjayBmb3IgYW4gSW5pdAotCSAqCQlDb29raWUuICBPbmx5IHRoZSBJbml0IENvb2tpZSBpcyBwcm9jZXNzZWQgaGVyZSwKLQkgKgkJaG93ZXZlcjsgb3RoZXIgb3B0aW9ucyBhcmUgcHJvY2Vzc2VkIGluIFN0ZXAgOC4gIFRoaXMKLQkgKgkJc2NhbiBuZWVkIG9ubHkgYmUgcGVyZm9ybWVkIGlmIHRoZSBlbmRwb2ludCB1c2VzIEluaXQKLQkgKgkJQ29va2llcyAqCi0JICoJICAgICAqIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0ICoKLQkgKgkgICAgIFNldCBTIDo9IG5ldyBzb2NrZXQgZm9yIHRoaXMgcG9ydCBwYWlyCi0JICoJICAgICBTLnN0YXRlID0gUkVTUE9ORAotCSAqCSAgICAgQ2hvb3NlIFMuSVNTIChpbml0aWFsIHNlcW5vKSBvciBzZXQgZnJvbSBJbml0IENvb2tpZQotCSAqCSAgICAgU2V0IFMuSVNSLCBTLkdTUiwgUy5TV0wsIFMuU1dIIGZyb20gcGFja2V0IG9yIEluaXQgQ29va2llCi0JICoJICAgICBDb250aW51ZSB3aXRoIFMuc3RhdGUgPT0gUkVTUE9ORAotCSAqCSAgICAgKiBBIFJlc3BvbnNlIHBhY2tldCB3aWxsIGJlIGdlbmVyYXRlZCBpbiBTdGVwIDExICoKLQkgKgkgIE90aGVyd2lzZSwKLQkgKgkgICAgIEdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKLQkgKgkgICAgIERyb3AgcGFja2V0IGFuZCByZXR1cm4KKwkgKgkgSWYgUC50eXBlID09IFJlcXVlc3Qgb3IgUCBjb250YWlucyBhIHZhbGlkIEluaXQgQ29va2llIG9wdGlvbiwKKwkgKgkgICAgICAoKiBNdXN0IHNjYW4gdGhlIHBhY2tldCdzIG9wdGlvbnMgdG8gY2hlY2sgZm9yIEluaXQKKwkgKgkJIENvb2tpZXMuICBPbmx5IEluaXQgQ29va2llcyBhcmUgcHJvY2Vzc2VkIGhlcmUsCisJICoJCSBob3dldmVyOyBvdGhlciBvcHRpb25zIGFyZSBwcm9jZXNzZWQgaW4gU3RlcCA4LiAgVGhpcworCSAqCQkgc2NhbiBuZWVkIG9ubHkgYmUgcGVyZm9ybWVkIGlmIHRoZSBlbmRwb2ludCB1c2VzIEluaXQKKwkgKgkJIENvb2tpZXMgKikKKwkgKgkgICAgICAoKiBHZW5lcmF0ZSBhIG5ldyBzb2NrZXQgYW5kIHN3aXRjaCB0byB0aGF0IHNvY2tldCAqKQorCSAqCSAgICAgIFNldCBTIDo9IG5ldyBzb2NrZXQgZm9yIHRoaXMgcG9ydCBwYWlyCisJICoJICAgICAgUy5zdGF0ZSA9IFJFU1BPTkQKKwkgKgkgICAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llcworCSAqCSAgICAgIEluaXRpYWxpemUgUy5HQVIgOj0gUy5JU1MKKwkgKgkgICAgICBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWVzCisJICoJICAgICAgQ29udGludWUgd2l0aCBTLnN0YXRlID09IFJFU1BPTkQKKwkgKgkgICAgICAoKiBBIFJlc3BvbnNlIHBhY2tldCB3aWxsIGJlIGdlbmVyYXRlZCBpbiBTdGVwIDExICopCisJICoJIE90aGVyd2lzZSwKKwkgKgkgICAgICBHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0CisJICoJICAgICAgRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqCiAJICogTk9URTogdGhlIGNoZWNrIGZvciB0aGUgcGFja2V0IHR5cGVzIGlzIGRvbmUgaW4KIAkgKgkgZGNjcF9yY3Zfc3RhdGVfcHJvY2VzcwpAQCAtODExLDcgKzcyNCw3IEBACiAJcmV0dXJuIDA7CiAKIHJlc2V0OgotCWRjY3BfdjRfY3RsX3NlbmRfcmVzZXQoc2tiKTsKKwlkY2NwX3Y0X2N0bF9zZW5kX3Jlc2V0KHNrLCBza2IpOwogZGlzY2FyZDoKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTgxOSw2MCArNzMyLDc0IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfdjRfZG9fcmN2KTsKIAorLyoqCisgKglkY2NwX2ludmFsaWRfcGFja2V0ICAtICBjaGVjayBmb3IgbWFsZm9ybWVkIHBhY2tldHMKKyAqCUltcGxlbWVudHMgUkZDIDQzNDAsIDguNTogIFN0ZXAgMTogQ2hlY2sgaGVhZGVyIGJhc2ljcworICoJUGFja2V0cyB0aGF0IGZhaWwgdGhlc2UgY2hlY2tzIGFyZSBpZ25vcmVkIGFuZCBkbyBub3QgcmVjZWl2ZSBSZXNldHMuCisgKi8KIGludCBkY2NwX2ludmFsaWRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaDsKKwl1bnNpZ25lZCBpbnQgY3Njb3Y7CiAKIAlpZiAoc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkKIAkJcmV0dXJuIDE7CiAKKwkvKiBJZiB0aGUgcGFja2V0IGlzIHNob3J0ZXIgdGhhbiAxMiBieXRlcywgZHJvcCBwYWNrZXQgYW5kIHJldHVybiAqLwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHIpKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIkRDQ1A6IHBza2JfbWF5X3B1bGwgZmFpbGVkXG4iKTsKKwkJRENDUF9XQVJOKCJwc2tiX21heV9wdWxsIGZhaWxlZFxuIik7CiAJCXJldHVybiAxOwogCX0KIAogCWRoID0gZGNjcF9oZHIoc2tiKTsKIAotCS8qIElmIHRoZSBwYWNrZXQgdHlwZSBpcyBub3QgdW5kZXJzdG9vZCwgZHJvcCBwYWNrZXQgYW5kIHJldHVybiAqLworCS8qIElmIFAudHlwZSBpcyBub3QgdW5kZXJzdG9vZCwgZHJvcCBwYWNrZXQgYW5kIHJldHVybiAqLwogCWlmIChkaC0+ZGNjcGhfdHlwZSA+PSBEQ0NQX1BLVF9JTlZBTElEKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogaW52YWxpZCBwYWNrZXQgdHlwZVxuIik7CisJCURDQ1BfV0FSTigiaW52YWxpZCBwYWNrZXQgdHlwZVxuIik7CiAJCXJldHVybiAxOwogCX0KIAogCS8qCi0JICogSWYgUC5EYXRhIE9mZnNldCBpcyB0b28gc21hbGwgZm9yIHBhY2tldCB0eXBlLCBvciB0b28gbGFyZ2UgZm9yCi0JICogcGFja2V0LCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuCisJICogSWYgUC5EYXRhIE9mZnNldCBpcyB0b28gc21hbGwgZm9yIHBhY2tldCB0eXBlLCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuCiAJICovCiAJaWYgKGRoLT5kY2NwaF9kb2ZmIDwgZGNjcF9oZHJfbGVuKHNrYikgLyBzaXplb2YodTMyKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIkRDQ1A6IFAuRGF0YSBPZmZzZXQoJXUpICIKLQkJCQkJICAgICJ0b28gc21hbGwgMVxuIiwKLQkJCSAgICAgICBkaC0+ZGNjcGhfZG9mZik7CisJCURDQ1BfV0FSTigiUC5EYXRhIE9mZnNldCgldSkgdG9vIHNtYWxsXG4iLCBkaC0+ZGNjcGhfZG9mZik7CiAJCXJldHVybiAxOwogCX0KLQorCS8qCisJICogSWYgUC5EYXRhIE9mZnNldCBpcyB0b28gdG9vIGxhcmdlIGZvciBwYWNrZXQsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4KKwkgKi8KIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBkaC0+ZGNjcGhfZG9mZiAqIHNpemVvZih1MzIpKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIkRDQ1A6IFAuRGF0YSBPZmZzZXQoJXUpICIKLQkJCQkJICAgICJ0b28gc21hbGwgMlxuIiwKLQkJCSAgICAgICBkaC0+ZGNjcGhfZG9mZik7CisJCURDQ1BfV0FSTigiUC5EYXRhIE9mZnNldCgldSkgdG9vIGxhcmdlXG4iLCBkaC0+ZGNjcGhfZG9mZik7CiAJCXJldHVybiAxOwogCX0KIAotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQogCS8qCiAJICogSWYgUC50eXBlIGlzIG5vdCBEYXRhLCBBY2ssIG9yIERhdGFBY2sgYW5kIFAuWCA9PSAwICh0aGUgcGFja2V0CiAJICogaGFzIHNob3J0IHNlcXVlbmNlIG51bWJlcnMpLCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuCiAJICovCi0JaWYgKGRoLT5kY2NwaF94ID09IDAgJiYKLQkgICAgZGgtPmRjY3BoX3R5cGUgIT0gRENDUF9QS1RfREFUQSAmJgotCSAgICBkaC0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9BQ0sgJiYKLQkgICAgZGgtPmRjY3BoX3R5cGUgIT0gRENDUF9QS1RfREFUQUFDSykgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIkRDQ1A6IFAudHlwZSAoJXMpIG5vdCBEYXRhLCBBY2sgIgotCQkJCQkgICAgIm5vciBEYXRhQWNrIGFuZCBQLlggPT0gMFxuIiwKLQkJCSAgICAgICBkY2NwX3BhY2tldF9uYW1lKGRoLT5kY2NwaF90eXBlKSk7CisJaWYgKGRoLT5kY2NwaF90eXBlID49IERDQ1BfUEtUX0RBVEEgICAgJiYKKwkgICAgZGgtPmRjY3BoX3R5cGUgPD0gRENDUF9QS1RfREFUQUFDSyAmJiBkaC0+ZGNjcGhfeCA9PSAwKSAgeworCQlEQ0NQX1dBUk4oIlAudHlwZSAoJXMpIG5vdCBEYXRhIHx8IFtEYXRhXUFjaywgd2hpbGUgUC5YID09IDBcbiIsCisJCQkgIGRjY3BfcGFja2V0X25hbWUoZGgtPmRjY3BoX3R5cGUpKTsKIAkJcmV0dXJuIDE7CiAJfQogCisJLyoKKwkgKiBJZiBQLkNzQ292IGlzIHRvbyBsYXJnZSBmb3IgdGhlIHBhY2tldCBzaXplLCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuLgorCSAqIFRoaXMgbXVzdCBjb21lIF9iZWZvcmVfIGNoZWNrc3VtbWluZyAobm90IGFzIFJGQyA0MzQwIHN1Z2dlc3RzKS4KKwkgKi8KKwljc2NvdiA9IGRjY3BfY3N1bV9jb3ZlcmFnZShza2IpOworCWlmIChjc2NvdiA+IHNrYi0+bGVuKSB7CisJCURDQ1BfV0FSTigiUC5Dc0NvdiAldSBleGNlZWRzIHBhY2tldCBsZW5ndGggJWRcbiIsCisJCQkgIGRoLT5kY2NwaF9jc2Nvdiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBJZiBoZWFkZXIgY2hlY2tzdW0gaXMgaW5jb3JyZWN0LCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuLgorCSAqIChUaGlzIHN0ZXAgaXMgY29tcGxldGVkIGluIHRoZSBBRi1kZXBlbmRlbnQgZnVuY3Rpb25zLikgKi8KKwlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCAwLCBjc2NvdiwgMCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODgzLDE3ICs4MTAsMTYgQEAKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoOwogCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgbWluX2NvdjsKIAotCS8qIFN0ZXAgMTogQ2hlY2sgaGVhZGVyIGJhc2ljczogKi8KKwkvKiBTdGVwIDE6IENoZWNrIGhlYWRlciBiYXNpY3MgKi8KIAogCWlmIChkY2NwX2ludmFsaWRfcGFja2V0KHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCS8qIElmIHRoZSBoZWFkZXIgY2hlY2tzdW0gaXMgaW5jb3JyZWN0LCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuICovCi0JaWYgKGRjY3BfdjRfdmVyaWZ5X2NoZWNrc3VtKHNrYiwgc2tiLT5uaC5pcGgtPnNhZGRyLAotCQkJCSAgICBza2ItPm5oLmlwaC0+ZGFkZHIpIDwgMCkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiBpbmNvcnJlY3QgaGVhZGVyIGNoZWNrc3VtXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJLyogU3RlcCAxOiBJZiBoZWFkZXIgY2hlY2tzdW0gaXMgaW5jb3JyZWN0LCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuICovCisJaWYgKGRjY3BfdjRfY3N1bV9maW5pc2goc2tiLCBza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkcikpIHsKKwkJRENDUF9XQVJOKCJkcm9wcGVkIHBhY2tldCB3aXRoIGludmFsaWQgY2hlY2tzdW1cbiIpOwogCQlnb3RvIGRpc2NhcmRfaXQ7CiAJfQogCkBAIC05MTUsOCArODQxLDcgQEAKIAkJZGNjcF9wcl9kZWJ1Z19jYXQoIlxuIik7CiAJfSBlbHNlIHsKIAkJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSA9IGRjY3BfaGRyX2Fja19zZXEoc2tiKTsKLQkJZGNjcF9wcl9kZWJ1Z19jYXQoIiwgYWNrPSVsbHVcbiIsCi0JCQkJICAodW5zaWduZWQgbG9uZyBsb25nKQorCQlkY2NwX3ByX2RlYnVnX2NhdCgiLCBhY2s9JWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQkgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEpOwogCX0KIApAQCAtOTMwLDggKzg1NSw2IEBACiAJLyogCiAJICogU3RlcCAyOgogCSAqIAlJZiBubyBzb2NrZXQgLi4uCi0JICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKLQkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwogCWlmIChzayA9PSBOVUxMKSB7CiAJCWRjY3BfcHJfZGVidWcoImZhaWxlZCB0byBsb29rIHVwIGZsb3cgSUQgaW4gdGFibGUgYW5kICIKQEAgLTk0NSw0NSArODY4LDU1IEBACiAJICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKIAkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwotCSAgICAgICAKIAlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfVElNRV9XQUlUKSB7Ci0JCWRjY3BfcHJfZGVidWcoInNrLT5za19zdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVDogIgotCQkJICAgICAgImRvX3RpbWVfd2FpdFxuIik7Ci0gICAgICAgICAgICAgICAgZ290byBkb190aW1lX3dhaXQ7CisJCWRjY3BfcHJfZGVidWcoInNrLT5za19zdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVDogZG9fdGltZV93YWl0XG4iKTsKKwkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKKwkJZ290byBub19kY2NwX3NvY2tldDsKKwl9CisKKwkvKgorCSAqIFJGQyA0MzQwLCBzZWMuIDkuMi4xOiBNaW5pbXVtIENoZWNrc3VtIENvdmVyYWdlCisJICogCW8gaWYgTWluQ3NDb3YgPSAwLCBvbmx5IHBhY2tldHMgd2l0aCBDc0NvdiA9IDAgYXJlIGFjY2VwdGVkCisJICogCW8gaWYgTWluQ3NDb3YgPiAwLCBhbHNvIGFjY2VwdCBwYWNrZXRzIHdpdGggQ3NDb3YgPj0gTWluQ3NDb3YKKwkgKi8KKwltaW5fY292ID0gZGNjcF9zayhzayktPmRjY3BzX3BjcmxlbjsKKwlpZiAoZGgtPmRjY3BoX2NzY292ICYmIChtaW5fY292ID09IDAgfHwgZGgtPmRjY3BoX2NzY292IDwgbWluX2NvdikpICB7CisJCWRjY3BfcHJfZGVidWcoIlBhY2tldCBDc0NvdiAlZCBkb2VzIG5vdCBzYXRpc2Z5IE1pbkNzQ292ICVkXG4iLAorCQkJICAgICAgZGgtPmRjY3BoX2NzY292LCBtaW5fY292KTsKKwkJLyogRklYTUU6ICJTdWNoIHBhY2tldHMgU0hPVUxEIGJlIHJlcG9ydGVkIHVzaW5nIERhdGEgRHJvcHBlZAorCQkgKiAgICAgICAgIG9wdGlvbnMgKFNlY3Rpb24gMTEuNykgd2l0aCBEcm9wIENvZGUgMCwgUHJvdG9jb2wKKwkJICogICAgICAgICBDb25zdHJhaW50cy4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CiAJfQogCiAJaWYgKCF4ZnJtNF9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQlnb3RvIGRpc2NhcmRfYW5kX3JlbHNlOwogCW5mX3Jlc2V0KHNrYik7CiAKLQlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2ssIHNrYik7CisJcmV0dXJuIHNrX3JlY2VpdmVfc2tiKHNrLCBza2IsIDEpOwogCiBub19kY2NwX3NvY2tldDoKIAlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKIAkJZ290byBkaXNjYXJkX2l0OwogCS8qCiAJICogU3RlcCAyOgorCSAqIAlJZiBubyBzb2NrZXQgLi4uCiAJICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKIAkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwogCWlmIChkaC0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9SRVNFVCkgewogCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9yZXNldF9jb2RlID0KIAkJCQkJRENDUF9SRVNFVF9DT0RFX05PX0NPTk5FQ1RJT047Ci0JCWRjY3BfdjRfY3RsX3NlbmRfcmVzZXQoc2tiKTsKKwkJZGNjcF92NF9jdGxfc2VuZF9yZXNldChzaywgc2tiKTsKIAl9CiAKIGRpc2NhcmRfaXQ6Ci0JLyogRGlzY2FyZCBmcmFtZS4gKi8KIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIAogZGlzY2FyZF9hbmRfcmVsc2U6CiAJc29ja19wdXQoc2spOwogCWdvdG8gZGlzY2FyZF9pdDsKLQotZG9fdGltZV93YWl0OgotCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7Ci0JZ290byBub19kY2NwX3NvY2tldDsKIH0KIAogc3RhdGljIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgZGNjcF9pcHY0X2FmX29wcyA9IHsKQEAgLTEwMTcsMjAgKzk1MCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgZGNjcF92NF9yZXFza19kZXN0cnVjdG9yKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlrZnJlZShpbmV0X3JzayhyZXEpLT5vcHQpOwotfQotCi1zdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgZGNjcF9yZXF1ZXN0X3NvY2tfb3BzID0gewotCS5mYW1pbHkJCT0gUEZfSU5FVCwKLQkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrKSwKLQkucnR4X3N5bl9hY2sJPSBkY2NwX3Y0X3NlbmRfcmVzcG9uc2UsCi0JLnNlbmRfYWNrCT0gZGNjcF92NF9yZXFza19zZW5kX2FjaywKLQkuZGVzdHJ1Y3Rvcgk9IGRjY3BfdjRfcmVxc2tfZGVzdHJ1Y3RvciwKLQkuc2VuZF9yZXNldAk9IGRjY3BfdjRfY3RsX3NlbmRfcmVzZXQsCi19OwotCiBzdGF0aWMgc3RydWN0IHRpbWV3YWl0X3NvY2tfb3BzIGRjY3BfdGltZXdhaXRfc29ja19vcHMgPSB7CiAJLnR3c2tfb2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayksCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2Ni5jIGIvbmV0L2RjY3AvaXB2Ni5jCmluZGV4IGZjNDI0MmMuLmM3YWFhMjUgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjYuYworKysgYi9uZXQvZGNjcC9pcHY2LmMKQEAgLTM2LDEzICszNiw2IEBACiAvKiBTb2NrZXQgdXNlZCBmb3Igc2VuZGluZyBSU1RzIGFuZCBBQ0tzICovCiBzdGF0aWMgc3RydWN0IHNvY2tldCAqZGNjcF92Nl9jdGxfc29ja2V0OwogCi1zdGF0aWMgdm9pZCBkY2NwX3Y2X2N0bF9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIHZvaWQgZGNjcF92Nl9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7Ci1zdGF0aWMgdm9pZCBkY2NwX3Y2X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotc3RhdGljIGludCBkY2NwX3Y2X2RvX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwotCiBzdGF0aWMgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrX2FmX29wcyBkY2NwX2lwdjZfbWFwcGVkOwogc3RhdGljIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgZGNjcF9pcHY2X2FmX29wczsKIApAQCAtNjUsMjA1ICs1OCwzNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1MTYgZGNjcF92Nl9jaGVjayhzdHJ1Y3QgZGNjcF9oZHIgKmRoLCBpbnQgbGVuLAotCQkJCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQl1bnNpZ25lZCBsb25nIGJhc2UpCisvKiBhZGQgcHNldWRvLWhlYWRlciB0byBEQ0NQIGNoZWNrc3VtIHN0b3JlZCBpbiBza2ItPmNzdW0gKi8KK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBkY2NwX3Y2X2NzdW1fZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyKQogewotCXJldHVybiBjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBsZW4sIElQUFJPVE9fRENDUCwgYmFzZSk7CisJcmV0dXJuIGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLCBJUFBST1RPX0RDQ1AsIHNrYi0+Y3N1bSk7CiB9CiAKLXN0YXRpYyBfX3UzMiBkY2NwX3Y2X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSB2b2lkIGRjY3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCB1bnVzZWRfdmFsdWUsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKLQotCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQotCQlyZXR1cm4gc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwdjZoLT5kYWRkci5zNl9hZGRyMzIsCi0JCQkJCQkgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAotCQkJCQkJICAgIGRoLT5kY2NwaF9kcG9ydCwKLQkJCQkJCSAgICBkaC0+ZGNjcGhfc3BvcnQpOwotCi0JcmV0dXJuIHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCSAgIHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJICAgZGgtPmRjY3BoX2Rwb3J0LAotCQkJCQkgICBkaC0+ZGNjcGhfc3BvcnQpOwotfQotCi1zdGF0aWMgaW50IGRjY3BfdjZfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCi0JCQkgICBpbnQgYWRkcl9sZW4pCi17Ci0Jc3RydWN0IHNvY2thZGRyX2luNiAqdXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopdWFkZHI7Ci0Jc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gTlVMTCwgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKLQlzdHJ1Y3QgZmxvd2kgZmw7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotCWludCBhZGRyX3R5cGU7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKIAotCWRwLT5kY2Nwc19yb2xlID0gRENDUF9ST0xFX0NMSUVOVDsKKwlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y2X2NzdW1fZmluaXNoKHNrYiwgJm5wLT5zYWRkciwgJm5wLT5kYWRkcik7Cit9CiAKLQlpZiAoYWRkcl9sZW4gPCBTSU42X0xFTl9SRkMyMTMzKQotCQlyZXR1cm4gLUVJTlZBTDsKK3N0YXRpYyBpbmxpbmUgX191MzIgc2VjdXJlX2RjY3B2Nl9zZXF1ZW5jZV9udW1iZXIoX19iZTMyICpzYWRkciwgX19iZTMyICpkYWRkciwKKwkJCQkgICAJCSAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQgICApCit7CisJcmV0dXJuIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoc2FkZHIsIGRhZGRyLCBzcG9ydCwgZHBvcnQpOworfQogCi0JaWYgKHVzaW4tPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKK3N0YXRpYyBpbmxpbmUgX191MzIgZGNjcF92Nl9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNlY3VyZV9kY2NwdjZfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXB2NmgtPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgICBza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyMzIsCisJCQkJCSAgICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfZHBvcnQsCisJCQkJCSAgICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfc3BvcnQgICAgICk7CiAKLQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKLQotCWlmIChucC0+c25kZmxvdykgewotCQlmbC5mbDZfZmxvd2xhYmVsID0gdXNpbi0+c2luNl9mbG93aW5mbyAmIElQVjZfRkxPV0lORk9fTUFTSzsKLQkJSVA2X0VDTl9mbG93X2luaXQoZmwuZmw2X2Zsb3dsYWJlbCk7Ci0JCWlmIChmbC5mbDZfZmxvd2xhYmVsICYgSVBWNl9GTE9XTEFCRUxfTUFTSykgewotCQkJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsb3dsYWJlbDsKLQkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmwuZmw2X2Zsb3dsYWJlbCk7Ci0JCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpcHY2X2FkZHJfY29weSgmdXNpbi0+c2luNl9hZGRyLCAmZmxvd2xhYmVsLT5kc3QpOwotCQkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOwotCQl9Ci0JfQotCS8qCi0JICogY29ubmVjdCgpIHRvIElOQUREUl9BTlkgbWVhbnMgbG9vcGJhY2sgKEJTRCdpc20pLgotCSAqLwotCWlmIChpcHY2X2FkZHJfYW55KCZ1c2luLT5zaW42X2FkZHIpKQotCQl1c2luLT5zaW42X2FkZHIuczZfYWRkclsxNV0gPSAxOwotCi0JYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnVzaW4tPnNpbjZfYWRkcik7Ci0KLQlpZiAoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkKLQkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKLQotCWlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7Ci0JCWlmIChhZGRyX2xlbiA+PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgJiYKLQkJICAgIHVzaW4tPnNpbjZfc2NvcGVfaWQpIHsKLQkJCS8qIElmIGludGVyZmFjZSBpcyBzZXQgd2hpbGUgYmluZGluZywgaW5kaWNlcwotCQkJICogbXVzdCBjb2luY2lkZS4KLQkJCSAqLwotCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKLQkJCSAgICBzay0+c2tfYm91bmRfZGV2X2lmICE9IHVzaW4tPnNpbjZfc2NvcGVfaWQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSB1c2luLT5zaW42X3Njb3BlX2lkOwotCQl9Ci0KLQkJLyogQ29ubmVjdCB0byBsaW5rLWxvY2FsIGFkZHJlc3MgcmVxdWlyZXMgYW4gaW50ZXJmYWNlICovCi0JCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZikKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlwdjZfYWRkcl9jb3B5KCZucC0+ZGFkZHIsICZ1c2luLT5zaW42X2FkZHIpOwotCW5wLT5mbG93X2xhYmVsID0gZmwuZmw2X2Zsb3dsYWJlbDsKLQotCS8qCi0JICogRENDUCBvdmVyIElQdjQKLQkgKi8KLQlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9NQVBQRUQpIHsKLQkJdTMyIGV4dGhkcmxlbiA9IGljc2stPmljc2tfZXh0X2hkcl9sZW47Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0KLQkJU09DS19ERUJVRyhzaywgImNvbm5lY3Q6IGlwdjQgbWFwcGVkXG4iKTsKLQotCQlpZiAoX19pcHY2X29ubHlfc29jayhzaykpCi0JCQlyZXR1cm4gLUVORVRVTlJFQUNIOwotCi0JCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLnNpbl9wb3J0ID0gdXNpbi0+c2luNl9wb3J0OwotCQlzaW4uc2luX2FkZHIuc19hZGRyID0gdXNpbi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXTsKLQotCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfbWFwcGVkOwotCQlzay0+c2tfYmFja2xvZ19yY3YgPSBkY2NwX3Y0X2RvX3JjdjsKLQotCQllcnIgPSBkY2NwX3Y0X2Nvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWljc2stPmljc2tfZXh0X2hkcl9sZW4gPSBleHRoZHJsZW47Ci0JCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfYWZfb3BzOwotCQkJc2stPnNrX2JhY2tsb2dfcmN2ID0gZGNjcF92Nl9kb19yY3Y7Ci0JCQlnb3RvIGZhaWx1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlpcHY2X2FkZHJfc2V0KCZucC0+c2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAotCQkJCSAgICAgIGluZXQtPnNhZGRyKTsKLQkJCWlwdjZfYWRkcl9zZXQoJm5wLT5yY3Zfc2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAotCQkJCSAgICAgIGluZXQtPnJjdl9zYWRkcik7Ci0JCX0KLQotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICghaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcikpCi0JCXNhZGRyID0gJm5wLT5yY3Zfc2FkZHI7Ci0KLQlmbC5wcm90byA9IElQUFJPVE9fRENDUDsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJm5wLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsIHNhZGRyID8gc2FkZHIgOiAmbnAtPnNhZGRyKTsKLQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwotCWZsLmZsX2lwX2Rwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwotCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+c3BvcnQ7Ci0Jc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKLQotCWlmIChucC0+b3B0ICE9IE5VTEwgJiYgbnAtPm9wdC0+c3JjcnQgIT0gTlVMTCkgewotCQljb25zdCBzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopbnAtPm9wdC0+c3JjcnQ7Ci0KLQkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOwotCQlmaW5hbF9wID0gJmZpbmFsOwotCX0KLQotCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbHVyZTsKLQotCWlmIChmaW5hbF9wKQotCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7Ci0KLQllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsdXJlOwotCi0JaWYgKHNhZGRyID09IE5VTEwpIHsKLQkJc2FkZHIgPSAmZmwuZmw2X3NyYzsKLQkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsIHNhZGRyKTsKLQl9Ci0KLQkvKiBzZXQgdGhlIHNvdXJjZSBhZGRyZXNzICovCi0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5zYWRkciwgc2FkZHIpOwotCWluZXQtPnJjdl9zYWRkciA9IExPT1BCQUNLNF9JUFY2OwotCi0JX19pcDZfZHN0X3N0b3JlKHNrLCBkc3QsIE5VTEwsIE5VTEwpOwotCi0JaWNzay0+aWNza19leHRfaGRyX2xlbiA9IDA7Ci0JaWYgKG5wLT5vcHQgIT0gTlVMTCkKLQkJaWNzay0+aWNza19leHRfaGRyX2xlbiA9IChucC0+b3B0LT5vcHRfZmxlbiArCi0JCQkJCSAgbnAtPm9wdC0+b3B0X25mbGVuKTsKLQotCWluZXQtPmRwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwotCi0JZGNjcF9zZXRfc3RhdGUoc2ssIERDQ1BfUkVRVUVTVElORyk7Ci0JZXJyID0gaW5ldDZfaGFzaF9jb25uZWN0KCZkY2NwX2RlYXRoX3Jvdywgc2spOwotCWlmIChlcnIpCi0JCWdvdG8gbGF0ZV9mYWlsdXJlOwotCS8qIEZJWE1FICovCi0jaWYgMAotCWRwLT5kY2Nwc19nYXIgPSBzZWN1cmVfZGNjcF92Nl9zZXF1ZW5jZV9udW1iZXIobnAtPnNhZGRyLnM2X2FkZHIzMiwKLQkJCQkJCSAgICAgICBucC0+ZGFkZHIuczZfYWRkcjMyLAotCQkJCQkJICAgICAgIGluZXQtPnNwb3J0LAotCQkJCQkJICAgICAgIGluZXQtPmRwb3J0KTsKLSNlbmRpZgotCWVyciA9IGRjY3BfY29ubmVjdChzayk7Ci0JaWYgKGVycikKLQkJZ290byBsYXRlX2ZhaWx1cmU7Ci0KLQlyZXR1cm4gMDsKLQotbGF0ZV9mYWlsdXJlOgotCWRjY3Bfc2V0X3N0YXRlKHNrLCBEQ0NQX0NMT1NFRCk7Ci0JX19za19kc3RfcmVzZXQoc2spOwotZmFpbHVyZToKLQlpbmV0LT5kcG9ydCA9IDA7Ci0Jc2stPnNrX3JvdXRlX2NhcHMgPSAwOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGRjY3BfdjZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LApAQCAtNDY0LDE2ICsyODksMTIgQEAKIAlpZiAoc2tiICE9IE5VTEwpIHsKIAkJc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CiAKLQkJZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92Nl9jaGVjayhkaCwgc2tiLT5sZW4sCi0JCQkJCQkgICAmaXJlcTYtPmxvY19hZGRyLAotCQkJCQkJICAgJmlyZXE2LT5ybXRfYWRkciwKLQkJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKWRoLAotCQkJCQkJCQlza2ItPmxlbiwKLQkJCQkJCQkJc2tiLT5jc3VtKSk7CisJCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjZfY3N1bV9maW5pc2goc2tiLAorCQkJCQkJCSAmaXJlcTYtPmxvY19hZGRyLAorCQkJCQkJCSAmaXJlcTYtPnJtdF9hZGRyKTsKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZpcmVxNi0+cm10X2FkZHIpOwogCQllcnIgPSBpcDZfeG1pdChzaywgc2tiLCAmZmwsIG9wdCwgMCk7Ci0JCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCi0JCQllcnIgPSAwOworCQllcnIgPSBuZXRfeG1pdF9ldmFsKGVycik7CiAJfQogCiBkb25lOgpAQCAtNDg5LDMyICszMTAsNyBAQAogCQlrZnJlZV9za2IoaW5ldDZfcnNrKHJlcSktPnBrdG9wdHMpOwogfQogCi1zdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgZGNjcDZfcmVxdWVzdF9zb2NrX29wcyA9IHsKLQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgZGNjcDZfcmVxdWVzdF9zb2NrKSwKLQkucnR4X3N5bl9hY2sJPSBkY2NwX3Y2X3NlbmRfcmVzcG9uc2UsCi0JLnNlbmRfYWNrCT0gZGNjcF92Nl9yZXFza19zZW5kX2FjaywKLQkuZGVzdHJ1Y3Rvcgk9IGRjY3BfdjZfcmVxc2tfZGVzdHJ1Y3RvciwKLQkuc2VuZF9yZXNldAk9IGRjY3BfdjZfY3RsX3NlbmRfcmVzZXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHRpbWV3YWl0X3NvY2tfb3BzIGRjY3A2X3RpbWV3YWl0X3NvY2tfb3BzID0gewotCS50d3NrX29ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBkY2NwNl90aW1ld2FpdF9zb2NrKSwKLX07Ci0KLXN0YXRpYyB2b2lkIGRjY3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwotCXN0cnVjdCBkY2NwX2hkciAqZGggPSBkY2NwX2hkcihza2IpOwotCi0JZGgtPmRjY3BoX2NoZWNrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZucC0+c2FkZHIsICZucC0+ZGFkZHIsCi0JCQkJCSAgICAgbGVuLCBJUFBST1RPX0RDQ1AsCi0JCQkJCSAgICAgY3N1bV9wYXJ0aWFsKChjaGFyICopZGgsCi0JCQkJCQkJICBkaC0+ZGNjcGhfZG9mZiA8PCAyLAotCQkJCQkJCSAgc2tiLT5jc3VtKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRjY3BfdjZfY3RsX3NlbmRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnJ4c2tiKQorc3RhdGljIHZvaWQgZGNjcF92Nl9jdGxfc2VuZF9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpyeHNrYikKIHsKIAlzdHJ1Y3QgZGNjcF9oZHIgKnJ4ZGggPSBkY2NwX2hkcihyeHNrYiksICpkaDsKIAljb25zdCB1MzIgZGNjcF9oZHJfcmVzZXRfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwpAQCAtNTIyLDcgKzMxOCw3IEBACiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGZsb3dpIGZsOwotCXU2NCBzZXFubzsKKwl1NjQgc2Vxbm8gPSAwOwogCiAJaWYgKHJ4ZGgtPmRjY3BoX3R5cGUgPT0gRENDUF9QS1RfUkVTRVQpCiAJCXJldHVybjsKQEAgLTUzNyw5ICszMzMsNyBAQAogCiAJc2tiX3Jlc2VydmUoc2tiLCBkY2NwX3Y2X2N0bF9zb2NrZXQtPnNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKIAotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIGRjY3BfaGRyX3Jlc2V0X2xlbik7Ci0JZGggPSBkY2NwX2hkcihza2IpOwotCW1lbXNldChkaCwgMCwgZGNjcF9oZHJfcmVzZXRfbGVuKTsKKwlkaCA9IGRjY3BfemVyb2VkX2hkcihza2IsIGRjY3BfaGRyX3Jlc2V0X2xlbik7CiAKIAkvKiBTd2FwIHRoZSBzZW5kIGFuZCB0aGUgcmVjZWl2ZS4gKi8KIAlkaC0+ZGNjcGhfdHlwZQk9IERDQ1BfUEtUX1JFU0VUOwpAQCAtNTUxLDIwICszNDUsMjAgQEAKIAkJCQlEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3Jlc2V0X2NvZGU7CiAKIAkvKiBTZWUgIjguMy4xLiBBYm5vcm1hbCBUZXJtaW5hdGlvbiIgaW4gUkZDIDQzNDAgKi8KLQlzZXFubyA9IDA7CiAJaWYgKERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfYWNrX3NlcSAhPSBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEpCiAJCWRjY3Bfc2V0X3NlcW5vKCZzZXFubywgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxICsgMSk7CiAKIAlkY2NwX2hkcl9zZXRfc2VxKGRoLCBzZXFubyk7Ci0JZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLAotCQkJIERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfc2VxKTsKKwlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksIERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfc2VxKTsKKworCWRjY3BfY3N1bV9vdXRnb2luZyhza2IpOworCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjZfY3N1bV9maW5pc2goc2tiLCAmcnhza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkgICAJCSAgICAgICZyeHNrYi0+bmguaXB2NmgtPmRhZGRyKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwogCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmcnhza2ItPm5oLmlwdjZoLT5zYWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsICZyeHNrYi0+bmguaXB2NmgtPmRhZGRyKTsKLQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLmZsNl9zcmMsICZmbC5mbDZfZHN0LAotCQkJCQkgICAgIHNpemVvZigqZGgpLCBJUFBST1RPX0RDQ1AsCi0JCQkJCSAgICAgc2tiLT5jc3VtKTsKKwogCWZsLnByb3RvID0gSVBQUk9UT19EQ0NQOwogCWZsLm9pZiA9IGluZXQ2X2lpZihyeHNrYik7CiAJZmwuZmxfaXBfZHBvcnQgPSBkaC0+ZGNjcGhfZHBvcnQ7CkBAIC01ODQsNjAgKzM3OCwxNCBAQAogCWtmcmVlX3NrYihza2IpOwogfQogCi1zdGF0aWMgdm9pZCBkY2NwX3Y2X3JlcXNrX3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpyeHNrYiwKLQkJCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCi17Ci0Jc3RydWN0IGZsb3dpIGZsOwotCXN0cnVjdCBkY2NwX2hkciAqcnhkaCA9IGRjY3BfaGRyKHJ4c2tiKSwgKmRoOwotCWNvbnN0IHUzMiBkY2NwX2hkcl9hY2tfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpICsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlza2IgPSBhbGxvY19za2IoZGNjcF92Nl9jdGxfc29ja2V0LT5zay0+c2tfcHJvdC0+bWF4X2hlYWRlciwKLQkJCUdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc2tiX3Jlc2VydmUoc2tiLCBkY2NwX3Y2X2N0bF9zb2NrZXQtPnNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKLQotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIGRjY3BfaGRyX2Fja19sZW4pOwotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQltZW1zZXQoZGgsIDAsIGRjY3BfaGRyX2Fja19sZW4pOwotCi0JLyogQnVpbGQgRENDUCBoZWFkZXIgYW5kIGNoZWNrc3VtIGl0LiAqLwotCWRoLT5kY2NwaF90eXBlCT0gRENDUF9QS1RfQUNLOwotCWRoLT5kY2NwaF9zcG9ydCA9IHJ4ZGgtPmRjY3BoX2Rwb3J0OwotCWRoLT5kY2NwaF9kcG9ydCA9IHJ4ZGgtPmRjY3BoX3Nwb3J0OwotCWRoLT5kY2NwaF9kb2ZmCT0gZGNjcF9oZHJfYWNrX2xlbiAvIDQ7Ci0JZGgtPmRjY3BoX3gJPSAxOwotCi0JZGNjcF9oZHJfc2V0X3NlcShkaCwgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxKTsKLQlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksCi0JCQkgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOwotCi0JbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZyeHNrYi0+bmguaXB2NmgtPnNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnJ4c2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCi0JLyogRklYTUU6IGNhbGN1bGF0ZSBjaGVja3N1bSwgSVB2NCBhbHNvIHNob3VsZC4uLiAqLwotCi0JZmwucHJvdG8gPSBJUFBST1RPX0RDQ1A7Ci0JZmwub2lmID0gaW5ldDZfaWlmKHJ4c2tiKTsKLQlmbC5mbF9pcF9kcG9ydCA9IGRoLT5kY2NwaF9kcG9ydDsKLQlmbC5mbF9pcF9zcG9ydCA9IGRoLT5kY2NwaF9zcG9ydDsKLQlzZWN1cml0eV9yZXFfY2xhc3NpZnlfZmxvdyhyZXEsICZmbCk7Ci0KLQlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZza2ItPmRzdCwgJmZsKSkgewotCQlpZiAoeGZybV9sb29rdXAoJnNrYi0+ZHN0LCAmZmwsIE5VTEwsIDApID49IDApIHsKLQkJCWlwNl94bWl0KGRjY3BfdjZfY3RsX3NvY2tldC0+c2ssIHNrYiwgJmZsLCBOVUxMLCAwKTsKLQkJCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX09VVFNFR1MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0Ja2ZyZWVfc2tiKHNrYik7Ci19CitzdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgZGNjcDZfcmVxdWVzdF9zb2NrX29wcyA9IHsKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgZGNjcDZfcmVxdWVzdF9zb2NrKSwKKwkucnR4X3N5bl9hY2sJPSBkY2NwX3Y2X3NlbmRfcmVzcG9uc2UsCisJLnNlbmRfYWNrCT0gZGNjcF9yZXFza19zZW5kX2FjaywKKwkuZGVzdHJ1Y3Rvcgk9IGRjY3BfdjZfcmVxc2tfZGVzdHJ1Y3RvciwKKwkuc2VuZF9yZXNldAk9IGRjY3BfdjZfY3RsX3NlbmRfcmVzZXQsCit9OwogCiBzdGF0aWMgc3RydWN0IHNvY2sgKmRjY3BfdjZfaG5kX3JlcShzdHJ1Y3Qgc29jayAqc2ssc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTY3Miw3ICs0MjAsNiBAQAogCiBzdGF0aWMgaW50IGRjY3BfdjZfY29ubl9yZXF1ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrIGRwOwogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKIAlzdHJ1Y3QgZGNjcF9yZXF1ZXN0X3NvY2sgKmRyZXE7CiAJc3RydWN0IGluZXQ2X3JlcXVlc3Rfc29jayAqaXJlcTY7CkBAIC03MDQsOSArNDUxLDEwIEBACiAJaWYgKHJlcSA9PSBOVUxMKQogCQlnb3RvIGRyb3A7CiAKLQkvKiBGSVhNRTogcHJvY2VzcyBvcHRpb25zICovCisJaWYgKGRjY3BfcGFyc2Vfb3B0aW9ucyhzaywgc2tiKSkKKwkJZ290byBkcm9wX2FuZF9mcmVlOwogCi0JZGNjcF9vcGVucmVxX2luaXQocmVxLCAmZHAsIHNrYik7CisJZGNjcF9yZXFza19pbml0KHJlcSwgc2tiKTsKIAogCWlmIChzZWN1cml0eV9pbmV0X2Nvbm5fcmVxdWVzdChzaywgc2tiLCByZXEpKQogCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CkBAIC03MTQsNyArNDYyLDYgQEAKIAlpcmVxNiA9IGluZXQ2X3JzayhyZXEpOwogCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+cm10X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJmlyZXE2LT5sb2NfYWRkciwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKLQlyZXEtPnJjdl93bmQJPSBkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3c7CiAJaXJlcTYtPnBrdG9wdHMJPSBOVUxMOwogCiAJaWYgKGlwdjZfb3B0X2FjY2VwdGVkKHNrLCBza2IpIHx8CkBAIC03MzMsMTQgKzQ4MCwxNCBAQAogCS8qCiAJICogU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQogCSAqCi0JICogU2V0IFMuSVNSLCBTLkdTUiwgUy5TV0wsIFMuU1dIIGZyb20gcGFja2V0IG9yIEluaXQgQ29va2llCisJICogICBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWUKIAkgKgotCSAqIEluIGZhY3Qgd2UgZGVmZXIgc2V0dGluZyBTLkdTUiwgUy5TV0wsIFMuU1dIIHRvCi0JICogZGNjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZC4KKwkgKiAgIEluIGZhY3Qgd2UgZGVmZXIgc2V0dGluZyBTLkdTUiwgUy5TV0wsIFMuU1dIIHRvCisJICogICBkY2NwX2NyZWF0ZV9vcGVucmVxX2NoaWxkLgogCSAqLwogCWRyZXEgPSBkY2NwX3JzayhyZXEpOwogCWRyZXEtPmRyZXFfaXNyCSAgID0gZGNiLT5kY2NwZF9zZXE7Ci0JZHJlcS0+ZHJlcV9pc3MJICAgPSBkY2NwX3Y2X2luaXRfc2VxdWVuY2Uoc2ssIHNrYik7CisJZHJlcS0+ZHJlcV9pc3MJICAgPSBkY2NwX3Y2X2luaXRfc2VxdWVuY2Uoc2tiKTsKIAlkcmVxLT5kcmVxX3NlcnZpY2UgPSBzZXJ2aWNlOwogCiAJaWYgKGRjY3BfdjZfc2VuZF9yZXNwb25zZShzaywgcmVxLCBOVUxMKSkKQEAgLTk5MCwxOCArNzM3LDQ2IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1BTksgKDk4MDcyOCkKIAkgKi8KIAlpZiAobnAtPnJ4b3B0LmFsbCkKKwkvKgorCSAqIEZJWE1FOiBBZGQgaGFuZGxpbmcgb2YgSVBWNl9QS1RPUFRJT05TIHNrYi4gU2VlIHRoZSBjb21tZW50cyBiZWxvdworCSAqICAgICAgICAod3J0IGlwdjZfcGt0b3Bpb25zKSBhbmQgbmV0L2lwdjYvdGNwX2lwdjYuYyBmb3IgYW4gZXhhbXBsZS4KKwkgKi8KIAkJb3B0X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX09QRU4pIHsgLyogRmFzdCBwYXRoICovCiAJCWlmIChkY2NwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCBkY2NwX2hkcihza2IpLCBza2ItPmxlbikpCiAJCQlnb3RvIHJlc2V0OwogCQlpZiAob3B0X3NrYikgewotCQkJLyogVGhpcyBpcyB3aGVyZSB3ZSB3b3VsZCBnb3RvIGlwdjZfcGt0b3B0aW9ucy4gKi8KKwkJCS8qIFhYWCBUaGlzIGlzIHdoZXJlIHdlIHdvdWxkIGdvdG8gaXB2Nl9wa3RvcHRpb25zLiAqLwogCQkJX19rZnJlZV9za2Iob3B0X3NrYik7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiAgU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQorCSAqICAgICBJZiBTLnN0YXRlID09IExJU1RFTiwKKwkgKgkgSWYgUC50eXBlID09IFJlcXVlc3Qgb3IgUCBjb250YWlucyBhIHZhbGlkIEluaXQgQ29va2llIG9wdGlvbiwKKwkgKgkgICAgICAoKiBNdXN0IHNjYW4gdGhlIHBhY2tldCdzIG9wdGlvbnMgdG8gY2hlY2sgZm9yIEluaXQKKwkgKgkJIENvb2tpZXMuICBPbmx5IEluaXQgQ29va2llcyBhcmUgcHJvY2Vzc2VkIGhlcmUsCisJICoJCSBob3dldmVyOyBvdGhlciBvcHRpb25zIGFyZSBwcm9jZXNzZWQgaW4gU3RlcCA4LiAgVGhpcworCSAqCQkgc2NhbiBuZWVkIG9ubHkgYmUgcGVyZm9ybWVkIGlmIHRoZSBlbmRwb2ludCB1c2VzIEluaXQKKwkgKgkJIENvb2tpZXMgKikKKwkgKgkgICAgICAoKiBHZW5lcmF0ZSBhIG5ldyBzb2NrZXQgYW5kIHN3aXRjaCB0byB0aGF0IHNvY2tldCAqKQorCSAqCSAgICAgIFNldCBTIDo9IG5ldyBzb2NrZXQgZm9yIHRoaXMgcG9ydCBwYWlyCisJICoJICAgICAgUy5zdGF0ZSA9IFJFU1BPTkQKKwkgKgkgICAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llcworCSAqCSAgICAgIEluaXRpYWxpemUgUy5HQVIgOj0gUy5JU1MKKwkgKgkgICAgICBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWVzCisJICoJICAgICAgQ29udGludWUgd2l0aCBTLnN0YXRlID09IFJFU1BPTkQKKwkgKgkgICAgICAoKiBBIFJlc3BvbnNlIHBhY2tldCB3aWxsIGJlIGdlbmVyYXRlZCBpbiBTdGVwIDExICopCisJICoJIE90aGVyd2lzZSwKKwkgKgkgICAgICBHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0CisJICoJICAgICAgRHJvcCBwYWNrZXQgYW5kIHJldHVybgorCSAqCisJICogTk9URTogdGhlIGNoZWNrIGZvciB0aGUgcGFja2V0IHR5cGVzIGlzIGRvbmUgaW4KKwkgKgkgZGNjcF9yY3Zfc3RhdGVfcHJvY2VzcworCSAqLwogCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pIHsKIAkJc3RydWN0IHNvY2sgKm5zayA9IGRjY3BfdjZfaG5kX3JlcShzaywgc2tiKTsKIApAQCAtMTAyNCwxMyArNzk5LDEzIEBACiAJaWYgKGRjY3BfcmN2X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgZGNjcF9oZHIoc2tiKSwgc2tiLT5sZW4pKQogCQlnb3RvIHJlc2V0OwogCWlmIChvcHRfc2tiKSB7Ci0JCS8qIFRoaXMgaXMgd2hlcmUgd2Ugd291bGQgZ290byBpcHY2X3BrdG9wdGlvbnMuICovCisJCS8qIFhYWCBUaGlzIGlzIHdoZXJlIHdlIHdvdWxkIGdvdG8gaXB2Nl9wa3RvcHRpb25zLiAqLwogCQlfX2tmcmVlX3NrYihvcHRfc2tiKTsKIAl9CiAJcmV0dXJuIDA7CiAKIHJlc2V0OgotCWRjY3BfdjZfY3RsX3NlbmRfcmVzZXQoc2tiKTsKKwlkY2NwX3Y2X2N0bF9zZW5kX3Jlc2V0KHNrLCBza2IpOwogZGlzY2FyZDoKIAlpZiAob3B0X3NrYiAhPSBOVUxMKQogCQlfX2tmcmVlX3NrYihvcHRfc2tiKTsKQEAgLTEwNDMsMTIgKzgxOCwyMCBAQAogCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwogCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgbWluX2NvdjsKIAotCS8qIFN0ZXAgMTogQ2hlY2sgaGVhZGVyIGJhc2ljczogKi8KKwkvKiBTdGVwIDE6IENoZWNrIGhlYWRlciBiYXNpY3MgKi8KIAogCWlmIChkY2NwX2ludmFsaWRfcGFja2V0KHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAorCS8qIFN0ZXAgMTogSWYgaGVhZGVyIGNoZWNrc3VtIGlzIGluY29ycmVjdCwgZHJvcCBwYWNrZXQgYW5kIHJldHVybi4gKi8KKwlpZiAoZGNjcF92Nl9jc3VtX2ZpbmlzaChza2IsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkgICAgICZza2ItPm5oLmlwdjZoLT5kYWRkcikpIHsKKwkJRENDUF9XQVJOKCJkcm9wcGVkIHBhY2tldCB3aXRoIGludmFsaWQgY2hlY2tzdW1cbiIpOworCQlnb3RvIGRpc2NhcmRfaXQ7CisJfQorCiAJZGggPSBkY2NwX2hkcihza2IpOwogCiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxICA9IGRjY3BfaGRyX3NlcShza2IpOwpAQCAtMTA2OCwxMSArODUxLDEyIEBACiAJLyoKIAkgKiBTdGVwIDI6CiAJICogCUlmIG5vIHNvY2tldCAuLi4KLQkgKgkJR2VuZXJhdGUgUmVzZXQoTm8gQ29ubmVjdGlvbikgdW5sZXNzIFAudHlwZSA9PSBSZXNldAotCSAqCQlEcm9wIHBhY2tldCBhbmQgcmV0dXJuCiAJICovCi0JaWYgKHNrID09IE5VTEwpCisJaWYgKHNrID09IE5VTEwpIHsKKwkJZGNjcF9wcl9kZWJ1ZygiZmFpbGVkIHRvIGxvb2sgdXAgZmxvdyBJRCBpbiB0YWJsZSBhbmQgIgorCQkJICAgICAgImdldCBjb3JyZXNwb25kaW5nIHNvY2tldFxuIik7CiAJCWdvdG8gbm9fZGNjcF9zb2NrZXQ7CisJfQogCiAJLyoKIAkgKiBTdGVwIDI6CkBAIC0xMDgwLDQzICs4NjQsMjI2IEBACiAJICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKIAkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwotCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9USU1FX1dBSVQpCi0JCWdvdG8gZG9fdGltZV93YWl0OworCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9USU1FX1dBSVQpIHsKKwkJZGNjcF9wcl9kZWJ1Zygic2stPnNrX3N0YXRlID09IERDQ1BfVElNRV9XQUlUOiBkb190aW1lX3dhaXRcbiIpOworCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOworCQlnb3RvIG5vX2RjY3Bfc29ja2V0OworCX0KKworCS8qCisJICogUkZDIDQzNDAsIHNlYy4gOS4yLjE6IE1pbmltdW0gQ2hlY2tzdW0gQ292ZXJhZ2UKKwkgKiAJbyBpZiBNaW5Dc0NvdiA9IDAsIG9ubHkgcGFja2V0cyB3aXRoIENzQ292ID0gMCBhcmUgYWNjZXB0ZWQKKwkgKiAJbyBpZiBNaW5Dc0NvdiA+IDAsIGFsc28gYWNjZXB0IHBhY2tldHMgd2l0aCBDc0NvdiA+PSBNaW5Dc0NvdgorCSAqLworCW1pbl9jb3YgPSBkY2NwX3NrKHNrKS0+ZGNjcHNfcGNybGVuOworCWlmIChkaC0+ZGNjcGhfY3Njb3YgICYmICAobWluX2NvdiA9PSAwIHx8IGRoLT5kY2NwaF9jc2NvdiA8IG1pbl9jb3YpKSAgeworCQlkY2NwX3ByX2RlYnVnKCJQYWNrZXQgQ3NDb3YgJWQgZG9lcyBub3Qgc2F0aXNmeSBNaW5Dc0NvdiAlZFxuIiwKKwkJCSAgICAgIGRoLT5kY2NwaF9jc2NvdiwgbWluX2Nvdik7CisJCS8qIEZJWE1FOiBzZW5kIERhdGEgRHJvcHBlZCBvcHRpb24gKHNlZSBhbHNvIGRjY3BfdjRfcmN2KSAqLworCQlnb3RvIGRpc2NhcmRfYW5kX3JlbHNlOworCX0KIAogCWlmICgheGZybTZfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKIAkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKIAotCXJldHVybiBza19yZWNlaXZlX3NrYihzaywgc2tiKSA/IC0xIDogMDsKKwlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2ssIHNrYiwgMSkgPyAtMSA6IDA7CiAKIG5vX2RjY3Bfc29ja2V0OgogCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CiAJLyoKIAkgKiBTdGVwIDI6CisJICogCUlmIG5vIHNvY2tldCAuLi4KIAkgKgkJR2VuZXJhdGUgUmVzZXQoTm8gQ29ubmVjdGlvbikgdW5sZXNzIFAudHlwZSA9PSBSZXNldAogCSAqCQlEcm9wIHBhY2tldCBhbmQgcmV0dXJuCiAJICovCiAJaWYgKGRoLT5kY2NwaF90eXBlICE9IERDQ1BfUEtUX1JFU0VUKSB7CiAJCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3Jlc2V0X2NvZGUgPQogCQkJCQlEQ0NQX1JFU0VUX0NPREVfTk9fQ09OTkVDVElPTjsKLQkJZGNjcF92Nl9jdGxfc2VuZF9yZXNldChza2IpOworCQlkY2NwX3Y2X2N0bF9zZW5kX3Jlc2V0KHNrLCBza2IpOwogCX0KKwogZGlzY2FyZF9pdDoKLQotCS8qCi0JICoJRGlzY2FyZCBmcmFtZQotCSAqLwotCiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiAKIGRpc2NhcmRfYW5kX3JlbHNlOgogCXNvY2tfcHV0KHNrKTsKIAlnb3RvIGRpc2NhcmRfaXQ7Cit9CiAKLWRvX3RpbWVfd2FpdDoKLQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwotCWdvdG8gbm9fZGNjcF9zb2NrZXQ7CitzdGF0aWMgaW50IGRjY3BfdjZfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCQkgICBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqdXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopdWFkZHI7CisJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKwlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gTlVMTCwgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCWludCBhZGRyX3R5cGU7CisJaW50IGVycjsKKworCWRwLT5kY2Nwc19yb2xlID0gRENDUF9ST0xFX0NMSUVOVDsKKworCWlmIChhZGRyX2xlbiA8IFNJTjZfTEVOX1JGQzIxMzMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVzaW4tPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCisJaWYgKG5wLT5zbmRmbG93KSB7CisJCWZsLmZsNl9mbG93bGFiZWwgPSB1c2luLT5zaW42X2Zsb3dpbmZvICYgSVBWNl9GTE9XSU5GT19NQVNLOworCQlJUDZfRUNOX2Zsb3dfaW5pdChmbC5mbDZfZmxvd2xhYmVsKTsKKwkJaWYgKGZsLmZsNl9mbG93bGFiZWwgJiBJUFY2X0ZMT1dMQUJFTF9NQVNLKSB7CisJCQlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmxvd2xhYmVsOworCQkJZmxvd2xhYmVsID0gZmw2X3NvY2tfbG9va3VwKHNrLCBmbC5mbDZfZmxvd2xhYmVsKTsKKwkJCWlmIChmbG93bGFiZWwgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlwdjZfYWRkcl9jb3B5KCZ1c2luLT5zaW42X2FkZHIsICZmbG93bGFiZWwtPmRzdCk7CisJCQlmbDZfc29ja19yZWxlYXNlKGZsb3dsYWJlbCk7CisJCX0KKwl9CisJLyoKKwkgKiBjb25uZWN0KCkgdG8gSU5BRERSX0FOWSBtZWFucyBsb29wYmFjayAoQlNEJ2lzbSkuCisJICovCisJaWYgKGlwdjZfYWRkcl9hbnkoJnVzaW4tPnNpbjZfYWRkcikpCisJCXVzaW4tPnNpbjZfYWRkci5zNl9hZGRyWzE1XSA9IDE7CisKKwlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmdXNpbi0+c2luNl9hZGRyKTsKKworCWlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUKQorCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCisJaWYgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHsKKwkJaWYgKGFkZHJfbGVuID49IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSAmJgorCQkgICAgdXNpbi0+c2luNl9zY29wZV9pZCkgeworCQkJLyogSWYgaW50ZXJmYWNlIGlzIHNldCB3aGlsZSBiaW5kaW5nLCBpbmRpY2VzCisJCQkgKiBtdXN0IGNvaW5jaWRlLgorCQkJICovCisJCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJgorCQkJICAgIHNrLT5za19ib3VuZF9kZXZfaWYgIT0gdXNpbi0+c2luNl9zY29wZV9pZCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IHVzaW4tPnNpbjZfc2NvcGVfaWQ7CisJCX0KKworCQkvKiBDb25uZWN0IHRvIGxpbmstbG9jYWwgYWRkcmVzcyByZXF1aXJlcyBhbiBpbnRlcmZhY2UgKi8KKwkJaWYgKCFzay0+c2tfYm91bmRfZGV2X2lmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXB2Nl9hZGRyX2NvcHkoJm5wLT5kYWRkciwgJnVzaW4tPnNpbjZfYWRkcik7CisJbnAtPmZsb3dfbGFiZWwgPSBmbC5mbDZfZmxvd2xhYmVsOworCisJLyoKKwkgKiBEQ0NQIG92ZXIgSVB2NAorCSAqLworCWlmIChhZGRyX3R5cGUgPT0gSVBWNl9BRERSX01BUFBFRCkgeworCQl1MzIgZXh0aGRybGVuID0gaWNzay0+aWNza19leHRfaGRyX2xlbjsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCQlTT0NLX0RFQlVHKHNrLCAiY29ubmVjdDogaXB2NCBtYXBwZWRcbiIpOworCisJCWlmIChfX2lwdjZfb25seV9zb2NrKHNrKSkKKwkJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisKKwkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4uc2luX3BvcnQgPSB1c2luLT5zaW42X3BvcnQ7CisJCXNpbi5zaW5fYWRkci5zX2FkZHIgPSB1c2luLT5zaW42X2FkZHIuczZfYWRkcjMyWzNdOworCisJCWljc2stPmljc2tfYWZfb3BzID0gJmRjY3BfaXB2Nl9tYXBwZWQ7CisJCXNrLT5za19iYWNrbG9nX3JjdiA9IGRjY3BfdjRfZG9fcmN2OworCisJCWVyciA9IGRjY3BfdjRfY29ubmVjdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKTsKKwkJaWYgKGVycikgeworCQkJaWNzay0+aWNza19leHRfaGRyX2xlbiA9IGV4dGhkcmxlbjsKKwkJCWljc2stPmljc2tfYWZfb3BzID0gJmRjY3BfaXB2Nl9hZl9vcHM7CisJCQlzay0+c2tfYmFja2xvZ19yY3YgPSBkY2NwX3Y2X2RvX3JjdjsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfSBlbHNlIHsKKwkJCWlwdjZfYWRkcl9zZXQoJm5wLT5zYWRkciwgMCwgMCwgaHRvbmwoMHgwMDAwRkZGRiksCisJCQkJICAgICAgaW5ldC0+c2FkZHIpOworCQkJaXB2Nl9hZGRyX3NldCgmbnAtPnJjdl9zYWRkciwgMCwgMCwgaHRvbmwoMHgwMDAwRkZGRiksCisJCQkJICAgICAgaW5ldC0+cmN2X3NhZGRyKTsKKwkJfQorCisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFpcHY2X2FkZHJfYW55KCZucC0+cmN2X3NhZGRyKSkKKwkJc2FkZHIgPSAmbnAtPnJjdl9zYWRkcjsKKworCWZsLnByb3RvID0gSVBQUk9UT19EQ0NQOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmbnAtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgc2FkZHIgPyBzYWRkciA6ICZucC0+c2FkZHIpOworCWZsLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJZmwuZmxfaXBfZHBvcnQgPSB1c2luLT5zaW42X3BvcnQ7CisJZmwuZmxfaXBfc3BvcnQgPSBpbmV0LT5zcG9ydDsKKwlzZWN1cml0eV9za19jbGFzc2lmeV9mbG93KHNrLCAmZmwpOworCisJaWYgKG5wLT5vcHQgIT0gTlVMTCAmJiBucC0+b3B0LT5zcmNydCAhPSBOVUxMKSB7CisJCWNvbnN0IHN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKilucC0+b3B0LT5zcmNydDsKKworCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJCWZpbmFsX3AgPSAmZmluYWw7CisJfQorCisJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsdXJlOworCisJaWYgKGZpbmFsX3ApCisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKKworCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWx1cmU7CisKKwlpZiAoc2FkZHIgPT0gTlVMTCkgeworCQlzYWRkciA9ICZmbC5mbDZfc3JjOworCQlpcHY2X2FkZHJfY29weSgmbnAtPnJjdl9zYWRkciwgc2FkZHIpOworCX0KKworCS8qIHNldCB0aGUgc291cmNlIGFkZHJlc3MgKi8KKwlpcHY2X2FkZHJfY29weSgmbnAtPnNhZGRyLCBzYWRkcik7CisJaW5ldC0+cmN2X3NhZGRyID0gTE9PUEJBQ0s0X0lQVjY7CisKKwlfX2lwNl9kc3Rfc3RvcmUoc2ssIGRzdCwgTlVMTCwgTlVMTCk7CisKKwlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuID0gMDsKKwlpZiAobnAtPm9wdCAhPSBOVUxMKQorCQlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuID0gKG5wLT5vcHQtPm9wdF9mbGVuICsKKwkJCQkJICBucC0+b3B0LT5vcHRfbmZsZW4pOworCisJaW5ldC0+ZHBvcnQgPSB1c2luLT5zaW42X3BvcnQ7CisKKwlkY2NwX3NldF9zdGF0ZShzaywgRENDUF9SRVFVRVNUSU5HKTsKKwllcnIgPSBpbmV0Nl9oYXNoX2Nvbm5lY3QoJmRjY3BfZGVhdGhfcm93LCBzayk7CisJaWYgKGVycikKKwkJZ290byBsYXRlX2ZhaWx1cmU7CisKKwlkcC0+ZGNjcHNfaXNzID0gc2VjdXJlX2RjY3B2Nl9zZXF1ZW5jZV9udW1iZXIobnAtPnNhZGRyLnM2X2FkZHIzMiwKKwkJCQkJCSAgICAgIG5wLT5kYWRkci5zNl9hZGRyMzIsCisJCQkJCQkgICAgICBpbmV0LT5zcG9ydCwgaW5ldC0+ZHBvcnQpOworCWVyciA9IGRjY3BfY29ubmVjdChzayk7CisJaWYgKGVycikKKwkJZ290byBsYXRlX2ZhaWx1cmU7CisKKwlyZXR1cm4gMDsKKworbGF0ZV9mYWlsdXJlOgorCWRjY3Bfc2V0X3N0YXRlKHNrLCBEQ0NQX0NMT1NFRCk7CisJX19za19kc3RfcmVzZXQoc2spOworZmFpbHVyZToKKwlpbmV0LT5kcG9ydCA9IDA7CisJc2stPnNrX3JvdXRlX2NhcHMgPSAwOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2tfYWZfb3BzIGRjY3BfaXB2Nl9hZl9vcHMgPSB7CkBAIC0xMTc5LDYgKzExNDYsMTAgQEAKIAlyZXR1cm4gaW5ldDZfZGVzdHJveV9zb2NrKHNrKTsKIH0KIAorc3RhdGljIHN0cnVjdCB0aW1ld2FpdF9zb2NrX29wcyBkY2NwNl90aW1ld2FpdF9zb2NrX29wcyA9IHsKKwkudHdza19vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgZGNjcDZfdGltZXdhaXRfc29jayksCit9OworCiBzdGF0aWMgc3RydWN0IHByb3RvIGRjY3BfdjZfcHJvdCA9IHsKIAkubmFtZQkJICAgPSAiRENDUHY2IiwKIAkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9taW5pc29ja3MuYyBiL25ldC9kY2NwL21pbmlzb2Nrcy5jCmluZGV4IDkwNDU0MzguLjdiNTJmMmEgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL21pbmlzb2Nrcy5jCisrKyBiL25ldC9kY2NwL21pbmlzb2Nrcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RjY3AuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCkBAIC04Myw4ICs4NCw3IEBACiAJCSAqIHNvY2tldCB1cC4gIFdlJ3ZlIGdvdCBiaWdnZXIgcHJvYmxlbXMgdGhhbgogCQkgKiBub24tZ3JhY2VmdWwgc29ja2V0IGNsb3NpbmdzLgogCQkgKi8KLQkJTElNSVRfTkVUREVCVUcoS0VSTl9JTkZPICJEQ0NQOiB0aW1lIHdhaXQgYnVja2V0ICIKLQkJCQkJICJ0YWJsZSBvdmVyZmxvd1xuIik7CisJCURDQ1BfV0FSTigidGltZSB3YWl0IGJ1Y2tldCB0YWJsZSBvdmVyZmxvd1xuIik7CiAJfQogCiAJZGNjcF9kb25lKHNrKTsKQEAgLTk3LDggKzk3LDggQEAKIAkvKgogCSAqIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKIAkgKgotCSAqIC8vIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0Ci0JICogU2V0IFMgOj0gbmV3IHNvY2tldCBmb3IgdGhpcyBwb3J0IHBhaXIKKwkgKiAgICgqIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0ICopCisJICogICBTZXQgUyA6PSBuZXcgc29ja2V0IGZvciB0aGlzIHBvcnQgcGFpcgogCSAqLwogCXN0cnVjdCBzb2NrICpuZXdzayA9IGluZXRfY3NrX2Nsb25lKHNrLCByZXEsIEdGUF9BVE9NSUMpOwogCkBAIC0xNDcsOSArMTQ3LDkgQEAKIAkJLyoKIAkJICogU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQogCQkgKgotCQkgKglDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llCi0JCSAqCVNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0Ci0JCSAqCUNvb2tpZQorCQkgKiAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llcworCQkgKiAgICBJbml0aWFsaXplIFMuR0FSIDo9IFMuSVNTCisJCSAqICAgIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZXMKIAkJICovCiAKIAkJLyogU2VlIGRjY3BfdjRfY29ubl9yZXF1ZXN0ICovCkBAIC0xOTUsMTUgKzE5NSwxNyBAQAogCiAJLyogQ2hlY2sgZm9yIHJldHJhbnNtaXR0ZWQgUkVRVUVTVCAqLwogCWlmIChkY2NwX2hkcihza2IpLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX1JFUVVFU1QpIHsKLQkJaWYgKGFmdGVyNDgoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAotCQkJICAgIGRjY3BfcnNrKHJlcSktPmRyZXFfaXNyKSkgewotCQkJc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrICpkcmVxID0gZGNjcF9yc2socmVxKTsKKwkJc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrICpkcmVxID0gZGNjcF9yc2socmVxKTsKIAorCQlpZiAoYWZ0ZXI0OChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEsIGRyZXEtPmRyZXFfaXNyKSkgewogCQkJZGNjcF9wcl9kZWJ1ZygiUmV0cmFuc21pdHRlZCBSRVFVRVNUXG4iKTsKLQkJCS8qIFNlbmQgYW5vdGhlciBSRVNQT05TRSBwYWNrZXQgKi8KLQkJCWRjY3Bfc2V0X3NlcW5vKCZkcmVxLT5kcmVxX2lzcywgZHJlcS0+ZHJlcV9pc3MgKyAxKTsKLQkJCWRjY3Bfc2V0X3NlcW5vKCZkcmVxLT5kcmVxX2lzciwKLQkJCQkgICAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxKTsKKwkJCWRyZXEtPmRyZXFfaXNyID0gRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxOworCQkJLyoKKwkJCSAqIFNlbmQgYW5vdGhlciBSRVNQT05TRSBwYWNrZXQKKwkJCSAqIFRvIHByb3RlY3QgYWdhaW5zdCBSZXF1ZXN0IGZsb29kcywgaW5jcmVtZW50IHJldHJhbnMKKwkJCSAqIGNvdW50ZXIgKGJhY2tvZmYsIG1vbml0b3JlZCBieSBkY2NwX3Jlc3BvbnNlX3RpbWVyKS4KKwkJCSAqLworCQkJcmVxLT5yZXRyYW5zKys7CiAJCQlyZXEtPnJza19vcHMtPnJ0eF9zeW5fYWNrKHNrLCByZXEsIE5VTEwpOwogCQl9CiAJCS8qIE5ldHdvcmsgRHVwbGljYXRlLCBkaXNjYXJkIHBhY2tldCAqLwpAQCAtMjQzLDcgKzI0NSw3IEBACiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfcmVzZXRfY29kZSA9IERDQ1BfUkVTRVRfQ09ERV9UT09fQlVTWTsKIGRyb3A6CiAJaWYgKGRjY3BfaGRyKHNrYiktPmRjY3BoX3R5cGUgIT0gRENDUF9QS1RfUkVTRVQpCi0JCXJlcS0+cnNrX29wcy0+c2VuZF9yZXNldChza2IpOworCQlyZXEtPnJza19vcHMtPnNlbmRfcmVzZXQoc2ssIHNrYik7CiAKIAlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHNrLCByZXEsIHByZXYpOwogCWdvdG8gb3V0OwpAQCAtMjgzLDMgKzI4NSwxOSBAQAogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChkY2NwX2NoaWxkX3Byb2Nlc3MpOworCit2b2lkIGRjY3BfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJlcXVlc3Rfc29jayAqcnNrKQoreworCURDQ1BfQlVHKCJEQ0NQLUFDSyBwYWNrZXRzIGFyZSBuZXZlciBzZW50IGluIExJU1RFTi9SRVNQT05EIHN0YXRlIik7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGRjY3BfcmVxc2tfc2VuZF9hY2spOworCit2b2lkIGRjY3BfcmVxc2tfaW5pdChzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW5ldF9yc2socmVxKS0+cm10X3BvcnQgPSBkY2NwX2hkcihza2IpLT5kY2NwaF9zcG9ydDsKKwlpbmV0X3JzayhyZXEpLT5hY2tlZAk9IDA7CisJcmVxLT5yY3Zfd25kCQk9IHN5c2N0bF9kY2NwX2ZlYXRfc2VxdWVuY2Vfd2luZG93OworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3JlcXNrX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3B0aW9ucy5jIGIvbmV0L2RjY3Avb3B0aW9ucy5jCmluZGV4IGZiMGRiMWYuLmYzOThiNDMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL29wdGlvbnMuYworKysgYi9uZXQvZGNjcC9vcHRpb25zLmMKQEAgLTIyLDIzICsyMiwyMyBAQAogI2luY2x1ZGUgImRjY3AuaCIKICNpbmNsdWRlICJmZWF0LmgiCiAKLWludCBkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3cgPSBEQ0NQRl9JTklUSUFMX1NFUVVFTkNFX1dJTkRPVzsKLWludCBkY2NwX2ZlYXRfZGVmYXVsdF9yeF9jY2lkCSAgICAgID0gRENDUEZfSU5JVElBTF9DQ0lEOwotaW50IGRjY3BfZmVhdF9kZWZhdWx0X3R4X2NjaWQJICAgICAgPSBEQ0NQRl9JTklUSUFMX0NDSUQ7Ci1pbnQgZGNjcF9mZWF0X2RlZmF1bHRfYWNrX3JhdGlvCSAgICAgID0gRENDUEZfSU5JVElBTF9BQ0tfUkFUSU87Ci1pbnQgZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9hY2tfdmVjdG9yID0gRENDUEZfSU5JVElBTF9TRU5EX0FDS19WRUNUT1I7Ci1pbnQgZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9uZHBfY291bnQgID0gRENDUEZfSU5JVElBTF9TRU5EX05EUF9DT1VOVDsKK2ludCBzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdyA9IERDQ1BGX0lOSVRJQUxfU0VRVUVOQ0VfV0lORE9XOworaW50IHN5c2N0bF9kY2NwX2ZlYXRfcnhfY2NpZAkgICAgICA9IERDQ1BGX0lOSVRJQUxfQ0NJRDsKK2ludCBzeXNjdGxfZGNjcF9mZWF0X3R4X2NjaWQJICAgICAgPSBEQ0NQRl9JTklUSUFMX0NDSUQ7CitpbnQgc3lzY3RsX2RjY3BfZmVhdF9hY2tfcmF0aW8JICAgICAgPSBEQ0NQRl9JTklUSUFMX0FDS19SQVRJTzsKK2ludCBzeXNjdGxfZGNjcF9mZWF0X3NlbmRfYWNrX3ZlY3RvciA9IERDQ1BGX0lOSVRJQUxfU0VORF9BQ0tfVkVDVE9SOworaW50IHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9uZHBfY291bnQgID0gRENDUEZfSU5JVElBTF9TRU5EX05EUF9DT1VOVDsKIAotRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9mZWF0X2RlZmF1bHRfc2VxdWVuY2Vfd2luZG93KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2N0bF9kY2NwX2ZlYXRfc2VxdWVuY2Vfd2luZG93KTsKIAogdm9pZCBkY2NwX21pbmlzb2NrX2luaXQoc3RydWN0IGRjY3BfbWluaXNvY2sgKmRtc2spCiB7Ci0JZG1zay0+ZGNjcG1zX3NlcXVlbmNlX3dpbmRvdyA9IGRjY3BfZmVhdF9kZWZhdWx0X3NlcXVlbmNlX3dpbmRvdzsKLQlkbXNrLT5kY2NwbXNfcnhfY2NpZAkgICAgID0gZGNjcF9mZWF0X2RlZmF1bHRfcnhfY2NpZDsKLQlkbXNrLT5kY2NwbXNfdHhfY2NpZAkgICAgID0gZGNjcF9mZWF0X2RlZmF1bHRfdHhfY2NpZDsKLQlkbXNrLT5kY2NwbXNfYWNrX3JhdGlvCSAgICAgPSBkY2NwX2ZlYXRfZGVmYXVsdF9hY2tfcmF0aW87Ci0JZG1zay0+ZGNjcG1zX3NlbmRfYWNrX3ZlY3RvciA9IGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfYWNrX3ZlY3RvcjsKLQlkbXNrLT5kY2NwbXNfc2VuZF9uZHBfY291bnQgID0gZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9uZHBfY291bnQ7CisJZG1zay0+ZGNjcG1zX3NlcXVlbmNlX3dpbmRvdyA9IHN5c2N0bF9kY2NwX2ZlYXRfc2VxdWVuY2Vfd2luZG93OworCWRtc2stPmRjY3Btc19yeF9jY2lkCSAgICAgPSBzeXNjdGxfZGNjcF9mZWF0X3J4X2NjaWQ7CisJZG1zay0+ZGNjcG1zX3R4X2NjaWQJICAgICA9IHN5c2N0bF9kY2NwX2ZlYXRfdHhfY2NpZDsKKwlkbXNrLT5kY2NwbXNfYWNrX3JhdGlvCSAgICAgPSBzeXNjdGxfZGNjcF9mZWF0X2Fja19yYXRpbzsKKwlkbXNrLT5kY2NwbXNfc2VuZF9hY2tfdmVjdG9yID0gc3lzY3RsX2RjY3BfZmVhdF9zZW5kX2Fja192ZWN0b3I7CisJZG1zay0+ZGNjcG1zX3NlbmRfbmRwX2NvdW50ICA9IHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9uZHBfY291bnQ7CiB9CiAKIHN0YXRpYyB1MzIgZGNjcF9kZWNvZGVfdmFsdWVfdmFyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJmLCBjb25zdCB1OCBsZW4pCkBAIC02MCwxMiArNjAsOSBAQAogaW50IGRjY3BfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9ERUJVRwotCWNvbnN0IGNoYXIgKmRlYnVnX3ByZWZpeCA9IGRwLT5kY2Nwc19yb2xlID09IERDQ1BfUk9MRV9DTElFTlQgPwotCQkJCQkiQ0xJRU5UIHJ4IG9wdDogIiA6ICJzZXJ2ZXIgcnggb3B0OiAiOwotI2VuZGlmCiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CiAJY29uc3QgdTggcGt0X3R5cGUgPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlOworCXU2NCBhY2tubyA9IERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXE7CiAJdW5zaWduZWQgY2hhciAqb3B0aW9ucyA9ICh1bnNpZ25lZCBjaGFyICopZGggKyBkY2NwX2hkcl9sZW4oc2tiKTsKIAl1bnNpZ25lZCBjaGFyICpvcHRfcHRyID0gb3B0aW9uczsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpvcHRfZW5kID0gKHVuc2lnbmVkIGNoYXIgKilkaCArCkBAIC0xMTksNyArMTE2LDcgQEAKIAkJCQlnb3RvIG91dF9pbnZhbGlkX29wdGlvbjsKIAogCQkJb3B0X3JlY3YtPmRjY3Bvcl9uZHAgPSBkY2NwX2RlY29kZV92YWx1ZV92YXIodmFsdWUsIGxlbik7Ci0JCQlkY2NwX3ByX2RlYnVnKCIlc05EUCBjb3VudD0lZFxuIiwgZGVidWdfcHJlZml4LAorCQkJZGNjcF9wcl9kZWJ1ZygiJXMgcnggb3B0OiBORFAgY291bnQ9JWRcbiIsIGRjY3Bfcm9sZShzayksCiAJCQkJICAgICAgb3B0X3JlY3YtPmRjY3Bvcl9uZHApOwogCQkJYnJlYWs7CiAJCWNhc2UgRENDUE9fQ0hBTkdFX0w6CkBAIC0xNTMsNyArMTUwLDcgQEAKIAkJCQlicmVhazsKIAogCQkJaWYgKGRjY3BfbXNrKHNrKS0+ZGNjcG1zX3NlbmRfYWNrX3ZlY3RvciAmJgotCQkJICAgIGRjY3BfYWNrdmVjX3BhcnNlKHNrLCBza2IsIG9wdCwgdmFsdWUsIGxlbikpCisJCQkgICAgZGNjcF9hY2t2ZWNfcGFyc2Uoc2ssIHNrYiwgJmFja25vLCBvcHQsIHZhbHVlLCBsZW4pKQogCQkJCWdvdG8gb3V0X2ludmFsaWRfb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgRENDUE9fVElNRVNUQU1QOgpAQCAtMTY1LDggKzE2Miw4IEBACiAJCQlkcC0+ZGNjcHNfdGltZXN0YW1wX2VjaG8gPSBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcDsKIAkJCWRjY3BfdGltZXN0YW1wKHNrLCAmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKTsKIAotCQkJZGNjcF9wcl9kZWJ1ZygiJXNUSU1FU1RBTVA9JXUsIGFja25vPSVsbHVcbiIsCi0JCQkJICAgICAgZGVidWdfcHJlZml4LCBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcCwKKwkJCWRjY3BfcHJfZGVidWcoIiVzIHJ4IG9wdDogVElNRVNUQU1QPSV1LCBhY2tubz0lbGx1XG4iLAorCQkJCSAgICAgIGRjY3Bfcm9sZShzayksIG9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wLAogCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCiAJCQkJICAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSk7CiAJCQlicmVhazsKQEAgLTE3Niw4ICsxNzMsOCBAQAogCiAJCQlvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvID0gbnRvaGwoKihfX2JlMzIgKil2YWx1ZSk7CiAKLQkJCWRjY3BfcHJfZGVidWcoIiVzVElNRVNUQU1QX0VDSE89JXUsIGxlbj0lZCwgYWNrbm89JWxsdSwgIiwKLQkJCQkgICAgICBkZWJ1Z19wcmVmaXgsCisJCQlkY2NwX3ByX2RlYnVnKCIlcyByeCBvcHQ6IFRJTUVTVEFNUF9FQ0hPPSV1LCBsZW49JWQsICIKKwkJCQkgICAgICAiYWNrbm89JWxsdSwgIiwgIGRjY3Bfcm9sZShzayksCiAJCQkJICAgICAgb3B0X3JlY3YtPmRjY3Bvcl90aW1lc3RhbXBfZWNobywKIAkJCQkgICAgICBsZW4gKyAyLAogCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCkBAIC0yMTEsOCArMjA4LDggQEAKIAkJCWlmIChlbGFwc2VkX3RpbWUgPiBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSkKIAkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9IGVsYXBzZWRfdGltZTsKIAotCQkJZGNjcF9wcl9kZWJ1ZygiJXNFTEFQU0VEX1RJTUU9JWRcbiIsIGRlYnVnX3ByZWZpeCwKLQkJCQkgICAgICBlbGFwc2VkX3RpbWUpOworCQkJZGNjcF9wcl9kZWJ1ZygiJXMgcnggb3B0OiBFTEFQU0VEX1RJTUU9JWRcbiIsCisJCQkJICAgICAgZGNjcF9yb2xlKHNrKSwgZWxhcHNlZF90aW1lKTsKIAkJCWJyZWFrOwogCQkJLyoKIAkJCSAqIEZyb20gUkZDIDQzNDAsIHNlYy4gMTAuMzoKQEAgLTI0Miw5ICsyMzksOCBAQAogCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByX2luZm8oIkRDQ1AoJXApOiBvcHRpb24gJWQobGVuPSVkKSBub3QgIgotCQkJCSJpbXBsZW1lbnRlZCwgaWdub3JpbmdcbiIsCi0JCQkJc2ssIG9wdCwgbGVuKTsKKwkJCURDQ1BfQ1JJVCgiRENDUCglcCk6IG9wdGlvbiAlZChsZW49JWQpIG5vdCAiCisJCQkJICAiaW1wbGVtZW50ZWQsIGlnbm9yaW5nIiwgc2ssIG9wdCwgbGVuKTsKIAkJCWJyZWFrOwogCSAgICAgICAgfQogCkBAIC0yNjEsNyArMjU3LDcgQEAKIG91dF9pbnZhbGlkX29wdGlvbjoKIAlEQ0NQX0lOQ19TVEFUU19CSChEQ0NQX01JQl9JTlZBTElET1BUKTsKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9yZXNldF9jb2RlID0gRENDUF9SRVNFVF9DT0RFX09QVElPTl9FUlJPUjsKLQlwcl9pbmZvKCJEQ0NQKCVwKTogaW52YWxpZCBvcHRpb24gJWQsIGxlbj0lZFxuIiwgc2ssIG9wdCwgbGVuKTsKKwlEQ0NQX1dBUk4oIkRDQ1AoJXApOiBpbnZhbGlkIG9wdGlvbiAlZCwgbGVuPSVkIiwgc2ssIG9wdCwgbGVuKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQ1MSw4ICs0NDcsNyBAQAogCXU4ICp0bzsKIAogCWlmIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9vcHRfbGVuICsgbGVuICsgMyA+IERDQ1BfTUFYX09QVF9MRU4pIHsKLQkJTElNSVRfTkVUREVCVUcoS0VSTl9JTkZPICJEQ0NQOiBwYWNrZXQgdG9vIHNtYWxsIgotCQkJICAgICAgICIgdG8gaW5zZXJ0IGZlYXR1cmUgJWQgb3B0aW9uIVxuIiwgZmVhdCk7CisJCURDQ1BfV0FSTigicGFja2V0IHRvbyBzbWFsbCBmb3IgZmVhdHVyZSAlZCBvcHRpb24hXG4iLCBmZWF0KTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNDY1LDggKzQ2MCwxMCBAQAogCiAJaWYgKGxlbikKIAkJbWVtY3B5KHRvLCB2YWwsIGxlbik7Ci0JZGNjcF9wcl9kZWJ1Zygib3B0aW9uICVkIGZlYXQgJWQgbGVuICVkXG4iLCB0eXBlLCBmZWF0LCBsZW4pOwogCisJZGNjcF9wcl9kZWJ1ZygiJXMoJXMgKCVkKSwgLi4uKSwgbGVuZ3RoICVkXG4iLAorCQkgICAgICBkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksCisJCSAgICAgIGRjY3BfZmVhdF9uYW1lKGZlYXQpLCBmZWF0LCBsZW4pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9vdXRwdXQuYyBiL25ldC9kY2NwL291dHB1dC5jCmluZGV4IDcxMDJlM2EuLjQwMGMzMGIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL291dHB1dC5jCisrKyBiL25ldC9kY2NwL291dHB1dC5jCkBAIC04OCwxNiArODgsMTUgQEAKIAkJCXJldHVybiAtRVBST1RPOwogCQl9CiAJCQotCQlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBkY2NwX2hlYWRlcl9zaXplKTsKLQkJZGggPSBkY2NwX2hkcihza2IpOwogCiAJCS8qIEJ1aWxkIERDQ1AgaGVhZGVyIGFuZCBjaGVja3N1bSBpdC4gKi8KLQkJbWVtc2V0KGRoLCAwLCBkY2NwX2hlYWRlcl9zaXplKTsKKwkJZGggPSBkY2NwX3plcm9lZF9oZHIoc2tiLCBkY2NwX2hlYWRlcl9zaXplKTsKIAkJZGgtPmRjY3BoX3R5cGUJPSBkY2ItPmRjY3BkX3R5cGU7CiAJCWRoLT5kY2NwaF9zcG9ydAk9IGluZXQtPnNwb3J0OwogCQlkaC0+ZGNjcGhfZHBvcnQJPSBpbmV0LT5kcG9ydDsKIAkJZGgtPmRjY3BoX2RvZmYJPSAoZGNjcF9oZWFkZXJfc2l6ZSArIGRjYi0+ZGNjcGRfb3B0X2xlbikgLyA0OwogCQlkaC0+ZGNjcGhfY2N2YWwJPSBkY2ItPmRjY3BkX2NjdmFsOworCQlkaC0+ZGNjcGhfY3Njb3YgPSBkcC0+ZGNjcHNfcGNzbGVuOwogCQkvKiBYWFggRm9yIG5vdyB3ZSdyZSB1c2luZyBvbmx5IDQ4IGJpdHMgc2VxdWVuY2UgbnVtYmVycyAqLwogCQlkaC0+ZGNjcGhfeAk9IDE7CiAKQEAgLTExNyw3ICsxMTYsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpY3NrLT5pY3NrX2FmX29wcy0+c2VuZF9jaGVjayhzaywgc2tiLT5sZW4sIHNrYik7CisJCWljc2stPmljc2tfYWZfb3BzLT5zZW5kX2NoZWNrKHNrLCAwLCBza2IpOwogCiAJCWlmIChzZXRfYWNrKQogCQkJZGNjcF9ldmVudF9hY2tfc2VudChzayk7CkBAIC0xMjUsMTcgKzEyNCw4IEBACiAJCURDQ1BfSU5DX1NUQVRTKERDQ1BfTUlCX09VVFNFR1MpOwogCiAJCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7Ci0JCWVyciA9IGljc2stPmljc2tfYWZfb3BzLT5xdWV1ZV94bWl0KHNrYiwgMCk7Ci0JCWlmIChlcnIgPD0gMCkKLQkJCXJldHVybiBlcnI7Ci0KLQkJLyogTkVUX1hNSVRfQ04gaXMgc3BlY2lhbC4gSXQgZG9lcyBub3QgZ3VhcmFudGVlLAotCQkgKiB0aGF0IHRoaXMgcGFja2V0IGlzIGxvc3QuIEl0IHRlbGxzIHRoYXQgZGV2aWNlCi0JCSAqIGlzIGFib3V0IHRvIHN0YXJ0IHRvIGRyb3AgcGFja2V0cyBvciBhbHJlYWR5Ci0JCSAqIGRyb3BzIHNvbWUgcGFja2V0cyBvZiB0aGUgc2FtZSBwcmlvcml0eSBhbmQKLQkJICogaW52b2tlcyB1cyB0byBzZW5kIGxlc3MgYWdncmVzc2l2ZWx5LgotCQkgKi8KLQkJcmV0dXJuIGVyciA9PSBORVRfWE1JVF9DTiA/IDAgOiBlcnI7CisJCWVyciA9IGljc2stPmljc2tfYWZfb3BzLT5xdWV1ZV94bWl0KHNrYiwgc2ssIDApOworCQlyZXR1cm4gbmV0X3htaXRfZXZhbChlcnIpOwogCX0KIAlyZXR1cm4gLUVOT0JVRlM7CiB9CkBAIC0yMDUsOCArMTk1LDcgQEAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJZ290byBkb19pbnRlcnJ1cHRlZDsKIAotCQlyYyA9IGNjaWRfaGNfdHhfc2VuZF9wYWNrZXQoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IsCi0JCQkJCSAgICBza2ItPmxlbik7CisJCXJjID0gY2NpZF9oY190eF9zZW5kX3BhY2tldChkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIHNrYik7CiAJCWlmIChyYyA8PSAwKQogCQkJYnJlYWs7CiAJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyhyYyk7CkBAIC0yNTEsMjUgKzI0MCwyMyBAQAogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlsb25nIHRpbWVvID0gMzAwMDA7IAkvKiBJZiBhIHBhY2tldCBpcyB0YWtpbmcgbG9uZ2VyIHRoYW4gMiBzZWNzCi0JCQkJICAgd2UgaGF2ZSBvdGhlciBpc3N1ZXMgKi8KKwlsb25nIHRpbWVvID0gRENDUF9YTUlUX1RJTUVPOyAJLyogSWYgYSBwYWNrZXQgaXMgdGFraW5nIGxvbmdlciB0aGFuCisJCQkJCSAgIHRoaXMgd2UgaGF2ZSBvdGhlciBpc3N1ZXMgKi8KIAogCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpKSB7Ci0JCWludCBlcnIgPSBjY2lkX2hjX3R4X3NlbmRfcGFja2V0KGRwLT5kY2Nwc19oY190eF9jY2lkLCBzaywgc2tiLAotCQkJCQkgc2tiLT5sZW4pOworCQlpbnQgZXJyID0gY2NpZF9oY190eF9zZW5kX3BhY2tldChkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIHNrYik7CiAKIAkJaWYgKGVyciA+IDApIHsKIAkJCWlmICghYmxvY2spIHsKIAkJCQlza19yZXNldF90aW1lcihzaywgJmRwLT5kY2Nwc194bWl0X3RpbWVyLAogCQkJCQkJbXNlY3NfdG9famlmZmllcyhlcnIpK2ppZmZpZXMpOwogCQkJCWJyZWFrOwotCQkJfSBlbHNlCisJCQl9IGVsc2UgewogCQkJCWVyciA9IGRjY3Bfd2FpdF9mb3JfY2NpZChzaywgc2tiLCAmdGltZW8pOwotCQkJaWYgKGVycikgewotCQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOmVyciBhdCBkY2NwX3dhaXRfZm9yX2NjaWQiCi0JCQkJCQkgIiAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOwotCQkJCWR1bXBfc3RhY2soKTsKKwkJCQl0aW1lbyA9IERDQ1BfWE1JVF9USU1FTzsKIAkJCX0KKwkJCWlmIChlcnIpCisJCQkJRENDUF9CVUcoImVycj0lZCBhZnRlciBkY2NwX3dhaXRfZm9yX2NjaWQiLCBlcnIpOwogCQl9CiAKIAkJc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSk7CkBAIC0yOTEsMTIgKzI3OCw5IEBACiAKIAkJCWVyciA9IGRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2IpOwogCQkJY2NpZF9oY190eF9wYWNrZXRfc2VudChkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIDAsIGxlbik7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ZXJyIGZyb20gIgotCQkJCQkgICAgICAgICAiY2NpZF9oY190eF9wYWNrZXRfc2VudCAlZFxuIiwKLQkJCQkJICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIpOwotCQkJCWR1bXBfc3RhY2soKTsKLQkJCX0KKwkJCWlmIChlcnIpCisJCQkJRENDUF9CVUcoImVycj0lZCBhZnRlciBjY2lkX2hjX3R4X3BhY2tldF9zZW50IiwKKwkJCQkJIGVycik7CiAJCX0gZWxzZQogCQkJa2ZyZWUoc2tiKTsKIAl9CkBAIC0zMjksOSArMzEzLDEwIEBACiAJc2tiX3Jlc2VydmUoc2tiLCBzay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CiAKIAlza2ItPmRzdCA9IGRzdF9jbG9uZShkc3QpOwotCXNrYi0+Y3N1bSA9IDA7CiAKIAlkcmVxID0gZGNjcF9yc2socmVxKTsKKwlpZiAoaW5ldF9yc2socmVxKS0+YWNrZWQpCS8qIGluY3JlYXNlIElTUyB1cG9uIHJldHJhbnNtaXNzaW9uICovCisJCWRjY3BfaW5jX3NlcW5vKCZkcmVxLT5kcmVxX2lzcyk7CiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9IERDQ1BfUEtUX1JFU1BPTlNFOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSAgPSBkcmVxLT5kcmVxX2lzczsKIApAQCAtMzQwLDEwICszMjUsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBkY2NwX2hlYWRlcl9zaXplKTsKLQotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQltZW1zZXQoZGgsIDAsIGRjY3BfaGVhZGVyX3NpemUpOworCS8qIEJ1aWxkIGFuZCBjaGVja3N1bSBoZWFkZXIgKi8KKwlkaCA9IGRjY3BfemVyb2VkX2hkcihza2IsIGRjY3BfaGVhZGVyX3NpemUpOwogCiAJZGgtPmRjY3BoX3Nwb3J0CT0gaW5ldF9zayhzayktPnNwb3J0OwogCWRoLT5kY2NwaF9kcG9ydAk9IGluZXRfcnNrKHJlcSktPnJtdF9wb3J0OwpAQCAtMzU1LDYgKzMzOCwxMCBAQAogCWRjY3BfaGRyX3NldF9hY2soZGNjcF9oZHJfYWNrX2JpdHMoc2tiKSwgZHJlcS0+ZHJlcV9pc3IpOwogCWRjY3BfaGRyX3Jlc3BvbnNlKHNrYiktPmRjY3BoX3Jlc3Bfc2VydmljZSA9IGRyZXEtPmRyZXFfc2VydmljZTsKIAorCWRjY3BfY3N1bV9vdXRnb2luZyhza2IpOworCisJLyogV2UgdXNlIGBhY2tlZCcgdG8gcmVtZW1iZXIgdGhhdCBhIFJlc3BvbnNlIHdhcyBhbHJlYWR5IHNlbnQuICovCisJaW5ldF9yc2socmVxKS0+YWNrZWQgPSAxOwogCURDQ1BfSU5DX1NUQVRTKERDQ1BfTUlCX09VVFNFR1MpOwogCXJldHVybiBza2I7CiB9CkBAIC0zNzksNyArMzY2LDYgQEAKIAlza2JfcmVzZXJ2ZShza2IsIHNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKIAogCXNrYi0+ZHN0ID0gZHN0X2Nsb25lKGRzdCk7Ci0Jc2tiLT5jc3VtID0gMDsKIAogCWRjY3BfaW5jX3NlcW5vKCZkcC0+ZGNjcHNfZ3NzKTsKIApAQCAtMzkyLDEwICszNzgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBkY2NwX2hlYWRlcl9zaXplKTsKLQotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQltZW1zZXQoZGgsIDAsIGRjY3BfaGVhZGVyX3NpemUpOworCWRoID0gZGNjcF96ZXJvZWRfaGRyKHNrYiwgZGNjcF9oZWFkZXJfc2l6ZSk7CiAKIAlkaC0+ZGNjcGhfc3BvcnQJPSBpbmV0X3NrKHNrKS0+c3BvcnQ7CiAJZGgtPmRjY3BoX2Rwb3J0CT0gaW5ldF9zayhzayktPmRwb3J0OwpAQCAtNDA3LDcgKzM5MCw3IEBACiAJZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLCBkcC0+ZGNjcHNfZ3NyKTsKIAogCWRjY3BfaGRyX3Jlc2V0KHNrYiktPmRjY3BoX3Jlc2V0X2NvZGUgPSBjb2RlOwotCWluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMtPnNlbmRfY2hlY2soc2ssIHNrYi0+bGVuLCBza2IpOworCWluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMtPnNlbmRfY2hlY2soc2ssIDAsIHNrYik7CiAKIAlEQ0NQX0lOQ19TVEFUUyhEQ0NQX01JQl9PVVRTRUdTKTsKIAlyZXR1cm4gc2tiOwpAQCAtNDI2LDkgKzQwOSw4IEBACiAJCQkJCQkgICAgICBjb2RlKTsKIAkJaWYgKHNrYiAhPSBOVUxMKSB7CiAJCQltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwotCQkJZXJyID0gaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIDApOwotCQkJaWYgKGVyciA9PSBORVRfWE1JVF9DTikKLQkJCQllcnIgPSAwOworCQkJZXJyID0gaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIHNrLCAwKTsKKwkJCXJldHVybiBuZXRfeG1pdF9ldmFsKGVycik7CiAJCX0KIAl9CiAKQEAgLTQ0OSw3ICs0MzEsNiBAQAogCQogCWRjY3Bfc3luY19tc3Moc2ssIGRzdF9tdHUoZHN0KSk7CiAKLQlkY2NwX3VwZGF0ZV9nc3Moc2ssIGRwLT5kY2Nwc19pc3MpOwogIAkvKgogCSAqIFNXTCBhbmQgQVdMIGFyZSBpbml0aWFsbHkgYWRqdXN0ZWQgc28gdGhhdCB0aGV5IGFyZSBub3QgbGVzcyB0aGFuCiAJICogdGhlIGluaXRpYWwgU2VxdWVuY2UgTnVtYmVycyByZWNlaXZlZCBhbmQgc2VudCwgcmVzcGVjdGl2ZWx5OgpAQCAtNDU4LDggKzQzOSwxMyBAQAogCSAqIFRoZXNlIGFkanVzdG1lbnRzIE1VU1QgYmUgYXBwbGllZCBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAJICogY29ubmVjdGlvbi4KICAJICovCisJZGNjcF91cGRhdGVfZ3NzKHNrLCBkcC0+ZGNjcHNfaXNzKTsKIAlkY2NwX3NldF9zZXFubygmZHAtPmRjY3BzX2F3bCwgbWF4NDgoZHAtPmRjY3BzX2F3bCwgZHAtPmRjY3BzX2lzcykpOwogCisJLyogUy5HQVIgLSBncmVhdGVzdCB2YWxpZCBhY2tub3dsZWRnZW1lbnQgbnVtYmVyIHJlY2VpdmVkIG9uIGEgbm9uLVN5bmM7CisJICogICAgICAgICBpbml0aWFsaXplZCB0byBTLklTUyAoc2VjLiA4LjUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJZHAtPmRjY3BzX2dhciA9IGRwLT5kY2Nwc19pc3M7CisKIAlpY3NrLT5pY3NrX3JldHJhbnNtaXRzID0gMDsKIAlpbml0X3RpbWVyKCZkcC0+ZGNjcHNfeG1pdF90aW1lcik7CiAJZHAtPmRjY3BzX3htaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNrOwpAQCAtNDgxLDcgKzQ2Nyw2IEBACiAJc2tiX3Jlc2VydmUoc2tiLCBzay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CiAKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID0gRENDUF9QS1RfUkVRVUVTVDsKLQlza2ItPmNzdW0gPSAwOwogCiAJZGNjcF9za2JfZW50YWlsKHNrLCBza2IpOwogCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSk7CkBAIC01MTMsNyArNDk4LDYgQEAKIAogCQkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwotCQlza2ItPmNzdW0gPSAwOwogCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID0gRENDUF9QS1RfQUNLOwogCQlkY2NwX3RyYW5zbWl0X3NrYihzaywgc2tiKTsKIAl9CkBAIC01NjcsNyArNTUxLDYgQEAKIAogCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMgYW5kIHByZXBhcmUgY29udHJvbCBiaXRzLiAqLwogCXNrYl9yZXNlcnZlKHNrYiwgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwotCXNrYi0+Y3N1bSA9IDA7CiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9IHBrdF90eXBlOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSA9IHNlcTsKIApAQCAtNTkzLDcgKzU3Niw2IEBACiAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzIGFuZCBwcmVwYXJlIGNvbnRyb2wgYml0cy4gKi8KIAlza2JfcmVzZXJ2ZShza2IsIHNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKLQlza2ItPmNzdW0gPSAwOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgPSBkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KIAkJCQkJRENDUF9QS1RfQ0xPU0UgOiBEQ0NQX1BLVF9DTE9TRVJFUTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvYmUuYyBiL25ldC9kY2NwL3Byb2JlLmMKaW5kZXggMTQ2NDk2Zi4uZjgxZTM3ZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvYmUuYworKysgYi9uZXQvZGNjcC9wcm9iZS5jCkBAIC0xMDYsOCArMTA2LDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QganByb2JlIGRjY3Bfc2VuZF9wcm9iZSA9IHsKLQkua3AJPSB7IC5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKSZkY2NwX3NlbmRtc2csIH0sCi0JLmVudHJ5CT0gKGtwcm9iZV9vcGNvZGVfdCAqKSZqZGNjcF9zZW5kbXNnLAorCS5rcAk9IHsKKwkJLnN5bWJvbF9uYW1lID0gImRjY3Bfc2VuZG1zZyIsCisJfSwKKwkuZW50cnkJPSBKUFJPQkVfRU5UUlkoamRjY3Bfc2VuZG1zZyksCiB9OwogCiBzdGF0aWMgaW50IGRjY3Bwcm9iZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMTYwLDYgKzE2Miw4IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGNjcHcud2FpdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRjY3B3LmxvY2spOwogCWRjY3B3LmZpZm8gPSBrZmlmb19hbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMLCAmZGNjcHcubG9jayk7CisJaWYgKElTX0VSUihkY2Nwdy5maWZvKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGNjcHcuZmlmbyk7CiAKIAlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKHByb2NuYW1lLCBTX0lSVVNSLCAmZGNjcHByb2JlX2ZvcHMpKQogCQlnb3RvIGVycjA7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm90by5jIGIvbmV0L2RjY3AvcHJvdG8uYwppbmRleCA3MmNiZGNmLi41ZWM0N2Q5IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm90by5jCisrKyBiL25ldC9kY2NwL3Byb3RvLmMKQEAgLTUyLDYgKzUyLDkgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9oYXNoaW5mbyk7CiAKKy8qIHRoZSBtYXhpbXVtIHF1ZXVlIGxlbmd0aCBmb3IgdHggaW4gcGFja2V0cy4gMCBpcyBubyBsaW1pdCAqLworaW50IHN5c2N0bF9kY2NwX3R4X3FsZW4gX19yZWFkX21vc3RseSA9IDU7CisKIHZvaWQgZGNjcF9zZXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgc3RhdGUpCiB7CiAJY29uc3QgaW50IG9sZHN0YXRlID0gc2stPnNrX3N0YXRlOwpAQCAtMjEyLDYgKzIxNSw3IEBACiAKIAlkY2NwX2luaXRfeG1pdF90aW1lcnMoc2spOwogCWljc2stPmljc2tfcnRvCQk9IERDQ1BfVElNRU9VVF9JTklUOworCWljc2stPmljc2tfc3luX3JldHJpZXMJPSBzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXM7CiAJc2stPnNrX3N0YXRlCQk9IERDQ1BfQ0xPU0VEOwogCXNrLT5za193cml0ZV9zcGFjZQk9IGRjY3Bfd3JpdGVfc3BhY2U7CiAJaWNzay0+aWNza19zeW5jX21zcwk9IGRjY3Bfc3luY19tc3M7CkBAIC0yNjIsMTIgKzI2NiwxMiBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChkY2NwX2Rlc3Ryb3lfc29jayk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRjY3BfbGlzdGVuX3N0YXJ0KHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBpbmxpbmUgaW50IGRjY3BfbGlzdGVuX3N0YXJ0KHN0cnVjdCBzb2NrICpzaywgaW50IGJhY2tsb2cpCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAogCWRwLT5kY2Nwc19yb2xlID0gRENDUF9ST0xFX0xJU1RFTjsKLQlyZXR1cm4gaW5ldF9jc2tfbGlzdGVuX3N0YXJ0KHNrLCBUQ1BfU1lOUV9IU0laRSk7CisJcmV0dXJuIGluZXRfY3NrX2xpc3Rlbl9zdGFydChzaywgYmFja2xvZyk7CiB9CiAKIGludCBkY2NwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpCkBAIC00NTEsOSArNDU1LDggQEAKIHN0YXRpYyBpbnQgZG9fZGNjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcDsKLQlpbnQgZXJyOwotCWludCB2YWw7CisJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKwlpbnQgdmFsLCBlcnIgPSAwOwogCiAJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ2NSwxNCArNDY4LDExIEBACiAJCXJldHVybiBkY2NwX3NldHNvY2tvcHRfc2VydmljZShzaywgdmFsLCBvcHR2YWwsIG9wdGxlbik7CiAKIAlsb2NrX3NvY2soc2spOwotCWRwID0gZGNjcF9zayhzayk7Ci0JZXJyID0gMDsKLQogCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgRENDUF9TT0NLT1BUX1BBQ0tFVF9TSVpFOgotCQlkcC0+ZGNjcHNfcGFja2V0X3NpemUgPSB2YWw7CisJCURDQ1BfV0FSTigic29ja29wdChQQUNLRVRfU0laRSkgaXMgZGVwcmVjYXRlZDogZml4IHlvdXIgYXBwXG4iKTsKKwkJZXJyID0gMDsKIAkJYnJlYWs7Ci0KIAljYXNlIERDQ1BfU09DS09QVF9DSEFOR0VfTDoKIAkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGRjY3Bfc29fZmVhdCkpCiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtNDgxLDcgKzQ4MSw2IEBACiAJCQkJCSAgICAgICAgICAgICAoc3RydWN0IGRjY3Bfc29fZmVhdCBfX3VzZXIgKikKIAkJCQkJCSAgICAgb3B0dmFsKTsKIAkJYnJlYWs7Ci0KIAljYXNlIERDQ1BfU09DS09QVF9DSEFOR0VfUjoKIAkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGRjY3Bfc29fZmVhdCkpCiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtNDkwLDEyICs0ODksMjYgQEAKIAkJCQkJCSAgICAgKHN0cnVjdCBkY2NwX3NvX2ZlYXQgX191c2VyICopCiAJCQkJCQkgICAgIG9wdHZhbCk7CiAJCWJyZWFrOwotCisJY2FzZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVjoJLyogc2VuZGVyIHNpZGUsIFJGQyA0MzQwLCBzZWMuIDkuMiAqLworCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAxNSkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCWRwLT5kY2Nwc19wY3NsZW4gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgRENDUF9TT0NLT1BUX1JFQ1ZfQ1NDT1Y6CS8qIHJlY2VpdmVyIHNpZGUsIFJGQyA0MzQwIHNlYy4gOS4yLjEgKi8KKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMTUpCisJCQllcnIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCWRwLT5kY2Nwc19wY3JsZW4gPSB2YWw7CisJCQkvKiBGSVhNRTogYWRkIGZlYXR1cmUgbmVnb3RpYXRpb24sCisJCQkgKiBDaGFuZ2VMKE1pbmltdW1DaGVja3N1bUNvdmVyYWdlLCB2YWwpICovCisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKIAl9Ci0JCisKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CiB9CkBAIC01NjksMTIgKzU4MiwxNyBAQAogCiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkU6Ci0JCXZhbCA9IGRwLT5kY2Nwc19wYWNrZXRfc2l6ZTsKLQkJbGVuID0gc2l6ZW9mKGRwLT5kY2Nwc19wYWNrZXRfc2l6ZSk7Ci0JCWJyZWFrOworCQlEQ0NQX1dBUk4oInNvY2tvcHQoUEFDS0VUX1NJWkUpIGlzIGRlcHJlY2F0ZWQ6IGZpeCB5b3VyIGFwcFxuIik7CisJCXJldHVybiAwOwogCWNhc2UgRENDUF9TT0NLT1BUX1NFUlZJQ0U6CiAJCXJldHVybiBkY2NwX2dldHNvY2tvcHRfc2VydmljZShzaywgbGVuLAogCQkJCQkgICAgICAgKF9fYmUzMiBfX3VzZXIgKilvcHR2YWwsIG9wdGxlbik7CisJY2FzZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVjoKKwkJdmFsID0gZHAtPmRjY3BzX3Bjc2xlbjsKKwkJYnJlYWs7CisJY2FzZSBEQ0NQX1NPQ0tPUFRfUkVDVl9DU0NPVjoKKwkJdmFsID0gZHAtPmRjY3BzX3BjcmxlbjsKKwkJYnJlYWs7CiAJY2FzZSAxMjggLi4uIDE5MToKIAkJcmV0dXJuIGNjaWRfaGNfcnhfZ2V0c29ja29wdChkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2ssIG9wdG5hbWUsCiAJCQkJCSAgICAgbGVuLCAodTMyIF9fdXNlciAqKW9wdHZhbCwgb3B0bGVuKTsKQEAgLTYzMCw2ICs2NDgsMTMgQEAKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWxvY2tfc29jayhzayk7CisKKwlpZiAoc3lzY3RsX2RjY3BfdHhfcWxlbiAmJgorCSAgICAoc2stPnNrX3dyaXRlX3F1ZXVlLnFsZW4gPj0gc3lzY3RsX2RjY3BfdHhfcWxlbikpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwogCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgbm9ibG9jayk7CiAKIAkvKgpAQCAtNzg4LDcgKzgxMyw3IEBACiAJCSAqIEZJWE1FOiBoZXJlIGl0IHByb2JhYmx5IHNob3VsZCBiZSBzay0+c2tfcHJvdC0+bGlzdGVuX3N0YXJ0CiAJCSAqIHNlZSB0Y3BfbGlzdGVuX3N0YXJ0CiAJCSAqLwotCQllcnIgPSBkY2NwX2xpc3Rlbl9zdGFydChzayk7CisJCWVyciA9IGRjY3BfbGlzdGVuX3N0YXJ0KHNrLCBiYWNrbG9nKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTEwMDgsOCArMTAzMyw3IEBACiAJfSB3aGlsZSAoIWRjY3BfaGFzaGluZm8uZWhhc2ggJiYgLS1laGFzaF9vcmRlciA+IDApOwogCiAJaWYgKCFkY2NwX2hhc2hpbmZvLmVoYXNoKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIkZhaWxlZCB0byBhbGxvY2F0ZSBEQ0NQICIKLQkJCQkgImVzdGFibGlzaGVkIGhhc2ggdGFibGVcbiIpOworCQlEQ0NQX0NSSVQoIkZhaWxlZCB0byBhbGxvY2F0ZSBEQ0NQIGVzdGFibGlzaGVkIGhhc2ggdGFibGUiKTsKIAkJZ290byBvdXRfZnJlZV9iaW5kX2J1Y2tldF9jYWNoZXA7CiAJfQogCkBAIC0xMDMxLDcgKzEwNTUsNyBAQAogCX0gd2hpbGUgKCFkY2NwX2hhc2hpbmZvLmJoYXNoICYmIC0tYmhhc2hfb3JkZXIgPj0gMCk7CiAKIAlpZiAoIWRjY3BfaGFzaGluZm8uYmhhc2gpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiRmFpbGVkIHRvIGFsbG9jYXRlIERDQ1AgYmluZCBoYXNoIHRhYmxlXG4iKTsKKwkJRENDUF9DUklUKCJGYWlsZWQgdG8gYWxsb2NhdGUgRENDUCBiaW5kIGhhc2ggdGFibGUiKTsKIAkJZ290byBvdXRfZnJlZV9kY2NwX2VoYXNoOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avc3lzY3RsLmMgYi9uZXQvZGNjcC9zeXNjdGwuYwppbmRleCAzOGJjMTU3Li5mZGNmY2EzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9zeXNjdGwuYworKysgYi9uZXQvZGNjcC9zeXNjdGwuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlICJkY2NwLmgiCiAjaW5jbHVkZSAiZmVhdC5oIgogCiAjaWZuZGVmIENPTkZJR19TWVNDVEwKQEAgLTE5LDUzICsyMCw3NiBAQAogCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBkY2NwX2RlZmF1bHRfdGFibGVbXSA9IHsKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9EQ0NQX0RFRkFVTFRfU0VRX1dJTkRPVywKIAkJLnByb2NuYW1lCT0gInNlcV93aW5kb3ciLAotCQkuZGF0YQkJPSAmZGNjcF9mZWF0X2RlZmF1bHRfc2VxdWVuY2Vfd2luZG93LAotCQkubWF4bGVuCQk9IHNpemVvZihkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3cpLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfZmVhdF9zZXF1ZW5jZV93aW5kb3csCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX2ZlYXRfc2VxdWVuY2Vfd2luZG93KSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9EQ0NQX0RFRkFVTFRfUlhfQ0NJRCwKIAkJLnByb2NuYW1lCT0gInJ4X2NjaWQiLAotCQkuZGF0YQkJPSAmZGNjcF9mZWF0X2RlZmF1bHRfcnhfY2NpZCwKLQkJLm1heGxlbgkJPSBzaXplb2YoZGNjcF9mZWF0X2RlZmF1bHRfcnhfY2NpZCksCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9mZWF0X3J4X2NjaWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX2ZlYXRfcnhfY2NpZCksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCiAJewotCQkuY3RsX25hbWUJPSBORVRfRENDUF9ERUZBVUxUX1RYX0NDSUQsCiAJCS5wcm9jbmFtZQk9ICJ0eF9jY2lkIiwKLQkJLmRhdGEJCT0gJmRjY3BfZmVhdF9kZWZhdWx0X3R4X2NjaWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGRjY3BfZmVhdF9kZWZhdWx0X3R4X2NjaWQpLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfZmVhdF90eF9jY2lkLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfZGNjcF9mZWF0X3R4X2NjaWQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0RDQ1BfREVGQVVMVF9BQ0tfUkFUSU8sCiAJCS5wcm9jbmFtZQk9ICJhY2tfcmF0aW8iLAotCQkuZGF0YQkJPSAmZGNjcF9mZWF0X2RlZmF1bHRfYWNrX3JhdGlvLAotCQkubWF4bGVuCQk9IHNpemVvZihkY2NwX2ZlYXRfZGVmYXVsdF9hY2tfcmF0aW8pLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfZmVhdF9hY2tfcmF0aW8sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX2ZlYXRfYWNrX3JhdGlvKSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9EQ0NQX0RFRkFVTFRfU0VORF9BQ0tWRUMsCiAJCS5wcm9jbmFtZQk9ICJzZW5kX2Fja3ZlYyIsCi0JCS5kYXRhCQk9ICZkY2NwX2ZlYXRfZGVmYXVsdF9zZW5kX2Fja192ZWN0b3IsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfYWNrX3ZlY3RvciksCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9mZWF0X3NlbmRfYWNrX3ZlY3RvciwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2RjY3BfZmVhdF9zZW5kX2Fja192ZWN0b3IpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0RDQ1BfREVGQVVMVF9TRU5EX05EUCwKIAkJLnByb2NuYW1lCT0gInNlbmRfbmRwIiwKLQkJLmRhdGEJCT0gJmRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfbmRwX2NvdW50LAotCQkubWF4bGVuCQk9IHNpemVvZihkY2NwX2ZlYXRfZGVmYXVsdF9zZW5kX25kcF9jb3VudCksCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9mZWF0X3NlbmRfbmRwX2NvdW50LAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfZGNjcF9mZWF0X3NlbmRfbmRwX2NvdW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJyZXF1ZXN0X3JldHJpZXMiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfcmVxdWVzdF9yZXRyaWVzLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXMpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInJldHJpZXMxIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kY2NwX3JldHJpZXMxLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfZGNjcF9yZXRyaWVzMSksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUJPSAicmV0cmllczIiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfcmV0cmllczIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX3JldHJpZXMyKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJ0eF9xbGVuIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kY2NwX3R4X3FsZW4sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX3R4X3FsZW4pLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKKwl9LAorCiAJeyAuY3RsX25hbWUgPSAwLCB9CiB9OwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC90aW1lci5jIGIvbmV0L2RjY3AvdGltZXIuYwppbmRleCA4NDQ3NzQyLi5lOGY1MTllIDEwMDY0NAotLS0gYS9uZXQvZGNjcC90aW1lci5jCisrKyBiL25ldC9kY2NwL3RpbWVyLmMKQEAgLTE1LDE1ICsxNSwxMCBAQAogCiAjaW5jbHVkZSAiZGNjcC5oIgogCi1zdGF0aWMgdm9pZCBkY2NwX3dyaXRlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBkY2NwX2tlZXBhbGl2ZV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgZGNjcF9kZWxhY2tfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotdm9pZCBkY2NwX2luaXRfeG1pdF90aW1lcnMoc3RydWN0IHNvY2sgKnNrKQotewotCWluZXRfY3NrX2luaXRfeG1pdF90aW1lcnMoc2ssICZkY2NwX3dyaXRlX3RpbWVyLCAmZGNjcF9kZWxhY2tfdGltZXIsCi0JCQkJICAmZGNjcF9rZWVwYWxpdmVfdGltZXIpOwotfQorLyogc3lzY3RsIHZhcmlhYmxlcyBnb3Zlcm5pbmcgbnVtYmVycyBvZiByZXRyYW5zbWlzc2lvbiBhdHRlbXB0cyAqLworaW50ICBzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXMJX19yZWFkX21vc3RseSA9IFRDUF9TWU5fUkVUUklFUzsKK2ludCAgc3lzY3RsX2RjY3BfcmV0cmllczEJCV9fcmVhZF9tb3N0bHkgPSBUQ1BfUkVUUjE7CitpbnQgIHN5c2N0bF9kY2NwX3JldHJpZXMyCQlfX3JlYWRfbW9zdGx5ID0gVENQX1JFVFIyOwogCiBzdGF0aWMgdm9pZCBkY2NwX3dyaXRlX2VycihzdHJ1Y3Qgc29jayAqc2spCiB7CkBAIC00NCwxMSArMzksMTAgQEAKIAlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfUkVRVUVTVElORyB8fCBzay0+c2tfc3RhdGUgPT0gRENDUF9QQVJUT1BFTikgewogCQlpZiAoaWNzay0+aWNza19yZXRyYW5zbWl0cyAhPSAwKQogCQkJZHN0X25lZ2F0aXZlX2FkdmljZSgmc2stPnNrX2RzdF9jYWNoZSk7Ci0JCXJldHJ5X3VudGlsID0gaWNzay0+aWNza19zeW5fcmV0cmllcyA/IDoKLQkJCSAgICAvKiBGSVhNRSEgKi8gMyAvKiBGSVhNRSEgc3lzY3RsX3RjcF9zeW5fcmV0cmllcyAqLzsKKwkJcmV0cnlfdW50aWwgPSBpY3NrLT5pY3NrX3N5bl9yZXRyaWVzID8KKwkJCSAgICA6IHN5c2N0bF9kY2NwX3JlcXVlc3RfcmV0cmllczsKIAl9IGVsc2UgewotCQlpZiAoaWNzay0+aWNza19yZXRyYW5zbWl0cyA+PQotCQkgICAgIC8qIEZJWE1FISBzeXNjdGxfdGNwX3JldHJpZXMxICovIDUgLyogRklYTUUhICovKSB7CisJCWlmIChpY3NrLT5pY3NrX3JldHJhbnNtaXRzID49IHN5c2N0bF9kY2NwX3JldHJpZXMxKSB7CiAJCQkvKiBOT1RFLiBkcmFmdC1pZXRmLXRjcGltcGwtcG10dWQtMDEudHh0IHJlcXVpcmVzIHBtdHUKIAkJCSAgIGJsYWNrIGhvbGUgZGV0ZWN0aW9uLiA6LSgKIApAQCAtNzIsNyArNjYsNyBAQAogCQkJZHN0X25lZ2F0aXZlX2FkdmljZSgmc2stPnNrX2RzdF9jYWNoZSk7CiAJCX0KIAotCQlyZXRyeV91bnRpbCA9IC8qIEZJWE1FISAqLyAxNSAvKiBGSVhNRSEgc3lzY3RsX3RjcF9yZXRyaWVzMiAqLzsKKwkJcmV0cnlfdW50aWwgPSBzeXNjdGxfZGNjcF9yZXRyaWVzMjsKIAkJLyoKIAkJICogRklYTUU6IHNlZSB0Y3Bfd3JpdGVfdGltb3V0IGFuZCB0Y3Bfb3V0X29mX3Jlc291cmNlcwogCQkgKi8KQEAgLTg2LDUzICs4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGNwX2RlbGFja190aW1lciwgc2FucyBwcmVxdWV1ZSAmIG1lbV9yZWNsYWltIHN0dWZmICovCi1zdGF0aWMgdm9pZCBkY2NwX2RlbGFja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopZGF0YTsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7Ci0KLQliaF9sb2NrX3NvY2soc2spOwotCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7Ci0JCS8qIFRyeSBhZ2FpbiBsYXRlci4gKi8KLQkJaWNzay0+aWNza19hY2suYmxvY2tlZCA9IDE7Ci0JCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0RFTEFZRURBQ0tMT0NLRUQpOwotCQlza19yZXNldF90aW1lcihzaywgJmljc2stPmljc2tfZGVsYWNrX3RpbWVyLAotCQkJICAgICAgIGppZmZpZXMgKyBUQ1BfREVMQUNLX01JTik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9DTE9TRUQgfHwKLQkgICAgIShpY3NrLT5pY3NrX2Fjay5wZW5kaW5nICYgSUNTS19BQ0tfVElNRVIpKQotCQlnb3RvIG91dDsKLQlpZiAodGltZV9hZnRlcihpY3NrLT5pY3NrX2Fjay50aW1lb3V0LCBqaWZmaWVzKSkgewotCQlza19yZXNldF90aW1lcihzaywgJmljc2stPmljc2tfZGVsYWNrX3RpbWVyLAotCQkJICAgICAgIGljc2stPmljc2tfYWNrLnRpbWVvdXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpY3NrLT5pY3NrX2Fjay5wZW5kaW5nICY9IH5JQ1NLX0FDS19USU1FUjsKLQotCWlmIChpbmV0X2Nza19hY2tfc2NoZWR1bGVkKHNrKSkgewotCQlpZiAoIWljc2stPmljc2tfYWNrLnBpbmdwb25nKSB7Ci0JCQkvKiBEZWxheWVkIEFDSyBtaXNzZWQ6IGluZmxhdGUgQVRPLiAqLwotCQkJaWNzay0+aWNza19hY2suYXRvID0gbWluKGljc2stPmljc2tfYWNrLmF0byA8PCAxLAotCQkJCQkJIGljc2stPmljc2tfcnRvKTsKLQkJfSBlbHNlIHsKLQkJCS8qIERlbGF5ZWQgQUNLIG1pc3NlZDogbGVhdmUgcGluZ3BvbmcgbW9kZSBhbmQKLQkJCSAqIGRlZmxhdGUgQVRPLgotCQkJICovCi0JCQlpY3NrLT5pY3NrX2Fjay5waW5ncG9uZyA9IDA7Ci0JCQlpY3NrLT5pY3NrX2Fjay5hdG8gPSBUQ1BfQVRPX01JTjsKLQkJfQotCQlkY2NwX3NlbmRfYWNrKHNrKTsKLQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfREVMQVlFREFDS1MpOwotCX0KLW91dDoKLQliaF91bmxvY2tfc29jayhzayk7Ci0Jc29ja19wdXQoc2spOwotfQotCiAvKgogICoJVGhlIERDQ1AgcmV0cmFuc21pdCB0aW1lci4KICAqLwpAQCAtMTQyLDcgKzg5LDcgQEAKIAogCS8qIHJldHJhbnNtaXQgdGltZXIgaXMgdXNlZCBmb3IgZmVhdHVyZSBuZWdvdGlhdGlvbiB0aHJvdWdob3V0CiAJICogY29ubmVjdGlvbi4gIEluIHRoaXMgY2FzZSwgbm8gcGFja2V0IGlzIHJlLXRyYW5zbWl0dGVkLCBidXQgcmF0aGVyIGFuCi0JICogYWNrIGlzIGdlbmVyYXRlZCBhbmQgcGVuZGluZyBjaGFuZ2VzIGFyZSBzcGxhY2VkIGludG8gaXRzIG9wdGlvbnMuCisJICogYWNrIGlzIGdlbmVyYXRlZCBhbmQgcGVuZGluZyBjaGFuZ2VzIGFyZSBwbGFjZWQgaW50byBpdHMgb3B0aW9ucy4KIAkgKi8KIAlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBOVUxMKSB7CiAJCWRjY3BfcHJfZGVidWcoImZlYXQgbmVnb3RpYXRpb24gcmV0cmFuc21pdCB0aW1lb3V0ICVwXG4iLCBzayk7CkBAIC0xNTQsOSArMTAxLDExIEBACiAJLyoKIAkgKiBzay0+c2tfc2VuZF9oZWFkIGhhcyB0byBoYXZlIG9uZSBza2Igd2l0aAogCSAqIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgc2V0IHRvIG9uZSBvZiB0aGUgcmV0cmFuc21pdHRhYmxlIERDQ1AKLQkgKiBwYWNrZXQgdHlwZXMgKFJFUVVFU1QsIFJFU1BPTlNFLCB0aGUgQUNLIGluIHRoZSAzd2F5IGhhbmRzaGFrZQotCSAqIChQQVJUT1BFTiB0aW1lciksIGV0YykuCi0JICovCisJICogcGFja2V0IHR5cGVzLiBUaGUgb25seSBwYWNrZXRzIGVsaWdpYmxlIGZvciByZXRyYW5zbWlzc2lvbiBhcmU6CisJICogCS0tIFJlcXVlc3RzIGluIGNsaWVudC1SRVFVRVNUICBzdGF0ZSAoc2VjLiA4LjEuMSkKKwkgKiAJLS0gQWNrcyAgICAgaW4gY2xpZW50LVBBUlRPUEVOIHN0YXRlIChzZWMuIDguMS41KQorCSAqIAktLSBDbG9zZVJlcSBpbiBzZXJ2ZXItQ0xPU0VSRVEgc3RhdGUgKHNlYy4gOC4zKQorCSAqIAktLSBDbG9zZSAgICBpbiAgIG5vZGUtQ0xPU0lORyAgc3RhdGUgKHNlYy4gOC4zKSAgICAgICAgICAgICAgICAqLwogCUJVR19UUkFQKHNrLT5za19zZW5kX2hlYWQgIT0gTlVMTCk7CiAKIAkvKiAKQEAgLTE5NCw3ICsxNDMsNyBAQAogCWljc2stPmljc2tfcnRvID0gbWluKGljc2stPmljc2tfcnRvIDw8IDEsIERDQ1BfUlRPX01BWCk7CiAJaW5ldF9jc2tfcmVzZXRfeG1pdF90aW1lcihzaywgSUNTS19USU1FX1JFVFJBTlMsIGljc2stPmljc2tfcnRvLAogCQkJCSAgRENDUF9SVE9fTUFYKTsKLQlpZiAoaWNzay0+aWNza19yZXRyYW5zbWl0cyA+IDMgLyogRklYTUU6IHN5c2N0bF9kY2NwX3JldHJpZXMxICovKQorCWlmIChpY3NrLT5pY3NrX3JldHJhbnNtaXRzID4gc3lzY3RsX2RjY3BfcmV0cmllczEpCiAJCV9fc2tfZHN0X3Jlc2V0KHNrKTsKIG91dDo7CiB9CkBAIC0yNjQsMyArMjEzLDU2IEBACiAJYmhfdW5sb2NrX3NvY2soc2spOwogCXNvY2tfcHV0KHNrKTsKIH0KKworLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB0Y3BfZGVsYWNrX3RpbWVyLCBzYW5zIHByZXF1ZXVlICYgbWVtX3JlY2xhaW0gc3R1ZmYgKi8KK3N0YXRpYyB2b2lkIGRjY3BfZGVsYWNrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilkYXRhOworCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKworCWJoX2xvY2tfc29jayhzayk7CisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJLyogVHJ5IGFnYWluIGxhdGVyLiAqLworCQlpY3NrLT5pY3NrX2Fjay5ibG9ja2VkID0gMTsKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfREVMQVlFREFDS0xPQ0tFRCk7CisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIsCisJCQkgICAgICAgamlmZmllcyArIFRDUF9ERUxBQ0tfTUlOKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX0NMT1NFRCB8fAorCSAgICAhKGljc2stPmljc2tfYWNrLnBlbmRpbmcgJiBJQ1NLX0FDS19USU1FUikpCisJCWdvdG8gb3V0OworCWlmICh0aW1lX2FmdGVyKGljc2stPmljc2tfYWNrLnRpbWVvdXQsIGppZmZpZXMpKSB7CisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIsCisJCQkgICAgICAgaWNzay0+aWNza19hY2sudGltZW91dCk7CisJCWdvdG8gb3V0OworCX0KKworCWljc2stPmljc2tfYWNrLnBlbmRpbmcgJj0gfklDU0tfQUNLX1RJTUVSOworCisJaWYgKGluZXRfY3NrX2Fja19zY2hlZHVsZWQoc2spKSB7CisJCWlmICghaWNzay0+aWNza19hY2sucGluZ3BvbmcpIHsKKwkJCS8qIERlbGF5ZWQgQUNLIG1pc3NlZDogaW5mbGF0ZSBBVE8uICovCisJCQlpY3NrLT5pY3NrX2Fjay5hdG8gPSBtaW4oaWNzay0+aWNza19hY2suYXRvIDw8IDEsCisJCQkJCQkgaWNzay0+aWNza19ydG8pOworCQl9IGVsc2UgeworCQkJLyogRGVsYXllZCBBQ0sgbWlzc2VkOiBsZWF2ZSBwaW5ncG9uZyBtb2RlIGFuZAorCQkJICogZGVmbGF0ZSBBVE8uCisJCQkgKi8KKwkJCWljc2stPmljc2tfYWNrLnBpbmdwb25nID0gMDsKKwkJCWljc2stPmljc2tfYWNrLmF0byA9IFRDUF9BVE9fTUlOOworCQl9CisJCWRjY3Bfc2VuZF9hY2soc2spOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9ERUxBWUVEQUNLUyk7CisJfQorb3V0OgorCWJoX3VubG9ja19zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3ZvaWQgZGNjcF9pbml0X3htaXRfdGltZXJzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbmV0X2Nza19pbml0X3htaXRfdGltZXJzKHNrLCAmZGNjcF93cml0ZV90aW1lciwgJmRjY3BfZGVsYWNrX3RpbWVyLAorCQkJCSAgJmRjY3Bfa2VlcGFsaXZlX3RpbWVyKTsKK30KZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvS2NvbmZpZyBiL25ldC9kZWNuZXQvS2NvbmZpZwppbmRleCAzNmU3MmNiLi43OTE0ZmQ2IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L0tjb25maWcKKysrIGIvbmV0L2RlY25ldC9LY29uZmlnCkBAIC00MSwxMSArNDEsMyBAQAogCiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RlY25ldC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi1jb25maWcgREVDTkVUX1JPVVRFX0ZXTUFSSwotCWJvb2wgIkRFQ25ldDogdXNlIEZXTUFSSyB2YWx1ZSBhcyByb3V0aW5nIGtleSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIERFQ05FVF9ST1VURVIgJiYgTkVURklMVEVSCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc3BlY2lmeSBkaWZmZXJlbnQgcm91dGVzIGZvcgotCSAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBGV01BUksgKCJmaXJld2FsbGluZyBtYXJrIikgdmFsdWVzCi0JICAoc2VlIGlwY2hhaW5zKDgpLCAiLW0iIGFyZ3VtZW50KS4KLQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9kZXYuYyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKaW5kZXggMDE4NjFmZS4uMGI5ZDRjOSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9kZXYuYworKysgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00Nyw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2RuLmg+CiAjaW5jbHVkZSA8bmV0L2RuX2Rldi5oPgogI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgpAQCAtNzMsNyArNzMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGRuX2RldiAqZG5fZGV2X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmVycik7CiBzdGF0aWMgdm9pZCBkbl9kZXZfZGVsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgcnRtc2dfaWZhKGludCBldmVudCwgc3RydWN0IGRuX2lmYWRkciAqaWZhKTsKK3N0YXRpYyB2b2lkIGRuX2lmYWRkcl9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpOwogCiBzdGF0aWMgaW50IGRuX2V0aF91cChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIGRuX2V0aF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICopOwpAQCAtMjU1LDEyICsyNTUsMTAgQEAKIAlzdHJ1Y3QgZG5fZGV2X3N5c2N0bF90YWJsZSAqdDsKIAlpbnQgaTsKIAotCXQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCXQgPSBrbWVtZHVwKCZkbl9kZXZfc3lzY3RsLCBzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAodCA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQltZW1jcHkodCwgJmRuX2Rldl9zeXNjdGwsIHNpemVvZigqdCkpOwotCiAJZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0LT5kbl9kZXZfdmFycykgLSAxOyBpKyspIHsKIAkJbG9uZyBvZmZzZXQgPSAobG9uZyl0LT5kbl9kZXZfdmFyc1tpXS5kYXRhOwogCQl0LT5kbl9kZXZfdmFyc1tpXS5kYXRhID0gKChjaGFyICopcGFybXMpICsgb2Zmc2V0OwpAQCAtNDQyLDcgKzQ0MCw3IEBACiAJCX0KIAl9CiAKLQlydG1zZ19pZmEoUlRNX0RFTEFERFIsIGlmYTEpOworCWRuX2lmYWRkcl9ub3RpZnkoUlRNX0RFTEFERFIsIGlmYTEpOwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRuYWRkcl9jaGFpbiwgTkVUREVWX0RPV04sIGlmYTEpOwogCWlmIChkZXN0cm95KSB7CiAJCWRuX2Rldl9mcmVlX2lmYShpZmExKTsKQEAgLTQ3Nyw3ICs0NzUsNyBAQAogCWlmYS0+aWZhX25leHQgPSBkbl9kYi0+aWZhX2xpc3Q7CiAJZG5fZGItPmlmYV9saXN0ID0gaWZhOwogCi0JcnRtc2dfaWZhKFJUTV9ORVdBRERSLCBpZmEpOworCWRuX2lmYWRkcl9ub3RpZnkoUlRNX05FV0FERFIsIGlmYSk7CiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZG5hZGRyX2NoYWluLCBORVRERVZfVVAsIGlmYSk7CiAKIAlyZXR1cm4gMDsKQEAgLTY0Nyw0MSArNjQ1LDYyIEBACiAJcmV0dXJuIGRuX2RldjsKIH0KIAotc3RhdGljIGludCBkbl9kZXZfcnRtX2RlbGFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBkbl9pZmFfcG9saWN5W0lGQV9NQVgrMV0gX19yZWFkX21vc3RseSA9IHsKKwlbSUZBX0FERFJFU1NdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lGQV9MT0NBTF0JCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbSUZBX0xBQkVMXQkJPSB7IC50eXBlID0gTkxBX1NUUklORywKKwkJCQkgICAgLmxlbiA9IElGTkFNU0laIC0gMSB9LAorfTsKKworc3RhdGljIGludCBkbl9ubF9kZWxhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgbmxhdHRyICp0YltJRkFfTUFYKzFdOwogCXN0cnVjdCBkbl9kZXYgKmRuX2RiOwotCXN0cnVjdCBpZmFkZHJtc2cgKmlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm07CiAJc3RydWN0IGRuX2lmYWRkciAqaWZhLCAqKmlmYXA7CisJaW50IGVyciA9IC1FQUREUk5PVEFWQUlMOwogCisJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBzaXplb2YoKmlmbSksIHRiLCBJRkFfTUFYLCBkbl9pZmFfcG9saWN5KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKKwlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaWYgKChkbl9kYiA9IGRuX2Rldl9ieV9pbmRleChpZm0tPmlmYV9pbmRleCkpID09IE5VTEwpCi0JCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwkJZ290byBlcnJvdXQ7CiAKLQlmb3IoaWZhcCA9ICZkbl9kYi0+aWZhX2xpc3Q7IChpZmE9KmlmYXApICE9IE5VTEw7IGlmYXAgPSAmaWZhLT5pZmFfbmV4dCkgewotCQl2b2lkICp0bXAgPSBydGFbSUZBX0xPQ0FMLTFdOwotCQlpZiAoKHRtcCAmJiBtZW1jbXAoUlRBX0RBVEEodG1wKSwgJmlmYS0+aWZhX2xvY2FsLCAyKSkgfHwKLQkJICAgIChydGFbSUZBX0xBQkVMLTFdICYmIHJ0YXR0cl9zdHJjbXAocnRhW0lGQV9MQUJFTC0xXSwgaWZhLT5pZmFfbGFiZWwpKSkKKwlmb3IgKGlmYXAgPSAmZG5fZGItPmlmYV9saXN0OyAoaWZhID0gKmlmYXApOyBpZmFwID0gJmlmYS0+aWZhX25leHQpIHsKKwkJaWYgKHRiW0lGQV9MT0NBTF0gJiYKKwkJICAgIG5sYV9tZW1jbXAodGJbSUZBX0xPQ0FMXSwgJmlmYS0+aWZhX2xvY2FsLCAyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0YltJRkFfTEFCRUxdICYmIG5sYV9zdHJjbXAodGJbSUZBX0xBQkVMXSwgaWZhLT5pZmFfbGFiZWwpKQogCQkJY29udGludWU7CiAKIAkJZG5fZGV2X2RlbF9pZmEoZG5fZGIsIGlmYXAsIDEpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkbl9kZXZfcnRtX25ld2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgZG5fbmxfbmV3YWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IG5sYXR0ciAqdGJbSUZBX01BWCsxXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBkbl9kZXYgKmRuX2RiOwotCXN0cnVjdCBpZmFkZHJtc2cgKmlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm07CiAJc3RydWN0IGRuX2lmYWRkciAqaWZhOwotCWludCBydjsKKwlpbnQgZXJyOwogCi0JaWYgKHJ0YVtJRkFfTE9DQUwtMV0gPT0gTlVMTCkKKwllcnIgPSBubG1zZ19wYXJzZShubGgsIHNpemVvZigqaWZtKSwgdGIsIElGQV9NQVgsIGRuX2lmYV9wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHRiW0lGQV9MT0NBTF0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoaWZtLT5pZmFfaW5kZXgpKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNjk1LDY5ICs3MTQsNzcgQEAKIAlpZiAoKGlmYSA9IGRuX2Rldl9hbGxvY19pZmEoKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JaWYgKCFydGFbSUZBX0FERFJFU1MgLSAxXSkKLQkJcnRhW0lGQV9BRERSRVNTIC0gMV0gPSBydGFbSUZBX0xPQ0FMIC0gMV07Ci0JbWVtY3B5KCZpZmEtPmlmYV9sb2NhbCwgUlRBX0RBVEEocnRhW0lGQV9MT0NBTC0xXSksIDIpOwotCW1lbWNweSgmaWZhLT5pZmFfYWRkcmVzcywgUlRBX0RBVEEocnRhW0lGQV9BRERSRVNTLTFdKSwgMik7CisJaWYgKHRiW0lGQV9BRERSRVNTXSA9PSBOVUxMKQorCQl0YltJRkFfQUREUkVTU10gPSB0YltJRkFfTE9DQUxdOworCisJaWZhLT5pZmFfbG9jYWwgPSBubGFfZ2V0X2xlMTYodGJbSUZBX0xPQ0FMXSk7CisJaWZhLT5pZmFfYWRkcmVzcyA9IG5sYV9nZXRfbGUxNih0YltJRkFfQUREUkVTU10pOwogCWlmYS0+aWZhX2ZsYWdzID0gaWZtLT5pZmFfZmxhZ3M7CiAJaWZhLT5pZmFfc2NvcGUgPSBpZm0tPmlmYV9zY29wZTsKIAlpZmEtPmlmYV9kZXYgPSBkbl9kYjsKLQlpZiAocnRhW0lGQV9MQUJFTC0xXSkKLQkJcnRhdHRyX3N0cmxjcHkoaWZhLT5pZmFfbGFiZWwsIHJ0YVtJRkFfTEFCRUwtMV0sIElGTkFNU0laKTsKKworCWlmICh0YltJRkFfTEFCRUxdKQorCQlubGFfc3RybGNweShpZmEtPmlmYV9sYWJlbCwgdGJbSUZBX0xBQkVMXSwgSUZOQU1TSVopOwogCWVsc2UKIAkJbWVtY3B5KGlmYS0+aWZhX2xhYmVsLCBkZXYtPm5hbWUsIElGTkFNU0laKTsKIAotCXJ2ID0gZG5fZGV2X2luc2VydF9pZmEoZG5fZGIsIGlmYSk7Ci0JaWYgKHJ2KQorCWVyciA9IGRuX2Rldl9pbnNlcnRfaWZhKGRuX2RiLCBpZmEpOworCWlmIChlcnIpCiAJCWRuX2Rldl9mcmVlX2lmYShpZmEpOwotCXJldHVybiBydjsKKworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZG5fZGV2X2ZpbGxfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSwKLQkJCQl1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGRuX2lmYWRkcl9ubG1zZ19zaXplKHZvaWQpCit7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShJRk5BTVNJWikgLyogSUZBX0xBQkVMICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMikgLyogSUZBX0FERFJFU1MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgyKTsgLyogSUZBX0xPQ0FMICovCit9CisKK3N0YXRpYyBpbnQgZG5fbmxfZmlsbF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRuX2lmYWRkciAqaWZhLAorCQkJICAgICB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgaWZhZGRybXNnICppZm07CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKIAotCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCppZm0pLCBmbGFncyk7Ci0JaWZtID0gTkxNU0dfREFUQShubGgpOworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCppZm0pLCBmbGFncyk7CisJaWYgKG5saCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CiAKKwlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaWZtLT5pZmFfZmFtaWx5ID0gQUZfREVDbmV0OwogCWlmbS0+aWZhX3ByZWZpeGxlbiA9IDE2OwogCWlmbS0+aWZhX2ZsYWdzID0gaWZhLT5pZmFfZmxhZ3MgfCBJRkFfRl9QRVJNQU5FTlQ7CiAJaWZtLT5pZmFfc2NvcGUgPSBpZmEtPmlmYV9zY29wZTsKIAlpZm0tPmlmYV9pbmRleCA9IGlmYS0+aWZhX2Rldi0+ZGV2LT5pZmluZGV4OwotCWlmIChpZmEtPmlmYV9hZGRyZXNzKQotCQlSVEFfUFVUKHNrYiwgSUZBX0FERFJFU1MsIDIsICZpZmEtPmlmYV9hZGRyZXNzKTsKLQlpZiAoaWZhLT5pZmFfbG9jYWwpCi0JCVJUQV9QVVQoc2tiLCBJRkFfTE9DQUwsIDIsICZpZmEtPmlmYV9sb2NhbCk7Ci0JaWYgKGlmYS0+aWZhX2xhYmVsWzBdKQotCQlSVEFfUFVUKHNrYiwgSUZBX0xBQkVMLCBJRk5BTVNJWiwgJmlmYS0+aWZhX2xhYmVsKTsKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7Ci0JcmV0dXJuIHNrYi0+bGVuOwogCi1ubG1zZ19mYWlsdXJlOgotcnRhdHRyX2ZhaWx1cmU6Ci0gICAgICAgIHNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7Ci0gICAgICAgIHJldHVybiAtMTsKKwlpZiAoaWZhLT5pZmFfYWRkcmVzcykKKwkJTkxBX1BVVF9MRTE2KHNrYiwgSUZBX0FERFJFU1MsIGlmYS0+aWZhX2FkZHJlc3MpOworCWlmIChpZmEtPmlmYV9sb2NhbCkKKwkJTkxBX1BVVF9MRTE2KHNrYiwgSUZBX0xPQ0FMLCBpZmEtPmlmYV9sb2NhbCk7CisJaWYgKGlmYS0+aWZhX2xhYmVsWzBdKQorCQlOTEFfUFVUX1NUUklORyhza2IsIElGQV9MQUJFTCwgaWZhLT5pZmFfbGFiZWwpOworCisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKIH0KIAotc3RhdGljIHZvaWQgcnRtc2dfaWZhKGludCBldmVudCwgc3RydWN0IGRuX2lmYWRkciAqaWZhKQorc3RhdGljIHZvaWQgZG5faWZhZGRyX25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBwYXlsb2FkID0gc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpICsgMTI4OwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAotCXNrYiA9IGFsbG9jX3NrYihubG1zZ190b3RhbF9zaXplKHBheWxvYWQpLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBhbGxvY19za2IoZG5faWZhZGRyX25sbXNnX3NpemUoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAotCWVyciA9IGRuX2Rldl9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJZXJyID0gZG5fbmxfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIDAsIDAsIGV2ZW50LCAwKTsKKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGRuX2lmYWRkcl9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfREVDbmV0X0lGQUREUiwgTlVMTCwgR0ZQX0tFUk5FTCk7CiBlcnJvdXQ6CkBAIC03NjUsMzkgKzc5Miw0MyBAQAogCQlydG5sX3NldF9za19lcnIoUlROTEdSUF9ERUNuZXRfSUZBRERSLCBlcnIpOwogfQogCi1zdGF0aWMgaW50IGRuX2Rldl9kdW1wX2lmYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IGRuX25sX2R1bXBfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKLQlpbnQgaWR4LCBkbl9pZHg7Ci0JaW50IHNfaWR4LCBzX2RuX2lkeDsKKwlpbnQgaWR4LCBkbl9pZHggPSAwLCBza2lwX25kZXZzLCBza2lwX25hZGRyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGRuX2RldiAqZG5fZGI7CiAJc3RydWN0IGRuX2lmYWRkciAqaWZhOwogCi0Jc19pZHggPSBjYi0+YXJnc1swXTsKLQlzX2RuX2lkeCA9IGRuX2lkeCA9IGNiLT5hcmdzWzFdOworCXNraXBfbmRldnMgPSBjYi0+YXJnc1swXTsKKwlza2lwX25hZGRyID0gY2ItPmFyZ3NbMV07CisKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwotCWZvcihkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7Ci0JCWlmIChpZHggPCBzX2lkeCkKKwlmb3IgKGRldiA9IGRldl9iYXNlLCBpZHggPSAwOyBkZXY7IGRldiA9IGRldi0+bmV4dCwgaWR4KyspIHsKKwkJaWYgKGlkeCA8IHNraXBfbmRldnMpCiAJCQljb250aW51ZTsKLQkJaWYgKGlkeCA+IHNfaWR4KQotCQkJc19kbl9pZHggPSAwOworCQllbHNlIGlmIChpZHggPiBza2lwX25kZXZzKSB7CisJCQkvKiBPbmx5IHNraXAgb3ZlciBhZGRyZXNzZXMgZm9yIGZpcnN0IGRldiBkdW1wZWQKKwkJCSAqIGluIHRoaXMgaXRlcmF0aW9uIChpZHggPT0gc2tpcF9uZGV2cykgKi8KKwkJCXNraXBfbmFkZHIgPSAwOworCQl9CisKIAkJaWYgKChkbl9kYiA9IGRldi0+ZG5fcHRyKSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJZm9yKGlmYSA9IGRuX2RiLT5pZmFfbGlzdCwgZG5faWR4ID0gMDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0LCBkbl9pZHgrKykgewotCQkJaWYgKGRuX2lkeCA8IHNfZG5faWR4KQorCQlmb3IgKGlmYSA9IGRuX2RiLT5pZmFfbGlzdCwgZG5faWR4ID0gMDsgaWZhOworCQkgICAgIGlmYSA9IGlmYS0+aWZhX25leHQsIGRuX2lkeCsrKSB7CisJCQlpZiAoZG5faWR4IDwgc2tpcF9uYWRkcikKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKGRuX2Rldl9maWxsX2lmYWRkcihza2IsIGlmYSwKLQkJCQkJICAgICAgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAotCQkJCQkgICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgICAgUlRNX05FV0FERFIsCi0JCQkJCSAgICAgICBOTE1fRl9NVUxUSSkgPD0gMCkKKwkJCWlmIChkbl9ubF9maWxsX2lmYWRkcihza2IsIGlmYSwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCQkJCSAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV0FERFIsCisJCQkJCSAgICAgIE5MTV9GX01VTFRJKSA8IDApCiAJCQkJZ290byBkb25lOwogCQl9CiAJfQogZG9uZToKIAlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisKIAljYi0+YXJnc1swXSA9IGlkeDsKIAljYi0+YXJnc1sxXSA9IGRuX2lkeDsKIApAQCAtMTQxNCw5ICsxNDQ1LDkgQEAKIAogc3RhdGljIHN0cnVjdCBydG5ldGxpbmtfbGluayBkbmV0X3J0bmV0bGlua190YWJsZVtSVE1fTlJfTVNHVFlQRVNdID0KIHsKLQlbUlRNX05FV0FERFIgIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX2Rldl9ydG1fbmV3YWRkciwJfSwKLQlbUlRNX0RFTEFERFIgIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX2Rldl9ydG1fZGVsYWRkciwJfSwKLQlbUlRNX0dFVEFERFIgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gZG5fZGV2X2R1bXBfaWZhZGRyLAl9LAorCVtSVE1fTkVXQUREUiAgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fbmxfbmV3YWRkciwJfSwKKwlbUlRNX0RFTEFERFIgIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX25sX2RlbGFkZHIsCX0sCisJW1JUTV9HRVRBRERSICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGRuX25sX2R1bXBfaWZhZGRyLAl9LAogI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVSCiAJW1JUTV9ORVdST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9maWJfcnRtX25ld3JvdXRlLAl9LAogCVtSVE1fREVMUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fZmliX3J0bV9kZWxyb3V0ZSwJfSwKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbmVpZ2guYyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwppbmRleCBmZjBlYmU5Li43MzIyYmIzIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25laWdoLmMKKysrIGIvbmV0L2RlY25ldC9kbl9uZWlnaC5jCkBAIC01OTEsNyArNTkxLDYgQEAKIAogCXNlcSAgICAgICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzZXEtPnByaXZhdGUgPSBzOwotCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKIG91dDoKIAlyZXR1cm4gcmM7CiBvdXRfa2ZyZWU6CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9pbi5jIGIvbmV0L2RlY25ldC9kbl9uc3BfaW4uYwppbmRleCA3NjgzZDRmLi4zOWE2Y2Y3IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKQEAgLTgwNCw3ICs4MDQsNyBAQAogCQkJCWdvdG8gZnJlZV9vdXQ7CiAJCX0KIAotCQlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2ssIHNrYik7CisJCXJldHVybiBza19yZWNlaXZlX3NrYihzaywgc2tiLCAwKTsKIAl9CiAKIAlyZXR1cm4gZG5fbnNwX25vX3NvY2tldChza2IsIHJlYXNvbik7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKaW5kZXggMjM0ODlmNy4uOTg4MTkzMyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtMjY5LDkgKzI2OSw3IEBACiB7CiAJcmV0dXJuICgoZmwxLT5ubF91LmRuX3UuZGFkZHIgXiBmbDItPm5sX3UuZG5fdS5kYWRkcikgfAogCQkoZmwxLT5ubF91LmRuX3Uuc2FkZHIgXiBmbDItPm5sX3UuZG5fdS5zYWRkcikgfAotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JCShmbDEtPm5sX3UuZG5fdS5md21hcmsgXiBmbDItPm5sX3UuZG5fdS5md21hcmspIHwKLSNlbmRpZgorCQkoZmwxLT5tYXJrIF4gZmwyLT5tYXJrKSB8CiAJCShmbDEtPm5sX3UuZG5fdS5zY29wZSBeIGZsMi0+bmxfdS5kbl91LnNjb3BlKSB8CiAJCShmbDEtPm9pZiBeIGZsMi0+b2lmKSB8CiAJCShmbDEtPmlpZiBeIGZsMi0+aWlmKSkgPT0gMDsKQEAgLTg4MiwxMCArODgwLDggQEAKIAkJCQkgICAgICB7IC5kYWRkciA9IG9sZGZscC0+ZmxkX2RzdCwKIAkJCQkJLnNhZGRyID0gb2xkZmxwLT5mbGRfc3JjLAogCQkJCQkuc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRSwKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCQkJCQkuZndtYXJrID0gb2xkZmxwLT5mbGRfZndtYXJrCi0jZW5kaWYKIAkJCQkgICAgIH0gfSwKKwkJCSAgICAubWFyayA9IG9sZGZscC0+bWFyaywKIAkJCSAgICAuaWlmID0gbG9vcGJhY2tfZGV2LmlmaW5kZXgsCiAJCQkgICAgLm9pZiA9IG9sZGZscC0+b2lmIH07CiAJc3RydWN0IGRuX3JvdXRlICpydCA9IE5VTEw7CkBAIC05MDMsNyArODk5LDcgQEAKIAkJICAgICAgICJkbl9yb3V0ZV9vdXRwdXRfc2xvdzogZHN0PSUwNHggc3JjPSUwNHggbWFyaz0lZCIKIAkJICAgICAgICIgaWlmPSVkIG9pZj0lZFxuIiwgZG5fbnRvaHMob2xkZmxwLT5mbGRfZHN0KSwKIAkJICAgICAgIGRuX250b2hzKG9sZGZscC0+ZmxkX3NyYyksCi0gICAgICAgICAgICAgICAgICAgICAgIG9sZGZscC0+ZmxkX2Z3bWFyaywgbG9vcGJhY2tfZGV2LmlmaW5kZXgsIG9sZGZscC0+b2lmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgb2xkZmxwLT5tYXJrLCBsb29wYmFja19kZXYuaWZpbmRleCwgb2xkZmxwLT5vaWYpOwogCiAJLyogSWYgd2UgaGF2ZSBhbiBvdXRwdXQgaW50ZXJmYWNlLCB2ZXJpZnkgaXRzIGEgREVDbmV0IGRldmljZSAqLwogCWlmIChvbGRmbHAtPm9pZikgewpAQCAtMTEwOCw5ICsxMTA0LDcgQEAKIAlydC0+ZmwuZmxkX2RzdCAgICA9IG9sZGZscC0+ZmxkX2RzdDsKIAlydC0+Zmwub2lmICAgICAgICA9IG9sZGZscC0+b2lmOwogCXJ0LT5mbC5paWYgICAgICAgID0gMDsKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCXJ0LT5mbC5mbGRfZndtYXJrID0gb2xkZmxwLT5mbGRfZndtYXJrOwotI2VuZGlmCisJcnQtPmZsLm1hcmsgICAgICAgPSBvbGRmbHAtPm1hcms7CiAKIAlydC0+cnRfc2FkZHIgICAgICA9IGZsLmZsZF9zcmM7CiAJcnQtPnJ0X2RhZGRyICAgICAgPSBmbC5mbGRfZHN0OwpAQCAtMTE3OCw5ICsxMTcyLDcgQEAKIAkJCXJ0ID0gcmN1X2RlcmVmZXJlbmNlKHJ0LT51LnJ0X25leHQpKSB7CiAJCQlpZiAoKGZscC0+ZmxkX2RzdCA9PSBydC0+ZmwuZmxkX2RzdCkgJiYKIAkJCSAgICAoZmxwLT5mbGRfc3JjID09IHJ0LT5mbC5mbGRfc3JjKSAmJgotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JCQkgICAgKGZscC0+ZmxkX2Z3bWFyayA9PSBydC0+ZmwuZmxkX2Z3bWFyaykgJiYKLSNlbmRpZgorCQkJICAgIChmbHAtPm1hcmsgPT0gcnQtPmZsLm1hcmspICYmCiAJCQkgICAgKHJ0LT5mbC5paWYgPT0gMCkgJiYKIAkJCSAgICAocnQtPmZsLm9pZiA9PSBmbHAtPm9pZikpIHsKIAkJCQlydC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7CkBAIC0xMjM1LDEwICsxMjI3LDggQEAKIAkJCQkgICAgIHsgLmRhZGRyID0gY2ItPmRzdCwKIAkJCQkgICAgICAgLnNhZGRyID0gY2ItPnNyYywKIAkJCQkgICAgICAgLnNjb3BlID0gUlRfU0NPUEVfVU5JVkVSU0UsCi0jaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKLQkJCQkgICAgICAgLmZ3bWFyayA9IHNrYi0+bmZtYXJrCi0jZW5kaWYKIAkJCQkgICAgfSB9LAorCQkJICAgIC5tYXJrID0gc2tiLT5tYXJrLAogCQkJICAgIC5paWYgPSBza2ItPmRldi0+aWZpbmRleCB9OwogCXN0cnVjdCBkbl9maWJfcmVzIHJlcyA9IHsgLmZpID0gTlVMTCwgLnR5cGUgPSBSVE5fVU5SRUFDSEFCTEUgfTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKQEAgLTEzODUsNyArMTM3NSw3IEBACiAJcnQtPmZsLmZsZF9kc3QgICAgPSBjYi0+ZHN0OwogCXJ0LT5mbC5vaWYgICAgICAgID0gMDsKIAlydC0+ZmwuaWlmICAgICAgICA9IGluX2Rldi0+aWZpbmRleDsKLQlydC0+ZmwuZmxkX2Z3bWFyayA9IGZsLmZsZF9md21hcms7CisJcnQtPmZsLm1hcmsgICAgICAgPSBmbC5tYXJrOwogCiAJcnQtPnUuZHN0LmZsYWdzID0gRFNUX0hPU1Q7CiAJcnQtPnUuZHN0Lm5laWdoYm91ciA9IG5laWdoOwpAQCAtMTQ1Nyw5ICsxNDQ3LDcgQEAKIAkJaWYgKChydC0+ZmwuZmxkX3NyYyA9PSBjYi0+c3JjKSAmJgogCSAJICAgIChydC0+ZmwuZmxkX2RzdCA9PSBjYi0+ZHN0KSAmJgogCQkgICAgKHJ0LT5mbC5vaWYgPT0gMCkgJiYKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCQkgICAgKHJ0LT5mbC5mbGRfZndtYXJrID09IHNrYi0+bmZtYXJrKSAmJgotI2VuZGlmCisJCSAgICAocnQtPmZsLm1hcmsgPT0gc2tiLT5tYXJrKSAmJgogCQkgICAgKHJ0LT5mbC5paWYgPT0gY2ItPmlpZikpIHsKIAkJCXJ0LT51LmRzdC5sYXN0dXNlID0gamlmZmllczsKIAkJCWRzdF9ob2xkKCZydC0+dS5kc3QpOwpAQCAtMTQ4MSw3ICsxNDY5LDcgQEAKIAlzdHJ1Y3QgcnRtc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKLQlzdHJ1Y3QgcnRhX2NhY2hlaW5mbyBjaTsKKwlsb25nIGV4cGlyZXM7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKIAlyID0gTkxNU0dfREFUQShubGgpOwpAQCAtMTUxNCwxNiArMTUwMiwxMCBAQAogCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDIsICZydC0+cnRfZ2F0ZXdheSk7CiAJaWYgKHJ0bmV0bGlua19wdXRfbWV0cmljcyhza2IsIHJ0LT51LmRzdC5tZXRyaWNzKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JY2kucnRhX2xhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHJ0LT51LmRzdC5sYXN0dXNlKTsKLQljaS5ydGFfdXNlZCAgICAgPSBydC0+dS5kc3QuX191c2U7Ci0JY2kucnRhX2NsbnRyZWYgID0gYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCk7Ci0JaWYgKHJ0LT51LmRzdC5leHBpcmVzKQotCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChydC0+dS5kc3QuZXhwaXJlcyAtIGppZmZpZXMpOwotCWVsc2UKLQkJY2kucnRhX2V4cGlyZXMgPSAwOwotCWNpLnJ0YV9lcnJvciAgICA9IHJ0LT51LmRzdC5lcnJvcjsKLQljaS5ydGFfaWQgICAgICAgPSBjaS5ydGFfdHMgPSBjaS5ydGFfdHNhZ2UgPSAwOwotCVJUQV9QVVQoc2tiLCBSVEFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCWV4cGlyZXMgPSBydC0+dS5kc3QuZXhwaXJlcyA/IHJ0LT51LmRzdC5leHBpcmVzIC0gamlmZmllcyA6IDA7CisJaWYgKHJ0bmxfcHV0X2NhY2hlaW5mbyhza2IsICZydC0+dS5kc3QsIDAsIDAsIDAsIGV4cGlyZXMsCisJCQkgICAgICAgcnQtPnUuZHN0LmVycm9yKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAJaWYgKHJ0LT5mbC5paWYpCiAJCVJUQV9QVVQoc2tiLCBSVEFfSUlGLCBzaXplb2YoaW50KSwgJnJ0LT5mbC5paWYpOwogCkBAIC0xNjA0LDggKzE1ODYsNiBAQAogCWlmIChydG0tPnJ0bV9mbGFncyAmIFJUTV9GX05PVElGWSkKIAkJcnQtPnJ0X2ZsYWdzIHw9IFJUQ0ZfTk9USUZZOwogCi0JTkVUTElOS19DQihza2IpLmRzdF9waWQgPSBORVRMSU5LX0NCKGluX3NrYikucGlkOwotCiAJZXJyID0gZG5fcnRfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdST1VURSwgMCwgMCk7CiAKIAlpZiAoZXJyID09IDApCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3J1bGVzLmMgYi9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKaW5kZXggNTkwZTBhNy4uZTMyZDBjMyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9ydWxlcy5jCisrKyBiL25ldC9kZWNuZXQvZG5fcnVsZXMuYwpAQCAtNDUsMTAgKzQ1LDYgQEAKIAlfX2xlMTYJCQlkc3RtYXNrOwogCV9fbGUxNgkJCXNyY21hcDsKIAl1OAkJCWZsYWdzOwotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JdTMyCQkJZndtYXJrOwotCXUzMgkJCWZ3bWFzazsKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBkbl9maWJfcnVsZSBkZWZhdWx0X3J1bGUgPSB7CkBAIC0xMTIsMTMgKzEwOCw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBkbl9maWJfcnVsZV9wb2xpY3lbRlJBX01BWCsxXSBfX3JlYWRfbW9zdGx5ID0gewotCVtGUkFfSUZOQU1FXQk9IHsgLnR5cGUgPSBOTEFfU1RSSU5HLCAubGVuID0gSUZOQU1TSVogLSAxIH0sCi0JW0ZSQV9QUklPUklUWV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCUZSQV9HRU5FUklDX1BPTElDWSwKIAlbRlJBX1NSQ10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtGUkFfRFNUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCi0JW0ZSQV9GV01BUktdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbRlJBX0ZXTUFTS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtGUkFfVEFCTEVdICAgICA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiBzdGF0aWMgaW50IGRuX2ZpYl9ydWxlX21hdGNoKHN0cnVjdCBmaWJfcnVsZSAqcnVsZSwgc3RydWN0IGZsb3dpICpmbCwgaW50IGZsYWdzKQpAQCAtMTMxLDExICsxMjMsNiBAQAogCSAgICAoKGRhZGRyIF4gci0+ZHN0KSAmIHItPmRzdG1hc2spKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JaWYgKChyLT5md21hcmsgXiBmbC0+ZmxkX2Z3bWFyaykgJiByLT5md21hc2spCi0JCXJldHVybiAwOwotI2VuZGlmCi0KIAlyZXR1cm4gMTsKIH0KIApAQCAtMTY5LDIwICsxNTYsNiBAQAogCWlmICh0YltGUkFfRFNUXSkKIAkJci0+ZHN0ID0gbmxhX2dldF91MTYodGJbRlJBX0RTVF0pOwogCi0jaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKLQlpZiAodGJbRlJBX0ZXTUFSS10pIHsKLQkJci0+ZndtYXJrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pOwotCQlpZiAoci0+ZndtYXJrKQotCQkJLyogY29tcGF0aWJpbGl0eTogaWYgdGhlIG1hcmsgdmFsdWUgaXMgbm9uLXplcm8gYWxsIGJpdHMKLQkJCSAqIGFyZSBjb21wYXJlZCB1bmxlc3MgYSBtYXNrIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotCQkJICovCi0JCQlyLT5md21hc2sgPSAweEZGRkZGRkZGOwotCX0KLQotCWlmICh0YltGUkFfRldNQVNLXSkKLQkJci0+ZndtYXNrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFTS10pOwotI2VuZGlmCi0KIAlyLT5zcmNfbGVuID0gZnJoLT5zcmNfbGVuOwogCXItPnNyY21hc2sgPSBkbmV0X21ha2VfbWFzayhyLT5zcmNfbGVuKTsKIAlyLT5kc3RfbGVuID0gZnJoLT5kc3RfbGVuOwpAQCAtMjAzLDE0ICsxNzYsNiBAQAogCWlmIChmcmgtPmRzdF9sZW4gJiYgKHItPmRzdF9sZW4gIT0gZnJoLT5kc3RfbGVuKSkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCWlmICh0YltGUkFfRldNQVJLXSAmJiAoci0+ZndtYXJrICE9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BUktdKSkpCi0JCXJldHVybiAwOwotCi0JaWYgKHRiW0ZSQV9GV01BU0tdICYmIChyLT5md21hc2sgIT0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFTS10pKSkKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQogCWlmICh0YltGUkFfU1JDXSAmJiAoci0+c3JjICE9IG5sYV9nZXRfdTE2KHRiW0ZSQV9TUkNdKSkpCiAJCXJldHVybiAwOwogCkBAIC0yNDgsMTIgKzIxMyw2IEBACiAJZnJoLT5zcmNfbGVuID0gci0+c3JjX2xlbjsKIAlmcmgtPnRvcyA9IDA7CiAKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCWlmIChyLT5md21hcmspCi0JCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0ZXTUFSSywgci0+ZndtYXJrKTsKLQlpZiAoci0+ZndtYXNrIHx8IHItPmZ3bWFyaykKLQkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVNLLCByLT5md21hc2spOwotI2VuZGlmCiAJaWYgKHItPmRzdF9sZW4pCiAJCU5MQV9QVVRfVTE2KHNrYiwgRlJBX0RTVCwgci0+ZHN0KTsKIAlpZiAoci0+c3JjX2xlbikKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fdGFibGUuYyBiL25ldC9kZWNuZXQvZG5fdGFibGUuYwppbmRleCAzMTc5MDRiLi5iZGJjM2Y0IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKKysrIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCkBAIC0yNjMsNiArMjYzLDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGRuX2ZpYl9ubG1zZ19zaXplKHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpCit7CisJc2l6ZV90IHBheWxvYWQgPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKwkJCSArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9UQUJMRSAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoMikgLyogUlRBX0RTVCAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCk7IC8qIFJUQV9QUklPUklUWSAqLworCisJLyogc3BhY2UgZm9yIG5lc3RlZCBtZXRyaWNzICovCisJcGF5bG9hZCArPSBubGFfdG90YWxfc2l6ZSgoUlRBWF9NQVggKiBubGFfdG90YWxfc2l6ZSg0KSkpOworCisJaWYgKGZpLT5maWJfbmhzKSB7CisJCS8qIEFsc28gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIGZpYl9uaHMgPT0gMSAqLworCisJCS8qIGVhY2ggbmV4dGhvcCBpcyBwYWNrZWQgaW4gYW4gYXR0cmlidXRlICovCisJCXNpemVfdCBuaHNpemUgPSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkpOworCisJCS8qIG1heSBjb250YWluIGEgZ2F0ZXdheSBhdHRyaWJ1dGUgKi8KKwkJbmhzaXplICs9IG5sYV90b3RhbF9zaXplKDQpOworCisJCS8qIGFsbCBuZXh0aG9wcyBhcmUgcGFja2VkIGluIGEgbmVzdGVkIGF0dHJpYnV0ZSAqLworCQlwYXlsb2FkICs9IG5sYV90b3RhbF9zaXplKGZpLT5maWJfbmhzICogbmhzaXplKTsKKwl9CisKKwlyZXR1cm4gcGF5bG9hZDsKK30KKwogc3RhdGljIGludCBkbl9maWJfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiB0Yl9pZCwgdTggdHlwZSwgdTggc2NvcGUsIHZvaWQgKmRzdCwgaW50IGRzdF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZG5fZmliX2luZm8gKmZpLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC0zMzUsMTcgKzM2MSwxNSBAQAogICAgICAgICB1MzIgcGlkID0gcmVxID8gcmVxLT5waWQgOiAwOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAotICAgICAgICBza2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworICAgICAgICBza2IgPSBubG1zZ19uZXcoZG5fZmliX25sbXNnX3NpemUoRE5fRklCX0lORk8oZikpLCBHRlBfS0VSTkVMKTsKICAgICAgICAgaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAogICAgICAgICBlcnIgPSBkbl9maWJfZHVtcF9pbmZvKHNrYiwgcGlkLCBubGgtPm5sbXNnX3NlcSwgZXZlbnQsIHRiX2lkLAogCQkJICAgICAgIGYtPmZuX3R5cGUsIGYtPmZuX3Njb3BlLCAmZi0+Zm5fa2V5LCB6LAogCQkJICAgICAgIEROX0ZJQl9JTkZPKGYpLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLSAgICAgICAgfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gZG5fZmliX25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBSVE5MR1JQX0RFQ25ldF9ST1VURSwgbmxoLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKQEAgLTgwNywxMCArODMxLDExIEBACiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkRFQ25ldDogQlVHISBBdHRlbXB0IHRvIGNyZWF0ZSByb3V0aW5nIHRhYmxlIGZyb20gaW50ZXJydXB0XG4iKTsgCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRuX2ZpYl90YWJsZSkgKyBzaXplb2Yoc3RydWN0IGRuX2hhc2gpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHN0cnVjdCBkbl9maWJfdGFibGUpKTsKKyAgICAgICAgdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbl9maWJfdGFibGUpICsgc2l6ZW9mKHN0cnVjdCBkbl9oYXNoKSwKKwkJICAgIEdGUF9LRVJORUwpOworICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgIHQtPm4gPSBuOwogICAgICAgICB0LT5pbnNlcnQgPSBkbl9maWJfdGFibGVfaW5zZXJ0OwpAQCAtODE4LDcgKzg0Myw2IEBACiAgICAgICAgIHQtPmxvb2t1cCA9IGRuX2ZpYl90YWJsZV9sb29rdXA7CiAgICAgICAgIHQtPmZsdXNoICA9IGRuX2ZpYl90YWJsZV9mbHVzaDsKICAgICAgICAgdC0+ZHVtcCA9IGRuX2ZpYl90YWJsZV9kdW1wOwotCW1lbXNldCh0LT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGRuX2hhc2gpKTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnQtPmhsaXN0LCAmZG5fZmliX3RhYmxlX2hhc2hbaF0pOwogCiAgICAgICAgIHJldHVybiB0OwpkaWZmIC0tZ2l0IGEvbmV0L2V0aGVybmV0L2V0aC5jIGIvbmV0L2V0aGVybmV0L2V0aC5jCmluZGV4IDRiZDc4YzguLjJkMzFiZjMgMTAwNjQ0Ci0tLSBhL25ldC9ldGhlcm5ldC9ldGguYworKysgYi9uZXQvZXRoZXJuZXQvZXRoLmMKQEAgLTYwLDcgKzYwLDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KIAogX19zZXR1cCgiZXRoZXI9IiwgbmV0ZGV2X2Jvb3Rfc2V0dXApOwogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKaW5kZXggNDIwMGVjNS4uZmMxZjk5YSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCmluZGV4IDFiMmVmZmYuLjdhOTVjM2QgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCAxM2IxZTVmLi5iMWM2ZDFmIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtNjcsNyArNjcsNyBAQAogCQlyZXR1cm4gMDsKIAogCWllZWUtPm5ldHdvcmtzID0KLQkgICAga21hbGxvYyhNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspLAorCSAgICBremFsbG9jKE1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayksCiAJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWllZWUtPm5ldHdvcmtzKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29uc1xuIiwKQEAgLTc1LDkgKzc1LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KGllZWUtPm5ldHdvcmtzLCAwLAotCSAgICAgICBNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMTgsNiArMTE1LDIxIEBACiAJCQkgICAgICAmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IElFRUU4MDIxMV9EQVRBX0xFTikpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZWVlODAyMTFfZ2VuZXJpY19nZXRfc3RhdHMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZpZWVlLT5zdGF0czsKK30KKwogc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CkBAIC0xMzMsNiArMTQ1LDExIEBACiAJfQogCWllZWUgPSBuZXRkZXZfcHJpdihkZXYpOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaWVlZTgwMjExX3htaXQ7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaWVlZTgwMjExX2NoYW5nZV9tdHU7CisKKwkvKiBEcml2ZXJzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIHRoaXMgaWYgdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24KKwkgKiBkb2VzIG5vdCBtZWV0IHRoZWlyIG5lZWRzLiAqLworCWRldi0+Z2V0X3N0YXRzID0gaWVlZTgwMjExX2dlbmVyaWNfZ2V0X3N0YXRzOwogCiAJaWVlZS0+ZGV2ID0gZGV2OwogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCAyNzU5MzEyLi5kOTdlNTQxIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTQxNSwxNyArNDE1LDE2IEBACiAJICAgIGllZWUtPmhvc3RfbWNfZGVjcnlwdCA6IGllZWUtPmhvc3RfZGVjcnlwdDsKIAogCWlmIChjYW5fYmVfZGVjcnlwdGVkKSB7Ci0JCWludCBpZHggPSAwOwogCQlpZiAoc2tiLT5sZW4gPj0gaGRybGVuICsgMykgewogCQkJLyogVG9wIHR3by1iaXRzIG9mIGJ5dGUgMyBhcmUgdGhlIGtleSBpbmRleCAqLwotCQkJaWR4ID0gc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDY7CisJCQlrZXlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKIAkJfQogCi0JCS8qIGllZWUtPmNyeXB0W10gaXMgV0VQX0tFWSAoNCkgaW4gbGVuZ3RoLiAgR2l2ZW4gdGhhdCBpZHgKLQkJICogaXMgb25seSBhbGxvd2VkIDItYml0cyBvZiBzdG9yYWdlLCBubyB2YWx1ZSBvZiBpZHggY2FuCi0JCSAqIGJlIHByb3ZpZGVkIHZpYSBhYm92ZSBjb2RlIHRoYXQgd291bGQgcmVzdWx0IGluIGlkeAorCQkvKiBpZWVlLT5jcnlwdFtdIGlzIFdFUF9LRVkgKDQpIGluIGxlbmd0aC4gIEdpdmVuIHRoYXQga2V5aWR4CisJCSAqIGlzIG9ubHkgYWxsb3dlZCAyLWJpdHMgb2Ygc3RvcmFnZSwgbm8gdmFsdWUgb2Yga2V5aWR4IGNhbgorCQkgKiBiZSBwcm92aWRlZCB2aWEgYWJvdmUgY29kZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiBrZXlpZHgKIAkJICogYmVpbmcgb3V0IG9mIHJhbmdlICovCi0JCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWR4XTsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtrZXlpZHhdOwogCiAjaWZkZWYgTk9UX1lFVAogCQlzdGEgPSBOVUxMOwpAQCAtNDc5LDYgKzQ3OCwxMSBAQAogCQkJZ290byByeF9leGl0OwogCX0KICNlbmRpZgorCS8qIGRyb3AgZHVwbGljYXRlIDgwMi4xMSByZXRyYW5zbWlzc2lvbnMgKElFRUUgODAyLjExIENoYXAuIDkuMjkpICovCisJaWYgKHNjID09IGllZWUtPnByZXZfc2VxX2N0bCkKKwkJZ290byByeF9kcm9wcGVkOworCWVsc2UKKwkJaWVlZS0+cHJldl9zZXFfY3RsID0gc2M7CiAKIAkvKiBEYXRhIGZyYW1lIC0gZXh0cmFjdCBzcmMvZHN0IGFkZHJlc3NlcyAqLwogCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV8zQUREUl9MRU4pCkBAIC02NTUsNiArNjU5LDUxIEBACiAJCWdvdG8gcnhfZHJvcHBlZDsKIAl9CiAKKwkvKiBJZiB0aGUgZnJhbWUgd2FzIGRlY3J5cHRlZCBpbiBoYXJkd2FyZSwgd2UgbWF5IG5lZWQgdG8gc3RyaXAgb2ZmCisJICogYW55IHNlY3VyaXR5IGRhdGEgKElWLCBJQ1YsIGV0YykgdGhhdCB3YXMgbGVmdCBiZWhpbmQgKi8KKwlpZiAoIWNhbl9iZV9kZWNyeXB0ZWQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJgorCSAgICBpZWVlLT5ob3N0X3N0cmlwX2l2X2ljdikgeworCSAgICAJaW50IHRyaW1sZW4gPSAwOworCisJCS8qIFRvcCB0d28tYml0cyBvZiBieXRlIDMgYXJlIHRoZSBrZXkgaW5kZXggKi8KKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlrZXlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKworCQkvKiBUbyBzdHJpcCBvZmYgYW55IHNlY3VyaXR5IGRhdGEgd2hpY2ggYXBwZWFycyBiZWZvcmUgdGhlCisJCSAqIHBheWxvYWQsIHdlIHNpbXBseSBpbmNyZWFzZSBoZHJsZW4gKGFzIHRoZSBoZWFkZXIgZ2V0cworCQkgKiBjaG9wcGVkIG9mZiBpbW1lZGlhdGVseSBiZWxvdykuIEZvciB0aGUgc2VjdXJpdHkgZGF0YSB3aGljaAorCQkgKiBhcHBlYXJzIGFmdGVyIHRoZSBwYXlsb2FkLCB3ZSB1c2Ugc2tiX3RyaW0uICovCisKKwkJc3dpdGNoIChpZWVlLT5zZWMuZW5jb2RlX2FsZ1trZXlpZHhdKSB7CisJCWNhc2UgU0VDX0FMR19XRVA6CisJCQkvKiA0IGJ5dGUgSVYgKi8KKwkJCWhkcmxlbiArPSA0OworCQkJLyogNCBieXRlIElDViAqLworCQkJdHJpbWxlbiA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBTRUNfQUxHX1RLSVA6CisJCQkvKiA0IGJ5dGUgSVYsIDQgYnl0ZSBFeHRJViAqLworCQkJaGRybGVuICs9IDg7CisJCQkvKiA4IGJ5dGUgTUlDLCA0IGJ5dGUgSUNWICovCisJCQl0cmltbGVuID0gMTI7CisJCQlicmVhazsKKwkJY2FzZSBTRUNfQUxHX0NDTVA6CisJCQkvKiA4IGJ5dGUgQ0NNUCBoZWFkZXIgKi8KKwkJCWhkcmxlbiArPSA4OworCQkJLyogOCBieXRlIE1JQyAqLworCQkJdHJpbWxlbiA9IDg7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChza2ItPmxlbiA8IHRyaW1sZW4pCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwkJX19za2JfdHJpbShza2IsIHNrYi0+bGVuIC0gdHJpbWxlbik7CisKKwkJaWYgKHNrYi0+bGVuIDwgaGRybGVuKQorCQkJZ290byByeF9kcm9wcGVkOworCX0KKwogCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIHBsYWludGV4dCBwYXlsb2FkICovCiAKIAlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOwpAQCAtMTI1NSwxMiArMTMwNCwxMSBAQAogCQljYXNlIE1GSUVfVFlQRV9JQlNTX0RGUzoKIAkJCWlmIChuZXR3b3JrLT5pYnNzX2RmcykKIAkJCQlicmVhazsKLQkJCW5ldHdvcmstPmlic3NfZGZzID0KLQkJCSAgICBrbWFsbG9jKGluZm9fZWxlbWVudC0+bGVuLCBHRlBfQVRPTUlDKTsKKwkJCW5ldHdvcmstPmlic3NfZGZzID0ga21lbWR1cChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgICAgaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkgICAgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIW5ldHdvcmstPmlic3NfZGZzKQogCQkJCXJldHVybiAxOwotCQkJbWVtY3B5KG5ldHdvcmstPmlic3NfZGZzLCBpbmZvX2VsZW1lbnQtPmRhdGEsCi0JCQkgICAgICAgaW5mb19lbGVtZW50LT5sZW4pOwogCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfSUJTU19ERlM7CiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggYWUyNTQ0OS4uODU0ZmMxMyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAkJICogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKIAkJICogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50CiAJCSAqIGZvciBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KLQkJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBJRUVFODAyMTFfM0FERFJfTEVOOworCQlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIGhkcl9sZW47CiAJCWlmIChpZWVlLT5jb25maWcgJgogCQkgICAgKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKIAkJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJfSBlbHNlIHsKIAkJbnJfZnJhZ3MgPSAxOwogCQlieXRlc19wZXJfZnJhZyA9IGJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzOwotCQlmcmFnX3NpemUgPSBieXRlcyArIElFRUU4MDIxMV8zQUREUl9MRU47CisJCWZyYWdfc2l6ZSA9IGJ5dGVzICsgaGRyX2xlbjsKIAl9CiAKIAlydHNfcmVxdWlyZWQgPSAoZnJhZ19zaXplID4gaWVlZS0+cnRzCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hdXRoLmMgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hdXRoLmMKaW5kZXggNGNlZjM5ZS4uMDYxMjAxNSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXV0aC5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2F1dGguYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJLyogTWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGFuIGF1dGggcXVldWUgaXRlbSBmb3IgdGhpcyByZXF1ZXN0ICovCiAJaWYoYXEgPT0gTlVMTCkKIAl7Ci0JCXByaW50a2woS0VSTl9ERUJVRyBQRlggIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gIk1BQ19GTVQiIGJ1dCBubyBxdWV1ZSBpdGVtIGV4aXN0cy5cbiIsIE1BQ19BUkcoYXV0aC0+aGVhZGVyLmFkZHIyKSk7CisJCWRwcmludGtsKEtFUk5fREVCVUcgUEZYICJBdXRoZW50aWNhdGlvbiByZXNwb25zZSByZWNlaXZlZCBmcm9tICJNQUNfRk1UIiBidXQgbm8gcXVldWUgaXRlbSBleGlzdHMuXG4iLCBNQUNfQVJHKGF1dGgtPmhlYWRlci5hZGRyMikpOwogCQkvKiBFcnJvciAjPyAqLwogCQlyZXR1cm4gLTE7CiAJfQkJCQpAQCAtMTY2LDcgKzE2Niw3IEBACiAJLyogQ2hlY2sgZm9yIG91dCBvZiBvcmRlciBhdXRoZW50aWNhdGlvbiAqLwogCWlmKCFuZXQtPmF1dGhlbnRpY2F0aW5nKQogCXsKLQkJcHJpbnRrbChLRVJOX0RFQlVHIFBGWCAiQXV0aGVudGljYXRpb24gcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSAiTUFDX0ZNVCIgYnV0IGRpZCBub3QgcmVxdWVzdCBhdXRoZW50aWNhdGlvbi5cbiIsTUFDX0FSRyhhdXRoLT5oZWFkZXIuYWRkcjIpKTsKKwkJZHByaW50a2woS0VSTl9ERUJVRyBQRlggIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gIk1BQ19GTVQiIGJ1dCBkaWQgbm90IHJlcXVlc3QgYXV0aGVudGljYXRpb24uXG4iLE1BQ19BUkcoYXV0aC0+aGVhZGVyLmFkZHIyKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTIxNiwxMCArMjE2LDE2IEBACiAJCQluZXQtPmNoYWxsZW5nZV9sZW4gPSAqZGF0YSsrOyAJCiAJCQlpZiAobmV0LT5jaGFsbGVuZ2VfbGVuID4gV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4pCiAJCQkJbmV0LT5jaGFsbGVuZ2VfbGVuID0gV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU47Ci0JCQlpZiAobmV0LT5jaGFsbGVuZ2UgIT0gTlVMTCkKLQkJCQlrZnJlZShuZXQtPmNoYWxsZW5nZSk7Ci0JCQluZXQtPmNoYWxsZW5nZSA9IGttYWxsb2MobmV0LT5jaGFsbGVuZ2VfbGVuLCBHRlBfQVRPTUlDKTsKLQkJCW1lbWNweShuZXQtPmNoYWxsZW5nZSwgZGF0YSwgbmV0LT5jaGFsbGVuZ2VfbGVuKTsKKwkJCWtmcmVlKG5ldC0+Y2hhbGxlbmdlKTsKKwkJCW5ldC0+Y2hhbGxlbmdlID0ga21lbWR1cChkYXRhLCBuZXQtPmNoYWxsZW5nZV9sZW4sCisJCQkJCQkgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV0LT5jaGFsbGVuZ2UgPT0gTlVMTCkgeworCQkJCXByaW50a2woS0VSTl9OT1RJQ0UgUEZYICJTaGFyZWQgS2V5ICIKKwkJCQkJIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCBkdWUgdG8gIgorCQkJCQkibWVtb3J5IHNob3J0YWdlLlxuIik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CiAJCQlhcS0+c3RhdGUgPSBJRUVFODAyMTFTT0ZUTUFDX0FVVEhfU0hBUkVEX1JFU1BPTlNFOyAKIAogCQkJLyogV2UgcmV1c2UgdGhlIHdvcmsgc3RydWN0IGZyb20gdGhlIGF1dGggcmVxdWVzdCBoZXJlLgpAQCAtMzQyLDcgKzM0OCw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBuZXR3b3JrIGlzIGF1dGhlbnRpY2F0ZWQgKi8KIAlpZiAoIW5ldC0+YXV0aGVudGljYXRlZCkKIAl7Ci0JCXByaW50a2woS0VSTl9ERUJVRyBQRlggIkNhbid0IHNlbmQgZGVhdXRoZW50aWNhdGlvbiBwYWNrZXQsIG5ldHdvcmsgaXMgbm90IGF1dGhlbnRpY2F0ZWQuXG4iKTsKKwkJZHByaW50a2woS0VSTl9ERUJVRyBQRlggIkNhbid0IHNlbmQgZGVhdXRoZW50aWNhdGlvbiBwYWNrZXQsIG5ldHdvcmsgaXMgbm90IGF1dGhlbnRpY2F0ZWQuXG4iKTsKIAkJLyogRXJyb3Igb2theT8gKi8KIAkJcmV0dXJuIC1FUEVSTTsKIAl9CkBAIC0zNzYsNyArMzgyLDcgQEAKIAluZXQgPSBpZWVlODAyMTFzb2Z0bWFjX2dldF9uZXR3b3JrX2J5X2Jzc2lkKG1hYywgZGVhdXRoLT5oZWFkZXIuYWRkcjIpOwogCQogCWlmIChuZXQgPT0gTlVMTCkgewotCQlwcmludGtsKEtFUk5fREVCVUcgUEZYICJSZWNlaXZlZCBkZWF1dGhlbnRpY2F0aW9uIHBhY2tldCBmcm9tICJNQUNfRk1UIiwgYnV0IHRoYXQgbmV0d29yayBpcyB1bmtub3duLlxuIiwKKwkJZHByaW50a2woS0VSTl9ERUJVRyBQRlggIlJlY2VpdmVkIGRlYXV0aGVudGljYXRpb24gcGFja2V0IGZyb20gIk1BQ19GTVQiLCBidXQgdGhhdCBuZXR3b3JrIGlzIHVua25vd24uXG4iLAogCQkJTUFDX0FSRyhkZWF1dGgtPmhlYWRlci5hZGRyMikpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zODQsNyArMzkwLDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhlIG5ldHdvcmsgaXMgYXV0aGVudGljYXRlZCAqLwogCWlmKCFuZXQtPmF1dGhlbnRpY2F0ZWQpCiAJewotCQlwcmludGtsKEtFUk5fREVCVUcgUEZYICJDYW4ndCBwZXJmb3JtIGRlYXV0aGVudGljYXRpb24sIG5ldHdvcmsgaXMgbm90IGF1dGhlbnRpY2F0ZWQuXG4iKTsKKwkJZHByaW50a2woS0VSTl9ERUJVRyBQRlggIkNhbid0IHBlcmZvcm0gZGVhdXRoZW50aWNhdGlvbiwgbmV0d29yayBpcyBub3QgYXV0aGVudGljYXRlZC5cbiIpOwogCQkvKiBFcnJvciBva2F5PyAqLwogCQlyZXR1cm4gLUVQRVJNOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3NjYW4uYyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3NjYW4uYwppbmRleCBkMzFjZjc3Li41NTA3ZmVhIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19zY2FuLmMKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfc2Nhbi5jCkBAIC00Nyw3ICs0Nyw2IEBACiAJc20tPnNjYW5uaW5nID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jaywgZmxhZ3MpOwogCi0JbmV0aWZfdHhfZGlzYWJsZShzbS0+aWVlZS0+ZGV2KTsKIAlyZXQgPSBzbS0+c3RhcnRfc2NhbihzbS0+ZGV2KTsKIAlpZiAocmV0KSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzbS0+bG9jaywgZmxhZ3MpOwpAQCAtMTM1LDcgKzEzNCw4IEBACiAJc2ktPnN0YXJ0ZWQgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtLT5sb2NrLCBmbGFncyk7CiAKLQlkcHJpbnRrKFBGWCAiU2Nhbm5pbmcgZmluaXNoZWRcbiIpOworCWRwcmludGsoUEZYICJTY2FubmluZyBmaW5pc2hlZDogc2Nhbm5lZCAlZCBjaGFubmVscyBzdGFydGluZyB3aXRoIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgc20tPnNjYW5pbmZvLT5udW1iZXJfY2hhbm5lbHMsIHNtLT5zY2FuaW5mby0+Y2hhbm5lbHNbMF0uY2hhbm5lbCk7CiAJaWVlZTgwMjExc29mdG1hY19zY2FuX2ZpbmlzaGVkKHNtKTsKIAljb21wbGV0ZV9hbGwoJnNtLT5zY2FuaW5mby0+ZmluaXNoZWQpOwogfQpAQCAtMTgzLDggKzE4Myw2IEBACiAJCXNtLT5zY2FuaW5mby0+Y2hhbm5lbHMgPSBzbS0+aWVlZS0+Z2VvLmJnOwogCQlzbS0+c2NhbmluZm8tPm51bWJlcl9jaGFubmVscyA9IHNtLT5pZWVlLT5nZW8uYmdfY2hhbm5lbHM7CiAJfQotCWRwcmludGsoUEZYICJTdGFydCBzY2FubmluZyB3aXRoIGNoYW5uZWw6ICVkXG4iLCBzbS0+c2NhbmluZm8tPmNoYW5uZWxzWzBdLmNoYW5uZWwpOwotCWRwcmludGsoUEZYICJTY2FubmluZyAlZCBjaGFubmVsc1xuIiwgc20tPnNjYW5pbmZvLT5udW1iZXJfY2hhbm5lbHMpOwogCXNtLT5zY2FuaW5mby0+Y3VycmVudF9jaGFubmVsX2lkeCA9IDA7CiAJc20tPnNjYW5pbmZvLT5zdGFydGVkID0gMTsKIAlzbS0+c2NhbmluZm8tPnN0b3AgPSAwOwpAQCAtMjQ4LDcgKzI0Niw2IEBACiAJCWlmIChuZXQpCiAJCQlzbS0+c2V0X2NoYW5uZWwoc20tPmRldiwgbmV0LT5jaGFubmVsKTsKIAl9Ci0JbmV0aWZfd2FrZV9xdWV1ZShzbS0+aWVlZS0+ZGV2KTsKIAlpZWVlODAyMTFzb2Z0bWFjX2NhbGxfZXZlbnRzKHNtLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX1NDQU5fRklOSVNIRUQsIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExc29mdG1hY19zY2FuX2ZpbmlzaGVkKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L0tjb25maWcgYi9uZXQvaXB2NC9LY29uZmlnCmluZGV4IDU1NzIwNzEuLjUwM2U3MDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L0tjb25maWcKKysrIGIvbmV0L2lwdjQvS2NvbmZpZwpAQCAtMTA0LDEzICsxMDQsNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfUk9VVEVfRldNQVJLCi0JYm9vbCAiSVA6IHVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nIGtleSIKLQlkZXBlbmRzIG9uIElQX01VTFRJUExFX1RBQkxFUyAmJiBORVRGSUxURVIKLQloZWxwCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBzcGVjaWZ5IGRpZmZlcmVudCByb3V0ZXMgZm9yCi0JICBwYWNrZXRzIHdpdGggZGlmZmVyZW50IG1hcmsgdmFsdWVzIChzZWUgaXB0YWJsZXMoOCksIE1BUksgdGFyZ2V0KS4KLQogY29uZmlnIElQX1JPVVRFX01VTFRJUEFUSAogCWJvb2wgIklQOiBlcXVhbCBjb3N0IG11bHRpcGF0aCIKIAlkZXBlbmRzIG9uIElQX0FEVkFOQ0VEX1JPVVRFUgpAQCAtNjI1LDUgKzYxOCwxNyBAQAogCWRlZmF1bHQgInJlbm8iIGlmIERFRkFVTFRfUkVOTwogCWRlZmF1bHQgImN1YmljIgogCitjb25maWcgVENQX01ENVNJRworCWJvb2wgIlRDUDogTUQ1IFNpZ25hdHVyZSBPcHRpb24gc3VwcG9ydCAoUkZDMjM4NSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19NRDUKKwktLS1oZWxwLS0tCisJICBSRkMyMzg1IHNwZWNpZmljZXMgYSBtZXRob2Qgb2YgZ2l2aW5nIE1ENSBwcm90ZWN0aW9uIHRvIFRDUCBzZXNzaW9ucy4KKwkgIEl0cyBtYWluIChvbmx5PykgdXNlIGlzIHRvIHByb3RlY3QgQkdQIHNlc3Npb25zIGJldHdlZW4gY29yZSByb3V0ZXJzCisJICBvbiB0aGUgSW50ZXJuZXQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIHNvdXJjZSAibmV0L2lwdjQvaXB2cy9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9NYWtlZmlsZSBiL25ldC9pcHY0L01ha2VmaWxlCmluZGV4IDE1NjQ1YzUuLjdhMDY4NjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L01ha2VmaWxlCisrKyBiL25ldC9pcHY0L01ha2VmaWxlCkBAIC04LDcgKzgsOCBAQAogCSAgICAgaW5ldF90aW1ld2FpdF9zb2NrLm8gaW5ldF9jb25uZWN0aW9uX3NvY2subyBcCiAJICAgICB0Y3AubyB0Y3BfaW5wdXQubyB0Y3Bfb3V0cHV0Lm8gdGNwX3RpbWVyLm8gdGNwX2lwdjQubyBcCiAJICAgICB0Y3BfbWluaXNvY2tzLm8gdGNwX2NvbmcubyBcCi0JICAgICBkYXRhZ3JhbS5vIHJhdy5vIHVkcC5vIGFycC5vIGljbXAubyBkZXZpbmV0Lm8gYWZfaW5ldC5vIGlnbXAubyBcCisJICAgICBkYXRhZ3JhbS5vIHJhdy5vIHVkcC5vIHVkcGxpdGUubyBcCisJICAgICBhcnAubyBpY21wLm8gZGV2aW5ldC5vIGFmX2luZXQubyAgaWdtcC5vIFwKIAkgICAgIHN5c2N0bF9uZXRfaXB2NC5vIGZpYl9mcm9udGVuZC5vIGZpYl9zZW1hbnRpY3MubwogCiBvYmotJChDT05GSUdfSVBfRklCX0hBU0gpICs9IGZpYl9oYXNoLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCBlZGNmMDkzLi4xMTQ0OTAwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC0xMDQsNiArMTA0LDcgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC91ZHBsaXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcmF3Lmg+CkBAIC0yMDQsNyArMjA1LDcgQEAKIAkgKiB3ZSBjYW4gb25seSBhbGxvdyB0aGUgYmFja2xvZyB0byBiZSBhZGp1c3RlZC4KIAkgKi8KIAlpZiAob2xkX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKLQkJZXJyID0gaW5ldF9jc2tfbGlzdGVuX3N0YXJ0KHNrLCBUQ1BfU1lOUV9IU0laRSk7CisJCWVyciA9IGluZXRfY3NrX2xpc3Rlbl9zdGFydChzaywgYmFja2xvZyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC02NDMsNyArNjQ0LDcgQEAKIAkJc2luLT5zaW5fcG9ydCA9IGluZXQtPmRwb3J0OwogCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGluZXQtPmRhZGRyOwogCX0gZWxzZSB7Ci0JCV9fdTMyIGFkZHIgPSBpbmV0LT5yY3Zfc2FkZHI7CisJCV9fYmUzMiBhZGRyID0gaW5ldC0+cmN2X3NhZGRyOwogCQlpZiAoIWFkZHIpCiAJCQlhZGRyID0gaW5ldC0+c2FkZHI7CiAJCXNpbi0+c2luX3BvcnQgPSBpbmV0LT5zcG9ydDsKQEAgLTk5NCw4ICs5OTUsOCBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlpbnQgZXJyOwogCXN0cnVjdCBydGFibGUgKnJ0OwotCV9fdTMyIG9sZF9zYWRkciA9IGluZXQtPnNhZGRyOwotCV9fdTMyIG5ld19zYWRkcjsKKwlfX2JlMzIgb2xkX3NhZGRyID0gaW5ldC0+c2FkZHI7CisJX19iZTMyIG5ld19zYWRkcjsKIAlfX2JlMzIgZGFkZHIgPSBpbmV0LT5kYWRkcjsKIAogCWlmIChpbmV0LT5vcHQgJiYgaW5ldC0+b3B0LT5zcnIpCkBAIC0xMjIzLDEwICsxMjI0LDEzIEBACiAJdGNwX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHRjcF9taWIpOwogCXVkcF9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKIAl1ZHBfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7CisJdWRwbGl0ZV9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKKwl1ZHBsaXRlX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHVkcF9taWIpOwogCWlmICghCiAJICAgIChuZXRfc3RhdGlzdGljc1swXSAmJiBuZXRfc3RhdGlzdGljc1sxXSAmJiBpcF9zdGF0aXN0aWNzWzBdCiAJICAgICAmJiBpcF9zdGF0aXN0aWNzWzFdICYmIHRjcF9zdGF0aXN0aWNzWzBdICYmIHRjcF9zdGF0aXN0aWNzWzFdCi0JICAgICAmJiB1ZHBfc3RhdGlzdGljc1swXSAmJiB1ZHBfc3RhdGlzdGljc1sxXSkpCisJICAgICAmJiB1ZHBfc3RhdGlzdGljc1swXSAmJiB1ZHBfc3RhdGlzdGljc1sxXQorCSAgICAgJiYgdWRwbGl0ZV9zdGF0aXN0aWNzWzBdICYmIHVkcGxpdGVfc3RhdGlzdGljc1sxXSAgICAgICAgICAgICApICkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkodm9pZCkgdGNwX21pYl9pbml0KCk7CkBAIC0xMzEzLDYgKzEzMTcsOCBAQAogCS8qIFNldHVwIFRDUCBzbGFiIGNhY2hlIGZvciBvcGVuIHJlcXVlc3RzLiAqLwogCXRjcF9pbml0KCk7CiAKKwkvKiBBZGQgVURQLUxpdGUgKFJGQyAzODI4KSAqLworCXVkcGxpdGU0X3JlZ2lzdGVyKCk7CiAKIAkvKgogCSAqCVNldCB0aGUgSUNNUCBsYXllciB1cApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWg0LmMgYi9uZXQvaXB2NC9haDQuYwppbmRleCA5OTU0Mjk3Li42N2E1NTA5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9haDQuYworKysgYi9uZXQvaXB2NC9haDQuYwpAQCAtMTQsNyArMTQsNyBAQAogICogaW50byBJUCBoZWFkZXIgZm9yIGljdiBjYWxjdWxhdGlvbi4gT3B0aW9ucyBhcmUgYWxyZWFkeSBjaGVja2VkCiAgKiBmb3IgdmFsaWRpdHksIHNvIHBhcmFub2lhIGlzIG5vdCByZXF1aXJlZC4gKi8KIAotc3RhdGljIGludCBpcF9jbGVhcl9tdXRhYmxlX29wdGlvbnMoc3RydWN0IGlwaGRyICppcGgsIHUzMiAqZGFkZHIpCitzdGF0aWMgaW50IGlwX2NsZWFyX211dGFibGVfb3B0aW9ucyhzdHJ1Y3QgaXBoZHIgKmlwaCwgX19iZTMyICpkYWRkcikKIHsKIAl1bnNpZ25lZCBjaGFyICogb3B0cHRyID0gKHVuc2lnbmVkIGNoYXIqKShpcGgrMSk7CiAJaW50ICBsID0gaXBoLT5paGwqNCAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJaXBoLT5mcmFnX29mZiA9IDA7CiAJaXBoLT5jaGVjayA9IDA7CiAJaWYgKGlobCA+IHNpemVvZigqaXBoKSkgewotCQl1MzIgZHVtbXk7CisJCV9fYmUzMiBkdW1teTsKIAkJaWYgKGlwX2NsZWFyX211dGFibGVfb3B0aW9ucyhpcGgsICZkdW1teSkpCiAJCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hcnAuYyBiL25ldC9pcHY0L2FycC5jCmluZGV4IGNmYjVkM2QuLjM5ODFlOGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FycC5jCisrKyBiL25ldC9pcHY0L2FycC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkuZ2NfdGhyZXNoMyA9CTEwMjQsCiB9OwogCi1pbnQgYXJwX21jX21hcCh1MzIgYWRkciwgdTggKmhhZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZGlyKQoraW50IGFycF9tY19tYXAoX19iZTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcikKIHsKIAlzd2l0Y2ggKGRldi0+dHlwZSkgewogCWNhc2UgQVJQSFJEX0VUSEVSOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvY2lwc29faXB2NC5jIGIvbmV0L2lwdjQvY2lwc29faXB2NC5jCmluZGV4IDY0NjAyMzMuLjYwYWFmYjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYworKysgYi9uZXQvaXB2NC9jaXBzb19pcHY0LmMKQEAgLTMxOSw2ICszMTksNyBAQAogCQkJZW50cnktPmFjdGl2aXR5ICs9IDE7CiAJCQlhdG9taWNfaW5jKCZlbnRyeS0+bHNtX2RhdGEtPnJlZmNvdW50KTsKIAkJCXNlY2F0dHItPmNhY2hlID0gZW50cnktPmxzbV9kYXRhOworCQkJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfQ0FDSEU7CiAJCQlpZiAocHJldl9lbnRyeSA9PSBOVUxMKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJmNpcHNvX3Y0X2NhY2hlW2JrdF0ubG9jayk7CiAJCQkJcmV0dXJuIDA7CkBAIC0zNzcsMTIgKzM3OCwxMSBAQAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWVudHJ5LT5rZXkgPSBrbWFsbG9jKGNpcHNvX3B0cl9sZW4sIEdGUF9BVE9NSUMpOworCWVudHJ5LT5rZXkgPSBrbWVtZHVwKGNpcHNvX3B0ciwgY2lwc29fcHRyX2xlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgewogCQlyZXRfdmFsID0gLUVOT01FTTsKIAkJZ290byBjYWNoZV9hZGRfZmFpbHVyZTsKIAl9Ci0JbWVtY3B5KGVudHJ5LT5rZXksIGNpcHNvX3B0ciwgY2lwc29fcHRyX2xlbik7CiAJZW50cnktPmtleV9sZW4gPSBjaXBzb19wdHJfbGVuOwogCWVudHJ5LT5oYXNoID0gY2lwc29fdjRfbWFwX2NhY2hlX2hhc2goY2lwc29fcHRyLCBjaXBzb19wdHJfbGVuKTsKIAlhdG9taWNfaW5jKCZzZWNhdHRyLT5jYWNoZS0+cmVmY291bnQpOwpAQCAtNDQ3LDggKzQ0NywzMCBAQAogICovCiBpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKQogeworCXUzMiBpdGVyOworCiAJaWYgKGRvaV9kZWYgPT0gTlVMTCB8fCBkb2lfZGVmLT5kb2kgPT0gQ0lQU09fVjRfRE9JX1VOS05PV04pCiAJCXJldHVybiAtRUlOVkFMOworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBDSVBTT19WNF9UQUdfTUFYQ05UOyBpdGVyKyspIHsKKwkJc3dpdGNoIChkb2lfZGVmLT50YWdzW2l0ZXJdKSB7CisJCWNhc2UgQ0lQU09fVjRfVEFHX1JCSVRNQVA6CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfUkFOR0U6CisJCQlpZiAoZG9pX2RlZi0+dHlwZSAhPSBDSVBTT19WNF9NQVBfUEFTUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X1RBR19JTlZBTElEOgorCQkJaWYgKGl0ZXIgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X1RBR19FTlVNOgorCQkJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX1BBU1MpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQogCiAJZG9pX2RlZi0+dmFsaWQgPSAxOwogCUlOSVRfUkNVX0hFQUQoJmRvaV9kZWYtPnJjdSk7CkBAIC04MDUsOCArODI3LDcgQEAKIC8qKgogICogY2lwc29fdjRfbWFwX2NhdF9yYm1faHRvbiAtIFBlcmZvcm0gYSBjYXRlZ29yeSBtYXBwaW5nIGZyb20gaG9zdCB0byBuZXR3b3JrCiAgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCi0gKiBAaG9zdF9jYXQ6IHRoZSBjYXRlZ29yeSBiaXRtYXAgaW4gaG9zdCBmb3JtYXQKLSAqIEBob3N0X2NhdF9sZW46IHRoZSBsZW5ndGggb2YgdGhlIGhvc3QncyBjYXRlZ29yeSBiaXRtYXAgaW4gYnl0ZXMKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcwogICogQG5ldF9jYXQ6IHRoZSB6ZXJvJ2Qgb3V0IGNhdGVnb3J5IGJpdG1hcCBpbiBuZXR3b3JrL0NJUFNPIGZvcm1hdAogICogQG5ldF9jYXRfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBDSVBTTyBiaXRtYXAgaW4gYnl0ZXMKICAqCkBAIC04MTcsNTkgKzgzOCw1MSBAQAogICoKICAqLwogc3RhdGljIGludCBjaXBzb192NF9tYXBfY2F0X3JibV9odG9uKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCi0JCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3N0X2NhdCwKLQkJCQkgICAgIHUzMiBob3N0X2NhdF9sZW4sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAogCQkJCSAgICAgdW5zaWduZWQgY2hhciAqbmV0X2NhdCwKIAkJCQkgICAgIHUzMiBuZXRfY2F0X2xlbikKIHsKIAlpbnQgaG9zdF9zcG90ID0gLTE7Ci0JdTMyIG5ldF9zcG90OworCXUzMiBuZXRfc3BvdCA9IENJUFNPX1Y0X0lOVl9DQVQ7CiAJdTMyIG5ldF9zcG90X21heCA9IDA7Ci0JdTMyIGhvc3RfY2xlbl9iaXRzID0gaG9zdF9jYXRfbGVuICogODsKIAl1MzIgbmV0X2NsZW5fYml0cyA9IG5ldF9jYXRfbGVuICogODsKLQl1MzIgaG9zdF9jYXRfc2l6ZTsKLQl1MzIgKmhvc3RfY2F0X2FycmF5OworCXUzMiBob3N0X2NhdF9zaXplID0gMDsKKwl1MzIgKmhvc3RfY2F0X2FycmF5ID0gTlVMTDsKIAotCXN3aXRjaCAoZG9pX2RlZi0+dHlwZSkgewotCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6Ci0JCW5ldF9zcG90X21heCA9IGhvc3RfY2F0X2xlbjsKLQkJd2hpbGUgKG5ldF9zcG90X21heCA+IDAgJiYgaG9zdF9jYXRbbmV0X3Nwb3RfbWF4IC0gMV0gPT0gMCkKLQkJCW5ldF9zcG90X21heC0tOwotCQlpZiAobmV0X3Nwb3RfbWF4ID4gbmV0X2NhdF9sZW4pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtY3B5KG5ldF9jYXQsIGhvc3RfY2F0LCBuZXRfc3BvdF9tYXgpOwotCQlyZXR1cm4gbmV0X3Nwb3RfbWF4OwotCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwlpZiAoZG9pX2RlZi0+dHlwZSA9PSBDSVBTT19WNF9NQVBfU1REKSB7CiAJCWhvc3RfY2F0X3NpemUgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQubG9jYWxfc2l6ZTsKIAkJaG9zdF9jYXRfYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQubG9jYWw7Ci0JCWZvciAoOzspIHsKLQkJCWhvc3Rfc3BvdCA9IGNpcHNvX3Y0X2JpdG1hcF93YWxrKGhvc3RfY2F0LAotCQkJCQkJCSBob3N0X2NsZW5fYml0cywKLQkJCQkJCQkgaG9zdF9zcG90ICsgMSwKLQkJCQkJCQkgMSk7Ci0JCQlpZiAoaG9zdF9zcG90IDwgMCkKLQkJCQlicmVhazsKLQkJCWlmIChob3N0X3Nwb3QgPj0gaG9zdF9jYXRfc2l6ZSkKLQkJCQlyZXR1cm4gLUVQRVJNOwotCi0JCQluZXRfc3BvdCA9IGhvc3RfY2F0X2FycmF5W2hvc3Rfc3BvdF07Ci0JCQlpZiAobmV0X3Nwb3QgPj0gbmV0X2NsZW5fYml0cykKLQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCWNpcHNvX3Y0X2JpdG1hcF9zZXRiaXQobmV0X2NhdCwgbmV0X3Nwb3QsIDEpOwotCi0JCQlpZiAobmV0X3Nwb3QgPiBuZXRfc3BvdF9tYXgpCi0JCQkJbmV0X3Nwb3RfbWF4ID0gbmV0X3Nwb3Q7Ci0JCX0KLQotCQlpZiAoaG9zdF9zcG90ID09IC0yKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKCsrbmV0X3Nwb3RfbWF4ICUgOCkKLQkJCXJldHVybiBuZXRfc3BvdF9tYXggLyA4ICsgMTsKLQkJcmV0dXJuIG5ldF9zcG90X21heCAvIDg7CiAJfQogCi0JcmV0dXJuIC1FSU5WQUw7CisJZm9yICg7OykgeworCQlob3N0X3Nwb3QgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzZWNhdHRyLT5tbHNfY2F0LAorCQkJCQkJICAgICAgIGhvc3Rfc3BvdCArIDEpOworCQlpZiAoaG9zdF9zcG90IDwgMCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoZG9pX2RlZi0+dHlwZSkgeworCQljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgorCQkJbmV0X3Nwb3QgPSBob3N0X3Nwb3Q7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9NQVBfU1REOgorCQkJaWYgKGhvc3Rfc3BvdCA+PSBob3N0X2NhdF9zaXplKQorCQkJCXJldHVybiAtRVBFUk07CisJCQluZXRfc3BvdCA9IGhvc3RfY2F0X2FycmF5W2hvc3Rfc3BvdF07CisJCQlpZiAobmV0X3Nwb3QgPj0gQ0lQU09fVjRfSU5WX0NBVCkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG5ldF9zcG90ID49IG5ldF9jbGVuX2JpdHMpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJY2lwc29fdjRfYml0bWFwX3NldGJpdChuZXRfY2F0LCBuZXRfc3BvdCwgMSk7CisKKwkJaWYgKG5ldF9zcG90ID4gbmV0X3Nwb3RfbWF4KQorCQkJbmV0X3Nwb3RfbWF4ID0gbmV0X3Nwb3Q7CisJfQorCisJaWYgKCsrbmV0X3Nwb3RfbWF4ICUgOCkKKwkJcmV0dXJuIG5ldF9zcG90X21heCAvIDggKyAxOworCXJldHVybiBuZXRfc3BvdF9tYXggLyA4OwogfQogCiAvKioKQEAgLTg3NywxMDIgKzg5MCwzMzMgQEAKICAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KICAqIEBuZXRfY2F0OiB0aGUgY2F0ZWdvcnkgYml0bWFwIGluIG5ldHdvcmsvQ0lQU08gZm9ybWF0CiAgKiBAbmV0X2NhdF9sZW46IHRoZSBsZW5ndGggb2YgdGhlIENJUFNPIGJpdG1hcCBpbiBieXRlcwotICogQGhvc3RfY2F0OiB0aGUgemVybydkIG91dCBjYXRlZ29yeSBiaXRtYXAgaW4gaG9zdCBmb3JtYXQKLSAqIEBob3N0X2NhdF9sZW46IHRoZSBsZW5ndGggb2YgdGhlIGhvc3QncyBjYXRlZ29yeSBiaXRtYXAgaW4gYnl0ZXMKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcwogICoKICAqIERlc2NyaXB0aW9uOgogICogUGVyZm9ybSBhIGxhYmVsIG1hcHBpbmcgdG8gdHJhbnNsYXRlIGEgQ0lQU08gYml0bWFwIHRvIHRoZSBjb3JyZWN0IGxvY2FsCi0gKiBNTFMgY2F0ZWdvcnkgYml0bWFwIHVzaW5nIHRoZSBnaXZlbiBET0kgZGVmaW5pdGlvbi4gIFJldHVybnMgdGhlIG1pbmltdW0KLSAqIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGhvc3QgYml0bWFwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvdGhlcndpc2UuCisgKiBNTFMgY2F0ZWdvcnkgYml0bWFwIHVzaW5nIHRoZSBnaXZlbiBET0kgZGVmaW5pdGlvbi4gIFJldHVybnMgemVybyBvbgorICogc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCiBzdGF0aWMgaW50IGNpcHNvX3Y0X21hcF9jYXRfcmJtX250b2goY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKIAkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldF9jYXQsCiAJCQkJICAgICB1MzIgbmV0X2NhdF9sZW4sCi0JCQkJICAgICB1bnNpZ25lZCBjaGFyICpob3N0X2NhdCwKLQkJCQkgICAgIHUzMiBob3N0X2NhdF9sZW4pCisJCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQogewotCXUzMiBob3N0X3Nwb3Q7Ci0JdTMyIGhvc3Rfc3BvdF9tYXggPSAwOworCWludCByZXRfdmFsOwogCWludCBuZXRfc3BvdCA9IC0xOworCXUzMiBob3N0X3Nwb3QgPSBDSVBTT19WNF9JTlZfQ0FUOwogCXUzMiBuZXRfY2xlbl9iaXRzID0gbmV0X2NhdF9sZW4gKiA4OwotCXUzMiBob3N0X2NsZW5fYml0cyA9IGhvc3RfY2F0X2xlbiAqIDg7Ci0JdTMyIG5ldF9jYXRfc2l6ZTsKLQl1MzIgKm5ldF9jYXRfYXJyYXk7CisJdTMyIG5ldF9jYXRfc2l6ZSA9IDA7CisJdTMyICpuZXRfY2F0X2FycmF5ID0gTlVMTDsKIAotCXN3aXRjaCAoZG9pX2RlZi0+dHlwZSkgewotCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6Ci0JCWlmIChuZXRfY2F0X2xlbiA+IGhvc3RfY2F0X2xlbikKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1jcHkoaG9zdF9jYXQsIG5ldF9jYXQsIG5ldF9jYXRfbGVuKTsKLQkJcmV0dXJuIG5ldF9jYXRfbGVuOwotCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwlpZiAoZG9pX2RlZi0+dHlwZSA9PSBDSVBTT19WNF9NQVBfU1REKSB7CiAJCW5ldF9jYXRfc2l6ZSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5jaXBzb19zaXplOwogCQluZXRfY2F0X2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvOwotCQlmb3IgKDs7KSB7Ci0JCQluZXRfc3BvdCA9IGNpcHNvX3Y0X2JpdG1hcF93YWxrKG5ldF9jYXQsCi0JCQkJCQkJbmV0X2NsZW5fYml0cywKLQkJCQkJCQluZXRfc3BvdCArIDEsCi0JCQkJCQkJMSk7Ci0JCQlpZiAobmV0X3Nwb3QgPCAwKQotCQkJCWJyZWFrOwotCQkJaWYgKG5ldF9zcG90ID49IG5ldF9jYXRfc2l6ZSB8fAotCQkJICAgIG5ldF9jYXRfYXJyYXlbbmV0X3Nwb3RdID49IENJUFNPX1Y0X0lOVl9DQVQpCi0JCQkJcmV0dXJuIC1FUEVSTTsKKwl9CiAKLQkJCWhvc3Rfc3BvdCA9IG5ldF9jYXRfYXJyYXlbbmV0X3Nwb3RdOwotCQkJaWYgKGhvc3Rfc3BvdCA+PSBob3N0X2NsZW5fYml0cykKLQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCWNpcHNvX3Y0X2JpdG1hcF9zZXRiaXQoaG9zdF9jYXQsIGhvc3Rfc3BvdCwgMSk7Ci0KLQkJCWlmIChob3N0X3Nwb3QgPiBob3N0X3Nwb3RfbWF4KQotCQkJCWhvc3Rfc3BvdF9tYXggPSBob3N0X3Nwb3Q7CisJZm9yICg7OykgeworCQluZXRfc3BvdCA9IGNpcHNvX3Y0X2JpdG1hcF93YWxrKG5ldF9jYXQsCisJCQkJCQluZXRfY2xlbl9iaXRzLAorCQkJCQkJbmV0X3Nwb3QgKyAxLAorCQkJCQkJMSk7CisJCWlmIChuZXRfc3BvdCA8IDApIHsKKwkJCWlmIChuZXRfc3BvdCA9PSAtMikKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOwogCQl9CiAKLQkJaWYgKG5ldF9zcG90ID09IC0yKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKCsraG9zdF9zcG90X21heCAlIDgpCi0JCQlyZXR1cm4gaG9zdF9zcG90X21heCAvIDggKyAxOwotCQlyZXR1cm4gaG9zdF9zcG90X21heCAvIDg7CisJCXN3aXRjaCAoZG9pX2RlZi0+dHlwZSkgeworCQljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgorCQkJaG9zdF9zcG90ID0gbmV0X3Nwb3Q7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9NQVBfU1REOgorCQkJaWYgKG5ldF9zcG90ID49IG5ldF9jYXRfc2l6ZSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJaG9zdF9zcG90ID0gbmV0X2NhdF9hcnJheVtuZXRfc3BvdF07CisJCQlpZiAoaG9zdF9zcG90ID49IENJUFNPX1Y0X0lOVl9DQVQpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCXJldF92YWwgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfc2V0Yml0KHNlY2F0dHItPm1sc19jYXQsCisJCQkJCQkgICAgICAgaG9zdF9zcG90LAorCQkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJcmV0dXJuIHJldF92YWw7CiAJfQogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qKgorICogY2lwc29fdjRfbWFwX2NhdF9lbnVtX3ZhbGlkIC0gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgY2F0ZWdvcmllcyBhcmUgdmFsaWQKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBlbnVtY2F0OiBjYXRlZ29yeSBsaXN0CisgKiBAZW51bWNhdF9sZW46IGxlbmd0aCBvZiB0aGUgY2F0ZWdvcnkgbGlzdCBpbiBieXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBnaXZlbiBjYXRlZ29yaWVzIGFnYWluc3QgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uIGFuZCByZXR1cm5zIGEKKyAqIG5lZ2F0aXZlIHZhbHVlIGlmIGFueSBvZiB0aGUgY2F0ZWdvcmllcyBkbyBub3QgaGF2ZSBhIHZhbGlkIG1hcHBpbmcgYW5kIGEKKyAqIHplcm8gdmFsdWUgaWYgYWxsIG9mIHRoZSBjYXRlZ29yaWVzIGFyZSB2YWxpZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfbWFwX2NhdF9lbnVtX3ZhbGlkKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVudW1jYXQsCisJCQkJICAgICAgIHUzMiBlbnVtY2F0X2xlbikKK3sKKwl1MTYgY2F0OworCWludCBjYXRfcHJldiA9IC0xOworCXUzMiBpdGVyOworCisJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX1BBU1MgfHwgZW51bWNhdF9sZW4gJiAweDAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBlbnVtY2F0X2xlbjsgaXRlciArPSAyKSB7CisJCWNhdCA9IG50b2hzKCooKF9fYmUxNiAqKSZlbnVtY2F0W2l0ZXJdKSk7CisJCWlmIChjYXQgPD0gY2F0X3ByZXYpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJY2F0X3ByZXYgPSBjYXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2lwc29fdjRfbWFwX2NhdF9lbnVtX2h0b24gLSBQZXJmb3JtIGEgY2F0ZWdvcnkgbWFwcGluZyBmcm9tIGhvc3QgdG8gbmV0d29yaworICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKiBAbmV0X2NhdDogdGhlIHplcm8nZCBvdXQgY2F0ZWdvcnkgbGlzdCBpbiBuZXR3b3JrL0NJUFNPIGZvcm1hdAorICogQG5ldF9jYXRfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBDSVBTTyBjYXRlZ29yeSBsaXN0IGluIGJ5dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIGEgbGFiZWwgbWFwcGluZyB0byB0cmFuc2xhdGUgYSBsb2NhbCBNTFMgY2F0ZWdvcnkgYml0bWFwIHRvIHRoZQorICogY29ycmVjdCBDSVBTTyBjYXRlZ29yeSBsaXN0IHVzaW5nIHRoZSBnaXZlbiBET0kgZGVmaW5pdGlvbi4gICBSZXR1cm5zIHRoZQorICogc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV0d29yayBjYXRlZ29yeSBiaXRtYXAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzCisgKiBvdGhlcndpc2UuCisgKgorICovCitzdGF0aWMgaW50IGNpcHNvX3Y0X21hcF9jYXRfZW51bV9odG9uKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0ciwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICpuZXRfY2F0LAorCQkJCSAgICAgIHUzMiBuZXRfY2F0X2xlbikKK3sKKwlpbnQgY2F0ID0gLTE7CisJdTMyIGNhdF9pdGVyID0gMDsKKworCWZvciAoOzspIHsKKwkJY2F0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGsoc2VjYXR0ci0+bWxzX2NhdCwgY2F0ICsgMSk7CisJCWlmIChjYXQgPCAwKQorCQkJYnJlYWs7CisJCWlmICgoY2F0X2l0ZXIgKyAyKSA+IG5ldF9jYXRfbGVuKQorCQkJcmV0dXJuIC1FTk9TUEM7CisKKwkJKigoX19iZTE2ICopJm5ldF9jYXRbY2F0X2l0ZXJdKSA9IGh0b25zKGNhdCk7CisJCWNhdF9pdGVyICs9IDI7CisJfQorCisJcmV0dXJuIGNhdF9pdGVyOworfQorCisvKioKKyAqIGNpcHNvX3Y0X21hcF9jYXRfZW51bV9udG9oIC0gUGVyZm9ybSBhIGNhdGVnb3J5IG1hcHBpbmcgZnJvbSBuZXR3b3JrIHRvIGhvc3QKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBuZXRfY2F0OiB0aGUgY2F0ZWdvcnkgbGlzdCBpbiBuZXR3b3JrL0NJUFNPIGZvcm1hdAorICogQG5ldF9jYXRfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBDSVBTTyBiaXRtYXAgaW4gYnl0ZXMKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBhIGxhYmVsIG1hcHBpbmcgdG8gdHJhbnNsYXRlIGEgQ0lQU08gY2F0ZWdvcnkgbGlzdCB0byB0aGUgY29ycmVjdAorICogbG9jYWwgTUxTIGNhdGVnb3J5IGJpdG1hcCB1c2luZyB0aGUgZ2l2ZW4gRE9JIGRlZmluaXRpb24uICBSZXR1cm5zIHplcm8gb24KKyAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9tYXBfY2F0X2VudW1fbnRvaChjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldF9jYXQsCisJCQkJICAgICAgdTMyIG5ldF9jYXRfbGVuLAorCQkJCSAgICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJaW50IHJldF92YWw7CisJdTMyIGl0ZXI7CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgbmV0X2NhdF9sZW47IGl0ZXIgKz0gMikgeworCQlyZXRfdmFsID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldGJpdChzZWNhdHRyLT5tbHNfY2F0LAorCQkJCQkgICAgbnRvaHMoKigoX19iZTE2ICopJm5ldF9jYXRbaXRlcl0pKSwKKwkJCQkJICAgIEdGUF9BVE9NSUMpOworCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2lwc29fdjRfbWFwX2NhdF9ybmdfdmFsaWQgLSBDaGVja3MgdG8gc2VlIGlmIHRoZSBjYXRlZ29yaWVzIGFyZSB2YWxpZAorICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHJuZ2NhdDogY2F0ZWdvcnkgbGlzdAorICogQHJuZ2NhdF9sZW46IGxlbmd0aCBvZiB0aGUgY2F0ZWdvcnkgbGlzdCBpbiBieXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBnaXZlbiBjYXRlZ29yaWVzIGFnYWluc3QgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uIGFuZCByZXR1cm5zIGEKKyAqIG5lZ2F0aXZlIHZhbHVlIGlmIGFueSBvZiB0aGUgY2F0ZWdvcmllcyBkbyBub3QgaGF2ZSBhIHZhbGlkIG1hcHBpbmcgYW5kIGEKKyAqIHplcm8gdmFsdWUgaWYgYWxsIG9mIHRoZSBjYXRlZ29yaWVzIGFyZSB2YWxpZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfbWFwX2NhdF9ybmdfdmFsaWQoY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpybmdjYXQsCisJCQkJICAgICAgdTMyIHJuZ2NhdF9sZW4pCit7CisJdTE2IGNhdF9oaWdoOworCXUxNiBjYXRfbG93OworCXUzMiBjYXRfcHJldiA9IENJUFNPX1Y0X01BWF9SRU1fQ0FUUyArIDE7CisJdTMyIGl0ZXI7CisKKwlpZiAoZG9pX2RlZi0+dHlwZSAhPSBDSVBTT19WNF9NQVBfUEFTUyB8fCBybmdjYXRfbGVuICYgMHgwMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgcm5nY2F0X2xlbjsgaXRlciArPSA0KSB7CisJCWNhdF9oaWdoID0gbnRvaHMoKigoX19iZTE2ICopJnJuZ2NhdFtpdGVyXSkpOworCQlpZiAoKGl0ZXIgKyA0KSA8PSBybmdjYXRfbGVuKQorCQkJY2F0X2xvdyA9IG50b2hzKCooKF9fYmUxNiAqKSZybmdjYXRbaXRlciArIDJdKSk7CisJCWVsc2UKKwkJCWNhdF9sb3cgPSAwOworCisJCWlmIChjYXRfaGlnaCA+IGNhdF9wcmV2KQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY2F0X3ByZXYgPSBjYXRfbG93OworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNpcHNvX3Y0X21hcF9jYXRfcm5nX2h0b24gLSBQZXJmb3JtIGEgY2F0ZWdvcnkgbWFwcGluZyBmcm9tIGhvc3QgdG8gbmV0d29yaworICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKiBAbmV0X2NhdDogdGhlIHplcm8nZCBvdXQgY2F0ZWdvcnkgbGlzdCBpbiBuZXR3b3JrL0NJUFNPIGZvcm1hdAorICogQG5ldF9jYXRfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBDSVBTTyBjYXRlZ29yeSBsaXN0IGluIGJ5dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIGEgbGFiZWwgbWFwcGluZyB0byB0cmFuc2xhdGUgYSBsb2NhbCBNTFMgY2F0ZWdvcnkgYml0bWFwIHRvIHRoZQorICogY29ycmVjdCBDSVBTTyBjYXRlZ29yeSBsaXN0IHVzaW5nIHRoZSBnaXZlbiBET0kgZGVmaW5pdGlvbi4gICBSZXR1cm5zIHRoZQorICogc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV0d29yayBjYXRlZ29yeSBiaXRtYXAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzCisgKiBvdGhlcndpc2UuCisgKgorICovCitzdGF0aWMgaW50IGNpcHNvX3Y0X21hcF9jYXRfcm5nX2h0b24oY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyICpuZXRfY2F0LAorCQkJCSAgICAgdTMyIG5ldF9jYXRfbGVuKQoreworCS8qIFRoZSBjb25zdGFudCAnMTYnIGlzIG5vdCByYW5kb20sIGl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorCSAqIGhpZ2gvbG93IGNhdGVnb3J5IHJhbmdlIHBhaXJzIGFzIHBlcm1pdHRlZCBieSB0aGUgQ0lQU08gZHJhZnQgYmFzZWQKKwkgKiBvbiBhIG1heGltdW0gSVB2NCBoZWFkZXIgbGVuZ3RoIG9mIDYwIGJ5dGVzIC0gdGhlIEJVR19PTigpIGFzc2VydGlvbgorCSAqIGRvZXMgYSBzYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBhcnJheS4gKi8KKwlpbnQgaXRlciA9IC0xOworCXUxNiBhcnJheVsxNl07CisJdTMyIGFycmF5X2NudCA9IDA7CisJdTMyIGNhdF9zaXplID0gMDsKKworCUJVR19PTihuZXRfY2F0X2xlbiA+IDMwKTsKKworCWZvciAoOzspIHsKKwkJaXRlciA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrKHNlY2F0dHItPm1sc19jYXQsIGl0ZXIgKyAxKTsKKwkJaWYgKGl0ZXIgPCAwKQorCQkJYnJlYWs7CisJCWNhdF9zaXplICs9IChpdGVyID09IDAgPyAwIDogc2l6ZW9mKHUxNikpOworCQlpZiAoY2F0X3NpemUgPiBuZXRfY2F0X2xlbikKKwkJCXJldHVybiAtRU5PU1BDOworCQlhcnJheVthcnJheV9jbnQrK10gPSBpdGVyOworCisJCWl0ZXIgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2Fsa19ybmcoc2VjYXR0ci0+bWxzX2NhdCwgaXRlcik7CisJCWlmIChpdGVyIDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQljYXRfc2l6ZSArPSBzaXplb2YodTE2KTsKKwkJaWYgKGNhdF9zaXplID4gbmV0X2NhdF9sZW4pCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJYXJyYXlbYXJyYXlfY250KytdID0gaXRlcjsKKwl9CisKKwlmb3IgKGl0ZXIgPSAwOyBhcnJheV9jbnQgPiAwOykgeworCQkqKChfX2JlMTYgKikmbmV0X2NhdFtpdGVyXSkgPSBodG9ucyhhcnJheVstLWFycmF5X2NudF0pOworCQlpdGVyICs9IDI7CisJCWFycmF5X2NudC0tOworCQlpZiAoYXJyYXlbYXJyYXlfY250XSAhPSAwKSB7CisJCQkqKChfX2JlMTYgKikmbmV0X2NhdFtpdGVyXSkgPSBodG9ucyhhcnJheVthcnJheV9jbnRdKTsKKwkJCWl0ZXIgKz0gMjsKKwkJfQorCX0KKworCXJldHVybiBjYXRfc2l6ZTsKK30KKworLyoqCisgKiBjaXBzb192NF9tYXBfY2F0X3JuZ19udG9oIC0gUGVyZm9ybSBhIGNhdGVnb3J5IG1hcHBpbmcgZnJvbSBuZXR3b3JrIHRvIGhvc3QKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBuZXRfY2F0OiB0aGUgY2F0ZWdvcnkgbGlzdCBpbiBuZXR3b3JrL0NJUFNPIGZvcm1hdAorICogQG5ldF9jYXRfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBDSVBTTyBiaXRtYXAgaW4gYnl0ZXMKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBhIGxhYmVsIG1hcHBpbmcgdG8gdHJhbnNsYXRlIGEgQ0lQU08gY2F0ZWdvcnkgbGlzdCB0byB0aGUgY29ycmVjdAorICogbG9jYWwgTUxTIGNhdGVnb3J5IGJpdG1hcCB1c2luZyB0aGUgZ2l2ZW4gRE9JIGRlZmluaXRpb24uICBSZXR1cm5zIHplcm8gb24KKyAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9tYXBfY2F0X3JuZ19udG9oKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXRfY2F0LAorCQkJCSAgICAgdTMyIG5ldF9jYXRfbGVuLAorCQkJCSAgICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlpbnQgcmV0X3ZhbDsKKwl1MzIgbmV0X2l0ZXI7CisJdTE2IGNhdF9sb3c7CisJdTE2IGNhdF9oaWdoOworCisJZm9yKG5ldF9pdGVyID0gMDsgbmV0X2l0ZXIgPCBuZXRfY2F0X2xlbjsgbmV0X2l0ZXIgKz0gNCkgeworCQljYXRfaGlnaCA9IG50b2hzKCooKF9fYmUxNiAqKSZuZXRfY2F0W25ldF9pdGVyXSkpOworCQlpZiAoKG5ldF9pdGVyICsgNCkgPD0gbmV0X2NhdF9sZW4pCisJCQljYXRfbG93ID0gbnRvaHMoKigoX19iZTE2ICopJm5ldF9jYXRbbmV0X2l0ZXIgKyAyXSkpOworCQllbHNlCisJCQljYXRfbG93ID0gMDsKKworCQlyZXRfdmFsID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldHJuZyhzZWNhdHRyLT5tbHNfY2F0LAorCQkJCQkJICAgICAgIGNhdF9sb3csCisJCQkJCQkgICAgICAgY2F0X2hpZ2gsCisJCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CisJCWlmIChyZXRfdmFsICE9IDApCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFByb3RvY29sIEhhbmRsaW5nIEZ1bmN0aW9ucwogICovCiAKKyNkZWZpbmUgQ0lQU09fVjRfT1BUX0xFTl9NQVggICAgICAgICAgNDAKICNkZWZpbmUgQ0lQU09fVjRfSERSX0xFTiAgICAgICAgICAgICAgNgogCiAvKioKICAqIGNpcHNvX3Y0X2dlbnRhZ19oZHIgLSBHZW5lcmF0ZSBhIENJUFNPIG9wdGlvbiBoZWFkZXIKICAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KLSAqIEBsZW46IHRoZSB0b3RhbCB0YWcgbGVuZ3RoIGluIGJ5dGVzCisgKiBAbGVuOiB0aGUgdG90YWwgdGFnIGxlbmd0aCBpbiBieXRlcywgbm90IGluY2x1ZGluZyB0aGlzIGhlYWRlcgogICogQGJ1ZjogdGhlIENJUFNPIG9wdGlvbiBidWZmZXIKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIFdyaXRlIGEgQ0lQU08gaGVhZGVyIGludG8gdGhlIGJlZ2lubmluZyBvZiBAYnVmZmVyLiAgUmV0dXJuIHplcm8gb24gc3VjY2VzcywKLSAqIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogV3JpdGUgYSBDSVBTTyBoZWFkZXIgaW50byB0aGUgYmVnaW5uaW5nIG9mIEBidWZmZXIuCiAgKgogICovCi1zdGF0aWMgaW50IGNpcHNvX3Y0X2dlbnRhZ19oZHIoY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKLQkJCSAgICAgICB1MzIgbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGNpcHNvX3Y0X2dlbnRhZ19oZHIoY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCQl1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJdTMyIGxlbikKIHsKLQlpZiAoQ0lQU09fVjRfSERSX0xFTiArIGxlbiA+IDQwKQotCQlyZXR1cm4gLUVOT1NQQzsKLQogCWJ1ZlswXSA9IElQT1BUX0NJUFNPOwogCWJ1ZlsxXSA9IENJUFNPX1Y0X0hEUl9MRU4gKyBsZW47Ci0JKih1MzIgKikmYnVmWzJdID0gaHRvbmwoZG9pX2RlZi0+ZG9pKTsKLQotCXJldHVybiAwOworCSooX19iZTMyICopJmJ1ZlsyXSA9IGh0b25sKGRvaV9kZWYtPmRvaSk7CiB9CiAKLSNkZWZpbmUgQ0lQU09fVjRfVEFHMV9DQVRfTEVOICAgICAgICAgMzAKLQogLyoqCiAgKiBjaXBzb192NF9nZW50YWdfcmJtIC0gR2VuZXJhdGUgYSBDSVBTTyByZXN0cmljdGVkIGJpdG1hcCB0YWcgKHR5cGUgIzEpCiAgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCkBAIC05ODMsNjggKzEyMjcsNDkgQEAKICAqIERlc2NyaXB0aW9uOgogICogR2VuZXJhdGUgYSBDSVBTTyBvcHRpb24gdXNpbmcgdGhlIHJlc3RyaWN0ZWQgYml0bWFwIHRhZywgdGFnIHR5cGUgIzEuICBUaGUKICAqIGFjdHVhbCBidWZmZXIgbGVuZ3RoIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgaW5kaWNhdGVkIHNpemUgZHVlIHRvCi0gKiB0cmFuc2xhdGlvbiBiZXR3ZWVuIGhvc3QgYW5kIG5ldHdvcmsgY2F0ZWdvcnkgYml0bWFwcy4gIFJldHVybnMgemVybyBvbgotICogc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKiB0cmFuc2xhdGlvbiBiZXR3ZWVuIGhvc3QgYW5kIG5ldHdvcmsgY2F0ZWdvcnkgYml0bWFwcy4gIFJldHVybnMgdGhlIHNpemUgb2YKKyAqIHRoZSB0YWcgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCiBzdGF0aWMgaW50IGNpcHNvX3Y0X2dlbnRhZ19yYm0oY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAotCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipidWZmZXIsCi0JCQkgICAgICAgdTMyICpidWZmZXJfbGVuKQorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgICB1MzIgYnVmZmVyX2xlbikKIHsKLQlpbnQgcmV0X3ZhbCA9IC1FUEVSTTsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOwotCXUzMiBidWZfbGVuOworCWludCByZXRfdmFsOworCXUzMiB0YWdfbGVuOwogCXUzMiBsZXZlbDsKIAotCWlmIChzZWNhdHRyLT5tbHNfY2F0KSB7Ci0JCWJ1ZiA9IGt6YWxsb2MoQ0lQU09fVjRfSERSX0xFTiArIDQgKyBDSVBTT19WNF9UQUcxX0NBVF9MRU4sCi0JCQkgICAgICBHRlBfQVRPTUlDKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpID09IDApCisJCXJldHVybiAtRVBFUk07CiAKKwlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2x2bF9odG9uKGRvaV9kZWYsIHNlY2F0dHItPm1sc19sdmwsICZsZXZlbCk7CisJaWYgKHJldF92YWwgIT0gMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUKSB7CiAJCXJldF92YWwgPSBjaXBzb192NF9tYXBfY2F0X3JibV9odG9uKGRvaV9kZWYsCi0JCQkJCQkgICAgc2VjYXR0ci0+bWxzX2NhdCwKLQkJCQkJCSAgICBzZWNhdHRyLT5tbHNfY2F0X2xlbiwKLQkJCQkJCSAgICAmYnVmW0NJUFNPX1Y0X0hEUl9MRU4gKyA0XSwKLQkJCQkJCSAgICBDSVBTT19WNF9UQUcxX0NBVF9MRU4pOworCQkJCQkJICAgIHNlY2F0dHIsCisJCQkJCQkgICAgJmJ1ZmZlcls0XSwKKwkJCQkJCSAgICBidWZmZXJfbGVuIC0gNCk7CiAJCWlmIChyZXRfdmFsIDwgMCkKLQkJCWdvdG8gZ2VudGFnX2ZhaWx1cmU7CisJCQlyZXR1cm4gcmV0X3ZhbDsKIAogCQkvKiBUaGlzIHdpbGwgc2VuZCBwYWNrZXRzIHVzaW5nIHRoZSAib3B0aW1pemVkIiBmb3JtYXQgd2hlbgogCQkgKiBwb3NzaWJpbGUgYXMgc3BlY2lmaWVkIGluICBzZWN0aW9uIDMuNC4yLjYgb2YgdGhlCiAJCSAqIENJUFNPIGRyYWZ0LiAqLwotCQlpZiAoY2lwc29fdjRfcmJtX29wdGZtdCAmJiAocmV0X3ZhbCA+IDAgJiYgcmV0X3ZhbCA8IDEwKSkKLQkJCXJldF92YWwgPSAxMDsKKwkJaWYgKGNpcHNvX3Y0X3JibV9vcHRmbXQgJiYgcmV0X3ZhbCA+IDAgJiYgcmV0X3ZhbCA8PSAxMCkKKwkJCXRhZ19sZW4gPSAxNDsKKwkJZWxzZQorCQkJdGFnX2xlbiA9IDQgKyByZXRfdmFsOworCX0gZWxzZQorCQl0YWdfbGVuID0gNDsKIAotCQlidWZfbGVuID0gNCArIHJldF92YWw7Ci0JfSBlbHNlIHsKLQkJYnVmID0ga3phbGxvYyhDSVBTT19WNF9IRFJfTEVOICsgNCwgR0ZQX0FUT01JQyk7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlidWZfbGVuID0gNDsKLQl9CisJYnVmZmVyWzBdID0gMHgwMTsKKwlidWZmZXJbMV0gPSB0YWdfbGVuOworCWJ1ZmZlclszXSA9IGxldmVsOwogCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9sdmxfaHRvbihkb2lfZGVmLCBzZWNhdHRyLT5tbHNfbHZsLCAmbGV2ZWwpOwotCWlmIChyZXRfdmFsICE9IDApCi0JCWdvdG8gZ2VudGFnX2ZhaWx1cmU7Ci0KLQlyZXRfdmFsID0gY2lwc29fdjRfZ2VudGFnX2hkcihkb2lfZGVmLCBidWZfbGVuLCBidWYpOwotCWlmIChyZXRfdmFsICE9IDApCi0JCWdvdG8gZ2VudGFnX2ZhaWx1cmU7Ci0KLQlidWZbQ0lQU09fVjRfSERSX0xFTl0gPSAweDAxOwotCWJ1ZltDSVBTT19WNF9IRFJfTEVOICsgMV0gPSBidWZfbGVuOwotCWJ1ZltDSVBTT19WNF9IRFJfTEVOICsgM10gPSBsZXZlbDsKLQotCSpidWZmZXIgPSBidWY7Ci0JKmJ1ZmZlcl9sZW4gPSBDSVBTT19WNF9IRFJfTEVOICsgYnVmX2xlbjsKLQotCXJldHVybiAwOwotCi1nZW50YWdfZmFpbHVyZToKLQlrZnJlZShidWYpOwotCXJldHVybiByZXRfdmFsOworCXJldHVybiB0YWdfbGVuOwogfQogCiAvKioKQEAgLTEwNzEsMzIgKzEyOTYsMjA4IEBACiAJaWYgKHJldF92YWwgIT0gMCkKIAkJcmV0dXJuIHJldF92YWw7CiAJc2VjYXR0ci0+bWxzX2x2bCA9IGxldmVsOwotCXNlY2F0dHItPm1sc19sdmxfdmxkID0gMTsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfTFZMOwogCiAJaWYgKHRhZ19sZW4gPiA0KSB7Ci0JCXN3aXRjaCAoZG9pX2RlZi0+dHlwZSkgewotCQljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgotCQkJc2VjYXR0ci0+bWxzX2NhdF9sZW4gPSB0YWdfbGVuIC0gNDsKLQkJCWJyZWFrOwotCQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6Ci0JCQlzZWNhdHRyLT5tbHNfY2F0X2xlbiA9Ci0JCQkJZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmxvY2FsX3NpemU7Ci0JCQlicmVhazsKLQkJfQotCQlzZWNhdHRyLT5tbHNfY2F0ID0ga3phbGxvYyhzZWNhdHRyLT5tbHNfY2F0X2xlbiwgR0ZQX0FUT01JQyk7CisJCXNlY2F0dHItPm1sc19jYXQgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfYWxsb2MoR0ZQX0FUT01JQyk7CiAJCWlmIChzZWNhdHRyLT5tbHNfY2F0ID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2NhdF9yYm1fbnRvaChkb2lfZGVmLAogCQkJCQkJICAgICZ0YWdbNF0sCiAJCQkJCQkgICAgdGFnX2xlbiAtIDQsCi0JCQkJCQkgICAgc2VjYXR0ci0+bWxzX2NhdCwKLQkJCQkJCSAgICBzZWNhdHRyLT5tbHNfY2F0X2xlbik7Ci0JCWlmIChyZXRfdmFsIDwgMCkgewotCQkJa2ZyZWUoc2VjYXR0ci0+bWxzX2NhdCk7CisJCQkJCQkgICAgc2VjYXR0cik7CisJCWlmIChyZXRfdmFsICE9IDApIHsKKwkJCW5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlKHNlY2F0dHItPm1sc19jYXQpOwogCQkJcmV0dXJuIHJldF92YWw7CiAJCX0KLQkJc2VjYXR0ci0+bWxzX2NhdF9sZW4gPSByZXRfdmFsOworCisJCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX01MU19DQVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2lwc29fdjRfZ2VudGFnX2VudW0gLSBHZW5lcmF0ZSBhIENJUFNPIGVudW1lcmF0ZWQgdGFnICh0eXBlICMyKQorICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKiBAYnVmZmVyOiB0aGUgb3B0aW9uIGJ1ZmZlcgorICogQGJ1ZmZlcl9sZW46IGxlbmd0aCBvZiBidWZmZXIgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdlbmVyYXRlIGEgQ0lQU08gb3B0aW9uIHVzaW5nIHRoZSBlbnVtZXJhdGVkIHRhZywgdGFnIHR5cGUgIzIuICBSZXR1cm5zIHRoZQorICogc2l6ZSBvZiB0aGUgdGFnIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9nZW50YWdfZW51bShjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCWNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCXUzMiBidWZmZXJfbGVuKQoreworCWludCByZXRfdmFsOworCXUzMiB0YWdfbGVuOworCXUzMiBsZXZlbDsKKworCWlmICghKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTCkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2x2bF9odG9uKGRvaV9kZWYsIHNlY2F0dHItPm1sc19sdmwsICZsZXZlbCk7CisJaWYgKHJldF92YWwgIT0gMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUKSB7CisJCXJldF92YWwgPSBjaXBzb192NF9tYXBfY2F0X2VudW1faHRvbihkb2lfZGVmLAorCQkJCQkJICAgICBzZWNhdHRyLAorCQkJCQkJICAgICAmYnVmZmVyWzRdLAorCQkJCQkJICAgICBidWZmZXJfbGVuIC0gNCk7CisJCWlmIChyZXRfdmFsIDwgMCkKKwkJCXJldHVybiByZXRfdmFsOworCisJCXRhZ19sZW4gPSA0ICsgcmV0X3ZhbDsKKwl9IGVsc2UKKwkJdGFnX2xlbiA9IDQ7CisKKwlidWZmZXJbMF0gPSAweDAyOworCWJ1ZmZlclsxXSA9IHRhZ19sZW47CisJYnVmZmVyWzNdID0gbGV2ZWw7CisKKwlyZXR1cm4gdGFnX2xlbjsKK30KKworLyoqCisgKiBjaXBzb192NF9wYXJzZXRhZ19lbnVtIC0gUGFyc2UgYSBDSVBTTyBlbnVtZXJhdGVkIHRhZworICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHRhZzogdGhlIENJUFNPIHRhZworICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYXJzZSBhIENJUFNPIGVudW1lcmF0ZWQgdGFnICh0YWcgdHlwZSAjMikgYW5kIHJldHVybiB0aGUgc2VjdXJpdHkKKyAqIGF0dHJpYnV0ZXMgaW4gQHNlY2F0dHIuICBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZXMgdmFsdWVzIG9uCisgKiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9wYXJzZXRhZ19lbnVtKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWcsCisJCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQoreworCWludCByZXRfdmFsOworCXU4IHRhZ19sZW4gPSB0YWdbMV07CisJdTMyIGxldmVsOworCisJcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9sdmxfbnRvaChkb2lfZGVmLCB0YWdbM10sICZsZXZlbCk7CisJaWYgKHJldF92YWwgIT0gMCkKKwkJcmV0dXJuIHJldF92YWw7CisJc2VjYXR0ci0+bWxzX2x2bCA9IGxldmVsOworCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX01MU19MVkw7CisKKwlpZiAodGFnX2xlbiA+IDQpIHsKKwkJc2VjYXR0ci0+bWxzX2NhdCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9hbGxvYyhHRlBfQVRPTUlDKTsKKwkJaWYgKHNlY2F0dHItPm1sc19jYXQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJldF92YWwgPSBjaXBzb192NF9tYXBfY2F0X2VudW1fbnRvaChkb2lfZGVmLAorCQkJCQkJICAgICAmdGFnWzRdLAorCQkJCQkJICAgICB0YWdfbGVuIC0gNCwKKwkJCQkJCSAgICAgc2VjYXR0cik7CisJCWlmIChyZXRfdmFsICE9IDApIHsKKwkJCW5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlKHNlY2F0dHItPm1sc19jYXQpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKworCQlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNpcHNvX3Y0X2dlbnRhZ19ybmcgLSBHZW5lcmF0ZSBhIENJUFNPIHJhbmdlZCB0YWcgKHR5cGUgIzUpCisgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCisgKiBAc2VjYXR0cjogdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAqIEBidWZmZXI6IHRoZSBvcHRpb24gYnVmZmVyCisgKiBAYnVmZmVyX2xlbjogbGVuZ3RoIG9mIGJ1ZmZlciBpbiBieXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogR2VuZXJhdGUgYSBDSVBTTyBvcHRpb24gdXNpbmcgdGhlIHJhbmdlZCB0YWcsIHRhZyB0eXBlICM1LiAgUmV0dXJucyB0aGUKKyAqIHNpemUgb2YgdGhlIHRhZyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfZ2VudGFnX3JuZyhjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJICAgICAgIHUzMiBidWZmZXJfbGVuKQoreworCWludCByZXRfdmFsOworCXUzMiB0YWdfbGVuOworCXUzMiBsZXZlbDsKKworCWlmICghKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTCkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2x2bF9odG9uKGRvaV9kZWYsIHNlY2F0dHItPm1sc19sdmwsICZsZXZlbCk7CisJaWYgKHJldF92YWwgIT0gMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUKSB7CisJCXJldF92YWwgPSBjaXBzb192NF9tYXBfY2F0X3JuZ19odG9uKGRvaV9kZWYsCisJCQkJCQkgICAgc2VjYXR0ciwKKwkJCQkJCSAgICAmYnVmZmVyWzRdLAorCQkJCQkJICAgIGJ1ZmZlcl9sZW4gLSA0KTsKKwkJaWYgKHJldF92YWwgPCAwKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJdGFnX2xlbiA9IDQgKyByZXRfdmFsOworCX0gZWxzZQorCQl0YWdfbGVuID0gNDsKKworCWJ1ZmZlclswXSA9IDB4MDU7CisJYnVmZmVyWzFdID0gdGFnX2xlbjsKKwlidWZmZXJbM10gPSBsZXZlbDsKKworCXJldHVybiB0YWdfbGVuOworfQorCisvKioKKyAqIGNpcHNvX3Y0X3BhcnNldGFnX3JuZyAtIFBhcnNlIGEgQ0lQU08gcmFuZ2VkIHRhZworICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHRhZzogdGhlIENJUFNPIHRhZworICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYXJzZSBhIENJUFNPIHJhbmdlZCB0YWcgKHRhZyB0eXBlICM1KSBhbmQgcmV0dXJuIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKiBpbiBAc2VjYXR0ci4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlcyB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfcGFyc2V0YWdfcm5nKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhZywKKwkJCQkgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlpbnQgcmV0X3ZhbDsKKwl1OCB0YWdfbGVuID0gdGFnWzFdOworCXUzMiBsZXZlbDsKKworCXJldF92YWwgPSBjaXBzb192NF9tYXBfbHZsX250b2goZG9pX2RlZiwgdGFnWzNdLCAmbGV2ZWwpOworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCXNlY2F0dHItPm1sc19sdmwgPSBsZXZlbDsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfTFZMOworCisJaWYgKHRhZ19sZW4gPiA0KSB7CisJCXNlY2F0dHItPm1sc19jYXQgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfYWxsb2MoR0ZQX0FUT01JQyk7CisJCWlmIChzZWNhdHRyLT5tbHNfY2F0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2NhdF9ybmdfbnRvaChkb2lfZGVmLAorCQkJCQkJICAgICZ0YWdbNF0sCisJCQkJCQkgICAgdGFnX2xlbiAtIDQsCisJCQkJCQkgICAgc2VjYXR0cik7CisJCWlmIChyZXRfdmFsICE9IDApIHsKKwkJCW5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlKHNlY2F0dHItPm1sc19jYXQpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKworCQlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTE0MCw3ICsxNTQxLDcgQEAKIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYobnRvaGwoKigodTMyICopJm9wdFsyXSkpKTsKKwlkb2lfZGVmID0gY2lwc29fdjRfZG9pX3NlYXJjaChudG9obCgqKChfX2JlMzIgKikmb3B0WzJdKSkpOwogCWlmIChkb2lfZGVmID09IE5VTEwpIHsKIAkJZXJyX29mZnNldCA9IDI7CiAJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKQEAgLTExOTEsNiArMTU5Miw0NCBAQAogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X1RBR19FTlVNOgorCQkJaWYgKHRhZ19sZW4gPCA0KSB7CisJCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyICsgMTsKKwkJCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CisJCQl9CisKKwkJCWlmIChjaXBzb192NF9tYXBfbHZsX3ZhbGlkKGRvaV9kZWYsCisJCQkJCQkgICB0YWdbM10pIDwgMCkgeworCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDM7CisJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOworCQkJfQorCQkJaWYgKHRhZ19sZW4gPiA0ICYmCisJCQkgICAgY2lwc29fdjRfbWFwX2NhdF9lbnVtX3ZhbGlkKGRvaV9kZWYsCisJCQkJCQkJJnRhZ1s0XSwKKwkJCQkJCQl0YWdfbGVuIC0gNCkgPCAwKSB7CisJCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyICsgNDsKKwkJCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfUkFOR0U6CisJCQlpZiAodGFnX2xlbiA8IDQpIHsKKwkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXIgKyAxOworCQkJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKKwkJCX0KKworCQkJaWYgKGNpcHNvX3Y0X21hcF9sdmxfdmFsaWQoZG9pX2RlZiwKKwkJCQkJCSAgIHRhZ1szXSkgPCAwKSB7CisJCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyICsgMzsKKwkJCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CisJCQl9CisJCQlpZiAodGFnX2xlbiA+IDQgJiYKKwkJCSAgICBjaXBzb192NF9tYXBfY2F0X3JuZ192YWxpZChkb2lfZGVmLAorCQkJCQkJICAgICAgICZ0YWdbNF0sCisJCQkJCQkgICAgICAgdGFnX2xlbiAtIDQpIDwgMCkgeworCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDQ7CisJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOworCQkJfQorCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXI7CiAJCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CkBAIC0xMjY1LDcgKzE3MDQsNyBAQAogewogCWludCByZXRfdmFsID0gLUVQRVJNOwogCXUzMiBpdGVyOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqYnVmOwogCXUzMiBidWZfbGVuID0gMDsKIAl1MzIgb3B0X2xlbjsKIAlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gTlVMTDsKQEAgLTEyODEsMTcgKzE3MjAsNDAgQEAKIAlpZiAoc2sgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKKwkvKiBXZSBhbGxvY2F0ZSB0aGUgbWF4aW11bSBDSVBTTyBvcHRpb24gc2l6ZSBoZXJlIHNvIHdlIGFyZSBwcm9iYWJseQorCSAqIGJlaW5nIGEgbGl0dGxlIHdhc3RlZnVsLCBidXQgaXQgbWFrZXMgb3VyIGxpZmUgX211Y2hfIGVhc2llciBsYXRlcgorCSAqIG9uIGFuZCBhZnRlciBhbGwgd2UgYXJlIG9ubHkgdGFsa2luZyBhYm91dCA0MCBieXRlcy4gKi8KKwlidWZfbGVuID0gQ0lQU09fVjRfT1BUX0xFTl9NQVg7CisJYnVmID0ga21hbGxvYyhidWZfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcmV0X3ZhbCA9IC1FTk9NRU07CisJCWdvdG8gc29ja2V0X3NldGF0dHJfZmFpbHVyZTsKKwl9CisKIAkvKiBYWFggLSBUaGlzIGNvZGUgYXNzdW1lcyBvbmx5IG9uZSB0YWcgcGVyIENJUFNPIG9wdGlvbiB3aGljaCBpc24ndAogCSAqIHJlYWxseSBhIGdvb2QgYXNzdW1wdGlvbiB0byBtYWtlIGJ1dCBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQgdGhlIE1BQwogCSAqIHRhZ3MgcmlnaHQgbm93IGl0IGlzIGEgc2FmZSBhc3N1bXB0aW9uLiAqLwogCWl0ZXIgPSAwOwogCWRvIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgYnVmX2xlbik7CiAJCXN3aXRjaCAoZG9pX2RlZi0+dGFnc1tpdGVyXSkgewogCQljYXNlIENJUFNPX1Y0X1RBR19SQklUTUFQOgogCQkJcmV0X3ZhbCA9IGNpcHNvX3Y0X2dlbnRhZ19yYm0oZG9pX2RlZiwKLQkJCQkJCSAgICAgIHNlY2F0dHIsCi0JCQkJCQkgICAgICAmYnVmLAotCQkJCQkJICAgICAgJmJ1Zl9sZW4pOworCQkJCQkJICAgc2VjYXR0ciwKKwkJCQkJCSAgICZidWZbQ0lQU09fVjRfSERSX0xFTl0sCisJCQkJCQkgICBidWZfbGVuIC0gQ0lQU09fVjRfSERSX0xFTik7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfRU5VTToKKwkJCXJldF92YWwgPSBjaXBzb192NF9nZW50YWdfZW51bShkb2lfZGVmLAorCQkJCQkJICAgc2VjYXR0ciwKKwkJCQkJCSAgICZidWZbQ0lQU09fVjRfSERSX0xFTl0sCisJCQkJCQkgICBidWZfbGVuIC0gQ0lQU09fVjRfSERSX0xFTik7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfUkFOR0U6CisJCQlyZXRfdmFsID0gY2lwc29fdjRfZ2VudGFnX3JuZyhkb2lfZGVmLAorCQkJCQkJICAgc2VjYXR0ciwKKwkJCQkJCSAgICZidWZbQ0lQU09fVjRfSERSX0xFTl0sCisJCQkJCQkgICBidWZfbGVuIC0gQ0lQU09fVjRfSERSX0xFTik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldF92YWwgPSAtRVBFUk07CkBAIC0xMjk5LDExICsxNzYxLDEzIEBACiAJCX0KIAogCQlpdGVyKys7Ci0JfSB3aGlsZSAocmV0X3ZhbCAhPSAwICYmCisJfSB3aGlsZSAocmV0X3ZhbCA8IDAgJiYKIAkJIGl0ZXIgPCBDSVBTT19WNF9UQUdfTUFYQ05UICYmCiAJCSBkb2lfZGVmLT50YWdzW2l0ZXJdICE9IENJUFNPX1Y0X1RBR19JTlZBTElEKTsKLQlpZiAocmV0X3ZhbCAhPSAwKQorCWlmIChyZXRfdmFsIDwgMCkKIAkJZ290byBzb2NrZXRfc2V0YXR0cl9mYWlsdXJlOworCWNpcHNvX3Y0X2dlbnRhZ19oZHIoZG9pX2RlZiwgYnVmLCByZXRfdmFsKTsKKwlidWZfbGVuID0gQ0lQU09fVjRfSERSX0xFTiArIHJldF92YWw7CiAKIAkvKiBXZSBjYW4ndCB1c2UgaXBfb3B0aW9uc19nZXQoKSBkaXJlY3RseSBiZWNhdXNlIGl0IG1ha2VzIGEgY2FsbCB0bwogCSAqIGlwX29wdGlvbnNfZ2V0X2FsbG9jKCkgd2hpY2ggYWxsb2NhdGVzIG1lbW9yeSB3aXRoIEdGUF9LRVJORUwgYW5kCkBAIC0xMzcwLDE5ICsxODM0LDMzIEBACiAJaWYgKHJldF92YWwgPT0gMCkKIAkJcmV0dXJuIHJldF92YWw7CiAKLQlkb2kgPSBudG9obCgqKHUzMiAqKSZjaXBzb19wdHJbMl0pOworCWRvaSA9IG50b2hsKCooX19iZTMyICopJmNpcHNvX3B0clsyXSk7CiAJcmN1X3JlYWRfbG9jaygpOwotCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfZ2V0ZGVmKGRvaSk7CisJZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9zZWFyY2goZG9pKTsKIAlpZiAoZG9pX2RlZiA9PSBOVUxMKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT01TRzsKIAl9CisKKwkvKiBYWFggLSBUaGlzIGNvZGUgYXNzdW1lcyBvbmx5IG9uZSB0YWcgcGVyIENJUFNPIG9wdGlvbiB3aGljaCBpc24ndAorCSAqIHJlYWxseSBhIGdvb2QgYXNzdW1wdGlvbiB0byBtYWtlIGJ1dCBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQgdGhlIE1BQworCSAqIHRhZ3MgcmlnaHQgbm93IGl0IGlzIGEgc2FmZSBhc3N1bXB0aW9uLiAqLwogCXN3aXRjaCAoY2lwc29fcHRyWzZdKSB7CiAJY2FzZSBDSVBTT19WNF9UQUdfUkJJVE1BUDoKIAkJcmV0X3ZhbCA9IGNpcHNvX3Y0X3BhcnNldGFnX3JibShkb2lfZGVmLAogCQkJCQkJJmNpcHNvX3B0cls2XSwKIAkJCQkJCXNlY2F0dHIpOwogCQlicmVhazsKKwljYXNlIENJUFNPX1Y0X1RBR19FTlVNOgorCQlyZXRfdmFsID0gY2lwc29fdjRfcGFyc2V0YWdfZW51bShkb2lfZGVmLAorCQkJCQkJICZjaXBzb19wdHJbNl0sCisJCQkJCQkgc2VjYXR0cik7CisJCWJyZWFrOworCWNhc2UgQ0lQU09fVjRfVEFHX1JBTkdFOgorCQlyZXRfdmFsID0gY2lwc29fdjRfcGFyc2V0YWdfcm5nKGRvaV9kZWYsCisJCQkJCQkmY2lwc29fcHRyWzZdLAorCQkJCQkJc2VjYXR0cik7CisJCWJyZWFrOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtMTQzMCwyMyArMTkwOCwzMCBAQAogCXUzMiBkb2k7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZjsKIAotCWlmICghQ0lQU09fVjRfT1BURVhJU1Qoc2tiKSkKLQkJcmV0dXJuIC1FTk9NU0c7CiAJY2lwc29fcHRyID0gQ0lQU09fVjRfT1BUUFRSKHNrYik7CiAJaWYgKGNpcHNvX3Y0X2NhY2hlX2NoZWNrKGNpcHNvX3B0ciwgY2lwc29fcHRyWzFdLCBzZWNhdHRyKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWRvaSA9IG50b2hsKCoodTMyICopJmNpcHNvX3B0clsyXSk7CisJZG9pID0gbnRvaGwoKihfX2JlMzIgKikmY2lwc29fcHRyWzJdKTsKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYoZG9pKTsKKwlkb2lfZGVmID0gY2lwc29fdjRfZG9pX3NlYXJjaChkb2kpOwogCWlmIChkb2lfZGVmID09IE5VTEwpCiAJCWdvdG8gc2tidWZmX2dldGF0dHJfcmV0dXJuOworCisJLyogWFhYIC0gVGhpcyBjb2RlIGFzc3VtZXMgb25seSBvbmUgdGFnIHBlciBDSVBTTyBvcHRpb24gd2hpY2ggaXNuJ3QKKwkgKiByZWFsbHkgYSBnb29kIGFzc3VtcHRpb24gdG8gbWFrZSBidXQgc2luY2Ugd2Ugb25seSBzdXBwb3J0IHRoZSBNQUMKKwkgKiB0YWdzIHJpZ2h0IG5vdyBpdCBpcyBhIHNhZmUgYXNzdW1wdGlvbi4gKi8KIAlzd2l0Y2ggKGNpcHNvX3B0cls2XSkgewogCWNhc2UgQ0lQU09fVjRfVEFHX1JCSVRNQVA6CiAJCXJldF92YWwgPSBjaXBzb192NF9wYXJzZXRhZ19yYm0oZG9pX2RlZiwKIAkJCQkJCSZjaXBzb19wdHJbNl0sCiAJCQkJCQlzZWNhdHRyKTsKIAkJYnJlYWs7CisJY2FzZSBDSVBTT19WNF9UQUdfRU5VTToKKwkJcmV0X3ZhbCA9IGNpcHNvX3Y0X3BhcnNldGFnX2VudW0oZG9pX2RlZiwKKwkJCQkJCSAmY2lwc29fcHRyWzZdLAorCQkJCQkJIHNlY2F0dHIpOworCQlicmVhazsKIAl9CiAKIHNrYnVmZl9nZXRhdHRyX3JldHVybjoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCA3NjAyYzc5Li4yZmQ4OTkxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC01NzcsMjAgKzU3NywyMCBAQAogICoJRGV0ZXJtaW5lIGEgZGVmYXVsdCBuZXR3b3JrIG1hc2ssIGJhc2VkIG9uIHRoZSBJUCBhZGRyZXNzLgogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBpbmV0X2FiY19sZW4odTMyIGFkZHIpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5ldF9hYmNfbGVuKF9fYmUzMiBhZGRyKQogewogCWludCByYyA9IC0xOwkvKiBTb21ldGhpbmcgZWxzZSwgcHJvYmFibHkgYSBtdWx0aWNhc3QuICovCiAKICAgCWlmIChaRVJPTkVUKGFkZHIpKQogICAJCXJjID0gMDsKIAllbHNlIHsKLQkJYWRkciA9IG50b2hsKGFkZHIpOworCQlfX3UzMiBoYWRkciA9IG50b2hsKGFkZHIpOwogCi0JCWlmIChJTl9DTEFTU0EoYWRkcikpCisJCWlmIChJTl9DTEFTU0EoaGFkZHIpKQogCQkJcmMgPSA4OwotCQllbHNlIGlmIChJTl9DTEFTU0IoYWRkcikpCisJCWVsc2UgaWYgKElOX0NMQVNTQihoYWRkcikpCiAJCQlyYyA9IDE2OwotCQllbHNlIGlmIChJTl9DTEFTU0MoYWRkcikpCisJCWVsc2UgaWYgKElOX0NMQVNTQyhoYWRkcikpCiAJCQlyYyA9IDI0OwogCX0KIApAQCAtMTEyMCw2ICsxMTIwLDE2IEBACiAJLm5vdGlmaWVyX2NhbGwgPWluZXRkZXZfZXZlbnQsCiB9OwogCitzdGF0aWMgaW5saW5lIHNpemVfdCBpbmV0X25sbXNnX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGQV9BRERSRVNTICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZBX0xPQ0FMICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZBX0JST0FEQ0FTVCAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGQV9BTllDQVNUICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopOyAvKiBJRkFfTEFCRUwgKi8KK30KKwogc3RhdGljIGludCBpbmV0X2ZpbGxfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbl9pZmFkZHIgKmlmYSwKIAkJCSAgICB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncykKIHsKQEAgLTEyMDgsMTUgKzEyMTgsMTMgQEAKIAl1MzIgc2VxID0gbmxoID8gbmxoLT5ubG1zZ19zZXEgOiAwOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAotCXNrYiA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CisJc2tiID0gbmxtc2dfbmV3KGluZXRfbmxtc2dfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaW5ldF9maWxsX2lmYWRkcihza2IsIGlmYSwgcGlkLCBzZXEsIGV2ZW50LCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gaW5ldF9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIHBpZCwgUlROTEdSUF9JUFY0X0lGQUREUiwgbmxoLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKQEAgLTE1NTYsMTIgKzE1NjQsMTIgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5fZGV2ID8gaW5fZGV2LT5kZXYgOiBOVUxMOwotCXN0cnVjdCBkZXZpbmV0X3N5c2N0bF90YWJsZSAqdCA9IGttYWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGRldmluZXRfc3lzY3RsX3RhYmxlICp0ID0ga21lbWR1cCgmZGV2aW5ldF9zeXNjdGwsIHNpemVvZigqdCksCisJCQkJCQkgR0ZQX0tFUk5FTCk7CiAJY2hhciAqZGV2X25hbWUgPSBOVUxMOwogCiAJaWYgKCF0KQogCQlyZXR1cm47Ci0JbWVtY3B5KHQsICZkZXZpbmV0X3N5c2N0bCwgc2l6ZW9mKCp0KSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodC0+ZGV2aW5ldF92YXJzKSAtIDE7IGkrKykgewogCQl0LT5kZXZpbmV0X3ZhcnNbaV0uZGF0YSArPSAoY2hhciAqKXAgLSAoY2hhciAqKSZpcHY0X2RldmNvbmY7CiAJCXQtPmRldmluZXRfdmFyc1tpXS5kZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9lc3A0LmMgYi9uZXQvaXB2NC9lc3A0LmMKaW5kZXggYjVjMjA1Yi4uZjJjNjc3NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZXNwNC5jCisrKyBiL25ldC9pcHY0L2VzcDQuYwpAQCAtNjcsNyArNjcsNyBAQAogCWlmICh4LT5lbmNhcCkgewogCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICplbmNhcCA9IHgtPmVuY2FwOwogCQlzdHJ1Y3QgdWRwaGRyICp1aDsKLQkJdTMyICp1ZHBkYXRhMzI7CisJCV9fYmUzMiAqdWRwZGF0YTMyOwogCiAJCXVoID0gKHN0cnVjdCB1ZHBoZHIgKillc3BoOwogCQl1aC0+c291cmNlID0gZW5jYXAtPmVuY2FwX3Nwb3J0OwpAQCAtODEsNyArODEsNyBAQAogCQkJZXNwaCA9IChzdHJ1Y3QgaXBfZXNwX2hkciAqKSh1aCArIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQX05PTl9JS0U6Ci0JCQl1ZHBkYXRhMzIgPSAodTMyICopKHVoICsgMSk7CisJCQl1ZHBkYXRhMzIgPSAoX19iZTMyICopKHVoICsgMSk7CiAJCQl1ZHBkYXRhMzJbMF0gPSB1ZHBkYXRhMzJbMV0gPSAwOwogCQkJZXNwaCA9IChzdHJ1Y3QgaXBfZXNwX2hkciAqKSh1ZHBkYXRhMzIgKyAyKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwppbmRleCBhZjAxOTBkLi5kNDdiNzJhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYworKysgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwpAQCAtNzY4LDggKzc2OCw4IEBACiB7CiAJCiAJc3RydWN0IGZpYl9yZXN1bHQgICAgICAgcmVzOwotCXN0cnVjdCBmbG93aSAgICAgICAgICAgIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBmcm4tPmZsX2FkZHIsIAotCQkJCQkJCSAgICAuZndtYXJrID0gZnJuLT5mbF9md21hcmssCisJc3RydWN0IGZsb3dpICAgICAgICAgICAgZmwgPSB7IC5tYXJrID0gZnJuLT5mbF9tYXJrLAorCQkJCSAgICAgICAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBmcm4tPmZsX2FkZHIsCiAJCQkJCQkJICAgIC50b3MgPSBmcm4tPmZsX3RvcywKIAkJCQkJCQkgICAgLnNjb3BlID0gZnJuLT5mbF9zY29wZSB9IH0gfTsKIAlpZiAodGIpIHsKQEAgLTgxMSw3ICs4MTEsNiBAQAogCQogCXBpZCA9IG5saC0+bmxtc2dfcGlkOyAgICAgICAgICAgLypwaWQgb2Ygc2VuZGluZyBwcm9jZXNzICovCiAJTkVUTElOS19DQihza2IpLnBpZCA9IDA7ICAgICAgICAgLyogZnJvbSBrZXJuZWwgKi8KLQlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IHBpZDsKIAlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gMDsgIC8qIHVuaWNhc3QgKi8KIAluZXRsaW5rX3VuaWNhc3Qoc2ssIHNrYiwgcGlkLCBNU0dfRE9OVFdBSVQpOwogfSAgICAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKaW5kZXggMDg1MmI5Yy4uYjgzN2MzMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3J1bGVzLmMKKysrIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKQEAgLTQ0LDEwICs0NCw2IEBACiAJX19iZTMyCQkJc3JjbWFzazsKIAlfX2JlMzIJCQlkc3Q7CiAJX19iZTMyCQkJZHN0bWFzazsKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JdTMyCQkJZndtYXJrOwotCXUzMgkJCWZ3bWFzazsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCiAJdTMyCQkJdGNsYXNzaWQ7CiAjZW5kaWYKQEAgLTE2MCwxMSArMTU2LDYgQEAKIAlpZiAoci0+dG9zICYmIChyLT50b3MgIT0gZmwtPmZsNF90b3MpKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKLQlpZiAoKHItPmZ3bWFyayBeIGZsLT5mbDRfZndtYXJrKSAmIHItPmZ3bWFzaykKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQogCXJldHVybiAxOwogfQogCkBAIC0xNzksMTQgKzE3MCwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgZmliNF9ydWxlX3BvbGljeVtGUkFfTUFYKzFdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JW0ZSQV9JRk5BTUVdCT0geyAudHlwZSA9IE5MQV9TVFJJTkcsIC5sZW4gPSBJRk5BTVNJWiAtIDEgfSwKLQlbRlJBX1BSSU9SSVRZXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJRlJBX0dFTkVSSUNfUE9MSUNZLAogCVtGUkFfU1JDXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW0ZSQV9EU1RdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbRlJBX0ZXTUFSS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtGUkFfRldNQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW0ZSQV9GTE9XXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW0ZSQV9UQUJMRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBmaWI0X3J1bGVfY29uZmlndXJlKHN0cnVjdCBmaWJfcnVsZSAqcnVsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTIyMCwyMCArMjA3LDYgQEAKIAlpZiAodGJbRlJBX0RTVF0pCiAJCXJ1bGU0LT5kc3QgPSBubGFfZ2V0X2JlMzIodGJbRlJBX0RTVF0pOwogCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCWlmICh0YltGUkFfRldNQVJLXSkgewotCQlydWxlNC0+ZndtYXJrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pOwotCQlpZiAocnVsZTQtPmZ3bWFyaykKLQkJCS8qIGNvbXBhdGliaWxpdHk6IGlmIHRoZSBtYXJrIHZhbHVlIGlzIG5vbi16ZXJvIGFsbCBiaXRzCi0JCQkgKiBhcmUgY29tcGFyZWQgdW5sZXNzIGEgbWFzayBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLQkJCSAqLwotCQkJcnVsZTQtPmZ3bWFzayA9IDB4RkZGRkZGRkY7Ci0JfQotCi0JaWYgKHRiW0ZSQV9GV01BU0tdKQotCQlydWxlNC0+ZndtYXNrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFTS10pOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQogCWlmICh0YltGUkFfRkxPV10pCiAJCXJ1bGU0LT50Y2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GTE9XXSk7CkBAIC0yNjQsMTQgKzIzNyw2IEBACiAJaWYgKGZyaC0+dG9zICYmIChydWxlNC0+dG9zICE9IGZyaC0+dG9zKSkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JaWYgKHRiW0ZSQV9GV01BUktdICYmIChydWxlNC0+ZndtYXJrICE9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BUktdKSkpCi0JCXJldHVybiAwOwotCi0JaWYgKHRiW0ZSQV9GV01BU0tdICYmIChydWxlNC0+ZndtYXNrICE9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BU0tdKSkpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQogCWlmICh0YltGUkFfRkxPV10gJiYgKHJ1bGU0LT50Y2xhc3NpZCAhPSBubGFfZ2V0X3UzMih0YltGUkFfRkxPV10pKSkKIAkJcmV0dXJuIDA7CkBAIC0yOTYsMTQgKzI2MSw2IEBACiAJZnJoLT5zcmNfbGVuID0gcnVsZTQtPnNyY19sZW47CiAJZnJoLT50b3MgPSBydWxlNC0+dG9zOwogCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCWlmIChydWxlNC0+ZndtYXJrKQotCQlOTEFfUFVUX1UzMihza2IsIEZSQV9GV01BUkssIHJ1bGU0LT5md21hcmspOwotCi0JaWYgKHJ1bGU0LT5md21hc2sgfHwgcnVsZTQtPmZ3bWFyaykKLQkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVNLLCBydWxlNC0+ZndtYXNrKTsKLSNlbmRpZgotCiAJaWYgKHJ1bGU0LT5kc3RfbGVuKQogCQlOTEFfUFVUX0JFMzIoc2tiLCBGUkFfRFNULCBydWxlNC0+ZHN0KTsKIApAQCAtMzQyLDYgKzI5OSwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc2l6ZV90IGZpYjRfcnVsZV9ubG1zZ19wYXlsb2FkKHN0cnVjdCBmaWJfcnVsZSAqcnVsZSkKK3sKKwlyZXR1cm4gbmxhX3RvdGFsX3NpemUoNCkgLyogZHN0ICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogc3JjICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCk7IC8qIGZsb3cgKi8KK30KKwogc3RhdGljIHN0cnVjdCBmaWJfcnVsZXNfb3BzIGZpYjRfcnVsZXNfb3BzID0gewogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkucnVsZV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBmaWI0X3J1bGUpLApAQCAtMzUxLDYgKzMxNSw3IEBACiAJLmNvbXBhcmUJPSBmaWI0X3J1bGVfY29tcGFyZSwKIAkuZmlsbAkJPSBmaWI0X3J1bGVfZmlsbCwKIAkuZGVmYXVsdF9wcmVmCT0gZmliNF9ydWxlX2RlZmF1bHRfcHJlZiwKKwkubmxtc2dfcGF5bG9hZAk9IGZpYjRfcnVsZV9ubG1zZ19wYXlsb2FkLAogCS5ubGdyb3VwCT0gUlROTEdSUF9JUFY0X1JVTEUsCiAJLnBvbGljeQkJPSBmaWI0X3J1bGVfcG9saWN5LAogCS5ydWxlc19saXN0CT0gJmZpYjRfcnVsZXMsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggODg0ZDE3Ni4uZTYzYjhhOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMjczLDI1ICsyNzMsNDkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGZpYl9ubG1zZ19zaXplKHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJc2l6ZV90IHBheWxvYWQgPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKwkJCSArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9UQUJMRSAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX0RTVCAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX1BSSU9SSVRZICovCisJCQkgKyBubGFfdG90YWxfc2l6ZSg0KTsgLyogUlRBX1BSRUZTUkMgKi8KKworCS8qIHNwYWNlIGZvciBuZXN0ZWQgbWV0cmljcyAqLworCXBheWxvYWQgKz0gbmxhX3RvdGFsX3NpemUoKFJUQVhfTUFYICogbmxhX3RvdGFsX3NpemUoNCkpKTsKKworCWlmIChmaS0+ZmliX25ocykgeworCQkvKiBBbHNvIGhhbmRsZXMgdGhlIHNwZWNpYWwgY2FzZSBmaWJfbmhzID09IDEgKi8KKworCQkvKiBlYWNoIG5leHRob3AgaXMgcGFja2VkIGluIGFuIGF0dHJpYnV0ZSAqLworCQlzaXplX3QgbmhzaXplID0gbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBydG5leHRob3ApKTsKKworCQkvKiBtYXkgY29udGFpbiBmbG93IGFuZCBnYXRld2F5IGF0dHJpYnV0ZSAqLworCQluaHNpemUgKz0gMiAqIG5sYV90b3RhbF9zaXplKDQpOworCisJCS8qIGFsbCBuZXh0aG9wcyBhcmUgcGFja2VkIGluIGEgbmVzdGVkIGF0dHJpYnV0ZSAqLworCQlwYXlsb2FkICs9IG5sYV90b3RhbF9zaXplKGZpLT5maWJfbmhzICogbmhzaXplKTsKKwl9CisKKwlyZXR1cm4gcGF5bG9hZDsKK30KKwogdm9pZCBydG1zZ19maWIoaW50IGV2ZW50LCBfX2JlMzIga2V5LCBzdHJ1Y3QgZmliX2FsaWFzICpmYSwKIAkgICAgICAgaW50IGRzdF9sZW4sIHUzMiB0Yl9pZCwgc3RydWN0IG5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcGF5bG9hZCA9IHNpemVvZihzdHJ1Y3QgcnRtc2cpICsgMjU2OwogCXUzMiBzZXEgPSBpbmZvLT5ubGggPyBpbmZvLT5ubGgtPm5sbXNnX3NlcSA6IDA7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIEdGUF9LRVJORUwpOworCXNrYiA9IG5sbXNnX25ldyhmaWJfbmxtc2dfc2l6ZShmYS0+ZmFfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBmaWJfZHVtcF9pbmZvKHNrYiwgaW5mby0+cGlkLCBzZXEsIGV2ZW50LCB0Yl9pZCwKIAkJCSAgICBmYS0+ZmFfdHlwZSwgZmEtPmZhX3Njb3BlLCBrZXksIGRzdF9sZW4sCiAJCQkgICAgZmEtPmZhX3RvcywgZmEtPmZhX2luZm8sIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBmaWJfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBpbmZvLT5waWQsIFJUTkxHUlBfSVBWNF9ST1VURSwKIAkJCSAgaW5mby0+bmxoLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ljbXAuYyBiL25ldC9pcHY0L2ljbXAuYwppbmRleCBiMzlhMzdhLi40MGNmMGQwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pY21wLmMKKysrIGIvbmV0L2lwdjQvaWNtcC5jCkBAIC0zMzIsNyArMzMyLDcgQEAKIAkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWNtcF9ieG0gKmljbXBfcGFyYW0gPSAoc3RydWN0IGljbXBfYnhtICopZnJvbTsKLQl1bnNpZ25lZCBpbnQgY3N1bTsKKwlfX3dzdW0gY3N1bTsKIAogCWNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKGljbXBfcGFyYW0tPnNrYiwKIAkJCQkgICAgICBpY21wX3BhcmFtLT5vZmZzZXQgKyBvZmZzZXQsCkBAIC0zNTYsNyArMzU2LDcgQEAKIAkJaXBfZmx1c2hfcGVuZGluZ19mcmFtZXMoaWNtcF9zb2NrZXQtPnNrKTsKIAllbHNlIGlmICgoc2tiID0gc2tiX3BlZWsoJmljbXBfc29ja2V0LT5zay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7CiAJCXN0cnVjdCBpY21waGRyICppY21waCA9IHNrYi0+aC5pY21waDsKLQkJdW5zaWduZWQgaW50IGNzdW0gPSAwOworCQlfX3dzdW0gY3N1bSA9IDA7CiAJCXN0cnVjdCBza19idWZmICpza2IxOwogCiAJCXNrYl9xdWV1ZV93YWxrKCZpY21wX3NvY2tldC0+c2stPnNrX3dyaXRlX3F1ZXVlLCBza2IxKSB7CkBAIC05MzEsNyArOTMxLDcgQEAKIAogCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKIAljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQlpZiAoISh1MTYpY3N1bV9mb2xkKHNrYi0+Y3N1bSkpCisJCWlmICghY3N1bV9mb2xkKHNrYi0+Y3N1bSkpCiAJCQlicmVhazsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBDSEVDS1NVTV9OT05FOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDZlZWU3MTYuLjAwMTdjY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTkzMiw3ICs5MzIsNyBAQAogCiAJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewogCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6Ci0JCWlmICghKHUxNiljc3VtX2ZvbGQoc2tiLT5jc3VtKSkKKwkJaWYgKCFjc3VtX2ZvbGQoc2tiLT5jc3VtKSkKIAkJCWJyZWFrOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIENIRUNLU1VNX05PTkU6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwppbmRleCA5NmJiZTJhLi45ZDY4ODM3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKQEAgLTM0Myw3ICszNDMsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfcm91dGVfcmVxKTsKIAogc3RhdGljIGlubGluZSB1MzIgaW5ldF9zeW5xX2hhc2goY29uc3QgX19iZTMyIHJhZGRyLCBjb25zdCBfX2JlMTYgcnBvcnQsCi0JCQkJIGNvbnN0IHUzMiBybmQsIGNvbnN0IHUxNiBzeW5xX2hzaXplKQorCQkJCSBjb25zdCB1MzIgcm5kLCBjb25zdCB1MzIgc3lucV9oc2l6ZSkKIHsKIAlyZXR1cm4gamhhc2hfMndvcmRzKChfX2ZvcmNlIHUzMilyYWRkciwgKF9fZm9yY2UgdTMyKXJwb3J0LCBybmQpICYgKHN5bnFfaHNpemUgLSAxKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggZDViNWRlYy4uNDc2Y2I2MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogICovCiAKICNkZWZpbmUgSEFTSF9TSVpFICAxNgotI2RlZmluZSBIQVNIKGFkZHIpICgoYWRkcl4oYWRkcj4+NCkpJjB4RikKKyNkZWZpbmUgSEFTSChhZGRyKSAoKChfX2ZvcmNlIHUzMilhZGRyXigoX19mb3JjZSB1MzIpYWRkcj4+NCkpJjB4RikKIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbHNbNF1bSEFTSF9TSVpFXTsKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIC8qIEdpdmVuIHNyYywgZHN0IGFuZCBrZXksIGZpbmQgYXBwcm9wcmlhdGUgZm9yIGlucHV0IHR1bm5lbC4gKi8KIAotc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGdyZV90dW5uZWxfbG9va3VwKHUzMiByZW1vdGUsIHUzMiBsb2NhbCwgdTMyIGtleSkKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBncmVfdHVubmVsX2xvb2t1cChfX2JlMzIgcmVtb3RlLCBfX2JlMzIgbG9jYWwsIF9fYmUzMiBrZXkpCiB7CiAJdW5zaWduZWQgaDAgPSBIQVNIKHJlbW90ZSk7CiAJdW5zaWduZWQgaDEgPSBIQVNIKGtleSk7CkBAIC0xOTQsOSArMTk0LDkgQEAKIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKippcGdyZV9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKLQl1MzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCXUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKLQl1MzIga2V5ID0gdC0+cGFybXMuaV9rZXk7CisJX19iZTMyIHJlbW90ZSA9IHQtPnBhcm1zLmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSB0LT5wYXJtcy5pcGguc2FkZHI7CisJX19iZTMyIGtleSA9IHQtPnBhcm1zLmlfa2V5OwogCXVuc2lnbmVkIGggPSBIQVNIKGtleSk7CiAJaW50IHByaW8gPSAwOwogCkBAIC0yMzYsOSArMjM2LDkgQEAKIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGdyZV90dW5uZWxfbG9jYXRlKHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMsIGludCBjcmVhdGUpCiB7Ci0JdTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7Ci0JdTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKLQl1MzIga2V5ID0gcGFybXMtPmlfa2V5OworCV9fYmUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOworCV9fYmUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CisJX19iZTMyIGtleSA9IHBhcm1zLT5pX2tleTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBoID0gSEFTSChrZXkpOwpAQCAtMzE5LDEyICszMTksMTIgQEAKICAqLwogCiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7Ci0JdTE2CSAgICAgKnAgPSAodTE2Kikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOworCV9fYmUxNgkgICAgICpwID0gKF9fYmUxNiopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKIAlpbnQgZ3JlaGxlbiA9IChpcGgtPmlobDw8MikgKyA0OwogCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwogCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOwogCXN0cnVjdCBpcF90dW5uZWwgKnQ7Ci0JdTE2IGZsYWdzOworCV9fYmUxNiBmbGFnczsKIAogCWZsYWdzID0gcFswXTsKIAlpZiAoZmxhZ3MmKEdSRV9DU1VNfEdSRV9LRVl8R1JFX1NFUXxHUkVfUk9VVElOR3xHUkVfVkVSU0lPTikpIHsKQEAgLTM3MCw3ICszNzAsNyBAQAogCX0KIAogCXJlYWRfbG9jaygmaXBncmVfbG9jayk7Ci0JdCA9IGlwZ3JlX3R1bm5lbF9sb29rdXAoaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgKGZsYWdzJkdSRV9LRVkpID8gKigoKHUzMiopcCkgKyAoZ3JlaGxlbj4+MikgLSAxKSA6IDApOworCXQgPSBpcGdyZV90dW5uZWxfbG9va3VwKGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIChmbGFncyZHUkVfS0VZKSA/ICooKChfX2JlMzIqKXApICsgKGdyZWhsZW4+PjIpIC0gMSkgOiAwKTsKIAlpZiAodCA9PSBOVUxMIHx8IHQtPnBhcm1zLmlwaC5kYWRkciA9PSAwIHx8IE1VTFRJQ0FTVCh0LT5wYXJtcy5pcGguZGFkZHIpKQogCQlnb3RvIG91dDsKIApAQCAtMzg4LDE0ICszODgsMTQgQEAKICNlbHNlCiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKIAlzdHJ1Y3QgaXBoZHIgKmVpcGg7Ci0JdTE2CSAgICAgKnAgPSAodTE2KikoZHArKGlwaC0+aWhsPDwyKSk7CisJX19iZTE2CSAgICAgKnAgPSAoX19iZTE2KikoZHArKGlwaC0+aWhsPDwyKSk7CiAJaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7CiAJaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CiAJaW50IHJlbF90eXBlID0gMDsKIAlpbnQgcmVsX2NvZGUgPSAwOwogCV9fYmUzMiByZWxfaW5mbyA9IDA7CiAJX191MzIgbiA9IDA7Ci0JdTE2IGZsYWdzOworCV9fYmUxNiBmbGFnczsKIAlpbnQgZ3JlaGxlbiA9IChpcGgtPmlobDw8MikgKyA0OwogCXN0cnVjdCBza19idWZmICpza2IyOwogCXN0cnVjdCBmbG93aSBmbDsKQEAgLTU1Niw5ICs1NTYsOSBAQAogewogCXN0cnVjdCBpcGhkciAqaXBoOwogCXU4ICAgICAqaDsKLQl1MTYgICAgZmxhZ3M7Ci0JdTE2ICAgIGNzdW0gPSAwOwotCXUzMiAgICBrZXkgPSAwOworCV9fYmUxNiAgICBmbGFnczsKKwlfX3N1bTE2ICAgY3N1bSA9IDA7CisJX19iZTMyIGtleSA9IDA7CiAJdTMyICAgIHNlcW5vID0gMDsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CiAJaW50ICAgIG9mZnNldCA9IDQ7CkBAIC01NjgsNyArNTY4LDcgQEAKIAogCWlwaCA9IHNrYi0+bmguaXBoOwogCWggPSBza2ItPmRhdGE7Ci0JZmxhZ3MgPSAqKHUxNiopaDsKKwlmbGFncyA9ICooX19iZTE2KiloOwogCiAJaWYgKGZsYWdzJihHUkVfQ1NVTXxHUkVfS0VZfEdSRV9ST1VUSU5HfEdSRV9TRVF8R1JFX1ZFUlNJT04pKSB7CiAJCS8qIC0gVmVyc2lvbiBtdXN0IGJlIDAuCkBAIC01ODAsNyArNTgwLDcgQEAKIAkJaWYgKGZsYWdzJkdSRV9DU1VNKSB7CiAJCQlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJCQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQkJCWNzdW0gPSAodTE2KWNzdW1fZm9sZChza2ItPmNzdW0pOworCQkJCWNzdW0gPSBjc3VtX2ZvbGQoc2tiLT5jc3VtKTsKIAkJCQlpZiAoIWNzdW0pCiAJCQkJCWJyZWFrOwogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtNTkyLDExICs1OTIsMTEgQEAKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJCWlmIChmbGFncyZHUkVfS0VZKSB7Ci0JCQlrZXkgPSAqKHUzMiopKGggKyBvZmZzZXQpOworCQkJa2V5ID0gKihfX2JlMzIqKShoICsgb2Zmc2V0KTsKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJCWlmIChmbGFncyZHUkVfU0VRKSB7Ci0JCQlzZXFubyA9IG50b2hsKCoodTMyKikoaCArIG9mZnNldCkpOworCQkJc2Vxbm8gPSBudG9obCgqKF9fYmUzMiopKGggKyBvZmZzZXQpKTsKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJfQpAQCAtNjA1LDcgKzYwNSw3IEBACiAJaWYgKCh0dW5uZWwgPSBpcGdyZV90dW5uZWxfbG9va3VwKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIGtleSkpICE9IE5VTEwpIHsKIAkJc2VjcGF0aF9yZXNldChza2IpOwogCi0JCXNrYi0+cHJvdG9jb2wgPSAqKHUxNiopKGggKyAyKTsKKwkJc2tiLT5wcm90b2NvbCA9ICooX19iZTE2KikoaCArIDIpOwogCQkvKiBXQ0NQIHZlcnNpb24gMSBhbmQgMiBwcm90b2NvbCBkZWNvZGluZy4KIAkJICogLSBDaGFuZ2UgcHJvdG9jb2wgdG8gSVAKIAkJICogLSBXaGVuIGRlYWxpbmcgd2l0aCBXQ0NQdjIsIFNraXAgZXh0cmEgNCBieXRlcyBpbiBHUkUgaGVhZGVyCkBAIC02NzMsMTMgKzY3MywxMyBAQAogCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKIAlzdHJ1Y3QgaXBoZHIgICp0aXBoOwogCXU4ICAgICB0b3M7Ci0JdTE2ICAgIGRmOworCV9fYmUxNiBkZjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsgICAgIAkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KIAlzdHJ1Y3QgaXBoZHIgICppcGg7CQkJLyogT3VyIG5ldyBJUCBoZWFkZXIgKi8KIAlpbnQgICAgbWF4X2hlYWRyb29tOwkJCS8qIFRoZSBleHRyYSBoZWFkZXIgc3BhY2UgbmVlZGVkICovCiAJaW50ICAgIGdyZV9obGVuOwotCXUzMiAgICBkc3Q7CisJX19iZTMyIGRzdDsKIAlpbnQgICAgbXR1OwogCiAJaWYgKHR1bm5lbC0+cmVjdXJzaW9uKyspIHsKQEAgLTg2MCwxMSArODYwLDExIEBACiAJCQlpcGgtPnR0bCA9IGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9IT1BMSU1JVCk7CiAJfQogCi0JKCh1MTYqKShpcGgrMSkpWzBdID0gdHVubmVsLT5wYXJtcy5vX2ZsYWdzOwotCSgodTE2KikoaXBoKzEpKVsxXSA9IHNrYi0+cHJvdG9jb2w7CisJKChfX2JlMTYqKShpcGgrMSkpWzBdID0gdHVubmVsLT5wYXJtcy5vX2ZsYWdzOworCSgoX19iZTE2KikoaXBoKzEpKVsxXSA9IHNrYi0+cHJvdG9jb2w7CiAKIAlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJihHUkVfS0VZfEdSRV9DU1VNfEdSRV9TRVEpKSB7Ci0JCXUzMiAqcHRyID0gKHUzMiopKCgodTgqKWlwaCkgKyB0dW5uZWwtPmhsZW4gLSA0KTsKKwkJX19iZTMyICpwdHIgPSAoX19iZTMyKikoKCh1OCopaXBoKSArIHR1bm5lbC0+aGxlbiAtIDQpOwogCiAJCWlmICh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MmR1JFX1NFUSkgewogCQkJKyt0dW5uZWwtPm9fc2Vxbm87CkBAIC04NzcsNyArODc3LDcgQEAKIAkJfQogCQlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJkdSRV9DU1VNKSB7CiAJCQkqcHRyID0gMDsKLQkJCSooX191MTYqKXB0ciA9IGlwX2NvbXB1dGVfY3N1bSgodm9pZCopKGlwaCsxKSwgc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCQkqKF9fc3VtMTYqKXB0ciA9IGlwX2NvbXB1dGVfY3N1bSgodm9pZCopKGlwaCsxKSwgc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJCX0KIAl9CiAKQEAgLTEwNjgsNyArMTA2OCw3IEBACiB7CiAJc3RydWN0IGlwX3R1bm5lbCAqdCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCB0LT5obGVuKTsKLQl1MTYgKnAgPSAodTE2KikoaXBoKzEpOworCV9fYmUxNiAqcCA9IChfX2JlMTYqKShpcGgrMSk7CiAKIAltZW1jcHkoaXBoLCAmdC0+cGFybXMuaXBoLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJcFswXQkJPSB0LT5wYXJtcy5vX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCBmYzE5NWE0Li5hMzUyMDlkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CkBAIC0yODgsOSArMjg5LDggQEAKIAkJCSAgICAhKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9SRVJPVVRFRCkpOwogfQogCi1pbnQgaXBfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaXBmcmFnb2spCitpbnQgaXBfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssIGludCBpcGZyYWdvaykKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gaW5ldC0+b3B0OwogCXN0cnVjdCBydGFibGUgKnJ0OwpAQCAtMzQyLDcgKzM0Miw3IEBACiAKIAkvKiBPSywgd2Uga25vdyB3aGVyZSB0byBzZW5kIGl0LCBhbGxvY2F0ZSBhbmQgYnVpbGQgSVAgaGVhZGVyLiAqLwogCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIChvcHQgPyBvcHQtPm9wdGxlbiA6IDApKTsKLQkqKChfX3UxNiAqKWlwaCkJPSBodG9ucygoNCA8PCAxMikgfCAoNSA8PCA4KSB8IChpbmV0LT50b3MgJiAweGZmKSk7CisJKigoX19iZTE2ICopaXBoKSA9IGh0b25zKCg0IDw8IDEyKSB8ICg1IDw8IDgpIHwgKGluZXQtPnRvcyAmIDB4ZmYpKTsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CiAJaWYgKGlwX2RvbnRfZnJhZ21lbnQoc2ssICZydC0+dS5kc3QpICYmICFpcGZyYWdvaykKIAkJaXBoLT5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKQEAgLTM4Niw2ICszODYsNyBAQAogCWRzdF9yZWxlYXNlKHRvLT5kc3QpOwogCXRvLT5kc3QgPSBkc3RfY2xvbmUoZnJvbS0+ZHN0KTsKIAl0by0+ZGV2ID0gZnJvbS0+ZGV2OworCXRvLT5tYXJrID0gZnJvbS0+bWFyazsKIAogCS8qIENvcHkgdGhlIGZsYWdzIHRvIGVhY2ggZnJhZ21lbnQuICovCiAJSVBDQih0byktPmZsYWdzID0gSVBDQihmcm9tKS0+ZmxhZ3M7CkBAIC0zOTQsNyArMzk1LDYgQEAKIAl0by0+dGNfaW5kZXggPSBmcm9tLT50Y19pbmRleDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQl0by0+bmZtYXJrID0gZnJvbS0+bmZtYXJrOwogCS8qIENvbm5lY3Rpb24gYXNzb2NpYXRpb24gaXMgc2FtZSBhcyBwcmUtZnJhZyBwYWNrZXQgKi8KIAluZl9jb25udHJhY2tfcHV0KHRvLT5uZmN0KTsKIAl0by0+bmZjdCA9IGZyb20tPm5mY3Q7CkBAIC02ODMsNyArNjgzLDcgQEAKIAkJaWYgKG1lbWNweV9mcm9taW92ZWNlbmQodG8sIGlvdiwgb2Zmc2V0LCBsZW4pIDwgMCkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBjc3VtID0gMDsKKwkJX193c3VtIGNzdW0gPSAwOwogCQlpZiAoY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbWlvdmVjZW5kKHRvLCBpb3YsIG9mZnNldCwgbGVuLCAmY3N1bSkgPCAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXNrYi0+Y3N1bSA9IGNzdW1fYmxvY2tfYWRkKHNrYi0+Y3N1bSwgY3N1bSwgb2RkKTsKQEAgLTY5MSwxMSArNjkxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitzdGF0aWMgaW5saW5lIF9fd3N1bQogY3N1bV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LCBpbnQgY29weSkKIHsKIAljaGFyICprYWRkcjsKLQl1bnNpZ25lZCBpbnQgY3N1bTsKKwlfX3dzdW0gY3N1bTsKIAlrYWRkciA9IGttYXAocGFnZSk7CiAJY3N1bSA9IGNzdW1fcGFydGlhbChrYWRkciArIG9mZnNldCwgY29weSwgMCk7CiAJa3VubWFwKHBhZ2UpOwpAQCAtMTE2Nyw3ICsxMTY3LDcgQEAKIAkJfQogCiAJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKSB7Ci0JCQl1bnNpZ25lZCBpbnQgY3N1bTsKKwkJCV9fd3N1bSBjc3VtOwogCQkJY3N1bSA9IGNzdW1fcGFnZShwYWdlLCBvZmZzZXQsIGxlbik7CiAJCQlza2ItPmNzdW0gPSBjc3VtX2Jsb2NrX2FkZChza2ItPmNzdW0sIGNzdW0sIHNrYi0+bGVuKTsKIAkJfQpAQCAtMTMxNSw3ICsxMzE1LDcgQEAKIHN0YXRpYyBpbnQgaXBfcmVwbHlfZ2x1ZV9iaXRzKHZvaWQgKmRwdHIsIGNoYXIgKnRvLCBpbnQgb2Zmc2V0LCAKIAkJCSAgICAgIGludCBsZW4sIGludCBvZGQsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdW5zaWduZWQgaW50IGNzdW07CisJX193c3VtIGNzdW07CiAKIAljc3VtID0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhkcHRyK29mZnNldCwgdG8sIGxlbiwgMCk7CiAJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBvZGQpOwpAQCAtMTM4NSw3ICsxMzg1LDcgQEAKIAkJICAgICAgICZpcGMsIHJ0LCBNU0dfRE9OVFdBSVQpOwogCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpIHsKIAkJaWYgKGFyZy0+Y3N1bW9mZnNldCA+PSAwKQotCQkJKigodTE2ICopc2tiLT5oLnJhdyArIGFyZy0+Y3N1bW9mZnNldCkgPSBjc3VtX2ZvbGQoY3N1bV9hZGQoc2tiLT5jc3VtLCBhcmctPmNzdW0pKTsKKwkJCSooKF9fc3VtMTYgKilza2ItPmgucmF3ICsgYXJnLT5jc3Vtb2Zmc2V0KSA9IGNzdW1fZm9sZChjc3VtX2FkZChza2ItPmNzdW0sIGFyZy0+Y3N1bSkpOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJCWlwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCmluZGV4IDRiMTMyOTUuLjU3ZDRiYWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZy0+bXNnX25hbWU7CiAJaWYgKHNpbikgewogCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9ICoodTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCk7CisJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gKihfX2JlMzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KTsKIAkJc2luLT5zaW5fcG9ydCA9IHNlcnItPnBvcnQ7CiAJCW1lbXNldCgmc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGNvbmZpZy5jIGIvbmV0L2lwdjQvaXBjb25maWcuYwppbmRleCA5NTVhMDdhLi5hZmE2MGI5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbmZpZy5jCisrKyBiL25ldC9pcHY0L2lwY29uZmlnLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogI2RlZmluZSBDT05GX05BTUVTRVJWRVJTX01BWCAgIDMgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgbmFtZXNlcnZlcnMgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gJzMnIGZyb20gcmVzb2x2LmggKi8KIAorI2RlZmluZSBOT05FIF9fY29uc3RhbnRfaHRvbmwoSU5BRERSX05PTkUpCiAKIC8qCiAgKiBQdWJsaWMgSVAgY29uZmlndXJhdGlvbgpAQCAtMTI5LDE5ICsxMzAsMTkgQEAKIAogc3RhdGljIGludCBpY19ob3N0X25hbWVfc2V0IF9faW5pdGRhdGEgPSAwOwkvKiBIb3N0IG5hbWUgc2V0IGJ5IHVzPyAqLwogCi11MzIgaWNfbXlhZGRyID0gSU5BRERSX05PTkU7CQkvKiBNeSBJUCBhZGRyZXNzICovCi1zdGF0aWMgdTMyIGljX25ldG1hc2sgPSBJTkFERFJfTk9ORTsJLyogTmV0bWFzayBmb3IgbG9jYWwgc3VibmV0ICovCi11MzIgaWNfZ2F0ZXdheSA9IElOQUREUl9OT05FOwkvKiBHYXRld2F5IElQIGFkZHJlc3MgKi8KK19fYmUzMiBpY19teWFkZHIgPSBOT05FOwkJLyogTXkgSVAgYWRkcmVzcyAqLworc3RhdGljIF9fYmUzMiBpY19uZXRtYXNrID0gTk9ORTsJLyogTmV0bWFzayBmb3IgbG9jYWwgc3VibmV0ICovCitfX2JlMzIgaWNfZ2F0ZXdheSA9IE5PTkU7CS8qIEdhdGV3YXkgSVAgYWRkcmVzcyAqLwogCi11MzIgaWNfc2VydmFkZHIgPSBJTkFERFJfTk9ORTsJLyogQm9vdCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworX19iZTMyIGljX3NlcnZhZGRyID0gTk9ORTsJLyogQm9vdCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLwogCi11MzIgcm9vdF9zZXJ2ZXJfYWRkciA9IElOQUREUl9OT05FOwkvKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8KK19fYmUzMiByb290X3NlcnZlcl9hZGRyID0gTk9ORTsJLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCiB1OCByb290X3NlcnZlcl9wYXRoWzI1Nl0gPSB7IDAsIH07CS8qIFBhdGggdG8gbW91bnQgYXMgcm9vdCAqLwogCiAvKiBQZXJzaXN0ZW50IGRhdGE6ICovCiAKIHN0YXRpYyBpbnQgaWNfcHJvdG9fdXNlZDsJCQkvKiBQcm90b2NvbCB1c2VkLCBpZiBhbnkgKi8KLXN0YXRpYyB1MzIgaWNfbmFtZXNlcnZlcnNbQ09ORl9OQU1FU0VSVkVSU19NQVhdOyAvKiBETlMgU2VydmVyIElQIGFkZHJlc3NlcyAqLworc3RhdGljIF9fYmUzMiBpY19uYW1lc2VydmVyc1tDT05GX05BTUVTRVJWRVJTX01BWF07IC8qIEROUyBTZXJ2ZXIgSVAgYWRkcmVzc2VzICovCiBzdGF0aWMgdTggaWNfZG9tYWluWzY0XTsJCS8qIEROUyAobm90IE5JUykgZG9tYWluIG5hbWUgKi8KIAogLyoKQEAgLTE3Miw3ICsxNzMsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdW5zaWduZWQgc2hvcnQgZmxhZ3M7CiAJc2hvcnQgYWJsZTsKLQl1MzIgeGlkOworCV9fYmUzMiB4aWQ7CiB9OwogCiBzdGF0aWMgc3RydWN0IGljX2RldmljZSAqaWNfZmlyc3RfZGV2IF9faW5pdGRhdGEgPSBOVUxMOy8qIExpc3Qgb2Ygb3BlbiBkZXZpY2UgKi8KQEAgLTIyMyw3ICsyMjQsNyBAQAogCQkJZC0+ZmxhZ3MgPSBvZmxhZ3M7CiAJCQlkLT5hYmxlID0gYWJsZTsKIAkJCWlmIChhYmxlICYgSUNfQk9PVFApCi0JCQkJZ2V0X3JhbmRvbV9ieXRlcygmZC0+eGlkLCBzaXplb2YodTMyKSk7CisJCQkJZ2V0X3JhbmRvbV9ieXRlcygmZC0+eGlkLCBzaXplb2YoX19iZTMyKSk7CiAJCQllbHNlCiAJCQkJZC0+eGlkID0gMDsKIAkJCWljX3Byb3RvX2hhdmVfaWYgfD0gYWJsZTsKQEAgLTI2OSw3ICsyNzAsNyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCB1MzIgYWRkciwgdTE2IHBvcnQpCitzZXRfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyX2luICpzaW4sIF9fYmUzMiBhZGRyLCBfX2JlMTYgcG9ydCkKIHsKIAlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogCXNpbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKQEAgLTMzMiw3ICszMzMsNyBAQAogewogCS8qIE5vIG5lZWQgdG8gc2V0dXAgZGV2aWNlIHJvdXRlcywgb25seSB0aGUgZGVmYXVsdCByb3V0ZS4uLiAqLwogCi0JaWYgKGljX2dhdGV3YXkgIT0gSU5BRERSX05PTkUpIHsKKwlpZiAoaWNfZ2F0ZXdheSAhPSBOT05FKSB7CiAJCXN0cnVjdCBydGVudHJ5IHJtOwogCQlpbnQgZXJyOwogCkBAIC0zNjgsMTAgKzM2OSwxMCBAQAogCWlmICghaWNfaG9zdF9uYW1lX3NldCkKIAkJc3ByaW50Zihpbml0X3V0c25hbWUoKS0+bm9kZW5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfbXlhZGRyKSk7CiAKLQlpZiAocm9vdF9zZXJ2ZXJfYWRkciA9PSBJTkFERFJfTk9ORSkKKwlpZiAocm9vdF9zZXJ2ZXJfYWRkciA9PSBOT05FKQogCQlyb290X3NlcnZlcl9hZGRyID0gaWNfc2VydmFkZHI7CiAKLQlpZiAoaWNfbmV0bWFzayA9PSBJTkFERFJfTk9ORSkgeworCWlmIChpY19uZXRtYXNrID09IE5PTkUpIHsKIAkJaWYgKElOX0NMQVNTQShudG9obChpY19teWFkZHIpKSkKIAkJCWljX25ldG1hc2sgPSBodG9ubChJTl9DTEFTU0FfTkVUKTsKIAkJZWxzZSBpZiAoSU5fQ0xBU1NCKG50b2hsKGljX215YWRkcikpKQpAQCAtNDIwLDcgKzQyMSw3IEBACiB7CiAJc3RydWN0IGFycGhkciAqcmFycDsKIAl1bnNpZ25lZCBjaGFyICpyYXJwX3B0cjsKLQl1MzIgc2lwLCB0aXA7CisJX19iZTMyIHNpcCwgdGlwOwogCXVuc2lnbmVkIGNoYXIgKnNoYSwgKnRoYTsJCS8qIHMgZm9yICJzb3VyY2UiLCB0IGZvciAidGFyZ2V0IiAqLwogCXN0cnVjdCBpY19kZXZpY2UgKmQ7CiAKQEAgLTQ4NSwxMiArNDg2LDEyIEBACiAJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkvKiBEaXNjYXJkIHBhY2tldHMgd2hpY2ggYXJlIG5vdCBmcm9tIHNwZWNpZmllZCBzZXJ2ZXIuICovCi0JaWYgKGljX3NlcnZhZGRyICE9IElOQUREUl9OT05FICYmIGljX3NlcnZhZGRyICE9IHNpcCkKKwlpZiAoaWNfc2VydmFkZHIgIT0gTk9ORSAmJiBpY19zZXJ2YWRkciAhPSBzaXApCiAJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwogCWljX2RldiA9IGRldjsKLQlpZiAoaWNfbXlhZGRyID09IElOQUREUl9OT05FKQorCWlmIChpY19teWFkZHIgPT0gTk9ORSkKIAkJaWNfbXlhZGRyID0gdGlwOwogCWljX3NlcnZhZGRyID0gc2lwOwogCWljX2dvdF9yZXBseSA9IElDX1JBUlA7CkBAIC01MzAsMTMgKzUzMSwxMyBAQAogCXU4IGh0eXBlOwkJLyogSFcgYWRkcmVzcyB0eXBlICovCiAJdTggaGxlbjsJCS8qIEhXIGFkZHJlc3MgbGVuZ3RoICovCiAJdTggaG9wczsJCS8qIFVzZWQgb25seSBieSBnYXRld2F5cyAqLwotCXUzMiB4aWQ7CQkvKiBUcmFuc2FjdGlvbiBJRCAqLwotCXUxNiBzZWNzOwkJLyogU2Vjb25kcyBzaW5jZSB3ZSBzdGFydGVkICovCi0JdTE2IGZsYWdzOwkJLyogSnVzdCB3aGF0IGl0IHNheXMgKi8KLQl1MzIgY2xpZW50X2lwOwkJLyogQ2xpZW50J3MgSVAgYWRkcmVzcyBpZiBrbm93biAqLwotCXUzMiB5b3VyX2lwOwkJLyogQXNzaWduZWQgSVAgYWRkcmVzcyAqLwotCXUzMiBzZXJ2ZXJfaXA7CQkvKiAoTmV4dCwgZS5nLiBORlMpIFNlcnZlcidzIElQIGFkZHJlc3MgKi8KLQl1MzIgcmVsYXlfaXA7CQkvKiBJUCBhZGRyZXNzIG9mIEJPT1RQIHJlbGF5ICovCisJX19iZTMyIHhpZDsJCS8qIFRyYW5zYWN0aW9uIElEICovCisJX19iZTE2IHNlY3M7CQkvKiBTZWNvbmRzIHNpbmNlIHdlIHN0YXJ0ZWQgKi8KKwlfX2JlMTYgZmxhZ3M7CQkvKiBKdXN0IHdoYXQgaXQgc2F5cyAqLworCV9fYmUzMiBjbGllbnRfaXA7CQkvKiBDbGllbnQncyBJUCBhZGRyZXNzIGlmIGtub3duICovCisJX19iZTMyIHlvdXJfaXA7CQkvKiBBc3NpZ25lZCBJUCBhZGRyZXNzICovCisJX19iZTMyIHNlcnZlcl9pcDsJCS8qIChOZXh0LCBlLmcuIE5GUykgU2VydmVyJ3MgSVAgYWRkcmVzcyAqLworCV9fYmUzMiByZWxheV9pcDsJCS8qIElQIGFkZHJlc3Mgb2YgQk9PVFAgcmVsYXkgKi8KIAl1OCBod19hZGRyWzE2XTsJCS8qIENsaWVudCdzIEhXIGFkZHJlc3MgKi8KIAl1OCBzZXJ2X25hbWVbNjRdOwkvKiBTZXJ2ZXIgaG9zdCBuYW1lICovCiAJdTggYm9vdF9maWxlWzEyOF07CS8qIE5hbWUgb2YgYm9vdCBmaWxlICovCkBAIC01NzYsNyArNTc3LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdAogaWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCiB7Ci0JdTggbXQgPSAoKGljX3NlcnZhZGRyID09IElOQUREUl9OT05FKQorCXU4IG10ID0gKChpY19zZXJ2YWRkciA9PSBOT05FKQogCQkgPyBESENQRElTQ09WRVIgOiBESENQUkVRVUVTVCk7CiAJdTggKmUgPSBvcHRpb25zOwogCkBAIC02NjYsNyArNjY3LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKQotCQlpY19uYW1lc2VydmVyc1tpXSA9IElOQUREUl9OT05FOworCQlpY19uYW1lc2VydmVyc1tpXSA9IE5PTkU7CiAKIAlkZXZfYWRkX3BhY2soJmJvb3RwX3BhY2tldF90eXBlKTsKIH0KQEAgLTcwOCw3ICs3MDksNyBAQAogCWgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwogCWgtPnR0bCA9IDY0OwogCWgtPnByb3RvY29sID0gSVBQUk9UT19VRFA7Ci0JaC0+ZGFkZHIgPSBJTkFERFJfQlJPQURDQVNUOworCWgtPmRhZGRyID0gaHRvbmwoSU5BRERSX0JST0FEQ0FTVCk7CiAJaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKikgaCwgaC0+aWhsKTsKIAogCS8qIENvbnN0cnVjdCBVRFAgaGVhZGVyICovCkBAIC03MzAsOCArNzMxLDggQEAKIAkJYi0+aHR5cGUgPSBkZXYtPnR5cGU7IC8qIGNhbiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IgKi8KIAl9CiAJYi0+aGxlbiA9IGRldi0+YWRkcl9sZW47Ci0JYi0+eW91cl9pcCA9IElOQUREUl9OT05FOwotCWItPnNlcnZlcl9pcCA9IElOQUREUl9OT05FOworCWItPnlvdXJfaXAgPSBOT05FOworCWItPnNlcnZlcl9pcCA9IE5PTkU7CiAJbWVtY3B5KGItPmh3X2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOwogCWItPnNlY3MgPSBodG9ucyhqaWZmaWVzX2RpZmYgLyBIWik7CiAJYi0+eGlkID0gZC0+eGlkOwpAQCAtNzg4LDExICs3ODksMTEgQEAKIAogCXN3aXRjaCAoKmV4dCsrKSB7CiAJCWNhc2UgMToJCS8qIFN1Ym5ldCBtYXNrICovCi0JCQlpZiAoaWNfbmV0bWFzayA9PSBJTkFERFJfTk9ORSkKKwkJCWlmIChpY19uZXRtYXNrID09IE5PTkUpCiAJCQkJbWVtY3B5KCZpY19uZXRtYXNrLCBleHQrMSwgNCk7CiAJCQlicmVhazsKIAkJY2FzZSAzOgkJLyogRGVmYXVsdCBnYXRld2F5ICovCi0JCQlpZiAoaWNfZ2F0ZXdheSA9PSBJTkFERFJfTk9ORSkKKwkJCWlmIChpY19nYXRld2F5ID09IE5PTkUpCiAJCQkJbWVtY3B5KCZpY19nYXRld2F5LCBleHQrMSwgNCk7CiAJCQlicmVhazsKIAkJY2FzZSA2OgkJLyogRE5TIHNlcnZlciAqLwpAQCAtODAwLDcgKzgwMSw3IEBACiAJCQlpZiAoc2VydmVycyA+IENPTkZfTkFNRVNFUlZFUlNfTUFYKQogCQkJCXNlcnZlcnMgPSBDT05GX05BTUVTRVJWRVJTX01BWDsKIAkJCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJzOyBpKyspIHsKLQkJCQlpZiAoaWNfbmFtZXNlcnZlcnNbaV0gPT0gSU5BRERSX05PTkUpCisJCQkJaWYgKGljX25hbWVzZXJ2ZXJzW2ldID09IE5PTkUpCiAJCQkJCW1lbWNweSgmaWNfbmFtZXNlcnZlcnNbaV0sIGV4dCsxKzQqaSwgNCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTkxNyw3ICs5MTgsNyBAQAogCiAjaWZkZWYgSVBDT05GSUdfREhDUAogCQlpZiAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKSB7Ci0JCQl1MzIgc2VydmVyX2lkID0gSU5BRERSX05PTkU7CisJCQlfX2JlMzIgc2VydmVyX2lkID0gTk9ORTsKIAkJCWludCBtdCA9IDA7CiAKIAkJCWV4dCA9ICZiLT5leHRlbls0XTsKQEAgLTk0OSw3ICs5NTAsNyBAQAogCQkJCS8qIFdoaWxlIGluIHRoZSBwcm9jZXNzIG9mIGFjY2VwdGluZyBvbmUgb2ZmZXIsCiAJCQkJICogaWdub3JlIGFsbCBvdGhlcnMuCiAJCQkJICovCi0JCQkJaWYgKGljX215YWRkciAhPSBJTkFERFJfTk9ORSkKKwkJCQlpZiAoaWNfbXlhZGRyICE9IE5PTkUpCiAJCQkJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkJCQkvKiBMZXQncyBhY2NlcHQgdGhhdCBvZmZlci4gKi8KQEAgLTk2NSw3ICs5NjYsNyBAQAogCQkJCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGUgYm9vdHAgaGVhZGVyIG9uZSBpZgogCQkJCSAqIHRoZXkgYXJlIGRpZmZlcmVudC4KIAkJCQkgKi8KLQkJCQlpZiAoKHNlcnZlcl9pZCAhPSBJTkFERFJfTk9ORSkgJiYKKwkJCQlpZiAoKHNlcnZlcl9pZCAhPSBOT05FKSAmJgogCQkJCSAgICAoYi0+c2VydmVyX2lwICE9IHNlcnZlcl9pZCkpCiAJCQkJCWItPnNlcnZlcl9pcCA9IGljX3NlcnZhZGRyOwogCQkJCWJyZWFrOwpAQCAtOTc5LDggKzk4MCw4IEBACiAKIAkJCWRlZmF1bHQ6CiAJCQkJLyogVXJxdWUuICBGb3JnZXQgaXQqLwotCQkJCWljX215YWRkciA9IElOQUREUl9OT05FOwotCQkJCWljX3NlcnZhZGRyID0gSU5BRERSX05PTkU7CisJCQkJaWNfbXlhZGRyID0gTk9ORTsKKwkJCQlpY19zZXJ2YWRkciA9IE5PTkU7CiAJCQkJZ290byBkcm9wX3VubG9jazsKIAkJCX07CiAKQEAgLTEwMDQsOSArMTAwNSw5IEBACiAJaWNfZGV2ID0gZGV2OwogCWljX215YWRkciA9IGItPnlvdXJfaXA7CiAJaWNfc2VydmFkZHIgPSBiLT5zZXJ2ZXJfaXA7Ci0JaWYgKGljX2dhdGV3YXkgPT0gSU5BRERSX05PTkUgJiYgYi0+cmVsYXlfaXApCisJaWYgKGljX2dhdGV3YXkgPT0gTk9ORSAmJiBiLT5yZWxheV9pcCkKIAkJaWNfZ2F0ZXdheSA9IGItPnJlbGF5X2lwOwotCWlmIChpY19uYW1lc2VydmVyc1swXSA9PSBJTkFERFJfTk9ORSkKKwlpZiAoaWNfbmFtZXNlcnZlcnNbMF0gPT0gTk9ORSkKIAkJaWNfbmFtZXNlcnZlcnNbMF0gPSBpY19zZXJ2YWRkcjsKIAlpY19nb3RfcmVwbHkgPSBJQ19CT09UUDsKIApAQCAtMTE1MCw3ICsxMTUxLDcgQEAKICNlbmRpZgogCiAJaWYgKCFpY19nb3RfcmVwbHkpIHsKLQkJaWNfbXlhZGRyID0gSU5BRERSX05PTkU7CisJCWljX215YWRkciA9IE5PTkU7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTExODIsMTIgKzExODMsMTIgQEAKIAkJc2VxX3ByaW50ZihzZXEsCiAJCQkgICAiZG9tYWluICVzXG4iLCBpY19kb21haW4pOwogCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKSB7Ci0JCWlmIChpY19uYW1lc2VydmVyc1tpXSAhPSBJTkFERFJfTk9ORSkKKwkJaWYgKGljX25hbWVzZXJ2ZXJzW2ldICE9IE5PTkUpCiAJCQlzZXFfcHJpbnRmKHNlcSwKIAkJCQkgICAibmFtZXNlcnZlciAldS4ldS4ldS4ldVxuIiwKIAkJCQkgICBOSVBRVUFEKGljX25hbWVzZXJ2ZXJzW2ldKSk7CiAJfQotCWlmIChpY19zZXJ2YWRkciAhPSBJTkFERFJfTk9ORSkKKwlpZiAoaWNfc2VydmFkZHIgIT0gTk9ORSkKIAkJc2VxX3ByaW50ZihzZXEsCiAJCQkgICAiYm9vdHNlcnZlciAldS4ldS4ldS4ldVxuIiwKIAkJCSAgIE5JUFFVQUQoaWNfc2VydmFkZHIpKTsKQEAgLTEyMTMsOSArMTIxNCw5IEBACiAgKiAgbmVlZCB0byBoYXZlIHJvb3Rfc2VydmVyX2FkZHIgc2V0IF9iZWZvcmVfIElQQ29uZmlnIGdldHMgY2FsbGVkIGFzIGl0CiAgKiAgY2FuIG92ZXJyaWRlIGl0LgogICovCi11MzIgX19pbml0IHJvb3RfbmZzX3BhcnNlX2FkZHIoY2hhciAqbmFtZSkKK19fYmUzMiBfX2luaXQgcm9vdF9uZnNfcGFyc2VfYWRkcihjaGFyICpuYW1lKQogewotCXUzMiBhZGRyOworCV9fYmUzMiBhZGRyOwogCWludCBvY3RldHMgPSAwOwogCWNoYXIgKmNwLCAqY3E7CiAKQEAgLTEyMzcsNyArMTIzOCw3IEBACiAJCWFkZHIgPSBpbl9hdG9uKG5hbWUpOwogCQltZW1tb3ZlKG5hbWUsIGNwLCBzdHJsZW4oY3ApICsgMSk7CiAJfSBlbHNlCi0JCWFkZHIgPSBJTkFERFJfTk9ORTsKKwkJYWRkciA9IE5PTkU7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTEyNDgsNyArMTI0OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwX2F1dG9fY29uZmlnKHZvaWQpCiB7Ci0JdTMyIGFkZHI7CisJX19iZTMyIGFkZHI7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJwbnAiLCBTX0lSVUdPLCAmcG5wX3NlcV9mb3BzKTsKQEAgLTEyNzcsMTEgKzEyNzgsMTEgQEAKIAkgKiBpbnRlcmZhY2VzIGFuZCBubyBkZWZhdWx0IHdhcyBzZXQpLCB1c2UgQk9PVFAgb3IgUkFSUCB0byBnZXQgdGhlCiAJICogbWlzc2luZyB2YWx1ZXMuCiAJICovCi0JaWYgKGljX215YWRkciA9PSBJTkFERFJfTk9ORSB8fAorCWlmIChpY19teWFkZHIgPT0gTk9ORSB8fAogI2lmZGVmIENPTkZJR19ST09UX05GUwogCSAgICAoTUFKT1IoUk9PVF9ERVYpID09IFVOTkFNRURfTUFKT1IKLQkgICAgICYmIHJvb3Rfc2VydmVyX2FkZHIgPT0gSU5BRERSX05PTkUKLQkgICAgICYmIGljX3NlcnZhZGRyID09IElOQUREUl9OT05FKSB8fAorCSAgICAgJiYgcm9vdF9zZXJ2ZXJfYWRkciA9PSBOT05FCisJICAgICAmJiBpY19zZXJ2YWRkciA9PSBOT05FKSB8fAogI2VuZGlmCiAJICAgIGljX2ZpcnN0X2Rldi0+bmV4dCkgewogI2lmZGVmIElQQ09ORklHX0RZTkFNSUMKQEAgLTEzMzQsNyArMTMzNSw3IEBACiAJfQogCiAJYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIocm9vdF9zZXJ2ZXJfcGF0aCk7Ci0JaWYgKHJvb3Rfc2VydmVyX2FkZHIgPT0gSU5BRERSX05PTkUpCisJaWYgKHJvb3Rfc2VydmVyX2FkZHIgPT0gTk9ORSkKIAkJcm9vdF9zZXJ2ZXJfYWRkciA9IGFkZHI7CiAKIAkvKgpAQCAtMTQ2MSwxOSArMTQ2MiwxOSBAQAogCQkJc3dpdGNoIChudW0pIHsKIAkJCWNhc2UgMDoKIAkJCQlpZiAoKGljX215YWRkciA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQotCQkJCQlpY19teWFkZHIgPSBJTkFERFJfTk9ORTsKKwkJCQkJaWNfbXlhZGRyID0gTk9ORTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMToKIAkJCQlpZiAoKGljX3NlcnZhZGRyID0gaW5fYXRvbihpcCkpID09IElOQUREUl9BTlkpCi0JCQkJCWljX3NlcnZhZGRyID0gSU5BRERSX05PTkU7CisJCQkJCWljX3NlcnZhZGRyID0gTk9ORTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjoKIAkJCQlpZiAoKGljX2dhdGV3YXkgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKLQkJCQkJaWNfZ2F0ZXdheSA9IElOQUREUl9OT05FOworCQkJCQlpY19nYXRld2F5ID0gTk9ORTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMzoKIAkJCQlpZiAoKGljX25ldG1hc2sgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKLQkJCQkJaWNfbmV0bWFzayA9IElOQUREUl9OT05FOworCQkJCQlpY19uZXRtYXNrID0gTk9ORTsKIAkJCQlicmVhazsKIAkJCWNhc2UgNDoKIAkJCQlpZiAoKGRwID0gc3RyY2hyKGlwLCAnLicpKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDBjNDU1NjUuLjlkNzE5ZDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAKICNkZWZpbmUgSEFTSF9TSVpFICAxNgotI2RlZmluZSBIQVNIKGFkZHIpICgoYWRkcl4oYWRkcj4+NCkpJjB4RikKKyNkZWZpbmUgSEFTSChhZGRyKSAoKChfX2ZvcmNlIHUzMilhZGRyXigoX19mb3JjZSB1MzIpYWRkcj4+NCkpJjB4RikKIAogc3RhdGljIGludCBpcGlwX2ZiX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBpcGlwX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIHN0YXRpYyBERUZJTkVfUldMT0NLKGlwaXBfbG9jayk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBpcF90dW5uZWxfbG9va3VwKHUzMiByZW1vdGUsIHUzMiBsb2NhbCkKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBpcF90dW5uZWxfbG9va3VwKF9fYmUzMiByZW1vdGUsIF9fYmUzMiBsb2NhbCkKIHsKIAl1bnNpZ25lZCBoMCA9IEhBU0gocmVtb3RlKTsKIAl1bnNpZ25lZCBoMSA9IEhBU0gobG9jYWwpOwpAQCAtMTYwLDggKzE2MCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqaXBpcF9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKLQl1MzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCXUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKKwlfX2JlMzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOworCV9fYmUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKIAl1bnNpZ25lZCBoID0gMDsKIAlpbnQgcHJpbyA9IDA7CiAKQEAgLTIwMyw4ICsyMDMsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwaXBfdHVubmVsX2xvY2F0ZShzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zLCBpbnQgY3JlYXRlKQogewotCXUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOwotCXUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CisJX19iZTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7CisJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBoID0gMDsKQEAgLTUxOSwxMyArNTE5LDEzIEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnR1bm5lbC0+c3RhdDsKIAlzdHJ1Y3QgaXBoZHIgICp0aXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOwogCXU4ICAgICB0b3MgPSB0dW5uZWwtPnBhcm1zLmlwaC50b3M7Ci0JdTE2ICAgIGRmID0gdGlwaC0+ZnJhZ19vZmY7CisJX19iZTE2IGRmID0gdGlwaC0+ZnJhZ19vZmY7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7ICAgICAJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwkJCS8qIERldmljZSB0byBvdGhlciBob3N0ICovCiAJc3RydWN0IGlwaGRyICAqb2xkX2lwaCA9IHNrYi0+bmguaXBoOwogCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLwogCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KLQl1MzIgICAgZHN0ID0gdGlwaC0+ZGFkZHI7CisJX19iZTMyIGRzdCA9IHRpcGgtPmRhZGRyOwogCWludCAgICBtdHU7CiAKIAlpZiAodHVubmVsLT5yZWN1cnNpb24rKykgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDk3Y2ZhOTcuLmVmY2Y0NWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTE0OTMsNyArMTQ5Myw3IEBACiAgICAgICAgIGlmIChwaW0tPnR5cGUgIT0gKChQSU1fVkVSU0lPTjw8NCl8KFBJTV9SRUdJU1RFUikpIHx8CiAJICAgIChwaW0tPmZsYWdzJlBJTV9OVUxMX1JFR0lTVEVSKSB8fAogCSAgICAoaXBfY29tcHV0ZV9jc3VtKCh2b2lkICopcGltLCBzaXplb2YoKnBpbSkpICE9IDAgJiYgCi0JICAgICAodTE2KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgMCkpKSkgCisJICAgICBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIDApKSkpCiAJCWdvdG8gZHJvcDsKIAogCS8qIGNoZWNrIGlmIHRoZSBpbm5lciBwYWNrZXQgaXMgZGVzdGluZWQgdG8gbWNhc3QgZ3JvdXAgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2FwcC5jCmluZGV4IGU3NzUyMzMuLjZjNDA4OTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYwpAQCAtODAsMTAgKzgwLDkgQEAKIAlpZiAoIXBwLT51bnJlZ2lzdGVyX2FwcCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaW5jID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX2FwcCksIEdGUF9LRVJORUwpOworCWluYyA9IGttZW1kdXAoYXBwLCBzaXplb2YoKmluYyksIEdGUF9LRVJORUwpOwogCWlmICghaW5jKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1jcHkoaW5jLCBhcHAsIHNpemVvZigqaW5jKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmluYy0+cF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmaW5jLT5pbmNzX2xpc3QpOwogCWluYy0+YXBwID0gYXBwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwppbmRleCAxNDQ1YmI0Li4zNDI1NzUyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtNTM2LDkgKzUzNiw5IEBACiAJcmV0dXJuIE5GX1NUT1A7CiB9CiAKLXUxNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQorX19zdW0xNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQogewotCXJldHVybiAodTE2KSBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCkpOworCXJldHVybiBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCkpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsYy5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKaW5kZXggNTI0NzUxZS4uYTQzODVhMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKIC8qIGZvciBzeXNjdGwgKi8KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jCmluZGV4IDA4OTkwMTkuLmZlMWFmNWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGNyLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKIC8qIGZvciBzeXNjdGwgKi8KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90by5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90by5jCmluZGV4IGM0NTI4YjUuLmU4NDRkZGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG8uYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvLmMKQEAgLTExOCwxMyArMTE4LDcgQEAKIGludCAqCiBpcF92c19jcmVhdGVfdGltZW91dF90YWJsZShpbnQgKnRhYmxlLCBpbnQgc2l6ZSkKIHsKLQlpbnQgKnQ7Ci0KLQl0ID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAodCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkodCwgdGFibGUsIHNpemUpOwotCXJldHVybiB0OworCXJldHVybiBrbWVtZHVwKHRhYmxlLCBzaXplLCBHRlBfQVRPTUlDKTsKIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYwppbmRleCA2ZmYwNWMzLi4xNmE5ZWJlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAl9CiAKIAlpZiAodGgtPnN5biAmJgotCSAgICAoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5uZm1hcmssIHNrYi0+bmguaXBoLT5wcm90b2NvbCwKKwkgICAgKHN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KHNrYi0+bWFyaywgc2tiLT5uaC5pcGgtPnByb3RvY29sLAogCQkJCSAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLCB0aC0+ZGVzdCkpKSB7CiAJCWlmIChpcF92c190b2Ryb3AoKSkgewogCQkJLyoKQEAgLTExNiw5ICsxMTYsOSBAQAogCQkgICAgIF9fYmUxNiBvbGRwb3J0LCBfX2JlMTYgbmV3cG9ydCkKIHsKIAl0Y3BoLT5jaGVjayA9Ci0JCWlwX3ZzX2NoZWNrX2RpZmYofm9sZGlwLCBuZXdpcCwKLQkJCQkgaXBfdnNfY2hlY2tfZGlmZihvbGRwb3J0IF4gaHRvbnMoMHhGRkZGKSwKLQkJCQkJCSAgbmV3cG9ydCwgdGNwaC0+Y2hlY2spKTsKKwkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmY0KG9sZGlwLCBuZXdpcCwKKwkJCQkgaXBfdnNfY2hlY2tfZGlmZjIob2xkcG9ydCwgbmV3cG9ydCwKKwkJCQkJCX5jc3VtX3VuZm9sZCh0Y3BoLT5jaGVjaykpKSk7CiB9CiAKIApAQCAtNDkwLDE2ICs0OTAsMTggQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHRjcF9hcHBzW1RDUF9BUFBfVEFCX1NJWkVdOwogc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfYXBwX2xvY2spOwogCi1zdGF0aWMgaW5saW5lIF9fdTE2IHRjcF9hcHBfaGFzaGtleShfX3UxNiBwb3J0KQorc3RhdGljIGlubGluZSBfX3UxNiB0Y3BfYXBwX2hhc2hrZXkoX19iZTE2IHBvcnQpCiB7Ci0JcmV0dXJuICgocG9ydCA+PiBUQ1BfQVBQX1RBQl9CSVRTKSBeIHBvcnQpICYgVENQX0FQUF9UQUJfTUFTSzsKKwlyZXR1cm4gKCgoX19mb3JjZSB1MTYpcG9ydCA+PiBUQ1BfQVBQX1RBQl9CSVRTKSBeIChfX2ZvcmNlIHUxNilwb3J0KQorCQkmIFRDUF9BUFBfVEFCX01BU0s7CiB9CiAKIAogc3RhdGljIGludCB0Y3BfcmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKIHsKIAlzdHJ1Y3QgaXBfdnNfYXBwICppOwotCV9fdTE2IGhhc2gsIHBvcnQgPSBpbmMtPnBvcnQ7CisJX191MTYgaGFzaDsKKwlfX2JlMTYgcG9ydCA9IGluYy0+cG9ydDsKIAlpbnQgcmV0ID0gMDsKIAogCWhhc2ggPSB0Y3BfYXBwX2hhc2hrZXkocG9ydCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYwppbmRleCA2OTFjOGI2Li4wM2YwYTQxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm5mbWFyaywgc2tiLT5uaC5pcGgtPnByb3RvY29sLAorCWlmICgoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5tYXJrLCBza2ItPm5oLmlwaC0+cHJvdG9jb2wsCiAJCQkJICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIHVoLT5kZXN0KSkpIHsKIAkJaWYgKGlwX3ZzX3RvZHJvcCgpKSB7CiAJCQkvKgpAQCAtMTIxLDExICsxMjEsMTEgQEAKIAkJICAgICBfX2JlMTYgb2xkcG9ydCwgX19iZTE2IG5ld3BvcnQpCiB7CiAJdWhkci0+Y2hlY2sgPQotCQlpcF92c19jaGVja19kaWZmKH5vbGRpcCwgbmV3aXAsCi0JCQkJIGlwX3ZzX2NoZWNrX2RpZmYob2xkcG9ydCBeIGh0b25zKDB4RkZGRiksCi0JCQkJCQkgIG5ld3BvcnQsIHVoZHItPmNoZWNrKSk7CisJCWNzdW1fZm9sZChpcF92c19jaGVja19kaWZmNChvbGRpcCwgbmV3aXAsCisJCQkJIGlwX3ZzX2NoZWNrX2RpZmYyKG9sZHBvcnQsIG5ld3BvcnQsCisJCQkJCX5jc3VtX3VuZm9sZCh1aGRyLT5jaGVjaykpKSk7CiAJaWYgKCF1aGRyLT5jaGVjaykKLQkJdWhkci0+Y2hlY2sgPSAtMTsKKwkJdWhkci0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIH0KIAogc3RhdGljIGludApAQCAtMTczLDcgKzE3Myw3IEBACiAJCQkJCQljcC0+cHJvdG9jb2wsCiAJCQkJCQkoKnBza2IpLT5jc3VtKTsKIAkJaWYgKHVkcGgtPmNoZWNrID09IDApCi0JCQl1ZHBoLT5jaGVjayA9IC0xOworCQkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAkJSVBfVlNfREJHKDExLCAiTy1wa3Q6ICVzIE8tY3N1bT0lZCAoKyV6ZClcbiIsCiAJCQkgIHBwLT5uYW1lLCB1ZHBoLT5jaGVjaywKIAkJCSAgKGNoYXIqKSYodWRwaC0+Y2hlY2spIC0gKGNoYXIqKXVkcGgpOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJCQkJCQljcC0+cHJvdG9jb2wsCiAJCQkJCQkoKnBza2IpLT5jc3VtKTsKIAkJaWYgKHVkcGgtPmNoZWNrID09IDApCi0JCQl1ZHBoLT5jaGVjayA9IC0xOworCQkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAkJKCpwc2tiKS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQogCXJldHVybiAxOwpAQCAtMjgyLDE2ICsyODIsMTggQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVkcF9hcHBzW1VEUF9BUFBfVEFCX1NJWkVdOwogc3RhdGljIERFRklORV9TUElOTE9DSyh1ZHBfYXBwX2xvY2spOwogCi1zdGF0aWMgaW5saW5lIF9fdTE2IHVkcF9hcHBfaGFzaGtleShfX3UxNiBwb3J0KQorc3RhdGljIGlubGluZSBfX3UxNiB1ZHBfYXBwX2hhc2hrZXkoX19iZTE2IHBvcnQpCiB7Ci0JcmV0dXJuICgocG9ydCA+PiBVRFBfQVBQX1RBQl9CSVRTKSBeIHBvcnQpICYgVURQX0FQUF9UQUJfTUFTSzsKKwlyZXR1cm4gKCgoX19mb3JjZSB1MTYpcG9ydCA+PiBVRFBfQVBQX1RBQl9CSVRTKSBeIChfX2ZvcmNlIHUxNilwb3J0KQorCQkmIFVEUF9BUFBfVEFCX01BU0s7CiB9CiAKIAogc3RhdGljIGludCB1ZHBfcmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKIHsKIAlzdHJ1Y3QgaXBfdnNfYXBwICppOwotCV9fdTE2IGhhc2gsIHBvcnQgPSBpbmMtPnBvcnQ7CisJX191MTYgaGFzaDsKKwlfX2JlMTYgcG9ydCA9IGluYy0+cG9ydDsKIAlpbnQgcmV0ID0gMDsKIAogCWhhc2ggPSB1ZHBfYXBwX2hhc2hrZXkocG9ydCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IGUyMDA1YzYuLmE2ODk2NjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0yNyw5ICsyNyw3IEBACiAJCWZsLm5sX3UuaXA0X3Uuc2FkZHIgPSBpcGgtPnNhZGRyOwogCQlmbC5ubF91LmlwNF91LnRvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CiAJCWZsLm9pZiA9ICgqcHNrYiktPnNrID8gKCpwc2tiKS0+c2stPnNrX2JvdW5kX2Rldl9pZiA6IDA7Ci0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQlmbC5ubF91LmlwNF91LmZ3bWFyayA9ICgqcHNrYiktPm5mbWFyazsKLSNlbmRpZgorCQlmbC5tYXJrID0gKCpwc2tiKS0+bWFyazsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpICE9IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTE2NCwxNyArMTYyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGludCBuZl9pcF9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKK19fc3VtMTYgbmZfaXBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIHVfaW50OF90IHByb3RvY29sKQogewogCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0JdW5zaWduZWQgaW50IGNzdW0gPSAwOworCV9fc3VtMTYgY3N1bSA9IDA7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKIAkJaWYgKGhvb2sgIT0gTkZfSVBfUFJFX1JPVVRJTkcgJiYgaG9vayAhPSBORl9JUF9MT0NBTF9JTikKIAkJCWJyZWFrOwotCQlpZiAoKHByb3RvY29sID09IDAgJiYgISh1MTYpY3N1bV9mb2xkKHNrYi0+Y3N1bSkpIHx8CisJCWlmICgocHJvdG9jb2wgPT0gMCAmJiAhY3N1bV9mb2xkKHNrYi0+Y3N1bSkpIHx8CiAJCSAgICAhY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKIAkJCSAgICAJICAgICAgIHNrYi0+bGVuIC0gZGF0YW9mZiwgcHJvdG9jb2wsCiAJCQkJICAgICAgIHNrYi0+Y3N1bSkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggZDg4YzI5Mi4uMzYzZGY5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAJZGVwZW5kcyBvbiBJTkVUICYmIE5FVEZJTFRFUgogCiBjb25maWcgTkZfQ09OTlRSQUNLX0lQVjQKLQl0cmlzdGF0ZSAiSVB2NCBzdXBwb3J0IGZvciBuZXcgY29ubmVjdGlvbiB0cmFja2luZyAoRVhQRVJJTUVOVEFMKSIKKwl0cmlzdGF0ZSAiSVB2NCBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBOQVQpIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSwogCS0tLWhlbHAtLS0KIAkgIENvbm5lY3Rpb24gdHJhY2tpbmcga2VlcHMgYSByZWNvcmQgb2Ygd2hhdCBwYWNrZXRzIGhhdmUgcGFzc2VkCkBAIC0xOSwyMSArMTksMTggQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwlib29sICJwcm9jL3N5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGNvbm5lY3Rpb24gdHJhY2tpbmciCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfSVBWNAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgL3Byb2MgYW5kIHN5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAorCSAgbGF5ZXIgMyBkZXBlbmRhbnQgY29ubmVjdGlvbiB0cmFja2luZy4gVGhpcyBpcyBuZWVkZWQgdG8ga2VlcAorCSAgb2xkIHByb2dyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBhZGFwdGVkIHRvIHRoZSBuZXcgbmFtZXMgd29ya2luZy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogIyBjb25uZWN0aW9uIHRyYWNraW5nLCBoZWxwZXJzIGFuZCBwcm90b2NvbHMKLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0sKLQl0cmlzdGF0ZSAiQ29ubmVjdGlvbiB0cmFja2luZyAocmVxdWlyZWQgZm9yIG1hc3EvTkFUKSIKLQktLS1oZWxwLS0tCi0JICBDb25uZWN0aW9uIHRyYWNraW5nIGtlZXBzIGEgcmVjb3JkIG9mIHdoYXQgcGFja2V0cyBoYXZlIHBhc3NlZAotCSAgdGhyb3VnaCB5b3VyIG1hY2hpbmUsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgYXJlIHJlbGF0ZWQKLQkgIGludG8gY29ubmVjdGlvbnMuCi0KLQkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKLQkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bwotCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKLQkgIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9DVF9BQ0NUCiAJYm9vbCAiQ29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmciCiAJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKQEAgLTMxNSwyMCArMzEyLDYgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfSEFTSExJTUlUCi0JdHJpc3RhdGUgICdoYXNobGltaXQgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIG5ldyBpcHRhYmxlcyBgaGFzaGxpbWl0JyBtYXRjaC4gIAotCi0JICBBcyBvcHBvc2VkIHRvIGBsaW1pdCcsIHRoaXMgbWF0Y2ggZHluYW1pY2FsbHkgY3JlYXRlcyBhIGhhc2ggdGFibGUKLQkgIG9mIGxpbWl0IGJ1Y2tldHMsIGJhc2VkIG9uIHlvdXIgc2VsZWN0aW9uIG9mIHNvdXJjZS9kZXN0aW5hdGlvbgotCSAgaXAgYWRkcmVzc2VzIGFuZC9vciBwb3J0cy4KLQotCSAgSXQgZW5hYmxlcyB5b3UgdG8gZXhwcmVzcyBwb2xpY2llcyBsaWtlIGAxMGtwcHMgZm9yIGFueSBnaXZlbgotCSAgZGVzdGluYXRpb24gSVAnIG9yIGA1MDBwcHMgZnJvbSBhbnkgZ2l2ZW4gc291cmNlIElQJyAgd2l0aCBhIHNpbmdsZQotCSAgSVB0YWJsZXMgcnVsZS4KLQogIyBgZmlsdGVyJywgZ2VuZXJpYyBhbmQgc3BlY2lmaWMgdGFyZ2V0cwogY29uZmlnIElQX05GX0ZJTFRFUgogCXRyaXN0YXRlICJQYWNrZXQgZmlsdGVyaW5nIgpAQCAtNDA0LDcgKzM4Nyw3IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi0jIE5BVCArIHNwZWNpZmljIHRhcmdldHMKKyMgTkFUICsgc3BlY2lmaWMgdGFyZ2V0czogaXBfY29ubnRyYWNrCiBjb25maWcgSVBfTkZfTkFUCiAJdHJpc3RhdGUgIkZ1bGwgTkFUIgogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgSVBfTkZfQ09OTlRSQUNLCkBAIC00MTUsMTQgKzM5OCwzMCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorIyBOQVQgKyBzcGVjaWZpYyB0YXJnZXRzOiBuZl9jb25udHJhY2sKK2NvbmZpZyBORl9OQVQKKwl0cmlzdGF0ZSAiRnVsbCBOQVQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sKKwloZWxwCisJICBUaGUgRnVsbCBOQVQgb3B0aW9uIGFsbG93cyBtYXNxdWVyYWRpbmcsIHBvcnQgZm9yd2FyZGluZyBhbmQgb3RoZXIKKwkgIGZvcm1zIG9mIGZ1bGwgTmV0d29yayBBZGRyZXNzIFBvcnQgVHJhbnNsYXRpb24uICBJdCBpcyBjb250cm9sbGVkIGJ5CisJICB0aGUgYG5hdCcgdGFibGUgaW4gaXB0YWJsZXM6IHNlZSB0aGUgbWFuIHBhZ2UgZm9yIGlwdGFibGVzKDgpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIElQX05GX05BVF9ORUVERUQKIAlib29sCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQgIT0gbgorCWRlcGVuZHMgb24gSVBfTkZfTkFUCisJZGVmYXVsdCB5CisKK2NvbmZpZyBORl9OQVRfTkVFREVECisJYm9vbAorCWRlcGVuZHMgb24gTkZfTkFUCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBJUF9ORl9UQVJHRVRfTUFTUVVFUkFERQogCXRyaXN0YXRlICJNQVNRVUVSQURFIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfTkFUCisJZGVwZW5kcyBvbiAoTkZfTkFUIHx8IElQX05GX05BVCkKIAloZWxwCiAJICBNYXNxdWVyYWRpbmcgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgTkFUOiBhbGwgb3V0Z29pbmcgY29ubmVjdGlvbnMgYXJlCiAJICBjaGFuZ2VkIHRvIHNlZW0gdG8gY29tZSBmcm9tIGEgcGFydGljdWxhciBpbnRlcmZhY2UncyBhZGRyZXNzLCBhbmQKQEAgLTQzNCw3ICs0MzMsNyBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX1JFRElSRUNUCiAJdHJpc3RhdGUgIlJFRElSRUNUIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfTkFUCisJZGVwZW5kcyBvbiAoTkZfTkFUIHx8IElQX05GX05BVCkKIAloZWxwCiAJICBSRURJUkVDVCBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOQVQ6IGFsbCBpbmNvbWluZyBjb25uZWN0aW9ucyBhcmUKIAkgIG1hcHBlZCBvbnRvIHRoZSBpbmNvbWluZyBpbnRlcmZhY2UncyBhZGRyZXNzLCBjYXVzaW5nIHRoZSBwYWNrZXRzIHRvCkBAIC00NDUsNyArNDQ0LDcgQEAKIAogY29uZmlnIElQX05GX1RBUkdFVF9ORVRNQVAKIAl0cmlzdGF0ZSAiTkVUTUFQIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfTkFUCisJZGVwZW5kcyBvbiAoTkZfTkFUIHx8IElQX05GX05BVCkKIAloZWxwCiAJICBORVRNQVAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc3RhdGljIDE6MSBOQVQgbWFwcGluZyBvZiBuZXR3b3JrCiAJICBhZGRyZXNzZXMuIEl0IG1hcHMgdGhlIG5ldHdvcmsgYWRkcmVzcyBwYXJ0LCB3aGlsZSBrZWVwaW5nIHRoZSBob3N0CkBAIC00NTYsNyArNDU1LDcgQEAKIAogY29uZmlnIElQX05GX1RBUkdFVF9TQU1FCiAJdHJpc3RhdGUgIlNBTUUgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwlkZXBlbmRzIG9uIChORl9OQVQgfHwgSVBfTkZfTkFUKQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgU0FNRScgdGFyZ2V0LCB3aGljaCB3b3JrcyBsaWtlIHRoZSBzdGFuZGFyZCBTTkFUCiAJICB0YXJnZXQsIGJ1dCBhdHRlbXB0cyB0byBnaXZlIGNsaWVudHMgdGhlIHNhbWUgSVAgZm9yIGFsbCBjb25uZWN0aW9ucy4KQEAgLTQ3OCwxOSArNDc3LDUyIEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkZfTkFUX1NOTVBfQkFTSUMKKwl0cmlzdGF0ZSAiQmFzaWMgU05NUC1BTEcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9OQVQKKwktLS1oZWxwLS0tCisKKwkgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4gQXBwbGljYXRpb24gTGF5ZXIgR2F0ZXdheSAoQUxHKSBmb3IKKwkgIFNOTVAgcGF5bG9hZHMuICBJbiBjb25qdW5jdGlvbiB3aXRoIE5BVCwgaXQgYWxsb3dzIGEgbmV0d29yaworCSAgbWFuYWdlbWVudCBzeXN0ZW0gdG8gYWNjZXNzIG11bHRpcGxlIHByaXZhdGUgbmV0d29ya3Mgd2l0aAorCSAgY29uZmxpY3RpbmcgYWRkcmVzc2VzLiAgSXQgd29ya3MgYnkgbW9kaWZ5aW5nIElQIGFkZHJlc3NlcworCSAgaW5zaWRlIFNOTVAgcGF5bG9hZHMgdG8gbWF0Y2ggSVAtbGF5ZXIgTkFUIG1hcHBpbmcuCisKKwkgIFRoaXMgaXMgdGhlICJiYXNpYyIgZm9ybSBvZiBTTk1QLUFMRywgYXMgZGVzY3JpYmVkIGluIFJGQyAyOTYyCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCisjIElmIHRoZXkgd2FudCBGVFAsIHNldCB0byAkQ09ORklHX0lQX05GX05BVCAobSBvciB5KSwKKyMgb3IgJENPTkZJR19JUF9ORl9GVFAgKG0gb3IgeSksIHdoaWNoZXZlciBpcyB3ZWFrZXIuCisjIEZyb20ga2NvbmZpZy1sYW5ndWFnZS50eHQ6CisjCisjICAgICAgICAgICA8ZXhwcj4gJyYmJyA8ZXhwcj4gICAgICAgICAgICAgICAgICAgKDYpCisjCisjICg2KSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbWluKC9leHByLywgL2V4cHIvKS4KK2NvbmZpZyBORl9OQVRfUFJPVE9fR1JFCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIE5GX05BVCAmJiBORl9DVF9QUk9UT19HUkUKKworY29uZmlnIElQX05GX05BVF9GVFAKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX05BVAorCWRlZmF1bHQgSVBfTkZfTkFUICYmIElQX05GX0ZUUAorCitjb25maWcgTkZfTkFUX0ZUUAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX0ZUUAorCiBjb25maWcgSVBfTkZfTkFUX0lSQwogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCiAJZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfSVJDPXkKIAlkZWZhdWx0IG0gaWYgSVBfTkZfSVJDPW0KIAotIyBJZiB0aGV5IHdhbnQgRlRQLCBzZXQgdG8gJENPTkZJR19JUF9ORl9OQVQgKG0gb3IgeSksIAotIyBvciAkQ09ORklHX0lQX05GX0ZUUCAobSBvciB5KSwgd2hpY2hldmVyIGlzIHdlYWtlci4gIEFyZ2guCi1jb25maWcgSVBfTkZfTkFUX0ZUUAorY29uZmlnIE5GX05BVF9JUkMKIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMhPW4gJiYgSVBfTkZfQ09OTlRSQUNLIT1uICYmIElQX05GX05BVCE9bgotCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX0ZUUD15Ci0JZGVmYXVsdCBtIGlmIElQX05GX0ZUUD1tCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX0lSQwogCiBjb25maWcgSVBfTkZfTkFUX1RGVFAKIAl0cmlzdGF0ZQpAQCAtNDk4LDMwICs1MzAsNTYgQEAKIAlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9URlRQPXkKIAlkZWZhdWx0IG0gaWYgSVBfTkZfVEZUUD1tCiAKK2NvbmZpZyBORl9OQVRfVEZUUAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX1RGVFAKKwogY29uZmlnIElQX05GX05BVF9BTUFOREEKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMhPW4gJiYgSVBfTkZfQ09OTlRSQUNLIT1uICYmIElQX05GX05BVCE9bgogCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX0FNQU5EQT15CiAJZGVmYXVsdCBtIGlmIElQX05GX0FNQU5EQT1tCiAKK2NvbmZpZyBORl9OQVRfQU1BTkRBCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfQU1BTkRBCisKIGNvbmZpZyBJUF9ORl9OQVRfUFBUUAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9OQVQhPW4gJiYgSVBfTkZfUFBUUCE9bgogCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX1BQVFA9eQogCWRlZmF1bHQgbSBpZiBJUF9ORl9QUFRQPW0KIAorY29uZmlnIE5GX05BVF9QUFRQCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfUFBUUAorCXNlbGVjdCBORl9OQVRfUFJPVE9fR1JFCisKIGNvbmZpZyBJUF9ORl9OQVRfSDMyMwogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCiAJZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfSDMyMz15CiAJZGVmYXVsdCBtIGlmIElQX05GX0gzMjM9bQogCitjb25maWcgTkZfTkFUX0gzMjMKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAorCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19IMzIzCisKIGNvbmZpZyBJUF9ORl9OQVRfU0lQCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KIAlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9TSVA9eQogCWRlZmF1bHQgbSBpZiBJUF9ORl9TSVA9bQogCitjb25maWcgTkZfTkFUX1NJUAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX1NJUAorCiAjIG1hbmdsZSArIHNwZWNpZmljIHRhcmdldHMKIGNvbmZpZyBJUF9ORl9NQU5HTEUKIAl0cmlzdGF0ZSAiUGFja2V0IG1hbmdsaW5nIgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDA5YWFlZDEuLjE1ZTc0MWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTUsMTcgKzUsMjMgQEAKICMgb2JqZWN0cyBmb3IgdGhlIHN0YW5kYWxvbmUgLSBjb25uZWN0aW9uIHRyYWNraW5nIC8gTkFUCiBpcF9jb25udHJhY2stb2Jqcwk6PSBpcF9jb25udHJhY2tfc3RhbmRhbG9uZS5vIGlwX2Nvbm50cmFja19jb3JlLm8gaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBpcF9jb25udHJhY2tfcHJvdG9fdGNwLm8gaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5vIGlwX2Nvbm50cmFja19wcm90b19pY21wLm8KIGlwX25hdC1vYmpzCTo9IGlwX25hdF9jb3JlLm8gaXBfbmF0X2hlbHBlci5vIGlwX25hdF9wcm90b191bmtub3duLm8gaXBfbmF0X3Byb3RvX3RjcC5vIGlwX25hdF9wcm90b191ZHAubyBpcF9uYXRfcHJvdG9faWNtcC5vCituZl9uYXQtb2Jqcwk6PSBuZl9uYXRfY29yZS5vIG5mX25hdF9oZWxwZXIubyBuZl9uYXRfcHJvdG9fdW5rbm93bi5vIG5mX25hdF9wcm90b190Y3AubyBuZl9uYXRfcHJvdG9fdWRwLm8gbmZfbmF0X3Byb3RvX2ljbXAubworaWZuZXEgKCQoQ09ORklHX05GX05BVCksKQoraXB0YWJsZV9uYXQtb2Jqcwk6PSBuZl9uYXRfcnVsZS5vIG5mX25hdF9zdGFuZGFsb25lLm8KK2Vsc2UKIGlwdGFibGVfbmF0LW9ianMJOj0gaXBfbmF0X3J1bGUubyBpcF9uYXRfc3RhbmRhbG9uZS5vCitlbmRpZgogCiBpcF9jb25udHJhY2tfcHB0cC1vYmpzCTo9IGlwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5vIGlwX2Nvbm50cmFja19wcm90b19ncmUubwogaXBfbmF0X3BwdHAtb2Jqcwk6PSBpcF9uYXRfaGVscGVyX3BwdHAubyBpcF9uYXRfcHJvdG9fZ3JlLm8KIAotaXBfY29ubnRyYWNrX2gzMjMtb2JqcyA6PSBpcF9jb25udHJhY2tfaGVscGVyX2gzMjMubyBpcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5vCitpcF9jb25udHJhY2tfaDMyMy1vYmpzIDo9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5vIC4uLy4uL25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLm8KIGlwX25hdF9oMzIzLW9ianMgOj0gaXBfbmF0X2hlbHBlcl9oMzIzLm8KIAogIyBjb25uZWN0aW9uIHRyYWNraW5nCiBvYmotJChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSArPSBpcF9jb25udHJhY2subwogb2JqLSQoQ09ORklHX0lQX05GX05BVCkgKz0gaXBfbmF0Lm8KK29iai0kKENPTkZJR19ORl9OQVQpICs9IG5mX25hdC5vCiAKICMgY29ubnRyYWNrIG5ldGxpbmsgaW50ZXJmYWNlCiBvYmotJChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspICs9IGlwX2Nvbm50cmFja19uZXRsaW5rLm8KQEAgLTM0LDcgKzQwLDcgQEAKIG9iai0kKENPTkZJR19JUF9ORl9TSVApICs9IGlwX2Nvbm50cmFja19zaXAubwogb2JqLSQoQ09ORklHX0lQX05GX05FVEJJT1NfTlMpICs9IGlwX2Nvbm50cmFja19uZXRiaW9zX25zLm8KIAotIyBOQVQgaGVscGVycyAKKyMgTkFUIGhlbHBlcnMgKGlwX2Nvbm50cmFjaykKIG9iai0kKENPTkZJR19JUF9ORl9OQVRfSDMyMykgKz0gaXBfbmF0X2gzMjMubwogb2JqLSQoQ09ORklHX0lQX05GX05BVF9QUFRQKSArPSBpcF9uYXRfcHB0cC5vCiBvYmotJChDT05GSUdfSVBfTkZfTkFUX0FNQU5EQSkgKz0gaXBfbmF0X2FtYW5kYS5vCkBAIC00Myw2ICs0OSwxOSBAQAogb2JqLSQoQ09ORklHX0lQX05GX05BVF9JUkMpICs9IGlwX25hdF9pcmMubwogb2JqLSQoQ09ORklHX0lQX05GX05BVF9TSVApICs9IGlwX25hdF9zaXAubwogCisjIE5BVCBoZWxwZXJzIChuZl9jb25udHJhY2spCitvYmotJChDT05GSUdfTkZfTkFUX0FNQU5EQSkgKz0gbmZfbmF0X2FtYW5kYS5vCitvYmotJChDT05GSUdfTkZfTkFUX0ZUUCkgKz0gbmZfbmF0X2Z0cC5vCitvYmotJChDT05GSUdfTkZfTkFUX0gzMjMpICs9IG5mX25hdF9oMzIzLm8KK29iai0kKENPTkZJR19ORl9OQVRfSVJDKSArPSBuZl9uYXRfaXJjLm8KK29iai0kKENPTkZJR19ORl9OQVRfUFBUUCkgKz0gbmZfbmF0X3BwdHAubworb2JqLSQoQ09ORklHX05GX05BVF9TSVApICs9IG5mX25hdF9zaXAubworb2JqLSQoQ09ORklHX05GX05BVF9TTk1QX0JBU0lDKSArPSBuZl9uYXRfc25tcF9iYXNpYy5vCitvYmotJChDT05GSUdfTkZfTkFUX1RGVFApICs9IG5mX25hdF90ZnRwLm8KKworIyBOQVQgcHJvdG9jb2xzIChuZl9uYXQpCitvYmotJChDT05GSUdfTkZfTkFUX1BST1RPX0dSRSkgKz0gbmZfbmF0X3Byb3RvX2dyZS5vCisKICMgZ2VuZXJpYyBJUCB0YWJsZXMgCiBvYmotJChDT05GSUdfSVBfTkZfSVBUQUJMRVMpICs9IGlwX3RhYmxlcy5vCiAKQEAgLTUwLDEwICs2OSwxMCBAQAogb2JqLSQoQ09ORklHX0lQX05GX0ZJTFRFUikgKz0gaXB0YWJsZV9maWx0ZXIubwogb2JqLSQoQ09ORklHX0lQX05GX01BTkdMRSkgKz0gaXB0YWJsZV9tYW5nbGUubwogb2JqLSQoQ09ORklHX0lQX05GX05BVCkgKz0gaXB0YWJsZV9uYXQubworb2JqLSQoQ09ORklHX05GX05BVCkgKz0gaXB0YWJsZV9uYXQubwogb2JqLSQoQ09ORklHX0lQX05GX1JBVykgKz0gaXB0YWJsZV9yYXcubwogCiAjIG1hdGNoZXMKLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9IQVNITElNSVQpICs9IGlwdF9oYXNobGltaXQubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0lQUkFOR0UpICs9IGlwdF9pcHJhbmdlLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9PV05FUikgKz0gaXB0X293bmVyLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9UT1MpICs9IGlwdF90b3MubwpAQCAtODksNiArMTA4LDExIEBACiAKICMgb2JqZWN0cyBmb3IgbDMgaW5kZXBlbmRlbnQgY29ubnRyYWNrCiBuZl9jb25udHJhY2tfaXB2NC1vYmpzICA6PSAgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5vIG5mX2Nvbm50cmFja19wcm90b19pY21wLm8KK2lmZXEgKCQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkseSkKK2lmZXEgKCQoQ09ORklHX1BST0NfRlMpLHkpCituZl9jb25udHJhY2tfaXB2NC1vYmpzCSs9IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0Lm8KK2VuZGlmCitlbmRpZgogCiAjIGwzIGluZGVwZW5kZW50IGNvbm50cmFjawogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19JUFY0KSArPSBuZl9jb25udHJhY2tfaXB2NC5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYwppbmRleCA2YzczODNhLi5hZDI0NmJhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKQEAgLTkyLDYgKzkyLDcgQEAKIAljaGFyIHBidWZbc2l6ZW9mKCI2NTUzNSIpXSwgKnRtcDsKIAl1X2ludDE2X3QgcG9ydCwgbGVuOwogCWludCByZXQgPSBORl9BQ0NFUFQ7CisJdHlwZW9mKGlwX25hdF9hbWFuZGFfaG9vaykgaXBfbmF0X2FtYW5kYTsKIAogCS8qIE9ubHkgbG9vayBhdCBwYWNrZXRzIGZyb20gdGhlIEFtYW5kYSBzZXJ2ZXIgKi8KIAlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9PUklHSU5BTCkKQEAgLTE2MSw5ICsxNjIsMTEgQEAKIAkJZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CiAJCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7CiAKLQkJaWYgKGlwX25hdF9hbWFuZGFfaG9vaykKLQkJCXJldCA9IGlwX25hdF9hbWFuZGFfaG9vayhwc2tiLCBjdGluZm8sIG9mZiAtIGRhdGFvZmYsCi0JCQkJCQkgbGVuLCBleHApOworCQkvKiBSQ1UgcmVhZCBsb2NrZWQgYnkgbmZfaG9va19zbG93ICovCisJCWlwX25hdF9hbWFuZGEgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X2FtYW5kYV9ob29rKTsKKwkJaWYgKGlwX25hdF9hbWFuZGEpCisJCQlyZXQgPSBpcF9uYXRfYW1hbmRhKHBza2IsIGN0aW5mbywgb2ZmIC0gZGF0YW9mZiwKKwkJCQkJICAgIGxlbiwgZXhwKTsKIAkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKIAkJCXJldCA9IE5GX0RST1A7CiAJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CkBAIC0xODAsNyArMTgzLDcgQEAKIAkuaGVscCA9IGhlbHAsCiAJLm5hbWUgPSAiYW1hbmRhIiwKIAotCS50dXBsZSA9IHsgLnNyYyA9IHsgLnUgPSB7IF9fY29uc3RhbnRfaHRvbnMoMTAwODApIH0gfSwKKwkudHVwbGUgPSB7IC5zcmMgPSB7IC51ID0geyAudWRwID0gey5wb3J0ID0gX19jb25zdGFudF9odG9ucygxMDA4MCkgfSB9IH0sCiAJCSAgIC5kc3QgPSB7IC5wcm90b251bSA9IElQUFJPVE9fVURQIH0sCiAJfSwKIAkubWFzayA9IHsgLnNyYyA9IHsgLnUgPSB7IDB4RkZGRiB9IH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCmluZGV4IDE0M2M0NjYuLmY0YjBlNjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCkBAIC00MCw5ICs0MCw2IEBACiAKIC8qIGlwX2Nvbm50cmFja19sb2NrIHByb3RlY3RzIHRoZSBtYWluIGhhc2ggdGFibGUsIHByb3RvY29sL2hlbHBlci9leHBlY3RlZAogICAgcmVnaXN0cmF0aW9ucywgY29ubnRyYWNrIHRpbWVycyovCi0jZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKLSNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkKLQogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KQEAgLTIwMSw3ICsxOTgsNiBAQAogLyogaXBfY29ubnRyYWNrX2V4cGVjdCBoZWxwZXIgZnVuY3Rpb25zICovCiB2b2lkIGlwX2N0X3VubGlua19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKIHsKLQlBU1NFUlRfV1JJVEVfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOwogCUlQX05GX0FTU0VSVCghdGltZXJfcGVuZGluZygmZXhwLT50aW1lb3V0KSk7CiAJbGlzdF9kZWwoJmV4cC0+bGlzdCk7CiAJQ09OTlRSQUNLX1NUQVRfSU5DKGV4cGVjdF9kZWxldGUpOwpAQCAtMjI1LDIyICsyMjEsMjIgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaTsKIAkKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGlwX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKSkgewotCQkJYXRvbWljX2luYygmaS0+dXNlKTsKKwkJaWYgKGlwX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKSkKIAkJCXJldHVybiBpOwotCQl9CiAJfQogCXJldHVybiBOVUxMOwogfQogCiAvKiBKdXN0IGZpbmQgYSBleHBlY3RhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgdHVwbGUuICovCiBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqCi1pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCitpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOwogCQogCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogCWkgPSBfX2lwX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7CisJaWYgKGkpCisJCWF0b21pY19pbmMoJmktPnVzZSk7CiAJcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAogCXJldHVybiBpOwpAQCAtMjk0LDcgKzI5MCw2IEBACiBjbGVhbl9mcm9tX2xpc3RzKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQogewogCURFQlVHUCgiY2xlYW5fZnJvbV9saXN0cyglcClcbiIsIGN0KTsKLQlBU1NFUlRfV1JJVEVfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOwogCWxpc3RfZGVsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCk7CiAJbGlzdF9kZWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS5saXN0KTsKIApAQCAtMzczLDcgKzM2OCw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXVuc2lnbmVkIGludCBoYXNoID0gaGFzaF9jb25udHJhY2sodHVwbGUpOwogCi0JQVNTRVJUX1JFQURfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlwX2Nvbm50cmFja19oYXNoW2hhc2hdLCBsaXN0KSB7CiAJCWlmICh0dXBsZWhhc2hfdG9fY3RyYWNrKGgpICE9IGlnbm9yZWRfY29ubnRyYWNrICYmCiAJCSAgICBpcF9jdF90dXBsZV9lcXVhbCh0dXBsZSwgJmgtPnR1cGxlKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMKaW5kZXggOTNkY2Y5Ni4uMDQxMGM5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCkBAIC0zMTAsNiArMzEwLDcgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwogCXVuc2lnbmVkIGludCBpOwogCWludCBmb3VuZCA9IDAsIGVuZHNfaW5fbmw7CisJdHlwZW9mKGlwX25hdF9mdHBfaG9vaykgaXBfbmF0X2Z0cDsKIAogCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwogCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQKQEAgLTQzMyw5ICs0MzQsMTAgQEAKIAogCS8qIE5vdywgTkFUIG1pZ2h0IHdhbnQgdG8gbWFuZ2xlIHRoZSBwYWNrZXQsIGFuZCByZWdpc3RlciB0aGUKIAkgKiAocG9zc2libHkgY2hhbmdlZCkgZXhwZWN0YXRpb24gaXRzZWxmLiAqLwotCWlmIChpcF9uYXRfZnRwX2hvb2spCi0JCXJldCA9IGlwX25hdF9mdHBfaG9vayhwc2tiLCBjdGluZm8sIHNlYXJjaFtkaXJdW2ldLmZ0cHR5cGUsCi0JCQkJICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBleHAsICZzZXEpOworCWlwX25hdF9mdHAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X2Z0cF9ob29rKTsKKwlpZiAoaXBfbmF0X2Z0cCkKKwkJcmV0ID0gaXBfbmF0X2Z0cChwc2tiLCBjdGluZm8sIHNlYXJjaFtkaXJdW2ldLmZ0cHR5cGUsCisJCQkJIG1hdGNob2ZmLCBtYXRjaGxlbiwgZXhwLCAmc2VxKTsKIAllbHNlIHsKIAkJLyogQ2FuJ3QgZXhwZWN0IHRoaXM/ICBCZXN0IHRvIGRyb3AgcGFja2V0IG5vdy4gKi8KIAkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMKaW5kZXggN2I3NDQxMi4uYWFiZmUxYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjMuYwpAQCAtMjM3LDYgKzIzNyw3IEBACiAJdV9pbnQxNl90IHJ0cF9wb3J0OwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpydHBfZXhwOwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpydGNwX2V4cDsKKwl0eXBlb2YobmF0X3J0cF9ydGNwX2hvb2spIG5hdF9ydHBfcnRjcDsKIAogCS8qIFJlYWQgUlRQIG9yIFJUQ1AgYWRkcmVzcyAqLwogCWlmICghZ2V0X2gyNDVfYWRkcigqZGF0YSwgYWRkciwgJmlwLCAmcG9ydCkgfHwKQEAgLTI3OSwxMSArMjgwLDExIEBACiAJcnRjcF9leHAtPmZsYWdzID0gMDsKIAogCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmIG5hdF9ydHBfcnRjcF9ob29rKSB7CisJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmCisJICAgIChuYXRfcnRwX3J0Y3AgPSByY3VfZGVyZWZlcmVuY2UobmF0X3J0cF9ydGNwX2hvb2spKSkgewogCQkvKiBOQVQgbmVlZGVkICovCi0JCXJldCA9IG5hdF9ydHBfcnRjcF9ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCWFkZHIsIHBvcnQsIHJ0cF9wb3J0LCBydHBfZXhwLAotCQkJCQlydGNwX2V4cCk7CisJCXJldCA9IG5hdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgIGFkZHIsIHBvcnQsIHJ0cF9wb3J0LCBydHBfZXhwLCBydGNwX2V4cCk7CiAJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCiAJCXJ0cF9leHAtPmV4cGVjdGZuID0gTlVMTDsKIAkJcnRjcF9leHAtPmV4cGVjdGZuID0gTlVMTDsKQEAgLTMyOCw2ICszMjksNyBAQAogCV9fYmUzMiBpcDsKIAl1X2ludDE2X3QgcG9ydDsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKKwl0eXBlb2YobmF0X3QxMjBfaG9vaykgbmF0X3QxMjA7CiAKIAkvKiBSZWFkIFQuMTIwIGFkZHJlc3MgKi8KIAlpZiAoIWdldF9oMjQ1X2FkZHIoKmRhdGEsIGFkZHIsICZpcCwgJnBvcnQpIHx8CkBAIC0zNTAsMTAgKzM1MiwxMSBAQAogCWV4cC0+ZmxhZ3MgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOwkvKiBBY2NlcHQgbXVsdGlwbGUgY2hhbm5lbHMgKi8KIAogCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmIG5hdF90MTIwX2hvb2spIHsKKwkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKKwkgICAgKG5hdF90MTIwID0gcmN1X2RlcmVmZXJlbmNlKG5hdF90MTIwX2hvb2spKSkgewogCQkvKiBOQVQgbmVlZGVkICovCi0JCXJldCA9IG5hdF90MTIwX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCQkgICAgcG9ydCwgZXhwKTsKKwkJcmV0ID0gbmF0X3QxMjAocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwgYWRkciwKKwkJCSAgICAgICBwb3J0LCBleHApOwogCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLwogCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKIAkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKQEAgLTY1MSw2ICs2NTQsNyBAQAogCV9fYmUzMiBpcDsKIAl1X2ludDE2X3QgcG9ydDsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKKwl0eXBlb2YobmF0X2gyNDVfaG9vaykgbmF0X2gyNDU7CiAKIAkvKiBSZWFkIGgyNDVBZGRyZXNzICovCiAJaWYgKCFnZXRfaDIyNV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fApAQCAtNjczLDEwICs2NzcsMTEgQEAKIAlleHAtPmZsYWdzID0gMDsKIAogCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmIG5hdF9oMjQ1X2hvb2spIHsKKwkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKKwkgICAgKG5hdF9oMjQ1ID0gcmN1X2RlcmVmZXJlbmNlKG5hdF9oMjQ1X2hvb2spKSkgewogCQkvKiBOQVQgbmVlZGVkICovCi0JCXJldCA9IG5hdF9oMjQ1X2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCQkgICAgcG9ydCwgZXhwKTsKKwkJcmV0ID0gbmF0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwgYWRkciwKKwkJCSAgICAgICBwb3J0LCBleHApOwogCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLwogCQlleHAtPmV4cGVjdGZuID0gaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0OwogCkBAIC03MTIsNiArNzE3LDcgQEAKIAlfX2JlMzIgaXA7CiAJdV9pbnQxNl90IHBvcnQ7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCA9IE5VTEw7CisJdHlwZW9mKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSBuYXRfY2FsbGZvcndhcmRpbmc7CiAKIAkvKiBSZWFkIGFsdGVybmF0aXZlQWRkcmVzcyAqLwogCWlmICghZ2V0X2gyMjVfYWRkcigqZGF0YSwgYWRkciwgJmlwLCAmcG9ydCkgfHwgcG9ydCA9PSAwKQpAQCAtNzU5LDEwICs3NjUsMTEgQEAKIAlleHAtPmZsYWdzID0gMDsKIAogCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9Ci0JICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmIG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSB7CisJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwICYmCisJICAgIChuYXRfY2FsbGZvcndhcmRpbmcgPSByY3VfZGVyZWZlcmVuY2UobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spKSkgewogCQkvKiBOZWVkIE5BVCAqLwotCQlyZXQgPSBuYXRfY2FsbGZvcndhcmRpbmdfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICAgICBhZGRyLCBwb3J0LCBleHApOworCQlyZXQgPSBuYXRfY2FsbGZvcndhcmRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJIGFkZHIsIHBvcnQsIGV4cCk7CiAJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCiAJCWV4cC0+ZXhwZWN0Zm4gPSBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Q7CiAKQEAgLTc5Myw2ICs4MDAsNyBAQAogCWludCBpOwogCV9fYmUzMiBpcDsKIAl1X2ludDE2X3QgcG9ydDsKKwl0eXBlb2Yoc2V0X2gyMjVfYWRkcl9ob29rKSBzZXRfaDIyNV9hZGRyOwogCiAJREVCVUdQKCJpcF9jdF9xOTMxOiBTZXR1cFxuIik7CiAKQEAgLTgwMyw4ICs4MTEsMTAgQEAKIAkJCXJldHVybiAtMTsKIAl9CiAKKwlzZXRfaDIyNV9hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vayk7CisKIAlpZiAoKHNldHVwLT5vcHRpb25zICYgZVNldHVwX1VVSUVfZGVzdENhbGxTaWduYWxBZGRyZXNzKSAmJgotCSAgICAoc2V0X2gyMjVfYWRkcl9ob29rKSAmJgorCSAgICAoc2V0X2gyMjVfYWRkcikgJiYKIAkgICAgZ2V0X2gyMjVfYWRkcigqZGF0YSwgJnNldHVwLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsICZpcCwgJnBvcnQpICYmCiAJICAgIGlwICE9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwKSB7CiAJCURFQlVHUCgiaXBfY3RfcTkzMTogc2V0IGRlc3RDYWxsU2lnbmFsQWRkcmVzcyAiCkBAIC04MTIsMTcgKzgyMiwxNyBAQAogCQkgICAgICAgTklQUVVBRChpcCksIHBvcnQsCiAJCSAgICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwKSwKIAkJICAgICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUudGNwLnBvcnQpKTsKLQkJcmV0ID0gc2V0X2gyMjVfYWRkcl9ob29rKHBza2IsIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAmc2V0dXAtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkJIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwLAotCQkJCQkgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuCi0JCQkJCSAgICAgICB1LnRjcC5wb3J0KSk7CisJCXJldCA9IHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICAgJnNldHVwLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwLAorCQkJCSAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy4KKwkJCQkJICB1LnRjcC5wb3J0KSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KIAogCWlmICgoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcykgJiYKLQkgICAgKHNldF9oMjI1X2FkZHJfaG9vaykgJiYKKwkgICAgKHNldF9oMjI1X2FkZHIpICYmCiAJICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsICZpcCwgJnBvcnQpCiAJICAgICYmIGlwICE9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwKSB7CiAJCURFQlVHUCgiaXBfY3RfcTkzMTogc2V0IHNvdXJjZUNhbGxTaWduYWxBZGRyZXNzICIKQEAgLTgzMCwxMSArODQwLDExIEBACiAJCSAgICAgICBOSVBRVUFEKGlwKSwgcG9ydCwKIAkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXApLAogCQkgICAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCQlyZXQgPSBzZXRfaDIyNV9hZGRyX2hvb2socHNrYiwgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsCi0JCQkJCSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCQkJIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LgotCQkJCQkgICAgICAgdS50Y3AucG9ydCkpOworCQlyZXQgPSBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAorCQkJCSAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC4KKwkJCQkJICB1LnRjcC5wb3J0KSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTExNTMsNyArMTE2Myw3IEBACiAJLm1lID0gVEhJU19NT0RVTEUsCiAJLm1heF9leHBlY3RlZCA9IEgzMjNfUlRQX0NIQU5ORUxfTUFYICogNCArIDQgLyogVC4xMjAgYW5kIEguMjQ1ICovICwKIAkudGltZW91dCA9IDI0MCwKLQkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHtfX2NvbnN0YW50X2h0b25zKFE5MzFfUE9SVCl9fSwKKwkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHsudGNwID0gey5wb3J0ID0gX19jb25zdGFudF9odG9ucyhROTMxX1BPUlQpfX19LAogCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19UQ1B9fSwKIAkubWFzayA9IHsuc3JjID0gey51ID0gezB4RkZGRn19LAogCQkgLmRzdCA9IHsucHJvdG9udW0gPSAweEZGfX0sCkBAIC0xMjMxLDYgKzEyNDEsNyBAQAogCV9fYmUzMiBpcDsKIAl1X2ludDE2X3QgcG9ydDsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXR5cGVvZihuYXRfcTkzMV9ob29rKSBuYXRfcTkzMTsKIAogCS8qIExvb2sgZm9yIHRoZSBmaXJzdCByZWxhdGVkIGFkZHJlc3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewpAQCAtMTI1OCw5ICsxMjY5LDkgQEAKIAlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKIAlleHAtPmZsYWdzID0gSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVDsJLyogQWNjZXB0IG11bHRpcGxlIGNhbGxzICovCiAKLQlpZiAobmF0X3E5MzFfaG9vaykgewkvKiBOZWVkIE5BVCAqLwotCQlyZXQgPSBuYXRfcTkzMV9ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGFkZHIsIGksCi0JCQkJICAgIHBvcnQsIGV4cCk7CisJbmF0X3E5MzEgPSByY3VfZGVyZWZlcmVuY2UobmF0X3E5MzFfaG9vayk7CisJaWYgKG5hdF9xOTMxKSB7CS8qIE5lZWQgTkFUICovCisJCXJldCA9IG5hdF9xOTMxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGFkZHIsIGksIHBvcnQsIGV4cCk7CiAJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCiAJCWV4cC0+ZXhwZWN0Zm4gPSBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Q7CiAKQEAgLTEyODgsMTEgKzEyOTksMTQgQEAKIAkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAogCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIEdhdGVrZWVwZXJSZXF1ZXN0ICogZ3JxKQogeworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOworCiAJREVCVUdQKCJpcF9jdF9yYXM6IEdSUVxuIik7CiAKLQlpZiAoc2V0X3Jhc19hZGRyX2hvb2spCS8qIE5BVGVkICovCi0JCXJldHVybiBzZXRfcmFzX2FkZHJfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQkgJmdycS0+cmFzQWRkcmVzcywgMSk7CisJc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3Jhc19hZGRyKQkvKiBOQVRlZCAqLworCQlyZXR1cm4gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgICZncnEtPnJhc0FkZHJlc3MsIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0xMzYyLDYgKzEzNzYsNyBAQAogewogCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87CiAJaW50IHJldDsKKwl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKIAogCURFQlVHUCgiaXBfY3RfcmFzOiBSUlFcbiIpOwogCkBAIC0xMzcxLDEwICsxMzg2LDExIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiAtMTsKIAotCWlmIChzZXRfcmFzX2FkZHJfaG9vaykgewotCQlyZXQgPSBzZXRfcmFzX2FkZHJfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQlycnEtPnJhc0FkZHJlc3MuaXRlbSwKLQkJCQkJcnJxLT5yYXNBZGRyZXNzLmNvdW50KTsKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIpIHsKKwkJcmV0ID0gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgcnJxLT5yYXNBZGRyZXNzLml0ZW0sCisJCQkJICAgcnJxLT5yYXNBZGRyZXNzLmNvdW50KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTM5NywxMyArMTQxMywxNSBAQAogCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwogCiAJREVCVUdQKCJpcF9jdF9yYXM6IFJDRlxuIik7CiAKLQlpZiAoc2V0X3NpZ19hZGRyX2hvb2spIHsKLQkJcmV0ID0gc2V0X3NpZ19hZGRyX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJcmNmLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAotCQkJCQlyY2YtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKKwlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOworCWlmIChzZXRfc2lnX2FkZHIpIHsKKwkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgcmNmLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAorCQkJCSAgIHJjZi0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC0xNDE3LDcgKzE0MzUsNyBAQAogCQlERUJVR1AKIAkJICAgICgiaXBfY3RfcmFzOiBzZXQgUkFTIGNvbm5lY3Rpb24gdGltZW91dCB0byAldSBzZWNvbmRzXG4iLAogCQkgICAgIGluZm8tPnRpbWVvdXQpOwotCQlpcF9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgTlVMTCwgaW5mby0+dGltZW91dCAqIEhaKTsKKwkJaXBfY3RfcmVmcmVzaChjdCwgKnBza2IsIGluZm8tPnRpbWVvdXQgKiBIWik7CiAKIAkJLyogU2V0IGV4cGVjdCB0aW1lb3V0ICovCiAJCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwpAQCAtMTQ0OCwxMyArMTQ2NiwxNSBAQAogCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87CiAJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAlpbnQgcmV0OworCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwogCiAJREVCVUdQKCJpcF9jdF9yYXM6IFVSUVxuIik7CiAKLQlpZiAoc2V0X3NpZ19hZGRyX2hvb2spIHsKLQkJcmV0ID0gc2V0X3NpZ19hZGRyX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJdXJxLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAotCQkJCQl1cnEtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKKwlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOworCWlmIChzZXRfc2lnX2FkZHIpIHsKKwkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgdXJxLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAorCQkJCSAgIHVycS0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC0xNDY1LDcgKzE0ODUsNyBAQAogCWluZm8tPnNpZ19wb3J0WyFkaXJdID0gMDsKIAogCS8qIEdpdmUgaXQgMzAgc2Vjb25kcyBmb3IgVUNGIG9yIFVSSiAqLwotCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBOVUxMLCAzMCAqIEhaKTsKKwlpcF9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgMzAgKiBIWik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NzksMjggKzE0OTksMzAgQEAKIAlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwogCV9fYmUzMiBpcDsKIAl1X2ludDE2X3QgcG9ydDsKKwl0eXBlb2Yoc2V0X2gyMjVfYWRkcl9ob29rKSBzZXRfaDIyNV9hZGRyOwogCiAJREVCVUdQKCJpcF9jdF9yYXM6IEFSUVxuIik7CiAKKwlzZXRfaDIyNV9hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vayk7CiAJaWYgKChhcnEtPm9wdGlvbnMgJiBlQWRtaXNzaW9uUmVxdWVzdF9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MpICYmCiAJICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZhcnEtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkgJiYKIAkgICAgaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJgotCSAgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0gJiYgc2V0X2gyMjVfYWRkcl9ob29rKSB7CisJICAgIHBvcnQgPT0gaW5mby0+c2lnX3BvcnRbZGlyXSAmJiBzZXRfaDIyNV9hZGRyKSB7CiAJCS8qIEFuc3dlcmluZyBBUlEgKi8KLQkJcmV0dXJuIHNldF9oMjI1X2FkZHJfaG9vayhwc2tiLCBkYXRhLCAwLAotCQkJCQkgICZhcnEtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCQkJICBpbmZvLT5zaWdfcG9ydFshZGlyXSk7CisJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsCisJCQkJICAgICAmYXJxLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKKwkJCQkgICAgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKIAl9CiAKIAlpZiAoKGFycS0+b3B0aW9ucyAmIGVBZG1pc3Npb25SZXF1ZXN0X3NyY0NhbGxTaWduYWxBZGRyZXNzKSAmJgogCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYXJxLT5zcmNDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkgJiYKLQkgICAgaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJiBzZXRfaDIyNV9hZGRyX2hvb2spIHsKKwkgICAgaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJiBzZXRfaDIyNV9hZGRyKSB7CiAJCS8qIENhbGxpbmcgQVJRICovCi0JCXJldHVybiBzZXRfaDIyNV9hZGRyX2hvb2socHNrYiwgZGF0YSwgMCwKLQkJCQkJICAmYXJxLT5zcmNDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCQkJICBwb3J0KTsKKwkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwKKwkJCQkgICAgICZhcnEtPnNyY0NhbGxTaWduYWxBZGRyZXNzLAorCQkJCSAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCisJCQkJICAgICBwb3J0KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE1MTYsNiArMTUzOCw3IEBACiAJX19iZTMyIGlwOwogCXVfaW50MTZfdCBwb3J0OwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CiAKIAlERUJVR1AoImlwX2N0X3JhczogQUNGXG4iKTsKIApAQCAtMTUyMywxMCArMTU0NiwxMCBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LmlwKSB7CS8qIEFuc3dlcmluZyBBQ0YgKi8KLQkJaWYgKHNldF9zaWdfYWRkcl9ob29rKQotCQkJcmV0dXJuIHNldF9zaWdfYWRkcl9ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJCQkgJmFjZi0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLAotCQkJCQkJIDEpOworCQlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOworCQlpZiAoc2V0X3NpZ19hZGRyKQorCQkJcmV0dXJuIHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCQkgICAgJmFjZi0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLCAxKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNTY2LDExICsxNTg5LDE0IEBACiAJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKIAkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBMb2NhdGlvblJlcXVlc3QgKiBscnEpCiB7CisJdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7CisKIAlERUJVR1AoImlwX2N0X3JhczogTFJRXG4iKTsKIAotCWlmIChzZXRfcmFzX2FkZHJfaG9vaykKLQkJcmV0dXJuIHNldF9yYXNfYWRkcl9ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJCSAmbHJxLT5yZXBseUFkZHJlc3MsIDEpOworCXNldF9yYXNfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vayk7CisJaWYgKHNldF9yYXNfYWRkcikKKwkJcmV0dXJuIHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICAmbHJxLT5yZXBseUFkZHJlc3MsIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0xNjI5LDIwICsxNjU1LDI0IEBACiAJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgSW5mb1JlcXVlc3RSZXNwb25zZSAqIGlycikKIHsKIAlpbnQgcmV0OworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOworCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwogCiAJREVCVUdQKCJpcF9jdF9yYXM6IElSUlxuIik7CiAKLQlpZiAoc2V0X3Jhc19hZGRyX2hvb2spIHsKLQkJcmV0ID0gc2V0X3Jhc19hZGRyX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJJmlyci0+cmFzQWRkcmVzcywgMSk7CisJc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3Jhc19hZGRyKSB7CisJCXJldCA9IHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZpcnItPnJhc0FkZHJlc3MsIDEpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoc2V0X3NpZ19hZGRyX2hvb2spIHsKLQkJcmV0ID0gc2V0X3NpZ19hZGRyX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJaXJyLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAotCQkJCQlpcnItPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKKwlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOworCWlmIChzZXRfc2lnX2FkZHIpIHsKKwkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgaXJyLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAorCQkJCSAgIGlyci0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC0xNzQ2LDcgKzE3NzYsNyBAQAogCS5tZSA9IFRISVNfTU9EVUxFLAogCS5tYXhfZXhwZWN0ZWQgPSAzMiwKIAkudGltZW91dCA9IDI0MCwKLQkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHtfX2NvbnN0YW50X2h0b25zKFJBU19QT1JUKX19LAorCS50dXBsZSA9IHsuc3JjID0gey51ID0gey50Y3AgPSB7LnBvcnQgPSBfX2NvbnN0YW50X2h0b25zKFJBU19QT1JUKX19fSwKIAkJICAuZHN0ID0gey5wcm90b251bSA9IElQUFJPVE9fVURQfX0sCiAJLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkV9fSwKIAkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn19LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5jCmluZGV4IGEyYWY1ZTAuLjRkMTkzNzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX3BwdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMKQEAgLTEyNCw2ICsxMjQsOCBAQAogc3RhdGljIHZvaWQgcHB0cF9leHBlY3RmbihzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKIAkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogeworCXR5cGVvZihpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKSBpcF9uYXRfcHB0cF9leHBlY3RmbjsKKwogCURFQlVHUCgiaW5jcmVhc2luZyB0aW1lb3V0c1xuIik7CiAKIAkvKiBpbmNyZWFzZSB0aW1lb3V0IG9mIEdSRSBkYXRhIGNoYW5uZWwgY29ubnRyYWNrIGVudHJ5ICovCkBAIC0xMzMsNyArMTM1LDkgQEAKIAkvKiBDYW4geW91IHNlZSBob3cgcnVzdHkgdGhpcyBjb2RlIGlzLCBjb21wYXJlZCB3aXRoIHRoZSBwcmUtMi42LjExCiAJICogb25lPyBUaGF0J3Mgd2hhdCBoYXBwZW5lZCB0byBteSBzaGlueSBuZXduYXQgb2YgMjAwMiA7KCAtSFcgKi8KIAotCWlmICghaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbikgeworCXJjdV9yZWFkX2xvY2soKTsKKwlpcF9uYXRfcHB0cF9leHBlY3RmbiA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKTsKKwlpZiAoIWlwX25hdF9wcHRwX2V4cGVjdGZuKSB7CiAJCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgaW52X3Q7CiAJCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBfb3RoZXI7CiAKQEAgLTE0Miw3ICsxNDYsNyBAQAogCQlERUJVR1AoInRyeWluZyB0byB1bmV4cGVjdCBvdGhlciBkaXI6ICIpOwogCQlEVU1QX1RVUExFKCZpbnZfdCk7CiAKLQkJZXhwX290aGVyID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZpbnZfdCk7CisJCWV4cF9vdGhlciA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJmludl90KTsKIAkJaWYgKGV4cF9vdGhlcikgewogCQkJLyogZGVsZXRlIG90aGVyIGV4cGVjdGF0aW9uLiAgKi8KIAkJCURFQlVHUCgiZm91bmRcbiIpOwpAQCAtMTUzLDggKzE1Nyw5IEBACiAJCX0KIAl9IGVsc2UgewogCQkvKiB3ZSBuZWVkIG1vcmUgdGhhbiBzaW1wbGUgaW52ZXJzaW9uICovCi0JCWlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4oY3QsIGV4cCk7CisJCWlwX25hdF9wcHRwX2V4cGVjdGZuKGN0LCBleHApOwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIGludCBkZXN0cm95X3NpYmxpbmdfb3JfZXhwKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpCkBAIC0xNzYsNyArMTgxLDcgQEAKIAkJaXBfY29ubnRyYWNrX3B1dChzaWJsaW5nKTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKLQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKHQpOworCQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KHQpOwogCQlpZiAoZXhwKSB7CiAJCQlERUJVR1AoInVuZXhwZWN0X3JlbGF0ZWQgb2YgZXhwZWN0ICVwXG4iLCBleHApOwogCQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKQEAgLTIyNiw2ICsyMzEsNyBAQAogewogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBfb3JpZywgKmV4cF9yZXBseTsKIAlpbnQgcmV0ID0gMTsKKwl0eXBlb2YoaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKSBpcF9uYXRfcHB0cF9leHBfZ3JlOwogCiAJZXhwX29yaWcgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKIAlpZiAoZXhwX29yaWcgPT0gTlVMTCkKQEAgLTI2Miw4ICsyNjgsOSBAQAogCWV4cF9yZXBseS0+dHVwbGUuZHN0LnUuZ3JlLmtleSA9IHBlZXJfY2FsbGlkOwogCWV4cF9yZXBseS0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7CiAKLQlpZiAoaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKQotCQlpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUoZXhwX29yaWcsIGV4cF9yZXBseSk7CisJaXBfbmF0X3BwdHBfZXhwX2dyZSA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpOworCWlmIChpcF9uYXRfcHB0cF9leHBfZ3JlKQorCQlpcF9uYXRfcHB0cF9leHBfZ3JlKGV4cF9vcmlnLCBleHBfcmVwbHkpOwogCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwX29yaWcpICE9IDApCiAJCWdvdG8gb3V0X3B1dF9ib3RoOwogCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwX3JlcGx5KSAhPSAwKQpAQCAtMzAzLDYgKzMxMCw3IEBACiAJc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mbzsKIAl1X2ludDE2X3QgbXNnOwogCV9fYmUxNiBjaWQgPSAwLCBwY2lkID0gMDsKKwl0eXBlb2YoaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kKSBpcF9uYXRfcHB0cF9pbmJvdW5kOwogCiAJbXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpOwogCURFQlVHUCgiaW5ib3VuZCBjb250cm9sIG1lc3NhZ2UgJXNcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSk7CkBAIC00MDIsOSArNDEwLDkgQEAKIAkJZ290byBpbnZhbGlkOwogCX0KIAotCWlmIChpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpCi0JCXJldHVybiBpcF9uYXRfcHB0cF9ob29rX2luYm91bmQocHNrYiwgY3QsIGN0aW5mbywgY3RsaCwKLQkJCQkJCXBwdHBSZXEpOworCWlwX25hdF9wcHRwX2luYm91bmQgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kKTsKKwlpZiAoaXBfbmF0X3BwdHBfaW5ib3VuZCkKKwkJcmV0dXJuIGlwX25hdF9wcHRwX2luYm91bmQocHNrYiwgY3QsIGN0aW5mbywgY3RsaCwgcHB0cFJlcSk7CiAJcmV0dXJuIE5GX0FDQ0VQVDsKIAogaW52YWxpZDoKQEAgLTQyNyw2ICs0MzUsNyBAQAogCXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9wcHRwX2luZm87CiAJdV9pbnQxNl90IG1zZzsKIAlfX2JlMTYgY2lkID0gMCwgcGNpZCA9IDA7CisJdHlwZW9mKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpIGlwX25hdF9wcHRwX291dGJvdW5kOwogCiAJbXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpOwogCURFQlVHUCgib3V0Ym91bmQgY29udHJvbCBtZXNzYWdlICVzXG4iLCBwcHRwX21zZ19uYW1lW21zZ10pOwpAQCAtNDkyLDkgKzUwMSw5IEBACiAJCWdvdG8gaW52YWxpZDsKIAl9CiAKLQlpZiAoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCkKLQkJcmV0dXJuIGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQocHNrYiwgY3QsIGN0aW5mbywgY3RsaCwKLQkJCQkJCSBwcHRwUmVxKTsKKwlpcF9uYXRfcHB0cF9vdXRib3VuZCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKTsKKwlpZiAoaXBfbmF0X3BwdHBfb3V0Ym91bmQpCisJCXJldHVybiBpcF9uYXRfcHB0cF9vdXRib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLCBwcHRwUmVxKTsKIAlyZXR1cm4gTkZfQUNDRVBUOwogCiBpbnZhbGlkOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMKaW5kZXggNzVmN2MzZGIuLjkxODMyZWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwpAQCAtMTE0LDYgKzExNCw3IEBACiAJdV9pbnQxNl90IGRjY19wb3J0OwogCWludCBpLCByZXQgPSBORl9BQ0NFUFQ7CiAJY2hhciAqYWRkcl9iZWdfcCwgKmFkZHJfZW5kX3A7CisJdHlwZW9mKGlwX25hdF9pcmNfaG9vaykgaXBfbmF0X2lyYzsKIAogCURFQlVHUCgiZW50ZXJlZFxuIik7CiAKQEAgLTIyMiwxMSArMjIzLDEyIEBACiAJCQkJCXsgLnRjcCA9IHsgaHRvbnMoMHhGRkZGKSB9IH0sIDB4RkYgfX0pOwogCQkJZXhwLT5leHBlY3RmbiA9IE5VTEw7CiAJCQlleHAtPmZsYWdzID0gMDsKLQkJCWlmIChpcF9uYXRfaXJjX2hvb2spCi0JCQkJcmV0ID0gaXBfbmF0X2lyY19ob29rKHBza2IsIGN0aW5mbywgCi0JCQkJCQkgICAgICBhZGRyX2JlZ19wIC0gaWJfcHRyLAotCQkJCQkJICAgICAgYWRkcl9lbmRfcCAtIGFkZHJfYmVnX3AsCi0JCQkJCQkgICAgICBleHApOworCQkJaXBfbmF0X2lyYyA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfaXJjX2hvb2spOworCQkJaWYgKGlwX25hdF9pcmMpCisJCQkJcmV0ID0gaXBfbmF0X2lyYyhwc2tiLCBjdGluZm8sCisJCQkJCQkgYWRkcl9iZWdfcCAtIGliX3B0ciwKKwkJCQkJCSBhZGRyX2VuZF9wIC0gYWRkcl9iZWdfcCwKKwkJCQkJCSBleHApOwogCQkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKIAkJCQlyZXQgPSBORl9EUk9QOwogCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggMjYyZDBkNC4uNWZjZjkxZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKQEAgLTE1Myw2ICsxNTMsNyBAQAogCXJldHVybiByZXQ7CiAKIG5mYXR0cl9mYWlsdXJlOgorCWlwX2Nvbm50cmFja19wcm90b19wdXQocHJvdG8pOwogCXJldHVybiAtMTsKIH0KIApAQCAtMzE5LDggKzMyMCw2IEBACiAJfSBlbHNlIGlmIChldmVudHMgJiAoSVBDVF9ORVcgfCBJUENUX1JFTEFURUQpKSB7CiAJCXR5cGUgPSBJUENUTkxfTVNHX0NUX05FVzsKIAkJZmxhZ3MgPSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKLQkJLyogZHVtcCBldmVyeXRoaW5nICovCi0JCWV2ZW50cyA9IH4wVUw7CiAJCWdyb3VwID0gTkZOTEdSUF9DT05OVFJBQ0tfTkVXOwogCX0gZWxzZSBpZiAoZXZlbnRzICYgKElQQ1RfU1RBVFVTIHwgSVBDVF9QUk9UT0lORk8pKSB7CiAJCXR5cGUgPSBJUENUTkxfTVNHX0NUX05FVzsKQEAgLTM1NSwyOCArMzU0LDM1IEBACiAJaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKGN0LCBJUF9DVF9ESVJfUkVQTFkpKSA8IDApCiAJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAJTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0JCi0JLyogTkFUIHN0dWZmIGlzIG5vdyBhIHN0YXR1cyBmbGFnICovCi0JaWYgKChldmVudHMgJiBJUENUX1NUQVRVUyB8fCBldmVudHMgJiBJUENUX05BVElORk8pCi0JICAgICYmIGN0bmV0bGlua19kdW1wX3N0YXR1cyhza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JaWYgKGV2ZW50cyAmIElQQ1RfUkVGUkVTSAotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlpZiAoZXZlbnRzICYgSVBDVF9QUk9UT0lORk8KLQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlpZiAoZXZlbnRzICYgSVBDVF9IRUxQSU5GTwotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9oZWxwaW5mbyhza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAKLQlpZiAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisJaWYgKGV2ZW50cyAmIElQQ1RfREVTVFJPWSkgeworCQlpZiAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKKwkJICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKQorCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKKwl9IGVsc2UgeworCQlpZiAoY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHNrYiwgY3QpIDwgMCkKKwkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAKLQlpZiAoZXZlbnRzICYgSVBDVF9NQVJLCi0JICAgICYmIGN0bmV0bGlua19kdW1wX21hcmsoc2tiLCBjdCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCQlpZiAoY3RuZXRsaW5rX2R1bXBfdGltZW91dChza2IsIGN0KSA8IDApCisJCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmIChldmVudHMgJiBJUENUX1BST1RPSU5GTworCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHNrYiwgY3QpIDwgMCkKKwkJICAgIAlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmICgoZXZlbnRzICYgSVBDVF9IRUxQRVIgfHwgY3QtPmhlbHBlcikKKwkJICAgICYmIGN0bmV0bGlua19kdW1wX2hlbHBpbmZvKHNrYiwgY3QpIDwgMCkKKwkJICAgIAlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmICgoZXZlbnRzICYgSVBDVF9NQVJLIHx8IGN0LT5tYXJrKQorCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfbWFyayhza2IsIGN0KSA8IDApCisJCSAgICAJZ290byBuZmF0dHJfZmFpbHVyZTsKKworCQlpZiAoZXZlbnRzICYgSVBDVF9DT1VOVEVSX0ZJTExJTkcgJiYKKwkJICAgIChjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAorCQkgICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKSkKKwkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisJfQogCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwogCW5mbmV0bGlua19zZW5kKHNrYiwgMCwgZ3JvdXAsIDApOwpAQCAtNzQyLDcgKzc0OCw2IEBACiAJCWlwX2Nvbm50cmFja19wdXQoY3QpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JTkVUTElOS19DQihza2IyKS5kc3RfcGlkID0gTkVUTElOS19DQihza2IpLnBpZDsKIAogCWVyciA9IGN0bmV0bGlua19maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsIAogCQkJCSAgSVBDVE5MX01TR19DVF9ORVcsIDEsIGN0KTsKQEAgLTk0NSw5ICs5NTAsMTEgQEAKIAljdC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGN0LT50aW1lb3V0LmV4cGlyZXMgKiBIWjsKIAljdC0+c3RhdHVzIHw9IElQU19DT05GSVJNRUQ7CiAKLQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhjdCwgY2RhKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnI7CisJaWYgKGNkYVtDVEFfU1RBVFVTLTFdKSB7CisJCWVyciA9IGN0bmV0bGlua19jaGFuZ2Vfc3RhdHVzKGN0LCBjZGEpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KIAogCWlmIChjZGFbQ1RBX1BST1RPSU5GTy0xXSkgewogCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3Byb3RvaW5mbyhjdCwgY2RhKTsKQEAgLTEyNTYsNyArMTI2Myw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoJnR1cGxlKTsKKwlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KCZ0dXBsZSk7CiAJaWYgKCFleHApCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC0xMjcyLDggKzEyNzksNyBAQAogCXNrYjIgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwogCWlmICghc2tiMikKIAkJZ290byBvdXQ7Ci0JTkVUTElOS19DQihza2IyKS5kc3RfcGlkID0gTkVUTElOS19DQihza2IpLnBpZDsKLQkKKwogCWVyciA9IGN0bmV0bGlua19leHBfZmlsbF9pbmZvKHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsIAogCQkJCSAgICAgIG5saC0+bmxtc2dfc2VxLCBJUENUTkxfTVNHX0VYUF9ORVcsCiAJCQkJICAgICAgMSwgZXhwKTsKQEAgLTEzMTAsNyArMTMxNiw3IEBACiAJCQlyZXR1cm4gZXJyOwogCiAJCS8qIGJ1bXAgdXNhZ2UgY291bnQgdG8gMiAqLwotCQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoJnR1cGxlKTsKKwkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmdHVwbGUpOwogCQlpZiAoIWV4cCkKIAkJCXJldHVybiAtRU5PRU5UOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19ncmUuYwppbmRleCA1ZmUwMjZmLi5hYzFjNDllIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMKQEAgLTM0LDggKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogc3RhdGljIERFRklORV9SV0xPQ0soaXBfY3RfZ3JlX2xvY2spOwotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpCiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3NpcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zaXAuYwppbmRleCBmNGY3NTk5Li4zYTI2ZDYzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3NpcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc2lwLmMKQEAgLTUyLDIwICs1Miw1NiBAQAogCQkJCWNvbnN0IGNoYXIgKmRwdHIpOwogRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X3NkcF9ob29rKTsKIAotaW50IGN0X3NpcF9nZXRfaW5mbyhjb25zdCBjaGFyICpkcHRyLCBzaXplX3QgZGxlbiwKLQkJCQl1bnNpZ25lZCBpbnQgKm1hdGNob2ZmLAotCQkJCXVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCi0JCQkJc3RydWN0IHNpcF9oZWFkZXJfbmZvICpobmZvKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGN0X3NpcF9nZXRfaW5mbyk7Ci0KLQogc3RhdGljIGludCBkaWdpdHNfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KTsKIHN0YXRpYyBpbnQgZXBhZGRyX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCk7CiBzdGF0aWMgaW50IHNrcF9kaWdpdHNfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KTsKIHN0YXRpYyBpbnQgc2twX2VwYWRkcl9sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpOwogCi1zdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gY3Rfc2lwX2hkcnNbXSA9IHsKLQl7IAkvKiBWaWEgaGVhZGVyICovCitzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8geworCWNvbnN0IGNoYXIJKmxuYW1lOworCWNvbnN0IGNoYXIJKnNuYW1lOworCWNvbnN0IGNoYXIJKmxuX3N0cjsKKwlzaXplX3QJCWxubGVuOworCXNpemVfdAkJc25sZW47CisJc2l6ZV90CQlsbl9zdHJsZW47CisJaW50CQljYXNlX3NlbnNpdGl2ZTsKKwlpbnQJCSgqbWF0Y2hfbGVuKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworfTsKKworc3RhdGljIHN0cnVjdCBzaXBfaGVhZGVyX25mbyBjdF9zaXBfaGRyc1tdID0geworCVtQT1NfUkVHX1JFUV9VUkldID0geyAJLyogU0lQIFJFR0lTVEVSIHJlcXVlc3QgVVJJICovCisJCS5sbmFtZQkJPSAic2lwOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoInNpcDoiKSAtIDEsCisJCS5sbl9zdHIJCT0gIjoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgorCX0sCisJW1BPU19SRVFfVVJJXSA9IHsgCS8qIFNJUCByZXF1ZXN0IFVSSSAqLworCQkubG5hbWUJCT0gInNpcDoiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubG5fc3RyCQk9ICJAIiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiQCIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KKwl9LAorCVtQT1NfRlJPTV0gPSB7CQkvKiBTSVAgRnJvbSBoZWFkZXIgKi8KKwkJLmxuYW1lCQk9ICJGcm9tOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoIkZyb206IikgLSAxLAorCQkuc25hbWUJCT0gIlxyXG5mOiIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxyXG5mOiIpIC0gMSwKKwkJLmxuX3N0cgkJPSAic2lwOiIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoInNpcDoiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBza3BfZXBhZGRyX2xlbiwKKwl9LAorCVtQT1NfVE9dID0gewkJLyogU0lQIFRvIGhlYWRlciAqLworCQkubG5hbWUJCT0gIlRvOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlRvOiIpIC0gMSwKKwkJLnNuYW1lCQk9ICJcclxudDoiLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxudDoiKSAtIDEsCisJCS5sbl9zdHIJCT0gInNpcDoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4sCisJfSwKKwlbUE9TX1ZJQV0gPSB7IAkJLyogU0lQIFZpYSBoZWFkZXIgKi8KIAkJLmxuYW1lCQk9ICJWaWE6IiwKIAkJLmxubGVuCQk9IHNpemVvZigiVmlhOiIpIC0gMSwKIAkJLnNuYW1lCQk9ICJcclxudjoiLApAQCAtNzQsNyArMTEwLDcgQEAKIAkJLmxuX3N0cmxlbgk9IHNpemVvZigiVURQICIpIC0gMSwKIAkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4sCiAJfSwKLQl7IAkvKiBDb250YWN0IGhlYWRlciAqLworCVtQT1NfQ09OVEFDVF0gPSB7IAkvKiBTSVAgQ29udGFjdCBoZWFkZXIgKi8KIAkJLmxuYW1lCQk9ICJDb250YWN0OiIsCiAJCS5sbmxlbgkJPSBzaXplb2YoIkNvbnRhY3Q6IikgLSAxLAogCQkuc25hbWUJCT0gIlxyXG5tOiIsCkBAIC04Myw3ICsxMTksNyBAQAogCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAogCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4KIAl9LAotCXsgCS8qIENvbnRlbnQgbGVuZ3RoIGhlYWRlciAqLworCVtQT1NfQ09OVEVOVF0gPSB7IAkvKiBTSVAgQ29udGVudCBsZW5ndGggaGVhZGVyICovCiAJCS5sbmFtZQkJPSAiQ29udGVudC1MZW5ndGg6IiwKIAkJLmxubGVuCQk9IHNpemVvZigiQ29udGVudC1MZW5ndGg6IikgLSAxLAogCQkuc25hbWUJCT0gIlxyXG5sOiIsCkBAIC05Miw3ICsxMjgsOCBAQAogCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI6IikgLSAxLAogCQkubWF0Y2hfbGVuCT0gc2twX2RpZ2l0c19sZW4KIAl9LAotCXsJLyogU0RQIG1lZGlhIGluZm8gKi8KKwlbUE9TX01FRElBXSA9IHsJCS8qIFNEUCBtZWRpYSBpbmZvICovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCiAJCS5sbmFtZQkJPSAiXG5tPSIsCiAJCS5sbmxlbgkJPSBzaXplb2YoIlxubT0iKSAtIDEsCiAJCS5zbmFtZQkJPSAiXHJtPSIsCkBAIC0xMDEsNyArMTM4LDggQEAKIAkJLmxuX3N0cmxlbgk9IHNpemVvZigiYXVkaW8gIikgLSAxLAogCQkubWF0Y2hfbGVuCT0gZGlnaXRzX2xlbgogCX0sCi0JeyAJLyogU0RQIG93bmVyIGFkZHJlc3MqLworCVtQT1NfT1dORVJdID0geyAJLyogU0RQIG93bmVyIGFkZHJlc3MqLworCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAogCQkubG5hbWUJCT0gIlxubz0iLAogCQkubG5sZW4JCT0gc2l6ZW9mKCJcbm89IikgLSAxLAogCQkuc25hbWUJCT0gIlxybz0iLApAQCAtMTEwLDcgKzE0OCw4IEBACiAJCS5sbl9zdHJsZW4JPSBzaXplb2YoIklOIElQNCAiKSAtIDEsCiAJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCiAJfSwKLQl7IAkvKiBTRFAgY29ubmVjdGlvbiBpbmZvICovCisJW1BPU19DT05ORUNUSU9OXSA9IHsgCS8qIFNEUCBjb25uZWN0aW9uIGluZm8gKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKIAkJLmxuYW1lCQk9ICJcbmM9IiwKIAkJLmxubGVuCQk9IHNpemVvZigiXG5jPSIpIC0gMSwKIAkJLnNuYW1lCQk9ICJccmM9IiwKQEAgLTExOSwxNiArMTU4LDggQEAKIAkJLmxuX3N0cmxlbgk9IHNpemVvZigiSU4gSVA0ICIpIC0gMSwKIAkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KIAl9LAotCXsgCS8qIFJlcXVlc3RzIGhlYWRlcnMgKi8KLQkJLmxuYW1lCQk9ICJzaXA6IiwKLQkJLmxubGVuCQk9IHNpemVvZigic2lwOiIpIC0gMSwKLQkJLnNuYW1lCQk9ICJzaXA6IiwKLQkJLnNubGVuCQk9IHNpemVvZigic2lwOiIpIC0gMSwgLyogeWVzLCBpIGtub3cuLiA7KSAqLwotCQkubG5fc3RyCQk9ICJAIiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigiQCIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KLQl9LAotCXsgCS8qIFNEUCB2ZXJzaW9uIGhlYWRlciAqLworCVtQT1NfU0RQX0hFQURFUl0gPSB7IAkvKiBTRFAgdmVyc2lvbiBoZWFkZXIgKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKIAkJLmxuYW1lCQk9ICJcbnY9IiwKIAkJLmxubGVuCQk9IHNpemVvZigiXG52PSIpIC0gMSwKIAkJLnNuYW1lCQk9ICJccnY9IiwKQEAgLTEzOCw3ICsxNjksNiBAQAogCQkubWF0Y2hfbGVuCT0gZGlnaXRzX2xlbgogCX0KIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfaGRycyk7CiAKIC8qIGdldCBsaW5lIGxlbmdodCB1bnRpbCBmaXJzdCBDUiBvciBMRiBzZWVuLiAqLwogaW50IGN0X3NpcF9sbmxlbihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpsaW1pdCkKQEAgLTE1OSwxMyArMTg5LDE5IEBACiAKIC8qIExpbmVhciBzdHJpbmcgc2VhcmNoLCBjYXNlIHNlbnNpdGl2ZS4gKi8KIGNvbnN0IGNoYXIgKmN0X3NpcF9zZWFyY2goY29uc3QgY2hhciAqbmVlZGxlLCBjb25zdCBjaGFyICpoYXlzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5lZWRsZV9sZW4sIHNpemVfdCBoYXlzdGFja19sZW4pCisJCQkgIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuLAorCQkJICBpbnQgY2FzZV9zZW5zaXRpdmUpCiB7CiAJY29uc3QgY2hhciAqbGltaXQgPSBoYXlzdGFjayArIChoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVuKTsKIAogCXdoaWxlIChoYXlzdGFjayA8PSBsaW1pdCkgewotCQlpZiAobWVtY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCi0JCQlyZXR1cm4gaGF5c3RhY2s7CisJCWlmIChjYXNlX3NlbnNpdGl2ZSkgeworCQkJaWYgKHN0cm5jbXAoaGF5c3RhY2ssIG5lZWRsZSwgbmVlZGxlX2xlbikgPT0gMCkKKwkJCQlyZXR1cm4gaGF5c3RhY2s7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RybmljbXAoaGF5c3RhY2ssIG5lZWRsZSwgbmVlZGxlX2xlbikgPT0gMCkKKwkJCQlyZXR1cm4gaGF5c3RhY2s7CisJCX0KIAkJaGF5c3RhY2srKzsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0yNjMsOCArMjk5LDkgQEAKIGludCBjdF9zaXBfZ2V0X2luZm8oY29uc3QgY2hhciAqZHB0ciwgc2l6ZV90IGRsZW4sCiAJCSAgICB1bnNpZ25lZCBpbnQgKm1hdGNob2ZmLAogCQkgICAgdW5zaWduZWQgaW50ICptYXRjaGxlbiwKLQkJICAgIHN0cnVjdCBzaXBfaGVhZGVyX25mbyAqaG5mbykKKwkJICAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKQogeworCXN0cnVjdCBzaXBfaGVhZGVyX25mbyAqaG5mbyA9ICZjdF9zaXBfaGRyc1twb3NdOwogCWNvbnN0IGNoYXIgKmxpbWl0LCAqYXV4LCAqayA9IGRwdHI7CiAJaW50IHNoaWZ0ID0gMDsKIApAQCAtMjcyLDEyICszMDksMTQgQEAKIAogCXdoaWxlIChkcHRyIDw9IGxpbWl0KSB7CiAJCWlmICgoc3RybmNtcChkcHRyLCBobmZvLT5sbmFtZSwgaG5mby0+bG5sZW4pICE9IDApICYmCi0JCSAgICAoc3RybmNtcChkcHRyLCBobmZvLT5zbmFtZSwgaG5mby0+c25sZW4pICE9IDApKSB7CisJCSAgICAoaG5mby0+c25hbWUgPT0gTlVMTCB8fAorCQkgICAgIHN0cm5jbXAoZHB0ciwgaG5mby0+c25hbWUsIGhuZm8tPnNubGVuKSAhPSAwKSkgewogCQkJZHB0cisrOwogCQkJY29udGludWU7CiAJCX0KIAkJYXV4ID0gY3Rfc2lwX3NlYXJjaChobmZvLT5sbl9zdHIsIGRwdHIsIGhuZm8tPmxuX3N0cmxlbiwKLQkJICAgICAgICAgICAgICAgICAgICBjdF9zaXBfbG5sZW4oZHB0ciwgbGltaXQpKTsKKwkJICAgICAgICAgICAgICAgICAgICBjdF9zaXBfbG5sZW4oZHB0ciwgbGltaXQpLAorCQkJCSAgICBobmZvLT5jYXNlX3NlbnNpdGl2ZSk7CiAJCWlmICghYXV4KSB7CiAJCQlERUJVR1AoIiclcycgbm90IGZvdW5kIGluICclcycuXG4iLCBobmZvLT5sbl9zdHIsCiAJCQkgICAgICAgaG5mby0+bG5hbWUpOwpAQCAtMjk4LDYgKzMzNyw3IEBACiAJREVCVUdQKCIlcyBoZWFkZXIgbm90IGZvdW5kLlxuIiwgaG5mby0+bG5hbWUpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3Rfc2lwX2dldF9pbmZvKTsKIAogc3RhdGljIGludCBzZXRfZXhwZWN0ZWRfcnRwKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKQEAgLTMwOCw2ICszNDgsNyBAQAogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CiAJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAlpbnQgcmV0OworCXR5cGVvZihpcF9uYXRfc2RwX2hvb2spIGlwX25hdF9zZHA7CiAKIAlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKIAlpZiAoZXhwID09IE5VTEwpCkBAIC0zMjgsOCArMzY5LDkgQEAKIAlleHAtPmV4cGVjdGZuID0gTlVMTDsKIAlleHAtPmZsYWdzID0gMDsKIAotCWlmIChpcF9uYXRfc2RwX2hvb2spCi0JCXJldCA9IGlwX25hdF9zZHBfaG9vayhwc2tiLCBjdGluZm8sIGV4cCwgZHB0cik7CisJaXBfbmF0X3NkcCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfc2RwX2hvb2spOworCWlmIChpcF9uYXRfc2RwKQorCQlyZXQgPSBpcF9uYXRfc2RwKHBza2IsIGN0aW5mbywgZXhwLCBkcHRyKTsKIAllbHNlIHsKIAkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCiAJCQlyZXQgPSBORl9EUk9QOwpAQCAtMzUxLDYgKzM5Myw3IEBACiAJaW50IG1hdGNob2ZmLCBtYXRjaGxlbjsKIAlfX2JlMzIgaXBhZGRyOwogCXVfaW50MTZfdCBwb3J0OworCXR5cGVvZihpcF9uYXRfc2lwX2hvb2spIGlwX25hdF9zaXA7CiAKIAkvKiBObyBEYXRhID8gKi8KIAlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKQEAgLTM2OCw4ICs0MTEsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoaXBfbmF0X3NpcF9ob29rKSB7Ci0JCWlmICghaXBfbmF0X3NpcF9ob29rKHBza2IsIGN0aW5mbywgY3QsICZkcHRyKSkgeworCWlwX25hdF9zaXAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NpcF9ob29rKTsKKwlpZiAoaXBfbmF0X3NpcCkgeworCQlpZiAoIWlwX25hdF9zaXAocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIpKSB7CiAJCQlyZXQgPSBORl9EUk9QOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTM4OSw3ICs0MzMsNyBAQAogCX0KIAkvKiBHZXQgaXAgYW5kIHBvcnQgYWRkcmVzcyBmcm9tIFNEUCBwYWNrZXQuICovCiAJaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCBkYXRhbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICZjdF9zaXBfaGRyc1tQT1NfQ09OTkVDVElPTl0pID4gMCkgeworCSAgICAgICAgICAgICAgICAgICAgUE9TX0NPTk5FQ1RJT04pID4gMCkgewogCiAJCS8qIFdlJ2xsIGRyb3Agb25seSBpZiB0aGVyZSBhcmUgcGFyc2UgcHJvYmxlbXMuICovCiAJCWlmIChwYXJzZV9pcGFkZHIoZHB0ciArIG1hdGNob2ZmLCBOVUxMLCAmaXBhZGRyLApAQCAtMzk4LDcgKzQ0Miw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQlpZiAoY3Rfc2lwX2dldF9pbmZvKGRwdHIsIGRhdGFsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLAotCQkgICAgICAgICAgICAgICAgICAgICZjdF9zaXBfaGRyc1tQT1NfTUVESUFdKSA+IDApIHsKKwkJICAgICAgICAgICAgICAgICAgICBQT1NfTUVESUEpID4gMCkgewogCiAJCQlwb3J0ID0gc2ltcGxlX3N0cnRvdWwoZHB0ciArIG1hdGNob2ZmLCBOVUxMLCAxMCk7CiAJCQlpZiAocG9ydCA8IDEwMjQpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggMDIxMzU3NS4uODZlZmI1NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTI4LDkgKzI4LDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KIAotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpCi0KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgpAQCAtMTM5LDcgKzEzNiw2IEBACiAJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoYXNoKTsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKIAotCUFTU0VSVF9SRUFEX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKIAlJUF9ORl9BU1NFUlQoY29ubnRyYWNrKTsKIAogCS8qIHdlIG9ubHkgd2FudCB0byBwcmludCBESVJfT1JJR0lOQUwgKi8KQEAgLTkyNiw3ICs5MjIsNyBAQAogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYwppbmRleCBmZTBiNjM0Li5lZjU2ZGUyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYwpAQCAtNTAsNiArNTAsNyBAQAogCXN0cnVjdCB0ZnRwaGRyIF90ZnRwaCwgKnRmaDsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwogCXVuc2lnbmVkIGludCByZXQgPSBORl9BQ0NFUFQ7CisJdHlwZW9mKGlwX25hdF90ZnRwX2hvb2spIGlwX25hdF90ZnRwOwogCiAJdGZoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLAogCQkJCSAoKnBza2IpLT5uaC5pcGgtPmlobCo0K3NpemVvZihzdHJ1Y3QgdWRwaGRyKSwKQEAgLTgxLDggKzgyLDkgQEAKIAkJREVCVUdQKCJleHBlY3Q6ICIpOwogCQlEVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKIAkJRFVNUF9UVVBMRSgmZXhwLT5tYXNrKTsKLQkJaWYgKGlwX25hdF90ZnRwX2hvb2spCi0JCQlyZXQgPSBpcF9uYXRfdGZ0cF9ob29rKHBza2IsIGN0aW5mbywgZXhwKTsKKwkJaXBfbmF0X3RmdHAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3RmdHBfaG9vayk7CisJCWlmIChpcF9uYXRfdGZ0cCkKKwkJCXJldCA9IGlwX25hdF90ZnRwKHBza2IsIGN0aW5mbywgZXhwKTsKIAkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKIAkJCXJldCA9IE5GX0RST1A7CiAJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYwppbmRleCAzYTg4ODcxLi44NWRmMWE5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfYW1hbmRhLmMKQEAgLTcwLDE1ICs3MCwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2FtYW5kYV9maW5pKHZvaWQpCiB7Ci0JaXBfbmF0X2FtYW5kYV9ob29rID0gTlVMTDsKLQkvKiBNYWtlIHN1cmUgbm9vbmUgY2FsbHMgaXQsIG1lYW53aGlsZS4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2FtYW5kYV9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2FtYW5kYV9pbml0KHZvaWQpCiB7Ci0JQlVHX09OKGlwX25hdF9hbWFuZGFfaG9vayk7Ci0JaXBfbmF0X2FtYW5kYV9ob29rID0gaGVscDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9hbWFuZGFfaG9vaykpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfYW1hbmRhX2hvb2ssIGhlbHApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfY29yZS5jCmluZGV4IDRiNjI2MGEuLjlkMWE1MTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfY29yZS5jCkBAIC0zNjIsMTIgKzM2MiwxMCBAQAogCWlwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmOwogCiAJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7Ci0JCWlwaC0+Y2hlY2sgPSBuZl9jc3VtX3VwZGF0ZSh+aXBoLT5zYWRkciwgdGFyZ2V0LT5zcmMuaXAsCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJbmZfY3N1bV9yZXBsYWNlNCgmaXBoLT5jaGVjaywgaXBoLT5zYWRkciwgdGFyZ2V0LT5zcmMuaXApOwogCQlpcGgtPnNhZGRyID0gdGFyZ2V0LT5zcmMuaXA7CiAJfSBlbHNlIHsKLQkJaXBoLT5jaGVjayA9IG5mX2NzdW1fdXBkYXRlKH5pcGgtPmRhZGRyLCB0YXJnZXQtPmRzdC5pcCwKLQkJCQkJICAgIGlwaC0+Y2hlY2spOworCQluZl9jc3VtX3JlcGxhY2U0KCZpcGgtPmNoZWNrLCBpcGgtPmRhZGRyLCB0YXJnZXQtPmRzdC5pcCk7CiAJCWlwaC0+ZGFkZHIgPSB0YXJnZXQtPmRzdC5pcDsKIAl9CiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2Z0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYwppbmRleCBhNzFjMjMzLi45MTM5NjBlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2Z0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfZnRwLmMKQEAgLTE1NiwxNSArMTU2LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfZnRwX2Zpbmkodm9pZCkKIHsKLQlpcF9uYXRfZnRwX2hvb2sgPSBOVUxMOwotCS8qIE1ha2Ugc3VyZSBub29uZSBjYWxscyBpdCwgbWVhbndoaWxlLiAqLwotCXN5bmNocm9uaXplX25ldCgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfZnRwX2hvb2ssIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfZnRwX2luaXQodm9pZCkKIHsKLQlCVUdfT04oaXBfbmF0X2Z0cF9ob29rKTsKLQlpcF9uYXRfZnRwX2hvb2sgPSBpcF9uYXRfZnRwOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X2Z0cF9ob29rKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9mdHBfaG9vaywgaXBfbmF0X2Z0cCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jCmluZGV4IDNiZjg1ODQuLmVlODBmZWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYwpAQCAtMTg4LDEwICsxODgsOCBAQAogCQkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAogCQkJCQkgICAJCWRhdGFsZW4sIDApKTsKIAl9IGVsc2UKLQkJdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwKLQkJCQkJCSAgIGh0b25zKG9sZGxlbikgXiBodG9ucygweEZGRkYpLAotCQkJCQkJICAgaHRvbnMoZGF0YWxlbiksCi0JCQkJCQkgICB0Y3BoLT5jaGVjaywgMSk7CisJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKKwkJCQkJaHRvbnMob2xkbGVuKSwgaHRvbnMoZGF0YWxlbiksIDEpOwogCiAJaWYgKHJlcF9sZW4gIT0gbWF0Y2hfbGVuKSB7CiAJCXNldF9iaXQoSVBTX1NFUV9BREpVU1RfQklULCAmY3QtPnN0YXR1cyk7CkBAIC0yNjQsMTIgKzI2MiwxMCBAQAogCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXVkcGgsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFsZW4sIDApKTsKIAkJaWYgKCF1ZHBoLT5jaGVjaykKLQkJCXVkcGgtPmNoZWNrID0gLTE7CisJCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwogCX0gZWxzZQotCQl1ZHBoLT5jaGVjayA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLAotCQkJCQkJICAgaHRvbnMob2xkbGVuKSBeIGh0b25zKDB4RkZGRiksCi0JCQkJCQkgICBodG9ucyhkYXRhbGVuKSwKLQkJCQkJCSAgIHVkcGgtPmNoZWNrLCAxKTsKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdWRwaC0+Y2hlY2ssICpwc2tiLAorCQkJCQlodG9ucyhvbGRsZW4pLCBodG9ucyhkYXRhbGVuKSwgMSk7CiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MKGlwX25hdF9tYW5nbGVfdWRwX3BhY2tldCk7CkBAIC0zMDcsMTQgKzMwMywxMCBAQAogCQkJbnRvaGwoc2Fjay0+c3RhcnRfc2VxKSwgbmV3X3N0YXJ0X3NlcSwKIAkJCW50b2hsKHNhY2stPmVuZF9zZXEpLCBuZXdfZW5kX3NlcSk7CiAKLQkJdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZShza2IsCi0JCQkJCQkgICB+c2Fjay0+c3RhcnRfc2VxLAotCQkJCQkJICAgbmV3X3N0YXJ0X3NlcSwKLQkJCQkJCSAgIHRjcGgtPmNoZWNrLCAwKTsKLQkJdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZShza2IsCi0JCQkJCQkgICB+c2Fjay0+ZW5kX3NlcSwKLQkJCQkJCSAgIG5ld19lbmRfc2VxLAotCQkJCQkJICAgdGNwaC0+Y2hlY2ssIDApOworCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLAorCQkJCQlzYWNrLT5zdGFydF9zZXEsIG5ld19zdGFydF9zZXEsIDApOworCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLAorCQkJCQlzYWNrLT5lbmRfc2VxLCBuZXdfZW5kX3NlcSwgMCk7CiAJCXNhY2stPnN0YXJ0X3NlcSA9IG5ld19zdGFydF9zZXE7CiAJCXNhY2stPmVuZF9zZXEgPSBuZXdfZW5kX3NlcTsKIAkJc2Fja29mZiArPSBzaXplb2YoKnNhY2spOwpAQCAtMzk3LDEwICszODksOCBAQAogCWVsc2UKIAkJbmV3YWNrID0gaHRvbmwobnRvaGwodGNwaC0+YWNrX3NlcSkgLSBvdGhlcl93YXktPm9mZnNldF9iZWZvcmUpOwogCi0JdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwgfnRjcGgtPnNlcSwgbmV3c2VxLAotCQkJCQkgICB0Y3BoLT5jaGVjaywgMCk7Ci0JdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwgfnRjcGgtPmFja19zZXEsIG5ld2FjaywKLQkJCQkJICAgdGNwaC0+Y2hlY2ssIDApOworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCAqcHNrYiwgdGNwaC0+c2VxLCBuZXdzZXEsIDApOworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCAqcHNrYiwgdGNwaC0+YWNrX3NlcSwgbmV3YWNrLCAwKTsKIAogCURFQlVHUCgiQWRqdXN0aW5nIHNlcXVlbmNlIG51bWJlciBmcm9tICV1LT4ldSwgYWNrIGZyb20gJXUtPiV1XG4iLAogCQludG9obCh0Y3BoLT5zZXEpLCBudG9obChuZXdzZXEpLCBudG9obCh0Y3BoLT5hY2tfc2VxKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX2gzMjMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX2gzMjMuYwppbmRleCA0YTdkMzQ0Li5iZGM5OWVmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9oMzIzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfaDMyMy5jCkBAIC01NjMsMjUgKzU2MywyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JQlVHX09OKHNldF9oMjQ1X2FkZHJfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04oc2V0X2gyMjVfYWRkcl9ob29rICE9IE5VTEwpOwotCUJVR19PTihzZXRfc2lnX2FkZHJfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04oc2V0X3Jhc19hZGRyX2hvb2sgIT0gTlVMTCk7Ci0JQlVHX09OKG5hdF9ydHBfcnRjcF9ob29rICE9IE5VTEwpOwotCUJVR19PTihuYXRfdDEyMF9ob29rICE9IE5VTEwpOwotCUJVR19PTihuYXRfaDI0NV9ob29rICE9IE5VTEwpOwotCUJVR19PTihuYXRfY2FsbGZvcndhcmRpbmdfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04obmF0X3E5MzFfaG9vayAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9oMjQ1X2FkZHJfaG9vaykgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShzZXRfaDIyNV9hZGRyX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X3J0cF9ydGNwX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X3QxMjBfaG9vaykgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfaDI0NV9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9xOTMxX2hvb2spICE9IE5VTEwpOwogCi0Jc2V0X2gyNDVfYWRkcl9ob29rID0gc2V0X2gyNDVfYWRkcjsKLQlzZXRfaDIyNV9hZGRyX2hvb2sgPSBzZXRfaDIyNV9hZGRyOwotCXNldF9zaWdfYWRkcl9ob29rID0gc2V0X3NpZ19hZGRyOwotCXNldF9yYXNfYWRkcl9ob29rID0gc2V0X3Jhc19hZGRyOwotCW5hdF9ydHBfcnRjcF9ob29rID0gbmF0X3J0cF9ydGNwOwotCW5hdF90MTIwX2hvb2sgPSBuYXRfdDEyMDsKLQluYXRfaDI0NV9ob29rID0gbmF0X2gyNDU7Ci0JbmF0X2NhbGxmb3J3YXJkaW5nX2hvb2sgPSBuYXRfY2FsbGZvcndhcmRpbmc7Ci0JbmF0X3E5MzFfaG9vayA9IG5hdF9xOTMxOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDI0NV9hZGRyX2hvb2ssIHNldF9oMjQ1X2FkZHIpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDIyNV9hZGRyX2hvb2ssIHNldF9oMjI1X2FkZHIpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfc2lnX2FkZHJfaG9vaywgc2V0X3NpZ19hZGRyKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3Jhc19hZGRyX2hvb2ssIHNldF9yYXNfYWRkcik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9ydHBfcnRjcF9ob29rLCBuYXRfcnRwX3J0Y3ApOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfdDEyMF9ob29rLCBuYXRfdDEyMCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9oMjQ1X2hvb2ssIG5hdF9oMjQ1KTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2ssIG5hdF9jYWxsZm9yd2FyZGluZyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9xOTMxX2hvb2ssIG5hdF9xOTMxKTsKIAogCURFQlVHUCgiaXBfbmF0X2gzMjM6IGluaXQgc3VjY2Vzc1xuIik7CiAJcmV0dXJuIDA7CkBAIC01OTAsMTYgKzU5MCwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCXNldF9oMjQ1X2FkZHJfaG9vayA9IE5VTEw7Ci0Jc2V0X2gyMjVfYWRkcl9ob29rID0gTlVMTDsKLQlzZXRfc2lnX2FkZHJfaG9vayA9IE5VTEw7Ci0Jc2V0X3Jhc19hZGRyX2hvb2sgPSBOVUxMOwotCW5hdF9ydHBfcnRjcF9ob29rID0gTlVMTDsKLQluYXRfdDEyMF9ob29rID0gTlVMTDsKLQluYXRfaDI0NV9ob29rID0gTlVMTDsKLQluYXRfY2FsbGZvcndhcmRpbmdfaG9vayA9IE5VTEw7Ci0JbmF0X3E5MzFfaG9vayA9IE5VTEw7Ci0Jc3luY2hyb25pemVfbmV0KCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9oMjQ1X2FkZHJfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9oMjI1X2FkZHJfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9zaWdfYWRkcl9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3Jhc19hZGRyX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcnRwX3J0Y3BfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF90MTIwX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfaDI0NV9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcTkzMV9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9wcHRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9wcHRwLmMKaW5kZXggMzI5ZmRjZC4uZWM5NTdiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfcHB0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAlERUJVR1AoInRyeWluZyB0byB1bmV4cGVjdCBvdGhlciBkaXI6ICIpOwogCURVTVBfVFVQTEUoJnQpOwotCW90aGVyX2V4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZCgmdCk7CisJb3RoZXJfZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmdCk7CiAJaWYgKG90aGVyX2V4cCkgewogCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChvdGhlcl9leHApOwogCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChvdGhlcl9leHApOwpAQCAtMzE1LDE3ICszMTUsMTcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCUJVR19PTihpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKTsKLQlpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kID0gJnBwdHBfb3V0Ym91bmRfcGt0OworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCkpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kLCBwcHRwX291dGJvdW5kX3BrdCk7CiAKLQlCVUdfT04oaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kKTsKLQlpcF9uYXRfcHB0cF9ob29rX2luYm91bmQgPSAmcHB0cF9pbmJvdW5kX3BrdDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2luYm91bmQsIHBwdHBfaW5ib3VuZF9wa3QpOwogCi0JQlVHX09OKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSk7Ci0JaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlID0gJnBwdHBfZXhwX2dyZTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSkpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUsIHBwdHBfZXhwX2dyZSk7CiAKLQlCVUdfT04oaXBfbmF0X3BwdHBfaG9va19leHBlY3Rmbik7Ci0JaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbiA9ICZwcHRwX25hdF9leHBlY3RlZDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbiwgcHB0cF9uYXRfZXhwZWN0ZWQpOwogCiAJcHJpbnRrKCJpcF9uYXRfcHB0cCB2ZXJzaW9uICVzIGxvYWRlZFxuIiwgSVBfTkFUX1BQVFBfVkVSU0lPTik7CiAJcmV0dXJuIDA7CkBAIC0zMzUsMTQgKzMzNSwxMyBAQAogewogCURFQlVHUCgiY2xlYW51cF9tb2R1bGVcbiIgKTsKIAotCWlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4gPSBOVUxMOwotCWlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSA9IE5VTEw7Ci0JaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kID0gTlVMTDsKLQlpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kID0gTlVMTDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbiwgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSwgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCwgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQsIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOwogCiAJaXBfbmF0X3Byb3RvX2dyZV9maW5pKCk7Ci0JLyogTWFrZSBzdXJlIG5vb25lIGNhbGxzIGl0LCBtZWFud2hpbGUgKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKIAogCXByaW50aygiaXBfbmF0X3BwdHAgdmVyc2lvbiAlcyB1bmxvYWRlZFxuIiwgSVBfTkFUX1BQVFBfVkVSU0lPTik7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYwppbmRleCBhNzY3MTIzLi5mZWIyNmI0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaXJjLmMKQEAgLTk4LDE1ICs5OCwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2lyY19maW5pKHZvaWQpCiB7Ci0JaXBfbmF0X2lyY19ob29rID0gTlVMTDsKLQkvKiBNYWtlIHN1cmUgbm9vbmUgY2FsbHMgaXQsIG1lYW53aGlsZS4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2lyY19ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2lyY19pbml0KHZvaWQpCiB7Ci0JQlVHX09OKGlwX25hdF9pcmNfaG9vayk7Ci0JaXBfbmF0X2lyY19ob29rID0gaGVscDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9pcmNfaG9vaykpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfaXJjX2hvb2ssIGhlbHApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2dyZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYwppbmRleCBiZjkxZjkzLi45NTgxMDIwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2dyZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fZ3JlLmMKQEAgLTEyOSwxMSArMTI5LDkgQEAKIAkJCX0KIAkJCWlmIChncmVoLT5jc3VtKSB7CiAJCQkJLyogRklYTUU6IE5ldmVyIHRlc3RlZCB0aGlzIGNvZGUuLi4gKi8KLQkJCQkqKGdyZV9jc3VtKGdyZWgpKSA9Ci0JCQkJCW5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLAotCQkJCQkJCX4qKGdyZV9rZXkoZ3JlaCkpLAotCQkJCQkJCXR1cGxlLT5kc3QudS5ncmUua2V5LAotCQkJCQkJCSooZ3JlX2NzdW0oZ3JlaCkpLCAwKTsKKwkJCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KGdyZV9jc3VtKGdyZWgpLCAqcHNrYiwKKwkJCQkJCQkqKGdyZV9rZXkoZ3JlaCkpLAorCQkJCQkJCXR1cGxlLT5kc3QudS5ncmUua2V5LCAwKTsKIAkJCX0KIAkJCSooZ3JlX2tleShncmVoKSkgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwppbmRleCAzZjZlZmMxLi5mYjcxNmVkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwpAQCAtMjQsOCArMjQsOCBAQAogCSAgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAogCSAgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWF4KQogewotCXJldHVybiAodHVwbGUtPnNyYy51LmljbXAuaWQgPj0gbWluLT5pY21wLmlkCi0JCSYmIHR1cGxlLT5zcmMudS5pY21wLmlkIDw9IG1heC0+aWNtcC5pZCk7CisJcmV0dXJuIG50b2hzKHR1cGxlLT5zcmMudS5pY21wLmlkKSA+PSBudG9ocyhtaW4tPmljbXAuaWQpICYmCisJICAgICAgIG50b2hzKHR1cGxlLT5zcmMudS5pY21wLmlkKSA8PSBudG9ocyhtYXgtPmljbXAuaWQpOwogfQogCiBzdGF0aWMgaW50CkBAIC02NiwxMCArNjYsOCBAQAogCQlyZXR1cm4gMDsKIAogCWhkciA9IChzdHJ1Y3QgaWNtcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaGRyb2ZmKTsKLQloZHItPmNoZWNrc3VtID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsCi0JCQkJCSAgICAgaGRyLT51bi5lY2hvLmlkIF4gaHRvbnMoMHhGRkZGKSwKLQkJCQkJICAgICB0dXBsZS0+c3JjLnUuaWNtcC5pZCwKLQkJCQkJICAgICBoZHItPmNoZWNrc3VtLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZoZHItPmNoZWNrc3VtLCAqcHNrYiwKKwkJCSAgICAgICBoZHItPnVuLmVjaG8uaWQsIHR1cGxlLT5zcmMudS5pY21wLmlkLCAwKTsKIAloZHItPnVuLmVjaG8uaWQgPSB0dXBsZS0+c3JjLnUuaWNtcC5pZDsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCmluZGV4IDEyZGViMTMuLmI1ODZkMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwpAQCAtMTI5LDkgKzEyOSw4IEBACiAJaWYgKGhkcnNpemUgPCBzaXplb2YoKmhkcikpCiAJCXJldHVybiAxOwogCi0JaGRyLT5jaGVjayA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLCB+b2xkaXAsIG5ld2lwLCBoZHItPmNoZWNrLCAxKTsKLQloZHItPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsIG9sZHBvcnQgXiBodG9ucygweEZGRkYpLCBuZXdwb3J0LAotCQkJCQkgIGhkci0+Y2hlY2ssIDApOworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJmhkci0+Y2hlY2ssICpwc2tiLCBvbGRpcCwgbmV3aXAsIDEpOworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJmhkci0+Y2hlY2ssICpwc2tiLCBvbGRwb3J0LCBuZXdwb3J0LCAwKTsKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKaW5kZXggNGJiZWM3Ny4uNWNlZDA4NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCkBAIC0xMTUsMTMgKzExNSwxMCBAQAogCX0KIAogCWlmIChoZHItPmNoZWNrIHx8ICgqcHNrYiktPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCWhkci0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwgfm9sZGlwLCBuZXdpcCwKLQkJCQkJCSAgaGRyLT5jaGVjaywgMSk7Ci0JCWhkci0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwKLQkJCQkJCSAgKnBvcnRwdHIgXiBodG9ucygweEZGRkYpLCBuZXdwb3J0LAotCQkJCQkJICBoZHItPmNoZWNrLCAwKTsKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmaGRyLT5jaGVjaywgKnBza2IsIG9sZGlwLCBuZXdpcCwgMSk7CisJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJmhkci0+Y2hlY2ssICpwc2tiLCAqcG9ydHB0ciwgbmV3cG9ydCwgMCk7CiAJCWlmICghaGRyLT5jaGVjaykKLQkJCWhkci0+Y2hlY2sgPSAtMTsKKwkJCWhkci0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAl9CiAJKnBvcnRwdHIgPSBuZXdwb3J0OwogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zaXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc2lwLmMKaW5kZXggNzFmYzI3My4uNjIyM2FiYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zaXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NpcC5jCkBAIC0yOSwxOCArMjksMTIzIEBACiAjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCiAjZW5kaWYKIAotZXh0ZXJuIHN0cnVjdCBzaXBfaGVhZGVyX25mbyBjdF9zaXBfaGRyc1tdOworc3RydWN0IGFkZHJfbWFwIHsKKwlzdHJ1Y3QgeworCQljaGFyCQlzcmNbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm46bm5ubm4iKV07CisJCWNoYXIJCWRzdFtzaXplb2YoIm5ubi5ubm4ubm5uLm5ubjpubm5ubiIpXTsKKwkJdW5zaWduZWQgaW50CXNyY2xlbiwgc3JjaXBsZW47CisJCXVuc2lnbmVkIGludAlkc3RsZW4sIGRzdGlwbGVuOworCX0gYWRkcltJUF9DVF9ESVJfTUFYXTsKK307CisKK3N0YXRpYyB2b2lkIGFkZHJfbWFwX2luaXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIHN0cnVjdCBhZGRyX21hcCAqbWFwKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQ7CisJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKKwl1bnNpZ25lZCBpbnQgbjsKKworCWZvciAoZGlyID0gMDsgZGlyIDwgSVBfQ1RfRElSX01BWDsgZGlyKyspIHsKKwkJdCA9ICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGU7CisKKwkJbiA9IHNwcmludGYobWFwLT5hZGRyW2Rpcl0uc3JjLCAiJXUuJXUuJXUuJXUiLAorCQkJICAgIE5JUFFVQUQodC0+c3JjLmlwKSk7CisJCW1hcC0+YWRkcltkaXJdLnNyY2lwbGVuID0gbjsKKwkJbiArPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLnNyYyArIG4sICI6JXUiLAorCQkJICAgICBudG9ocyh0LT5zcmMudS51ZHAucG9ydCkpOworCQltYXAtPmFkZHJbZGlyXS5zcmNsZW4gPSBuOworCisJCW4gPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLmRzdCwgIiV1LiV1LiV1LiV1IiwKKwkJCSAgICBOSVBRVUFEKHQtPmRzdC5pcCkpOworCQltYXAtPmFkZHJbZGlyXS5kc3RpcGxlbiA9IG47CisJCW4gKz0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5kc3QgKyBuLCAiOiV1IiwKKwkJCSAgICAgbnRvaHModC0+ZHN0LnUudWRwLnBvcnQpKTsKKwkJbWFwLT5hZGRyW2Rpcl0uZHN0bGVuID0gbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWFwX3NpcF9hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgY29uc3QgY2hhciAqKmRwdHIsIHNpemVfdCBkbGVuLAorCQkJZW51bSBzaXBfaGVhZGVyX3BvcyBwb3MsIHN0cnVjdCBhZGRyX21hcCAqbWFwKQoreworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJdW5zaWduZWQgaW50IG1hdGNobGVuLCBtYXRjaG9mZiwgYWRkcmxlbjsKKwljaGFyICphZGRyOworCisJaWYgKGN0X3NpcF9nZXRfaW5mbygqZHB0ciwgZGxlbiwgJm1hdGNob2ZmLCAmbWF0Y2hsZW4sIHBvcykgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLnNyY2lwbGVuIHx8CisJICAgICBtYXRjaGxlbiA9PSBtYXAtPmFkZHJbZGlyXS5zcmNsZW4pICYmCisJICAgIG1lbWNtcCgqZHB0ciArIG1hdGNob2ZmLCBtYXAtPmFkZHJbZGlyXS5zcmMsIG1hdGNobGVuKSA9PSAwKSB7CisJCWFkZHIgICAgPSBtYXAtPmFkZHJbIWRpcl0uZHN0OworCQlhZGRybGVuID0gbWFwLT5hZGRyWyFkaXJdLmRzdGxlbjsKKwl9IGVsc2UgaWYgKChtYXRjaGxlbiA9PSBtYXAtPmFkZHJbZGlyXS5kc3RpcGxlbiB8fAorCQkgICAgbWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uZHN0bGVuKSAmJgorCQkgICBtZW1jbXAoKmRwdHIgKyBtYXRjaG9mZiwgbWFwLT5hZGRyW2Rpcl0uZHN0LCBtYXRjaGxlbikgPT0gMCkgeworCQlhZGRyICAgID0gbWFwLT5hZGRyWyFkaXJdLnNyYzsKKwkJYWRkcmxlbiA9IG1hcC0+YWRkclshZGlyXS5zcmNsZW47CisJfSBlbHNlCisJCXJldHVybiAxOworCisJaWYgKCFpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGFkZHIsIGFkZHJsZW4pKQorCQlyZXR1cm4gMDsKKwkqZHB0ciA9ICgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCXJldHVybiAxOworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbmF0X3NpcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJCQkgICAgICAgY29uc3QgY2hhciAqKmRwdHIpCit7CisJZW51bSBzaXBfaGVhZGVyX3BvcyBwb3M7CisJc3RydWN0IGFkZHJfbWFwIG1hcDsKKwlpbnQgZGF0YW9mZiwgZGF0YWxlbjsKKworCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOworCWlmIChkYXRhbGVuIDwgc2l6ZW9mKCJTSVAvMi4wIikgLSAxKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCWFkZHJfbWFwX2luaXQoY3QsICZtYXApOworCisJLyogQmFzaWMgcnVsZXM6IHJlcXVlc3RzIGFuZCByZXNwb25zZXMuICovCisJaWYgKHN0cm5jbXAoKmRwdHIsICJTSVAvMi4wIiwgc2l6ZW9mKCJTSVAvMi4wIikgLSAxKSAhPSAwKSB7CisJCS8qIDEwLjI6IENvbnN0cnVjdGluZyB0aGUgUkVHSVNURVIgUmVxdWVzdDoKKwkJICoKKwkJICogVGhlICJ1c2VyaW5mbyIgYW5kICJAIiBjb21wb25lbnRzIG9mIHRoZSBTSVAgVVJJIE1VU1QgTk9UCisJCSAqIGJlIHByZXNlbnQuCisJCSAqLworCQlpZiAoZGF0YWxlbiA+PSBzaXplb2YoIlJFR0lTVEVSIikgLSAxICYmCisJCSAgICBzdHJuY21wKCpkcHRyLCAiUkVHSVNURVIiLCBzaXplb2YoIlJFR0lTVEVSIikgLSAxKSA9PSAwKQorCQkJcG9zID0gUE9TX1JFR19SRVFfVVJJOworCQllbHNlCisJCQlwb3MgPSBQT1NfUkVRX1VSSTsKKworCQlpZiAoIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBwb3MsICZtYXApKQorCQkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJaWYgKCFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX0ZST00sICZtYXApIHx8CisJICAgICFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX1RPLCAmbWFwKSB8fAorCSAgICAhbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19WSUEsICZtYXApIHx8CisJICAgICFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX0NPTlRBQ1QsICZtYXApKQorCQlyZXR1cm4gTkZfRFJPUDsKKwlyZXR1cm4gTkZfQUNDRVBUOworfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1hbmdsZV9zaXBfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKIAkJCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKIAkJCQkgICAgICBjb25zdCBjaGFyICoqZHB0ciwgc2l6ZV90IGRsZW4sCiAJCQkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmxlbiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gKmhuZm8pCisJCQkJICAgICAgZW51bSBzaXBfaGVhZGVyX3BvcyBwb3MpCiB7CiAJdW5zaWduZWQgaW50IG1hdGNobGVuLCBtYXRjaG9mZjsKIAotCWlmIChjdF9zaXBfZ2V0X2luZm8oKmRwdHIsIGRsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLCBobmZvKSA8PSAwKQorCWlmIChjdF9zaXBfZ2V0X2luZm8oKmRwdHIsIGRsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLCBwb3MpIDw9IDApCiAJCXJldHVybiAwOwogCiAJaWYgKCFpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKQEAgLTUyLDc3ICsxNTcsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX25hdF9zaXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICAgIGNvbnN0IGNoYXIgKipkcHRyKQotewotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm46bm5ubm4iKV07Ci0JdW5zaWduZWQgaW50IGJ1ZmZsZW4sIGRhdGFvZmY7Ci0JX19iZTMyIGlwOwotCV9fYmUxNiBwb3J0OwotCi0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0KLQlpcCAgID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JcG9ydCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUudWRwLnBvcnQ7Ci0JYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUuJXUuJXUuJXU6JXUiLCBOSVBRVUFEKGlwKSwgbnRvaHMocG9ydCkpOwotCi0JLyogc2hvcnQgcGFja2V0ID8gKi8KLQlpZiAoKCgqcHNrYiktPmxlbiAtIGRhdGFvZmYpIDwgKHNpemVvZigiU0lQLzIuMCIpIC0gMSkpCi0JCXJldHVybiAwOwotCi0JLyogQmFzaWMgcnVsZXM6IHJlcXVlc3RzIGFuZCByZXNwb25zZXMuICovCi0JaWYgKG1lbWNtcCgqZHB0ciwgIlNJUC8yLjAiLCBzaXplb2YoIlNJUC8yLjAiKSAtIDEpID09IDApIHsKLQkJY29uc3QgY2hhciAqYXV4OwotCi0JCWlmICgoY3RpbmZvKSA8IElQX0NUX0lTX1JFUExZKSB7Ci0JCQltYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCBkcHRyLAotCQkJICAgICAgICAgICAgICAgICAgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkJCSAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwKLQkJCSAgICAgICAgICAgICAgICAgICZjdF9zaXBfaGRyc1tQT1NfQ09OVEFDVF0pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlpZiAoIW1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsIGRwdHIsCi0JCQkJICAgICAgICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCAmY3Rfc2lwX2hkcnNbUE9TX1ZJQV0pKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogVGhpcyBzZWFyY2ggc2hvdWxkIGlnbm9yZSBjYXNlLCBidXQgbGF0ZXIuLiAqLwotCQlhdXggPSBjdF9zaXBfc2VhcmNoKCJDU2VxOiIsICpkcHRyLCBzaXplb2YoIkNTZXE6IikgLSAxLAotCQkgICAgICAgICAgICAgICAgICAgICgqcHNrYiktPmxlbiAtIGRhdGFvZmYpOwotCQlpZiAoIWF1eCkKLQkJCXJldHVybiAwOwotCi0JCWlmICghY3Rfc2lwX3NlYXJjaCgiUkVHSVNURVIiLCBhdXgsIHNpemVvZigiUkVHSVNURVIiKSwKLQkJICAgIGN0X3NpcF9sbmxlbihhdXgsICpkcHRyICsgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZikpKQotCQkJcmV0dXJuIDE7Ci0KLQkJcmV0dXJuIG1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsIGRwdHIsCi0JCQkJCSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLAotCQkJCQkgJmN0X3NpcF9oZHJzW1BPU19DT05UQUNUXSk7Ci0JfQotCWlmICgoY3RpbmZvKSA8IElQX0NUX0lTX1JFUExZKSB7Ci0JCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwKLQkJCQkgICAgICAgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkJICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sICZjdF9zaXBfaGRyc1tQT1NfVklBXSkpCi0JCQlyZXR1cm4gMDsKLQotCQkvKiBNYW5nbGUgQ29udGFjdCBpZiBleGlzdHMgb25seS4gLSB3YXRjaCB1ZHBfbmF0X21hbmdsZSgpISAqLwotCQltYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCQkgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sICZjdF9zaXBfaGRyc1tQT1NfQ09OVEFDVF0pOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogVGhpcyBtYW5nbGUgcmVxdWVzdHMgaGVhZGVycy4gKi8KLQlyZXR1cm4gbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3Rfc2lwX2xubGVuKCpkcHRyLAotCQkJCSAgICAgICAgICAgICAgKmRwdHIgKyAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCAmY3Rfc2lwX2hkcnNbUE9TX1JFUV9IRUFERVJdKTsKLX0KLQogc3RhdGljIGludCBtYW5nbGVfY29udGVudF9sZW4oc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCiAJCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKQEAgLTEzNiw3ICsxNzAsNyBAQAogCiAJLyogR2V0IGFjdHVhbCBTRFAgbGVuZ2h0ICovCiAJaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCAmbWF0Y2hvZmYsCi0JICAgICAgICAgICAgICAgICAgICAmbWF0Y2hsZW4sICZjdF9zaXBfaGRyc1tQT1NfU0RQX0hFQURFUl0pID4gMCkgeworCSAgICAgICAgICAgICAgICAgICAgJm1hdGNobGVuLCBQT1NfU0RQX0hFQURFUikgPiAwKSB7CiAKIAkJLyogc2luY2UgY3Rfc2lwX2dldF9pbmZvKCkgZ2l2ZSB1cyBhIHBvaW50ZXIgcGFzc2luZyAndj0nCiAJCSAgIHdlIG5lZWQgdG8gYWRkIDIgYnl0ZXMgaW4gdGhpcyBjb3VudC4gKi8KQEAgLTE0NCw3ICsxNzgsNyBAQAogCiAJCS8qIE5vdywgdXBkYXRlIFNEUCBsZW5naHQgKi8KIAkJaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCAmbWF0Y2hvZmYsCi0JCSAgICAgICAgICAgICAgICAgICAgJm1hdGNobGVuLCAmY3Rfc2lwX2hkcnNbUE9TX0NPTlRFTlRdKSA+IDApIHsKKwkJICAgICAgICAgICAgICAgICAgICAmbWF0Y2hsZW4sIFBPU19DT05URU5UKSA+IDApIHsKIAogCQkJYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUiLCBjX2xlbik7CiAKQEAgLTE3MCwxNyArMjA0LDE3IEBACiAJLyogTWFuZ2xlIG93bmVyIGFuZCBjb250YWN0IGluZm8uICovCiAJYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKG5ld2lwKSk7CiAJaWYgKCFtYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCAmZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgJmN0X3NpcF9oZHJzW1BPU19PV05FUl0pKQorCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfT1dORVIpKQogCQlyZXR1cm4gMDsKIAogCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sICZjdF9zaXBfaGRyc1tQT1NfQ09OTkVDVElPTl0pKQorCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfQ09OTkVDVElPTikpCiAJCXJldHVybiAwOwogCiAJLyogTWFuZ2xlIG1lZGlhIHBvcnQuICovCiAJYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUiLCBwb3J0KTsKIAlpZiAoIW1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsICZkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCAmY3Rfc2lwX2hkcnNbUE9TX01FRElBXSkpCisJICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sIFBPU19NRURJQSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG1hbmdsZV9jb250ZW50X2xlbihwc2tiLCBjdGluZm8sIGN0LCBkcHRyKTsKQEAgLTIzMCwxOCArMjY0LDE3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXBfbmF0X3NpcF9ob29rID0gTlVMTDsKLQlpcF9uYXRfc2RwX2hvb2sgPSBOVUxMOwotCS8qIE1ha2Ugc3VyZSBub29uZSBjYWxscyBpdCwgbWVhbndoaWxlLiAqLwotCXN5bmNocm9uaXplX25ldCgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfc2lwX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfc2RwX2hvb2ssIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JQlVHX09OKGlwX25hdF9zaXBfaG9vayk7Ci0JQlVHX09OKGlwX25hdF9zZHBfaG9vayk7Ci0JaXBfbmF0X3NpcF9ob29rID0gaXBfbmF0X3NpcDsKLQlpcF9uYXRfc2RwX2hvb2sgPSBpcF9uYXRfc2RwOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NpcF9ob29rKSk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfc2RwX2hvb2spKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NpcF9ob29rLCBpcF9uYXRfc2lwKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NkcF9ob29rLCBpcF9uYXRfc2RwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NubXBfYmFzaWMuYwppbmRleCAxNjhmNDVmLi5jM2Q5ZjNiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NubXBfYmFzaWMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NubXBfYmFzaWMuYwpAQCAtNjQsNyArNjQsNyBAQAogCiAjZGVmaW5lIFNOTVBfUE9SVCAxNjEKICNkZWZpbmUgU05NUF9UUkFQX1BPUlQgMTYyCi0jZGVmaW5lIE5PQ1QxKG4pICh1X2ludDhfdCApKChuKSAmIDB4ZmYpCisjZGVmaW5lIE5PQ1QxKG4pICgqKHU4ICopbikKIAogc3RhdGljIGludCBkZWJ1ZzsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc25tcF9sb2NrKTsKQEAgLTYxMyw3ICs2MTMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIG1hbmdsZV9hZGRyZXNzKHVuc2lnbmVkIGNoYXIgKmJlZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9jdDFfbWFwICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90ICpjaGVjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdW0xNiAqY2hlY2spOwogc3RydWN0IHNubXBfY252CiB7CiAJdW5zaWduZWQgaW50IGNsYXNzOwpAQCAtODczLDM4ICs4NzMsMjQgQEAKICAqIEZhc3QgY2hlY2tzdW0gdXBkYXRlIGZvciBwb3NzaWJseSBvZGRseS1hbGlnbmVkIFVEUCBieXRlLCBmcm9tIHRoZQogICogY29kZSBleGFtcGxlIGluIHRoZSBkcmFmdC4KICAqLwotc3RhdGljIHZvaWQgZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmNzdW0sCitzdGF0aWMgdm9pZCBmYXN0X2NzdW0oX19zdW0xNiAqY3N1bSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcHRyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IG9kZCkKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KQogewotCWxvbmcgeCwgb2xkLCBuZXc7Ci0JCi0JeCA9IGNzdW1bMF0gKiAyNTYgKyBjc3VtWzFdOwotCQotCXggPX4geCAmIDB4RkZGRjsKLQkKLQlpZiAob2RkKSBvbGQgPSBvcHRyWzBdICogMjU2OwotCWVsc2Ugb2xkID0gb3B0clswXTsKLQkKLQl4IC09IG9sZCAmIDB4RkZGRjsKLQlpZiAoeCA8PSAwKSB7Ci0JCXgtLTsKLQkJeCAmPSAweEZGRkY7CisJdW5zaWduZWQgY2hhciBzWzRdOworCisJaWYgKG9mZnNldCAmIDEpIHsKKwkJc1swXSA9IHNbMl0gPSAwOworCQlzWzFdID0gfipvcHRyOworCQlzWzNdID0gKm5wdHI7CisJfSBlbHNlIHsKKwkJc1sxXSA9IHNbM10gPSAwOworCQlzWzBdID0gfipvcHRyOworCQlzWzJdID0gKm5wdHI7CiAJfQotCQotCWlmIChvZGQpIG5ldyA9IG5wdHJbMF0gKiAyNTY7Ci0JZWxzZSBuZXcgPSBucHRyWzBdOwotCQotCXggKz0gbmV3ICYgMHhGRkZGOwotCWlmICh4ICYgMHgxMDAwMCkgewotCQl4Kys7Ci0JCXggJj0gMHhGRkZGOwotCX0KLQkKLQl4ID1+IHggJiAweEZGRkY7Ci0JY3N1bVswXSA9IHggLyAyNTY7Ci0JY3N1bVsxXSA9IHggJiAweEZGOworCisJKmNzdW0gPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKHMsIDQsIH5jc3VtX3VuZm9sZCgqY3N1bSkpKTsKIH0KIAogLyogCkBAIC05MTUsOSArOTAxLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYW5nbGVfYWRkcmVzcyh1bnNpZ25lZCBjaGFyICpiZWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICphZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCAqY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdW0xNiAqY2hlY2spCiB7Ci0JaWYgKG1hcC0+ZnJvbSA9PSBOT0NUMSgqYWRkcikpIHsKKwlpZiAobWFwLT5mcm9tID09IE5PQ1QxKGFkZHIpKSB7CiAJCXVfaW50MzJfdCBvbGQ7CiAJCQogCQlpZiAoZGVidWcpCkBAIC05MjcsMTEgKzkxMyw4IEBACiAJCQogCQkvKiBVcGRhdGUgVURQIGNoZWNrc3VtIGlmIGJlaW5nIHVzZWQgKi8KIAkJaWYgKCpjaGVjaykgewotCQkJdW5zaWduZWQgY2hhciBvZGQgPSAhKChhZGRyIC0gYmVnaW4pICUgMik7Ci0JCQkKLQkJCWZhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWNoZWNrLAotCQkJICAgICAgICAgICZtYXAtPmZyb20sICZtYXAtPnRvLCBvZGQpOwotCQkJICAgICAgICAgIAorCQkJZmFzdF9jc3VtKGNoZWNrLAorCQkJICAgICAgICAgICZtYXAtPmZyb20sICZtYXAtPnRvLCBhZGRyIC0gYmVnaW4pOwogCQl9CiAJCQogCQlpZiAoZGVidWcpCkBAIC05NDMsNyArOTI2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfdHJhcF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbm1wX3YxX3RyYXAgKnRyYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludDE2X3QgKmNoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N1bTE2ICpjaGVjaykKIHsKIAl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZywgbGVuOwogCXVuc2lnbmVkIGNoYXIgKmVuZDsKQEAgLTEwMzcsNyArMTAyMCw3IEBACiBzdGF0aWMgaW50IHNubXBfcGFyc2VfbWFuZ2xlKHVuc2lnbmVkIGNoYXIgKm1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9jdDFfbWFwICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCAqY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3VtMTYgKmNoZWNrKQogewogCXVuc2lnbmVkIGNoYXIgKmVvYywgKmVuZDsKIAl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZywgdmVycywgcGR1dHlwZTsKQEAgLTEyMjMsMTIgKzEyMDYsMTIgQEAKIAkgKi8KIAlpZiAoZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgewogCQkvKiBTTkFUIHRyYXBzICovCi0JCW1hcC5mcm9tID0gTk9DVDEoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCk7Ci0JCW1hcC50byA9IE5PQ1QxKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXApOworCQltYXAuZnJvbSA9IE5PQ1QxKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwKTsKKwkJbWFwLnRvID0gTk9DVDEoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXApOwogCX0gZWxzZSB7CiAJCS8qIEROQVQgcmVwbGllcyAqLwotCQltYXAuZnJvbSA9IE5PQ1QxKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApOwotCQltYXAudG8gPSBOT0NUMShjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwKTsKKwkJbWFwLmZyb20gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCk7CisJCW1hcC50byA9IE5PQ1QxKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwKTsKIAl9CiAJCiAJaWYgKG1hcC5mcm9tID09IG1hcC50bykKQEAgLTEyOTQsMTEgKzEyNzcsMTEgQEAKIAkuaGVscCA9IGhlbHAsCiAJLm5hbWUgPSAic25tcCIsCiAKLQkudHVwbGUgPSB7IC5zcmMgPSB7IC51ID0geyBfX2NvbnN0YW50X2h0b25zKFNOTVBfUE9SVCkgfSB9LAotCQkgICAuZHN0ID0geyAucHJvdG9udW0gPSBJUFBST1RPX1VEUCB9LAorCS50dXBsZSA9IHsuc3JjID0gey51ID0gey51ZHAgPSB7LnBvcnQgPSBfX2NvbnN0YW50X2h0b25zKFNOTVBfUE9SVCl9fX0sCisJCSAgLmRzdCA9IHsucHJvdG9udW0gPSBJUFBST1RPX1VEUH0sCiAJfSwKLQkubWFzayA9IHsgLnNyYyA9IHsgLnUgPSB7IDB4RkZGRiB9IH0sCi0JCSAuZHN0ID0geyAucHJvdG9udW0gPSAweEZGIH0sCisJLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkZ9fSwKKwkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn0sCiAJfSwKIH07CiAKQEAgLTEzMDksMTEgKzEyOTIsMTEgQEAKIAkuaGVscCA9IGhlbHAsCiAJLm5hbWUgPSAic25tcF90cmFwIiwKIAotCS50dXBsZSA9IHsgLnNyYyA9IHsgLnUgPSB7IF9fY29uc3RhbnRfaHRvbnMoU05NUF9UUkFQX1BPUlQpIH0gfSwKLQkJICAgLmRzdCA9IHsgLnByb3RvbnVtID0gSVBQUk9UT19VRFAgfSwKKwkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHsudWRwID0gey5wb3J0ID0gX19jb25zdGFudF9odG9ucyhTTk1QX1RSQVBfUE9SVCl9fX0sCisJCSAgLmRzdCA9IHsucHJvdG9udW0gPSBJUFBST1RPX1VEUH0sCiAJfSwKLQkubWFzayA9IHsgLnNyYyA9IHsgLnUgPSB7IDB4RkZGRiB9IH0sCi0JCSAuZHN0ID0geyAucHJvdG9udW0gPSAweEZGIH0sCisJLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkZ9fSwKKwkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKaW5kZXggZDg1ZDJkZS4uYWQ2NjMyOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKQEAgLTQ0LDEyICs0NCw2IEBACiAjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCiAjZW5kaWYKIAotI2RlZmluZSBIT09LTkFNRShob29rbnVtKSAoKGhvb2tudW0pID09IE5GX0lQX1BPU1RfUk9VVElORyA/ICJQT1NUX1JPVVRJTkciICBcCi0JCQkgICA6ICgoaG9va251bSkgPT0gTkZfSVBfUFJFX1JPVVRJTkcgPyAiUFJFX1JPVVRJTkciIFwKLQkJCSAgICAgIDogKChob29rbnVtKSA9PSBORl9JUF9MT0NBTF9PVVQgPyAiTE9DQUxfT1VUIiAgXAotCQkJICAgICAgICAgOiAoKGhvb2tudW0pID09IE5GX0lQX0xPQ0FMX0lOID8gIkxPQ0FMX0lOIiAgXAotCQkJCSAgICA6ICIqRVJST1IqIikpKQotCiAjaWZkZWYgQ09ORklHX1hGUk0KIHN0YXRpYyB2b2lkIG5hdF9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYwppbmRleCA5NGE3ODAxLi42MDQ3OTM1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYwpAQCAtNTUsMTUgKzU1LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfdGZ0cF9maW5pKHZvaWQpCiB7Ci0JaXBfbmF0X3RmdHBfaG9vayA9IE5VTEw7Ci0JLyogTWFrZSBzdXJlIG5vb25lIGNhbGxzIGl0LCBtZWFud2hpbGUuICovCi0Jc3luY2hyb25pemVfbmV0KCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF90ZnRwX2hvb2ssIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfdGZ0cF9pbml0KHZvaWQpCiB7Ci0JQlVHX09OKGlwX25hdF90ZnRwX2hvb2spOwotCWlwX25hdF90ZnRwX2hvb2sgPSBoZWxwOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3RmdHBfaG9vaykpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfdGZ0cF9ob29rLCBoZWxwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwppbmRleCA5NzU1NmNjLi5jZDUyMGRmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJcG1zZy0+ZGF0YV9sZW4gICAgICAgID0gZGF0YV9sZW47CiAJcG1zZy0+dGltZXN0YW1wX3NlYyAgID0gZW50cnktPnNrYi0+dHN0YW1wLm9mZl9zZWM7CiAJcG1zZy0+dGltZXN0YW1wX3VzZWMgID0gZW50cnktPnNrYi0+dHN0YW1wLm9mZl91c2VjOwotCXBtc2ctPm1hcmsgICAgICAgICAgICA9IGVudHJ5LT5za2ItPm5mbWFyazsKKwlwbXNnLT5tYXJrICAgICAgICAgICAgPSBlbnRyeS0+c2tiLT5tYXJrOwogCXBtc2ctPmhvb2sgICAgICAgICAgICA9IGVudHJ5LT5pbmZvLT5ob29rOwogCXBtc2ctPmh3X3Byb3RvY29sICAgICA9IGVudHJ5LT5za2ItPnByb3RvY29sOwogCQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggN2EyOWQ2ZS4uMDk4MzY1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC00MCw4ICs0MCw2IEBACiAjZGVmaW5lIERFQlVHUAogI2VuZGlmCiAKLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KQotCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgdGFyZ2V0IGZvciBDTFVTVEVSSVAiKTsKQEAgLTEyMyw3ICsxMjEsNiBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAotCUFTU0VSVF9SRUFEX0xPQ0soJmNsdXN0ZXJpcF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmNsdXN0ZXJpcF9jb25maWdzKSB7CiAJCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjID0gbGlzdF9lbnRyeShwb3MsIAogCQkJCQlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZywgbGlzdCk7CkBAIC0xNzAsNyArMTY3LDYgQEAKIAkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmM7Ci0JY2hhciBidWZmZXJbMTZdOwogCiAJYyA9IGt6YWxsb2Moc2l6ZW9mKCpjKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjKQpAQCAtMTg3LDEyICsxODMsMTcgQEAKIAlhdG9taWNfc2V0KCZjLT5lbnRyaWVzLCAxKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JLyogY3JlYXRlIHByb2MgZGlyIGVudHJ5ICovCi0Jc3ByaW50ZihidWZmZXIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaXApKTsKLQljLT5wZGUgPSBjcmVhdGVfcHJvY19lbnRyeShidWZmZXIsIFNfSVdVU1J8U19JUlVTUiwgY2x1c3RlcmlwX3Byb2NkaXIpOwotCWlmICghYy0+cGRlKSB7Ci0JCWtmcmVlKGMpOwotCQlyZXR1cm4gTlVMTDsKKwl7CisJCWNoYXIgYnVmZmVyWzE2XTsKKworCQkvKiBjcmVhdGUgcHJvYyBkaXIgZW50cnkgKi8KKwkJc3ByaW50ZihidWZmZXIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaXApKTsKKwkJYy0+cGRlID0gY3JlYXRlX3Byb2NfZW50cnkoYnVmZmVyLCBTX0lXVVNSfFNfSVJVU1IsCisJCQkJCSAgIGNsdXN0ZXJpcF9wcm9jZGlyKTsKKwkJaWYgKCFjLT5wZGUpIHsKKwkJCWtmcmVlKGMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAJYy0+cGRlLT5wcm9jX2ZvcHMgPSAmY2x1c3RlcmlwX3Byb2NfZm9wczsKIAljLT5wZGUtPmRhdGEgPSBjOwpAQCAtMjA1LDYgKzIwNiw3IEBACiAJcmV0dXJuIGM7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludAogY2x1c3RlcmlwX2FkZF9ub2RlKHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjLCB1X2ludDE2X3Qgbm9kZW51bSkKIHsKQEAgLTIzMiw2ICsyMzQsNyBAQAogCiAJcmV0dXJuIDE7CiB9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSB1X2ludDMyX3QKIGNsdXN0ZXJpcF9oYXNoZm4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZykKQEAgLTczNyw4ICs3NDAsMTAgQEAKIAkJQ0xVU1RFUklQX1ZFUlNJT04pOwogCXJldHVybiAwOwogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKIGNsZWFudXBfaG9vazoKIAluZl91bnJlZ2lzdGVyX2hvb2soJmNpcF9hcnBfb3BzKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogY2xlYW51cF90YXJnZXQ6CiAJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZjbHVzdGVyaXBfdGd0KTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKaW5kZXggMWFhNDUxNy4uYjU1ZDY3MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCkBAIC0yOCwxNyArMjgsMTYgQEAKIHNldF9lY3RfaXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBjb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbykKIHsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQl1X2ludDE2X3Qgb2xkdG9zOwogCiAJaWYgKChpcGgtPnRvcyAmIElQVF9FQ05fSVBfTUFTSykgIT0gKGVpbmZvLT5pcF9lY3QgJiBJUFRfRUNOX0lQX01BU0spKSB7CisJCV9fdTggb2xkdG9zOwogCQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJCXJldHVybiAwOwogCQlpcGggPSAoKnBza2IpLT5uaC5pcGg7CiAJCW9sZHRvcyA9IGlwaC0+dG9zOwogCQlpcGgtPnRvcyAmPSB+SVBUX0VDTl9JUF9NQVNLOwogCQlpcGgtPnRvcyB8PSAoZWluZm8tPmlwX2VjdCAmIElQVF9FQ05fSVBfTUFTSyk7Ci0JCWlwaC0+Y2hlY2sgPSBuZl9jc3VtX3VwZGF0ZShodG9ucyhvbGR0b3MpIF4gaHRvbnMoMHhGRkZGKSwKLQkJCQkJICAgIGh0b25zKGlwaC0+dG9zKSwgaXBoLT5jaGVjayk7CisJCW5mX2NzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGh0b25zKG9sZHRvcyksIGh0b25zKGlwaC0+dG9zKSk7CiAJfSAKIAlyZXR1cm4gMTsKIH0KQEAgLTcyLDEwICs3MSw4IEBACiAJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX1NFVF9DV1IpCiAJCXRjcGgtPmN3ciA9IGVpbmZvLT5wcm90by50Y3AuY3dyOwogCi0JdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgoKnBza2IpLAotCQkJCQkgICBvbGR2YWwgXiBodG9ucygweEZGRkYpLAotCQkJCQkgICAoKF9fYmUxNiAqKXRjcGgpWzZdLAotCQkJCQkgICB0Y3BoLT5jaGVjaywgMCk7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJCW9sZHZhbCwgKChfX2JlMTYgKil0Y3BoKVs2XSwgMCk7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCmluZGV4IDdkYzgyMGQuLmM5NmRlMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwpAQCAtMTcxLDExICsxNzEsMTUgQEAKIAkJfQogCQlicmVhazsKIAl9Ci0JY2FzZSBJUFBST1RPX1VEUDogeworCWNhc2UgSVBQUk9UT19VRFA6CisJY2FzZSBJUFBST1RPX1VEUExJVEU6IHsKIAkJc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOwogCi0JCS8qIE1heCBsZW5ndGg6IDEwICJQUk9UTz1VRFAgIiAqLwotCQlwcmludGsoIlBST1RPPVVEUCAiKTsKKwkJaWYgKGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCS8qIE1heCBsZW5ndGg6IDEwICJQUk9UTz1VRFAgIiAgICAgKi8KKwkJCXByaW50aygiUFJPVE89VURQICIgKTsKKwkJZWxzZQkvKiBNYXggbGVuZ3RoOiAxNCAiUFJPVE89VURQTElURSAiICovCisJCQlwcmludGsoIlBST1RPPVVEUExJVEUgIik7CiAKIAkJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCiAJCQlicmVhazsKQEAgLTM0MSw2ICszNDUsNyBAQAogCS8qIElQOiAgICAgIDQwKzQ2KzYrMTErMTI3ID0gMjMwICovCiAJLyogVENQOiAgICAgMTArbWF4KDI1LDIwKzMwKzEzKzkrMzIrMTErMTI3KSA9IDI1MiAqLwogCS8qIFVEUDogICAgIDEwK21heCgyNSwyMCkgPSAzNSAqLworCS8qIFVEUExJVEU6IDE0K21heCgyNSwyMCkgPSAzOSAqLwogCS8qIElDTVA6ICAgIDExK21heCgyNSwgMTgrMjUrbWF4KDE5LDE0LDI0KzMrbisxMCwzK24rMTApKSA9IDkxK24gKi8KIAkvKiBFU1A6ICAgICAxMCttYXgoMjUpKzE1ID0gNTAgKi8KIAkvKiBBSDogICAgICA5K21heCgyNSkrMTUgPSA0OSAqLwpAQCAtNDI1LDEzICs0MzAsOCBAQAogCWxpLnUubG9nLmxldmVsID0gbG9naW5mby0+bGV2ZWw7CiAJbGkudS5sb2cubG9nZmxhZ3MgPSBsb2dpbmZvLT5sb2dmbGFnczsKIAotCWlmIChsb2dpbmZvLT5sb2dmbGFncyAmIElQVF9MT0dfTkZMT0cpCi0JCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKLQkJICAgICAgICAgICAgICAiJXMiLCBsb2dpbmZvLT5wcmVmaXgpOwotCWVsc2UKLQkJaXB0X2xvZ19wYWNrZXQoUEZfSU5FVCwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKLQkJICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKLQorCWlwdF9sb2dfcGFja2V0KFBGX0lORVQsIGhvb2tudW0sICpwc2tiLCBpbiwgb3V0LCAmbGksCisJICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKIAlyZXR1cm4gSVBUX0NPTlRJTlVFOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCmluZGV4IDNkYmZjZmEuLjI4YjkyMzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC0yLDcgKzIsNyBAQAogICAgKGRlcGVuZGluZyBvbiByb3V0ZSkuICovCiAKIC8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTIwLDcgKzIwLDExIEBACiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNlbHNlCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC02NSwyMyArNjksMzMgQEAKIAkJICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKwlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdDsKKyNlbmRpZgogCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptcjsKIAlzdHJ1Y3QgaXBfbmF0X3JhbmdlIG5ld3JhbmdlOworCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptcjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAlfX2JlMzIgbmV3c3JjOwogCiAJSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HKTsKIAogCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKwluYXQgPSBuZmN0X25hdChjdCk7CisjZW5kaWYKIAlJUF9ORl9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQKIAkgICAgICAgICAgICAgICAgICAgIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFkpKTsKIAogCS8qIFNvdXJjZSBhZGRyZXNzIGlzIDAuMC4wLjAgLSBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXQgdGhhdCBpcwogCSAqIHByb2JhYmx5IG5vdCBzdXBwb3NlZCB0byBiZSBtYXNxdWVyYWRlZC4KIAkgKi8KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCWlmIChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwID09IDApCisjZWxzZQogCWlmIChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwID09IDApCisjZW5kaWYKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCW1yID0gdGFyZ2luZm87CkBAIC05Myw3ICsxMDcsMTEgQEAKIAl9CiAKIAl3cml0ZV9sb2NrX2JoKCZtYXNxX2xvY2spOworI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJbmF0LT5tYXNxX2luZGV4ID0gb3V0LT5pZmluZGV4OworI2Vsc2UKIAljdC0+bmF0Lm1hc3FfaW5kZXggPSBvdXQtPmlmaW5kZXg7CisjZW5kaWYKIAl3cml0ZV91bmxvY2tfYmgoJm1hc3FfbG9jayk7CiAKIAkvKiBUcmFuc2ZlciBmcm9tIG9yaWdpbmFsIHJhbmdlLiAqLwpAQCAtMTA5LDEwICsxMjcsMTcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBkZXZpY2VfY21wKHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmlmaW5kZXgpCiB7CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKwlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdCA9IG5mY3RfbmF0KGkpOworI2VuZGlmCiAJaW50IHJldDsKIAogCXJlYWRfbG9ja19iaCgmbWFzcV9sb2NrKTsKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCXJldCA9IChuYXQtPm1hc3FfaW5kZXggPT0gKGludCkobG9uZylpZmluZGV4KTsKKyNlbHNlCiAJcmV0ID0gKGktPm5hdC5tYXNxX2luZGV4ID09IChpbnQpKGxvbmcpaWZpbmRleCk7CisjZW5kaWYKIAlyZWFkX3VubG9ja19iaCgmbWFzcV9sb2NrKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCA1OGE4OGYyLi45MzkwZTkwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTE1LDcgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNlbHNlCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNlbmRpZgogCiAjZGVmaW5lIE1PRFVMRU5BTUUgIk5FVE1BUCIKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwppbmRleCBjMGRjZmU5Li40NjJlY2ViIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCkBAIC0xLDYgKzEsNiBAQAogLyogUmVkaXJlY3QuICBTaW1wbGUgbWFwcGluZyB3aGljaCBhbHRlcnMgZHN0IHRvIGEgbG9jYWwgSVAgYWRkcmVzcy4gKi8KIC8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTE4LDcgKzE4LDExIEBACiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNlbHNlCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNlbmRpZgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggYWQwMzEyZC4uZjAzMTllNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC03Niw3ICs3Niw3IEBACiAKIAkvKiBUaGlzIHBhY2tldCB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgb3RoZXI6IGNsZWFyIG5mIGZpZWxkcyAqLwogCW5mX3Jlc2V0KG5za2IpOwotCW5za2ItPm5mbWFyayA9IDA7CisJbnNrYi0+bWFyayA9IDA7CiAJc2tiX2luaXRfc2VjbWFyayhuc2tiKTsKIAogCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgodV9pbnQzMl90Kiluc2tiLT5uaC5pcGggKyBuc2tiLT5uaC5pcGgtPmlobCk7CkBAIC0xMTQsNiArMTE0LDE0IEBACiAJdGNwaC0+d2luZG93ID0gMDsKIAl0Y3BoLT51cmdfcHRyID0gMDsKIAorCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW0gKi8KKwl0Y3BoLT5jaGVjayA9IDA7CisJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sodGNwaCwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAorCQkJCSAgIG5za2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJICAgbnNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCAwKSk7CisKIAkvKiBTZXQgREYsIGlkID0gMCAqLwogCW5za2ItPm5oLmlwaC0+ZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CiAJbnNrYi0+bmguaXBoLT5pZCA9IDA7CkBAIC0xMjksMTQgKzEzNyw4IEBACiAJaWYgKGlwX3JvdXRlX21lX2hhcmRlcigmbnNrYiwgYWRkcl90eXBlKSkKIAkJZ290byBmcmVlX25za2I7CiAKLQkvKiBBZGp1c3QgVENQIGNoZWNrc3VtICovCiAJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQl0Y3BoLT5jaGVjayA9IDA7Ci0JdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sodGNwaCwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAotCQkJCSAgIG5za2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJICAgbnNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCAwKSk7CisKIAkvKiBBZGp1c3QgSVAgVFRMICovCiAJbnNrYi0+bmguaXBoLT50dGwgPSBkc3RfbWV0cmljKG5za2ItPmRzdCwgUlRBWF9IT1BMSU1JVCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKaW5kZXggYjM4YjEzMy4uM2RjZjI5NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKQEAgLTM0LDcgKzM0LDExIEBACiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNlbHNlCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9TQU1FLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTE1MiwxMSArMTU2LDE3IEBACiAJICAgSGVyZSB3ZSBjYWxjdWxhdGUgdGhlIGluZGV4IGluIHNhbWUtPmlwYXJyYXkgd2hpY2gKIAkgICBob2xkcyB0aGUgaXBhZGRyZXNzIHdlIHNob3VsZCB1c2UgKi8KIAkKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCXRtcGlwID0gbnRvaGwodC0+c3JjLnUzLmlwKTsKKworCWlmICghKHNhbWUtPmluZm8gJiBJUFRfU0FNRV9OT0RTVCkpCisJCXRtcGlwICs9IG50b2hsKHQtPmRzdC51My5pcCk7CisjZWxzZQogCXRtcGlwID0gbnRvaGwodC0+c3JjLmlwKTsKIAogCWlmICghKHNhbWUtPmluZm8gJiBJUFRfU0FNRV9OT0RTVCkpCiAJCXRtcGlwICs9IG50b2hsKHQtPmRzdC5pcCk7Ci0JCisjZW5kaWYKIAlhaW5kZXggPSB0bXBpcCAlIHNhbWUtPmlwbnVtOwogCiAJbmV3X2lwID0gaHRvbmwoc2FtZS0+aXBhcnJheVthaW5kZXhdKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCmluZGV4IDEwOGI2YjcuLjkzZWI1YzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYwpAQCAtOTcsMTAgKzk3LDggQEAKIAkJCW9wdFtpKzJdID0gKG5ld21zcyAmIDB4ZmYwMCkgPj4gODsKIAkJCW9wdFtpKzNdID0gKG5ld21zcyAmIDB4MDBmZik7CiAKLQkJCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsCi0JCQkJCQkJICAgaHRvbnMob2xkbXNzKV5odG9ucygweEZGRkYpLAotCQkJCQkJCSAgIGh0b25zKG5ld21zcyksCi0JCQkJCQkJICAgdGNwaC0+Y2hlY2ssIDApOworCQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJCQkJaHRvbnMob2xkbXNzKSwgaHRvbnMobmV3bXNzKSwgMCk7CiAJCQlyZXR1cm4gSVBUX0NPTlRJTlVFOwogCQl9CiAJfQpAQCAtMTI2LDI4ICsxMjQsMjIgQEAKICAJb3B0ID0gKHVfaW50OF90ICopdGNwaCArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAltZW1tb3ZlKG9wdCArIFRDUE9MRU5fTVNTLCBvcHQsIHRjcGxlbiAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CiAKLQl0Y3BoLT5jaGVjayA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLAotCQkJCQkgICBodG9ucyh0Y3BsZW4pIF4gaHRvbnMoMHhGRkZGKSwKLQkJCQkgICAgICAgICAgIGh0b25zKHRjcGxlbiArIFRDUE9MRU5fTVNTKSwKLQkJCQkJICAgdGNwaC0+Y2hlY2ssIDEpOworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKKwkJCQlodG9ucyh0Y3BsZW4pLCBodG9ucyh0Y3BsZW4gKyBUQ1BPTEVOX01TUyksIDEpOwogCW9wdFswXSA9IFRDUE9QVF9NU1M7CiAJb3B0WzFdID0gVENQT0xFTl9NU1M7CiAJb3B0WzJdID0gKG5ld21zcyAmIDB4ZmYwMCkgPj4gODsKIAlvcHRbM10gPSAobmV3bXNzICYgMHgwMGZmKTsKIAotCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsIGh0b25sKH4wKSwgKigoX19iZTMyICopb3B0KSwKLQkJCQkJICAgdGNwaC0+Y2hlY2ssIDApOworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCAqcHNrYiwgMCwgKigoX19iZTMyICopb3B0KSwgMCk7CiAKIAlvbGR2YWwgPSAoKF9fYmUxNiAqKXRjcGgpWzZdOwogCXRjcGgtPmRvZmYgKz0gVENQT0xFTl9NU1MvNDsKLQl0Y3BoLT5jaGVjayA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLAotCQkJCQkgICBvbGR2YWwgXiBodG9ucygweEZGRkYpLAotCQkJCQkgICAoKF9fYmUxNiAqKXRjcGgpWzZdLAotCQkJCQkgICB0Y3BoLT5jaGVjaywgMCk7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJCW9sZHZhbCwgKChfX2JlMTYgKil0Y3BoKVs2XSwgMCk7CiAKIAluZXd0b3RsZW4gPSBodG9ucyhudG9ocyhpcGgtPnRvdF9sZW4pICsgVENQT0xFTl9NU1MpOwotCWlwaC0+Y2hlY2sgPSBuZl9jc3VtX3VwZGF0ZShpcGgtPnRvdF9sZW4gXiBodG9ucygweEZGRkYpLAotCQkJCSAgICBuZXd0b3RsZW4sIGlwaC0+Y2hlY2spOworCW5mX2NzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGlwaC0+dG90X2xlbiwgbmV3dG90bGVuKTsKIAlpcGgtPnRvdF9sZW4gPSBuZXd0b3RsZW47CiAJcmV0dXJuIElQVF9DT05USU5VRTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCmluZGV4IDgzYjgwYjMuLjE4ZTc0YWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYwpAQCAtMzAsMTYgKzMwLDE1IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKnRvc2luZm8gPSB0YXJnaW5mbzsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQl1X2ludDE2X3Qgb2xkdG9zOwogCiAJaWYgKChpcGgtPnRvcyAmIElQVE9TX1RPU19NQVNLKSAhPSB0b3NpbmZvLT50b3MpIHsKKwkJX191OCBvbGR0b3M7CiAJCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQogCQkJcmV0dXJuIE5GX0RST1A7CiAJCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKIAkJb2xkdG9zID0gaXBoLT50b3M7CiAJCWlwaC0+dG9zID0gKGlwaC0+dG9zICYgSVBUT1NfUFJFQ19NQVNLKSB8IHRvc2luZm8tPnRvczsKLQkJaXBoLT5jaGVjayA9IG5mX2NzdW1fdXBkYXRlKGh0b25zKG9sZHRvcykgXiBodG9ucygweEZGRkYpLAotCQkJCQkgICAgaHRvbnMoaXBoLT50b3MpLCBpcGgtPmNoZWNrKTsKKwkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaHRvbnMob2xkdG9zKSwgaHRvbnMoaXBoLT50b3MpKTsKIAl9CiAJcmV0dXJuIElQVF9DT05USU5VRTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IGFjOTUxN2QuLmZmZmU1Y2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtNTQsOSArNTQsOCBAQAogCX0KIAogCWlmIChuZXdfdHRsICE9IGlwaC0+dHRsKSB7Ci0JCWlwaC0+Y2hlY2sgPSBuZl9jc3VtX3VwZGF0ZShodG9ucygoaXBoLT50dGwgPDwgOCkpIF4gaHRvbnMoMHhGRkZGKSwKLQkJCQkJICAgIGh0b25zKG5ld190dGwgPDwgOCksCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaHRvbnMoaXBoLT50dGwgPDwgOCksCisJCQkJCSAgICAgIGh0b25zKG5ld190dGwgPDwgOCkpOwogCQlpcGgtPnR0bCA9IG5ld190dGw7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCmluZGV4IDJiMTA0ZWEuLmRiZDM0NzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAlwbS0+ZGF0YV9sZW4gPSBjb3B5X2xlbjsKIAlwbS0+dGltZXN0YW1wX3NlYyA9IHNrYi0+dHN0YW1wLm9mZl9zZWM7CiAJcG0tPnRpbWVzdGFtcF91c2VjID0gc2tiLT50c3RhbXAub2ZmX3VzZWM7Ci0JcG0tPm1hcmsgPSBza2ItPm5mbWFyazsKKwlwbS0+bWFyayA9IHNrYi0+bWFyazsKIAlwbS0+aG9vayA9IGhvb2tudW07CiAJaWYgKHByZWZpeCAhPSBOVUxMKQogCQlzdHJuY3B5KHBtLT5wcmVmaXgsIHByZWZpeCwgc2l6ZW9mKHBtLT5wcmVmaXgpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hhc2hsaW1pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NjZGJmLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyogaXB0YWJsZXMgbWF0Y2ggZXh0ZW5zaW9uIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgcGFja2V0cyBwZXIgc2Vjb25kCi0gKiBzZXBlcmF0ZWx5IGZvciBlYWNoIGhhc2hidWNrZXQgKHNvdXJjZWlwL3NvdXJjZXBvcnQvZHN0aXAvZHN0cG9ydCkKLSAqCi0gKiAoQykgMjAwMy0yMDA0IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICoKLSAqICRJZDogaXB0X2hhc2hsaW1pdC5jIDMyNDQgMjAwNC0xMC0yMCAxNjoyNDoyOVogbGFmb3JnZUBuZXRmaWx0ZXIub3JnICQKLSAqCi0gKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIGZ1bmRlZCBieSBBc3Rhcm8gQUcsIGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8KLSAqCi0gKiBiYXNlZCBvbiBpcHRfbGltaXQuYyBieToKLSAqIErpcvRtZSBkZSBWaXZpZQk8ZGV2aXZpZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgotICogSGVydukgRXljaGVubmUJPGV5Y2hlbm5lQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+Ci0gKiBSdXN0eSBSdXNzZWxsCTxydXN0eUBydXN0Y29ycC5jb20uYXU+Ci0gKgotICogVGhlIGdlbmVyYWwgaWRlYSBpcyB0byBjcmVhdGUgYSBoYXNoIHRhYmxlIGZvciBldmVyeSBkc3RpcCBhbmQgaGF2ZSBhCi0gKiBzZXBlcmF0ZSBsaW1pdCBjb3VudGVyIHBlciB0dXBsZS4gIFRoaXMgd2F5IHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgJ2xpbWl0Ci0gKiB0aGUgbnVtYmVyIG9mIHN5biBwYWNrZXRzIGZvciBlYWNoIG9mIG15IGludGVybmFsIGFkZHJlc3Nlcy4KLSAqCi0gKiBJZGVhbGx5IHRoaXMgd291bGQganVzdCBiZSBpbXBsZW1lbnRlZCBhcyBhIGdlbmVyYWwgJ2hhc2gnIG1hdGNoLCB3aGljaCB3b3VsZAotICogYWxsb3cgdXMgdG8gYXR0YWNoIGFueSBpcHRhYmxlcyB0YXJnZXQgdG8gaXQncyBoYXNoIGJ1Y2tldHMuICBCdXQgdGhpcyBpcwotICogbm90IHBvc3NpYmxlIGluIHRoZSBjdXJyZW50IGlwdGFibGVzIGFyY2hpdGVjdHVyZS4gIEFzIGFsd2F5cywgcGt0dGFibGVzIGZvcgotICogMi43Lnggd2lsbCBoZWxwIDspCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGFzaGxpbWl0Lmg+Ci0KLS8qIEZJWE1FOiB0aGlzIGlzIGp1c3QgZm9yIElQX05GX0FTU0VSUlQgKi8KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIGxpbWl0aW5nIHBlciBoYXNoLWJ1Y2tldCIpOwotCi0vKiBuZWVkIHRvIGRlY2xhcmUgdGhpcyBhdCB0aGUgdG9wICovCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpoYXNobGltaXRfcHJvY2RpcjsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzOwotCi0vKiBoYXNoIHRhYmxlIGNyYXAgKi8KLQotc3RydWN0IGRzdGhhc2hfZHN0IHsKLQlfX2JlMzIgc3JjX2lwOwotCV9fYmUzMiBkc3RfaXA7Ci0JLyogcG9ydHMgaGF2ZSB0byBiZSBjb25zZWN1dGl2ZSAhISEgKi8KLQlfX2JlMTYgc3JjX3BvcnQ7Ci0JX19iZTE2IGRzdF9wb3J0OwotfTsKLQotc3RydWN0IGRzdGhhc2hfZW50IHsKLQkvKiBzdGF0aWMgLyByZWFkLW9ubHkgcGFydHMgaW4gdGhlIGJlZ2lubmluZyAqLwotCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7Ci0Jc3RydWN0IGRzdGhhc2hfZHN0IGRzdDsKLQotCS8qIG1vZGlmaWVkIHN0cnVjdHVyZSBtZW1iZXJzIGluIHRoZSBlbmQgKi8KLQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CQkvKiBwcmVjYWxjdWxhdGVkIGV4cGlyeSB0aW1lICovCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBwcmV2OwkvKiBsYXN0IG1vZGlmaWNhdGlvbiAqLwotCQl1X2ludDMyX3QgY3JlZGl0OwotCQl1X2ludDMyX3QgY3JlZGl0X2NhcCwgY29zdDsKLQl9IHJhdGVpbmZvOwotfTsKLQotc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlIHsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOwkJLyogZ2xvYmFsIGxpc3Qgb2YgYWxsIGh0YWJsZXMgKi8KLQlhdG9taWNfdCB1c2U7Ci0KLQlzdHJ1Y3QgaGFzaGxpbWl0X2NmZyBjZmc7CS8qIGNvbmZpZyAqLwotCi0JLyogdXNlZCBpbnRlcm5hbGx5ICovCi0Jc3BpbmxvY2tfdCBsb2NrOwkJLyogbG9jayBmb3IgbGlzdF9oZWFkICovCi0JdV9pbnQzMl90IHJuZDsJCQkvKiByYW5kb20gc2VlZCBmb3IgaGFzaCAqLwotCWludCBybmRfaW5pdGlhbGl6ZWQ7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIHRpbWVyIGZvciBnYyAqLwotCWF0b21pY190IGNvdW50OwkJCS8qIG51bWJlciBlbnRyaWVzIGluIHRhYmxlICovCi0KLQkvKiBzZXFfZmlsZSBzdHVmZiAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOwotCi0Jc3RydWN0IGhsaXN0X2hlYWQgaGFzaFswXTsJLyogaGFzaHRhYmxlIGl0c2VsZiAqLwotfTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhoYXNobGltaXRfbG9jayk7CS8qIHByb3RlY3RzIGh0YWJsZXMgbGlzdCAqLwotc3RhdGljIERFRklORV9NVVRFWChobGltaXRfbXV0ZXgpOwkvKiBhZGRpdGlvbmFsIGNoZWNrZW50cnkgcHJvdGVjdGlvbiAqLwotc3RhdGljIEhMSVNUX0hFQUQoaGFzaGxpbWl0X2h0YWJsZXMpOwotc3RhdGljIGttZW1fY2FjaGVfdCAqaGFzaGxpbWl0X2NhY2hlcCBfX3JlYWRfbW9zdGx5OwotCi1zdGF0aWMgaW5saW5lIGludCBkc3RfY21wKGNvbnN0IHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCBzdHJ1Y3QgZHN0aGFzaF9kc3QgKmIpCi17Ci0JcmV0dXJuIChlbnQtPmRzdC5kc3RfaXAgPT0gYi0+ZHN0X2lwIAotCQkmJiBlbnQtPmRzdC5kc3RfcG9ydCA9PSBiLT5kc3RfcG9ydAotCQkmJiBlbnQtPmRzdC5zcmNfcG9ydCA9PSBiLT5zcmNfcG9ydAotCQkmJiBlbnQtPmRzdC5zcmNfaXAgPT0gYi0+c3JjX2lwKTsKLX0KLQotc3RhdGljIGlubGluZSB1X2ludDMyX3QKLWhhc2hfZHN0KGNvbnN0IHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIGNvbnN0IHN0cnVjdCBkc3RoYXNoX2RzdCAqZHN0KQotewotCXJldHVybiAoamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMilkc3QtPmRzdF9pcCwKLQkJCSAgICAoKF9fZm9yY2UgdTMyKWRzdC0+ZHN0X3BvcnQ8PDE2IHwKLQkJCSAgICAgKF9fZm9yY2UgdTMyKWRzdC0+c3JjX3BvcnQpLAotCQkJICAgICAoX19mb3JjZSB1MzIpZHN0LT5zcmNfaXAsIGh0LT5ybmQpICUgaHQtPmNmZy5zaXplKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHN0aGFzaF9lbnQgKgotX19kc3RoYXNoX2ZpbmQoY29uc3Qgc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodCwgc3RydWN0IGRzdGhhc2hfZHN0ICpkc3QpCi17Ci0Jc3RydWN0IGRzdGhhc2hfZW50ICplbnQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQl1X2ludDMyX3QgaGFzaCA9IGhhc2hfZHN0KGh0LCBkc3QpOwotCi0JaWYgKCFobGlzdF9lbXB0eSgmaHQtPmhhc2hbaGFzaF0pKQotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnQsIHBvcywgJmh0LT5oYXNoW2hhc2hdLCBub2RlKSB7Ci0JCQlpZiAoZHN0X2NtcChlbnQsIGRzdCkpIHsKLQkJCQlyZXR1cm4gZW50OwotCQkJfQotCQl9Ci0JCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGFsbG9jYXRlIGRzdGhhc2hfZW50LCBpbml0aWFsaXplIGRzdCwgcHV0IGluIGh0YWJsZSBhbmQgbG9jayBpdCAqLwotc3RhdGljIHN0cnVjdCBkc3RoYXNoX2VudCAqCi1fX2RzdGhhc2hfYWxsb2NfaW5pdChzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0LCBzdHJ1Y3QgZHN0aGFzaF9kc3QgKmRzdCkKLXsKLQlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudDsKLQotCS8qIGluaXRpYWxpemUgaGFzaCB3aXRoIHJhbmRvbSB2YWwgYXQgdGhlIHRpbWUgd2UgYWxsb2NhdGUKLQkgKiB0aGUgZmlyc3QgaGFzaHRhYmxlIGVudHJ5ICovCi0JaWYgKCFodC0+cm5kX2luaXRpYWxpemVkKSB7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmh0LT5ybmQsIDQpOwotCQlodC0+cm5kX2luaXRpYWxpemVkID0gMTsKLQl9Ci0KLQlpZiAoaHQtPmNmZy5tYXggJiYKLQkgICAgYXRvbWljX3JlYWQoJmh0LT5jb3VudCkgPj0gaHQtPmNmZy5tYXgpIHsKLQkJLyogRklYTUU6IGRvIHNvbWV0aGluZy4gcXVlc3Rpb24gaXMgd2hhdC4uICovCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCSJpcHRfaGFzaGxpbWl0OiBtYXggY291bnQgb2YgJXUgcmVhY2hlZFxuIiwgCi0JCQkJaHQtPmNmZy5tYXgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQllbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGhhc2hsaW1pdF9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmICghZW50KSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgCi0JCQkJImlwdF9oYXNobGltaXQ6IGNhbid0IGFsbG9jYXRlIGRzdGhhc2hfZW50XG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYXRvbWljX2luYygmaHQtPmNvdW50KTsKLQotCWVudC0+ZHN0LmRzdF9pcCA9IGRzdC0+ZHN0X2lwOwotCWVudC0+ZHN0LmRzdF9wb3J0ID0gZHN0LT5kc3RfcG9ydDsKLQllbnQtPmRzdC5zcmNfaXAgPSBkc3QtPnNyY19pcDsKLQllbnQtPmRzdC5zcmNfcG9ydCA9IGRzdC0+c3JjX3BvcnQ7Ci0KLQlobGlzdF9hZGRfaGVhZCgmZW50LT5ub2RlLCAmaHQtPmhhc2hbaGFzaF9kc3QoaHQsIGRzdCldKTsKLQotCXJldHVybiBlbnQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAKLV9fZHN0aGFzaF9mcmVlKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2VudCAqZW50KQotewotCWhsaXN0X2RlbCgmZW50LT5ub2RlKTsKLQlrbWVtX2NhY2hlX2ZyZWUoaGFzaGxpbWl0X2NhY2hlcCwgZW50KTsKLQlhdG9taWNfZGVjKCZodC0+Y291bnQpOwotfQotc3RhdGljIHZvaWQgaHRhYmxlX2djKHVuc2lnbmVkIGxvbmcgaHRsb25nKTsKLQotc3RhdGljIGludCBodGFibGVfY3JlYXRlKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKm1pbmZvKQotewotCWludCBpOwotCXVuc2lnbmVkIGludCBzaXplOwotCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm87Ci0KLQlpZiAobWluZm8tPmNmZy5zaXplKQotCQlzaXplID0gbWluZm8tPmNmZy5zaXplOwotCWVsc2UgewotCQlzaXplID0gKCgobnVtX3BoeXNwYWdlcyA8PCBQQUdFX1NISUZUKSAvIDE2Mzg0KQotCQkJIC8gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKLQkJaWYgKG51bV9waHlzcGFnZXMgPiAoMTAyNCAqIDEwMjQgKiAxMDI0IC8gUEFHRV9TSVpFKSkKLQkJCXNpemUgPSA4MTkyOwotCQlpZiAoc2l6ZSA8IDE2KQotCQkJc2l6ZSA9IDE2OwotCX0KLQkvKiBGSVhNRTogZG9uJ3QgdXNlIHZtYWxsb2MoKSBoZXJlIG9yIGFueXdoZXJlIGVsc2UgLUhXICovCi0JaGluZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUpCi0JCQkrIChzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBzaXplKSk7Ci0JaWYgKCFoaW5mbykgewotCQlwcmludGsoS0VSTl9FUlIgImlwdF9oYXNobGltaXQ6IFVuYWJsZSB0byBjcmVhdGUgaGFzaHRhYmxlXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltaW5mby0+aGluZm8gPSBoaW5mbzsKLQotCS8qIGNvcHkgbWF0Y2ggY29uZmlnIGludG8gaGFzaHRhYmxlIGNvbmZpZyAqLwotCW1lbWNweSgmaGluZm8tPmNmZywgJm1pbmZvLT5jZmcsIHNpemVvZihoaW5mby0+Y2ZnKSk7Ci0JaGluZm8tPmNmZy5zaXplID0gc2l6ZTsKLQlpZiAoIWhpbmZvLT5jZmcubWF4KQotCQloaW5mby0+Y2ZnLm1heCA9IDggKiBoaW5mby0+Y2ZnLnNpemU7Ci0JZWxzZSBpZiAoaGluZm8tPmNmZy5tYXggPCBoaW5mby0+Y2ZnLnNpemUpCi0JCWhpbmZvLT5jZmcubWF4ID0gaGluZm8tPmNmZy5zaXplOwotCi0JZm9yIChpID0gMDsgaSA8IGhpbmZvLT5jZmcuc2l6ZTsgaSsrKQotCQlJTklUX0hMSVNUX0hFQUQoJmhpbmZvLT5oYXNoW2ldKTsKLQotCWF0b21pY19zZXQoJmhpbmZvLT5jb3VudCwgMCk7Ci0JYXRvbWljX3NldCgmaGluZm8tPnVzZSwgMSk7Ci0JaGluZm8tPnJuZF9pbml0aWFsaXplZCA9IDA7Ci0Jc3Bpbl9sb2NrX2luaXQoJmhpbmZvLT5sb2NrKTsKLQloaW5mby0+cGRlID0gY3JlYXRlX3Byb2NfZW50cnkobWluZm8tPm5hbWUsIDAsIGhhc2hsaW1pdF9wcm9jZGlyKTsKLQlpZiAoIWhpbmZvLT5wZGUpIHsKLQkJdmZyZWUoaGluZm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWhpbmZvLT5wZGUtPnByb2NfZm9wcyA9ICZkbF9maWxlX29wczsKLQloaW5mby0+cGRlLT5kYXRhID0gaGluZm87Ci0KLQlpbml0X3RpbWVyKCZoaW5mby0+dGltZXIpOwotCWhpbmZvLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5nY19pbnRlcnZhbCk7Ci0JaGluZm8tPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyApaGluZm87Ci0JaGluZm8tPnRpbWVyLmZ1bmN0aW9uID0gaHRhYmxlX2djOwotCWFkZF90aW1lcigmaGluZm8tPnRpbWVyKTsKLQotCXNwaW5fbG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOwotCWhsaXN0X2FkZF9oZWFkKCZoaW5mby0+bm9kZSwgJmhhc2hsaW1pdF9odGFibGVzKTsKLQlzcGluX3VubG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2VsZWN0X2FsbChzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0LCBzdHJ1Y3QgZHN0aGFzaF9lbnQgKmhlKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHNlbGVjdF9nYyhzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0LCBzdHJ1Y3QgZHN0aGFzaF9lbnQgKmhlKQotewotCXJldHVybiAoamlmZmllcyA+PSBoZS0+ZXhwaXJlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGh0YWJsZV9zZWxlY3RpdmVfY2xlYW51cChzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0LAotCQkgCQlpbnQgKCpzZWxlY3QpKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIAotCQkJCQkgICAgICBzdHJ1Y3QgZHN0aGFzaF9lbnQgKmhlKSkKLXsKLQlpbnQgaTsKLQotCUlQX05GX0FTU0VSVChodC0+Y2ZnLnNpemUgJiYgaHQtPmNmZy5tYXgpOwotCi0JLyogbG9jayBoYXNoIHRhYmxlIGFuZCBpdGVyYXRlIG92ZXIgaXQgKi8KLQlzcGluX2xvY2tfYmgoJmh0LT5sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgaHQtPmNmZy5zaXplOyBpKyspIHsKLQkJc3RydWN0IGRzdGhhc2hfZW50ICpkaDsKLQkJc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm47Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGgsIHBvcywgbiwgJmh0LT5oYXNoW2ldLCBub2RlKSB7Ci0JCQlpZiAoKCpzZWxlY3QpKGh0LCBkaCkpCi0JCQkJX19kc3RoYXNoX2ZyZWUoaHQsIGRoKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmaHQtPmxvY2spOwotfQotCi0vKiBoYXNoIHRhYmxlIGdhcmJhZ2UgY29sbGVjdG9yLCBydW4gYnkgdGltZXIgKi8KLXN0YXRpYyB2b2lkIGh0YWJsZV9nYyh1bnNpZ25lZCBsb25nIGh0bG9uZykKLXsKLQlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0ID0gKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqKWh0bG9uZzsKLQotCWh0YWJsZV9zZWxlY3RpdmVfY2xlYW51cChodCwgc2VsZWN0X2djKTsKLQotCS8qIHJlLWFkZCB0aGUgdGltZXIgYWNjb3JkaW5nbHkgKi8KLQlodC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGh0LT5jZmcuZ2NfaW50ZXJ2YWwpOwotCWFkZF90aW1lcigmaHQtPnRpbWVyKTsKLX0KLQotc3RhdGljIHZvaWQgaHRhYmxlX2Rlc3Ryb3koc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpoaW5mbykKLXsKLQkvKiByZW1vdmUgdGltZXIsIGlmIGl0IGlzIHBlbmRpbmcgKi8KLQlpZiAodGltZXJfcGVuZGluZygmaGluZm8tPnRpbWVyKSkKLQkJZGVsX3RpbWVyKCZoaW5mby0+dGltZXIpOwotCi0JLyogcmVtb3ZlIHByb2MgZW50cnkgKi8KLQlyZW1vdmVfcHJvY19lbnRyeShoaW5mby0+cGRlLT5uYW1lLCBoYXNobGltaXRfcHJvY2Rpcik7Ci0KLQlodGFibGVfc2VsZWN0aXZlX2NsZWFudXAoaGluZm8sIHNlbGVjdF9hbGwpOwotCXZmcmVlKGhpbmZvKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlX2ZpbmRfZ2V0KGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpoaW5mbzsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCi0Jc3Bpbl9sb2NrX2JoKCZoYXNobGltaXRfbG9jayk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkoaGluZm8sIHBvcywgJmhhc2hsaW1pdF9odGFibGVzLCBub2RlKSB7Ci0JCWlmICghc3RyY21wKG5hbWUsIGhpbmZvLT5wZGUtPm5hbWUpKSB7Ci0JCQlhdG9taWNfaW5jKCZoaW5mby0+dXNlKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZoYXNobGltaXRfbG9jayk7Ci0JCQlyZXR1cm4gaGluZm87Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmhhc2hsaW1pdF9sb2NrKTsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBodGFibGVfcHV0KHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8pCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhpbmZvLT51c2UpKSB7Ci0JCXNwaW5fbG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOwotCQlobGlzdF9kZWwoJmhpbmZvLT5ub2RlKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmhhc2hsaW1pdF9sb2NrKTsKLQkJaHRhYmxlX2Rlc3Ryb3koaGluZm8pOwotCX0KLX0KLQotCi0vKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgdGhlIFNpbXBsZSBUb2tlbiBCdWNrZXQgRmlsdGVyIChUQkYpCi0gKiBzZWUgbmV0L3NjaGVkL3NjaF90YmYuYyBpbiB0aGUgbGludXggc291cmNlIHRyZWUKLSAqLwotCi0vKiBSdXN0eTogVGhpcyBpcyBteSAobm9uLW1hdGhlbWF0aWNhbGx5LWluY2xpbmVkKSB1bmRlcnN0YW5kaW5nIG9mCi0gICB0aGlzIGFsZ29yaXRobS4gIFRoZSBgYXZlcmFnZSByYXRlJyBpbiBqaWZmaWVzIGJlY29tZXMgeW91ciBpbml0aWFsCi0gICBhbW91bnQgb2YgY3JlZGl0IGBjcmVkaXQnIGFuZCB0aGUgbW9zdCBjcmVkaXQgeW91IGNhbiBldmVyIGhhdmUKLSAgIGBjcmVkaXRfY2FwJy4gIFRoZSBgcGVhayByYXRlJyBiZWNvbWVzIHRoZSBjb3N0IG9mIHBhc3NpbmcgdGhlCi0gICB0ZXN0LCBgY29zdCcuCi0KLSAgIGBwcmV2JyB0cmFja3MgdGhlIGxhc3QgcGFja2V0IGhpdDogeW91IGdhaW4gb25lIGNyZWRpdCBwZXIgamlmZnkuCi0gICBJZiB5b3UgZ2V0IGNyZWRpdCBiYWxhbmNlIG1vcmUgdGhhbiB0aGlzLCB0aGUgZXh0cmEgY3JlZGl0IGlzCi0gICBkaXNjYXJkZWQuICBFdmVyeSB0aW1lIHRoZSBtYXRjaCBwYXNzZXMsIHlvdSBsb3NlIGBjb3N0JyBjcmVkaXRzOwotICAgaWYgeW91IGRvbid0IGhhdmUgdGhhdCBtYW55LCB0aGUgdGVzdCBmYWlscy4KLQotICAgU2VlIEFsZXhleSdzIGZvcm1hbCBleHBsYW5hdGlvbiBpbiBuZXQvc2NoZWQvc2NoX3RiZi5jLgotCi0gICBUbyBnZXQgdGhlIG1heGltdW0gcmFuZ2UsIHdlIG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIChpZS4geW91IGdldCBOCi0gICBjcmVkaXRzIHBlciBqaWZmeSkuICBXZSB3YW50IHRvIGFsbG93IGEgcmF0ZSBhcyBsb3cgYXMgMSBwZXIgZGF5Ci0gICAoc2xvd2VzdCB1c2Vyc3BhY2UgdG9vbCBhbGxvd3MpLCB3aGljaCBtZWFucwotICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyIGllLgotKi8KLSNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCi0KLS8qIFJlcGVhdGVkIHNoaWZ0IGFuZCBvciBnaXZlcyB1cyBhbGwgMXMsIGZpbmFsIHNoaWZ0IGFuZCBhZGQgMSBnaXZlcwotICogdXMgdGhlIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHRoZW9yZXRpY2FsIG1heCwgc28gR0NDIHNpbXBseSBkb2VzIGEKLSAqIHNoaWZ0LiAqLwotI2RlZmluZSBfUE9XMl9CRUxPVzIoeCkgKCh4KXwoKHgpPj4xKSkKLSNkZWZpbmUgX1BPVzJfQkVMT1c0KHgpIChfUE9XMl9CRUxPVzIoeCl8X1BPVzJfQkVMT1cyKCh4KT4+MikpCi0jZGVmaW5lIF9QT1cyX0JFTE9XOCh4KSAoX1BPVzJfQkVMT1c0KHgpfF9QT1cyX0JFTE9XNCgoeCk+PjQpKQotI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCi0jZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKLSNkZWZpbmUgUE9XMl9CRUxPVzMyKHgpICgoX1BPVzJfQkVMT1czMih4KT4+MSkgKyAxKQotCi0jZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIFBPVzJfQkVMT1czMihNQVhfQ1BKKQotCi0vKiBQcmVjaXNpb24gc2F2ZXIuICovCi1zdGF0aWMgaW5saW5lIHVfaW50MzJfdAotdXNlcjJjcmVkaXRzKHVfaW50MzJfdCB1c2VyKQotewotCS8qIElmIG11bHRpcGx5aW5nIHdvdWxkIG92ZXJmbG93Li4uICovCi0JaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKLQkJLyogRGl2aWRlIGZpcnN0LiAqLwotCQlyZXR1cm4gKHVzZXIgLyBJUFRfSEFTSExJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7Ci0KLQlyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIElQVF9IQVNITElNSVRfU0NBTEU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByYXRlaW5mb19yZWNhbGMoc3RydWN0IGRzdGhhc2hfZW50ICpkaCwgdW5zaWduZWQgbG9uZyBub3cpCi17Ci0JZGgtPnJhdGVpbmZvLmNyZWRpdCArPSAobm93IC0geGNoZygmZGgtPnJhdGVpbmZvLnByZXYsIG5vdykpIAotCQkJCQkqIENSRURJVFNfUEVSX0pJRkZZOwotCWlmIChkaC0+cmF0ZWluZm8uY3JlZGl0ID4gZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXApCi0JCWRoLT5yYXRlaW5mby5jcmVkaXQgPSBkaC0+cmF0ZWluZm8uY3JlZGl0X2NhcDsKLX0KLQotc3RhdGljIGludAotaGFzaGxpbWl0X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLQkJY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQlpbnQgb2Zmc2V0LAotCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLQkJaW50ICpob3Rkcm9wKQotewotCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKnIgPSAKLQkJKChzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvICopbWF0Y2hpbmZvKS0+dS5tYXN0ZXI7Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IHItPmhpbmZvOwotCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoOwotCXN0cnVjdCBkc3RoYXNoX2RzdCBkc3Q7Ci0KLQkvKiBidWlsZCAnZHN0JyBhY2NvcmRpbmcgdG8gaGluZm8tPmNmZyBhbmQgY3VycmVudCBwYWNrZXQgKi8KLQltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOwotCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfRElQKQotCQlkc3QuZHN0X2lwID0gc2tiLT5uaC5pcGgtPmRhZGRyOwotCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfU0lQKQotCQlkc3Quc3JjX2lwID0gc2tiLT5uaC5pcGgtPnNhZGRyOwotCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfRFBUCi0JICAgIHx8aGluZm8tPmNmZy5tb2RlICYgSVBUX0hBU0hMSU1JVF9IQVNIX1NQVCkgewotCQlfX2JlMTYgX3BvcnRzWzJdLCAqcG9ydHM7Ci0KLQkJc3dpdGNoIChza2ItPm5oLmlwaC0+cHJvdG9jb2wpIHsKLQkJY2FzZSBJUFBST1RPX1RDUDoKLQkJY2FzZSBJUFBST1RPX1VEUDoKLQkJY2FzZSBJUFBST1RPX1NDVFA6Ci0JCWNhc2UgSVBQUk9UT19EQ0NQOgotCQkJcG9ydHMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJCQkgICBzaXplb2YoX3BvcnRzKSwgJl9wb3J0cyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCV9wb3J0c1swXSA9IF9wb3J0c1sxXSA9IDA7Ci0JCQlwb3J0cyA9IF9wb3J0czsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghcG9ydHMpIHsKLQkJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCi0JCSAJICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCQkqaG90ZHJvcCA9IDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgSVBUX0hBU0hMSU1JVF9IQVNIX1NQVCkKLQkJCWRzdC5zcmNfcG9ydCA9IHBvcnRzWzBdOwotCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgSVBUX0hBU0hMSU1JVF9IQVNIX0RQVCkKLQkJCWRzdC5kc3RfcG9ydCA9IHBvcnRzWzFdOwotCX0gCi0KLQlzcGluX2xvY2tfYmgoJmhpbmZvLT5sb2NrKTsKLQlkaCA9IF9fZHN0aGFzaF9maW5kKGhpbmZvLCAmZHN0KTsKLQlpZiAoIWRoKSB7Ci0JCWRoID0gX19kc3RoYXNoX2FsbG9jX2luaXQoaGluZm8sICZkc3QpOwotCi0JCWlmICghZGgpIHsKLQkJCS8qIGVub21lbS4uLiBkb24ndCBtYXRjaCA9PSBEUk9QICovCi0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVOT01FTVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZoaW5mby0+bG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWRoLT5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5leHBpcmUpOwotCi0JCWRoLT5yYXRlaW5mby5wcmV2ID0gamlmZmllczsKLQkJZGgtPnJhdGVpbmZvLmNyZWRpdCA9IHVzZXIyY3JlZGl0cyhoaW5mby0+Y2ZnLmF2ZyAqIAotCQkJCQkJCWhpbmZvLT5jZmcuYnVyc3QpOwotCQlkaC0+cmF0ZWluZm8uY3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhoaW5mby0+Y2ZnLmF2ZyAqIAotCQkJCQkJCWhpbmZvLT5jZmcuYnVyc3QpOwotCQlkaC0+cmF0ZWluZm8uY29zdCA9IHVzZXIyY3JlZGl0cyhoaW5mby0+Y2ZnLmF2Zyk7Ci0JfSBlbHNlIHsKLQkJLyogdXBkYXRlIGV4cGlyYXRpb24gdGltZW91dCAqLwotCQlkaC0+ZXhwaXJlcyA9IG5vdyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5leHBpcmUpOwotCQlyYXRlaW5mb19yZWNhbGMoZGgsIG5vdyk7Ci0JfQotCi0JaWYgKGRoLT5yYXRlaW5mby5jcmVkaXQgPj0gZGgtPnJhdGVpbmZvLmNvc3QpIHsKLQkJLyogV2UncmUgdW5kZXJsaW1pdC4gKi8KLQkJZGgtPnJhdGVpbmZvLmNyZWRpdCAtPSBkaC0+cmF0ZWluZm8uY29zdDsKLQkJc3Bpbl91bmxvY2tfYmgoJmhpbmZvLT5sb2NrKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0gICAgICAgCXNwaW5fdW5sb2NrX2JoKCZoaW5mby0+bG9jayk7Ci0KLQkvKiBkZWZhdWx0IGNhc2U6IHdlJ3JlIG92ZXJsaW1pdCwgdGh1cyBkb24ndCBtYXRjaCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1oYXNobGltaXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgY29uc3Qgdm9pZCAqaW5mLAotCQkgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0JCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaW5mbyAqciA9IG1hdGNoaW5mbzsKLQotCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KLQlpZiAoci0+Y2ZnLmJ1cnN0ID09IDAKLQkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmNmZy5hdmcgKiByLT5jZmcuYnVyc3QpIDwgCi0JICAgIAkJCQl1c2VyMmNyZWRpdHMoci0+Y2ZnLmF2ZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpcHRfaGFzaGxpbWl0OiBPdmVyZmxvdywgdHJ5IGxvd2VyOiAldS8ldVxuIiwKLQkJICAgICAgIHItPmNmZy5hdmcsIHItPmNmZy5idXJzdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChyLT5jZmcubW9kZSA9PSAwIAotCSAgICB8fCByLT5jZmcubW9kZSA+IChJUFRfSEFTSExJTUlUX0hBU0hfRFBUCi0JCSAgICAgICAgICB8SVBUX0hBU0hMSU1JVF9IQVNIX0RJUAotCQkJICB8SVBUX0hBU0hMSU1JVF9IQVNIX1NJUAotCQkJICB8SVBUX0hBU0hMSU1JVF9IQVNIX1NQVCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCFyLT5jZmcuZ2NfaW50ZXJ2YWwpCi0JCXJldHVybiAwOwotCQotCWlmICghci0+Y2ZnLmV4cGlyZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoci0+bmFtZVtzaXplb2Yoci0+bmFtZSkgLSAxXSAhPSAnXDAnKQotCQlyZXR1cm4gMDsKLQotCS8qIFRoaXMgaXMgdGhlIGJlc3Qgd2UndmUgZ290OiBXZSBjYW5ub3QgcmVsZWFzZSBhbmQgcmUtZ3JhYiBsb2NrLAotCSAqIHNpbmNlIGNoZWNrZW50cnkoKSBpcyBjYWxsZWQgYmVmb3JlIGlwX3RhYmxlcy5jIGdyYWJzIGlwdF9tdXRleC4gIAotCSAqIFdlIGFsc28gY2Fubm90IGdyYWIgdGhlIGhhc2h0YWJsZSBzcGlubG9jaywgc2luY2UgaHRhYmxlX2NyZWF0ZSB3aWxsIAotCSAqIGNhbGwgdm1hbGxvYywgYW5kIHRoYXQgY2FuIHNsZWVwLiAgQW5kIHdlIGNhbm5vdCBqdXN0IHJlLXNlYXJjaAotCSAqIHRoZSBsaXN0IG9mIGh0YWJsZSdzIGluIGh0YWJsZV9jcmVhdGUoKSwgc2luY2UgdGhlbiB3ZSB3b3VsZAotCSAqIGNyZWF0ZSBkdXBsaWNhdGUgcHJvYyBmaWxlcy4gLUhXICovCi0JbXV0ZXhfbG9jaygmaGxpbWl0X211dGV4KTsKLQlyLT5oaW5mbyA9IGh0YWJsZV9maW5kX2dldChyLT5uYW1lKTsKLQlpZiAoIXItPmhpbmZvICYmIChodGFibGVfY3JlYXRlKHIpICE9IDApKSB7Ci0JCW11dGV4X3VubG9jaygmaGxpbWl0X211dGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCW11dGV4X3VubG9jaygmaGxpbWl0X211dGV4KTsKLQotCS8qIFVnbHkgaGFjazogRm9yIFNNUCwgd2Ugb25seSB3YW50IHRvIHVzZSBvbmUgc2V0ICovCi0Jci0+dS5tYXN0ZXIgPSByOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1oYXNobGltaXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8pCi17Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaW5mbyAqciA9IG1hdGNoaW5mbzsKLQotCWh0YWJsZV9wdXQoci0+aGluZm8pOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RydWN0IGNvbXBhdF9pcHRfaGFzaGxpbWl0X2luZm8gewotCWNoYXIgbmFtZVtJRk5BTVNJWl07Ci0Jc3RydWN0IGhhc2hsaW1pdF9jZmcgY2ZnOwotCWNvbXBhdF91cHRyX3QgaGluZm87Ci0JY29tcGF0X3VwdHJfdCBtYXN0ZXI7Ci19OwotCi1zdGF0aWMgdm9pZCBjb21wYXRfZnJvbV91c2VyKHZvaWQgKmRzdCwgdm9pZCAqc3JjKQotewotCWludCBvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X2lwdF9oYXNobGltaXRfaW5mbywgaGluZm8pOwotCi0JbWVtY3B5KGRzdCwgc3JjLCBvZmYpOwotCW1lbXNldChkc3QgKyBvZmYsIDAsIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lwdF9oYXNobGltaXRfaW5mbykgLSBvZmYpOwotfQotCi1zdGF0aWMgaW50IGNvbXBhdF90b191c2VyKHZvaWQgX191c2VyICpkc3QsIHZvaWQgKnNyYykKLXsKLQlpbnQgb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9pcHRfaGFzaGxpbWl0X2luZm8sIGhpbmZvKTsKLQotCXJldHVybiBjb3B5X3RvX3VzZXIoZHN0LCBzcmMsIG9mZikgPyAtRUZBVUxUIDogMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBpcHRfaGFzaGxpbWl0ID0gewotCS5uYW1lCQk9ICJoYXNobGltaXQiLAotCS5tYXRjaAkJPSBoYXNobGltaXRfbWF0Y2gsCi0JLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvKSwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF9pcHRfaGFzaGxpbWl0X2luZm8pLAotCS5jb21wYXRfZnJvbV91c2VyID0gY29tcGF0X2Zyb21fdXNlciwKLQkuY29tcGF0X3RvX3VzZXIJPSBjb21wYXRfdG9fdXNlciwKLSNlbmRpZgotCS5jaGVja2VudHJ5CT0gaGFzaGxpbWl0X2NoZWNrZW50cnksCi0JLmRlc3Ryb3kJPSBoYXNobGltaXRfZGVzdHJveSwKLQkubWUJCT0gVEhJU19NT0RVTEUKLX07Ci0KLS8qIFBST0Mgc3R1ZmYgKi8KLQotc3RhdGljIHZvaWQgKmRsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gcy0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0YWJsZSA9IHBkZS0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgKmJ1Y2tldDsKLQotCXNwaW5fbG9ja19iaCgmaHRhYmxlLT5sb2NrKTsKLQlpZiAoKnBvcyA+PSBodGFibGUtPmNmZy5zaXplKQotCQlyZXR1cm4gTlVMTDsKLQotCWJ1Y2tldCA9IGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCksIEdGUF9BVE9NSUMpOwotCWlmICghYnVja2V0KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCSpidWNrZXQgPSAqcG9zOwotCXJldHVybiBidWNrZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkICpkbF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gcy0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0YWJsZSA9IHBkZS0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgKmJ1Y2tldCA9ICh1bnNpZ25lZCBpbnQgKil2OwotCi0JKnBvcyA9ICsrKCpidWNrZXQpOwotCWlmICgqcG9zID49IGh0YWJsZS0+Y2ZnLnNpemUpIHsKLQkJa2ZyZWUodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gYnVja2V0OwotfQotCi1zdGF0aWMgdm9pZCBkbF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzLT5wcml2YXRlOwotCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcGRlLT5kYXRhOwotCXVuc2lnbmVkIGludCAqYnVja2V0ID0gKHVuc2lnbmVkIGludCAqKXY7Ci0KLQlrZnJlZShidWNrZXQpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmh0YWJsZS0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHN0cnVjdCBzZXFfZmlsZSAqcykKLXsKLQkvKiByZWNhbGN1bGF0ZSB0byBzaG93IGFjY3VyYXRlIG51bWJlcnMgKi8KLQlyYXRlaW5mb19yZWNhbGMoZW50LCBqaWZmaWVzKTsKLQotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlbGQgJXUuJXUuJXUuJXU6JXUtPiV1LiV1LiV1LiV1OiV1ICV1ICV1ICV1XG4iLAotCQkJKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAotCQkJTklQUVVBRChlbnQtPmRzdC5zcmNfaXApLCBudG9ocyhlbnQtPmRzdC5zcmNfcG9ydCksCi0JCQlOSVBRVUFEKGVudC0+ZHN0LmRzdF9pcCksIG50b2hzKGVudC0+ZHN0LmRzdF9wb3J0KSwKLQkJCWVudC0+cmF0ZWluZm8uY3JlZGl0LCBlbnQtPnJhdGVpbmZvLmNyZWRpdF9jYXAsCi0JCQllbnQtPnJhdGVpbmZvLmNvc3QpOwotfQotCi1zdGF0aWMgaW50IGRsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHMtPnByaXZhdGU7Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodGFibGUgPSBwZGUtPmRhdGE7Ci0JdW5zaWduZWQgaW50ICpidWNrZXQgPSAodW5zaWduZWQgaW50ICopdjsKLQlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCi0JaWYgKCFobGlzdF9lbXB0eSgmaHRhYmxlLT5oYXNoWypidWNrZXRdKSkKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50LCBwb3MsICZodGFibGUtPmhhc2hbKmJ1Y2tldF0sIG5vZGUpIHsKLQkJCWlmIChkbF9zZXFfcmVhbF9zaG93KGVudCwgcykpIHsKLQkJCQkvKiBidWZmZXIgd2FzIGZpbGxlZCBhbmQgdW5hYmxlIHRvIHByaW50IHRoYXQgdHVwbGUgKi8KLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRsX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gZGxfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGRsX3NlcV9uZXh0LAotCS5zdG9wICA9IGRsX3NlcV9zdG9wLAotCS5zaG93ICA9IGRsX3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGRsX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOwotCi0JaWYgKCFyZXQpIHsKLQkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJc2YtPnByaXZhdGUgPSBQREUoaW5vZGUpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQotfTsKLQotc3RhdGljIGludCBpbml0X29yX2ZpbmkoaW50IGZpbmkpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZmluaSkKLQkJZ290byBjbGVhbnVwOwotCi0JaWYgKGlwdF9yZWdpc3Rlcl9tYXRjaCgmaXB0X2hhc2hsaW1pdCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBjbGVhbnVwX25vdGhpbmc7Ci0JfQotCi0JaGFzaGxpbWl0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcHRfaGFzaGxpbWl0IiwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZHN0aGFzaF9lbnQpLCAwLAotCQkJCQkgICAgMCwgTlVMTCwgTlVMTCk7Ci0JaWYgKCFoYXNobGltaXRfY2FjaGVwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNyZWF0ZSBpcHRfaGFzaGxpbWl0IHNsYWIgY2FjaGVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXBfdW5yZWdfbWF0Y2g7Ci0JfQotCi0JaGFzaGxpbWl0X3Byb2NkaXIgPSBwcm9jX21rZGlyKCJpcHRfaGFzaGxpbWl0IiwgcHJvY19uZXQpOwotCWlmICghaGFzaGxpbWl0X3Byb2NkaXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIHByb2MgZGlyIGVudHJ5XG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBjbGVhbnVwX2ZyZWVfc2xhYjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi1jbGVhbnVwOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHRfaGFzaGxpbWl0IiwgcHJvY19uZXQpOwotY2xlYW51cF9mcmVlX3NsYWI6Ci0Ja21lbV9jYWNoZV9kZXN0cm95KGhhc2hsaW1pdF9jYWNoZXApOwotY2xlYW51cF91bnJlZ19tYXRjaDoKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X2hhc2hsaW1pdCk7Ci1jbGVhbnVwX25vdGhpbmc6Ci0JcmV0dXJuIHJldDsKLQkKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXB0X2hhc2hsaW1pdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGluaXRfb3JfZmluaSgwKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwdF9oYXNobGltaXRfZmluaSh2b2lkKQotewotCWluaXRfb3JfZmluaSgxKTsKLX0KLQotbW9kdWxlX2luaXQoaXB0X2hhc2hsaW1pdF9pbml0KTsKLW1vZHVsZV9leGl0KGlwdF9oYXNobGltaXRfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCmluZGV4IGI5MWYzNTguLmFmMjkzOTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmV0OwogCXVfaW50OF90IHRvczsKIAlfX2JlMzIgc2FkZHIsIGRhZGRyOwotCXVuc2lnbmVkIGxvbmcgbmZtYXJrOworCXVfaW50MzJfdCBtYXJrOwogCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCkBAIC0xNDMsNyArMTQzLDcgQEAKIAl9CiAKIAkvKiBTYXZlIHRoaW5ncyB3aGljaCBjb3VsZCBhZmZlY3Qgcm91dGUgKi8KLQluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CisJbWFyayA9ICgqcHNrYiktPm1hcms7CiAJc2FkZHIgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyOwogCWRhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcjsKIAl0b3MgPSAoKnBza2IpLT5uaC5pcGgtPnRvczsKQEAgLTE1Myw5ICsxNTMsNyBAQAogCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOICYmIHJldCAhPSBORl9RVUVVRQogCSAgICAmJiAoKCpwc2tiKS0+bmguaXBoLT5zYWRkciAhPSBzYWRkcgogCQl8fCAoKnBza2IpLT5uaC5pcGgtPmRhZGRyICE9IGRhZGRyCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQl8fCAoKnBza2IpLT5uZm1hcmsgIT0gbmZtYXJrCi0jZW5kaWYKKwkJfHwgKCpwc2tiKS0+bWFyayAhPSBtYXJrCiAJCXx8ICgqcHNrYiktPm5oLmlwaC0+dG9zICE9IHRvcykpCiAJCWlmIChpcF9yb3V0ZV9tZV9oYXJkZXIocHNrYiwgUlROX1VOU1BFQykpCiAJCQlyZXQgPSBORl9EUk9QOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKaW5kZXggMGFmODAzZC4uNDcxYjYzOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0Lmg+CkBAIC0zOCwxMiArMzgsMTAgQEAKICNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKICNlbmRpZgogCi1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm50cmFja19zdGF0LCBuZl9jb25udHJhY2tfc3RhdCk7Ci0KIHN0YXRpYyBpbnQgaXB2NF9wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ob2ZmLAogCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKLQl1X2ludDMyX3QgX2FkZHJzWzJdLCAqYXA7CisJX19iZTMyIF9hZGRyc1syXSwgKmFwOwogCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXBoZHIsIHNhZGRyKSwKIAkJCQlzaXplb2YodV9pbnQzMl90KSAqIDIsIF9hZGRycyk7CiAJaWYgKGFwID09IE5VTEwpCkBAIC0xMTMsMTAgKzExMSwxMiBAQAogCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKLWludCBuYXRfbW9kdWxlX2lzX2xvYWRlZCA9IDA7CitpbnQgbmZfbmF0X21vZHVsZV9pc19sb2FkZWQgPSAwOworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X21vZHVsZV9pc19sb2FkZWQpOworCiBzdGF0aWMgdV9pbnQzMl90IGlwdjRfZ2V0X2ZlYXR1cmVzKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewotCWlmIChuYXRfbW9kdWxlX2lzX2xvYWRlZCkKKwlpZiAobmZfbmF0X21vZHVsZV9pc19sb2FkZWQpCiAJCXJldHVybiBORl9DVF9GX05BVDsKIAogCXJldHVybiBORl9DVF9GX0JBU0lDOwpAQCAtMjY4LDQzICsyNjgsNTkgQEAKIAl9LAogfTsKIAotI2lmZGVmIENPTkZJR19TWVNDVEwKLS8qIEZyb20gbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9pY21wX3RpbWVvdXQ7Ci1zdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mX2N0X2lwdjRfc3lzY3RsX2hlYWRlcjsKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKK3N0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWluID0gMDsKK3N0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWF4ID0gMjU1OwogCi1zdGF0aWMgY3RsX3RhYmxlIG5mX2N0X3N5c2N0bF90YWJsZVtdID0geworc3RhdGljIGN0bF90YWJsZSBpcF9jdF9zeXNjdGxfdGFibGVbXSA9IHsKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfSUNNUF9USU1FT1VULAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX2ljbXBfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZuZl9jdF9pY21wX3RpbWVvdXQsCisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19NQVgsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfbWF4IiwKKwkJLmRhdGEJCT0gJm5mX2Nvbm50cmFja19tYXgsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0NPVU5ULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2NvdW50IiwKKwkJLmRhdGEJCT0gJm5mX2Nvbm50cmFja19jb3VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfQlVDS0VUUywKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19idWNrZXRzIiwKKwkJLmRhdGEJCT0gJm5mX2Nvbm50cmFja19odGFibGVfc2l6ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfQ0hFQ0tTVU0sCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfY2hlY2tzdW0iLAorCQkuZGF0YQkJPSAmbmZfY29ubnRyYWNrX2NoZWNrc3VtLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19MT0dfSU5WQUxJRCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19sb2dfaW52YWxpZCIsCisJCS5kYXRhCQk9ICZuZl9jdF9sb2dfaW52YWxpZCwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZsb2dfaW52YWxpZF9wcm90b19taW4sCisJCS5leHRyYTIJCT0gJmxvZ19pbnZhbGlkX3Byb3RvX21heCwKIAl9LAotICAgICAgICB7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotc3RhdGljIGN0bF90YWJsZSBuZl9jdF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKIAl7Ci0JCS5jdGxfbmFtZSAgICAgICA9IE5FVF9ORVRGSUxURVIsCi0JCS5wcm9jbmFtZSAgICAgICA9ICJuZXRmaWx0ZXIiLAotCQkubW9kZSAgICAgICAgICAgPSAwNTU1LAotCQkuY2hpbGQgICAgICAgICAgPSBuZl9jdF9zeXNjdGxfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQorCQkuY3RsX25hbWUJPSAwCisJfQogfTsKLQotc3RhdGljIGN0bF90YWJsZSBuZl9jdF9uZXRfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZSAgICAgICA9IENUTF9ORVQsCi0JCS5wcm9jbmFtZSAgICAgICA9ICJuZXQiLAotCQkubW9kZSAgICAgICAgICAgPSAwNTU1LAotCQkuY2hpbGQgICAgICAgICAgPSBuZl9jdF9uZXRmaWx0ZXJfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgJiYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogCiAvKiBGYXN0IGZ1bmN0aW9uIGZvciB0aG9zZSB3aG8gZG9uJ3Qgd2FudCB0byBwYXJzZSAvcHJvYyAoYW5kIEkgZG9uJ3QKICAgIGJsYW1lIHRoZW0pLiAqLwpAQCAtMzk2LDEwICs0MTIsOCBAQAogCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9JUF9NQVgsIGN0YV9taW5faXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXQtPnNyYy51My5pcCA9Ci0JCSoodV9pbnQzMl90ICopTkZBX0RBVEEodGJbQ1RBX0lQX1Y0X1NSQy0xXSk7Ci0JdC0+ZHN0LnUzLmlwID0KLQkJKih1X2ludDMyX3QgKilORkFfREFUQSh0YltDVEFfSVBfVjRfRFNULTFdKTsKKwl0LT5zcmMudTMuaXAgPSAqKF9fYmUzMiAqKU5GQV9EQVRBKHRiW0NUQV9JUF9WNF9TUkMtMV0pOworCXQtPmRzdC51My5pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX0lQX1Y0X0RTVC0xXSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyNiwxNCArNDQwLDE1IEBACiAJLnR1cGxlX3RvX25mYXR0ciA9IGlwdjRfdHVwbGVfdG9fbmZhdHRyLAogCS5uZmF0dHJfdG9fdHVwbGUgPSBpcHY0X25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQorCS5jdGxfdGFibGVfcGF0aCAgPSBuZl9uZXRfaXB2NF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgsCisJLmN0bF90YWJsZQkgPSBpcF9jdF9zeXNjdGxfdGFibGUsCisjZW5kaWYKIAkubWUJCSA9IFRISVNfTU9EVUxFLAogfTsKIAotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDQ7Ci1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNDsKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF9pY21wOwotCiBNT0RVTEVfQUxJQVMoIm5mX2Nvbm50cmFjay0iIF9fc3RyaW5naWZ5KEFGX0lORVQpKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgX19pbml0IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfaW5pdCh2b2lkKQpAQCAtNDQ4LDE5ICs0NjMsMTkgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBuZl9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A0KTsKKwlyZXQgPSBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKCJuZl9jb25udHJhY2tfaXB2NDogY2FuJ3QgcmVnaXN0ZXIgdGNwLlxuIik7CiAJCWdvdG8gY2xlYW51cF9zb2Nrb3B0OwogCX0KIAotCXJldCA9IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3VkcDQpOworCXJldCA9IG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b191ZHA0KTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoIm5mX2Nvbm50cmFja19pcHY0OiBjYW4ndCByZWdpc3RlciB1ZHAuXG4iKTsKIAkJZ290byBjbGVhbnVwX3RjcDsKIAl9CiAKLQlyZXQgPSBuZl9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF9pY21wKTsKKwlyZXQgPSBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9faWNtcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKCJuZl9jb25udHJhY2tfaXB2NDogY2FuJ3QgcmVnaXN0ZXIgaWNtcC5cbiIpOwogCQlnb3RvIGNsZWFudXBfdWRwOwpAQCAtNDc4LDI4ICs0OTMsMjQgQEAKIAkJcHJpbnRrKCJuZl9jb25udHJhY2tfaXB2NDogY2FuJ3QgcmVnaXN0ZXIgaG9va3MuXG4iKTsKIAkJZ290byBjbGVhbnVwX2lwdjQ7CiAJfQotI2lmZGVmIENPTkZJR19TWVNDVEwKLQluZl9jdF9pcHY0X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3RfbmV0X3RhYmxlLCAwKTsKLQlpZiAobmZfY3RfaXB2NF9zeXNjdGxfaGVhZGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKCJuZl9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKKwlyZXQgPSBuZl9jb25udHJhY2tfaXB2NF9jb21wYXRfaW5pdCgpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIGNsZWFudXBfaG9va3M7Ci0JfQogI2VuZGlmCiAJcmV0dXJuIHJldDsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQpCiAgY2xlYW51cF9ob29rczoKLQluZl91bnJlZ2lzdGVyX2hvb2tzKGlwdjRfY29ubnRyYWNrX29wcywgQVJSQVlfU0laRShpcHY0X2Nvbm50cmFja19vcHMpKTsKKyAJbmZfdW5yZWdpc3Rlcl9ob29rcyhpcHY0X2Nvbm50cmFja19vcHMsIEFSUkFZX1NJWkUoaXB2NF9jb25udHJhY2tfb3BzKSk7CiAjZW5kaWYKICBjbGVhbnVwX2lwdjQ6CiAJbmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NCk7CiAgY2xlYW51cF9pY21wOgotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcCk7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9faWNtcCk7CiAgY2xlYW51cF91ZHA6Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA0KTsKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b191ZHA0KTsKICBjbGVhbnVwX3RjcDoKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDQpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3RjcDQpOwogIGNsZWFudXBfc29ja29wdDoKIAluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJnNvX2dldG9yaWdkc3QpOwogCXJldHVybiByZXQ7CkBAIC01MDgsMTggKzUxOSwxNiBAQAogc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfZmluaSh2b2lkKQogewogCXN5bmNocm9uaXplX25ldCgpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLSAJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3RfaXB2NF9zeXNjdGxfaGVhZGVyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQpCisJbmZfY29ubnRyYWNrX2lwdjRfY29tcGF0X2ZpbmkoKTsKICNlbmRpZgogCW5mX3VucmVnaXN0ZXJfaG9va3MoaXB2NF9jb25udHJhY2tfb3BzLCBBUlJBWV9TSVpFKGlwdjRfY29ubnRyYWNrX29wcykpOwogCW5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQpOwotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcCk7Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA0KTsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDQpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXApOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3VkcDQpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3RjcDQpOwogCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmc29fZ2V0b3JpZ2RzdCk7CiB9CiAKIG1vZHVsZV9pbml0KG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfaW5pdCk7CiBtb2R1bGVfZXhpdChuZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2ZpbmkpOwotCi1FWFBPUlRfU1lNQk9MKG5mX2N0X2lwdjRfZ2F0aGVyX2ZyYWdzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzMWJjNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCkBAIC0wLDAgKzEsNDEyIEBACisvKiBpcF9jb25udHJhY2sgcHJvYyBjb21wYXQgLSBiYXNlZCBvbiBpcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCisgKgorICogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORl9DVF9BQ0NUCitzdGF0aWMgdW5zaWduZWQgaW50CitzZXFfcHJpbnRfY291bnRlcnMoc3RydWN0IHNlcV9maWxlICpzLAorCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJcmV0dXJuIHNlcV9wcmludGYocywgInBhY2tldHM9JWxsdSBieXRlcz0lbGx1ICIsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpY291bnRlci0+cGFja2V0cywKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudGVyLT5ieXRlcyk7Cit9CisjZWxzZQorI2RlZmluZSBzZXFfcHJpbnRfY291bnRlcnMoeCwgeSkJMAorI2VuZGlmCisKK3N0cnVjdCBjdF9pdGVyX3N0YXRlIHsKKwl1bnNpZ25lZCBpbnQgYnVja2V0OworfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmN0X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CisKKwlmb3IgKHN0LT5idWNrZXQgPSAwOworCSAgICAgc3QtPmJ1Y2tldCA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKKwkgICAgIHN0LT5idWNrZXQrKykgeworCQlpZiAoIWxpc3RfZW1wdHkoJm5mX2Nvbm50cmFja19oYXNoW3N0LT5idWNrZXRdKSkKKwkJCXJldHVybiBuZl9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XS5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmN0X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKKworCWhlYWQgPSBoZWFkLT5uZXh0OworCXdoaWxlIChoZWFkID09ICZuZl9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XSkgeworCQlpZiAoKytzdC0+YnVja2V0ID49IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSkKKwkJCXJldHVybiBOVUxMOworCQloZWFkID0gbmZfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0ubmV4dDsKKwl9CisJcmV0dXJuIGhlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpjdF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSBjdF9nZXRfZmlyc3Qoc2VxKTsKKworCWlmIChoZWFkKQorCQl3aGlsZSAocG9zICYmIChoZWFkID0gY3RfZ2V0X25leHQoc2VxLCBoZWFkKSkpCisJCQlwb3MtLTsKKwlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Cit9CisKK3N0YXRpYyB2b2lkICpjdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCXJldHVybiBjdF9nZXRfaWR4KHNlcSwgKnBvcyk7Cit9CisKK3N0YXRpYyB2b2lkICpjdF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSgqcG9zKSsrOworCXJldHVybiBjdF9nZXRfbmV4dChzLCB2KTsKK30KKworc3RhdGljIHZvaWQgY3Rfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaGFzaCA9IHY7CisJY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoYXNoKTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOworCisJTkZfQ1RfQVNTRVJUKGN0KTsKKworCS8qIHdlIG9ubHkgd2FudCB0byBwcmludCBESVJfT1JJR0lOQUwgKi8KKwlpZiAoTkZfQ1RfRElSRUNUSU9OKGhhc2gpKQorCQlyZXR1cm4gMDsKKwlpZiAoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gMDsKKworCWwzcHJvdG8gPSBfX25mX2N0X2wzcHJvdG9fZmluZChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KKwkJCQkgICAgICAgLnR1cGxlLnNyYy5sM251bSk7CisJTkZfQ1RfQVNTRVJUKGwzcHJvdG8pOworCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KKwkJCQkgICAgICAgLnR1cGxlLnNyYy5sM251bSwKKwkJCQkgICAgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCisJCQkJICAgICAgIC50dXBsZS5kc3QucHJvdG9udW0pOworCU5GX0NUX0FTU0VSVChsNHByb3RvKTsKKworCWlmIChzZXFfcHJpbnRmKHMsICIlLThzICV1ICVsZCAiLAorCQkgICAgICBsNHByb3RvLT5uYW1lLAorCQkgICAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtLAorCQkgICAgICB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkKKwkJICAgICAgPyAobG9uZykoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCkgIT0gMCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAobDNwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGN0KSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAobDRwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGN0KSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAocHJpbnRfdHVwbGUocywgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwKKwkJCWwzcHJvdG8sIGw0cHJvdG8pKQorCQlyZXR1cm4gLUVOT1NQQzsKKworIAlpZiAoc2VxX3ByaW50X2NvdW50ZXJzKHMsICZjdC0+Y291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXSkpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKCEodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY3QtPnN0YXR1cykpKQorCQlpZiAoc2VxX3ByaW50ZihzLCAiW1VOUkVQTElFRF0gIikpCisJCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChwcmludF90dXBsZShzLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAorCQkJbDNwcm90bywgbDRwcm90bykpCisJCXJldHVybiAtRU5PU1BDOworCisgCWlmIChzZXFfcHJpbnRfY291bnRlcnMocywgJmN0LT5jb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAodGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmY3QtPnN0YXR1cykpCisJCWlmIChzZXFfcHJpbnRmKHMsICJbQVNTVVJFRF0gIikpCisJCQlyZXR1cm4gLUVOT1NQQzsKKworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTUFSSworCWlmIChzZXFfcHJpbnRmKHMsICJtYXJrPSV1ICIsIGN0LT5tYXJrKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSworCWlmIChzZXFfcHJpbnRmKHMsICJzZWNtYXJrPSV1ICIsIGN0LT5zZWNtYXJrKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisjZW5kaWYKKworCWlmIChzZXFfcHJpbnRmKHMsICJ1c2U9JXVcbiIsIGF0b21pY19yZWFkKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9zZXFfb3BzID0geworCS5zdGFydCA9IGN0X3NlcV9zdGFydCwKKwkubmV4dCAgPSBjdF9zZXFfbmV4dCwKKwkuc3RvcCAgPSBjdF9zZXFfc3RvcCwKKwkuc2hvdyAgPSBjdF9zZXFfc2hvdworfTsKKworc3RhdGljIGludCBjdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdDsKKwlpbnQgcmV0OworCisJc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmY3Rfc2VxX29wcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKwlzZXEgICAgICAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gc3Q7CisJbWVtc2V0KHN0LCAwLCBzaXplb2Yoc3RydWN0IGN0X2l0ZXJfc3RhdGUpKTsKKwlyZXR1cm4gcmV0Oworb3V0X2ZyZWU6CisJa2ZyZWUoc3QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN0X2ZpbGVfb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBjdF9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworLyogZXhwZWN0cyAqLworc3RhdGljIHZvaWQgKmV4cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplID0gJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdDsKKwlsb2ZmX3QgaTsKKworCS8qIHN0cmFuZ2Ugc2VxX2ZpbGUgYXBpIGNhbGxzIHN0b3AgZXZlbiBpZiB3ZSBmYWlsLAorCSAqIHRodXMgd2UgbmVlZCB0byBncmFiIGxvY2sgc2luY2Ugc3RvcCB1bmxvY2tzICovCisJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwlpZiAobGlzdF9lbXB0eShlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDw9ICpwb3M7IGkrKykgeworCQllID0gZS0+bmV4dDsKKwkJaWYgKGUgPT0gJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgKmV4cF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworIAlzdHJ1Y3QgbGlzdF9oZWFkICplID0gdjsKKworCSsrKnBvczsKKwllID0gZS0+bmV4dDsKKworCWlmIChlID09ICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyB2b2lkIGV4cF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKK30KKworc3RhdGljIGludCBleHBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAgPSB2OworCisJaWYgKGV4cC0+dHVwbGUuc3JjLmwzbnVtICE9IEFGX0lORVQpCisJCXJldHVybiAwOworCisJaWYgKGV4cC0+dGltZW91dC5mdW5jdGlvbikKKwkJc2VxX3ByaW50ZihzLCAiJWxkICIsIHRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkKKwkJCSAgID8gKGxvbmcpKGV4cC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwKTsKKwllbHNlCisJCXNlcV9wcmludGYocywgIi0gIik7CisKKwlzZXFfcHJpbnRmKHMsICJwcm90bz0ldSAiLCBleHAtPnR1cGxlLmRzdC5wcm90b251bSk7CisKKwlwcmludF90dXBsZShzLCAmZXhwLT50dXBsZSwKKwkJICAgIF9fbmZfY3RfbDNwcm90b19maW5kKGV4cC0+dHVwbGUuc3JjLmwzbnVtKSwKKwkJICAgIF9fbmZfY3RfbDRwcm90b19maW5kKGV4cC0+dHVwbGUuc3JjLmwzbnVtLAorCQkgICAgCQkJIGV4cC0+dHVwbGUuZHN0LnByb3RvbnVtKSk7CisJcmV0dXJuIHNlcV9wdXRjKHMsICdcbicpOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGV4cF9zZXFfb3BzID0geworCS5zdGFydCA9IGV4cF9zZXFfc3RhcnQsCisJLm5leHQgPSBleHBfc2VxX25leHQsCisJLnN0b3AgPSBleHBfc2VxX3N0b3AsCisJLnNob3cgPSBleHBfc2VxX3Nob3cKK307CisKK3N0YXRpYyBpbnQgZXhwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZleHBfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwX2V4cF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZXhwX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCit9OworCitzdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJaW50IGNwdTsKKworCWlmICgqcG9zID09IDApCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisKKwlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKKwkJCWNvbnRpbnVlOworCQkqcG9zID0gY3B1KzE7CisJCXJldHVybiAmcGVyX2NwdShuZl9jb25udHJhY2tfc3RhdCwgY3B1KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmN0X2NwdV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJaW50IGNwdTsKKworCWZvciAoY3B1ID0gKnBvczsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKKwkJCWNvbnRpbnVlOworCQkqcG9zID0gY3B1KzE7CisJCXJldHVybiAmcGVyX2NwdShuZl9jb25udHJhY2tfc3RhdCwgY3B1KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY3RfY3B1X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworfQorCitzdGF0aWMgaW50IGN0X2NwdV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwl1bnNpZ25lZCBpbnQgbnJfY29ubnRyYWNrcyA9IGF0b21pY19yZWFkKCZuZl9jb25udHJhY2tfY291bnQpOworCXN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCAqc3QgPSB2OworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wcmludGYoc2VxLCAiZW50cmllcyAgc2VhcmNoZWQgZm91bmQgbmV3IGludmFsaWQgaWdub3JlIGRlbGV0ZSBkZWxldGVfbGlzdCBpbnNlcnQgaW5zZXJ0X2ZhaWxlZCBkcm9wIGVhcmx5X2Ryb3AgaWNtcF9lcnJvciAgZXhwZWN0X25ldyBleHBlY3RfY3JlYXRlIGV4cGVjdF9kZWxldGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUwOHggICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggIgorCQkJIiUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAgJTA4eCAlMDh4ICUwOHggXG4iLAorCQkgICBucl9jb25udHJhY2tzLAorCQkgICBzdC0+c2VhcmNoZWQsCisJCSAgIHN0LT5mb3VuZCwKKwkJICAgc3QtPm5ldywKKwkJICAgc3QtPmludmFsaWQsCisJCSAgIHN0LT5pZ25vcmUsCisJCSAgIHN0LT5kZWxldGUsCisJCSAgIHN0LT5kZWxldGVfbGlzdCwKKwkJICAgc3QtPmluc2VydCwKKwkJICAgc3QtPmluc2VydF9mYWlsZWQsCisJCSAgIHN0LT5kcm9wLAorCQkgICBzdC0+ZWFybHlfZHJvcCwKKwkJICAgc3QtPmVycm9yLAorCisJCSAgIHN0LT5leHBlY3RfbmV3LAorCQkgICBzdC0+ZXhwZWN0X2NyZWF0ZSwKKwkJICAgc3QtPmV4cGVjdF9kZWxldGUKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gY3RfY3B1X3NlcV9zdGFydCwKKwkubmV4dCAgID0gY3RfY3B1X3NlcV9uZXh0LAorCS5zdG9wICAgPSBjdF9jcHVfc2VxX3N0b3AsCisJLnNob3cgICA9IGN0X2NwdV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgY3RfY3B1X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3RfY3B1X3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGN0X2NwdV9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKK2ludCBfX2luaXQgbmZfY29ubnRyYWNrX2lwdjRfY29tcGF0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MsICpwcm9jX2V4cCwgKnByb2Nfc3RhdDsKKworCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZSgiaXBfY29ubnRyYWNrIiwgMDQ0MCwgJmN0X2ZpbGVfb3BzKTsKKwlpZiAoIXByb2MpCisJCWdvdG8gZXJyMTsKKworCXByb2NfZXhwID0gcHJvY19uZXRfZm9wc19jcmVhdGUoImlwX2Nvbm50cmFja19leHBlY3QiLCAwNDQwLAorCQkJCQkmaXBfZXhwX2ZpbGVfb3BzKTsKKwlpZiAoIXByb2NfZXhwKQorCQlnb3RvIGVycjI7CisKKwlwcm9jX3N0YXQgPSBjcmVhdGVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrIiwgU19JUlVHTywgcHJvY19uZXRfc3RhdCk7CisJaWYgKCFwcm9jX3N0YXQpCisJCWdvdG8gZXJyMzsKKworCXByb2Nfc3RhdC0+cHJvY19mb3BzID0gJmN0X2NwdV9zZXFfZm9wczsKKwlwcm9jX3N0YXQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlyZXR1cm4gMDsKKworZXJyMzoKKwlwcm9jX25ldF9yZW1vdmUoImlwX2Nvbm50cmFja19leHBlY3QiKTsKK2VycjI6CisJcHJvY19uZXRfcmVtb3ZlKCJpcF9jb25udHJhY2siKTsKK2VycjE6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgX19leGl0IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9maW5pKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIHByb2NfbmV0X3N0YXQpOworCXByb2NfbmV0X3JlbW92ZSgiaXBfY29ubnRyYWNrX2V4cGVjdCIpOworCXByb2NfbmV0X3JlbW92ZSgiaXBfY29ubnRyYWNrIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IDc5MGYwMGQuLmRiOWU3YzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0yMiwxMCArMjIsMTAgQEAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogCi11bnNpZ25lZCBsb25nIG5mX2N0X2ljbXBfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzAqSFo7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZl9jdF9pY21wX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwKkhaOwogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJc3RydWN0IGljbXBoZHIgaWNtcDsKIAkJc3RydWN0IGlwaGRyIGlwOwogCX0gX2luLCAqaW5zaWRlOwotCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKmlubmVycHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICppbm5lcnByb3RvOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlpbnQgZGF0YW9mZjsKIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJCXJldHVybiAtTkZfQUNDRVBUOwogCX0KIAotCWlubmVycHJvdG8gPSBfX25mX2N0X3Byb3RvX2ZpbmQoUEZfSU5FVCwgaW5zaWRlLT5pcC5wcm90b2NvbCk7CisJaW5uZXJwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKFBGX0lORVQsIGluc2lkZS0+aXAucHJvdG9jb2wpOwogCWRhdGFvZmYgPSBza2ItPm5oLmlwaC0+aWhsKjQgKyBzaXplb2YoaW5zaWRlLT5pY21wKTsKIAkvKiBBcmUgdGhleSB0YWxraW5nIGFib3V0IG9uZSBvZiBvdXIgY29ubmVjdGlvbnM/ICovCiAJaWYgKCFuZl9jdF9nZXRfdHVwbGUoc2tiLCBkYXRhb2ZmLCBkYXRhb2ZmICsgaW5zaWRlLT5pcC5paGwqNCwgUEZfSU5FVCwKQEAgLTMxMSw3ICszMTEsNyBAQAogCXR1cGxlLT5kc3QudS5pY21wLmNvZGUgPQogCQkJKih1X2ludDhfdCAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19JQ01QX0NPREUtMV0pOwogCXR1cGxlLT5zcmMudS5pY21wLmlkID0KLQkJCSoodV9pbnQxNl90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0lDTVBfSUQtMV0pOworCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9fSUNNUF9JRC0xXSk7CiAKIAlpZiAodHVwbGUtPmRzdC51LmljbXAudHlwZSA+PSBzaXplb2YoaW52bWFwKQogCSAgICB8fCAhaW52bWFwW3R1cGxlLT5kc3QudS5pY21wLnR5cGVdKQpAQCAtMzIxLDExICszMjEsNDIgQEAKIH0KICNlbmRpZgogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF9pY21wID0KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmljbXBfc3lzY3RsX2hlYWRlcjsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGljbXBfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX0lDTVBfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19pY21wX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfaWNtcF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZSA9IDAKKwl9Cit9OworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGljbXBfY29tcGF0X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0lDTVBfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19pY21wX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfaWNtcF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZSA9IDAKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKK3N0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19pY21wID0KIHsKLQkubGlzdAkJCT0geyBOVUxMLCBOVUxMIH0sCiAJLmwzcHJvdG8JCT0gUEZfSU5FVCwKLQkucHJvdG8JCQk9IElQUFJPVE9fSUNNUCwKKwkubDRwcm90bwkJPSBJUFBST1RPX0lDTVAsCiAJLm5hbWUJCQk9ICJpY21wIiwKIAkucGt0X3RvX3R1cGxlCQk9IGljbXBfcGt0X3RvX3R1cGxlLAogCS5pbnZlcnRfdHVwbGUJCT0gaWNtcF9pbnZlcnRfdHVwbGUsCkBAIC0zNDEsNiArMzcyLDEyIEBACiAJLnR1cGxlX3RvX25mYXR0cgk9IGljbXBfdHVwbGVfdG9fbmZhdHRyLAogCS5uZmF0dHJfdG9fdHVwbGUJPSBpY21wX25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZpY21wX3N5c2N0bF9oZWFkZXIsCisJLmN0bF90YWJsZQkJPSBpY21wX3N5c2N0bF90YWJsZSwKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCisJLmN0bF9jb21wYXRfdGFibGUJPSBpY21wX2NvbXBhdF9zeXNjdGxfdGFibGUsCisjZW5kaWYKKyNlbmRpZgogfTsKLQotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcCk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b19pY21wKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfYW1hbmRhLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2FtYW5kYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTcwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2FtYW5kYS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIEFtYW5kYSBleHRlbnNpb24gZm9yIFRDUCBOQVQgYWx0ZXJhdGlvbi4KKyAqIChDKSAyMDAyIGJ5IEJyaWFuIEouIE11cnJlbGwgPG5ldGZpbHRlckBpbnRlcmxpbnguYmMuY2E+CisgKiBiYXNlZCBvbiBhIGNvcHkgb2YgSFcncyBpcF9uYXRfaXJjLmMgYXMgd2VsbCBhcyBvdGhlciBtb2R1bGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hbWFuZGEuaD4KKworTU9EVUxFX0FVVEhPUigiQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW1hbmRhIE5BVCBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXBfbmF0X2FtYW5kYSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwljaGFyIGJ1ZmZlcltzaXplb2YoIjY1NTM1IildOworCXVfaW50MTZfdCBwb3J0OworCXVuc2lnbmVkIGludCByZXQ7CisKKwkvKiBDb25uZWN0aW9uIGNvbWVzIGZyb20gY2xpZW50LiAqLworCWV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQgPSBleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0OworCWV4cC0+ZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOworCisJLyogV2hlbiB5b3Ugc2VlIHRoZSBwYWNrZXQsIHdlIG5lZWQgdG8gTkFUIGl0IHRoZSBzYW1lIGFzIHRoZQorCSAqIHRoaXMgb25lIChpZS4gc2FtZSBJUDogaXQgd2lsbCBiZSBUQ1AgYW5kIG1hc3RlciBpcyBVRFApLiAqLworCWV4cC0+ZXhwZWN0Zm4gPSBuZl9uYXRfZm9sbG93X21hc3RlcjsKKworCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCisJZm9yIChwb3J0ID0gbnRvaHMoZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCk7IHBvcnQgIT0gMDsgcG9ydCsrKSB7CisJCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAocG9ydCA9PSAwKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCXNwcmludGYoYnVmZmVyLCAiJXUiLCBwb3J0KTsKKwlyZXQgPSBuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgZXhwLT5tYXN0ZXIsIGN0aW5mbywKKwkJCQkgICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLAorCQkJCSAgICAgICBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKwlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKKwkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X2FtYW5kYV9maW5pKHZvaWQpCit7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9hbWFuZGFfaG9vaywgTlVMTCk7CisJc3luY2hyb25pemVfcmN1KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX25hdF9hbWFuZGFfaW5pdCh2b2lkKQoreworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmZfbmF0X2FtYW5kYV9ob29rKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9hbWFuZGFfaG9vaywgaGVscCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG5mX25hdF9hbWFuZGFfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9uYXRfYW1hbmRhX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE5MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qIE5BVCBmb3IgbmV0ZmlsdGVyOyBzaGFyZWQgd2l0aCBjb21wYXRpYmlsaXR5IGxheWVyLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4gIC8qIEZvciB0Y3BfcHJvdCBpbiBnZXRvcmlnZHN0ICovCisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhuZl9uYXRfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8gPSBOVUxMOworCisvKiBDYWxjdWxhdGVkIGF0IGluaXQgYmFzZWQgb24gbWVtb3J5IHNpemUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfbmF0X2h0YWJsZV9zaXplOworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqYnlzb3VyY2U7CisKKyNkZWZpbmUgTUFYX0lQX05BVF9QUk9UTyAyNTYKK3N0YXRpYyBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpuZl9uYXRfcHJvdG9zW01BWF9JUF9OQVRfUFJPVE9dOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKgorX19uZl9uYXRfcHJvdG9fZmluZCh1X2ludDhfdCBwcm90b251bSkKK3sKKwlyZXR1cm4gbmZfbmF0X3Byb3Rvc1twcm90b251bV07Cit9CisKK3N0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKgorbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KHVfaW50OF90IHByb3RvbnVtKQoreworCXN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnA7CisKKwkvKiB3ZSBuZWVkIHRvIGRpc2FibGUgcHJlZW1wdGlvbiB0byBtYWtlIHN1cmUgJ3AnIGRvZXNuJ3QgZ2V0CisJICogcmVtb3ZlZCB1bnRpbCB3ZSd2ZSBncmFiYmVkIHRoZSByZWZlcmVuY2UgKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlwID0gX19uZl9uYXRfcHJvdG9fZmluZChwcm90b251bSk7CisJaWYgKCF0cnlfbW9kdWxlX2dldChwLT5tZSkpCisJCXAgPSAmbmZfbmF0X3Vua25vd25fcHJvdG9jb2w7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiBwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KTsKKwordm9pZAorbmZfbmF0X3Byb3RvX3B1dChzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpwKQoreworCW1vZHVsZV9wdXQocC0+bWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3Byb3RvX3B1dCk7CisKKy8qIFdlIGtlZXAgYW4gZXh0cmEgaGFzaCBmb3IgZWFjaCBjb25udHJhY2ssIGZvciBmYXN0IHNlYXJjaGluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitoYXNoX2J5X3NyYyhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwkvKiBPcmlnaW5hbCBzcmMsIHRvIGVuc3VyZSB3ZSBtYXAgaXQgY29uc2lzdGVudGx5IGlmIHBvc3MuICovCisJcmV0dXJuIGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy51My5pcCwgdHVwbGUtPnNyYy51LmFsbCwKKwkJCSAgICB0dXBsZS0+ZHN0LnByb3RvbnVtLCAwKSAlIG5mX25hdF9odGFibGVfc2l6ZTsKK30KKworLyogTm9vbmUgdXNpbmcgY29ubnRyYWNrIGJ5IHRoZSB0aW1lIHRoaXMgY2FsbGVkLiAqLworc3RhdGljIHZvaWQgbmZfbmF0X2NsZWFudXBfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25uICpjb25uKQoreworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0OworCWlmICghKGNvbm4tPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKSkKKwkJcmV0dXJuOworCisJbmF0ID0gbmZjdF9uYXQoY29ubik7CisJd3JpdGVfbG9ja19iaCgmbmZfbmF0X2xvY2spOworCWxpc3RfZGVsKCZuYXQtPmluZm8uYnlzb3VyY2UpOworCXdyaXRlX3VubG9ja19iaCgmbmZfbmF0X2xvY2spOworfQorCisvKiBJcyB0aGlzIHR1cGxlIGFscmVhZHkgdGFrZW4/IChub3QgYnkgdXMpICovCitpbnQKK25mX25hdF91c2VkX3R1cGxlKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25uICppZ25vcmVkX2Nvbm50cmFjaykKK3sKKwkvKiBDb25udHJhY2sgdHJhY2tpbmcgZG9lc24ndCBrZWVwIHRyYWNrIG9mIG91dGdvaW5nIHR1cGxlczsgb25seQorCSAgIGluY29taW5nIG9uZXMuICBOQVQgbWVhbnMgdGhleSBkb24ndCBoYXZlIGEgZml4ZWQgbWFwcGluZywKKwkgICBzbyB3ZSBpbnZlcnQgdGhlIHR1cGxlIGFuZCBsb29rIGZvciB0aGUgaW5jb21pbmcgcmVwbHkuCisKKwkgICBXZSBjb3VsZCBrZWVwIGEgc2VwYXJhdGUgaGFzaCBpZiB0aGlzIHByb3ZlcyB0b28gc2xvdy4gKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHJlcGx5OworCisJbmZfY3RfaW52ZXJ0X3R1cGxlcHIoJnJlcGx5LCB0dXBsZSk7CisJcmV0dXJuIG5mX2Nvbm50cmFja190dXBsZV90YWtlbigmcmVwbHksIGlnbm9yZWRfY29ubnRyYWNrKTsKK30KK0VYUE9SVF9TWU1CT0wobmZfbmF0X3VzZWRfdHVwbGUpOworCisvKiBJZiB3ZSBzb3VyY2UgbWFwIHRoaXMgdHVwbGUgc28gcmVwbHkgbG9va3MgbGlrZSByZXBseV90dXBsZSwgd2lsbAorICogdGhhdCBtZWV0IHRoZSBjb25zdHJhaW50cyBvZiByYW5nZS4gKi8KK3N0YXRpYyBpbnQKK2luX3JhbmdlKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCSBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSkKK3sKKwlzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpwcm90bzsKKworCXByb3RvID0gX19uZl9uYXRfcHJvdG9fZmluZCh0dXBsZS0+ZHN0LnByb3RvbnVtKTsKKwkvKiBJZiB3ZSBhcmUgc3VwcG9zZWQgdG8gbWFwIElQcywgdGhlbiB3ZSBtdXN0IGJlIGluIHRoZQorCSAgIHJhbmdlIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGxldCB0aGlzIGRyYWcgdXMgb250byBhIG5ldyBzcmMgSVAuICovCisJaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CisJCWlmIChudG9obCh0dXBsZS0+c3JjLnUzLmlwKSA8IG50b2hsKHJhbmdlLT5taW5faXApIHx8CisJCSAgICBudG9obCh0dXBsZS0+c3JjLnUzLmlwKSA+IG50b2hsKHJhbmdlLT5tYXhfaXApKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkgfHwKKwkgICAgcHJvdG8tPmluX3JhbmdlKHR1cGxlLCBJUF9OQVRfTUFOSVBfU1JDLAorCQkJICAgICZyYW5nZS0+bWluLCAmcmFuZ2UtPm1heCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYW1lX3NyYyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQoreworCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQ7CisKKwl0ID0gJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZTsKKwlyZXR1cm4gKHQtPmRzdC5wcm90b251bSA9PSB0dXBsZS0+ZHN0LnByb3RvbnVtICYmCisJCXQtPnNyYy51My5pcCA9PSB0dXBsZS0+c3JjLnUzLmlwICYmCisJCXQtPnNyYy51LmFsbCA9PSB0dXBsZS0+c3JjLnUuYWxsKTsKK30KKworLyogT25seSBjYWxsZWQgZm9yIFNSQyBtYW5pcCAqLworc3RhdGljIGludAorZmluZF9hcHByb3ByaWF0ZV9zcmMoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqcmVzdWx0LAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQoreworCXVuc2lnbmVkIGludCBoID0gaGFzaF9ieV9zcmModHVwbGUpOworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0OworCXN0cnVjdCBuZl9jb25uICpjdDsKKworCXJlYWRfbG9ja19iaCgmbmZfbmF0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmF0LCAmYnlzb3VyY2VbaF0sIGluZm8uYnlzb3VyY2UpIHsKKwkJY3QgPSAoc3RydWN0IG5mX2Nvbm4gKikoKGNoYXIgKiluYXQgLSBvZmZzZXRvZihzdHJ1Y3QgbmZfY29ubiwgZGF0YSkpOworCQlpZiAoc2FtZV9zcmMoY3QsIHR1cGxlKSkgeworCQkJLyogQ29weSBzb3VyY2UgcGFydCBmcm9tIHJlcGx5IHR1cGxlLiAqLworCQkJbmZfY3RfaW52ZXJ0X3R1cGxlcHIocmVzdWx0LAorCQkJCSAgICAgICAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKKwkJCXJlc3VsdC0+ZHN0ID0gdHVwbGUtPmRzdDsKKworCQkJaWYgKGluX3JhbmdlKHJlc3VsdCwgcmFuZ2UpKSB7CisJCQkJcmVhZF91bmxvY2tfYmgoJm5mX25hdF9sb2NrKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmbmZfbmF0X2xvY2spOworCXJldHVybiAwOworfQorCisvKiBGb3IgW0ZVVFVSRV0gZnJhZ21lbnRhdGlvbiBoYW5kbGluZywgd2Ugd2FudCB0aGUgbGVhc3QtdXNlZAorICAgc3JjLWlwL2RzdC1pcC9wcm90byB0cmlwbGUuICBGYWlybmVzcyBkb2Vzbid0IGNvbWUgaW50byBpdC4gIFRodXMKKyAgIGlmIHRoZSByYW5nZSBzcGVjaWZpZXMgMS4yLjMuNCBwb3J0cyAxMDAwMC0xMDAwNSBhbmQgMS4yLjMuNSBwb3J0cworICAgMS02NTUzNSwgd2UgZG9uJ3QgZG8gcHJvLXJhdGEgYWxsb2NhdGlvbiBiYXNlZCBvbiBwb3J0czsgd2UgY2hvb3NlCisgICB0aGUgaXAgd2l0aCB0aGUgbG93ZXN0IHNyYy1pcC9kc3QtaXAvcHJvdG8gdXNhZ2UuCisqLworc3RhdGljIHZvaWQKK2ZpbmRfYmVzdF9pcHNfcHJvdG8oc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQoreworCV9fYmUzMiAqdmFyX2lwcDsKKwkvKiBIb3N0IG9yZGVyICovCisJdV9pbnQzMl90IG1pbmlwLCBtYXhpcCwgajsKKworCS8qIE5vIElQIG1hcHBpbmc/ICBEbyBub3RoaW5nLiAqLworCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSkKKwkJcmV0dXJuOworCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCQl2YXJfaXBwID0gJnR1cGxlLT5zcmMudTMuaXA7CisJZWxzZQorCQl2YXJfaXBwID0gJnR1cGxlLT5kc3QudTMuaXA7CisKKwkvKiBGYXN0IHBhdGg6IG9ubHkgb25lIGNob2ljZS4gKi8KKwlpZiAocmFuZ2UtPm1pbl9pcCA9PSByYW5nZS0+bWF4X2lwKSB7CisJCSp2YXJfaXBwID0gcmFuZ2UtPm1pbl9pcDsKKwkJcmV0dXJuOworCX0KKworCS8qIEhhc2hpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUHMgZ2l2ZXMgYSBmYWlybHkgZXZlbgorCSAqIHNwcmVhZCBpbiBwcmFjdGljZSAoaWYgdGhlcmUgYXJlIGEgc21hbGwgbnVtYmVyIG9mIElQcworCSAqIGludm9sdmVkLCB0aGVyZSB1c3VhbGx5IGFyZW4ndCB0aGF0IG1hbnkgY29ubmVjdGlvbnMKKwkgKiBhbnl3YXkpLiAgVGhlIGNvbnNpc3RlbmN5IG1lYW5zIHRoYXQgc2VydmVycyBzZWUgdGhlIHNhbWUKKwkgKiBjbGllbnQgY29taW5nIGZyb20gdGhlIHNhbWUgSVAgKHNvbWUgSW50ZXJuZXQgQmFua2luZyBzaXRlcworCSAqIGxpa2UgdGhpcyksIGV2ZW4gYWNyb3NzIHJlYm9vdHMuICovCisJbWluaXAgPSBudG9obChyYW5nZS0+bWluX2lwKTsKKwltYXhpcCA9IG50b2hsKHJhbmdlLT5tYXhfaXApOworCWogPSBqaGFzaF8yd29yZHMoKF9fZm9yY2UgdTMyKXR1cGxlLT5zcmMudTMuaXAsCisJCQkgKF9fZm9yY2UgdTMyKXR1cGxlLT5kc3QudTMuaXAsIDApOworCSp2YXJfaXBwID0gaHRvbmwobWluaXAgKyBqICUgKG1heGlwIC0gbWluaXAgKyAxKSk7Cit9CisKKy8qIE1hbmlwdWxhdGUgdGhlIHR1cGxlIGludG8gdGhlIHJhbmdlIGdpdmVuLiAgRm9yIE5GX0lQX1BPU1RfUk9VVElORywKKyAqIHdlIGNoYW5nZSB0aGUgc291cmNlIHRvIG1hcCBpbnRvIHRoZSByYW5nZS4gIEZvciBORl9JUF9QUkVfUk9VVElORworICogYW5kIE5GX0lQX0xPQ0FMX09VVCwgd2UgY2hhbmdlIHRoZSBkZXN0aW5hdGlvbiB0byBtYXAgaW50byB0aGUKKyAqIHJhbmdlLiAgSXQgbWlnaHQgbm90IGJlIHBvc3NpYmxlIHRvIGdldCBhIHVuaXF1ZSB0dXBsZSwgYnV0IHdlIHRyeS4KKyAqIEF0IHdvcnN0IChvciBpZiB3ZSByYWNlKSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGZpbmFsIGR1cGxpY2F0ZSBpbgorICogX19pcF9jb25udHJhY2tfY29uZmlybSBhbmQgZHJvcCB0aGUgcGFja2V0LiAqLworc3RhdGljIHZvaWQKK2dldF91bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnX3R1cGxlLAorCQkgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKK3sKKwlzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpwcm90bzsKKworCS8qIDEpIElmIHRoaXMgc3JjaXAvcHJvdG8vc3JjLXByb3RvLXBhcnQgaXMgY3VycmVudGx5IG1hcHBlZCwKKwkgICBhbmQgdGhhdCBzYW1lIG1hcHBpbmcgZ2l2ZXMgYSB1bmlxdWUgdHVwbGUgd2l0aGluIHRoZSBnaXZlbgorCSAgIHJhbmdlLCB1c2UgdGhhdC4KKworCSAgIFRoaXMgaXMgb25seSByZXF1aXJlZCBmb3Igc291cmNlIChpZS4gTkFUL21hc3EpIG1hcHBpbmdzLgorCSAgIFNvIGZhciwgd2UgZG9uJ3QgZG8gbG9jYWwgc291cmNlIG1hcHBpbmdzLCBzbyBtdWx0aXBsZQorCSAgIG1hbmlwcyBub3QgYW4gaXNzdWUuICAqLworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgeworCQlpZiAoZmluZF9hcHByb3ByaWF0ZV9zcmMob3JpZ190dXBsZSwgdHVwbGUsIHJhbmdlKSkgeworCQkJREVCVUdQKCJnZXRfdW5pcXVlX3R1cGxlOiBGb3VuZCBjdXJyZW50IHNyYyBtYXBcbiIpOworCQkJaWYgKCFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorCQkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIDIpIFNlbGVjdCB0aGUgbGVhc3QtdXNlZCBJUC9wcm90byBjb21iaW5hdGlvbiBpbiB0aGUgZ2l2ZW4KKwkgICByYW5nZS4gKi8KKwkqdHVwbGUgPSAqb3JpZ190dXBsZTsKKwlmaW5kX2Jlc3RfaXBzX3Byb3RvKHR1cGxlLCByYW5nZSwgY3QsIG1hbmlwdHlwZSk7CisKKwkvKiAzKSBUaGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIG1hbmlwIGlzIG1hZGUgdG8gbWFwIGludG8KKwkgICB0aGUgcmFuZ2UgdG8gbWFrZSBhIHVuaXF1ZSB0dXBsZS4gKi8KKworCXByb3RvID0gbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KG9yaWdfdHVwbGUtPmRzdC5wcm90b251bSk7CisKKwkvKiBPbmx5IGJvdGhlciBtYXBwaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gcmFuZ2UgYW5kIHVuaXF1ZSAqLworCWlmICgoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSB8fAorCSAgICAgcHJvdG8tPmluX3JhbmdlKHR1cGxlLCBtYW5pcHR5cGUsICZyYW5nZS0+bWluLCAmcmFuZ2UtPm1heCkpICYmCisJICAgICFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKSB7CisJCW5mX25hdF9wcm90b19wdXQocHJvdG8pOworCQlyZXR1cm47CisJfQorCisJLyogTGFzdCBjaGFuZ2U6IGdldCBwcm90b2NvbCB0byB0cnkgdG8gb2J0YWluIHVuaXF1ZSB0dXBsZS4gKi8KKwlwcm90by0+dW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjdCk7CisKKwluZl9uYXRfcHJvdG9fcHV0KHByb3RvKTsKK30KKwordW5zaWduZWQgaW50CituZl9uYXRfc2V0dXBfaW5mbyhzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCSAgdW5zaWduZWQgaW50IGhvb2tudW0pCit7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSBjdXJyX3R1cGxlLCBuZXdfdHVwbGU7CisJc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQgPSBuZmN0X25hdChjdCk7CisJc3RydWN0IG5mX25hdF9pbmZvICppbmZvID0gJm5hdC0+aW5mbzsKKwlpbnQgaGF2ZV90b19oYXNoID0gIShjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOworCWVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlID0gSE9PSzJNQU5JUChob29rbnVtKTsKKworCU5GX0NUX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HIHx8CisJCSAgICAgaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcgfHwKKwkJICAgICBob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOIHx8CisJCSAgICAgaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQpOworCUJVR19PTihuZl9uYXRfaW5pdGlhbGl6ZWQoY3QsIG1hbmlwdHlwZSkpOworCisJLyogV2hhdCB3ZSd2ZSBnb3Qgd2lsbCBsb29rIGxpa2UgaW52ZXJzZSBvZiByZXBseS4gTm9ybWFsbHkKKwkgICB0aGlzIGlzIHdoYXQgaXMgaW4gdGhlIGNvbm50cmFjaywgZXhjZXB0IGZvciBwcmlvcgorCSAgIG1hbmlwdWxhdGlvbnMgKGZ1dHVyZSBvcHRpbWl6YXRpb246IGlmIG51bV9tYW5pcHMgPT0gMCwKKwkgICBvcmlnX3RwID0KKwkgICBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKSAqLworCW5mX2N0X2ludmVydF90dXBsZXByKCZjdXJyX3R1cGxlLAorCQkJICAgICAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKKworCWdldF91bmlxdWVfdHVwbGUoJm5ld190dXBsZSwgJmN1cnJfdHVwbGUsIHJhbmdlLCBjdCwgbWFuaXB0eXBlKTsKKworCWlmICghbmZfY3RfdHVwbGVfZXF1YWwoJm5ld190dXBsZSwgJmN1cnJfdHVwbGUpKSB7CisJCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgcmVwbHk7CisKKwkJLyogQWx0ZXIgY29ubnRyYWNrIHRhYmxlIHNvIHdpbGwgcmVjb2duaXplIHJlcGxpZXMuICovCisJCW5mX2N0X2ludmVydF90dXBsZXByKCZyZXBseSwgJm5ld190dXBsZSk7CisJCW5mX2Nvbm50cmFja19hbHRlcl9yZXBseShjdCwgJnJlcGx5KTsKKworCQkvKiBOb24tYXRvbWljOiB3ZSBvd24gdGhpcyBhdCB0aGUgbW9tZW50LiAqLworCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCQljdC0+c3RhdHVzIHw9IElQU19TUkNfTkFUOworCQllbHNlCisJCQljdC0+c3RhdHVzIHw9IElQU19EU1RfTkFUOworCX0KKworCS8qIFBsYWNlIGluIHNvdXJjZSBoYXNoIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUuICovCisJaWYgKGhhdmVfdG9faGFzaCkgeworCQl1bnNpZ25lZCBpbnQgc3JjaGFzaDsKKworCQlzcmNoYXNoID0gaGFzaF9ieV9zcmMoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSk7CisJCXdyaXRlX2xvY2tfYmgoJm5mX25hdF9sb2NrKTsKKwkJbGlzdF9hZGQoJmluZm8tPmJ5c291cmNlLCAmYnlzb3VyY2Vbc3JjaGFzaF0pOworCQl3cml0ZV91bmxvY2tfYmgoJm5mX25hdF9sb2NrKTsKKwl9CisKKwkvKiBJdCdzIGRvbmUuICovCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKQorCQlzZXRfYml0KElQU19EU1RfTkFUX0RPTkVfQklULCAmY3QtPnN0YXR1cyk7CisJZWxzZQorCQlzZXRfYml0KElQU19TUkNfTkFUX0RPTkVfQklULCAmY3QtPnN0YXR1cyk7CisKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorRVhQT1JUX1NZTUJPTChuZl9uYXRfc2V0dXBfaW5mbyk7CisKKy8qIFJldHVybnMgdHJ1ZSBpZiBzdWNjZWVkZWQuICovCitzdGF0aWMgaW50CittYW5pcF9wa3QodV9pbnQxNl90IHByb3RvLAorCSAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgdW5zaWduZWQgaW50IGlwaGRyb2ZmLAorCSAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdGFyZ2V0LAorCSAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IG5mX25hdF9wcm90b2NvbCAqcDsKKworCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaXBoZHJvZmYgKyBzaXplb2YoKmlwaCkpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmOworCisJLyogTWFuaXB1bGF0ZSBwcm90Y29sIHBhcnQuICovCisJcCA9IG5mX25hdF9wcm90b19maW5kX2dldChwcm90byk7CisJaWYgKCFwLT5tYW5pcF9wa3QocHNrYiwgaXBoZHJvZmYsIHRhcmdldCwgbWFuaXB0eXBlKSkgeworCQluZl9uYXRfcHJvdG9fcHV0KHApOworCQlyZXR1cm4gMDsKKwl9CisJbmZfbmF0X3Byb3RvX3B1dChwKTsKKworCWlwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmOworCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CisJCW5mX2NzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssIGlwaC0+c2FkZHIsIHRhcmdldC0+c3JjLnUzLmlwKTsKKwkJaXBoLT5zYWRkciA9IHRhcmdldC0+c3JjLnUzLmlwOworCX0gZWxzZSB7CisJCW5mX2NzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssIGlwaC0+ZGFkZHIsIHRhcmdldC0+ZHN0LnUzLmlwKTsKKwkJaXBoLT5kYWRkciA9IHRhcmdldC0+ZHN0LnUzLmlwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogRG8gcGFja2V0IG1hbmlwdWxhdGlvbnMgYWNjb3JkaW5nIHRvIG5mX25hdF9zZXR1cF9pbmZvLiAqLwordW5zaWduZWQgaW50IG5mX25hdF9wYWNrZXQoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCSAgIHN0cnVjdCBza19idWZmICoqcHNrYikKK3sKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzYml0OworCWVudW0gbmZfbmF0X21hbmlwX3R5cGUgbXR5cGUgPSBIT09LMk1BTklQKGhvb2tudW0pOworCisJaWYgKG10eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCXN0YXR1c2JpdCA9IElQU19TUkNfTkFUOworCWVsc2UKKwkJc3RhdHVzYml0ID0gSVBTX0RTVF9OQVQ7CisKKwkvKiBJbnZlcnQgaWYgdGhpcyBpcyByZXBseSBkaXIuICovCisJaWYgKGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpCisJCXN0YXR1c2JpdCBePSBJUFNfTkFUX01BU0s7CisKKwkvKiBOb24tYXRvbWljOiB0aGVzZSBiaXRzIGRvbid0IGNoYW5nZS4gKi8KKwlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgeworCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHRhcmdldDsKKworCQkvKiBXZSBhcmUgYWltaW5nIHRvIGxvb2sgbGlrZSBpbnZlcnNlIG9mIG90aGVyIGRpcmVjdGlvbi4gKi8KKwkJbmZfY3RfaW52ZXJ0X3R1cGxlcHIoJnRhcmdldCwgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUpOworCisJCWlmICghbWFuaXBfcGt0KHRhcmdldC5kc3QucHJvdG9udW0sIHBza2IsIDAsICZ0YXJnZXQsIG10eXBlKSkKKwkJCXJldHVybiBORl9EUk9QOworCX0KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3BhY2tldCk7CisKKy8qIERpciBpcyBkaXJlY3Rpb24gSUNNUCBpcyBjb21pbmcgZnJvbSAob3Bwb3NpdGUgdG8gcGFja2V0IGl0IGNvbnRhaW5zKSAqLworaW50IG5mX25hdF9pY21wX3JlcGx5X3RyYW5zbGF0aW9uKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IGljbXBoZHIgaWNtcDsKKwkJc3RydWN0IGlwaGRyIGlwOworCX0gKmluc2lkZTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIGlubmVyLCB0YXJnZXQ7CisJaW50IGhkcmxlbiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzYml0OworCWVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXAgPSBIT09LMk1BTklQKGhvb2tudW0pOworCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBoZHJsZW4gKyBzaXplb2YoKmluc2lkZSkpKQorCQlyZXR1cm4gMDsKKworCWluc2lkZSA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7CisKKwkvKiBXZSdyZSBhY3R1YWxseSBnb2luZyB0byBtYW5nbGUgaXQgYmV5b25kIHRyaXZpYWwgY2hlY2tzdW0KKwkgICBhZGp1c3RtZW50LCBzbyBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY2hlY2tzdW0gaXMgY29ycmVjdC4gKi8KKwlpZiAobmZfaXBfY2hlY2tzdW0oKnBza2IsIGhvb2tudW0sIGhkcmxlbiwgMCkpCisJCXJldHVybiAwOworCisJLyogTXVzdCBiZSBSRUxBVEVEICovCisJTkZfQ1RfQVNTRVJUKCgqcHNrYiktPm5mY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKKwkJICAgICAoKnBza2IpLT5uZmN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZKTsKKworCS8qIFJlZGlyZWN0cyBvbiBub24tbnVsbCBuYXRzIG11c3QgYmUgZHJvcHBlZCwgZWxzZSB0aGV5J2xsCisgICAgICAgICAgIHN0YXJ0IHRhbGtpbmcgdG8gZWFjaCBvdGhlciB3aXRob3V0IG91ciB0cmFuc2xhdGlvbiwgYW5kIGJlCisgICAgICAgICAgIGNvbmZ1c2VkLi4uIC0tUlIgKi8KKwlpZiAoaW5zaWRlLT5pY21wLnR5cGUgPT0gSUNNUF9SRURJUkVDVCkgeworCQkvKiBJZiBOQVQgaXNuJ3QgZmluaXNoZWQsIGFzc3VtZSBpdCBhbmQgZHJvcC4gKi8KKwkJaWYgKChjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spICE9IElQU19OQVRfRE9ORV9NQVNLKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCQlyZXR1cm4gMDsKKwl9CisKKwlERUJVR1AoImljbXBfcmVwbHlfdHJhbnNsYXRpb246IHRyYW5zbGF0aW5nIGVycm9yICVwIG1hbnAgJXUgZGlyICVzXG4iLAorCSAgICAgICAqcHNrYiwgbWFuaXAsIGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwgPyAiT1JJRyIgOiAiUkVQTFkiKTsKKworCWlmICghbmZfY3RfZ2V0X3R1cGxlKCpwc2tiLAorCQkJICAgICAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSwKKwkJCSAgICAgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArCisJICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSArIGluc2lkZS0+aXAuaWhsKjQsCisJICAgICAgICAgICAgICAgICAgICAgKHVfaW50MTZfdClBRl9JTkVULAorCSAgICAgICAgICAgICAgICAgICAgIGluc2lkZS0+aXAucHJvdG9jb2wsCisJICAgICAgICAgICAgICAgICAgICAgJmlubmVyLAorCSAgICAgICAgICAgICAgICAgICAgIGwzcHJvdG8sCisJCQkgICAgIF9fbmZfY3RfbDRwcm90b19maW5kKCh1X2ludDE2X3QpUEZfSU5FVCwKKwkJCSAgICAgCQkJICBpbnNpZGUtPmlwLnByb3RvY29sKSkpCisJCXJldHVybiAwOworCisJLyogQ2hhbmdlIGlubmVyIGJhY2sgdG8gbG9vayBsaWtlIGluY29taW5nIHBhY2tldC4gIFdlIGRvIHRoZQorCSAgIG9wcG9zaXRlIG1hbmlwIG9uIHRoaXMgaG9vayB0byBub3JtYWwsIGJlY2F1c2UgaXQgbWlnaHQgbm90CisJICAgcGFzcyBhbGwgaG9va3MgKGxvY2FsbHktZ2VuZXJhdGVkIElDTVApLiAgQ29uc2lkZXIgaW5jb21pbmcKKwkgICBwYWNrZXQ6IFBSRVJPVVRJTkcgKERTVCBtYW5pcCksIHJvdXRpbmcgcHJvZHVjZXMgSUNNUCwgZ29lcworCSAgIHRocm91Z2ggUE9TVFJPVVRJTkcgKHdoaWNoIG11c3QgY29ycmVjdCB0aGUgRFNUIG1hbmlwKS4gKi8KKwlpZiAoIW1hbmlwX3BrdChpbnNpZGUtPmlwLnByb3RvY29sLCBwc2tiLAorCQkgICAgICAgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihpbnNpZGUtPmljbXApLAorCQkgICAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUsCisJCSAgICAgICAhbWFuaXApKQorCQlyZXR1cm4gMDsKKworCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQkvKiBSZWxvYWRpbmcgImluc2lkZSIgaGVyZSBzaW5jZSBtYW5pcF9wa3QgaW5uZXIuICovCisJCWluc2lkZSA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7CisJCWluc2lkZS0+aWNtcC5jaGVja3N1bSA9IDA7CisJCWluc2lkZS0+aWNtcC5jaGVja3N1bSA9CisJCQljc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKCpwc2tiLCBoZHJsZW4sCisJCQkJCSAgICAgICAoKnBza2IpLT5sZW4gLSBoZHJsZW4sIDApKTsKKwl9CisKKwkvKiBDaGFuZ2Ugb3V0ZXIgdG8gbG9vayB0aGUgcmVwbHkgdG8gYW4gaW5jb21pbmcgcGFja2V0CisJICogKHByb3RvIDAgbWVhbnMgZG9uJ3QgaW52ZXJ0IHBlci1wcm90byBwYXJ0KS4gKi8KKwlpZiAobWFuaXAgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJc3RhdHVzYml0ID0gSVBTX1NSQ19OQVQ7CisJZWxzZQorCQlzdGF0dXNiaXQgPSBJUFNfRFNUX05BVDsKKworCS8qIEludmVydCBpZiB0aGlzIGlzIHJlcGx5IGRpci4gKi8KKwlpZiAoZGlyID09IElQX0NUX0RJUl9SRVBMWSkKKwkJc3RhdHVzYml0IF49IElQU19OQVRfTUFTSzsKKworCWlmIChjdC0+c3RhdHVzICYgc3RhdHVzYml0KSB7CisJCW5mX2N0X2ludmVydF90dXBsZXByKCZ0YXJnZXQsICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlKTsKKwkJaWYgKCFtYW5pcF9wa3QoMCwgcHNrYiwgMCwgJnRhcmdldCwgbWFuaXApKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfaWNtcF9yZXBseV90cmFuc2xhdGlvbik7CisKKy8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KK2ludCBuZl9uYXRfcHJvdG9jb2xfcmVnaXN0ZXIoc3RydWN0IG5mX25hdF9wcm90b2NvbCAqcHJvdG8pCit7CisJaW50IHJldCA9IDA7CisKKwl3cml0ZV9sb2NrX2JoKCZuZl9uYXRfbG9jayk7CisJaWYgKG5mX25hdF9wcm90b3NbcHJvdG8tPnByb3RvbnVtXSAhPSAmbmZfbmF0X3Vua25vd25fcHJvdG9jb2wpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJbmZfbmF0X3Byb3Rvc1twcm90by0+cHJvdG9udW1dID0gcHJvdG87Cisgb3V0OgorCXdyaXRlX3VubG9ja19iaCgmbmZfbmF0X2xvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG5mX25hdF9wcm90b2NvbF9yZWdpc3Rlcik7CisKKy8qIE5vb25lIHN0b3JlcyB0aGUgcHJvdG9jb2wgYW55d2hlcmU7IHNpbXBseSBkZWxldGUgaXQuICovCit2b2lkIG5mX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnByb3RvKQoreworCXdyaXRlX2xvY2tfYmgoJm5mX25hdF9sb2NrKTsKKwluZl9uYXRfcHJvdG9zW3Byb3RvLT5wcm90b251bV0gPSAmbmZfbmF0X3Vua25vd25fcHJvdG9jb2w7CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9uYXRfbG9jayk7CisKKwkvKiBTb21lb25lIGNvdWxkIGJlIHN0aWxsIGxvb2tpbmcgYXQgdGhlIHByb3RvIGluIGEgYmguICovCisJc3luY2hyb25pemVfbmV0KCk7Cit9CitFWFBPUlRfU1lNQk9MKG5mX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQoraW50CituZl9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSkKK3sKKwlORkFfUFVUKHNrYiwgQ1RBX1BST1RPTkFUX1BPUlRfTUlOLCBzaXplb2YoX19iZTE2KSwKKwkJJnJhbmdlLT5taW4udGNwLnBvcnQpOworCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9OQVRfUE9SVF9NQVgsIHNpemVvZihfX2JlMTYpLAorCQkmcmFuZ2UtPm1heC50Y3AucG9ydCk7CisKKwlyZXR1cm4gMDsKKworbmZhdHRyX2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlKTsKKworaW50CituZl9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2Uoc3RydWN0IG5mYXR0ciAqdGJbXSwgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiB3ZSBoYXZlIHRvIHJldHVybiB3aGV0aGVyIHdlIGFjdHVhbGx5IHBhcnNlZCBzb21ldGhpbmcgb3Igbm90ICovCisKKwlpZiAodGJbQ1RBX1BST1RPTkFUX1BPUlRfTUlOLTFdKSB7CisJCXJldCA9IDE7CisJCXJhbmdlLT5taW4udGNwLnBvcnQgPQorCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9OQVRfUE9SVF9NSU4tMV0pOworCX0KKworCWlmICghdGJbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdKSB7CisJCWlmIChyZXQpCisJCQlyYW5nZS0+bWF4LnRjcC5wb3J0ID0gcmFuZ2UtPm1pbi50Y3AucG9ydDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCQlyYW5nZS0+bWF4LnRjcC5wb3J0ID0KKwkJCSooX19iZTE2ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBuZl9uYXRfaW5pdCh2b2lkKQoreworCXNpemVfdCBpOworCisJLyogTGVhdmUgdGhlbSB0aGUgc2FtZSBmb3IgdGhlIG1vbWVudC4gKi8KKwluZl9uYXRfaHRhYmxlX3NpemUgPSBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CisKKwkvKiBPbmUgdm1hbGxvYyBmb3IgYm90aCBoYXNoIHRhYmxlcyAqLworCWJ5c291cmNlID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBuZl9uYXRfaHRhYmxlX3NpemUpOworCWlmICghYnlzb3VyY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU2V3IGluIGJ1aWx0aW4gcHJvdG9jb2xzLiAqLworCXdyaXRlX2xvY2tfYmgoJm5mX25hdF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQX05BVF9QUk9UTzsgaSsrKQorCQluZl9uYXRfcHJvdG9zW2ldID0gJm5mX25hdF91bmtub3duX3Byb3RvY29sOworCW5mX25hdF9wcm90b3NbSVBQUk9UT19UQ1BdID0gJm5mX25hdF9wcm90b2NvbF90Y3A7CisJbmZfbmF0X3Byb3Rvc1tJUFBST1RPX1VEUF0gPSAmbmZfbmF0X3Byb3RvY29sX3VkcDsKKwluZl9uYXRfcHJvdG9zW0lQUFJPVE9fSUNNUF0gPSAmbmZfbmF0X3Byb3RvY29sX2ljbXA7CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9uYXRfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmZfbmF0X2h0YWJsZV9zaXplOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmJ5c291cmNlW2ldKTsKKwl9CisKKwkvKiBGSVhNRTogTWFuLCB0aGlzIGlzIGEgaGFjay4gIDxTSUdIPiAqLworCU5GX0NUX0FTU0VSVChuZl9jb25udHJhY2tfZGVzdHJveWVkID09IE5VTEwpOworCW5mX2Nvbm50cmFja19kZXN0cm95ZWQgPSAmbmZfbmF0X2NsZWFudXBfY29ubnRyYWNrOworCisJLyogSW5pdGlhbGl6ZSBmYWtlIGNvbm50cmFjayBzbyB0aGF0IE5BVCB3aWxsIHNraXAgaXQgKi8KKwluZl9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyB8PSBJUFNfTkFUX0RPTkVfTUFTSzsKKworCWwzcHJvdG8gPSBuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KCh1X2ludDE2X3QpQUZfSU5FVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFyIE5BVCBzZWN0aW9uIG9mIGFsbCBjb25udHJhY2tzLCBpbiBjYXNlIHdlJ3JlIGxvYWRlZCBhZ2Fpbi4gKi8KK3N0YXRpYyBpbnQgY2xlYW5fbmF0KHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoaSk7CisKKwlpZiAoIW5hdCkKKwkJcmV0dXJuIDA7CisJbWVtc2V0KG5hdCwgMCwgc2l6ZW9mKG5hdCkpOworCWktPnN0YXR1cyAmPSB+KElQU19OQVRfTUFTSyB8IElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX1NFUV9BREpVU1QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X2NsZWFudXAodm9pZCkKK3sKKwluZl9jdF9pdGVyYXRlX2NsZWFudXAoJmNsZWFuX25hdCwgTlVMTCk7CisJbmZfY29ubnRyYWNrX2Rlc3Ryb3llZCA9IE5VTEw7CisJdmZyZWUoYnlzb3VyY2UpOworCW5mX2N0X2wzcHJvdG9fcHV0KGwzcHJvdG8pOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KG5mX25hdF9pbml0KTsKK21vZHVsZV9leGl0KG5mX25hdF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2Z0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWI1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2Z0cC5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiBGVFAgZXh0ZW5zaW9uIGZvciBUQ1AgTkFUIGFsdGVyYXRpb24uICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImZ0cCBOQVQgaGVscGVyIik7CitNT0RVTEVfQUxJQVMoImlwX25hdF9mdHAiKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBGSVhNRTogVGltZSBvdXQ/IC0tUlIgKi8KKworc3RhdGljIGludAorbWFuZ2xlX3JmYzk1OV9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgIF9fYmUzMiBuZXdpcCwKKwkJICAgICB1X2ludDE2X3QgcG9ydCwKKwkJICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCSAgICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAorCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICB1MzIgKnNlcSkKK3sKKwljaGFyIGJ1ZmZlcltzaXplb2YoIm5ubixubm4sbm5uLG5ubixubm4sbm5uIildOworCisJc3ByaW50ZihidWZmZXIsICIldSwldSwldSwldSwldSwldSIsCisJCU5JUFFVQUQobmV3aXApLCBwb3J0Pj44LCBwb3J0JjB4RkYpOworCisJREVCVUdQKCJjYWxsaW5nIG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7CisKKwkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47CisJcmV0dXJuIG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwKKwkJCQkJbWF0Y2hsZW4sIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworfQorCisvKiB8MXwxMzIuMjM1LjEuMnw2Mjc1fCAqLworc3RhdGljIGludAorbWFuZ2xlX2VwcnRfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgX19iZTMyIG5ld2lwLAorCQkgICB1X2ludDE2X3QgcG9ydCwKKwkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCSAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgIHUzMiAqc2VxKQoreworCWNoYXIgYnVmZmVyW3NpemVvZigifDF8MjU1LjI1NS4yNTUuMjU1fDY1NTM1fCIpXTsKKworCXNwcmludGYoYnVmZmVyLCAifDF8JXUuJXUuJXUuJXV8JXV8IiwgTklQUVVBRChuZXdpcCksIHBvcnQpOworCisJREVCVUdQKCJjYWxsaW5nIG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7CisKKwkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47CisJcmV0dXJuIG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwKKwkJCQkJbWF0Y2hsZW4sIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworfQorCisvKiB8MXwxMzIuMjM1LjEuMnw2Mjc1fCAqLworc3RhdGljIGludAorbWFuZ2xlX2Vwc3ZfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgX19iZTMyIG5ld2lwLAorCQkgICB1X2ludDE2X3QgcG9ydCwKKwkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCSAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgIHUzMiAqc2VxKQoreworCWNoYXIgYnVmZmVyW3NpemVvZigifHx8NjU1MzV8IildOworCisJc3ByaW50ZihidWZmZXIsICJ8fHwldXwiLCBwb3J0KTsKKworCURFQlVHUCgiY2FsbGluZyBuZl9uYXRfbWFuZ2xlX3RjcF9wYWNrZXRcbiIpOworCisJKnNlcSArPSBzdHJsZW4oYnVmZmVyKSAtIG1hdGNobGVuOworCXJldHVybiBuZl9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywgbWF0Y2hvZmYsCisJCQkJCW1hdGNobGVuLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKK30KKworc3RhdGljIGludCAoKm1hbmdsZVtdKShzdHJ1Y3Qgc2tfYnVmZiAqKiwgX19iZTMyLCB1X2ludDE2X3QsCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgc3RydWN0IG5mX2Nvbm4gKiwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8sIHUzMiAqc2VxKQorPSB7CisJW05GX0NUX0ZUUF9QT1JUXSA9IG1hbmdsZV9yZmM5NTlfcGFja2V0LAorCVtORl9DVF9GVFBfUEFTVl0gPSBtYW5nbGVfcmZjOTU5X3BhY2tldCwKKwlbTkZfQ1RfRlRQX0VQUlRdID0gbWFuZ2xlX2VwcnRfcGFja2V0LAorCVtORl9DVF9GVFBfRVBTVl0gPSBtYW5nbGVfZXBzdl9wYWNrZXQKK307CisKKy8qIFNvLCB0aGlzIHBhY2tldCBoYXMgaGl0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoaW5nIGNvZGUuCisgICBNYW5nbGUgaXQsIGFuZCBjaGFuZ2UgdGhlIGV4cGVjdGF0aW9uIHRvIG1hdGNoIHRoZSBuZXcgdmVyc2lvbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfbmF0X2Z0cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgICAgZW51bSBuZl9jdF9mdHBfdHlwZSB0eXBlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwKKwkJCSAgICAgICB1MzIgKnNlcSkKK3sKKwlfX2JlMzIgbmV3aXA7CisJdV9pbnQxNl90IHBvcnQ7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBleHAtPm1hc3RlcjsKKworCURFQlVHUCgiRlRQX05BVDogdHlwZSAlaSwgb2ZmICV1IGxlbiAldVxuIiwgdHlwZSwgbWF0Y2hvZmYsIG1hdGNobGVuKTsKKworCS8qIENvbm5lY3Rpb24gd2lsbCBjb21lIGZyb20gd2hlcmV2ZXIgdGhpcyBwYWNrZXQgZ29lcywgaGVuY2UgIWRpciAqLworCW5ld2lwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMuaXA7CisJZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7CisJZXhwLT5kaXIgPSAhZGlyOworCisJLyogV2hlbiB5b3Ugc2VlIHRoZSBwYWNrZXQsIHdlIG5lZWQgdG8gTkFUIGl0IHRoZSBzYW1lIGFzIHRoZQorCSAqIHRoaXMgb25lLiAqLworCWV4cC0+ZXhwZWN0Zm4gPSBuZl9uYXRfZm9sbG93X21hc3RlcjsKKworCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCisJZm9yIChwb3J0ID0gbnRvaHMoZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCk7IHBvcnQgIT0gMDsgcG9ydCsrKSB7CisJCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAocG9ydCA9PSAwKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCWlmICghbWFuZ2xlW3R5cGVdKHBza2IsIG5ld2lwLCBwb3J0LCBtYXRjaG9mZiwgbWF0Y2hsZW4sIGN0LCBjdGluZm8sCisJCQkgIHNlcSkpIHsKKwkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZl9uYXRfZnRwX2Zpbmkodm9pZCkKK3sKKwlyY3VfYXNzaWduX3BvaW50ZXIobmZfbmF0X2Z0cF9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbmZfbmF0X2Z0cF9pbml0KHZvaWQpCit7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfZnRwX2hvb2spKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmZfbmF0X2Z0cF9ob29rLCBuZl9uYXRfZnRwKTsKKwlyZXR1cm4gMDsKK30KKworLyogUHJpb3IgdG8gMi42LjExLCB3ZSBoYWQgYSBwb3J0cyBwYXJhbS4gIE5vIGxvbmdlciwgYnV0IGRvbid0IGJyZWFrIHVzZXJzLiAqLworc3RhdGljIGludCB3YXJuX3NldChjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUKKwkgICAgICAgIjoga2VybmVsID49IDIuNi4xMCBvbmx5IHVzZXMgJ3BvcnRzJyBmb3IgY29ubnRyYWNrIG1vZHVsZXNcbiIpOworCXJldHVybiAwOworfQorbW9kdWxlX3BhcmFtX2NhbGwocG9ydHMsIHdhcm5fc2V0LCBOVUxMLCBOVUxMLCAwKTsKKworbW9kdWxlX2luaXQobmZfbmF0X2Z0cF9pbml0KTsKK21vZHVsZV9leGl0KG5mX25hdF9mdHBfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2gzMjMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaDMyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWFiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2gzMjMuYwpAQCAtMCwwICsxLDU5NiBAQAorLyoKKyAqIEguMzIzIGV4dGVuc2lvbiBmb3IgTkFUIGFsdGVyYXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIEJhc2VkIG9uIHRoZSAnYnJ1dGUgZm9yY2UnIEguMzIzIE5BVCBtb2R1bGUgYnkKKyAqIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjMuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgc2V0X2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkgICAgdW5zaWduZWQgaW50IGFkZHJvZmYsIF9fYmUzMiBpcCwgX19iZTE2IHBvcnQpCit7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJc3RydWN0IG5mX2Nvbm4gKmN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisJc3RydWN0IHsKKwkJX19iZTMyIGlwOworCQlfX2JlMTYgcG9ydDsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgYnVmOworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKworCWJ1Zi5pcCA9IGlwOworCWJ1Zi5wb3J0ID0gcG9ydDsKKwlhZGRyb2ZmICs9IGRhdGFvZmY7CisKKwlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQlpZiAoIW5mX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAorCQkJCQkgICAgICBhZGRyb2ZmLCBzaXplb2YoYnVmKSwKKwkJCQkJICAgICAgKGNoYXIgKikgJmJ1Ziwgc2l6ZW9mKGJ1ZikpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50aygibmZfbmF0X2gzMjM6IG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldCIKKwkJCQkgICAgICAgIiBlcnJvclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBSZWxvY2F0ZSBkYXRhIHBvaW50ZXIgKi8KKwkJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCwKKwkJCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwkJaWYgKHRoID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCSpkYXRhID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArCisJCSAgICB0aC0+ZG9mZiAqIDQgKyBkYXRhb2ZmOworCX0gZWxzZSB7CisJCWlmICghbmZfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCisJCQkJCSAgICAgIGFkZHJvZmYsIHNpemVvZihidWYpLAorCQkJCQkgICAgICAoY2hhciAqKSAmYnVmLCBzaXplb2YoYnVmKSkpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKCJuZl9uYXRfaDMyMzogbmZfbmF0X21hbmdsZV91ZHBfcGFja2V0IgorCQkJCSAgICAgICAiIGVycm9yXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQgdXNlcyBza2JfbWFrZV93cml0YWJsZSgpIHRvIGNvcHkKKwkJICogb3IgcHVsbCBldmVyeXRoaW5nIGluIGEgbGluZWFyIGJ1ZmZlciwgc28gd2UgY2FuIHNhZmVseQorCQkgKiB1c2UgdGhlIHNrYiBwb2ludGVycyBub3cgKi8KKwkJKmRhdGEgPSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0ICsKKwkJICAgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHNldF9oMjI1X2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCSBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwKKwkJCSB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwgX19iZTE2IHBvcnQpCit7CisJcmV0dXJuIHNldF9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsIHRhZGRyLT5pcEFkZHJlc3MuaXAsCisJCQlhZGRyLT5pcCwgcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzZXRfaDI0NV9hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICp0YWRkciwKKwkJCSB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwgX19iZTE2IHBvcnQpCit7CisJcmV0dXJuIHNldF9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsCisJCQl0YWRkci0+dW5pY2FzdEFkZHJlc3MuaVBBZGRyZXNzLm5ldHdvcmssCisJCQlhZGRyLT5pcCwgcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzZXRfc2lnX2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLAorCQkJVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgaTsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmdGFkZHJbaV0sICZhZGRyLCAmcG9ydCkpIHsKKwkJCWlmIChhZGRyLmlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMuaXAgJiYKKwkJCSAgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0pIHsKKwkJCQkvKiBHVy0+R0sgKi8KKworCQkJCS8qIEZpeCBmb3IgR25vbWVtZWV0aW5nICovCisJCQkJaWYgKGkgPiAwICYmCisJCQkJICAgIGdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmdGFkZHJbMF0sCisJCQkJCQkgICZhZGRyLCAmcG9ydCkgJiYKKwkJCQkgICAgKG50b2hsKGFkZHIuaXApICYgMHhmZjAwMDAwMCkgPT0gMHg3ZjAwMDAwMCkKKwkJCQkJaSA9IDA7CisKKwkJCQlERUJVR1AKKwkJCQkgICAgKCJuZl9uYXRfcmFzOiBzZXQgc2lnbmFsIGFkZHJlc3MgIgorCQkJCSAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAorCQkJCSAgICAgTklQUVVBRChpcCksIHBvcnQsCisJCQkJICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LgorCQkJCQkgICAgIGlwKSwgaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCQkJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsICZ0YWRkcltpXSwKKwkJCQkJCSAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0uCisJCQkJCQkgICAgIHR1cGxlLmRzdC51MywKKwkJCQkJCSAgICAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCQkJfSBlbHNlIGlmIChhZGRyLmlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QudTMuaXAgJiYKKwkJCQkgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0pIHsKKwkJCQkvKiBHSy0+R1cgKi8KKwkJCQlERUJVR1AKKwkJCQkgICAgKCJuZl9uYXRfcmFzOiBzZXQgc2lnbmFsIGFkZHJlc3MgIgorCQkJCSAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAorCQkJCSAgICAgTklQUVVBRChpcCksIHBvcnQsCisJCQkJICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLgorCQkJCQkgICAgIGlwKSwgaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCQkJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsICZ0YWRkcltpXSwKKwkJCQkJCSAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0uCisJCQkJCQkgICAgIHR1cGxlLnNyYy51MywKKwkJCQkJCSAgICAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzZXRfcmFzX2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLAorCQkJVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCkKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCBpOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsICZ0YWRkcltpXSwgJmFkZHIsICZwb3J0KSAmJgorCQkgICAgYWRkci5pcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLmlwICYmCisJCSAgICBwb3J0ID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudS51ZHAucG9ydCkgeworCQkJREVCVUdQKCJuZl9uYXRfcmFzOiBzZXQgcmFzQWRkcmVzcyAiCisJCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAorCQkJICAgICAgIE5JUFFVQUQoaXApLCBudG9ocyhwb3J0KSwKKwkJCSAgICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLmlwKSwKKwkJCSAgICAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51LnVkcC4KKwkJCQkgICAgIHBvcnQpKTsKKwkJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsICZ0YWRkcltpXSwKKwkJCQkJICAgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkJCSAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS4KKwkJCQkJCQkJZHN0LnUudWRwLnBvcnQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuYXRfcnRwX3J0Y3Aoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCUgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQlfX2JlMTYgcG9ydCwgX19iZTE2IHJ0cF9wb3J0LAorCQkJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHAsCisJCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqcnRjcF9leHApCit7CisJc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfaDMyM19pbmZvOworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IGk7CisJdV9pbnQxNl90IG5hdGVkX3BvcnQ7CisKKwkvKiBTZXQgZXhwZWN0YXRpb25zIGZvciBOQVQgKi8KKwlydHBfZXhwLT5zYXZlZF9wcm90by51ZHAucG9ydCA9IHJ0cF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0OworCXJ0cF9leHAtPmV4cGVjdGZuID0gbmZfbmF0X2ZvbGxvd19tYXN0ZXI7CisJcnRwX2V4cC0+ZGlyID0gIWRpcjsKKwlydGNwX2V4cC0+c2F2ZWRfcHJvdG8udWRwLnBvcnQgPSBydGNwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQ7CisJcnRjcF9leHAtPmV4cGVjdGZuID0gbmZfbmF0X2ZvbGxvd19tYXN0ZXI7CisJcnRjcF9leHAtPmRpciA9ICFkaXI7CisKKwkvKiBMb29rdXAgZXhpc3RpbmcgZXhwZWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBIMzIzX1JUUF9DSEFOTkVMX01BWDsgaSsrKSB7CisJCWlmIChpbmZvLT5ydHBfcG9ydFtpXVtkaXJdID09IHJ0cF9wb3J0KSB7CisJCQkvKiBFeHBlY3RlZCAqLworCisJCQkvKiBVc2UgYWxsb2NhdGVkIHBvcnRzIGZpcnN0LiBUaGlzIHdpbGwgcmVmcmVzaAorCQkJICogdGhlIGV4cGVjdHMgKi8KKwkJCXJ0cF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0ID0gaW5mby0+cnRwX3BvcnRbaV1bZGlyXTsKKwkJCXJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9CisJCQkgICAgaHRvbnMobnRvaHMoaW5mby0+cnRwX3BvcnRbaV1bZGlyXSkgKyAxKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluZm8tPnJ0cF9wb3J0W2ldW2Rpcl0gPT0gMCkgeworCQkJLyogTm90IGV4cGVjdGVkICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFJ1biBvdXQgb2YgZXhwZWN0YXRpb25zICovCisJaWYgKGkgPj0gSDMyM19SVFBfQ0hBTk5FTF9NQVgpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygibmZfbmF0X2gzMjM6IG91dCBvZiBleHBlY3RhdGlvbnNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgdG8gZ2V0IGEgcGFpciBvZiBwb3J0cy4gKi8KKwlmb3IgKG5hdGVkX3BvcnQgPSBudG9ocyhydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCk7CisJICAgICBuYXRlZF9wb3J0ICE9IDA7IG5hdGVkX3BvcnQgKz0gMikgeworCQlydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHJ0cF9leHApID09IDApIHsKKwkJCXJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9CisJCQkgICAgaHRvbnMobmF0ZWRfcG9ydCArIDEpOworCQkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChydGNwX2V4cCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHJ0cF9leHApOworCQl9CisJfQorCisJaWYgKG5hdGVkX3BvcnQgPT0gMCkgewkvKiBObyBwb3J0IGF2YWlsYWJsZSAqLworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJuZl9uYXRfaDMyMzogb3V0IG9mIFJUUCBwb3J0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIE1vZGlmeSBzaWduYWwgKi8KKwlpZiAoc2V0X2gyNDVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLCB0YWRkciwKKwkJCSAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJICBodG9ucygocG9ydCAmIGh0b25zKDEpKSA/IG5hdGVkX3BvcnQgKyAxIDoKKwkJCSAgCQkJICAgIG5hdGVkX3BvcnQpKSA9PSAwKSB7CisJCS8qIFNhdmUgcG9ydHMgKi8KKwkJaW5mby0+cnRwX3BvcnRbaV1bZGlyXSA9IHJ0cF9wb3J0OworCQlpbmZvLT5ydHBfcG9ydFtpXVshZGlyXSA9IGh0b25zKG5hdGVkX3BvcnQpOworCX0gZWxzZSB7CisJCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHJ0cF9leHApOworCQluZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChydGNwX2V4cCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTdWNjZXNzICovCisJREVCVUdQKCJuZl9uYXRfaDMyMzogZXhwZWN0IFJUUCAldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKKwkgICAgICAgTklQUVVBRChydHBfZXhwLT50dXBsZS5zcmMuaXApLAorCSAgICAgICBudG9ocyhydHBfZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCksCisJICAgICAgIE5JUFFVQUQocnRwX2V4cC0+dHVwbGUuZHN0LmlwKSwKKwkgICAgICAgbnRvaHMocnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQpKTsKKwlERUJVR1AoIm5mX25hdF9oMzIzOiBleHBlY3QgUlRDUCAldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKKwkgICAgICAgTklQUVVBRChydGNwX2V4cC0+dHVwbGUuc3JjLmlwKSwKKwkgICAgICAgbnRvaHMocnRjcF9leHAtPnR1cGxlLnNyYy51LnVkcC5wb3J0KSwKKwkgICAgICAgTklQUVVBRChydGNwX2V4cC0+dHVwbGUuZHN0LmlwKSwKKwkgICAgICAgbnRvaHMocnRjcF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG5hdF90MTIwKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCSAgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBfX2JlMTYgcG9ydCwKKwkJICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwl1X2ludDE2X3QgbmF0ZWRfcG9ydCA9IG50b2hzKHBvcnQpOworCisJLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCisJZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7CisJZXhwLT5leHBlY3RmbiA9IG5mX25hdF9mb2xsb3dfbWFzdGVyOworCWV4cC0+ZGlyID0gIWRpcjsKKworCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCisJZm9yICg7IG5hdGVkX3BvcnQgIT0gMDsgbmF0ZWRfcG9ydCsrKSB7CisJCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhuYXRlZF9wb3J0KTsKKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAobmF0ZWRfcG9ydCA9PSAwKSB7CS8qIE5vIHBvcnQgYXZhaWxhYmxlICovCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIm5mX25hdF9oMzIzOiBvdXQgb2YgVENQIHBvcnRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTW9kaWZ5IHNpZ25hbCAqLworCWlmIChzZXRfaDI0NV9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsIHRhZGRyLAorCQkJICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkgIGh0b25zKG5hdGVkX3BvcnQpKSA8IDApIHsKKwkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCURFQlVHUCgibmZfbmF0X2gzMjM6IGV4cGVjdCBULjEyMCAldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKKwkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAorCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuYXRfaDI0NShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkgICAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIF9fYmUxNiBwb3J0LAorCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwl1X2ludDE2X3QgbmF0ZWRfcG9ydCA9IG50b2hzKHBvcnQpOworCisJLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCisJZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7CisJZXhwLT5leHBlY3RmbiA9IG5mX25hdF9mb2xsb3dfbWFzdGVyOworCWV4cC0+ZGlyID0gIWRpcjsKKworCS8qIENoZWNrIGV4aXN0aW5nIGV4cGVjdHMgKi8KKwlpZiAoaW5mby0+c2lnX3BvcnRbZGlyXSA9PSBwb3J0KQorCQluYXRlZF9wb3J0ID0gbnRvaHMoaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCisJLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KKwlmb3IgKDsgbmF0ZWRfcG9ydCAhPSAwOyBuYXRlZF9wb3J0KyspIHsKKwkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChuYXRlZF9wb3J0ID09IDApIHsJLyogTm8gcG9ydCBhdmFpbGFibGUgKi8KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygibmZfbmF0X3E5MzE6IG91dCBvZiBUQ1AgcG9ydHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNb2RpZnkgc2lnbmFsICovCisJaWYgKHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwgdGFkZHIsCisJCQkgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCSAgaHRvbnMobmF0ZWRfcG9ydCkpID09IDApIHsKKwkJLyogU2F2ZSBwb3J0cyAqLworCQlpbmZvLT5zaWdfcG9ydFtkaXJdID0gcG9ydDsKKwkJaW5mby0+c2lnX3BvcnRbIWRpcl0gPSBodG9ucyhuYXRlZF9wb3J0KTsKKwl9IGVsc2UgeworCQluZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOworCQlyZXR1cm4gLTE7CisJfQorCisJREVCVUdQKCJuZl9uYXRfcTkzMTogZXhwZWN0IEguMjQ1ICV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAorCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCisJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLCBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgY29ubnRyYWNrIGV4cGVjdCBmdW5jdGlvbiByZXBsYWNlcyBuZl9jb25udHJhY2tfcTkzMV9leHBlY3QoKQorICogd2hpY2ggd2FzIHNldCBieSBuZl9jb25udHJhY2tfaDMyMy5jLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpcF9uYXRfcTkzMV9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKm5ldywKKwkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqdGhpcykKK3sKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOworCisJaWYgKHRoaXMtPnR1cGxlLnNyYy51My5pcCAhPSAwKSB7CS8qIE9ubHkgYWNjZXB0IGNhbGxzIGZyb20gR0sgKi8KKwkJbmZfbmF0X2ZvbGxvd19tYXN0ZXIobmV3LCB0aGlzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KKwlCVUdfT04obmV3LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7CisKKwkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLworCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7CisJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwID0gbmV3LT50dXBsZWhhc2hbIXRoaXMtPmRpcl0udHVwbGUuc3JjLnUzLmlwOworCisJLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBzb3VyY2UgbWFuaXAgKi8KKwluZl9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKKworCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KKwlyYW5nZS5mbGFncyA9IChJUF9OQVRfUkFOR0VfTUFQX0lQUyB8IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOworCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IHRoaXMtPnNhdmVkX3Byb3RvOworCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcCA9CisJICAgIG5ldy0+bWFzdGVyLT50dXBsZWhhc2hbIXRoaXMtPmRpcl0udHVwbGUuc3JjLnUzLmlwOworCisJLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBkZXN0aW5hdGlvbiBtYW5pcCAqLworCW5mX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBORl9JUF9QUkVfUk9VVElORyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuYXRfcTkzMShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBpbnQgaWR4LAorCQkgICAgX19iZTE2IHBvcnQsIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfaDMyM19pbmZvOworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJdV9pbnQxNl90IG5hdGVkX3BvcnQgPSBudG9ocyhwb3J0KTsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCisJLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCisJZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7CisJZXhwLT5leHBlY3RmbiA9IGlwX25hdF9xOTMxX2V4cGVjdDsKKwlleHAtPmRpciA9ICFkaXI7CisKKwkvKiBDaGVjayBleGlzdGluZyBleHBlY3RzICovCisJaWYgKGluZm8tPnNpZ19wb3J0W2Rpcl0gPT0gcG9ydCkKKwkJbmF0ZWRfcG9ydCA9IG50b2hzKGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKKworCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCisJZm9yICg7IG5hdGVkX3BvcnQgIT0gMDsgbmF0ZWRfcG9ydCsrKSB7CisJCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhuYXRlZF9wb3J0KTsKKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAobmF0ZWRfcG9ydCA9PSAwKSB7CS8qIE5vIHBvcnQgYXZhaWxhYmxlICovCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIm5mX25hdF9yYXM6IG91dCBvZiBUQ1AgcG9ydHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNb2RpZnkgc2lnbmFsICovCisJaWYgKHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwgJnRhZGRyW2lkeF0sCisJCQkgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCSAgaHRvbnMobmF0ZWRfcG9ydCkpID09IDApIHsKKwkJLyogU2F2ZSBwb3J0cyAqLworCQlpbmZvLT5zaWdfcG9ydFtkaXJdID0gcG9ydDsKKwkJaW5mby0+c2lnX3BvcnRbIWRpcl0gPSBodG9ucyhuYXRlZF9wb3J0KTsKKworCQkvKiBGaXggZm9yIEdub21lbWVldGluZyAqLworCQlpZiAoaWR4ID4gMCAmJgorCQkgICAgZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsICZ0YWRkclswXSwgJmFkZHIsICZwb3J0KSAmJgorCQkgICAgKG50b2hsKGFkZHIuaXApICYgMHhmZjAwMDAwMCkgPT0gMHg3ZjAwMDAwMCkgeworCQkJc2V0X2gyMjVfYWRkcl9ob29rKHBza2IsIGRhdGEsIDAsICZ0YWRkclswXSwKKwkJCQkJICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJCQkgICBpbmZvLT5zaWdfcG9ydFshZGlyXSk7CisJCX0KKwl9IGVsc2UgeworCQluZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU3VjY2VzcyAqLworCURFQlVHUCgibmZfbmF0X3JhczogZXhwZWN0IFEuOTMxICV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAorCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCisJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLCBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpcF9uYXRfY2FsbGZvcndhcmRpbmdfZXhwZWN0KHN0cnVjdCBuZl9jb25uICpuZXcsCisJCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqdGhpcykKK3sKKwlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlOworCisJLyogVGhpcyBtdXN0IGJlIGEgZnJlc2ggb25lLiAqLworCUJVR19PTihuZXctPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKKworCS8qIENoYW5nZSBzcmMgdG8gd2hlcmUgbWFzdGVyIHNlbmRzIHRvICovCisJcmFuZ2UuZmxhZ3MgPSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKKwlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAgPSBuZXctPnR1cGxlaGFzaFshdGhpcy0+ZGlyXS50dXBsZS5zcmMudTMuaXA7CisKKwkvKiBob29rIGRvZXNuJ3QgbWF0dGVyLCBidXQgaXQgaGFzIHRvIGRvIHNvdXJjZSBtYW5pcCAqLworCW5mX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBORl9JUF9QT1NUX1JPVVRJTkcpOworCisJLyogRm9yIERTVCBtYW5pcCwgbWFwIHBvcnQgaGVyZSB0byB3aGVyZSBpdCdzIGV4cGVjdGVkLiAqLworCXJhbmdlLmZsYWdzID0gKElQX05BVF9SQU5HRV9NQVBfSVBTIHwgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCk7CisJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gdGhpcy0+c2F2ZWRfcHJvdG87CisJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwID0gdGhpcy0+c2F2ZWRfaXA7CisKKwkvKiBob29rIGRvZXNuJ3QgbWF0dGVyLCBidXQgaXQgaGFzIHRvIGRvIGRlc3RpbmF0aW9uIG1hbmlwICovCisJbmZfbmF0X3NldHVwX2luZm8obmV3LCAmcmFuZ2UsIE5GX0lQX1BSRV9ST1VUSU5HKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG5hdF9jYWxsZm9yd2FyZGluZyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgICAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIF9fYmUxNiBwb3J0LAorCQkJICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXVfaW50MTZfdCBuYXRlZF9wb3J0OworCisJLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCisJZXhwLT5zYXZlZF9pcCA9IGV4cC0+dHVwbGUuZHN0LnUzLmlwOworCWV4cC0+dHVwbGUuZHN0LnUzLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMuaXA7CisJZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7CisJZXhwLT5leHBlY3RmbiA9IGlwX25hdF9jYWxsZm9yd2FyZGluZ19leHBlY3Q7CisJZXhwLT5kaXIgPSAhZGlyOworCisJLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KKwlmb3IgKG5hdGVkX3BvcnQgPSBudG9ocyhwb3J0KTsgbmF0ZWRfcG9ydCAhPSAwOyBuYXRlZF9wb3J0KyspIHsKKwkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChuYXRlZF9wb3J0ID09IDApIHsJLyogTm8gcG9ydCBhdmFpbGFibGUgKi8KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygibmZfbmF0X3E5MzE6IG91dCBvZiBUQ1AgcG9ydHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNb2RpZnkgc2lnbmFsICovCisJaWYgKCFzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsIHRhZGRyLAorCQkJICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJICAgaHRvbnMobmF0ZWRfcG9ydCkpID09IDApIHsKKwkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFN1Y2Nlc3MgKi8KKwlERUJVR1AoIm5mX25hdF9xOTMxOiBleHBlY3QgQ2FsbCBGb3J3YXJkaW5nICIKKwkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAorCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCisJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLCBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShzZXRfaDI0NV9hZGRyX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X2gyMjVfYWRkcl9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9ydHBfcnRjcF9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF90MTIwX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X2gyNDVfaG9vaykgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfcTkzMV9ob29rKSAhPSBOVUxMKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDI0NV9hZGRyX2hvb2ssIHNldF9oMjQ1X2FkZHIpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDIyNV9hZGRyX2hvb2ssIHNldF9oMjI1X2FkZHIpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfc2lnX2FkZHJfaG9vaywgc2V0X3NpZ19hZGRyKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3Jhc19hZGRyX2hvb2ssIHNldF9yYXNfYWRkcik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9ydHBfcnRjcF9ob29rLCBuYXRfcnRwX3J0Y3ApOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfdDEyMF9ob29rLCBuYXRfdDEyMCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9oMjQ1X2hvb2ssIG5hdF9oMjQ1KTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2ssIG5hdF9jYWxsZm9yd2FyZGluZyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9xOTMxX2hvb2ssIG5hdF9xOTMxKTsKKworCURFQlVHUCgibmZfbmF0X2gzMjM6IGluaXQgc3VjY2Vzc1xuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X2gyNDVfYWRkcl9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X2gyMjVfYWRkcl9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3NpZ19hZGRyX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfcmFzX2FkZHJfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9ydHBfcnRjcF9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3QxMjBfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9oMjQ1X2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfY2FsbGZvcndhcmRpbmdfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9xOTMxX2hvb2ssIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CisKK01PRFVMRV9BVVRIT1IoIkppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSC4zMjMgTkFUIGhlbHBlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcF9uYXRfaDMyMyIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmYmZjODQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCkBAIC0wLDAgKzEsNDMzIEBACisvKiBpcF9uYXRfaGVscGVyLmMgLSBnZW5lcmljIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBOQVQgaGVscGVycworICoKKyAqIChDKSAyMDAwLTIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKiAoQykgMjAwMy0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNkZWZpbmUgRFVNUF9PRkZTRVQoeCkJcHJpbnRrKCJvZmZzZXRfYmVmb3JlPSVkLCBvZmZzZXRfYWZ0ZXI9JWQsIGNvcnJlY3Rpb25fcG9zPSV1XG4iLCB4LT5vZmZzZXRfYmVmb3JlLCB4LT5vZmZzZXRfYWZ0ZXIsIHgtPmNvcnJlY3Rpb25fcG9zKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZGVmaW5lIERVTVBfT0ZGU0VUKHgpCisjZW5kaWYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhuZl9uYXRfc2Vxb2ZzX2xvY2spOworCisvKiBTZXR1cCBUQ1Agc2VxdWVuY2UgY29ycmVjdGlvbiBnaXZlbiB0aGlzIGNoYW5nZSBhdCB0aGlzIHNlcXVlbmNlICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FkanVzdF90Y3Bfc2VxdWVuY2UodTMyIHNlcSwKKwkJICAgIGludCBzaXplZGlmZiwKKwkJICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCWludCBkaXI7CisJc3RydWN0IG5mX25hdF9zZXEgKnRoaXNfd2F5LCAqb3RoZXJfd2F5OworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoY3QpOworCisJREVCVUdQKCJuZl9uYXRfcmVzaXplX3BhY2tldDogb2xkX3NpemUgPSAldSwgbmV3X3NpemUgPSAldVxuIiwKKwkJKCpza2IpLT5sZW4sIG5ld19zaXplKTsKKworCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworCXRoaXNfd2F5ID0gJm5hdC0+aW5mby5zZXFbZGlyXTsKKwlvdGhlcl93YXkgPSAmbmF0LT5pbmZvLnNlcVshZGlyXTsKKworCURFQlVHUCgibmZfbmF0X3Jlc2l6ZV9wYWNrZXQ6IFNlcV9vZmZzZXQgYmVmb3JlOiAiKTsKKwlEVU1QX09GRlNFVCh0aGlzX3dheSk7CisKKwlzcGluX2xvY2tfYmgoJm5mX25hdF9zZXFvZnNfbG9jayk7CisKKwkvKiBTWU4gYWRqdXN0LiBJZiBpdCdzIHVuaW5pdGlhbGl6ZWQsIG9yIHRoaXMgaXMgYWZ0ZXIgbGFzdAorCSAqIGNvcnJlY3Rpb24sIHJlY29yZCBpdDogd2UgZG9uJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUKKwkgKiBhZGp1c3RtZW50IGluIHRoZSB3aW5kb3csIGJ1dCBkbyBkZWFsIHdpdGggY29tbW9uIGNhc2Ugb2YgYQorCSAqIHJldHJhbnNtaXQgKi8KKwlpZiAodGhpc193YXktPm9mZnNldF9iZWZvcmUgPT0gdGhpc193YXktPm9mZnNldF9hZnRlciB8fAorCSAgICBiZWZvcmUodGhpc193YXktPmNvcnJlY3Rpb25fcG9zLCBzZXEpKSB7CisJCSAgIHRoaXNfd2F5LT5jb3JyZWN0aW9uX3BvcyA9IHNlcTsKKwkJICAgdGhpc193YXktPm9mZnNldF9iZWZvcmUgPSB0aGlzX3dheS0+b2Zmc2V0X2FmdGVyOworCQkgICB0aGlzX3dheS0+b2Zmc2V0X2FmdGVyICs9IHNpemVkaWZmOworCX0KKwlzcGluX3VubG9ja19iaCgmbmZfbmF0X3NlcW9mc19sb2NrKTsKKworCURFQlVHUCgibmZfbmF0X3Jlc2l6ZV9wYWNrZXQ6IFNlcV9vZmZzZXQgYWZ0ZXI6ICIpOworCURVTVBfT0ZGU0VUKHRoaXNfd2F5KTsKK30KKworLyogRnJvYnMgZGF0YSBpbnNpZGUgdGhpcyBwYWNrZXQsIHdoaWNoIGlzIGxpbmVhci4gKi8KK3N0YXRpYyB2b2lkIG1hbmdsZV9jb250ZW50cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkJICAgIHVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCisJCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKKwkJCSAgICBjb25zdCBjaGFyICpyZXBfYnVmZmVyLAorCQkJICAgIHVuc2lnbmVkIGludCByZXBfbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisKKwlCVUdfT04oc2tiX2lzX25vbmxpbmVhcihza2IpKTsKKwlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm5oLmlwaCArIGRhdGFvZmY7CisKKwkvKiBtb3ZlIHBvc3QtcmVwbGFjZW1lbnQgKi8KKwltZW1tb3ZlKGRhdGEgKyBtYXRjaF9vZmZzZXQgKyByZXBfbGVuLAorCQlkYXRhICsgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuLAorCQlza2ItPnRhaWwgLSAoZGF0YSArIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikpOworCisJLyogaW5zZXJ0IGRhdGEgZnJvbSBidWZmZXIgKi8KKwltZW1jcHkoZGF0YSArIG1hdGNoX29mZnNldCwgcmVwX2J1ZmZlciwgcmVwX2xlbik7CisKKwkvKiB1cGRhdGUgc2tiIGluZm8gKi8KKwlpZiAocmVwX2xlbiA+IG1hdGNoX2xlbikgeworCQlERUJVR1AoIm5mX25hdF9tYW5nbGVfcGFja2V0OiBFeHRlbmRpbmcgcGFja2V0IGJ5ICIKKwkJICAgICAgICIldSBmcm9tICV1IGJ5dGVzXG4iLCByZXBfbGVuIC0gbWF0Y2hfbGVuLAorCQkgICAgICAgc2tiLT5sZW4pOworCQlza2JfcHV0KHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbik7CisJfSBlbHNlIHsKKwkJREVCVUdQKCJuZl9uYXRfbWFuZ2xlX3BhY2tldDogU2hyaW5raW5nIHBhY2tldCBmcm9tICIKKwkJICAgICAgICIldSBmcm9tICV1IGJ5dGVzXG4iLCBtYXRjaF9sZW4gLSByZXBfbGVuLAorCQkgICAgICAgc2tiLT5sZW4pOworCQlfX3NrYl90cmltKHNrYiwgc2tiLT5sZW4gKyByZXBfbGVuIC0gbWF0Y2hfbGVuKTsKKwl9CisKKwkvKiBmaXggSVAgaGRyIGNoZWNrc3VtIGluZm9ybWF0aW9uICovCisJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7Cit9CisKKy8qIFVudXN1YWwsIGJ1dCBwb3NzaWJsZSBjYXNlLiAqLworc3RhdGljIGludCBlbmxhcmdlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBleHRyYSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWlmICgoKnBza2IpLT5sZW4gKyBleHRyYSA+IDY1NTM1KQorCQlyZXR1cm4gMDsKKworCW5za2IgPSBza2JfY29weV9leHBhbmQoKnBza2IsIHNrYl9oZWFkcm9vbSgqcHNrYiksIGV4dHJhLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5za2IpCisJCXJldHVybiAwOworCisJLyogVHJhbnNmZXIgc29ja2V0IHRvIG5ldyBza2IuICovCisJaWYgKCgqcHNrYiktPnNrKQorCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOworCWtmcmVlX3NrYigqcHNrYik7CisJKnBza2IgPSBuc2tiOworCXJldHVybiAxOworfQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBtYW5nbGluZyB2YXJpYWJsZS1sZW5ndGggYWRkcmVzcyBjaGFuZ2VzIGluc2lkZQorICogTkFUZWQgVENQIGNvbm5lY3Rpb25zIChsaWtlIHRoZSBQT1JUIFhYWCxYWFgsWFhYLFhYWCxYWFgsWFhYCisgKiBjb21tYW5kIGluIEZUUCkuCisgKgorICogVGFrZXMgY2FyZSBhYm91dCBhbGwgdGhlIG5hc3R5IHNlcXVlbmNlIG51bWJlciBjaGFuZ2VzLCBjaGVja3N1bW1pbmcsCisgKiBza2IgZW5sYXJnZW1lbnQsIC4uLgorICoKKyAqICovCitpbnQKK25mX25hdF9tYW5nbGVfdGNwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJIHVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCisJCQkgdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKKwkJCSBjb25zdCBjaGFyICpyZXBfYnVmZmVyLAorCQkJIHVuc2lnbmVkIGludCByZXBfbGVuKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJaW50IG9sZGxlbiwgZGF0YWxlbjsKKworCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVwX2xlbiA+IG1hdGNoX2xlbiAmJgorCSAgICByZXBfbGVuIC0gbWF0Y2hfbGVuID4gc2tiX3RhaWxyb29tKCpwc2tiKSAmJgorCSAgICAhZW5sYXJnZV9za2IocHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbikpCisJCXJldHVybiAwOworCisJU0tCX0xJTkVBUl9BU1NFUlQoKnBza2IpOworCisJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXRjcGggPSAodm9pZCAqKWlwaCArIGlwaC0+aWhsKjQ7CisKKwlvbGRsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OworCW1hbmdsZV9jb250ZW50cygqcHNrYiwgaXBoLT5paGwqNCArIHRjcGgtPmRvZmYqNCwKKwkJCW1hdGNoX29mZnNldCwgbWF0Y2hfbGVuLCByZXBfYnVmZmVyLCByZXBfbGVuKTsKKworCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OworCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQl0Y3BoLT5jaGVjayA9IDA7CisJCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRjcGgsIGRhdGFsZW4sCisJCQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCisJCQkJCSAgIAkJZGF0YWxlbiwgMCkpOworCX0gZWxzZQorCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCisJCQkJICAgICAgIGh0b25zKG9sZGxlbiksIGh0b25zKGRhdGFsZW4pLCAxKTsKKworCWlmIChyZXBfbGVuICE9IG1hdGNoX2xlbikgeworCQlzZXRfYml0KElQU19TRVFfQURKVVNUX0JJVCwgJmN0LT5zdGF0dXMpOworCQlhZGp1c3RfdGNwX3NlcXVlbmNlKG50b2hsKHRjcGgtPnNlcSksCisJCQkJICAgIChpbnQpcmVwX2xlbiAtIChpbnQpbWF0Y2hfbGVuLAorCQkJCSAgICBjdCwgY3RpbmZvKTsKKwkJLyogVGVsbCBUQ1Agd2luZG93IHRyYWNraW5nIGFib3V0IHNlcSBjaGFuZ2UgKi8KKwkJbmZfY29ubnRyYWNrX3RjcF91cGRhdGUoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCisJCQkJCWN0LCBDVElORk8yRElSKGN0aW5mbykpOworCX0KKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wobmZfbmF0X21hbmdsZV90Y3BfcGFja2V0KTsKKworLyogR2VuZXJpYyBmdW5jdGlvbiBmb3IgbWFuZ2xpbmcgdmFyaWFibGUtbGVuZ3RoIGFkZHJlc3MgY2hhbmdlcyBpbnNpZGUKKyAqIE5BVGVkIFVEUCBjb25uZWN0aW9ucyAobGlrZSB0aGUgQ09OTkVDVCBEQVRBIFhYWFhYIE1FU0cgWFhYWFggSU5ERVggWFhYWFgKKyAqIGNvbW1hbmQgaW4gdGhlIEFtYW5kYSBwcm90b2NvbCkKKyAqCisgKiBUYWtlcyBjYXJlIGFib3V0IGFsbCB0aGUgbmFzdHkgc2VxdWVuY2UgbnVtYmVyIGNoYW5nZXMsIGNoZWNrc3VtbWluZywKKyAqIHNrYiBlbmxhcmdlbWVudCwgLi4uCisgKgorICogWFhYIC0gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtZXJnZWQgd2l0aCBuZl9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQgd2hpY2gKKyAqICAgICAgIHNob3VsZCBiZSBmYWlybHkgZWFzeSB0byBkby4KKyAqLworaW50CituZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfb2Zmc2V0LAorCQkJIHVuc2lnbmVkIGludCBtYXRjaF9sZW4sCisJCQkgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKKwkJCSB1bnNpZ25lZCBpbnQgcmVwX2xlbikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHBoOworCWludCBkYXRhbGVuLCBvbGRsZW47CisKKwkvKiBVRFAgaGVscGVycyBtaWdodCBhY2NpZGVudGFsbHkgbWFuZ2xlIHRoZSB3cm9uZyBwYWNrZXQgKi8KKwlpcGggPSAoKnBza2IpLT5uaC5pcGg7CisJaWYgKCgqcHNrYiktPmxlbiA8IGlwaC0+aWhsKjQgKyBzaXplb2YoKnVkcGgpICsKKwkgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCisJCXJldHVybiAwOworCisJaWYgKHJlcF9sZW4gPiBtYXRjaF9sZW4gJiYKKwkgICAgcmVwX2xlbiAtIG1hdGNoX2xlbiA+IHNrYl90YWlscm9vbSgqcHNrYikgJiYKKwkgICAgIWVubGFyZ2Vfc2tiKHBza2IsIHJlcF9sZW4gLSBtYXRjaF9sZW4pKQorCQlyZXR1cm4gMDsKKworCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwl1ZHBoID0gKHZvaWQgKilpcGggKyBpcGgtPmlobCo0OworCisJb2xkbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKKwltYW5nbGVfY29udGVudHMoKnBza2IsIGlwaC0+aWhsKjQgKyBzaXplb2YoKnVkcGgpLAorCQkJbWF0Y2hfb2Zmc2V0LCBtYXRjaF9sZW4sIHJlcF9idWZmZXIsIHJlcF9sZW4pOworCisJLyogdXBkYXRlIHRoZSBsZW5ndGggb2YgdGhlIFVEUCBwYWNrZXQgKi8KKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKKwl1ZHBoLT5sZW4gPSBodG9ucyhkYXRhbGVuKTsKKworCS8qIGZpeCB1ZHAgY2hlY2tzdW0gaWYgdWRwIGNoZWNrc3VtIHdhcyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgKi8KKwlpZiAoIXVkcGgtPmNoZWNrICYmICgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQorCQlyZXR1cm4gMTsKKworCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQl1ZHBoLT5jaGVjayA9IDA7CisJCXVkcGgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuLCBJUFBST1RPX1VEUCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil1ZHBoLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuLCAwKSk7CisJCWlmICghdWRwaC0+Y2hlY2spCisJCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCX0gZWxzZQorCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ1ZHBoLT5jaGVjaywgKnBza2IsCisJCQkJICAgICAgIGh0b25zKG9sZGxlbiksIGh0b25zKGRhdGFsZW4pLCAxKTsKKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQpOworCisvKiBBZGp1c3Qgb25lIGZvdW5kIFNBQ0sgb3B0aW9uIGluY2x1ZGluZyBjaGVja3N1bSBjb3JyZWN0aW9uICovCitzdGF0aWMgdm9pZAorc2Fja19hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgc3RydWN0IHRjcGhkciAqdGNwaCwKKwkgICAgdW5zaWduZWQgaW50IHNhY2tvZmYsCisJICAgIHVuc2lnbmVkIGludCBzYWNrZW5kLAorCSAgICBzdHJ1Y3QgbmZfbmF0X3NlcSAqbmF0c2VxKQoreworCXdoaWxlIChzYWNrb2ZmIDwgc2Fja2VuZCkgeworCQlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2tfd2lyZSAqc2FjazsKKwkJX19iZTMyIG5ld19zdGFydF9zZXEsIG5ld19lbmRfc2VxOworCisJCXNhY2sgPSAodm9pZCAqKXNrYi0+ZGF0YSArIHNhY2tvZmY7CisJCWlmIChhZnRlcihudG9obChzYWNrLT5zdGFydF9zZXEpIC0gbmF0c2VxLT5vZmZzZXRfYmVmb3JlLAorCQkJICBuYXRzZXEtPmNvcnJlY3Rpb25fcG9zKSkKKwkJCW5ld19zdGFydF9zZXEgPSBodG9ubChudG9obChzYWNrLT5zdGFydF9zZXEpCisJCQkJCS0gbmF0c2VxLT5vZmZzZXRfYWZ0ZXIpOworCQllbHNlCisJCQluZXdfc3RhcnRfc2VxID0gaHRvbmwobnRvaGwoc2Fjay0+c3RhcnRfc2VxKQorCQkJCQktIG5hdHNlcS0+b2Zmc2V0X2JlZm9yZSk7CisKKwkJaWYgKGFmdGVyKG50b2hsKHNhY2stPmVuZF9zZXEpIC0gbmF0c2VxLT5vZmZzZXRfYmVmb3JlLAorCQkJICBuYXRzZXEtPmNvcnJlY3Rpb25fcG9zKSkKKwkJCW5ld19lbmRfc2VxID0gaHRvbmwobnRvaGwoc2Fjay0+ZW5kX3NlcSkKKwkJCQkgICAgICAtIG5hdHNlcS0+b2Zmc2V0X2FmdGVyKTsKKwkJZWxzZQorCQkJbmV3X2VuZF9zZXEgPSBodG9ubChudG9obChzYWNrLT5lbmRfc2VxKQorCQkJCSAgICAgIC0gbmF0c2VxLT5vZmZzZXRfYmVmb3JlKTsKKworCQlERUJVR1AoInNhY2tfYWRqdXN0OiBzdGFydF9zZXE6ICVkLT4lZCwgZW5kX3NlcTogJWQtPiVkXG4iLAorCQkJbnRvaGwoc2Fjay0+c3RhcnRfc2VxKSwgbmV3X3N0YXJ0X3NlcSwKKwkJCW50b2hsKHNhY2stPmVuZF9zZXEpLCBuZXdfZW5kX3NlcSk7CisKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssIHNrYiwKKwkJCQkgICAgICAgc2Fjay0+c3RhcnRfc2VxLCBuZXdfc3RhcnRfc2VxLCAwKTsKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssIHNrYiwKKwkJCQkgICAgICAgc2Fjay0+ZW5kX3NlcSwgbmV3X2VuZF9zZXEsIDApOworCQlzYWNrLT5zdGFydF9zZXEgPSBuZXdfc3RhcnRfc2VxOworCQlzYWNrLT5lbmRfc2VxID0gbmV3X2VuZF9zZXE7CisJCXNhY2tvZmYgKz0gc2l6ZW9mKCpzYWNrKTsKKwl9Cit9CisKKy8qIFRDUCBTQUNLIHNlcXVlbmNlIG51bWJlciBhZGp1c3RtZW50ICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorbmZfbmF0X3NhY2tfYWRqdXN0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgc3RydWN0IHRjcGhkciAqdGNwaCwKKwkJICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgZGlyLCBvcHRvZmYsIG9wdGVuZDsKKwlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdCA9IG5mY3RfbmF0KGN0KTsKKworCW9wdG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJb3B0ZW5kID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHRjcGgtPmRvZmYqNDsKKworCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgb3B0ZW5kKSkKKwkJcmV0dXJuIDA7CisKKwlkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisKKwl3aGlsZSAob3B0b2ZmIDwgb3B0ZW5kKSB7CisJCS8qIFVzdWFsbHk6IG9wdGlvbiwgbGVuZ3RoLiAqLworCQl1bnNpZ25lZCBjaGFyICpvcCA9ICgqcHNrYiktPmRhdGEgKyBvcHRvZmY7CisKKwkJc3dpdGNoIChvcFswXSkgeworCQljYXNlIFRDUE9QVF9FT0w6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBUQ1BPUFRfTk9QOgorCQkJb3B0b2ZmKys7CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCS8qIG5vIHBhcnRpYWwgb3B0aW9ucyAqLworCQkJaWYgKG9wdG9mZiArIDEgPT0gb3B0ZW5kIHx8CisJCQkgICAgb3B0b2ZmICsgb3BbMV0gPiBvcHRlbmQgfHwKKwkJCSAgICBvcFsxXSA8IDIpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAob3BbMF0gPT0gVENQT1BUX1NBQ0sgJiYKKwkJCSAgICBvcFsxXSA+PSAyK1RDUE9MRU5fU0FDS19QRVJCTE9DSyAmJgorCQkJICAgICgob3BbMV0gLSAyKSAlIFRDUE9MRU5fU0FDS19QRVJCTE9DSykgPT0gMCkKKwkJCQlzYWNrX2FkanVzdCgqcHNrYiwgdGNwaCwgb3B0b2ZmKzIsCisJCQkJCSAgICBvcHRvZmYrb3BbMV0sCisJCQkJCSAgICAmbmF0LT5pbmZvLnNlcVshZGlyXSk7CisJCQlvcHRvZmYgKz0gb3BbMV07CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIFRDUCBzZXF1ZW5jZSBudW1iZXIgYWRqdXN0bWVudC4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUgKi8KK2ludAorbmZfbmF0X3NlcV9hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoOworCWludCBkaXI7CisJX19iZTMyIG5ld3NlcSwgbmV3YWNrOworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoY3QpOworCXN0cnVjdCBuZl9uYXRfc2VxICp0aGlzX3dheSwgKm90aGVyX3dheTsKKworCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworCXRoaXNfd2F5ID0gJm5hdC0+aW5mby5zZXFbZGlyXTsKKwlvdGhlcl93YXkgPSAmbmF0LT5pbmZvLnNlcVshZGlyXTsKKworCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2YoKnRjcGgpKSkKKwkJcmV0dXJuIDA7CisKKwl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwlpZiAoYWZ0ZXIobnRvaGwodGNwaC0+c2VxKSwgdGhpc193YXktPmNvcnJlY3Rpb25fcG9zKSkKKwkJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXIpOworCWVsc2UKKwkJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHRoaXNfd2F5LT5vZmZzZXRfYmVmb3JlKTsKKworCWlmIChhZnRlcihudG9obCh0Y3BoLT5hY2tfc2VxKSAtIG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZSwKKwkJICBvdGhlcl93YXktPmNvcnJlY3Rpb25fcG9zKSkKKwkJbmV3YWNrID0gaHRvbmwobnRvaGwodGNwaC0+YWNrX3NlcSkgLSBvdGhlcl93YXktPm9mZnNldF9hZnRlcik7CisJZWxzZQorCQluZXdhY2sgPSBodG9ubChudG9obCh0Y3BoLT5hY2tfc2VxKSAtIG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZSk7CisKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIHRjcGgtPnNlcSwgbmV3c2VxLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIHRjcGgtPmFja19zZXEsIG5ld2FjaywgMCk7CisKKwlERUJVR1AoIkFkanVzdGluZyBzZXF1ZW5jZSBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKKwkJbnRvaGwodGNwaC0+c2VxKSwgbnRvaGwobmV3c2VxKSwgbnRvaGwodGNwaC0+YWNrX3NlcSksCisJCW50b2hsKG5ld2FjaykpOworCisJdGNwaC0+c2VxID0gbmV3c2VxOworCXRjcGgtPmFja19zZXEgPSBuZXdhY2s7CisKKwlpZiAoIW5mX25hdF9zYWNrX2FkanVzdChwc2tiLCB0Y3BoLCBjdCwgY3RpbmZvKSkKKwkJcmV0dXJuIDA7CisKKwluZl9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCwgY3QsIGRpcik7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wobmZfbmF0X3NlcV9hZGp1c3QpOworCisvKiBTZXR1cCBOQVQgb24gdGhpcyBleHBlY3RlZCBjb25udHJhY2sgc28gaXQgZm9sbG93cyBtYXN0ZXIuICovCisvKiBJZiB3ZSBmYWlsIHRvIGdldCBhIGZyZWUgTkFUIHNsb3QsIHdlJ2xsIGdldCBkcm9wcGVkIG9uIGNvbmZpcm0gKi8KK3ZvaWQgbmZfbmF0X2ZvbGxvd19tYXN0ZXIoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2U7CisKKwkvKiBUaGlzIG11c3QgYmUgYSBmcmVzaCBvbmUuICovCisJQlVHX09OKGN0LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7CisKKwkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLworCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7CisJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwCisJCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuZHN0LnUzLmlwOworCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gc291cmNlIG1hbmlwICovCisJbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKKworCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KKwlyYW5nZS5mbGFncyA9IChJUF9OQVRfUkFOR0VfTUFQX0lQUyB8IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOworCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IGV4cC0+c2F2ZWRfcHJvdG87CisJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwCisJCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuc3JjLnUzLmlwOworCS8qIGhvb2sgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBoYXMgdG8gZG8gZGVzdGluYXRpb24gbWFuaXAgKi8KKwluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QUkVfUk9VVElORyk7Cit9CitFWFBPUlRfU1lNQk9MKG5mX25hdF9mb2xsb3dfbWFzdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaXJjLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2lyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGMwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2lyYy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBJUkMgZXh0ZW5zaW9uIGZvciBUQ1AgTkFUIGFsdGVyYXRpb24uCisgKgorICogKEMpIDIwMDAtMjAwMSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDQgUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiBJQk0gQ29ycG9yYXRpb24KKyAqIGJhc2VkIG9uIGEgY29weSBvZiBSUidzIGlwX25hdF9mdHAuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklSQyAoRENDKSBOQVQgaGVscGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwX25hdF9pcmMiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkgdW5zaWduZWQgaW50IG1hdGNobGVuLAorCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJY2hhciBidWZmZXJbc2l6ZW9mKCI0Mjk0OTY3Mjk2IDY1NjM1IildOworCXVfaW50MzJfdCBpcDsKKwl1X2ludDE2X3QgcG9ydDsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJREVCVUdQKCJJUkNfTkFUOiBpbmZvIChzZXEgJXUgKyAldSkgaW4gJXVcbiIsCisJICAgICAgIGV4cGVjdC0+c2VxLCBleHBfaXJjX2luZm8tPmxlbiwgbnRvaGwodGNwaC0+c2VxKSk7CisKKwkvKiBSZXBseSBjb21lcyBmcm9tIHNlcnZlci4gKi8KKwlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKKwlleHAtPmRpciA9IElQX0NUX0RJUl9SRVBMWTsKKwlleHAtPmV4cGVjdGZuID0gbmZfbmF0X2ZvbGxvd19tYXN0ZXI7CisKKwkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLworCWZvciAocG9ydCA9IG50b2hzKGV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQpOyBwb3J0ICE9IDA7IHBvcnQrKykgeworCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7CisJCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBvcnQgPT0gMCkKKwkJcmV0dXJuIE5GX0RST1A7CisKKwlpcCA9IG50b2hsKGV4cC0+bWFzdGVyLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXApOworCXNwcmludGYoYnVmZmVyLCAiJXUgJXUiLCBpcCwgcG9ydCk7CisJREVCVUdQKCJuZl9uYXRfaXJjOiBpbnNlcnRpbmcgJyVzJyA9PSAldS4ldS4ldS4ldSwgcG9ydCAldVxuIiwKKwkgICAgICAgYnVmZmVyLCBOSVBRVUFEKGlwKSwgcG9ydCk7CisKKwlyZXQgPSBuZl9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgZXhwLT5tYXN0ZXIsIGN0aW5mbywKKwkJCQkgICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBidWZmZXIsCisJCQkJICAgICAgIHN0cmxlbihidWZmZXIpKTsKKwlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKKwkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X2lyY19maW5pKHZvaWQpCit7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9pcmNfaG9vaywgTlVMTCk7CisJc3luY2hyb25pemVfcmN1KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX25hdF9pcmNfaW5pdCh2b2lkKQoreworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmZfbmF0X2lyY19ob29rKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9pcmNfaG9vaywgaGVscCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFByaW9yIHRvIDIuNi4xMSwgd2UgaGFkIGEgcG9ydHMgcGFyYW0uICBObyBsb25nZXIsIGJ1dCBkb24ndCBicmVhayB1c2Vycy4gKi8KK3N0YXRpYyBpbnQgd2Fybl9zZXQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FCisJICAgICAgICI6IGtlcm5lbCA+PSAyLjYuMTAgb25seSB1c2VzICdwb3J0cycgZm9yIGNvbm50cmFjayBtb2R1bGVzXG4iKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9wYXJhbV9jYWxsKHBvcnRzLCB3YXJuX3NldCwgTlVMTCwgTlVMTCwgMCk7CisKK21vZHVsZV9pbml0KG5mX25hdF9pcmNfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9uYXRfaXJjX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcHRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3BwdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU0NWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcHRwLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBuZl9uYXRfcHB0cC5jCisgKgorICogTkFUIHN1cHBvcnQgZm9yIFBQVFAgKFBvaW50IHRvIFBvaW50IFR1bm5lbGluZyBQcm90b2NvbCkuCisgKiBQUFRQIGlzIGEgYSBwcm90b2NvbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBwcml2YXRlIG5ldHdvcmtzLgorICogSXQgaXMgYSBzcGVjaWZpY2F0aW9uIGRlZmluZWQgYnkgTWljcm9zb2Z0IGFuZCBzb21lIHZlbmRvcnMKKyAqIHdvcmtpbmcgd2l0aCBNaWNyb3NvZnQuICBQUFRQIGlzIGJ1aWx0IG9uIHRvcCBvZiBhIG1vZGlmaWVkCisgKiB2ZXJzaW9uIG9mIHRoZSBJbnRlcm5ldCBHZW5lcmljIFJvdXRpbmcgRW5jYXBzdWxhdGlvbiBQcm90b2NvbC4KKyAqIEdSRSBpcyBkZWZpbmVkIGluIFJGQyAxNzAxIGFuZCBSRkMgMTcwMi4gIERvY3VtZW50YXRpb24gb2YKKyAqIFBQVFAgY2FuIGJlIGZvdW5kIGluIFJGQyAyNjM3CisgKgorICogKEMpIDIwMDAtMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQorICoKKyAqIFRPRE86IC0gTkFUIHRvIGEgdW5pcXVlIHR1cGxlLCBub3QgdG8gVENQIHNvdXJjZSBwb3J0CisgKiAJICAgKG5lZWRzIG5ldGZpbHRlciB0dXBsZSByZXNlcnZhdGlvbikKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgorCisjZGVmaW5lIE5GX05BVF9QUFRQX1ZFUlNJT04gIjMuMCIKKworI2RlZmluZSBSRVFfQ0lEKHJlcSwgb2ZmKQkJKCooX19iZTE2ICopKChjaGFyICopKHJlcSkgKyAob2ZmKSkpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5ldGZpbHRlciBOQVQgaGVscGVyIG1vZHVsZSBmb3IgUFBUUCIpOworTU9EVUxFX0FMSUFTKCJpcF9uYXRfcHB0cCIpOworCisjaWYgMAorZXh0ZXJuIGNvbnN0IGNoYXIgKnBwdHBfbXNnX25hbWVbXTsKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiAiIGZvcm1hdCwgX19GSUxFX18sIFwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcHRwX25hdF9leHBlY3RlZChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBjdC0+bWFzdGVyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpvdGhlcl9leHA7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0OworCXN0cnVjdCBuZl9jdF9wcHRwX21hc3RlciAqY3RfcHB0cF9pbmZvOworCXN0cnVjdCBuZl9uYXRfcHB0cCAqbmF0X3BwdHBfaW5mbzsKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOworCisJY3RfcHB0cF9pbmZvID0gJm5mY3RfaGVscChtYXN0ZXIpLT5oZWxwLmN0X3BwdHBfaW5mbzsKKwluYXRfcHB0cF9pbmZvID0gJm5mY3RfbmF0KG1hc3RlciktPmhlbHAubmF0X3BwdHBfaW5mbzsKKworCS8qIEFuZCBoZXJlIGdvZXMgdGhlIGdyYW5kIGZpbmFsZSBvZiBjb3Jyb3Npb24uLi4gKi8KKwlpZiAoZXhwLT5kaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKSB7CisJCURFQlVHUCgid2UgYXJlIFBOUy0+UEFDXG4iKTsKKwkJLyogdGhlcmVmb3JlLCBidWlsZCB0dXBsZSBmb3IgUEFDLT5QTlMgKi8KKwkJdC5zcmMubDNudW0gPSBBRl9JTkVUOworCQl0LnNyYy51My5pcCA9IG1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuc3JjLnUzLmlwOworCQl0LnNyYy51LmdyZS5rZXkgPSBjdF9wcHRwX2luZm8tPnBhY19jYWxsX2lkOworCQl0LmRzdC51My5pcCA9IG1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuZHN0LnUzLmlwOworCQl0LmRzdC51LmdyZS5rZXkgPSBjdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOworCQl0LmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOworCX0gZWxzZSB7CisJCURFQlVHUCgid2UgYXJlIFBBQy0+UE5TXG4iKTsKKwkJLyogYnVpbGQgdHVwbGUgZm9yIFBOUy0+UEFDICovCisJCXQuc3JjLmwzbnVtID0gQUZfSU5FVDsKKwkJdC5zcmMudTMuaXAgPSBtYXN0ZXItPnR1cGxlaGFzaFtleHAtPmRpcl0udHVwbGUuc3JjLnUzLmlwOworCQl0LnNyYy51LmdyZS5rZXkgPSBuYXRfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKKwkJdC5kc3QudTMuaXAgPSBtYXN0ZXItPnR1cGxlaGFzaFtleHAtPmRpcl0udHVwbGUuZHN0LnUzLmlwOworCQl0LmRzdC51LmdyZS5rZXkgPSBuYXRfcHB0cF9pbmZvLT5wYWNfY2FsbF9pZDsKKwkJdC5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKKwl9CisKKwlERUJVR1AoInRyeWluZyB0byB1bmV4cGVjdCBvdGhlciBkaXI6ICIpOworCU5GX0NUX0RVTVBfVFVQTEUoJnQpOworCW90aGVyX2V4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnQpOworCWlmIChvdGhlcl9leHApIHsKKwkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQob3RoZXJfZXhwKTsKKwkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQob3RoZXJfZXhwKTsKKwkJREVCVUdQKCJzdWNjZXNzXG4iKTsKKwl9IGVsc2UgeworCQlERUJVR1AoIm5vdCBmb3VuZCFcbiIpOworCX0KKworCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KKwlCVUdfT04oY3QtPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKKworCS8qIENoYW5nZSBzcmMgdG8gd2hlcmUgbWFzdGVyIHNlbmRzIHRvICovCisJcmFuZ2UuZmxhZ3MgPSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKKwlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKKwkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5kc3QudTMuaXA7CisJaWYgKGV4cC0+ZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgeworCQlyYW5nZS5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOworCQlyYW5nZS5taW4gPSByYW5nZS5tYXggPSBleHAtPnNhdmVkX3Byb3RvOworCX0KKwkvKiBob29rIGRvZXNuJ3QgbWF0dGVyLCBidXQgaXQgaGFzIHRvIGRvIHNvdXJjZSBtYW5pcCAqLworCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BPU1RfUk9VVElORyk7CisKKwkvKiBGb3IgRFNUIG1hbmlwLCBtYXAgcG9ydCBoZXJlIHRvIHdoZXJlIGl0J3MgZXhwZWN0ZWQuICovCisJcmFuZ2UuZmxhZ3MgPSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKKwlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKKwkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5zcmMudTMuaXA7CisJaWYgKGV4cC0+ZGlyID09IElQX0NUX0RJUl9SRVBMWSkgeworCQlyYW5nZS5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOworCQlyYW5nZS5taW4gPSByYW5nZS5tYXggPSBleHAtPnNhdmVkX3Byb3RvOworCX0KKwkvKiBob29rIGRvZXNuJ3QgbWF0dGVyLCBidXQgaXQgaGFzIHRvIGRvIGRlc3RpbmF0aW9uIG1hbmlwICovCisJbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUFJFX1JPVVRJTkcpOworfQorCisvKiBvdXRib3VuZCBwYWNrZXRzID09IGZyb20gUE5TIHRvIFBBQyAqLworc3RhdGljIGludAorcHB0cF9vdXRib3VuZF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICBzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgKmN0bGgsCisJCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKQorCit7CisJc3RydWN0IG5mX2N0X3BwdHBfbWFzdGVyICpjdF9wcHRwX2luZm87CisJc3RydWN0IG5mX25hdF9wcHRwICpuYXRfcHB0cF9pbmZvOworCXVfaW50MTZfdCBtc2c7CisJX19iZTE2IG5ld19jYWxsaWQ7CisJdW5zaWduZWQgaW50IGNpZF9vZmY7CisKKwljdF9wcHRwX2luZm8gID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfcHB0cF9pbmZvOworCW5hdF9wcHRwX2luZm8gPSAmbmZjdF9uYXQoY3QpLT5oZWxwLm5hdF9wcHRwX2luZm87CisKKwluZXdfY2FsbGlkID0gY3RfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKKworCXN3aXRjaCAobXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpKSB7CisJY2FzZSBQUFRQX09VVF9DQUxMX1JFUVVFU1Q6CisJCWNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIG9jcmVxLmNhbGxJRCk7CisJCS8qIEZJWE1FOiBpZGVhbGx5IHdlIHdvdWxkIHdhbnQgdG8gcmVzZXJ2ZSBhIGNhbGwgSUQKKwkJICogaGVyZS4gIGN1cnJlbnQgbmV0ZmlsdGVyIE5BVCBjb3JlIGlzIG5vdCBhYmxlIHRvIGRvCisJCSAqIHRoaXMgOiggRm9yIG5vdyB3ZSB1c2UgVENQIHNvdXJjZSBwb3J0LiBUaGlzIGJyZWFrcworCQkgKiBtdWx0aXBsZSBjYWxscyB3aXRoaW4gb25lIGNvbnRyb2wgc2Vzc2lvbiAqLworCisJCS8qIHNhdmUgb3JpZ2luYWwgY2FsbCBJRCBpbiBuYXRfaW5mbyAqLworCQluYXRfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZCA9IGN0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQ7CisKKwkJLyogZG9uJ3QgdXNlIHRjcGgtPnNvdXJjZSBzaW5jZSB3ZSBhcmUgYXQgYSBEU1RtYW5pcAorCQkgKiBob29rIChlLmcuIFBSRVJPVVRJTkcpIGFuZCBwa3QgaXMgbm90IG1hbmdsZWQgeWV0ICovCisJCW5ld19jYWxsaWQgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUudGNwLnBvcnQ7CisKKwkJLyogc2F2ZSBuZXcgY2FsbCBJRCBpbiBjdCBpbmZvICovCisJCWN0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQgPSBuZXdfY2FsbGlkOworCQlicmVhazsKKwljYXNlIFBQVFBfSU5fQ0FMTF9SRVBMWToKKwkJY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgaWNhY2suY2FsbElEKTsKKwkJYnJlYWs7CisJY2FzZSBQUFRQX0NBTExfQ0xFQVJfUkVRVUVTVDoKKwkJY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgY2xycmVxLmNhbGxJRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUCgidW5rbm93biBvdXRib3VuZCBwYWNrZXQgMHglMDR4OiVzXG4iLCBtc2csCisJCSAgICAgIChtc2cgPD0gUFBUUF9NU0dfTUFYKT8KKwkJICAgICAgcHB0cF9tc2dfbmFtZVttc2ddOnBwdHBfbXNnX25hbWVbMF0pOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFBQVFBfU0VUX0xJTktfSU5GTzoKKwkJLyogb25seSBuZWVkIHRvIE5BVCBpbiBjYXNlIFBBQyBpcyBiZWhpbmQgTkFUIGJveCAqLworCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1Q6CisJY2FzZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVQTFk6CisJY2FzZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVFVRVNUOgorCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVQTFk6CisJY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKKwljYXNlIFBQVFBfRUNIT19SRVBMWToKKwkJLyogbm8gbmVlZCB0byBhbHRlciBwYWNrZXQgKi8KKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBvbmx5IE9VVF9DQUxMX1JFUVVFU1QsIElOX0NBTExfUkVQTFksIENBTExfQ0xFQVJfUkVRVUVTVCBwYXNzCisJICogZG93biB0byBoZXJlICovCisJREVCVUdQKCJhbHRlcmluZyBjYWxsIGlkIGZyb20gMHglMDR4IHRvIDB4JTA0eFxuIiwKKwkJbnRvaHMoUkVRX0NJRChwcHRwUmVxLCBjaWRfb2ZmKSksIG50b2hzKG5ld19jYWxsaWQpKTsKKworCS8qIG1hbmdsZSBwYWNrZXQgKi8KKwlpZiAobmZfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRfb2ZmICsgc2l6ZW9mKHN0cnVjdCBwcHRwX3BrdF9oZHIpICsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5ld19jYWxsaWQpLCAoY2hhciAqKSZuZXdfY2FsbGlkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5ld19jYWxsaWQpKSA9PSAwKQorCQlyZXR1cm4gTkZfRFJPUDsKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9leHBfZ3JlKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHBlY3Rfb3JpZywKKwkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHBlY3RfcmVwbHkpCit7CisJc3RydWN0IG5mX2Nvbm4gKmN0ID0gZXhwZWN0X29yaWctPm1hc3RlcjsKKwlzdHJ1Y3QgbmZfY3RfcHB0cF9tYXN0ZXIgKmN0X3BwdHBfaW5mbzsKKwlzdHJ1Y3QgbmZfbmF0X3BwdHAgKm5hdF9wcHRwX2luZm87CisKKwljdF9wcHRwX2luZm8gID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfcHB0cF9pbmZvOworCW5hdF9wcHRwX2luZm8gPSAmbmZjdF9uYXQoY3QpLT5oZWxwLm5hdF9wcHRwX2luZm87CisKKwkvKiBzYXZlIG9yaWdpbmFsIFBBQyBjYWxsIElEIGluIG5hdF9pbmZvICovCisJbmF0X3BwdHBfaW5mby0+cGFjX2NhbGxfaWQgPSBjdF9wcHRwX2luZm8tPnBhY19jYWxsX2lkOworCisJLyogYWx0ZXIgZXhwZWN0YXRpb24gZm9yIFBOUy0+UEFDIGRpcmVjdGlvbiAqLworCWV4cGVjdF9vcmlnLT5zYXZlZF9wcm90by5ncmUua2V5ID0gY3RfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKKwlleHBlY3Rfb3JpZy0+dHVwbGUuc3JjLnUuZ3JlLmtleSA9IG5hdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOworCWV4cGVjdF9vcmlnLT50dXBsZS5kc3QudS5ncmUua2V5ID0gY3RfcHB0cF9pbmZvLT5wYWNfY2FsbF9pZDsKKwlleHBlY3Rfb3JpZy0+ZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOworCisJLyogYWx0ZXIgZXhwZWN0YXRpb24gZm9yIFBBQy0+UE5TIGRpcmVjdGlvbiAqLworCWV4cGVjdF9yZXBseS0+c2F2ZWRfcHJvdG8uZ3JlLmtleSA9IG5hdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOworCWV4cGVjdF9yZXBseS0+dHVwbGUuc3JjLnUuZ3JlLmtleSA9IG5hdF9wcHRwX2luZm8tPnBhY19jYWxsX2lkOworCWV4cGVjdF9yZXBseS0+dHVwbGUuZHN0LnUuZ3JlLmtleSA9IGN0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQ7CisJZXhwZWN0X3JlcGx5LT5kaXIgPSBJUF9DVF9ESVJfUkVQTFk7Cit9CisKKy8qIGluYm91bmQgcGFja2V0cyA9PSBmcm9tIFBBQyB0byBQTlMgKi8KK3N0YXRpYyBpbnQKK3BwdHBfaW5ib3VuZF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSBzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgKmN0bGgsCisJCSB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpCit7CisJc3RydWN0IG5mX25hdF9wcHRwICpuYXRfcHB0cF9pbmZvOworCXVfaW50MTZfdCBtc2c7CisJX19iZTE2IG5ld19wY2lkOworCXVuc2lnbmVkIGludCBwY2lkX29mZjsKKworCW5hdF9wcHRwX2luZm8gPSAmbmZjdF9uYXQoY3QpLT5oZWxwLm5hdF9wcHRwX2luZm87CisJbmV3X3BjaWQgPSBuYXRfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKKworCXN3aXRjaCAobXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpKSB7CisJY2FzZSBQUFRQX09VVF9DQUxMX1JFUExZOgorCQlwY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgb2NhY2sucGVlcnNDYWxsSUQpOworCQlicmVhazsKKwljYXNlIFBQVFBfSU5fQ0FMTF9DT05ORUNUOgorCQlwY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgaWNjb24ucGVlcnNDYWxsSUQpOworCQlicmVhazsKKwljYXNlIFBQVFBfSU5fQ0FMTF9SRVFVRVNUOgorCQkvKiBvbmx5IG5lZWQgdG8gbmF0IGluIGNhc2UgUEFDIGlzIGJlaGluZCBOQVQgYm94ICovCisJCXJldHVybiBORl9BQ0NFUFQ7CisJY2FzZSBQUFRQX1dBTl9FUlJPUl9OT1RJRlk6CisJCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCB3YW5lcnIucGVlcnNDYWxsSUQpOworCQlicmVhazsKKwljYXNlIFBQVFBfQ0FMTF9ESVNDT05ORUNUX05PVElGWToKKwkJcGNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIGRpc2MuY2FsbElEKTsKKwkJYnJlYWs7CisJY2FzZSBQUFRQX1NFVF9MSU5LX0lORk86CisJCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBzZXRsaW5rLnBlZXJzQ2FsbElEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKCJ1bmtub3duIGluYm91bmQgcGFja2V0ICVzXG4iLCAobXNnIDw9IFBQVFBfTVNHX01BWCk/CisJCQlwcHRwX21zZ19uYW1lW21zZ106cHB0cF9tc2dfbmFtZVswXSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1Q6CisJY2FzZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVQTFk6CisJY2FzZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVFVRVNUOgorCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVQTFk6CisJY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKKwljYXNlIFBQVFBfRUNIT19SRVBMWToKKwkJLyogbm8gbmVlZCB0byBhbHRlciBwYWNrZXQgKi8KKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBvbmx5IE9VVF9DQUxMX1JFUExZLCBJTl9DQUxMX0NPTk5FQ1QsIElOX0NBTExfUkVRVUVTVCwKKwkgKiBXQU5fRVJST1JfTk9USUZZLCBDQUxMX0RJU0NPTk5FQ1RfTk9USUZZIHBhc3MgZG93biBoZXJlICovCisKKwkvKiBtYW5nbGUgcGFja2V0ICovCisJREVCVUdQKCJhbHRlcmluZyBwZWVyIGNhbGwgaWQgZnJvbSAweCUwNHggdG8gMHglMDR4XG4iLAorCQludG9ocyhSRVFfQ0lEKHBwdHBSZXEsIHBjaWRfb2ZmKSksIG50b2hzKG5ld19wY2lkKSk7CisKKwlpZiAobmZfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lkX29mZiArIHNpemVvZihzdHJ1Y3QgcHB0cF9wa3RfaGRyKSArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IFBwdHBDb250cm9sSGVhZGVyKSwKKwkJCQkgICAgIHNpemVvZihuZXdfcGNpZCksIChjaGFyICopJm5ld19wY2lkLAorCQkJCSAgICAgc2l6ZW9mKG5ld19wY2lkKSkgPT0gMCkKKwkJcmV0dXJuIE5GX0RST1A7CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIGludCBfX2luaXQgbmZfbmF0X2hlbHBlcl9wcHRwX2luaXQodm9pZCkKK3sKKwluZl9uYXRfbmVlZF9ncmUoKTsKKworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmZfbmF0X3BwdHBfaG9va19vdXRib3VuZCkpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfcHB0cF9ob29rX291dGJvdW5kLCBwcHRwX291dGJvdW5kX3BrdCk7CisKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5mX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfcHB0cF9ob29rX2luYm91bmQsIHBwdHBfaW5ib3VuZF9wa3QpOworCisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfcHB0cF9ob29rX2V4cF9ncmUpKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmZfbmF0X3BwdHBfaG9va19leHBfZ3JlLCBwcHRwX2V4cF9ncmUpOworCisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4sIHBwdHBfbmF0X2V4cGVjdGVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mX25hdF9oZWxwZXJfcHB0cF9maW5pKHZvaWQpCit7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4sIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfcHB0cF9ob29rX2V4cF9ncmUsIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfcHB0cF9ob29rX2luYm91bmQsIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfcHB0cF9ob29rX291dGJvdW5kLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKK30KKworbW9kdWxlX2luaXQobmZfbmF0X2hlbHBlcl9wcHRwX2luaXQpOworbW9kdWxlX2V4aXQobmZfbmF0X2hlbHBlcl9wcHRwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkZTU3OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBuZl9uYXRfcHJvdG9fZ3JlLmMKKyAqCisgKiBOQVQgcHJvdG9jb2wgaGVscGVyIG1vZHVsZSBmb3IgR1JFLgorICoKKyAqIEdSRSBpcyBhIGdlbmVyaWMgZW5jYXBzdWxhdGlvbiBwcm90b2NvbCwgd2hpY2ggaXMgZ2VuZXJhbGx5IG5vdCB2ZXJ5CisgKiBzdWl0ZWQgZm9yIE5BVCwgYXMgaXQgaGFzIG5vIHByb3RvY29sLXNwZWNpZmljIHBhcnQgYXMgcG9ydCBudW1iZXJzLgorICoKKyAqIEl0IGhhcyBhbiBvcHRpb25hbCBrZXkgZmllbGQsIHdoaWNoIG1heSBoZWxwIHVzIGRpc3Rpbmd1aXNoaW5nIHR3bworICogY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgc2FtZSB0d28gaG9zdHMuCisgKgorICogR1JFIGlzIGRlZmluZWQgaW4gUkZDIDE3MDEgYW5kIFJGQyAxNzAyLCBhcyB3ZWxsIGFzIFJGQyAyNzg0CisgKgorICogUFBUUCBpcyBidWlsdCBvbiB0b3Agb2YgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIEdSRSwgYW5kIGhhcyBhIG1hbmRhdG9yeQorICogZmllbGQgY2FsbGVkICJDYWxsSUQiLCB3aGljaCBzZXJ2ZXMgdXMgZm9yIHRoZSBzYW1lIHB1cnBvc2UgYXMgdGhlIGtleQorICogZmllbGQgaW4gcGxhaW4gR1JFLgorICoKKyAqIERvY3VtZW50YXRpb24gYWJvdXQgUFBUUCBjYW4gYmUgZm91bmQgaW4gUkZDIDI2MzcKKyAqCisgKiAoQykgMjAwMC0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRmaWx0ZXIgTkFUIHByb3RvY29sIGhlbHBlciBtb2R1bGUgZm9yIEdSRSIpOworCisjaWYgMAorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6JXM6ICIgZm9ybWF0LCBfX0ZJTEVfXywgXAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBpcyBrZXkgaW4gZ2l2ZW4gcmFuZ2UgYmV0d2VlbiBtaW4gYW5kIG1heCAqLworc3RhdGljIGludAorZ3JlX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCSAgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCisJICAgICBjb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptaW4sCisJICAgICBjb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptYXgpCit7CisJX19iZTE2IGtleTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJa2V5ID0gdHVwbGUtPnNyYy51LmdyZS5rZXk7CisJZWxzZQorCQlrZXkgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKKworCXJldHVybiBudG9ocyhrZXkpID49IG50b2hzKG1pbi0+Z3JlLmtleSkgJiYKKwkgICAgICAgbnRvaHMoa2V5KSA8PSBudG9ocyhtYXgtPmdyZS5rZXkpOworfQorCisvKiBnZW5lcmF0ZSB1bmlxdWUgdHVwbGUgLi4uICovCitzdGF0aWMgaW50CitncmVfdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCSBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkJIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjb25udHJhY2spCit7CisJc3RhdGljIHVfaW50MTZfdCBrZXk7CisJX19iZTE2ICprZXlwdHI7CisJdW5zaWduZWQgaW50IG1pbiwgaSwgcmFuZ2Vfc2l6ZTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJa2V5cHRyID0gJnR1cGxlLT5zcmMudS5ncmUua2V5OworCWVsc2UKKwkJa2V5cHRyID0gJnR1cGxlLT5kc3QudS5ncmUua2V5OworCisJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKKwkJREVCVUdQKCIlcDogTkFUaW5nIEdSRSBQUFRQXG4iLCBjb25udHJhY2spOworCQltaW4gPSAxOworCQlyYW5nZV9zaXplID0gMHhmZmZmOworCX0gZWxzZSB7CisJCW1pbiA9IG50b2hzKHJhbmdlLT5taW4uZ3JlLmtleSk7CisJCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LmdyZS5rZXkpIC0gbWluICsgMTsKKwl9CisKKwlERUJVR1AoIm1pbiA9ICV1LCByYW5nZV9zaXplID0gJXVcbiIsIG1pbiwgcmFuZ2Vfc2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBrZXkrKykgeworCQkqa2V5cHRyID0gaHRvbnMobWluICsga2V5ICUgcmFuZ2Vfc2l6ZSk7CisJCWlmICghbmZfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlERUJVR1AoIiVwOiBubyBOQVQgbWFwcGluZ1xuIiwgY29ubnRyYWNrKTsKKwlyZXR1cm4gMDsKK30KKworLyogbWFuaXB1bGF0ZSBhIEdSRSBwYWNrZXQgYWNjb3JkaW5nIHRvIG1hbmlwdHlwZSAqLworc3RhdGljIGludAorZ3JlX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKKwkgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKK3sKKwlzdHJ1Y3QgZ3JlX2hkciAqZ3JlaDsKKwlzdHJ1Y3QgZ3JlX2hkcl9wcHRwICpwZ3JlaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKKwl1bnNpZ25lZCBpbnQgaGRyb2ZmID0gaXBoZHJvZmYgKyBpcGgtPmlobCAqIDQ7CisKKwkvKiBwZ3JlaCBpbmNsdWRlcyB0d28gb3B0aW9uYWwgMzJiaXQgZmllbGRzIHdoaWNoIGFyZSBub3QgcmVxdWlyZWQKKwkgKiB0byBiZSB0aGVyZS4gIFRoYXQncyB3aGVyZSB0aGUgbWFnaWMgJzgnIGNvbWVzIGZyb20gKi8KKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIHNpemVvZigqcGdyZWgpIC0gOCkpCisJCXJldHVybiAwOworCisJZ3JlaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGhkcm9mZjsKKwlwZ3JlaCA9IChzdHJ1Y3QgZ3JlX2hkcl9wcHRwICopZ3JlaDsKKworCS8qIHdlIG9ubHkgaGF2ZSBkZXN0aW5hdGlvbiBtYW5pcCBvZiBhIHBhY2tldCwgc2luY2UgJ3NvdXJjZSBrZXknCisJICogaXMgbm90IHByZXNlbnQgaW4gdGhlIHBhY2tldCBpdHNlbGYgKi8KKwlpZiAobWFuaXB0eXBlICE9IElQX05BVF9NQU5JUF9EU1QpCisJCXJldHVybiAxOworCXN3aXRjaCAoZ3JlaC0+dmVyc2lvbikgeworCWNhc2UgMDoKKwkJaWYgKCFncmVoLT5rZXkpIHsKKwkJCURFQlVHUCgiY2FuJ3QgbmF0IEdSRSB3L28ga2V5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChncmVoLT5jc3VtKSB7CisJCQkvKiBGSVhNRTogTmV2ZXIgdGVzdGVkIHRoaXMgY29kZS4uLiAqLworCQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNChncmVfY3N1bShncmVoKSwgKnBza2IsCisJCQkJCSAgICAgICAqKGdyZV9rZXkoZ3JlaCkpLAorCQkJCQkgICAgICAgdHVwbGUtPmRzdC51LmdyZS5rZXksIDApOworCQl9CisJCSooZ3JlX2tleShncmVoKSkgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKKwkJYnJlYWs7CisJY2FzZSBHUkVfVkVSU0lPTl9QUFRQOgorCQlERUJVR1AoImNhbGxfaWQgLT4gMHglMDR4XG4iLCBudG9ocyh0dXBsZS0+ZHN0LnUuZ3JlLmtleSkpOworCQlwZ3JlaC0+Y2FsbF9pZCA9IHR1cGxlLT5kc3QudS5ncmUua2V5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoImNhbid0IG5hdCB1bmtub3duIEdSRSB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5mX25hdF9wcm90b2NvbCBncmUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJCT0gIkdSRSIsCisJLnByb3RvbnVtCQk9IElQUFJPVE9fR1JFLAorCS5tYW5pcF9wa3QJCT0gZ3JlX21hbmlwX3BrdCwKKwkuaW5fcmFuZ2UJCT0gZ3JlX2luX3JhbmdlLAorCS51bmlxdWVfdHVwbGUJCT0gZ3JlX3VuaXF1ZV90dXBsZSwKKyNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKKwkucmFuZ2VfdG9fbmZhdHRyCT0gbmZfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyLAorCS5uZmF0dHJfdG9fcmFuZ2UJPSBuZl9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2UsCisjZW5kaWYKK307CisKK2ludCBfX2luaXQgbmZfbmF0X3Byb3RvX2dyZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mX25hdF9wcm90b2NvbF9yZWdpc3RlcigmZ3JlKTsKK30KKwordm9pZCBfX2V4aXQgbmZfbmF0X3Byb3RvX2dyZV9maW5pKHZvaWQpCit7CisJbmZfbmF0X3Byb3RvY29sX3VucmVnaXN0ZXIoJmdyZSk7Cit9CisKK21vZHVsZV9pbml0KG5mX25hdF9wcm90b19ncmVfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9uYXRfcHJvdG9fZ3JlX2ZpbmkpOworCit2b2lkIG5mX25hdF9uZWVkX2dyZSh2b2lkKQoreworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9uZWVkX2dyZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZmQ3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYwpAQCAtMCwwICsxLDg2IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKworc3RhdGljIGludAoraWNtcF9pbl9yYW5nZShjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkgICAgICBjb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptaW4sCisJICAgICAgY29uc3QgdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byAqbWF4KQoreworCXJldHVybiBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkgPj0gbnRvaHMobWluLT5pY21wLmlkKSAmJgorCSAgICAgICBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkgPD0gbnRvaHMobWF4LT5pY21wLmlkKTsKK30KKworc3RhdGljIGludAoraWNtcF91bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCSAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCisJCSAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0YXRpYyB1X2ludDE2X3QgaWQ7CisJdW5zaWduZWQgaW50IHJhbmdlX3NpemU7CisJdW5zaWduZWQgaW50IGk7CisKKwlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC5pY21wLmlkKSAtIG50b2hzKHJhbmdlLT5taW4uaWNtcC5pZCkgKyAxOworCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLworCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKQorCQlyYW5nZV9zaXplID0gMHhGRkZGOworCisJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgaWQrKykgeworCQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IGh0b25zKG50b2hzKHJhbmdlLT5taW4uaWNtcC5pZCkgKworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZCAlIHJhbmdlX3NpemUpKTsKKwkJaWYgKCFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpY21wX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKKwkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOworCXN0cnVjdCBpY21waGRyICpoZHI7CisJdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKKworCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRyb2ZmICsgc2l6ZW9mKCpoZHIpKSkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGljbXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGhkcm9mZik7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmaGRyLT5jaGVja3N1bSwgKnBza2IsCisJCQkgICAgICAgaGRyLT51bi5lY2hvLmlkLCB0dXBsZS0+c3JjLnUuaWNtcC5pZCwgMCk7CisJaGRyLT51bi5lY2hvLmlkID0gdHVwbGUtPnNyYy51LmljbXAuaWQ7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX2ljbXAgPSB7CisJLm5hbWUJCQk9ICJJQ01QIiwKKwkucHJvdG9udW0JCT0gSVBQUk9UT19JQ01QLAorCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJLm1hbmlwX3BrdAkJPSBpY21wX21hbmlwX3BrdCwKKwkuaW5fcmFuZ2UJCT0gaWNtcF9pbl9yYW5nZSwKKwkudW5pcXVlX3R1cGxlCQk9IGljbXBfdW5pcXVlX3R1cGxlLAorI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQorCS5yYW5nZV90b19uZmF0dHIJPSBuZl9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCisJLm5mYXR0cl90b19yYW5nZQk9IG5mX25hdF9wb3J0X25mYXR0cl90b19yYW5nZSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjZhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmg+CisKK3N0YXRpYyBpbnQKK3RjcF9pbl9yYW5nZShjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCSAgICAgY29uc3QgdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byAqbWluLAorCSAgICAgY29uc3QgdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byAqbWF4KQoreworCV9fYmUxNiBwb3J0OworCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCQlwb3J0ID0gdHVwbGUtPnNyYy51LnRjcC5wb3J0OworCWVsc2UKKwkJcG9ydCA9IHR1cGxlLT5kc3QudS50Y3AucG9ydDsKKworCXJldHVybiBudG9ocyhwb3J0KSA+PSBudG9ocyhtaW4tPnRjcC5wb3J0KSAmJgorCSAgICAgICBudG9ocyhwb3J0KSA8PSBudG9ocyhtYXgtPnRjcC5wb3J0KTsKK30KKworc3RhdGljIGludAordGNwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCisJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJc3RhdGljIHVfaW50MTZfdCBwb3J0OworCV9fYmUxNiAqcG9ydHB0cjsKKwl1bnNpZ25lZCBpbnQgcmFuZ2Vfc2l6ZSwgbWluLCBpOworCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCQlwb3J0cHRyID0gJnR1cGxlLT5zcmMudS50Y3AucG9ydDsKKwllbHNlCisJCXBvcnRwdHIgPSAmdHVwbGUtPmRzdC51LnRjcC5wb3J0OworCisJLyogSWYgbm8gcmFuZ2Ugc3BlY2lmaWVkLi4uICovCisJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKKwkJLyogSWYgaXQncyBkc3QgcmV3cml0ZSwgY2FuJ3QgY2hhbmdlIHBvcnQgKi8KKwkJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKQorCQkJcmV0dXJuIDA7CisKKwkJLyogTWFwIHByaXZpbGVnZWQgb250byBwcml2aWxlZ2VkLiAqLworCQlpZiAobnRvaHMoKnBvcnRwdHIpIDwgMTAyNCkgeworCQkJLyogTG9vc2UgY29udmVudGlvbjogPj4gNTEyIGlzIGNyZWRlbnRpYWwgcGFzc2luZyAqLworCQkJaWYgKG50b2hzKCpwb3J0cHRyKTw1MTIpIHsKKwkJCQltaW4gPSAxOworCQkJCXJhbmdlX3NpemUgPSA1MTEgLSBtaW4gKyAxOworCQkJfSBlbHNlIHsKKwkJCQltaW4gPSA2MDA7CisJCQkJcmFuZ2Vfc2l6ZSA9IDEwMjMgLSBtaW4gKyAxOworCQkJfQorCQl9IGVsc2UgeworCQkJbWluID0gMTAyNDsKKwkJCXJhbmdlX3NpemUgPSA2NTUzNSAtIDEwMjQgKyAxOworCQl9CisJfSBlbHNlIHsKKwkJbWluID0gbnRvaHMocmFuZ2UtPm1pbi50Y3AucG9ydCk7CisJCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LnRjcC5wb3J0KSAtIG1pbiArIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7CisJCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOworCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKKwkgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKKwlzdHJ1Y3QgdGNwaGRyICpoZHI7CisJdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKKwlfX2JlMzIgb2xkaXAsIG5ld2lwOworCV9fYmUxNiAqcG9ydHB0ciwgbmV3cG9ydCwgb2xkcG9ydDsKKwlpbnQgaGRyc2l6ZSA9IDg7IC8qIFRDUCBjb25uZWN0aW9uIHRyYWNraW5nIGd1YXJhbnRlZXMgdGhpcyBtdWNoICovCisKKwkvKiB0aGlzIGNvdWxkIGJlIGEgaW5uZXIgaGVhZGVyIHJldHVybmVkIGluIGljbXAgcGFja2V0OyBpbiBzdWNoCisJICAgY2FzZXMgd2UgY2Fubm90IHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgc2luY2UgaXQgaXMgb3V0c2lkZSBvZgorCSAgIHRoZSA4IGJ5dGVzIG9mIHRyYW5zcG9ydCBsYXllciBoZWFkZXJzIHdlIGFyZSBndWFyYW50ZWVkICovCisJaWYgKCgqcHNrYiktPmxlbiA+PSBoZHJvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpCisJCWhkcnNpemUgPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisKKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIGhkcnNpemUpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKKwloZHIgPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaGRyb2ZmKTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgeworCQkvKiBHZXQgcmlkIG9mIHNyYyBpcCBhbmQgc3JjIHB0ICovCisJCW9sZGlwID0gaXBoLT5zYWRkcjsKKwkJbmV3aXAgPSB0dXBsZS0+c3JjLnUzLmlwOworCQluZXdwb3J0ID0gdHVwbGUtPnNyYy51LnRjcC5wb3J0OworCQlwb3J0cHRyID0gJmhkci0+c291cmNlOworCX0gZWxzZSB7CisJCS8qIEdldCByaWQgb2YgZHN0IGlwIGFuZCBkc3QgcHQgKi8KKwkJb2xkaXAgPSBpcGgtPmRhZGRyOworCQluZXdpcCA9IHR1cGxlLT5kc3QudTMuaXA7CisJCW5ld3BvcnQgPSB0dXBsZS0+ZHN0LnUudGNwLnBvcnQ7CisJCXBvcnRwdHIgPSAmaGRyLT5kZXN0OworCX0KKworCW9sZHBvcnQgPSAqcG9ydHB0cjsKKwkqcG9ydHB0ciA9IG5ld3BvcnQ7CisKKwlpZiAoaGRyc2l6ZSA8IHNpemVvZigqaGRyKSkKKwkJcmV0dXJuIDE7CisKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkaXAsIG5ld2lwLCAxKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkcG9ydCwgbmV3cG9ydCwgMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX3RjcCA9IHsKKwkubmFtZQkJCT0gIlRDUCIsCisJLnByb3RvbnVtCQk9IElQUFJPVE9fVENQLAorCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJLm1hbmlwX3BrdAkJPSB0Y3BfbWFuaXBfcGt0LAorCS5pbl9yYW5nZQkJPSB0Y3BfaW5fcmFuZ2UsCisJLnVuaXF1ZV90dXBsZQkJPSB0Y3BfdW5pcXVlX3R1cGxlLAorI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQorCS5yYW5nZV90b19uZmF0dHIJPSBuZl9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCisJLm5mYXR0cl90b19yYW5nZQk9IG5mX25hdF9wb3J0X25mYXR0cl90b19yYW5nZSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGNlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oPgorCitzdGF0aWMgaW50Cit1ZHBfaW5fcmFuZ2UoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkgICAgIGNvbnN0IHVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gKm1pbiwKKwkgICAgIGNvbnN0IHVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gKm1heCkKK3sKKwlfX2JlMTYgcG9ydDsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJcG9ydCA9IHR1cGxlLT5zcmMudS51ZHAucG9ydDsKKwllbHNlCisJCXBvcnQgPSB0dXBsZS0+ZHN0LnUudWRwLnBvcnQ7CisKKwlyZXR1cm4gbnRvaHMocG9ydCkgPj0gbnRvaHMobWluLT51ZHAucG9ydCkgJiYKKwkgICAgICAgbnRvaHMocG9ydCkgPD0gbnRvaHMobWF4LT51ZHAucG9ydCk7Cit9CisKK3N0YXRpYyBpbnQKK3VkcF91bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0YXRpYyB1X2ludDE2X3QgcG9ydDsKKwlfX2JlMTYgKnBvcnRwdHI7CisJdW5zaWduZWQgaW50IHJhbmdlX3NpemUsIG1pbiwgaTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJcG9ydHB0ciA9ICZ0dXBsZS0+c3JjLnUudWRwLnBvcnQ7CisJZWxzZQorCQlwb3J0cHRyID0gJnR1cGxlLT5kc3QudS51ZHAucG9ydDsKKworCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLworCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKSB7CisJCS8qIElmIGl0J3MgZHN0IHJld3JpdGUsIGNhbid0IGNoYW5nZSBwb3J0ICovCisJCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX0RTVCkKKwkJCXJldHVybiAwOworCisJCWlmIChudG9ocygqcG9ydHB0cikgPCAxMDI0KSB7CisJCQkvKiBMb29zZSBjb252ZW50aW9uOiA+PiA1MTIgaXMgY3JlZGVudGlhbCBwYXNzaW5nICovCisJCQlpZiAobnRvaHMoKnBvcnRwdHIpPDUxMikgeworCQkJCW1pbiA9IDE7CisJCQkJcmFuZ2Vfc2l6ZSA9IDUxMSAtIG1pbiArIDE7CisJCQl9IGVsc2UgeworCQkJCW1pbiA9IDYwMDsKKwkJCQlyYW5nZV9zaXplID0gMTAyMyAtIG1pbiArIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQltaW4gPSAxMDI0OworCQkJcmFuZ2Vfc2l6ZSA9IDY1NTM1IC0gMTAyNCArIDE7CisJCX0KKwl9IGVsc2UgeworCQltaW4gPSBudG9ocyhyYW5nZS0+bWluLnVkcC5wb3J0KTsKKwkJcmFuZ2Vfc2l6ZSA9IG50b2hzKHJhbmdlLT5tYXgudWRwLnBvcnQpIC0gbWluICsgMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBwb3J0KyspIHsKKwkJKnBvcnRwdHIgPSBodG9ucyhtaW4gKyBwb3J0ICUgcmFuZ2Vfc2l6ZSk7CisJCWlmICghbmZfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGN0KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordWRwX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICAgdW5zaWduZWQgaW50IGlwaGRyb2ZmLAorCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCSAgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOworCXN0cnVjdCB1ZHBoZHIgKmhkcjsKKwl1bnNpZ25lZCBpbnQgaGRyb2ZmID0gaXBoZHJvZmYgKyBpcGgtPmlobCo0OworCV9fYmUzMiBvbGRpcCwgbmV3aXA7CisJX19iZTE2ICpwb3J0cHRyLCBuZXdwb3J0OworCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBoZHJvZmYgKyBzaXplb2YoKmhkcikpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKKwloZHIgPSAoc3RydWN0IHVkcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaGRyb2ZmKTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgeworCQkvKiBHZXQgcmlkIG9mIHNyYyBpcCBhbmQgc3JjIHB0ICovCisJCW9sZGlwID0gaXBoLT5zYWRkcjsKKwkJbmV3aXAgPSB0dXBsZS0+c3JjLnUzLmlwOworCQluZXdwb3J0ID0gdHVwbGUtPnNyYy51LnVkcC5wb3J0OworCQlwb3J0cHRyID0gJmhkci0+c291cmNlOworCX0gZWxzZSB7CisJCS8qIEdldCByaWQgb2YgZHN0IGlwIGFuZCBkc3QgcHQgKi8KKwkJb2xkaXAgPSBpcGgtPmRhZGRyOworCQluZXdpcCA9IHR1cGxlLT5kc3QudTMuaXA7CisJCW5ld3BvcnQgPSB0dXBsZS0+ZHN0LnUudWRwLnBvcnQ7CisJCXBvcnRwdHIgPSAmaGRyLT5kZXN0OworCX0KKwlpZiAoaGRyLT5jaGVjayB8fCAoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkaXAsIG5ld2lwLCAxKTsKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmaGRyLT5jaGVjaywgKnBza2IsICpwb3J0cHRyLCBuZXdwb3J0LAorCQkJCSAgICAgICAwKTsKKwkJaWYgKCFoZHItPmNoZWNrKQorCQkJaGRyLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCX0KKwkqcG9ydHB0ciA9IG5ld3BvcnQ7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX3VkcCA9IHsKKwkubmFtZQkJCT0gIlVEUCIsCisJLnByb3RvbnVtCQk9IElQUFJPVE9fVURQLAorCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJLm1hbmlwX3BrdAkJPSB1ZHBfbWFuaXBfcGt0LAorCS5pbl9yYW5nZQkJPSB1ZHBfaW5fcmFuZ2UsCisJLnVuaXF1ZV90dXBsZQkJPSB1ZHBfdW5pcXVlX3R1cGxlLAorI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQorCS5yYW5nZV90b19uZmF0dHIJPSBuZl9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCisJLm5mYXR0cl90b19yYW5nZQk9IG5mX25hdF9wb3J0X25mYXR0cl90b19yYW5nZSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdW5rbm93bi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191bmtub3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZDAyMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdW5rbm93bi5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIFRoZSAidW5rbm93biIgcHJvdG9jb2wuICBUaGlzIGlzIHdoYXQgaXMgdXNlZCBmb3IgcHJvdG9jb2xzIHdlCisgKiBkb24ndCB1bmRlcnN0YW5kLiAgSXQncyByZXR1cm5lZCBieSBpcF9jdF9maW5kX3Byb3RvKCkuCisgKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKworc3RhdGljIGludCB1bmtub3duX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXBfdHlwZSwKKwkJCSAgICBjb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptaW4sCisJCQkgICAgY29uc3QgdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byAqbWF4KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVua25vd25fdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJCWNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkJCWVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCQkJCWNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwkvKiBTb3JyeTogd2UgY2FuJ3QgaGVscCB5b3U7IGlmIGl0J3Mgbm90IHVuaXF1ZSwgd2UgY2FuJ3QgZnJvYgorCSAgIGFueXRoaW5nLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit1bmtub3duX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgdW5zaWduZWQgaW50IGlwaGRyb2ZmLAorCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQoreworCXJldHVybiAxOworfQorCitzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF91bmtub3duX3Byb3RvY29sID0geworCS5uYW1lCQkJPSAidW5rbm93biIsCisJLyogLm1lIGlzbid0IHNldDogZ2V0dGluZyBhIHJlZiB0byB0aGlzIGNhbm5vdCBmYWlsLiAqLworCS5tYW5pcF9wa3QJCT0gdW5rbm93bl9tYW5pcF9wa3QsCisJLmluX3JhbmdlCQk9IHVua25vd25faW5fcmFuZ2UsCisJLnVuaXF1ZV90dXBsZQkJPSB1bmtub3duX3VuaXF1ZV90dXBsZSwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjhlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYwpAQCAtMCwwICsxLDM0MyBAQAorLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyogRXZlcnl0aGluZyBhYm91dCB0aGUgcnVsZXMgZm9yIE5BVC4gKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgTkFUX1ZBTElEX0hPT0tTICgoMTw8TkZfSVBfUFJFX1JPVVRJTkcpIHwgKDE8PE5GX0lQX1BPU1RfUk9VVElORykgfCAoMTw8TkZfSVBfTE9DQUxfT1VUKSkKKworc3RhdGljIHN0cnVjdAoreworCXN0cnVjdCBpcHRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBpcHRfc3RhbmRhcmQgZW50cmllc1szXTsKKwlzdHJ1Y3QgaXB0X2Vycm9yIHRlcm07Cit9IG5hdF9pbml0aWFsX3RhYmxlIF9faW5pdGRhdGEgPSB7CisJLnJlcGwgPSB7CisJCS5uYW1lID0gIm5hdCIsCisJCS52YWxpZF9ob29rcyA9IE5BVF9WQUxJRF9IT09LUywKKwkJLm51bV9lbnRyaWVzID0gNCwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzICsgc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAorCQkuaG9va19lbnRyeSA9IHsKKwkJCVtORl9JUF9QUkVfUk9VVElOR10gPSAwLAorCQkJW05GX0lQX1BPU1RfUk9VVElOR10gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKKwkJLnVuZGVyZmxvdyA9IHsKKwkJCVtORl9JUF9QUkVfUk9VVElOR10gPSAwLAorCQkJW05GX0lQX1BPU1RfUk9VVElOR10gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKKwl9LAorCS5lbnRyaWVzID0geworCQkvKiBQUkVfUk9VVElORyAqLworCQl7CisJCQkuZW50cnkgPSB7CisJICAgIAkJCS50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCSAgICAJCQkubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCQl9LAorCQkJLnRhcmdldCA9IHsKKwkJCQkudGFyZ2V0ID0geworCQkJCQkudSA9IHsKKwkJCQkJCS50YXJnZXRfc2l6ZSA9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwKKwkJCQkJfSwKKwkJCQl9LAorCQkJCS52ZXJkaWN0ID0gLU5GX0FDQ0VQVCAtIDEsCisJCQl9LAorCQl9LAorCQkvKiBQT1NUX1JPVVRJTkcgKi8KKwkJeworCQkJLmVudHJ5ID0geworCSAgICAJCQkudGFyZ2V0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwkgICAgCQkJLm5leHRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkJfSwKKwkJCS50YXJnZXQgPSB7CisJCQkJLnRhcmdldCA9IHsKKwkJCQkJLnUgPSB7CisJCQkJCQkudGFyZ2V0X3NpemUgPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksCisJCQkJCX0sCisJCQkJfSwKKwkJCQkudmVyZGljdCA9IC1ORl9BQ0NFUFQgLSAxLAorCQkJfSwKKwkJfSwKKwkJLyogTE9DQUxfT1VUICovCisJCXsKKwkJCS5lbnRyeSA9IHsKKwkgICAgCQkJLnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCisJICAgIAkJCS5uZXh0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwkJCX0sCisJCQkudGFyZ2V0ID0geworCQkJCS50YXJnZXQgPSB7CisJCQkJCS51ID0geworCQkJCQkJLnRhcmdldF9zaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLAorCQkJCQl9LAorCQkJCX0sCisJCQkJLnZlcmRpY3QgPSAtTkZfQUNDRVBUIC0gMSwKKwkJCX0sCisJCX0sCisJfSwKKwkvKiBFUlJPUiAqLworCS50ZXJtID0geworCQkuZW50cnkgPSB7CisJCQkudGFyZ2V0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwkJCS5uZXh0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKKwkJfSwKKwkJLnRhcmdldCA9IHsKKwkJCS50YXJnZXQgPSB7CisJCQkJLnUgPSB7CisJCQkJCS51c2VyID0geworCQkJCQkJLnRhcmdldF9zaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldCkpLAorCQkJCQkJLm5hbWUgPSBJUFRfRVJST1JfVEFSR0VULAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQkJLmVycm9ybmFtZSA9ICJFUlJPUiIsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFibGUgbmF0X3RhYmxlID0geworCS5uYW1lCQk9ICJuYXQiLAorCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKKwkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAorCS5tZQkJPSBUSElTX01PRFVMRSwKKwkuYWYJCT0gQUZfSU5FVCwKK307CisKKy8qIFNvdXJjZSBOQVQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXB0X3NuYXRfdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKK3sKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisKKwlORl9DVF9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcpOworCisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOworCisJLyogQ29ubmVjdGlvbiBtdXN0IGJlIHZhbGlkIGFuZCBuZXcuICovCisJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8CisJICAgICAgICAgICAgICAgICAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKSk7CisJTkZfQ1RfQVNTRVJUKG91dCk7CisKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIGhvb2tudW0pOworfQorCisvKiBCZWZvcmUgMi42LjExIHdlIGRpZCBpbXBsaWNpdCBzb3VyY2UgTkFUIGlmIHJlcXVpcmVkLiBXYXJuIGFib3V0IGNoYW5nZS4gKi8KK3N0YXRpYyB2b2lkIHdhcm5faWZfZXh0cmFfbWFuZ2xlKF9fYmUzMiBkc3RpcCwgX19iZTMyIHNyY2lwKQoreworCXN0YXRpYyBpbnQgd2FybmVkID0gMDsKKwlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGRzdGlwIH0gfSB9OworCXN0cnVjdCBydGFibGUgKnJ0OworCisJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpICE9IDApCisJCXJldHVybjsKKworCWlmIChydC0+cnRfc3JjICE9IHNyY2lwICYmICF3YXJuZWQpIHsKKwkJcHJpbnRrKCJOQVQ6IG5vIGxvbmdlciBzdXBwb3J0IGltcGxpY2l0IHNvdXJjZSBsb2NhbCBOQVRcbiIpOworCQlwcmludGsoIk5BVDogcGFja2V0IHNyYyAldS4ldS4ldS4ldSAtPiBkc3QgJXUuJXUuJXUuJXVcbiIsCisJCSAgICAgICBOSVBRVUFEKHNyY2lwKSwgTklQUVVBRChkc3RpcCkpOworCQl3YXJuZWQgPSAxOworCX0KKwlpcF9ydF9wdXQocnQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwdF9kbmF0X3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkJICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKKwkJCQkgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCit7CisJc3RydWN0IG5mX2Nvbm4gKmN0OworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCisJTkZfQ1RfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgfHwKKwkJICAgICBob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCk7CisKKwljdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbyk7CisKKwkvKiBDb25uZWN0aW9uIG11c3QgYmUgdmFsaWQgYW5kIG5ldy4gKi8KKwlORl9DVF9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQpKTsKKworCWlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCAmJgorCSAgICBtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykKKwkJd2Fybl9pZl9leHRyYV9tYW5nbGUoKCpwc2tiKS0+bmguaXBoLT5kYWRkciwKKwkJCQkgICAgIG1yLT5yYW5nZVswXS5taW5faXApOworCisJcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBob29rbnVtKTsKK30KKworc3RhdGljIGludCBpcHRfc25hdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCisJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKworCS8qIE11c3QgYmUgYSB2YWxpZCByYW5nZSAqLworCWlmIChtci0+cmFuZ2VzaXplICE9IDEpIHsKKwkJcHJpbnRrKCJTTkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpcHRfZG5hdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCisJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKworCS8qIE11c3QgYmUgYSB2YWxpZCByYW5nZSAqLworCWlmIChtci0+cmFuZ2VzaXplICE9IDEpIHsKKwkJcHJpbnRrKCJETkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW5saW5lIHVuc2lnbmVkIGludAorYWxsb2NfbnVsbF9iaW5kaW5nKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgc3RydWN0IG5mX25hdF9pbmZvICppbmZvLAorCQkgICB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwkvKiBGb3JjZSByYW5nZSB0byB0aGlzIElQOyBsZXQgcHJvdG8gZGVjaWRlIG1hcHBpbmcgZm9yCisJICAgcGVyLXByb3RvIHBhcnRzIChoZW5jZSBub3QgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkuCisJICAgVXNlIHJlcGx5IGluIGNhc2UgaXQncyBhbHJlYWR5IGJlZW4gbWFuZ2xlZCAoZWcgbG9jYWwgcGFja2V0KS4KKwkqLworCV9fYmUzMiBpcAorCQk9IChIT09LMk1BTklQKGhvb2tudW0pID09IElQX05BVF9NQU5JUF9TUkMKKwkJICAgPyBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUzLmlwCisJCSAgIDogY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51My5pcCk7CisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZQorCQk9IHsgSVBfTkFUX1JBTkdFX01BUF9JUFMsIGlwLCBpcCwgeyAwIH0sIHsgMCB9IH07CisKKwlERUJVR1AoIkFsbG9jYXRpbmcgTlVMTCBiaW5kaW5nIGZvciAlcCAoJXUuJXUuJXUuJXUpXG4iLAorCSAgICAgICBjdCwgTklQUVVBRChpcCkpOworCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBob29rbnVtKTsKK30KKwordW5zaWduZWQgaW50CithbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKHN0cnVjdCBuZl9jb25uICpjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX25hdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwlfX2JlMzIgaXAKKwkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCisJCSAgID8gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51My5pcAorCQkgICA6IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMudTMuaXApOworCXVfaW50MTZfdCBhbGwKKwkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCisJCSAgID8gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51LmFsbAorCQkgICA6IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMudS5hbGwpOworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2UKKwkJPSB7IElQX05BVF9SQU5HRV9NQVBfSVBTLCBpcCwgaXAsIHsgYWxsIH0sIHsgYWxsIH0gfTsKKworCURFQlVHUCgiQWxsb2NhdGluZyBOVUxMIGJpbmRpbmcgZm9yIGNvbmZpcm1lZCAlcCAoJXUuJXUuJXUuJXUpXG4iLAorCSAgICAgICBjdCwgTklQUVVBRChpcCkpOworCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBob29rbnVtKTsKK30KKworaW50IG5mX25hdF9ydWxlX2ZpbmQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICBzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKworCXJldCA9IGlwdF9kb190YWJsZShwc2tiLCBob29rbnVtLCBpbiwgb3V0LCAmbmF0X3RhYmxlKTsKKworCWlmIChyZXQgPT0gTkZfQUNDRVBUKSB7CisJCWlmICghbmZfbmF0X2luaXRpYWxpemVkKGN0LCBIT09LMk1BTklQKGhvb2tudW0pKSkKKwkJCS8qIE5VTCBtYXBwaW5nICovCisJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGluZm8sIGhvb2tudW0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3NuYXRfcmVnID0geworCS5uYW1lCQk9ICJTTkFUIiwKKwkudGFyZ2V0CQk9IGlwdF9zbmF0X3RhcmdldCwKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCisJLnRhYmxlCQk9ICJuYXQiLAorCS5ob29rcwkJPSAxIDw8IE5GX0lQX1BPU1RfUk9VVElORywKKwkuY2hlY2tlbnRyeQk9IGlwdF9zbmF0X2NoZWNrZW50cnksCisJLmZhbWlseQkJPSBBRl9JTkVULAorfTsKKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X2RuYXRfcmVnID0geworCS5uYW1lCQk9ICJETkFUIiwKKwkudGFyZ2V0CQk9IGlwdF9kbmF0X3RhcmdldCwKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCisJLnRhYmxlCQk9ICJuYXQiLAorCS5ob29rcwkJPSAoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9PVVQpLAorCS5jaGVja2VudHJ5CT0gaXB0X2RuYXRfY2hlY2tlbnRyeSwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCit9OworCitpbnQgX19pbml0IG5mX25hdF9ydWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaXB0X3JlZ2lzdGVyX3RhYmxlKCZuYXRfdGFibGUsICZuYXRfaW5pdGlhbF90YWJsZS5yZXBsKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfc25hdF9yZWcpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byB1bnJlZ2lzdGVyX3RhYmxlOworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZG5hdF9yZWcpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byB1bnJlZ2lzdGVyX3NuYXQ7CisKKwlyZXR1cm4gcmV0OworCisgdW5yZWdpc3Rlcl9zbmF0OgorCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfc25hdF9yZWcpOworIHVucmVnaXN0ZXJfdGFibGU6CisJaXB0X3VucmVnaXN0ZXJfdGFibGUoJm5hdF90YWJsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5mX25hdF9ydWxlX2NsZWFudXAodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKKwlpcHRfdW5yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc2lwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTI0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NpcC5jCkBAIC0wLDAgKzEsMjgzIEBACisvKiBTSVAgZXh0ZW5zaW9uIGZvciBVRFAgTkFUIGFsdGVyYXRpb24uCisgKgorICogKEMpIDIwMDUgYnkgQ2hyaXN0aWFuIEhlbnRzY2hlbCA8Y2hlbnRzY2hlbEBhcm5ldC5jb20uYXI+CisgKiBiYXNlZCBvbiBSUidzIGlwX25hdF9mdHAuYyBhbmQgb3RoZXIgbW9kdWxlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ2hyaXN0aWFuIEhlbnRzY2hlbCA8Y2hlbnRzY2hlbEBhcm5ldC5jb20uYXI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNJUCBOQVQgaGVscGVyIik7CitNT0RVTEVfQUxJQVMoImlwX25hdF9zaXAiKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitzdHJ1Y3QgYWRkcl9tYXAgeworCXN0cnVjdCB7CisJCWNoYXIJCXNyY1tzaXplb2YoIm5ubi5ubm4ubm5uLm5ubjpubm5ubiIpXTsKKwkJY2hhcgkJZHN0W3NpemVvZigibm5uLm5ubi5ubm4ubm5uOm5ubm5uIildOworCQl1bnNpZ25lZCBpbnQJc3JjbGVuLCBzcmNpcGxlbjsKKwkJdW5zaWduZWQgaW50CWRzdGxlbiwgZHN0aXBsZW47CisJfSBhZGRyW0lQX0NUX0RJUl9NQVhdOworfTsKKworc3RhdGljIHZvaWQgYWRkcl9tYXBfaW5pdChzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBhZGRyX21hcCAqbWFwKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQ7CisJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKKwl1bnNpZ25lZCBpbnQgbjsKKworCWZvciAoZGlyID0gMDsgZGlyIDwgSVBfQ1RfRElSX01BWDsgZGlyKyspIHsKKwkJdCA9ICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGU7CisKKwkJbiA9IHNwcmludGYobWFwLT5hZGRyW2Rpcl0uc3JjLCAiJXUuJXUuJXUuJXUiLAorCQkJICAgIE5JUFFVQUQodC0+c3JjLnUzLmlwKSk7CisJCW1hcC0+YWRkcltkaXJdLnNyY2lwbGVuID0gbjsKKwkJbiArPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLnNyYyArIG4sICI6JXUiLAorCQkJICAgICBudG9ocyh0LT5zcmMudS51ZHAucG9ydCkpOworCQltYXAtPmFkZHJbZGlyXS5zcmNsZW4gPSBuOworCisJCW4gPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLmRzdCwgIiV1LiV1LiV1LiV1IiwKKwkJCSAgICBOSVBRVUFEKHQtPmRzdC51My5pcCkpOworCQltYXAtPmFkZHJbZGlyXS5kc3RpcGxlbiA9IG47CisJCW4gKz0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5kc3QgKyBuLCAiOiV1IiwKKwkJCSAgICAgbnRvaHModC0+ZHN0LnUudWRwLnBvcnQpKTsKKwkJbWFwLT5hZGRyW2Rpcl0uZHN0bGVuID0gbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWFwX3NpcF9hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQlzdHJ1Y3QgbmZfY29ubiAqY3QsIGNvbnN0IGNoYXIgKipkcHRyLCBzaXplX3QgZGxlbiwKKwkJCWVudW0gc2lwX2hlYWRlcl9wb3MgcG9zLCBzdHJ1Y3QgYWRkcl9tYXAgKm1hcCkKK3sKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXVuc2lnbmVkIGludCBtYXRjaGxlbiwgbWF0Y2hvZmYsIGFkZHJsZW47CisJY2hhciAqYWRkcjsKKworCWlmIChjdF9zaXBfZ2V0X2luZm8oY3QsICpkcHRyLCBkbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgcG9zKSA8PSAwKQorCQlyZXR1cm4gMTsKKworCWlmICgobWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uc3JjaXBsZW4gfHwKKwkgICAgIG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLnNyY2xlbikgJiYKKwkgICAgbWVtY21wKCpkcHRyICsgbWF0Y2hvZmYsIG1hcC0+YWRkcltkaXJdLnNyYywgbWF0Y2hsZW4pID09IDApIHsKKwkJYWRkciAgICA9IG1hcC0+YWRkclshZGlyXS5kc3Q7CisJCWFkZHJsZW4gPSBtYXAtPmFkZHJbIWRpcl0uZHN0bGVuOworCX0gZWxzZSBpZiAoKG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLmRzdGlwbGVuIHx8CisJCSAgICBtYXRjaGxlbiA9PSBtYXAtPmFkZHJbZGlyXS5kc3RsZW4pICYmCisJCSAgIG1lbWNtcCgqZHB0ciArIG1hdGNob2ZmLCBtYXAtPmFkZHJbZGlyXS5kc3QsIG1hdGNobGVuKSA9PSAwKSB7CisJCWFkZHIgICAgPSBtYXAtPmFkZHJbIWRpcl0uc3JjOworCQlhZGRybGVuID0gbWFwLT5hZGRyWyFkaXJdLnNyY2xlbjsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7CisKKwlpZiAoIW5mX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNob2ZmLCBtYXRjaGxlbiwgYWRkciwgYWRkcmxlbikpCisJCXJldHVybiAwOworCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcF9uYXRfc2lwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgICAgY29uc3QgY2hhciAqKmRwdHIpCit7CisJZW51bSBzaXBfaGVhZGVyX3BvcyBwb3M7CisJc3RydWN0IGFkZHJfbWFwIG1hcDsKKwlpbnQgZGF0YW9mZiwgZGF0YWxlbjsKKworCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOworCWlmIChkYXRhbGVuIDwgc2l6ZW9mKCJTSVAvMi4wIikgLSAxKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCWFkZHJfbWFwX2luaXQoY3QsICZtYXApOworCisJLyogQmFzaWMgcnVsZXM6IHJlcXVlc3RzIGFuZCByZXNwb25zZXMuICovCisJaWYgKHN0cm5jbXAoKmRwdHIsICJTSVAvMi4wIiwgc2l6ZW9mKCJTSVAvMi4wIikgLSAxKSAhPSAwKSB7CisJCS8qIDEwLjI6IENvbnN0cnVjdGluZyB0aGUgUkVHSVNURVIgUmVxdWVzdDoKKwkJICoKKwkJICogVGhlICJ1c2VyaW5mbyIgYW5kICJAIiBjb21wb25lbnRzIG9mIHRoZSBTSVAgVVJJIE1VU1QgTk9UCisJCSAqIGJlIHByZXNlbnQuCisJCSAqLworCQlpZiAoZGF0YWxlbiA+PSBzaXplb2YoIlJFR0lTVEVSIikgLSAxICYmCisJCSAgICBzdHJuY21wKCpkcHRyLCAiUkVHSVNURVIiLCBzaXplb2YoIlJFR0lTVEVSIikgLSAxKSA9PSAwKQorCQkJcG9zID0gUE9TX1JFR19SRVFfVVJJOworCQllbHNlCisJCQlwb3MgPSBQT1NfUkVRX1VSSTsKKworCQlpZiAoIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBwb3MsICZtYXApKQorCQkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJaWYgKCFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX0ZST00sICZtYXApIHx8CisJICAgICFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX1RPLCAmbWFwKSB8fAorCSAgICAhbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19WSUEsICZtYXApIHx8CisJICAgICFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgUE9TX0NPTlRBQ1QsICZtYXApKQorCQlyZXR1cm4gTkZfRFJPUDsKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1hbmdsZV9zaXBfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICAgICAgY29uc3QgY2hhciAqKmRwdHIsIHNpemVfdCBkbGVuLAorCQkJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZsZW4sCisJCQkJICAgICAgZW51bSBzaXBfaGVhZGVyX3BvcyBwb3MpCit7CisJdW5zaWduZWQgaW50IG1hdGNobGVuLCBtYXRjaG9mZjsKKworCWlmIChjdF9zaXBfZ2V0X2luZm8oY3QsICpkcHRyLCBkbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgcG9zKSA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICghbmZfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBidWZmZXIsIGJ1ZmZsZW4pKQorCQlyZXR1cm4gMDsKKworCS8qIFdlIG5lZWQgdG8gcmVsb2FkIHRoaXMuIFRoYW5rcyBQYXRyaWNrLiAqLworCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWFuZ2xlX2NvbnRlbnRfbGVuKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICAgY29uc3QgY2hhciAqZHB0cikKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YW9mZiwgbWF0Y2hvZmYsIG1hdGNobGVuOworCWNoYXIgYnVmZmVyW3NpemVvZigiNjU1MzYiKV07CisJaW50IGJ1ZmZsZW47CisKKwlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCS8qIEdldCBhY3R1YWwgU0RQIGxlbmdodCAqLworCWlmIChjdF9zaXBfZ2V0X2luZm8oY3QsIGRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsICZtYXRjaG9mZiwKKwkgICAgICAgICAgICAgICAgICAgICZtYXRjaGxlbiwgUE9TX1NEUF9IRUFERVIpID4gMCkgeworCisJCS8qIHNpbmNlIGN0X3NpcF9nZXRfaW5mbygpIGdpdmUgdXMgYSBwb2ludGVyIHBhc3NpbmcgJ3Y9JworCQkgICB3ZSBuZWVkIHRvIGFkZCAyIGJ5dGVzIGluIHRoaXMgY291bnQuICovCisJCWludCBjX2xlbiA9ICgqcHNrYiktPmxlbiAtIGRhdGFvZmYgLSBtYXRjaG9mZiArIDI7CisKKwkJLyogTm93LCB1cGRhdGUgU0RQIGxlbmd0aCAqLworCQlpZiAoY3Rfc2lwX2dldF9pbmZvKGN0LCBkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCAmbWF0Y2hvZmYsCisJCSAgICAgICAgICAgICAgICAgICAgJm1hdGNobGVuLCBQT1NfQ09OVEVOVCkgPiAwKSB7CisKKwkJCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1IiwgY19sZW4pOworCQkJcmV0dXJuIG5mX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAorCQkJCQkJCW1hdGNob2ZmLCBtYXRjaGxlbiwKKwkJCQkJCQlidWZmZXIsIGJ1ZmZsZW4pOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1hbmdsZV9zZHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICAgICBfX2JlMzIgbmV3aXAsIHVfaW50MTZfdCBwb3J0LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmRwdHIpCit7CisJY2hhciBidWZmZXJbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm4iKV07CisJdW5zaWduZWQgaW50IGRhdGFvZmYsIGJ1ZmZsZW47CisKKwlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCS8qIE1hbmdsZSBvd25lciBhbmQgY29udGFjdCBpbmZvLiAqLworCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChuZXdpcCkpOworCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCisJICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sIFBPU19PV05FUl9JUDQpKQorCQlyZXR1cm4gMDsKKworCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCisJICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sIFBPU19DT05ORUNUSU9OX0lQNCkpCisJCXJldHVybiAwOworCisJLyogTWFuZ2xlIG1lZGlhIHBvcnQuICovCisJYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUiLCBwb3J0KTsKKwlpZiAoIW1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsICZkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAorCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfTUVESUEpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBtYW5nbGVfY29udGVudF9sZW4ocHNrYiwgY3RpbmZvLCBjdCwgZHB0cik7Cit9CisKKy8qIFNvLCB0aGlzIHBhY2tldCBoYXMgaGl0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoaW5nIGNvZGUuCisgICBNYW5nbGUgaXQsIGFuZCBjaGFuZ2UgdGhlIGV4cGVjdGF0aW9uIHRvIG1hdGNoIHRoZSBuZXcgdmVyc2lvbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbmF0X3NkcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpkcHRyKQoreworCXN0cnVjdCBuZl9jb25uICpjdCA9IGV4cC0+bWFzdGVyOworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJX19iZTMyIG5ld2lwOworCXVfaW50MTZfdCBwb3J0OworCisJREVCVUdQKCJpcF9uYXRfc2RwKCk6XG4iKTsKKworCS8qIENvbm5lY3Rpb24gd2lsbCBjb21lIGZyb20gcmVwbHkgKi8KKwluZXdpcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLmlwOworCisJZXhwLT50dXBsZS5kc3QudTMuaXAgPSBuZXdpcDsKKwlleHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydDsKKwlleHAtPmRpciA9ICFkaXI7CisKKwkvKiBXaGVuIHlvdSBzZWUgdGhlIHBhY2tldCwgd2UgbmVlZCB0byBOQVQgaXQgdGhlIHNhbWUgYXMgdGhlCisJICAgdGhpcyBvbmUuICovCisJZXhwLT5leHBlY3RmbiA9IG5mX25hdF9mb2xsb3dfbWFzdGVyOworCisJLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KKwlmb3IgKHBvcnQgPSBudG9ocyhleHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0KTsgcG9ydCAhPSAwOyBwb3J0KyspIHsKKwkJZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKHBvcnQpOworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChwb3J0ID09IDApCisJCXJldHVybiBORl9EUk9QOworCisJaWYgKCFtYW5nbGVfc2RwKHBza2IsIGN0aW5mbywgY3QsIG5ld2lwLCBwb3J0LCBkcHRyKSkgeworCQluZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOworCQlyZXR1cm4gTkZfRFJPUDsKKwl9CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mX25hdF9zaXBfZmluaSh2b2lkKQoreworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfc2lwX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfc2RwX2hvb2ssIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuZl9uYXRfc2lwX2luaXQodm9pZCkKK3sKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5mX25hdF9zaXBfaG9vaykpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmZfbmF0X3NkcF9ob29rKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9zaXBfaG9vaywgaXBfbmF0X3NpcCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX25hdF9zZHBfaG9vaywgaXBfbmF0X3NkcCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG5mX25hdF9zaXBfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9uYXRfc2lwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTI1MjhmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKQEAgLTAsMCArMSwxMzMyIEBACisvKgorICogbmZfbmF0X3NubXBfYmFzaWMuYworICoKKyAqIEJhc2ljIFNOTVAgQXBwbGljYXRpb24gTGF5ZXIgR2F0ZXdheQorICoKKyAqIFRoaXMgSVAgTkFUIG1vZHVsZSBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggU05NUCBuZXR3b3JrCisgKiBkaXNjb3ZlcnkgYW5kIG1vbml0b3JpbmcgYXBwbGljYXRpb25zIHdoZXJlIHRhcmdldCBuZXR3b3JrcyB1c2UKKyAqIGNvbmZsaWN0aW5nIHByaXZhdGUgYWRkcmVzcyByZWFsbXMuCisgKgorICogU3RhdGljIE5BVCBpcyB1c2VkIHRvIHJlbWFwIHRoZSBuZXR3b3JrcyBmcm9tIHRoZSB2aWV3IG9mIHRoZSBuZXR3b3JrCisgKiBtYW5hZ2VtZW50IHN5c3RlbSBhdCB0aGUgSVAgbGF5ZXIsIGFuZCB0aGlzIG1vZHVsZSByZW1hcHMgc29tZSBhcHBsaWNhdGlvbgorICogbGF5ZXIgYWRkcmVzc2VzIHRvIG1hdGNoLgorICoKKyAqIFRoZSBzaW1wbGVzdCBmb3JtIG9mIEFMRyBpcyBwZXJmb3JtZWQsIHdoZXJlIG9ubHkgdGFnZ2VkIElQIGFkZHJlc3NlcworICogYXJlIG1vZGlmaWVkLiAgVGhlIG1vZHVsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIE1JQiBhd2FyZSBhbmQgb25seSBzY2FucworICogbWVzc2FnZXMgYXQgdGhlIEFTTi4xL0JFUiBsZXZlbC4KKyAqCisgKiBDdXJyZW50bHksIG9ubHkgU05NUHYxIGFuZCBTTk1QdjIgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBNb3JlIGluZm9ybWF0aW9uIG9uIEFMRyBhbmQgYXNzb2NpYXRlZCBpc3N1ZXMgY2FuIGJlIGZvdW5kIGluCisgKiBSRkMgMjk2MgorICoKKyAqIFRoZSBBU0IuMS9CRVIgcGFyc2luZyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZ3hzbm1wIHBhY2thZ2UgYnkgR3JlZ29yeQorICogTWNMZWFuICYgSm9jaGVuIEZyaWVkcmljaCwgc3RyaXBwZWQgZG93biBmb3IgdXNlIGluIHRoZSBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFJQIEludGVybmV0ICh3d3cucnBpLm5ldC5hdSkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVXBkYXRlczoKKyAqIDIwMDAtMDgtMDY6IENvbnZlcnQgdG8gbmV3IGhlbHBlciBBUEkgKEhhcmFsZCBXZWx0ZSkuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmFzaWMgU05NUCBBcHBsaWNhdGlvbiBMYXllciBHYXRld2F5Iik7CitNT0RVTEVfQUxJQVMoImlwX25hdF9zbm1wX2Jhc2ljIik7CisKKyNkZWZpbmUgU05NUF9QT1JUIDE2MQorI2RlZmluZSBTTk1QX1RSQVBfUE9SVCAxNjIKKyNkZWZpbmUgTk9DVDEobikgKCoodTggKiluKQorCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIERFRklORV9TUElOTE9DSyhzbm1wX2xvY2spOworCisvKgorICogQXBwbGljYXRpb24gbGF5ZXIgYWRkcmVzcyBtYXBwaW5nIG1pbWljcyB0aGUgTkFUIG1hcHBpbmcsIGJ1dAorICogb25seSBmb3IgdGhlIGZpcnN0IG9jdGV0IGluIHRoaXMgY2FzZSAoYSBtb3JlIGZsZXhpYmxlIHN5c3RlbQorICogY2FuIGJlIGltcGxlbWVudGVkIGlmIG5lZWRlZCkuCisgKi8KK3N0cnVjdCBvY3QxX21hcAoreworCXVfaW50OF90IGZyb207CisJdV9pbnQ4X3QgdG87Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEJhc2ljIEFTTi4xIGRlY29kaW5nIHJvdXRpbmVzIChneHNubXAgYXV0aG9yIERpcmsgV2lzc2UpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDbGFzcyAqLworI2RlZmluZSBBU04xX1VOSQkwCS8qIFVuaXZlcnNhbCAqLworI2RlZmluZSBBU04xX0FQTAkxCS8qIEFwcGxpY2F0aW9uICovCisjZGVmaW5lIEFTTjFfQ1RYCTIJLyogQ29udGV4dCAqLworI2RlZmluZSBBU04xX1BSVgkzCS8qIFByaXZhdGUgKi8KKworLyogVGFnICovCisjZGVmaW5lIEFTTjFfRU9DCTAJLyogRW5kIE9mIENvbnRlbnRzICovCisjZGVmaW5lIEFTTjFfQk9MCTEJLyogQm9vbGVhbiAqLworI2RlZmluZSBBU04xX0lOVAkyCS8qIEludGVnZXIgKi8KKyNkZWZpbmUgQVNOMV9CVFMJMwkvKiBCaXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfT1RTCTQJLyogT2N0ZXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfTlVMCTUJLyogTnVsbCAqLworI2RlZmluZSBBU04xX09KSQk2CS8qIE9iamVjdCBJZGVudGlmaWVyICAqLworI2RlZmluZSBBU04xX09KRAk3CS8qIE9iamVjdCBEZXNjcmlwdGlvbiAqLworI2RlZmluZSBBU04xX0VYVAk4CS8qIEV4dGVybmFsICovCisjZGVmaW5lIEFTTjFfU0VRCTE2CS8qIFNlcXVlbmNlICovCisjZGVmaW5lIEFTTjFfU0VUCTE3CS8qIFNldCAqLworI2RlZmluZSBBU04xX05VTVNUUgkxOAkvKiBOdW1lcmljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfUFJOU1RSCTE5CS8qIFByaW50YWJsZSBTdHJpbmcgKi8KKyNkZWZpbmUgQVNOMV9URVhTVFIJMjAJLyogVGVsZXRleHQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklEU1RSCTIxCS8qIFZpZGVvIFN0cmluZyAqLworI2RlZmluZSBBU04xX0lBNVNUUgkyMgkvKiBJQTUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVU5JVElNCTIzCS8qIFVuaXZlcnNhbCBUaW1lICovCisjZGVmaW5lIEFTTjFfR0VOVElNCTI0CS8qIEdlbmVyYWwgVGltZSAqLworI2RlZmluZSBBU04xX0dSQVNUUgkyNQkvKiBHcmFwaGljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklTU1RSCTI2CS8qIFZpc2libGUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfR0VOU1RSCTI3CS8qIEdlbmVyYWwgU3RyaW5nICovCisKKy8qIFByaW1pdGl2ZSAvIENvbnN0cnVjdGVkIG1ldGhvZHMqLworI2RlZmluZSBBU04xX1BSSQkwCS8qIFByaW1pdGl2ZSAqLworI2RlZmluZSBBU04xX0NPTgkxCS8qIENvbnN0cnVjdGVkICovCisKKy8qCisgKiBFcnJvciBjb2Rlcy4KKyAqLworI2RlZmluZSBBU04xX0VSUl9OT0VSUk9SCQkwCisjZGVmaW5lIEFTTjFfRVJSX0RFQ19FTVBUWQkJMgorI2RlZmluZSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENICTMKKyNkZWZpbmUgQVNOMV9FUlJfREVDX0xFTkdUSF9NSVNNQVRDSAk0CisjZGVmaW5lIEFTTjFfRVJSX0RFQ19CQURWQUxVRQkJNQorCisvKgorICogQVNOLjEgY29udGV4dC4KKyAqLworc3RydWN0IGFzbjFfY3R4Cit7CisJaW50IGVycm9yOwkJCS8qIEVycm9yIGNvbmRpdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgKnBvaW50ZXI7CQkvKiBPY3RldCBqdXN0IHRvIGJlIGRlY29kZWQgKi8KKwl1bnNpZ25lZCBjaGFyICpiZWdpbjsJCS8qIEZpcnN0IG9jdGV0ICovCisJdW5zaWduZWQgY2hhciAqZW5kOwkJLyogT2N0ZXQgYWZ0ZXIgbGFzdCBvY3RldCAqLworfTsKKworLyoKKyAqIE9jdGV0IHN0cmluZyAobm90IG51bGwgdGVybWluYXRlZCkKKyAqLworc3RydWN0IGFzbjFfb2N0c3RyCit7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuOworfTsKKworc3RhdGljIHZvaWQgYXNuMV9vcGVuKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQoreworCWN0eC0+YmVnaW4gPSBidWY7CisJY3R4LT5lbmQgPSBidWYgKyBsZW47CisJY3R4LT5wb2ludGVyID0gYnVmOworCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9OT0VSUk9SOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX29jdGV0X2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgY2hhciAqY2gpCit7CisJaWYgKGN0eC0+cG9pbnRlciA+PSBjdHgtPmVuZCkgeworCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0VNUFRZOworCQlyZXR1cm4gMDsKKwl9CisJKmNoID0gKihjdHgtPnBvaW50ZXIpKys7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdGFnX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgaW50ICp0YWcpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCSp0YWcgPSAwOworCisJZG8KKwl7CisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisJCSp0YWcgPDw9IDc7CisJCSp0YWcgfD0gY2ggJiAweDdGOworCX0gd2hpbGUgKChjaCAmIDB4ODApID09IDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX2lkX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnRhZykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmNscyA9IChjaCAmIDB4QzApID4+IDY7CisJKmNvbiA9IChjaCAmIDB4MjApID4+IDU7CisJKnRhZyA9IChjaCAmIDB4MUYpOworCisJaWYgKCp0YWcgPT0gMHgxRikgeworCQlpZiAoIWFzbjFfdGFnX2RlY29kZShjdHgsIHRhZykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbGVuZ3RoX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoLCBjbnQ7CisKKwlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2ggPT0gMHg4MCkKKwkJKmRlZiA9IDA7CisJZWxzZSB7CisJCSpkZWYgPSAxOworCisJCWlmIChjaCA8IDB4ODApCisJCQkqbGVuID0gY2g7CisJCWVsc2UgeworCQkJY250ID0gKHVuc2lnbmVkIGNoYXIpIChjaCAmIDB4N0YpOworCQkJKmxlbiA9IDA7CisKKwkJCXdoaWxlIChjbnQgPiAwKSB7CisJCQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQkJCXJldHVybiAwOworCQkJCSpsZW4gPDw9IDg7CisJCQkJKmxlbiB8PSBjaDsKKwkJCQljbnQtLTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9oZWFkZXJfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiplb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp0YWcpCit7CisJdW5zaWduZWQgaW50IGRlZiwgbGVuOworCisJaWYgKCFhc24xX2lkX2RlY29kZShjdHgsIGNscywgY29uLCB0YWcpKQorCQlyZXR1cm4gMDsKKworCWRlZiA9IGxlbiA9IDA7CisJaWYgKCFhc24xX2xlbmd0aF9kZWNvZGUoY3R4LCAmZGVmLCAmbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGVmKQorCQkqZW9jID0gY3R4LT5wb2ludGVyICsgbGVuOworCWVsc2UKKwkJKmVvYyA9IE5VTEw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfZW9jX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgY2hhciAqZW9jKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisKKwlpZiAoZW9jID09IDApIHsKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY2ggIT0gMHgwMCkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGNoICE9IDB4MDApIHsKKwkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENIOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKGN0eC0+cG9pbnRlciAhPSBlb2MpIHsKKwkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfTEVOR1RIX01JU01BVENIOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX251bGxfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICplb2MpCit7CisJY3R4LT5wb2ludGVyID0gZW9jOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX2xvbmdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgIGxlbjsKKworCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQlyZXR1cm4gMDsKKworCSppbnRlZ2VyID0gKHNpZ25lZCBjaGFyKSBjaDsKKwlsZW4gPSAxOworCisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoKytsZW4gPiBzaXplb2YgKGxvbmcpKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCisJCSppbnRlZ2VyIDw8PSA4OworCQkqaW50ZWdlciB8PSBjaDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdWludF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICppbnRlZ2VyKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJdW5zaWduZWQgaW50ICBsZW47CisKKwlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJcmV0dXJuIDA7CisKKwkqaW50ZWdlciA9IGNoOworCWlmIChjaCA9PSAwKSBsZW4gPSAwOworCWVsc2UgbGVuID0gMTsKKworCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKKwkJaWYgKCsrbGVuID4gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCisJCSppbnRlZ2VyIDw8PSA4OworCQkqaW50ZWdlciB8PSBjaDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdWxvbmdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqaW50ZWdlcikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCXVuc2lnbmVkIGludCAgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSBjaDsKKwlpZiAoY2ggPT0gMCkgbGVuID0gMDsKKwllbHNlIGxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZiAodW5zaWduZWQgbG9uZykpIHsKKwkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfQkFEVkFMVUU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisKKwkJKmludGVnZXIgPDw9IDg7CisJCSppbnRlZ2VyIHw9IGNoOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9vY3RldHNfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqb2N0ZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCSpsZW4gPSAwOworCisJKm9jdGV0cyA9IGttYWxsb2MoZW9jIC0gY3R4LT5wb2ludGVyLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm9jdGV0cyA9PSBOVUxMKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybiAwOworCX0KKworCXB0ciA9ICpvY3RldHM7CisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgKHVuc2lnbmVkIGNoYXIgKilwdHIrKykpIHsKKwkJCWtmcmVlKCpvY3RldHMpOworCQkJKm9jdGV0cyA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkoKmxlbikrKzsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfc3ViaWRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqc3ViaWQpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCSpzdWJpZCA9IDA7CisKKwlkbyB7CisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisKKwkJKnN1YmlkIDw8PSA3OworCQkqc3ViaWQgfD0gY2ggJiAweDdGOworCX0gd2hpbGUgKChjaCAmIDB4ODApID09IDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX29pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKipvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgbG9uZyBzdWJpZDsKKwl1bnNpZ25lZCBpbnQgIHNpemU7CisJdW5zaWduZWQgbG9uZyAqb3B0cjsKKworCXNpemUgPSBlb2MgLSBjdHgtPnBvaW50ZXIgKyAxOworCSpvaWQgPSBrbWFsbG9jKHNpemUgKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9BVE9NSUMpOworCWlmICgqb2lkID09IE5VTEwpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb3B0ciA9ICpvaWQ7CisKKwlpZiAoIWFzbjFfc3ViaWRfZGVjb2RlKGN0eCwgJnN1YmlkKSkgeworCQlrZnJlZSgqb2lkKTsKKwkJKm9pZCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdWJpZCA8IDQwKSB7CisJCW9wdHIgWzBdID0gMDsKKwkJb3B0ciBbMV0gPSBzdWJpZDsKKwl9IGVsc2UgaWYgKHN1YmlkIDwgODApIHsKKwkJb3B0ciBbMF0gPSAxOworCQlvcHRyIFsxXSA9IHN1YmlkIC0gNDA7CisJfSBlbHNlIHsKKwkJb3B0ciBbMF0gPSAyOworCQlvcHRyIFsxXSA9IHN1YmlkIC0gODA7CisJfQorCisJKmxlbiA9IDI7CisJb3B0ciArPSAyOworCisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoKysoKmxlbikgPiBzaXplKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJa2ZyZWUoKm9pZCk7CisJCQkqb2lkID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX3N1YmlkX2RlY29kZShjdHgsIG9wdHIrKykpIHsKKwkJCWtmcmVlKCpvaWQpOworCQkJKm9pZCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU05NUCBkZWNvZGluZyByb3V0aW5lcyAoZ3hzbm1wIGF1dGhvciBEaXJrIFdpc3NlKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU05NUCBWZXJzaW9ucyAqLworI2RlZmluZSBTTk1QX1YxCQkJCTAKKyNkZWZpbmUgU05NUF9WMkMJCQkxCisjZGVmaW5lIFNOTVBfVjIJCQkJMgorI2RlZmluZSBTTk1QX1YzCQkJCTMKKworLyogRGVmYXVsdCBTaXplcyAqLworI2RlZmluZSBTTk1QX1NJWkVfQ09NTQkJCTI1NgorI2RlZmluZSBTTk1QX1NJWkVfT0JKRUNUSUQJCTEyOAorI2RlZmluZSBTTk1QX1NJWkVfQlVGQ0hSCQkyNTYKKyNkZWZpbmUgU05NUF9TSVpFX0JVRklOVAkJMTI4CisjZGVmaW5lIFNOTVBfU0laRV9TTUFMTE9CSkVDVElECQkxNgorCisvKiBSZXF1ZXN0cyAqLworI2RlZmluZSBTTk1QX1BEVV9HRVQJCQkwCisjZGVmaW5lIFNOTVBfUERVX05FWFQJCQkxCisjZGVmaW5lIFNOTVBfUERVX1JFU1BPTlNFCQkyCisjZGVmaW5lIFNOTVBfUERVX1NFVAkJCTMKKyNkZWZpbmUgU05NUF9QRFVfVFJBUDEJCQk0CisjZGVmaW5lIFNOTVBfUERVX0JVTEsJCQk1CisjZGVmaW5lIFNOTVBfUERVX0lORk9STQkJCTYKKyNkZWZpbmUgU05NUF9QRFVfVFJBUDIJCQk3CisKKy8qIEVycm9ycyAqLworI2RlZmluZSBTTk1QX05PRVJST1IJCQkwCisjZGVmaW5lIFNOTVBfVE9PQklHCQkJMQorI2RlZmluZSBTTk1QX05PU1VDSE5BTUUJCQkyCisjZGVmaW5lIFNOTVBfQkFEVkFMVUUJCQkzCisjZGVmaW5lIFNOTVBfUkVBRE9OTFkJCQk0CisjZGVmaW5lIFNOTVBfR0VORVJST1IJCQk1CisjZGVmaW5lIFNOTVBfTk9BQ0NFU1MJCQk2CisjZGVmaW5lIFNOTVBfV1JPTkdUWVBFCQkJNworI2RlZmluZSBTTk1QX1dST05HTEVOR1RICQk4CisjZGVmaW5lIFNOTVBfV1JPTkdFTkNPRElORwkJOQorI2RlZmluZSBTTk1QX1dST05HVkFMVUUJCQkxMAorI2RlZmluZSBTTk1QX05PQ1JFQVRJT04JCQkxMQorI2RlZmluZSBTTk1QX0lOQ09OU0lTVEVOVFZBTFVFCQkxMgorI2RlZmluZSBTTk1QX1JFU09VUkNFVU5BVkFJTEFCTEUJMTMKKyNkZWZpbmUgU05NUF9DT01NSVRGQUlMRUQJCTE0CisjZGVmaW5lIFNOTVBfVU5ET0ZBSUxFRAkJCTE1CisjZGVmaW5lIFNOTVBfQVVUSE9SSVpBVElPTkVSUk9SCQkxNgorI2RlZmluZSBTTk1QX05PVFdSSVRBQkxFCQkxNworI2RlZmluZSBTTk1QX0lOQ09OU0lTVEVOVE5BTUUJCTE4CisKKy8qIEdlbmVyYWwgU05NUCBWMSBUcmFwcyAqLworI2RlZmluZSBTTk1QX1RSQVBfQ09MRFNUQVJUCQkwCisjZGVmaW5lIFNOTVBfVFJBUF9XQVJNU1RBUlQJCTEKKyNkZWZpbmUgU05NUF9UUkFQX0xJTktET1dOCQkyCisjZGVmaW5lIFNOTVBfVFJBUF9MSU5LVVAJCTMKKyNkZWZpbmUgU05NUF9UUkFQX0FVVEZBSUxVUkUJCTQKKyNkZWZpbmUgU05NUF9UUkFQX0VRUE5FSUdIQk9STE9TUwk1CisjZGVmaW5lIFNOTVBfVFJBUF9FTlRTUEVDSUZJQwkJNgorCisvKiBTTk1QdjEgVHlwZXMgKi8KKyNkZWZpbmUgU05NUF9OVUxMICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU05NUF9JTlRFR0VSICAgICAgICAgICAgIDEgICAgLyogbCAgKi8KKyNkZWZpbmUgU05NUF9PQ1RFVFNUUiAgICAgICAgICAgIDIgICAgLyogYyAgKi8KKyNkZWZpbmUgU05NUF9ESVNQTEFZU1RSICAgICAgICAgIDIgICAgLyogYyAgKi8KKyNkZWZpbmUgU05NUF9PQkpFQ1RJRCAgICAgICAgICAgIDMgICAgLyogdWwgKi8KKyNkZWZpbmUgU05NUF9JUEFERFIgICAgICAgICAgICAgIDQgICAgLyogdWMgKi8KKyNkZWZpbmUgU05NUF9DT1VOVEVSICAgICAgICAgICAgIDUgICAgLyogdWwgKi8KKyNkZWZpbmUgU05NUF9HQVVHRSAgICAgICAgICAgICAgIDYgICAgLyogdWwgKi8KKyNkZWZpbmUgU05NUF9USU1FVElDS1MgICAgICAgICAgIDcgICAgLyogdWwgKi8KKyNkZWZpbmUgU05NUF9PUEFRVUUgICAgICAgICAgICAgIDggICAgLyogYyAgKi8KKworLyogQWRkaXRpb25hbCBTTk1QdjIgVHlwZXMgKi8KKyNkZWZpbmUgU05NUF9VSU5URUdFUiAgICAgICAgICAgIDUgICAgLyogdWwgKi8KKyNkZWZpbmUgU05NUF9CSVRTVFIgICAgICAgICAgICAgIDkgICAgLyogdWMgKi8KKyNkZWZpbmUgU05NUF9OU0FQICAgICAgICAgICAgICAgMTAgICAgLyogdWMgKi8KKyNkZWZpbmUgU05NUF9DT1VOVEVSNjQgICAgICAgICAgMTEgICAgLyogdWwgKi8KKyNkZWZpbmUgU05NUF9OT1NVQ0hPQkpFQ1QgICAgICAgMTIKKyNkZWZpbmUgU05NUF9OT1NVQ0hJTlNUQU5DRSAgICAgMTMKKyNkZWZpbmUgU05NUF9FTkRPRk1JQlZJRVcgICAgICAgMTQKKwordW5pb24gc25tcF9zeW50YXgKK3sKKwl1bnNpZ25lZCBjaGFyIHVjWzBdOwkvKiA4IGJpdCB1bnNpZ25lZCAqLworCWNoYXIgY1swXTsJCS8qIDggYml0IHNpZ25lZCAqLworCXVuc2lnbmVkIGxvbmcgdWxbMF07CS8qIDMyIGJpdCB1bnNpZ25lZCAqLworCWxvbmcgbFswXTsJCS8qIDMyIGJpdCBzaWduZWQgKi8KK307CisKK3N0cnVjdCBzbm1wX29iamVjdAoreworCXVuc2lnbmVkIGxvbmcgKmlkOworCXVuc2lnbmVkIGludCBpZF9sZW47CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc3ludGF4X2xlbjsKKwl1bmlvbiBzbm1wX3N5bnRheCBzeW50YXg7Cit9OworCitzdHJ1Y3Qgc25tcF9yZXF1ZXN0Cit7CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBpbnQgZXJyb3Jfc3RhdHVzOworCXVuc2lnbmVkIGludCBlcnJvcl9pbmRleDsKK307CisKK3N0cnVjdCBzbm1wX3YxX3RyYXAKK3sKKwl1bnNpZ25lZCBsb25nICppZDsKKwl1bnNpZ25lZCBpbnQgaWRfbGVuOworCXVuc2lnbmVkIGxvbmcgaXBfYWRkcmVzczsJLyogcG9pbnRlciAgKi8KKwl1bnNpZ25lZCBpbnQgZ2VuZXJhbDsKKwl1bnNpZ25lZCBpbnQgc3BlY2lmaWM7CisJdW5zaWduZWQgbG9uZyB0aW1lOworfTsKKworLyogU05NUCB0eXBlcyAqLworI2RlZmluZSBTTk1QX0lQQSAgICAwCisjZGVmaW5lIFNOTVBfQ05UICAgIDEKKyNkZWZpbmUgU05NUF9HR0UgICAgMgorI2RlZmluZSBTTk1QX1RJVCAgICAzCisjZGVmaW5lIFNOTVBfT1BRICAgIDQKKyNkZWZpbmUgU05NUF9DNjQgICAgNgorCisvKiBTTk1QIGVycm9ycyAqLworI2RlZmluZSBTRVJSX05TTyAgICAwCisjZGVmaW5lIFNFUlJfTlNJICAgIDEKKyNkZWZpbmUgU0VSUl9FT00gICAgMgorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFuZ2xlX2FkZHJlc3ModW5zaWduZWQgY2hhciAqYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N1bTE2ICpjaGVjayk7CitzdHJ1Y3Qgc25tcF9jbnYKK3sKKwl1bnNpZ25lZCBpbnQgY2xhc3M7CisJdW5zaWduZWQgaW50IHRhZzsKKwlpbnQgc3ludGF4OworfTsKKworc3RhdGljIHN0cnVjdCBzbm1wX2NudiBzbm1wX2NvbnYgW10gPQoreworCXtBU04xX1VOSSwgQVNOMV9OVUwsIFNOTVBfTlVMTH0sCisJe0FTTjFfVU5JLCBBU04xX0lOVCwgU05NUF9JTlRFR0VSfSwKKwl7QVNOMV9VTkksIEFTTjFfT1RTLCBTTk1QX09DVEVUU1RSfSwKKwl7QVNOMV9VTkksIEFTTjFfT1RTLCBTTk1QX0RJU1BMQVlTVFJ9LAorCXtBU04xX1VOSSwgQVNOMV9PSkksIFNOTVBfT0JKRUNUSUR9LAorCXtBU04xX0FQTCwgU05NUF9JUEEsIFNOTVBfSVBBRERSfSwKKwl7QVNOMV9BUEwsIFNOTVBfQ05ULCBTTk1QX0NPVU5URVJ9LAkvKiBDb3VudGVyMzIgKi8KKwl7QVNOMV9BUEwsIFNOTVBfR0dFLCBTTk1QX0dBVUdFfSwJLyogR2F1Z2UzMiA9PSBVbnNpZ25lZDMyICAqLworCXtBU04xX0FQTCwgU05NUF9USVQsIFNOTVBfVElNRVRJQ0tTfSwKKwl7QVNOMV9BUEwsIFNOTVBfT1BRLCBTTk1QX09QQVFVRX0sCisKKwkvKiBTTk1QdjIgZGF0YSB0eXBlcyBhbmQgZXJyb3JzICovCisJe0FTTjFfVU5JLCBBU04xX0JUUywgU05NUF9CSVRTVFJ9LAorCXtBU04xX0FQTCwgU05NUF9DNjQsIFNOTVBfQ09VTlRFUjY0fSwKKwl7QVNOMV9DVFgsIFNFUlJfTlNPLCBTTk1QX05PU1VDSE9CSkVDVH0sCisJe0FTTjFfQ1RYLCBTRVJSX05TSSwgU05NUF9OT1NVQ0hJTlNUQU5DRX0sCisJe0FTTjFfQ1RYLCBTRVJSX0VPTSwgU05NUF9FTkRPRk1JQlZJRVd9LAorCXswLCAgICAgICAwLCAgICAgICAtMX0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfdGFnX2NsczJzeW50YXgodW5zaWduZWQgaW50IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnN5bnRheCkKK3sKKwlzdHJ1Y3Qgc25tcF9jbnYgKmNudjsKKworCWNudiA9IHNubXBfY29udjsKKworCXdoaWxlIChjbnYtPnN5bnRheCAhPSAtMSkgeworCQlpZiAoY252LT50YWcgPT0gdGFnICYmIGNudi0+Y2xhc3MgPT0gY2xzKSB7CisJCQkqc3ludGF4ID0gY252LT5zeW50YXg7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljbnYrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfb2JqZWN0X2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF9vYmplY3QgKipvYmopCit7CisJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIGxlbiwgaWRsZW47CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1bnNpZ25lZCBjaGFyICplb2MsICplbmQsICpwOworCXVuc2lnbmVkIGxvbmcgKmxwLCAqaWQ7CisJdW5zaWduZWQgbG9uZyB1bDsKKwlsb25nIGw7CisKKwkqb2JqID0gTlVMTDsKKwlpZCA9IE5VTEw7CisKKwlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlb2MsICZjbHMsICZjb24sICZ0YWcpKQorCQlyZXR1cm4gMDsKKworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfQ09OIHx8IHRhZyAhPSBBU04xX1NFUSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQorCQlyZXR1cm4gMDsKKworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX09KSSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFzbjFfb2lkX2RlY29kZShjdHgsIGVuZCwgJmlkLCAmaWRsZW4pKQorCQlyZXR1cm4gMDsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpIHsKKwkJa2ZyZWUoaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY29uICE9IEFTTjFfUFJJKSB7CisJCWtmcmVlKGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdHlwZSA9IDA7CisJaWYgKCFzbm1wX3RhZ19jbHMyc3ludGF4KHRhZywgY2xzLCAmdHlwZSkpIHsKKwkJa2ZyZWUoaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsID0gMDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTTk1QX0lOVEVHRVI6CisJCQlsZW4gPSBzaXplb2YobG9uZyk7CisJCQlpZiAoIWFzbjFfbG9uZ19kZWNvZGUoY3R4LCBlbmQsICZsKSkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLAorCQkJICAgICAgICAgICAgICAgR0ZQX0FUT01JQyk7CisJCQlpZiAoKm9iaiA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCSgqb2JqKS0+c3ludGF4LmxbMF0gPSBsOworCQkJYnJlYWs7CisJCWNhc2UgU05NUF9PQ1RFVFNUUjoKKwkJY2FzZSBTTk1QX09QQVFVRToKKwkJCWlmICghYXNuMV9vY3RldHNfZGVjb2RlKGN0eCwgZW5kLCAmcCwgJmxlbikpIHsKKwkJCQlrZnJlZShpZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwKKwkJCSAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOworCQkJaWYgKCpvYmogPT0gTlVMTCkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZW1jcHkoKCpvYmopLT5zeW50YXguYywgcCwgbGVuKTsKKwkJCWtmcmVlKHApOworCQkJYnJlYWs7CisJCWNhc2UgU05NUF9OVUxMOgorCQljYXNlIFNOTVBfTk9TVUNIT0JKRUNUOgorCQljYXNlIFNOTVBfTk9TVUNISU5TVEFOQ0U6CisJCWNhc2UgU05NUF9FTkRPRk1JQlZJRVc6CisJCQlsZW4gPSAwOworCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCksIEdGUF9BVE9NSUMpOworCQkJaWYgKCpvYmogPT0gTlVMTCkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIWFzbjFfbnVsbF9kZWNvZGUoY3R4LCBlbmQpKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCWtmcmVlKCpvYmopOworCQkJCSpvYmogPSBOVUxMOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU05NUF9PQkpFQ1RJRDoKKwkJCWlmICghYXNuMV9vaWRfZGVjb2RlKGN0eCwgZW5kLCAodW5zaWduZWQgbG9uZyAqKikmbHAsICZsZW4pKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbGVuICo9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKKwkJCWlmICgqb2JqID09IE5VTEwpIHsKKwkJCQlrZnJlZShscCk7CisJCQkJa2ZyZWUoaWQpOworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW1lbWNweSgoKm9iaiktPnN5bnRheC51bCwgbHAsIGxlbik7CisJCQlrZnJlZShscCk7CisJCQlicmVhazsKKwkJY2FzZSBTTk1QX0lQQUREUjoKKwkJCWlmICghYXNuMV9vY3RldHNfZGVjb2RlKGN0eCwgZW5kLCAmcCwgJmxlbikpIHsKKwkJCQlrZnJlZShpZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAobGVuICE9IDQpIHsKKwkJCQlrZnJlZShwKTsKKwkJCQlrZnJlZShpZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoKm9iaiA9PSBOVUxMKSB7CisJCQkJa2ZyZWUocCk7CisJCQkJa2ZyZWUoaWQpOworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW1lbWNweSgoKm9iaiktPnN5bnRheC51YywgcCwgbGVuKTsKKwkJCWtmcmVlKHApOworCQkJYnJlYWs7CisJCWNhc2UgU05NUF9DT1VOVEVSOgorCQljYXNlIFNOTVBfR0FVR0U6CisJCWNhc2UgU05NUF9USU1FVElDS1M6CisJCQlsZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCQlpZiAoIWFzbjFfdWxvbmdfZGVjb2RlKGN0eCwgZW5kLCAmdWwpKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQkJaWYgKCpvYmogPT0gTlVMTCkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkoKm9iaiktPnN5bnRheC51bFswXSA9IHVsOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlrZnJlZShpZCk7CisJCQlyZXR1cm4gMDsKKwl9CisKKwkoKm9iaiktPnN5bnRheF9sZW4gPSBsZW47CisJKCpvYmopLT50eXBlID0gdHlwZTsKKwkoKm9iaiktPmlkID0gaWQ7CisJKCpvYmopLT5pZF9sZW4gPSBpZGxlbjsKKworCWlmICghYXNuMV9lb2NfZGVjb2RlKGN0eCwgZW9jKSkgeworCQlrZnJlZShpZCk7CisJCWtmcmVlKCpvYmopOworCQkqb2JqID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3JlcXVlc3RfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXVuc2lnbmVkIGludCBjbHMsIGNvbiwgdGFnOworCXVuc2lnbmVkIGNoYXIgKmVuZDsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfSU5UKQorCQlyZXR1cm4gMDsKKworCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZyZXF1ZXN0LT5pZCkpCisJCXJldHVybiAwOworCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCisJCXJldHVybiAwOworCisJaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmcmVxdWVzdC0+ZXJyb3Jfc3RhdHVzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQorCQlyZXR1cm4gMDsKKworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFzbjFfdWludF9kZWNvZGUoY3R4LCBlbmQsICZyZXF1ZXN0LT5lcnJvcl9pbmRleCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGYXN0IGNoZWNrc3VtIHVwZGF0ZSBmb3IgcG9zc2libHkgb2RkbHktYWxpZ25lZCBVRFAgYnl0ZSwgZnJvbSB0aGUKKyAqIGNvZGUgZXhhbXBsZSBpbiB0aGUgZHJhZnQuCisgKi8KK3N0YXRpYyB2b2lkIGZhc3RfY3N1bShfX3N1bTE2ICpjc3VtLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGNoYXIgc1s0XTsKKworCWlmIChvZmZzZXQgJiAxKSB7CisJCXNbMF0gPSBzWzJdID0gMDsKKwkJc1sxXSA9IH4qb3B0cjsKKwkJc1szXSA9ICpucHRyOworCX0gZWxzZSB7CisJCXNbMV0gPSBzWzNdID0gMDsKKwkJc1swXSA9IH4qb3B0cjsKKwkJc1syXSA9ICpucHRyOworCX0KKworCSpjc3VtID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChzLCA0LCB+Y3N1bV91bmZvbGQoKmNzdW0pKSk7Cit9CisKKy8qCisgKiBNYW5nbGUgSVAgYWRkcmVzcy4KKyAqIAktIGJlZ2luIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHNubXAgbWVzc2dhZQorICogICAgICAtIGFkZHIgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFuZ2xlX2FkZHJlc3ModW5zaWduZWQgY2hhciAqYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N1bTE2ICpjaGVjaykKK3sKKwlpZiAobWFwLT5mcm9tID09IE5PQ1QxKGFkZHIpKSB7CisJCXVfaW50MzJfdCBvbGQ7CisKKwkJaWYgKGRlYnVnKQorCQkJbWVtY3B5KCZvbGQsICh1bnNpZ25lZCBjaGFyICopYWRkciwgc2l6ZW9mKG9sZCkpOworCisJCSphZGRyID0gbWFwLT50bzsKKworCQkvKiBVcGRhdGUgVURQIGNoZWNrc3VtIGlmIGJlaW5nIHVzZWQgKi8KKwkJaWYgKCpjaGVjaykgeworCQkJZmFzdF9jc3VtKGNoZWNrLAorCQkJICAgICAgICAgICZtYXAtPmZyb20sICZtYXAtPnRvLCBhZGRyIC0gYmVnaW4pOworCisJCX0KKworCQlpZiAoZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IG1hcHBlZCAldS4ldS4ldS4ldSB0byAiCisJCQkgICAgICAgIiV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKG9sZCksIE5JUFFVQUQoKmFkZHIpKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfdHJhcF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbm1wX3YxX3RyYXAgKnRyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N1bTE2ICpjaGVjaykKK3sKKwl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZywgbGVuOworCXVuc2lnbmVkIGNoYXIgKmVuZDsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT0pJKQorCQlyZXR1cm4gMDsKKworCWlmICghYXNuMV9vaWRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+aWQsICZ0cmFwLT5pZF9sZW4pKQorCQlyZXR1cm4gMDsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCWdvdG8gZXJyX2lkX2ZyZWU7CisKKwlpZiAoISgoY2xzID09IEFTTjFfQVBMICYmIGNvbiA9PSBBU04xX1BSSSAmJiB0YWcgPT0gU05NUF9JUEEpIHx8CisJICAgICAgKGNscyA9PSBBU04xX1VOSSAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IEFTTjFfT1RTKSkpCisJCWdvdG8gZXJyX2lkX2ZyZWU7CisKKwlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZShjdHgsIGVuZCwgKHVuc2lnbmVkIGNoYXIgKiopJnRyYXAtPmlwX2FkZHJlc3MsICZsZW4pKQorCQlnb3RvIGVycl9pZF9mcmVlOworCisJLyogSVB2NCBvbmx5ICovCisJaWYgKGxlbiAhPSA0KQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisKKwltYW5nbGVfYWRkcmVzcyhjdHgtPmJlZ2luLCBjdHgtPnBvaW50ZXIgLSA0LCBtYXAsIGNoZWNrKTsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKKwkJZ290byBlcnJfYWRkcl9mcmVlOworCisJaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+Z2VuZXJhbCkpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKKwkJZ290byBlcnJfYWRkcl9mcmVlOworCisJaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+c3BlY2lmaWMpKQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisKKwlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisKKwlpZiAoISgoY2xzID09IEFTTjFfQVBMICYmIGNvbiA9PSBBU04xX1BSSSAmJiB0YWcgPT0gU05NUF9USVQpIHx8CisJICAgICAgKGNscyA9PSBBU04xX1VOSSAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IEFTTjFfSU5UKSkpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKworCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZ0cmFwLT50aW1lKSkKKwkJZ290byBlcnJfYWRkcl9mcmVlOworCisJcmV0dXJuIDE7CisKK2Vycl9hZGRyX2ZyZWU6CisJa2ZyZWUoKHVuc2lnbmVkIGxvbmcgKil0cmFwLT5pcF9hZGRyZXNzKTsKKworZXJyX2lkX2ZyZWU6CisJa2ZyZWUodHJhcC0+aWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1pc2MuIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBoZXhfZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgJiYgIShpICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoIiUwMnggIiwgKihidWYgKyBpKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworLyoKKyAqIFBhcnNlIGFuZCBtYW5nbGUgU05NUCBtZXNzYWdlIGFjY29yZGluZyB0byBtYXBwaW5nLgorICogKEFuZCB0aGlzIGlzIHRoZSBmdWNraW5nICdiYXNpYycgbWV0aG9kKS4KKyAqLworc3RhdGljIGludCBzbm1wX3BhcnNlX21hbmdsZSh1bnNpZ25lZCBjaGFyICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N1bTE2ICpjaGVjaykKK3sKKwl1bnNpZ25lZCBjaGFyICplb2MsICplbmQ7CisJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIHZlcnMsIHBkdXR5cGU7CisJc3RydWN0IGFzbjFfY3R4IGN0eDsKKwlzdHJ1Y3QgYXNuMV9vY3RzdHIgY29tbTsKKwlzdHJ1Y3Qgc25tcF9vYmplY3QgKipvYmo7CisKKwlpZiAoZGVidWcgPiAxKQorCQloZXhfZHVtcChtc2csIGxlbik7CisKKwlhc24xX29wZW4oJmN0eCwgbXNnLCBsZW4pOworCisJLyoKKwkgKiBTdGFydCBvZiBTTk1QIG1lc3NhZ2UuCisJICovCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfQ09OIHx8IHRhZyAhPSBBU04xX1NFUSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFZlcnNpb24gMSBvciAyIGhhbmRsZWQuCisJICovCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKKwkJcmV0dXJuIDA7CisJaWYgKCFhc24xX3VpbnRfZGVjb2RlICgmY3R4LCBlbmQsICZ2ZXJzKSkKKwkJcmV0dXJuIDA7CisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBzbm1wIHZlcnNpb246ICV1XG4iLCB2ZXJzICsgMSk7CisJaWYgKHZlcnMgPiAxKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQ29tbXVuaXR5LgorCSAqLworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlICgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT1RTKQorCQlyZXR1cm4gMDsKKwlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZSgmY3R4LCBlbmQsICZjb21tLmRhdGEsICZjb21tLmxlbikpCisJCXJldHVybiAwOworCWlmIChkZWJ1ZyA+IDEpIHsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBjb21tdW5pdHk6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgY29tbS5sZW47IGkrKykKKwkJCXByaW50aygiJWMiLCBjb21tLmRhdGFbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCWtmcmVlKGNvbW0uZGF0YSk7CisKKwkvKgorCSAqIFBEVSB0eXBlCisJICovCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnBkdXR5cGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoY2xzICE9IEFTTjFfQ1RYIHx8IGNvbiAhPSBBU04xX0NPTikKKwkJcmV0dXJuIDA7CisJaWYgKGRlYnVnID4gMSkgeworCQl1bnNpZ25lZCBjaGFyICpwZHVzW10gPSB7CisJCQlbU05NUF9QRFVfR0VUXSA9ICJnZXQiLAorCQkJW1NOTVBfUERVX05FWFRdID0gImdldC1uZXh0IiwKKwkJCVtTTk1QX1BEVV9SRVNQT05TRV0gPSAicmVzcG9uc2UiLAorCQkJW1NOTVBfUERVX1NFVF0gPSAic2V0IiwKKwkJCVtTTk1QX1BEVV9UUkFQMV0gPSAidHJhcHYxIiwKKwkJCVtTTk1QX1BEVV9CVUxLXSA9ICJidWxrIiwKKwkJCVtTTk1QX1BEVV9JTkZPUk1dID0gImluZm9ybSIsCisJCQlbU05NUF9QRFVfVFJBUDJdID0gInRyYXB2MiIKKwkJfTsKKworCQlpZiAocGR1dHlwZSA+IFNOTVBfUERVX1RSQVAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBiYWQgcGR1IHR5cGUgJXVcbiIsIHBkdXR5cGUpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IHBkdTogJXNcbiIsIHBkdXNbcGR1dHlwZV0pOworCX0KKwlpZiAocGR1dHlwZSAhPSBTTk1QX1BEVV9SRVNQT05TRSAmJgorCSAgICBwZHV0eXBlICE9IFNOTVBfUERVX1RSQVAxICYmIHBkdXR5cGUgIT0gU05NUF9QRFVfVFJBUDIpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBSZXF1ZXN0IGhlYWRlciBvciB2MSB0cmFwCisJICovCisJaWYgKHBkdXR5cGUgPT0gU05NUF9QRFVfVFJBUDEpIHsKKwkJc3RydWN0IHNubXBfdjFfdHJhcCB0cmFwOworCQl1bnNpZ25lZCBjaGFyIHJldCA9IHNubXBfdHJhcF9kZWNvZGUoJmN0eCwgJnRyYXAsIG1hcCwgY2hlY2spOworCisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKHRyYXAuaWQpOworCQkJa2ZyZWUoKHVuc2lnbmVkIGxvbmcgKil0cmFwLmlwX2FkZHJlc3MpOworCQl9IGVsc2UKKwkJCXJldHVybiByZXQ7CisKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc25tcF9yZXF1ZXN0IHJlcTsKKworCQlpZiAoIXNubXBfcmVxdWVzdF9kZWNvZGUoJmN0eCwgJnJlcSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiByZXF1ZXN0OiBpZD0weCVseCBlcnJvcl9zdGF0dXM9JXUgIgorCQkJImVycm9yX2luZGV4PSV1XG4iLCByZXEuaWQsIHJlcS5lcnJvcl9zdGF0dXMsCisJCQlyZXEuZXJyb3JfaW5kZXgpOworCX0KKworCS8qCisJICogTG9vcCB0aHJvdWdoIG9iamVjdHMsIGxvb2sgZm9yIElQIGFkZHJlc3NlcyB0byBtYW5nbGUuCisJICovCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9DT04gfHwgdGFnICE9IEFTTjFfU0VRKQorCQlyZXR1cm4gMDsKKworCW9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCksIEdGUF9BVE9NSUMpOworCWlmIChvYmogPT0gTlVMTCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiT09NIGluIGJzYWxnKCVkKVxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBlb2MpKSB7CisJCXVuc2lnbmVkIGludCBpOworCisJCWlmICghc25tcF9vYmplY3RfZGVjb2RlKCZjdHgsIG9iaikpIHsKKwkJCWlmICgqb2JqKSB7CisJCQkJa2ZyZWUoKCpvYmopLT5pZCk7CisJCQkJa2ZyZWUoKm9iaik7CisJCQl9CisJCQlrZnJlZShvYmopOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoZGVidWcgPiAxKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IG9iamVjdDogIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgKCpvYmopLT5pZF9sZW47IGkrKykgeworCQkJCWlmIChpID4gMCkKKwkJCQkJcHJpbnRrKCIuIik7CisJCQkJcHJpbnRrKCIlbHUiLCAoKm9iaiktPmlkW2ldKTsKKwkJCX0KKwkJCXByaW50aygiOiB0eXBlPSV1XG4iLCAoKm9iaiktPnR5cGUpOworCisJCX0KKworCQlpZiAoKCpvYmopLT50eXBlID09IFNOTVBfSVBBRERSKQorCQkJbWFuZ2xlX2FkZHJlc3MoY3R4LmJlZ2luLCBjdHgucG9pbnRlciAtIDQgLCBtYXAsIGNoZWNrKTsKKworCQlrZnJlZSgoKm9iaiktPmlkKTsKKwkJa2ZyZWUoKm9iaik7CisJfQorCWtmcmVlKG9iaik7CisKKwlpZiAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBlb2MpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOQVQgcm91dGluZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU05NUCB0cmFuc2xhdGlvbiByb3V0aW5lLgorICovCitzdGF0aWMgaW50IHNubXBfdHJhbnNsYXRlKHN0cnVjdCBuZl9jb25uICpjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoKF9fYmUzMiAqKWlwaCArIGlwaC0+aWhsKTsKKwl1X2ludDE2X3QgdWRwbGVuID0gbnRvaHModWRwaC0+bGVuKTsKKwl1X2ludDE2X3QgcGF5bGVuID0gdWRwbGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJc3RydWN0IG9jdDFfbWFwIG1hcDsKKworCS8qCisJICogRGV0ZXJtaW5lIG1hcHBwaW5nIGZvciBhcHBsaWNhdGlvbiBsYXllciBhZGRyZXNzZXMgYmFzZWQKKwkgKiBvbiBOQVQgbWFuaXB1bGF0aW9ucyBmb3IgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAoZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgeworCQkvKiBTTkFUIHRyYXBzICovCisJCW1hcC5mcm9tID0gTk9DVDEoJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMuaXApOworCQltYXAudG8gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMuaXApOworCX0gZWxzZSB7CisJCS8qIEROQVQgcmVwbGllcyAqLworCQltYXAuZnJvbSA9IE5PQ1QxKCZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLmlwKTsKKwkJbWFwLnRvID0gTk9DVDEoJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLmlwKTsKKwl9CisKKwlpZiAobWFwLmZyb20gPT0gbWFwLnRvKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJaWYgKCFzbm1wX3BhcnNlX21hbmdsZSgodW5zaWduZWQgY2hhciAqKXVkcGggKyBzaXplb2Yoc3RydWN0IHVkcGhkciksCisJICAgICAgICAgICAgICAgICAgICAgICBwYXlsZW4sICZtYXAsICZ1ZHBoLT5jaGVjaykpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJzYWxnOiBwYXJzZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKKy8qIFdlIGRvbid0IGFjdHVhbGx5IHNldCB1cCBleHBlY3RhdGlvbnMsIGp1c3QgYWRqdXN0IGludGVybmFsIElQCisgKiBhZGRyZXNzZXMgaWYgdGhpcyBpcyBiZWluZyBOQVR0ZWQgKi8KK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQlzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJdW5zaWduZWQgaW50IHJldDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoKHVfaW50MzJfdCAqKWlwaCArIGlwaC0+aWhsKTsKKworCS8qIFNOTVAgcmVwbGllcyBhbmQgb3JpZ2luYXRpbmcgU05NUCB0cmFwcyBnZXQgbWFuZ2xlZCAqLworCWlmICh1ZHBoLT5zb3VyY2UgPT0gaHRvbnMoU05NUF9QT1JUKSAmJiBkaXIgIT0gSVBfQ1RfRElSX1JFUExZKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCWlmICh1ZHBoLT5kZXN0ID09IGh0b25zKFNOTVBfVFJBUF9QT1JUKSAmJiBkaXIgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogTm8gTkFUPyAqLworCWlmICghKGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHBhY2tldCBsZW5ndGggaXMgb2suICBTbyBmYXIsIHdlIHdlcmUgb25seSBndWFyYW50ZWVkCisJICogdG8gaGF2ZSBhIHZhbGlkIGxlbmd0aCBJUCBoZWFkZXIgcGx1cyA4IGJ5dGVzLCB3aGljaCBtZWFucyB3ZSBoYXZlCisJICogZW5vdWdoIHJvb20gZm9yIGEgVURQIGhlYWRlci4gIEp1c3QgdmVyaWZ5IHRoZSBVRFAgbGVuZ3RoIGZpZWxkIHNvIHdlCisJICogY2FuIG1lc3MgYXJvdW5kIHdpdGggdGhlIHBheWxvYWQuCisJICovCisJaWYgKG50b2hzKHVkcGgtPmxlbikgIT0gKCpwc2tiKS0+bGVuIC0gKGlwaC0+aWhsIDw8IDIpKSB7CisJCSBpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJIHByaW50ayhLRVJOX1dBUk5JTkcgIlNOTVA6IGRyb3BwaW5nIG1hbGZvcm1lZCBwYWNrZXQgIgorCQkJCSJzcmM9JXUuJXUuJXUuJXUgZHN0PSV1LiV1LiV1LiV1XG4iLAorCQkJCU5JUFFVQUQoaXBoLT5zYWRkciksIE5JUFFVQUQoaXBoLT5kYWRkcikpOworCQkgcmV0dXJuIE5GX0RST1A7CisJfQorCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCXNwaW5fbG9ja19iaCgmc25tcF9sb2NrKTsKKwlyZXQgPSBzbm1wX3RyYW5zbGF0ZShjdCwgY3RpbmZvLCBwc2tiKTsKKwlzcGluX3VubG9ja19iaCgmc25tcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgc25tcF9oZWxwZXIgX19yZWFkX21vc3RseSA9IHsKKwkubWF4X2V4cGVjdGVkCQk9IDAsCisJLnRpbWVvdXQJCT0gMTgwLAorCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJLmhlbHAJCQk9IGhlbHAsCisJLm5hbWUJCQk9ICJzbm1wIiwKKwkudHVwbGUuc3JjLmwzbnVtCT0gQUZfSU5FVCwKKwkudHVwbGUuc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKFNOTVBfUE9SVCksCisJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVURQLAorCS5tYXNrLnNyYy5sM251bQkJPSAweEZGRkYsCisJLm1hc2suc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDB4RkZGRiksCisJLm1hc2suZHN0LnByb3RvbnVtCT0gMHhGRiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBzbm1wX3RyYXBfaGVscGVyIF9fcmVhZF9tb3N0bHkgPSB7CisJLm1heF9leHBlY3RlZAkJPSAwLAorCS50aW1lb3V0CQk9IDE4MCwKKwkubWUJCQk9IFRISVNfTU9EVUxFLAorCS5oZWxwCQkJPSBoZWxwLAorCS5uYW1lCQkJPSAic25tcF90cmFwIiwKKwkudHVwbGUuc3JjLmwzbnVtCT0gQUZfSU5FVCwKKwkudHVwbGUuc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKFNOTVBfVFJBUF9QT1JUKSwKKwkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCisJLm1hc2suc3JjLmwzbnVtCQk9IDB4RkZGRiwKKwkubWFzay5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIHN0dWZmLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgbmZfbmF0X3NubXBfYmFzaWNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcigmc25tcF9oZWxwZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnNubXBfdHJhcF9oZWxwZXIpOworCWlmIChyZXQgPCAwKSB7CisJCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcigmc25tcF9oZWxwZXIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X3NubXBfYmFzaWNfZmluaSh2b2lkKQoreworCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcigmc25tcF9oZWxwZXIpOworCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcigmc25tcF90cmFwX2hlbHBlcik7Cit9CisKK21vZHVsZV9pbml0KG5mX25hdF9zbm1wX2Jhc2ljX2luaXQpOworbW9kdWxlX2V4aXQobmZfbmF0X3NubXBfYmFzaWNfZmluaSk7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjAwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwYTdhNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCkBAIC0wLDAgKzEsNDA2IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgSE9PS05BTUUoaG9va251bSkgKChob29rbnVtKSA9PSBORl9JUF9QT1NUX1JPVVRJTkcgPyAiUE9TVF9ST1VUSU5HIiAgXAorCQkJICAgOiAoKGhvb2tudW0pID09IE5GX0lQX1BSRV9ST1VUSU5HID8gIlBSRV9ST1VUSU5HIiBcCisJCQkgICAgICA6ICgoaG9va251bSkgPT0gTkZfSVBfTE9DQUxfT1VUID8gIkxPQ0FMX09VVCIgIFwKKwkJCSAgICAgICAgIDogKChob29rbnVtKSA9PSBORl9JUF9MT0NBTF9JTiA/ICJMT0NBTF9JTiIgIFwKKwkJCQkgICAgOiAiKkVSUk9SKiIpKSkKKworI2lmZGVmIENPTkZJR19YRlJNCitzdGF0aWMgdm9pZCBuYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzYml0OworCisJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKKwlpZiAoY3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwl0ID0gJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZTsKKworCWlmIChkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQlzdGF0dXNiaXQgPSBJUFNfRFNUX05BVDsKKwllbHNlCisJCXN0YXR1c2JpdCA9IElQU19TUkNfTkFUOworCisJaWYgKGN0LT5zdGF0dXMgJiBzdGF0dXNiaXQpIHsKKwkJZmwtPmZsNF9kc3QgPSB0LT5kc3QudTMuaXA7CisJCWlmICh0LT5kc3QucHJvdG9udW0gPT0gSVBQUk9UT19UQ1AgfHwKKwkJICAgIHQtPmRzdC5wcm90b251bSA9PSBJUFBST1RPX1VEUCkKKwkJCWZsLT5mbF9pcF9kcG9ydCA9IHQtPmRzdC51LnRjcC5wb3J0OworCX0KKworCXN0YXR1c2JpdCBePSBJUFNfTkFUX01BU0s7CisKKwlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgeworCQlmbC0+Zmw0X3NyYyA9IHQtPnNyYy51My5pcDsKKwkJaWYgKHQtPmRzdC5wcm90b251bSA9PSBJUFBST1RPX1RDUCB8fAorCQkgICAgdC0+ZHN0LnByb3RvbnVtID09IElQUFJPVE9fVURQKQorCQkJZmwtPmZsX2lwX3Nwb3J0ID0gdC0+c3JjLnUudGNwLnBvcnQ7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25mX25hdF9mbih1bnNpZ25lZCBpbnQgaG9va251bSwKKwkgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQ7CisJc3RydWN0IG5mX25hdF9pbmZvICppbmZvOworCS8qIG1hbmlwdHlwZSA9PSBTUkMgZm9yIHBvc3Ryb3V0aW5nLiAqLworCWVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlID0gSE9PSzJNQU5JUChob29rbnVtKTsKKworCS8qIFdlIG5ldmVyIHNlZSBmcmFnbWVudHM6IGNvbm50cmFjayBkZWZyYWdzIG9uIHByZS1yb3V0aW5nCisJICAgYW5kIGxvY2FsLW91dCwgYW5kIG5mX25hdF9vdXQgcHJvdGVjdHMgcG9zdC1yb3V0aW5nLiAqLworCU5GX0NUX0FTU0VSVCghKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYKKwkJICAgICAgICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkpOworCisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOworCS8qIENhbid0IHRyYWNrPyAgSXQncyBub3QgZHVlIHRvIHN0cmVzcywgb3IgY29ubnRyYWNrIHdvdWxkCisJICAgaGF2ZSBkcm9wcGVkIGl0LiAgSGVuY2UgaXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsdHkgdG8KKwkgICBwYWNrZXQgZmlsdGVyIGl0IG91dCwgb3IgaW1wbGVtZW50IGNvbm50cmFjay9OQVQgZm9yIHRoYXQKKwkgICBwcm90b2NvbC4gOCkgLS1SUiAqLworCWlmICghY3QpIHsKKwkJLyogRXhjZXB0aW9uOiBJQ01QIHJlZGlyZWN0IHRvIG5ldyBjb25uZWN0aW9uIChub3QgaW4KKyAgICAgICAgICAgICAgICAgICBoYXNoIHRhYmxlIHlldCkuICBXZSBtdXN0IG5vdCBsZXQgdGhpcyB0aHJvdWdoLCBpbgorICAgICAgICAgICAgICAgICAgIGNhc2Ugd2UncmUgZG9pbmcgTkFUIHRvIHRoZSBzYW1lIG5ldHdvcmsuICovCisJCWlmICgoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkgeworCQkJc3RydWN0IGljbXBoZHIgX2hkciwgKmhwOworCisJCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwKKwkJCQkJCSgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCisJCQkJCQlzaXplb2YoX2hkciksICZfaGRyKTsKKwkJCWlmIChocCAhPSBOVUxMICYmCisJCQkgICAgaHAtPnR5cGUgPT0gSUNNUF9SRURJUkVDVCkKKwkJCQlyZXR1cm4gTkZfRFJPUDsKKwkJfQorCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCS8qIERvbid0IHRyeSB0byBOQVQgaWYgdGhpcyBwYWNrZXQgaXMgbm90IGNvbm50cmFja2VkICovCisJaWYgKGN0ID09ICZuZl9jb25udHJhY2tfdW50cmFja2VkKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJbmF0ID0gbmZjdF9uYXQoY3QpOworCWlmICghbmF0KQorCQlyZXR1cm4gTkZfRFJPUDsKKworCXN3aXRjaCAoY3RpbmZvKSB7CisJY2FzZSBJUF9DVF9SRUxBVEVEOgorCWNhc2UgSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWToKKwkJaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCQlpZiAoIW5mX25hdF9pY21wX3JlcGx5X3RyYW5zbGF0aW9uKGN0LCBjdGluZm8sCisJCQkJCQkJICAgaG9va251bSwgcHNrYikpCisJCQkJcmV0dXJuIE5GX0RST1A7CisJCQllbHNlCisJCQkJcmV0dXJuIE5GX0FDQ0VQVDsKKwkJfQorCQkvKiBGYWxsIHRocnUuLi4gKE9ubHkgSUNNUHMgY2FuIGJlIElQX0NUX0lTX1JFUExZKSAqLworCWNhc2UgSVBfQ1RfTkVXOgorCQlpbmZvID0gJm5hdC0+aW5mbzsKKworCQkvKiBTZWVuIGl0IGJlZm9yZT8gIFRoaXMgY2FuIGhhcHBlbiBmb3IgbG9vcGJhY2ssIHJldHJhbnMsCisJCSAgIG9yIGxvY2FsIHBhY2tldHMuLiAqLworCQlpZiAoIW5mX25hdF9pbml0aWFsaXplZChjdCwgbWFuaXB0eXBlKSkgeworCQkJdW5zaWduZWQgaW50IHJldDsKKworCQkJaWYgKHVubGlrZWx5KG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpKQorCQkJCS8qIE5BVCBtb2R1bGUgd2FzIGxvYWRlZCBsYXRlICovCisJCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChjdCwgaW5mbywKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tudW0pOworCQkJZWxzZSBpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9JTikKKwkJCQkvKiBMT0NBTF9JTiBob29rIGRvZXNuJ3QgaGF2ZSBhIGNoYWluISAgKi8KKwkJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGluZm8sIGhvb2tudW0pOworCQkJZWxzZQorCQkJCXJldCA9IG5mX25hdF9ydWxlX2ZpbmQocHNrYiwgaG9va251bSwgaW4sIG91dCwKKwkJCQkJCSAgICAgICBjdCwgaW5mbyk7CisKKwkJCWlmIChyZXQgIT0gTkZfQUNDRVBUKSB7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSBlbHNlCisJCQlERUJVR1AoIkFscmVhZHkgc2V0dXAgbWFuaXAgJXMgZm9yIGN0ICVwXG4iLAorCQkJICAgICAgIG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDID8gIlNSQyIgOiAiRFNUIiwKKwkJCSAgICAgICBjdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogRVNUQUJMSVNIRUQgKi8KKwkJTkZfQ1RfQVNTRVJUKGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRCB8fAorCQkJICAgICBjdGluZm8gPT0gKElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZKSk7CisJCWluZm8gPSAmbmF0LT5pbmZvOworCX0KKworCU5GX0NUX0FTU0VSVChpbmZvKTsKKwlyZXR1cm4gbmZfbmF0X3BhY2tldChjdCwgY3RpbmZvLCBob29rbnVtLCBwc2tiKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorbmZfbmF0X2luKHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCV9fYmUzMiBkYWRkciA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHI7CisKKwlyZXQgPSBuZl9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKKwkgICAgZGFkZHIgIT0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcikgeworCQlkc3RfcmVsZWFzZSgoKnBza2IpLT5kc3QpOworCQkoKnBza2IpLT5kc3QgPSBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CituZl9uYXRfb3V0KHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKyNpZmRlZiBDT05GSUdfWEZSTQorCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKyNlbmRpZgorCXVuc2lnbmVkIGludCByZXQ7CisKKwkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KKwlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgfHwKKwkgICAgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlyZXQgPSBuZl9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CisjaWZkZWYgQ09ORklHX1hGUk0KKwlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTiAmJgorCSAgICAoY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pKSAhPSBOVUxMKSB7CisJCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisKKwkJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMuaXAgIT0KKwkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLmlwCisJCSAgICB8fCBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUuYWxsICE9CisJCSAgICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51LmFsbAorCQkgICAgKQorCQkJcmV0dXJuIGlwX3hmcm1fbWVfaGFyZGVyKHBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOworCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25mX25hdF9sb2NhbF9mbih1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCisJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8CisJICAgICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJcmV0ID0gbmZfbmF0X2ZuKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOworCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOICYmCisJICAgIChjdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbykpICE9IE5VTEwpIHsKKwkJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworCQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51My5pcCAhPQorCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMuaXAKKyNpZmRlZiBDT05GSUdfWEZSTQorCQkgICAgfHwgY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51LmFsbCAhPQorCQkgICAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudS5hbGwKKyNlbmRpZgorCQkgICAgKQorCQkJaWYgKGlwX3JvdXRlX21lX2hhcmRlcihwc2tiLCBSVE5fVU5TUEVDKSkKKwkJCQlyZXQgPSBORl9EUk9QOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CituZl9uYXRfYWRqdXN0KHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisKKwljdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbyk7CisJaWYgKGN0ICYmIHRlc3RfYml0KElQU19TRVFfQURKVVNUX0JJVCwgJmN0LT5zdGF0dXMpKSB7CisJICAgICAgICBERUJVR1AoIm5mX25hdF9zdGFuZGFsb25lOiBhZGp1c3Rpbmcgc2VxdWVuY2UgbnVtYmVyXG4iKTsKKwkgICAgICAgIGlmICghbmZfbmF0X3NlcV9hZGp1c3QocHNrYiwgY3QsIGN0aW5mbykpCisJICAgICAgICAgICAgICAgIHJldHVybiBORl9EUk9QOworCX0KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBXZSBtdXN0IGJlIGFmdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgYW5kIGJlZm9yZSBwYWNrZXQgZmlsdGVyaW5nLiAqLworCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIG5mX25hdF9vcHNbXSA9IHsKKwkvKiBCZWZvcmUgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIGRlc3RpbmF0aW9uICovCisJeworCQkuaG9vawkJPSBuZl9uYXRfaW4sCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQsCisJCS5ob29rbnVtCT0gTkZfSVBfUFJFX1JPVVRJTkcsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNULAorCX0sCisJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSAqLworCXsKKwkJLmhvb2sJCT0gbmZfbmF0X291dCwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0JPSBORl9JUF9QT1NUX1JPVVRJTkcsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDLAorCX0sCisJLyogQWZ0ZXIgY29ubnRyYWNrLCBhZGp1c3Qgc2VxdWVuY2UgbnVtYmVyICovCisJeworCQkuaG9vawkJPSBuZl9uYXRfYWRqdXN0LAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVULAorCQkuaG9va251bQk9IE5GX0lQX1BPU1RfUk9VVElORywKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9TRVFfQURKVVNULAorCX0sCisJLyogQmVmb3JlIHBhY2tldCBmaWx0ZXJpbmcsIGNoYW5nZSBkZXN0aW5hdGlvbiAqLworCXsKKwkJLmhvb2sJCT0gbmZfbmF0X2xvY2FsX2ZuLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVULAorCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX09VVCwKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9EU1QsCisJfSwKKwkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBjaGFuZ2Ugc291cmNlICovCisJeworCQkuaG9vawkJPSBuZl9uYXRfZm4sCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQsCisJCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfSU4sCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDLAorCX0sCisJLyogQWZ0ZXIgY29ubnRyYWNrLCBhZGp1c3Qgc2VxdWVuY2UgbnVtYmVyICovCisJeworCQkuaG9vawkJPSBuZl9uYXRfYWRqdXN0LAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVULAorCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAorCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX1NFUV9BREpVU1QsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX25hdF9zdGFuZGFsb25lX2luaXQodm9pZCkKK3sKKwlpbnQgc2l6ZSwgcmV0ID0gMDsKKworCW5lZWRfY29ubnRyYWNrKCk7CisKKwlzaXplID0gQUxJR04oc2l6ZW9mKHN0cnVjdCBuZl9jb25uKSwgX19hbGlnbm9mX18oc3RydWN0IG5mX2Nvbm5fbmF0KSkgKworCSAgICAgICBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fbmF0KTsKKwlyZXQgPSBuZl9jb25udHJhY2tfcmVnaXN0ZXJfY2FjaGUoTkZfQ1RfRl9OQVQsICJuZl9uYXQ6YmFzZSIsIHNpemUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmZfbmF0X2luaXQ6IFVuYWJsZSB0byBjcmVhdGUgc2xhYiBjYWNoZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJc2l6ZSA9IEFMSUdOKHNpemUsIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jb25uX2hlbHApKSArCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9oZWxwKTsKKwlyZXQgPSBuZl9jb25udHJhY2tfcmVnaXN0ZXJfY2FjaGUoTkZfQ1RfRl9OQVR8TkZfQ1RfRl9IRUxQLAorCQkJCQkgICJuZl9uYXQ6aGVscCIsIHNpemUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmZfbmF0X2luaXQ6IFVuYWJsZSB0byBjcmVhdGUgc2xhYiBjYWNoZVxuIik7CisJCWdvdG8gY2xlYW51cF9yZWdpc3Rlcl9jYWNoZTsKKwl9CisjaWZkZWYgQ09ORklHX1hGUk0KKwlCVUdfT04oaXBfbmF0X2RlY29kZV9zZXNzaW9uICE9IE5VTEwpOworCWlwX25hdF9kZWNvZGVfc2Vzc2lvbiA9IG5hdF9kZWNvZGVfc2Vzc2lvbjsKKyNlbmRpZgorCXJldCA9IG5mX25hdF9ydWxlX2luaXQoKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoIm5mX25hdF9pbml0OiBjYW4ndCBzZXR1cCBydWxlcy5cbiIpOworCQlnb3RvIGNsZWFudXBfZGVjb2RlX3Nlc3Npb247CisJfQorCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2tzKG5mX25hdF9vcHMsIEFSUkFZX1NJWkUobmZfbmF0X29wcykpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygibmZfbmF0X2luaXQ6IGNhbid0IHJlZ2lzdGVyIGhvb2tzLlxuIik7CisJCWdvdG8gY2xlYW51cF9ydWxlX2luaXQ7CisJfQorCW5mX25hdF9tb2R1bGVfaXNfbG9hZGVkID0gMTsKKwlyZXR1cm4gcmV0OworCisgY2xlYW51cF9ydWxlX2luaXQ6CisJbmZfbmF0X3J1bGVfY2xlYW51cCgpOworIGNsZWFudXBfZGVjb2RlX3Nlc3Npb246CisjaWZkZWYgQ09ORklHX1hGUk0KKwlpcF9uYXRfZGVjb2RlX3Nlc3Npb24gPSBOVUxMOworCXN5bmNocm9uaXplX25ldCgpOworI2VuZGlmCisJbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfY2FjaGUoTkZfQ1RfRl9OQVR8TkZfQ1RfRl9IRUxQKTsKKyBjbGVhbnVwX3JlZ2lzdGVyX2NhY2hlOgorCW5mX2Nvbm50cmFja191bnJlZ2lzdGVyX2NhY2hlKE5GX0NUX0ZfTkFUKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X3N0YW5kYWxvbmVfZmluaSh2b2lkKQoreworCW5mX3VucmVnaXN0ZXJfaG9va3MobmZfbmF0X29wcywgQVJSQVlfU0laRShuZl9uYXRfb3BzKSk7CisJbmZfbmF0X3J1bGVfY2xlYW51cCgpOworCW5mX25hdF9tb2R1bGVfaXNfbG9hZGVkID0gMDsKKyNpZmRlZiBDT05GSUdfWEZSTQorCWlwX25hdF9kZWNvZGVfc2Vzc2lvbiA9IE5VTEw7CisJc3luY2hyb25pemVfbmV0KCk7CisjZW5kaWYKKwkvKiBDb25udHJhY2sgY2FjaGVzIGFyZSB1bnJlZ2lzdGVyZWQgaW4gbmZfY29ubnRyYWNrX2NsZWFudXAgKi8KK30KKworbW9kdWxlX2luaXQobmZfbmF0X3N0YW5kYWxvbmVfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9uYXRfc3RhbmRhbG9uZV9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcF9uYXQiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfdGZ0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF90ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2NmI3OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfdGZ0cC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIChDKSAyMDAxLTIwMDIgTWFnbnVzIEJvZGVuIDxtYkBvemFiYS5taW5lLm51PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmg+CisKK01PRFVMRV9BVVRIT1IoIk1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVEZUUCBOQVQgaGVscGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwX25hdF90ZnRwIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBleHAtPm1hc3RlcjsKKworCWV4cC0+c2F2ZWRfcHJvdG8udWRwLnBvcnQKKwkJPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUudWRwLnBvcnQ7CisJZXhwLT5kaXIgPSBJUF9DVF9ESVJfUkVQTFk7CisJZXhwLT5leHBlY3RmbiA9IG5mX25hdF9mb2xsb3dfbWFzdGVyOworCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQorCQlyZXR1cm4gTkZfRFJPUDsKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X3RmdHBfZmluaSh2b2lkKQoreworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfdGZ0cF9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbmZfbmF0X3RmdHBfaW5pdCh2b2lkKQoreworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmZfbmF0X3RmdHBfaG9vaykpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfdGZ0cF9ob29rLCBoZWxwKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobmZfbmF0X3RmdHBfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9uYXRfdGZ0cF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb2MuYyBiL25ldC9pcHY0L3Byb2MuYwppbmRleCA5YzZjYmUzLi5jZDg3M2RhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9wcm9jLmMKKysrIGIvbmV0L2lwdjQvcHJvYy5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwbGl0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTY2LDYgKzY3LDcgQEAKIAkJICAgdGNwX2RlYXRoX3Jvdy50d19jb3VudCwgYXRvbWljX3JlYWQoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCksCiAJCSAgIGF0b21pY19yZWFkKCZ0Y3BfbWVtb3J5X2FsbG9jYXRlZCkpOwogCXNlcV9wcmludGYoc2VxLCAiVURQOiBpbnVzZSAlZFxuIiwgZm9sZF9wcm90X2ludXNlKCZ1ZHBfcHJvdCkpOworCXNlcV9wcmludGYoc2VxLCAiVURQTElURTogaW51c2UgJWRcbiIsIGZvbGRfcHJvdF9pbnVzZSgmdWRwbGl0ZV9wcm90KSk7CiAJc2VxX3ByaW50ZihzZXEsICJSQVc6IGludXNlICVkXG4iLCBmb2xkX3Byb3RfaW51c2UoJnJhd19wcm90KSk7CiAJc2VxX3ByaW50ZihzZXEsICAiRlJBRzogaW51c2UgJWQgbWVtb3J5ICVkXG4iLCBpcF9mcmFnX25xdWV1ZXMsCiAJCSAgIGF0b21pY19yZWFkKCZpcF9mcmFnX21lbSkpOwpAQCAtMzA0LDYgKzMwNiwxNyBAQAogCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdWRwX3N0YXRpc3RpY3MsIAogCQkJCSAgICAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7CiAKKwkvKiB0aGUgVURQIGFuZCBVRFAtTGl0ZSBNSUJzIGFyZSB0aGUgc2FtZSAqLworCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKKwkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIHVkcGxpdGVfc3RhdGlzdGljcywKKwkJCQkgICAgICBzbm1wNF91ZHBfbGlzdFtpXS5lbnRyeSkgICAgICk7CisKIAlzZXFfcHV0YyhzZXEsICdcbicpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcmF3LmMgYi9uZXQvaXB2NC9yYXcuYwppbmRleCA1YzMxZGVhLi5hNmM2M2JiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yYXcuYworKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtODU0LDggKzg1NCw4IEBACiBzdGF0aWMgX19pbmxpbmVfXyBjaGFyICpnZXRfcmF3X3NvY2soc3RydWN0IHNvY2sgKnNwLCBjaGFyICp0bXBidWYsIGludCBpKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNwKTsKLQl1bnNpZ25lZCBpbnQgZGVzdCA9IGluZXQtPmRhZGRyLAotCQkgICAgIHNyYyA9IGluZXQtPnJjdl9zYWRkcjsKKwlfX2JlMzIgZGVzdCA9IGluZXQtPmRhZGRyLAorCSAgICAgICBzcmMgPSBpbmV0LT5yY3Zfc2FkZHI7CiAJX191MTYgZGVzdHAgPSAwLAogCSAgICAgIHNyY3AgID0gaW5ldC0+bnVtOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCA5MjVlZTRkLi45ZjM5MjRjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTU2NiwxMSArNTY2LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9rZXlzKHN0cnVjdCBmbG93aSAqZmwxLCBzdHJ1Y3QgZmxvd2kgKmZsMikKIHsKLQlyZXR1cm4gKChmbDEtPm5sX3UuaXA0X3UuZGFkZHIgXiBmbDItPm5sX3UuaXA0X3UuZGFkZHIpIHwKLQkJKGZsMS0+bmxfdS5pcDRfdS5zYWRkciBeIGZsMi0+bmxfdS5pcDRfdS5zYWRkcikgfAotI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKLQkJKGZsMS0+bmxfdS5pcDRfdS5md21hcmsgXiBmbDItPm5sX3UuaXA0X3UuZndtYXJrKSB8Ci0jZW5kaWYKKwlyZXR1cm4gKChfX2ZvcmNlIHUzMikoKGZsMS0+bmxfdS5pcDRfdS5kYWRkciBeIGZsMi0+bmxfdS5pcDRfdS5kYWRkcikgfAorCQkoZmwxLT5ubF91LmlwNF91LnNhZGRyIF4gZmwyLT5ubF91LmlwNF91LnNhZGRyKSkgfAorCQkoZmwxLT5tYXJrIF4gZmwyLT5tYXJrKSB8CiAJCSgqKHUxNiAqKSZmbDEtPm5sX3UuaXA0X3UudG9zIF4KIAkJICoodTE2ICopJmZsMi0+bmxfdS5pcDRfdS50b3MpIHwKIAkJKGZsMS0+b2lmIF4gZmwyLT5vaWYpIHwKQEAgLTE2NDMsOSArMTY0MSw3IEBACiAJcnRoLT5mbC5mbDRfZHN0CT0gZGFkZHI7CiAJcnRoLT5ydF9kc3QJPSBkYWRkcjsKIAlydGgtPmZsLmZsNF90b3MJPSB0b3M7Ci0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCXJ0aC0+ZmwuZmw0X2Z3bWFyaz0gc2tiLT5uZm1hcms7Ci0jZW5kaWYKKwlydGgtPmZsLm1hcmsgICAgPSBza2ItPm1hcms7CiAJcnRoLT5mbC5mbDRfc3JjCT0gc2FkZHI7CiAJcnRoLT5ydF9zcmMJPSBzYWRkcjsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQpAQCAtMTc4OSw5ICsxNzg1LDcgQEAKIAlydGgtPmZsLmZsNF9kc3QJPSBkYWRkcjsKIAlydGgtPnJ0X2RzdAk9IGRhZGRyOwogCXJ0aC0+ZmwuZmw0X3Rvcwk9IHRvczsKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JcnRoLT5mbC5mbDRfZndtYXJrPSBza2ItPm5mbWFyazsKLSNlbmRpZgorCXJ0aC0+ZmwubWFyayAgICA9IHNrYi0+bWFyazsKIAlydGgtPmZsLmZsNF9zcmMJPSBzYWRkcjsKIAlydGgtPnJ0X3NyYwk9IHNhZGRyOwogCXJ0aC0+cnRfZ2F0ZXdheQk9IGRhZGRyOwpAQCAtMTkyMCwxMCArMTkxNCw4IEBACiAJCQkJCS5zYWRkciA9IHNhZGRyLAogCQkJCQkudG9zID0gdG9zLAogCQkJCQkuc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRSwKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JCQkJCS5md21hcmsgPSBza2ItPm5mbWFyawotI2VuZGlmCiAJCQkJICAgICAgfSB9LAorCQkJICAgIC5tYXJrID0gc2tiLT5tYXJrLAogCQkJICAgIC5paWYgPSBkZXYtPmlmaW5kZXggfTsKIAl1bnNpZ25lZAlmbGFncyA9IDA7CiAJdTMyCQlpdGFnID0gMDsKQEAgLTIwMzQsOSArMjAyNiw3IEBACiAJcnRoLT5mbC5mbDRfZHN0CT0gZGFkZHI7CiAJcnRoLT5ydF9kc3QJPSBkYWRkcjsKIAlydGgtPmZsLmZsNF90b3MJPSB0b3M7Ci0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCXJ0aC0+ZmwuZmw0X2Z3bWFyaz0gc2tiLT5uZm1hcms7Ci0jZW5kaWYKKwlydGgtPmZsLm1hcmsgICAgPSBza2ItPm1hcms7CiAJcnRoLT5mbC5mbDRfc3JjCT0gc2FkZHI7CiAJcnRoLT5ydF9zcmMJPSBzYWRkcjsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQpAQCAtMjExMyw5ICsyMTAzLDcgQEAKIAkJICAgIHJ0aC0+ZmwuZmw0X3NyYyA9PSBzYWRkciAmJgogCQkgICAgcnRoLT5mbC5paWYgPT0gaWlmICYmCiAJCSAgICBydGgtPmZsLm9pZiA9PSAwICYmCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQkgICAgcnRoLT5mbC5mbDRfZndtYXJrID09IHNrYi0+bmZtYXJrICYmCi0jZW5kaWYKKwkJICAgIHJ0aC0+ZmwubWFyayA9PSBza2ItPm1hcmsgJiYKIAkJICAgIHJ0aC0+ZmwuZmw0X3RvcyA9PSB0b3MpIHsKIAkJCXJ0aC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7CiAJCQlkc3RfaG9sZCgmcnRoLT51LmRzdCk7CkBAIC0yMjM5LDkgKzIyMjcsNyBAQAogCXJ0aC0+ZmwuZmw0X3Rvcwk9IHRvczsKIAlydGgtPmZsLmZsNF9zcmMJPSBvbGRmbHAtPmZsNF9zcmM7CiAJcnRoLT5mbC5vaWYJPSBvbGRmbHAtPm9pZjsKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JcnRoLT5mbC5mbDRfZndtYXJrPSBvbGRmbHAtPmZsNF9md21hcms7Ci0jZW5kaWYKKwlydGgtPmZsLm1hcmsgICAgPSBvbGRmbHAtPm1hcms7CiAJcnRoLT5ydF9kc3QJPSBmbC0+Zmw0X2RzdDsKIAlydGgtPnJ0X3NyYwk9IGZsLT5mbDRfc3JjOwogCXJ0aC0+cnRfaWlmCT0gb2xkZmxwLT5vaWYgPyA6IGRldl9vdXQtPmlmaW5kZXg7CkBAIC0yMzg1LDEwICsyMzcxLDggQEAKIAkJCQkJLnNjb3BlID0gKCh0b3MgJiBSVE9fT05MSU5LKSA/CiAJCQkJCQkgIFJUX1NDT1BFX0xJTksgOgogCQkJCQkJICBSVF9TQ09QRV9VTklWRVJTRSksCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQkJCQkuZndtYXJrID0gb2xkZmxwLT5mbDRfZndtYXJrCi0jZW5kaWYKIAkJCQkgICAgICB9IH0sCisJCQkgICAgLm1hcmsgPSBvbGRmbHAtPm1hcmssCiAJCQkgICAgLmlpZiA9IGxvb3BiYWNrX2Rldi5pZmluZGV4LAogCQkJICAgIC5vaWYgPSBvbGRmbHAtPm9pZiB9OwogCXN0cnVjdCBmaWJfcmVzdWx0IHJlczsKQEAgLTI1ODMsOSArMjU2Nyw3IEBACiAJCSAgICBydGgtPmZsLmZsNF9zcmMgPT0gZmxwLT5mbDRfc3JjICYmCiAJCSAgICBydGgtPmZsLmlpZiA9PSAwICYmCiAJCSAgICBydGgtPmZsLm9pZiA9PSBmbHAtPm9pZiAmJgotI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKLQkJICAgIHJ0aC0+ZmwuZmw0X2Z3bWFyayA9PSBmbHAtPmZsNF9md21hcmsgJiYKLSNlbmRpZgorCQkgICAgcnRoLT5mbC5tYXJrID09IGZscC0+bWFyayAmJgogCQkgICAgISgocnRoLT5mbC5mbDRfdG9zIF4gZmxwLT5mbDRfdG9zKSAmCiAJCQkgICAgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSkpIHsKIApAQCAtMjY0Nyw3ICsyNjI5LDggQEAKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKIAlzdHJ1Y3QgcnRtc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IHJ0YV9jYWNoZWluZm8gY2k7CisJbG9uZyBleHBpcmVzOworCXUzMiBpZCA9IDAsIHRzID0gMCwgdHNhZ2UgPSAwLCBlcnJvcjsKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKQEAgLTI2OTQsMjAgKzI2NzcsMTMgQEAKIAlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPnUuZHN0Lm1ldHJpY3MpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQljaS5ydGFfbGFzdHVzZQk9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcnQtPnUuZHN0Lmxhc3R1c2UpOwotCWNpLnJ0YV91c2VkCT0gcnQtPnUuZHN0Ll9fdXNlOwotCWNpLnJ0YV9jbG50cmVmCT0gYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCk7Ci0JaWYgKHJ0LT51LmRzdC5leHBpcmVzKQotCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChydC0+dS5kc3QuZXhwaXJlcyAtIGppZmZpZXMpOwotCWVsc2UKLQkJY2kucnRhX2V4cGlyZXMgPSAwOwotCWNpLnJ0YV9lcnJvcgk9IHJ0LT51LmRzdC5lcnJvcjsKLQljaS5ydGFfaWQJPSBjaS5ydGFfdHMgPSBjaS5ydGFfdHNhZ2UgPSAwOworCWVycm9yID0gcnQtPnUuZHN0LmVycm9yOworCWV4cGlyZXMgPSBydC0+dS5kc3QuZXhwaXJlcyA/IHJ0LT51LmRzdC5leHBpcmVzIC0gamlmZmllcyA6IDA7CiAJaWYgKHJ0LT5wZWVyKSB7Ci0JCWNpLnJ0YV9pZCA9IHJ0LT5wZWVyLT5pcF9pZF9jb3VudDsKKwkJaWQgPSBydC0+cGVlci0+aXBfaWRfY291bnQ7CiAJCWlmIChydC0+cGVlci0+dGNwX3RzX3N0YW1wKSB7Ci0JCQljaS5ydGFfdHMgPSBydC0+cGVlci0+dGNwX3RzOwotCQkJY2kucnRhX3RzYWdlID0geHRpbWUudHZfc2VjIC0gcnQtPnBlZXItPnRjcF90c19zdGFtcDsKKwkJCXRzID0gcnQtPnBlZXItPnRjcF90czsKKwkJCXRzYWdlID0geHRpbWUudHZfc2VjIC0gcnQtPnBlZXItPnRjcF90c19zdGFtcDsKIAkJfQogCX0KIApAQCAtMjcyNiw3ICsyNzAyLDcgQEAKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoZXJyID09IC1FTVNHU0laRSkKIAkJCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCQkJCQljaS5ydGFfZXJyb3IgPSBlcnI7CisJCQkJCWVycm9yID0gZXJyOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlCkBAIC0yNzM0LDcgKzI3MTAsOSBAQAogCQkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfSUlGLCBydC0+ZmwuaWlmKTsKIAl9CiAKLQlOTEFfUFVUKHNrYiwgUlRBX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKwlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT51LmRzdCwgaWQsIHRzLCB0c2FnZSwKKwkJCSAgICAgICBleHBpcmVzLCBlcnJvcikgPCAwKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKaW5kZXggNjYxZTBhNC4uNmIxOTUzMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMzUsMjMgKzM1LDIzIEBACiAjZGVmaW5lIENPT0tJRUJJVFMgMjQJLyogVXBwZXIgYml0cyBzdG9yZSBjb3VudCAqLwogI2RlZmluZSBDT09LSUVNQVNLICgoKF9fdTMyKTEgPDwgQ09PS0lFQklUUykgLSAxKQogCi1zdGF0aWMgdTMyIGNvb2tpZV9oYXNoKHUzMiBzYWRkciwgdTMyIGRhZGRyLCB1MzIgc3BvcnQsIHUzMiBkcG9ydCwKK3N0YXRpYyB1MzIgY29va2llX2hhc2goX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0LAogCQkgICAgICAgdTMyIGNvdW50LCBpbnQgYykKIHsKIAlfX3UzMiB0bXBbMTYgKyA1ICsgU0hBX1dPUktTUEFDRV9XT1JEU107CiAKIAltZW1jcHkodG1wICsgMywgc3luY29va2llX3NlY3JldFtjXSwgc2l6ZW9mKHN5bmNvb2tpZV9zZWNyZXRbY10pKTsKLQl0bXBbMF0gPSBzYWRkcjsKLQl0bXBbMV0gPSBkYWRkcjsKLQl0bXBbMl0gPSAoc3BvcnQgPDwgMTYpICsgZHBvcnQ7CisJdG1wWzBdID0gKF9fZm9yY2UgdTMyKXNhZGRyOworCXRtcFsxXSA9IChfX2ZvcmNlIHUzMilkYWRkcjsKKwl0bXBbMl0gPSAoKF9fZm9yY2UgdTMyKXNwb3J0IDw8IDE2KSArIChfX2ZvcmNlIHUzMilkcG9ydDsKIAl0bXBbM10gPSBjb3VudDsKIAlzaGFfdHJhbnNmb3JtKHRtcCArIDE2LCAoX191OCAqKXRtcCwgdG1wICsgMTYgKyA1KTsKIAogCXJldHVybiB0bXBbMTddOwogfQogCi1zdGF0aWMgX191MzIgc2VjdXJlX3RjcF9zeW5fY29va2llKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwgX191MTYgc3BvcnQsCi0JCQkJICAgX191MTYgZHBvcnQsIF9fdTMyIHNzZXEsIF9fdTMyIGNvdW50LAorc3RhdGljIF9fdTMyIHNlY3VyZV90Y3Bfc3luX2Nvb2tpZShfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgX19iZTE2IHNwb3J0LAorCQkJCSAgIF9fYmUxNiBkcG9ydCwgX191MzIgc3NlcSwgX191MzIgY291bnQsCiAJCQkJICAgX191MzIgZGF0YSkKIHsKIAkvKgpAQCAtODAsOCArODAsOCBAQAogICogIm1heGRpZmYiIGlmIHRoZSBjdXJyZW50IChwYXNzZWQtaW4pICJjb3VudCIuICBUaGUgcmV0dXJuIHZhbHVlCiAgKiBpcyAoX191MzIpLTEgaWYgdGhpcyB0ZXN0IGZhaWxzLgogICovCi1zdGF0aWMgX191MzIgY2hlY2tfdGNwX3N5bl9jb29raWUoX191MzIgY29va2llLCBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCi0JCQkJICBfX3UxNiBzcG9ydCwgX191MTYgZHBvcnQsIF9fdTMyIHNzZXEsCitzdGF0aWMgX191MzIgY2hlY2tfdGNwX3N5bl9jb29raWUoX191MzIgY29va2llLCBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkgIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0LCBfX3UzMiBzc2VxLAogCQkJCSAgX191MzIgY291bnQsIF9fdTMyIG1heGRpZmYpCiB7CiAJX191MzIgZGlmZjsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCX0KIAlpcmVxID0gaW5ldF9yc2socmVxKTsKIAl0cmVxID0gdGNwX3JzayhyZXEpOwotCXRyZXEtPnJjdl9pc24JCT0gaHRvbmwoc2tiLT5oLnRoLT5zZXEpIC0gMTsKKwl0cmVxLT5yY3ZfaXNuCQk9IG50b2hsKHNrYi0+aC50aC0+c2VxKSAtIDE7CiAJdHJlcS0+c250X2lzbgkJPSBjb29raWU7IAogCXJlcS0+bXNzCQk9IG1zczsKICAJaXJlcS0+cm10X3BvcnQJCT0gc2tiLT5oLnRoLT5zb3VyY2U7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IDE1MDYxYjMuLmRmY2Y0N2YgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC0xMjksNiArMTI5LDY3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBwcm9jX3RjcF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqY3RsLAorCQkJCQkJIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJCQkJIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCQkJCSBsb2ZmX3QgKnBwb3MpCit7CisJY3RsX3RhYmxlIHRibCA9IHsgLm1heGxlbiA9IFRDUF9DQV9CVUZfTUFYLCB9OworCWludCByZXQ7CisKKwl0YmwuZGF0YSA9IGttYWxsb2ModGJsLm1heGxlbiwgR0ZQX1VTRVIpOworCWlmICghdGJsLmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXRjcF9nZXRfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSwgVENQX0NBX0JVRl9NQVgpOworCXJldCA9IHByb2NfZG9zdHJpbmcoJnRibCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJa2ZyZWUodGJsLmRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKmN0bCwKKwkJCQkJICAgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCQkJICAgbG9mZl90ICpwcG9zKQoreworCWN0bF90YWJsZSB0YmwgPSB7IC5tYXhsZW4gPSBUQ1BfQ0FfQlVGX01BWCB9OworCWludCByZXQ7CisKKwl0YmwuZGF0YSA9IGttYWxsb2ModGJsLm1heGxlbiwgR0ZQX1VTRVIpOworCWlmICghdGJsLmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJdGNwX2dldF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSwgdGJsLm1heGxlbik7CisJcmV0ID0gcHJvY19kb3N0cmluZygmdGJsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAod3JpdGUgJiYgcmV0ID09IDApCisJCXJldCA9IHRjcF9zZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wodGJsLmRhdGEpOworCWtmcmVlKHRibC5kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0cmF0ZWd5X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsCisJCQkJCSAgICAgICBpbnQgbmxlbiwgdm9pZCBfX3VzZXIgKm9sZHZhbCwKKwkJCQkJICAgICAgIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkJCSAgICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAorCQkJCQkgICAgICAgdm9pZCAqKmNvbnRleHQpCit7CisJY3RsX3RhYmxlIHRibCA9IHsgLm1heGxlbiA9IFRDUF9DQV9CVUZfTUFYIH07CisJaW50IHJldDsKKworCXRibC5kYXRhID0ga21hbGxvYyh0YmwubWF4bGVuLCBHRlBfVVNFUik7CisJaWYgKCF0YmwuZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0Y3BfZ2V0X2F2YWlsYWJsZV9jb25nZXN0aW9uX2NvbnRyb2wodGJsLmRhdGEsIHRibC5tYXhsZW4pOworCXJldCA9IHN5c2N0bF9zdHJpbmcoJnRibCwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbiwKKwkJCSAgICBjb250ZXh0KTsKKwlpZiAocmV0ID09IDAgJiYgbmV3dmFsICYmIG5ld2xlbikKKwkJcmV0ID0gdGNwX3NldF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSk7CisJa2ZyZWUodGJsLmRhdGEpOworCisJcmV0dXJuIHJldDsKKworfQorCiBjdGxfdGFibGUgaXB2NF90YWJsZVtdID0gewogICAgICAgICB7CiAJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9USU1FU1RBTVBTLApAQCAtNzMxLDYgKzc5MiwyMSBAQAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfTkVUTEFCRUwgKi8KKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfQVZBSUxfQ09OR19DT05UUk9MLAorCQkucHJvY25hbWUJPSAidGNwX2F2YWlsYWJsZV9jb25nZXN0aW9uX2NvbnRyb2wiLAorCQkubWF4bGVuCQk9IFRDUF9DQV9CVUZfTUFYLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyICAgPSAmcHJvY190Y3BfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9BTExPV0VEX0NPTkdfQ09OVFJPTCwKKwkJLnByb2NuYW1lCT0gInRjcF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCIsCisJCS5tYXhsZW4JCT0gVENQX0NBX0JVRl9NQVgsCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sLAorCQkuc3RyYXRlZ3kJPSAmc3RyYXRlZ3lfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wsCisJfSwKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCBjMDVlOGVkLi4wOTBjNjkwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMjU4LDYgKzI1OCw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAKICNpbmNsdWRlIDxuZXQvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KQEAgLTQ2MiwxMSArNDYzLDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2VudGFpbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNrYi0+Y3N1bSA9IDA7Ci0JVENQX1NLQl9DQihza2IpLT5zZXEgPSB0cC0+d3JpdGVfc2VxOwotCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IHRwLT53cml0ZV9zZXE7Ci0JVENQX1NLQl9DQihza2IpLT5mbGFncyA9IFRDUENCX0ZMQUdfQUNLOwotCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gMDsKKwlzdHJ1Y3QgdGNwX3NrYl9jYiAqdGNiID0gVENQX1NLQl9DQihza2IpOworCisJc2tiLT5jc3VtICAgID0gMDsKKwl0Y2ItPnNlcSAgICAgPSB0Y2ItPmVuZF9zZXEgPSB0cC0+d3JpdGVfc2VxOworCXRjYi0+ZmxhZ3MgICA9IFRDUENCX0ZMQUdfQUNLOworCXRjYi0+c2Fja2VkICA9IDA7CiAJc2tiX2hlYWRlcl9yZWxlYXNlKHNrYik7CiAJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOwogCXNrX2NoYXJnZV9za2Ioc2ssIHNrYik7CkBAIC0xOTQyLDYgKzE5NDQsMTMgQEAKIAkJfQogCQlicmVhazsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJY2FzZSBUQ1BfTUQ1U0lHOgorCQkvKiBSZWFkIHRoZSBJUC0+S2V5IG1hcHBpbmdzIGZyb20gdXNlcnNwYWNlICovCisJCWVyciA9IHRwLT5hZl9zcGVjaWZpYy0+bWQ1X3BhcnNlKHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwpAQCAtMjE1NCw3ICsyMTYzLDcgQEAKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIAl1bnNpZ25lZCB0aGxlbjsKIAl1bnNpZ25lZCBpbnQgc2VxOwotCXVuc2lnbmVkIGludCBkZWx0YTsKKwlfX2JlMzIgZGVsdGE7CiAJdW5zaWduZWQgaW50IG9sZGxlbjsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCkBAIC0yMjA3LDcgKzIyMTYsOCBAQAogCWRvIHsKIAkJdGgtPmZpbiA9IHRoLT5wc2ggPSAwOwogCi0JCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQodGgtPmNoZWNrICsgZGVsdGEpOworCQl0aC0+Y2hlY2sgPSB+Y3N1bV9mb2xkKChfX2ZvcmNlIF9fd3N1bSkoKF9fZm9yY2UgdTMyKXRoLT5jaGVjayArCisJCQkJICAgICAgIChfX2ZvcmNlIHUzMilkZWx0YSkpOwogCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJCXRoLT5jaGVjayA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoc2tiLT5oLnJhdywgdGhsZW4sCiAJCQkJCQkJICAgc2tiLT5jc3VtKSk7CkBAIC0yMjIxLDcgKzIyMzEsOCBAQAogCX0gd2hpbGUgKHNrYi0+bmV4dCk7CiAKIAlkZWx0YSA9IGh0b25sKG9sZGxlbiArIChza2ItPnRhaWwgLSBza2ItPmgucmF3KSArIHNrYi0+ZGF0YV9sZW4pOwotCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQodGgtPmNoZWNrICsgZGVsdGEpOworCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQoKF9fZm9yY2UgX193c3VtKSgoX19mb3JjZSB1MzIpdGgtPmNoZWNrICsKKwkJCQkoX19mb3JjZSB1MzIpZGVsdGEpKTsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2ItPmgucmF3LCB0aGxlbiwKIAkJCQkJCSAgIHNrYi0+Y3N1bSkpOwpAQCAtMjIzMSw2ICsyMjQyLDEzNSBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y3BfdHNvX3NlZ21lbnQpOwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRjcF9tZDVzaWdfdXNlcnM7CitzdGF0aWMgc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqKnRjcF9tZDVzaWdfcG9vbDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGNwX21kNXNpZ19wb29sX2xvY2spOworCitzdGF0aWMgdm9pZCBfX3RjcF9mcmVlX21kNXNpZ19wb29sKHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipwb29sKQoreworCWludCBjcHU7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICpwID0gKnBlcl9jcHVfcHRyKHBvb2wsIGNwdSk7CisJCWlmIChwKSB7CisJCQlpZiAocC0+bWQ1X2Rlc2MudGZtKQorCQkJCWNyeXB0b19mcmVlX2hhc2gocC0+bWQ1X2Rlc2MudGZtKTsKKwkJCWtmcmVlKHApOworCQkJcCA9IE5VTEw7CisJCX0KKwl9CisJZnJlZV9wZXJjcHUocG9vbCk7Cit9CisKK3ZvaWQgdGNwX2ZyZWVfbWQ1c2lnX3Bvb2wodm9pZCkKK3sKKwlzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICoqcG9vbCA9IE5VTEw7CisKKwlzcGluX2xvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKwlpZiAoLS10Y3BfbWQ1c2lnX3VzZXJzID09IDApIHsKKwkJcG9vbCA9IHRjcF9tZDVzaWdfcG9vbDsKKwkJdGNwX21kNXNpZ19wb29sID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKwlpZiAocG9vbCkKKwkJX190Y3BfZnJlZV9tZDVzaWdfcG9vbChwb29sKTsKK30KKworRVhQT1JUX1NZTUJPTCh0Y3BfZnJlZV9tZDVzaWdfcG9vbCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICoqX190Y3BfYWxsb2NfbWQ1c2lnX3Bvb2wodm9pZCkKK3sKKwlpbnQgY3B1OworCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipwb29sOworCisJcG9vbCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICopOworCWlmICghcG9vbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKnA7CisJCXN0cnVjdCBjcnlwdG9faGFzaCAqaGFzaDsKKworCQlwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKQorCQkJZ290byBvdXRfZnJlZTsKKwkJKnBlcl9jcHVfcHRyKHBvb2wsIGNwdSkgPSBwOworCisJCWhhc2ggPSBjcnlwdG9fYWxsb2NfaGFzaCgibWQ1IiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJCWlmICghaGFzaCB8fCBJU19FUlIoaGFzaCkpCisJCQlnb3RvIG91dF9mcmVlOworCisJCXAtPm1kNV9kZXNjLnRmbSA9IGhhc2g7CisJfQorCXJldHVybiBwb29sOworb3V0X2ZyZWU6CisJX190Y3BfZnJlZV9tZDVzaWdfcG9vbChwb29sKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqKnRjcF9hbGxvY19tZDVzaWdfcG9vbCh2b2lkKQoreworCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipwb29sOworCWludCBhbGxvYyA9IDA7CisKK3JldHJ5OgorCXNwaW5fbG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCXBvb2wgPSB0Y3BfbWQ1c2lnX3Bvb2w7CisJaWYgKHRjcF9tZDVzaWdfdXNlcnMrKyA9PSAwKSB7CisJCWFsbG9jID0gMTsKKwkJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKwl9IGVsc2UgaWYgKCFwb29sKSB7CisJCXRjcF9tZDVzaWdfdXNlcnMtLTsKKwkJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKwkJY3B1X3JlbGF4KCk7CisJCWdvdG8gcmV0cnk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisKKwlpZiAoYWxsb2MpIHsKKwkJLyogd2UgY2Fubm90IGhvbGQgc3BpbmxvY2sgaGVyZSBiZWNhdXNlIHRoaXMgbWF5IHNsZWVwLiAqLworCQlzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICoqcCA9IF9fdGNwX2FsbG9jX21kNXNpZ19wb29sKCk7CisJCXNwaW5fbG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCQlpZiAoIXApIHsKKwkJCXRjcF9tZDVzaWdfdXNlcnMtLTsKKwkJCXNwaW5fdW5sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwb29sID0gdGNwX21kNXNpZ19wb29sOworCQlpZiAocG9vbCkgeworCQkJLyogb29wcywgaXQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC4gKi8KKwkJCXNwaW5fdW5sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJCQlfX3RjcF9mcmVlX21kNXNpZ19wb29sKHApOworCQl9IGVsc2UgeworCQkJdGNwX21kNXNpZ19wb29sID0gcG9vbCA9IHA7CisJCQlzcGluX3VubG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCQl9CisJfQorCXJldHVybiBwb29sOworfQorCitFWFBPUlRfU1lNQk9MKHRjcF9hbGxvY19tZDVzaWdfcG9vbCk7CisKK3N0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKl9fdGNwX2dldF9tZDVzaWdfcG9vbChpbnQgY3B1KQoreworCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipwOworCXNwaW5fbG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCXAgPSB0Y3BfbWQ1c2lnX3Bvb2w7CisJaWYgKHApCisJCXRjcF9tZDVzaWdfdXNlcnMrKzsKKwlzcGluX3VubG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCXJldHVybiAocCA/ICpwZXJfY3B1X3B0cihwLCBjcHUpIDogTlVMTCk7Cit9CisKK0VYUE9SVF9TWU1CT0woX190Y3BfZ2V0X21kNXNpZ19wb29sKTsKKwordm9pZCBfX3RjcF9wdXRfbWQ1c2lnX3Bvb2wodm9pZCkgeworCV9fdGNwX2ZyZWVfbWQ1c2lnX3Bvb2wodGNwX21kNXNpZ19wb29sKTsKK30KKworRVhQT1JUX1NZTUJPTChfX3RjcF9wdXRfbWQ1c2lnX3Bvb2wpOworI2VuZGlmCisKIGV4dGVybiB2b2lkIF9fc2tiX2NiX3Rvb19zbWFsbF9mb3JfdGNwKGludCwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9yZW5vOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY29uZy5jIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwppbmRleCAxZTI5ODJmLi41Y2E3NzIzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY29uZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jb25nLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXNwaW5fbG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKIAljYSA9IHRjcF9jYV9maW5kKG5hbWUpOwogI2lmZGVmIENPTkZJR19LTU9ECi0JaWYgKCFjYSkgeworCWlmICghY2EgJiYgY2FwYWJsZShDQVBfU1lTX01PRFVMRSkpIHsKIAkJc3Bpbl91bmxvY2soJnRjcF9jb25nX2xpc3RfbG9jayk7CiAKIAkJcmVxdWVzdF9tb2R1bGUoInRjcF8lcyIsIG5hbWUpOwpAQCAtMTIzLDYgKzEyMyw3IEBACiAjZW5kaWYKIAogCWlmIChjYSkgeworCQljYS0+bm9uX3Jlc3RyaWN0ZWQgPSAxOwkvKiBkZWZhdWx0IGlzIGFsd2F5cyBhbGxvd2VkICovCiAJCWxpc3RfbW92ZSgmY2EtPmxpc3QsICZ0Y3BfY29uZ19saXN0KTsKIAkJcmV0ID0gMDsKIAl9CkBAIC0xMzksNiArMTQwLDIyIEBACiBsYXRlX2luaXRjYWxsKHRjcF9jb25nZXN0aW9uX2RlZmF1bHQpOwogCiAKKy8qIEJ1aWxkIHN0cmluZyB3aXRoIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbmdlc3Rpb24gY29udHJvbCB2YWx1ZXMgKi8KK3ZvaWQgdGNwX2dldF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKmJ1Ziwgc2l6ZV90IG1heGxlbikKK3sKKwlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYTsKKwlzaXplX3Qgb2ZmcyA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2EsICZ0Y3BfY29uZ19saXN0LCBsaXN0KSB7CisJCW9mZnMgKz0gc25wcmludGYoYnVmICsgb2ZmcywgbWF4bGVuIC0gb2ZmcywKKwkJCQkgIiVzJXMiLAorCQkJCSBvZmZzID09IDAgPyAiIiA6ICIgIiwgY2EtPm5hbWUpOworCisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCiAvKiBHZXQgY3VycmVudCBkZWZhdWx0IGNvbmdlc3Rpb24gY29udHJvbCAqLwogdm9pZCB0Y3BfZ2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKm5hbWUpCiB7CkBAIC0xNTIsNiArMTY5LDY0IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKKy8qIEJ1aWx0IGxpc3Qgb2Ygbm9uLXJlc3RyaWN0ZWQgY29uZ2VzdGlvbiBjb250cm9sIHZhbHVlcyAqLwordm9pZCB0Y3BfZ2V0X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKmJ1Ziwgc2l6ZV90IG1heGxlbikKK3sKKwlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYTsKKwlzaXplX3Qgb2ZmcyA9IDA7CisKKwkqYnVmID0gJ1wwJzsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2EsICZ0Y3BfY29uZ19saXN0LCBsaXN0KSB7CisJCWlmICghY2EtPm5vbl9yZXN0cmljdGVkKQorCQkJY29udGludWU7CisJCW9mZnMgKz0gc25wcmludGYoYnVmICsgb2ZmcywgbWF4bGVuIC0gb2ZmcywKKwkJCQkgIiVzJXMiLAorCQkJCSBvZmZzID09IDAgPyAiIiA6ICIgIiwgY2EtPm5hbWUpOworCisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCisvKiBDaGFuZ2UgbGlzdCBvZiBub24tcmVzdHJpY3RlZCBjb25nZXN0aW9uIGNvbnRyb2wgKi8KK2ludCB0Y3Bfc2V0X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKnZhbCkKK3sKKwlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYTsKKwljaGFyICpjbG9uZSwgKm5hbWU7CisJaW50IHJldCA9IDA7CisKKwljbG9uZSA9IGtzdHJkdXAodmFsLCBHRlBfVVNFUik7CisJaWYgKCFjbG9uZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2soJnRjcF9jb25nX2xpc3RfbG9jayk7CisJLyogcGFzcyAxIGNoZWNrIGZvciBiYWQgZW50cmllcyAqLworCXdoaWxlICgobmFtZSA9IHN0cnNlcCgmY2xvbmUsICIgIikpICYmICpuYW1lKSB7CisJCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CisJCWlmICghY2EpIHsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIHBhc3MgMiBjbGVhciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNhLCAmdGNwX2NvbmdfbGlzdCwgbGlzdCkKKwkJY2EtPm5vbl9yZXN0cmljdGVkID0gMDsKKworCS8qIHBhc3MgMyBtYXJrIGFzIGFsbG93ZWQgKi8KKwl3aGlsZSAoKG5hbWUgPSBzdHJzZXAoJnZhbCwgIiAiKSkgJiYgKm5hbWUpIHsKKwkJY2EgPSB0Y3BfY2FfZmluZChuYW1lKTsKKwkJV0FSTl9PTighY2EpOworCQlpZiAoY2EpCisJCQljYS0+bm9uX3Jlc3RyaWN0ZWQgPSAxOworCX0KK291dDoKKwlzcGluX3VubG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKwogLyogQ2hhbmdlIGNvbmdlc3Rpb24gY29udHJvbCBmb3Igc29ja2V0ICovCiBpbnQgdGNwX3NldF9jb25nZXN0aW9uX2NvbnRyb2woc3RydWN0IHNvY2sgKnNrLCBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMTYxLDEyICsyMzYsMjUgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAljYSA9IHRjcF9jYV9maW5kKG5hbWUpOworCS8qIG5vIGNoYW5nZSBhc2tpbmcgZm9yIGV4aXN0aW5nIHZhbHVlICovCiAJaWYgKGNhID09IGljc2stPmljc2tfY2Ffb3BzKQogCQlnb3RvIG91dDsKIAorI2lmZGVmIENPTkZJR19LTU9ECisJLyogbm90IGZvdW5kIGF0dGVtcHQgdG8gYXV0b2xvYWQgbW9kdWxlICovCisJaWYgKCFjYSAmJiBjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmVxdWVzdF9tb2R1bGUoInRjcF8lcyIsIG5hbWUpOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CisJfQorI2VuZGlmCiAJaWYgKCFjYSkKIAkJZXJyID0gLUVOT0VOVDsKIAorCWVsc2UgaWYgKCEoY2EtPm5vbl9yZXN0cmljdGVkIHx8IGNhcGFibGUoQ0FQX05FVF9BRE1JTikpKQorCQllcnIgPSAtRVBFUk07CisKIAllbHNlIGlmICghdHJ5X21vZHVsZV9nZXQoY2EtPm93bmVyKSkKIAkJZXJyID0gLUVCVVNZOwogCkBAIC0yNjgsNiArMzU2LDcgQEAKIAogc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfcmVubyA9IHsKIAkubmFtZQkJPSAicmVubyIsCisJLm5vbl9yZXN0cmljdGVkID0gMSwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLnNzdGhyZXNoCT0gdGNwX3Jlbm9fc3N0aHJlc2gsCiAJLmNvbmdfYXZvaWQJPSB0Y3BfcmVub19jb25nX2F2b2lkLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2h0Y3AuYyBiL25ldC9pcHY0L3RjcF9odGNwLmMKaW5kZXggMjgzYmUzYy4uNzUzOTg3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2h0Y3AuYworKysgYi9uZXQvaXB2NC90Y3BfaHRjcC5jCkBAIC0yNiwxMiArMjYsMTIgQEAKIAl1MzIJYWxwaGE7CQkvKiBGaXhlZCBwb2ludCBhcml0aCwgPDwgNyAqLwogCXU4CWJldGE7ICAgICAgICAgICAvKiBGaXhlZCBwb2ludCBhcml0aCwgPDwgNyAqLwogCXU4CW1vZGVzd2l0Y2g7ICAgICAvKiBEZWxheSBtb2Rlc3dpdGNoIHVudGlsIHdlIGhhZCBhdCBsZWFzdCBvbmUgY29uZ2VzdGlvbiBldmVudCAqLwotCXUzMglsYXN0X2Nvbmc7CS8qIFRpbWUgc2luY2UgbGFzdCBjb25nZXN0aW9uIGV2ZW50IGVuZCAqLwotCXUzMgl1bmRvX2xhc3RfY29uZzsKIAl1MTYJcGt0c19hY2tlZDsKIAl1MzIJcGFja2V0Y291bnQ7CiAJdTMyCW1pblJUVDsKIAl1MzIJbWF4UlRUOworCXUzMglsYXN0X2Nvbmc7CS8qIFRpbWUgc2luY2UgbGFzdCBjb25nZXN0aW9uIGV2ZW50IGVuZCAqLworCXUzMgl1bmRvX2xhc3RfY29uZzsKIAogCXUzMgl1bmRvX21heFJUVDsKIAl1MzIJdW5kb19vbGRfbWF4QjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggY2YwNmFjYy4uOTMwNDAzNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTI2NzcsNiArMjY3NywxNCBAQAogCQkJCQkgICBvcHRfcngtPnNhY2tfb2spIHsKIAkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gKHB0ciAtIDIpIC0gKHVuc2lnbmVkIGNoYXIgKil0aDsKIAkJCQkJfQorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCQkJY2FzZSBUQ1BPUFRfTUQ1U0lHOgorCQkJCQkvKgorCQkJCQkgKiBUaGUgTUQ1IEhhc2ggaGFzIGFscmVhZHkgYmVlbgorCQkJCQkgKiBjaGVja2VkIChzZWUgdGNwX3Z7NCw2fV9kb19yY3YoKSkuCisJCQkJCSAqLworCQkJCQlicmVhazsKKyNlbmRpZgogCSAgCQkJfTsKIAkgIAkJCXB0cis9b3BzaXplLTI7CiAJICAJCQlsZW5ndGgtPW9wc2l6ZTsKQEAgLTM3ODIsOSArMzc5MCw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX3RjcF9jaGVja3N1bV9jb21wbGV0ZV91c2VyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBfX3N1bTE2IF9fdGNwX2NoZWNrc3VtX2NvbXBsZXRlX3VzZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCByZXN1bHQ7CisJX19zdW0xNiByZXN1bHQ7CiAKIAlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQlsb2NhbF9iaF9lbmFibGUoKTsKQEAgLTQyMzAsNiArNDIzOCw4IEBACiAJCW1iKCk7CiAJCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9FU1RBQkxJU0hFRCk7CiAKKwkJc2VjdXJpdHlfaW5ldF9jb25uX2VzdGFibGlzaGVkKHNrLCBza2IpOworCiAJCS8qIE1ha2Ugc3VyZSBzb2NrZXQgaXMgcm91dGVkLCBmb3IgY29ycmVjdCBtZXRyaWNzLiAgKi8KIAkJaWNzay0+aWNza19hZl9vcHMtPnJlYnVpbGRfaGVhZGVyKHNrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMjJlZjhiZC4uYTEyMjJkNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC03OCw2ICs3OCw5IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCiBpbnQgc3lzY3RsX3RjcF90d19yZXVzZSBfX3JlYWRfbW9zdGx5OwogaW50IHN5c2N0bF90Y3BfbG93X2xhdGVuY3kgX19yZWFkX21vc3RseTsKIApAQCAtODksMTAgKzkyLDE5IEBACiAKIHZvaWQgdGNwX3Y0X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCitzdGF0aWMgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICp0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgICBfX2JlMzIgYWRkcik7CitzdGF0aWMgaW50IHRjcF92NF9kb19jYWxjX21kNV9oYXNoKGNoYXIgKm1kNV9oYXNoLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwKKwkJCQkgICBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkgICBzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IHByb3RvY29sLAorCQkJCSAgIGludCB0Y3BsZW4pOworI2VuZGlmCisKIHN0cnVjdCBpbmV0X2hhc2hpbmZvIF9fY2FjaGVsaW5lX2FsaWduZWQgdGNwX2hhc2hpbmZvID0gewotCS5saGFzaF9sb2NrCT0gX19SV19MT0NLX1VOTE9DS0VEKHRjcF9oYXNoaW5mby5saGFzaF9sb2NrKSwKLQkubGhhc2hfdXNlcnMJPSBBVE9NSUNfSU5JVCgwKSwKLQkubGhhc2hfd2FpdAk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHRjcF9oYXNoaW5mby5saGFzaF93YWl0KSwKKwkubGhhc2hfbG9jayAgPSBfX1JXX0xPQ0tfVU5MT0NLRUQodGNwX2hhc2hpbmZvLmxoYXNoX2xvY2spLAorCS5saGFzaF91c2VycyA9IEFUT01JQ19JTklUKDApLAorCS5saGFzaF93YWl0ICA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHRjcF9oYXNoaW5mby5saGFzaF93YWl0KSwKIH07CiAKIHN0YXRpYyBpbnQgdGNwX3Y0X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKQEAgLTExMSw3ICsxMjMsNyBAQAogCWluZXRfdW5oYXNoKCZ0Y3BfaGFzaGluZm8sIHNrKTsKIH0KIAotc3RhdGljIGlubGluZSBfX3UzMiB0Y3BfdjRfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIF9fdTMyIHRjcF92NF9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXBoLT5kYWRkciwKIAkJCQkJICBza2ItPm5oLmlwaC0+c2FkZHIsCkBAIC0yMDUsMTMgKzIxNywxNCBAQAogCWlmICh0Y3BfZGVhdGhfcm93LnN5c2N0bF90d19yZWN5Y2xlICYmCiAJICAgICF0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCAmJiBydC0+cnRfZHN0ID09IGRhZGRyKSB7CiAJCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXIgPSBydF9nZXRfcGVlcihydCk7Ci0KLQkJLyogVkoncyBpZGVhLiBXZSBzYXZlIGxhc3QgdGltZXN0YW1wIHNlZW4gZnJvbQotCQkgKiB0aGUgZGVzdGluYXRpb24gaW4gcGVlciB0YWJsZSwgd2hlbiBlbnRlcmluZyBzdGF0ZSBUSU1FLVdBSVQKLQkJICogYW5kIGluaXRpYWxpemUgcnhfb3B0LnRzX3JlY2VudCBmcm9tIGl0LCB3aGVuIHRyeWluZyBuZXcgY29ubmVjdGlvbi4KKwkJLyoKKwkJICogVkoncyBpZGVhLiBXZSBzYXZlIGxhc3QgdGltZXN0YW1wIHNlZW4gZnJvbQorCQkgKiB0aGUgZGVzdGluYXRpb24gaW4gcGVlciB0YWJsZSwgd2hlbiBlbnRlcmluZyBzdGF0ZQorCQkgKiBUSU1FLVdBSVQgKiBhbmQgaW5pdGlhbGl6ZSByeF9vcHQudHNfcmVjZW50IGZyb20gaXQsCisJCSAqIHdoZW4gdHJ5aW5nIG5ldyBjb25uZWN0aW9uLgogCQkgKi8KLQotCQlpZiAocGVlciAmJiBwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPj0geHRpbWUudHZfc2VjKSB7CisJCWlmIChwZWVyICE9IE5VTEwgJiYKKwkJICAgIHBlZXItPnRjcF90c19zdGFtcCArIFRDUF9QQVdTX01TTCA+PSB4dGltZS50dl9zZWMpIHsKIAkJCXRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0gcGVlci0+dGNwX3RzX3N0YW1wOwogCQkJdHAtPnJ4X29wdC50c19yZWNlbnQgPSBwZWVyLT50Y3BfdHM7CiAJCX0KQEAgLTIzNiw3ICsyNDksOCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbHVyZTsKIAotCWVyciA9IGlwX3JvdXRlX25ld3BvcnRzKCZydCwgSVBQUk9UT19UQ1AsIGluZXQtPnNwb3J0LCBpbmV0LT5kcG9ydCwgc2spOworCWVyciA9IGlwX3JvdXRlX25ld3BvcnRzKCZydCwgSVBQUk9UT19UQ1AsCisJCQkJaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0LCBzayk7CiAJaWYgKGVycikKIAkJZ290byBmYWlsdXJlOwogCkBAIC0yNjAsNyArMjc0LDEwIEBACiAJcmV0dXJuIDA7CiAKIGZhaWx1cmU6Ci0JLyogVGhpcyB1bmhhc2hlcyB0aGUgc29ja2V0IGFuZCByZWxlYXNlcyB0aGUgbG9jYWwgcG9ydCwgaWYgbmVjZXNzYXJ5LiAqLworCS8qCisJICogVGhpcyB1bmhhc2hlcyB0aGUgc29ja2V0IGFuZCByZWxlYXNlcyB0aGUgbG9jYWwgcG9ydCwKKwkgKiBpZiBuZWNlc3NhcnkuCisJICovCiAJdGNwX3NldF9zdGF0ZShzaywgVENQX0NMT1NFKTsKIAlpcF9ydF9wdXQocnQpOwogCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKQEAgLTQ4NSw4ICs1MDIsOSBAQAogCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayh0aCwgbGVuLCBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsIDApOwotCQlza2ItPmNzdW0gPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CisJCXRoLT5jaGVjayA9IH50Y3BfdjRfY2hlY2sodGgsIGxlbiwKKwkJCQkJICBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsIDApOworCQlza2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOwogCX0gZWxzZSB7CiAJCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0aCwgbGVuLCBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwKQEAgLTUwOCw3ICs1MjYsNyBAQAogCiAJdGgtPmNoZWNrID0gMDsKIAl0aC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKHRoLCBza2ItPmxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7Ci0Jc2tiLT5jc3VtID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOworCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCXJldHVybiAwOwogfQpAQCAtNTI2LDExICs1NDQsMTkgQEAKICAqCUV4Y2VwdGlvbjogcHJlY2VkZW5jZSB2aW9sYXRpb24uIFdlIGRvIG5vdCBpbXBsZW1lbnQgaXQgaW4gYW55IGNhc2UuCiAgKi8KIAotc3RhdGljIHZvaWQgdGNwX3Y0X3NlbmRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIHRjcF92NF9zZW5kX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKLQlzdHJ1Y3QgdGNwaGRyIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgdGNwaGRyIHRoOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCV9fYmUzMiBvcHRbKFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQgPj4gMildOworI2VuZGlmCisJfSByZXA7CiAJc3RydWN0IGlwX3JlcGx5X2FyZyBhcmc7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKyNlbmRpZgogCiAJLyogTmV2ZXIgc2VuZCBhIHJlc2V0IGluIHJlc3BvbnNlIHRvIGEgcmVzZXQuICovCiAJaWYgKHRoLT5yc3QpCkBAIC01NDAsMjkgKzU2Niw0OSBAQAogCQlyZXR1cm47CiAKIAkvKiBTd2FwIHRoZSBzZW5kIGFuZCB0aGUgcmVjZWl2ZS4gKi8KLQltZW1zZXQoJnJ0aCwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKLQlydGguZGVzdCAgID0gdGgtPnNvdXJjZTsKLQlydGguc291cmNlID0gdGgtPmRlc3Q7Ci0JcnRoLmRvZmYgICA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSAvIDQ7Ci0JcnRoLnJzdCAgICA9IDE7CisJbWVtc2V0KCZyZXAsIDAsIHNpemVvZihyZXApKTsKKwlyZXAudGguZGVzdCAgID0gdGgtPnNvdXJjZTsKKwlyZXAudGguc291cmNlID0gdGgtPmRlc3Q7CisJcmVwLnRoLmRvZmYgICA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSAvIDQ7CisJcmVwLnRoLnJzdCAgICA9IDE7CiAKIAlpZiAodGgtPmFjaykgewotCQlydGguc2VxID0gdGgtPmFja19zZXE7CisJCXJlcC50aC5zZXEgPSB0aC0+YWNrX3NlcTsKIAl9IGVsc2UgewotCQlydGguYWNrID0gMTsKLQkJcnRoLmFja19zZXEgPSBodG9ubChudG9obCh0aC0+c2VxKSArIHRoLT5zeW4gKyB0aC0+ZmluICsKLQkJCQkgICAgc2tiLT5sZW4gLSAodGgtPmRvZmYgPDwgMikpOworCQlyZXAudGguYWNrID0gMTsKKwkJcmVwLnRoLmFja19zZXEgPSBodG9ubChudG9obCh0aC0+c2VxKSArIHRoLT5zeW4gKyB0aC0+ZmluICsKKwkJCQkgICAgICAgc2tiLT5sZW4gLSAodGgtPmRvZmYgPDwgMikpOwogCX0KIAotCW1lbXNldCgmYXJnLCAwLCBzaXplb2YgYXJnKTsKLQlhcmcuaW92WzBdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKikmcnRoOwotCWFyZy5pb3ZbMF0uaW92X2xlbiAgPSBzaXplb2YgcnRoOworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CisJYXJnLmlvdlswXS5pb3ZfYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopJnJlcDsKKwlhcmcuaW92WzBdLmlvdl9sZW4gID0gc2l6ZW9mKHJlcC50aCk7CisKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCWtleSA9IHNrID8gdGNwX3Y0X21kNV9kb19sb29rdXAoc2ssIHNrYi0+bmguaXBoLT5kYWRkcikgOiBOVUxMOworCWlmIChrZXkpIHsKKwkJcmVwLm9wdFswXSA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8CisJCQkJICAgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCQkgICAoVENQT1BUX01ENVNJRyA8PCA4KSB8CisJCQkJICAgVENQT0xFTl9NRDVTSUcpOworCQkvKiBVcGRhdGUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoIHRoZSBoZWFkZXIgdGhpbmtzIGV4aXN0cyAqLworCQlhcmcuaW92WzBdLmlvdl9sZW4gKz0gVENQT0xFTl9NRDVTSUdfQUxJR05FRDsKKwkJcmVwLnRoLmRvZmYgPSBhcmcuaW92WzBdLmlvdl9sZW4gLyA0OworCisJCXRjcF92NF9kb19jYWxjX21kNV9oYXNoKChfX3U4ICopJnJlcC5vcHRbMV0sCisJCQkJCWtleSwKKwkJCQkJc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCQlza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCSZyZXAudGgsIElQUFJPVE9fVENQLAorCQkJCQlhcmcuaW92WzBdLmlvdl9sZW4pOworCX0KKyNlbmRpZgogCWFyZy5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkgICAgICBza2ItPm5oLmlwaC0+c2FkZHIsIC8qWFhYKi8KKwkJCQkgICAgICBza2ItPm5oLmlwaC0+c2FkZHIsIC8qIFhYWCAqLwogCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwgSVBQUk9UT19UQ1AsIDApOwogCWFyZy5jc3Vtb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spIC8gMjsKIAotCWlwX3NlbmRfcmVwbHkodGNwX3NvY2tldC0+c2ssIHNrYiwgJmFyZywgc2l6ZW9mIHJ0aCk7CisJaXBfc2VuZF9yZXBseSh0Y3Bfc29ja2V0LT5zaywgc2tiLCAmYXJnLCBhcmcuaW92WzBdLmlvdl9sZW4pOwogCiAJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX09VVFNFR1MpOwogCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRSU1RTKTsKQEAgLTU3MiwyOCArNjE4LDM3IEBACiAgICBvdXRzaWRlIHNvY2tldCBjb250ZXh0IGlzIHVnbHksIGNlcnRhaW5seS4gV2hhdCBjYW4gSSBkbz8KICAqLwogCi1zdGF0aWMgdm9pZCB0Y3BfdjRfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywKK3N0YXRpYyB2b2lkIHRjcF92NF9zZW5kX2FjayhzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnR3c2ssCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywKIAkJCSAgICB1MzIgd2luLCB1MzIgdHMpCiB7CiAJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CiAJc3RydWN0IHsKIAkJc3RydWN0IHRjcGhkciB0aDsKLQkJdTMyIHRzb3B0W1RDUE9MRU5fVFNUQU1QX0FMSUdORUQgPj4gMl07CisJCV9fYmUzMiBvcHRbKFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgPj4gMikKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQkJICAgKyAoVENQT0xFTl9NRDVTSUdfQUxJR05FRCA+PiAyKQorI2VuZGlmCisJCQldOwogCX0gcmVwOwogCXN0cnVjdCBpcF9yZXBseV9hcmcgYXJnOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXk7CisJc3RydWN0IHRjcF9tZDVzaWdfa2V5IHR3X2tleTsKKyNlbmRpZgogCiAJbWVtc2V0KCZyZXAudGgsIDAsIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7Ci0JbWVtc2V0KCZhcmcsIDAsIHNpemVvZiBhcmcpOworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CiAKIAlhcmcuaW92WzBdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKikmcmVwOwogCWFyZy5pb3ZbMF0uaW92X2xlbiAgPSBzaXplb2YocmVwLnRoKTsKIAlpZiAodHMpIHsKLQkJcmVwLnRzb3B0WzBdID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKLQkJCQkgICAgIChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpIHwKLQkJCQkgICAgIFRDUE9MRU5fVElNRVNUQU1QKTsKLQkJcmVwLnRzb3B0WzFdID0gaHRvbmwodGNwX3RpbWVfc3RhbXApOwotCQlyZXAudHNvcHRbMl0gPSBodG9ubCh0cyk7Ci0JCWFyZy5pb3ZbMF0uaW92X2xlbiA9IHNpemVvZihyZXApOworCQlyZXAub3B0WzBdID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCQkgICAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8CisJCQkJICAgVENQT0xFTl9USU1FU1RBTVApOworCQlyZXAub3B0WzFdID0gaHRvbmwodGNwX3RpbWVfc3RhbXApOworCQlyZXAub3B0WzJdID0gaHRvbmwodHMpOworCQlhcmcuaW92WzBdLmlvdl9sZW4gPSBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEOwogCX0KIAogCS8qIFN3YXAgdGhlIHNlbmQgYW5kIHRoZSByZWNlaXZlLiAqLwpAQCAtNjA1LDggKzY2MCw0NCBAQAogCXJlcC50aC5hY2sgICAgID0gMTsKIAlyZXAudGgud2luZG93ICA9IGh0b25zKHdpbik7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qCisJICogVGhlIFNLQiBob2xkcyBhbiBpbWNvbWluZyBwYWNrZXQsIGJ1dCBtYXkgbm90IGhhdmUgYSB2YWxpZCAtPnNrCisJICogcG9pbnRlci4gVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlIHdoZW4gd2UncmUgZGVhbGluZyB3aXRoIGEKKwkgKiBUSU1FX1dBSVQgYWNrLCBiZWNhdXNlIHRoZSBzayBzdHJ1Y3R1cmUgaXMgbG9uZyBnb25lLCBhbmQgb25seQorCSAqIHRoZSB0Y3BfdGltZXdhaXRfc29jayByZW1haW5zLiBTbyB0aGUgbWQ1IGtleSBpcyBzdGFzaGVkIGluIHRoYXQKKwkgKiBzdHJ1Y3R1cmUsIGFuZCB3ZSB1c2UgaXQgaW4gcHJlZmVyZW5jZS4gIEkgYmVsaWV2ZSB0aGF0ICh0d3NrIHx8CisJICogc2tiLT5zaykgaG9sZHMgdHJ1ZSwgYnV0IHdlIHByb2dyYW0gZGVmZW5zaXZlbHkuCisJICovCisJaWYgKCF0d3NrICYmIHNrYi0+c2spIHsKKwkJa2V5ID0gdGNwX3Y0X21kNV9kb19sb29rdXAoc2tiLT5zaywgc2tiLT5uaC5pcGgtPmRhZGRyKTsKKwl9IGVsc2UgaWYgKHR3c2sgJiYgdHdzay0+dHdfbWQ1X2tleWxlbikgeworCQl0d19rZXkua2V5ID0gdHdzay0+dHdfbWQ1X2tleTsKKwkJdHdfa2V5LmtleWxlbiA9IHR3c2stPnR3X21kNV9rZXlsZW47CisJCWtleSA9ICZ0d19rZXk7CisJfSBlbHNlCisJCWtleSA9IE5VTEw7CisKKwlpZiAoa2V5KSB7CisJCWludCBvZmZzZXQgPSAodHMpID8gMyA6IDA7CisKKwkJcmVwLm9wdFtvZmZzZXQrK10gPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAorCQkJCQkgIChUQ1BPUFRfTk9QIDw8IDE2KSB8CisJCQkJCSAgKFRDUE9QVF9NRDVTSUcgPDwgOCkgfAorCQkJCQkgIFRDUE9MRU5fTUQ1U0lHKTsKKwkJYXJnLmlvdlswXS5pb3ZfbGVuICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisJCXJlcC50aC5kb2ZmID0gYXJnLmlvdlswXS5pb3ZfbGVuLzQ7CisKKwkJdGNwX3Y0X2RvX2NhbGNfbWQ1X2hhc2goKF9fdTggKikmcmVwLm9wdFtvZmZzZXRdLAorCQkJCQlrZXksCisJCQkJCXNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQkmcmVwLnRoLCBJUFBST1RPX1RDUCwKKwkJCQkJYXJnLmlvdlswXS5pb3ZfbGVuKTsKKwl9CisjZW5kaWYKIAlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICAgc2tiLT5uaC5pcGgtPnNhZGRyLCAvKlhYWCovCisJCQkJICAgICAgc2tiLT5uaC5pcGgtPnNhZGRyLCAvKiBYWFggKi8KIAkJCQkgICAgICBhcmcuaW92WzBdLmlvdl9sZW4sIElQUFJPVE9fVENQLCAwKTsKIAlhcmcuY3N1bW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKSAvIDI7CiAKQEAgLTYxOCwxNyArNzA5LDIwIEBACiBzdGF0aWMgdm9pZCB0Y3BfdjRfdGltZXdhaXRfYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7Ci0JY29uc3Qgc3RydWN0IHRjcF90aW1ld2FpdF9zb2NrICp0Y3B0dyA9IHRjcF90d3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnRjcHR3ID0gdGNwX3R3c2soc2spOwogCi0JdGNwX3Y0X3NlbmRfYWNrKHNrYiwgdGNwdHctPnR3X3NuZF9ueHQsIHRjcHR3LT50d19yY3Zfbnh0LAotCQkJdGNwdHctPnR3X3Jjdl93bmQgPj4gdHctPnR3X3Jjdl93c2NhbGUsIHRjcHR3LT50d190c19yZWNlbnQpOworCXRjcF92NF9zZW5kX2Fjayh0Y3B0dywgc2tiLCB0Y3B0dy0+dHdfc25kX254dCwgdGNwdHctPnR3X3Jjdl9ueHQsCisJCQl0Y3B0dy0+dHdfcmN2X3duZCA+PiB0dy0+dHdfcmN2X3dzY2FsZSwKKwkJCXRjcHR3LT50d190c19yZWNlbnQpOwogCiAJaW5ldF90d3NrX3B1dCh0dyk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF92NF9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCitzdGF0aWMgdm9pZCB0Y3BfdjRfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKIHsKLQl0Y3BfdjRfc2VuZF9hY2soc2tiLCB0Y3BfcnNrKHJlcSktPnNudF9pc24gKyAxLCB0Y3BfcnNrKHJlcSktPnJjdl9pc24gKyAxLCByZXEtPnJjdl93bmQsCisJdGNwX3Y0X3NlbmRfYWNrKE5VTEwsIHNrYiwgdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSwKKwkJCXRjcF9yc2socmVxKS0+cmN2X2lzbiArIDEsIHJlcS0+cmN2X3duZCwKIAkJCXJlcS0+dHNfcmVjZW50KTsKIH0KIApAQCAtNjYyLDggKzc1Niw3IEBACiAJCWVyciA9IGlwX2J1aWxkX2FuZF9zZW5kX3BrdChza2IsIHNrLCBpcmVxLT5sb2NfYWRkciwKIAkJCQkJICAgIGlyZXEtPnJtdF9hZGRyLAogCQkJCQkgICAgaXJlcS0+b3B0KTsKLQkJaWYgKGVyciA9PSBORVRfWE1JVF9DTikKLQkJCWVyciA9IDA7CisJCWVyciA9IG5ldF94bWl0X2V2YWwoZXJyKTsKIAl9CiAKIG91dDoKQEAgLTcxNSw3ICs4MDgsNDIzIEBACiAJcmV0dXJuIGRvcHQ7CiB9CiAKLXN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzIHRjcF9yZXF1ZXN0X3NvY2tfb3BzID0geworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisvKgorICogUkZDMjM4NSBNRDUgY2hlY2tzdW1taW5nIHJlcXVpcmVzIGEgbWFwcGluZyBvZgorICogSVAgYWRkcmVzcy0+TUQ1IEtleS4KKyAqIFdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlc2UgaW4gdGhlIHNrIHN0cnVjdHVyZS4KKyAqLworCisvKiBGaW5kIHRoZSBLZXkgc3RydWN0dXJlIGZvciBhbiBhZGRyZXNzLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKgorCQkJdGNwX3Y0X21kNV9kb19sb29rdXAoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgYWRkcikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgaTsKKworCWlmICghdHAtPm1kNXNpZ19pbmZvIHx8ICF0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0KQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNDsgaSsrKSB7CisJCWlmICh0cC0+bWQ1c2lnX2luZm8tPmtleXM0W2ldLmFkZHIgPT0gYWRkcikKKwkJCXJldHVybiAoc3RydWN0IHRjcF9tZDVzaWdfa2V5ICopCisJCQkJCQkmdHAtPm1kNXNpZ19pbmZvLT5rZXlzNFtpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y0X21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgc3RydWN0IHNvY2sgKmFkZHJfc2spCit7CisJcmV0dXJuIHRjcF92NF9tZDVfZG9fbG9va3VwKHNrLCBpbmV0X3NrKGFkZHJfc2spLT5kYWRkcik7Cit9CisKK0VYUE9SVF9TWU1CT0wodGNwX3Y0X21kNV9sb29rdXApOworCitzdGF0aWMgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICp0Y3BfdjRfcmVxc2tfbWQ1X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCit7CisJcmV0dXJuIHRjcF92NF9tZDVfZG9fbG9va3VwKHNrLCBpbmV0X3JzayhyZXEpLT5ybXRfYWRkcik7Cit9CisKKy8qIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhIG5ld2x5IGNyZWF0ZWQgc29ja2V0LCBmcm9tIG90aGVyIGZpbGVzICovCitpbnQgdGNwX3Y0X21kNV9kb19hZGQoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgYWRkciwKKwkJICAgICAgdTggKm5ld2tleSwgdTggbmV3a2V5bGVuKQoreworCS8qIEFkZCBLZXkgdG8gdGhlIGxpc3QgKi8KKwlzdHJ1Y3QgdGNwNF9tZDVzaWdfa2V5ICprZXk7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHRjcDRfbWQ1c2lnX2tleSAqa2V5czsKKworCWtleSA9IChzdHJ1Y3QgdGNwNF9tZDVzaWdfa2V5ICopdGNwX3Y0X21kNV9kb19sb29rdXAoc2ssIGFkZHIpOworCWlmIChrZXkpIHsKKwkJLyogUHJlLWV4aXN0aW5nIGVudHJ5IC0ganVzdCB1cGRhdGUgdGhhdCBvbmUuICovCisJCWtmcmVlKGtleS0+a2V5KTsKKwkJa2V5LT5rZXkgPSBuZXdrZXk7CisJCWtleS0+a2V5bGVuID0gbmV3a2V5bGVuOworCX0gZWxzZSB7CisJCXN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8gKm1kNXNpZzsKKworCQlpZiAoIXRwLT5tZDVzaWdfaW5mbykgeworCQkJdHAtPm1kNXNpZ19pbmZvID0ga3phbGxvYyhzaXplb2YoKnRwLT5tZDVzaWdfaW5mbyksCisJCQkJCQkgIEdGUF9BVE9NSUMpOworCQkJaWYgKCF0cC0+bWQ1c2lnX2luZm8pIHsKKwkJCQlrZnJlZShuZXdrZXkpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisJCWlmICh0Y3BfYWxsb2NfbWQ1c2lnX3Bvb2woKSA9PSBOVUxMKSB7CisJCQlrZnJlZShuZXdrZXkpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWQ1c2lnID0gdHAtPm1kNXNpZ19pbmZvOworCisJCWlmIChtZDVzaWctPmFsbG9jZWQ0ID09IG1kNXNpZy0+ZW50cmllczQpIHsKKwkJCWtleXMgPSBrbWFsbG9jKChzaXplb2YoKmtleXMpICoKKwkJCQkgICAgICAgIChtZDVzaWctPmVudHJpZXM0ICsgMSkpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICgha2V5cykgeworCQkJCWtmcmVlKG5ld2tleSk7CisJCQkJdGNwX2ZyZWVfbWQ1c2lnX3Bvb2woKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJaWYgKG1kNXNpZy0+ZW50cmllczQpCisJCQkJbWVtY3B5KGtleXMsIG1kNXNpZy0+a2V5czQsCisJCQkJICAgICAgIHNpemVvZigqa2V5cykgKiBtZDVzaWctPmVudHJpZXM0KTsKKworCQkJLyogRnJlZSBvbGQga2V5IGxpc3QsIGFuZCByZWZlcmVuY2UgbmV3IG9uZSAqLworCQkJaWYgKG1kNXNpZy0+a2V5czQpCisJCQkJa2ZyZWUobWQ1c2lnLT5rZXlzNCk7CisJCQltZDVzaWctPmtleXM0ID0ga2V5czsKKwkJCW1kNXNpZy0+YWxsb2NlZDQrKzsKKwkJfQorCQltZDVzaWctPmVudHJpZXM0Kys7CisJCW1kNXNpZy0+a2V5czRbbWQ1c2lnLT5lbnRyaWVzNCAtIDFdLmFkZHIgICA9IGFkZHI7CisJCW1kNXNpZy0+a2V5czRbbWQ1c2lnLT5lbnRyaWVzNCAtIDFdLmtleSAgICA9IG5ld2tleTsKKwkJbWQ1c2lnLT5rZXlzNFttZDVzaWctPmVudHJpZXM0IC0gMV0ua2V5bGVuID0gbmV3a2V5bGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh0Y3BfdjRfbWQ1X2RvX2FkZCk7CisKK3N0YXRpYyBpbnQgdGNwX3Y0X21kNV9hZGRfZnVuYyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICphZGRyX3NrLAorCQkJICAgICAgIHU4ICpuZXdrZXksIHU4IG5ld2tleWxlbikKK3sKKwlyZXR1cm4gdGNwX3Y0X21kNV9kb19hZGQoc2ssIGluZXRfc2soYWRkcl9zayktPmRhZGRyLAorCQkJCSBuZXdrZXksIG5ld2tleWxlbik7Cit9CisKK2ludCB0Y3BfdjRfbWQ1X2RvX2RlbChzdHJ1Y3Qgc29jayAqc2ssIF9fYmUzMiBhZGRyKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczQ7IGkrKykgeworCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5rZXlzNFtpXS5hZGRyID09IGFkZHIpIHsKKwkJCS8qIEZyZWUgdGhlIGtleSAqLworCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNFtpXS5rZXkpOworCQkJdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNC0tOworCisJCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNCA9PSAwKSB7CisJCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNCk7CisJCQkJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczQgIT0gaSkgeworCQkJCS8qIE5lZWQgdG8gZG8gc29tZSBtYW5pcHVsYXRpb24gKi8KKwkJCQltZW1jcHkoJnRwLT5tZDVzaWdfaW5mby0+a2V5czRbaV0sCisJCQkJICAgICAgICZ0cC0+bWQ1c2lnX2luZm8tPmtleXM0W2krMV0sCisJCQkJICAgICAgICh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0IC0gaSkgKgorCQkJCSAgICAgICAgc2l6ZW9mKHN0cnVjdCB0Y3A0X21kNXNpZ19rZXkpKTsKKwkJCX0KKwkJCXRjcF9mcmVlX21kNXNpZ19wb29sKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworRVhQT1JUX1NZTUJPTCh0Y3BfdjRfbWQ1X2RvX2RlbCk7CisKK3N0YXRpYyB2b2lkIHRjcF92NF9jbGVhcl9tZDVfbGlzdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkvKiBGcmVlIGVhY2gga2V5LCB0aGVuIHRoZSBzZXQgb2Yga2V5IGtleXMsCisJICogdGhlIGNyeXB0byBlbGVtZW50LCBhbmQgdGhlbiBkZWNyZW1lbnQgb3VyCisJICogaG9sZCBvbiB0aGUgbGFzdCByZXNvcnQgY3J5cHRvLgorCSAqLworCWlmICh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0KSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNDsgaSsrKQorCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNFtpXS5rZXkpOworCQl0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0ID0gMDsKKwkJdGNwX2ZyZWVfbWQ1c2lnX3Bvb2woKTsKKwl9CisJaWYgKHRwLT5tZDVzaWdfaW5mby0+a2V5czQpIHsKKwkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNCk7CisJCXRwLT5tZDVzaWdfaW5mby0+a2V5czQgPSBOVUxMOworCQl0cC0+bWQ1c2lnX2luZm8tPmFsbG9jZWQ0ICA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHRjcF92NF9wYXJzZV9tZDVfa2V5cyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJIGludCBvcHRsZW4pCit7CisJc3RydWN0IHRjcF9tZDVzaWcgY21kOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZjbWQudGNwbV9hZGRyOworCXU4ICpuZXdrZXk7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKGNtZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIG9wdHZhbCwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNtZC50Y3BtX2tleSB8fCAhY21kLnRjcG1fa2V5bGVuKSB7CisJCWlmICghdGNwX3NrKHNrKS0+bWQ1c2lnX2luZm8pCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIHRjcF92NF9tZDVfZG9fZGVsKHNrLCBzaW4tPnNpbl9hZGRyLnNfYWRkcik7CisJfQorCisJaWYgKGNtZC50Y3BtX2tleWxlbiA+IFRDUF9NRDVTSUdfTUFYS0VZTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdGNwX3NrKHNrKS0+bWQ1c2lnX2luZm8pIHsKKwkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJCXN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8gKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCisJCWlmICghcCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXRwLT5tZDVzaWdfaW5mbyA9IHA7CisKKwl9CisKKwluZXdrZXkgPSBrbWVtZHVwKGNtZC50Y3BtX2tleSwgY21kLnRjcG1fa2V5bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld2tleSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIHRjcF92NF9tZDVfZG9fYWRkKHNrLCBzaW4tPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkgbmV3a2V5LCBjbWQudGNwbV9rZXlsZW4pOworfQorCitzdGF0aWMgaW50IHRjcF92NF9kb19jYWxjX21kNV9oYXNoKGNoYXIgKm1kNV9oYXNoLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwKKwkJCQkgICBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkgICBzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IHByb3RvY29sLAorCQkJCSAgIGludCB0Y3BsZW4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzRdOworCV9fdTE2IGRhdGFfbGVuOworCWludCBibG9jayA9IDA7CisJX19zdW0xNiBvbGRfY2hlY2tzdW07CisJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqaHA7CisJc3RydWN0IHRjcDRfcHNldWRvaGRyICpicDsKKwlzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IDA7CisKKwkvKgorCSAqIE9rYXksIHNvIFJGQzIzODUgaXMgdHVybmVkIG9uIGZvciB0aGlzIGNvbm5lY3Rpb24sCisJICogc28gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgTUQ1IGhhc2ggZm9yIHRoZSBwYWNrZXQgbm93LgorCSAqLworCisJaHAgPSB0Y3BfZ2V0X21kNXNpZ19wb29sKCk7CisJaWYgKCFocCkKKwkJZ290byBjbGVhcl9oYXNoX25vcHV0OworCisJYnAgPSAmaHAtPm1kNV9ibGsuaXA0OworCWRlc2MgPSAmaHAtPm1kNV9kZXNjOworCisJLyoKKwkgKiAxLiB0aGUgVENQIHBzZXVkby1oZWFkZXIgKGluIHRoZSBvcmRlcjogc291cmNlIElQIGFkZHJlc3MsCisJICogZGVzdGluYXRpb24gSVAgYWRkcmVzcywgemVyby1wYWRkZWQgcHJvdG9jb2wgbnVtYmVyLCBhbmQKKwkgKiBzZWdtZW50IGxlbmd0aCkKKwkgKi8KKwlicC0+c2FkZHIgPSBzYWRkcjsKKwlicC0+ZGFkZHIgPSBkYWRkcjsKKwlicC0+cGFkID0gMDsKKwlicC0+cHJvdG9jb2wgPSBwcm90b2NvbDsKKwlicC0+bGVuID0gaHRvbnModGNwbGVuKTsKKwlzZ19zZXRfYnVmKCZzZ1tibG9jaysrXSwgYnAsIHNpemVvZigqYnApKTsKKwluYnl0ZXMgKz0gc2l6ZW9mKCpicCk7CisKKwkvKiAyLiB0aGUgVENQIGhlYWRlciwgZXhjbHVkaW5nIG9wdGlvbnMsIGFuZCBhc3N1bWluZyBhCisJICogY2hlY2tzdW0gb2YgemVyby8KKwkgKi8KKwlvbGRfY2hlY2tzdW0gPSB0aC0+Y2hlY2s7CisJdGgtPmNoZWNrID0gMDsKKwlzZ19zZXRfYnVmKCZzZ1tibG9jaysrXSwgdGgsIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CisJbmJ5dGVzICs9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKworCS8qIDMuIHRoZSBUQ1Agc2VnbWVudCBkYXRhIChpZiBhbnkpICovCisJZGF0YV9sZW4gPSB0Y3BsZW4gLSAodGgtPmRvZmYgPDwgMik7CisJaWYgKGRhdGFfbGVuID4gMCkgeworCQl1bnNpZ25lZCBjaGFyICpkYXRhID0gKHVuc2lnbmVkIGNoYXIgKil0aCArICh0aC0+ZG9mZiA8PCAyKTsKKwkJc2dfc2V0X2J1Zigmc2dbYmxvY2srK10sIGRhdGEsIGRhdGFfbGVuKTsKKwkJbmJ5dGVzICs9IGRhdGFfbGVuOworCX0KKworCS8qIDQuIGFuIGluZGVwZW5kZW50bHktc3BlY2lmaWVkIGtleSBvciBwYXNzd29yZCwga25vd24gdG8gYm90aAorCSAqIFRDUHMgYW5kIHByZXN1bWFibHkgY29ubmVjdGlvbi1zcGVjaWZpYworCSAqLworCXNnX3NldF9idWYoJnNnW2Jsb2NrKytdLCBrZXktPmtleSwga2V5LT5rZXlsZW4pOworCW5ieXRlcyArPSBrZXktPmtleWxlbjsKKworCS8qIE5vdyBzdG9yZSB0aGUgSGFzaCBpbnRvIHRoZSBwYWNrZXQgKi8KKwllcnIgPSBjcnlwdG9faGFzaF9pbml0KGRlc2MpOworCWlmIChlcnIpCisJCWdvdG8gY2xlYXJfaGFzaDsKKwllcnIgPSBjcnlwdG9faGFzaF91cGRhdGUoZGVzYywgc2csIG5ieXRlcyk7CisJaWYgKGVycikKKwkJZ290byBjbGVhcl9oYXNoOworCWVyciA9IGNyeXB0b19oYXNoX2ZpbmFsKGRlc2MsIG1kNV9oYXNoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFyX2hhc2g7CisKKwkvKiBSZXNldCBoZWFkZXIsIGFuZCBmcmVlIHVwIHRoZSBjcnlwdG8gKi8KKwl0Y3BfcHV0X21kNXNpZ19wb29sKCk7CisJdGgtPmNoZWNrID0gb2xkX2NoZWNrc3VtOworCitvdXQ6CisJcmV0dXJuIDA7CitjbGVhcl9oYXNoOgorCXRjcF9wdXRfbWQ1c2lnX3Bvb2woKTsKK2NsZWFyX2hhc2hfbm9wdXQ6CisJbWVtc2V0KG1kNV9oYXNoLCAwLCAxNik7CisJZ290byBvdXQ7Cit9CisKK2ludCB0Y3BfdjRfY2FsY19tZDVfaGFzaChjaGFyICptZDVfaGFzaCwgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQkgc3RydWN0IHNvY2sgKnNrLAorCQkJIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkgc3RydWN0IHRjcGhkciAqdGgsIGludCBwcm90b2NvbCwKKwkJCSBpbnQgdGNwbGVuKQoreworCV9fYmUzMiBzYWRkciwgZGFkZHI7CisKKwlpZiAoc2spIHsKKwkJc2FkZHIgPSBpbmV0X3NrKHNrKS0+c2FkZHI7CisJCWRhZGRyID0gaW5ldF9zayhzayktPmRhZGRyOworCX0gZWxzZSB7CisJCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilkc3Q7CisJCUJVR19PTighcnQpOworCQlzYWRkciA9IHJ0LT5ydF9zcmM7CisJCWRhZGRyID0gcnQtPnJ0X2RzdDsKKwl9CisJcmV0dXJuIHRjcF92NF9kb19jYWxjX21kNV9oYXNoKG1kNV9oYXNoLCBrZXksCisJCQkJICAgICAgIHNhZGRyLCBkYWRkciwKKwkJCQkgICAgICAgdGgsIHByb3RvY29sLCB0Y3BsZW4pOworfQorCitFWFBPUlRfU1lNQk9MKHRjcF92NF9jYWxjX21kNV9oYXNoKTsKKworc3RhdGljIGludCB0Y3BfdjRfaW5ib3VuZF9tZDVfaGFzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyoKKwkgKiBUaGlzIGdldHMgY2FsbGVkIGZvciBlYWNoIFRDUCBzZWdtZW50IHRoYXQgYXJyaXZlcworCSAqIHNvIHdlIHdhbnQgdG8gYmUgZWZmaWNpZW50LgorCSAqIFdlIGhhdmUgMyBkcm9wIGNhc2VzOgorCSAqIG8gTm8gTUQ1IGhhc2ggYW5kIG9uZSBleHBlY3RlZC4KKwkgKiBvIE1ENSBoYXNoIGFuZCB3ZSdyZSBub3QgZXhwZWN0aW5nIG9uZS4KKwkgKiBvIE1ENSBoYXNoIGFuZCBpdHMgd3JvbmcuCisJICovCisJX191OCAqaGFzaF9sb2NhdGlvbiA9IE5VTEw7CisJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICpoYXNoX2V4cGVjdGVkOworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJaW50IGxlbmd0aCA9ICh0aC0+ZG9mZiA8PCAyKSAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwlpbnQgZ2VuaGFzaDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgY2hhciBuZXdoYXNoWzE2XTsKKworCWhhc2hfZXhwZWN0ZWQgPSB0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzaywgaXBoLT5zYWRkcik7CisKKwkvKgorCSAqIElmIHRoZSBUQ1Agb3B0aW9uIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIFRDUF9NRDVTSUcKKwkgKiBvcHRpb24gbGVuZ3RoLCB0aGVuIHdlIGNhbiBzaG9ydGN1dAorCSAqLworCWlmIChsZW5ndGggPCBUQ1BPTEVOX01ENVNJRykgeworCQlpZiAoaGFzaF9leHBlY3RlZCkKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPa2F5LCB3ZSBjYW4ndCBzaG9ydGN1dCAtIHdlIGhhdmUgdG8gZ3J1YiB0aHJvdWdoIHRoZSBvcHRpb25zICovCisJcHRyID0gKHVuc2lnbmVkIGNoYXIgKikodGggKyAxKTsKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQlpbnQgb3Bjb2RlID0gKnB0cisrOworCQlpbnQgb3BzaXplOworCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgVENQT1BUX0VPTDoKKwkJCWdvdG8gZG9uZV9vcHRzOworCQljYXNlIFRDUE9QVF9OT1A6CisJCQlsZW5ndGgtLTsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJb3BzaXplID0gKnB0cisrOworCQkJaWYgKG9wc2l6ZSA8IDIpCisJCQkJZ290byBkb25lX29wdHM7CisJCQlpZiAob3BzaXplID4gbGVuZ3RoKQorCQkJCWdvdG8gZG9uZV9vcHRzOworCisJCQlpZiAob3Bjb2RlID09IFRDUE9QVF9NRDVTSUcpIHsKKwkJCQloYXNoX2xvY2F0aW9uID0gcHRyOworCQkJCWdvdG8gZG9uZV9vcHRzOworCQkJfQorCQl9CisJCXB0ciArPSBvcHNpemUtMjsKKwkJbGVuZ3RoIC09IG9wc2l6ZTsKKwl9Citkb25lX29wdHM6CisJLyogV2UndmUgcGFyc2VkIHRoZSBvcHRpb25zIC0gZG8gd2UgaGF2ZSBhIGhhc2g/ICovCisJaWYgKCFoYXNoX2V4cGVjdGVkICYmICFoYXNoX2xvY2F0aW9uKQorCQlyZXR1cm4gMDsKKworCWlmIChoYXNoX2V4cGVjdGVkICYmICFoYXNoX2xvY2F0aW9uKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiTUQ1IEhhc2ggTk9UIGV4cGVjdGVkIGJ1dCBmb3VuZCAiCisJCQkgICAgICAgIigiIE5JUFFVQURfRk1UICIsICVkKS0+KCIgTklQUVVBRF9GTVQgIiwgJWQpXG4iLAorCQkJICAgICAgIE5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHRoLT5zb3VyY2UpLAorCQkJICAgICAgIE5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghaGFzaF9leHBlY3RlZCAmJiBoYXNoX2xvY2F0aW9uKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiTUQ1IEhhc2ggTk9UIGV4cGVjdGVkIGJ1dCBmb3VuZCAiCisJCQkgICAgICAgIigiIE5JUFFVQURfRk1UICIsICVkKS0+KCIgTklQUVVBRF9GTVQgIiwgJWQpXG4iLAorCQkJICAgICAgIE5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHRoLT5zb3VyY2UpLAorCQkJICAgICAgIE5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSk7CisJCXJldHVybiAxOworCX0KKworCS8qIE9rYXksIHNvIHRoaXMgaXMgaGFzaF9leHBlY3RlZCBhbmQgaGFzaF9sb2NhdGlvbiAtCisJICogc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtLgorCSAqLworCWdlbmhhc2ggPSB0Y3BfdjRfZG9fY2FsY19tZDVfaGFzaChuZXdoYXNoLAorCQkJCQkgIGhhc2hfZXhwZWN0ZWQsCisJCQkJCSAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkJICB0aCwgc2stPnNrX3Byb3RvY29sLAorCQkJCQkgIHNrYi0+bGVuKTsKKworCWlmIChnZW5oYXNoIHx8IG1lbWNtcChoYXNoX2xvY2F0aW9uLCBuZXdoYXNoLCAxNikgIT0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJNRDUgSGFzaCBmYWlsZWQgZm9yICIKKwkJCSAgICAgICAiKCIgTklQUVVBRF9GTVQgIiwgJWQpLT4oIiBOSVBRVUFEX0ZNVCAiLCAlZCklc1xuIiwKKwkJCSAgICAgICBOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCSAgICAgICBOSVBRVUFEKGlwaC0+ZGFkZHIpLCBudG9ocyh0aC0+ZGVzdCksCisJCQkgICAgICAgZ2VuaGFzaCA/ICIgdGNwX3Y0X2NhbGNfbWQ1X2hhc2ggZmFpbGVkIiA6ICIiKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyB0Y3BfcmVxdWVzdF9zb2NrX29wcyBfX3JlYWRfbW9zdGx5ID0gewogCS5mYW1pbHkJCT0JUEZfSU5FVCwKIAkub2JqX3NpemUJPQlzaXplb2Yoc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2spLAogCS5ydHhfc3luX2Fjawk9CXRjcF92NF9zZW5kX3N5bmFjaywKQEAgLTcyNCw5ICsxMjMzLDE2IEBACiAJLnNlbmRfcmVzZXQJPQl0Y3BfdjRfc2VuZF9yZXNldCwKIH07CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworc3RhdGljIHN0cnVjdCB0Y3BfcmVxdWVzdF9zb2NrX29wcyB0Y3BfcmVxdWVzdF9zb2NrX2lwdjRfb3BzID0geworCS5tZDVfbG9va3VwCT0JdGNwX3Y0X3JlcXNrX21kNV9sb29rdXAsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgdGltZXdhaXRfc29ja19vcHMgdGNwX3RpbWV3YWl0X3NvY2tfb3BzID0gewogCS50d3NrX29ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCB0Y3BfdGltZXdhaXRfc29jayksCiAJLnR3c2tfdW5pcXVlCT0gdGNwX3R3c2tfdW5pcXVlLAorCS50d3NrX2Rlc3RydWN0b3I9IHRjcF90d3NrX2Rlc3RydWN0b3IsCiB9OwogCiBpbnQgdGNwX3Y0X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCkBAIC03NzQsNiArMTI5MCwxMCBAQAogCWlmICghcmVxKQogCQlnb3RvIGRyb3A7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXRjcF9yc2socmVxKS0+YWZfc3BlY2lmaWMgPSAmdGNwX3JlcXVlc3Rfc29ja19pcHY0X29wczsKKyNlbmRpZgorCiAJdGNwX2NsZWFyX29wdGlvbnMoJnRtcF9vcHQpOwogCXRtcF9vcHQubXNzX2NsYW1wID0gNTM2OwogCXRtcF9vcHQudXNlcl9tc3MgID0gdGNwX3NrKHNrKS0+cnhfb3B0LnVzZXJfbXNzOwpAQCAtODU5LDcgKzEzNzksNyBAQAogCQkJZ290byBkcm9wX2FuZF9mcmVlOwogCQl9CiAKLQkJaXNuID0gdGNwX3Y0X2luaXRfc2VxdWVuY2Uoc2ssIHNrYik7CisJCWlzbiA9IHRjcF92NF9pbml0X3NlcXVlbmNlKHNrYik7CiAJfQogCXRjcF9yc2socmVxKS0+c250X2lzbiA9IGlzbjsKIApAQCAtODkyLDYgKzE0MTIsOSBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKm5ld2luZXQ7CiAJc3RydWN0IHRjcF9zb2NrICpuZXd0cDsKIAlzdHJ1Y3Qgc29jayAqbmV3c2s7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKyNlbmRpZgogCiAJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykpCiAJCWdvdG8gZXhpdF9vdmVyZmxvdzsKQEAgLTkyNiw2ICsxNDQ5LDIyIEBACiAJbmV3dHAtPmFkdm1zcyA9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUyk7CiAJdGNwX2luaXRpYWxpemVfcmN2X21zcyhuZXdzayk7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qIENvcHkgb3ZlciB0aGUgTUQ1IGtleSBmcm9tIHRoZSBvcmlnaW5hbCBzb2NrZXQgKi8KKwlpZiAoKGtleSA9IHRjcF92NF9tZDVfZG9fbG9va3VwKHNrLCBuZXdpbmV0LT5kYWRkcikpICE9IE5VTEwpIHsKKwkJLyoKKwkJICogV2UncmUgdXNpbmcgb25lLCBzbyBjcmVhdGUgYSBtYXRjaGluZyBrZXkKKwkJICogb24gdGhlIG5ld3NrIHN0cnVjdHVyZS4gSWYgd2UgZmFpbCB0byBnZXQKKwkJICogbWVtb3J5LCB0aGVuIHdlIGVuZCB1cCBub3QgY29weWluZyB0aGUga2V5CisJCSAqIGFjcm9zcy4gU2h1Y2tzLgorCQkgKi8KKwkJY2hhciAqbmV3a2V5ID0ga21lbWR1cChrZXktPmtleSwga2V5LT5rZXlsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAobmV3a2V5ICE9IE5VTEwpCisJCQl0Y3BfdjRfbWQ1X2RvX2FkZChuZXdzaywgaW5ldF9zayhzayktPmRhZGRyLAorCQkJCQkgIG5ld2tleSwga2V5LT5rZXlsZW4pOworCX0KKyNlbmRpZgorCiAJX19pbmV0X2hhc2goJnRjcF9oYXNoaW5mbywgbmV3c2ssIDApOwogCV9faW5ldF9pbmhlcml0X3BvcnQoJnRjcF9oYXNoaW5mbywgc2ssIG5ld3NrKTsKIApAQCAtOTcxLDcgKzE1MTAsNyBAQAogCXJldHVybiBzazsKIH0KIAotc3RhdGljIGludCB0Y3BfdjRfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIF9fc3VtMTYgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKIAkJaWYgKCF0Y3BfdjRfY2hlY2soc2tiLT5oLnRoLCBza2ItPmxlbiwgc2tiLT5uaC5pcGgtPnNhZGRyLApAQCAtMTAwMSwxMCArMTU0MCwyNCBAQAogICovCiBpbnQgdGNwX3Y0X2RvX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHNvY2sgKnJzazsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qCisJICogV2UgcmVhbGx5IHdhbnQgdG8gcmVqZWN0IHRoZSBwYWNrZXQgYXMgZWFybHkgYXMgcG9zc2libGUKKwkgKiBpZjoKKwkgKiAgbyBXZSdyZSBleHBlY3RpbmcgYW4gTUQ1J2QgcGFja2V0IGFuZCB0aGlzIGlzIG5vIE1ENSB0Y3Agb3B0aW9uCisJICogIG8gVGhlcmUgaXMgYW4gTUQ1IG9wdGlvbiBhbmQgd2UncmUgbm90IGV4cGVjdGluZyBvbmUKKwkgKi8KKwlpZiAodGNwX3Y0X2luYm91bmRfbWQ1X2hhc2goc2ssIHNrYikpCisJCWdvdG8gZGlzY2FyZDsKKyNlbmRpZgorCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsgLyogRmFzdCBwYXRoICovCiAJCVRDUF9DSEVDS19USU1FUihzayk7Ci0JCWlmICh0Y3BfcmN2X2VzdGFibGlzaGVkKHNrLCBza2IsIHNrYi0+aC50aCwgc2tiLT5sZW4pKQorCQlpZiAodGNwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkgeworCQkJcnNrID0gc2s7CiAJCQlnb3RvIHJlc2V0OworCQl9CiAJCVRDUF9DSEVDS19USU1FUihzayk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEwMTgsMjAgKzE1NzEsMjQgQEAKIAkJCWdvdG8gZGlzY2FyZDsKIAogCQlpZiAobnNrICE9IHNrKSB7Ci0JCQlpZiAodGNwX2NoaWxkX3Byb2Nlc3Moc2ssIG5zaywgc2tiKSkKKwkJCWlmICh0Y3BfY2hpbGRfcHJvY2VzcyhzaywgbnNrLCBza2IpKSB7CisJCQkJcnNrID0gbnNrOwogCQkJCWdvdG8gcmVzZXQ7CisJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAogCVRDUF9DSEVDS19USU1FUihzayk7Ci0JaWYgKHRjcF9yY3Zfc3RhdGVfcHJvY2Vzcyhzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkKKwlpZiAodGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKHNrLCBza2IsIHNrYi0+aC50aCwgc2tiLT5sZW4pKSB7CisJCXJzayA9IHNrOwogCQlnb3RvIHJlc2V0OworCX0KIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwogCXJldHVybiAwOwogCiByZXNldDoKLQl0Y3BfdjRfc2VuZF9yZXNldChza2IpOworCXRjcF92NF9zZW5kX3Jlc2V0KHJzaywgc2tiKTsKIGRpc2NhcmQ6CiAJa2ZyZWVfc2tiKHNrYik7CiAJLyogQmUgY2FyZWZ1bCBoZXJlLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMgbW9yZSBjb21wbGljYXRlZCBhbmQKQEAgLTExNDAsNyArMTY5Nyw3IEBACiBiYWRfcGFja2V0OgogCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfSU5FUlJTKTsKIAl9IGVsc2UgewotCQl0Y3BfdjRfc2VuZF9yZXNldChza2IpOworCQl0Y3BfdjRfc2VuZF9yZXNldChOVUxMLCBza2IpOwogCX0KIAogZGlzY2FyZF9pdDoKQEAgLTEyNjMsNiArMTgyMCwxNSBAQAogI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKK3N0YXRpYyBzdHJ1Y3QgdGNwX3NvY2tfYWZfb3BzIHRjcF9zb2NrX2lwdjRfc3BlY2lmaWMgPSB7CisJLm1kNV9sb29rdXAJCT0gdGNwX3Y0X21kNV9sb29rdXAsCisJLmNhbGNfbWQ1X2hhc2gJCT0gdGNwX3Y0X2NhbGNfbWQ1X2hhc2gsCisJLm1kNV9hZGQJCT0gdGNwX3Y0X21kNV9hZGRfZnVuYywKKwkubWQ1X3BhcnNlCQk9IHRjcF92NF9wYXJzZV9tZDVfa2V5cywKK307CisjZW5kaWYKKwogLyogTk9URTogQSBsb3Qgb2YgdGhpbmdzIHNldCB0byB6ZXJvIGV4cGxpY2l0bHkgYnkgY2FsbCB0bwogICogICAgICAgc2tfYWxsb2MoKSBzbyBuZWVkIG5vdCBiZSBkb25lIGhlcmUuCiAgKi8KQEAgLTEzMDIsNiArMTg2OCw5IEBACiAKIAlpY3NrLT5pY3NrX2FmX29wcyA9ICZpcHY0X3NwZWNpZmljOwogCWljc2stPmljc2tfc3luY19tc3MgPSB0Y3Bfc3luY19tc3M7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwl0cC0+YWZfc3BlY2lmaWMgPSAmdGNwX3NvY2tfaXB2NF9zcGVjaWZpYzsKKyNlbmRpZgogCiAJc2stPnNrX3NuZGJ1ZiA9IHN5c2N0bF90Y3Bfd21lbVsxXTsKIAlzay0+c2tfcmN2YnVmID0gc3lzY3RsX3RjcF9ybWVtWzFdOwpAQCAtMTMyNSw2ICsxODk0LDE1IEBACiAJLyogQ2xlYW5zIHVwIG91ciwgaG9wZWZ1bGx5IGVtcHR5LCBvdXRfb2Zfb3JkZXJfcXVldWUuICovCiAgIAlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qIENsZWFuIHVwIHRoZSBNRDUga2V5IGxpc3QsIGlmIGFueSAqLworCWlmICh0cC0+bWQ1c2lnX2luZm8pIHsKKwkJdGNwX3Y0X2NsZWFyX21kNV9saXN0KHNrKTsKKwkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvKTsKKwkJdHAtPm1kNXNpZ19pbmZvID0gTlVMTDsKKwl9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19ORVRfRE1BCiAJLyogQ2xlYW5zIHVwIG91ciBza19hc3luY193YWl0X3F1ZXVlICovCiAgIAlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX2FzeW5jX3dhaXRfcXVldWUpOwpAQCAtMTM4NSw3ICsxOTYzLDcgQEAKIAlpZiAoc3QtPnN0YXRlID09IFRDUF9TRVFfU1RBVEVfT1BFTlJFUSkgewogCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEgPSBjdXI7CiAKLQkgICAgICAgCWljc2sgPSBpbmV0X2NzayhzdC0+c3luX3dhaXRfc2spOworCQlpY3NrID0gaW5ldF9jc2soc3QtPnN5bl93YWl0X3NrKTsKIAkJcmVxID0gcmVxLT5kbF9uZXh0OwogCQl3aGlsZSAoMSkgewogCQkJd2hpbGUgKHJlcSkgewpAQCAtMTM5NSw3ICsxOTczLDcgQEAKIAkJCQl9CiAJCQkJcmVxID0gcmVxLT5kbF9uZXh0OwogCQkJfQotCQkJaWYgKCsrc3QtPnNidWNrZXQgPj0gVENQX1NZTlFfSFNJWkUpCisJCQlpZiAoKytzdC0+c2J1Y2tldCA+PSBpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5saXN0ZW5fb3B0LT5ucl90YWJsZV9lbnRyaWVzKQogCQkJCWJyZWFrOwogZ2V0X3JlcToKIAkJCXJlcSA9IGljc2stPmljc2tfYWNjZXB0X3F1ZXVlLmxpc3Rlbl9vcHQtPnN5bl90YWJsZVtzdC0+c2J1Y2tldF07CkBAIC0xNTQzLDcgKzIxMjEsNyBAQAogCXdoaWxlIChyYyAmJiBwb3MpIHsKIAkJcmMgPSBlc3RhYmxpc2hlZF9nZXRfbmV4dChzZXEsIHJjKTsKIAkJLS1wb3M7Ci0JfQkJCisJfQogCXJldHVybiByYzsKIH0KIApAQCAtMTY3Miw3ICsyMjUwLDcgQEAKIAlhZmluZm8tPnNlcV9mb3BzLT5yZWFkCQk9IHNlcV9yZWFkOwogCWFmaW5mby0+c2VxX2ZvcHMtPmxsc2Vlawk9IHNlcV9sc2VlazsKIAlhZmluZm8tPnNlcV9mb3BzLT5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZTsKLQkKKwogCXAgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShhZmluZm8tPm5hbWUsIFNfSVJVR08sIGFmaW5mby0+c2VxX2ZvcHMpOwogCWlmIChwKQogCQlwLT5kYXRhID0gYWZpbmZvOwpAQCAtMTY4Niw3ICsyMjY0LDcgQEAKIAlpZiAoIWFmaW5mbykKIAkJcmV0dXJuOwogCXByb2NfbmV0X3JlbW92ZShhZmluZm8tPm5hbWUpOwotCW1lbXNldChhZmluZm8tPnNlcV9mb3BzLCAwLCBzaXplb2YoKmFmaW5mby0+c2VxX2ZvcHMpKTsgCisJbWVtc2V0KGFmaW5mby0+c2VxX2ZvcHMsIDAsIHNpemVvZigqYWZpbmZvLT5zZXFfZm9wcykpOwogfQogCiBzdGF0aWMgdm9pZCBnZXRfb3BlbnJlcTQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCkBAIC0xNzIxLDggKzIyOTksOCBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc3ApOwogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNwKTsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzcCk7Ci0JdW5zaWduZWQgaW50IGRlc3QgPSBpbmV0LT5kYWRkcjsKLQl1bnNpZ25lZCBpbnQgc3JjID0gaW5ldC0+cmN2X3NhZGRyOworCV9fYmUzMiBkZXN0ID0gaW5ldC0+ZGFkZHI7CisJX19iZTMyIHNyYyA9IGluZXQtPnJjdl9zYWRkcjsKIAlfX3UxNiBkZXN0cCA9IG50b2hzKGluZXQtPmRwb3J0KTsKIAlfX3UxNiBzcmNwID0gbnRvaHMoaW5ldC0+c3BvcnQpOwogCkBAIC0xNzQ0LDcgKzIzMjIsOCBAQAogCQkJIiUwOFggJTVkICU4ZCAlbHUgJWQgJXAgJXUgJXUgJXUgJXUgJWQiLAogCQlpLCBzcmMsIHNyY3AsIGRlc3QsIGRlc3RwLCBzcC0+c2tfc3RhdGUsCiAJCXRwLT53cml0ZV9zZXEgLSB0cC0+c25kX3VuYSwKLQkJKHNwLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSA/IHNwLT5za19hY2tfYmFja2xvZyA6ICh0cC0+cmN2X254dCAtIHRwLT5jb3BpZWRfc2VxKSwKKwkJc3AtPnNrX3N0YXRlID09IFRDUF9MSVNURU4gPyBzcC0+c2tfYWNrX2JhY2tsb2cgOgorCQkJCQkgICAgICh0cC0+cmN2X254dCAtIHRwLT5jb3BpZWRfc2VxKSwKIAkJdGltZXJfYWN0aXZlLAogCQlqaWZmaWVzX3RvX2Nsb2NrX3QodGltZXJfZXhwaXJlcyAtIGppZmZpZXMpLAogCQlpY3NrLT5pY3NrX3JldHJhbnNtaXRzLApAQCAtMTc1OSw3ICsyMzM4LDggQEAKIAkJdHAtPnNuZF9zc3RocmVzaCA+PSAweEZGRkYgPyAtMSA6IHRwLT5zbmRfc3N0aHJlc2gpOwogfQogCi1zdGF0aWMgdm9pZCBnZXRfdGltZXdhaXQ0X3NvY2soc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsIGNoYXIgKnRtcGJ1ZiwgaW50IGkpCitzdGF0aWMgdm9pZCBnZXRfdGltZXdhaXQ0X3NvY2soc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCisJCQkgICAgICAgY2hhciAqdG1wYnVmLCBpbnQgaSkKIHsKIAlfX2JlMzIgZGVzdCwgc3JjOwogCV9fdTE2IGRlc3RwLCBzcmNwOwpAQCAtMTg3Miw3ICsyNDUyLDggQEAKIAogdm9pZCBfX2luaXQgdGNwX3Y0X2luaXQoc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm9wcykKIHsKLQlpZiAoaW5ldF9jc2tfY3RsX3NvY2tfY3JlYXRlKCZ0Y3Bfc29ja2V0LCBQRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19UQ1ApIDwgMCkKKwlpZiAoaW5ldF9jc2tfY3RsX3NvY2tfY3JlYXRlKCZ0Y3Bfc29ja2V0LCBQRl9JTkVULCBTT0NLX1JBVywKKwkJCQkgICAgIElQUFJPVE9fVENQKSA8IDApCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBUQ1AgY29udHJvbCBzb2NrZXQuXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCmluZGV4IDAxNjNkOTguLjZkZGRmNTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKQEAgLTMwNiw2ICszMDYsMjggQEAKIAkJCXR3LT50d19pcHY2b25seSA9IG5wLT5pcHY2b25seTsKIAkJfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQkvKgorCQkgKiBUaGUgdGltZXdhaXQgYnVja2V0IGRvZXMgbm90IGhhdmUgdGhlIGtleSBEQiBmcm9tIHRoZQorCQkgKiBzb2NrIHN0cnVjdHVyZS4gV2UganVzdCBtYWtlIGEgcXVpY2sgY29weSBvZiB0aGUKKwkJICogbWQ1IGtleSBiZWluZyB1c2VkIChpZiBpbmRlZWQgd2UgYXJlIHVzaW5nIG9uZSkKKwkJICogc28gdGhlIHRpbWV3YWl0IGFjayBnZW5lcmF0aW5nIGNvZGUgaGFzIHRoZSBrZXkuCisJCSAqLworCQlkbyB7CisJCQlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKwkJCW1lbXNldCh0Y3B0dy0+dHdfbWQ1X2tleSwgMCwgc2l6ZW9mKHRjcHR3LT50d19tZDVfa2V5KSk7CisJCQl0Y3B0dy0+dHdfbWQ1X2tleWxlbiA9IDA7CisJCQlrZXkgPSB0cC0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIHNrKTsKKwkJCWlmIChrZXkgIT0gTlVMTCkgeworCQkJCW1lbWNweSgmdGNwdHctPnR3X21kNV9rZXksIGtleS0+a2V5LCBrZXktPmtleWxlbik7CisJCQkJdGNwdHctPnR3X21kNV9rZXlsZW4gPSBrZXktPmtleWxlbjsKKwkJCQlpZiAodGNwX2FsbG9jX21kNXNpZ19wb29sKCkgPT0gTlVMTCkKKwkJCQkJQlVHKCk7CisJCQl9CisJCX0gd2hpbGUoMCk7CisjZW5kaWYKKwogCQkvKiBMaW5rYWdlIHVwZGF0ZXMuICovCiAJCV9faW5ldF90d3NrX2hhc2hkYW5jZSh0dywgc2ssICZ0Y3BfaGFzaGluZm8pOwogCkBAIC0zMjksMTQgKzM1MSwyNCBAQAogCQkgKiBzb2NrZXQgdXAuICBXZSd2ZSBnb3QgYmlnZ2VyIHByb2JsZW1zIHRoYW4KIAkJICogbm9uLWdyYWNlZnVsIHNvY2tldCBjbG9zaW5ncy4KIAkJICovCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJUQ1A6IHRpbWUgd2FpdCBidWNrZXQgdGFibGUgb3ZlcmZsb3dcbiIpOworCQlMSU1JVF9ORVRERUJVRyhLRVJOX0lORk8gIlRDUDogdGltZSB3YWl0IGJ1Y2tldCB0YWJsZSBvdmVyZmxvd1xuIik7CiAJfQogCiAJdGNwX3VwZGF0ZV9tZXRyaWNzKHNrKTsKIAl0Y3BfZG9uZShzayk7CiB9CiAKK3ZvaWQgdGNwX3R3c2tfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc29jayAqc2spCit7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnR3c2sgPSB0Y3BfdHdzayhzayk7CisJaWYgKHR3c2stPnR3X21kNV9rZXlsZW4pCisJCXRjcF9wdXRfbWQ1c2lnX3Bvb2woKTsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfdHdza19kZXN0cnVjdG9yKTsKKwogLyogVGhpcyBpcyBub3Qgb25seSBtb3JlIGVmZmljaWVudCB0aGFuIHdoYXQgd2UgdXNlZCB0byBkbywgaXQgZWxpbWluYXRlcwogICogYSBsb3Qgb2YgY29kZSBkdXBsaWNhdGlvbiBiZXR3ZWVuIElQdjQvSVB2NiBTWU4gcmVjdiBwcm9jZXNzaW5nLiAtRGF2ZU0KICAqCkBAIC00MzUsNiArNDY3LDExIEBACiAJCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IDA7CiAJCQluZXd0cC0+dGNwX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAJCX0KKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQluZXd0cC0+bWQ1c2lnX2luZm8gPSBOVUxMOwkvKlhYWCovCisJCWlmIChuZXd0cC0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIG5ld3NrKSkKKwkJCW5ld3RwLT50Y3BfaGVhZGVyX2xlbiArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCiAJCWlmIChza2ItPmxlbiA+PSBUQ1BfTUlOX1JDVk1TUytuZXd0cC0+dGNwX2hlYWRlcl9sZW4pCiAJCQluZXdpY3NrLT5pY3NrX2Fjay5sYXN0X3NlZ19zaXplID0gc2tiLT5sZW4gLSBuZXd0cC0+dGNwX2hlYWRlcl9sZW47CiAJCW5ld3RwLT5yeF9vcHQubXNzX2NsYW1wID0gcmVxLT5tc3M7CkBAIC00NTUsNyArNDkyLDcgQEAKIAkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2KQogewogCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOwotCXUzMiBmbGcgPSB0Y3BfZmxhZ193b3JkKHRoKSAmIChUQ1BfRkxBR19SU1R8VENQX0ZMQUdfU1lOfFRDUF9GTEFHX0FDSyk7CisJX19iZTMyIGZsZyA9IHRjcF9mbGFnX3dvcmQodGgpICYgKFRDUF9GTEFHX1JTVHxUQ1BfRkxBR19TWU58VENQX0ZMQUdfQUNLKTsKIAlpbnQgcGF3c19yZWplY3QgPSAwOwogCXN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCB0bXBfb3B0OwogCXN0cnVjdCBzb2NrICpjaGlsZDsKQEAgLTYxNyw2ICs2NTQsMzAgQEAKIAkJCQkJCQkJIHJlcSwgTlVMTCk7CiAJCWlmIChjaGlsZCA9PSBOVUxMKQogCQkJZ290byBsaXN0ZW5fb3ZlcmZsb3c7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkJZWxzZSB7CisJCQkvKiBDb3B5IG92ZXIgdGhlIE1ENSBrZXkgZnJvbSB0aGUgb3JpZ2luYWwgc29ja2V0ICovCisJCQlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKwkJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCQkJa2V5ID0gdHAtPmFmX3NwZWNpZmljLT5tZDVfbG9va3VwKHNrLCBjaGlsZCk7CisJCQlpZiAoa2V5ICE9IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIFdlJ3JlIHVzaW5nIG9uZSwgc28gY3JlYXRlIGEgbWF0Y2hpbmcga2V5IG9uIHRoZQorCQkJCSAqIG5ld3NrIHN0cnVjdHVyZS4gSWYgd2UgZmFpbCB0byBnZXQgbWVtb3J5IHRoZW4gd2UKKwkJCQkgKiBlbmQgdXAgbm90IGNvcHlpbmcgdGhlIGtleSBhY3Jvc3MuIFNodWNrcy4KKwkJCQkgKi8KKwkJCQljaGFyICpuZXdrZXkgPSBrbWVtZHVwKGtleS0+a2V5LCBrZXktPmtleWxlbiwKKwkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwkJCQlpZiAobmV3a2V5KSB7CisJCQkJCWlmICghdGNwX2FsbG9jX21kNXNpZ19wb29sKCkpCisJCQkJCQlCVUcoKTsKKwkJCQkJdHAtPmFmX3NwZWNpZmljLT5tZDVfYWRkKGNoaWxkLCBjaGlsZCwKKwkJCQkJCQkJIG5ld2tleSwKKwkJCQkJCQkJIGtleS0+a2V5bGVuKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgogCiAJCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3VubGluayhzaywgcmVxLCBwcmV2KTsKIAkJaW5ldF9jc2tfcmVxc2tfcXVldWVfcmVtb3ZlZChzaywgcmVxKTsKQEAgLTYzMyw3ICs2OTQsNyBAQAogCWVtYnJ5b25pY19yZXNldDoKIAkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfRU1CUllPTklDUlNUUyk7CiAJCWlmICghKGZsZyAmIFRDUF9GTEFHX1JTVCkpCi0JCQlyZXEtPnJza19vcHMtPnNlbmRfcmVzZXQoc2tiKTsKKwkJCXJlcS0+cnNrX29wcy0+c2VuZF9yZXNldChzaywgc2tiKTsKIAogCQlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHNrLCByZXEsIHByZXYpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCBjYTQwNjE1Li4zMmMxYTk3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgdGNwX2J1aWxkX2FuZF91cGRhdGVfb3B0aW9ucyhfX2JlMzIgKnB0ciwgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCQkJIF9fdTMyIHRzdGFtcCkKKwkJCQkJIF9fdTMyIHRzdGFtcCwgX191OCAqKm1kNV9oYXNoKQogewogCWlmICh0cC0+cnhfb3B0LnRzdGFtcF9vaykgewogCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfApAQCAtMjk4LDE2ICsyOTgsMjkgQEAKIAkJCXRwLT5yeF9vcHQuZWZmX3NhY2tzLS07CiAJCX0KIAl9CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlpZiAobWQ1X2hhc2gpIHsKKwkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKKwkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAorCQkJICAgICAgIChUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwKKwkJCSAgICAgICBUQ1BPTEVOX01ENVNJRyk7CisJCSptZDVfaGFzaCA9IChfX3U4ICopcHRyOworCX0KKyNlbmRpZgogfQogCiAvKiBDb25zdHJ1Y3QgYSB0Y3Agb3B0aW9ucyBoZWFkZXIgZm9yIGEgU1lOIG9yIFNZTl9BQ0sgcGFja2V0LgogICogSWYgdGhpcyBpcyBldmVyeSBjaGFuZ2VkIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKICAqIE1BWF9TWU5fU0laRSB0byBtYXRjaCB0aGUgbmV3IG1heGltdW0gbnVtYmVyIG9mIG9wdGlvbnMgdGhhdCB5b3UKICAqIGNhbiBnZW5lcmF0ZS4KKyAqCisgKiBOb3RlIC0gdGhhdCB3aXRoIHRoZSBSRkMyMzg1IFRDUCBvcHRpb24sIHdlIG1ha2Ugcm9vbSBmb3IgdGhlCisgKiAxNiBieXRlIE1ENSBoYXNoLiBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbyB0aGUgcG9pbnRlciBmb3IgdGhlCisgKiBsb2NhdGlvbiB0byBiZSBmaWxsZWQgaXMgcGFzc2VkIGJhY2sgdXAuCiAgKi8KIHN0YXRpYyB2b2lkIHRjcF9zeW5fYnVpbGRfb3B0aW9ucyhfX2JlMzIgKnB0ciwgaW50IG1zcywgaW50IHRzLCBpbnQgc2FjaywKIAkJCQkgIGludCBvZmZlcl93c2NhbGUsIGludCB3c2NhbGUsIF9fdTMyIHRzdGFtcCwKLQkJCQkgIF9fdTMyIHRzX3JlY2VudCkKKwkJCQkgIF9fdTMyIHRzX3JlY2VudCwgX191OCAqKm1kNV9oYXNoKQogewogCS8qIFdlIGFsd2F5cyBnZXQgYW4gTVNTIG9wdGlvbi4KIAkgKiBUaGUgb3B0aW9uIGJ5dGVzIHdoaWNoIHdpbGwgYmUgc2VlbiBpbiBub3JtYWwgZGF0YQpAQCAtMzQ2LDYgKzM1OSwyMCBAQAogCQkJICAgICAgIChUQ1BPUFRfV0lORE9XIDw8IDE2KSB8CiAJCQkgICAgICAgKFRDUE9MRU5fV0lORE9XIDw8IDgpIHwKIAkJCSAgICAgICAod3NjYWxlKSk7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkvKgorCSAqIElmIE1ENSBpcyBlbmFibGVkLCB0aGVuIHdlIHNldCB0aGUgb3B0aW9uLCBhbmQgaW5jbHVkZSB0aGUgc2l6ZQorCSAqIChhbHdheXMgMTgpLiBUaGUgYWN0dWFsIE1ENSBoYXNoIGlzIGFkZGVkIGp1c3QgYmVmb3JlIHRoZQorCSAqIHBhY2tldCBpcyBzZW50LgorCSAqLworCWlmIChtZDVfaGFzaCkgeworCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAorCQkJICAgICAgIChUQ1BPUFRfTk9QIDw8IDE2KSB8CisJCQkgICAgICAgKFRDUE9QVF9NRDVTSUcgPDwgOCkgfAorCQkJICAgICAgIFRDUE9MRU5fTUQ1U0lHKTsKKwkJKm1kNV9oYXNoID0gKF9fdTggKikgcHRyOworCX0KKyNlbmRpZgogfQogCiAvKiBUaGlzIHJvdXRpbmUgYWN0dWFsbHkgdHJhbnNtaXRzIFRDUCBwYWNrZXRzIHF1ZXVlZCBpbiBieQpAQCAtMzY2LDYgKzM5MywxMCBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHA7CiAJc3RydWN0IHRjcF9za2JfY2IgKnRjYjsKIAlpbnQgdGNwX2hlYWRlcl9zaXplOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICptZDU7CisJX191OCAqbWQ1X2hhc2hfbG9jYXRpb247CisjZW5kaWYKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIAlpbnQgc3lzY3RsX2ZsYWdzOwogCWludCBlcnI7CkBAIC00MjQsOSArNDU1LDE4IEBACiAJaWYgKHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgPT0gMCkKIAkJdGNwX2NhX2V2ZW50KHNrLCBDQV9FVkVOVF9UWF9TVEFSVCk7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qCisJICogQXJlIHdlIGRvaW5nIE1ENSBvbiB0aGlzIHNlZ21lbnQ/IElmIHNvIC0gbWFrZQorCSAqIHJvb20gZm9yIGl0LgorCSAqLworCW1kNSA9IHRwLT5hZl9zcGVjaWZpYy0+bWQ1X2xvb2t1cChzaywgc2spOworCWlmIChtZDUpCisJCXRjcF9oZWFkZXJfc2l6ZSArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCisKIAl0aCA9IChzdHJ1Y3QgdGNwaGRyICopIHNrYl9wdXNoKHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKIAlza2ItPmgudGggPSB0aDsKLQlza2Jfc2V0X293bmVyX3coc2tiLCBzayk7CiAKIAkvKiBCdWlsZCBUQ1AgaGVhZGVyIGFuZCBjaGVja3N1bSBpdC4gKi8KIAl0aC0+c291cmNlCQk9IGluZXQtPnNwb3J0OwpAQCAtNDYxLDEzICs1MDEsMzQgQEAKIAkJCQkgICAgICAoc3lzY3RsX2ZsYWdzICYgU1lTQ1RMX0ZMQUdfV1NDQUxFKSwKIAkJCQkgICAgICB0cC0+cnhfb3B0LnJjdl93c2NhbGUsCiAJCQkJICAgICAgdGNiLT53aGVuLAotCQkJCSAgICAgIHRwLT5yeF9vcHQudHNfcmVjZW50KTsKKwkJCQkgICAgICB0cC0+cnhfb3B0LnRzX3JlY2VudCwKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCQkJICAgICAgbWQ1ID8gJm1kNV9oYXNoX2xvY2F0aW9uIDoKKyNlbmRpZgorCQkJCSAgICAgIE5VTEwpOwogCX0gZWxzZSB7CiAJCXRjcF9idWlsZF9hbmRfdXBkYXRlX29wdGlvbnMoKF9fYmUzMiAqKSh0aCArIDEpLAotCQkJCQkgICAgIHRwLCB0Y2ItPndoZW4pOworCQkJCQkgICAgIHRwLCB0Y2ItPndoZW4sCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkJCQkJICAgICBtZDUgPyAmbWQ1X2hhc2hfbG9jYXRpb24gOgorI2VuZGlmCisJCQkJCSAgICAgTlVMTCk7CiAJCVRDUF9FQ05fc2VuZChzaywgdHAsIHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qIENhbGN1bGF0ZSB0aGUgTUQ1IGhhc2gsIGFzIHdlIGhhdmUgYWxsIHdlIG5lZWQgbm93ICovCisJaWYgKG1kNSkgeworCQl0cC0+YWZfc3BlY2lmaWMtPmNhbGNfbWQ1X2hhc2gobWQ1X2hhc2hfbG9jYXRpb24sCisJCQkJCSAgICAgICBtZDUsCisJCQkJCSAgICAgICBzaywgTlVMTCwgTlVMTCwKKwkJCQkJICAgICAgIHNrYi0+aC50aCwKKwkJCQkJICAgICAgIHNrLT5za19wcm90b2NvbCwKKwkJCQkJICAgICAgIHNrYi0+bGVuKTsKKwl9CisjZW5kaWYKKwogCWljc2stPmljc2tfYWZfb3BzLT5zZW5kX2NoZWNrKHNrLCBza2ItPmxlbiwgc2tiKTsKIAogCWlmIChsaWtlbHkodGNiLT5mbGFncyAmIFRDUENCX0ZMQUdfQUNLKSkKQEAgLTQ3OSwxOSArNTQwLDEzIEBACiAJaWYgKGFmdGVyKHRjYi0+ZW5kX3NlcSwgdHAtPnNuZF9ueHQpIHx8IHRjYi0+c2VxID09IHRjYi0+ZW5kX3NlcSkKIAkJVENQX0lOQ19TVEFUUyhUQ1BfTUlCX09VVFNFR1MpOwogCi0JZXJyID0gaWNzay0+aWNza19hZl9vcHMtPnF1ZXVlX3htaXQoc2tiLCAwKTsKKwllcnIgPSBpY3NrLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIHNrLCAwKTsKIAlpZiAobGlrZWx5KGVyciA8PSAwKSkKIAkJcmV0dXJuIGVycjsKIAogCXRjcF9lbnRlcl9jd3Ioc2spOwogCi0JLyogTkVUX1hNSVRfQ04gaXMgc3BlY2lhbC4gSXQgZG9lcyBub3QgZ3VhcmFudGVlLAotCSAqIHRoYXQgdGhpcyBwYWNrZXQgaXMgbG9zdC4gSXQgdGVsbHMgdGhhdCBkZXZpY2UKLQkgKiBpcyBhYm91dCB0byBzdGFydCB0byBkcm9wIHBhY2tldHMgb3IgYWxyZWFkeQotCSAqIGRyb3BzIHNvbWUgcGFja2V0cyBvZiB0aGUgc2FtZSBwcmlvcml0eSBhbmQKLQkgKiBpbnZva2VzIHVzIHRvIHNlbmQgbGVzcyBhZ2dyZXNzaXZlbHkuCi0JICovCi0JcmV0dXJuIGVyciA9PSBORVRfWE1JVF9DTiA/IDAgOiBlcnI7CisJcmV0dXJuIG5ldF94bWl0X2V2YWwoZXJyKTsKIAogI3VuZGVmIFNZU0NUTF9GTEFHX1RTVEFNUFMKICN1bmRlZiBTWVNDVExfRkxBR19XU0NBTEUKQEAgLTg0Nyw2ICs5MDIsMTEgQEAKIAkJbXNzX25vdyAtPSAoVENQT0xFTl9TQUNLX0JBU0VfQUxJR05FRCArCiAJCQkgICAgKHRwLT5yeF9vcHQuZWZmX3NhY2tzICogVENQT0xFTl9TQUNLX1BFUkJMT0NLKSk7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCWlmICh0cC0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIHNrKSkKKwkJbXNzX25vdyAtPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCisKIAl4bWl0X3NpemVfZ29hbCA9IG1zc19ub3c7CiAKIAlpZiAoZG9pbmdfdHNvKSB7CkBAIC0yMDQwLDYgKzIxMDAsMTAgQEAKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIAlpbnQgdGNwX2hlYWRlcl9zaXplOwogCXN0cnVjdCBza19idWZmICpza2I7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNTsKKwlfX3U4ICptZDVfaGFzaF9sb2NhdGlvbjsKKyNlbmRpZgogCiAJc2tiID0gc29ja193bWFsbG9jKHNrLCBNQVhfVENQX0hFQURFUiArIDE1LCAxLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCkBAIC0yMDU1LDYgKzIxMTksMTMgQEAKIAkJCSAgIChpcmVxLT53c2NhbGVfb2sgPyBUQ1BPTEVOX1dTQ0FMRV9BTElHTkVEIDogMCkgKwogCQkJICAgLyogU0FDS19QRVJNIGlzIGluIHRoZSBwbGFjZSBvZiBOT1AgTk9QIG9mIFRTICovCiAJCQkgICAoKGlyZXEtPnNhY2tfb2sgJiYgIWlyZXEtPnRzdGFtcF9vaykgPyBUQ1BPTEVOX1NBQ0tQRVJNX0FMSUdORUQgOiAwKSk7CisKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qIEFyZSB3ZSBkb2luZyBNRDUgb24gdGhpcyBzZWdtZW50PyBJZiBzbyAtIG1ha2Ugcm9vbSBmb3IgaXQgKi8KKwltZDUgPSB0Y3BfcnNrKHJlcSktPmFmX3NwZWNpZmljLT5tZDVfbG9va3VwKHNrLCByZXEpOworCWlmIChtZDUpCisJCXRjcF9oZWFkZXJfc2l6ZSArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCiAJc2tiLT5oLnRoID0gdGggPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CiAKIAltZW1zZXQodGgsIDAsIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CkBAIC0yMDkyLDExICsyMTYzLDI5IEBACiAJdGNwX3N5bl9idWlsZF9vcHRpb25zKChfX2JlMzIgKikodGggKyAxKSwgZHN0X21ldHJpYyhkc3QsIFJUQVhfQURWTVNTKSwgaXJlcS0+dHN0YW1wX29rLAogCQkJICAgICAgaXJlcS0+c2Fja19vaywgaXJlcS0+d3NjYWxlX29rLCBpcmVxLT5yY3Zfd3NjYWxlLAogCQkJICAgICAgVENQX1NLQl9DQihza2IpLT53aGVuLAotCQkJICAgICAgcmVxLT50c19yZWNlbnQpOworCQkJICAgICAgcmVxLT50c19yZWNlbnQsCisJCQkgICAgICAoCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkJCSAgICAgICBtZDUgPyAmbWQ1X2hhc2hfbG9jYXRpb24gOgorI2VuZGlmCisJCQkgICAgICAgTlVMTCkKKwkJCSAgICAgICk7CiAKIAlza2ItPmNzdW0gPSAwOwogCXRoLT5kb2ZmID0gKHRjcF9oZWFkZXJfc2l6ZSA+PiAyKTsKIAlUQ1BfSU5DX1NUQVRTKFRDUF9NSUJfT1VUU0VHUyk7CisKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qIE9rYXksIHdlIGhhdmUgYWxsIHdlIG5lZWQgLSBkbyB0aGUgbWQ1IGhhc2ggaWYgbmVlZGVkICovCisJaWYgKG1kNSkgeworCQl0cC0+YWZfc3BlY2lmaWMtPmNhbGNfbWQ1X2hhc2gobWQ1X2hhc2hfbG9jYXRpb24sCisJCQkJCSAgICAgICBtZDUsCisJCQkJCSAgICAgICBOVUxMLCBkc3QsIHJlcSwKKwkJCQkJICAgICAgIHNrYi0+aC50aCwgc2stPnNrX3Byb3RvY29sLAorCQkJCQkgICAgICAgc2tiLT5sZW4pOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIHNrYjsKIH0KIApAQCAtMjExNSw2ICsyMjA0LDExIEBACiAJdHAtPnRjcF9oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpICsKIAkJKHN5c2N0bF90Y3BfdGltZXN0YW1wcyA/IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgOiAwKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKHRwLT5hZl9zcGVjaWZpYy0+bWQ1X2xvb2t1cChzaywgc2spICE9IE5VTEwpCisJCXRwLT50Y3BfaGVhZGVyX2xlbiArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCisKIAkvKiBJZiB1c2VyIGdhdmUgaGlzIFRDUF9NQVhTRUcsIHJlY29yZCBpdCB0byBjbGFtcCAqLwogCWlmICh0cC0+cnhfb3B0LnVzZXJfbXNzKQogCQl0cC0+cnhfb3B0Lm1zc19jbGFtcCA9IHRwLT5yeF9vcHQudXNlcl9tc3M7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfcHJvYmUuYyBiL25ldC9pcHY0L3RjcF9wcm9iZS5jCmluZGV4IDRiZTMzNmYuLmYyMzBlZWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9wcm9iZS5jCisrKyBiL25ldC9pcHY0L3RjcF9wcm9iZS5jCkBAIC0xNTYsNiArMTU2LDggQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0Y3B3LndhaXQpOwogCXNwaW5fbG9ja19pbml0KCZ0Y3B3LmxvY2spOwogCXRjcHcuZmlmbyA9IGtmaWZvX2FsbG9jKGJ1ZnNpemUsIEdGUF9LRVJORUwsICZ0Y3B3LmxvY2spOworCWlmIChJU19FUlIodGNwdy5maWZvKSkKKwkJcmV0dXJuIFBUUl9FUlIodGNwdy5maWZvKTsKIAogCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUocHJvY25hbWUsIFNfSVJVU1IsICZ0Y3Bwcm9iZV9mb3BzKSkKIAkJZ290byBlcnIwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwppbmRleCBmYjA5YWRlLi4zMzU1YzI3NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMKKysrIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CiAJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiVENQOiBUcmVhc29uIHVuY2xvYWtlZCEgUGVlciAldS4ldS4ldS4ldToldS8ldSBzaHJpbmtzIHdpbmRvdyAldToldS4gUmVwYWlyZWQuXG4iLAotCQkJICAgICAgIE5JUFFVQUQoaW5ldC0+ZGFkZHIpLCBodG9ucyhpbmV0LT5kcG9ydCksCisJCQkgICAgICAgTklQUVVBRChpbmV0LT5kYWRkciksIG50b2hzKGluZXQtPmRwb3J0KSwKIAkJCSAgICAgICBpbmV0LT5udW0sIHRwLT5zbmRfdW5hLCB0cC0+c25kX254dCk7CiAJCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMgYi9uZXQvaXB2NC90Y3BfdmVnYXMuYwppbmRleCBhM2I3YWEwLi5kZGM0YmNjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdmVnYXMuYworKysgYi9uZXQvaXB2NC90Y3BfdmVnYXMuYwpAQCAtNDIsOCArNDIsOCBAQAogICogd2l0aCBWX1BBUkFNX1NISUZUIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCiAgKi8KICNkZWZpbmUgVl9QQVJBTV9TSElGVCAxCi1zdGF0aWMgaW50IGFscGhhID0gMTw8Vl9QQVJBTV9TSElGVDsKLXN0YXRpYyBpbnQgYmV0YSAgPSAzPDxWX1BBUkFNX1NISUZUOworc3RhdGljIGludCBhbHBoYSA9IDI8PFZfUEFSQU1fU0hJRlQ7CitzdGF0aWMgaW50IGJldGEgID0gNDw8Vl9QQVJBTV9TSElGVDsKIHN0YXRpYyBpbnQgZ2FtbWEgPSAxPDxWX1BBUkFNX1NISUZUOwogCiBtb2R1bGVfcGFyYW0oYWxwaGEsIGludCwgMDY0NCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IDg2NWQ3NTIuLjAzNTkxNWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC05MiwyMiArOTIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxuZXQvc25tcC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+Ci0jaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bmV0L3NvY2suaD4KLSNpbmNsdWRlIDxuZXQvdWRwLmg+CiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLSNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgInVkcF9pbXBsLmgiCiAKIC8qCiAgKglTbm1wIE1JQiBmb3IgdGhlIFVEUCBsYXllcgpAQCAtMTIwLDI2ICsxMTQsMzAgQEAKIAogc3RhdGljIGludCB1ZHBfcG9ydF9yb3ZlcjsKIAotc3RhdGljIGlubGluZSBpbnQgdWRwX2xwb3J0X2ludXNlKHUxNiBudW0pCitzdGF0aWMgaW5saW5lIGludCBfX3VkcF9saWJfbHBvcnRfaW51c2UoX191MTYgbnVtLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdKQogewogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAotCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwX2hhc2hbbnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnVkcHRhYmxlW251bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pCiAJCWlmIChpbmV0X3NrKHNrKS0+bnVtID09IG51bSkKIAkJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqICB1ZHBfZ2V0X3BvcnQgIC0gIGNvbW1vbiBwb3J0IGxvb2t1cCBmb3IgSVB2NCBhbmQgSVB2NgorICogIF9fdWRwX2xpYl9nZXRfcG9ydCAgLSAgVURQLy1MaXRlIHBvcnQgbG9va3VwIGZvciBJUHY0IGFuZCBJUHY2CiAgKgogICogIEBzazogICAgICAgICAgc29ja2V0IHN0cnVjdCBpbiBxdWVzdGlvbgogICogIEBzbnVtOiAgICAgICAgcG9ydCBudW1iZXIgdG8gbG9vayB1cAorICogIEB1ZHB0YWJsZTogICAgaGFzaCBsaXN0IHRhYmxlLCBtdXN0IGJlIG9mIFVEUF9IVEFCTEVfU0laRQorICogIEBwb3J0X3JvdmVyOiAgcG9pbnRlciB0byByZWNvcmQgb2YgbGFzdCB1bmFsbG9jYXRlZCBwb3J0CiAgKiAgQHNhZGRyX2NvbXA6ICBBRi1kZXBlbmRlbnQgY29tcGFyaXNvbiBvZiBib3VuZCBsb2NhbCBJUCBhZGRyZXNzZXMKICAqLwotaW50IHVkcF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0sCi0JCSBpbnQgKCpzYWRkcl9jbXApKGNvbnN0IHN0cnVjdCBzb2NrICpzazEsIGNvbnN0IHN0cnVjdCBzb2NrICpzazIpKQoraW50IF9fdWRwX2xpYl9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0sCisJCSAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLCBpbnQgKnBvcnRfcm92ZXIsCisJCSAgICAgICBpbnQgKCpzYWRkcl9jb21wKShjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLAorCQkJCQkgY29uc3Qgc3RydWN0IHNvY2sgKnNrMiApICAgICkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTE1MCwxNSArMTQ4LDE1IEBACiAJaWYgKHNudW0gPT0gMCkgewogCQlpbnQgYmVzdF9zaXplX3NvX2ZhciwgYmVzdCwgcmVzdWx0LCBpOwogCi0JCWlmICh1ZHBfcG9ydF9yb3ZlciA+IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzFdIHx8Ci0JCSAgICB1ZHBfcG9ydF9yb3ZlciA8IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdKQotCQkJdWRwX3BvcnRfcm92ZXIgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXTsKKwkJaWYgKCpwb3J0X3JvdmVyID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0gfHwKKwkJICAgICpwb3J0X3JvdmVyIDwgc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pCisJCQkqcG9ydF9yb3ZlciA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdOwogCQliZXN0X3NpemVfc29fZmFyID0gMzI3Njc7Ci0JCWJlc3QgPSByZXN1bHQgPSB1ZHBfcG9ydF9yb3ZlcjsKKwkJYmVzdCA9IHJlc3VsdCA9ICpwb3J0X3JvdmVyOwogCQlmb3IgKGkgPSAwOyBpIDwgVURQX0hUQUJMRV9TSVpFOyBpKyssIHJlc3VsdCsrKSB7CiAJCQlpbnQgc2l6ZTsKIAotCQkJaGVhZCA9ICZ1ZHBfaGFzaFtyZXN1bHQgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOworCQkJaGVhZCA9ICZ1ZHB0YWJsZVtyZXN1bHQgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOwogCQkJaWYgKGhsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCQkJaWYgKHJlc3VsdCA+IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzFdKQogCQkJCQlyZXN1bHQgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSArCkBAIC0xNzksMTUgKzE3NywxNSBAQAogCQkJCXJlc3VsdCA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdCiAJCQkJCSsgKChyZXN1bHQgLSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSkgJgogCQkJCQkgICAoVURQX0hUQUJMRV9TSVpFIC0gMSkpOwotCQkJaWYgKCF1ZHBfbHBvcnRfaW51c2UocmVzdWx0KSkKKwkJCWlmICghIF9fdWRwX2xpYl9scG9ydF9pbnVzZShyZXN1bHQsIHVkcHRhYmxlKSkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoaSA+PSAoMSA8PCAxNikgLyBVRFBfSFRBQkxFX1NJWkUpCiAJCQlnb3RvIGZhaWw7CiBnb3RpdDoKLQkJdWRwX3BvcnRfcm92ZXIgPSBzbnVtID0gcmVzdWx0OworCQkqcG9ydF9yb3ZlciA9IHNudW0gPSByZXN1bHQ7CiAJfSBlbHNlIHsKLQkJaGVhZCA9ICZ1ZHBfaGFzaFtzbnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXTsKKwkJaGVhZCA9ICZ1ZHB0YWJsZVtzbnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXTsKIAogCQlza19mb3JfZWFjaChzazIsIG5vZGUsIGhlYWQpCiAJCQlpZiAoaW5ldF9zayhzazIpLT5udW0gPT0gc251bSAgICAgICAgICAgICAgICAgICAgICAgICYmCkBAIC0xOTUsMTIgKzE5MywxMiBAQAogCQkJICAgICghc2syLT5za19yZXVzZSAgICAgICAgfHwgIXNrLT5za19yZXVzZSkgICAgICAgICAmJgogCQkJICAgICghc2syLT5za19ib3VuZF9kZXZfaWYgfHwgIXNrLT5za19ib3VuZF9kZXZfaWYKIAkJCSAgICAgfHwgc2syLT5za19ib3VuZF9kZXZfaWYgPT0gc2stPnNrX2JvdW5kX2Rldl9pZikgJiYKLQkJCSAgICAoKnNhZGRyX2NtcCkoc2ssIHNrMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisJCQkgICAgKCpzYWRkcl9jb21wKShzaywgc2syKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogCQkJCWdvdG8gZmFpbDsKIAl9CiAJaW5ldF9zayhzayktPm51bSA9IHNudW07CiAJaWYgKHNrX3VuaGFzaGVkKHNrKSkgewotCQloZWFkID0gJnVkcF9oYXNoW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOworCQloZWFkID0gJnVkcHRhYmxlW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOwogCQlza19hZGRfbm9kZShzaywgaGVhZCk7CiAJCXNvY2tfcHJvdF9pbmNfdXNlKHNrLT5za19wcm90KTsKIAl9CkBAIC0yMTAsNyArMjA4LDEzIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpcHY0X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2syKQorX19pbmxpbmVfXyBpbnQgdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKKwkJCWludCAoKnNjbXApKGNvbnN0IHN0cnVjdCBzb2NrICosIGNvbnN0IHN0cnVjdCBzb2NrICopKQoreworCXJldHVybiAgX191ZHBfbGliX2dldF9wb3J0KHNrLCBzbnVtLCB1ZHBfaGFzaCwgJnVkcF9wb3J0X3JvdmVyLCBzY21wKTsKK30KKworaW5saW5lIGludCBpcHY0X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2syKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQxID0gaW5ldF9zayhzazEpLCAqaW5ldDIgPSBpbmV0X3NrKHNrMik7CiAKQEAgLTIyNCwzNCArMjI4LDIwIEBACiAJcmV0dXJuIHVkcF9nZXRfcG9ydChzaywgc251bSwgaXB2NF9yY3Zfc2FkZHJfZXF1YWwpOwogfQogCi0KLXN0YXRpYyB2b2lkIHVkcF92NF9oYXNoKHN0cnVjdCBzb2NrICpzaykKLXsKLQlCVUcoKTsKLX0KLQotc3RhdGljIHZvaWQgdWRwX3Y0X3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spCi17Ci0Jd3JpdGVfbG9ja19iaCgmdWRwX2hhc2hfbG9jayk7Ci0JaWYgKHNrX2RlbF9ub2RlX2luaXQoc2spKSB7Ci0JCWluZXRfc2soc2spLT5udW0gPSAwOwotCQlzb2NrX3Byb3RfZGVjX3VzZShzay0+c2tfcHJvdCk7Ci0JfQotCXdyaXRlX3VubG9ja19iaCgmdWRwX2hhc2hfbG9jayk7Ci19Ci0KIC8qIFVEUCBpcyBuZWFybHkgYWx3YXlzIHdpbGRjYXJkcyBvdXQgdGhlIHdhem9vLCBpdCBtYWtlcyBubyBzZW5zZSB0byB0cnkKICAqIGhhcmRlciB0aGFuIHRoaXMuIC1EYXZlTQogICovCi1zdGF0aWMgc3RydWN0IHNvY2sgKnVkcF92NF9sb29rdXBfbG9uZ3dheShfX2JlMzIgc2FkZHIsIF9fYmUxNiBzcG9ydCwKLQkJCQkJICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwgaW50IGRpZikKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqX191ZHA0X2xpYl9sb29rdXAoX19iZTMyIHNhZGRyLCBfX2JlMTYgc3BvcnQsCisJCQkJICAgICAgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQsCisJCQkJICAgICAgaW50IGRpZiwgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2ssICpyZXN1bHQgPSBOVUxMOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXVuc2lnbmVkIHNob3J0IGhudW0gPSBudG9ocyhkcG9ydCk7CiAJaW50IGJhZG5lc3MgPSAtMTsKIAotCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwX2hhc2hbaG51bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pIHsKKwlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwdGFibGVbaG51bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pIHsKIAkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCiAJCWlmIChpbmV0LT5udW0gPT0gaG51bSAmJiAhaXB2Nl9vbmx5X3NvY2soc2spKSB7CkBAIC0yODUsMjAgKzI3NSwxMCBAQAogCQkJfQogCQl9CiAJfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBzb2NrICp1ZHBfdjRfbG9va3VwKF9fYmUzMiBzYWRkciwgX19iZTE2IHNwb3J0LAotCQkJCQkgICAgIF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0LCBpbnQgZGlmKQotewotCXN0cnVjdCBzb2NrICpzazsKLQotCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7Ci0Jc2sgPSB1ZHBfdjRfbG9va3VwX2xvbmd3YXkoc2FkZHIsIHNwb3J0LCBkYWRkciwgZHBvcnQsIGRpZik7Ci0JaWYgKHNrKQotCQlzb2NrX2hvbGQoc2spOworCWlmIChyZXN1bHQpCisJCXNvY2tfaG9sZChyZXN1bHQpOwogCXJlYWRfdW5sb2NrKCZ1ZHBfaGFzaF9sb2NrKTsKLQlyZXR1cm4gc2s7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqdWRwX3Y0X21jYXN0X25leHQoc3RydWN0IHNvY2sgKnNrLApAQCAtMzQwLDcgKzMyMCw3IEBACiAgKiB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBwb3J0LgogICovCiAKLXZvaWQgdWRwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3ZvaWQgX191ZHA0X2xpYl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8sIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKQEAgLTM1MSw3ICszMzEsOCBAQAogCWludCBoYXJkZXJyOwogCWludCBlcnI7CiAKLQlzayA9IHVkcF92NF9sb29rdXAoaXBoLT5kYWRkciwgdWgtPmRlc3QsIGlwaC0+c2FkZHIsIHVoLT5zb3VyY2UsIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwlzayA9IF9fdWRwNF9saWJfbG9va3VwKGlwaC0+ZGFkZHIsIHVoLT5kZXN0LCBpcGgtPnNhZGRyLCB1aC0+c291cmNlLAorCQkJICAgICAgIHNrYi0+ZGV2LT5pZmluZGV4LCB1ZHB0YWJsZQkJICAgICk7CiAJaWYgKHNrID09IE5VTEwpIHsKIAkJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOwogICAgIAkgIAlyZXR1cm47CS8qIE5vIHNvY2tldCBmb3IgZXJyb3IgKi8KQEAgLTQwNSw2ICszODYsMTEgQEAKIAlzb2NrX3B1dChzayk7CiB9CiAKK19faW5saW5lX18gdm9pZCB1ZHBfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQoreworCXJldHVybiBfX3VkcDRfbGliX2Vycihza2IsIGluZm8sIHVkcF9oYXNoKTsKK30KKwogLyoKICAqIFRocm93IGF3YXkgYWxsIHBlbmRpbmcgZGF0YSBhbmQgY2FuY2VsIHRoZSBjb3JraW5nLiBTb2NrZXQgaXMgbG9ja2VkLgogICovCkBAIC00MTksMTYgKzQwNSw1OCBAQAogCX0KIH0KIAorLyoqCisgKiAJdWRwNF9od2NzdW1fb3V0Z29pbmcgIC0gIGhhbmRsZSBvdXRnb2luZyBIVyBjaGVja3N1bW1pbmcKKyAqIAlAc2s6IAlzb2NrZXQgd2UgYXJlIHNlbmRpbmcgb24KKyAqIAlAc2tiOiAJc2tfYnVmZiBjb250YWluaW5nIHRoZSBmaWxsZWQtaW4gVURQIGhlYWRlcgorICogCSAgICAgICAgKGNoZWNrc3VtIGZpZWxkIG11c3QgYmUgemVyb2VkIG91dCkKKyAqLworc3RhdGljIHZvaWQgdWRwNF9od2NzdW1fb3V0Z29pbmcoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBpbnQgbGVuICAgICAgKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisJX193c3VtIGNzdW0gPSAwOworCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za193cml0ZV9xdWV1ZSkgPT0gMSkgeworCQkvKgorCQkgKiBPbmx5IG9uZSBmcmFnbWVudCBvbiB0aGUgc29ja2V0LgorCQkgKi8KKwkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKKwkJdWgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNyYywgZHN0LCBsZW4sIElQUFJPVE9fVURQLCAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBIVy1jaGVja3N1bSB3b24ndCB3b3JrIGFzIHRoZXJlIGFyZSB0d28gb3IgbW9yZQorCQkgKiBmcmFnbWVudHMgb24gdGhlIHNvY2tldCBzbyB0aGF0IGFsbCBjc3VtcyBvZiBza19idWZmcworCQkgKiBzaG91bGQgYmUgdG9nZXRoZXIKKwkJICovCisJCW9mZnNldCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIG9mZnNldCwgc2tiLT5sZW4gLSBvZmZzZXQsIDApOworCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCQlza2JfcXVldWVfd2Fsaygmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpIHsKKwkJCWNzdW0gPSBjc3VtX2FkZChjc3VtLCBza2ItPmNzdW0pOworCQl9CisKKwkJdWgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoc3JjLCBkc3QsIGxlbiwgSVBQUk9UT19VRFAsIGNzdW0pOworCQlpZiAodWgtPmNoZWNrID09IDApCisJCQl1aC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKKwl9Cit9CisKIC8qCiAgKiBQdXNoIG91dCBhbGwgcGVuZGluZyBkYXRhIGFzIG9uZSBVRFAgZGF0YWdyYW0uIFNvY2tldCBpcyBsb2NrZWQuCiAgKi8KLXN0YXRpYyBpbnQgdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdWRwX3NvY2sgKnVwKQorc3RhdGljIGludCB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHVkcF9zb2NrICAqdXAgPSB1ZHBfc2soc2spOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgZmxvd2kgKmZsID0gJmluZXQtPmNvcmsuZmw7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgdWRwaGRyICp1aDsKIAlpbnQgZXJyID0gMDsKKwlfX3dzdW0gY3N1bSA9IDA7CiAKIAkvKiBHcmFiIHRoZSBza2J1ZmYgd2hlcmUgVURQIGhlYWRlciBzcGFjZSBleGlzdHMuICovCiAJaWYgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgPT0gTlVMTCkKQEAgLTQ0Myw1MiArNDcxLDI4IEBACiAJdWgtPmxlbiA9IGh0b25zKHVwLT5sZW4pOwogCXVoLT5jaGVjayA9IDA7CiAKLQlpZiAoc2stPnNrX25vX2NoZWNrID09IFVEUF9DU1VNX05PWE1JVCkgeworCWlmICh1cC0+cGNmbGFnKSAgCQkJCSAvKiAgICAgVURQLUxpdGUgICAgICAqLworCQljc3VtICA9IHVkcGxpdGVfY3N1bV9vdXRnb2luZyhzaywgc2tiKTsKKworCWVsc2UgaWYgKHNrLT5za19ub19jaGVjayA9PSBVRFBfQ1NVTV9OT1hNSVQpIHsgICAvKiBVRFAgY3N1bSBkaXNhYmxlZCAqLworCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJZ290byBzZW5kOwotCX0KIAotCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfd3JpdGVfcXVldWUpID09IDEpIHsKLQkJLyoKLQkJICogT25seSBvbmUgZnJhZ21lbnQgb24gdGhlIHNvY2tldC4KLQkJICovCi0JCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCQlza2ItPmNzdW0gPSBvZmZzZXRvZihzdHJ1Y3QgdWRwaGRyLCBjaGVjayk7Ci0JCQl1aC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoZmwtPmZsNF9zcmMsIGZsLT5mbDRfZHN0LAotCQkJCQl1cC0+bGVuLCBJUFBST1RPX1VEUCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlza2ItPmNzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKil1aCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBza2ItPmNzdW0pOwotCQkJdWgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoZmwtPmZsNF9zcmMsIGZsLT5mbDRfZHN0LAotCQkJCQl1cC0+bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtKTsKLQkJCWlmICh1aC0+Y2hlY2sgPT0gMCkKLQkJCQl1aC0+Y2hlY2sgPSAtMTsKLQkJfQotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBjc3VtID0gMDsKLQkJLyoKLQkJICogSFctY2hlY2tzdW0gd29uJ3Qgd29yayBhcyB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgCi0JCSAqIGZyYWdtZW50cyBvbiB0aGUgc29ja2V0IHNvIHRoYXQgYWxsIGNzdW1zIG9mIHNrX2J1ZmZzCi0JCSAqIHNob3VsZCBiZSB0b2dldGhlci4KLQkJICovCi0JCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIgKil1aCAtIHNrYi0+ZGF0YTsKLQkJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIG9mZnNldCwgc2tiLT5sZW4gLSBvZmZzZXQsIDApOworCX0gZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgeyAvKiBVRFAgaGFyZHdhcmUgY3N1bSAqLwogCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCX0gZWxzZSB7Ci0JCQlza2ItPmNzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKil1aCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBza2ItPmNzdW0pOwotCQl9CisJCXVkcDRfaHdjc3VtX291dGdvaW5nKHNrLCBza2IsIGZsLT5mbDRfc3JjLGZsLT5mbDRfZHN0LCB1cC0+bGVuKTsKKwkJZ290byBzZW5kOwogCi0JCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYikgewotCQkJY3N1bSA9IGNzdW1fYWRkKGNzdW0sIHNrYi0+Y3N1bSk7Ci0JCX0KLQkJdWgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoZmwtPmZsNF9zcmMsIGZsLT5mbDRfZHN0LAotCQkJCXVwLT5sZW4sIElQUFJPVE9fVURQLCBjc3VtKTsKLQkJaWYgKHVoLT5jaGVjayA9PSAwKQotCQkJdWgtPmNoZWNrID0gLTE7Ci0JfQorCX0gZWxzZQkJCQkJCSAvKiAgIGBub3JtYWwnIFVEUCAgICAqLworCQljc3VtID0gdWRwX2NzdW1fb3V0Z29pbmcoc2ssIHNrYik7CisKKwkvKiBhZGQgcHJvdG9jb2wtZGVwZW5kZW50IHBzZXVkby1oZWFkZXIgKi8KKwl1aC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsIHVwLT5sZW4sCisJCQkJICAgICAgc2stPnNrX3Byb3RvY29sLCBjc3VtICAgICAgICAgICAgICk7CisJaWYgKHVoLT5jaGVjayA9PSAwKQorCQl1aC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKKwogc2VuZDoKIAllcnIgPSBpcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIG91dDoKQEAgLTQ5NywxMiArNTAxLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB1ZHBfY2hlY2soc3RydWN0IHVkcGhkciAqdWgsIGludCBsZW4sIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBsb25nIGJhc2UpCi17Ci0JcmV0dXJuKGNzdW1fdGNwdWRwX21hZ2ljKHNhZGRyLCBkYWRkciwgbGVuLCBJUFBST1RPX1VEUCwgYmFzZSkpOwotfQotCiBpbnQgdWRwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKIAkJc2l6ZV90IGxlbikKIHsKQEAgLTUxNiw4ICs1MTQsOSBAQAogCV9fYmUzMiBkYWRkciwgZmFkZHIsIHNhZGRyOwogCV9fYmUxNiBkcG9ydDsKIAl1OCAgdG9zOwotCWludCBlcnI7CisJaW50IGVyciwgaXNfdWRwbGl0ZSA9IHVwLT5wY2ZsYWc7CiAJaW50IGNvcmtyZXEgPSB1cC0+Y29ya2ZsYWcgfHwgbXNnLT5tc2dfZmxhZ3MmTVNHX01PUkU7CisJaW50ICgqZ2V0ZnJhZykodm9pZCAqLCBjaGFyICosIGludCwgaW50LCBpbnQsIHN0cnVjdCBza19idWZmICopOwogCiAJaWYgKGxlbiA+IDB4RkZGRikKIAkJcmV0dXJuIC1FTVNHU0laRTsKQEAgLTYyMiw3ICs2MjEsNyBAQAogCQkJCQkgICAgICB7IC5kYWRkciA9IGZhZGRyLAogCQkJCQkJLnNhZGRyID0gc2FkZHIsCiAJCQkJCQkudG9zID0gdG9zIH0gfSwKLQkJCQkgICAgLnByb3RvID0gSVBQUk9UT19VRFAsCisJCQkJICAgIC5wcm90byA9IHNrLT5za19wcm90b2NvbCwKIAkJCQkgICAgLnVsaV91ID0geyAucG9ydHMgPQogCQkJCQkgICAgICAgeyAuc3BvcnQgPSBpbmV0LT5zcG9ydCwKIAkJCQkJCSAuZHBvcnQgPSBkcG9ydCB9IH0gfTsKQEAgLTY2OCwxMyArNjY3LDE0IEBACiAKIGRvX2FwcGVuZF9kYXRhOgogCXVwLT5sZW4gKz0gdWxlbjsKLQllcnIgPSBpcF9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIHVsZW4sIAotCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCAmaXBjLCBydCwgCisJZ2V0ZnJhZyAgPSAgaXNfdWRwbGl0ZSA/ICB1ZHBsaXRlX2dldGZyYWcgOiBpcF9nZW5lcmljX2dldGZyYWc7CisJZXJyID0gaXBfYXBwZW5kX2RhdGEoc2ssIGdldGZyYWcsIG1zZy0+bXNnX2lvdiwgdWxlbiwKKwkJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgJmlwYywgcnQsCiAJCQljb3JrcmVxID8gbXNnLT5tc2dfZmxhZ3N8TVNHX01PUkUgOiBtc2ctPm1zZ19mbGFncyk7CiAJaWYgKGVycikKIAkJdWRwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIAllbHNlIGlmICghY29ya3JlcSkKLQkJZXJyID0gdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHVwKTsKKwkJZXJyID0gdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogCWVsc2UgaWYgKHVubGlrZWx5KHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkpCiAJCXVwLT5wZW5kaW5nID0gMDsKIAlyZWxlYXNlX3NvY2soc2spOwpAQCAtNjg0LDcgKzY4NCw3IEBACiAJaWYgKGZyZWUpCiAJCWtmcmVlKGlwYy5vcHQpOwogCWlmICghZXJyKSB7Ci0JCVVEUF9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX09VVERBVEFHUkFNUyk7CisJCVVEUF9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX09VVERBVEFHUkFNUywgaXNfdWRwbGl0ZSk7CiAJCXJldHVybiBsZW47CiAJfQogCS8qCkBAIC02OTUsNyArNjk1LDcgQEAKIAkgKiBzZWVtcyBsaWtlIG92ZXJraWxsLgogCSAqLwogCWlmIChlcnIgPT0gLUVOT0JVRlMgfHwgdGVzdF9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpKSB7Ci0JCVVEUF9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX1NOREJVRkVSUk9SUyk7CisJCVVEUF9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX1NOREJVRkVSUk9SUywgaXNfdWRwbGl0ZSk7CiAJfQogCXJldHVybiBlcnI7CiAKQEAgLTcwNyw4ICs3MDcsOCBAQAogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50IHVkcF9zZW5kcGFnZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LAotCQkJc2l6ZV90IHNpemUsIGludCBmbGFncykKK2ludCB1ZHBfc2VuZHBhZ2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKKwkJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CiAJaW50IHJldDsKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCiAJdXAtPmxlbiArPSBzaXplOwogCWlmICghKHVwLT5jb3JrZmxhZyB8fCAoZmxhZ3MmTVNHX01PUkUpKSkKLQkJcmV0ID0gdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHVwKTsKKwkJcmV0ID0gdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogCWlmICghcmV0KQogCQlyZXQgPSBzaXplOwogb3V0OgpAQCAtNzk1LDI5ICs3OTUsMTggQEAKIAlyZXR1cm4oMCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBfX3VkcF9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdWRwX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCi0JCV9fdWRwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7Ci19Ci0KIC8qCiAgKiAJVGhpcyBzaG91bGQgYmUgZWFzeSwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIHdlCiAgKiAJcmV0dXJuIGl0LCBvdGhlcndpc2Ugd2UgYmxvY2suCiAgKi8KIAotc3RhdGljIGludCB1ZHBfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgICAgICAgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK2ludCB1ZHBfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCSAgICAgICAgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAgIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKiltc2ctPm1zZ19uYW1lOwogICAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLSAgCWludCBjb3BpZWQsIGVycjsKKwlpbnQgY29waWVkLCBlcnIsIGNvcHlfb25seSwgaXNfdWRwbGl0ZSA9IElTX1VEUExJVEUoc2spOwogCiAJLyoKIAkgKglDaGVjayBhbnkgcGFzc2VkIGFkZHJlc3NlcwpAQCAtODM5LDE1ICs4MjgsMjUgQEAKIAkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOwogCX0KIAotCWlmIChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKLQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksIG1zZy0+bXNnX2lvdiwKLQkJCQkJICAgICAgY29waWVkKTsKLQl9IGVsc2UgaWYgKG1zZy0+bXNnX2ZsYWdzJk1TR19UUlVOQykgewotCQlpZiAoX191ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwkvKgorCSAqIAlEZWNpZGUgd2hldGhlciB0byBjaGVja3N1bSBhbmQvb3IgY29weSBkYXRhLgorCSAqCisJICogCVVEUDogICAgICBjaGVja3N1bSBtYXkgaGF2ZSBiZWVuIGNvbXB1dGVkIGluIEhXLAorCSAqIAkgICAgICAgICAgKHJlLSljb21wdXRlIGl0IGlmIG1lc3NhZ2UgaXMgdHJ1bmNhdGVkLgorCSAqIAlVRFAtTGl0ZTogYWx3YXlzIG5lZWRzIHRvIGNoZWNrc3VtLCBubyBIVyBzdXBwb3J0LgorCSAqLworCWNvcHlfb25seSA9IChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpOworCisJaWYgKGlzX3VkcGxpdGUgIHx8ICAoIWNvcHlfb25seSAgJiYgIG1zZy0+bXNnX2ZsYWdzJk1TR19UUlVOQykpIHsKKwkJaWYgKF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQogCQkJZ290byBjc3VtX2NvcHlfZXJyOwotCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92LAotCQkJCQkgICAgICBjb3BpZWQpOwotCX0gZWxzZSB7CisJCWNvcHlfb25seSA9IDE7CisJfQorCisJaWYgKGNvcHlfb25seSkKKwkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCisJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29waWVkICAgICAgICk7CisJZWxzZSB7CiAJCWVyciA9IHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBtc2ctPm1zZ19pb3YpOwogCiAJCWlmIChlcnIgPT0gLUVJTlZBTCkKQEAgLTg4MCw3ICs4NzksNyBAQAogICAJcmV0dXJuIGVycjsKIAogY3N1bV9jb3B5X2VycjoKLQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOworCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgaXNfdWRwbGl0ZSk7CiAKIAlza2Jfa2lsbF9kYXRhZ3JhbShzaywgc2tiLCBmbGFncyk7CiAKQEAgLTkxMiwxMSArOTExLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdWRwX2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KQotewotCXNrX2NvbW1vbl9yZWxlYXNlKHNrKTsKLX0KLQogLyogcmV0dXJuOgogICogCTEgIGlmIHRoZSB0aGUgVURQIHN5c3RlbSBzaG91bGQgcHJvY2VzcyBpdAogICoJMCAgaWYgd2Ugc2hvdWxkIGRyb3AgdGhpcyBwYWNrZXQKQEAgLTkyOCwyMyArOTIyLDMyIEBACiAJcmV0dXJuIDE7IAogI2Vsc2UKIAlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKLSAgCXN0cnVjdCB1ZHBoZHIgKnVoID0gc2tiLT5oLnVoOworICAJc3RydWN0IHVkcGhkciAqdWg7CiAJc3RydWN0IGlwaGRyICppcGg7CiAJaW50IGlwaGxlbiwgbGVuOwogICAKLQlfX3U4ICp1ZHBkYXRhID0gKF9fdTggKil1aCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlfX2JlMzIgKnVkcGRhdGEzMiA9IChfX2JlMzIgKil1ZHBkYXRhOworCV9fdTggKnVkcGRhdGE7CisJX19iZTMyICp1ZHBkYXRhMzI7CiAJX191MTYgZW5jYXBfdHlwZSA9IHVwLT5lbmNhcF90eXBlOwogCiAJLyogaWYgd2UncmUgb3Zlcmx5IHNob3J0LCBsZXQgVURQIGhhbmRsZSBpdCAqLwotCWlmICh1ZHBkYXRhID4gc2tiLT50YWlsKQorCWxlbiA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWlmIChsZW4gPD0gMCkKIAkJcmV0dXJuIDE7CiAKIAkvKiBpZiB0aGlzIGlzIG5vdCBlbmNhcHN1bGF0ZWQgc29ja2V0LCB0aGVuIGp1c3QgcmV0dXJuIG5vdyAqLwogCWlmICghZW5jYXBfdHlwZSkKIAkJcmV0dXJuIDE7CiAKLQlsZW4gPSBza2ItPnRhaWwgLSB1ZHBkYXRhOworCS8qIElmIHRoaXMgaXMgYSBwYWdlZCBza2IsIG1ha2Ugc3VyZSB3ZSBwdWxsIHVwCisJICogd2hhdGV2ZXIgZGF0YSB3ZSBuZWVkIHRvIGxvb2sgYXQuICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgbWluKGxlbiwgOCkpKQorCQlyZXR1cm4gMTsKKworCS8qIE5vdyB3ZSBjYW4gZ2V0IHRoZSBwb2ludGVycyAqLworCXVoID0gc2tiLT5oLnVoOworCXVkcGRhdGEgPSAoX191OCAqKXVoICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCXVkcGRhdGEzMiA9IChfX2JlMzIgKil1ZHBkYXRhOwogCiAJc3dpdGNoIChlbmNhcF90eXBlKSB7CiAJZGVmYXVsdDoKQEAgLTEwMTMsNyArMTAxNiw3IEBACiAgKiBOb3RlIHRoYXQgaW4gdGhlIHN1Y2Nlc3MgYW5kIGVycm9yIGNhc2VzLCB0aGUgc2tiIGlzIGFzc3VtZWQgdG8KICAqIGhhdmUgZWl0aGVyIGJlZW4gcmVxdWV1ZWQgb3IgZnJlZWQuCiAgKi8KLXN0YXRpYyBpbnQgdWRwX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKiBzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCB1ZHBfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwogCWludCByYzsKQEAgLTEwMjEsMTAgKzEwMjQsOCBAQAogCS8qCiAJICoJQ2hhcmdlIGl0IHRvIHRoZSBzb2NrZXQsIGRyb3BwaW5nIGlmIHRoZSBxdWV1ZSBpcyBmdWxsLgogCSAqLwotCWlmICgheGZybTRfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhzaywgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCisJCWdvdG8gZHJvcDsKIAluZl9yZXNldChza2IpOwogCiAJaWYgKHVwLT5lbmNhcF90eXBlKSB7CkBAIC0xMDQ4LDMxICsxMDQ5LDY4IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQkvKiBwcm9jZXNzIHRoZSBFU1AgcGFja2V0ICovCiAJCQlyZXQgPSB4ZnJtNF9yY3ZfZW5jYXAoc2tiLCB1cC0+ZW5jYXBfdHlwZSk7Ci0JCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5EQVRBR1JBTVMpOworCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lOREFUQUdSQU1TLCB1cC0+cGNmbGFnKTsKIAkJCXJldHVybiAtcmV0OwogCQl9CiAJCS8qIEZBTExUSFJPVUdIIC0tIGl0J3MgYSBVRFAgUGFja2V0ICovCiAJfQogCi0JaWYgKHNrLT5za19maWx0ZXIgJiYgc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKLQkJaWYgKF9fdWRwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKLQkJCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybiAtMTsKKwkvKgorCSAqIAlVRFAtTGl0ZSBzcGVjaWZpYyB0ZXN0cywgaWdub3JlZCBvbiBVRFAgc29ja2V0cworCSAqLworCWlmICgodXAtPnBjZmxhZyAmIFVEUExJVEVfUkVDVl9DQykgICYmICBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KSB7CisKKwkJLyoKKwkJICogTUlCIHN0YXRpc3RpY3Mgb3RoZXIgdGhhbiBpbmNyZW1lbnRpbmcgdGhlIGVycm9yIGNvdW50IGFyZQorCQkgKiBkaXNhYmxlZCBmb3IgdGhlIGZvbGxvd2luZyB0d28gdHlwZXMgb2YgZXJyb3JzOiB0aGVzZSBkZXBlbmQKKwkJICogb24gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLCBub3Qgb24gdGhlIGZ1bmN0aW9uaW5nIG9mIHRoZQorCQkgKiBwcm90b2NvbCBzdGFjayBhcyBzdWNoLgorCQkgKgorCQkgKiBSRkMgMzgyOCBoZXJlIHJlY29tbWVuZHMgKHNlYyAzLjMpOiAiVGhlcmUgc2hvdWxkIGFsc28gYmUgYQorCQkgKiB3YXkgLi4uIHRvIC4uLiBhdCBsZWFzdCBsZXQgdGhlIHJlY2VpdmluZyBhcHBsaWNhdGlvbiBibG9jaworCQkgKiBkZWxpdmVyeSBvZiBwYWNrZXRzIHdpdGggY292ZXJhZ2UgdmFsdWVzIGxlc3MgdGhhbiBhIHZhbHVlCisJCSAqIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4iCisJCSAqLworCQlpZiAodXAtPnBjcmxlbiA9PSAwKSB7ICAgICAgICAgIC8qIGZ1bGwgY292ZXJhZ2Ugd2FzIHNldCAgKi8KKwkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiVURQTElURTogcGFydGlhbCBjb3ZlcmFnZSAiCisJCQkJIiVkIHdoaWxlIGZ1bGwgY292ZXJhZ2UgJWQgcmVxdWVzdGVkXG4iLAorCQkJCVVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YsIHNrYi0+bGVuKTsKKwkJCWdvdG8gZHJvcDsKIAkJfQorCQkvKiBUaGUgbmV4dCBjYXNlIGludm9sdmVzIHZpb2xhdGluZyB0aGUgbWluLiBjb3ZlcmFnZSByZXF1ZXN0ZWQKKwkJICogYnkgdGhlIHJlY2VpdmVyLiBUaGlzIGlzIHN1YnRsZTogaWYgcmVjZWl2ZXIgd2FudHMgeCBhbmQgeCBpcworCQkgKiBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlcnNpemUvTVRVIHRoZW4gcmVjZWl2ZXIgd2lsbCBjb21wbGFpbgorCQkgKiB0aGF0IGl0IHdhbnRzIHggd2hpbGUgc2VuZGVyIGVtaXRzIHBhY2tldHMgb2Ygc21hbGxlciBzaXplIHkuCisJCSAqIFRoZXJlZm9yZSB0aGUgYWJvdmUgLi4uKCktPnBhcnRpYWxfY292IHN0YXRlbWVudCBpcyBlc3NlbnRpYWwuCisJCSAqLworCQlpZiAoVURQX1NLQl9DQihza2IpLT5jc2NvdiAgPCAgdXAtPnBjcmxlbikgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HCisJCQkJIlVEUExJVEU6IGNvdmVyYWdlICVkIHRvbyBzbWFsbCwgbmVlZCBtaW4gJWRcbiIsCisJCQkJVURQX1NLQl9DQihza2IpLT5jc2NvdiwgdXAtPnBjcmxlbik7CisJCQlnb3RvIGRyb3A7CisJCX0KKwl9CisKKwlpZiAoc2stPnNrX2ZpbHRlciAmJiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQlpZiAoX191ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCQlnb3RvIGRyb3A7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQogCiAJaWYgKChyYyA9IHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpKSA8IDApIHsKIAkJLyogTm90ZSB0aGF0IGFuIEVOT01FTSBlcnJvciBpcyBjaGFyZ2VkIHR3aWNlICovCiAJCWlmIChyYyA9PSAtRU5PTUVNKQotCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX1JDVkJVRkVSUk9SUyk7Ci0JCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gLTE7CisJCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfUkNWQlVGRVJST1JTLCB1cC0+cGNmbGFnKTsKKwkJZ290byBkcm9wOwogCX0KLQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5EQVRBR1JBTVMpOworCisJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lOREFUQUdSQU1TLCB1cC0+cGNmbGFnKTsKIAlyZXR1cm4gMDsKKworZHJvcDoKKwlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIHVwLT5wY2ZsYWcpOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtMTsKIH0KIAogLyoKQEAgLTEwODEsMTQgKzExMTksMTYgQEAKICAqCU5vdGU6IGNhbGxlZCBvbmx5IGZyb20gdGhlIEJIIGhhbmRsZXIgY29udGV4dCwKICAqCXNvIHdlIGRvbid0IG5lZWQgdG8gbG9jayB0aGUgaGFzaGVzLgogICovCi1zdGF0aWMgaW50IHVkcF92NF9tY2FzdF9kZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoLAotCQkJCSBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkcikKK3N0YXRpYyBpbnQgX191ZHA0X2xpYl9tY2FzdF9kZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCB1ZHBoZHIgICp1aCwKKwkJCQkgICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJICAgIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCWludCBkaWY7CiAKIAlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOwotCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbbnRvaHModWgtPmRlc3QpICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7CisJc2sgPSBza19oZWFkKCZ1ZHB0YWJsZVtudG9ocyh1aC0+ZGVzdCkgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKTsKIAlkaWYgPSBza2ItPmRldi0+aWZpbmRleDsKIAlzayA9IHVkcF92NF9tY2FzdF9uZXh0KHNrLCB1aC0+ZGVzdCwgZGFkZHIsIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOwogCWlmIChzaykgewpAQCAtMTEyMiw2NSArMTE2Miw3NSBAQAogICogT3RoZXJ3aXNlLCBjc3VtIGNvbXBsZXRpb24gcmVxdWlyZXMgY2hhY2tzdW1taW5nIHBhY2tldCBib2R5LAogICogaW5jbHVkaW5nIHVkcCBoZWFkZXIgYW5kIGZvbGRpbmcgaXQgdG8gc2tiLT5jc3VtLgogICovCi1zdGF0aWMgdm9pZCB1ZHBfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKLQkJCSAgICAgdW5zaWduZWQgc2hvcnQgdWxlbiwgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgdWRwNF9jc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgpCiB7CiAJaWYgKHVoLT5jaGVjayA9PSAwKSB7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlpZiAoIXVkcF9jaGVjayh1aCwgdWxlbiwgc2FkZHIsIGRhZGRyLCBza2ItPmNzdW0pKQorCSAgICAgICBpZiAoIWNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtICAgICAgICkpCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChzYWRkciwgZGFkZHIsIHVsZW4sIElQUFJPVE9fVURQLCAwKTsKKwkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgMCk7CiAJLyogUHJvYmFibHksIHdlIHNob3VsZCBjaGVja3N1bSB1ZHAgaGVhZGVyIChpdCBzaG91bGQgYmUgaW4gY2FjaGUKIAkgKiBpbiBhbnkgY2FzZSkgYW5kIGRhdGEgaW4gdGlueSBwYWNrZXRzICg8IHJ4IGNvcHlicmVhaykuCiAJICovCisKKwkvKiBVRFAgPSBVRFAtTGl0ZSB3aXRoIGEgbm9uLXBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKi8KKwlVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKIH0KIAogLyoKICAqCUFsbCB3ZSBuZWVkIHRvIGRvIGlzIGdldCB0aGUgc29ja2V0LCBhbmQgdGhlbiBkbyBhIGNoZWNrc3VtLiAKICAqLwogIAotaW50IHVkcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBfX3VkcDRfbGliX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLAorCQkgICBpbnQgaXNfdWRwbGl0ZSkKIHsKICAgCXN0cnVjdCBzb2NrICpzazsKLSAgCXN0cnVjdCB1ZHBoZHIgKnVoOworICAJc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CiAJdW5zaWduZWQgc2hvcnQgdWxlbjsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKIAlfX2JlMzIgc2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CiAJX19iZTMyIGRhZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyOwotCWludCBsZW4gPSBza2ItPmxlbjsKIAogCS8qCi0JICoJVmFsaWRhdGUgdGhlIHBhY2tldCBhbmQgdGhlIFVEUCBsZW5ndGguCisJICogIFZhbGlkYXRlIHRoZSBwYWNrZXQuCiAJICovCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKSkKLQkJZ290byBub19oZWFkZXI7Ci0KLQl1aCA9IHNrYi0+aC51aDsKKwkJZ290byBkcm9wOwkJLyogTm8gc3BhY2UgZm9yIGhlYWRlci4gKi8KIAogCXVsZW4gPSBudG9ocyh1aC0+bGVuKTsKLQotCWlmICh1bGVuID4gbGVuIHx8IHVsZW4gPCBzaXplb2YoKnVoKSkKKwlpZiAodWxlbiA+IHNrYi0+bGVuKQogCQlnb3RvIHNob3J0X3BhY2tldDsKIAotCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCB1bGVuKSkKLQkJZ290byBzaG9ydF9wYWNrZXQ7CisJaWYoISBpc191ZHBsaXRlICkgewkJLyogVURQIHZhbGlkYXRlcyB1bGVuLiAqLwogCi0JdWRwX2NoZWNrc3VtX2luaXQoc2tiLCB1aCwgdWxlbiwgc2FkZHIsIGRhZGRyKTsKKwkJaWYgKHVsZW4gPCBzaXplb2YoKnVoKSB8fCBwc2tiX3RyaW1fcmNzdW0oc2tiLCB1bGVuKSkKKwkJCWdvdG8gc2hvcnRfcGFja2V0OworCisJCXVkcDRfY3N1bV9pbml0KHNrYiwgdWgpOworCisJfSBlbHNlIAl7CQkJLyogVURQLUxpdGUgdmFsaWRhdGVzIGNzY292LiAqLworCQlpZiAodWRwbGl0ZTRfY3N1bV9pbml0KHNrYiwgdWgpKQorCQkJZ290byBjc3VtX2Vycm9yOworCX0KIAogCWlmKHJ0LT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVHxSVENGX01VTFRJQ0FTVCkpCi0JCXJldHVybiB1ZHBfdjRfbWNhc3RfZGVsaXZlcihza2IsIHVoLCBzYWRkciwgZGFkZHIpOworCQlyZXR1cm4gX191ZHA0X2xpYl9tY2FzdF9kZWxpdmVyKHNrYiwgdWgsIHNhZGRyLCBkYWRkciwgdWRwdGFibGUpOwogCi0Jc2sgPSB1ZHBfdjRfbG9va3VwKHNhZGRyLCB1aC0+c291cmNlLCBkYWRkciwgdWgtPmRlc3QsIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwlzayA9IF9fdWRwNF9saWJfbG9va3VwKHNhZGRyLCB1aC0+c291cmNlLCBkYWRkciwgdWgtPmRlc3QsCisJCQkgICAgICAgc2tiLT5kZXYtPmlmaW5kZXgsIHVkcHRhYmxlICAgICAgICApOwogCiAJaWYgKHNrICE9IE5VTEwpIHsKIAkJaW50IHJldCA9IHVkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwogCQlzb2NrX3B1dChzayk7CiAKIAkJLyogYSByZXR1cm4gdmFsdWUgPiAwIG1lYW5zIHRvIHJlc3VibWl0IHRoZSBpbnB1dCwgYnV0Ci0JCSAqIGl0IGl0IHdhbnRzIHRoZSByZXR1cm4gdG8gYmUgLXByb3RvY29sLCBvciAwCisJCSAqIGl0IHdhbnRzIHRoZSByZXR1cm4gdG8gYmUgLXByb3RvY29sLCBvciAwCiAJCSAqLwogCQlpZiAocmV0ID4gMCkKIAkJCXJldHVybiAtcmV0OwpAQCAtMTE5MiwxMCArMTI0MiwxMCBAQAogCW5mX3Jlc2V0KHNrYik7CiAKIAkvKiBObyBzb2NrZXQuIERyb3AgcGFja2V0IHNpbGVudGx5LCBpZiBjaGVja3N1bSBpcyB3cm9uZyAqLwotCWlmICh1ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwlpZiAodWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQogCQlnb3RvIGNzdW1fZXJyb3I7CiAKLQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfTk9QT1JUUyk7CisJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX05PUE9SVFMsIGlzX3VkcGxpdGUpOwogCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX1BPUlRfVU5SRUFDSCwgMCk7CiAKIAkvKgpAQCAtMTIwNiwzNiArMTI1Niw0MCBAQAogCXJldHVybigwKTsKIAogc2hvcnRfcGFja2V0OgotCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUDogc2hvcnQgcGFja2V0OiBGcm9tICV1LiV1LiV1LiV1OiV1ICVkLyVkIHRvICV1LiV1LiV1LiV1OiV1XG4iLAorCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUCVzOiBzaG9ydCBwYWNrZXQ6IEZyb20gJXUuJXUuJXUuJXU6JXUgJWQvJWQgdG8gJXUuJXUuJXUuJXU6JXVcbiIsCisJCSAgICAgICBpc191ZHBsaXRlPyAiLUxpdGUiIDogIiIsCiAJCSAgICAgICBOSVBRVUFEKHNhZGRyKSwKIAkJICAgICAgIG50b2hzKHVoLT5zb3VyY2UpLAogCQkgICAgICAgdWxlbiwKLQkJICAgICAgIGxlbiwKKwkJICAgICAgIHNrYi0+bGVuLAogCQkgICAgICAgTklQUVVBRChkYWRkciksCiAJCSAgICAgICBudG9ocyh1aC0+ZGVzdCkpOwotbm9faGVhZGVyOgotCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuKDApOworCWdvdG8gZHJvcDsKIAogY3N1bV9lcnJvcjoKIAkvKiAKIAkgKiBSRkMxMTIyOiBPSy4gIERpc2NhcmRzIHRoZSBiYWQgcGFja2V0IHNpbGVudGx5IChhcyBmYXIgYXMgCiAJICogdGhlIG5ldHdvcmsgaXMgY29uY2VybmVkLCBhbnl3YXkpIGFzIHBlciA0LjEuMy40IChNVVNUKS4gCiAJICovCi0JTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiVURQOiBiYWQgY2hlY2tzdW0uIEZyb20gJWQuJWQuJWQuJWQ6JWQgdG8gJWQuJWQuJWQuJWQ6JWQgdWxlbiAlZFxuIiwKKwlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFAlczogYmFkIGNoZWNrc3VtLiBGcm9tICVkLiVkLiVkLiVkOiVkIHRvICVkLiVkLiVkLiVkOiVkIHVsZW4gJWRcbiIsCisJCSAgICAgICBpc191ZHBsaXRlPyAiLUxpdGUiIDogIiIsCiAJCSAgICAgICBOSVBRVUFEKHNhZGRyKSwKIAkJICAgICAgIG50b2hzKHVoLT5zb3VyY2UpLAogCQkgICAgICAgTklQUVVBRChkYWRkciksCiAJCSAgICAgICBudG9ocyh1aC0+ZGVzdCksCiAJCSAgICAgICB1bGVuKTsKIGRyb3A6Ci0JVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKKwlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIGlzX3VkcGxpdGUpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybigwKTsKIH0KIAotc3RhdGljIGludCB1ZHBfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK19faW5saW5lX18gaW50IHVkcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gX191ZHA0X2xpYl9yY3Yoc2tiLCB1ZHBfaGFzaCwgMCk7Cit9CisKK2ludCB1ZHBfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKIHsKIAlsb2NrX3NvY2soc2spOwogCXVkcF9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CkBAIC0xMjQ2LDggKzEzMDAsOSBAQAogLyoKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVURQCiAgKi8KLXN0YXRpYyBpbnQgZG9fdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoraW50IHVkcF9saWJfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuLAorCQkgICAgICAgaW50ICgqcHVzaF9wZW5kaW5nX2ZyYW1lcykoc3RydWN0IHNvY2sgKikpCiB7CiAJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CiAJaW50IHZhbDsKQEAgLTEyNjYsNyArMTMyMSw3IEBACiAJCX0gZWxzZSB7CiAJCQl1cC0+Y29ya2ZsYWcgPSAwOwogCQkJbG9ja19zb2NrKHNrKTsKLQkJCXVkcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB1cCk7CisJCQkoKnB1c2hfcGVuZGluZ19mcmFtZXMpKHNrKTsKIAkJCXJlbGVhc2Vfc29jayhzayk7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMjg0LDYgKzEzMzksMzIgQEAKIAkJfQogCQlicmVhazsKIAorCS8qCisJICogCVVEUC1MaXRlJ3MgcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSAoUkZDIDM4MjgpLgorCSAqLworCS8qIFRoZSBzZW5kZXIgc2V0cyBhY3R1YWwgY2hlY2tzdW0gY292ZXJhZ2UgbGVuZ3RoIHZpYSB0aGlzIG9wdGlvbi4KKwkgKiBUaGUgY2FzZSBjb3ZlcmFnZSA+IHBhY2tldCBsZW5ndGggaXMgaGFuZGxlZCBieSBzZW5kIG1vZHVsZS4gKi8KKwljYXNlIFVEUExJVEVfU0VORF9DU0NPVjoKKwkJaWYgKCF1cC0+cGNmbGFnKSAgICAgICAgIC8qIERpc2FibGUgdGhlIG9wdGlvbiBvbiBVRFAgc29ja2V0cyAqLworCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwkJaWYgKHZhbCAhPSAwICYmIHZhbCA8IDgpIC8qIElsbGVnYWwgY292ZXJhZ2U6IHVzZSBkZWZhdWx0ICg4KSAqLworCQkJdmFsID0gODsKKwkJdXAtPnBjc2xlbiA9IHZhbDsKKwkJdXAtPnBjZmxhZyB8PSBVRFBMSVRFX1NFTkRfQ0M7CisJCWJyZWFrOworCisgICAgICAgIC8qIFRoZSByZWNlaXZlciBzcGVjaWZpZXMgYSBtaW5pbXVtIGNoZWNrc3VtIGNvdmVyYWdlIHZhbHVlLiBUbyBtYWtlCisgICAgICAgICAqIHNlbnNlLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gYXQgbGVhc3QgOCAoYXMgZG9uZSBiZWxvdykuIElmIHplcm8gaXMKKwkgKiB1c2VkLCB0aGlzIGFnYWluIG1lYW5zIGZ1bGwgY2hlY2tzdW0gY292ZXJhZ2UuICAgICAgICAgICAgICAgICAgICAgKi8KKwljYXNlIFVEUExJVEVfUkVDVl9DU0NPVjoKKwkJaWYgKCF1cC0+cGNmbGFnKSAgICAgICAgIC8qIERpc2FibGUgdGhlIG9wdGlvbiBvbiBVRFAgc29ja2V0cyAqLworCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwkJaWYgKHZhbCAhPSAwICYmIHZhbCA8IDgpIC8qIEF2b2lkIHNpbGx5IG1pbmltYWwgdmFsdWVzLiAgICAgICAqLworCQkJdmFsID0gODsKKwkJdXAtPnBjcmxlbiA9IHZhbDsKKwkJdXAtPnBjZmxhZyB8PSBVRFBMSVRFX1JFQ1ZfQ0M7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKQEAgLTEyOTIsMjYgKzEzNzMsMjggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHVkcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK2ludCB1ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCiB7Ci0JaWYgKGxldmVsICE9IFNPTF9VRFApCi0JCXJldHVybiBpcF9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHBfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1VEUCAgfHwgIGxldmVsID09IFNPTF9VRFBMSVRFKQorCQlyZXR1cm4gdWRwX2xpYl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4sCisJCQkJCSAgdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMpOworCXJldHVybiBpcF9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGludCBjb21wYXRfdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoraW50IGNvbXBhdF91ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCiB7Ci0JaWYgKGxldmVsICE9IFNPTF9VRFApCi0JCXJldHVybiBjb21wYXRfaXBfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKLQlyZXR1cm4gZG9fdWRwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJaWYgKGxldmVsID09IFNPTF9VRFAgIHx8ICBsZXZlbCA9PSBTT0xfVURQTElURSkKKwkJcmV0dXJuIHVkcF9saWJfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuLAorCQkJCQkgIHVkcF9wdXNoX3BlbmRpbmdfZnJhbWVzKTsKKwlyZXR1cm4gY29tcGF0X2lwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBkb191ZHBfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK2ludCB1ZHBfbGliX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewogCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwogCWludCB2YWwsIGxlbjsKQEAgLTEzMzMsNiArMTQxNiwxNiBAQAogCQl2YWwgPSB1cC0+ZW5jYXBfdHlwZTsKIAkJYnJlYWs7CiAKKwkvKiBUaGUgZm9sbG93aW5nIHR3byBjYW5ub3QgYmUgY2hhbmdlZCBvbiBVRFAgc29ja2V0cywgdGhlIHJldHVybiBpcworCSAqIGFsd2F5cyAwICh3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZnVsbCBjaGVja3N1bSBjb3ZlcmFnZSBvZiBVRFApLiAqLworCWNhc2UgVURQTElURV9TRU5EX0NTQ09WOgorCQl2YWwgPSB1cC0+cGNzbGVuOworCQlicmVhazsKKworCWNhc2UgVURQTElURV9SRUNWX0NTQ09WOgorCQl2YWwgPSB1cC0+cGNybGVuOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfTsKQEAgLTEzNDQsMjEgKzE0MzcsMjEgQEAKICAgCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoraW50IHVkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gaXBfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKLQlyZXR1cm4gZG9fdWRwX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJaWYgKGxldmVsID09IFNPTF9VRFAgIHx8ICBsZXZlbCA9PSBTT0xfVURQTElURSkKKwkJcmV0dXJuIHVkcF9saWJfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlyZXR1cm4gaXBfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgY29tcGF0X3VkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKK2ludCBjb21wYXRfdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCiB7Ci0JaWYgKGxldmVsICE9IFNPTF9VRFApCi0JCXJldHVybiBjb21wYXRfaXBfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKLQlyZXR1cm4gZG9fdWRwX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJaWYgKGxldmVsID09IFNPTF9VRFAgIHx8ICBsZXZlbCA9PSBTT0xfVURQTElURSkKKwkJcmV0dXJuIHVkcF9saWJfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlyZXR1cm4gY29tcGF0X2lwX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKIC8qKgpAQCAtMTM3OCw3ICsxNDcxLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IGRhdGFncmFtX3BvbGwoZmlsZSwgc29jaywgd2FpdCk7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7Ci0JCisJaW50IAlpc19saXRlID0gSVNfVURQTElURShzayk7CisKIAkvKiBDaGVjayBmb3IgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byBjaGVja3N1bSBlcnJvcnMgKi8KIAlpZiAoIChtYXNrICYgUE9MTFJETk9STSkgJiYKIAkgICAgICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmCkBAIC0xMzg4LDggKzE0ODIsOCBAQAogCiAJCXNwaW5fbG9ja19iaCgmcmN2cS0+bG9jayk7CiAJCXdoaWxlICgoc2tiID0gc2tiX3BlZWsocmN2cSkpICE9IE5VTEwpIHsKLQkJCWlmICh1ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQkJCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisJCQlpZiAodWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CisJCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTLCBpc19saXRlKTsKIAkJCQlfX3NrYl91bmxpbmsoc2tiLCByY3ZxKTsKIAkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCX0gZWxzZSB7CkBAIC0xNDExLDcgKzE1MDUsNyBAQAogc3RydWN0IHByb3RvIHVkcF9wcm90ID0gewogIAkubmFtZQkJICAgPSAiVURQIiwKIAkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCi0JLmNsb3NlCQkgICA9IHVkcF9jbG9zZSwKKwkuY2xvc2UJCSAgID0gdWRwX2xpYl9jbG9zZSwKIAkuY29ubmVjdAkgICA9IGlwNF9kYXRhZ3JhbV9jb25uZWN0LAogCS5kaXNjb25uZWN0CSAgID0gdWRwX2Rpc2Nvbm5lY3QsCiAJLmlvY3RsCQkgICA9IHVkcF9pb2N0bCwKQEAgLTE0MjIsOCArMTUxNiw4IEBACiAJLnJlY3Ztc2cJICAgPSB1ZHBfcmVjdm1zZywKIAkuc2VuZHBhZ2UJICAgPSB1ZHBfc2VuZHBhZ2UsCiAJLmJhY2tsb2dfcmN2CSAgID0gdWRwX3F1ZXVlX3Jjdl9za2IsCi0JLmhhc2gJCSAgID0gdWRwX3Y0X2hhc2gsCi0JLnVuaGFzaAkJICAgPSB1ZHBfdjRfdW5oYXNoLAorCS5oYXNoCQkgICA9IHVkcF9saWJfaGFzaCwKKwkudW5oYXNoCQkgICA9IHVkcF9saWJfdW5oYXNoLAogCS5nZXRfcG9ydAkgICA9IHVkcF92NF9nZXRfcG9ydCwKIAkub2JqX3NpemUJICAgPSBzaXplb2Yoc3RydWN0IHVkcF9zb2NrKSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0xNDQyLDcgKzE1MzYsNyBAQAogCiAJZm9yIChzdGF0ZS0+YnVja2V0ID0gMDsgc3RhdGUtPmJ1Y2tldCA8IFVEUF9IVEFCTEVfU0laRTsgKytzdGF0ZS0+YnVja2V0KSB7CiAJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCQlza19mb3JfZWFjaChzaywgbm9kZSwgJnVkcF9oYXNoW3N0YXRlLT5idWNrZXRdKSB7CisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCBzdGF0ZS0+aGFzaHRhYmxlICsgc3RhdGUtPmJ1Y2tldCkgewogCQkJaWYgKHNrLT5za19mYW1pbHkgPT0gc3RhdGUtPmZhbWlseSkKIAkJCQlnb3RvIGZvdW5kOwogCQl9CkBAIC0xNDYzLDcgKzE1NTcsNyBAQAogCX0gd2hpbGUgKHNrICYmIHNrLT5za19mYW1pbHkgIT0gc3RhdGUtPmZhbWlseSk7CiAKIAlpZiAoIXNrICYmICsrc3RhdGUtPmJ1Y2tldCA8IFVEUF9IVEFCTEVfU0laRSkgewotCQlzayA9IHNrX2hlYWQoJnVkcF9oYXNoW3N0YXRlLT5idWNrZXRdKTsKKwkJc2sgPSBza19oZWFkKHN0YXRlLT5oYXNodGFibGUgKyBzdGF0ZS0+YnVja2V0KTsKIAkJZ290byB0cnlfYWdhaW47CiAJfQogCXJldHVybiBzazsKQEAgLTE1MTMsNiArMTYwNyw3IEBACiAJaWYgKCFzKQogCQlnb3RvIG91dDsKIAlzLT5mYW1pbHkJCT0gYWZpbmZvLT5mYW1pbHk7CisJcy0+aGFzaHRhYmxlCQk9IGFmaW5mby0+aGFzaHRhYmxlOwogCXMtPnNlcV9vcHMuc3RhcnQJPSB1ZHBfc2VxX3N0YXJ0OwogCXMtPnNlcV9vcHMubmV4dAkJPSB1ZHBfc2VxX25leHQ7CiAJcy0+c2VxX29wcy5zaG93CQk9IGFmaW5mby0+c2VxX3Nob3c7CkBAIC0xNTc5LDcgKzE2NzQsNyBAQAogCQlhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwKTsKIH0KIAotc3RhdGljIGludCB1ZHA0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoraW50IHVkcDRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwKQEAgLTE2MDIsNiArMTY5Nyw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJ1ZHAiLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkuaGFzaHRhYmxlCT0gdWRwX2hhc2gsCiAJLnNlcV9zaG93CT0gdWRwNF9zZXFfc2hvdywKIAkuc2VxX2ZvcHMJPSAmdWRwNF9zZXFfZm9wcywKIH07CkBAIC0xNjI0LDYgKzE3MjAsOCBAQAogRVhQT1JUX1NZTUJPTCh1ZHBfZ2V0X3BvcnQpOwogRVhQT1JUX1NZTUJPTCh1ZHBfcHJvdCk7CiBFWFBPUlRfU1lNQk9MKHVkcF9zZW5kbXNnKTsKK0VYUE9SVF9TWU1CT0wodWRwX2xpYl9nZXRzb2Nrb3B0KTsKK0VYUE9SVF9TWU1CT0wodWRwX2xpYl9zZXRzb2Nrb3B0KTsKIEVYUE9SVF9TWU1CT0wodWRwX3BvbGwpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9pbXBsLmggYi9uZXQvaXB2NC91ZHBfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC91ZHBfaW1wbC5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX1VEUDRfSU1QTF9ICisjZGVmaW5lIF9VRFA0X0lNUExfSAorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwbGl0ZS5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorCitleHRlcm4gaW50ICAJX191ZHA0X2xpYl9yY3Yoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGhsaXN0X2hlYWQgW10sIGludCApOworZXh0ZXJuIHZvaWQgCV9fdWRwNF9saWJfZXJyKHN0cnVjdCBza19idWZmICosIHUzMiwgc3RydWN0IGhsaXN0X2hlYWQgW10pOworCitleHRlcm4gaW50CV9fdWRwX2xpYl9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0sCisJCQkJICAgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSwgaW50ICpwb3J0X3JvdmVyLAorCQkgICAgICAgCSAgICAgICAJICAgaW50ICgqKShjb25zdCBzdHJ1Y3Qgc29jayosY29uc3Qgc3RydWN0IHNvY2sqKSk7CitleHRlcm4gaW50CWlwdjRfcmN2X3NhZGRyX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrICosIGNvbnN0IHN0cnVjdCBzb2NrICopOworCisKK2V4dGVybiBpbnQJdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworZXh0ZXJuIGludAl1ZHBfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKKworI2lmZGVmIENPTkZJR19DT01QQVQKK2V4dGVybiBpbnQJY29tcGF0X3VkcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKK2V4dGVybiBpbnQJY29tcGF0X3VkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOworI2VuZGlmCitleHRlcm4gaW50CXVkcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbik7CitleHRlcm4gaW50CXVkcF9zZW5kcGFnZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LAorCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQJdWRwX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKiBzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50CXVkcF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitleHRlcm4gaW50CXVkcDRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpOworI2VuZGlmCisjZW5kaWYJLyogX1VEUDRfSU1QTF9IICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBsaXRlLmMgYi9uZXQvaXB2NC91ZHBsaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4ZmUxZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3VkcGxpdGUuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqICBVRFBMSVRFICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVURQLUxpdGUgcHJvdG9jb2wgKFJGQyAzODI4KS4KKyAqCisgKiAgVmVyc2lvbjogICAgJElkOiB1ZHBsaXRlLmMsdiAxLjI1IDIwMDYvMTAvMTkgMDc6MjI6MzYgZ2Vycml0IEV4cCAkCisgKgorICogIEF1dGhvcnM6ICAgIEdlcnJpdCBSZW5rZXIgICAgICAgPGdlcnJpdEBlcmcuYWJkbi5hYy51az4KKyAqCisgKiAgQ2hhbmdlczoKKyAqICBGaXhlczoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSAidWRwX2ltcGwuaCIKK0RFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcGxpdGVfc3RhdGlzdGljcykJX19yZWFkX21vc3RseTsKKworc3RydWN0IGhsaXN0X2hlYWQgCXVkcGxpdGVfaGFzaFtVRFBfSFRBQkxFX1NJWkVdOworc3RhdGljIGludAkJdWRwbGl0ZV9wb3J0X3JvdmVyOworCitpbnQgdWRwbGl0ZV9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHAsCisJCSAgICAgaW50ICgqYykoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpCit7CisJcmV0dXJuICBfX3VkcF9saWJfZ2V0X3BvcnQoc2ssIHAsIHVkcGxpdGVfaGFzaCwgJnVkcGxpdGVfcG9ydF9yb3ZlciwgYyk7Cit9CisKK3N0YXRpYyBpbnQgdWRwbGl0ZV92NF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pCit7CisJcmV0dXJuIHVkcGxpdGVfZ2V0X3BvcnQoc2ssIHNudW0sIGlwdjRfcmN2X3NhZGRyX2VxdWFsKTsKK30KKworc3RhdGljIGludCB1ZHBsaXRlX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBfX3VkcDRfbGliX3Jjdihza2IsIHVkcGxpdGVfaGFzaCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHVkcGxpdGVfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQoreworCXJldHVybiBfX3VkcDRfbGliX2Vycihza2IsIGluZm8sIHVkcGxpdGVfaGFzaCk7Cit9CisKK3N0YXRpYwlzdHJ1Y3QgbmV0X3Byb3RvY29sIHVkcGxpdGVfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPSB1ZHBsaXRlX3JjdiwKKwkuZXJyX2hhbmRsZXIJPSB1ZHBsaXRlX2VyciwKKwkubm9fcG9saWN5CT0gMSwKK307CisKK3N0cnVjdCBwcm90byAJdWRwbGl0ZV9wcm90ID0geworCS5uYW1lCQkgICA9ICJVRFAtTGl0ZSIsCisJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLAorCS5jbG9zZQkJICAgPSB1ZHBfbGliX2Nsb3NlLAorCS5jb25uZWN0CSAgID0gaXA0X2RhdGFncmFtX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QJICAgPSB1ZHBfZGlzY29ubmVjdCwKKwkuaW9jdGwJCSAgID0gdWRwX2lvY3RsLAorCS5pbml0CQkgICA9IHVkcGxpdGVfc2tfaW5pdCwKKwkuZGVzdHJveQkgICA9IHVkcF9kZXN0cm95X3NvY2ssCisJLnNldHNvY2tvcHQJICAgPSB1ZHBfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAkgICA9IHVkcF9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnCSAgID0gdWRwX3NlbmRtc2csCisJLnJlY3Ztc2cJICAgPSB1ZHBfcmVjdm1zZywKKwkuc2VuZHBhZ2UJICAgPSB1ZHBfc2VuZHBhZ2UsCisJLmJhY2tsb2dfcmN2CSAgID0gdWRwX3F1ZXVlX3Jjdl9za2IsCisJLmhhc2gJCSAgID0gdWRwX2xpYl9oYXNoLAorCS51bmhhc2gJCSAgID0gdWRwX2xpYl91bmhhc2gsCisJLmdldF9wb3J0CSAgID0gdWRwbGl0ZV92NF9nZXRfcG9ydCwKKwkub2JqX3NpemUJICAgPSBzaXplb2Yoc3RydWN0IHVkcF9zb2NrKSwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcF9zZXRzb2Nrb3B0LAorCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF91ZHBfZ2V0c29ja29wdCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgdWRwbGl0ZTRfcHJvdG9zdyA9IHsKKwkudHlwZQkJPSAgU09DS19ER1JBTSwKKwkucHJvdG9jb2wJPSAgSVBQUk9UT19VRFBMSVRFLAorCS5wcm90CQk9ICAmdWRwbGl0ZV9wcm90LAorCS5vcHMJCT0gICZpbmV0X2RncmFtX29wcywKKwkuY2FwYWJpbGl0eQk9IC0xLAorCS5ub19jaGVjawk9ICAwLAkJLyogbXVzdCBjaGVja3N1bSAoUkZDIDM4MjgpICovCisJLmZsYWdzCQk9ICBJTkVUX1BST1RPU1dfUEVSTUFORU5ULAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZHBsaXRlNF9zZXFfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gdWRwbGl0ZTRfc2VxX2FmaW5mbyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInVkcGxpdGUiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkuaGFzaHRhYmxlCT0gdWRwbGl0ZV9oYXNoLAorCS5zZXFfc2hvdwk9IHVkcDRfc2VxX3Nob3csCisJLnNlcV9mb3BzCT0gJnVkcGxpdGU0X3NlcV9mb3BzLAorfTsKKyNlbmRpZgorCit2b2lkIF9faW5pdCB1ZHBsaXRlNF9yZWdpc3Rlcih2b2lkKQoreworCWlmIChwcm90b19yZWdpc3RlcigmdWRwbGl0ZV9wcm90LCAxKSkKKwkJZ290byBvdXRfcmVnaXN0ZXJfZXJyOworCisJaWYgKGluZXRfYWRkX3Byb3RvY29sKCZ1ZHBsaXRlX3Byb3RvY29sLCBJUFBST1RPX1VEUExJVEUpIDwgMCkKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9wcm90bzsKKworCWluZXRfcmVnaXN0ZXJfcHJvdG9zdygmdWRwbGl0ZTRfcHJvdG9zdyk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmICh1ZHBfcHJvY19yZWdpc3RlcigmdWRwbGl0ZTRfc2VxX2FmaW5mbykpIC8qIHVkcGxpdGU0X3Byb2NfaW5pdCgpICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZWdpc3RlciAvcHJvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKwlyZXR1cm47CisKK291dF91bnJlZ2lzdGVyX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnVkcGxpdGVfcHJvdCk7CitvdXRfcmVnaXN0ZXJfZXJyOgorCXByaW50ayhLRVJOX0NSSVQgIiVzOiBDYW5ub3QgYWRkIFVEUC1MaXRlIHByb3RvY29sLlxuIiwgX19GVU5DVElPTl9fKTsKK30KKworRVhQT1JUX1NZTUJPTCh1ZHBsaXRlX2hhc2gpOworRVhQT1JUX1NZTUJPTCh1ZHBsaXRlX3Byb3QpOworRVhQT1JUX1NZTUJPTCh1ZHBsaXRlX2dldF9wb3J0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jIGIvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKaW5kZXggMWJlZDBjZC4uZDQxMDdiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKKysrIGIvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKQEAgLTcyLDggKzcyLDggQEAKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICpkc3RfcHJldjsKIAlzdHJ1Y3QgcnRhYmxlICpydDAgPSAoc3RydWN0IHJ0YWJsZSopKCpkc3RfcCk7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSBydDA7Ci0JdTMyIHJlbW90ZSA9IGZsLT5mbDRfZHN0OwotCXUzMiBsb2NhbCAgPSBmbC0+Zmw0X3NyYzsKKwlfX2JlMzIgcmVtb3RlID0gZmwtPmZsNF9kc3Q7CisJX19iZTMyIGxvY2FsICA9IGZsLT5mbDRfc3JjOwogCXN0cnVjdCBmbG93aSBmbF90dW5uZWwgPSB7CiAJCS5ubF91ID0gewogCQkJLmlwNF91ID0gewpAQCAtMTk5LDExICsxOTksMTIgQEAKIAlpZiAoIShpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSkgewogCQlzd2l0Y2ggKGlwaC0+cHJvdG9jb2wpIHsKIAkJY2FzZSBJUFBST1RPX1VEUDoKKwkJY2FzZSBJUFBST1RPX1VEUExJVEU6CiAJCWNhc2UgSVBQUk9UT19UQ1A6CiAJCWNhc2UgSVBQUk9UT19TQ1RQOgogCQljYXNlIElQUFJPVE9fRENDUDoKIAkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgeHBydGggKyA0IC0gc2tiLT5kYXRhKSkgewotCQkJCXUxNiAqcG9ydHMgPSAodTE2ICopeHBydGg7CisJCQkJX19iZTE2ICpwb3J0cyA9IChfX2JlMTYgKil4cHJ0aDsKIAogCQkJCWZsLT5mbF9pcF9zcG9ydCA9IHBvcnRzWzBdOwogCQkJCWZsLT5mbF9pcF9kcG9ydCA9IHBvcnRzWzFdOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvS2NvbmZpZyBiL25ldC9pcHY2L0tjb25maWcKaW5kZXggNmU0OGY1Mi4uZGViNDEwMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9LY29uZmlnCkBAIC0xOTYsMTAgKzE5NiwzIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUFY2X1JPVVRFX0ZXTUFSSwotCWJvb2wgIklQdjY6IHVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nIGtleSIKLQlkZXBlbmRzIG9uIElQVjZfTVVMVElQTEVfVEFCTEVTICYmIE5FVEZJTFRFUgotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNwZWNpZnkgZGlmZmVyZW50IHJvdXRlcyBmb3IKLQkgIHBhY2tldHMgd2l0aCBkaWZmZXJlbnQgbWFyayB2YWx1ZXMgKHNlZSBpcHRhYmxlcyg4KSwgTUFSSyB0YXJnZXQpLgotCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9NYWtlZmlsZSBiL25ldC9pcHY2L01ha2VmaWxlCmluZGV4IGFkZGNjMDEuLjhiYWNkYTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L01ha2VmaWxlCisrKyBiL25ldC9pcHY2L01ha2VmaWxlCkBAIC01LDggKzUsOCBAQAogb2JqLSQoQ09ORklHX0lQVjYpICs9IGlwdjYubwogCiBpcHY2LW9ianMgOj0JYWZfaW5ldDYubyBhbnljYXN0Lm8gaXA2X291dHB1dC5vIGlwNl9pbnB1dC5vIGFkZHJjb25mLm8gXAotCQlyb3V0ZS5vIGlwNl9maWIubyBpcHY2X3NvY2tnbHVlLm8gbmRpc2MubyB1ZHAubyByYXcubyBcCi0JCXByb3RvY29sLm8gaWNtcC5vIG1jYXN0Lm8gcmVhc3NlbWJseS5vIHRjcF9pcHY2Lm8gXAorCQlyb3V0ZS5vIGlwNl9maWIubyBpcHY2X3NvY2tnbHVlLm8gbmRpc2MubyB1ZHAubyB1ZHBsaXRlLm8gXAorCQlyYXcubyBwcm90b2NvbC5vIGljbXAubyBtY2FzdC5vIHJlYXNzZW1ibHkubyB0Y3BfaXB2Ni5vIFwKIAkJZXh0aGRycy5vIHN5c2N0bF9uZXRfaXB2Ni5vIGRhdGFncmFtLm8gcHJvYy5vIFwKIAkJaXA2X2Zsb3dsYWJlbC5vIGlwdjZfc3ltcy5vIGluZXQ2X2Nvbm5lY3Rpb25fc29jay5vCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGIzMTJhNWYuLmE1ZThkMjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMjMyLDcgKzIzMiw3IEBACiAKIGludCBfX2lwdjZfYWRkcl90eXBlKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKIHsKLQl1MzIgc3Q7CisJX19iZTMyIHN0OwogCiAJc3QgPSBhZGRyLT5zNl9hZGRyMzJbMF07CiAKQEAgLTExNjQsNyArMTE2NCw3IEBACiBpbnQgaXB2Nl9nZXRfc2FkZHIoc3RydWN0IGRzdF9lbnRyeSAqZHN0LAogCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKQogewotCXJldHVybiBpcHY2X2Rldl9nZXRfc2FkZHIoZHN0ID8gKChzdHJ1Y3QgcnQ2X2luZm8gKilkc3QpLT5ydDZpX2lkZXYtPmRldiA6IE5VTEwsIGRhZGRyLCBzYWRkcik7CisJcmV0dXJuIGlwdjZfZGV2X2dldF9zYWRkcihkc3QgPyBpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2IDogTlVMTCwgZGFkZHIsIHNhZGRyKTsKIH0KIAogCkBAIC0zMDk4LDEwICszMDk4LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQgaW5ldDZfaWZhZGRyX21zZ3NpemUodm9pZCkKIHsKLQlyZXR1cm4gbmxtc2dfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykgKwotCQkJCW5sYV90b3RhbF9zaXplKDE2KSArCi0JCQkJbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmFfY2FjaGVpbmZvKSkgKwotCQkJCTEyOCk7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxNikgLyogSUZBX0FERFJFU1MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmYV9jYWNoZWluZm8pKTsKIH0KIAogc3RhdGljIGludCBpbmV0Nl9maWxsX2lmYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEsCkBAIC0zMzI5LDEwICszMzI4LDggQEAKIAogCWVyciA9IGluZXQ2X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCBORVRMSU5LX0NCKGluX3NrYikucGlkLAogCQkJCW5saC0+bmxtc2dfc2VxLCBSVE1fTkVXQUREUiwgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCWdvdG8gZXJyb3V0X2lmYTsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF91bmljYXN0KHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCk7CiBlcnJvdXRfaWZhOgpAQCAtMzM1MSwxMCArMzM0OCw4IEBACiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaW5ldDZfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIDAsIDAsIGV2ZW50LCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gaW5ldDZfaWZhZGRyX21zZ3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9JUFY2X0lGQUREUiwgTlVMTCwgR0ZQX0FUT01JQyk7CiBlcnJvdXQ6CkBAIC0zMzY1LDYgKzMzNjAsOCBAQAogc3RhdGljIHZvaWQgaW5saW5lIGlwdjZfc3RvcmVfZGV2Y29uZihzdHJ1Y3QgaXB2Nl9kZXZjb25mICpjbmYsCiAJCQkJX19zMzIgKmFycmF5LCBpbnQgYnl0ZXMpCiB7CisJQlVHX09OKGJ5dGVzIDwgKERFVkNPTkZfTUFYICogNCkpOworCiAJbWVtc2V0KGFycmF5LCAwLCBieXRlcyk7CiAJYXJyYXlbREVWQ09ORl9GT1JXQVJESU5HXSA9IGNuZi0+Zm9yd2FyZGluZzsKIAlhcnJheVtERVZDT05GX0hPUExJTUlUXSA9IGNuZi0+aG9wX2xpbWl0OwpAQCAtMzM5Nyw4MCArMzM5NCw3NiBAQAogCWFycmF5W0RFVkNPTkZfUFJPWFlfTkRQXSA9IGNuZi0+cHJveHlfbmRwOwogfQogCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBpZmluZm9tc2cgYXR0cmlidXRlcyAqLwotI2RlZmluZSBJTkVUNl9JRklORk9fUlRBX1NQQUNFIFwKLQkJUlRBX1NQQUNFKElGTkFNU0laKSAvKiBJRk5BTUUgKi8gKyBcCi0JCVJUQV9TUEFDRShNQVhfQUREUl9MRU4pIC8qIEFERFJFU1MgKi8gKwlcCi0JCVJUQV9TUEFDRShzaXplb2YodTMyKSkgLyogTVRVICovICsgXAotCQlSVEFfU1BBQ0Uoc2l6ZW9mKGludCkpIC8qIExJTksgKi8gKyBcCi0JCVJUQV9TUEFDRSgwKSAvKiBQUk9USU5GTyAqLyArIFwKLQkJUlRBX1NQQUNFKHNpemVvZih1MzIpKSAvKiBGTEFHUyAqLyArIFwKLQkJUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgaWZsYV9jYWNoZWluZm8pKSAvKiBDQUNIRUlORk8gKi8gKyBcCi0JCVJUQV9TUEFDRShzaXplb2YoX19zMzJbREVWQ09ORl9NQVhdKSkgLyogQ09ORiAqLworc3RhdGljIGlubGluZSBzaXplX3QgaW5ldDZfaWZfbmxtc2dfc2l6ZSh2b2lkKQoreworCXJldHVybiBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopIC8qIElGTEFfSUZOQU1FICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoTUFYX0FERFJfTEVOKSAvKiBJRkxBX0FERFJFU1MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX01UVSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfTElOSyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKCAvKiBJRkxBX1BST1RJTkZPICovCisJCQlubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX0lORVQ2X0ZMQUdTICovCisJCQkrIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV9jYWNoZWluZm8pKQorCQkJKyBubGFfdG90YWxfc2l6ZShERVZDT05GX01BWCAqIDQpIC8qIElGTEFfSU5FVDZfQ09ORiAqLworCQkgKTsKK30KIAogc3RhdGljIGludCBpbmV0Nl9maWxsX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCAKIAkJCSAgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IGlkZXYtPmRldjsKLQlfX3MzMgkJCSphcnJheSA9IE5VTEw7Ci0Jc3RydWN0IGlmaW5mb21zZwkqcjsKLQlzdHJ1Y3Qgbmxtc2doZHIgCSpubGg7Ci0JdW5zaWduZWQgY2hhcgkJKmIgPSBza2ItPnRhaWw7Ci0Jc3RydWN0IHJ0YXR0cgkJKnN1YmF0dHI7Ci0JX191MzIJCQltdHUgPSBkZXYtPm10dTsKLQlzdHJ1Y3QgaWZsYV9jYWNoZWluZm8JY2k7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlkZXYtPmRldjsKKwlzdHJ1Y3QgbmxhdHRyICpjb25mOworCXN0cnVjdCBpZmluZm9tc2cgKmhkcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl2b2lkICpwcm90b2luZm87CisJc3RydWN0IGlmbGFfY2FjaGVpbmZvIGNpOwogCi0JbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnIpLCBmbGFncyk7Ci0JciA9IE5MTVNHX0RBVEEobmxoKTsKLQlyLT5pZmlfZmFtaWx5ID0gQUZfSU5FVDY7Ci0Jci0+X19pZmlfcGFkID0gMDsKLQlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKLQlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7Ci0Jci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOwotCXItPmlmaV9jaGFuZ2UgPSAwOworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpoZHIpLCBmbGFncyk7CisJaWYgKG5saCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQlSVEFfUFVUKHNrYiwgSUZMQV9JRk5BTUUsIHN0cmxlbihkZXYtPm5hbWUpKzEsIGRldi0+bmFtZSk7CisJaGRyID0gbmxtc2dfZGF0YShubGgpOworCWhkci0+aWZpX2ZhbWlseSA9IEFGX0lORVQ2OworCWhkci0+X19pZmlfcGFkID0gMDsKKwloZHItPmlmaV90eXBlID0gZGV2LT50eXBlOworCWhkci0+aWZpX2luZGV4ID0gZGV2LT5pZmluZGV4OworCWhkci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOworCWhkci0+aWZpX2NoYW5nZSA9IDA7CisKKwlOTEFfUFVUX1NUUklORyhza2IsIElGTEFfSUZOQU1FLCBkZXYtPm5hbWUpOwogCiAJaWYgKGRldi0+YWRkcl9sZW4pCi0JCVJUQV9QVVQoc2tiLCBJRkxBX0FERFJFU1MsIGRldi0+YWRkcl9sZW4sIGRldi0+ZGV2X2FkZHIpOworCQlOTEFfUFVUKHNrYiwgSUZMQV9BRERSRVNTLCBkZXYtPmFkZHJfbGVuLCBkZXYtPmRldl9hZGRyKTsKIAotCVJUQV9QVVQoc2tiLCBJRkxBX01UVSwgc2l6ZW9mKG10dSksICZtdHUpOworCU5MQV9QVVRfVTMyKHNrYiwgSUZMQV9NVFUsIGRldi0+bXR1KTsKIAlpZiAoZGV2LT5pZmluZGV4ICE9IGRldi0+aWZsaW5rKQotCQlSVEFfUFVUKHNrYiwgSUZMQV9MSU5LLCBzaXplb2YoaW50KSwgJmRldi0+aWZsaW5rKTsKLQkJCQotCXN1YmF0dHIgPSAoc3RydWN0IHJ0YXR0ciopc2tiLT50YWlsOworCQlOTEFfUFVUX1UzMihza2IsIElGTEFfTElOSywgZGV2LT5pZmxpbmspOwogCi0JUlRBX1BVVChza2IsIElGTEFfUFJPVElORk8sIDAsIE5VTEwpOworCXByb3RvaW5mbyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9QUk9USU5GTyk7CisJaWYgKHByb3RvaW5mbyA9PSBOVUxMKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCS8qIHJldHVybiB0aGUgZGV2aWNlIGZsYWdzICovCi0JUlRBX1BVVChza2IsIElGTEFfSU5FVDZfRkxBR1MsIHNpemVvZihfX3UzMiksICZpZGV2LT5pZl9mbGFncyk7CisJTkxBX1BVVF9VMzIoc2tiLCBJRkxBX0lORVQ2X0ZMQUdTLCBpZGV2LT5pZl9mbGFncyk7CiAKLQkvKiByZXR1cm4gaW50ZXJmYWNlIGNhY2hlaW5mbyAqLwogCWNpLm1heF9yZWFzbV9sZW4gPSBJUFY2X01BWFBMRU47CiAJY2kudHN0YW1wID0gKF9fdTMyKShUSU1FX0RFTFRBKGlkZXYtPnRzdGFtcCwgSU5JVElBTF9KSUZGSUVTKSAvIEhaICogMTAwCiAJCSAgICArIFRJTUVfREVMVEEoaWRldi0+dHN0YW1wLCBJTklUSUFMX0pJRkZJRVMpICUgSFogKiAxMDAgLyBIWik7CiAJY2kucmVhY2hhYmxlX3RpbWUgPSBpZGV2LT5uZF9wYXJtcy0+cmVhY2hhYmxlX3RpbWU7CiAJY2kucmV0cmFuc190aW1lID0gaWRldi0+bmRfcGFybXMtPnJldHJhbnNfdGltZTsKLQlSVEFfUFVUKHNrYiwgSUZMQV9JTkVUNl9DQUNIRUlORk8sIHNpemVvZihjaSksICZjaSk7Ci0JCi0JLyogcmV0dXJuIHRoZSBkZXZpY2Ugc3lzY3RsIHBhcmFtcyAqLwotCWlmICgoYXJyYXkgPSBrbWFsbG9jKERFVkNPTkZfTUFYICogc2l6ZW9mKCphcnJheSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQotCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwotCWlwdjZfc3RvcmVfZGV2Y29uZigmaWRldi0+Y25mLCBhcnJheSwgREVWQ09ORl9NQVggKiBzaXplb2YoKmFycmF5KSk7Ci0JUlRBX1BVVChza2IsIElGTEFfSU5FVDZfQ09ORiwgREVWQ09ORl9NQVggKiBzaXplb2YoKmFycmF5KSwgYXJyYXkpOworCU5MQV9QVVQoc2tiLCBJRkxBX0lORVQ2X0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKworCWNvbmYgPSBubGFfcmVzZXJ2ZShza2IsIElGTEFfSU5FVDZfQ09ORiwgREVWQ09ORl9NQVggKiBzaXplb2YoczMyKSk7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaXB2Nl9zdG9yZV9kZXZjb25mKCZpZGV2LT5jbmYsIG5sYV9kYXRhKGNvbmYpLCBubGFfbGVuKGNvbmYpKTsKIAogCS8qIFhYWCAtIFN0YXRpc3RpY3MvTUMgbm90IGltcGxlbWVudGVkICovCi0Jc3ViYXR0ci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopc3ViYXR0cjsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKLQlrZnJlZShhcnJheSk7Ci0JcmV0dXJuIHNrYi0+bGVuOworCW5sYV9uZXN0X2VuZChza2IsIHByb3RvaW5mbyk7CisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKLW5sbXNnX2ZhaWx1cmU6Ci1ydGF0dHJfZmFpbHVyZToKLQlrZnJlZShhcnJheSk7Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7CitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CiB9CiAKIHN0YXRpYyBpbnQgaW5ldDZfZHVtcF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQpAQCAtMzUwMSwxOCArMzQ5NCwxNSBAQAogdm9pZCBpbmV0Nl9pZmluZm9fbm90aWZ5KGludCBldmVudCwgc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBwYXlsb2FkID0gc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpICsgSU5FVDZfSUZJTkZPX1JUQV9TUEFDRTsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAJCi0Jc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIEdGUF9BVE9NSUMpOworCXNrYiA9IG5sbXNnX25ldyhpbmV0Nl9pZl9ubG1zZ19zaXplKCksIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmaW5mbyhza2IsIGlkZXYsIDAsIDAsIGV2ZW50LCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gaW5ldDZfaWZfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0lQVjZfSUZBRERSLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKQEAgLTM1MjAsMjIgKzM1MTAsMjYgQEAKIAkJcnRubF9zZXRfc2tfZXJyKFJUTkxHUlBfSVBWNl9JRkFERFIsIGVycik7CiB9CiAKLS8qIE1heGltdW0gbGVuZ3RoIG9mIHByZWZpeF9jYWNoZWluZm8gYXR0cmlidXRlcyAqLwotI2RlZmluZSBJTkVUNl9QUkVGSVhfUlRBX1NQQUNFIFwKLQkJUlRBX1NQQUNFKHNpemVvZigoKHN0cnVjdCBwcmVmaXhfaW5mbyAqKU5VTEwpLT5wcmVmaXgpKSAvKiBBRERSRVNTICovICsgXAotCQlSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBwcmVmaXhfY2FjaGVpbmZvKSkgLyogQ0FDSEVJTkZPICovCitzdGF0aWMgaW5saW5lIHNpemVfdCBpbmV0Nl9wcmVmaXhfbmxtc2dfc2l6ZSh2b2lkKQoreworCXJldHVybiBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHByZWZpeG1zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBwcmVmaXhfY2FjaGVpbmZvKSk7Cit9CiAKIHN0YXRpYyBpbnQgaW5ldDZfZmlsbF9wcmVmaXgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwKLQkJCXN0cnVjdCBwcmVmaXhfaW5mbyAqcGluZm8sIHUzMiBwaWQsIHUzMiBzZXEsIAotCQkJaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCisJCQkgICAgIHN0cnVjdCBwcmVmaXhfaW5mbyAqcGluZm8sIHUzMiBwaWQsIHUzMiBzZXEsCisJCQkgICAgIGludCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBwcmVmaXhtc2cJKnBtc2c7Ci0Jc3RydWN0IG5sbXNnaGRyIAkqbmxoOwotCXVuc2lnbmVkIGNoYXIJCSpiID0gc2tiLT50YWlsOworCXN0cnVjdCBwcmVmaXhtc2cgKnBtc2c7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHByZWZpeF9jYWNoZWluZm8JY2k7CiAKLQlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqcG1zZyksIGZsYWdzKTsKLQlwbXNnID0gTkxNU0dfREFUQShubGgpOworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpwbXNnKSwgZmxhZ3MpOworCWlmIChubGggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJcG1zZyA9IG5sbXNnX2RhdGEobmxoKTsKIAlwbXNnLT5wcmVmaXhfZmFtaWx5ID0gQUZfSU5FVDY7CiAJcG1zZy0+cHJlZml4X3BhZDEgPSAwOwogCXBtc2ctPnByZWZpeF9wYWQyID0gMDsKQEAgLTM1NDMsNDQgKzM1MzcsMzcgQEAKIAlwbXNnLT5wcmVmaXhfbGVuID0gcGluZm8tPnByZWZpeF9sZW47CiAJcG1zZy0+cHJlZml4X3R5cGUgPSBwaW5mby0+dHlwZTsKIAlwbXNnLT5wcmVmaXhfcGFkMyA9IDA7Ci0JCiAJcG1zZy0+cHJlZml4X2ZsYWdzID0gMDsKIAlpZiAocGluZm8tPm9ubGluaykKIAkJcG1zZy0+cHJlZml4X2ZsYWdzIHw9IElGX1BSRUZJWF9PTkxJTks7CiAJaWYgKHBpbmZvLT5hdXRvY29uZikKIAkJcG1zZy0+cHJlZml4X2ZsYWdzIHw9IElGX1BSRUZJWF9BVVRPQ09ORjsKIAotCVJUQV9QVVQoc2tiLCBQUkVGSVhfQUREUkVTUywgc2l6ZW9mKHBpbmZvLT5wcmVmaXgpLCAmcGluZm8tPnByZWZpeCk7CisJTkxBX1BVVChza2IsIFBSRUZJWF9BRERSRVNTLCBzaXplb2YocGluZm8tPnByZWZpeCksICZwaW5mby0+cHJlZml4KTsKIAogCWNpLnByZWZlcnJlZF90aW1lID0gbnRvaGwocGluZm8tPnByZWZlcmVkKTsKIAljaS52YWxpZF90aW1lID0gbnRvaGwocGluZm8tPnZhbGlkKTsKLQlSVEFfUFVUKHNrYiwgUFJFRklYX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKwlOTEFfUFVUKHNrYiwgUFJFRklYX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKLQlyZXR1cm4gc2tiLT5sZW47CisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKLW5sbXNnX2ZhaWx1cmU6Ci1ydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKIH0KIAogc3RhdGljIHZvaWQgaW5ldDZfcHJlZml4X25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIAogCQkJIHN0cnVjdCBwcmVmaXhfaW5mbyAqcGluZm8pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcGF5bG9hZCA9IHNpemVvZihzdHJ1Y3QgcHJlZml4bXNnKSArIElORVQ2X1BSRUZJWF9SVEFfU1BBQ0U7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIEdGUF9BVE9NSUMpOworCXNrYiA9IG5sbXNnX25ldyhpbmV0Nl9wcmVmaXhfbmxtc2dfc2l6ZSgpLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaW5ldDZfZmlsbF9wcmVmaXgoc2tiLCBpZGV2LCBwaW5mbywgMCwgMCwgZXZlbnQsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9wcmVmaXhfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0lQVjZfUFJFRklYLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKQEAgLTM5ODIsMTAgKzM5NjksOSBAQAogCXN0cnVjdCBhZGRyY29uZl9zeXNjdGxfdGFibGUgKnQ7CiAJY2hhciAqZGV2X25hbWUgPSBOVUxMOwogCi0JdCA9IGttYWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJdCA9IGttZW1kdXAoJmFkZHJjb25mX3N5c2N0bCwgc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHQgPT0gTlVMTCkKIAkJcmV0dXJuOwotCW1lbWNweSh0LCAmYWRkcmNvbmZfc3lzY3RsLCBzaXplb2YoKnQpKTsKIAlmb3IgKGk9MDsgdC0+YWRkcmNvbmZfdmFyc1tpXS5kYXRhOyBpKyspIHsKIAkJdC0+YWRkcmNvbmZfdmFyc1tpXS5kYXRhICs9IChjaGFyKilwIC0gKGNoYXIqKSZpcHY2X2RldmNvbmY7CiAJCXQtPmFkZHJjb25mX3ZhcnNbaV0uZGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggODU4Y2FlMi4uODdjOGY1NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3VkcGxpdGUuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L2lwaXAuaD4KICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KQEAgLTIyMSw3ICsyMjIsNyBAQAogCQkgKiB0aGUgdXNlciB0byBhc3NpZ24gYSBudW1iZXIgYXQgc29ja2V0CiAJCSAqIGNyZWF0aW9uIHRpbWUgYXV0b21hdGljYWxseSBzaGFyZXMuCiAJCSAqLwotCQlpbmV0LT5zcG9ydCA9IG50b2hzKGluZXQtPm51bSk7CisJCWluZXQtPnNwb3J0ID0gaHRvbnMoaW5ldC0+bnVtKTsKIAkJc2stPnNrX3Byb3QtPmhhc2goc2spOwogCX0KIAlpZiAoc2stPnNrX3Byb3QtPmluaXQpIHsKQEAgLTM0MSw3ICszNDIsNyBAQAogCQlzay0+c2tfdXNlcmxvY2tzIHw9IFNPQ0tfQklOREFERFJfTE9DSzsKIAlpZiAoc251bSkKIAkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX0JJTkRQT1JUX0xPQ0s7Ci0JaW5ldC0+c3BvcnQgPSBudG9ocyhpbmV0LT5udW0pOworCWluZXQtPnNwb3J0ID0gaHRvbnMoaW5ldC0+bnVtKTsKIAlpbmV0LT5kcG9ydCA9IDA7CiAJaW5ldC0+ZGFkZHIgPSAwOwogb3V0OgpAQCAtNjc4LDcgKzY3OSw3IEBACiAJaWYgKG5wLT5yeG9wdC5hbGwpIHsKIAkJaWYgKChvcHQtPmhvcCAmJiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyB8fAogCQkJCSAgbnAtPnJ4b3B0LmJpdHMub2hvcG9wdHMpKSB8fAotCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0sgJiAqKHUzMiopc2tiLT5uaC5yYXcpICYmCisJCSAgICAoKElQVjZfRkxPV0lORk9fTUFTSyAmICooX19iZTMyKilza2ItPm5oLnJhdykgJiYKIAkJICAgICBucC0+cnhvcHQuYml0cy5yeGZsb3cpIHx8CiAJCSAgICAob3B0LT5zcmNydCAmJiAobnAtPnJ4b3B0LmJpdHMuc3JjcnQgfHwKIAkJICAgICBucC0+cnhvcHQuYml0cy5vc3JjcnQpKSB8fApAQCAtNzM3LDggKzczOCwxMyBAQAogCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKil1ZHBfc3RhdHNfaW42LCBzaXplb2YgKHN0cnVjdCB1ZHBfbWliKSwKIAkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQogCQlnb3RvIGVycl91ZHBfbWliOworCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKil1ZHBsaXRlX3N0YXRzX2luNiwgc2l6ZW9mIChzdHJ1Y3QgdWRwX21pYiksCisJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwkJZ290byBlcnJfdWRwbGl0ZV9taWI7CiAJcmV0dXJuIDA7CiAKK2Vycl91ZHBsaXRlX21pYjoKKwlzbm1wNl9taWJfZnJlZSgodm9pZCAqKil1ZHBfc3RhdHNfaW42KTsKIGVycl91ZHBfbWliOgogCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKIGVycl9pY21wX21pYjoKQEAgLTc1Myw2ICs3NTksNyBAQAogCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlwdjZfc3RhdGlzdGljcyk7CiAJc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOwogCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKXVkcF9zdGF0c19pbjYpOworCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKXVkcGxpdGVfc3RhdHNfaW42KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaW5ldDZfaW5pdCh2b2lkKQpAQCAtNzgwLDEwICs3ODcsMTQgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF91bnJlZ2lzdGVyX3RjcF9wcm90bzsKIAotCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZyYXd2Nl9wcm90LCAxKTsKKwllcnIgPSBwcm90b19yZWdpc3RlcigmdWRwbGl0ZXY2X3Byb3QsIDEpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X3VucmVnaXN0ZXJfdWRwX3Byb3RvOwogCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJnJhd3Y2X3Byb3QsIDEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfdWRwbGl0ZV9wcm90bzsKKwogCiAJLyogUmVnaXN0ZXIgdGhlIHNvY2tldC1zaWRlIGluZm9ybWF0aW9uIGZvciBpbmV0Nl9jcmVhdGUuICAqLwogCWZvcihyID0gJmluZXRzdzZbMF07IHIgPCAmaW5ldHN3NltTT0NLX01BWF07ICsrcikKQEAgLTgzNyw2ICs4NDgsOCBAQAogCQlnb3RvIHByb2NfdGNwNl9mYWlsOwogCWlmICh1ZHA2X3Byb2NfaW5pdCgpKQogCQlnb3RvIHByb2NfdWRwNl9mYWlsOworCWlmICh1ZHBsaXRlNl9wcm9jX2luaXQoKSkKKwkJZ290byBwcm9jX3VkcGxpdGU2X2ZhaWw7CiAJaWYgKGlwdjZfbWlzY19wcm9jX2luaXQoKSkKIAkJZ290byBwcm9jX21pc2M2X2ZhaWw7CiAKQEAgLTg2Miw2ICs4NzUsNyBAQAogCiAJLyogSW5pdCB2NiB0cmFuc3BvcnQgcHJvdG9jb2xzLiAqLwogCXVkcHY2X2luaXQoKTsKKwl1ZHBsaXRldjZfaW5pdCgpOwogCXRjcHY2X2luaXQoKTsKIAogCWlwdjZfcGFja2V0X2luaXQoKTsKQEAgLTg3OSw2ICs4OTMsOCBAQAogcHJvY19hbnljYXN0Nl9mYWlsOgogCWlwdjZfbWlzY19wcm9jX2V4aXQoKTsKIHByb2NfbWlzYzZfZmFpbDoKKwl1ZHBsaXRlNl9wcm9jX2V4aXQoKTsKK3Byb2NfdWRwbGl0ZTZfZmFpbDoKIAl1ZHA2X3Byb2NfZXhpdCgpOwogcHJvY191ZHA2X2ZhaWw6CiAJdGNwNl9wcm9jX2V4aXQoKTsKQEAgLTkwMiw2ICs5MTgsOCBAQAogCXNvY2tfdW5yZWdpc3RlcihQRl9JTkVUNik7CiBvdXRfdW5yZWdpc3Rlcl9yYXdfcHJvdG86CiAJcHJvdG9fdW5yZWdpc3RlcigmcmF3djZfcHJvdCk7CitvdXRfdW5yZWdpc3Rlcl91ZHBsaXRlX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnVkcGxpdGV2Nl9wcm90KTsKIG91dF91bnJlZ2lzdGVyX3VkcF9wcm90bzoKIAlwcm90b191bnJlZ2lzdGVyKCZ1ZHB2Nl9wcm90KTsKIG91dF91bnJlZ2lzdGVyX3RjcF9wcm90bzoKQEAgLTkxOSw2ICs5MzcsNyBAQAogCWFjNl9wcm9jX2V4aXQoKTsKICAJaXB2Nl9taXNjX3Byb2NfZXhpdCgpOwogIAl1ZHA2X3Byb2NfZXhpdCgpOworIAl1ZHBsaXRlNl9wcm9jX2V4aXQoKTsKICAJdGNwNl9wcm9jX2V4aXQoKTsKICAJcmF3Nl9wcm9jX2V4aXQoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWg2LmMgYi9uZXQvaXB2Ni9haDYuYwppbmRleCBiMGQ4M2U4Li4xMmM1YTRkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9haDYuYworKysgYi9uZXQvaXB2Ni9haDYuYwpAQCAtMzU0LDEwICszNTQsOSBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGFoX2hsZW4pKQogCQlnb3RvIG91dDsKIAotCXRtcF9oZHIgPSBrbWFsbG9jKGhkcl9sZW4sIEdGUF9BVE9NSUMpOworCXRtcF9oZHIgPSBrbWVtZHVwKHNrYi0+bmgucmF3LCBoZHJfbGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXRtcF9oZHIpCiAJCWdvdG8gb3V0OwotCW1lbWNweSh0bXBfaGRyLCBza2ItPm5oLnJhdywgaGRyX2xlbik7CiAJaWYgKGlwdjZfY2xlYXJfbXV0YWJsZV9vcHRpb25zKHNrYi0+bmguaXB2NmgsIGhkcl9sZW4sIFhGUk1fUE9MSUNZX0lOKSkKIAkJZ290byBmcmVlX291dDsKIAlza2ItPm5oLmlwdjZoLT5wcmlvcml0eSAgICA9IDA7CkBAIC0zOTcsNyArMzk2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYWg2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwgCi0gICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CiAJc3RydWN0IGlwX2F1dGhfaGRyICphaCA9IChzdHJ1Y3QgaXBfYXV0aF9oZHIqKShza2ItPmRhdGErb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2RhdGFncmFtLmMgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCmluZGV4IDcyMDY3NDcuLjVjOTRmZWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2RhdGFncmFtLmMKKysrIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwpAQCAtMjA3LDcgKzIwNyw3IEBACiB9CiAKIHZvaWQgaXB2Nl9pY21wX2Vycm9yKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVyciwgCi0JCSAgICAgdTE2IHBvcnQsIHUzMiBpbmZvLCB1OCAqcGF5bG9hZCkKKwkJICAgICBfX2JlMTYgcG9ydCwgdTMyIGluZm8sIHU4ICpwYXlsb2FkKQogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucCAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGljbXA2aGRyICppY21waCA9IChzdHJ1Y3QgaWNtcDZoZHIgKilza2ItPmgucmF3OwpAQCAtMzE4LDEzICszMTgsMTMgQEAKIAkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwKIAkJCSAgKHN0cnVjdCBpbjZfYWRkciAqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KSk7CiAJCQlpZiAobnAtPnNuZGZsb3cpCi0JCQkJc2luLT5zaW42X2Zsb3dpbmZvID0gKih1MzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0IC0gMjQpICYgSVBWNl9GTE9XSU5GT19NQVNLOworCQkJCXNpbi0+c2luNl9mbG93aW5mbyA9ICooX19iZTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCAtIDI0KSAmIElQVjZfRkxPV0lORk9fTUFTSzsKIAkJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luLT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKIAkJCQlzaW4tPnNpbjZfc2NvcGVfaWQgPSBJUDZDQihza2IpLT5paWY7CiAJCX0gZWxzZSB7CiAJCQlpcHY2X2FkZHJfc2V0KCZzaW4tPnNpbjZfYWRkciwgMCwgMCwKIAkJCQkgICAgICBodG9ubCgweGZmZmYpLAotCQkJCSAgICAgICoodTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCkpOworCQkJCSAgICAgICooX19iZTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCkpOwogCQl9CiAJfQogCkBAIC0zOTcsMTIgKzM5NywxMiBAQAogCX0KIAogCWlmIChucC0+cnhvcHQuYml0cy5yeHRjbGFzcykgewotCQlpbnQgdGNsYXNzID0gKG50b2hsKCoodTMyICopc2tiLT5uaC5pcHY2aCkgPj4gMjApICYgMHhmZjsKKwkJaW50IHRjbGFzcyA9IChudG9obCgqKF9fYmUzMiAqKXNrYi0+bmguaXB2NmgpID4+IDIwKSAmIDB4ZmY7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfVENMQVNTLCBzaXplb2YodGNsYXNzKSwgJnRjbGFzcyk7CiAJfQogCi0JaWYgKG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdyAmJiAoKih1MzIqKXNrYi0+bmgucmF3ICYgSVBWNl9GTE9XSU5GT19NQVNLKSkgewotCQl1MzIgZmxvd2luZm8gPSAqKHUzMiopc2tiLT5uaC5yYXcgJiBJUFY2X0ZMT1dJTkZPX01BU0s7CisJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdyAmJiAoKihfX2JlMzIqKXNrYi0+bmgucmF3ICYgSVBWNl9GTE9XSU5GT19NQVNLKSkgeworCQlfX2JlMzIgZmxvd2luZm8gPSAqKF9fYmUzMiopc2tiLT5uaC5yYXcgJiBJUFY2X0ZMT1dJTkZPX01BU0s7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfRkxPV0lORk8sIHNpemVvZihmbG93aW5mbyksICZmbG93aW5mbyk7CiAJfQogCkBAIC01NjAsMTIgKzU2MCwxMiBAQAogCQkJfQogCiAJCQlpZiAoZmwtPmZsNl9mbG93bGFiZWwmSVBWNl9GTE9XSU5GT19NQVNLKSB7Ci0JCQkJaWYgKChmbC0+Zmw2X2Zsb3dsYWJlbF4qKHUzMiAqKUNNU0dfREFUQShjbXNnKSkmfklQVjZfRkxPV0lORk9fTUFTSykgeworCQkJCWlmICgoZmwtPmZsNl9mbG93bGFiZWxeKihfX2JlMzIgKilDTVNHX0RBVEEoY21zZykpJn5JUFY2X0ZMT1dJTkZPX01BU0spIHsKIAkJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQkJZ290byBleGl0X2Y7CiAJCQkJfQogCQkJfQotCQkJZmwtPmZsNl9mbG93bGFiZWwgPSBJUFY2X0ZMT1dJTkZPX01BU0sgJiAqKHUzMiAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWZsLT5mbDZfZmxvd2xhYmVsID0gSVBWNl9GTE9XSU5GT19NQVNLICYgKihfX2JlMzIgKilDTVNHX0RBVEEoY21zZyk7CiAJCQlicmVhazsKIAogCQljYXNlIElQVjZfMjI5MkhPUE9QVFM6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9lc3A2LmMgYi9uZXQvaXB2Ni9lc3A2LmMKaW5kZXggZTc4NjgwYS4uMjVkY2Y2OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXNwNi5jCisrKyBiL25ldC9pcHY2L2VzcDYuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGVzcDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQorICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CiAJc3RydWN0IGlwdjZfZXNwX2hkciAqZXNwaCA9IChzdHJ1Y3QgaXB2Nl9lc3BfaGRyKikoc2tiLT5kYXRhK29mZnNldCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzLmMgYi9uZXQvaXB2Ni9leHRoZHJzLmMKaW5kZXggODhjOTZiMS4uMDcxMWY5MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRycy5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnMuYwpAQCAtMjg0LDEwICsyODQsMTIgQEAKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CiAJX191MTYgZHN0YnVmOwogI2VuZGlmCisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKSs4KSB8fAogCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrKChza2ItPmgucmF3WzFdKzEpPDwzKSkpIHsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTI5OCw3ICszMDAsOSBAQAogCWRzdGJ1ZiA9IG9wdC0+ZHN0MTsKICNlbmRpZgogCisJZHN0ID0gZHN0X2Nsb25lKHNrYi0+ZHN0KTsKIAlpZiAoaXA2X3BhcnNlX3Rsdih0bHZwcm9jZGVzdG9wdF9sc3QsIHNrYnApKSB7CisJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCXNrYiA9ICpza2JwOwogCQlza2ItPmgucmF3ICs9ICgoc2tiLT5oLnJhd1sxXSsxKTw8Myk7CiAJCW9wdCA9IElQNkNCKHNrYik7CkBAIC0zMTAsNyArMzE0LDggQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCWRzdF9yZWxlYXNlKGRzdCk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0zNjUsNyArMzcwLDggQEAKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrOCkgfHwKIAkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKygoc2tiLT5oLnJhd1sxXSsxKTw8MykpKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0zNzQsNyArMzgwLDggQEAKIAogCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZza2ItPm5oLmlwdjZoLT5kYWRkcikgfHwKIAkgICAgc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0zODgsNyArMzk1LDggQEAKIAkJCSAqIHByb2Nlc3NlZCBieSBvd24KIAkJCSAqLwogCQkJaWYgKCFhZGRyKSB7Ci0JCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQkJCWtmcmVlX3NrYihza2IpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KQEAgLTQxMCw3ICs0MTgsOCBAQAogCXN3aXRjaCAoaGRyLT50eXBlKSB7CiAJY2FzZSBJUFY2X1NSQ1JUX1RZUEVfMDoKIAkJaWYgKGhkci0+aGRybGVuICYgMHgwMSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsICgmaGRyLT5oZHJsZW4pIC0gc2tiLT5uaC5yYXcpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC00MTksMTQgKzQyOCwxNiBAQAogCWNhc2UgSVBWNl9TUkNSVF9UWVBFXzI6CiAJCS8qIFNpbGVudGx5IGRpc2NhcmQgaW52YWxpZCBSVEggdHlwZSAyICovCiAJCWlmIChoZHItPmhkcmxlbiAhPSAyIHx8IGhkci0+c2VnbWVudHNfbGVmdCAhPSAxKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsICgmaGRyLT50eXBlKSAtIHNrYi0+bmgucmF3KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQzOSw3ICs0NTAsOCBAQAogCW4gPSBoZHItPmhkcmxlbiA+PiAxOwogCiAJaWYgKGhkci0+c2VnbWVudHNfbGVmdCA+IG4pIHsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsICgmaGRyLT5zZWdtZW50c19sZWZ0KSAtIHNrYi0+bmgucmF3KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQ0OSwxMiArNDYxLDE0IEBACiAJICovCiAJaWYgKHNrYl9jbG9uZWQoc2tiKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7Ci0JCWtmcmVlX3NrYihza2IpOwogCQkvKiB0aGUgY29weSBpcyBhIGZvcndhcmRlZCBwYWNrZXQgKi8KIAkJaWYgKHNrYjIgPT0gTlVMTCkgewotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CQorCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCQkgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CiAJCSpza2JwID0gc2tiID0gc2tiMjsKIAkJb3B0ID0gSVA2Q0Ioc2tiMik7CiAJCWhkciA9IChzdHJ1Y3QgaXB2Nl9ydF9oZHIgKikgc2tiMi0+aC5yYXc7CkBAIC00NzUsMTIgKzQ4OSwxNCBAQAogCQlpZiAoeGZybTZfaW5wdXRfYWRkcihza2IsICh4ZnJtX2FkZHJlc3NfdCAqKWFkZHIsCiAJCQkJICAgICAoeGZybV9hZGRyZXNzX3QgKikmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCiAJCQkJICAgICBJUFBST1RPX1JPVVRJTkcpIDwgMCkgewotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCQkgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCWlmICghaXB2Nl9jaGtfaG9tZV9hZGRyKGFkZHIpKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTQ5MSw3ICs1MDcsOCBAQAogCX0KIAogCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGFkZHIpKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTUxMCw3ICs1MjcsOCBAQAogCiAJaWYgKHNrYi0+ZHN0LT5kZXYtPmZsYWdzJklGRl9MT09QQkFDSykgewogCQlpZiAoc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0IDw9IDEpIHsKLQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfVElNRV9FWENFRUQsIElDTVBWNl9FWENfSE9QTElNSVQsCiAJCQkJICAgIDAsIHNrYi0+ZGV2KTsKIAkJCWtmcmVlX3NrYihza2IpOwpAQCAtNjMyLDI0ICs2NTAsMjUgQEAKIAlpZiAoc2tiLT5uaC5yYXdbb3B0b2ZmKzFdICE9IDQgfHwgKG9wdG9mZiYzKSAhPSAyKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgImlwdjZfaG9wX2p1bWJvOiB3cm9uZyBqdW1ibyBvcHQgbGVuZ3RoL2FsaWdubWVudCAlZFxuIiwKIAkJICAgICAgICAgICAgICAgc2tiLT5uaC5yYXdbb3B0b2ZmKzFdKTsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlnb3RvIGRyb3A7CiAJfQogCi0JcGt0X2xlbiA9IG50b2hsKCoodTMyKikoc2tiLT5uaC5yYXcrb3B0b2ZmKzIpKTsKKwlwa3RfbGVuID0gbnRvaGwoKihfX2JlMzIqKShza2ItPm5oLnJhdytvcHRvZmYrMikpOwogCWlmIChwa3RfbGVuIDw9IElQVjZfTUFYUExFTikgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgb3B0b2ZmKzIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBvcHRvZmYpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAocGt0X2xlbiA+IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTKTsKIAkJZ290byBkcm9wOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRyc19jb3JlLmMgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwppbmRleCAzMTViYzFmLi4yMWNiYmJkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwpAQCAtNzcsNyArNzcsNyBAQAogCQlpZiAoaHAgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkgewotCQkJdW5zaWduZWQgc2hvcnQgX2ZyYWdfb2ZmLCAqZnA7CisJCQlfX2JlMTYgX2ZyYWdfb2ZmLCAqZnA7CiAJCQlmcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCiAJCQkJCQlzdGFydCtvZmZzZXRvZihzdHJ1Y3QgZnJhZ19oZHIsCiAJCQkJCQkJICAgICAgIGZyYWdfb2ZmKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwppbmRleCAxODk2ZWNiLi4wODYyODA5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKKysrIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCkBAIC0yNSwxMCArMjUsNiBAQAogCXN0cnVjdCBmaWJfcnVsZQkJY29tbW9uOwogCXN0cnVjdCBydDZrZXkJCXNyYzsKIAlzdHJ1Y3QgcnQ2a2V5CQlkc3Q7Ci0jaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVfRldNQVJLCi0JdTMyCQkJZndtYXJrOwotCXUzMgkJCWZ3bWFzazsKLSNlbmRpZgogCXU4CQkJdGNsYXNzOwogfTsKIApAQCAtNjcsNyArNjMsNyBAQAogCQlmaWJfcnVsZV9wdXQoYXJnLnJ1bGUpOwogCiAJaWYgKGFyZy5yZXN1bHQpCi0JCXJldHVybiAoc3RydWN0IGRzdF9lbnRyeSAqKSBhcmcucmVzdWx0OworCQlyZXR1cm4gYXJnLnJlc3VsdDsKIAogCWRzdF9ob2xkKCZpcDZfbnVsbF9lbnRyeS51LmRzdCk7CiAJcmV0dXJuICZpcDZfbnVsbF9lbnRyeS51LmRzdDsKQEAgLTEzMCwyMiArMTI2LDEzIEBACiAJaWYgKHItPnRjbGFzcyAmJiByLT50Y2xhc3MgIT0gKChudG9obChmbC0+Zmw2X2Zsb3dsYWJlbCkgPj4gMjApICYgMHhmZikpCiAJCXJldHVybiAwOwogCi0jaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVfRldNQVJLCi0JaWYgKChyLT5md21hcmsgXiBmbC0+Zmw2X2Z3bWFyaykgJiByLT5md21hc2spCi0JCXJldHVybiAwOwotI2VuZGlmCi0KIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IGZpYjZfcnVsZV9wb2xpY3lbRlJBX01BWCsxXSBfX3JlYWRfbW9zdGx5ID0gewotCVtGUkFfSUZOQU1FXQk9IHsgLnR5cGUgPSBOTEFfU1RSSU5HLCAubGVuID0gSUZOQU1TSVogLSAxIH0sCi0JW0ZSQV9QUklPUklUWV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCUZSQV9HRU5FUklDX1BPTElDWSwKIAlbRlJBX1NSQ10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAogCVtGUkFfRFNUXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIH0sCi0JW0ZSQV9GV01BUktdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbRlJBX0ZXTUFTS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtGUkFfVEFCTEVdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIH07CiAKIHN0YXRpYyBpbnQgZmliNl9ydWxlX2NvbmZpZ3VyZShzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0xNTUsOCArMTQyLDcgQEAKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlzdHJ1Y3QgZmliNl9ydWxlICpydWxlNiA9IChzdHJ1Y3QgZmliNl9ydWxlICopIHJ1bGU7CiAKLQlpZiAoZnJoLT5zcmNfbGVuID4gMTI4IHx8IGZyaC0+ZHN0X2xlbiA+IDEyOCB8fAotCSAgICAoZnJoLT50b3MgJiB+SVBWNl9GTE9XSU5GT19NQVNLKSkKKwlpZiAoZnJoLT5zcmNfbGVuID4gMTI4IHx8IGZyaC0+ZHN0X2xlbiA+IDEyOCkKIAkJZ290byBlcnJvdXQ7CiAKIAlpZiAocnVsZS0+YWN0aW9uID09IEZSX0FDVF9UT19UQkwpIHsKQEAgLTE3NywyMyArMTYzLDYgQEAKIAkJbmxhX21lbWNweSgmcnVsZTYtPmRzdC5hZGRyLCB0YltGUkFfRFNUXSwKIAkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKIAotI2lmZGVmIENPTkZJR19JUFY2X1JPVVRFX0ZXTUFSSwotCWlmICh0YltGUkFfRldNQVJLXSkgewotCQlydWxlNi0+ZndtYXJrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pOwotCQlpZiAocnVsZTYtPmZ3bWFyaykgewotCQkJLyoKLQkJCSAqIGlmIHRoZSBtYXJrIHZhbHVlIGlzIG5vbi16ZXJvLAotCQkJICogYWxsIGJpdHMgYXJlIGNvbXBhcmVkIGJ5IGRlZmF1bHQKLQkJCSAqIHVubGVzcyBhIG1hc2sgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0JCQkgKi8KLQkJCXJ1bGU2LT5md21hc2sgPSAweEZGRkZGRkZGOwotCQl9Ci0JfQotCi0JaWYgKHRiW0ZSQV9GV01BU0tdKQotCQlydWxlNi0+ZndtYXNrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFTS10pOwotI2VuZGlmCi0KIAlydWxlNi0+c3JjLnBsZW4gPSBmcmgtPnNyY19sZW47CiAJcnVsZTYtPmRzdC5wbGVuID0gZnJoLT5kc3RfbGVuOwogCXJ1bGU2LT50Y2xhc3MgPSBmcmgtPnRvczsKQEAgLTIyNSwxNCArMTk0LDYgQEAKIAkgICAgbmxhX21lbWNtcCh0YltGUkFfRFNUXSwgJnJ1bGU2LT5kc3QuYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19JUFY2X1JPVVRFX0ZXTUFSSwotCWlmICh0YltGUkFfRldNQVJLXSAmJiAocnVsZTYtPmZ3bWFyayAhPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVJLXSkpKQotCQlyZXR1cm4gMDsKLQotCWlmICh0YltGUkFfRldNQVNLXSAmJiAocnVsZTYtPmZ3bWFzayAhPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVNLXSkpKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTI1NCwxNCArMjE1LDYgQEAKIAkJTkxBX1BVVChza2IsIEZSQV9TUkMsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAogCQkJJnJ1bGU2LT5zcmMuYWRkcik7CiAKLSNpZmRlZiBDT05GSUdfSVBWNl9ST1VURV9GV01BUksKLQlpZiAocnVsZTYtPmZ3bWFyaykKLQkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVJLLCBydWxlNi0+ZndtYXJrKTsKLQotCWlmIChydWxlNi0+ZndtYXNrIHx8IHJ1bGU2LT5md21hcmspCi0JCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0ZXTUFTSywgcnVsZTYtPmZ3bWFzayk7Ci0jZW5kaWYKLQogCXJldHVybiAwOwogCiBubGFfcHV0X2ZhaWx1cmU6CkBAIC0yNzgsNiArMjMxLDEyIEBACiAJcmV0dXJuIDB4M0ZGRjsKIH0KIAorc3RhdGljIHNpemVfdCBmaWI2X3J1bGVfbmxtc2dfcGF5bG9hZChzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUpCit7CisJcmV0dXJuIG5sYV90b3RhbF9zaXplKDE2KSAvKiBkc3QgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxNik7IC8qIHNyYyAqLworfQorCiBzdGF0aWMgc3RydWN0IGZpYl9ydWxlc19vcHMgZmliNl9ydWxlc19vcHMgPSB7CiAJLmZhbWlseQkJCT0gQUZfSU5FVDYsCiAJLnJ1bGVfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGZpYjZfcnVsZSksCkBAIC0yODcsNiArMjQ2LDcgQEAKIAkuY29tcGFyZQkJPSBmaWI2X3J1bGVfY29tcGFyZSwKIAkuZmlsbAkJCT0gZmliNl9ydWxlX2ZpbGwsCiAJLmRlZmF1bHRfcHJlZgkJPSBmaWI2X3J1bGVfZGVmYXVsdF9wcmVmLAorCS5ubG1zZ19wYXlsb2FkCQk9IGZpYjZfcnVsZV9ubG1zZ19wYXlsb2FkLAogCS5ubGdyb3VwCQk9IFJUTkxHUlBfSVBWNl9SVUxFLAogCS5wb2xpY3kJCQk9IGZpYjZfcnVsZV9wb2xpY3ksCiAJLnJ1bGVzX2xpc3QJCT0gJmZpYjZfcnVsZXMsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pY21wLmMgYi9uZXQvaXB2Ni9pY21wLmMKaW5kZXggNGVjODc2MC4uM2RjYzRiNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWNtcC5jCisrKyBiL25ldC9pcHY2L2ljbXAuYwpAQCAtMTc3LDcgKzE3Nyw4IEBACiAJICovCiAJZHN0ID0gaXA2X3JvdXRlX291dHB1dChzaywgZmwpOwogCWlmIChkc3QtPmVycm9yKSB7Ci0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLAorCQkJICAgICAgSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOwogCX0gZWxzZSBpZiAoZHN0LT5kZXYgJiYgKGRzdC0+ZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spKSB7CiAJCXJlcyA9IDE7CiAJfSBlbHNlIHsKQEAgLTIzMyw3ICsyMzQsNyBAQAogCQkJCQkJICAgICAgbGVuLCBmbC0+cHJvdG8sCiAJCQkJCQkgICAgICBza2ItPmNzdW0pOwogCX0gZWxzZSB7Ci0JCXUzMiB0bXBfY3N1bSA9IDA7CisJCV9fd3N1bSB0bXBfY3N1bSA9IDA7CiAKIAkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7CiAJCQl0bXBfY3N1bSA9IGNzdW1fYWRkKHRtcF9jc3VtLCBza2ItPmNzdW0pOwpAQCAtMjQxLDEzICsyNDIsMTEgQEAKIAogCQl0bXBfY3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKWljbXA2aCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksIHRtcF9jc3VtKTsKLQkJdG1wX2NzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAotCQkJCQkgICAmZmwtPmZsNl9kc3QsCi0JCQkJCSAgIGxlbiwgZmwtPnByb3RvLCB0bXBfY3N1bSk7Ci0JCWljbXA2aC0+aWNtcDZfY2tzdW0gPSB0bXBfY3N1bTsKKwkJaWNtcDZoLT5pY21wNl9ja3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmZmwtPmZsNl9zcmMsCisJCQkJCQkgICAgICAmZmwtPmZsNl9kc3QsCisJCQkJCQkgICAgICBsZW4sIGZsLT5wcm90bywKKwkJCQkJCSAgICAgIHRtcF9jc3VtKTsKIAl9Ci0JaWYgKGljbXA2aC0+aWNtcDZfY2tzdW0gPT0gMCkKLQkJaWNtcDZoLT5pY21wNl9ja3N1bSA9IC0xOwogCWlwNl9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtMjYzLDcgKzI2Miw3IEBACiB7CiAJc3RydWN0IGljbXB2Nl9tc2cgKm1zZyA9IChzdHJ1Y3QgaWNtcHY2X21zZyAqKSBmcm9tOwogCXN0cnVjdCBza19idWZmICpvcmdfc2tiID0gbXNnLT5za2I7Ci0JX191MzIgY3N1bSA9IDA7CisJX193c3VtIGNzdW0gPSAwOwogCiAJY3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMob3JnX3NrYiwgbXNnLT5vZmZzZXQgKyBvZmZzZXQsCiAJCQkJICAgICAgdG8sIGxlbiwgY3N1bSk7CkBAIC01NTUsNyArNTU0LDcgQEAKIAlpY21wdjZfeG1pdF91bmxvY2soKTsKIH0KIAotc3RhdGljIHZvaWQgaWNtcHY2X25vdGlmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdHlwZSwgaW50IGNvZGUsIHUzMiBpbmZvKQorc3RhdGljIHZvaWQgaWNtcHY2X25vdGlmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdHlwZSwgaW50IGNvZGUsIF9fYmUzMiBpbmZvKQogewogCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIsICpkYWRkcjsKIAlzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKmlwcHJvdDsKQEAgLTYzNyw4ICs2MzYsOCBAQAogCQkJYnJlYWs7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgQ0hFQ0tTVU1fTk9ORToKLQkJc2tiLT5jc3VtID0gfmNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLAotCQkJCQkgICAgIElQUFJPVE9fSUNNUFY2LCAwKTsKKwkJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLAorCQkJCQkgICAgIElQUFJPVE9fSUNNUFY2LCAwKSk7CiAJCWlmIChfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CiAJCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJJQ01QdjYgY2hlY2tzdW0gZmFpbGVkIFsiIE5JUDZfRk1UICIgPiAiIE5JUDZfRk1UICJdXG4iLAogCQkJCSAgICAgICBOSVA2KCpzYWRkciksIE5JUDYoKmRhZGRyKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYyBiL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCmluZGV4IDgyN2Y0MWQuLmM3MDAzMDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCkBAIC01MiwyMCArNTIsMjAgQEAKIC8qCiAgKiByZXF1ZXN0X3NvY2sgKGZvcm1lcmx5IG9wZW4gcmVxdWVzdCkgaGFzaCB0YWJsZXMuCiAgKi8KLXN0YXRpYyB1MzIgaW5ldDZfc3lucV9oYXNoKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqcmFkZHIsIGNvbnN0IHUxNiBycG9ydCwKK3N0YXRpYyB1MzIgaW5ldDZfc3lucV9oYXNoKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqcmFkZHIsIGNvbnN0IF9fYmUxNiBycG9ydCwKIAkJCSAgIGNvbnN0IHUzMiBybmQsIGNvbnN0IHUxNiBzeW5xX2hzaXplKQogewotCXUzMiBhID0gcmFkZHItPnM2X2FkZHIzMlswXTsKLQl1MzIgYiA9IHJhZGRyLT5zNl9hZGRyMzJbMV07Ci0JdTMyIGMgPSByYWRkci0+czZfYWRkcjMyWzJdOworCXUzMiBhID0gKF9fZm9yY2UgdTMyKXJhZGRyLT5zNl9hZGRyMzJbMF07CisJdTMyIGIgPSAoX19mb3JjZSB1MzIpcmFkZHItPnM2X2FkZHIzMlsxXTsKKwl1MzIgYyA9IChfX2ZvcmNlIHUzMilyYWRkci0+czZfYWRkcjMyWzJdOwogCiAJYSArPSBKSEFTSF9HT0xERU5fUkFUSU87CiAJYiArPSBKSEFTSF9HT0xERU5fUkFUSU87CiAJYyArPSBybmQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKLQlhICs9IHJhZGRyLT5zNl9hZGRyMzJbM107Ci0JYiArPSAodTMyKXJwb3J0OworCWEgKz0gKF9fZm9yY2UgdTMyKXJhZGRyLT5zNl9hZGRyMzJbM107CisJYiArPSAoX19mb3JjZSB1MzIpcnBvcnQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKIAlyZXR1cm4gYyAmIChzeW5xX2hzaXplIC0gMSk7CkBAIC03Myw3ICs3Myw3IEBACiAKIHN0cnVjdCByZXF1ZXN0X3NvY2sgKmluZXQ2X2Nza19zZWFyY2hfcmVxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqKnByZXZwLAotCQkJCQkgIGNvbnN0IF9fdTE2IHJwb3J0LAorCQkJCQkgIGNvbnN0IF9fYmUxNiBycG9ydCwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIsCiAJCQkJCSAgY29uc3QgaW50IGlpZikKQEAgLTEzOSw5ICsxMzksOCBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0Nl9jc2tfYWRkcjJzb2NrYWRkcik7CiAKLWludCBpbmV0Nl9jc2tfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaXBmcmFnb2spCitpbnQgaW5ldDZfY3NrX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLCBpbnQgaXBmcmFnb2spCiB7Ci0Jc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBmbG93aSBmbDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYyBiL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYwppbmRleCA4YWNjZDFmLi5iN2U1YmFlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMKKysrIGIvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jCkBAIC01Nyw3ICs1Nyw3IEBACiAgKi8KIHN0cnVjdCBzb2NrICpfX2luZXQ2X2xvb2t1cF9lc3RhYmxpc2hlZChzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCSAgIGNvbnN0IHUxNiBzcG9ydCwKKwkJCQkJICAgY29uc3QgX19iZTE2IHNwb3J0LAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAogCQkJCQkgICBjb25zdCB1MTYgaG51bSwKIAkJCQkJICAgY29uc3QgaW50IGRpZikKQEAgLTE0Niw4ICsxNDYsOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldDZfbG9va3VwX2xpc3RlbmVyKTsKIAogc3RydWN0IHNvY2sgKmluZXQ2X2xvb2t1cChzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sCi0JCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIGNvbnN0IHUxNiBzcG9ydCwKLQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgY29uc3QgdTE2IGRwb3J0LAorCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBfX2JlMTYgc3BvcnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIGNvbnN0IF9fYmUxNiBkcG9ydCwKIAkJCSAgY29uc3QgaW50IGRpZikKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggZjk4Y2EzMC4uYmY1MjYxMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMTM5LDkgKzEzOSw5IEBACiAgKgl0ZXN0IGJpdAogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBhZGRyX2JpdF9zZXQodm9pZCAqdG9rZW4sIGludCBmbl9iaXQpCitzdGF0aWMgX19pbmxpbmVfXyBfX2JlMzIgYWRkcl9iaXRfc2V0KHZvaWQgKnRva2VuLCBpbnQgZm5fYml0KQogewotCV9fdTMyICphZGRyID0gdG9rZW47CisJX19iZTMyICphZGRyID0gdG9rZW47CiAKIAlyZXR1cm4gaHRvbmwoMSA8PCAoKH5mbl9iaXQpJjB4MUYpKSAmIGFkZHJbZm5fYml0Pj41XTsKIH0KQEAgLTQzNCw3ICs0MzQsNyBAQAogCXN0cnVjdCBmaWI2X25vZGUgKnBuID0gTlVMTDsKIAlzdHJ1Y3QgcnQ2a2V5ICprZXk7CiAJaW50CWJpdDsKLSAgICAgICAJaW50CWRpciA9IDA7CisgICAgICAgCV9fYmUzMglkaXIgPSAwOwogCV9fdTMyCXNlcm51bSA9IGZpYjZfbmV3X3Nlcm51bSgpOwogCiAJUlQ2X1RSQUNFKCJmaWI2X2FkZF8xXG4iKTsKQEAgLTgyOSw3ICs4MjksNyBAQAogCQkJCQlzdHJ1Y3QgbG9va3VwX2FyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IGZpYjZfbm9kZSAqZm47Ci0JaW50IGRpcjsKKwlfX2JlMzIgZGlyOwogCiAJaWYgKHVubGlrZWx5KGFyZ3MtPm9mZnNldCA9PSAwKSkKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKaW5kZXggNmQ0NTMzYi4uNjI0ZmFlMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCisrKyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwpAQCAtNjEsNyArNjEsNyBAQAogc3RhdGljIERFRklORV9SV0xPQ0soaXA2X3NrX2ZsX2xvY2spOwogCiAKLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpcDZfZmxvd2xhYmVsICogX19mbF9sb29rdXAodTMyIGxhYmVsKQorc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwNl9mbG93bGFiZWwgKiBfX2ZsX2xvb2t1cChfX2JlMzIgbGFiZWwpCiB7CiAJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsOwogCkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqIGZsX2xvb2t1cCh1MzIgbGFiZWwpCitzdGF0aWMgc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbF9sb29rdXAoX19iZTMyIGxhYmVsKQogewogCXN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbDsKIApAQCAtMTUzLDcgKzE1Myw3IEBACiAJd3JpdGVfdW5sb2NrKCZpcDZfZmxfbG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgZmxfaW50ZXJuKHN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbCwgX191MzIgbGFiZWwpCitzdGF0aWMgaW50IGZsX2ludGVybihzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwsIF9fYmUzMiBsYWJlbCkKIHsKIAlmbC0+bGFiZWwgPSBsYWJlbCAmIElQVjZfRkxPV0xBQkVMX01BU0s7CiAKQEAgLTE4Miw3ICsxODIsNyBAQAogCiAvKiBTb2NrZXQgZmxvd2xhYmVsIGxpc3RzICovCiAKLXN0cnVjdCBpcDZfZmxvd2xhYmVsICogZmw2X3NvY2tfbG9va3VwKHN0cnVjdCBzb2NrICpzaywgdTMyIGxhYmVsKQorc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbDZfc29ja19sb29rdXAoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgbGFiZWwpCiB7CiAJc3RydWN0IGlwdjZfZmxfc29ja2xpc3QgKnNmbDsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCmluZGV4IDZiOGU2ZDcuLmFkMGI4YWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9pbnB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCkBAIC02MCwxNCArNjAsMjIgQEAKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyOwogCXUzMiAJCXBrdF9sZW47CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKIAotCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVEhFUkhPU1QpCi0JCWdvdG8gZHJvcDsKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CiAKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOUkVDRUlWRVMpOworCXJjdV9yZWFkX2xvY2soKTsKKworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKKworCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5SRUNFSVZFUyk7CiAKIAlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg0LDcgKzkyLDcgQEAKIAkgKiBhcnJpdmVkIHZpYSB0aGUgc2VuZGluZyBpbnRlcmZhY2UgKGV0aFgpLCBiZWNhdXNlIG9mIHRoZQogCSAqIG5hdHVyZSBvZiBzY29waW5nIGFyY2hpdGVjdHVyZS4gLS15b3NoZnVqaQogCSAqLwotCUlQNkNCKHNrYiktPmlpZiA9IHNrYi0+ZHN0ID8gKChzdHJ1Y3QgcnQ2X2luZm8gKilza2ItPmRzdCktPnJ0NmlfaWRldi0+ZGV2LT5pZmluZGV4IDogZGV2LT5pZmluZGV4OworCUlQNkNCKHNrYiktPmlpZiA9IHNrYi0+ZHN0ID8gaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KS0+ZGV2LT5pZmluZGV4IDogZGV2LT5pZmluZGV4OwogCiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKSkpCiAJCWdvdG8gZXJyOwpAQCAtMTA0LDcgKzExMiw3IEBACiAJCWlmIChwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA+IHNrYi0+bGVuKQogCQkJZ290byB0cnVuY2F0ZWQ7CiAJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCBwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpIHsKLQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlnb3RvIGRyb3A7CiAJCX0KIAkJaGRyID0gc2tiLT5uaC5pcHY2aDsKQEAgLTExMiwxNyArMTIwLDIxIEBACiAKIAlpZiAoaGRyLT5uZXh0aGRyID09IE5FWFRIRFJfSE9QKSB7CiAJCWlmIChpcHY2X3BhcnNlX2hvcG9wdHMoJnNrYikgPCAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAorCXJjdV9yZWFkX3VubG9jaygpOworCiAJcmV0dXJuIE5GX0hPT0soUEZfSU5FVDYsTkZfSVA2X1BSRV9ST1VUSU5HLCBza2IsIGRldiwgTlVMTCwgaXA2X3Jjdl9maW5pc2gpOwogdHJ1bmNhdGVkOgotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CiBlcnI6Ci0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiBkcm9wOgorCXJjdV9yZWFkX3VubG9jaygpOwogCWtmcmVlX3NrYihza2IpOwogb3V0OgogCXJldHVybiAwOwpAQCAtMTQwLDYgKzE1Miw3IEBACiAJdW5zaWduZWQgaW50IG5ob2ZmOwogCWludCBuZXh0aGRyOwogCXU4IGhhc2g7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKIAogCS8qCiAJICoJUGFyc2UgZXh0ZW5zaW9uIGhlYWRlcnMKQEAgLTE0Nyw2ICsxNjAsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogcmVzdWJtaXQ6CisJaWRldiA9IGlwNl9kc3RfaWRldihza2ItPmRzdCk7CiAJaWYgKCFwc2tiX3B1bGwoc2tiLCBza2ItPmgucmF3IC0gc2tiLT5kYXRhKSkKIAkJZ290byBkaXNjYXJkOwogCW5ob2ZmID0gSVA2Q0Ioc2tiKS0+bmhvZmY7CkBAIC0xODUsMjQgKzE5OSwyNCBAQAogCQlpZiAocmV0ID4gMCkKIAkJCWdvdG8gcmVzdWJtaXQ7CiAJCWVsc2UgaWYgKHJldCA9PSAwKQotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkRFTElWRVJTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5ERUxJVkVSUyk7CiAJfSBlbHNlIHsKIAkJaWYgKCFyYXdfc2spIHsKIAkJCWlmICh4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKLQkJCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOVU5LTk9XTlBST1RPUyk7CisJCQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTlVOS05PV05QUk9UT1MpOwogCQkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKIAkJCQkgICAgICAgICAgICBJQ01QVjZfVU5LX05FWFRIRFIsIG5ob2ZmLAogCQkJCSAgICAgICAgICAgIHNrYi0+ZGV2KTsKIAkJCX0KIAkJfSBlbHNlCi0JCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkRFTElWRVJTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAwOwogCiBkaXNjYXJkOgotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CisJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTIxOSw3ICsyMzMsNyBAQAogCXN0cnVjdCBpcHY2aGRyICpoZHI7CiAJaW50IGRlbGl2ZXI7CiAKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOTUNBU1RQS1RTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOTUNBU1RQS1RTKTsKIAogCWhkciA9IHNrYi0+bmguaXB2Nmg7CiAJZGVsaXZlciA9IGxpa2VseSghKHNrYi0+ZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQ3xJRkZfQUxMTVVMVEkpKSkgfHwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCA2NjcxNjkxLi5lMDVlY2JiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC04OCw3ICs4OCw3IEBACiAJfSBlbHNlIGlmIChkc3QtPm5laWdoYm91cikKIAkJcmV0dXJuIGRzdC0+bmVpZ2hib3VyLT5vdXRwdXQoc2tiKTsKIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTE4LDYgKzExOCw3IEBACiAKIAlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpKSB7CiAJCXN0cnVjdCBpcHY2X3BpbmZvKiBucCA9IHNrYi0+c2sgPyBpbmV0Nl9zayhza2ItPnNrKSA6IE5VTEw7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpOwogCiAJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spICYmICghbnAgfHwgbnAtPm1jX2xvb3ApICYmCiAJCSAgICBpcHY2X2Noa19tY2FzdF9hZGRyKGRldiwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLApAQCAtMTMzLDEzICsxMzQsMTMgQEAKIAkJCQkJaXA2X2Rldl9sb29wYmFja194bWl0KTsKIAogCQkJaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCA9PSAwKSB7Ci0JCQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCQkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KIAotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CisJCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKTsKIAl9CiAKIAlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X1BPU1RfUk9VVElORywgc2tiLE5VTEwsIHNrYi0+ZGV2LGlwNl9vdXRwdXRfZmluaXNoKTsKQEAgLTE4MiwxMiArMTgzLDE0IEBACiAKIAkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgaGVhZF9yb29tKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgaGVhZF9yb29tKTsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJc2tiID0gc2tiMjsKLQkJCWlmIChza2IgPT0gTlVMTCkgewkKLQkJCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJCWlmIChza2IyID09IE5VTEwpIHsKKwkJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSAgICAgIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IHNrYjI7CiAJCQlpZiAoc2spCiAJCQkJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOwogCQl9CkBAIC0yMTcsNyArMjIwLDcgQEAKIAlpZiAodGNsYXNzIDwgMCkKIAkJdGNsYXNzID0gMDsKIAotCSoodTMyICopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCB8ICh0Y2xhc3MgPDwgMjApKSB8IGZsLT5mbDZfZmxvd2xhYmVsOworCSooX19iZTMyICopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCB8ICh0Y2xhc3MgPDwgMjApKSB8IGZsLT5mbDZfZmxvd2xhYmVsOwogCiAJaGRyLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNlZ19sZW4pOwogCWhkci0+bmV4dGhkciA9IHByb3RvOwpAQCAtMjMwLDcgKzIzMyw4IEBACiAKIAltdHUgPSBkc3RfbXR1KGRzdCk7CiAJaWYgKChza2ItPmxlbiA8PSBtdHUpIHx8IGlwZnJhZ29rIHx8IHNrYl9pc19nc28oc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJICAgICAgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCQlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwKIAkJCQlkc3Rfb3V0cHV0KTsKIAl9CkBAIC0yMzksNyArMjQzLDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIklQdjY6IHNlbmRpbmcgcGt0X3Rvb19iaWcgdG8gc2VsZlxuIik7CiAJc2tiLT5kZXYgPSBkc3QtPmRldjsKIAlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIHNrYi0+ZGV2KTsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtRU1TR1NJWkU7CiB9CkBAIC0yNjcsNyArMjcxLDcgQEAKIAloZHIgPSAoc3RydWN0IGlwdjZoZHIgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCXNrYi0+bmguaXB2NmggPSBoZHI7CiAKLQkqKHUzMiopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCk7CisJKihfX2JlMzIqKWhkciA9IGh0b25sKDB4NjAwMDAwMDApOwogCiAJaGRyLT5wYXlsb2FkX2xlbiA9IGh0b25zKGxlbik7CiAJaGRyLT5uZXh0aGRyID0gcHJvdG87CkBAIC0zNzMsNyArMzc3LDcgQEAKIAkJZ290byBlcnJvcjsKIAogCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0ZXRCwgc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJZ290byBkcm9wOwogCX0KIApAQCAtNDA2LDcgKzQxMCw3IEBACiAJCXNrYi0+ZGV2ID0gZHN0LT5kZXY7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0hPUExJTUlULAogCQkJICAgIDAsIHNrYi0+ZGV2KTsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC00MTksMTMgKzQyMywxMyBAQAogCQlpZiAocHJveGllZCA+IDApCiAJCQlyZXR1cm4gaXA2X2lucHV0KHNrYik7CiAJCWVsc2UgaWYgKHByb3hpZWQgPCAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CiAJCQlnb3RvIGRyb3A7CiAJCX0KIAl9CiAKIAlpZiAoIXhmcm02X3JvdXRlX2ZvcndhcmQoc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJZ290byBkcm9wOwogCX0KIAlkc3QgPSBza2ItPmRzdDsKQEAgLTQ2NCwxNCArNDY4LDE0IEBACiAJCS8qIEFnYWluLCBmb3JjZSBPVVRQVVQgZGV2aWNlIHVzZWQgYXMgc291cmNlIGFkZHJlc3MgKi8KIAkJc2tiLT5kZXYgPSBkc3QtPmRldjsKIAkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgZHN0X210dShkc3QpLCBza2ItPmRldik7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5UT09CSUdFUlJPUlMpOwotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOVE9PQklHRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRU1TR1NJWkU7CiAJfQogCiAJaWYgKHNrYl9jb3coc2tiLCBkc3QtPmRldi0+aGFyZF9oZWFkZXJfbGVuKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCQlnb3RvIGRyb3A7CiAJfQogCkBAIC00ODEsMTEgKzQ4NSwxMSBAQAogIAogCWhkci0+aG9wX2xpbWl0LS07CiAKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOwogCXJldHVybiBORl9IT09LKFBGX0lORVQ2LE5GX0lQNl9GT1JXQVJELCBza2IsIHNrYi0+ZGV2LCBkc3QtPmRldiwgaXA2X2ZvcndhcmRfZmluaXNoKTsKIAogZXJyb3I6Ci0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiBkcm9wOgogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtRUlOVkFMOwpAQCAtNDk5LDEyICs1MDMsMTIgQEAKIAlkc3RfcmVsZWFzZSh0by0+ZHN0KTsKIAl0by0+ZHN0ID0gZHN0X2Nsb25lKGZyb20tPmRzdCk7CiAJdG8tPmRldiA9IGZyb20tPmRldjsKKwl0by0+bWFyayA9IGZyb20tPm1hcms7CiAKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJdG8tPnRjX2luZGV4ID0gZnJvbS0+dGNfaW5kZXg7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JdG8tPm5mbWFyayA9IGZyb20tPm5mbWFyazsKIAkvKiBDb25uZWN0aW9uIGFzc29jaWF0aW9uIGlzIHNhbWUgYXMgcHJlLWZyYWcgcGFja2V0ICovCiAJbmZfY29ubnRyYWNrX3B1dCh0by0+bmZjdCk7CiAJdG8tPm5mY3QgPSBmcm9tLT5uZmN0OwpAQCAtNTcxLDcgKzU3NSw3IEBACiAJc3RydWN0IGlwdjZoZHIgKnRtcF9oZHI7CiAJc3RydWN0IGZyYWdfaGRyICpmaDsKIAl1bnNpZ25lZCBpbnQgbXR1LCBobGVuLCBsZWZ0LCBsZW47Ci0JdTMyIGZyYWdfaWQgPSAwOworCV9fYmUzMiBmcmFnX2lkID0gMDsKIAlpbnQgcHRyLCBvZmZzZXQgPSAwLCBlcnI9MDsKIAl1OCAqcHJldmhkciwgbmV4dGhkciA9IDA7CiAKQEAgLTYyMCwxNCArNjI0LDEzIEBACiAJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gTlVMTDsKIAkJLyogQlVJTEQgSEVBREVSICovCiAKLQkJdG1wX2hkciA9IGttYWxsb2MoaGxlbiwgR0ZQX0FUT01JQyk7CisJCXRtcF9oZHIgPSBrbWVtZHVwKHNrYi0+bmgucmF3LCBobGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCF0bXBfaGRyKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCSpwcmV2aGRyID0gTkVYVEhEUl9GUkFHTUVOVDsKLQkJbWVtY3B5KHRtcF9oZHIsIHNrYi0+bmgucmF3LCBobGVuKTsKIAkJX19za2JfcHVsbChza2IsIGhsZW4pOwogCQlmaCA9IChzdHJ1Y3QgZnJhZ19oZHIqKV9fc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CiAJCXNrYi0+bmgucmF3ID0gX19za2JfcHVzaChza2IsIGhsZW4pOwpAQCAtNjQzLDcgKzY0Niw4IEBACiAJCXNrYi0+ZGF0YV9sZW4gPSBmaXJzdF9sZW4gLSBza2JfaGVhZGxlbihza2IpOwogCQlza2ItPmxlbiA9IGZpcnN0X2xlbjsKIAkJc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhmaXJzdF9sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLSAKKworCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKIAogCQlmb3IgKDs7KSB7CiAJCQkvKiBQcmVwYXJlIGhlYWRlciBvZiB0aGUgbmV4dCBmcmFtZSwKQEAgLTY2Nyw3ICs2NzEsNyBAQAogCQkJCiAJCQllcnIgPSBvdXRwdXQoc2tiKTsKIAkJCWlmKCFlcnIpCi0JCQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyk7CisJCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoJnJ0LT51LmRzdCksIElQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTKTsKIAogCQkJaWYgKGVyciB8fCAhZnJhZykKIAkJCQlicmVhazsKQEAgLTY4MCw3ICs2ODQsOCBAQAogCQlrZnJlZSh0bXBfaGRyKTsKIAogCQlpZiAoZXJyID09IDApIHsKLQkJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR09LUyk7CisJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldigmcnQtPnUuZHN0KSwgSVBTVEFUU19NSUJfRlJBR09LUyk7CisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTY5MCw3ICs2OTUsOCBAQAogCQkJZnJhZyA9IHNrYjsKIAkJfQogCi0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoJnJ0LT51LmRzdCksIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzIzLDcgKzcyOSw4IEBACiAKIAkJaWYgKChmcmFnID0gYWxsb2Nfc2tiKGxlbitobGVuK3NpemVvZihzdHJ1Y3QgZnJhZ19oZHIpK0xMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQkJTkVUREVCVUcoS0VSTl9JTkZPICJJUHY2OiBmcmFnOiBubyBtZW1vcnkgZm9yIG5ldyBmcmFnbWVudCFcbiIpOwotCQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCSAgICAgIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsOwogCQl9CkBAIC03ODQsMTUgKzc5MSwxNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBmYWlsOwogCi0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0NSRUFURVMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTKTsKIAl9CisJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkgICAgICBJUFNUQVRTX01JQl9GUkFHT0tTKTsKIAlrZnJlZV9za2Ioc2tiKTsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdPS1MpOwogCXJldHVybiBlcnI7CiAKIGZhaWw6CisJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkgICAgICBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCWtmcmVlX3NrYihza2IpOyAKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTI2NSw3ICsxMjc0LDcgQEAKIAlyZXR1cm4gMDsKIGVycm9yOgogCWluZXQtPmNvcmsubGVuZ3RoIC09IGxlbmd0aDsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwlJUDZfSU5DX1NUQVRTKHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMzExLDcgKzEzMjAsNyBAQAogCiAJc2tiLT5uaC5pcHY2aCA9IGhkciA9IChzdHJ1Y3QgaXB2NmhkciopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCi0JKih1MzIqKWhkciA9IGZsLT5mbDZfZmxvd2xhYmVsIHwKKwkqKF9fYmUzMiopaGRyID0gZmwtPmZsNl9mbG93bGFiZWwgfAogCQkgICAgIGh0b25sKDB4NjAwMDAwMDAgfCAoKGludClucC0+Y29yay50Y2xhc3MgPDwgMjApKTsKIAogCWlmIChza2ItPmxlbiA8PSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgSVBWNl9NQVhQTEVOKQpAQCAtMTMyNiw3ICsxMzM1LDcgQEAKIAlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OwogCiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CQorCUlQNl9JTkNfU1RBVFMocnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kc3QtPmRldiwgZHN0X291dHB1dCk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID4gMCkKQEAgLTEzNTcsNyArMTM2Niw4IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7Ci0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkgICAgICBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IGI5ZjQwMjkuLjhkOTE4MzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogI2RlZmluZSBIQVNIX1NJWkUgIDMyCiAKLSNkZWZpbmUgSEFTSChhZGRyKSAoKChhZGRyKS0+czZfYWRkcjMyWzBdIF4gKGFkZHIpLT5zNl9hZGRyMzJbMV0gXiBcCisjZGVmaW5lIEhBU0goYWRkcikgKChfX2ZvcmNlIHUzMikoKGFkZHIpLT5zNl9hZGRyMzJbMF0gXiAoYWRkciktPnM2X2FkZHIzMlsxXSBeIFwKIAkgICAgICAgICAgICAgKGFkZHIpLT5zNl9hZGRyMzJbMl0gXiAoYWRkciktPnM2X2FkZHIzMlszXSkgJiBcCiAgICAgICAgICAgICAgICAgICAgIChIQVNIX1NJWkUgLSAxKSkKIApAQCAtMjE1LDExICsyMTUsMTAgQEAKICAqICAgQ3JlYXRlIHR1bm5lbCBtYXRjaGluZyBnaXZlbiBwYXJhbWV0ZXJzLgogICogCiAgKiBSZXR1cm46IAotICogICAwIG9uIHN1Y2Nlc3MKKyAqICAgY3JlYXRlZCB0dW5uZWwgb3IgTlVMTAogICoqLwogCi1zdGF0aWMgaW50Ci1pcDZfdG5sX2NyZWF0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwLCBzdHJ1Y3QgaXA2X3RubCAqKnB0KQorc3RhdGljIHN0cnVjdCBpcDZfdG5sICppcDZfdG5sX2NyZWF0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGlwNl90bmwgKnQ7CkBAIC0yMzYsMTEgKzIzNSwxMSBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChpID09IElQNl9UTkxfTUFYKSAKLQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCWdvdG8gZmFpbGVkOwogCX0KIAlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mICgqdCksIG5hbWUsIGlwNmlwNl90bmxfZGV2X3NldHVwKTsKIAlpZiAoZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIGZhaWxlZDsKIAogCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCWRldi0+aW5pdCA9IGlwNmlwNl90bmxfZGV2X2luaXQ7CkBAIC0yNDgsMTMgKzI0NywxMyBAQAogCiAJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSkgPCAwKSB7CiAJCWZyZWVfbmV0ZGV2KGRldik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZmFpbGVkOwogCX0KIAlkZXZfaG9sZChkZXYpOwotCiAJaXA2aXA2X3RubF9saW5rKHQpOwotCSpwdCA9IHQ7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHQ7CitmYWlsZWQ6CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpAQCAtMjY4LDMyICsyNjcsMjMgQEAKICAqICAgdHVubmVsIGRldmljZSBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGZvciB1c2UuCiAgKgogICogUmV0dXJuOgotICogICAwIGlmIHR1bm5lbCBsb2NhdGVkIG9yIGNyZWF0ZWQsCi0gKiAgIC1FSU5WQUwgaWYgcGFyYW1ldGVycyBpbmNvcnJlY3QsCi0gKiAgIC1FTk9ERVYgaWYgbm8gbWF0Y2hpbmcgdHVubmVsIGF2YWlsYWJsZQorICogICBtYXRjaGluZyB0dW5uZWwgb3IgTlVMTAogICoqLwogCi1zdGF0aWMgaW50Ci1pcDZpcDZfdG5sX2xvY2F0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwLCBzdHJ1Y3QgaXA2X3RubCAqKnB0LCBpbnQgY3JlYXRlKQorc3RhdGljIHN0cnVjdCBpcDZfdG5sICppcDZpcDZfdG5sX2xvY2F0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwLCBpbnQgY3JlYXRlKQogewogCXN0cnVjdCBpbjZfYWRkciAqcmVtb3RlID0gJnAtPnJhZGRyOwogCXN0cnVjdCBpbjZfYWRkciAqbG9jYWwgPSAmcC0+bGFkZHI7CiAJc3RydWN0IGlwNl90bmwgKnQ7CiAKLQlpZiAocC0+cHJvdG8gIT0gSVBQUk9UT19JUFY2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWZvciAodCA9ICppcDZpcDZfYnVja2V0KHApOyB0OyB0ID0gdC0+bmV4dCkgewogCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKGxvY2FsLCAmdC0+cGFybXMubGFkZHIpICYmCi0JCSAgICBpcHY2X2FkZHJfZXF1YWwocmVtb3RlLCAmdC0+cGFybXMucmFkZHIpKSB7Ci0JCQkqcHQgPSB0OwotCQkJcmV0dXJuIChjcmVhdGUgPyAtRUVYSVNUIDogMCk7Ci0JCX0KKwkJICAgIGlwdjZfYWRkcl9lcXVhbChyZW1vdGUsICZ0LT5wYXJtcy5yYWRkcikpCisJCQlyZXR1cm4gdDsKIAl9CiAJaWYgKCFjcmVhdGUpCi0JCXJldHVybiAtRU5PREVWOwotCQotCXJldHVybiBpcDZfdG5sX2NyZWF0ZShwLCBwdCk7CisJCXJldHVybiBOVUxMOworCXJldHVybiBpcDZfdG5sX2NyZWF0ZShwKTsKIH0KIAogLyoqCkBAIC0zOTEsNyArMzgxLDcgQEAKIAogc3RhdGljIGludAogaXA2aXA2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCisJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSAoc3RydWN0IGlwdjZoZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBpcDZfdG5sICp0OwpAQCAtNDM0LDEyICs0MjQsOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSUNNUFY2X1BBUkFNUFJPQjoKLQkJLyogaWdub3JlIGlmIHBhcmFtZXRlciBwcm9ibGVtIG5vdCBjYXVzZWQgYnkgYSB0dW5uZWwKLQkJICAgZW5jYXBzdWxhdGlvbiBsaW1pdCBzdWItb3B0aW9uICovCi0JCWlmIChjb2RlICE9IElDTVBWNl9IRFJfRklFTEQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCXRlbGkgPSBwYXJzZV90bHZfdG5sX2VuY19saW0oc2tiLCBza2ItPmRhdGEpOworCQl0ZWxpID0gMDsKKwkJaWYgKGNvZGUgPT0gSUNNUFY2X0hEUl9GSUVMRCkKKwkJCXRlbGkgPSBwYXJzZV90bHZfdG5sX2VuY19saW0oc2tiLCBza2ItPmRhdGEpOwogCiAJCWlmICh0ZWxpICYmIHRlbGkgPT0gbnRvaGwoaW5mbykgLSAyKSB7CiAJCQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopICZza2ItPmRhdGFbdGVsaV07CkBAIC00NTEsNiArNDM4LDEwIEBACiAJCQkJCSAgICAgICAidHVubmVsIVxuIiwgdC0+cGFybXMubmFtZSk7CiAJCQkJcmVsX21zZyA9IDE7CiAJCQl9CisJCX0gZWxzZSBpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBSZWNpcGllbnQgdW5hYmxlIHRvIHBhcnNlIHR1bm5lbGVkICIKKwkJCSAgICAgICAicGFja2V0IVxuICIsIHQtPnBhcm1zLm5hbWUpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSUNNUFY2X1BLVF9UT09CSUc6CkBAIC00NzAsNiArNDYxLDcgQEAKIAlpZiAocmVsX21zZyAmJiAgcHNrYl9tYXlfcHVsbChza2IsIG9mZnNldCArIHNpemVvZiAoKmlwdjZoKSkpIHsKIAkJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwogCQlpZiAoIXNrYjIpCiAJCQlnb3RvIG91dDsKIApAQCAtNTA0LDYgKzQ5NiwyNyBAQAogCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKG91dGVyX2lwaCkpKQogCQlJUDZfRUNOX3NldF9jZShpbm5lcl9pcGgpOwogfQorc3RhdGljIGlubGluZSBpbnQgaXA2X3RubF9yY3ZfY3RsKHN0cnVjdCBpcDZfdG5sICp0KQoreworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CisJaW50IHJldCA9IDA7CisKKwlpZiAocC0+ZmxhZ3MgJiBJUDZfVE5MX0ZfQ0FQX1JDVikgeworICAgIAkJc3RydWN0IG5ldF9kZXZpY2UgKmxkZXYgPSBOVUxMOworCisJCWlmIChwLT5saW5rKQorCQkJbGRldiA9IGRldl9nZXRfYnlfaW5kZXgocC0+bGluayk7CisKKwkJaWYgKChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZwLT5sYWRkcikgfHwKKwkJICAgICBsaWtlbHkoaXB2Nl9jaGtfYWRkcigmcC0+bGFkZHIsIGxkZXYsIDApKSkgJiYKKwkJICAgIGxpa2VseSghaXB2Nl9jaGtfYWRkcigmcC0+cmFkZHIsIE5VTEwsIDApKSkKKwkJCXJldCA9IDE7CisKKwkJaWYgKGxkZXYpCisJCQlkZXZfcHV0KGxkZXYpOworCX0KKwlyZXR1cm4gcmV0OworfQogCiAvKioKICAqIGlwNmlwNl9yY3YgLSBkZWNhcHN1bGF0ZSBJUHY2IHBhY2tldCBhbmQgcmV0cmFuc21pdCBpdCBsb2NhbGx5CkBAIC01MjgsNyArNTQxLDcgQEAKIAkJCWdvdG8gZGlzY2FyZDsKIAkJfQogCi0JCWlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0NBUF9SQ1YpKSB7CisJCWlmICghaXA2X3RubF9yY3ZfY3RsKHQpKSB7CiAJCQl0LT5zdGF0LnJ4X2Ryb3BwZWQrKzsKIAkJCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7CiAJCQlnb3RvIGRpc2NhcmQ7CkBAIC01NjAsMzEgKzU3MywyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqY3JlYXRlX3RlbChfX3U4IGVuY2FwX2xpbWl0KQorc3RydWN0IGlwdjZfdGVsX3R4b3B0aW9uIHsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgb3BzOworCV9fdTggZHN0X29wdFs4XTsKK307CisKK3N0YXRpYyB2b2lkIGluaXRfdGVsX3R4b3B0KHN0cnVjdCBpcHY2X3RlbF90eG9wdGlvbiAqb3B0LCBfX3U4IGVuY2FwX2xpbWl0KQogewotCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOwotCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0OwotCV9fdTggKnJhdzsKKwltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwdjZfdGVsX3R4b3B0aW9uKSk7CiAKLQlpbnQgb3B0X2xlbiA9IHNpemVvZigqb3B0KSArIDg7CisJb3B0LT5kc3Rfb3B0WzJdID0gSVBWNl9UTFZfVE5MX0VOQ0FQX0xJTUlUOworCW9wdC0+ZHN0X29wdFszXSA9IDE7CisJb3B0LT5kc3Rfb3B0WzRdID0gZW5jYXBfbGltaXQ7CisJb3B0LT5kc3Rfb3B0WzVdID0gSVBWNl9UTFZfUEFETjsKKwlvcHQtPmRzdF9vcHRbNl0gPSAxOwogCi0JaWYgKCEob3B0ID0ga3phbGxvYyhvcHRfbGVuLCBHRlBfQVRPTUlDKSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9wdC0+dG90X2xlbiA9IG9wdF9sZW47Ci0Jb3B0LT5kc3Qwb3B0ID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikgKG9wdCArIDEpOwotCW9wdC0+b3B0X25mbGVuID0gODsKLQotCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgKG9wdC0+ZHN0MG9wdCArIDEpOwotCXRlbC0+dHlwZSA9IElQVjZfVExWX1ROTF9FTkNBUF9MSU1JVDsKLQl0ZWwtPmxlbmd0aCA9IDE7Ci0JdGVsLT5lbmNhcF9saW1pdCA9IGVuY2FwX2xpbWl0OwotCi0JcmF3ID0gKF9fdTggKikgb3B0LT5kc3Qwb3B0OwotCXJhd1s1XSA9IElQVjZfVExWX1BBRE47Ci0JcmF3WzZdID0gMTsKLQotCXJldHVybiBvcHQ7CisJb3B0LT5vcHMuZHN0MG9wdCA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopIG9wdC0+ZHN0X29wdDsKKwlvcHQtPm9wcy5vcHRfbmZsZW4gPSA4OwogfQogCiAvKioKQEAgLTYwNyw2ICs2MTIsMzQgQEAKIAlyZXR1cm4gaXB2Nl9hZGRyX2VxdWFsKCZ0LT5wYXJtcy5yYWRkciwgJmhkci0+c2FkZHIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpcDZfdG5sX3htaXRfY3RsKHN0cnVjdCBpcDZfdG5sICp0KQoreworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CisJaW50IHJldCA9IDA7CisKKyAJaWYgKHAtPmZsYWdzICYgSVA2X1ROTF9GX0NBUF9YTUlUKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpsZGV2ID0gTlVMTDsKKworCQlpZiAocC0+bGluaykKKwkJCWxkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHAtPmxpbmspOworCisJCWlmICh1bmxpa2VseSghaXB2Nl9jaGtfYWRkcigmcC0+bGFkZHIsIGxkZXYsIDApKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXMgeG1pdDogTG9jYWwgYWRkcmVzcyBub3QgeWV0IGNvbmZpZ3VyZWQhXG4iLAorCQkJICAgICAgIHAtPm5hbWUpOworCQllbHNlIGlmICghaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmcC0+cmFkZHIpICYmCisJCQkgdW5saWtlbHkoaXB2Nl9jaGtfYWRkcigmcC0+cmFkZHIsIE5VTEwsIDApKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXMgeG1pdDogUm91dGluZyBsb29wISAiCisJCQkgICAgICAgIlJlbW90ZSBhZGRyZXNzIGZvdW5kIG9uIHRoaXMgbm9kZSFcbiIsCisJCQkgICAgICAgcC0+bmFtZSk7CisJCWVsc2UKKwkJCXJldCA9IDE7CisJCWlmIChsZGV2KQorCQkJZGV2X3B1dChsZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKK30KIC8qKgogICogaXA2aXA2X3RubF94bWl0IC0gZW5jYXBzdWxhdGUgcGFja2V0IGFuZCBzZW5kIAogICogICBAc2tiOiB0aGUgb3V0Z29pbmcgc29ja2V0IGJ1ZmZlcgpAQCAtNjI2LDggKzY1OSw4IEBACiAJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0LT5zdGF0OwogCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IHNrYi0+bmguaXB2Nmg7Ci0Jc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQgPSBOVUxMOwogCWludCBlbmNhcF9saW1pdCA9IC0xOworCXN0cnVjdCBpcHY2X3RlbF90eG9wdGlvbiBvcHQ7CiAJX191MTYgb2Zmc2V0OwogCXN0cnVjdCBmbG93aSBmbDsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CkBAIC02NDQsMTAgKzY3Nyw5IEBACiAJCWdvdG8gdHhfZXJyOwogCX0KIAlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSB8fAotCSAgICAhKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0NBUF9YTUlUKSB8fAotCSAgICBpcDZpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKSB7CisJICAgICFpcDZfdG5sX3htaXRfY3RsKHQpIHx8IGlwNmlwNl90bmxfYWRkcl9jb25mbGljdCh0LCBpcHY2aCkpCiAJCWdvdG8gdHhfZXJyOwotCX0KKwogCWlmICgob2Zmc2V0ID0gcGFyc2VfdGx2X3RubF9lbmNfbGltKHNrYiwgc2tiLT5uaC5yYXcpKSA+IDApIHsKIAkJc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICp0ZWw7CiAJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnNrYi0+bmgucmF3W29mZnNldF07CkBAIC02NTcsMjAgKzY4OSwxNyBAQAogCQkJZ290byB0eF9lcnI7CiAJCX0KIAkJZW5jYXBfbGltaXQgPSB0ZWwtPmVuY2FwX2xpbWl0IC0gMTsKLQl9IGVsc2UgaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkgeworCX0gZWxzZSBpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKQogCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OwotCX0KKwogCW1lbWNweSgmZmwsICZ0LT5mbCwgc2l6ZW9mIChmbCkpOwogCXByb3RvID0gZmwucHJvdG87CiAKIAlkc2ZpZWxkID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCk7CiAJaWYgKCh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpKQotCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fdTMyICopIGlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7CisJCWZsLmZsNl9mbG93bGFiZWwgfD0gKCooX19iZTMyICopIGlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7CiAJaWYgKCh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpKQotCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fdTMyICopIGlwdjZoICYgSVBWNl9GTE9XTEFCRUxfTUFTSyk7Ci0KLQlpZiAoZW5jYXBfbGltaXQgPj0gMCAmJiAob3B0ID0gY3JlYXRlX3RlbChlbmNhcF9saW1pdCkpID09IE5VTEwpCi0JCWdvdG8gdHhfZXJyOworCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfRkxPV0xBQkVMX01BU0spOwogCiAJaWYgKChkc3QgPSBpcDZfdG5sX2RzdF9jaGVjayh0KSkgIT0gTlVMTCkKIAkJZHN0X2hvbGQoZHN0KTsKQEAgLTY5Miw3ICs3MjEsNyBAQAogCQlnb3RvIHR4X2Vycl9kc3RfcmVsZWFzZTsKIAl9CiAJbXR1ID0gZHN0X210dShkc3QpIC0gc2l6ZW9mICgqaXB2NmgpOwotCWlmIChvcHQpIHsKKwlpZiAoZW5jYXBfbGltaXQgPj0gMCkgewogCQltYXhfaGVhZHJvb20gKz0gODsKIAkJbXR1IC09IDg7CiAJfQpAQCAtNzMwLDEyICs3NTksMTMgQEAKIAogCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKIAotCWlmIChvcHQpCi0JCWlwdjZfcHVzaF9uZnJhZ19vcHRzKHNrYiwgb3B0LCAmcHJvdG8sIE5VTEwpOwotCisJaWYgKGVuY2FwX2xpbWl0ID49IDApIHsKKwkJaW5pdF90ZWxfdHhvcHQoJm9wdCwgZW5jYXBfbGltaXQpOworCQlpcHY2X3B1c2hfbmZyYWdfb3B0cyhza2IsICZvcHQub3BzLCAmcHJvdG8sIE5VTEwpOworCX0KIAlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJaXB2NmggPSBza2ItPm5oLmlwdjZoOwotCSoodTMyKilpcHY2aCA9IGZsLmZsNl9mbG93bGFiZWwgfCBodG9ubCgweDYwMDAwMDAwKTsKKwkqKF9fYmUzMiopaXB2NmggPSBmbC5mbDZfZmxvd2xhYmVsIHwgaHRvbmwoMHg2MDAwMDAwMCk7CiAJZHNmaWVsZCA9IElORVRfRUNOX2VuY2Fwc3VsYXRlKDAsIGRzZmllbGQpOwogCWlwdjZfY2hhbmdlX2RzZmllbGQoaXB2NmgsIH5JTkVUX0VDTl9NQVNLLCBkc2ZpZWxkKTsKIAlpcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwpAQCAtNzQ4LDcgKzc3OCw3IEBACiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCAKIAkJICAgICAgc2tiLT5kc3QtPmRldiwgZHN0X291dHB1dCk7CiAKLQlpZiAoZXJyID09IE5FVF9YTUlUX1NVQ0NFU1MgfHwgZXJyID09IE5FVF9YTUlUX0NOKSB7CisJaWYgKG5ldF94bWl0X2V2YWwoZXJyKSA9PSAwKSB7CiAJCXN0YXRzLT50eF9ieXRlcyArPSBwa3RfbGVuOwogCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCX0gZWxzZSB7CkBAIC03NTYsOSArNzg2LDYgQEAKIAkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJfQogCWlwNl90bmxfZHN0X3N0b3JlKHQsIGRzdCk7Ci0KLQlrZnJlZShvcHQpOwotCiAJdC0+cmVjdXJzaW9uLS07CiAJcmV0dXJuIDA7CiB0eF9lcnJfbGlua19mYWlsdXJlOgpAQCAtNzY2LDcgKzc5Myw2IEBACiAJZHN0X2xpbmtfZmFpbHVyZShza2IpOwogdHhfZXJyX2RzdF9yZWxlYXNlOgogCWRzdF9yZWxlYXNlKGRzdCk7Ci0Ja2ZyZWUob3B0KTsKIHR4X2VycjoKIAlzdGF0cy0+dHhfZXJyb3JzKys7CiAJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKQEAgLTc3OCwzOSArODA0LDE5IEBACiBzdGF0aWMgdm9pZCBpcDZfdG5sX3NldF9jYXAoc3RydWN0IGlwNl90bmwgKnQpCiB7CiAJc3RydWN0IGlwNl90bmxfcGFybSAqcCA9ICZ0LT5wYXJtczsKLQlzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyID0gJnAtPmxhZGRyOwotCXN0cnVjdCBpbjZfYWRkciAqcmFkZHIgPSAmcC0+cmFkZHI7Ci0JaW50IGx0eXBlID0gaXB2Nl9hZGRyX3R5cGUobGFkZHIpOwotCWludCBydHlwZSA9IGlwdjZfYWRkcl90eXBlKHJhZGRyKTsKKwlpbnQgbHR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmcC0+bGFkZHIpOworCWludCBydHlwZSA9IGlwdjZfYWRkcl90eXBlKCZwLT5yYWRkcik7CiAKIAlwLT5mbGFncyAmPSB+KElQNl9UTkxfRl9DQVBfWE1JVHxJUDZfVE5MX0ZfQ0FQX1JDVik7CiAKLQlpZiAobHR5cGUgIT0gSVBWNl9BRERSX0FOWSAmJiBydHlwZSAhPSBJUFY2X0FERFJfQU5ZICYmCi0JICAgICgobHR5cGV8cnR5cGUpICYKLQkgICAgIChJUFY2X0FERFJfVU5JQ0FTVHwKLQkgICAgICBJUFY2X0FERFJfTE9PUEJBQ0t8SVBWNl9BRERSX0xJTktMT0NBTHwKLQkgICAgICBJUFY2X0FERFJfTUFQUEVEfElQVjZfQUREUl9SRVNFUlZFRCkpID09IElQVjZfQUREUl9VTklDQVNUKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpsZGV2ID0gTlVMTDsKLQkJaW50IGxfb2sgPSAxOwotCQlpbnQgcl9vayA9IDE7Ci0KLQkJaWYgKHAtPmxpbmspCi0JCQlsZGV2ID0gZGV2X2dldF9ieV9pbmRleChwLT5saW5rKTsKLQkJCi0JCWlmIChsdHlwZSZJUFY2X0FERFJfVU5JQ0FTVCAmJiAhaXB2Nl9jaGtfYWRkcihsYWRkciwgbGRldiwgMCkpCi0JCQlsX29rID0gMDsKLQkJCi0JCWlmIChydHlwZSZJUFY2X0FERFJfVU5JQ0FTVCAmJiBpcHY2X2Noa19hZGRyKHJhZGRyLCBOVUxMLCAwKSkKLQkJCXJfb2sgPSAwOwotCQkKLQkJaWYgKGxfb2sgJiYgcl9vaykgewotCQkJaWYgKGx0eXBlJklQVjZfQUREUl9VTklDQVNUKQotCQkJCXAtPmZsYWdzIHw9IElQNl9UTkxfRl9DQVBfWE1JVDsKLQkJCWlmIChydHlwZSZJUFY2X0FERFJfVU5JQ0FTVCkKLQkJCQlwLT5mbGFncyB8PSBJUDZfVE5MX0ZfQ0FQX1JDVjsKLQkJfQotCQlpZiAobGRldikKLQkJCWRldl9wdXQobGRldik7CisJaWYgKGx0eXBlICYgKElQVjZfQUREUl9VTklDQVNUfElQVjZfQUREUl9NVUxUSUNBU1QpICYmCisJICAgIHJ0eXBlICYgKElQVjZfQUREUl9VTklDQVNUfElQVjZfQUREUl9NVUxUSUNBU1QpICYmCisJICAgICEoKGx0eXBlfHJ0eXBlKSAmIElQVjZfQUREUl9MT09QQkFDSykgJiYKKwkgICAgKCEoKGx0eXBlfHJ0eXBlKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHx8IHAtPmxpbmspKSB7CisJCWlmIChsdHlwZSZJUFY2X0FERFJfVU5JQ0FTVCkKKwkJCXAtPmZsYWdzIHw9IElQNl9UTkxfRl9DQVBfWE1JVDsKKwkJaWYgKHJ0eXBlJklQVjZfQUREUl9VTklDQVNUKQorCQkJcC0+ZmxhZ3MgfD0gSVA2X1ROTF9GX0NBUF9SQ1Y7CiAJfQogfQogCkBAIC04NDQsOCArODUwLDExIEBACiAJZGV2LT5pZmxpbmsgPSBwLT5saW5rOwogCiAJaWYgKHAtPmZsYWdzICYgSVA2X1ROTF9GX0NBUF9YTUlUKSB7CisJCWludCBzdHJpY3QgPSAoaXB2Nl9hZGRyX3R5cGUoJnAtPnJhZGRyKSAmCisJCQkgICAgICAoSVBWNl9BRERSX01VTFRJQ0FTVHxJUFY2X0FERFJfTElOS0xPQ0FMKSk7CisKIAkJc3RydWN0IHJ0Nl9pbmZvICpydCA9IHJ0Nl9sb29rdXAoJnAtPnJhZGRyLCAmcC0+bGFkZHIsCi0JCQkJCQkgcC0+bGluaywgMCk7CisJCQkJCQkgcC0+bGluaywgc3RyaWN0KTsKIAogCQlpZiAocnQgPT0gTlVMTCkKIAkJCXJldHVybjsKQEAgLTkyMCwyNiArOTI5LDIwIEBACiBpcDZpcDZfdG5sX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewogCWludCBlcnIgPSAwOwotCWludCBjcmVhdGU7CiAJc3RydWN0IGlwNl90bmxfcGFybSBwOwogCXN0cnVjdCBpcDZfdG5sICp0ID0gTlVMTDsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTSU9DR0VUVFVOTkVMOgogCQlpZiAoZGV2ID09IGlwNmlwNl9mYl90bmxfZGV2KSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsCi0JCQkJCSAgIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLAotCQkJCQkgICBzaXplb2YgKHApKSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKChlcnIgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgJnQsIDApKSA9PSAtRU5PREVWKQotCQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwotCQkJZWxzZSBpZiAoZXJyKQotCQkJCWJyZWFrOwotCQl9IGVsc2UKKwkJCXQgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgMCk7CisJCX0KKwkJaWYgKHQgPT0gTlVMTCkKIAkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwotCiAJCW1lbWNweSgmcCwgJnQtPnBhcm1zLCBzaXplb2YgKHApKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgJnAsIHNpemVvZiAocCkpKSB7CiAJCQllcnIgPSAtRUZBVUxUOwpAQCAtOTQ4LDM1ICs5NTEsMzYgQEAKIAljYXNlIFNJT0NBRERUVU5ORUw6CiAJY2FzZSBTSU9DQ0hHVFVOTkVMOgogCQllcnIgPSAtRVBFUk07Ci0JCWNyZWF0ZSA9IChjbWQgPT0gU0lPQ0FERFRVTk5FTCk7CiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCWJyZWFrOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YgKHApKSkgewotCQkJZXJyID0gLUVGQVVMVDsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpCiAJCQlicmVhazsKLQkJfQotCQlpZiAoIWNyZWF0ZSAmJiBkZXYgIT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKLQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwotCQl9Ci0JCWlmICghdCAmJiAoZXJyID0gaXA2aXA2X3RubF9sb2NhdGUoJnAsICZ0LCBjcmVhdGUpKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocC5wcm90byAhPSBJUFBST1RPX0lQVjYpCiAJCQlicmVhazsKLQkJfQotCQlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwpIHsKLQkJCWlmICh0LT5kZXYgIT0gZGV2KSB7Ci0JCQkJZXJyID0gLUVFWElTVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJdCA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCBjbWQgPT0gU0lPQ0FERFRVTk5FTCk7CisJCWlmIChkZXYgIT0gaXA2aXA2X2ZiX3RubF9kZXYgJiYgY21kID09IFNJT0NDSEdUVU5ORUwpIHsKKwkJCWlmICh0ICE9IE5VTEwpIHsKKwkJCQlpZiAodC0+ZGV2ICE9IGRldikgeworCQkJCQllcnIgPSAtRUVYSVNUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwogCQkJaXA2aXA2X3RubF91bmxpbmsodCk7CiAJCQllcnIgPSBpcDZpcDZfdG5sX2NoYW5nZSh0LCAmcCk7CiAJCQlpcDZpcDZfdG5sX2xpbmsodCk7CiAJCQluZXRkZXZfc3RhdGVfY2hhbmdlKGRldik7CiAJCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwKLQkJCQkgJnQtPnBhcm1zLCBzaXplb2YgKHApKSkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJfSBlbHNlIHsKKwkJaWYgKHQpIHsKIAkJCWVyciA9IDA7Ci0JCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZ0LT5wYXJtcywgc2l6ZW9mIChwKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKworCQl9IGVsc2UKKwkJCWVyciA9IChjbWQgPT0gU0lPQ0FERFRVTk5FTCA/IC1FTk9CVUZTIDogLUVOT0VOVCk7CiAJCWJyZWFrOwogCWNhc2UgU0lPQ0RFTFRVTk5FTDoKIAkJZXJyID0gLUVQRVJNOwpAQCAtOTg0LDIyICs5ODgsMTggQEAKIAkJCWJyZWFrOwogCiAJCWlmIChkZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsCi0JCQkJCSAgIHNpemVvZiAocCkpKSB7Ci0JCQkJZXJyID0gLUVGQVVMVDsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YgKHApKSkKIAkJCQlicmVhazsKLQkJCX0KLQkJCWVyciA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAmdCwgMCk7Ci0JCQlpZiAoZXJyKQorCQkJZXJyID0gLUVOT0VOVDsKKwkJCWlmICgodCA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAwKSkgPT0gTlVMTCkKIAkJCQlicmVhazsKLQkJCWlmICh0ID09IG5ldGRldl9wcml2KGlwNmlwNl9mYl90bmxfZGV2KSkgewotCQkJCWVyciA9IC1FUEVSTTsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWlmICh0LT5kZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpCiAJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCWRldiA9IHQtPmRldjsKIAkJfQotCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZSh0LT5kZXYpOworCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXBjb21wNi5jIGIvbmV0L2lwdjYvaXBjb21wNi5jCmluZGV4IDcxZjU5ZjEuLjUxMTczMGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwY29tcDYuYworKysgYi9uZXQvaXB2Ni9pcGNvbXA2LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpcGNvbXA2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkJICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkJICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJX19iZTMyIHNwaTsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKaW5kZXggZGU2YjkxOS4uMWVhZmNmYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3VkcGxpdGUuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTIzOSw2ICsyNDAsNyBAQAogCQkJc3RydWN0IHNrX2J1ZmYgKnBrdG9wdDsKIAogCQkJaWYgKHNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgorCQkJICAgIHNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1VEUExJVEUgJiYKIAkJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCiAJCQkJYnJlYWs7CiAKQEAgLTI3NiwxMSArMjc4LDE1IEBACiAJCQkJc2stPnNrX2ZhbWlseSA9IFBGX0lORVQ7CiAJCQkJdGNwX3N5bmNfbXNzKHNrLCBpY3NrLT5pY3NrX3BtdHVfY29va2llKTsKIAkJCX0gZWxzZSB7CisJCQkJc3RydWN0IHByb3RvICpwcm90ID0gJnVkcF9wcm90OworCisJCQkJaWYgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1VEUExJVEUpCisJCQkJCXByb3QgPSAmdWRwbGl0ZV9wcm90OwogCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAkJCQlzb2NrX3Byb3RfZGVjX3VzZShzay0+c2tfcHJvdCk7Ci0JCQkJc29ja19wcm90X2luY191c2UoJnVkcF9wcm90KTsKKwkJCQlzb2NrX3Byb3RfaW5jX3VzZShwcm90KTsKIAkJCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJCQlzay0+c2tfcHJvdCA9ICZ1ZHBfcHJvdDsKKwkJCQlzay0+c2tfcHJvdCA9IHByb3Q7CiAJCQkJc2stPnNrX3NvY2tldC0+b3BzID0gJmluZXRfZGdyYW1fb3BzOwogCQkJCXNrLT5za19mYW1pbHkgPSBQRl9JTkVUOwogCQkJfQpAQCAtODEzLDYgKzgxOSw3IEBACiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBJUFY2X0FERFJGT1JNOgogCQlpZiAoc2stPnNrX3Byb3RvY29sICE9IElQUFJPVE9fVURQICYmCisJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19VRFBMSVRFICYmCiAJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9tY2FzdC5jIGIvbmV0L2lwdjYvbWNhc3QuYwppbmRleCAzYjExNGUzLi5hMWMyMzFhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9tY2FzdC5jCisrKyBiL25ldC9pcHY2L21jYXN0LmMKQEAgLTgzLDcgKzgzLDcgQEAKIHN0cnVjdCBtbGQyX2dyZWMgewogCV9fdTgJCWdyZWNfdHlwZTsKIAlfX3U4CQlncmVjX2F1eHdvcmRzOwotCV9fdTE2CQlncmVjX25zcmNzOworCV9fYmUxNgkJZ3JlY19uc3JjczsKIAlzdHJ1Y3QgaW42X2FkZHIJZ3JlY19tY2E7CiAJc3RydWN0IGluNl9hZGRyCWdyZWNfc3JjWzBdOwogfTsKQEAgLTkxLDE4ICs5MSwxOCBAQAogc3RydWN0IG1sZDJfcmVwb3J0IHsKIAlfX3U4CXR5cGU7CiAJX191OAlyZXN2MTsKLQlfX3UxNgljc3VtOwotCV9fdTE2CXJlc3YyOwotCV9fdTE2CW5ncmVjOworCV9fc3VtMTYJY3N1bTsKKwlfX2JlMTYJcmVzdjI7CisJX19iZTE2CW5ncmVjOwogCXN0cnVjdCBtbGQyX2dyZWMgZ3JlY1swXTsKIH07CiAKIHN0cnVjdCBtbGQyX3F1ZXJ5IHsKIAlfX3U4IHR5cGU7CiAJX191OCBjb2RlOwotCV9fdTE2IGNzdW07Ci0JX191MTYgbXJjOwotCV9fdTE2IHJlc3YxOworCV9fc3VtMTYgY3N1bTsKKwlfX2JlMTYgbXJjOworCV9fYmUxNiByZXN2MTsKIAlzdHJ1Y3QgaW42X2FkZHIgbWNhOwogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQogCV9fdTggcXJ2OjMsCkBAIC0xMTYsNyArMTE2LDcgQEAKICNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKICNlbmRpZgogCV9fdTggcXFpYzsKLQlfX3UxNiBuc3JjczsKKwlfX2JlMTYgbnNyY3M7CiAJc3RydWN0IGluNl9hZGRyIHNyY3NbMF07CiB9OwogCkBAIC0xNDY1LDcgKzE0NjUsNyBAQAogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CiAJaW50IGVycjsKIAotCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOworCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCXBheWxvYWRfbGVuID0gc2tiLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm5oLmlwdjZoIC0KIAkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAltbGRsZW4gPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OwpAQCAtMTQ3Nyw5ICsxNDc3LDkgQEAKIAkJbWxkX2Rldl9xdWV1ZV94bWl0KTsKIAlpZiAoIWVycikgewogCQlJQ01QNl9JTkNfU1RBVFMoaWRldixJQ01QNl9NSUJfT1VUTVNHUyk7Ci0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKTsKKwkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOwogCX0gZWxzZQotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAKIAlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCiAJCWluNl9kZXZfcHV0KGlkZXYpOwpAQCAtMTc2Myw3ICsxNzYzLDEwIEBACiAJCSAgICAgSVBWNl9UTFZfUk9VVEVSQUxFUlQsIDIsIDAsIDAsCiAJCSAgICAgSVBWNl9UTFZfUEFETiwgMCB9OwogCi0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJcmN1X3JlYWRfbG9jaygpOworCUlQNl9JTkNfU1RBVFMoX19pbjZfZGV2X2dldChkZXYpLAorCQkgICAgICBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJc25kX2FkZHIgPSBhZGRyOwogCWlmICh0eXBlID09IElDTVBWNl9NR01fUkVEVUNUSU9OKSB7CiAJCXNuZF9hZGRyID0gJmFsbF9yb3V0ZXJzOwpAQCAtMTc3Nyw3ICsxNzgwLDEwIEBACiAJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSArIGZ1bGxfbGVuLCAxLCAmZXJyKTsKIAogCWlmIChza2IgPT0gTlVMTCkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlJUDZfSU5DX1NUQVRTKF9faW42X2Rldl9nZXQoZGV2KSwKKwkJCSAgICAgIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE4MTYsOSArMTgyMiw5IEBACiAJCWVsc2UKIAkJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUR1JPVVBNRU1CUkVTUE9OU0VTKTsKIAkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOworCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CiAJfSBlbHNlCi0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAogCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKIAkJaW42X2Rldl9wdXQoaWRldik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9taXA2LmMgYi9uZXQvaXB2Ni9taXA2LmMKaW5kZXggN2NjZGM4Zi4uYmU3ZGQ3ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWlwNi5jCisrKyBiL25ldC9pcHY2L21pcDYuYwpAQCAtMjYyLDEwICsyNjIsMTAgQEAKIAlzZWwucHJvdG8gPSBmbC0+cHJvdG87CiAJc2VsLmRwb3J0ID0geGZybV9mbG93aV9kcG9ydChmbCk7CiAJaWYgKHNlbC5kcG9ydCkKLQkJc2VsLmRwb3J0X21hc2sgPSB+KChfX3UxNikwKTsKKwkJc2VsLmRwb3J0X21hc2sgPSBodG9ucyh+MCk7CiAJc2VsLnNwb3J0ID0geGZybV9mbG93aV9zcG9ydChmbCk7CiAJaWYgKHNlbC5zcG9ydCkKLQkJc2VsLnNwb3J0X21hc2sgPSB+KChfX3UxNikwKTsKKwkJc2VsLnNwb3J0X21hc2sgPSBodG9ucyh+MCk7CiAJc2VsLmlmaW5kZXggPSBmbC0+b2lmOwogCiAJZXJyID0ga21fcmVwb3J0KElQUFJPVE9fRFNUT1BUUywgJnNlbCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDczZWI4YzMuLjU2ZWE5MjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNDcyLDcgKzQ3Miw5IEBACiAJCQlpbmNfb3B0ID0gMDsKIAl9CiAKLQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBNQVhfSEVBREVSICsgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSwKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAorCQkJCSAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgICBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKSwKIAkJCQkgIDEsICZlcnIpOwogCiAJaWYgKHNrYiA9PSBOVUxMKSB7CkBAIC01MTMsNyArNTE1LDcgQEAKIAogCXNrYi0+ZHN0ID0gZHN0OwogCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7CiAJaWYgKCFlcnIpIHsKIAkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRORUlHSEJPUkFEVkVSVElTRU1FTlRTKTsKQEAgLTU2MSw3ICs1NjMsOSBAQAogCWlmIChzZW5kX2xsaW5mbykKIAkJbGVuICs9IG5kaXNjX29wdF9hZGRyX3NwYWNlKGRldik7CiAKLQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBNQVhfSEVBREVSICsgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSwKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAorCQkJCSAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgICBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKSwKIAkJCQkgIDEsICZlcnIpOwogCWlmIChza2IgPT0gTlVMTCkgewogCQlORF9QUklOVEswKEtFUk5fRVJSCkBAIC01OTcsNyArNjAxLDcgQEAKIAkvKiBzZW5kIGl0ISAqLwogCXNrYi0+ZHN0ID0gZHN0OwogCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7CiAJaWYgKCFlcnIpIHsKIAkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRORUlHSEJPUlNPTElDSVRTKTsKQEAgLTYzNiw3ICs2NDAsOSBAQAogCWlmIChkZXYtPmFkZHJfbGVuKQogCQlsZW4gKz0gbmRpc2Nfb3B0X2FkZHJfc3BhY2UoZGV2KTsKIAotICAgICAgICBza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBNQVhfSEVBREVSICsgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSwKKyAgICAgICAgc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKKwkJCQkgIChNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCisJCQkJICAgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSksCiAJCQkJICAxLCAmZXJyKTsKIAlpZiAoc2tiID09IE5VTEwpIHsKIAkJTkRfUFJJTlRLMChLRVJOX0VSUgpAQCAtNjcwLDcgKzY3Niw3IEBACiAJLyogc2VuZCBpdCEgKi8KIAlza2ItPmRzdCA9IGRzdDsKIAlpZGV2ID0gaW42X2Rldl9nZXQoZHN0LT5kZXYpOwotCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwkKKwlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIGRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKIAlpZiAoIWVycikgewogCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVFJPVVRFUlNPTElDSVRTKTsKQEAgLTEyNjEsMTAgKzEyNjcsMTEgQEAKIAl9CiAKIAlpZiAobmRvcHRzLm5kX29wdHNfbXR1KSB7CisJCV9fYmUzMiBuOwogCQl1MzIgbXR1OwogCi0JCW1lbWNweSgmbXR1LCAoKHU4KikobmRvcHRzLm5kX29wdHNfbXR1KzEpKSsyLCBzaXplb2YobXR1KSk7Ci0JCW10dSA9IG50b2hsKG10dSk7CisJCW1lbWNweSgmbiwgKCh1OCopKG5kb3B0cy5uZF9vcHRzX210dSsxKSkrMiwgc2l6ZW9mKG10dSkpOworCQltdHUgPSBudG9obChuKTsKIAogCQlpZiAobXR1IDwgSVBWNl9NSU5fTVRVIHx8IG10dSA+IHNrYi0+ZGV2LT5tdHUpIHsKIAkJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCkBAIC0xNDQ2LDcgKzE0NTMsOSBAQAogCXJkX2xlbiAmPSB+MHg3OwogCWxlbiArPSByZF9sZW47CiAKLQlidWZmID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTUFYX0hFQURFUiArIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksCisJYnVmZiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCisJCQkJICAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgICAgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSksCiAJCQkJICAgMSwgJmVycik7CiAJaWYgKGJ1ZmYgPT0gTlVMTCkgewogCQlORF9QUklOVEswKEtFUk5fRVJSCkBAIC0xNTA0LDcgKzE1MTMsNyBAQAogCiAJYnVmZi0+ZHN0ID0gZHN0OwogCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgYnVmZiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwogCWlmICghZXJyKSB7CiAJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUUkVESVJFQ1RTKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKaW5kZXggNTgwYjFhYi4uZjYyOTRlNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNlbmRpZgogCiAJaWYgKGRzdC0+ZXJyb3IpIHsKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKIAkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiaXA2X3JvdXRlX21lX2hhcmRlcjogTm8gbW9yZSByb3V0ZS5cbiIpOwogCQlkc3RfcmVsZWFzZShkc3QpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTgwLDExICs4MCwxMSBAQAogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBpbnQgbmZfaXA2X2NoZWNrc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rLAorX19zdW0xNiBuZl9pcDZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLCB1X2ludDhfdCBwcm90b2NvbCkKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JdW5zaWduZWQgaW50IGNzdW0gPSAwOworCV9fc3VtMTYgY3N1bSA9IDA7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKQEAgLTEwMCwxMiArMTAwLDEzIEBACiAJCX0KIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBDSEVDS1NVTV9OT05FOgotCQlza2ItPmNzdW0gPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcDZoLT5zYWRkciwgJmlwNmgtPmRhZGRyLAorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoCisJCQkJY3N1bV9pcHY2X21hZ2ljKCZpcDZoLT5zYWRkciwgJmlwNmgtPmRhZGRyLAogCQkJCQkgICAgIHNrYi0+bGVuIC0gZGF0YW9mZiwKIAkJCQkJICAgICBwcm90b2NvbCwKIAkJCQkJICAgICBjc3VtX3N1YigwLAogCQkJCQkJICAgICAgc2tiX2NoZWNrc3VtKHNrYiwgMCwKLQkJCQkJCQkgICAgICAgICAgIGRhdGFvZmYsIDApKSk7CisJCQkJCQkJICAgICAgICAgICBkYXRhb2ZmLCAwKSkpKTsKIAkJY3N1bSA9IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7CiAJfQogCXJldHVybiBjc3VtOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBkN2M0NWE5Yy4uZmMzZTVlYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAJZGVwZW5kcyBvbiBJTkVUICYmIElQVjYgJiYgTkVURklMVEVSICYmIEVYUEVSSU1FTlRBTAogCiBjb25maWcgTkZfQ09OTlRSQUNLX0lQVjYKLQl0cmlzdGF0ZSAiSVB2NiBzdXBwb3J0IGZvciBuZXcgY29ubmVjdGlvbiB0cmFja2luZyAoRVhQRVJJTUVOVEFMKSIKKwl0cmlzdGF0ZSAiSVB2NiBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCiAJLS0taGVscC0tLQogCSAgQ29ubmVjdGlvbiB0cmFja2luZyBrZWVwcyBhIHJlY29yZCBvZiB3aGF0IHBhY2tldHMgaGF2ZSBwYXNzZWQKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwppbmRleCA5ZmVjODMyLi5kNGQ5ZjE4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCkBAIC0yNDEsNyArMjQxLDcgQEAKIAlwbXNnLT5kYXRhX2xlbiAgICAgICAgPSBkYXRhX2xlbjsKIAlwbXNnLT50aW1lc3RhbXBfc2VjICAgPSBlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3NlYzsKIAlwbXNnLT50aW1lc3RhbXBfdXNlYyAgPSBlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3VzZWM7Ci0JcG1zZy0+bWFyayAgICAgICAgICAgID0gZW50cnktPnNrYi0+bmZtYXJrOworCXBtc2ctPm1hcmsgICAgICAgICAgICA9IGVudHJ5LT5za2ItPm1hcms7CiAJcG1zZy0+aG9vayAgICAgICAgICAgID0gZW50cnktPmluZm8tPmhvb2s7CiAJcG1zZy0+aHdfcHJvdG9jb2wgICAgID0gZW50cnktPnNrYi0+cHJvdG9jb2w7CiAJCkBAIC02MjAsNiArNjIwLDcgQEAKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50CiBpcHFfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKIHsKQEAgLTY1Myw2ICs2NTQsNyBAQAogCQlsZW4gPSAwOwogCXJldHVybiBsZW47CiB9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogc3RhdGljIHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyIG5mcWggPSB7CiAJLm5hbWUJPSAiaXA2X3F1ZXVlIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDIwNGUwMjEuLmY2M2ZiODYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMTQ4MSw3ICsxNDgxLDggQEAKIAkJaWYgKGhwID09IE5VTEwpCiAJCQlyZXR1cm4gLUVCQURNU0c7CiAJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKLQkJCXVuc2lnbmVkIHNob3J0IF9mcmFnX29mZiwgKmZwOworCQkJdW5zaWduZWQgc2hvcnQgX2ZyYWdfb2ZmOworCQkJX19iZTE2ICpmcDsKIAkJCWZwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKIAkJCQkJCXN0YXJ0K29mZnNldG9mKHN0cnVjdCBmcmFnX2hkciwKIAkJCQkJCQkgICAgICAgZnJhZ19vZmYpLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwppbmRleCAwY2Y1MzdkLi4zM2IxZmFhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwpAQCAtNjksOSArNjksOSBAQAogCS8qIE1heCBsZW5ndGg6IDQ0ICJMRU49NjU1MzUgVEM9MjU1IEhPUExJTUlUPTI1NSBGTE9XTEJMPUZGRkZGICIgKi8KIAlwcmludGsoIkxFTj0lWnUgVEM9JXUgSE9QTElNSVQ9JXUgRkxPV0xCTD0ldSAiLAogCSAgICAgICBudG9ocyhpaC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwKLQkgICAgICAgKG50b2hsKCoodV9pbnQzMl90ICopaWgpICYgMHgwZmYwMDAwMCkgPj4gMjAsCisJICAgICAgIChudG9obCgqKF9fYmUzMiAqKWloKSAmIDB4MGZmMDAwMDApID4+IDIwLAogCSAgICAgICBpaC0+aG9wX2xpbWl0LAotCSAgICAgICAobnRvaGwoKih1X2ludDMyX3QgKilpaCkgJiAweDAwMGZmZmZmKSk7CisJICAgICAgIChudG9obCgqKF9fYmUzMiAqKWloKSAmIDB4MDAwZmZmZmYpKTsKIAogCWZyYWdtZW50ID0gMDsKIAlwdHIgPSBpcDZob2ZmICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKQEAgLTI3MCwxMSArMjcwLDE1IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCWNhc2UgSVBQUk9UT19VRFA6IHsKKwljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19VRFBMSVRFOiB7CiAJCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKIAotCQkvKiBNYXggbGVuZ3RoOiAxMCAiUFJPVE89VURQICIgKi8KLQkJcHJpbnRrKCJQUk9UTz1VRFAgIik7CisJCWlmIChjdXJyZW50aGRyID09IElQUFJPVE9fVURQKQorCQkJLyogTWF4IGxlbmd0aDogMTAgIlBST1RPPVVEUCAiICAgICAqLworCQkJcHJpbnRrKCJQUk9UTz1VRFAgIiApOworCQllbHNlCS8qIE1heCBsZW5ndGg6IDE0ICJQUk9UTz1VRFBMSVRFICIgKi8KKwkJCXByaW50aygiUFJPVE89VURQTElURSAiKTsKIAogCQlpZiAoZnJhZ21lbnQpCiAJCQlicmVhazsKQEAgLTQzNiwxMyArNDQwLDggQEAKIAlsaS51LmxvZy5sZXZlbCA9IGxvZ2luZm8tPmxldmVsOwogCWxpLnUubG9nLmxvZ2ZsYWdzID0gbG9naW5mby0+bG9nZmxhZ3M7CiAKLQlpZiAobG9naW5mby0+bG9nZmxhZ3MgJiBJUDZUX0xPR19ORkxPRykKLQkJbmZfbG9nX3BhY2tldChQRl9JTkVUNiwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKLQkJICAgICAgICAgICAgICAiJXMiLCBsb2dpbmZvLT5wcmVmaXgpOwotCWVsc2UKLQkJaXA2dF9sb2dfcGFja2V0KFBGX0lORVQ2LCBob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgJmxpLAotCQkgICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKLQorCWlwNnRfbG9nX3BhY2tldChQRl9JTkVUNiwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKKwkgICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKIAlyZXR1cm4gSVA2VF9DT05USU5VRTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCmluZGV4IDM4NmVhMjYuLjYyNTBlODYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKQEAgLTE0OSwxMSArMTQ5LDEwIEBACiAJCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCi0JdW5zaWduZWQgbG9uZyBuZm1hcms7CiAJdW5zaWduZWQgaW50IHJldDsKIAlzdHJ1Y3QgaW42X2FkZHIgc2FkZHIsIGRhZGRyOwogCXVfaW50OF90IGhvcF9saW1pdDsKLQl1X2ludDMyX3QgZmxvd2xhYmVsOworCXVfaW50MzJfdCBmbG93bGFiZWwsIG1hcms7CiAKICNpZiAwCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCkBAIC0xNjUsMTAgKzE2NCwxMCBAQAogCX0KICNlbmRpZgogCi0JLyogc2F2ZSBzb3VyY2UvZGVzdCBhZGRyZXNzLCBuZm1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5LCAgKi8KKwkvKiBzYXZlIHNvdXJjZS9kZXN0IGFkZHJlc3MsIG1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5LCAgKi8KIAltZW1jcHkoJnNhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKIAltZW1jcHkoJmRhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKLQluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CisJbWFyayA9ICgqcHNrYiktPm1hcms7CiAJaG9wX2xpbWl0ID0gKCpwc2tiKS0+bmguaXB2NmgtPmhvcF9saW1pdDsKIAogCS8qIGZsb3dsYWJlbCBhbmQgcHJpbyAoaW5jbHVkZXMgdmVyc2lvbiwgd2hpY2ggc2hvdWxkbid0IGNoYW5nZSBlaXRoZXIgKi8KQEAgLTE3OSw3ICsxNzgsNyBAQAogCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOIAogCQkmJiAobWVtY21wKCYoKnBza2IpLT5uaC5pcHY2aC0+c2FkZHIsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkKIAkJICAgIHx8IG1lbWNtcCgmKCpwc2tiKS0+bmguaXB2NmgtPmRhZGRyLCAmZGFkZHIsIHNpemVvZihkYWRkcikpCi0JCSAgICB8fCAoKnBza2IpLT5uZm1hcmsgIT0gbmZtYXJrCisJCSAgICB8fCAoKnBza2IpLT5tYXJrICE9IG1hcmsKIAkJICAgIHx8ICgqcHNrYiktPm5oLmlwdjZoLT5ob3BfbGltaXQgIT0gaG9wX2xpbWl0KSkKIAkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoKnBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCBlNWU1M2ZmLi5hMjA2MTVmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KIApAQCAtNDMsOCArNDMsNiBAQAogI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQogI2VuZGlmCiAKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQsIG5mX2Nvbm50cmFja19zdGF0KTsKLQogc3RhdGljIGludCBpcHY2X3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbmhvZmYsCiAJCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewpAQCAtMjExLDExICsyMDksNiBAQAogCXJldHVybiBuZl9jb25udHJhY2tfY29uZmlybShwc2tiKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBza19idWZmICpuZl9jdF9mcmFnNl9nYXRoZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gdm9pZCBuZl9jdF9mcmFnNl9vdXRwdXQodW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpOwogc3RhdGljIHVuc2lnbmVkIGludCBpcHY2X2RlZnJhZyh1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtMzMxLDI2ICszMjQsNyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLQotLyogRnJvbSBuZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfaWNtcHY2X3RpbWVvdXQ7Ci0KLS8qIEZyb20gbmZfY29ubnRyYWNrX3JlYXNtLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfdGltZW91dDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfbG93X3RocmVzaDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfaGlnaF90aHJlc2g7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqbmZfY3RfaXB2Nl9zeXNjdGxfaGVhZGVyOwotCi1zdGF0aWMgY3RsX3RhYmxlIG5mX2N0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19JQ01QVjZfVElNRU9VVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19pY21wdjZfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZuZl9jdF9pY21wdjZfdGltZW91dCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKK3N0YXRpYyBjdGxfdGFibGUgbmZfY3RfaXB2Nl9zeXNjdGxfdGFibGVbXSA9IHsKIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfRlJBRzZfVElNRU9VVCwKIAkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19mcmFnNl90aW1lb3V0IiwKQEAgLTM3NywyNiArMzUxLDYgQEAKIAl9LAogICAgICAgICB7IC5jdGxfbmFtZSA9IDAgfQogfTsKLQotc3RhdGljIGN0bF90YWJsZSBuZl9jdF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORVRGSUxURVIsCi0JCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gbmZfY3Rfc3lzY3RsX3RhYmxlLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgbmZfY3RfbmV0X3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBDVExfTkVULAotCQkucHJvY25hbWUJPSAibmV0IiwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IG5mX2N0X25ldGZpbHRlcl90YWJsZSwKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBcCkBAIC00NTQsMTYgKzQwOCwxNCBAQAogCS50dXBsZV90b19uZmF0dHIJPSBpcHY2X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gaXB2Nl9uZmF0dHJfdG9fdHVwbGUsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJLmN0bF90YWJsZV9wYXRoCQk9IG5mX25ldF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgsCisJLmN0bF90YWJsZQkJPSBuZl9jdF9pcHY2X3N5c2N0bF90YWJsZSwKKyNlbmRpZgogCS5nZXRfZmVhdHVyZXMJCT0gaXB2Nl9nZXRfZmVhdHVyZXMsCiAJLm1lCQkJPSBUSElTX01PRFVMRSwKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A2OwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3VkcDY7Ci1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcHY2OwotZXh0ZXJuIGludCBuZl9jdF9mcmFnNl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbmZfY3RfZnJhZzZfY2xlYW51cCh2b2lkKTsKLQogTU9EVUxFX0FMSUFTKCJuZl9jb25udHJhY2stIiBfX3N0cmluZ2lmeShBRl9JTkVUNikpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiWWFzdXl1a2kgS09aQUtBSSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4iKTsKQEAgLTQ3OSwxOSArNDMxLDE5IEBACiAJCXByaW50aygibmZfY29ubnRyYWNrX2lwdjY6IGNhbid0IGluaXRpYWxpemUgZnJhZzYuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfdGNwNik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3RjcDYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygibmZfY29ubnRyYWNrX2lwdjY6IGNhbid0IHJlZ2lzdGVyIHRjcC5cbiIpOwogCQlnb3RvIGNsZWFudXBfZnJhZzY7CiAJfQogCi0JcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3VkcDYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygibmZfY29ubnRyYWNrX2lwdjY6IGNhbid0IHJlZ2lzdGVyIHVkcC5cbiIpOwogCQlnb3RvIGNsZWFudXBfdGNwOwogCX0KIAotCXJldCA9IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX2ljbXB2Nik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2Nik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKCJuZl9jb25udHJhY2tfaXB2NjogY2FuJ3QgcmVnaXN0ZXIgaWNtcHY2LlxuIik7CiAJCWdvdG8gY2xlYW51cF91ZHA7CkBAIC01MTAsMjggKzQ2MiwxNiBAQAogCQkgICAgICAgImhvb2suXG4iKTsKIAkJZ290byBjbGVhbnVwX2lwdjY7CiAJfQotI2lmZGVmIENPTkZJR19TWVNDVEwKLQluZl9jdF9pcHY2X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3RfbmV0X3RhYmxlLCAwKTsKLQlpZiAobmZfY3RfaXB2Nl9zeXNjdGxfaGVhZGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKCJuZl9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXBfaG9va3M7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIHJldDsKIAotI2lmZGVmIENPTkZJR19TWVNDVEwKLSBjbGVhbnVwX2hvb2tzOgotCW5mX3VucmVnaXN0ZXJfaG9va3MoaXB2Nl9jb25udHJhY2tfb3BzLCBBUlJBWV9TSVpFKGlwdjZfY29ubnRyYWNrX29wcykpOwotI2VuZGlmCiAgY2xlYW51cF9pcHY2OgogCW5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYpOwogIGNsZWFudXBfaWNtcHY2OgotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcHY2KTsKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19pY21wdjYpOwogIGNsZWFudXBfdWRwOgotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNik7CiAgY2xlYW51cF90Y3A6Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A2KTsKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b190Y3A2KTsKICBjbGVhbnVwX2ZyYWc2OgogCW5mX2N0X2ZyYWc2X2NsZWFudXAoKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTQwLDE0ICs0ODAsMTEgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZl9jb25udHJhY2tfbDNwcm90b19pcHY2X2Zpbmkodm9pZCkKIHsKIAlzeW5jaHJvbml6ZV9uZXQoKTsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0gCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG5mX2N0X2lwdjZfc3lzY3RsX2hlYWRlcik7Ci0jZW5kaWYKIAluZl91bnJlZ2lzdGVyX2hvb2tzKGlwdjZfY29ubnRyYWNrX29wcywgQVJSQVlfU0laRShpcHY2X2Nvbm50cmFja19vcHMpKTsKIAluZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDNwcm90b19pcHY2KTsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX2ljbXB2Nik7Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA2KTsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDYpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2Nik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNik7CiAJbmZfY3RfZnJhZzZfY2xlYW51cCgpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwppbmRleCAzNGQ0NDcyLi4zOTA1Y2FjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKQEAgLTI5LDExICsyOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjYvbmZfY29ubnRyYWNrX2ljbXB2Ni5oPgogCi11bnNpZ25lZCBsb25nIG5mX2N0X2ljbXB2Nl90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X2ljbXB2Nl90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtMTQyLDkgKzE0Miw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLWV4dGVybiBpbnQKLW5mX2N0X2lwdjZfc2tpcF9leHRoZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHN0YXJ0LCB1OCAqbmV4dGhkcnAsIGludCBsZW4pOwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byBuZl9jb25udHJhY2tfbDNwcm90b19pcHY2Owogc3RhdGljIGludAogaWNtcHY2X2Vycm9yX21lc3NhZ2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICB1bnNpZ25lZCBpbnQgaWNtcDZvZmYsCkBAIC0xNTUsNyArMTUyLDcgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IGljbXA2aGRyIF9oZHIsICpocDsKIAl1bnNpZ25lZCBpbnQgaW5pcDZvZmY7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqaW5wcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmlucHJvdG87CiAJdV9pbnQ4X3QgaW5wcm90b251bTsKIAl1bnNpZ25lZCBpbnQgaW5wcm90b2ZmOwogCkBAIC0xODUsNyArMTgyLDcgQEAKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CiAJfQogCi0JaW5wcm90byA9IF9fbmZfY3RfcHJvdG9fZmluZChQRl9JTkVUNiwgaW5wcm90b251bSk7CisJaW5wcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKFBGX0lORVQ2LCBpbnByb3RvbnVtKTsKIAogCS8qIEFyZSB0aGV5IHRhbGtpbmcgYWJvdXQgb25lIG9mIG91ciBjb25uZWN0aW9ucz8gKi8KIAlpZiAoIW5mX2N0X2dldF90dXBsZShza2IsIGluaXA2b2ZmLCBpbnByb3RvZmYsIFBGX0lORVQ2LCBpbnByb3RvbnVtLApAQCAtMjkwLDcgKzI4Nyw3IEBACiAJdHVwbGUtPmRzdC51LmljbXAuY29kZSA9CiAJCQkqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0lDTVBWNl9DT0RFLTFdKTsKIAl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9Ci0JCQkqKHVfaW50MTZfdCAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19JQ01QVjZfSUQtMV0pOworCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9fSUNNUFY2X0lELTFdKTsKIAogCWlmICh0dXBsZS0+ZHN0LnUuaWNtcC50eXBlIDwgMTI4CiAJICAgIHx8IHR1cGxlLT5kc3QudS5pY21wLnR5cGUgLSAxMjggPj0gc2l6ZW9mKGludm1hcCkKQEAgLTMwMSwxMCArMjk4LDI3IEBACiB9CiAjZW5kaWYKIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcHY2ID0KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmljbXB2Nl9zeXNjdGxfaGVhZGVyOworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgaWNtcHY2X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19JQ01QVjZfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19pY21wdjZfdGltZW91dCIsCisJCS5kYXRhCQk9ICZuZl9jdF9pY21wdjZfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2NiA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfSU5FVDYsCi0JLnByb3RvCQkJPSBJUFBST1RPX0lDTVBWNiwKKwkubDRwcm90bwkJPSBJUFBST1RPX0lDTVBWNiwKIAkubmFtZQkJCT0gImljbXB2NiIsCiAJLnBrdF90b190dXBsZQkJPSBpY21wdjZfcGt0X3RvX3R1cGxlLAogCS5pbnZlcnRfdHVwbGUJCT0gaWNtcHY2X2ludmVydF90dXBsZSwKQEAgLTMxOCw2ICszMzIsMTAgQEAKIAkudHVwbGVfdG9fbmZhdHRyCT0gaWNtcHY2X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gaWNtcHY2X25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZpY21wdjZfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IGljbXB2Nl9zeXNjdGxfdGFibGUsCisjZW5kaWYKIH07CiAKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3Byb3RvY29sX2ljbXB2Nik7CitFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2Nik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKaW5kZXggYmY5M2MxZWEuLjM3ZTVmY2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJbHJ1X2xpc3Q7CS8qIGxydSBsaXN0IG1lbWJlcgkqLwogCi0JX191MzIJCQlpZDsJCS8qIGZyYWdtZW50IGlkCQkqLworCV9fYmUzMgkJCWlkOwkJLyogZnJhZ21lbnQgaWQJCSovCiAJc3RydWN0IGluNl9hZGRyCQlzYWRkcjsKIAlzdHJ1Y3QgaW42X2FkZHIJCWRhZGRyOwogCkBAIC0xMTUsMjggKzExNSwyOCBAQAogCXdyaXRlX3VubG9jaygmbmZfY3RfZnJhZzZfbG9jayk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2cWhhc2hmbih1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNnFoYXNoZm4oX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCiB7CiAJdTMyIGEsIGIsIGM7CiAKLQlhID0gc2FkZHItPnM2X2FkZHIzMlswXTsKLQliID0gc2FkZHItPnM2X2FkZHIzMlsxXTsKLQljID0gc2FkZHItPnM2X2FkZHIzMlsyXTsKKwlhID0gKF9fZm9yY2UgdTMyKXNhZGRyLT5zNl9hZGRyMzJbMF07CisJYiA9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzFdOworCWMgPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsyXTsKIAogCWEgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWIgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWMgKz0gbmZfY3RfZnJhZzZfaGFzaF9ybmQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKLQlhICs9IHNhZGRyLT5zNl9hZGRyMzJbM107Ci0JYiArPSBkYWRkci0+czZfYWRkcjMyWzBdOwotCWMgKz0gZGFkZHItPnM2X2FkZHIzMlsxXTsKKwlhICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbMF07CisJYyArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXTsKIAlfX2poYXNoX21peChhLCBiLCBjKTsKIAotCWEgKz0gZGFkZHItPnM2X2FkZHIzMlsyXTsKLQliICs9IGRhZGRyLT5zNl9hZGRyMzJbM107Ci0JYyArPSBpZDsKKwlhICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzJdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbM107CisJYyArPSAoX19mb3JjZSB1MzIpaWQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKIAlyZXR1cm4gYyAmIChGUkFHNlFfSEFTSFNaIC0gMSk7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAogCiBzdGF0aWMgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICoKLW5mX2N0X2ZyYWc2X2NyZWF0ZSh1bnNpZ25lZCBpbnQgaGFzaCwgdTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywJCQkJICAgc3RydWN0IGluNl9hZGRyICpkc3QpCituZl9jdF9mcmFnNl9jcmVhdGUodW5zaWduZWQgaW50IGhhc2gsIF9fYmUzMiBpZCwgc3RydWN0IGluNl9hZGRyICpzcmMsCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqZHN0KQogewogCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnE7CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogfQogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKgotZnFfZmluZCh1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKK2ZxX2ZpbmQoX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywgc3RydWN0IGluNl9hZGRyICpkc3QpCiB7CiAJc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpmcTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwppbmRleCBlZmVlN2E2Li4zNTI0OWQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC00OSw2ICs0OSw4IEBACiAJCSAgICAgICBmb2xkX3Byb3RfaW51c2UoJnRjcHY2X3Byb3QpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlVEUDY6IGludXNlICVkXG4iLAogCQkgICAgICAgZm9sZF9wcm90X2ludXNlKCZ1ZHB2Nl9wcm90KSk7CisJc2VxX3ByaW50ZihzZXEsICJVRFBMSVRFNjogaW51c2UgJWRcbiIsCisJCSAgICAgICAgZm9sZF9wcm90X2ludXNlKCZ1ZHBsaXRldjZfcHJvdCkpOwogCXNlcV9wcmludGYoc2VxLCAiUkFXNjogaW51c2UgJWRcbiIsCiAJCSAgICAgICBmb2xkX3Byb3RfaW51c2UoJnJhd3Y2X3Byb3QpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIkZSQUc2OiBpbnVzZSAlZCBtZW1vcnkgJWRcbiIsCkBAIC0xMzMsNiArMTM1LDE0IEBACiAJU05NUF9NSUJfU0VOVElORUwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25tcF9taWIgc25tcDZfdWRwbGl0ZTZfbGlzdFtdID0geworCVNOTVBfTUlCX0lURU0oIlVkcExpdGU2SW5EYXRhZ3JhbXMiLCBVRFBfTUlCX0lOREFUQUdSQU1TKSwKKwlTTk1QX01JQl9JVEVNKCJVZHBMaXRlNk5vUG9ydHMiLCBVRFBfTUlCX05PUE9SVFMpLAorCVNOTVBfTUlCX0lURU0oIlVkcExpdGU2SW5FcnJvcnMiLCBVRFBfTUlCX0lORVJST1JTKSwKKwlTTk1QX01JQl9JVEVNKCJVZHBMaXRlNk91dERhdGFncmFtcyIsIFVEUF9NSUJfT1VUREFUQUdSQU1TKSwKKwlTTk1QX01JQl9TRU5USU5FTAorfTsKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQogewpAQCAtMTYxLDExICsxNzEsMTMgQEAKIAogCWlmIChpZGV2KSB7CiAJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCV1XG4iLCAiaWZJbmRleCIsIGlkZXYtPmRldi0+aWZpbmRleCk7CisJCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2LCBzbm1wNl9pcHN0YXRzX2xpc3QpOwogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaWRldi0+c3RhdHMuaWNtcHY2LCBzbm1wNl9pY21wNl9saXN0KTsKIAl9IGVsc2UgewogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzLCBzbm1wNl9pcHN0YXRzX2xpc3QpOwogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MsIHNubXA2X2ljbXA2X2xpc3QpOwogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopdWRwX3N0YXRzX2luNiwgc25tcDZfdWRwNl9saXN0KTsKKwkJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKXVkcGxpdGVfc3RhdHNfaW42LCBzbm1wNl91ZHBsaXRlNl9saXN0KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yODEsNiArMjkzLDkgQEAKIAlpZiAoIWlkZXYgfHwgIWlkZXYtPmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Niwgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCisJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCisJCWdvdG8gZXJyX2lwOwogCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsIHNpemVvZihzdHJ1Y3QgaWNtcHY2X21pYiksCiAJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKIAkJZ290byBlcnJfaWNtcDsKQEAgLTI4OCwxMiArMzAzLDE1IEBACiAJcmV0dXJuIDA7CiAKIGVycl9pY21wOgorCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYpOworZXJyX2lwOgogCXJldHVybiBlcnI7CiB9CiAKIGludCBzbm1wNl9mcmVlX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQogewogCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Nik7CisJc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Nik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Jhdy5jIGIvbmV0L2lwdjYvcmF3LmMKaW5kZXggZDZkZWRjNC4uYzJlNjI5ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmF3LmMKKysrIGIvbmV0L2lwdjYvcmF3LmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHVhZGRyOwotCV9fdTMyIHY0YWRkciA9IDA7CisJX19iZTMyIHY0YWRkciA9IDA7CiAJaW50IGFkZHJfdHlwZTsKIAlpbnQgZXJyOwogCkBAIC0yOTAsNyArMjkwLDcgQEAKIAogdm9pZCByYXd2Nl9lcnIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCSAgICAgICBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCB1MzIgaW5mbykKKwkgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwpAQCAtMzcwLDkgKzM3MCw5IEBACiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCXNrYi0+Y3N1bSA9IH5jc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKIAkJCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkJCSAgICAgc2tiLT5sZW4sIGluZXQtPm51bSwgMCk7CisJCQkJCSAgICAgc2tiLT5sZW4sIGluZXQtPm51bSwgMCkpOwogCiAJaWYgKGluZXQtPmhkcmluY2wpIHsKIAkJaWYgKHNrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CkBAIC00NzksOCArNDc5LDggQEAKIAlpbnQgb2Zmc2V0OwogCWludCBsZW47CiAJaW50IHRvdGFsX2xlbjsKLQl1MzIgdG1wX2NzdW07Ci0JdTE2IGNzdW07CisJX193c3VtIHRtcF9jc3VtOworCV9fc3VtMTYgY3N1bTsKIAogCWlmICghcnAtPmNoZWNrc3VtKQogCQlnb3RvIHNlbmQ7CkBAIC01MzAsMTYgKzUzMCwxNSBAQAogCiAJLyogaW4gY2FzZSBja3N1bSB3YXMgbm90IGluaXRpYWxpemVkICovCiAJaWYgKHVubGlrZWx5KGNzdW0pKQotCQl0bXBfY3N1bSA9IGNzdW1fc3ViKHRtcF9jc3VtLCBjc3VtKTsKKwkJdG1wX2NzdW0gPSBjc3VtX3N1Yih0bXBfY3N1bSwgY3N1bV91bmZvbGQoY3N1bSkpOwogCi0JdG1wX2NzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAorCWNzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAogCQkJCSAgICZmbC0+Zmw2X2RzdCwKIAkJCQkgICB0b3RhbF9sZW4sIGZsLT5wcm90bywgdG1wX2NzdW0pOwogCi0JaWYgKHRtcF9jc3VtID09IDApCi0JCXRtcF9jc3VtID0gLTE7CisJaWYgKGNzdW0gPT0gMCAmJiBmbC0+cHJvdG8gPT0gSVBQUk9UT19VRFApCisJCWNzdW0gPSBDU1VNX01BTkdMRURfMDsKIAotCWNzdW0gPSB0bXBfY3N1bTsKIAlpZiAoc2tiX3N0b3JlX2JpdHMoc2tiLCBvZmZzZXQsICZjc3VtLCAyKSkKIAkJQlVHKCk7CiAKQEAgLTU4Niw3ICs1ODUsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3JfZmF1bHQ7CiAKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsJCQorCUlQNl9JTkNfU1RBVFMocnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgcnQtPnUuZHN0LmRldiwKIAkJICAgICAgZHN0X291dHB1dCk7CiAJaWYgKGVyciA+IDApCkBAIC02MDAsNyArNTk5LDcgQEAKIAllcnIgPSAtRUZBVUxUOwogCWtmcmVlX3NrYihza2IpOwogZXJyb3I6Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJSVA2X0lOQ19TVEFUUyhydC0+cnQ2aV9pZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJcmV0dXJuIGVycjsgCiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwppbmRleCBmMzliYmVkLi42ZjlhOTA0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKKysrIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KIAogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KICNpbmNsdWRlIDxuZXQvcmF3djYuaD4KQEAgLTc2LDcgKzc3LDcgQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbHJ1X2xpc3Q7CQkvKiBscnUgbGlzdCBtZW1iZXIJKi8KIAotCV9fdTMyCQkJaWQ7CQkvKiBmcmFnbWVudCBpZAkJKi8KKwlfX2JlMzIJCQlpZDsJCS8qIGZyYWdtZW50IGlkCQkqLwogCXN0cnVjdCBpbjZfYWRkcgkJc2FkZHI7CiAJc3RydWN0IGluNl9hZGRyCQlkYWRkcjsKIApAQCAtMTI0LDI4ICsxMjUsMjggQEAKICAqIGNhbGxlcnMgc2hvdWxkIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0aGUgaGFzaCB2YWx1ZSBvdXRzaWRlIHRoZSBpcGZyYWdfbG9jawogICogYXMgZG9pbmcgc28gY291bGQgcmFjZSB3aXRoIGlwZnJhZ19oYXNoX3JuZCBiZWluZyByZWNhbGN1bGF0ZWQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2cWhhc2hmbih1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNnFoYXNoZm4oX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCiB7CiAJdTMyIGEsIGIsIGM7CiAKLQlhID0gc2FkZHItPnM2X2FkZHIzMlswXTsKLQliID0gc2FkZHItPnM2X2FkZHIzMlsxXTsKLQljID0gc2FkZHItPnM2X2FkZHIzMlsyXTsKKwlhID0gKF9fZm9yY2UgdTMyKXNhZGRyLT5zNl9hZGRyMzJbMF07CisJYiA9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzFdOworCWMgPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsyXTsKIAogCWEgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWIgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWMgKz0gaXA2X2ZyYWdfaGFzaF9ybmQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKLQlhICs9IHNhZGRyLT5zNl9hZGRyMzJbM107Ci0JYiArPSBkYWRkci0+czZfYWRkcjMyWzBdOwotCWMgKz0gZGFkZHItPnM2X2FkZHIzMlsxXTsKKwlhICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbMF07CisJYyArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXTsKIAlfX2poYXNoX21peChhLCBiLCBjKTsKIAotCWEgKz0gZGFkZHItPnM2X2FkZHIzMlsyXTsKLQliICs9IGRhZGRyLT5zNl9hZGRyMzJbM107Ci0JYyArPSBpZDsKKwlhICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzJdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbM107CisJYyArPSAoX19mb3JjZSB1MzIpaWQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKIAlyZXR1cm4gYyAmIChJUDZRX0hBU0hTWiAtIDEpOwpAQCAtMjU3LDcgKzI1OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpcDZfZXZpY3Rvcih2b2lkKQorc3RhdGljIHZvaWQgaXA2X2V2aWN0b3Ioc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnE7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwpAQCAtMjg0LDE0ICsyODUsMTQgQEAKIAkJc3Bpbl91bmxvY2soJmZxLT5sb2NrKTsKIAogCQlmcV9wdXQoZnEsICZ3b3JrKTsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGlwNl9mcmFnX2V4cGlyZSh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGZyYWdfcXVldWUgKmZxID0gKHN0cnVjdCBmcmFnX3F1ZXVlICopIGRhdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAogCXNwaW5fbG9jaygmZnEtPmxvY2spOwogCkBAIC0zMDAsMTcgKzMwMSwxOSBAQAogCiAJZnFfa2lsbChmcSk7CiAKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNVElNRU9VVCk7Ci0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGZxLT5paWYpOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01USU1FT1VUKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBEb24ndCBzZW5kIGVycm9yIGlmIHRoZSBmaXJzdCBzZWdtZW50IGRpZCBub3QgYXJyaXZlLiAqLwogCWlmICghKGZxLT5sYXN0X2luJkZJUlNUX0lOKSB8fCAhZnEtPmZyYWdtZW50cykKIAkJZ290byBvdXQ7CiAKLQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGZxLT5paWYpOwotCWlmICghZGV2KQotCQlnb3RvIG91dDsKLQogCS8qCiAJICAgQnV0IHVzZSBhcyBzb3VyY2UgZGV2aWNlIG9uIHdoaWNoIExBU1QgQVJSSVZFRAogCSAgIHNlZ21lbnQgd2FzIHJlY2VpdmVkLiBBbmQgZG8gbm90IHVzZSBmcS0+ZGV2CkBAIC0zMTgsOCArMzIxLDkgQEAKIAkgKi8KIAlmcS0+ZnJhZ21lbnRzLT5kZXYgPSBkZXY7CiAJaWNtcHY2X3NlbmQoZnEtPmZyYWdtZW50cywgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0ZSQUdUSU1FLCAwLCBkZXYpOwotCWRldl9wdXQoZGV2KTsKIG91dDoKKwlpZiAoZGV2KQorCQlkZXZfcHV0KGRldik7CiAJc3Bpbl91bmxvY2soJmZxLT5sb2NrKTsKIAlmcV9wdXQoZnEsIE5VTEwpOwogfQpAQCAtMzY2LDcgKzM3MCw4IEBACiAKIAogc3RhdGljIHN0cnVjdCBmcmFnX3F1ZXVlICoKLWlwNl9mcmFnX2NyZWF0ZSh1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKK2lwNl9mcmFnX2NyZWF0ZShfX2JlMzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCwKKwkJc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnE7CiAKQEAgLTM4NiwxMiArMzkxLDEzIEBACiAJcmV0dXJuIGlwNl9mcmFnX2ludGVybihmcSk7CiAKIG9vbToKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBmcmFnX3F1ZXVlICoKLWZxX2ZpbmQodTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywgc3RydWN0IGluNl9hZGRyICpkc3QpCitmcV9maW5kKF9fYmUzMiBpZCwgc3RydWN0IGluNl9hZGRyICpzcmMsIHN0cnVjdCBpbjZfYWRkciAqZHN0LAorCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCiB7CiAJc3RydWN0IGZyYWdfcXVldWUgKmZxOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwpAQCAtNDEwLDcgKzQxNiw3IEBACiAJfQogCXJlYWRfdW5sb2NrKCZpcDZfZnJhZ19sb2NrKTsKIAotCXJldHVybiBpcDZfZnJhZ19jcmVhdGUoaWQsIHNyYywgZHN0KTsKKwlyZXR1cm4gaXA2X2ZyYWdfY3JlYXRlKGlkLCBzcmMsIGRzdCwgaWRldik7CiB9CiAKIApAQCAtNDI4LDcgKzQzNCw4IEBACiAJCQkoKHU4ICopIChmaGRyICsgMSkgLSAodTggKikgKHNrYi0+bmguaXB2NmggKyAxKSkpOwogCiAJaWYgKCh1bnNpZ25lZCBpbnQpZW5kID4gSVBWNl9NQVhQTEVOKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKICAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYixJQ01QVjZfSERSX0ZJRUxELCAodTgqKSZmaGRyLT5mcmFnX29mZiAtIHNrYi0+bmgucmF3KTsKICAJCXJldHVybjsKIAl9CkBAIC00NTUsNyArNDYyLDggQEAKIAkJCS8qIFJGQzI0NjAgc2F5cyBhbHdheXMgc2VuZCBwYXJhbWV0ZXIgcHJvYmxlbSBpbgogCQkJICogdGhpcyBjYXNlLiAtRGF2ZU0KIAkJCSAqLwotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIAogCQkJCQkgIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBwYXlsb2FkX2xlbikpOwogCQkJcmV0dXJuOwpAQCAtNTcxLDcgKzU3OSw3IEBACiAJcmV0dXJuOwogCiBlcnI6Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOwogCWtmcmVlX3NrYihza2IpOwogfQogCkBAIC02NjUsNyArNjczLDkgQEAKIAlpZiAoaGVhZC0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQogCQloZWFkLT5jc3VtID0gY3N1bV9wYXJ0aWFsKGhlYWQtPm5oLnJhdywgaGVhZC0+aC5yYXctaGVhZC0+bmgucmF3LCBoZWFkLT5jc3VtKTsKIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01PS1MpOworCXJjdV9yZWFkX2xvY2soKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOworCXJjdV9yZWFkX3VubG9jaygpOwogCWZxLT5mcmFnbWVudHMgPSBOVUxMOwogCXJldHVybiAxOwogCkBAIC02NzcsNyArNjg3LDkgQEAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiaXA2X2ZyYWdfcmVhc206IG5vIG1lbW9yeSBmb3IgcmVhc3NlbWJseVxuIik7CiBvdXRfZmFpbDoKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCXJjdV9yZWFkX2xvY2soKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC02OTEsMTYgKzcwMywxNiBAQAogCiAJaGRyID0gc2tiLT5uaC5pcHY2aDsKIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01SRVFEUyk7CisJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9SRUFTTVJFUURTKTsKIAogCS8qIEp1bWJvIHBheWxvYWQgaW5oaWJpdHMgZnJhZy4gaGVhZGVyICovCiAJaWYgKGhkci0+cGF5bG9hZF9sZW49PTApIHsKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIHNrYi0+aC5yYXctc2tiLT5uaC5yYXcpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpKSB7Ci0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBza2ItPmgucmF3LXNrYi0+bmgucmF3KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTcxMSwxNiArNzIzLDE3IEBACiAJaWYgKCEoZmhkci0+ZnJhZ19vZmYgJiBodG9ucygweEZGRjkpKSkgewogCQkvKiBJdCBpcyBub3QgYSBmcmFnbWVudGVkIGZyYW1lICovCiAJCXNrYi0+aC5yYXcgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01PS1MpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNT0tTKTsKIAogCQlJUDZDQihza2IpLT5uaG9mZiA9ICh1OCopZmhkciAtIHNrYi0+bmgucmF3OwogCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAoYXRvbWljX3JlYWQoJmlwNl9mcmFnX21lbSkgPiBzeXNjdGxfaXA2ZnJhZ19oaWdoX3RocmVzaCkKLQkJaXA2X2V2aWN0b3IoKTsKKwkJaXA2X2V2aWN0b3IoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSk7CiAKLQlpZiAoKGZxID0gZnFfZmluZChmaGRyLT5pZGVudGlmaWNhdGlvbiwgJmhkci0+c2FkZHIsICZoZHItPmRhZGRyKSkgIT0gTlVMTCkgeworCWlmICgoZnEgPSBmcV9maW5kKGZoZHItPmlkZW50aWZpY2F0aW9uLCAmaGRyLT5zYWRkciwgJmhkci0+ZGFkZHIsCisJCQkgIGlwNl9kc3RfaWRldihza2ItPmRzdCkpKSAhPSBOVUxMKSB7CiAJCWludCByZXQgPSAtMTsKIAogCQlzcGluX2xvY2soJmZxLT5sb2NrKTsKQEAgLTczNiw3ICs3NDksNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCBiMzlhZTk5Li45ZjgwNTE4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCWlmIChwcmVmID09IElDTVBWNl9ST1VURVJfUFJFRl9JTlZBTElEKQogCQlwcmVmID0gSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTTsKIAotCWxpZmV0aW1lID0gaHRvbmwocmluZm8tPmxpZmV0aW1lKTsKKwlsaWZldGltZSA9IG50b2hsKHJpbmZvLT5saWZldGltZSk7CiAJaWYgKGxpZmV0aW1lID09IDB4ZmZmZmZmZmYpIHsKIAkJLyogaW5maW5pdHkgKi8KIAl9IGVsc2UgaWYgKGxpZmV0aW1lID4gMHg3ZmZmZmZmZi9IWikgewpAQCAtNzExLDEyICs3MTEsMTAgQEAKIAkJCS5pcDZfdSA9IHsKIAkJCQkuZGFkZHIgPSBpcGgtPmRhZGRyLAogCQkJCS5zYWRkciA9IGlwaC0+c2FkZHIsCi0jaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVfRldNQVJLCi0JCQkJLmZ3bWFyayA9IHNrYi0+bmZtYXJrLAotI2VuZGlmCi0JCQkJLmZsb3dsYWJlbCA9ICgqICh1MzIgKikgaXBoKSZJUFY2X0ZMT1dJTkZPX01BU0ssCisJCQkJLmZsb3dsYWJlbCA9ICgqIChfX2JlMzIgKikgaXBoKSZJUFY2X0ZMT1dJTkZPX01BU0ssCiAJCQl9LAogCQl9LAorIAkJLm1hcmsgPSBza2ItPm1hcmssCiAJCS5wcm90byA9IGlwaC0+bmV4dGhkciwKIAl9OwogCkBAIC05NDIsNyArOTQwLDcgQEAKIAlmaWI2X2ZvcmNlX3N0YXJ0X2djKCk7CiAKIG91dDoKLQlyZXR1cm4gKHN0cnVjdCBkc3RfZW50cnkgKilydDsKKwlyZXR1cm4gJnJ0LT51LmRzdDsKIH0KIAogaW50IG5kaXNjX2RzdF9nYyhpbnQgKm1vcmUpCkBAIC0xMjI1LDcgKzEyMjMsNyBAQAogCWlmIChpZGV2KQogCQlpbjZfZGV2X3B1dChpZGV2KTsKIAlpZiAocnQpCi0JCWRzdF9mcmVlKChzdHJ1Y3QgZHN0X2VudHJ5ICopIHJ0KTsKKwkJZHN0X2ZyZWUoJnJ0LT51LmRzdCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTc1MSw5ICsxNzQ5LDkgQEAKIHsKIAlpbnQgdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZza2ItPm5oLmlwdjZoLT5kYWRkcik7CiAJaWYgKHR5cGUgPT0gSVBWNl9BRERSX0FOWSB8fCB0eXBlID09IElQVjZfQUREUl9SRVNFUlZFRCkKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKIAlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIGNvZGUsIDAsIHNrYi0+ZGV2KTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTE4MjQsNyArMTgyMiw3IEBACiAJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9MT0NBTDsKIAlydC0+cnQ2aV9uZXh0aG9wID0gbmRpc2NfZ2V0X25laWdoKHJ0LT5ydDZpX2RldiwgJnJ0LT5ydDZpX2dhdGV3YXkpOwogCWlmIChydC0+cnQ2aV9uZXh0aG9wID09IE5VTEwpIHsKLQkJZHN0X2ZyZWUoKHN0cnVjdCBkc3RfZW50cnkgKikgcnQpOworCQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCkBAIC0yMDA4LDYgKzIwMDYsMjAgQEAKIAlyZXR1cm4gaXA2X3JvdXRlX2FkZCgmY2ZnKTsKIH0KIAorc3RhdGljIGlubGluZSBzaXplX3QgcnQ2X25sbXNnX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBydG1zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMTYpIC8qIFJUQV9TUkMgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxNikgLyogUlRBX0RTVCAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDE2KSAvKiBSVEFfR0FURVdBWSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDE2KSAvKiBSVEFfUFJFRlNSQyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9UQUJMRSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9JSUYgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBSVEFfT0lGICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX1BSSU9SSVRZICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBydGFfY2FjaGVpbmZvKSk7Cit9CisKIHN0YXRpYyBpbnQgcnQ2X2ZpbGxfbm9kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnQ2X2luZm8gKnJ0LAogCQkJIHN0cnVjdCBpbjZfYWRkciAqZHN0LCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywKIAkJCSBpbnQgaWlmLCBpbnQgdHlwZSwgdTMyIHBpZCwgdTMyIHNlcSwKQEAgLTIwMTUsNyArMjAyNyw3IEBACiB7CiAJc3RydWN0IHJ0bXNnICpydG07CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IHJ0YV9jYWNoZWluZm8gY2k7CisJbG9uZyBleHBpcmVzOwogCXUzMiB0YWJsZTsKIAogCWlmIChwcmVmaXgpIHsJLyogdXNlciB3YW50cyBwcmVmaXggcm91dGVzIG9ubHkgKi8KQEAgLTIwODksMTggKzIxMDEsMTEgQEAKIAkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfT0lGLCBydC0+cnQ2aV9kZXYtPmlmaW5kZXgpOwogCiAJTkxBX1BVVF9VMzIoc2tiLCBSVEFfUFJJT1JJVFksIHJ0LT5ydDZpX21ldHJpYyk7Ci0JY2kucnRhX2xhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHJ0LT51LmRzdC5sYXN0dXNlKTsKLQlpZiAocnQtPnJ0NmlfZXhwaXJlcykKLQkJY2kucnRhX2V4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QocnQtPnJ0NmlfZXhwaXJlcyAtIGppZmZpZXMpOwotCWVsc2UKLQkJY2kucnRhX2V4cGlyZXMgPSAwOwotCWNpLnJ0YV91c2VkID0gcnQtPnUuZHN0Ll9fdXNlOwotCWNpLnJ0YV9jbG50cmVmID0gYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCk7Ci0JY2kucnRhX2Vycm9yID0gcnQtPnUuZHN0LmVycm9yOwotCWNpLnJ0YV9pZCA9IDA7Ci0JY2kucnRhX3RzID0gMDsKLQljaS5ydGFfdHNhZ2UgPSAwOwotCU5MQV9QVVQoc2tiLCBSVEFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCisJZXhwaXJlcyA9IHJ0LT5ydDZpX2V4cGlyZXMgPyBydC0+cnQ2aV9leHBpcmVzIC0gamlmZmllcyA6IDA7CisJaWYgKHJ0bmxfcHV0X2NhY2hlaW5mbyhza2IsICZydC0+dS5kc3QsIDAsIDAsIDAsCisJCQkgICAgICAgZXhwaXJlcywgcnQtPnUuZHN0LmVycm9yKSA8IDApCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKQEAgLTIyMDIsNyArMjIwNyw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MzIgcGlkID0gMCwgc2VxID0gMDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IE5VTEw7Ci0JaW50IHBheWxvYWQgPSBzaXplb2Yoc3RydWN0IHJ0bXNnKSArIDI1NjsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKIAlpZiAoaW5mbykgewpAQCAtMjIxMiwxNSArMjIxNiwxMyBAQAogCQkJc2VxID0gbmxoLT5ubG1zZ19zZXE7CiAJfQogCi0Jc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIGdmcF9hbnkoKSk7CisJc2tiID0gbmxtc2dfbmV3KHJ0Nl9ubG1zZ19zaXplKCksIGdmcF9hbnkoKSk7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IHJ0Nl9maWxsX25vZGUoc2tiLCBydCwgTlVMTCwgTlVMTCwgMCwgZXZlbnQsIHBpZCwgc2VxLCAwLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gcnQ2X25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBSVE5MR1JQX0lQVjZfUk9VVEUsIG5saCwgZ2ZwX2FueSgpKTsKIGVycm91dDoKQEAgLTIyNDgsNyArMjI1MCw2IEBACiBzdGF0aWMgaW50IHJ0Nl9pbmZvX3JvdXRlKHN0cnVjdCBydDZfaW5mbyAqcnQsIHZvaWQgKnBfYXJnKQogewogCXN0cnVjdCBydDZfcHJvY19hcmcgKmFyZyA9IChzdHJ1Y3QgcnQ2X3Byb2NfYXJnICopIHBfYXJnOwotCWludCBpOwogCiAJaWYgKGFyZy0+c2tpcCA8IGFyZy0+b2Zmc2V0IC8gUlQ2X0lORk9fTEVOKSB7CiAJCWFyZy0+c2tpcCsrOwpAQCAtMjI1OCwzOCArMjI1OSwyOCBAQAogCWlmIChhcmctPmxlbiA+PSBhcmctPmxlbmd0aCkKIAkJcmV0dXJuIDA7CiAKLQlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7Ci0JCXNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwgIiUwMngiLAotCQkJcnQtPnJ0NmlfZHN0LmFkZHIuczZfYWRkcltpXSk7Ci0JCWFyZy0+bGVuICs9IDI7Ci0JfQotCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwgIiAlMDJ4ICIsCisJYXJnLT5sZW4gKz0gc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLAorCQkJICAgIE5JUDZfU0VRRk1UICIgJTAyeCAiLAorCQkJICAgIE5JUDYocnQtPnJ0NmlfZHN0LmFkZHIpLAogCQkJICAgIHJ0LT5ydDZpX2RzdC5wbGVuKTsKIAogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCi0JZm9yIChpPTA7IGk8MTY7IGkrKykgewotCQlzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sICIlMDJ4IiwKLQkJCXJ0LT5ydDZpX3NyYy5hZGRyLnM2X2FkZHJbaV0pOwotCQlhcmctPmxlbiArPSAyOwotCX0KLQlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sICIgJTAyeCAiLAorCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKKwkJCSAgICBOSVA2X1NFUUZNVCAiICUwMnggIiwKKwkJCSAgICBOSVA2KHJ0LT5ydDZpX3NyYy5hZGRyKSwKIAkJCSAgICBydC0+cnQ2aV9zcmMucGxlbik7CiAjZWxzZQotCXNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKLQkJIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwICIpOwotCWFyZy0+bGVuICs9IDM2OworCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKKwkJCSAgICAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAgIik7CiAjZW5kaWYKIAogCWlmIChydC0+cnQ2aV9uZXh0aG9wKSB7Ci0JCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKLQkJCXNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwgIiUwMngiLAotCQkJCXJ0LT5ydDZpX25leHRob3AtPnByaW1hcnlfa2V5W2ldKTsKLQkJCWFyZy0+bGVuICs9IDI7Ci0JCX0KKwkJYXJnLT5sZW4gKz0gc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLAorCQkJCSAgICBOSVA2X1NFUUZNVCwKKwkJCQkgICAgTklQNigqKChzdHJ1Y3QgaW42X2FkZHIgKilydC0+cnQ2aV9uZXh0aG9wLT5wcmltYXJ5X2tleSkpKTsKIAl9IGVsc2UgewotCQlzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCi0JCQkiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKTsKLQkJYXJnLT5sZW4gKz0gMzI7CisJCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKKwkJCQkgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CiAJfQogCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKIAkJCSAgICAiICUwOHggJTA4eCAlMDh4ICUwOHggJThzXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCBiZTY5OWY4Li43N2I3YjA5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtNjAsNyArNjAsNyBAQAogICovCiAKICNkZWZpbmUgSEFTSF9TSVpFICAxNgotI2RlZmluZSBIQVNIKGFkZHIpICgoYWRkcl4oYWRkcj4+NCkpJjB4RikKKyNkZWZpbmUgSEFTSChhZGRyKSAoKChfX2ZvcmNlIHUzMilhZGRyXigoX19mb3JjZSB1MzIpYWRkcj4+NCkpJjB4RikKIAogc3RhdGljIGludCBpcGlwNl9mYl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgaXBpcDZfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC03Niw3ICs3Niw3IEBACiAKIHN0YXRpYyBERUZJTkVfUldMT0NLKGlwaXA2X2xvY2spOwogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwaXA2X3R1bm5lbF9sb29rdXAodTMyIHJlbW90ZSwgdTMyIGxvY2FsKQorc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGlwNl90dW5uZWxfbG9va3VwKF9fYmUzMiByZW1vdGUsIF9fYmUzMiBsb2NhbCkKIHsKIAl1bnNpZ25lZCBoMCA9IEhBU0gocmVtb3RlKTsKIAl1bnNpZ25lZCBoMSA9IEhBU0gobG9jYWwpOwpAQCAtMTAyLDggKzEwMiw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqIGlwaXA2X2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQogewotCXUzMiByZW1vdGUgPSB0LT5wYXJtcy5pcGguZGFkZHI7Ci0JdTMyIGxvY2FsID0gdC0+cGFybXMuaXBoLnNhZGRyOworCV9fYmUzMiByZW1vdGUgPSB0LT5wYXJtcy5pcGguZGFkZHI7CisJX19iZTMyIGxvY2FsID0gdC0+cGFybXMuaXBoLnNhZGRyOwogCXVuc2lnbmVkIGggPSAwOwogCWludCBwcmlvID0gMDsKIApAQCAtMTQ0LDggKzE0NCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBpcDZfdHVubmVsX2xvY2F0ZShzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zLCBpbnQgY3JlYXRlKQogewotCXUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOwotCXUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CisJX19iZTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7CisJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBoID0gMDsKQEAgLTQwNSw5ICs0MDUsOSBAQAogLyogUmV0dXJucyB0aGUgZW1iZWRkZWQgSVB2NCBhZGRyZXNzIGlmIHRoZSBJUHY2IGFkZHJlc3MKICAgIGNvbWVzIGZyb20gNnRvNCAoUkZDIDMwNTYpIGFkZHIgc3BhY2UgKi8KIAotc3RhdGljIGlubGluZSB1MzIgdHJ5XzZ0bzQoc3RydWN0IGluNl9hZGRyICp2NmRzdCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyIHRyeV82dG80KHN0cnVjdCBpbjZfYWRkciAqdjZkc3QpCiB7Ci0JdTMyIGRzdCA9IDA7CisJX19iZTMyIGRzdCA9IDA7CiAKIAlpZiAodjZkc3QtPnM2X2FkZHIxNlswXSA9PSBodG9ucygweDIwMDIpKSB7CiAJICAgICAgICAvKiA2dG80IHY2IGFkZHIgaGFzIDE2IGJpdHMgcHJlZml4LCAzMiB2NGFkZHIsIDE2IFNMQSwgLi4uICovCkBAIC00MzIsNyArNDMyLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsJCQkvKiBEZXZpY2UgdG8gb3RoZXIgaG9zdCAqLwogCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLwogCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KLQl1MzIgICAgZHN0ID0gdGlwaC0+ZGFkZHI7CisJX19iZTMyIGRzdCA9IHRpcGgtPmRhZGRyOwogCWludCAgICBtdHU7CiAJc3RydWN0IGluNl9hZGRyICphZGRyNjsJCiAJaW50IGFkZHJfdHlwZTsKQEAgLTgwOSw3ICs4MDksNyBAQAogCX0KIH0KIAotdm9pZCBfX2V4aXQgc2l0X2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXRfY2xlYW51cCh2b2lkKQogewogCWluZXRfZGVsX3Byb3RvY29sKCZzaXRfcHJvdG9jb2wsIElQUFJPVE9fSVBWNik7CiAKQEAgLTgxOSw3ICs4MTksNyBAQAogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKLWludCBfX2luaXQgc2l0X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHNpdF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggNGMyYTdjMC4uYzI1ZTkzMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC02NiwxMCArNjYsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKIC8qIFNvY2tldCB1c2VkIGZvciBzZW5kaW5nIFJTVHMgYW5kIEFDS3MgKi8KIHN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICp0Y3A2X3NvY2tldDsKIAotc3RhdGljIHZvaWQJdGNwX3Y2X3NlbmRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZAl0Y3BfdjZfc2VuZF9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQJdGNwX3Y2X3JlcXNrX3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CiBzdGF0aWMgdm9pZAl0Y3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIAogCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CkBAIC03OCw2ICs4MSwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrX2FmX29wcyBpcHY2X21hcHBlZDsKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2tfYWZfb3BzIGlwdjZfc3BlY2lmaWM7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKK3N0YXRpYyBzdHJ1Y3QgdGNwX3NvY2tfYWZfb3BzIHRjcF9zb2NrX2lwdjZfc3BlY2lmaWM7CitzdGF0aWMgc3RydWN0IHRjcF9zb2NrX2FmX29wcyB0Y3Bfc29ja19pcHY2X21hcHBlZF9zcGVjaWZpYzsKKyNlbmRpZgogCiBzdGF0aWMgaW50IHRjcF92Nl9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pCiB7CkBAIC05OCwyNyArMTA1LDIwIEBACiAJfQogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1MTYgdGNwX3Y2X2NoZWNrKHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLAorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiB0Y3BfdjZfY2hlY2soc3RydWN0IHRjcGhkciAqdGgsIGludCBsZW4sCiAJCQkJICAgc3RydWN0IGluNl9hZGRyICpzYWRkciwgCiAJCQkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgCi0JCQkJICAgdW5zaWduZWQgbG9uZyBiYXNlKQorCQkJCSAgIF9fd3N1bSBiYXNlKQogewogCXJldHVybiBjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBsZW4sIElQUFJPVE9fVENQLCBiYXNlKTsKIH0KIAotc3RhdGljIF9fdTMyIHRjcF92Nl9pbml0X3NlcXVlbmNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBfX3UzMiB0Y3BfdjZfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7Ci0JCXJldHVybiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXB2NmgtPmRhZGRyLnM2X2FkZHIzMiwKLQkJCQkJCSAgICBza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyMzIsCi0JCQkJCQkgICAgc2tiLT5oLnRoLT5kZXN0LAotCQkJCQkJICAgIHNrYi0+aC50aC0+c291cmNlKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQkJICBza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCQkgIHNrYi0+aC50aC0+ZGVzdCwKLQkJCQkJCSAgc2tiLT5oLnRoLT5zb3VyY2UpOwotCX0KKwlyZXR1cm4gc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwdjZoLT5kYWRkci5zNl9hZGRyMzIsCisJCQkJCSAgICBza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyMzIsCisJCQkJCSAgICBza2ItPmgudGgtPmRlc3QsCisJCQkJCSAgICBza2ItPmgudGgtPnNvdXJjZSk7CiB9CiAKIHN0YXRpYyBpbnQgdGNwX3Y2X2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCAKQEAgLTIxNSw2ICsyMTUsOSBAQAogCiAJCWljc2stPmljc2tfYWZfb3BzID0gJmlwdjZfbWFwcGVkOwogCQlzay0+c2tfYmFja2xvZ19yY3YgPSB0Y3BfdjRfZG9fcmN2OworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCXRwLT5hZl9zcGVjaWZpYyA9ICZ0Y3Bfc29ja19pcHY2X21hcHBlZF9zcGVjaWZpYzsKKyNlbmRpZgogCiAJCWVyciA9IHRjcF92NF9jb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpOwogCkBAIC0yMjIsNiArMjI1LDkgQEAKIAkJCWljc2stPmljc2tfZXh0X2hkcl9sZW4gPSBleHRoZHJsZW47CiAJCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZpcHY2X3NwZWNpZmljOwogCQkJc2stPnNrX2JhY2tsb2dfcmN2ID0gdGNwX3Y2X2RvX3JjdjsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQkJdHAtPmFmX3NwZWNpZmljID0gJnRjcF9zb2NrX2lwdjZfc3BlY2lmaWM7CisjZW5kaWYKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfSBlbHNlIHsKIAkJCWlwdjZfYWRkcl9zZXQoJm5wLT5zYWRkciwgMCwgMCwgaHRvbmwoMHgwMDAwRkZGRiksCkBAIC0zMTAsNyArMzE2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgdGNwX3Y2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkJaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQorCQlpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKQogewogCXN0cnVjdCBpcHY2aGRyICpoZHIgPSAoc3RydWN0IGlwdjZoZHIqKXNrYi0+ZGF0YTsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YStvZmZzZXQpOwpAQCAtNTA5LDggKzUxNSw3IEBACiAKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZ0cmVxLT5ybXRfYWRkcik7CiAJCWVyciA9IGlwNl94bWl0KHNrLCBza2IsICZmbCwgb3B0LCAwKTsKLQkJaWYgKGVyciA9PSBORVRfWE1JVF9DTikKLQkJCWVyciA9IDA7CisJCWVyciA9IG5ldF94bWl0X2V2YWwoZXJyKTsKIAl9CiAKIGRvbmU6CkBAIC01MjYsNyArNTMxLDM5NiBAQAogCQlrZnJlZV9za2IoaW5ldDZfcnNrKHJlcSktPnBrdG9wdHMpOwogfQogCi1zdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgdGNwNl9yZXF1ZXN0X3NvY2tfb3BzID0geworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCitzdGF0aWMgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICp0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGk7CisKKwlCVUdfT04odHAgPT0gTlVMTCk7CisKKwlpZiAoIXRwLT5tZDVzaWdfaW5mbyB8fCAhdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNikKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNjsgaSsrKSB7CisJCWlmIChpcHY2X2FkZHJfY21wKCZ0cC0+bWQ1c2lnX2luZm8tPmtleXM2W2ldLmFkZHIsIGFkZHIpID09IDApCisJCQlyZXR1cm4gKHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqKSZ0cC0+bWQ1c2lnX2luZm8tPmtleXM2W2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y2X21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJc3RydWN0IHNvY2sgKmFkZHJfc2spCit7CisJcmV0dXJuIHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmaW5ldDZfc2soYWRkcl9zayktPmRhZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y2X3JlcXNrX21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQoreworCXJldHVybiB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmluZXQ2X3JzayhyZXEpLT5ybXRfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Y2X21kNV9kb19hZGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW42X2FkZHIgKnBlZXIsCisJCQkgICAgIGNoYXIgKm5ld2tleSwgdTggbmV3a2V5bGVuKQoreworCS8qIEFkZCBrZXkgdG8gdGhlIGxpc3QgKi8KKwlzdHJ1Y3QgdGNwNl9tZDVzaWdfa2V5ICprZXk7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHRjcDZfbWQ1c2lnX2tleSAqa2V5czsKKworCWtleSA9IChzdHJ1Y3QgdGNwNl9tZDVzaWdfa2V5KikgdGNwX3Y2X21kNV9kb19sb29rdXAoc2ssIHBlZXIpOworCWlmIChrZXkpIHsKKwkJLyogbW9kaWZ5IGV4aXN0aW5nIGVudHJ5IC0ganVzdCB1cGRhdGUgdGhhdCBvbmUgKi8KKwkJa2ZyZWUoa2V5LT5rZXkpOworCQlrZXktPmtleSA9IG5ld2tleTsKKwkJa2V5LT5rZXlsZW4gPSBuZXdrZXlsZW47CisJfSBlbHNlIHsKKwkJLyogcmVhbGxvY2F0ZSBuZXcgbGlzdCBpZiBjdXJyZW50IG9uZSBpcyBmdWxsLiAqLworCQlpZiAoIXRwLT5tZDVzaWdfaW5mbykgeworCQkJdHAtPm1kNXNpZ19pbmZvID0ga3phbGxvYyhzaXplb2YoKnRwLT5tZDVzaWdfaW5mbyksIEdGUF9BVE9NSUMpOworCQkJaWYgKCF0cC0+bWQ1c2lnX2luZm8pIHsKKwkJCQlrZnJlZShuZXdrZXkpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisJCXRjcF9hbGxvY19tZDVzaWdfcG9vbCgpOworCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5hbGxvY2VkNiA9PSB0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2KSB7CisJCQlrZXlzID0ga21hbGxvYygoc2l6ZW9mICh0cC0+bWQ1c2lnX2luZm8tPmtleXM2WzBdKSAqCisJCQkJICAgICAgICh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2ICsgMSkpLCBHRlBfQVRPTUlDKTsKKworCQkJaWYgKCFrZXlzKSB7CisJCQkJdGNwX2ZyZWVfbWQ1c2lnX3Bvb2woKTsKKwkJCQlrZnJlZShuZXdrZXkpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNikKKwkJCQltZW1tb3ZlKGtleXMsIHRwLT5tZDVzaWdfaW5mby0+a2V5czYsCisJCQkJCShzaXplb2YgKHRwLT5tZDVzaWdfaW5mby0+a2V5czZbMF0pICoKKwkJCQkJIHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczYpKTsKKworCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNik7CisJCQl0cC0+bWQ1c2lnX2luZm8tPmtleXM2ID0ga2V5czsKKwkJCXRwLT5tZDVzaWdfaW5mby0+YWxsb2NlZDYrKzsKKwkJfQorCisJCWlwdjZfYWRkcl9jb3B5KCZ0cC0+bWQ1c2lnX2luZm8tPmtleXM2W3RwLT5tZDVzaWdfaW5mby0+ZW50cmllczZdLmFkZHIsCisJCQkgICAgICAgcGVlcik7CisJCXRwLT5tZDVzaWdfaW5mby0+a2V5czZbdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNl0ua2V5ID0gbmV3a2V5OworCQl0cC0+bWQ1c2lnX2luZm8tPmtleXM2W3RwLT5tZDVzaWdfaW5mby0+ZW50cmllczZdLmtleWxlbiA9IG5ld2tleWxlbjsKKworCQl0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2Kys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcF92Nl9tZDVfYWRkX2Z1bmMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqYWRkcl9zaywKKwkJCSAgICAgICB1OCAqbmV3a2V5LCBfX3U4IG5ld2tleWxlbikKK3sKKwlyZXR1cm4gdGNwX3Y2X21kNV9kb19hZGQoc2ssICZpbmV0Nl9zayhhZGRyX3NrKS0+ZGFkZHIsCisJCQkJIG5ld2tleSwgbmV3a2V5bGVuKTsKK30KKworc3RhdGljIGludCB0Y3BfdjZfbWQ1X2RvX2RlbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbjZfYWRkciAqcGVlcikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2OyBpKyspIHsKKwkJaWYgKGlwdjZfYWRkcl9jbXAoJnRwLT5tZDVzaWdfaW5mby0+a2V5czZbaV0uYWRkciwgcGVlcikgPT0gMCkgeworCQkJLyogRnJlZSB0aGUga2V5ICovCisJCQlrZnJlZSh0cC0+bWQ1c2lnX2luZm8tPmtleXM2W2ldLmtleSk7CisJCQl0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2LS07CisKKwkJCWlmICh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2ID09IDApIHsKKwkJCQlrZnJlZSh0cC0+bWQ1c2lnX2luZm8tPmtleXM2KTsKKwkJCQl0cC0+bWQ1c2lnX2luZm8tPmtleXM2ID0gTlVMTDsKKworCQkJCXRjcF9mcmVlX21kNXNpZ19wb29sKCk7CisKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2hyaW5rIHRoZSBkYXRhYmFzZSAqLworCQkJCWlmICh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2ICE9IGkpCisJCQkJCW1lbW1vdmUoJnRwLT5tZDVzaWdfaW5mby0+a2V5czZbaV0sCisJCQkJCQkmdHAtPm1kNXNpZ19pbmZvLT5rZXlzNltpKzFdLAorCQkJCQkJKHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczYgLSBpKQorCQkJCQkJKiBzaXplb2YgKHRwLT5tZDVzaWdfaW5mby0+a2V5czZbMF0pKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIHZvaWQgdGNwX3Y2X2NsZWFyX21kNV9saXN0IChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGk7CisKKwlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNikgeworCQlmb3IgKGkgPSAwOyBpIDwgdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNjsgaSsrKQorCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNltpXS5rZXkpOworCQl0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2ID0gMDsKKwkJdGNwX2ZyZWVfbWQ1c2lnX3Bvb2woKTsKKwl9CisKKwlrZnJlZSh0cC0+bWQ1c2lnX2luZm8tPmtleXM2KTsKKwl0cC0+bWQ1c2lnX2luZm8tPmtleXM2ID0gTlVMTDsKKwl0cC0+bWQ1c2lnX2luZm8tPmFsbG9jZWQ2ID0gMDsKKworCWlmICh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0KSB7CisJCWZvciAoaSA9IDA7IGkgPCB0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0OyBpKyspCisJCQlrZnJlZSh0cC0+bWQ1c2lnX2luZm8tPmtleXM0W2ldLmtleSk7CisJCXRwLT5tZDVzaWdfaW5mby0+ZW50cmllczQgPSAwOworCQl0Y3BfZnJlZV9tZDVzaWdfcG9vbCgpOworCX0KKworCWtmcmVlKHRwLT5tZDVzaWdfaW5mby0+a2V5czQpOworCXRwLT5tZDVzaWdfaW5mby0+a2V5czQgPSBOVUxMOworCXRwLT5tZDVzaWdfaW5mby0+YWxsb2NlZDQgPSAwOworfQorCitzdGF0aWMgaW50IHRjcF92Nl9wYXJzZV9tZDVfa2V5cyAoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCSAgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3QgdGNwX21kNXNpZyBjbWQ7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmNtZC50Y3BtX2FkZHI7CisJdTggKm5ld2tleTsKKworCWlmIChvcHRsZW4gPCBzaXplb2YoY21kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgb3B0dmFsLCBzaXplb2YoY21kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY21kLnRjcG1fa2V5bGVuKSB7CisJCWlmICghdGNwX3NrKHNrKS0+bWQ1c2lnX2luZm8pCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX01BUFBFRCkKKwkJCXJldHVybiB0Y3BfdjRfbWQ1X2RvX2RlbChzaywgc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSk7CisJCXJldHVybiB0Y3BfdjZfbWQ1X2RvX2RlbChzaywgJnNpbjYtPnNpbjZfYWRkcik7CisJfQorCisJaWYgKGNtZC50Y3BtX2tleWxlbiA+IFRDUF9NRDVTSUdfTUFYS0VZTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdGNwX3NrKHNrKS0+bWQ1c2lnX2luZm8pIHsKKwkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJCXN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8gKnA7CisKKwkJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdHAtPm1kNXNpZ19pbmZvID0gcDsKKwl9CisKKwluZXdrZXkgPSBrbWVtZHVwKGNtZC50Y3BtX2tleSwgY21kLnRjcG1fa2V5bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld2tleSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX01BUFBFRCkgeworCQlyZXR1cm4gdGNwX3Y0X21kNV9kb19hZGQoc2ssIHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10sCisJCQkJCSBuZXdrZXksIGNtZC50Y3BtX2tleWxlbik7CisJfQorCXJldHVybiB0Y3BfdjZfbWQ1X2RvX2FkZChzaywgJnNpbjYtPnNpbjZfYWRkciwgbmV3a2V5LCBjbWQudGNwbV9rZXlsZW4pOworfQorCitzdGF0aWMgaW50IHRjcF92Nl9kb19jYWxjX21kNV9oYXNoKGNoYXIgKm1kNV9oYXNoLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwKKwkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJICAgc3RydWN0IHRjcGhkciAqdGgsIGludCBwcm90b2NvbCwKKwkJCQkgICBpbnQgdGNwbGVuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1s0XTsKKwlfX3UxNiBkYXRhX2xlbjsKKwlpbnQgYmxvY2sgPSAwOworCV9fc3VtMTYgY2tzdW07CisJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqaHA7CisJc3RydWN0IHRjcDZfcHNldWRvaGRyICpicDsKKwlzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IDA7CisKKwlocCA9IHRjcF9nZXRfbWQ1c2lnX3Bvb2woKTsKKwlpZiAoIWhwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IGhhc2ggcG9vbCBub3QgZm91bmQuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gY2xlYXJfaGFzaF9ub3B1dDsKKwl9CisJYnAgPSAmaHAtPm1kNV9ibGsuaXA2OworCWRlc2MgPSAmaHAtPm1kNV9kZXNjOworCisJLyogMS4gVENQIHBzZXVkby1oZWFkZXIgKFJGQzI0NjApICovCisJaXB2Nl9hZGRyX2NvcHkoJmJwLT5zYWRkciwgc2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZicC0+ZGFkZHIsIGRhZGRyKTsKKwlicC0+bGVuID0gaHRvbmwodGNwbGVuKTsKKwlicC0+cHJvdG9jb2wgPSBodG9ubChwcm90b2NvbCk7CisKKwlzZ19zZXRfYnVmKCZzZ1tibG9jaysrXSwgYnAsIHNpemVvZigqYnApKTsKKwluYnl0ZXMgKz0gc2l6ZW9mKCpicCk7CisKKwkvKiAyLiBUQ1AgaGVhZGVyLCBleGNsdWRpbmcgb3B0aW9ucyAqLworCWNrc3VtID0gdGgtPmNoZWNrOworCXRoLT5jaGVjayA9IDA7CisJc2dfc2V0X2J1Zigmc2dbYmxvY2srK10sIHRoLCBzaXplb2YoKnRoKSk7CisJbmJ5dGVzICs9IHNpemVvZigqdGgpOworCisJLyogMy4gVENQIHNlZ21lbnQgZGF0YSAoaWYgYW55KSAqLworCWRhdGFfbGVuID0gdGNwbGVuIC0gKHRoLT5kb2ZmIDw8IDIpOworCWlmIChkYXRhX2xlbiA+IDApIHsKKwkJdTggKmRhdGEgPSAodTggKil0aCArICh0aC0+ZG9mZiA8PCAyKTsKKwkJc2dfc2V0X2J1Zigmc2dbYmxvY2srK10sIGRhdGEsIGRhdGFfbGVuKTsKKwkJbmJ5dGVzICs9IGRhdGFfbGVuOworCX0KKworCS8qIDQuIHNoYXJlZCBrZXkgKi8KKwlzZ19zZXRfYnVmKCZzZ1tibG9jaysrXSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKwluYnl0ZXMgKz0ga2V5LT5rZXlsZW47CisKKwkvKiBOb3cgc3RvcmUgdGhlIGhhc2ggaW50byB0aGUgcGFja2V0ICovCisJZXJyID0gY3J5cHRvX2hhc2hfaW5pdChkZXNjKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IGhhc2hfaW5pdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gY2xlYXJfaGFzaDsKKwl9CisJZXJyID0gY3J5cHRvX2hhc2hfdXBkYXRlKGRlc2MsIHNnLCBuYnl0ZXMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogaGFzaF91cGRhdGUgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGNsZWFyX2hhc2g7CisJfQorCWVyciA9IGNyeXB0b19oYXNoX2ZpbmFsKGRlc2MsIG1kNV9oYXNoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IGhhc2hfZmluYWwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGNsZWFyX2hhc2g7CisJfQorCisJLyogUmVzZXQgaGVhZGVyLCBhbmQgZnJlZSB1cCB0aGUgY3J5cHRvICovCisJdGNwX3B1dF9tZDVzaWdfcG9vbCgpOworCXRoLT5jaGVjayA9IGNrc3VtOworb3V0OgorCXJldHVybiAwOworY2xlYXJfaGFzaDoKKwl0Y3BfcHV0X21kNXNpZ19wb29sKCk7CitjbGVhcl9oYXNoX25vcHV0OgorCW1lbXNldChtZDVfaGFzaCwgMCwgMTYpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IHRjcF92Nl9jYWxjX21kNV9oYXNoKGNoYXIgKm1kNV9oYXNoLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwKKwkJCQlzdHJ1Y3Qgc29jayAqc2ssCisJCQkJc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKKwkJCQlzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IHByb3RvY29sLAorCQkJCWludCB0Y3BsZW4pCit7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciwgKmRhZGRyOworCisJaWYgKHNrKSB7CisJCXNhZGRyID0gJmluZXQ2X3NrKHNrKS0+c2FkZHI7CisJCWRhZGRyID0gJmluZXQ2X3NrKHNrKS0+ZGFkZHI7CisJfSBlbHNlIHsKKwkJc2FkZHIgPSAmaW5ldDZfcnNrKHJlcSktPmxvY19hZGRyOworCQlkYWRkciA9ICZpbmV0Nl9yc2socmVxKS0+cm10X2FkZHI7CisJfQorCXJldHVybiB0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaChtZDVfaGFzaCwga2V5LAorCQkJCSAgICAgICBzYWRkciwgZGFkZHIsCisJCQkJICAgICAgIHRoLCBwcm90b2NvbCwgdGNwbGVuKTsKK30KKworc3RhdGljIGludCB0Y3BfdjZfaW5ib3VuZF9tZDVfaGFzaCAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggKmhhc2hfbG9jYXRpb24gPSBOVUxMOworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqaGFzaF9leHBlY3RlZDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJaW50IGxlbmd0aCA9ICh0aC0+ZG9mZiA8PCAyKSAtIHNpemVvZiAoKnRoKTsKKwlpbnQgZ2VuaGFzaDsKKwl1OCAqcHRyOworCXU4IG5ld2hhc2hbMTZdOworCisJaGFzaF9leHBlY3RlZCA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmaXA2aC0+c2FkZHIpOworCisJLyogSWYgdGhlIFRDUCBvcHRpb24gaXMgdG9vIHNob3J0LCB3ZSBjYW4gc2hvcnQgY3V0ICovCisJaWYgKGxlbmd0aCA8IFRDUE9MRU5fTUQ1U0lHKQorCQlyZXR1cm4gaGFzaF9leHBlY3RlZCA/IDEgOiAwOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCXB0ciA9ICh1OCopKHRoICsgMSk7CisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJaW50IG9wY29kZSA9ICpwdHIrKzsKKwkJaW50IG9wc2l6ZTsKKworCQlzd2l0Y2gob3Bjb2RlKSB7CisJCWNhc2UgVENQT1BUX0VPTDoKKwkJCWdvdG8gZG9uZV9vcHRzOworCQljYXNlIFRDUE9QVF9OT1A6CisJCQlsZW5ndGgtLTsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJb3BzaXplID0gKnB0cisrOworCQkJaWYgKG9wc2l6ZSA8IDIgfHwgb3BzaXplID4gbGVuZ3RoKQorCQkJCWdvdG8gZG9uZV9vcHRzOworCQkJaWYgKG9wY29kZSA9PSBUQ1BPUFRfTUQ1U0lHKSB7CisJCQkJaGFzaF9sb2NhdGlvbiA9IHB0cjsKKwkJCQlnb3RvIGRvbmVfb3B0czsKKwkJCX0KKwkJfQorCQlwdHIgKz0gb3BzaXplIC0gMjsKKwkJbGVuZ3RoIC09IG9wc2l6ZTsKKwl9CisKK2RvbmVfb3B0czoKKwkvKiBkbyB3ZSBoYXZlIGEgaGFzaCBhcyBleHBlY3RlZD8gKi8KKwlpZiAoIWhhc2hfZXhwZWN0ZWQpIHsKKwkJaWYgKCFoYXNoX2xvY2F0aW9uKQorCQkJcmV0dXJuIDA7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIk1ENSBIYXNoIE5PVCBleHBlY3RlZCBidXQgZm91bmQgIgorCQkJICAgICAgICIoIiBOSVA2X0ZNVCAiLCAldSktPiIKKwkJCSAgICAgICAiKCIgTklQNl9GTVQgIiwgJXUpXG4iLAorCQkJICAgICAgIE5JUDYoaXA2aC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCSAgICAgICBOSVA2KGlwNmgtPmRhZGRyKSwgbnRvaHModGgtPmRlc3QpKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWhhc2hfbG9jYXRpb24pIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTUQ1IEhhc2ggZXhwZWN0ZWQgYnV0IE5PVCBmb3VuZCAiCisJCQkgICAgICAgIigiIE5JUDZfRk1UICIsICV1KS0+IgorCQkJICAgICAgICIoIiBOSVA2X0ZNVCAiLCAldSlcbiIsCisJCQkgICAgICAgTklQNihpcDZoLT5zYWRkciksIG50b2hzKHRoLT5zb3VyY2UpLAorCQkJICAgICAgIE5JUDYoaXA2aC0+ZGFkZHIpLCBudG9ocyh0aC0+ZGVzdCkpOworCQl9CisJCXJldHVybiAxOworCX0KKworCS8qIGNoZWNrIHRoZSBzaWduYXR1cmUgKi8KKwlnZW5oYXNoID0gdGNwX3Y2X2RvX2NhbGNfbWQ1X2hhc2gobmV3aGFzaCwKKwkJCQkJICBoYXNoX2V4cGVjdGVkLAorCQkJCQkgICZpcDZoLT5zYWRkciwgJmlwNmgtPmRhZGRyLAorCQkJCQkgIHRoLCBzay0+c2tfcHJvdG9jb2wsCisJCQkJCSAgc2tiLT5sZW4pOworCWlmIChnZW5oYXNoIHx8IG1lbWNtcChoYXNoX2xvY2F0aW9uLCBuZXdoYXNoLCAxNikgIT0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJNRDUgSGFzaCAlcyBmb3IgIgorCQkJICAgICAgICIoIiBOSVA2X0ZNVCAiLCAldSktPiIKKwkJCSAgICAgICAiKCIgTklQNl9GTVQgIiwgJXUpXG4iLAorCQkJICAgICAgIGdlbmhhc2ggPyAiZmFpbGVkIiA6ICJtaXNtYXRjaCIsCisJCQkgICAgICAgTklQNihpcDZoLT5zYWRkciksIG50b2hzKHRoLT5zb3VyY2UpLAorCQkJICAgICAgIE5JUDYoaXA2aC0+ZGFkZHIpLCBudG9ocyh0aC0+ZGVzdCkpOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgdGNwNl9yZXF1ZXN0X3NvY2tfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmZhbWlseQkJPQlBRl9JTkVUNiwKIAkub2JqX3NpemUJPQlzaXplb2Yoc3RydWN0IHRjcDZfcmVxdWVzdF9zb2NrKSwKIAkucnR4X3N5bl9hY2sJPQl0Y3BfdjZfc2VuZF9zeW5hY2ssCkBAIC01MzUsOSArOTI5LDE2IEBACiAJLnNlbmRfcmVzZXQJPQl0Y3BfdjZfc2VuZF9yZXNldAogfTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCitzdGF0aWMgc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2tfb3BzIHRjcF9yZXF1ZXN0X3NvY2tfaXB2Nl9vcHMgPSB7CisJLm1kNV9sb29rdXAJPQl0Y3BfdjZfcmVxc2tfbWQ1X2xvb2t1cCwKK307CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCB0aW1ld2FpdF9zb2NrX29wcyB0Y3A2X3RpbWV3YWl0X3NvY2tfb3BzID0gewogCS50d3NrX29ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCB0Y3A2X3RpbWV3YWl0X3NvY2spLAogCS50d3NrX3VuaXF1ZQk9IHRjcF90d3NrX3VuaXF1ZSwKKwkudHdza19kZXN0cnVjdG9yPSB0Y3BfdHdza19kZXN0cnVjdG9yLAogfTsKIAogc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNTQ3LDcgKzk0OCw3IEBACiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQl0aC0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZucC0+c2FkZHIsICZucC0+ZGFkZHIsIGxlbiwgSVBQUk9UT19UQ1AsICAwKTsKLQkJc2tiLT5jc3VtID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOworCQlza2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOwogCX0gZWxzZSB7CiAJCXRoLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmbnAtPnNhZGRyLCAmbnAtPmRhZGRyLCBsZW4sIElQUFJPVE9fVENQLCAKIAkJCQkJICAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRoLCB0aC0+ZG9mZjw8MiwgCkBAIC01NjksMTYgKzk3MCwyMCBAQAogCXRoLT5jaGVjayA9IDA7CiAJdGgtPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmaXB2NmgtPnNhZGRyLCAmaXB2NmgtPmRhZGRyLCBza2ItPmxlbiwKIAkJCQkgICAgIElQUFJPVE9fVENQLCAwKTsKLQlza2ItPmNzdW0gPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CisJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGgsICp0MTsgCiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAJc3RydWN0IGZsb3dpIGZsOworCWludCB0b3RfbGVuID0gc2l6ZW9mKCp0aCk7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKyNlbmRpZgogCiAJaWYgKHRoLT5yc3QpCiAJCXJldHVybjsKQEAgLTU4NiwyNSArOTkxLDM1IEBACiAJaWYgKCFpcHY2X3VuaWNhc3RfZGVzdGluYXRpb24oc2tiKSkKIAkJcmV0dXJuOyAKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKHNrKQorCQlrZXkgPSB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwllbHNlCisJCWtleSA9IE5VTEw7CisKKwlpZiAoa2V5KQorCQl0b3RfbGVuICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKKwogCS8qCiAJICogV2UgbmVlZCB0byBncmFiIHNvbWUgbWVtb3J5LCBhbmQgcHV0IHRvZ2V0aGVyIGFuIFJTVCwKIAkgKiBhbmQgdGhlbiBwdXQgaXQgaW50byB0aGUgcXVldWUgdG8gYmUgc2VudC4KIAkgKi8KIAotCWJ1ZmYgPSBhbGxvY19za2IoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJYnVmZiA9IGFsbG9jX3NrYihNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHRvdF9sZW4sCiAJCQkgR0ZQX0FUT01JQyk7CiAJaWYgKGJ1ZmYgPT0gTlVMTCkgCiAJICAJcmV0dXJuOwogCi0Jc2tiX3Jlc2VydmUoYnVmZiwgTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCXNrYl9yZXNlcnZlKGJ1ZmYsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgdG90X2xlbik7CiAKLQl0MSA9IChzdHJ1Y3QgdGNwaGRyICopIHNrYl9wdXNoKGJ1ZmYsc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwl0MSA9IChzdHJ1Y3QgdGNwaGRyICopIHNrYl9wdXNoKGJ1ZmYsIHRvdF9sZW4pOwogCiAJLyogU3dhcCB0aGUgc2VuZCBhbmQgdGhlIHJlY2VpdmUuICovCiAJbWVtc2V0KHQxLCAwLCBzaXplb2YoKnQxKSk7CiAJdDEtPmRlc3QgPSB0aC0+c291cmNlOwogCXQxLT5zb3VyY2UgPSB0aC0+ZGVzdDsKLQl0MS0+ZG9mZiA9IHNpemVvZigqdDEpLzQ7CisJdDEtPmRvZmYgPSB0b3RfbGVuIC8gNDsKIAl0MS0+cnN0ID0gMTsKICAgCiAJaWYodGgtPmFjaykgewpAQCAtNjE1LDYgKzEwMzAsMjIgQEAKIAkJCQkgICAgKyBza2ItPmxlbiAtICh0aC0+ZG9mZjw8MikpOwogCX0KIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKGtleSkgeworCQlfX2JlMzIgKm9wdCA9IChfX2JlMzIqKSh0MSArIDEpOworCQlvcHRbMF0gPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAorCQkJICAgICAgIChUQ1BPUFRfTk9QIDw8IDE2KSB8CisJCQkgICAgICAgKFRDUE9QVF9NRDVTSUcgPDwgOCkgfAorCQkJICAgICAgIFRDUE9MRU5fTUQ1U0lHKTsKKwkJdGNwX3Y2X2RvX2NhbGNfbWQ1X2hhc2goKF9fdTgqKSZvcHRbMV0sCisJCQkJCWtleSwKKwkJCQkJJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJCQkmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQkJCXQxLCBJUFBST1RPX1RDUCwKKwkJCQkJdG90X2xlbik7CisJfQorI2VuZGlmCisKIAlidWZmLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdDEsIHNpemVvZigqdDEpLCAwKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwpAQCAtNjQ1LDE1ICsxMDc2LDM3IEBACiAJa2ZyZWVfc2tiKGJ1ZmYpOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywgdTMyIHdpbiwgdTMyIHRzKQorc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfYWNrKHN0cnVjdCB0Y3BfdGltZXdhaXRfc29jayAqdHcsCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywgdTMyIHdpbiwgdTMyIHRzKQogewogCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoLCAqdDE7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAJc3RydWN0IGZsb3dpIGZsOwogCWludCB0b3RfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCV9fYmUzMiAqdG9wdDsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5OworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSB0d19rZXk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKCF0dyAmJiBza2ItPnNrKSB7CisJCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrYi0+c2ssICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJfSBlbHNlIGlmICh0dyAmJiB0dy0+dHdfbWQ1X2tleWxlbikgeworCQl0d19rZXkua2V5ID0gdHctPnR3X21kNV9rZXk7CisJCXR3X2tleS5rZXlsZW4gPSB0dy0+dHdfbWQ1X2tleWxlbjsKKwkJa2V5ID0gJnR3X2tleTsKKwl9IGVsc2UgeworCQlrZXkgPSBOVUxMOworCX0KKyNlbmRpZgogCiAJaWYgKHRzKQogCQl0b3RfbGVuICs9IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlpZiAoa2V5KQorCQl0b3RfbGVuICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKIAogCWJ1ZmYgPSBhbGxvY19za2IoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyB0b3RfbGVuLAogCQkJIEdGUF9BVE9NSUMpOwpAQCAtNjczLDE1ICsxMTI2LDI5IEBACiAJdDEtPmFja19zZXEgPSBodG9ubChhY2spOwogCXQxLT5hY2sgPSAxOwogCXQxLT53aW5kb3cgPSBodG9ucyh3aW4pOworCisJdG9wdCA9IChfX2JlMzIgKikodDEgKyAxKTsKIAkKIAlpZiAodHMpIHsKLQkJdTMyICpwdHIgPSAodTMyKikodDEgKyAxKTsKLQkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKLQkJCSAgICAgICAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKTsKLQkJKnB0cisrID0gaHRvbmwodGNwX3RpbWVfc3RhbXApOwotCQkqcHRyID0gaHRvbmwodHMpOworCQkqdG9wdCsrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCQkoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKTsKKwkJKnRvcHQrKyA9IGh0b25sKHRjcF90aW1lX3N0YW1wKTsKKwkJKnRvcHQgPSBodG9ubCh0cyk7CiAJfQogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlpZiAoa2V5KSB7CisJCSp0b3B0KysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfCAoVENQT1BUX05PUCA8PCAxNikgfAorCQkJCShUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwgVENQT0xFTl9NRDVTSUcpOworCQl0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKXRvcHQsCisJCQkJCWtleSwKKwkJCQkJJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJCQkmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQkJCXQxLCBJUFBST1RPX1RDUCwKKwkJCQkJdG90X2xlbik7CisJfQorI2VuZGlmCisKIAlidWZmLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdDEsIHRvdF9sZW4sIDApOwogCiAJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CkBAIC03MTIsOSArMTE3OSw5IEBACiBzdGF0aWMgdm9pZCB0Y3BfdjZfdGltZXdhaXRfYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7Ci0JY29uc3Qgc3RydWN0IHRjcF90aW1ld2FpdF9zb2NrICp0Y3B0dyA9IHRjcF90d3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnRjcHR3ID0gdGNwX3R3c2soc2spOwogCi0JdGNwX3Y2X3NlbmRfYWNrKHNrYiwgdGNwdHctPnR3X3NuZF9ueHQsIHRjcHR3LT50d19yY3Zfbnh0LAorCXRjcF92Nl9zZW5kX2Fjayh0Y3B0dywgc2tiLCB0Y3B0dy0+dHdfc25kX254dCwgdGNwdHctPnR3X3Jjdl9ueHQsCiAJCQl0Y3B0dy0+dHdfcmN2X3duZCA+PiB0dy0+dHdfcmN2X3dzY2FsZSwKIAkJCXRjcHR3LT50d190c19yZWNlbnQpOwogCkBAIC03MjMsNyArMTE5MCw3IEBACiAKIHN0YXRpYyB2b2lkIHRjcF92Nl9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7Ci0JdGNwX3Y2X3NlbmRfYWNrKHNrYiwgdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSwgdGNwX3JzayhyZXEpLT5yY3ZfaXNuICsgMSwgcmVxLT5yY3Zfd25kLCByZXEtPnRzX3JlY2VudCk7CisJdGNwX3Y2X3NlbmRfYWNrKE5VTEwsIHNrYiwgdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSwgdGNwX3JzayhyZXEpLT5yY3ZfaXNuICsgMSwgcmVxLT5yY3Zfd25kLCByZXEtPnRzX3JlY2VudCk7CiB9CiAKIApAQCAtNzk0LDYgKzEyNjEsMTAgQEAKIAlpZiAocmVxID09IE5VTEwpCiAJCWdvdG8gZHJvcDsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJdGNwX3JzayhyZXEpLT5hZl9zcGVjaWZpYyA9ICZ0Y3BfcmVxdWVzdF9zb2NrX2lwdjZfb3BzOworI2VuZGlmCisKIAl0Y3BfY2xlYXJfb3B0aW9ucygmdG1wX29wdCk7CiAJdG1wX29wdC5tc3NfY2xhbXAgPSBJUFY2X01JTl9NVFUgLSBzaXplb2Yoc3RydWN0IHRjcGhkcikgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCXRtcF9vcHQudXNlcl9tc3MgPSB0cC0+cnhfb3B0LnVzZXJfbXNzOwpAQCAtODIyLDcgKzEyOTMsNyBAQAogCQl0cmVxLT5paWYgPSBpbmV0Nl9paWYoc2tiKTsKIAogCWlmIChpc24gPT0gMCkgCi0JCWlzbiA9IHRjcF92Nl9pbml0X3NlcXVlbmNlKHNrLHNrYik7CisJCWlzbiA9IHRjcF92Nl9pbml0X3NlcXVlbmNlKHNrYik7CiAKIAl0Y3BfcnNrKHJlcSktPnNudF9pc24gPSBpc247CiAKQEAgLTg1Miw2ICsxMzIzLDkgQEAKIAlzdHJ1Y3QgdGNwX3NvY2sgKm5ld3RwOwogCXN0cnVjdCBzb2NrICpuZXdzazsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdDsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5OworI2VuZGlmCiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJLyoKQEAgLTg4Miw2ICsxMzU2LDEwIEBACiAKIAkJaW5ldF9jc2sobmV3c2spLT5pY3NrX2FmX29wcyA9ICZpcHY2X21hcHBlZDsKIAkJbmV3c2stPnNrX2JhY2tsb2dfcmN2ID0gdGNwX3Y0X2RvX3JjdjsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQluZXd0cC0+YWZfc3BlY2lmaWMgPSAmdGNwX3NvY2tfaXB2Nl9tYXBwZWRfc3BlY2lmaWM7CisjZW5kaWYKKwogCQluZXducC0+cGt0b3B0aW9ucyAgPSBOVUxMOwogCQluZXducC0+b3B0CSAgID0gTlVMTDsKIAkJbmV3bnAtPm1jYXN0X29pZiAgID0gaW5ldDZfaWlmKHNrYik7CkBAIC0xMDE2LDYgKzE0OTQsMjEgQEAKIAogCW5ld2luZXQtPmRhZGRyID0gbmV3aW5ldC0+c2FkZHIgPSBuZXdpbmV0LT5yY3Zfc2FkZHIgPSBMT09QQkFDSzRfSVBWNjsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogQ29weSBvdmVyIHRoZSBNRDUga2V5IGZyb20gdGhlIG9yaWdpbmFsIHNvY2tldCAqLworCWlmICgoa2V5ID0gdGNwX3Y2X21kNV9kb19sb29rdXAoc2ssICZuZXducC0+ZGFkZHIpKSAhPSBOVUxMKSB7CisJCS8qIFdlJ3JlIHVzaW5nIG9uZSwgc28gY3JlYXRlIGEgbWF0Y2hpbmcga2V5CisJCSAqIG9uIHRoZSBuZXdzayBzdHJ1Y3R1cmUuIElmIHdlIGZhaWwgdG8gZ2V0CisJCSAqIG1lbW9yeSwgdGhlbiB3ZSBlbmQgdXAgbm90IGNvcHlpbmcgdGhlIGtleQorCQkgKiBhY3Jvc3MuIFNodWNrcy4KKwkJICovCisJCWNoYXIgKm5ld2tleSA9IGttZW1kdXAoa2V5LT5rZXksIGtleS0+a2V5bGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld2tleSAhPSBOVUxMKQorCQkJdGNwX3Y2X21kNV9kb19hZGQobmV3c2ssICZpbmV0Nl9zayhzayktPmRhZGRyLAorCQkJCQkgIG5ld2tleSwga2V5LT5rZXlsZW4pOworCX0KKyNlbmRpZgorCiAJX19pbmV0Nl9oYXNoKCZ0Y3BfaGFzaGluZm8sIG5ld3NrKTsKIAlpbmV0X2luaGVyaXRfcG9ydCgmdGNwX2hhc2hpbmZvLCBzaywgbmV3c2spOwogCkBAIC0xMDMxLDcgKzE1MjQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHRjcF92Nl9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgX19zdW0xNiB0Y3BfdjZfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewogCQlpZiAoIXRjcF92Nl9jaGVjayhza2ItPmgudGgsc2tiLT5sZW4sJnNrYi0+bmguaXB2NmgtPnNhZGRyLApAQCAtMTA0MSw4ICsxNTM0LDggQEAKIAkJfQogCX0KIAotCXNrYi0+Y3N1bSA9IH50Y3BfdjZfY2hlY2soc2tiLT5oLnRoLHNrYi0+bGVuLCZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkgICZza2ItPm5oLmlwdjZoLT5kYWRkciwgMCk7CisJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKHRjcF92Nl9jaGVjayhza2ItPmgudGgsc2tiLT5sZW4sJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCSAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCAwKSk7CiAKIAlpZiAoc2tiLT5sZW4gPD0gNzYpIHsKIAkJcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7CkBAIC0xMDc1LDYgKzE1NjgsMTEgQEAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCXJldHVybiB0Y3BfdjRfZG9fcmN2KHNrLCBza2IpOwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlpZiAodGNwX3Y2X2luYm91bmRfbWQ1X2hhc2ggKHNrLCBza2IpKQorCQlnb3RvIGRpc2NhcmQ7CisjZW5kaWYKKwogCWlmIChza19maWx0ZXIoc2ssIHNrYikpCiAJCWdvdG8gZGlzY2FyZDsKIApAQCAtMTE0MCw3ICsxNjM4LDcgQEAKIAlyZXR1cm4gMDsKIAogcmVzZXQ6Ci0JdGNwX3Y2X3NlbmRfcmVzZXQoc2tiKTsKKwl0Y3BfdjZfc2VuZF9yZXNldChzaywgc2tiKTsKIGRpc2NhcmQ6CiAJaWYgKG9wdF9za2IpCiAJCV9fa2ZyZWVfc2tiKG9wdF9za2IpOwpAQCAtMTI2NSw3ICsxNzYzLDcgQEAKIGJhZF9wYWNrZXQ6CiAJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOwogCX0gZWxzZSB7Ci0JCXRjcF92Nl9zZW5kX3Jlc2V0KHNrYik7CisJCXRjcF92Nl9zZW5kX3Jlc2V0KE5VTEwsIHNrYik7CiAJfQogCiBkaXNjYXJkX2l0OgpAQCAtMTM0NCw2ICsxODQyLDE1IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworc3RhdGljIHN0cnVjdCB0Y3Bfc29ja19hZl9vcHMgdGNwX3NvY2tfaXB2Nl9zcGVjaWZpYyA9IHsKKwkubWQ1X2xvb2t1cAk9CXRjcF92Nl9tZDVfbG9va3VwLAorCS5jYWxjX21kNV9oYXNoCT0JdGNwX3Y2X2NhbGNfbWQ1X2hhc2gsCisJLm1kNV9hZGQJPQl0Y3BfdjZfbWQ1X2FkZF9mdW5jLAorCS5tZDVfcGFyc2UJPQl0Y3BfdjZfcGFyc2VfbWQ1X2tleXMsCit9OworI2VuZGlmCisKIC8qCiAgKglUQ1Agb3ZlciBJUHY0IHZpYSBJTkVUNiBBUEkKICAqLwpAQCAtMTM2Niw2ICsxODczLDE1IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworc3RhdGljIHN0cnVjdCB0Y3Bfc29ja19hZl9vcHMgdGNwX3NvY2tfaXB2Nl9tYXBwZWRfc3BlY2lmaWMgPSB7CisJLm1kNV9sb29rdXAJPQl0Y3BfdjRfbWQ1X2xvb2t1cCwKKwkuY2FsY19tZDVfaGFzaAk9CXRjcF92NF9jYWxjX21kNV9oYXNoLAorCS5tZDVfYWRkCT0JdGNwX3Y2X21kNV9hZGRfZnVuYywKKwkubWQ1X3BhcnNlCT0JdGNwX3Y2X3BhcnNlX21kNV9rZXlzLAorfTsKKyNlbmRpZgorCiAvKiBOT1RFOiBBIGxvdCBvZiB0aGluZ3Mgc2V0IHRvIHplcm8gZXhwbGljaXRseSBieSBjYWxsIHRvCiAgKiAgICAgICBza19hbGxvYygpIHNvIG5lZWQgbm90IGJlIGRvbmUgaGVyZS4KICAqLwpAQCAtMTQwNSw2ICsxOTIxLDEwIEBACiAJc2stPnNrX3dyaXRlX3NwYWNlID0gc2tfc3RyZWFtX3dyaXRlX3NwYWNlOwogCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfVVNFX1dSSVRFX1FVRVVFKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJdHAtPmFmX3NwZWNpZmljID0gJnRjcF9zb2NrX2lwdjZfc3BlY2lmaWM7CisjZW5kaWYKKwogCXNrLT5za19zbmRidWYgPSBzeXNjdGxfdGNwX3dtZW1bMV07CiAJc2stPnNrX3JjdmJ1ZiA9IHN5c2N0bF90Y3Bfcm1lbVsxXTsKIApAQCAtMTQxNSw2ICsxOTM1LDExIEBACiAKIHN0YXRpYyBpbnQgdGNwX3Y2X2Rlc3Ryb3lfc29jayhzdHJ1Y3Qgc29jayAqc2spCiB7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkvKiBDbGVhbiB1cCB0aGUgTUQ1IGtleSBsaXN0ICovCisJaWYgKHRjcF9zayhzayktPm1kNXNpZ19pbmZvKQorCQl0Y3BfdjZfY2xlYXJfbWQ1X2xpc3Qoc2spOworI2VuZGlmCiAJdGNwX3Y0X2Rlc3Ryb3lfc29jayhzayk7CiAJcmV0dXJuIGluZXQ2X2Rlc3Ryb3lfc29jayhzayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90dW5uZWw2LmMgYi9uZXQvaXB2Ni90dW5uZWw2LmMKaW5kZXggMGVmOWEzNS4uOTE4ZDA3ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdHVubmVsNi5jCisrKyBiL25ldC9pcHY2L3R1bm5lbDYuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHR1bm5lbDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCQkJaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQorCQkJaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgeGZybTZfdHVubmVsICpoYW5kbGVyOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHAuYyBiL25ldC9pcHY2L3VkcC5jCmluZGV4IGM4M2YyM2UuLmY1MmE1YzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcC5jCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC0zOCwyNiArMzgsMTggQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8bmV0L3NvY2suaD4KLSNpbmNsdWRlIDxuZXQvc25tcC5oPgotCi0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvdHJhbnNwX3Y2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgotI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC91ZHAuaD4KICNpbmNsdWRlIDxuZXQvcmF3Lmg+Ci0jaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CiAjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KLQogI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSAidWRwX2ltcGwuaCIKIAogREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwX3N0YXRzX2luNikgX19yZWFkX21vc3RseTsKIApAQCAtNjYsMjMgKzU4LDkgQEAKIAlyZXR1cm4gdWRwX2dldF9wb3J0KHNrLCBzbnVtLCBpcHY2X3Jjdl9zYWRkcl9lcXVhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIHVkcF92Nl9oYXNoKHN0cnVjdCBzb2NrICpzaykKLXsKLQlCVUcoKTsKLX0KLQotc3RhdGljIHZvaWQgdWRwX3Y2X3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spCi17Ci0gCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOwotCWlmIChza19kZWxfbm9kZV9pbml0KHNrKSkgewotCQlpbmV0X3NrKHNrKS0+bnVtID0gMDsKLQkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJnVkcF9oYXNoX2xvY2spOwotfQotCi1zdGF0aWMgc3RydWN0IHNvY2sgKnVkcF92Nl9sb29rdXAoc3RydWN0IGluNl9hZGRyICpzYWRkciwgdTE2IHNwb3J0LAotCQkJCSAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgdTE2IGRwb3J0LCBpbnQgZGlmKQorc3RhdGljIHN0cnVjdCBzb2NrICpfX3VkcDZfbGliX2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBfX2JlMTYgc3BvcnQsCisJCQkJICAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX19iZTE2IGRwb3J0LAorCQkJCSAgICAgIGludCBkaWYsIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCiB7CiAJc3RydWN0IHNvY2sgKnNrLCAqcmVzdWx0ID0gTlVMTDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKQEAgLTkwLDcgKzY4LDcgQEAKIAlpbnQgYmFkbmVzcyA9IC0xOwogCiAgCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7Ci0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHBfaGFzaFtobnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkgeworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwdGFibGVbaG51bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pIHsKIAkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCiAJCWlmIChpbmV0LT5udW0gPT0gaG51bSAmJiBzay0+c2tfZmFtaWx5ID09IFBGX0lORVQ2KSB7CkBAIC0xMzIsMjAgKzExMCwxMSBAQAogfQogCiAvKgotICoKLSAqLwotCi1zdGF0aWMgdm9pZCB1ZHB2Nl9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKLXsKLQlza19jb21tb25fcmVsZWFzZShzayk7Ci19Ci0KLS8qCiAgKiAJVGhpcyBzaG91bGQgYmUgZWFzeSwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIHdlCiAgKiAJcmV0dXJuIGl0LCBvdGhlcndpc2Ugd2UgYmxvY2suCiAgKi8KIAotc3RhdGljIGludCB1ZHB2Nl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCAKK2ludCB1ZHB2Nl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAogCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKIAkJICBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewpAQCAtMTUzLDcgKzEyMiw3IEBACiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogICAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzaXplX3QgY29waWVkOwotICAJaW50IGVycjsKKwlpbnQgZXJyLCBjb3B5X29ubHksIGlzX3VkcGxpdGUgPSBJU19VRFBMSVRFKHNrKTsKIAogICAJaWYgKGFkZHJfbGVuKQogICAJCSphZGRyX2xlbj1zaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CkBAIC0xNzIsMTUgKzE0MSwyMSBAQAogICAJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKICAgCX0KIAotCWlmIChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKLQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksIG1zZy0+bXNnX2lvdiwKLQkJCQkJICAgICAgY29waWVkKTsKLQl9IGVsc2UgaWYgKG1zZy0+bXNnX2ZsYWdzJk1TR19UUlVOQykgewotCQlpZiAoX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwkvKgorCSAqIAlEZWNpZGUgd2hldGhlciB0byBjaGVja3N1bSBhbmQvb3IgY29weSBkYXRhLgorCSAqLworCWNvcHlfb25seSA9IChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpOworCisJaWYgKGlzX3VkcGxpdGUgIHx8ICAoIWNvcHlfb25seSAgJiYgIG1zZy0+bXNnX2ZsYWdzJk1TR19UUlVOQykpIHsKKwkJaWYgKF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQogCQkJZ290byBjc3VtX2NvcHlfZXJyOwotCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92LAotCQkJCQkgICAgICBjb3BpZWQpOwotCX0gZWxzZSB7CisJCWNvcHlfb25seSA9IDE7CisJfQorCisJaWYgKGNvcHlfb25seSkKKwkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCisJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29waWVkICAgICAgICk7CisJZWxzZSB7CiAJCWVyciA9IHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBtc2ctPm1zZ19pb3YpOwogCQlpZiAoZXJyID09IC1FSU5WQUwpCiAJCQlnb3RvIGNzdW1fY29weV9lcnI7CkBAIC0yMzEsMTQgKzIwNiwxNSBAQAogCXNrYl9raWxsX2RhdGFncmFtKHNrLCBza2IsIGZsYWdzKTsKIAogCWlmIChmbGFncyAmIE1TR19ET05UV0FJVCkgewotCQlVRFA2X0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfSU5FUlJPUlMpOworCQlVRFA2X0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfSU5FUlJPUlMsIGlzX3VkcGxpdGUpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJZ290byB0cnlfYWdhaW47CiB9CiAKLXN0YXRpYyB2b2lkIHVkcHY2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQordm9pZCBfX3VkcDZfbGliX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKwkJICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8sCisJCSAgICBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdICAgICAgICAgICAgICAgICAgICApCiB7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wOwogCXN0cnVjdCBpcHY2aGRyICpoZHIgPSAoc3RydWN0IGlwdjZoZHIqKXNrYi0+ZGF0YTsKQEAgLTI0OCw4ICsyMjQsOCBAQAogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyOwogCi0Jc2sgPSB1ZHBfdjZfbG9va3VwKGRhZGRyLCB1aC0+ZGVzdCwgc2FkZHIsIHVoLT5zb3VyY2UsIGluZXQ2X2lpZihza2IpKTsKLSAgIAorCXNrID0gX191ZHA2X2xpYl9sb29rdXAoZGFkZHIsIHVoLT5kZXN0LAorCQkJICAgICAgIHNhZGRyLCB1aC0+c291cmNlLCBpbmV0Nl9paWYoc2tiKSwgdWRwdGFibGUpOwogCWlmIChzayA9PSBOVUxMKQogCQlyZXR1cm47CiAKQEAgLTI3MCwzNiArMjQ2LDYwIEBACiAJc29ja19wdXQoc2spOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1ZHB2Nl9xdWV1ZV9yY3Zfc2tiKHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVkcHY2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwgaW50IHR5cGUsCisJCQkJIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbyAgICAgKQogeworCXJldHVybiBfX3VkcDZfbGliX2Vycihza2IsIG9wdCwgdHlwZSwgY29kZSwgb2Zmc2V0LCBpbmZvLCB1ZHBfaGFzaCk7Cit9CisKK2ludCB1ZHB2Nl9xdWV1ZV9yY3Zfc2tiKHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CiAJaW50IHJjOwogCi0JaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gLTE7CisJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IpKQorCQlnb3RvIGRyb3A7CisKKwkvKgorCSAqIFVEUC1MaXRlIHNwZWNpZmljIHRlc3RzLCBpZ25vcmVkIG9uIFVEUCBzb2NrZXRzIChzZWUgbmV0L2lwdjQvdWRwLmMpLgorCSAqLworCWlmICgodXAtPnBjZmxhZyAmIFVEUExJVEVfUkVDVl9DQykgICYmICBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KSB7CisKKwkJaWYgKHVwLT5wY3JsZW4gPT0gMCkgeyAgICAgICAgICAvKiBmdWxsIGNvdmVyYWdlIHdhcyBzZXQgICovCisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIlVEUExJVEU2OiBwYXJ0aWFsIGNvdmVyYWdlIgorCQkJCSIgJWQgd2hpbGUgZnVsbCBjb3ZlcmFnZSAlZCByZXF1ZXN0ZWRcbiIsCisJCQkJVURQX1NLQl9DQihza2IpLT5jc2Nvdiwgc2tiLT5sZW4pOworCQkJZ290byBkcm9wOworCQl9CisJCWlmIChVRFBfU0tCX0NCKHNrYiktPmNzY292ICA8ICB1cC0+cGNybGVuKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIlVEUExJVEU2OiBjb3ZlcmFnZSAlZCAiCisJCQkJCQkgICAgInRvbyBzbWFsbCwgbmVlZCBtaW4gJWRcbiIsCisJCQkJICAgICAgIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YsIHVwLT5wY3JsZW4pOworCQkJZ290byBkcm9wOworCQl9CiAJfQogCi0JaWYgKHNrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7Ci0JCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCWdvdG8gZHJvcDsKIAogCWlmICgocmMgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssc2tiKSkgPCAwKSB7CiAJCS8qIE5vdGUgdGhhdCBhbiBFTk9NRU0gZXJyb3IgaXMgY2hhcmdlZCB0d2ljZSAqLwogCQlpZiAocmMgPT0gLUVOT01FTSkKLQkJCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfUkNWQlVGRVJST1JTKTsKLQkJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKKwkJCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfUkNWQlVGRVJST1JTLCB1cC0+cGNmbGFnKTsKKwkJZ290byBkcm9wOwogCX0KLQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX0lOREFUQUdSQU1TKTsKKwlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX0lOREFUQUdSQU1TLCB1cC0+cGNmbGFnKTsKIAlyZXR1cm4gMDsKK2Ryb3A6CisJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgdXAtPnBjZmxhZyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgc3RydWN0IHNvY2sgKnVkcF92Nl9tY2FzdF9uZXh0KHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICAgICB1MTYgbG9jX3BvcnQsIHN0cnVjdCBpbjZfYWRkciAqbG9jX2FkZHIsCi0JCQkJICAgICAgdTE2IHJtdF9wb3J0LCBzdHJ1Y3QgaW42X2FkZHIgKnJtdF9hZGRyLAorCQkJCSAgICAgIF9fYmUxNiBsb2NfcG9ydCwgc3RydWN0IGluNl9hZGRyICpsb2NfYWRkciwKKwkJCQkgICAgICBfX2JlMTYgcm10X3BvcnQsIHN0cnVjdCBpbjZfYWRkciAqcm10X2FkZHIsCiAJCQkJICAgICAgaW50IGRpZikKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKQEAgLTMzOCwxNSArMzM4LDE1IEBACiAgKiBOb3RlOiBjYWxsZWQgb25seSBmcm9tIHRoZSBCSCBoYW5kbGVyIGNvbnRleHQsCiAgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvY2sgdGhlIGhhc2hlcy4KICAqLwotc3RhdGljIHZvaWQgdWRwdjZfbWNhc3RfZGVsaXZlcihzdHJ1Y3QgdWRwaGRyICp1aCwKLQkJCQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCXN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IF9fdWRwNl9saWJfbWNhc3RfZGVsaXZlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkgICAgICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCiB7CiAJc3RydWN0IHNvY2sgKnNrLCAqc2syOworCWNvbnN0IHN0cnVjdCB1ZHBoZHIgKnVoID0gc2tiLT5oLnVoOwogCWludCBkaWY7CiAKIAlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOwotCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbbnRvaHModWgtPmRlc3QpICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7CisJc2sgPSBza19oZWFkKCZ1ZHB0YWJsZVtudG9ocyh1aC0+ZGVzdCkgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKTsKIAlkaWYgPSBpbmV0Nl9paWYoc2tiKTsKIAlzayA9IHVkcF92Nl9tY2FzdF9uZXh0KHNrLCB1aC0+ZGVzdCwgZGFkZHIsIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOwogCWlmICghc2spIHsKQEAgLTM2NCw5ICszNjQsMzUgQEAKIAl1ZHB2Nl9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwogb3V0OgogCXJlYWRfdW5sb2NrKCZ1ZHBfaGFzaF9sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1ZHB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQorc3RhdGljIGlubGluZSBpbnQgdWRwNl9jc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgpCisKK3sKKwlpZiAodWgtPmNoZWNrID09IDApIHsKKwkJLyogUkZDIDI0NjAgc2VjdGlvbiA4LjEgc2F5cyB0aGF0IHdlIFNIT1VMRCBsb2cKKwkJICAgdGhpcyBlcnJvci4gV2VsbCwgaXQgaXMgcmVhc29uYWJsZS4KKwkJICovCisJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiSVB2NjogdWRwIGNoZWNrc3VtIGlzIDBcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmCisJICAgICFjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCSAgICAJICAgICBza2ItPmxlbiwgSVBQUk9UT19VRFAsIHNrYi0+Y3N1bSAgICAgICAgICAgICApKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkJCQkgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJCQkJCSBza2ItPmxlbiwgSVBQUk9UT19VRFAsCisJCQkJCQkJIDApKTsKKworCXJldHVybiAoVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdiA9IDApOworfQorCitpbnQgX191ZHA2X2xpYl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLAorCQkgICBpbnQgaXNfdWRwbGl0ZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CiAJc3RydWN0IHNvY2sgKnNrOwpAQCAtMzgzLDQ0ICs0MDksMzkgQEAKIAl1aCA9IHNrYi0+aC51aDsKIAogCXVsZW4gPSBudG9ocyh1aC0+bGVuKTsKLQotCS8qIENoZWNrIGZvciBqdW1ibyBwYXlsb2FkICovCi0JaWYgKHVsZW4gPT0gMCkKLQkJdWxlbiA9IHNrYi0+bGVuOwotCi0JaWYgKHVsZW4gPiBza2ItPmxlbiB8fCB1bGVuIDwgc2l6ZW9mKCp1aCkpCisJaWYgKHVsZW4gPiBza2ItPmxlbikKIAkJZ290byBzaG9ydF9wYWNrZXQ7CiAKLQlpZiAodWgtPmNoZWNrID09IDApIHsKLQkJLyogUkZDIDI0NjAgc2VjdGlvbiA4LjEgc2F5cyB0aGF0IHdlIFNIT1VMRCBsb2cKLQkJICAgdGhpcyBlcnJvci4gV2VsbCwgaXQgaXMgcmVhc29uYWJsZS4KLQkJICovCi0JCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiSVB2NjogdWRwIGNoZWNrc3VtIGlzIDBcbiIpOwotCQlnb3RvIGRpc2NhcmQ7Ci0JfQorCWlmKCEgaXNfdWRwbGl0ZSApIHsJCS8qIFVEUCB2YWxpZGF0ZXMgdWxlbi4gKi8KIAotCWlmICh1bGVuIDwgc2tiLT5sZW4pIHsKLQkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQorCQkvKiBDaGVjayBmb3IganVtYm8gcGF5bG9hZCAqLworCQlpZiAodWxlbiA9PSAwKQorCQkJdWxlbiA9IHNrYi0+bGVuOworCisJCWlmICh1bGVuIDwgc2l6ZW9mKCp1aCkpCisJCQlnb3RvIHNob3J0X3BhY2tldDsKKworCQlpZiAodWxlbiA8IHNrYi0+bGVuKSB7CisJCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgdWxlbikpCisJCQkJZ290byBzaG9ydF9wYWNrZXQ7CisJCQlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKKwkJCWRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCQkJdWggPSBza2ItPmgudWg7CisJCX0KKworCQlpZiAodWRwNl9jc3VtX2luaXQoc2tiLCB1aCkpCiAJCQlnb3RvIGRpc2NhcmQ7Ci0JCXNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOwotCQlkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKLQkJdWggPSBza2ItPmgudWg7CisKKwl9IGVsc2UgCXsJCQkvKiBVRFAtTGl0ZSB2YWxpZGF0ZXMgY3Njb3YuICovCisJCWlmICh1ZHBsaXRlNl9jc3VtX2luaXQoc2tiLCB1aCkpCisJCQlnb3RvIGRpc2NhcmQ7CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmCi0JICAgICFjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCB1bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtKSkKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKLQkJc2tiLT5jc3VtID0gfmNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHVsZW4sIElQUFJPVE9fVURQLCAwKTsKLQogCS8qIAogCSAqCU11bHRpY2FzdCByZWNlaXZlIGNvZGUgCiAJICovCi0JaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZGFkZHIpKSB7Ci0JCXVkcHY2X21jYXN0X2RlbGl2ZXIodWgsIHNhZGRyLCBkYWRkciwgc2tiKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGRhZGRyKSkKKwkJcmV0dXJuIF9fdWRwNl9saWJfbWNhc3RfZGVsaXZlcihza2IsIHNhZGRyLCBkYWRkciwgdWRwdGFibGUpOwogCiAJLyogVW5pY2FzdCAqLwogCkBAIC00MjgsMTUgKzQ0OSwxNiBAQAogCSAqIGNoZWNrIHNvY2tldCBjYWNoZSAuLi4gbXVzdCB0YWxrIHRvIEFsYW4gYWJvdXQgaGlzIHBsYW5zCiAJICogZm9yIHNvY2sgY2FjaGVzLi4uIGknbGwgc2tpcCB0aGlzIGZvciBub3cuCiAJICovCi0Jc2sgPSB1ZHBfdjZfbG9va3VwKHNhZGRyLCB1aC0+c291cmNlLCBkYWRkciwgdWgtPmRlc3QsIGluZXQ2X2lpZihza2IpKTsKKwlzayA9IF9fdWRwNl9saWJfbG9va3VwKHNhZGRyLCB1aC0+c291cmNlLAorCQkJICAgICAgIGRhZGRyLCB1aC0+ZGVzdCwgaW5ldDZfaWlmKHNrYiksIHVkcHRhYmxlKTsKIAogCWlmIChzayA9PSBOVUxMKSB7CiAJCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQkJZ290byBkaXNjYXJkOwogCi0JCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gZGlzY2FyZDsKLQkJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTKTsKKwkJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTLCBpc191ZHBsaXRlKTsKIAogCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIElDTVBWNl9QT1JUX1VOUkVBQ0gsIDAsIGRldik7CiAKQEAgLTQ1MSwxNCArNDczLDIwIEBACiAJcmV0dXJuKDApOwogCiBzaG9ydF9wYWNrZXQ6CQotCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0RFQlVHICJVRFA6IHNob3J0IHBhY2tldDogJWQvJXVcbiIsIHVsZW4sIHNrYi0+bGVuKTsKKwlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFAlc3Y2OiBzaG9ydCBwYWNrZXQ6ICVkLyV1XG4iLAorCQkgICAgICAgaXNfdWRwbGl0ZT8gIi1MaXRlIiA6ICIiLCAgdWxlbiwgc2tiLT5sZW4pOwogCiBkaXNjYXJkOgotCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOworCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIGlzX3VkcGxpdGUpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybigwKTsJCiB9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB1ZHB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCXJldHVybiBfX3VkcDZfbGliX3Jjdihwc2tiLCB1ZHBfaGFzaCwgMCk7Cit9CisKIC8qCiAgKiBUaHJvdyBhd2F5IGFsbCBwZW5kaW5nIGRhdGEgYW5kIGNhbmNlbCB0aGUgY29ya2luZy4gU29ja2V0IGlzIGxvY2tlZC4KICAqLwpAQCAtNDc3LDEzICs1MDUsMTUgQEAKICAqCVNlbmRpbmcKICAqLwogCi1zdGF0aWMgaW50IHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVkcF9zb2NrICp1cCkKK3N0YXRpYyBpbnQgdWRwX3Y2X3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHVkcGhkciAqdWg7CisJc3RydWN0IHVkcF9zb2NrICAqdXAgPSB1ZHBfc2soc2spOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgZmxvd2kgKmZsID0gJmluZXQtPmNvcmsuZmw7CiAJaW50IGVyciA9IDA7CisJX193c3VtIGNzdW0gPSAwOwogCiAJLyogR3JhYiB0aGUgc2tidWZmIHdoZXJlIFVEUCBoZWFkZXIgc3BhY2UgZXhpc3RzLiAqLwogCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpID09IE5VTEwpCkBAIC00OTgsMzUgKzUyOCwxNyBAQAogCXVoLT5sZW4gPSBodG9ucyh1cC0+bGVuKTsKIAl1aC0+Y2hlY2sgPSAwOwogCi0JaWYgKHNrLT5za19ub19jaGVjayA9PSBVRFBfQ1NVTV9OT1hNSVQpIHsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCQlnb3RvIHNlbmQ7Ci0JfQorCWlmICh1cC0+cGNmbGFnKQorCQljc3VtID0gdWRwbGl0ZV9jc3VtX291dGdvaW5nKHNrLCBza2IpOworCSBlbHNlCisJCWNzdW0gPSB1ZHBfY3N1bV9vdXRnb2luZyhzaywgc2tiKTsKIAotCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfd3JpdGVfcXVldWUpID09IDEpIHsKLQkJc2tiLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdWgsCi0JCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBza2ItPmNzdW0pOwotCQl1aC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAotCQkJCQkgICAgJmZsLT5mbDZfZHN0LAotCQkJCQkgICAgdXAtPmxlbiwgZmwtPnByb3RvLCBza2ItPmNzdW0pOwotCX0gZWxzZSB7Ci0JCXUzMiB0bXBfY3N1bSA9IDA7Ci0KLQkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7Ci0JCQl0bXBfY3N1bSA9IGNzdW1fYWRkKHRtcF9jc3VtLCBza2ItPmNzdW0pOwotCQl9Ci0JCXRtcF9jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdWgsCi0JCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCB0bXBfY3N1bSk7Ci0gICAgICAgICAgICAgICAgdG1wX2NzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAotCQkJCQkgICAmZmwtPmZsNl9kc3QsCi0JCQkJCSAgIHVwLT5sZW4sIGZsLT5wcm90bywgdG1wX2NzdW0pOwotICAgICAgICAgICAgICAgIHVoLT5jaGVjayA9IHRtcF9jc3VtOwotCi0JfQorCS8qIGFkZCBwcm90b2NvbC1kZXBlbmRlbnQgcHNldWRvLWhlYWRlciAqLworCXVoLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmZmwtPmZsNl9zcmMsICZmbC0+Zmw2X2RzdCwKKwkJCQkgICAgdXAtPmxlbiwgZmwtPnByb3RvLCBjc3VtICAgKTsKIAlpZiAodWgtPmNoZWNrID09IDApCi0JCXVoLT5jaGVjayA9IC0xOworCQl1aC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAotc2VuZDoKIAllcnIgPSBpcDZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiBvdXQ6CiAJdXAtPmxlbiA9IDA7CkBAIC01MzQsNyArNTQ2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIAoraW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCiAJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyBvcHRfc3BhY2U7CkBAIC01NTQsNiArNTY2LDggQEAKIAlpbnQgY29ya3JlcSA9IHVwLT5jb3JrZmxhZyB8fCBtc2ctPm1zZ19mbGFncyZNU0dfTU9SRTsKIAlpbnQgZXJyOwogCWludCBjb25uZWN0ZWQgPSAwOworCWludCBpc191ZHBsaXRlID0gdXAtPnBjZmxhZzsKKwlpbnQgKCpnZXRmcmFnKSh2b2lkICosIGNoYXIgKiwgaW50LCBpbnQsIGludCwgc3RydWN0IHNrX2J1ZmYgKik7CiAKIAkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzIGNoZWNrICovCiAJaWYgKHNpbjYpIHsKQEAgLTY5NCw3ICs3MDgsNyBAQAogCQlvcHQgPSBmbDZfbWVyZ2Vfb3B0aW9ucygmb3B0X3NwYWNlLCBmbG93bGFiZWwsIG9wdCk7CiAJb3B0ID0gaXB2Nl9maXh1cF9vcHRpb25zKCZvcHRfc3BhY2UsIG9wdCk7CiAKLQlmbC5wcm90byA9IElQUFJPVE9fVURQOworCWZsLnByb3RvID0gc2stPnNrX3Byb3RvY29sOwogCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBkYWRkcik7CiAJaWYgKGlwdjZfYWRkcl9hbnkoJmZsLmZsNl9zcmMpICYmICFpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJm5wLT5zYWRkcik7CkBAIC03NjEsMTQgKzc3NSwxNSBAQAogCiBkb19hcHBlbmRfZGF0YToKIAl1cC0+bGVuICs9IHVsZW47Ci0JZXJyID0gaXA2X2FwcGVuZF9kYXRhKHNrLCBpcF9nZW5lcmljX2dldGZyYWcsIG1zZy0+bXNnX2lvdiwgdWxlbiwKKwlnZXRmcmFnICA9ICBpc191ZHBsaXRlID8gIHVkcGxpdGVfZ2V0ZnJhZyA6IGlwX2dlbmVyaWNfZ2V0ZnJhZzsKKwllcnIgPSBpcDZfYXBwZW5kX2RhdGEoc2ssIGdldGZyYWcsIG1zZy0+bXNnX2lvdiwgdWxlbiwKIAkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBobGltaXQsIHRjbGFzcywgb3B0LCAmZmwsCiAJCShzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKIAkJY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOwogCWlmIChlcnIpCiAJCXVkcF92Nl9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJZWxzZSBpZiAoIWNvcmtyZXEpCi0JCWVyciA9IHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB1cCk7CisJCWVyciA9IHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIAllbHNlIGlmICh1bmxpa2VseShza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSkpKQogCQl1cC0+cGVuZGluZyA9IDA7CiAKQEAgLTc5Myw3ICs4MDgsNyBAQAogb3V0OgogCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKIAlpZiAoIWVycikgewotCQlVRFA2X0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfT1VUREFUQUdSQU1TKTsKKwkJVURQNl9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX09VVERBVEFHUkFNUywgaXNfdWRwbGl0ZSk7CiAJCXJldHVybiBsZW47CiAJfQogCS8qCkBAIC04MDQsNyArODE5LDcgQEAKIAkgKiBzZWVtcyBsaWtlIG92ZXJraWxsLgogCSAqLwogCWlmIChlcnIgPT0gLUVOT0JVRlMgfHwgdGVzdF9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpKSB7Ci0JCVVEUDZfSU5DX1NUQVRTX1VTRVIoVURQX01JQl9TTkRCVUZFUlJPUlMpOworCQlVRFA2X0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfU05EQlVGRVJST1JTLCBpc191ZHBsaXRlKTsKIAl9CiAJcmV0dXJuIGVycjsKIApAQCAtODE2LDcgKzgzMSw3IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBpbnQgdWRwdjZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK2ludCB1ZHB2Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQogewogCWxvY2tfc29jayhzayk7CiAJdWRwX3Y2X2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKQEAgLTgzMCwxMTkgKzg0NSw0MSBAQAogLyoKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVURQCiAgKi8KLXN0YXRpYyBpbnQgZG9fdWRwdjZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitpbnQgdWRwdjZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKLQlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKLQlpbnQgdmFsOwotCWludCBlcnIgPSAwOwotCi0JaWYob3B0bGVuPHNpemVvZihpbnQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzd2l0Y2gob3B0bmFtZSkgewotCWNhc2UgVURQX0NPUks6Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJdXAtPmNvcmtmbGFnID0gMTsKLQkJfSBlbHNlIHsKLQkJCXVwLT5jb3JrZmxhZyA9IDA7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJdWRwX3Y2X3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHVwKTsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCX0KLQkJYnJlYWs7Ci0JCQotCWNhc2UgVURQX0VOQ0FQOgotCQlzd2l0Y2ggKHZhbCkgewotCQljYXNlIDA6Ci0JCQl1cC0+ZW5jYXBfdHlwZSA9IHZhbDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyID0gLUVOT1BST1RPT1BUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQllcnIgPSAtRU5PUFJPVE9PUFQ7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHVkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQotewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKKwkJCQkJICB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CisJcmV0dXJuIGlwdjZfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitpbnQgY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCiB7Ci0JaWYgKGxldmVsICE9IFNPTF9VRFApCi0JCXJldHVybiBjb21wYXRfaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwKLQkJCQkJICAgICAgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKKwkJCQkJICB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CisJcmV0dXJuIGNvbXBhdF9pcHY2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBkb191ZHB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoraW50IHVkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKLQlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKLQlpbnQgdmFsLCBsZW47Ci0KLQlpZihnZXRfdXNlcihsZW4sb3B0bGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGludCkpOwotCQotCWlmKGxlbiA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoKG9wdG5hbWUpIHsKLQljYXNlIFVEUF9DT1JLOgotCQl2YWwgPSB1cC0+Y29ya2ZsYWc7Ci0JCWJyZWFrOwotCi0JY2FzZSBVRFBfRU5DQVA6Ci0JCXZhbCA9IHVwLT5lbmNhcF90eXBlOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0JfTsKLQotICAJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQotICAJCXJldHVybiAtRUZBVUxUOwotCWlmKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0gIAlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1ZHB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQotewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gaXB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJcmV0dXJuIGlwdjZfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgY29tcGF0X3VkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK2ludCBjb21wYXRfdWRwdjZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gY29tcGF0X2lwdjZfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCi0JCQkJCSAgICAgIG9wdHZhbCwgb3B0bGVuKTsKLQlyZXR1cm4gZG9fdWRwdjZfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1VEUCAgfHwgIGxldmVsID09IFNPTF9VRFBMSVRFKQorCQlyZXR1cm4gdWRwX2xpYl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCXJldHVybiBjb21wYXRfaXB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogI2VuZGlmCiAKQEAgLTk4Myw3ICs5MjAsNyBAQAogCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwKTsKIH0KIAotc3RhdGljIGludCB1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoraW50IHVkcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQogCQlzZXFfcHJpbnRmKHNlcSwKQEAgLTEwMDIsNiArOTM5LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInVkcDYiLAogCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmhhc2h0YWJsZQk9IHVkcF9oYXNoLAogCS5zZXFfc2hvdwk9IHVkcDZfc2VxX3Nob3csCiAJLnNlcV9mb3BzCT0gJnVkcDZfc2VxX2ZvcHMsCiB9OwpAQCAtMTAyMSw3ICs5NTksNyBAQAogc3RydWN0IHByb3RvIHVkcHY2X3Byb3QgPSB7CiAJLm5hbWUJCSAgID0gIlVEUHY2IiwKIAkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCi0JLmNsb3NlCQkgICA9IHVkcHY2X2Nsb3NlLAorCS5jbG9zZQkJICAgPSB1ZHBfbGliX2Nsb3NlLAogCS5jb25uZWN0CSAgID0gaXA2X2RhdGFncmFtX2Nvbm5lY3QsCiAJLmRpc2Nvbm5lY3QJICAgPSB1ZHBfZGlzY29ubmVjdCwKIAkuaW9jdGwJCSAgID0gdWRwX2lvY3RsLApAQCAtMTAzMSw4ICs5NjksOCBAQAogCS5zZW5kbXNnCSAgID0gdWRwdjZfc2VuZG1zZywKIAkucmVjdm1zZwkgICA9IHVkcHY2X3JlY3Ztc2csCiAJLmJhY2tsb2dfcmN2CSAgID0gdWRwdjZfcXVldWVfcmN2X3NrYiwKLQkuaGFzaAkJICAgPSB1ZHBfdjZfaGFzaCwKLQkudW5oYXNoCQkgICA9IHVkcF92Nl91bmhhc2gsCisJLmhhc2gJCSAgID0gdWRwX2xpYl9oYXNoLAorCS51bmhhc2gJCSAgID0gdWRwX2xpYl91bmhhc2gsCiAJLmdldF9wb3J0CSAgID0gdWRwX3Y2X2dldF9wb3J0LAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHBfaW1wbC5oIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk4Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9VRFA2X0lNUExfSAorI2RlZmluZSBfVURQNl9JTVBMX0gKKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3VkcGxpdGUuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKworZXh0ZXJuIGludCAgCV9fdWRwNl9saWJfcmN2KHN0cnVjdCBza19idWZmICoqLCBzdHJ1Y3QgaGxpc3RfaGVhZCBbXSwgaW50ICk7CitleHRlcm4gdm9pZCAJX191ZHA2X2xpYl9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICosCisJCQkgICAgICAgaW50ICwgaW50ICwgaW50ICwgX19iZTMyICwgc3RydWN0IGhsaXN0X2hlYWQgW10pOworCitleHRlcm4gaW50CXVkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgIAkJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CitleHRlcm4gaW50CXVkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworI2lmZGVmIENPTkZJR19DT01QQVQKK2V4dGVybiBpbnQJY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKK2V4dGVybiBpbnQJY29tcGF0X3VkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOworI2VuZGlmCitleHRlcm4gaW50CXVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOworZXh0ZXJuIGludAl1ZHB2Nl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkgIAkgICAgICBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKTsKK2V4dGVybiBpbnQJdWRwdjZfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQJdWRwdjZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzayk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIGludAl1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsKKyNlbmRpZgorI2VuZGlmCS8qIF9VRFA2X0lNUExfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOWY5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAgVURQTElURXY2ICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFVEUC1MaXRlIHByb3RvY29sIG92ZXIgSVB2Ni4KKyAqICAgICAgICAgICAgICBTZWUgYWxzbyBuZXQvaXB2NC91ZHBsaXRlLmMKKyAqCisgKiAgVmVyc2lvbjogICAgJElkOiB1ZHBsaXRlLmMsdiAxLjkgMjAwNi8xMC8xOSAwODoyODoxMCBnZXJyaXQgRXhwICQKKyAqCisgKiAgQXV0aG9yczogICAgR2Vycml0IFJlbmtlciAgICAgICA8Z2Vycml0QGVyZy5hYmRuLmFjLnVrPgorICoKKyAqICBDaGFuZ2VzOgorICogIEZpeGVzOgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlICJ1ZHBfaW1wbC5oIgorCitERUZJTkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBsaXRlX3N0YXRzX2luNikgX19yZWFkX21vc3RseTsKKworc3RhdGljIGludCB1ZHBsaXRldjZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYikKK3sKKwlyZXR1cm4gX191ZHA2X2xpYl9yY3YocHNrYiwgdWRwbGl0ZV9oYXNoLCAxKTsKK30KKworc3RhdGljIHZvaWQgdWRwbGl0ZXY2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKwkJCSAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKK3sKKwlyZXR1cm4gX191ZHA2X2xpYl9lcnIoc2tiLCBvcHQsIHR5cGUsIGNvZGUsIG9mZnNldCwgaW5mbywgdWRwbGl0ZV9oYXNoKTsKK30KKworc3RhdGljIHN0cnVjdCBpbmV0Nl9wcm90b2NvbCB1ZHBsaXRldjZfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQl1ZHBsaXRldjZfcmN2LAorCS5lcnJfaGFuZGxlcgk9CXVkcGxpdGV2Nl9lcnIsCisJLmZsYWdzCQk9CUlORVQ2X1BST1RPX05PUE9MSUNZfElORVQ2X1BST1RPX0ZJTkFMLAorfTsKKworc3RhdGljIGludCB1ZHBsaXRlX3Y2X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKK3sKKwlyZXR1cm4gdWRwbGl0ZV9nZXRfcG9ydChzaywgc251bSwgaXB2Nl9yY3Zfc2FkZHJfZXF1YWwpOworfQorCitzdHJ1Y3QgcHJvdG8gdWRwbGl0ZXY2X3Byb3QgPSB7CisJLm5hbWUJCSAgID0gIlVEUExJVEV2NiIsCisJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLAorCS5jbG9zZQkJICAgPSB1ZHBfbGliX2Nsb3NlLAorCS5jb25uZWN0CSAgID0gaXA2X2RhdGFncmFtX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QJICAgPSB1ZHBfZGlzY29ubmVjdCwKKwkuaW9jdGwJCSAgID0gdWRwX2lvY3RsLAorCS5pbml0CQkgICA9IHVkcGxpdGVfc2tfaW5pdCwKKwkuZGVzdHJveQkgICA9IHVkcHY2X2Rlc3Ryb3lfc29jaywKKwkuc2V0c29ja29wdAkgICA9IHVkcHY2X3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJICAgPSB1ZHB2Nl9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnCSAgID0gdWRwdjZfc2VuZG1zZywKKwkucmVjdm1zZwkgICA9IHVkcHY2X3JlY3Ztc2csCisJLmJhY2tsb2dfcmN2CSAgID0gdWRwdjZfcXVldWVfcmN2X3NrYiwKKwkuaGFzaAkJICAgPSB1ZHBfbGliX2hhc2gsCisJLnVuaGFzaAkJICAgPSB1ZHBfbGliX3VuaGFzaCwKKwkuZ2V0X3BvcnQJICAgPSB1ZHBsaXRlX3Y2X2dldF9wb3J0LAorCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X3NldHNvY2tvcHQsCisJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X2dldHNvY2tvcHQsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldF9wcm90b3N3IHVkcGxpdGU2X3Byb3Rvc3cgPSB7CisJLnR5cGUJCT0gU09DS19ER1JBTSwKKwkucHJvdG9jb2wJPSBJUFBST1RPX1VEUExJVEUsCisJLnByb3QJCT0gJnVkcGxpdGV2Nl9wcm90LAorCS5vcHMJCT0gJmluZXQ2X2RncmFtX29wcywKKwkuY2FwYWJpbGl0eQk9IC0xLAorCS5ub19jaGVjawk9IDAsCisJLmZsYWdzCQk9IElORVRfUFJPVE9TV19QRVJNQU5FTlQsCit9OworCit2b2lkIF9faW5pdCB1ZHBsaXRldjZfaW5pdCh2b2lkKQoreworCWlmIChpbmV0Nl9hZGRfcHJvdG9jb2woJnVkcGxpdGV2Nl9wcm90b2NvbCwgSVBQUk9UT19VRFBMSVRFKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWdpc3Rlci5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KCZ1ZHBsaXRlNl9wcm90b3N3KTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZHBsaXRlNl9zZXFfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gdWRwbGl0ZTZfc2VxX2FmaW5mbyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInVkcGxpdGU2IiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCS5oYXNodGFibGUJPSB1ZHBsaXRlX2hhc2gsCisJLnNlcV9zaG93CT0gdWRwNl9zZXFfc2hvdywKKwkuc2VxX2ZvcHMJPSAmdWRwbGl0ZTZfc2VxX2ZvcHMsCit9OworCitpbnQgX19pbml0IHVkcGxpdGU2X3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiB1ZHBfcHJvY19yZWdpc3RlcigmdWRwbGl0ZTZfc2VxX2FmaW5mbyk7Cit9CisKK3ZvaWQgdWRwbGl0ZTZfcHJvY19leGl0KHZvaWQpCit7CisJdWRwX3Byb2NfdW5yZWdpc3RlcigmdWRwbGl0ZTZfc2VxX2FmaW5mbyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKaW5kZXggZDQwMGY4Zi4uOGRmZmQ0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKKysrIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKQEAgLTI3NCwxMSArMjc0LDEyIEBACiAJCQlicmVhazsKIAogCQljYXNlIElQUFJPVE9fVURQOgorCQljYXNlIElQUFJPVE9fVURQTElURToKIAkJY2FzZSBJUFBST1RPX1RDUDoKIAkJY2FzZSBJUFBST1RPX1NDVFA6CiAJCWNhc2UgSVBQUk9UT19EQ0NQOgogCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBza2ItPm5oLnJhdyArIG9mZnNldCArIDQgLSBza2ItPmRhdGEpKSB7Ci0JCQkJdTE2ICpwb3J0cyA9ICh1MTYgKilleHRoZHI7CisJCQkJX19iZTE2ICpwb3J0cyA9IChfX2JlMTYgKilleHRoZHI7CiAKIAkJCQlmbC0+ZmxfaXBfc3BvcnQgPSBwb3J0c1swXTsKIAkJCQlmbC0+ZmxfaXBfZHBvcnQgPSBwb3J0c1sxXTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKaW5kZXggNzkzMWU0Zi4uMDFhNWM1MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKQEAgLTYyLDcgKzYyLDcgQEAKIHsKIAl1bnNpZ25lZCBoOwogCi0JaCA9IGFkZHItPmE2WzBdIF4gYWRkci0+YTZbMV0gXiBhZGRyLT5hNlsyXSBeIGFkZHItPmE2WzNdOworCWggPSAoX19mb3JjZSB1MzIpKGFkZHItPmE2WzBdIF4gYWRkci0+YTZbMV0gXiBhZGRyLT5hNlsyXSBeIGFkZHItPmE2WzNdKTsKIAloIF49IGggPj4gMTY7CiAJaCBePSBoID4+IDg7CiAJaCAmPSBYRlJNNl9UVU5ORUxfU1BJX0JZQUREUl9IU0laRSAtIDE7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdTMyIHhmcm02X3R1bm5lbF9zcGlfbG9va3VwKHhmcm1fYWRkcmVzc190ICpzYWRkcikKK19fYmUzMiB4ZnJtNl90dW5uZWxfc3BpX2xvb2t1cCh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpCiB7CiAJc3RydWN0IHhmcm02X3R1bm5lbF9zcGkgKng2c3BpOwogCXUzMiBzcGk7CkBAIC0xOTYsNyArMTk2LDcgQEAKIAlyZXR1cm4gc3BpOwogfQogCi11MzIgeGZybTZfdHVubmVsX2FsbG9jX3NwaSh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpCitfX2JlMzIgeGZybTZfdHVubmVsX2FsbG9jX3NwaSh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpCiB7CiAJc3RydWN0IHhmcm02X3R1bm5lbF9zcGkgKng2c3BpOwogCXUzMiBzcGk7CkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCQkJICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkJCSAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKQogewogCS8qIHhmcm02X3R1bm5lbCBuYXRpdmUgZXJyIGhhbmRsaW5nICovCiAJc3dpdGNoICh0eXBlKSB7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9kaXNjb3ZlcnkuYyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCmluZGV4IDNmZWZjODIuLjg5ZmQyYTIgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2Rpc2NvdmVyeS5jCisrKyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCkBAIC0zMiw2ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhcC5jIGIvbmV0L2lyZGEvaXJpYXAuYwppbmRleCA0MTVjZjRlLi44ZjFjNmQ2IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmlhcC5jCisrKyBiL25ldC9pcmRhL2lyaWFwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0xNzIsNyArMTczLDcgQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlzZWxmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyaWFwX2NiKSwgR0ZQX0FUT01JQyk7CisJc2VsZiA9IGt6YWxsb2Moc2l6ZW9mKCpzZWxmKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzZWxmKSB7CiAJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xODEsNyArMTgyLDYgQEAKIAkvKgogCSAqICBJbml0aWFsaXplIGluc3RhbmNlCiAJICovCi0JbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpKTsKIAogCXNlbGYtPm1hZ2ljID0gSUFTX01BR0lDOwogCXNlbGYtPm1vZGUgPSBtb2RlOwpAQCAtNDUxLDEyICs0NTEsMTIgQEAKIAluID0gMjsKIAogCS8qIEdldCBsZW5ndGgsIE1TQiBmaXJzdCAqLwotCWxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKKwlsZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikoZnArbikpKTsgbiArPSAyOwogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CiAKIAkvKiBHZXQgb2JqZWN0IElELCBNU0IgZmlyc3QgKi8KLQlvYmpfaWQgPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CisJb2JqX2lkID0gYmUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopKGZwK24pKSk7IG4gKz0gMjsKIAogCXR5cGUgPSBmcFtuKytdOwogCUlSREFfREVCVUcoNCwgIiVzKCksIFZhbHVlIHR5cGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKQEAgLTUwNiw3ICs1MDYsNyBAQAogCQl2YWx1ZSA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUoZnArbik7CiAJCWJyZWFrOwogCWNhc2UgSUFTX09DVF9TRVE6Ci0JCXZhbHVlX2xlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7CisJCXZhbHVlX2xlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiAqKShmcCtuKSkpOwogCQluICs9IDI7CiAKIAkJLyogV2lsbCB0cnVuY2F0ZSB0byBJQVNfTUFYX09DVEVUX1NUUklORyBieXRlcyAqLwpAQCAtNTQ0LDcgKzU0NCw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKIAlpbnQgbjsKLQlfX3UzMiB0bXBfYmUzMjsKKwlfX2JlMzIgdG1wX2JlMzI7CiAJX19iZTE2IHRtcF9iZTE2OwogCV9fdTggKmZwOwogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhc19vYmplY3QuYyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCmluZGV4IDU2MjkyYWIuLmIxZWU5OWEgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCisrKyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCkBAIC01MDEsMTMgKzUwMSwxMiBAQAogCQlsZW4gPSBJQVNfTUFYX09DVEVUX1NUUklORzsKIAl2YWx1ZS0+bGVuID0gbGVuOwogCi0JdmFsdWUtPnQub2N0X3NlcSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwl2YWx1ZS0+dC5vY3Rfc2VxID0ga21lbWR1cChvY3RzZXEsIGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHZhbHVlLT50Lm9jdF9zZXEgPT0gTlVMTCl7CiAJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJa2ZyZWUodmFsdWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtY3B5KHZhbHVlLT50Lm9jdF9zZXEsIG9jdHNlcSAsIGxlbik7CiAJcmV0dXJuIHZhbHVlOwogfQogCkBAIC01MjIsNyArNTIxLDYgQEAKIAl9CiAKIAl2YWx1ZS0+dHlwZSA9IElBU19NSVNTSU5HOwotCXZhbHVlLT5sZW4gPSAwOwogCiAJcmV0dXJuIHZhbHVlOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwppbmRleCA5Yjk2MmYyLi4yYmIwNGFjIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYworKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpAQCAtOTk1LDcgKzk5NSw3IEBACiB7CiAJX191OCAqZnJhbWU7CiAJX191OCBwYXJhbV9sZW47Ci0JX191MTYgdG1wX2xlOyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKwlfX2xlMTYgdG1wX2xlOyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KIAlpbnQgbj0wOwogCQogCWlmIChza2IgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsbXAuYyBiL25ldC9pcmRhL2lybG1wLmMKaW5kZXggZmVkZTgzNy4uN2U1ZDEyYSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsbXAuYworKysgYi9uZXQvaXJkYS9pcmxtcC5jCkBAIC02NDEsMTUgKzY0MSwxMyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIGEgbmV3IGluc3RhbmNlICovCi0JbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxzYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwluZXcgPSBrbWVtZHVwKG9yaWcsIHNpemVvZigqbmV3KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFuZXcpICB7CiAJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBrbWFsbG9jXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLAogCQkJCSAgICAgICBmbGFncyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQkvKiBEdXAgKi8KLQltZW1jcHkobmV3LCBvcmlnLCBzaXplb2Yoc3RydWN0IGxzYXBfY2IpKTsKIAkvKiBuZXctPmxhcCA9IG9yaWctPmxhcDsgPT4gZG9uZSBpbiB0aGUgbWVtY3B5KCkgKi8KIAkvKiBuZXctPnNsc2FwX3NlbCA9IG9yaWctPnNsc2FwX3NlbDsgPT4gZG9uZSBpbiB0aGUgbWVtY3B5KCkgKi8KIAluZXctPmNvbm5fc2tiID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lycXVldWUuYyBiL25ldC9pcmRhL2lycXVldWUuYwppbmRleCAxYmE4YzcxLi4xZDI2Y2QzIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnF1ZXVlLmMKKysrIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCkBAIC0zNTYsMTQgKzM1NiwxMyBAQAogCS8qCiAJICogQWxsb2NhdGUgbmV3IGhhc2hiaW4KIAkgKi8KLQloYXNoYmluID0ga21hbGxvYyggc2l6ZW9mKGhhc2hiaW5fdCksIEdGUF9BVE9NSUMpOworCWhhc2hiaW4gPSBremFsbG9jKHNpemVvZigqaGFzaGJpbiksIEdGUF9BVE9NSUMpOwogCWlmICghaGFzaGJpbikKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgc3RydWN0dXJlCiAJICovCi0JbWVtc2V0KGhhc2hiaW4sIDAsIHNpemVvZihoYXNoYmluX3QpKTsKIAloYXNoYmluLT5oYl90eXBlID0gdHlwZTsKIAloYXNoYmluLT5tYWdpYyA9IEhCX01BR0lDOwogCS8vaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnR0cC5jIGIvbmV0L2lyZGEvaXJ0dHAuYwppbmRleCAzYzJlNzBiLi4yNTJmMTEwIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnR0cC5jCisrKyBiL25ldC9pcmRhL2lydHRwLmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC0xMTQ3LDcgKzExNDgsNyBAQAogCQlmcmFtZVszXSA9IDB4MDI7IC8qIFZhbHVlIGxlbmd0aCAqLwogCiAJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMTYoKF9fdTE2KSBtYXhfc2R1X3NpemUpLAotCQkJICAgICAgKF9fdTE2ICopKGZyYW1lKzQpKTsKKwkJCSAgICAgIChfX2JlMTYgKikoZnJhbWUrNCkpOwogCX0gZWxzZSB7CiAJCS8qIEluc2VydCBwbGFpbiBUVFAgaGVhZGVyICovCiAJCWZyYW1lID0gc2tiX3B1c2godHhfc2tiLCBUVFBfSEVBREVSKTsKQEAgLTEzOTQsNyArMTM5NSw3IEBACiAJCWZyYW1lWzNdID0gMHgwMjsgLyogVmFsdWUgbGVuZ3RoICovCiAKIAkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNigoX191MTYpIG1heF9zZHVfc2l6ZSksCi0JCQkgICAgICAoX191MTYgKikoZnJhbWUrNCkpOworCQkJICAgICAgKF9fYmUxNiAqKShmcmFtZSs0KSk7CiAJfSBlbHNlIHsKIAkJLyogSW5zZXJ0IFRUUCBoZWFkZXIgKi8KIAkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIpOwpkaWZmIC0tZ2l0IGEvbmV0L2tleS9hZl9rZXkuYyBiL25ldC9rZXkvYWZfa2V5LmMKaW5kZXggMjBmZjdjYy4uMGUxZGJmYiAxMDA2NDQKLS0tIGEvbmV0L2tleS9hZl9rZXkuYworKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC0xNzY3LDExICsxNzY3LDExIEBACiAKIAkvKiBhZGRyZXNzZXMgcHJlc2VudCBvbmx5IGluIHR1bm5lbCBtb2RlICovCiAJaWYgKHQtPm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgewotCQlzd2l0Y2ggKHhwLT5mYW1pbHkpIHsKKwkJc3RydWN0IHNvY2thZGRyICpzYTsKKwkJc2EgPSAoc3RydWN0IHNvY2thZGRyICopKHJxKzEpOworCQlzd2l0Y2goc2EtPnNhX2ZhbWlseSkgewogCQljYXNlIEFGX0lORVQ6Ci0JCQlzaW4gPSAodm9pZCopKHJxKzEpOwotCQkJaWYgKHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiopc2E7CiAJCQl0LT5zYWRkci5hNCA9IHNpbi0+c2luX2FkZHIuc19hZGRyOwogCQkJc2luKys7CiAJCQlpZiAoc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCkBAIC0xNzgwLDkgKzE3ODAsNyBAQAogCQkJYnJlYWs7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiAJCWNhc2UgQUZfSU5FVDY6Ci0JCQlzaW42ID0gKHZvaWQgKikocnErMSk7Ci0JCQlpZiAoc2luNi0+c2luNl9mYW1pbHkgIT0gQUZfSU5FVDYpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNhOwogCQkJbWVtY3B5KHQtPnNhZGRyLmE2LCAmc2luNi0+c2luNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAJCQlzaW42Kys7CiAJCQlpZiAoc2luNi0+c2luNl9mYW1pbHkgIT0gQUZfSU5FVDYpCkBAIC0xNzkzLDcgKzE3OTEsMTAgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JfQorCQl0LT5lbmNhcF9mYW1pbHkgPSBzYS0+c2FfZmFtaWx5OworCX0gZWxzZQorCQl0LT5lbmNhcF9mYW1pbHkgPSB4cC0+ZmFtaWx5OworCiAJLyogTm8gd2F5IHRvIHNldCB0aGlzIHZpYSBrYW1lIHBma2V5ICovCiAJdC0+YWFsZ29zID0gdC0+ZWFsZ29zID0gdC0+Y2FsZ29zID0gfjA7CiAJeHAtPnhmcm1fbnIrKzsKQEAgLTE4MzAsMTggKzE4MzEsMjUgQEAKIAogc3RhdGljIGludCBwZmtleV94ZnJtX3BvbGljeTJtc2dfc2l6ZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKQogeworCXN0cnVjdCB4ZnJtX3RtcGwgKnQ7CiAJaW50IHNvY2thZGRyX3NpemUgPSBwZmtleV9zb2NrYWRkcl9zaXplKHhwLT5mYW1pbHkpOwotCWludCBzb2NrbGVuID0gKHhwLT5mYW1pbHkgPT0gQUZfSU5FVCA/Ci0JCSAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSA6Ci0JCSAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCWludCBzb2NrbGVuID0gMDsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPHhwLT54ZnJtX25yOyBpKyspIHsKKwkJdCA9IHhwLT54ZnJtX3ZlYyArIGk7CisJCXNvY2tsZW4gKz0gKHQtPmVuY2FwX2ZhbWlseSA9PSBBRl9JTkVUID8KKwkJCSAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSA6CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKwl9CiAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykgKwogCQkoc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKSAqIDMpICsKIAkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSAqIDIpICsgCiAJCShzb2NrYWRkcl9zaXplICogMikgKwogCQlzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpICsKLQkJKHhwLT54ZnJtX25yICogKHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgKwotCQkJCShzb2NrbGVuICogMikpKSArCisJCSh4cC0+eGZybV9uciAqIHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkpICsKKwkJKHNvY2tsZW4gKiAyKSArCiAJCXBma2V5X3hmcm1fcG9saWN5MnNlY19jdHhfc2l6ZSh4cCk7CiB9CiAKQEAgLTE5OTksNyArMjAwNyw5IEBACiAKIAkJcmVxX3NpemUgPSBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpOwogCQlpZiAodC0+bW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKQotCQkJcmVxX3NpemUgKz0gMipzb2NrbGVuOworCQkJcmVxX3NpemUgKz0gKCh0LT5lbmNhcF9mYW1pbHkgPT0gQUZfSU5FVCA/CisJCSAgICAgICAJCSAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgOgorCQkgICAgICAgCQkgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkgKiAyKTsKIAkJZWxzZQogCQkJc2l6ZSAtPSAyKnNvY2tsZW47CiAJCXJxID0gKHZvaWQqKXNrYl9wdXQoc2tiLCByZXFfc2l6ZSk7CkBAIC0yMDE1LDcgKzIwMjUsNyBAQAogCQkJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWwgPSBJUFNFQ19MRVZFTF9VU0U7CiAJCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3JlcWlkID0gdC0+cmVxaWQ7CiAJCWlmICh0LT5tb2RlID09IFhGUk1fTU9ERV9UVU5ORUwpIHsKLQkJCXN3aXRjaCAoeHAtPmZhbWlseSkgeworCQkJc3dpdGNoICh0LT5lbmNhcF9mYW1pbHkpIHsKIAkJCWNhc2UgQUZfSU5FVDoKIAkJCQlzaW4gPSAodm9pZCopKHJxKzEpOwogCQkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC0yOTM4LDcgKzI5NDgsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHBma2V5X3NlbmRfbmV3X21hcHBpbmcoc3RydWN0IHhmcm1fc3RhdGUgKngsIHhmcm1fYWRkcmVzc190ICppcGFkZHIsIHUxNiBzcG9ydCkKK3N0YXRpYyBpbnQgcGZrZXlfc2VuZF9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNhZGJfbXNnICpoZHI7CmRpZmYgLS1naXQgYS9uZXQvbGxjL2FmX2xsYy5jIGIvbmV0L2xsYy9hZl9sbGMuYwppbmRleCAyNjUyZWFkLi4xOTBiYjNlIDEwMDY0NAotLS0gYS9uZXQvbGxjL2FmX2xsYy5jCisrKyBiL25ldC9sbGMvYWZfbGxjLmMKQEAgLTY0LDcgKzY0LDcgQEAKICAqCiAgKglHaXZlbiBhbiBBUlAgaGVhZGVyIHR5cGUgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGV0aGVybmV0IHByb3RvY29sLgogICovCi1zdGF0aWMgaW5saW5lIHUxNiBsbGNfcHJvdG9fdHlwZSh1MTYgYXJwaHJkKQorc3RhdGljIGlubGluZSBfX2JlMTYgbGxjX3Byb3RvX3R5cGUodTE2IGFycGhyZCkKIHsKIAlyZXR1cm4gYXJwaHJkID09IEFSUEhSRF9JRUVFODAyX1RSID8KIAkJICAgICAgICAgaHRvbnMoRVRIX1BfVFJfODAyXzIpIDogaHRvbnMoRVRIX1BfODAyXzIpOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfaW5wdXQuYyBiL25ldC9sbGMvbGxjX2lucHV0LmMKaW5kZXggOTRkMjM2OC4uZGI4MmFmZiAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfaW5wdXQuYworKysgYi9uZXQvbGxjL2xsY19pbnB1dC5jCkBAIC0xMTUsOCArMTE1LDggQEAKIAlza2ItPmgucmF3ICs9IGxsY19sZW47CiAJc2tiX3B1bGwoc2tiLCBsbGNfbGVuKTsKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDJfMikpIHsKLQkJdTE2IHBkdWxlbiA9IGV0aF9oZHIoc2tiKS0+aF9wcm90bywKLQkJICAgIGRhdGFfc2l6ZSA9IG50b2hzKHBkdWxlbikgLSBsbGNfbGVuOworCQlfX2JlMTYgcGR1bGVuID0gZXRoX2hkcihza2IpLT5oX3Byb3RvOworCQl1MTYgZGF0YV9zaXplID0gbnRvaHMocGR1bGVuKSAtIGxsY19sZW47CiAKIAkJaWYgKHVubGlrZWx5KHBza2JfdHJpbV9yY3N1bShza2IsIGRhdGFfc2l6ZSkpKQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggZjYxOWM2NS4uM2E2Njg3OCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMjUsMTkgKzI1LDU3IEBACiAJICBhbmQgaXMgYWxzbyBzY2hlZHVsZWQgdG8gcmVwbGFjZSB0aGUgb2xkIHN5c2xvZy1iYXNlZCBpcHRfTE9HCiAJICBhbmQgaXA2dF9MT0cgbW9kdWxlcy4KIAotY29uZmlnIE5GX0NPTk5UUkFDSwotCXRyaXN0YXRlICJMYXllciAzIEluZGVwZW5kZW50IENvbm5lY3Rpb24gdHJhY2tpbmcgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSVBfTkZfQ09OTlRSQUNLPW4KLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCitjb25maWcgTkZfQ09OTlRSQUNLX0VOQUJMRUQKKwl0cmlzdGF0ZSAiTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCIKKwloZWxwCiAJICBDb25uZWN0aW9uIHRyYWNraW5nIGtlZXBzIGEgcmVjb3JkIG9mIHdoYXQgcGFja2V0cyBoYXZlIHBhc3NlZAogCSAgdGhyb3VnaCB5b3VyIG1hY2hpbmUsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgYXJlIHJlbGF0ZWQKIAkgIGludG8gY29ubmVjdGlvbnMuCiAKKwkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKKwkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bworCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKKwkgIGJlbG93KS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2Nob2ljZQorCXByb21wdCAiTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDS19FTkFCTEVECisKK2NvbmZpZyBORl9DT05OVFJBQ0tfU1VQUE9SVAorCWJvb2wgIkxheWVyIDMgSW5kZXBlbmRlbnQgQ29ubmVjdGlvbiB0cmFja2luZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKIAkgIExheWVyIDMgaW5kZXBlbmRlbnQgY29ubmVjdGlvbiB0cmFja2luZyBpcyBleHBlcmltZW50YWwgc2NoZW1lCiAJICB3aGljaCBnZW5lcmFsaXplIGlwX2Nvbm50cmFjayB0byBzdXBwb3J0IG90aGVyIGxheWVyIDMgcHJvdG9jb2xzLgogCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKKwkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bworCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKKwkgIGJlbG93KS4KKworY29uZmlnIElQX05GX0NPTk5UUkFDS19TVVBQT1JUCisJYm9vbCAiTGF5ZXIgMyBEZXBlbmRlbnQgQ29ubmVjdGlvbiB0cmFja2luZyAoT0JTT0xFVEUpIgorCWhlbHAKKwkgIFRoZSBvbGQsIExheWVyIDMgZGVwZW5kZW50IGlwX2Nvbm50cmFjayBzdWJzeXN0ZW0gb2YgbmV0ZmlsdGVyLgorCisJICBUaGlzIGlzIHJlcXVpcmVkIHRvIGRvIE1hc3F1ZXJhZGluZyBvciBvdGhlciBraW5kcyBvZiBOZXR3b3JrCisJICBBZGRyZXNzIFRyYW5zbGF0aW9uIChleGNlcHQgZm9yIEZhc3QgTkFUKS4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8KKwkgIGVuaGFuY2UgcGFja2V0IGZpbHRlcmluZyAoc2VlIGBDb25uZWN0aW9uIHN0YXRlIG1hdGNoIHN1cHBvcnQnCisJICBiZWxvdykuCisKK2VuZGNob2ljZQorCitjb25maWcgTkZfQ09OTlRSQUNLCisJdHJpc3RhdGUKKwlkZWZhdWx0IG0gaWYgTkZfQ09OTlRSQUNLX1NVUFBPUlQgJiYgTkZfQ09OTlRSQUNLX0VOQUJMRUQ9bQorCWRlZmF1bHQgeSBpZiBORl9DT05OVFJBQ0tfU1VQUE9SVCAmJiBORl9DT05OVFJBQ0tfRU5BQkxFRD15CisKK2NvbmZpZyBJUF9ORl9DT05OVFJBQ0sKKwl0cmlzdGF0ZQorCWRlZmF1bHQgbSBpZiBJUF9ORl9DT05OVFJBQ0tfU1VQUE9SVCAmJiBORl9DT05OVFJBQ0tfRU5BQkxFRD1tCisJZGVmYXVsdCB5IGlmIElQX05GX0NPTk5UUkFDS19TVVBQT1JUICYmIE5GX0NPTk5UUkFDS19FTkFCTEVEPXkKIAogY29uZmlnIE5GX0NUX0FDQ1QKIAlib29sICJDb25uZWN0aW9uIHRyYWNraW5nIGZsb3cgYWNjb3VudGluZyIKQEAgLTgyLDggKzEyMCwxMiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBgTicuCiAKK2NvbmZpZyBORl9DVF9QUk9UT19HUkUKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCiBjb25maWcgTkZfQ1RfUFJPVE9fU0NUUAotCXRyaXN0YXRlICdTQ1RQIHByb3RvY29sIG9uIG5ldyBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknCisJdHJpc3RhdGUgJ1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpJwogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSwogCWRlZmF1bHQgbgogCWhlbHAKQEAgLTkzLDggKzEzNSwyMyBAQAogCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAogCSAgRG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dC4gIElmIHVuc3VyZSwgc2F5IGBOJy4KIAorY29uZmlnIE5GX0NPTk5UUkFDS19BTUFOREEKKwl0cmlzdGF0ZSAiQW1hbmRhIGJhY2t1cCBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCXNlbGVjdCBURVhUU0VBUkNICisJc2VsZWN0IFRFWFRTRUFSQ0hfS01QCisJaGVscAorCSAgSWYgeW91IGFyZSBydW5uaW5nIHRoZSBBbWFuZGEgYmFja3VwIHBhY2thZ2UgPGh0dHA6Ly93d3cuYW1hbmRhLm9yZy8+CisJICBvbiB0aGlzIG1hY2hpbmUgb3IgbWFjaGluZXMgdGhhdCB3aWxsIGJlIE1BU1FVRVJBREVEIHRocm91Z2ggdGhpcworCSAgbWFjaGluZSwgdGhlbiB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS4gIFRoaXMgYWxsb3dzIHRoZQorCSAgY29ubmVjdGlvbiB0cmFja2luZyBhbmQgbmF0dGluZyBjb2RlIHRvIGFsbG93IHRoZSBzdWItY2hhbm5lbHMgdGhhdAorCSAgQW1hbmRhIHJlcXVpcmVzIGZvciBjb21tdW5pY2F0aW9uIG9mIHRoZSBiYWNrdXAgZGF0YSwgbWVzc2FnZXMgYW5kCisJICBpbmRleC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORl9DT05OVFJBQ0tfRlRQCi0JdHJpc3RhdGUgIkZUUCBzdXBwb3J0IG9uIG5ldyBjb25uZWN0aW9uIHRyYWNraW5nIChFWFBFUklNRU5UQUwpIgorCXRyaXN0YXRlICJGVFAgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKIAloZWxwCiAJICBUcmFja2luZyBGVFAgY29ubmVjdGlvbnMgaXMgcHJvYmxlbWF0aWM6IHNwZWNpYWwgaGVscGVycyBhcmUKQEAgLTEwNyw2ICsxNjQsMTAxIEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkZfQ09OTlRSQUNLX0gzMjMKKwl0cmlzdGF0ZSAiSC4zMjMgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKKwloZWxwCisJICBILjMyMyBpcyBhIFZvSVAgc2lnbmFsbGluZyBwcm90b2NvbCBmcm9tIElUVS1ULiBBcyBvbmUgb2YgdGhlIG1vc3QKKwkgIGltcG9ydGFudCBWb0lQIHByb3RvY29scywgaXQgaXMgd2lkZWx5IHVzZWQgYnkgdm9pY2UgaGFyZHdhcmUgYW5kCisJICBzb2Z0d2FyZSBpbmNsdWRpbmcgdm9pY2UgZ2F0ZXdheXMsIElQIHBob25lcywgTmV0bWVldGluZywgT3BlblBob25lLAorCSAgR25vbWVtZWV0aW5nLCBldGMuCisKKwkgIFdpdGggdGhpcyBtb2R1bGUgeW91IGNhbiBzdXBwb3J0IEguMzIzIG9uIGEgY29ubmVjdGlvbiB0cmFja2luZy9OQVQKKwkgIGZpcmV3YWxsLgorCisJICBUaGlzIG1vZHVsZSBzdXBwb3J0cyBSQVMsIEZhc3QgU3RhcnQsIEguMjQ1IFR1bm5lbGxpbmcsIENhbGwKKwkgIEZvcndhcmRpbmcsIFJUUC9SVENQIGFuZCBULjEyMCBiYXNlZCBhdWRpbywgdmlkZW8sIGZheCwgY2hhdCwKKwkgIHdoaXRlYm9hcmQsIGZpbGUgdHJhbnNmZXIsIGV0Yy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZQorCSAgdmlzaXQgaHR0cDovL25hdGgzMjMuc291cmNlZm9yZ2UubmV0Ly4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORl9DT05OVFJBQ0tfSVJDCisJdHJpc3RhdGUgIklSQyBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIFRoZXJlIGlzIGEgY29tbW9ubHktdXNlZCBleHRlbnNpb24gdG8gSVJDIGNhbGxlZAorCSAgRGlyZWN0IENsaWVudC10by1DbGllbnQgUHJvdG9jb2wgKERDQykuICBUaGlzIGVuYWJsZXMgdXNlcnMgdG8gc2VuZAorCSAgZmlsZXMgdG8gZWFjaCBvdGhlciwgYW5kIGFsc28gY2hhdCB0byBlYWNoIG90aGVyIHdpdGhvdXQgdGhlIG5lZWQKKwkgIG9mIGEgc2VydmVyLiAgRENDIFNlbmRpbmcgaXMgdXNlZCBhbnl3aGVyZSB5b3Ugc2VuZCBmaWxlcyBvdmVyIElSQywKKwkgIGFuZCBEQ0MgQ2hhdCBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgYnkgRWdnZHJvcCBib3RzLiAgSWYgeW91IGFyZQorCSAgdXNpbmcgTkFULCB0aGlzIGV4dGVuc2lvbiB3aWxsIGVuYWJsZSB5b3UgdG8gc2VuZCBmaWxlcyBhbmQgaW5pdGlhdGUKKwkgIGNoYXRzLiAgTm90ZSB0aGF0IHlvdSBkbyBOT1QgbmVlZCB0aGlzIGV4dGVuc2lvbiB0byBnZXQgZmlsZXMgb3IKKwkgIGhhdmUgb3RoZXJzIGluaXRpYXRlIGNoYXRzLCBvciBldmVyeXRoaW5nIGVsc2UgaW4gSVJDLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5GX0NPTk5UUkFDS19ORVRCSU9TX05TCisJdHJpc3RhdGUgIk5ldEJJT1MgbmFtZSBzZXJ2aWNlIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgTmV0QklPUyBuYW1lIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHNlbnQgYXMgYnJvYWRjYXN0IG1lc3NhZ2VzIGZyb20gYW4KKwkgIHVucHJpdmlsZWdlZCBwb3J0IGFuZCByZXNwb25kZWQgdG8gd2l0aCB1bmljYXN0IG1lc3NhZ2VzIHRvIHRoZQorCSAgc2FtZSBwb3J0LiBUaGlzIG1ha2UgdGhlbSBoYXJkIHRvIGZpcmV3YWxsIHByb3Blcmx5IGJlY2F1c2UgY29ubmVjdGlvbgorCSAgdHJhY2tpbmcgZG9lc24ndCBkZWFsIHdpdGggYnJvYWRjYXN0cy4gVGhpcyBoZWxwZXIgdHJhY2tzIGxvY2FsbHkKKwkgIG9yaWdpbmF0aW5nIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIHJlcXVlc3RzIGFuZCB0aGUgY29ycmVzcG9uZGluZworCSAgcmVzcG9uc2VzLiBJdCByZWxpZXMgb24gY29ycmVjdCBJUCBhZGRyZXNzIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseQorCSAgbmV0bWFzayBhbmQgYnJvYWRjYXN0IGFkZHJlc3MuIFdoZW4gcHJvcGVybHkgY29uZmlndXJlZCwgdGhlIG91dHB1dAorCSAgb2YgImlwIGFkZHJlc3Mgc2hvdyIgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGlzOgorCisJICAkIGlwIC00IGFkZHJlc3Mgc2hvdyBldGgwCisJICA0OiBldGgwOiA8QlJPQURDQVNULE1VTFRJQ0FTVCxVUD4gbXR1IDE1MDAgcWRpc2MgcGZpZm9fZmFzdCBxbGVuIDEwMDAKKwkgICAgICBpbmV0IDE3Mi4xNi4yLjI1Mi8yNCBicmQgMTcyLjE2LjIuMjU1IHNjb3BlIGdsb2JhbCBldGgwCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZfQ09OTlRSQUNLX1BQVFAKKwl0cmlzdGF0ZSAiUFB0UCBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCXNlbGVjdCBORl9DVF9QUk9UT19HUkUKKwloZWxwCisJICBUaGlzIG1vZHVsZSBhZGRzIHN1cHBvcnQgZm9yIFBQVFAgKFBvaW50IHRvIFBvaW50IFR1bm5lbGxpbmcKKwkgIFByb3RvY29sLCBSRkMyNjM3KSBjb25uZWN0aW9uIHRyYWNraW5nIGFuZCBOQVQuCisKKwkgIElmIHlvdSBhcmUgcnVubmluZyBQUFRQIHNlc3Npb25zIG92ZXIgYSBzdGF0ZWZ1bCBmaXJld2FsbCBvciBOQVQKKwkgIGJveCwgeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUuCisKKwkgIFBsZWFzZSBub3RlIHRoYXQgbm90IGFsbCBQUFRQIG1vZGVzIG9mIG9wZXJhdGlvbiBhcmUgc3VwcG9ydGVkIHlldC4KKwkgIFNwZWNpZmljYWxseSB0aGVzZSBsaW1pdGF0aW9ucyBleGlzdDoKKwkgICAgLSBCbGluZHkgYXNzdW1lcyB0aGF0IGNvbnRyb2wgY29ubmVjdGlvbnMgYXJlIGFsd2F5cyBlc3RhYmxpc2hlZAorCSAgICAgIGluIFBOUy0+UEFDIGRpcmVjdGlvbi4gVGhpcyBpcyBhIHZpb2xhdGlvbiBvZiBSRkMyNjM3LgorCSAgICAtIE9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgY2FsbCB3aXRoaW4gZWFjaCBzZXNzaW9uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZfQ09OTlRSQUNLX1NJUAorCXRyaXN0YXRlICJTSVAgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKKwloZWxwCisJICBTSVAgaXMgYW4gYXBwbGljYXRpb24tbGF5ZXIgY29udHJvbCBwcm90b2NvbCB0aGF0IGNhbiBlc3RhYmxpc2gsCisJICBtb2RpZnksIGFuZCB0ZXJtaW5hdGUgbXVsdGltZWRpYSBzZXNzaW9ucyAoY29uZmVyZW5jZXMpIHN1Y2ggYXMKKwkgIEludGVybmV0IHRlbGVwaG9ueSBjYWxscy4gV2l0aCB0aGUgaXBfY29ubnRyYWNrX3NpcCBhbmQKKwkgIHRoZSBuZl9uYXRfc2lwIG1vZHVsZXMgeW91IGNhbiBzdXBwb3J0IHRoZSBwcm90b2NvbCBvbiBhIGNvbm5lY3Rpb24KKwkgIHRyYWNraW5nL05BVGluZyBmaXJld2FsbC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORl9DT05OVFJBQ0tfVEZUUAorCXRyaXN0YXRlICJURlRQIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgVEZUUCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciwgdGhpcyBpcyByZXF1aXJlZCBkZXBlbmRpbmcKKwkgIG9uIGhvdyByZXN0cmljdGl2ZSB5b3VyIHJ1bGVzZXQgaXMuCisJICBJZiB5b3UgYXJlIHVzaW5nIGEgdGZ0cCBjbGllbnQgYmVoaW5kIC1qIFNOQVQgb3IgLWogTUFTUVVFUkFESU5HCisJICB5b3Ugd2lsbCBuZWVkIHRoaXMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTkZfQ1RfTkVUTElOSwogCXRyaXN0YXRlICdDb25uZWN0aW9uIHRyYWNraW5nIG5ldGxpbmsgaW50ZXJmYWNlIChFWFBFUklNRU5UQUwpJwogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSyAmJiBORVRGSUxURVJfTkVUTElOSwpAQCAtMTg0LDYgKzMzNiwxNyBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0cKKwl0cmlzdGF0ZSAnIk5GTE9HIiB0YXJnZXQgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgTkZMT0cgdGFyZ2V0LCB3aGljaCBhbGxvd3MgdG8gTE9HCisJICBtZXNzYWdlcyB0aHJvdWdoIHRoZSBuZXRmaWx0ZXIgbG9nZ2luZyBBUEksIHdoaWNoIGNhbiB1c2UKKwkgIGVpdGhlciB0aGUgb2xkIExPRyB0YXJnZXQsIHRoZSBvbGQgVUxPRyB0YXJnZXQgb3IgbmZuZXRsaW5rX2xvZworCSAgYXMgYmFja2VuZC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX05PVFJBQ0sKIAl0cmlzdGF0ZSAgJyJOT1RSQUNLIiB0YXJnZXQgc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCkBAIC00NjQsNSArNjI3LDE5IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVAorCXRyaXN0YXRlICciaGFzaGxpbWl0IiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYGhhc2hsaW1pdCcgbWF0Y2guCisKKwkgIEFzIG9wcG9zZWQgdG8gYGxpbWl0JywgdGhpcyBtYXRjaCBkeW5hbWljYWxseSBjcmVhdGVzIGEgaGFzaCB0YWJsZQorCSAgb2YgbGltaXQgYnVja2V0cywgYmFzZWQgb24geW91ciBzZWxlY3Rpb24gb2Ygc291cmNlL2Rlc3RpbmF0aW9uCisJICBhZGRyZXNzZXMgYW5kL29yIHBvcnRzLgorCisJICBJdCBlbmFibGVzIHlvdSB0byBleHByZXNzIHBvbGljaWVzIGxpa2UgYDEwa3BwcyBmb3IgYW55IGdpdmVuCisJICBkZXN0aW5hdGlvbiBhZGRyZXNzJyBvciBgNTAwcHBzIGZyb20gYW55IGdpdmVuIHNvdXJjZSBhZGRyZXNzJworCSAgd2l0aCBhIHNpbmdsZSBydWxlLgorCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGE3NGJlNDkuLjVkYzU1NzQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMSw3ICsxLDEwIEBACiBuZXRmaWx0ZXItb2JqcyA6PSBjb3JlLm8gbmZfbG9nLm8gbmZfcXVldWUubyBuZl9zb2Nrb3B0Lm8KLW5mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCisKK25mX2Nvbm50cmFjay15CTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfZXhwZWN0Lm8gbmZfY29ubnRyYWNrX2hlbHBlci5vIG5mX2Nvbm50cmFja19wcm90by5vIG5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIG5mX2Nvbm50cmFja19wcm90b190Y3AubyBuZl9jb25udHJhY2tfcHJvdG9fdWRwLm8KK25mX2Nvbm50cmFjay0kKENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTKSArPSBuZl9jb25udHJhY2tfZWNhY2hlLm8KIAogb2JqLSQoQ09ORklHX05FVEZJTFRFUikgPSBuZXRmaWx0ZXIubworb2JqLSQoQ09ORklHX1NZU0NUTCkgKz0gbmZfc3lzY3RsLm8KIAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LKSArPSBuZm5ldGxpbmsubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFKSArPSBuZm5ldGxpbmtfcXVldWUubwpAQCAtMTEsMTMgKzE0LDIzIEBACiBvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLKSArPSBuZl9jb25udHJhY2subwogCiAjIFNDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZworb2JqLSQoQ09ORklHX05GX0NUX1BST1RPX0dSRSkgKz0gbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5vCiBvYmotJChDT05GSUdfTkZfQ1RfUFJPVE9fU0NUUCkgKz0gbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAubwogCiAjIG5ldGxpbmsgaW50ZXJmYWNlIGZvciBuZl9jb25udHJhY2sKIG9iai0kKENPTkZJR19ORl9DVF9ORVRMSU5LKSArPSBuZl9jb25udHJhY2tfbmV0bGluay5vCiAKICMgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXJzCituZl9jb25udHJhY2tfaDMyMy1vYmpzIDo9IG5mX2Nvbm50cmFja19oMzIzX21haW4ubyBuZl9jb25udHJhY2tfaDMyM19hc24xLm8KKworb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREEpICs9IG5mX2Nvbm50cmFja19hbWFuZGEubwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19GVFApICs9IG5mX2Nvbm50cmFja19mdHAubworb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19IMzIzKSArPSBuZl9jb25udHJhY2tfaDMyMy5vCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX0lSQykgKz0gbmZfY29ubnRyYWNrX2lyYy5vCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX05FVEJJT1NfTlMpICs9IG5mX2Nvbm50cmFja19uZXRiaW9zX25zLm8KK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfUFBUUCkgKz0gbmZfY29ubnRyYWNrX3BwdHAubworb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19TSVApICs9IG5mX2Nvbm50cmFja19zaXAubworb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19URlRQKSArPSBuZl9jb25udHJhY2tfdGZ0cC5vCiAKICMgZ2VuZXJpYyBYIHRhYmxlcyAKIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRBQkxFUykgKz0geF90YWJsZXMubyB4dF90Y3B1ZHAubwpAQCAtMjgsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfRFNDUCkgKz0geHRfRFNDUC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLKSArPSB4dF9NQVJLLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUpICs9IHh0X05GUVVFVUUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0cpICs9IHh0X05GTE9HLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05PVFJBQ0spICs9IHh0X05PVFJBQ0subwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfU0VDTUFSSykgKz0geHRfU0VDTUFSSy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OU0VDTUFSSykgKz0geHRfQ09OTlNFQ01BUksubwpAQCAtNTYsMyArNzAsNCBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcpICs9IHh0X3N0cmluZy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUykgKz0geHRfdGNwbXNzLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVikgKz0geHRfcGh5c2Rldi5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVCkgKz0geHRfaGFzaGxpbWl0Lm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvY29yZS5jIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKaW5kZXggZDgwYjkzNS4uMjkxYjhjNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhhZmluZm9fbG9jayk7CiAKLXN0cnVjdCBuZl9hZmluZm8gKm5mX2FmaW5mb1tOUFJPVE9dOworc3RydWN0IG5mX2FmaW5mbyAqbmZfYWZpbmZvW05QUk9UT10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobmZfYWZpbmZvKTsKIAogaW50IG5mX3JlZ2lzdGVyX2FmaW5mbyhzdHJ1Y3QgbmZfYWZpbmZvICphZmluZm8pCkBAIC01NCw3ICs1NCw3IEBACiAgKiBvZiBza2J1ZmZzIHF1ZXVlZCBmb3IgdXNlcnNwYWNlLCBhbmQgbm90IGRlcmVnaXN0ZXIgYSBob29rIHVubGVzcwogICogdGhpcyBpcyB6ZXJvLCBidXQgdGhhdCBzdWNrcy4gIE5vdywgd2Ugc2ltcGx5IGNoZWNrIHdoZW4gdGhlCiAgKiBwYWNrZXRzIGNvbWUgYmFjazogaWYgdGhlIGhvb2sgaXMgZ29uZSwgdGhlIHBhY2tldCBpcyBkaXNjYXJkZWQuICovCi1zdHJ1Y3QgbGlzdF9oZWFkIG5mX2hvb2tzW05QUk9UT11bTkZfTUFYX0hPT0tTXTsKK3N0cnVjdCBsaXN0X2hlYWQgbmZfaG9va3NbTlBST1RPXVtORl9NQVhfSE9PS1NdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKG5mX2hvb2tzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmZfaG9va19sb2NrKTsKIApAQCAtMjIyLDI4ICsyMjIsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2tiX21ha2Vfd3JpdGFibGUpOwogCi11X2ludDE2X3QgbmZfY3N1bV91cGRhdGUodV9pbnQzMl90IG9sZHZhbCwgdV9pbnQzMl90IG5ld3ZhbCwgdV9pbnQzMl90IGNzdW0pCit2b2lkIG5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoX19zdW0xNiAqc3VtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIF9fYmUzMiBmcm9tLCBfX2JlMzIgdG8sIGludCBwc2V1ZG9oZHIpCiB7Ci0JdV9pbnQzMl90IGRpZmZbXSA9IHsgb2xkdmFsLCBuZXd2YWwgfTsKLQotCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZiwgc2l6ZW9mKGRpZmYpLCB+Y3N1bSkpOwotfQotRVhQT1JUX1NZTUJPTChuZl9jc3VtX3VwZGF0ZSk7Ci0KLXVfaW50MTZfdCBuZl9wcm90b19jc3VtX3VwZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHVfaW50MzJfdCBvbGR2YWwsIHVfaW50MzJfdCBuZXd2YWwsCi0JCQkgICAgICAgdV9pbnQxNl90IGNzdW0sIGludCBwc2V1ZG9oZHIpCi17CisJX19iZTMyIGRpZmZbXSA9IHsgfmZyb20sIHRvIH07CiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJY3N1bSA9IG5mX2NzdW1fdXBkYXRlKG9sZHZhbCwgbmV3dmFsLCBjc3VtKTsKKwkJKnN1bSA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoKGNoYXIgKilkaWZmLCBzaXplb2YoZGlmZiksCisJCQkJfmNzdW1fdW5mb2xkKCpzdW0pKSk7CiAJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSAmJiBwc2V1ZG9oZHIpCi0JCQlza2ItPmNzdW0gPSBuZl9jc3VtX3VwZGF0ZShvbGR2YWwsIG5ld3ZhbCwgc2tiLT5jc3VtKTsKKwkJCXNrYi0+Y3N1bSA9IH5jc3VtX3BhcnRpYWwoKGNoYXIgKilkaWZmLCBzaXplb2YoZGlmZiksCisJCQkJCQl+c2tiLT5jc3VtKTsKIAl9IGVsc2UgaWYgKHBzZXVkb2hkcikKLQkJY3N1bSA9IH5uZl9jc3VtX3VwZGF0ZShvbGR2YWwsIG5ld3ZhbCwgfmNzdW0pOwotCi0JcmV0dXJuIGNzdW07CisJCSpzdW0gPSB+Y3N1bV9mb2xkKGNzdW1fcGFydGlhbCgoY2hhciAqKWRpZmYsIHNpemVvZihkaWZmKSwKKwkJCQljc3VtX3VuZm9sZCgqc3VtKSkpOwogfQotRVhQT1JUX1NZTUJPTChuZl9wcm90b19jc3VtX3VwZGF0ZSk7CitFWFBPUlRfU1lNQk9MKG5mX3Byb3RvX2NzdW1fcmVwbGFjZTQpOwogCiAvKiBUaGlzIGRvZXMgbm90IGJlbG9uZyBoZXJlLCBidXQgbG9jYWxseSBnZW5lcmF0ZWQgZXJyb3JzIG5lZWQgaXQgaWYgY29ubmVjdGlvbgogICAgdHJhY2tpbmcgaW4gdXNlOiB3aXRob3V0IHRoaXMsIGNvbm5lY3Rpb24gbWF5IG5vdCBiZSBpbiBoYXNoIHRhYmxlLCBhbmQgaGVuY2UKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FtYW5kYS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4NjllYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FtYW5kYS5jCkBAIC0wLDAgKzEsMjM4IEBACisvKiBBbWFuZGEgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nCisgKgorICogKEMpIDIwMDIgYnkgQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4KKyAqIGJhc2VkIG9uIEhXJ3MgaXBfY29ubnRyYWNrX2lyYy5jIGFzIHdlbGwgYXMgb3RoZXIgbW9kdWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FtYW5kYS5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IG1hc3Rlcl90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMDA7CitzdGF0aWMgY2hhciAqdHNfYWxnbyA9ICJrbXAiOworCitNT0RVTEVfQVVUSE9SKCJCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbWFuZGEgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX2FtYW5kYSIpOworCittb2R1bGVfcGFyYW0obWFzdGVyX3RpbWVvdXQsIHVpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhtYXN0ZXJfdGltZW91dCwgInRpbWVvdXQgZm9yIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiIpOworbW9kdWxlX3BhcmFtKHRzX2FsZ28sIGNoYXJwLCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHNfYWxnbywgInRleHRzZWFyY2ggYWxnb3JpdGhtIHRvIHVzZSAoZGVmYXVsdCBrbXApIik7CisKK3Vuc2lnbmVkIGludCAoKm5mX25hdF9hbWFuZGFfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkJICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKKwkJCQkgICBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X2FtYW5kYV9ob29rKTsKKworZW51bSBhbWFuZGFfc3RyaW5ncyB7CisJU0VBUkNIX0NPTk5FQ1QsCisJU0VBUkNIX05FV0xJTkUsCisJU0VBUkNIX0RBVEEsCisJU0VBUkNIX01FU0csCisJU0VBUkNIX0lOREVYLAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJY2hhcgkJCSpzdHJpbmc7CisJc2l6ZV90CQkJbGVuOworCXN0cnVjdCB0c19jb25maWcJKnRzOworfSBzZWFyY2hbXSBfX3JlYWRfbW9zdGx5ID0geworCVtTRUFSQ0hfQ09OTkVDVF0gPSB7CisJCS5zdHJpbmcJPSAiQ09OTkVDVCAiLAorCQkubGVuCT0gOCwKKwl9LAorCVtTRUFSQ0hfTkVXTElORV0gPSB7CisJCS5zdHJpbmcJPSAiXG4iLAorCQkubGVuCT0gMSwKKwl9LAorCVtTRUFSQ0hfREFUQV0gPSB7CisJCS5zdHJpbmcJPSAiREFUQSAiLAorCQkubGVuCT0gNSwKKwl9LAorCVtTRUFSQ0hfTUVTR10gPSB7CisJCS5zdHJpbmcJPSAiTUVTRyAiLAorCQkubGVuCT0gNSwKKwl9LAorCVtTRUFSQ0hfSU5ERVhdID0geworCQkuc3RyaW5nID0gIklOREVYICIsCisJCS5sZW4JPSA2LAorCX0sCit9OworCitzdGF0aWMgaW50IGFtYW5kYV9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RydWN0IHRzX3N0YXRlIHRzOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGU7CisJdW5zaWduZWQgaW50IGRhdGFvZmYsIHN0YXJ0LCBzdG9wLCBvZmYsIGk7CisJY2hhciBwYnVmW3NpemVvZigiNjU1MzUiKV0sICp0bXA7CisJdV9pbnQxNl90IGxlbjsKKwlfX2JlMTYgcG9ydDsKKwlpbnQgZmFtaWx5ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bTsKKwlpbnQgcmV0ID0gTkZfQUNDRVBUOworCXR5cGVvZihuZl9uYXRfYW1hbmRhX2hvb2spIG5mX25hdF9hbWFuZGE7CisKKwkvKiBPbmx5IGxvb2sgYXQgcGFja2V0cyBmcm9tIHRoZSBBbWFuZGEgc2VydmVyICovCisJaWYgKENUSU5GTzJESVIoY3RpbmZvKSA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBpbmNyZWFzZSB0aGUgVURQIHRpbWVvdXQgb2YgdGhlIG1hc3RlciBjb25uZWN0aW9uIGFzIHJlcGxpZXMgZnJvbQorCSAqIEFtYW5kYSBjbGllbnRzIHRvIHRoZSBzZXJ2ZXIgY2FuIGJlIHF1aXRlIGRlbGF5ZWQgKi8KKwluZl9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgbWFzdGVyX3RpbWVvdXQgKiBIWik7CisKKwkvKiBObyBkYXRhPyAqLworCWRhdGFvZmYgPSBwcm90b2ZmICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJhbWFuZGFfaGVscDogc2tibGVuID0gJXVcbiIsICgqcHNrYiktPmxlbik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7CisJc3RhcnQgPSBza2JfZmluZF90ZXh0KCpwc2tiLCBkYXRhb2ZmLCAoKnBza2IpLT5sZW4sCisJCQkgICAgICBzZWFyY2hbU0VBUkNIX0NPTk5FQ1RdLnRzLCAmdHMpOworCWlmIChzdGFydCA9PSBVSU5UX01BWCkKKwkJZ290byBvdXQ7CisJc3RhcnQgKz0gZGF0YW9mZiArIHNlYXJjaFtTRUFSQ0hfQ09OTkVDVF0ubGVuOworCisJbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7CisJc3RvcCA9IHNrYl9maW5kX3RleHQoKnBza2IsIHN0YXJ0LCAoKnBza2IpLT5sZW4sCisJCQkgICAgIHNlYXJjaFtTRUFSQ0hfTkVXTElORV0udHMsICZ0cyk7CisJaWYgKHN0b3AgPT0gVUlOVF9NQVgpCisJCWdvdG8gb3V0OworCXN0b3AgKz0gc3RhcnQ7CisKKwlmb3IgKGkgPSBTRUFSQ0hfREFUQTsgaSA8PSBTRUFSQ0hfSU5ERVg7IGkrKykgeworCQltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKwkJb2ZmID0gc2tiX2ZpbmRfdGV4dCgqcHNrYiwgc3RhcnQsIHN0b3AsIHNlYXJjaFtpXS50cywgJnRzKTsKKwkJaWYgKG9mZiA9PSBVSU5UX01BWCkKKwkJCWNvbnRpbnVlOworCQlvZmYgKz0gc3RhcnQgKyBzZWFyY2hbaV0ubGVuOworCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZW9mKHBidWYpIC0gMSwgc3RvcCAtIG9mZik7CisJCWlmIChza2JfY29weV9iaXRzKCpwc2tiLCBvZmYsIHBidWYsIGxlbikpCisJCQlicmVhazsKKwkJcGJ1ZltsZW5dID0gJ1wwJzsKKworCQlwb3J0ID0gaHRvbnMoc2ltcGxlX3N0cnRvdWwocGJ1ZiwgJnRtcCwgMTApKTsKKwkJbGVuID0gdG1wIC0gcGJ1ZjsKKwkJaWYgKHBvcnQgPT0gMCB8fCBsZW4gPiA1KQorCQkJYnJlYWs7CisKKwkJZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CisJCWlmIChleHAgPT0gTlVMTCkgeworCQkJcmV0ID0gTkZfRFJPUDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXR1cGxlID0gJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZTsKKwkJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgZmFtaWx5LAorCQkJCQkgJnR1cGxlLT5zcmMudTMsICZ0dXBsZS0+ZHN0LnUzLAorCQkJCQkgSVBQUk9UT19UQ1AsIE5VTEwsICZwb3J0KTsKKworCQluZl9uYXRfYW1hbmRhID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9hbWFuZGFfaG9vayk7CisJCWlmIChuZl9uYXRfYW1hbmRhICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCQlyZXQgPSBuZl9uYXRfYW1hbmRhKHBza2IsIGN0aW5mbywgb2ZmIC0gZGF0YW9mZiwKKwkJCQkJICAgIGxlbiwgZXhwKTsKKwkJZWxzZSBpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKKwkJCXJldCA9IE5GX0RST1A7CisJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyIGFtYW5kYV9oZWxwZXJbMl0gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5uYW1lCQkJPSAiYW1hbmRhIiwKKwkJLm1heF9leHBlY3RlZAkJPSAzLAorCQkudGltZW91dAkJPSAxODAsCisJCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJCS5oZWxwCQkJPSBhbWFuZGFfaGVscCwKKwkJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQsCisJCS50dXBsZS5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMTAwODApLAorCQkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCisJCS5tYXNrLnNyYy5sM251bQkJPSAweEZGRkYsCisJCS5tYXNrLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCQkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCX0sCisJeworCQkubmFtZQkJCT0gImFtYW5kYSIsCisJCS5tYXhfZXhwZWN0ZWQJCT0gMywKKwkJLnRpbWVvdXQJCT0gMTgwLAorCQkubWUJCQk9IFRISVNfTU9EVUxFLAorCQkuaGVscAkJCT0gYW1hbmRhX2hlbHAsCisJCS50dXBsZS5zcmMubDNudW0JPSBBRl9JTkVUNiwKKwkJLnR1cGxlLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygxMDA4MCksCisJCS50dXBsZS5kc3QucHJvdG9udW0JPSBJUFBST1RPX1VEUCwKKwkJLm1hc2suc3JjLmwzbnVtCQk9IDB4RkZGRiwKKwkJLm1hc2suc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDB4RkZGRiksCisJCS5tYXNrLmRzdC5wcm90b251bQk9IDB4RkYsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZl9jb25udHJhY2tfYW1hbmRhX2Zpbmkodm9pZCkKK3sKKwlpbnQgaTsKKworCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmYW1hbmRhX2hlbHBlclswXSk7CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZhbWFuZGFfaGVscGVyWzFdKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWFyY2gpOyBpKyspCisJCXRleHRzZWFyY2hfZGVzdHJveShzZWFyY2hbaV0udHMpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfYW1hbmRhX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWFyY2gpOyBpKyspIHsKKwkJc2VhcmNoW2ldLnRzID0gdGV4dHNlYXJjaF9wcmVwYXJlKHRzX2FsZ28sIHNlYXJjaFtpXS5zdHJpbmcsCisJCQkJCQkgIHNlYXJjaFtpXS5sZW4sCisJCQkJCQkgIEdGUF9LRVJORUwsIFRTX0FVVE9MT0FEKTsKKwkJaWYgKHNlYXJjaFtpXS50cyA9PSBOVUxMKQorCQkJZ290byBlcnIxOworCX0KKwlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZhbWFuZGFfaGVscGVyWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIxOworCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXJbMV0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjI7CisJcmV0dXJuIDA7CisKK2VycjI6CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZhbWFuZGFfaGVscGVyWzBdKTsKK2VycjE6CisJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzZWFyY2hbaV0udHMpCisJCQl0ZXh0c2VhcmNoX2Rlc3Ryb3koc2VhcmNoW2ldLnRzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX2FtYW5kYV9pbml0KTsKK21vZHVsZV9leGl0KG5mX2Nvbm50cmFja19hbWFuZGFfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggODM2NTQxZTUuLmVhYTBmOGEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTQ2LDE1ICs0NiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotCi0vKiBUaGlzIHJ3bG9jayBwcm90ZWN0cyB0aGUgbWFpbiBoYXNoIHRhYmxlLCBwcm90b2NvbC9oZWxwZXIvZXhwZWN0ZWQKLSAgIHJlZ2lzdHJhdGlvbnMsIGNvbm50cmFjayB0aW1lcnMqLwotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpCisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KIApAQCAtNjcsOTIgKzY0LDMyIEBACiAjZW5kaWYKIAogREVGSU5FX1JXTE9DSyhuZl9jb25udHJhY2tfbG9jayk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbG9jayk7CiAKIC8qIG5mX2Nvbm50cmFja19zdGFuZGFsb25lIG5lZWRzIHRoaXMgKi8KIGF0b21pY190IG5mX2Nvbm50cmFja19jb3VudCA9IEFUT01JQ19JTklUKDApOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2NvdW50KTsKIAotdm9pZCAoKm5mX2Nvbm50cmFja19kZXN0cm95ZWQpKHN0cnVjdCBuZl9jb25uICpjb25udHJhY2spID0gTlVMTDsKLUxJU1RfSEVBRChuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QpOwotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqKm5mX2N0X3Byb3Rvc1tQRl9NQVhdIF9fcmVhZF9tb3N0bHk7Ci1zdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKm5mX2N0X2wzcHJvdG9zW1BGX01BWF0gX19yZWFkX21vc3RseTsKLXN0YXRpYyBMSVNUX0hFQUQoaGVscGVycyk7Ci11bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplIF9fcmVhZF9tb3N0bHkgPSAwOwordm9pZCAoKm5mX2Nvbm50cmFja19kZXN0cm95ZWQpKHN0cnVjdCBuZl9jb25uICpjb25udHJhY2spOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2Rlc3Ryb3llZCk7CisKK3Vuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CisKIGludCBuZl9jb25udHJhY2tfbWF4IF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbWF4KTsKKwogc3RydWN0IGxpc3RfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2ggX19yZWFkX21vc3RseTsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci1zdHJ1Y3QgbmZfY29ubiBuZl9jb25udHJhY2tfdW50cmFja2VkOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hhc2gpOworCitzdHJ1Y3QgbmZfY29ubiBuZl9jb25udHJhY2tfdW50cmFja2VkIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfdW50cmFja2VkKTsKKwogdW5zaWduZWQgaW50IG5mX2N0X2xvZ19pbnZhbGlkIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgTElTVF9IRUFEKHVuY29uZmlybWVkKTsKK0xJU1RfSEVBRCh1bmNvbmZpcm1lZCk7CiBzdGF0aWMgaW50IG5mX2Nvbm50cmFja192bWFsbG9jIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX25leHRfaWQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19leHBlY3RfbmV4dF9pZDsKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUwotQVRPTUlDX05PVElGSUVSX0hFQUQobmZfY29ubnRyYWNrX2NoYWluKTsKLUFUT01JQ19OT1RJRklFUl9IRUFEKG5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4pOwotCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSwgbmZfY29ubnRyYWNrX2VjYWNoZSk7Ci0KLS8qIGRlbGl2ZXIgY2FjaGVkIGV2ZW50cyBhbmQgY2xlYXIgY2FjaGUgZW50cnkgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2FsbHkKLSAqIGRpc2FibGVkIHNvZnRpcnFzICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9fbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGUpCi17Ci0JREVCVUdQKCJlY2FjaGU6IGRlbGl2ZXJpbmcgZXZlbnRzIGZvciAlcFxuIiwgZWNhY2hlLT5jdCk7Ci0JaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChlY2FjaGUtPmN0KSAmJiAhbmZfY3RfaXNfZHlpbmcoZWNhY2hlLT5jdCkKLQkgICAgJiYgZWNhY2hlLT5ldmVudHMpCi0JCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZuZl9jb25udHJhY2tfY2hhaW4sIGVjYWNoZS0+ZXZlbnRzLAotCQkJCSAgICBlY2FjaGUtPmN0KTsKLQotCWVjYWNoZS0+ZXZlbnRzID0gMDsKLQluZl9jdF9wdXQoZWNhY2hlLT5jdCk7Ci0JZWNhY2hlLT5jdCA9IE5VTEw7Ci19Ci0KLS8qIERlbGl2ZXIgYWxsIGNhY2hlZCBldmVudHMgZm9yIGEgcGFydGljdWxhciBjb25udHJhY2suIFRoaXMgaXMgY2FsbGVkCi0gKiBieSBjb2RlIHByaW9yIHRvIGFzeW5jIHBhY2tldCBoYW5kbGluZyBmb3IgZnJlZWluZyB0aGUgc2tiICovCi12b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKTsKLQlpZiAoZWNhY2hlLT5jdCA9PSBjdCkKLQkJX19uZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLX0KLQotLyogRGVsaXZlciBjYWNoZWQgZXZlbnRzIGZvciBvbGQgcGVuZGluZyBldmVudHMsIGlmIGN1cnJlbnQgY29ubnRyYWNrICE9IG9sZCAqLwotdm9pZCBfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQoc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7Ci0JCi0JLyogdGFrZSBjYXJlIG9mIGRlbGl2ZXJpbmcgcG90ZW50aWFsbHkgb2xkIGV2ZW50cyAqLwotCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKG5mX2Nvbm50cmFja19lY2FjaGUpOwotCUJVR19PTihlY2FjaGUtPmN0ID09IGN0KTsKLQlpZiAoZWNhY2hlLT5jdCkKLQkJX19uZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKLQkvKiBpbml0aWFsaXplIGZvciB0aGlzIGNvbm50cmFjay9wYWNrZXQgKi8KLQllY2FjaGUtPmN0ID0gY3Q7Ci0JbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwotfQotCi0vKiBmbHVzaCB0aGUgZXZlbnQgY2FjaGUgLSB0b3VjaGVzIG90aGVyIENQVSdzIGRhdGEgYW5kIG11c3Qgbm90IGJlIGNhbGxlZAotICogd2hpbGUgcGFja2V0cyBhcmUgc3RpbGwgcGFzc2luZyB0aHJvdWdoIHRoZSBjb2RlICovCi1zdGF0aWMgdm9pZCBuZl9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZWNhY2hlID0gJnBlcl9jcHUobmZfY29ubnRyYWNrX2VjYWNoZSwgY3B1KTsKLQkJaWYgKGVjYWNoZS0+Y3QpCi0JCQluZl9jdF9wdXQoZWNhY2hlLT5jdCk7Ci0JfQotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKSB7fQotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTICovCiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCwgbmZfY29ubnRyYWNrX3N0YXQpOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKG5mX2Nvbm50cmFja19zdGF0KTsKQEAgLTE4NCw4NSArMTIxLDYgQEAKIC8qIFRoaXMgYXZvaWRzIGNhbGxpbmcga21lbV9jYWNoZV9jcmVhdGUoKSB3aXRoIHNhbWUgbmFtZSBzaW11bHRhbmVvdXNseSAqLwogc3RhdGljIERFRklORV9NVVRFWChuZl9jdF9jYWNoZV9tdXRleCk7CiAKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sOwotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqCi1fX25mX2N0X3Byb3RvX2ZpbmQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IHByb3RvY29sKQotewotCWlmICh1bmxpa2VseShsM3Byb3RvID49IEFGX01BWCB8fCBuZl9jdF9wcm90b3NbbDNwcm90b10gPT0gTlVMTCkpCi0JCXJldHVybiAmbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7Ci0KLQlyZXR1cm4gbmZfY3RfcHJvdG9zW2wzcHJvdG9dW3Byb3RvY29sXTsKLX0KLQotLyogdGhpcyBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBwcm90b2NvbCBoZWxwZXIsIHNpbmNlCi0gKiBpdCBmYWxscyBiYWNrIHRvIGdlbmVyaWNfcHJvdG9jb2wgKi8KLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKgotbmZfY3RfcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IHByb3RvY29sKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnA7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlwID0gX19uZl9jdF9wcm90b19maW5kKGwzcHJvdG8sIHByb3RvY29sKTsKLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHAtPm1lKSkKLQkJcCA9ICZuZl9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbDsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCQotCXJldHVybiBwOwotfQotCi12b2lkIG5mX2N0X3Byb3RvX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwKQotewotCW1vZHVsZV9wdXQocC0+bWUpOwotfQotCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKgotbmZfY3RfbDNwcm90b19maW5kX2dldCh1X2ludDE2X3QgbDNwcm90bykKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnA7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlwID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQobDNwcm90byk7Ci0JaWYgKCF0cnlfbW9kdWxlX2dldChwLT5tZSkpCi0JCXAgPSAmbmZfY29ubnRyYWNrX2dlbmVyaWNfbDNwcm90bzsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCi0JcmV0dXJuIHA7Ci19Ci0KLXZvaWQgbmZfY3RfbDNwcm90b19wdXQoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwKQotewotCW1vZHVsZV9wdXQocC0+bWUpOwotfQotCi1pbnQKLW5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodW5zaWduZWQgc2hvcnQgbDNwcm90bykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcDsKLQotcmV0cnk6CXAgPSBuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KGwzcHJvdG8pOwotCWlmIChwID09ICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvKSB7Ci0JCXJldCA9IHJlcXVlc3RfbW9kdWxlKCJuZl9jb25udHJhY2stJWQiLCBsM3Byb3RvKTsKLQkJaWYgKCFyZXQpCi0JCQlnb3RvIHJldHJ5OwotCi0JCXJldHVybiAtRVBST1RPVFlQRTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBuZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodW5zaWduZWQgc2hvcnQgbDNwcm90bykKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnA7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlwID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQobDNwcm90byk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQotCW1vZHVsZV9wdXQocC0+bWUpOwotfQotCiBzdGF0aWMgaW50IG5mX2Nvbm50cmFja19oYXNoX3JuZF9pbml0dGVkOwogc3RhdGljIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaGFzaF9ybmQ7CiAKQEAgLTM2Myw2ICsyMjEsNyBAQAogCW11dGV4X3VubG9jaygmbmZfY3RfY2FjaGVfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfcmVnaXN0ZXJfY2FjaGUpOwogCiAvKiBGSVhNRTogSW4gdGhlIGN1cnJlbnQsIG9ubHkgbmZfY29ubnRyYWNrX2NsZWFudXAoKSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLiAqLwogdm9pZCBuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9jYWNoZSh1X2ludDMyX3QgZmVhdHVyZXMpCkBAIC0zOTcsNiArMjU2LDcgQEAKIAogCW11dGV4X3VubG9jaygmbmZfY3RfY2FjaGVfbXV0ZXgpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfY2FjaGUpOwogCiBpbnQKIG5mX2N0X2dldF90dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNDA2LDcgKzI2Niw3IEBACiAJCXVfaW50OF90IHByb3RvbnVtLAogCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCkKKwkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQogewogCU5GX0NUX1RVUExFX1VfQkxBTksodHVwbGUpOwogCkBAIC00MTcsMTQgKzI3NywxNSBAQAogCXR1cGxlLT5kc3QucHJvdG9udW0gPSBwcm90b251bTsKIAl0dXBsZS0+ZHN0LmRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsKIAotCXJldHVybiBwcm90b2NvbC0+cGt0X3RvX3R1cGxlKHNrYiwgZGF0YW9mZiwgdHVwbGUpOworCXJldHVybiBsNHByb3RvLT5wa3RfdG9fdHVwbGUoc2tiLCBkYXRhb2ZmLCB0dXBsZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9nZXRfdHVwbGUpOwogCiBpbnQKIG5mX2N0X2ludmVydF90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnLAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCi0JCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvY29sKQorCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8pCiB7CiAJTkZfQ1RfVFVQTEVfVV9CTEFOSyhpbnZlcnNlKTsKIApAQCAtNDM1LDExMSArMjk2LDE0IEBACiAJaW52ZXJzZS0+ZHN0LmRpciA9ICFvcmlnLT5kc3QuZGlyOwogCiAJaW52ZXJzZS0+ZHN0LnByb3RvbnVtID0gb3JpZy0+ZHN0LnByb3RvbnVtOwotCXJldHVybiBwcm90b2NvbC0+aW52ZXJ0X3R1cGxlKGludmVyc2UsIG9yaWcpOworCXJldHVybiBsNHByb3RvLT5pbnZlcnRfdHVwbGUoaW52ZXJzZSwgb3JpZyk7CiB9Ci0KLS8qIG5mX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLwotdm9pZCBuZl9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOwotCi0JTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKLQlBU1NFUlRfV1JJVEVfTE9DSygmbmZfY29ubnRyYWNrX2xvY2spOwotCU5GX0NUX0FTU0VSVCghdGltZXJfcGVuZGluZygmZXhwLT50aW1lb3V0KSk7Ci0KLQlsaXN0X2RlbCgmZXhwLT5saXN0KTsKLQlORl9DVF9TVEFUX0lOQyhleHBlY3RfZGVsZXRlKTsKLQltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nLS07Ci0JbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLX0KLQotc3RhdGljIHZvaWQgZXhwZWN0YXRpb25fdGltZWRfb3V0KHVuc2lnbmVkIGxvbmcgdWxfZXhwZWN0KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAgPSAodm9pZCAqKXVsX2V4cGVjdDsKLQotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLX0KLQotc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgotX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7Ci0JCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChuZl9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykpIHsKLQkJCWF0b21pY19pbmMoJmktPnVzZSk7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogSnVzdCBmaW5kIGEgZXhwZWN0YXRpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLwotc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgotbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwotCQotCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCWkgPSBfX25mX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7Ci0JcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBpOwotfQotCi0vKiBJZiBhbiBleHBlY3RhdGlvbiBmb3IgdGhpcyBjb25uZWN0aW9uIGlzIGZvdW5kLCBpdCBnZXRzIGRlbGV0ZSBmcm9tCi0gKiBnbG9iYWwgbGlzdCB0aGVuIHJldHVybmVkLiAqLwotc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLWZpbmRfZXhwZWN0YXRpb24oY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkvKiBJZiBtYXN0ZXIgaXMgbm90IGluIGhhc2ggdGFibGUgeWV0IChpZS4gcGFja2V0IGhhc24ndCBsZWZ0Ci0JICAgdGhpcyBtYWNoaW5lIHlldCksIGhvdyBjYW4gb3RoZXIgZW5kIGtub3cgYWJvdXQgZXhwZWN0ZWQ/Ci0JICAgSGVuY2UgdGhlc2UgYXJlIG5vdCB0aGUgZHJvaWRzIHlvdSBhcmUgbG9va2luZyBmb3IgKGlmCi0JICAgbWFzdGVyIGN0IG5ldmVyIGdvdCBjb25maXJtZWQsIHdlJ2QgaG9sZCBhIHJlZmVyZW5jZSB0byBpdAotCSAgIGFuZCB3ZWlyZCB0aGluZ3Mgd291bGQgaGFwcGVuIHRvIGZ1dHVyZSBwYWNrZXRzKS4gKi8KLQkJaWYgKG5mX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKQotCQkgICAgJiYgbmZfY3RfaXNfY29uZmlybWVkKGktPm1hc3RlcikpIHsKLQkJCWlmIChpLT5mbGFncyAmIE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQpIHsKLQkJCQlhdG9taWNfaW5jKCZpLT51c2UpOwotCQkJCXJldHVybiBpOwotCQkJfSBlbHNlIGlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQkJbmZfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogZGVsZXRlIGFsbCBleHBlY3RhdGlvbnMgZm9yIHRoaXMgY29ubnRyYWNrICovCi12b2lkIG5mX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppLCAqdG1wOwotCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOwotCi0JLyogT3B0aW1pemF0aW9uOiBtb3N0IGNvbm5lY3Rpb24gbmV2ZXIgZXhwZWN0IGFueSBvdGhlcnMuICovCi0JaWYgKCFoZWxwIHx8IGhlbHAtPmV4cGVjdGluZyA9PSAwKQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaSwgdG1wLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChpLT5tYXN0ZXIgPT0gY3QgJiYgZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJbmZfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOwotIAkJfQotCX0KLX0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2ludmVydF90dXBsZSk7CiAKIHN0YXRpYyB2b2lkCiBjbGVhbl9mcm9tX2xpc3RzKHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAlERUJVR1AoImNsZWFuX2Zyb21fbGlzdHMoJXApXG4iLCBjdCk7Ci0JQVNTRVJUX1dSSVRFX0xPQ0soJm5mX2Nvbm50cmFja19sb2NrKTsKIAlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QpOwogCWxpc3RfZGVsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0ubGlzdCk7CiAKQEAgLTU1MSw4ICszMTUsOSBAQAogZGVzdHJveV9jb25udHJhY2soc3RydWN0IG5mX2Nvbm50cmFjayAqbmZjdCkKIHsKIAlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAoc3RydWN0IG5mX2Nvbm4gKiluZmN0OworCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAKIAlERUJVR1AoImRlc3Ryb3lfY29ubnRyYWNrKCVwKVxuIiwgY3QpOwogCU5GX0NUX0FTU0VSVChhdG9taWNfcmVhZCgmbmZjdC0+dXNlKSA9PSAwKTsKQEAgLTU2MSw2ICszMjYsOSBAQAogCW5mX2Nvbm50cmFja19ldmVudChJUENUX0RFU1RST1ksIGN0KTsKIAlzZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKIAorCWlmIChoZWxwICYmIGhlbHAtPmhlbHBlciAmJiBoZWxwLT5oZWxwZXItPmRlc3Ryb3kpCisJCWhlbHAtPmhlbHBlci0+ZGVzdHJveShjdCk7CisKIAkvKiBUbyBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSB3ZWlyZCBsb2NraW5nIGlzc3VlcyBoZXJlOgogCSAqIGRlc3Ryb3lfY29ubnRyYWNrKCkgTVVTVCBOT1QgYmUgY2FsbGVkIHdpdGggYSB3cml0ZSBsb2NrCiAJICogdG8gbmZfY29ubnRyYWNrX2xvY2shISEgLUhXICovCkBAIC01NjgsOSArMzM2LDkgQEAKIAlpZiAobDNwcm90byAmJiBsM3Byb3RvLT5kZXN0cm95KQogCQlsM3Byb3RvLT5kZXN0cm95KGN0KTsKIAotCXByb3RvID0gX19uZl9jdF9wcm90b19maW5kKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMubDNudW0sIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QucHJvdG9udW0pOwotCWlmIChwcm90byAmJiBwcm90by0+ZGVzdHJveSkKLQkJcHJvdG8tPmRlc3Ryb3koY3QpOworCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmwzbnVtLCBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnByb3RvbnVtKTsKKwlpZiAobDRwcm90byAmJiBsNHByb3RvLT5kZXN0cm95KQorCQlsNHByb3RvLT5kZXN0cm95KGN0KTsKIAogCWlmIChuZl9jb25udHJhY2tfZGVzdHJveWVkKQogCQluZl9jb25udHJhY2tfZGVzdHJveWVkKGN0KTsKQEAgLTYxOCw3ICszODYsNiBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfY29ubnRyYWNrKHR1cGxlKTsKIAotCUFTU0VSVF9SRUFEX0xPQ0soJm5mX2Nvbm50cmFja19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZuZl9jb25udHJhY2tfaGFzaFtoYXNoXSwgbGlzdCkgewogCQlpZiAobmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKSAhPSBpZ25vcmVkX2Nvbm50cmFjayAmJgogCQkgICAgbmZfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkpIHsKQEAgLTYzMCw2ICszOTcsNyBAQAogCiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChfX25mX2Nvbm50cmFja19maW5kKTsKIAogLyogRmluZCBhIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLwogc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKQEAgLTY0Niw2ICs0MTQsNyBAQAogCiAJcmV0dXJuIGg7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZmluZF9nZXQpOwogCiBzdGF0aWMgdm9pZCBfX25mX2Nvbm50cmFja19oYXNoX2luc2VydChzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBoYXNoLApAQCAtNjY5LDYgKzQzOCw3IEBACiAJX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGxfaGFzaCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGFzaF9pbnNlcnQpOwogCiAvKiBDb25maXJtIGEgY29ubmVjdGlvbiBnaXZlbiBza2I7IHBsYWNlcyBpdCBpbiBoYXNoIHRhYmxlICovCiBpbnQKQEAgLTc0Niw2ICs1MTYsNyBAQAogCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCXJldHVybiBORl9EUk9QOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jb25udHJhY2tfY29uZmlybSk7CiAKIC8qIFJldHVybnMgdHJ1ZSBpZiBhIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZ3MgdG8gdGhlIHR1cGxlIChyZXF1aXJlZAogICAgZm9yIE5BVCkuICovCkBAIC03NjEsNiArNTMyLDcgQEAKIAogCXJldHVybiBoICE9IE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfdHVwbGVfdGFrZW4pOwogCiAvKiBUaGVyZSdzIGEgc21hbGwgcmFjZSBoZXJlIHdoZXJlIHdlIG1heSBmcmVlIGEganVzdC1hc3N1cmVkCiAgICBjb25uZWN0aW9uLiAgVG9vIGJhZDogd2UncmUgaW4gdHJvdWJsZSBhbnl3YXkuICovCkBAIC03OTQsNTMgKzU2NiwxMyBAQAogCXJldHVybiBkcm9wcGVkOwogfQogCi1zdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgotX19uZl9jdF9oZWxwZXJfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmhlbHBlcnMsIGxpc3QpIHsKLQkJaWYgKG5mX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaC0+dHVwbGUsICZoLT5tYXNrKSkKLQkJCXJldHVybiBoOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgotbmZfY3RfaGVscGVyX2ZpbmRfZ2V0KCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwotCi0JLyogbmVlZCBuZl9jb25udHJhY2tfbG9jayB0byBhc3N1cmUgdGhhdCBoZWxwZXIgZXhpc3RzIHVudGlsCi0JICogdHJ5X21vZHVsZV9nZXQoKSBpcyBjYWxsZWQgKi8KLQlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCWhlbHBlciA9IF9fbmZfY3RfaGVscGVyX2ZpbmQodHVwbGUpOwotCWlmIChoZWxwZXIpIHsKLQkJLyogbmVlZCB0byBpbmNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnQgdG8gYXNzdXJlIGhlbHBlciB3aWxsCi0JCSAqIG5vdCBnbyBhd2F5IHdoaWxlIHRoZSBjYWxsZXIgaXMgZS5nLiBidXN5IHB1dHRpbmcgYQotCQkgKiBjb25udHJhY2sgaW4gdGhlIGhhc2ggdGhhdCB1c2VzIHRoZSBoZWxwZXIgKi8KLQkJaWYgKCF0cnlfbW9kdWxlX2dldChoZWxwZXItPm1lKSkKLQkJCWhlbHBlciA9IE5VTEw7Ci0JfQotCi0JcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBoZWxwZXI7Ci19Ci0KLXZvaWQgbmZfY3RfaGVscGVyX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKQotewotCW1vZHVsZV9wdXQoaGVscGVyLT5tZSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubiAqCiBfX25mX2Nvbm50cmFja19hbGxvYyhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnLAogCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnJlcGwsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvKQorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bywKKwkJICAgICB1X2ludDMyX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmNvbm50cmFjayA9IE5VTEw7Ci0JdV9pbnQzMl90IGZlYXR1cmVzID0gMDsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwogCiAJaWYgKHVubGlrZWx5KCFuZl9jb25udHJhY2tfaGFzaF9ybmRfaW5pdHRlZCkpIHsKQEAgLTg2NiwxMiArNTk4LDEzIEBACiAJfQogCiAJLyogIGZpbmQgZmVhdHVyZXMgbmVlZGVkIGJ5IHRoaXMgY29ubnRyYWNrLiAqLwotCWZlYXR1cmVzID0gbDNwcm90by0+Z2V0X2ZlYXR1cmVzKG9yaWcpOworCWZlYXR1cmVzIHw9IGwzcHJvdG8tPmdldF9mZWF0dXJlcyhvcmlnKTsKIAogCS8qIEZJWE1FOiBwcm90ZWN0IGhlbHBlciBsaXN0IHBlciBSQ1UgKi8KIAlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAloZWxwZXIgPSBfX25mX2N0X2hlbHBlcl9maW5kKHJlcGwpOwotCWlmIChoZWxwZXIpCisJLyogTkFUIG1pZ2h0IHdhbnQgdG8gYXNzaWduIGEgaGVscGVyIGxhdGVyICovCisJaWYgKGhlbHBlciB8fCBmZWF0dXJlcyAmIE5GX0NUX0ZfTkFUKQogCQlmZWF0dXJlcyB8PSBORl9DVF9GX0hFTFA7CiAJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIApAQCAtODkzLDEyICs2MjYsNiBAQAogCiAJbWVtc2V0KGNvbm50cmFjaywgMCwgbmZfY3RfY2FjaGVbZmVhdHVyZXNdLnNpemUpOwogCWNvbm50cmFjay0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKLQlpZiAoaGVscGVyKSB7Ci0JCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY29ubnRyYWNrKTsKLQkJTkZfQ1RfQVNTRVJUKGhlbHApOwotCQloZWxwLT5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCiAJYXRvbWljX3NldCgmY29ubnRyYWNrLT5jdF9nZW5lcmFsLnVzZSwgMSk7CiAJY29ubnRyYWNrLT5jdF9nZW5lcmFsLmRlc3Ryb3kgPSBkZXN0cm95X2Nvbm50cmFjazsKIAljb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlID0gKm9yaWc7CkBAIC05MjIsOCArNjQ5LDkgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87CiAKIAlsM3Byb3RvID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQob3JpZy0+c3JjLmwzbnVtKTsKLQlyZXR1cm4gX19uZl9jb25udHJhY2tfYWxsb2Mob3JpZywgcmVwbCwgbDNwcm90byk7CisJcmV0dXJuIF9fbmZfY29ubnRyYWNrX2FsbG9jKG9yaWcsIHJlcGwsIGwzcHJvdG8sIDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2FsbG9jKTsKIAogdm9pZCBuZl9jb25udHJhY2tfZnJlZShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrKQogewpAQCAtOTM0LDMyICs2NjIsNDAgQEAKIAlrbWVtX2NhY2hlX2ZyZWUobmZfY3RfY2FjaGVbZmVhdHVyZXNdLmNhY2hlcCwgY29ubnRyYWNrKTsKIAlhdG9taWNfZGVjKCZuZl9jb25udHJhY2tfY291bnQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2ZyZWUpOwogCiAvKiBBbGxvY2F0ZSBhIG5ldyBjb25udHJhY2s6IHdlIHJldHVybiAtRU5PTUVNIGlmIGNsYXNzaWZpY2F0aW9uCiAgICBmYWlsZWQgZHVlIHRvIHN0cmVzcy4gIE90aGVyd2lzZSBpdCByZWFsbHkgaXMgdW5jbGFzc2lmaWFibGUuICovCiBzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKIGluaXRfY29ubnRyYWNrKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCi0JICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvY29sLAorCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8sCiAJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmKQogewogCXN0cnVjdCBuZl9jb25uICpjb25udHJhY2s7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSByZXBsX3R1cGxlOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdV9pbnQzMl90IGZlYXR1cmVzID0gMDsKIAotCWlmICghbmZfY3RfaW52ZXJ0X3R1cGxlKCZyZXBsX3R1cGxlLCB0dXBsZSwgbDNwcm90bywgcHJvdG9jb2wpKSB7CisJaWYgKCFuZl9jdF9pbnZlcnRfdHVwbGUoJnJlcGxfdHVwbGUsIHR1cGxlLCBsM3Byb3RvLCBsNHByb3RvKSkgewogCQlERUJVR1AoIkNhbid0IGludmVydCB0dXBsZS5cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQljb25udHJhY2sgPSBfX25mX2Nvbm50cmFja19hbGxvYyh0dXBsZSwgJnJlcGxfdHVwbGUsIGwzcHJvdG8pOworCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWV4cCA9IF9fbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKHR1cGxlKTsKKwlpZiAoZXhwICYmIGV4cC0+aGVscGVyKQorCQlmZWF0dXJlcyA9IE5GX0NUX0ZfSEVMUDsKKwlyZWFkX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCisJY29ubnRyYWNrID0gX19uZl9jb25udHJhY2tfYWxsb2ModHVwbGUsICZyZXBsX3R1cGxlLCBsM3Byb3RvLCBmZWF0dXJlcyk7CiAJaWYgKGNvbm50cmFjayA9PSBOVUxMIHx8IElTX0VSUihjb25udHJhY2spKSB7CiAJCURFQlVHUCgiQ2FuJ3QgYWxsb2NhdGUgY29ubnRyYWNrLlxuIik7CiAJCXJldHVybiAoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICopY29ubnRyYWNrOwogCX0KIAotCWlmICghcHJvdG9jb2wtPm5ldyhjb25udHJhY2ssIHNrYiwgZGF0YW9mZikpIHsKKwlpZiAoIWw0cHJvdG8tPm5ldyhjb25udHJhY2ssIHNrYiwgZGF0YW9mZikpIHsKIAkJbmZfY29ubnRyYWNrX2ZyZWUoY29ubnRyYWNrKTsKIAkJREVCVUdQKCJpbml0IGNvbm50cmFjazogY2FuJ3QgdHJhY2sgd2l0aCBwcm90byBtb2R1bGVcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTk3NCw2ICs3MTAsOCBAQAogCQkvKiBXZWxjb21lLCBNci4gQm9uZC4gIFdlJ3ZlIGJlZW4gZXhwZWN0aW5nIHlvdS4uLiAqLwogCQlfX3NldF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKTsKIAkJY29ubnRyYWNrLT5tYXN0ZXIgPSBleHAtPm1hc3RlcjsKKwkJaWYgKGV4cC0+aGVscGVyKQorCQkJbmZjdF9oZWxwKGNvbm50cmFjayktPmhlbHBlciA9IGV4cC0+aGVscGVyOwogI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTUFSSwogCQljb25udHJhY2stPm1hcmsgPSBleHAtPm1hc3Rlci0+bWFyazsKICNlbmRpZgpAQCAtOTgyLDggKzcyMCwxMyBAQAogI2VuZGlmCiAJCW5mX2Nvbm50cmFja19nZXQoJmNvbm50cmFjay0+bWFzdGVyLT5jdF9nZW5lcmFsKTsKIAkJTkZfQ1RfU1RBVF9JTkMoZXhwZWN0X25ldyk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjb25udHJhY2spOworCisJCWlmIChoZWxwKQorCQkJaGVscC0+aGVscGVyID0gX19uZl9jdF9oZWxwZXJfZmluZCgmcmVwbF90dXBsZSk7CiAJCU5GX0NUX1NUQVRfSU5DKG5ldyk7CisJfQogCiAJLyogT3ZlcmxvYWQgdHVwbGUgbGlua2VkIGxpc3QgdG8gcHV0IHVzIGluIHVuY29uZmlybWVkIGxpc3QuICovCiAJbGlzdF9hZGQoJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCwgJnVuY29uZmlybWVkKTsKQEAgLTEwMDYsNyArNzQ5LDcgQEAKIAkJICB1X2ludDE2X3QgbDNudW0sCiAJCSAgdV9pbnQ4X3QgcHJvdG9udW0sCiAJCSAgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvLAorCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bywKIAkJICBpbnQgKnNldF9yZXBseSwKIAkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8pCiB7CkBAIC0xMDE2LDcgKzc1OSw3IEBACiAKIAlpZiAoIW5mX2N0X2dldF90dXBsZShza2IsICh1bnNpZ25lZCBpbnQpKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKSwKIAkJCSAgICAgZGF0YW9mZiwgbDNudW0sIHByb3RvbnVtLCAmdHVwbGUsIGwzcHJvdG8sCi0JCQkgICAgIHByb3RvKSkgeworCQkJICAgICBsNHByb3RvKSkgewogCQlERUJVR1AoInJlc29sdmVfbm9ybWFsX2N0OiBDYW4ndCBnZXQgdHVwbGVcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMDI0LDcgKzc2Nyw3IEBACiAJLyogbG9vayBmb3IgdHVwbGUgbWF0Y2ggKi8KIAloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7CiAJaWYgKCFoKSB7Ci0JCWggPSBpbml0X2Nvbm50cmFjaygmdHVwbGUsIGwzcHJvdG8sIHByb3RvLCBza2IsIGRhdGFvZmYpOworCQloID0gaW5pdF9jb25udHJhY2soJnR1cGxlLCBsM3Byb3RvLCBsNHByb3RvLCBza2IsIGRhdGFvZmYpOwogCQlpZiAoIWgpCiAJCQlyZXR1cm4gTlVMTDsKIAkJaWYgKElTX0VSUihoKSkKQEAgLTEwNjIsNyArODA1LDcgQEAKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwotCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOworCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKIAl1bnNpZ25lZCBpbnQgZGF0YW9mZjsKIAl1X2ludDhfdCBwcm90b251bTsKIAlpbnQgc2V0X3JlcGx5ID0gMDsKQEAgLTEwODAsMTkgKzgyMywxOSBAQAogCQlyZXR1cm4gLXJldDsKIAl9CiAKLQlwcm90byA9IF9fbmZfY3RfcHJvdG9fZmluZCgodV9pbnQxNl90KXBmLCBwcm90b251bSk7CisJbDRwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKCh1X2ludDE2X3QpcGYsIHByb3RvbnVtKTsKIAogCS8qIEl0IG1heSBiZSBhbiBzcGVjaWFsIHBhY2tldCwgZXJyb3IsIHVuY2xlYW4uLi4KIAkgKiBpbnZlcnNlIG9mIHRoZSByZXR1cm4gY29kZSB0ZWxscyB0byB0aGUgbmV0ZmlsdGVyCiAJICogY29yZSB3aGF0IHRvIGRvIHdpdGggdGhlIHBhY2tldC4gKi8KLQlpZiAocHJvdG8tPmVycm9yICE9IE5VTEwgJiYKLQkgICAgKHJldCA9IHByb3RvLT5lcnJvcigqcHNrYiwgZGF0YW9mZiwgJmN0aW5mbywgcGYsIGhvb2tudW0pKSA8PSAwKSB7CisJaWYgKGw0cHJvdG8tPmVycm9yICE9IE5VTEwgJiYKKwkgICAgKHJldCA9IGw0cHJvdG8tPmVycm9yKCpwc2tiLCBkYXRhb2ZmLCAmY3RpbmZvLCBwZiwgaG9va251bSkpIDw9IDApIHsKIAkJTkZfQ1RfU1RBVF9JTkMoZXJyb3IpOwogCQlORl9DVF9TVEFUX0lOQyhpbnZhbGlkKTsKIAkJcmV0dXJuIC1yZXQ7CiAJfQogCi0JY3QgPSByZXNvbHZlX25vcm1hbF9jdCgqcHNrYiwgZGF0YW9mZiwgcGYsIHByb3RvbnVtLCBsM3Byb3RvLCBwcm90bywKKwljdCA9IHJlc29sdmVfbm9ybWFsX2N0KCpwc2tiLCBkYXRhb2ZmLCBwZiwgcHJvdG9udW0sIGwzcHJvdG8sIGw0cHJvdG8sCiAJCQkgICAgICAgJnNldF9yZXBseSwgJmN0aW5mbyk7CiAJaWYgKCFjdCkgewogCQkvKiBOb3QgdmFsaWQgcGFydCBvZiBhIGNvbm5lY3Rpb24gKi8KQEAgLTExMDgsNyArODUxLDcgQEAKIAogCU5GX0NUX0FTU0VSVCgoKnBza2IpLT5uZmN0KTsKIAotCXJldCA9IHByb3RvLT5wYWNrZXQoY3QsICpwc2tiLCBkYXRhb2ZmLCBjdGluZm8sIHBmLCBob29rbnVtKTsKKwlyZXQgPSBsNHByb3RvLT5wYWNrZXQoY3QsICpwc2tiLCBkYXRhb2ZmLCBjdGluZm8sIHBmLCBob29rbnVtKTsKIAlpZiAocmV0IDwgMCkgewogCQkvKiBJbnZhbGlkOiBpbnZlcnNlIG9mIHRoZSByZXR1cm4gY29kZSB0ZWxscwogCQkgKiB0aGUgbmV0ZmlsdGVyIGNvcmUgd2hhdCB0byBkbyAqLwpAQCAtMTEyNCwyNTUgKzg2NywzOCBAQAogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19pbik7CiAKIGludCBuZl9jdF9pbnZlcnRfdHVwbGVwcihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAogCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcpCiB7CiAJcmV0dXJuIG5mX2N0X2ludmVydF90dXBsZShpbnZlcnNlLCBvcmlnLAogCQkJCSAgX19uZl9jdF9sM3Byb3RvX2ZpbmQob3JpZy0+c3JjLmwzbnVtKSwKLQkJCQkgIF9fbmZfY3RfcHJvdG9fZmluZChvcmlnLT5zcmMubDNudW0sCisJCQkJICBfX25mX2N0X2w0cHJvdG9fZmluZChvcmlnLT5zcmMubDNudW0sCiAJCQkJCQkgICAgIG9yaWctPmRzdC5wcm90b251bSkpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfaW52ZXJ0X3R1cGxlcHIpOwogCi0vKiBXb3VsZCB0d28gZXhwZWN0ZWQgdGhpbmdzIGNsYXNoPyAqLwotc3RhdGljIGlubGluZSBpbnQgZXhwZWN0X2NsYXNoKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICphLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpiKQorLyogQWx0ZXIgcmVwbHkgdHVwbGUgKG1heWJlIGFsdGVyIGhlbHBlcikuICBUaGlzIGlzIGZvciBOQVQsIGFuZCBpcworICAgaW1wbGljaXRseSByYWN5OiBzZWUgX19uZl9jb25udHJhY2tfY29uZmlybSAqLwordm9pZCBuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqbmV3cmVwbHkpCiB7Ci0JLyogUGFydCBjb3ZlcmVkIGJ5IGludGVyc2VjdGlvbiBvZiBtYXNrcyBtdXN0IGJlIHVuZXF1YWwsCi0JICAgb3RoZXJ3aXNlIHRoZXkgY2xhc2ggKi8KLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIGludGVyc2VjdF9tYXNrOwotCWludCBjb3VudDsKLQotCWludGVyc2VjdF9tYXNrLnNyYy5sM251bSA9IGEtPm1hc2suc3JjLmwzbnVtICYgYi0+bWFzay5zcmMubDNudW07Ci0JaW50ZXJzZWN0X21hc2suc3JjLnUuYWxsID0gYS0+bWFzay5zcmMudS5hbGwgJiBiLT5tYXNrLnNyYy51LmFsbDsKLQlpbnRlcnNlY3RfbWFzay5kc3QudS5hbGwgPSBhLT5tYXNrLmRzdC51LmFsbCAmIGItPm1hc2suZHN0LnUuYWxsOwotCWludGVyc2VjdF9tYXNrLmRzdC5wcm90b251bSA9IGEtPm1hc2suZHN0LnByb3RvbnVtCi0JCQkJCSYgYi0+bWFzay5kc3QucHJvdG9udW07Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBORl9DVF9UVVBMRV9MM1NJWkU7IGNvdW50KyspewotCQlpbnRlcnNlY3RfbWFzay5zcmMudTMuYWxsW2NvdW50XSA9Ci0JCQlhLT5tYXNrLnNyYy51My5hbGxbY291bnRdICYgYi0+bWFzay5zcmMudTMuYWxsW2NvdW50XTsKLQl9Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBORl9DVF9UVVBMRV9MM1NJWkU7IGNvdW50KyspewotCQlpbnRlcnNlY3RfbWFzay5kc3QudTMuYWxsW2NvdW50XSA9Ci0JCQlhLT5tYXNrLmRzdC51My5hbGxbY291bnRdICYgYi0+bWFzay5kc3QudTMuYWxsW2NvdW50XTsKLQl9Ci0KLQlyZXR1cm4gbmZfY3RfdHVwbGVfbWFza19jbXAoJmEtPnR1cGxlLCAmYi0+dHVwbGUsICZpbnRlcnNlY3RfbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9tYXRjaGVzKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICphLAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYikKLXsKLQlyZXR1cm4gYS0+bWFzdGVyID09IGItPm1hc3RlcgotCQkmJiBuZl9jdF90dXBsZV9lcXVhbCgmYS0+dHVwbGUsICZiLT50dXBsZSkKLQkJJiYgbmZfY3RfdHVwbGVfZXF1YWwoJmEtPm1hc2ssICZiLT5tYXNrKTsKLX0KLQotLyogR2VuZXJhbGx5IGEgYmFkIGlkZWEgdG8gY2FsbCB0aGlzOiBjb3VsZCBoYXZlIG1hdGNoZWQgYWxyZWFkeS4gKi8KLXZvaWQgbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKLQotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkvKiBjaG9vc2UgdGhlIHRoZSBvbGRlc3QgZXhwZWN0YXRpb24gdG8gZXZpY3QgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaSwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoZXhwZWN0X21hdGNoZXMoaSwgZXhwKSAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQluZl9jdF91bmxpbmtfZXhwZWN0KGkpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLX0KLQotLyogV2UgZG9uJ3QgaW5jcmVhc2UgdGhlIG1hc3RlciBjb25udHJhY2sgcmVmY291bnQgZm9yIG5vbi1mdWxmaWxsZWQKLSAqIGNvbm50cmFja3MuIER1cmluZyB0aGUgY29ubnRyYWNrIGRlc3RydWN0aW9uLCB0aGUgZXhwZWN0YXRpb25zIGFyZQotICogYWx3YXlzIGtpbGxlZCBiZWZvcmUgdGhlIGNvbm50cmFjayBpdHNlbGYgKi8KLXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKHN0cnVjdCBuZl9jb25uICptZSkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqbmV3OwotCi0JbmV3ID0ga21lbV9jYWNoZV9hbGxvYyhuZl9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFuZXcpIHsKLQkJREVCVUdQKCJleHBlY3RfcmVsYXRlZDogT09NIGFsbG9jYXRpbmcgZXhwZWN0XG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5ldy0+bWFzdGVyID0gbWU7Ci0JYXRvbWljX3NldCgmbmV3LT51c2UsIDEpOwotCXJldHVybiBuZXc7Ci19Ci0KLXZvaWQgbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZXhwLT51c2UpKQotCQlrbWVtX2NhY2hlX2ZyZWUobmZfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIGV4cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfaW5zZXJ0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOwotCi0JYXRvbWljX2luYygmZXhwLT51c2UpOwotCW1hc3Rlcl9oZWxwLT5leHBlY3RpbmcrKzsKLQlsaXN0X2FkZCgmZXhwLT5saXN0LCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKLQotCWluaXRfdGltZXIoJmV4cC0+dGltZW91dCk7Ci0JZXhwLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylleHA7Ci0JZXhwLT50aW1lb3V0LmZ1bmN0aW9uID0gZXhwZWN0YXRpb25fdGltZWRfb3V0OwotCWV4cC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIG1hc3Rlcl9oZWxwLT5oZWxwZXItPnRpbWVvdXQgKiBIWjsKLQlhZGRfdGltZXIoJmV4cC0+dGltZW91dCk7Ci0KLQlleHAtPmlkID0gKytuZl9jb25udHJhY2tfZXhwZWN0X25leHRfaWQ7Ci0JYXRvbWljX2luYygmZXhwLT51c2UpOwotCU5GX0NUX1NUQVRfSU5DKGV4cGVjdF9jcmVhdGUpOwotfQotCi0vKiBSYWNlIHdpdGggZXhwZWN0YXRpb25zIGJlaW5nIHVzZWQgbWVhbnMgd2UgY291bGQgaGF2ZSBub25lIHRvIGZpbmQ7IE9LLiAqLwotc3RhdGljIHZvaWQgZXZpY3Rfb2xkZXN0X2V4cGVjdChzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGktPm1hc3RlciA9PSBtYXN0ZXIpIHsKLQkJCWlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQkJbmZfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludCByZWZyZXNoX3RpbWVyKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppKQotewotCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGktPm1hc3Rlcik7Ci0KLQlpZiAoIWRlbF90aW1lcigmaS0+dGltZW91dCkpCi0JCXJldHVybiAwOwotCi0JaS0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIG1hc3Rlcl9oZWxwLT5oZWxwZXItPnRpbWVvdXQqSFo7Ci0JYWRkX3RpbWVyKCZpLT50aW1lb3V0KTsKLQlyZXR1cm4gMTsKLX0KLQotaW50IG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwotCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBleHBlY3QtPm1hc3RlcjsKLQlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChtYXN0ZXIpOwotCWludCByZXQ7Ci0KLQlORl9DVF9BU1NFUlQobWFzdGVyX2hlbHApOwotCi0JREVCVUdQKCJuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQgJXBcbiIsIHJlbGF0ZWRfdG8pOwotCURFQlVHUCgidHVwbGU6ICIpOyBORl9DVF9EVU1QX1RVUExFKCZleHBlY3QtPnR1cGxlKTsKLQlERUJVR1AoIm1hc2s6ICAiKTsgTkZfQ1RfRFVNUF9UVVBMRSgmZXhwZWN0LT5tYXNrKTsKLQotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGV4cGVjdF9tYXRjaGVzKGksIGV4cGVjdCkpIHsKLQkJCS8qIFJlZnJlc2ggdGltZXI6IGlmIGl0J3MgZHlpbmcsIGlnbm9yZS4uICovCi0JCQlpZiAocmVmcmVzaF90aW1lcihpKSkgewotCQkJCXJldCA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZXhwZWN0X2NsYXNoKGksIGV4cGVjdCkpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCS8qIFdpbGwgYmUgb3ZlciBsaW1pdD8gKi8KLQlpZiAobWFzdGVyX2hlbHAtPmhlbHBlci0+bWF4X2V4cGVjdGVkICYmCi0JICAgIG1hc3Rlcl9oZWxwLT5leHBlY3RpbmcgPj0gbWFzdGVyX2hlbHAtPmhlbHBlci0+bWF4X2V4cGVjdGVkKQotCQlldmljdF9vbGRlc3RfZXhwZWN0KG1hc3Rlcik7Ci0KLQluZl9jb25udHJhY2tfZXhwZWN0X2luc2VydChleHBlY3QpOwotCW5mX2Nvbm50cmFja19leHBlY3RfZXZlbnQoSVBFWFBfTkVXLCBleHBlY3QpOwotCXJldCA9IDA7Ci1vdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lKQotewotCWludCByZXQ7Ci0JQlVHX09OKG1lLT50aW1lb3V0ID09IDApOwotCi0JcmV0ID0gbmZfY29ubnRyYWNrX3JlZ2lzdGVyX2NhY2hlKE5GX0NUX0ZfSEVMUCwgIm5mX2Nvbm50cmFjazpoZWxwIiwKLQkJCQkJICBzaXplb2Yoc3RydWN0IG5mX2Nvbm4pCi0JCQkJCSAgKyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5faGVscCkKLQkJCQkJICArIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jb25uX2hlbHApKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm5mX2Nvbm50cmFja19oZWxwZXJfcmVpZ3N0ZXI6IFVuYWJsZSB0byBjcmVhdGUgc2xhYiBjYWNoZSBmb3IgY29ubnRyYWNrc1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlsaXN0X2FkZCgmbWUtPmxpc3QsICZoZWxwZXJzKTsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqCi1fX25mX2Nvbm50cmFja19oZWxwZXJfZmluZF9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmhlbHBlcnMsIGxpc3QpIHsKLQkJaWYgKCFzdHJjbXAoaC0+bmFtZSwgbmFtZSkpCi0JCQlyZXR1cm4gaDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVuaGVscChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmksCi0JCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICptZSkKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGkpOwogCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCi0JaWYgKGhlbHAgJiYgaGVscC0+aGVscGVyID09IG1lKSB7Ci0JCW5mX2Nvbm50cmFja19ldmVudChJUENUX0hFTFBFUiwgY3QpOwotCQloZWxwLT5oZWxwZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lKQotewotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCAqdG1wOwotCi0JLyogTmVlZCB3cml0ZSBsb2NrIGhlcmUsIHRvIGRlbGV0ZSBoZWxwZXIuICovCiAJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCWxpc3RfZGVsKCZtZS0+bGlzdCk7CisJLyogU2hvdWxkIGJlIHVuY29uZmlybWVkLCBzbyBub3QgaW4gaGFzaCB0YWJsZSB5ZXQgKi8KKwlORl9DVF9BU1NFUlQoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpOwogCi0JLyogR2V0IHJpZCBvZiBleHBlY3RhdGlvbnMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXhwLCB0bXAsICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChleHAtPm1hc3Rlcik7Ci0JCWlmIChoZWxwLT5oZWxwZXIgPT0gbWUgJiYgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7Ci0JCQluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0JCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQl9Ci0JfQorCURFQlVHUCgiQWx0ZXJpbmcgcmVwbHkgdHVwbGUgb2YgJXAgdG8gIiwgY3QpOworCU5GX0NUX0RVTVBfVFVQTEUobmV3cmVwbHkpOwogCi0JLyogR2V0IHJpZCBvZiBleHBlY3RlZHMsIHNldCBoZWxwZXJzIHRvIE5VTEwuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmdW5jb25maXJtZWQsIGxpc3QpCi0JCXVuaGVscChoLCBtZSk7Ci0JZm9yIChpID0gMDsgaSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJm5mX2Nvbm50cmFja19oYXNoW2ldLCBsaXN0KQotCQkJdW5oZWxwKGgsIG1lKTsKLQl9CisJY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlID0gKm5ld3JlcGx5OworCWlmICghY3QtPm1hc3RlciAmJiBoZWxwICYmIGhlbHAtPmV4cGVjdGluZyA9PSAwKQorCQloZWxwLT5oZWxwZXIgPSBfX25mX2N0X2hlbHBlcl9maW5kKG5ld3JlcGx5KTsKIAl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCS8qIFNvbWVvbmUgY291bGQgYmUgc3RpbGwgbG9va2luZyBhdCB0aGUgaGVscGVyIGluIGEgYmguICovCi0Jc3luY2hyb25pemVfbmV0KCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwogCiAvKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgYW5kIGRvIGFjY291bnRpbmcgaWYgZG9fYWNjdCBpcyAxICovCiB2b2lkIF9fbmZfY3RfcmVmcmVzaF9hY2N0KHN0cnVjdCBuZl9jb25uICpjdCwKQEAgLTEzOTksOSArOTI1LDE0IEBACiAJCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBleHRyYV9qaWZmaWVzOwogCQlldmVudCA9IElQQ1RfUkVGUkVTSDsKIAl9IGVsc2UgewotCQkvKiBOZWVkIGRlbF90aW1lciBmb3IgcmFjZSBhdm9pZGFuY2UgKG1heSBhbHJlYWR5IGJlIGR5aW5nKS4gKi8KLQkJaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7Ci0JCQljdC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGV4dHJhX2ppZmZpZXM7CisJCXVuc2lnbmVkIGxvbmcgbmV3dGltZSA9IGppZmZpZXMgKyBleHRyYV9qaWZmaWVzOworCisJCS8qIE9ubHkgdXBkYXRlIHRoZSB0aW1lb3V0IGlmIHRoZSBuZXcgdGltZW91dCBpcyBhdCBsZWFzdAorCQkgICBIWiBqaWZmaWVzIGZyb20gdGhlIG9sZCB0aW1lb3V0LiBOZWVkIGRlbF90aW1lciBmb3IgcmFjZQorCQkgICBhdm9pZGFuY2UgKG1heSBhbHJlYWR5IGJlIGR5aW5nKS4gKi8KKwkJaWYgKG5ld3RpbWUgLSBjdC0+dGltZW91dC5leHBpcmVzID49IEhaCisJCSAgICAmJiBkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgeworCQkJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IG5ld3RpbWU7CiAJCQlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKIAkJCWV2ZW50ID0gSVBDVF9SRUZSRVNIOwogCQl9CkBAIC0xNDEyLDkgKzk0MywxMCBAQAogCQljdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKys7CiAJCWN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICs9CiAJCQlza2ItPmxlbiAtICh1bnNpZ25lZCBpbnQpKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKLQlpZiAoKGN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLnBhY2tldHMgJiAweDgwMDAwMDAwKQotCSAgICB8fCAoY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMgJiAweDgwMDAwMDAwKSkKLQkJZXZlbnQgfD0gSVBDVF9DT1VOVEVSX0ZJTExJTkc7CisKKwkJaWYgKChjdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzICYgMHg4MDAwMDAwMCkKKwkJICAgIHx8IChjdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyAmIDB4ODAwMDAwMDApKQorCQkJZXZlbnQgfD0gSVBDVF9DT1VOVEVSX0ZJTExJTkc7CiAJfQogI2VuZGlmCiAKQEAgLTE0MjQsNiArOTU2LDcgQEAKIAlpZiAoZXZlbnQpCiAJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShldmVudCwgc2tiKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY3RfcmVmcmVzaF9hY2N0KTsKIAogI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKQEAgLTE0NDgsNiArOTgxLDcgQEAKIG5mYXR0cl9mYWlsdXJlOgogCXJldHVybiAtMTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyKTsKIAogc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX3Byb3RvW0NUQV9QUk9UT19NQVhdID0gewogCVtDVEFfUFJPVE9fU1JDX1BPUlQtMV0gID0gc2l6ZW9mKHVfaW50MTZfdCksCkBAIC0xNDYzLDEzICs5OTcsMTIgQEAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9fTUFYLCBjdGFfbWluX3Byb3RvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0LT5zcmMudS50Y3AucG9ydCA9Ci0JCSoodV9pbnQxNl90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX1NSQ19QT1JULTFdKTsKLQl0LT5kc3QudS50Y3AucG9ydCA9Ci0JCSoodV9pbnQxNl90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0RTVF9QT1JULTFdKTsKKwl0LT5zcmMudS50Y3AucG9ydCA9ICooX19iZTE2ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX1NSQ19QT1JULTFdKTsKKwl0LT5kc3QudS50Y3AucG9ydCA9ICooX19iZTE2ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0RTVF9QT1JULTFdKTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUpOwogI2VuZGlmCiAKIC8qIFVzZWQgYnkgaXB0X1JFSkVDVCBhbmQgaXA2dF9SRUpFQ1QuICovCkBAIC0xNDkwLDYgKzEwMjMsNyBAQAogCW5za2ItPm5mY3RpbmZvID0gY3RpbmZvOwogCW5mX2Nvbm50cmFja19nZXQobnNrYi0+bmZjdCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChfX25mX2Nvbm50cmFja19hdHRhY2gpOwogCiBzdGF0aWMgaW5saW5lIGludAogZG9faXRlcihjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmksCkBAIC0xNTQzLDYgKzEwNzcsNyBAQAogCQluZl9jdF9wdXQoY3QpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2l0ZXJhdGVfY2xlYW51cCk7CiAKIHN0YXRpYyBpbnQga2lsbF9hbGwoc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmRhdGEpCiB7CkBAIC0xNTYyLDYgKzEwOTcsNyBAQAogewogCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2FsbCwgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZmx1c2gpOwogCiAvKiBNaXNoZWFyaW5nIHRoZSB2b2ljZXMgaW4gaGlzIGhlYWQsIG91ciBoZXJvIHdvbmRlcnMgaG93IGhlJ3MKICAgIHN1cHBvc2VkIHRvIGtpbGwgdGhlIG1hbGwuICovCkBAIC0xNTk5LDYgKzExMzUsOCBAQAogCWZyZWVfY29ubnRyYWNrX2hhc2gobmZfY29ubnRyYWNrX2hhc2gsIG5mX2Nvbm50cmFja192bWFsbG9jLAogCQkJICAgIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CiAKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKTsKKwogCS8qIGZyZWUgbDNwcm90byBwcm90b2NvbCB0YWJsZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgUEZfTUFYOyBpKyspCiAJCWlmIChuZl9jdF9wcm90b3NbaV0pIHsKQEAgLTE3MjQsMTAgKzEyNjIsMTQgQEAKIAkJZ290byBlcnJfZnJlZV9jb25udHJhY2tfc2xhYjsKIAl9CiAKKwlyZXQgPSBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2ZyZWVfZXhwZWN0X3NsYWI7CisKIAkvKiBEb24ndCBORUVEIGxvY2sgaGVyZSwgYnV0IGdvb2QgZm9ybSBhbnl3YXkuICovCiAJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUEZfTUFYOyBpKyspCi0JCW5mX2N0X2wzcHJvdG9zW2ldID0gJm5mX2Nvbm50cmFja19nZW5lcmljX2wzcHJvdG87CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBRl9NQVg7IGkrKykKKwkJbmZfY3RfbDNwcm90b3NbaV0gPSAmbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYzsKICAgICAgICAgd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAKIAkvKiBGb3IgdXNlIGJ5IFJFSkVDVCB0YXJnZXQgKi8KQEAgLTE3NDEsNiArMTI4Myw4IEBACiAKIAlyZXR1cm4gcmV0OwogCitvdXRfZnJlZV9leHBlY3Rfc2xhYjoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXApOwogZXJyX2ZyZWVfY29ubnRyYWNrX3NsYWI6CiAJbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfY2FjaGUoTkZfQ1RfRl9CQVNJQyk7CiBlcnJfZnJlZV9oYXNoOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTIyM2UwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMKQEAgLTAsMCArMSw5MyBAQAorLyogRXZlbnQgY2FjaGUgZm9yIG5ldGZpbHRlci4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICogKEMpIDIwMDMsMjAwNCBVU0FHSS9XSURFIFByb2plY3QgPGh0dHA6Ly93d3cubGludXgtaXB2Ni5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorCitBVE9NSUNfTk9USUZJRVJfSEVBRChuZl9jb25udHJhY2tfY2hhaW4pOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2NoYWluKTsKKworQVRPTUlDX05PVElGSUVSX0hFQUQobmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbik7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluKTsKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUsIG5mX2Nvbm50cmFja19lY2FjaGUpOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZWNhY2hlKTsKKworLyogZGVsaXZlciBjYWNoZWQgZXZlbnRzIGFuZCBjbGVhciBjYWNoZSBlbnRyeSAtIG11c3QgYmUgY2FsbGVkIHdpdGggbG9jYWxseQorICogZGlzYWJsZWQgc29mdGlycXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19uZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZSkKK3sKKwlpZiAobmZfY3RfaXNfY29uZmlybWVkKGVjYWNoZS0+Y3QpICYmICFuZl9jdF9pc19keWluZyhlY2FjaGUtPmN0KQorCSAgICAmJiBlY2FjaGUtPmV2ZW50cykKKwkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2Nvbm50cmFja19jaGFpbiwgZWNhY2hlLT5ldmVudHMsCisJCQkJICAgIGVjYWNoZS0+Y3QpOworCisJZWNhY2hlLT5ldmVudHMgPSAwOworCW5mX2N0X3B1dChlY2FjaGUtPmN0KTsKKwllY2FjaGUtPmN0ID0gTlVMTDsKK30KKworLyogRGVsaXZlciBhbGwgY2FjaGVkIGV2ZW50cyBmb3IgYSBwYXJ0aWN1bGFyIGNvbm50cmFjay4gVGhpcyBpcyBjYWxsZWQKKyAqIGJ5IGNvZGUgcHJpb3IgdG8gYXN5bmMgcGFja2V0IGhhbmRsaW5nIGZvciBmcmVlaW5nIHRoZSBza2IgKi8KK3ZvaWQgbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKG5mX2Nvbm50cmFja19lY2FjaGUpOworCWlmIChlY2FjaGUtPmN0ID09IGN0KQorCQlfX25mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhlY2FjaGUpOworCWxvY2FsX2JoX2VuYWJsZSgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKTsKKworLyogRGVsaXZlciBjYWNoZWQgZXZlbnRzIGZvciBvbGQgcGVuZGluZyBldmVudHMsIGlmIGN1cnJlbnQgY29ubnRyYWNrICE9IG9sZCAqLwordm9pZCBfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQoc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7CisKKwkvKiB0YWtlIGNhcmUgb2YgZGVsaXZlcmluZyBwb3RlbnRpYWxseSBvbGQgZXZlbnRzICovCisJZWNhY2hlID0gJl9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSk7CisJQlVHX09OKGVjYWNoZS0+Y3QgPT0gY3QpOworCWlmIChlY2FjaGUtPmN0KQorCQlfX25mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhlY2FjaGUpOworCS8qIGluaXRpYWxpemUgZm9yIHRoaXMgY29ubnRyYWNrL3BhY2tldCAqLworCWVjYWNoZS0+Y3QgPSBjdDsKKwluZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQpOworCisvKiBmbHVzaCB0aGUgZXZlbnQgY2FjaGUgLSB0b3VjaGVzIG90aGVyIENQVSdzIGRhdGEgYW5kIG11c3Qgbm90IGJlIGNhbGxlZAorICogd2hpbGUgcGFja2V0cyBhcmUgc3RpbGwgcGFzc2luZyB0aHJvdWdoIHRoZSBjb2RlICovCit2b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHZvaWQpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQllY2FjaGUgPSAmcGVyX2NwdShuZl9jb25udHJhY2tfZWNhY2hlLCBjcHUpOworCQlpZiAoZWNhY2hlLT5jdCkKKwkJCW5mX2N0X3B1dChlY2FjaGUtPmN0KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4ZDM3OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCkBAIC0wLDAgKzEsNDQyIEBACisvKiBFeHBlY3RhdGlvbiBoYW5kbGluZyBmb3IgbmZfY29ubnRyYWNrLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKiAoQykgMjAwMywyMDA0IFVTQUdJL1dJREUgUHJvamVjdCA8aHR0cDovL3d3dy5saW51eC1pcHY2Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmg+CisKK0xJU1RfSEVBRChuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QpOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKKwora21lbV9jYWNoZV90ICpuZl9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfZXhwZWN0X25leHRfaWQ7CisKKy8qIG5mX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLwordm9pZCBuZl9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOworCisJTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKKwlORl9DVF9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOworCisJbGlzdF9kZWwoJmV4cC0+bGlzdCk7CisJTkZfQ1RfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7CisJbWFzdGVyX2hlbHAtPmV4cGVjdGluZy0tOworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF91bmxpbmtfZXhwZWN0KTsKKworc3RhdGljIHZvaWQgZXhwZWN0YXRpb25fdGltZWRfb3V0KHVuc2lnbmVkIGxvbmcgdWxfZXhwZWN0KQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAgPSAodm9pZCAqKXVsX2V4cGVjdDsKKworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKK30KKworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKG5mX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKKworLyogSnVzdCBmaW5kIGEgZXhwZWN0YXRpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKKworCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWkgPSBfX25mX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7CisJaWYgKGkpCisJCWF0b21pY19pbmMoJmktPnVzZSk7CisJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCXJldHVybiBpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCk7CisKKy8qIElmIGFuIGV4cGVjdGF0aW9uIGZvciB0aGlzIGNvbm5lY3Rpb24gaXMgZm91bmQsIGl0IGdldHMgZGVsZXRlIGZyb20KKyAqIGdsb2JhbCBsaXN0IHRoZW4gcmV0dXJuZWQuICovCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCitmaW5kX2V4cGVjdGF0aW9uKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CisJLyogSWYgbWFzdGVyIGlzIG5vdCBpbiBoYXNoIHRhYmxlIHlldCAoaWUuIHBhY2tldCBoYXNuJ3QgbGVmdAorCSAgIHRoaXMgbWFjaGluZSB5ZXQpLCBob3cgY2FuIG90aGVyIGVuZCBrbm93IGFib3V0IGV4cGVjdGVkPworCSAgIEhlbmNlIHRoZXNlIGFyZSBub3QgdGhlIGRyb2lkcyB5b3UgYXJlIGxvb2tpbmcgZm9yIChpZgorCSAgIG1hc3RlciBjdCBuZXZlciBnb3QgY29uZmlybWVkLCB3ZSdkIGhvbGQgYSByZWZlcmVuY2UgdG8gaXQKKwkgICBhbmQgd2VpcmQgdGhpbmdzIHdvdWxkIGhhcHBlbiB0byBmdXR1cmUgcGFja2V0cykuICovCisJCWlmIChuZl9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykKKwkJICAgICYmIG5mX2N0X2lzX2NvbmZpcm1lZChpLT5tYXN0ZXIpKSB7CisJCQlpZiAoaS0+ZmxhZ3MgJiBORl9DVF9FWFBFQ1RfUEVSTUFORU5UKSB7CisJCQkJYXRvbWljX2luYygmaS0+dXNlKTsKKwkJCQlyZXR1cm4gaTsKKwkJCX0gZWxzZSBpZiAoZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgeworCQkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGRlbGV0ZSBhbGwgZXhwZWN0YXRpb25zIGZvciB0aGlzIGNvbm50cmFjayAqLwordm9pZCBuZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaSwgKnRtcDsKKwlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKKworCS8qIE9wdGltaXphdGlvbjogbW9zdCBjb25uZWN0aW9uIG5ldmVyIGV4cGVjdCBhbnkgb3RoZXJzLiAqLworCWlmICghaGVscCB8fCBoZWxwLT5leHBlY3RpbmcgPT0gMCkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgeworCQlpZiAoaS0+bWFzdGVyID09IGN0ICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKKwkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKKyAJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKTsKKworLyogV291bGQgdHdvIGV4cGVjdGVkIHRoaW5ncyBjbGFzaD8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9jbGFzaChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYikKK3sKKwkvKiBQYXJ0IGNvdmVyZWQgYnkgaW50ZXJzZWN0aW9uIG9mIG1hc2tzIG11c3QgYmUgdW5lcXVhbCwKKwkgICBvdGhlcndpc2UgdGhleSBjbGFzaCAqLworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgaW50ZXJzZWN0X21hc2s7CisJaW50IGNvdW50OworCisJaW50ZXJzZWN0X21hc2suc3JjLmwzbnVtID0gYS0+bWFzay5zcmMubDNudW0gJiBiLT5tYXNrLnNyYy5sM251bTsKKwlpbnRlcnNlY3RfbWFzay5zcmMudS5hbGwgPSBhLT5tYXNrLnNyYy51LmFsbCAmIGItPm1hc2suc3JjLnUuYWxsOworCWludGVyc2VjdF9tYXNrLmRzdC51LmFsbCA9IGEtPm1hc2suZHN0LnUuYWxsICYgYi0+bWFzay5kc3QudS5hbGw7CisJaW50ZXJzZWN0X21hc2suZHN0LnByb3RvbnVtID0gYS0+bWFzay5kc3QucHJvdG9udW0KKwkJCQkJJiBiLT5tYXNrLmRzdC5wcm90b251bTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5GX0NUX1RVUExFX0wzU0laRTsgY291bnQrKyl7CisJCWludGVyc2VjdF9tYXNrLnNyYy51My5hbGxbY291bnRdID0KKwkJCWEtPm1hc2suc3JjLnUzLmFsbFtjb3VudF0gJiBiLT5tYXNrLnNyYy51My5hbGxbY291bnRdOworCX0KKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5GX0NUX1RVUExFX0wzU0laRTsgY291bnQrKyl7CisJCWludGVyc2VjdF9tYXNrLmRzdC51My5hbGxbY291bnRdID0KKwkJCWEtPm1hc2suZHN0LnUzLmFsbFtjb3VudF0gJiBiLT5tYXNrLmRzdC51My5hbGxbY291bnRdOworCX0KKworCXJldHVybiBuZl9jdF90dXBsZV9tYXNrX2NtcCgmYS0+dHVwbGUsICZiLT50dXBsZSwgJmludGVyc2VjdF9tYXNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXhwZWN0X21hdGNoZXMoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmEsCisJCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpiKQoreworCXJldHVybiBhLT5tYXN0ZXIgPT0gYi0+bWFzdGVyCisJCSYmIG5mX2N0X3R1cGxlX2VxdWFsKCZhLT50dXBsZSwgJmItPnR1cGxlKQorCQkmJiBuZl9jdF90dXBsZV9lcXVhbCgmYS0+bWFzaywgJmItPm1hc2spOworfQorCisvKiBHZW5lcmFsbHkgYSBiYWQgaWRlYSB0byBjYWxsIHRoaXM6IGNvdWxkIGhhdmUgbWF0Y2hlZCBhbHJlYWR5LiAqLwordm9pZCBuZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOworCisJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCS8qIGNob29zZSB0aGUgdGhlIG9sZGVzdCBleHBlY3RhdGlvbiB0byBldmljdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CisJCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHApICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKKwkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7CisJCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQpOworCisvKiBXZSBkb24ndCBpbmNyZWFzZSB0aGUgbWFzdGVyIGNvbm50cmFjayByZWZjb3VudCBmb3Igbm9uLWZ1bGZpbGxlZAorICogY29ubnRyYWNrcy4gRHVyaW5nIHRoZSBjb25udHJhY2sgZGVzdHJ1Y3Rpb24sIHRoZSBleHBlY3RhdGlvbnMgYXJlCisgKiBhbHdheXMga2lsbGVkIGJlZm9yZSB0aGUgY29ubnRyYWNrIGl0c2VsZiAqLworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKm5mX2Nvbm50cmFja19leHBlY3RfYWxsb2Moc3RydWN0IG5mX2Nvbm4gKm1lKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpuZXc7CisKKwluZXcgPSBrbWVtX2NhY2hlX2FsbG9jKG5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIE5VTEw7CisKKwluZXctPm1hc3RlciA9IG1lOworCWF0b21pY19zZXQoJm5ldy0+dXNlLCAxKTsKKwlyZXR1cm4gbmV3OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyk7CisKK3ZvaWQgbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAsIGludCBmYW1pbHksCisJCQkgICAgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqc2FkZHIsCisJCQkgICAgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqZGFkZHIsCisJCQkgICAgICB1X2ludDhfdCBwcm90bywgX19iZTE2ICpzcmMsIF9fYmUxNiAqZHN0KQoreworCWludCBsZW47CisKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQpCisJCWxlbiA9IDQ7CisJZWxzZQorCQlsZW4gPSAxNjsKKworCWV4cC0+ZmxhZ3MgPSAwOworCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOworCWV4cC0+aGVscGVyID0gTlVMTDsKKwlleHAtPnR1cGxlLnNyYy5sM251bSA9IGZhbWlseTsKKwlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IHByb3RvOworCWV4cC0+bWFzay5zcmMubDNudW0gPSAweEZGRkY7CisJZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisKKwlpZiAoc2FkZHIpIHsKKwkJbWVtY3B5KCZleHAtPnR1cGxlLnNyYy51Mywgc2FkZHIsIGxlbik7CisJCWlmIChzaXplb2YoZXhwLT50dXBsZS5zcmMudTMpID4gbGVuKQorCQkJLyogYWRkcmVzcyBuZWVkcyB0byBiZSBjbGVhcmVkIGZvciBuZl9jdF90dXBsZV9lcXVhbCAqLworCQkJbWVtc2V0KCh2b2lkICopJmV4cC0+dHVwbGUuc3JjLnUzICsgbGVuLCAweDAwLAorCQkJICAgICAgIHNpemVvZihleHAtPnR1cGxlLnNyYy51MykgLSBsZW4pOworCQltZW1zZXQoJmV4cC0+bWFzay5zcmMudTMsIDB4RkYsIGxlbik7CisJCWlmIChzaXplb2YoZXhwLT5tYXNrLnNyYy51MykgPiBsZW4pCisJCQltZW1zZXQoKHZvaWQgKikmZXhwLT5tYXNrLnNyYy51MyArIGxlbiwgMHgwMCwKKwkJCSAgICAgICBzaXplb2YoZXhwLT5tYXNrLnNyYy51MykgLSBsZW4pOworCX0gZWxzZSB7CisJCW1lbXNldCgmZXhwLT50dXBsZS5zcmMudTMsIDB4MDAsIHNpemVvZihleHAtPnR1cGxlLnNyYy51MykpOworCQltZW1zZXQoJmV4cC0+bWFzay5zcmMudTMsIDB4MDAsIHNpemVvZihleHAtPm1hc2suc3JjLnUzKSk7CisJfQorCisJaWYgKGRhZGRyKSB7CisJCW1lbWNweSgmZXhwLT50dXBsZS5kc3QudTMsIGRhZGRyLCBsZW4pOworCQlpZiAoc2l6ZW9mKGV4cC0+dHVwbGUuZHN0LnUzKSA+IGxlbikKKwkJCS8qIGFkZHJlc3MgbmVlZHMgdG8gYmUgY2xlYXJlZCBmb3IgbmZfY3RfdHVwbGVfZXF1YWwgKi8KKwkJCW1lbXNldCgodm9pZCAqKSZleHAtPnR1cGxlLmRzdC51MyArIGxlbiwgMHgwMCwKKwkJCSAgICAgICBzaXplb2YoZXhwLT50dXBsZS5kc3QudTMpIC0gbGVuKTsKKwkJbWVtc2V0KCZleHAtPm1hc2suZHN0LnUzLCAweEZGLCBsZW4pOworCQlpZiAoc2l6ZW9mKGV4cC0+bWFzay5kc3QudTMpID4gbGVuKQorCQkJbWVtc2V0KCh2b2lkICopJmV4cC0+bWFzay5kc3QudTMgKyBsZW4sIDB4MDAsCisJCQkgICAgICAgc2l6ZW9mKGV4cC0+bWFzay5kc3QudTMpIC0gbGVuKTsKKwl9IGVsc2UgeworCQltZW1zZXQoJmV4cC0+dHVwbGUuZHN0LnUzLCAweDAwLCBzaXplb2YoZXhwLT50dXBsZS5kc3QudTMpKTsKKwkJbWVtc2V0KCZleHAtPm1hc2suZHN0LnUzLCAweDAwLCBzaXplb2YoZXhwLT5tYXNrLmRzdC51MykpOworCX0KKworCWlmIChzcmMpIHsKKwkJZXhwLT50dXBsZS5zcmMudS5hbGwgPSAoX19mb3JjZSB1MTYpKnNyYzsKKwkJZXhwLT5tYXNrLnNyYy51LmFsbCA9IDB4RkZGRjsKKwl9IGVsc2UgeworCQlleHAtPnR1cGxlLnNyYy51LmFsbCA9IDA7CisJCWV4cC0+bWFzay5zcmMudS5hbGwgPSAwOworCX0KKworCWlmIChkc3QpIHsKKwkJZXhwLT50dXBsZS5kc3QudS5hbGwgPSAoX19mb3JjZSB1MTYpKmRzdDsKKwkJZXhwLT5tYXNrLmRzdC51LmFsbCA9IDB4RkZGRjsKKwl9IGVsc2UgeworCQlleHAtPnR1cGxlLmRzdC51LmFsbCA9IDA7CisJCWV4cC0+bWFzay5kc3QudS5hbGwgPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19leHBlY3RfaW5pdCk7CisKK3ZvaWQgbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZXhwLT51c2UpKQorCQlrbWVtX2NhY2hlX2ZyZWUobmZfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIGV4cCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZXhwZWN0X3B1dCk7CisKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfaW5zZXJ0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOworCisJYXRvbWljX2luYygmZXhwLT51c2UpOworCW1hc3Rlcl9oZWxwLT5leHBlY3RpbmcrKzsKKwlsaXN0X2FkZCgmZXhwLT5saXN0LCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKKworCWluaXRfdGltZXIoJmV4cC0+dGltZW91dCk7CisJZXhwLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylleHA7CisJZXhwLT50aW1lb3V0LmZ1bmN0aW9uID0gZXhwZWN0YXRpb25fdGltZWRfb3V0OworCWV4cC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIG1hc3Rlcl9oZWxwLT5oZWxwZXItPnRpbWVvdXQgKiBIWjsKKwlhZGRfdGltZXIoJmV4cC0+dGltZW91dCk7CisKKwlleHAtPmlkID0gKytuZl9jb25udHJhY2tfZXhwZWN0X25leHRfaWQ7CisJYXRvbWljX2luYygmZXhwLT51c2UpOworCU5GX0NUX1NUQVRfSU5DKGV4cGVjdF9jcmVhdGUpOworfQorCisvKiBSYWNlIHdpdGggZXhwZWN0YXRpb25zIGJlaW5nIHVzZWQgbWVhbnMgd2UgY291bGQgaGF2ZSBub25lIHRvIGZpbmQ7IE9LLiAqLworc3RhdGljIHZvaWQgZXZpY3Rfb2xkZXN0X2V4cGVjdChzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGktPm1hc3RlciA9PSBtYXN0ZXIpIHsKKwkJCWlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7CisJCQkJbmZfY3RfdW5saW5rX2V4cGVjdChpKTsKKwkJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCByZWZyZXNoX3RpbWVyKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppKQoreworCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGktPm1hc3Rlcik7CisKKwlpZiAoIWRlbF90aW1lcigmaS0+dGltZW91dCkpCisJCXJldHVybiAwOworCisJaS0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIG1hc3Rlcl9oZWxwLT5oZWxwZXItPnRpbWVvdXQqSFo7CisJYWRkX3RpbWVyKCZpLT50aW1lb3V0KTsKKwlyZXR1cm4gMTsKK30KKworaW50IG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0KQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOworCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBleHBlY3QtPm1hc3RlcjsKKwlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChtYXN0ZXIpOworCWludCByZXQ7CisKKwlORl9DVF9BU1NFUlQobWFzdGVyX2hlbHApOworCisJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgeworCQlpZiAoZXhwZWN0X21hdGNoZXMoaSwgZXhwZWN0KSkgeworCQkJLyogUmVmcmVzaCB0aW1lcjogaWYgaXQncyBkeWluZywgaWdub3JlLi4gKi8KKwkJCWlmIChyZWZyZXNoX3RpbWVyKGkpKSB7CisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIGlmIChleHBlY3RfY2xhc2goaSwgZXhwZWN0KSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJLyogV2lsbCBiZSBvdmVyIGxpbWl0PyAqLworCWlmIChtYXN0ZXJfaGVscC0+aGVscGVyLT5tYXhfZXhwZWN0ZWQgJiYKKwkgICAgbWFzdGVyX2hlbHAtPmV4cGVjdGluZyA+PSBtYXN0ZXJfaGVscC0+aGVscGVyLT5tYXhfZXhwZWN0ZWQpCisJCWV2aWN0X29sZGVzdF9leHBlY3QobWFzdGVyKTsKKworCW5mX2Nvbm50cmFja19leHBlY3RfaW5zZXJ0KGV4cGVjdCk7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9ldmVudChJUEVYUF9ORVcsIGV4cGVjdCk7CisJcmV0ID0gMDsKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqZXhwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmUgPSAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0OworCWxvZmZfdCBpOworCisJLyogc3RyYW5nZSBzZXFfZmlsZSBhcGkgY2FsbHMgc3RvcCBldmVuIGlmIHdlIGZhaWwsCisJICogdGh1cyB3ZSBuZWVkIHRvIGdyYWIgbG9jayBzaW5jZSBzdG9wIHVubG9ja3MgKi8KKwlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KGUpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPD0gKnBvczsgaSsrKSB7CisJCWUgPSBlLT5uZXh0OworCQlpZiAoZSA9PSAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBlOworfQorCitzdGF0aWMgdm9pZCAqZXhwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZSA9IHY7CisKKwkrKypwb3M7CisJZSA9IGUtPm5leHQ7CisKKwlpZiAoZSA9PSAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlOworfQorCitzdGF0aWMgdm9pZCBleHBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZXhwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0ID0gdjsKKworCWlmIChleHBlY3QtPnRpbWVvdXQuZnVuY3Rpb24pCisJCXNlcV9wcmludGYocywgIiVsZCAiLCB0aW1lcl9wZW5kaW5nKCZleHBlY3QtPnRpbWVvdXQpCisJCQkgICA/IChsb25nKShleHBlY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCk7CisJZWxzZQorCQlzZXFfcHJpbnRmKHMsICItICIpOworCXNlcV9wcmludGYocywgImwzcHJvdG8gPSAldSBwcm90bz0ldSAiLAorCQkgICBleHBlY3QtPnR1cGxlLnNyYy5sM251bSwKKwkJICAgZXhwZWN0LT50dXBsZS5kc3QucHJvdG9udW0pOworCXByaW50X3R1cGxlKHMsICZleHBlY3QtPnR1cGxlLAorCQkgICAgX19uZl9jdF9sM3Byb3RvX2ZpbmQoZXhwZWN0LT50dXBsZS5zcmMubDNudW0pLAorCQkgICAgX19uZl9jdF9sNHByb3RvX2ZpbmQoZXhwZWN0LT50dXBsZS5zcmMubDNudW0sCisJCQkJICAgICAgIGV4cGVjdC0+dHVwbGUuZHN0LnByb3RvbnVtKSk7CisJcmV0dXJuIHNlcV9wdXRjKHMsICdcbicpOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGV4cF9zZXFfb3BzID0geworCS5zdGFydCA9IGV4cF9zZXFfc3RhcnQsCisJLm5leHQgPSBleHBfc2VxX25leHQsCisJLnN0b3AgPSBleHBfc2VxX3N0b3AsCisJLnNob3cgPSBleHBfc2VxX3Nob3cKK307CisKK3N0YXRpYyBpbnQgZXhwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZleHBfc2VxX29wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhwX2ZpbGVfb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBleHBfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKK307CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKaW5kZXggMGMxN2E1Yi4uOTJhOTQ3MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKQEAgLTI2LDEyICsyNiwxNSBAQAogI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJmdHAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX2Z0cCIpOwogCiAvKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCdzIHNpbXBsZS4gLS1SUiAqLwogc3RhdGljIGNoYXIgKmZ0cF9idWZmZXI7CkBAIC00OCw3ICs1MSw3IEBACiAKIHVuc2lnbmVkIGludCAoKm5mX25hdF9mdHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCWVudW0gaXBfY3RfZnRwX3R5cGUgdHlwZSwKKwkJCQllbnVtIG5mX2N0X2Z0cF90eXBlIHR5cGUsCiAJCQkJdW5zaWduZWQgaW50IG1hdGNob2ZmLAogCQkJCXVuc2lnbmVkIGludCBtYXRjaGxlbiwKIAkJCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLApAQCAtNzEsNyArNzQsNyBAQAogCXNpemVfdCBwbGVuOwogCWNoYXIgc2tpcDsKIAljaGFyIHRlcm07Ci0JZW51bSBpcF9jdF9mdHBfdHlwZSBmdHB0eXBlOworCWVudW0gbmZfY3RfZnRwX3R5cGUgZnRwdHlwZTsKIAlpbnQgKCpnZXRudW0pKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBzdHJ1Y3QgbmZfY29ubnRyYWNrX21hbiAqLCBjaGFyKTsKIH0gc2VhcmNoW0lQX0NUX0RJUl9NQVhdWzJdID0gewogCVtJUF9DVF9ESVJfT1JJR0lOQUxdID0gewpAQCAtODAsNyArODMsNyBAQAogCQkJLnBsZW4JCT0gc2l6ZW9mKCJQT1JUIikgLSAxLAogCQkJLnNraXAJCT0gJyAnLAogCQkJLnRlcm0JCT0gJ1xyJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX1BPUlQsCisJCQkuZnRwdHlwZQk9IE5GX0NUX0ZUUF9QT1JULAogCQkJLmdldG51bQkJPSB0cnlfcmZjOTU5LAogCQl9LAogCQl7CkBAIC04OCw3ICs5MSw3IEBACiAJCQkucGxlbgkJPSBzaXplb2YoIkVQUlQiKSAtIDEsCiAJCQkuc2tpcAkJPSAnICcsCiAJCQkudGVybQkJPSAnXHInLAotCQkJLmZ0cHR5cGUJPSBJUF9DVF9GVFBfRVBSVCwKKwkJCS5mdHB0eXBlCT0gTkZfQ1RfRlRQX0VQUlQsCiAJCQkuZ2V0bnVtCQk9IHRyeV9lcHJ0LAogCQl9LAogCX0sCkBAIC05OCw3ICsxMDEsNyBAQAogCQkJLnBsZW4JCT0gc2l6ZW9mKCIyMjcgIikgLSAxLAogCQkJLnNraXAJCT0gJygnLAogCQkJLnRlcm0JCT0gJyknLAotCQkJLmZ0cHR5cGUJPSBJUF9DVF9GVFBfUEFTViwKKwkJCS5mdHB0eXBlCT0gTkZfQ1RfRlRQX1BBU1YsCiAJCQkuZ2V0bnVtCQk9IHRyeV9yZmM5NTksCiAJCX0sCiAJCXsKQEAgLTEwNiw3ICsxMDksNyBAQAogCQkJLnBsZW4JCT0gc2l6ZW9mKCIyMjkgIikgLSAxLAogCQkJLnNraXAJCT0gJygnLAogCQkJLnRlcm0JCT0gJyknLAotCQkJLmZ0cHR5cGUJPSBJUF9DVF9GVFBfRVBTViwKKwkJCS5mdHB0eXBlCT0gTkZfQ1RfRlRQX0VQU1YsCiAJCQkuZ2V0bnVtCQk9IHRyeV9lcHN2X3Jlc3BvbnNlLAogCQl9LAogCX0sCkBAIC0xNzEsNyArMTc0LDcgQEAKIAogLyogR3JhYiBwb3J0OiBudW1iZXIgdXAgdG8gZGVsaW1pdGVyICovCiBzdGF0aWMgaW50IGdldF9wb3J0KGNvbnN0IGNoYXIgKmRhdGEsIGludCBzdGFydCwgc2l6ZV90IGRsZW4sIGNoYXIgZGVsaW0sCi0JCSAgICB1X2ludDE2X3QgKnBvcnQpCisJCSAgICBfX2JlMTYgKnBvcnQpCiB7CiAJdV9pbnQxNl90IHRtcF9wb3J0ID0gMDsKIAlpbnQgaTsKQEAgLTMxNyw3ICszMjAsNyBAQAogfQogCiAvKiBMb29rIHVwIHRvIHNlZSBpZiB3ZSdyZSBqdXN0IGFmdGVyIGEgXG4uICovCi1zdGF0aWMgaW50IGZpbmRfbmxfc2VxKHUzMiBzZXEsIGNvbnN0IHN0cnVjdCBpcF9jdF9mdHBfbWFzdGVyICppbmZvLCBpbnQgZGlyKQorc3RhdGljIGludCBmaW5kX25sX3NlcSh1MzIgc2VxLCBjb25zdCBzdHJ1Y3QgbmZfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpcikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMzI4LDcgKzMzMSw3IEBACiB9CiAKIC8qIFdlIGRvbid0IHVwZGF0ZSBpZiBpdCdzIG9sZGVyIHRoYW4gd2hhdCB3ZSBoYXZlLiAqLwotc3RhdGljIHZvaWQgdXBkYXRlX25sX3NlcSh1MzIgbmxfc2VxLCBzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpciwKK3N0YXRpYyB2b2lkIHVwZGF0ZV9ubF9zZXEodTMyIG5sX3NlcSwgc3RydWN0IG5mX2N0X2Z0cF9tYXN0ZXIgKmluZm8sIGludCBkaXIsCiAJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdW5zaWduZWQgaW50IGksIG9sZGVzdCA9IE5VTV9TRVFfVE9fUkVNRU1CRVI7CkBAIC0zNjQsMTIgKzM2NywxMiBAQAogCXUzMiBzZXE7CiAJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sIG1hdGNob2ZmOwotCXN0cnVjdCBpcF9jdF9mdHBfbWFzdGVyICpjdF9mdHBfaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X2Z0cF9pbmZvOworCXN0cnVjdCBuZl9jdF9mdHBfbWFzdGVyICpjdF9mdHBfaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X2Z0cF9pbmZvOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CiAJc3RydWN0IG5mX2Nvbm50cmFja19tYW4gY21kID0ge307Ci0KIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgZm91bmQgPSAwLCBlbmRzX2luX25sOworCXR5cGVvZihuZl9uYXRfZnRwX2hvb2spIG5mX25hdF9mdHA7CiAKIAkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KIAlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVECkBAIC01MDAsMTIgKzUwMywxMiBAQAogCQkJICAgICAgIC51ID0geyAudGNwID0geyAwIH19LAogCQkJICAgICB9LAogCQkgICAgICAuZHN0ID0geyAucHJvdG9udW0gPSAweEZGLAotCQkJICAgICAgIC51ID0geyAudGNwID0geyAweEZGRkYgfX0sCisJCQkgICAgICAgLnUgPSB7IC50Y3AgPSB7IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSB9fSwKIAkJCSAgICAgfSwKIAkJICAgIH07CiAJaWYgKGNtZC5sM251bSA9PSBQRl9JTkVUKSB7Ci0JCWV4cC0+bWFzay5zcmMudTMuaXAgPSAweEZGRkZGRkZGOwotCQlleHAtPm1hc2suZHN0LnUzLmlwID0gMHhGRkZGRkZGRjsKKwkJZXhwLT5tYXNrLnNyYy51My5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOworCQlleHAtPm1hc2suZHN0LnUzLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7CiAJfSBlbHNlIHsKIAkJbWVtc2V0KGV4cC0+bWFzay5zcmMudTMuaXA2LCAweEZGLAogCQkgICAgICAgc2l6ZW9mKGV4cC0+bWFzay5zcmMudTMuaXA2KSk7CkBAIC01MTQsMTMgKzUxNywxNSBAQAogCX0KIAogCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOworCWV4cC0+aGVscGVyID0gTlVMTDsKIAlleHAtPmZsYWdzID0gMDsKIAogCS8qIE5vdywgTkFUIG1pZ2h0IHdhbnQgdG8gbWFuZ2xlIHRoZSBwYWNrZXQsIGFuZCByZWdpc3RlciB0aGUKIAkgKiAocG9zc2libHkgY2hhbmdlZCkgZXhwZWN0YXRpb24gaXRzZWxmLiAqLwotCWlmIChuZl9uYXRfZnRwX2hvb2spCi0JCXJldCA9IG5mX25hdF9mdHBfaG9vayhwc2tiLCBjdGluZm8sIHNlYXJjaFtkaXJdW2ldLmZ0cHR5cGUsCi0JCQkJICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBleHAsICZzZXEpOworCW5mX25hdF9mdHAgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X2Z0cF9ob29rKTsKKwlpZiAobmZfbmF0X2Z0cCAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQlyZXQgPSBuZl9uYXRfZnRwKHBza2IsIGN0aW5mbywgc2VhcmNoW2Rpcl1baV0uZnRwdHlwZSwKKwkJCQkgbWF0Y2hvZmYsIG1hdGNobGVuLCBleHAsICZzZXEpOwogCWVsc2UgewogCQkvKiBDYW4ndCBleHBlY3QgdGhpcz8gIEJlc3QgdG8gZHJvcCBwYWNrZXQgbm93LiAqLwogCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKQEAgLTU4NCw3ICs1ODksOCBAQAogCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CiAJCQlmdHBbaV1bal0udHVwbGUuc3JjLnUudGNwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CiAJCQlmdHBbaV1bal0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JCQlmdHBbaV1bal0ubWFzay5zcmMudS50Y3AucG9ydCA9IDB4RkZGRjsKKwkJCWZ0cFtpXVtqXS5tYXNrLnNyYy5sM251bSA9IDB4RkZGRjsKKwkJCWZ0cFtpXVtqXS5tYXNrLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKIAkJCWZ0cFtpXVtqXS5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CiAJCQlmdHBbaV1bal0ubWF4X2V4cGVjdGVkID0gMTsKIAkJCWZ0cFtpXVtqXS50aW1lb3V0ID0gNSAqIDYwOwkvKiA1IE1pbnV0ZXMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5jCmluZGV4IDI2ZGZlY2EuLmY2ZmFkNzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5jCkBAIC0xNSw3ICsxNSw3IEBACiAjZWxzZQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLmg+CiAKIC8qIFRyYWNlIEZsYWcgKi8KICNpZm5kZWYgSDMyM19UUkFDRQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSC4zMjMgVHlwZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgImlwX2Nvbm50cmFja19oZWxwZXJfaDMyM190eXBlcy5jIgorI2luY2x1ZGUgIm5mX2Nvbm50cmFja19oMzIzX3R5cGVzLmMiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBGdW5jdGlvbnMKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NTY4OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jCkBAIC0wLDAgKzEsMTg1NiBAQAorLyoKKyAqIEguMzIzIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIEJhc2VkIG9uIHRoZSAnYnJ1dGUgZm9yY2UnIEguMzIzIGNvbm5lY3Rpb24gdHJhY2tpbmcgbW9kdWxlIGJ5CisgKiBKb3pzZWYgS2FkbGVjc2lrIDxrYWRsZWNAYmxhY2tob2xlLmtma2kuaHU+CisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgaHR0cDovL25hdGgzMjMuc291cmNlZm9yZ2UubmV0LworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyMy5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFBhcmFtZXRlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVmYXVsdF9ycnFfdHRsIF9fcmVhZF9tb3N0bHkgPSAzMDA7Cittb2R1bGVfcGFyYW0oZGVmYXVsdF9ycnFfdHRsLCB1aW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmYXVsdF9ycnFfdHRsLCAidXNlIHRoaXMgVFRMIGlmIGl0J3MgbWlzc2luZyBpbiBSUlEiKTsKKworc3RhdGljIGludCBna3JvdXRlZF9vbmx5IF9fcmVhZF9tb3N0bHkgPSAxOworbW9kdWxlX3BhcmFtKGdrcm91dGVkX29ubHksIGludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdrcm91dGVkX29ubHksICJvbmx5IGFjY2VwdCBjYWxscyBmcm9tIGdhdGVrZWVwZXIiKTsKKworc3RhdGljIGludCBjYWxsZm9yd2FyZF9maWx0ZXIgX19yZWFkX21vc3RseSA9IDE7Cittb2R1bGVfcGFyYW0oY2FsbGZvcndhcmRfZmlsdGVyLCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2FsbGZvcndhcmRfZmlsdGVyLCAib25seSBjcmVhdGUgY2FsbCBmb3J3YXJkaW5nIGV4cGVjdGF0aW9ucyAiCisJCSAgICAgICAgICAgICAgICAgICAgICJpZiBib3RoIGVuZHBvaW50cyBhcmUgb24gZGlmZmVyZW50IHNpZGVzICIKKwkJCQkgICAgICIoZGV0ZXJtaW5lZCBieSByb3V0aW5nIGluZm9ybWF0aW9uKSIpOworCisvKiBIb29rcyBmb3IgTkFUICovCitpbnQgKCpzZXRfaDI0NV9hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsIF9fYmUxNiBwb3J0KQorCQkJICAgX19yZWFkX21vc3RseTsKK2ludCAoKnNldF9oMjI1X2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCSAgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsIF9fYmUxNiBwb3J0KQorCQkJICAgX19yZWFkX21vc3RseTsKK2ludCAoKnNldF9zaWdfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCkgX19yZWFkX21vc3RseTsKK2ludCAoKnNldF9yYXNfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCkgX19yZWFkX21vc3RseTsKK2ludCAoKm5hdF9ydHBfcnRjcF9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkgIF9fYmUxNiBwb3J0LCBfX2JlMTYgcnRwX3BvcnQsCisJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpydHBfZXhwLAorCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqcnRjcF9leHApIF9fcmVhZF9tb3N0bHk7CitpbnQgKCpuYXRfdDEyMF9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCSAgICAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIF9fYmUxNiBwb3J0LAorCQkgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSBfX3JlYWRfbW9zdGx5OworaW50ICgqbmF0X2gyNDVfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkgICAgICBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwgX19iZTE2IHBvcnQsCisJCSAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApIF9fcmVhZF9tb3N0bHk7CitpbnQgKCpuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQlzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJCVRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBfX2JlMTYgcG9ydCwKKwkJCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSBfX3JlYWRfbW9zdGx5OworaW50ICgqbmF0X3E5MzFfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBpbnQgaWR4LAorCQkgICAgICBfX2JlMTYgcG9ydCwgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKKwkJICAgICAgX19yZWFkX21vc3RseTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhuZl9oMzIzX2xvY2spOworc3RhdGljIGNoYXIgKmgzMjNfYnVmZmVyOworCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgbmZfY29ubnRyYWNrX2hlbHBlcl9oMjQ1Oworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyIG5mX2Nvbm50cmFja19oZWxwZXJfcTkzMVtdOworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyIG5mX2Nvbm50cmFja19oZWxwZXJfcmFzW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBnZXRfdHBrdF9kYXRhKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCQkgc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpkYXRhbGVuLCBpbnQgKmRhdGFvZmYpCit7CisJc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfaDMyM19pbmZvOworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCWludCB0Y3BkYXRhbGVuOworCWludCB0Y3BkYXRhb2ZmOworCXVuc2lnbmVkIGNoYXIgKnRwa3Q7CisJaW50IHRwa3RsZW47CisJaW50IHRwa3RvZmY7CisKKwkvKiBHZXQgVENQIGhlYWRlciAqLworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIEdldCBUQ1AgZGF0YSBvZmZzZXQgKi8KKwl0Y3BkYXRhb2ZmID0gcHJvdG9mZiArIHRoLT5kb2ZmICogNDsKKworCS8qIEdldCBUQ1AgZGF0YSBsZW5ndGggKi8KKwl0Y3BkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gdGNwZGF0YW9mZjsKKwlpZiAodGNwZGF0YWxlbiA8PSAwKQkvKiBObyBUQ1AgZGF0YSAqLworCQlnb3RvIGNsZWFyX291dDsKKworCWlmICgqZGF0YSA9PSBOVUxMKSB7CS8qIGZpcnN0IFRQS1QgKi8KKwkJLyogR2V0IGZpcnN0IFRQS1QgcG9pbnRlciAqLworCQl0cGt0ID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCB0Y3BkYXRhb2ZmLCB0Y3BkYXRhbGVuLAorCQkJCQkgIGgzMjNfYnVmZmVyKTsKKwkJQlVHX09OKHRwa3QgPT0gTlVMTCk7CisKKwkJLyogVmFsaWRhdGUgVFBLVCBpZGVudGlmaWVyICovCisJCWlmICh0Y3BkYXRhbGVuIDwgNCB8fCB0cGt0WzBdICE9IDB4MDMgfHwgdHBrdFsxXSAhPSAwKSB7CisJCQkvKiBOZXRtZWV0aW5nIHNlbmRzIFRQS1QgaGVhZGVyIGFuZCBkYXRhIHNlcGFyYXRlbHkgKi8KKwkJCWlmIChpbmZvLT50cGt0X2xlbltkaXJdID4gMCkgeworCQkJCURFQlVHUCgibmZfY3RfaDMyMzogcHJldmlvdXMgcGFja2V0ICIKKwkJCQkgICAgICAgImluZGljYXRlZCBzZXBhcmF0ZSBUUEtUIGRhdGEgb2YgJWh1ICIKKwkJCQkgICAgICAgImJ5dGVzXG4iLCBpbmZvLT50cGt0X2xlbltkaXJdKTsKKwkJCQlpZiAoaW5mby0+dHBrdF9sZW5bZGlyXSA8PSB0Y3BkYXRhbGVuKSB7CisJCQkJCS8qIFllcywgdGhlcmUgd2FzIGEgVFBLVCBoZWFkZXIKKwkJCQkJICogcmVjZWl2ZWQgKi8KKwkJCQkJKmRhdGEgPSB0cGt0OworCQkJCQkqZGF0YWxlbiA9IGluZm8tPnRwa3RfbGVuW2Rpcl07CisJCQkJCSpkYXRhb2ZmID0gMDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJLyogRnJhZ21lbnRlZCBUUEtUICovCisJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJcHJpbnRrKCJuZl9jdF9oMzIzOiAiCisJCQkJCSAgICAgICAiZnJhZ21lbnRlZCBUUEtUXG4iKTsKKwkJCQlnb3RvIGNsZWFyX291dDsKKwkJCX0KKworCQkJLyogSXQgaXMgbm90IGV2ZW4gYSBUUEtUICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQl0cGt0b2ZmID0gMDsKKwl9IGVsc2UgewkJLyogTmV4dCBUUEtUICovCisJCXRwa3RvZmYgPSAqZGF0YW9mZiArICpkYXRhbGVuOworCQl0Y3BkYXRhbGVuIC09IHRwa3RvZmY7CisJCWlmICh0Y3BkYXRhbGVuIDw9IDQpCS8qIE5vIG1vcmUgVFBLVCAqLworCQkJZ290byBjbGVhcl9vdXQ7CisJCXRwa3QgPSAqZGF0YSArICpkYXRhbGVuOworCisJCS8qIFZhbGlkYXRlIFRQS1QgaWRlbnRpZmllciAqLworCQlpZiAodHBrdFswXSAhPSAweDAzIHx8IHRwa3RbMV0gIT0gMCkKKwkJCWdvdG8gY2xlYXJfb3V0OworCX0KKworCS8qIFZhbGlkYXRlIFRQS1QgbGVuZ3RoICovCisJdHBrdGxlbiA9IHRwa3RbMl0gKiAyNTYgKyB0cGt0WzNdOworCWlmICh0cGt0bGVuIDwgNCkKKwkJZ290byBjbGVhcl9vdXQ7CisJaWYgKHRwa3RsZW4gPiB0Y3BkYXRhbGVuKSB7CisJCWlmICh0Y3BkYXRhbGVuID09IDQpIHsJLyogU2VwYXJhdGUgVFBLVCBoZWFkZXIgKi8KKwkJCS8qIE5ldG1lZXRpbmcgc2VuZHMgVFBLVCBoZWFkZXIgYW5kIGRhdGEgc2VwYXJhdGVseSAqLworCQkJREVCVUdQKCJuZl9jdF9oMzIzOiBzZXBhcmF0ZSBUUEtUIGhlYWRlciBpbmRpY2F0ZXMgIgorCQkJICAgICAgICJ0aGVyZSB3aWxsIGJlIFRQS1QgZGF0YSBvZiAlaHUgYnl0ZXNcbiIsCisJCQkgICAgICAgdHBrdGxlbiAtIDQpOworCQkJaW5mby0+dHBrdF9sZW5bZGlyXSA9IHRwa3RsZW4gLSA0OworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJuZl9jdF9oMzIzOiBpbmNvbXBsZXRlIFRQS1QgKGZyYWdtZW50ZWQ/KVxuIik7CisJCWdvdG8gY2xlYXJfb3V0OworCX0KKworCS8qIFRoaXMgaXMgdGhlIGVuY2Fwc3VsYXRlZCBkYXRhICovCisJKmRhdGEgPSB0cGt0ICsgNDsKKwkqZGF0YWxlbiA9IHRwa3RsZW4gLSA0OworCSpkYXRhb2ZmID0gdHBrdG9mZiArIDQ7CisKKyAgICAgIG91dDoKKwkvKiBDbGVhciBUUEtUIGxlbmd0aCAqLworCWluZm8tPnRwa3RfbGVuW2Rpcl0gPSAwOworCXJldHVybiAxOworCisgICAgICBjbGVhcl9vdXQ6CisJaW5mby0+dHBrdF9sZW5bZGlyXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBnZXRfaDI0NV9hZGRyKHN0cnVjdCBuZl9jb25uICpjdCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICphZGRyLCBfX2JlMTYgKnBvcnQpCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgZmFtaWx5ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bTsKKwlpbnQgbGVuOworCisJaWYgKHRhZGRyLT5jaG9pY2UgIT0gZUgyNDVfVHJhbnNwb3J0QWRkcmVzc191bmljYXN0QWRkcmVzcykKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHRhZGRyLT51bmljYXN0QWRkcmVzcy5jaG9pY2UpIHsKKwljYXNlIGVVbmljYXN0QWRkcmVzc19pUEFkZHJlc3M6CisJCWlmIChmYW1pbHkgIT0gQUZfSU5FVCkKKwkJCXJldHVybiAwOworCQlwID0gZGF0YSArIHRhZGRyLT51bmljYXN0QWRkcmVzcy5pUEFkZHJlc3MubmV0d29yazsKKwkJbGVuID0gNDsKKwkJYnJlYWs7CisJY2FzZSBlVW5pY2FzdEFkZHJlc3NfaVA2QWRkcmVzczoKKwkJaWYgKGZhbWlseSAhPSBBRl9JTkVUNikKKwkJCXJldHVybiAwOworCQlwID0gZGF0YSArIHRhZGRyLT51bmljYXN0QWRkcmVzcy5pUDZBZGRyZXNzLm5ldHdvcms7CisJCWxlbiA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwltZW1jcHkoYWRkciwgcCwgbGVuKTsKKwltZW1zZXQoKHZvaWQgKilhZGRyICsgbGVuLCAwLCBzaXplb2YoKmFkZHIpIC0gbGVuKTsKKwltZW1jcHkocG9ydCwgcCArIGxlbiwgc2l6ZW9mKF9fYmUxNikpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBleHBlY3RfcnRwX3J0Y3Aoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCSAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIpCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0ID0gMDsKKwlfX2JlMTYgcG9ydDsKKwlfX2JlMTYgcnRwX3BvcnQsIHJ0Y3BfcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpydHBfZXhwOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpydGNwX2V4cDsKKwl0eXBlb2YobmF0X3J0cF9ydGNwX2hvb2spIG5hdF9ydHBfcnRjcDsKKworCS8qIFJlYWQgUlRQIG9yIFJUQ1AgYWRkcmVzcyAqLworCWlmICghZ2V0X2gyNDVfYWRkcihjdCwgKmRhdGEsIHRhZGRyLCAmYWRkciwgJnBvcnQpIHx8CisJICAgIG1lbWNtcCgmYWRkciwgJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMsIHNpemVvZihhZGRyKSkgfHwKKwkgICAgcG9ydCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFJUUCBwb3J0IGlzIGV2ZW4gKi8KKwlwb3J0ICY9IGh0b25zKH4xKTsKKwlydHBfcG9ydCA9IHBvcnQ7CisJcnRjcF9wb3J0ID0gaHRvbnMobnRvaHMocG9ydCkgKyAxKTsKKworCS8qIENyZWF0ZSBleHBlY3QgZm9yIFJUUCAqLworCWlmICgocnRwX2V4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHJ0cF9leHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgSVBQUk9UT19VRFAsIE5VTEwsICZydHBfcG9ydCk7CisKKwkvKiBDcmVhdGUgZXhwZWN0IGZvciBSVENQICovCisJaWYgKChydGNwX2V4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKSB7CisJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KHJ0cF9leHApOworCQlyZXR1cm4gLTE7CisJfQorCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChydGNwX2V4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJCSBJUFBST1RPX1VEUCwgTlVMTCwgJnJ0Y3BfcG9ydCk7CisKKwlpZiAobWVtY21wKCZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLAorCSAgIAkgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCSAgIHNpemVvZihjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzKSkgJiYKKwkJICAgKG5hdF9ydHBfcnRjcCA9IHJjdV9kZXJlZmVyZW5jZShuYXRfcnRwX3J0Y3BfaG9vaykpICYmCisJCSAgIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJLyogTkFUIG5lZWRlZCAqLworCQlyZXQgPSBuYXRfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICB0YWRkciwgcG9ydCwgcnRwX3BvcnQsIHJ0cF9leHAsIHJ0Y3BfZXhwKTsKKwl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChydHBfZXhwKSA9PSAwKSB7CisJCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHJ0Y3BfZXhwKSA9PSAwKSB7CisJCQkJREVCVUdQKCJuZl9jdF9oMzIzOiBleHBlY3QgUlRQICIpOworCQkJCU5GX0NUX0RVTVBfVFVQTEUoJnJ0cF9leHAtPnR1cGxlKTsKKwkJCQlERUJVR1AoIm5mX2N0X2gzMjM6IGV4cGVjdCBSVENQICIpOworCQkJCU5GX0NUX0RVTVBfVFVQTEUoJnJ0Y3BfZXhwLT50dXBsZSk7CisJCQl9IGVsc2UgeworCQkJCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHJ0cF9leHApOworCQkJCXJldCA9IC0xOworCQkJfQorCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCX0KKworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KHJ0cF9leHApOworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KHJ0Y3BfZXhwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBleHBlY3RfdDEyMChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJICAgICAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIpCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0ID0gMDsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKG5hdF90MTIwX2hvb2spIG5hdF90MTIwOworCisJLyogUmVhZCBULjEyMCBhZGRyZXNzICovCisJaWYgKCFnZXRfaDI0NV9hZGRyKGN0LCAqZGF0YSwgdGFkZHIsICZhZGRyLCAmcG9ydCkgfHwKKwkgICAgbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51Mywgc2l6ZW9mKGFkZHIpKSB8fAorCSAgICBwb3J0ID09IDApCisJCXJldHVybiAwOworCisJLyogQ3JlYXRlIGV4cGVjdCBmb3IgVC4xMjAgY29ubmVjdGlvbnMgKi8KKwlpZiAoKGV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJCSBJUFBST1RPX1RDUCwgTlVMTCwgJnBvcnQpOworCWV4cC0+ZmxhZ3MgPSBORl9DVF9FWFBFQ1RfUEVSTUFORU5UOwkvKiBBY2NlcHQgbXVsdGlwbGUgY2hhbm5lbHMgKi8KKworCWlmIChtZW1jbXAoJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMsCisJCSAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJICAgc2l6ZW9mKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMpKSAmJgorCSAgICAobmF0X3QxMjAgPSByY3VfZGVyZWZlcmVuY2UobmF0X3QxMjBfaG9vaykpICYmCisJICAgIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJLyogTkFUIG5lZWRlZCAqLworCQlyZXQgPSBuYXRfdDEyMChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCB0YWRkciwKKwkJCSAgICAgICBwb3J0LCBleHApOworCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgeworCQkJREVCVUdQKCJuZl9jdF9oMzIzOiBleHBlY3QgVC4xMjAgIik7CisJCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKwl9CisKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfaDI0NV9jaGFubmVsKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQlzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJCUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzICpjaGFubmVsKQoreworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbC0+b3B0aW9ucyAmIGVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYUNoYW5uZWwpIHsKKwkJLyogUlRQICovCisJCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAgICZjaGFubmVsLT5tZWRpYUNoYW5uZWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY2hhbm5lbC0+CisJICAgIG9wdGlvbnMgJiBlSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbWVkaWFDb250cm9sQ2hhbm5lbCkgeworCQkvKiBSVENQICovCisJCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAgICZjaGFubmVsLT5tZWRpYUNvbnRyb2xDaGFubmVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX29sYyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkgICAgICAgT3BlbkxvZ2ljYWxDaGFubmVsICpvbGMpCit7CisJaW50IHJldDsKKworCURFQlVHUCgibmZfY3RfaDMyMzogT3BlbkxvZ2ljYWxDaGFubmVsXG4iKTsKKworCWlmIChvbGMtPmZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMubXVsdGlwbGV4UGFyYW1ldGVycy5jaG9pY2UgPT0KKwkgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpCisJeworCQlyZXQgPSBwcm9jZXNzX2gyNDVfY2hhbm5lbChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAmb2xjLT4KKwkJCQkJICAgZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy4KKwkJCQkJICAgbXVsdGlwbGV4UGFyYW1ldGVycy4KKwkJCQkJICAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKG9sYy0+b3B0aW9ucyAmCisJICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpICYmCisJICAgIChvbGMtPnJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMub3B0aW9ucyAmCisJICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycykKKwkgICAgJiYgKG9sYy0+cmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5tdWx0aXBsZXhQYXJhbWV0ZXJzLgorCQljaG9pY2UgPT0KKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpKQorCXsKKwkJcmV0ID0KKwkJICAgIHByb2Nlc3NfaDI0NV9jaGFubmVsKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAmb2xjLT4KKwkJCQkJIHJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuCisJCQkJCSBtdWx0aXBsZXhQYXJhbWV0ZXJzLgorCQkJCQkgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKG9sYy0+b3B0aW9ucyAmIGVPcGVuTG9naWNhbENoYW5uZWxfc2VwYXJhdGVTdGFjaykgJiYKKwkgICAgb2xjLT5mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLmRhdGFUeXBlLmNob2ljZSA9PQorCSAgICBlRGF0YVR5cGVfZGF0YSAmJgorCSAgICBvbGMtPmZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuZGF0YVR5cGUuZGF0YS5hcHBsaWNhdGlvbi4KKwkgICAgY2hvaWNlID09IGVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3QxMjAgJiYKKwkgICAgb2xjLT5mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLmRhdGFUeXBlLmRhdGEuYXBwbGljYXRpb24uCisJICAgIHQxMjAuY2hvaWNlID09IGVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3NlcGFyYXRlTEFOU3RhY2sgJiYKKwkgICAgb2xjLT5zZXBhcmF0ZVN0YWNrLm5ldHdvcmtBZGRyZXNzLmNob2ljZSA9PQorCSAgICBlTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3NfbG9jYWxBcmVhQWRkcmVzcykgeworCQlyZXQgPSBleHBlY3RfdDEyMChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgJm9sYy0+c2VwYXJhdGVTdGFjay5uZXR3b3JrQWRkcmVzcy4KKwkJCQkgIGxvY2FsQXJlYUFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3Nfb2xjYShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJT3BlbkxvZ2ljYWxDaGFubmVsQWNrICpvbGNhKQoreworCUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzICphY2s7CisJaW50IHJldDsKKworCURFQlVHUCgibmZfY3RfaDMyMzogT3BlbkxvZ2ljYWxDaGFubmVsQWNrXG4iKTsKKworCWlmICgob2xjYS0+b3B0aW9ucyAmCisJICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpICYmCisJICAgIChvbGNhLT5yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm9wdGlvbnMgJgorCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMpCisJICAgICYmIChvbGNhLT5yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm11bHRpcGxleFBhcmFtZXRlcnMuCisJCWNob2ljZSA9PQorCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycykpCisJeworCQlyZXQgPSBwcm9jZXNzX2gyNDVfY2hhbm5lbChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAmb2xjYS0+CisJCQkJCSAgIHJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuCisJCQkJCSAgIG11bHRpcGxleFBhcmFtZXRlcnMuCisJCQkJCSAgIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChvbGNhLT5vcHRpb25zICYKKwkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMpICYmCisJICAgIChvbGNhLT5mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVycy5jaG9pY2UgPT0KKwkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMpKQorCXsKKwkJYWNrID0gJm9sY2EtPmZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzLgorCQkgICAgaDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnM7CisJCWlmIChhY2stPm9wdGlvbnMgJgorCQkgICAgZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX21lZGlhQ2hhbm5lbCkgeworCQkJLyogUlRQICovCisJCQlyZXQgPSBleHBlY3RfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAgICAgJmFjay0+bWVkaWFDaGFubmVsKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChhY2stPm9wdGlvbnMgJgorCQkgICAgZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX21lZGlhQ29udHJvbENoYW5uZWwpIHsKKwkJCS8qIFJUQ1AgKi8KKwkJCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAgICAmYWNrLT5tZWRpYUNvbnRyb2xDaGFubmVsKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19oMjQ1KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQlNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UgKm1zY20pCit7CisJc3dpdGNoIChtc2NtLT5jaG9pY2UpIHsKKwljYXNlIGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2VfcmVxdWVzdDoKKwkJaWYgKG1zY20tPnJlcXVlc3QuY2hvaWNlID09CisJCSAgICBlUmVxdWVzdE1lc3NhZ2Vfb3BlbkxvZ2ljYWxDaGFubmVsKSB7CisJCQlyZXR1cm4gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAgJm1zY20tPnJlcXVlc3Qub3BlbkxvZ2ljYWxDaGFubmVsKTsKKwkJfQorCQlERUJVR1AoIm5mX2N0X2gzMjM6IEguMjQ1IFJlcXVlc3QgJWRcbiIsCisJCSAgICAgICBtc2NtLT5yZXF1ZXN0LmNob2ljZSk7CisJCWJyZWFrOworCWNhc2UgZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZV9yZXNwb25zZToKKwkJaWYgKG1zY20tPnJlc3BvbnNlLmNob2ljZSA9PQorCQkgICAgZVJlc3BvbnNlTWVzc2FnZV9vcGVuTG9naWNhbENoYW5uZWxBY2spIHsKKwkJCXJldHVybiBwcm9jZXNzX29sY2EocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAgICZtc2NtLT5yZXNwb25zZS4KKwkJCQkJICAgIG9wZW5Mb2dpY2FsQ2hhbm5lbEFjayk7CisJCX0KKwkJREVCVUdQKCJuZl9jdF9oMzIzOiBILjI0NSBSZXNwb25zZSAlZFxuIiwKKwkJICAgICAgIG1zY20tPnJlc3BvbnNlLmNob2ljZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUCgibmZfY3RfaDMyMzogSC4yNDUgc2lnbmFsICVkXG4iLCBtc2NtLT5jaG9pY2UpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGgyNDVfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RhdGljIE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSBtc2NtOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBOVUxMOworCWludCBkYXRhbGVuOworCWludCBkYXRhb2ZmOworCWludCByZXQ7CisKKwkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCURFQlVHUCgibmZfY3RfaDI0NTogc2tibGVuID0gJXVcbiIsICgqcHNrYiktPmxlbik7CisKKwlzcGluX2xvY2tfYmgoJm5mX2gzMjNfbG9jayk7CisKKwkvKiBQcm9jZXNzIGVhY2ggVFBLVCAqLworCXdoaWxlIChnZXRfdHBrdF9kYXRhKHBza2IsIHByb3RvZmYsIGN0LCBjdGluZm8sCisJCQkgICAgICZkYXRhLCAmZGF0YWxlbiwgJmRhdGFvZmYpKSB7CisJCURFQlVHUCgibmZfY3RfaDI0NTogVFBLVCBsZW49JWQgIiwgZGF0YWxlbik7CisJCU5GX0NUX0RVTVBfVFVQTEUoJmN0LT50dXBsZWhhc2hbQ1RJTkZPMkRJUihjdGluZm8pXS50dXBsZSk7CisKKwkJLyogRGVjb2RlIEguMjQ1IHNpZ25hbCAqLworCQlyZXQgPSBEZWNvZGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UoZGF0YSwgZGF0YWxlbiwKKwkJCQkJCQkgICAmbXNjbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50aygibmZfY3RfaDI0NTogZGVjb2RpbmcgZXJyb3I6ICVzXG4iLAorCQkJCSAgICAgICByZXQgPT0gSDMyM19FUlJPUl9CT1VORCA/CisJCQkJICAgICAgICJvdXQgb2YgYm91bmQiIDogIm91dCBvZiByYW5nZSIpOworCQkJLyogV2UgZG9uJ3QgZHJvcCB3aGVuIGRlY29kaW5nIGVycm9yICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIFByb2Nlc3MgSC4yNDUgc2lnbmFsICovCisJCWlmIChwcm9jZXNzX2gyNDUocHNrYiwgY3QsIGN0aW5mbywgJmRhdGEsIGRhdGFvZmYsICZtc2NtKSA8IDApCisJCQlnb3RvIGRyb3A7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJm5mX2gzMjNfbG9jayk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKKworICAgICAgZHJvcDoKKwlzcGluX3VubG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoIm5mX2N0X2gyNDU6IHBhY2tldCBkcm9wcGVkXG4iKTsKKwlyZXR1cm4gTkZfRFJPUDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgbmZfY29ubnRyYWNrX2hlbHBlcl9oMjQ1IF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCQk9ICJILjI0NSIsCisJLm1lCQkJPSBUSElTX01PRFVMRSwKKwkubWF4X2V4cGVjdGVkCQk9IEgzMjNfUlRQX0NIQU5ORUxfTUFYICogNCArIDIgLyogVC4xMjAgKi8sCisJLnRpbWVvdXQJCT0gMjQwLAorCS50dXBsZS5kc3QucHJvdG9udW0JPSBJUFBST1RPX1VEUCwKKwkubWFzay5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCS5oZWxwCQkJPSBoMjQ1X2hlbHAKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGdldF9oMjI1X2FkZHIoc3RydWN0IG5mX2Nvbm4gKmN0LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkgIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICphZGRyLCBfX2JlMTYgKnBvcnQpCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgZmFtaWx5ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bTsKKwlpbnQgbGVuOworCisJc3dpdGNoICh0YWRkci0+Y2hvaWNlKSB7CisJY2FzZSBlVHJhbnNwb3J0QWRkcmVzc19pcEFkZHJlc3M6CisJCWlmIChmYW1pbHkgIT0gQUZfSU5FVCkKKwkJCXJldHVybiAwOworCQlwID0gZGF0YSArIHRhZGRyLT5pcEFkZHJlc3MuaXA7CisJCWxlbiA9IDQ7CisJCWJyZWFrOworCWNhc2UgZVRyYW5zcG9ydEFkZHJlc3NfaXA2QWRkcmVzczoKKwkJaWYgKGZhbWlseSAhPSBBRl9JTkVUNikKKwkJCXJldHVybiAwOworCQlwID0gZGF0YSArIHRhZGRyLT5pcDZBZGRyZXNzLmlwNjsKKwkJbGVuID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCW1lbWNweShhZGRyLCBwLCBsZW4pOworCW1lbXNldCgodm9pZCAqKWFkZHIgKyBsZW4sIDAsIHNpemVvZigqYWRkcikgLSBsZW4pOworCW1lbWNweShwb3J0LCBwICsgbGVuLCBzaXplb2YoX19iZTE2KSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGV4cGVjdF9oMjQ1KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCSAgICAgICBUcmFuc3BvcnRBZGRyZXNzICp0YWRkcikKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQgPSAwOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwl0eXBlb2YobmF0X2gyNDVfaG9vaykgbmF0X2gyNDU7CisKKwkvKiBSZWFkIGgyNDVBZGRyZXNzICovCisJaWYgKCFnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgdGFkZHIsICZhZGRyLCAmcG9ydCkgfHwKKwkgICAgbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51Mywgc2l6ZW9mKGFkZHIpKSB8fAorCSAgICBwb3J0ID09IDApCisJCXJldHVybiAwOworCisJLyogQ3JlYXRlIGV4cGVjdCBmb3IgaDI0NSBjb25uZWN0aW9uICovCisJaWYgKChleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgSVBQUk9UT19UQ1AsIE5VTEwsICZwb3J0KTsKKwlleHAtPmhlbHBlciA9ICZuZl9jb25udHJhY2tfaGVscGVyX2gyNDU7CisKKwlpZiAobWVtY21wKCZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLAorCQkgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCSAgIHNpemVvZihjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzKSkgJiYKKwkgICAgKG5hdF9oMjQ1ID0gcmN1X2RlcmVmZXJlbmNlKG5hdF9oMjQ1X2hvb2spKSAmJgorCSAgICBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCS8qIE5BVCBuZWVkZWQgKi8KKwkJcmV0ID0gbmF0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwgdGFkZHIsCisJCQkgICAgICAgcG9ydCwgZXhwKTsKKwl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKKwkJCURFQlVHUCgibmZfY3RfcTkzMTogZXhwZWN0IEguMjQ1ICIpOworCQkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CisJfQorCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIElmIHRoZSBjYWxsaW5nIHBhcnR5IGlzIG9uIHRoZSBzYW1lIHNpZGUgb2YgdGhlIGZvcndhcmQtdG8gcGFydHksCisgKiB3ZSBkb24ndCBuZWVkIHRvIHRyYWNrIHRoZSBzZWNvbmQgY2FsbCAqLworc3RhdGljIGludCBjYWxsZm9yd2FyZF9kb19maWx0ZXIodW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKnNyYywKKwkJCQkgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmRzdCwKKwkJCQkgaW50IGZhbWlseSkKK3sKKwlzdHJ1Y3QgZmxvd2kgZmwxLCBmbDI7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQoJmZsMSwgMCwgc2l6ZW9mKGZsMSkpOworCW1lbXNldCgmZmwyLCAwLCBzaXplb2YoZmwyKSk7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDogeworCQlzdHJ1Y3QgcnRhYmxlICpydDEsICpydDI7CisKKwkJZmwxLmZsNF9kc3QgPSBzcmMtPmlwOworCQlmbDIuZmw0X2RzdCA9IGRzdC0+aXA7CisJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydDEsICZmbDEpID09IDApIHsKKwkJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydDIsICZmbDIpID09IDApIHsKKwkJCQlpZiAocnQxLT5ydF9nYXRld2F5ID09IHJ0Mi0+cnRfZ2F0ZXdheSAmJgorCQkJCSAgICBydDEtPnUuZHN0LmRldiAgPT0gcnQyLT51LmRzdC5kZXYpCisJCQkJCXJldCA9IDE7CisJCQkJZHN0X3JlbGVhc2UoJnJ0Mi0+dS5kc3QpOworCQkJfQorCQkJZHN0X3JlbGVhc2UoJnJ0MS0+dS5kc3QpOworCQl9CisJCWJyZWFrOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OiB7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQxLCAqcnQyOworCisJCW1lbWNweSgmZmwxLmZsNl9kc3QsIHNyYywgc2l6ZW9mKGZsMS5mbDZfZHN0KSk7CisJCW1lbWNweSgmZmwyLmZsNl9kc3QsIGRzdCwgc2l6ZW9mKGZsMi5mbDZfZHN0KSk7CisJCXJ0MSA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbDEpOworCQlpZiAocnQxKSB7CisJCQlydDIgPSAoc3RydWN0IHJ0Nl9pbmZvICopaXA2X3JvdXRlX291dHB1dChOVUxMLCAmZmwyKTsKKwkJCWlmIChydDIpIHsKKwkJCQlpZiAoIW1lbWNtcCgmcnQxLT5ydDZpX2dhdGV3YXksICZydDItPnJ0NmlfZ2F0ZXdheSwKKwkJCQkgCSAgICBzaXplb2YocnQxLT5ydDZpX2dhdGV3YXkpKSAmJgorCQkJCSAgICBydDEtPnUuZHN0LmRldiA9PSBydDItPnUuZHN0LmRldikKKwkJCQkJcmV0ID0gMTsKKwkJCQlkc3RfcmVsZWFzZSgmcnQyLT51LmRzdCk7CisJCQl9CisJCQlkc3RfcmVsZWFzZSgmcnQxLT51LmRzdCk7CisJCX0KKwkJYnJlYWs7CisJfQorI2VuZGlmCisJfQorCXJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGV4cGVjdF9jYWxsZm9yd2FyZGluZyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCQkgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIpCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0ID0gMDsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSBuYXRfY2FsbGZvcndhcmRpbmc7CisKKwkvKiBSZWFkIGFsdGVybmF0aXZlQWRkcmVzcyAqLworCWlmICghZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsIHRhZGRyLCAmYWRkciwgJnBvcnQpIHx8IHBvcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB0aGUgY2FsbGluZyBwYXJ0eSBpcyBvbiB0aGUgc2FtZSBzaWRlIG9mIHRoZSBmb3J3YXJkLXRvIHBhcnR5LAorCSAqIHdlIGRvbid0IG5lZWQgdG8gdHJhY2sgdGhlIHNlY29uZCBjYWxsICovCisJaWYgKGNhbGxmb3J3YXJkX2ZpbHRlciAmJgorCSAgICBjYWxsZm9yd2FyZF9kb19maWx0ZXIoJmFkZHIsICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywKKwkgICAgCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5sM251bSkpIHsKKwkJREVCVUdQKCJuZl9jdF9xOTMxOiBDYWxsIEZvcndhcmRpbmcgbm90IHRyYWNrZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDcmVhdGUgZXhwZWN0IGZvciB0aGUgc2Vjb25kIGNhbGwgbGVnICovCisJaWYgKChleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsICZhZGRyLAorCQkJCSBJUFBST1RPX1RDUCwgTlVMTCwgJnBvcnQpOworCWV4cC0+aGVscGVyID0gbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxOworCisJaWYgKG1lbWNtcCgmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51MywKKwkJICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkgICBzaXplb2YoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51MykpICYmCisJICAgIChuYXRfY2FsbGZvcndhcmRpbmcgPSByY3VfZGVyZWZlcmVuY2UobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spKSAmJgorCSAgICBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCS8qIE5lZWQgTkFUICovCisJCXJldCA9IG5hdF9jYWxsZm9yd2FyZGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgdGFkZHIsIHBvcnQsIGV4cCk7CisJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCisJCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7CisJCQlERUJVR1AoIm5mX2N0X3E5MzE6IGV4cGVjdCBDYWxsIEZvcndhcmRpbmcgIik7CisJCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKwl9CisKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3Nfc2V0dXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJIFNldHVwX1VVSUUgKnNldHVwKQoreworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IHJldDsKKwlpbnQgaTsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXR5cGVvZihzZXRfaDIyNV9hZGRyX2hvb2spIHNldF9oMjI1X2FkZHI7CisKKwlERUJVR1AoIm5mX2N0X3E5MzE6IFNldHVwXG4iKTsKKworCWlmIChzZXR1cC0+b3B0aW9ucyAmIGVTZXR1cF9VVUlFX2gyNDVBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmc2V0dXAtPmgyNDVBZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJc2V0X2gyMjVfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfaDIyNV9hZGRyX2hvb2spOworCWlmICgoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MpICYmCisJICAgIChzZXRfaDIyNV9hZGRyKSAmJiBjdC0+c3RhdHVzICYmIElQU19OQVRfTUFTSyAmJgorCSAgICBnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJnNldHVwLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCisJICAgIAkJICAmYWRkciwgJnBvcnQpICYmCisJICAgIG1lbWNtcCgmYWRkciwgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLCBzaXplb2YoYWRkcikpKSB7CisJCURFQlVHUCgibmZfY3RfcTkzMTogc2V0IGRlc3RDYWxsU2lnbmFsQWRkcmVzcyAiCisJCSAgICAgICBOSVA2X0ZNVCAiOiVodS0+IiBOSVA2X0ZNVCAiOiVodVxuIiwKKwkJICAgICAgIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKikmYWRkciksIG50b2hzKHBvcnQpLAorCQkgICAgICAgTklQNigqKHN0cnVjdCBpbjZfYWRkciAqKSZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MyksCisJCSAgICAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51LnRjcC5wb3J0KSk7CisJCXJldCA9IHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICAgJnNldHVwLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywKKwkJCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudS50Y3AucG9ydCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICgoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcykgJiYKKwkgICAgKHNldF9oMjI1X2FkZHIpICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0sgJiYKKwkgICAgZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsCisJICAgIAkJICAmYWRkciwgJnBvcnQpICYmCisJICAgIG1lbWNtcCgmYWRkciwgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLCBzaXplb2YoYWRkcikpKSB7CisJCURFQlVHUCgibmZfY3RfcTkzMTogc2V0IHNvdXJjZUNhbGxTaWduYWxBZGRyZXNzICIKKwkJICAgICAgIE5JUDZfRk1UICI6JWh1LT4iIE5JUDZfRk1UICI6JWh1XG4iLAorCQkgICAgICAgTklQNigqKHN0cnVjdCBpbjZfYWRkciAqKSZhZGRyKSwgbnRvaHMocG9ydCksCisJCSAgICAgICBOSVA2KCooc3RydWN0IGluNl9hZGRyICopJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzKSwKKwkJICAgICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKKwkJcmV0ID0gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAmc2V0dXAtPnNvdXJjZUNhbGxTaWduYWxBZGRyZXNzLAorCQkJCSAgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUudGNwLnBvcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9mYXN0U3RhcnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNldHVwLT5mYXN0U3RhcnQuY291bnQ7IGkrKykgeworCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAmc2V0dXAtPmZhc3RTdGFydC5pdGVtW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19jYWxscHJvY2VlZGluZyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCQkgIENhbGxQcm9jZWVkaW5nX1VVSUUgKmNhbGxwcm9jKQoreworCWludCByZXQ7CisJaW50IGk7CisKKwlERUJVR1AoIm5mX2N0X3E5MzE6IENhbGxQcm9jZWVkaW5nXG4iKTsKKworCWlmIChjYWxscHJvYy0+b3B0aW9ucyAmIGVDYWxsUHJvY2VlZGluZ19VVUlFX2gyNDVBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmY2FsbHByb2MtPmgyNDVBZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNhbGxwcm9jLT5vcHRpb25zICYgZUNhbGxQcm9jZWVkaW5nX1VVSUVfZmFzdFN0YXJ0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBjYWxscHJvYy0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKKwkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgJmNhbGxwcm9jLT5mYXN0U3RhcnQuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfY29ubmVjdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgQ29ubmVjdF9VVUlFICpjb25uZWN0KQoreworCWludCByZXQ7CisJaW50IGk7CisKKwlERUJVR1AoIm5mX2N0X3E5MzE6IENvbm5lY3RcbiIpOworCisJaWYgKGNvbm5lY3QtPm9wdGlvbnMgJiBlQ29ubmVjdF9VVUlFX2gyNDVBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmY29ubmVjdC0+aDI0NUFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY29ubmVjdC0+b3B0aW9ucyAmIGVDb25uZWN0X1VVSUVfZmFzdFN0YXJ0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0LT5mYXN0U3RhcnQuY291bnQ7IGkrKykgeworCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAmY29ubmVjdC0+ZmFzdFN0YXJ0Lml0ZW1baV0pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2FsZXJ0aW5nKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCSAgICBBbGVydGluZ19VVUlFICphbGVydCkKK3sKKwlpbnQgcmV0OworCWludCBpOworCisJREVCVUdQKCJuZl9jdF9xOTMxOiBBbGVydGluZ1xuIik7CisKKwlpZiAoYWxlcnQtPm9wdGlvbnMgJiBlQWxlcnRpbmdfVVVJRV9oMjQ1QWRkcmVzcykgeworCQlyZXQgPSBleHBlY3RfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgJmFsZXJ0LT5oMjQ1QWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChhbGVydC0+b3B0aW9ucyAmIGVBbGVydGluZ19VVUlFX2Zhc3RTdGFydCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWxlcnQtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICZhbGVydC0+ZmFzdFN0YXJ0Lml0ZW1baV0pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2luZm9ybWF0aW9uKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgICAgIEluZm9ybWF0aW9uX1VVSUUgKmluZm8pCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCURFQlVHUCgibmZfY3RfcTkzMTogSW5mb3JtYXRpb25cbiIpOworCisJaWYgKGluZm8tPm9wdGlvbnMgJiBlSW5mb3JtYXRpb25fVVVJRV9mYXN0U3RhcnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICZpbmZvLT5mYXN0U3RhcnQuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfZmFjaWxpdHkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgIEZhY2lsaXR5X1VVSUUgKmZhY2lsaXR5KQoreworCWludCByZXQ7CisJaW50IGk7CisKKwlERUJVR1AoIm5mX2N0X3E5MzE6IEZhY2lsaXR5XG4iKTsKKworCWlmIChmYWNpbGl0eS0+cmVhc29uLmNob2ljZSA9PSBlRmFjaWxpdHlSZWFzb25fY2FsbEZvcndhcmRlZCkgeworCQlpZiAoZmFjaWxpdHktPm9wdGlvbnMgJiBlRmFjaWxpdHlfVVVJRV9hbHRlcm5hdGl2ZUFkZHJlc3MpCisJCQlyZXR1cm4gZXhwZWN0X2NhbGxmb3J3YXJkaW5nKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJCQkgICAgIGRhdGFvZmYsCisJCQkJCQkgICAgICZmYWNpbGl0eS0+CisJCQkJCQkgICAgIGFsdGVybmF0aXZlQWRkcmVzcyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmYWNpbGl0eS0+b3B0aW9ucyAmIGVGYWNpbGl0eV9VVUlFX2gyNDVBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmZmFjaWxpdHktPmgyNDVBZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZhY2lsaXR5LT5vcHRpb25zICYgZUZhY2lsaXR5X1VVSUVfZmFzdFN0YXJ0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBmYWNpbGl0eS0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKKwkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgJmZhY2lsaXR5LT5mYXN0U3RhcnQuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfcHJvZ3Jlc3Moc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgIFByb2dyZXNzX1VVSUUgKnByb2dyZXNzKQoreworCWludCByZXQ7CisJaW50IGk7CisKKwlERUJVR1AoIm5mX2N0X3E5MzE6IFByb2dyZXNzXG4iKTsKKworCWlmIChwcm9ncmVzcy0+b3B0aW9ucyAmIGVQcm9ncmVzc19VVUlFX2gyNDVBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmcHJvZ3Jlc3MtPmgyNDVBZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHByb2dyZXNzLT5vcHRpb25zICYgZVByb2dyZXNzX1VVSUVfZmFzdFN0YXJ0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBwcm9ncmVzcy0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKKwkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgJnByb2dyZXNzLT5mYXN0U3RhcnQuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfcTkzMShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLCBROTMxICpxOTMxKQoreworCUgzMjNfVVVfUERVICpwZHUgPSAmcTkzMS0+VVVJRS5oMzIzX3V1X3BkdTsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocGR1LT5oMzIzX21lc3NhZ2VfYm9keS5jaG9pY2UpIHsKKwljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9zZXR1cDoKKwkJcmV0ID0gcHJvY2Vzc19zZXR1cChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5zZXR1cCk7CisJCWJyZWFrOworCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2NhbGxQcm9jZWVkaW5nOgorCQlyZXQgPSBwcm9jZXNzX2NhbGxwcm9jZWVkaW5nKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgICAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuCisJCQkJCSAgICAgY2FsbFByb2NlZWRpbmcpOworCQlicmVhazsKKwljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9jb25uZWN0OgorCQlyZXQgPSBwcm9jZXNzX2Nvbm5lY3QocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5jb25uZWN0KTsKKwkJYnJlYWs7CisJY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfYWxlcnRpbmc6CisJCXJldCA9IHByb2Nlc3NfYWxlcnRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICAgICAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuYWxlcnRpbmcpOworCQlicmVhazsKKwljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9pbmZvcm1hdGlvbjoKKwkJcmV0ID0gcHJvY2Vzc19pbmZvcm1hdGlvbihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LgorCQkJCQkgIGluZm9ybWF0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfZmFjaWxpdHk6CisJCXJldCA9IHByb2Nlc3NfZmFjaWxpdHkocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICAgICAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuZmFjaWxpdHkpOworCQlicmVhazsKKwljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9wcm9ncmVzczoKKwkJcmV0ID0gcHJvY2Vzc19wcm9ncmVzcyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5wcm9ncmVzcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUCgibmZfY3RfcTkzMTogUS45MzEgc2lnbmFsICVkXG4iLAorCQkgICAgICAgcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5jaG9pY2UpOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHBkdS0+b3B0aW9ucyAmIGVIMzIzX1VVX1BEVV9oMjQ1Q29udHJvbCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcGR1LT5oMjQ1Q29udHJvbC5jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBwcm9jZXNzX2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAgJnBkdS0+aDI0NUNvbnRyb2wuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHE5MzFfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RhdGljIFE5MzEgcTkzMTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gTlVMTDsKKwlpbnQgZGF0YWxlbjsKKwlpbnQgZGF0YW9mZjsKKwlpbnQgcmV0OworCisJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgorCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgeworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKwlERUJVR1AoIm5mX2N0X3E5MzE6IHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOworCisJc3Bpbl9sb2NrX2JoKCZuZl9oMzIzX2xvY2spOworCisJLyogUHJvY2VzcyBlYWNoIFRQS1QgKi8KKwl3aGlsZSAoZ2V0X3Rwa3RfZGF0YShwc2tiLCBwcm90b2ZmLCBjdCwgY3RpbmZvLAorCQkJICAgICAmZGF0YSwgJmRhdGFsZW4sICZkYXRhb2ZmKSkgeworCQlERUJVR1AoIm5mX2N0X3E5MzE6IFRQS1QgbGVuPSVkICIsIGRhdGFsZW4pOworCQlORl9DVF9EVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0NUSU5GTzJESVIoY3RpbmZvKV0udHVwbGUpOworCisJCS8qIERlY29kZSBRLjkzMSBzaWduYWwgKi8KKwkJcmV0ID0gRGVjb2RlUTkzMShkYXRhLCBkYXRhbGVuLCAmcTkzMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50aygibmZfY3RfcTkzMTogZGVjb2RpbmcgZXJyb3I6ICVzXG4iLAorCQkJCSAgICAgICByZXQgPT0gSDMyM19FUlJPUl9CT1VORCA/CisJCQkJICAgICAgICJvdXQgb2YgYm91bmQiIDogIm91dCBvZiByYW5nZSIpOworCQkJLyogV2UgZG9uJ3QgZHJvcCB3aGVuIGRlY29kaW5nIGVycm9yICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIFByb2Nlc3MgUS45MzEgc2lnbmFsICovCisJCWlmIChwcm9jZXNzX3E5MzEocHNrYiwgY3QsIGN0aW5mbywgJmRhdGEsIGRhdGFvZmYsICZxOTMxKSA8IDApCisJCQlnb3RvIGRyb3A7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJm5mX2gzMjNfbG9jayk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKKworICAgICAgZHJvcDoKKwlzcGluX3VubG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoIm5mX2N0X3E5MzE6IHBhY2tldCBkcm9wcGVkXG4iKTsKKwlyZXR1cm4gTkZfRFJPUDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5uYW1lCQkJPSAiUS45MzEiLAorCQkubWUJCQk9IFRISVNfTU9EVUxFLAorCQkJCQkgIC8qIFQuMTIwIGFuZCBILjI0NSAqLworCQkubWF4X2V4cGVjdGVkCQk9IEgzMjNfUlRQX0NIQU5ORUxfTUFYICogNCArIDQsCisJCS50aW1lb3V0CQk9IDI0MCwKKwkJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQsCisJCS50dXBsZS5zcmMudS50Y3AucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoUTkzMV9QT1JUKSwKKwkJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVENQLAorCQkubWFzay5zcmMubDNudW0JCT0gMHhGRkZGLAorCQkubWFzay5zcmMudS50Y3AucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkJLm1hc2suZHN0LnByb3RvbnVtCT0gMHhGRiwKKwkJLmhlbHAJCQk9IHE5MzFfaGVscAorCX0sCisJeworCQkubmFtZQkJCT0gIlEuOTMxIiwKKwkJLm1lCQkJPSBUSElTX01PRFVMRSwKKwkJCQkJICAvKiBULjEyMCBhbmQgSC4yNDUgKi8KKwkJLm1heF9leHBlY3RlZAkJPSBIMzIzX1JUUF9DSEFOTkVMX01BWCAqIDQgKyA0LAorCQkudGltZW91dAkJPSAyNDAsCisJCS50dXBsZS5zcmMubDNudW0JPSBBRl9JTkVUNiwKKwkJLnR1cGxlLnNyYy51LnRjcC5wb3J0CT0gX19jb25zdGFudF9odG9ucyhROTMxX1BPUlQpLAorCQkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19UQ1AsCisJCS5tYXNrLnNyYy5sM251bQkJPSAweEZGRkYsCisJCS5tYXNrLnNyYy51LnRjcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCQkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCQkuaGVscAkJCT0gcTkzMV9oZWxwCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmdldF91ZHBfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkJCSAgIGludCAqZGF0YWxlbikKK3sKKwlzdHJ1Y3QgdWRwaGRyIF91aCwgKnVoOworCWludCBkYXRhb2ZmOworCisJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIHByb3RvZmYsIHNpemVvZihfdWgpLCAmX3VoKTsKKwlpZiAodWggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGF0YW9mZiA9IHByb3RvZmYgKyBzaXplb2YoX3VoKTsKKwlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pCisJCXJldHVybiBOVUxMOworCSpkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKwlyZXR1cm4gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBkYXRhb2ZmLCAqZGF0YWxlbiwgaDMyM19idWZmZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZmluZF9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCQkgICAgICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsCisJCQkJCSAgICAgICBfX2JlMTYgcG9ydCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CisKKwltZW1zZXQoJnR1cGxlLnNyYy51MywgMCwgc2l6ZW9mKHR1cGxlLnNyYy51MykpOworCXR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKKwltZW1jcHkoJnR1cGxlLmRzdC51MywgYWRkciwgc2l6ZW9mKHR1cGxlLmRzdC51MykpOworCXR1cGxlLmRzdC51LnRjcC5wb3J0ID0gcG9ydDsKKwl0dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKKworCWV4cCA9IF9fbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJaWYgKGV4cCAmJiBleHAtPm1hc3RlciA9PSBjdCkKKwkJcmV0dXJuIGV4cDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHNldF9leHBlY3RfdGltZW91dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAorCQkJICAgICAgdW5zaWduZWQgdGltZW91dCkKK3sKKwlpZiAoIWV4cCB8fCAhZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKQorCQlyZXR1cm4gMDsKKworCWV4cC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQgKiBIWjsKKwlhZGRfdGltZXIoJmV4cC0+dGltZW91dCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGV4cGVjdF9xOTMxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkJICAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBpbnQgY291bnQpCit7CisJc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfaDMyM19pbmZvOworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisJX19iZTE2IHBvcnQ7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgYWRkcjsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXR5cGVvZihuYXRfcTkzMV9ob29rKSBuYXRfcTkzMTsKKworCS8qIExvb2sgZm9yIHRoZSBmaXJzdCByZWxhdGVkIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsICZ0YWRkcltpXSwgJmFkZHIsICZwb3J0KSAmJgorCQkgICAgbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51MywKKwkJICAgIAkgICBzaXplb2YoYWRkcikpID09IDAgJiYgcG9ydCAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gY291bnQpCQkvKiBOb3QgZm91bmQgKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBDcmVhdGUgZXhwZWN0IGZvciBRLjkzMSAqLworCWlmICgoZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKwluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwLCBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5sM251bSwKKwkJCQkgZ2tyb3V0ZWRfb25seSA/IC8qIG9ubHkgYWNjZXB0IGNhbGxzIGZyb20gR0s/ICovCisJCQkJIAkmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMgOgorCQkJCQlOVUxMLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkJIElQUFJPVE9fVENQLCBOVUxMLCAmcG9ydCk7CisJZXhwLT5oZWxwZXIgPSBuZl9jb25udHJhY2tfaGVscGVyX3E5MzE7CisJZXhwLT5mbGFncyA9IE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQ7CS8qIEFjY2VwdCBtdWx0aXBsZSBjYWxscyAqLworCisJbmF0X3E5MzEgPSByY3VfZGVyZWZlcmVuY2UobmF0X3E5MzFfaG9vayk7CisJaWYgKG5hdF9xOTMxICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsJLyogTmVlZCBOQVQgKi8KKwkJcmV0ID0gbmF0X3E5MzEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgdGFkZHIsIGksIHBvcnQsIGV4cCk7CisJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCisJCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7CisJCQlERUJVR1AoIm5mX2N0X3JhczogZXhwZWN0IFEuOTMxICIpOworCQkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisKKwkJCS8qIFNhdmUgcG9ydCBmb3IgbG9va2luZyB1cCBleHBlY3QgaW4gcHJvY2Vzc2luZyBSQ0YgKi8KKwkJCWluZm8tPnNpZ19wb3J0W2Rpcl0gPSBwb3J0OworCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCX0KKworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19ncnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBHYXRla2VlcGVyUmVxdWVzdCAqZ3JxKQoreworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IEdSUVxuIik7CisKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykJLyogTkFUZWQgKi8KKwkJcmV0dXJuIHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICAmZ3JxLT5yYXNBZGRyZXNzLCAxKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfZ2NmKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgR2F0ZWtlZXBlckNvbmZpcm0gKmdjZikKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQgPSAwOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKworCURFQlVHUCgibmZfY3RfcmFzOiBHQ0ZcbiIpOworCisJaWYgKCFnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJmdjZi0+cmFzQWRkcmVzcywgJmFkZHIsICZwb3J0KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWdpc3RyYXRpb24gcG9ydCBpcyB0aGUgc2FtZSBhcyBkaXNjb3ZlcnkgcG9ydCAqLworCWlmICghbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51Mywgc2l6ZW9mKGFkZHIpKSAmJgorCSAgICBwb3J0ID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudS51ZHAucG9ydCkKKwkJcmV0dXJuIDA7CisKKwkvKiBBdm9pZCBSQVMgZXhwZWN0YXRpb24gbG9vcHMuIEEgR0NGIGlzIG5ldmVyIGV4cGVjdGVkLiAqLworCWlmICh0ZXN0X2JpdChJUFNfRVhQRUNURURfQklULCAmY3QtPnN0YXR1cykpCisJCXJldHVybiAwOworCisJLyogTmVlZCBuZXcgZXhwZWN0ICovCisJaWYgKChleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsICZhZGRyLAorCQkJCSBJUFBST1RPX1VEUCwgTlVMTCwgJnBvcnQpOworCWV4cC0+aGVscGVyID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yYXM7CisKKwlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgeworCQlERUJVR1AoIm5mX2N0X3JhczogZXhwZWN0IFJBUyAiKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisJfSBlbHNlCisJCXJldCA9IC0xOworCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX3JycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFJlZ2lzdHJhdGlvblJlcXVlc3QgKnJycSkKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IHJldDsKKwl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKKworCURFQlVHUCgibmZfY3RfcmFzOiBSUlFcbiIpOworCisJcmV0ID0gZXhwZWN0X3E5MzEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCSAgcnJxLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAorCQkJICBycnEtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCisJc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3Jhc19hZGRyICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJcmV0ID0gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgcnJxLT5yYXNBZGRyZXNzLml0ZW0sCisJCQkJICAgcnJxLT5yYXNBZGRyZXNzLmNvdW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJycS0+b3B0aW9ucyAmIGVSZWdpc3RyYXRpb25SZXF1ZXN0X3RpbWVUb0xpdmUpIHsKKwkJREVCVUdQKCJuZl9jdF9yYXM6IFJSUSBUVEwgPSAldSBzZWNvbmRzXG4iLCBycnEtPnRpbWVUb0xpdmUpOworCQlpbmZvLT50aW1lb3V0ID0gcnJxLT50aW1lVG9MaXZlOworCX0gZWxzZQorCQlpbmZvLT50aW1lb3V0ID0gZGVmYXVsdF9ycnFfdHRsOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX3JjZihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFJlZ2lzdHJhdGlvbkNvbmZpcm0gKnJjZikKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0OworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CisKKwlERUJVR1AoIm5mX2N0X3JhczogUkNGXG4iKTsKKworCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJaWYgKHNldF9zaWdfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCXJldCA9IHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCQlyY2YtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkJCXJjZi0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmNmLT5vcHRpb25zICYgZVJlZ2lzdHJhdGlvbkNvbmZpcm1fdGltZVRvTGl2ZSkgeworCQlERUJVR1AoIm5mX2N0X3JhczogUkNGIFRUTCA9ICV1IHNlY29uZHNcbiIsIHJjZi0+dGltZVRvTGl2ZSk7CisJCWluZm8tPnRpbWVvdXQgPSByY2YtPnRpbWVUb0xpdmU7CisJfQorCisJaWYgKGluZm8tPnRpbWVvdXQgPiAwKSB7CisJCURFQlVHUAorCQkgICAgKCJuZl9jdF9yYXM6IHNldCBSQVMgY29ubmVjdGlvbiB0aW1lb3V0IHRvICV1IHNlY29uZHNcbiIsCisJCSAgICAgaW5mby0+dGltZW91dCk7CisJCW5mX2N0X3JlZnJlc2goY3QsICpwc2tiLCBpbmZvLT50aW1lb3V0ICogSFopOworCisJCS8qIFNldCBleHBlY3QgdGltZW91dCAqLworCQlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkJZXhwID0gZmluZF9leHBlY3QoY3QsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LnUzLAorCQkJCSAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCQlpZiAoZXhwKSB7CisJCQlERUJVR1AoIm5mX2N0X3Jhczogc2V0IFEuOTMxIGV4cGVjdCAiCisJCQkgICAgICAgInRpbWVvdXQgdG8gJXUgc2Vjb25kcyBmb3IiLAorCQkJICAgICAgIGluZm8tPnRpbWVvdXQpOworCQkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisJCQlzZXRfZXhwZWN0X3RpbWVvdXQoZXhwLCBpbmZvLT50aW1lb3V0KTsKKwkJfQorCQlyZWFkX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc191cnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBVbnJlZ2lzdHJhdGlvblJlcXVlc3QgKnVycSkKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0OworCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IFVSUVxuIik7CisKKwlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOworCWlmIChzZXRfc2lnX2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQlyZXQgPSBzZXRfc2lnX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICB1cnEtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkJICAgdXJxLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIENsZWFyIG9sZCBleHBlY3QgKi8KKwluZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKGN0KTsKKwlpbmZvLT5zaWdfcG9ydFtkaXJdID0gMDsKKwlpbmZvLT5zaWdfcG9ydFshZGlyXSA9IDA7CisKKwkvKiBHaXZlIGl0IDMwIHNlY29uZHMgZm9yIFVDRiBvciBVUkogKi8KKwluZl9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgMzAgKiBIWik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfYXJxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgQWRtaXNzaW9uUmVxdWVzdCAqYXJxKQoreworCXN0cnVjdCBuZl9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X2gzMjNfaW5mbzsKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJdHlwZW9mKHNldF9oMjI1X2FkZHJfaG9vaykgc2V0X2gyMjVfYWRkcjsKKworCURFQlVHUCgibmZfY3RfcmFzOiBBUlFcbiIpOworCisJc2V0X2gyMjVfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfaDIyNV9hZGRyX2hvb2spOworCWlmICgoYXJxLT5vcHRpb25zICYgZUFkbWlzc2lvblJlcXVlc3RfZGVzdENhbGxTaWduYWxBZGRyZXNzKSAmJgorCSAgICBnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJmFycS0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLAorCSAgICAJCSAgJmFkZHIsICZwb3J0KSAmJgorCSAgICAhbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51Mywgc2l6ZW9mKGFkZHIpKSAmJgorCSAgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0gJiYKKwkgICAgc2V0X2gyMjVfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCS8qIEFuc3dlcmluZyBBUlEgKi8KKwkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwKKwkJCQkgICAgICZhcnEtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKKwkJCQkgICAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgICAgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKKwl9CisKKwlpZiAoKGFycS0+b3B0aW9ucyAmIGVBZG1pc3Npb25SZXF1ZXN0X3NyY0NhbGxTaWduYWxBZGRyZXNzKSAmJgorCSAgICBnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJmFycS0+c3JjQ2FsbFNpZ25hbEFkZHJlc3MsCisJICAgIAkJICAmYWRkciwgJnBvcnQpICYmCisJICAgICFtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLCBzaXplb2YoYWRkcikpICYmCisJICAgIHNldF9oMjI1X2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQkvKiBDYWxsaW5nIEFSUSAqLworCQlyZXR1cm4gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCAwLAorCQkJCSAgICAgJmFycS0+c3JjQ2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkJICAgICBwb3J0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfYWNmKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgQWRtaXNzaW9uQ29uZmlybSAqYWNmKQoreworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IHJldCA9IDA7CisJX19iZTE2IHBvcnQ7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgYWRkcjsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IEFDRlxuIik7CisKKwlpZiAoIWdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmYWNmLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCisJCQkgICAmYWRkciwgJnBvcnQpKQorCQlyZXR1cm4gMDsKKworCWlmICghbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51Mywgc2l6ZW9mKGFkZHIpKSkgeworCQkvKiBBbnN3ZXJpbmcgQUNGICovCisJCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJCWlmIChzZXRfc2lnX2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJCXJldHVybiBzZXRfc2lnX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkJICAgICZhY2YtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywgMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5lZWQgbmV3IGV4cGVjdCAqLworCWlmICgoZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKwluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwLCBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5sM251bSwKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLCAmYWRkciwKKwkJCQkgSVBQUk9UT19UQ1AsIE5VTEwsICZwb3J0KTsKKwlleHAtPmZsYWdzID0gTkZfQ1RfRVhQRUNUX1BFUk1BTkVOVDsKKwlleHAtPmhlbHBlciA9IG5mX2Nvbm50cmFja19oZWxwZXJfcTkzMTsKKworCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7CisJCURFQlVHUCgibmZfY3RfcmFzOiBleHBlY3QgUS45MzEgIik7CisJCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOworCX0gZWxzZQorCQlyZXQgPSAtMTsKKworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19scnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBMb2NhdGlvblJlcXVlc3QgKmxycSkKK3sKKwl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKKworCURFQlVHUCgibmZfY3RfcmFzOiBMUlFcbiIpOworCisJc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3Jhc19hZGRyICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCXJldHVybiBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAgJmxycS0+cmVwbHlBZGRyZXNzLCAxKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfbGNmKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgTG9jYXRpb25Db25maXJtICpsY2YpCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0ID0gMDsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisKKwlERUJVR1AoIm5mX2N0X3JhczogTENGXG4iKTsKKworCWlmICghZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsICZsY2YtPmNhbGxTaWduYWxBZGRyZXNzLAorCQkJICAgJmFkZHIsICZwb3J0KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBOZWVkIG5ldyBleHBlY3QgZm9yIGNhbGwgc2lnbmFsICovCisJaWYgKChleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsICZhZGRyLAorCQkJCSBJUFBST1RPX1RDUCwgTlVMTCwgJnBvcnQpOworCWV4cC0+ZmxhZ3MgPSBORl9DVF9FWFBFQ1RfUEVSTUFORU5UOworCWV4cC0+aGVscGVyID0gbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxOworCisJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKKwkJREVCVUdQKCJuZl9jdF9yYXM6IGV4cGVjdCBRLjkzMSAiKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisJfSBlbHNlCisJCXJldCA9IC0xOworCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCS8qIElnbm9yZSByYXNBZGRyZXNzICovCisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19pcnIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBJbmZvUmVxdWVzdFJlc3BvbnNlICppcnIpCit7CisJaW50IHJldDsKKwl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKKwl0eXBlb2Yoc2V0X3NpZ19hZGRyX2hvb2spIHNldF9zaWdfYWRkcjsKKworCURFQlVHUCgibmZfY3RfcmFzOiBJUlJcbiIpOworCisJc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3Jhc19hZGRyICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJcmV0ID0gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJmlyci0+cmFzQWRkcmVzcywgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJaWYgKHNldF9zaWdfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCXJldCA9IHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCQlpcnItPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkJCWlyci0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfcmFzKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgUmFzTWVzc2FnZSAqcmFzKQoreworCXN3aXRjaCAocmFzLT5jaG9pY2UpIHsKKwljYXNlIGVSYXNNZXNzYWdlX2dhdGVrZWVwZXJSZXF1ZXN0OgorCQlyZXR1cm4gcHJvY2Vzc19ncnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT5nYXRla2VlcGVyUmVxdWVzdCk7CisJY2FzZSBlUmFzTWVzc2FnZV9nYXRla2VlcGVyQ29uZmlybToKKwkJcmV0dXJuIHByb2Nlc3NfZ2NmKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+Z2F0ZWtlZXBlckNvbmZpcm0pOworCWNhc2UgZVJhc01lc3NhZ2VfcmVnaXN0cmF0aW9uUmVxdWVzdDoKKwkJcmV0dXJuIHByb2Nlc3NfcnJxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+cmVnaXN0cmF0aW9uUmVxdWVzdCk7CisJY2FzZSBlUmFzTWVzc2FnZV9yZWdpc3RyYXRpb25Db25maXJtOgorCQlyZXR1cm4gcHJvY2Vzc19yY2YocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT5yZWdpc3RyYXRpb25Db25maXJtKTsKKwljYXNlIGVSYXNNZXNzYWdlX3VucmVnaXN0cmF0aW9uUmVxdWVzdDoKKwkJcmV0dXJuIHByb2Nlc3NfdXJxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+dW5yZWdpc3RyYXRpb25SZXF1ZXN0KTsKKwljYXNlIGVSYXNNZXNzYWdlX2FkbWlzc2lvblJlcXVlc3Q6CisJCXJldHVybiBwcm9jZXNzX2FycShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZyYXMtPmFkbWlzc2lvblJlcXVlc3QpOworCWNhc2UgZVJhc01lc3NhZ2VfYWRtaXNzaW9uQ29uZmlybToKKwkJcmV0dXJuIHByb2Nlc3NfYWNmKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+YWRtaXNzaW9uQ29uZmlybSk7CisJY2FzZSBlUmFzTWVzc2FnZV9sb2NhdGlvblJlcXVlc3Q6CisJCXJldHVybiBwcm9jZXNzX2xycShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZyYXMtPmxvY2F0aW9uUmVxdWVzdCk7CisJY2FzZSBlUmFzTWVzc2FnZV9sb2NhdGlvbkNvbmZpcm06CisJCXJldHVybiBwcm9jZXNzX2xjZihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZyYXMtPmxvY2F0aW9uQ29uZmlybSk7CisJY2FzZSBlUmFzTWVzc2FnZV9pbmZvUmVxdWVzdFJlc3BvbnNlOgorCQlyZXR1cm4gcHJvY2Vzc19pcnIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT5pbmZvUmVxdWVzdFJlc3BvbnNlKTsKKwlkZWZhdWx0OgorCQlERUJVR1AoIm5mX2N0X3JhczogUkFTIG1lc3NhZ2UgJWRcbiIsIHJhcy0+Y2hvaWNlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCByYXNfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgICAgc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdGF0aWMgUmFzTWVzc2FnZSByYXM7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgZGF0YWxlbiA9IDA7CisJaW50IHJldDsKKworCURFQlVHUCgibmZfY3RfcmFzOiBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKKworCXNwaW5fbG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKworCS8qIEdldCBVRFAgZGF0YSAqLworCWRhdGEgPSBnZXRfdWRwX2RhdGEocHNrYiwgcHJvdG9mZiwgJmRhdGFsZW4pOworCWlmIChkYXRhID09IE5VTEwpCisJCWdvdG8gYWNjZXB0OworCURFQlVHUCgibmZfY3RfcmFzOiBSQVMgbWVzc2FnZSBsZW49JWQgIiwgZGF0YWxlbik7CisJTkZfQ1RfRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtDVElORk8yRElSKGN0aW5mbyldLnR1cGxlKTsKKworCS8qIERlY29kZSBSQVMgbWVzc2FnZSAqLworCXJldCA9IERlY29kZVJhc01lc3NhZ2UoZGF0YSwgZGF0YWxlbiwgJnJhcyk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygibmZfY3RfcmFzOiBkZWNvZGluZyBlcnJvcjogJXNcbiIsCisJCQkgICAgICAgcmV0ID09IEgzMjNfRVJST1JfQk9VTkQgPworCQkJICAgICAgICJvdXQgb2YgYm91bmQiIDogIm91dCBvZiByYW5nZSIpOworCQlnb3RvIGFjY2VwdDsKKwl9CisKKwkvKiBQcm9jZXNzIFJBUyBtZXNzYWdlICovCisJaWYgKHByb2Nlc3NfcmFzKHBza2IsIGN0LCBjdGluZm8sICZkYXRhLCAmcmFzKSA8IDApCisJCWdvdG8gZHJvcDsKKworICAgICAgYWNjZXB0OgorCXNwaW5fdW5sb2NrX2JoKCZuZl9oMzIzX2xvY2spOworCXJldHVybiBORl9BQ0NFUFQ7CisKKyAgICAgIGRyb3A6CisJc3Bpbl91bmxvY2tfYmgoJm5mX2gzMjNfbG9jayk7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKCJuZl9jdF9yYXM6IHBhY2tldCBkcm9wcGVkXG4iKTsKKwlyZXR1cm4gTkZfRFJPUDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgbmZfY29ubnRyYWNrX2hlbHBlcl9yYXNbXSBfX3JlYWRfbW9zdGx5ID0geworCXsKKwkJLm5hbWUJCQk9ICJSQVMiLAorCQkubWUJCQk9IFRISVNfTU9EVUxFLAorCQkubWF4X2V4cGVjdGVkCQk9IDMyLAorCQkudGltZW91dAkJPSAyNDAsCisJCS50dXBsZS5zcmMubDNudW0JPSBBRl9JTkVULAorCQkudHVwbGUuc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKFJBU19QT1JUKSwKKwkJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVURQLAorCQkubWFzay5zcmMubDNudW0JCT0gMHhGRkZGLAorCQkubWFzay5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkJLm1hc2suZHN0LnByb3RvbnVtCT0gMHhGRiwKKwkJLmhlbHAJCQk9IHJhc19oZWxwLAorCX0sCisJeworCQkubmFtZQkJCT0gIlJBUyIsCisJCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJCS5tYXhfZXhwZWN0ZWQJCT0gMzIsCisJCS50aW1lb3V0CQk9IDI0MCwKKwkJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQ2LAorCQkudHVwbGUuc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKFJBU19QT1JUKSwKKwkJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVURQLAorCQkubWFzay5zcmMubDNudW0JCT0gMHhGRkZGLAorCQkubWFzay5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkJLm1hc2suZHN0LnByb3RvbnVtCT0gMHhGRiwKKwkJLmhlbHAJCQk9IHJhc19oZWxwLAorCX0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBuZl9jb25udHJhY2tfaDMyM19maW5pKHZvaWQpCit7CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3Jhc1sxXSk7CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3Jhc1swXSk7CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3E5MzFbMV0pOworCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxWzBdKTsKKwlrZnJlZShoMzIzX2J1ZmZlcik7CisJREVCVUdQKCJuZl9jdF9oMzIzOiBmaW5pXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfaDMyM19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWgzMjNfYnVmZmVyID0ga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoMzIzX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIxOworCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcTkzMVsxXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMjsKKwlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3Jhc1swXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMzsKKwlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3Jhc1sxXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyNDsKKwlERUJVR1AoIm5mX2N0X2gzMjM6IGluaXQgc3VjY2Vzc1xuIik7CisJcmV0dXJuIDA7CisKK2VycjQ6CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3Jhc1swXSk7CitlcnIzOgorCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxWzFdKTsKK2VycjI6CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3E5MzFbMF0pOworZXJyMToKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9pbml0KG5mX2Nvbm50cmFja19oMzIzX2luaXQpOworbW9kdWxlX2V4aXQobmZfY29ubnRyYWNrX2gzMjNfZmluaSk7CisKK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9oMjI1X2FkZHIpOworRVhQT1JUX1NZTUJPTF9HUEwoc2V0X2gyNDVfYWRkcl9ob29rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9oMjI1X2FkZHJfaG9vayk7CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfc2lnX2FkZHJfaG9vayk7CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfcmFzX2FkZHJfaG9vayk7CitFWFBPUlRfU1lNQk9MX0dQTChuYXRfcnRwX3J0Y3BfaG9vayk7CitFWFBPUlRfU1lNQk9MX0dQTChuYXRfdDEyMF9ob29rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5hdF9oMjQ1X2hvb2spOworRVhQT1JUX1NZTUJPTF9HUEwobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spOworRVhQT1JUX1NZTUJPTF9HUEwobmF0X3E5MzFfaG9vayk7CisKK01PRFVMRV9BVVRIT1IoIkppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSC4zMjMgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX2gzMjMiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfdHlwZXMuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX3R5cGVzLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfdHlwZXMuYwppbmRleCA0YjM1OTYxLi40YzZmOGIzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX3R5cGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM190eXBlcy5jCkBAIC0zNiw3ICszNiw4IEBACiB9OwogCiBzdGF0aWMgZmllbGRfdCBfVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJpcCIpIE9DVFNUUiwgRklYRCwgMTYsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaXAiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBERUNPREUsCisJIG9mZnNldG9mKFRyYW5zcG9ydEFkZHJlc3NfaXA2QWRkcmVzcywgaXA2KSwgTlVMTH0sCiAJe0ZOQU1FKCJwb3J0IikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKIH07CiAKQEAgLTY1LDggKzY2LDggQEAKIAkgX1RyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZX0sCiAJe0ZOQU1FKCJpcHhBZGRyZXNzIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAogCSBfVHJhbnNwb3J0QWRkcmVzc19pcHhBZGRyZXNzfSwKLQl7Rk5BTUUoImlwNkFkZHJlc3MiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCi0JIF9UcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3N9LAorCXtGTkFNRSgiaXA2QWRkcmVzcyIpIFNFUSwgMCwgMiwgMiwgREVDT0RFIHwgRVhULAorCW9mZnNldG9mKFRyYW5zcG9ydEFkZHJlc3MsIGlwNkFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzfSwKIAl7Rk5BTUUoIm5ldEJpb3MiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKIAl7Rk5BTUUoIm5zYXAiKSBPQ1RTVFIsIDUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAogCXtGTkFNRSgibm9uU3RhbmRhcmRBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQzYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIEhlbHBlciBoYW5kbGluZyBmb3IgbmV0ZmlsdGVyLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKiAoQykgMjAwMywyMDA0IFVTQUdJL1dJREUgUHJvamVjdCA8aHR0cDovL3d3dy5saW51eC1pcHY2Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorCitzdGF0aWMgX19yZWFkX21vc3RseSBMSVNUX0hFQUQoaGVscGVycyk7CisKK3N0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKK19fbmZfY3RfaGVscGVyX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmg7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZoZWxwZXJzLCBsaXN0KSB7CisJCWlmIChuZl9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmgtPnR1cGxlLCAmaC0+bWFzaykpCisJCQlyZXR1cm4gaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKK25mX2N0X2hlbHBlcl9maW5kX2dldCggY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKKworCS8qIG5lZWQgbmZfY29ubnRyYWNrX2xvY2sgdG8gYXNzdXJlIHRoYXQgaGVscGVyIGV4aXN0cyB1bnRpbAorCSAqIHRyeV9tb2R1bGVfZ2V0KCkgaXMgY2FsbGVkICovCisJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwloZWxwZXIgPSBfX25mX2N0X2hlbHBlcl9maW5kKHR1cGxlKTsKKwlpZiAoaGVscGVyKSB7CisJCS8qIG5lZWQgdG8gaW5jcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50IHRvIGFzc3VyZSBoZWxwZXIgd2lsbAorCQkgKiBub3QgZ28gYXdheSB3aGlsZSB0aGUgY2FsbGVyIGlzIGUuZy4gYnVzeSBwdXR0aW5nIGEKKwkJICogY29ubnRyYWNrIGluIHRoZSBoYXNoIHRoYXQgdXNlcyB0aGUgaGVscGVyICovCisJCWlmICghdHJ5X21vZHVsZV9nZXQoaGVscGVyLT5tZSkpCisJCQloZWxwZXIgPSBOVUxMOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwlyZXR1cm4gaGVscGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfaGVscGVyX2ZpbmRfZ2V0KTsKKwordm9pZCBuZl9jdF9oZWxwZXJfcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICpoZWxwZXIpCit7CisJbW9kdWxlX3B1dChoZWxwZXItPm1lKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2hlbHBlcl9wdXQpOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqCitfX25mX2Nvbm50cmFja19oZWxwZXJfZmluZF9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmhlbHBlcnMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAoaC0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gaDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHVuaGVscChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmksCisJCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lKQoreworCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaSk7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CisKKwlpZiAoaGVscCAmJiBoZWxwLT5oZWxwZXIgPT0gbWUpIHsKKwkJbmZfY29ubnRyYWNrX2V2ZW50KElQQ1RfSEVMUEVSLCBjdCk7CisJCWhlbHAtPmhlbHBlciA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqbWUpCit7CisJaW50IHNpemUsIHJldDsKKworCUJVR19PTihtZS0+dGltZW91dCA9PSAwKTsKKworCXNpemUgPSBBTElHTihzaXplb2Yoc3RydWN0IG5mX2Nvbm4pLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY29ubl9oZWxwKSkgKworCSAgICAgICBzaXplb2Yoc3RydWN0IG5mX2Nvbm5faGVscCk7CisJcmV0ID0gbmZfY29ubnRyYWNrX3JlZ2lzdGVyX2NhY2hlKE5GX0NUX0ZfSEVMUCwgIm5mX2Nvbm50cmFjazpoZWxwIiwKKwkJCQkJICBzaXplKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXI6IFVuYWJsZSB0byBjcmVhdGUgc2xhYiBjYWNoZSBmb3IgY29ubnRyYWNrc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlsaXN0X2FkZCgmbWUtPmxpc3QsICZoZWxwZXJzKTsKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcik7CisKK3ZvaWQgbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICptZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKnRtcDsKKworCS8qIE5lZWQgd3JpdGUgbG9jayBoZXJlLCB0byBkZWxldGUgaGVscGVyLiAqLworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlsaXN0X2RlbCgmbWUtPmxpc3QpOworCisJLyogR2V0IHJpZCBvZiBleHBlY3RhdGlvbnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXhwLCB0bXAsICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChleHAtPm1hc3Rlcik7CisJCWlmICgoaGVscC0+aGVscGVyID09IG1lIHx8IGV4cC0+aGVscGVyID09IG1lKSAmJgorCQkgICAgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7CisJCQluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCQl9CisJfQorCisJLyogR2V0IHJpZCBvZiBleHBlY3RlZHMsIHNldCBoZWxwZXJzIHRvIE5VTEwuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmdW5jb25maXJtZWQsIGxpc3QpCisJCXVuaGVscChoLCBtZSk7CisJZm9yIChpID0gMDsgaSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJm5mX2Nvbm50cmFja19oYXNoW2ldLCBsaXN0KQorCQkJdW5oZWxwKGgsIG1lKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwkvKiBTb21lb25lIGNvdWxkIGJlIHN0aWxsIGxvb2tpbmcgYXQgdGhlIGhlbHBlciBpbiBhIGJoLiAqLworCXN5bmNocm9uaXplX25ldCgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMWRiNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5jCkBAIC0wLDAgKzEsMjgxIEBACisvKiBJUkMgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nLCBWZXJzaW9uIDEuMjEKKyAqIChDKSAyMDAwLTIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIGJhc2VkIG9uIFJSJ3MgaXBfY29ubnRyYWNrX2Z0cC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5oPgorCisjZGVmaW5lIE1BWF9QT1JUUyA4CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbTUFYX1BPUlRTXTsKK3N0YXRpYyBpbnQgcG9ydHNfYzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RjY19jaGFubmVscyA9IDg7CitzdGF0aWMgdW5zaWduZWQgaW50IGRjY190aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMDA7CisvKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCdzIHNpbXBsZS4gLS1SUiAqLworc3RhdGljIGNoYXIgKmlyY19idWZmZXI7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlyY19idWZmZXJfbG9jayk7CisKK3Vuc2lnbmVkIGludCAoKm5mX25hdF9pcmNfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCXVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9pcmNfaG9vayk7CisKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUkMgKERDQykgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX2lyYyIpOworCittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgInBvcnQgbnVtYmVycyBvZiBJUkMgc2VydmVycyIpOworbW9kdWxlX3BhcmFtKG1heF9kY2NfY2hhbm5lbHMsIHVpbnQsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGNjX2NoYW5uZWxzLCAibWF4IG51bWJlciBvZiBleHBlY3RlZCBEQ0MgY2hhbm5lbHMgcGVyICIKKwkJCQkgICAiSVJDIHNlc3Npb24iKTsKK21vZHVsZV9wYXJhbShkY2NfdGltZW91dCwgdWludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRjY190aW1lb3V0LCAidGltZW91dCBvbiBmb3IgdW5lc3RhYmxpc2hlZCBEQ0MgY2hhbm5lbHMiKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRjY3Byb3Rvc1tdID0geworCSJTRU5EICIsICJDSEFUICIsICJNT1ZFICIsICJUU0VORCAiLCAiU0NIQVQgIgorfTsKKworI2RlZmluZSBNSU5NQVRDSExFTgk1CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczolczoiIGZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIHRyaWVzIHRvIGdldCB0aGUgaXBfYWRkciBhbmQgcG9ydCBvdXQgb2YgYSBkY2MgY29tbWFuZAorICogcmV0dXJuIHZhbHVlOiAtMSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MKKyAqCWRhdGEJCXBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBEQ0MgY29tbWFuZCBkYXRhCisgKglkYXRhX2VuZAlwb2ludGVyIHRvIGxhc3QgYnl0ZSBvZiBkY2MgY29tbWFuZCBkYXRhCisgKglpcAkJcmV0dXJucyBwYXJzZWQgaXAgb2YgZGNjIGNvbW1hbmQKKyAqCXBvcnQJCXJldHVybnMgcGFyc2VkIHBvcnQgb2YgZGNjIGNvbW1hbmQKKyAqCWFkX2JlZ19wCXJldHVybnMgcG9pbnRlciB0byBmaXJzdCBieXRlIG9mIGFkZHIgZGF0YQorICoJYWRfZW5kX3AJcmV0dXJucyBwb2ludGVyIHRvIGxhc3QgYnl0ZSBvZiBhZGRyIGRhdGEKKyAqLworc3RhdGljIGludCBwYXJzZV9kY2MoY2hhciAqZGF0YSwgY2hhciAqZGF0YV9lbmQsIHVfaW50MzJfdCAqaXAsCisJCSAgICAgdV9pbnQxNl90ICpwb3J0LCBjaGFyICoqYWRfYmVnX3AsIGNoYXIgKiphZF9lbmRfcCkKK3sKKwkvKiBhdCBsZWFzdCAxMjogIkFBQUFBQUFBIFBcMVxuIiAqLworCXdoaWxlICgqZGF0YSsrICE9ICcgJykKKwkJaWYgKGRhdGEgPiBkYXRhX2VuZCAtIDEyKQorCQkJcmV0dXJuIC0xOworCisJKmFkX2JlZ19wID0gZGF0YTsKKwkqaXAgPSBzaW1wbGVfc3RydG91bChkYXRhLCAmZGF0YSwgMTApOworCisJLyogc2tpcCBibGFua3MgYmV0d2VlbiBpcCBhbmQgcG9ydCAqLworCXdoaWxlICgqZGF0YSA9PSAnICcpIHsKKwkJaWYgKGRhdGEgPj0gZGF0YV9lbmQpCisJCQlyZXR1cm4gLTE7CisJCWRhdGErKzsKKwl9CisKKwkqcG9ydCA9IHNpbXBsZV9zdHJ0b3VsKGRhdGEsICZkYXRhLCAxMCk7CisJKmFkX2VuZF9wID0gZGF0YTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YW9mZjsKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJY2hhciAqZGF0YSwgKmRhdGFfbGltaXQsICppYl9wdHI7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlOworCXVfaW50MzJfdCBkY2NfaXA7CisJdV9pbnQxNl90IGRjY19wb3J0OworCV9fYmUxNiBwb3J0OworCWludCBpLCByZXQgPSBORl9BQ0NFUFQ7CisJY2hhciAqYWRkcl9iZWdfcCwgKmFkZHJfZW5kX3A7CisJdHlwZW9mKG5mX25hdF9pcmNfaG9vaykgbmZfbmF0X2lyYzsKKworCS8qIElmIHBhY2tldCBpcyBjb21pbmcgZnJvbSBJUkMgc2VydmVyICovCisJaWYgKGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogTm90IGEgZnVsbCB0Y3AgaGVhZGVyPyAqLworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogTm8gZGF0YT8gKi8KKwlkYXRhb2ZmID0gcHJvdG9mZiArIHRoLT5kb2ZmKjQ7CisJaWYgKGRhdGFvZmYgPj0gKCpwc2tiKS0+bGVuKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJc3Bpbl9sb2NrX2JoKCZpcmNfYnVmZmVyX2xvY2spOworCWliX3B0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgZGF0YW9mZiwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKKwkJCQkgICAgaXJjX2J1ZmZlcik7CisJQlVHX09OKGliX3B0ciA9PSBOVUxMKTsKKworCWRhdGEgPSBpYl9wdHI7CisJZGF0YV9saW1pdCA9IGliX3B0ciArICgqcHNrYiktPmxlbiAtIGRhdGFvZmY7CisKKwkvKiBzdHJsZW4oIlwxRENDIFNFTlQgdCBBQUFBQUFBQSBQXDFcbiIpPTI0CisJICogNStNSU5NQVRDSExFTitzdHJsZW4oInQgQUFBQUFBQUEgUFwxXG4iKT0xNCAqLworCXdoaWxlIChkYXRhIDwgZGF0YV9saW1pdCAtICgxOSArIE1JTk1BVENITEVOKSkgeworCQlpZiAobWVtY21wKGRhdGEsICJcMURDQyAiLCA1KSkgeworCQkJZGF0YSsrOworCQkJY29udGludWU7CisJCX0KKwkJZGF0YSArPSA1OworCQkvKiB3ZSBoYXZlIGF0IGxlYXN0ICgxOStNSU5NQVRDSExFTiktNSBieXRlcyB2YWxpZCBkYXRhIGxlZnQgKi8KKworCQlERUJVR1AoIkRDQyBmb3VuZCBpbiBtYXN0ZXIgJXUuJXUuJXUuJXU6JXUgJXUuJXUuJXUuJXU6JXUuLi5cbiIsCisJCQlOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCU5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGNjcHJvdG9zKTsgaSsrKSB7CisJCQlpZiAobWVtY21wKGRhdGEsIGRjY3Byb3Rvc1tpXSwgc3RybGVuKGRjY3Byb3Rvc1tpXSkpKSB7CisJCQkJLyogbm8gbWF0Y2ggKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRhdGEgKz0gc3RybGVuKGRjY3Byb3Rvc1tpXSk7CisJCQlERUJVR1AoIkRDQyAlcyBkZXRlY3RlZFxuIiwgZGNjcHJvdG9zW2ldKTsKKworCQkJLyogd2UgaGF2ZSBhdCBsZWFzdAorCQkJICogKDE5K01JTk1BVENITEVOKS01LWRjY3Byb3Rvc1tpXS5tYXRjaGxlbiBieXRlcyB2YWxpZAorCQkJICogZGF0YSBsZWZ0ICg9PSAxNC8xMyBieXRlcykgKi8KKwkJCWlmIChwYXJzZV9kY2MoKGNoYXIgKilkYXRhLCBkYXRhX2xpbWl0LCAmZGNjX2lwLAorCQkJCSAgICAgICAmZGNjX3BvcnQsICZhZGRyX2JlZ19wLCAmYWRkcl9lbmRfcCkpIHsKKwkJCQlERUJVR1AoInVuYWJsZSB0byBwYXJzZSBkY2MgY29tbWFuZFxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlERUJVR1AoIkRDQyBib3VuZCBpcC9wb3J0OiAldS4ldS4ldS4ldToldVxuIiwKKwkJCQlISVBRVUFEKGRjY19pcCksIGRjY19wb3J0KTsKKworCQkJLyogZGNjX2lwIGNhbiBiZSB0aGUgaW50ZXJuYWwgT1IgZXh0ZXJuYWwgKE5BVCdlZCkgSVAgKi8KKwkJCXR1cGxlID0gJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZTsKKwkJCWlmICh0dXBsZS0+c3JjLnUzLmlwICE9IGh0b25sKGRjY19pcCkgJiYKKwkJCSAgICB0dXBsZS0+ZHN0LnUzLmlwICE9IGh0b25sKGRjY19pcCkpIHsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkiRm9yZ2VkIERDQyBjb21tYW5kIGZyb20gIgorCQkJCQkJIiV1LiV1LiV1LiV1OiAldS4ldS4ldS4ldToldVxuIiwKKwkJCQkJCU5JUFFVQUQodHVwbGUtPnNyYy51My5pcCksCisJCQkJCQlISVBRVUFEKGRjY19pcCksIGRjY19wb3J0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CisJCQlpZiAoZXhwID09IE5VTEwpIHsKKwkJCQlyZXQgPSBORl9EUk9QOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZTsKKwkJCXBvcnQgPSBodG9ucyhkY2NfcG9ydCk7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwLCB0dXBsZS0+c3JjLmwzbnVtLAorCQkJCQkJIE5VTEwsICZ0dXBsZS0+ZHN0LnUzLAorCQkJCQkJIElQUFJPVE9fVENQLCBOVUxMLCAmcG9ydCk7CisKKwkJCW5mX25hdF9pcmMgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X2lyY19ob29rKTsKKwkJCWlmIChuZl9uYXRfaXJjICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCQkJcmV0ID0gbmZfbmF0X2lyYyhwc2tiLCBjdGluZm8sCisJCQkJCQkgYWRkcl9iZWdfcCAtIGliX3B0ciwKKwkJCQkJCSBhZGRyX2VuZF9wIC0gYWRkcl9iZWdfcCwKKwkJCQkJCSBleHApOworCQkJZWxzZSBpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKKwkJCQlyZXQgPSBORl9EUk9QOworCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorIG91dDoKKwlzcGluX3VubG9ja19iaCgmaXJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgaXJjW01BWF9QT1JUU10gX19yZWFkX21vc3RseTsKK3N0YXRpYyBjaGFyIGlyY19uYW1lc1tNQVhfUE9SVFNdW3NpemVvZigiaXJjLTY1NTM1IildIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19pcmNfZmluaSh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX2lyY19pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKwljaGFyICp0bXBuYW1lOworCisJaWYgKG1heF9kY2NfY2hhbm5lbHMgPCAxKSB7CisJCXByaW50aygibmZfY3RfaXJjOiBtYXhfZGNjX2NoYW5uZWxzIG11c3Qgbm90IGJlIHplcm9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcmNfYnVmZmVyID0ga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcmNfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIElmIG5vIHBvcnQgZ2l2ZW4sIGRlZmF1bHQgdG8gc3RhbmRhcmQgaXJjIHBvcnQgKi8KKwlpZiAocG9ydHNfYyA9PSAwKQorCQlwb3J0c1twb3J0c19jKytdID0gSVJDX1BPUlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7CisJCWlyY1tpXS50dXBsZS5zcmMubDNudW0gPSBBRl9JTkVUOworCQlpcmNbaV0udHVwbGUuc3JjLnUudGNwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CisJCWlyY1tpXS50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKKwkJaXJjW2ldLm1hc2suc3JjLmwzbnVtID0gMHhGRkZGOworCQlpcmNbaV0ubWFzay5zcmMudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7CisJCWlyY1tpXS5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisJCWlyY1tpXS5tYXhfZXhwZWN0ZWQgPSBtYXhfZGNjX2NoYW5uZWxzOworCQlpcmNbaV0udGltZW91dCA9IGRjY190aW1lb3V0OworCQlpcmNbaV0ubWUgPSBUSElTX01PRFVMRTsKKwkJaXJjW2ldLmhlbHAgPSBoZWxwOworCisJCXRtcG5hbWUgPSAmaXJjX25hbWVzW2ldWzBdOworCQlpZiAocG9ydHNbaV0gPT0gSVJDX1BPUlQpCisJCQlzcHJpbnRmKHRtcG5hbWUsICJpcmMiKTsKKwkJZWxzZQorCQkJc3ByaW50Zih0bXBuYW1lLCAiaXJjLSV1IiwgaSk7CisJCWlyY1tpXS5uYW1lID0gdG1wbmFtZTsKKworCQlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZpcmNbaV0pOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoIm5mX2N0X2lyYzogZmFpbGVkIHRvIHJlZ2lzdGVyIGhlbHBlciAiCisJCQkgICAgICAgImZvciBwZjogJXUgcG9ydDogJXVcbiIsCisJCQkgICAgICAgaXJjW2ldLnR1cGxlLnNyYy5sM251bSwgcG9ydHNbaV0pOworCQkJbmZfY29ubnRyYWNrX2lyY19maW5pKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVudGlvbmFsbHkgX05PVF8gZGVmaW5lZCBhcyBfX2V4aXQsIGJlY2F1c2UKKyAqIGl0IGlzIG5lZWRlZCBieSB0aGUgaW5pdCBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX2lyY19maW5pKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKQorCQluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmlyY1tpXSk7CisJa2ZyZWUoaXJjX2J1ZmZlcik7Cit9CisKK21vZHVsZV9pbml0KG5mX2Nvbm50cmFja19pcmNfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfaXJjX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMuYwppbmRleCAyMWUwYmM5Li5hM2QzMWMzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMuYwpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0Lmg+CkBAIC0zNyw4ICszNyw2IEBACiAjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCiAjZW5kaWYKIAotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBuZl9jb25udHJhY2tfc3RhdCwgbmZfY29ubnRyYWNrX3N0YXQpOwotCiBzdGF0aWMgaW50IGdlbmVyaWNfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBuaG9mZiwKIAkJCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKQEAgLTg0LDcgKzgyLDcgQEAKIAlyZXR1cm4gTkZfQ1RfRl9CQVNJQzsKIH0KIAotc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvIG5mX2Nvbm50cmFja19nZW5lcmljX2wzcHJvdG8gPSB7CitzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYyA9IHsKIAkubDNwcm90bwkgPSBQRl9VTlNQRUMsCiAJLm5hbWUJCSA9ICJ1bmtub3duIiwKIAkucGt0X3RvX3R1cGxlCSA9IGdlbmVyaWNfcGt0X3RvX3R1cGxlLApAQCAtOTQsMyArOTIsNCBAQAogCS5wcmVwYXJlCSA9IGdlbmVyaWNfcHJlcGFyZSwKIAkuZ2V0X2ZlYXR1cmVzCSA9IGdlbmVyaWNfZ2V0X2ZlYXR1cmVzLAogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0Ymlvc19ucy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0Ymlvc19ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YjIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRiaW9zX25zLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAgICAgIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIGJyb2FkY2FzdCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcgorICoKKyAqICAgICAgKGMpIDIwMDUgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisvKgorICogICAgICBUaGlzIGhlbHBlciB0cmFja3MgbG9jYWxseSBvcmlnaW5hdGluZyBOZXRCSU9TIG5hbWUgc2VydmljZQorICogICAgICByZXF1ZXN0cyBieSBpc3N1aW5nIHBlcm1hbmVudCBleHBlY3RhdGlvbnMgKHZhbGlkIHVudGlsCisgKiAgICAgIHRpbWluZyBvdXQpIG1hdGNoaW5nIGFsbCByZXBseSBjb25uZWN0aW9ucyBmcm9tIHRoZQorICogICAgICBkZXN0aW5hdGlvbiBuZXR3b3JrLiBUaGUgb25seSBOZXRCSU9TIHNwZWNpZmljIHRoaW5nIGlzCisgKiAgICAgIGFjdHVhbGx5IHRoZSBwb3J0IG51bWJlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisKKyNkZWZpbmUgTk1CRF9QT1JUCTEzNworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmV0QklPUyBuYW1lIHNlcnZpY2UgYnJvYWRjYXN0IGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja19uZXRiaW9zX25zIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCB1aW50LCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInRpbWVvdXQgZm9yIG1hc3RlciBjb25uZWN0aW9uL3JlcGxpZXMgaW4gc2Vjb25kcyIpOworCitzdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSgqcHNrYiktPmRzdDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJX19iZTMyIG1hc2sgPSAwOworCisJLyogd2UncmUgb25seSBpbnRlcmVzdGVkIGluIGxvY2FsbHkgZ2VuZXJhdGVkIHBhY2tldHMgKi8KKwlpZiAoKCpwc2tiKS0+c2sgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKHJ0ID09IE5VTEwgfHwgIShydC0+cnRfZmxhZ3MgJiBSVENGX0JST0FEQ0FTVCkpCisJCWdvdG8gb3V0OworCWlmIChDVElORk8yRElSKGN0aW5mbykgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQlnb3RvIG91dDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KHJ0LT51LmRzdC5kZXYpOworCWlmIChpbl9kZXYgIT0gTlVMTCkgeworCQlmb3JfcHJpbWFyeV9pZmEoaW5fZGV2KSB7CisJCQlpZiAoaWZhLT5pZmFfYnJvYWRjYXN0ID09IGlwaC0+ZGFkZHIpIHsKKwkJCQltYXNrID0gaWZhLT5pZmFfbWFzazsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbmRmb3JfaWZhKGluX2Rldik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKG1hc2sgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwlpZiAoZXhwID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZXhwLT50dXBsZSAgICAgICAgICAgICAgICA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKKwlleHAtPnR1cGxlLnNyYy51LnVkcC5wb3J0ID0gaHRvbnMoTk1CRF9QT1JUKTsKKworCWV4cC0+bWFzay5zcmMudTMuaXAgICAgICAgPSBtYXNrOworCWV4cC0+bWFzay5zcmMudS51ZHAucG9ydCAgPSBodG9ucygweEZGRkYpOworCWV4cC0+bWFzay5kc3QudTMuaXAgICAgICAgPSBodG9ubCgweEZGRkZGRkZGKTsKKwlleHAtPm1hc2suZHN0LnUudWRwLnBvcnQgID0gaHRvbnMoMHhGRkZGKTsKKwlleHAtPm1hc2suZHN0LnByb3RvbnVtICAgID0gMHhGRjsKKworCWV4cC0+ZXhwZWN0Zm4gICAgICAgICAgICAgPSBOVUxMOworCWV4cC0+ZmxhZ3MgICAgICAgICAgICAgICAgPSBORl9DVF9FWFBFQ1RfUEVSTUFORU5UOworCisJbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCk7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCW5mX2N0X3JlZnJlc2goY3QsICpwc2tiLCB0aW1lb3V0ICogSFopOworb3V0OgorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBoZWxwZXIgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJCT0gIm5ldGJpb3MtbnMiLAorCS50dXBsZS5zcmMubDNudW0JPSBBRl9JTkVULAorCS50dXBsZS5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoTk1CRF9QT1JUKSwKKwkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCisJLm1hc2suc3JjLmwzbnVtCQk9IDB4RkZGRiwKKwkubWFzay5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCS5tYXhfZXhwZWN0ZWQJCT0gMSwKKwkubWUJCQk9IFRISVNfTU9EVUxFLAorCS5oZWxwCQkJPSBoZWxwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX25ldGJpb3NfbnNfaW5pdCh2b2lkKQoreworCWhlbHBlci50aW1lb3V0ID0gdGltZW91dDsKKwlyZXR1cm4gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmaGVscGVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19uZXRiaW9zX25zX2Zpbmkodm9pZCkKK3sKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmhlbHBlcik7Cit9CisKK21vZHVsZV9pbml0KG5mX2Nvbm50cmFja19uZXRiaW9zX25zX2luaXQpOworbW9kdWxlX2V4aXQobmZfY29ubnRyYWNrX25ldGJpb3NfbnNfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggYmQwMTU2YS4uYmQxZDJkZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtMzUsMTAgKzM1LDE1IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmg+CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CkBAIC01MCwxNSArNTUsMTUgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfZHVtcF90dXBsZXNfcHJvdG8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgCiAJCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCisJCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9QUk9UTyk7CiAKIAlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX05VTSwgc2l6ZW9mKHVfaW50OF90KSwgJnR1cGxlLT5kc3QucHJvdG9udW0pOwogCi0JaWYgKGxpa2VseShwcm90by0+dHVwbGVfdG9fbmZhdHRyKSkKLQkJcmV0ID0gcHJvdG8tPnR1cGxlX3RvX25mYXR0cihza2IsIHR1cGxlKTsKKwlpZiAobGlrZWx5KGw0cHJvdG8tPnR1cGxlX3RvX25mYXR0cikpCisJCXJldCA9IGw0cHJvdG8tPnR1cGxlX3RvX25mYXR0cihza2IsIHR1cGxlKTsKIAkKIAlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKIApAQCAtOTMsNyArOTgsNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwotCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOworCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKIAogCWwzcHJvdG8gPSBuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KHR1cGxlLT5zcmMubDNudW0pOwogCXJldCA9IGN0bmV0bGlua19kdW1wX3R1cGxlc19pcChza2IsIHR1cGxlLCBsM3Byb3RvKTsKQEAgLTEwMiw5ICsxMDcsOSBAQAogCWlmICh1bmxpa2VseShyZXQgPCAwKSkKIAkJcmV0dXJuIHJldDsKIAotCXByb3RvID0gbmZfY3RfcHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSwgdHVwbGUtPmRzdC5wcm90b251bSk7Ci0JcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHNrYiwgdHVwbGUsIHByb3RvKTsKLQluZl9jdF9wcm90b19wdXQocHJvdG8pOworCWw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KHR1cGxlLT5zcmMubDNudW0sIHR1cGxlLT5kc3QucHJvdG9udW0pOworCXJldCA9IGN0bmV0bGlua19kdW1wX3R1cGxlc19wcm90byhza2IsIHR1cGxlLCBsNHByb3RvKTsKKwluZl9jdF9sNHByb3RvX3B1dChsNHByb3RvKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTIsNyArMTE3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfZHVtcF9zdGF0dXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXVfaW50MzJfdCBzdGF0dXMgPSBodG9ubCgodV9pbnQzMl90KSBjdC0+c3RhdHVzKTsKKwlfX2JlMzIgc3RhdHVzID0gaHRvbmwoKHVfaW50MzJfdCkgY3QtPnN0YXR1cyk7CiAJTkZBX1BVVChza2IsIENUQV9TVEFUVVMsIHNpemVvZihzdGF0dXMpLCAmc3RhdHVzKTsKIAlyZXR1cm4gMDsKIApAQCAtMTI0LDcgKzEyOSw3IEBACiBjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAlsb25nIHRpbWVvdXRfbCA9IGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzOwotCXVfaW50MzJfdCB0aW1lb3V0OworCV9fYmUzMiB0aW1lb3V0OwogCiAJaWYgKHRpbWVvdXRfbCA8IDApCiAJCXRpbWVvdXQgPSAwOwpAQCAtMTQxLDI2ICsxNDYsMjcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfZHVtcF9wcm90b2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvID0gbmZfY3RfcHJvdG9fZmluZF9nZXQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSwgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvID0gbmZfY3RfbDRwcm90b19maW5kX2dldChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtLCBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtKTsKIAlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Byb3RvOwogCWludCByZXQ7CiAKLQlpZiAoIXByb3RvLT50b19uZmF0dHIpIHsKLQkJbmZfY3RfcHJvdG9fcHV0KHByb3RvKTsKKwlpZiAoIWw0cHJvdG8tPnRvX25mYXR0cikgeworCQluZl9jdF9sNHByb3RvX3B1dChsNHByb3RvKTsKIAkJcmV0dXJuIDA7CiAJfQogCQogCW5lc3RfcHJvdG8gPSBORkFfTkVTVChza2IsIENUQV9QUk9UT0lORk8pOwogCi0JcmV0ID0gcHJvdG8tPnRvX25mYXR0cihza2IsIG5lc3RfcHJvdG8sIGN0KTsKKwlyZXQgPSBsNHByb3RvLT50b19uZmF0dHIoc2tiLCBuZXN0X3Byb3RvLCBjdCk7CiAKLQluZl9jdF9wcm90b19wdXQocHJvdG8pOworCW5mX2N0X2w0cHJvdG9fcHV0KGw0cHJvdG8pOwogCiAJTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wcm90byk7CiAKIAlyZXR1cm4gcmV0OwogCiBuZmF0dHJfZmFpbHVyZToKKwluZl9jdF9sNHByb3RvX3B1dChsNHByb3RvKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE5NCw3ICsyMDAsNyBAQAogewogCWVudW0gY3RhdHRyX3R5cGUgdHlwZSA9IGRpciA/IENUQV9DT1VOVEVSU19SRVBMWTogQ1RBX0NPVU5URVJTX09SSUc7CiAJc3RydWN0IG5mYXR0ciAqbmVzdF9jb3VudCA9IE5GQV9ORVNUKHNrYiwgdHlwZSk7Ci0JdV9pbnQzMl90IHRtcDsKKwlfX2JlMzIgdG1wOwogCiAJdG1wID0gaHRvbmwoY3QtPmNvdW50ZXJzW2Rpcl0ucGFja2V0cyk7CiAJTkZBX1BVVChza2IsIENUQV9DT1VOVEVSUzMyX1BBQ0tFVFMsIHNpemVvZih1X2ludDMyX3QpLCAmdG1wKTsKQEAgLTIxNyw3ICsyMjMsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIGN0bmV0bGlua19kdW1wX21hcmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXVfaW50MzJfdCBtYXJrID0gaHRvbmwoY3QtPm1hcmspOworCV9fYmUzMiBtYXJrID0gaHRvbmwoY3QtPm1hcmspOwogCiAJTkZBX1BVVChza2IsIENUQV9NQVJLLCBzaXplb2YodV9pbnQzMl90KSwgJm1hcmspOwogCXJldHVybiAwOwpAQCAtMjMyLDcgKzIzOCw3IEBACiBzdGF0aWMgaW5saW5lIGludAogY3RuZXRsaW5rX2R1bXBfaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXVfaW50MzJfdCBpZCA9IGh0b25sKGN0LT5pZCk7CisJX19iZTMyIGlkID0gaHRvbmwoY3QtPmlkKTsKIAlORkFfUFVUKHNrYiwgQ1RBX0lELCBzaXplb2YodV9pbnQzMl90KSwgJmlkKTsKIAlyZXR1cm4gMDsKIApAQCAtMjQzLDcgKzI0OSw3IEBACiBzdGF0aWMgaW5saW5lIGludAogY3RuZXRsaW5rX2R1bXBfdXNlKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQl1X2ludDMyX3QgdXNlID0gaHRvbmwoYXRvbWljX3JlYWQoJmN0LT5jdF9nZW5lcmFsLnVzZSkpOworCV9fYmUzMiB1c2UgPSBodG9ubChhdG9taWNfcmVhZCgmY3QtPmN0X2dlbmVyYWwudXNlKSk7CiAJCiAJTkZBX1BVVChza2IsIENUQV9VU0UsIHNpemVvZih1X2ludDMyX3QpLCAmdXNlKTsKIAlyZXR1cm4gMDsKQEAgLTMyOSw4ICszMzUsNiBAQAogCX0gZWxzZSAgaWYgKGV2ZW50cyAmIChJUENUX05FVyB8IElQQ1RfUkVMQVRFRCkpIHsKIAkJdHlwZSA9IElQQ1ROTF9NU0dfQ1RfTkVXOwogCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOwotCQkvKiBkdW1wIGV2ZXJ5dGhpbmcgKi8KLQkJZXZlbnRzID0gfjBVTDsKIAkJZ3JvdXAgPSBORk5MR1JQX0NPTk5UUkFDS19ORVc7CiAJfSBlbHNlICBpZiAoZXZlbnRzICYgKElQQ1RfU1RBVFVTIHwgSVBDVF9QUk9UT0lORk8pKSB7CiAJCXR5cGUgPSBJUENUTkxfTVNHX0NUX05FVzsKQEAgLTM2NSwyOCArMzY5LDM1IEBACiAJaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKGN0LCBJUF9DVF9ESVJfUkVQTFkpKSA8IDApCiAJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAJTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0JCi0JLyogTkFUIHN0dWZmIGlzIG5vdyBhIHN0YXR1cyBmbGFnICovCi0JaWYgKChldmVudHMgJiBJUENUX1NUQVRVUyB8fCBldmVudHMgJiBJUENUX05BVElORk8pCi0JICAgICYmIGN0bmV0bGlua19kdW1wX3N0YXR1cyhza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JaWYgKGV2ZW50cyAmIElQQ1RfUkVGUkVTSAotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlpZiAoZXZlbnRzICYgSVBDVF9QUk9UT0lORk8KLQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlpZiAoZXZlbnRzICYgSVBDVF9IRUxQSU5GTwotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9oZWxwaW5mbyhza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAKLQlpZiAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisJaWYgKGV2ZW50cyAmIElQQ1RfREVTVFJPWSkgeworCQlpZiAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKKwkJICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKQorCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKKwl9IGVsc2UgeworCQlpZiAoY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHNrYiwgY3QpIDwgMCkKKwkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAKLQlpZiAoZXZlbnRzICYgSVBDVF9NQVJLCi0JICAgICYmIGN0bmV0bGlua19kdW1wX21hcmsoc2tiLCBjdCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCQlpZiAoY3RuZXRsaW5rX2R1bXBfdGltZW91dChza2IsIGN0KSA8IDApCisJCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmIChldmVudHMgJiBJUENUX1BST1RPSU5GTworCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHNrYiwgY3QpIDwgMCkKKwkJICAgIAlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmICgoZXZlbnRzICYgSVBDVF9IRUxQRVIgfHwgbmZjdF9oZWxwKGN0KSkKKwkJICAgICYmIGN0bmV0bGlua19kdW1wX2hlbHBpbmZvKHNrYiwgY3QpIDwgMCkKKwkJICAgIAlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmICgoZXZlbnRzICYgSVBDVF9NQVJLIHx8IGN0LT5tYXJrKQorCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfbWFyayhza2IsIGN0KSA8IDApCisJCSAgICAJZ290byBuZmF0dHJfZmFpbHVyZTsKKworCQlpZiAoZXZlbnRzICYgSVBDVF9DT1VOVEVSX0ZJTExJTkcgJiYKKwkJICAgIChjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAorCQkgICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKSkKKwkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisJfQogCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwogCW5mbmV0bGlua19zZW5kKHNrYiwgMCwgZ3JvdXAsIDApOwpAQCAtNDIzLDcgKzQzNCw3IEBACiByZXN0YXJ0OgogCQlsaXN0X2Zvcl9lYWNoX3ByZXYoaSwgJm5mX2Nvbm50cmFja19oYXNoW2NiLT5hcmdzWzBdXSkgewogCQkJaCA9IChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKikgaTsKLQkJCWlmIChESVJFQ1RJT04oaCkgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQkJaWYgKE5GX0NUX0RJUkVDVElPTihoKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCiAJCQkJY29udGludWU7CiAJCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CiAJCQkvKiBEdW1wIGVudHJpZXMgb2YgYSBnaXZlbiBMMyBwcm90b2NvbCBudW1iZXIuCkBAIC00OTEsNyArNTAyLDcgQEAKIAkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9fTUFYXTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAJaW50IHJldCA9IDA7CiAKIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9fTUFYLCBhdHRyKTsKQEAgLTUwMywxMiArNTE0LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCXR1cGxlLT5kc3QucHJvdG9udW0gPSAqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX05VTS0xXSk7CiAKLQlwcm90byA9IG5mX2N0X3Byb3RvX2ZpbmRfZ2V0KHR1cGxlLT5zcmMubDNudW0sIHR1cGxlLT5kc3QucHJvdG9udW0pOworCWw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KHR1cGxlLT5zcmMubDNudW0sIHR1cGxlLT5kc3QucHJvdG9udW0pOwogCi0JaWYgKGxpa2VseShwcm90by0+bmZhdHRyX3RvX3R1cGxlKSkKLQkJcmV0ID0gcHJvdG8tPm5mYXR0cl90b190dXBsZSh0YiwgdHVwbGUpOworCWlmIChsaWtlbHkobDRwcm90by0+bmZhdHRyX3RvX3R1cGxlKSkKKwkJcmV0ID0gbDRwcm90by0+bmZhdHRyX3RvX3R1cGxlKHRiLCB0dXBsZSk7CiAKLQluZl9jdF9wcm90b19wdXQocHJvdG8pOworCW5mX2N0X2w0cHJvdG9fcHV0KGw0cHJvdG8pOwogCQogCXJldHVybiByZXQ7CiB9CkBAIC01NDksMjggKzU2MCwyOCBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX3Byb3RvbmF0W0NUQV9QUk9UT05BVF9NQVhdID0gewogCVtDVEFfUFJPVE9OQVRfUE9SVF9NSU4tMV0gICAgICAgPSBzaXplb2YodV9pbnQxNl90KSwKIAlbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdICAgICAgID0gc2l6ZW9mKHVfaW50MTZfdCksCiB9OwogCi1zdGF0aWMgaW50IGN0bmV0bGlua19wYXJzZV9uYXRfcHJvdG8oc3RydWN0IG5mYXR0ciAqYXR0ciwKK3N0YXRpYyBpbnQgbmZuZXRsaW5rX3BhcnNlX25hdF9wcm90byhzdHJ1Y3QgbmZhdHRyICphdHRyLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LAotCQkJCSAgICAgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCisJCQkJICAgICBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9OQVRfTUFYXTsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpucHQ7CisJc3RydWN0IG5mX25hdF9wcm90b2NvbCAqbnB0OwogCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPTkFUX01BWCwgYXR0cik7CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9OQVRfTUFYLCBjdGFfbWluX3Byb3RvbmF0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlucHQgPSBpcF9uYXRfcHJvdG9fZmluZF9nZXQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7CisJbnB0ID0gbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0pOwogCiAJaWYgKCFucHQtPm5mYXR0cl90b19yYW5nZSkgewotCQlpcF9uYXRfcHJvdG9fcHV0KG5wdCk7CisJCW5mX25hdF9wcm90b19wdXQobnB0KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01NzgsNyArNTg5LDcgQEAKIAlpZiAobnB0LT5uZmF0dHJfdG9fcmFuZ2UodGIsIHJhbmdlKSA+IDApCiAJCXJhbmdlLT5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOwogCi0JaXBfbmF0X3Byb3RvX3B1dChucHQpOworCW5mX25hdF9wcm90b19wdXQobnB0KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTg5LDggKzYwMCw4IEBACiB9OwogCiBzdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX3BhcnNlX25hdChzdHJ1Y3QgbmZhdHRyICpuYXQsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKQorbmZuZXRsaW5rX3BhcnNlX25hdChzdHJ1Y3QgbmZhdHRyICpuYXQsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQogewogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9OQVRfTUFYXTsKIAlpbnQgZXJyOwpAQCAtNjAzLDEyICs2MTQsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodGJbQ1RBX05BVF9NSU5JUC0xXSkKLQkJcmFuZ2UtPm1pbl9pcCA9ICoodV9pbnQzMl90ICopTkZBX0RBVEEodGJbQ1RBX05BVF9NSU5JUC0xXSk7CisJCXJhbmdlLT5taW5faXAgPSAqKF9fYmUzMiAqKU5GQV9EQVRBKHRiW0NUQV9OQVRfTUlOSVAtMV0pOwogCiAJaWYgKCF0YltDVEFfTkFUX01BWElQLTFdKQogCQlyYW5nZS0+bWF4X2lwID0gcmFuZ2UtPm1pbl9pcDsKIAllbHNlCi0JCXJhbmdlLT5tYXhfaXAgPSAqKHVfaW50MzJfdCAqKU5GQV9EQVRBKHRiW0NUQV9OQVRfTUFYSVAtMV0pOworCQlyYW5nZS0+bWF4X2lwID0gKihfX2JlMzIgKilORkFfREFUQSh0YltDVEFfTkFUX01BWElQLTFdKTsKIAogCWlmIChyYW5nZS0+bWluX2lwKQogCQlyYW5nZS0+ZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX01BUF9JUFM7CkBAIC02MTYsNyArNjI3LDcgQEAKIAlpZiAoIXRiW0NUQV9OQVRfUFJPVE8tMV0pCiAJCXJldHVybiAwOwogCi0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX25hdF9wcm90byh0YltDVEFfTkFUX1BST1RPLTFdLCBjdCwgcmFuZ2UpOworCWVyciA9IG5mbmV0bGlua19wYXJzZV9uYXRfcHJvdG8odGJbQ1RBX05BVF9QUk9UTy0xXSwgY3QsIHJhbmdlKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNjgxLDcgKzY5Miw3IEBACiAJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCQogCWlmIChjZGFbQ1RBX0lELTFdKSB7Ci0JCXVfaW50MzJfdCBpZCA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9JRC0xXSkpOworCQl1X2ludDMyX3QgaWQgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfSUQtMV0pKTsKIAkJaWYgKGN0LT5pZCAhPSBpZCkgewogCQkJbmZfY3RfcHV0KGN0KTsKIAkJCXJldHVybiAtRU5PRU5UOwpAQCAtNzUxLDcgKzc2Miw2IEBACiAJCW5mX2N0X3B1dChjdCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlORVRMSU5LX0NCKHNrYjIpLmRzdF9waWQgPSBORVRMSU5LX0NCKHNrYikucGlkOwogCiAJZXJyID0gY3RuZXRsaW5rX2ZpbGxfaW5mbyhza2IyLCBORVRMSU5LX0NCKHNrYikucGlkLCBubGgtPm5sbXNnX3NlcSwgCiAJCQkJICBJUENUTkxfTVNHX0NUX05FVywgMSwgY3QpOwpAQCAtNzc1LDcgKzc4NSw3IEBACiBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQogewogCXVuc2lnbmVkIGxvbmcgZDsKLQl1bnNpZ25lZCBzdGF0dXMgPSBudG9obCgqKHVfaW50MzJfdCAqKU5GQV9EQVRBKGNkYVtDVEFfU1RBVFVTLTFdKSk7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9TVEFUVVMtMV0pKTsKIAlkID0gY3QtPnN0YXR1cyBeIHN0YXR1czsKIAogCWlmIChkICYgKElQU19FWFBFQ1RFRHxJUFNfQ09ORklSTUVEfElQU19EWUlORykpCkBAIC03OTIsMzUgKzgwMiwzNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjZGFbQ1RBX05BVF9TUkMtMV0gfHwgY2RhW0NUQV9OQVRfRFNULTFdKSB7Ci0jaWZuZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECisjaWZuZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAJCXJldHVybiAtRUlOVkFMOwogI2Vsc2UKLQkJc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKKwkJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKIAogCQlpZiAoY2RhW0NUQV9OQVRfRFNULTFdKSB7Ci0JCQlpZiAoY3RuZXRsaW5rX3BhcnNlX25hdChjZGFbQ1RBX05BVF9EU1QtMV0sIGN0LAorCQkJaWYgKG5mbmV0bGlua19wYXJzZV9uYXQoY2RhW0NUQV9OQVRfRFNULTFdLCBjdCwKIAkJCQkJCSZyYW5nZSkgPCAwKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGlwX25hdF9pbml0aWFsaXplZChjdCwKKwkJCWlmIChuZl9uYXRfaW5pdGlhbGl6ZWQoY3QsCiAJCQkJCSAgICAgICBIT09LMk1BTklQKE5GX0lQX1BSRV9ST1VUSU5HKSkpCiAJCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBob29rbnVtKTsKKwkJCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BSRV9ST1VUSU5HKTsKIAkJfQogCQlpZiAoY2RhW0NUQV9OQVRfU1JDLTFdKSB7Ci0JCQlpZiAoY3RuZXRsaW5rX3BhcnNlX25hdChjZGFbQ1RBX05BVF9TUkMtMV0sIGN0LAorCQkJaWYgKG5mbmV0bGlua19wYXJzZV9uYXQoY2RhW0NUQV9OQVRfU1JDLTFdLCBjdCwKIAkJCQkJCSZyYW5nZSkgPCAwKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGlwX25hdF9pbml0aWFsaXplZChjdCwKKwkJCWlmIChuZl9uYXRfaW5pdGlhbGl6ZWQoY3QsCiAJCQkJCSAgICAgICBIT09LMk1BTklQKE5GX0lQX1BPU1RfUk9VVElORykpKQogCQkJCXJldHVybiAtRUVYSVNUOwotCQkJaXBfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgaG9va251bSk7CisJCQluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QT1NUX1JPVVRJTkcpOwogCQl9CiAjZW5kaWYKIAl9CiAKIAkvKiBCZSBjYXJlZnVsIGhlcmUsIG1vZGlmeWluZyBOQVQgYml0cyBjYW4gc2NyZXcgdXAgdGhpbmdzLAogCSAqIHNvIGRvbid0IGxldCB1c2VycyBtb2RpZnkgdGhlbSBkaXJlY3RseSBpZiB0aGV5IGRvbid0IHBhc3MKLQkgKiBpcF9uYXRfcmFuZ2UuICovCisJICogbmZfbmF0X3JhbmdlLiAqLwogCWN0LT5zdGF0dXMgfD0gc3RhdHVzICYgfihJUFNfTkFUX0RPTkVfTUFTSyB8IElQU19OQVRfTUFTSyk7CiAJcmV0dXJuIDA7CiB9CkBAIC04NzQsNyArODg0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfY2hhbmdlX3RpbWVvdXQoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKLQl1X2ludDMyX3QgdGltZW91dCA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9USU1FT1VULTFdKSk7CisJdV9pbnQzMl90IHRpbWVvdXQgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfVElNRU9VVC0xXSkpOwogCQogCWlmICghZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpCiAJCXJldHVybiAtRVRJTUU7CkBAIC04ODksMTggKzg5OSwxOCBAQAogY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9JTkZPX01BWF0sICphdHRyID0gY2RhW0NUQV9QUk9UT0lORk8tMV07Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCXVfaW50MTZfdCBucHQgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtOwogCXVfaW50MTZfdCBsM251bSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW07CiAJaW50IGVyciA9IDA7CiAKIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9JTkZPX01BWCwgYXR0cik7CiAKLQlwcm90byA9IG5mX2N0X3Byb3RvX2ZpbmRfZ2V0KGwzbnVtLCBucHQpOworCWw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KGwzbnVtLCBucHQpOwogCi0JaWYgKHByb3RvLT5mcm9tX25mYXR0cikKLQkJZXJyID0gcHJvdG8tPmZyb21fbmZhdHRyKHRiLCBjdCk7Ci0JbmZfY3RfcHJvdG9fcHV0KHByb3RvKTsgCisJaWYgKGw0cHJvdG8tPmZyb21fbmZhdHRyKQorCQllcnIgPSBsNHByb3RvLT5mcm9tX25mYXR0cih0YiwgY3QpOworCW5mX2N0X2w0cHJvdG9fcHV0KGw0cHJvdG8pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTkzNiw3ICs5NDYsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01BUkspCiAJaWYgKGNkYVtDVEFfTUFSSy0xXSkKLQkJY3QtPm1hcmsgPSBudG9obCgqKHVfaW50MzJfdCAqKU5GQV9EQVRBKGNkYVtDVEFfTUFSSy0xXSkpOworCQljdC0+bWFyayA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9NQVJLLTFdKSk7CiAjZW5kaWYKIAogCXJldHVybiAwOwpAQCAtOTQ5LDYgKzk1OSw3IEBACiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CiAKIAljdCA9IG5mX2Nvbm50cmFja19hbGxvYyhvdHVwbGUsIHJ0dXBsZSk7CiAJaWYgKGN0ID09IE5VTEwgfHwgSVNfRVJSKGN0KSkKQEAgLTk1NiwxNCArOTY3LDE2IEBACiAKIAlpZiAoIWNkYVtDVEFfVElNRU9VVC0xXSkKIAkJZ290byBlcnI7Ci0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9USU1FT1VULTFdKSk7CisJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9USU1FT1VULTFdKSk7CiAKIAljdC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGN0LT50aW1lb3V0LmV4cGlyZXMgKiBIWjsKIAljdC0+c3RhdHVzIHw9IElQU19DT05GSVJNRUQ7CiAKLQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhjdCwgY2RhKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnI7CisJaWYgKGNkYVtDVEFfU1RBVFVTLTFdKSB7CisJCWVyciA9IGN0bmV0bGlua19jaGFuZ2Vfc3RhdHVzKGN0LCBjZGEpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KIAogCWlmIChjZGFbQ1RBX1BST1RPSU5GTy0xXSkgewogCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3Byb3RvaW5mbyhjdCwgY2RhKTsKQEAgLTk3MywxMiArOTg2LDE5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTUFSSykKIAlpZiAoY2RhW0NUQV9NQVJLLTFdKQotCQljdC0+bWFyayA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9NQVJLLTFdKSk7CisJCWN0LT5tYXJrID0gbnRvaGwoKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX01BUkstMV0pKTsKICNlbmRpZgogCisJaGVscCA9IG5mY3RfaGVscChjdCk7CisJaWYgKGhlbHApCisJCWhlbHAtPmhlbHBlciA9IG5mX2N0X2hlbHBlcl9maW5kX2dldChydHVwbGUpOworCiAJYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7CiAJbmZfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KGN0KTsKIAorCWlmIChoZWxwICYmIGhlbHAtPmhlbHBlcikKKwkJbmZfY3RfaGVscGVyX3B1dChoZWxwLT5oZWxwZXIpOworCiAJcmV0dXJuIDA7CiAKIGVycjoJCkBAIC0xMDcyLDcgKzEwOTIsNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwotCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOworCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKIAlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfRVhQRUNUX01BU0spOwogCiAJbDNwcm90byA9IG5mX2N0X2wzcHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSk7CkBAIC0xMDgyLDkgKzExMDIsOSBAQAogCWlmICh1bmxpa2VseShyZXQgPCAwKSkKIAkJZ290byBuZmF0dHJfZmFpbHVyZTsKIAotCXByb3RvID0gbmZfY3RfcHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSwgdHVwbGUtPmRzdC5wcm90b251bSk7Ci0JcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHNrYiwgbWFzaywgcHJvdG8pOwotCW5mX2N0X3Byb3RvX3B1dChwcm90byk7CisJbDRwcm90byA9IG5mX2N0X2w0cHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSwgdHVwbGUtPmRzdC5wcm90b251bSk7CisJcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHNrYiwgbWFzaywgbDRwcm90byk7CisJbmZfY3RfbDRwcm90b19wdXQobDRwcm90byk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKQogCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCkBAIC0xMTAxLDggKzExMjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewogCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBleHAtPm1hc3RlcjsKLQl1X2ludDMyX3QgdGltZW91dCA9IGh0b25sKChleHAtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpIC8gSFopOwotCXVfaW50MzJfdCBpZCA9IGh0b25sKGV4cC0+aWQpOworCV9fYmUzMiB0aW1lb3V0ID0gaHRvbmwoKGV4cC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykgLyBIWik7CisJX19iZTMyIGlkID0gaHRvbmwoZXhwLT5pZCk7CiAKIAlpZiAoY3RuZXRsaW5rX2V4cF9kdW1wX3R1cGxlKHNrYiwgJmV4cC0+dHVwbGUsIENUQV9FWFBFQ1RfVFVQTEUpIDwgMCkKIAkJZ290byBuZmF0dHJfZmFpbHVyZTsKQEAgLTEyNzUsMTIgKzEyOTUsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZCgmdHVwbGUpOworCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKIAlpZiAoIWV4cCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pIHsKLQkJdV9pbnQzMl90IGlkID0gKih1X2ludDMyX3QgKilORkFfREFUQShjZGFbQ1RBX0VYUEVDVF9JRC0xXSk7CisJCV9fYmUzMiBpZCA9ICooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pOwogCQlpZiAoZXhwLT5pZCAhPSBudG9obChpZCkpIHsKIAkJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTEyOTEsOCArMTMxMSw3IEBACiAJc2tiMiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IyKQogCQlnb3RvIG91dDsKLQlORVRMSU5LX0NCKHNrYjIpLmRzdF9waWQgPSBORVRMSU5LX0NCKHNrYikucGlkOwotCQorCiAJZXJyID0gY3RuZXRsaW5rX2V4cF9maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgCiAJCQkJICAgICAgbmxoLT5ubG1zZ19zZXEsIElQQ1ROTF9NU0dfRVhQX05FVywKIAkJCQkgICAgICAxLCBleHApOwpAQCAtMTMzMSwxMyArMTM1MCwxMiBAQAogCQkJcmV0dXJuIGVycjsKIAogCQkvKiBidW1wIHVzYWdlIGNvdW50IHRvIDIgKi8KLQkJZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKIAkJaWYgKCFleHApCiAJCQlyZXR1cm4gLUVOT0VOVDsKIAogCQlpZiAoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pIHsKLQkJCXVfaW50MzJfdCBpZCA9IAotCQkJCSoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pOworCQkJX19iZTMyIGlkID0gKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX0VYUEVDVF9JRC0xXSk7CiAJCQlpZiAoZXhwLT5pZCAhPSBudG9obChpZCkpIHsKIAkJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwogCQkJCXJldHVybiAtRU5PRU5UOwpAQCAtMTQzMyw2ICsxNDUxLDcgQEAKIAlleHAtPmV4cGVjdGZuID0gTlVMTDsKIAlleHAtPmZsYWdzID0gMDsKIAlleHAtPm1hc3RlciA9IGN0OworCWV4cC0+aGVscGVyID0gTlVMTDsKIAltZW1jcHkoJmV4cC0+dHVwbGUsICZ0dXBsZSwgc2l6ZW9mKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUpKTsKIAltZW1jcHkoJmV4cC0+bWFzaywgJm1hc2ssIHNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlKSk7CiAKQEAgLTE1MjksNiArMTU0OCw3IEBACiAJLmNiCQkJCT0gY3RubF9leHBfY2IsCiB9OwogCitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja19uZXRsaW5rIik7CiBNT0RVTEVfQUxJQVNfTkZOTF9TVUJTWVMoTkZOTF9TVUJTWVNfQ1RORVRMSU5LKTsKIE1PRFVMRV9BTElBU19ORk5MX1NVQlNZUyhORk5MX1NVQlNZU19DVE5FVExJTktfRVhQKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZmYwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgZm9yIFBQVFAgKFBvaW50IHRvIFBvaW50IFR1bm5lbGluZyBQcm90b2NvbCkuCisgKiBQUFRQIGlzIGEgYSBwcm90b2NvbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBwcml2YXRlIG5ldHdvcmtzLgorICogSXQgaXMgYSBzcGVjaWZpY2F0aW9uIGRlZmluZWQgYnkgTWljcm9zb2Z0IGFuZCBzb21lIHZlbmRvcnMKKyAqIHdvcmtpbmcgd2l0aCBNaWNyb3NvZnQuICBQUFRQIGlzIGJ1aWx0IG9uIHRvcCBvZiBhIG1vZGlmaWVkCisgKiB2ZXJzaW9uIG9mIHRoZSBJbnRlcm5ldCBHZW5lcmljIFJvdXRpbmcgRW5jYXBzdWxhdGlvbiBQcm90b2NvbC4KKyAqIEdSRSBpcyBkZWZpbmVkIGluIFJGQyAxNzAxIGFuZCBSRkMgMTcwMi4gIERvY3VtZW50YXRpb24gb2YKKyAqIFBQVFAgY2FuIGJlIGZvdW5kIGluIFJGQyAyNjM3CisgKgorICogKEMpIDIwMDAtMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQorICoKKyAqIExpbWl0YXRpb25zOgorICogCSAtIFdlIGJsaW5kbHkgYXNzdW1lIHRoYXQgY29udHJvbCBjb25uZWN0aW9ucyBhcmUgYWx3YXlzCisgKiAJICAgZXN0YWJsaXNoZWQgaW4gUE5TLT5QQUMgZGlyZWN0aW9uLiAgVGhpcyBpcyBhIHZpb2xhdGlvbgorICogCSAgIG9mIFJGRkMyNjczCisgKiAJIC0gV2UgY2FuIG9ubHkgc3VwcG9ydCBvbmUgc2luZ2xlIGNhbGwgd2l0aGluIGVhY2ggc2Vzc2lvbgorICogVE9ETzoKKyAqCSAtIHRlc3Rpbmcgb2YgaW5jb21pbmcgUFBUUCBjYWxscworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuaD4KKworI2RlZmluZSBORl9DVF9QUFRQX1ZFUlNJT04gIjMuMSIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIG1vZHVsZSBmb3IgUFBUUCIpOworTU9EVUxFX0FMSUFTKCJpcF9jb25udHJhY2tfcHB0cCIpOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5mX3BwdHBfbG9jayk7CisKK2ludAorKCpuZl9uYXRfcHB0cF9ob29rX291dGJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJCSAgICAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3BwdHBfaG9va19vdXRib3VuZCk7CisKK2ludAorKCpuZl9uYXRfcHB0cF9ob29rX2luYm91bmQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJCSAgICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfcHB0cF9ob29rX2luYm91bmQpOworCit2b2lkCisoKm5mX25hdF9wcHRwX2hvb2tfZXhwX2dyZSkoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdF9vcmlnLAorCQkJICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHBlY3RfcmVwbHkpCisJCQkgICAgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9wcHRwX2hvb2tfZXhwX2dyZSk7CisKK3ZvaWQKKygqbmZfbmF0X3BwdHBfaG9va19leHBlY3Rmbikoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3BwdHBfaG9va19leHBlY3Rmbik7CisKKyNpZiAwCisvKiBQcHRwQ29udHJvbE1lc3NhZ2VUeXBlIG5hbWVzICovCitjb25zdCBjaGFyICpwcHRwX21zZ19uYW1lW10gPSB7CisJIlVOS05PV05fTUVTU0FHRSIsCisJIlNUQVJUX1NFU1NJT05fUkVRVUVTVCIsCisJIlNUQVJUX1NFU1NJT05fUkVQTFkiLAorCSJTVE9QX1NFU1NJT05fUkVRVUVTVCIsCisJIlNUT1BfU0VTU0lPTl9SRVBMWSIsCisJIkVDSE9fUkVRVUVTVCIsCisJIkVDSE9fUkVQTFkiLAorCSJPVVRfQ0FMTF9SRVFVRVNUIiwKKwkiT1VUX0NBTExfUkVQTFkiLAorCSJJTl9DQUxMX1JFUVVFU1QiLAorCSJJTl9DQUxMX1JFUExZIiwKKwkiSU5fQ0FMTF9DT05ORUNUIiwKKwkiQ0FMTF9DTEVBUl9SRVFVRVNUIiwKKwkiQ0FMTF9ESVNDT05ORUNUX05PVElGWSIsCisJIldBTl9FUlJPUl9OT1RJRlkiLAorCSJTRVRfTElOS19JTkZPIgorfTsKK0VYUE9SVF9TWU1CT0wocHB0cF9tc2dfbmFtZSk7CisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICIlczolczogIiBmb3JtYXQsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgU0VDUyAqSFoKKyNkZWZpbmUgTUlOUyAqIDYwIFNFQ1MKKyNkZWZpbmUgSE9VUlMgKiA2MCBNSU5TCisKKyNkZWZpbmUgUFBUUF9HUkVfVElNRU9VVCAJCSgxMCBNSU5TKQorI2RlZmluZSBQUFRQX0dSRV9TVFJFQU1fVElNRU9VVCAJKDUgSE9VUlMpCisKK3N0YXRpYyB2b2lkIHBwdHBfZXhwZWN0Zm4oc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJdHlwZW9mKG5mX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pIG5mX25hdF9wcHRwX2V4cGVjdGZuOworCURFQlVHUCgiaW5jcmVhc2luZyB0aW1lb3V0c1xuIik7CisKKwkvKiBpbmNyZWFzZSB0aW1lb3V0IG9mIEdSRSBkYXRhIGNoYW5uZWwgY29ubnRyYWNrIGVudHJ5ICovCisJY3QtPnByb3RvLmdyZS50aW1lb3V0CSAgICAgPSBQUFRQX0dSRV9USU1FT1VUOworCWN0LT5wcm90by5ncmUuc3RyZWFtX3RpbWVvdXQgPSBQUFRQX0dSRV9TVFJFQU1fVElNRU9VVDsKKworCS8qIENhbiB5b3Ugc2VlIGhvdyBydXN0eSB0aGlzIGNvZGUgaXMsIGNvbXBhcmVkIHdpdGggdGhlIHByZS0yLjYuMTEKKwkgKiBvbmU/IFRoYXQncyB3aGF0IGhhcHBlbmVkIHRvIG15IHNoaW55IG5ld25hdCBvZiAyMDAyIDsoIC1IVyAqLworCisJcmN1X3JlYWRfbG9jaygpOworCW5mX25hdF9wcHRwX2V4cGVjdGZuID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pOworCWlmIChuZl9uYXRfcHB0cF9leHBlY3RmbiAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQluZl9uYXRfcHB0cF9leHBlY3RmbihjdCwgZXhwKTsKKwllbHNlIHsKKwkJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSBpbnZfdDsKKwkJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cF9vdGhlcjsKKworCQkvKiBvYnZpb3VzbHkgdGhpcyB0dXBsZSBpbnZlcnNpb24gb25seSB3b3JrcyB1bnRpbCB5b3UgZG8gTkFUICovCisJCW5mX2N0X2ludmVydF90dXBsZXByKCZpbnZfdCwgJmV4cC0+dHVwbGUpOworCQlERUJVR1AoInRyeWluZyB0byB1bmV4cGVjdCBvdGhlciBkaXI6ICIpOworCQlORl9DVF9EVU1QX1RVUExFKCZpbnZfdCk7CisKKwkJZXhwX290aGVyID0gbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmaW52X3QpOworCQlpZiAoZXhwX290aGVyKSB7CisJCQkvKiBkZWxldGUgb3RoZXIgZXhwZWN0YXRpb24uICAqLworCQkJREVCVUdQKCJmb3VuZFxuIik7CisJCQluZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHBfb3RoZXIpOworCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwX290aGVyKTsKKwkJfSBlbHNlIHsKKwkJCURFQlVHUCgibm90IGZvdW5kXG4iKTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGludCBkZXN0cm95X3NpYmxpbmdfb3JfZXhwKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IG5mX2Nvbm4gKnNpYmxpbmc7CisKKwlERUJVR1AoInRyeWluZyB0byB0aW1lb3V0IGN0IG9yIGV4cCBmb3IgdHVwbGUgIik7CisJTkZfQ1RfRFVNUF9UVVBMRSh0KTsKKworCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQodCwgTlVMTCk7CisJaWYgKGgpICB7CisJCXNpYmxpbmcgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOworCQlERUJVR1AoInNldHRpbmcgdGltZW91dCBvZiBjb25udHJhY2sgJXAgdG8gMFxuIiwgc2libGluZyk7CisJCXNpYmxpbmctPnByb3RvLmdyZS50aW1lb3V0CSAgPSAwOworCQlzaWJsaW5nLT5wcm90by5ncmUuc3RyZWFtX3RpbWVvdXQgPSAwOworCQlpZiAoZGVsX3RpbWVyKCZzaWJsaW5nLT50aW1lb3V0KSkKKwkJCXNpYmxpbmctPnRpbWVvdXQuZnVuY3Rpb24oKHVuc2lnbmVkIGxvbmcpc2libGluZyk7CisJCW5mX2N0X3B1dChzaWJsaW5nKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCh0KTsKKwkJaWYgKGV4cCkgeworCQkJREVCVUdQKCJ1bmV4cGVjdF9yZWxhdGVkIG9mIGV4cGVjdCAlcFxuIiwgZXhwKTsKKwkJCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHRpbWVvdXQgR1JFIGRhdGEgY29ubmVjdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHBwdHBfZGVzdHJveV9zaWJsaW5ncyhzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0OworCisJbmZfY3RfZ3JlX2tleW1hcF9kZXN0cm95KGN0KTsKKworCS8qIHRyeSBvcmlnaW5hbCAocG5zLT5wYWMpIHR1cGxlICovCisJbWVtY3B5KCZ0LCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLCBzaXplb2YodCkpOworCXQuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7CisJdC5zcmMudS5ncmUua2V5ID0gaGVscC0+aGVscC5jdF9wcHRwX2luZm8ucG5zX2NhbGxfaWQ7CisJdC5kc3QudS5ncmUua2V5ID0gaGVscC0+aGVscC5jdF9wcHRwX2luZm8ucGFjX2NhbGxfaWQ7CisJaWYgKCFkZXN0cm95X3NpYmxpbmdfb3JfZXhwKCZ0KSkKKwkJREVCVUdQKCJmYWlsZWQgdG8gdGltZW91dCBvcmlnaW5hbCBwbnMtPnBhYyBjdC9leHBcbiIpOworCisJLyogdHJ5IHJlcGx5IChwYWMtPnBucykgdHVwbGUgKi8KKwltZW1jcHkoJnQsICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsIHNpemVvZih0KSk7CisJdC5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKKwl0LnNyYy51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wYWNfY2FsbF9pZDsKKwl0LmRzdC51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKKwlpZiAoIWRlc3Ryb3lfc2libGluZ19vcl9leHAoJnQpKQorCQlERUJVR1AoImZhaWxlZCB0byB0aW1lb3V0IHJlcGx5IHBhYy0+cG5zIGN0L2V4cFxuIik7Cit9CisKKy8qIGV4cGVjdCBHUkUgY29ubmVjdGlvbnMgKFBOUy0+UEFDIGFuZCBQQUMtPlBOUyBkaXJlY3Rpb24pICovCitzdGF0aWMgaW50IGV4cF9ncmUoc3RydWN0IG5mX2Nvbm4gKmN0LCBfX2JlMTYgY2FsbGlkLCBfX2JlMTYgcGVlcl9jYWxsaWQpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cF9vcmlnLCAqZXhwX3JlcGx5OworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7CisJaW50IHJldCA9IDE7CisJdHlwZW9mKG5mX25hdF9wcHRwX2hvb2tfZXhwX2dyZSkgbmZfbmF0X3BwdHBfZXhwX2dyZTsKKworCWV4cF9vcmlnID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CisJaWYgKGV4cF9vcmlnID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZXhwX3JlcGx5ID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CisJaWYgKGV4cF9yZXBseSA9PSBOVUxMKQorCQlnb3RvIG91dF9wdXRfb3JpZzsKKworCS8qIG9yaWdpbmFsIGRpcmVjdGlvbiwgUE5TLT5QQUMgKi8KKwlkaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cF9vcmlnLCBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51MywKKwkJCQkgJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QudTMsCisJCQkJIElQUFJPVE9fR1JFLCAmcGVlcl9jYWxsaWQsICZjYWxsaWQpOworCWV4cF9vcmlnLT5leHBlY3RmbiA9IHBwdHBfZXhwZWN0Zm47CisKKwkvKiByZXBseSBkaXJlY3Rpb24sIFBBQy0+UE5TICovCisJZGlyID0gSVBfQ1RfRElSX1JFUExZOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHBfcmVwbHksIGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLAorCQkJCSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgSVBQUk9UT19HUkUsICZjYWxsaWQsICZwZWVyX2NhbGxpZCk7CisJZXhwX3JlcGx5LT5leHBlY3RmbiA9IHBwdHBfZXhwZWN0Zm47CisKKwluZl9uYXRfcHB0cF9leHBfZ3JlID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9wcHRwX2hvb2tfZXhwX2dyZSk7CisJaWYgKG5mX25hdF9wcHRwX2V4cF9ncmUgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJbmZfbmF0X3BwdHBfZXhwX2dyZShleHBfb3JpZywgZXhwX3JlcGx5KTsKKwlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cF9vcmlnKSAhPSAwKQorCQlnb3RvIG91dF9wdXRfYm90aDsKKwlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cF9yZXBseSkgIT0gMCkKKwkJZ290byBvdXRfdW5leHBlY3Rfb3JpZzsKKworCS8qIEFkZCBHUkUga2V5bWFwIGVudHJpZXMgKi8KKwlpZiAobmZfY3RfZ3JlX2tleW1hcF9hZGQoY3QsIElQX0NUX0RJUl9PUklHSU5BTCwgJmV4cF9vcmlnLT50dXBsZSkgIT0gMCkKKwkJZ290byBvdXRfdW5leHBlY3RfYm90aDsKKwlpZiAobmZfY3RfZ3JlX2tleW1hcF9hZGQoY3QsIElQX0NUX0RJUl9SRVBMWSwgJmV4cF9yZXBseS0+dHVwbGUpICE9IDApIHsKKwkJbmZfY3RfZ3JlX2tleW1hcF9kZXN0cm95KGN0KTsKKwkJZ290byBvdXRfdW5leHBlY3RfYm90aDsKKwl9CisJcmV0ID0gMDsKKworb3V0X3B1dF9ib3RoOgorCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cF9yZXBseSk7CitvdXRfcHV0X29yaWc6CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwX29yaWcpOworb3V0OgorCXJldHVybiByZXQ7CisKK291dF91bmV4cGVjdF9ib3RoOgorCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cF9yZXBseSk7CitvdXRfdW5leHBlY3Rfb3JpZzoKKwluZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHBfb3JpZyk7CisJZ290byBvdXRfcHV0X2JvdGg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitwcHRwX2luYm91bmRfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSwKKwkJIHVuc2lnbmVkIGludCByZXFsZW4sCisJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdHJ1Y3QgbmZfY3RfcHB0cF9tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9wcHRwX2luZm87CisJdV9pbnQxNl90IG1zZzsKKwlfX2JlMTYgY2lkID0gMCwgcGNpZCA9IDA7CisJdHlwZW9mKG5mX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkgbmZfbmF0X3BwdHBfaW5ib3VuZDsKKworCW1zZyA9IG50b2hzKGN0bGgtPm1lc3NhZ2VUeXBlKTsKKwlERUJVR1AoImluYm91bmQgY29udHJvbCBtZXNzYWdlICVzXG4iLCBwcHRwX21zZ19uYW1lW21zZ10pOworCisJc3dpdGNoIChtc2cpIHsKKwljYXNlIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWToKKwkJLyogc2VydmVyIGNvbmZpcm1zIG5ldyBjb250cm9sIHNlc3Npb24gKi8KKwkJaWYgKGluZm8tPnNzdGF0ZSA8IFBQVFBfU0VTU0lPTl9SRVFVRVNURUQpCisJCQlnb3RvIGludmFsaWQ7CisJCWlmIChwcHRwUmVxLT5zcmVwLnJlc3VsdENvZGUgPT0gUFBUUF9TVEFSVF9PSykKKwkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQ7CisJCWVsc2UKKwkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9FUlJPUjsKKwkJYnJlYWs7CisKKwljYXNlIFBQVFBfU1RPUF9TRVNTSU9OX1JFUExZOgorCQkvKiBzZXJ2ZXIgY29uZmlybXMgZW5kIG9mIGNvbnRyb2wgc2Vzc2lvbiAqLworCQlpZiAoaW5mby0+c3N0YXRlID4gUFBUUF9TRVNTSU9OX1NUT1BSRVEpCisJCQlnb3RvIGludmFsaWQ7CisJCWlmIChwcHRwUmVxLT5zdHJlcC5yZXN1bHRDb2RlID09IFBQVFBfU1RPUF9PSykKKwkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9OT05FOworCQllbHNlCisJCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fRVJST1I7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX09VVF9DQUxMX1JFUExZOgorCQkvKiBzZXJ2ZXIgYWNjZXB0ZWQgY2FsbCwgd2Ugbm93IGV4cGVjdCBHUkUgZnJhbWVzICovCisJCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfT1VUX1JFUSAmJgorCQkgICAgaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9PVVRfQ09ORikKKwkJCWdvdG8gaW52YWxpZDsKKworCQljaWQgPSBwcHRwUmVxLT5vY2Fjay5jYWxsSUQ7CisJCXBjaWQgPSBwcHRwUmVxLT5vY2Fjay5wZWVyc0NhbGxJRDsKKwkJaWYgKGluZm8tPnBuc19jYWxsX2lkICE9IHBjaWQpCisJCQlnb3RvIGludmFsaWQ7CisJCURFQlVHUCgiJXMsIENJRD0lWCwgUENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLAorCQkJbnRvaHMoY2lkKSwgbnRvaHMocGNpZCkpOworCisJCWlmIChwcHRwUmVxLT5vY2Fjay5yZXN1bHRDb2RlID09IFBQVFBfT1VUQ0FMTF9DT05ORUNUKSB7CisJCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfT1VUX0NPTkY7CisJCQlpbmZvLT5wYWNfY2FsbF9pZCA9IGNpZDsKKwkJCWV4cF9ncmUoY3QsIGNpZCwgcGNpZCk7CisJCX0gZWxzZQorCQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX05PTkU7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX0lOX0NBTExfUkVRVUVTVDoKKwkJLyogc2VydmVyIHRlbGxzIHVzIGFib3V0IGluY29taW5nIGNhbGwgcmVxdWVzdCAqLworCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCisJCQlnb3RvIGludmFsaWQ7CisKKwkJY2lkID0gcHB0cFJlcS0+aWNyZXEuY2FsbElEOworCQlERUJVR1AoIiVzLCBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwgbnRvaHMoY2lkKSk7CisJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9JTl9SRVE7CisJCWluZm8tPnBhY19jYWxsX2lkID0gY2lkOworCQlicmVhazsKKworCWNhc2UgUFBUUF9JTl9DQUxMX0NPTk5FQ1Q6CisJCS8qIHNlcnZlciB0ZWxscyB1cyBhYm91dCBpbmNvbWluZyBjYWxsIGVzdGFibGlzaGVkICovCisJCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfSU5fUkVQICYmCisJCSAgICBpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX0lOX0NPTkYpCisJCQlnb3RvIGludmFsaWQ7CisKKwkJcGNpZCA9IHBwdHBSZXEtPmljY29uLnBlZXJzQ2FsbElEOworCQljaWQgPSBpbmZvLT5wYWNfY2FsbF9pZDsKKworCQlpZiAoaW5mby0+cG5zX2NhbGxfaWQgIT0gcGNpZCkKKwkJCWdvdG8gaW52YWxpZDsKKworCQlERUJVR1AoIiVzLCBQQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sIG50b2hzKHBjaWQpKTsKKwkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX0lOX0NPTkY7CisKKwkJLyogd2UgZXhwZWN0IGEgR1JFIGNvbm5lY3Rpb24gZnJvbSBQQUMgdG8gUE5TICovCisJCWV4cF9ncmUoY3QsIGNpZCwgcGNpZCk7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlk6CisJCS8qIHNlcnZlciBjb25maXJtcyBkaXNjb25uZWN0ICovCisJCWNpZCA9IHBwdHBSZXEtPmRpc2MuY2FsbElEOworCQlERUJVR1AoIiVzLCBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwgbnRvaHMoY2lkKSk7CisJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9OT05FOworCisJCS8qIHVudHJhY2sgdGhpcyBjYWxsIGlkLCB1bmV4cGVjdCBHUkUgcGFja2V0cyAqLworCQlwcHRwX2Rlc3Ryb3lfc2libGluZ3MoY3QpOworCQlicmVhazsKKworCWNhc2UgUFBUUF9XQU5fRVJST1JfTk9USUZZOgorCWNhc2UgUFBUUF9FQ0hPX1JFUVVFU1Q6CisJY2FzZSBQUFRQX0VDSE9fUkVQTFk6CisJCS8qIEkgZG9uJ3QgaGF2ZSB0byBleHBsYWluIHRoZXNlIDspICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byBpbnZhbGlkOworCX0KKworCW5mX25hdF9wcHRwX2luYm91bmQgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3BwdHBfaG9va19pbmJvdW5kKTsKKwlpZiAobmZfbmF0X3BwdHBfaW5ib3VuZCAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQlyZXR1cm4gbmZfbmF0X3BwdHBfaW5ib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLCBwcHRwUmVxKTsKKwlyZXR1cm4gTkZfQUNDRVBUOworCitpbnZhbGlkOgorCURFQlVHUCgiaW52YWxpZCAlczogdHlwZT0lZCBjaWQ9JXUgcGNpZD0ldSAiCisJICAgICAgICJjc3RhdGU9JWQgc3N0YXRlPSVkIHBuc19jaWQ9JXUgcGFjX2NpZD0ldVxuIiwKKwkgICAgICAgbXNnIDw9IFBQVFBfTVNHX01BWCA/IHBwdHBfbXNnX25hbWVbbXNnXSA6IHBwdHBfbXNnX25hbWVbMF0sCisJICAgICAgIG1zZywgbnRvaHMoY2lkKSwgbnRvaHMocGNpZCksICBpbmZvLT5jc3RhdGUsIGluZm8tPnNzdGF0ZSwKKwkgICAgICAgbnRvaHMoaW5mby0+cG5zX2NhbGxfaWQpLCBudG9ocyhpbmZvLT5wYWNfY2FsbF9pZCkpOworCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitwcHRwX291dGJvdW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAorCQkgIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSwKKwkJICB1bnNpZ25lZCBpbnQgcmVxbGVuLAorCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdHJ1Y3QgbmZfY3RfcHB0cF9tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9wcHRwX2luZm87CisJdV9pbnQxNl90IG1zZzsKKwlfX2JlMTYgY2lkID0gMCwgcGNpZCA9IDA7CisJdHlwZW9mKG5mX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpIG5mX25hdF9wcHRwX291dGJvdW5kOworCisJbXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpOworCURFQlVHUCgib3V0Ym91bmQgY29udHJvbCBtZXNzYWdlICVzXG4iLCBwcHRwX21zZ19uYW1lW21zZ10pOworCisJc3dpdGNoIChtc2cpIHsKKwljYXNlIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVFVRVNUOgorCQkvKiBjbGllbnQgcmVxdWVzdHMgZm9yIG5ldyBjb250cm9sIHNlc3Npb24gKi8KKwkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fTk9ORSkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX1JFUVVFU1RFRDsKKwkJYnJlYWs7CisKKwljYXNlIFBQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1Q6CisJCS8qIGNsaWVudCByZXF1ZXN0cyBlbmQgb2YgY29udHJvbCBzZXNzaW9uICovCisJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9TVE9QUkVROworCQlicmVhazsKKworCWNhc2UgUFBUUF9PVVRfQ0FMTF9SRVFVRVNUOgorCQkvKiBjbGllbnQgaW5pdGlhdGluZyBjb25uZWN0aW9uIHRvIHNlcnZlciAqLworCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCisJCQlnb3RvIGludmFsaWQ7CisJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9PVVRfUkVROworCQkvKiB0cmFjayBQTlMgY2FsbCBpZCAqLworCQljaWQgPSBwcHRwUmVxLT5vY3JlcS5jYWxsSUQ7CisJCURFQlVHUCgiJXMsIENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLCBudG9ocyhjaWQpKTsKKwkJaW5mby0+cG5zX2NhbGxfaWQgPSBjaWQ7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX0lOX0NBTExfUkVQTFk6CisJCS8qIGNsaWVudCBhbnN3ZXJzIGluY29taW5nIGNhbGwgKi8KKwkJaWYgKGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfSU5fUkVRICYmCisJCSAgICBpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX0lOX1JFUCkKKwkJCWdvdG8gaW52YWxpZDsKKworCQljaWQgPSBwcHRwUmVxLT5pY2Fjay5jYWxsSUQ7CisJCXBjaWQgPSBwcHRwUmVxLT5pY2Fjay5wZWVyc0NhbGxJRDsKKwkJaWYgKGluZm8tPnBhY19jYWxsX2lkICE9IHBjaWQpCisJCQlnb3RvIGludmFsaWQ7CisJCURFQlVHUCgiJXMsIENJRD0lWCBQQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sCisJCSAgICAgICBudG9ocyhjaWQpLCBudG9ocyhwY2lkKSk7CisKKwkJaWYgKHBwdHBSZXEtPmljYWNrLnJlc3VsdENvZGUgPT0gUFBUUF9JTkNBTExfQUNDRVBUKSB7CisJCQkvKiBwYXJ0IHR3byBvZiB0aGUgdGhyZWUtd2F5IGhhbmRzaGFrZSAqLworCQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX0lOX1JFUDsKKwkJCWluZm8tPnBuc19jYWxsX2lkID0gY2lkOworCQl9IGVsc2UKKwkJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9OT05FOworCQlicmVhazsKKworCWNhc2UgUFBUUF9DQUxMX0NMRUFSX1JFUVVFU1Q6CisJCS8qIGNsaWVudCByZXF1ZXN0cyBoYW5ndXAgb2YgY2FsbCAqLworCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCisJCQlnb3RvIGludmFsaWQ7CisJCS8qIEZVVFVSRTogaXRlcmF0ZSBvdmVyIGFsbCBjYWxscyBhbmQgY2hlY2sgaWYKKwkJICogY2FsbCBJRCBpcyB2YWxpZC4gIFdlIGRvbid0IGRvIHRoaXMgd2l0aG91dCBuZXduYXQsCisJCSAqIGJlY2F1c2Ugd2Ugb25seSBrbm93IGFib3V0IGxhc3QgY2FsbCAqLworCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfQ0xFQVJfUkVROworCQlicmVhazsKKworCWNhc2UgUFBUUF9TRVRfTElOS19JTkZPOgorCWNhc2UgUFBUUF9FQ0hPX1JFUVVFU1Q6CisJY2FzZSBQUFRQX0VDSE9fUkVQTFk6CisJCS8qIEkgZG9uJ3QgaGF2ZSB0byBleHBsYWluIHRoZXNlIDspICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byBpbnZhbGlkOworCX0KKworCW5mX25hdF9wcHRwX291dGJvdW5kID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpOworCWlmIChuZl9uYXRfcHB0cF9vdXRib3VuZCAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQlyZXR1cm4gbmZfbmF0X3BwdHBfb3V0Ym91bmQocHNrYiwgY3QsIGN0aW5mbywgY3RsaCwgcHB0cFJlcSk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKKworaW52YWxpZDoKKwlERUJVR1AoImludmFsaWQgJXM6IHR5cGU9JWQgY2lkPSV1IHBjaWQ9JXUgIgorCSAgICAgICAiY3N0YXRlPSVkIHNzdGF0ZT0lZCBwbnNfY2lkPSV1IHBhY19jaWQ9JXVcbiIsCisJICAgICAgIG1zZyA8PSBQUFRQX01TR19NQVggPyBwcHRwX21zZ19uYW1lW21zZ10gOiBwcHRwX21zZ19uYW1lWzBdLAorCSAgICAgICBtc2csIG50b2hzKGNpZCksIG50b2hzKHBjaWQpLCAgaW5mby0+Y3N0YXRlLCBpbmZvLT5zc3RhdGUsCisJICAgICAgIG50b2hzKGluZm8tPnBuc19jYWxsX2lkKSwgbnRvaHMoaW5mby0+cGFjX2NhbGxfaWQpKTsKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBwdHBfbXNnX3NpemVbXSA9IHsKKwlbUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1RdICA9IHNpemVvZihzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcXVlc3QpLAorCVtQUFRQX1NUQVJUX1NFU1NJT05fUkVQTFldICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVwbHkpLAorCVtQUFRQX1NUT1BfU0VTU0lPTl9SRVFVRVNUXSAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXF1ZXN0KSwKKwlbUFBUUF9TVE9QX1NFU1NJT05fUkVQTFldICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVwbHkpLAorCVtQUFRQX09VVF9DQUxMX1JFUVVFU1RdICAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QpLAorCVtQUFRQX09VVF9DQUxMX1JFUExZXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cE91dENhbGxSZXBseSksCisJW1BQVFBfSU5fQ0FMTF9SRVFVRVNUXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cEluQ2FsbFJlcXVlc3QpLAorCVtQUFRQX0lOX0NBTExfUkVQTFldCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwSW5DYWxsUmVwbHkpLAorCVtQUFRQX0lOX0NBTExfQ09OTkVDVF0JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBJbkNhbGxDb25uZWN0ZWQpLAorCVtQUFRQX0NBTExfQ0xFQVJfUkVRVUVTVF0gICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwQ2xlYXJDYWxsUmVxdWVzdCksCisJW1BQVFBfQ0FMTF9ESVNDT05ORUNUX05PVElGWV0gPSBzaXplb2Yoc3RydWN0IFBwdHBDYWxsRGlzY29ubmVjdE5vdGlmeSksCisJW1BQVFBfV0FOX0VSUk9SX05PVElGWV0JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBXYW5FcnJvck5vdGlmeSksCisJW1BQVFBfU0VUX0xJTktfSU5GT10JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBTZXRMaW5rSW5mbyksCit9OworCisvKiB0cmFjayBjYWxsZXIgaWQgaW5zaWRlIGNvbnRyb2wgY29ubmVjdGlvbiwgY2FsbCBleHBlY3RfcmVsYXRlZCAqLworc3RhdGljIGludAorY29ubnRyYWNrX3BwdHBfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgICAgc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKKworeworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJc3RydWN0IG5mX2N0X3BwdHBfbWFzdGVyICppbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfcHB0cF9pbmZvOworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0Y3BoOworCXN0cnVjdCBwcHRwX3BrdF9oZHIgX3BwdHBoLCAqcHB0cGg7CisJc3RydWN0IFBwdHBDb250cm9sSGVhZGVyIF9jdGxoLCAqY3RsaDsKKwl1bmlvbiBwcHRwX2N0cmxfdW5pb24gX3BwdHBSZXEsICpwcHRwUmVxOworCXVuc2lnbmVkIGludCB0Y3BsZW4gPSAoKnBza2IpLT5sZW4gLSBwcm90b2ZmOworCXVuc2lnbmVkIGludCBkYXRhbGVuLCByZXFsZW4sIG5leHRoZHJfb2ZmOworCWludCBvbGRzc3RhdGUsIG9sZGNzdGF0ZTsKKwlpbnQgcmV0OworCXVfaW50MTZfdCBtc2c7CisKKwkvKiBkb24ndCBkbyBhbnkgdHJhY2tpbmcgYmVmb3JlIHRjcCBoYW5kc2hha2UgY29tcGxldGUgKi8KKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJbmV4dGhkcl9vZmYgPSBwcm90b2ZmOworCXRjcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIG5leHRoZHJfb2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCUJVR19PTighdGNwaCk7CisJbmV4dGhkcl9vZmYgKz0gdGNwaC0+ZG9mZiAqIDQ7CisgCWRhdGFsZW4gPSB0Y3BsZW4gLSB0Y3BoLT5kb2ZmICogNDsKKworCXBwdHBoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBuZXh0aGRyX29mZiwgc2l6ZW9mKF9wcHRwaCksICZfcHB0cGgpOworCWlmICghcHB0cGgpIHsKKwkJREVCVUdQKCJubyBmdWxsIFBQVFAgaGVhZGVyLCBjYW4ndCB0cmFja1xuIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCW5leHRoZHJfb2ZmICs9IHNpemVvZihfcHB0cGgpOworCWRhdGFsZW4gLT0gc2l6ZW9mKF9wcHRwaCk7CisKKwkvKiBpZiBpdCdzIG5vdCBhIGNvbnRyb2wgbWVzc2FnZSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIGl0ICovCisJaWYgKG50b2hzKHBwdHBoLT5wYWNrZXRUeXBlKSAhPSBQUFRQX1BBQ0tFVF9DT05UUk9MIHx8CisJICAgIG50b2hsKHBwdHBoLT5tYWdpY0Nvb2tpZSkgIT0gUFBUUF9NQUdJQ19DT09LSUUpIHsKKwkJREVCVUdQKCJub3QgYSBjb250cm9sIHBhY2tldFxuIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJY3RsaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgbmV4dGhkcl9vZmYsIHNpemVvZihfY3RsaCksICZfY3RsaCk7CisJaWYgKCFjdGxoKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCW5leHRoZHJfb2ZmICs9IHNpemVvZihfY3RsaCk7CisJZGF0YWxlbiAtPSBzaXplb2YoX2N0bGgpOworCisJcmVxbGVuID0gZGF0YWxlbjsKKwltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7CisJaWYgKG1zZyA+IDAgJiYgbXNnIDw9IFBQVFBfTVNHX01BWCAmJiByZXFsZW4gPCBwcHRwX21zZ19zaXplW21zZ10pCisJCXJldHVybiBORl9BQ0NFUFQ7CisJaWYgKHJlcWxlbiA+IHNpemVvZigqcHB0cFJlcSkpCisJCXJlcWxlbiA9IHNpemVvZigqcHB0cFJlcSk7CisKKwlwcHRwUmVxID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBuZXh0aGRyX29mZiwgcmVxbGVuLCAmX3BwdHBSZXEpOworCWlmICghcHB0cFJlcSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCW9sZHNzdGF0ZSA9IGluZm8tPnNzdGF0ZTsKKwlvbGRjc3RhdGUgPSBpbmZvLT5jc3RhdGU7CisKKwlzcGluX2xvY2tfYmgoJm5mX3BwdHBfbG9jayk7CisKKwkvKiBGSVhNRTogV2UganVzdCBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSBjb250cm9sIGNvbm5lY3Rpb24gaXMgYWx3YXlzCisJICogZXN0YWJsaXNoZWQgZnJvbSBQTlMtPlBBQy4gIEhvd2V2ZXIsIFJGQyBtYWtlcyBubyBndWFyYW50ZWUgKi8KKwlpZiAoZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkKKwkJLyogY2xpZW50IC0+IHNlcnZlciAoUE5TIC0+IFBBQykgKi8KKwkJcmV0ID0gcHB0cF9vdXRib3VuZF9wa3QocHNrYiwgY3RsaCwgcHB0cFJlcSwgcmVxbGVuLCBjdCwKKwkJCQkJY3RpbmZvKTsKKwllbHNlCisJCS8qIHNlcnZlciAtPiBjbGllbnQgKFBBQyAtPiBQTlMpICovCisJCXJldCA9IHBwdHBfaW5ib3VuZF9wa3QocHNrYiwgY3RsaCwgcHB0cFJlcSwgcmVxbGVuLCBjdCwKKwkJCQkgICAgICAgY3RpbmZvKTsKKwlERUJVR1AoInNzdGF0ZTogJWQtPiVkLCBjc3RhdGU6ICVkLT4lZFxuIiwKKwkJb2xkc3N0YXRlLCBpbmZvLT5zc3RhdGUsIG9sZGNzdGF0ZSwgaW5mby0+Y3N0YXRlKTsKKwlzcGluX3VubG9ja19iaCgmbmZfcHB0cF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNvbnRyb2wgcHJvdG9jb2wgaGVscGVyICovCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgcHB0cCBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQkJPSAicHB0cCIsCisJLm1lCQkJPSBUSElTX01PRFVMRSwKKwkubWF4X2V4cGVjdGVkCQk9IDIsCisJLnRpbWVvdXQJCT0gNSAqIDYwLAorCS50dXBsZS5zcmMubDNudW0JPSBBRl9JTkVULAorCS50dXBsZS5zcmMudS50Y3AucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoUFBUUF9DT05UUk9MX1BPUlQpLAorCS50dXBsZS5kc3QucHJvdG9udW0JPSBJUFBST1RPX1RDUCwKKwkubWFzay5zcmMubDNudW0JCT0gMHhmZmZmLAorCS5tYXNrLnNyYy51LnRjcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweGZmZmYpLAorCS5tYXNrLmRzdC5wcm90b251bQk9IDB4ZmYsCisJLmhlbHAJCQk9IGNvbm50cmFja19wcHRwX2hlbHAsCisJLmRlc3Ryb3kJCT0gcHB0cF9kZXN0cm95X3NpYmxpbmdzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX3BwdHBfaW5pdCh2b2lkKQoreworCXJldHVybiBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZwcHRwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19wcHRwX2Zpbmkodm9pZCkKK3sKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnBwdHApOworCW5mX2N0X2dyZV9rZXltYXBfZmx1c2goKTsKK30KKworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX3BwdHBfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfcHB0cF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjFiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCkBAIC0wLDAgKzEsNDEwIEBACisvKiBMMy9MNCBwcm90b2NvbCBzdXBwb3J0IGZvciBuZl9jb25udHJhY2suICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDAzLDIwMDQgVVNBR0kvV0lERSBQcm9qZWN0IDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KKworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqbmZfY3RfcHJvdG9zW1BGX01BWF0gX19yZWFkX21vc3RseTsKK3N0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbmZfY3RfbDNwcm90b3NbQUZfTUFYXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDNwcm90b3MpOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorc3RhdGljIERFRklORV9NVVRFWChuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOworCitzdGF0aWMgaW50CituZl9jdF9yZWdpc3Rlcl9zeXNjdGwoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKipoZWFkZXIsIHN0cnVjdCBjdGxfdGFibGUgKnBhdGgsCisJCSAgICAgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgKnVzZXJzKQoreworCWlmICgqaGVhZGVyID09IE5VTEwpIHsKKwkJKmhlYWRlciA9IG5mX3JlZ2lzdGVyX3N5c2N0bF90YWJsZShwYXRoLCB0YWJsZSk7CisJCWlmICgqaGVhZGVyID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKHVzZXJzICE9IE5VTEwpCisJCSgqdXNlcnMpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCituZl9jdF91bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqKmhlYWRlciwKKwkJCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgKnVzZXJzKQoreworCWlmICh1c2VycyAhPSBOVUxMICYmIC0tKnVzZXJzID4gMCkKKwkJcmV0dXJuOworCW5mX3VucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKCpoZWFkZXIsIHRhYmxlKTsKKwkqaGVhZGVyID0gTlVMTDsKK30KKyNlbmRpZgorCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKgorX19uZl9jdF9sNHByb3RvX2ZpbmQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IGw0cHJvdG8pCit7CisJaWYgKHVubGlrZWx5KGwzcHJvdG8gPj0gQUZfTUFYIHx8IG5mX2N0X3Byb3Rvc1tsM3Byb3RvXSA9PSBOVUxMKSkKKwkJcmV0dXJuICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljOworCisJcmV0dXJuIG5mX2N0X3Byb3Rvc1tsM3Byb3RvXVtsNHByb3RvXTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY3RfbDRwcm90b19maW5kKTsKKworLyogdGhpcyBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBwcm90b2NvbCBoZWxwZXIsIHNpbmNlCisgKiBpdCBmYWxscyBiYWNrIHRvIGdlbmVyaWNfcHJvdG9jb2wgKi8KK3N0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqCituZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KHVfaW50MTZfdCBsM3Byb3RvLCB1X2ludDhfdCBsNHByb3RvKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCXAgPSBfX25mX2N0X2w0cHJvdG9fZmluZChsM3Byb3RvLCBsNHByb3RvKTsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHAtPm1lKSkKKwkJcCA9ICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljOworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gcDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2w0cHJvdG9fZmluZF9nZXQpOworCit2b2lkIG5mX2N0X2w0cHJvdG9fcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcCkKK3sKKwltb2R1bGVfcHV0KHAtPm1lKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2w0cHJvdG9fcHV0KTsKKworc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICoKK25mX2N0X2wzcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8pCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcCA9IF9fbmZfY3RfbDNwcm90b19maW5kKGwzcHJvdG8pOworCWlmICghdHJ5X21vZHVsZV9nZXQocC0+bWUpKQorCQlwID0gJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWM7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiBwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDNwcm90b19maW5kX2dldCk7CisKK3ZvaWQgbmZfY3RfbDNwcm90b19wdXQoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwKQoreworCW1vZHVsZV9wdXQocC0+bWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDNwcm90b19wdXQpOworCitpbnQKK25mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodW5zaWduZWQgc2hvcnQgbDNwcm90bykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcDsKKworcmV0cnk6CXAgPSBuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KGwzcHJvdG8pOworCWlmIChwID09ICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljKSB7CisJCXJldCA9IHJlcXVlc3RfbW9kdWxlKCJuZl9jb25udHJhY2stJWQiLCBsM3Byb3RvKTsKKwkJaWYgKCFyZXQpCisJCQlnb3RvIHJldHJ5OworCisJCXJldHVybiAtRVBST1RPVFlQRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQpOworCit2b2lkIG5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh1bnNpZ25lZCBzaG9ydCBsM3Byb3RvKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCXAgPSBfX25mX2N0X2wzcHJvdG9fZmluZChsM3Byb3RvKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJbW9kdWxlX3B1dChwLT5tZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQpOworCitzdGF0aWMgaW50IGtpbGxfbDNwcm90byhzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSA9PQorCQkJKChzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKilkYXRhKS0+bDNwcm90byk7Cit9CisKK3N0YXRpYyBpbnQga2lsbF9sNHByb3RvKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKKwlsNHByb3RvID0gKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqKWRhdGE7CisJcmV0dXJuIChpLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gPT0KKwkJCWw0cHJvdG8tPmw0cHJvdG8pICYmCisJICAgICAgIChpLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW0gPT0KKwkJCWw0cHJvdG8tPmwzcHJvdG8pOworfQorCitzdGF0aWMgaW50IG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXJfc3lzY3RsKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bykKK3sKKwlpbnQgZXJyID0gMDsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKKwltdXRleF9sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOworCWlmIChsM3Byb3RvLT5jdGxfdGFibGUgIT0gTlVMTCkgeworCQllcnIgPSBuZl9jdF9yZWdpc3Rlcl9zeXNjdGwoJmwzcHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCisJCQkJCSAgICBsM3Byb3RvLT5jdGxfdGFibGVfcGF0aCwKKwkJCQkJICAgIGwzcHJvdG8tPmN0bF90YWJsZSwgTlVMTCk7CisJfQorCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5mX2N0X2wzcHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvKQoreworI2lmZGVmIENPTkZJR19TWVNDVEwKKwltdXRleF9sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOworCWlmIChsM3Byb3RvLT5jdGxfdGFibGVfaGVhZGVyICE9IE5VTEwpCisJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKCZsM3Byb3RvLT5jdGxfdGFibGVfaGVhZGVyLAorCQkJCQlsM3Byb3RvLT5jdGxfdGFibGUsIE5VTEwpOworCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKKyNlbmRpZgorfQorCitpbnQgbmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90bykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcm90by0+bDNwcm90byA+PSBBRl9NQVgpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJaWYgKG5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSAhPSAmbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJbmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dID0gcHJvdG87CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwlyZXQgPSBuZl9jdF9sM3Byb3RvX3JlZ2lzdGVyX3N5c2N0bChwcm90byk7CisJaWYgKHJldCA8IDApCisJCW5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIocHJvdG8pOworCXJldHVybiByZXQ7CisKK291dF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sM3Byb3RvX3JlZ2lzdGVyKTsKKworaW50IG5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90bykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcm90by0+bDNwcm90byA+PSBBRl9NQVgpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJaWYgKG5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSAhPSBwcm90bykgeworCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwluZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10gPSAmbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYzsKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCW5mX2N0X2wzcHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwocHJvdG8pOworCisJLyogU29tZWJvZHkgY291bGQgYmUgc3RpbGwgbG9va2luZyBhdCB0aGUgcHJvdG8gaW4gYmguICovCisJc3luY2hyb25pemVfbmV0KCk7CisKKwkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KKwluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9sM3Byb3RvLCBwcm90byk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgbmZfY3RfbDRwcm90b19yZWdpc3Rlcl9zeXNjdGwoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQoreworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CisJaWYgKGw0cHJvdG8tPmN0bF90YWJsZSAhPSBOVUxMKSB7CisJCWVyciA9IG5mX2N0X3JlZ2lzdGVyX3N5c2N0bChsNHByb3RvLT5jdGxfdGFibGVfaGVhZGVyLAorCQkJCQkgICAgbmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCwKKwkJCQkJICAgIGw0cHJvdG8tPmN0bF90YWJsZSwKKwkJCQkJICAgIGw0cHJvdG8tPmN0bF90YWJsZV91c2Vycyk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfQorI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwlpZiAobDRwcm90by0+Y3RsX2NvbXBhdF90YWJsZSAhPSBOVUxMKSB7CisJCWVyciA9IG5mX2N0X3JlZ2lzdGVyX3N5c2N0bCgmbDRwcm90by0+Y3RsX2NvbXBhdF90YWJsZV9oZWFkZXIsCisJCQkJCSAgICBuZl9uZXRfaXB2NF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgsCisJCQkJCSAgICBsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlLCBOVUxMKTsKKwkJaWYgKGVyciA9PSAwKQorCQkJZ290byBvdXQ7CisJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCisJCQkJCWw0cHJvdG8tPmN0bF90YWJsZSwKKwkJCQkJbDRwcm90by0+Y3RsX3RhYmxlX3VzZXJzKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLworb3V0OgorCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8pCit7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CisJaWYgKGw0cHJvdG8tPmN0bF90YWJsZV9oZWFkZXIgIT0gTlVMTCAmJgorCSAgICAqbDRwcm90by0+Y3RsX3RhYmxlX2hlYWRlciAhPSBOVUxMKQorCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bChsNHByb3RvLT5jdGxfdGFibGVfaGVhZGVyLAorCQkJCQlsNHByb3RvLT5jdGxfdGFibGUsCisJCQkJCWw0cHJvdG8tPmN0bF90YWJsZV91c2Vycyk7CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAorCWlmIChsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlX2hlYWRlciAhPSBOVUxMKQorCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bCgmbDRwcm90by0+Y3RsX2NvbXBhdF90YWJsZV9oZWFkZXIsCisJCQkJCWw0cHJvdG8tPmN0bF9jb21wYXRfdGFibGUsIE5VTEwpOworI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KKwltdXRleF91bmxvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworfQorCisvKiBGSVhNRTogQWxsb3cgTlVMTCBmdW5jdGlvbnMgYW5kIHN1YiBpbiBwb2ludGVycyB0byBnZW5lcmljIGZvcgorICAgdGhlbS4gLS1SUiAqLworaW50IG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChsNHByb3RvLT5sM3Byb3RvID49IFBGX01BWCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsNHByb3RvID09ICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKQorCQlyZXR1cm4gbmZfY3RfbDRwcm90b19yZWdpc3Rlcl9zeXNjdGwobDRwcm90byk7CisKK3JldHJ5OgorCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlpZiAobmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dKSB7CisJCWlmIChuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10KKwkJCQkhPSAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYykgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfSBlbHNlIHsKKwkJLyogbDNwcm90byBtYXkgYmUgbG9hZGVkIGxhdHRlci4gKi8KKwkJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqcHJvdG9fYXJyYXk7CisJCWludCBpOworCisJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCisJCXByb3RvX2FycmF5ID0gKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqKikKKwkJCQlrbWFsbG9jKE1BWF9ORl9DVF9QUk9UTyAqCisJCQkJCSBzaXplb2Yoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICopLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHByb3RvX2FycmF5ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05GX0NUX1BST1RPOyBpKyspCisJCQlwcm90b19hcnJheVtpXSA9ICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljOworCisJCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkJaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXSkgeworCQkJLyogYmFkIHRpbWluZywgYnV0IG5vIHByb2JsZW0gKi8KKwkJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCQkJa2ZyZWUocHJvdG9fYXJyYXkpOworCQl9IGVsc2UgeworCQkJbmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dID0gcHJvdG9fYXJyYXk7CisJCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkJfQorCisJCS8qCisJCSAqIEp1c3Qgb25jZSBiZWNhdXNlIGFycmF5IGlzIG5ldmVyIGZyZWVkIHVudGlsIHVubG9hZGluZworCQkgKiBuZl9jb25udHJhY2sua28KKwkJICovCisJCWdvdG8gcmV0cnk7CisJfQorCisJbmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dID0gbDRwcm90bzsKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCXJldCA9IG5mX2N0X2w0cHJvdG9fcmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOworCWlmIChyZXQgPCAwKQorCQluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKGw0cHJvdG8pOworCXJldHVybiByZXQ7CisKK291dF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKTsKKworaW50IG5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQoreworCWludCByZXQgPSAwOworCisJaWYgKGw0cHJvdG8tPmwzcHJvdG8gPj0gUEZfTUFYKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGw0cHJvdG8gPT0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpIHsKKwkJbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyX3N5c2N0bChsNHByb3RvKTsKKwkJZ290byBvdXQ7CisJfQorCisJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWlmIChuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10KKwkgICAgIT0gbDRwcm90bykgeworCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJbmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dCisJCT0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWM7CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOworCisJLyogU29tZWJvZHkgY291bGQgYmUgc3RpbGwgbG9va2luZyBhdCB0aGUgcHJvdG8gaW4gYmguICovCisJc3luY2hyb25pemVfbmV0KCk7CisKKwkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KKwluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9sNHByb3RvLCBsNHByb3RvKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYwppbmRleCAyNjQwOGJiLi42OTkwMjUzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgogCi11bnNpZ25lZCBpbnQgbmZfY3RfZ2VuZXJpY190aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSA2MDAqSFo7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X2dlbmVyaWNfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gNjAwKkhaOwogCiBzdGF0aWMgaW50IGdlbmVyaWNfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCkBAIC03MSwxMCArNzEsNDIgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbCA9CisjaWZkZWYgQ09ORklHX1NZU0NUTAorc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpnZW5lcmljX3N5c2N0bF9oZWFkZXI7CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBnZW5lcmljX3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19HRU5FUklDX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfZ2VuZXJpY190aW1lb3V0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X2dlbmVyaWNfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9OworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGdlbmVyaWNfY29tcGF0X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19nZW5lcmljX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfZ2VuZXJpY190aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMgPQogewogCS5sM3Byb3RvCQk9IFBGX1VOU1BFQywKLQkucHJvdG8JCQk9IDAsCisJLmw0cHJvdG8JCT0gMCwKIAkubmFtZQkJCT0gInVua25vd24iLAogCS5wa3RfdG9fdHVwbGUJCT0gZ2VuZXJpY19wa3RfdG9fdHVwbGUsCiAJLmludmVydF90dXBsZQkJPSBnZW5lcmljX2ludmVydF90dXBsZSwKQEAgLTgyLDQgKzExNCwxMSBAQAogCS5wcmludF9jb25udHJhY2sJPSBnZW5lcmljX3ByaW50X2Nvbm50cmFjaywKIAkucGFja2V0CQkJPSBwYWNrZXQsCiAJLm5ldwkJCT0gbmV3LAorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZnZW5lcmljX3N5c2N0bF9oZWFkZXIsCisJLmN0bF90YWJsZQkJPSBnZW5lcmljX3N5c2N0bF90YWJsZSwKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCisJLmN0bF9jb21wYXRfdGFibGUJPSBnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGUsCisjZW5kaWYKKyNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxOTNjZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5jCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jIC0gVmVyc2lvbiAzLjAKKyAqCisgKiBDb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBtb2R1bGUgZm9yIEdSRS4KKyAqCisgKiBHUkUgaXMgYSBnZW5lcmljIGVuY2Fwc3VsYXRpb24gcHJvdG9jb2wsIHdoaWNoIGlzIGdlbmVyYWxseSBub3QgdmVyeQorICogc3VpdGVkIGZvciBOQVQsIGFzIGl0IGhhcyBubyBwcm90b2NvbC1zcGVjaWZpYyBwYXJ0IGFzIHBvcnQgbnVtYmVycy4KKyAqCisgKiBJdCBoYXMgYW4gb3B0aW9uYWwga2V5IGZpZWxkLCB3aGljaCBtYXkgaGVscCB1cyBkaXN0aW5ndWlzaGluZyB0d28KKyAqIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIHNhbWUgdHdvIGhvc3RzLgorICoKKyAqIEdSRSBpcyBkZWZpbmVkIGluIFJGQyAxNzAxIGFuZCBSRkMgMTcwMiwgYXMgd2VsbCBhcyBSRkMgMjc4NAorICoKKyAqIFBQVFAgaXMgYnVpbHQgb24gdG9wIG9mIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBHUkUsIGFuZCBoYXMgYSBtYW5kYXRvcnkKKyAqIGZpZWxkIGNhbGxlZCAiQ2FsbElEIiwgd2hpY2ggc2VydmVzIHVzIGZvciB0aGUgc2FtZSBwdXJwb3NlIGFzIHRoZSBrZXkKKyAqIGZpZWxkIGluIHBsYWluIEdSRS4KKyAqCisgKiBEb2N1bWVudGF0aW9uIGFib3V0IFBQVFAgY2FuIGJlIGZvdW5kIGluIFJGQyAyNjM3CisgKgorICogKEMpIDIwMDAtMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmg+CisKKyNkZWZpbmUgR1JFX1RJTUVPVVQJCSgzMCAqIEhaKQorI2RlZmluZSBHUkVfU1RSRUFNX1RJTUVPVVQJKDE4MCAqIEhaKQorCisjaWYgMAorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JXM6ICIgZm9ybWF0LCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdQKHgsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIERFRklORV9SV0xPQ0sobmZfY3RfZ3JlX2xvY2spOworc3RhdGljIExJU1RfSEVBRChncmVfa2V5bWFwX2xpc3QpOworCit2b2lkIG5mX2N0X2dyZV9rZXltYXBfZmx1c2godm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOworCisJd3JpdGVfbG9ja19iaCgmbmZfY3RfZ3JlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZncmVfa2V5bWFwX2xpc3QpIHsKKwkJbGlzdF9kZWwocG9zKTsKKwkJa2ZyZWUocG9zKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKG5mX2N0X2dyZV9rZXltYXBfZmx1c2gpOworCitzdGF0aWMgaW5saW5lIGludCBncmVfa2V5X2NtcGZuKGNvbnN0IHN0cnVjdCBuZl9jdF9ncmVfa2V5bWFwICprbSwKKwkJCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KQoreworCXJldHVybiBrbS0+dHVwbGUuc3JjLmwzbnVtID09IHQtPnNyYy5sM251bSAmJgorCSAgICAgICAhbWVtY21wKCZrbS0+dHVwbGUuc3JjLnUzLCAmdC0+c3JjLnUzLCBzaXplb2YodC0+c3JjLnUzKSkgJiYKKwkgICAgICAgIW1lbWNtcCgma20tPnR1cGxlLmRzdC51MywgJnQtPmRzdC51Mywgc2l6ZW9mKHQtPmRzdC51MykpICYmCisJICAgICAgIGttLT50dXBsZS5kc3QucHJvdG9udW0gPT0gdC0+ZHN0LnByb3RvbnVtICYmCisJICAgICAgIGttLT50dXBsZS5kc3QudS5hbGwgPT0gdC0+ZHN0LnUuYWxsOworfQorCisvKiBsb29rIHVwIHRoZSBzb3VyY2Uga2V5IGZvciBhIGdpdmVuIHR1cGxlICovCitzdGF0aWMgX19iZTE2IGdyZV9rZXltYXBfbG9va3VwKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpCit7CisJc3RydWN0IG5mX2N0X2dyZV9rZXltYXAgKmttOworCV9fYmUxNiBrZXkgPSAwOworCisJcmVhZF9sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJmdyZV9rZXltYXBfbGlzdCwgbGlzdCkgeworCQlpZiAoZ3JlX2tleV9jbXBmbihrbSwgdCkpIHsKKwkJCWtleSA9IGttLT50dXBsZS5zcmMudS5ncmUua2V5OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKKworCURFQlVHUCgibG9va3VwIHNyYyBrZXkgMHgleCBmb3IgIiwga2V5KTsKKwlORl9DVF9EVU1QX1RVUExFKHQpOworCisJcmV0dXJuIGtleTsKK30KKworLyogYWRkIGEgc2luZ2xlIGtleW1hcCBlbnRyeSwgYXNzb2NpYXRlIHdpdGggc3BlY2lmaWVkIG1hc3RlciBjdCAqLworaW50IG5mX2N0X2dyZV9rZXltYXBfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciwKKwkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KQoreworCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOworCXN0cnVjdCBuZl9jdF9ncmVfa2V5bWFwICoqa21wLCAqa207CisKKwlCVUdfT04oc3RyY21wKGhlbHAtPmhlbHBlci0+bmFtZSwgInBwdHAiKSk7CisJa21wID0gJmhlbHAtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcFtkaXJdOworCWlmICgqa21wKSB7CisJCS8qIGNoZWNrIHdoZXRoZXIgaXQncyBhIHJldHJhbnNtaXNzaW9uICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoa20sICZncmVfa2V5bWFwX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChncmVfa2V5X2NtcGZuKGttLCB0KSAmJiBrbSA9PSAqa21wKQorCQkJCXJldHVybiAwOworCQl9CisJCURFQlVHUCgidHJ5aW5nIHRvIG92ZXJyaWRlIGtleW1hcF8lcyBmb3IgY3QgJXBcbiIsCisJCQlkaXIgPT0gSVBfQ1RfRElSX1JFUExZID8gInJlcGx5IiA6ICJvcmlnIiwgY3QpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlrbSA9IGttYWxsb2Moc2l6ZW9mKCprbSksIEdGUF9BVE9NSUMpOworCWlmICgha20pCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweSgma20tPnR1cGxlLCB0LCBzaXplb2YoKnQpKTsKKwkqa21wID0ga207CisKKwlERUJVR1AoImFkZGluZyBuZXcgZW50cnkgJXA6ICIsIGttKTsKKwlORl9DVF9EVU1QX1RVUExFKCZrbS0+dHVwbGUpOworCisJd3JpdGVfbG9ja19iaCgmbmZfY3RfZ3JlX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmttLT5saXN0LCAmZ3JlX2tleW1hcF9saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZ3JlX2tleW1hcF9hZGQpOworCisvKiBkZXN0cm95IHRoZSBrZXltYXAgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIG1hc3RlciBjdCAqLwordm9pZCBuZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7CisKKwlERUJVR1AoImVudGVyaW5nIGZvciBjdCAlcFxuIiwgY3QpOworCUJVR19PTihzdHJjbXAoaGVscC0+aGVscGVyLT5uYW1lLCAicHB0cCIpKTsKKworCXdyaXRlX2xvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKKwlmb3IgKGRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsgZGlyIDwgSVBfQ1RfRElSX01BWDsgZGlyKyspIHsKKwkJaWYgKGhlbHAtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcFtkaXJdKSB7CisJCQlERUJVR1AoInJlbW92aW5nICVwIGZyb20gbGlzdFxuIiwKKwkJCQloZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBbZGlyXSk7CisJCQlsaXN0X2RlbCgmaGVscC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwW2Rpcl0tPmxpc3QpOworCQkJa2ZyZWUoaGVscC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwW2Rpcl0pOworCQkJaGVscC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwW2Rpcl0gPSBOVUxMOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmbmZfY3RfZ3JlX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZ3JlX2tleW1hcF9kZXN0cm95KTsKKworLyogUFVCTElDIENPTk5UUkFDSyBQUk9UTyBIRUxQRVIgRlVOQ1RJT05TICovCisKKy8qIGludmVydCBncmUgcGFydCBvZiB0dXBsZSAqLworc3RhdGljIGludCBncmVfaW52ZXJ0X3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcpCit7CisJdHVwbGUtPmRzdC51LmdyZS5rZXkgPSBvcmlnLT5zcmMudS5ncmUua2V5OworCXR1cGxlLT5zcmMudS5ncmUua2V5ID0gb3JpZy0+ZHN0LnUuZ3JlLmtleTsKKwlyZXR1cm4gMTsKK30KKworLyogZ3JlIGhkciBpbmZvIHRvIHR1cGxlICovCitzdGF0aWMgaW50IGdyZV9wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkJICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJc3RydWN0IGdyZV9oZHJfcHB0cCBfcGdyZWhkciwgKnBncmVoZHI7CisJX19iZTE2IHNyY2tleTsKKwlzdHJ1Y3QgZ3JlX2hkciBfZ3JlaGRyLCAqZ3JlaGRyOworCisJLyogZmlyc3Qgb25seSBkZWxpbmVhcml6ZSBvbGQgUkZDMTcwMSBHUkUgaGVhZGVyICovCisJZ3JlaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9ncmVoZHIpLCAmX2dyZWhkcik7CisJaWYgKCFncmVoZHIgfHwgZ3JlaGRyLT52ZXJzaW9uICE9IEdSRV9WRVJTSU9OX1BQVFApIHsKKwkJLyogdHJ5IHRvIGJlaGF2ZSBsaWtlICJuZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYyIgKi8KKwkJdHVwbGUtPnNyYy51LmFsbCA9IDA7CisJCXR1cGxlLT5kc3QudS5hbGwgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBQUFRQIGhlYWRlciBpcyB2YXJpYWJsZSBsZW5ndGgsIG9ubHkgbmVlZCB1cCB0byB0aGUgY2FsbF9pZCBmaWVsZCAqLworCXBncmVoZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX3BncmVoZHIpOworCWlmICghcGdyZWhkcikKKwkJcmV0dXJuIDE7CisKKwlpZiAobnRvaHMoZ3JlaGRyLT5wcm90b2NvbCkgIT0gR1JFX1BST1RPQ09MX1BQVFApIHsKKwkJREVCVUdQKCJHUkVfVkVSU0lPTl9QUFRQIGJ1dCB1bmtub3duIHByb3RvXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdHVwbGUtPmRzdC51LmdyZS5rZXkgPSBwZ3JlaGRyLT5jYWxsX2lkOworCXNyY2tleSA9IGdyZV9rZXltYXBfbG9va3VwKHR1cGxlKTsKKwl0dXBsZS0+c3JjLnUuZ3JlLmtleSA9IHNyY2tleTsKKworCXJldHVybiAxOworfQorCisvKiBwcmludCBncmUgcGFydCBvZiB0dXBsZSAqLworc3RhdGljIGludCBncmVfcHJpbnRfdHVwbGUoc3RydWN0IHNlcV9maWxlICpzLAorCQkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJcmV0dXJuIHNlcV9wcmludGYocywgInNyY2tleT0weCV4IGRzdGtleT0weCV4ICIsCisJCQkgIG50b2hzKHR1cGxlLT5zcmMudS5ncmUua2V5KSwKKwkJCSAgbnRvaHModHVwbGUtPmRzdC51LmdyZS5rZXkpKTsKK30KKworLyogcHJpbnQgcHJpdmF0ZSBkYXRhIGZvciBjb25udHJhY2sgKi8KK3N0YXRpYyBpbnQgZ3JlX3ByaW50X2Nvbm50cmFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXJldHVybiBzZXFfcHJpbnRmKHMsICJ0aW1lb3V0PSV1LCBzdHJlYW1fdGltZW91dD0ldSAiLAorCQkJICAoY3QtPnByb3RvLmdyZS50aW1lb3V0IC8gSFopLAorCQkJICAoY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCAvIEhaKSk7Cit9CisKKy8qIFJldHVybnMgdmVyZGljdCBmb3IgcGFja2V0LCBhbmQgbWF5IG1vZGlmeSBjb25udHJhY2sgKi8KK3N0YXRpYyBpbnQgZ3JlX3BhY2tldChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgaW50IHBmLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwkvKiBJZiB3ZSd2ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzLCB0aGlzIGlzIGEgR1JFIGNvbm5lY3Rpb24uCisJICogRXh0ZW5kIHRpbWVvdXQuICovCisJaWYgKGN0LT5zdGF0dXMgJiBJUFNfU0VFTl9SRVBMWSkgeworCQluZl9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgc2tiLAorCQkJCSAgIGN0LT5wcm90by5ncmUuc3RyZWFtX3RpbWVvdXQpOworCQkvKiBBbHNvLCBtb3JlIGxpa2VseSB0byBiZSBpbXBvcnRhbnQsIGFuZCBub3QgYSBwcm9iZS4gKi8KKwkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKTsKKwkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOworCX0gZWxzZQorCQluZl9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgc2tiLAorCQkJCSAgIGN0LT5wcm90by5ncmUudGltZW91dCk7CisKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kLiAqLworc3RhdGljIGludCBncmVfbmV3KHN0cnVjdCBuZl9jb25uICpjdCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgdW5zaWduZWQgaW50IGRhdGFvZmYpCit7CisJREVCVUdQKCI6ICIpOworCU5GX0NUX0RVTVBfVFVQTEUoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSk7CisKKwkvKiBpbml0aWFsaXplIHRvIHNhbmUgdmFsdWUuICBJZGVhbGx5IGEgY29ubnRyYWNrIGhlbHBlcgorCSAqIChlLmcuIGluIGNhc2Ugb2YgcHB0cCkgaXMgaW5jcmVhc2luZyB0aGVtICovCisJY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IEdSRV9TVFJFQU1fVElNRU9VVDsKKwljdC0+cHJvdG8uZ3JlLnRpbWVvdXQgPSBHUkVfVElNRU9VVDsKKworCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiBhIGNvbm50cmFjayBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgaGFzaGVzCisgKiBhbmQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCBmcm9tIG1lbW9yeSAqLworc3RhdGljIHZvaWQgZ3JlX2Rlc3Ryb3koc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBjdC0+bWFzdGVyOworCURFQlVHUCgiIGVudGVyaW5nXG4iKTsKKworCWlmICghbWFzdGVyKQorCQlERUJVR1AoIm5vIG1hc3RlciAhPyFcbiIpOworCWVsc2UKKwkJbmZfY3RfZ3JlX2tleW1hcF9kZXN0cm95KG1hc3Rlcik7Cit9CisKKy8qIHByb3RvY29sIGhlbHBlciBzdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fZ3JlNCA9IHsKKwkubDNwcm90bwkgPSBBRl9JTkVULAorCS5sNHByb3RvCSA9IElQUFJPVE9fR1JFLAorCS5uYW1lCQkgPSAiZ3JlIiwKKwkucGt0X3RvX3R1cGxlCSA9IGdyZV9wa3RfdG9fdHVwbGUsCisJLmludmVydF90dXBsZQkgPSBncmVfaW52ZXJ0X3R1cGxlLAorCS5wcmludF90dXBsZQkgPSBncmVfcHJpbnRfdHVwbGUsCisJLnByaW50X2Nvbm50cmFjayA9IGdyZV9wcmludF9jb25udHJhY2ssCisJLnBhY2tldAkJID0gZ3JlX3BhY2tldCwKKwkubmV3CQkgPSBncmVfbmV3LAorCS5kZXN0cm95CSA9IGdyZV9kZXN0cm95LAorCS5tZSAJCSA9IFRISVNfTU9EVUxFLAorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQorCS50dXBsZV90b19uZmF0dHIgPSBuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0ciwKKwkubmZhdHRyX3RvX3R1cGxlID0gbmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX2N0X3Byb3RvX2dyZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19ncmU0KTsKK30KKworc3RhdGljIHZvaWQgbmZfY3RfcHJvdG9fZ3JlX2Zpbmkodm9pZCkKK3sKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19ncmU0KTsKKwluZl9jdF9ncmVfa2V5bWFwX2ZsdXNoKCk7Cit9CisKK21vZHVsZV9pbml0KG5mX2N0X3Byb3RvX2dyZV9pbml0KTsKK21vZHVsZV9leGl0KG5mX2N0X3Byb3RvX2dyZV9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IGFmNTY4NzcuLjc2ZTI2MzYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKQEAgLTMyLDcgKzMyLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+CiAKICNpZiAwCiAjZGVmaW5lIERFQlVHUChmb3JtYXQsIC4uLikgcHJpbnRrKGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCkBAIC0yMTYsNyArMjE3LDcgQEAKIGZvciAob2Zmc2V0ID0gZGF0YW9mZiArIHNpemVvZihzY3RwX3NjdHBoZHJfdCksIGNvdW50ID0gMDsJCVwKIAlvZmZzZXQgPCBza2ItPmxlbiAmJgkJCQkJCVwKIAkoc2NoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX3NjaCksICZfc2NoKSk7CVwKLQlvZmZzZXQgKz0gKGh0b25zKHNjaC0+bGVuZ3RoKSArIDMpICYgfjMsIGNvdW50KyspCisJb2Zmc2V0ICs9IChudG9ocyhzY2gtPmxlbmd0aCkgKyAzKSAmIH4zLCBjb3VudCsrKQogCiAvKiBTb21lIHZhbGlkaXR5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGNodW5rcyBhcmUgZmluZSAqLwogc3RhdGljIGludCBkb19iYXNpY19jaGVja3Moc3RydWN0IG5mX2Nvbm4gKmNvbm50cmFjaywKQEAgLTUwOCwzNiArNTA5LDEwIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA0ID0geyAKLQkubDNwcm90bwkgPSBQRl9JTkVULAotCS5wcm90byAJCSA9IElQUFJPVE9fU0NUUCwgCi0JLm5hbWUgCQkgPSAic2N0cCIsCi0JLnBrdF90b190dXBsZSAJID0gc2N0cF9wa3RfdG9fdHVwbGUsIAotCS5pbnZlcnRfdHVwbGUgCSA9IHNjdHBfaW52ZXJ0X3R1cGxlLCAKLQkucHJpbnRfdHVwbGUgCSA9IHNjdHBfcHJpbnRfdHVwbGUsIAotCS5wcmludF9jb25udHJhY2sgPSBzY3RwX3ByaW50X2Nvbm50cmFjaywKLQkucGFja2V0IAkgPSBzY3RwX3BhY2tldCwgCi0JLm5ldyAJCSA9IHNjdHBfbmV3LCAKLQkuZGVzdHJveSAJID0gTlVMTCwgCi0JLm1lIAkJID0gVEhJU19NT0RVTEUgCi19OwotCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF9zY3RwNiA9IHsgCi0JLmwzcHJvdG8JID0gUEZfSU5FVDYsCi0JLnByb3RvIAkJID0gSVBQUk9UT19TQ1RQLCAKLQkubmFtZSAJCSA9ICJzY3RwIiwKLQkucGt0X3RvX3R1cGxlIAkgPSBzY3RwX3BrdF90b190dXBsZSwgCi0JLmludmVydF90dXBsZSAJID0gc2N0cF9pbnZlcnRfdHVwbGUsIAotCS5wcmludF90dXBsZSAJID0gc2N0cF9wcmludF90dXBsZSwgCi0JLnByaW50X2Nvbm50cmFjayA9IHNjdHBfcHJpbnRfY29ubnRyYWNrLAotCS5wYWNrZXQgCSA9IHNjdHBfcGFja2V0LCAKLQkubmV3IAkJID0gc2N0cF9uZXcsIAotCS5kZXN0cm95IAkgPSBOVUxMLCAKLQkubWUgCQkgPSBUSElTX01PRFVMRSAKLX07Ci0KICNpZmRlZiBDT05GSUdfU1lTQ1RMCi1zdGF0aWMgY3RsX3RhYmxlIG5mX2N0X3N5c2N0bF90YWJsZVtdID0geworc3RhdGljIHVuc2lnbmVkIGludCBzY3RwX3N5c2N0bF90YWJsZV91c2VyczsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc2N0cF9zeXNjdGxfaGVhZGVyOworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgc2N0cF9zeXNjdGxfdGFibGVbXSA9IHsKIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NMT1NFRCwKIAkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY2xvc2VkIiwKQEAgLTU5NCw2MyArNTY5LDEzNCBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKIAl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1zdGF0aWMgY3RsX3RhYmxlIG5mX2N0X25ldGZpbHRlcl90YWJsZVtdID0gewogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05FVEZJTFRFUiwKLQkJLnByb2NuYW1lCT0gIm5ldGZpbHRlciIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBuZl9jdF9zeXNjdGxfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQorCQkuY3RsX25hbWUgPSAwCisJfQogfTsKIAotc3RhdGljIGN0bF90YWJsZSBuZl9jdF9uZXRfdGFibGVbXSA9IHsKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBzY3RwX2NvbXBhdF9zeXNjdGxfdGFibGVbXSA9IHsKIAl7Ci0JCS5jdGxfbmFtZQk9IENUTF9ORVQsCi0JCS5wcm9jbmFtZQk9ICJuZXQiLAotCQkubW9kZQkJPSAwNTU1LCAKLQkJLmNoaWxkCQk9IG5mX2N0X25ldGZpbHRlcl90YWJsZSwKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DTE9TRUQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2Nsb3NlZCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKIAl9LAotCXsgLmN0bF9uYW1lID0gMCB9CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9XQUlULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jb29raWVfd2FpdCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfY29va2llX3dhaXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9FQ0hPRUQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQiLAorCQkuZGF0YQkJPSAmbmZfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0VTVEFCTElTSEVELAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9lc3RhYmxpc2hlZCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1NFTlQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQiLAorCQkuZGF0YQkJPSAmbmZfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1JFQ0QsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX3JlY2QiLAorCQkuZGF0YQkJPSAmbmZfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3JlY2QsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX0FDS19TRU5ULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fYWNrX3NlbnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUgPSAwCisJfQogfTsKLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpuZl9jdF9zeXNjdGxfaGVhZGVyOworI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KICNlbmRpZgogCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDQgPSB7CisJLmwzcHJvdG8JCT0gUEZfSU5FVCwKKwkubDRwcm90byAJCT0gSVBQUk9UT19TQ1RQLAorCS5uYW1lIAkJCT0gInNjdHAiLAorCS5wa3RfdG9fdHVwbGUgCQk9IHNjdHBfcGt0X3RvX3R1cGxlLAorCS5pbnZlcnRfdHVwbGUgCQk9IHNjdHBfaW52ZXJ0X3R1cGxlLAorCS5wcmludF90dXBsZSAJCT0gc2N0cF9wcmludF90dXBsZSwKKwkucHJpbnRfY29ubnRyYWNrCT0gc2N0cF9wcmludF9jb25udHJhY2ssCisJLnBhY2tldCAJCT0gc2N0cF9wYWNrZXQsCisJLm5ldyAJCQk9IHNjdHBfbmV3LAorCS5tZSAJCQk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX3VzZXJzCT0gJnNjdHBfc3lzY3RsX3RhYmxlX3VzZXJzLAorCS5jdGxfdGFibGVfaGVhZGVyCT0gJnNjdHBfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IHNjdHBfc3lzY3RsX3RhYmxlLAorI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwkuY3RsX2NvbXBhdF90YWJsZQk9IHNjdHBfY29tcGF0X3N5c2N0bF90YWJsZSwKKyNlbmRpZgorI2VuZGlmCit9OworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDYgPSB7CisJLmwzcHJvdG8JCT0gUEZfSU5FVDYsCisJLmw0cHJvdG8gCQk9IElQUFJPVE9fU0NUUCwKKwkubmFtZSAJCQk9ICJzY3RwIiwKKwkucGt0X3RvX3R1cGxlIAkJPSBzY3RwX3BrdF90b190dXBsZSwKKwkuaW52ZXJ0X3R1cGxlIAkJPSBzY3RwX2ludmVydF90dXBsZSwKKwkucHJpbnRfdHVwbGUgCQk9IHNjdHBfcHJpbnRfdHVwbGUsCisJLnByaW50X2Nvbm50cmFjawk9IHNjdHBfcHJpbnRfY29ubnRyYWNrLAorCS5wYWNrZXQgCQk9IHNjdHBfcGFja2V0LAorCS5uZXcgCQkJPSBzY3RwX25ldywKKwkubWUgCQkJPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJLmN0bF90YWJsZV91c2Vycwk9ICZzY3RwX3N5c2N0bF90YWJsZV91c2VycywKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZzY3RwX3N5c2N0bF9oZWFkZXIsCisJLmN0bF90YWJsZQkJPSBzY3RwX3N5c2N0bF90YWJsZSwKKyNlbmRpZgorfTsKKwogaW50IF9faW5pdCBuZl9jb25udHJhY2tfcHJvdG9fc2N0cF9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA0KTsKKwlyZXQgPSBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDQpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKCJuZl9jb25udHJhY2tfcHJvdG9fc2N0cDQ6IHByb3RvY29sIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByaW50aygibmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDQ6IHByb3RvY29sIHJlZ2lzdGVyIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KLQlyZXQgPSBuZl9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF9zY3RwNik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3NjdHA2KTsKIAlpZiAocmV0KSB7Ci0JCXByaW50aygibmZfY29ubnRyYWNrX3Byb3RvX3NjdHA2OiBwcm90b2NvbCByZWdpc3RlciBmYWlsZWRcbiIpOworCQlwcmludGsoIm5mX2Nvbm50cmFja19sNHByb3RvX3NjdHA2OiBwcm90b2NvbCByZWdpc3RlciBmYWlsZWRcbiIpOwogCQlnb3RvIGNsZWFudXBfc2N0cDQ7CiAJfQogCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotCW5mX2N0X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3RfbmV0X3RhYmxlLCAwKTsKLQlpZiAobmZfY3Rfc3lzY3RsX2hlYWRlciA9PSBOVUxMKSB7Ci0JCXByaW50aygibmZfY29ubnRyYWNrX3Byb3RvX3NjdHA6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotI2VuZGlmCi0KIAlyZXR1cm4gcmV0OwogCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotIGNsZWFudXA6Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF9zY3RwNik7Ci0jZW5kaWYKICBjbGVhbnVwX3NjdHA0OgotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfc2N0cDQpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3NjdHA0KTsKICBvdXQ6CiAJREVCVUdQKCJTQ1RQIGNvbm50cmFjayBtb2R1bGUgbG9hZGluZyAlc1xuIiwgCiAJCQkJCXJldCA/ICJmYWlsZWQiOiAic3VjY2VlZGVkIik7CkBAIC02NTksMTEgKzcwNSw4IEBACiAKIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19wcm90b19zY3RwX2Zpbmkodm9pZCkKIHsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA2KTsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA0KTsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0gCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG5mX2N0X3N5c2N0bF9oZWFkZXIpOwotI2VuZGlmCisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDYpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3NjdHA0KTsKIAlERUJVR1AoIlNDVFAgY29ubnRyYWNrIG1vZHVsZSB1bmxvYWRlZFxuIik7CiB9CiAKQEAgLTY3MywzICs3MTYsNCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiS2lyYW4gS3VtYXIgSW1taWRpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBmb3IgU0NUUCIpOworTU9EVUxFX0FMSUFTKCJpcF9jb25udHJhY2tfcHJvdG9fc2N0cCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCAyMzhiYmI1Li42MjZiMDAxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtNDIsNyArNDIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC05MiwyMiArOTMsMjIgQEAKICNkZWZpbmUgSE9VUlMgKiA2MCBNSU5TCiAjZGVmaW5lIERBWVMgKiAyNCBIT1VSUwogCi11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQgX19yZWFkX21vc3RseSA9ICAgICAgMiBNSU5TOwotdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2IF9fcmVhZF9tb3N0bHkgPSAgICAgNjAgU0VDUzsKLXVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZCBfX3JlYWRfbW9zdGx5ID0gICA1IERBWVM7Ci11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQgX19yZWFkX21vc3RseSA9ICAgICAgMiBNSU5TOwotdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQgX19yZWFkX21vc3RseSA9ICAgNjAgU0VDUzsKLXVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9sYXN0X2FjayBfX3JlYWRfbW9zdGx5ID0gICAgIDMwIFNFQ1M7Ci11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0IF9fcmVhZF9tb3N0bHkgPSAgICAgMiBNSU5TOwotdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlIF9fcmVhZF9tb3N0bHkgPSAgICAgICAgMTAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQgX19yZWFkX21vc3RseSA9ICAgICAgMiBNSU5TOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9zeW5fcmVjdiBfX3JlYWRfbW9zdGx5ID0gICAgIDYwIFNFQ1M7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIF9fcmVhZF9tb3N0bHkgPSAgIDUgREFZUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQgX19yZWFkX21vc3RseSA9ICAgICAgMiBNSU5TOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0IF9fcmVhZF9tb3N0bHkgPSAgIDYwIFNFQ1M7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrIF9fcmVhZF9tb3N0bHkgPSAgICAgMzAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0IF9fcmVhZF9tb3N0bHkgPSAgICAgMiBNSU5TOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9jbG9zZSBfX3JlYWRfbW9zdGx5ID0gICAgICAgIDEwIFNFQ1M7CiAKIC8qIFJGQzExMjIgc2F5cyB0aGUgUjIgbGltaXQgc2hvdWxkIGJlIGF0IGxlYXN0IDEwMCBzZWNvbmRzLgogICAgTGludXggdXNlcyAxNSBwYWNrZXRzIGFzIGxpbWl0LCB3aGljaCBjb3JyZXNwb25kcyAKICAgIHRvIH4xMy0zMG1pbiBkZXBlbmRpbmcgb24gUlRPLiAqLwotdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zIF9fcmVhZF9tb3N0bHkgPSAgIDUgTUlOUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgX19yZWFkX21vc3RseSA9ICAgNSBNSU5TOwogIAotc3RhdGljIHVuc2lnbmVkIGludCAqIHRjcF90aW1lb3V0c1tdCi09IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ1BfQ09OTlRSQUNLX05PTkUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgKiB0Y3BfdGltZW91dHNbXSA9IHsKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDUF9DT05OVFJBQ0tfTk9ORSAqLwogICAgICZuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudCwgICAgICAgLyogVENQX0NPTk5UUkFDS19TWU5fU0VOVCwgKi8KICAgICAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsICAgICAgIC8qIFRDUF9DT05OVFJBQ0tfU1lOX1JFQ1YsICovCiAgICAgJm5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkLCAgICAvKiBUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVELCAqLwpAQCAtNDczLDggKzQ3NCw4IEBACiAKIAkvKiBGYXN0IHBhdGggZm9yIHRpbWVzdGFtcC1vbmx5IG9wdGlvbiAqLwogCWlmIChsZW5ndGggPT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRCo0Ci0JICAgICYmICooX191MzIgKilwdHIgPT0KLQkgICAgICAgIF9fY29uc3RhbnRfbnRvaGwoKFRDUE9QVF9OT1AgPDwgMjQpIAorCSAgICAmJiAqKF9fYmUzMiAqKXB0ciA9PQorCSAgICAgICAgX19jb25zdGFudF9odG9ubCgoVENQT1BUX05PUCA8PCAyNCkKIAkgICAgICAgIAkJIHwgKFRDUE9QVF9OT1AgPDwgMTYpCiAJICAgICAgICAJCSB8IChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpCiAJICAgICAgICAJCSB8IFRDUE9MRU5fVElNRVNUQU1QKSkKQEAgLTUwNSw5ICs1MDYsNyBAQAogCQkJICAgIAlmb3IgKGkgPSAwOwogCQkJICAgIAkgICAgIGkgPCAob3BzaXplIC0gVENQT0xFTl9TQUNLX0JBU0UpOwogCQkJICAgIAkgICAgIGkgKz0gVENQT0xFTl9TQUNLX1BFUkJMT0NLKSB7Ci0JCQkJCW1lbWNweSgmdG1wLCAoX191MzIgKikocHRyICsgaSkgKyAxLAotCQkJCQkgICAgICAgc2l6ZW9mKF9fdTMyKSk7Ci0JCQkJCXRtcCA9IG50b2hsKHRtcCk7CisJCQkJICAgICAJdG1wID0gbnRvaGwoKigoX19iZTMyICopKHB0citpKSsxKSk7CiAKIAkJCQkJaWYgKGFmdGVyKHRtcCwgKnNhY2spKQogCQkJCQkJKnNhY2sgPSB0bXA7CkBAIC03MzEsNyArNzMwLDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogLyogVXBkYXRlIHNlbmRlci0+dGRfZW5kIGFmdGVyIE5BVCBzdWNjZXNzZnVsbHkgbWFuZ2xlZCB0aGUgcGFja2V0ICovCiAvKiBDYWxsZXIgbXVzdCBsaW5lYXJpemUgc2tiIGF0IHRjcCBoZWFkZXIuICovCiB2b2lkIG5mX2Nvbm50cmFja190Y3BfdXBkYXRlKHN0cnVjdCBza19idWZmICpza2IsCkBAIC03NjMsNyArNzYyLDcgQEAKIAkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbiwKIAkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKIH0KLSAKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja190Y3BfdXBkYXRlKTsKICNlbmRpZgogCiAjZGVmaW5lCVRIX0ZJTgkweDAxCkBAIC0xMTY3LDExICsxMTY2LDIyMSBAQAogCXJldHVybiAwOwogfQogI2VuZGlmCi0gIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdGNwNCA9CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgdW5zaWduZWQgaW50IHRjcF9zeXNjdGxfdGFibGVfdXNlcnM7CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnRjcF9zeXNjdGxfaGVhZGVyOworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdGNwX3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fU0VOVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fc2VudCIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1YsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3JlY3YiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVELAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9GSU5fV0FJVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9maW5fd2FpdCIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9maW5fd2FpdCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0VfV0FJVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZV93YWl0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLLAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2xhc3RfYWNrIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9USU1FX1dBSVQsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfdGltZV93YWl0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X3RpbWVfd2FpdCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0UsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2UiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX01BWF9SRVRSQU5TLAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X21heF9yZXRyYW5zIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfTE9PU0UsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX2xvb3NlIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF9sb29zZSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9CRV9MSUJFUkFMLAorCQkucHJvY25hbWUgICAgICAgPSAibmZfY29ubnRyYWNrX3RjcF9iZV9saWJlcmFsIiwKKwkJLmRhdGEgICAgICAgICAgID0gJm5mX2N0X3RjcF9iZV9saWJlcmFsLAorCQkubWF4bGVuICAgICAgICAgPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUgICAgICAgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciAgID0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX01BWF9SRVRSQU5TLAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF9tYXhfcmV0cmFucyIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfbWF4X3JldHJhbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CisKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0Y3BfY29tcGF0X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9TRU5ULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9zZW50IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9SRUNWLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9yZWN2IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVELAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0ZJTl9XQUlULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Zpbl93YWl0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFX1dBSVQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2xhc3RfYWNrIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1RJTUVfV0FJVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF90aW1lX3dhaXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Nsb3NlIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX01BWF9SRVRSQU5TLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X21heF9yZXRyYW5zIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9MT09TRSwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfbG9vc2UiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX2xvb3NlLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfQkVfTElCRVJBTCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfYmVfbGliZXJhbCIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfYmVfbGliZXJhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX01BWF9SRVRSQU5TLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9tYXhfcmV0cmFucyIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfbWF4X3JldHJhbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3RjcDQgPQogewogCS5sM3Byb3RvCQk9IFBGX0lORVQsCi0JLnByb3RvIAkJCT0gSVBQUk9UT19UQ1AsCisJLmw0cHJvdG8gCQk9IElQUFJPVE9fVENQLAogCS5uYW1lIAkJCT0gInRjcCIsCiAJLnBrdF90b190dXBsZSAJCT0gdGNwX3BrdF90b190dXBsZSwKIAkuaW52ZXJ0X3R1cGxlIAkJPSB0Y3BfaW52ZXJ0X3R1cGxlLApAQCAtMTE4NywxMiArMTM5NiwyMSBAQAogCS50dXBsZV90b19uZmF0dHIJPSBuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gbmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJLmN0bF90YWJsZV91c2Vycwk9ICZ0Y3Bfc3lzY3RsX3RhYmxlX3VzZXJzLAorCS5jdGxfdGFibGVfaGVhZGVyCT0gJnRjcF9zeXNjdGxfaGVhZGVyLAorCS5jdGxfdGFibGUJCT0gdGNwX3N5c2N0bF90YWJsZSwKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCisJLmN0bF9jb21wYXRfdGFibGUJPSB0Y3BfY29tcGF0X3N5c2N0bF90YWJsZSwKKyNlbmRpZgorI2VuZGlmCiB9OworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNCk7CiAKLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDYgPQorc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3RjcDYgPQogewogCS5sM3Byb3RvCQk9IFBGX0lORVQ2LAotCS5wcm90byAJCQk9IElQUFJPVE9fVENQLAorCS5sNHByb3RvIAkJPSBJUFBST1RPX1RDUCwKIAkubmFtZSAJCQk9ICJ0Y3AiLAogCS5wa3RfdG9fdHVwbGUgCQk9IHRjcF9wa3RfdG9fdHVwbGUsCiAJLmludmVydF90dXBsZSAJCT0gdGNwX2ludmVydF90dXBsZSwKQEAgLTEyMDgsNyArMTQyNiwxMCBAQAogCS50dXBsZV90b19uZmF0dHIJPSBuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gbmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJLmN0bF90YWJsZV91c2Vycwk9ICZ0Y3Bfc3lzY3RsX3RhYmxlX3VzZXJzLAorCS5jdGxfdGFibGVfaGVhZGVyCT0gJnRjcF9zeXNjdGxfaGVhZGVyLAorCS5jdGxfdGFibGUJCT0gdGNwX3N5c2N0bF90YWJsZSwKKyNlbmRpZgogfTsKLQotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfcHJvdG9jb2xfdGNwNCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A2KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sNHByb3RvX3RjcDYpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYwppbmRleCBkMjg5ODFjLi5lNDljZDI1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYwpAQCAtMjIsMTMgKzIyLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKwogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaD4KIAotdW5zaWduZWQgaW50IG5mX2N0X3VkcF90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKLXVuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dF9zdHJlYW0gX19yZWFkX21vc3RseSA9IDE4MCpIWjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdWRwX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwKkhaOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dF9zdHJlYW0gX19yZWFkX21vc3RseSA9IDE4MCpIWjsKIAogc3RhdGljIGludCB1ZHBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLApAQCAtMTQ2LDEwICsxNDgsNTkgQEAKIAlyZXR1cm4gTkZfQUNDRVBUOwogfQogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA0ID0KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgdW5zaWduZWQgaW50IHVkcF9zeXNjdGxfdGFibGVfdXNlcnM7CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnVkcF9zeXNjdGxfaGVhZGVyOworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdWRwX3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19VRFBfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja191ZHBfdGltZW91dCIsCisJCS5kYXRhCQk9ICZuZl9jdF91ZHBfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVRfU1RSRUFNLAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3VkcF90aW1lb3V0X3N0cmVhbSIsCisJCS5kYXRhCQk9ICZuZl9jdF91ZHBfdGltZW91dF9zdHJlYW0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB1ZHBfY29tcGF0X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3VkcF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUX1NUUkVBTSwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja191ZHBfdGltZW91dF9zdHJlYW0iLAorCQkuZGF0YQkJPSAmbmZfY3RfdWRwX3RpbWVvdXRfc3RyZWFtLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3VkcDQgPQogewogCS5sM3Byb3RvCQk9IFBGX0lORVQsCi0JLnByb3RvCQkJPSBJUFBST1RPX1VEUCwKKwkubDRwcm90bwkJPSBJUFBST1RPX1VEUCwKIAkubmFtZQkJCT0gInVkcCIsCiAJLnBrdF90b190dXBsZQkJPSB1ZHBfcGt0X3RvX3R1cGxlLAogCS5pbnZlcnRfdHVwbGUJCT0gdWRwX2ludmVydF90dXBsZSwKQEAgLTE2MywxMiArMjE0LDIxIEBACiAJLnR1cGxlX3RvX25mYXR0cgk9IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAogCS5uZmF0dHJfdG9fdHVwbGUJPSBuZl9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX3VzZXJzCT0gJnVkcF9zeXNjdGxfdGFibGVfdXNlcnMsCisJLmN0bF90YWJsZV9oZWFkZXIJPSAmdWRwX3N5c2N0bF9oZWFkZXIsCisJLmN0bF90YWJsZQkJPSB1ZHBfc3lzY3RsX3RhYmxlLAorI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwkuY3RsX2NvbXBhdF90YWJsZQk9IHVkcF9jb21wYXRfc3lzY3RsX3RhYmxlLAorI2VuZGlmCisjZW5kaWYKIH07CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b191ZHA0KTsKIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNiA9CitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNiA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfSU5FVDYsCi0JLnByb3RvCQkJPSBJUFBST1RPX1VEUCwKKwkubDRwcm90bwkJPSBJUFBST1RPX1VEUCwKIAkubmFtZQkJCT0gInVkcCIsCiAJLnBrdF90b190dXBsZQkJPSB1ZHBfcGt0X3RvX3R1cGxlLAogCS5pbnZlcnRfdHVwbGUJCT0gdWRwX2ludmVydF90dXBsZSwKQEAgLTE4Miw3ICsyNDIsMTAgQEAKIAkudHVwbGVfdG9fbmZhdHRyCT0gbmZfY3RfcG9ydF90dXBsZV90b19uZmF0dHIsCiAJLm5mYXR0cl90b190dXBsZQk9IG5mX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCS5jdGxfdGFibGVfdXNlcnMJPSAmdWRwX3N5c2N0bF90YWJsZV91c2VycywKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZ1ZHBfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IHVkcF9zeXNjdGxfdGFibGUsCisjZW5kaWYKIH07Ci0KLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3Byb3RvY29sX3VkcDQpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNik7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b191ZHA2KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyYTI0MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCkBAIC0wLDAgKzEsNTMxIEBACisvKiBTSVAgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nLgorICoKKyAqIChDKSAyMDA1IGJ5IENocmlzdGlhbiBIZW50c2NoZWwgPGNoZW50c2NoZWxAYXJuZXQuY29tLmFyPgorICogYmFzZWQgb24gUlIncyBpcF9jb25udHJhY2tfZnRwLmMgYW5kIG90aGVyIG1vZHVsZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gSGVudHNjaGVsIDxjaGVudHNjaGVsQGFybmV0LmNvbS5hcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0lQIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja19zaXAiKTsKKworI2RlZmluZSBNQVhfUE9SVFMJOAorc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW01BWF9QT1JUU107CitzdGF0aWMgaW50IHBvcnRzX2M7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgInBvcnQgbnVtYmVycyBvZiBTSVAgc2VydmVycyIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHNpcF90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSBTSVBfVElNRU9VVDsKK21vZHVsZV9wYXJhbShzaXBfdGltZW91dCwgdWludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpcF90aW1lb3V0LCAidGltZW91dCBmb3IgdGhlIG1hc3RlciBTSVAgc2Vzc2lvbiIpOworCit1bnNpZ25lZCBpbnQgKCpuZl9uYXRfc2lwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQlzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJY29uc3QgY2hhciAqKmRwdHIpIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfc2lwX2hvb2spOworCit1bnNpZ25lZCBpbnQgKCpuZl9uYXRfc2RwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAorCQkJCWNvbnN0IGNoYXIgKmRwdHIpIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfc2RwX2hvb2spOworCitzdGF0aWMgaW50IGRpZ2l0c19sZW4oc3RydWN0IG5mX2Nvbm4gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqKTsKK3N0YXRpYyBpbnQgZXBhZGRyX2xlbihzdHJ1Y3QgbmZfY29ubiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworc3RhdGljIGludCBza3BfZGlnaXRzX2xlbihzdHJ1Y3QgbmZfY29ubiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworc3RhdGljIGludCBza3BfZXBhZGRyX2xlbihzdHJ1Y3QgbmZfY29ubiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworCitzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8geworCWNvbnN0IGNoYXIJKmxuYW1lOworCWNvbnN0IGNoYXIJKnNuYW1lOworCWNvbnN0IGNoYXIJKmxuX3N0cjsKKwlzaXplX3QJCWxubGVuOworCXNpemVfdAkJc25sZW47CisJc2l6ZV90CQlsbl9zdHJsZW47CisJaW50CQljYXNlX3NlbnNpdGl2ZTsKKwlpbnQJCSgqbWF0Y2hfbGVuKShzdHJ1Y3QgbmZfY29ubiAqLCBjb25zdCBjaGFyICosCisJCQkJICAgICBjb25zdCBjaGFyICosIGludCAqKTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gY3Rfc2lwX2hkcnNbXSA9IHsKKwlbUE9TX1JFR19SRVFfVVJJXSA9IHsgCS8qIFNJUCBSRUdJU1RFUiByZXF1ZXN0IFVSSSAqLworCQkubG5hbWUJCT0gInNpcDoiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubG5fc3RyCQk9ICI6IiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiOiIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4sCisJfSwKKwlbUE9TX1JFUV9VUkldID0geyAJLyogU0lQIHJlcXVlc3QgVVJJICovCisJCS5sbmFtZQkJPSAic2lwOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoInNpcDoiKSAtIDEsCisJCS5sbl9zdHIJCT0gIkAiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJAIikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbiwKKwl9LAorCVtQT1NfRlJPTV0gPSB7CQkvKiBTSVAgRnJvbSBoZWFkZXIgKi8KKwkJLmxuYW1lCQk9ICJGcm9tOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoIkZyb206IikgLSAxLAorCQkuc25hbWUJCT0gIlxyXG5mOiIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxyXG5mOiIpIC0gMSwKKwkJLmxuX3N0cgkJPSAic2lwOiIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoInNpcDoiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBza3BfZXBhZGRyX2xlbiwKKwl9LAorCVtQT1NfVE9dID0gewkJLyogU0lQIFRvIGhlYWRlciAqLworCQkubG5hbWUJCT0gIlRvOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlRvOiIpIC0gMSwKKwkJLnNuYW1lCQk9ICJcclxudDoiLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxudDoiKSAtIDEsCisJCS5sbl9zdHIJCT0gInNpcDoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4KKwl9LAorCVtQT1NfVklBXSA9IHsgCQkvKiBTSVAgVmlhIGhlYWRlciAqLworCQkubG5hbWUJCT0gIlZpYToiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJWaWE6IikgLSAxLAorCQkuc25hbWUJCT0gIlxyXG52OiIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxyXG52OiIpIC0gMSwgLyogcmZjMzI2MSAiXHJcbiIgKi8KKwkJLmxuX3N0cgkJPSAiVURQICIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIlVEUCAiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuLAorCX0sCisJW1BPU19DT05UQUNUXSA9IHsgCS8qIFNJUCBDb250YWN0IGhlYWRlciAqLworCQkubG5hbWUJCT0gIkNvbnRhY3Q6IiwKKwkJLmxubGVuCQk9IHNpemVvZigiQ29udGFjdDoiKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJcbm06IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJcbm06IikgLSAxLAorCQkubG5fc3RyCQk9ICJzaXA6IiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuCisJfSwKKwlbUE9TX0NPTlRFTlRdID0geyAJLyogU0lQIENvbnRlbnQgbGVuZ3RoIGhlYWRlciAqLworCQkubG5hbWUJCT0gIkNvbnRlbnQtTGVuZ3RoOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoIkNvbnRlbnQtTGVuZ3RoOiIpIC0gMSwKKwkJLnNuYW1lCQk9ICJcclxubDoiLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxubDoiKSAtIDEsCisJCS5sbl9zdHIJCT0gIjoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gc2twX2RpZ2l0c19sZW4KKwl9LAorCVtQT1NfTUVESUFdID0gewkJLyogU0RQIG1lZGlhIGluZm8gKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKKwkJLmxuYW1lCQk9ICJcbm09IiwKKwkJLmxubGVuCQk9IHNpemVvZigiXG5tPSIpIC0gMSwKKwkJLnNuYW1lCQk9ICJccm09IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJtPSIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiYXVkaW8gIiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiYXVkaW8gIikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZGlnaXRzX2xlbgorCX0sCisJW1BPU19PV05FUl9JUDRdID0gewkvKiBTRFAgb3duZXIgYWRkcmVzcyovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCisJCS5sbmFtZQkJPSAiXG5vPSIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlxubz0iKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJvPSIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxybz0iKSAtIDEsCisJCS5sbl9zdHIJCT0gIklOIElQNCAiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJJTiBJUDQgIikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgorCX0sCisJW1BPU19DT05ORUNUSU9OX0lQNF0gPSB7LyogU0RQIGNvbm5lY3Rpb24gaW5mbyAqLworCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAorCQkubG5hbWUJCT0gIlxuYz0iLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJcbmM9IikgLSAxLAorCQkuc25hbWUJCT0gIlxyYz0iLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJccmM9IikgLSAxLAorCQkubG5fc3RyCQk9ICJJTiBJUDQgIiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiSU4gSVA0ICIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KKwl9LAorCVtQT1NfT1dORVJfSVA2XSA9IHsJLyogU0RQIG93bmVyIGFkZHJlc3MqLworCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAorCQkubG5hbWUJCT0gIlxubz0iLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJcbm89IikgLSAxLAorCQkuc25hbWUJCT0gIlxybz0iLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJccm89IikgLSAxLAorCQkubG5fc3RyCQk9ICJJTiBJUDYgIiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiSU4gSVA2ICIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KKwl9LAorCVtQT1NfQ09OTkVDVElPTl9JUDZdID0gey8qIFNEUCBjb25uZWN0aW9uIGluZm8gKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKKwkJLmxuYW1lCQk9ICJcbmM9IiwKKwkJLmxubGVuCQk9IHNpemVvZigiXG5jPSIpIC0gMSwKKwkJLnNuYW1lCQk9ICJccmM9IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJjPSIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiSU4gSVA2ICIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIklOIElQNiAiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCisJfSwKKwlbUE9TX1NEUF9IRUFERVJdID0geyAJLyogU0RQIHZlcnNpb24gaGVhZGVyICovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCisJCS5sbmFtZQkJPSAiXG52PSIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlxudj0iKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJ2PSIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxydj0iKSAtIDEsCisJCS5sbl9zdHIJCT0gIj0iLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI9IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZGlnaXRzX2xlbgorCX0KK307CisKKy8qIGdldCBsaW5lIGxlbmdodCB1bnRpbCBmaXJzdCBDUiBvciBMRiBzZWVuLiAqLworaW50IGN0X3NpcF9sbmxlbihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpsaW1pdCkKK3sKKwljb25zdCBjaGFyICprID0gbGluZTsKKworCXdoaWxlICgobGluZSA8PSBsaW1pdCkgJiYgKCpsaW5lID09ICdccicgfHwgKmxpbmUgPT0gJ1xuJykpCisJCWxpbmUrKzsKKworCXdoaWxlIChsaW5lIDw9IGxpbWl0KSB7CisJCWlmICgqbGluZSA9PSAnXHInIHx8ICpsaW5lID09ICdcbicpCisJCQlicmVhazsKKwkJbGluZSsrOworCX0KKwlyZXR1cm4gbGluZSAtIGs7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfbG5sZW4pOworCisvKiBMaW5lYXIgc3RyaW5nIHNlYXJjaCwgY2FzZSBzZW5zaXRpdmUuICovCitjb25zdCBjaGFyICpjdF9zaXBfc2VhcmNoKGNvbnN0IGNoYXIgKm5lZWRsZSwgY29uc3QgY2hhciAqaGF5c3RhY2ssCisJCQkgIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuLAorCQkJICBpbnQgY2FzZV9zZW5zaXRpdmUpCit7CisJY29uc3QgY2hhciAqbGltaXQgPSBoYXlzdGFjayArIChoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVuKTsKKworCXdoaWxlIChoYXlzdGFjayA8PSBsaW1pdCkgeworCQlpZiAoY2FzZV9zZW5zaXRpdmUpIHsKKwkJCWlmIChzdHJuY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCisJCQkJcmV0dXJuIGhheXN0YWNrOworCQl9IGVsc2UgeworCQkJaWYgKHN0cm5pY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCisJCQkJcmV0dXJuIGhheXN0YWNrOworCQl9CisJCWhheXN0YWNrKys7CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3Rfc2lwX3NlYXJjaCk7CisKK3N0YXRpYyBpbnQgZGlnaXRzX2xlbihzdHJ1Y3QgbmZfY29ubiAqY3QsIGNvbnN0IGNoYXIgKmRwdHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KQoreworCWludCBsZW4gPSAwOworCXdoaWxlIChkcHRyIDw9IGxpbWl0ICYmIGlzZGlnaXQoKmRwdHIpKSB7CisJCWRwdHIrKzsKKwkJbGVuKys7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qIGdldCBkaWdpdHMgbGVuZ2h0LCBza2lwaW5nIGJsYW5rIHNwYWNlcy4gKi8KK3N0YXRpYyBpbnQgc2twX2RpZ2l0c19sZW4oc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBjaGFyICpkcHRyLAorCQkJICBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCkKK3sKKwlmb3IgKDsgZHB0ciA8PSBsaW1pdCAmJiAqZHB0ciA9PSAnICc7IGRwdHIrKykKKwkJKCpzaGlmdCkrKzsKKworCXJldHVybiBkaWdpdHNfbGVuKGN0LCBkcHRyLCBsaW1pdCwgc2hpZnQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FkZHIoc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBjaGFyICpjcCwgY29uc3QgY2hhciAqKmVuZHAsCisJCSAgICAgIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICphZGRyLCBjb25zdCBjaGFyICpsaW1pdCkKK3sKKwljb25zdCBjaGFyICplbmQ7CisJaW50IGZhbWlseSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW07CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0ID0gaW40X3B0b24oY3AsIGxpbWl0IC0gY3AsICh1OCAqKSZhZGRyLT5pcCwgLTEsICZlbmQpOworCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlyZXQgPSBpbjZfcHRvbihjcCwgbGltaXQgLSBjcCwgKHU4ICopJmFkZHItPmlwNiwgLTEsICZlbmQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpZiAocmV0ID09IDAgfHwgZW5kID09IGNwKQorCQlyZXR1cm4gMDsKKwlpZiAoZW5kcCkKKwkJKmVuZHAgPSBlbmQ7CisJcmV0dXJuIDE7Cit9CisKKy8qIHNraXAgaXAgYWRkcmVzcy4gcmV0dXJucyBpdHMgbGVuZ3RoLiAqLworc3RhdGljIGludCBlcGFkZHJfbGVuKHN0cnVjdCBuZl9jb25uICpjdCwgY29uc3QgY2hhciAqZHB0ciwKKwkJICAgICAgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpCit7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgYWRkcjsKKwljb25zdCBjaGFyICphdXggPSBkcHRyOworCisJaWYgKCFwYXJzZV9hZGRyKGN0LCBkcHRyLCAmZHB0ciwgJmFkZHIsIGxpbWl0KSkgeworCQlERUJVR1AoImlwOiAlcyBwYXJzZSBmYWlsZWQuIVxuIiwgZHB0cik7CisJCXJldHVybiAwOworCX0KKworCS8qIFBvcnQgbnVtYmVyICovCisJaWYgKCpkcHRyID09ICc6JykgeworCQlkcHRyKys7CisJCWRwdHIgKz0gZGlnaXRzX2xlbihjdCwgZHB0ciwgbGltaXQsIHNoaWZ0KTsKKwl9CisJcmV0dXJuIGRwdHIgLSBhdXg7Cit9CisKKy8qIGdldCBhZGRyZXNzIGxlbmd0aCwgc2tpcGluZyB1c2VyIGluZm8uICovCitzdGF0aWMgaW50IHNrcF9lcGFkZHJfbGVuKHN0cnVjdCBuZl9jb25uICpjdCwgY29uc3QgY2hhciAqZHB0ciwKKwkJCSAgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpCit7CisJaW50IHMgPSAqc2hpZnQ7CisKKwlmb3IgKDsgZHB0ciA8PSBsaW1pdCAmJiAqZHB0ciAhPSAnQCc7IGRwdHIrKykKKwkJKCpzaGlmdCkrKzsKKworCWlmICgqZHB0ciA9PSAnQCcpIHsKKwkJZHB0cisrOworCQkoKnNoaWZ0KSsrOworCX0gZWxzZQorCQkqc2hpZnQgPSBzOworCisJcmV0dXJuIGVwYWRkcl9sZW4oY3QsIGRwdHIsIGxpbWl0LCBzaGlmdCk7Cit9CisKKy8qIFJldHVybnMgMCBpZiBub3QgZm91bmQsIC0xIGVycm9yIHBhcnNpbmcuICovCitpbnQgY3Rfc2lwX2dldF9pbmZvKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgIGNvbnN0IGNoYXIgKmRwdHIsIHNpemVfdCBkbGVuLAorCQkgICAgdW5zaWduZWQgaW50ICptYXRjaG9mZiwKKwkJICAgIHVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCisJCSAgICBlbnVtIHNpcF9oZWFkZXJfcG9zIHBvcykKK3sKKwljb25zdCBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gKmhuZm8gPSAmY3Rfc2lwX2hkcnNbcG9zXTsKKwljb25zdCBjaGFyICpsaW1pdCwgKmF1eCwgKmsgPSBkcHRyOworCWludCBzaGlmdCA9IDA7CisKKwlsaW1pdCA9IGRwdHIgKyAoZGxlbiAtIGhuZm8tPmxubGVuKTsKKworCXdoaWxlIChkcHRyIDw9IGxpbWl0KSB7CisJCWlmICgoc3RybmNtcChkcHRyLCBobmZvLT5sbmFtZSwgaG5mby0+bG5sZW4pICE9IDApICYmCisJCSAgICAoc3RybmNtcChkcHRyLCBobmZvLT5zbmFtZSwgaG5mby0+c25sZW4pICE9IDApKSB7CisJCQlkcHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlhdXggPSBjdF9zaXBfc2VhcmNoKGhuZm8tPmxuX3N0ciwgZHB0ciwgaG5mby0+bG5fc3RybGVuLAorCQkgICAgICAgICAgICAgICAgICAgIGN0X3NpcF9sbmxlbihkcHRyLCBsaW1pdCksCisJCQkJICAgIGhuZm8tPmNhc2Vfc2Vuc2l0aXZlKTsKKwkJaWYgKCFhdXgpIHsKKwkJCURFQlVHUCgiJyVzJyBub3QgZm91bmQgaW4gJyVzJy5cbiIsIGhuZm8tPmxuX3N0ciwKKwkJCSAgICAgICBobmZvLT5sbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXV4ICs9IGhuZm8tPmxuX3N0cmxlbjsKKworCQkqbWF0Y2hsZW4gPSBobmZvLT5tYXRjaF9sZW4oY3QsIGF1eCwgbGltaXQsICZzaGlmdCk7CisJCWlmICghKm1hdGNobGVuKQorCQkJcmV0dXJuIC0xOworCisJCSptYXRjaG9mZiA9IChhdXggLSBrKSArIHNoaWZ0OworCisJCURFQlVHUCgiJXMgbWF0Y2ggc3VjY2VlZGVkISAtIGxlbjogJXVcbiIsIGhuZm8tPmxuYW1lLAorCQkgICAgICAgKm1hdGNobGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCURFQlVHUCgiJXMgaGVhZGVyIG5vdCBmb3VuZC5cbiIsIGhuZm8tPmxuYW1lKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGN0X3NpcF9nZXRfaW5mbyk7CisKK3N0YXRpYyBpbnQgc2V0X2V4cGVjdGVkX3J0cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICphZGRyLAorCQkJICAgIF9fYmUxNiBwb3J0LAorCQkJICAgIGNvbnN0IGNoYXIgKmRwdHIpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5sM251bTsKKwlpbnQgcmV0OworCXR5cGVvZihuZl9uYXRfc2RwX2hvb2spIG5mX25hdF9zZHA7CisKKwlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwlpZiAoZXhwID09IE5VTEwpCisJCXJldHVybiBORl9EUk9QOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGZhbWlseSwKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLCBhZGRyLAorCQkJCSBJUFBST1RPX1VEUCwgTlVMTCwgJnBvcnQpOworCisJbmZfbmF0X3NkcCA9IHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfc2RwX2hvb2spOworCWlmIChuZl9uYXRfc2RwICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCXJldCA9IG5mX25hdF9zZHAocHNrYiwgY3RpbmZvLCBleHAsIGRwdHIpOworCWVsc2UgeworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKKwkJCXJldCA9IE5GX0RST1A7CisJCWVsc2UKKwkJCXJldCA9IE5GX0FDQ0VQVDsKKwl9CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2lwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlpbnQgZmFtaWx5ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bTsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXVuc2lnbmVkIGludCBkYXRhb2ZmLCBkYXRhbGVuOworCWNvbnN0IGNoYXIgKmRwdHI7CisJaW50IHJldCA9IE5GX0FDQ0VQVDsKKwlpbnQgbWF0Y2hvZmYsIG1hdGNobGVuOworCXVfaW50MTZfdCBwb3J0OworCWVudW0gc2lwX2hlYWRlcl9wb3MgcG9zOworCXR5cGVvZihuZl9uYXRfc2lwX2hvb2spIG5mX25hdF9zaXA7CisKKwkvKiBObyBEYXRhID8gKi8KKwlkYXRhb2ZmID0gcHJvdG9mZiArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwluZl9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgc2lwX3RpbWVvdXQgKiBIWik7CisKKwlpZiAoIXNrYl9pc19ub25saW5lYXIoKnBza2IpKQorCQlkcHRyID0gKCpwc2tiKS0+ZGF0YSArIGRhdGFvZmY7CisJZWxzZSB7CisJCURFQlVHUCgiQ29weSBvZiBza2J1ZmYgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbmZfbmF0X3NpcCA9IHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfc2lwX2hvb2spOworCWlmIChuZl9uYXRfc2lwICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJaWYgKCFuZl9uYXRfc2lwKHBza2IsIGN0aW5mbywgY3QsICZkcHRyKSkgeworCQkJcmV0ID0gTkZfRFJPUDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGRhdGFvZmY7CisJaWYgKGRhdGFsZW4gPCBzaXplb2YoIlNJUC8yLjAgMjAwIikgLSAxKQorCQlnb3RvIG91dDsKKworCS8qIFJUUCBpbmZvIG9ubHkgaW4gc29tZSBTRFAgcGt0cyAqLworCWlmIChtZW1jbXAoZHB0ciwgIklOVklURSIsIHNpemVvZigiSU5WSVRFIikgLSAxKSAhPSAwICYmCisJICAgIG1lbWNtcChkcHRyLCAiU0lQLzIuMCAyMDAiLCBzaXplb2YoIlNJUC8yLjAgMjAwIikgLSAxKSAhPSAwKSB7CisJCWdvdG8gb3V0OworCX0KKwkvKiBHZXQgYWRkcmVzcyBhbmQgcG9ydCBmcm9tIFNEUCBwYWNrZXQuICovCisJcG9zID0gZmFtaWx5ID09IEFGX0lORVQgPyBQT1NfQ09OTkVDVElPTl9JUDQgOiBQT1NfQ09OTkVDVElPTl9JUDY7CisJaWYgKGN0X3NpcF9nZXRfaW5mbyhjdCwgZHB0ciwgZGF0YWxlbiwgJm1hdGNob2ZmLCAmbWF0Y2hsZW4sIHBvcykgPiAwKSB7CisKKwkJLyogV2UnbGwgZHJvcCBvbmx5IGlmIHRoZXJlIGFyZSBwYXJzZSBwcm9ibGVtcy4gKi8KKwkJaWYgKCFwYXJzZV9hZGRyKGN0LCBkcHRyICsgbWF0Y2hvZmYsIE5VTEwsICZhZGRyLAorCQkJICAgICAgICBkcHRyICsgZGF0YWxlbikpIHsKKwkJCXJldCA9IE5GX0RST1A7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoY3Rfc2lwX2dldF9pbmZvKGN0LCBkcHRyLCBkYXRhbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwKKwkJICAgICAgICAgICAgICAgICAgICBQT1NfTUVESUEpID4gMCkgeworCisJCQlwb3J0ID0gc2ltcGxlX3N0cnRvdWwoZHB0ciArIG1hdGNob2ZmLCBOVUxMLCAxMCk7CisJCQlpZiAocG9ydCA8IDEwMjQpIHsKKwkJCQlyZXQgPSBORl9EUk9QOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gc2V0X2V4cGVjdGVkX3J0cChwc2tiLCBjdCwgY3RpbmZvLCAmYWRkciwKKwkJCQkJICAgICAgIGh0b25zKHBvcnQpLCBkcHRyKTsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgc2lwW01BWF9QT1JUU11bMl0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBjaGFyIHNpcF9uYW1lc1tNQVhfUE9SVFNdWzJdW3NpemVvZigic2lwLTY1NTM1IildIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19zaXBfZmluaSh2b2lkKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQlpZiAoc2lwW2ldW2pdLm1lID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnNpcFtpXVtqXSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX2Nvbm50cmFja19zaXBfaW5pdCh2b2lkKQoreworCWludCBpLCBqLCByZXQ7CisJY2hhciAqdG1wbmFtZTsKKworCWlmIChwb3J0c19jID09IDApCisJCXBvcnRzW3BvcnRzX2MrK10gPSBTSVBfUE9SVDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJbWVtc2V0KCZzaXBbaV0sIDAsIHNpemVvZihzaXBbaV0pKTsKKworCQlzaXBbaV1bMF0udHVwbGUuc3JjLmwzbnVtID0gQUZfSU5FVDsKKwkJc2lwW2ldWzFdLnR1cGxlLnNyYy5sM251bSA9IEFGX0lORVQ2OworCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQlzaXBbaV1bal0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7CisJCQlzaXBbaV1bal0udHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CisJCQlzaXBbaV1bal0ubWFzay5zcmMubDNudW0gPSAweEZGRkY7CisJCQlzaXBbaV1bal0ubWFzay5zcmMudS51ZHAucG9ydCA9IGh0b25zKDB4RkZGRik7CisJCQlzaXBbaV1bal0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOworCQkJc2lwW2ldW2pdLm1heF9leHBlY3RlZCA9IDI7CisJCQlzaXBbaV1bal0udGltZW91dCA9IDMgKiA2MDsgLyogMyBtaW51dGVzICovCisJCQlzaXBbaV1bal0ubWUgPSBUSElTX01PRFVMRTsKKwkJCXNpcFtpXVtqXS5oZWxwID0gc2lwX2hlbHA7CisKKwkJCXRtcG5hbWUgPSAmc2lwX25hbWVzW2ldW2pdWzBdOworCQkJaWYgKHBvcnRzW2ldID09IFNJUF9QT1JUKQorCQkJCXNwcmludGYodG1wbmFtZSwgInNpcCIpOworCQkJZWxzZQorCQkJCXNwcmludGYodG1wbmFtZSwgInNpcC0ldSIsIGkpOworCQkJc2lwW2ldW2pdLm5hbWUgPSB0bXBuYW1lOworCisJCQlERUJVR1AoInBvcnQgIyV1OiAldVxuIiwgaSwgcG9ydHNbaV0pOworCisJCQlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZzaXBbaV1bal0pOworCQkJaWYgKHJldCkgeworCQkJCXByaW50aygibmZfY3Rfc2lwOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaGVscGVyICIKKwkJCQkgICAgICAgImZvciBwZjogJXUgcG9ydDogJXVcbiIsCisJCQkJICAgICAgIHNpcFtpXVtqXS50dXBsZS5zcmMubDNudW0sIHBvcnRzW2ldKTsKKwkJCQluZl9jb25udHJhY2tfc2lwX2ZpbmkoKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChuZl9jb25udHJhY2tfc2lwX2luaXQpOworbW9kdWxlX2V4aXQobmZfY29ubnRyYWNrX3NpcF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA1OTU0ZjY3Li5mMWNiNjBmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0yOSwxMyArMjksMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNlbmRpZgogCi0jZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKLSNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkKLQogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CiAKICNpZiAwCkBAIC00NiwzMyArNDQsMTUgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1leHRlcm4gYXRvbWljX3QgbmZfY29ubnRyYWNrX2NvdW50OwotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCwgbmZfY29ubnRyYWNrX3N0YXQpOwotCi1zdGF0aWMgaW50IGtpbGxfbDNwcm90byhzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSA9PSAKLQkJCSgoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICopZGF0YSktPmwzcHJvdG8pOwotfQotCi1zdGF0aWMgaW50IGtpbGxfcHJvdG8oc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0JcHJvdG8gPSAoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqKWRhdGE7Ci0JcmV0dXJuIChpLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gPT0gCi0JCQlwcm90by0+cHJvdG8pICYmCi0JICAgICAgIChpLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW0gPT0KLQkJCXByb3RvLT5sM3Byb3RvKTsKLX0KLQogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50CitpbnQKIHByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bywKLQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCisJICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bykKIHsKLQlyZXR1cm4gbDNwcm90by0+cHJpbnRfdHVwbGUocywgdHVwbGUpIHx8IHByb3RvLT5wcmludF90dXBsZShzLCB0dXBsZSk7CisJcmV0dXJuIGwzcHJvdG8tPnByaW50X3R1cGxlKHMsIHR1cGxlKSB8fCBsNHByb3RvLT5wcmludF90dXBsZShzLCB0dXBsZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwcmludF90dXBsZSk7CiAKICNpZmRlZiBDT05GSUdfTkZfQ1RfQUNDVAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtMTUwLDkgKzEzMCw4IEBACiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoID0gdjsKIAljb25zdCBzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoYXNoKTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCi0JQVNTRVJUX1JFQURfTE9DSygmbmZfY29ubnRyYWNrX2xvY2spOwogCU5GX0NUX0FTU0VSVChjb25udHJhY2spOwogCiAJLyogd2Ugb25seSB3YW50IHRvIHByaW50IERJUl9PUklHSU5BTCAqLwpAQCAtMTYzLDE2ICsxNDIsMTYgQEAKIAkJCQkgICAgICAgLnR1cGxlLnNyYy5sM251bSk7CiAKIAlORl9DVF9BU1NFUlQobDNwcm90byk7Ci0JcHJvdG8gPSBfX25mX2N0X3Byb3RvX2ZpbmQoY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXQorCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCiAJCQkJICAgLnR1cGxlLnNyYy5sM251bSwKIAkJCQkgICBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCiAJCQkJICAgLnR1cGxlLmRzdC5wcm90b251bSk7Ci0JTkZfQ1RfQVNTRVJUKHByb3RvKTsKKwlORl9DVF9BU1NFUlQobDRwcm90byk7CiAKIAlpZiAoc2VxX3ByaW50ZihzLCAiJS04cyAldSAlLThzICV1ICVsZCAiLAogCQkgICAgICAgbDNwcm90by0+bmFtZSwKIAkJICAgICAgIGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtLAotCQkgICAgICAgcHJvdG8tPm5hbWUsCisJCSAgICAgICBsNHByb3RvLT5uYW1lLAogCQkgICAgICAgY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0sCiAJCSAgICAgICB0aW1lcl9wZW5kaW5nKCZjb25udHJhY2stPnRpbWVvdXQpCiAJCSAgICAgICA/IChsb25nKShjb25udHJhY2stPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCkgIT0gMCkKQEAgLTE4MSwxMSArMTYwLDExIEBACiAJaWYgKGwzcHJvdG8tPnByaW50X2Nvbm50cmFjayhzLCBjb25udHJhY2spKQogCQlyZXR1cm4gLUVOT1NQQzsKIAotCWlmIChwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGNvbm50cmFjaykpCisJaWYgKGw0cHJvdG8tPnByaW50X2Nvbm50cmFjayhzLCBjb25udHJhY2spKQogCQlyZXR1cm4gLUVOT1NQQzsKIAogCWlmIChwcmludF90dXBsZShzLCAmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwKLQkJCWwzcHJvdG8sIHByb3RvKSkKKwkJCWwzcHJvdG8sIGw0cHJvdG8pKQogCQlyZXR1cm4gLUVOT1NQQzsKIAogCWlmIChzZXFfcHJpbnRfY291bnRlcnMocywgJmNvbm50cmFjay0+Y291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXSkpCkBAIC0xOTYsNyArMTc1LDcgQEAKIAkJCXJldHVybiAtRU5PU1BDOwogCiAJaWYgKHByaW50X3R1cGxlKHMsICZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAotCQkJbDNwcm90bywgcHJvdG8pKQorCQkJbDNwcm90bywgbDRwcm90bykpCiAJCXJldHVybiAtRU5PU1BDOwogCiAJaWYgKHNlcV9wcmludF9jb3VudGVycyhzLCAmY29ubnRyYWNrLT5jb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldKSkKQEAgLTI1OCw4NCArMjM3LDYgQEAKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCiB9OwogCi0vKiBleHBlY3RzICovCi1zdGF0aWMgdm9pZCAqZXhwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmUgPSAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0OwotCWxvZmZfdCBpOwotCi0JLyogc3RyYW5nZSBzZXFfZmlsZSBhcGkgY2FsbHMgc3RvcCBldmVuIGlmIHdlIGZhaWwsCi0JICogdGh1cyB3ZSBuZWVkIHRvIGdyYWIgbG9jayBzaW5jZSBzdG9wIHVubG9ja3MgKi8KLQlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCWlmIChsaXN0X2VtcHR5KGUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPD0gKnBvczsgaSsrKSB7Ci0JCWUgPSBlLT5uZXh0OwotCQlpZiAoZSA9PSAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBlOwotfQotCi1zdGF0aWMgdm9pZCAqZXhwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZSA9IHY7Ci0KLQkrKypwb3M7Ci0JZSA9IGUtPm5leHQ7Ci0KLQlpZiAoZSA9PSAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBlOwotfQotCi1zdGF0aWMgdm9pZCBleHBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotewotCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgZXhwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0ID0gdjsKLQotCWlmIChleHBlY3QtPnRpbWVvdXQuZnVuY3Rpb24pCi0JCXNlcV9wcmludGYocywgIiVsZCAiLCB0aW1lcl9wZW5kaW5nKCZleHBlY3QtPnRpbWVvdXQpCi0JCQkgICA/IChsb25nKShleHBlY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCk7Ci0JZWxzZQotCQlzZXFfcHJpbnRmKHMsICItICIpOwotCXNlcV9wcmludGYocywgImwzcHJvdG8gPSAldSBwcm90bz0ldSAiLAotCQkgICBleHBlY3QtPnR1cGxlLnNyYy5sM251bSwKLQkJICAgZXhwZWN0LT50dXBsZS5kc3QucHJvdG9udW0pOwotCXByaW50X3R1cGxlKHMsICZleHBlY3QtPnR1cGxlLAotCQkgICAgX19uZl9jdF9sM3Byb3RvX2ZpbmQoZXhwZWN0LT50dXBsZS5zcmMubDNudW0pLAotCQkgICAgX19uZl9jdF9wcm90b19maW5kKGV4cGVjdC0+dHVwbGUuc3JjLmwzbnVtLAotCQkJCSAgICAgICBleHBlY3QtPnR1cGxlLmRzdC5wcm90b251bSkpOwotCXJldHVybiBzZXFfcHV0YyhzLCAnXG4nKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHBfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBleHBfc2VxX3N0YXJ0LAotCS5uZXh0ID0gZXhwX3NlcV9uZXh0LAotCS5zdG9wID0gZXhwX3NlcV9zdG9wLAotCS5zaG93ID0gZXhwX3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZXhwX3NlcV9vcHMpOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHBfZmlsZV9vcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGV4cF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQotfTsKLQogc3RhdGljIHZvaWQgKmN0X2NwdV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewogCWludCBjcHU7CkBAIC00MjgsMzQgKzMyOSw5IEBACiAvKiBTeXNjdGwgc3VwcG9ydCAqLwogCiBpbnQgbmZfY29ubnRyYWNrX2NoZWNrc3VtIF9fcmVhZF9tb3N0bHkgPSAxOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2NoZWNrc3VtKTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLQotLyogRnJvbSBuZl9jb25udHJhY2tfY29yZS5jICovCi1leHRlcm4gaW50IG5mX2Nvbm50cmFja19tYXg7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLQotLyogRnJvbSBuZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2OwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFuczsKLWV4dGVybiBpbnQgbmZfY3RfdGNwX2xvb3NlOwotZXh0ZXJuIGludCBuZl9jdF90Y3BfYmVfbGliZXJhbDsKLWV4dGVybiBpbnQgbmZfY3RfdGNwX21heF9yZXRyYW5zOwotCi0vKiBGcm9tIG5mX2Nvbm50cmFja19wcm90b191ZHAuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdWRwX3RpbWVvdXRfc3RyZWFtOwotCi0vKiBGcm9tIG5mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZ2VuZXJpY190aW1lb3V0OwotCiAvKiBMb2cgaW52YWxpZCBwYWNrZXRzIG9mIGEgZ2l2ZW4gcHJvdG9jb2wgKi8KIHN0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWluID0gMDsKIHN0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWF4ID0gMjU1OwpAQCAtNDk2LDk0ICszNzIsNiBAQAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJfSwKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1NFTlQsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3NlbnQiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9SRUNWLAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9yZWN2IiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9FU1RBQkxJU0hFRCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9lc3RhYmxpc2hlZCIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRklOX1dBSVQsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfZmluX3dhaXQiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFX1dBSVQsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9MQVNUX0FDSywKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9sYXN0X2FjayIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9sYXN0X2FjaywKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfVElNRV9XQUlULAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X3RpbWVfd2FpdCIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFLAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Nsb3NlIiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19VRFBfVElNRU9VVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja191ZHBfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZuZl9jdF91ZHBfdGltZW91dCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVRfU1RSRUFNLAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3VkcF90aW1lb3V0X3N0cmVhbSIsCi0JCS5kYXRhCQk9ICZuZl9jdF91ZHBfdGltZW91dF9zdHJlYW0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19nZW5lcmljX3RpbWVvdXQiLAotCQkuZGF0YQkJPSAmbmZfY3RfZ2VuZXJpY190aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKIAkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19MT0dfSU5WQUxJRCwKIAkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19sb2dfaW52YWxpZCIsCiAJCS5kYXRhCQk9ICZuZl9jdF9sb2dfaW52YWxpZCwKQEAgLTU5NCwzOCArMzgyLDYgQEAKIAkJLmV4dHJhMQkJPSAmbG9nX2ludmFsaWRfcHJvdG9fbWluLAogCQkuZXh0cmEyCQk9ICZsb2dfaW52YWxpZF9wcm90b19tYXgsCiAJfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTUFYX1JFVFJBTlMsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9MT09TRSwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfbG9vc2UiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX2xvb3NlLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX0JFX0xJQkVSQUwsCi0JCS5wcm9jbmFtZSAgICAgICA9ICJuZl9jb25udHJhY2tfdGNwX2JlX2xpYmVyYWwiLAotCQkuZGF0YSAgICAgICAgICAgPSAmbmZfY3RfdGNwX2JlX2xpYmVyYWwsCi0JCS5tYXhsZW4gICAgICAgICA9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZSAgICAgICAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyICAgPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfTUFYX1JFVFJBTlMsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX21heF9yZXRyYW5zIiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF9tYXhfcmV0cmFucywKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCiAKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKQEAgLTY1OSwxMDkgKzQxNSw5IEBACiAJfSwKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfbG9nX2ludmFsaWQpOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbG9nX2ludmFsaWQpOwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAotaW50IG5mX2Nvbm50cmFja19sM3Byb3RvX3JlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JaWYgKG5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSAhPSAmbmZfY29ubnRyYWNrX2dlbmVyaWNfbDNwcm90bykgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQluZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10gPSBwcm90bzsKLW91dDoKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgbmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnByb3RvKQotewotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQluZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10gPSAmbmZfY29ubnRyYWNrX2dlbmVyaWNfbDNwcm90bzsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkKLQkvKiBTb21lYm9keSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBwcm90byBpbiBiaC4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKLQotCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLwotCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2wzcHJvdG8sIHByb3RvKTsKLX0KLQotLyogRklYTUU6IEFsbG93IE5VTEwgZnVuY3Rpb25zIGFuZCBzdWIgaW4gcG9pbnRlcnMgdG8gZ2VuZXJpYyBmb3IKLSAgIHRoZW0uIC0tUlIgKi8KLWludCBuZl9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCi17Ci0JaW50IHJldCA9IDA7Ci0KLXJldHJ5OgotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlpZiAobmZfY3RfcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSkgewotCQlpZiAobmZfY3RfcHJvdG9zW3Byb3RvLT5sM3Byb3RvXVtwcm90by0+cHJvdG9dCi0JCQkJIT0gJm5mX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBsM3Byb3RvIG1heSBiZSBsb2FkZWQgbGF0dGVyLiAqLwotCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICoqcHJvdG9fYXJyYXk7Ci0JCWludCBpOwotCi0JCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCi0JCXByb3RvX2FycmF5ID0gKHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKiopCi0JCQkJa21hbGxvYyhNQVhfTkZfQ1RfUFJPVE8gKgotCQkJCQkgc2l6ZW9mKHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKiksCi0JCQkJCUdGUF9LRVJORUwpOwotCQlpZiAocHJvdG9fYXJyYXkgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTkZfQ1RfUFJPVE87IGkrKykKLQkJCXByb3RvX2FycmF5W2ldID0gJm5mX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sOwotCi0JCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkJaWYgKG5mX2N0X3Byb3Rvc1twcm90by0+bDNwcm90b10pIHsKLQkJCS8qIGJhZCB0aW1pbmcsIGJ1dCBubyBwcm9ibGVtICovCi0JCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkJCWtmcmVlKHByb3RvX2FycmF5KTsKLQkJfSBlbHNlIHsKLQkJCW5mX2N0X3Byb3Rvc1twcm90by0+bDNwcm90b10gPSBwcm90b19hcnJheTsKLQkJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQl9Ci0KLQkJLyoKLQkJICogSnVzdCBvbmNlIGJlY2F1c2UgYXJyYXkgaXMgbmV2ZXIgZnJlZWQgdW50aWwgdW5sb2FkaW5nCi0JCSAqIG5mX2Nvbm50cmFjay5rbwotCQkgKi8KLQkJZ290byByZXRyeTsKLQl9Ci0KLQluZl9jdF9wcm90b3NbcHJvdG8tPmwzcHJvdG9dW3Byb3RvLT5wcm90b10gPSBwcm90bzsKLQotb3V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIG5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQotewotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQluZl9jdF9wcm90b3NbcHJvdG8tPmwzcHJvdG9dW3Byb3RvLT5wcm90b10KLQkJPSAmbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JCi0JLyogU29tZWJvZHkgY291bGQgYmUgc3RpbGwgbG9va2luZyBhdCB0aGUgcHJvdG8gaW4gYmguICovCi0Jc3luY2hyb25pemVfbmV0KCk7Ci0KLQkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KLQluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9wcm90bywgcHJvdG8pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTgzNCw3MCArNDkwLDQgQEAKIHZvaWQgbmVlZF9jb25udHJhY2sodm9pZCkKIHsKIH0KLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTCi1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfY2hhaW4pOwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KTsKLUVYUE9SVF9QRVJfQ1BVX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2VjYWNoZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfbDNwcm90b19yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2ludmVydF90dXBsZXByKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2Rlc3Ryb3llZCk7Ci1FWFBPUlRfU1lNQk9MKG5lZWRfY29ubnRyYWNrKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2l0ZXJhdGVfY2xlYW51cCk7Ci1FWFBPUlRfU1lNQk9MKF9fbmZfY3RfcmVmcmVzaF9hY2N0KTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfcHJvdG9zKTsKLUVYUE9SVF9TWU1CT0woX19uZl9jdF9wcm90b19maW5kKTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfcHJvdG9fZmluZF9nZXQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9wcm90b19wdXQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfbDNwcm90b19wdXQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9sM3Byb3Rvcyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfY2hlY2tzdW0pOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2V4cGVjdF9wdXQpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja190dXBsZV90YWtlbik7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19sb2NrKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2hhc2gpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfdW50cmFja2VkKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19maW5kX2dldCk7Ci0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3RjcF91cGRhdGUpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKF9fbmZfY29ubnRyYWNrX2NvbmZpcm0pOwotRVhQT1JUX1NZTUJPTChuZl9jdF9nZXRfdHVwbGUpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9pbnZlcnRfdHVwbGUpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfaW4pOwotRVhQT1JUX1NZTUJPTChfX25mX2Nvbm50cmFja19hdHRhY2gpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfYWxsb2MpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZnJlZSk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19mbHVzaCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9oZWxwZXJfZmluZF9nZXQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9oZWxwZXJfcHV0KTsKLUVYUE9SVF9TWU1CT0woX19uZl9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKTsKLUVYUE9SVF9TWU1CT0woX19uZl9jb25udHJhY2tfZmluZCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X3VubGlua19leHBlY3QpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfaGFzaF9pbnNlcnQpOwotRVhQT1JUX1NZTUJPTChfX25mX2Nvbm50cmFja19leHBlY3RfZmluZCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19leHBlY3RfZmluZCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19leHBlY3RfbGlzdCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQotRVhQT1JUX1NZTUJPTChuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0cik7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlKTsKLSNlbmRpZgorRVhQT1JUX1NZTUJPTF9HUEwobmVlZF9jb25udHJhY2spOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGZ0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGZ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmZmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIChDKSAyMDAxLTIwMDIgTWFnbnVzIEJvZGVuIDxtYkBvemFiYS5taW5lLm51PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RmdHAuaD4KKworTU9EVUxFX0FVVEhPUigiTWFnbnVzIEJvZGVuIDxtYkBvemFiYS5taW5lLm51PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJURlRQIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja190ZnRwIik7CisKKyNkZWZpbmUgTUFYX1BPUlRTIDgKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tNQVhfUE9SVFNdOworc3RhdGljIGludCBwb3J0c19jOworbW9kdWxlX3BhcmFtX2FycmF5KHBvcnRzLCB1c2hvcnQsICZwb3J0c19jLCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJQb3J0IG51bWJlcnMgb2YgVEZUUCBzZXJ2ZXJzIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygiJXM6JXM6IiBmb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgKCpuZl9uYXRfdGZ0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3RmdHBfaG9vayk7CisKK3N0YXRpYyBpbnQgdGZ0cF9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RydWN0IHRmdHBoZHIgX3RmdHBoLCAqdGZoOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGU7CisJdW5zaWduZWQgaW50IHJldCA9IE5GX0FDQ0VQVDsKKwlpbnQgZmFtaWx5ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bTsKKwl0eXBlb2YobmZfbmF0X3RmdHBfaG9vaykgbmZfbmF0X3RmdHA7CisKKwl0ZmggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIHByb3RvZmYgKyBzaXplb2Yoc3RydWN0IHVkcGhkciksCisJCQkJIHNpemVvZihfdGZ0cGgpLCAmX3RmdHBoKTsKKwlpZiAodGZoID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlzd2l0Y2ggKG50b2hzKHRmaC0+b3Bjb2RlKSkgeworCWNhc2UgVEZUUF9PUENPREVfUkVBRDoKKwljYXNlIFRGVFBfT1BDT0RFX1dSSVRFOgorCQkvKiBSUlEgYW5kIFdSUSB3b3JrcyB0aGUgc2FtZSB3YXkgKi8KKwkJREVCVUdQKCIiKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKKworCQlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwkJaWYgKGV4cCA9PSBOVUxMKQorCQkJcmV0dXJuIE5GX0RST1A7CisJCXR1cGxlID0gJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKKwkJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgZmFtaWx5LAorCQkJCQkgJnR1cGxlLT5zcmMudTMsICZ0dXBsZS0+ZHN0LnUzLAorCQkJCQkgSVBQUk9UT19VRFAsCisJCQkJCSBOVUxMLCAmdHVwbGUtPmRzdC51LnVkcC5wb3J0KTsKKworCQlERUJVR1AoImV4cGVjdDogIik7CisJCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOworCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPm1hc2spOworCisJCW5mX25hdF90ZnRwID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF90ZnRwX2hvb2spOworCQlpZiAobmZfbmF0X3RmdHAgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJCXJldCA9IG5mX25hdF90ZnRwKHBza2IsIGN0aW5mbywgZXhwKTsKKwkJZWxzZSBpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKKwkJCXJldCA9IE5GX0RST1A7CisJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisJCWJyZWFrOworCWNhc2UgVEZUUF9PUENPREVfREFUQToKKwljYXNlIFRGVFBfT1BDT0RFX0FDSzoKKwkJREVCVUdQKCJEYXRhL0FDSyBvcGNvZGVcbiIpOworCQlicmVhazsKKwljYXNlIFRGVFBfT1BDT0RFX0VSUk9SOgorCQlERUJVR1AoIkVycm9yIG9wY29kZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUCgiVW5rbm93biBvcGNvZGVcbiIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgdGZ0cFtNQVhfUE9SVFNdWzJdIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgY2hhciB0ZnRwX25hbWVzW01BWF9QT1JUU11bMl1bc2l6ZW9mKCJ0ZnRwLTY1NTM1IildIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja190ZnRwX2Zpbmkodm9pZCkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmdGZ0cFtpXVtqXSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfdGZ0cF9pbml0KHZvaWQpCit7CisJaW50IGksIGosIHJldDsKKwljaGFyICp0bXBuYW1lOworCisJaWYgKHBvcnRzX2MgPT0gMCkKKwkJcG9ydHNbcG9ydHNfYysrXSA9IFRGVFBfUE9SVDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJbWVtc2V0KCZ0ZnRwW2ldLCAwLCBzaXplb2YodGZ0cFtpXSkpOworCisJCXRmdHBbaV1bMF0udHVwbGUuc3JjLmwzbnVtID0gQUZfSU5FVDsKKwkJdGZ0cFtpXVsxXS50dXBsZS5zcmMubDNudW0gPSBBRl9JTkVUNjsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJdGZ0cFtpXVtqXS50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1VEUDsKKwkJCXRmdHBbaV1bal0udHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CisJCQl0ZnRwW2ldW2pdLm1hc2suc3JjLmwzbnVtID0gMHhGRkZGOworCQkJdGZ0cFtpXVtqXS5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisJCQl0ZnRwW2ldW2pdLm1hc2suc3JjLnUudWRwLnBvcnQgPSBodG9ucygweEZGRkYpOworCQkJdGZ0cFtpXVtqXS5tYXhfZXhwZWN0ZWQgPSAxOworCQkJdGZ0cFtpXVtqXS50aW1lb3V0ID0gNSAqIDYwOyAvKiA1IG1pbnV0ZXMgKi8KKwkJCXRmdHBbaV1bal0ubWUgPSBUSElTX01PRFVMRTsKKwkJCXRmdHBbaV1bal0uaGVscCA9IHRmdHBfaGVscDsKKworCQkJdG1wbmFtZSA9ICZ0ZnRwX25hbWVzW2ldW2pdWzBdOworCQkJaWYgKHBvcnRzW2ldID09IFRGVFBfUE9SVCkKKwkJCQlzcHJpbnRmKHRtcG5hbWUsICJ0ZnRwIik7CisJCQllbHNlCisJCQkJc3ByaW50Zih0bXBuYW1lLCAidGZ0cC0ldSIsIGkpOworCQkJdGZ0cFtpXVtqXS5uYW1lID0gdG1wbmFtZTsKKworCQkJcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmdGZ0cFtpXVtqXSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKCJuZl9jdF90ZnRwOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaGVscGVyICIKKwkJCQkgICAgICAgImZvciBwZjogJXUgcG9ydDogJXVcbiIsCisJCQkJCXRmdHBbaV1bal0udHVwbGUuc3JjLmwzbnVtLCBwb3J0c1tpXSk7CisJCQkJbmZfY29ubnRyYWNrX3RmdHBfZmluaSgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG5mX2Nvbm50cmFja190ZnRwX2luaXQpOworbW9kdWxlX2V4aXQobmZfY29ubnRyYWNrX3RmdHBfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3N5c2N0bC5jIGIvbmV0L25ldGZpbHRlci9uZl9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRkZGRiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9zeXNjdGwuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogbmZfc3lzY3RsLmMJbmV0ZmlsdGVyIHN5c2N0bCByZWdpc3RyYXRpb24vdW5yZWdpc3RhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RhdGljIHZvaWQKK3BhdGhfZnJlZShzdHJ1Y3QgY3RsX3RhYmxlICpwYXRoLCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0LCAqbmV4dDsKKworCWZvciAodCA9IHBhdGg7IHQgIT0gTlVMTCAmJiB0ICE9IHRhYmxlOyB0ID0gbmV4dCkgeworCQluZXh0ID0gdC0+Y2hpbGQ7CisJCWtmcmVlKHQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgKgorcGF0aF9kdXAoc3RydWN0IGN0bF90YWJsZSAqcGF0aCwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IGN0bF90YWJsZSAqdCwgKmxhc3QgPSBOVUxMLCAqdG1wOworCisJZm9yICh0ID0gcGF0aDsgdCAhPSBOVUxMOyB0ID0gdC0+Y2hpbGQpIHsKKwkJLyogdHdpY2UgdGhlIHNpemUgc2luY2UgcGF0aCBlbGVtZW50cyBhcmUgdGVybWluYXRlZCBieSBhbgorCQkgKiBlbXB0eSBlbGVtZW50ICovCisJCXRtcCA9IGttZW1kdXAodCwgMiAqIHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCQlpZiAodG1wID09IE5VTEwpIHsKKwkJCWlmIChsYXN0ICE9IE5VTEwpCisJCQkJcGF0aF9mcmVlKHBhdGgsIHRhYmxlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKGxhc3QgIT0gTlVMTCkKKwkJCWxhc3QtPmNoaWxkID0gdG1wOworCQllbHNlCisJCQlwYXRoID0gdG1wOworCQlsYXN0ID0gdG1wOworCX0KKworCWlmIChsYXN0ICE9IE5VTEwpCisJCWxhc3QtPmNoaWxkID0gdGFibGU7CisJZWxzZQorCQlwYXRoID0gdGFibGU7CisKKwlyZXR1cm4gcGF0aDsKK30KKworc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKgorbmZfcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN0cnVjdCBjdGxfdGFibGUgKnBhdGgsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkZXI7CisKKwlwYXRoID0gcGF0aF9kdXAocGF0aCwgdGFibGUpOworCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWhlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShwYXRoLCAwKTsKKwlpZiAoaGVhZGVyID09IE5VTEwpCisJCXBhdGhfZnJlZShwYXRoLCB0YWJsZSk7CisJcmV0dXJuIGhlYWRlcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX3JlZ2lzdGVyX3N5c2N0bF90YWJsZSk7CisKK3ZvaWQKK25mX3VucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkZXIsCisJCQkgICBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICpwYXRoID0gaGVhZGVyLT5jdGxfdGFibGU7CisKKwl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShoZWFkZXIpOworCXBhdGhfZnJlZShwYXRoLCB0YWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl91bnJlZ2lzdGVyX3N5c2N0bF90YWJsZSk7CisKKy8qIG5ldC9uZXRmaWx0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5mX25ldF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORVRGSUxURVIsCisJCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAorCQkubW9kZQkJPSAwNTU1LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKK3N0cnVjdCBjdGxfdGFibGUgbmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aFtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBuZl9uZXRfbmV0ZmlsdGVyX3RhYmxlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25ldF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgpOworCisvKiBuZXQvaXB2NC9uZXRmaWx0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5mX25ldF9pcHY0X25ldGZpbHRlcl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkVURklMVEVSLAorCQkucHJvY25hbWUJPSAibmV0ZmlsdGVyIiwKKwkJLm1vZGUJCT0gMDU1NSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBuZl9uZXRfaXB2NF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjQsCisJCS5wcm9jbmFtZQk9ICJpcHY0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IG5mX25ldF9pcHY0X25ldGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CitzdHJ1Y3QgY3RsX3RhYmxlIG5mX25ldF9pcHY0X25ldGZpbHRlcl9zeXNjdGxfcGF0aFtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBuZl9uZXRfaXB2NF90YWJsZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uZXRfaXB2NF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCAxZTUyMDdiLi5kMTUwNWRkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtNDA4LDEzICs0MDgsMTMgQEAKIAkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKIAkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCiAJCQljb25zdCBzdHJ1Y3QgbmZfbG9naW5mbyAqbGksCi0JCQljb25zdCBjaGFyICpwcmVmaXgpCisJCQljb25zdCBjaGFyICpwcmVmaXgsIHVuc2lnbmVkIGludCBwbGVuKQogewogCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOwogCXN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9oZHIgcG1zZzsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnOwotCXVfaW50MzJfdCB0bXBfdWludDsKKwlfX2JlMzIgdG1wX3VpbnQ7CiAKIAlVREVCVUcoImVudGVyZWRcbiIpOwogCQkKQEAgLTQzMiwxMiArNDMyLDggQEAKIAogCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9QQUNLRVRfSERSLCBzaXplb2YocG1zZyksICZwbXNnKTsKIAotCWlmIChwcmVmaXgpIHsKLQkJaW50IHNsZW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJaWYgKHNsZW4gPiBORlVMTkxfUFJFRklYTEVOKQotCQkJc2xlbiA9IE5GVUxOTF9QUkVGSVhMRU47Ci0JCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9QUkVGSVgsIHNsZW4sIHByZWZpeCk7Ci0JfQorCWlmIChwcmVmaXgpCisJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9QUkVGSVgsIHBsZW4sIHByZWZpeCk7CiAKIAlpZiAoaW5kZXYpIHsKIAkJdG1wX3VpbnQgPSBodG9ubChpbmRldi0+aWZpbmRleCk7CkBAIC01MDEsMTggKzQ5NywxNiBAQAogI2VuZGlmCiAJfQogCi0JaWYgKHNrYi0+bmZtYXJrKSB7Ci0JCXRtcF91aW50ID0gaHRvbmwoc2tiLT5uZm1hcmspOworCWlmIChza2ItPm1hcmspIHsKKwkJdG1wX3VpbnQgPSBodG9ubChza2ItPm1hcmspOwogCQlORkFfUFVUKGluc3QtPnNrYiwgTkZVTEFfTUFSSywgc2l6ZW9mKHRtcF91aW50KSwgJnRtcF91aW50KTsKIAl9CiAKIAlpZiAoaW5kZXYgJiYgc2tiLT5kZXYgJiYgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKSB7CiAJCXN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyBwaHc7Ci0KLQkJcGh3Lmh3X2FkZHJsZW4gPSAKLQkJCXNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSgoc3RydWN0IHNrX2J1ZmYgKilza2IsIAorCQlpbnQgbGVuID0gc2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwKIAkJCQkJCSAgICBwaHcuaHdfYWRkcik7Ci0JCXBody5od19hZGRybGVuID0gaHRvbnMocGh3Lmh3X2FkZHJsZW4pOworCQlwaHcuaHdfYWRkcmxlbiA9IGh0b25zKGxlbik7CiAJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9IV0FERFIsIHNpemVvZihwaHcpLCAmcGh3KTsKIAl9CiAKQEAgLTUyOSw3ICs1MjMsNyBAQAogCWlmIChza2ItPnNrKSB7CiAJCXJlYWRfbG9ja19iaCgmc2tiLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJCWlmIChza2ItPnNrLT5za19zb2NrZXQgJiYgc2tiLT5zay0+c2tfc29ja2V0LT5maWxlKSB7Ci0JCQl1X2ludDMyX3QgdWlkID0gaHRvbmwoc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCk7CisJCQlfX2JlMzIgdWlkID0gaHRvbmwoc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCk7CiAJCQkvKiBuZWVkIHRvIHVubG9jayBoZXJlIHNpbmNlIE5GQV9QVVQgbWF5IGdvdG8gKi8KIAkJCXJlYWRfdW5sb2NrX2JoKCZza2ItPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAkJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9VSUQsIHNpemVvZih1aWQpLCAmdWlkKTsKQEAgLTYwMyw2ICs1OTcsNyBAQAogCWNvbnN0IHN0cnVjdCBuZl9sb2dpbmZvICpsaTsKIAl1bnNpZ25lZCBpbnQgcXRocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgbmxidWZzaXo7CisJdW5zaWduZWQgaW50IHBsZW47CiAKIAlpZiAobGlfdXNlciAmJiBsaV91c2VyLT50eXBlID09IE5GX0xPR19UWVBFX1VMT0cpIAogCQlsaSA9IGxpX3VzZXI7CkBAIC02MTgsNiArNjEzLDEwIEBACiAJCXJldHVybjsKIAl9CiAKKwlwbGVuID0gMDsKKwlpZiAocHJlZml4KQorCQlwbGVuID0gc3RybGVuKHByZWZpeCk7CisKIAkvKiBhbGwgbWFjcm9zIGV4cGFuZCB0byBjb25zdGFudCB2YWx1ZXMgYXQgY29tcGlsZSB0aW1lICovCiAJLyogRklYTUU6IGRvIHdlIHdhbnQgdG8gbWFrZSB0aGUgc2l6ZSBjYWxjdWxhdGlvbiBjb25kaXRpb25hbCBiYXNlZCBvbgogCSAqIHdoYXQgaXMgYWN0dWFsbHkgcHJlc2VudD8gIHdheSBtb3JlIGJyYW5jaGVzIGFuZCBjaGVja3MsIGJ1dCBtb3JlCkBAIC02MzIsNyArNjMxLDcgQEAKICNlbmRpZgogCQkrIE5GQV9TUEFDRShzaXplb2YodV9pbnQzMl90KSkJLyogbWFyayAqLwogCQkrIE5GQV9TUEFDRShzaXplb2YodV9pbnQzMl90KSkJLyogdWlkICovCi0JCSsgTkZBX1NQQUNFKE5GVUxOTF9QUkVGSVhMRU4pCS8qIHByZWZpeCAqLworCQkrIE5GQV9TUEFDRShwbGVuKQkJLyogcHJlZml4ICovCiAJCSsgTkZBX1NQQUNFKHNpemVvZihzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfaHcpKQogCQkrIE5GQV9TUEFDRShzaXplb2Yoc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X3RpbWVzdGFtcCkpOwogCkBAIC03MDMsNyArNzAyLDcgQEAKIAlpbnN0LT5xbGVuKys7CiAKIAlfX2J1aWxkX3BhY2tldF9tZXNzYWdlKGluc3QsIHNrYiwgZGF0YV9sZW4sIHBmLAotCQkJCWhvb2tudW0sIGluLCBvdXQsIGxpLCBwcmVmaXgpOworCQkJCWhvb2tudW0sIGluLCBvdXQsIGxpLCBwcmVmaXgsIHBsZW4pOwogCiAJLyogdGltZXJfcGVuZGluZyBhbHdheXMgY2FsbGVkIHdpdGhpbiBpbnN0LT5sb2NrLCBzbyB0aGVyZQogCSAqIGlzIG5vIGNoYW5jZSBvZiBhIHJhY2UgaGVyZSAqLwpAQCAtODgyLDE1ICs4ODEsMTUgQEAKIAl9CiAKIAlpZiAobmZ1bGFbTkZVTEFfQ0ZHX1RJTUVPVVQtMV0pIHsKLQkJdV9pbnQzMl90IHRpbWVvdXQgPSAKLQkJCSoodV9pbnQzMl90ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX1RJTUVPVVQtMV0pOworCQlfX2JlMzIgdGltZW91dCA9CisJCQkqKF9fYmUzMiAqKU5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19USU1FT1VULTFdKTsKIAogCQluZnVsbmxfc2V0X3RpbWVvdXQoaW5zdCwgbnRvaGwodGltZW91dCkpOwogCX0KIAogCWlmIChuZnVsYVtORlVMQV9DRkdfTkxCVUZTSVotMV0pIHsKLQkJdV9pbnQzMl90IG5sYnVmc2l6ID0gCi0JCQkqKHVfaW50MzJfdCAqKU5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19OTEJVRlNJWi0xXSk7CisJCV9fYmUzMiBubGJ1ZnNpeiA9CisJCQkqKF9fYmUzMiAqKU5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19OTEJVRlNJWi0xXSk7CiAKIAkJbmZ1bG5sX3NldF9ubGJ1ZnNpeihpbnN0LCBudG9obChubGJ1ZnNpeikpOwogCX0KQEAgLTkwMyw4ICs5MDIsOCBAQAogCX0KIAogCWlmIChuZnVsYVtORlVMQV9DRkdfRkxBR1MtMV0pIHsKLQkJdV9pbnQxNl90IGZsYWdzID0KLQkJCSoodV9pbnQxNl90ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX0ZMQUdTLTFdKTsKKwkJX19iZTE2IGZsYWdzID0KKwkJCSooX19iZTE2ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX0ZMQUdTLTFdKTsKIAkJbmZ1bG5sX3NldF9mbGFncyhpbnN0LCBudG9ocyhmbGFncykpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggZTgxNWE5YS4uYTg4YTAxNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC0zNDksNyArMzQ5LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqZW50c2tiID0gZW50cnktPnNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldjsKLQl1bnNpZ25lZCBpbnQgdG1wX3VpbnQ7CisJX19iZTMyIHRtcF91aW50OwogCiAJUURFQlVHKCJlbnRlcmVkXG4iKTsKIApAQCAtNDgwLDggKzQ4MCw4IEBACiAjZW5kaWYKIAl9CiAKLQlpZiAoZW50c2tiLT5uZm1hcmspIHsKLQkJdG1wX3VpbnQgPSBodG9ubChlbnRza2ItPm5mbWFyayk7CisJaWYgKGVudHNrYi0+bWFyaykgeworCQl0bXBfdWludCA9IGh0b25sKGVudHNrYi0+bWFyayk7CiAJCU5GQV9QVVQoc2tiLCBORlFBX01BUkssIHNpemVvZih1X2ludDMyX3QpLCAmdG1wX3VpbnQpOwogCX0KIApAQCAtNDg5LDEwICs0ODksOSBAQAogCSAgICAmJiBlbnRza2ItPmRldi0+aGFyZF9oZWFkZXJfcGFyc2UpIHsKIAkJc3RydWN0IG5mcW5sX21zZ19wYWNrZXRfaHcgcGh3OwogCi0JCXBody5od19hZGRybGVuID0KLQkJCWVudHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9wYXJzZShlbnRza2IsCisJCWludCBsZW4gPSBlbnRza2ItPmRldi0+aGFyZF9oZWFkZXJfcGFyc2UoZW50c2tiLAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHcuaHdfYWRkcik7Ci0JCXBody5od19hZGRybGVuID0gaHRvbnMocGh3Lmh3X2FkZHJsZW4pOworCQlwaHcuaHdfYWRkcmxlbiA9IGh0b25zKGxlbik7CiAJCU5GQV9QVVQoc2tiLCBORlFBX0hXQUREUiwgc2l6ZW9mKHBodyksICZwaHcpOwogCX0KIApAQCAtODM1LDggKzgzNCw4IEBACiAJfQogCiAJaWYgKG5mcWFbTkZRQV9NQVJLLTFdKQotCQllbnRyeS0+c2tiLT5uZm1hcmsgPSBudG9obCgqKHVfaW50MzJfdCAqKQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBORkFfREFUQShuZnFhW05GUUFfTUFSSy0xXSkpOworCQllbnRyeS0+c2tiLT5tYXJrID0gbnRvaGwoKihfX2JlMzIgKikKKwkJICAgICAgICAgICAgICAgICAgICAgICAgIE5GQV9EQVRBKG5mcWFbTkZRQV9NQVJLLTFdKSk7CiAJCQogCWlzc3VlX3ZlcmRpY3QoZW50cnksIHZlcmRpY3QpOwogCWluc3RhbmNlX3B1dChxdWV1ZSk7CkBAIC05NDgsNiArOTQ3LDE0IEBACiAJCQkJbnRvaGwocGFyYW1zLT5jb3B5X3JhbmdlKSk7CiAJfQogCisJaWYgKG5mcWFbTkZRQV9DRkdfUVVFVUVfTUFYTEVOLTFdKSB7CisJCV9fYmUzMiAqcXVldWVfbWF4bGVuOworCQlxdWV1ZV9tYXhsZW4gPSBORkFfREFUQShuZnFhW05GUUFfQ0ZHX1FVRVVFX01BWExFTi0xXSk7CisJCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOworCQlxdWV1ZS0+cXVldWVfbWF4bGVuID0gbnRvaGwoKnF1ZXVlX21heGxlbik7CisJCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CisJfQorCiBvdXRfcHV0OgogCWluc3RhbmNlX3B1dChxdWV1ZSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwppbmRleCA1ODUyMmZjLi44OTk2NTg0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwppbmRleCBjMDE1MjRmLi5iNTU0ODIzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCkBAIC0zMSw2ICszMSw5IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgorI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCkBAIC00Miw3ICs0NSw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOwogCXVfaW50MzJfdCBkaWZmOwotCXVfaW50MzJfdCBuZm1hcms7CisJdV9pbnQzMl90IG1hcms7CiAJdV9pbnQzMl90IG5ld21hcms7CiAJdV9pbnQzMl90IGN0aW5mbzsKIAl1X2ludDMyX3QgKmN0bWFyayA9IG5mX2N0X2dldF9tYXJrKCpwc2tiLCAmY3RpbmZvKTsKQEAgLTYyLDcgKzY1LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFhUX0NPTk5NQVJLX1NBVkU6CiAJCQluZXdtYXJrID0gKCpjdG1hcmsgJiB+bWFya2luZm8tPm1hc2spIHwKLQkJCQkgICgoKnBza2IpLT5uZm1hcmsgJiBtYXJraW5mby0+bWFzayk7CisJCQkJICAoKCpwc2tiKS0+bWFyayAmIG1hcmtpbmZvLT5tYXNrKTsKIAkJCWlmICgqY3RtYXJrICE9IG5ld21hcmspIHsKIAkJCQkqY3RtYXJrID0gbmV3bWFyazsKICNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCkBAIC03MywxMCArNzYsMTAgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFhUX0NPTk5NQVJLX1JFU1RPUkU6Ci0JCQluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7Ci0JCQlkaWZmID0gKCpjdG1hcmsgXiBuZm1hcmspICYgbWFya2luZm8tPm1hc2s7CisJCQltYXJrID0gKCpwc2tiKS0+bWFyazsKKwkJCWRpZmYgPSAoKmN0bWFyayBeIG1hcmspICYgbWFya2luZm8tPm1hc2s7CiAJCQlpZiAoZGlmZiAhPSAwKQotCQkJCSgqcHNrYiktPm5mbWFyayA9IG5mbWFyayBeIGRpZmY7CisJCQkJKCpwc2tiKS0+bWFyayA9IG1hcmsgXiBkaWZmOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCmluZGV4IGM2ZTg2MGEuLjBiNDg1NDcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCkBAIC0zMSw4ICszMSw4IEBACiB7CiAJY29uc3Qgc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CiAKLQlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFya2luZm8tPm1hcmspCi0JCSgqcHNrYiktPm5mbWFyayA9IG1hcmtpbmZvLT5tYXJrOworCWlmKCgqcHNrYiktPm1hcmsgIT0gbWFya2luZm8tPm1hcmspCisJCSgqcHNrYiktPm1hcmsgPSBtYXJraW5mby0+bWFyazsKIAogCXJldHVybiBYVF9DT05USU5VRTsKIH0KQEAgLTU0LDE2ICs1NCwxNiBAQAogCQlicmVhazsKIAkJCiAJY2FzZSBYVF9NQVJLX0FORDoKLQkJbWFyayA9ICgqcHNrYiktPm5mbWFyayAmIG1hcmtpbmZvLT5tYXJrOworCQltYXJrID0gKCpwc2tiKS0+bWFyayAmIG1hcmtpbmZvLT5tYXJrOwogCQlicmVhazsKIAkJCiAJY2FzZSBYVF9NQVJLX09SOgotCQltYXJrID0gKCpwc2tiKS0+bmZtYXJrIHwgbWFya2luZm8tPm1hcms7CisJCW1hcmsgPSAoKnBza2IpLT5tYXJrIHwgbWFya2luZm8tPm1hcms7CiAJCWJyZWFrOwogCX0KIAotCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJrKQotCQkoKnBza2IpLT5uZm1hcmsgPSBtYXJrOworCWlmKCgqcHNrYiktPm1hcmsgIT0gbWFyaykKKwkJKCpwc2tiKS0+bWFyayA9IG1hcms7CiAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05GTE9HLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05GTE9HLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTkZMT0cuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ORkxPRy5oPgorCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieF90YWJsZXMgTkZMT0cgdGFyZ2V0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9ORkxPRyIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X05GTE9HIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25mbG9nX3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCSAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCit7CisJY29uc3Qgc3RydWN0IHh0X25mbG9nX2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgbmZfbG9naW5mbyBsaTsKKworCWxpLnR5cGUJCSAgICAgPSBORl9MT0dfVFlQRV9VTE9HOworCWxpLnUudWxvZy5jb3B5X2xlbiAgID0gaW5mby0+bGVuOworCWxpLnUudWxvZy5ncm91cAkgICAgID0gaW5mby0+Z3JvdXA7CisJbGkudS51bG9nLnF0aHJlc2hvbGQgPSBpbmZvLT50aHJlc2hvbGQ7CisKKwluZl9sb2dfcGFja2V0KHRhcmdldC0+ZmFtaWx5LCBob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgJmxpLAorCQkgICAgICAiJXMiLCBpbmZvLT5wcmVmaXgpOworCXJldHVybiBYVF9DT05USU5VRTsKK30KKworc3RhdGljIGludAorbmZsb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAorCQkgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnZXRpbmZvLAorCQkgdW5zaWduZWQgaW50IGhvb2ttYXNrKQoreworCXN0cnVjdCB4dF9uZmxvZ19pbmZvICppbmZvID0gdGFyZ2V0aW5mbzsKKworCWlmIChpbmZvLT5mbGFncyAmIH5YVF9ORkxPR19NQVNLKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5mby0+cHJlZml4W3NpemVvZihpbmZvLT5wcmVmaXgpIC0gMV0gIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHh0X25mbG9nX3RhcmdldFtdID0geworCXsKKwkJLm5hbWUJCT0gIk5GTE9HIiwKKwkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuY2hlY2tlbnRyeQk9IG5mbG9nX2NoZWNrZW50cnksCisJCS50YXJnZXQJCT0gbmZsb2dfdGFyZ2V0LAorCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfbmZsb2dfaW5mbyksCisJCS5tZQkJPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIk5GTE9HIiwKKwkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmNoZWNrZW50cnkJPSBuZmxvZ19jaGVja2VudHJ5LAorCQkudGFyZ2V0CQk9IG5mbG9nX3RhcmdldCwKKwkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X25mbG9nX2luZm8pLAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHh0X25mbG9nX2luaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyh4dF9uZmxvZ190YXJnZXQsCisJCQkJICAgQVJSQVlfU0laRSh4dF9uZmxvZ190YXJnZXQpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHh0X25mbG9nX2Zpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldHMoeHRfbmZsb2dfdGFyZ2V0LCBBUlJBWV9TSVpFKHh0X25mbG9nX3RhcmdldCkpOworfQorCittb2R1bGVfaW5pdCh4dF9uZmxvZ19pbml0KTsKK21vZHVsZV9leGl0KHh0X25mbG9nX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4ZGUwYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKQEAgLTAsMCArMSw3NzMgQEAKKy8qIGlwdGFibGVzIG1hdGNoIGV4dGVuc2lvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcGVyIHNlY29uZAorICogc2VwZXJhdGVseSBmb3IgZWFjaCBoYXNoYnVja2V0IChzb3VyY2VpcC9zb3VyY2Vwb3J0L2RzdGlwL2RzdHBvcnQpCisgKgorICogKEMpIDIwMDMtMjAwNCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiAkSWQ6IGlwdF9oYXNobGltaXQuYyAzMjQ0IDIwMDQtMTAtMjAgMTY6MjQ6MjlaIGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZyAkCisgKgorICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBmdW5kZWQgYnkgQXN0YXJvIEFHLCBodHRwOi8vd3d3LmFzdGFyby5jb20vCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIGxpbWl0aW5nIHBlciBoYXNoLWJ1Y2tldCIpOworTU9EVUxFX0FMSUFTKCJpcHRfaGFzaGxpbWl0Iik7CitNT0RVTEVfQUxJQVMoImlwNnRfaGFzaGxpbWl0Iik7CisKKy8qIG5lZWQgdG8gZGVjbGFyZSB0aGlzIGF0IHRoZSB0b3AgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhhc2hsaW1pdF9wcm9jZGlyNDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhhc2hsaW1pdF9wcm9jZGlyNjsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzOworCisvKiBoYXNoIHRhYmxlIGNyYXAgKi8KK3N0cnVjdCBkc3RoYXNoX2RzdCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19iZTMyIHNyYzsKKwkJCV9fYmUzMiBkc3Q7CisJCX0gaXA7CisJCXN0cnVjdCB7CisJCQlfX2JlMzIgc3JjWzRdOworCQkJX19iZTMyIGRzdFs0XTsKKwkJfSBpcDY7CisJfSBhZGRyOworCV9fYmUxNiBzcmNfcG9ydDsKKwlfX2JlMTYgZHN0X3BvcnQ7Cit9OworCitzdHJ1Y3QgZHN0aGFzaF9lbnQgeworCS8qIHN0YXRpYyAvIHJlYWQtb25seSBwYXJ0cyBpbiB0aGUgYmVnaW5uaW5nICovCisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKKwlzdHJ1Y3QgZHN0aGFzaF9kc3QgZHN0OworCisJLyogbW9kaWZpZWQgc3RydWN0dXJlIG1lbWJlcnMgaW4gdGhlIGVuZCAqLworCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsJCS8qIHByZWNhbGN1bGF0ZWQgZXhwaXJ5IHRpbWUgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHByZXY7CS8qIGxhc3QgbW9kaWZpY2F0aW9uICovCisJCXVfaW50MzJfdCBjcmVkaXQ7CisJCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OworCX0gcmF0ZWluZm87Cit9OworCitzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSB7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsJCS8qIGdsb2JhbCBsaXN0IG9mIGFsbCBodGFibGVzICovCisJYXRvbWljX3QgdXNlOworCWludCBmYW1pbHk7CisKKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZyBjZmc7CS8qIGNvbmZpZyAqLworCisJLyogdXNlZCBpbnRlcm5hbGx5ICovCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogbG9jayBmb3IgbGlzdF9oZWFkICovCisJdV9pbnQzMl90IHJuZDsJCQkvKiByYW5kb20gc2VlZCBmb3IgaGFzaCAqLworCWludCBybmRfaW5pdGlhbGl6ZWQ7CisJdW5zaWduZWQgaW50IGNvdW50OwkJLyogbnVtYmVyIGVudHJpZXMgaW4gdGFibGUgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogdGltZXIgZm9yIGdjICovCisKKwkvKiBzZXFfZmlsZSBzdHVmZiAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOworCisJc3RydWN0IGhsaXN0X2hlYWQgaGFzaFswXTsJLyogaGFzaHRhYmxlIGl0c2VsZiAqLworfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhoYXNobGltaXRfbG9jayk7CS8qIHByb3RlY3RzIGh0YWJsZXMgbGlzdCAqLworc3RhdGljIERFRklORV9NVVRFWChobGltaXRfbXV0ZXgpOwkvKiBhZGRpdGlvbmFsIGNoZWNrZW50cnkgcHJvdGVjdGlvbiAqLworc3RhdGljIEhMSVNUX0hFQUQoaGFzaGxpbWl0X2h0YWJsZXMpOworc3RhdGljIGttZW1fY2FjaGVfdCAqaGFzaGxpbWl0X2NhY2hlcCBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgaW5saW5lIGludCBkc3RfY21wKGNvbnN0IHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCBzdHJ1Y3QgZHN0aGFzaF9kc3QgKmIpCit7CisJcmV0dXJuICFtZW1jbXAoJmVudC0+ZHN0LCBiLCBzaXplb2YoZW50LT5kc3QpKTsKK30KKworc3RhdGljIHVfaW50MzJfdAoraGFzaF9kc3QoY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmh0LCBjb25zdCBzdHJ1Y3QgZHN0aGFzaF9kc3QgKmRzdCkKK3sKKwlyZXR1cm4gamhhc2goZHN0LCBzaXplb2YoKmRzdCksIGh0LT5ybmQpICUgaHQtPmNmZy5zaXplOworfQorCitzdGF0aWMgc3RydWN0IGRzdGhhc2hfZW50ICoKK2RzdGhhc2hfZmluZChjb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2RzdCAqZHN0KQoreworCXN0cnVjdCBkc3RoYXNoX2VudCAqZW50OworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJdV9pbnQzMl90IGhhc2ggPSBoYXNoX2RzdChodCwgZHN0KTsKKworCWlmICghaGxpc3RfZW1wdHkoJmh0LT5oYXNoW2hhc2hdKSkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnQsIHBvcywgJmh0LT5oYXNoW2hhc2hdLCBub2RlKQorCQkJaWYgKGRzdF9jbXAoZW50LCBkc3QpKQorCQkJCXJldHVybiBlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBhbGxvY2F0ZSBkc3RoYXNoX2VudCwgaW5pdGlhbGl6ZSBkc3QsIHB1dCBpbiBodGFibGUgYW5kIGxvY2sgaXQgKi8KK3N0YXRpYyBzdHJ1Y3QgZHN0aGFzaF9lbnQgKgorZHN0aGFzaF9hbGxvY19pbml0KHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodCwgc3RydWN0IGRzdGhhc2hfZHN0ICpkc3QpCit7CisJc3RydWN0IGRzdGhhc2hfZW50ICplbnQ7CisKKwkvKiBpbml0aWFsaXplIGhhc2ggd2l0aCByYW5kb20gdmFsIGF0IHRoZSB0aW1lIHdlIGFsbG9jYXRlCisJICogdGhlIGZpcnN0IGhhc2h0YWJsZSBlbnRyeSAqLworCWlmICghaHQtPnJuZF9pbml0aWFsaXplZCkgeworCQlnZXRfcmFuZG9tX2J5dGVzKCZodC0+cm5kLCA0KTsKKwkJaHQtPnJuZF9pbml0aWFsaXplZCA9IDE7CisJfQorCisJaWYgKGh0LT5jZmcubWF4ICYmIGh0LT5jb3VudCA+PSBodC0+Y2ZnLm1heCkgeworCQkvKiBGSVhNRTogZG8gc29tZXRoaW5nLiBxdWVzdGlvbiBpcyB3aGF0Li4gKi8KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkieHRfaGFzaGxpbWl0OiBtYXggY291bnQgb2YgJXUgcmVhY2hlZFxuIiwKKwkJCQlodC0+Y2ZnLm1heCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWVudCA9IGttZW1fY2FjaGVfYWxsb2MoaGFzaGxpbWl0X2NhY2hlcCwgR0ZQX0FUT01JQyk7CisJaWYgKCFlbnQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJ4dF9oYXNobGltaXQ6IGNhbid0IGFsbG9jYXRlIGRzdGhhc2hfZW50XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweSgmZW50LT5kc3QsIGRzdCwgc2l6ZW9mKGVudC0+ZHN0KSk7CisKKwlobGlzdF9hZGRfaGVhZCgmZW50LT5ub2RlLCAmaHQtPmhhc2hbaGFzaF9kc3QoaHQsIGRzdCldKTsKKwlodC0+Y291bnQrKzsKKwlyZXR1cm4gZW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RzdGhhc2hfZnJlZShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2VudCAqZW50KQoreworCWhsaXN0X2RlbCgmZW50LT5ub2RlKTsKKwlrbWVtX2NhY2hlX2ZyZWUoaGFzaGxpbWl0X2NhY2hlcCwgZW50KTsKKwlodC0+Y291bnQtLTsKK30KK3N0YXRpYyB2b2lkIGh0YWJsZV9nYyh1bnNpZ25lZCBsb25nIGh0bG9uZyk7CisKK3N0YXRpYyBpbnQgaHRhYmxlX2NyZWF0ZShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKm1pbmZvLCBpbnQgZmFtaWx5KQoreworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbzsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChtaW5mby0+Y2ZnLnNpemUpCisJCXNpemUgPSBtaW5mby0+Y2ZnLnNpemU7CisJZWxzZSB7CisJCXNpemUgPSAoKG51bV9waHlzcGFnZXMgPDwgUEFHRV9TSElGVCkgLyAxNjM4NCkgLworCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpOworCQlpZiAobnVtX3BoeXNwYWdlcyA+ICgxMDI0ICogMTAyNCAqIDEwMjQgLyBQQUdFX1NJWkUpKQorCQkJc2l6ZSA9IDgxOTI7CisJCWlmIChzaXplIDwgMTYpCisJCQlzaXplID0gMTY7CisJfQorCS8qIEZJWE1FOiBkb24ndCB1c2Ugdm1hbGxvYygpIGhlcmUgb3IgYW55d2hlcmUgZWxzZSAtSFcgKi8KKwloaW5mbyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlKSArCisJCQlzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBzaXplKTsKKwlpZiAoIWhpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAieHRfaGFzaGxpbWl0OiB1bmFibGUgdG8gY3JlYXRlIGhhc2h0YWJsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJbWluZm8tPmhpbmZvID0gaGluZm87CisKKwkvKiBjb3B5IG1hdGNoIGNvbmZpZyBpbnRvIGhhc2h0YWJsZSBjb25maWcgKi8KKwltZW1jcHkoJmhpbmZvLT5jZmcsICZtaW5mby0+Y2ZnLCBzaXplb2YoaGluZm8tPmNmZykpOworCWhpbmZvLT5jZmcuc2l6ZSA9IHNpemU7CisJaWYgKCFoaW5mby0+Y2ZnLm1heCkKKwkJaGluZm8tPmNmZy5tYXggPSA4ICogaGluZm8tPmNmZy5zaXplOworCWVsc2UgaWYgKGhpbmZvLT5jZmcubWF4IDwgaGluZm8tPmNmZy5zaXplKQorCQloaW5mby0+Y2ZnLm1heCA9IGhpbmZvLT5jZmcuc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBoaW5mby0+Y2ZnLnNpemU7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZoaW5mby0+aGFzaFtpXSk7CisKKwlhdG9taWNfc2V0KCZoaW5mby0+dXNlLCAxKTsKKwloaW5mby0+Y291bnQgPSAwOworCWhpbmZvLT5mYW1pbHkgPSBmYW1pbHk7CisJaGluZm8tPnJuZF9pbml0aWFsaXplZCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmhpbmZvLT5sb2NrKTsKKwloaW5mby0+cGRlID0gY3JlYXRlX3Byb2NfZW50cnkobWluZm8tPm5hbWUsIDAsCisJCQkJICAgICAgIGZhbWlseSA9PSBBRl9JTkVUID8gaGFzaGxpbWl0X3Byb2NkaXI0IDoKKwkJCQkgICAgICAgCQkJICAgaGFzaGxpbWl0X3Byb2NkaXI2KTsKKwlpZiAoIWhpbmZvLT5wZGUpIHsKKwkJdmZyZWUoaGluZm8pOworCQlyZXR1cm4gLTE7CisJfQorCWhpbmZvLT5wZGUtPnByb2NfZm9wcyA9ICZkbF9maWxlX29wczsKKwloaW5mby0+cGRlLT5kYXRhID0gaGluZm87CisKKwlpbml0X3RpbWVyKCZoaW5mby0+dGltZXIpOworCWhpbmZvLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5nY19pbnRlcnZhbCk7CisJaGluZm8tPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyApaGluZm87CisJaGluZm8tPnRpbWVyLmZ1bmN0aW9uID0gaHRhYmxlX2djOworCWFkZF90aW1lcigmaGluZm8tPnRpbWVyKTsKKworCXNwaW5fbG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZoaW5mby0+bm9kZSwgJmhhc2hsaW1pdF9odGFibGVzKTsKKwlzcGluX3VubG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VsZWN0X2FsbChzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2VudCAqaGUpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2VsZWN0X2djKHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodCwgc3RydWN0IGRzdGhhc2hfZW50ICpoZSkKK3sKKwlyZXR1cm4gKGppZmZpZXMgPj0gaGUtPmV4cGlyZXMpOworfQorCitzdGF0aWMgdm9pZCBodGFibGVfc2VsZWN0aXZlX2NsZWFudXAoc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmh0LAorCQkgCQlpbnQgKCpzZWxlY3QpKHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodCwKKwkJCQkJICAgICAgc3RydWN0IGRzdGhhc2hfZW50ICpoZSkpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBsb2NrIGhhc2ggdGFibGUgYW5kIGl0ZXJhdGUgb3ZlciBpdCAqLworCXNwaW5fbG9ja19iaCgmaHQtPmxvY2spOworCWZvciAoaSA9IDA7IGkgPCBodC0+Y2ZnLnNpemU7IGkrKykgeworCQlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbjsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkaCwgcG9zLCBuLCAmaHQtPmhhc2hbaV0sIG5vZGUpIHsKKwkJCWlmICgoKnNlbGVjdCkoaHQsIGRoKSkKKwkJCQlkc3RoYXNoX2ZyZWUoaHQsIGRoKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmaHQtPmxvY2spOworfQorCisvKiBoYXNoIHRhYmxlIGdhcmJhZ2UgY29sbGVjdG9yLCBydW4gYnkgdGltZXIgKi8KK3N0YXRpYyB2b2lkIGh0YWJsZV9nYyh1bnNpZ25lZCBsb25nIGh0bG9uZykKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQgPSAoc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKilodGxvbmc7CisKKwlodGFibGVfc2VsZWN0aXZlX2NsZWFudXAoaHQsIHNlbGVjdF9nYyk7CisKKwkvKiByZS1hZGQgdGhlIHRpbWVyIGFjY29yZGluZ2x5ICovCisJaHQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhodC0+Y2ZnLmdjX2ludGVydmFsKTsKKwlhZGRfdGltZXIoJmh0LT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGh0YWJsZV9kZXN0cm95KHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbykKK3sKKwkvKiByZW1vdmUgdGltZXIsIGlmIGl0IGlzIHBlbmRpbmcgKi8KKwlpZiAodGltZXJfcGVuZGluZygmaGluZm8tPnRpbWVyKSkKKwkJZGVsX3RpbWVyKCZoaW5mby0+dGltZXIpOworCisJLyogcmVtb3ZlIHByb2MgZW50cnkgKi8KKwlyZW1vdmVfcHJvY19lbnRyeShoaW5mby0+cGRlLT5uYW1lLAorCQkJICBoaW5mby0+ZmFtaWx5ID09IEFGX0lORVQgPyBoYXNobGltaXRfcHJvY2RpcjQgOgorCQkJICAJCQkgICAgIGhhc2hsaW1pdF9wcm9jZGlyNik7CisJaHRhYmxlX3NlbGVjdGl2ZV9jbGVhbnVwKGhpbmZvLCBzZWxlY3RfYWxsKTsKKwl2ZnJlZShoaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlX2ZpbmRfZ2V0KGNoYXIgKm5hbWUsIGludCBmYW1pbHkpCit7CisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlzcGluX2xvY2tfYmgoJmhhc2hsaW1pdF9sb2NrKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShoaW5mbywgcG9zLCAmaGFzaGxpbWl0X2h0YWJsZXMsIG5vZGUpIHsKKwkJaWYgKCFzdHJjbXAobmFtZSwgaGluZm8tPnBkZS0+bmFtZSkgJiYKKwkJICAgIGhpbmZvLT5mYW1pbHkgPT0gZmFtaWx5KSB7CisJCQlhdG9taWNfaW5jKCZoaW5mby0+dXNlKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZoYXNobGltaXRfbG9jayk7CisJCQlyZXR1cm4gaGluZm87CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmhhc2hsaW1pdF9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaHRhYmxlX3B1dChzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8pCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhpbmZvLT51c2UpKSB7CisJCXNwaW5fbG9ja19iaCgmaGFzaGxpbWl0X2xvY2spOworCQlobGlzdF9kZWwoJmhpbmZvLT5ub2RlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmhhc2hsaW1pdF9sb2NrKTsKKwkJaHRhYmxlX2Rlc3Ryb3koaGluZm8pOworCX0KK30KKworLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQorICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCisgKi8KKworLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgorICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAorICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCisgICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQorICAgdGVzdCwgYGNvc3QnLgorCisgICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgorICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcworICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKKyAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCisKKyAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KKworICAgVG8gZ2V0IHRoZSBtYXhpbXVtIHJhbmdlLCB3ZSBtdWx0aXBseSBieSB0aGlzIGZhY3RvciAoaWUuIHlvdSBnZXQgTgorICAgY3JlZGl0cyBwZXIgamlmZnkpLiAgV2Ugd2FudCB0byBhbGxvdyBhIHJhdGUgYXMgbG93IGFzIDEgcGVyIGRheQorICAgKHNsb3dlc3QgdXNlcnNwYWNlIHRvb2wgYWxsb3dzKSwgd2hpY2ggbWVhbnMKKyAgIENSRURJVFNfUEVSX0pJRkZZKkhaKjYwKjYwKjI0IDwgMl4zMiBpZS4KKyovCisjZGVmaW5lIE1BWF9DUEogKDB4RkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQorCisvKiBSZXBlYXRlZCBzaGlmdCBhbmQgb3IgZ2l2ZXMgdXMgYWxsIDFzLCBmaW5hbCBzaGlmdCBhbmQgYWRkIDEgZ2l2ZXMKKyAqIHVzIHRoZSBwb3dlciBvZiAyIGJlbG93IHRoZSB0aGVvcmV0aWNhbCBtYXgsIHNvIEdDQyBzaW1wbHkgZG9lcyBhCisgKiBzaGlmdC4gKi8KKyNkZWZpbmUgX1BPVzJfQkVMT1cyKHgpICgoeCl8KCh4KT4+MSkpCisjZGVmaW5lIF9QT1cyX0JFTE9XNCh4KSAoX1BPVzJfQkVMT1cyKHgpfF9QT1cyX0JFTE9XMigoeCk+PjIpKQorI2RlZmluZSBfUE9XMl9CRUxPVzgoeCkgKF9QT1cyX0JFTE9XNCh4KXxfUE9XMl9CRUxPVzQoKHgpPj40KSkKKyNkZWZpbmUgX1BPVzJfQkVMT1cxNih4KSAoX1BPVzJfQkVMT1c4KHgpfF9QT1cyX0JFTE9XOCgoeCk+PjgpKQorI2RlZmluZSBfUE9XMl9CRUxPVzMyKHgpIChfUE9XMl9CRUxPVzE2KHgpfF9QT1cyX0JFTE9XMTYoKHgpPj4xNikpCisjZGVmaW5lIFBPVzJfQkVMT1czMih4KSAoKF9QT1cyX0JFTE9XMzIoeCk+PjEpICsgMSkKKworI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XMzIoTUFYX0NQSikKKworLyogUHJlY2lzaW9uIHNhdmVyLiAqLworc3RhdGljIGlubGluZSB1X2ludDMyX3QKK3VzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKK3sKKwkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLworCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCisJCS8qIERpdmlkZSBmaXJzdC4gKi8KKwkJcmV0dXJuICh1c2VyIC8gWFRfSEFTSExJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CisKKwlyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIFhUX0hBU0hMSU1JVF9TQ0FMRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhdGVpbmZvX3JlY2FsYyhzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoLCB1bnNpZ25lZCBsb25nIG5vdykKK3sKKwlkaC0+cmF0ZWluZm8uY3JlZGl0ICs9IChub3cgLSBkaC0+cmF0ZWluZm8ucHJldikgKiBDUkVESVRTX1BFUl9KSUZGWTsKKwlpZiAoZGgtPnJhdGVpbmZvLmNyZWRpdCA+IGRoLT5yYXRlaW5mby5jcmVkaXRfY2FwKQorCQlkaC0+cmF0ZWluZm8uY3JlZGl0ID0gZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXA7CisJZGgtPnJhdGVpbmZvLnByZXYgPSBub3c7Cit9CisKK3N0YXRpYyBpbnQKK2hhc2hsaW1pdF9pbml0X2RzdChzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8sIHN0cnVjdCBkc3RoYXNoX2RzdCAqZHN0LAorCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgcHJvdG9mZikKK3sKKwlfX2JlMTYgX3BvcnRzWzJdLCAqcG9ydHM7CisJaW50IG5leHRoZHI7CisKKwltZW1zZXQoZHN0LCAwLCBzaXplb2YoKmRzdCkpOworCisJc3dpdGNoIChoaW5mby0+ZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfRElQKQorCQkJZHN0LT5hZGRyLmlwLmRzdCA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwkJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9IQVNIX1NJUCkKKwkJCWRzdC0+YWRkci5pcC5zcmMgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisKKwkJaWYgKCEoaGluZm8tPmNmZy5tb2RlICYKKwkJICAgICAgKFhUX0hBU0hMSU1JVF9IQVNIX0RQVCB8IFhUX0hBU0hMSU1JVF9IQVNIX1NQVCkpKQorCQkJcmV0dXJuIDA7CisJCW5leHRoZHIgPSBza2ItPm5oLmlwaC0+cHJvdG9jb2w7CisJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfRElQKQorCQkJbWVtY3B5KCZkc3QtPmFkZHIuaXA2LmRzdCwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJICAgICAgIHNpemVvZihkc3QtPmFkZHIuaXA2LmRzdCkpOworCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfU0lQKQorCQkJbWVtY3B5KCZkc3QtPmFkZHIuaXA2LnNyYywgJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJICAgICAgIHNpemVvZihkc3QtPmFkZHIuaXA2LnNyYykpOworCisJCWlmICghKGhpbmZvLT5jZmcubW9kZSAmCisJCSAgICAgIChYVF9IQVNITElNSVRfSEFTSF9EUFQgfCBYVF9IQVNITElNSVRfSEFTSF9TUFQpKSkKKwkJCXJldHVybiAwOworCQluZXh0aGRyID0gaXB2Nl9maW5kX2hkcihza2IsICZwcm90b2ZmLCAtMSwgTlVMTCk7CisJCWlmIChuZXh0aGRyIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChuZXh0aGRyKSB7CisJY2FzZSBJUFBST1RPX1RDUDoKKwljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19TQ1RQOgorCWNhc2UgSVBQUk9UT19EQ0NQOgorCQlwb3J0cyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfcG9ydHMpLAorCQkJCQkgICAmX3BvcnRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJX3BvcnRzWzBdID0gX3BvcnRzWzFdID0gMDsKKwkJcG9ydHMgPSBfcG9ydHM7CisJCWJyZWFrOworCX0KKwlpZiAoIXBvcnRzKQorCQlyZXR1cm4gLTE7CisJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9IQVNIX1NQVCkKKwkJZHN0LT5zcmNfcG9ydCA9IHBvcnRzWzBdOworCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9EUFQpCisJCWRzdC0+ZHN0X3BvcnQgPSBwb3J0c1sxXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraGFzaGxpbWl0X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKKwkJY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCQlpbnQgb2Zmc2V0LAorCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciA9CisJCSgoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICopbWF0Y2hpbmZvKS0+dS5tYXN0ZXI7CisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvID0gci0+aGluZm87CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCXN0cnVjdCBkc3RoYXNoX2VudCAqZGg7CisJc3RydWN0IGRzdGhhc2hfZHN0IGRzdDsKKworCWlmIChoYXNobGltaXRfaW5pdF9kc3QoaGluZm8sICZkc3QsIHNrYiwgcHJvdG9mZikgPCAwKQorCQlnb3RvIGhvdGRyb3A7CisKKwlzcGluX2xvY2tfYmgoJmhpbmZvLT5sb2NrKTsKKwlkaCA9IGRzdGhhc2hfZmluZChoaW5mbywgJmRzdCk7CisJaWYgKCFkaCkgeworCQlkaCA9IGRzdGhhc2hfYWxsb2NfaW5pdChoaW5mbywgJmRzdCk7CisJCWlmICghZGgpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZoaW5mby0+bG9jayk7CisJCQlnb3RvIGhvdGRyb3A7CisJCX0KKworCQlkaC0+ZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGhpbmZvLT5jZmcuZXhwaXJlKTsKKwkJZGgtPnJhdGVpbmZvLnByZXYgPSBqaWZmaWVzOworCQlkaC0+cmF0ZWluZm8uY3JlZGl0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnICoKKwkJCQkJCSAgIGhpbmZvLT5jZmcuYnVyc3QpOworCQlkaC0+cmF0ZWluZm8uY3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhoaW5mby0+Y2ZnLmF2ZyAqCisJCQkJCQkgICAgICAgaGluZm8tPmNmZy5idXJzdCk7CisJCWRoLT5yYXRlaW5mby5jb3N0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnKTsKKwl9IGVsc2UgeworCQkvKiB1cGRhdGUgZXhwaXJhdGlvbiB0aW1lb3V0ICovCisJCWRoLT5leHBpcmVzID0gbm93ICsgbXNlY3NfdG9famlmZmllcyhoaW5mby0+Y2ZnLmV4cGlyZSk7CisJCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93KTsKKwl9CisKKwlpZiAoZGgtPnJhdGVpbmZvLmNyZWRpdCA+PSBkaC0+cmF0ZWluZm8uY29zdCkgeworCQkvKiBXZSdyZSB1bmRlcmxpbWl0LiAqLworCQlkaC0+cmF0ZWluZm8uY3JlZGl0IC09IGRoLT5yYXRlaW5mby5jb3N0OworCQlzcGluX3VubG9ja19iaCgmaGluZm8tPmxvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKyAgICAgICAJc3Bpbl91bmxvY2tfYmgoJmhpbmZvLT5sb2NrKTsKKworCS8qIGRlZmF1bHQgY2FzZTogd2UncmUgb3ZlcmxpbWl0LCB0aHVzIGRvbid0IG1hdGNoICovCisJcmV0dXJuIDA7CisKK2hvdGRyb3A6CisJKmhvdGRyb3AgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitoYXNobGltaXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgY29uc3Qgdm9pZCAqaW5mLAorCQkgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCisJCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyID0gbWF0Y2hpbmZvOworCisJLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLworCWlmIChyLT5jZmcuYnVyc3QgPT0gMCB8fAorCSAgICB1c2VyMmNyZWRpdHMoci0+Y2ZnLmF2ZyAqIHItPmNmZy5idXJzdCkgPCB1c2VyMmNyZWRpdHMoci0+Y2ZnLmF2ZykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4dF9oYXNobGltaXQ6IG92ZXJmbG93LCB0cnkgbG93ZXI6ICV1LyV1XG4iLAorCQkgICAgICAgci0+Y2ZnLmF2Zywgci0+Y2ZnLmJ1cnN0KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyLT5jZmcubW9kZSA9PSAwIHx8CisJICAgIHItPmNmZy5tb2RlID4gKFhUX0hBU0hMSU1JVF9IQVNIX0RQVCB8CisJCQkgICBYVF9IQVNITElNSVRfSEFTSF9ESVAgfAorCQkJICAgWFRfSEFTSExJTUlUX0hBU0hfU0lQIHwKKwkJCSAgIFhUX0hBU0hMSU1JVF9IQVNIX1NQVCkpCisJCXJldHVybiAwOworCWlmICghci0+Y2ZnLmdjX2ludGVydmFsKQorCQlyZXR1cm4gMDsKKwlpZiAoIXItPmNmZy5leHBpcmUpCisJCXJldHVybiAwOworCWlmIChyLT5uYW1lW3NpemVvZihyLT5uYW1lKSAtIDFdICE9ICdcMCcpCisJCXJldHVybiAwOworCisJLyogVGhpcyBpcyB0aGUgYmVzdCB3ZSd2ZSBnb3Q6IFdlIGNhbm5vdCByZWxlYXNlIGFuZCByZS1ncmFiIGxvY2ssCisJICogc2luY2UgY2hlY2tlbnRyeSgpIGlzIGNhbGxlZCBiZWZvcmUgeF90YWJsZXMuYyBncmFicyB4dF9tdXRleC4KKwkgKiBXZSBhbHNvIGNhbm5vdCBncmFiIHRoZSBoYXNodGFibGUgc3BpbmxvY2ssIHNpbmNlIGh0YWJsZV9jcmVhdGUgd2lsbAorCSAqIGNhbGwgdm1hbGxvYywgYW5kIHRoYXQgY2FuIHNsZWVwLiAgQW5kIHdlIGNhbm5vdCBqdXN0IHJlLXNlYXJjaAorCSAqIHRoZSBsaXN0IG9mIGh0YWJsZSdzIGluIGh0YWJsZV9jcmVhdGUoKSwgc2luY2UgdGhlbiB3ZSB3b3VsZAorCSAqIGNyZWF0ZSBkdXBsaWNhdGUgcHJvYyBmaWxlcy4gLUhXICovCisJbXV0ZXhfbG9jaygmaGxpbWl0X211dGV4KTsKKwlyLT5oaW5mbyA9IGh0YWJsZV9maW5kX2dldChyLT5uYW1lLCBtYXRjaC0+ZmFtaWx5KTsKKwlpZiAoIXItPmhpbmZvICYmIGh0YWJsZV9jcmVhdGUociwgbWF0Y2gtPmZhbWlseSkgIT0gMCkgeworCQltdXRleF91bmxvY2soJmhsaW1pdF9tdXRleCk7CisJCXJldHVybiAwOworCX0KKwltdXRleF91bmxvY2soJmhsaW1pdF9tdXRleCk7CisKKwkvKiBVZ2x5IGhhY2s6IEZvciBTTVAsIHdlIG9ubHkgd2FudCB0byB1c2Ugb25lIHNldCAqLworCXItPnUubWFzdGVyID0gcjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2hhc2hsaW1pdF9kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbykKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKnIgPSBtYXRjaGluZm87CisKKwlodGFibGVfcHV0KHItPmhpbmZvKTsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfeHRfaGFzaGxpbWl0X2luZm8geworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IGhhc2hsaW1pdF9jZmcgY2ZnOworCWNvbXBhdF91cHRyX3QgaGluZm87CisJY29tcGF0X3VwdHJfdCBtYXN0ZXI7Cit9OworCitzdGF0aWMgdm9pZCBjb21wYXRfZnJvbV91c2VyKHZvaWQgKmRzdCwgdm9pZCAqc3JjKQoreworCWludCBvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X3h0X2hhc2hsaW1pdF9pbmZvLCBoaW5mbyk7CisKKwltZW1jcHkoZHN0LCBzcmMsIG9mZik7CisJbWVtc2V0KGRzdCArIG9mZiwgMCwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfeHRfaGFzaGxpbWl0X2luZm8pIC0gb2ZmKTsKK30KKworc3RhdGljIGludCBjb21wYXRfdG9fdXNlcih2b2lkIF9fdXNlciAqZHN0LCB2b2lkICpzcmMpCit7CisJaW50IG9mZiA9IG9mZnNldG9mKHN0cnVjdCBjb21wYXRfeHRfaGFzaGxpbWl0X2luZm8sIGhpbmZvKTsKKworCXJldHVybiBjb3B5X3RvX3VzZXIoZHN0LCBzcmMsIG9mZikgPyAtRUZBVUxUIDogMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHh0X2hhc2hsaW1pdFtdID0geworCXsKKwkJLm5hbWUJCT0gImhhc2hsaW1pdCIsCisJCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLm1hdGNoCQk9IGhhc2hsaW1pdF9tYXRjaCwKKwkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8pLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkJLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF94dF9oYXNobGltaXRfaW5mbyksCisJCS5jb21wYXRfZnJvbV91c2VyID0gY29tcGF0X2Zyb21fdXNlciwKKwkJLmNvbXBhdF90b191c2VyCT0gY29tcGF0X3RvX3VzZXIsCisjZW5kaWYKKwkJLmNoZWNrZW50cnkJPSBoYXNobGltaXRfY2hlY2tlbnRyeSwKKwkJLmRlc3Ryb3kJPSBoYXNobGltaXRfZGVzdHJveSwKKwkJLm1lCQk9IFRISVNfTU9EVUxFCisJfSwKKwl7CisJCS5uYW1lCQk9ICJoYXNobGltaXQiLAorCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkubWF0Y2gJCT0gaGFzaGxpbWl0X21hdGNoLAorCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyksCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQkuY29tcGF0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgY29tcGF0X3h0X2hhc2hsaW1pdF9pbmZvKSwKKwkJLmNvbXBhdF9mcm9tX3VzZXIgPSBjb21wYXRfZnJvbV91c2VyLAorCQkuY29tcGF0X3RvX3VzZXIJPSBjb21wYXRfdG9fdXNlciwKKyNlbmRpZgorCQkuY2hlY2tlbnRyeQk9IGhhc2hsaW1pdF9jaGVja2VudHJ5LAorCQkuZGVzdHJveQk9IGhhc2hsaW1pdF9kZXN0cm95LAorCQkubWUJCT0gVEhJU19NT0RVTEUKKwl9LAorfTsKKworLyogUFJPQyBzdHVmZiAqLworc3RhdGljIHZvaWQgKmRsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcGRlLT5kYXRhOworCXVuc2lnbmVkIGludCAqYnVja2V0OworCisJc3Bpbl9sb2NrX2JoKCZodGFibGUtPmxvY2spOworCWlmICgqcG9zID49IGh0YWJsZS0+Y2ZnLnNpemUpCisJCXJldHVybiBOVUxMOworCisJYnVja2V0ID0ga21hbGxvYyhzaXplb2YodW5zaWduZWQgaW50KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWNrZXQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJKmJ1Y2tldCA9ICpwb3M7CisJcmV0dXJuIGJ1Y2tldDsKK30KKworc3RhdGljIHZvaWQgKmRsX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzLT5wcml2YXRlOworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodGFibGUgPSBwZGUtPmRhdGE7CisJdW5zaWduZWQgaW50ICpidWNrZXQgPSAodW5zaWduZWQgaW50ICopdjsKKworCSpwb3MgPSArKygqYnVja2V0KTsKKwlpZiAoKnBvcyA+PSBodGFibGUtPmNmZy5zaXplKSB7CisJCWtmcmVlKHYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGJ1Y2tldDsKK30KKworc3RhdGljIHZvaWQgZGxfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcGRlLT5kYXRhOworCXVuc2lnbmVkIGludCAqYnVja2V0ID0gKHVuc2lnbmVkIGludCAqKXY7CisKKwlrZnJlZShidWNrZXQpOworCXNwaW5fdW5sb2NrX2JoKCZodGFibGUtPmxvY2spOworfQorCitzdGF0aWMgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIGludCBmYW1pbHksCisJCQkJICAgc3RydWN0IHNlcV9maWxlICpzKQoreworCS8qIHJlY2FsY3VsYXRlIHRvIHNob3cgYWNjdXJhdGUgbnVtYmVycyAqLworCXJhdGVpbmZvX3JlY2FsYyhlbnQsIGppZmZpZXMpOworCisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBzZXFfcHJpbnRmKHMsICIlbGQgJXUuJXUuJXUuJXU6JXUtPiIKKwkJCQkgICAgICIldS4ldS4ldS4ldToldSAldSAldSAldVxuIiwKKwkJCQkgKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAorCQkJCSBOSVBRVUFEKGVudC0+ZHN0LmFkZHIuaXAuc3JjKSwKKwkJCQkgbnRvaHMoZW50LT5kc3Quc3JjX3BvcnQpLAorCQkJCSBOSVBRVUFEKGVudC0+ZHN0LmFkZHIuaXAuZHN0KSwKKwkJCQkgbnRvaHMoZW50LT5kc3QuZHN0X3BvcnQpLAorCQkJCSBlbnQtPnJhdGVpbmZvLmNyZWRpdCwgZW50LT5yYXRlaW5mby5jcmVkaXRfY2FwLAorCQkJCSBlbnQtPnJhdGVpbmZvLmNvc3QpOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBzZXFfcHJpbnRmKHMsICIlbGQgIiBOSVA2X0ZNVCAiOiV1LT4iCisJCQkJICAgICBOSVA2X0ZNVCAiOiV1ICV1ICV1ICV1XG4iLAorCQkJCSAobG9uZykoZW50LT5leHBpcmVzIC0gamlmZmllcykvSFosCisJCQkJIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKikmZW50LT5kc3QuYWRkci5pcDYuc3JjKSwKKwkJCQkgbnRvaHMoZW50LT5kc3Quc3JjX3BvcnQpLAorCQkJCSBOSVA2KCooc3RydWN0IGluNl9hZGRyICopJmVudC0+ZHN0LmFkZHIuaXA2LmRzdCksCisJCQkJIG50b2hzKGVudC0+ZHN0LmRzdF9wb3J0KSwKKwkJCQkgZW50LT5yYXRlaW5mby5jcmVkaXQsIGVudC0+cmF0ZWluZm8uY3JlZGl0X2NhcCwKKwkJCQkgZW50LT5yYXRlaW5mby5jb3N0KTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGRsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHMtPnByaXZhdGU7CisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmh0YWJsZSA9IHBkZS0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgKmJ1Y2tldCA9ICh1bnNpZ25lZCBpbnQgKil2OworCXN0cnVjdCBkc3RoYXNoX2VudCAqZW50OworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlpZiAoIWhsaXN0X2VtcHR5KCZodGFibGUtPmhhc2hbKmJ1Y2tldF0pKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudCwgcG9zLCAmaHRhYmxlLT5oYXNoWypidWNrZXRdLCBub2RlKQorCQkJaWYgKGRsX3NlcV9yZWFsX3Nob3coZW50LCBodGFibGUtPmZhbWlseSwgcykpCisJCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRsX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGxfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGRsX3NlcV9uZXh0LAorCS5zdG9wICA9IGRsX3NlcV9zdG9wLAorCS5zaG93ICA9IGRsX3NlcV9zaG93Cit9OworCitzdGF0aWMgaW50IGRsX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc2YtPnByaXZhdGUgPSBQREUoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQorfTsKKworc3RhdGljIGludCBfX2luaXQgeHRfaGFzaGxpbWl0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0geHRfcmVnaXN0ZXJfbWF0Y2hlcyh4dF9oYXNobGltaXQsIEFSUkFZX1NJWkUoeHRfaGFzaGxpbWl0KSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMTsKKworCWVyciA9IC1FTk9NRU07CisJaGFzaGxpbWl0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ4dF9oYXNobGltaXQiLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkc3RoYXNoX2VudCksIDAsIDAsCisJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIWhhc2hsaW1pdF9jYWNoZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4dF9oYXNobGltaXQ6IHVuYWJsZSB0byBjcmVhdGUgc2xhYiBjYWNoZVxuIik7CisJCWdvdG8gZXJyMjsKKwl9CisJaGFzaGxpbWl0X3Byb2NkaXI0ID0gcHJvY19ta2RpcigiaXB0X2hhc2hsaW1pdCIsIHByb2NfbmV0KTsKKwlpZiAoIWhhc2hsaW1pdF9wcm9jZGlyNCkgeworCQlwcmludGsoS0VSTl9FUlIgInh0X2hhc2hsaW1pdDogdW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiCisJCQkJImVudHJ5XG4iKTsKKwkJZ290byBlcnIzOworCX0KKwloYXNobGltaXRfcHJvY2RpcjYgPSBwcm9jX21rZGlyKCJpcDZ0X2hhc2hsaW1pdCIsIHByb2NfbmV0KTsKKwlpZiAoIWhhc2hsaW1pdF9wcm9jZGlyNikgeworCQlwcmludGsoS0VSTl9FUlIgInh0X2hhc2hsaW1pdDogdG5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiCisJCQkJImVudHJ5XG4iKTsKKwkJZ290byBlcnI0OworCX0KKwlyZXR1cm4gMDsKK2VycjQ6CisJcmVtb3ZlX3Byb2NfZW50cnkoImlwdF9oYXNobGltaXQiLCBwcm9jX25ldCk7CitlcnIzOgorCWttZW1fY2FjaGVfZGVzdHJveShoYXNobGltaXRfY2FjaGVwKTsKK2VycjI6CisJeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKHh0X2hhc2hsaW1pdCwgQVJSQVlfU0laRSh4dF9oYXNobGltaXQpKTsKK2VycjE6CisJcmV0dXJuIGVycjsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeHRfaGFzaGxpbWl0X2Zpbmkodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiaXB0X2hhc2hsaW1pdCIsIHByb2NfbmV0KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiaXA2dF9oYXNobGltaXQiLCBwcm9jX25ldCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGhhc2hsaW1pdF9jYWNoZXApOworCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyh4dF9oYXNobGltaXQsIEFSUkFZX1NJWkUoeHRfaGFzaGxpbWl0KSk7Cit9CisKK21vZHVsZV9pbml0KHh0X2hhc2hsaW1pdF9pbml0KTsKK21vZHVsZV9leGl0KHh0X2hhc2hsaW1pdF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKaW5kZXggOTM0ZGRkZi4uZGZhMWVlNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKQEAgLTMxLDcgKzMxLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgeHRfbWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCi0JcmV0dXJuICgoc2tiLT5uZm1hcmsgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKKwlyZXR1cm4gKChza2ItPm1hcmsgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9tdWx0aXBvcnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0LmMKaW5kZXggZDNhZWZkMy4uMTYwMjA4NiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9tdWx0aXBvcnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5jCkBAIC0xLDUgKzEsNSBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBvbmUgb2YgYSBsaXN0IG9mIFRDUC9VRFAvU0NUUC9EQ0NQIHBvcnRzOiBwb3J0cyBhcmUgaW4KLSAgIHRoZSBzYW1lIHBsYWNlIHNvIHdlIGNhbiB0cmVhdCB0aGVtIGFzIGVxdWFsLiAqLworLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBvbmUgb2YgYSBsaXN0IG9mIFRDUC9VRFAoLUxpdGUpL1NDVFAvRENDUCBwb3J0czoKKyAgIHBvcnRzIGFyZSBpbiB0aGUgc2FtZSBwbGFjZSBzbyB3ZSBjYW4gdHJlYXQgdGhlbSBhcyBlcXVhbC4gKi8KIAogLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAogICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQl1MTYgX3BvcnRzWzJdLCAqcHB0cjsKKwlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKIAljb25zdCBzdHJ1Y3QgeHRfbXVsdGlwb3J0ICptdWx0aWluZm8gPSBtYXRjaGluZm87CiAKIAlpZiAob2Zmc2V0KQpAQCAtMTM1LDcgKzEzNSw3IEBACiAJIHVuc2lnbmVkIGludCBwcm90b2ZmLAogCSBpbnQgKmhvdGRyb3ApCiB7Ci0JdTE2IF9wb3J0c1syXSwgKnBwdHI7CisJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CiAJY29uc3Qgc3RydWN0IHh0X211bHRpcG9ydF92MSAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOwogCiAJaWYgKG9mZnNldCkKQEAgLTE2Miw2ICsxNjIsNyBAQAogewogCS8qIE11c3Qgc3BlY2lmeSBzdXBwb3J0ZWQgcHJvdG9jb2wsIG5vIHVua25vd24gZmxhZ3Mgb3IgYmFkIGNvdW50ICovCiAJcmV0dXJuIChwcm90byA9PSBJUFBST1RPX1RDUCB8fCBwcm90byA9PSBJUFBST1RPX1VEUAorCQl8fCBwcm90byA9PSBJUFBST1RPX1VEUExJVEUKIAkJfHwgcHJvdG8gPT0gSVBQUk9UT19TQ1RQIHx8IHByb3RvID09IElQUFJPVE9fRENDUCkKIAkJJiYgIShpcF9pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKIAkJJiYgKG1hdGNoX2ZsYWdzID09IFhUX01VTFRJUE9SVF9TT1VSQ0UKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKaW5kZXggNzk1NmFjYS4uNzFiZjAzNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJZHVwcmludGYoIkNodW5rIG51bTogJWRcdG9mZnNldDogJWRcdHR5cGU6ICVkXHRsZW5ndGg6ICVkXHRmbGFnczogJXhcbiIsIAogCQkJCSsraSwgb2Zmc2V0LCBzY2gtPnR5cGUsIGh0b25zKHNjaC0+bGVuZ3RoKSwgc2NoLT5mbGFncyk7CiAKLQkJb2Zmc2V0ICs9IChodG9ucyhzY2gtPmxlbmd0aCkgKyAzKSAmIH4zOworCQlvZmZzZXQgKz0gKG50b2hzKHNjaC0+bGVuZ3RoKSArIDMpICYgfjM7CiAKIAkJZHVwcmludGYoInNrYi0+bGVuOiAlZFx0b2Zmc2V0OiAlZFxuIiwgc2tiLT5sZW4sIG9mZnNldCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5jCmluZGV4IGU3NmE2OGUuLjQ2NDE0YjUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJ4X3RhYmxlcyBtYXRjaCBmb3IgVENQIGFuZCBVRFAsIHN1cHBvcnRzIElQdjQgYW5kIElQdjYiKTsKK01PRFVMRV9ERVNDUklQVElPTigieF90YWJsZXMgbWF0Y2ggZm9yIFRDUCBhbmQgVURQKC1MaXRlKSwgc3VwcG9ydHMgSVB2NCBhbmQgSVB2NiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJ4dF90Y3AiKTsKIE1PRFVMRV9BTElBUygieHRfdWRwIik7CkBAIC0yMzQsNiArMjM0LDI0IEBACiAJCS5wcm90bwkJPSBJUFBST1RPX1VEUCwKIAkJLm1lCQk9IFRISVNfTU9EVUxFLAogCX0sCisJeworCQkubmFtZQkJPSAidWRwbGl0ZSIsCisJCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLmNoZWNrZW50cnkJPSB1ZHBfY2hlY2tlbnRyeSwKKwkJLm1hdGNoCQk9IHVkcF9tYXRjaCwKKwkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdWRwKSwKKwkJLnByb3RvCQk9IElQUFJPVE9fVURQTElURSwKKwkJLm1lCQk9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZQkJPSAidWRwbGl0ZSIsCisJCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5jaGVja2VudHJ5CT0gdWRwX2NoZWNrZW50cnksCisJCS5tYXRjaAkJPSB1ZHBfbWF0Y2gsCisJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3VkcCksCisJCS5wcm90bwkJPSBJUFBST1RPX1VEUExJVEUsCisJCS5tZQkJPSBUSElTX01PRFVMRSwKKwl9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgeHRfdGNwdWRwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKaW5kZXggYTZjZTFkNi4uNzQzYjA1NyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKQEAgLTQwNywxMiArNDA3LDE0IEBACiAKIAlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0FERCwKIAkJCQkJICAgICAgJmF1ZGl0X2luZm8pOwotCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAotCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKLQkJCSBkb2ksCi0JCQkgdHlwZV9zdHIsCi0JCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKKwkJCQkgZG9pLAorCQkJCSB0eXBlX3N0ciwKKwkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQogCiAJcmV0dXJuIHJldF92YWw7CiB9CkBAIC00NTIsMTcgKzQ1NCwxMyBAQAogCX0KIAogbGlzdF9zdGFydDoKLQlhbnNfc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFICogbmxzemVfbXVsdCwgR0ZQX0tFUk5FTCk7CisJYW5zX3NrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUgKiBubHN6ZV9tdWx0LCBHRlBfS0VSTkVMKTsKIAlpZiAoYW5zX3NrYiA9PSBOVUxMKSB7CiAJCXJldF92YWwgPSAtRU5PTUVNOwogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIAl9Ci0JZGF0YSA9IG5ldGxibF9uZXRsaW5rX2hkcl9wdXQoYW5zX3NrYiwKLQkJCQkgICAgICBpbmZvLT5zbmRfcGlkLAotCQkJCSAgICAgIGluZm8tPnNuZF9zZXEsCi0JCQkJICAgICAgbmV0bGJsX2NpcHNvdjRfZ25sX2ZhbWlseS5pZCwKLQkJCQkgICAgICAwLAotCQkJCSAgICAgIE5MQkxfQ0lQU09WNF9DX0xJU1QpOworCWRhdGEgPSBnZW5sbXNnX3B1dF9yZXBseShhbnNfc2tiLCBpbmZvLCAmbmV0bGJsX2NpcHNvdjRfZ25sX2ZhbWlseSwKKwkJCQkgMCwgTkxCTF9DSVBTT1Y0X0NfTElTVCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkgewogCQlyZXRfdmFsID0gLUVOT01FTTsKIAkJZ290byBsaXN0X2ZhaWx1cmU7CkBAIC01NjgsNyArNTY2LDcgQEAKIAogCWdlbmxtc2dfZW5kKGFuc19za2IsIGRhdGEpOwogCi0JcmV0X3ZhbCA9IGdlbmxtc2dfdW5pY2FzdChhbnNfc2tiLCBpbmZvLT5zbmRfcGlkKTsKKwlyZXRfdmFsID0gZ2VubG1zZ19yZXBseShhbnNfc2tiLCBpbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIApAQCAtNjA3LDEyICs2MDUsOSBAQAogCXN0cnVjdCBuZXRsYmxfY2lwc292NF9kb2l3YWxrX2FyZyAqY2JfYXJnID0gYXJnOwogCXZvaWQgKmRhdGE7CiAKLQlkYXRhID0gbmV0bGJsX25ldGxpbmtfaGRyX3B1dChjYl9hcmctPnNrYiwKLQkJCQkgICAgICBORVRMSU5LX0NCKGNiX2FyZy0+bmxfY2ItPnNrYikucGlkLAotCQkJCSAgICAgIGNiX2FyZy0+c2VxLAotCQkJCSAgICAgIG5ldGxibF9jaXBzb3Y0X2dubF9mYW1pbHkuaWQsCi0JCQkJICAgICAgTkxNX0ZfTVVMVEksCi0JCQkJICAgICAgTkxCTF9DSVBTT1Y0X0NfTElTVEFMTCk7CisJZGF0YSA9IGdlbmxtc2dfcHV0KGNiX2FyZy0+c2tiLCBORVRMSU5LX0NCKGNiX2FyZy0+bmxfY2ItPnNrYikucGlkLAorCQkJICAgY2JfYXJnLT5zZXEsICZuZXRsYmxfY2lwc292NF9nbmxfZmFtaWx5LAorCQkJICAgTkxNX0ZfTVVMVEksIE5MQkxfQ0lQU09WNF9DX0xJU1RBTEwpOwogCWlmIChkYXRhID09IE5VTEwpCiAJCWdvdG8gbGlzdGFsbF9jYl9mYWlsdXJlOwogCkBAIC02ODcsMTEgKzY4MiwxMyBAQAogCiAJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9ERUwsCiAJCQkJCSAgICAgICZhdWRpdF9pbmZvKTsKLQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKLQkJCSAiIGNpcHNvX2RvaT0ldSByZXM9JXUiLAotCQkJIGRvaSwKLQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JYXVkaXRfbG9nX2VuZChhdWRpdF9idWYpOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkgIiBjaXBzb19kb2k9JXUgcmVzPSV1IiwKKwkJCQkgZG9pLAorCQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwl9CiAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCmluZGV4IGFmNDM3MWQuLmY0NmEwYWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtMjAyLDcgKzIwMiw2IEBACiAJaW50IHJldF92YWw7CiAJdTMyIGJrdDsKIAlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7Ci0JY2hhciAqYXVkaXRfZG9tYWluOwogCiAJc3dpdGNoIChlbnRyeS0+dHlwZSkgewogCWNhc2UgTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQ6CkBAIC0yNDMsMjQgKzI0MiwyNCBAQAogCX0gZWxzZQogCQlyZXRfdmFsID0gLUVJTlZBTDsKIAotCWlmIChlbnRyeS0+ZG9tYWluICE9IE5VTEwpCi0JCWF1ZGl0X2RvbWFpbiA9IGVudHJ5LT5kb21haW47Ci0JZWxzZQotCQlhdWRpdF9kb21haW4gPSAiKGRlZmF1bHQpIjsKIAlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19NQVBfQURELCBhdWRpdF9pbmZvKTsKLQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBubGJsX2RvbWFpbj0lcyIsIGF1ZGl0X2RvbWFpbik7Ci0Jc3dpdGNoIChlbnRyeS0+dHlwZSkgewotCWNhc2UgTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQ6Ci0JCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIG5sYmxfcHJvdG9jb2w9dW5sYmwiKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ6CisJaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7CiAJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAotCQkJCSAiIG5sYmxfcHJvdG9jb2w9Y2lwc292NCBjaXBzb19kb2k9JXUiLAotCQkJCSBlbnRyeS0+dHlwZV9kZWYuY2lwc292NC0+ZG9pKTsKLQkJYnJlYWs7CisJCQkJICIgbmxibF9kb21haW49JXMiLAorCQkJCSBlbnRyeS0+ZG9tYWluID8gZW50cnktPmRvbWFpbiA6ICIoZGVmYXVsdCkiKTsKKwkJc3dpdGNoIChlbnRyeS0+dHlwZSkgeworCQljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgorCQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgbmxibF9wcm90b2NvbD11bmxibCIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgorCQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJCSAiIG5sYmxfcHJvdG9jb2w9Y2lwc292NCBjaXBzb19kb2k9JXUiLAorCQkJCQkgZW50cnktPnR5cGVfZGVmLmNpcHNvdjQtPmRvaSk7CisJCQlicmVhazsKKwkJfQorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiByZXM9JXUiLCByZXRfdmFsID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKIAl9Ci0JYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgcmVzPSV1IiwgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKIAogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0zMTAsNyArMzA5LDYgQEAKIAlpbnQgcmV0X3ZhbCA9IC1FTk9FTlQ7CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeTsKIAlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7Ci0JY2hhciAqYXVkaXRfZG9tYWluOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChkb21haW4gIT0gTlVMTCkKQEAgLTM0OCwxNiArMzQ2LDE0IEBACiAJCXNwaW5fdW5sb2NrKCZuZXRsYmxfZG9taHNoX2RlZl9sb2NrKTsKIAl9CiAKLQlpZiAoZW50cnktPmRvbWFpbiAhPSBOVUxMKQotCQlhdWRpdF9kb21haW4gPSBlbnRyeS0+ZG9tYWluOwotCWVsc2UKLQkJYXVkaXRfZG9tYWluID0gIihkZWZhdWx0KSI7CiAJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfTUFQX0RFTCwgYXVkaXRfaW5mbyk7Ci0JYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCi0JCQkgIiBubGJsX2RvbWFpbj0lcyByZXM9JXUiLAotCQkJIGF1ZGl0X2RvbWFpbiwKLQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JYXVkaXRfbG9nX2VuZChhdWRpdF9idWYpOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkgIiBubGJsX2RvbWFpbj0lcyByZXM9JXUiLAorCQkJCSBlbnRyeS0+ZG9tYWluID8gZW50cnktPmRvbWFpbiA6ICIoZGVmYXVsdCkiLAorCQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwl9CiAKIAlpZiAocmV0X3ZhbCA9PSAwKQogCQljYWxsX3JjdSgmZW50cnktPnJjdSwgbmV0bGJsX2RvbWhzaF9mcmVlX2VudHJ5KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCmluZGV4IGZmOTcxMTAuLmUwM2EzMjggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYwpAQCAtNDAsNiArNDAsMjA3IEBACiAjaW5jbHVkZSAibmV0bGFiZWxfdXNlci5oIgogCiAvKgorICogU2VjdXJpdHkgQXR0cmlidXRlIEZ1bmN0aW9ucworICovCisKKy8qKgorICogbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGsgLSBXYWxrIGEgTFNNIHNlY2F0dHIgY2F0bWFwIGxvb2tpbmcgZm9yIGEgYml0CisgKiBAY2F0bWFwOiB0aGUgY2F0ZWdvcnkgYml0bWFwCisgKiBAb2Zmc2V0OiB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBhdCwgaW4gYml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3YWxrcyBhIExTTSBzZWNhdHRyIGNhdGVnb3J5IGJpdG1hcCBzdGFydGluZyBhdCBAb2Zmc2V0IGFuZAorICogcmV0dXJucyB0aGUgc3BvdCBvZiB0aGUgZmlyc3Qgc2V0IGJpdCBvciAtRU5PRU5UIGlmIG5vIGJpdHMgYXJlIHNldC4KKyAqCisgKi8KK2ludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJICAgICAgIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKml0ZXIgPSBjYXRtYXA7CisJdTMyIG5vZGVfaWR4OworCXUzMiBub2RlX2JpdDsKKwlORVRMQkxfQ0FUTUFQX01BUFRZUEUgYml0bWFwOworCisJaWYgKG9mZnNldCA+IGl0ZXItPnN0YXJ0Yml0KSB7CisJCXdoaWxlIChvZmZzZXQgPj0gKGl0ZXItPnN0YXJ0Yml0ICsgTkVUTEJMX0NBVE1BUF9TSVpFKSkgeworCQkJaXRlciA9IGl0ZXItPm5leHQ7CisJCQlpZiAoaXRlciA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCW5vZGVfaWR4ID0gKG9mZnNldCAtIGl0ZXItPnN0YXJ0Yml0KSAvIE5FVExCTF9DQVRNQVBfTUFQU0laRTsKKwkJbm9kZV9iaXQgPSBvZmZzZXQgLSBpdGVyLT5zdGFydGJpdCAtCisJCQkgICAoTkVUTEJMX0NBVE1BUF9NQVBTSVpFICogbm9kZV9pZHgpOworCX0gZWxzZSB7CisJCW5vZGVfaWR4ID0gMDsKKwkJbm9kZV9iaXQgPSAwOworCX0KKwliaXRtYXAgPSBpdGVyLT5iaXRtYXBbbm9kZV9pZHhdID4+IG5vZGVfYml0OworCisJZm9yICg7OykgeworCQlpZiAoYml0bWFwICE9IDApIHsKKwkJCXdoaWxlICgoYml0bWFwICYgTkVUTEJMX0NBVE1BUF9CSVQpID09IDApIHsKKwkJCQliaXRtYXAgPj49IDE7CisJCQkJbm9kZV9iaXQrKzsKKwkJCX0KKwkJCXJldHVybiBpdGVyLT5zdGFydGJpdCArCisJCQkJKE5FVExCTF9DQVRNQVBfTUFQU0laRSAqIG5vZGVfaWR4KSArIG5vZGVfYml0OworCQl9CisJCWlmICgrK25vZGVfaWR4ID49IE5FVExCTF9DQVRNQVBfTUFQQ05UKSB7CisJCQlpZiAoaXRlci0+bmV4dCAhPSBOVUxMKSB7CisJCQkJaXRlciA9IGl0ZXItPm5leHQ7CisJCQkJbm9kZV9pZHggPSAwOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJYml0bWFwID0gaXRlci0+Yml0bWFwW25vZGVfaWR4XTsKKwkJbm9kZV9iaXQgPSAwOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrX3JuZyAtIEZpbmQgdGhlIGVuZCBvZiBhIHN0cmluZyBvZiBzZXQgYml0cworICogQGNhdG1hcDogdGhlIGNhdGVnb3J5IGJpdG1hcAorICogQG9mZnNldDogdGhlIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgYXQsIGluIGJpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgYSBMU00gc2VjYXR0ciBjYXRlZ29yeSBiaXRtYXAgc3RhcnRpbmcgYXQgQG9mZnNldCBhbmQKKyAqIHJldHVybnMgdGhlIHNwb3Qgb2YgdGhlIGZpcnN0IGNsZWFyZWQgYml0IG9yIC1FTk9FTlQgaWYgdGhlIG9mZnNldCBpcyBwYXN0CisgKiB0aGUgZW5kIG9mIHRoZSBiaXRtYXAuCisgKgorICovCitpbnQgbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGtfcm5nKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXAsCisJCQkJICAgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqaXRlciA9IGNhdG1hcDsKKwl1MzIgbm9kZV9pZHg7CisJdTMyIG5vZGVfYml0OworCU5FVExCTF9DQVRNQVBfTUFQVFlQRSBiaXRtYXNrOworCU5FVExCTF9DQVRNQVBfTUFQVFlQRSBiaXRtYXA7CisKKwlpZiAob2Zmc2V0ID4gaXRlci0+c3RhcnRiaXQpIHsKKwkJd2hpbGUgKG9mZnNldCA+PSAoaXRlci0+c3RhcnRiaXQgKyBORVRMQkxfQ0FUTUFQX1NJWkUpKSB7CisJCQlpdGVyID0gaXRlci0+bmV4dDsKKwkJCWlmIChpdGVyID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJbm9kZV9pZHggPSAob2Zmc2V0IC0gaXRlci0+c3RhcnRiaXQpIC8gTkVUTEJMX0NBVE1BUF9NQVBTSVpFOworCQlub2RlX2JpdCA9IG9mZnNldCAtIGl0ZXItPnN0YXJ0Yml0IC0KKwkJCSAgIChORVRMQkxfQ0FUTUFQX01BUFNJWkUgKiBub2RlX2lkeCk7CisJfSBlbHNlIHsKKwkJbm9kZV9pZHggPSAwOworCQlub2RlX2JpdCA9IDA7CisJfQorCWJpdG1hc2sgPSBORVRMQkxfQ0FUTUFQX0JJVCA8PCBub2RlX2JpdDsKKworCWZvciAoOzspIHsKKwkJYml0bWFwID0gaXRlci0+Yml0bWFwW25vZGVfaWR4XTsKKwkJd2hpbGUgKGJpdG1hc2sgIT0gMCAmJiAoYml0bWFwICYgYml0bWFzaykgIT0gMCkgeworCQkJYml0bWFzayA8PD0gMTsKKwkJCW5vZGVfYml0Kys7CisJCX0KKworCQlpZiAoYml0bWFzayAhPSAwKQorCQkJcmV0dXJuIGl0ZXItPnN0YXJ0Yml0ICsKKwkJCQkoTkVUTEJMX0NBVE1BUF9NQVBTSVpFICogbm9kZV9pZHgpICsKKwkJCQlub2RlX2JpdCAtIDE7CisJCWVsc2UgaWYgKCsrbm9kZV9pZHggPj0gTkVUTEJMX0NBVE1BUF9NQVBDTlQpIHsKKwkJCWlmIChpdGVyLT5uZXh0ID09IE5VTEwpCisJCQkJcmV0dXJuIGl0ZXItPnN0YXJ0Yml0ICsJTkVUTEJMX0NBVE1BUF9TSVpFIC0gMTsKKwkJCWl0ZXIgPSBpdGVyLT5uZXh0OworCQkJbm9kZV9pZHggPSAwOworCQl9CisJCWJpdG1hc2sgPSBORVRMQkxfQ0FUTUFQX0JJVDsKKwkJbm9kZV9iaXQgPSAwOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKKyAqIG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRiaXQgLSBTZXQgYSBiaXQgaW4gYSBMU00gc2VjYXR0ciBjYXRtYXAKKyAqIEBjYXRtYXA6IHRoZSBjYXRlZ29yeSBiaXRtYXAKKyAqIEBiaXQ6IHRoZSBiaXQgdG8gc2V0CisgKiBAZmxhZ3M6IG1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246CisgKiBTZXQgdGhlIGJpdCBzcGVjaWZpZWQgYnkgQGJpdCBpbiBAY2F0bWFwLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsCisgKiBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfc2V0Yml0KHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXAsCisJCQkJIHUzMiBiaXQsCisJCQkJIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICppdGVyID0gY2F0bWFwOworCXUzMiBub2RlX2JpdDsKKwl1MzIgbm9kZV9pZHg7CisKKwl3aGlsZSAoaXRlci0+bmV4dCAhPSBOVUxMICYmCisJICAgICAgIGJpdCA+PSAoaXRlci0+c3RhcnRiaXQgKyBORVRMQkxfQ0FUTUFQX1NJWkUpKQorCQlpdGVyID0gaXRlci0+bmV4dDsKKwlpZiAoYml0ID49IChpdGVyLT5zdGFydGJpdCArIE5FVExCTF9DQVRNQVBfU0laRSkpIHsKKwkJaXRlci0+bmV4dCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9hbGxvYyhmbGFncyk7CisJCWlmIChpdGVyLT5uZXh0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaXRlciA9IGl0ZXItPm5leHQ7CisJCWl0ZXItPnN0YXJ0Yml0ID0gYml0ICYgfihORVRMQkxfQ0FUTUFQX1NJWkUgLSAxKTsKKwl9CisKKwkvKiBnY2MgYWx3YXlzIHJvdW5kcyB0byB6ZXJvIHdoZW4gZG9pbmcgaW50ZWdlciBkaXZpc2lvbiAqLworCW5vZGVfaWR4ID0gKGJpdCAtIGl0ZXItPnN0YXJ0Yml0KSAvIE5FVExCTF9DQVRNQVBfTUFQU0laRTsKKwlub2RlX2JpdCA9IGJpdCAtIGl0ZXItPnN0YXJ0Yml0IC0gKE5FVExCTF9DQVRNQVBfTUFQU0laRSAqIG5vZGVfaWR4KTsKKwlpdGVyLT5iaXRtYXBbbm9kZV9pZHhdIHw9IE5FVExCTF9DQVRNQVBfQklUIDw8IG5vZGVfYml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldHJuZyAtIFNldCBhIHJhbmdlIG9mIGJpdHMgaW4gYSBMU00gc2VjYXR0ciBjYXRtYXAKKyAqIEBjYXRtYXA6IHRoZSBjYXRlZ29yeSBiaXRtYXAKKyAqIEBzdGFydDogdGhlIHN0YXJ0aW5nIGJpdAorICogQGVuZDogdGhlIGxhc3QgYml0IGluIHRoZSBzdHJpbmcKKyAqIEBmbGFnczogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNldCBhIHJhbmdlIG9mIGJpdHMsIHN0YXJ0aW5nIGF0IEBzdGFydCBhbmQgZW5kaW5nIHdpdGggQGVuZC4gIFJldHVybnMgemVybworICogb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldHJuZyhzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJCSB1MzIgc3RhcnQsCisJCQkJIHUzMiBlbmQsCisJCQkJIGdmcF90IGZsYWdzKQoreworCWludCByZXRfdmFsID0gMDsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqaXRlciA9IGNhdG1hcDsKKwl1MzIgaXRlcl9tYXhfc3BvdDsKKwl1MzIgc3BvdDsKKworCS8qIFhYWCAtIFRoaXMgY291bGQgcHJvYmFibHkgYmUgbWFkZSBhIGJpdCBmYXN0ZXIgYnkgY29tYmluaW5nIHdyaXRlcworCSAqIHRvIHRoZSBjYXRtYXAgaW5zdGVhZCBvZiBzZXR0aW5nIGEgc2luZ2xlIGJpdCBlYWNoIHRpbWUsIGJ1dCBmb3IKKwkgKiByaWdodCBub3cgc2tpcHBpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBpbiB0aGUgY2F0bWFwIHNob3VsZAorCSAqIGJlIGEgbmljZSBpbXByb3ZlbWVudCBvdmVyIGNhbGxpbmcgdGhlIGluZGl2aWR1YWwgc2V0Yml0IGZ1bmN0aW9uCisJICogcmVwZWF0ZWRseSBmcm9tIGEgbG9vcC4gKi8KKworCXdoaWxlIChpdGVyLT5uZXh0ICE9IE5VTEwgJiYKKwkgICAgICAgc3RhcnQgPj0gKGl0ZXItPnN0YXJ0Yml0ICsgTkVUTEJMX0NBVE1BUF9TSVpFKSkKKwkJaXRlciA9IGl0ZXItPm5leHQ7CisJaXRlcl9tYXhfc3BvdCA9IGl0ZXItPnN0YXJ0Yml0ICsgTkVUTEJMX0NBVE1BUF9TSVpFOworCisJZm9yIChzcG90ID0gc3RhcnQ7IHNwb3QgPD0gZW5kICYmIHJldF92YWwgPT0gMDsgc3BvdCsrKSB7CisJCWlmIChzcG90ID49IGl0ZXJfbWF4X3Nwb3QgJiYgaXRlci0+bmV4dCAhPSBOVUxMKSB7CisJCQlpdGVyID0gaXRlci0+bmV4dDsKKwkJCWl0ZXJfbWF4X3Nwb3QgPSBpdGVyLT5zdGFydGJpdCArIE5FVExCTF9DQVRNQVBfU0laRTsKKwkJfQorCQlyZXRfdmFsID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldGJpdChpdGVyLCBzcG90LCBHRlBfQVRPTUlDKTsKKwl9CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoKICAqIExTTSBGdW5jdGlvbnMKICAqLwogCkBAIC02Miw2ICsyNjMsOSBAQAogCWludCByZXRfdmFsID0gLUVOT0VOVDsKIAlzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmRvbV9lbnRyeTsKIAorCWlmICgoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9ET01BSU4pID09IDApCisJCXJldHVybiAtRU5PRU5UOworCiAJcmN1X3JlYWRfbG9jaygpOwogCWRvbV9lbnRyeSA9IG5ldGxibF9kb21oc2hfZ2V0ZW50cnkoc2VjYXR0ci0+ZG9tYWluKTsKIAlpZiAoZG9tX2VudHJ5ID09IE5VTEwpCkBAIC0xNDYsMTAgKzM1MCw4IEBACiBpbnQgbmV0bGJsX3NrYnVmZl9nZXRhdHRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaW50IHJldF92YWw7Ci0KLQlyZXRfdmFsID0gY2lwc29fdjRfc2tidWZmX2dldGF0dHIoc2tiLCBzZWNhdHRyKTsKLQlpZiAocmV0X3ZhbCA9PSAwKQorCWlmIChDSVBTT19WNF9PUFRFWElTVChza2IpICYmCisJICAgIGNpcHNvX3Y0X3NrYnVmZl9nZXRhdHRyKHNrYiwgc2VjYXR0cikgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gbmV0bGJsX3VubGFiZWxfZ2V0YXR0cihzZWNhdHRyKTsKQEAgLTIwMCw3ICs0MDIsNyBAQAogaW50IG5ldGxibF9jYWNoZV9hZGQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQogewotCWlmIChzZWNhdHRyLT5jYWNoZSA9PSBOVUxMKQorCWlmICgoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9DQUNIRSkgPT0gMCkKIAkJcmV0dXJuIC1FTk9NU0c7CiAKIAlpZiAoQ0lQU09fVjRfT1BURVhJU1Qoc2tiKSkKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jCmluZGV4IDUzYzkwNzlhLi5lOGM4MGYzIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMKQEAgLTE4OCwxMiArMTg4LDkgQEAKIAlzdHJ1Y3QgbmV0bGJsX2RvbWhzaF93YWxrX2FyZyAqY2JfYXJnID0gYXJnOwogCXZvaWQgKmRhdGE7CiAKLQlkYXRhID0gbmV0bGJsX25ldGxpbmtfaGRyX3B1dChjYl9hcmctPnNrYiwKLQkJCQkgICAgICBORVRMSU5LX0NCKGNiX2FyZy0+bmxfY2ItPnNrYikucGlkLAotCQkJCSAgICAgIGNiX2FyZy0+c2VxLAotCQkJCSAgICAgIG5ldGxibF9tZ210X2dubF9mYW1pbHkuaWQsCi0JCQkJICAgICAgTkxNX0ZfTVVMVEksCi0JCQkJICAgICAgTkxCTF9NR01UX0NfTElTVEFMTCk7CisJZGF0YSA9IGdlbmxtc2dfcHV0KGNiX2FyZy0+c2tiLCBORVRMSU5LX0NCKGNiX2FyZy0+bmxfY2ItPnNrYikucGlkLAorCQkJICAgY2JfYXJnLT5zZXEsICZuZXRsYmxfbWdtdF9nbmxfZmFtaWx5LAorCQkJICAgTkxNX0ZfTVVMVEksIE5MQkxfTUdNVF9DX0xJU1RBTEwpOwogCWlmIChkYXRhID09IE5VTEwpCiAJCWdvdG8gbGlzdGFsbF9jYl9mYWlsdXJlOwogCkBAIC0zNTYsMTUgKzM1MywxMSBAQAogCXZvaWQgKmRhdGE7CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeTsKIAotCWFuc19za2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWFuc19za2IgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoYW5zX3NrYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkYXRhID0gbmV0bGJsX25ldGxpbmtfaGRyX3B1dChhbnNfc2tiLAotCQkJCSAgICAgIGluZm8tPnNuZF9waWQsCi0JCQkJICAgICAgaW5mby0+c25kX3NlcSwKLQkJCQkgICAgICBuZXRsYmxfbWdtdF9nbmxfZmFtaWx5LmlkLAotCQkJCSAgICAgIDAsCi0JCQkJICAgICAgTkxCTF9NR01UX0NfTElTVERFRik7CisJZGF0YSA9IGdlbmxtc2dfcHV0X3JlcGx5KGFuc19za2IsIGluZm8sICZuZXRsYmxfbWdtdF9nbmxfZmFtaWx5LAorCQkJCSAwLCBOTEJMX01HTVRfQ19MSVNUREVGKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlnb3RvIGxpc3RkZWZfZmFpbHVyZTsKIApAQCAtMzkwLDcgKzM4Myw3IEBACiAKIAlnZW5sbXNnX2VuZChhbnNfc2tiLCBkYXRhKTsKIAotCXJldF92YWwgPSBnZW5sbXNnX3VuaWNhc3QoYW5zX3NrYiwgaW5mby0+c25kX3BpZCk7CisJcmV0X3ZhbCA9IGdlbmxtc2dfcmVwbHkoYW5zX3NrYiwgaW5mbyk7CiAJaWYgKHJldF92YWwgIT0gMCkKIAkJZ290byBsaXN0ZGVmX2ZhaWx1cmU7CiAJcmV0dXJuIDA7CkBAIC00MjIsMTIgKzQxNSw5IEBACiAJaW50IHJldF92YWwgPSAtRU5PTUVNOwogCXZvaWQgKmRhdGE7CiAKLQlkYXRhID0gbmV0bGJsX25ldGxpbmtfaGRyX3B1dChza2IsCi0JCQkJICAgICAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCi0JCQkJICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCSAgICAgIG5ldGxibF9tZ210X2dubF9mYW1pbHkuaWQsCi0JCQkJICAgICAgTkxNX0ZfTVVMVEksCi0JCQkJICAgICAgTkxCTF9NR01UX0NfUFJPVE9DT0xTKTsKKwlkYXRhID0gZ2VubG1zZ19wdXQoc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJICAgJm5ldGxibF9tZ210X2dubF9mYW1pbHksIE5MTV9GX01VTFRJLAorCQkJICAgTkxCTF9NR01UX0NfUFJPVE9DT0xTKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlnb3RvIHByb3RvY29sc19jYl9mYWlsdXJlOwogCkBAIC00OTIsMTUgKzQ4MiwxMSBAQAogCXN0cnVjdCBza19idWZmICphbnNfc2tiID0gTlVMTDsKIAl2b2lkICpkYXRhOwogCi0JYW5zX3NrYiA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CisJYW5zX3NrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmIChhbnNfc2tiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWRhdGEgPSBuZXRsYmxfbmV0bGlua19oZHJfcHV0KGFuc19za2IsCi0JCQkJICAgICAgaW5mby0+c25kX3BpZCwKLQkJCQkgICAgICBpbmZvLT5zbmRfc2VxLAotCQkJCSAgICAgIG5ldGxibF9tZ210X2dubF9mYW1pbHkuaWQsCi0JCQkJICAgICAgMCwKLQkJCQkgICAgICBOTEJMX01HTVRfQ19WRVJTSU9OKTsKKwlkYXRhID0gZ2VubG1zZ19wdXRfcmVwbHkoYW5zX3NrYiwgaW5mbywgJm5ldGxibF9tZ210X2dubF9mYW1pbHksCisJCQkJIDAsIE5MQkxfTUdNVF9DX1ZFUlNJT04pOwogCWlmIChkYXRhID09IE5VTEwpCiAJCWdvdG8gdmVyc2lvbl9mYWlsdXJlOwogCkBAIC01MTIsNyArNDk4LDcgQEAKIAogCWdlbmxtc2dfZW5kKGFuc19za2IsIGRhdGEpOwogCi0JcmV0X3ZhbCA9IGdlbmxtc2dfdW5pY2FzdChhbnNfc2tiLCBpbmZvLT5zbmRfcGlkKTsKKwlyZXRfdmFsID0gZ2VubG1zZ19yZXBseShhbnNfc2tiLCBpbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIHZlcnNpb25fZmFpbHVyZTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwppbmRleCAxODMzYWQyLi41YmMzNzE4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgpAQCAtNDcsNyArNDgsOCBAQAogI2luY2x1ZGUgIm5ldGxhYmVsX3VubGFiZWxlZC5oIgogCiAvKiBBY2NlcHQgdW5sYWJlbGVkIHBhY2tldHMgZmxhZyAqLwotc3RhdGljIGF0b21pY190IG5ldGxhYmVsX3VubGFiZWxfYWNjZXB0X2ZsZyA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFRklORV9TUElOTE9DSyhuZXRsYWJlbF91bmxhYmVsX2FjY2VwdGZsZ19sb2NrKTsKK3N0YXRpYyB1OCBuZXRsYWJlbF91bmxhYmVsX2FjY2VwdGZsZyA9IDA7CiAKIC8qIE5ldExhYmVsIEdlbmVyaWMgTkVUTElOSyBDSVBTT3Y0IGZhbWlseSAqLwogc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBuZXRsYmxfdW5sYWJlbF9nbmxfZmFtaWx5ID0gewpAQCAtODIsMTMgKzg0LDIwIEBACiAJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOwogCXU4IG9sZF92YWw7CiAKLQlvbGRfdmFsID0gYXRvbWljX3JlYWQoJm5ldGxhYmVsX3VubGFiZWxfYWNjZXB0X2ZsZyk7Ci0JYXRvbWljX3NldCgmbmV0bGFiZWxfdW5sYWJlbF9hY2NlcHRfZmxnLCB2YWx1ZSk7CisJcmN1X3JlYWRfbG9jaygpOworCW9sZF92YWwgPSBuZXRsYWJlbF91bmxhYmVsX2FjY2VwdGZsZzsKKwlzcGluX2xvY2soJm5ldGxhYmVsX3VubGFiZWxfYWNjZXB0ZmxnX2xvY2spOworCW5ldGxhYmVsX3VubGFiZWxfYWNjZXB0ZmxnID0gdmFsdWU7CisJc3Bpbl91bmxvY2soJm5ldGxhYmVsX3VubGFiZWxfYWNjZXB0ZmxnX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfVU5MQkxfQUxMT1csCiAJCQkJCSAgICAgIGF1ZGl0X2luZm8pOwotCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIHVubGJsX2FjY2VwdD0ldSBvbGQ9JXUiLCB2YWx1ZSwgb2xkX3ZhbCk7Ci0JYXVkaXRfbG9nX2VuZChhdWRpdF9idWYpOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkgIiB1bmxibF9hY2NlcHQ9JXUgb2xkPSV1IiwgdmFsdWUsIG9sZF92YWwpOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQogfQogCiAvKgpAQCAtMTM4LDI5ICsxNDcsMjcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqYW5zX3NrYjsKIAl2b2lkICpkYXRhOwogCi0JYW5zX3NrYiA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CisJYW5zX3NrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmIChhbnNfc2tiID09IE5VTEwpCiAJCWdvdG8gbGlzdF9mYWlsdXJlOwotCWRhdGEgPSBuZXRsYmxfbmV0bGlua19oZHJfcHV0KGFuc19za2IsCi0JCQkJICAgICAgaW5mby0+c25kX3BpZCwKLQkJCQkgICAgICBpbmZvLT5zbmRfc2VxLAotCQkJCSAgICAgIG5ldGxibF91bmxhYmVsX2dubF9mYW1pbHkuaWQsCi0JCQkJICAgICAgMCwKLQkJCQkgICAgICBOTEJMX1VOTEFCRUxfQ19MSVNUKTsKKwlkYXRhID0gZ2VubG1zZ19wdXRfcmVwbHkoYW5zX3NrYiwgaW5mbywgJm5ldGxibF91bmxhYmVsX2dubF9mYW1pbHksCisJCQkJIDAsIE5MQkxfVU5MQUJFTF9DX0xJU1QpOwogCWlmIChkYXRhID09IE5VTEwpIHsKIAkJcmV0X3ZhbCA9IC1FTk9NRU07CiAJCWdvdG8gbGlzdF9mYWlsdXJlOwogCX0KIAorCXJjdV9yZWFkX2xvY2soKTsKIAlyZXRfdmFsID0gbmxhX3B1dF91OChhbnNfc2tiLAogCQkJICAgICBOTEJMX1VOTEFCRUxfQV9BQ1BURkxHLAotCQkJICAgICBhdG9taWNfcmVhZCgmbmV0bGFiZWxfdW5sYWJlbF9hY2NlcHRfZmxnKSk7CisJCQkgICAgIG5ldGxhYmVsX3VubGFiZWxfYWNjZXB0ZmxnKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIAogCWdlbmxtc2dfZW5kKGFuc19za2IsIGRhdGEpOwogCi0JcmV0X3ZhbCA9IGdlbmxtc2dfdW5pY2FzdChhbnNfc2tiLCBpbmZvLT5zbmRfcGlkKTsKKwlyZXRfdmFsID0gZ2VubG1zZ19yZXBseShhbnNfc2tiLCBpbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIAlyZXR1cm4gMDsKQEAgLTI0MCwxMCArMjQ3LDE3IEBACiAgKi8KIGludCBuZXRsYmxfdW5sYWJlbF9nZXRhdHRyKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaWYgKGF0b21pY19yZWFkKCZuZXRsYWJlbF91bmxhYmVsX2FjY2VwdF9mbGcpID09IDEpCi0JCXJldHVybiBuZXRsYmxfc2VjYXR0cl9pbml0KHNlY2F0dHIpOworCWludCByZXRfdmFsOwogCi0JcmV0dXJuIC1FTk9NU0c7CisJcmN1X3JlYWRfbG9jaygpOworCWlmIChuZXRsYWJlbF91bmxhYmVsX2FjY2VwdGZsZyA9PSAxKSB7CisJCW5ldGxibF9zZWNhdHRyX2luaXQoc2VjYXR0cik7CisJCXJldF92YWwgPSAwOworCX0gZWxzZQorCQlyZXRfdmFsID0gLUVOT01TRzsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCmluZGV4IDk4YTQxNjMuLjQyZjEyYmQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwpAQCAtNDYsNiArNDYsMTAgQEAKICNpbmNsdWRlICJuZXRsYWJlbF9jaXBzb192NC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKIAorLyogZG8gbm90IGRvIGFueSBhdWRpdGluZyBpZiBhdWRpdF9lbmFibGVkID09IDAsIHNlZSBrZXJuZWwvYXVkaXQuYyBmb3IKKyAqIGRldGFpbHMgKi8KK2V4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKKwogLyoKICAqIE5ldExhYmVsIE5FVExJTksgU2V0dXAgRnVuY3Rpb25zCiAgKi8KQEAgLTEwMSw2ICsxMDUsOSBAQAogCWNoYXIgKnNlY2N0eDsKIAl1MzIgc2VjY3R4X2xlbjsKIAorCWlmIChhdWRpdF9lbmFibGVkID09IDApCisJCXJldHVybiBOVUxMOworCiAJYXVkaXRfYnVmID0gYXVkaXRfbG9nX3N0YXJ0KGF1ZGl0X2N0eCwgR0ZQX0FUT01JQywgdHlwZSk7CiAJaWYgKGF1ZGl0X2J1ZiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5oCmluZGV4IDQ3OTY3ZWYuLjZkN2Y0YWIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuaApAQCAtNDIsMzcgKzQyLDYgQEAKIC8qIE5ldExhYmVsIE5FVExJTksgaGVscGVyIGZ1bmN0aW9ucyAqLwogCiAvKioKLSAqIG5ldGxibF9uZXRsaW5rX2hkcl9wdXQgLSBXcml0ZSB0aGUgTkVUTElOSyBidWZmZXJzIGludG8gYSBza19idWZmCi0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKiBAcGlkOiB0aGUgUElEIG9mIHRoZSByZWNlaXBpZW50Ci0gKiBAc2VxOiB0aGUgc2VxdWVuY2UgbnVtYmVyCi0gKiBAdHlwZTogdGhlIGdlbmVyaWMgTkVUTElOSyBtZXNzYWdlIGZhbWlseSB0eXBlCi0gKiBAY21kOiBjb21tYW5kCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBXcml0ZSBib3RoIGEgTkVUTElOSyBubG1zZ2hkciBzdHJ1Y3R1cmUgYW5kIGEgR2VuZXJpYyBORVRMSU5LIGdlbmxtc2doZHIKLSAqIHN0cnVjdCB0byB0aGUgcGFja2V0LiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkIGJ1ZmZlcgotICogb24gc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCi0gKgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKm5ldGxibF9uZXRsaW5rX2hkcl9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgdTMyIHBpZCwKLQkJCQkJICAgdTMyIHNlcSwKLQkJCQkJICAgaW50IHR5cGUsCi0JCQkJCSAgIGludCBmbGFncywKLQkJCQkJICAgdTggY21kKQotewotCXJldHVybiBnZW5sbXNnX3B1dChza2IsCi0JCQkgICBwaWQsCi0JCQkgICBzZXEsCi0JCQkgICB0eXBlLAotCQkJICAgMCwKLQkJCSAgIGZsYWdzLAotCQkJICAgY21kLAotCQkJICAgTkVUTEJMX1BST1RPX1ZFUlNJT04pOwotfQotCi0vKioKICAqIG5ldGxibF9uZXRsaW5rX2F1ZGl0aW5mbyAtIEZldGNoIHRoZSBhdWRpdCBpbmZvcm1hdGlvbiBmcm9tIGEgTkVUTElOSyBtc2cKICAqIEBza2I6IHRoZSBwYWNrZXQKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IGQ1MjdjODkuLjNiYWFmYjEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTExNDgsMTIgKzExNDgsMTEgQEAKIAlpZiAobGVuID4gc2stPnNrX3NuZGJ1ZiAtIDMyKQogCQlnb3RvIG91dDsKIAllcnIgPSAtRU5PQlVGUzsKLQlza2IgPSBubG1zZ19uZXcobGVuLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2tiPT1OVUxMKQogCQlnb3RvIG91dDsKIAogCU5FVExJTktfQ0Ioc2tiKS5waWQJPSBubGstPnBpZDsKLQlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IGRzdF9waWQ7CiAJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IGRzdF9ncm91cDsKIAlORVRMSU5LX0NCKHNrYikubG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudC0+YXVkaXRfY29udGV4dCk7CiAJc2VsaW51eF9nZXRfdGFza19zaWQoY3VycmVudCwgJihORVRMSU5LX0NCKHNrYikuc2lkKSk7CkBAIC0xNDM1LDE0ICsxNDM0LDEzIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKnJlcDsKIAlzdHJ1Y3Qgbmxtc2dlcnIgKmVycm1zZzsKLQlpbnQgc2l6ZTsKKwlzaXplX3QgcGF5bG9hZCA9IHNpemVvZigqZXJybXNnKTsKIAotCWlmIChlcnIgPT0gMCkKLQkJc2l6ZSA9IG5sbXNnX3RvdGFsX3NpemUoc2l6ZW9mKCplcnJtc2cpKTsKLQllbHNlCi0JCXNpemUgPSBubG1zZ190b3RhbF9zaXplKHNpemVvZigqZXJybXNnKSArIG5sbXNnX2xlbihubGgpKTsKKwkvKiBlcnJvciBtZXNzYWdlcyBnZXQgdGhlIG9yaWdpbmFsIHJlcXVlc3QgYXBwZW5lZCAqLworCWlmIChlcnIpCisJCXBheWxvYWQgKz0gbmxtc2dfbGVuKG5saCk7CiAKLQlza2IgPSBubG1zZ19uZXcoc2l6ZSwgR0ZQX0tFUk5FTCk7CisJc2tiID0gbmxtc2dfbmV3KHBheWxvYWQsIEdGUF9LRVJORUwpOwogCWlmICghc2tiKSB7CiAJCXN0cnVjdCBzb2NrICpzazsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCA0OWJjMmRiLi5iOWIwMzc0IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJCX0KIAogCQkqZXJycCA9IGVyciA9IG5ldGxpbmtfZHVtcF9zdGFydChnZW5sX3NvY2ssIHNrYiwgbmxoLAotCQkJCQkJIG9wcy0+ZHVtcGl0LCBOVUxMKTsKKwkJCQkJCSBvcHMtPmR1bXBpdCwgb3BzLT5kb25lKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJc2tiX3B1bGwoc2tiLCBtaW4oTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pLAogCQkJCQkgIHNrYi0+bGVuKSk7CkBAIC0zODQsMTYgKzM4NCwxOSBAQAogICogQ29udHJvbGxlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGdlbmxfY3RybCA9IHsKKwkuaWQgPSBHRU5MX0lEX0NUUkwsCisJLm5hbWUgPSAibmxjdHJsIiwKKwkudmVyc2lvbiA9IDB4MSwKKwkubWF4YXR0ciA9IENUUkxfQVRUUl9NQVgsCit9OworCiBzdGF0aWMgaW50IGN0cmxfZmlsbF9pbmZvKHN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5LCB1MzIgcGlkLCB1MzIgc2VxLAogCQkJICB1MzIgZmxhZ3MsIHN0cnVjdCBza19idWZmICpza2IsIHU4IGNtZCkKIHsKLQlzdHJ1Y3QgbmxhdHRyICpubGFfb3BzOwotCXN0cnVjdCBnZW5sX29wcyAqb3BzOwogCXZvaWQgKmhkcjsKLQlpbnQgaWR4ID0gMTsKIAotCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIEdFTkxfSURfQ1RSTCwgMCwgZmxhZ3MsIGNtZCwKLQkJCSAgZmFtaWx5LT52ZXJzaW9uKTsKKwloZHIgPSBnZW5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCAmZ2VubF9jdHJsLCBmbGFncywgY21kKTsKIAlpZiAoaGRyID09IE5VTEwpCiAJCXJldHVybiAtMTsKIApAQCAtNDAzLDM0ICs0MDYsNDAgQEAKIAlOTEFfUFVUX1UzMihza2IsIENUUkxfQVRUUl9IRFJTSVpFLCBmYW1pbHktPmhkcnNpemUpOwogCU5MQV9QVVRfVTMyKHNrYiwgQ1RSTF9BVFRSX01BWEFUVFIsIGZhbWlseS0+bWF4YXR0cik7CiAKLQlubGFfb3BzID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBDVFJMX0FUVFJfT1BTKTsKLQlpZiAobmxhX29wcyA9PSBOVUxMKQotCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoIWxpc3RfZW1wdHkoJmZhbWlseS0+b3BzX2xpc3QpKSB7CisJCXN0cnVjdCBubGF0dHIgKm5sYV9vcHM7CisJCXN0cnVjdCBnZW5sX29wcyAqb3BzOworCQlpbnQgaWR4ID0gMTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmZmFtaWx5LT5vcHNfbGlzdCwgb3BzX2xpc3QpIHsKLQkJc3RydWN0IG5sYXR0ciAqbmVzdDsKLQotCQluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBpZHgrKyk7Ci0JCWlmIChuZXN0ID09IE5VTEwpCisJCW5sYV9vcHMgPSBubGFfbmVzdF9zdGFydChza2IsIENUUkxfQVRUUl9PUFMpOworCQlpZiAobmxhX29wcyA9PSBOVUxMKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQkJTkxBX1BVVF9VMzIoc2tiLCBDVFJMX0FUVFJfT1BfSUQsIG9wcy0+Y21kKTsKLQkJTkxBX1BVVF9VMzIoc2tiLCBDVFJMX0FUVFJfT1BfRkxBR1MsIG9wcy0+ZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJmZhbWlseS0+b3BzX2xpc3QsIG9wc19saXN0KSB7CisJCQlzdHJ1Y3QgbmxhdHRyICpuZXN0OwogCi0JCWlmIChvcHMtPnBvbGljeSkKLQkJCU5MQV9QVVRfRkxBRyhza2IsIENUUkxfQVRUUl9PUF9QT0xJQ1kpOworCQkJbmVzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgaWR4KyspOworCQkJaWYgKG5lc3QgPT0gTlVMTCkKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAob3BzLT5kb2l0KQotCQkJTkxBX1BVVF9GTEFHKHNrYiwgQ1RSTF9BVFRSX09QX0RPSVQpOworCQkJTkxBX1BVVF9VMzIoc2tiLCBDVFJMX0FUVFJfT1BfSUQsIG9wcy0+Y21kKTsKKwkJCU5MQV9QVVRfVTMyKHNrYiwgQ1RSTF9BVFRSX09QX0ZMQUdTLCBvcHMtPmZsYWdzKTsKIAotCQlpZiAob3BzLT5kdW1waXQpCi0JCQlOTEFfUFVUX0ZMQUcoc2tiLCBDVFJMX0FUVFJfT1BfRFVNUElUKTsKKwkJCWlmIChvcHMtPnBvbGljeSkKKwkJCQlOTEFfUFVUX0ZMQUcoc2tiLCBDVFJMX0FUVFJfT1BfUE9MSUNZKTsKIAotCQlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKKwkJCWlmIChvcHMtPmRvaXQpCisJCQkJTkxBX1BVVF9GTEFHKHNrYiwgQ1RSTF9BVFRSX09QX0RPSVQpOworCisJCQlpZiAob3BzLT5kdW1waXQpCisJCQkJTkxBX1BVVF9GTEFHKHNrYiwgQ1RSTF9BVFRSX09QX0RVTVBJVCk7CisKKwkJCW5sYV9uZXN0X2VuZChza2IsIG5lc3QpOworCQl9CisKKwkJbmxhX25lc3RfZW5kKHNrYiwgbmxhX29wcyk7CiAJfQogCi0JbmxhX25lc3RfZW5kKHNrYiwgbmxhX29wcyk7Ci0KIAlyZXR1cm4gZ2VubG1zZ19lbmQoc2tiLCBoZHIpOwogCiBubGFfcHV0X2ZhaWx1cmU6CkBAIC00ODAsNyArNDg5LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnI7CiAKLQlza2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCXNrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0JVRlMpOwogCkBAIC01MjksNyArNTM4LDcgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JZXJyID0gZ2VubG1zZ191bmljYXN0KG1zZywgaW5mby0+c25kX3BpZCk7CisJZXJyID0gZ2VubG1zZ19yZXBseShtc2csIGluZm8pOwogZXJyb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC01NjIsMTMgKzU3MSw2IEBACiAJLnBvbGljeQkJPSBjdHJsX3BvbGljeSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZ2VubF9jdHJsID0gewotCS5pZCA9IEdFTkxfSURfQ1RSTCwKLQkubmFtZSA9ICJubGN0cmwiLAotCS52ZXJzaW9uID0gMHgxLAotCS5tYXhhdHRyID0gQ1RSTF9BVFRSX01BWCwKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGdlbmxfaW5pdCh2b2lkKQogewogCWludCBpLCBlcnI7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX3JvdXRlLmMgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKaW5kZXggYzExNzM3Zi4uMDA5NjEwNSAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCisrKyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwpAQCAtMTU1LDE0ICsxNTUsMTUgQEAKIAkJYXRvbWljX3NldCgmbnJfbmVpZ2gtPnJlZmNvdW50LCAxKTsKIAogCQlpZiAoYXgyNV9kaWdpICE9IE5VTEwgJiYgYXgyNV9kaWdpLT5uZGlnaSA+IDApIHsKLQkJCWlmICgobnJfbmVpZ2gtPmRpZ2lwZWF0ID0ga21hbGxvYyhzaXplb2YoKmF4MjVfZGlnaSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlucl9uZWlnaC0+ZGlnaXBlYXQgPSBrbWVtZHVwKGF4MjVfZGlnaSwKKwkJCQkJCSAgICAgc2l6ZW9mKCpheDI1X2RpZ2kpLAorCQkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmIChucl9uZWlnaC0+ZGlnaXBlYXQgPT0gTlVMTCkgewogCQkJCWtmcmVlKG5yX25laWdoKTsKIAkJCQlpZiAobnJfbm9kZSkKIAkJCQkJbnJfbm9kZV9wdXQobnJfbm9kZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9Ci0JCQltZW1jcHkobnJfbmVpZ2gtPmRpZ2lwZWF0LCBheDI1X2RpZ2ksCi0JCQkJCXNpemVvZigqYXgyNV9kaWdpKSk7CiAJCX0KIAogCQlzcGluX2xvY2tfYmgoJm5yX25laWdoX2xpc3RfbG9jayk7CkBAIC00MzIsMTEgKzQzMywxMiBAQAogCWF0b21pY19zZXQoJm5yX25laWdoLT5yZWZjb3VudCwgMSk7CiAKIAlpZiAoYXgyNV9kaWdpICE9IE5VTEwgJiYgYXgyNV9kaWdpLT5uZGlnaSA+IDApIHsKLQkJaWYgKChucl9uZWlnaC0+ZGlnaXBlYXQgPSBrbWFsbG9jKHNpemVvZigqYXgyNV9kaWdpKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJbnJfbmVpZ2gtPmRpZ2lwZWF0ID0ga21lbWR1cChheDI1X2RpZ2ksIHNpemVvZigqYXgyNV9kaWdpKSwKKwkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKG5yX25laWdoLT5kaWdpcGVhdCA9PSBOVUxMKSB7CiAJCQlrZnJlZShucl9uZWlnaCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQltZW1jcHkobnJfbmVpZ2gtPmRpZ2lwZWF0LCBheDI1X2RpZ2ksIHNpemVvZigqYXgyNV9kaWdpKSk7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggZjRjY2I5MC4uMDhlNjhiNiAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC03MSw2ICs3MSw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMjAxLDcgKzIwMiw3IEBACiAJc3BpbmxvY2tfdAkJYmluZF9sb2NrOwogCWNoYXIJCQlydW5uaW5nOwkvKiBwcm90X2hvb2sgaXMgYXR0YWNoZWQqLwogCWludAkJCWlmaW5kZXg7CS8qIGJvdW5kIGRldmljZQkJKi8KLQl1bnNpZ25lZCBzaG9ydAkJbnVtOworCV9fYmUxNgkJCW51bTsKICNpZmRlZiBDT05GSUdfUEFDS0VUX01VTFRJQ0FTVAogCXN0cnVjdCBwYWNrZXRfbWNsaXN0CSptY2xpc3Q7CiAjZW5kaWYKQEAgLTMzMSw3ICszMzIsNyBAQAogCXN0cnVjdCBzb2NrYWRkcl9wa3QgKnNhZGRyPShzdHJ1Y3Qgc29ja2FkZHJfcGt0ICopbXNnLT5tc2dfbmFtZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgc2hvcnQgcHJvdG89MDsKKwlfX2JlMTYgcHJvdG89MDsKIAlpbnQgZXJyOwogCQogCS8qCkBAIC03MDQsNyArNzA1LDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfbGwgKnNhZGRyPShzdHJ1Y3Qgc29ja2FkZHJfbGwgKiltc2ctPm1zZ19uYW1lOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBzaG9ydCBwcm90bzsKKwlfX2JlMTYgcHJvdG87CiAJdW5zaWduZWQgY2hhciAqYWRkcjsKIAlpbnQgaWZpbmRleCwgZXJyLCByZXNlcnZlID0gMDsKIApAQCAtODU4LDcgKzg1OSw3IEBACiAgKglBdHRhY2ggYSBwYWNrZXQgaG9vay4KICAqLwogCi1zdGF0aWMgaW50IHBhY2tldF9kb19iaW5kKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByb3RvY29sKQorc3RhdGljIGludCBwYWNrZXRfZG9fYmluZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBwcm90b2NvbCkKIHsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKIAkvKgpAQCAtOTgzLDYgKzk4NCw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBwYWNrZXRfc29jayAqcG87CisJX19iZTE2IHByb3RvID0gKF9fZm9yY2UgX19iZTE2KXByb3RvY29sOyAvKiB3ZWlyZCwgYnV0IGRvY3VtZW50ZWQgKi8KIAlpbnQgZXJyOwogCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfUkFXKSkKQEAgLTEwMTAsNyArMTAxMiw3IEBACiAKIAlwbyA9IHBrdF9zayhzayk7CiAJc2stPnNrX2ZhbWlseSA9IFBGX1BBQ0tFVDsKLQlwby0+bnVtID0gcHJvdG9jb2w7CisJcG8tPm51bSA9IHByb3RvOwogCiAJc2stPnNrX2Rlc3RydWN0ID0gcGFja2V0X3NvY2tfZGVzdHJ1Y3Q7CiAJYXRvbWljX2luYygmcGFja2V0X3NvY2tzX25yKTsKQEAgLTEwMjcsOCArMTAyOSw4IEBACiAjZW5kaWYKIAlwby0+cHJvdF9ob29rLmFmX3BhY2tldF9wcml2ID0gc2s7CiAKLQlpZiAocHJvdG9jb2wpIHsKLQkJcG8tPnByb3RfaG9vay50eXBlID0gcHJvdG9jb2w7CisJaWYgKHByb3RvKSB7CisJCXBvLT5wcm90X2hvb2sudHlwZSA9IHByb3RvOwogCQlkZXZfYWRkX3BhY2soJnBvLT5wcm90X2hvb2spOwogCQlzb2NrX2hvbGQoc2spOwogCQlwby0+cnVubmluZyA9IDE7CkBAIC0xNjI0LDcgKzE2MjYsOCBAQAogewogCWNoYXIgKipwZ192ZWMgPSBOVUxMOwogCXN0cnVjdCBwYWNrZXRfc29jayAqcG8gPSBwa3Rfc2soc2spOwotCWludCB3YXNfcnVubmluZywgbnVtLCBvcmRlciA9IDA7CisJaW50IHdhc19ydW5uaW5nLCBvcmRlciA9IDA7CisJX19iZTE2IG51bTsKIAlpbnQgZXJyID0gMDsKIAkKIAlpZiAocmVxLT50cF9ibG9ja19ucikgewpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jIGIvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCmluZGV4IGEyMjU0MmYuLjcyNTIzNDQgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYworKysgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogaW50IHJvc2VfYWRkX2xvb3BiYWNrX25vZGUocm9zZV9hZGRyZXNzICphZGRyZXNzKQogewogCXN0cnVjdCByb3NlX25vZGUgKnJvc2Vfbm9kZTsKLQl1bnNpZ25lZCBpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gMDsKIAogCXNwaW5fbG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CiAKQEAgLTQzMiw3ICs0MzIsNyBAQAogb3V0OgogCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvdHJhbnNwb3J0LmMgYi9uZXQvcnhycGMvdHJhbnNwb3J0LmMKaW5kZXggOTRiMmUyZi4uNDI2OGIzOCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3RyYW5zcG9ydC5jCisrKyBiL25ldC9yeHJwYy90cmFuc3BvcnQuYwpAQCAtMzEsNyArMzEsNiBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0cnVjdCBlcnJvcm1zZyB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvS2NvbmZpZyBiL25ldC9zY2hlZC9LY29uZmlnCmluZGV4IDgyOThlYTkuLmY0NTQ0ZGQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9LY29uZmlnCisrKyBiL25ldC9zY2hlZC9LY29uZmlnCkBAIC02LDYgKzYsNyBAQAogCiBjb25maWcgTkVUX1NDSEVECiAJYm9vbCAiUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nIgorCXNlbGVjdCBORVRfU0NIX0ZJRk8KIAktLS1oZWxwLS0tCiAJICBXaGVuIHRoZSBrZXJuZWwgaGFzIHNldmVyYWwgcGFja2V0cyB0byBzZW5kIG91dCBvdmVyIGEgbmV0d29yawogCSAgZGV2aWNlLCBpdCBoYXMgdG8gZGVjaWRlIHdoaWNoIG9uZXMgdG8gc2VuZCBmaXJzdCwgd2hpY2ggb25lcyB0bwpAQCAtNDAsNiArNDEsOSBAQAogCSAgVGhlIGF2YWlsYWJsZSBzY2hlZHVsZXJzIGFyZSBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM7IHlvdQogCSAgY2FuIHNheSBZIHRvIGFzIG1hbnkgYXMgeW91IGxpa2UuIElmIHVuc3VyZSwgc2F5IE4gbm93LgogCitjb25maWcgTkVUX1NDSF9GSUZPCisJYm9vbAorCiBpZiBORVRfU0NIRUQKIAogY2hvaWNlCkBAIC0zMjAsNyArMzI0LDcgQEAKIAogY29uZmlnIENMU19VMzJfTUFSSwogCWJvb2wgIk5ldGZpbHRlciBtYXJrcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX0NMU19VMzIgJiYgTkVURklMVEVSCisJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgdG8gYmUgYWJsZSB0byB1c2UgbmV0ZmlsdGVyIG1hcmtzIGFzIHUzMiBrZXkuCiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9NYWtlZmlsZSBiL25ldC9zY2hlZC9NYWtlZmlsZQppbmRleCAwZjA2YWVjLi5mZjJkNmU1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvTWFrZWZpbGUKKysrIGIvbmV0L3NjaGVkL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBvYmoteQk6PSBzY2hfZ2VuZXJpYy5vCiAKLW9iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hfYXBpLm8gc2NoX2ZpZm8ubyBzY2hfYmxhY2tob2xlLm8KK29iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hfYXBpLm8gc2NoX2JsYWNraG9sZS5vCiBvYmotJChDT05GSUdfTkVUX0NMUykJCSs9IGNsc19hcGkubwogb2JqLSQoQ09ORklHX05FVF9DTFNfQUNUKQkrPSBhY3RfYXBpLm8KIG9iai0kKENPTkZJR19ORVRfQUNUX1BPTElDRSkJKz0gYWN0X3BvbGljZS5vCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfTkVUX0FDVF9JUFQpCSs9IGFjdF9pcHQubwogb2JqLSQoQ09ORklHX05FVF9BQ1RfUEVESVQpCSs9IGFjdF9wZWRpdC5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9TSU1QKQkrPSBhY3Rfc2ltcGxlLm8KK29iai0kKENPTkZJR19ORVRfU0NIX0ZJRk8pCSs9IHNjaF9maWZvLm8KIG9iai0kKENPTkZJR19ORVRfU0NIX0NCUSkJKz0gc2NoX2NicS5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9IVEIpCSs9IHNjaF9odGIubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfSFBGUSkJKz0gc2NoX2hwZnEubwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9nYWN0LmMgYi9uZXQvc2NoZWQvYWN0X2dhY3QuYwppbmRleCA2Y2ZmNTY2Li44NWRlN2VmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2dhY3QuYworKysgYi9uZXQvc2NoZWQvYWN0X2dhY3QuYwpAQCAtNDgsMTQgKzQ4LDE0IEBACiAjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgogc3RhdGljIGludCBnYWN0X25ldF9yYW5kKHN0cnVjdCB0Y2ZfZ2FjdCAqZ2FjdCkKIHsKLQlpZiAobmV0X3JhbmRvbSgpICUgZ2FjdC0+dGNmZ19wdmFsKQorCWlmICghZ2FjdC0+dGNmZ19wdmFsIHx8IG5ldF9yYW5kb20oKSAlIGdhY3QtPnRjZmdfcHZhbCkKIAkJcmV0dXJuIGdhY3QtPnRjZl9hY3Rpb247CiAJcmV0dXJuIGdhY3QtPnRjZmdfcGFjdGlvbjsKIH0KIAogc3RhdGljIGludCBnYWN0X2RldGVybShzdHJ1Y3QgdGNmX2dhY3QgKmdhY3QpCiB7Ci0JaWYgKGdhY3QtPnRjZl9ic3RhdHMucGFja2V0cyAlIGdhY3QtPnRjZmdfcHZhbCkKKwlpZiAoIWdhY3QtPnRjZmdfcHZhbCB8fCBnYWN0LT50Y2ZfYnN0YXRzLnBhY2tldHMgJSBnYWN0LT50Y2ZnX3B2YWwpCiAJCXJldHVybiBnYWN0LT50Y2ZfYWN0aW9uOwogCXJldHVybiBnYWN0LT50Y2ZnX3BhY3Rpb247CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2lwdC5jIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwppbmRleCBkOGM5MzEwLi5hOTYwODA2IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2lwdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKQEAgLTE1NiwxMCArMTU2LDkgQEAKIAkgICAgcnRhdHRyX3N0cmxjcHkodG5hbWUsIHRiW1RDQV9JUFRfVEFCTEUtMV0sIElGTkFNU0laKSA+PSBJRk5BTVNJWikKIAkJc3RyY3B5KHRuYW1lLCAibWFuZ2xlIik7CiAKLQl0ID0ga21hbGxvYyh0ZC0+dS50YXJnZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJdCA9IGttZW1kdXAodGQsIHRkLT51LnRhcmdldF9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXQpKQogCQlnb3RvIGVycjI7Ci0JbWVtY3B5KHQsIHRkLCB0ZC0+dS50YXJnZXRfc2l6ZSk7CiAKIAlpZiAoKGVyciA9IGlwdF9pbml0X3RhcmdldCh0LCB0bmFtZSwgaG9vaykpIDwgMCkKIAkJZ290byBlcnIzOwpAQCAtMjU2LDEzICsyNTUsMTIgQEAKIAkqKiBmb3IgZm9vbHByb29mIHlvdSBuZWVkIHRvIG5vdCBhc3N1bWUgdGhpcwogCSovCiAKLQl0ID0ga21hbGxvYyhpcHQtPnRjZmlfdC0+dS51c2VyLnRhcmdldF9zaXplLCBHRlBfQVRPTUlDKTsKKwl0ID0ga21lbWR1cChpcHQtPnRjZmlfdCwgaXB0LT50Y2ZpX3QtPnUudXNlci50YXJnZXRfc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKHVubGlrZWx5KCF0KSkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAogCWMuYmluZGNudCA9IGlwdC0+dGNmX2JpbmRjbnQgLSBiaW5kOwogCWMucmVmY250ID0gaXB0LT50Y2ZfcmVmY250IC0gcmVmOwotCW1lbWNweSh0LCBpcHQtPnRjZmlfdCwgaXB0LT50Y2ZpX3QtPnUudXNlci50YXJnZXRfc2l6ZSk7CiAJc3RyY3B5KHQtPnUudXNlci5uYW1lLCBpcHQtPnRjZmlfdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKIAogCVJUQV9QVVQoc2tiLCBUQ0FfSVBUX1RBUkcsIGlwdC0+dGNmaV90LT51LnVzZXIudGFyZ2V0X3NpemUsIHQpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKaW5kZXggZmVkNDdiNi4uYWY2OGUxZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYworKysgYi9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCkBAIC00Niw2ICs0NiwxOCBAQAogCS5sb2NrCT0JJnBvbGljZV9sb2NrLAogfTsKIAorLyogb2xkIHBvbGljZXIgc3RydWN0dXJlIGZyb20gYmVmb3JlIHRjIGFjdGlvbnMgKi8KK3N0cnVjdCB0Y19wb2xpY2VfY29tcGF0Cit7CisJdTMyCQkJaW5kZXg7CisJaW50CQkJYWN0aW9uOworCXUzMgkJCWxpbWl0OworCXUzMgkJCWJ1cnN0OworCXUzMgkJCW10dTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMJcmF0ZTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMJcGVha3JhdGU7Cit9OworCiAvKiBFYWNoIHBvbGljZXIgaXMgc2VyaWFsaXplZCBieSBpdHMgaW5kaXZpZHVhbCBzcGlubG9jayAqLwogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCkBAIC0xMzEsMTIgKzE0MywxNSBAQAogCXN0cnVjdCB0Y19wb2xpY2UgKnBhcm07CiAJc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZTsKIAlzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqUl90YWIgPSBOVUxMLCAqUF90YWIgPSBOVUxMOworCWludCBzaXplOwogCiAJaWYgKHJ0YSA9PSBOVUxMIHx8IHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9QT0xJQ0VfTUFYLCBydGEpIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAodGJbVENBX1BPTElDRV9UQkYtMV0gPT0gTlVMTCB8fAotCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1RCRi0xXSkgIT0gc2l6ZW9mKCpwYXJtKSkKKwlpZiAodGJbVENBX1BPTElDRV9UQkYtMV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKTsKKwlpZiAoc2l6ZSAhPSBzaXplb2YoKnBhcm0pICYmIHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0Y19wb2xpY2VfY29tcGF0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKTsKIApAQCAtNDE1LDEyICs0MzAsMTUgQEAKIAlzdHJ1Y3QgdGNmX3BvbGljZSAqcG9saWNlOwogCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QT0xJQ0VfTUFYXTsKIAlzdHJ1Y3QgdGNfcG9saWNlICpwYXJtOworCWludCBzaXplOwogCiAJaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9QT0xJQ0VfTUFYLCBydGEpIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAodGJbVENBX1BPTElDRV9UQkYtMV0gPT0gTlVMTCB8fAotCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1RCRi0xXSkgIT0gc2l6ZW9mKCpwYXJtKSkKKwlpZiAodGJbVENBX1BPTElDRV9UQkYtMV0gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc2l6ZSA9IFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKTsKKwlpZiAoc2l6ZSAhPSBzaXplb2YoKnBhcm0pICYmIHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0Y19wb2xpY2VfY29tcGF0KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlwYXJtID0gUlRBX0RBVEEodGJbVENBX1BPTElDRV9UQkYtMV0pOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYyBiL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMKaW5kZXggOTAxNTcxYS4uNWZlODA4NSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYworKysgYi9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCkBAIC03MSwxMSArNzEsMTAgQEAKIAogc3RhdGljIGludCBhbGxvY19kZWZkYXRhKHN0cnVjdCB0Y2ZfZGVmYWN0ICpkLCB1MzIgZGF0YWxlbiwgdm9pZCAqZGVmZGF0YSkKIHsKLQlkLT50Y2ZkX2RlZmRhdGEgPSBrbWFsbG9jKGRhdGFsZW4sIEdGUF9LRVJORUwpOworCWQtPnRjZmRfZGVmZGF0YSA9IGttZW1kdXAoZGVmZGF0YSwgZGF0YWxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCFkLT50Y2ZkX2RlZmRhdGEpKQogCQlyZXR1cm4gLUVOT01FTTsKIAlkLT50Y2ZkX2RhdGFsZW4gPSBkYXRhbGVuOwotCW1lbWNweShkLT50Y2ZkX2RlZmRhdGEsIGRlZmRhdGEsIGRhdGFsZW4pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2FwaS5jIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwppbmRleCAzN2ExODQwLi5lZGI4ZmM5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2FwaS5jCisrKyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQkvKiBDcmVhdGUgbmV3IHByb3RvIHRjZiAqLwogCiAJCWVyciA9IC1FTk9CVUZTOwotCQlpZiAoKHRwID0ga21hbGxvYyhzaXplb2YoKnRwKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWlmICgodHAgPSBremFsbG9jKHNpemVvZigqdHApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAkJCWdvdG8gZXJyb3V0OwogCQllcnIgPSAtRUlOVkFMOwogCQl0cF9vcHMgPSB0Y2ZfcHJvdG9fbG9va3VwX29wcyh0Y2FbVENBX0tJTkQtMV0pOwpAQCAtMjQ3LDcgKzI0Nyw2IEBACiAJCQlrZnJlZSh0cCk7CiAJCQlnb3RvIGVycm91dDsKIAkJfQotCQltZW1zZXQodHAsIDAsIHNpemVvZigqdHApKTsKIAkJdHAtPm9wcyA9IHRwX29wczsKIAkJdHAtPnByb3RvY29sID0gcHJvdG9jb2w7CiAJCXRwLT5wcmlvID0gbnByaW8gPyA6IHRjZl9hdXRvX3ByaW8oKmJhY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mdy5jIGIvbmV0L3NjaGVkL2Nsc19mdy5jCmluZGV4IGU1NGFjYzYuLmY1OWEyYzQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfZncuYworKysgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKQEAgLTEwMSwxMSArMTAxLDcgQEAKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCopdHAtPnJvb3Q7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZjsKIAlpbnQgcjsKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JdTMyIGlkID0gc2tiLT5uZm1hcmsgJiBoZWFkLT5tYXNrOwotI2Vsc2UKLQl1MzIgaWQgPSAwOwotI2VuZGlmCisJdTMyIGlkID0gc2tiLT5tYXJrICYgaGVhZC0+bWFzazsKIAogCWlmIChoZWFkICE9IE5VTEwpIHsKIAkJZm9yIChmPWhlYWQtPmh0W2Z3X2hhc2goaWQpXTsgZjsgZj1mLT5uZXh0KSB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JzdnAuaCBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCmluZGV4IDZlMjMwZWMuLjU4N2I5YWQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cC5oCisrKyBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCkBAIC03Nyw3ICs3Nyw3IEBACiBzdHJ1Y3QgcnN2cF9zZXNzaW9uCiB7CiAJc3RydWN0IHJzdnBfc2Vzc2lvbgkqbmV4dDsKLQl1MzIJCQlkc3RbUlNWUF9EU1RfTEVOXTsKKwlfX2JlMzIJCQlkc3RbUlNWUF9EU1RfTEVOXTsKIAlzdHJ1Y3QgdGNfcnN2cF9ncGkgCWRwaTsKIAl1OAkJCXByb3RvY29sOwogCXU4CQkJdHVubmVsaWQ7CkBAIC04OSw3ICs4OSw3IEBACiBzdHJ1Y3QgcnN2cF9maWx0ZXIKIHsKIAlzdHJ1Y3QgcnN2cF9maWx0ZXIJKm5leHQ7Ci0JdTMyCQkJc3JjW1JTVlBfRFNUX0xFTl07CisJX19iZTMyCQkJc3JjW1JTVlBfRFNUX0xFTl07CiAJc3RydWN0IHRjX3JzdnBfZ3BpCXNwaTsKIAl1OAkJCXR1bm5lbGhkcjsKIApAQCAtMTAwLDE3ICsxMDAsMTcgQEAKIAlzdHJ1Y3QgcnN2cF9zZXNzaW9uCSpzZXNzOwogfTsKIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaGFzaF9kc3QodTMyICpkc3QsIHU4IHByb3RvY29sLCB1OCB0dW5uZWxpZCkKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGhhc2hfZHN0KF9fYmUzMiAqZHN0LCB1OCBwcm90b2NvbCwgdTggdHVubmVsaWQpCiB7Ci0JdW5zaWduZWQgaCA9IGRzdFtSU1ZQX0RTVF9MRU4tMV07CisJdW5zaWduZWQgaCA9IChfX2ZvcmNlIF9fdTMyKWRzdFtSU1ZQX0RTVF9MRU4tMV07CiAJaCBePSBoPj4xNjsKIAloIF49IGg+Pjg7CiAJcmV0dXJuIChoIF4gcHJvdG9jb2wgXiB0dW5uZWxpZCkgJiAweEZGOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBoYXNoX3NyYyh1MzIgKnNyYykKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGhhc2hfc3JjKF9fYmUzMiAqc3JjKQogewotCXVuc2lnbmVkIGggPSBzcmNbUlNWUF9EU1RfTEVOLTFdOworCXVuc2lnbmVkIGggPSAoX19mb3JjZSBfX3UzMilzcmNbUlNWUF9EU1RfTEVOLTFdOwogCWggXj0gaD4+MTY7CiAJaCBePSBoPj44OwogCWggXj0gaD4+NDsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXN0cnVjdCByc3ZwX3Nlc3Npb24gKnM7CiAJc3RydWN0IHJzdnBfZmlsdGVyICpmOwogCXVuc2lnbmVkIGgxLCBoMjsKLQl1MzIgKmRzdCwgKnNyYzsKKwlfX2JlMzIgKmRzdCwgKnNyYzsKIAl1OCBwcm90b2NvbDsKIAl1OCB0dW5uZWxpZCA9IDA7CiAJdTggKnhwcnQ7CkBAIC00MTAsNyArNDEwLDcgQEAKIAlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUlNWUF9NQVhdOwogCXN0cnVjdCB0Y2ZfZXh0cyBlOwogCXVuc2lnbmVkIGgxLCBoMjsKLQl1MzIgKmRzdDsKKwlfX2JlMzIgKmRzdDsKIAlpbnQgZXJyOwogCiAJaWYgKG9wdCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc191MzIuYyBiL25ldC9zY2hlZC9jbHNfdTMyLmMKaW5kZXggMGE2Y2ZhMC4uOGI1MTk0OCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc191MzIuYworKysgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCkBAIC0xNDMsNyArMTQzLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NMU19VMzJfTUFSSwotCQlpZiAoKHNrYi0+bmZtYXJrICYgbi0+bWFyay5tYXNrKSAhPSBuLT5tYXJrLnZhbCkgeworCQlpZiAoKHNrYi0+bWFyayAmIG4tPm1hcmsubWFzaykgIT0gbi0+bWFyay52YWwpIHsKIAkJCW4gPSBuLT5uZXh0OwogCQkJZ290byBuZXh0X2tub2RlOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX21ldGEuYyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKaW5kZXggNjFlM2I3NC4uNDVkNDdkMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2VtX21ldGEuYworKysgYi9uZXQvc2NoZWQvZW1fbWV0YS5jCkBAIC0yMDgsMTMgKzIwOCw5IEBACiAgKiBOZXRmaWx0ZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTUVUQV9DT0xMRUNUT1IoaW50X25mbWFyaykKK01FVEFfQ09MTEVDVE9SKGludF9tYXJrKQogewotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQlkc3QtPnZhbHVlID0gc2tiLT5uZm1hcms7Ci0jZWxzZQotCWRzdC0+dmFsdWUgPSAwOwotI2VuZGlmCisJZHN0LT52YWx1ZSA9IHNrYi0+bWFyazsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00OTAsNyArNDg2LDcgQEAKIAkJW01FVEFfSUQoUEtUTEVOKV0JCT0gTUVUQV9GVU5DKGludF9wa3RsZW4pLAogCQlbTUVUQV9JRChEQVRBTEVOKV0JCT0gTUVUQV9GVU5DKGludF9kYXRhbGVuKSwKIAkJW01FVEFfSUQoTUFDTEVOKV0JCT0gTUVUQV9GVU5DKGludF9tYWNsZW4pLAotCQlbTUVUQV9JRChORk1BUkspXQkJPSBNRVRBX0ZVTkMoaW50X25mbWFyayksCisJCVtNRVRBX0lEKE5GTUFSSyldCQk9IE1FVEFfRlVOQyhpbnRfbWFyayksCiAJCVtNRVRBX0lEKFRDSU5ERVgpXQkJPSBNRVRBX0ZVTkMoaW50X3RjaW5kZXgpLAogCQlbTUVUQV9JRChSVENMQVNTSUQpXQkJPSBNRVRBX0ZVTkMoaW50X3J0Y2xhc3NpZCksCiAJCVtNRVRBX0lEKFJUSUlGKV0JCT0gTUVUQV9GVU5DKGludF9ydGlpZiksCkBAIC01NTAsMTAgKzU0Niw5IEBACiB7CiAJaW50IGxlbiA9IFJUQV9QQVlMT0FEKHJ0YSk7CiAKLQlkc3QtPnZhbCA9ICh1bnNpZ25lZCBsb25nKSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJZHN0LT52YWwgPSAodW5zaWduZWQgbG9uZylrbWVtZHVwKFJUQV9EQVRBKHJ0YSksIGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRzdC0+dmFsID09IDBVTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KCh2b2lkICopIGRzdC0+dmFsLCBSVEFfREFUQShydGEpLCBsZW4pOwogCWRzdC0+bGVuID0gbGVuOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX25ieXRlLmMgYi9uZXQvc2NoZWQvZW1fbmJ5dGUuYwppbmRleCBjYzgwYmFiLi4wMDVkYjQwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvZW1fbmJ5dGUuYworKysgYi9uZXQvc2NoZWQvZW1fbmJ5dGUuYwpAQCAtMzQsMTIgKzM0LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZW0tPmRhdGFsZW4gPSBzaXplb2YoKm5ieXRlKSArIG5ieXRlLT5sZW47Ci0JZW0tPmRhdGEgPSAodW5zaWduZWQgbG9uZykga21hbGxvYyhlbS0+ZGF0YWxlbiwgR0ZQX0tFUk5FTCk7CisJZW0tPmRhdGEgPSAodW5zaWduZWQgbG9uZylrbWVtZHVwKGRhdGEsIGVtLT5kYXRhbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoZW0tPmRhdGEgPT0gMFVMKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQltZW1jcHkoKHZvaWQgKikgZW0tPmRhdGEsIGRhdGEsIGVtLT5kYXRhbGVuKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvZW1hdGNoLmMgYi9uZXQvc2NoZWQvZW1hdGNoLmMKaW5kZXggMGZkMDc2OC4uOGY4YTE2ZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2VtYXRjaC5jCisrKyBiL25ldC9zY2hlZC9lbWF0Y2guYwpAQCAtMjUxLDEyICsyNTEsMTEgQEAKIAkJCQkJZ290byBlcnJvdXQ7CiAJCQkJZW0tPmRhdGEgPSAqKHUzMiAqKSBkYXRhOwogCQkJfSBlbHNlIHsKLQkJCQl2b2lkICp2ID0ga21hbGxvYyhkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJCQkJdm9pZCAqdiA9IGttZW1kdXAoZGF0YSwgZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQkJCWlmICh2ID09IE5VTEwpIHsKIAkJCQkJZXJyID0gLUVOT0JVRlM7CiAJCQkJCWdvdG8gZXJyb3V0OwogCQkJCX0KLQkJCQltZW1jcHkodiwgZGF0YSwgZGF0YV9sZW4pOwogCQkJCWVtLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHY7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXBpLmMgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCmluZGV4IDBiNjQ4OTIuLjY1ODI1ZjQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXBpLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwpAQCAtMTkxLDE5ICsxOTEsMjUgQEAKICAgIChyb290IHFkaXNjLCBhbGwgaXRzIGNoaWxkcmVuLCBjaGlsZHJlbiBvZiBjaGlsZHJlbiBldGMuKQogICovCiAKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKl9fcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpCit7CisJc3RydWN0IFFkaXNjICpxOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmZGV2LT5xZGlzY19saXN0LCBsaXN0KSB7CisJCWlmIChxLT5oYW5kbGUgPT0gaGFuZGxlKQorCQkJcmV0dXJuIHE7CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKQogewogCXN0cnVjdCBRZGlzYyAqcTsKIAogCXJlYWRfbG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZkZXYtPnFkaXNjX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHEtPmhhbmRsZSA9PSBoYW5kbGUpIHsKLQkJCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwotCQkJcmV0dXJuIHE7Ci0JCX0KLQl9CisJcSA9IF9fcWRpc2NfbG9va3VwKGRldiwgaGFuZGxlKTsKIAlyZWFkX3VubG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcTsKIH0KIAogc3RhdGljIHN0cnVjdCBRZGlzYyAqcWRpc2NfbGVhZihzdHJ1Y3QgUWRpc2MgKnAsIHUzMiBjbGFzc2lkKQpAQCAtMzQ4LDYgKzM1NCwyNiBAQAogCXJldHVybiBvcWRpc2M7CiB9CiAKK3ZvaWQgcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzICpjb3BzOworCXVuc2lnbmVkIGxvbmcgY2w7CisJdTMyIHBhcmVudGlkOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCXdoaWxlICgocGFyZW50aWQgPSBzY2gtPnBhcmVudCkpIHsKKwkJc2NoID0gX19xZGlzY19sb29rdXAoc2NoLT5kZXYsIFRDX0hfTUFKKHBhcmVudGlkKSk7CisJCWNvcHMgPSBzY2gtPm9wcy0+Y2xfb3BzOworCQlpZiAoY29wcy0+cWxlbl9ub3RpZnkpIHsKKwkJCWNsID0gY29wcy0+Z2V0KHNjaCwgcGFyZW50aWQpOworCQkJY29wcy0+cWxlbl9ub3RpZnkoc2NoLCBjbCk7CisJCQljb3BzLT5wdXQoc2NoLCBjbCk7CisJCX0KKwkJc2NoLT5xLnFsZW4gLT0gbjsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbik7CiAKIC8qIEdyYWZ0IHFkaXNjICJuZXciIHRvIGNsYXNzICJjbGFzc2lkIiBvZiBxZGlzYyAicGFyZW50IiBvcgogICAgdG8gZGV2aWNlICJkZXYiLgpAQCAtMTExMiw3ICsxMTM4LDcgQEAKIAlzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCWludCBlcnIgPSAwOwotCXUzMiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CisJX19iZTE2IHByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlzdHJ1Y3QgdGNmX3Byb3RvICpvdHAgPSB0cDsKIHJlY2xhc3NpZnk6CkBAIC0xMjc3LDcgKzEzMDMsNiBAQAogCiBzdWJzeXNfaW5pdGNhbGwocGt0c2NoZWRfaW5pdCk7CiAKLUVYUE9SVF9TWU1CT0wocWRpc2NfbG9va3VwKTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfZ2V0X3J0YWIpOwogRVhQT1JUX1NZTUJPTChxZGlzY19wdXRfcnRhYik7CiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3FkaXNjKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXRtLmMgYi9uZXQvc2NoZWQvc2NoX2F0bS5jCmluZGV4IGRiZjQ0ZGEuLmVkYzdiYjAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXRtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hdG0uYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJfQogCW1lbXNldChmbG93LDAsc2l6ZW9mKCpmbG93KSk7CiAJZmxvdy0+ZmlsdGVyX2xpc3QgPSBOVUxMOwotCWlmICghKGZsb3ctPnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwmcGZpZm9fcWRpc2Nfb3BzKSkpCisJaWYgKCEoZmxvdy0+cSA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCZwZmlmb19xZGlzY19vcHMsY2xhc3NpZCkpKQogCQlmbG93LT5xID0gJm5vb3BfcWRpc2M7CiAJRFBSSU5USygiYXRtX3RjX2NoYW5nZTogcWRpc2MgJXBcbiIsZmxvdy0+cSk7CiAJZmxvdy0+c29jayA9IHNvY2s7CkBAIC01NzYsNyArNTc2LDggQEAKIAogCURQUklOVEsoImF0bV90Y19pbml0KHNjaCAlcCxbcWRpc2MgJXBdLG9wdCAlcClcbiIsc2NoLHAsb3B0KTsKIAlwLT5mbG93cyA9ICZwLT5saW5rOwotCWlmKCEocC0+bGluay5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsJnBmaWZvX3FkaXNjX29wcykpKQorCWlmKCEocC0+bGluay5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsJnBmaWZvX3FkaXNjX29wcywKKwkJCQkJICAgc2NoLT5oYW5kbGUpKSkKIAkJcC0+bGluay5xID0gJm5vb3BfcWRpc2M7CiAJRFBSSU5USygiYXRtX3RjX2luaXQ6IGxpbmsgKCVwKSBxZGlzYyAlcFxuIiwmcC0+bGluayxwLT5saW5rLnEpOwogCXAtPmxpbmsuZmlsdGVyX2xpc3QgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9jYnEuYyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKaW5kZXggYmFjODgxYi4uYmE4MmRmYSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9jYnEuYworKysgYi9uZXQvc2NoZWQvc2NoX2NicS5jCkBAIC0xNDI5LDcgKzE0MjksOCBAQAogCXEtPmxpbmsuc2libGluZyA9ICZxLT5saW5rOwogCXEtPmxpbmsuY2xhc3NpZCA9IHNjaC0+aGFuZGxlOwogCXEtPmxpbmsucWRpc2MgPSBzY2g7Ci0JaWYgKCEocS0+bGluay5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpKSkKKwlpZiAoIShxLT5saW5rLnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcywKKwkJCQkJICAgIHNjaC0+aGFuZGxlKSkpCiAJCXEtPmxpbmsucSA9ICZub29wX3FkaXNjOwogCiAJcS0+bGluay5wcmlvcml0eSA9IFRDX0NCUV9NQVhQUklPLTE7CkBAIC0xNjc0LDcgKzE2NzUsOCBAQAogCiAJaWYgKGNsKSB7CiAJCWlmIChuZXcgPT0gTlVMTCkgewotCQkJaWYgKChuZXcgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcykpID09IE5VTEwpCisJCQlpZiAoKG5ldyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLAorCQkJCQkJICAgICBjbC0+Y2xhc3NpZCkpID09IE5VTEwpCiAJCQkJcmV0dXJuIC1FTk9CVUZTOwogCQl9IGVsc2UgewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQpAQCAtMTY4NSw3ICsxNjg3LDcgQEAKIAkJc2NoX3RyZWVfbG9jayhzY2gpOwogCQkqb2xkID0gY2wtPnE7CiAJCWNsLT5xID0gbmV3OwotCQlzY2gtPnEucWxlbiAtPSAoKm9sZCktPnEucWxlbjsKKwkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKCpvbGQsICgqb2xkKS0+cS5xbGVuKTsKIAkJcWRpc2NfcmVzZXQoKm9sZCk7CiAJCXNjaF90cmVlX3VubG9jayhzY2gpOwogCkBAIC0xOTMyLDcgKzE5MzQsNyBAQAogCWNsLT5SX3RhYiA9IHJ0YWI7CiAJcnRhYiA9IE5VTEw7CiAJY2wtPnJlZmNudCA9IDE7Ci0JaWYgKCEoY2wtPnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcykpKQorCWlmICghKGNsLT5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsIGNsYXNzaWQpKSkKIAkJY2wtPnEgPSAmbm9vcF9xZGlzYzsKIAljbC0+Y2xhc3NpZCA9IGNsYXNzaWQ7CiAJY2wtPnRwYXJlbnQgPSBwYXJlbnQ7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2RzbWFyay5jIGIvbmV0L3NjaGVkL3NjaF9kc21hcmsuYwppbmRleCAxMWM4YTIxLi5kNTQyMTgxIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2RzbWFyay5jCisrKyBiL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMKQEAgLTg4LDE1ICs4OCwxNiBAQAogCQlzY2gsIHAsIG5ldywgb2xkKTsKIAogCWlmIChuZXcgPT0gTlVMTCkgewotCQluZXcgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJCW5ldyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLAorCQkJCQlzY2gtPmhhbmRsZSk7CiAJCWlmIChuZXcgPT0gTlVMTCkKIAkJCW5ldyA9ICZub29wX3FkaXNjOwogCX0KIAogCXNjaF90cmVlX2xvY2soc2NoKTsKIAkqb2xkID0geGNoZygmcC0+cSwgbmV3KTsKKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCXFkaXNjX3Jlc2V0KCpvbGQpOwotCXNjaC0+cS5xbGVuID0gMDsKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAogICAgICAgICByZXR1cm4gMDsKQEAgLTMwNyw3ICszMDgsNyBAQAogCQkJaWYgKHAtPm1hc2tbaW5kZXhdICE9IDB4ZmYgfHwgcC0+dmFsdWVbaW5kZXhdKQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImRzbWFya19kZXF1ZXVlOiAiCiAJCQkJICAgICAgICJ1bnN1cHBvcnRlZCBwcm90b2NvbCAlZFxuIiwKLQkJCQkgICAgICAgaHRvbnMoc2tiLT5wcm90b2NvbCkpOworCQkJCSAgICAgICBudG9ocyhza2ItPnByb3RvY29sKSk7CiAJCQlicmVhazsKIAl9OwogCkBAIC0zODcsNyArMzg4LDcgQEAKIAlwLT5kZWZhdWx0X2luZGV4ID0gZGVmYXVsdF9pbmRleDsKIAlwLT5zZXRfdGNfaW5kZXggPSBSVEFfR0VUX0ZMQUcodGJbVENBX0RTTUFSS19TRVRfVENfSU5ERVgtMV0pOwogCi0JcC0+cSA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKTsKKwlwLT5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsIHNjaC0+aGFuZGxlKTsKIAlpZiAocC0+cSA9PSBOVUxMKQogCQlwLT5xID0gJm5vb3BfcWRpc2M7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jIGIvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMKaW5kZXggODhjNmE5OS4uYmMxMTZiZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMKQEAgLTQ1MCwxMyArNDUwLDE1IEBACiAJcmV0dXJuIEVSUl9QVFIoLWVycik7CiB9CiAKLXN0cnVjdCBRZGlzYyAqIHFkaXNjX2NyZWF0ZV9kZmx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBRZGlzY19vcHMgKm9wcykKK3N0cnVjdCBRZGlzYyAqIHFkaXNjX2NyZWF0ZV9kZmx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBRZGlzY19vcHMgKm9wcywKKwkJCQkgdW5zaWduZWQgaW50IHBhcmVudGlkKQogewogCXN0cnVjdCBRZGlzYyAqc2NoOwogCQogCXNjaCA9IHFkaXNjX2FsbG9jKGRldiwgb3BzKTsKIAlpZiAoSVNfRVJSKHNjaCkpCiAJCWdvdG8gZXJyb3V0OworCXNjaC0+cGFyZW50ID0gcGFyZW50aWQ7CiAKIAlpZiAoIW9wcy0+aW5pdCB8fCBvcHMtPmluaXQoc2NoLCBOVUxMKSA9PSAwKQogCQlyZXR1cm4gc2NoOwpAQCAtNTIwLDcgKzUyMiw4IEBACiAJaWYgKGRldi0+cWRpc2Nfc2xlZXBpbmcgPT0gJm5vb3BfcWRpc2MpIHsKIAkJc3RydWN0IFFkaXNjICpxZGlzYzsKIAkJaWYgKGRldi0+dHhfcXVldWVfbGVuKSB7Ci0JCQlxZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KGRldiwgJnBmaWZvX2Zhc3Rfb3BzKTsKKwkJCXFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoZGV2LCAmcGZpZm9fZmFzdF9vcHMsCisJCQkJCQkgIFRDX0hfUk9PVCk7CiAJCQlpZiAocWRpc2MgPT0gTlVMTCkgewogCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhY3RpdmF0aW9uIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKIAkJCQlyZXR1cm47CkBAIC02MDYsMTMgKzYwOSwxMCBAQAogCXFkaXNjX3VubG9ja190cmVlKGRldik7CiB9CiAKLUVYUE9SVF9TWU1CT0woX19uZXRkZXZfd2F0Y2hkb2dfdXApOwogRVhQT1JUX1NZTUJPTChuZXRpZl9jYXJyaWVyX29uKTsKIEVYUE9SVF9TWU1CT0wobmV0aWZfY2Fycmllcl9vZmYpOwogRVhQT1JUX1NZTUJPTChub29wX3FkaXNjKTsKLUVYUE9SVF9TWU1CT0wobm9vcF9xZGlzY19vcHMpOwogRVhQT1JUX1NZTUJPTChxZGlzY19jcmVhdGVfZGZsdCk7Ci1FWFBPUlRfU1lNQk9MKHFkaXNjX2FsbG9jKTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfZGVzdHJveSk7CiBFWFBPUlRfU1lNQk9MKHFkaXNjX3Jlc2V0KTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfbG9ja190cmVlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaGZzYy5jIGIvbmV0L3NjaGVkL3NjaF9oZnNjLmMKaW5kZXggNmE2NzM1YS4uNmVlZmE2OSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9oZnNjLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9oZnNjLmMKQEAgLTk0Niw2ICs5NDYsNyBAQAogCWlmICh1bmxpa2VseShzY2gtPm9wcy0+cmVxdWV1ZShza2IsIHNjaCkgIT0gTkVUX1hNSVRfU1VDQ0VTUykpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50aygicWRpc2NfcGVla19sZW46IGZhaWxlZCB0byByZXF1ZXVlXG4iKTsKKwkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHNjaCwgMSk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gbGVuOwpAQCAtOTU3LDExICs5NTgsNyBAQAogCXVuc2lnbmVkIGludCBsZW4gPSBjbC0+cWRpc2MtPnEucWxlbjsKIAogCXFkaXNjX3Jlc2V0KGNsLT5xZGlzYyk7Ci0JaWYgKGxlbiA+IDApIHsKLQkJdXBkYXRlX3ZmKGNsLCAwLCAwKTsKLQkJc2V0X3Bhc3NpdmUoY2wpOwotCQlzY2gtPnEucWxlbiAtPSBsZW47Ci0JfQorCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihjbC0+cWRpc2MsIGxlbik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTM4LDcgKzExMzUsNyBAQAogCWNsLT5jbGFzc2lkICAgPSBjbGFzc2lkOwogCWNsLT5zY2hlZCAgICAgPSBxOwogCWNsLT5jbF9wYXJlbnQgPSBwYXJlbnQ7Ci0JY2wtPnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCWNsLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLCBjbGFzc2lkKTsKIAlpZiAoY2wtPnFkaXNjID09IE5VTEwpCiAJCWNsLT5xZGlzYyA9ICZub29wX3FkaXNjOwogCWNsLT5zdGF0c19sb2NrID0gJnNjaC0+ZGV2LT5xdWV1ZV9sb2NrOwpAQCAtMTI3MSw3ICsxMjY4LDggQEAKIAlpZiAoY2wtPmxldmVsID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKG5ldyA9PSBOVUxMKSB7Ci0JCW5ldyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKTsKKwkJbmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsCisJCQkJCWNsLT5jbGFzc2lkKTsKIAkJaWYgKG5ldyA9PSBOVUxMKQogCQkJbmV3ID0gJm5vb3BfcWRpc2M7CiAJfQpAQCAtMTI5NCw2ICsxMjkyLDE3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkCitoZnNjX3FsZW5fbm90aWZ5KHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2wgPSAoc3RydWN0IGhmc2NfY2xhc3MgKilhcmc7CisKKwlpZiAoY2wtPnFkaXNjLT5xLnFsZW4gPT0gMCkgeworCQl1cGRhdGVfdmYoY2wsIDAsIDApOworCQlzZXRfcGFzc2l2ZShjbCk7CisJfQorfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaGZzY19nZXRfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkKQogewpAQCAtMTUxNCw3ICsxNTIzLDggQEAKIAlxLT5yb290LnJlZmNudCAgPSAxOwogCXEtPnJvb3QuY2xhc3NpZCA9IHNjaC0+aGFuZGxlOwogCXEtPnJvb3Quc2NoZWQgICA9IHE7Ci0JcS0+cm9vdC5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKTsKKwlxLT5yb290LnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsCisJCQkJCSAgc2NoLT5oYW5kbGUpOwogCWlmIChxLT5yb290LnFkaXNjID09IE5VTEwpCiAJCXEtPnJvb3QucWRpc2MgPSAmbm9vcF9xZGlzYzsKIAlxLT5yb290LnN0YXRzX2xvY2sgPSAmc2NoLT5kZXYtPnF1ZXVlX2xvY2s7CkBAIC0xNzc3LDYgKzE3ODcsNyBAQAogCS5kZWxldGUJCT0gaGZzY19kZWxldGVfY2xhc3MsCiAJLmdyYWZ0CQk9IGhmc2NfZ3JhZnRfY2xhc3MsCiAJLmxlYWYJCT0gaGZzY19jbGFzc19sZWFmLAorCS5xbGVuX25vdGlmeQk9IGhmc2NfcWxlbl9ub3RpZnksCiAJLmdldAkJPSBoZnNjX2dldF9jbGFzcywKIAkucHV0CQk9IGhmc2NfcHV0X2NsYXNzLAogCS5iaW5kX3RjZgk9IGhmc2NfYmluZF90Y2YsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2h0Yi5jIGIvbmV0L3NjaGVkL3NjaF9odGIuYwppbmRleCA0YjUyZmE3Li4yMTVlNjhjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2h0Yi5jCisrKyBiL25ldC9zY2hlZC9zY2hfaHRiLmMKQEAgLTEyMjMsMTcgKzEyMjMsMTQgQEAKIAlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IChzdHJ1Y3QgaHRiX2NsYXNzICopYXJnOwogCiAJaWYgKGNsICYmICFjbC0+bGV2ZWwpIHsKLQkJaWYgKG5ldyA9PSBOVUxMICYmIChuZXcgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwKLQkJCQkJCQkgICAgJnBmaWZvX3FkaXNjX29wcykpCisJCWlmIChuZXcgPT0gTlVMTCAmJgorCQkgICAgKG5ldyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLAorCQkgICAgCQkJICAgICBjbC0+Y2xhc3NpZCkpCiAJCSAgICA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9CVUZTOwogCQlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJCWlmICgoKm9sZCA9IHhjaGcoJmNsLT51bi5sZWFmLnEsIG5ldykpICE9IE5VTEwpIHsKLQkJCWlmIChjbC0+cHJpb19hY3Rpdml0eSkKLQkJCQlodGJfZGVhY3RpdmF0ZShxZGlzY19wcml2KHNjaCksIGNsKTsKLQotCQkJLyogVE9ETzogaXMgaXQgY29ycmVjdCA/IFdoeSBDQlEgZG9lc24ndCBkbyBpdCA/ICovCi0JCQlzY2gtPnEucWxlbiAtPSAoKm9sZCktPnEucWxlbjsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbigqb2xkLCAoKm9sZCktPnEucWxlbik7CiAJCQlxZGlzY19yZXNldCgqb2xkKTsKIAkJfQogCQlzY2hfdHJlZV91bmxvY2soc2NoKTsKQEAgLTEyNDgsNiArMTI0NSwxNCBAQAogCXJldHVybiAoY2wgJiYgIWNsLT5sZXZlbCkgPyBjbC0+dW4ubGVhZi5xIDogTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgaHRiX3FsZW5fbm90aWZ5KHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IChzdHJ1Y3QgaHRiX2NsYXNzICopYXJnOworCisJaWYgKGNsLT51bi5sZWFmLnEtPnEucWxlbiA9PSAwKQorCQlodGJfZGVhY3RpdmF0ZShxZGlzY19wcml2KHNjaCksIGNsKTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHRiX2dldChzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQpCiB7CiAJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSBodGJfZmluZChjbGFzc2lkLCBzY2gpOwpAQCAtMTI2OSw5ICsxMjc0LDkgQEAKIHN0YXRpYyB2b2lkIGh0Yl9kZXN0cm95X2NsYXNzKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgaHRiX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCiAJaWYgKCFjbC0+bGV2ZWwpIHsKIAkJQlVHX1RSQVAoY2wtPnVuLmxlYWYucSk7Ci0JCXNjaC0+cS5xbGVuIC09IGNsLT51bi5sZWFmLnEtPnEucWxlbjsKIAkJcWRpc2NfZGVzdHJveShjbC0+dW4ubGVhZi5xKTsKIAl9CiAJcWRpc2NfcHV0X3J0YWIoY2wtPnJhdGUpOwpAQCAtMTMyMiw2ICsxMzI3LDcgQEAKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwogCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gKHN0cnVjdCBodGJfY2xhc3MgKilhcmc7CisJdW5zaWduZWQgaW50IHFsZW47CiAKIAkvLyBUT0RPOiB3aHkgZG9uJ3QgYWxsb3cgdG8gZGVsZXRlIHN1YnRyZWUgPyByZWZlcmVuY2VzID8gZG9lcwogCS8vIHRjIHN1YnN5cyBxdWFyYW50ZWUgdXMgdGhhdCBpbiBodGJfZGVzdHJveSBpdCBob2xkcyBubyBjbGFzcwpAQCAtMTMzNCw2ICsxMzQwLDEyIEBACiAJLyogZGVsZXRlIGZyb20gaGFzaCBhbmQgYWN0aXZlOyByZW1haW5kZXIgaW4gZGVzdHJveV9jbGFzcyAqLwogCWhsaXN0X2RlbF9pbml0KCZjbC0+aGxpc3QpOwogCisJaWYgKCFjbC0+bGV2ZWwpIHsKKwkJcWxlbiA9IGNsLT51bi5sZWFmLnEtPnEucWxlbjsKKwkJcWRpc2NfcmVzZXQoY2wtPnVuLmxlYWYucSk7CisJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihjbC0+dW4ubGVhZi5xLCBxbGVuKTsKKwl9CisKIAlpZiAoY2wtPnByaW9fYWN0aXZpdHkpCiAJCWh0Yl9kZWFjdGl2YXRlKHEsIGNsKTsKIApAQCAtMTQxMCwxMSArMTQyMiwxNCBAQAogCQkvKiBjcmVhdGUgbGVhZiBxZGlzYyBlYXJseSBiZWNhdXNlIGl0IHVzZXMga21hbGxvYyhHRlBfS0VSTkVMKQogCQkgICBzbyB0aGF0IGNhbid0IGJlIHVzZWQgaW5zaWRlIG9mIHNjaF90cmVlX2xvY2sKIAkJICAgLS0gdGhhbmtzIHRvIEthcmxpcyBQZWlzZW5pZWtzICovCi0JCW5ld19xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCQluZXdfcSA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLCBjbGFzc2lkKTsKIAkJc2NoX3RyZWVfbG9jayhzY2gpOwogCQlpZiAocGFyZW50ICYmICFwYXJlbnQtPmxldmVsKSB7CisJCQl1bnNpZ25lZCBpbnQgcWxlbiA9IHBhcmVudC0+dW4ubGVhZi5xLT5xLnFsZW47CisKIAkJCS8qIHR1cm4gcGFyZW50IGludG8gaW5uZXIgbm9kZSAqLwotCQkJc2NoLT5xLnFsZW4gLT0gcGFyZW50LT51bi5sZWFmLnEtPnEucWxlbjsKKwkJCXFkaXNjX3Jlc2V0KHBhcmVudC0+dW4ubGVhZi5xKTsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihwYXJlbnQtPnVuLmxlYWYucSwgcWxlbik7CiAJCQlxZGlzY19kZXN0cm95KHBhcmVudC0+dW4ubGVhZi5xKTsKIAkJCWlmIChwYXJlbnQtPnByaW9fYWN0aXZpdHkpCiAJCQkJaHRiX2RlYWN0aXZhdGUocSwgcGFyZW50KTsKQEAgLTE1NjIsNiArMTU3Nyw3IEBACiBzdGF0aWMgc3RydWN0IFFkaXNjX2NsYXNzX29wcyBodGJfY2xhc3Nfb3BzID0gewogCS5ncmFmdAkJPQlodGJfZ3JhZnQsCiAJLmxlYWYJCT0JaHRiX2xlYWYsCisJLnFsZW5fbm90aWZ5CT0JaHRiX3FsZW5fbm90aWZ5LAogCS5nZXQJCT0JaHRiX2dldCwKIAkucHV0CQk9CWh0Yl9wdXQsCiAJLmNoYW5nZQkJPQlodGJfY2hhbmdlX2NsYXNzLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCmluZGV4IDA0NDE4NzYuLjc5NTQyYWYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYworKysgYi9uZXQvc2NoZWQvc2NoX25ldGVtLmMKQEAgLTI4NywxMyArMjg3LDEwIEBACiAJCQlwc2NoZWRfdGRpZmZfdCBkZWxheSA9IFBTQ0hFRF9URElGRihjYi0+dGltZV90b19zZW5kLCBub3cpOwogCiAJCQlpZiAocS0+cWRpc2MtPm9wcy0+cmVxdWV1ZShza2IsIHEtPnFkaXNjKSAhPSBORVRfWE1JVF9TVUNDRVNTKSB7CisJCQkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHEtPnFkaXNjLCAxKTsKIAkJCQlzY2gtPnFzdGF0cy5kcm9wcysrOwotCi0JCQkJLyogQWZ0ZXIgdGhpcyBxbGVuIGlzIGNvbmZ1c2VkICovCiAJCQkJcHJpbnRrKEtFUk5fRVJSICJuZXRlbTogcXVldWUgZGlzY3BsaW5lICVzIGNvdWxkIG5vdCByZXF1ZXVlXG4iLAogCQkJCSAgICAgICBxLT5xZGlzYy0+b3BzLT5pZCk7Ci0KLQkJCQlzY2gtPnEucWxlbi0tOwogCQkJfQogCiAJCQltb2RfdGltZXIoJnEtPnRpbWVyLCBqaWZmaWVzICsgUFNDSEVEX1VTMkpJRkZJRShkZWxheSkpOwpAQCAtNTc0LDcgKzU3MSw4IEBACiAJcS0+dGltZXIuZnVuY3Rpb24gPSBuZXRlbV93YXRjaGRvZzsKIAlxLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNjaDsKIAotCXEtPnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZ0Zmlmb19xZGlzY19vcHMpOworCXEtPnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZ0Zmlmb19xZGlzY19vcHMsCisJCQkJICAgICBUQ19IX01BS0Uoc2NoLT5oYW5kbGUsIDEpKTsKIAlpZiAoIXEtPnFkaXNjKSB7CiAJCXByX2RlYnVnKCJuZXRlbTogcWRpc2MgY3JlYXRlIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjYxLDggKzY1OSw4IEBACiAKIAlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJKm9sZCA9IHhjaGcoJnEtPnFkaXNjLCBuZXcpOworCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbigqb2xkLCAoKm9sZCktPnEucWxlbik7CiAJcWRpc2NfcmVzZXQoKm9sZCk7Ci0Jc2NoLT5xLnFsZW4gPSAwOwogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3ByaW8uYyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCmluZGV4IGE1ZmEwM2MuLjI1NjdiNGMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCkBAIC0yMjIsMjEgKzIyMiwyNyBAQAogCiAJZm9yIChpPXEtPmJhbmRzOyBpPFRDUV9QUklPX0JBTkRTOyBpKyspIHsKIAkJc3RydWN0IFFkaXNjICpjaGlsZCA9IHhjaGcoJnEtPnF1ZXVlc1tpXSwgJm5vb3BfcWRpc2MpOwotCQlpZiAoY2hpbGQgIT0gJm5vb3BfcWRpc2MpCisJCWlmIChjaGlsZCAhPSAmbm9vcF9xZGlzYykgeworCQkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKGNoaWxkLCBjaGlsZC0+cS5xbGVuKTsKIAkJCXFkaXNjX2Rlc3Ryb3koY2hpbGQpOworCQl9CiAJfQogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCiAJZm9yIChpPTA7IGk8cS0+YmFuZHM7IGkrKykgewogCQlpZiAocS0+cXVldWVzW2ldID09ICZub29wX3FkaXNjKSB7CiAJCQlzdHJ1Y3QgUWRpc2MgKmNoaWxkOwotCQkJY2hpbGQgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJCQljaGlsZCA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLAorCQkJCQkJICBUQ19IX01BS0Uoc2NoLT5oYW5kbGUsIGkgKyAxKSk7CiAJCQlpZiAoY2hpbGQpIHsKIAkJCQlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJCQkJY2hpbGQgPSB4Y2hnKCZxLT5xdWV1ZXNbaV0sIGNoaWxkKTsKIAotCQkJCWlmIChjaGlsZCAhPSAmbm9vcF9xZGlzYykKKwkJCQlpZiAoY2hpbGQgIT0gJm5vb3BfcWRpc2MpIHsKKwkJCQkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKGNoaWxkLAorCQkJCQkJCQkgY2hpbGQtPnEucWxlbik7CiAJCQkJCXFkaXNjX2Rlc3Ryb3koY2hpbGQpOworCQkJCX0KIAkJCQlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAkJCX0KIAkJfQpAQCAtMjk0LDcgKzMwMCw3IEBACiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCSpvbGQgPSBxLT5xdWV1ZXNbYmFuZF07CiAJcS0+cXVldWVzW2JhbmRdID0gbmV3OwotCXNjaC0+cS5xbGVuIC09ICgqb2xkKS0+cS5xbGVuOworCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbigqb2xkLCAoKm9sZCktPnEucWxlbik7CiAJcWRpc2NfcmVzZXQoKm9sZCk7CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcmVkLmMgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCmluZGV4IGQ2NWNhZGQuLmFjZGRhZDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcmVkLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9yZWQuYwpAQCAtMTc1LDEyICsxNzUsMTQgQEAKIAlxZGlzY19kZXN0cm95KHEtPnFkaXNjKTsKIH0KIAotc3RhdGljIHN0cnVjdCBRZGlzYyAqcmVkX2NyZWF0ZV9kZmx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsaW1pdCkKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKnJlZF9jcmVhdGVfZGZsdChzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGxpbWl0KQogewotCXN0cnVjdCBRZGlzYyAqcSA9IHFkaXNjX2NyZWF0ZV9kZmx0KGRldiwgJmJmaWZvX3FkaXNjX29wcyk7CisJc3RydWN0IFFkaXNjICpxOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAlpbnQgcmV0OwogCisJcSA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmYmZpZm9fcWRpc2Nfb3BzLAorCQkJICAgICAgVENfSF9NQUtFKHNjaC0+aGFuZGxlLCAxKSk7CiAJaWYgKHEpIHsKIAkJcnRhID0ga21hbGxvYyhSVEFfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNfZmlmb19xb3B0KSksCiAJCSAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CkBAIC0yMTksNyArMjIxLDcgQEAKIAljdGwgPSBSVEFfREFUQSh0YltUQ0FfUkVEX1BBUk1TLTFdKTsKIAogCWlmIChjdGwtPmxpbWl0ID4gMCkgewotCQljaGlsZCA9IHJlZF9jcmVhdGVfZGZsdChzY2gtPmRldiwgY3RsLT5saW1pdCk7CisJCWNoaWxkID0gcmVkX2NyZWF0ZV9kZmx0KHNjaCwgY3RsLT5saW1pdCk7CiAJCWlmIChjaGlsZCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjI3LDggKzIyOSwxMCBAQAogCXNjaF90cmVlX2xvY2soc2NoKTsKIAlxLT5mbGFncyA9IGN0bC0+ZmxhZ3M7CiAJcS0+bGltaXQgPSBjdGwtPmxpbWl0OwotCWlmIChjaGlsZCkKKwlpZiAoY2hpbGQpIHsKKwkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHEtPnFkaXNjLCBxLT5xZGlzYy0+cS5xbGVuKTsKIAkJcWRpc2NfZGVzdHJveSh4Y2hnKCZxLT5xZGlzYywgY2hpbGQpKTsKKwl9CiAKIAlyZWRfc2V0X3Bhcm1zKCZxLT5wYXJtcywgY3RsLT5xdGhfbWluLCBjdGwtPnF0aF9tYXgsIGN0bC0+V2xvZywKIAkJCQkgY3RsLT5QbG9nLCBjdGwtPlNjZWxsX2xvZywKQEAgLTMwNiw4ICszMTAsOCBAQAogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCSpvbGQgPSB4Y2hnKCZxLT5xZGlzYywgbmV3KTsKKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCXFkaXNjX3Jlc2V0KCpvbGQpOwotCXNjaC0+cS5xbGVuID0gMDsKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfc2ZxLmMgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCmluZGV4IGQwZDZlNTkuLjQ1OWNkYTIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfc2ZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwpAQCAtMzkzLDYgKzM5Myw3IEBACiB7CiAJc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCXN0cnVjdCB0Y19zZnFfcW9wdCAqY3RsID0gUlRBX0RBVEEob3B0KTsKKwl1bnNpZ25lZCBpbnQgcWxlbjsKIAogCWlmIChvcHQtPnJ0YV9sZW4gPCBSVEFfTEVOR1RIKHNpemVvZigqY3RsKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDAzLDggKzQwNCwxMCBAQAogCWlmIChjdGwtPmxpbWl0KQogCQlxLT5saW1pdCA9IG1pbl90KHUzMiwgY3RsLT5saW1pdCwgU0ZRX0RFUFRIKTsKIAorCXFsZW4gPSBzY2gtPnEucWxlbjsKIAl3aGlsZSAoc2NoLT5xLnFsZW4gPj0gcS0+bGltaXQtMSkKIAkJc2ZxX2Ryb3Aoc2NoKTsKKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oc2NoLCBxbGVuIC0gc2NoLT5xLnFsZW4pOwogCiAJZGVsX3RpbWVyKCZxLT5wZXJ0dXJiX3RpbWVyKTsKIAlpZiAocS0+cGVydHVyYl9wZXJpb2QpIHsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGJmLmMgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCmluZGV4IGQ5YTVkMjkuLmVkOWI2ZDkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGJmLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90YmYuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAKIAkJaWYgKHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykgIT0gTkVUX1hNSVRfU1VDQ0VTUykgewogCQkJLyogV2hlbiByZXF1ZXVlIGZhaWxzIHNrYiBpcyBkcm9wcGVkICovCi0JCQlzY2gtPnEucWxlbi0tOworCQkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHEtPnFkaXNjLCAxKTsKIAkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CiAJCX0KIApAQCAtMjczLDEyICsyNzMsMTQgQEAKIAlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBRZGlzYyAqdGJmX2NyZWF0ZV9kZmx0X3FkaXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsaW1pdCkKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKnRiZl9jcmVhdGVfZGZsdF9xZGlzYyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGxpbWl0KQogewotCXN0cnVjdCBRZGlzYyAqcSA9IHFkaXNjX2NyZWF0ZV9kZmx0KGRldiwgJmJmaWZvX3FkaXNjX29wcyk7CisJc3RydWN0IFFkaXNjICpxOwogICAgICAgICBzdHJ1Y3QgcnRhdHRyICpydGE7CiAJaW50IHJldDsKIAorCXEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJmJmaWZvX3FkaXNjX29wcywKKwkJCSAgICAgIFRDX0hfTUFLRShzY2gtPmhhbmRsZSwgMSkpOwogCWlmIChxKSB7CiAJCXJ0YSA9IGttYWxsb2MoUlRBX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjX2ZpZm9fcW9wdCkpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJ0YSkgewpAQCAtMzQxLDEzICszNDMsMTUgQEAKIAkJZ290byBkb25lOwogCiAJaWYgKHFvcHQtPmxpbWl0ID4gMCkgewotCQlpZiAoKGNoaWxkID0gdGJmX2NyZWF0ZV9kZmx0X3FkaXNjKHNjaC0+ZGV2LCBxb3B0LT5saW1pdCkpID09IE5VTEwpCisJCWlmICgoY2hpbGQgPSB0YmZfY3JlYXRlX2RmbHRfcWRpc2Moc2NoLCBxb3B0LT5saW1pdCkpID09IE5VTEwpCiAJCQlnb3RvIGRvbmU7CiAJfQogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwotCWlmIChjaGlsZCkKKwlpZiAoY2hpbGQpIHsKKwkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHEtPnFkaXNjLCBxLT5xZGlzYy0+cS5xbGVuKTsKIAkJcWRpc2NfZGVzdHJveSh4Y2hnKCZxLT5xZGlzYywgY2hpbGQpKTsKKwl9CiAJcS0+bGltaXQgPSBxb3B0LT5saW1pdDsKIAlxLT5tdHUgPSBxb3B0LT5tdHU7CiAJcS0+bWF4X3NpemUgPSBtYXhfc2l6ZTsKQEAgLTQ0OSw4ICs0NTMsOCBAQAogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCSpvbGQgPSB4Y2hnKCZxLT5xZGlzYywgbmV3KTsKKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCXFkaXNjX3Jlc2V0KCpvbGQpOwotCXNjaC0+cS5xbGVuID0gMDsKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMgYi9uZXQvc2N0cC9hc3NvY2lvbGEuYwppbmRleCBlZDA0NDVmLi4zOTQ3MWQzIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9hc3NvY2lvbGEuYworKysgYi9uZXQvc2N0cC9hc3NvY2lvbGEuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAJCQkJICIgcG9ydDogJWRcbiIsCiAJCQkJIGFzb2MsCiAJCQkJICgmcGVlci0+aXBhZGRyKSwKLQkJCQkgcGVlci0+aXBhZGRyLnY0LnNpbl9wb3J0KTsKKwkJCQkgbnRvaHMocGVlci0+aXBhZGRyLnY0LnNpbl9wb3J0KSk7CiAKIAkvKiBJZiB3ZSBhcmUgdG8gcmVtb3ZlIHRoZSBjdXJyZW50IHJldHJhbl9wYXRoLCB1cGRhdGUgaXQKIAkgKiB0byB0aGUgbmV4dCBwZWVyIGJlZm9yZSByZW1vdmluZyB0aGlzIHBlZXIgZnJvbSB0aGUgbGlzdC4KQEAgLTUzNywxMyArNTM3LDEzIEBACiAJc3AgPSBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spOwogCiAJLyogQUZfSU5FVCBhbmQgQUZfSU5FVDYgc2hhcmUgY29tbW9uIHBvcnQgZmllbGQuICovCi0JcG9ydCA9IGFkZHItPnY0LnNpbl9wb3J0OworCXBvcnQgPSBudG9ocyhhZGRyLT52NC5zaW5fcG9ydCk7CiAKIAlTQ1RQX0RFQlVHX1BSSU5US19JUEFERFIoInNjdHBfYXNzb2NfYWRkX3BlZXI6YXNzb2NpYXRpb24gJXAgYWRkcjogIiwKIAkJCQkgIiBwb3J0OiAlZCBzdGF0ZTolZFxuIiwKIAkJCQkgYXNvYywKIAkJCQkgYWRkciwKLQkJCQkgYWRkci0+djQuc2luX3BvcnQsCisJCQkJIHBvcnQsCiAJCQkJIHBlZXJfc3RhdGUpOwogCiAJLyogU2V0IHRoZSBwb3J0IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQgeWV0LiAgKi8KQEAgLTcwOSw2ICs3MDksNyBAQAogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqZmlyc3Q7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzZWNvbmQ7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCWludCBzcGNfc3RhdGUgPSAwOwogCkBAIC03MzEsOCArNzMyLDkgQEAKIAkvKiBHZW5lcmF0ZSBhbmQgc2VuZCBhIFNDVFBfUEVFUl9BRERSX0NIQU5HRSBub3RpZmljYXRpb24gdG8gdGhlCiAJICogdXNlci4KIAkgKi8KLQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9wZWVyX2FkZHJfY2hhbmdlKGFzb2MsCi0JCQkJKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopICZ0cmFuc3BvcnQtPmlwYWRkciwKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpOworCW1lbWNweSgmYWRkciwgJnRyYW5zcG9ydC0+aXBhZGRyLCB0cmFuc3BvcnQtPmFmX3NwZWNpZmljLT5zb2NrYWRkcl9sZW4pOworCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX3BlZXJfYWRkcl9jaGFuZ2UoYXNvYywgJmFkZHIsCiAJCQkJMCwgc3BjX3N0YXRlLCBlcnJvciwgR0ZQX0FUT01JQyk7CiAJaWYgKGV2ZW50KQogCQlzY3RwX3VscHFfdGFpbF9ldmVudCgmYXNvYy0+dWxwcSwgZXZlbnQpOwpAQCAtODY4LDcgKzg3MCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpwb3M7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOwotCV9fdTMyIGtleSA9IGh0b25sKHRzbik7CisJX19iZTMyIGtleSA9IGh0b25sKHRzbik7CiAKIAltYXRjaCA9IE5VTEw7CiAKQEAgLTkyNiw4ICs5MjgsOCBAQAogCiAJc2N0cF9yZWFkX2xvY2soJmFzb2MtPmJhc2UuYWRkcl9sb2NrKTsKIAotCWlmICgoYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydCA9PSBsYWRkci0+djQuc2luX3BvcnQpICYmCi0JICAgIChhc29jLT5wZWVyLnBvcnQgPT0gcGFkZHItPnY0LnNpbl9wb3J0KSkgeworCWlmICgoaHRvbnMoYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydCkgPT0gbGFkZHItPnY0LnNpbl9wb3J0KSAmJgorCSAgICAoaHRvbnMoYXNvYy0+cGVlci5wb3J0KSA9PSBwYWRkci0+djQuc2luX3BvcnQpKSB7CiAJCXRyYW5zcG9ydCA9IHNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKGFzb2MsIHBhZGRyKTsKIAkJaWYgKCF0cmFuc3BvcnQpCiAJCQlnb3RvIG91dDsKQEAgLTExMzUsNyArMTEzNyw3IEBACiAJCQkJICIgcG9ydDogJWRcbiIsCiAJCQkJIGFzb2MsCiAJCQkJICgmdC0+aXBhZGRyKSwKLQkJCQkgdC0+aXBhZGRyLnY0LnNpbl9wb3J0KTsKKwkJCQkgbnRvaHModC0+aXBhZGRyLnY0LnNpbl9wb3J0KSk7CiB9CiAKIC8qIENob29zZSB0aGUgdHJhbnNwb3J0IGZvciBzZW5kaW5nIGEgSU5JVCBwYWNrZXQuICAqLwpAQCAtMTE2MCw3ICsxMTYyLDcgQEAKIAkJCQkgIiBwb3J0OiAlZFxuIiwKIAkJCQkgYXNvYywKIAkJCQkgKCZ0LT5pcGFkZHIpLAotCQkJCSB0LT5pcGFkZHIudjQuc2luX3BvcnQpOworCQkJCSBudG9ocyh0LT5pcGFkZHIudjQuc2luX3BvcnQpKTsKIAogCXJldHVybiB0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvYmluZF9hZGRyLmMgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwppbmRleCAyYjljMTJhLi4wMDk5NDE1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9iaW5kX2FkZHIuYworKysgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJICogQm90aCB2NCBhbmQgdjYgaGF2ZSB0aGUgcG9ydCBhdCB0aGUgc2FtZSBvZmZzZXQuCiAJICovCiAJaWYgKCFhZGRyLT5hLnY0LnNpbl9wb3J0KQotCQlhZGRyLT5hLnY0LnNpbl9wb3J0ID0gYnAtPnBvcnQ7CisJCWFkZHItPmEudjQuc2luX3BvcnQgPSBodG9ucyhicC0+cG9ydCk7CiAKIAlhZGRyLT51c2VfYXNfc3JjID0gdXNlX2FzX3NyYzsKIApAQCAtMjc1LDcgKzI3NSw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWFmLT5mcm9tX2FkZHJfcGFyYW0oJmFkZHIsIHJhd2FkZHIsIHBvcnQsIDApOworCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCByYXdhZGRyLCBodG9ucyhwb3J0KSwgMCk7CiAJCXJldHZhbCA9IHNjdHBfYWRkX2JpbmRfYWRkcihicCwgJmFkZHIsIDEsIGdmcCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCS8qIENhbid0IGZpbmlzaCBidWlsZGluZyB0aGUgbGlzdCwgY2xlYW4gdXAuICovCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9lbmRwb2ludG9sYS5jIGIvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYwppbmRleCA5YjZiMzk0Li4zM2E0MmU5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCisrKyBiL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKQEAgLTcyLDYgKzcyLDEwIEBACiB7CiAJbWVtc2V0KGVwLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfZW5kcG9pbnQpKTsKIAorCWVwLT5kaWdlc3QgPSBremFsbG9jKFNDVFBfU0lHTkFUVVJFX1NJWkUsIGdmcCk7CisJaWYgKCFlcC0+ZGlnZXN0KQorCQlyZXR1cm4gTlVMTDsKKwogCS8qIEluaXRpYWxpemUgdGhlIGJhc2Ugc3RydWN0dXJlLiAqLwogCS8qIFdoYXQgdHlwZSBvZiBlbmRwb2ludCBhcmUgd2U/ICAqLwogCWVwLT5iYXNlLnR5cGUgPSBTQ1RQX0VQX1RZUEVfU09DS0VUOwpAQCAtMTgyLDYgKzE4Niw5IEBACiAJLyogRnJlZSB1cCB0aGUgSE1BQyB0cmFuc2Zvcm0uICovCiAJY3J5cHRvX2ZyZWVfaGFzaChzY3RwX3NrKGVwLT5iYXNlLnNrKS0+aG1hYyk7CiAKKwkvKiBGcmVlIHRoZSBkaWdlc3QgYnVmZmVyICovCisJa2ZyZWUoZXAtPmRpZ2VzdCk7CisKIAkvKiBDbGVhbnVwLiAqLwogCXNjdHBfaW5xX2ZyZWUoJmVwLT5iYXNlLmlucXVldWUpOwogCXNjdHBfYmluZF9hZGRyX2ZyZWUoJmVwLT5iYXNlLmJpbmRfYWRkcik7CkBAIC0yMjMsNyArMjMwLDcgQEAKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqcmV0dmFsOwogCiAJc2N0cF9yZWFkX2xvY2soJmVwLT5iYXNlLmFkZHJfbG9jayk7Ci0JaWYgKGVwLT5iYXNlLmJpbmRfYWRkci5wb3J0ID09IGxhZGRyLT52NC5zaW5fcG9ydCkgeworCWlmIChodG9ucyhlcC0+YmFzZS5iaW5kX2FkZHIucG9ydCkgPT0gbGFkZHItPnY0LnNpbl9wb3J0KSB7CiAJCWlmIChzY3RwX2JpbmRfYWRkcl9tYXRjaCgmZXAtPmJhc2UuYmluZF9hZGRyLCBsYWRkciwKIAkJCQkJIHNjdHBfc2soZXAtPmJhc2Uuc2spKSkgewogCQkJcmV0dmFsID0gZXA7CkBAIC0yNTEsNyArMjU4LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAKLQlycG9ydCA9IHBhZGRyLT52NC5zaW5fcG9ydDsKKwlycG9ydCA9IG50b2hzKHBhZGRyLT52NC5zaW5fcG9ydCk7CiAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmVwLT5hc29jcykgewogCQlhc29jID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uLCBhc29jcyk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnB1dC5jIGIvbmV0L3NjdHAvaW5wdXQuYwppbmRleCA2ZDgyZjQwLi4zMzExMTg3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnB1dC5jCisrKyBiL25ldC9zY3RwL2lucHV0LmMKQEAgLTcyNiw3ICs3MjYsNyBAQAogCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKIAlpbnQgaGFzaDsKIAotCWhhc2ggPSBzY3RwX2VwX2hhc2hmbihsYWRkci0+djQuc2luX3BvcnQpOworCWhhc2ggPSBzY3RwX2VwX2hhc2hmbihudG9ocyhsYWRkci0+djQuc2luX3BvcnQpKTsKIAloZWFkID0gJnNjdHBfZXBfaGFzaHRhYmxlW2hhc2hdOwogCXJlYWRfbG9jaygmaGVhZC0+bG9jayk7CiAJZm9yIChlcGIgPSBoZWFkLT5jaGFpbjsgZXBiOyBlcGIgPSBlcGItPm5leHQpIHsKQEAgLTgzMCw3ICs4MzAsNyBAQAogCS8qIE9wdGltaXplIGhlcmUgZm9yIGRpcmVjdCBoaXQsIG9ubHkgbGlzdGVuaW5nIGNvbm5lY3Rpb25zIGNhbgogCSAqIGhhdmUgd2lsZGNhcmRzIGFueXdheXMuCiAJICovCi0JaGFzaCA9IHNjdHBfYXNzb2NfaGFzaGZuKGxvY2FsLT52NC5zaW5fcG9ydCwgcGVlci0+djQuc2luX3BvcnQpOworCWhhc2ggPSBzY3RwX2Fzc29jX2hhc2hmbihudG9ocyhsb2NhbC0+djQuc2luX3BvcnQpLCBudG9ocyhwZWVyLT52NC5zaW5fcG9ydCkpOwogCWhlYWQgPSAmc2N0cF9hc3NvY19oYXNodGFibGVbaGFzaF07CiAJcmVhZF9sb2NrKCZoZWFkLT5sb2NrKTsKIAlmb3IgKGVwYiA9IGhlYWQtPmNoYWluOyBlcGI7IGVwYiA9IGVwYi0+bmV4dCkgewpAQCAtOTU3LDcgKzk1Nyw3IEBACiAJCWlmICghYWYpCiAJCQljb250aW51ZTsKIAotCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKHBhZGRyLCBwYXJhbXMuYWRkciwgbnRvaHMoc2gtPnNvdXJjZSksIDApOworCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKHBhZGRyLCBwYXJhbXMuYWRkciwgc2gtPnNvdXJjZSwgMCk7CiAKIAkJYXNvYyA9IF9fc2N0cF9sb29rdXBfYXNzb2NpYXRpb24obGFkZHIsIHBhZGRyLCAmdHJhbnNwb3J0KTsKIAkJaWYgKGFzb2MpCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggNzgwNzFjNi4uM2MzZTU2MCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtODQsNyArODQsNyBAQAogCiAvKiBJQ01QIGVycm9yIGhhbmRsZXIuICovCiBTQ1RQX1NUQVRJQyB2b2lkIHNjdHBfdjZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCQkJICAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCisJCQkgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOwpAQCAtMTcwLDggKzE3MCw2IEBACiAJCWZsLm9pZiA9IHRyYW5zcG9ydC0+c2FkZHIudjYuc2luNl9zY29wZV9pZDsKIAllbHNlCiAJCWZsLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7Ci0JZmwuZmxfaXBfc3BvcnQgPSBpbmV0X3NrKHNrKS0+c3BvcnQ7Ci0JZmwuZmxfaXBfZHBvcnQgPSB0cmFuc3BvcnQtPmlwYWRkci52Ni5zaW42X3BvcnQ7CiAKIAlpZiAobnAtPm9wdCAmJiBucC0+b3B0LT5zcmNydCkgewogCQlzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopIG5wLT5vcHQtPnNyY3J0OwpAQCAtMjM5LDcgKzIzNyw3IEBACiAJaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykgewotCQlfX3UzMiBhMXhvcmEyOworCQlfX2JlMzIgYTF4b3JhMjsKIAogCQlhMXhvcmEyID0gYTEtPnM2X2FkZHIzMltpXSBeIGEyLT5zNl9hZGRyMzJbaV07CiAKQEAgLTM1MCw3ICszNDgsNyBAQAogCQkJICAgICBpbnQgaXNfc2FkZHIpCiB7CiAJdm9pZCAqZnJvbTsKLQlfX3UxNiAqcG9ydDsKKwlfX2JlMTYgKnBvcnQ7CiAJc3RydWN0IHNjdHBoZHIgKnNoOwogCiAJcG9ydCA9ICZhZGRyLT52Ni5zaW42X3BvcnQ7CkBAIC0zNjAsMTAgKzM1OCwxMCBAQAogCiAJc2ggPSAoc3RydWN0IHNjdHBoZHIgKikgc2tiLT5oLnJhdzsKIAlpZiAoaXNfc2FkZHIpIHsKLQkJKnBvcnQgID0gbnRvaHMoc2gtPnNvdXJjZSk7CisJCSpwb3J0ICA9IHNoLT5zb3VyY2U7CiAJCWZyb20gPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CiAJfSBlbHNlIHsKLQkJKnBvcnQgPSBudG9ocyhzaC0+ZGVzdCk7CisJCSpwb3J0ID0gc2gtPmRlc3Q7CiAJCWZyb20gPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CiAJfQogCWlwdjZfYWRkcl9jb3B5KCZhZGRyLT52Ni5zaW42X2FkZHIsIGZyb20pOwpAQCAtMzczLDcgKzM3MSw3IEBACiBzdGF0aWMgdm9pZCBzY3RwX3Y2X2Zyb21fc2sodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc29jayAqc2spCiB7CiAJYWRkci0+djYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKLQlhZGRyLT52Ni5zaW42X3BvcnQgPSBpbmV0X3NrKHNrKS0+bnVtOworCWFkZHItPnY2LnNpbjZfcG9ydCA9IDA7CiAJYWRkci0+djYuc2luNl9hZGRyID0gaW5ldDZfc2soc2spLT5yY3Zfc2FkZHI7CiB9CiAKQEAgLTQwNyw3ICs0MDUsNyBAQAogLyogSW5pdGlhbGl6ZSBhIHNjdHBfYWRkciBmcm9tIGFuIGFkZHJlc3MgcGFyYW1ldGVyLiAqLwogc3RhdGljIHZvaWQgc2N0cF92Nl9mcm9tX2FkZHJfcGFyYW0odW5pb24gc2N0cF9hZGRyICphZGRyLAogCQkJCSAgICB1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKnBhcmFtLAotCQkJCSAgICBfX3UxNiBwb3J0LCBpbnQgaWlmKQorCQkJCSAgICBfX2JlMTYgcG9ydCwgaW50IGlpZikKIHsKIAlhZGRyLT52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogCWFkZHItPnY2LnNpbjZfcG9ydCA9IHBvcnQ7CkBAIC00MjUsNyArNDIzLDcgQEAKIAlpbnQgbGVuZ3RoID0gc2l6ZW9mKHNjdHBfaXB2NmFkZHJfcGFyYW1fdCk7CiAKIAlwYXJhbS0+djYucGFyYW1faGRyLnR5cGUgPSBTQ1RQX1BBUkFNX0lQVjZfQUREUkVTUzsKLQlwYXJhbS0+djYucGFyYW1faGRyLmxlbmd0aCA9IG50b2hzKGxlbmd0aCk7CisJcGFyYW0tPnY2LnBhcmFtX2hkci5sZW5ndGggPSBodG9ucyhsZW5ndGgpOwogCWlwdjZfYWRkcl9jb3B5KCZwYXJhbS0+djYuYWRkciwgJmFkZHItPnY2LnNpbjZfYWRkcik7CiAKIAlyZXR1cm4gbGVuZ3RoOwpAQCAtNDMzLDcgKzQzMSw3IEBACiAKIC8qIEluaXRpYWxpemUgYSBzY3RwX2FkZHIgZnJvbSBhIGRzdF9lbnRyeS4gKi8KIHN0YXRpYyB2b2lkIHNjdHBfdjZfZHN0X3NhZGRyKHVuaW9uIHNjdHBfYWRkciAqYWRkciwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAotCQkJICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCkKKwkJCSAgICAgIF9fYmUxNiBwb3J0KQogewogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OwogCWFkZHItPnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2OwpAQCAtNDgwLDcgKzQ3OCw3IEBACiB9CiAKIC8qIEluaXRpYWxpemUgYWRkciBzdHJ1Y3QgdG8gSU5BRERSX0FOWS4gKi8KLXN0YXRpYyB2b2lkIHNjdHBfdjZfaW5hZGRyX2FueSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHVuc2lnbmVkIHNob3J0IHBvcnQpCitzdGF0aWMgdm9pZCBzY3RwX3Y2X2luYWRkcl9hbnkodW5pb24gc2N0cF9hZGRyICphZGRyLCBfX2JlMTYgcG9ydCkKIHsKIAltZW1zZXQoYWRkciwgMHgwMCwgc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcikpOwogCWFkZHItPnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CkBAIC04NTUsNyArODUzLDcgQEAKICAqIFJldHVybnMgbnVtYmVyIG9mIGFkZHJlc3NlcyBzdXBwb3J0ZWQuCiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9pbmV0Nl9zdXBwb3J0ZWRfYWRkcnMoY29uc3Qgc3RydWN0IHNjdHBfc29jayAqb3B0LAotCQkJCSAgICAgIF9fdTE2ICp0eXBlcykKKwkJCQkgICAgICBfX2JlMTYgKnR5cGVzKQogewogCXR5cGVzWzBdID0gU0NUUF9QQVJBTV9JUFY0X0FERFJFU1M7CiAJdHlwZXNbMV0gPSBTQ1RQX1BBUkFNX0lQVjZfQUREUkVTUzsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHF1ZXVlLmMgYi9uZXQvc2N0cC9vdXRxdWV1ZS5jCmluZGV4IDczOTU4MjQuLmZiYTU2N2EgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkgKiBBKSBJbml0aWFsaXplIHRoZSBjYWNjX3Nhd19uZXdhY2sgdG8gMCBmb3IgYWxsIGRlc3RpbmF0aW9uCiAJICogYWRkcmVzc2VzLgogCSAqLwotCWlmIChzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MgPiAwICYmCisJaWYgKHNhY2stPm51bV9nYXBfYWNrX2Jsb2NrcyAmJgogCSAgICBwcmltYXJ5LT5jYWNjLmNoYW5nZW92ZXJfYWN0aXZlKSB7CiAJCWxpc3RfZm9yX2VhY2gocG9zLCB0cmFuc3BvcnRfbGlzdCkgewogCQkJdHJhbnNwb3J0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwKQEAgLTE2MzIsNyArMTYzMiw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNjdHBfZ2V0X3NraXBfcG9zKHN0cnVjdCBzY3RwX2Z3ZHRzbl9za2lwICpza2lwbGlzdCwKLQkJCQkgICAgaW50IG5za2lwcywgX191MTYgc3RyZWFtKQorCQkJCSAgICBpbnQgbnNraXBzLCBfX2JlMTYgc3RyZWFtKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm9jLmMgYi9uZXQvc2N0cC9wcm9jLmMKaW5kZXggN2Y0OWU3Ni4uYjM0OTNiZCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvYy5jCisrKyBiL25ldC9zY3RwL3Byb2MuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmVwYi0+YmluZF9hZGRyLmFkZHJlc3NfbGlzdCkgewogCQlsYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7Ci0JCWFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopJmxhZGRyLT5hOworCQlhZGRyID0gJmxhZGRyLT5hOwogCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGFkZHItPnNhLnNhX2ZhbWlseSk7CiAJCWlmIChwcmltYXJ5ICYmIGFmLT5jbXBfYWRkcihhZGRyLCBwcmltYXJ5KSkgewogCQkJc2VxX3ByaW50ZihzZXEsICIqIik7CkBAIC0xNzcsMTAgKzE3NywxMCBAQAogCXVuaW9uIHNjdHBfYWRkciAqYWRkciwgKnByaW1hcnk7CiAJc3RydWN0IHNjdHBfYWYgKmFmOwogCi0JcHJpbWFyeSA9ICYoYXNzb2MtPnBlZXIucHJpbWFyeV9hZGRyKTsKKwlwcmltYXJ5ID0gJmFzc29jLT5wZWVyLnByaW1hcnlfYWRkcjsKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKIAkJdHJhbnNwb3J0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgdHJhbnNwb3J0cyk7Ci0JCWFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopJnRyYW5zcG9ydC0+aXBhZGRyOworCQlhZGRyID0gJnRyYW5zcG9ydC0+aXBhZGRyOwogCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGFkZHItPnNhLnNhX2ZhbWlseSk7CiAJCWlmIChhZi0+Y21wX2FkZHIoYWRkciwgcHJpbWFyeSkpIHsKIAkJCXNlcV9wcmludGYoc2VxLCAiKiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggNWI0ZjgyZi4uMTFmM2I1NCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAkJCSAgICAgaW50IGlzX3NhZGRyKQogewogCXZvaWQgKmZyb207Ci0JX191MTYgKnBvcnQ7CisJX19iZTE2ICpwb3J0OwogCXN0cnVjdCBzY3RwaGRyICpzaDsKIAogCXBvcnQgPSAmYWRkci0+djQuc2luX3BvcnQ7CkBAIC0yNTksMTAgKzI1OSwxMCBAQAogCiAJc2ggPSAoc3RydWN0IHNjdHBoZHIgKikgc2tiLT5oLnJhdzsKIAlpZiAoaXNfc2FkZHIpIHsKLQkJKnBvcnQgID0gbnRvaHMoc2gtPnNvdXJjZSk7CisJCSpwb3J0ICA9IHNoLT5zb3VyY2U7CiAJCWZyb20gPSAmc2tiLT5uaC5pcGgtPnNhZGRyOwogCX0gZWxzZSB7Ci0JCSpwb3J0ID0gbnRvaHMoc2gtPmRlc3QpOworCQkqcG9ydCA9IHNoLT5kZXN0OwogCQlmcm9tID0gJnNrYi0+bmguaXBoLT5kYWRkcjsKIAl9CiAJbWVtY3B5KCZhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIsIGZyb20sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwpAQCAtMjcyLDcgKzI3Miw3IEBACiBzdGF0aWMgdm9pZCBzY3RwX3Y0X2Zyb21fc2sodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc29jayAqc2spCiB7CiAJYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JYWRkci0+djQuc2luX3BvcnQgPSBpbmV0X3NrKHNrKS0+bnVtOworCWFkZHItPnY0LnNpbl9wb3J0ID0gMDsKIAlhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X3NrKHNrKS0+cmN2X3NhZGRyOwogfQogCkBAIC0yOTEsNyArMjkxLDcgQEAKIC8qIEluaXRpYWxpemUgYSBzY3RwX2FkZHIgZnJvbSBhbiBhZGRyZXNzIHBhcmFtZXRlci4gKi8KIHN0YXRpYyB2b2lkIHNjdHBfdjRfZnJvbV9hZGRyX3BhcmFtKHVuaW9uIHNjdHBfYWRkciAqYWRkciwKIAkJCQkgICAgdW5pb24gc2N0cF9hZGRyX3BhcmFtICpwYXJhbSwKLQkJCQkgICAgX191MTYgcG9ydCwgaW50IGlpZikKKwkJCQkgICAgX19iZTE2IHBvcnQsIGludCBpaWYpCiB7CiAJYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAJYWRkci0+djQuc2luX3BvcnQgPSBwb3J0OwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJaW50IGxlbmd0aCA9IHNpemVvZihzY3RwX2lwdjRhZGRyX3BhcmFtX3QpOwogCiAJcGFyYW0tPnY0LnBhcmFtX2hkci50eXBlID0gU0NUUF9QQVJBTV9JUFY0X0FERFJFU1M7Ci0JcGFyYW0tPnY0LnBhcmFtX2hkci5sZW5ndGggPSBudG9ocyhsZW5ndGgpOworCXBhcmFtLT52NC5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMobGVuZ3RoKTsKIAlwYXJhbS0+djQuYWRkci5zX2FkZHIgPSBhZGRyLT52NC5zaW5fYWRkci5zX2FkZHI7CQogCiAJcmV0dXJuIGxlbmd0aDsKQEAgLTMxNSw3ICszMTUsNyBAQAogCiAvKiBJbml0aWFsaXplIGEgc2N0cF9hZGRyIGZyb20gYSBkc3RfZW50cnkuICovCiBzdGF0aWMgdm9pZCBzY3RwX3Y0X2RzdF9zYWRkcih1bmlvbiBzY3RwX2FkZHIgKnNhZGRyLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCi0JCQkgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0KQorCQkJICAgICAgX19iZTE2IHBvcnQpCiB7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWRzdDsKIAlzYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC0zMzgsNyArMzM4LDcgQEAKIH0KIAogLyogSW5pdGlhbGl6ZSBhZGRyIHN0cnVjdCB0byBJTkFERFJfQU5ZLiAqLwotc3RhdGljIHZvaWQgc2N0cF92NF9pbmFkZHJfYW55KHVuaW9uIHNjdHBfYWRkciAqYWRkciwgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3N0YXRpYyB2b2lkIHNjdHBfdjRfaW5hZGRyX2FueSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIF9fYmUxNiBwb3J0KQogewogCWFkZHItPnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogCWFkZHItPnY0LnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CkBAIC00ODEsNyArNDgxLDcgQEAKIAkJCQkJICAgbGlzdCk7CiAJCQlpZiAoIWxhZGRyLT51c2VfYXNfc3JjKQogCQkJCWNvbnRpbnVlOwotCQkJc2N0cF92NF9kc3Rfc2FkZHIoJmRzdF9zYWRkciwgZHN0LCBicC0+cG9ydCk7CisJCQlzY3RwX3Y0X2RzdF9zYWRkcigmZHN0X3NhZGRyLCBkc3QsIGh0b25zKGJwLT5wb3J0KSk7CiAJCQlpZiAoc2N0cF92NF9jbXBfYWRkcigmZHN0X3NhZGRyLCAmbGFkZHItPmEpKQogCQkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQpAQCAtNTM4LDcgKzUzOCw3IEBACiAKIAlpZiAocnQpIHsKIAkJc2FkZHItPnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlzYWRkci0+djQuc2luX3BvcnQgPSBhc29jLT5iYXNlLmJpbmRfYWRkci5wb3J0OyAgCisJCXNhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGFzb2MtPmJhc2UuYmluZF9hZGRyLnBvcnQpOwogCQlzYWRkci0+djQuc2luX2FkZHIuc19hZGRyID0gcnQtPnJ0X3NyYzsgCiAJfQogfQpAQCAtNzkxLDcgKzc5MSw3IEBACiAgKiBjaHVua3MuICBSZXR1cm5zIG51bWJlciBvZiBhZGRyZXNzZXMgc3VwcG9ydGVkLgogICovCiBzdGF0aWMgaW50IHNjdHBfaW5ldF9zdXBwb3J0ZWRfYWRkcnMoY29uc3Qgc3RydWN0IHNjdHBfc29jayAqb3B0LAotCQkJCSAgICAgX191MTYgKnR5cGVzKQorCQkJCSAgICAgX19iZTE2ICp0eXBlcykKIHsKIAl0eXBlc1swXSA9IFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOwogCXJldHVybiAxOwpAQCAtODA4LDcgKzgwOCw3IEBACiAJCQkgIE5JUFFVQUQoKChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3QpLT5ydF9kc3QpKTsKIAogCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVFNDVFBQQUNLUyk7Ci0JcmV0dXJuIGlwX3F1ZXVlX3htaXQoc2tiLCBpcGZyYWdvayk7CisJcmV0dXJuIGlwX3F1ZXVlX3htaXQoc2tiLCBza2ItPnNrLCBpcGZyYWdvayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2N0cF9hZiBzY3RwX2lwdjRfc3BlY2lmaWM7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKaW5kZXggNTA3ZGZmNy4uMDQ5NTRlNSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCisrKyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwpAQCAtMTExLDcgKzExMSw3IEBACiAgKiBwcm92aWRlZCBjaHVuaywgYXMgbW9zdCBjYXVzZSBjb2RlcyB3aWxsIGJlIGVtYmVkZGVkIGluc2lkZSBhbgogICogYWJvcnQgY2h1bmsuCiAgKi8KLXZvaWQgIHNjdHBfaW5pdF9jYXVzZShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIF9fdTE2IGNhdXNlX2NvZGUsCit2b2lkICBzY3RwX2luaXRfY2F1c2Uoc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBfX2JlMTYgY2F1c2VfY29kZSwKIAkJICAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHBheWxlbikKIHsKIAlzY3RwX2Vycmhkcl90IGVycjsKQEAgLTE4Myw3ICsxODMsNyBAQAogCWludCBudW1fdHlwZXMsIGFkZHJzX2xlbiA9IDA7CiAJc3RydWN0IHNjdHBfc29jayAqc3A7CiAJc2N0cF9zdXBwb3J0ZWRfYWRkcnNfcGFyYW1fdCBzYXQ7Ci0JX191MTYgdHlwZXNbMl07CisJX19iZTE2IHR5cGVzWzJdOwogCXNjdHBfYWRhcHRpb25faW5kX3BhcmFtX3QgYWlwYXJhbTsKIAogCS8qIFJGQyAyOTYwIDMuMy4yIEluaXRpYXRpb24gKElOSVQpICgxKQpAQCAtNzc1LDcgKzc3NSw3IEBACiAJY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBfX3UzMiB0c24pCiB7CiAJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKLQlfX3UzMiBwYXlsb2FkOworCV9fYmUzMiBwYXlsb2FkOwogCiAJcmV0dmFsID0gc2N0cF9tYWtlX2Fib3J0KGFzb2MsIGNodW5rLCBzaXplb2Yoc2N0cF9lcnJoZHJfdCkKIAkJCQkgKyBzaXplb2YodHNuKSk7CkBAIC05NTEsNyArOTUxLDcgQEAKIC8qIENyZWF0ZSBhbiBPcGVyYXRpb24gRXJyb3IgY2h1bmsuICAqLwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9vcF9lcnJvcihjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCQkJCSBfX3UxNiBjYXVzZV9jb2RlLCBjb25zdCB2b2lkICpwYXlsb2FkLAorCQkJCSBfX2JlMTYgY2F1c2VfY29kZSwgY29uc3Qgdm9pZCAqcGF5bG9hZCwKIAkJCQkgc2l6ZV90IHBheWxlbikKIHsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOwpAQCAtMTE5MCwxNSArMTE5MCwxNCBAQAogCWlmIChjaHVuay0+Y2h1bmtfaGRyLT5mbGFncyAmIFNDVFBfREFUQV9VTk9SREVSRUQpIHsKIAkJc3NuID0gMDsKIAl9IGVsc2UgewotCQlzaWQgPSBodG9ucyhjaHVuay0+c3ViaC5kYXRhX2hkci0+c3RyZWFtKTsKKwkJc2lkID0gbnRvaHMoY2h1bmstPnN1YmguZGF0YV9oZHItPnN0cmVhbSk7CiAJCWlmIChjaHVuay0+Y2h1bmtfaGRyLT5mbGFncyAmIFNDVFBfREFUQV9MQVNUX0ZSQUcpCiAJCQlzc24gPSBzY3RwX3Nzbl9uZXh0KCZjaHVuay0+YXNvYy0+c3NubWFwLT5vdXQsIHNpZCk7CiAJCWVsc2UKIAkJCXNzbiA9IHNjdHBfc3NuX3BlZWsoJmNodW5rLT5hc29jLT5zc25tYXAtPm91dCwgc2lkKTsKLQkJc3NuID0gaHRvbnMoc3NuKTsKIAl9CiAKLQljaHVuay0+c3ViaC5kYXRhX2hkci0+c3NuID0gc3NuOworCWNodW5rLT5zdWJoLmRhdGFfaGRyLT5zc24gPSBodG9ucyhzc24pOwogCWNodW5rLT5oYXNfc3NuID0gMTsKIH0KIApAQCAtMTI4MCwxNSArMTI3OSwxMyBAQAogCQkJLSAoYm9keXNpemUgJSBTQ1RQX0NPT0tJRV9NVUxUSVBMRSk7CiAJKmNvb2tpZV9sZW4gPSBoZWFkZXJzaXplICsgYm9keXNpemU7CiAKLQlyZXR2YWwgPSBrbWFsbG9jKCpjb29raWVfbGVuLCBHRlBfQVRPTUlDKTsKLQotCWlmICghcmV0dmFsKQotCQlnb3RvIG5vZGF0YTsKLQogCS8qIENsZWFyIHRoaXMgbWVtb3J5IHNpbmNlIHdlIGFyZSBzZW5kaW5nIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKIAkgKiBvdXQgb24gdGhlIG5ldHdvcmsuCiAJICovCi0JbWVtc2V0KHJldHZhbCwgMHgwMCwgKmNvb2tpZV9sZW4pOworCXJldHZhbCA9IGt6YWxsb2MoKmNvb2tpZV9sZW4sIEdGUF9BVE9NSUMpOworCWlmICghcmV0dmFsKQorCQlnb3RvIG5vZGF0YTsKKwogCWNvb2tpZSA9IChzdHJ1Y3Qgc2N0cF9zaWduZWRfY29va2llICopIHJldHZhbC0+Ym9keTsKIAogCS8qIFNldCB1cCB0aGUgcGFyYW1ldGVyIGhlYWRlci4gICovCkBAIC0xNDM4LDcgKzE0MzUsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKG50b2hzKGNodW5rLT5zY3RwX2hkci0+c291cmNlKSAhPSBiZWFyX2Nvb2tpZS0+cGVlcl9hZGRyLnY0LnNpbl9wb3J0IHx8CisJaWYgKGNodW5rLT5zY3RwX2hkci0+c291cmNlICE9IGJlYXJfY29va2llLT5wZWVyX2FkZHIudjQuc2luX3BvcnQgfHwKIAkgICAgbnRvaHMoY2h1bmstPnNjdHBfaGRyLT5kZXN0KSAhPSBiZWFyX2Nvb2tpZS0+bXlfcG9ydCkgewogCQkqZXJyb3IgPSAtU0NUUF9JRVJST1JfQkFEX1BPUlRTOwogCQlnb3RvIGZhaWw7CkBAIC0xNDczLDEwICsxNDcwLDEwIEBACiAJCQlzdXNlY29uZHNfdCB1c2VjcyA9ICh0di50dl9zZWMgLQogCQkJCWJlYXJfY29va2llLT5leHBpcmF0aW9uLnR2X3NlYykgKiAxMDAwMDAwTCArCiAJCQkJdHYudHZfdXNlYyAtIGJlYXJfY29va2llLT5leHBpcmF0aW9uLnR2X3VzZWM7CisJCQlfX2JlMzIgbiA9IGh0b25sKHVzZWNzKTsKIAotCQkJdXNlY3MgPSBodG9ubCh1c2Vjcyk7CiAJCQlzY3RwX2luaXRfY2F1c2UoKmVycnAsIFNDVFBfRVJST1JfU1RBTEVfQ09PS0lFLAotCQkJCQkmdXNlY3MsIHNpemVvZih1c2VjcykpOworCQkJCQkmbiwgc2l6ZW9mKG4pKTsKIAkJCSplcnJvciA9IC1TQ1RQX0lFUlJPUl9TVEFMRV9DT09LSUU7CiAJCX0gZWxzZQogCQkJKmVycm9yID0gLVNDVFBfSUVSUk9SX05PTUVNOwpAQCAtMTUzOSw4ICsxNTM2LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IF9fc2N0cF9taXNzaW5nIHsKLQlfX3UzMiBudW1fbWlzc2luZzsKLQlfX3UxNiB0eXBlOworCV9fYmUzMiBudW1fbWlzc2luZzsKKwlfX2JlMTYgdHlwZTsKIH0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMTg1Miw5ICsxODQ5LDEwIEBACiAJICogYWRkZWQgYXMgdGhlIHByaW1hcnkgdHJhbnNwb3J0LiAgVGhlIHNvdXJjZSBhZGRyZXNzIHNlZW1zIHRvCiAJICogYmUgYSBhIGJldHRlciBjaG9pY2UgdGhhbiBhbnkgb2YgdGhlIGVtYmVkZGVkIGFkZHJlc3Nlcy4KIAkgKi8KLQlpZiAocGVlcl9hZGRyKQorCWlmIChwZWVyX2FkZHIpIHsKIAkJaWYoIXNjdHBfYXNzb2NfYWRkX3BlZXIoYXNvYywgcGVlcl9hZGRyLCBnZnAsIFNDVFBfQUNUSVZFKSkKIAkJCWdvdG8gbm9tZW07CisJfQogCiAJLyogUHJvY2VzcyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4gICovCiAKQEAgLTE5MTAsMTAgKzE5MDgsOSBAQAogCS8qIENvcHkgY29va2llIGluIGNhc2Ugd2UgbmVlZCB0byByZXNlbmQgQ09PS0lFLUVDSE8uICovCiAJY29va2llID0gYXNvYy0+cGVlci5jb29raWU7CiAJaWYgKGNvb2tpZSkgewotCQlhc29jLT5wZWVyLmNvb2tpZSA9IGttYWxsb2MoYXNvYy0+cGVlci5jb29raWVfbGVuLCBnZnApOworCQlhc29jLT5wZWVyLmNvb2tpZSA9IGttZW1kdXAoY29va2llLCBhc29jLT5wZWVyLmNvb2tpZV9sZW4sIGdmcCk7CiAJCWlmICghYXNvYy0+cGVlci5jb29raWUpCiAJCQlnb3RvIGNsZWFuX3VwOwotCQltZW1jcHkoYXNvYy0+cGVlci5jb29raWUsIGNvb2tpZSwgYXNvYy0+cGVlci5jb29raWVfbGVuKTsKIAl9CiAKIAkvKiBSRkMgMjk2MCA3LjIuMSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBzc3RocmVzaCBNQVkgYmUgYXJiaXRyYXJpbHkKQEAgLTIwMjcsNyArMjAyNCw3IEBACiAJCS8qIEZhbGwgdGhyb3VnaC4gKi8KIAljYXNlIFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOgogCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHBhcmFtX3R5cGUyYWYocGFyYW0ucC0+dHlwZSkpOwotCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCBwYXJhbS5hZGRyLCBhc29jLT5wZWVyLnBvcnQsIDApOworCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCBwYXJhbS5hZGRyLCBodG9ucyhhc29jLT5wZWVyLnBvcnQpLCAwKTsKIAkJc2NvcGUgPSBzY3RwX3Njb3BlKHBlZXJfYWRkcik7CiAJCWlmIChzY3RwX2luX3Njb3BlKCZhZGRyLCBzY29wZSkpCiAJCQlpZiAoIXNjdHBfYXNzb2NfYWRkX3BlZXIoYXNvYywgJmFkZHIsIGdmcCwgU0NUUF9VTkNPTkZJUk1FRCkpCkBAIC0yMjMwLDcgKzIyMjcsNyBAQAogCQkJCQkgICAgICB1bmlvbiBzY3RwX2FkZHIJICAgICAgKmxhZGRyLAogCQkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIJICAgICAgKmFkZHJzLAogCQkJCQkgICAgICBpbnQJCSAgICAgIGFkZHJjbnQsCi0JCQkJCSAgICAgIF9fdTE2CQkgICAgICBmbGFncykKKwkJCQkJICAgICAgX19iZTE2CQkgICAgICBmbGFncykKIHsKIAlzY3RwX2FkZGlwX3BhcmFtX3QJcGFyYW07CiAJc3RydWN0IHNjdHBfY2h1bmsJKnJldHZhbDsKQEAgLTIzNjMsMTQgKzIzNjAsMTQgQEAKIH0KIAogLyogQWRkIHJlc3BvbnNlIHBhcmFtZXRlcnMgdG8gYW4gQVNDT05GX0FDSyBjaHVuay4gKi8KLXN0YXRpYyB2b2lkIHNjdHBfYWRkX2FzY29uZl9yZXNwb25zZShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIF9fdTMyIGNycl9pZCwKLQkJCSAgICAgIF9fdTE2IGVycl9jb2RlLCBzY3RwX2FkZGlwX3BhcmFtX3QgKmFzY29uZl9wYXJhbSkKK3N0YXRpYyB2b2lkIHNjdHBfYWRkX2FzY29uZl9yZXNwb25zZShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIF9fYmUzMiBjcnJfaWQsCisJCQkgICAgICBfX2JlMTYgZXJyX2NvZGUsIHNjdHBfYWRkaXBfcGFyYW1fdCAqYXNjb25mX3BhcmFtKQogewogCXNjdHBfYWRkaXBfcGFyYW1fdCAJYWNrX3BhcmFtOwogCXNjdHBfZXJyaGRyX3QJCWVycl9wYXJhbTsKIAlpbnQJCQlhc2NvbmZfcGFyYW1fbGVuID0gMDsKIAlpbnQJCQllcnJfcGFyYW1fbGVuID0gMDsKLQlfX3UxNgkJCXJlc3BvbnNlX3R5cGU7CisJX19iZTE2CQkJcmVzcG9uc2VfdHlwZTsKIAogCWlmIChTQ1RQX0VSUk9SX05PX0VSUk9SID09IGVycl9jb2RlKSB7CiAJCXJlc3BvbnNlX3R5cGUgPSBTQ1RQX1BBUkFNX1NVQ0NFU1NfUkVQT1JUOwpAQCAtMjQwNCw3ICsyNDAxLDcgQEAKIH0KIAogLyogUHJvY2VzcyBhIGFzY29uZiBwYXJhbWV0ZXIuICovCi1zdGF0aWMgX191MTYgc2N0cF9wcm9jZXNzX2FzY29uZl9wYXJhbShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKK3N0YXRpYyBfX2JlMTYgc2N0cF9wcm9jZXNzX2FzY29uZl9wYXJhbShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmFzY29uZiwKIAkJCQkgICAgICAgc2N0cF9hZGRpcF9wYXJhbV90ICphc2NvbmZfcGFyYW0pCiB7CkBAIC0yNDEzLDcgKzI0MTAsNyBAQAogCXVuaW9uIHNjdHBfYWRkcglhZGRyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAl1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKmFkZHJfcGFyYW07Ci0JCQkJIAorCiAJYWRkcl9wYXJhbSA9ICh1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKikKIAkJCSgodm9pZCAqKWFzY29uZl9wYXJhbSArIHNpemVvZihzY3RwX2FkZGlwX3BhcmFtX3QpKTsKIApAQCAtMjQyMSw3ICsyNDE4LDcgQEAKIAlpZiAodW5saWtlbHkoIWFmKSkKIAkJcmV0dXJuIFNDVFBfRVJST1JfSU5WX1BBUkFNOwogCi0JYWYtPmZyb21fYWRkcl9wYXJhbSgmYWRkciwgYWRkcl9wYXJhbSwgYXNvYy0+cGVlci5wb3J0LCAwKTsKKwlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCBhZGRyX3BhcmFtLCBodG9ucyhhc29jLT5wZWVyLnBvcnQpLCAwKTsKIAlzd2l0Y2ggKGFzY29uZl9wYXJhbS0+cGFyYW1faGRyLnR5cGUpIHsKIAljYXNlIFNDVFBfUEFSQU1fQUREX0lQOgogCQkvKiBBRERJUCA0LjMgRDkpIElmIGFuIGVuZHBvaW50IHJlY2VpdmVzIGFuIEFERCBJUCBhZGRyZXNzCkBAIC0yNDg3LDcgKzI0ODQsNyBAQAogCXNjdHBfYWRkaXBfcGFyYW1fdAkqYXNjb25mX3BhcmFtOwogCXN0cnVjdCBzY3RwX2NodW5rCSphc2NvbmZfYWNrOwogCi0JX191MTYJZXJyX2NvZGU7CisJX19iZTE2CWVycl9jb2RlOwogCWludAlsZW5ndGggPSAwOwogCWludAljaHVua19sZW4gPSBhc2NvbmYtPnNrYi0+bGVuOwogCV9fdTMyCXNlcmlhbDsKQEAgLTI1ODYsNyArMjU4Myw3IEBACiAKIAkvKiBXZSBoYXZlIGNoZWNrZWQgdGhlIHBhY2tldCBiZWZvcmUsIHNvIHdlIGRvIG5vdCBjaGVjayBhZ2Fpbi4JKi8KIAlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHBhcmFtX3R5cGUyYWYoYWRkcl9wYXJhbS0+djQucGFyYW1faGRyLnR5cGUpKTsKLQlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCBhZGRyX3BhcmFtLCBicC0+cG9ydCwgMCk7CisJYWYtPmZyb21fYWRkcl9wYXJhbSgmYWRkciwgYWRkcl9wYXJhbSwgaHRvbnMoYnAtPnBvcnQpLCAwKTsKIAogCXN3aXRjaCAoYXNjb25mX3BhcmFtLT5wYXJhbV9oZHIudHlwZSkgewogCWNhc2UgU0NUUF9QQVJBTV9BRERfSVA6CkBAIC0yNjMwLDcgKzI2MjcsNyBAQAogICogQWxsIFRMVnMgYWZ0ZXIgdGhlIGZhaWxlZCByZXNwb25zZSBhcmUgY29uc2lkZXJlZCB1bnN1Y2Nlc3NmdWwgdW5sZXNzIGEKICAqIHNwZWNpZmljIHN1Y2Nlc3MgaW5kaWNhdGlvbiBpcyBwcmVzZW50IGZvciB0aGUgcGFyYW1ldGVyLgogICovCi1zdGF0aWMgX191MTYgc2N0cF9nZXRfYXNjb25mX3Jlc3BvbnNlKHN0cnVjdCBzY3RwX2NodW5rICphc2NvbmZfYWNrLAorc3RhdGljIF9fYmUxNiBzY3RwX2dldF9hc2NvbmZfcmVzcG9uc2Uoc3RydWN0IHNjdHBfY2h1bmsgKmFzY29uZl9hY2ssCiAJCQkJICAgICAgc2N0cF9hZGRpcF9wYXJhbV90ICphc2NvbmZfcGFyYW0sCiAJCQkJICAgICAgaW50IG5vX2VycikKIHsKQEAgLTI2MzgsNyArMjYzNSw3IEBACiAJc2N0cF9lcnJoZHJfdAkJKmVycl9wYXJhbTsKIAlpbnQJCQlsZW5ndGg7CiAJaW50CQkJYXNjb25mX2Fja19sZW4gPSBhc2NvbmZfYWNrLT5za2ItPmxlbjsKLQlfX3UxNgkJCWVycl9jb2RlOworCV9fYmUxNgkJCWVycl9jb2RlOwogCiAJaWYgKG5vX2VycikKIAkJZXJyX2NvZGUgPSBTQ1RQX0VSUk9SX05PX0VSUk9SOwpAQCAtMjY5NCw3ICsyNjkxLDcgQEAKIAlpbnQJYWxsX3BhcmFtX3Bhc3MgPSAwOwogCWludAlub19lcnIgPSAxOwogCWludAlyZXR2YWwgPSAwOwotCV9fdTE2CWVycl9jb2RlID0gU0NUUF9FUlJPUl9OT19FUlJPUjsKKwlfX2JlMTYJZXJyX2NvZGUgPSBTQ1RQX0VSUk9SX05PX0VSUk9SOwogCiAJLyogU2tpcCB0aGUgY2h1bmtoZHIgYW5kIGFkZGlwaGRyIGZyb20gdGhlIGxhc3QgYXNjb25mIHNlbnQgYW5kIHN0b3JlCiAJICogYSBwb2ludGVyIHRvIGFkZHJlc3MgcGFyYW1ldGVyLgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCmluZGV4IDljMTBiZGUuLjdiYmM2MTUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYworKysgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQkJCQkgIiB0cmFuc3BvcnQgSVA6IHBvcnQ6JWQgZmFpbGVkLlxuIiwKIAkJCQkJIGFzb2MsCiAJCQkJCSAoJnRyYW5zcG9ydC0+aXBhZGRyKSwKLQkJCQkJIHRyYW5zcG9ydC0+aXBhZGRyLnY0LnNpbl9wb3J0KTsKKwkJCQkJIG50b2hzKHRyYW5zcG9ydC0+aXBhZGRyLnY0LnNpbl9wb3J0KSk7CiAJCXNjdHBfYXNzb2NfY29udHJvbF90cmFuc3BvcnQoYXNvYywgdHJhbnNwb3J0LAogCQkJCQkgICAgIFNDVFBfVFJBTlNQT1JUX0RPV04sCiAJCQkJCSAgICAgU0NUUF9GQUlMRURfVEhSRVNIT0xEKTsKQEAgLTEzNjAsMTIgKzEzNjAsMTIgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NUUF9DTURfSU5JVF9GQUlMRUQ6Ci0JCQlzY3RwX2NtZF9pbml0X2ZhaWxlZChjb21tYW5kcywgYXNvYywgY21kLT5vYmoudTMyKTsKKwkJCXNjdHBfY21kX2luaXRfZmFpbGVkKGNvbW1hbmRzLCBhc29jLCBjbWQtPm9iai5lcnIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQ6CiAJCQlzY3RwX2NtZF9hc3NvY19mYWlsZWQoY29tbWFuZHMsIGFzb2MsIGV2ZW50X3R5cGUsCi0JCQkJCSAgICAgIHN1YnR5cGUsIGNodW5rLCBjbWQtPm9iai51MzIpOworCQkJCQkgICAgICBzdWJ0eXBlLCBjaHVuaywgY21kLT5vYmouZXJyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NUUF9DTURfSU5JVF9DT1VOVEVSX0lOQzoKQEAgLTE0MjAsNyArMTQyMCw3IEBACiAKIAkJY2FzZSBTQ1RQX0NNRF9QUk9DRVNTX0NUU046CiAJCQkvKiBEdW1teSB1cCBhIFNBQ0sgZm9yIHByb2Nlc3NpbmcuICovCi0JCQlzYWNraC5jdW1fdHNuX2FjayA9IGNtZC0+b2JqLnUzMjsKKwkJCXNhY2toLmN1bV90c25fYWNrID0gY21kLT5vYmouYmUzMjsKIAkJCXNhY2toLmFfcnduZCA9IDA7CiAJCQlzYWNraC5udW1fZ2FwX2Fja19ibG9ja3MgPSAwOwogCQkJc2Fja2gubnVtX2R1cF90c25zID0gMDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKaW5kZXggMWM0MmZlOS4uMjdjYzQ0NCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKQEAgLTkzLDcgKzkzLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2N0cF9zYWNraGRyICpzY3RwX3NtX3B1bGxfc2FjayhzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspOwogCiBzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc3RvcF90MV9hbmRfYWJvcnQoc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAotCQkJCQkgICBfX3UxNiBlcnJvciwgaW50IHNrX2VyciwKKwkJCQkJICAgX19iZTE2IGVycm9yLCBpbnQgc2tfZXJyLAogCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkJICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQpOwogCkBAIC00NDMsNyArNDQzLDcgQEAKIAlfX3UzMiBpbml0X3RhZzsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqZXJyX2NodW5rOwogCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0OwotCV9fdTE2IGVycm9yOworCXNjdHBfZXJyb3JfdCBlcnJvcjsKIAogCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpCiAJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKQEAgLTg4Niw3ICs4ODYsNyBAQAogCQkJCVNDVFBfRVJST1IoRVRJTUVET1VUKSk7CiAJCS8qIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVF9TS19FUlIsCiAJCQkJU0NUUF9FUlJPUihFVElNRURPVVQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX1NUQUxFX0NPT0tJRSkpOworCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX1NUQUxFX0NPT0tJRSkpOwogCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOwogCX0KIApAQCAtMjE1OCw3ICsyMTU4LDcgQEAKIAkgKiB0byBnaXZlIGFtcGxlIHRpbWUgdG8gcmV0cmFuc21pdCB0aGUgbmV3IGNvb2tpZSBhbmQgdGh1cwogCSAqIHlpZWxkIGEgaGlnaGVyIHByb2JhYmlsaXR5IG9mIHN1Y2Nlc3Mgb24gdGhlIHJlYXR0ZW1wdC4KIAkgKi8KLQlzdGFsZSA9IG50b2hsKCooc3VzZWNvbmRzX3QgKikoKHU4ICopZXJyICsgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpKSk7CisJc3RhbGUgPSBudG9obCgqKF9fYmUzMiAqKSgodTggKillcnIgKyBzaXplb2Yoc2N0cF9lcnJoZHJfdCkpKTsKIAlzdGFsZSA9IChzdGFsZSAqIDIpIC8gMTAwMDsKIAogCWJodC5wYXJhbV9oZHIudHlwZSA9IFNDVFBfUEFSQU1fQ09PS0lFX1BSRVNFUlZBVElWRTsKQEAgLTIyNTAsNyArMjI1MCw3IEBACiB7CiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOwogCXVuc2lnbmVkIGxlbjsKLQlfX3UxNiBlcnJvciA9IFNDVFBfRVJST1JfTk9fRVJST1I7CisJX19iZTE2IGVycm9yID0gU0NUUF9FUlJPUl9OT19FUlJPUjsKIAogCWlmICghc2N0cF92dGFnX3ZlcmlmeV9laXRoZXIoY2h1bmssIGFzb2MpKQogCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CkBAIC0yMjc1LDcgKzIyNzUsNyBAQAogCiAJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLCBTQ1RQX0VSUk9SKEVDT05OUkVTRVQpKTsKICAJLyogQVNTT0NfRkFJTEVEIHdpbGwgREVMRVRFX1RDQi4gKi8KLQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwgU0NUUF9VMzIoZXJyb3IpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwgU0NUUF9QRVJSKGVycm9yKSk7CiAJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOwogCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAKQEAgLTIyOTUsNyArMjI5NSw3IEBACiB7CiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOwogCXVuc2lnbmVkIGxlbjsKLQlfX3UxNiBlcnJvciA9IFNDVFBfRVJST1JfTk9fRVJST1I7CisJX19iZTE2IGVycm9yID0gU0NUUF9FUlJPUl9OT19FUlJPUjsKIAogCWlmICghc2N0cF92dGFnX3ZlcmlmeV9laXRoZXIoY2h1bmssIGFzb2MpKQogCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CkBAIC0yMzU3LDcgKzIzNTcsNyBAQAogICogVGhpcyBpcyBjb21tb24gY29kZSBjYWxsZWQgYnkgc2V2ZXJhbCBzY3RwX3NmXypfYWJvcnQoKSBmdW5jdGlvbnMgYWJvdmUuCiAgKi8KIHN0YXRpYyBzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zdG9wX3QxX2FuZF9hYm9ydChzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCi0JCQkJCSAgIF9fdTE2IGVycm9yLCBpbnQgc2tfZXJyLAorCQkJCQkgICBfX2JlMTYgZXJyb3IsIGludCBza19lcnIsCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCQkgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCkKIHsKQEAgLTIzNzAsNyArMjM3MCw3IEBACiAJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLCBTQ1RQX0VSUk9SKHNrX2VycikpOwogCS8qIENNRF9JTklUX0ZBSUxFRCB3aWxsIERFTEVURV9UQ0IuICovCiAJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX0ZBSUxFRCwKLQkJCVNDVFBfVTMyKGVycm9yKSk7CisJCQlTQ1RQX1BFUlIoZXJyb3IpKTsKIAlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKIH0KIApAQCAtMjQ2Niw3ICsyNDY2LDcgQEAKIAkgKiAgICByZWNlaXZlZCBieSB0aGUgU0hVVERPV04gc2VuZGVyLgogCSAqLwogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUFJPQ0VTU19DVFNOLAotCQkJU0NUUF9VMzIoY2h1bmstPnN1Ymguc2h1dGRvd25faGRyLT5jdW1fdHNuX2FjaykpOworCQkJU0NUUF9CRTMyKGNodW5rLT5zdWJoLnNodXRkb3duX2hkci0+Y3VtX3Rzbl9hY2spKTsKIAogb3V0OgogCXJldHVybiBkaXNwb3NpdGlvbjsKQEAgLTI1NDUsNiArMjU0NSw3IEBACiB7CiAJc2N0cF9jd3JoZHJfdCAqY3dyOwogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKwl1MzIgbG93ZXN0X3RzbjsKIAogCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpCiAJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKQEAgLTI1NTYsMTQgKzI1NTcsMTQgQEAKIAljd3IgPSAoc2N0cF9jd3JoZHJfdCAqKSBjaHVuay0+c2tiLT5kYXRhOwogCXNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2N3cmhkcl90KSk7CiAKLQljd3ItPmxvd2VzdF90c24gPSBudG9obChjd3ItPmxvd2VzdF90c24pOworCWxvd2VzdF90c24gPSBudG9obChjd3ItPmxvd2VzdF90c24pOwogCiAJLyogRG9lcyB0aGlzIENXUiBhY2sgdGhlIGxhc3Qgc2VudCBjb25nZXN0aW9uIG5vdGlmaWNhdGlvbj8gKi8KLQlpZiAoVFNOX2x0ZShhc29jLT5sYXN0X2VjbmVfdHNuLCBjd3ItPmxvd2VzdF90c24pKSB7CisJaWYgKFRTTl9sdGUoYXNvYy0+bGFzdF9lY25lX3RzbiwgbG93ZXN0X3RzbikpIHsKIAkJLyogU3RvcCBzZW5kaW5nIEVDTkUuICovCiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywKIAkJCQlTQ1RQX0NNRF9FQ05fQ1dSLAotCQkJCVNDVFBfVTMyKGN3ci0+bG93ZXN0X3RzbikpOworCQkJCVNDVFBfVTMyKGxvd2VzdF90c24pKTsKIAl9CiAJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKIH0KQEAgLTMzNjAsNyArMzM2MSw3IEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCSAgICAgICAgU0NUUF9FUlJPUihFQ09OTkFCT1JURUQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCi0JCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9BU0NPTkZfQUNLKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfQVNDT05GX0FDSykpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0FCT1JUOwpAQCAtMzM4OCw3ICszMzg5LDcgQEAKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAogCQkJICAgICAgICBTQ1RQX0VSUk9SKEVDT05OQUJPUlRFRCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX0FTQ09ORl9BQ0spKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9BU0NPTkZfQUNLKSk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKIAkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQUJPUlQ7CkBAIC0zNzQzLDEyICszNzQ0LDEyIEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCQlTQ1RQX0VSUk9SKEVDT05OUkVGVVNFRCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OKSk7CiAJfSBlbHNlIHsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAogCQkJICAgICAgICBTQ1RQX0VSUk9SKEVDT05OQUJPUlRFRCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX1BST1RPX1ZJT0xBVElPTikpOworCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX1BST1RPX1ZJT0xBVElPTikpOwogCQlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOwogCX0KIApAQCAtNDA2Miw3ICs0MDYzLDcgQEAKIAkJCVNDVFBfRVJST1IoRUNPTk5BQk9SVEVEKSk7CiAJLyogRGVsZXRlIHRoZSBlc3RhYmxpc2hlZCBhc3NvY2lhdGlvbi4gKi8KIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfVVNFUl9BQk9SVCkpOworCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfVVNFUl9BQk9SVCkpOwogCiAJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOwogCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CkBAIC00MTk5LDcgKzQyMDAsNyBAQAogCQkJU0NUUF9FUlJPUihFQ09OTlJFRlVTRUQpKTsKIAkvKiBEZWxldGUgdGhlIGVzdGFibGlzaGVkIGFzc29jaWF0aW9uLiAqLwogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfSU5JVF9GQUlMRUQsCi0JCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX1VTRVJfQUJPUlQpKTsKKwkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX1VTRVJfQUJPUlQpKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC00NTcxLDcgKzQ1NzIsNyBAQAogCQkJCVNDVFBfRVJST1IoRVRJTUVET1VUKSk7CiAJCS8qIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CkBAIC00NjkzLDcgKzQ2OTQsNyBAQAogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVF9TS19FUlIsCiAJCQkJU0NUUF9FUlJPUihFVElNRURPVVQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKIAl9CiAKQEAgLTQ3NDUsNyArNDc0Niw3IEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwogCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOwogCX0KIApAQCAtNDc4MSw3ICs0NzgyLDcgQEAKIAkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwogCQkvKiBOb3RlOiAgQ01EX0FTU09DX0ZBSUxFRCBjYWxscyBDTURfREVMRVRFX1RDQi4gKi8KIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCi0JCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKIAkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKQEAgLTQ4NTksNyArNDg2MCw3IEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKIAkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOwogCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKQEAgLTQ5MTUsNyArNDkxNiw3IEBACiAJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAogCQkJU0NUUF9FUlJPUihFVElNRURPVVQpKTsKIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CiAKIAlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOwogbm9tZW06CkBAIC01MzY1LDcgKzUzNjYsNyBAQAogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVF9TS19FUlIsCiAJCQkJU0NUUF9FUlJPUihFQ09OTkFCT1JURUQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCi0JCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19EQVRBKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fREFUQSkpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0lFUlJPUl9OT19EQVRBOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCmluZGV4IDhiY2NhNTYuLjczM2RkODcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKQEAgLTEwNCwzMjUgKzEwNCwzMjIgQEAKIAl9OwogfQogCisjZGVmaW5lIFRZUEVfU0NUUF9GVU5DKGZ1bmMpIHsuZm4gPSBmdW5jLCAubmFtZSA9ICNmdW5jfQorCiAjZGVmaW5lIFRZUEVfU0NUUF9EQVRBIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RhYm9ydF84XzRfOCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9kYXRhXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZGF0YV82XzIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZWF0X2RhdGFfNl8yKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZWF0X2RhdGFfNl8yLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9kYXRhXzZfMiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfZGF0YV82XzIpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0RBVEEgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfSU5JVCB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8xQl9pbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMUJfaW5pdCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzFCX2luaXQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzFfc2ltaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMV9zaW1pbml0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl8xX3NpbWluaXQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzJfMV9zaW1pbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl8xX3NpbWluaXQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8yXzFfc2ltaW5pdCksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzJfMl9kdXBpbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfMl9kdXBpbml0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMl9kdXBpbml0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMl9kdXBpbml0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX3Jlc2h1dGFjaywgLm5hbWUgPSAic2N0cF9zZl9kb185XzJfcmVzaHV0YWNrIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMl9yZXNodXRhY2spLCBcCiB9IC8qIFRZUEVfU0NUUF9JTklUICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0lOSVRfQUNLIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzFDX2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzFDX2FjayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzFDX2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0lOSVRfQUNLICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1NBQ0sgeyBcCiAJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RhYm9ydF84XzRfOCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9zYWNrXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfc2Fja182XzIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZWF0X3NhY2tfNl8yKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9zYWNrXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfc2Fja182XzIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZWF0X3NhY2tfNl8yKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZWF0X3NhY2tfNl8yLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9zYWNrXzZfMiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfc2Fja182XzIpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lYXRfc2Fja182XzIsIC5uYW1lID0gInNjdHBfc2ZfZWF0X3NhY2tfNl8yIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2VhdF9zYWNrXzZfMiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX1NBQ0sgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfSEVBUlRCRUFUIHsgXAogCS8qICBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90YWJvcnRfOF80XzgpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9iZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9iZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9iZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9iZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JlYXRfOF8zKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCiAJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIGFyZSBuaWNlLiAgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JlYXRfOF8zKSwgXAogfSAvKiBUWVBFX1NDVFBfSEVBUlRCRUFUICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0hFQVJUQkVBVF9BQ0sgeyBcCiAJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RhYm9ydF84XzRfOCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl92aW9sYXRpb24sIC5uYW1lID0gInNjdHBfc2ZfdmlvbGF0aW9uIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Zpb2xhdGlvbiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2JhY2tiZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iYWNrYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYmFja2JlYXRfOF8zKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYmFja2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JhY2tiZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9iYWNrYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9iYWNrYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmFja2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JhY2tiZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9iYWNrYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmFja2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JhY2tiZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0hFQVJUQkVBVF9BQ0sgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQUJPUlQgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3BkaXNjYXJkLCAubmFtZSA9ICJzY3RwX3NmX3BkaXNjYXJkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3BkaXNjYXJkKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0LCAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfY29va2llX2VjaG9lZF9hYm9ydCwgXAotCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzFfYWJvcnQsIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMV9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2h1dGRvd25fcGVuZGluZ19hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX3NlbnRfYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3NlbnRfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2h1dGRvd25fc2VudF9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzFfYWJvcnQsIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMV9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9zaHV0ZG93bl9hY2tfc2VudF9hYm9ydCwgXAotCS5uYW1lID0gInNjdHBfc2Zfc2h1dGRvd25fYWNrX3NlbnRfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2h1dGRvd25fYWNrX3NlbnRfYWJvcnQpLCBcCiB9IC8qIFRZUEVfU0NUUF9BQk9SVCAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9TSFVURE9XTiB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90YWJvcnRfOF80XzgpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzJfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3NodXRkb3duIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjaywgXAotCSAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9zaHV0ZG93bl9hY2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX1NIVVRET1dOICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1NIVVRET1dOX0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOF81XzFfRV9zYSwgLm5hbWUgPSAic2N0cF9zZl9kb184XzVfMV9FX3NhIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzhfNV8xX0Vfc2EpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb184XzVfMV9FX3NhLCAubmFtZSA9ICJzY3RwX3NmX2RvXzhfNV8xX0Vfc2EifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fOF81XzFfRV9zYSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl92aW9sYXRpb24sIC5uYW1lID0gInNjdHBfc2ZfdmlvbGF0aW9uIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Zpb2xhdGlvbiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3Zpb2xhdGlvbiwgLm5hbWUgPSAic2N0cF9zZl92aW9sYXRpb24ifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdmlvbGF0aW9uKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9maW5hbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfZmluYWwpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdmlvbGF0aW9uLCAubmFtZSA9ICJzY3RwX3NmX3Zpb2xhdGlvbiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl92aW9sYXRpb24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9maW5hbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfZmluYWwpLCBcCiB9IC8qIFRZUEVfU0NUUF9TSFVURE9XTl9BQ0sgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfRVJST1IgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGFib3J0XzhfNF84KSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfY29va2llX2VjaG9lZF9lcnIsIC5uYW1lID0gInNjdHBfc2ZfY29va2llX2VjaG9lZF9lcnIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9lcnIpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb3BlcnJfbm90aWZ5LCAubmFtZSA9ICJzY3RwX3NmX29wZXJyX25vdGlmeSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vcGVycl9ub3RpZnkpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9vcGVycl9ub3RpZnksIC5uYW1lID0gInNjdHBfc2Zfb3BlcnJfbm90aWZ5In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29wZXJyX25vdGlmeSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29wZXJyX25vdGlmeSwgLm5hbWUgPSAic2N0cF9zZl9vcGVycl9ub3RpZnkifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb3BlcnJfbm90aWZ5KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogfSAvKiBUWVBFX1NDVFBfRVJST1IgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQ09PS0lFX0VDSE8geyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMURfY2UsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8xRF9jZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzFEX2NlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2spLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2spLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzJfNF9kdXBjb29rLCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogfSAvKiBUWVBFX1NDVFBfQ09PS0lFX0VDSE8gKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQ09PS0lFX0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzFFX2NhLCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMUVfY2EifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8xRV9jYSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9DT09LSUVfQUNLICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VDTl9FQ05FIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19lY25lKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19lY25lKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fZWNuZSwgLm5hbWUgPSAic2N0cF9zZl9kb19lY25lIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX2VjbmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19lY25lLCAubmFtZSA9ICJzY3RwX3NmX2RvX2VjbmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fZWNuZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19lY25lLCAubmFtZSA9ICJzY3RwX3NmX2RvX2VjbmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fZWNuZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0VDTl9FQ05FICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VDTl9DV1IgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fZWNuX2N3ciwgLm5hbWUgPSAic2N0cF9zZl9kb19lY25fY3dyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX2Vjbl9jd3IpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19lY25fY3dyLCAubmFtZSA9ICJzY3RwX3NmX2RvX2Vjbl9jd3IifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fZWNuX2N3ciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX2Vjbl9jd3IsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuX2N3ciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19lY25fY3dyKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogfSAvKiBUWVBFX1NDVFBfRUNOX0NXUiAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9TSFVURE9XTl9DT01QTEVURSB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNF9DLCAubmFtZSA9ICJzY3RwX3NmX2RvXzRfQyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb180X0MpLCBcCiB9IC8qIFRZUEVfU0NUUF9TSFVURE9XTl9DT01QTEVURSAqLwogCiAvKiBUaGUgcHJpbWFyeSBpbmRleCBmb3IgdGhpcyB0YWJsZSBpcyB0aGUgY2h1bmsgdHlwZS4KQEAgLTQ1MCw0NCArNDQ3LDQ0IEBACiAKICNkZWZpbmUgVFlQRV9TQ1RQX0FTQ09ORiB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19hc2NvbmYsIC5uYW1lID0gInNjdHBfc2ZfZG9fYXNjb25mIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX2FzY29uZiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9BU0NPTkYgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQVNDT05GX0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19hc2NvbmZfYWNrLCAubmFtZSA9ICJzY3RwX3NmX2RvX2FzY29uZl9hY2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fYXNjb25mX2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9BU0NPTkZfQUNLICovCiAKIC8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBjaHVuayB0eXBlLgpAQCAtNTAwLDIzICs0OTcsMjMgQEAKIAogI2RlZmluZSBUWVBFX1NDVFBfRldEX1RTTiB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90YWJvcnRfOF80XzgpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lYXRfZndkX3RzbiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZndkX3RzbiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfZndkX3RzbiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9md2RfdHNuLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9md2RfdHNuIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2VhdF9md2RfdHNuKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZWF0X2Z3ZF90c25fZmFzdCwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZndkX3Rzbl9mYXN0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2VhdF9md2RfdHNuX2Zhc3QpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9GV0RfVFNOICovCiAKIC8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBjaHVuayB0eXBlLgpAQCAtNTI5LDE2NyArNTI2LDE1MCBAQAogc3RhdGljIGNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdAogY2h1bmtfZXZlbnRfdGFibGVfdW5rbm93bltTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0gewogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8KLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGFib3J0XzhfNF84KSwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8KLQl7LmZuID0gc2N0cF9zZl91bmtfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfdW5rX2NodW5rIn0sCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl91bmtfY2h1bmspLAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8KLQl7LmZuID0gc2N0cF9zZl91bmtfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfdW5rX2NodW5rIn0sCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl91bmtfY2h1bmspLAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLwotCXsuZm4gPSBzY3RwX3NmX3Vua19jaHVuaywgLm5hbWUgPSAic2N0cF9zZl91bmtfY2h1bmsifSwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Vua19jaHVuayksCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIH07CS8qIGNodW5rIHVua25vd24gKi8KIAogCiAjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfQVNTT0NJQVRFICB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX2Fzb2MsIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX2Fzb2MifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX2Fzb2MpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9ub3RfaW1wbCwgLm5hbWUgPSAic2N0cF9zZl9ub3RfaW1wbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9ub3RfaW1wbCksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9ub3RfaW1wbCwgLm5hbWUgPSAic2N0cF9zZl9ub3RfaW1wbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9ub3RfaW1wbCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX25vdF9pbXBsLCAubmFtZSA9ICJzY3RwX3NmX25vdF9pbXBsIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX25vdF9pbXBsKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiB9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfQVNTT0NJQVRFICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1BSSU1JVElWRV9TSFVURE9XTiAgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Vycm9yX2Nsb3NlZCwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9jbG9zZWQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3JfY2xvc2VkKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9zaHV0ZG93biwgXAotCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9zaHV0ZG93biwgXAotCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfcHJtX3NodXRkb3duIn0sXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fc2h1dGRvd24pLFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzJfcHJtX3NodXRkb3duLCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3BybV9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfcHJtX3NodXRkb3duKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSksIFwKIH0gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9TSFVURE9XTiAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfQUJPUlQgIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fYWJvcnQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9hYm9ydCwgXAotCS5uYW1lID0gInNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fYWJvcnQpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCwgXAotCS5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzFfcHJtX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfc2h1dGRvd25fcGVuZGluZ19wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfcHJtX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfcHJtX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfc2h1dGRvd25fc2VudF9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3NlbnRfcHJtX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3NodXRkb3duX3NlbnRfcHJtX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9zaHV0ZG93bl9hY2tfc2VudF9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX2Fja19zZW50X3BybV9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9zaHV0ZG93bl9hY2tfc2VudF9wcm1fYWJvcnQpLCBcCiB9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfQUJPUlQgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfUFJJTUlUSVZFX1NFTkQgIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19wcm1fc2VuZCwgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fc2VuZCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fc2VuZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9zZW5kLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9zZW5kIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX3BybV9zZW5kKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9zZW5kLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9zZW5kIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX3BybV9zZW5kKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIH0gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9TRU5EICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1BSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFUICB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZXJyb3JfY2xvc2VkLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX2Nsb3NlZCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9jbG9zZWQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCwJCSAgICAgIFwKLQkgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCJ9LCAgICAgICAgICBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCksICAgICAgICAgIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCwJCSAgICAgIFwKLQkgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCJ9LCAgICAgICAgICBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCksICAgICAgICAgIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0LAkJICAgICAgXAotCSAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0In0sICAgICAgICAgIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0KSwgICAgICAgICAgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiB9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfUkVRVUVTVEhFQVJUQkVBVCAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfQVNDT05GIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Vycm9yX2Nsb3NlZCwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9jbG9zZWQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3JfY2xvc2VkKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9hc2NvbmYsIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX2FzY29uZiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fYXNjb25mKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIH0gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFUICovCiAKIC8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBwcmltaXRpdmUgdHlwZS4KQEAgLTcwNiw0NyArNjg2LDQ0IEBACiAKICNkZWZpbmUgVFlQRV9TQ1RQX09USEVSX05PX1BFTkRJTkdfVFNOICB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzlfMl9zdGFydF9zaHV0ZG93biwgXAotCSAubmFtZSA9ICJzY3RwX2RvXzlfMl9zdGFydF9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfc3RhcnRfc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzJfc2h1dGRvd25fYWNrLCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfc2h1dGRvd25fYWNrKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9PVEhFUl9JQ01QX1BST1RPX1VOUkVBQ0ggIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfd2FpdF9pY21wX2Fib3J0LCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfY29va2llX3dhaXRfaWNtcF9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9jb29raWVfd2FpdF9pY21wX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogfQogCiBzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90IG90aGVyX2V2ZW50X3RhYmxlW1NDVFBfTlVNX09USEVSX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0gewpAQCAtNzU2LDIxNSArNzMzLDIxMiBAQAogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX05PTkUgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRSB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90MV9jb29raWVfdGltZXJfZXhwaXJlLCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfdDFfY29va2llX3RpbWVyX2V4cGlyZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90MV9jb29raWVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIH0KIAogI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl90MV9pbml0X3RpbWVyX2V4cGlyZSwgXAotCSAubmFtZSA9ICJzY3RwX3NmX3QxX2luaXRfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3QxX2luaXRfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90Ml90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDJfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3QyX3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90Ml90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDJfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3QyX3RpbWVyX2V4cGlyZSksIFwKIH0KIAogI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UM19SVFggeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNl8zXzNfcnR4LCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfM18zX3J0eCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb182XzNfM19ydHgpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNl8zXzNfcnR4LCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfM18zX3J0eCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb182XzNfM19ydHgpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb182XzNfM19ydHgsIC5uYW1lID0gInNjdHBfc2ZfZG9fNl8zXzNfcnR4In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzZfM18zX3J0eCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzZfM18zX3J0eCwgLm5hbWUgPSAic2N0cF9zZl9kb182XzNfM19ydHgifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNl8zXzNfcnR4KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1Q0X1JUTyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl90NF90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDRfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Q0X3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiB9CiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl90NV90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSwgLm5hbWUgPSAic2N0cF9zZl90NV90aW1lcl9leHBpcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX0hFQVJUQkVBVCB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9zZW5kYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2Zfc2VuZGJlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3NlbmRiZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3NlbmRiZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9zZW5kYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2VuZGJlYXRfOF8zKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfc2VuZGJlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX3NlbmRiZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9zZW5kYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiB9CiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb182XzJfc2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb182XzJfc2FjayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb182XzJfc2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzZfMl9zYWNrLCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfMl9zYWNrIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzZfMl9zYWNrKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNl8yX3NhY2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNl8yX3NhY2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNl8yX3NhY2spLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiB9CiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfQVVUT0NMT1NFIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2F1dG9jbG9zZV90aW1lcl9leHBpcmUsIFwKLQkgLm5hbWUgPSAic2N0cF9zZl9hdXRvY2xvc2VfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2F1dG9jbG9zZV90aW1lcl9leHBpcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiBzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90IHRpbWVvdXRfZXZlbnRfdGFibGVbU0NUUF9OVU1fVElNRU9VVF9UWVBFU11bU0NUUF9TVEFURV9OVU1fU1RBVEVTXSA9IHsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggOTM1YmM5MS4uMDJiMjcxNCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTIyOSwxMSArMjI5LDkgQEAKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKIAl1bmlvbiBzY3RwX2FkZHIgKmxhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHI7CiAKLQlsYWRkci0+djQuc2luX3BvcnQgPSBudG9ocyhsYWRkci0+djQuc2luX3BvcnQpOwogCWFkZHJfYXNvYyA9IHNjdHBfZW5kcG9pbnRfbG9va3VwX2Fzc29jKHNjdHBfc2soc2spLT5lcCwKLQkJCQkJICAgICAgICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyLAorCQkJCQkgICAgICAgbGFkZHIsCiAJCQkJCSAgICAgICAmdHJhbnNwb3J0KTsKLQlsYWRkci0+djQuc2luX3BvcnQgPSBodG9ucyhsYWRkci0+djQuc2luX3BvcnQpOwogCiAJaWYgKCFhZGRyX2Fzb2MpCiAJCXJldHVybiBOVUxMOwpAQCAtMzY4LDkgKzM2Niw3IEBACiAJc2N0cF93cml0ZV9sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOwogCiAJLyogVXNlIEdGUF9BVE9NSUMgc2luY2UgQkhzIGFyZSBkaXNhYmxlZC4gICovCi0JYWRkci0+djQuc2luX3BvcnQgPSBudG9ocyhhZGRyLT52NC5zaW5fcG9ydCk7CiAJcmV0ID0gc2N0cF9hZGRfYmluZF9hZGRyKGJwLCBhZGRyLCAxLCBHRlBfQVRPTUlDKTsKLQlhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGFkZHItPnY0LnNpbl9wb3J0KTsKIAlzY3RwX3dyaXRlX3VubG9jaygmZXAtPmJhc2UuYWRkcl9sb2NrKTsKIAlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOwogCkBAIC01NzIsNyArNTY4LDYgQEAKIAkJCWFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CiAJCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGFkZHItPnY0LnNpbl9mYW1pbHkpOwogCQkJbWVtY3B5KCZzYXZlYWRkciwgYWRkciwgYWYtPnNvY2thZGRyX2xlbik7Ci0JCQlzYXZlYWRkci52NC5zaW5fcG9ydCA9IG50b2hzKHNhdmVhZGRyLnY0LnNpbl9wb3J0KTsKIAkJCXJldHZhbCA9IHNjdHBfYWRkX2JpbmRfYWRkcihicCwgJnNhdmVhZGRyLCAwLAogCQkJCQkJICAgIEdGUF9BVE9NSUMpOwogCQkJYWRkcl9idWYgKz0gYWYtPnNvY2thZGRyX2xlbjsKQEAgLTYwNyw5ICs2MDIsOCBAQAogCWludCBjbnQ7CiAJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCA9ICZlcC0+YmFzZS5iaW5kX2FkZHI7CiAJaW50IHJldHZhbCA9IDA7Ci0JdW5pb24gc2N0cF9hZGRyIHNhdmVhZGRyOwogCXZvaWQgKmFkZHJfYnVmOwotCXN0cnVjdCBzb2NrYWRkciAqc2FfYWRkcjsKKwl1bmlvbiBzY3RwX2FkZHIgKnNhX2FkZHI7CiAJc3RydWN0IHNjdHBfYWYgKmFmOwogCiAJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfYmluZHhfcmVtIChzazogJXAsIGFkZHJzOiAlcCwgYWRkcmNudDogJWQpXG4iLApAQCAtNjI3LDE5ICs2MjEsMTMgQEAKIAkJCWdvdG8gZXJyX2JpbmR4X3JlbTsKIAkJfQogCi0JCS8qIFRoZSBsaXN0IG1heSBjb250YWluIGVpdGhlciBJUHY0IG9yIElQdjYgYWRkcmVzczsKLQkJICogZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGxlbmd0aCB0byBjb3B5IHRoZSBhZGRyZXNzIHRvCi0JCSAqIHNhdmVhZGRyLiAKLQkJICovCi0JCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcl9idWY7Ci0JCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoc2FfYWRkci0+c2FfZmFtaWx5KTsKKwkJc2FfYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKKwkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9hZGRyLT5zYS5zYV9mYW1pbHkpOwogCQlpZiAoIWFmKSB7CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfYmluZHhfcmVtOwogCQl9Ci0JCW1lbWNweSgmc2F2ZWFkZHIsIHNhX2FkZHIsIGFmLT5zb2NrYWRkcl9sZW4pOyAKLQkJc2F2ZWFkZHIudjQuc2luX3BvcnQgPSBudG9ocyhzYXZlYWRkci52NC5zaW5fcG9ydCk7Ci0JCWlmIChzYXZlYWRkci52NC5zaW5fcG9ydCAhPSBicC0+cG9ydCkgeworCQlpZiAoc2FfYWRkci0+djQuc2luX3BvcnQgIT0gaHRvbnMoYnAtPnBvcnQpKSB7CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfYmluZHhfcmVtOwogCQl9CkBAIC02NTQsNyArNjQyLDcgQEAKIAkJc2N0cF9sb2NhbF9iaF9kaXNhYmxlKCk7CiAJCXNjdHBfd3JpdGVfbG9jaygmZXAtPmJhc2UuYWRkcl9sb2NrKTsKIAotCQlyZXR2YWwgPSBzY3RwX2RlbF9iaW5kX2FkZHIoYnAsICZzYXZlYWRkcik7CisJCXJldHZhbCA9IHNjdHBfZGVsX2JpbmRfYWRkcihicCwgc2FfYWRkcik7CiAKIAkJc2N0cF93cml0ZV91bmxvY2soJmVwLT5iYXNlLmFkZHJfbG9jayk7CiAJCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7CkBAIC02OTMsNyArNjgxLDYgQEAKIAlzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIJKmJwOwogCXN0cnVjdCBzY3RwX2NodW5rCSpjaHVuazsKIAl1bmlvbiBzY3RwX2FkZHIJCSpsYWRkcjsKLQl1bmlvbiBzY3RwX2FkZHIJCXNhdmVhZGRyOwogCXZvaWQJCQkqYWRkcl9idWY7CiAJc3RydWN0IHNjdHBfYWYJCSphZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpwb3MsICpwb3MxOwpAQCAtNzczLDEzICs3NjAsMTEgQEAKIAkJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgewogCQkJbGFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CiAJCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGxhZGRyLT52NC5zaW5fZmFtaWx5KTsKLQkJCW1lbWNweSgmc2F2ZWFkZHIsIGxhZGRyLCBhZi0+c29ja2FkZHJfbGVuKTsKLQkJCXNhdmVhZGRyLnY0LnNpbl9wb3J0ID0gbnRvaHMoc2F2ZWFkZHIudjQuc2luX3BvcnQpOwogCQkJbGlzdF9mb3JfZWFjaChwb3MxLCAmYnAtPmFkZHJlc3NfbGlzdCkgewogCQkJCXNhZGRyID0gbGlzdF9lbnRyeShwb3MxLAogCQkJCQkJICAgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksCiAJCQkJCQkgICBsaXN0KTsKLQkJCQlpZiAoc2N0cF9jbXBfYWRkcl9leGFjdCgmc2FkZHItPmEsICZzYXZlYWRkcikpCisJCQkJaWYgKHNjdHBfY21wX2FkZHJfZXhhY3QoJnNhZGRyLT5hLCBsYWRkcikpCiAJCQkJCXNhZGRyLT51c2VfYXNfc3JjID0gMDsKIAkJCX0KIAkJCWFkZHJfYnVmICs9IGFmLT5zb2NrYWRkcl9sZW47CkBAIC05NzksNyArOTY0LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgYWRkcmNudCA9IDA7CiAJaW50IHdhbGtfc2l6ZSA9IDA7Ci0Jc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXVuaW9uIHNjdHBfYWRkciAqc2FfYWRkcjsKIAl2b2lkICphZGRyX2J1ZjsKIAogCXNwID0gc2N0cF9zayhzayk7CkBAIC05OTksOCArOTg0LDggQEAKIAkvKiBXYWxrIHRocm91Z2ggdGhlIGFkZHJzIGJ1ZmZlciBhbmQgY291bnQgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMuICovCiAJYWRkcl9idWYgPSBrYWRkcnM7CiAJd2hpbGUgKHdhbGtfc2l6ZSA8IGFkZHJzX3NpemUpIHsKLQkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZjsKLQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9hZGRyLT5zYV9mYW1pbHkpOworCQlzYV9hZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNhX2FkZHItPnNhLnNhX2ZhbWlseSk7CiAKIAkJLyogSWYgdGhlIGFkZHJlc3MgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWQgb3IgaWYgdGhpcyBhZGRyZXNzCiAJCSAqIGNhdXNlcyB0aGUgYWRkcmVzcyBidWZmZXIgdG8gb3ZlcmZsb3cgcmV0dXJuIEVJTlZBTC4KQEAgLTEwMTAsMTggKzk5NSwxNiBAQAogCQkJZ290byBvdXRfZnJlZTsKIAkJfQogCi0JCWVyciA9IHNjdHBfdmVyaWZ5X2FkZHIoc2ssICh1bmlvbiBzY3RwX2FkZHIgKilzYV9hZGRyLAotCQkJCSAgICAgICBhZi0+c29ja2FkZHJfbGVuKTsKKwkJZXJyID0gc2N0cF92ZXJpZnlfYWRkcihzaywgc2FfYWRkciwgYWYtPnNvY2thZGRyX2xlbik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9mcmVlOwogCiAJCW1lbWNweSgmdG8sIHNhX2FkZHIsIGFmLT5zb2NrYWRkcl9sZW4pOwotCQl0by52NC5zaW5fcG9ydCA9IG50b2hzKHRvLnY0LnNpbl9wb3J0KTsKIAogCQkvKiBDaGVjayBpZiB0aGVyZSBhbHJlYWR5IGlzIGEgbWF0Y2hpbmcgYXNzb2NpYXRpb24gb24gdGhlCiAJCSAqIGVuZHBvaW50IChvdGhlciB0aGFuIHRoZSBvbmUgY3JlYXRlZCBoZXJlKS4KIAkJICovCi0JCWFzb2MyID0gc2N0cF9lbmRwb2ludF9sb29rdXBfYXNzb2MoZXAsICZ0bywgJnRyYW5zcG9ydCk7CisJCWFzb2MyID0gc2N0cF9lbmRwb2ludF9sb29rdXBfYXNzb2MoZXAsIHNhX2FkZHIsICZ0cmFuc3BvcnQpOwogCQlpZiAoYXNvYzIgJiYgYXNvYzIgIT0gYXNvYykgewogCQkJaWYgKGFzb2MyLT5zdGF0ZSA+PSBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEKQogCQkJCWVyciA9IC1FSVNDT05OOwpAQCAtMTAzNCw3ICsxMDE3LDcgQEAKIAkJICogbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGVlbGVkLW9mZiBhc3NvY2lhdGlvbiBtYXRjaGluZwogCQkgKiB0aGUgcGVlciBhZGRyZXNzIGV2ZW4gb24gYW5vdGhlciBzb2NrZXQuCiAJCSAqLwotCQlpZiAoc2N0cF9lbmRwb2ludF9pc19wZWVsZWRfb2ZmKGVwLCAmdG8pKSB7CisJCWlmIChzY3RwX2VuZHBvaW50X2lzX3BlZWxlZF9vZmYoZXAsIHNhX2FkZHIpKSB7CiAJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KQEAgLTEwNjUsNyArMTA0OCw3IEBACiAJCQkJfQogCQkJfQogCi0JCQlzY29wZSA9IHNjdHBfc2NvcGUoJnRvKTsKKwkJCXNjb3BlID0gc2N0cF9zY29wZShzYV9hZGRyKTsKIAkJCWFzb2MgPSBzY3RwX2Fzc29jaWF0aW9uX25ldyhlcCwgc2ssIHNjb3BlLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghYXNvYykgewogCQkJCWVyciA9IC1FTk9NRU07CkBAIC0xMDc0LDcgKzEwNTcsNyBAQAogCQl9CiAKIAkJLyogUHJpbWUgdGhlIHBlZXIncyB0cmFuc3BvcnQgc3RydWN0dXJlcy4gICovCi0JCXRyYW5zcG9ydCA9IHNjdHBfYXNzb2NfYWRkX3BlZXIoYXNvYywgJnRvLCBHRlBfS0VSTkVMLAorCQl0cmFuc3BvcnQgPSBzY3RwX2Fzc29jX2FkZF9wZWVyKGFzb2MsIHNhX2FkZHIsIEdGUF9LRVJORUwsCiAJCQkJCQlTQ1RQX1VOS05PV04pOwogCQlpZiAoIXRyYW5zcG9ydCkgewogCQkJZXJyID0gLUVOT01FTTsKQEAgLTE0MjcsMTEgKzE0MTAsNiBAQAogCQlpZiAobXNnX25hbWVsZW4gPiBzaXplb2YodG8pKQogCQkJbXNnX25hbWVsZW4gPSBzaXplb2YodG8pOwogCQltZW1jcHkoJnRvLCBtc2ctPm1zZ19uYW1lLCBtc2dfbmFtZWxlbik7Ci0JCVNDVFBfREVCVUdfUFJJTlRLKCJKdXN0IG1lbWNweSdkLiBtc2dfbmFtZSBpcyAiCi0JCQkJICAiMHgleDoldS5cbiIsCi0JCQkJICB0by52NC5zaW5fYWRkci5zX2FkZHIsIHRvLnY0LnNpbl9wb3J0KTsKLQotCQl0by52NC5zaW5fcG9ydCA9IG50b2hzKHRvLnY0LnNpbl9wb3J0KTsKIAkJbXNnX25hbWUgPSBtc2ctPm1zZ19uYW1lOwogCX0KIApAQCAtMzIxNyw4ICszMTk1LDggQEAKIAlzdGF0dXMuc3N0YXRfb3V0c3RybXMgPSBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtczsKIAlzdGF0dXMuc3N0YXRfZnJhZ21lbnRhdGlvbl9wb2ludCA9IGFzb2MtPmZyYWdfcG9pbnQ7CiAJc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX2Fzc29jX2lkID0gc2N0cF9hc3NvYzJpZCh0cmFuc3BvcnQtPmFzb2MpOwotCW1lbWNweSgmc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX2FkZHJlc3MsCi0JICAgICAgICYodHJhbnNwb3J0LT5pcGFkZHIpLCBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7CisJbWVtY3B5KCZzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fYWRkcmVzcywgJnRyYW5zcG9ydC0+aXBhZGRyLAorCQkJdHJhbnNwb3J0LT5hZl9zcGVjaWZpYy0+c29ja2FkZHJfbGVuKTsKIAkvKiBNYXAgaXB2NCBhZGRyZXNzIGludG8gdjQtbWFwcGVkLW9uLXY2IGFkZHJlc3MuICAqLwogCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNjdHBfc2soc2spLAogCQkodW5pb24gc2N0cF9hZGRyICopJnN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19hZGRyZXNzKTsKQEAgLTM3NzAsNyArMzc0OCw2IEBACiAJCW1lbWNweSgmdGVtcCwgJmZyb20tPmlwYWRkciwgc2l6ZW9mKHRlbXApKTsKIAkJc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2stPnNrX2ZhbWlseSktPmFkZHJfdjRtYXAoc3AsICZ0ZW1wKTsKIAkJYWRkcmxlbiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5zb2NrYWRkcl9sZW47Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXRvICs9IGFkZHJsZW4gOwpAQCAtMzgyMSw3ICszNzk4LDYgQEAKIAkJYWRkcmxlbiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5zb2NrYWRkcl9sZW47CiAJCWlmKHNwYWNlX2xlZnQgPCBhZGRybGVuKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXRvICs9IGFkZHJsZW47CkBAIC0zODg5LDcgKzM4NjUsNyBAQAogCQkJCQkJICBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwKIAkJCQkJCSAgbGlzdCk7CiAJCQkJaWYgKChQRl9JTkVUID09IHNrLT5za19mYW1pbHkpICYmIAotCQkJCSAgICAoQUZfSU5FVDYgPT0gYWRkci0+YS5zYS5zYV9mYW1pbHkpKQkKKwkJCQkgICAgKEFGX0lORVQ2ID09IGFkZHItPmEuc2Euc2FfZmFtaWx5KSkKIAkJCQkJY29udGludWU7CiAJCQkJY250Kys7CiAJCQl9CkBAIC0zOTMzLDcgKzM5MDksNiBAQAogCQlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzY3RwX3NrKHNrKSwKIAkJCQkJCQkJJnRlbXApOwogCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7CiAJCQlzY3RwX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLAogCQkJCQkJICAgIGZsYWdzKTsKQEAgLTM5NzAsNyArMzk0NSw2IEBACiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKIAkJaWYoc3BhY2VfbGVmdDxhZGRybGVuKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcigqdG8sICZ0ZW1wLCBhZGRybGVuKSkgewogCQkJc2N0cF9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywKIAkJCQkJCSAgICBmbGFncyk7CkBAIC00MDU1LDcgKzQwMjksNiBAQAogCQltZW1jcHkoJnRlbXAsICZhZGRyLT5hLCBzaXplb2YodGVtcCkpOwogCQlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzcCwgJnRlbXApOwogCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byB1bmxvY2s7CkBAIC00MTQ2LDcgKzQxMTksNiBAQAogCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47CiAJCWlmKHNwYWNlX2xlZnQgPCBhZGRybGVuKQogCQkJcmV0dXJuIC1FTk9NRU07IC8qZml4bWU6IHJpZ2h0IGVycm9yPyovCi0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byB1bmxvY2s7CkBAIC00MTk0LDEyICs0MTY2LDggQEAKIAlpZiAoIWFzb2MtPnBlZXIucHJpbWFyeV9wYXRoKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCQotCWFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5pcGFkZHIudjQuc2luX3BvcnQgPQotCQlodG9ucyhhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+aXBhZGRyLnY0LnNpbl9wb3J0KTsKIAltZW1jcHkoJnByaW0uc3NwX2FkZHIsICZhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+aXBhZGRyLAotCSAgICAgICBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7Ci0JYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPmlwYWRkci52NC5zaW5fcG9ydCA9Ci0JCW50b2hzKGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5pcGFkZHIudjQuc2luX3BvcnQpOworCQlhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+YWZfc3BlY2lmaWMtPnNvY2thZGRyX2xlbik7CiAKIAlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzcCwKIAkJCSh1bmlvbiBzY3RwX2FkZHIgKikmcHJpbS5zc3BfYWRkcik7CkBAIC00NjQ1LDkgKzQ2MTMsNyBAQAogCXVuc2lnbmVkIHNob3J0IHNudW07CiAJaW50IHJldDsKIAotCS8qIE5PVEU6ICBSZW1lbWJlciB0byBwdXQgdGhpcyBiYWNrIHRvIG5ldCBvcmRlci4gKi8KLQlhZGRyLT52NC5zaW5fcG9ydCA9IG50b2hzKGFkZHItPnY0LnNpbl9wb3J0KTsKLQlzbnVtID0gYWRkci0+djQuc2luX3BvcnQ7CisJc251bSA9IG50b2hzKGFkZHItPnY0LnNpbl9wb3J0KTsKIAogCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2dldF9wb3J0KCkgYmVnaW5zLCBzbnVtPSVkXG4iLCBzbnVtKTsKIAlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKQEAgLTQ3ODQsNyArNDc1MCw2IEBACiAKIGZhaWw6CiAJc2N0cF9sb2NhbF9iaF9lbmFibGUoKTsKLQlhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGFkZHItPnY0LnNpbl9wb3J0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MDgzLDcgKzUwNDgsNyBAQAogewogCXVuaW9uIHNjdHBfYWRkciBhdXRvYWRkcjsKIAlzdHJ1Y3Qgc2N0cF9hZiAqYWY7Ci0JdW5zaWduZWQgc2hvcnQgcG9ydDsKKwlfX2JlMTYgcG9ydDsKIAogCS8qIEluaXRpYWxpemUgYSBsb2NhbCBzb2NrYWRkciBzdHJ1Y3R1cmUgdG8gSU5BRERSX0FOWS4gKi8KIAlhZiA9IHNjdHBfc2soc2spLT5wZi0+YWY7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC90c25tYXAuYyBiL25ldC9zY3RwL3Rzbm1hcC5jCmluZGV4IGFjNGZhZTEuLjQyZDk0OTggMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Rzbm1hcC5jCisrKyBiL25ldC9zY3RwL3Rzbm1hcC5jCkBAIC00MDEsMTMgKzQwMSwxNCBAQAogCiAJLyogUmVmcmVzaCB0aGUgZ2FwIGFjayBpbmZvcm1hdGlvbi4gKi8KIAlpZiAoc2N0cF90c25tYXBfaGFzX2dhcChtYXApKSB7CisJCV9fdTE2IHN0YXJ0LCBlbmQ7CiAJCXNjdHBfdHNubWFwX2l0ZXJfaW5pdChtYXAsICZpdGVyKTsKIAkJd2hpbGUgKHNjdHBfdHNubWFwX25leHRfZ2FwX2FjayhtYXAsICZpdGVyLAotCQkJCQkJJm1hcC0+Z2Fic1tnYWJzXS5zdGFydCwKLQkJCQkJCSZtYXAtPmdhYnNbZ2Fic10uZW5kKSkgeworCQkJCQkJJnN0YXJ0LAorCQkJCQkJJmVuZCkpIHsKIAotCQkJbWFwLT5nYWJzW2dhYnNdLnN0YXJ0ID0gaHRvbnMobWFwLT5nYWJzW2dhYnNdLnN0YXJ0KTsKLQkJCW1hcC0+Z2Fic1tnYWJzXS5lbmQgPSBodG9ucyhtYXAtPmdhYnNbZ2Fic10uZW5kKTsKKwkJCW1hcC0+Z2Fic1tnYWJzXS5zdGFydCA9IGh0b25zKHN0YXJ0KTsKKwkJCW1hcC0+Z2Fic1tnYWJzXS5lbmQgPSBodG9ucyhlbmQpOwogCQkJZ2FicysrOwogCQkJaWYgKGdhYnMgPj0gU0NUUF9NQVhfR0FCUykKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IGEwMTUyODMuLmUyNTVhNzAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMzUxLDcgKzM1MSw3IEBACiAJc3RydWN0IHNjdHBfcmVtb3RlX2Vycm9yICpzcmU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzY3RwX2Vycmhkcl90ICpjaDsKLQlfX3UxNiBjYXVzZTsKKwlfX2JlMTYgY2F1c2U7CiAJaW50IGVsZW47CiAKIAljaCA9IChzY3RwX2Vycmhkcl90ICopKGNodW5rLT5za2ItPmRhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDZjOWI5YjMuLmU4ZGI1NDcgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTc3LDcgKzc3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kaXZlcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KQEAgLTg1MiwxMSArODUxLDYgQEAKIAkJCQllcnIgPSB2bGFuX2lvY3RsX2hvb2soYXJncCk7CiAJCQltdXRleF91bmxvY2soJnZsYW5faW9jdGxfbXV0ZXgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJRkRJVkVSVDoKLQkJY2FzZSBTSU9DU0lGRElWRVJUOgotCQkJLyogQ29udmVydCB0aGlzIHRvIGNhbGwgdGhyb3VnaCBhIGhvb2sgKi8KLQkJCWVyciA9IGRpdmVydF9pb2N0bChjbWQsIGFyZ3ApOwotCQkJYnJlYWs7CiAJCWNhc2UgU0lPQ0FERERMQ0k6CiAJCWNhc2UgU0lPQ0RFTERMQ0k6CiAJCQllcnIgPSAtRU5PUEtHOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCmluZGV4IGIzNmI5NDYuLmU1YTg0YTQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKQEAgLTE5OCwxMSArMTk4LDEwIEBACiAJcSA9IChjb25zdCB2b2lkICopKChjb25zdCBjaGFyICopcCArIGxlbik7CiAJaWYgKHVubGlrZWx5KHEgPiBlbmQgfHwgcSA8IHApKQogCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKLQlkZXN0LT5kYXRhID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWRlc3QtPmRhdGEgPSBrbWVtZHVwKHAsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KGRlc3QtPmRhdGEgPT0gTlVMTCkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWRlc3QtPmxlbiA9IGxlbjsKLQltZW1jcHkoZGVzdC0+ZGF0YSwgcCwgbGVuKTsKIAlyZXR1cm4gcTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwppbmRleCAzMjVlNzJlLi43NTRiOGNkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwpAQCAtNzAsMTAgKzcwLDkgQEAKIAlxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKIAlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCiAJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotCXJlcy0+ZGF0YSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlyZXMtPmRhdGEgPSBrbWVtZHVwKHAsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KHJlcy0+ZGF0YSA9PSBOVUxMKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JbWVtY3B5KHJlcy0+ZGF0YSwgcCwgbGVuKTsKIAlyZXMtPmxlbiA9IGxlbjsKIAlyZXR1cm4gcTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYwppbmRleCBiZGVkZjQ1Li5kNTdmNjA4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCkBAIC03NiwxMCArNzYsOSBAQAogCXEgPSAoY29uc3Qgdm9pZCAqKSgoY29uc3QgY2hhciAqKXAgKyBsZW4pOwogCWlmICh1bmxpa2VseShxID4gZW5kIHx8IHEgPCBwKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci0JcmVzLT5kYXRhID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCXJlcy0+ZGF0YSA9IGttZW1kdXAocCwgbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkocmVzLT5kYXRhID09IE5VTEwpKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQltZW1jcHkocmVzLT5kYXRhLCBwLCBsZW4pOwogCXJldHVybiBxOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKaW5kZXggMWYwZjA3OS4uNzAwMzUzYiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwpAQCAtMTEzLDkgKzExMyw3IEBACiBzdGF0aWMgaW50IGR1cF90b19uZXRvYmooc3RydWN0IHhkcl9uZXRvYmogKmRzdCwgY2hhciAqc3JjLCBpbnQgbGVuKQogewogCWRzdC0+bGVuID0gbGVuOwotCWRzdC0+ZGF0YSA9IChsZW4gPyBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCkgOiBOVUxMKTsKLQlpZiAoZHN0LT5kYXRhKQotCQltZW1jcHkoZHN0LT5kYXRhLCBzcmMsIGxlbik7CisJZHN0LT5kYXRhID0gKGxlbiA/IGttZW1kdXAoc3JjLCBsZW4sIEdGUF9LRVJORUwpIDogTlVMTCk7CiAJaWYgKGxlbiAmJiAhZHN0LT5kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTc1NiwxMCArNzU0LDkgQEAKIAlpZiAoIW5ldykKIAkJZ290byBvdXQ7CiAJa3JlZl9pbml0KCZuZXctPmgucmVmKTsKLQluZXctPmgubmFtZSA9IGttYWxsb2Moc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7CisJbmV3LT5oLm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwogCWlmICghbmV3LT5oLm5hbWUpCiAJCWdvdG8gb3V0X2ZyZWVfZG9tOwotCXN0cmNweShuZXctPmgubmFtZSwgbmFtZSk7CiAJbmV3LT5oLmZsYXZvdXIgPSAmc3ZjYXV0aG9wc19nc3M7CiAJbmV3LT5wc2V1ZG9mbGF2b3IgPSBwc2V1ZG9mbGF2b3I7CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2xudC5jIGIvbmV0L3N1bnJwYy9jbG50LmMKaW5kZXggNzg2OTZmMi4uZGZlZWE0ZiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTI1MywxMCArMjUzLDkgQEAKIHsKIAlzdHJ1Y3QgcnBjX2NsbnQgKm5ldzsKIAotCW5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKKwluZXcgPSBrbWVtZHVwKGNsbnQsIHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXcpCiAJCWdvdG8gb3V0X25vX2NsbnQ7Ci0JbWVtY3B5KG5ldywgY2xudCwgc2l6ZW9mKCpuZXcpKTsKIAlhdG9taWNfc2V0KCZuZXctPmNsX2NvdW50LCAxKTsKIAlhdG9taWNfc2V0KCZuZXctPmNsX3VzZXJzLCAwKTsKIAluZXctPmNsX3BhcmVudCA9IGNsbnQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3NvY2tsaWIuYyBiL25ldC9zdW5ycGMvc29ja2xpYi5jCmluZGV4IDZmMTc1MjcuLjI2MzVjNTQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc29ja2xpYi5jCisrKyBiL25ldC9zdW5ycGMvc29ja2xpYi5jCkBAIC00NSw3ICs0NSw4IEBACiAgKi8KIHN0YXRpYyBzaXplX3Qgc2tiX3JlYWRfYW5kX2NzdW1fYml0cyhza2JfcmVhZGVyX3QgKmRlc2MsIHZvaWQgKnRvLCBzaXplX3QgbGVuKQogewotCXVuc2lnbmVkIGludAljc3VtMiwgcG9zOworCXVuc2lnbmVkIGludCBwb3M7CisJX193c3VtIGNzdW0yOwogCiAJaWYgKGxlbiA+IGRlc2MtPmNvdW50KQogCQlsZW4gPSBkZXNjLT5jb3VudDsKQEAgLTE2MCwxMyArMTYxLDEzIEBACiAJaWYgKHhkcl9wYXJ0aWFsX2NvcHlfZnJvbV9za2IoeGRyLCAwLCAmZGVzYywgc2tiX3JlYWRfYW5kX2NzdW1fYml0cykgPCAwKQogCQlyZXR1cm4gLTE7CiAJaWYgKGRlc2Mub2Zmc2V0ICE9IHNrYi0+bGVuKSB7Ci0JCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJX193c3VtIGNzdW0yOwogCQljc3VtMiA9IHNrYl9jaGVja3N1bShza2IsIGRlc2Mub2Zmc2V0LCBza2ItPmxlbiAtIGRlc2Mub2Zmc2V0LCAwKTsKIAkJZGVzYy5jc3VtID0gY3N1bV9ibG9ja19hZGQoZGVzYy5jc3VtLCBjc3VtMiwgZGVzYy5vZmZzZXQpOwogCX0KIAlpZiAoZGVzYy5jb3VudCkKIAkJcmV0dXJuIC0xOwotCWlmICgodW5zaWduZWQgc2hvcnQpY3N1bV9mb2xkKGRlc2MuY3N1bSkpCisJaWYgKGNzdW1fZm9sZChkZXNjLmNzdW0pKQogCQlyZXR1cm4gLTE7CiAJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSkKIAkJbmV0ZGV2X3J4X2NzdW1fZmF1bHQoc2tiLT5kZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggZTFiZDkzMy4uYTBhOTUzYSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC0xMDEsOSArMTAxLDkgQEAKICAqIElQIGFkZHJlc3NlcyBpbiByZXZlcnNlLWVuZGlhbiAoaS5lLiBvbiBhIGxpdHRsZS1lbmRpYW4gbWFjaGluZSkuCiAgKiBTbyB1c2UgYSB0cml2aWFsIGJ1dCByZWxpYWJsZSBoYXNoIGluc3RlYWQKICAqLwotc3RhdGljIGlubGluZSBpbnQgaGFzaF9pcCh1bnNpZ25lZCBsb25nIGlwKQorc3RhdGljIGlubGluZSBpbnQgaGFzaF9pcChfX2JlMzIgaXApCiB7Ci0JaW50IGhhc2ggPSBpcCBeIChpcD4+MTYpOworCWludCBoYXNoID0gKF9fZm9yY2UgdTMyKWlwIF4gKChfX2ZvcmNlIHUzMilpcD4+MTYpOwogCXJldHVybiAoaGFzaCBeIChoYXNoPj44KSkgJiAweGZmOwogfQogI2VuZGlmCkBAIC0yODQsNyArMjg0LDcgQEAKIAlpcC5tX2FkZHIgPSBhZGRyOwogCWNoID0gc3VucnBjX2NhY2hlX2xvb2t1cCgmaXBfbWFwX2NhY2hlLCAmaXAuaCwKIAkJCQkgaGFzaF9zdHIoY2xhc3MsIElQX0hBU0hCSVRTKSBeCi0JCQkJIGhhc2hfaXAoKHVuc2lnbmVkIGxvbmcpYWRkci5zX2FkZHIpKTsKKwkJCQkgaGFzaF9pcChhZGRyLnNfYWRkcikpOwogCiAJaWYgKGNoKQogCQlyZXR1cm4gY29udGFpbmVyX29mKGNoLCBzdHJ1Y3QgaXBfbWFwLCBoKTsKQEAgLTMxMyw3ICszMTMsNyBAQAogCWNoID0gc3VucnBjX2NhY2hlX3VwZGF0ZSgmaXBfbWFwX2NhY2hlLAogCQkJCSAmaXAuaCwgJmlwbS0+aCwKIAkJCQkgaGFzaF9zdHIoaXBtLT5tX2NsYXNzLCBJUF9IQVNIQklUUykgXgotCQkJCSBoYXNoX2lwKCh1bnNpZ25lZCBsb25nKWlwbS0+bV9hZGRyLnNfYWRkcikpOworCQkJCSBoYXNoX2lwKGlwbS0+bV9hZGRyLnNfYWRkcikpOwogCWlmICghY2gpCiAJCXJldHVybiAtRU5PTUVNOwogCWNhY2hlX3B1dChjaCwgJmlwX21hcF9jYWNoZSk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwppbmRleCAxYmI3NTcwLi43MzBjNWM0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5jCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTc3NCw4ICs3NzQsOCBAQAogCiBpbnQgdGlwY19iY2xpbmtfaW5pdCh2b2lkKQogewotCWJjYmVhcmVyID0ga21hbGxvYyhzaXplb2YoKmJjYmVhcmVyKSwgR0ZQX0FUT01JQyk7Ci0JYmNsaW5rID0ga21hbGxvYyhzaXplb2YoKmJjbGluayksIEdGUF9BVE9NSUMpOworCWJjYmVhcmVyID0ga3phbGxvYyhzaXplb2YoKmJjYmVhcmVyKSwgR0ZQX0FUT01JQyk7CisJYmNsaW5rID0ga3phbGxvYyhzaXplb2YoKmJjbGluayksIEdGUF9BVE9NSUMpOwogCWlmICghYmNiZWFyZXIgfHwgIWJjbGluaykgewogIG5vbWVtOgogCSAJd2FybigiTXVsdGljYXN0IGxpbmsgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnlcbiIpOwpAQCAtNzg2LDE0ICs3ODYsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KGJjYmVhcmVyLCAwLCBzaXplb2Yoc3RydWN0IGJjYmVhcmVyKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmJjYmVhcmVyLT5iZWFyZXIuY29uZ19saW5rcyk7CiAJYmNiZWFyZXItPmJlYXJlci5tZWRpYSA9ICZiY2JlYXJlci0+bWVkaWE7CiAJYmNiZWFyZXItPm1lZGlhLnNlbmRfbXNnID0gdGlwY19iY2JlYXJlcl9zZW5kOwogCXNwcmludGYoYmNiZWFyZXItPm1lZGlhLm5hbWUsICJ0aXBjLW11bHRpY2FzdCIpOwogCiAJYmNsID0gJmJjbGluay0+bGluazsKLQltZW1zZXQoYmNsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGJjbGluaykpOwogCUlOSVRfTElTVF9IRUFEKCZiY2wtPndhaXRpbmdfcG9ydHMpOwogCWJjbC0+bmV4dF9vdXRfbm8gPSAxOwogCXNwaW5fbG9ja19pbml0KCZiY2xpbmstPm5vZGUubG9jayk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb25maWcuYyBiL25ldC90aXBjL2NvbmZpZy5jCmluZGV4IGVkMTM1MWUuLjQ1OGEyYzQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvbmZpZy5jCisrKyBiL25ldC90aXBjL2NvbmZpZy5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIHN0cnVjdCBza19idWZmICp0aXBjX2NmZ19yZXBseV91bnNpZ25lZF90eXBlKHUxNiB0bHZfdHlwZSwgdTMyIHZhbHVlKQogewogCXN0cnVjdCBza19idWZmICpidWY7Ci0JdTMyIHZhbHVlX25ldDsKKwlfX2JlMzIgdmFsdWVfbmV0OwogCiAJYnVmID0gdGlwY19jZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHNpemVvZih2YWx1ZSkpKTsKIAlpZiAoYnVmKSB7CkBAIC0yODQsOCArMjg0LDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JYWRkciA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKLQlhZGRyID0gbnRvaGwoYWRkcik7CisJYWRkciA9IG50b2hsKCooX19iZTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSk7CiAJaWYgKGFkZHIgPT0gdGlwY19vd25fYWRkcikKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAoIXRpcGNfYWRkcl9ub2RlX3ZhbGlkKGFkZHIpKQpAQCAtMzE5LDggKzMxOCw3IEBACiAJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKIAotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAl0aXBjX3JlbW90ZV9tYW5hZ2VtZW50ID0gKHZhbHVlICE9IDApOwogCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiB9CkBAIC0zMzIsOCArMzMwLDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA2NTUzNSkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobWF4IHB1YmxpY2F0aW9ucyBtdXN0IGJlIDEtNjU1MzUpIik7CkBAIC0zNDgsOCArMzQ1LDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA2NTUzNSkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobWF4IHN1YnNjcmlwdGlvbnMgbXVzdCBiZSAxLTY1NTM1Iik7CkBAIC0zNjMsOCArMzU5LDcgQEAKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7Ci0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSA9PSB0aXBjX21heF9wb3J0cykKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMTI3LCA2NTUzNSkpCkBAIC0zODMsOCArMzc4LDcgQEAKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7Ci0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSA9PSB0aXBjX21heF96b25lcykKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgMjU1KSkKQEAgLTQwMyw4ICszOTcsNyBAQAogCiAJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKLQl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKLQl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwl2YWx1ZSA9IG50b2hsKCooX19iZTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSk7CiAJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDEpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKIAkJCQkJCSAgICIgKG1heCBjbHVzdGVycyBmaXhlZCBhdCAxKSIpOwpAQCAtNDE3LDggKzQxMCw3IEBACiAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAlpZiAodmFsdWUgPT0gdGlwY19tYXhfbm9kZXMpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiAJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDgsIDIwNDcpKQpAQCAtNDM3LDggKzQyOSw3IEBACiAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAlpZiAodmFsdWUgIT0gMCkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECiAJCQkJCQkgICAiIChtYXggc2Vjb25kYXJ5IG5vZGVzIGZpeGVkIGF0IDApIik7CkBAIC00NTEsOCArNDQyLDcgQEAKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7Ci0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSA9PSB0aXBjX25ldF9pZCkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgOTk5OSkpCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kYmcuYyBiL25ldC90aXBjL2RiZy5jCmluZGV4IGQ4YWY0YzIuLjYyN2Y5OWI3IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kYmcuYworKysgYi9uZXQvdGlwYy9kYmcuYwpAQCAtMzkzLDggKzM5Myw3IEBACiAJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKIAotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMCwgMzI3NjgpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKIAkJCQkJCSAgICIgKGxvZyBzaXplIG11c3QgYmUgMC0zMjc2OCkiKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfZGlzdHIuYyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwppbmRleCAwM2JkNjU5Li43YmY4N2NiIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKKysrIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCkBAIC02NiwxMSArNjYsMTEgQEAKICAqLwogCiBzdHJ1Y3QgZGlzdHJfaXRlbSB7Ci0JdTMyIHR5cGU7Ci0JdTMyIGxvd2VyOwotCXUzMiB1cHBlcjsKLQl1MzIgcmVmOwotCXUzMiBrZXk7CisJX19iZTMyIHR5cGU7CisJX19iZTMyIGxvd2VyOworCV9fYmUzMiB1cHBlcjsKKwlfX2JlMzIgcmVmOworCV9fYmUzMiBrZXk7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCA4ODZiZGE1Li40MTExYTMxIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC02MCw3ICs2MCw3IEBACiAJc3RydWN0IG5vZGUgKm5fcHRyOwogICAgICAgICBzdHJ1Y3Qgbm9kZSAqKmN1cnJfbm9kZTsKIAotCW5fcHRyID0ga21hbGxvYyhzaXplb2YoKm5fcHRyKSxHRlBfQVRPTUlDKTsKKwluX3B0ciA9IGt6YWxsb2Moc2l6ZW9mKCpuX3B0ciksR0ZQX0FUT01JQyk7CiAJaWYgKCFuX3B0cikgewogCQl3YXJuKCJOb2RlIGNyZWF0aW9uIGZhaWxlZCwgbm8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC03NSw3ICs3NSw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAkJCi0JbWVtc2V0KG5fcHRyLCAwLCBzaXplb2YoKm5fcHRyKSk7CiAJbl9wdHItPmFkZHIgPSBhZGRyOwogICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pbml0KCZuX3B0ci0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm5fcHRyLT5uc3ViKTsKQEAgLTU5Nyw4ICs1OTYsNyBAQAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTkVUX0FERFIpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CiAKLQlkb21haW4gPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JZG9tYWluID0gbnRvaGwoZG9tYWluKTsKKwlkb21haW4gPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChkb21haW4pKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKIAkJCQkJCSAgICIgKG5ldHdvcmsgYWRkcmVzcykiKTsKQEAgLTY0Miw4ICs2NDAsNyBAQAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTkVUX0FERFIpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CiAKLQlkb21haW4gPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JZG9tYWluID0gbnRvaGwoZG9tYWluKTsKKwlkb21haW4gPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChkb21haW4pKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKIAkJCQkJCSAgICIgKG5ldHdvcmsgYWRkcmVzcykiKTsKQEAgLTY2NCw4ICs2NjEsNyBAQAogCiAJLyogQWRkIFRMViBmb3IgYnJvYWRjYXN0IGxpbmsgKi8KIAotICAgICAgICBsaW5rX2luZm8uZGVzdCA9IHRpcGNfb3duX2FkZHIgJiAweGZmZmZmMDA7Ci0JbGlua19pbmZvLmRlc3QgPSBodG9ubChsaW5rX2luZm8uZGVzdCk7CisgICAgICAgIGxpbmtfaW5mby5kZXN0ID0gaHRvbmwodGlwY19vd25fYWRkciAmIDB4ZmZmZmYwMCk7CiAgICAgICAgIGxpbmtfaW5mby51cCA9IGh0b25sKDEpOwogICAgICAgICBzcHJpbnRmKGxpbmtfaW5mby5zdHIsIHRpcGNfYmNsaW5rX25hbWUpOwogCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9MSU5LX0lORk8sICZsaW5rX2luZm8sIHNpemVvZihsaW5rX2luZm8pKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL3N1YnNjci5jIGIvbmV0L3RpcGMvc3Vic2NyLmMKaW5kZXggN2E5MThmMS4uZGRhZGU3MyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc3Vic2NyLmMKKysrIGIvbmV0L3RpcGMvc3Vic2NyLmMKQEAgLTM1MCw3ICszNTAsNyBAQAogCiAJLyogQWxsb2NhdGUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLwogCi0Jc3ViID0ga21hbGxvYyhzaXplb2YoKnN1YiksIEdGUF9BVE9NSUMpOworCXN1YiA9IGt6YWxsb2Moc2l6ZW9mKCpzdWIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXN1YikgewogCQl3YXJuKCJTdWJzY3JpcHRpb24gcmVqZWN0ZWQsIG5vIG1lbW9yeVxuIik7CiAJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CkBAIC0zNTksNyArMzU5LDYgQEAKIAogCS8qIEluaXRpYWxpemUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLwogCi0JbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKIAlzdWItPnNlcS50eXBlID0gaHRvaGwocy0+c2VxLnR5cGUsIHN1YnNjcmliZXItPnN3YXApOwogCXN1Yi0+c2VxLmxvd2VyID0gaHRvaGwocy0+c2VxLmxvd2VyLCBzdWJzY3JpYmVyLT5zd2FwKTsKIAlzdWItPnNlcS51cHBlciA9IGh0b2hsKHMtPnNlcS51cHBlciwgc3Vic2NyaWJlci0+c3dhcCk7CmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmMKaW5kZXggYjQzYTI3OC4uMmYyMDhjNyAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5jCisrKyBiL25ldC91bml4L2FmX3VuaXguYwpAQCAtMTUxLDggKzE1MSw5IEBACiAgKiAgICBlYWNoIHNvY2tldCBzdGF0ZSBpcyBwcm90ZWN0ZWQgYnkgc2VwYXJhdGUgcndsb2NrLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdW5peF9oYXNoX2ZvbGQodW5zaWduZWQgaGFzaCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgdW5peF9oYXNoX2ZvbGQoX193c3VtIG4pCiB7CisJdW5zaWduZWQgaGFzaCA9IChfX2ZvcmNlIHVuc2lnbmVkKW47CiAJaGFzaCBePSBoYXNoPj4xNjsKIAloYXNoIF49IGhhc2g+Pjg7CiAJcmV0dXJuIGhhc2gmKFVOSVhfSEFTSF9TSVpFLTEpOwpkaWZmIC0tZ2l0IGEvbmV0L3dhbnJvdXRlci9hZl93YW5waXBlLmMgYi9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYwppbmRleCA2ZjM5ZmFhLi5jMjA1OTczIDEwMDY0NAotLS0gYS9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYworKysgYi9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYwpAQCAtMTMsNyArMTMsNyBAQAogKiBEdWUgQ3JlZGl0OgogKiAgICAgICAgICAgICAgIFdhbnBpcGUgc29ja2V0IGxheWVyIGlzIGJhc2VkIG9uIFBhY2tldCBhbmQgCiAqICAgICAgICAgICAgICAgdGhlIFgyNSBzb2NrZXQgbGF5ZXJzLiBUaGUgYWJvdmUgc29ja2V0cyB3ZXJlIAotKiAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSBzcGVjaWZpYyB1c2Ugb2YgU2FuZ29tYSBUZWNobm9sb2lnZXMgCisqICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHNwZWNpZmljIHVzZSBvZiBTYW5nb21hIFRlY2hub2xvZ2llcyAKICogICAgICAgICAgICAgICBBUEkgcHJvZ3JhbXMuIAogKiAgICAgICAgICAgICAgIFBhY2tldCBzb2NrZXQgQXV0aG9yczogUm9zcyBCaXJvLCBGcmVkIE4uIHZhbiBLZW1wZW4gYW5kIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3guCkBAIC0yMyw3ICsyMyw3IEBACiAqIEFwciAyNSwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEFkZGVkIHRoZSBhYmlsaXR5IHRvIHNlbmQgemVybyBsZW5ndGggcGFja2V0cy4KICogTWFyIDEzLCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gQWRkZWQgYSB0eCBidWZmZXIgY2hlY2sgdmlhIGlvY3RsIGNhbGwuCiAqIE1hciAwNiwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEZpeGVkIHRoZSBjb3JydXB0IHNvY2sgbGNuIHByb2JsZW0uCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlciBhbmQgY2xpZW50IGFwcGxpY2F0b24gY2FuIHJ1bgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgYW5kIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gcnVuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQgY29uZmxpY3RzLgogKiBGZWIgMjksIDIwMDAgIE5lbmFkIENvcmJpYyAgICAgbyBBZGRlZCBzdXBwb3J0IGZvciBQVkMgcHJvdG9jb2xzLCBzdWNoIGFzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRExDLCBGcmFtZSBSZWxheSBhbmQgSERMQyBBUEkuCmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCmluZGV4IDk0Nzk2NTkuLjMxNjIxMWQgMTAwNjQ0Ci0tLSBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCisrKyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCkBAIC0zLDcgKzMsNyBAQAogKgogKgkJVGhpcyBtb2R1bGUgaXMgY29tcGxldGVseSBoYXJkd2FyZS1pbmRlcGVuZGVudCBhbmQgcHJvdmlkZXMKICoJCXRoZSBmb2xsb3dpbmcgY29tbW9uIHNlcnZpY2VzIGZvciB0aGUgV0FOIExpbmsgRHJpdmVyczoKLSoJCSBvIFdBTiBkZXZpY2UgbWFuYWdlbm1lbnQgKHJlZ2lzdGVyaW5nLCB1bnJlZ2lzdGVyaW5nKQorKgkJIG8gV0FOIGRldmljZSBtYW5hZ2VtZW50IChyZWdpc3RlcmluZywgdW5yZWdpc3RlcmluZykKICoJCSBvIE5ldHdvcmsgaW50ZXJmYWNlIG1hbmFnZW1lbnQKICoJCSBvIFBoeXNpY2FsIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAoZGlhbC11cCwgaW5jb21pbmcgY2FsbHMpCiAqCQkgbyBMb2dpY2FsIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAoc3dpdGNoZWQgdmlydHVhbCBjaXJjdWl0cykKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCmluZGV4IDc3MzZiMjMuLjY0ZDM5MzggMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKKysrIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwpAQCAtNTAsNiArNTAsNDAgQEAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICp4ZnJtX3BvbGljeV9sb2NrX2FmaW5mbyh1bnNpZ25lZCBpbnQgZmFtaWx5KTsKIHN0YXRpYyB2b2lkIHhmcm1fcG9saWN5X3VubG9ja19hZmluZm8oc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvKTsKIAorc3RhdGljIGlubGluZSBpbnQKK19feGZybTRfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlyZXR1cm4gIGFkZHJfbWF0Y2goJmZsLT5mbDRfZHN0LCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKKwkJYWRkcl9tYXRjaCgmZmwtPmZsNF9zcmMsICZzZWwtPnNhZGRyLCBzZWwtPnByZWZpeGxlbl9zKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsKSBeIHNlbC0+ZHBvcnQpICYgc2VsLT5kcG9ydF9tYXNrKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX3Nwb3J0KGZsKSBeIHNlbC0+c3BvcnQpICYgc2VsLT5zcG9ydF9tYXNrKSAmJgorCQkoZmwtPnByb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCisJCShmbC0+b2lmID09IHNlbC0+aWZpbmRleCB8fCAhc2VsLT5pZmluZGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19feGZybTZfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlyZXR1cm4gIGFkZHJfbWF0Y2goJmZsLT5mbDZfZHN0LCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKKwkJYWRkcl9tYXRjaCgmZmwtPmZsNl9zcmMsICZzZWwtPnNhZGRyLCBzZWwtPnByZWZpeGxlbl9zKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsKSBeIHNlbC0+ZHBvcnQpICYgc2VsLT5kcG9ydF9tYXNrKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX3Nwb3J0KGZsKSBeIHNlbC0+c3BvcnQpICYgc2VsLT5zcG9ydF9tYXNrKSAmJgorCQkoZmwtPnByb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCisJCShmbC0+b2lmID09IHNlbC0+aWZpbmRleCB8fCAhc2VsLT5pZmluZGV4KTsKK30KKworaW50IHhmcm1fc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCwKKwkJICAgIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIF9feGZybTRfc2VsZWN0b3JfbWF0Y2goc2VsLCBmbCk7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIF9feGZybTZfc2VsZWN0b3JfbWF0Y2goc2VsLCBmbCk7CisJfQorCXJldHVybiAwOworfQorCiBpbnQgeGZybV9yZWdpc3Rlcl90eXBlKHN0cnVjdCB4ZnJtX3R5cGUgKnR5cGUsIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKIHsKIAlzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8gPSB4ZnJtX3BvbGljeV9sb2NrX2FmaW5mbyhmYW1pbHkpOwpAQCAtMTE3Nyw2ICsxMjExLDcgQEAKIAkJaWYgKHRtcGwtPm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgewogCQkJcmVtb3RlID0gJnRtcGwtPmlkLmRhZGRyOwogCQkJbG9jYWwgPSAmdG1wbC0+c2FkZHI7CisJCQlmYW1pbHkgPSB0bXBsLT5lbmNhcF9mYW1pbHk7CiAJCQlpZiAoeGZybV9hZGRyX2FueShsb2NhbCwgZmFtaWx5KSkgewogCQkJCWVycm9yID0geGZybV9nZXRfc2FkZHIoJnRtcCwgcmVtb3RlLCBmYW1pbHkpOwogCQkJCWlmIChlcnJvcikKQEAgLTE4OTQsNyArMTkyOSw4IEBACiAKIAkJaWYgKGZsICYmICF4ZnJtX3NlbGVjdG9yX21hdGNoKCZkc3QtPnhmcm0tPnNlbCwgZmwsIGZhbWlseSkpCiAJCQlyZXR1cm4gMDsKLQkJaWYgKGZsICYmICFzZWN1cml0eV94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2goZmwsIGRzdC0+eGZybSwgcG9sKSkKKwkJaWYgKGZsICYmIHBvbCAmJgorCQkgICAgIXNlY3VyaXR5X3hmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2goZHN0LT54ZnJtLCBwb2wsIGZsKSkKIAkJCXJldHVybiAwOwogCQlpZiAoZHN0LT54ZnJtLT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX1ZBTElEKQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3N0YXRlLmMgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKaW5kZXggODk5ZGU5ZS4uODY0OTYyYiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jCisrKyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwpAQCAtMTMwNCw3ICsxMzA0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21fcXVlcnkpOwogCi1pbnQga21fbmV3X21hcHBpbmcoc3RydWN0IHhmcm1fc3RhdGUgKngsIHhmcm1fYWRkcmVzc190ICppcGFkZHIsIHUxNiBzcG9ydCkKK2ludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KQogewogCWludCBlcnIgPSAtRUlOVkFMOwogCXN0cnVjdCB4ZnJtX21nciAqa207CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IGM0Y2RlNTcuLjMxMTIwNWYgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC0yNDQsMTEgKzI0NCwxMCBAQAogCSpwcm9wcyA9IGFsZ28tPmRlc2Muc2FkYl9hbGdfaWQ7CiAKIAlsZW4gPSBzaXplb2YoKnVhbGcpICsgKHVhbGctPmFsZ19rZXlfbGVuICsgN1UpIC8gODsKLQlwID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCXAgPSBrbWVtZHVwKHVhbGcsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbWNweShwLCB1YWxnLCBsZW4pOwogCXN0cmNweShwLT5hbGdfbmFtZSwgYWxnby0+bmFtZSk7CiAJKmFsZ3BwID0gcDsKIAlyZXR1cm4gMDsKQEAgLTI2MywxMSArMjYyLDEwIEBACiAJCXJldHVybiAwOwogCiAJdWVuY2FwID0gUlRBX0RBVEEocnRhKTsKLQlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlwID0ga21lbWR1cCh1ZW5jYXAsIHNpemVvZigqcCksIEdGUF9LRVJORUwpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1jcHkocCwgdWVuY2FwLCBzaXplb2YoKnApKTsKIAkqZW5jYXBwID0gcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTMwNSwxMSArMzAzLDEwIEBACiAJCXJldHVybiAwOwogCiAJdWFkZHJwID0gUlRBX0RBVEEocnRhKTsKLQlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlwID0ga21lbWR1cCh1YWRkcnAsIHNpemVvZigqcCksIEdGUF9LRVJORUwpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1jcHkocCwgdWFkZHJwLCBzaXplb2YoKnApKTsKIAkqYWRkcnBwID0gcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5NSw2ICs0OTIsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorCQllcnIgPSAtRVNSQ0g7CiAJCXggPSB4ZnJtX3N0YXRlX2xvb2t1cF9ieWFkZHIoJnAtPmRhZGRyLCBzYWRkciwgcC0+cHJvdG8sCiAJCQkJCSAgICAgcC0+ZmFtaWx5KTsKIAl9CkBAIC02NTIsNyArNjUwLDYgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IE5FVExJTktfQ0IoaW5fc2tiKS5waWQ7CiAJaW5mby5pbl9za2IgPSBpbl9za2I7CiAJaW5mby5vdXRfc2tiID0gc2tiOwogCWluZm8ubmxtc2dfc2VxID0gc2VxOwpAQCAtNzcyLDcgKzc2OSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB2ZXJpZnlfcG9saWN5X2RpcihfX3U4IGRpcikKK3N0YXRpYyBpbnQgdmVyaWZ5X3BvbGljeV9kaXIodTggZGlyKQogewogCXN3aXRjaCAoZGlyKSB7CiAJY2FzZSBYRlJNX1BPTElDWV9JTjoKQEAgLTc4Nyw3ICs3ODQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZlcmlmeV9wb2xpY3lfdHlwZShfX3U4IHR5cGUpCitzdGF0aWMgaW50IHZlcmlmeV9wb2xpY3lfdHlwZSh1OCB0eXBlKQogewogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOgpAQCAtODc0LDIyICs4NzEsNTcgQEAKIAkJdC0+YWFsZ29zID0gdXQtPmFhbGdvczsKIAkJdC0+ZWFsZ29zID0gdXQtPmVhbGdvczsKIAkJdC0+Y2FsZ29zID0gdXQtPmNhbGdvczsKKwkJdC0+ZW5jYXBfZmFtaWx5ID0gdXQtPmZhbWlseTsKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdmFsaWRhdGVfdG1wbChpbnQgbnIsIHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdXQsIHUxNiBmYW1pbHkpCit7CisJaW50IGk7CisKKwlpZiAobnIgPiBYRlJNX01BWF9ERVBUSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkvKiBXZSBuZXZlciB2YWxpZGF0ZWQgdGhlIHV0LT5mYW1pbHkgdmFsdWUsIHNvIG1hbnkKKwkJICogYXBwbGljYXRpb25zIHNpbXBseSBsZWF2ZSBpdCBhdCB6ZXJvLiAgVGhlIGNoZWNrIHdhcworCQkgKiBuZXZlciBtYWRlIGFuZCB1dC0+ZmFtaWx5IHdhcyBpZ25vcmVkIGJlY2F1c2UgYWxsCisJCSAqIHRlbXBsYXRlcyBjb3VsZCBiZSBhc3N1bWVkIHRvIGhhdmUgdGhlIHNhbWUgZmFtaWx5IGFzCisJCSAqIHRoZSBwb2xpY3kgaXRzZWxmLiAgTm93IHRoYXQgd2Ugd2lsbCBoYXZlIGlwdjQtaW4taXB2NgorCQkgKiBhbmQgaXB2Ni1pbi1pcHY0IHR1bm5lbHMsIHRoaXMgaXMgbm8gbG9uZ2VyIHRydWUuCisJCSAqLworCQlpZiAoIXV0W2ldLmZhbWlseSkKKwkJCXV0W2ldLmZhbWlseSA9IGZhbWlseTsKKworCQlzd2l0Y2ggKHV0W2ldLmZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjb3B5X2Zyb21fdXNlcl90bXBsKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCBzdHJ1Y3QgcnRhdHRyICoqeGZybWEpCiB7CiAJc3RydWN0IHJ0YXR0ciAqcnQgPSB4ZnJtYVtYRlJNQV9UTVBMLTFdOwotCXN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdXRtcGw7Ci0JaW50IG5yOwogCiAJaWYgKCFydCkgewogCQlwb2wtPnhmcm1fbnIgPSAwOwogCX0gZWxzZSB7Ci0JCW5yID0gKHJ0LT5ydGFfbGVuIC0gc2l6ZW9mKCpydCkpIC8gc2l6ZW9mKCp1dG1wbCk7CisJCXN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdXRtcGwgPSBSVEFfREFUQShydCk7CisJCWludCBuciA9IChydC0+cnRhX2xlbiAtIHNpemVvZigqcnQpKSAvIHNpemVvZigqdXRtcGwpOworCQlpbnQgZXJyOwogCi0JCWlmIChuciA+IFhGUk1fTUFYX0RFUFRIKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IHZhbGlkYXRlX3RtcGwobnIsIHV0bXBsLCBwb2wtPmZhbWlseSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCWNvcHlfdGVtcGxhdGVzKHBvbCwgUlRBX0RBVEEocnQpLCBucik7CiAJfQpAQCAtOTAwLDcgKzkzMiw3IEBACiB7CiAJc3RydWN0IHJ0YXR0ciAqcnQgPSB4ZnJtYVtYRlJNQV9QT0xJQ1lfVFlQRS0xXTsKIAlzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgKnVwdDsKLQlfX3U4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CisJdTggdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTjsKIAlpbnQgZXJyOwogCiAJaWYgKHJ0KSB7CkBAIC0xMDI3LDcgKzEwNTksNyBAQAogCQlzdHJ1Y3QgeGZybV90bXBsICprcCA9ICZ4cC0+eGZybV92ZWNbaV07CiAKIAkJbWVtY3B5KCZ1cC0+aWQsICZrcC0+aWQsIHNpemVvZih1cC0+aWQpKTsKLQkJdXAtPmZhbWlseSA9IHhwLT5mYW1pbHk7CisJCXVwLT5mYW1pbHkgPSBrcC0+ZW5jYXBfZmFtaWx5OwogCQltZW1jcHkoJnVwLT5zYWRkciwgJmtwLT5zYWRkciwgc2l6ZW9mKHVwLT5zYWRkcikpOwogCQl1cC0+cmVxaWQgPSBrcC0+cmVxaWQ7CiAJCXVwLT5tb2RlID0ga3AtPm1vZGU7CkBAIC0xMDgyLDEyICsxMTE0LDEyIEBACiB9CiAKICNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCi1zdGF0aWMgaW50IGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUodTggdHlwZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgdXB0OwogCiAJbWVtc2V0KCZ1cHQsIDAsIHNpemVvZih1cHQpKTsKLQl1cHQudHlwZSA9IHhwLT50eXBlOworCXVwdC50eXBlID0gdHlwZTsKIAogCVJUQV9QVVQoc2tiLCBYRlJNQV9QT0xJQ1lfVFlQRSwgc2l6ZW9mKHVwdCksICZ1cHQpOwogCkBAIC0xMDk4LDcgKzExMzAsNyBAQAogfQogCiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgY29weV90b191c2VyX3BvbGljeV90eXBlKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGludCBjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUodTggdHlwZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTExMjcsNyArMTE1OSw3IEBACiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAlpZiAoY29weV90b191c2VyX3NlY19jdHgoeHAsIHNrYikpCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKLQlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLCBza2IpIDwgMCkKKwlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLT50eXBlLCBza2IpIDwgMCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwpAQCAtMTE3MCw3ICsxMjAyLDYgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IE5FVExJTktfQ0IoaW5fc2tiKS5waWQ7CiAJaW5mby5pbl9za2IgPSBpbl9za2I7CiAJaW5mby5vdXRfc2tiID0gc2tiOwogCWluZm8ubmxtc2dfc2VxID0gc2VxOwpAQCAtMTE4OSw3ICsxMjIwLDcgQEAKIHsKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOwogCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKnA7Ci0JX191OCB0eXBlID0gWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOworCXU4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CiAJaW50IGVycjsKIAlzdHJ1Y3Qga21fZXZlbnQgYzsKIAlpbnQgZGVsZXRlOwpAQCAtMTI4MywxMCArMTMxNCwxMiBAQAogCWlkID0gTkxNU0dfREFUQShubGgpOwogCW5saC0+bmxtc2dfZmxhZ3MgPSAwOwogCi0JaWQtPnNhX2lkLmRhZGRyID0geC0+aWQuZGFkZHI7CisJbWVtY3B5KCZpZC0+c2FfaWQuZGFkZHIsICZ4LT5pZC5kYWRkcixzaXplb2YoeC0+aWQuZGFkZHIpKTsKIAlpZC0+c2FfaWQuc3BpID0geC0+aWQuc3BpOwogCWlkLT5zYV9pZC5mYW1pbHkgPSB4LT5wcm9wcy5mYW1pbHk7CiAJaWQtPnNhX2lkLnByb3RvID0geC0+aWQucHJvdG87CisJbWVtY3B5KCZpZC0+c2FkZHIsICZ4LT5wcm9wcy5zYWRkcixzaXplb2YoeC0+cHJvcHMuc2FkZHIpKTsKKwlpZC0+cmVxaWQgPSB4LT5wcm9wcy5yZXFpZDsKIAlpZC0+ZmxhZ3MgPSBjLT5kYXRhLmFldmVudDsKIAogCVJUQV9QVVQoc2tiLCBYRlJNQV9SRVBMQVlfVkFMLCBzaXplb2YoeC0+cmVwbGF5KSwgJngtPnJlcGxheSk7CkBAIC0xNDA3LDcgKzE0NDAsNyBAQAogc3RhdGljIGludCB4ZnJtX2ZsdXNoX3BvbGljeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqKnhmcm1hKQogewogCXN0cnVjdCBrbV9ldmVudCBjOwotCV9fdTggdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTjsKKwl1OCB0eXBlID0gWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOwogCWludCBlcnI7CiAKIAllcnIgPSBjb3B5X2Zyb21fdXNlcl9wb2xpY3lfdHlwZSgmdHlwZSwgKHN0cnVjdCBydGF0dHIgKiopeGZybWEpOwpAQCAtMTQyOCw3ICsxNDYxLDcgQEAKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOwogCXN0cnVjdCB4ZnJtX3VzZXJfcG9sZXhwaXJlICp1cCA9IE5MTVNHX0RBVEEobmxoKTsKIAlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8gKnAgPSAmdXAtPnBvbDsKLQlfX3U4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CisJdTggdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTjsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAogCWVyciA9IGNvcHlfZnJvbV91c2VyX3BvbGljeV90eXBlKCZ0eXBlLCAoc3RydWN0IHJ0YXR0ciAqKil4ZnJtYSk7CkBAIC0xNTMwLDcgKzE1NjMsOCBAQAogCX0KIAogCS8qICAgYnVpbGQgYW4gWFAgKi8KLQl4cCA9IHhmcm1fcG9saWN5X2NvbnN0cnVjdCgmdWEtPnBvbGljeSwgKHN0cnVjdCBydGF0dHIgKiopIHhmcm1hLCAmZXJyKTsgICAgICAgIGlmICgheHApIHsKKwl4cCA9IHhmcm1fcG9saWN5X2NvbnN0cnVjdCgmdWEtPnBvbGljeSwgKHN0cnVjdCBydGF0dHIgKiopIHhmcm1hLCAmZXJyKTsKKwlpZiAoIXhwKSB7CiAJCWtmcmVlKHgpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTE5MDcsNyArMTk0MSw3IEBACiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAlpZiAoY29weV90b191c2VyX3N0YXRlX3NlY19jdHgoeCwgc2tiKSkKIAkJZ290byBubG1zZ19mYWlsdXJlOwotCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUoeHAsIHNrYikgPCAwKQorCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUoeHAtPnR5cGUsIHNrYikgPCAwKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CkBAIC0xOTc5LDcgKzIwMTMsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCW5yID0gKChsZW4gLSBzaXplb2YoKnApKSAvIHNpemVvZigqdXQpKTsKLQlpZiAobnIgPiBYRlJNX01BWF9ERVBUSCkKKwlpZiAodmFsaWRhdGVfdG1wbChuciwgdXQsIHAtPnNlbC5mYW1pbHkpKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChwLT5kaXIgPiBYRlJNX1BPTElDWV9PVVQpCkBAIC0yMDE3LDcgKzIwNTEsNyBAQAogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAJaWYgKGNvcHlfdG9fdXNlcl9zZWNfY3R4KHhwLCBza2IpKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7Ci0JaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cCwgc2tiKSA8IDApCisJaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cC0+dHlwZSwgc2tiKSA8IDApCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAl1cGUtPmhhcmQgPSAhIWhhcmQ7CiAKQEAgLTIwOTYsNyArMjEzMCw3IEBACiAJY29weV90b191c2VyX3BvbGljeSh4cCwgcCwgZGlyKTsKIAlpZiAoY29weV90b191c2VyX3RtcGwoeHAsIHNrYikgPCAwKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7Ci0JaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cCwgc2tiKSA8IDApCisJaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cC0+dHlwZSwgc2tiKSA8IDApCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAogCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKQEAgLTIxMTcsNyArMjE1MSw2IEBACiAJdW5zaWduZWQgY2hhciAqYjsKIAlpbnQgbGVuID0gMDsKICNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCi0Jc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlIHVwdDsKIAlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKICNlbmRpZgogCWxlbiArPSBOTE1TR19MRU5HVEgoMCk7CkBAIC0yMTMwLDEyICsyMTYzLDggQEAKIAogCW5saCA9IE5MTVNHX1BVVChza2IsIGMtPnBpZCwgYy0+c2VxLCBYRlJNX01TR19GTFVTSFBPTElDWSwgMCk7CiAJbmxoLT5ubG1zZ19mbGFncyA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCi0JbWVtc2V0KCZ1cHQsIDAsIHNpemVvZih1cHQpKTsKLQl1cHQudHlwZSA9IGMtPmRhdGEudHlwZTsKLQlSVEFfUFVUKHNrYiwgWEZSTUFfUE9MSUNZX1RZUEUsIHNpemVvZih1cHQpLCAmdXB0KTsKLSNlbmRpZgorCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUoYy0+ZGF0YS50eXBlLCBza2IpIDwgMCkKKwkJZ290byBubG1zZ19mYWlsdXJlOwogCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwogCkBAIC0yMTQzLDkgKzIxNzIsNiBAQAogCXJldHVybiBuZXRsaW5rX2Jyb2FkY2FzdCh4ZnJtX25sLCBza2IsIDAsIFhGUk1OTEdSUF9QT0xJQ1ksIEdGUF9BVE9NSUMpOwogCiBubG1zZ19mYWlsdXJlOgotI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKLXJ0YXR0cl9mYWlsdXJlOgotI2VuZGlmCiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5faW5pdHJhbWZzX2xpc3Quc2ggYi9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaAppbmRleCAzMzFjMDc5Li40YzcyM2ZkIDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaAorKysgYi9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaApAQCAtMTU4LDcgKzE1OCw3IEBACiB9CiAKIGxpc3RfaGVhZGVyKCkgewotCWVjaG8gImRlcHNfaW5pdHJhbWZzIDo9IFxcIgorCToKIH0KIAogaGVhZGVyKCkgewpAQCAtMjI3LDYgKzIyNyw3IEBACiBjYXNlICIkYXJnIiBpbgogCSItbCIpCSMgZmlsZXMgaW5jbHVkZWQgaW4gaW5pdHJhbWZzIC0gdXNlZCBieSBrYnVpbGQKIAkJZGVwX2xpc3Q9Imxpc3RfIgorCQllY2hvICJkZXBzX2luaXRyYW1mcyA6PSBcXCIKIAkJc2hpZnQKIAkJOzsKIAkiLW8iKQkjIGdlbmVyYXRlIGd6aXBwZWQgY3BpbyBpbWFnZSBuYW1lZCAkMQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy91dGlsLmMKaW5kZXggZWJjNzgxYi4uZDU0NDQwZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYworKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jCkBAIC0yMjEsMTYgKzIyMSwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBjb2xvcl9zZXR1cChjb25zdCBjaGFyICp0aGVtZSkKIHsKLQlpZiAoc2V0X3RoZW1lKHRoZW1lKSkgewotCQlpZiAoaGFzX2NvbG9ycygpKSB7CS8qIFRlcm1pbmFsIHN1cHBvcnRzIGNvbG9yPyAqLwotCQkJc3RhcnRfY29sb3IoKTsKLQkJCWluaXRfZGlhbG9nX2NvbG9ycygpOwotCQl9Ci0JfQotCWVsc2UKLQl7CisJaW50IHVzZV9jb2xvcjsKKworCXVzZV9jb2xvciA9IHNldF90aGVtZSh0aGVtZSk7CisJaWYgKHVzZV9jb2xvciAmJiBoYXNfY29sb3JzKCkpIHsKKwkJc3RhcnRfY29sb3IoKTsKKwkJaW5pdF9kaWFsb2dfY29sb3JzKCk7CisJfSBlbHNlCiAJCXNldF9tb25vX3RoZW1lKCk7Ci0JfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCmluZGV4IDM5M2YzNzQuLjMzOGJkZWEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYworKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKQEAgLTEyNTksNiArMTI1OSw3IEBACiAgKiBDb25zdHJ1Y3QgdGhlIGNvbXBsZXRlIGNvbmZpZyB3aWRnZXQKICAqLwogQ29uZmlnTWFpbldpbmRvdzo6Q29uZmlnTWFpbldpbmRvdyh2b2lkKQorCTogc2VhcmNoV2luZG93KDApCiB7CiAJUU1lbnVCYXIqIG1lbnU7CiAJYm9vbCBvazsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2R1bW15LmMgYi9zZWN1cml0eS9kdW1teS5jCmluZGV4IDQzODc0YzEuLjU1ODc5NWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2R1bW15LmMKKysrIGIvc2VjdXJpdHkvZHVtbXkuYwpAQCAtODI4LDYgKzgyOCwxMSBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfaW5ldF9jb25uX2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywKKwkJCXN0cnVjdCBza19idWZmICpza2IpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9yZXFfY2xhc3NpZnlfZmxvdyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQlzdHJ1Y3QgZmxvd2kgKmZsKQogewpAQCAtODM2LDcgKzg0MSw3IEBACiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiBzdGF0aWMgaW50IGR1bW15X3hmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsCi0JCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHNvY2sgKnNrKQorCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC04NTYsNyArODYxLDcgQEAKIH0KIAogc3RhdGljIGludCBkdW1teV94ZnJtX3N0YXRlX2FsbG9jX3NlY3VyaXR5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LAotCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2VjaWQpCisJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LCB1MzIgc2VjaWQpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC04ODEsMTIgKzg4Niw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgZHVtbXlfeGZybV9mbG93X3N0YXRlX21hdGNoKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLAotCQkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCi17Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKmZsLCBpbnQgY2thbGwpCiB7CiAJcmV0dXJuIDA7CkBAIC0xMTA4LDYgKzExMDcsNyBAQAogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgc29ja19ncmFmdCk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbmV0X2Nvbm5fcmVxdWVzdCk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbmV0X2Nza19jbG9uZSk7CisJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbmV0X2Nvbm5fZXN0YWJsaXNoZWQpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgcmVxX2NsYXNzaWZ5X2Zsb3cpOwogICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyAqLwogI2lmZGVmICBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCkBAIC0xMTIwLDcgKzExMjAsNiBAQAogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgeGZybV9zdGF0ZV9kZWxldGVfc2VjdXJpdHkpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgeGZybV9wb2xpY3lfbG9va3VwKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHhmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2gpOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgeGZybV9mbG93X3N0YXRlX21hdGNoKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHhmcm1fZGVjb2RlX3Nlc3Npb24pOwogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0gKi8KICNpZmRlZiBDT05GSUdfS0VZUwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggYTMwMDcwMi4uZTczYWMxYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC0zMiwxMiArMzIsNyBAQAogI2luY2x1ZGUgImF2Yy5oIgogI2luY2x1ZGUgImF2Y19zcy5oIgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF2X3Blcm1fdG9fc3RyaW5nCi17Ci0gIHUxNiB0Y2xhc3M7Ci0gIHUzMiB2YWx1ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gYXZfcGVybV90b19zdHJpbmdbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcgYXZfcGVybV90b19zdHJpbmdbXSA9IHsKICNkZWZpbmUgU18oYywgdiwgcykgeyBjLCB2LCBzIH0sCiAjaW5jbHVkZSAiYXZfcGVybV90b19zdHJpbmcuaCIKICN1bmRlZiBTXwpAQCAtNTcsMTcgKzUyLDIxIEBACiAjdW5kZWYgVEVfCiAjdW5kZWYgU18KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdl9pbmhlcml0Ci17Ci0gICAgdTE2IHRjbGFzczsKLSAgICBjb25zdCBjaGFyICoqY29tbW9uX3B0czsKLSAgICB1MzIgY29tbW9uX2Jhc2U7Ci19IGF2X2luaGVyaXRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZfaW5oZXJpdCBhdl9pbmhlcml0W10gPSB7CiAjZGVmaW5lIFNfKGMsIGksIGIpIHsgYywgY29tbW9uXyMjaSMjX3Blcm1fdG9fc3RyaW5nLCBiIH0sCiAjaW5jbHVkZSAiYXZfaW5oZXJpdC5oIgogI3VuZGVmIFNfCiB9OwogCitjb25zdCBzdHJ1Y3Qgc2VsaW51eF9jbGFzc19wZXJtIHNlbGludXhfY2xhc3NfcGVybSA9IHsKKwlhdl9wZXJtX3RvX3N0cmluZywKKwlBUlJBWV9TSVpFKGF2X3Blcm1fdG9fc3RyaW5nKSwKKwljbGFzc190b19zdHJpbmcsCisJQVJSQVlfU0laRShjbGFzc190b19zdHJpbmcpLAorCWF2X2luaGVyaXQsCisJQVJSQVlfU0laRShhdl9pbmhlcml0KQorfTsKKwogI2RlZmluZSBBVkNfQ0FDSEVfU0xPVFMJCQk1MTIKICNkZWZpbmUgQVZDX0RFRl9DQUNIRV9USFJFU0hPTEQJCTUxMgogI2RlZmluZSBBVkNfQ0FDSEVfUkVDTEFJTQkJMTYKQEAgLTQ5Nyw3ICs0OTYsNyBAQAogCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkIiwgbmFtZTIsIG50b2hzKHBvcnQpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF2Y19wcmludF9pcHY0X2FkZHIoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHUzMiBhZGRyLAorc3RhdGljIGlubGluZSB2b2lkIGF2Y19wcmludF9pcHY0X2FkZHIoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIF9fYmUzMiBhZGRyLAogCQkJCSAgICAgICBfX2JlMTYgcG9ydCwgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQogewogCWlmIChhZGRyKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDhhYjU2NzkuLjc4Zjk4ZmUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvZGNjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CiAjaW5jbHVkZSA8bGludXgvdW4uaD4JCS8qIGZvciBVbml4IHNvY2tldCB0eXBlcyAqLwogI2luY2x1ZGUgPG5ldC9hZl91bml4Lmg+CS8qIGZvciBVbml4IHNvY2tldCB0eXBlcyAqLwpAQCAtNzUxLDYgKzc1Miw4IEBACiAJCQkJcmV0dXJuIFNFQ0NMQVNTX1VEUF9TT0NLRVQ7CiAJCQllbHNlCiAJCQkJcmV0dXJuIFNFQ0NMQVNTX1JBV0lQX1NPQ0tFVDsKKwkJY2FzZSBTT0NLX0RDQ1A6CisJCQlyZXR1cm4gU0VDQ0xBU1NfRENDUF9TT0NLRVQ7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gU0VDQ0xBU1NfUkFXSVBfU09DS0VUOwogCQl9CkBAIC0xNzU0LDcgKzE3NTcsOCBAQAogCQkJCQkJZ2V0X2ZpbGUoZGV2bnVsbCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlkZXZudWxsID0gZGVudHJ5X29wZW4oZGdldChzZWxpbnV4X251bGwpLCBtbnRnZXQoc2VsaW51eGZzX21vdW50KSwgT19SRFdSKTsKLQkJCQkJCWlmICghZGV2bnVsbCkgeworCQkJCQkJaWYgKElTX0VSUihkZXZudWxsKSkgeworCQkJCQkJCWRldm51bGwgPSBOVUxMOwogCQkJCQkJCXB1dF91bnVzZWRfZmQoZmQpOwogCQkJCQkJCWZwdXQoZmlsZSk7CiAJCQkJCQkJY29udGludWU7CkBAIC0yODg4LDcgKzI4OTIsOCBAQAogfQogCiAvKiBSZXR1cm5zIGVycm9yIG9ubHkgaWYgdW5hYmxlIHRvIHBhcnNlIGFkZHJlc3NlcyAqLwotc3RhdGljIGludCBzZWxpbnV4X3BhcnNlX3NrYl9pcHY0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpCitzdGF0aWMgaW50IHNlbGludXhfcGFyc2Vfc2tiX2lwdjQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQsIHU4ICpwcm90bykKIHsKIAlpbnQgb2Zmc2V0LCBpaGxlbiwgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOwpAQCAtMjkwNiw2ICsyOTExLDkgQEAKIAlhZC0+dS5uZXQudjRpbmZvLmRhZGRyID0gaWgtPmRhZGRyOwogCXJldCA9IDA7CiAKKwlpZiAocHJvdG8pCisJCSpwcm90byA9IGloLT5wcm90b2NvbDsKKwogCXN3aXRjaCAoaWgtPnByb3RvY29sKSB7CiAgICAgICAgIGNhc2UgSVBQUk9UT19UQ1A6IHsKICAgICAgICAgCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKQEAgLTI5MzksNiArMjk0NywyMiBAQAogICAgICAgICAJYnJlYWs7CiAgICAgICAgIH0KIAorCWNhc2UgSVBQUk9UT19EQ0NQOiB7CisJCXN0cnVjdCBkY2NwX2hkciBfZGNjcGgsICpkaDsKKworCQlpZiAobnRvaHMoaWgtPmZyYWdfb2ZmKSAmIElQX09GRlNFVCkKKwkJCWJyZWFrOworCisJCW9mZnNldCArPSBpaGxlbjsKKwkJZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfZGNjcGgpLCAmX2RjY3BoKTsKKwkJaWYgKGRoID09IE5VTEwpCisJCQlicmVhazsKKworCQlhZC0+dS5uZXQuc3BvcnQgPSBkaC0+ZGNjcGhfc3BvcnQ7CisJCWFkLT51Lm5ldC5kcG9ydCA9IGRoLT5kY2NwaF9kcG9ydDsKKwkJYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAJYnJlYWs7CiAgICAgICAgIH0KQEAgLTI5NDksNyArMjk3Myw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiAKIC8qIFJldHVybnMgZXJyb3Igb25seSBpZiB1bmFibGUgdG8gcGFyc2UgYWRkcmVzc2VzICovCi1zdGF0aWMgaW50IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKK3N0YXRpYyBpbnQgc2VsaW51eF9wYXJzZV9za2JfaXB2NihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwgdTggKnByb3RvKQogewogCXU4IG5leHRoZHI7CiAJaW50IHJldCA9IC1FSU5WQUwsIG9mZnNldDsKQEAgLTI5NzAsNiArMjk5NSw5IEBACiAJaWYgKG9mZnNldCA8IDApCiAJCWdvdG8gb3V0OwogCisJaWYgKHByb3RvKQorCQkqcHJvdG8gPSBuZXh0aGRyOworCiAJc3dpdGNoIChuZXh0aGRyKSB7CiAJY2FzZSBJUFBST1RPX1RDUDogewogICAgICAgICAJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwpAQCAtMjk5NSw2ICszMDIzLDE4IEBACiAJCWJyZWFrOwogCX0KIAorCWNhc2UgSVBQUk9UT19EQ0NQOiB7CisJCXN0cnVjdCBkY2NwX2hkciBfZGNjcGgsICpkaDsKKworCQlkaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9kY2NwaCksICZfZGNjcGgpOworCQlpZiAoZGggPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWFkLT51Lm5ldC5zcG9ydCA9IGRoLT5kY2NwaF9zcG9ydDsKKwkJYWQtPnUubmV0LmRwb3J0ID0gZGgtPmRjY3BoX2Rwb3J0OworCQlicmVhazsKKyAgICAgICAgfQorCiAJLyogaW5jbHVkZXMgZnJhZ21lbnRzICovCiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0zMDA2LDEzICszMDQ2LDEzIEBACiAjZW5kaWYgLyogSVBWNiAqLwogCiBzdGF0aWMgaW50IHNlbGludXhfcGFyc2Vfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQsCi0JCQkgICAgIGNoYXIgKiphZGRycCwgaW50ICpsZW4sIGludCBzcmMpCisJCQkgICAgIGNoYXIgKiphZGRycCwgaW50ICpsZW4sIGludCBzcmMsIHU4ICpwcm90bykKIHsKIAlpbnQgcmV0ID0gMDsKIAogCXN3aXRjaCAoYWQtPnUubmV0LmZhbWlseSkgewogCWNhc2UgUEZfSU5FVDoKLQkJcmV0ID0gc2VsaW51eF9wYXJzZV9za2JfaXB2NChza2IsIGFkKTsKKwkJcmV0ID0gc2VsaW51eF9wYXJzZV9za2JfaXB2NChza2IsIGFkLCBwcm90byk7CiAJCWlmIChyZXQgfHwgIWFkZHJwKQogCQkJYnJlYWs7CiAJCSpsZW4gPSA0OwpAQCAtMzAyMiw3ICszMDYyLDcgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogCWNhc2UgUEZfSU5FVDY6Ci0JCXJldCA9IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc2tiLCBhZCk7CisJCXJldCA9IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc2tiLCBhZCwgcHJvdG8pOwogCQlpZiAocmV0IHx8ICFhZGRycCkKIAkJCWJyZWFrOwogCQkqbGVuID0gMTY7CkBAIC0zMTAwLDkgKzMxNDAsNyBAQAogCWlmIChzb2NrLT5zaykgewogCQlza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKIAkJc2tzZWMtPnNpZCA9IGlzZWMtPnNpZDsKLQkJZXJyID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHNvY2ssCi0JCQkJCQkJZmFtaWx5LAotCQkJCQkJCWlzZWMtPnNpZCk7CisJCWVyciA9IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzb2NrKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtMzE3OSw3ICszMjE3LDExIEBACiAJCWNhc2UgU0VDQ0xBU1NfVURQX1NPQ0tFVDoKIAkJCW5vZGVfcGVybSA9IFVEUF9TT0NLRVRfX05PREVfQklORDsKIAkJCWJyZWFrOwotCQkJCisKKwkJY2FzZSBTRUNDTEFTU19EQ0NQX1NPQ0tFVDoKKwkJCW5vZGVfcGVybSA9IERDQ1BfU09DS0VUX19OT0RFX0JJTkQ7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJbm9kZV9wZXJtID0gUkFXSVBfU09DS0VUX19OT0RFX0JJTkQ7CiAJCQlicmVhazsKQEAgLTMyMTcsMTYgKzMyNTksMTcgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qCi0JICogSWYgYSBUQ1Agc29ja2V0LCBjaGVjayBuYW1lX2Nvbm5lY3QgcGVybWlzc2lvbiBmb3IgdGhlIHBvcnQuCisJICogSWYgYSBUQ1Agb3IgRENDUCBzb2NrZXQsIGNoZWNrIG5hbWVfY29ubmVjdCBwZXJtaXNzaW9uIGZvciB0aGUgcG9ydC4KIAkgKi8KIAlpc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKLQlpZiAoaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1RDUF9TT0NLRVQpIHsKKwlpZiAoaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1RDUF9TT0NLRVQgfHwKKwkgICAgaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX0RDQ1BfU09DS0VUKSB7CiAJCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSBOVUxMOwogCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IE5VTEw7CiAJCXVuc2lnbmVkIHNob3J0IHNudW07Ci0JCXUzMiBzaWQ7CisJCXUzMiBzaWQsIHBlcm07CiAKIAkJaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVCkgewogCQkJYWRkcjQgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcmVzczsKQEAgLTMyNDUsMTEgKzMyODgsMTMgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCisJCXBlcm0gPSAoaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1RDUF9TT0NLRVQpID8KKwkJICAgICAgIFRDUF9TT0NLRVRfX05BTUVfQ09OTkVDVCA6IERDQ1BfU09DS0VUX19OQU1FX0NPTk5FQ1Q7CisKIAkJQVZDX0FVRElUX0RBVEFfSU5JVCgmYWQsTkVUKTsKIAkJYWQudS5uZXQuZHBvcnQgPSBodG9ucyhzbnVtKTsKIAkJYWQudS5uZXQuZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKLQkJZXJyID0gYXZjX2hhc19wZXJtKGlzZWMtPnNpZCwgc2lkLCBpc2VjLT5zY2xhc3MsCi0JCQkJICAgVENQX1NPQ0tFVF9fTkFNRV9DT05ORUNULCAmYWQpOworCQllcnIgPSBhdmNfaGFzX3Blcm0oaXNlYy0+c2lkLCBzaWQsIGlzZWMtPnNjbGFzcywgcGVybSwgJmFkKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTM0MzcsNyArMzQ4MiwxMyBAQAogCQlub2RlX3Blcm0gPSBOT0RFX19UQ1BfUkVDVjsKIAkJcmVjdl9wZXJtID0gVENQX1NPQ0tFVF9fUkVDVl9NU0c7CiAJCWJyZWFrOwotCQorCisJY2FzZSBTRUNDTEFTU19EQ0NQX1NPQ0tFVDoKKwkJbmV0aWZfcGVybSA9IE5FVElGX19EQ0NQX1JFQ1Y7CisJCW5vZGVfcGVybSA9IE5PREVfX0RDQ1BfUkVDVjsKKwkJcmVjdl9wZXJtID0gRENDUF9TT0NLRVRfX1JFQ1ZfTVNHOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCW5ldGlmX3Blcm0gPSBORVRJRl9fUkFXSVBfUkVDVjsKIAkJbm9kZV9wZXJtID0gTk9ERV9fUkFXSVBfUkVDVjsKQEAgLTM0ODYsMTQgKzM1MzcsMTQgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBIYW5kbGUgbWFwcGVkIElQdjQgcGFja2V0cyBhcnJpdmluZyB2aWEgSVB2NiBzb2NrZXRzICovCi0JaWYgKGZhbWlseSA9PSBQRl9JTkVUNiAmJiBza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkKKwlpZiAoZmFtaWx5ID09IFBGX0lORVQ2ICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQogCQlmYW1pbHkgPSBQRl9JTkVUOwogCiAJQVZDX0FVRElUX0RBVEFfSU5JVCgmYWQsIE5FVCk7CiAJYWQudS5uZXQubmV0aWYgPSBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIlt1bmtub3duXSI7CiAJYWQudS5uZXQuZmFtaWx5ID0gZmFtaWx5OwogCi0JZXJyID0gc2VsaW51eF9wYXJzZV9za2Ioc2tiLCAmYWQsICZhZGRycCwgJmxlbiwgMSk7CisJZXJyID0gc2VsaW51eF9wYXJzZV9za2Ioc2tiLCAmYWQsICZhZGRycCwgJmxlbiwgMSwgTlVMTCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTM1MjMsMjUgKzM1NzQsMTYgQEAKIAl1MzIgc2NvbnRleHRfbGVuOwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWM7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKLQl1MzIgcGVlcl9zaWQgPSAwOworCXUzMiBwZWVyX3NpZCA9IFNFQ1NJRF9OVUxMOwogCiAJaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7CiAKLQkvKiBpZiBVTklYX1NUUkVBTSBjaGVjayBwZWVyX3NpZCwgaWYgVENQIGNoZWNrIGRzdCBmb3IgbGFiZWxsZWQgc2EgKi8KLQlpZiAoaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1VOSVhfU1RSRUFNX1NPQ0tFVCkgeworCWlmIChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVU5JWF9TVFJFQU1fU09DS0VUIHx8CisJICAgIGlzZWMtPnNjbGFzcyA9PSBTRUNDTEFTU19UQ1BfU09DS0VUKSB7CiAJCXNzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CiAJCXBlZXJfc2lkID0gc3NlYy0+cGVlcl9zaWQ7CiAJfQotCWVsc2UgaWYgKGlzZWMtPnNjbGFzcyA9PSBTRUNDTEFTU19UQ1BfU09DS0VUKSB7Ci0JCXBlZXJfc2lkID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtKHNvY2spOwotCQlpZiAocGVlcl9zaWQgPT0gU0VDU0lEX05VTEwpCi0JCQlwZWVyX3NpZCA9IHNlbGludXhfc29ja2V0X2dldHBlZXJfc3RyZWFtKHNvY2stPnNrKTsKLQkJaWYgKHBlZXJfc2lkID09IFNFQ1NJRF9OVUxMKSB7Ci0JCQllcnIgPSAtRU5PUFJPVE9PUFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQllbHNlIHsKKwlpZiAocGVlcl9zaWQgPT0gU0VDU0lEX05VTEwpIHsKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNTczLDEzICszNjE1LDEyIEBACiAJdTMyIHBlZXJfc2VjaWQgPSBTRUNTSURfTlVMTDsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChzb2NrICYmIChzb2NrLT5zay0+c2tfZmFtaWx5ID09IFBGX1VOSVgpKQorCWlmIChzb2NrICYmIHNvY2stPnNrLT5za19mYW1pbHkgPT0gUEZfVU5JWCkKIAkJc2VsaW51eF9nZXRfaW5vZGVfc2lkKFNPQ0tfSU5PREUoc29jayksICZwZWVyX3NlY2lkKTsKLQllbHNlIGlmIChza2IpIHsKLQkJcGVlcl9zZWNpZCA9IHNlbGludXhfbmV0bGJsX3NvY2tldF9nZXRwZWVyc2VjX2RncmFtKHNrYik7Ci0JCWlmIChwZWVyX3NlY2lkID09IFNFQ1NJRF9OVUxMKQotCQkJcGVlcl9zZWNpZCA9IHNlbGludXhfc29ja2V0X2dldHBlZXJfZGdyYW0oc2tiKTsKLQl9CisJZWxzZSBpZiAoc2tiKQorCQlzZWN1cml0eV9za2JfZXh0bGJsX3NpZChza2IsCisJCQkJCVNFQ0lOSVRTSURfVU5MQUJFTEVELAorCQkJCQkmcGVlcl9zZWNpZCk7CiAKIAlpZiAocGVlcl9zZWNpZCA9PSBTRUNTSURfTlVMTCkKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTM2MDYsNyArMzY0Nyw3IEBACiAJbmV3c3NlYy0+c2lkID0gc3NlYy0+c2lkOwogCW5ld3NzZWMtPnBlZXJfc2lkID0gc3NlYy0+cGVlcl9zaWQ7CiAKLQlzZWxpbnV4X25ldGxibF9za19jbG9uZV9zZWN1cml0eShzc2VjLCBuZXdzc2VjKTsKKwlzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZShzc2VjLCBuZXdzc2VjKTsKIH0KIAogc3RhdGljIHZvaWQgc2VsaW51eF9za19nZXRzZWNpZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiAqc2VjaWQpCkBAIC0zNjQwLDE3ICszNjgxLDEwIEBACiAJdTMyIG5ld3NpZDsKIAl1MzIgcGVlcnNpZDsKIAotCW5ld3NpZCA9IHNlbGludXhfbmV0bGJsX2luZXRfY29ubl9yZXF1ZXN0KHNrYiwgc2tzZWMtPnNpZCk7Ci0JaWYgKG5ld3NpZCAhPSBTRUNTSURfTlVMTCkgewotCQlyZXEtPnNlY2lkID0gbmV3c2lkOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQllcnIgPSBzZWxpbnV4X3hmcm1fZGVjb2RlX3Nlc3Npb24oc2tiLCAmcGVlcnNpZCwgMCk7Ci0JQlVHX09OKGVycik7Ci0KKwlzZWN1cml0eV9za2JfZXh0bGJsX3NpZChza2IsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCAmcGVlcnNpZCk7CiAJaWYgKHBlZXJzaWQgPT0gU0VDU0lEX05VTEwpIHsKIAkJcmVxLT5zZWNpZCA9IHNrc2VjLT5zaWQ7CisJCXJlcS0+cGVlcl9zZWNpZCA9IFNFQ1NJRF9OVUxMOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM2NTksNiArMzY5Myw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlyZXEtPnNlY2lkID0gbmV3c2lkOworCXJlcS0+cGVlcl9zZWNpZCA9IHBlZXJzaWQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2NjgsMTIgKzM3MDMsMjMgQEAKIAlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpuZXdza3NlYyA9IG5ld3NrLT5za19zZWN1cml0eTsKIAogCW5ld3Nrc2VjLT5zaWQgPSByZXEtPnNlY2lkOworCW5ld3Nrc2VjLT5wZWVyX3NpZCA9IHJlcS0+cGVlcl9zZWNpZDsKIAkvKiBOT1RFOiBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBnZXQgdGhlIGlzZWMtPnNpZCBmb3IgdGhlCiAJICAgbmV3IHNvY2tldCBpbiBzeW5jLCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgaXNlYyBhdmFpbGFibGUgeWV0LgogCSAgIFNvIHdlIHdpbGwgd2FpdCB1bnRpbCBzb2NrX2dyYWZ0IHRvIGRvIGl0LCBieSB3aGljaAogCSAgIHRpbWUgaXQgd2lsbCBoYXZlIGJlZW4gY3JlYXRlZCBhbmQgYXZhaWxhYmxlLiAqLwogCi0Jc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdChuZXdza3NlYywgcmVxLT5yc2tfb3BzLT5mYW1pbHkpOworCS8qIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgc29ydCBvZiBsb2NrIGhlcmUgYXMgd2UgYXJlIHRoZSBvbmx5CisJICogdGhyZWFkIHdpdGggYWNjZXNzIHRvIG5ld3Nrc2VjICovCisJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQobmV3c2tzZWMsIHJlcS0+cnNrX29wcy0+ZmFtaWx5KTsKK30KKworc3RhdGljIHZvaWQgc2VsaW51eF9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQoc3RydWN0IHNvY2sgKnNrLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CisKKwlzZWN1cml0eV9za2JfZXh0bGJsX3NpZChza2IsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCAmc2tzZWMtPnBlZXJfc2lkKTsKIH0KIAogc3RhdGljIHZvaWQgc2VsaW51eF9yZXFfY2xhc3NpZnlfZmxvdyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCkBAIC0zNzU2LDcgKzM4MDIsMTMgQEAKIAkJbm9kZV9wZXJtID0gTk9ERV9fVENQX1NFTkQ7CiAJCXNlbmRfcGVybSA9IFRDUF9TT0NLRVRfX1NFTkRfTVNHOwogCQlicmVhazsKLQkKKworCWNhc2UgU0VDQ0xBU1NfRENDUF9TT0NLRVQ6CisJCW5ldGlmX3Blcm0gPSBORVRJRl9fRENDUF9TRU5EOworCQlub2RlX3Blcm0gPSBOT0RFX19EQ0NQX1NFTkQ7CisJCXNlbmRfcGVybSA9IERDQ1BfU09DS0VUX19TRU5EX01TRzsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQluZXRpZl9wZXJtID0gTkVUSUZfX1JBV0lQX1NFTkQ7CiAJCW5vZGVfcGVybSA9IE5PREVfX1JBV0lQX1NFTkQ7CkBAIC0zODA3LDYgKzM4NTksNyBAQAogCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopb3V0OwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjOworCXU4IHByb3RvOwogCiAJc2sgPSBza2ItPnNrOwogCWlmICghc2spCkBAIC0zODE4LDcgKzM4NzEsNyBAQAogCWFkLnUubmV0Lm5ldGlmID0gZGV2LT5uYW1lOwogCWFkLnUubmV0LmZhbWlseSA9IGZhbWlseTsKIAotCWVyciA9IHNlbGludXhfcGFyc2Vfc2tiKHNrYiwgJmFkLCAmYWRkcnAsICZsZW4sIDApOworCWVyciA9IHNlbGludXhfcGFyc2Vfc2tiKHNrYiwgJmFkLCAmYWRkcnAsICZsZW4sIDAsICZwcm90byk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTM4MzIsNyArMzg4NSw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBzZWxpbnV4X3hmcm1fcG9zdHJvdXRlX2xhc3Qoc2tzZWMtPnNpZCwgc2tiLCAmYWQpOworCWVyciA9IHNlbGludXhfeGZybV9wb3N0cm91dGVfbGFzdChza3NlYy0+c2lkLCBza2IsICZhZCwgcHJvdG8pOwogb3V0OgogCXJldHVybiBlcnIgPyBORl9EUk9QIDogTkZfQUNDRVBUOwogfQpAQCAtNDczOCw2ICs0NzkxLDcgQEAKIAkuc29ja19ncmFmdCA9CQkJc2VsaW51eF9zb2NrX2dyYWZ0LAogCS5pbmV0X2Nvbm5fcmVxdWVzdCA9CQlzZWxpbnV4X2luZXRfY29ubl9yZXF1ZXN0LAogCS5pbmV0X2Nza19jbG9uZSA9CQlzZWxpbnV4X2luZXRfY3NrX2Nsb25lLAorCS5pbmV0X2Nvbm5fZXN0YWJsaXNoZWQgPQlzZWxpbnV4X2luZXRfY29ubl9lc3RhYmxpc2hlZCwKIAkucmVxX2NsYXNzaWZ5X2Zsb3cgPQkJc2VsaW51eF9yZXFfY2xhc3NpZnlfZmxvdywKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KQEAgLTQ3NTAsNyArNDgwNCw2IEBACiAJLnhmcm1fc3RhdGVfZGVsZXRlX3NlY3VyaXR5ID0Jc2VsaW51eF94ZnJtX3N0YXRlX2RlbGV0ZSwKIAkueGZybV9wb2xpY3lfbG9va3VwID0gCQlzZWxpbnV4X3hmcm1fcG9saWN5X2xvb2t1cCwKIAkueGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCA9CXNlbGludXhfeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCwKLQkueGZybV9mbG93X3N0YXRlX21hdGNoID0Jc2VsaW51eF94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2gsCiAJLnhmcm1fZGVjb2RlX3Nlc3Npb24gPQkJc2VsaW51eF94ZnJtX2RlY29kZV9zZXNzaW9uLAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9pbmhlcml0LmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfaW5oZXJpdC5oCmluZGV4IGE2OGZkZDUuLjgzNzdhNGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9pbmhlcml0LmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X2luaGVyaXQuaApAQCAtMzAsMyArMzAsNCBAQAogICAgU18oU0VDQ0xBU1NfTkVUTElOS19ETlJUX1NPQ0tFVCwgc29ja2V0LCAweDAwNDAwMDAwVUwpCiAgICBTXyhTRUNDTEFTU19ORVRMSU5LX0tPQkpFQ1RfVUVWRU5UX1NPQ0tFVCwgc29ja2V0LCAweDAwNDAwMDAwVUwpCiAgICBTXyhTRUNDTEFTU19BUFBMRVRBTEtfU09DS0VULCBzb2NrZXQsIDB4MDA0MDAwMDBVTCkKKyAgIFNfKFNFQ0NMQVNTX0RDQ1BfU09DS0VULCBzb2NrZXQsIDB4MDA0MDAwMDBVTCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKaW5kZXggMDlmYzhhMi4uYWQ5ZmIyZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKQEAgLTM1LDEyICszNSwxNiBAQAogICAgU18oU0VDQ0xBU1NfTk9ERSwgTk9ERV9fUkFXSVBfUkVDViwgInJhd2lwX3JlY3YiKQogICAgU18oU0VDQ0xBU1NfTk9ERSwgTk9ERV9fUkFXSVBfU0VORCwgInJhd2lwX3NlbmQiKQogICAgU18oU0VDQ0xBU1NfTk9ERSwgTk9ERV9fRU5GT1JDRV9ERVNULCAiZW5mb3JjZV9kZXN0IikKKyAgIFNfKFNFQ0NMQVNTX05PREUsIE5PREVfX0RDQ1BfUkVDViwgImRjY3BfcmVjdiIpCisgICBTXyhTRUNDTEFTU19OT0RFLCBOT0RFX19EQ0NQX1NFTkQsICJkY2NwX3NlbmQiKQogICAgU18oU0VDQ0xBU1NfTkVUSUYsIE5FVElGX19UQ1BfUkVDViwgInRjcF9yZWN2IikKICAgIFNfKFNFQ0NMQVNTX05FVElGLCBORVRJRl9fVENQX1NFTkQsICJ0Y3Bfc2VuZCIpCiAgICBTXyhTRUNDTEFTU19ORVRJRiwgTkVUSUZfX1VEUF9SRUNWLCAidWRwX3JlY3YiKQogICAgU18oU0VDQ0xBU1NfTkVUSUYsIE5FVElGX19VRFBfU0VORCwgInVkcF9zZW5kIikKICAgIFNfKFNFQ0NMQVNTX05FVElGLCBORVRJRl9fUkFXSVBfUkVDViwgInJhd2lwX3JlY3YiKQogICAgU18oU0VDQ0xBU1NfTkVUSUYsIE5FVElGX19SQVdJUF9TRU5ELCAicmF3aXBfc2VuZCIpCisgICBTXyhTRUNDTEFTU19ORVRJRiwgTkVUSUZfX0RDQ1BfUkVDViwgImRjY3BfcmVjdiIpCisgICBTXyhTRUNDTEFTU19ORVRJRiwgTkVUSUZfX0RDQ1BfU0VORCwgImRjY3Bfc2VuZCIpCiAgICBTXyhTRUNDTEFTU19VTklYX1NUUkVBTV9TT0NLRVQsIFVOSVhfU1RSRUFNX1NPQ0tFVF9fQ09OTkVDVFRPLCAiY29ubmVjdHRvIikKICAgIFNfKFNFQ0NMQVNTX1VOSVhfU1RSRUFNX1NPQ0tFVCwgVU5JWF9TVFJFQU1fU09DS0VUX19ORVdDT05OLCAibmV3Y29ubiIpCiAgICBTXyhTRUNDTEFTU19VTklYX1NUUkVBTV9TT0NLRVQsIFVOSVhfU1RSRUFNX1NPQ0tFVF9fQUNDRVBURlJPTSwgImFjY2VwdGZyb20iKQpAQCAtMjUyLDMgKzI1Niw3IEBACiAgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fTElOSywgImxpbmsiKQogICAgU18oU0VDQ0xBU1NfS0VZLCBLRVlfX1NFVEFUVFIsICJzZXRhdHRyIikKICAgIFNfKFNFQ0NMQVNTX0tFWSwgS0VZX19DUkVBVEUsICJjcmVhdGUiKQorICAgU18oU0VDQ0xBU1NfQ09OVEVYVCwgQ09OVEVYVF9fVFJBTlNMQVRFLCAidHJhbnNsYXRlIikKKyAgIFNfKFNFQ0NMQVNTX0NPTlRFWFQsIENPTlRFWFRfX0NPTlRBSU5TLCAiY29udGFpbnMiKQorICAgU18oU0VDQ0xBU1NfRENDUF9TT0NLRVQsIERDQ1BfU09DS0VUX19OT0RFX0JJTkQsICJub2RlX2JpbmQiKQorICAgU18oU0VDQ0xBU1NfRENDUF9TT0NLRVQsIERDQ1BfU09DS0VUX19OQU1FX0NPTk5FQ1QsICJuYW1lX2Nvbm5lY3QiKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAppbmRleCA4MWY0ZjUyLi4yZGU0YjVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaApAQCAtMzEyLDYgKzMxMiw4IEBACiAjZGVmaW5lIE5PREVfX1JBV0lQX1JFQ1YgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAogI2RlZmluZSBOT0RFX19SQVdJUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKICNkZWZpbmUgTk9ERV9fRU5GT1JDRV9ERVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIE5PREVfX0RDQ1BfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBOT0RFX19EQ0NQX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKIAogI2RlZmluZSBORVRJRl9fVENQX1JFQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUSUZfX1RDUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCkBAIC0zMTksNiArMzIxLDggQEAKICNkZWZpbmUgTkVUSUZfX1VEUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCiAjZGVmaW5lIE5FVElGX19SQVdJUF9SRUNWICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAogI2RlZmluZSBORVRJRl9fUkFXSVBfU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgTkVUSUZfX0RDQ1BfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIE5FVElGX19EQ0NQX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAogCiAjZGVmaW5lIE5FVExJTktfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBORVRMSU5LX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKQEAgLTk3MCwzICs5NzQsMzEgQEAKICNkZWZpbmUgS0VZX19MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFVMCiAjZGVmaW5lIEtFWV9fU0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVTAogI2RlZmluZSBLRVlfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKKworI2RlZmluZSBDT05URVhUX19UUkFOU0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgQ09OVEVYVF9fQ09OVEFJTlMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCisKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fU0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19SRUxBQkVMRlJPTSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fUkVMQUJFTFRPICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0FQUEVORCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19CSU5EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0xJU1RFTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19BQ0NFUFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fR0VUT1BUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX1NFVE9QVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19TSFVURE9XTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fUkVDVkZST00gICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX1NFTkRUTyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19OT0RFX0JJTkQgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fTkFNRV9DT05ORUNUICAgICAgICAgICAgICAgICAweDAwODAwMDAwVUwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaAppbmRleCA5NjBlZjE4Li42ZWQxMGMzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Yy5oCkBAIC01NCwxMiArNTQsMTIgQEAKIAkJCWNoYXIgKm5ldGlmOwogCQkJc3RydWN0IHNvY2sgKnNrOwogCQkJdTE2IGZhbWlseTsKLQkJCXUxNiBkcG9ydDsKLQkJCXUxNiBzcG9ydDsKKwkJCV9fYmUxNiBkcG9ydDsKKwkJCV9fYmUxNiBzcG9ydDsKIAkJCXVuaW9uIHsKIAkJCQlzdHJ1Y3QgewotCQkJCQl1MzIgZGFkZHI7Ci0JCQkJCXUzMiBzYWRkcjsKKwkJCQkJX19iZTMyIGRhZGRyOworCQkJCQlfX2JlMzIgc2FkZHI7CiAJCQkJfSB2NDsKIAkJCQlzdHJ1Y3QgewogCQkJCQlzdHJ1Y3QgaW42X2FkZHIgZGFkZHI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmgKaW5kZXggNDUwYTI4My4uZmY4NjllOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Y19zcy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmNfc3MuaApAQCAtMTAsNSArMTAsMjkgQEAKIAogaW50IGF2Y19zc19yZXNldCh1MzIgc2Vxbm8pOwogCitzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcKK3sKKwl1MTYgdGNsYXNzOworCXUzMiB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RydWN0IGF2X2luaGVyaXQKK3sKKwl1MTYgdGNsYXNzOworCWNvbnN0IGNoYXIgKipjb21tb25fcHRzOworCXUzMiBjb21tb25fYmFzZTsKK307CisKK3N0cnVjdCBzZWxpbnV4X2NsYXNzX3Blcm0KK3sKKwljb25zdCBzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcgKmF2X3Blcm1fdG9fc3RyaW5nOworCXUzMiBhdl9wdHNfbGVuOworCWNvbnN0IGNoYXIgKipjbGFzc190b19zdHJpbmc7CisJdTMyIGN0c19sZW47CisJY29uc3Qgc3RydWN0IGF2X2luaGVyaXQgKmF2X2luaGVyaXQ7CisJdTMyIGF2X2luaGVyaXRfbGVuOworfTsKKwogI2VuZGlmIC8qIF9TRUxJTlVYX0FWQ19TU19IXyAqLwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NfdG9fc3RyaW5nLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NfdG9fc3RyaW5nLmgKaW5kZXggMjQzMDNiNi4uOWYzZWJiMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzX3RvX3N0cmluZy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc190b19zdHJpbmcuaApAQCAtNjEsMyArNjEsNSBAQAogICAgIFNfKCJhcHBsZXRhbGtfc29ja2V0IikKICAgICBTXygicGFja2V0IikKICAgICBTXygia2V5IikKKyAgICBTXygiY29udGV4dCIpCisgICAgU18oImRjY3Bfc29ja2V0IikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9mbGFzay5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKaW5kZXggOTU4ODdhZS4uNjdjZWYzNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKQEAgLTYzLDYgKzYzLDggQEAKICNkZWZpbmUgU0VDQ0xBU1NfQVBQTEVUQUxLX1NPQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgIDU2CiAjZGVmaW5lIFNFQ0NMQVNTX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NwogI2RlZmluZSBTRUNDTEFTU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgKKyNkZWZpbmUgU0VDQ0xBU1NfQ09OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5CisjZGVmaW5lIFNFQ0NMQVNTX0RDQ1BfU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MAogCiAvKgogICogU2VjdXJpdHkgaWRlbnRpZmllciBpbmRpY2VzIGZvciBpbml0aWFsIGVudGl0aWVzCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmgKaW5kZXggZWYyMjY3Zi4uOTFiODhmMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL29ianNlYy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9vYmpzZWMuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlICJmbGFzay5oIgogI2luY2x1ZGUgImF2Yy5oIgogCkBAIC0xMDgsNiArMTA5LDcgQEAKIAkJTkxCTF9SRVFVSVJFLAogCQlOTEJMX0xBQkVMRUQsCiAJfSBubGJsX3N0YXRlOworCXNwaW5sb2NrX3QgbmxibF9sb2NrOwkJLyogcHJvdGVjdHMgbmxibF9zdGF0ZSAqLwogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCmluZGV4IDFlZjc5MTcuLjIxMGVlYzcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCkBAIC0zNCw2ICszNCw4IEBACiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCVBPTElDWURCX1ZFUlNJT05fUkFOR0VUUkFOUwogI2VuZGlmCiAKK3N0cnVjdCBza19idWZmOworCiBleHRlcm4gaW50IHNlbGludXhfZW5hYmxlZDsKIGV4dGVybiBpbnQgc2VsaW51eF9tbHNfZW5hYmxlZDsKIApAQCAtODAsNiArODIsOCBAQAogaW50IHNlY3VyaXR5X25vZGVfc2lkKHUxNiBkb21haW4sIHZvaWQgKmFkZHIsIHUzMiBhZGRybGVuLAogCXUzMiAqb3V0X3NpZCk7CiAKK3ZvaWQgc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGJhc2Vfc2lkLCB1MzIgKnNpZCk7CisKIGludCBzZWN1cml0eV92YWxpZGF0ZV90cmFuc2l0aW9uKHUzMiBvbGRzaWQsIHUzMiBuZXdzaWQsIHUzMiB0YXNrc2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHRjbGFzcyk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWxpbnV4X25ldGxhYmVsLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VsaW51eF9uZXRsYWJlbC5oCmluZGV4IDlkZTEwY2MuLjJhNzMyYzkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWxpbnV4X25ldGxhYmVsLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlbGludXhfbmV0bGFiZWwuaApAQCAtMzgsMTkgKzM4LDE3IEBACiAKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKTsKLWludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkgICAgICBpbnQgc29ja19mYW1pbHksCi0JCQkJICAgICAgdTMyIHNpZCk7CitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX2dldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYmFzZV9zaWQsIHUzMiAqc2lkKTsKK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jayk7CiB2b2lkIHNlbGludXhfbmV0bGJsX3NvY2tfZ3JhZnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKLXUzMiBzZWxpbnV4X25ldGxibF9pbmV0X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgc29ja19zaWQpOwogaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpOwotdTMyIHNlbGludXhfbmV0bGJsX3NvY2tldF9nZXRwZWVyc2VjX3N0cmVhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKLXUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKKwkJCQkgICAgICBpbnQgZmFtaWx5KTsKIHZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdChzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAogCQkJCSAgICAgaW50IGZhbWlseSk7Ci12b2lkIHNlbGludXhfbmV0bGJsX3NrX2Nsb25lX3NlY3VyaXR5KHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCit2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2Nsb25lKHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCiAJCQkJICAgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqbmV3c3NlYyk7CiBpbnQgc2VsaW51eF9uZXRsYmxfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywKQEAgLTYyLDkgKzYwLDE1IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkJCSAgICBpbnQgc29ja19mYW1pbHksCi0JCQkJCQkgICAgdTMyIHNpZCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICAgIHUzMiBiYXNlX3NpZCwKKwkJCQkJICAgICAgIHUzMiAqc2lkKQoreworCSpzaWQgPSBTRUNTSURfTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2spCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC03NSwxMiArNzksNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgIHUzMiBzb2NrX3NpZCkKLXsKLQlyZXR1cm4gU0VDU0lEX05VTEw7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKIAkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICAgc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKQEAgLTg4LDE0ICs4NiwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc3RydWN0IHNvY2tldCAqc29jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9yZXNldCgKKwkJCQkJICAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCisJCQkJCSAgICAgICBpbnQgZmFtaWx5KQogewotCXJldHVybiBTRUNTSURfTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgc2VsaW51eF9uZXRsYmxfc29ja2V0X2dldHBlZXJzZWNfZGdyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gU0VDU0lEX05VTEw7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdCgKQEAgLTEwNSw3ICsxMDAsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX2Nsb25lX3NlY3VyaXR5KAorc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2Nsb25lKAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKIAkJCQkJICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqbmV3c3NlYykKIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUveGZybS5oCmluZGV4IDUyNmIyODAuLjE2MWViNTcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3hmcm0uaApAQCAtOCwyMCArOCwxNyBAQAogI2RlZmluZSBfU0VMSU5VWF9YRlJNX0hfCiAKIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2FsbG9jKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsCi0JCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHNvY2sgKnNrKTsKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KTsKIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2Nsb25lKHN0cnVjdCB4ZnJtX3BvbGljeSAqb2xkLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKm5ldyk7CiB2b2lkIHNlbGludXhfeGZybV9wb2xpY3lfZnJlZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKTsKIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2RlbGV0ZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKTsKIGludCBzZWxpbnV4X3hmcm1fc3RhdGVfYWxsb2Moc3RydWN0IHhmcm1fc3RhdGUgKngsCi0Jc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LCBzdHJ1Y3QgeGZybV9zZWNfY3R4ICpwb2wsIHUzMiBzZWNpZCk7CisJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LCB1MzIgc2VjaWQpOwogdm9pZCBzZWxpbnV4X3hmcm1fc3RhdGVfZnJlZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiBpbnQgc2VsaW51eF94ZnJtX3N0YXRlX2RlbGV0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9sb29rdXAoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgdTMyIGZsX3NlY2lkLCB1OCBkaXIpOwogaW50IHNlbGludXhfeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKIAkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCBmbG93aSAqZmwpOwotaW50IHNlbGludXhfeGZybV9mbG93X3N0YXRlX21hdGNoKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLAotCQkJc3RydWN0IHhmcm1fcG9saWN5ICp4cCk7Ci0KIAogLyoKICAqIEV4dHJhY3QgdGhlIHNlY3VyaXR5IGJsb2IgZnJvbSB0aGUgc29jayAoaXQncyBhY3R1YWxseSBvbiB0aGUgc29ja2V0KQpAQCAtMzgsOSArMzUsNyBAQAogaW50IHNlbGludXhfeGZybV9zb2NrX3Jjdl9za2IodTMyIHNpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpOwogaW50IHNlbGludXhfeGZybV9wb3N0cm91dGVfbGFzdCh1MzIgaXNlY19zaWQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkKTsKLXUzMiBzZWxpbnV4X3NvY2tldF9nZXRwZWVyX3N0cmVhbShzdHJ1Y3Qgc29jayAqc2spOwotdTMyIHNlbGludXhfc29ja2V0X2dldHBlZXJfZGdyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkLCB1OCBwcm90byk7CiBpbnQgc2VsaW51eF94ZnJtX2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqc2lkLCBpbnQgY2thbGwpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfeGZybV9zb2NrX3Jjdl9za2IodTMyIGlzZWNfc2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNTAsMjAgKzQ1LDExIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfeGZybV9wb3N0cm91dGVfbGFzdCh1MzIgaXNlY19zaWQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkKQorCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwgdTggcHJvdG8pCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfc29ja2V0X2dldHBlZXJfc3RyZWFtKHN0cnVjdCBzb2NrICpzaykKLXsKLQlyZXR1cm4gU0VDU0lEX05VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfc29ja2V0X2dldHBlZXJfZGdyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gU0VDU0lEX05VTEw7Ci19CiBzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X3hmcm1fZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICpzaWQsIGludCBja2FsbCkKIHsKIAkqc2lkID0gU0VDU0lEX05VTEw7CkBAIC03MSw0ICs1NywxMCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X3NrYl94ZnJtX3NpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKnNpZCkKK3sKKwlpbnQgZXJyID0gc2VsaW51eF94ZnJtX2RlY29kZV9zZXNzaW9uKHNrYiwgc2lkLCAwKTsKKwlCVUdfT04oZXJyKTsKK30KKwogI2VuZGlmIC8qIF9TRUxJTlVYX1hGUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwppbmRleCBiOGY0ZDI1Li5jY2ZlODc1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCkBAIC02MCw3ICs2MCw2IEBACiAJeyBSVE1fREVMQUNUSU9OLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKIAl7IFJUTV9HRVRBQ1RJT04sCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19SRUFEICB9LAogCXsgUlRNX05FV1BSRUZJWCwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCi0JeyBSVE1fR0VUUFJFRklYLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKIAl7IFJUTV9HRVRNVUxUSUNBU1QsCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19SRUFEICB9LAogCXsgUlRNX0dFVEFOWUNBU1QsCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19SRUFEICB9LAogCXsgUlRNX0dFVE5FSUdIVEJMLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKaW5kZXggZDUzOTM0Ni4uY2U0OTJhNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKQEAgLTYsNyArNiw3IEBACiAvKgogICogVXBkYXRlZDogSGV3bGV0dC1QYWNrYXJkIDxwYXVsLm1vb3JlQGhwLmNvbT4KICAqCi0gKiAgICAgIEFkZGVkIGViaXRtYXBfZXhwb3J0KCkgYW5kIGViaXRtYXBfaW1wb3J0KCkKKyAqICAgICAgQWRkZWQgc3VwcG9ydCB0byBpbXBvcnQvZXhwb3J0IHRoZSBOZXRMYWJlbCBjYXRlZ29yeSBiaXRtYXAKICAqCiAgKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA2CiAgKi8KQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KICNpbmNsdWRlICJlYml0bWFwLmgiCiAjaW5jbHVkZSAicG9saWN5ZGIuaCIKIApAQCAtNjcsMTQxICs2OCwxMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRMQUJFTAogLyoqCi0gKiBlYml0bWFwX2V4cG9ydCAtIEV4cG9ydCBhbiBlYml0bWFwIHRvIGEgdW5zaWduZWQgY2hhciBiaXRtYXAgc3RyaW5nCi0gKiBAc3JjOiB0aGUgZWJpdG1hcCB0byBleHBvcnQKLSAqIEBkc3Q6IHRoZSByZXN1bHRpbmcgYml0bWFwIHN0cmluZwotICogQGRzdF9sZW46IGxlbmd0aCBvZiBkc3QgaW4gYnl0ZXMKKyAqIGViaXRtYXBfbmV0bGJsX2V4cG9ydCAtIEV4cG9ydCBhbiBlYml0bWFwIGludG8gYSBOZXRMYWJlbCBjYXRlZ29yeSBiaXRtYXAKKyAqIEBlYm1hcDogdGhlIGViaXRtYXAgdG8gZXhwb3J0CisgKiBAY2F0bWFwOiB0aGUgTmV0TGFiZWwgY2F0ZWdvcnkgYml0bWFwCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBBbGxvY2F0ZSBhIGJ1ZmZlciBhdCBsZWFzdCBzcmMtPmhpZ2hiaXQgYml0cyBsb25nIGFuZCBleHBvcnQgdGhlIGV4dGVuc2libGUKLSAqIGJpdG1hcCBpbnRvIHRoZSBidWZmZXIuICBUaGUgYml0bWFwIHN0cmluZyB3aWxsIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LAotICogaS5lLiBMU0IgZmlyc3QuICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gZHN0X2xlbiBtYXkgbm90IHRoZSB0cnVlIHNpemUgb2YgdGhlCi0gKiBidWZmZXIgYXMgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBNQVBUWVBFLgotICogVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIGJ1ZmZlciB3aGVuIGZpbmlzaGVkLiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywKLSAqIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogRXhwb3J0IGEgU0VMaW51eCBleHRlbnNpYmlsZSBiaXRtYXAgaW50byBhIE5ldExhYmVsIGNhdGVnb3J5IGJpdG1hcC4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZXJyb3IuCiAgKgogICovCi1pbnQgZWJpdG1hcF9leHBvcnQoY29uc3Qgc3RydWN0IGViaXRtYXAgKnNyYywKLQkJICAgdW5zaWduZWQgY2hhciAqKmRzdCwKLQkJICAgc2l6ZV90ICpkc3RfbGVuKQoraW50IGViaXRtYXBfbmV0bGJsX2V4cG9ydChzdHJ1Y3QgZWJpdG1hcCAqZWJtYXAsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICoqY2F0bWFwKQogewotCXNpemVfdCBiaXRtYXBfbGVuOwotCXVuc2lnbmVkIGNoYXIgKmJpdG1hcDsKLQlzdHJ1Y3QgZWJpdG1hcF9ub2RlICppdGVyX25vZGU7Ci0JTUFQVFlQRSBub2RlX3ZhbDsKLQlzaXplX3QgYml0bWFwX2J5dGU7Ci0JdW5zaWduZWQgY2hhciBiaXRtYXNrOworCXN0cnVjdCBlYml0bWFwX25vZGUgKmVfaXRlciA9IGVibWFwLT5ub2RlOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjX2l0ZXI7CisJdTMyIGNtYXBfaWR4OwogCi0JaWYgKHNyYy0+aGlnaGJpdCA9PSAwKSB7Ci0JCSpkc3QgPSBOVUxMOwotCQkqZHN0X2xlbiA9IDA7CisJLyogVGhpcyBmdW5jdGlvbiBpcyBhIG11Y2ggc2ltcGxlciBiZWNhdXNlIFNFTGludXgncyBNQVBUWVBFIGhhcHBlbnMKKwkgKiB0byBiZSB0aGUgc2FtZSBhcyBOZXRMYWJlbCdzIE5FVExCTF9DQVRNQVBfTUFQVFlQRSwgaWYgTUFQVFlQRSBpcworCSAqIGNoYW5nZWQgZnJvbSBhIHU2NCB0aGlzIGZ1bmN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byBiZSBjaGFuZ2VkCisJICogYXMgd2VsbC4gIEl0J3Mgbm90IGlkZWFsIGJ1dCBJIHRoaW5rIHRoZSB0cmFkZW9mZiBpbiB0ZXJtcyBvZgorCSAqIG5lYXRuZXNzIGFuZCBzcGVlZCBpcyB3b3J0aCBpdC4gKi8KKworCWlmIChlX2l0ZXIgPT0gTlVMTCkgeworCQkqY2F0bWFwID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JYml0bWFwX2xlbiA9IHNyYy0+aGlnaGJpdCAvIDg7Ci0JaWYgKHNyYy0+aGlnaGJpdCAlIDcpCi0JCWJpdG1hcF9sZW4gKz0gMTsKLQotCWJpdG1hcCA9IGt6YWxsb2MoKGJpdG1hcF9sZW4gJiB+KHNpemVvZihNQVBUWVBFKSAtIDEpKSArCi0JCQkgc2l6ZW9mKE1BUFRZUEUpLAotCQkJIEdGUF9BVE9NSUMpOwotCWlmIChiaXRtYXAgPT0gTlVMTCkKKwljX2l0ZXIgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfYWxsb2MoR0ZQX0FUT01JQyk7CisJaWYgKGNfaXRlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKKwkqY2F0bWFwID0gY19pdGVyOworCWNfaXRlci0+c3RhcnRiaXQgPSBlX2l0ZXItPnN0YXJ0Yml0ICYgfihORVRMQkxfQ0FUTUFQX1NJWkUgLSAxKTsKIAotCWl0ZXJfbm9kZSA9IHNyYy0+bm9kZTsKLQlkbyB7Ci0JCWJpdG1hcF9ieXRlID0gaXRlcl9ub2RlLT5zdGFydGJpdCAvIDg7Ci0JCWJpdG1hc2sgPSAweDgwOwotCQlub2RlX3ZhbCA9IGl0ZXJfbm9kZS0+bWFwOwotCQlkbyB7Ci0JCQlpZiAoYml0bWFzayA9PSAwKSB7Ci0JCQkJYml0bWFwX2J5dGUrKzsKLQkJCQliaXRtYXNrID0gMHg4MDsKLQkJCX0KLQkJCWlmIChub2RlX3ZhbCAmIChNQVBUWVBFKTB4MDEpCi0JCQkJYml0bWFwW2JpdG1hcF9ieXRlXSB8PSBiaXRtYXNrOwotCQkJbm9kZV92YWwgPj49IDE7Ci0JCQliaXRtYXNrID4+PSAxOwotCQl9IHdoaWxlIChub2RlX3ZhbCA+IDApOwotCQlpdGVyX25vZGUgPSBpdGVyX25vZGUtPm5leHQ7Ci0JfSB3aGlsZSAoaXRlcl9ub2RlKTsKKwl3aGlsZSAoZV9pdGVyICE9IE5VTEwpIHsKKwkJaWYgKGVfaXRlci0+c3RhcnRiaXQgPj0KKwkJICAgIChjX2l0ZXItPnN0YXJ0Yml0ICsgTkVUTEJMX0NBVE1BUF9TSVpFKSkgeworCQkJY19pdGVyLT5uZXh0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKEdGUF9BVE9NSUMpOworCQkJaWYgKGNfaXRlci0+bmV4dCA9PSBOVUxMKQorCQkJCWdvdG8gbmV0bGJsX2V4cG9ydF9mYWlsdXJlOworCQkJY19pdGVyID0gY19pdGVyLT5uZXh0OworCQkJY19pdGVyLT5zdGFydGJpdCA9IGVfaXRlci0+c3RhcnRiaXQgJgorCQkJCSAgICAgICAgICAgfihORVRMQkxfQ0FUTUFQX1NJWkUgLSAxKTsKKwkJfQorCQljbWFwX2lkeCA9IChlX2l0ZXItPnN0YXJ0Yml0IC0gY19pdGVyLT5zdGFydGJpdCkgLworCQkJICAgTkVUTEJMX0NBVE1BUF9NQVBTSVpFOworCQljX2l0ZXItPmJpdG1hcFtjbWFwX2lkeF0gPSBlX2l0ZXItPm1hcDsKKwkJZV9pdGVyID0gZV9pdGVyLT5uZXh0OworCX0KIAotCSpkc3QgPSBiaXRtYXA7Ci0JKmRzdF9sZW4gPSBiaXRtYXBfbGVuOwogCXJldHVybiAwOworCituZXRsYmxfZXhwb3J0X2ZhaWx1cmU6CisJbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2ZyZWUoKmNhdG1hcCk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qKgotICogZWJpdG1hcF9pbXBvcnQgLSBJbXBvcnQgYW4gdW5zaWduZWQgY2hhciBiaXRtYXAgc3RyaW5nIGludG8gYW4gZWJpdG1hcAotICogQHNyYzogdGhlIGJpdG1hcCBzdHJpbmcKLSAqIEBzcmNfbGVuOiB0aGUgYml0bWFwIGxlbmd0aCBpbiBieXRlcwotICogQGRzdDogdGhlIGVtcHR5IGViaXRtYXAKKyAqIGViaXRtYXBfbmV0bGJsX2ltcG9ydCAtIEltcG9ydCBhIE5ldExhYmVsIGNhdGVnb3J5IGJpdG1hcCBpbnRvIGFuIGViaXRtYXAKKyAqIEBlYm1hcDogdGhlIGViaXRtYXAgdG8gZXhwb3J0CisgKiBAY2F0bWFwOiB0aGUgTmV0TGFiZWwgY2F0ZWdvcnkgYml0bWFwCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbGl0dGxlIGVuZGlhbiBiaXRtYXAgc3RyaW5nIGluIHNyYyBhbmQgaW1wb3J0cyBpdCBpbnRvCi0gKiB0aGUgZWJpdG1hcCBwb2ludGVkIHRvIGJ5IGRzdC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24KLSAqIGZhaWx1cmUuCisgKiBJbXBvcnQgYSBOZXRMYWJlbCBjYXRlZ29yeSBiaXRtYXAgaW50byBhIFNFTGludXggZXh0ZW5zaWJpbGUgYml0bWFwLgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvci4KICAqCiAgKi8KLWludCBlYml0bWFwX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCSAgIHNpemVfdCBzcmNfbGVuLAotCQkgICBzdHJ1Y3QgZWJpdG1hcCAqZHN0KQoraW50IGViaXRtYXBfbmV0bGJsX2ltcG9ydChzdHJ1Y3QgZWJpdG1hcCAqZWJtYXAsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXApCiB7Ci0Jc2l6ZV90IHNyY19vZmYgPSAwOwotCXNpemVfdCBub2RlX2xpbWl0OwotCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGVfbmV3OwotCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGVfbGFzdCA9IE5VTEw7Ci0JdTMyIGlfYnl0ZTsKLQl1MzIgaV9iaXQ7Ci0JdW5zaWduZWQgY2hhciBzcmNfYnl0ZTsKKwlzdHJ1Y3QgZWJpdG1hcF9ub2RlICplX2l0ZXIgPSBOVUxMOworCXN0cnVjdCBlYml0bWFwX25vZGUgKmVtYXBfcHJldiA9IE5VTEw7CisJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNfaXRlciA9IGNhdG1hcDsKKwl1MzIgY19pZHg7CiAKLQl3aGlsZSAoc3JjX29mZiA8IHNyY19sZW4pIHsKLQkJaWYgKHNyY19sZW4gLSBzcmNfb2ZmID49IHNpemVvZihNQVBUWVBFKSkgewotCQkJaWYgKCooTUFQVFlQRSAqKSZzcmNbc3JjX29mZl0gPT0gMCkgewotCQkJCXNyY19vZmYgKz0gc2l6ZW9mKE1BUFRZUEUpOworCS8qIFRoaXMgZnVuY3Rpb24gaXMgYSBtdWNoIHNpbXBsZXIgYmVjYXVzZSBTRUxpbnV4J3MgTUFQVFlQRSBoYXBwZW5zCisJICogdG8gYmUgdGhlIHNhbWUgYXMgTmV0TGFiZWwncyBORVRMQkxfQ0FUTUFQX01BUFRZUEUsIGlmIE1BUFRZUEUgaXMKKwkgKiBjaGFuZ2VkIGZyb20gYSB1NjQgdGhpcyBmdW5jdGlvbiB3aWxsIG1vc3QgbGlrZWx5IG5lZWQgdG8gYmUgY2hhbmdlZAorCSAqIGFzIHdlbGwuICBJdCdzIG5vdCBpZGVhbCBidXQgSSB0aGluayB0aGUgdHJhZGVvZmYgaW4gdGVybXMgb2YKKwkgKiBuZWF0bmVzcyBhbmQgc3BlZWQgaXMgd29ydGggaXQuICovCisKKwlkbyB7CisJCWZvciAoY19pZHggPSAwOyBjX2lkeCA8IE5FVExCTF9DQVRNQVBfTUFQQ05UOyBjX2lkeCsrKSB7CisJCQlpZiAoY19pdGVyLT5iaXRtYXBbY19pZHhdID09IDApCiAJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlub2RlX2xpbWl0ID0gc2l6ZW9mKE1BUFRZUEUpOwotCQl9IGVsc2UgewotCQkJZm9yIChzcmNfYnl0ZSA9IDAsIGlfYnl0ZSA9IHNyY19vZmY7Ci0JCQkgICAgIGlfYnl0ZSA8IHNyY19sZW4gJiYgc3JjX2J5dGUgPT0gMDsKLQkJCSAgICAgaV9ieXRlKyspCi0JCQkJc3JjX2J5dGUgfD0gc3JjW2lfYnl0ZV07Ci0JCQlpZiAoc3JjX2J5dGUgPT0gMCkKLQkJCQlicmVhazsKLQkJCW5vZGVfbGltaXQgPSBzcmNfbGVuIC0gc3JjX29mZjsKLQkJfQogCi0JCW5vZGVfbmV3ID0ga3phbGxvYyhzaXplb2YoKm5vZGVfbmV3KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICh1bmxpa2VseShub2RlX25ldyA9PSBOVUxMKSkgewotCQkJZWJpdG1hcF9kZXN0cm95KGRzdCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlub2RlX25ldy0+c3RhcnRiaXQgPSBzcmNfb2ZmICogODsKLQkJZm9yIChpX2J5dGUgPSAwOyBpX2J5dGUgPCBub2RlX2xpbWl0OyBpX2J5dGUrKykgewotCQkJc3JjX2J5dGUgPSBzcmNbc3JjX29mZisrXTsKLQkJCWZvciAoaV9iaXQgPSBpX2J5dGUgKiA4OyBzcmNfYnl0ZSAhPSAwOyBpX2JpdCsrKSB7Ci0JCQkJaWYgKHNyY19ieXRlICYgMHg4MCkKLQkJCQkJbm9kZV9uZXctPm1hcCB8PSBNQVBCSVQgPDwgaV9iaXQ7Ci0JCQkJc3JjX2J5dGUgPDw9IDE7Ci0JCQl9Ci0JCX0KKwkJCWVfaXRlciA9IGt6YWxsb2Moc2l6ZW9mKCplX2l0ZXIpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChlX2l0ZXIgPT0gTlVMTCkKKwkJCQlnb3RvIG5ldGxibF9pbXBvcnRfZmFpbHVyZTsKKwkJCWlmIChlbWFwX3ByZXYgPT0gTlVMTCkKKwkJCQllYm1hcC0+bm9kZSA9IGVfaXRlcjsKKwkJCWVsc2UKKwkJCQllbWFwX3ByZXYtPm5leHQgPSBlX2l0ZXI7CisJCQllbWFwX3ByZXYgPSBlX2l0ZXI7CiAKLQkJaWYgKG5vZGVfbGFzdCAhPSBOVUxMKQotCQkJbm9kZV9sYXN0LT5uZXh0ID0gbm9kZV9uZXc7Ci0JCWVsc2UKLQkJCWRzdC0+bm9kZSA9IG5vZGVfbmV3OwotCQlub2RlX2xhc3QgPSBub2RlX25ldzsKLQl9Ci0KLQlpZiAobGlrZWx5KG5vZGVfbGFzdCAhPSBOVUxMKSkKLQkJZHN0LT5oaWdoYml0ID0gbm9kZV9sYXN0LT5zdGFydGJpdCArIE1BUFNJWkU7CisJCQllX2l0ZXItPnN0YXJ0Yml0ID0gY19pdGVyLT5zdGFydGJpdCArCisJCQkJICAgICAgICAgICBORVRMQkxfQ0FUTUFQX01BUFNJWkUgKiBjX2lkeDsKKwkJCWVfaXRlci0+bWFwID0gY19pdGVyLT5iaXRtYXBbY19pZHhdOworCQl9CisJCWNfaXRlciA9IGNfaXRlci0+bmV4dDsKKwl9IHdoaWxlIChjX2l0ZXIgIT0gTlVMTCk7CisJaWYgKGVfaXRlciAhPSBOVUxMKQorCQllYm1hcC0+aGlnaGJpdCA9IGVfaXRlci0+c3RhcnRiaXQgKyBNQVBTSVpFOwogCWVsc2UKLQkJZWJpdG1hcF9pbml0KGRzdCk7CisJCWViaXRtYXBfZGVzdHJveShlYm1hcCk7CiAKIAlyZXR1cm4gMDsKKworbmV0bGJsX2ltcG9ydF9mYWlsdXJlOgorCWViaXRtYXBfZGVzdHJveShlYm1hcCk7CisJcmV0dXJuIC1FTk9NRU07CiB9CisjZW5kaWYgLyogQ09ORklHX05FVExBQkVMICovCiAKIGludCBlYml0bWFwX2NvbnRhaW5zKHN0cnVjdCBlYml0bWFwICplMSwgc3RydWN0IGViaXRtYXAgKmUyKQogewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuaAppbmRleCBkYTJkNDY1Li4xMjcwZTM0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuaApAQCAtMTQsNiArMTQsOCBAQAogI2lmbmRlZiBfU1NfRUJJVE1BUF9IXwogI2RlZmluZSBfU1NfRUJJVE1BUF9IXwogCisjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CisKICNkZWZpbmUgTUFQVFlQRSB1NjQJCQkvKiBwb3J0aW9uIG9mIGJpdG1hcCBpbiBlYWNoIG5vZGUgKi8KICNkZWZpbmUgTUFQU0laRSAoc2l6ZW9mKE1BUFRZUEUpICogOCkJLyogbnVtYmVyIG9mIGJpdHMgaW4gbm9kZSBiaXRtYXAgKi8KICNkZWZpbmUgTUFQQklUICAxVUxMCQkJLyogYSBiaXQgaW4gdGhlIG5vZGUgYml0bWFwICovCkBAIC02OSwxNiArNzEsMjggQEAKIAogaW50IGViaXRtYXBfY21wKHN0cnVjdCBlYml0bWFwICplMSwgc3RydWN0IGViaXRtYXAgKmUyKTsKIGludCBlYml0bWFwX2NweShzdHJ1Y3QgZWJpdG1hcCAqZHN0LCBzdHJ1Y3QgZWJpdG1hcCAqc3JjKTsKLWludCBlYml0bWFwX2V4cG9ydChjb25zdCBzdHJ1Y3QgZWJpdG1hcCAqc3JjLAotCQkgICB1bnNpZ25lZCBjaGFyICoqZHN0LAotCQkgICBzaXplX3QgKmRzdF9sZW4pOwotaW50IGViaXRtYXBfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJICAgc2l6ZV90IHNyY19sZW4sCi0JCSAgIHN0cnVjdCBlYml0bWFwICpkc3QpOwogaW50IGViaXRtYXBfY29udGFpbnMoc3RydWN0IGViaXRtYXAgKmUxLCBzdHJ1Y3QgZWJpdG1hcCAqZTIpOwogaW50IGViaXRtYXBfZ2V0X2JpdChzdHJ1Y3QgZWJpdG1hcCAqZSwgdW5zaWduZWQgbG9uZyBiaXQpOwogaW50IGViaXRtYXBfc2V0X2JpdChzdHJ1Y3QgZWJpdG1hcCAqZSwgdW5zaWduZWQgbG9uZyBiaXQsIGludCB2YWx1ZSk7CiB2b2lkIGViaXRtYXBfZGVzdHJveShzdHJ1Y3QgZWJpdG1hcCAqZSk7CiBpbnQgZWJpdG1hcF9yZWFkKHN0cnVjdCBlYml0bWFwICplLCB2b2lkICpmcCk7CiAKKyNpZmRlZiBDT05GSUdfTkVUTEFCRUwKK2ludCBlYml0bWFwX25ldGxibF9leHBvcnQoc3RydWN0IGViaXRtYXAgKmVibWFwLAorCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqKmNhdG1hcCk7CitpbnQgZWJpdG1hcF9uZXRsYmxfaW1wb3J0KHN0cnVjdCBlYml0bWFwICplYm1hcCwKKwkJCSAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZWJpdG1hcF9uZXRsYmxfZXhwb3J0KHN0cnVjdCBlYml0bWFwICplYm1hcCwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqKmNhdG1hcCkKK3sKKwlyZXR1cm4gLUVOT01FTTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGViaXRtYXBfbmV0bGJsX2ltcG9ydChzdHJ1Y3QgZWJpdG1hcCAqZWJtYXAsCisJCQkJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCkKK3sKKwlyZXR1cm4gLUVOT01FTTsKK30KKyNlbmRpZgorCiAjZW5kaWYJLyogX1NTX0VCSVRNQVBfSF8gKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvaGFzaHRhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMKaW5kZXggMjRlNWVjOS4uNzdiNTMwYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMKQEAgLTgsOCArOCw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlICJoYXNodGFiLmgiCiAKLXN0cnVjdCBoYXNodGFiICpoYXNodGFiX2NyZWF0ZSh1MzIgKCpoYXNoX3ZhbHVlKShzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCprZXljbXApKHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICprZXkxLCB2b2lkICprZXkyKSwKK3N0cnVjdCBoYXNodGFiICpoYXNodGFiX2NyZWF0ZSh1MzIgKCpoYXNoX3ZhbHVlKShzdHJ1Y3QgaGFzaHRhYiAqaCwgY29uc3Qgdm9pZCAqa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCprZXljbXApKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgc2l6ZSkKIHsKIAlzdHJ1Y3QgaGFzaHRhYiAqcDsKQEAgLTcxLDcgKzcxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCAqaGFzaHRhYl9zZWFyY2goc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmtleSkKK3ZvaWQgKmhhc2h0YWJfc2VhcmNoKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkpCiB7CiAJdTMyIGh2YWx1ZTsKIAlzdHJ1Y3QgaGFzaHRhYl9ub2RlICpjdXI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2hhc2h0YWIuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvaGFzaHRhYi5oCmluZGV4IDRjYzg1ODEuLjdlMmZmM2UgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvaGFzaHRhYi5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvaGFzaHRhYi5oCkBAIC0yMiw5ICsyMiw5IEBACiAJc3RydWN0IGhhc2h0YWJfbm9kZSAqKmh0YWJsZTsJLyogaGFzaCB0YWJsZSAqLwogCXUzMiBzaXplOwkJCS8qIG51bWJlciBvZiBzbG90cyBpbiBoYXNoIHRhYmxlICovCiAJdTMyIG5lbDsJCQkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqLwotCXUzMiAoKmhhc2hfdmFsdWUpKHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICprZXkpOworCXUzMiAoKmhhc2hfdmFsdWUpKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkpOwogCQkJCQkvKiBoYXNoIGZ1bmN0aW9uICovCi0JaW50ICgqa2V5Y21wKShzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5MSwgdm9pZCAqa2V5Mik7CisJaW50ICgqa2V5Y21wKShzdHJ1Y3QgaGFzaHRhYiAqaCwgY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5Mik7CiAJCQkJCS8qIGtleSBjb21wYXJpc29uIGZ1bmN0aW9uICovCiB9OwogCkBAIC0zOSw4ICszOSw4IEBACiAgKiBSZXR1cm5zIE5VTEwgaWYgaW5zdWZmaWNlbnQgc3BhY2UgaXMgYXZhaWxhYmxlIG9yCiAgKiB0aGUgbmV3IGhhc2ggdGFibGUgb3RoZXJ3aXNlLgogICovCi1zdHJ1Y3QgaGFzaHRhYiAqaGFzaHRhYl9jcmVhdGUodTMyICgqaGFzaF92YWx1ZSkoc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqa2V5Y21wKShzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5MSwgdm9pZCAqa2V5MiksCitzdHJ1Y3QgaGFzaHRhYiAqaGFzaHRhYl9jcmVhdGUodTMyICgqaGFzaF92YWx1ZSkoc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqa2V5Y21wKShzdHJ1Y3QgaGFzaHRhYiAqaCwgY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5MiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHNpemUpOwogCiAvKgpAQCAtNTksNyArNTksNyBAQAogICogUmV0dXJucyBOVUxMIGlmIG5vIGVudHJ5IGhhcyB0aGUgc3BlY2lmaWVkIGtleSBvcgogICogdGhlIGRhdHVtIG9mIHRoZSBlbnRyeSBvdGhlcndpc2UuCiAgKi8KLXZvaWQgKmhhc2h0YWJfc2VhcmNoKHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICprKTsKK3ZvaWQgKmhhc2h0YWJfc2VhcmNoKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprKTsKIAogLyoKICAqIERlc3Ryb3lzIHRoZSBzcGVjaWZpZWQgaGFzaCB0YWJsZS4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCmluZGV4IDJjY2E4ZTIuLmI0ZjY4MmQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwpAQCAtMTMsNyArMTMsNyBAQAogLyoKICAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CiAgKgotICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbAorICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbCBmcm9tIE5ldExhYmVsCiAgKgogICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgogICovCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAjaW5jbHVkZSAic2lkdGFiLmgiCiAjaW5jbHVkZSAibWxzLmgiCiAjaW5jbHVkZSAicG9saWN5ZGIuaCIKQEAgLTU3MSwxNjMgKzU3MiwxMDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRMQUJFTAogLyoqCi0gKiBtbHNfZXhwb3J0X2x2bCAtIEV4cG9ydCB0aGUgTUxTIHNlbnNpdGl2aXR5IGxldmVscworICogbWxzX2V4cG9ydF9uZXRsYmxfbHZsIC0gRXhwb3J0IHRoZSBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWxzIHRvIE5ldExhYmVsCiAgKiBAY29udGV4dDogdGhlIHNlY3VyaXR5IGNvbnRleHQKLSAqIEBsb3c6IHRoZSBsb3cgc2Vuc2l0aXZpdHkgbGV2ZWwKLSAqIEBoaWdoOiB0aGUgaGlnaCBzZW5zaXRpdml0eSBsZXZlbAorICogQHNlY2F0dHI6IHRoZSBOZXRMYWJlbCBzZWN1cml0eSBhdHRyaWJ1dGVzCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBHaXZlbiB0aGUgc2VjdXJpdHkgY29udGV4dCBjb3B5IHRoZSBsb3cgTUxTIHNlbnNpdGl2aXR5IGxldmVsIGludG8gbHZsX2xvdwotICogYW5kIHRoZSBoaWdoIHNlbnNpdGl2aXR5IGxldmVsIGluIGx2bF9oaWdoLiAgVGhlIE1MUyBsZXZlbHMgYXJlIG9ubHkKLSAqIGV4cG9ydGVkIGlmIHRoZSBwb2ludGVycyBhcmUgbm90IE5VTEwsIGlmIHRoZXkgYXJlIE5VTEwgdGhlbiB0aGF0IGxldmVsIGlzCi0gKiBub3QgZXhwb3J0ZWQuCisgKiBHaXZlbiB0aGUgc2VjdXJpdHkgY29udGV4dCBjb3B5IHRoZSBsb3cgTUxTIHNlbnNpdGl2aXR5IGxldmVsIGludG8gdGhlCisgKiBOZXRMYWJlbCBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWwgZmllbGQuCiAgKgogICovCi12b2lkIG1sc19leHBvcnRfbHZsKGNvbnN0IHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LCB1MzIgKmxvdywgdTMyICpoaWdoKQordm9pZCBtbHNfZXhwb3J0X25ldGxibF9sdmwoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQogewogCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKIAkJcmV0dXJuOwogCi0JaWYgKGxvdyAhPSBOVUxMKQotCQkqbG93ID0gY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uc2VucyAtIDE7Ci0JaWYgKGhpZ2ggIT0gTlVMTCkKLQkJKmhpZ2ggPSBjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5zZW5zIC0gMTsKKwlzZWNhdHRyLT5tbHNfbHZsID0gY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uc2VucyAtIDE7CisJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTDsKIH0KIAogLyoqCi0gKiBtbHNfaW1wb3J0X2x2bCAtIEltcG9ydCB0aGUgTUxTIHNlbnNpdGl2aXR5IGxldmVscworICogbWxzX2ltcG9ydF9uZXRsYmxfbHZsIC0gSW1wb3J0IHRoZSBOZXRMYWJlbCBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWxzCiAgKiBAY29udGV4dDogdGhlIHNlY3VyaXR5IGNvbnRleHQKLSAqIEBsb3c6IHRoZSBsb3cgc2Vuc2l0aXZpdHkgbGV2ZWwKLSAqIEBoaWdoOiB0aGUgaGlnaCBzZW5zaXRpdml0eSBsZXZlbAorICogQHNlY2F0dHI6IHRoZSBOZXRMYWJlbCBzZWN1cml0eSBhdHRyaWJ1dGVzCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBHaXZlbiB0aGUgc2VjdXJpdHkgY29udGV4dCBhbmQgdGhlIHR3byBzZW5zaXRpdnR5IGxldmVscywgc2V0IHRoZSBNTFMgbGV2ZWxzCi0gKiBpbiB0aGUgY29udGV4dCBhY2NvcmRpbmcgdGhlIHR3byBnaXZlbiBhcyBwYXJhbWV0ZXJzLiAgUmV0dXJucyB6ZXJvIG9uCi0gKiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGFuZCB0aGUgTmV0TGFiZWwgc2VjdXJpdHkgYXR0cmlidXRlcywgY29weSB0aGUKKyAqIE5ldExhYmVsIE1MUyBzZW5zaXRpdml0eSBsZXZlbCBpbnRvIHRoZSBjb250ZXh0LgogICoKICAqLwotdm9pZCBtbHNfaW1wb3J0X2x2bChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwgdTMyIGxvdywgdTMyIGhpZ2gpCit2b2lkIG1sc19pbXBvcnRfbmV0bGJsX2x2bChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCSAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7CiAJaWYgKCFzZWxpbnV4X21sc19lbmFibGVkKQogCQlyZXR1cm47CiAKLQljb250ZXh0LT5yYW5nZS5sZXZlbFswXS5zZW5zID0gbG93ICsgMTsKLQljb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5zZW5zID0gaGlnaCArIDE7CisJY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uc2VucyA9IHNlY2F0dHItPm1sc19sdmwgKyAxOworCWNvbnRleHQtPnJhbmdlLmxldmVsWzFdLnNlbnMgPSBjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5zZW5zOwogfQogCiAvKioKLSAqIG1sc19leHBvcnRfY2F0IC0gRXhwb3J0IHRoZSBNTFMgY2F0ZWdvcmllcworICogbWxzX2V4cG9ydF9uZXRsYmxfY2F0IC0gRXhwb3J0IHRoZSBNTFMgY2F0ZWdvcmllcyB0byBOZXRMYWJlbAogICogQGNvbnRleHQ6IHRoZSBzZWN1cml0eSBjb250ZXh0Ci0gKiBAbG93OiB0aGUgbG93IGNhdGVnb3J5Ci0gKiBAbG93X2xlbjogbGVuZ3RoIG9mIHRoZSBjYXRfbG93IGJpdG1hcCBpbiBieXRlcwotICogQGhpZ2g6IHRoZSBoaWdoIGNhdGVnb3J5Ci0gKiBAaGlnaF9sZW46IGxlbmd0aCBvZiB0aGUgY2F0X2hpZ2ggYml0bWFwIGluIGJ5dGVzCisgKiBAc2VjYXR0cjogdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGV4cG9ydCB0aGUgbG93IE1MUyBjYXRlZ29yeSBiaXRtYXAgaW50byBjYXRfbG93Ci0gKiBhbmQgdGhlIGhpZ2ggY2F0ZWdvcnkgYml0bWFwIGludG8gY2F0X2hpZ2guICBUaGUgTUxTIGNhdGVnb3JpZXMgYXJlIG9ubHkKLSAqIGV4cG9ydGVkIGlmIHRoZSBwb2ludGVycyBhcmUgbm90IE5VTEwsIGlmIHRoZXkgYXJlIE5VTEwgdGhlbiB0aGF0IGxldmVsIGlzCi0gKiBub3QgZXhwb3J0ZWQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmlsZSBmb3IgZnJlZWluZyB0aGUgbWVtb3J5IHdoZW4KLSAqIGZpbmlzaGVkLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogR2l2ZW4gdGhlIHNlY3VyaXR5IGNvbnRleHQgY29weSB0aGUgbG93IE1MUyBjYXRlZ29yaWVzIGludG8gdGhlIE5ldExhYmVsCisgKiBNTFMgY2F0ZWdvcnkgZmllbGQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbWxzX2V4cG9ydF9jYXQoY29uc3Qgc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCi0JCSAgIHVuc2lnbmVkIGNoYXIgKipsb3csCi0JCSAgIHNpemVfdCAqbG93X2xlbiwKLQkJICAgdW5zaWduZWQgY2hhciAqKmhpZ2gsCi0JCSAgIHNpemVfdCAqaGlnaF9sZW4pCitpbnQgbWxzX2V4cG9ydF9uZXRsYmxfY2F0KHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQogewotCWludCByYyA9IC1FUEVSTTsKKwlpbnQgcmM7CiAKLQlpZiAoIXNlbGludXhfbWxzX2VuYWJsZWQpIHsKLQkJKmxvdyA9IE5VTEw7Ci0JCSpsb3dfbGVuID0gMDsKLQkJKmhpZ2ggPSBOVUxMOwotCQkqaGlnaF9sZW4gPSAwOworCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7Ci0JfQogCi0JaWYgKGxvdyAhPSBOVUxMKSB7Ci0JCXJjID0gZWJpdG1hcF9leHBvcnQoJmNvbnRleHQtPnJhbmdlLmxldmVsWzBdLmNhdCwKLQkJCQkgICAgbG93LAotCQkJCSAgICBsb3dfbGVuKTsKLQkJaWYgKHJjICE9IDApCi0JCQlnb3RvIGV4cG9ydF9jYXRfZmFpbHVyZTsKLQl9Ci0JaWYgKGhpZ2ggIT0gTlVMTCkgewotCQlyYyA9IGViaXRtYXBfZXhwb3J0KCZjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5jYXQsCi0JCQkJICAgIGhpZ2gsCi0JCQkJICAgIGhpZ2hfbGVuKTsKLQkJaWYgKHJjICE9IDApCi0JCQlnb3RvIGV4cG9ydF9jYXRfZmFpbHVyZTsKLQl9CisJcmMgPSBlYml0bWFwX25ldGxibF9leHBvcnQoJmNvbnRleHQtPnJhbmdlLmxldmVsWzBdLmNhdCwKKwkJCQkgICAmc2VjYXR0ci0+bWxzX2NhdCk7CisJaWYgKHJjID09IDAgJiYgc2VjYXR0ci0+bWxzX2NhdCAhPSBOVUxMKQorCQlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUOwogCi0JcmV0dXJuIDA7Ci0KLWV4cG9ydF9jYXRfZmFpbHVyZToKLQlpZiAobG93ICE9IE5VTEwpIHsKLQkJa2ZyZWUoKmxvdyk7Ci0JCSpsb3cgPSBOVUxMOwotCQkqbG93X2xlbiA9IDA7Ci0JfQotCWlmIChoaWdoICE9IE5VTEwpIHsKLQkJa2ZyZWUoKmhpZ2gpOwotCQkqaGlnaCA9IE5VTEw7Ci0JCSpoaWdoX2xlbiA9IDA7Ci0JfQogCXJldHVybiByYzsKIH0KIAogLyoqCi0gKiBtbHNfaW1wb3J0X2NhdCAtIEltcG9ydCB0aGUgTUxTIGNhdGVnb3JpZXMKKyAqIG1sc19pbXBvcnRfbmV0bGJsX2NhdCAtIEltcG9ydCB0aGUgTUxTIGNhdGVnb3JpZXMgZnJvbSBOZXRMYWJlbAogICogQGNvbnRleHQ6IHRoZSBzZWN1cml0eSBjb250ZXh0Ci0gKiBAbG93OiB0aGUgbG93IGNhdGVnb3J5Ci0gKiBAbG93X2xlbjogbGVuZ3RoIG9mIHRoZSBjYXRfbG93IGJpdG1hcCBpbiBieXRlcwotICogQGhpZ2g6IHRoZSBoaWdoIGNhdGVnb3J5Ci0gKiBAaGlnaF9sZW46IGxlbmd0aCBvZiB0aGUgY2F0X2hpZ2ggYml0bWFwIGluIGJ5dGVzCisgKiBAc2VjYXR0cjogdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGFuZCB0aGUgdHdvIGNhdGVnb3J5IGJpdG1hcCBzdHJpbmdzIGltcG9ydCB0aGUKLSAqIGNhdGVnb3JpZXMgaW50byB0aGUgc2VjdXJpdHkgY29udGV4dC4gIFRoZSBNTFMgY2F0ZWdvcmllcyBhcmUgb25seSBpbXBvcnRlZAotICogaWYgdGhlIHBvaW50ZXJzIGFyZSBub3QgTlVMTCwgaWYgdGhleSBhcmUgTlVMTCB0aGV5IGFyZSBza2lwcGVkLiAgUmV0dXJucwotICogemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIENvcHkgdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMgaW50byB0aGUgU0VMaW51eCBjb250ZXh0OyBzaW5jZSB0aGUKKyAqIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIE1MUyBjYXRlZ29yeSB1c2UgaXQgZm9yCisgKiBib3RoIHRoZSBsb3cgYW5kIGhpZ2ggY2F0ZWdvcmllcyBvZiB0aGUgY29udGV4dC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLAorICogbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbWxzX2ltcG9ydF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxvdywKLQkJICAgc2l6ZV90IGxvd19sZW4sCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhpZ2gsCi0JCSAgIHNpemVfdCBoaWdoX2xlbikKK2ludCBtbHNfaW1wb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaW50IHJjID0gLUVQRVJNOworCWludCByYzsKIAogCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobG93ICE9IE5VTEwpIHsKLQkJcmMgPSBlYml0bWFwX2ltcG9ydChsb3csCi0JCQkJICAgIGxvd19sZW4sCi0JCQkJICAgICZjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQpOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gaW1wb3J0X2NhdF9mYWlsdXJlOwotCX0KLQlpZiAoaGlnaCAhPSBOVUxMKSB7Ci0JCWlmIChoaWdoID09IGxvdykKLQkJCXJjID0gZWJpdG1hcF9jcHkoJmNvbnRleHQtPnJhbmdlLmxldmVsWzFdLmNhdCwKLQkJCQkJICZjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQpOwotCQllbHNlCi0JCQlyYyA9IGViaXRtYXBfaW1wb3J0KGhpZ2gsCi0JCQkJCSAgICBoaWdoX2xlbiwKLQkJCQkJICAgICZjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5jYXQpOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gaW1wb3J0X2NhdF9mYWlsdXJlOwotCX0KKwlyYyA9IGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0LAorCQkJCSAgIHNlY2F0dHItPm1sc19jYXQpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIGltcG9ydF9uZXRsYmxfY2F0X2ZhaWx1cmU7CisKKwlyYyA9IGViaXRtYXBfY3B5KCZjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5jYXQsCisJCQkgJmNvbnRleHQtPnJhbmdlLmxldmVsWzBdLmNhdCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gaW1wb3J0X25ldGxibF9jYXRfZmFpbHVyZTsKIAogCXJldHVybiAwOwogCi1pbXBvcnRfY2F0X2ZhaWx1cmU6CitpbXBvcnRfbmV0bGJsX2NhdF9mYWlsdXJlOgogCWViaXRtYXBfZGVzdHJveSgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0KTsKIAllYml0bWFwX2Rlc3Ryb3koJmNvbnRleHQtPnJhbmdlLmxldmVsWzFdLmNhdCk7CiAJcmV0dXJuIHJjOwogfQorI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmgKaW5kZXggZGY2MDMyYzYuLjY2MWQ2ZmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuaApAQCAtMTMsNyArMTMsNyBAQAogLyoKICAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CiAgKgotICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbAorICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbCBmcm9tIE5ldExhYmVsCiAgKgogICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgogICovCkBAIC02OSwxOSArNjksMzcgQEAKIGludCBtbHNfc2V0dXBfdXNlcl9yYW5nZShzdHJ1Y3QgY29udGV4dCAqZnJvbWNvbiwgc3RydWN0IHVzZXJfZGF0dW0gKnVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnRleHQgKnVzZXJjb24pOwogCi12b2lkIG1sc19leHBvcnRfbHZsKGNvbnN0IHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LCB1MzIgKmxvdywgdTMyICpoaWdoKTsKLXZvaWQgbWxzX2ltcG9ydF9sdmwoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsIHUzMiBsb3csIHUzMiBoaWdoKTsKLQotaW50IG1sc19leHBvcnRfY2F0KGNvbnN0IHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAotCQkgICB1bnNpZ25lZCBjaGFyICoqbG93LAotCQkgICBzaXplX3QgKmxvd19sZW4sCi0JCSAgIHVuc2lnbmVkIGNoYXIgKipoaWdoLAotCQkgICBzaXplX3QgKmhpZ2hfbGVuKTsKLWludCBtbHNfaW1wb3J0X2NhdChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKLQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqbG93LAotCQkgICBzaXplX3QgbG93X2xlbiwKLQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGlnaCwKLQkJICAgc2l6ZV90IGhpZ2hfbGVuKTsKKyNpZmRlZiBDT05GSUdfTkVUTEFCRUwKK3ZvaWQgbWxzX2V4cG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7Cit2b2lkIG1sc19pbXBvcnRfbmV0bGJsX2x2bChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCSAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpOworaW50IG1sc19leHBvcnRfbmV0bGJsX2NhdChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCSAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7CitpbnQgbWxzX2ltcG9ydF9uZXRsYmxfY2F0KHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbWxzX2V4cG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWxzX2ltcG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIGludCBtbHNfZXhwb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkJCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9NRU07Cit9CitzdGF0aWMgaW5saW5lIGludCBtbHNfaW1wb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkJCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9NRU07Cit9CisjZW5kaWYKIAogI2VuZGlmCS8qIF9TU19NTFNfSCAqLwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggYmE0ODk2MS4uY2Q3OWM2MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xhc3NfZGVzdHJveSh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQorc3RhdGljIGludCBjbHNfZGVzdHJveSh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQogewogCXN0cnVjdCBjbGFzc19kYXR1bSAqY2xhZGF0dW07CiAJc3RydWN0IGNvbnN0cmFpbnRfbm9kZSAqY29uc3RyYWludCwgKmN0ZW1wOwpAQCAtNTY2LDcgKzU2Niw3IEBACiBzdGF0aWMgaW50ICgqZGVzdHJveV9mW1NZTV9OVU1dKSAodm9pZCAqa2V5LCB2b2lkICpkYXR1bSwgdm9pZCAqZGF0YXApID0KIHsKIAljb21tb25fZGVzdHJveSwKLQljbGFzc19kZXN0cm95LAorCWNsc19kZXN0cm95LAogCXJvbGVfZGVzdHJveSwKIAl0eXBlX2Rlc3Ryb3ksCiAJdXNlcl9kZXN0cm95LApAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIG91dDoKIAlyZXR1cm4gcmM7CiBiYWQ6Ci0JY2xhc3NfZGVzdHJveShrZXksIGNsYWRhdHVtLCBOVUxMKTsKKwljbHNfZGVzdHJveShrZXksIGNsYWRhdHVtLCBOVUxMKTsKIAlnb3RvIG91dDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCmluZGV4IGJmZTEyMjcuLmJkYjcwNzAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKQEAgLTE3LDkgKzE3LDEzIEBACiAgKgogICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBOZXRMYWJlbAogICoKKyAqIFVwZGF0ZWQ6IENoYWQgU2VsbGVycyA8Y3NlbGxlcnNAdHJlc3lzLmNvbT4KKyAqCisgKiAgQWRkZWQgdmFsaWRhdGlvbiBvZiBrZXJuZWwgY2xhc3NlcyBhbmQgcGVybWlzc2lvbnMKKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFRydXN0ZWQgQ29tcHV0ZXIgU29sdXRpb25zLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA0IFRyZXN5cyBUZWNobm9sb2d5LCBMTEMKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDQsIDIwMDYgVHJlc3lzIFRlY2hub2xvZ3ksIExMQwogICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI5LDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNDksMTAgKzU0LDE3IEBACiAjaW5jbHVkZSAibWxzLmgiCiAjaW5jbHVkZSAib2Jqc2VjLmgiCiAjaW5jbHVkZSAic2VsaW51eF9uZXRsYWJlbC5oIgorI2luY2x1ZGUgInhmcm0uaCIKKyNpbmNsdWRlICJlYml0bWFwLmgiCiAKIGV4dGVybiB2b2lkIHNlbG5sX25vdGlmeV9wb2xpY3lsb2FkKHUzMiBzZXFubyk7CiB1bnNpZ25lZCBpbnQgcG9saWN5ZGJfbG9hZGVkX3ZlcnNpb247CiAKKy8qCisgKiBUaGlzIGlzIGRlY2xhcmVkIGluIGF2Yy5jCisgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9jbGFzc19wZXJtIHNlbGludXhfY2xhc3NfcGVybTsKKwogc3RhdGljIERFRklORV9SV0xPQ0socG9saWN5X3J3bG9jayk7CiAjZGVmaW5lIFBPTElDWV9SRExPQ0sgcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKQogI2RlZmluZSBQT0xJQ1lfV1JMT0NLIHdyaXRlX2xvY2tfaXJxKCZwb2xpY3lfcndsb2NrKQpAQCAtMTAxOSw4NiArMTAzMSwxMTIgQEAKIH0KIAogLyoKLSAqIFZlcmlmeSB0aGF0IGVhY2ggcGVybWlzc2lvbiB0aGF0IGlzIGRlZmluZWQgdW5kZXIgdGhlCi0gKiBleGlzdGluZyBwb2xpY3kgaXMgc3RpbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHZhbHVlCi0gKiBpbiB0aGUgbmV3IHBvbGljeS4KKyAqIFZlcmlmeSB0aGF0IGVhY2gga2VybmVsIGNsYXNzIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUKKyAqIHBvbGljeSBpcyBjb3JyZWN0CiAgKi8KLXN0YXRpYyBpbnQgdmFsaWRhdGVfcGVybSh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQorc3RhdGljIGludCB2YWxpZGF0ZV9jbGFzc2VzKHN0cnVjdCBwb2xpY3lkYiAqcCkKIHsKLQlzdHJ1Y3QgaGFzaHRhYiAqaDsKLQlzdHJ1Y3QgcGVybV9kYXR1bSAqcGVyZGF0dW0sICpwZXJkYXR1bTI7Ci0JaW50IHJjID0gMDsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgY2xhc3NfZGF0dW0gKmNsYWRhdHVtOworCXN0cnVjdCBwZXJtX2RhdHVtICpwZXJkYXR1bTsKKwl1MzIgbnByaW0sIHRtcCwgY29tbW9uX3B0c19sZW4sIHBlcm1fdmFsLCBwb2xfdmFsOworCXUxNiBjbGFzc192YWw7CisJY29uc3Qgc3RydWN0IHNlbGludXhfY2xhc3NfcGVybSAqa2RlZnMgPSAmc2VsaW51eF9jbGFzc19wZXJtOworCWNvbnN0IGNoYXIgKmRlZl9jbGFzcywgKmRlZl9wZXJtLCAqcG9sX2NsYXNzOworCXN0cnVjdCBzeW10YWIgKnBlcm1zOwogCi0KLQloID0gcDsKLQlwZXJkYXR1bSA9IGRhdHVtOwotCi0JcGVyZGF0dW0yID0gaGFzaHRhYl9zZWFyY2goaCwga2V5KTsKLQlpZiAoIXBlcmRhdHVtMikgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgcGVybWlzc2lvbiAlcyBkaXNhcHBlYXJlZCIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChwZXJkYXR1bS0+dmFsdWUgIT0gcGVyZGF0dW0yLT52YWx1ZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIHZhbHVlIG9mIHBlcm1pc3Npb24gJXMgY2hhbmdlZCIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogVmVyaWZ5IHRoYXQgZWFjaCBjbGFzcyB0aGF0IGlzIGRlZmluZWQgdW5kZXIgdGhlCi0gKiBleGlzdGluZyBwb2xpY3kgaXMgc3RpbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lCi0gKiBhdHRyaWJ1dGVzIGluIHRoZSBuZXcgcG9saWN5LgotICovCi1zdGF0aWMgaW50IHZhbGlkYXRlX2NsYXNzKHZvaWQgKmtleSwgdm9pZCAqZGF0dW0sIHZvaWQgKnApCi17Ci0Jc3RydWN0IHBvbGljeWRiICpuZXdwOwotCXN0cnVjdCBjbGFzc19kYXR1bSAqY2xhZGF0dW0sICpjbGFkYXR1bTI7Ci0JaW50IHJjOwotCi0JbmV3cCA9IHA7Ci0JY2xhZGF0dW0gPSBkYXR1bTsKLQotCWNsYWRhdHVtMiA9IGhhc2h0YWJfc2VhcmNoKG5ld3AtPnBfY2xhc3Nlcy50YWJsZSwga2V5KTsKLQlpZiAoIWNsYWRhdHVtMikgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgY2xhc3MgJXMgZGlzYXBwZWFyZWRcbiIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChjbGFkYXR1bS0+dmFsdWUgIT0gY2xhZGF0dW0yLT52YWx1ZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIHZhbHVlIG9mIGNsYXNzICVzIGNoYW5nZWRcbiIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICgoY2xhZGF0dW0tPmNvbWRhdHVtICYmICFjbGFkYXR1bTItPmNvbWRhdHVtKSB8fAotCSAgICAoIWNsYWRhdHVtLT5jb21kYXR1bSAmJiBjbGFkYXR1bTItPmNvbWRhdHVtKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIGluaGVyaXRzIGNsYXVzZSBmb3IgdGhlIGFjY2VzcyAiCi0JCSAgICAgICAidmVjdG9yIGRlZmluaXRpb24gZm9yIGNsYXNzICVzIGNoYW5nZWRcbiIsIChjaGFyICopa2V5KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGNsYWRhdHVtLT5jb21kYXR1bSkgewotCQlyYyA9IGhhc2h0YWJfbWFwKGNsYWRhdHVtLT5jb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHZhbGlkYXRlX3Blcm0sCi0JCSAgICAgICAgICAgICAgICAgY2xhZGF0dW0yLT5jb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOwotCQlpZiAocmMpIHsKLQkJCXByaW50aygiIGluIHRoZSBhY2Nlc3MgdmVjdG9yIGRlZmluaXRpb24gZm9yIGNsYXNzICIKLQkJCSAgICAgICAiJXNcbiIsIChjaGFyICopa2V5KTsKLQkJCWdvdG8gb3V0OworCWZvciAoaSA9IDE7IGkgPCBrZGVmcy0+Y3RzX2xlbjsgaSsrKSB7CisJCWRlZl9jbGFzcyA9IGtkZWZzLT5jbGFzc190b19zdHJpbmdbaV07CisJCWlmIChpID4gcC0+cF9jbGFzc2VzLm5wcmltKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInNlY3VyaXR5OiAgY2xhc3MgJXMgbm90IGRlZmluZWQgaW4gcG9saWN5XG4iLAorCQkJICAgICAgIGRlZl9jbGFzcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlwb2xfY2xhc3MgPSBwLT5wX2NsYXNzX3ZhbF90b19uYW1lW2ktMV07CisJCWlmIChzdHJjbXAocG9sX2NsYXNzLCBkZWZfY2xhc3MpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBjbGFzcyAlZCBpcyBpbmNvcnJlY3QsIGZvdW5kICVzIGJ1dCBzaG91bGQgYmUgJXNcbiIsCisJCQkgICAgICAgaSwgcG9sX2NsYXNzLCBkZWZfY2xhc3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9Ci0JcmMgPSBoYXNodGFiX21hcChjbGFkYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHZhbGlkYXRlX3Blcm0sCi0JICAgICAgICAgICAgICAgICBjbGFkYXR1bTItPnBlcm1pc3Npb25zLnRhYmxlKTsKLQlpZiAocmMpCi0JCXByaW50aygiIGluIGFjY2VzcyB2ZWN0b3IgZGVmaW5pdGlvbiBmb3IgY2xhc3MgJXNcbiIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCWZvciAoaSA9IDA7IGkgPCBrZGVmcy0+YXZfcHRzX2xlbjsgaSsrKSB7CisJCWNsYXNzX3ZhbCA9IGtkZWZzLT5hdl9wZXJtX3RvX3N0cmluZ1tpXS50Y2xhc3M7CisJCXBlcm1fdmFsID0ga2RlZnMtPmF2X3Blcm1fdG9fc3RyaW5nW2ldLnZhbHVlOworCQlkZWZfcGVybSA9IGtkZWZzLT5hdl9wZXJtX3RvX3N0cmluZ1tpXS5uYW1lOworCQlpZiAoY2xhc3NfdmFsID4gcC0+cF9jbGFzc2VzLm5wcmltKQorCQkJY29udGludWU7CisJCXBvbF9jbGFzcyA9IHAtPnBfY2xhc3NfdmFsX3RvX25hbWVbY2xhc3NfdmFsLTFdOworCQljbGFkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfY2xhc3Nlcy50YWJsZSwgcG9sX2NsYXNzKTsKKwkJQlVHX09OKCFjbGFkYXR1bSk7CisJCXBlcm1zID0gJmNsYWRhdHVtLT5wZXJtaXNzaW9uczsKKwkJbnByaW0gPSAxIDw8IChwZXJtcy0+bnByaW0gLSAxKTsKKwkJaWYgKHBlcm1fdmFsID4gbnByaW0pIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIG5vdCBkZWZpbmVkIGluIHBvbGljeVxuIiwKKwkJCSAgICAgICBkZWZfcGVybSwgcG9sX2NsYXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBlcmRhdHVtID0gaGFzaHRhYl9zZWFyY2gocGVybXMtPnRhYmxlLCBkZWZfcGVybSk7CisJCWlmIChwZXJkYXR1bSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIG5vdCBmb3VuZCBpbiBwb2xpY3lcbiIsCisJCQkgICAgICAgZGVmX3Blcm0sIHBvbF9jbGFzcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwb2xfdmFsID0gMSA8PCAocGVyZGF0dW0tPnZhbHVlIC0gMSk7CisJCWlmIChwb2xfdmFsICE9IHBlcm1fdmFsKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIGhhcyBpbmNvcnJlY3QgdmFsdWVcbiIsCisJCQkgICAgICAgZGVmX3Blcm0sIHBvbF9jbGFzcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwga2RlZnMtPmF2X2luaGVyaXRfbGVuOyBpKyspIHsKKwkJY2xhc3NfdmFsID0ga2RlZnMtPmF2X2luaGVyaXRbaV0udGNsYXNzOworCQlpZiAoY2xhc3NfdmFsID4gcC0+cF9jbGFzc2VzLm5wcmltKQorCQkJY29udGludWU7CisJCXBvbF9jbGFzcyA9IHAtPnBfY2xhc3NfdmFsX3RvX25hbWVbY2xhc3NfdmFsLTFdOworCQljbGFkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfY2xhc3Nlcy50YWJsZSwgcG9sX2NsYXNzKTsKKwkJQlVHX09OKCFjbGFkYXR1bSk7CisJCWlmICghY2xhZGF0dW0tPmNvbWRhdHVtKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBjbGFzcyAlcyBzaG91bGQgaGF2ZSBhbiBpbmhlcml0cyBjbGF1c2UgYnV0IGRvZXMgbm90XG4iLAorCQkJICAgICAgIHBvbF9jbGFzcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0bXAgPSBrZGVmcy0+YXZfaW5oZXJpdFtpXS5jb21tb25fYmFzZTsKKwkJY29tbW9uX3B0c19sZW4gPSAwOworCQl3aGlsZSAoISh0bXAgJiAweDAxKSkgeworCQkJY29tbW9uX3B0c19sZW4rKzsKKwkJCXRtcCA+Pj0gMTsKKwkJfQorCQlwZXJtcyA9ICZjbGFkYXR1bS0+Y29tZGF0dW0tPnBlcm1pc3Npb25zOworCQlmb3IgKGogPSAwOyBqIDwgY29tbW9uX3B0c19sZW47IGorKykgeworCQkJZGVmX3Blcm0gPSBrZGVmcy0+YXZfaW5oZXJpdFtpXS5jb21tb25fcHRzW2pdOworCQkJaWYgKGogPj0gcGVybXMtPm5wcmltKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIG5vdCBkZWZpbmVkIGluIHBvbGljeVxuIiwKKwkJCQkgICAgICAgZGVmX3Blcm0sIHBvbF9jbGFzcyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwZXJkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHBlcm1zLT50YWJsZSwgZGVmX3Blcm0pOworCQkJaWYgKHBlcmRhdHVtID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInNlY3VyaXR5OiAgcGVybWlzc2lvbiAlcyBpbiBjbGFzcyAlcyBub3QgZm91bmQgaW4gcG9saWN5XG4iLAorCQkJCSAgICAgICBkZWZfcGVybSwgcG9sX2NsYXNzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChwZXJkYXR1bS0+dmFsdWUgIT0gaiArIDEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInNlY3VyaXR5OiAgcGVybWlzc2lvbiAlcyBpbiBjbGFzcyAlcyBoYXMgaW5jb3JyZWN0IHZhbHVlXG4iLAorCQkJCSAgICAgICBkZWZfcGVybSwgcG9sX2NsYXNzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAogLyogQ2xvbmUgdGhlIFNJRCBpbnRvIHRoZSBuZXcgU0lEIHRhYmxlLiAqLwpAQCAtMTI0Myw2ICsxMjgxLDE2IEBACiAJCQlhdnRhYl9jYWNoZV9kZXN0cm95KCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQkvKiBWZXJpZnkgdGhhdCB0aGUga2VybmVsIGRlZmluZWQgY2xhc3NlcyBhcmUgY29ycmVjdC4gKi8KKwkJaWYgKHZhbGlkYXRlX2NsYXNzZXMoJnBvbGljeWRiKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInNlY3VyaXR5OiAgdGhlIGRlZmluaXRpb24gb2YgYSBjbGFzcyBpcyBpbmNvcnJlY3RcbiIpOworCQkJTE9BRF9VTkxPQ0s7CisJCQlzaWR0YWJfZGVzdHJveSgmc2lkdGFiKTsKKwkJCXBvbGljeWRiX2Rlc3Ryb3koJnBvbGljeWRiKTsKKwkJCWF2dGFiX2NhY2hlX2Rlc3Ryb3koKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCXBvbGljeWRiX2xvYWRlZF92ZXJzaW9uID0gcG9saWN5ZGIucG9saWN5dmVyczsKIAkJc3NfaW5pdGlhbGl6ZWQgPSAxOwogCQlzZXFubyA9ICsrbGF0ZXN0X2dyYW50aW5nOwpAQCAtMTI2NSwxMCArMTMxMywxMCBAQAogCiAJc2lkdGFiX2luaXQoJm5ld3NpZHRhYik7CiAKLQkvKiBWZXJpZnkgdGhhdCB0aGUgZXhpc3RpbmcgY2xhc3NlcyBkaWQgbm90IGNoYW5nZS4gKi8KLQlpZiAoaGFzaHRhYl9tYXAocG9saWN5ZGIucF9jbGFzc2VzLnRhYmxlLCB2YWxpZGF0ZV9jbGFzcywgJm5ld3BvbGljeWRiKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIGRlZmluaXRpb24gb2YgYW4gZXhpc3RpbmcgIgotCQkgICAgICAgImNsYXNzIGNoYW5nZWRcbiIpOworCS8qIFZlcmlmeSB0aGF0IHRoZSBrZXJuZWwgZGVmaW5lZCBjbGFzc2VzIGFyZSBjb3JyZWN0LiAqLworCWlmICh2YWxpZGF0ZV9jbGFzc2VzKCZuZXdwb2xpY3lkYikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAic2VjdXJpdHk6ICB0aGUgZGVmaW5pdGlvbiBvZiBhIGNsYXNzIGlzIGluY29ycmVjdFxuIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQpAQCAtMjE0NSw2ICsyMTkzLDMyIEBACiAJYXVydWxlX2NhbGxiYWNrID0gY2FsbGJhY2s7CiB9CiAKKy8qKgorICogc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQgLSBEZXRlcm1pbmUgdGhlIGV4dGVybmFsIGxhYmVsIG9mIGEgcGFja2V0CisgKiBAc2tiOiB0aGUgcGFja2V0CisgKiBAYmFzZV9zaWQ6IHRoZSBTRUxpbnV4IFNJRCB0byB1c2UgYXMgYSBjb250ZXh0IGZvciBNTFMgb25seSBleHRlcm5hbCBsYWJlbHMKKyAqIEBzaWQ6IHRoZSBwYWNrZXQncyBTSUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrIHRoZSB2YXJpb3VzIGRpZmZlcmVudCBmb3JtcyBvZiBleHRlcm5hbCBwYWNrZXQgbGFiZWxpbmcgYW5kIGRldGVybWluZQorICogdGhlIGV4dGVybmFsIFNJRCBmb3IgdGhlIHBhY2tldC4KKyAqCisgKi8KK3ZvaWQgc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGJhc2Vfc2lkLCB1MzIgKnNpZCkKK3sKKwl1MzIgeGZybV9zaWQ7CisJdTMyIG5sYmxfc2lkOworCisJc2VsaW51eF9za2JfeGZybV9zaWQoc2tiLCAmeGZybV9zaWQpOworCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwKKwkJCQkJICh4ZnJtX3NpZCA9PSBTRUNTSURfTlVMTCA/CisJCQkJCSAgYmFzZV9zaWQgOiB4ZnJtX3NpZCksCisJCQkJCSAmbmxibF9zaWQpICE9IDApCisJCW5sYmxfc2lkID0gU0VDU0lEX05VTEw7CisKKwkqc2lkID0gKG5sYmxfc2lkID09IFNFQ1NJRF9OVUxMID8geGZybV9zaWQgOiBubGJsX3NpZCk7Cit9CisKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIC8qCiAgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2Ugc3RvcmUgaW5zaWRlIHRoZSBOZXRMYWJlbCBjYWNoZSBibG9jay4KQEAgLTIyMDksOCArMjI4Myw2IEBACiAJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLAlHRlBfQVRPTUlDKTsKIAlpZiAoY2FjaGUgPT0gTlVMTCkKIAkJZ290byBuZXRsYmxfY2FjaGVfYWRkX3JldHVybjsKLQlzZWNhdHRyLmNhY2hlLT5mcmVlID0gc2VsaW51eF9uZXRsYmxfY2FjaGVfZnJlZTsKLQlzZWNhdHRyLmNhY2hlLT5kYXRhID0gKHZvaWQgKiljYWNoZTsKIAogCWNhY2hlLT50eXBlID0gTkVUTEJMX0NBQ0hFX1RfTUxTOwogCWlmIChlYml0bWFwX2NweSgmY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzBdLmNhdCwKQEAgLTIyMjMsNiArMjI5NSwxMCBAQAogCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFswXS5zZW5zID0gY3R4LT5yYW5nZS5sZXZlbFswXS5zZW5zOwogCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFsxXS5zZW5zID0gY3R4LT5yYW5nZS5sZXZlbFswXS5zZW5zOwogCisJc2VjYXR0ci5jYWNoZS0+ZnJlZSA9IHNlbGludXhfbmV0bGJsX2NhY2hlX2ZyZWU7CisJc2VjYXR0ci5jYWNoZS0+ZGF0YSA9ICh2b2lkICopY2FjaGU7CisJc2VjYXR0ci5mbGFncyA9IE5FVExCTF9TRUNBVFRSX0NBQ0hFOworCiAJbmV0bGJsX2NhY2hlX2FkZChza2IsICZzZWNhdHRyKTsKIAogbmV0bGJsX2NhY2hlX2FkZF9yZXR1cm46CkBAIC0yMjY4LDcgKzIzNDQsNyBAQAogCiAJUE9MSUNZX1JETE9DSzsKIAotCWlmIChzZWNhdHRyLT5jYWNoZSkgeworCWlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX0NBQ0hFKSB7CiAJCWNhY2hlID0gTkVUTEJMX0NBQ0hFKHNlY2F0dHItPmNhY2hlLT5kYXRhKTsKIAkJc3dpdGNoIChjYWNoZS0+dHlwZSkgewogCQljYXNlIE5FVExCTF9DQUNIRV9UX1NJRDoKQEAgLTIzMDEsNyArMjM3Nyw3IEBACiAJCWRlZmF1bHQ6CiAJCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CiAJCX0KLQl9IGVsc2UgaWYgKHNlY2F0dHItPm1sc19sdmxfdmxkKSB7CisJfSBlbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpIHsKIAkJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBiYXNlX3NpZCk7CiAJCWlmIChjdHggPT0gTlVMTCkKIAkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjsKQEAgLTIzMDksMTMgKzIzODUsMTAgQEAKIAkJY3R4X25ldy51c2VyID0gY3R4LT51c2VyOwogCQljdHhfbmV3LnJvbGUgPSBjdHgtPnJvbGU7CiAJCWN0eF9uZXcudHlwZSA9IGN0eC0+dHlwZTsKLQkJbWxzX2ltcG9ydF9sdmwoJmN0eF9uZXcsIHNlY2F0dHItPm1sc19sdmwsIHNlY2F0dHItPm1sc19sdmwpOwotCQlpZiAoc2VjYXR0ci0+bWxzX2NhdCkgewotCQkJaWYgKG1sc19pbXBvcnRfY2F0KCZjdHhfbmV3LAotCQkJCQkgICBzZWNhdHRyLT5tbHNfY2F0LAotCQkJCQkgICBzZWNhdHRyLT5tbHNfY2F0X2xlbiwKLQkJCQkJICAgTlVMTCwKLQkJCQkJICAgMCkgIT0gMCkKKwkJbWxzX2ltcG9ydF9uZXRsYmxfbHZsKCZjdHhfbmV3LCBzZWNhdHRyKTsKKwkJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgeworCQkJaWYgKGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCisJCQkJCQkgIHNlY2F0dHItPm1sc19jYXQpICE9IDApCiAJCQkJZ290byBuZXRsYmxfc2VjYXR0cl90b19zaWRfcmV0dXJuOwogCQkJY3R4X25ldy5yYW5nZS5sZXZlbFsxXS5jYXQuaGlnaGJpdCA9CiAJCQkJY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQuaGlnaGJpdDsKQEAgLTIzNjAsMjAgKzI0MzMsMjAgQEAKICAqIGFzc2lnbiB0byB0aGUgcGFja2V0LiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgogICoKICAqLwotc3RhdGljIGludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCXUzMiBiYXNlX3NpZCwKLQkJCQkJdTMyICpzaWQpCitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX2dldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYmFzZV9zaWQsIHUzMiAqc2lkKQogewogCWludCByYzsKIAlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7CiAKIAluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKIAlyYyA9IG5ldGxibF9za2J1ZmZfZ2V0YXR0cihza2IsICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCAmJiBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUpCiAJCXJjID0gc2VsaW51eF9uZXRsYmxfc2VjYXR0cl90b19zaWQoc2tiLAogCQkJCQkJICAgJnNlY2F0dHIsCiAJCQkJCQkgICBiYXNlX3NpZCwKIAkJCQkJCSAgIHNpZCk7CisJZWxzZQorCQkqc2lkID0gU0VDU0lEX05VTEw7CiAJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CiAKIAlyZXR1cm4gcmM7CkBAIC0yMzg2LDcgKzI0NTksOSBAQAogICoKICAqIERlc2NyaXB0aW9uOgogICogQXR0ZW1wdCB0byBsYWJlbCBhIHNvY2tldCB1c2luZyB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHVzaW5nIHRoZSBnaXZlbgotICogU0lELiAgUmV0dXJucyB6ZXJvIHZhbHVlcyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIFNJRC4gIFJldHVybnMgemVybyB2YWx1ZXMgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuICBUaGUKKyAqIGNhbGxlciBpcyByZXNwb25zaWJpbGUgZm9yIGNhbGxpbmcgcmN1X3JlYWRfbG9jaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHRoaXMgZnVuY3Rpb24gYW5kIHJjdV9yZWFkX3VubG9jaygpIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqCiAgKi8KIHN0YXRpYyBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1MzIgc2lkKQpAQCAtMjQwOSwxOSArMjQ4NCwxOCBAQAogCiAJc2VjYXR0ci5kb21haW4gPSBrc3RyZHVwKHBvbGljeWRiLnBfdHlwZV92YWxfdG9fbmFtZVtjdHgtPnR5cGUgLSAxXSwKIAkJCQkgR0ZQX0FUT01JQyk7Ci0JbWxzX2V4cG9ydF9sdmwoY3R4LCAmc2VjYXR0ci5tbHNfbHZsLCBOVUxMKTsKLQlzZWNhdHRyLm1sc19sdmxfdmxkID0gMTsKLQlyYyA9IG1sc19leHBvcnRfY2F0KGN0eCwKLQkJCSAgICAmc2VjYXR0ci5tbHNfY2F0LAotCQkJICAgICZzZWNhdHRyLm1sc19jYXRfbGVuLAotCQkJICAgIE5VTEwsCi0JCQkgICAgTlVMTCk7CisJc2VjYXR0ci5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9ET01BSU47CisJbWxzX2V4cG9ydF9uZXRsYmxfbHZsKGN0eCwgJnNlY2F0dHIpOworCXJjID0gbWxzX2V4cG9ydF9uZXRsYmxfY2F0KGN0eCwgJnNlY2F0dHIpOwogCWlmIChyYyAhPSAwKQogCQlnb3RvIG5ldGxibF9zb2NrZXRfc2V0c2lkX3JldHVybjsKIAogCXJjID0gbmV0bGJsX3NvY2tldF9zZXRhdHRyKHNvY2ssICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCkgeworCQlzcGluX2xvY2soJnNrc2VjLT5ubGJsX2xvY2spOwogCQlza3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfTEFCRUxFRDsKKwkJc3Bpbl91bmxvY2soJnNrc2VjLT5ubGJsX2xvY2spOworCX0KIAogbmV0bGJsX3NvY2tldF9zZXRzaWRfcmV0dXJuOgogCVBPTElDWV9SRFVOTE9DSzsKQEAgLTI0MzAsNiArMjUwNCwyNSBAQAogfQogCiAvKioKKyAqIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0IC0gUmVzZXQgdGhlIE5ldExhYmVsIGZpZWxkcworICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKKyAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5CisgKgorICogRGVzY3JpcHRpb246CisgKiBDYWxsZWQgd2hlbiB0aGUgTmV0TGFiZWwgc3RhdGUgb2YgYSBza19zZWN1cml0eV9zdHJ1Y3QgbmVlZHMgdG8gYmUgcmVzZXQuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmlsZSBmb3IgYWxsIHRoZSBOZXRMYWJlbCBza19zZWN1cml0eV9zdHJ1Y3QgbG9ja2luZy4KKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKKwkJCQkgICAgICBpbnQgZmFtaWx5KQoreworICAgICAgICBpZiAoZmFtaWx5ID09IFBGX0lORVQpCisJCXNzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVVJUkU7CisJZWxzZQorCQlzc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9VTlNFVDsKK30KKworLyoqCiAgKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9pbml0IC0gU2V0dXAgdGhlIE5ldExhYmVsIGZpZWxkcwogICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKICAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5CkBAIC0yNDQyLDE0ICsyNTM1LDEzIEBACiB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2luaXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKIAkJCQkgICAgIGludCBmYW1pbHkpCiB7Ci0gICAgICAgIGlmIChmYW1pbHkgPT0gUEZfSU5FVCkKLQkJc3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfUkVRVUlSRTsKLQllbHNlCi0JCXNzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1VOU0VUOworCS8qIE5vIGxvY2tpbmcgbmVlZGVkLCB3ZSBhcmUgdGhlIG9ubHkgb25lIHdobyBoYXMgYWNjZXNzIHRvIHNzZWMgKi8KKwlzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9yZXNldChzc2VjLCBmYW1pbHkpOworCXNwaW5fbG9ja19pbml0KCZzc2VjLT5ubGJsX2xvY2spOwogfQogCiAvKioKLSAqIHNlbGludXhfbmV0bGJsX3NrX2Nsb25lX3NlY3VyaXR5IC0gQ29weSB0aGUgTmV0TGFiZWwgZmllbGRzCisgKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZSAtIENvcHkgdGhlIE5ldExhYmVsIGZpZWxkcwogICogQHNzZWM6IHRoZSBvcmlnaW5hbCBza19zZWN1cml0eV9zdHJ1Y3QKICAqIEBuZXdzc2VjOiB0aGUgY2xvbmVkIHNrX3NlY3VyaXR5X3N0cnVjdAogICoKQEAgLTI0NTgsNDEgKzI1NTAsNDEgQEAKICAqIEBuZXdzc2VjLgogICoKICAqLwotdm9pZCBzZWxpbnV4X25ldGxibF9za19jbG9uZV9zZWN1cml0eShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAordm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAogCQkJCSAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpCiB7CisJLyogV2UgZG9uJ3QgbmVlZCB0byB0YWtlIG5ld3NzZWMtPm5sYmxfbG9jayBiZWNhdXNlIHdlIGFyZSB0aGUgb25seQorCSAqIHRocmVhZCB3aXRoIGFjY2VzcyB0byBuZXdzc2VjLCBidXQgd2UgZG8gbmVlZCB0byB0YWtlIHRoZSBSQ1UgcmVhZAorCSAqIGxvY2sgYXMgb3RoZXIgdGhyZWFkcyBjb3VsZCBoYXZlIGFjY2VzcyB0byBzc2VjICovCisJcmN1X3JlYWRfbG9jaygpOworCXNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KG5ld3NzZWMsIHNzZWMtPnNrLT5za19mYW1pbHkpOwogCW5ld3NzZWMtPnNjbGFzcyA9IHNzZWMtPnNjbGFzczsKLQlpZiAoc3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1VOU0VUKQotCQluZXdzc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9SRVFVSVJFOwotCWVsc2UKLQkJbmV3c3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfVU5TRVQ7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIC8qKgogICogc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlIC0gTGFiZWwgYSBzb2NrZXQgdXNpbmcgTmV0TGFiZWwKICAqIEBzb2NrOiB0aGUgc29ja2V0IHRvIGxhYmVsCi0gKiBAc29ja19mYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5Ci0gKiBAc2lkOiB0aGUgU0lEIHRvIHVzZQogICoKICAqIERlc2NyaXB0aW9uOgogICogQXR0ZW1wdCB0byBsYWJlbCBhIHNvY2tldCB1c2luZyB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHVzaW5nIHRoZSBnaXZlbgogICogU0lELiAgUmV0dXJucyB6ZXJvIHZhbHVlcyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkgICAgICBpbnQgc29ja19mYW1pbHksCi0JCQkJICAgICAgdTMyIHNpZCkKK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaykKIHsKKwlpbnQgcmMgPSAwOwogCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OwogCiAJc2tzZWMtPnNjbGFzcyA9IGlzZWMtPnNjbGFzczsKIAotCWlmIChzb2NrX2ZhbWlseSAhPSBQRl9JTkVUKQotCQlyZXR1cm4gMDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfUkVRVUlSRSkKKwkJcmMgPSBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkKHNvY2ssIHNrc2VjLT5zaWQpOworCXJjdV9yZWFkX3VubG9jaygpOwogCi0Jc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVVJUkU7Ci0JcmV0dXJuIHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2lkKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMjUxNCwxMSArMjYwNiwxNiBAQAogCiAJc2tzZWMtPnNjbGFzcyA9IGlzZWMtPnNjbGFzczsKIAotCWlmIChzay0+c2tfZmFtaWx5ICE9IFBGX0lORVQpCisJcmN1X3JlYWRfbG9jaygpOworCisJaWYgKHNrc2VjLT5ubGJsX3N0YXRlICE9IE5MQkxfUkVRVUlSRSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOworCX0KIAogCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwogCWlmIChuZXRsYmxfc29ja19nZXRhdHRyKHNrLCAmc2VjYXR0cikgPT0gMCAmJgorCSAgICBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUgJiYKIAkgICAgc2VsaW51eF9uZXRsYmxfc2VjYXR0cl90b19zaWQoTlVMTCwKIAkJCQkJICAmc2VjYXR0ciwKIAkJCQkJICBTRUNJTklUU0lEX1VOTEFCRUxFRCwKQEAgLTI1MjYsMzUgKzI2MjMsMTIgQEAKIAkJc2tzZWMtPnBlZXJfc2lkID0gbmxibF9wZWVyX3NpZDsKIAluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKIAotCXNrc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9SRVFVSVJFOwotCiAJLyogVHJ5IHRvIHNldCB0aGUgTmV0TGFiZWwgb24gdGhlIHNvY2tldCB0byBzYXZlIHRpbWUgbGF0ZXIsIGlmIHdlIGZhaWwKIAkgKiBoZXJlIHdlIHdpbGwgcGljayB1cCB0aGUgcGllY2VzIGluIGxhdGVyIGNhbGxzIHRvCiAJICogc2VsaW51eF9uZXRsYmxfaW5vZGVfcGVybWlzc2lvbigpLiAqLwogCXNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2tzZWMtPnNpZCk7Ci19CiAKLS8qKgotICogc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX3JlcXVlc3QgLSBIYW5kbGUgYSBuZXcgY29ubmVjdGlvbiByZXF1ZXN0Ci0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKiBAc29ja19zaWQ6IHRoZSBTSUQgb2YgdGhlIHBhcmVudCBzb2NrZXQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIElmIHByZXNlbnQsIHVzZSB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvZiB0aGUgcGFja2V0IGluIEBza2IgYW5kIHRoZQotICogcGFyZW50IHNvY2sncyBTSUQgdG8gYXJyaXZlIGF0IGEgU0lEIGZvciB0aGUgbmV3IGNoaWxkIHNvY2suICBSZXR1cm5zIHRoZQotICogU0lEIG9mIHRoZSBjb25uZWN0aW9uIG9yIFNFQ1NJRF9OVUxMIG9uIGZhaWx1cmUuCi0gKgotICovCi11MzIgc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNvY2tfc2lkKQotewotCWludCByYzsKLQl1MzIgcGVlcl9zaWQ7Ci0KLQlyYyA9IHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc2tiLCBzb2NrX3NpZCwgJnBlZXJfc2lkKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIFNFQ1NJRF9OVUxMOwotCi0JcmV0dXJuIHBlZXJfc2lkOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKioKQEAgLTI1NzIsMjUgKzI2NDYsMjQgQEAKIGludCBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCWludCByYzsKLQlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjOwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAKLQlpZiAoIVNfSVNTT0NLKGlub2RlLT5pX21vZGUpKQorCWlmICghU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkgfHwKKwkgICAgKChtYXNrICYgKE1BWV9XUklURSB8IE1BWV9BUFBFTkQpKSA9PSAwKSkKIAkJcmV0dXJuIDA7Ci0KIAlzb2NrID0gU09DS0VUX0koaW5vZGUpOwotCWlzZWMgPSBpbm9kZS0+aV9zZWN1cml0eTsKIAlza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKLQltdXRleF9sb2NrKCZpc2VjLT5sb2NrKTsKLQlpZiAodW5saWtlbHkoc2tzZWMtPm5sYmxfc3RhdGUgPT0gTkxCTF9SRVFVSVJFICYmCi0JCSAgICAgKG1hc2sgJiAoTUFZX1dSSVRFIHwgTUFZX0FQUEVORCkpKSkgewotCQlsb2NrX3NvY2soc29jay0+c2spOwotCQlyYyA9IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2tzZWMtPnNpZCk7Ci0JCXJlbGVhc2Vfc29jayhzb2NrLT5zayk7Ci0JfSBlbHNlCi0JCXJjID0gMDsKLQltdXRleF91bmxvY2soJmlzZWMtPmxvY2spOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChza3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1JFUVVJUkUpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKwlsb2NrX3NvY2soc29jay0+c2spOworCXJjID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZChzb2NrLCBza3NlYy0+c2lkKTsKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjY0OCw0MiArMjcyMSw2IEBACiB9CiAKIC8qKgotICogc2VsaW51eF9uZXRsYmxfc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtIC0gUmV0dXJuIHRoZSBjb25uZWN0ZWQgcGVlcidzIFNJRAotICogQHNvY2s6IHRoZSBzb2NrZXQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEV4YW1pbmUgQHNvY2sgdG8gZmluZCB0aGUgY29ubmVjdGVkIHBlZXIncyBTSUQuICBSZXR1cm5zIHRoZSBTSUQgb24gc3VjY2VzcwotICogb3IgU0VDU0lEX05VTEwgb24gZXJyb3IuCi0gKgotICovCi11MzIgc2VsaW51eF9uZXRsYmxfc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtKHN0cnVjdCBzb2NrZXQgKnNvY2spCi17Ci0Jc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7Ci0JcmV0dXJuIHNrc2VjLT5wZWVyX3NpZDsKLX0KLQotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbSAtIFJldHVybiB0aGUgU0lEIG9mIGEgTmV0TGFiZWwgcGFja2V0Ci0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBFeGFtaW5lIEBza2IgdG8gZmluZCB0aGUgU0lEIGFzc2lnbmVkIHRvIGl0IGJ5IE5ldExhYmVsLiAgUmV0dXJucyB0aGUgU0lEIG9uCi0gKiBzdWNjZXNzLCBTRUNTSURfTlVMTCBvbiBlcnJvci4KLSAqCi0gKi8KLXUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBwZWVyX3NpZDsKLQotCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwKLQkJCQkJIFNFQ0lOSVRTSURfVU5MQUJFTEVELAotCQkJCQkgJnBlZXJfc2lkKSAhPSAwKQotCQlyZXR1cm4gU0VDU0lEX05VTEw7Ci0KLQlyZXR1cm4gcGVlcl9zaWQ7Ci19Ci0KLS8qKgogICogc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNvY2tvcHQgLSBEbyBub3QgYWxsb3cgdXNlcnMgdG8gcmVtb3ZlIGEgTmV0TGFiZWwKICAqIEBzb2NrOiB0aGUgc29ja2V0CiAgKiBAbGV2ZWw6IHRoZSBzb2NrZXQgbGV2ZWwgb3IgcHJvdG9jb2wKQEAgLTI3MDEsMjEgKzI3MzgsMTkgQEAKIAkJCQkgICAgIGludCBvcHRuYW1lKQogewogCWludCByYyA9IDA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IFNPQ0tfSU5PREUoc29jayk7CiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYyA9IGlub2RlLT5pX3NlY3VyaXR5OwogCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKIAotCW11dGV4X2xvY2soJmlzZWMtPmxvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAobGV2ZWwgPT0gSVBQUk9UT19JUCAmJiBvcHRuYW1lID09IElQX09QVElPTlMgJiYKIAkgICAgc2tzZWMtPm5sYmxfc3RhdGUgPT0gTkxCTF9MQUJFTEVEKSB7CiAJCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwogCQlyYyA9IG5ldGxibF9zb2NrZXRfZ2V0YXR0cihzb2NrLCAmc2VjYXR0cik7Ci0JCWlmIChyYyA9PSAwICYmIChzZWNhdHRyLmNhY2hlIHx8IHNlY2F0dHIubWxzX2x2bF92bGQpKQorCQlpZiAocmMgPT0gMCAmJiBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUpCiAJCQlyYyA9IC1FQUNDRVM7CiAJCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOwogCX0KLQltdXRleF91bmxvY2soJmlzZWMtPmxvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zeW10YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc3ltdGFiLmMKaW5kZXggMjRhMTBkMy4uODM3NjU4YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zeW10YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3N5bXRhYi5jCkBAIC05LDkgKzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSAic3ltdGFiLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3ltaGFzaChzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5KQorc3RhdGljIHVuc2lnbmVkIGludCBzeW1oYXNoKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkpCiB7Ci0JY2hhciAqcCwgKmtleXA7CisJY29uc3QgY2hhciAqcCwgKmtleXA7CiAJdW5zaWduZWQgaW50IHNpemU7CiAJdW5zaWduZWQgaW50IHZhbDsKIApAQCAtMjMsOSArMjMsOSBAQAogCXJldHVybiB2YWwgJiAoaC0+c2l6ZSAtIDEpOwogfQogCi1zdGF0aWMgaW50IHN5bWNtcChzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5MSwgdm9pZCAqa2V5MikKK3N0YXRpYyBpbnQgc3ltY21wKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKQogewotCWNoYXIgKmtleXAxLCAqa2V5cDI7CisJY29uc3QgY2hhciAqa2V5cDEsICprZXlwMjsKIAogCWtleXAxID0ga2V5MTsKIAlrZXlwMiA9IGtleTI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCmluZGV4IDY3NWI5OTUuLmJkOGQxZWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgveGZybS5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCkBAIC0xMTUsNzYgKzExNSw0NiBAQAogCQkJc3RydWN0IGZsb3dpICpmbCkKIHsKIAl1MzIgc3RhdGVfc2lkOwotCXUzMiBwb2xfc2lkOwotCWludCBlcnI7CisJaW50IHJjOwogCi0JaWYgKHhwLT5zZWN1cml0eSkgewotCQlpZiAoIXgtPnNlY3VyaXR5KQotCQkJLyogdW5sYWJlbGVkIFNBIGFuZCBsYWJlbGVkIHBvbGljeSBjYW4ndCBtYXRjaCAqLwotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXN0YXRlX3NpZCA9IHgtPnNlY3VyaXR5LT5jdHhfc2lkOwotCQlwb2xfc2lkID0geHAtPnNlY3VyaXR5LT5jdHhfc2lkOwotCX0gZWxzZQorCWlmICgheHAtPnNlY3VyaXR5KQogCQlpZiAoeC0+c2VjdXJpdHkpCiAJCQkvKiB1bmxhYmVsZWQgcG9saWN5IGFuZCBsYWJlbGVkIFNBIGNhbid0IG1hdGNoICovCiAJCQlyZXR1cm4gMDsKIAkJZWxzZQogCQkJLyogdW5sYWJlbGVkIHBvbGljeSBhbmQgdW5sYWJlbGVkIFNBIG1hdGNoIGFsbCBmbG93cyAqLwogCQkJcmV0dXJuIDE7CisJZWxzZQorCQlpZiAoIXgtPnNlY3VyaXR5KQorCQkJLyogdW5sYWJlbGVkIFNBIGFuZCBsYWJlbGVkIHBvbGljeSBjYW4ndCBtYXRjaCAqLworCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCWlmICghc2VsaW51eF9hdXRob3JpemFibGVfeGZybSh4KSkKKwkJCQkvKiBOb3QgYSBTRUxpbnV4LWxhYmVsZWQgU0EgKi8KKwkJCQlyZXR1cm4gMDsKIAotCWVyciA9IGF2Y19oYXNfcGVybShzdGF0ZV9zaWQsIHBvbF9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAotCQkJICBBU1NPQ0lBVElPTl9fUE9MTUFUQ0gsCi0JCQkgIE5VTEwpOworCXN0YXRlX3NpZCA9IHgtPnNlY3VyaXR5LT5jdHhfc2lkOwogCi0JaWYgKGVycikKKwlpZiAoZmwtPnNlY2lkICE9IHN0YXRlX3NpZCkKIAkJcmV0dXJuIDA7CiAKLQllcnIgPSBhdmNfaGFzX3Blcm0oZmwtPnNlY2lkLCBzdGF0ZV9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAorCXJjID0gYXZjX2hhc19wZXJtKGZsLT5zZWNpZCwgc3RhdGVfc2lkLCBTRUNDTEFTU19BU1NPQ0lBVElPTiwKIAkJCSAgQVNTT0NJQVRJT05fX1NFTkRUTywKIAkJCSAgTlVMTCk/IDA6MTsKIAotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBMU00gaG9vayBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dGhvcml6ZXMgdGhhdCBhIHBhcnRpY3VsYXIgb3V0Z29pbmcgZmxvdwotICogY2FuIHVzZSBhIGdpdmVuIHNlY3VyaXR5IGFzc29jaWF0aW9uLgotICovCi0KLWludCBzZWxpbnV4X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSwKLQkJCQkgIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCi17Ci0JaW50IHJjID0gMDsKLQl1MzIgc2VsX3NpZCA9IFNFQ0lOSVRTSURfVU5MQUJFTEVEOwotCXN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eDsKLQotCWlmICgheHAtPnNlY3VyaXR5KQotCQlpZiAoIXhmcm0tPnNlY3VyaXR5KQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCWVsc2UKLQkJaWYgKCF4ZnJtLT5zZWN1cml0eSkKLQkJCXJldHVybiAwOwotCi0JLyogQ29udGV4dCBzaWQgaXMgZWl0aGVyIHNldCB0byBsYWJlbCBvciBBTllfQVNTT0MgKi8KLQlpZiAoKGN0eCA9IHhmcm0tPnNlY3VyaXR5KSkgewotCQlpZiAoIXNlbGludXhfYXV0aG9yaXphYmxlX2N0eChjdHgpKQotCQkJcmV0dXJuIDA7Ci0KLQkJc2VsX3NpZCA9IGN0eC0+Y3R4X3NpZDsKLQl9Ci0KLQlyYyA9IGF2Y19oYXNfcGVybShmbC0+c2VjaWQsIHNlbF9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAotCQkJICBBU1NPQ0lBVElPTl9fU0VORFRPLAotCQkJICBOVUxMKT8gMDoxOworCS8qCisJICogV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIFNBIFZzLiBwb2xpY3kgcG9sbWF0Y2ggY2hlY2sKKwkgKiBzaW5jZSB0aGUgU0EgaXMgbm93IG9mIHRoZSBzYW1lIGxhYmVsIGFzIHRoZSBmbG93IGFuZAorCSAqIGEgZmxvdyBWcy4gcG9saWN5IHBvbG1hdGNoIGNoZWNrIGhhZCBhbHJlYWR5IGhhcHBlbmVkCisJICogaW4gc2VsaW51eF94ZnJtX3BvbGljeV9sb29rdXAoKSBhYm92ZS4KKwkgKi8KIAogCXJldHVybiByYzsKIH0KIAogLyoKLSAqIExTTSBob29rIGltcGxlbWVudGF0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2lkIGZvciB0aGUgc2Vzc2lvbi4KKyAqIExTTSBob29rIGltcGxlbWVudGF0aW9uIHRoYXQgY2hlY2tzIGFuZC9vciByZXR1cm5zIHRoZSB4ZnJtIHNpZCBmb3IgdGhlCisgKiBpbmNvbWluZyBwYWNrZXQuCiAgKi8KIAogaW50IHNlbGludXhfeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKnNpZCwgaW50IGNrYWxsKQpAQCAtMjI2LDE2ICsxOTYsMTUgQEAKICAqIENUWCBkb2VzIG5vdCBoYXZlIGEgbWVhbmluZ2Z1bCB2YWx1ZSBvbiBpbnB1dAogICovCiBzdGF0aWMgaW50IHNlbGludXhfeGZybV9zZWNfY3R4X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAotCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2lkKQorCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwgdTMyIHNpZCkKIHsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYyA9IGN1cnJlbnQtPnNlY3VyaXR5OwogCXN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eCA9IE5VTEw7CiAJY2hhciAqY3R4X3N0ciA9IE5VTEw7CiAJdTMyIHN0cl9sZW47Ci0JdTMyIGN0eF9zaWQ7CiAKLQlCVUdfT04odWN0eCAmJiBwb2wpOworCUJVR19PTih1Y3R4ICYmIHNpZCk7CiAKIAlpZiAoIXVjdHgpCiAJCWdvdG8gbm90X2Zyb21fdXNlcjsKQEAgLTI3OSwxNSArMjQ4LDcgQEAKIAlyZXR1cm4gcmM7CiAKIG5vdF9mcm9tX3VzZXI6Ci0JaWYgKHBvbCkgewotCQlyYyA9IHNlY3VyaXR5X3NpZF9tbHNfY29weShwb2wtPmN0eF9zaWQsIHNpZCwgJmN0eF9zaWQpOwotCQlpZiAocmMpCi0JCQlnb3RvIG91dDsKLQl9Ci0JZWxzZQotCQljdHhfc2lkID0gc2lkOwotCi0JcmMgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChjdHhfc2lkLCAmY3R4X3N0ciwgJnN0cl9sZW4pOworCXJjID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkLCAmY3R4X3N0ciwgJnN0cl9sZW4pOwogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKQEAgLTMwMiw3ICsyNjMsNyBAQAogCiAJY3R4LT5jdHhfZG9pID0gWEZSTV9TQ19ET0lfTFNNOwogCWN0eC0+Y3R4X2FsZyA9IFhGUk1fU0NfQUxHX1NFTElOVVg7Ci0JY3R4LT5jdHhfc2lkID0gY3R4X3NpZDsKKwljdHgtPmN0eF9zaWQgPSBzaWQ7CiAJY3R4LT5jdHhfbGVuID0gc3RyX2xlbjsKIAltZW1jcHkoY3R4LT5jdHhfc3RyLAogCSAgICAgICBjdHhfc3RyLApAQCAtMzIzLDIyICsyODQsMTQgQEAKICAqIHhmcm1fcG9saWN5LgogICovCiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLAotCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgsIHN0cnVjdCBzb2NrICpzaykKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4KQogewogCWludCBlcnI7Ci0JdTMyIHNpZDsKIAogCUJVR19PTigheHApOwotCUJVR19PTih1Y3R4ICYmIHNrKTsKKwlCVUdfT04oIXVjdHgpOwogCi0JaWYgKHNrKSB7Ci0JCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMgPSBzay0+c2tfc2VjdXJpdHk7Ci0JCXNpZCA9IHNzZWMtPnNpZDsKLQl9Ci0JZWxzZQotCQlzaWQgPSBTRUNTSURfTlVMTDsKLQotCWVyciA9IHNlbGludXhfeGZybV9zZWNfY3R4X2FsbG9jKCZ4cC0+c2VjdXJpdHksIHVjdHgsIE5VTEwsIHNpZCk7CisJZXJyID0gc2VsaW51eF94ZnJtX3NlY19jdHhfYWxsb2MoJnhwLT5zZWN1cml0eSwgdWN0eCwgMCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzk5LDEzICszNTIsMTMgQEAKICAqIHhmcm1fc3RhdGUuCiAgKi8KIGludCBzZWxpbnV4X3hmcm1fc3RhdGVfYWxsb2Moc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwKLQkJc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2VjaWQpCisJCXUzMiBzZWNpZCkKIHsKIAlpbnQgZXJyOwogCiAJQlVHX09OKCF4KTsKIAotCWVyciA9IHNlbGludXhfeGZybV9zZWNfY3R4X2FsbG9jKCZ4LT5zZWN1cml0eSwgdWN0eCwgcG9sLCBzZWNpZCk7CisJZXJyID0gc2VsaW51eF94ZnJtX3NlY19jdHhfYWxsb2MoJngtPnNlY3VyaXR5LCB1Y3R4LCBzZWNpZCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDE5LDc0ICszNzIsNiBAQAogCQlrZnJlZShjdHgpOwogfQogCi0vKgotICogU0VMaW51eCBpbnRlcm5hbCBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY29udGV4dCBvZiBhIGNvbm5lY3RlZAotICogKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIFRDUCBzb2NrZXQgYmFzZWQgb24gaXRzIHNlY3VyaXR5Ci0gKiBhc3NvY2lhdGlvbiB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzb2NrZXQuCi0gKgotICogUmV0cmlldmUgdmlhIGdldHNvY2tvcHQgU09fUEVFUlNFQy4KLSAqLwotdTMyIHNlbGludXhfc29ja2V0X2dldHBlZXJfc3RyZWFtKHN0cnVjdCBzb2NrICpzaykKLXsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICpkc3RfdGVzdDsKLQl1MzIgcGVlcl9zaWQgPSBTRUNTSURfTlVMTDsKLQotCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQotCQlnb3RvIG91dDsKLQotCWRzdCA9IHNrX2RzdF9nZXQoc2spOwotCWlmICghZHN0KQotCQlnb3RvIG91dDsKLQotIAlmb3IgKGRzdF90ZXN0ID0gZHN0OyBkc3RfdGVzdCAhPSAwOwotICAgICAgCSAgICAgZHN0X3Rlc3QgPSBkc3RfdGVzdC0+Y2hpbGQpIHsKLQkJc3RydWN0IHhmcm1fc3RhdGUgKnggPSBkc3RfdGVzdC0+eGZybTsKLQotIAkJaWYgKHggJiYgc2VsaW51eF9hdXRob3JpemFibGVfeGZybSh4KSkgewotCSAJIAlzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHggPSB4LT5zZWN1cml0eTsKLQkJCXBlZXJfc2lkID0gY3R4LT5jdHhfc2lkOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZHN0X3JlbGVhc2UoZHN0KTsKLQotb3V0OgotCXJldHVybiBwZWVyX3NpZDsKLX0KLQotLyoKLSAqIFNFTGludXggaW50ZXJuYWwgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGNvbnRleHQgb2YgYSBVRFAgcGFja2V0Ci0gKiBiYXNlZCBvbiBpdHMgc2VjdXJpdHkgYXNzb2NpYXRpb24gdXNlZCB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgc29ja2V0LgotICoKLSAqIFJldHJpZXZlIHZpYSBzZXRzb2Nrb3B0IElQX1BBU1NTRUMgYW5kIHJlY3Ztc2cgd2l0aCBjb250cm9sIG1lc3NhZ2UKLSAqIHR5cGUgU0NNX1NFQ1VSSVRZLgotICovCi11MzIgc2VsaW51eF9zb2NrZXRfZ2V0cGVlcl9kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBzZWNfcGF0aCAqc3A7Ci0KLQlpZiAoc2tiID09IE5VTEwpCi0JCXJldHVybiBTRUNTSURfTlVMTDsKLQotCWlmIChza2ItPnNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKLQkJcmV0dXJuIFNFQ1NJRF9OVUxMOwotCi0Jc3AgPSBza2ItPnNwOwotCWlmIChzcCkgewotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSBzcC0+bGVuLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IHNwLT54dmVjW2ldOwotCQkJaWYgKHNlbGludXhfYXV0aG9yaXphYmxlX3hmcm0oeCkpIHsKLQkJCQlzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHggPSB4LT5zZWN1cml0eTsKLQkJCQlyZXR1cm4gY3R4LT5jdHhfc2lkOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIFNFQ1NJRF9OVUxMOwotfQotCiAgLyoKICAgKiBMU00gaG9vayBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dGhvcml6ZXMgZGVsZXRpb24gb2YgbGFiZWxlZCBTQXMuCiAgICovCkBAIC01MzIsNiArNDE3LDEzIEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIFRoaXMgY2hlY2sgZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gYXNzb2NpYXRpb24gaW52b2x2ZWQgaXMKKwkgKiBpbnRlbmRlZCwgYWNjb3JkaW5nIHRvIFRyZW50IEphZWdlciwgdG8gbWFrZSBzdXJlIGEKKwkgKiBwcm9jZXNzIGNhbid0IGVuZ2FnZSBpbiBub24taXBzZWMgY29tbXVuaWNhdGlvbiB1bmxlc3MKKwkgKiBleHBsaWNpdGx5IGFsbG93ZWQgYnkgcG9saWN5LgorCSAqLworCiAJcmMgPSBhdmNfaGFzX3Blcm0oaXNlY19zaWQsIHNlbF9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAogCQkJICBBU1NPQ0lBVElPTl9fUkVDVkZST00sIGFkKTsKIApAQCAtNTQzLDEwICs0MzUsMTAgQEAKICAqIElmIHdlIGhhdmUgbm8gc2VjdXJpdHkgYXNzb2NpYXRpb24sIHRoZW4gd2UgbmVlZCB0byBkZXRlcm1pbmUKICAqIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBhbGxvd2VkIHRvIHNlbmQgdG8gYW4gdW5sYWJlbGxlZCBkZXN0aW5hdGlvbi4KICAqIElmIHdlIGRvIGhhdmUgYSBhdXRob3JpemFibGUgc2VjdXJpdHkgYXNzb2NpYXRpb24sIHRoZW4gaXQgaGFzIGFscmVhZHkgYmVlbgotICogY2hlY2tlZCBpbiB4ZnJtX3BvbGljeV9sb29rdXAgaG9vay4KKyAqIGNoZWNrZWQgaW4gdGhlIHNlbGludXhfeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCBob29rIGFib3ZlLgogICovCiBpbnQgc2VsaW51eF94ZnJtX3Bvc3Ryb3V0ZV9sYXN0KHUzMiBpc2VjX3NpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKKwkJCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwgdTggcHJvdG8pCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCWludCByYyA9IDA7CkBAIC01NjUsNiArNDU3LDI3IEBACiAJCX0KIAl9CiAKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBJUFBST1RPX0FIOgorCWNhc2UgSVBQUk9UT19FU1A6CisJY2FzZSBJUFBST1RPX0NPTVA6CisJCS8qCisJCSAqIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHBhY2tldCBvbmNlIGJlZm9yZQorCQkgKiBpdCB1bmRlcndlbnQgeGZybShzKS4gTm8gbmVlZCB0byBzdWJqZWN0IGl0IHRvIHRoZQorCQkgKiB1bmxhYmVsZWQgY2hlY2suCisJCSAqLworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFRoaXMgY2hlY2sgZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gYXNzb2NpYXRpb24gaW52b2x2ZWQgaXMKKwkgKiBpbnRlbmRlZCwgYWNjb3JkaW5nIHRvIFRyZW50IEphZWdlciwgdG8gbWFrZSBzdXJlIGEKKwkgKiBwcm9jZXNzIGNhbid0IGVuZ2FnZSBpbiBub24taXBzZWMgY29tbXVuaWNhdGlvbiB1bmxlc3MKKwkgKiBleHBsaWNpdGx5IGFsbG93ZWQgYnkgcG9saWN5LgorCSAqLworCiAJcmMgPSBhdmNfaGFzX3Blcm0oaXNlY19zaWQsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCBTRUNDTEFTU19BU1NPQ0lBVElPTiwKIAkJCSAgQVNTT0NJQVRJT05fX1NFTkRUTywgYWQpOwogb3V0OgpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggZTBkNzkxYS4uOTU5NDliNiAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC02NCwxMSArNjQsMTEgQEAKIAogc291cmNlICJzb3VuZC9taXBzL0tjb25maWciCiAKLSMgdGhlIGZvbGxvd2luZyB3aWxsIGRlcGVuZW5kIG9uIHRoZSBvcmRlciBvZiBjb25maWcuCisjIHRoZSBmb2xsb3dpbmcgd2lsbCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIGNvbmZpZy4KICMgaGVyZSBhc3N1bWluZyBVU0IgaXMgZGVmaW5lZCBiZWZvcmUgQUxTQQogc291cmNlICJzb3VuZC91c2IvS2NvbmZpZyIKIAotIyB0aGUgZm9sbG93aW5nIHdpbGwgZGVwZW5lbmQgb24gdGhlIG9yZGVyIG9mIGNvbmZpZy4KKyMgdGhlIGZvbGxvd2luZyB3aWxsIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgY29uZmlnLgogIyBoZXJlIGFzc3VtaW5nIFBDTUNJQSBpcyBkZWZpbmVkIGJlZm9yZSBBTFNBCiBzb3VyY2UgInNvdW5kL3BjbWNpYS9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMKaW5kZXggMmVmNTVhMS4uOWRlODQ4NWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMKQEAgLTUxNCw5ICs1MTQsMTUgQEAKIAltdXRleF9sb2NrKCZ0YXMtPm10eCk7CiAJb2xkYWNyID0gdGFzLT5hY3I7CiAKLQl0YXMtPmFjciAmPSB+VEFTX0FDUl9JTlBVVF9COworCS8qCisJICogRGVzcGl0ZSB3aGF0IHRoZSBkYXRhIHNoZWV0IHNheXMgaW4gb25lIHBsYWNlLCB0aGUKKwkgKiBUQVNfQUNSX0JfTU9OQVVSRUFMIGJpdCBmb3JjZXMgbW9ubyBvdXRwdXQgZXZlbiB3aGVuCisJICogaW5wdXQgQSAobGluZSBpbikgaXMgc2VsZWN0ZWQuCisJICovCisJdGFzLT5hY3IgJj0gfihUQVNfQUNSX0lOUFVUX0IgfCBUQVNfQUNSX0JfTU9OQVVSRUFMKTsKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKLQkJdGFzLT5hY3IgfD0gVEFTX0FDUl9JTlBVVF9COworCQl0YXMtPmFjciB8PSBUQVNfQUNSX0lOUFVUX0IgfCBUQVNfQUNSX0JfTU9OQVVSRUFMIHwKKwkJICAgICAgVEFTX0FDUl9CX01PTl9TRUxfUklHSFQ7CiAJaWYgKG9sZGFjciA9PSB0YXMtPmFjcikgewogCQltdXRleF91bmxvY2soJnRhcy0+bXR4KTsKIAkJcmV0dXJuIDA7CkBAIC02ODYsOCArNjkyLDcgQEAKIAlpZiAodGFzX3dyaXRlX3JlZyh0YXMsIFRBU19SRUdfTUNTLCAxLCAmdG1wKSkKIAkJZ290byBvdXRlcnI7CiAKLQl0YXMtPmFjciB8PSBUQVNfQUNSX0FOQUxPR19QRE9XTiB8IFRBU19BQ1JfQl9NT05BVVJFQUwgfAotCQlUQVNfQUNSX0JfTU9OX1NFTF9SSUdIVDsKKwl0YXMtPmFjciB8PSBUQVNfQUNSX0FOQUxPR19QRE9XTjsKIAlpZiAodGFzX3dyaXRlX3JlZyh0YXMsIFRBU19SRUdfQUNSLCAxLCAmdGFzLT5hY3IpKQogCQlnb3RvIG91dGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbml0LmMgYi9zb3VuZC9jb3JlL2luaXQuYwppbmRleCAzMDU4ZDYyLi42MTUyYTc1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2luaXQuYworKysgYi9zb3VuZC9jb3JlL2luaXQuYwpAQCAtMzYxLDYgKzM2MSw4IEBACiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ1bmFibGUgdG8gZnJlZSBjYXJkIGluZm9cbiIpOwogCQkvKiBOb3QgZmF0YWwgZXJyb3IgKi8KIAl9CisJaWYgKGNhcmQtPmRldikKKwkJZGV2aWNlX3VucmVnaXN0ZXIoY2FyZC0+ZGV2KTsKIAlrZnJlZShjYXJkKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5NSw2ICs0OTcsMTIgQEAKIAlpbnQgZXJyOwogCiAJc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoIWNhcmQtPmRldikgeworCQljYXJkLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBjYXJkLT5wYXJlbnQsIDAsCisJCQkJCSAgImNhcmQlaSIsIGNhcmQtPm51bWJlcik7CisJCWlmIChJU19FUlIoY2FyZC0+ZGV2KSkKKwkJCWNhcmQtPmRldiA9IE5VTEw7CisJfQogCWlmICgoZXJyID0gc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoY2FyZCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltdXRleF9sb2NrKCZzbmRfY2FyZF9tdXRleCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKaW5kZXggNTA1YjIzZS4uZTA4MjFlYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwpAQCAtMjM1OSw3ICsyMzU5LDggQEAKIAkJc3Vic3RyZWFtID0gcGNtX29zc19maWxlLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07CiAJc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJcGNtID0gc3Vic3RyZWFtLT5wY207Ci0Jc25kX3BjbV9vc3Nfc3luYyhwY21fb3NzX2ZpbGUpOworCWlmICghcGNtLT5jYXJkLT5zaHV0ZG93bikKKwkJc25kX3BjbV9vc3Nfc3luYyhwY21fb3NzX2ZpbGUpOwogCW11dGV4X2xvY2soJnBjbS0+b3Blbl9tdXRleCk7CiAJc25kX3BjbV9vc3NfcmVsZWFzZV9maWxlKHBjbV9vc3NfZmlsZSk7CiAJbXV0ZXhfdW5sb2NrKCZwY20tPm9wZW5fbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY20uYyBiL3NvdW5kL2NvcmUvcGNtLmMKaW5kZXggZmJiYmNkMi4uNWFjNmUxOSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY20uYworKysgYi9zb3VuZC9jb3JlL3BjbS5jCkBAIC05MTAsNyArOTEwLDggQEAKIAlzdWJzdHJlYW0tPnBzdHItPnN1YnN0cmVhbV9vcGVuZWQtLTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19wY21fY2xhc3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3BjbV9jbGFzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJY29uc3QgY2hhciAqc3RyOwpAQCAtOTIxLDcgKzkyMiw3IEBACiAJCVtTTkRSVl9QQ01fQ0xBU1NfRElHSVRJWkVSXSA9ICJkaWdpdGl6ZXIiLAogCX07CiAKLQlpZiAoISAocGNtID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKSkgfHwKKwlpZiAoISAocGNtID0gZGV2X2dldF9kcnZkYXRhKGRldikpIHx8CiAJICAgIHBjbS0+ZGV2X2NsYXNzID4gU05EUlZfUENNX0NMQVNTX0xBU1QpCiAJCXN0ciA9ICJub25lIjsKIAllbHNlCkBAIC05MjksNyArOTMwLDcgQEAKICAgICAgICAgcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIHN0cik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBwY21fYXR0cnMgPQorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjbV9hdHRycyA9CiAJX19BVFRSKHBjbV9jbGFzcywgU19JUlVHTywgc2hvd19wY21fY2xhc3MsIE5VTEwpOwogCiBzdGF0aWMgaW50IHNuZF9wY21fZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IDM3YjRiMTAuLjY2ZTI0YjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC0xMzEwLDcgKzEzMTAsOCBAQAogCQkJICAgICAgIGludCBmX2ZsYWdzKQogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCisJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4gfHwKKwkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfRElTQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVCQURGRDsKIAlpZiAoc25kX3BjbV9ydW5uaW5nKHN1YnN0cmVhbSkpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0xNTY4LDcgKzE1NjksOCBAQAogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJY2FyZCA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkOwogCi0JaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCisJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4gfHwKKwkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfRElTQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVCQURGRDsKIAogCXNuZF9wb3dlcl9sb2NrKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ydGN0aW1lci5jIGIvc291bmQvY29yZS9ydGN0aW1lci5jCmluZGV4IDQxMmRkNjIuLjlmN2IzMmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKQEAgLTIyLDEzICsyMiwxMCBAQAogCiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvdGltZXIuaD4KLSNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19SVEMpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19NT0RVTEUpCiAKQEAgLTUwLDcgKzQ3LDkgQEAKICAqIFRoZSBoYXJkd2FyZSBkZXBlbmRlbnQgZGVzY3JpcHRpb24gZm9yIHRoaXMgdGltZXIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3RpbWVyX2hhcmR3YXJlIHJ0Y19odyA9IHsKLQkuZmxhZ3MgPQlTTkRSVl9USU1FUl9IV19GSVJTVHxTTkRSVl9USU1FUl9IV19BVVRPLAorCS5mbGFncyA9CVNORFJWX1RJTUVSX0hXX0FVVE8gfAorCQkJU05EUlZfVElNRVJfSFdfRklSU1QgfAorCQkJU05EUlZfVElNRVJfSFdfVEFTS0xFVCwKIAkudGlja3MgPQkxMDAwMDAwMDBMLAkJLyogRklYTUU6IFhYWCAqLwogCS5vcGVuID0JCXJ0Y3RpbWVyX29wZW4sCiAJLmNsb3NlID0JcnRjdGltZXJfY2xvc2UsCkBAIC02MCw2ICs1OSw3IEBACiAKIHN0YXRpYyBpbnQgcnRjdGltZXJfZnJlcSA9IFJUQ19GUkVROwkJLyogZnJlcXVlbmN5ICovCiBzdGF0aWMgc3RydWN0IHNuZF90aW1lciAqcnRjdGltZXI7CitzdGF0aWMgc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ0Y190YXNrbGV0Owogc3RhdGljIHJ0Y190YXNrX3QgcnRjX3Rhc2s7CiAKIApAQCAtODEsNiArODEsNyBAQAogCXJ0Y190YXNrX3QgKnJ0YyA9IHQtPnByaXZhdGVfZGF0YTsKIAlpZiAocnRjKSB7CiAJCXJ0Y191bnJlZ2lzdGVyKHJ0Yyk7CisJCXRhc2tsZXRfa2lsbCgmcnRjX3Rhc2tsZXQpOwogCQl0LT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTEwNSwxMiArMTA2LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0Y3RpbWVyX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXNuZF90aW1lcl9pbnRlcnJ1cHQoKHN0cnVjdCBzbmRfdGltZXIgKilkYXRhLCAxKTsKK30KKwogLyoKICAqIGludGVycnVwdAogICovCiBzdGF0aWMgdm9pZCBydGN0aW1lcl9pbnRlcnJ1cHQodm9pZCAqcHJpdmF0ZV9kYXRhKQogewotCXNuZF90aW1lcl9pbnRlcnJ1cHQocHJpdmF0ZV9kYXRhLCAxKTsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKHByaXZhdGVfZGF0YSk7CiB9CiAKIApAQCAtMTM5LDkgKzE0NSwxMSBAQAogCXRpbWVyLT5odyA9IHJ0Y19odzsKIAl0aW1lci0+aHcucmVzb2x1dGlvbiA9IE5BTk9fU0VDIC8gcnRjdGltZXJfZnJlcTsKIAorCXRhc2tsZXRfaW5pdCgmcnRjX3Rhc2tsZXQsIHJ0Y3RpbWVyX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXRpbWVyKTsKKwogCS8qIHNldCB1cCBSVEMgY2FsbGJhY2sgKi8KIAlydGNfdGFzay5mdW5jID0gcnRjdGltZXJfaW50ZXJydXB0OwotCXJ0Y190YXNrLnByaXZhdGVfZGF0YSA9IHRpbWVyOworCXJ0Y190YXNrLnByaXZhdGVfZGF0YSA9ICZydGNfdGFza2xldDsKIAogCWVyciA9IHNuZF90aW1lcl9nbG9iYWxfcmVnaXN0ZXIodGltZXIpOwogCWlmIChlcnIgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NvdW5kLmMgYi9zb3VuZC9jb3JlL3NvdW5kLmMKaW5kZXggZWZhNDc2Yy4uMjgyNzQyMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZC5jCisrKyBiL3NvdW5kL2NvcmUvc291bmQuYwpAQCAtNjEsOSArNjEsNiBAQAogc3RhdGljIHN0cnVjdCBzbmRfbWlub3IgKnNuZF9taW5vcnNbU05EUlZfT1NfTUlOT1JTXTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc291bmRfbXV0ZXgpOwogCi1leHRlcm4gc3RydWN0IGNsYXNzICpzb3VuZF9jbGFzczsKLQotCiAjaWZkZWYgQ09ORklHX0tNT0QKIAogLyoqCkBAIC0yNjgsMTEgKzI2NSwxMCBAQAogCXNuZF9taW5vcnNbbWlub3JdID0gcHJlZzsKIAlpZiAoY2FyZCkKIAkJZGV2aWNlID0gY2FyZC0+ZGV2OwotCXByZWctPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIE5VTEwsCi0JCQkJCSAgICAgIE1LREVWKG1ham9yLCBtaW5vciksCi0JCQkJCSAgICAgIGRldmljZSwgIiVzIiwgbmFtZSk7Ci0JaWYgKHByZWctPmNsYXNzX2RldikKLQkJY2xhc3Nfc2V0X2RldmRhdGEocHJlZy0+Y2xhc3NfZGV2LCBwcml2YXRlX2RhdGEpOworCXByZWctPmRldiA9IGRldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIGRldmljZSwgTUtERVYobWFqb3IsIG1pbm9yKSwKKwkJCQkgICIlcyIsIG5hbWUpOworCWlmIChwcmVnLT5kZXYpCisJCWRldl9zZXRfZHJ2ZGF0YShwcmVnLT5kZXYsIHByaXZhdGVfZGF0YSk7CiAKIAltdXRleF91bmxvY2soJnNvdW5kX211dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTMyMCw3ICszMTYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljbGFzc19kZXZpY2VfZGVzdHJveShzb3VuZF9jbGFzcywgTUtERVYobWFqb3IsIG1pbm9yKSk7CisJZGV2aWNlX2Rlc3Ryb3koc291bmRfY2xhc3MsIE1LREVWKG1ham9yLCBtaW5vcikpOwogCiAJa2ZyZWUoc25kX21pbm9yc1ttaW5vcl0pOwogCXNuZF9taW5vcnNbbWlub3JdID0gTlVMTDsKQEAgLTMzMSwxNSArMzI3LDE1IEBACiBFWFBPUlRfU1lNQk9MKHNuZF91bnJlZ2lzdGVyX2RldmljZSk7CiAKIGludCBzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQogewogCWludCBtaW5vciwgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCBkZXZpY2UgKmQ7CiAKIAltdXRleF9sb2NrKCZzb3VuZF9tdXRleCk7CiAJbWlub3IgPSBmaW5kX3NuZF9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwotCWlmIChtaW5vciA+PSAwICYmIChjZGV2ID0gc25kX21pbm9yc1ttaW5vcl0tPmNsYXNzX2RldikgIT0gTlVMTCkKLQkJcmV0ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNkZXYsIGF0dHIpOworCWlmIChtaW5vciA+PSAwICYmIChkID0gc25kX21pbm9yc1ttaW5vcl0tPmRldikgIT0gTlVMTCkKKwkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGQsIGF0dHIpOwogCW11dGV4X3VubG9jaygmc291bmRfbXV0ZXgpOwogCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHguYyBiL3NvdW5kL29zcy9jczQ2eHguYwppbmRleCA2ZTNjNDFmLi4xNDdjOGE5IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvY3M0Nnh4LmMKKysrIGIvc291bmQvb3NzL2NzNDZ4eC5jCkBAIC05MSw2ICs5MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CkBAIC03NzksNyArNzgwLDcgQEAKIAkJcmF0ZSA9IDQ4MDAwIC8gOTsKIAogCS8qCi0JICogIFdlIGNhbiBub3QgY2FwdHVyZSBhdCBhdCByYXRlIGdyZWF0ZXIgdGhhbiB0aGUgSW5wdXQgUmF0ZSAoNDgwMDApLgorCSAqICBXZSBjYW5ub3QgY2FwdHVyZSBhdCBhdCByYXRlIGdyZWF0ZXIgdGhhbiB0aGUgSW5wdXQgUmF0ZSAoNDgwMDApLgogCSAqICBSZXR1cm4gYW4gZXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHN0cmF5IG91dHNpZGUgdGhhdCBsaW1pdC4KIAkgKi8KIAlpZiAocmF0ZSA+IDQ4MDAwKQpAQCAtNDc1NCw4ICs0NzU1LDggQEAKIAltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsJCS8qIFNob3VsZG50IGJlIG5lZWRlZCA/PyAqLwogCQogLyoKLSogSWYgd2UgYXJlIHJlc3VtaW5nIHVuZGVyIDIuMi54IHRoZW4gd2UgY2FuIG5vdCBzY2hlZHVsZSBhIHRpbWVvdXQuCi0qIHNvLCBqdXN0IHNwaW4gdGhlIENQVS4KKyogSWYgd2UgYXJlIHJlc3VtaW5nIHVuZGVyIDIuMi54IHRoZW4gd2UgY2Fubm90IHNjaGVkdWxlIGEgdGltZW91dCwKKyogc28ganVzdCBzcGluIHRoZSBDUFUuCiAqLwogCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7CiAJLyoKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFidWYuYyBiL3NvdW5kL29zcy9kbWFidWYuYwppbmRleCBiMjU2YzA0Li5lYWY2OTk3IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hYnVmLmMKKysrIGIvc291bmQvb3NzL2RtYWJ1Zi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIEJFX0NPTlNFUlZBVElWRQogI2RlZmluZSBTQU1QTEVfUk9VTkRVUCAwCiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgogCiAjZGVmaW5lIERNQVBfRlJFRV9PTl9DTE9TRSAgICAgIDAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCmluZGV4IGNkZTRkNTkuLjg2ZGQyMzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKKysrIGIvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCiAjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzEuYyBiL3NvdW5kL29zcy9lczEzNzEuYwppbmRleCBkZGY2YjBhLi5jYzI4MmEwIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXMxMzcxLmMKKysrIGIvc291bmQvb3NzL2VzMTM3MS5jCkBAIC0xMzAsNiArMTMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2k4MTBfYXVkaW8uYyBiL3NvdW5kL29zcy9pODEwX2F1ZGlvLmMKaW5kZXggMjQwY2M3OS4uYzNjOGE3MiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2k4MTBfYXVkaW8uYworKysgYi9zb3VuZC9vc3MvaTgxMF9hdWRpby5jCkBAIC0xMDEsNiArMTAxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kY2FyZC5jIGIvc291bmQvb3NzL3NvdW5kY2FyZC5jCmluZGV4IDIzNDRkMDkuLjhmYjhlN2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb3VuZGNhcmQuYworKysgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAvKgogICogVGhpcyBvdWdodCB0byBiZSBtb3ZlZCBpbnRvIGluY2x1ZGUvYXNtL2RtYS5oCkBAIC01NTcsMTcgKzU1OCwxNyBAQAogCXNvdW5kX2RtYXBfZmxhZyA9IChkbWFidWYgPiAwID8gMSA6IDApOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGV2X2xpc3QpIC8gc2l6ZW9mICpkZXZfbGlzdDsgaSsrKSB7Ci0JCWNsYXNzX2RldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIE5VTEwsCi0JCQkJICAgIE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vciksCi0JCQkJICAgIE5VTEwsICIlcyIsIGRldl9saXN0W2ldLm5hbWUpOworCQlkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBOVUxMLAorCQkJICAgICAgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yKSwKKwkJCSAgICAgICIlcyIsIGRldl9saXN0W2ldLm5hbWUpOwogCiAJCWlmICghZGV2X2xpc3RbaV0ubnVtKQogCQkJY29udGludWU7CiAKIAkJZm9yIChqID0gMTsgaiA8ICpkZXZfbGlzdFtpXS5udW07IGorKykKLQkJCWNsYXNzX2RldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIE5VTEwsCi0JCQkJCSAgICBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IgKyAoaioweDEwKSksCi0JCQkJCSAgICBOVUxMLCAiJXMlZCIsIGRldl9saXN0W2ldLm5hbWUsIGopOworCQkJZGV2aWNlX2NyZWF0ZShzb3VuZF9jbGFzcywgTlVMTCwKKwkJCQkgICAgICBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IgKyAoaioweDEwKSksCisJCQkJICAgICAgIiVzJWQiLCBkZXZfbGlzdFtpXS5uYW1lLCBqKTsKIAl9CiAKIAlpZiAoc291bmRfbmJsb2NrcyA+PSAxMDI0KQpAQCAtNTgxLDExICs1ODIsMTEgQEAKIAlpbnQgaSwgajsKIAogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRldl9saXN0KSAvIHNpemVvZiAqZGV2X2xpc3Q7IGkrKykgewotCQljbGFzc19kZXZpY2VfZGVzdHJveShzb3VuZF9jbGFzcywgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yKSk7CisJCWRldmljZV9kZXN0cm95KHNvdW5kX2NsYXNzLCBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IpKTsKIAkJaWYgKCFkZXZfbGlzdFtpXS5udW0pCiAJCQljb250aW51ZTsKIAkJZm9yIChqID0gMTsgaiA8ICpkZXZfbGlzdFtpXS5udW07IGorKykKLQkJCWNsYXNzX2RldmljZV9kZXN0cm95KHNvdW5kX2NsYXNzLCBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IgKyAoaioweDEwKSkpOworCQkJZGV2aWNlX2Rlc3Ryb3koc291bmRfY2xhc3MsIE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vciArIChqKjB4MTApKSk7CiAJfQogCQogCXVucmVnaXN0ZXJfc291bmRfc3BlY2lhbCgxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zc2NhcGUuYyBiL3NvdW5kL29zcy9zc2NhcGUuYwppbmRleCA1MWYyZmE2Li4zMGMzNmQxIDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvc3NjYXBlLmMKKysrIGIvc291bmQvb3NzL3NzY2FwZS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSAiY29wcm9jLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHJpZGVudC5jIGIvc291bmQvb3NzL3RyaWRlbnQuYwppbmRleCA3YTM2M2ExLi42YjFmOGM5IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvdHJpZGVudC5jCisrKyBiL3NvdW5kL29zcy90cmlkZW50LmMKQEAgLTIxNiw2ICsyMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggODA1ODA1OS4uOGJjNGZmYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTk1Niw2ICs5NTYsNyBAQAogCSAuY2EwMTUxX2NoaXAgPSAxLAogCSAuc3BrNzEgPSAxLAogCSAuc3BkaWZfYnVnID0gMSwKKwkgLmFkY18xMzYxdCA9IDEsICAvKiAyNCBiaXQgY2FwdHVyZSBpbnN0ZWFkIG9mIDE2Yml0LiBGaXhlcyBBTFNBIGJ1ZyMzMjQgKi8KIAkgLmFjOTdfY2hpcCA9IDF9ICwKIAl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwNCwgLnJldmlzaW9uID0gMHgwNCwKIAkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDIgW1Vua25vd25dIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggMGQ3MjhjNi4uZmI5NjE0NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTU4NzAsNyArNTg3MCw3IEBACiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTBjZiwgLnBjaV9zdWJkZXZpY2UgPSAweDEzOTcsCiAJICAuY29uZmlnID0gQUxDMjYyX0ZVSklUU1UgfSwKIAl7IC5tb2RlbG5hbWUgPSAiaHAtYnBjIiwgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MjA4YywKKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MjgwYywKIAkgIC5jb25maWcgPSBBTEMyNjJfSFBfQlBDIH0sIC8qIHh3NDQwMCAqLwogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDE0LAogCSAgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwgLyogeHc2NDAwICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKaW5kZXggNzMxYjdiOS4uZmU1MWVmMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwpAQCAtMzM2LDYgKzMzNiwxMyBAQAogCSAgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAogCSAgLnBjaV9zdWJkZXZpY2UgPSAweDI2NjgsCS8qIERGSSBMYW5QYXJ0eSAqLwogCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCisJLyogRGVsbCBsYXB0b3BzIGhhdmUgQklPUyBwcm9ibGVtICovCisJeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfREVMTCwgLnBjaV9zdWJkZXZpY2UgPSAweDAxYjUsCisJICAuY29uZmlnID0gU1RBQ19SRUYgfSwJLyogRGVsbCBJbnNwaXJvbiA2MzBtICovCisJeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfREVMTCwgLnBjaV9zdWJkZXZpY2UgPSAweDAxYzIsCisJICAuY29uZmlnID0gU1RBQ19SRUYgfSwJLyogRGVsbCBMYXRpdHVkZSBENjIwICovCisJeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfREVMTCwgLnBjaV9zdWJkZXZpY2UgPSAweDAxY2IsCisJICAuY29uZmlnID0gU1RBQ19SRUYgfSwJLyogRGVsbCBMYXRpdHVkZSAxMjBMICovCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtNTkxLDEzICs1OTgsNiBAQAogCSAgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAogCSAgLnBjaV9zdWJkZXZpY2UgPSAweDI2NjgsCS8qIERGSSBMYW5QYXJ0eSAqLwogCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCQkvKiBTaWdtYVRlbCByZWZlcmVuY2UgYm9hcmQgKi8KLQkvKiBEZWxsIGxhcHRvcHMgaGF2ZSBCSU9TIHByb2JsZW0gKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ERUxMLCAucGNpX3N1YmRldmljZSA9IDB4MDFiNSwKLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkvKiBEZWxsIEluc3Bpcm9uIDYzMG0gKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ERUxMLCAucGNpX3N1YmRldmljZSA9IDB4MDFjMiwKLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkvKiBEZWxsIExhdGl0dWRlIEQ2MjAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ERUxMLCAucGNpX3N1YmRldmljZSA9IDB4MDFjYiwKLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkvKiBEZWxsIExhdGl0dWRlIDEyMEwgKi8KIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jIGIvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYwppbmRleCBmZDM1OTBmLi4yZDQwY2M3IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCisrKyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKQEAgLTIxOSwzNSArMjE5LDE1IEBACiBzdGF0aWMgaW50IHBkYWNmX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3Qgc25kX3BkYWNmICpwZGFjZiA9IGxpbmstPnByaXY7Ci0JdHVwbGVfdCB0dXBsZTsKLQljaXNwYXJzZV90ICpwYXJzZSA9IE5VTEw7Ci0JdV9zaG9ydCBidWZbMzJdOwogCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKIAogCXNuZF9wcmludGRkKEtFUk5fREVCVUcgInBkYWNmX2NvbmZpZyBjYWxsZWRcbiIpOwotCXBhcnNlID0ga21hbGxvYyhzaXplb2YoKnBhcnNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEgcGFyc2UpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGRhY2ZfY29uZmlnOiBjYW5ub3QgYWxsb2NhdGVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsIHBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDU7CiAKIAlDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOwogCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CiAJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKIAotCWtmcmVlKHBhcnNlKTsKLQogCWlmIChzbmRfcGRhY2ZfYXNzaWduX3Jlc291cmNlcyhwZGFjZiwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpIDwgMCkKIAkJZ290byBmYWlsZWQ7CiAKQEAgLTI1NSw3ICsyMzUsNiBAQAogCXJldHVybiAwOwogCiBjc19mYWlsZWQ6Ci0Ja2ZyZWUocGFyc2UpOwogCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIGZhaWxlZDoKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CkBAIC0yOTksNyArMjc4LDggQEAKICAqIE1vZHVsZSBlbnRyeSBwb2ludHMKICAqLwogc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNuZF9wZGFjZl9pZHNbXSA9IHsKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWQsIDB4NGM0NSksCisJLyogdGhpcyBpcyB0b28gZ2VuZXJhbCBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWQsIDB4NGM0NSksICovCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNvcmUgU291bmQiLCJQREF1ZGlvLUNGIiwweDM5NmQxOWQyLDB4NzE3MTdiNDkpLAogCVBDTUNJQV9ERVZJQ0VfTlVMTAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzbmRfcGRhY2ZfaWRzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jIGIvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMKaW5kZXggMzA4OWZjYy4uZDdkZjU5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMKKysrIGIvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMKQEAgLTIxNywzNCArMjE3LDEyIEBACiB7CiAJc3RydWN0IHZ4X2NvcmUgKmNoaXAgPSBsaW5rLT5wcml2OwogCXN0cnVjdCBzbmRfdnhwb2NrZXQgKnZ4cCA9IChzdHJ1Y3Qgc25kX3Z4cG9ja2V0ICopY2hpcDsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgKnBhcnNlOwotCXVfc2hvcnQgYnVmWzMyXTsKIAlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CiAKIAlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJ2eHBvY2tldF9jb25maWcgY2FsbGVkXG4iKTsKLQlwYXJzZSA9IGttYWxsb2Moc2l6ZW9mKCpwYXJzZSksIEdGUF9LRVJORUwpOwotCWlmICghIHBhcnNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInZ4OiBjYW5ub3QgYWxsb2NhdGVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsIHBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKIAkvKiByZWRlZmluZSBoYXJkd2FyZSByZWNvcmQgYWNjb3JkaW5nIHRvIHRoZSBWRVJTSU9OMSBzdHJpbmcgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgcGFyc2UpKTsKLQlpZiAoISBzdHJjbXAocGFyc2UtPnZlcnNpb25fMS5zdHIgKyBwYXJzZS0+dmVyc2lvbl8xLm9mc1sxXSwgIlZYLVBPQ0tFVCIpKSB7CisJaWYgKCFzdHJjbXAobGluay0+cHJvZF9pZFsxXSwgIlZYLVBPQ0tFVCIpKSB7CiAJCXNuZF9wcmludGRkKCJWWC1wb2NrZXQgaXMgZGV0ZWN0ZWRcbiIpOwogCX0gZWxzZSB7CiAJCXNuZF9wcmludGRkKCJWWC1wb2NrZXQgNDQwIGlzIGRldGVjdGVkXG4iKTsKQEAgLTI2NSwxNCArMjQzLDEyIEBACiAJCWdvdG8gZmFpbGVkOwogCiAJbGluay0+ZGV2X25vZGUgPSAmdnhwLT5ub2RlOwotCWtmcmVlKHBhcnNlKTsKIAlyZXR1cm4gMDsKIAogY3NfZmFpbGVkOgogCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIGZhaWxlZDoKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7Ci0Ja2ZyZWUocGFyc2UpOwogCXJldHVybiAtRU5PREVWOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb3VuZF9jb3JlLmMgYi9zb3VuZC9zb3VuZF9jb3JlLmMKaW5kZXggNTMyMmM1MC4uOGYxY2VkNCAxMDA2NDQKLS0tIGEvc291bmQvc291bmRfY29yZS5jCisrKyBiL3NvdW5kL3NvdW5kX2NvcmUuYwpAQCAtMTcwLDggKzE3MCw4IEBACiAJZWxzZQogCQlzcHJpbnRmKHMtPm5hbWUsICJzb3VuZC8lcyVkIiwgbmFtZSwgciAvIFNPVU5EX1NURVApOwogCi0JY2xhc3NfZGV2aWNlX2NyZWF0ZShzb3VuZF9jbGFzcywgTlVMTCwgTUtERVYoU09VTkRfTUFKT1IsIHMtPnVuaXRfbWlub3IpLAotCQkJICAgIGRldiwgcy0+bmFtZSs2KTsKKwlkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBkZXYsIE1LREVWKFNPVU5EX01BSk9SLCBzLT51bml0X21pbm9yKSwKKwkJICAgICAgcy0+bmFtZSs2KTsKIAlyZXR1cm4gcjsKIAogIGZhaWw6CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlwID0gX19zb3VuZF9yZW1vdmVfdW5pdChsaXN0LCB1bml0KTsKIAlzcGluX3VubG9jaygmc291bmRfbG9hZGVyX2xvY2spOwogCWlmIChwKSB7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KHNvdW5kX2NsYXNzLCBNS0RFVihTT1VORF9NQUpPUiwgcC0+dW5pdF9taW5vcikpOworCQlkZXZpY2VfZGVzdHJveShzb3VuZF9jbGFzcywgTUtERVYoU09VTkRfTUFKT1IsIHAtPnVuaXRfbWlub3IpKTsKIAkJa2ZyZWUocCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCBjODJiMDFjLi42NzIwMmI5IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtMTQ2OSw3ICsxNDY5LDggQEAKIAlzdWJzLT5jdXJfYXVkaW9mbXQgPSBOVUxMOwogCXN1YnMtPmN1cl9yYXRlID0gMDsKIAlzdWJzLT5wZXJpb2RfYnl0ZXMgPSAwOwotCXJlbGVhc2Vfc3Vic3RyZWFtX3VyYnMoc3VicywgMCk7CisJaWYgKCFzdWJzLT5zdHJlYW0tPmNoaXAtPnNodXRkb3duKQorCQlyZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOwogCXJldHVybiBzbmRfcGNtX2ZyZWVfdm1hbGxvY19idWZmZXIoc3Vic3RyZWFtKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYm1pZGkuYyBiL3NvdW5kL3VzYi91c2JtaWRpLmMKaW5kZXggYjdjNWU1OS4uMjRmNWEyNiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1pZGkuYworKysgYi9zb3VuZC91c2IvdXNibWlkaS5jCkBAIC05ODEsNyArOTgxLDcgQEAKIAkJCWlmICh1bWlkaS0+dXNiX3Byb3RvY29sX29wcy0+ZmluaXNoX291dF9lbmRwb2ludCkKIAkJCQl1bWlkaS0+dXNiX3Byb3RvY29sX29wcy0+ZmluaXNoX291dF9lbmRwb2ludChlcC0+b3V0KTsKIAkJfQotCQlpZiAoZXAtPmluICYmIGVwLT5pbi0+dXJiKQorCQlpZiAoZXAtPmluKQogCQkJdXNiX2tpbGxfdXJiKGVwLT5pbi0+dXJiKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNibWl4ZXIuYyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCmluZGV4IDEwMjRjMTcuLmU3NGViMWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaXhlci5jCisrKyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCkBAIC0xNjIwLDggKzE2MjAsNyBAQAogCQlrZnJlZShtaXhlci0+dXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCQl1c2JfZnJlZV91cmIobWl4ZXItPnVyYik7CiAJfQotCWlmIChtaXhlci0+cmNfdXJiKQotCQl1c2JfZnJlZV91cmIobWl4ZXItPnJjX3VyYik7CisJdXNiX2ZyZWVfdXJiKG1peGVyLT5yY191cmIpOwogCWtmcmVlKG1peGVyLT5yY19zZXR1cF9wYWNrZXQpOwogCWtmcmVlKG1peGVyKTsKIH0KQEAgLTIwNTYsOCArMjA1NSw2IEBACiAJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyOwogCQogCW1peGVyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSwgbGlzdCk7Ci0JaWYgKG1peGVyLT51cmIpCi0JCXVzYl9raWxsX3VyYihtaXhlci0+dXJiKTsKLQlpZiAobWl4ZXItPnJjX3VyYikKLQkJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOworCXVzYl9raWxsX3VyYihtaXhlci0+dXJiKTsKKwl1c2Jfa2lsbF91cmIobWl4ZXItPnJjX3VyYik7CiB9CmRpZmYgLS1naXQgYS91c3IvTWFrZWZpbGUgYi91c3IvTWFrZWZpbGUKaW5kZXggZTMzOGU3Yi4uMzgyNzAyYSAxMDA2NDQKLS0tIGEvdXNyL01ha2VmaWxlCisrKyBiL3Vzci9NYWtlZmlsZQpAQCAtMjAsNyArMjAsNyBAQAogaG9zdHByb2dzLXkgOj0gZ2VuX2luaXRfY3BpbwogaW5pdHJhbWZzICAgOj0gJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9nZW5faW5pdHJhbWZzX2xpc3Quc2gKIHJhbWZzLWlucHV0IDo9ICQoaWYgJChmaWx0ZXItb3V0ICIiLCQoQ09ORklHX0lOSVRSQU1GU19TT1VSQ0UpKSwgXAotICAgICAgICAgICAgICAgICAgICAkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSwtZCkKKwkJCSQoc2hlbGwgZWNobyAkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSksLWQpCiByYW1mcy1hcmdzICA6PSBcCiAgICAgICAgICQoaWYgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfVUlEKSwgLXUgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfVUlEKSkgXAogICAgICAgICAkKGlmICQoQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRCksIC1nICQoQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRCkpCg==